From e897c21aa2a7bba2607358e408a94964ec2624b5 Mon Sep 17 00:00:00 2001 From: Manuel <30572287+manuel-rw@users.noreply.github.com> Date: Mon, 6 Feb 2023 22:59:15 +0100 Subject: [PATCH 01/40] =?UTF-8?q?=F0=9F=93=9D=20Update=20readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 176 +++++++++------------- docs/banner.png | Bin 0 -> 49700 bytes docs/installation-button.png | Bin 0 -> 7653 bytes docs/section-contribute.png | Bin 0 -> 28640 bytes docs/section-features.png | Bin 0 -> 19037 bytes docs/section-installation.png | Bin 0 -> 17426 bytes docs/section-preview.png | Bin 0 -> 24447 bytes docs/section-widgets-and-integrations.png | Bin 0 -> 33553 bytes 8 files changed, 75 insertions(+), 101 deletions(-) create mode 100644 docs/banner.png create mode 100644 docs/installation-button.png create mode 100644 docs/section-contribute.png create mode 100644 docs/section-features.png create mode 100644 docs/section-installation.png create mode 100644 docs/section-preview.png create mode 100644 docs/section-widgets-and-integrations.png diff --git a/README.md b/README.md index e2c16d572..707c03492 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -

Homarr

+

@@ -21,128 +21,102 @@

-Join the discord! — Don't forget to star the repo if you are enjoying the project! -

-

Read the Docs

-

- Demo ↗️ Install ➡️ + + Demo ✨ + + • + + Install 💻 + • + + Translations 🈺 + • + + Discord 👋 +

---- - - +Simplify the management of your server with Homarr - a sleek, modern dashboard that puts all of your apps and services at your fingertips. With Homarr, you can access and control everything in one convenient location. Homarr seamlessly integrates with the apps you've added, providing you with valuable information and giving you complete control. Installation is a breeze, and Homarr supports a wide range of deployment methods. -Homarr is a simple and lightweight homepage for your server, that helps you easily access all of your services in one place. +
+
-It integrates with the services you use to display information on the homepage (E.g. Show upcoming Sonarr/Radarr releases). +![](docs/section-features.png) +- 🖌️ Highly customizeable with extensive drag and drop grid system +- ✨ Integrates seamlessly with your favorite self-hosted applications +- 📌 Easy and fast app management - no yaml involved +- 🙊 Advanced secrets management system for enhanced security +- 📄 Detailed documentation and active community +- 🔍 Search though the web or supported integrations in an instant +- 🏴󠁧󠁢󠁮󠁩󠁲󠁿 Monitor your application with a built in status system +- 🦞 Comprehensive built-in icon picker with over 1000 icons +- 🐳 Easy deployment with Docker, Unraid, Synology +- 🚀 Comatible with any major consumer hardware (x86, Rasperry Pi, ...) +- 💵 Free and Open-Source - your data stays on your device -For a full list of integrations, [head over to our documentation](https://homarr.dev/docs/integrations/). +
+
-If you have any questions about Homarr or want to share information with us, please go to one of the following places: +![](docs/section-widgets-and-integrations.png) -- [Github Discussions](https://github.com/ajnart/homarr/discussions) -- [Discord Server](https://discord.gg/aCsmEV5RgA) +Homarr has a [built in collection of widgets and integrations](https://homarr.dev/docs/integrations/), that connect to your applications and enable you to control them directly from the dashboard. +Each widget and integration has a comprehensive documentation for your confort. +Homarr will integrate with the following applications of yours: -**For more information, [read the documentation!](https://homarr.dev/docs/about)** +- 📥 Torrent clients + - [Delguge](https://homarr.dev/docs/integrations/#deluge) + - [Transmission](https://homarr.dev/docs/integrations/#transmission) + - [qBittorrent](https://homarr.dev/docs/integrations/#qbittorrent-integration) +- 📥 Usenet clients + - [SABnzbd](https://homarr.dev/docs/integrations/#sabnzbd) + - [NZBGet](https://homarr.dev/docs/integrations/#nzbget) +- 📚 Media collection managers + - [Sonarr](https://homarr.dev/docs/integrations/#sonarr) + - [Radarr](https://homarr.dev/docs/integrations/#radarr) + - [Lidarr](https://homarr.dev/docs/integrations/#lidarr) + - [Readarr](https://homarr.dev/docs/integrations/#readarr) +- 🎞️ Media request managers + - [Overseerr](https://homarr.dev/docs/integrations/#overseerr--jellyseerr) + - [Jellyseerr](https://homarr.dev/docs/integrations/#overseerr--jellyseerr) +- 🔌 [Dash.](https://homarr.dev/docs/integrations/#dash) +- 🐳 [Docker](https://homarr.dev/docs/integrations/#docker) -
- Table of Contents -

+We're constantly adding new integrations and widgets, which will enhance your experience even further. -- [✨ Features](#-features) -- [👀 Preview](#-preview) -- [🛠️ Running a dev environment](#️-running-a-dev-environment) -- [💖 Contributing](#-contributing) -- [📜 License](#-license) +
+
-

-
+![](docs/section-preview.png) ---- +https://homarr.dev/img/videos/showcase.mp4 -## ✨ Features -- Integrates with services you use. -- Search the web directly from your homepage. -- Real-time status indicator for every service. -- Automatically finds icons while you type the name of a service. -- Widgets that can display all types of information. -- Easy deployment with Docker. -- Very light-weight and fast. -- Free and Open-Source. -- And more... +
+
-**[⤴️ Back to Top](#homarr)** +![](docs/section-installation.png) ---- +There are many different ways, how Homarr can be installed. +Since we are developing Homarr very frequently, we recommend to read our official installation guides: -## 👀 Preview -Homarr Preview + + + -**[⤴️ Back to Top](#homarr)** +
+
---- +![](docs/section-contribute.png) +Homarr is maintained by motivated developers in their free-time. +We work for fun and learning on this project. -### 🛠️ Running a dev environment +Hence, we're glad for all help and support we can get. +Altough a donation is apprechiated, there are also other ways you can support us. -_Requirements_: -- [Git](https://git-scm.com/downloads) -- [NodeJS](https://nodejs.org/en/) _(Latest or LTS)_ -- [Yarn](https://yarnpkg.com/) +[_![](https://cdn.ko-fi.com/cdn/kofi3.png?v=3)_](https://ko-fi.com/ajnart) -**Installing** +You can also support us [translating the entire project in as many languages as possible](https://homarr.dev/docs/community/translations) or contribute directly to the code or documentation. -- Clone the GitHub repo: `git clone https://github.com/ajnart/homarr.git` & `cd homarr` -- Install all dependencies: `yarn install` -- Build the source: `yarn build` -- Start the NextJS web server: ``yarn start`` -- *Note: If you want to update the code in real time, launch with ``yarn dev``* - -**[⤴️ Back to Top](#homarr)** - ---- - -## 💖 Contributing **Please read our [Contribution Guidelines](/CONTRIBUTING.md)** -All contributions are highly appreciated. - -**[⤴️ Back to Top](#homarr)** - ---- - - -## 📜 License -Homarr is Licensed under [MIT](https://en.wikipedia.org/wiki/MIT_License) - -```txt -Copyright © 2022 Thomas "ajnart" Camlong - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -**[⤴️ Back to Top](#homarr)** - ---- - -

- Thank you for visiting! For more information read the documentation! -
-
-

+All contributions, regardless of their size or scope, are welcome and highly apprechiated! Thank you ❤️ diff --git a/docs/banner.png b/docs/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..823bb50b1c3f0eb1c0fb2d8e84fb32e92846a8f1 GIT binary patch literal 49700 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 Sej%+Nh{cZmI;q=i&;1XAYDMb+ literal 0 HcmV?d00001 diff --git a/docs/installation-button.png b/docs/installation-button.png new file mode 100644 index 0000000000000000000000000000000000000000..991cb9b27fe447b2d782a407941ca79bcbbe6bb4 GIT binary patch literal 7653 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 BSNZ?| literal 0 HcmV?d00001 diff --git a/docs/section-features.png b/docs/section-features.png new file mode 100644 index 0000000000000000000000000000000000000000..b1854bf3a11e5981e25bda7d881ebabfb2034967 GIT binary patch literal 19037 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 literal 0 HcmV?d00001 diff --git a/docs/section-installation.png b/docs/section-installation.png new file mode 100644 index 0000000000000000000000000000000000000000..92fa4474f832986b1877dd205a93207de40074b5 GIT binary patch literal 17426 zcmeHvcRbbo|M#JiLXu>YBw3MJWR#VaO*V^4{@wWHre~Q zUmv=z@9%N{asP4ub>EN2_tbSg&iZ`b>ouOw=j(NPrgBG?FEBJ(Ak_$K4-Lhmm8 z;z~>j$A{ae;)*5qxjNqeUhf@jnm+O}JwM9M&tK9wRib~EVR6BBaejoa4d;VO?{KW% zo~CAlb0N5=AS;Esi2V63eN7AAIbnZW=OGGpg&Fw|&n->d1>QXFB&Q^Od=j64f}5x8 z+%GS9i`q&0u9Ku48f|9lgpzbLGjTGzf8N#7$>O}MoRW(6qf?Y9)OnPg)J+Yyfw>`9 zFAYuH{?bN#xG>x2C;ZP>X{=7O;a|{Xdw#OG^2HB4ve(iYQaT1i`Sf@DDe6AlRXMjx z^!T2%j_Su{3hCerHPZ5ga_7S7)ctRO8NGY7K2xwJ_^8q!e${j`+Nf~> zr!SUa`_^c}sLri__8Db=vCL1Vbo$pa+fdL6?9xodSdZZ|ryKu%PWJ*ug}Kyd-^vqQ zcxU}+`v3SOn4kFHuc7E3qp1EreDz5Z@&xKh3yNojvv|S9;4wd~%|Vd~{?(>5?K2ued;k$AdgG zaOpRr5%nmE6-2W~&rU9$<#V3V@Lq0ajTN$cC${@XQkdl6g7f%?Bb08D;)ltGiQ_(O zug$VH@c671sj8~Z4A)c%JI|zUtxV1qH8G?dIXvMD#0P_@yx7}Y^zGAm5brGC{_NSa z&dsH9mS?9AkK+8N)2Ji$Y?Zj}Spmzgi>=PT+Y<_O-kWzOq5P~Kb}I?RJ8pVDZk^~7 z=+jSGo9%l~&wnr>iK7mk$KaX7ywlPbN<9xB4UN~fAAS-DpE;cGW4J9mEA5!-Oo@z* zwW_#t=T4}X7$ZFbzEG&shxY5In`zybU)J+1G_-eXGC?^I|KL+8LVRO*l6Wp#JtGud z%FD+$t#a^zAK^_DVo*J|3=8_obgy2$>U8of+BlNQD5qf?{>p# z@Iw&{9r^n8#W2Yo;`zTV!tX{jy2+pwZb(x4(U8%5Jw8F&Nthpwc!SS|1reb+lt z&yol23|o6Xm*`QbAVTh%)$l8IyN(q@whGSc3qv`ugWdm*gZdzNsmB67;g+oA^*FG;1^fyYtM1%POW3@`lKlhq&8`ph#OQI z0!Rd0=I#zTwsN(6{hFu_23qPi9wOwlH4$wM*YmcG)GEoCnWYW;?4U{Lg*7}k7SjH8 z7Y;xAeAA{-#2GMUXgy(O{4Za=WclvnFEqFV<|#e0|021pbkEuAqAPxuN?6h47(2BodesSp+V--KZRU&e4-^ zAR?S{>21)J=t|ece2#+Z@b8CrhyP1NlA%O;GF4N0YCK)315|5Bt`av-Y{&Qp5c`7N zVou53R6j|;(#Ktr6}!XE&Mv>Vv(cA$)BjEVzqiOdQ|9NA2;s%LBk|_*7cX*ZWj+vR z4RZJWyq7hV`HOVQ?IcH57kA&ITkhJq5%`b(94nZJT*fUPSJQd=?X^_%JnrZ5^j}L~ z6`x1Pgr9dGYHAp>dKn&`{Iel&c5h=uTTbpo1ogk8WjsOsctk)#liIB;Ub9VOOy!6k z$jW4~{DfM;dY8hB+VVG@#$%DmXi%n z3byQS2nMR=Xyx(W|9ZOS&nF^9^MA*9dj{V)aB0hHW}q}DIXO8y1MiAt{?KuXmFO>y z-ZisT-#Ky;pJ=&+7Ug>;Xe2Zt13<@MjNhgTTwT_)K^|b zF*hu8a@P?>*JANOF5(h0quxBdrc@azDq*KgkF}XJ*mw?6Q3Ht6&!0b6gQ%+5{d#0k z+ugk)l%)h;PoF*=sB$eRvmMHI9r4yS^4Ve`XE}PuCS;`8Od%~JgF`?-(|M*xRZ%gx z+OPor4%(LEKl0o4sRJv~(AUo$8@uPdzqc_^hK>{4nd7TjAFy`1G){Uv$EdEBfRrIu zD^Hh=k53)k`*~QHw!Z#g*vhZZp6=jkq4Xl@5SDWi6D34k7kXF|ypkz6w7xEGJVd+J zmqMIGq5K9yQ9n!^9UUS1+2pz3E6TT&pSYRDx!D>f;IH=SvjvNqR-B6?|Yj*IREy|o6NUw>F|v;au`HCEWW+DI`g9_1)`SkT9IwJUT0^g zyrQDU-u4=%*4s1Q7q?Zp^*e6u3#F08&reT1CgWW%j5&Y#{CO%nCtt0=u%;(fj-2Jv zCEV|acaDC9i;)#U2)mf2o^dBU^%*(qO#P!H1J&;DwF(ULe0Rqg70(mFxowzEMaRc; z74+?3>pI+SfWJO}_H4^RQLoGXTUGT{nN5GP@7}DD2c&sTEiD;YK3wL{ zO6S@1SIn~PtgNySC8Jv>gr_$g6WTN2ecas#;L+PF3H!N=wL5nheRqrA`QqHc4nnLw zNh-na-3zWDz8^f>ZB27dit-XtUGW!CZ12 z#v8LB%&z;YHu7kc+Ztf<^t2%>b*%Ln6_i@{Sq)dax3spt*YNDk)uFk1PwMLqD;QFo zkeygolkJbfo0JAlukxDOzkcob{EQp}aSfBB-M-!z4QCFfm5l^!2#c#f0~xKpzr8+C zVo7dynJn>An6Hw!EF~lr_>!&_mWaDLk($r^3A#3zR_G4o3H69eO80-bDZHARvM9Ce zmO&4cbf!fcX19y&D7K65R~ve-Y39$9d7vR7!9zR@^+V2odg<#&Te)eUio9gY<*#+Hv);;XT<vRwYvtXRFz3H-Ji@#k4evJFQ&B^OC%dG zWYxUV9lT5ak-t=cMTz`)NC#!iTG--*7rW0?N*Jj^w6EpVgqP>Q#8TmH#-ye09o*W& zke;&mUP-Kg^|>fh+JGdJhJb0@&LZiwgL(VAJj?F%EI^5v;Sq4OSRRwd@4VM_v^Hip zYjmPHb&^kzU%Jf1lr(^ih>gw0+SQ5vdUz&S{LTdYKJ7|On4~O)mwdr zo_X`m5#iw_ZcFz_X!yUDc_w4i0PpKoyA=V3G_al=?thSw2f#7YduN>ta|QAixT(s@ zWcwt^<0aWAZo5lO0zimZSXiVL;%E>zC;Kw`vNH9}U1dGJoPDU_bMY!RSbCgiVTt$=z; zBd;O`pG}jr^mG{;T8M9X8Sgxv3!P|W#Mt0=w`gv-6%sQq`@8~k?tIOr&hNeLls|9s z;cv87mqig%hdu6KpH zC`^`ifnnu*88&;uut3vt*1&b>3+=J-Fssoex7E4#?b)u2!(>BuVArpjHcs{G*-Z>E zjQutCYtBdOUz*%rWC$N-SFs3}Z%Dfy?>Y5z!CUj^`d5{;!1@41O}85!g-zEzlGQiH z*E8ML&u!B8p%hN6g>l-{ca z;BtFo$kix>aQ_a~b;r~zA4c(qIjMY~^w0Ib$3SwRSr#ctLS`30Ydbo?koIDuZa!+QUN+2j{jvK_`>#>M5Zsi$A_sU3RQE}9J~E<{B3 zl2Yu&u%-rDg7Gk(m>cfJ->*-;r4iE3uUXfP_gtvZ$D(Who@q8SDu155{-sN_93#ck zO^Ng@KOy<@c!AsP&Qof6)_zKI@FaQq0f|Njty#ObukV-GThkKPu@Xn>eh2e?FDwzZ z?@E;V6`fGpBXt1hJf6sN4?6+3hD?{F)53IdR_^l7AKRl8ltx z{K(_`b&^+!%X-LAC|*=*qNs?8)Yt5`NK0zGnVO8^6zTCE4J6+3nFm7{^lWLT7xVf6 zsnt|L1W=)%-Ec0DKV5fs_icz$nkp)ZAU|9N2-y}Zp#I*xttVZH7Vy*$$8W!W-QQaZ z^L3irJ5%ss>?HO`d~))IiOI=X&;{7JxwUOvHUBO@czK76>Q7lw!@GqpPl5hII} zQf9kkx4P4n)PaG9pnZobot;O#H!K0%5vP;okeR@9As0+Uv!nr zEgX?CF_sE>&!3;nGpN$yuKx2Fl5)I}*C5a^r)HMuOmNY%qhVQDS(V!}IcuNEmH(vI zZ!$~SR?Q0vSah7fSlZgsqH*_bCNdZOD_I z&qh&XPbly?Niwj+XV0T%<-3S(sZ}K8eBAsba8}{P>Xn{SYwfkU{_ftq7m$fo)$4-X zZ&+c=@+M3R^efaNSe3=5n-+f*Ndju>`cY(xgymMow;Ac_R;yE;x+NB!zI!$RuDJO_U4XD8W0#-}tF)c@9UDU#8ArEmqGzG#Nd;MYhFmU@3uelf8wV4o0Rr`#5 zYZ^mnGcq$Tw>B+yXOQ9RS7()EnZm+=bEs&t9qO&@WN5gnp``it2h@T>?ITo^CfSOIz*iy?gnz z-j*-3pzA%q&mTgxoI*jA_Z$D!3qZfnh7c4erVJ zeL7^0sJpVL;2E>n?Y?Ox=Wf51Qf?;IE3`*+qb=D-q7&Kn0jp&#t&mt+(}M>O^n`~OhN_fj-qqDjOqNlJYP#4~P@fnmwSG|1 zm~T+EI`)EFH~XsH@D06N!B-3_{{(#8Y%nLkr1-LZ^1XgWZmwc?hVp(}px7hb8}1dS(%x~Uo#}Ud}%!G21;Xb8n=p<59@M72z}L-Jh(#Dky>x(?dc4?{1xEd zQy^8p&oclyq8w5kSD$5HetdX%_=hs>pZ{#wO2@Gvs(>U`VHfTAF14Y`-z3t7e{G} z4it5IkEB5&o2a z)93r-j#gah?&08i$e*@&I`T^+84e#~ypP+9vVJ=g_}OI;%g4qhho~I_KD%xNWOZNj zcclH70-bPMlX|s*RU?aieC;>Liv?@<*0E96sUSpgafMim99BnACdfwLk7W6`kanviA^F6auKcm3jGWh9YjV}r2Xy=x(TgawJJcAO55rs znX;Utey58~&E~$xi#U(gKYCf}0J0A|8(Wc=lE~!Shabv3>gp=~=>@3Tj37sj+0TBw zz(EQY_bBzgf%qSM?~cNvLGwR#3}b@++t+rSLKv^z@|=Auvq{v$8z+b^Hlz4+0-{MT zR9DtOiLj?mp3ON&ra;5V*EAxK+CM+Y2D9k@F{E+`zZ z7W8o(sD*7O`5F^W<=mX<&9kluh&RG*u>hgb1R%$W`TFhK{rUs$FY$v6#k?GoE@TuLESe$-b0^&!Mwarka zz_0niBGbSLn&#$a;%f(6M<{}C+(Rt>q(1r-ZC+0bOE??->ehXa>L+z5en@u+kaw&a zGP(Y)eNw$OiVFjzj)YN6AA)rs1fC3lIvR-B!gm{&BXZ6@yLO+9P~jyI9pfDusSy>clules z%y1rCuD!E9zqT{7ZwQJOaIBiN{`U{~uGOs)1vRDU*;YtP1`u~zX2i<`^58P1a|!ky zNk~BaVX}K*Vv;mLBbE?`cPKz1z7QMOL0RAaMi3nfM};WSTGk?<*#Mc&18bV?QsBna z;nuiCahv0ixhVZt{SodoU|pc8t4kCAaWf^VxuvDJy3`e9+Ped~Dk{bmG9O&h4_1WQ zWV6jBK-mWunKsP~xsHUqS%2#?U@5%6yHaY?&pYI^GhgcC1p#_>wOiR5lH3ztI2<(v zGcz-teBdBtQDp~qO@eQHa6c7#qf4jz`&lWnVKRzUplk^^j7fnx7?j?lL$oxoq_W+-G%DZS z4A8-6ee0jFX{>E|MOi=LfGtBFn{2RbKT{ww(`8uO?ms^pN*yQU^&TG=f&8U#r9ujb z%)?!(8@qoRpfE+ae1As`vcL7Qa=` zW$euSV1+t&?Pf9#w^7IUirTlw7?d1fedTAz8XFq}((+tv3=9nozb77!R>%zJ+ateN zw_iK#yYDTh1}hTq+O(he^$Vz!3~Uq;c4qY3H^m{~SFys**(uwuz?kKgluGrR7B{Rr zlch_4ziS4DY(#sOl2Y%a-;ixNAYr7s`=lhkzrR1q`s}%LyrTyvc76`At5O*M-SYCX z&+Z~HeG8~=wlp`ZLU}IoK*^^q9^aVmmSqTQQq_C94sxnvh{X9s;0Dvv842d$yg2)p zz-L>HPFwWl8+<)tEK=rIHvX>ZU;tFcbJ#t<{X(k+f=od?9 z?;U4hWwjpr{LJImD_OcugygFG6OeHB>C}2%|H(M694M@E^X4PaJ#DgNpt(R2!jKk< zQP?TyKT&}gRd4sTy}b`46BapObCthit(|~JXG4LhjD8$Qq?4jA3Ej00$B<8-ZVkC$ z(TZY?jHgOWn@&MNS2x>4KthZ%JqR1YpNmstyndZ1Db0-M;DLt2p~ip==|4XpbC%>QA9uiFhc1??|c*4i07)ha%NTA5=x}Dd>Tc zn+BU;35F4+{Q_u~2Ca~7?$S7f@p~1Gke*_ug2n0B#l?-PTo=o#S3bUEl0<-hKx&9V zrBjjqc-3O9Y2l$4mLkEY=UR>Dh8AS|?A=|^E3o*+a)5)ok288D;vFHln;j7q^*d+@ zx*5t=cY)1=%lbe2zS;1xc6)}S70*87PCP;xv31w@Og%sQqF=Q!q=WmM-=hI!BY4R73N=)yEzX#>#F*9i%B6?c&A?XhZs9dL#n z<`5CVI>v*r(Z9TXXzbZYbC1gS-Jyl<$(89?>wFjiVE23dl)}P7`Su(jF0*i0l*%5-oR5FXUepDxre1%xgyCs&lGi^nL3|6e)Ir; zYfd8wdioQSzd@Em_}fmy?3xu2a1W41ogoXdv9eB%;Fkc9&4E%Ajkr(s_ZutUjB-u2 ze_(QT`1Tg}aRnahbM9(k8(Ur=MOH#BI1T*a2hG4h5qn{o@hS}vb z%@a|N@wS=ICJ(7;eOsy}Fit==1)z_nqhoQJFcdpF6u4_rqYXXely5A3mb1gqkdvoC zS;PREH8l10-%j+c0ASGZz=0NnwhU|EliqnP%b}qn35>dLXR)pTa@#F{KVW;Ru(85UQ;869vcM}eb+3Bx68b4K zj5BV5e$@{hF~c6ST-b#g4mpUlNXM5<7(*VjZ0HmuV#tWm7opRH4ayu#OG`}dqV1v^ zbasDxKL*H9k|E=1xfYfiszqmh*rxYzYFVA;h`Ctrmj@ss3JO3u`IRk>c>tRXKrE&K z9bFJTklGd}G@DaU`%h2OG5?!DI&*yXwm~x|I-ds434*YD7ZS^R4Mdk~`To7E zCV`~k+63AOaU`WTJRcpe?T>SFFoX%aF607%vL5{45S}V={&cU3ps;XkMCg+1x9c>P zwl!;7&_5stP`|A2j=Vf*5^8r1o0=GXZMJIY4h*yY6tn{AcidpWt;3isdg#GlWBev>h22N88)C1T;Z+7=LZHpiT?UiTR#BELv=P ziW&5k%lDfIH=YlIWC(>2pcVFGS8)P3x)6Ri6pziHfdbaOxinP+wV9c>`OLo=^BhKU zsZoadmwhY-Z%kTd)41oNsJKX!h0F?zX$WHi89ct0?Z|2cLYSZVF0xpn{{VD9Xz3wa zsbqj+Ph?b-uvI>+^BMWybw_dOr6X}hrfg_&WA@{5#vXWw>h{5cPm>Y)F?GML#Jswq zNZzV}Uf)qiu|Svk>Y#sy$6bfR{B*5?!T$IbW4KpjvkCf21t#UL zrTEymiw1r5uLIu`6IMV)$ZBhOLSPpCiGK}XBX(dRl0#dj$NDX}E9mVaP2b+jgwQw? zU&VzA%QAPC_8I0Nyr{9n6)vj;#fSQkZ=F^RN;&XQ=CQ^JF#FIqrf`O% zQl`7~uAwqC(5up!B0CFxKp~rDwLl7EdCgAx9|qhDr|=3J?)KvgSjay}xYUL=n{i4Y ze3bL)^}t0rUo?6q`2HuO^Mimp(w`Dhf&)w0&~mV|uY$aSXqM`?XF!3)MscOh7dwp0 z3^_E>LtAEkuh>2m!8rSvQ0BYwZlN+4U2ic$hn#`V zEhsW)CMSPVBT?`2JmymU*BQOpYQ3*OL_4$M8oh~BuqfdpoMUj4eoZcg- z8jJ1iQAaDqN3ef!^W99cT&c4sy1C=6+T}joB)L*o!i%{${4TOCEiFyhWA!pQZRTSZ zg(!>9L1Z3~-I>Q)&weykftIv)kSWrkclG+Ornsx70fwIQr9m_i<-;Bdz}rY>MNLQ< z#d4>+GpwQHsaxTg292*=n1@wE5QHwWQjITug$yPNoCir7fU>ho>C-J|Qo_W#Sfcfl zk;*&qVM-6OV5qFufo?MjVuA@roz`{#^j{AZDDU4sqNe0+aKYO}YWsI)l7D14M$aaS zAZ<}TZNBMj?fD-sV>eUNi_~7LuJNW{EN8-mgzIi8I?IR0HYpS>jPKo(-2_z{>O7yH z5O5+G84?es&es=onmgcOktS3oXh5h?mMK^*uiI0C66(p>B0K0~MJNU$MpPTxNd-3} z?TBuFjDZz<(?Ag;IVDBXB^UfdA6h6gAlP1%W50a41EM1aI)@aT+l6OyU*?ax@HUDs zw|Cw~QXRBW$N+omg>nuAk#oJ{cF@oWh3-D6e|$AQI72_0N6-WXU0)iis!4#9T1yq_ zN%_YI)ohoSeA6vk>~!00{L`HhZ^f23bdXoE@KKFDTZpnn-?ws#(rDtS;53&AxERJ1 z|26z^y7$J80I?)ki?HLbpc@Qf6BG&(=nV)uGi^d6JizA0 zB-CF=*$h`#Ks(>rb%_zVLwt&XG8RN91FP>rhzDbTsW&BG{ z&9lYanS1R%Me5L9)zYdE)9n|6^rud=MuVEDgmkhX$qQIB$JMKyQQJr_9Eik75&Uf|{*6#|R=6`EE8azK)1U0kWM9n*cmMQw^!X zz&1|<{n+duU3`MHVDGN9m#?z0HSjq7j(KnfrT2ML7I&Sd8G6Yet@J`QqzAgt%*@So zhw(C?aTvHqFVYkz{o>qoD|g+m`-c%nAiNX0N+WFT15#5j8n|O3TP)*JAi3z`PIJ=f z2dr8q@y|V!Y+}D>yFX*Qse4}qX}F{%Oacan z937;1Ef0^%J0kP^P-$$LT|>G+8Ny@_fKMh&2Ra?PArNaqK@zG*mhe)y$|Vna(Hm%% zJk-_H_<^_~j2wze0DNA7t_D4WgSHz>@eI2@(D@8`I1>`?aZ-jJ5I9yRqK&Nji_IV~ z5Xm8(Wa)tJWRWs4Oae+46pW1AVNJ~C*u8P8*Kj2?33{&2A>CuEppPT0TJbkc=u+73 zL;i5c>Xu($GFf$}hjev!M?z02?2NRmZ0qbA?n75K%pK$x7)TwIGwAhB1q6wpwbp3v zKBy92qdrXkA90Ha<26o2 z*&{R3(j7ZlxEg3O1?`qCJC~HPWww~d$CSzcM;B;n#T5SJ($3xhw5Nr9aLr|7>*YcK zhCS9uyoDp=E6+q06JJeo@-0~0tC7VA7Y-B;#O)6nNF7v2BxOU-T7je`kX)0_wx$&6 z!8+@9!A8%-(jvP@;JVYsOldiz;`~sRHhizej7ss4+97v%%M0zTyh`d-8*{ynjvT*G zmlqyh)AhMq>5ELiHovG=Y)6MiFm_n~y2dHGYl)(s8$9j@JAquQVg@};S~@yeTzchG z9Z8a8BfW`iYx1uy3GtvSNDEuJl&tS(OO7oKyjp<84^*P9L*N&G$dw0=S1(XMn*FV* z0KxYCUKHd2CJliqXf*HXP=J%c5lh9WQsDrFSdYrA5i{xaO_0K%YaOww71uaT5Po{w z|G5*Y@UtZ4wYXLu4IR}am`rABsuTz|5CtNfyyB*A-;N+}XhvkBUg_JR&^36gSM6w~dKx@4>^7{qE$SEn2 zx^{(rlk3rP>o|+(R?Rfy{?}(`!>{DA#>ZP(wJ}W(;Y%7ZMxN4;HxqyI(ZQB&h+|?i zwKgMW=GBGxbI!Z(>NH7wm2FyW0?7+RPZJ`J3Q7S6?Ai&cMu^>8#O7`vMh=*YUml^K zbqx8V@uDtMVJ#2Et*xD3OCA&xA>mEqudwrFEGR)@N#GjL|OUl%8* zDHNx@;8mhHp2{4l_JwrICRk5?`LaflcOp`1pWh1 zN;pYGO8y@sNo<4)?Om^Z?^=-hC{@wmR7fz|7@6dg_-6tr`=j{A$4?x^M_56B8QAl@ zNSUl6p-pT$T$B-Cb>X2I@4sJGp%^^!<0fpHhM^%t(LB-S9{5lWw9tU63_rSP-ynr( zjr=f#Uc~h>72sB1O|5NBHMLKl4}mY-s9ug4<#M`CeECR&@%co0kus1{6ahG^KwHcY ztx*tvq4NY$TH%Z@xRkD*04Awu_0J6c>14^7?2};U0(XMYX99PZ#M|Z`DV5AHXkD?KxUuDxT5&fDdQlhG zF?Ix(E}&Sur=5~HTQfD-)jdO{RX?x0aD;}2jzIyvsHEg9#%hh5=wqZjOG|O^-rnAi zfr00ScD^%M1N(K9kOegA%Eu6pFzPkSm1Tj+QOf&WeZI3=P(<;?FHVSTd=8ZDjC{Y=DFD+8yW z6Dc1on_^KqEM1Nbf$R*$P8t0w7cO&i^9vU)g?`KsNqCVQl#-HSQI74jEl(K{zrNG{ zB5`Oq1klj`yz8n*&0Qm-FboE(zDG4BPD8xiX@g@BS#-VUU~-ivM23@-Q>w-=OgC@c zw;+wPl`5?1Di!hAcvDzWc{yc`zhQ7d!{wIcPftdIl$St05$asr_@B#PU1_&onuy*H zg3^%Thlh+|GM&>dV-10}J?0NgYsDB>RuV#?$My5KZ{PYCMw2h!yTQ<8e=QjLey?4> z{tTD6FW$Lv;mb%+(9qCEQQ7*ZTZcwtd=KCL7Nn9e=zea5-vN=A4t%NllJU{y2931c zwcz2Ki*qY2zM(o(XRWQRJExsE|K^rUS^|&Xg5G~_c6OG$ zPSSPeoJE?WiPAVF|e3(ynF;l5yl`I3WxUhCp@F?3G1Wl zhldSqY;9#~#27;wDX)r%SYK8jotnCASi8%{AnrrgX5KAvc>hhCND$;A8||<6Se0%< zS#=B~p`uC;*5AK>&k^F{BF(5-S@$di{vC);_~Hk;=bi{P=$Xw(n`0 literal 0 HcmV?d00001 diff --git a/docs/section-preview.png b/docs/section-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..6e43e043d5b16558fee9b34a39d530080a3d85a9 GIT binary patch literal 24447 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 literal 0 HcmV?d00001 From b3b24e48002e3e1dc32e6a42ab3ae2a12d5d618c Mon Sep 17 00:00:00 2001 From: Manuel <30572287+manuel-rw@users.noreply.github.com> Date: Mon, 6 Feb 2023 23:10:05 +0100 Subject: [PATCH 02/40] Update README.md --- README.md | 2 +- docs/banner.xcf | Bin 0 -> 191318 bytes docs/section-template.xcf | Bin 0 -> 137153 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 docs/banner.xcf create mode 100644 docs/section-template.xcf diff --git a/README.md b/README.md index 707c03492..e1f87c958 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,7 @@ We're constantly adding new integrations and widgets, which will enhance your ex ![](docs/section-preview.png) -https://homarr.dev/img/videos/showcase.mp4 +https://user-images.githubusercontent.com/30572287/217098893-5880e7de-13d0-42c5-b505-f7921593396f.mp4

diff --git a/docs/banner.xcf b/docs/banner.xcf new file mode 100644 index 0000000000000000000000000000000000000000..f58de314c9d98dd2599fa030310d0314769ecb89 GIT binary patch literal 191318 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 z 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 HPAUEcvN%Tb literal 0 HcmV?d00001 diff --git a/docs/section-template.xcf b/docs/section-template.xcf new file mode 100644 index 0000000000000000000000000000000000000000..7c2094bd44e9b5e6f80d77a9f3abce66296b34a8 GIT binary patch literal 137153 zcmeFa37k~bweWkYs^@v0ry3f%X=p}~uBHbDQB+VQM4S>4K_Q}o7-J?nlih$OhL{28 zm_(of!NlMUNLP1NcNHKI;=n~>NEC;3GdEpT=j``ir>X(({qA?)ci->b_ucQM;hZ(> zefF^S+Iz3P_CBZXShVEcif_zcSn>5yqep9+7T=<2mf;}s_Y1B}E{la*Hdn$FSaR`~ z!xh8jxO+LYCV^Q~mMxgKe8KG%4=h@KXT{~yXIv{G z8D`W)OXl6NV8k8E7Tqp9iM^@nzU2?zwV>j@d+u6vdv#LP!aL^QbJsn~DymE{V%Z(H z&8rw?{u^CQ@NNHt;L#Q4KMDTEefQ3rzv%8eDn^fjdhiQWlo)aU-HVo2EV_ICoeS=h zC+=Ce@V*7hE6n&8;SuzUk)_NR{aGH55EJ%B;DWnMXsH)*QM(5|kHGfXCbTAf-GpDf zJqsz9$Rgv~dH0FnuAcYcf@KxXaj-P2-1v**lBQ5xcEOukxYJx*!k6b0qc}iwT!fcg zgeP5uS6qZAUxcSzgr{DFr-Ms=H*;OZ70)GkOZt^j9H6-bSNs7*7K8YpI!XMC{;cg6 z5zm6lCF$~K{c{9PcsU9?BG9})%Uv%1Y_$;>C*|cY@A4?TJ_5_uMBuRJB5=f85jf^2 z5jg(i2-LI{@k&#wQB%jcdIw>HW~e@Hy>dI=H&N47UoZEwz1*#W_4W4FYvEH7aJ;v- zuO7ZS;nqUJJLA^W3FrZ6$m4pQrp{P~BUhbRC z`v$pN)~j{Yp&bISasB#s0K^swEzE5K*RS8O0|@zom$JVod_M>g+IRUWIx*J$p+~Tn z+t+Q};;#5u>) zzVUK*$vwe&iDrxfCFjZnI-N1rB|y0nqjyuDHZsiQ8o~8tuGM6jx|3V&F>dp9GPgaa zxR<;m_Zj_ie^e z*HtBb`ncYYy7u*HTA#pvJx00EPGg`io(Bfvl@mQZO9$yYj)M1|O)wcoxG$FAuuzHW z+-XUnxA%0SNvd_TnjTAok~#Zw5?a2PB8NnZlq1rS-7-K zSQ@HaLkW5Zhko<07_kl2Vk( z0C^@+1!eT>3ni*B!aHShY3~c%bCI~n^}zuL8@l3By%Kkj>- z32XzVh0I(VU-#MkD&W$LJZkI5!k~J!`yTB6`nBvzY^!S1R_kMYjf;+ zV{=!8qXG$jW7|60dSl(T1X5&-^Pdg8A;nm~{tW`1nw3Wf`~kl|u#3|6Z`dWMKM=4I zb~@nqz4gZH+dVx2&qmw&(;Gd39?$mI-+0UCC#i5?*VYZz^`VX1y1F*m)`vEAb#2>d zT_4`Cbr+%ft{2wDuGhD0CrID4eGB-y7k0@|_6OT~%R1|NV^cfjYTsmq0{NpksBPx? zEeI+Zu`aFFCa)guzdr$Z`h8UL%tV~GGQCmuY0K{hQ}zFvBekT5B2eblw3K)KsjLi5Ob_8NbYZs-~$&x1mJ2tG}z#s?M=!x?i-WRCH3*If%gF)^k zDM6h7T+i>`nHo*RAVSdl8*F$!|!v zFgA83M@qJVq0n!5M1K(3;NwLaY0?le(ssn$PUT-Lgh_j%ny(4Zw}obl@Lnh0x|dV^ z;Wsy|+sr8GSFZ@?rBq7u+V6KAV3_n9f22d{>t5_h^Xol+e}UwHgo(Gsm+4pg7%=@t z_f}Hh)RjR#yG@4g1sEGWnJ{G7l+wd!-<8P#VbYx&r5EiC$RmD})6pI$rOxuJy}4SV zSq&I(1muwjW5a`2xn~<+W$Q70!Xu+YSDM@jbR4r(UOG+sn z%Gl_#IgRqPWX(t`w>g!|rCD6DPL;!mn-lA_xSUwQ@lKTzuW>n5C4-T$zl{nP7?(beGdEViYpsl zwkaOVP%LLhjMJ#FlB=}>%n>^ji6Dt&YMu;CAx^f75UC`q55cmDQxr$?7R+T!IkAd{ zfK5;W=Vymt>J*3XxJoipj*uM(_w0R;Gz%!z+wn@FJmw zOlg*Kc{CSZt~5ot#VI*`fydg1Wl;jr3W!!9Eto*8472G9VHKKKCcFX@i$s$&3V5A(2?wB$mz6NhM)YXOWTN%7PWavWZnFu`*y~NUY)tk&m!a zVWq-C=H=*CGBQ9s$-sniiJTObSCV7`r%>WLVt6XXL0Ab7RS;%J0}QJj%n?(jB@ebm z8R?{zp{o*=7A%G?l5kaIww@WkRFlN>VPq4Jf=3uxFw$I-l(oc+kwyYZsZNzuA_<5> z#HKn!j?|cf;fxk$=RiPdPTk>jF;+-XNWxN)=~T6h3{uEAgbF#tB+F57Rh;EiGE5*} z^svB1sLLdaA#+?=&OA-TR0x$tpy3+DfFQ+%kwLJkjLeIG%PVqX=p`|^Wn~!_46e)ve1AQ<@44Ajvp;S2bNl}Kq3`RNLo~f;1B+1o z?3P-arq^yc3m)E3gyw!XK?Qe@(zH>#vHHJ@LgwzqzJDn_{iQ@@?9O#+#-)8Q&dr&F zsc-aM3S&+%Nm+g;7UCS#Yf-YYypJ(@C-_ouY-hDp@WKdO23!XHUEp_ttAMLeLdz3{ z%6P(pqS;;mdjTahl6QjbOa?1F2zIa#Y{aKvpN;^#vLCGfO4M*su~LhGtAVRg!kA6P z%GeZxVr6!Nb!UP({tEV22Uz1tu#=5oUopUpThO*2lq&Uo;JQ*}th1q8Js>@qAjd#H z9u5)$34OUtD<==R8{1P#1$;ch1o~G?wF+fCg<1g)7MbAel_i>;_;NRTvWf+qoK&ni zlzK?+hA*o~z^SQ48XB`&?#7<{LIG!I7HTe~ekOP0U}=GX@caU;QW@Kl^9A%Z)x(NfH7 zw3e#m8l|O~*GMg04PLcchLUT9mT6wYwJar9jh1a*!?YY#t>v0mm6nIupQnau`Q|l5 zE5P4SXkIR@2q!}k%lcyF&`Qk9u9d0^t&Ambxp@`iE>H-xPzy5iRLl;Sv$`2@IUM$i zaeK?@V#XXtj9o8#V4#duieBpws$!(KjHQV&)Dch6U1v*GmZpz&I1&h|dA(F+q7BYu zf^O+6QR$jq=X9jn4cEF7m5Mhh)2^3KM_E$PHAfbYtPB^aWadGKNsaXhWsGvyd_Vf^yW*lPH@Lh!g=6EGw~_pYk4Y-L5zU%>F?(XJ~SVE zVQ&tFvN-bXM(eq3P>PXf4_8$GhV@$pnMtH^Z$$6{@X32KsgiOEe%%Kdf{!f(zwKB$ zZEC^Bi`>U(#(oT|F`C+w>>sTeM=_oNe!wUu;XsOjw*e!CN(HEWY24HOwVJUnkOr`D zAE6ls0_g($fZ-C9A;1r)!Qq$1-GY%b3_ROkjYM;}vsTOYK;HPZrFec3;m2c2LlBH`~XIYw~PD^9x0Z4px96E_XFta`vN8Ya?NVq)$TICD2$;6 z%Ke2}Xw9nD)?Zd&;hkI6+Sc0o$m@YJEHk~mwawP5KlE&OnIDx|-PRV{s;_=EQ0hlz zR=33y^pvmEpQVM@@>oKvzG@q(qcd$QlL`A(SBXDe3;%dkTU$!2-nNxuq~f(&-P)Gc z8h&Wau0WALMYFW3wyaiTT~Co8U0KtX)2cuGTA&a@{Unz}9`7n7ma&omqivJmYE>?e z|M>Mlz67W?iM6&XpS0Dg{8nQ_Padf8Oj{mh-4@98r^(au$eJC96x~^w&l68{UZtKciQWcyK_wgSqrjkd|qEU?25J^BWXM%5%z_@STgq(RZ1wS^FmduZ#i zno+~lJl33RQJfLUPVSY-&e58xOOd-P#fjE5n?SizouWIHCKzf`%9Z9seTJGqxze4C z8eGbi;T(=NDtE;Uh~iXb$(_j##i`DAqB6=QKn=-pR-w|l+%2vgC#qAMC-=%cC#o~l zmFKLKO!EZ{apgPFni?z}F@|v*lVp*T`K8tbs&Ec)h+2mE}&`rf$OUd9lsE1%Ei)w>_5Ds!Sf`@FswZ`k+dEPJUF z{pt3_6ZY7!QYZQo==MQ|eLHWompGAfz?bX|cRw@AQS3y6j*@*_Q9w)!gweIEFp7qK+peo+(uA*hu+^Wv5E45?$cNv&(Lr$=gBAcYu@{e&u& z9ZY0EG8Wo!gZap)IFKpeK^$YlG^6spEG8zy@}q14 zBR|Y$dNN{vnIoY2^Bg8ABYAVKfE)2?p_Nu1LV0{YB!f8Godhsm#cGrG%MGk8RTh8aJOPRj8Ro*DgI=CevE(^*>v? zV23%aHSJ=TD5%S{rrTy8sgxNldD&+}n9FqgQ~g7k#=@~z2aGC)c)jf5-eF7*;l%5A z8#T--VN30Er$;dD=$T88jFbs0cXMczOjQ}XM#DDlHAV@jJZu8%no%+p)qg%xK*Gk6 z%s!L(!C*gsrA`YXd_{+xBXMnF<~jT-a-=BeyKZ(#pL z__=(FO`HLo^?ktzfiF=!kf8$7z-|nglpdwbJ%tlSA-Rcn5?`e{Srj3}jj2u-Q!0$g zQ{ZQ#xH#L-Me%bnl2Hj2!N(fecL+x*(;s_WFQv-je-*F$31g7L)2>dHBchauBlt`d zH(kdS2ok>OaE{<4Ena=QN+KZY^LDTe10maoec>o!$o8Sm!bd{H{e0XI0>`av7Z@%T zFF0E#C!@IOOdq1+V2dCB^icM3K>P7#M^RkBXRB00~`>rD{40QA1TFw{kW*aO6dql0>*XbooSU4kF))4^Y>iQ>bQ z-giq`G!n!*mmR`5anh((;lEBVx2GvfxEiPW$_l&PtwO%Bz&ak9S7rqoPdIJ%2}lR2>`63IsnXvVSDt83q*;rVzISqYl05;fC{+3f*Oe#R<50{zr60SkJjE`K z8S%v6n6U)1O+Ss0xNR;X@$=*mZ-15dd zNSEgWZ}L2zG>N@0O`fL|ro*j>g3~!9Pv{rC#l$#3j}Skdl{~k03kP!}dC)ccQcsDb zLf07d29`>U6nQ4WCIm`CB4NT?AnA& zzq5jr_Lwv-U|geiXz4TlVE2pcPWzmGlMtWc)@~;?rrY>K+twi=sDMemybiCmQxc-{ zh;Mq`HW$TE(t-Tp*CB`cV@Wa;cys;wSB4PrV2nxPFnvu(zmP$3$-WU7>Q`^uOcFQn zn}I5_w3;OD+wDRI=wJR2&g7j?;eekLG^Qu>tw1%h-WQ>0fNH-LV;ZM7m9Fut-4vy3 zQ+r3ffQ_Cg7*2X-z{XC{ZWG86cVvu%OmTa4RMgcz(Gwr7;s3rR>!r9TKI9@_-W;EV8@z= z;#!lWAr9hfI2b?`^sXl!iid|%;Y`_wU2b$gpV%s0Z4WMwJs9K0mX*Tb(12<2lkmey ztqFd$9~*jqA<4e+=tD`ZF$h=DaWS9hfZ@Q-pFfn`YLmR)VUBz!fcG^V@I3xdN~?HJ z#9e~-#BkNnk0Uhh74e@$=q&Qia^*VJ2)b>=+kzVox-vrN@_bRgQ`Kdf!MJZ!8KjFI zj3+8iyo>of)=YO5Ulmo0!A8T@720mYw-jIKG%BU@M!c@6kglO7iRX#D3yDqlm9jw> zKod^y1>nk3#l?ivcgZaVBc{9*dk$Y#g}5lK7@1h$LYw}{SVsviUixgr*OpL5C_R>x zBHlUZDtaii`1CR{dX+0e=R@bZ%AKm34vSL_vJjH_i4KZO%SJ)$_`8H6Z+x+3c0!x! zq0XS)#`&cRJ6W5ggR?(YyAx*_UDO%kn5 zav;uC?bL^mh%;2AY579AYK1D+v;x;K9vvGY3Lz}4W zvPU?ARz=W~8k&3-c)6yPfe(8OyuzZD4Rh-D8+S&DYG>Fn>X~knvXn#F@9gwK*=;s^ z6>doP=5BAA(^6E8I9hyO!Kp;he(mcJ>C|SZB=BUnH5y_p>$1u7uF6V86SiNqjm3&Q z1mPI{WOs~LWWo8aO57<%<+tKYx<=D#Tn?h&wA~jAM`Wm6b{La3cgJ}}M`}=l8kB%k ze$^fC6@{!tLu*+z>5i)JCBjkF^oQy)r+(KiUxGKDOjS*yrq{U8;;`d}*L{gz*>qqL zsp%tJEY!mGD_`tR^2ShHr>hwgwi%cMyJ=l_vezo?%BoB)Tm?H5_V_2eQ@qtU!^*O8 zV;TCQY;Bk_c4cM>=%1aXVS>Dnm?@yQIa3?1j3;9<1bj3)LmQ!t)s}Pthv{&&O0~${ z__IAtfboqqZKN{xm8J^Nm!@i?l<{^+iU56SiZ)sq2P%>U7!M|EW0dh;Ws){l89%Zl z3ixnjqBc$$zlcc?@Hsu<5@l>oju&wD#&~T!PROD-fUbXsVc}9`933C4O;ARAN{oPW z^J6s3o_CS58*g2*RY3opRt+QU$aqbgsPtFz zMrPp7Y}zS%Q6S_{D`Ixy4`DL6;7wCP#f4guEOqc&-cTRk~e#8+W;PppZ z@gc3E0?#rZ>TRv!TB%2?S{tngE`4c;$_!yAW~#Dd!P=i)pG#GA zSuO8sD$rt;eq^>SPm5FfXUmdvIk%?wKV_#eSaJlej+N!7-urMFslnKNeIi+@@agAj z*-B04(WRM`7ggV!OC=ajGN=Uo{9fT2hbv96#!5Zt+4b^>u`z*qDC6`@YM_jlQ)v?V z@C}l#u{|@Lm7dXmBUMqxE9q2)n6o5vqdh58%hC*&16OUuy?tq{j8${7-S`gYc(UhWMa?r(x5;;<(}u{aP^OEJXo--T_ov#Ke! zhbn5$IL}Y7z9u-+nA$@htXh$kuNV>mQUpd@?&4|T>w~nyR?^QbznTkz^Wq~*3^L(?4 z-E6k{ThO)rMQ}Rq8!CI|uG#{If+Fu(-&@NnG1ZufMQ}b+Ip^EC7}C{(d}tle@F77dAwhOrnFS0jh_AfIp(W)tfmI@j&Xkdem}q0by#M1)?PtHcZ-LW-AY;%FT>9$8wN8c$Sr(X}S4RMk#+iQnD`S zOD2hJRY)mj;b)1Y@l+vFvfg}*LG$zv(~y#N))5BOPZ!4{rslmiGZmC=*h{+d*CVIA zhc{Ovr}z|+Qw-fK8^6uH6{&VBqY)$KsqZk?a+Z@Z_H3K8BF$dG_!~a=)1ejVj3@Ef z4v$w=WZ0by+u_iY!zwcEF3pBCe>c1$%RYodvEg;K71?0nh4V&MSBzcl8V6fzL)l2nvsal^ww;dF;uK4P-35lLGz<#6c!!6`o}aS? zK~y^!q%bp@>2WS6n}iN~3vyt;FHT~NlLTThA|_}-rwmdqgdlwZA=J25U;tWVKskuB zmbGmS2v9)yqIrQ>cY&7(J3%J`7)pH87TwY-3$)HiaG4-|I~GBAgZ{2V_Eys&9Je z<|utF=W;@hq4#w#064X?3_iRFP`T_ac1m2@xfU0U#XEgjUX;jDxoA5BhREvaH`yUU zi5MZ+>OfdtwkQx5gN=w4aGqyn+(Aw~vL}L^-u3Y$aym##$|rN23_aK-2+MDdJR+=s zkC6xKNrVNSXyOQqF-J@&CDJ;?z$3%WI5Q2K40jVW-S1<#LtGSWAL2TANW>LVXFZDw zaye?X$a9wAN4$7UgddVd<@#Lc{YrdMq<7+3lhSdl^DQyll! zKU)xk4AOphnsMdW%~twT{Nhi=P@82%2&BSM`@PL5O}$^~FAYNq)tevALkcPJB84P6 ztV>n_su}amu7+f57!MA%*b?n(M2;rw1y?RS#f%kiS2cMWhJ?eJud)A6{}qUlU!d7A zGzz&ZN0DZcUOuM?e}r-sv!&v2mT(eaNGapW3d<3UXSIsVQ05)DdjJoUDN`|roLk9J zlss39XgzrnnLLG=ZvqZl#|TvbP;G_W$p{9g9W8)0WZ2sFNC^f3`K>hb^Qs=Pt`*Zv zA}WDNlOWnf9ldJ5+{w<=AhIJa1}+vdxp|Fla*HJr^^*swAPQO}cSUwQLvCJQ57qN_ zlbuhpV>9K`Cb5N$H8Et!YO{(A*&PNsI4 z$ltUIG+xLgW7gp#3N;J0l8jbEpcxq7pd%=eEZ^GT99fAZ#_`Su{NDtZCT zm%g3_%1dvl7r!(I{U5$5CvpC}yeSteg}v}s_ooZ^c_BpKlygUe7JMm!EV%W55Eqtv zZiGL1Tm)XZGy<>kMd0-dBk-2V5jYRGm;BxKN(3&L8iAU&!m^GbG8B?Gn3Ro`74I+& z1Z@LiXfo`W&}4rBl%lt3i5cU3T6B5~#_Z3)m6bH!a%~o zj30fdYsO7egu$aby@rV59lLiIhtsL5wmLbV}0sg1JcQJW@b~iBiU6(rrQzl87V~B2h8{ zGcyS(M%ggCZP5}irmAp;SxUyiuvy@cS@?lqiey%cTm%_l+d5iVsvQa@!V7U~LM2lW z=7oWXh`^#!!`KKRKV{CVBH1ujSX9`ET^hg=lopARY$izN(ngGYK8S@ zAiS<7g5iBWj4mq2t8$ZypXo96U_5AShq*8 zPHFG1*bbxf0EO{;;yRR%_V&iZIY@)=>rCiSa#Y0YNq{BoyuUM%2fL|hcXEgFQuiaC zWH@_}hu6fsH2P6bs_-zzRA*X;?&;TvO2<@-T;jrR=c}8 z^E<+xPXAGw{76q{ho`W^>cMwVB-OB!mQUK-98L>)t0S6!3L=@*unR9Hg-i5=hn_??IVC_jPAbzOEixyN5#S9`7Mh z)hh9{Ky$@0Pjt<&eDrM_1+k45(D{pmc!CRZ%b&a#>-B-A+b;e|A@a2uRI-_A0YBeLa zPEDb?cQnSrxt+qyst0plMte_=hqahyzG)&@{pB1Ax-7BIXxc#?7d3#nXMs&~C)KIR zGGOQapuyJK-otjE>FKte(GbYXz2f>u|I%84`J^a?m?)18_d(vFmJFIS>){s>f za!;H(hxQJwoi(+=om*#d>yxfsirv#Pqp7}_$c@u)q>EqMR9{hNG|njCKv&}g2W4AG zQ-7`AN!e}yTiXQIun2{i+gwqnyPIYfY2hU^CpQ$4Lw)n~<)qj?XKG`fWH@%}V;oTbaP$8v-`@b1>sRa*z2XQ+;PXB^rJh?A*_U{9@iBdQ8mX)2R%rKT4wM3%>nnI`1#8k|XpXOaA=MU?v9w_AccFfEJ3a{zmt? zT;`(#E5|3&I}@57|3EL~Ww&FSzm!SqS3Le%ISbZp6KLPKC!H87Ikb6p0PN!$u-IRK zy^NU>E`9W4S&8>OUrV2lAJ_Kh0g?%S_{8L7lC_o1d+9jY^n1TCERJ5EGQItTl)`s= zfdv&vzTtfwgvVEx((h*+lajB9rxvz{3|xC}=2ErVzf#Hmo2hQ><6!;*L@ zQc0CV(;rmP{5SGertvcySiVoJta{r2etE&OJrQi^zaZ{2vk|=Qr(kbp(-`%i(JbMw z(LhO?!1miwg;}R)z8_dng_M=YPHwG06%t0*XPc^Et3nmx>wf$`s*pDQnPW0>hjZrs z@uZE{gr8$Ju!O{6I-YJ89vH9%nI&X35@aH`2r(LBfC)-5KgqPLH!NS2R;bju5hMHzdED$+LrGmpvM5*CK38e|A77iz{!od+F ziD4kTk&;vr35=zd31%yeA*py18#lmvIAXY5G7uw?Ck$Ajnf)gWh>heP5Zh=X(N}0Y znCYL>295^&J-ZLm^k)xtGii2obb9yE_CAj%R;E9nv_10)vy(>-1b2C4>e^4E?~&Qe zBlB91%ygckH2cv`nY6pX{GK$K&qM>dGOz$Z_I9Qd*ag<*$&g8mrhmtiDT#pjm{EdYm206o~7Cn>Nb^)VY8p2M{N{?399)eX|)DIk`q2u%Hk zXE!R*!yK+~9x87!VS7-8eI78656tH&fp-ukIMi9j1P$Wzlt~hz4V@JoY7a<2Oaf0A z>d+-N1a2E6(CHvi5TD0E^rL9OLDPunK{33QQf*O(t|83qAiF&vT_9Z`WQZ2*=^RR0 zUNE1h3f>{~;ArPCY7Nrk878)tXhc^H(RPFNcm!i-#5mM7LU<@ew`YWy9Y;`#K<7va zPLh;IgY}>m?{s;_cAyk*dpzShL@9bYJ(qN#6z};abnw}P_k5jo9bqwS>N_l*D>MT` z0CiY8d*;k*=ZiWlW~QiPPMJIhb-1qC9apC}%nnD&`GCub7>Yc&5?nB3LnxSKA| zCiWWCU`-QP{S2^~^*ME_SrlPXE*Z|D{pZ%_)v0M{#I$@8SV;3PY6PpliX**O7Gij; zrS)5yz}&OJu5}k-c%TQ(#UwD7*1u_DNu9c^oEf*21QyfyOB%u4SAorNmr;ftwEm8! zauS^bc8$A&6i|anc2c;N*1vfon0qRlESF(SG%iIA7B_;quK~N-?UG8<>g~;yJa9eO zEH{{YDkH?yp|IxD{PP;C>eLnN?o6wu%xh@MklzknIb(TxXrgU45ZZWQ{#`oAn%GQb-=n-Wopl&x4D$J}7ey}YgS zW7!_C{j8Ex1{@VPsyWeXgzp7guJfYK&MdSew{s}JS5TsDs-pdnRzMzX(u6DpFs zk<$wAG%`+PKQ=H%DbC30#lIRD$Kjf=<&szROE^KQ=iGDnQiYb}+`RqV1QoKBeQjsI zTj}54AD+lpInWZdB5o&hHMJ)ao6B}KNqI~sdWvQy>LXE)pF|l>kCLd&MSe-OBjoAm?2%MEEFQhfe~45gJVw?; zc!qZmo7}Q6JisyERKhxmA5HdJlASmc>%Ol3@}(pz%ZphgYpV;_Pnyw=<4ic$F2Sh= zr|HVY99yo_8>h{qpjiKnQ|FRqT3vYJr-NscASKs`yS_r8)yk}7=i@!?i+eua#~ zKdP~bQ!Hd0`SJL8ahipUkA8DS3MEzH#5U5PzfLKl9^9gY-UA!gnaIk)a#i3Sl=fn-p`}Z%Sf?RDB1WlTVN+C5 za}+2Ot(KzhJ5<@8KjU4+MkNQixE7 z2t63Alv0GqhGxWXQ(2xdVmvd$1eHq8kg5=J}{AQ$ROXqG)nwmVkF6U^fOM z)V>Hf1QV4$( zSPk9S)}8Vui#Wto0K{+l$h@d_7p8URJBVr@6;ZMWMBo z2fA`VI|C^8QLij2I=fNqKxCnTKBH2!1jud?kQY%YuPjXVp?1+#3)s8pq2i@R-ew?$ zkI?M{k;cG#CrD?2#r$q*!Y)zou)1+dLtNb$Ez~k=a=kmgZj|YIsZXk_)xyg!Z>mqh z@X=>BVhfY_EX-f>ZE4N~sLQkJM7eP<0mKdl%x^To?Gdm9Cd$2J#`L)@DC?vNnRRIQ z?54Up_hq8pGqdVY=B45la?fPc-Z9yo0Y_bl$8IvpJg*r?ny7a(zNCpaGi-kagD+KB zH#Wd>PfMoYvnNkIc3L&3k^1j~IDBln`|jnod-Rqg~aPtozk z(mZZv&=m!akD*JEA6iYyuyijvQr+K7_h*dWfbY2>>I zCC49VOln8B*UAE-em2;w`ZSDQlw2Hx4PQZUw={scry;v5Wc|>BlHb+{=AI5V)tyE0 zZceG4k6=1gv=#1d$}riGd=oi?$W1Sii$XV+fl9!`RD(d}#NYbhYw-Y^nVJdlE` z4x?O6B4|kycKXC?i9dIeTb^y0K{_}qhv2$2CeNiWEu1mM&Ei6gi|f$yQ2T5=nYIc)5k7d|&-kI0uOmXK>fNSW^ODD5bnm7wJpCiktX(-TC zG{9)Q7i>;FYpu&f&6|)~{T%e~>d2A|?6!#_<(a7WW$qLnSO_*(7IV|k^JZDz-He{k z5Z~n_a~QXl-|aaQi=R3aGyL28Lh-zb7mBZ2^C7S8F_0%;^_!2`>_ydwK6^5aO%G#8 zhxwje(v#+Uc2^xY-?Ou=&63ycvU^P6`l|`-ADAF*XBI|eC~e~O3M&Ko$}DzY1{}XT zaqhq^RtE0+k2A$3llUxduOqeSddv^Q8N#{r7++yqfwJd56H1qZaF$lQW&T2xJ^Sl_ z4yOvMd>^d-xhT7}@`1g4zzg12<=bm7B&FbHELrp>pQl5&Q@7!U`^=5HXMXATeeuGY z)W<64VGAQv%H$_Mj-{at>(6lD{iypBDV^axest?$qXR zr!mgwE!=MuU@Jc}A&w4Use0}lXPfqYDUlA4{@qhl)%e2*s-5^S@4p-VA#{NFiv3 z!4E-p7t#wR9K((Mog&sJ8pc`UfQ}J6aUh6YiP=|&qfLyh3HaSiqj>y493zl8;v$|o zymi3~-nxisJqj}o9ap2o8kM(lYfY0Zg$F};12I<9=(acrvBt#g8YV0;Bn1hv22`-* zgaBbx5+*151PNg*<8$QgdWlmB2dkM#rms>A>PpNqv^uisNiPTo9r8R_#Mz0>X2I(z zTc2>sDFDk`(=*Dqqr_FpT9}0&bz=1s#@^&%Fmbd}l?om%5*7#fR1pue(vEm%Ij9q2 z8&$SUv6%_M1R21h#-S=va(M{HFL83@@l=s@hw?Ob=uGz$JA&FrKJ1b@@n7MstizoZ zR^1-Y_>MTSe8!8v>qsYlFXa(Ydp%>o5cQ!h&nTwso+LbV9@ABZu>G}|31X2*M6pD8 z?+t5mIIcj1?G=lp^B|btQ!RFaNLyTVoOy;NUOSQdAu(1wJ&4&G@$P{g=)~dYMc!Q= z_89jdZa=U~#O-mxK*-&u=TO8Q*_!NO1?Cg~;vwX{M|_W791F@T+mQjzO7!5ERGr8? z;;KZ_-QvCU9FnysnCj+Opln!DWMuw!F_jRRd&LnNK-NBxPI>?MBXO7dI6Gq)a24SdXqnM?X&t(K%Ov+DbqKs= zihEog;$Aq}JqBkJWAu_K_@5fCMB4KknGxO785CwRBjQs7QDf zlR+A8McA|IhcT5R>m8;ajMp}B3d)1XdPx(`vKgE{pCazF#YlSYMDeIiL&B3l8s;MN znK<6mBxK#*EWWr|h)qmJoF?*~3|44kLjMq4#!k+XwEbBT&XjSO8?T<&nK#&mNe<9kBmBTzQm3D z#itYS#)RW0ZwroB2tIG+sY?`sPgwlPSfzACAG_!zKAhLl^!V=&jN&6PqmX^p=8?<} zBKy(r;{npYhhssvd`pJp?lPor{}aBVbGIS%Zy9)!x(mRDe~5R<_&V~BSqpZ!3b9W; zj_>IgoC-41UdA8wk0u2F)d74|e@Fo<-HYF<|0X2=9bN&$g$6eID4(YJ4s8(kEH1C3 zBa!^oCvk&45d)U-2ClIaS0MVu4Ex5*X<+61@t}nk&$)CBS#sYT+Z*C%jh6WNI6cz`Z__&iFm5wv^;Yi z9iz#xWrS&)k^x=uP3*yYP-&$Dh7v|F%$>#h`MYq;K=W2ik~}HfR8})NPSt3+X4WB^ zI$JQ#uEbG@h%+I9g30NYB-~`C-z-&2ibhY@63pm)n+EsVpzk5ZjGl`V&h%9jfKVAW zx#jo@avm^u!B+4Uq;%7H<~u@-Wj)u~^KOEc+o5;*cu!W=RNl9#u`C3;sc{jJeNyKR zJz(BDsUng5S}AKb6Yb*8;xEF0yGOWQr4_S~<26`Drf#byqY>|b=E?~T|3@)ej;!Q% zAEd&jyUvf;Gl=ioLyhI|NB28a*eqxdZ!;$n)D<{LeWk=cS&_0=C9!ig8%6hWn!`$Y z4p83?cCe^#r_scX!g^6-&FzM-XufI<2lc{iBxPkA%7t#Bt)5?T2&$LM%^^I38 zq>&?M7h2+^APrMywo~Q0us9fLWb$je;w!waDah5!X=6%KKk2%bOz}%joHD1KDuWQ4 zHkM*f<1mATJSN{jrRy55;^4i}z-ETJ)@)?_jvqWSA%R8)`{cJ*q*84a?tA6tT&k_Y z{hm9EX=dDV-fL~tTZR5Mmm_z@D*XN!>aFz07B^kizzN%r54rm@NS@6S$6qUtyv53L*bY;I4gKab2X8GbvQT-- zwRu)H4bB5cpPG_P?b+*pch#6US{%bDaG%STEl$)`^jMW8c!`9?5q-SaHZc+e#@CO* zLKCp}q*uwgDqMa8xYH(*`ij_jLwGPRm_v4Z0FL&4HG8RH7}KnW=@`T z`ArvPl(>=A%-_b4{Pq1Tf1Zv5D-5tUI>lKPKAOVHX;(H_?O$0}=}XBf?isMdRb(*Z z6lXzy76X>GgSA@UWU{*K&wOn8(L}PcjQ+u6Urr+{iwKUTkP?G0#I}xk1VBEx5*l<$ zMqRVwlgy-1Fy|w#NO63JaPiVS=Y5eZo+4h~T4_4d3pse)E;LG5NfLdOX_=qbgHW7l zc8@~>Sn>lwE4j#L_+>j{1#=d~+byP1mlO~0lHw~>?A*$JwG{Lq&PLUPL&=9{sq+}+ z6K|sGqIh1}1@Alv78rEZMZI^F&nw&JT`Zf8!(htCTEi!vrK1!ND^_;gcO&pa=2^O) zaeSW~*I@^{8Qpt%e>=R&r z9YN`)pJds#HWn=XWmapSO`>$O`&f2Aoro+GR?3+qZ#4x?`#PGc_iw79pfQ)M_I>op zJMA}QP*7{mu-f8yDd-AL*cKnw^1CpWhk%hEds)8V8_P%B zCBJ0?OT=MWT(xB0vaj8LZ-rxG1ZkYeud>`-u@EUW-0ZmSp4;wOeow{Zd+xgZW=AyW zzD3_$K+u@Fado55GZ)^oY{4DN?z#W&+X-?mH2(<#e?Q=%G@>Y?mOewYr(?h z^7K957_sD@+ZR;a{@~s7mMoedWtqQZbG{UJE}|Ix^o>~tk@!V_cSe5}MOfz*GHmrD2<83pQS!I3i&+3;NST)U@Tr4;of~B0+$X%AOni|_rPZn`0a)W z{N8UO@P}~`*!rsoTzP*4u9lyl;qMXANdA5j{kfPmS4HTbUl)PDu@LL)e+GsYR#TqH6C9x?&XGG*_$%)cMXCi#ZuOqPf-3S~V zjW>Q%gsyua3R|P_mr=Mb3SW*wZxp^0h0*q{>yOax_$bVe!l6-kX%t=_h1W;n9Z~o| z6t+g;FQaf>6uumV-Y9&>gxprdJ;OIYtNCP-Ln~*g;lx8b6lZ8Prn-D0OgcHeCliGEgUV@vwzUX z=fL__r1REp?6N*P_yaL{d=~NmZjXKAv+<}r7{V)}KZwsHWlN1xn>mJ)(=$Rmx4D0= zmD8K)oVrQjtk0|RZ9TPmG{-pAP&d|^FR8=-OIoG^WPuNgsC3S=4{m; zuS-kB`F-Ob*to!>Hdegb+lG;}Yh4NqwH;%r{|-(DU2`&t{-BzmPc`Lg#+Va{Lcfj) z6`q0%<_dnGMZUa}snplm5&XGH{hZJMM^udLlkxNxBd#|?DK{S8M}<_^LTxY6)CiOM zEfgna6u&(bi*My~OtQ~-(@_0NXjMljFT$&@nA8JMv!TYA)bELE$Y+vMO_DFps`qi6 zad<37Q@KQ44^gFmU2$e55x6%uia^OU@q;Fh{HXHHjh{TEZKijW~q(1 zyE7YDq3y}xhsromm%#6o6C0MU-Tvp#&hR@qf7|oIkLOkMxt#>1nsFHv-1|n5HxByN&Efkx z@c5XEKIsqPTwX$0;}V7((3seTPecDTtBJGhk{PK_SMlOn7W@zRaQ0kAfcy1fN_`WD z_K)}u;!_L(mNib5SfTRLH1!>q`1`NWU9z2M@2v!=9Yaty^`%@D{JiIlxBhf489g!* zBC2B7+&V{>ryL{&oCd#H@ORV z%RZJXpUY;>ml^1G9*<=3iNpftQF;=tnJn~L=HU$H;dE2CMZZUz^RayDP@YZUxg_GJ zm^#g?0{@5Qa%RZaezoh!KY{~&e|d|OtcBk@l!W~F^b9*)9F{G3I+(&60W_0v#@ZO` z?>WI+&1W9u=%&e=W@U7Lk)e54IolG%3f+LW>^*$R|Cq?3UKru8X=R7;H=mosP6o98 z-OTrKNrz|i1^}e-*sEyNfNX(4seb(1CpgEc-ep&HZvsm5u56`7pb@I&h{3!0DtP9d z?!8A&Gop7013%uM@2}>^5W?1)Mf({Sr>4L~g+9B94RqsXeiusZ5EfI!oSr z314OK8~jN7{|Zc_GZyn~8lA4dgz+d%B?^;(q6n1lW(rI~c?2diFbWg{?qZnA#3b|} zOk?g5`rm`;)D-C#hLJ(vk5-ED zq2U6xBDSAt?GifKzxS&QgTKyjF_alXE_p_N(cuz0>k7-$V8Sh8tdF7l@%crd%o`c! zaSL5_s7h8i+R6J?nWxVe8>Z<n+ZQ}X2JDf56|q01kBce5(hr+Zpv9bWOBi5NP1?p3 zFZ@9m!&EQy|6Mrv+#noGcMwMM`;W{K8DH|rS9TI@(Xz0!ihUbNm+z>WjWg z#cwICzfd?`y_Rr+GQMjati@n8|FbY&J6Uw|FW>x2U#S1H!*Bdz5kHI;DLO~X;%?o= zd-NZ+Ic>7yzjd%|Hjc#~k%J3c`83dlfY7~cyS>5**U(QAE^x#5YU7U;D7F6rOTYIr ze&%T~J!Ac8P8OMokNRJP1uFFM0q@(#_}rEGJWH?sr?1YU6zWfE9^m&73RizzjXMfyddMqfSA&NHxA z&Q4{WexAWH;$$sL_45oC5=Zms>*pExiMCu!V`hAnj&nYo;}oBy(5=ohI8og4McO!( zf!?2wfL+2DrZ1+ALl!#p`3NjJ*tfet$FR1)iKhRLCei;{I3FIviByRp|NlOeHNE5) zf&VP~|95i#uUWe@Z&cAC|BbIehB);Xb`;F@a{T}P)E8Fkk@5~M&m(oYK&?pr6HDnD zwhAiQVz6VDmhoec#VnNz&Fuu)Mi|CK5ZM})?FMnlrkdNLd6=eo4Cb=Ekb_4p8-5m^ zwEs?N_E|?P_~|PLJ`u4?kfh|L`7uOjb{8 z(27pK$A}z>DtuOC>HBT;|n(ABx`{mweve zIIOH+jVs>vCWo3&*cq(rwg3SWvVe9T373@8@!+Yoqll5PCXGP7&U;4>+ zM~Tb5{)fG+$8Jw%KTkfBYqX`}bx(g7cl*C^I#DeG8MvNQZf3tg@iG4u$tRd?WjK}J zwjBIDOZgqki+{gTe!EgG`Ta_{%4yIzjG1y8lvGg&`F+eR8u!0LdM9Eh+`0ONy+=Mh z%RcIn&W$6qaQOqT^ZBM>S~!0GE+Ydu=m|^ymMtIkx#GiI^xjB&#{6-#(gWtNqK){w z`KxHfe>Z;)EqSkW3-xpPa;b5tEtAQh1o_zG#myU^;l$$M(6W=T20Q|_`>Cn&9 z5FI7RZYpYG?PIUepHjotBZxjy#JCgjPGB4vt);WeBHJR_<~E2d6=fSlj;3Y-Eo_Hm z0y)Zj(RRq-R!HP%LS*@PVOu1Trb;&Z4QzL`C*U*b+In5aWsmBYPzI9PY=qf)2|T zNg+QxOIL-I9TK)-zbd;R{}+4b0a#UaKJd4am%Rre1VY$hZwEM9>!_=B)v6V6&$jMW z3(jh5-MbFdD#=SoSVkyn9H6482!fyp%7*Y(cHVpU-v94A_uaggs4aG?|Dbu_`OZ1_ z-gD16_ndDZr655k(q7J53TCtsePfv&f@%F|6mBNe*Vy@h*F(!6DzMOKH}xY%BSZSQ zWW{Sp4(1d0%oRIV%@X(b>YlApl^7!SA+|=>)a##nZ>vAty8FY5YbG!QkhEhYanK7yQxPdU zAKy`{S)=zH#TwmbF>AE;Yu4za_p(Nx&l-KPxP?S;^fj)=PGV~Y)8b6DrFWt>J+K2G zllIRQ_Ba{sgGM1H1HJ=%kb(YrzR{t5zVh7-7p{i;T20Qf9PGZI zKQbAkgfqk?Qs-y}V;su3cZRWG?-ycJr;_t1ld;Op2qfIeH*OtI{GWnEB!X(rV!d-H zHS8cnV@`!9C~^8AbP;xiBdJu-Jnq;!_W0|dY$>v}4C;A@eICCb$T&F6xuk8om80xs zR^j5%es`8RqcDWn%IYfFF3v8w4r^SJFsYBI1QYCD$@r!TX0%Fh?})Sf8lon#T{}+O zn=8ik#UJI6KQr-jWC>%DGgvx@F$%X%{x+eM{d@9b&xwC#_jLcBc16eI+w_-l2U^TX zAzG77@K`ScCnHuk7kD=Xp&Ya-_N|oEku#N&X}||5Y0sp@DPGU>$oVlPrve|Rq$QOS z*Ir6I#at#Ggn>N;4%-l5+|rhXdzQvWIB!=yfQ0 zgq$-dA)1)6kdhq^O0qgAxsRN)DA^ylgpx1ql;nje`4c%8P%<7^555t-P!T@&#%*N$ znu3wQx4_p?&{rq%dor%1UAOWmpn`xxgY#;m=Ojr39m ztwW(G%hg{lCyR-}Sj=cl48yXaD1~#&fTI(`ur!Qlz8`n|8e=Jl`#3Wxm^Nh~rC}h2 z)1}x(Y1%Wzcx3Z3mmv=pz~79F>&nF2+p zEl~8?7DNqC0|vsI*=d462hS1cN8_fQYe%Mz{Y*aNH z)4`eboNgZTUQLpC9lTpx%i zf!5O03ps`G2n9?G;Sut2n~+^bb{H{7woH=6g(BugA-j$2Fd|lx36Uo((357D@o z=^QmzzJK>^j5BjbrZ>#iZc6WO`b>;1{@8bbDZD4HmJ;VF0Y2eXM4%@!d;+p4iQbW4 zibRi9A>(O$pCSjb5R|M@B0cE#k=sS4$8u1-y)26jM!OI9%R^}vVGJqV#6*1J~AxfTXyu*}o12n3I);3>q zNfI_kO1r@~r&R1bS?M-to5GohsoU8`MG-BIPX#EW#cd-G&cY7NMJa743nWvu5hE_Y z&PP`i)0yzf!iA&(Wj7a&`-ky_f26Wbz+%goT@a_ZcB-7bsQNmL`kD|6)Iqo*N^I@z za)q)+Mm5<|2+dSN94=!v3+8|?STJYfG&XEIit5=cm<8KdFlP%*^a}be62={4fT*UY z>XMKZF{aDLa38+`rdd~Ib}D1jRh6AWPP`sFi6g=0BlnQl-6^oX$#A$yaF}lOm!M=B z36Ns)&Mx)$U#UNn_cU%xp;5;5!sw#cPZGvFh`}-p`4VZKafa~U=QPaC< ztZ|6TCi1s$TJ^s;&_g)N!cmz*iU}Ogx&rURsk8G^cH_FE;mLkFp=D-~mAdf6UHd(^Q z+#lWLP@Xr_`9V(~^z=b=9w-~Z9qf=^RN$L|jlhk-=6!^LXuVy)FS+gupxkdgumSi1 zP@JtR4%FR*u0o zdMmf_KT_)eumco!1lSE==Lx2#v~%ePpid<7!5Q@w4nmf*Sz*5gBczBiUir8e5*1i) z%wh+B(9K6^)KPjb66(Shh5iB!a(Du~(bM7~ue&ybZ_0)*Izjo(!Vtow<&+4bPr0~re=V4CJbd8&3d~mgV#5zZk8`}1phZ27{=NI#}bUtK#EdIpJ z+iL&#n{&=Q=eKuMu7zu1kG^#rzbx^x$?65$#f(57>ldp6eZM9#1=9~{lnq%QzKNaU z9X61>dKBjmC+48EyQ~FbeAAJT<^AQT@#fo7P`)3q1Oa^G9eD&WnDEG6!n*0N&qyN( zaKdqqeS+4!!E;veP@6aZxT_vrx^9bC#X|U~?(rLrEs+HykDWY|1vHNZB%Ad#7by11 z0wwI4*emA&bHItW7YDOh&>Z0Z2xg%?ad7YKZvoR8U#Tz7qH?`Jc}{mIPNtG?!UD>L z9M1*iTuYq$au(miJi2(r`S!)duISeP?16R3-gx+6lzIW0#o#s1M`>%6DbRB zA?ABUNc;QP%2;^&!)TT&>#i~=t3g~>&UG`LZ}s$PPoH+1uiw>qYW$pqZ?E{EPZt*j z6?o$aba4;JhmZP{_4XO)$&5WtaN~T|)Nnr%7b>)d(h3Pqutk;u-6b2w(OCZ6C8#lp z$}NeY6BT+Eg^LS0q(KyJ#vj3M2Ai+21z;zD-KH>tcN?R?PE{C|entiu923`t5oNUz zt6_-5KQ)pl+YZ)SVfkR6fFa+ctS=a6S!fQ0m4Lku2BAoq)LaFI@)s-(Y#kUzX~~Zo zC$X_O$>F}na4KBG=Hch5?cj%ip9a2$@_aUn>EKhrUjpZl1mkA8A^5}K7(*HJ(JFrq z-*+DP6X4sy3H)hH1pgA%=uqlk!1m(qAY(LLC2HytwwG7H?*SLJ^oNl6SJ0QiEIMAa z@>h^Cl%}&d>1B6YF)a^9bilP=;?{CHjPGT6Mu-0S(z!LS z?WA$lY)g)}*_KwP(~6;O2!?j`WB!~mn8Zk4?RLz-whqA{%>EQ|q!M;1`=eznocc|A zDQl;Gv`^GqdU3Vb$LdF}!Uk|Dc4kMuqGJ~v@{Gq+rOy@1B}PZ{l5?`lZN8+bS3J68 z{mx)G6xjapqWdqI;F6U#jrCmC@l3U@XR&?@5uF46^)O5A3t|Q;`@?q+ep9=x{O*1} zmj90hyZZ@QjusZQ{EIAqBg_BD@<+1#lPrHF7kjAmlY_lapq;(AE1XHRxt>uly|8*l z;otd9S#$oI;CJ&|U|k){a=f0Ec2x%Z>hD-T@0ASJXKx?K`V2V%WVee&To|b{*wmh- z%E3{*7x+csx5nZ7gRh9g2NEhGl*l$AH;@bR*`LP5;c4J!cEfM!hCkH}U(yX<)eZlo z8~%AWd|NkscQ<@%H~iCX_($FFH@e}^cf;@KhF{bTKQJDr!?e_{8OGYU9!;Z%@9%~m z5sx!u&F-!l#?$7gsu4(o=-4kFXBvFSCTxvR8u-uSaW?jM)8oo<71R&znqfS|{@i&3 zqEKy4i_gFtv1Ke1tg{BDp!!Md)NvWcuOSFJaU^H@g-n;u3@lq(IFl%rfw=9nk!<79 z8sRh}a!(p`NEC;(8Vwl}#W?s{!Y7$?usb5#f)%;v|05LF9(ivIidHcbLd6VQ;85v4 zn5IeI*TXEBN-4KsHc~#pEtrF;ui&|8Jq6~$fC|j#83GGo!bU*o%ycdX>l#bx{}XPF zfCYO-B0j3te{&{SBVfV*?MSdko^PqjIOG+};x5>8U9hEHuy?y)Yr0??yI^1RUAQva+@_XRFqaS8M z_4JIx|9(F8jKg>1dp5_xn1xGj>r=<3u{??OOEgFsLPqVOT)2xUjwCX88075vN!m=_-%;p@`SVyHyZ z;5zNtr3iGW;Cz{kK_Pk4x0$GRbFtFTP^!|N-ZmA`J-z+yzm@O$+=jbQ0pZxm^pjA; zWo$qS7|k*M40A9xf*4R`u%GQnfj{_5EW@}F4eTJDm}1cy#&40#z1a=_Z8v;WS6p{A z6Qr#325hz~y5TQ$!~f6?zq}iMRyX{VZurl;;m3BvkMD+`*bP6U8-89l{HkvFAG_ht zcEexqhVPEY>CmFC9cG-;4SyjHzm5^fYKvv)U%DBy>#Z?k^&`lMUJ#6B=-N*ic*jy} z;GuEajzRzGdw+u$Hi&3XP#ER5dVFBYhgmv|R%%j6kv<8ILK=-5%VV6R_2^zvq3DCGO{%_lD( zXBWL~68c)v6P$99(Oaj}2WD6y5s8U~bv{r|W{^MA z;8X07#0DuBqtAR!ASq;HHL%Yr!qLT!T~@IY6N`UnFRZ&=7_H`EzvRLwG*cM@_Vjd5 zPycha4&A@KufzX0bJ~r6Hp(_JOjVISSxYy^)4ZuoQE@F%F0ux& z%WmOJbj^PJ=M2^FQLAp_ysz-n2PCkkCQP~k3p2f=7uio^)YS6v>o33kc?2)Cdl1$i zGZHC89!5~E-6LS0k@e2v-1OJ&v>_{iy_2^;?fVT;2Rjae7;r2v<&Z1%s*ztJvF*(n z=KAliLaW;TGc2FRG;luhOxxKwFC2jV)9^2fjBx82oGBkrlZ#bQUU5pV#&CkuMOedx7w-rgDvMS|Pkopa+MNn*ci zS@!&MFdKGORD<6&7z+{m_ufm`Rw=h&E<0>$r;;^MrTf5cO5WE)QLak41x2|kxCKSY zD!3?F1&WeYpeR`d#+0lpz`6#v{dV|wZ3L|L^o)en6aQ=YeH;lmp-#nL_b|Et{xY<0 z_V~Mk_wR-u)eXO_8-8y${K;;(ryKrKH~h_R_&eS3x4YpI!m6`}Xzz>N@TzY3L*4MJ zyWzj+hL7!ryW;V`Ga@Uxl&$H4?d`;rDmEKYXG|4qVU{X3OO<|A6`N?~$EjjF^OP#K z6H}^K3yZ2^P1I7wc4A5uYhsov*21EySQBLvSE^VOvsAGr)~Sj$(N0yYiT-0%>%VB(>;o`0J^D-24!L!>x4$_cu5 zcDo$Z!4lyrm**s~Z{_iPH!z>F6nIbxh>#8}QVx)&BjPx45&BvViQqoqjRm z57UPbKE3dT5!0g$J$=#B7nuEj-MlbXL(8AY%J3V={@Jh(Q^4<&H4qt9Qv!Yx&q1ee zPa)4^Ds^;~4O4Ai<=K zR_?8fNn-~Uj!HyGVr;-&VH?ORJQ@?Mh-(~;km%G0@ z_%7pOb?1jh$&@G11G!9OsUxcjC&seq&Z-DpM)gLy-Lu@VmPYGEzE%RO-C+Q7& za7d#$R#^MsXT(p|a4t^A#BFjcZ@8 znYVNm0e6i@se9rW&g}(00vt=7q&G&<-QqIx5s`e~5r4>D9}^MegM8$mS+Bt+Ez5*W zazBY%$O|cWEuP{pgTML}$14{`B zXHS+9+41ZdY2`M5*=e`E@Yd#r7Oi#9=O0wva>j63Tl%tIT8`Z_?e%o*a8|TotYTJ# zwE@ugWvobDW3l%pOiVuY%oywvhuw4mkKJt~tJkQwyN^_LB)qd3fh~#EQzUK%tES}% zDBge)watp+CeM^-OB*EG+hA5zd8VoQTHe!o`t*O-_u|ZEyvkSid*JoJ`+?JB7PYu1 zo<8f@#qV#~+Z=Y$!m#^@``!y>Fm~F(e{IfT95wqd2%<~8x=E`F8D7oxN39n_t>?a? z!rSM3q+-=2y{lr?Jyyu4*s|NPi|`^x5(#I^LuXFPvJYS}`xrUJt5b&&9hDEb^_Rm< zU+DJ9!}*HD^X@{{f-_hwHrh!%LdKOe6L)E2GH|ObWGN&t3o`8|VXn!bUjztTI2kiaK@%p5i*=U^)L*wFhi1l*= zn7BPjkLBInO04c>2Xp*-_HW+BT3l;>?hw%p{Nk>B&mOUTMo%N$+F=UhYoH3cL z8B|BK1!j<)eTV6MYjWMc3x3<@f7|*Z$M|;b6^~_kzkP)gyG7~~VuNRyX#*8~wn}G{ zC*IT+oatgC=^2ZC9Fu(=1FK%oSnTWf@m>5bG+U9J2QwXMv+3!T&hkpeZIZ!y>+Qq0 zb2S-r%na6X0%wE262;}rz{%im$KgZ4Kk9~mysx+%6J&JO{_kVrX6>hmaGHJ^5KOo+IN= z)V+#5>LT!^;44`9d?{ogQ8L~opi_$M@An{o83Ih0gl!Pa!|L_0lfWlbcAb<+p0)W47ExXOdP ztCBU`!t_BQS;9?}$NfGY(_Qb$x^5OC5*xTzOuI}JJA#8cWR*8jw%C(Hve=s_u~d$3 zlQrK&5uHu=T;dR$D8VK(pW(1Q3rC(dd6}42o5h5%nedcfPKs%C9(cp^A8c=owCwue zg=@ykb|I(XiIB?@m+ebr^nay}^&EMo2<5E95-q{pHy>0aaszBM+3E%%T$3ohgHTa8 z6?E~kf;&)$2t*pm-$Bv8sW7(I-%Q6LJ@3pG`LB%OzFhm=7-v0~NZ=!gOWl^m43`Lm z{H9wTz7DXHpNv$Evz<;ckq-es?q!$I|4ALhtGTlQ1-^C2Y%+Ls!XMcS4 z17On6Gbg?FQbKbEbrX%qq7>UYNhTQK$8b(rENO)N{!_3MdQ1?G2n#=4z#4!Cgfn_} z+};l@$LW$b?0g({K8^$VyMHRyN;~*Dlutx|ln}6o*fJp{g`6CV5s(SHrvE)heSOoB zVPF5uZ)(fm%O6Mk&A(J*JZ3oZH`8%t&--CLXzmoso7(ZhehVz$?wHY@N!c6Z& zVm-D7Zvw|qa0&1a6likR+2<6z0-Qv_dB8tQ(6ihzkX2hKd5N4UluQFYKuL$3b>`Sf z$$WBtM9D9Kk5ST^Mu|G>tcsi?DLD~1o06tvN)qL)v%iva93{sBU!X*tb(Y*j$y4N< zOvw?zYDya9th2OMN**QWbV?2dE}&#*=UHd>lQV;o1AvPu+0uE|*#Va&DHufo5#WqZ#u8Xs&N`b(#uXF{1-=LV5wHyWI^gxd0l<&Qe-|jx=dJ+G;+c90 ziBBk41{_VnrNG-M(0Y;BNWrVXi4>dp7e6 zcsV%)sE~-Gy*PTVcW0RA_$Z_AvAkLL?&;H>KK<(V@!grHaZyGk0AVc3sC@YGQAXuM ziindfq-5Lj<;X!mg$jzToZteJl}x$lI}4?q+1U7f6O?zBatq32 z6x@Pxs-@r-l+!N-x1iVz3NEK)3Y1eb1xj$6xzHJ-tmYS-osQtCuZk^|A$f zdRyj}_04_LoVN0=k^|zL2#u>^eu5fj2_>o`e$GPvxxy}}8SoR_xJ76weJdy{Z6A1ya&|Avw$6fIwQ&@gnbv^B={P!W?sPHKM zezg2Upi*#+gxFMytx-{h7Emd&sGt;Bz}c*%rvjD23aAuSKvO|QLMf(zrb3FQC`A;| zR6vnXiYK6{a63UCDRu0^&EGrM{P?nV^6N->Cl8LUOB{r091YecjX7@!!D@WnODG z(Y&RxVnW959f)nYsNletLdPDFu2gYkng_`shCn9=nPr|MW3DfTlJA&nOH{aHB2m#! z6j6d5a|JNPI?=Qe>O|8@q!Udmflf57#5rc~o5GxET8VO^>8S05tW<^)e9O-ORU_(EP<`LYK*s$}63KBDz=(#T#IG~DTP|QPL%=NDGv=@mL z%L6#)C1jrSA}DeibtKu)HaU{aI780FGHxHiFLD|pYQ)nLTWtcikYAhzBx=SQFM-ld zCIwqTfk{xyvU9uHjZ9deWHxT{MRwz+p6rA&+VU(pkW$`Jd{9MZBfh6{#+#h8CO)Wc zb}l*dMZyTnnJ;d%Hbn|1tK*X0FtRh99m=?(XB>LQ;otSWeE+`(V>)YF?CclT;Ro0R zV`smxUT45Z#GU=Z@_r#z4rUKg2G9hcA(C~U$}kzhkd^&jN;VNMMeQ~3VjyvffYrhn|j_iw;ZU4UeDEuRz0?X$?wDLkj2>m3` zJlNTSDeTi`drWAx&uXs)t@p9$0E@n{-rwqvyf`kir@wpp`-eThEgOH+dz<~T)58Dv ztm4h^Czca%XaofcUWxeh&q9DCsm^`>IR;` z$7|-~D|hhZPMqVJaSN9Nhs|Cdw|7^O3BUCdwX? z^sX>A7Aj#HER3B8M{<43Lso|PJebbp5FM(yl$cKC>{eEW9JJj&nGH^52zRLS?ibQW z(Tu3Gd0d8aI%iL{Dk$gkINWqXkIPWb=y4tcrc-)c1#zh>i^GH9m&f7kA~>tZHNkXR zkF`4Lw{E=`gawZ4Vdc1Pb%%&taa=caD+747>;hI-=&5^TlQ2en;v;K+&CwAVR2;{ zm#stCyMG1R2|gj$|NEd5Q;C1AP5`ZGk8HMHac(!=>V)0Rq5V0qxf$3CCn>>fPha=+wVX@v!<*MApjca{ zvrvj3_B$+W!YSPrhhGgoCk|Ks>2bL7PmjZue|k6k<9)+B-m%#vo(jibMX%7v;n3&* zD&|m;SX@z0b+hHtG6~3n*M#y{-?#Ts{rTUlzk=~o{_4^8tpR_4@w57WFVbJrU!4jn zEFZg|>90Xxus(ZIJ6bnu;r3Y;q*cy=8n$B ze-#mCp6v8RN0@wiGX^rt4n`0R=Z`l!S!IieB~QGVM9U!^PdLs)a~lzf88gn-)_EYB zY@f2sXJR!ZaZIvV<}D}^rd&*EVo+?(1vjB^Sov_D!o3xAfwJ9vn?K7|!nBJpIb2Cg z^gTIpUMva4a!#V}Ie-#<&#AVlEG+MG*y_^YyJcBQM%S3Y7MN_C2%RwjiT8N*XGY|+ zBJqvp9ug&9bd%-Wvk%uM^9+dyFR^vskL0mau#Z>kP^#ADeEE#pFu>H~Ldo#pF|%Y)UF7pTaH^ zZIp4Z`h8OUderYr>i13c`;PimdMl$|rC(IPRqFR4?)PfRUED>szlY%begPEDa4av> zkvaks^Hy^HUSK|B67L_4%cu9>4Pr&*(}>Ck;oljOFLHQ;n8tRE$LAoYTQEMC5qC-@ zJWcnYe94@ZW*%3`vfd>!pBxei2Xf*#Ags(IV-+Ma-xw0`FPR^WCIRQt>tojK!&tYo zUSpj;jE;9dNr>~qXznTgauRST1mzn_3N2nVCLflDm@1la`NG8Iv#~D9A(X@;jEm3b zw6$9&QTF}XP<`*P47pf}onQG&hC=`6|9-}DDk1q&SVogsE|V}+cC&K)WSQxl)${kC z>;qe!ZD!mbXA8Y$v)PW|kAL>F`5B;+Hrsq)b~Jq|Fe#cI0mNHc{d=2V`Qr#+Th`BJ zTyf>O=ae2Ze~J7_U4y^=l0JAAzvjKHdnAKf>9V+VpSW~NT)H$aof?-; zi%X}+r87xO+mGRI6n}31n7Jmab;yv>B? zoMXaY*O>5{$x(Pj6k6?hIf}1Tke``Z{AK*j7BUuBS9m;=__{l4t2~tzm6a21;rd1M zt1Dd<6Kz_3ttU|+`H2-1_*yHID$MJe8k-sea-H53bOh{vE;E|^!GObW_f51#j7Fb7 zfrP`K=$l~E0)D^SH#1|YE$m7wEGga3){)ZhfRit}`ua(>Hb?q|-&C#J)6_Q6)?v>$ zzII0_;?TKWuhU-NL$J^Zws7WA^Bc7ULp9pYF&@VD#f~~{@pfZUTzagn!&tYdns;zk zc2rb)JXIdga9(ghwZ}uNU6p!u?GT&YqgQ(zm8li>$`CJ3H3Dna%ym@i6_uG>Y4?=b zw3@kSFG$T&*n_a@!@d<- zbb->udk{stI#|(a1t8*OuDlAMbg|po!jStd#d1ED$~Fm9(!em6r)J$&I+InoLin zdJvg(Q7S!W5Z&3RHXpx$`__ACZmXxVw$4`nVpTPW?paCgdS26B*yL^pD; zVxR7B>|?Vx+x>lf5r3euv53{6CFt*~F!@A`R_gWPa=l5ukw(McpGOu_ja&8iY5stG zB`pDenWP&raSH}AxGh&?N=~4_W~W7ITom>-wlvZ_gXEbv)tjkFGLT45O4H=I)HUC)E#Pl6 zY({$^m@buQv}X8uGrK=z=4Ytve4Cw4(EL81lR_#6>9hb@GTMg93O3WH^!osx9>fqp zhMHav(*HrjU&=MDc+1LQlMaLss@Mbl$Zc$tkEnzmY$8%ws6+bvv-9HjBt4SV?W6#u|?d6Ji4>D5!rg* zfr-VOZ#m$uO?`~WXSes|Fz>KE@zM`9(8zn|5dA)qGPcgw*N8OKlqaEmwHIHtISd;5 z?2=x5eo6Z+Zc5`hq2|Ws5a(nC=Z#M+utf@|?GC3HEqdFoHLv~c^^fvfv$~kRONb8X_E zU%o4uclqR$3}S3&pYeHwlC2kKQBr(^my*!SQ=OC~9JV|}$*#-uDJi+pM@h#^2M~-b z;yUzoRdR)t6kXFG*DU`@A|=U3zaQqB9ly<`BY(h2N%nkOWYCS$pDj)6Ubuexsb~Gpv%Z-w)LO3WPtWI^_&F8ZBEj{` zUVUprQ-s^Me{yUVB?+Ue1N~@+_t|n6BUfI0-tfy@_CohS4-v&9JD=^F$ZBg( zKI664K1R5C=}AdyM)dpLhvD8vxZ}O6d)tdCAAjfP5d_G3c>OJ-`a+;hxF@JFyCU9O zM>)Xl>4(4DR$xS0UOgzKlqXNFZvkssFxmm;n)r&sYDfMcFqVSS$iU;@;>3hV^O7UW z(n@o0h}`(drVx0?x(9xjc0*p9-a%k`UF%41V}mtm(u`TQWREuYZ)iZ1De{ik z)XK1@s%j}7cPUUGkqVVmGQ}pW6aKDm*ROfhG;td_wUv=RLlS`7v+7jE^S{rw-e*Qux+i3W3 zhu#tC*jjmHs(lm!@Nj77(i8GWVUiY(_&q;P=T7$5y8gi$jE8bHAezV9jJYZN3VkG) z26?R@Bw0Lkm~}l;SFfo|21K9~E8Xx6LcR%vCQA}lqPhxJVj@IZq^hE#(pdoyQ3J&Y z)wrL{1(kaM1j6U9Eu25obs{@Y$HHn)Rqb347tXEnIO$zTPP2JV$aSc~v9#5}EhCjx zH8rEvUAR6saV{aJaIf!n1M&>CB3VXAw~&NebPmd5H9*UO$Vw zR9BO(F)Fi#IP}0i)Z{4gb};SFl~m0jTOnjC08&*|8o30GB- zvI~VF2HoiM?FVJh z7;yRzfWeLqZA)XYG0OzX z9L)@@&{vRgLE_WdNrrh`BZ?s*d!YN8)zCsXLaV5e#icKcyZd~MY?A>Qs|SJ%EDg@# zHb#)4C7mk`Xkt`@d6FwBl?%-aQS9(bt`=zGbOyV>K&2ZM!6Q_W!*7y7#Xca-?=6%d zR1(Qz^ec_7$`AmV@8#Sm}Ik@XBmKK=FI}QzuBS7)Eh9a^ny^y!60e6 zx6J2&BGwv(wxiLFGQwf|s6Y7hM8dXdiNEByZeXvQcPcpQiB<)tcp?h^s8&<(pehp| z{ZzZcd(GM|FycP-Rox929vOM-ZY@#R@zfvJ`XdR9TO{l7*8-9VIkOLacx{^#PNU6{ zG3oq=UtY7}QmFXyb=+uXS4&6}pCjf3ns^DTJ(@U}-Mx$L94!Ljo?5?Qpqc&sdunNT=u zQ<4#G-|&Y)iKA@V=x3YRmD|=`Hpn&7rX5~KJg=~}{Ol5FGX1n=Y3z(IotjSi(hnhP z8f%WSb7Y3yb<>7)s%`u0q~xL8KlMQ@ufm~C_m4>#!p4^W!rn|a$uDjg;U3IJKd`Pb zi^}UREp-fnSeUrHgVRs7x6aD~OZ(|6jyeqo>rPMR43bFJj17uh+f{u;8YG>TcioqH zT)JcS{^?-7?%PQq)QIq%~S8 z`}^BJ$x1QBM9x_i1yQC_uk@r<=FE@Gt*ui0a@E4L`MKXij+yWBd&lMfklLJvu>avG zi7V9Y6TbSo2Q~^3-~RDE*QQ;Qn-a;G`kKkcOiW8l$^F4GGCw@l?ElvrF^^%xvfwPB zWCgrpg1IB$9gRvs?CO^t*(|9VVH0t=QDLGrCRixB)EQ}0`h=R1rr5t)xKc-@1DK2+ zq_WaeTRWO0+L5Zdu{QVo$by$PLZ&}$Ypa_F16DoPfXXu}5-VZfJn#ZlPMC}eZlQZ> z#@LY6dy*83VvH69Mi15qt`(lm)C@qH!%(JI7&J3d2S+Gsj&k@r1J#QtV+@aA!YgKQ zeYwpEUuLpg4#j-c)j@?-qn{E^?8O%$$GKlF>DpSNGJASe2-{^;=Bta!cm}LrKCS2v z3jy=03Mwl4+afPg(2FjqCn5+`4J;n=f4xd2J=IX=H3oc_UR4W?HGi&0G(J^xA+S8~ zt$kEO1%Y!dk$&xMzKyVAVt!_zr~p~8BU`u*cc4L6p3oipt|M@z;q?6`!JGCNjzE$G|E829SH{i!AQ0?!g@LUkk>v_ zwoUVdk5m$E8M{a`jF&0CRs##mrTYUUVQGZnGK?WMXEeoF3SXB^b|?e|4a*0|Wp5_< zN-M0D!_R0!9^_LV3^JNVb3h>h^bN?^k@i!EWFrifA$%7%6CH%eqG4BIxEeWX&)#Gw zi441)u|!RvxUXO%GEVx<;sV^?g$_ouh2-Pun-FUi#oU zGnysmWr)zH-3u;!VQN(iMKwkJ%Ty&Ipy$m_o(wsY7$WcD`ryhwZH;Yf_a?(%y!cHp77 z{@R?82nUB<^I1E>(BNNaeArQX;kzQZ4bMM_&pPwWmo>zidi~Fb!`K|ZusPk(-#xe7 z7EYN`xl_a1^y6zCLv7)-iI0Ct^oYo&Ke_FLZQ-P`H*dqJIrTl4&7AteE+Y15 zn|__cSD!TTKEIZ4Xxsi!$X8!}a|1HX$e!7KQHVv#u3wGSbR^Q&cXvU`XJI=?y*g{w%gB!h|X2_u^FAXgJ1S46bwCAN;0 z%NNRun5!zusw)euLBu3k^7FWBJ;}M|vh1lQJx{WcT+N?95Gk1~=L1=#^SK_G6rZ@k z8i`W83Z1)tp5dUfES3Y2hr`GRPlQd%hgt)N3A3kS;?yw@nX!L zh4UmSw`7@DQ2Mv9f|hb0fnge1!6w5Du17{n>zUg1i%8{?3e~?P9iLNyoM}mf`?8B6 zfmlM#?22+pR90qH@YU3DyG#;VU6m(`o!ss*4FpCjyMhXYnJm$aN^-?mQTr>YYuJz* zCL(eTNy<~1fOJ)a(A0B?bQOzkDmW_kSC<$S2ioklcJ-@QRB?>KqM7ztHl|y^Kaj;T z(8zQPk`$F{G$DFaSz-suwnUn$gQ7{%{ti}(R;e(6t5jtrjFLN`DD;tyPM8_j94wXH z#TRTsa@E|_f(RkZmLoAjO83CwB-0)#PIrL8KOJMk;fj5h##a z%|rnUlCO3>nR@}GdrIy`CAKUP^&x3wDyZ#AwFab7cvfmOH~I@n89wp?Y&|r9sfWa| z7h=gkpe?#p6$;iE^ijs(o>QLh&92-)L;#oVrs+>%Y6JJG~O1yrp9 zAIl_?RT|BdGf)`Q9Yil#u-MVgRPbcC!1Whk0@qFBXBrdX{!Szu~^CINFfoJ zGUbS*N#1CilgFp{#wby4iVrC}N8*YEILyPuV8BfI10wFV2bmH|-fPf_ey4AL?#)vT zACnCYyFUt;Z2@z(MY7M{s+S^^@>d>^#55_s!l(DA&D(xk3b8c!*0uro%s+Ji>9O}m z2C};zXJ_6`dVG+fz4Z&xsf~M3CwuWRWJd=mt_7Yp0-I?Ha=N|b{D|=L1 z%|Xcwg>&GO4PcQizwQf_lXJ$Whz7OVquARb?!hkxK(^gh2I5GWxgMcmNBxW>JM;O7 z7u(p_cKvlCyPnqjjxQ+EKAqJkfkV6PCoSfX@o?Mf6Y}k>ID>B43#K=}cxVb(%JEAH z2Bhu1e}5Mnq@cnZj_}Thp_h5LNDh)$E>O zy>Z2fd9s@(Pg@?6dj($pWf8^p0e|{jHM^!W-xC|^hyTr+on0w9#?5?5a zWf%5#v!#aZ!)7*W66UCN{f$EtOA!(u@IrtNMpe4;p~J!LxyQZ6!Nr=k`FVC{XU-Mx zw&A$s<-v~rcYcZjk_I})KjeFxb>_JWg_dUZMWCFDpy zt3JpW4dJ$FXT27dGhsrG;u(JnbCT0A2EBCJ;vinJu(CZg%ZqfI*gp*19_>; z!~Z6MGBlEv~3OG><|E4&WFCxIWbee3X*&_a62zQ|PENGQrV+&tITs5|IXTXl1 zNGvlI;et;zy%0TJ^9>^b8VaEUpFrn5F#R_g-B3HQ>dF}al1At`w@Eo9g7^?&=xwms zv8!B|EViQ`rYxCjTj9l#W!ThRG5RBgsGt#Q2}Ize!k6@)S{6PlQ5pLJy(6_K)LAX?h?5 za@d6gr5SU;4#>D*b0FYCwBQoUM64&9m2-`u2waFJr_iH5q$mnFMFQdAwe7ewA**Q& zK$ZDuj7T+HKx{PqP11N;90+3Rs6Lz@niXi74I&1;^TF{w{R zB0eEzonRAIVR$hlW|mAo=h<~FsYat7^1X4#asA!)Xq84)#qJ((!d=V#AwAt_(j!gV zKb(K(v;)cx5j(S{rg{7KpEBc*3s&uDis;!!s~+-y{?^^zcKq?`-1A zUQnLxd$%_swKy`$Pr1GJgDw7cZK%<%wfnzZS$)fiZd-H8&=YU3 zTkmZPMRYg{yWScJweJ07(apyXN=dRcITF(f1|N3OeRb;^+K>q~X>GedUU2vMKOU5y zmS9h{dF`%@KEn?>@#0&bSn&3`t={I22%e+|?c*7;9AGP0*!W1kWm68D2a+MPB z%oX|2K(K0n)Ha#{$MGuup~stTvVO|*^-hSRm1dq5D|%prXH&jq~4{1RMo(; zg9ycw1N9)#f#pw={vD-be?R)C$F>9$s3et{W!Tk9Pmm*^qkx2m(aF`b8 z4iVi~ATE(KVjqzPEi%RTH8mpeU06l72z_7+YLJr%Qe6!XjMSq5feVcknZHQ>p+Ydw zttY2IL^mSw$J;^>Ppz=hOBaw9O+dt`t{{odV4mc2SL8~bc?3qXR2l&QM9uT8I; z=Kz63sYg7xsD_&fCbA-ZQI(i#**$WNNTBEm57On8uX`Y`Fv6O7^V&TQ}z{HCLDyXW&Rs!tHuRNx&O&k^+Jg$gbZQ*=U;)4?L)YR3L zB1sb~wd(pZn~3YQs+#%%Hj$}mRWGd^XcHM)#M9RD#z0#R10v>ZgU}ht{e~)tI%60K zt#aYQa+E{jlY-b;u2-pKHMr6|bVG8l3PgO!m{o=9x^bj5PhH&vn}fDt;@Fwis~1g1 zEa~v<&rsLa&$Lgq;lkV!P(r0P+&T~gAsPuX;ZPf>w2x_sF_RK2skDfou&s*bN=nH% z28vV%Q2?8vB%4Vh3@YPxi2TJFKm_)9ATULd4nb1*kbHqI$@HWpO8gXH3bJ8K zS`-zsO&21d5vat z+lh>-k@;pQT?VO$(Jtf)HgPC9!XikDN}ZUW;)_9nk6J?4h&agz@TNwGLzVD;2(??K zOjQgpLk(0yqBId}f2_`=f5c8rkP>djJ(-_m1bDWwenDjoB970)58* zYHnM$(H!yJar&`GA3k+lS+*0yu++m|YR@*>T2}lh+wD$pDrrpFRXfq5g!SDI^mi~F z6OOMFwaL1ZvRQG5-nARVThlL5Bt|J0E)Rize6?F7M(zWv8W2&n%sUtA8!W5hF!5+}hXP7u;2P!4l+9k>GPb#yCA>Pb&G%JFVc_ifLKYcaOMjW4nl*BED+} z$pyJTeQdMJ(0xx&OzuNBx(1!&*&+t+{-sA{V>%ad5;&Py0cNPv#EHGer{NQz?=X5sBx^Tv5sPtE0E zR2N9gme=n*tiU-A@9cJHu=oFbSh|Dn$7m1jdiBPi^h?EFv)#Yy`Kyi?lr2iqNduu@~I-I z;mh{oSh#NXg+CsjFisnFWou#wzi-Adkw&C?^0DawZAjd$H9R;hku1ZP>y7MK_tw(H zm$W6fk4PMDb)av@`!9Nu=0qx=`WJ@Zey~X>{k4Lj;t5roi#-0*vd1ik8{_ zhypH;0*MRu3CwidEYxlxTP$i?-3ayWU_r3ykx)^GJrqsop>R(sz7OCve69457HVMy zZufa59ELC0yF(8JihXugf`HE(C`O>kni@^@_Zlka@4%p3QR>x$t;HR%f-V%oMc#fL zu6C`h*klWd!IShZ@8;GJZ#7r8(CEc57)-l1@gT^hU?Gml}*db zwo2xhdzK`=6n^>bPj>o}y@Q5Fh8_1*MbezGr|yHDJ|-KlaOl05;6&zBEZ*q$4gjBW zCpN9xoZ7WaIMB(rh&SP!nooR8x#3#*_#1LS7k=qu&QUz}O133!&g%_=YNIZB0c+Lj z&twV?kBm6`uW0M^Im?`C#ud%b&pMmQcEOCI>H3Vb``d~E=O92(`1JpW38q@doxHs^ z`PD67$Q+xlowLl(9Gk8$27sRX z7S^v@702Y325ok-YRx>~j*m{ki{zf6MbF zcuUDVZvk7ji-$y}osHL+nVj+TZiGDMq|wT6c`W}??Xg({nK{MFiwu1+mXP{S+eiiW zBXv@kRLf6#Qf41;=p((s#2R%K9iz2f2$9o1vLpp&FwjE0RlT`)Ak^^b%YXPu=2Sy( zesyMo&6t@m9S#Ee2V*Qh)Q`hU{E*%@7aL}g&FRG~49X_~lDd~I(Q7mo@=FCyCiWV{ zP)r4Mel z`Z;i4G^P1#FsoO?p!rwzQArr@J*P!euxJT5o(ngw`F5PDlETlwJ!qul!tML#V$`o2 zdtq9Am8Do(uHBBP!2jm4cpmGX&qb85<*6Sh4MA1%K|_`odxULE?>y_c%wv%%dtTX| z1Hp})dr#(WB+H(K>yc}aSX=vMgCxRh=PlUi8)T+xUfUf_&71$Bq>QzWdHTZj1EWc; z=EYA3sI+rlxaP&Rdwrz}OPCj4uwt9f*H>Zgd7&jAZAZ#d97Wq|<}F^aVe9UOhU~ot z8&Gt9Mtoc6%@Gya>@%zh?AxGpa8Ft@*!NLyR7jnr@6YLtw$bcMUk{@F!1_StbJ1ZC(7=wD9kJO|@V1HKlpQ;%Udjs>9N}D9rrg z&S5|#_C`?|O%|gVRe3!LI_5v#3F-8`>hR7)1|y?#G8r#P?9D(5lWTvb85H@q4{ROCpHw zB1?*jZSBtlyk6UY<&i=%mJjG-YkNR4Y@=62^2zyVG*t0@+bj^}Oe8lvMu$u?W&BE0|vQV$&FA68n zvZcN8laMSzP?x?Qagz1+Ae<^BE7jIM;(aX~)>e-rT8reQ*+L^;SihlS9Kl=!Pe*Q@ zpD&SK1j7*jI|v@6WyHI(|J8&^uQHh6BR4Y02iWxAAR9u*n(-=fNjz#UMsP$Jr3q`0 zVNSMb{gxovoMh96zvxf!PQWtn^p*ZZ?>M|Cj-Imv>8O5KDb^eVj>tH+{g~s=z5BHt zB0`PqTz!#UqQ2a?ZfEB1$R5Z{p9OEw+BrgytH?_+lw8`+DCpdswg|Vc-*vSHu^KDo4wcG z5Z<+Q{ffo?hHGcc7W1t+i*~?upM;1nQhw5tn1QudZ=$~*JGQ)toMRuu)~c;?9XXW` z9$sEZ*5MCga@Dq)oQleO4lU0o>(G0!ylPch6_s~RDbFQu${qN0MDdvl2CPGC&duHlz?ey7%16KEQQ}3x$%H7=W#3wPrQ<>se|M>Cc31lAgDCT`C zGnveXk3uyTDgVg>_z zh+ALUjyPbh4*=DFH=_YZK}bybTF!Mx4Bp^(GxAt}~99}V~FyWb=< zgXi6b5#GqI<(@f=?40WN_~H!O7HL@hVx?mat`c)1p2eT+9bkScN!~`^jy12>&9ALp z@Y0*>cA-1z@}*4I9^Qe0nA5A@jf^rf?d~mN+3wXozx~W2WRACgj=a>#XSsgnnT6mp z*JJPH6qa-Kb!X<2aqUM~!HX~};(zaoX}R3t@^}3uy{aNe|ZYMeXID>>Ny@2xz0TH5r;*>f6*Vy1HZd!Ct*Iz1xN%l_nu zwg1jXQ~$5M?*NbDy7phKDqXuPI-+A^t%T{t)=FT&7%(ou<+B5JcrJYqL zPH~A7mxMTZj^modalA9L4G9TEF9sv95KU->L{l#aY3t1Vf9KBK)$B^x&ig0tC0~F~ zb7t<`y)$#~J?EZt?(d$9_dW|)Um~XG!!4&@y*Cx5yix+0^(_-|L17rOK(GB@_`3!jk^bhOAI?S(oQ0;H31K`Pex51K1E6wFfRcFy)XFRI zHxX{$tMHfAWNFTZI+@dy-h4IQ_ewN!FMQJktrPS?Etz849cWgc&U1+ z*L<^8w_|@RaQp#K8pzHR16EBZN1WP8!!|o|CWD<$I3(??w!}_nNln4V1ER=Jk2HNMu) zBYZ6=l!^FSO481Wulbo^=VxDGHsNxXuQKQIe^g84gYP9K*h7-LsAOCEc6mqX*(Byy z?F{eB`r>(Not|z!=Pa%l*FN9gT%Fp@f{*s^v_q z3-KpS{El!OSh68N*o9I?Ouu3IklW~8djVA2+2AeRyZ6wk#uivC%GpxW_Q1B1BDZ9> z_k|*x2y__S{LM9+2HF!vm{{kx*oTT^;8xf(TpSIX>7X=R1bm~h%rQb#8#1AU9dcxf z^4{|Rm4%yYKXr@}!<#D`fxZAJ*IP114BB0vo^FDc9Bghnv)^SOF9tX4hkb{6JJ>dj zHJ=q+B?evF4p-Mfm-aW+)s*jWi}ozB*)F;^?J6xlR#9=hymZ$lBu*BM_Mj*^91>2} zCHz&KEhUIXNpZMmV)q7Z+*o&}rsiy26TT(-iDaquYf1!!n0=nWKTqiS z^PJJobAIvX32xozxrH7-&mHr59#O#O38Gv7c}T?P36akeF8O)myS@ljVkaw@HI~2| zOVAoiV2vdX7kFa{(Z&+G8cP}_#59)Bt+9k|jU~i4mSE2kn(abtV+r=j0vbyYB}v4| zx`dB}IU+(H;ZLR35+p%ut#wHX0{K_X4h4dp%|}0Z^orTHg_hqiZCDC5WtygKe+AMD zVwnEYm}pML?>vAEfRte8TM#Ee1!96U$dF7IgNZo6S)|yz5NZpzRNAzNXaPV9qFO>C zzy-EavGifxztWp%no8PNAu82~z>gTRQt>0y3zDc>&>BEjKw6?!a0Bv?2x=u+P^nS` zSrn*JKqXX40&d3F%2!5S0JiZP0&J*HF(gOeW=6c@7d5%lmZ5xe55bh=~q`_JrIR;Sx3tlZsC7)K9T>? z`8)ithh-*H>3$0SXz2w&xBut+<^BIIGogL=y8b16{PnJjXg%;{CLjNt-81&4XJSjj z-VZaX9o_+MJJM`;zV?VX#E0X=0-NqU3NF6c%kP@Hib9F4DjXN&)U9*lQgH+e%NI zX>4h~=<8^2Yp$(2yt~*5S(+rmqh8{WASvttN6F`B+e26m51e#k#qJFvJOT*QQ7B2t z7}LbUgLVEvSnkzUUgWTgCde8jZaUFU0pLUD4sCT{?a6*8@`mk26`cq{7_O@<>rcub zCArJm$6(RoSub$YMO31^y+IiV7C40<1SOJ`h&;}6{{-OQFw3G8p+ds;jc4R5RW*o- zm|c_u>QQqR3+JI-?YLmYm5Qvgedon&+6l|evhBE-g9sI>i*A&(O;WMjxXNx6G+s>? zPFyIC>d9&{>KZ>+K9}iSb<#7oc1}U?52&ul<2*l=&K+nq*VEpXgQ==4 z&CDKx#Cy-1RJDK-k7G~aql>M>a^&n6g6S%&M725@D95L=%sF9emNh#G_vUO*R}r@d z6>uK+w$I8=&+%tZTDsEHgI-P21f%VqJMQ(dQNBdob{DW^#@08!xyugiBfh38D(vuJ8KJ` zFK2DR7022_JZlRvtS#tRThOz%pkr-8&)R~XwVge)wxDNimyWdsJ!=a+vbLaOZ6U(i zo-WoFdSY!~#fD!$vwHOtKl@;JeHUvB#M%Mn+=ur}8fs2V512AW&;8L3Y`VcYTVR~s z@MivClO;7HU@@D<-nTuDv$x(n$lNa@WHC+nF*f$lINL>>?fd;zCR0X&MY;80gtG<4 z*_|&BH)mwXCfm*kXA6w81FsCT3_^PD0nXV1arR$ES%x5S*%{8+0&(`|)6K&&WXsb5 zJ!f}5WHM)j%_fs23HQbp>p8o4v?V>mZy7Xg>GfAxEQu)a?h6slb`od%?lYxlbXvx~ ze4?>#|1%TJMien>6X$Ff*j7F;5k+(iewjEs*x{H)Sxl?LoG~ej^13-4FEFc;I6Ekg zwPa+N=bVdXAlU6nJViF$*_Q0{`7f?UHCQq?>oc6c7DeFY+K9EcuoB+v#@cY8YNNJ{ zQQHVrQbtOWfRT(1+TjxTFEU_bDUl%?rU>*%Hew@ZUjZXFDVWeYWv2k207h&vI$}$( z8PZ_5%LS5{3U@)R)YFiSxF<=11%sA@@^l-q1-nrowid)>7&d}##Fp%W3Ccc8jvuo{ zBzGUPkrXp#Q<=Ik8&-{&h&)|mwpv8R==fShhOQx7U{_JT#vRVr{01Ac6&K6Z#n{Le zVQk#tW42lXwVe;yEPsTrDT_8_!%D_aBW%qsqHHZ_Beqh=k~O}j{Cvo!@9G+~QA!tQ zllPPj+11{6L;9cgfn%G@i!e*k~>9dvva?Uw$YrciC?nG@i!Su+jSCn{B52ggoVY$1<=& zj*4R}?SFegUPiv0dvB?QCu?K%JM;4f<;%8vj+#|?jOfFNr9Ic@4MFN7btbIPV5!8@ zC+@Tj%a`+B!)TpAZ$g8$|9P7^Kb&W?ldjtc#}^oL(DMyfslctwDweY-++FhB-fR^i z?s~6j%~7Ek4|v5tNrgU~zCLs{MY9{QK0H~4_S@^F&=k^p6Ic7Df-1K+O(SJ@^0Dbq za}|?g29#PkVNIB*GUx0}(rf#EGK`6vmA#j zt8vJ##bI_M4z?!!VOX(%}~5Kabmi^vS2-gMhh0`FnD)EkyhyXb(rw6UnL0FGu{!~TFF zMJ=JaB`FoQPMxD@cbWG*LPB@=F1EKeo~<~zy})5dPQ_7x26BopiTrlav+H<6Cpu;@ zeDPe_7H2YfOQ@k#7w!k`j%^jKVW`}JTKtk6DzIFfxD$d0ur@ecmA5*mNXgyHV1%U* zvO7Ml4`-_3%0tDlfZ&Kh2ttR54-VPIZRfBbR?u5jvDXE&EI~?!`vxNTsBes#=v59E z(F0&`ILMgVQjef7>S?1lTys7K;wIS83d`d+*j>}fqYgM>i zxf5@HFqEw-;j^h;f5m1@B-?lRCLywJsy9$|#3R}Zny;qJY2NUDNjflwh&?#9Un^E3xj9}7vR+v!M zd0VwqWUuOg1TI@*g%M@F`IsqE$|*nOY|BGgFr%`*)0Q4dt_i_O^xkCHQ84zb$vMiD zkD~X^gdtaJZnBzk0@hi#-Fwq?E9@xi^7GgkLVL5bGNkI;*(TUgD>m0Q*AzT338t3% zel){58B(=n1#BQ#No66UzcX0((o~p9S@*Q|M|76DO0T!FRzapcGx6cF^;b+bx2!{! z>{*}2WKsSbFCtHN1(SXLK*cgEY^}F+8Q|3lKLPtwp1dIljm!TMGGsl8eQ^KrvO$QG z4FY6?OOp*ACk<-dWP?!W>`68V$f=hNLY!=H#mNT28I=wArCv6`eXhv{Clwi$4TAGh zvO&O`S~q-WcBUmMJ!r|C^=(hAZ0K+< z&or6SGJm?=EEoAghP?d1hWO^S$;{paQN72%D``O z9I?W|J<$v+%xo=+6%Gexn8^;iwk%dSG~Z={C1$#(H7Wp@aCmbtOflGt=Hv`z$lK9- zOgL1{F`F_1=F#((&B-*w6f@_aiSj-Z4sTdYFvXS>oNGMgxNQ)uHT8GV3`{sQFNPV_ zVxDy%1Sd_(E|{u>_6SxJL-633#GSXm$wF~5I(Xrgezy7nW7h<#rU&-SOb8Tt)L0j&E?`_78pw_A6`3Wy_j*~qF}SrIEBTA#>;S!eqp zwvXis022@&&1HsNt}QuVnI}f?F#&OA1&qvqZP9-{vSNV^cAafiU6lWsfcP-a1iS8` z?RCv(Ha$KUrl0!PXa*)ATE9hBTi)GAf<}Kh*zm@D*mbr?+H}kf0r45xkFxEzet2vA ztuMl|%Ug6HCX4bOUPPX^k!cU!uiIezeW1%g+QYNCl%qJ9>I=Mq`?=3W>E;Cl7JYlmQOieSIlPdcl7CKWOD z%HCatNPbCIt=`;>xW00DVQ-iiY5BjaQAQx{pRhO$A|hqpUs@1fvF*c|i7+ONlivbZ zK|c4~P*@BZPgPHZ>bHGiB36JHZAD?LD%Y>+4u^E5duI1*wQ12$RIp*of zERU_2KMRv(hLm6pQmRT}cgYe@fI&k=$_{=Fqh}jlSSix-ljZXnWp_oc<*Fm>{k7{< zd|&~6VDz%G1eg8kS-4lVi{W`o*t1b|)jrgflV8!B5CR~2`8kcKU6+SrFUtYbLOn%u zm*X|muG~Fb8l=Ccy8>+*?XEzD#B^7t?|wmdC58CQx+}EWe|~qxdtAD^wzBT({F3ep z=W%RzrO7MlpVeL6@!b{b(cjr!$=m%!-Icw6w0~9<&<92@D@$h*xA#_2L!Upc*4x=~^#bNw18RuB6Syh*u=UidQ@&M!M23V#O=G++v)3r8kR} zufWRaO4{5ij)}P z3biy&xT0nB!jI5uvn0E=u z&n4vUx`c$K7SV}Rx{eXC`s@&~@t3^MUYP=opytna45ENDA^&GjjziSuL?|>T){esl zkl0{TIrjJ<0v&}z+mAn%I{_LF+jnTf7`D&LITUd=aPFFFpYR&RWF1JR;sT}LmXkHWN0dg zth|tvf(XM(99m&`%lt4&{pW5Wchn1*Od#>)Y(j?phm| z89K73tUKWghJr^|G6X|x5hc?G0w%Ha1<|$sRtA%Zzda}?!5Yq)WVHfgkrjV)%;mIc z|Jrr1nY~|Zuh`Q4o#jtwW{*Z={y^UWGSWG{+pMa~obiNfnZR=VeQp;KDAz+J?KTTsWqC2ZGGpS*Y zb`j>t_lrq{IkGO=2V{Z)s<6G-2Qk+6vnkmGQChqOZg=b+hQeLVKt5dj?HqWW;Tyke zA0Z#;O}y~Z1&i*;wvr2f=DHe4Cqp5AAlvt07nI=HUoXzi%4VMb=?`uKxD8WX(0pb4 zM(i3Bl&jueWt)_o6|_!U^21HA`U#mu3fXCZwk{l&e)Tkv9nZhD;2X;v`HMYJj-i zojEjzDB^~)r!$+*_hWuX+0$Xwq1p0UScYBX=nGp$ zdYDXXT)^CPVJ`A0hq4iXld$>g_2dflpUFiD=_?{4k7d{}%#slvyjGKmo>A}>#$_l# zh7QZn$By_yp!(LLXy;m1ZjUKN#!0+WiTUz~0+S=gLM=ItJMG`Un1NGdkVC*Qbv z!XQ(+$&{XM9ya34GPh!G9UHt*T{$vGyKvKVtrZ zLsuX<4=#eARK9*IlZ(yw)BPXQP#q~j*|h*pSlg3LOjkV53V4dTZ8XD<`Ih|fyf>I! z3~pTn7in(y3>|sby>QYO3~R1Td+Ht z2C?|AZ4|uscc0g#$)7LH8;OVf47wu2(J>fU=bGG+0A&HDjrE0O+>)xeZDHOBPN`>XQ^AZNQ1m{+KZR5()=JN~!?Qw%`3Jy@zqMS-b`p{@7l z*)U&|yXeI;OenG^Frirchdc9Zd6?$O%U!s7o2DwVyG&J7YCe2)+1%vZpl$wLKiS^S zB_h6=RK@nAo;QECcI~sTe6W*nDWocD<&s2{jUi1UDvbT3x*|T9i$s=J6NzxYa7|Hr zbVO4`HE04+^#Gw5RTPn|$wPqikgjQp@FhjmL{Tf6sflpL6RePnLz)V-YvK?d93iSE zVp5T*iE)swfBDO62!@tJfV7De$F@^e9~HtE9MVAkuxO2W)! z|DG^2LH87R5LRBqVx0&w2RRyVCJQL*{w5lmf;-@4u-@7jo27P<)tn^?jI~(Hewh`dj7~0mNUQxMKz!Bedj)Pne%4KwQ(ER=7c|cQr?o&k>OB zO*luC?6;!R-)sWiyVwdpi1nt^(PWx)SAUx1q^TjL?Auew7h;|A=wb5I5_nR*08dEUCwEU~o{;RU$#?#(O+ztYLbRU1lZ}q= zESO?V&I(PQ_lUhAf__kHf&g9my@l)7eSh`$*RA(d_%zTZrcK+}$QD#(0!7yWugRdB zic*V7%~PGz;qg6>Dai(!0G9zERjPdq>B>-!s0st$` z>nf!#0@u1~0Ad616dzjZA_T0vh7hoFEfNkypm26~wQ@zAByL>_qe`~CN|HDv425fC z=>=U6gCwrI7EXt-X?Y`)#G6N2GR(I6*evI!QWi_*p9tp=`r8oTpk|)#mc^VAGSAo= z)I{+kaI%=Edb?$^WVD)R{JAL@3bnsI26kXic``D5=FB_Z5Z-@ij0Jv_p0W(YVj~l* zOA|R#dddI``*LzrW}unThW|Nr65l)P$de*>>({MI;7pNCi{m&Vcwah_)9;7Wh}IxP z@h_M+=9L&xEQ4R*XR(YdiAr52j2jl1$o;agF`CST@hj$$8H(k#sMKY`_{4NG{4eG? zr=rPB82>6WLm9L_Ds`DKuDh9mDQ|C#CNp8YGl!s;=4tz5h4EjmhO9goBaB-=T!fW>aKKnhgBQHt8Y7GY z^&j0kX^1J^XbPm823uGBxh_^7`zjnSKYssx_doWMaJ2IuE00^hR2~aLoIDmTDUTWc zSSOF&kjDbVZ&V(;33cqz$zyi}n(XN=kJ}$6#8}>Y0n&_%t^;7~;SOCl1EV&rB!kcP zSTmEyd#*>8dz)jk)ZdY3&X*TBnPyx-h1^}+LynN`u6JN&f=NHrRr=GIFMPtjGn{OlkO;7h>*k4YL$`Uj(TJS%n zPP%o@MsncDwtJgmyW@q2Sn@-0mSSivTsv~^x;Vx7kIV^#3Bzc$LPYOf2rtm}Sm8lp z4Ol%Ui(4MB!RKRp5b$rF%w+L9@B}G&A4G*Nlf|d*w886RTX{B`%w+LXv9Slf|XW8OrsJ!(Fl%3u-njVP2mbH^qwLu(*^VXqUO-_2S|?a^ZT- zy{m+FjmF17VXkI+@sX#lBgc>Jx;4jQMDYdZH|OPQZl8G%I4;D9;$ZWJrGJN!3AFV&PU_3KrDCVtRlQUcMVabpCr*4q@@SU{P_%(lSi9 z>yf1gF})o{sRFY~)9s#U&(a{R+BGc1EjqYsMInQ`M!;GML&`d}%M_qt56~1kzlOoN zoq)E*(c32oNULyYA^~*|;=Q`CkT4(#najateggX*bz=pkRKn0@7pn*!9VxYw>cR8El>@3@^N})TGI(Iaw|&ML+H>X0xO5lQvPy6FaS-5 zgbP(jI7#qc!rKAv96kpV^;7yL$xR6=1DJl!@RrULhM7K%pB$yP0BAggaMel!#NCNa zgpqcqQo;oSURP|@fY%XZcEvWjR^gCL0c!djVYRmsczai`NZsPix+5s{TzdKLe^zb8 zad<2k_wVFzh63*5a2-OpqLAH-^g_Vx(Y3#T!wH+L=Wx3ILJmiU7!F6krb}@+*cBX( zAAA{y);ob43`aXU6?tfNoP_&!qC>#%6E|X%R z%Lg%&7&C@r9yDeQk6yDeT#u=yQCtVXrcoT3qr-I70S1wXiU5q_LJW`N*K%Zq0UO5g zYFH-~DFCCm5ukBx0ZwEXM?%an&T;3_QCx`Qar!z9#U2^O37V}N#c>roiZe{SeiTOz z-6&4qB*u>7ND%ZqjztA(>>y4*i5bL^0DQl06h}=+v7SfU*9n#nK12bw=ih?8!0ISc;7QBmEiB^ z7p4IWFZ;fmkVfG6@GpDyGV})U66=_Dv}PfW3oWC??82rx%r5jLI451XPXw<}RRzIB z5I2e43F+Wj_&E-q51`k0(N>2Gl0bE;sG##-_5Tt}+ zibz|lI)|$vrS;ejx0xa!Qe+Zo(~)L`7YZmHm0J;R5+S2J4hnn{bZtLYPZ3T0O0czh z|3(Qq=s*M~p?kHCqCMrO>RZ}7{lTEGqpj)ei33|aSl66{sHq`UM5K~bExL-kplDOc z=HiVT0D487$srV2g+j5UASNZWV1$%b-4v&VRwz14G7Ui|!q!RBK+>rt729%oTuy|v z1SiXlmK6{uGsPG(7=+u=lLzkow>IGyEaj~?q&h^bHPkQiH^Lbv)9;_FlB zsXhf=ePUIQR-b~tKC!Dpq&|h9JFY%4;`90xYMrb;TjT1JLi6eBlOj@hBK3)whY0T1 zRi6k1_|K|OlnXS6)oCwB-)4>>b&@&Ye7LU;=LTM`g{D>2PAn3ejilRe+ z!WG*y<$iCJOd4 z>fMT+m^}?+)MP@*amWWLMXP>~U{$XyISJg(WL@((HB{w2x!(i9=KuzVg4&{&R0gqR z+Ituw>qLU1lN^(FHOP=-J6%|stU3XDp%}5)X|l9M$y8HlJ*PVwNohlAQ+PNM$q`^c zFd-6ph^Ft_U42o8L=HD4lD+E05^RVV3fd$U?yG7ECG^%K+xZLv9-SX$lhY7op!?!U0CMrK|F~xl5|)Gy|H+6$)+MmBuF~a zw2Oxu!X+&3REoV9!b+%43eBrx1B0MSQ7EJgNVD;%(;`T~B%CLRK4ho=Qc0E}u)jb; z*mi*aLy{A+a9t91HjLCi77$13UvOWd{)NA@{)HauUx?Jd8*6R5>R<4bwsxz3p~w0c zLheh|zd-fh+ExFa`1%)4i=H0p-vxOQTmM2k0&(#AN3b3vvvhRzFZ`qH-$@ZLBqrNp zxK(^543M5OT48WFzf&|%m`YPfpgH7Bl7gLStX3^&xw#sa^)6Hv7`)yza>tK~*u>TWmz=t$WD zK<2L9KLx813$KRonka=QK_z-^2npbywPqu{;EGgKQ}WkJp>D|+-kJ!}Fy?hcY6u55 z-INMBkbJ!dLDj;69ji=W_WpNm@^hLLS!?-GN z&#m*W9@#IEI2>^i8E!61W9@4@~WideGFc+cPQwr<4R`JcZne%$r86uC!I+1uju zfA+TMV=;9Lo)lv%7gHaizIMT%WSr`%mpX4(^@3Zvsuwj1KI7GkIwdWEUYM4EBgl}1 z`lam#pt3+a!Zm6b&!Y;a4Fz-+43P2%=H6IPs|dsT7yx?~M)aj+xAI>`^n8}5x7+c~6=qt+XDZreEO%O@h~-fe*F|9HhWP+^2t}G zCZR!_Ha;@Whz6b2ml_oRF0n;G>a&PvpG_I?ug`U>?tA2$kAL@x@7zz9U$#2{?JCd< ze_B+1gJG=he1z`2x9)tj?!1rgysz%OpYEKZ`lsP9@-G!9^gJqm0zU^ajHh!I|3E29 zf8;!a&hdw}#JYdRK5M$JqE(Q{(u{pJX>{;UImMb|{4);z1E(Kx>SmN3qGcdoI*4%(3oNnTDFQ?_4R&(0KX+WcvWKK<-W^#HJr!zR6 z$LTUo@8a|UP9Nj+8BSm1^f#Qo%jqYa7IM0i(?gtAa$3h}hek6JIPJ&jP);XsI)zgk zr;9ngozqpEKFaADPJhbjYn=Xp(~mfHbGnt&&p18K=~+(OIF&UzuotHTIUU1k4ySWC zUC8OJoUY{bAx@v*^f^vn;q-T$e#oiB=_XG1a$3%5HK$FS1~fV-nNt&|nVeq5=?qTi zak`AtyEuJ-)5kb{hSL{0{SBw@a{39Ug`Do>^bn_&oYryLq0zw!oc7~%D5n!Rox-V& z)5V8b2CrR1?@%W{|^~IbTt3~ literal 0 HcmV?d00001 From 0b07fdd3805f6c7f2bdb6a4331f7651e6175dc74 Mon Sep 17 00:00:00 2001 From: ajnart Date: Wed, 8 Feb 2023 22:11:38 +0900 Subject: [PATCH 03/40] =?UTF-8?q?=F0=9F=8C=90=20Add=20Norwegian=20and=20Sl?= =?UTF-8?q?ovak?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- next-i18next.config.js | 2 ++ src/tools/language.ts | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/next-i18next.config.js b/next-i18next.config.js index 32d339fe9..3ce413d58 100644 --- a/next-i18next.config.js +++ b/next-i18next.config.js @@ -25,6 +25,8 @@ module.exports = { 'uk', 'zh', 'el', + 'sk', + 'nb', ], localePath: path.resolve('./public/locales'), fallbackLng: 'en', diff --git a/src/tools/language.ts b/src/tools/language.ts index f0d0e9471..fb2335cfe 100644 --- a/src/tools/language.ts +++ b/src/tools/language.ts @@ -75,6 +75,20 @@ export const languages: Language[] = [ translatedName: 'LOLCAT', emoji: '🐱', }, + // Norwegian + { + shortName: 'nb', + originalName: 'Norsk', + translatedName: 'Norwegian', + emoji: '🇳🇴', + }, + // Slovak + { + shortName: 'sk', + originalName: 'Slovenčina', + translatedName: 'Slovak', + emoji: '🇸🇰', + }, { shortName: 'nl', originalName: 'Nederlands', From ba3f841ba3f5e6aa8904d74b49cea783fbcdb1b0 Mon Sep 17 00:00:00 2001 From: ajnart Date: Wed, 8 Feb 2023 22:15:44 +0900 Subject: [PATCH 04/40] Fix typos --- next-i18next.config.js | 2 +- src/tools/language.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/next-i18next.config.js b/next-i18next.config.js index 3ce413d58..7785243d3 100644 --- a/next-i18next.config.js +++ b/next-i18next.config.js @@ -26,7 +26,7 @@ module.exports = { 'zh', 'el', 'sk', - 'nb', + 'no', ], localePath: path.resolve('./public/locales'), fallbackLng: 'en', diff --git a/src/tools/language.ts b/src/tools/language.ts index fb2335cfe..8974e62a4 100644 --- a/src/tools/language.ts +++ b/src/tools/language.ts @@ -77,7 +77,7 @@ export const languages: Language[] = [ }, // Norwegian { - shortName: 'nb', + shortName: 'no', originalName: 'Norsk', translatedName: 'Norwegian', emoji: '🇳🇴', From fab018a10e5001053c65f4fcb084c0debe4632c2 Mon Sep 17 00:00:00 2001 From: Yossi Hillali Date: Wed, 8 Feb 2023 23:23:53 +0200 Subject: [PATCH 05/40] =?UTF-8?q?=E2=9C=A8=20Add=20video-stream=20widget?= =?UTF-8?q?=20(#685)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- next-i18next.config.js | 1 + package.json | 4 +- public/locales/en/modules/video-stream.json | 24 ++ src/pages/_app.tsx | 1 + src/tools/server/translation-namespaces.ts | 1 + src/widgets/index.ts | 2 + src/widgets/video/VideoFeed.tsx | 68 ++++ src/widgets/video/VideoStreamTile.tsx | 68 ++++ yarn.lock | 334 +++++++++++++++++--- 9 files changed, 452 insertions(+), 51 deletions(-) create mode 100644 public/locales/en/modules/video-stream.json create mode 100644 src/widgets/video/VideoFeed.tsx create mode 100644 src/widgets/video/VideoStreamTile.tsx diff --git a/next-i18next.config.js b/next-i18next.config.js index 32d339fe9..99a975092 100644 --- a/next-i18next.config.js +++ b/next-i18next.config.js @@ -30,6 +30,7 @@ module.exports = { fallbackLng: 'en', localeDetection: true, returnEmptyString: false, + debug: process.env.NODE_ENV === 'development', }, reloadOnPrerender: process.env.NODE_ENV === 'development', }; diff --git a/package.json b/package.json index 6a5469457..309c79323 100644 --- a/package.json +++ b/package.json @@ -81,6 +81,7 @@ "@types/ping": "^0.4.1", "@types/react": "17.0.1", "@types/uuid": "^8.3.4", + "@types/video.js": "^7.3.51", "@typescript-eslint/eslint-plugin": "^5.30.7", "@typescript-eslint/parser": "^5.30.7", "babel-loader": "^9.1.2", @@ -99,7 +100,8 @@ "jest": "^28.1.3", "prettier": "^2.7.1", "sass": "^1.56.1", - "typescript": "^4.7.4" + "typescript": "^4.7.4", + "video.js": "^8.0.3" }, "resolutions": { "@types/react": "17.0.2", diff --git a/public/locales/en/modules/video-stream.json b/public/locales/en/modules/video-stream.json new file mode 100644 index 000000000..3b84c3574 --- /dev/null +++ b/public/locales/en/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Video Stream", + "description": "Embed a video stream or video from a camera or a website", + "settings": { + "title": "Settings for video stream widget", + "cameraFeedUrl": { + "label": "Camera feed url" + }, + "autoPlay": { + "label": "Auto play" + }, + "muted": { + "label": "Muted audio" + }, + "controls": { + "label": "Video player controls" + } + } + }, + "errors": { + "invalidStream": "Invalid stream" + } +} \ No newline at end of file diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index b20595f4f..4b10110a6 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -26,6 +26,7 @@ import { ServerSidePackageAttributesType, } from '../tools/server/getPackageVersion'; import { usePackageAttributesStore } from '../tools/client/zustands/usePackageAttributesStore'; +import 'video.js/dist/video-js.css'; import '../styles/global.scss'; import '@uiw/react-textarea-code-editor/dist.css'; diff --git a/src/tools/server/translation-namespaces.ts b/src/tools/server/translation-namespaces.ts index dab3acea9..daa866df2 100644 --- a/src/tools/server/translation-namespaces.ts +++ b/src/tools/server/translation-namespaces.ts @@ -33,6 +33,7 @@ export const dashboardNamespaces = [ 'modules/dashdot', 'modules/overseerr', 'modules/common-media-cards', + 'modules/video-stream', ]; export const loginNamespaces = ['authentication/login']; diff --git a/src/widgets/index.ts b/src/widgets/index.ts index e38a2ba53..aac770ead 100644 --- a/src/widgets/index.ts +++ b/src/widgets/index.ts @@ -5,6 +5,7 @@ import usenet from './useNet/UseNetTile'; import weather from './weather/WeatherTile'; import torrent from './torrent/TorrentTile'; import torrentNetworkTraffic from './download-speed/TorrentNetworkTrafficTile'; +import videoStream from './video/VideoStreamTile'; export default { calendar, @@ -14,4 +15,5 @@ export default { 'torrents-status': torrent, dlspeed: torrentNetworkTraffic, date, + 'video-stream': videoStream, }; diff --git a/src/widgets/video/VideoFeed.tsx b/src/widgets/video/VideoFeed.tsx new file mode 100644 index 000000000..604426c70 --- /dev/null +++ b/src/widgets/video/VideoFeed.tsx @@ -0,0 +1,68 @@ +import { LoadingOverlay } from '@mantine/core'; +import { createStyles } from '@mantine/styles'; +import { useEffect, useRef, useState } from 'react'; +import videojs from 'video.js'; +import 'video.js/dist/video-js.css'; + +interface VideoFeedProps { + source: string; + muted: boolean; + autoPlay: boolean; + controls: boolean; +} + +const VideoFeed = ({ source, controls, autoPlay, muted }: VideoFeedProps) => { + const videoRef = useRef(null); + const [player, setPlayer] = useState>(); + + const { classes, cx } = useStyles(); + + useEffect(() => { + // make sure Video.js player is only initialized once + if (player) { + return; + } + + const videoElement = videoRef.current; + if (!videoElement) { + return; + } + + setPlayer(videojs(videoElement, { autoplay: autoPlay, muted, controls }, () => {})); + }, [videoRef]); + + useEffect( + () => () => { + if (!player) { + return; + } + + if (player.isDisposed()) { + return; + } + + player.dispose(); + }, + [player] + ); + + return ( + <> + + {/* eslint-disable-next-line jsx-a11y/media-has-caption */} + + + ); +}; + +const useStyles = createStyles(({ radius }) => ({ + video: { + height: '100%', + borderRadius: radius.md, + overflow: 'hidden', + }, +})); + +export default VideoFeed; diff --git a/src/widgets/video/VideoStreamTile.tsx b/src/widgets/video/VideoStreamTile.tsx new file mode 100644 index 000000000..873af47c8 --- /dev/null +++ b/src/widgets/video/VideoStreamTile.tsx @@ -0,0 +1,68 @@ +import { Center, Group, Stack, Title } from '@mantine/core'; +import { IconDeviceCctv, IconHeartBroken } from '@tabler/icons'; +import { useTranslation } from 'react-i18next'; +import { defineWidget } from '../helper'; +import { IWidget } from '../widgets'; +import VideoFeed from './VideoFeed'; + +const definition = defineWidget({ + id: 'video-stream', + icon: IconDeviceCctv, + options: { + cameraFeedUrl: { + type: 'text', + defaultValue: '', + }, + autoPlay: { + type: 'switch', + defaultValue: true, + }, + muted: { + type: 'switch', + defaultValue: true, + }, + controls: { + type: 'switch', + defaultValue: false, + }, + }, + gridstack: { + minWidth: 3, + minHeight: 2, + maxWidth: 12, + maxHeight: 12, + }, + component: VideoStreamWidget, +}); + +export type VideoStreamWidget = IWidget<(typeof definition)['id'], typeof definition>; + +interface VideoStreamWidgetProps { + widget: VideoStreamWidget; +} + +function VideoStreamWidget({ widget }: VideoStreamWidgetProps) { + const { t } = useTranslation('modules/video-stream'); + if (!widget.properties.cameraFeedUrl) { + return ( +

+ + + {t('errors.invalidStream')} + +
+ ); + } + return ( + + + + ); +} + +export default definition; diff --git a/yarn.lock b/yarn.lock index bcd5cf7e8..66dc9f29c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -371,7 +371,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.14.5, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.19.0, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": +"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.14.5, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.19.0, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": version: 7.20.13 resolution: "@babel/runtime@npm:7.20.13" dependencies: @@ -2268,6 +2268,13 @@ __metadata: languageName: node linkType: hard +"@types/video.js@npm:^7.3.51": + version: 7.3.51 + resolution: "@types/video.js@npm:7.3.51" + checksum: 95b8e75da82b401965bd2b31648f7917495b9f2eda3773e1c50f027ed1f457760731912c71cf2c4e8c4b3087b29844bdcc92577bb56ae5c49b771039f7da819e + languageName: node + linkType: hard + "@types/yargs-parser@npm:*": version: 21.0.0 resolution: "@types/yargs-parser@npm:21.0.0" @@ -2420,6 +2427,64 @@ __metadata: languageName: node linkType: hard +"@videojs/http-streaming@npm:3.0.0": + version: 3.0.0 + resolution: "@videojs/http-streaming@npm:3.0.0" + dependencies: + "@babel/runtime": ^7.12.5 + "@videojs/vhs-utils": 4.0.0 + aes-decrypter: 4.0.1 + global: ^4.4.0 + m3u8-parser: ^6.0.0 + mpd-parser: ^1.0.1 + mux.js: 6.2.0 + video.js: ^7 || ^8 + peerDependencies: + video.js: ^7 || ^8 + checksum: e479cd981a067e9b28c9c90f41936b5587939060690f4eabdbbe5ca54adb509515e03270297a03b545087d76dfd1ab7b9461e5e1ef62a8e0ed57d80fa52bbe2c + languageName: node + linkType: hard + +"@videojs/vhs-utils@npm:4.0.0, @videojs/vhs-utils@npm:^4.0.0": + version: 4.0.0 + resolution: "@videojs/vhs-utils@npm:4.0.0" + dependencies: + "@babel/runtime": ^7.12.5 + global: ^4.4.0 + url-toolkit: ^2.2.1 + checksum: a824900d0173478c80ee9683f67cc041e204d79ac280ae369adb03357d51d8a51b296bd6aff96b2cce66633a63f05a10d11d53da6ec063ee7c4d6e38dabd826e + languageName: node + linkType: hard + +"@videojs/vhs-utils@npm:^3.0.5": + version: 3.0.5 + resolution: "@videojs/vhs-utils@npm:3.0.5" + dependencies: + "@babel/runtime": ^7.12.5 + global: ^4.4.0 + url-toolkit: ^2.2.1 + checksum: 637dc9a8848027eab4213d6e85439d216577d0cb0346767c15bbb07a5a730aa30545f0b5d7bfd636f40212e490f34bf103e331f0bc180b4d3c245e77f30b437f + languageName: node + linkType: hard + +"@videojs/xhr@npm:2.6.0": + version: 2.6.0 + resolution: "@videojs/xhr@npm:2.6.0" + dependencies: + "@babel/runtime": ^7.5.5 + global: ~4.4.0 + is-function: ^1.0.1 + checksum: 217d3d49f8088461959840f93f0b45d713e6d03254d89352e2eb4bfca9501eee03bac25d0ad878e976c9cbec902039210a86906ef57a5f8d86bfdfa1a3999def + languageName: node + linkType: hard + +"@xmldom/xmldom@npm:^0.8.3": + version: 0.8.6 + resolution: "@xmldom/xmldom@npm:0.8.6" + checksum: f17ac6d99a971a6aeb831fcfc5cfa86f367664e45815046548814b2deb17ccc421fef4e0d5ba29e66179d112b552f6caa5680064f8e7bd8a389b788a60404c8e + languageName: node + linkType: hard + "abbrev@npm:^1.0.0": version: 1.1.1 resolution: "abbrev@npm:1.1.1" @@ -2452,6 +2517,18 @@ __metadata: languageName: node linkType: hard +"aes-decrypter@npm:4.0.1, aes-decrypter@npm:^4.0.1": + version: 4.0.1 + resolution: "aes-decrypter@npm:4.0.1" + dependencies: + "@babel/runtime": ^7.12.5 + "@videojs/vhs-utils": ^3.0.5 + global: ^4.4.0 + pkcs7: ^1.0.4 + checksum: c09f47e928d88af2387690e47e60001be74095c10007fe44ef57663db17ee8e391310c6f0b023bc63257afe442900cc916f55fba7dd27ec1c394d616b062d664 + languageName: node + linkType: hard + "agent-base@npm:6, agent-base@npm:^6.0.2": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -3327,14 +3404,14 @@ __metadata: languageName: node linkType: hard -"color-name@npm:1.1.3": +"color-name@npm:1.1.3, color-name@npm:^1.0.0": version: 1.1.3 resolution: "color-name@npm:1.1.3" checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d languageName: node linkType: hard -"color-name@npm:^1.0.0, color-name@npm:~1.1.4": +"color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 @@ -3573,14 +3650,7 @@ __metadata: languageName: node linkType: hard -"d3-format@npm:1 - 2": - version: 2.0.0 - resolution: "d3-format@npm:2.0.0" - checksum: c4d3c8f9941d097d514d3986f54f21434e08e5876dc08d1d65226447e8e167600d5b9210235bb03fd45327225f04f32d6e365f08f76d2f4b8bff81594851aaf7 - languageName: node - linkType: hard - -"d3-format@npm:^1.4.4": +"d3-format@npm:1 - 2, d3-format@npm:^1.4.4": version: 1.4.5 resolution: "d3-format@npm:1.4.5" checksum: 1b8b2c0bca182173bccd290a43e8b635a83fc8cfe52ec878c7bdabb997d47daac11f2b175cebbe73f807f782ad655f542bdfe18180ca5eb3498a3a82da1e06ab @@ -3644,7 +3714,14 @@ __metadata: languageName: node linkType: hard -"d3-time@npm:1 - 2, d3-time@npm:^2.1.1": +"d3-time@npm:1 - 2, d3-time@npm:^1.0.11": + version: 1.1.0 + resolution: "d3-time@npm:1.1.0" + checksum: 33fcfff94ff093dde2048c190ecca8b39fe0ec8b3c61e9fc39c5f6072ce5b86dd2b91823f086366995422bbbac7f74fd9abdb7efe4f292a73b1c6197c699cc78 + languageName: node + linkType: hard + +"d3-time@npm:^2.1.1": version: 2.1.1 resolution: "d3-time@npm:2.1.1" dependencies: @@ -3653,13 +3730,6 @@ __metadata: languageName: node linkType: hard -"d3-time@npm:^1.0.11": - version: 1.1.0 - resolution: "d3-time@npm:1.1.0" - checksum: 33fcfff94ff093dde2048c190ecca8b39fe0ec8b3c61e9fc39c5f6072ce5b86dd2b91823f086366995422bbbac7f74fd9abdb7efe4f292a73b1c6197c699cc78 - languageName: node - linkType: hard - "damerau-levenshtein@npm:^1.0.8": version: 1.0.8 resolution: "damerau-levenshtein@npm:1.0.8" @@ -3894,6 +3964,13 @@ __metadata: languageName: node linkType: hard +"dom-walk@npm:^0.1.0": + version: 0.1.2 + resolution: "dom-walk@npm:0.1.2" + checksum: 19eb0ce9c6de39d5e231530685248545d9cd2bd97b2cb3486e0bfc0f2a393a9addddfd5557463a932b52fdfcf68ad2a619020cd2c74a5fe46fbecaa8e80872f3 + languageName: node + linkType: hard + "domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0": version: 2.3.0 resolution: "domelementtype@npm:2.3.0" @@ -4983,7 +5060,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:7.1.7": +"glob@npm:7.1.7, glob@npm:^7.1.3, glob@npm:^7.1.4": version: 7.1.7 resolution: "glob@npm:7.1.7" dependencies: @@ -4997,20 +5074,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.1.3, glob@npm:^7.1.4": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.1.1 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 - languageName: node - linkType: hard - "glob@npm:^8.0.1": version: 8.1.0 resolution: "glob@npm:8.1.0" @@ -5024,6 +5087,16 @@ __metadata: languageName: node linkType: hard +"global@npm:4.4.0, global@npm:^4.3.1, global@npm:^4.4.0, global@npm:~4.4.0": + version: 4.4.0 + resolution: "global@npm:4.4.0" + dependencies: + min-document: ^2.19.0 + process: ^0.11.10 + checksum: 9c057557c8f5a5bcfbeb9378ba4fe2255d04679452be504608dd5f13b54edf79f7be1db1031ea06a4ec6edd3b9f5f17d2d172fb47e6c69dae57fd84b7e72b77f + languageName: node + linkType: hard + "globals@npm:^11.1.0": version: 11.12.0 resolution: "globals@npm:11.12.0" @@ -5374,6 +5447,7 @@ __metadata: "@types/ping": ^0.4.1 "@types/react": 17.0.1 "@types/uuid": ^8.3.4 + "@types/video.js": ^7.3.51 "@typescript-eslint/eslint-plugin": ^5.30.7 "@typescript-eslint/parser": ^5.30.7 "@uiw/react-textarea-code-editor": v1.4.4 @@ -5418,6 +5492,7 @@ __metadata: systeminformation: ^5.12.1 typescript: ^4.7.4 uuid: ^8.3.2 + video.js: ^8.0.3 yarn: ^1.22.19 zustand: ^4.1.4 languageName: unknown @@ -5661,6 +5736,13 @@ __metadata: languageName: node linkType: hard +"individual@npm:^2.0.0": + version: 2.0.0 + resolution: "individual@npm:2.0.0" + checksum: 34f071ade77365e2cdb9e034e7dc92930450ce427415b9ef975a2c2a455b40aa9e071ae7888972f3d2ec7d977a32cf1af46e0b8d602d70d05da5b9bbc9e23392 + languageName: node + linkType: hard + "infer-owner@npm:^1.0.4": version: 1.0.4 resolution: "infer-owner@npm:1.0.4" @@ -5857,6 +5939,13 @@ __metadata: languageName: node linkType: hard +"is-function@npm:^1.0.1": + version: 1.0.2 + resolution: "is-function@npm:1.0.2" + checksum: 7d564562e07b4b51359547d3ccc10fb93bb392fd1b8177ae2601ee4982a0ece86d952323fc172a9000743a3971f09689495ab78a1d49a9b14fc97a7e28521dc0 + languageName: node + linkType: hard + "is-generator-fn@npm:^2.0.0": version: 2.1.0 resolution: "is-generator-fn@npm:2.1.0" @@ -6665,6 +6754,13 @@ __metadata: languageName: node linkType: hard +"keycode@npm:2.2.0": + version: 2.2.0 + resolution: "keycode@npm:2.2.0" + checksum: cb91c2940a892f1444a41fc08339b8831445a6b095af9103e3061ea7d4bdbfc420135dcb5d9257020e35c374468bb7d4495ea9fcea54e5760196daff3c874fa4 + languageName: node + linkType: hard + "keyv@npm:^4.0.0, keyv@npm:^4.5.2": version: 4.5.2 resolution: "keyv@npm:4.5.2" @@ -6821,6 +6917,17 @@ __metadata: languageName: node linkType: hard +"m3u8-parser@npm:^6.0.0": + version: 6.0.0 + resolution: "m3u8-parser@npm:6.0.0" + dependencies: + "@babel/runtime": ^7.12.5 + "@videojs/vhs-utils": ^3.0.5 + global: ^4.4.0 + checksum: b305dede0595688b32ddfbafe2fc53c650eb89be4f2ceabf717596c3bf5b33e62d3c9b83264846e47f5afb2e863dc6890a2b574d09071083c6f696daa8488ec9 + languageName: node + linkType: hard + "make-dir@npm:^3.0.0, make-dir@npm:^3.0.2, make-dir@npm:^3.1.0": version: 3.1.0 resolution: "make-dir@npm:3.1.0" @@ -6931,7 +7038,16 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"min-document@npm:^2.19.0": + version: 2.19.0 + resolution: "min-document@npm:2.19.0" + dependencies: + dom-walk: ^0.1.0 + checksum: da6437562ea2228041542a2384528e74e22d1daa1a4ec439c165abf0b9d8a63e17e3b8a6dc6e0c731845e85301198730426932a0e813d23f932ca668340c9623 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -7049,6 +7165,20 @@ __metadata: languageName: node linkType: hard +"mpd-parser@npm:^1.0.1": + version: 1.0.1 + resolution: "mpd-parser@npm:1.0.1" + dependencies: + "@babel/runtime": ^7.12.5 + "@videojs/vhs-utils": ^3.0.5 + "@xmldom/xmldom": ^0.8.3 + global: ^4.4.0 + bin: + mpd-to-m3u8-json: bin/parse.js + checksum: a82c4ba7335d193aa248f4e39d4ad58359c5ff055a50fd574980b2a29318fbaccda9741f2106fe933a46ff5d092a6a78a542912bd3f1046e70b8ae63f80482ee + languageName: node + linkType: hard + "mrmime@npm:^1.0.0": version: 1.0.1 resolution: "mrmime@npm:1.0.1" @@ -7056,14 +7186,14 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.2": +"ms@npm:2.1.2, ms@npm:^2.1.1": version: 2.1.2 resolution: "ms@npm:2.1.2" checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f languageName: node linkType: hard -"ms@npm:^2.0.0, ms@npm:^2.1.1": +"ms@npm:^2.0.0": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -7080,6 +7210,18 @@ __metadata: languageName: node linkType: hard +"mux.js@npm:6.2.0, mux.js@npm:^6.2.0": + version: 6.2.0 + resolution: "mux.js@npm:6.2.0" + dependencies: + "@babel/runtime": ^7.11.2 + global: ^4.4.0 + bin: + muxjs-transmux: bin/transmux.js + checksum: ecf54ead3480351967cbf6e54b57e38406b0ac5bc6dc194ae59e77e80ae6e6f6ab6fa42c15f0b0938cd0cce866fb7249c571be41d6cf78ee4531ecdfe65cfef9 + languageName: node + linkType: hard + "nan@npm:^2.15.0, nan@npm:^2.16.0": version: 2.17.0 resolution: "nan@npm:2.17.0" @@ -7675,6 +7817,17 @@ __metadata: languageName: node linkType: hard +"pkcs7@npm:^1.0.4": + version: 1.0.4 + resolution: "pkcs7@npm:1.0.4" + dependencies: + "@babel/runtime": ^7.5.5 + bin: + pkcs7: bin/cli.js + checksum: 926a713263c7656883d1fcc9fa709e08c26babc76d535dd76ccdf5ad1bc1c5931ecbbe2d7ae6075ad54897e1184be4ec304d295e28953c2ec0f1a04c27f4e838 + languageName: node + linkType: hard + "pkg-dir@npm:^4.1.0, pkg-dir@npm:^4.2.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" @@ -7780,6 +7933,13 @@ __metadata: languageName: node linkType: hard +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: bfcce49814f7d172a6e6a14d5fa3ac92cc3d0c3b9feb1279774708a719e19acd673995226351a082a9ae99978254e320ccda4240ddc474ba31a76c79491ca7c3 + languageName: node + linkType: hard + "promise-inflight@npm:^1.0.1": version: 1.0.1 resolution: "promise-inflight@npm:1.0.1" @@ -8295,6 +8455,15 @@ __metadata: languageName: node linkType: hard +"rust-result@npm:^1.0.0": + version: 1.0.0 + resolution: "rust-result@npm:1.0.0" + dependencies: + individual: ^2.0.0 + checksum: ccad2bdf79d3ff29e9f163db3121342b31e6d3008714851900c59da20489175f389dc3309cb92bfa5fa4d8f8842f0287567021912d37afbe5d379880af4bb95b + languageName: node + linkType: hard + "sabnzbd-api@npm:^1.5.0": version: 1.5.0 resolution: "sabnzbd-api@npm:1.5.0" @@ -8319,6 +8488,15 @@ __metadata: languageName: node linkType: hard +"safe-json-parse@npm:4.0.0": + version: 4.0.0 + resolution: "safe-json-parse@npm:4.0.0" + dependencies: + rust-result: ^1.0.0 + checksum: dab69dee6cfeeb5735447e4bb79da06054ff46954f9ef7504ade0ae8afe4984d44afb16adbd24adf89a83088fac8cdb07cf4ec0abc94422a1f54a4484cdb5c1a + languageName: node + linkType: hard + "safe-regex-test@npm:^1.0.0": version: 1.0.0 resolution: "safe-regex-test@npm:1.0.0" @@ -8902,19 +9080,7 @@ __metadata: languageName: node linkType: hard -"tar-fs@npm:^2.0.0, tar-fs@npm:^2.1.1": - version: 2.1.1 - resolution: "tar-fs@npm:2.1.1" - dependencies: - chownr: ^1.1.1 - mkdirp-classic: ^0.5.2 - pump: ^3.0.0 - tar-stream: ^2.1.4 - checksum: f5b9a70059f5b2969e65f037b4e4da2daf0fa762d3d232ffd96e819e3f94665dbbbe62f76f084f1acb4dbdcce16c6e4dac08d12ffc6d24b8d76720f4d9cf032d - languageName: node - linkType: hard - -"tar-fs@npm:~2.0.1": +"tar-fs@npm:^2.0.0, tar-fs@npm:~2.0.1": version: 2.0.1 resolution: "tar-fs@npm:2.0.1" dependencies: @@ -8926,6 +9092,18 @@ __metadata: languageName: node linkType: hard +"tar-fs@npm:^2.1.1": + version: 2.1.1 + resolution: "tar-fs@npm:2.1.1" + dependencies: + chownr: ^1.1.1 + mkdirp-classic: ^0.5.2 + pump: ^3.0.0 + tar-stream: ^2.1.4 + checksum: f5b9a70059f5b2969e65f037b4e4da2daf0fa762d3d232ffd96e819e3f94665dbbbe62f76f084f1acb4dbdcce16c6e4dac08d12ffc6d24b8d76720f4d9cf032d + languageName: node + linkType: hard + "tar-stream@npm:^2.0.0, tar-stream@npm:^2.1.4": version: 2.2.0 resolution: "tar-stream@npm:2.2.0" @@ -9334,6 +9512,13 @@ __metadata: languageName: node linkType: hard +"url-toolkit@npm:^2.2.1": + version: 2.2.5 + resolution: "url-toolkit@npm:2.2.5" + checksum: c784040bd4dbd78647a62218b6b8c1abd9a2f7fd8adce1851daf21dc2d98e2a5d69b78a628ec07dcfa112c16a112a182e109b7c872b6e8a1e4a1547b49b81f7b + languageName: node + linkType: hard + "use-composed-ref@npm:^1.3.0": version: 1.3.0 resolution: "use-composed-ref@npm:1.3.0" @@ -9437,6 +9622,55 @@ __metadata: languageName: node linkType: hard +"video.js@npm:^7 || ^8, video.js@npm:^8.0.3": + version: 8.0.3 + resolution: "video.js@npm:8.0.3" + dependencies: + "@babel/runtime": ^7.12.5 + "@videojs/http-streaming": 3.0.0 + "@videojs/vhs-utils": ^4.0.0 + "@videojs/xhr": 2.6.0 + aes-decrypter: ^4.0.1 + global: 4.4.0 + keycode: 2.2.0 + m3u8-parser: ^6.0.0 + mpd-parser: ^1.0.1 + mux.js: ^6.2.0 + safe-json-parse: 4.0.0 + videojs-contrib-quality-levels: 3.0.0 + videojs-font: 3.2.0 + videojs-vtt.js: 0.15.4 + checksum: 3bb4b334192116c8bcbe254a67fee1655cb829155845afaf274efe5bf8019f9a32081156f697b68b322af91853f0b843ffbbed572cefb307d5f47ea61c6c78b4 + languageName: node + linkType: hard + +"videojs-contrib-quality-levels@npm:3.0.0": + version: 3.0.0 + resolution: "videojs-contrib-quality-levels@npm:3.0.0" + dependencies: + global: ^4.4.0 + peerDependencies: + video.js: ^6 || ^7 || ^8 + checksum: 06635a74f4c88d7adb7c8e55687b76306432ea5921c4a03cfb9845adc0eef671c9e043706911e761366a41e6a4046cafaa619c645f25858764500e5596ce9b41 + languageName: node + linkType: hard + +"videojs-font@npm:3.2.0": + version: 3.2.0 + resolution: "videojs-font@npm:3.2.0" + checksum: 3c773d4a64123c237c26029a5d04c51919e3b6e688db0a20c6f9c647198ec815425d96a62dd24989046f27aa583c96cecae715f789f8d98452b4df419c23158a + languageName: node + linkType: hard + +"videojs-vtt.js@npm:0.15.4": + version: 0.15.4 + resolution: "videojs-vtt.js@npm:0.15.4" + dependencies: + global: ^4.3.1 + checksum: 10c6c861621d4314e7d4b60b7bef1afc60f1ac438879f6b3f22e8944d694c8e9dfc809a8187ed72f44e06c39a159044d8fa15e80695b9bf7b9bef99ea2740b70 + languageName: node + linkType: hard + "void-elements@npm:3.1.0": version: 3.1.0 resolution: "void-elements@npm:3.1.0" From 84db1aeaf7f652775cc9a9beee8b2d0f43c6a95c Mon Sep 17 00:00:00 2001 From: ajnart Date: Fri, 10 Feb 2023 12:44:31 +0900 Subject: [PATCH 06/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Change=20code=20edit?= =?UTF-8?q?or?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Customization/Theme/CustomCssChanger.tsx | 49 +++++++------------ src/pages/_app.tsx | 1 - src/widgets/video/VideoFeed.tsx | 3 +- src/widgets/video/VideoStreamTile.tsx | 2 +- 4 files changed, 20 insertions(+), 35 deletions(-) diff --git a/src/components/Settings/Customization/Theme/CustomCssChanger.tsx b/src/components/Settings/Customization/Theme/CustomCssChanger.tsx index 97155a688..d829570d1 100644 --- a/src/components/Settings/Customization/Theme/CustomCssChanger.tsx +++ b/src/components/Settings/Customization/Theme/CustomCssChanger.tsx @@ -1,24 +1,13 @@ -import { - Box, - createStyles, - Group, - Loader, - ScrollArea, - Stack, - Text, - useMantineTheme, -} from '@mantine/core'; +import { Box, createStyles, Group, Loader, Stack, Text, useMantineTheme } from '@mantine/core'; import { useDebouncedValue } from '@mantine/hooks'; import { useTranslation } from 'next-i18next'; -import dynamic from 'next/dynamic'; -import { ChangeEvent, useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; +import Editor from 'react-simple-code-editor'; +import { highlight, languages } from 'prismjs'; import { useConfigContext } from '../../../../config/provider'; import { useConfigStore } from '../../../../config/store'; - -const CodeEditor = dynamic( - () => import('@uiw/react-textarea-code-editor').then((mod) => mod.default), - { ssr: false } -); +import 'prismjs/components/prism-css'; +import 'prismjs/themes/prism.css'; export const CustomCssChanger = () => { const { t } = useTranslation('settings/customization/page-appearance'); @@ -53,22 +42,20 @@ export const CustomCssChanger = () => { {t('customCSS.label')} - {t('customCSS.description')} + {t('customCSS.description')}
- - ) => - setNonDebouncedCustomCSS(event.target.value.trim()) - } - language="css" - data-color-mode={colorScheme} - minHeight={codeEditorHeight} - /> - + setNonDebouncedCustomCSS(code)} + highlight={(code) => highlight(code, languages.extend('css', {}), 'css')} + padding={10} + style={{ + fontFamily: '"Fira code", "Fira Mono", monospace', + fontSize: 12, + minHeight: codeEditorHeight, + }} + /> {codeIsDirty && ( diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 4b10110a6..81107b5f4 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -29,7 +29,6 @@ import { usePackageAttributesStore } from '../tools/client/zustands/usePackageAt import 'video.js/dist/video-js.css'; import '../styles/global.scss'; -import '@uiw/react-textarea-code-editor/dist.css'; function App( this: any, diff --git a/src/widgets/video/VideoFeed.tsx b/src/widgets/video/VideoFeed.tsx index 604426c70..ab4e4744b 100644 --- a/src/widgets/video/VideoFeed.tsx +++ b/src/widgets/video/VideoFeed.tsx @@ -1,5 +1,4 @@ -import { LoadingOverlay } from '@mantine/core'; -import { createStyles } from '@mantine/styles'; +import { createStyles, LoadingOverlay } from '@mantine/core'; import { useEffect, useRef, useState } from 'react'; import videojs from 'video.js'; import 'video.js/dist/video-js.css'; diff --git a/src/widgets/video/VideoStreamTile.tsx b/src/widgets/video/VideoStreamTile.tsx index 873af47c8..028809f99 100644 --- a/src/widgets/video/VideoStreamTile.tsx +++ b/src/widgets/video/VideoStreamTile.tsx @@ -1,6 +1,6 @@ import { Center, Group, Stack, Title } from '@mantine/core'; import { IconDeviceCctv, IconHeartBroken } from '@tabler/icons'; -import { useTranslation } from 'react-i18next'; +import { useTranslation } from 'next-i18next'; import { defineWidget } from '../helper'; import { IWidget } from '../widgets'; import VideoFeed from './VideoFeed'; From 793ab4db7a32a6d277bd9f6d46639e601491fc1a Mon Sep 17 00:00:00 2001 From: ajnart Date: Fri, 10 Feb 2023 12:44:48 +0900 Subject: [PATCH 07/40] =?UTF-8?q?=E2=9E=95=20Remove=20unsed=20dependencies?= =?UTF-8?q?=20and=20add=20new=20css=20editor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- next.config.js | 21 +- package.json | 22 +- yarn.lock | 1413 ++++++------------------------------------------ 3 files changed, 178 insertions(+), 1278 deletions(-) diff --git a/next.config.js b/next.config.js index 0abbde49c..dde3ec977 100644 --- a/next.config.js +++ b/next.config.js @@ -1,19 +1,14 @@ const { i18n } = require('./next-i18next.config'); -const removeImports = require('next-remove-imports')(); - const withBundleAnalyzer = require('@next/bundle-analyzer')({ enabled: process.env.ANALYZE === 'true', }); -module.exports = withBundleAnalyzer( - removeImports({ - experimental: { esmExternals: true }, - images: { - domains: ['cdn.jsdelivr.net'], - }, - reactStrictMode: true, - output: 'standalone', - i18n, - }) -); +module.exports = withBundleAnalyzer({ + images: { + domains: ['cdn.jsdelivr.net'], + }, + reactStrictMode: true, + output: 'standalone', + i18n, +}); diff --git a/package.json b/package.json index 309c79323..f8d6cb459 100644 --- a/package.json +++ b/package.json @@ -27,9 +27,6 @@ "@ctrl/qbittorrent": "^4.1.0", "@ctrl/shared-torrent": "^4.1.1", "@ctrl/transmission": "^4.1.1", - "@dnd-kit/core": "^6.0.5", - "@dnd-kit/sortable": "^7.0.1", - "@dnd-kit/utilities": "^3.2.0", "@emotion/react": "^11.10.5", "@emotion/server": "^11.10.0", "@mantine/core": "^5.9.3", @@ -40,35 +37,28 @@ "@mantine/modals": "^5.9.3", "@mantine/next": "^5.9.3", "@mantine/notifications": "^5.9.3", - "@nivo/core": "^0.79.0", - "@nivo/line": "^0.79.1", + "@nivo/core": "^0.80.0", + "@nivo/line": "^0.80.0", "@tabler/icons": "^1.106.0", "@tanstack/react-query": "^4.2.1", "@tanstack/react-query-devtools": "^4.24.4", - "@uiw/react-textarea-code-editor": "v1.4.4", "axios": "^0.27.2", "consola": "^2.15.3", "cookies-next": "^2.1.1", "dayjs": "^1.11.7", "dockerode": "^3.3.2", - "embla-carousel-react": "^7.0.0", "fily-publish-gridstack": "^0.0.13", "framer-motion": "^6.5.1", "i18next": "^21.9.1", - "i18next-browser-languagedetector": "^6.1.5", - "i18next-http-backend": "^1.4.1", "js-file-download": "^0.4.12", "next": "^13.1.6", "next-i18next": "^11.3.0", - "next-remove-imports": "^1.0.8", "nzbget-api": "^0.0.3", - "ping": "^0.4.2", - "prism-react-renderer": "^1.3.5", + "prismjs": "^1.29.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-simple-code-editor": "^0.13.1", "sabnzbd-api": "^1.5.0", - "sharp": "^0.30.7", - "systeminformation": "^5.12.1", "uuid": "^8.3.2", "yarn": "^1.22.19", "zustand": "^4.1.4" @@ -78,14 +68,12 @@ "@next/eslint-plugin-next": "^12.1.4", "@types/dockerode": "^3.3.9", "@types/node": "17.0.1", - "@types/ping": "^0.4.1", + "@types/prismjs": "^1.26.0", "@types/react": "17.0.1", "@types/uuid": "^8.3.4", "@types/video.js": "^7.3.51", "@typescript-eslint/eslint-plugin": "^5.30.7", "@typescript-eslint/parser": "^5.30.7", - "babel-loader": "^9.1.2", - "babel-plugin-transform-remove-imports": "^1.7.0", "eslint": "^8.20.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-airbnb-typescript": "^17.0.0", diff --git a/yarn.lock b/yarn.lock index 66dc9f29c..b4382fc53 100644 --- a/yarn.lock +++ b/yarn.lock @@ -31,7 +31,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.14.3": +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3": version: 7.20.12 resolution: "@babel/core@npm:7.20.12" dependencies: @@ -362,16 +362,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:7.15.3": - version: 7.15.3 - resolution: "@babel/runtime@npm:7.15.3" - dependencies: - regenerator-runtime: ^0.13.4 - checksum: 2f0b8d2d4e36035ab1d84af0ec26aafa098536870f27c8e07de0a0e398f7a394fdea68a88165535ffb52ded6a68912bdc3450bdf91f229eb132e1c89470789f5 - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.14.5, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.19.0, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": +"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.14.5, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": version: 7.20.13 resolution: "@babel/runtime@npm:7.20.13" dependencies: @@ -516,55 +507,6 @@ __metadata: languageName: node linkType: hard -"@dnd-kit/accessibility@npm:^3.0.0": - version: 3.0.1 - resolution: "@dnd-kit/accessibility@npm:3.0.1" - dependencies: - tslib: ^2.0.0 - peerDependencies: - react: ">=16.8.0" - checksum: 0afc2c0fce9a1c107453620ca0da1778f182d340e74ffbc6e369ef0ac8943cafb929d3a6c0891d9b915aa23b2b92137ff4fad958f43118466586d8129a3359d5 - languageName: node - linkType: hard - -"@dnd-kit/core@npm:^6.0.5": - version: 6.0.7 - resolution: "@dnd-kit/core@npm:6.0.7" - dependencies: - "@dnd-kit/accessibility": ^3.0.0 - "@dnd-kit/utilities": ^3.2.1 - tslib: ^2.0.0 - peerDependencies: - react: ">=16.8.0" - react-dom: ">=16.8.0" - checksum: f7abe49519da5d60f69bd36ab632ecdedc0372653763065c00b1899f3ed2c1954b5f6ab0bed14790afe11da636b405f8839dc2cad805ef61a3885141f62f9cb1 - languageName: node - linkType: hard - -"@dnd-kit/sortable@npm:^7.0.1": - version: 7.0.2 - resolution: "@dnd-kit/sortable@npm:7.0.2" - dependencies: - "@dnd-kit/utilities": ^3.2.0 - tslib: ^2.0.0 - peerDependencies: - "@dnd-kit/core": ^6.0.7 - react: ">=16.8.0" - checksum: 4ce705aceb15766a0deefe25a9d95a87e9413c3fb9088ea3eb0962e57f844895000117fcec7c0944a0d4ae4e1e889cfa69e3d3778164d4d23115fb1edb218283 - languageName: node - linkType: hard - -"@dnd-kit/utilities@npm:^3.2.0, @dnd-kit/utilities@npm:^3.2.1": - version: 3.2.1 - resolution: "@dnd-kit/utilities@npm:3.2.1" - dependencies: - tslib: ^2.0.0 - peerDependencies: - react: ">=16.8.0" - checksum: 038fd5cc1328bf4c9dca17cd48046e5a687bbf9d904c7197f851aab869ab52d9dee2734b2e255256fd6158245acd00063a23deed962c7673c0fadfbf061f04ca - languageName: node - linkType: hard - "@emotion/babel-plugin@npm:^11.10.5": version: 11.10.5 resolution: "@emotion/babel-plugin@npm:11.10.5" @@ -1263,17 +1205,6 @@ __metadata: languageName: node linkType: hard -"@mapbox/rehype-prism@npm:0.7.0": - version: 0.7.0 - resolution: "@mapbox/rehype-prism@npm:0.7.0" - dependencies: - hast-util-to-string: ^1.0.4 - refractor: ^3.4.0 - unist-util-visit: ^2.0.3 - checksum: e016f23d4a748cbbb3fb66f885c687a77929b776e6060d46befcbeaeac2f67ed48e3eab2fa13920c54c1c7c8d8c007aefcb9594beaca887237b9e74d53340691 - languageName: node - linkType: hard - "@motionone/animation@npm:^10.12.0": version: 10.15.1 resolution: "@motionone/animation@npm:10.15.1" @@ -1455,58 +1386,58 @@ __metadata: languageName: node linkType: hard -"@nivo/annotations@npm:0.79.1": - version: 0.79.1 - resolution: "@nivo/annotations@npm:0.79.1" +"@nivo/annotations@npm:0.80.0": + version: 0.80.0 + resolution: "@nivo/annotations@npm:0.80.0" dependencies: - "@nivo/colors": 0.79.1 - "@react-spring/web": 9.3.1 + "@nivo/colors": 0.80.0 + "@react-spring/web": 9.4.5 lodash: ^4.17.21 peerDependencies: - "@nivo/core": 0.79.0 - react: ">= 16.14.0 < 18.0.0" - checksum: 36b94fc65d82af3657967f8ba0a30ff888f1780e0cd17f39b3b00d5bc042bf9a66d78671baafa139c0caf804ac3c6fd8c6da41a61a0cb3f8cb0952eddb55605b + "@nivo/core": 0.80.0 + react: ">= 16.14.0 < 19.0.0" + checksum: 6b2dcc3cc443a660b10feab378b816e84f8aff4390345f8316852d88dcd893af0c8de63aad6bb6296ae13c55e4cce4a57f3f3898f5fdac03bb756df24a81d3fd languageName: node linkType: hard -"@nivo/axes@npm:0.79.0": - version: 0.79.0 - resolution: "@nivo/axes@npm:0.79.0" +"@nivo/axes@npm:0.80.0": + version: 0.80.0 + resolution: "@nivo/axes@npm:0.80.0" dependencies: - "@nivo/scales": 0.79.0 - "@react-spring/web": 9.3.1 + "@nivo/scales": 0.80.0 + "@react-spring/web": 9.4.5 d3-format: ^1.4.4 d3-time-format: ^3.0.0 peerDependencies: - "@nivo/core": 0.79.0 + "@nivo/core": 0.80.0 prop-types: ">= 15.5.10 < 16.0.0" - react: ">= 16.14.0 < 18.0.0" - checksum: 8f83a1b5623289c5e901e99b708c8326d758fcc64a8687954c95930c6f584599b0c76f8c5b5579e7208348c096a6c12a73736b0d7cb7cb8140107f0f210749ca + react: ">= 16.14.0 < 19.0.0" + checksum: 59cea2b3f2dc547f3ebbe920b4c789ac8c5dd4b3e5ba3c323d84f63d052faf813655cca8bb861a035ee064a8d71931bb35e956fc581051c0e86c4a80a1e581df languageName: node linkType: hard -"@nivo/colors@npm:0.79.1": - version: 0.79.1 - resolution: "@nivo/colors@npm:0.79.1" +"@nivo/colors@npm:0.80.0": + version: 0.80.0 + resolution: "@nivo/colors@npm:0.80.0" dependencies: d3-color: ^2.0.0 d3-scale: ^3.2.3 d3-scale-chromatic: ^2.0.0 lodash: ^4.17.21 peerDependencies: - "@nivo/core": 0.79.0 + "@nivo/core": 0.80.0 prop-types: ">= 15.5.10 < 16.0.0" - react: ">= 16.14.0 < 18.0.0" - checksum: a6ed80b2d8e03ccc1b1a5d16d6bb06150067c01b259e7cf077638cf6bffb543ae2aadd6077add84aa62d6428d48259f52e816d63a34d2c7847cc7dc12317e271 + react: ">= 16.14.0 < 19.0.0" + checksum: 0dc2044c984d8180d2f0a13fba6b6cdda0a18eec6ef71e9e523794f7ba70ed896231840f22c93f7e30b8730fde26ec07fff8e3d08fef120e91c8a9d552aa1fca languageName: node linkType: hard -"@nivo/core@npm:^0.79.0": - version: 0.79.0 - resolution: "@nivo/core@npm:0.79.0" +"@nivo/core@npm:^0.80.0": + version: 0.80.0 + resolution: "@nivo/core@npm:0.80.0" dependencies: - "@nivo/recompose": 0.79.0 - "@react-spring/web": 9.3.1 + "@nivo/recompose": 0.80.0 + "@react-spring/web": 9.4.5 d3-color: ^2.0.0 d3-format: ^1.4.4 d3-interpolate: ^2.0.1 @@ -1516,89 +1447,89 @@ __metadata: d3-time-format: ^3.0.0 lodash: ^4.17.21 peerDependencies: - "@nivo/tooltip": 0.79.0 + "@nivo/tooltip": 0.80.0 prop-types: ">= 15.5.10 < 16.0.0" - react: ">= 16.14.0 < 18.0.0" - checksum: 371fa0fd897cf1722e7705e6f58154d5e8efad1f68df2b577c6b26c9261a9f4e02afd506a77bc9041bceec539911f9dad764a8dfdd792ba694785687cd6ad1bd + react: ">= 16.14.0 < 19.0.0" + checksum: 05fd9ccc9d9876affea17498a2007f5974641c7a2bb1c12c4d8f97bdae48519dd5882c65653074b6756d14eef47dbaeaf8b8243d3e5389efd3d1e180ecbfde75 languageName: node linkType: hard -"@nivo/legends@npm:0.79.1": - version: 0.79.1 - resolution: "@nivo/legends@npm:0.79.1" +"@nivo/legends@npm:0.80.0": + version: 0.80.0 + resolution: "@nivo/legends@npm:0.80.0" peerDependencies: - "@nivo/core": 0.79.0 + "@nivo/core": 0.80.0 prop-types: ">= 15.5.10 < 16.0.0" - react: ">= 16.14.0 < 18.0.0" - checksum: 1f4bb8da28352d81771d50ce6d5929c9fefe1de9f682cd537e4a718c39828aba3df0c8a50887467571d79a36e329e41b0699c1cd9e14fd6e98f0d5771e887b8b + react: ">= 16.14.0 < 19.0.0" + checksum: 659aba35105143ac7da663a51bc6a69f815e23efd278b8b1314bd48b9c853f4c3b7e9cf61de1439390eff3983b754eaea5dd3923fa2caad97b0fca6133a05ae9 languageName: node linkType: hard -"@nivo/line@npm:^0.79.1": - version: 0.79.1 - resolution: "@nivo/line@npm:0.79.1" +"@nivo/line@npm:^0.80.0": + version: 0.80.0 + resolution: "@nivo/line@npm:0.80.0" dependencies: - "@nivo/annotations": 0.79.1 - "@nivo/axes": 0.79.0 - "@nivo/colors": 0.79.1 - "@nivo/legends": 0.79.1 - "@nivo/scales": 0.79.0 - "@nivo/tooltip": 0.79.0 - "@nivo/voronoi": 0.79.0 - "@react-spring/web": 9.3.1 + "@nivo/annotations": 0.80.0 + "@nivo/axes": 0.80.0 + "@nivo/colors": 0.80.0 + "@nivo/legends": 0.80.0 + "@nivo/scales": 0.80.0 + "@nivo/tooltip": 0.80.0 + "@nivo/voronoi": 0.80.0 + "@react-spring/web": 9.4.5 d3-shape: ^1.3.5 peerDependencies: - "@nivo/core": 0.79.0 + "@nivo/core": 0.80.0 prop-types: ">= 15.5.10 < 16.0.0" - react: ">= 16.14.0 < 18.0.0" - checksum: 3341c70df08d275c57d47e8f7f2eb89c0b584e45971188289e0d5c5a38988650c0fc4e22b2ca51ae4f1ddc4083b718f038a12f2becad7185b79b2fc1cc72a100 + react: ">= 16.14.0 < 19.0.0" + checksum: e2d83971e5d530b4465e628f926d2b311a39ce0fa137b0c942532ca58959d78ced21166e83ce9644c91bf2a2929ac539fdd4307fc7ceda986050346b662de1a3 languageName: node linkType: hard -"@nivo/recompose@npm:0.79.0": - version: 0.79.0 - resolution: "@nivo/recompose@npm:0.79.0" +"@nivo/recompose@npm:0.80.0": + version: 0.80.0 + resolution: "@nivo/recompose@npm:0.80.0" dependencies: react-lifecycles-compat: ^3.0.4 peerDependencies: - react: ">= 16.14.0 < 18.0.0" - checksum: acc0dc5bde0b67cdf8e5970cbec7788fbc91e3567b7fbeb5f470e8e0b706aeb5acae885d9413d14d845fc11032611ad1011e3a9fc4055acbc55a2baecd9e16ff + react: ">= 16.14.0 < 19.0.0" + checksum: 5495eeba137f4d3a46d1ada99948c5b097ccf00c532f10a627bb0525c6fbab14d93c9297a25d90c0041f72432efbd4e9a2ef5d408063e2c4cf25d05f33b1fcc5 languageName: node linkType: hard -"@nivo/scales@npm:0.79.0": - version: 0.79.0 - resolution: "@nivo/scales@npm:0.79.0" +"@nivo/scales@npm:0.80.0": + version: 0.80.0 + resolution: "@nivo/scales@npm:0.80.0" dependencies: d3-scale: ^3.2.3 d3-time: ^1.0.11 d3-time-format: ^3.0.0 lodash: ^4.17.21 - checksum: 4b63b85f842fd21b90252cb1a848aa9772f6a035c2f1b3541d4df795b12db44ca4ac15f59b3cca19c45b5a27042508d32ba491142a517169a580b0d5f397d20b + checksum: 75bdc838ab593306268cda2c098430cb5ff1f20ab73dd5d61845fa013e30fd85020c910c9dd0a7641d90ee04f86031af71a250f5f5992fe74a23bcf4fb954f95 languageName: node linkType: hard -"@nivo/tooltip@npm:0.79.0": - version: 0.79.0 - resolution: "@nivo/tooltip@npm:0.79.0" +"@nivo/tooltip@npm:0.80.0": + version: 0.80.0 + resolution: "@nivo/tooltip@npm:0.80.0" dependencies: - "@react-spring/web": 9.3.1 + "@react-spring/web": 9.4.5 peerDependencies: - "@nivo/core": 0.79.0 - checksum: ae74abebd077f5e77d041d0845340f1ffcbd2461e55112b8ac81fbf68f58a6d475ae30dc314ca11b99a4b85bbeaa5aecbe39191cc6ce55beddf83f43d1edab8b + "@nivo/core": 0.80.0 + checksum: bc0eec5d0d05f653186b040105d7451c823d8ee0844b7767f3d827424346d6379966452055be168994132ca8610f1956798274701a1bb948d3e8d961f23a07b7 languageName: node linkType: hard -"@nivo/voronoi@npm:0.79.0": - version: 0.79.0 - resolution: "@nivo/voronoi@npm:0.79.0" +"@nivo/voronoi@npm:0.80.0": + version: 0.80.0 + resolution: "@nivo/voronoi@npm:0.80.0" dependencies: d3-delaunay: ^5.3.0 d3-scale: ^3.2.3 peerDependencies: - "@nivo/core": 0.79.0 - react: ">= 16.14.0 < 18.0.0" - checksum: d479051850a519c328ce8dd6fbbc5998575cb2fc16351e7e516593be5ad21de0f7effe18ad09a2d596abcd90c055a560a21e125b7c8b2a859a309e7737d028e1 + "@nivo/core": 0.80.0 + react: ">= 16.14.0 < 19.0.0" + checksum: 7b4f844611f64742c5ed14e94fa7a3f813d0b6cde04c40c3d597e0d4180977db8fe957ff4f4b1c5a131e4c43e20a01e684c8b934e0b9583d726b2b13986e9efb languageName: node linkType: hard @@ -1789,69 +1720,70 @@ __metadata: languageName: node linkType: hard -"@react-spring/animated@npm:~9.3.0": - version: 9.3.2 - resolution: "@react-spring/animated@npm:9.3.2" +"@react-spring/animated@npm:~9.4.5": + version: 9.4.5 + resolution: "@react-spring/animated@npm:9.4.5" dependencies: - "@react-spring/shared": ~9.3.0 - "@react-spring/types": ~9.3.0 + "@react-spring/shared": ~9.4.5 + "@react-spring/types": ~9.4.5 peerDependencies: - react: ^16.8.0 || ^17.0.0 - checksum: e42fd174403a692d20f9cdc2511f5f4b1eed6282b4160d1eb0d8421ccce0524f4eaee968712f4e5f9b907a9f941ae3dd037ad35f13eacef8860fcfb90243a4fc + react: ^16.8.0 || >=17.0.0 || >=18.0.0 + checksum: e85c0bd65bd76e1c8ca830b22e31956401e29593cbc1df7560f5b77bd7b31acded61e1732717803cdfd993f30c2559ffbd6fb5f0d48b1c749323bee3597d7834 languageName: node linkType: hard -"@react-spring/core@npm:~9.3.0": - version: 9.3.2 - resolution: "@react-spring/core@npm:9.3.2" +"@react-spring/core@npm:~9.4.5": + version: 9.4.5 + resolution: "@react-spring/core@npm:9.4.5" dependencies: - "@react-spring/animated": ~9.3.0 - "@react-spring/shared": ~9.3.0 - "@react-spring/types": ~9.3.0 + "@react-spring/animated": ~9.4.5 + "@react-spring/rafz": ~9.4.5 + "@react-spring/shared": ~9.4.5 + "@react-spring/types": ~9.4.5 peerDependencies: - react: ^16.8.0 || ^17.0.0 - checksum: 1504143b9446d32c3877c8224c3fee3b6d18c0218b04b6766de7164ed645932808066ef12af63b06123a3da168f6bbc0fdf325c337b17d7f13d8a09f4a37f608 + react: ^16.8.0 || >=17.0.0 || >=18.0.0 + checksum: e5aee7f68f15c9d5d6f230703d22cb34edb8aae3ba0d70c01847f7c78e47f9f8177f87c095aff5ed1b98c2a218238d5ec28f9bf451f3e13bfdad6e3170a60226 languageName: node linkType: hard -"@react-spring/rafz@npm:~9.3.0": - version: 9.3.2 - resolution: "@react-spring/rafz@npm:9.3.2" - checksum: 8213d4940f23f93057dc2e7dc1e4aeca22622bfcfc9b42ab60d783e82f7ffe067e9537e7a397cfcb5634ea7e46d8ea55d06ffe4bd67a99f09ce06dde5e13957a +"@react-spring/rafz@npm:~9.4.5": + version: 9.4.5 + resolution: "@react-spring/rafz@npm:9.4.5" + checksum: 0ac722881b107baf55338a0123bc889d88faca53f034eb6d26ebab3ae6e4dc1717654b09d0e6e5e9bf587c2ba182d6aae90ca22c833dc55024ee52d88f8579a2 languageName: node linkType: hard -"@react-spring/shared@npm:~9.3.0": - version: 9.3.2 - resolution: "@react-spring/shared@npm:9.3.2" +"@react-spring/shared@npm:~9.4.5": + version: 9.4.5 + resolution: "@react-spring/shared@npm:9.4.5" dependencies: - "@react-spring/rafz": ~9.3.0 - "@react-spring/types": ~9.3.0 + "@react-spring/rafz": ~9.4.5 + "@react-spring/types": ~9.4.5 peerDependencies: - react: ^16.8.0 || ^17.0.0 - checksum: b04dc19fc6a8d585f38af74149e94fbf12b2a9ae9af6254abb02f105a7f77ce6a1e987ff7aaf4bb013786cd0959e41fca45709c4d57094abfca7b12db507a243 + react: ^16.8.0 || >=17.0.0 || >=18.0.0 + checksum: 2f20e410c03166de19b2d668d6841d24778c37da3083d37fe70acfcf2cf0cb3bd4a5cf92d42f1590b9de5d0a6603dc75cf8c319c0089df4e713226364a204b51 languageName: node linkType: hard -"@react-spring/types@npm:~9.3.0": - version: 9.3.2 - resolution: "@react-spring/types@npm:9.3.2" - checksum: 29fb2be7cd44c3de534d6b0d914b1c51fdc6ea354098727e605218b0e733c3c0ab01f54670f1b8b9b1949d984e399ce3ec153640ae9c590aee9622f33900d16b +"@react-spring/types@npm:~9.4.5": + version: 9.4.5 + resolution: "@react-spring/types@npm:9.4.5" + checksum: f8fecb54015de23899cc595d949e3676835e612d4dda05af470cab9ee20dd98c86ebca1c4ba75d2a9f63a4acba4b75febf6bab71da0b2e9556e6ff684b22f139 languageName: node linkType: hard -"@react-spring/web@npm:9.3.1": - version: 9.3.1 - resolution: "@react-spring/web@npm:9.3.1" +"@react-spring/web@npm:9.4.5": + version: 9.4.5 + resolution: "@react-spring/web@npm:9.4.5" dependencies: - "@react-spring/animated": ~9.3.0 - "@react-spring/core": ~9.3.0 - "@react-spring/shared": ~9.3.0 - "@react-spring/types": ~9.3.0 + "@react-spring/animated": ~9.4.5 + "@react-spring/core": ~9.4.5 + "@react-spring/shared": ~9.4.5 + "@react-spring/types": ~9.4.5 peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - checksum: 223ce3f849df23a7c4f630ea1e5be91a12257e35e2c8c10b939568302176d3881c1037d50daca4238a6383ddaa477cdc4971163a9da181b790abe91cae4b8c50 + react: ^16.8.0 || >=17.0.0 || >=18.0.0 + react-dom: ^16.8.0 || >=17.0.0 || >=18.0.0 + checksum: 9d7eea4b8b0399c205743acade141679f3f729a64631f8480d44d14bb59781ea807977a4671cbe1d56e31389b69ef325ec975275446f08997f555f2981d220c8 languageName: node linkType: hard @@ -2082,15 +2014,6 @@ __metadata: languageName: node linkType: hard -"@types/hast@npm:^2.0.0": - version: 2.3.4 - resolution: "@types/hast@npm:2.3.4" - dependencies: - "@types/unist": "*" - checksum: fff47998f4c11e21a7454b58673f70478740ecdafd95aaf50b70a3daa7da9cdc57315545bf9c039613732c40b7b0e9e49d11d03fe9a4304721cdc3b29a88141e - languageName: node - linkType: hard - "@types/hoist-non-react-statics@npm:^3.3.1": version: 3.3.1 resolution: "@types/hoist-non-react-statics@npm:3.3.1" @@ -2133,7 +2056,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:^7.0.9": version: 7.0.11 resolution: "@types/json-schema@npm:7.0.11" checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d @@ -2184,20 +2107,6 @@ __metadata: languageName: node linkType: hard -"@types/parse5@npm:^6.0.0": - version: 6.0.3 - resolution: "@types/parse5@npm:6.0.3" - checksum: ddb59ee4144af5dfcc508a8dcf32f37879d11e12559561e65788756b95b33e6f03ea027d88e1f5408f9b7bfb656bf630ace31a2169edf44151daaf8dd58df1b7 - languageName: node - linkType: hard - -"@types/ping@npm:^0.4.1": - version: 0.4.1 - resolution: "@types/ping@npm:0.4.1" - checksum: 9b94837fe66df70558c5a42b0e0c8371b4950ab56b96c42c8df809ff2cf52477dd0a7e01d2e6b38af8bb6683b3dcb54587960b96b4b1f3d40fdb529aea348ad0 - languageName: node - linkType: hard - "@types/prettier@npm:^2.1.5": version: 2.7.2 resolution: "@types/prettier@npm:2.7.2" @@ -2205,6 +2114,13 @@ __metadata: languageName: node linkType: hard +"@types/prismjs@npm:^1.26.0": + version: 1.26.0 + resolution: "@types/prismjs@npm:1.26.0" + checksum: cd5e7a6214c1f4213ec512a5fcf6d8fe37a56b813fc57ac95b5ff5ee074742bfdbd2f2730d9fd985205bf4586728e09baa97023f739e5aa1c9735a7c1ecbd11a + languageName: node + linkType: hard + "@types/prop-types@npm:*": version: 15.7.5 resolution: "@types/prop-types@npm:15.7.5" @@ -2254,13 +2170,6 @@ __metadata: languageName: node linkType: hard -"@types/unist@npm:*, @types/unist@npm:^2.0.0": - version: 2.0.6 - resolution: "@types/unist@npm:2.0.6" - checksum: 25cb860ff10dde48b54622d58b23e66214211a61c84c0f15f88d38b61aa1b53d4d46e42b557924a93178c501c166aa37e28d7f6d994aba13d24685326272d5db - languageName: node - linkType: hard - "@types/uuid@npm:^8.3.4": version: 8.3.4 resolution: "@types/uuid@npm:8.3.4" @@ -2412,21 +2321,6 @@ __metadata: languageName: node linkType: hard -"@uiw/react-textarea-code-editor@npm:v1.4.4": - version: 1.4.4 - resolution: "@uiw/react-textarea-code-editor@npm:1.4.4" - dependencies: - "@babel/runtime": 7.15.3 - "@mapbox/rehype-prism": 0.7.0 - rehype: 12.0.0 - peerDependencies: - "@babel/runtime": ">=7.10.0" - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 180f81482664d2f61f3d5af7fe6ddd605e10b84c74f29b42dc315a9760b097ba76f2b955a48b379061eadc4e679dedd17d52603b97d440f774d0cc8146ba74f1 - languageName: node - linkType: hard - "@videojs/http-streaming@npm:3.0.0": version: 3.0.0 resolution: "@videojs/http-streaming@npm:3.0.0" @@ -2559,40 +2453,6 @@ __metadata: languageName: node linkType: hard -"ajv-formats@npm:^2.1.1": - version: 2.1.1 - resolution: "ajv-formats@npm:2.1.1" - dependencies: - ajv: ^8.0.0 - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - checksum: 4a287d937f1ebaad4683249a4c40c0fa3beed30d9ddc0adba04859026a622da0d317851316ea64b3680dc60f5c3c708105ddd5d5db8fe595d9d0207fd19f90b7 - languageName: node - linkType: hard - -"ajv-keywords@npm:^3.5.2": - version: 3.5.2 - resolution: "ajv-keywords@npm:3.5.2" - peerDependencies: - ajv: ^6.9.1 - checksum: 7dc5e5931677a680589050f79dcbe1fefbb8fea38a955af03724229139175b433c63c68f7ae5f86cf8f65d55eb7c25f75a046723e2e58296707617ca690feae9 - languageName: node - linkType: hard - -"ajv-keywords@npm:^5.0.0": - version: 5.1.0 - resolution: "ajv-keywords@npm:5.1.0" - dependencies: - fast-deep-equal: ^3.1.3 - peerDependencies: - ajv: ^8.8.2 - checksum: c35193940b853119242c6757787f09ecf89a2c19bcd36d03ed1a615e710d19d450cb448bfda407b939aba54b002368c8bff30529cc50a0536a8e10bcce300421 - languageName: node - linkType: hard - "ajv@npm:^6.10.0, ajv@npm:^6.12.4": version: 6.12.6 resolution: "ajv@npm:6.12.6" @@ -2605,18 +2465,6 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.0, ajv@npm:^8.8.0": - version: 8.12.0 - resolution: "ajv@npm:8.12.0" - dependencies: - fast-deep-equal: ^3.1.1 - json-schema-traverse: ^1.0.0 - require-from-string: ^2.0.2 - uri-js: ^4.2.2 - checksum: 4dc13714e316e67537c8b31bc063f99a1d9d9a497eb4bbd55191ac0dcd5e4985bbb71570352ad6f1e76684fb6d790928f96ba3b2d4fd6e10024be9612fe3f001 - languageName: node - linkType: hard - "ansi-escapes@npm:^4.2.1": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" @@ -2862,34 +2710,6 @@ __metadata: languageName: node linkType: hard -"babel-loader@npm:^8.2.2": - version: 8.3.0 - resolution: "babel-loader@npm:8.3.0" - dependencies: - find-cache-dir: ^3.3.1 - loader-utils: ^2.0.0 - make-dir: ^3.1.0 - schema-utils: ^2.6.5 - peerDependencies: - "@babel/core": ^7.0.0 - webpack: ">=2" - checksum: d48bcf9e030e598656ad3ff5fb85967db2eaaf38af5b4a4b99d25618a2057f9f100e6b231af2a46c1913206db506115ca7a8cbdf52c9c73d767070dae4352ab5 - languageName: node - linkType: hard - -"babel-loader@npm:^9.1.2": - version: 9.1.2 - resolution: "babel-loader@npm:9.1.2" - dependencies: - find-cache-dir: ^3.3.2 - schema-utils: ^4.0.0 - peerDependencies: - "@babel/core": ^7.12.0 - webpack: ">=5" - checksum: f0edb8e157f9806b810ba3f2c8ca8fa489d377ae5c2b7b00c2ace900a6925641ce4ec520b9c12f70e37b94aa5366e7003e0f6271b26821643e109966ce741cb7 - languageName: node - linkType: hard - "babel-plugin-istanbul@npm:^6.1.1": version: 6.1.1 resolution: "babel-plugin-istanbul@npm:6.1.1" @@ -2926,15 +2746,6 @@ __metadata: languageName: node linkType: hard -"babel-plugin-transform-remove-imports@npm:^1.5.4, babel-plugin-transform-remove-imports@npm:^1.7.0": - version: 1.7.0 - resolution: "babel-plugin-transform-remove-imports@npm:1.7.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: d50f701edcd6832b21e73b0ed143747a50bb4982c5632c59ab8b8ed2b5163b60402a0beee70e0c5fec1fbf438c074517ff303425b5b9b7f1bee295953f638431 - languageName: node - linkType: hard - "babel-preset-current-node-syntax@npm:^1.0.0": version: 1.0.1 resolution: "babel-preset-current-node-syntax@npm:1.0.1" @@ -2969,13 +2780,6 @@ __metadata: languageName: node linkType: hard -"bail@npm:^2.0.0": - version: 2.0.2 - resolution: "bail@npm:2.0.2" - checksum: aab4e8ccdc8d762bf3fdfce8e706601695620c0c2eda256dd85088dc0be3cfd7ff126f6e99c2bee1f24f5d418414aacf09d7f9702f16d6963df2fa488cda8824 - languageName: node - linkType: hard - "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -2999,13 +2803,6 @@ __metadata: languageName: node linkType: hard -"big.js@npm:^5.2.2": - version: 5.2.2 - resolution: "big.js@npm:5.2.2" - checksum: b89b6e8419b097a8fb4ed2399a1931a68c612bce3cfd5ca8c214b2d017531191070f990598de2fc6f3f993d91c0f08aa82697717f6b3b8732c9731866d233c9e - languageName: node - linkType: hard - "binary-extensions@npm:^2.0.0": version: 2.2.0 resolution: "binary-extensions@npm:2.2.0" @@ -3214,13 +3011,6 @@ __metadata: languageName: node linkType: hard -"ccount@npm:^2.0.0": - version: 2.0.1 - resolution: "ccount@npm:2.0.1" - checksum: 48193dada54c9e260e0acf57fc16171a225305548f9ad20d5471e0f7a8c026aedd8747091dccb0d900cde7df4e4ddbd235df0d8de4a64c71b12f0d3303eeafd4 - languageName: node - linkType: hard - "chalk@npm:^2.0.0": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -3249,41 +3039,6 @@ __metadata: languageName: node linkType: hard -"character-entities-html4@npm:^2.0.0": - version: 2.1.0 - resolution: "character-entities-html4@npm:2.1.0" - checksum: 7034aa7c7fa90309667f6dd50499c8a760c3d3a6fb159adb4e0bada0107d194551cdbad0714302f62d06ce4ed68565c8c2e15fdef2e8f8764eb63fa92b34b11d - languageName: node - linkType: hard - -"character-entities-legacy@npm:^1.0.0": - version: 1.1.4 - resolution: "character-entities-legacy@npm:1.1.4" - checksum: fe03a82c154414da3a0c8ab3188e4237ec68006cbcd681cf23c7cfb9502a0e76cd30ab69a2e50857ca10d984d57de3b307680fff5328ccd427f400e559c3a811 - languageName: node - linkType: hard - -"character-entities-legacy@npm:^3.0.0": - version: 3.0.0 - resolution: "character-entities-legacy@npm:3.0.0" - checksum: 7582af055cb488b626d364b7d7a4e46b06abd526fb63c0e4eb35bcb9c9799cc4f76b39f34fdccef2d1174ac95e53e9ab355aae83227c1a2505877893fce77731 - languageName: node - linkType: hard - -"character-entities@npm:^1.0.0": - version: 1.2.4 - resolution: "character-entities@npm:1.2.4" - checksum: e1545716571ead57beac008433c1ff69517cd8ca5b336889321c5b8ff4a99c29b65589a701e9c086cda8a5e346a67295e2684f6c7ea96819fe85cbf49bf8686d - languageName: node - linkType: hard - -"character-reference-invalid@npm:^1.0.0": - version: 1.1.4 - resolution: "character-reference-invalid@npm:1.1.4" - checksum: 20274574c70e05e2f81135f3b93285536bc8ff70f37f0809b0d17791a832838f1e49938382899ed4cb444e5bbd4314ca1415231344ba29f4222ce2ccf24fea0b - languageName: node - linkType: hard - "chokidar@npm:>=3.0.0 <4.0.0": version: 3.5.3 resolution: "chokidar@npm:3.5.3" @@ -3404,7 +3159,7 @@ __metadata: languageName: node linkType: hard -"color-name@npm:1.1.3, color-name@npm:^1.0.0": +"color-name@npm:1.1.3": version: 1.1.3 resolution: "color-name@npm:1.1.3" checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d @@ -3418,16 +3173,6 @@ __metadata: languageName: node linkType: hard -"color-string@npm:^1.9.0": - version: 1.9.1 - resolution: "color-string@npm:1.9.1" - dependencies: - color-name: ^1.0.0 - simple-swizzle: ^0.2.2 - checksum: c13fe7cff7885f603f49105827d621ce87f4571d78ba28ef4a3f1a104304748f620615e6bf065ecd2145d0d9dad83a3553f52bb25ede7239d18e9f81622f1cc5 - languageName: node - linkType: hard - "color-support@npm:^1.1.3": version: 1.1.3 resolution: "color-support@npm:1.1.3" @@ -3437,16 +3182,6 @@ __metadata: languageName: node linkType: hard -"color@npm:^4.2.3": - version: 4.2.3 - resolution: "color@npm:4.2.3" - dependencies: - color-convert: ^2.0.1 - color-string: ^1.9.0 - checksum: 0579629c02c631b426780038da929cca8e8d80a40158b09811a0112a107c62e10e4aad719843b791b1e658ab4e800558f2e87ca4522c8b32349d497ecb6adeb4 - languageName: node - linkType: hard - "combined-stream@npm:^1.0.8": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" @@ -3456,20 +3191,6 @@ __metadata: languageName: node linkType: hard -"comma-separated-tokens@npm:^1.0.0": - version: 1.0.8 - resolution: "comma-separated-tokens@npm:1.0.8" - checksum: 0adcb07174fa4d08cf0f5c8e3aec40a36b5ff0c2c720e5e23f50fe02e6789d1d00a67036c80e0c1e1539f41d3e7f0101b074039dd833b4e4a59031b659d6ca0d - languageName: node - linkType: hard - -"comma-separated-tokens@npm:^2.0.0": - version: 2.0.3 - resolution: "comma-separated-tokens@npm:2.0.3" - checksum: e3bf9e0332a5c45f49b90e79bcdb4a7a85f28d6a6f0876a94f1bb9b2bfbdbbb9292aac50e1e742d8c0db1e62a0229a106f57917e2d067fca951d81737651700d - languageName: node - linkType: hard - "commander@npm:^6.2.0": version: 6.2.1 resolution: "commander@npm:6.2.1" @@ -3477,13 +3198,6 @@ __metadata: languageName: node linkType: hard -"commondir@npm:^1.0.1": - version: 1.0.1 - resolution: "commondir@npm:1.0.1" - checksum: 59715f2fc456a73f68826285718503340b9f0dd89bfffc42749906c5cf3d4277ef11ef1cca0350d0e79204f00f1f6d83851ececc9095dc88512a697ac0b9bdcb - languageName: node - linkType: hard - "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -3584,15 +3298,6 @@ __metadata: languageName: node linkType: hard -"cross-fetch@npm:3.1.5": - version: 3.1.5 - resolution: "cross-fetch@npm:3.1.5" - dependencies: - node-fetch: 2.6.7 - checksum: f6b8c6ee3ef993ace6277fd789c71b6acf1b504fd5f5c7128df4ef2f125a429e29cd62dc8c127523f04a5f2fa4771ed80e3f3d9695617f441425045f505cf3bb - languageName: node - linkType: hard - "cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" @@ -3806,13 +3511,6 @@ __metadata: languageName: node linkType: hard -"deep-extend@npm:^0.6.0": - version: 0.6.0 - resolution: "deep-extend@npm:0.6.0" - checksum: 7be7e5a8d468d6b10e6a67c3de828f55001b6eb515d014f7aeb9066ce36bd5717161eb47d6a0f7bed8a9083935b465bc163ee2581c8b128d29bf61092fdf57a7 - languageName: node - linkType: hard - "deep-is@npm:^0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" @@ -3872,13 +3570,6 @@ __metadata: languageName: node linkType: hard -"detect-libc@npm:^2.0.0, detect-libc@npm:^2.0.1": - version: 2.0.1 - resolution: "detect-libc@npm:2.0.1" - checksum: ccb05fcabbb555beb544d48080179c18523a343face9ee4e1a86605a8715b4169f94d663c21a03c310ac824592f2ba9a5270218819bb411ad7be578a527593d7 - languageName: node - linkType: hard - "detect-newline@npm:^3.0.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" @@ -4021,24 +3712,6 @@ __metadata: languageName: node linkType: hard -"embla-carousel-react@npm:^7.0.0": - version: 7.0.9 - resolution: "embla-carousel-react@npm:7.0.9" - dependencies: - embla-carousel: 7.0.9 - peerDependencies: - react: ^16.8.0 || ^17.0.1 || ^18.0.0 - checksum: 440157b5187428a214c4db25afff296d26ed2412cfcd424bafcccb2c12b468216534b31939486eef24f96e785b24732fb9084ab1a2a06e427b8f958a0e08cd8e - languageName: node - linkType: hard - -"embla-carousel@npm:7.0.9": - version: 7.0.9 - resolution: "embla-carousel@npm:7.0.9" - checksum: dabb371a44c2d67f21aa7a0ff3f452a5c2678b79e80cb251e0a83b707c4b684fbdbe010927142cdcae3d1c9711a269e05655bd05c39608337fd1b6f5d2c20371 - languageName: node - linkType: hard - "emittery@npm:^0.10.2": version: 0.10.2 resolution: "emittery@npm:0.10.2" @@ -4060,13 +3733,6 @@ __metadata: languageName: node linkType: hard -"emojis-list@npm:^3.0.0": - version: 3.0.0 - resolution: "emojis-list@npm:3.0.0" - checksum: ddaaa02542e1e9436c03970eeed445f4ed29a5337dfba0fe0c38dfdd2af5da2429c2a0821304e8a8d1cadf27fdd5b22ff793571fa803ae16852a6975c65e8e70 - languageName: node - linkType: hard - "encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" @@ -4638,13 +4304,6 @@ __metadata: languageName: node linkType: hard -"expand-template@npm:^2.0.3": - version: 2.0.3 - resolution: "expand-template@npm:2.0.3" - checksum: 588c19847216421ed92befb521767b7018dc88f88b0576df98cb242f20961425e96a92cbece525ef28cc5becceae5d544ae0f5b9b5e2aa05acb13716ca5b3099 - languageName: node - linkType: hard - "expect@npm:^28.1.3": version: 28.1.3 resolution: "expect@npm:28.1.3" @@ -4658,13 +4317,6 @@ __metadata: languageName: node linkType: hard -"extend@npm:^3.0.0": - version: 3.0.2 - resolution: "extend@npm:3.0.2" - checksum: a50a8309ca65ea5d426382ff09f33586527882cf532931cb08ca786ea3146c0553310bda688710ff61d7668eba9f96b923fe1420cdf56a2c3eaf30fcab87b515 - languageName: node - linkType: hard - "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -4751,17 +4403,6 @@ __metadata: languageName: node linkType: hard -"find-cache-dir@npm:^3.3.1, find-cache-dir@npm:^3.3.2": - version: 3.3.2 - resolution: "find-cache-dir@npm:3.3.2" - dependencies: - commondir: ^1.0.1 - make-dir: ^3.0.2 - pkg-dir: ^4.1.0 - checksum: 1e61c2e64f5c0b1c535bd85939ae73b0e5773142713273818cc0b393ee3555fb0fd44e1a5b161b8b6c3e03e98c2fcc9c227d784850a13a90a8ab576869576817 - languageName: node - linkType: hard - "find-root@npm:^1.1.0": version: 1.1.0 resolution: "find-root@npm:1.1.0" @@ -5035,13 +4676,6 @@ __metadata: languageName: node linkType: hard -"github-from-package@npm:0.0.0": - version: 0.0.0 - resolution: "github-from-package@npm:0.0.0" - checksum: 14e448192a35c1e42efee94c9d01a10f42fe790375891a24b25261246ce9336ab9df5d274585aedd4568f7922246c2a78b8a8cd2571bfe99c693a9718e7dd0e3 - languageName: node - linkType: hard - "glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -5275,129 +4909,6 @@ __metadata: languageName: node linkType: hard -"hast-util-from-parse5@npm:^7.0.0": - version: 7.1.1 - resolution: "hast-util-from-parse5@npm:7.1.1" - dependencies: - "@types/hast": ^2.0.0 - "@types/unist": ^2.0.0 - hastscript: ^7.0.0 - property-information: ^6.0.0 - vfile: ^5.0.0 - vfile-location: ^4.0.0 - web-namespaces: ^2.0.0 - checksum: 79431243b65d6fb327988614b3d8addd805cdf620599ce194dce91c1a1c99dc356bfb25494821445ecff49edc3ec3f2ce0b151f5e401e2984fed81a4178b7e79 - languageName: node - linkType: hard - -"hast-util-parse-selector@npm:^2.0.0": - version: 2.2.5 - resolution: "hast-util-parse-selector@npm:2.2.5" - checksum: 22ee4afbd11754562144cb3c4f3ec52524dafba4d90ee52512902d17cf11066d83b38f7bdf6ca571bbc2541f07ba30db0d234657b6ecb8ca4631587466459605 - languageName: node - linkType: hard - -"hast-util-parse-selector@npm:^3.0.0": - version: 3.1.1 - resolution: "hast-util-parse-selector@npm:3.1.1" - dependencies: - "@types/hast": ^2.0.0 - checksum: 511d373465f60dd65e924f88bf0954085f4fb6e3a2b062a4b5ac43b93cbfd36a8dce6234b5d1e3e63499d936375687e83fc5da55628b22bd6b581b5ee167d1c4 - languageName: node - linkType: hard - -"hast-util-raw@npm:^7.0.0": - version: 7.2.3 - resolution: "hast-util-raw@npm:7.2.3" - dependencies: - "@types/hast": ^2.0.0 - "@types/parse5": ^6.0.0 - hast-util-from-parse5: ^7.0.0 - hast-util-to-parse5: ^7.0.0 - html-void-elements: ^2.0.0 - parse5: ^6.0.0 - unist-util-position: ^4.0.0 - unist-util-visit: ^4.0.0 - vfile: ^5.0.0 - web-namespaces: ^2.0.0 - zwitch: ^2.0.0 - checksum: 21857eea3ffb8fd92d2d9be7793b56d0b2c40db03c4cfa14828855ae41d7c584917aa83efb7157220b2e41e25e95f81f24679ac342c35145e5f1c1d39015f81f - languageName: node - linkType: hard - -"hast-util-to-html@npm:^8.0.0": - version: 8.0.4 - resolution: "hast-util-to-html@npm:8.0.4" - dependencies: - "@types/hast": ^2.0.0 - "@types/unist": ^2.0.0 - ccount: ^2.0.0 - comma-separated-tokens: ^2.0.0 - hast-util-raw: ^7.0.0 - hast-util-whitespace: ^2.0.0 - html-void-elements: ^2.0.0 - property-information: ^6.0.0 - space-separated-tokens: ^2.0.0 - stringify-entities: ^4.0.0 - zwitch: ^2.0.4 - checksum: 8f2ae071df2ced5afb4f19f76af8fd3a2f837dc47bcc1c0e0c1578d29dafcd28738f9617505d13c4a2adf13d70e043143e2ad8f130d5554ab4fc11bfa8f74094 - languageName: node - linkType: hard - -"hast-util-to-parse5@npm:^7.0.0": - version: 7.1.0 - resolution: "hast-util-to-parse5@npm:7.1.0" - dependencies: - "@types/hast": ^2.0.0 - comma-separated-tokens: ^2.0.0 - property-information: ^6.0.0 - space-separated-tokens: ^2.0.0 - web-namespaces: ^2.0.0 - zwitch: ^2.0.0 - checksum: 3a7f2175a3db599bbae7e49ba73d3e5e688e5efca7590ff50130ba108ad649f728402815d47db49146f6b94c14c934bf119915da9f6964e38802c122bcc8af6b - languageName: node - linkType: hard - -"hast-util-to-string@npm:^1.0.4": - version: 1.0.4 - resolution: "hast-util-to-string@npm:1.0.4" - checksum: 8132508d5c08d542b64979ad558e474f481011c29d5fce9b1a1fe779fc97e151b734b5c6d94f4937c4ec978b1d641977ee7f9f5ed61ea0611600764abdff7cbb - languageName: node - linkType: hard - -"hast-util-whitespace@npm:^2.0.0": - version: 2.0.1 - resolution: "hast-util-whitespace@npm:2.0.1" - checksum: 431be6b2f35472f951615540d7a53f69f39461e5e080c0190268bdeb2be9ab9b1dddfd1f467dd26c1de7e7952df67beb1307b6ee940baf78b24a71b5e0663868 - languageName: node - linkType: hard - -"hastscript@npm:^6.0.0": - version: 6.0.0 - resolution: "hastscript@npm:6.0.0" - dependencies: - "@types/hast": ^2.0.0 - comma-separated-tokens: ^1.0.0 - hast-util-parse-selector: ^2.0.0 - property-information: ^5.0.0 - space-separated-tokens: ^1.0.0 - checksum: 5e50b85af0d2cb7c17979cb1ddca75d6b96b53019dd999b39e7833192c9004201c3cee6445065620ea05d0087d9ae147a4844e582d64868be5bc6b0232dfe52d - languageName: node - linkType: hard - -"hastscript@npm:^7.0.0": - version: 7.2.0 - resolution: "hastscript@npm:7.2.0" - dependencies: - "@types/hast": ^2.0.0 - comma-separated-tokens: ^2.0.0 - hast-util-parse-selector: ^3.0.0 - property-information: ^6.0.0 - space-separated-tokens: ^2.0.0 - checksum: 928a21576ff7b9a8c945e7940bcbf2d27f770edb4279d4d04b33dc90753e26ca35c1172d626f54afebd377b2afa32331e399feb3eb0f7b91a399dca5927078ae - languageName: node - linkType: hard - "hey-listen@npm:^1.0.8": version: 1.0.8 resolution: "hey-listen@npm:1.0.8" @@ -5422,9 +4933,6 @@ __metadata: "@ctrl/qbittorrent": ^4.1.0 "@ctrl/shared-torrent": ^4.1.1 "@ctrl/transmission": ^4.1.1 - "@dnd-kit/core": ^6.0.5 - "@dnd-kit/sortable": ^7.0.1 - "@dnd-kit/utilities": ^3.2.0 "@emotion/react": ^11.10.5 "@emotion/server": ^11.10.0 "@mantine/core": ^5.9.3 @@ -5437,28 +4945,24 @@ __metadata: "@mantine/notifications": ^5.9.3 "@next/bundle-analyzer": ^12.1.4 "@next/eslint-plugin-next": ^12.1.4 - "@nivo/core": ^0.79.0 - "@nivo/line": ^0.79.1 + "@nivo/core": ^0.80.0 + "@nivo/line": ^0.80.0 "@tabler/icons": ^1.106.0 "@tanstack/react-query": ^4.2.1 "@tanstack/react-query-devtools": ^4.24.4 "@types/dockerode": ^3.3.9 "@types/node": 17.0.1 - "@types/ping": ^0.4.1 + "@types/prismjs": ^1.26.0 "@types/react": 17.0.1 "@types/uuid": ^8.3.4 "@types/video.js": ^7.3.51 "@typescript-eslint/eslint-plugin": ^5.30.7 "@typescript-eslint/parser": ^5.30.7 - "@uiw/react-textarea-code-editor": v1.4.4 axios: ^0.27.2 - babel-loader: ^9.1.2 - babel-plugin-transform-remove-imports: ^1.7.0 consola: ^2.15.3 cookies-next: ^2.1.1 dayjs: ^1.11.7 dockerode: ^3.3.2 - embla-carousel-react: ^7.0.0 eslint: ^8.20.0 eslint-config-airbnb: ^19.0.4 eslint-config-airbnb-typescript: ^17.0.0 @@ -5473,23 +4977,18 @@ __metadata: fily-publish-gridstack: ^0.0.13 framer-motion: ^6.5.1 i18next: ^21.9.1 - i18next-browser-languagedetector: ^6.1.5 - i18next-http-backend: ^1.4.1 jest: ^28.1.3 js-file-download: ^0.4.12 next: ^13.1.6 next-i18next: ^11.3.0 - next-remove-imports: ^1.0.8 nzbget-api: ^0.0.3 - ping: ^0.4.2 prettier: ^2.7.1 - prism-react-renderer: ^1.3.5 + prismjs: ^1.29.0 react: ^18.2.0 react-dom: ^18.2.0 + react-simple-code-editor: ^0.13.1 sabnzbd-api: ^1.5.0 sass: ^1.56.1 - sharp: ^0.30.7 - systeminformation: ^5.12.1 typescript: ^4.7.4 uuid: ^8.3.2 video.js: ^8.0.3 @@ -5553,13 +5052,6 @@ __metadata: languageName: node linkType: hard -"html-void-elements@npm:^2.0.0": - version: 2.0.1 - resolution: "html-void-elements@npm:2.0.1" - checksum: 06d41f13b9d5d6e0f39861c4bec9a9196fa4906d56cd5cf6cf54ad2e52a85bf960cca2bf9600026bde16c8331db171bedba5e5a35e2e43630c8f1d497b2fb658 - languageName: node - linkType: hard - "htmlparser2@npm:7.2.0": version: 7.2.0 resolution: "htmlparser2@npm:7.2.0" @@ -5636,15 +5128,6 @@ __metadata: languageName: node linkType: hard -"i18next-browser-languagedetector@npm:^6.1.5": - version: 6.1.8 - resolution: "i18next-browser-languagedetector@npm:6.1.8" - dependencies: - "@babel/runtime": ^7.19.0 - checksum: dd84d3c9cb693a70662436b06f5554898815df33b7641249a64876c74c38960f11ef17b4d7f49ee2da7262abe0f3ae73abe7f3a3b435a344d0d07e4ca7cb24c6 - languageName: node - linkType: hard - "i18next-fs-backend@npm:^1.1.4": version: 1.2.0 resolution: "i18next-fs-backend@npm:1.2.0" @@ -5652,15 +5135,6 @@ __metadata: languageName: node linkType: hard -"i18next-http-backend@npm:^1.4.1": - version: 1.4.5 - resolution: "i18next-http-backend@npm:1.4.5" - dependencies: - cross-fetch: 3.1.5 - checksum: 1978a9d7970cc711e96133553e5f3815cf16c3e2f8db7982036f8c913c5a64eb20953e85e0ab48a88ad3c754f51184b67a778655ed65aeaae46430cdc1f673da - languageName: node - linkType: hard - "i18next@npm:^21.8.13, i18next@npm:^21.9.1": version: 21.10.0 resolution: "i18next@npm:21.10.0" @@ -5767,13 +5241,6 @@ __metadata: languageName: node linkType: hard -"ini@npm:~1.3.0": - version: 1.3.8 - resolution: "ini@npm:1.3.8" - checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 - languageName: node - linkType: hard - "inline-style-parser@npm:0.1.1": version: 0.1.1 resolution: "inline-style-parser@npm:0.1.1" @@ -5806,23 +5273,6 @@ __metadata: languageName: node linkType: hard -"is-alphabetical@npm:^1.0.0": - version: 1.0.4 - resolution: "is-alphabetical@npm:1.0.4" - checksum: 6508cce44fd348f06705d377b260974f4ce68c74000e7da4045f0d919e568226dc3ce9685c5a2af272195384df6930f748ce9213fc9f399b5d31b362c66312cb - languageName: node - linkType: hard - -"is-alphanumerical@npm:^1.0.0": - version: 1.0.4 - resolution: "is-alphanumerical@npm:1.0.4" - dependencies: - is-alphabetical: ^1.0.0 - is-decimal: ^1.0.0 - checksum: e2e491acc16fcf5b363f7c726f666a9538dba0a043665740feb45bba1652457a73441e7c5179c6768a638ed396db3437e9905f403644ec7c468fb41f4813d03f - languageName: node - linkType: hard - "is-arguments@npm:^1.1.1": version: 1.1.1 resolution: "is-arguments@npm:1.1.1" @@ -5851,13 +5301,6 @@ __metadata: languageName: node linkType: hard -"is-arrayish@npm:^0.3.1": - version: 0.3.2 - resolution: "is-arrayish@npm:0.3.2" - checksum: 977e64f54d91c8f169b59afcd80ff19227e9f5c791fa28fa2e5bce355cbaf6c2c356711b734656e80c9dd4a854dd7efcf7894402f1031dfc5de5d620775b4d5f - languageName: node - linkType: hard - "is-bigint@npm:^1.0.1": version: 1.0.4 resolution: "is-bigint@npm:1.0.4" @@ -5886,13 +5329,6 @@ __metadata: languageName: node linkType: hard -"is-buffer@npm:^2.0.0": - version: 2.0.5 - resolution: "is-buffer@npm:2.0.5" - checksum: 764c9ad8b523a9f5a32af29bdf772b08eb48c04d2ad0a7240916ac2688c983bf5f8504bf25b35e66240edeb9d9085461f9b5dae1f3d2861c6b06a65fe983de42 - languageName: node - linkType: hard - "is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" @@ -5918,13 +5354,6 @@ __metadata: languageName: node linkType: hard -"is-decimal@npm:^1.0.0": - version: 1.0.4 - resolution: "is-decimal@npm:1.0.4" - checksum: ed483a387517856dc395c68403a10201fddcc1b63dc56513fbe2fe86ab38766120090ecdbfed89223d84ca8b1cd28b0641b93cb6597b6e8f4c097a7c24e3fb96 - languageName: node - linkType: hard - "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -5962,13 +5391,6 @@ __metadata: languageName: node linkType: hard -"is-hexadecimal@npm:^1.0.0": - version: 1.0.4 - resolution: "is-hexadecimal@npm:1.0.4" - checksum: a452e047587b6069332d83130f54d30da4faf2f2ebaa2ce6d073c27b5703d030d58ed9e0b729c8e4e5b52c6f1dab26781bb77b7bc6c7805f14f320e328ff8cd5 - languageName: node - linkType: hard - "is-lambda@npm:^1.0.1": version: 1.0.1 resolution: "is-lambda@npm:1.0.1" @@ -6013,13 +5435,6 @@ __metadata: languageName: node linkType: hard -"is-plain-obj@npm:^4.0.0": - version: 4.1.0 - resolution: "is-plain-obj@npm:4.1.0" - checksum: 6dc45da70d04a81f35c9310971e78a6a3c7a63547ef782e3a07ee3674695081b6ca4e977fbb8efc48dae3375e0b34558d2bcd722aec9bddfa2d7db5b041be8ce - languageName: node - linkType: hard - "is-regex@npm:^1.1.4": version: 1.1.4 resolution: "is-regex@npm:1.1.4" @@ -6710,13 +6125,6 @@ __metadata: languageName: node linkType: hard -"json-schema-traverse@npm:^1.0.0": - version: 1.0.0 - resolution: "json-schema-traverse@npm:1.0.0" - checksum: 02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad - languageName: node - linkType: hard - "json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" @@ -6735,7 +6143,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.1.2, json5@npm:^2.2.2": +"json5@npm:^2.2.2": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -6824,17 +6232,6 @@ __metadata: languageName: node linkType: hard -"loader-utils@npm:^2.0.0": - version: 2.0.4 - resolution: "loader-utils@npm:2.0.4" - dependencies: - big.js: ^5.2.2 - emojis-list: ^3.0.0 - json5: ^2.1.2 - checksum: a5281f5fff1eaa310ad5e1164095689443630f3411e927f95031ab4fb83b4a98f388185bb1fe949e8ab8d4247004336a625e9255c22122b815bb9a4c5d8fc3b7 - languageName: node - linkType: hard - "locate-path@npm:^5.0.0": version: 5.0.0 resolution: "locate-path@npm:5.0.0" @@ -6928,7 +6325,7 @@ __metadata: languageName: node linkType: hard -"make-dir@npm:^3.0.0, make-dir@npm:^3.0.2, make-dir@npm:^3.1.0": +"make-dir@npm:^3.0.0": version: 3.1.0 resolution: "make-dir@npm:3.1.0" dependencies: @@ -7065,13 +6462,20 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.6, minimist@npm:~1.2.5": +"minimist@npm:^1.2.0, minimist@npm:^1.2.6": version: 1.2.7 resolution: "minimist@npm:1.2.7" checksum: 7346574a1038ca23c32e02252f603801f09384dd1d78b69a943a4e8c2c28730b80e96193882d3d3b22a063445f460e48316b29b8a25addca2d7e5e8f75478bec languageName: node linkType: hard +"minimist@npm:~1.2.5": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 + languageName: node + linkType: hard + "minipass-collect@npm:^1.0.2": version: 1.0.2 resolution: "minipass-collect@npm:1.0.2" @@ -7149,7 +6553,7 @@ __metadata: languageName: node linkType: hard -"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": +"mkdirp-classic@npm:^0.5.2": version: 0.5.3 resolution: "mkdirp-classic@npm:0.5.3" checksum: 3f4e088208270bbcc148d53b73e9a5bd9eef05ad2cbf3b3d0ff8795278d50dd1d11a8ef1875ff5aea3fa888931f95bfcb2ad5b7c1061cfefd6284d199e6776ac @@ -7240,13 +6644,6 @@ __metadata: languageName: node linkType: hard -"napi-build-utils@npm:^1.0.1": - version: 1.0.2 - resolution: "napi-build-utils@npm:1.0.2" - checksum: 06c14271ee966e108d55ae109f340976a9556c8603e888037145d6522726aebe89dd0c861b4b83947feaf6d39e79e08817559e8693deedc2c94e82c5cbd090c7 - languageName: node - linkType: hard - "natural-compare-lite@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare-lite@npm:1.4.0" @@ -7286,17 +6683,6 @@ __metadata: languageName: node linkType: hard -"next-remove-imports@npm:^1.0.8": - version: 1.0.8 - resolution: "next-remove-imports@npm:1.0.8" - dependencies: - "@babel/core": ^7.14.3 - babel-loader: ^8.2.2 - babel-plugin-transform-remove-imports: ^1.5.4 - checksum: e13b1ccd3836803658936d5dc90470877b614147446a57643247478956cf3c4d47ecc4dc5fe2f6ee3c6f69d378b09ef17e0b26fbbfaa47f34a6a04263441d1d6 - languageName: node - linkType: hard - "next@npm:^13.1.6": version: 13.1.6 resolution: "next@npm:13.1.6" @@ -7365,24 +6751,6 @@ __metadata: languageName: node linkType: hard -"node-abi@npm:^3.3.0": - version: 3.31.0 - resolution: "node-abi@npm:3.31.0" - dependencies: - semver: ^7.3.5 - checksum: 38fa63c689ef50b4b8f576d5f843107e2d25bd7e7d4ed56dc0adb9db7eda945fc433a7a432beca4b9decf62ff05395f0e84f46e7ab7f275f85e5fde213353950 - languageName: node - linkType: hard - -"node-addon-api@npm:^5.0.0": - version: 5.1.0 - resolution: "node-addon-api@npm:5.1.0" - dependencies: - node-gyp: latest - checksum: 2508bd2d2981945406243a7bd31362fc7af8b70b8b4d65f869c61731800058fb818cc2fd36c8eac714ddd0e568cc85becf5e165cebbdf7b5024d5151bbc75ea1 - languageName: node - linkType: hard - "node-domexception@npm:1.0.0": version: 1.0.0 resolution: "node-domexception@npm:1.0.0" @@ -7390,20 +6758,6 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:2.6.7": - version: 2.6.7 - resolution: "node-fetch@npm:2.6.7" - dependencies: - whatwg-url: ^5.0.0 - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - checksum: 8d816ffd1ee22cab8301c7756ef04f3437f18dace86a1dae22cf81db8ef29c0bf6655f3215cb0cdb22b420b6fe141e64b26905e7f33f9377a7fa59135ea3e10b - languageName: node - linkType: hard - "node-gyp@npm:latest": version: 9.3.1 resolution: "node-gyp@npm:9.3.1" @@ -7718,20 +7072,6 @@ __metadata: languageName: node linkType: hard -"parse-entities@npm:^2.0.0": - version: 2.0.0 - resolution: "parse-entities@npm:2.0.0" - dependencies: - character-entities: ^1.0.0 - character-entities-legacy: ^1.0.0 - character-reference-invalid: ^1.0.0 - is-alphanumerical: ^1.0.0 - is-decimal: ^1.0.0 - is-hexadecimal: ^1.0.0 - checksum: 7addfd3e7d747521afac33c8121a5f23043c6973809756920d37e806639b4898385d386fcf4b3c8e2ecf1bc28aac5ae97df0b112d5042034efbe80f44081ebce - languageName: node - linkType: hard - "parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" @@ -7744,13 +7084,6 @@ __metadata: languageName: node linkType: hard -"parse5@npm:^6.0.0": - version: 6.0.1 - resolution: "parse5@npm:6.0.1" - checksum: 7d569a176c5460897f7c8f3377eff640d54132b9be51ae8a8fa4979af940830b2b0c296ce75e5bd8f4041520aadde13170dbdec44889975f906098ea0002f4bd - languageName: node - linkType: hard - "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" @@ -7800,16 +7133,6 @@ __metadata: languageName: node linkType: hard -"ping@npm:^0.4.2": - version: 0.4.2 - resolution: "ping@npm:0.4.2" - dependencies: - q: 1.x - underscore: ^1.12.0 - checksum: 43992c76fb3294734248753f2028d9fab3b919dbfae79a5ea6df7e81fc2d6d555dd0b195d6c3dbc5c89aa9dba1cd8eb58d5ecedad103ecfee64df516e5f3665b - languageName: node - linkType: hard - "pirates@npm:^4.0.4": version: 4.0.5 resolution: "pirates@npm:4.0.5" @@ -7828,7 +7151,7 @@ __metadata: languageName: node linkType: hard -"pkg-dir@npm:^4.1.0, pkg-dir@npm:^4.2.0": +"pkg-dir@npm:^4.2.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" dependencies: @@ -7860,28 +7183,6 @@ __metadata: languageName: node linkType: hard -"prebuild-install@npm:^7.1.1": - version: 7.1.1 - resolution: "prebuild-install@npm:7.1.1" - dependencies: - detect-libc: ^2.0.0 - expand-template: ^2.0.3 - github-from-package: 0.0.0 - minimist: ^1.2.3 - mkdirp-classic: ^0.5.3 - napi-build-utils: ^1.0.1 - node-abi: ^3.3.0 - pump: ^3.0.0 - rc: ^1.2.7 - simple-get: ^4.0.0 - tar-fs: ^2.0.0 - tunnel-agent: ^0.6.0 - bin: - prebuild-install: bin.js - checksum: dbf96d0146b6b5827fc8f67f72074d2e19c69628b9a7a0a17d0fad1bf37e9f06922896972e074197fc00a52eae912993e6ef5a0d471652f561df5cb516f3f467 - languageName: node - linkType: hard - "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -7910,19 +7211,10 @@ __metadata: languageName: node linkType: hard -"prism-react-renderer@npm:^1.3.5": - version: 1.3.5 - resolution: "prism-react-renderer@npm:1.3.5" - peerDependencies: - react: ">=0.14.9" - checksum: c18806dcbc4c0b4fd6fd15bd06b4f7c0a6da98d93af235c3e970854994eb9b59e23315abb6cfc29e69da26d36709a47e25da85ab27fed81b6812f0a52caf6dfa - languageName: node - linkType: hard - -"prismjs@npm:~1.27.0": - version: 1.27.0 - resolution: "prismjs@npm:1.27.0" - checksum: 85c7f4a3e999073502cc9e1882af01e3709706369ec254b60bff1149eda701f40d02512acab956012dc7e61cfd61743a3a34c1bd0737e8dbacd79141e5698bbc +"prismjs@npm:^1.29.0": + version: 1.29.0 + resolution: "prismjs@npm:1.29.0" + checksum: 007a8869d4456ff8049dc59404e32d5666a07d99c3b0e30a18bd3b7676dfa07d1daae9d0f407f20983865fd8da56de91d09cb08e6aa61f5bc420a27c0beeaf93 languageName: node linkType: hard @@ -7978,22 +7270,6 @@ __metadata: languageName: node linkType: hard -"property-information@npm:^5.0.0": - version: 5.6.0 - resolution: "property-information@npm:5.6.0" - dependencies: - xtend: ^4.0.0 - checksum: fcf87c6542e59a8bbe31ca0b3255a4a63ac1059b01b04469680288998bcfa97f341ca989566adbb63975f4d85339030b82320c324a511532d390910d1c583893 - languageName: node - linkType: hard - -"property-information@npm:^6.0.0": - version: 6.2.0 - resolution: "property-information@npm:6.2.0" - checksum: 23afce07ba821cbe7d926e63cdd680991961c82be4bbb6c0b17c47f48894359c1be6e51cd74485fc10a9d3fd361b475388e1e39311ed2b53127718f72aab1955 - languageName: node - linkType: hard - "psl@npm:^1.1.33": version: 1.9.0 resolution: "psl@npm:1.9.0" @@ -8018,7 +7294,7 @@ __metadata: languageName: node linkType: hard -"q@npm:1.x, q@npm:^1.4.1": +"q@npm:^1.4.1": version: 1.5.1 resolution: "q@npm:1.5.1" checksum: 147baa93c805bc1200ed698bdf9c72e9e42c05f96d007e33a558b5fdfd63e5ea130e99313f28efc1783e90e6bdb4e48b67a36fcc026b7b09202437ae88a1fb12 @@ -8046,20 +7322,6 @@ __metadata: languageName: node linkType: hard -"rc@npm:^1.2.7": - version: 1.2.8 - resolution: "rc@npm:1.2.8" - dependencies: - deep-extend: ^0.6.0 - ini: ~1.3.0 - minimist: ^1.2.0 - strip-json-comments: ~2.0.1 - bin: - rc: ./cli.js - checksum: 2e26e052f8be2abd64e6d1dabfbd7be03f80ec18ccbc49562d31f617d0015fbdbcf0f9eed30346ea6ab789e0fdfe4337f033f8016efdbee0df5354751842080e - languageName: node - linkType: hard - "react-dom@npm:^18.2.0": version: 18.2.0 resolution: "react-dom@npm:18.2.0" @@ -8131,6 +7393,16 @@ __metadata: languageName: node linkType: hard +"react-simple-code-editor@npm:^0.13.1": + version: 0.13.1 + resolution: "react-simple-code-editor@npm:0.13.1" + peerDependencies: + react: "*" + react-dom: "*" + checksum: 1d223e34ccac5d7f91318f28d5edab6ccb13c51b1afb502094b8475214321263bb44258d355978e1714e9360c9081fb9f38d3ae89071a06628407627c362cc45 + languageName: node + linkType: hard + "react-textarea-autosize@npm:8.3.4": version: 8.3.4 resolution: "react-textarea-autosize@npm:8.3.4" @@ -8215,18 +7487,7 @@ __metadata: languageName: node linkType: hard -"refractor@npm:^3.4.0": - version: 3.6.0 - resolution: "refractor@npm:3.6.0" - dependencies: - hastscript: ^6.0.0 - parse-entities: ^2.0.0 - prismjs: ~1.27.0 - checksum: 39b01c4168c77c5c8486f9bf8907bbb05f257f15026057ba5728535815a2d90eed620468a4bfbb2b8ceefbb3ce3931a1be8b17152dbdbc8b0eef92450ff750a2 - languageName: node - linkType: hard - -"regenerator-runtime@npm:^0.13.11, regenerator-runtime@npm:^0.13.4": +"regenerator-runtime@npm:^0.13.11": version: 0.13.11 resolution: "regenerator-runtime@npm:0.13.11" checksum: 27481628d22a1c4e3ff551096a683b424242a216fee44685467307f14d58020af1e19660bf2e26064de946bad7eff28950eae9f8209d55723e2d9351e632bbb4 @@ -8251,41 +7512,6 @@ __metadata: languageName: node linkType: hard -"rehype-parse@npm:^8.0.0": - version: 8.0.4 - resolution: "rehype-parse@npm:8.0.4" - dependencies: - "@types/hast": ^2.0.0 - hast-util-from-parse5: ^7.0.0 - parse5: ^6.0.0 - unified: ^10.0.0 - checksum: e678a5f9fa7cb91d5957f5f38bc37bc9fb90b8011a1ed6a90541ba6fff9f243c752c88b7f422cba8f5ba83ccb22942b1825654e8c3040970c703b85a6037efdf - languageName: node - linkType: hard - -"rehype-stringify@npm:^9.0.0": - version: 9.0.3 - resolution: "rehype-stringify@npm:9.0.3" - dependencies: - "@types/hast": ^2.0.0 - hast-util-to-html: ^8.0.0 - unified: ^10.0.0 - checksum: ff4b1f3f88f2747a9f88d84f8cd9811e892a7309574480547ddfd94022725a62e17a9ccc69f9d909620a20f2a6ad750ea74b317f06ab50955209b5c0ede5cd3f - languageName: node - linkType: hard - -"rehype@npm:12.0.0": - version: 12.0.0 - resolution: "rehype@npm:12.0.0" - dependencies: - "@types/hast": ^2.0.0 - rehype-parse: ^8.0.0 - rehype-stringify: ^9.0.0 - unified: ^10.0.0 - checksum: 469a3c040ce315a3f58663d558930a20fa65356dd653d2adefe8e1a0adbcd728adf050ccad3f046141daca7e538fe27b2fcfb96722b83cbe5d78b61862fade96 - languageName: node - linkType: hard - "remove-accents@npm:0.4.2": version: 0.4.2 resolution: "remove-accents@npm:0.4.2" @@ -8300,13 +7526,6 @@ __metadata: languageName: node linkType: hard -"require-from-string@npm:^2.0.2": - version: 2.0.2 - resolution: "require-from-string@npm:2.0.2" - checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b - languageName: node - linkType: hard - "requires-port@npm:^1.0.0": version: 1.0.0 resolution: "requires-port@npm:1.0.0" @@ -8474,13 +7693,6 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - "safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": version: 5.1.2 resolution: "safe-buffer@npm:5.1.2" @@ -8488,6 +7700,13 @@ __metadata: languageName: node linkType: hard +"safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + languageName: node + linkType: hard + "safe-json-parse@npm:4.0.0": version: 4.0.0 resolution: "safe-json-parse@npm:4.0.0" @@ -8537,29 +7756,6 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^2.6.5": - version: 2.7.1 - resolution: "schema-utils@npm:2.7.1" - dependencies: - "@types/json-schema": ^7.0.5 - ajv: ^6.12.4 - ajv-keywords: ^3.5.2 - checksum: 32c62fc9e28edd101e1bd83453a4216eb9bd875cc4d3775e4452b541908fa8f61a7bbac8ffde57484f01d7096279d3ba0337078e85a918ecbeb72872fb09fb2b - languageName: node - linkType: hard - -"schema-utils@npm:^4.0.0": - version: 4.0.0 - resolution: "schema-utils@npm:4.0.0" - dependencies: - "@types/json-schema": ^7.0.9 - ajv: ^8.8.0 - ajv-formats: ^2.1.1 - ajv-keywords: ^5.0.0 - checksum: c843e92fdd1a5c145dbb6ffdae33e501867f9703afac67bdf35a685e49f85b1dcc10ea250033175a64bd9d31f0555bc6785b8359da0c90bcea30cf6dfbb55a8f - languageName: node - linkType: hard - "semver@npm:^6.0.0, semver@npm:^6.3.0": version: 6.3.0 resolution: "semver@npm:6.3.0" @@ -8587,23 +7783,6 @@ __metadata: languageName: node linkType: hard -"sharp@npm:^0.30.7": - version: 0.30.7 - resolution: "sharp@npm:0.30.7" - dependencies: - color: ^4.2.3 - detect-libc: ^2.0.1 - node-addon-api: ^5.0.0 - node-gyp: latest - prebuild-install: ^7.1.1 - semver: ^7.3.7 - simple-get: ^4.0.1 - tar-fs: ^2.1.1 - tunnel-agent: ^0.6.0 - checksum: bbc63ca3c7ea8a5bff32cd77022cfea30e25a03f5bd031e935924bf6cf0e11e3388e8b0e22b3137bf8816aa73407f1e4fbeb190f3a35605c27ffca9f32b91601 - languageName: node - linkType: hard - "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" @@ -8638,33 +7817,6 @@ __metadata: languageName: node linkType: hard -"simple-concat@npm:^1.0.0": - version: 1.0.1 - resolution: "simple-concat@npm:1.0.1" - checksum: 4d211042cc3d73a718c21ac6c4e7d7a0363e184be6a5ad25c8a1502e49df6d0a0253979e3d50dbdd3f60ef6c6c58d756b5d66ac1e05cda9cacd2e9fc59e3876a - languageName: node - linkType: hard - -"simple-get@npm:^4.0.0, simple-get@npm:^4.0.1": - version: 4.0.1 - resolution: "simple-get@npm:4.0.1" - dependencies: - decompress-response: ^6.0.0 - once: ^1.3.1 - simple-concat: ^1.0.0 - checksum: e4132fd27cf7af230d853fa45c1b8ce900cb430dd0a3c6d3829649fe4f2b26574c803698076c4006450efb0fad2ba8c5455fbb5755d4b0a5ec42d4f12b31d27e - languageName: node - linkType: hard - -"simple-swizzle@npm:^0.2.2": - version: 0.2.2 - resolution: "simple-swizzle@npm:0.2.2" - dependencies: - is-arrayish: ^0.3.1 - checksum: a7f3f2ab5c76c4472d5c578df892e857323e452d9f392e1b5cf74b74db66e6294a1e1b8b390b519fa1b96b5b613f2a37db6cffef52c3f1f8f3c5ea64eb2d54c0 - languageName: node - linkType: hard - "sirv@npm:^1.0.7": version: 1.0.19 resolution: "sirv@npm:1.0.19" @@ -8749,20 +7901,6 @@ __metadata: languageName: node linkType: hard -"space-separated-tokens@npm:^1.0.0": - version: 1.1.5 - resolution: "space-separated-tokens@npm:1.1.5" - checksum: 8ef68f1cfa8ccad316b7f8d0df0919d0f1f6d32101e8faeee34ea3a923ce8509c1ad562f57388585ee4951e92d27afa211ed0a077d3d5995b5ba9180331be708 - languageName: node - linkType: hard - -"space-separated-tokens@npm:^2.0.0": - version: 2.0.2 - resolution: "space-separated-tokens@npm:2.0.2" - checksum: 202e97d7ca1ba0758a0aa4fe226ff98142073bcceeff2da3aad037968878552c3bbce3b3231970025375bbba5aee00c5b8206eda408da837ab2dc9c0f26be990 - languageName: node - linkType: hard - "split-ca@npm:^1.0.1": version: 1.0.1 resolution: "split-ca@npm:1.0.1" @@ -8905,16 +8043,6 @@ __metadata: languageName: node linkType: hard -"stringify-entities@npm:^4.0.0": - version: 4.0.3 - resolution: "stringify-entities@npm:4.0.3" - dependencies: - character-entities-html4: ^2.0.0 - character-entities-legacy: ^3.0.0 - checksum: 59e8f523b403bf7d415690e72ae52982decd6ea5426bd8b3f5c66225ddde73e766c0c0d91627df082d0794e30b19dd907ffb5864cef3602e4098d6777d7ca3c2 - languageName: node - linkType: hard - "strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" @@ -8952,13 +8080,6 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:~2.0.1": - version: 2.0.1 - resolution: "strip-json-comments@npm:2.0.1" - checksum: 1074ccb63270d32ca28edfb0a281c96b94dc679077828135141f27d52a5a398ef5e78bcf22809d23cadc2b81dfbe345eb5fd8699b385c8b1128907dec4a7d1e1 - languageName: node - linkType: hard - "style-to-js@npm:1.1.0": version: 1.1.0 resolution: "style-to-js@npm:1.1.0" @@ -9063,16 +8184,6 @@ __metadata: languageName: node linkType: hard -"systeminformation@npm:^5.12.1": - version: 5.17.8 - resolution: "systeminformation@npm:5.17.8" - bin: - systeminformation: lib/cli.js - checksum: faea46485d646c304e1cf19956155345e1e2e644b605c40189851846b544e58a9937467b3e577151b54a54ed5310b625cca49665aa7ef1eb1bf8a8e3d7282d8d - conditions: (os=darwin | os=linux | os=win32 | os=freebsd | os=openbsd | os=netbsd | os=sunos | os=android) - languageName: node - linkType: hard - "tabbable@npm:^6.0.1": version: 6.0.1 resolution: "tabbable@npm:6.0.1" @@ -9080,7 +8191,7 @@ __metadata: languageName: node linkType: hard -"tar-fs@npm:^2.0.0, tar-fs@npm:~2.0.1": +"tar-fs@npm:~2.0.1": version: 2.0.1 resolution: "tar-fs@npm:2.0.1" dependencies: @@ -9092,19 +8203,7 @@ __metadata: languageName: node linkType: hard -"tar-fs@npm:^2.1.1": - version: 2.1.1 - resolution: "tar-fs@npm:2.1.1" - dependencies: - chownr: ^1.1.1 - mkdirp-classic: ^0.5.2 - pump: ^3.0.0 - tar-stream: ^2.1.4 - checksum: f5b9a70059f5b2969e65f037b4e4da2daf0fa762d3d232ffd96e819e3f94665dbbbe62f76f084f1acb4dbdcce16c6e4dac08d12ffc6d24b8d76720f4d9cf032d - languageName: node - linkType: hard - -"tar-stream@npm:^2.0.0, tar-stream@npm:^2.1.4": +"tar-stream@npm:^2.0.0": version: 2.2.0 resolution: "tar-stream@npm:2.2.0" dependencies: @@ -9218,20 +8317,6 @@ __metadata: languageName: node linkType: hard -"tr46@npm:~0.0.3": - version: 0.0.3 - resolution: "tr46@npm:0.0.3" - checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 - languageName: node - linkType: hard - -"trough@npm:^2.0.0": - version: 2.1.0 - resolution: "trough@npm:2.1.0" - checksum: a577bb561c2b401cc0e1d9e188fcfcdf63b09b151ff56a668da12197fe97cac15e3d77d5b51f426ccfd94255744a9118e9e9935afe81a3644fa1be9783c82886 - languageName: node - linkType: hard - "tsconfig-paths@npm:^3.14.1": version: 3.14.1 resolution: "tsconfig-paths@npm:3.14.1" @@ -9269,15 +8354,6 @@ __metadata: languageName: node linkType: hard -"tunnel-agent@npm:^0.6.0": - version: 0.6.0 - resolution: "tunnel-agent@npm:0.6.0" - dependencies: - safe-buffer: ^5.0.1 - checksum: 05f6510358f8afc62a057b8b692f05d70c1782b70db86d6a1e0d5e28a32389e52fa6e7707b6c5ecccacc031462e4bc35af85ecfe4bbc341767917b7cf6965711 - languageName: node - linkType: hard - "tweetnacl@npm:^0.14.3": version: 0.14.5 resolution: "tweetnacl@npm:0.14.5" @@ -9358,28 +8434,6 @@ __metadata: languageName: node linkType: hard -"underscore@npm:^1.12.0": - version: 1.13.6 - resolution: "underscore@npm:1.13.6" - checksum: d5cedd14a9d0d91dd38c1ce6169e4455bb931f0aaf354108e47bd46d3f2da7464d49b2171a5cf786d61963204a42d01ea1332a903b7342ad428deaafaf70ec36 - languageName: node - linkType: hard - -"unified@npm:^10.0.0": - version: 10.1.2 - resolution: "unified@npm:10.1.2" - dependencies: - "@types/unist": ^2.0.0 - bail: ^2.0.0 - extend: ^3.0.0 - is-buffer: ^2.0.0 - is-plain-obj: ^4.0.0 - trough: ^2.0.0 - vfile: ^5.0.0 - checksum: 053e7c65ede644607f87bd625a299e4b709869d2f76ec8138569e6e886903b6988b21cd9699e471eda42bee189527be0a9dac05936f1d069a5e65d0125d5d756 - languageName: node - linkType: hard - "unique-filename@npm:^2.0.0": version: 2.0.1 resolution: "unique-filename@npm:2.0.1" @@ -9398,80 +8452,6 @@ __metadata: languageName: node linkType: hard -"unist-util-is@npm:^4.0.0": - version: 4.1.0 - resolution: "unist-util-is@npm:4.1.0" - checksum: 726484cd2adc9be75a939aeedd48720f88294899c2e4a3143da413ae593f2b28037570730d5cf5fd910ff41f3bc1501e3d636b6814c478d71126581ef695f7ea - languageName: node - linkType: hard - -"unist-util-is@npm:^5.0.0": - version: 5.2.0 - resolution: "unist-util-is@npm:5.2.0" - checksum: b80debe1ce5d40a8d685c510f597e5c8b8f7089540e9e268bda1b05bcce735c10bf36d5b0e4ecded50c63fa43b8a11b0e4b784beecf1559f153a2f2855e8526c - languageName: node - linkType: hard - -"unist-util-position@npm:^4.0.0": - version: 4.0.4 - resolution: "unist-util-position@npm:4.0.4" - dependencies: - "@types/unist": ^2.0.0 - checksum: e7487b6cec9365299695e3379ded270a1717074fa11fd2407c9b934fb08db6fe1d9077ddeaf877ecf1813665f8ccded5171693d3d9a7a01a125ec5cdd5e88691 - languageName: node - linkType: hard - -"unist-util-stringify-position@npm:^3.0.0": - version: 3.0.3 - resolution: "unist-util-stringify-position@npm:3.0.3" - dependencies: - "@types/unist": ^2.0.0 - checksum: dbd66c15183607ca942a2b1b7a9f6a5996f91c0d30cf8966fb88955a02349d9eefd3974e9010ee67e71175d784c5a9fea915b0aa0b0df99dcb921b95c4c9e124 - languageName: node - linkType: hard - -"unist-util-visit-parents@npm:^3.0.0": - version: 3.1.1 - resolution: "unist-util-visit-parents@npm:3.1.1" - dependencies: - "@types/unist": ^2.0.0 - unist-util-is: ^4.0.0 - checksum: 1170e397dff88fab01e76d5154981666eb0291019d2462cff7a2961a3e76d3533b42eaa16b5b7e2d41ad42a5ea7d112301458283d255993e660511387bf67bc3 - languageName: node - linkType: hard - -"unist-util-visit-parents@npm:^5.1.1": - version: 5.1.3 - resolution: "unist-util-visit-parents@npm:5.1.3" - dependencies: - "@types/unist": ^2.0.0 - unist-util-is: ^5.0.0 - checksum: 8ecada5978994f846b64658cf13b4092cd78dea39e1ba2f5090a5de842ba4852712c02351a8ae95250c64f864635e7b02aedf3b4a093552bb30cf1bd160efbaa - languageName: node - linkType: hard - -"unist-util-visit@npm:^2.0.3": - version: 2.0.3 - resolution: "unist-util-visit@npm:2.0.3" - dependencies: - "@types/unist": ^2.0.0 - unist-util-is: ^4.0.0 - unist-util-visit-parents: ^3.0.0 - checksum: 1fe19d500e212128f96d8c3cfa3312846e586b797748a1fd195fe6479f06bc90a6f6904deb08eefc00dd58e83a1c8a32fb8677252d2273ad7a5e624525b69b8f - languageName: node - linkType: hard - -"unist-util-visit@npm:^4.0.0": - version: 4.1.2 - resolution: "unist-util-visit@npm:4.1.2" - dependencies: - "@types/unist": ^2.0.0 - unist-util-is: ^5.0.0 - unist-util-visit-parents: ^5.1.1 - checksum: 95a34e3f7b5b2d4b68fd722b6229972099eb97b6df18913eda44a5c11df8b1e27efe7206dd7b88c4ed244a48c474a5b2e2629ab79558ff9eb936840295549cee - languageName: node - linkType: hard - "universalify@npm:^0.2.0": version: 0.2.0 resolution: "universalify@npm:0.2.0" @@ -9590,38 +8570,6 @@ __metadata: languageName: node linkType: hard -"vfile-location@npm:^4.0.0": - version: 4.0.1 - resolution: "vfile-location@npm:4.0.1" - dependencies: - "@types/unist": ^2.0.0 - vfile: ^5.0.0 - checksum: cc0df62075c741beee699e651374aeb56c4c1f4333398c0ba924281c2b51d4b7669c69c5b837ea395775626ad030d6f1bd27fd0a7eaf3f9f1bbd55393948ad6c - languageName: node - linkType: hard - -"vfile-message@npm:^3.0.0": - version: 3.1.3 - resolution: "vfile-message@npm:3.1.3" - dependencies: - "@types/unist": ^2.0.0 - unist-util-stringify-position: ^3.0.0 - checksum: f5ec2afbc1d5589fc45729209bdcaf01e3fc520fdac693557e62bd91cc8d6f915a6397c2f4d5f7a129ffc6c7511cb77eaf9e0932be1a70e39bed584ef7c86dbd - languageName: node - linkType: hard - -"vfile@npm:^5.0.0": - version: 5.3.6 - resolution: "vfile@npm:5.3.6" - dependencies: - "@types/unist": ^2.0.0 - is-buffer: ^2.0.0 - unist-util-stringify-position: ^3.0.0 - vfile-message: ^3.0.0 - checksum: 1aa5efff510bc6621ff8a7dc6513110529a11a8d665b44f169cc2a2b6bfa4f312efa00bfe86ca20e506538ff2915c8e538a664bd02a06419421ff964844fbe94 - languageName: node - linkType: hard - "video.js@npm:^7 || ^8, video.js@npm:^8.0.3": version: 8.0.3 resolution: "video.js@npm:8.0.3" @@ -9687,13 +8635,6 @@ __metadata: languageName: node linkType: hard -"web-namespaces@npm:^2.0.0": - version: 2.0.1 - resolution: "web-namespaces@npm:2.0.1" - checksum: b6d9f02f1a43d0ef0848a812d89c83801d5bbad57d8bb61f02eb6d7eb794c3736f6cc2e1191664bb26136594c8218ac609f4069722c6f56d9fc2d808fa9271c6 - languageName: node - linkType: hard - "web-streams-polyfill@npm:4.0.0-beta.3": version: 4.0.0-beta.3 resolution: "web-streams-polyfill@npm:4.0.0-beta.3" @@ -9701,13 +8642,6 @@ __metadata: languageName: node linkType: hard -"webidl-conversions@npm:^3.0.0": - version: 3.0.1 - resolution: "webidl-conversions@npm:3.0.1" - checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c - languageName: node - linkType: hard - "webpack-bundle-analyzer@npm:4.3.0": version: 4.3.0 resolution: "webpack-bundle-analyzer@npm:4.3.0" @@ -9727,16 +8661,6 @@ __metadata: languageName: node linkType: hard -"whatwg-url@npm:^5.0.0": - version: 5.0.0 - resolution: "whatwg-url@npm:5.0.0" - dependencies: - tr46: ~0.0.3 - webidl-conversions: ^3.0.0 - checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c - languageName: node - linkType: hard - "which-boxed-primitive@npm:^1.0.2": version: 1.0.2 resolution: "which-boxed-primitive@npm:1.0.2" @@ -9945,10 +8869,3 @@ __metadata: checksum: fc443abf5bc9deac0d4e375847e7914e44c7ffc9f7f09b60e466cb9bbbcf5a46706bf2f9c8b9e6e6c9a1c5aea0bd6123cbf9fbcd39788ae27d8494d505969ae8 languageName: node linkType: hard - -"zwitch@npm:^2.0.0, zwitch@npm:^2.0.4": - version: 2.0.4 - resolution: "zwitch@npm:2.0.4" - checksum: f22ec5fc2d5f02c423c93d35cdfa83573a3a3bd98c66b927c368ea4d0e7252a500df2a90a6b45522be536a96a73404393c958e945fdba95e6832c200791702b6 - languageName: node - linkType: hard From edb13ae716c1801c8f842ae64cf95c8c9ad8d69f Mon Sep 17 00:00:00 2001 From: ajnart Date: Fri, 10 Feb 2023 13:20:38 +0900 Subject: [PATCH 08/40] =?UTF-8?q?=F0=9F=9A=A7=20=20WIP=20on=20dynamic=20im?= =?UTF-8?q?ports?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/locales/en/modules/video-stream.json | 4 ++-- src/widgets/video/VideoStreamTile.tsx | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/public/locales/en/modules/video-stream.json b/public/locales/en/modules/video-stream.json index 3b84c3574..a35c740a3 100644 --- a/public/locales/en/modules/video-stream.json +++ b/public/locales/en/modules/video-stream.json @@ -4,8 +4,8 @@ "description": "Embed a video stream or video from a camera or a website", "settings": { "title": "Settings for video stream widget", - "cameraFeedUrl": { - "label": "Camera feed url" + "FeedUrl": { + "label": "Feed url" }, "autoPlay": { "label": "Auto play" diff --git a/src/widgets/video/VideoStreamTile.tsx b/src/widgets/video/VideoStreamTile.tsx index 028809f99..7db8a2c80 100644 --- a/src/widgets/video/VideoStreamTile.tsx +++ b/src/widgets/video/VideoStreamTile.tsx @@ -1,15 +1,17 @@ import { Center, Group, Stack, Title } from '@mantine/core'; import { IconDeviceCctv, IconHeartBroken } from '@tabler/icons'; import { useTranslation } from 'next-i18next'; +import dynamic from 'next/dynamic'; import { defineWidget } from '../helper'; import { IWidget } from '../widgets'; -import VideoFeed from './VideoFeed'; + +const VideoFeed = dynamic(() => import('./VideoFeed'), { ssr: false }); const definition = defineWidget({ id: 'video-stream', icon: IconDeviceCctv, options: { - cameraFeedUrl: { + FeedUrl: { type: 'text', defaultValue: '', }, @@ -43,7 +45,7 @@ interface VideoStreamWidgetProps { function VideoStreamWidget({ widget }: VideoStreamWidgetProps) { const { t } = useTranslation('modules/video-stream'); - if (!widget.properties.cameraFeedUrl) { + if (!widget.properties.FeedUrl) { return (
@@ -56,7 +58,7 @@ function VideoStreamWidget({ widget }: VideoStreamWidgetProps) { return ( Date: Fri, 10 Feb 2023 13:20:43 +0900 Subject: [PATCH 09/40] =?UTF-8?q?=F0=9F=9A=A7=20=20WIP=20on=20dynamic=20im?= =?UTF-8?q?ports?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/widgets/download-speed/Tile.tsx | 274 +++++++++++++++++ .../TorrentNetworkTrafficTile.tsx | 282 +----------------- 2 files changed, 282 insertions(+), 274 deletions(-) create mode 100644 src/widgets/download-speed/Tile.tsx diff --git a/src/widgets/download-speed/Tile.tsx b/src/widgets/download-speed/Tile.tsx new file mode 100644 index 000000000..1926b1c8d --- /dev/null +++ b/src/widgets/download-speed/Tile.tsx @@ -0,0 +1,274 @@ +import { + Avatar, + Box, + Card, + Group, + Stack, + Title, + Text, + Tooltip, + useMantineTheme, +} from '@mantine/core'; +import { useElementSize, useListState } from '@mantine/hooks'; +import { linearGradientDef } from '@nivo/core'; +import { Serie, Datum, ResponsiveLine } from '@nivo/line'; +import { IconDownload, IconUpload } from '@tabler/icons'; +import { useTranslation } from 'next-i18next'; +import { useEffect } from 'react'; +import { useConfigContext } from '../../config/provider'; +import { useGetDownloadClientsQueue } from '../../hooks/widgets/download-speed/useGetNetworkSpeed'; +import { useColorTheme } from '../../tools/color'; +import { humanFileSize } from '../../tools/humanFileSize'; +import { + NormalizedDownloadQueueResponse, + TorrentTotalDownload, +} from '../../types/api/downloads/queue/NormalizedDownloadQueueResponse'; +import definition, { ITorrentNetworkTraffic } from './TorrentNetworkTrafficTile'; + +interface TorrentNetworkTrafficTileProps { + widget: ITorrentNetworkTraffic; +} + +export default function TorrentNetworkTrafficTile({ widget }: TorrentNetworkTrafficTileProps) { + const { config } = useConfigContext(); + const { ref: refRoot, height: heightRoot } = useElementSize(); + const { ref: refTitle, height: heightTitle } = useElementSize(); + const { ref: refFooter, height: heightFooter } = useElementSize(); + const { primaryColor, secondaryColor } = useColorTheme(); + const { t } = useTranslation(`modules/${definition.id}`); + + const [clientDataHistory, setClientDataHistory] = useListState(); + + const { data, dataUpdatedAt } = useGetDownloadClientsQueue(); + + useEffect(() => { + if (data) { + setClientDataHistory.append(data); + } + + if (clientDataHistory.length < 30) { + return; + } + setClientDataHistory.remove(0); + }, [dataUpdatedAt]); + + if (!data) { + return null; + } + + const recoredAppsOverTime = clientDataHistory.flatMap((x) => x.apps.map((app) => app)); + + // removing duplicates the "naive" way: https://stackoverflow.com/a/9229821/15257712 + const uniqueRecordedAppsOverTime = recoredAppsOverTime + .map((x) => x.appId) + .filter((item, position) => recoredAppsOverTime.map((y) => y.appId).indexOf(item) === position); + + const lineChartData: Serie[] = uniqueRecordedAppsOverTime.flatMap((appId) => { + const records = recoredAppsOverTime.filter((x) => x.appId === appId); + + const series: Serie[] = [ + { + id: `download_${appId}`, + data: records.map((record, index) => ({ + x: index, + y: record.totalDownload, + })), + }, + ]; + + if (records.some((x) => x.type === 'torrent')) { + const torrentRecords = records.map((record, index): Datum | null => { + if (record.type !== 'torrent') { + return null; + } + + return { + x: index, + y: record.totalUpload, + }; + }); + const filteredRecords = torrentRecords.filter((x) => x !== null) as Datum[]; + series.push({ + id: `upload_${appId}`, + data: filteredRecords, + }); + } + + return series; + }); + + const totalDownload = uniqueRecordedAppsOverTime + .map((appId) => { + const records = recoredAppsOverTime.filter((x) => x.appId === appId); + const lastRecord = records.at(-1); + return lastRecord?.totalDownload ?? 0; + }) + .reduce((acc, n) => acc + n, 0); + + const totalUpload = uniqueRecordedAppsOverTime + .map((appId) => { + const records = recoredAppsOverTime.filter((x) => x.appId === appId && x.type === 'torrent'); + const lastRecord = records.at(-1) as TorrentTotalDownload; + return lastRecord?.totalUpload ?? 0; + }) + .reduce((acc, n) => acc + n, 0); + + const graphHeight = heightRoot - heightFooter - heightTitle; + + const { colors } = useMantineTheme(); + + return ( + + + + {t('card.lineChart.title')} + + + + { + const { points } = slice; + + const recordsFromPoints = uniqueRecordedAppsOverTime.map((appId) => { + const records = recoredAppsOverTime.filter((x) => x.appId === appId); + const point = points.find((x) => x.id.includes(appId)); + const pointIndex = Number(point?.data.x) ?? 0; + const color = point?.serieColor; + return { + record: records[pointIndex], + color, + }; + }); + + return ( + + + + {recordsFromPoints.map((entry, index) => { + const app = config?.apps.find((x) => x.id === entry.record.appId); + + if (!app) { + return null; + } + + return ( + + + + + {app.name} + + + + + {humanFileSize(entry.record.totalDownload, false)} + + + + {entry.record.type === 'torrent' && ( + + + + {humanFileSize(entry.record.totalUpload, false)} + + + )} + + + + ); + })} + + + + ); + }} + data={lineChartData} + curve="monotoneX" + yFormat=" >-.2f" + axisLeft={null} + axisBottom={null} + axisRight={null} + enablePoints={false} + enableGridX={false} + enableGridY={false} + enableArea + defs={[ + linearGradientDef('gradientA', [ + { offset: 0, color: 'inherit' }, + { offset: 100, color: 'inherit', opacity: 0 }, + ]), + ]} + colors={lineChartData.flatMap((data) => + data.id.toString().startsWith('upload_') + ? colors[secondaryColor][5] + : colors[primaryColor][5] + )} + fill={[{ match: '*', id: 'gradientA' }]} + margin={{ bottom: 5 }} + animate={false} + /> + + + + + + + + + {humanFileSize(totalDownload, false)} + + + + + + {humanFileSize(totalUpload, false)} + + + + + {uniqueRecordedAppsOverTime.map((appId, index) => { + const app = config?.apps.find((x) => x.id === appId); + + if (!app) { + return null; + } + + return ( + + + + ); + })} + + + + ); +} + +const AppAvatar = ({ iconUrl }: { iconUrl: string }) => { + const { colors, colorScheme } = useMantineTheme(); + + return ( + + ); +}; diff --git a/src/widgets/download-speed/TorrentNetworkTrafficTile.tsx b/src/widgets/download-speed/TorrentNetworkTrafficTile.tsx index 4a0feff0a..85d579a74 100644 --- a/src/widgets/download-speed/TorrentNetworkTrafficTile.tsx +++ b/src/widgets/download-speed/TorrentNetworkTrafficTile.tsx @@ -1,31 +1,13 @@ -import { - Avatar, - Box, - Card, - Group, - Stack, - Text, - Title, - Tooltip, - useMantineTheme, -} from '@mantine/core'; -import { useElementSize, useListState } from '@mantine/hooks'; -import { linearGradientDef } from '@nivo/core'; -import { Datum, ResponsiveLine, Serie } from '@nivo/line'; -import { IconArrowsUpDown, IconDownload, IconUpload } from '@tabler/icons'; -import { useTranslation } from 'next-i18next'; -import { useEffect } from 'react'; -import { useConfigContext } from '../../config/provider'; -import { useGetDownloadClientsQueue } from '../../hooks/widgets/download-speed/useGetNetworkSpeed'; -import { useColorTheme } from '../../tools/color'; -import { humanFileSize } from '../../tools/humanFileSize'; -import { - NormalizedDownloadQueueResponse, - TorrentTotalDownload, -} from '../../types/api/downloads/queue/NormalizedDownloadQueueResponse'; +import { IconArrowsUpDown } from '@tabler/icons'; + +import dynamic from 'next/dynamic'; import { defineWidget } from '../helper'; import { IWidget } from '../widgets'; +const torrentNetworkTrafficTile = dynamic(() => import('./Tile'), { + ssr: false, +}); + const definition = defineWidget({ id: 'dlspeed', icon: IconArrowsUpDown, @@ -37,257 +19,9 @@ const definition = defineWidget({ maxWidth: 12, maxHeight: 6, }, - component: TorrentNetworkTrafficTile, + component: torrentNetworkTrafficTile, }); export type ITorrentNetworkTraffic = IWidget<(typeof definition)['id'], typeof definition>; -interface TorrentNetworkTrafficTileProps { - widget: ITorrentNetworkTraffic; -} - -function TorrentNetworkTrafficTile({ widget }: TorrentNetworkTrafficTileProps) { - const { config } = useConfigContext(); - const { ref: refRoot, height: heightRoot } = useElementSize(); - const { ref: refTitle, height: heightTitle } = useElementSize(); - const { ref: refFooter, height: heightFooter } = useElementSize(); - const { primaryColor, secondaryColor } = useColorTheme(); - const { t } = useTranslation(`modules/${definition.id}`); - - const [clientDataHistory, setClientDataHistory] = useListState(); - - const { data, dataUpdatedAt } = useGetDownloadClientsQueue(); - - useEffect(() => { - if (data) { - setClientDataHistory.append(data); - } - - if (clientDataHistory.length < 30) { - return; - } - setClientDataHistory.remove(0); - }, [dataUpdatedAt]); - - if (!data) { - return null; - } - - const recoredAppsOverTime = clientDataHistory.flatMap((x) => x.apps.map((app) => app)); - - // removing duplicates the "naive" way: https://stackoverflow.com/a/9229821/15257712 - const uniqueRecordedAppsOverTime = recoredAppsOverTime - .map((x) => x.appId) - .filter((item, position) => recoredAppsOverTime.map((y) => y.appId).indexOf(item) === position); - - const lineChartData: Serie[] = uniqueRecordedAppsOverTime.flatMap((appId) => { - const records = recoredAppsOverTime.filter((x) => x.appId === appId); - - const series: Serie[] = [ - { - id: `download_${appId}`, - data: records.map((record, index) => ({ - x: index, - y: record.totalDownload, - })), - }, - ]; - - if (records.some((x) => x.type === 'torrent')) { - const torrentRecords = records.map((record, index): Datum | null => { - if (record.type !== 'torrent') { - return null; - } - - return { - x: index, - y: record.totalUpload, - }; - }); - const filteredRecords = torrentRecords.filter((x) => x !== null) as Datum[]; - series.push({ - id: `upload_${appId}`, - data: filteredRecords, - }); - } - - return series; - }); - - const totalDownload = uniqueRecordedAppsOverTime - .map((appId) => { - const records = recoredAppsOverTime.filter((x) => x.appId === appId); - const lastRecord = records.at(-1); - return lastRecord?.totalDownload ?? 0; - }) - .reduce((acc, n) => acc + n, 0); - - const totalUpload = uniqueRecordedAppsOverTime - .map((appId) => { - const records = recoredAppsOverTime.filter((x) => x.appId === appId && x.type === 'torrent'); - const lastRecord = records.at(-1) as TorrentTotalDownload; - return lastRecord?.totalUpload ?? 0; - }) - .reduce((acc, n) => acc + n, 0); - - const graphHeight = heightRoot - heightFooter - heightTitle; - - const { colors } = useMantineTheme(); - - return ( - - - - {t('card.lineChart.title')} - - - - { - const { points } = slice; - - const recordsFromPoints = uniqueRecordedAppsOverTime.map((appId) => { - const records = recoredAppsOverTime.filter((x) => x.appId === appId); - const point = points.find((x) => x.id.includes(appId)); - const pointIndex = Number(point?.data.x) ?? 0; - const color = point?.serieColor; - return { - record: records[pointIndex], - color, - }; - }); - - return ( - - - - {recordsFromPoints.map((entry, index) => { - const app = config?.apps.find((x) => x.id === entry.record.appId); - - if (!app) { - return null; - } - - return ( - - - - - {app.name} - - - - - {humanFileSize(entry.record.totalDownload, false)} - - - - {entry.record.type === 'torrent' && ( - - - - {humanFileSize(entry.record.totalUpload, false)} - - - )} - - - - ); - })} - - - - ); - }} - data={lineChartData} - curve="monotoneX" - yFormat=" >-.2f" - axisLeft={null} - axisBottom={null} - axisRight={null} - enablePoints={false} - enableGridX={false} - enableGridY={false} - enableArea - defs={[ - linearGradientDef('gradientA', [ - { offset: 0, color: 'inherit' }, - { offset: 100, color: 'inherit', opacity: 0 }, - ]), - ]} - colors={lineChartData.flatMap((data) => - data.id.toString().startsWith('upload_') - ? colors[secondaryColor][5] - : colors[primaryColor][5] - )} - fill={[{ match: '*', id: 'gradientA' }]} - margin={{ bottom: 5 }} - animate={false} - /> - - - - - - - - - {humanFileSize(totalDownload, false)} - - - - - - {humanFileSize(totalUpload, false)} - - - - - {uniqueRecordedAppsOverTime.map((appId, index) => { - const app = config?.apps.find((x) => x.id === appId); - - if (!app) { - return null; - } - - return ( - - - - ); - })} - - - - ); -} - -const AppAvatar = ({ iconUrl }: { iconUrl: string }) => { - const { colors, colorScheme } = useMantineTheme(); - - return ( - - ); -}; - export default definition; From a05e80bf2681a79080d6396025293c2edb09068d Mon Sep 17 00:00:00 2001 From: MauriceNino Date: Fri, 10 Feb 2023 18:20:28 +0100 Subject: [PATCH 10/40] Add options to sort and resize graphs in dash. widget --- package.json | 2 +- .../Dashboard/Tiles/Widgets/DraggableList.tsx | 119 ++++++++++ .../Tiles/Widgets/WidgetsEditModal.tsx | 106 ++++++--- .../Dashboard/Tiles/Widgets/WidgetsMenu.tsx | 1 + .../Wrappers/Category/useCategoryActions.tsx | 44 ++-- src/widgets/dashDot/DashDotCompactNetwork.tsx | 2 +- src/widgets/dashDot/DashDotCompactStorage.tsx | 2 +- src/widgets/dashDot/DashDotGraph.tsx | 69 +++--- src/widgets/dashDot/DashDotTile.tsx | 206 +++++++++++------- src/widgets/widgets.ts | 27 ++- yarn.lock | 78 ++----- 11 files changed, 436 insertions(+), 220 deletions(-) create mode 100644 src/components/Dashboard/Tiles/Widgets/DraggableList.tsx diff --git a/package.json b/package.json index 6a5469457..2fbcf5ff4 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "dockerode": "^3.3.2", "embla-carousel-react": "^7.0.0", "fily-publish-gridstack": "^0.0.13", - "framer-motion": "^6.5.1", + "framer-motion": "^9.0.2", "i18next": "^21.9.1", "i18next-browser-languagedetector": "^6.1.5", "i18next-http-backend": "^1.4.1", diff --git a/src/components/Dashboard/Tiles/Widgets/DraggableList.tsx b/src/components/Dashboard/Tiles/Widgets/DraggableList.tsx new file mode 100644 index 000000000..ae6d68998 --- /dev/null +++ b/src/components/Dashboard/Tiles/Widgets/DraggableList.tsx @@ -0,0 +1,119 @@ +import { Collapse, createStyles, Stack, Text } from '@mantine/core'; +import { IconChevronDown, IconGripVertical } from '@tabler/icons'; +import { Reorder, useDragControls } from 'framer-motion'; +import { FC, ReactNode, useState } from 'react'; +import { IDraggableListInputValue } from '../../../../widgets/widgets'; + +const useStyles = createStyles((theme) => ({ + container: { + display: 'flex', + flexDirection: 'column', + borderRadius: theme.radius.md, + border: `1px solid ${ + theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors.gray[2] + }`, + backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.white, + marginBottom: theme.spacing.xs, + gap: theme.spacing.xs, + }, + row: { + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + padding: '12px 16px', + gap: theme.spacing.sm, + }, + middle: { + flexGrow: 1, + }, + symbol: { + fontSize: 16, + }, + clickableIcons: { + color: theme.colorScheme === 'dark' ? theme.colors.dark[1] : theme.colors.gray[6], + cursor: 'pointer', + userSelect: 'none', + transition: 'transform .3s ease-in-out', + }, + rotate: { + transform: 'rotate(180deg)', + }, + collapseContent: { + padding: '12px 16px', + }, +})); + +type DraggableListParams = { + value: IDraggableListInputValue['defaultValue']; + onChange: (value: IDraggableListInputValue['defaultValue']) => void; + labels: Record; + children?: Record; +}; + +export const DraggableList: FC = (props) => { + const keys = props.value.map((v) => v.key); + + return ( +
+ + props.onChange(order.map((key) => props.value.find((v) => v.key === key)!)) + } + as="div" + > + {props.value.map((item) => ( + + {props.children?.[item.key]} + + ))} + +
+ ); +}; + +const ListItem: FC<{ + item: IDraggableListInputValue['defaultValue'][number]; + label: string; +}> = (props) => { + const { classes, cx } = useStyles(); + const controls = useDragControls(); + + const [showContent, setShowContent] = useState(false); + const hasContent = props.children != null && Object.keys(props.children).length !== 0; + + return ( + +
+
+ controls.start(e)} + size={18} + stroke={1.5} + /> + +
+ {props.label} +
+ + {hasContent && ( + setShowContent(!showContent)} + size={18} + stroke={1.5} + /> + )} +
+ + {hasContent && ( + + {props.children} + + )} +
+
+ ); +}; diff --git a/src/components/Dashboard/Tiles/Widgets/WidgetsEditModal.tsx b/src/components/Dashboard/Tiles/Widgets/WidgetsEditModal.tsx index 62a2550a4..3d53a395a 100644 --- a/src/components/Dashboard/Tiles/Widgets/WidgetsEditModal.tsx +++ b/src/components/Dashboard/Tiles/Widgets/WidgetsEditModal.tsx @@ -3,24 +3,25 @@ import { Button, Group, MultiSelect, + NumberInput, + Select, + Slider, Stack, Switch, - TextInput, Text, - NumberInput, - Slider, - Select, + TextInput, } from '@mantine/core'; import { ContextModalProps } from '@mantine/modals'; import { IconAlertTriangle } from '@tabler/icons'; import { Trans, useTranslation } from 'next-i18next'; -import { useState } from 'react'; -import Widgets from '../../../../widgets'; -import type { IWidgetOptionValue } from '../../../../widgets/widgets'; +import { FC, useState } from 'react'; import { useConfigContext } from '../../../../config/provider'; import { useConfigStore } from '../../../../config/store'; -import { IWidget } from '../../../../widgets/widgets'; import { useColorTheme } from '../../../../tools/color'; +import Widgets from '../../../../widgets'; +import type { IDraggableListInputValue, IWidgetOptionValue } from '../../../../widgets/widgets'; +import { IWidget } from '../../../../widgets/widgets'; +import { DraggableList } from './DraggableList'; export type WidgetEditModalInnerProps = { widgetId: string; @@ -93,7 +94,17 @@ export const WidgetsEditModal = ({ ); } - return WidgetOptionTypeSwitch(option, index, t, key, value, handleChange); + + return ( + + ); })} - - - - setSearchTerm(event.currentTarget.value)} - placeholder={t('iconPicker.textInputPlaceholder')} - variant="filled" - rightSection={ - setSearchTerm('')}> - - - } - /> - - - - {slicedFilteredItems.map((item) => ( - onChange(item)} size={40} p={3}> - - - ))} - - - {isTruncated && ( - - - - {t('iconPicker.searchLimitationTitle', { max: ICON_PICKER_SLICE_LIMIT })} - - - {t('iconPicker.searchLimitationMessage', { max: ICON_PICKER_SLICE_LIMIT })} - - - )} - - - - - ); -}; - -const useStyles = createStyles(() => ({ - flameIcon: { - margin: '0 auto', - }, - icon: { - width: '100%', - height: '100%', - objectFit: 'contain', - }, - actionIcon: { - alignSelf: 'end', - }, -})); diff --git a/src/hooks/icons/useGetDashboardIcons.tsx b/src/hooks/icons/useGetDashboardIcons.tsx new file mode 100644 index 000000000..854322693 --- /dev/null +++ b/src/hooks/icons/useGetDashboardIcons.tsx @@ -0,0 +1,14 @@ +import { useQuery } from '@tanstack/react-query'; +import { NormalizedIconRepositoryResult } from '../../tools/server/images/abstract-icons-repository'; + +export const useGetDashboardIcons = () => + useQuery({ + queryKey: ['repository-icons'], + queryFn: async () => { + const response = await fetch('/api/icons/'); + const data = await response.json(); + return data as NormalizedIconRepositoryResult[]; + }, + refetchOnMount: false, + refetchOnWindowFocus: false, + }); diff --git a/src/hooks/useRepositoryIconsQuery.ts b/src/hooks/useRepositoryIconsQuery.ts deleted file mode 100644 index 0db02254b..000000000 --- a/src/hooks/useRepositoryIconsQuery.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { useQuery } from '@tanstack/react-query'; -import { IconSelectorItem } from '../types/iconSelector/iconSelectorItem'; - -export const useRepositoryIconsQuery = ({ - url, - converter, -}: { - url: string; - converter: (value: TRepositoryIcon) => IconSelectorItem; -}) => - useQuery({ - queryKey: ['repository-icons', { url }], - queryFn: async () => fetchRepositoryIcons(url), - select(data) { - return data.map((x) => converter(x)); - }, - refetchOnWindowFocus: false, - }); - -const fetchRepositoryIcons = async ( - url: string -): Promise => { - const response = await fetch( - 'https://api.github.com/repos/walkxcode/Dashboard-Icons/contents/png' - ); - return response.json(); -}; diff --git a/src/pages/api/getLocalImages.ts b/src/pages/api/getLocalImages.ts deleted file mode 100644 index 94fea61c0..000000000 --- a/src/pages/api/getLocalImages.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { NextApiRequest, NextApiResponse } from 'next'; -import fs from 'fs'; - -function Get(req: NextApiRequest, res: NextApiResponse) { - // Get the name of all the files in the /public/icons folder handle if the folder doesn't exist - if (!fs.existsSync('./public/icons')) { - return res.status(200).json({ - files: [], - }); - } - const files = fs.readdirSync('./public/icons'); - // Return the list of files with the /public/icons prefix - return res.status(200).json({ - files: files.map((file) => `/icons/${file}`), - }); -} - -export default async (req: NextApiRequest, res: NextApiResponse) => { - // Filter out if the reuqest is a POST or a GET - if (req.method === 'GET') { - return Get(req, res); - } - return res.status(405).json({ - statusCode: 405, - message: 'Method not allowed', - }); -}; diff --git a/src/pages/api/icons/index.ts b/src/pages/api/icons/index.ts new file mode 100644 index 000000000..7b1c6a4f9 --- /dev/null +++ b/src/pages/api/icons/index.ts @@ -0,0 +1,27 @@ +import { NextApiRequest, NextApiResponse } from 'next'; +import { JsdelivrIconsRepository } from '../../../tools/server/images/jsdelivr-icons-repository'; +import { LocalIconsRepository } from '../../../tools/server/images/local-icons-repository'; +import { UnpkgIconsRepository } from '../../../tools/server/images/unpkg-icons-repository'; + +const Get = async (request: NextApiRequest, response: NextApiResponse) => { + const respositories = [ + new LocalIconsRepository(), + new JsdelivrIconsRepository(JsdelivrIconsRepository.tablerRepository, 'Walkxcode Dashboard Icons', 'Walkxcode on Github'), + new UnpkgIconsRepository(UnpkgIconsRepository.tablerRepository, 'Tabler Icons', 'Tabler Icons - GitHub (MIT)'), + new JsdelivrIconsRepository(JsdelivrIconsRepository.papirusRepository, 'Papirus Icons', 'Papirus Development Team on GitHub (Apache 2.0)'), + new JsdelivrIconsRepository(JsdelivrIconsRepository.homelabSvgAssetsRepository, 'Homelab Svg Assets', 'loganmarchione on GitHub (MIT)'), + ]; + const fetches = respositories.map((rep) => rep.fetch()); + const data = await Promise.all(fetches); + return response.status(200).json(data); +}; + +export default async (request: NextApiRequest, response: NextApiResponse) => { + if (request.method === 'GET') { + return Get(request, response); + } + return response.status(405).json({ + statusCode: 405, + message: 'Method not allowed', + }); +}; diff --git a/src/pages/api/imageproxy.ts b/src/pages/api/imageproxy.ts deleted file mode 100644 index 575960467..000000000 --- a/src/pages/api/imageproxy.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NextApiRequest, NextApiResponse } from 'next'; - -export default async (req: NextApiRequest, res: NextApiResponse) => { - const url = decodeURIComponent(req.query.url as string); - const result = await fetch(url); - const body = await result.body; - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - body.pipe(res); -}; diff --git a/src/tools/server/images/abstract-icons-repository.ts b/src/tools/server/images/abstract-icons-repository.ts new file mode 100644 index 000000000..e6cef53a8 --- /dev/null +++ b/src/tools/server/images/abstract-icons-repository.ts @@ -0,0 +1,32 @@ +export abstract class AbstractIconRepository { + constructor(readonly copyright?: string) {} + + async fetch(): Promise { + try { + return await this.fetchInternally(); + } catch (err) { + return { + success: false, + count: 0, + entries: [], + name: '', + copyright: this.copyright, + }; + } + } + protected abstract fetchInternally(): Promise; +} + +export type NormalizedIconRepositoryResult = { + name: string; + success: boolean; + count: number; + copyright: string | undefined; + entries: NormalizedIcon[]; +}; + +export type NormalizedIcon = { + url: string; + name: string; + size: number; +}; diff --git a/src/tools/server/images/jsdelivr-icons-repository.ts b/src/tools/server/images/jsdelivr-icons-repository.ts new file mode 100644 index 000000000..734f49853 --- /dev/null +++ b/src/tools/server/images/jsdelivr-icons-repository.ts @@ -0,0 +1,71 @@ +import { + AbstractIconRepository, + NormalizedIcon, + NormalizedIconRepositoryResult, +} from './abstract-icons-repository'; + +export class JsdelivrIconsRepository extends AbstractIconRepository { + static readonly tablerRepository = { + api: 'https://data.jsdelivr.com/v1/packages/gh/walkxcode/dashboard-icons@main?structure=flat', + blob: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/{0}/{1}', + } as JsdelivrRepositoryUrl; + + static readonly papirusRepository = { + api: 'https://data.jsdelivr.com/v1/packages/gh/PapirusDevelopmentTeam/papirus_icons@master?structure=flat', + blob: 'https://cdn.jsdelivr.net/gh/PapirusDevelopmentTeam/papirus_icons/src/{1}', + } as JsdelivrRepositoryUrl; + + static readonly homelabSvgAssetsRepository = { + api: 'https://data.jsdelivr.com/v1/packages/gh/loganmarchione/homelab-svg-assets@main?structure=flat', + blob: 'https://cdn.jsdelivr.net/gh/loganmarchione/homelab-svg-assets/assets/{1}', + } as JsdelivrRepositoryUrl; + + constructor( + private readonly repository: JsdelivrRepositoryUrl, + private readonly displayName: string, + copyright: string, + ) { + super(copyright); + } + + protected async fetchInternally(): Promise { + const response = await fetch(this.repository.api); + const body = (await response.json()) as JsdelivrResponse; + + const normalizedEntries = body.files + .filter((file) => !['_banner.png', '_logo.png'].some((x) => file.name.includes(x))) + .filter((file) => ['.png', '.svg'].some((x) => file.name.endsWith(x))) + .map((file): NormalizedIcon => { + const fileNameParts = file.name.split('/'); + const fileName = fileNameParts[fileNameParts.length - 1]; + const extensions = fileName.split('.')[1]; + return { + url: this.repository.blob.replace('{0}', extensions).replace('{1}', fileName), + name: fileName, + size: file.size, + }; + }); + + return { + entries: normalizedEntries, + count: normalizedEntries.length, + success: true, + name: this.displayName, + copyright: this.copyright, + }; + } +} + +type JsdelivrRepositoryUrl = { + api: string; + blob: string; +}; + +type JsdelivrResponse = { + files: JsdelivrFile[]; +}; + +type JsdelivrFile = { + name: string; + size: number; +}; diff --git a/src/tools/server/images/local-icons-repository.ts b/src/tools/server/images/local-icons-repository.ts new file mode 100644 index 000000000..a19079443 --- /dev/null +++ b/src/tools/server/images/local-icons-repository.ts @@ -0,0 +1,44 @@ +import fs from 'fs'; +import { + AbstractIconRepository, + NormalizedIcon, + NormalizedIconRepositoryResult, +} from './abstract-icons-repository'; + +export class LocalIconsRepository extends AbstractIconRepository { + constructor() { + super(''); + } + + protected async fetchInternally(): Promise { + if (!fs.existsSync('./public/icons')) { + return { + count: 0, + entries: [], + name: 'Local', + success: true, + copyright: this.copyright, + }; + } + + const files = fs.readdirSync('./public/icons'); + + const normalizedEntries = files + .filter((file) => ['.png', '.svg', '.jpeg', '.jpg'].some((x) => file.endsWith(x))) + .map( + (file): NormalizedIcon => ({ + name: file, + url: `./icons/${file}`, + size: 0, + }) + ); + + return { + entries: normalizedEntries, + count: normalizedEntries.length, + success: true, + name: 'Local', + copyright: this.copyright, + }; + } +} diff --git a/src/tools/server/images/unpkg-icons-repository.ts b/src/tools/server/images/unpkg-icons-repository.ts new file mode 100644 index 000000000..c57e020a4 --- /dev/null +++ b/src/tools/server/images/unpkg-icons-repository.ts @@ -0,0 +1,52 @@ +import { + AbstractIconRepository, + NormalizedIcon, + NormalizedIconRepositoryResult, +} from './abstract-icons-repository'; + +export class UnpkgIconsRepository extends AbstractIconRepository { + static tablerRepository = 'https://unpkg.com/@tabler/icons-png@2.0.0-beta/icons/'; + + constructor( + private readonly repository: string, + private readonly displayName: string, + copyright: string + ) { + super(copyright); + } + + protected async fetchInternally(): Promise { + const response = await fetch(`${this.repository}?meta`); + const body = (await response.json()) as UnpkgResponse; + + const normalizedEntries = body.files + .filter((file) => file.type === 'file') + .map((file): NormalizedIcon => { + const fileName = file.path.replace('/icons/', ''); + const url = `${this.repository}${fileName}`; + return { + name: fileName, + url, + size: file.size, + }; + }); + + return { + entries: normalizedEntries, + count: normalizedEntries.length, + success: true, + name: this.displayName, + copyright: this.copyright, + }; + } +} + +type UnpkgResponse = { + files: UnpkgFile[]; +}; + +type UnpkgFile = { + path: string; + type: string; + size: number; +}; diff --git a/src/tools/server/translation-namespaces.ts b/src/tools/server/translation-namespaces.ts index 3e819398d..5fe821c3f 100644 --- a/src/tools/server/translation-namespaces.ts +++ b/src/tools/server/translation-namespaces.ts @@ -3,7 +3,6 @@ export const dashboardNamespaces = [ 'layout/element-selector/selector', 'layout/modals/add-app', 'layout/modals/change-position', - 'layout/modals/icon-picker', 'layout/modals/about', 'layout/header/actions/toggle-edit-mode', 'layout/mobile/drawer', diff --git a/src/types/iconSelector/iconSelectorItem.ts b/src/types/iconSelector/iconSelectorItem.ts deleted file mode 100644 index 4056bc21c..000000000 --- a/src/types/iconSelector/iconSelectorItem.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface IconSelectorItem { - url: string; - fileName: string; -} diff --git a/src/types/iconSelector/repositories/walkxcodeIconRepository.ts b/src/types/iconSelector/repositories/walkxcodeIconRepository.ts deleted file mode 100644 index 70aab46aa..000000000 --- a/src/types/iconSelector/repositories/walkxcodeIconRepository.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface WalkxcodeRepositoryIcon { - name: string; -} From f56f4b33cea0d28e8ba2ece18d19fbf7c934d15a Mon Sep 17 00:00:00 2001 From: Manuel <30572287+manuel-rw@users.noreply.github.com> Date: Wed, 22 Feb 2023 21:59:49 +0100 Subject: [PATCH 38/40] =?UTF-8?q?=E2=9C=A8=20Add=20disable=20edit=20mode?= =?UTF-8?q?=20environment=20variable=20(#730)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/locales/en/layout/modals/about.json | 3 +- .../Modals/AboutModal/AboutModal.tsx | 36 ++++++++++++++++- src/components/layout/header/Header.tsx | 13 +++++-- src/components/layout/header/SettingsMenu.tsx | 10 +++-- src/hooks/useEditModeInformation.ts | 11 ++++++ src/pages/_app.tsx | 39 ++++++++++++++----- src/pages/api/configs/[slug].ts | 9 +++++ 7 files changed, 103 insertions(+), 18 deletions(-) create mode 100644 src/hooks/useEditModeInformation.ts diff --git a/public/locales/en/layout/modals/about.json b/public/locales/en/layout/modals/about.json index 2263dc21f..aa99318db 100644 --- a/public/locales/en/layout/modals/about.json +++ b/public/locales/en/layout/modals/about.json @@ -8,6 +8,7 @@ "version": "Version", "nodeEnvironment": "Node environment", "i18n": "Loaded I18n translation namespaces", - "locales": "Configured I18n locales" + "locales": "Configured I18n locales", + "experimental_disableEditMode": "EXPERIMENTAL: Disable edit mode" } } \ No newline at end of file diff --git a/src/components/Dashboard/Modals/AboutModal/AboutModal.tsx b/src/components/Dashboard/Modals/AboutModal/AboutModal.tsx index 3d36ca722..8f366fd9f 100644 --- a/src/components/Dashboard/Modals/AboutModal/AboutModal.tsx +++ b/src/components/Dashboard/Modals/AboutModal/AboutModal.tsx @@ -9,6 +9,7 @@ import { Group, HoverCard, Modal, + Stack, Table, Text, Title, @@ -18,6 +19,7 @@ import { IconBrandDiscord, IconBrandGithub, IconFile, + IconKey, IconLanguage, IconSchema, IconVersions, @@ -31,6 +33,7 @@ import Image from 'next/image'; import { ReactNode } from 'react'; import { useConfigContext } from '../../../../config/provider'; import { useConfigStore } from '../../../../config/store'; +import { useEditModeInformationStore } from '../../../../hooks/useEditModeInformation'; import { usePackageAttributesStore } from '../../../../tools/client/zustands/usePackageAttributesStore'; import { usePrimaryGradient } from '../../../layout/useGradient'; import Credits from '../../../Settings/Common/Credits'; @@ -82,10 +85,17 @@ export const AboutModal = ({ opened, closeModal, newVersionAvailable }: AboutMod {item.icon} - {t(`layout/modals/about:metrics.${item.label}`)} + + }} + /> + - {item.content} + + {item.content} + ))} @@ -153,12 +163,34 @@ interface ExtendedInitOptions extends InitOptions { const useInformationTableItems = (newVersionAvailable?: string): InformationTableItem[] => { const colorGradiant = usePrimaryGradient(); const { attributes } = usePackageAttributesStore(); + const { editModeEnabled } = useEditModeInformationStore(); const { configVersion } = useConfigContext(); const { configs } = useConfigStore(); let items: InformationTableItem[] = []; + if (editModeEnabled) { + items = [ + ...items, + { + icon: , + label: 'experimental_disableEditMode', + content: ( + + WARNING + + This is an experimental feature, where the edit mode is disabled entirely - no config + modifications are possbile anymore. All update requests for the config will be dropped + on the API. This will be removed in future versions, as Homarr will receive a proper + authentication system, which will make this obsolete. + + + ), + }, + ]; + } + if (i18n !== null) { const usedI18nNamespaces = i18n.reportNamespaces.getUsedNamespaces(); const initOptions = i18n.options as ExtendedInitOptions; diff --git a/src/components/layout/header/Header.tsx b/src/components/layout/header/Header.tsx index 52c47bc17..44bb12b51 100644 --- a/src/components/layout/header/Header.tsx +++ b/src/components/layout/header/Header.tsx @@ -1,6 +1,7 @@ import { Box, createStyles, Group, Header as MantineHeader, Indicator } from '@mantine/core'; import { useQuery } from '@tanstack/react-query'; import { REPO_URL } from '../../../../data/constants'; +import { useEditModeInformationStore } from '../../../hooks/useEditModeInformation'; import DockerMenuButton from '../../../modules/Docker/DockerModule'; import { usePackageAttributesStore } from '../../../tools/client/zustands/usePackageAttributesStore'; import { Logo } from '../Logo'; @@ -15,8 +16,9 @@ export function Header(props: any) { const { classes } = useStyles(); const { classes: cardClasses, cx } = useCardStyles(false); const { attributes } = usePackageAttributesStore(); + const { editModeEnabled } = useEditModeInformationStore(); - const { isLoading, error, data } = useQuery({ + const { data } = useQuery({ queryKey: ['github/latest'], cacheTime: 1000 * 60 * 60 * 24, staleTime: 1000 * 60 * 60 * 5, @@ -32,9 +34,14 @@ export function Header(props: any) { - + - + {!editModeEnabled && } @@ -24,9 +26,11 @@ export function SettingsMenu({ newVersionAvailable }: { newVersionAvailable: str - } onClick={drawer.open}> - {t('sections.settings')} - + {!editModeEnabled && ( + } onClick={drawer.open}> + {t('sections.settings')} + + )} } rightSection={ diff --git a/src/hooks/useEditModeInformation.ts b/src/hooks/useEditModeInformation.ts new file mode 100644 index 000000000..c59edc86c --- /dev/null +++ b/src/hooks/useEditModeInformation.ts @@ -0,0 +1,11 @@ +import { create } from 'zustand'; + +interface EditModeInformationStore { + editModeEnabled: boolean; + setDisabled: () => void; +} + +export const useEditModeInformationStore = create((set) => ({ + editModeEnabled: false, + setDisabled: () => set(() => ({ editModeEnabled: true })), +})); diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 81107b5f4..e55dd6bef 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,15 +1,17 @@ import { ColorScheme, ColorSchemeProvider, MantineProvider, MantineTheme } from '@mantine/core'; import { useColorScheme, useHotkeys, useLocalStorage } from '@mantine/hooks'; import { ModalsProvider } from '@mantine/modals'; +import Consola from 'consola'; import { NotificationsProvider } from '@mantine/notifications'; import { QueryClientProvider } from '@tanstack/react-query'; +import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; import { getCookie } from 'cookies-next'; import { GetServerSidePropsContext } from 'next'; import { appWithTranslation } from 'next-i18next'; import { AppProps } from 'next/app'; import Head from 'next/head'; import { useEffect, useState } from 'react'; -import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; +import 'video.js/dist/video-js.css'; import { ChangeAppPositionModal } from '../components/Dashboard/Modals/ChangePosition/ChangeAppPositionModal'; import { ChangeWidgetPositionModal } from '../components/Dashboard/Modals/ChangePosition/ChangeWidgetPositionModal'; import { EditAppModal } from '../components/Dashboard/Modals/EditAppModal/EditAppModal'; @@ -18,21 +20,25 @@ import { WidgetsEditModal } from '../components/Dashboard/Tiles/Widgets/WidgetsE import { WidgetsRemoveModal } from '../components/Dashboard/Tiles/Widgets/WidgetsRemoveModal'; import { CategoryEditModal } from '../components/Dashboard/Wrappers/Category/CategoryEditModal'; import { ConfigProvider } from '../config/provider'; +import { usePackageAttributesStore } from '../tools/client/zustands/usePackageAttributesStore'; import { ColorTheme } from '../tools/color'; import { queryClient } from '../tools/queryClient'; -import { theme } from '../tools/theme'; import { getServiceSidePackageAttributes, ServerSidePackageAttributesType, } from '../tools/server/getPackageVersion'; -import { usePackageAttributesStore } from '../tools/client/zustands/usePackageAttributesStore'; -import 'video.js/dist/video-js.css'; +import { theme } from '../tools/theme'; +import { useEditModeInformationStore } from '../hooks/useEditModeInformation'; import '../styles/global.scss'; function App( this: any, - props: AppProps & { colorScheme: ColorScheme; packageAttributes: ServerSidePackageAttributesType } + props: AppProps & { + colorScheme: ColorScheme; + packageAttributes: ServerSidePackageAttributesType; + editModeEnabled: boolean; + } ) { const { Component, pageProps } = props; const [primaryColor, setPrimaryColor] = useState('red'); @@ -57,9 +63,14 @@ function App( }); const { setInitialPackageAttributes } = usePackageAttributesStore(); + const { setDisabled } = useEditModeInformationStore(); useEffect(() => { setInitialPackageAttributes(props.packageAttributes); + + if (!props.editModeEnabled) { + setDisabled(); + } }, []); const toggleColorScheme = (value?: ColorScheme) => @@ -125,9 +136,19 @@ function App( ); } -App.getInitialProps = ({ ctx }: { ctx: GetServerSidePropsContext }) => ({ - colorScheme: getCookie('color-scheme', ctx) || 'light', - packageAttributes: getServiceSidePackageAttributes(), -}); +App.getInitialProps = ({ ctx }: { ctx: GetServerSidePropsContext }) => { + const disableEditMode = + process.env.DISABLE_EDIT_MODE && process.env.DISABLE_EDIT_MODE.toLowerCase() === 'true'; + if (disableEditMode) { + Consola.warn( + 'EXPERIMENTAL: You have disabled the edit mode. Modifications are no longer possible and any requests on the API will be dropped. If you want to disable this, unset the DISABLE_EDIT_MODE environment variable. This behaviour may be removed in future versions of Homarr' + ); + } + return { + colorScheme: getCookie('color-scheme', ctx) || 'light', + packageAttributes: getServiceSidePackageAttributes(), + editModeEnabled: !disableEditMode, + }; +}; export default appWithTranslation(App); diff --git a/src/pages/api/configs/[slug].ts b/src/pages/api/configs/[slug].ts index 414c74c5d..7050413f6 100644 --- a/src/pages/api/configs/[slug].ts +++ b/src/pages/api/configs/[slug].ts @@ -1,13 +1,22 @@ import fs from 'fs'; + import path from 'path'; + import Consola from 'consola'; + import { NextApiRequest, NextApiResponse } from 'next'; + import { BackendConfigType, ConfigType } from '../../../types/config'; import { getConfig } from '../../../tools/config/getConfig'; function Put(req: NextApiRequest, res: NextApiResponse) { + if (process.env.DISABLE_EDIT_MODE === 'true') { + return res.status(409).json({ error: 'Edit mode has been disabled by the administrator' }); + } + // Get the slug of the request const { slug } = req.query as { slug: string }; + // Get the body of the request const { body: config }: { body: ConfigType } = req; if (!slug || !config) { From fddcfb3f06b850a4bf575ba8dc1fe014cf45b204 Mon Sep 17 00:00:00 2001 From: Mauz Date: Wed, 22 Feb 2023 22:04:09 +0100 Subject: [PATCH 39/40] =?UTF-8?q?=F0=9F=9A=91=20Fix=20Error=20with=20lates?= =?UTF-8?q?t=20Dashdot=20changes=20(#725)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dashboard/Wrappers/WrapperContent.tsx | 9 ++-- src/widgets/WidgetWrapper.tsx | 46 +++++++++++++++---- src/widgets/calendar/CalendarTile.tsx | 4 +- src/widgets/dashDot/DashDotTile.tsx | 2 +- 4 files changed, 47 insertions(+), 14 deletions(-) diff --git a/src/components/Dashboard/Wrappers/WrapperContent.tsx b/src/components/Dashboard/Wrappers/WrapperContent.tsx index 5a864b6ab..1d1d3ad87 100644 --- a/src/components/Dashboard/Wrappers/WrapperContent.tsx +++ b/src/components/Dashboard/Wrappers/WrapperContent.tsx @@ -57,9 +57,12 @@ export function WrapperContent({ apps, refs, widgets }: WrapperContentProps) { {...widget.shape[shapeSize]?.location} {...widget.shape[shapeSize]?.size} > - - - + ); })} diff --git a/src/widgets/WidgetWrapper.tsx b/src/widgets/WidgetWrapper.tsx index da0837307..bb7323073 100644 --- a/src/widgets/WidgetWrapper.tsx +++ b/src/widgets/WidgetWrapper.tsx @@ -1,4 +1,5 @@ -import { ReactNode } from 'react'; +import { ComponentType, useMemo } from 'react'; +import Widgets from '.'; import { HomarrCardWrapper } from '../components/Dashboard/Tiles/HomarrCardWrapper'; import { WidgetsMenu } from '../components/Dashboard/Tiles/Widgets/WidgetsMenu'; import { IWidget } from './widgets'; @@ -7,12 +8,41 @@ interface WidgetWrapperProps { widgetId: string; widget: IWidget; className: string; - children: ReactNode; + WidgetComponent: ComponentType<{ widget: IWidget }>; } -export const WidgetWrapper = ({ widgetId, widget, className, children }: WidgetWrapperProps) => ( - - - {children} - -); +// If a property has no value, set it to the default value +const useWidget = >(widget: T): T => { + const definition = Widgets[widget.id as keyof typeof Widgets]; + + return useMemo(() => { + const newProps = { ...widget.properties }; + + Object.entries(definition.options).forEach(([key, option]) => { + if (newProps[key] == null) { + newProps[key] = option.defaultValue; + } + }); + + return { + ...widget, + properties: newProps, + }; + }, [widget]); +}; + +export const WidgetWrapper = ({ + widgetId, + widget, + className, + WidgetComponent, +}: WidgetWrapperProps) => { + const widgetWithDefaultProps = useWidget(widget); + + return ( + + + + + ); +}; diff --git a/src/widgets/calendar/CalendarTile.tsx b/src/widgets/calendar/CalendarTile.tsx index f06ca88d2..edd4b6672 100644 --- a/src/widgets/calendar/CalendarTile.tsx +++ b/src/widgets/calendar/CalendarTile.tsx @@ -43,7 +43,7 @@ const definition = defineWidget({ component: CalendarTile, }); -export type ICalendarWidget = IWidget; +export type ICalendarWidget = IWidget<(typeof definition)['id'], typeof definition>; interface CalendarTileProps { widget: ICalendarWidget; @@ -124,7 +124,7 @@ const getReleasedMediasForDate = ( date: Date, widget: ICalendarWidget ): MediasType => { - const radarrReleaseType = widget.properties.radarrReleaseType ?? 'inCinemas'; + const { radarrReleaseType } = widget.properties; const books = medias?.books.filter((b) => new Date(b.releaseDate).toDateString() === date.toDateString()) ?? diff --git a/src/widgets/dashDot/DashDotTile.tsx b/src/widgets/dashDot/DashDotTile.tsx index 34175f4b3..522c555c3 100644 --- a/src/widgets/dashDot/DashDotTile.tsx +++ b/src/widgets/dashDot/DashDotTile.tsx @@ -188,7 +188,7 @@ function DashDotTile({ widget }: DashDotTileProps) { {graphsOrder .filter((g) => g.subValues.enabled) .map((g) => ( - + Date: Sat, 25 Feb 2023 06:15:33 +0900 Subject: [PATCH 40/40] =?UTF-8?q?=F0=9F=8C=90=20New=20Crowdin=20updates=20?= =?UTF-8?q?(#711)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/locales/da/layout/modals/about.json | 3 +- public/locales/da/layout/modals/add-app.json | 10 ++- public/locales/da/modules/dashdot.json | 66 +++++++++++++++++ public/locales/da/modules/iframe.json | 23 ++++++ public/locales/da/modules/media-server.json | 24 +++++++ public/locales/da/modules/rss.json | 20 ++++++ public/locales/da/modules/video-stream.json | 24 +++++++ public/locales/de/layout/modals/about.json | 3 +- public/locales/de/layout/modals/add-app.json | 20 ++++-- public/locales/de/modules/calendar.json | 2 +- .../de/modules/common-media-cards.json | 4 +- public/locales/de/modules/common.json | 2 +- public/locales/de/modules/dashdot.json | 10 +-- public/locales/de/modules/date.json | 4 +- public/locales/de/modules/iframe.json | 23 ++++++ public/locales/de/modules/media-server.json | 24 +++++++ public/locales/de/modules/rss.json | 20 ++++++ .../locales/de/modules/torrents-status.json | 4 +- public/locales/de/modules/video-stream.json | 24 +++++++ public/locales/de/modules/weather.json | 2 +- .../de/settings/general/config-changer.json | 2 +- public/locales/el/layout/modals/about.json | 3 +- public/locales/el/layout/modals/add-app.json | 10 ++- public/locales/el/modules/dashdot.json | 66 +++++++++++++++++ public/locales/el/modules/iframe.json | 23 ++++++ public/locales/el/modules/media-server.json | 24 +++++++ public/locales/el/modules/rss.json | 20 ++++++ public/locales/el/modules/video-stream.json | 24 +++++++ public/locales/en/common.json | 4 +- public/locales/en/layout/modals/add-app.json | 2 +- .../en/layout/modals/change-position.json | 4 +- public/locales/en/modules/common.json | 2 +- public/locales/en/modules/dashdot.json | 4 +- public/locales/en/modules/docker.json | 2 +- public/locales/en/modules/iframe.json | 4 +- public/locales/en/modules/ping.json | 2 +- public/locales/en/modules/rss.json | 2 +- .../locales/en/modules/torrents-status.json | 2 +- public/locales/en/modules/video-stream.json | 4 +- .../en/settings/customization/general.json | 4 +- .../customization/page-appearance.json | 8 +-- .../en/settings/general/config-changer.json | 6 +- .../en/settings/general/search-engine.json | 2 +- public/locales/es/layout/modals/about.json | 3 +- public/locales/es/layout/modals/add-app.json | 10 ++- public/locales/es/modules/dashdot.json | 66 +++++++++++++++++ public/locales/es/modules/iframe.json | 23 ++++++ public/locales/es/modules/media-server.json | 24 +++++++ public/locales/es/modules/rss.json | 20 ++++++ public/locales/es/modules/video-stream.json | 24 +++++++ public/locales/fr/layout/modals/about.json | 3 +- public/locales/fr/layout/modals/add-app.json | 10 ++- public/locales/fr/modules/dashdot.json | 66 +++++++++++++++++ public/locales/fr/modules/iframe.json | 23 ++++++ public/locales/fr/modules/media-server.json | 24 +++++++ public/locales/fr/modules/rss.json | 20 ++++++ public/locales/fr/modules/video-stream.json | 24 +++++++ .../customization/page-appearance.json | 2 +- public/locales/he/layout/modals/about.json | 3 +- public/locales/he/layout/modals/add-app.json | 10 ++- public/locales/he/modules/dashdot.json | 66 +++++++++++++++++ public/locales/he/modules/iframe.json | 23 ++++++ public/locales/he/modules/media-server.json | 24 +++++++ public/locales/he/modules/rss.json | 20 ++++++ public/locales/he/modules/video-stream.json | 24 +++++++ public/locales/it/layout/modals/about.json | 3 +- public/locales/it/layout/modals/add-app.json | 10 ++- public/locales/it/modules/dashdot.json | 66 +++++++++++++++++ public/locales/it/modules/iframe.json | 23 ++++++ public/locales/it/modules/media-server.json | 24 +++++++ public/locales/it/modules/rss.json | 20 ++++++ public/locales/it/modules/video-stream.json | 24 +++++++ public/locales/ja/layout/modals/about.json | 3 +- public/locales/ja/layout/modals/add-app.json | 10 ++- public/locales/ja/modules/dashdot.json | 66 +++++++++++++++++ public/locales/ja/modules/iframe.json | 23 ++++++ public/locales/ja/modules/media-server.json | 24 +++++++ public/locales/ja/modules/rss.json | 20 ++++++ public/locales/ja/modules/video-stream.json | 24 +++++++ public/locales/ko/layout/modals/about.json | 3 +- public/locales/ko/layout/modals/add-app.json | 10 ++- public/locales/ko/modules/dashdot.json | 66 +++++++++++++++++ public/locales/ko/modules/iframe.json | 23 ++++++ public/locales/ko/modules/media-server.json | 24 +++++++ public/locales/ko/modules/rss.json | 20 ++++++ public/locales/ko/modules/video-stream.json | 24 +++++++ public/locales/lol/layout/modals/about.json | 3 +- public/locales/lol/layout/modals/add-app.json | 10 ++- public/locales/lol/modules/dashdot.json | 66 +++++++++++++++++ public/locales/lol/modules/iframe.json | 23 ++++++ public/locales/lol/modules/media-server.json | 24 +++++++ public/locales/lol/modules/rss.json | 20 ++++++ public/locales/lol/modules/video-stream.json | 24 +++++++ public/locales/nl/layout/modals/about.json | 11 +-- public/locales/nl/layout/modals/add-app.json | 10 ++- .../locales/nl/layout/modals/icon-picker.json | 6 +- public/locales/nl/modules/calendar.json | 2 +- public/locales/nl/modules/dashdot.json | 72 ++++++++++++++++++- public/locales/nl/modules/iframe.json | 23 ++++++ public/locales/nl/modules/media-server.json | 24 +++++++ public/locales/nl/modules/rss.json | 20 ++++++ .../locales/nl/modules/torrents-status.json | 4 +- public/locales/nl/modules/video-stream.json | 24 +++++++ public/locales/nl/settings/common.json | 10 +-- .../customization/color-selector.json | 1 + .../nl/settings/customization/general.json | 18 ++--- .../nl/settings/customization/gridstack.json | 12 ++-- .../customization/page-appearance.json | 12 ++-- public/locales/no/layout/modals/about.json | 3 +- public/locales/no/layout/modals/add-app.json | 10 ++- public/locales/no/modules/dashdot.json | 66 +++++++++++++++++ public/locales/no/modules/iframe.json | 23 ++++++ public/locales/no/modules/media-server.json | 24 +++++++ public/locales/no/modules/rss.json | 20 ++++++ public/locales/no/modules/video-stream.json | 24 +++++++ public/locales/pl/layout/modals/about.json | 3 +- public/locales/pl/layout/modals/add-app.json | 10 ++- public/locales/pl/modules/dashdot.json | 66 +++++++++++++++++ public/locales/pl/modules/iframe.json | 23 ++++++ public/locales/pl/modules/media-server.json | 24 +++++++ public/locales/pl/modules/rss.json | 20 ++++++ public/locales/pl/modules/video-stream.json | 24 +++++++ public/locales/pt/layout/modals/about.json | 13 ++-- public/locales/pt/layout/modals/add-app.json | 10 ++- public/locales/pt/modules/calendar.json | 2 +- public/locales/pt/modules/dashdot.json | 72 ++++++++++++++++++- public/locales/pt/modules/iframe.json | 23 ++++++ public/locales/pt/modules/media-server.json | 24 +++++++ public/locales/pt/modules/rss.json | 20 ++++++ public/locales/pt/modules/video-stream.json | 24 +++++++ public/locales/pt/settings/common.json | 10 +-- .../customization/color-selector.json | 1 + .../pt/settings/customization/general.json | 18 ++--- .../pt/settings/customization/gridstack.json | 12 ++-- .../customization/page-appearance.json | 12 ++-- public/locales/ru/common.json | 2 +- public/locales/ru/layout/modals/about.json | 11 +-- public/locales/ru/layout/modals/add-app.json | 10 ++- public/locales/ru/modules/dashdot.json | 66 +++++++++++++++++ public/locales/ru/modules/iframe.json | 23 ++++++ public/locales/ru/modules/media-server.json | 24 +++++++ public/locales/ru/modules/rss.json | 20 ++++++ public/locales/ru/modules/video-stream.json | 24 +++++++ .../ru/settings/customization/general.json | 10 +-- .../ru/settings/customization/gridstack.json | 12 ++-- .../ru/settings/general/config-changer.json | 2 +- public/locales/sk/common.json | 2 +- public/locales/sk/layout/modals/about.json | 3 +- public/locales/sk/layout/modals/add-app.json | 10 ++- public/locales/sk/modules/dashdot.json | 68 +++++++++++++++++- public/locales/sk/modules/iframe.json | 23 ++++++ public/locales/sk/modules/media-server.json | 24 +++++++ public/locales/sk/modules/rss.json | 20 ++++++ public/locales/sk/modules/video-stream.json | 24 +++++++ public/locales/sl/layout/modals/about.json | 11 +-- public/locales/sl/layout/modals/add-app.json | 10 ++- public/locales/sl/modules/calendar.json | 2 +- public/locales/sl/modules/dashdot.json | 72 ++++++++++++++++++- public/locales/sl/modules/iframe.json | 23 ++++++ public/locales/sl/modules/media-server.json | 24 +++++++ public/locales/sl/modules/rss.json | 20 ++++++ public/locales/sl/modules/video-stream.json | 24 +++++++ public/locales/sl/settings/common.json | 10 +-- .../customization/color-selector.json | 1 + .../sl/settings/customization/general.json | 18 ++--- .../sl/settings/customization/gridstack.json | 12 ++-- .../customization/page-appearance.json | 12 ++-- public/locales/sv/layout/modals/about.json | 3 +- public/locales/sv/layout/modals/add-app.json | 10 ++- public/locales/sv/modules/dashdot.json | 66 +++++++++++++++++ public/locales/sv/modules/iframe.json | 23 ++++++ public/locales/sv/modules/media-server.json | 24 +++++++ public/locales/sv/modules/rss.json | 20 ++++++ public/locales/sv/modules/video-stream.json | 24 +++++++ public/locales/uk/layout/modals/about.json | 3 +- public/locales/uk/layout/modals/add-app.json | 10 ++- public/locales/uk/modules/dashdot.json | 66 +++++++++++++++++ public/locales/uk/modules/iframe.json | 23 ++++++ public/locales/uk/modules/media-server.json | 24 +++++++ public/locales/uk/modules/rss.json | 20 ++++++ public/locales/uk/modules/video-stream.json | 24 +++++++ public/locales/vi/layout/modals/about.json | 3 +- public/locales/vi/layout/modals/add-app.json | 10 ++- public/locales/vi/modules/dashdot.json | 66 +++++++++++++++++ public/locales/vi/modules/iframe.json | 23 ++++++ public/locales/vi/modules/media-server.json | 24 +++++++ public/locales/vi/modules/rss.json | 20 ++++++ public/locales/vi/modules/video-stream.json | 24 +++++++ public/locales/zh/layout/modals/about.json | 3 +- public/locales/zh/layout/modals/add-app.json | 10 ++- public/locales/zh/modules/dashdot.json | 70 +++++++++++++++++- public/locales/zh/modules/iframe.json | 23 ++++++ public/locales/zh/modules/media-server.json | 24 +++++++ public/locales/zh/modules/rss.json | 20 ++++++ public/locales/zh/modules/video-stream.json | 24 +++++++ 195 files changed, 3641 insertions(+), 218 deletions(-) create mode 100644 public/locales/da/modules/iframe.json create mode 100644 public/locales/da/modules/media-server.json create mode 100644 public/locales/da/modules/rss.json create mode 100644 public/locales/da/modules/video-stream.json create mode 100644 public/locales/de/modules/iframe.json create mode 100644 public/locales/de/modules/media-server.json create mode 100644 public/locales/de/modules/rss.json create mode 100644 public/locales/de/modules/video-stream.json create mode 100644 public/locales/el/modules/iframe.json create mode 100644 public/locales/el/modules/media-server.json create mode 100644 public/locales/el/modules/rss.json create mode 100644 public/locales/el/modules/video-stream.json create mode 100644 public/locales/es/modules/iframe.json create mode 100644 public/locales/es/modules/media-server.json create mode 100644 public/locales/es/modules/rss.json create mode 100644 public/locales/es/modules/video-stream.json create mode 100644 public/locales/fr/modules/iframe.json create mode 100644 public/locales/fr/modules/media-server.json create mode 100644 public/locales/fr/modules/rss.json create mode 100644 public/locales/fr/modules/video-stream.json create mode 100644 public/locales/he/modules/iframe.json create mode 100644 public/locales/he/modules/media-server.json create mode 100644 public/locales/he/modules/rss.json create mode 100644 public/locales/he/modules/video-stream.json create mode 100644 public/locales/it/modules/iframe.json create mode 100644 public/locales/it/modules/media-server.json create mode 100644 public/locales/it/modules/rss.json create mode 100644 public/locales/it/modules/video-stream.json create mode 100644 public/locales/ja/modules/iframe.json create mode 100644 public/locales/ja/modules/media-server.json create mode 100644 public/locales/ja/modules/rss.json create mode 100644 public/locales/ja/modules/video-stream.json create mode 100644 public/locales/ko/modules/iframe.json create mode 100644 public/locales/ko/modules/media-server.json create mode 100644 public/locales/ko/modules/rss.json create mode 100644 public/locales/ko/modules/video-stream.json create mode 100644 public/locales/lol/modules/iframe.json create mode 100644 public/locales/lol/modules/media-server.json create mode 100644 public/locales/lol/modules/rss.json create mode 100644 public/locales/lol/modules/video-stream.json create mode 100644 public/locales/nl/modules/iframe.json create mode 100644 public/locales/nl/modules/media-server.json create mode 100644 public/locales/nl/modules/rss.json create mode 100644 public/locales/nl/modules/video-stream.json create mode 100644 public/locales/no/modules/iframe.json create mode 100644 public/locales/no/modules/media-server.json create mode 100644 public/locales/no/modules/rss.json create mode 100644 public/locales/no/modules/video-stream.json create mode 100644 public/locales/pl/modules/iframe.json create mode 100644 public/locales/pl/modules/media-server.json create mode 100644 public/locales/pl/modules/rss.json create mode 100644 public/locales/pl/modules/video-stream.json create mode 100644 public/locales/pt/modules/iframe.json create mode 100644 public/locales/pt/modules/media-server.json create mode 100644 public/locales/pt/modules/rss.json create mode 100644 public/locales/pt/modules/video-stream.json create mode 100644 public/locales/ru/modules/iframe.json create mode 100644 public/locales/ru/modules/media-server.json create mode 100644 public/locales/ru/modules/rss.json create mode 100644 public/locales/ru/modules/video-stream.json create mode 100644 public/locales/sk/modules/iframe.json create mode 100644 public/locales/sk/modules/media-server.json create mode 100644 public/locales/sk/modules/rss.json create mode 100644 public/locales/sk/modules/video-stream.json create mode 100644 public/locales/sl/modules/iframe.json create mode 100644 public/locales/sl/modules/media-server.json create mode 100644 public/locales/sl/modules/rss.json create mode 100644 public/locales/sl/modules/video-stream.json create mode 100644 public/locales/sv/modules/iframe.json create mode 100644 public/locales/sv/modules/media-server.json create mode 100644 public/locales/sv/modules/rss.json create mode 100644 public/locales/sv/modules/video-stream.json create mode 100644 public/locales/uk/modules/iframe.json create mode 100644 public/locales/uk/modules/media-server.json create mode 100644 public/locales/uk/modules/rss.json create mode 100644 public/locales/uk/modules/video-stream.json create mode 100644 public/locales/vi/modules/iframe.json create mode 100644 public/locales/vi/modules/media-server.json create mode 100644 public/locales/vi/modules/rss.json create mode 100644 public/locales/vi/modules/video-stream.json create mode 100644 public/locales/zh/modules/iframe.json create mode 100644 public/locales/zh/modules/media-server.json create mode 100644 public/locales/zh/modules/rss.json create mode 100644 public/locales/zh/modules/video-stream.json diff --git a/public/locales/da/layout/modals/about.json b/public/locales/da/layout/modals/about.json index 43217c9a1..e6023ce8e 100644 --- a/public/locales/da/layout/modals/about.json +++ b/public/locales/da/layout/modals/about.json @@ -8,6 +8,7 @@ "version": "Version", "nodeEnvironment": "Node miljø", "i18n": "Indlæste I18n-oversættelsesnavneområder", - "locales": "Konfigurerede I18n landestandarder" + "locales": "Konfigurerede I18n landestandarder", + "experimental_disableEditMode": "EKSPERIMENTAL: Deaktivér redigeringstilstand" } } \ No newline at end of file diff --git a/public/locales/da/layout/modals/add-app.json b/public/locales/da/layout/modals/add-app.json index 49d7d0241..8056ba346 100644 --- a/public/locales/da/layout/modals/add-app.json +++ b/public/locales/da/layout/modals/add-app.json @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "App Ikon", - "description": "Det ikon, der vises på dashboarded." + "description": "Vælg et ikon der skal vises på dit dashboard. Vælg mellem {{suggestionsCount}} ikoner eller indtast din egen URL", + "autocomplete": { + "title": "Ingen resultater fundet", + "text": "Prøv at bruge et mere specifikt søgeord. Hvis du ikke kan finde det ønskede ikon, kan du indsætte billedets URL ovenfor for at få et brugerdefineret ikon" + }, + "noItems": { + "title": "Indlæser eksterne ikoner", + "text": "Dette kan tage nogle sekunder" + } } }, "integration": { diff --git a/public/locales/da/modules/dashdot.json b/public/locales/da/modules/dashdot.json index abcc8897f..c57bf2a35 100644 --- a/public/locales/da/modules/dashdot.json +++ b/public/locales/da/modules/dashdot.json @@ -9,6 +9,72 @@ }, "usePercentages": { "label": "Vis procentdele" + }, + "columns": { + "label": "Vis kolonner" + }, + "graphHeight": { + "label": "Højde af grafer" + }, + "graphsOrder": { + "label": "Grafer (rækkefølge)", + "storage": { + "label": "Lager", + "enabled": { + "label": "Vis i widget" + }, + "span": { + "label": "Kolonne spændvidde" + }, + "compactView": { + "label": "Vis som tekst (kompakt)" + }, + "multiView": { + "label": "Vis som multi-drevvisning" + } + }, + "network": { + "label": "Netværk", + "enabled": { + "label": "Vis i widget" + }, + "span": { + "label": "Kolonne spændvidde" + }, + "compactView": { + "label": "Vis som tekst (kompakt)" + } + }, + "cpu": { + "label": "CPU", + "enabled": { + "label": "Vis i widget" + }, + "span": { + "label": "Kolonne spændvidde" + }, + "multiView": { + "label": "Vis som multi-core-visning" + } + }, + "ram": { + "label": "RAM", + "enabled": { + "label": "Vis i widget" + }, + "span": { + "label": "Kolonne spændvidde" + } + }, + "gpu": { + "label": "GPU", + "enabled": { + "label": "Vis i widget" + }, + "span": { + "label": "Kolonne spændvidde" + } + } } } }, diff --git a/public/locales/da/modules/iframe.json b/public/locales/da/modules/iframe.json new file mode 100644 index 000000000..986709f9d --- /dev/null +++ b/public/locales/da/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "IFrame", + "description": "Indlejr ethvert indhold fra internettet. Nogle websteder kan begrænse adgang.", + "settings": { + "title": "IFrame indstillinger", + "embedUrl": { + "label": "Indlejr URL" + }, + "allowFullScreen": { + "label": "Tillad fuld skærm" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "Indtast URL", + "text": "Sørg for, at du har indtastet en gyldig adresse i konfigurationen af din widget" + } + } + } +} \ No newline at end of file diff --git a/public/locales/da/modules/media-server.json b/public/locales/da/modules/media-server.json new file mode 100644 index 000000000..d9fd9b317 --- /dev/null +++ b/public/locales/da/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Medieserver", + "description": "Interagere med din Jellyfin- eller Plex-medieserver", + "settings": { + "title": "Indstillinger for medieserver widget" + } + }, + "card": { + "table": { + "header": { + "session": "Session", + "user": "Bruger", + "currentlyPlaying": "Afspiller i øjeblikket" + } + }, + "errors": { + "general": { + "title": "Kunne ikke indlæse indholdet", + "text": "Det er ikke muligt at hente oplysninger fra serveren. Se venligst logfilerne for at få flere oplysninger" + } + } + } +} \ No newline at end of file diff --git a/public/locales/da/modules/rss.json b/public/locales/da/modules/rss.json new file mode 100644 index 000000000..010afb4c9 --- /dev/null +++ b/public/locales/da/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "RSS Widget", + "description": "Griber elementerne fra et RSS-feed og viser dem. Anvendes normalt til online-nyheder", + "settings": { + "title": "Indstillinger for RSS-widget", + "rssFeedUrl": { + "label": "RSS-feed url" + } + } + }, + "card": { + "errors": { + "general": { + "title": "Det er ikke muligt at hente RSS-feed", + "text": "Der var et problem med at nå ud til RSS-feedet. Sørg for, at du'har konfigureret feedet korrekt og bruger en gyldig RSS-url, der passer til den officielle standardspecifikation. Når du har opdateret feed'et, skal du muligvis gemme dit dashboard og opdatere siden." + } + } + } +} \ No newline at end of file diff --git a/public/locales/da/modules/video-stream.json b/public/locales/da/modules/video-stream.json new file mode 100644 index 000000000..7319cf36d --- /dev/null +++ b/public/locales/da/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Video Stream", + "description": "Indlejr en video stream eller video fra et kamera eller et website", + "settings": { + "title": "Indstillinger for video stream widget", + "FeedUrl": { + "label": "Feed url" + }, + "autoPlay": { + "label": "Automatisk afspilning" + }, + "muted": { + "label": "Slå lyden fra" + }, + "controls": { + "label": "Video afspilnings kontrol" + } + } + }, + "errors": { + "invalidStream": "Ugyldig stream" + } +} \ No newline at end of file diff --git a/public/locales/de/layout/modals/about.json b/public/locales/de/layout/modals/about.json index 161fa3382..3c9ef88c0 100644 --- a/public/locales/de/layout/modals/about.json +++ b/public/locales/de/layout/modals/about.json @@ -8,6 +8,7 @@ "version": "Version", "nodeEnvironment": "Node-Umgebung", "i18n": "Geladene I18n Übersetzungs Namensräume", - "locales": "Konfigurierte I18n Sprachumgebungen" + "locales": "Konfigurierte I18n Sprachumgebungen", + "experimental_disableEditMode": "EXPERIMENTAL: Bearbeitungsmodus deaktivieren" } } \ No newline at end of file diff --git a/public/locales/de/layout/modals/add-app.json b/public/locales/de/layout/modals/add-app.json index 758e777d7..cbb0cad05 100644 --- a/public/locales/de/layout/modals/add-app.json +++ b/public/locales/de/layout/modals/add-app.json @@ -29,7 +29,7 @@ "network": { "statusChecker": { "label": "Statusprüfer", - "description": "Prüft, ob Ihre Anwendung online und mittels einer einfachen HTTP(S)-Anfrage erreichbar ist." + "description": "Prüft, ob Ihre Anwendung mittels einer einfachen HTTP(S)-Anfrage erreichbar ist." }, "statusCodes": { "label": "HTTP Statuscodes", @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "App Symbol", - "description": "Das Symbol, das auf dem Dashboard angezeigt werden soll." + "description": "Wählen Sie ein Symbol, das auf Ihrem Dashboard angezeigt werden soll. Wählen Sie aus {{suggestionsCount}} Icons oder geben Sie Ihre eigene URL ein", + "autocomplete": { + "title": "Die Suche ergab keine Treffer", + "text": "Versuchen Sie, einen spezifischeren Suchbegriff zu verwenden. Wenn Sie das gewünschte Symbol nicht finden können, fügen Sie die obige Bild-URL für ein benutzerdefiniertes Symbol ein" + }, + "noItems": { + "title": "Lade externe Icons", + "text": "Dies kann einige Sekunden dauern…" + } } }, "integration": { @@ -55,11 +63,11 @@ "explanationPublic": "Ein öffentliche Phrase wird immer an den Client gesendet und ist über die API zugänglich. Es sollte keine vertraulichen Werte wie Benutzernamen, Passwörter, Token, Zertifikate und ähnliches enthalten!" }, "secrets": { - "description": "Um eine Phrase zu aktualisieren, geben Sie einen Wert ein und klicken Sie auf Speichern. Um eine Phrase zu entfernen, klicken Sie auf die Schaltfläche Löschen.", + "description": "Um eine geheime Phrase zu aktualisieren, geben Sie einen Wert ein und klicken Sie auf Speichern. Um eine geheime Phrase zu entfernen, klicken Sie auf die Schaltfläche Löschen.", "warning": "Ihre Anmeldedaten dienen als Zugang für Homarr und sie sollten diese niemals an andere Personen weitergeben. Das Homarr-Team wird Sie niemals nach Ihren Zugangsdaten fragen. Stellen Sie sicher, dass sie ihre Zugangsdaten sicher aufbewahren und verwalten.", - "clear": "Phrase löschen", - "save": "Phrase speichern", - "update": "Phrase ändern" + "clear": "Geheime Phrase löschen", + "save": "Geheime Phrase speichern", + "update": "Geheime Phrase ändern" } }, "validation": { diff --git a/public/locales/de/modules/calendar.json b/public/locales/de/modules/calendar.json index 056f3e97c..69c63bccf 100644 --- a/public/locales/de/modules/calendar.json +++ b/public/locales/de/modules/calendar.json @@ -3,7 +3,7 @@ "name": "Kalender", "description": "Zeigt einen Kalender mit anstehenden Veröffentlichungen von unterstützten Widgets an.", "settings": { - "title": "Einstellungen für das Kalender Widget", + "title": "Kalender Widget Einstellungen", "useSonarrv4": { "label": "Sonarr v4 API verwenden" }, diff --git a/public/locales/de/modules/common-media-cards.json b/public/locales/de/modules/common-media-cards.json index 55312bb3f..49988d708 100644 --- a/public/locales/de/modules/common-media-cards.json +++ b/public/locales/de/modules/common-media-cards.json @@ -1,6 +1,6 @@ { "buttons": { - "play": "Abspielen", - "request": "Anfragen" + "play": "Wiedergabe", + "request": "Anfrage" } } \ No newline at end of file diff --git a/public/locales/de/modules/common.json b/public/locales/de/modules/common.json index c7014d161..24f082c2c 100644 --- a/public/locales/de/modules/common.json +++ b/public/locales/de/modules/common.json @@ -4,7 +4,7 @@ }, "errors": { "unmappedOptions": { - "text": "Ungenutzter Parameter in der Konfiguration erkannt
{{key}}. Homarr ist nicht in der Lage, diesen Parameter zu interpretieren und zu verwenden. Um ein unerwartetes Verhalten zu vermeiden, sichern Sie Ihre Konfiguration und korrigieren Sie sie." + "text": "Ungenutzter Parameter in der Konfiguration erkannt
{{key}}. Homarr ist nicht in der Lage, diesen Parameter zu interpretieren und zu verwenden. Um ein unerwartetes Verhalten zu vermeiden, sichern Sie Ihre Konfiguration und korrigieren Sie diese." } } } diff --git a/public/locales/de/modules/dashdot.json b/public/locales/de/modules/dashdot.json index 89d6d8e9f..2ade84d78 100644 --- a/public/locales/de/modules/dashdot.json +++ b/public/locales/de/modules/dashdot.json @@ -11,7 +11,7 @@ "label": "Prozentangaben anzeigen" }, "columns": { - "label": "Anzahl Spalten" + "label": "Spalten anzeigen" }, "graphHeight": { "label": "Höhe der Graphen" @@ -36,7 +36,7 @@ "network": { "label": "Netzwerk", "enabled": { - "label": "Im Widget anzeigen" + "label": "In Widget anzeigen" }, "span": { "label": "Spaltenbreite" @@ -48,7 +48,7 @@ "cpu": { "label": "CPU", "enabled": { - "label": "Im Widget anzeigen" + "label": "In Widget anzeigen" }, "span": { "label": "Spaltenbreite" @@ -60,7 +60,7 @@ "ram": { "label": "RAM", "enabled": { - "label": "Im Widget anzeigen" + "label": "In Widget anzeigen" }, "span": { "label": "Spaltenbreite" @@ -69,7 +69,7 @@ "gpu": { "label": "GPU", "enabled": { - "label": "Im Widget anzeigen" + "label": "In Widget anzeigen" }, "span": { "label": "Spaltenbreite" diff --git a/public/locales/de/modules/date.json b/public/locales/de/modules/date.json index 63de4fdc0..2d760d910 100644 --- a/public/locales/de/modules/date.json +++ b/public/locales/de/modules/date.json @@ -1,9 +1,9 @@ { "descriptor": { "name": "Datum und Zeit", - "description": "Zeigt das aktuelle Datum und die Uhrzeit an", + "description": "Zeigt das aktuelle Datum und die Uhrzeit an.", "settings": { - "title": "Einstellungen für das Widget \"Datum und Uhrzeit", + "title": "\"Datum und Uhrzeit\" Widget Einstellungen", "display24HourFormat": { "label": "24-Stunden Format" } diff --git a/public/locales/de/modules/iframe.json b/public/locales/de/modules/iframe.json new file mode 100644 index 000000000..d03a3423f --- /dev/null +++ b/public/locales/de/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "iFrame", + "description": "Einbetten von Inhalten aus dem Internet. Einige Websites können den Zugriff einschränken.", + "settings": { + "title": "iFrame Einstellungen", + "embedUrl": { + "label": "URL einbetten" + }, + "allowFullScreen": { + "label": "Vollbildmodus zulassen" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "Geben Sie eine URL ein", + "text": "Stellen Sie sicher, dass Sie in der Konfiguration Ihres Widgets eine gültige Adresse eingegeben haben" + } + } + } +} \ No newline at end of file diff --git a/public/locales/de/modules/media-server.json b/public/locales/de/modules/media-server.json new file mode 100644 index 000000000..a3e104cd5 --- /dev/null +++ b/public/locales/de/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Medien Server", + "description": "Interagiere mit deinem Jellyfin oder Plex Media Server", + "settings": { + "title": "Einstellungen für das Medien Server Widget" + } + }, + "card": { + "table": { + "header": { + "session": "Sitzung", + "user": "Benutzer", + "currentlyPlaying": "Momentan läuft" + } + }, + "errors": { + "general": { + "title": "Inhalt kann nicht geladen werden", + "text": "Informationen vom Server konnten nicht abgerufen werden. Bitte überprüfen Sie die Logs für weitere Details" + } + } + } +} \ No newline at end of file diff --git a/public/locales/de/modules/rss.json b/public/locales/de/modules/rss.json new file mode 100644 index 000000000..3214e802d --- /dev/null +++ b/public/locales/de/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "RSS-Widget", + "description": "Nimmt die Einträge aus einem RSS-Feed und zeigt sie an. Wird üblicherweise für Online-Nachrichten verwendet", + "settings": { + "title": "Einstellungen für das RSS-Widget", + "rssFeedUrl": { + "label": "RSS-Feed URL" + } + } + }, + "card": { + "errors": { + "general": { + "title": "RSS-Feed konnte nicht abgerufen werden", + "text": "Es gab ein Problem beim Erreichen des RSS-Feeds. Vergewissern Sie sich, dass Sie den Feed richtig konfiguriert haben und eine gültige RSS-URL verwenden, die der offiziellen Standardspezifikation entspricht. Nachdem Sie den Feed aktualisiert haben, müssen Sie möglicherweise Ihr Dashboard speichern und die Seite aktualisieren." + } + } + } +} \ No newline at end of file diff --git a/public/locales/de/modules/torrents-status.json b/public/locales/de/modules/torrents-status.json index a327d4185..2c7888edc 100644 --- a/public/locales/de/modules/torrents-status.json +++ b/public/locales/de/modules/torrents-status.json @@ -18,7 +18,7 @@ "card": { "footer": { "error": "Fehler", - "lastUpdated": "Zuletzt aktualisiert {{time}} vor" + "lastUpdated": "Zuletzt aktualisiert vor {{time}}" }, "table": { "header": { @@ -63,7 +63,7 @@ "queuePosition": "Position in der Warteschlange - {{position}}", "progress": "Fortschritt - {{progress}}%", "totalSelectedSize": "Insgesamt - {{totalSize}}", - "state": "Staat - {{state}}", + "state": "Status - {{state}}", "ratio": "Verhältnis -", "completed": "Abgeschlossen" } diff --git a/public/locales/de/modules/video-stream.json b/public/locales/de/modules/video-stream.json new file mode 100644 index 000000000..c5157f1c2 --- /dev/null +++ b/public/locales/de/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Videostream", + "description": "Einbetten eines Videostreams oder eines Videos von einer Kamera oder einer Website", + "settings": { + "title": "Einstellungen für das Video Stream Widget", + "FeedUrl": { + "label": "Feed URL" + }, + "autoPlay": { + "label": "Automatisch abspielen" + }, + "muted": { + "label": "Audio stummschalten" + }, + "controls": { + "label": "Videoplayer Steuerung" + } + } + }, + "errors": { + "invalidStream": "Ungültiger Stream" + } +} \ No newline at end of file diff --git a/public/locales/de/modules/weather.json b/public/locales/de/modules/weather.json index 16a5d8039..e5c36d6a8 100644 --- a/public/locales/de/modules/weather.json +++ b/public/locales/de/modules/weather.json @@ -3,7 +3,7 @@ "name": "Wetter", "description": "Zeigt die aktuellen Wetterinformationen für einen bestimmten Ort an.", "settings": { - "title": "Einstellungen für das Wetter Widget", + "title": "Wetter Widget Einstellungen", "displayInFahrenheit": { "label": "In Fahrenheit anzeigen" }, diff --git a/public/locales/de/settings/general/config-changer.json b/public/locales/de/settings/general/config-changer.json index e5eebeb38..8c9405674 100644 --- a/public/locales/de/settings/general/config-changer.json +++ b/public/locales/de/settings/general/config-changer.json @@ -1,6 +1,6 @@ { "configSelect": { - "label": "Konfigurationslader", + "label": "Änderung der Konfiguration", "description": "{{configCount}} Konfigurationen sind verfügbar", "loadingNew": "Ihre Konfiguration wird geladen...", "pleaseWait": "Bitte warten Sie, bis Ihre neue Konfiguration geladen ist!" diff --git a/public/locales/el/layout/modals/about.json b/public/locales/el/layout/modals/about.json index ab9b915d1..aae1178db 100644 --- a/public/locales/el/layout/modals/about.json +++ b/public/locales/el/layout/modals/about.json @@ -8,6 +8,7 @@ "version": "Έκδοση", "nodeEnvironment": "", "i18n": "", - "locales": "" + "locales": "", + "experimental_disableEditMode": "" } } \ No newline at end of file diff --git a/public/locales/el/layout/modals/add-app.json b/public/locales/el/layout/modals/add-app.json index d5047b489..d959ac22e 100644 --- a/public/locales/el/layout/modals/add-app.json +++ b/public/locales/el/layout/modals/add-app.json @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "Εικονίδιο εφαρμογής", - "description": "Το εικονίδιο που θα εμφανίζεται στο ταμπλό." + "description": "", + "autocomplete": { + "title": "", + "text": "" + }, + "noItems": { + "title": "", + "text": "" + } } }, "integration": { diff --git a/public/locales/el/modules/dashdot.json b/public/locales/el/modules/dashdot.json index 217aa0611..3c235e9a9 100644 --- a/public/locales/el/modules/dashdot.json +++ b/public/locales/el/modules/dashdot.json @@ -9,6 +9,72 @@ }, "usePercentages": { "label": "" + }, + "columns": { + "label": "" + }, + "graphHeight": { + "label": "" + }, + "graphsOrder": { + "label": "", + "storage": { + "label": "Αποθηκευτικός χώρος", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "compactView": { + "label": "" + }, + "multiView": { + "label": "" + } + }, + "network": { + "label": "Δίκτυο", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "compactView": { + "label": "" + } + }, + "cpu": { + "label": "CPU", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "multiView": { + "label": "" + } + }, + "ram": { + "label": "", + "enabled": { + "label": "" + }, + "span": { + "label": "" + } + }, + "gpu": { + "label": "GPU", + "enabled": { + "label": "" + }, + "span": { + "label": "" + } + } } } }, diff --git a/public/locales/el/modules/iframe.json b/public/locales/el/modules/iframe.json new file mode 100644 index 000000000..18c90c392 --- /dev/null +++ b/public/locales/el/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "embedUrl": { + "label": "" + }, + "allowFullScreen": { + "label": "" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/el/modules/media-server.json b/public/locales/el/modules/media-server.json new file mode 100644 index 000000000..2be958199 --- /dev/null +++ b/public/locales/el/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "card": { + "table": { + "header": { + "session": "", + "user": "", + "currentlyPlaying": "" + } + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/el/modules/rss.json b/public/locales/el/modules/rss.json new file mode 100644 index 000000000..230d75cf5 --- /dev/null +++ b/public/locales/el/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "rssFeedUrl": { + "label": "" + } + } + }, + "card": { + "errors": { + "general": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/el/modules/video-stream.json b/public/locales/el/modules/video-stream.json new file mode 100644 index 000000000..539daa1c4 --- /dev/null +++ b/public/locales/el/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "FeedUrl": { + "label": "" + }, + "autoPlay": { + "label": "" + }, + "muted": { + "label": "" + }, + "controls": { + "label": "" + } + } + }, + "errors": { + "invalidStream": "" + } +} \ No newline at end of file diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 1b78b10a3..4f2e4f0ff 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -9,13 +9,13 @@ "version": "Version", "changePosition": "Change position", "remove": "Remove", - "removeConfirm": "Are you sure that you want to remove {{item}} ?", + "removeConfirm": "Are you sure that you want to remove {{item}}?", "sections": { "settings": "Settings", "dangerZone": "Danger zone" }, "secrets": { - "apiKey": "Api key", + "apiKey": "API key", "username": "Username", "password": "Password" }, diff --git a/public/locales/en/layout/modals/add-app.json b/public/locales/en/layout/modals/add-app.json index 52f98b525..0ca231eb0 100644 --- a/public/locales/en/layout/modals/add-app.json +++ b/public/locales/en/layout/modals/add-app.json @@ -1,7 +1,7 @@ { "tabs": { "general": "General", - "behaviour": "Behaviour", + "behaviour": "Behavior", "network": "Network", "appearance": "Appearance", "integration": "Integration" diff --git a/public/locales/en/layout/modals/change-position.json b/public/locales/en/layout/modals/change-position.json index 464a676de..b7a490d9d 100644 --- a/public/locales/en/layout/modals/change-position.json +++ b/public/locales/en/layout/modals/change-position.json @@ -1,8 +1,8 @@ { - "xPosition": "X axis position", + "xPosition": "X-axis position", "width": "Width", "height": "Height", - "yPosition": "Y axis position", + "yPosition": "Y-axis position", "zeroOrHigher": "0 or higher", "betweenXandY": "Between {{min}} and {{max}}" } \ No newline at end of file diff --git a/public/locales/en/modules/common.json b/public/locales/en/modules/common.json index 18a748dcd..485d7e8fb 100644 --- a/public/locales/en/modules/common.json +++ b/public/locales/en/modules/common.json @@ -4,7 +4,7 @@ }, "errors": { "unmappedOptions": { - "text": "Un-used parameter in configuration detected
{{key}}. Homarr is unable to interpret and use this parameter. To avoid any unexpected behavior, back up your configuration and correct your configuration." + "text": "Unused parameter in configuration detected
{{key}}. Homarr is unable to interpret and use this parameter. To avoid any unexpected behavior, back up your configuration and correct your configuration." } } } diff --git a/public/locales/en/modules/dashdot.json b/public/locales/en/modules/dashdot.json index 488a02225..d0c21f74d 100644 --- a/public/locales/en/modules/dashdot.json +++ b/public/locales/en/modules/dashdot.json @@ -1,7 +1,7 @@ { "descriptor": { "name": "Dash.", - "description": "Displays the graphs of an external Dash. instance inside of Homarr.", + "description": "Displays the graphs of an external Dash. Instance inside Homarr.", "settings": { "title": "Settings for Dash. widget", "url": { @@ -85,7 +85,7 @@ "noInformation": "Cannot acquire information from dash. - are you running the latest version?", "protocolDowngrade": { "title": "Detected protocol downgrade", - "text": "The protocol to your Dash. instance is being downgraded. This is security risk, since HTTP is unencrypted and attackers could abuse this connection. Make sure that Dash. is running on HTTPS too or downgrade Homarr to HTTP (not recommended)." + "text": "The connection to your Dash. instance is using HTTP. This is a security risk, because HTTP is unencrypted and attackers could abuse this connection. Make sure that Dash. is using HTTPS, or downgrade Homarr to HTTP (not recommended)." } }, "graphs": { diff --git a/public/locales/en/modules/docker.json b/public/locales/en/modules/docker.json index 436a78eeb..5b7c7ee0e 100644 --- a/public/locales/en/modules/docker.json +++ b/public/locales/en/modules/docker.json @@ -26,7 +26,7 @@ "actionBar": { "addService": { "title": "Add app", - "message": "Add app Homarr" + "message": "Add app to Homarr" }, "restart": { "title": "Restart" diff --git a/public/locales/en/modules/iframe.json b/public/locales/en/modules/iframe.json index 6bfad9ea1..9cd27d2a3 100644 --- a/public/locales/en/modules/iframe.json +++ b/public/locales/en/modules/iframe.json @@ -1,9 +1,9 @@ { "descriptor": { - "name": "IFrame", + "name": "iFrame", "description": "Embed any content from the internet. Some websites may restrict access.", "settings": { - "title": "IFrame settings", + "title": "iFrame settings", "embedUrl": { "label": "Embed URL" }, diff --git a/public/locales/en/modules/ping.json b/public/locales/en/modules/ping.json index 50d78f53a..3c128cba2 100644 --- a/public/locales/en/modules/ping.json +++ b/public/locales/en/modules/ping.json @@ -1,7 +1,7 @@ { "descriptor": { "name": "Ping", - "description": "Displays a status indicator depeding on the HTTP response code of a given URL." + "description": "Displays a status indicator depending on the HTTP response code of a given URL." }, "states": { "online": "Online {{response}}", diff --git a/public/locales/en/modules/rss.json b/public/locales/en/modules/rss.json index 26800307a..df52af4af 100644 --- a/public/locales/en/modules/rss.json +++ b/public/locales/en/modules/rss.json @@ -13,7 +13,7 @@ "errors": { "general": { "title": "Unable to retrieve RSS feed", - "text": "There was a problem reaching out the the RSS feed. Make sure that you've configured the feed correctly and use a valid RSS url, that matches the official standard specification. After updating the feed, you may need to save your dashboard and refresh the page." + "text": "There was a problem reaching out the RSS feed. Make sure that you have correctly configured the RSS feed using a valid URL. URLs should match the official specification. After updating the feed, you may need to refresh the dashboard." } } } diff --git a/public/locales/en/modules/torrents-status.json b/public/locales/en/modules/torrents-status.json index ac5fced4a..e359ddaea 100644 --- a/public/locales/en/modules/torrents-status.json +++ b/public/locales/en/modules/torrents-status.json @@ -50,7 +50,7 @@ "text": "Add a supported Torrent client to view your current downloads" }, "generic": { - "title": "An unexpected error occured", + "title": "An unexpected error occurred", "text": "Homarr was unable to communicate with your Torrent clients. Please check your configuration" } }, diff --git a/public/locales/en/modules/video-stream.json b/public/locales/en/modules/video-stream.json index a35c740a3..cb502afa9 100644 --- a/public/locales/en/modules/video-stream.json +++ b/public/locales/en/modules/video-stream.json @@ -5,10 +5,10 @@ "settings": { "title": "Settings for video stream widget", "FeedUrl": { - "label": "Feed url" + "label": "Feed URL" }, "autoPlay": { - "label": "Auto play" + "label": "Autoplay" }, "muted": { "label": "Muted audio" diff --git a/public/locales/en/settings/customization/general.json b/public/locales/en/settings/customization/general.json index 0215ba5e8..24610a4bb 100644 --- a/public/locales/en/settings/customization/general.json +++ b/public/locales/en/settings/customization/general.json @@ -14,8 +14,8 @@ "description": "Adjust titles, logo and PWA" }, "appereance": { - "name": "Appereance", - "description": "Customize the background, colors and apps appereance" + "name": "Appearance", + "description": "Customize the background, colors and apps appearance" } } } \ No newline at end of file diff --git a/public/locales/en/settings/customization/page-appearance.json b/public/locales/en/settings/customization/page-appearance.json index 92c9dc632..6f2f9f204 100644 --- a/public/locales/en/settings/customization/page-appearance.json +++ b/public/locales/en/settings/customization/page-appearance.json @@ -5,22 +5,22 @@ }, "metaTitle": { "label": "Meta Title", - "description": "The title, that is being displayed as your tab name" + "description": "The title displayed in your browser tab" }, "logo": { "label": "Logo", - "description": "The dashboard logo at the top left" + "description": "The logo displayed at the top left" }, "favicon": { "label": "Favicon", - "description": "The icon, that is being used in front of your tab name" + "description": "The icon displayed in your browser tab" }, "background": { "label": "Background" }, "customCSS": { "label": "Custom CSS", - "description": "Customize all elements on your dashboard, only recommended for experienced users", + "description": "Further, customize your dashboard using CSS, only recommended for experienced users", "placeholder": "Custom CSS will be applied last", "applying": "Applying CSS..." }, diff --git a/public/locales/en/settings/general/config-changer.json b/public/locales/en/settings/general/config-changer.json index 82e0a8374..09a35a25e 100644 --- a/public/locales/en/settings/general/config-changer.json +++ b/public/locales/en/settings/general/config-changer.json @@ -36,8 +36,8 @@ }, "confirmDeletion": { "title": "Confirm deletion of your config", - "warningText": "You're about to delete '{{configName}}'", - "text": "Please note, that the deletion is not invertible and your data will be lost permanently. After clicking this button, the file will be permanently deleted from your disk. Make sure to create an adequate backup of your configuration.", + "warningText": "You are about to delete '{{configName}}'", + "text": "Please note that the deletion is not revertible, and your data will be lost permanently. After clicking this button, the file will be permanently deleted from your disk. Make sure to create an adequate backup of your configuration.", "buttons": { "confirm": "Yes, delete '{{configName}}'" } @@ -57,7 +57,7 @@ "message": "Config delete failed" }, "deleteFailedDefaultConfig": { - "title": "Default config can't be deleted", + "title": "The default config can't be deleted", "message": "Configuration was not deleted from the file system" } } diff --git a/public/locales/en/settings/general/search-engine.json b/public/locales/en/settings/general/search-engine.json index 86fe8b862..a7a40fc83 100644 --- a/public/locales/en/settings/general/search-engine.json +++ b/public/locales/en/settings/general/search-engine.json @@ -2,7 +2,7 @@ "title": "Search engine", "configurationName": "Search engine configuration", "tips": { - "generalTip": "There are multiple prefixes you can use! Adding these infront of your query will filter the results. !s (Web), !t (Torrents), !y (YouTube), and !m (Media).", + "generalTip": "There are multiple prefixes you can use! Adding these in front of your query will filter the results. !s (Web), !t (Torrents), !y (YouTube), and !m (Media).", "placeholderTip": "%s can be used as a placeholder for the query." }, "customEngine": { diff --git a/public/locales/es/layout/modals/about.json b/public/locales/es/layout/modals/about.json index 41417293b..b7dc308ef 100644 --- a/public/locales/es/layout/modals/about.json +++ b/public/locales/es/layout/modals/about.json @@ -8,6 +8,7 @@ "version": "Versión", "nodeEnvironment": "Entorno del nodo", "i18n": "I18n translation namespaces cargadas", - "locales": "I18n locales configurados" + "locales": "I18n locales configurados", + "experimental_disableEditMode": "EXPERIMENTAL: Desactivar modo edición" } } \ No newline at end of file diff --git a/public/locales/es/layout/modals/add-app.json b/public/locales/es/layout/modals/add-app.json index b35dcf4e5..3db9ff890 100644 --- a/public/locales/es/layout/modals/add-app.json +++ b/public/locales/es/layout/modals/add-app.json @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "Icono App", - "description": "Icono que se verá en el dashboard." + "description": "Elige un icono para mostrarse en tu dashboard. Elige entre {{suggestionsCount}} iconos o introduce tu propia URL", + "autocomplete": { + "title": "Ningún resultado encontrado", + "text": "Intenta usar un término de búsqueda más específico. Si no puedes encontrar tu icono deseado, pega la URL de la imagen encima para establecer un icono personalizado" + }, + "noItems": { + "title": "Cargando iconos externos", + "text": "Esto puede tomar unos segundos" + } } }, "integration": { diff --git a/public/locales/es/modules/dashdot.json b/public/locales/es/modules/dashdot.json index d78a8de61..ee2cd2bb0 100644 --- a/public/locales/es/modules/dashdot.json +++ b/public/locales/es/modules/dashdot.json @@ -9,6 +9,72 @@ }, "usePercentages": { "label": "Mostrar porcentajes" + }, + "columns": { + "label": "Mostrar columnas" + }, + "graphHeight": { + "label": "Altura de gráficos" + }, + "graphsOrder": { + "label": "Gráficos (Órden)", + "storage": { + "label": "Almacenamiento", + "enabled": { + "label": "Mostrar en widget" + }, + "span": { + "label": "Espacio de columna (span)" + }, + "compactView": { + "label": "Mostrar como texto (compacto)" + }, + "multiView": { + "label": "Mostrar como vistas de varias unidades" + } + }, + "network": { + "label": "Red", + "enabled": { + "label": "Mostrar en widget" + }, + "span": { + "label": "Espacio de columna (span)" + }, + "compactView": { + "label": "Mostrar como texto (compacto)" + } + }, + "cpu": { + "label": "CPU", + "enabled": { + "label": "Mostrar en widget" + }, + "span": { + "label": "Espacio de columna (span)" + }, + "multiView": { + "label": "Mostrar como vistas multi-core" + } + }, + "ram": { + "label": "RAM", + "enabled": { + "label": "Mostrar en widget" + }, + "span": { + "label": "Espacio de columna (span)" + } + }, + "gpu": { + "label": "GPU", + "enabled": { + "label": "Mostrar en widget" + }, + "span": { + "label": "Espacio de columna (span)" + } + } } } }, diff --git a/public/locales/es/modules/iframe.json b/public/locales/es/modules/iframe.json new file mode 100644 index 000000000..e864015ae --- /dev/null +++ b/public/locales/es/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "IFrame", + "description": "Incrustar cualquier contenido de Internet. Algunos sitios web pueden restringir el acceso.", + "settings": { + "title": "Ajustes de IFrame", + "embedUrl": { + "label": "URL incrustada" + }, + "allowFullScreen": { + "label": "Permitir pantalla completa" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "Introducir una URL", + "text": "Asegúrate de que has introducido una dirección válida en la configuración del widget" + } + } + } +} \ No newline at end of file diff --git a/public/locales/es/modules/media-server.json b/public/locales/es/modules/media-server.json new file mode 100644 index 000000000..a75074660 --- /dev/null +++ b/public/locales/es/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Servidor Multimedia", + "description": "Interacciona con tu servidor Jellyfin o Plex", + "settings": { + "title": "Ajustes para el widget del servidor multimedia" + } + }, + "card": { + "table": { + "header": { + "session": "Sesión", + "user": "Usuario", + "currentlyPlaying": "Reproducción en curso" + } + }, + "errors": { + "general": { + "title": "Imposible cargar el contenido", + "text": "Imposible recuperar la información del servidor. Consulta los registros para obtener más detalles" + } + } + } +} \ No newline at end of file diff --git a/public/locales/es/modules/rss.json b/public/locales/es/modules/rss.json new file mode 100644 index 000000000..190f19072 --- /dev/null +++ b/public/locales/es/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "Widget RSS", + "description": "Toma los elementos de una fuente RSS y los muestra. Comúnmente utilizado para noticias en línea", + "settings": { + "title": "Ajustes para el widget RSS", + "rssFeedUrl": { + "label": "url de la fuente RSS" + } + } + }, + "card": { + "errors": { + "general": { + "title": "Imposible recuperar la fuente RSS", + "text": "Hubo un problema al comunicarse con la fuente RSS. Asegúrate de haber configurado el feed correctamente y utiliza una URL de RSS válida que coincida con la especificación estándar oficial. Después de actualizar el feed, es posible que debas guardar tu dashboard y actualizar la página." + } + } + } +} \ No newline at end of file diff --git a/public/locales/es/modules/video-stream.json b/public/locales/es/modules/video-stream.json new file mode 100644 index 000000000..13adf6ab9 --- /dev/null +++ b/public/locales/es/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Video en directo", + "description": "Incrustar una transmisión de video o un video de una cámara o un sitio web", + "settings": { + "title": "Ajustes del widget de transmisión de video", + "FeedUrl": { + "label": "Feed url" + }, + "autoPlay": { + "label": "Auto-reproducción" + }, + "muted": { + "label": "Audio silenciado" + }, + "controls": { + "label": "Controles del reproductor de video" + } + } + }, + "errors": { + "invalidStream": "Transmisión no válida" + } +} \ No newline at end of file diff --git a/public/locales/fr/layout/modals/about.json b/public/locales/fr/layout/modals/about.json index 3fd307bdb..768c723d4 100644 --- a/public/locales/fr/layout/modals/about.json +++ b/public/locales/fr/layout/modals/about.json @@ -8,6 +8,7 @@ "version": "Version", "nodeEnvironment": "Environnement Node", "i18n": "Traductions I18n chargées", - "locales": "Locales I18n configurées" + "locales": "Locales I18n configurées", + "experimental_disableEditMode": "EXPÉRIMENTAL : désactiver le mode édition" } } \ No newline at end of file diff --git a/public/locales/fr/layout/modals/add-app.json b/public/locales/fr/layout/modals/add-app.json index 7be708ecd..a79f70f53 100644 --- a/public/locales/fr/layout/modals/add-app.json +++ b/public/locales/fr/layout/modals/add-app.json @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "Icône de l’app", - "description": "L'icône qui sera affichée sur le tableau de bord." + "description": "", + "autocomplete": { + "title": "", + "text": "" + }, + "noItems": { + "title": "", + "text": "" + } } }, "integration": { diff --git a/public/locales/fr/modules/dashdot.json b/public/locales/fr/modules/dashdot.json index 0740f87ed..84d05bff0 100644 --- a/public/locales/fr/modules/dashdot.json +++ b/public/locales/fr/modules/dashdot.json @@ -9,6 +9,72 @@ }, "usePercentages": { "label": "Afficher les pourcentages" + }, + "columns": { + "label": "Affichage des colonnes" + }, + "graphHeight": { + "label": "" + }, + "graphsOrder": { + "label": "", + "storage": { + "label": "Stockage", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "compactView": { + "label": "" + }, + "multiView": { + "label": "" + } + }, + "network": { + "label": "Réseau", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "compactView": { + "label": "" + } + }, + "cpu": { + "label": "CPU", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "multiView": { + "label": "" + } + }, + "ram": { + "label": "RAM", + "enabled": { + "label": "" + }, + "span": { + "label": "" + } + }, + "gpu": { + "label": "GPU", + "enabled": { + "label": "" + }, + "span": { + "label": "" + } + } } } }, diff --git a/public/locales/fr/modules/iframe.json b/public/locales/fr/modules/iframe.json new file mode 100644 index 000000000..8c861e144 --- /dev/null +++ b/public/locales/fr/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "embedUrl": { + "label": "" + }, + "allowFullScreen": { + "label": "Permettre le plein écran" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "Saisir une URL", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/fr/modules/media-server.json b/public/locales/fr/modules/media-server.json new file mode 100644 index 000000000..667593838 --- /dev/null +++ b/public/locales/fr/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Serveur multimédia", + "description": "Interagissez avec votre server multimédia Jellyfin ou Plex", + "settings": { + "title": "" + } + }, + "card": { + "table": { + "header": { + "session": "Session", + "user": "Utilisateur", + "currentlyPlaying": "" + } + }, + "errors": { + "general": { + "title": "Impossible de charger le contenu", + "text": "Impossible de récupérer les informations du serveur. Veuillez vérifier les journaux pour davantage de détails" + } + } + } +} \ No newline at end of file diff --git a/public/locales/fr/modules/rss.json b/public/locales/fr/modules/rss.json new file mode 100644 index 000000000..438b3cb3e --- /dev/null +++ b/public/locales/fr/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "Widget RSS", + "description": "", + "settings": { + "title": "", + "rssFeedUrl": { + "label": "URL du flux RSS" + } + } + }, + "card": { + "errors": { + "general": { + "title": "Impossible de récupérer le flux RSS", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/fr/modules/video-stream.json b/public/locales/fr/modules/video-stream.json new file mode 100644 index 000000000..6639c669d --- /dev/null +++ b/public/locales/fr/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "FeedUrl": { + "label": "" + }, + "autoPlay": { + "label": "" + }, + "muted": { + "label": "" + }, + "controls": { + "label": "" + } + } + }, + "errors": { + "invalidStream": "Flux invalide" + } +} \ No newline at end of file diff --git a/public/locales/fr/settings/customization/page-appearance.json b/public/locales/fr/settings/customization/page-appearance.json index 201d5e007..465cf0a01 100644 --- a/public/locales/fr/settings/customization/page-appearance.json +++ b/public/locales/fr/settings/customization/page-appearance.json @@ -16,7 +16,7 @@ "description": "L'icône qui est utilisé devant le nom de votre onglet" }, "background": { - "label": "Contexte" + "label": "Fond" }, "customCSS": { "label": "CSS personnalisé", diff --git a/public/locales/he/layout/modals/about.json b/public/locales/he/layout/modals/about.json index 4caee7d5b..0695094f3 100644 --- a/public/locales/he/layout/modals/about.json +++ b/public/locales/he/layout/modals/about.json @@ -8,6 +8,7 @@ "version": "גרסה", "nodeEnvironment": "סביבת Node", "i18n": "מרחבי שמות של תרגום I18n טעונים", - "locales": "אזורי I18n מוגדרים" + "locales": "אזורי I18n מוגדרים", + "experimental_disableEditMode": "נסיוני: ביטול מצב עריכה" } } \ No newline at end of file diff --git a/public/locales/he/layout/modals/add-app.json b/public/locales/he/layout/modals/add-app.json index feae550bb..111f91a0b 100644 --- a/public/locales/he/layout/modals/add-app.json +++ b/public/locales/he/layout/modals/add-app.json @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "סמל אפליקציה", - "description": "הסמל שיוצג בלוח המחוונים." + "description": "בחר סמל שיוצג בלוח המחוונים שלך. ניתן לבחור סמלים מ- {{suggestionsCount}} או הזן כתובת אתר משלך", + "autocomplete": { + "title": "לא נמצאו תוצאות", + "text": "נא להשתמש במונח חיפוש ספציפי יותר. אם הסמל הרצוי לא נמצא ניתן להעתיק את כתובת האתר של התמונה למעלה עבור סמל מותאם אישית" + }, + "noItems": { + "title": "טוען אייקונים חיצוניים", + "text": "פעולה זו עשויה להימשך מספר שניות" + } } }, "integration": { diff --git a/public/locales/he/modules/dashdot.json b/public/locales/he/modules/dashdot.json index 0eda12e91..b3060ef2c 100644 --- a/public/locales/he/modules/dashdot.json +++ b/public/locales/he/modules/dashdot.json @@ -9,6 +9,72 @@ }, "usePercentages": { "label": "הצג אחוזים" + }, + "columns": { + "label": "הצג עמודות" + }, + "graphHeight": { + "label": "גובה הגרפים" + }, + "graphsOrder": { + "label": "גרפים (הזמנה)", + "storage": { + "label": "אחסון", + "enabled": { + "label": "הצג בווידג'ט" + }, + "span": { + "label": "טווח עמודות" + }, + "compactView": { + "label": "הצג כטקסט (קומפקטי)" + }, + "multiView": { + "label": "הצג כתצוגת ריבוי כוננים" + } + }, + "network": { + "label": "רשת", + "enabled": { + "label": "הצג בווידג'ט" + }, + "span": { + "label": "טווח עמודות" + }, + "compactView": { + "label": "הצג כטקסט (קומפקטי)" + } + }, + "cpu": { + "label": "מעבד", + "enabled": { + "label": "הצג בווידג'ט" + }, + "span": { + "label": "טווח עמודות" + }, + "multiView": { + "label": "הצג כתצוגה מרובה ליבות" + } + }, + "ram": { + "label": "זיכרון פנימי", + "enabled": { + "label": "הצג בווידג'ט" + }, + "span": { + "label": "טווח עמודות" + } + }, + "gpu": { + "label": "מעבד גרפי", + "enabled": { + "label": "הצג בווידג'ט" + }, + "span": { + "label": "טווח עמודות" + } + } } } }, diff --git a/public/locales/he/modules/iframe.json b/public/locales/he/modules/iframe.json new file mode 100644 index 000000000..edecc4ce8 --- /dev/null +++ b/public/locales/he/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "IFrame", + "description": "הטמע כל תוכן מהאינטרנט. חלק מהאתרים עשויים להגביל את הגישה.", + "settings": { + "title": "הגדרות IFrame", + "embedUrl": { + "label": "הטמע כתובת אתר" + }, + "allowFullScreen": { + "label": "הרשאה למסך מלא" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "הזן קישור", + "text": "ודא שהזנת כתובת חוקית בתצורת הווידג'ט שלך" + } + } + } +} \ No newline at end of file diff --git a/public/locales/he/modules/media-server.json b/public/locales/he/modules/media-server.json new file mode 100644 index 000000000..cac231494 --- /dev/null +++ b/public/locales/he/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "שרת מדיה", + "description": "אינטראקציה עם שרת המדיה של Jellyfin או Plex", + "settings": { + "title": "הגדרות עבור ווידג'ט של שרת מדיה" + } + }, + "card": { + "table": { + "header": { + "session": "מופעים", + "user": "משתמש", + "currentlyPlaying": "מנגן כרגע" + } + }, + "errors": { + "general": { + "title": "אין אפשרות לטעון תוכן", + "text": "לא ניתן לאחזר מידע מהשרת. אנא בדוק את היומנים לפרטים נוספים" + } + } + } +} \ No newline at end of file diff --git a/public/locales/he/modules/rss.json b/public/locales/he/modules/rss.json new file mode 100644 index 000000000..b1b9c9dad --- /dev/null +++ b/public/locales/he/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "וידג׳ט רסס", + "description": "תופס את הפריטים מעדכון רסס ומציג אותם. שימוש נפוץ לחדשות מקוונות", + "settings": { + "title": "הגדרות עבור וידג׳ט רסס", + "rssFeedUrl": { + "label": "כתובת אינטרנט להזנת רסס" + } + } + }, + "card": { + "errors": { + "general": { + "title": "לא ניתן לאחזר עדכוני רסס", + "text": "הייתה בעיה ביצירת קשר עם עדכון רסס. ודא שהגדרת בצורה נכונה והשתמש בכתובת אינטרנט חוקית של רסס, התואמת למפרט הסטנדרטי הרשמי. לאחר עדכון כתובת ההזנה, ייתכן שיהיה עליך לבצע שמירה ולרענן את הדף." + } + } + } +} \ No newline at end of file diff --git a/public/locales/he/modules/video-stream.json b/public/locales/he/modules/video-stream.json new file mode 100644 index 000000000..cadc51f45 --- /dev/null +++ b/public/locales/he/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "זרם וידאו", + "description": "הטמע זרם וידאו או וידאו ממצלמה או אתר אינטרנט", + "settings": { + "title": "הגדרות עבור ווידג'ט זרם וידאו", + "FeedUrl": { + "label": "כתובת אתר הזנה" + }, + "autoPlay": { + "label": "הפעלה אוטומטית" + }, + "muted": { + "label": "השתק קול" + }, + "controls": { + "label": "פקדי נגן וידאו" + } + } + }, + "errors": { + "invalidStream": "זרם לא חוקי" + } +} \ No newline at end of file diff --git a/public/locales/it/layout/modals/about.json b/public/locales/it/layout/modals/about.json index 5d794e901..5dd63da61 100644 --- a/public/locales/it/layout/modals/about.json +++ b/public/locales/it/layout/modals/about.json @@ -8,6 +8,7 @@ "version": "Versione", "nodeEnvironment": "Ambiente Node", "i18n": "Translation namespaces I18n caricati", - "locales": "I18n locales configurati" + "locales": "I18n locales configurati", + "experimental_disableEditMode": "" } } \ No newline at end of file diff --git a/public/locales/it/layout/modals/add-app.json b/public/locales/it/layout/modals/add-app.json index 924813a35..7f4ea37a6 100644 --- a/public/locales/it/layout/modals/add-app.json +++ b/public/locales/it/layout/modals/add-app.json @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "Icona App", - "description": "L'icona che verrà visualizzata sulla dashboard." + "description": "Scegli un'icona da visualizzare sulla tua dashboard. Scegli tra {{suggestionsCount}} icone o inserisci il tuo URL", + "autocomplete": { + "title": "Nessun risultato trovato", + "text": "Prova a usare un termine di ricerca più specifico. Se non riesci a trovare l'icona desiderata, incolla l'URL dell'immagine sopra per un'icona personalizzata" + }, + "noItems": { + "title": "Caricamento icone esterne", + "text": "Questa operazione potrebbe richiedere alcuni secondi" + } } }, "integration": { diff --git a/public/locales/it/modules/dashdot.json b/public/locales/it/modules/dashdot.json index 2e1ed177a..0bdba2d02 100644 --- a/public/locales/it/modules/dashdot.json +++ b/public/locales/it/modules/dashdot.json @@ -9,6 +9,72 @@ }, "usePercentages": { "label": "Visualizza percentuali" + }, + "columns": { + "label": "Visualizza colonne" + }, + "graphHeight": { + "label": "Altezza dei grafici" + }, + "graphsOrder": { + "label": "Grafici (Ordine)", + "storage": { + "label": "Spazio di archiviazione", + "enabled": { + "label": "Mostra nel widget" + }, + "span": { + "label": "Larghezza colonna" + }, + "compactView": { + "label": "Mostra come testo (compatto)" + }, + "multiView": { + "label": "Mostra come multi-drive-view" + } + }, + "network": { + "label": "Rete", + "enabled": { + "label": "Mostra nel widget" + }, + "span": { + "label": "Larghezza colonna" + }, + "compactView": { + "label": "Mostra come testo (compatto)" + } + }, + "cpu": { + "label": "CPU", + "enabled": { + "label": "Mostra nel widget" + }, + "span": { + "label": "Larghezza colonna" + }, + "multiView": { + "label": "Mostra come multi-core-view" + } + }, + "ram": { + "label": "RAM", + "enabled": { + "label": "Mostra nel widget" + }, + "span": { + "label": "Larghezza colonna" + } + }, + "gpu": { + "label": "GPU", + "enabled": { + "label": "Mostra nel widget" + }, + "span": { + "label": "Larghezza colonna" + } + } } } }, diff --git a/public/locales/it/modules/iframe.json b/public/locales/it/modules/iframe.json new file mode 100644 index 000000000..2083273f6 --- /dev/null +++ b/public/locales/it/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "IFrame", + "description": "Incorpora qualsiasi contenuto da Internet. Alcuni siti web possono limitare l'accesso.", + "settings": { + "title": "Impostazioni IFrame", + "embedUrl": { + "label": "Incorpora URL" + }, + "allowFullScreen": { + "label": "Consenti schermo intero" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "Inserisci un URL", + "text": "Assicurarsi di aver inserito un indirizzo valido nella configurazione del widget" + } + } + } +} \ No newline at end of file diff --git a/public/locales/it/modules/media-server.json b/public/locales/it/modules/media-server.json new file mode 100644 index 000000000..319f128e4 --- /dev/null +++ b/public/locales/it/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Server multimediale", + "description": "Interagisci con il tuo server multimediale Jellyfin o Plex", + "settings": { + "title": "Impostazioni per il widget del server multimediale" + } + }, + "card": { + "table": { + "header": { + "session": "Sessione", + "user": "Utente", + "currentlyPlaying": "In riproduzione" + } + }, + "errors": { + "general": { + "title": "Impossibile caricare il contenuto", + "text": "Impossibile recuperare le informazioni dal server. Controllare i log per maggiori dettagli" + } + } + } +} \ No newline at end of file diff --git a/public/locales/it/modules/rss.json b/public/locales/it/modules/rss.json new file mode 100644 index 000000000..dd5023117 --- /dev/null +++ b/public/locales/it/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "Widget RSS", + "description": "Ottiene gli oggetti da un feed RSS e li visualizza. Utilizzati comunemente per le notizie online", + "settings": { + "title": "Impostazioni del widget RSS", + "rssFeedUrl": { + "label": "RSS feed url" + } + } + }, + "card": { + "errors": { + "general": { + "title": "Impossibile recuperare il feed RSS", + "text": "Si è verificato un problema nel raggiungere il feed RSS. Assicurarsi di aver configurato correttamente il feed e di utilizzare un url RSS valido, che corrisponda alle specifiche standard ufficiali. Dopo aver aggiornato il feed, potrebbe essere necessario salvare la dashboard e aggiornare la pagina." + } + } + } +} \ No newline at end of file diff --git a/public/locales/it/modules/video-stream.json b/public/locales/it/modules/video-stream.json new file mode 100644 index 000000000..9ec158a2f --- /dev/null +++ b/public/locales/it/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Flusso Video", + "description": "Incorpora un flusso video o un video da una videocamera o da un sito web", + "settings": { + "title": "Impostazioni per il widget flusso video", + "FeedUrl": { + "label": "Url del feed" + }, + "autoPlay": { + "label": "Auto play" + }, + "muted": { + "label": "Audio mutato" + }, + "controls": { + "label": "Controlli player video" + } + } + }, + "errors": { + "invalidStream": "Flusso non valido" + } +} \ No newline at end of file diff --git a/public/locales/ja/layout/modals/about.json b/public/locales/ja/layout/modals/about.json index d4d1a9787..8dd9f4ed9 100644 --- a/public/locales/ja/layout/modals/about.json +++ b/public/locales/ja/layout/modals/about.json @@ -8,6 +8,7 @@ "version": "バージョン", "nodeEnvironment": "", "i18n": "", - "locales": "" + "locales": "", + "experimental_disableEditMode": "" } } \ No newline at end of file diff --git a/public/locales/ja/layout/modals/add-app.json b/public/locales/ja/layout/modals/add-app.json index f1e2b69c7..a10926bd5 100644 --- a/public/locales/ja/layout/modals/add-app.json +++ b/public/locales/ja/layout/modals/add-app.json @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "アプリアイコン", - "description": "ダッシュボードに表示されるアイコンです。" + "description": "", + "autocomplete": { + "title": "", + "text": "" + }, + "noItems": { + "title": "", + "text": "" + } } }, "integration": { diff --git a/public/locales/ja/modules/dashdot.json b/public/locales/ja/modules/dashdot.json index 0acb36182..e826ea0f1 100644 --- a/public/locales/ja/modules/dashdot.json +++ b/public/locales/ja/modules/dashdot.json @@ -9,6 +9,72 @@ }, "usePercentages": { "label": "" + }, + "columns": { + "label": "" + }, + "graphHeight": { + "label": "" + }, + "graphsOrder": { + "label": "", + "storage": { + "label": "ストレージ", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "compactView": { + "label": "" + }, + "multiView": { + "label": "" + } + }, + "network": { + "label": "ネットワーク", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "compactView": { + "label": "" + } + }, + "cpu": { + "label": "CPU", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "multiView": { + "label": "" + } + }, + "ram": { + "label": "", + "enabled": { + "label": "" + }, + "span": { + "label": "" + } + }, + "gpu": { + "label": "GPU", + "enabled": { + "label": "" + }, + "span": { + "label": "" + } + } } } }, diff --git a/public/locales/ja/modules/iframe.json b/public/locales/ja/modules/iframe.json new file mode 100644 index 000000000..18c90c392 --- /dev/null +++ b/public/locales/ja/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "embedUrl": { + "label": "" + }, + "allowFullScreen": { + "label": "" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/ja/modules/media-server.json b/public/locales/ja/modules/media-server.json new file mode 100644 index 000000000..2be958199 --- /dev/null +++ b/public/locales/ja/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "card": { + "table": { + "header": { + "session": "", + "user": "", + "currentlyPlaying": "" + } + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/ja/modules/rss.json b/public/locales/ja/modules/rss.json new file mode 100644 index 000000000..230d75cf5 --- /dev/null +++ b/public/locales/ja/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "rssFeedUrl": { + "label": "" + } + } + }, + "card": { + "errors": { + "general": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/ja/modules/video-stream.json b/public/locales/ja/modules/video-stream.json new file mode 100644 index 000000000..539daa1c4 --- /dev/null +++ b/public/locales/ja/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "FeedUrl": { + "label": "" + }, + "autoPlay": { + "label": "" + }, + "muted": { + "label": "" + }, + "controls": { + "label": "" + } + } + }, + "errors": { + "invalidStream": "" + } +} \ No newline at end of file diff --git a/public/locales/ko/layout/modals/about.json b/public/locales/ko/layout/modals/about.json index bd458a81f..8b1597659 100644 --- a/public/locales/ko/layout/modals/about.json +++ b/public/locales/ko/layout/modals/about.json @@ -8,6 +8,7 @@ "version": "", "nodeEnvironment": "", "i18n": "", - "locales": "" + "locales": "", + "experimental_disableEditMode": "" } } \ No newline at end of file diff --git a/public/locales/ko/layout/modals/add-app.json b/public/locales/ko/layout/modals/add-app.json index fa07081e7..f3bcd173d 100644 --- a/public/locales/ko/layout/modals/add-app.json +++ b/public/locales/ko/layout/modals/add-app.json @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "", - "description": "" + "description": "", + "autocomplete": { + "title": "", + "text": "" + }, + "noItems": { + "title": "", + "text": "" + } } }, "integration": { diff --git a/public/locales/ko/modules/dashdot.json b/public/locales/ko/modules/dashdot.json index 558b6806a..20bfd9994 100644 --- a/public/locales/ko/modules/dashdot.json +++ b/public/locales/ko/modules/dashdot.json @@ -9,6 +9,72 @@ }, "usePercentages": { "label": "" + }, + "columns": { + "label": "" + }, + "graphHeight": { + "label": "" + }, + "graphsOrder": { + "label": "", + "storage": { + "label": "저장소", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "compactView": { + "label": "" + }, + "multiView": { + "label": "" + } + }, + "network": { + "label": "네트워크", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "compactView": { + "label": "" + } + }, + "cpu": { + "label": "CPU", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "multiView": { + "label": "" + } + }, + "ram": { + "label": "", + "enabled": { + "label": "" + }, + "span": { + "label": "" + } + }, + "gpu": { + "label": "GPU", + "enabled": { + "label": "" + }, + "span": { + "label": "" + } + } } } }, diff --git a/public/locales/ko/modules/iframe.json b/public/locales/ko/modules/iframe.json new file mode 100644 index 000000000..18c90c392 --- /dev/null +++ b/public/locales/ko/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "embedUrl": { + "label": "" + }, + "allowFullScreen": { + "label": "" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/ko/modules/media-server.json b/public/locales/ko/modules/media-server.json new file mode 100644 index 000000000..2be958199 --- /dev/null +++ b/public/locales/ko/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "card": { + "table": { + "header": { + "session": "", + "user": "", + "currentlyPlaying": "" + } + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/ko/modules/rss.json b/public/locales/ko/modules/rss.json new file mode 100644 index 000000000..230d75cf5 --- /dev/null +++ b/public/locales/ko/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "rssFeedUrl": { + "label": "" + } + } + }, + "card": { + "errors": { + "general": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/ko/modules/video-stream.json b/public/locales/ko/modules/video-stream.json new file mode 100644 index 000000000..539daa1c4 --- /dev/null +++ b/public/locales/ko/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "FeedUrl": { + "label": "" + }, + "autoPlay": { + "label": "" + }, + "muted": { + "label": "" + }, + "controls": { + "label": "" + } + } + }, + "errors": { + "invalidStream": "" + } +} \ No newline at end of file diff --git a/public/locales/lol/layout/modals/about.json b/public/locales/lol/layout/modals/about.json index f50d0196c..01b72d566 100644 --- a/public/locales/lol/layout/modals/about.json +++ b/public/locales/lol/layout/modals/about.json @@ -8,6 +8,7 @@ "version": "Vershun", "nodeEnvironment": "", "i18n": "", - "locales": "" + "locales": "", + "experimental_disableEditMode": "" } } \ No newline at end of file diff --git a/public/locales/lol/layout/modals/add-app.json b/public/locales/lol/layout/modals/add-app.json index 6c3e7645d..92f4e4a45 100644 --- a/public/locales/lol/layout/modals/add-app.json +++ b/public/locales/lol/layout/modals/add-app.json @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "App Icon", - "description": "Teh Icon Dat Will Be Displayd On Teh Dashbord." + "description": "", + "autocomplete": { + "title": "", + "text": "" + }, + "noItems": { + "title": "", + "text": "" + } } }, "integration": { diff --git a/public/locales/lol/modules/dashdot.json b/public/locales/lol/modules/dashdot.json index 022b020e6..46af1ed23 100644 --- a/public/locales/lol/modules/dashdot.json +++ b/public/locales/lol/modules/dashdot.json @@ -9,6 +9,72 @@ }, "usePercentages": { "label": "" + }, + "columns": { + "label": "" + }, + "graphHeight": { + "label": "" + }, + "graphsOrder": { + "label": "", + "storage": { + "label": "Storagzzz", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "compactView": { + "label": "" + }, + "multiView": { + "label": "" + } + }, + "network": { + "label": "Netwerk", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "compactView": { + "label": "" + } + }, + "cpu": { + "label": "CPU", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "multiView": { + "label": "" + } + }, + "ram": { + "label": "", + "enabled": { + "label": "" + }, + "span": { + "label": "" + } + }, + "gpu": { + "label": "GPU", + "enabled": { + "label": "" + }, + "span": { + "label": "" + } + } } } }, diff --git a/public/locales/lol/modules/iframe.json b/public/locales/lol/modules/iframe.json new file mode 100644 index 000000000..18c90c392 --- /dev/null +++ b/public/locales/lol/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "embedUrl": { + "label": "" + }, + "allowFullScreen": { + "label": "" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/lol/modules/media-server.json b/public/locales/lol/modules/media-server.json new file mode 100644 index 000000000..2be958199 --- /dev/null +++ b/public/locales/lol/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "card": { + "table": { + "header": { + "session": "", + "user": "", + "currentlyPlaying": "" + } + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/lol/modules/rss.json b/public/locales/lol/modules/rss.json new file mode 100644 index 000000000..230d75cf5 --- /dev/null +++ b/public/locales/lol/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "rssFeedUrl": { + "label": "" + } + } + }, + "card": { + "errors": { + "general": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/lol/modules/video-stream.json b/public/locales/lol/modules/video-stream.json new file mode 100644 index 000000000..539daa1c4 --- /dev/null +++ b/public/locales/lol/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "FeedUrl": { + "label": "" + }, + "autoPlay": { + "label": "" + }, + "muted": { + "label": "" + }, + "controls": { + "label": "" + } + } + }, + "errors": { + "invalidStream": "" + } +} \ No newline at end of file diff --git a/public/locales/nl/layout/modals/about.json b/public/locales/nl/layout/modals/about.json index 43018df1d..55c4b01f4 100644 --- a/public/locales/nl/layout/modals/about.json +++ b/public/locales/nl/layout/modals/about.json @@ -3,11 +3,12 @@ "contact": "Problemen of vragen? Neem contact met ons op!", "addToDashboard": "Aan dashboard toevoegen", "metrics": { - "configurationSchemaVersion": "", - "configurationsCount": "", + "configurationSchemaVersion": "Versie configuratieschema", + "configurationsCount": "Beschikbare configuraties", "version": "Versie", - "nodeEnvironment": "", - "i18n": "", - "locales": "" + "nodeEnvironment": "Knooppuntomgeving", + "i18n": "I18n vertaling namespaces geladen", + "locales": "I18n talen geconfigureerd", + "experimental_disableEditMode": "" } } \ No newline at end of file diff --git a/public/locales/nl/layout/modals/add-app.json b/public/locales/nl/layout/modals/add-app.json index 3bad4836a..c3a67bfe0 100644 --- a/public/locales/nl/layout/modals/add-app.json +++ b/public/locales/nl/layout/modals/add-app.json @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "App icoon", - "description": "Het pictogram dat op het dashboard wordt weergegeven." + "description": "", + "autocomplete": { + "title": "", + "text": "" + }, + "noItems": { + "title": "", + "text": "" + } } }, "integration": { diff --git a/public/locales/nl/layout/modals/icon-picker.json b/public/locales/nl/layout/modals/icon-picker.json index 349810cb9..3d2f68b75 100644 --- a/public/locales/nl/layout/modals/icon-picker.json +++ b/public/locales/nl/layout/modals/icon-picker.json @@ -1,7 +1,7 @@ { "iconPicker": { - "textInputPlaceholder": "", - "searchLimitationTitle": "", - "searchLimitationMessage": "" + "textInputPlaceholder": "Zoek iets...", + "searchLimitationTitle": "Beperkt tot 30 resultaten", + "searchLimitationMessage": "De zoekresultaten werden beperkt tot 30 omdat er te veel overeenkomsten waren" } } \ No newline at end of file diff --git a/public/locales/nl/modules/calendar.json b/public/locales/nl/modules/calendar.json index 7313009ed..97240d18b 100644 --- a/public/locales/nl/modules/calendar.json +++ b/public/locales/nl/modules/calendar.json @@ -5,7 +5,7 @@ "settings": { "title": "Instellingen voor Kalender widget", "useSonarrv4": { - "label": "" + "label": "Gebruik Sonarr v4 API" }, "sundayStart": { "label": "Begin de week op zondag" diff --git a/public/locales/nl/modules/dashdot.json b/public/locales/nl/modules/dashdot.json index 4423a2945..4c8a28716 100644 --- a/public/locales/nl/modules/dashdot.json +++ b/public/locales/nl/modules/dashdot.json @@ -8,7 +8,73 @@ "label": "Dash. URL" }, "usePercentages": { - "label": "" + "label": "Percentages weergeven" + }, + "columns": { + "label": "Kolommen weergeven" + }, + "graphHeight": { + "label": "Hoogte van de grafieken" + }, + "graphsOrder": { + "label": "Grafieken (volgorde)", + "storage": { + "label": "Opslagruimte", + "enabled": { + "label": "Toon in widget" + }, + "span": { + "label": "Kolombreedte" + }, + "compactView": { + "label": "Toon als tekst (compact)" + }, + "multiView": { + "label": "Toon als multi-drive-weergave" + } + }, + "network": { + "label": "Netwerk", + "enabled": { + "label": "Toon in widget" + }, + "span": { + "label": "Kolombreedte" + }, + "compactView": { + "label": "Toon als tekst (compact)" + } + }, + "cpu": { + "label": "CPU", + "enabled": { + "label": "Toon in widget" + }, + "span": { + "label": "Kolombreedte" + }, + "multiView": { + "label": "Toon als multi-core-weergave" + } + }, + "ram": { + "label": "RAM", + "enabled": { + "label": "Toon in widget" + }, + "span": { + "label": "Kolombreedte" + } + }, + "gpu": { + "label": "GPU", + "enabled": { + "label": "Toon in widget" + }, + "span": { + "label": "Kolombreedte" + } + } } } }, @@ -18,8 +84,8 @@ "noService": "Geen Dash. service gevonden. Voeg er een toe aan uw Homarr dashboard of stel een Dashdot URL in in de opties van de module", "noInformation": "Kan geen informatie verkrijgen van dash. - gebruikt u de laatste versie?", "protocolDowngrade": { - "title": "", - "text": "" + "title": "Protocol downgrade gedetecteerd", + "text": "Het protocol voor uw Dash. instantie wordt gedegradeerd. Dit vormt een risico voor de beveiliging, aangezien HTTP ongecodeerd is en aanvallers deze verbinding kunnen misbruiken. Zorg ervoor dat Dash. wordt uitgevoerd op HTTPS of downgrade Homarr naar HTTP (niet aanbevolen)." } }, "graphs": { diff --git a/public/locales/nl/modules/iframe.json b/public/locales/nl/modules/iframe.json new file mode 100644 index 000000000..75830367b --- /dev/null +++ b/public/locales/nl/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "iFrame", + "description": "", + "settings": { + "title": "iFrame Instellingen", + "embedUrl": { + "label": "" + }, + "allowFullScreen": { + "label": "Volledig scherm toestaan" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "Voer URL in", + "text": "Zorg ervoor dat je een geldig adres hebt ingevoerd in de configuratie van je widget" + } + } + } +} \ No newline at end of file diff --git a/public/locales/nl/modules/media-server.json b/public/locales/nl/modules/media-server.json new file mode 100644 index 000000000..b3d688b9f --- /dev/null +++ b/public/locales/nl/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Media Server", + "description": "Interageer met uw Jellyfin of Plex mediaserver", + "settings": { + "title": "Instellingen voor media server widget" + } + }, + "card": { + "table": { + "header": { + "session": "Sessie", + "user": "Gebruiker", + "currentlyPlaying": "Nu aan het afspelen" + } + }, + "errors": { + "general": { + "title": "Het is niet mogelijk om de content te laden", + "text": "Kan geen informatie van de server ophalen. Controleer de logs voor meer details" + } + } + } +} \ No newline at end of file diff --git a/public/locales/nl/modules/rss.json b/public/locales/nl/modules/rss.json new file mode 100644 index 000000000..e861987b2 --- /dev/null +++ b/public/locales/nl/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "RSS Widget", + "description": "Pakt de items uit een RSS-feed en geeft ze weer. Wordt vaak gebruikt voor online nieuws", + "settings": { + "title": "Instellingen voor RSS widget", + "rssFeedUrl": { + "label": "RSS feed URL" + } + } + }, + "card": { + "errors": { + "general": { + "title": "Kan RSS feed niet ophalen", + "text": "Er was een probleem met het bereiken van de RSS feed. Zorg ervoor dat je de feed correct hebt geconfigureerd en een geldige RSS URL gebruikt, die overeenkomt met de officiële standaardspecificatie. Nadat u de feed hebt bijgewerkt, moet u mogelijk uw dashboard opslaan en de pagina vernieuwen." + } + } + } +} \ No newline at end of file diff --git a/public/locales/nl/modules/torrents-status.json b/public/locales/nl/modules/torrents-status.json index cd4352b90..6fb2b0ff8 100644 --- a/public/locales/nl/modules/torrents-status.json +++ b/public/locales/nl/modules/torrents-status.json @@ -61,9 +61,9 @@ "introductionPrefix": "Beheerd door", "metrics": { "queuePosition": "Positie in de wachtrij - {{position}}", - "progress": "Vooruitgang - {{progress}}%", + "progress": "Voortgang - {{progress}}%", "totalSelectedSize": "Totaal - {{totalSize}}", - "state": "Staat - {{state}}", + "state": "Status - {{state}}", "ratio": "Verhouding -", "completed": "Voltooid" } diff --git a/public/locales/nl/modules/video-stream.json b/public/locales/nl/modules/video-stream.json new file mode 100644 index 000000000..979e65b50 --- /dev/null +++ b/public/locales/nl/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Video streams", + "description": "Voeg een video stream, video van een camera of een website in", + "settings": { + "title": "Instellingen voor videostream-widget", + "FeedUrl": { + "label": "Feed URL" + }, + "autoPlay": { + "label": "Automatisch afspelen" + }, + "muted": { + "label": "Gedempte audio" + }, + "controls": { + "label": "Bedieningselementen videospeler" + } + } + }, + "errors": { + "invalidStream": "Ongeldige stream" + } +} \ No newline at end of file diff --git a/public/locales/nl/settings/common.json b/public/locales/nl/settings/common.json index 05fa7fa2f..94b80067f 100644 --- a/public/locales/nl/settings/common.json +++ b/public/locales/nl/settings/common.json @@ -10,19 +10,19 @@ }, "credits": { "madeWithLove": "Gemaakt met ❤️ door @", - "thirdPartyContent": "", + "thirdPartyContent": "Inhoud van derden bekijken", "thirdPartyContentTable": { - "dependencyName": "", + "dependencyName": "Dependency", "dependencyVersion": "Versie" } }, "grow": "Groei raster (neem alle ruimte)", "layout": { "preview": { - "title": "", - "subtitle": "" + "title": "Voorbeeld", + "subtitle": "Wijzigingen worden automatisch opgeslagen" }, - "divider": "", + "divider": "Layout opties", "main": "Algemeen", "sidebar": "Zijbalk", "cannotturnoff": "Kan niet worden uitgeschakeld", diff --git a/public/locales/nl/settings/customization/color-selector.json b/public/locales/nl/settings/customization/color-selector.json index a6f500c0e..1945db1c2 100644 --- a/public/locales/nl/settings/customization/color-selector.json +++ b/public/locales/nl/settings/customization/color-selector.json @@ -1,3 +1,4 @@ { + "colors": "Kleuren", "suffix": "{{color}} kleur" } \ No newline at end of file diff --git a/public/locales/nl/settings/customization/general.json b/public/locales/nl/settings/customization/general.json index ee9d30b5a..c3068a957 100644 --- a/public/locales/nl/settings/customization/general.json +++ b/public/locales/nl/settings/customization/general.json @@ -1,21 +1,21 @@ { - "text": "", + "text": "Met aanpassingen kan je je ervaring met Homarr configureren en aanpassen naar je voorkeuren.", "accordeon": { "layout": { - "name": "", - "description": "" + "name": "Indeling", + "description": "Elementen op je header en dashboard tegels in- en uitschakelen" }, "gridstack": { - "name": "", - "description": "" + "name": "Gridstack", + "description": "Het gedrag en de kolommen van je dashboard aanpassen" }, "pageMetadata": { - "name": "", - "description": "" + "name": "Pagina Metadata", + "description": "Tegels, logo en PWA aanpassen" }, "appereance": { - "name": "", - "description": "" + "name": "Uiterlijk", + "description": "Pas de achtergrond, kleuren en het uiterlijk van apps aan." } } } \ No newline at end of file diff --git a/public/locales/nl/settings/customization/gridstack.json b/public/locales/nl/settings/customization/gridstack.json index 18c3d8233..d3e645596 100644 --- a/public/locales/nl/settings/customization/gridstack.json +++ b/public/locales/nl/settings/customization/gridstack.json @@ -1,10 +1,10 @@ { "columnsCount": { - "labelPreset": "", - "descriptionPreset": "", - "descriptionExceedsPreset": "" + "labelPreset": "Kolommen in {{size}} grootte", + "descriptionPreset": "Aantal kolommen wanneer het scherm minder dan {{pixels}} pixels breed is.", + "descriptionExceedsPreset": "Aantal kolommen wanneer het scherm groter is dan {{pixels}} pixels" }, - "unsavedChanges": "", - "applyChanges": "", - "defaultValues": "" + "unsavedChanges": "Je hebt niet opgeslagen wijzigingen. Klik op de knop Wijzigingen toepassen om ze toe te passen en op te slaan.", + "applyChanges": "Wijzigingen toepassen", + "defaultValues": "Standaardwaarden" } \ No newline at end of file diff --git a/public/locales/nl/settings/customization/page-appearance.json b/public/locales/nl/settings/customization/page-appearance.json index f1d43504e..f22542a73 100644 --- a/public/locales/nl/settings/customization/page-appearance.json +++ b/public/locales/nl/settings/customization/page-appearance.json @@ -1,28 +1,28 @@ { "pageTitle": { "label": "Paginatitel", - "description": "" + "description": "De titel van het dashboard linksboven" }, "metaTitle": { "label": "Meta Titel", - "description": "" + "description": "De titel, die als uw tabnaam wordt weergegeven" }, "logo": { "label": "Logo", - "description": "" + "description": "Het dashboardlogo linksboven" }, "favicon": { "label": "Favicon", - "description": "" + "description": "Het pictogram, dat wordt gebruik voor de naam van het tabblad" }, "background": { "label": "Achtergrond" }, "customCSS": { "label": "Eigen CSS", - "description": "", + "description": "Alle elementen op je dashboard aanpassen, alleen aanbevolen voor ervaren gebruikers", "placeholder": "Eigen CSS wordt als laatste toegepast", - "applying": "" + "applying": "CSS toepassen..." }, "buttons": { "submit": "Indienen" diff --git a/public/locales/no/layout/modals/about.json b/public/locales/no/layout/modals/about.json index f6b3b4a07..625aa5679 100644 --- a/public/locales/no/layout/modals/about.json +++ b/public/locales/no/layout/modals/about.json @@ -8,6 +8,7 @@ "version": "Versjon", "nodeEnvironment": "Node miljø", "i18n": "Lastet I18n oversettelsesnavneområder", - "locales": "Konfigurerte I18n-lokasjoner" + "locales": "Konfigurerte I18n-lokasjoner", + "experimental_disableEditMode": "" } } \ No newline at end of file diff --git a/public/locales/no/layout/modals/add-app.json b/public/locales/no/layout/modals/add-app.json index af92d50d6..b028f8afb 100644 --- a/public/locales/no/layout/modals/add-app.json +++ b/public/locales/no/layout/modals/add-app.json @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "App ikon", - "description": "Ikonet som vises på dashbordet." + "description": "", + "autocomplete": { + "title": "", + "text": "" + }, + "noItems": { + "title": "", + "text": "" + } } }, "integration": { diff --git a/public/locales/no/modules/dashdot.json b/public/locales/no/modules/dashdot.json index 59b393adb..fe2176c7b 100644 --- a/public/locales/no/modules/dashdot.json +++ b/public/locales/no/modules/dashdot.json @@ -9,6 +9,72 @@ }, "usePercentages": { "label": "Vis prosentandel" + }, + "columns": { + "label": "" + }, + "graphHeight": { + "label": "" + }, + "graphsOrder": { + "label": "", + "storage": { + "label": "Lagring", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "compactView": { + "label": "" + }, + "multiView": { + "label": "" + } + }, + "network": { + "label": "Nettverk", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "compactView": { + "label": "" + } + }, + "cpu": { + "label": "CPU", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "multiView": { + "label": "" + } + }, + "ram": { + "label": "", + "enabled": { + "label": "" + }, + "span": { + "label": "" + } + }, + "gpu": { + "label": "GPU", + "enabled": { + "label": "" + }, + "span": { + "label": "" + } + } } } }, diff --git a/public/locales/no/modules/iframe.json b/public/locales/no/modules/iframe.json new file mode 100644 index 000000000..2b9730307 --- /dev/null +++ b/public/locales/no/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "IFrame", + "description": "", + "settings": { + "title": "", + "embedUrl": { + "label": "" + }, + "allowFullScreen": { + "label": "" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/no/modules/media-server.json b/public/locales/no/modules/media-server.json new file mode 100644 index 000000000..2be958199 --- /dev/null +++ b/public/locales/no/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "card": { + "table": { + "header": { + "session": "", + "user": "", + "currentlyPlaying": "" + } + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/no/modules/rss.json b/public/locales/no/modules/rss.json new file mode 100644 index 000000000..230d75cf5 --- /dev/null +++ b/public/locales/no/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "rssFeedUrl": { + "label": "" + } + } + }, + "card": { + "errors": { + "general": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/no/modules/video-stream.json b/public/locales/no/modules/video-stream.json new file mode 100644 index 000000000..a5a7bd13c --- /dev/null +++ b/public/locales/no/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Videostrømming", + "description": "Bygg inn en videostrøm eller video fra et kamera eller et nettsted", + "settings": { + "title": "Innstillinger for videostrøm widget", + "FeedUrl": { + "label": "Feed URL" + }, + "autoPlay": { + "label": "Automatisk avspilling" + }, + "muted": { + "label": "Dempet lyd" + }, + "controls": { + "label": "Kontroll av videospiller" + } + } + }, + "errors": { + "invalidStream": "Ugyldig strøm" + } +} \ No newline at end of file diff --git a/public/locales/pl/layout/modals/about.json b/public/locales/pl/layout/modals/about.json index 91a3ccda1..4b0613636 100644 --- a/public/locales/pl/layout/modals/about.json +++ b/public/locales/pl/layout/modals/about.json @@ -8,6 +8,7 @@ "version": "Wersja", "nodeEnvironment": "", "i18n": "", - "locales": "" + "locales": "", + "experimental_disableEditMode": "" } } \ No newline at end of file diff --git a/public/locales/pl/layout/modals/add-app.json b/public/locales/pl/layout/modals/add-app.json index 282a63b83..91c62ecc0 100644 --- a/public/locales/pl/layout/modals/add-app.json +++ b/public/locales/pl/layout/modals/add-app.json @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "Ikona aplikacji", - "description": "Ikona, która będzie wyświetlana na desce rozdzielczej." + "description": "", + "autocomplete": { + "title": "", + "text": "" + }, + "noItems": { + "title": "", + "text": "" + } } }, "integration": { diff --git a/public/locales/pl/modules/dashdot.json b/public/locales/pl/modules/dashdot.json index 51e958f07..658185860 100644 --- a/public/locales/pl/modules/dashdot.json +++ b/public/locales/pl/modules/dashdot.json @@ -9,6 +9,72 @@ }, "usePercentages": { "label": "" + }, + "columns": { + "label": "" + }, + "graphHeight": { + "label": "" + }, + "graphsOrder": { + "label": "", + "storage": { + "label": "Pamięć", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "compactView": { + "label": "" + }, + "multiView": { + "label": "" + } + }, + "network": { + "label": "Sieć", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "compactView": { + "label": "" + } + }, + "cpu": { + "label": "CPU", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "multiView": { + "label": "" + } + }, + "ram": { + "label": "", + "enabled": { + "label": "" + }, + "span": { + "label": "" + } + }, + "gpu": { + "label": "GPU", + "enabled": { + "label": "" + }, + "span": { + "label": "" + } + } } } }, diff --git a/public/locales/pl/modules/iframe.json b/public/locales/pl/modules/iframe.json new file mode 100644 index 000000000..18c90c392 --- /dev/null +++ b/public/locales/pl/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "embedUrl": { + "label": "" + }, + "allowFullScreen": { + "label": "" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/pl/modules/media-server.json b/public/locales/pl/modules/media-server.json new file mode 100644 index 000000000..2be958199 --- /dev/null +++ b/public/locales/pl/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "card": { + "table": { + "header": { + "session": "", + "user": "", + "currentlyPlaying": "" + } + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/pl/modules/rss.json b/public/locales/pl/modules/rss.json new file mode 100644 index 000000000..230d75cf5 --- /dev/null +++ b/public/locales/pl/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "rssFeedUrl": { + "label": "" + } + } + }, + "card": { + "errors": { + "general": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/pl/modules/video-stream.json b/public/locales/pl/modules/video-stream.json new file mode 100644 index 000000000..539daa1c4 --- /dev/null +++ b/public/locales/pl/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "FeedUrl": { + "label": "" + }, + "autoPlay": { + "label": "" + }, + "muted": { + "label": "" + }, + "controls": { + "label": "" + } + } + }, + "errors": { + "invalidStream": "" + } +} \ No newline at end of file diff --git a/public/locales/pt/layout/modals/about.json b/public/locales/pt/layout/modals/about.json index 30ddc1ac5..a66436fbf 100644 --- a/public/locales/pt/layout/modals/about.json +++ b/public/locales/pt/layout/modals/about.json @@ -1,13 +1,14 @@ { - "description": "Homarr é um elegante, moderno painel de instrumentos que coloca todas as suas aplicações e serviços na ponta dos seus dedos. Com Homarr, pode aceder e controlar tudo num único local conveniente. Homarr integra-se perfeitamente com as aplicações que adicionou, fornecendo-lhe informações valiosas e dando-lhe um controlo completo. A instalação é uma brisa, e Homarr suporta uma vasta gama de métodos de implantação.", + "description": "Homarr é um elegante, moderno painel de instrumentos que coloca todas as suas aplicações e serviços na ponta dos seus dedos. Com Homarr, pode aceder e controlar tudo num único local conveniente. Homarr integra-se perfeitamente com as aplicações que adicionou, fornecendo-lhe informações valiosas e dando-lhe um controlo completo. A instalação é tranquila, e Homarr suporta uma vasta gama de métodos de implantação.", "contact": "Com problemas ou perguntas? Ligue-se a nós!", "addToDashboard": "Adicionar ao Painel de instrumentos", "metrics": { - "configurationSchemaVersion": "", - "configurationsCount": "", + "configurationSchemaVersion": "Versão do esquema de configuração", + "configurationsCount": "Configurações disponíveis", "version": "Versão", - "nodeEnvironment": "", - "i18n": "", - "locales": "" + "nodeEnvironment": "Ambiente do nó", + "i18n": "Espaços de tradução do I18n carregados", + "locales": "Localidades I18n configurados", + "experimental_disableEditMode": "EXPERIMENTAL: Desativar o modo de edição" } } \ No newline at end of file diff --git a/public/locales/pt/layout/modals/add-app.json b/public/locales/pt/layout/modals/add-app.json index 2d362f2ef..e8dc86b96 100644 --- a/public/locales/pt/layout/modals/add-app.json +++ b/public/locales/pt/layout/modals/add-app.json @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "Ícone de aplicação", - "description": "O ícone que será exibido no painel de instrumentos." + "description": "Escolha um ícone a ser exibido no seu painel. Escolha entre {{suggestionsCount}} ícones ou insira sua própria URL", + "autocomplete": { + "title": "Nenhum resultado encontrado", + "text": "Tente usar um termo de pesquisa mais específico. Se não conseguir encontrar o ícone desejado, cole a URL da imagem acima para obter um ícone personalizado" + }, + "noItems": { + "title": "Carregando ícones externos", + "text": "Isto pode levar alguns segundos" + } } }, "integration": { diff --git a/public/locales/pt/modules/calendar.json b/public/locales/pt/modules/calendar.json index d99d072ab..3344c4a6d 100644 --- a/public/locales/pt/modules/calendar.json +++ b/public/locales/pt/modules/calendar.json @@ -5,7 +5,7 @@ "settings": { "title": "Definições para o widget Calendário", "useSonarrv4": { - "label": "" + "label": "Utilizar Sonarr v4 API" }, "sundayStart": { "label": "Comece a semana no Domingo" diff --git a/public/locales/pt/modules/dashdot.json b/public/locales/pt/modules/dashdot.json index 8e186cc72..d8be25ae8 100644 --- a/public/locales/pt/modules/dashdot.json +++ b/public/locales/pt/modules/dashdot.json @@ -8,7 +8,73 @@ "label": "URL do Dash." }, "usePercentages": { - "label": "" + "label": "Exibir porcentagens" + }, + "columns": { + "label": "Exibir Colunas" + }, + "graphHeight": { + "label": "Altura dos gráficos" + }, + "graphsOrder": { + "label": "Gráficos (Ordem)", + "storage": { + "label": "Armazenamento", + "enabled": { + "label": "Exibir o widget" + }, + "span": { + "label": "Extensão da Coluna" + }, + "compactView": { + "label": "Mostrar como texto (compacto)" + }, + "multiView": { + "label": "Exibir como multi-drive-view" + } + }, + "network": { + "label": "Rede", + "enabled": { + "label": "Exibir o widget" + }, + "span": { + "label": "Extensão da Coluna" + }, + "compactView": { + "label": "Mostrar como texto (compacto)" + } + }, + "cpu": { + "label": "CPU", + "enabled": { + "label": "Exibir o widget" + }, + "span": { + "label": "Extensão da Coluna" + }, + "multiView": { + "label": "Exibir como multi-drive-view" + } + }, + "ram": { + "label": "RAM", + "enabled": { + "label": "Exibir o widget" + }, + "span": { + "label": "Extensão da Coluna" + } + }, + "gpu": { + "label": "GPU", + "enabled": { + "label": "Exibir o widget" + }, + "span": { + "label": "Extensão da Coluna" + } + } } } }, @@ -18,8 +84,8 @@ "noService": "Nenhum serviço Dash. encontrado. Por favor, adicione um ao seu painel Homarr ou defina uma URL para o Dash. nas opções do módulo", "noInformation": "Não é possível obter informações do Dash. Você está executando a versão mais recente?", "protocolDowngrade": { - "title": "", - "text": "" + "title": "Downgrade de protocolo detectado", + "text": "O protocolo da sua instancia Dash. está sendo inseguro. Uma vez que HTTP não é criptografado e os invasores podem abusar dessa conexão. Certifique-se de que o Dash. está sendo executado em HTTPS ou configure Homarr para HTTP (não recomendado)." } }, "graphs": { diff --git a/public/locales/pt/modules/iframe.json b/public/locales/pt/modules/iframe.json new file mode 100644 index 000000000..d1786265a --- /dev/null +++ b/public/locales/pt/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "IFrame", + "description": "Incorporar qualquer conteúdo da internet. Alguns sites podem restringir o acesso.", + "settings": { + "title": "Configurações do IFrame", + "embedUrl": { + "label": "Incorporar URL" + }, + "allowFullScreen": { + "label": "Permitir tela cheia" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "Insira uma URL", + "text": "Certifique-se de que você inseriu um endereço válido na configuração do seu widget" + } + } + } +} \ No newline at end of file diff --git a/public/locales/pt/modules/media-server.json b/public/locales/pt/modules/media-server.json new file mode 100644 index 000000000..622f17a53 --- /dev/null +++ b/public/locales/pt/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Servidor de Mídia", + "description": "Interagir com o seu servidor de media Jellyfin ou Plex", + "settings": { + "title": "Configurações para o widget do servidor de mídia" + } + }, + "card": { + "table": { + "header": { + "session": "Sessão", + "user": "Usuário", + "currentlyPlaying": "Tocando agora" + } + }, + "errors": { + "general": { + "title": "Não foi possível carregar o conteúdo", + "text": "Não foi possível obter informações do servidor. Por favor, verifique os logs para mais detalhes" + } + } + } +} \ No newline at end of file diff --git a/public/locales/pt/modules/rss.json b/public/locales/pt/modules/rss.json new file mode 100644 index 000000000..ef0b67e7f --- /dev/null +++ b/public/locales/pt/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "Widget RSS", + "description": "Pega os itens de um feed RSS e os exibe. Geralmente usado para notícias on-line", + "settings": { + "title": "Configurações para o widget RSS", + "rssFeedUrl": { + "label": "URL do feed RSS" + } + } + }, + "card": { + "errors": { + "general": { + "title": "Não foi possível recuperar o feed RSS", + "text": "Houve um problema ao alcançar o feed RSS. Certifique-se de que você configurou o feed corretamente e use uma URL de RSS válido, e que corresponda à especificação padrão oficial. Depois de atualizar o feed, talvez seja necessário salvar o painel de controle e atualizar a página." + } + } + } +} \ No newline at end of file diff --git a/public/locales/pt/modules/video-stream.json b/public/locales/pt/modules/video-stream.json new file mode 100644 index 000000000..b3e624dcd --- /dev/null +++ b/public/locales/pt/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Transmissão de vídeo", + "description": "Incorporar um stream de vídeo ou vídeo de uma câmera ou de um site", + "settings": { + "title": "Configurações para o widget de transmissão de vídeo", + "FeedUrl": { + "label": "url do feed" + }, + "autoPlay": { + "label": "Reprodução automática" + }, + "muted": { + "label": "Silenciar áudio" + }, + "controls": { + "label": "Controles do reprodutor de vídeo" + } + } + }, + "errors": { + "invalidStream": "Transmissão inválida" + } +} \ No newline at end of file diff --git a/public/locales/pt/settings/common.json b/public/locales/pt/settings/common.json index 75c9a66d2..086096ce3 100644 --- a/public/locales/pt/settings/common.json +++ b/public/locales/pt/settings/common.json @@ -10,19 +10,19 @@ }, "credits": { "madeWithLove": "Feito com ❤️ por @", - "thirdPartyContent": "", + "thirdPartyContent": "Ver conteúdo de terceiros", "thirdPartyContentTable": { - "dependencyName": "", + "dependencyName": "Dependência", "dependencyVersion": "Versão" } }, "grow": "Grelha de cultivo (ocupar todo o espaço)", "layout": { "preview": { - "title": "", - "subtitle": "" + "title": "Pré-visualizar", + "subtitle": "As alterações serão salvas automaticamente" }, - "divider": "", + "divider": "Opções de Layout", "main": "Principal", "sidebar": "Sidebar", "cannotturnoff": "Não pode ser desligado", diff --git a/public/locales/pt/settings/customization/color-selector.json b/public/locales/pt/settings/customization/color-selector.json index e527837a2..98a222ed5 100644 --- a/public/locales/pt/settings/customization/color-selector.json +++ b/public/locales/pt/settings/customization/color-selector.json @@ -1,3 +1,4 @@ { + "colors": "Cores", "suffix": "{{color}} cor" } \ No newline at end of file diff --git a/public/locales/pt/settings/customization/general.json b/public/locales/pt/settings/customization/general.json index ee9d30b5a..ac26367b1 100644 --- a/public/locales/pt/settings/customization/general.json +++ b/public/locales/pt/settings/customization/general.json @@ -1,21 +1,21 @@ { - "text": "", + "text": "As personalizações permitem que você configure e ajuste sua experiência com Homarr de acordo com suas preferências.", "accordeon": { "layout": { - "name": "", - "description": "" + "name": "Layout", + "description": "Ativar e desativar elementos em seus blocos de cabeçalho e painel de controle" }, "gridstack": { - "name": "", - "description": "" + "name": "Grade de ícones", + "description": "Personalizar o comportamento e as colunas da área do seu painel de controle" }, "pageMetadata": { - "name": "", - "description": "" + "name": "Metadado da página", + "description": "Ajustar títulos, logotipo e PWA" }, "appereance": { - "name": "", - "description": "" + "name": "Aparência", + "description": "Personalizar o plano de fundo, cores e aparência dos aplicativos" } } } \ No newline at end of file diff --git a/public/locales/pt/settings/customization/gridstack.json b/public/locales/pt/settings/customization/gridstack.json index 18c3d8233..cc4c2b280 100644 --- a/public/locales/pt/settings/customization/gridstack.json +++ b/public/locales/pt/settings/customization/gridstack.json @@ -1,10 +1,10 @@ { "columnsCount": { - "labelPreset": "", - "descriptionPreset": "", - "descriptionExceedsPreset": "" + "labelPreset": "Colunas em tamanho {{size}}", + "descriptionPreset": "Número de colunas quando a tela tem menos de {{pixels}} pixels de largura", + "descriptionExceedsPreset": "Número de colunas quando o tamanho da tela excede {{pixels}} pixels" }, - "unsavedChanges": "", - "applyChanges": "", - "defaultValues": "" + "unsavedChanges": "Você tem alterações não salvas. Clique no botão Aplicar alterações abaixo para aplicar e salvar.", + "applyChanges": "Aplicar alterações", + "defaultValues": "Valores padrão" } \ No newline at end of file diff --git a/public/locales/pt/settings/customization/page-appearance.json b/public/locales/pt/settings/customization/page-appearance.json index e7d3dfb89..1595854eb 100644 --- a/public/locales/pt/settings/customization/page-appearance.json +++ b/public/locales/pt/settings/customization/page-appearance.json @@ -1,28 +1,28 @@ { "pageTitle": { "label": "Título da página", - "description": "" + "description": "O título do painel no canto superior esquerdo" }, "metaTitle": { "label": "Meta Título", - "description": "" + "description": "O título, que está sendo exibido como o nome da sua aba" }, "logo": { "label": "Logo", - "description": "" + "description": "O logotipo do painel no canto superior esquerdo" }, "favicon": { "label": "Favicon", - "description": "" + "description": "O ícone, que está sendo usado na frente do nome da sua aba" }, "background": { "label": "Antecedentes" }, "customCSS": { "label": "CSS Personalizado", - "description": "", + "description": "Personalize todos os elementos no seu painel, recomendado apenas para usuários experientes", "placeholder": "O CSS personalizado será aplicado por último", - "applying": "" + "applying": "Aplicando CSS..." }, "buttons": { "submit": "Enviar" diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json index 3d52f738c..ffb4a3a17 100644 --- a/public/locales/ru/common.json +++ b/public/locales/ru/common.json @@ -27,7 +27,7 @@ }, "loading": "Загрузка...", "breakPoints": { - "small": "маленького", + "small": "небольшого", "medium": "среднего", "large": "большого" } diff --git a/public/locales/ru/layout/modals/about.json b/public/locales/ru/layout/modals/about.json index f21e47cc3..56bf6e8c0 100644 --- a/public/locales/ru/layout/modals/about.json +++ b/public/locales/ru/layout/modals/about.json @@ -3,11 +3,12 @@ "contact": "Проблемы или вопросы? Свяжитесь с нами!", "addToDashboard": "Добавить на панель", "metrics": { - "configurationSchemaVersion": "", - "configurationsCount": "", + "configurationSchemaVersion": "Версия схемы конфигурации", + "configurationsCount": "Доступные конфигурации", "version": "Версия", - "nodeEnvironment": "", - "i18n": "", - "locales": "" + "nodeEnvironment": "Окружение узла", + "i18n": "Загружено I18n переводов пространств имён", + "locales": "Настроено I18n локализаций", + "experimental_disableEditMode": "ЭКСПЕРИМЕНТАЛЬНЫЙ: Отключить режим редактирования" } } \ No newline at end of file diff --git a/public/locales/ru/layout/modals/add-app.json b/public/locales/ru/layout/modals/add-app.json index 595bcda96..d6ee7e981 100644 --- a/public/locales/ru/layout/modals/add-app.json +++ b/public/locales/ru/layout/modals/add-app.json @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "Иконка приложения", - "description": "Иконка, которая будет отображаться на панели." + "description": "Выберите иконку, которая будет отображаться на вашей панели. Выберите из {{suggestionsCount}} иконок или введите собственный URL-адрес", + "autocomplete": { + "title": "Результаты не найдены", + "text": "Попробуйте использовать более конкретное условие поиска. Если вы не можете найти нужную иконку, вставьте URL-адрес изображения выше для пользовательской иконки" + }, + "noItems": { + "title": "Загрузка внешних иконок", + "text": "Это может занять несколько секунд" + } } }, "integration": { diff --git a/public/locales/ru/modules/dashdot.json b/public/locales/ru/modules/dashdot.json index 35559797d..f071ab01f 100644 --- a/public/locales/ru/modules/dashdot.json +++ b/public/locales/ru/modules/dashdot.json @@ -9,6 +9,72 @@ }, "usePercentages": { "label": "Отображать проценты" + }, + "columns": { + "label": "Отображать столбцы" + }, + "graphHeight": { + "label": "Высота графиков" + }, + "graphsOrder": { + "label": "Графики (порядок)", + "storage": { + "label": "Хранилище", + "enabled": { + "label": "" + }, + "span": { + "label": "Размеры столбцов" + }, + "compactView": { + "label": "Показать в виде текста (компактный)" + }, + "multiView": { + "label": "" + } + }, + "network": { + "label": "Сеть", + "enabled": { + "label": "" + }, + "span": { + "label": "Размеры столбцов" + }, + "compactView": { + "label": "Показать в виде текста (компактный)" + } + }, + "cpu": { + "label": "ЦП", + "enabled": { + "label": "" + }, + "span": { + "label": "Размеры столбцов" + }, + "multiView": { + "label": "" + } + }, + "ram": { + "label": "ОЗУ", + "enabled": { + "label": "" + }, + "span": { + "label": "Размеры столбцов" + } + }, + "gpu": { + "label": "ГП", + "enabled": { + "label": "" + }, + "span": { + "label": "Размеры столбцов" + } + } } } }, diff --git a/public/locales/ru/modules/iframe.json b/public/locales/ru/modules/iframe.json new file mode 100644 index 000000000..51071876d --- /dev/null +++ b/public/locales/ru/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "IFrame", + "description": "Встраивать любой контент из интернета. Некоторые веб-сайты могут ограничивать доступ.", + "settings": { + "title": "Настройки IFrame", + "embedUrl": { + "label": "Вставить URL-адрес" + }, + "allowFullScreen": { + "label": "Разрешить полноэкранный режим" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "Введите URL-адрес", + "text": "Убедитесь, что вы ввели действительный адрес в конфигурации вашего виджета" + } + } + } +} \ No newline at end of file diff --git a/public/locales/ru/modules/media-server.json b/public/locales/ru/modules/media-server.json new file mode 100644 index 000000000..0075dd67a --- /dev/null +++ b/public/locales/ru/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Медиасервер", + "description": "Взаимодействие с медиасервером Jellyfin или Plex", + "settings": { + "title": "Настройки для виджета медиасервера" + } + }, + "card": { + "table": { + "header": { + "session": "Сессия", + "user": "Пользователь", + "currentlyPlaying": "Сейчас играет" + } + }, + "errors": { + "general": { + "title": "Не удалось загрузить контент", + "text": "Не удалось получить информацию с сервера. Пожалуйста, проверьте логи для получения дополнительной информации" + } + } + } +} \ No newline at end of file diff --git a/public/locales/ru/modules/rss.json b/public/locales/ru/modules/rss.json new file mode 100644 index 000000000..fcca56515 --- /dev/null +++ b/public/locales/ru/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "Виджет RSS", + "description": "Захватывает элементы из RSS-канала и отображает их. Обычно используется для онлайн-новостей", + "settings": { + "title": "Настройки для виджета RSS", + "rssFeedUrl": { + "label": "URL адрес RSS-канала" + } + } + }, + "card": { + "errors": { + "general": { + "title": "Не удалось получить RSS-канал", + "text": "Возникла проблема при подключении к RSS-каналу. Убедитесь, что вы'правильно настроили канал и используете действительный URL адрес RSS, соответствующий официальной спецификации. После обновления канала, вам может потребоваться сохранить панель и обновить страницу." + } + } + } +} \ No newline at end of file diff --git a/public/locales/ru/modules/video-stream.json b/public/locales/ru/modules/video-stream.json new file mode 100644 index 000000000..6efa4a11b --- /dev/null +++ b/public/locales/ru/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Трансляция видео", + "description": "Встраивание видео или прямой трансляции видео с камеры или веб-сайта", + "settings": { + "title": "Настройки для виджета трансляции видео", + "FeedUrl": { + "label": "URL-адрес канала" + }, + "autoPlay": { + "label": "Автовоспроизведение" + }, + "muted": { + "label": "Отключить звук" + }, + "controls": { + "label": "Элементы управления видеоплеера" + } + } + }, + "errors": { + "invalidStream": "Некорректная трансляция" + } +} \ No newline at end of file diff --git a/public/locales/ru/settings/customization/general.json b/public/locales/ru/settings/customization/general.json index 172f0d0dc..5e0720ab1 100644 --- a/public/locales/ru/settings/customization/general.json +++ b/public/locales/ru/settings/customization/general.json @@ -6,16 +6,16 @@ "description": "Включение и отключение элементов в заголовке и на панели" }, "gridstack": { - "name": "", - "description": "" + "name": "Сетка", + "description": "Настроить поведение и столбцы панели" }, "pageMetadata": { "name": "Метаданные страницы", - "description": "" + "description": "Настроить заголовки, логотип и PWA" }, "appereance": { - "name": "", - "description": "" + "name": "Внешний вид", + "description": "Настройка фона, цвета и внешнего вида приложений" } } } \ No newline at end of file diff --git a/public/locales/ru/settings/customization/gridstack.json b/public/locales/ru/settings/customization/gridstack.json index 18c3d8233..c2adf82ed 100644 --- a/public/locales/ru/settings/customization/gridstack.json +++ b/public/locales/ru/settings/customization/gridstack.json @@ -1,10 +1,10 @@ { "columnsCount": { - "labelPreset": "", - "descriptionPreset": "", - "descriptionExceedsPreset": "" + "labelPreset": "Столбцы {{size}} размера", + "descriptionPreset": "Количество столбцов при ширине экрана менее {{pixels}} пикселей", + "descriptionExceedsPreset": "Количество столбцов, когда размер экрана превышает {{pixels}} пикселей" }, - "unsavedChanges": "", - "applyChanges": "", - "defaultValues": "" + "unsavedChanges": "У вас есть несохранённые изменения. Нажмите кнопку «Применить», чтобы применить и сохранить изменения.", + "applyChanges": "Применить", + "defaultValues": "Значения по умолчанию" } \ No newline at end of file diff --git a/public/locales/ru/settings/general/config-changer.json b/public/locales/ru/settings/general/config-changer.json index 1b8bcad52..d8983405d 100644 --- a/public/locales/ru/settings/general/config-changer.json +++ b/public/locales/ru/settings/general/config-changer.json @@ -29,7 +29,7 @@ "message": "Конфигурация скопирована как {{configName}}" }, "configNotCopied": { - "title": "Невозможно скопировать конфигурацию", + "title": "Не удалось скопировать конфигурацию", "message": "Ваша конфигурация не была скопирована как {{configName}}" } } diff --git a/public/locales/sk/common.json b/public/locales/sk/common.json index 04ff7af62..ac605abbf 100644 --- a/public/locales/sk/common.json +++ b/public/locales/sk/common.json @@ -2,7 +2,7 @@ "save": "Uložiť", "about": "O aplikácii", "cancel": "Zrušiť", - "close": "Zatvoriť", + "close": "Zavrieť", "delete": "Vymazať", "ok": "OK", "edit": "Upraviť", diff --git a/public/locales/sk/layout/modals/about.json b/public/locales/sk/layout/modals/about.json index a1c1bfb64..f61e4254d 100644 --- a/public/locales/sk/layout/modals/about.json +++ b/public/locales/sk/layout/modals/about.json @@ -8,6 +8,7 @@ "version": "Verzia", "nodeEnvironment": "Node prostredie", "i18n": "Načítané prekladové priestory I18n", - "locales": "Nakonfigurované lokality I18n" + "locales": "Nakonfigurované lokality I18n", + "experimental_disableEditMode": "EXPERIMENTÁLNE: Zakázanie režimu úprav" } } \ No newline at end of file diff --git a/public/locales/sk/layout/modals/add-app.json b/public/locales/sk/layout/modals/add-app.json index 0620b249f..5e3c79f2f 100644 --- a/public/locales/sk/layout/modals/add-app.json +++ b/public/locales/sk/layout/modals/add-app.json @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "Ikona aplikácie", - "description": "Ikona, ktorá sa zobrazí na prístrojovej doske." + "description": "Vyberte si ikonu, ktorá sa má zobrazovať na prístrojovej doske. Vyberte si z ikon {{suggestionsCount}} alebo zadajte vlastnú adresu URL", + "autocomplete": { + "title": "Nenašli sa žiadne výsledky", + "text": "Skúste použiť konkrétnejší vyhľadávací výraz. Ak nemôžete nájsť požadovanú ikonu, vložte vyššie uvedenú adresu URL obrázka pre vlastnú ikonu" + }, + "noItems": { + "title": "Načítanie externých ikon", + "text": "Môže to trvať niekoľko sekúnd" + } } }, "integration": { diff --git a/public/locales/sk/modules/dashdot.json b/public/locales/sk/modules/dashdot.json index d54a1864f..db1c21731 100644 --- a/public/locales/sk/modules/dashdot.json +++ b/public/locales/sk/modules/dashdot.json @@ -5,10 +5,76 @@ "settings": { "title": "Nastavenia pre Dash. mini aplikácie", "url": { - "label": "Dash. URL" + "label": "Dash. URL adresa" }, "usePercentages": { "label": "Zobraziť percentá" + }, + "columns": { + "label": "Zobraziť stĺpce" + }, + "graphHeight": { + "label": "Výška grafov" + }, + "graphsOrder": { + "label": "Grafy (poradie)", + "storage": { + "label": "Úložisko", + "enabled": { + "label": "Zobraziť v miniaplikácii" + }, + "span": { + "label": "Rozpätie stĺpca" + }, + "compactView": { + "label": "Zobraziť ako text (kompaktný)" + }, + "multiView": { + "label": "Zobraziť ako multi-drive-view" + } + }, + "network": { + "label": "Sieť", + "enabled": { + "label": "Zobraziť v miniaplikácii" + }, + "span": { + "label": "Rozpätie stĺpca" + }, + "compactView": { + "label": "Zobraziť ako text (kompaktný)" + } + }, + "cpu": { + "label": "CPU", + "enabled": { + "label": "Zobraziť v miniaplikácii" + }, + "span": { + "label": "Rozpätie stĺpca" + }, + "multiView": { + "label": "Zobraziť ako viacjadrové zobrazenie" + } + }, + "ram": { + "label": "RAM", + "enabled": { + "label": "Zobraziť v miniaplikácii" + }, + "span": { + "label": "Rozpätie stĺpca" + } + }, + "gpu": { + "label": "GPU", + "enabled": { + "label": "Zobraziť v miniaplikácii" + }, + "span": { + "label": "Rozpätie stĺpca" + } + } } } }, diff --git a/public/locales/sk/modules/iframe.json b/public/locales/sk/modules/iframe.json new file mode 100644 index 000000000..1200294c7 --- /dev/null +++ b/public/locales/sk/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "IFrame", + "description": "Vložte akýkoľvek obsah z internetu. Niektoré webové stránky môžu obmedziť prístup.", + "settings": { + "title": "Nastavenia IFrame", + "embedUrl": { + "label": "Vložiť adresu URL" + }, + "allowFullScreen": { + "label": "Povoliť celú obrazovku" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "Zadajte adresu URL", + "text": "Skontrolujte, či ste v konfigurácii mini aplikácie zadali platnú adresu" + } + } + } +} \ No newline at end of file diff --git a/public/locales/sk/modules/media-server.json b/public/locales/sk/modules/media-server.json new file mode 100644 index 000000000..b1ab2f32a --- /dev/null +++ b/public/locales/sk/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Multimediálny Server", + "description": "Interakcia s mediálnym serverom Jellyfin alebo Plex", + "settings": { + "title": "Nastavenia mini aplikácie mediálneho servera" + } + }, + "card": { + "table": { + "header": { + "session": "Relácia", + "user": "Používateľ", + "currentlyPlaying": "Momentálne sa prehráva" + } + }, + "errors": { + "general": { + "title": "Nie je možné načítať obsah", + "text": "Nie je možné načítať informácie zo servera. Podrobnejšie informácie nájdete v denníkoch" + } + } + } +} \ No newline at end of file diff --git a/public/locales/sk/modules/rss.json b/public/locales/sk/modules/rss.json new file mode 100644 index 000000000..155069e90 --- /dev/null +++ b/public/locales/sk/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "RSS mini aplikácia", + "description": "Stiahne položky z informačného kanála RSS a zobrazí ich. Bežne sa používa pre online správy", + "settings": { + "title": "Nastavenia mini aplikácie RSS", + "rssFeedUrl": { + "label": "URL adresa RSS" + } + } + }, + "card": { + "errors": { + "general": { + "title": "Nie je možné načítať kanál RSS", + "text": "Vyskytol sa problém s kontaktovaním informačného kanála RSS. Uistite sa, že ste ' informačný kanál správne nakonfigurovali a používate platnú adresu URL RSS, ktorá zodpovedá oficiálnej štandardnej špecifikácii. Po aktualizácii informačného kanála možno budete musieť uložiť informačný panel a obnoviť stránku." + } + } + } +} \ No newline at end of file diff --git a/public/locales/sk/modules/video-stream.json b/public/locales/sk/modules/video-stream.json new file mode 100644 index 000000000..669d1b86b --- /dev/null +++ b/public/locales/sk/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Video stream", + "description": "Vloženie videoprenosu alebo videa z kamery alebo webovej lokality", + "settings": { + "title": "Nastavenia pre mini aplikáciu videostreamu", + "FeedUrl": { + "label": "Url adresa" + }, + "autoPlay": { + "label": "Automatické prehrávanie" + }, + "muted": { + "label": "Stlmiť zvuk" + }, + "controls": { + "label": "Ovládacie prvky prehrávača videa" + } + } + }, + "errors": { + "invalidStream": "Neplatný tok" + } +} \ No newline at end of file diff --git a/public/locales/sl/layout/modals/about.json b/public/locales/sl/layout/modals/about.json index 42d01c704..609179cfa 100644 --- a/public/locales/sl/layout/modals/about.json +++ b/public/locales/sl/layout/modals/about.json @@ -3,11 +3,12 @@ "contact": "Imate težave ali vprašanja? Povežite se z nami!", "addToDashboard": "Dodajanje v nadzorno ploščo", "metrics": { - "configurationSchemaVersion": "", - "configurationsCount": "", + "configurationSchemaVersion": "Različica konfiguracijske sheme", + "configurationsCount": "Razpoložljive konfiguracije", "version": "Različica", - "nodeEnvironment": "", - "i18n": "", - "locales": "" + "nodeEnvironment": "Okolje vozlišča", + "i18n": "Nalaganje imenskih prostorov za prevod I18n", + "locales": "Konfigurirani krajevni jeziki I18n", + "experimental_disableEditMode": "EKSPERIMENTALNO: Onemogočite način urejanja" } } \ No newline at end of file diff --git a/public/locales/sl/layout/modals/add-app.json b/public/locales/sl/layout/modals/add-app.json index 5a7b5657e..187a28594 100644 --- a/public/locales/sl/layout/modals/add-app.json +++ b/public/locales/sl/layout/modals/add-app.json @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "Ikona aplikacije", - "description": "Ikona, ki bo prikazana na armaturni plošči." + "description": "Izberite ikono, ki bo prikazana na nadzorni plošči. Izbirate lahko med ikonami {{suggestionsCount}} ali vnesete svoj URL", + "autocomplete": { + "title": "Ni rezultatov", + "text": "Poskusite uporabiti bolj specifičen iskalni izraz. Če želene ikone ne najdete, prilepite zgornji naslov URL slike za ikono po meri" + }, + "noItems": { + "title": "Nalaganje zunanjih ikon", + "text": "To lahko traja nekaj sekund" + } } }, "integration": { diff --git a/public/locales/sl/modules/calendar.json b/public/locales/sl/modules/calendar.json index 165420f9e..85fa04c90 100644 --- a/public/locales/sl/modules/calendar.json +++ b/public/locales/sl/modules/calendar.json @@ -5,7 +5,7 @@ "settings": { "title": "Nastavitve za gradnik Koledar", "useSonarrv4": { - "label": "" + "label": "Uporaba vmesnika API Sonarr v4" }, "sundayStart": { "label": "Začni teden z nedeljo" diff --git a/public/locales/sl/modules/dashdot.json b/public/locales/sl/modules/dashdot.json index 858f8fa98..28a1f9132 100644 --- a/public/locales/sl/modules/dashdot.json +++ b/public/locales/sl/modules/dashdot.json @@ -8,7 +8,73 @@ "label": "Dash. URL" }, "usePercentages": { - "label": "" + "label": "Prikaz odstotkov" + }, + "columns": { + "label": "Prikaži stolpce" + }, + "graphHeight": { + "label": "Višina grafov" + }, + "graphsOrder": { + "label": "Grafi (vrstni red)", + "storage": { + "label": "Shramba", + "enabled": { + "label": "Prikaži v pripomočku" + }, + "span": { + "label": "Razpon stolpca" + }, + "compactView": { + "label": "Prikaži kot besedilo (kompaktno)" + }, + "multiView": { + "label": "Prikaži kot večpredstavnostni pogled" + } + }, + "network": { + "label": "Omrežje", + "enabled": { + "label": "Prikaži v pripomočku" + }, + "span": { + "label": "Razpon stolpca" + }, + "compactView": { + "label": "Prikaži kot besedilo (kompaktno)" + } + }, + "cpu": { + "label": "CPU", + "enabled": { + "label": "Prikaži v pripomočku" + }, + "span": { + "label": "Razpon stolpca" + }, + "multiView": { + "label": "Prikaži kot večjedrni pogled" + } + }, + "ram": { + "label": "RAM", + "enabled": { + "label": "Prikaži v pripomočku" + }, + "span": { + "label": "Razpon stolpca" + } + }, + "gpu": { + "label": "GPU", + "enabled": { + "label": "Prikaži v pripomočku" + }, + "span": { + "label": "Razpon stolpca" + } + } } } }, @@ -18,8 +84,8 @@ "noService": "Dash. storitev ni bila najdena. Prosimo, dodajte jo na nadzorno ploščo Homarr ali nastavite Dash. URL naslov v možnostih modula", "noInformation": "Ne morem pridobiti informacij iz Dash. - ali uporabljate najnovejšo različico?", "protocolDowngrade": { - "title": "", - "text": "" + "title": "Odkrit nižji protokol", + "text": "Protokol do vašega Dash. vmesnika se znižuje. To predstavlja varnostno tveganje, saj protokol HTTP ni šifriran in napadalci lahko zlorabijo to povezavo. Prepričajte se, da Dash. deluje tudi v protokolu HTTPS, ali pa znižajte stopnjo Homarr na HTTP (ni priporočljivo)." } }, "graphs": { diff --git a/public/locales/sl/modules/iframe.json b/public/locales/sl/modules/iframe.json new file mode 100644 index 000000000..4326b0e81 --- /dev/null +++ b/public/locales/sl/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "IFrame", + "description": "Vstavite katero koli vsebino iz interneta. Nekatera spletna mesta lahko omejijo dostop.", + "settings": { + "title": "Nastavitve okvirja IFrame", + "embedUrl": { + "label": "URL za vstavljanje" + }, + "allowFullScreen": { + "label": "Omogočite celozaslonsko prikazovanje" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "Vnesite naslov URL", + "text": "Prepričajte se, da ste v konfiguracijo svojega pripomočka vnesli veljaven naslov" + } + } + } +} \ No newline at end of file diff --git a/public/locales/sl/modules/media-server.json b/public/locales/sl/modules/media-server.json new file mode 100644 index 000000000..4e454f643 --- /dev/null +++ b/public/locales/sl/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Predstavnostni strežnik", + "description": "Sodelovanje z medijskim strežnikom Jellyfin ali Plex", + "settings": { + "title": "Nastavitve za gradnik video strežnika" + } + }, + "card": { + "table": { + "header": { + "session": "Seja", + "user": "Uporabnik", + "currentlyPlaying": "Trenutno se predvaja" + } + }, + "errors": { + "general": { + "title": "Ni mogoče naložiti vsebine", + "text": "Ni mogoče pridobiti informacij iz strežnika. Za več podrobnosti preverite dnevnike" + } + } + } +} \ No newline at end of file diff --git a/public/locales/sl/modules/rss.json b/public/locales/sl/modules/rss.json new file mode 100644 index 000000000..a6a31649d --- /dev/null +++ b/public/locales/sl/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "RSS pripomoček", + "description": "Prevzame elemente iz vira RSS in jih prikaže. Običajno se uporablja za spletne novice", + "settings": { + "title": "Nastavitve za RSS pripomoček", + "rssFeedUrl": { + "label": "URL naslov vira RSS" + } + } + }, + "card": { + "errors": { + "general": { + "title": "Ni mogoče pridobiti vira RSS", + "text": "Prišlo je do težave pri doseganju vira RSS. Prepričajte se, da ste pravilno nastavili vir in uporabili veljavni URL naslov RSS, ki ustreza uradni standardni specifikaciji. Po posodobitvi vira boste morda morali shraniti nadzorno ploščo in osvežiti stran." + } + } + } +} \ No newline at end of file diff --git a/public/locales/sl/modules/video-stream.json b/public/locales/sl/modules/video-stream.json new file mode 100644 index 000000000..cfb629949 --- /dev/null +++ b/public/locales/sl/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Video tok", + "description": "Vstavljanje videoprenosa ali videoposnetka iz kamere ali spletnega mesta", + "settings": { + "title": "Nastavitve za gradnik videoprenosa", + "FeedUrl": { + "label": "URL naslov pretoka" + }, + "autoPlay": { + "label": "Samodejno predvajanje" + }, + "muted": { + "label": "Utišani zvok" + }, + "controls": { + "label": "Upravljanje predvajalnika videoposnetkov" + } + } + }, + "errors": { + "invalidStream": "Nepravilen tok" + } +} \ No newline at end of file diff --git a/public/locales/sl/settings/common.json b/public/locales/sl/settings/common.json index faacb7832..93678d3b9 100644 --- a/public/locales/sl/settings/common.json +++ b/public/locales/sl/settings/common.json @@ -10,19 +10,19 @@ }, "credits": { "madeWithLove": "Narejeno s ❤️ od @", - "thirdPartyContent": "", + "thirdPartyContent": "Oglejte si vsebino tretjih oseb", "thirdPartyContentTable": { - "dependencyName": "", + "dependencyName": "Odvisnost", "dependencyVersion": "Različica" } }, "grow": "Rastoča mreža (zavzema ves prostor)", "layout": { "preview": { - "title": "", - "subtitle": "" + "title": "Predogled", + "subtitle": "Spremembe se samodejno shranijo" }, - "divider": "", + "divider": "Možnosti postavitve", "main": "Glavno", "sidebar": "Stranska vrstica", "cannotturnoff": "Ni mogoče izklopiti", diff --git a/public/locales/sl/settings/customization/color-selector.json b/public/locales/sl/settings/customization/color-selector.json index 305b7922b..22b648fd6 100644 --- a/public/locales/sl/settings/customization/color-selector.json +++ b/public/locales/sl/settings/customization/color-selector.json @@ -1,3 +1,4 @@ { + "colors": "Barve", "suffix": "{{color}} barva" } \ No newline at end of file diff --git a/public/locales/sl/settings/customization/general.json b/public/locales/sl/settings/customization/general.json index ee9d30b5a..ed867874d 100644 --- a/public/locales/sl/settings/customization/general.json +++ b/public/locales/sl/settings/customization/general.json @@ -1,21 +1,21 @@ { - "text": "", + "text": "Prilagoditve vam omogočajo, da nastavite in prilagodite svojo izkušnjo z aplikacijo Homarr svojim željam.", "accordeon": { "layout": { - "name": "", - "description": "" + "name": "Postavitev", + "description": "Omogočanje in onemogočanje elementov v glavi in ploščicah armaturne plošče" }, "gridstack": { - "name": "", - "description": "" + "name": "Gridstack", + "description": "Prilagodite obnašanje in stolpce območja nadzorne plošče" }, "pageMetadata": { - "name": "", - "description": "" + "name": "Metapodatki strani", + "description": "Prilagodite naslove, logotip in PWA" }, "appereance": { - "name": "", - "description": "" + "name": "Videz", + "description": "Prilagodite ozadje, barve in videz aplikacij" } } } \ No newline at end of file diff --git a/public/locales/sl/settings/customization/gridstack.json b/public/locales/sl/settings/customization/gridstack.json index 18c3d8233..a3e1dcd2f 100644 --- a/public/locales/sl/settings/customization/gridstack.json +++ b/public/locales/sl/settings/customization/gridstack.json @@ -1,10 +1,10 @@ { "columnsCount": { - "labelPreset": "", - "descriptionPreset": "", - "descriptionExceedsPreset": "" + "labelPreset": "Stolpci v velikosti {{size}}", + "descriptionPreset": "Število stolpcev, če je zaslon širok manj kot {{pixels}} pikslov", + "descriptionExceedsPreset": "Število stolpcev, ko velikost zaslona presega {{pixels}} slikovnih pik" }, - "unsavedChanges": "", - "applyChanges": "", - "defaultValues": "" + "unsavedChanges": "Spremembe niso shranjene. Kliknite spodnji gumb Uveljavi spremembe, da jih uporabite in shranite.", + "applyChanges": "Uveljavi spremembe", + "defaultValues": "Privzete vrednosti" } \ No newline at end of file diff --git a/public/locales/sl/settings/customization/page-appearance.json b/public/locales/sl/settings/customization/page-appearance.json index b469b1941..bc2f65f3e 100644 --- a/public/locales/sl/settings/customization/page-appearance.json +++ b/public/locales/sl/settings/customization/page-appearance.json @@ -1,28 +1,28 @@ { "pageTitle": { "label": "Naslov strani", - "description": "" + "description": "Naslov armaturne plošče v zgornjem levem kotu" }, "metaTitle": { "label": "Meta naslov", - "description": "" + "description": "Naslov, ki se prikaže kot ime zavihka" }, "logo": { "label": "Logotip", - "description": "" + "description": "Logotip armaturne plošče v zgornjem levem kotu" }, "favicon": { "label": "Favicon", - "description": "" + "description": "Ikona, ki se uporablja pred imenom zavihka" }, "background": { "label": "Ozadje" }, "customCSS": { "label": "Po meri CSS", - "description": "", + "description": "Prilagodite vse elemente na nadzorni plošči, priporočljivo le za izkušene uporabnike", "placeholder": "Prilagojeni CSS bo uporabljen kot zadnji", - "applying": "" + "applying": "Uporaba CSS..." }, "buttons": { "submit": "Pošlji" diff --git a/public/locales/sv/layout/modals/about.json b/public/locales/sv/layout/modals/about.json index 5e331e80d..bf41ad5d4 100644 --- a/public/locales/sv/layout/modals/about.json +++ b/public/locales/sv/layout/modals/about.json @@ -8,6 +8,7 @@ "version": "Version", "nodeEnvironment": "Nod miljö", "i18n": "Laddade namnområden för I18n-översättningar", - "locales": "Konfigurerade I18n lokalspråk" + "locales": "Konfigurerade I18n lokalspråk", + "experimental_disableEditMode": "EXPERIMENTAL: Inaktivera redigeringsläge" } } \ No newline at end of file diff --git a/public/locales/sv/layout/modals/add-app.json b/public/locales/sv/layout/modals/add-app.json index 7f7c8b6e8..43e2fe3af 100644 --- a/public/locales/sv/layout/modals/add-app.json +++ b/public/locales/sv/layout/modals/add-app.json @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "Appikon", - "description": "Ikon som kommer att visas på instrumentpanelen." + "description": "Välj en ikon som ska visas på kontrollpanelen. Välj mellan {{suggestionsCount}} ikoner eller ange din egen URL", + "autocomplete": { + "title": "Hittade inga resultat", + "text": "Försök att använda en mer specifik sökterm. Om du inte kan hitta önskad ikon, klistra in bild-URL ovan för en anpassad ikon" + }, + "noItems": { + "title": "Laddar externa ikoner", + "text": "Detta kan ta några sekunder" + } } }, "integration": { diff --git a/public/locales/sv/modules/dashdot.json b/public/locales/sv/modules/dashdot.json index 3a884a643..67f97a5f7 100644 --- a/public/locales/sv/modules/dashdot.json +++ b/public/locales/sv/modules/dashdot.json @@ -9,6 +9,72 @@ }, "usePercentages": { "label": "Visa procent" + }, + "columns": { + "label": "Visa kolumner" + }, + "graphHeight": { + "label": "Höjden på grafer" + }, + "graphsOrder": { + "label": "Grafer (Ordning)", + "storage": { + "label": "Lagring", + "enabled": { + "label": "Visa på widget" + }, + "span": { + "label": "Spännvidd för kolumnen" + }, + "compactView": { + "label": "Visa som text (kompakt)" + }, + "multiView": { + "label": "Visa som flerenhetsvy" + } + }, + "network": { + "label": "Nätverk", + "enabled": { + "label": "Visa på widget" + }, + "span": { + "label": "Spännvidd för kolumnen" + }, + "compactView": { + "label": "Visa som text (kompakt)" + } + }, + "cpu": { + "label": "CPU", + "enabled": { + "label": "Visa på widget" + }, + "span": { + "label": "Spännvidd för kolumnen" + }, + "multiView": { + "label": "Visa som flerkärningvy" + } + }, + "ram": { + "label": "RAM", + "enabled": { + "label": "Visa på widget" + }, + "span": { + "label": "Spännvidd för kolumnen" + } + }, + "gpu": { + "label": "GPU", + "enabled": { + "label": "Visa på widget" + }, + "span": { + "label": "Spännvidd för kolumnen" + } + } } } }, diff --git a/public/locales/sv/modules/iframe.json b/public/locales/sv/modules/iframe.json new file mode 100644 index 000000000..18c90c392 --- /dev/null +++ b/public/locales/sv/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "embedUrl": { + "label": "" + }, + "allowFullScreen": { + "label": "" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/sv/modules/media-server.json b/public/locales/sv/modules/media-server.json new file mode 100644 index 000000000..2be958199 --- /dev/null +++ b/public/locales/sv/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "card": { + "table": { + "header": { + "session": "", + "user": "", + "currentlyPlaying": "" + } + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/sv/modules/rss.json b/public/locales/sv/modules/rss.json new file mode 100644 index 000000000..230d75cf5 --- /dev/null +++ b/public/locales/sv/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "rssFeedUrl": { + "label": "" + } + } + }, + "card": { + "errors": { + "general": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/sv/modules/video-stream.json b/public/locales/sv/modules/video-stream.json new file mode 100644 index 000000000..539daa1c4 --- /dev/null +++ b/public/locales/sv/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "FeedUrl": { + "label": "" + }, + "autoPlay": { + "label": "" + }, + "muted": { + "label": "" + }, + "controls": { + "label": "" + } + } + }, + "errors": { + "invalidStream": "" + } +} \ No newline at end of file diff --git a/public/locales/uk/layout/modals/about.json b/public/locales/uk/layout/modals/about.json index 1d64a4e36..83e01a3b0 100644 --- a/public/locales/uk/layout/modals/about.json +++ b/public/locales/uk/layout/modals/about.json @@ -8,6 +8,7 @@ "version": "Версія", "nodeEnvironment": "", "i18n": "", - "locales": "" + "locales": "", + "experimental_disableEditMode": "ЕКСПЕРИМЕНТАЛЬНО: Вимкнути режим редагування" } } \ No newline at end of file diff --git a/public/locales/uk/layout/modals/add-app.json b/public/locales/uk/layout/modals/add-app.json index c502375c8..ccd59222b 100644 --- a/public/locales/uk/layout/modals/add-app.json +++ b/public/locales/uk/layout/modals/add-app.json @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "Іконка програми", - "description": "Іконка, яка буде показуватися на інформаційній панелі." + "description": "", + "autocomplete": { + "title": "", + "text": "" + }, + "noItems": { + "title": "", + "text": "" + } } }, "integration": { diff --git a/public/locales/uk/modules/dashdot.json b/public/locales/uk/modules/dashdot.json index 6d4277156..f65d4f5a0 100644 --- a/public/locales/uk/modules/dashdot.json +++ b/public/locales/uk/modules/dashdot.json @@ -9,6 +9,72 @@ }, "usePercentages": { "label": "Показувати відсотки" + }, + "columns": { + "label": "Показувати стовпчики" + }, + "graphHeight": { + "label": "Висота графіків" + }, + "graphsOrder": { + "label": "Графіки (порядок)", + "storage": { + "label": "Диск", + "enabled": { + "label": "Показувати у віджеті" + }, + "span": { + "label": "Ширина стовпця" + }, + "compactView": { + "label": "Показати як текст (компактно)" + }, + "multiView": { + "label": "Показувати як multi-drive-view" + } + }, + "network": { + "label": "Мережа", + "enabled": { + "label": "Показувати у віджеті" + }, + "span": { + "label": "Ширина стовпця" + }, + "compactView": { + "label": "Показати як текст (компактно)" + } + }, + "cpu": { + "label": "Процесор", + "enabled": { + "label": "Показувати у віджеті" + }, + "span": { + "label": "Ширина стовпця" + }, + "multiView": { + "label": "Показувати як multi-core-view" + } + }, + "ram": { + "label": "Оперативна пам'ять", + "enabled": { + "label": "Показувати у віджеті" + }, + "span": { + "label": "Ширина стовпця" + } + }, + "gpu": { + "label": "Графічний процесор", + "enabled": { + "label": "Показувати у віджеті" + }, + "span": { + "label": "Ширина стовпця" + } + } } } }, diff --git a/public/locales/uk/modules/iframe.json b/public/locales/uk/modules/iframe.json new file mode 100644 index 000000000..18c90c392 --- /dev/null +++ b/public/locales/uk/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "embedUrl": { + "label": "" + }, + "allowFullScreen": { + "label": "" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/uk/modules/media-server.json b/public/locales/uk/modules/media-server.json new file mode 100644 index 000000000..2be958199 --- /dev/null +++ b/public/locales/uk/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "card": { + "table": { + "header": { + "session": "", + "user": "", + "currentlyPlaying": "" + } + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/uk/modules/rss.json b/public/locales/uk/modules/rss.json new file mode 100644 index 000000000..55d312096 --- /dev/null +++ b/public/locales/uk/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "RSS-віджет", + "description": "Витягує предмети з RSS-стрічки та показує їх. Часто використовується для новин онлайн", + "settings": { + "title": "Налаштування віджету RSS", + "rssFeedUrl": { + "label": "URL-адреса RSS стрічки" + } + } + }, + "card": { + "errors": { + "general": { + "title": "Не вдалося отримати RSS стрічку", + "text": "Виникла проблема з доступом до RSS-стрічки. Переконайтеся, що ви'правильно налаштували стрічку і використовуєте правильну адресу RSS, яка відповідає офіційній стандартній специфікації. Після оновлення стрічки вам може знадобитися зберегти вашу інформаційну панель і оновити сторінку." + } + } + } +} \ No newline at end of file diff --git a/public/locales/uk/modules/video-stream.json b/public/locales/uk/modules/video-stream.json new file mode 100644 index 000000000..4f4f3ec9d --- /dev/null +++ b/public/locales/uk/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Потокова трансляція відео", + "description": "Вставте відеопотік чи відео з камери або вебсайту", + "settings": { + "title": "Налаштування віджету потокового зображення відео", + "FeedUrl": { + "label": "URL-адреса стрічки" + }, + "autoPlay": { + "label": "Автоматичне відтворення" + }, + "muted": { + "label": "Звук вимкнуто" + }, + "controls": { + "label": "Керування відеоплеєром" + } + } + }, + "errors": { + "invalidStream": "Неправильний потік" + } +} \ No newline at end of file diff --git a/public/locales/vi/layout/modals/about.json b/public/locales/vi/layout/modals/about.json index de2c1d365..4f83dd4bd 100644 --- a/public/locales/vi/layout/modals/about.json +++ b/public/locales/vi/layout/modals/about.json @@ -8,6 +8,7 @@ "version": "Phiên bản", "nodeEnvironment": "", "i18n": "", - "locales": "" + "locales": "", + "experimental_disableEditMode": "" } } \ No newline at end of file diff --git a/public/locales/vi/layout/modals/add-app.json b/public/locales/vi/layout/modals/add-app.json index 1f187d74a..b0e97ca9f 100644 --- a/public/locales/vi/layout/modals/add-app.json +++ b/public/locales/vi/layout/modals/add-app.json @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "", - "description": "" + "description": "", + "autocomplete": { + "title": "", + "text": "" + }, + "noItems": { + "title": "", + "text": "" + } } }, "integration": { diff --git a/public/locales/vi/modules/dashdot.json b/public/locales/vi/modules/dashdot.json index 7e6cb127b..4d3febbb7 100644 --- a/public/locales/vi/modules/dashdot.json +++ b/public/locales/vi/modules/dashdot.json @@ -9,6 +9,72 @@ }, "usePercentages": { "label": "Hiển thị phần trăm" + }, + "columns": { + "label": "" + }, + "graphHeight": { + "label": "" + }, + "graphsOrder": { + "label": "", + "storage": { + "label": "Bộ nhớ", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "compactView": { + "label": "" + }, + "multiView": { + "label": "" + } + }, + "network": { + "label": "Mạng", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "compactView": { + "label": "" + } + }, + "cpu": { + "label": "CPU", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "multiView": { + "label": "" + } + }, + "ram": { + "label": "", + "enabled": { + "label": "" + }, + "span": { + "label": "" + } + }, + "gpu": { + "label": "GPU", + "enabled": { + "label": "" + }, + "span": { + "label": "" + } + } } } }, diff --git a/public/locales/vi/modules/iframe.json b/public/locales/vi/modules/iframe.json new file mode 100644 index 000000000..18c90c392 --- /dev/null +++ b/public/locales/vi/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "embedUrl": { + "label": "" + }, + "allowFullScreen": { + "label": "" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/vi/modules/media-server.json b/public/locales/vi/modules/media-server.json new file mode 100644 index 000000000..2be958199 --- /dev/null +++ b/public/locales/vi/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "card": { + "table": { + "header": { + "session": "", + "user": "", + "currentlyPlaying": "" + } + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/vi/modules/rss.json b/public/locales/vi/modules/rss.json new file mode 100644 index 000000000..230d75cf5 --- /dev/null +++ b/public/locales/vi/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "rssFeedUrl": { + "label": "" + } + } + }, + "card": { + "errors": { + "general": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/vi/modules/video-stream.json b/public/locales/vi/modules/video-stream.json new file mode 100644 index 000000000..539daa1c4 --- /dev/null +++ b/public/locales/vi/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "FeedUrl": { + "label": "" + }, + "autoPlay": { + "label": "" + }, + "muted": { + "label": "" + }, + "controls": { + "label": "" + } + } + }, + "errors": { + "invalidStream": "" + } +} \ No newline at end of file diff --git a/public/locales/zh/layout/modals/about.json b/public/locales/zh/layout/modals/about.json index cd7b7acda..3717aa10d 100644 --- a/public/locales/zh/layout/modals/about.json +++ b/public/locales/zh/layout/modals/about.json @@ -8,6 +8,7 @@ "version": "版本", "nodeEnvironment": "节点环境", "i18n": "加载了I18n翻译名称空间", - "locales": "配置的I18n区域设置" + "locales": "配置的I18n区域设置", + "experimental_disableEditMode": "" } } \ No newline at end of file diff --git a/public/locales/zh/layout/modals/add-app.json b/public/locales/zh/layout/modals/add-app.json index 4e4b63bd6..a38a664ba 100644 --- a/public/locales/zh/layout/modals/add-app.json +++ b/public/locales/zh/layout/modals/add-app.json @@ -39,7 +39,15 @@ "appearance": { "icon": { "label": "应用图标", - "description": "将在面板上显示的图标。" + "description": "", + "autocomplete": { + "title": "", + "text": "" + }, + "noItems": { + "title": "", + "text": "" + } } }, "integration": { diff --git a/public/locales/zh/modules/dashdot.json b/public/locales/zh/modules/dashdot.json index a779c41d6..341fd67f4 100644 --- a/public/locales/zh/modules/dashdot.json +++ b/public/locales/zh/modules/dashdot.json @@ -9,6 +9,72 @@ }, "usePercentages": { "label": "显示百分比" + }, + "columns": { + "label": "" + }, + "graphHeight": { + "label": "" + }, + "graphsOrder": { + "label": "", + "storage": { + "label": "存储", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "compactView": { + "label": "" + }, + "multiView": { + "label": "" + } + }, + "network": { + "label": "网络", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "compactView": { + "label": "" + } + }, + "cpu": { + "label": "CPU", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "multiView": { + "label": "" + } + }, + "ram": { + "label": "", + "enabled": { + "label": "" + }, + "span": { + "label": "" + } + }, + "gpu": { + "label": "GPU", + "enabled": { + "label": "" + }, + "span": { + "label": "" + } + } } } }, @@ -18,8 +84,8 @@ "noService": "没有找到Dash.服务。请在你的Homarr仪表板上添加,或者设置一个仪表板网址。网址在应用选项中添加", "noInformation": "无法从仪表板获取信息。- 你运行的是最新版本吗?", "protocolDowngrade": { - "title": "", - "text": "" + "title": "检测到协议降级", + "text": "Dash实例的协议被降级。这存在安全风险,因为HTTP是未加密的,攻击者可能会滥用此连接。确保Dash也在HTTPS上运行,或者将Homarr降级为HTTP(不推荐)。" } }, "graphs": { diff --git a/public/locales/zh/modules/iframe.json b/public/locales/zh/modules/iframe.json new file mode 100644 index 000000000..43dd325ac --- /dev/null +++ b/public/locales/zh/modules/iframe.json @@ -0,0 +1,23 @@ +{ + "descriptor": { + "name": "IFrame", + "description": "嵌入互联网上的任何内容。一些网站可能限制访问。", + "settings": { + "title": "IFrame设置", + "embedUrl": { + "label": "嵌入URL" + }, + "allowFullScreen": { + "label": "允许全屏" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "输入 URL", + "text": "确保您在小部件配置中输入了一个有效的地址" + } + } + } +} \ No newline at end of file diff --git a/public/locales/zh/modules/media-server.json b/public/locales/zh/modules/media-server.json new file mode 100644 index 000000000..418d64a08 --- /dev/null +++ b/public/locales/zh/modules/media-server.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "媒体服务器", + "description": "与您的 Jellyfin 或 Plex 媒体服务器交互", + "settings": { + "title": "设置媒体服务器小部件" + } + }, + "card": { + "table": { + "header": { + "session": "会话", + "user": "用户", + "currentlyPlaying": "正在播放" + } + }, + "errors": { + "general": { + "title": "无法加载内容", + "text": "无法从服务器检索信息。请检查日志获取更多详细信息" + } + } + } +} \ No newline at end of file diff --git a/public/locales/zh/modules/rss.json b/public/locales/zh/modules/rss.json new file mode 100644 index 000000000..5424c1b3a --- /dev/null +++ b/public/locales/zh/modules/rss.json @@ -0,0 +1,20 @@ +{ + "descriptor": { + "name": "RSS小工具", + "description": "从RSS提要中抓取项目并显示它们。常用于在线新闻", + "settings": { + "title": "设置RSS小部件", + "rssFeedUrl": { + "label": "RSS订阅网址" + } + } + }, + "card": { + "errors": { + "general": { + "title": "无法检索到RSS源", + "text": "触发RSS 种子时出现问题。 请确保您've 正确配置了种子并使用一个符合官方标准规格的有效RSS url。 更新种子后,您可能需要保存您的面板并刷新页面。" + } + } + } +} \ No newline at end of file diff --git a/public/locales/zh/modules/video-stream.json b/public/locales/zh/modules/video-stream.json new file mode 100644 index 000000000..7afa408e0 --- /dev/null +++ b/public/locales/zh/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "视频流", + "description": "嵌入来自相机或网站的视频流或视频", + "settings": { + "title": "设置视频流小部件", + "FeedUrl": { + "label": "订阅URL" + }, + "autoPlay": { + "label": "自动播放" + }, + "muted": { + "label": "静音" + }, + "controls": { + "label": "视频播放器控件" + } + } + }, + "errors": { + "invalidStream": "无效数据流" + } +} \ No newline at end of file