From 5482240f16964a324b8f8367c2addf01c1cd0475 Mon Sep 17 00:00:00 2001 From: yuanyxh <15766118362@139.com> Date: Mon, 11 Sep 2023 21:29:00 +0800 Subject: [PATCH] feat: project variation --- public/favicon.ico | Bin 3870 -> 15406 bytes public/index.html | 2 +- public/logo.png | Bin 0 -> 13285 bytes public/logo192.png | Bin 5347 -> 13517 bytes public/logo512.png | Bin 9664 -> 24752 bytes public/manifest.json | 4 +- .../ExtraInformation.module.css | 34 ++++ .../ExtraInformation/ExtraInformation.tsx | 79 ++++++++ .../InputNumber/InputNumber.module.css | 2 +- src/components/Overlay/Overlay.module.css | 2 +- .../ScreenBoundary/ScreenBoundary.module.css | 23 +++ .../ScreenBoundary/ScreenBoundary.tsx | 51 +++++ src/components/Select/Select.module.css | 4 +- src/components/Tip/Tip.module.css | 81 ++++++++ src/components/Tip/Tip.tsx | 80 ++++++++ src/config/index.ts | 6 +- src/enum/Platform.ts | 6 + src/enum/index.ts | 1 + src/home/Grid.module.css | 1 + src/hooks/index.ts | 1 + src/hooks/useColorScheme.ts | 39 ++++ src/hooks/useThrottle.ts | 4 +- src/hooks/useTransition.ts | 15 +- src/index.css | 11 +- src/layout/Layout.module.css | 6 + src/layout/Navbar.module.css | 65 +++++- src/layout/Navbar.tsx | 85 +++++++- src/layout/Sidebar.module.css | 17 +- src/layout/layout.tsx | 95 ++++++++- src/pages/Base64/Base64.module.css | 17 +- src/pages/Base64/Base64.tsx | 32 +-- .../FileSystemAccess/FileSystemAccess.tsx | 70 +++++-- .../FileSystemAccess/Location.module.css | 4 +- src/pages/GIF-Explorer/GIFPicture.module.css | 18 ++ src/pages/GIF-Explorer/GIFPicture.tsx | 1 + src/pages/GIF-Explorer/GIFPlayer.module.css | 7 + src/pages/GIF-Explorer/GIFPlayer.tsx | 6 + src/pages/GIF-Explorer/GIFVideo.module.css | 25 +++ src/pages/GIF-Explorer/GIFVideo.tsx | 3 +- .../component/Configuration.module.css | 4 +- .../GIF-Explorer/component/Configuration.tsx | 9 +- src/pages/PdfParser/PdfParser.module.css | 10 +- src/pages/PdfParser/PdfParser.tsx | 15 ++ src/pages/Test/Test.module.css | 42 ---- src/pages/Test/Test.tsx | 16 +- src/pages/UploadFile/UploadFile.tsx | 36 ++++ src/pages/VisualEdit/VisualEdit.module.css | 2 +- src/pages/VisualEdit/VisualEdit.tsx | 187 +++++++++--------- src/store/index.ts | 4 +- src/store/module/colorScheme.ts | 26 +++ src/styles/preset.css | 2 +- src/styles/theme.css | 84 +++++++- src/styles/variable.css | 6 + src/types/index.d.ts | 3 + 54 files changed, 1110 insertions(+), 233 deletions(-) create mode 100644 public/logo.png create mode 100644 src/components/ExtraInformation/ExtraInformation.module.css create mode 100644 src/components/ExtraInformation/ExtraInformation.tsx create mode 100644 src/components/ScreenBoundary/ScreenBoundary.module.css create mode 100644 src/components/ScreenBoundary/ScreenBoundary.tsx create mode 100644 src/components/Tip/Tip.module.css create mode 100644 src/components/Tip/Tip.tsx create mode 100644 src/enum/Platform.ts create mode 100644 src/hooks/useColorScheme.ts create mode 100644 src/store/module/colorScheme.ts diff --git a/public/favicon.ico b/public/favicon.ico index a11777cc471a4344702741ab1c8a588998b1311a..4b2e144a686958e6b480f605122cfd957b3590e1 100644 GIT binary patch literal 15406 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 literal 3870 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ diff --git a/public/index.html b/public/index.html index a0dce24..078fb5a 100644 --- a/public/index.html +++ b/public/index.html @@ -29,7 +29,7 @@ --> - React App + illustrate diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ec8af35685656e3bf208fce2c7cf424789c63558 GIT binary patch literal 13285 zcmX|I1yEF9xTm|8?vxY>K{^&#q-#MC1f)A9q`M`RW@(mgY3WpA0qHJvNdf78_y69^ z+nL>+*?~Ftp7Wja{p!YQYbp`q(c+OqEZ|dm0_!F4h3WxSl1HgU z(C?w3Fr%nI1aU?d8`u}%V4Yc zwf(!tSHC~_DwL8L_U3wFN`w!{9@Y=srt=#9(~56cC_DV?`0e9y_dP=Lcr~ptur+Hv zv=%JNjaQ{#V`NmJ*WD{F8!MQuwv?*`>ER;Bb6sk4-?>Z;^vn?)?m%0Mpe7(B>|)Ls zTkEIxcOYAv6%8Cb>nt7~8F@<93C6F@sRfrw{exC`QiDv!sOeOe6yJW;LEQMQv>cDO zZD3BD7!>Hzf2I7xv|z{&JttlIMTEH7Gbz;Ut}zMKY_lb?*|@4h!uYiog>}4GmpLND zil5KMw$xN9a4zxfj?2d!yCKw6mf_fE%}&GJwlJ}X_b8z6JBM6sJW zW87ddRCp8cxDYSc_SN>Q)NaRL_Z(5zZbuQ$={?Jjm=fC&Cn$px>JaDYteuER50{#`n8ug#S(+xdpZP|s~N(H1J` zZI=@{=h^nnc)?`ljjWA}fk6S?S233}mt^hFJS59Hd0FLb2On zIXzGCmOSrgO4%z9XmHeTxZ}h1M#3Im(>gw(Fq(*Ei@Jw>umYX*8?t8Dh4zvmC z8HuxCf#LMhv`Ryl)-|uS3@@+!TCfl|dw=m`nxKgAnEcY=$xeKOmnwIJ?~BF80$000 zpgNtB#vhcvT33t37S z*ilkQ+rwi>I79#XNgYx}m7VJ+hubutWuATDS*Bvd;^Nf$!)xsVU!}}c0IjBh=4rj} z?_qUBTSNZ0%DH`ee9XHBW(>dIqiNXRYW>;N5%%z?7;mBBzgsX_h46b@k7KYN*=q~3 zrokH6*;gtwRaX&W_8KR4mom&-$@m6KQqf08bk-t%smn#n<7L;L2P}_v`o$E!O&BMr zGF4&H?()U(BA4aiD-~7*s&tKh71j913rjg1VTi?09K|F8d6olgHh3~G&N(*2$c=1s z3sm)F9(AxOIPMWDdK&nY`k_5wX2~``_uJLFzic1%H(u1fiSYP_jB(q;kuZ>*^3=)6 zNkjMXK+3=K5>iEofq3HCdWUzB9#1Y9Qh?&`{`2wYd>yXvvKqHPwdGSUwZ8#c;W}4D zn_2fT7av#XaE z*mexMpP!$IJK}wEL4Gu_B7QOw?fU9?89x+mjKazz`{C96J z^sggiPZ6>ac-Syv+8TIw8C(AdPo1=i4?W{^L>pO7_KzSL0B*1q8%H<@7Hr#i86r`f zhcppm^4u5apUR#tFO>l^_>@BN3RN108hIB#oBMrw!GV^bS(17!7bw^=;7Q?q)7?{P z%;)OpggJw$D7Sjkl;nB5MVOM7IERl(cNz|f01Ijo-jczRm3;$I%=Wwz5;$4dr z4X1FrbyvE_V?vuB_v0f8sOy>XX57%Wy*$oI3_0}t-Nvt=1urdF72}XN_f&R1P3$@nD0so15E)d|}AD$N2J5i091U;Gp&f6nBf)K`J`{L|VMiU_je37Xsc?bpK=Box%^lrHx z&zd@9B+5$_BD;Td6nGIuNOwt%!xHgZb(mT`+>lZU$9;csaWS7(G7Y-zh&jids`uF= z=)Fw7Y`37GPQzPcz6g{i?}9#YkEDZ+vT^ncO9YN5-fK1~BGgquo&n$m?CS7Es-Gyt zwW81Al^hJ|s_+G}=?v1vcFS+fo7@>;)?2zdO3XGmv1(IH<&j2l?D+Nx%b+KZ$m|zYzA{v8b};MvD&!Q ze_!)h9=<4*IM-2Pm=hHgL^W2))MOOBq6y|Ks*_ASi(+n;%fVxrdL`pnPVmLek zJ&P`icQA}(QQQS$3zAu0o(RIpWpZZ}@!jf<@6^PRy`cOuHqD|-G{3WNY0!LCRv2`Y z!4R)0Xc09+xVTp?!dO7!_bUJG?X4*&l0eunI`toZ{b9sxSAI;Q)?K(DjjTp)BB>op zLJUrMyPwnRY_CE>nf45BxXil)aQL11=(iX_th03cM&D-{BhJ_)J?^ojcC56P@oU54 z!HQ_cmn&(|P?Qq5S_YrQZb7)2xBt(phpUV+>p^0XH@ssKQ67(D0&0ZyOt3S2N!+Pf zLA13n$cew9xbOoN2B`yq#p&l%9#Ge+JAHt7yjleK`1|h8Vd%t4Znco<2s!czE@+t{W#)oO0!__?QtE1wpIi=={~+w;x}sA z)ie``AnC;`)0oho?!Bd{pC}KjM(h-JdHzmSs(t&2KBS3Om^@A02Rq|@o7 zBO#s%J7TW*2j3fc3pPSHVCH{?K)V(VZSpv$;;bEu?ywCyEwO?kYr_n8M4u$7QOqvm zh`SNvkxNISA!yf79mBPQ-+%5b@acH;_lHy-l10}LB9kA#KTO8Cd;a1bgTl^eqyn(e z66hGyzc9k}X2dC9j4cm~C;iL^iFemyc3@iVe1TwqB}{k9L_30XRooQVSZ||t!~`yA zGE!1f!lfn^X2+Wj=uSViIQK}@l8rU;Az_pCz9YCzB46bcugjtP3hq0QhpxB0dAt!Q zdZM-WD%_Eqn~7Y`U4`$GaTuqmj)69P?Bv^**QDbppflIlL0~42YX(=ap_&70HCUM?y=d z6c_BRpe*QqVOvmb+cuv20HLT^uD>)_?CxCiE9{HHQ+nGlg+X!;(%Gb_?w|}oZ}6%y zjb$F??o`3A0V2uj(y7qPYxO#qAJMo=hPqTJAPNmJ zHy=vQ1Q@gy28#a$=+=_14L>Kx)2iw*qa7wsw|)RH1Ub+cT4<+cp`n_zB9U*w!_+b} zK8sG7Fc^K$!{thu>-O+Ks8A8KA|&hSIs!YR!3`NDzTJ^ol%)x?t4%uGt#L~*PUOB{(qsVOgdh|iLqn2@l>By7|0HlUIOO-I0I zrAZ1_WsR0A0FrW9pVZ??)1t(~#3AXlZ^*adW>27zj(c<1WJIwubX!grz#8&R9N`*4n!3B0$+8h`7AeAuZ#_kRY84v?yRL2bce8E%A zR@141$sEtmi*%eOb5kPhA)wie|0bF=|U$M+Kvpd~SH}ysL39R)_!9 z-$}CRoS5BwP7aRsZs!$|fWY{;)PDiPZwZ&K!d2lP+)2HL?2_4)C<+v~ApAk0kV1#0belLLHQ4#?Y8Zq>TP{Qu2)5c`c9i8ga(1kn>q@1%9?GJ3j zVdYXs#}WfaxYG5b$(6O?!E6>@lN_s0fJ?U_7r6}OX-v#Y@Y`4Ga*%w7fus2L&iC9G z4T~ysZ@|}czkdBnfCy(lgVLLXr1WTWEyg$WwAK3m`7@DoZ2HwkV=I<3?``VX?*fYl z4Iz&9VJ~Iwl&>JY&Pk2NVIvbVE%O*~F+NFaov!Lyip^nxNEYsYBa?hUFG!r!+6OM1 zFG|VMtXywDF`Uj1cJ|3>CCbI#n1oqUT>R!HKqlD!r;kj+ZODM=j>94?S--SHkaep13|@OE+{*n&F0fI};kAsf?(G$H4e*IarW zm}0gYSEqBR7lvP7qG*|aMN9As-MQ>yN~0mQ&Urq?Zz(XmWKie@t68FycuJg*LEG`pN5bQ-vm07HFA6M;*q}V zx_v%BM*|^KBP znCg*Cw|go6QFeYfMk%`r^N|TaVVZ;&lLpahEK&N%neJZBJDs`Z37dHGb%Xzmmr4>J zZ$4M8Xek%-IUxnPO(}nrGD*f8aHn^Rw$k5JZb#<%*Y3d3vuv|5d7bW+wOD8k(=UP$ z;@gs6QfsnvP7u!$NO6T{B&xQ%!g>mNNcmNKne; z5YvXs3cpWO*b>r@-v z5H}JlEvV$Km3AnyrZ62N^ZN*+403o{@QzrG3 zgktp*ova8Howxnoj*_tfs?yjm6s{8bI-f3*gevoGjs>QXqz1~9ztQR_?Ng$vkB|tQ^C(mpk+MKys{kK{?a1vkVLG0Z6T>Mzky9tv+t$-ZUR6_L*3EGm== z@4u@zfhYIyLwbpG?!=vtoQ^kW2|?!FQWA(8Qh;xY?z|U9HOszmd85kW*UtSs6zeWz zLrjoQe4@lF#~rRmlIuif@^{VC$H(XURUo8)a4k`G?W^siF9%KAPjy6NHNQK8Uvq}i z7C%U4r9}bV0iFsz?Gm+qnwg0CPAP9pjX6X}u^X>!CdD#X$dMmcK9m>m??)H0?EMMb z5&5qETPoTGF8DoxMd22eRT29247a3K(Mq&F>F1qE3}XFL+}b9Mws(DrE;=Q*psJ8yr#5tabrM zJk$C|rR^+B5frq**d4L=L{+wi^KS}rzWcB#Nl$*O*C|_9EAZMSzNYVWPkDpd`fm@| zotOM?V!tC&D`mr9*B;;T1GuAC*UD75inIT79_g$&NJGBNJQe5t zKygzR8pG{Ti!Yl$HWC8dJz(Yw~^@r;xZ zvSnk224xC*Tf`}U*#VP~oxLJ8N`90Habx%q(tY5&p5|WXJCi_MRpzVU_TyQL>8o?x z=OeTu?()+8Ll&o`EQ3@zxgN^?s6jb+H#y5?Y?+ z=2FFm%=i2B@Y%XAmu0fk%yh0Lr5ej=_759>KC~OK$BIlB>b5O~CbSJ)J$xGb{qpc? zh9}&+DC7v2KA;)RbXcMErML!@w3Ym&58&_H{GR8zBy=)BUjS%7h z4yeBF4t}Nwal_pyj9d{{Q#N0G@jw@G&Y93QubgjF-GdcUCa@9A zO^%n3Mb(6b5jsV`S-e~m<0cF#-h3&@_bSxqO0Fwz`Dr=%+E2G1isHv}`RH7D)w2tESLGt8)CU3?g#FJfuNtsfZ ziIqeOdif^Qjx+@kyFvDv46nRoNAL;P&u@78UxPjo_wVWKaQ35fjb+qlUZ{GBuFY}H zLKc)$bV)B2wF~pNwzh-rRy6T2iK+Iy?Sa^h@QvqqC_KHw0PdW)sOha$11VnPA{fz@#&Is`|Fze zzx+jaG2}*zvn1$+s~#=xFm3& zOE*e|XlA*2*r*P7&a?&{=55~+rCo?d_sYh`lf)ORlyqwr%36Cdhebosv$~^w^M!Aw7bb`=|0DsO_)A!b;B+^O zdNm+5Z`ZGGJCpBnr&)?HMkdf*MjYSO0hp(4T7C?GLMgy3)FQwHka6x_#ZOX8y(*i@ z;iFVoSXk?fR|A!<<;C`lSgW&MYaclt1i>2Il%FO^NDfgp^Q#y}Q1ce`ocr4I z!d3-n-U;`&P@hbRMrK*OvQPZ7Yw)@DUvs@e{($(?0%ccFLK&u2){fXF2hjth&ba;G zUcs=c+REhn>A@ao!-EXZyUj>a&wz7AhJiQFnoEv<$GGph9hw1x&E8T!4$f zeSSgea_UlCzhr++KokjDlFYNHI(Ih|*q}IaCLJbG-H^gpd!x1)h4u9M9Ufot`ue&- zG;Wh7-OtY?jUAXSoJAQea~IC_---hR14p9v;%@sQ5)56Ys46!-y37Gcs7|67_BSJD zSRC1fdc-t}JmYs_S0kPMqWFo@ut3QyK6mTe!SF+rw=8|&@gC1b{ zQO9@J%VG3o&XFFEXTZoF{iN8>6;V2n3bi-x9)lo#4V#~0-kc)*KNlXn8FFXWkXWc5_pHLwMxX=M&zXLV$tAg&|6 zo^j-vZKMen&{y8FK-64!?cJcxza_%ZZdYfKu9Rc83$-TxzHId-JE$lj6UaPX+K0`|Jx}haWZ@welQldp-B*70lGTaaiN+&PC z(JqvX4vpsgMx$kNii9WW;RQ>$Vh^U&|52ov0Hc$5lbQ1pxN}z`lf-o%_ zVt4&U+SPL_6(|uH<}YthWpGL|cf@)oEzlAI0pFJp`9XZ}T#g|W-e;w$ zQrZZ>id@<#riJ(1JM;;-SVY8qm0mx?n3pil?i}Za$7>`AF{_E)LC<|Kf=XLkuO1Tk zUATYCvdXITTA4|=sdHZ}4U#$Ap>XjP1&JXA2H07wqko(@z-RBWa~1UN1^_&_*VWZk z@Ek?PD#n9|TJEb=f>_-OAX?+HfFkIl?`n-!fX0yF zD4#B7_Olg`S^4bs7|z3SV~^gG3gmP4(#{eHfzJI|{hlN5KRj%z-4lhvds~id#QuD< zzU@LmA^Y-Q79hTrRvWr;bwwplATZ1aex~!Kb7ke<&Hbq$8eylVex|<%ZMa|IW#E$^ zqP-$^+(&_shcyWYhOVm^O|aER&d!w+L1K$-Ej%YGl^IAxM14oZGN@vnrCt0752N6q zLy0v>l%!T8V6+vm2E1}aoY4lGjxcY5O)VypF~;(7LIA|jFOHp5ut$7Gtn6Bt>c{2u z&#+KJ7c?P^<0YhLW>1U^g6kzP;BC@g_wi{Ep<6JJVKn{a;X6Q_D64T zZh@})PXA6HM{1J%nYtK=`rGk$PaY>Z9lMK=5zs6$ zCvrqL7~K`n#~#NaIh`MW|M@}d_yC8`I9vRyHmc!6o#GsRBp}TR-aS6l)s}p11yLd zj-l8RQ+2SyTW(+lvwE%A9w6W}6M$MPk{>C2X}dez^>qBArQowZUaG07DYMhE;&R92 z{O@Lx`5n*dGEjk>5#~4oL4ak%8G%!B9!5ChPOqz!@Z-aE_AAE^0E}K{s>p9vCB+~? z)3(*1-~8TK{RVdCD2{ZUcv+M4L;idLB&*tM$nw2jATlUWYEn`-j((((H^(E7DBM|L(~IQTf`7gSr@*EL)=E6&VL_)vW2RmV$t~sIljV2MK=H^ ziy@JVEexang;^HFyGKV|RavPsi_u8gr<*QpdbeKS1Uv;pTr$eVe%#i48uvCcq?GSP zXw)wVV7KtGD>}2Pe8ytW3b0(u1|OWB+}1@ivijZji}@KQ3`Byl+hKByv3l6UzNG*O zrq~K~KpTq)kp&8qu+s(T+}wXPS&Q!IM^HNiNmdAwjy|)iB`;t~ako)?ly57l-v$s6 zdW<9nTdet6{PgnM0K*E>?xtGdsQ<z*jG{9sTui-zn8M4^yxFG&&BXF>Hlm12pVtO)3NI+ohVpps1-gS;3 z+uyq4ytK=BA0MU(bvQ!MV25HvQ0(Znpv^?AdR`5=6ZFdt?h|Q{ z$(9&Vx2d_ueerP6$V9_Ktf-^VOO*tA(Yt~kvgt2?R311_*C;FvhHz$?F`iqJf{sGx zv2Z%Lhw2b4*J=pyUKtgCW*(;eek^o-$(n4e85i-52Y8AD6H~m^;oGYq@>Bw%yUcQC1G$XSHX%3Vdq& z(B8RJAZYx%{xymTm7dh(nSK)RqB)P`$M}cM@k0j1nce*>&= zA`e-EZm5QnP4b@WIT~l^MZaJw2kE*MemtN_)wMcHl804o2+282w;gmKIet*my(%2X zFsj1Fk%`3!Ho3LLv6uJL&1kw{m-1EcGhyMdmO5YDe@RcyK)Qs!A%xivC4yHed-+z~t*+Vp|Bk9?ym$vgxx_Avs6)(wpzIlJi;s7kapJb{>&v*3Re71GyRNe60UUgCl< zzCnSI3XqK~E{gyVMi#K4WK%XJ#S1$-b6z1DqMQ9=z)Si5MFdKj$J_4<3XTi4(qg>P z%x)l{hlb@P&N^e$RMY*vzj_Xr0qoXKV#qf4GN;}T=r7OgRPsJt zbXSIXDIi&Ji}9-nk4UE-{r&x2D?cJOtG0dDV@S58VICO8wC|}Qo>e*bnXWqph593=K48t{ft7XH}SBXuuL4@suZj9}Sq{sJ-ed-svFxFRB&Z_3=@fg*7<^ zbHo9fwpIivOKrz@(Gd;D5j7~$#G`eYp7?J7!-6McEJeb#LQjGa$ZT6*ZJwi*6^NMGsXK$98pkR2}?f@<)VB@G>AcUdO>DTlJe_?i`Yui;K;QN-Ol7m!H8I)4ii z)uarLuI&MQ=GH-J(+ft{XuKld?ATI-#jOqigvr(XaCKWNpR_(#Mm|BE{oYH0H@!beupuPQ>mG<1A zyVuL4tt$r&S(cpB%b|Q>z9OQ$YFjg230{cEj(H@<>c(BB(OAbR)yo`a#Rmm0yVGlX zPH?#m^8&GnoYKwWwuYDYcl>yf{d+pohtz7SxbLozIrLNooSB%Qdpd}Y*>WJ4bcQ{) z;cSjqsODE323wqJW!Oi8(pOg1x#p@rL0bm)hmf)(^b>|-4|;5l@u@Zypa>Pwi*jtn zxIkU_G@UVAvy!xe-?@+hfYc}O3gNKV6du18|H^Tmcd6NticvL%SkAM=SJD(jo@HS; z-wyM5mV~{c!Yv z{&Dtn+K`>=w8KIVa4<95lulrI2c)c&_Kly-Ff)gD+Z2!b@MZWP?e6Zz_hNDXUZJ+s z&_!8zQ8_B!6BpAR56PCm2S2N!`MwuASq{I?Odxci_o&4cb{gz;%w)bksgN<`#*9Dp zoR0lt{u1U4?%cZx_ck->Y9;w487aRt!aWyW?v7fANkd>kUbg^T)x|Mq(au5ao(9$I zsGrB{f>)c^J|xf9Vqefcc-aN^UsF8Smy*mF+X7`quG2_H6Fd)T!YUsCa$nb?pB-3( z_;CeGrae8~j6BYoU}i48jq3Er zf03qE+eyX~lW@iswsB*7qG}E2zi7pdGWpTCAmwhq;o=wB*-rCJA#(nLoEWsvc;f{_ zHWdmB2|xK)18EdvA^#fFuG?N!IGPw&XXKhiJ^H2vmT>_ve4*2|M2O9nDdMIg*K7jk zo%{&CFp3xuTjghE*z^(1JqE(QQ}%+nhop>(C8h#@<^;sfeBWb&BmtyJ_=$?2Pp|3? zq%63KY%cybT!13kP`WdMK%+O(_?H;Mi$7ospLqG>Mqu#b-|@U&LYOuQy#i}CX{Tfi2?5l*i; zomGBB$8mTY`gIGrO#5=B@L?%W|IYv0h}W8~gvmsv2anQ2gx8|XE~Zf~L-WJ-j3JwM z(<@7a3|=@#Z6vKdN7$l-q#Ey^KTh-v+N&w0?d30Wb%FnpZ@NWwyJPXtwUO|izXFb@ zZDXj=pQceASzjsgNRow?Ud+{opYx-!s5x7AkGGm0ww#7%u&zSKPqSObW_Ea^#h&%wqB#{8yN0;6Ss&-1O_P(Ov&XI5#8^kv~wbqiUXX%g`xU9k=9Qh1zy>}IA(@I zrDDgJ9hchASjmF++kK)qJT%jA)=PFYtG+U0(B{;tEXb8PW~&s;Ab5@fpqyb^lABH~ z?*!0HbY=hDNKt3RdvuTg*|HMw){Wg1qV72|;RTY*e>n({4tJqeVrDbIuQ0Wh4kI@- z6WfPOxsLS~6W0fD*0V6z2jQ|v8O5=TeYeR!U^ znh#wBAHK9+&Gsve34;R4czJ$EQ8s}cFVJ_T1YC&Nm)eM`b9`B^iHt1|Qz<*a3v07a zg3)tH>CeKF((;I^rzq?Kxs1x9RO;ABPo5>GrL%`=2}CDWECb>B;;BXAw>av%ev(@x z@3L{a$tW{DiA+LW78@`KG*qr64sLUda&cr1a9fLeYQfltjit)q(H%{%FB`u*{w}wx zzM4|)`-|uK{jbBJ5+_=Ai+mnuCoK&I@xFD6>N`Dr1Ajgh zC0S}oo+4ef7TQXT&!Ru+^_p$K*`>qCpn%MY1;!6N_t5l-6;%(t`#67tTjd3r(_HnN zBRtRknh}Kt1}l-X6bz0n{j$n+ie2)Rd939IU&YBZi%+_udw8CsH8b*rhf4DpDGXn5 zWPZ<&JA4J6_h@*ao$^$R((7hO!|9H#$!abICgsC{L5)#!lTl4jwxG8|7;kGraYuYZ z{^j|(af|!T@R5e5y`1PVo+s7_KYTS>@RDYDkq+t|&D*N{`#vM}=-b3O5pdHAI$Zz% zY|78}_x=CaSdkkK@eS_+HhM~p`3AbzUeFwZ4GM%72XFb@-jPiM%#EE@B1_QQjRE(L tA-(}y3@Lik?dpMGI$R%JV(fjwURbwkKDC&h1fJVLQBl-{)XJNM{SV+_r9=P# literal 0 HcmV?d00001 diff --git a/public/logo192.png b/public/logo192.png index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..f61c5038d8ba4bfc7ff62de3d63e18c5dcfbf4be 100644 GIT binary patch literal 13517 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 literal 5347 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 X@eDJUQo;Ye2mwlRsu9T+0stKP6AmEApvT^$ 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/public/manifest.json b/public/manifest.json index 080d6c7..b40a83e 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -1,6 +1,6 @@ { - "short_name": "React App", - "name": "Create React App Sample", + "short_name": "illustrate", + "name": "illustrate", "icons": [ { "src": "favicon.ico", diff --git a/src/components/ExtraInformation/ExtraInformation.module.css b/src/components/ExtraInformation/ExtraInformation.module.css new file mode 100644 index 0000000..c4f6352 --- /dev/null +++ b/src/components/ExtraInformation/ExtraInformation.module.css @@ -0,0 +1,34 @@ +.extra-information { + margin: 10px 0; + padding: 10px; + border: var(--border); + border-radius: var(--border-radius-base); +} + +.title { + font-size: calc(var(--font-size-base) * 1.1); + font-weight: var(--font-weight-primary); + color: var(--text-color); +} + +.wrapper, +.other { + margin-top: 10px; +} + +.other { + display: flex; + flex-wrap: wrap; + align-items: center; +} + +.platform { + color: var(--color-info); +} + +.platform-item { + display: flex; + flex-wrap: wrap; + align-items: center; + column-gap: 10px; +} diff --git a/src/components/ExtraInformation/ExtraInformation.tsx b/src/components/ExtraInformation/ExtraInformation.tsx new file mode 100644 index 0000000..ef327a5 --- /dev/null +++ b/src/components/ExtraInformation/ExtraInformation.tsx @@ -0,0 +1,79 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import { Platform } from '@/enum'; +import Tip from '@/components/Tip/Tip'; +import Text from '@/components/Text/Text'; +import style from './ExtraInformation.module.css'; + +interface ExtraInformationProps { + platform: { + [key in keyof typeof Platform]?: key extends 'blog' + ? { title: string; url: string } + : { url: string }; + }; +} + +export default function ExtraInformation(props: ExtraInformationProps) { + const { platform } = props; + + return ( + + {{ + header() { + return 案例相关链接:; + }, + body() { + return ( +
+
+ {Platform['blog']}: + + + {platform['blog']?.title} + +
+ +
+ 发布平台: + +

+ {Object.keys(platform).map((key) => ( + + + {Platform[key as keyof typeof Platform]} + + + ))} +

+
+
+ ); + } + }} +
+ + //
+ //

案例相关链接:

+ + // {/*
+ // {Object.keys(platform).map((key) => ( + //
+ // + // {Platform[key as keyof typeof Platform]}: + // + + // {platform[key as keyof typeof Platform]?.map(({ title, url }) => ( + // + // {title} + // + // ))} + //
+ // ))} + //
*/} + //
+ ); +} diff --git a/src/components/InputNumber/InputNumber.module.css b/src/components/InputNumber/InputNumber.module.css index 3a331b7..1265a92 100644 --- a/src/components/InputNumber/InputNumber.module.css +++ b/src/components/InputNumber/InputNumber.module.css @@ -37,7 +37,7 @@ align-items: center; height: auto; position: absolute; - z-index: 1; + z-index: var(--z-index-normal); top: 1px; bottom: 1px; width: var(--input-number-btn-width); diff --git a/src/components/Overlay/Overlay.module.css b/src/components/Overlay/Overlay.module.css index 6540290..98f2114 100644 --- a/src/components/Overlay/Overlay.module.css +++ b/src/components/Overlay/Overlay.module.css @@ -1,7 +1,7 @@ .overlay { position: fixed; inset: 0; - z-index: 2000; + z-index: var(--z-index-highest); background-color: var(--overlay-color-lighter); overflow: auto; } diff --git a/src/components/ScreenBoundary/ScreenBoundary.module.css b/src/components/ScreenBoundary/ScreenBoundary.module.css new file mode 100644 index 0000000..7ef38ff --- /dev/null +++ b/src/components/ScreenBoundary/ScreenBoundary.module.css @@ -0,0 +1,23 @@ +.screen-boundary { + margin: 10px; + margin-top: 50px; +} + +.title { + padding: 10px; + font-size: var(--font-size-large); + font-weight: var(--font-weight-primary); + color: var(--color-warning); +} + +.desc { + margin-top: 15px; + font-size: var(--font-size-large); + line-height: var(--font-line-height-primary); + color: var(--text-color-regular); +} + +.footer { + margin-top: 15px; + text-align: end; +} diff --git a/src/components/ScreenBoundary/ScreenBoundary.tsx b/src/components/ScreenBoundary/ScreenBoundary.tsx new file mode 100644 index 0000000..0e75f37 --- /dev/null +++ b/src/components/ScreenBoundary/ScreenBoundary.tsx @@ -0,0 +1,51 @@ +import React, { useContext } from 'react'; +import { Link } from 'react-router-dom'; +import Card from '@/components/Card/Card'; +import Text from '@/components/Text/Text'; +import Button from '@/components/Button/Button'; +import { ScreenContext } from '@/layout/Layout'; +import style from './ScreenBoundary.module.css'; + +interface ScreenBoundaryProps extends ChildProps { + children: React.ReactElement; + displayInMobile?: boolean; +} + +export default function ScreenBoundary(props: ScreenBoundaryProps) { + const { children, displayInMobile = false } = props; + + const isSmallScreen = useContext(ScreenContext); + + if (isSmallScreen && displayInMobile === false) { + return ( + + {{ + header() { + return

温馨提示

; + }, + body() { + return ( + <> + + 此页不建议在移动端或小屏设备上渲染 + + +

+ 基于技术或用户体验考虑,当前页面暂不支持在此环境中展示,建议使用大屏设备体验,如电脑、平板等。 +

+ +
+ + + +
+ + ); + } + }} +
+ ); + } + + return children; +} diff --git a/src/components/Select/Select.module.css b/src/components/Select/Select.module.css index 9e6f07a..1671a21 100644 --- a/src/components/Select/Select.module.css +++ b/src/components/Select/Select.module.css @@ -44,7 +44,7 @@ display: none; position: absolute; top: 110%; - background-color: #fff; + background-color: var(--bg-color); border: 1px solid var(--border-color-light); box-shadow: var(--box-shadow-light); border-radius: var(--border-radius-base); @@ -53,7 +53,7 @@ line-height: 20px; width: 100%; word-wrap: break-word; - z-index: 10; + z-index: var(--z-index-useful); } .select-options-item { diff --git a/src/components/Tip/Tip.module.css b/src/components/Tip/Tip.module.css new file mode 100644 index 0000000..54e2a64 --- /dev/null +++ b/src/components/Tip/Tip.module.css @@ -0,0 +1,81 @@ +.tip { + --tip-background-color: var(--fill-color-extra-light); + --tip-border-left-color: var(--border-color); + + position: relative; + margin: 20px 0; + padding: 8px 16px; + background-color: var(--tip-background-color); + border-radius: 4px; + border-left: 5px solid var(--tip-border-left-color); +} + +.tip-primary { + --tip-background-color: var(--color-primary-light-9); + --tip-border-left-color: var(--color-primary); +} + +.tip-success { + --tip-background-color: var(--color-success-light-9); + --tip-border-left-color: var(--color-success-dark-2); +} + +.tip-info { + --tip-background-color: var(--color-info-light-9); + --tip-border-left-color: var(--color-info); +} + +.tip-warning { + --tip-background-color: var(--color-warning-light-9); + --tip-border-left-color: var(--color-warning); +} + +.tip-danger { + --tip-background-color: var(--color-danger-light-9); + --tip-border-left-color: var(--color-danger); +} + +.tip-title { + margin: 1rem 0; + margin-top: 0; + margin-bottom: 0.5rem; + font-size: var(--font-size-medium); + font-weight: var(--font-weight-primary); + line-height: 1.7; +} + +.tip-desc { + font-size: var(--font-size-base); + color: var(--text-color); + word-break: break-all; +} + +.tip-close { + position: absolute; + right: 8px; + top: 8px; + background: none; + outline: none; + border: none; + cursor: pointer; +} + +.tip-close i { + font-size: var(--font-size-small); + color: var(--text-color); +} + +.tip-leave { + animation: leave var(--transition-duration-fast); + transform-origin: top center; +} + +@keyframes leave { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} diff --git a/src/components/Tip/Tip.tsx b/src/components/Tip/Tip.tsx new file mode 100644 index 0000000..c02491f --- /dev/null +++ b/src/components/Tip/Tip.tsx @@ -0,0 +1,80 @@ +import React, { useState, useRef, useEffect } from 'react'; +import { useTransition } from '@/hooks'; +import { classnames, composeClass, isRenderElement } from '@/utils'; +import style from './Tip.module.css'; + +interface TipSlots { + header(): React.ReactNode | React.ReactNode[]; + body(): React.ReactNode | React.ReactNode[]; +} + +interface TipProps extends Props { + children: TipSlots; + showClose?: boolean; + autoClose?: number; + type?: 'default' | 'primary' | 'success' | 'info' | 'warning' | 'danger'; +} + +const generateClass = classnames(style); + +export default function Tip(props: TipProps) { + const { + children, + style: _style, + autoClose, + type = 'default', + showClose = false, + className = '', + ...nativeProps + } = props; + + const [show, setShow] = useState(true); + const [timer, setTimer] = useState(-1); + + const tipRef = useRef(null); + + useTransition(show, tipRef, { active: '' }, { active: style['tip-leave'] }); + + useEffect(() => { + if (typeof autoClose !== 'number') return; + + const timer = window.setTimeout(() => { + handleClose(); + }, autoClose); + + setTimer(timer); + + return () => { + window.clearTimeout(timer); + }; + }, []); + + const tipClass = generateClass(['tip', `tip-${type}`]); + + const handleClose = () => { + setShow(false); + + if (timer) { + window.clearTimeout(timer); + } + }; + + return ( +
+

{children.header()}

+ +
{children.body()}
+ + {isRenderElement(showClose) && ( + + )} +
+ ); +} diff --git a/src/config/index.ts b/src/config/index.ts index d4011a3..6975b16 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -9,7 +9,11 @@ export const BREAK_POINT = 840; /** 异常反馈地址 */ export const FEEDBACK_ADDRESS = 'https://github.com/yuanyxh/illustrate/issues'; +/** 项目名称 */ +export const PROJECT_NAME = 'illustrate'; + export default { BREAK_POINT, - FEEDBACK_ADDRESS + FEEDBACK_ADDRESS, + PROJECT_NAME }; diff --git a/src/enum/Platform.ts b/src/enum/Platform.ts new file mode 100644 index 0000000..c88c042 --- /dev/null +++ b/src/enum/Platform.ts @@ -0,0 +1,6 @@ +export enum Platform { + blog = '博客', + juejin = '掘金', + zhihu = '知乎', + csdn = 'CSDN' +} diff --git a/src/enum/index.ts b/src/enum/index.ts index 2385b37..a68a487 100644 --- a/src/enum/index.ts +++ b/src/enum/index.ts @@ -1 +1,2 @@ export * from './RouteID'; +export * from './Platform'; diff --git a/src/home/Grid.module.css b/src/home/Grid.module.css index 5f42756..b3b6206 100644 --- a/src/home/Grid.module.css +++ b/src/home/Grid.module.css @@ -16,6 +16,7 @@ margin: 5px 0; font-weight: var(--font-weight-primary); line-height: 1.2em; + color: var(--text-color); } @media screen and (max-width: 1920px) { diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 92f4eba..a359f53 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -4,3 +4,4 @@ export * from './useScreen'; export * from './useModel'; export * from './useDebounce'; export * from './useTransition'; +export * from './useColorScheme'; diff --git a/src/hooks/useColorScheme.ts b/src/hooks/useColorScheme.ts new file mode 100644 index 0000000..8842ba5 --- /dev/null +++ b/src/hooks/useColorScheme.ts @@ -0,0 +1,39 @@ +import { useEffect, useCallback } from 'react'; +import { setColorScheme } from '@/store/module/colorScheme'; +import { useAppDispatch } from '@/store'; + +const query = { + light: '(prefers-color-scheme: light)', + dark: '(prefers-color-scheme: dark)' +}; + +export function useColorScheme() { + const dispatch = useAppDispatch(); + + const light = useCallback((e: MediaQueryListEvent) => { + if (e.matches) { + dispatch(setColorScheme('light')); + } + }, []); + const dark = useCallback((e: MediaQueryListEvent) => { + if (e.matches) { + dispatch(setColorScheme('dark')); + } + }, []); + + useEffect(() => { + if (window.matchMedia(query.light).matches) { + dispatch(setColorScheme('light')); + } else if (window.matchMedia(query.dark).matches) { + dispatch(setColorScheme('dark')); + } + + window.matchMedia(query.light).addEventListener('change', light); + window.matchMedia(query.dark).addEventListener('change', dark); + + return () => { + window.matchMedia(query.light).removeEventListener('change', light); + window.matchMedia(query.dark).removeEventListener('change', dark); + }; + }, []); +} diff --git a/src/hooks/useThrottle.ts b/src/hooks/useThrottle.ts index 894eae2..207d378 100644 --- a/src/hooks/useThrottle.ts +++ b/src/hooks/useThrottle.ts @@ -21,7 +21,9 @@ export const useThrottle = any>( const { delay = 50, deps = [] } = options || {}; const throttleFn = useCallback((...anys: Parameters) => { - if (identify) return; + if (identify) { + window.clearTimeout(identify); + } identify = window.setTimeout(() => { fn.apply(this, anys); diff --git a/src/hooks/useTransition.ts b/src/hooks/useTransition.ts index e44b208..9bdd976 100644 --- a/src/hooks/useTransition.ts +++ b/src/hooks/useTransition.ts @@ -62,12 +62,15 @@ export const useTransition = ( useEffect(() => { const end = () => { port.exec((ele) => { - ele.classList.remove( - ...getClass(enter, 'active', 'from', 'to').split(' ') - ); - ele.classList.remove( - ...getClass(leave, 'active', 'from', 'to').split(' ') - ); + getClass(enter, 'active', 'from', 'to') && + ele.classList.remove( + ...getClass(enter, 'active', 'from', 'to').split(' ') + ); + + getClass(leave, 'active', 'from', 'to') && + ele.classList.remove( + ...getClass(leave, 'active', 'from', 'to').split(' ') + ); state ? port.show() : port.hide(); }); diff --git a/src/index.css b/src/index.css index 3fc5968..866163e 100644 --- a/src/index.css +++ b/src/index.css @@ -3,7 +3,11 @@ @import url('./styles/theme.css'); @import url('./styles/preset.css'); @import url('./styles//animation.css'); -@import url('//at.alicdn.com/t/c/font_3329662_ezmhfqkr8te.css'); +@import url('//at.alicdn.com/t/c/font_3329662_ymvhmdawcgf.css'); + +html { + color-scheme: light; +} body { margin: 0; @@ -13,9 +17,10 @@ body { sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; - color: #333; + color: var(--text-color); font-size: var(--font-size-base); - background-color: var(--background-color); + background-color: var(--bg-color); + transition: background-color var(--transition-duration-fast); } code { diff --git a/src/layout/Layout.module.css b/src/layout/Layout.module.css index e153b3b..e711531 100644 --- a/src/layout/Layout.module.css +++ b/src/layout/Layout.module.css @@ -1,7 +1,13 @@ .layout { + --navbar-height: 2.3rem; + min-height: 100vh; } +html[screen='small'] .layout { + --navbar-height: 2.6rem; +} + @media screen and (min-width: 768px) { .layout { --sidebar-width: 11.5rem; diff --git a/src/layout/Navbar.module.css b/src/layout/Navbar.module.css index a3d8eab..3702f0b 100644 --- a/src/layout/Navbar.module.css +++ b/src/layout/Navbar.module.css @@ -1,24 +1,69 @@ .navbar { - display: none; + display: flex; align-items: center; + justify-content: space-between; position: sticky; top: 0; - padding: 0 10px; + padding: 0 20px; width: var(--stretch); - height: 2.5rem; - border-bottom: 1px solid var(--color-border); - background-color: var(--color-white); + height: var(--navbar-height); + z-index: calc(var(--z-index-important) + var(--z-index-normal)); + border-bottom: 1px solid var(--border-color); + background-color: var(--bg-color); +} + +html[screen='small'] .navbar { + padding: 0 10px; +} + +html:not([screen='small']) .left { + padding: 8px 0; + height: 100%; +} + +.logo-container { + display: flex; + align-items: center; + column-gap: 8px; + height: 100%; + cursor: pointer; + font-size: 0; +} + +.logo { + width: revert; +} + +.logo-text { + font-style: italic; } .menu { - width: 1rem; - height: 1rem; - background: linear-gradient(#666, #666) no-repeat left top / 1rem 3px, - linear-gradient(#666, #666) no-repeat left center / 1rem 3px, - linear-gradient(#666, #666) no-repeat left bottom / 1rem 3px; cursor: pointer; } +.menu > i { + font-size: calc(var(--font-size-extra-large) * 2); +} + +.right { + user-select: none; +} + +.list { + display: flex; + align-items: center; + column-gap: 20px; +} + +.list-item { + cursor: pointer; +} + +.list-item i { + font-size: calc(var(--font-size-extra-large) * 1.4); +} + @media screen and (max-width: 840px) { .navbar { display: flex; diff --git a/src/layout/Navbar.tsx b/src/layout/Navbar.tsx index 575f43e..66ba159 100644 --- a/src/layout/Navbar.tsx +++ b/src/layout/Navbar.tsx @@ -1,5 +1,10 @@ import React, { useContext } from 'react'; +import { Link } from 'react-router-dom'; +import { isRenderElement } from '@/utils'; +import { useAppSelector, useAppDispatch } from '@/store'; +import { setColorScheme } from '@/store/module/colorScheme'; import { ScreenContext } from './Layout'; +import Text from '@/components/Text/Text'; import style from './Navbar.module.css'; interface NavbarProps { @@ -11,16 +16,82 @@ interface NavbarProps { */ export default function Navbar({ toggle }: Readonly) { const smallScreen = useContext(ScreenContext); + const colorScheme = useAppSelector((state) => state.colorScheme.colorScheme); + const dispatch = useAppDispatch(); const onclick = () => toggle(true); + const changeLight = () => dispatch(setColorScheme('light')); + const changeDark = () => dispatch(setColorScheme('dark')); + return ( - <> - {smallScreen && ( - - )} - + ); } diff --git a/src/layout/Sidebar.module.css b/src/layout/Sidebar.module.css index cd56576..157efc8 100644 --- a/src/layout/Sidebar.module.css +++ b/src/layout/Sidebar.module.css @@ -1,24 +1,29 @@ .sidebar { position: fixed; - top: 0; + top: var(--navbar-height); bottom: 0; left: 0; - z-index: 2; + z-index: calc(var(--z-index-highest) + var(--z-index-important)); padding: 20px 5px; width: var(--sidebar-width); - background-color: var(--color-white); - box-shadow: 2px 0 8px 0 rgba(0 0 0 / 10%); - transition: transform 0.4s ease; + transition: transform var(--transition-duration); + border-right: var(--border); + background-color: var(--bg-color); + overscroll-behavior: contain; +} + +html[screen='small'] .sidebar { + top: 0; } .visible-side { transform: translateX(0) !important; - box-shadow: 2px 0 8px 0 rgba(0 0 0 / 10%) !important; } .link { display: block; padding: 10px 14px; + color: var(--text-color); border-radius: var(--border-radius-base); } diff --git a/src/layout/layout.tsx b/src/layout/layout.tsx index ed59fb7..6f39854 100644 --- a/src/layout/layout.tsx +++ b/src/layout/layout.tsx @@ -1,5 +1,15 @@ -import React, { createContext, useState, useCallback } from 'react'; -import { useScreen } from '@/hooks'; +import React, { + createContext, + useEffect, + useState, + useMemo, + useCallback +} from 'react'; +import { ScrollRestoration, useLocation, useMatch } from 'react-router-dom'; +import CONFIG from '@/config'; +import { routes } from '@/router'; +import { useScreen, useColorScheme } from '@/hooks'; +import { isEmpty } from '@/utils'; import Navbar from './Navbar'; import Sidebar from './Sidebar'; import Main from './Main'; @@ -7,18 +17,97 @@ import style from './Layout.module.css'; export const ScreenContext = createContext(false); +const map = new Map(); + /** * @description 网站整体布局 */ export default function Layout() { const [visibleSide, setVisibleSide] = useState(false); const isSmallScreen = useScreen(); + const location = useLocation(); + const match = useMatch(location.pathname); const toggle = useCallback( (payload: boolean) => setVisibleSide(() => payload), [] ); + useMemo(() => { + if (isSmallScreen) { + window.document.documentElement.setAttribute('screen', 'small'); + } else { + window.document.documentElement.removeAttribute('screen'); + } + }, [isSmallScreen]); + + useEffect(() => { + if (isEmpty(match)) { + window.document.title = CONFIG.PROJECT_NAME; + } else { + if (map.has(match.pattern.path)) { + window.document.title = + map.get(match.pattern.path) || CONFIG.PROJECT_NAME; + } else { + const paths = match.pattern.path + .split('/') + .filter((path) => path.trim() !== ''); + + const title = resolve(findRoute(paths, routes.slice(0))); + window.document.title = title; + + map.set(match.pattern.path, title); + } + } + + return () => { + window.document.title = CONFIG.PROJECT_NAME; + }; + }, [match]); + + useColorScheme(); + + const resolve = (title: string) => { + if (title.trim() !== '') { + return `${title} | ${CONFIG.PROJECT_NAME}`; + } + + return CONFIG.PROJECT_NAME; + }; + + const findRoute = ( + paths: string[], + target: Route.CustomRouteObject[] | undefined + ): string => { + const path = paths.shift(); + + if (isEmpty(target) || isEmpty(path)) return ''; + + for (let i = 0; i < target.length; i++) { + const fined = target[i].path === path || target[i].path === `/${path}`; + + if (fined) { + if (paths.length === 0) { + return target[i].title || ''; + } else { + target = target[i].children; + return findRoute(paths, target); + } + } + } + + for (let i = 0; i < target.length; i++) { + const children = target[i].children; + const result = findRoute([path], children); + + if (result !== '') { + return result; + } + } + + return ''; + }; + return (
@@ -26,6 +115,8 @@ export default function Layout() {
+ + location.pathname} />
); } diff --git a/src/pages/Base64/Base64.module.css b/src/pages/Base64/Base64.module.css index 35172af..e9fef22 100644 --- a/src/pages/Base64/Base64.module.css +++ b/src/pages/Base64/Base64.module.css @@ -5,8 +5,11 @@ .wrapper { display: flex; - justify-content: space-between; - height: inherit; + height: 100%; +} + +html[screen='small'] .wrapper { + flex-direction: column; } .operator { @@ -17,6 +20,16 @@ row-gap: 8px; } +html[screen='small'] .operator { + margin: 10px 0; +} + .text { + display: flex; + width: 100%; height: 100%; } + +html[screen='small'] .text { + flex: 1; +} diff --git a/src/pages/Base64/Base64.tsx b/src/pages/Base64/Base64.tsx index d5d3412..00544ef 100644 --- a/src/pages/Base64/Base64.tsx +++ b/src/pages/Base64/Base64.tsx @@ -22,13 +22,15 @@ export default function Base64() { return (
- +
+ +
- +
+ +
); diff --git a/src/pages/FileSystemAccess/FileSystemAccess.tsx b/src/pages/FileSystemAccess/FileSystemAccess.tsx index c1c17a0..7408d18 100644 --- a/src/pages/FileSystemAccess/FileSystemAccess.tsx +++ b/src/pages/FileSystemAccess/FileSystemAccess.tsx @@ -1,6 +1,9 @@ import React, { useState } from 'react'; import Card from '@/components/Card/Card'; import Button from '@/components/Button/Button'; +import MessageBox from '@/components/MessageBox/MessageBox'; +import ScreenBoundary from '@/components/ScreenBoundary/ScreenBoundary'; +import ExtraInformation from '@/components/ExtraInformation/ExtraInformation'; import FileSystemController from './FileSystemController'; import style from './FileSystemAccess.module.css'; @@ -11,31 +14,58 @@ export default function FileSystemAccess() { const openDirectory = () => { (async () => { - const directory = await window.showDirectoryPicker({ mode: 'readwrite' }); + if (typeof window.showDirectoryPicker === 'function') { + const directory = await window.showDirectoryPicker({ + mode: 'readwrite' + }); - setRoot(directory); + setRoot(directory); + } else { + MessageBox.alert({ + type: 'warning', + title: '获取目录失败', + message: + '当前浏览器暂不支持 window.showDirectoryPicker 方法,请使用最新浏览器或前往 MDN 查看浏览器支持性。' + }); + } })(); }; return ( -
- - - + +
+ - - -
+ + + + + + +
+ ); } diff --git a/src/pages/FileSystemAccess/Location.module.css b/src/pages/FileSystemAccess/Location.module.css index 51df298..2dd9b4b 100644 --- a/src/pages/FileSystemAccess/Location.module.css +++ b/src/pages/FileSystemAccess/Location.module.css @@ -49,10 +49,12 @@ position: absolute; top: 100%; width: 100%; + max-height: 200px; border: var(--border); border-top: 0; background-color: var(--bg-color); - z-index: 3; + z-index: var(--z-index-useful); + overflow-y: auto; } .search-result-item { diff --git a/src/pages/GIF-Explorer/GIFPicture.module.css b/src/pages/GIF-Explorer/GIFPicture.module.css index fd1b60c..7e6a8b4 100644 --- a/src/pages/GIF-Explorer/GIFPicture.module.css +++ b/src/pages/GIF-Explorer/GIFPicture.module.css @@ -2,14 +2,32 @@ display: flex; } +html[screen='small'] .gif-picture { + display: block; +} + .drawing-board-container { margin-right: 20px; } +html[screen='small'] .drawing-board-container { + margin-right: 0; + width: 100%; +} + .drawing-board { touch-action: none; } +html[screen='small'] .drawing-board { + width: 100% !important; + height: 300px; +} + +html[screen='small'] .gif-picture-config { + margin-top: 20px; +} + .opterator { display: flex; column-gap: 10px; diff --git a/src/pages/GIF-Explorer/GIFPicture.tsx b/src/pages/GIF-Explorer/GIFPicture.tsx index 6d7e98c..a18da5f 100644 --- a/src/pages/GIF-Explorer/GIFPicture.tsx +++ b/src/pages/GIF-Explorer/GIFPicture.tsx @@ -386,6 +386,7 @@ export default function GIFPicture() {
-
+
{ @@ -292,6 +292,7 @@ export default function GIFVideo() { ) { - const { showList, perfix = '' } = props; + const { showList, perfix = '', className = '', ...nativeProps } = props; const colorRef = useRef(null); const tableRef = useRef(null); @@ -173,7 +173,10 @@ export default forwardRef(function Configuration( }; return ( -
+
{isRenderElement(showList.includes('time')) && (
diff --git a/src/pages/PdfParser/PdfParser.module.css b/src/pages/PdfParser/PdfParser.module.css index 3c85ccd..5ec8fc2 100644 --- a/src/pages/PdfParser/PdfParser.module.css +++ b/src/pages/PdfParser/PdfParser.module.css @@ -1,8 +1,12 @@ .pdf-parser { - padding: 30px; + padding: 20px; height: inherit; } +html[screen='small'] .pdf-parser { + padding: 10px; +} + .desc { margin: 0.2rem 0 1.2rem; } @@ -19,6 +23,10 @@ border-radius: var(--border-radius-base); } +html[screen='small'] .drawing-board { + width: 100%; +} + .page { box-shadow: var(--box-shadow-light); } diff --git a/src/pages/PdfParser/PdfParser.tsx b/src/pages/PdfParser/PdfParser.tsx index 2294020..8d9d93b 100644 --- a/src/pages/PdfParser/PdfParser.tsx +++ b/src/pages/PdfParser/PdfParser.tsx @@ -1,5 +1,6 @@ import React, { useRef, useState, useEffect } from 'react'; import { forEach } from '@/utils'; +import ExtraInformation from '@/components/ExtraInformation/ExtraInformation'; import pdfParser from './lib/PDFParser'; import Button from '@/components/Button/Button'; import Text from '@/components/Text/Text'; @@ -74,6 +75,20 @@ export default function PdfParser() { return ( <>
+ + diff --git a/src/pages/Test/Test.module.css b/src/pages/Test/Test.module.css index 2dfecae..04d179a 100644 --- a/src/pages/Test/Test.module.css +++ b/src/pages/Test/Test.module.css @@ -1,45 +1,3 @@ .test { padding: 10px; } - -.div-init { - position: fixed; - inset: 0; - display: none; - background-color: var(--overlay-color-lighter); - z-index: 999; -} - -.show { - display: revert; -} - -.div-enter-active { - display: revert; - animation: fade-in var(--transition-duration); -} - -.div-leave-active { - display: revert; - animation: fade-out var(--transition-duration); -} - -@keyframes fade-in { - 0% { - opacity: 0; - } - - 100% { - opacity: 1; - } -} - -@keyframes fade-out { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - } -} diff --git a/src/pages/Test/Test.tsx b/src/pages/Test/Test.tsx index d881a1f..361ae9d 100644 --- a/src/pages/Test/Test.tsx +++ b/src/pages/Test/Test.tsx @@ -1,8 +1,22 @@ import React from 'react'; +import Tip from '@/components/Tip/Tip'; import style from './Test.module.css'; // --title: 测试页面-- export default function Test() { - return
; + return ( +
+ + {{ + header() { + return 'TIP'; + }, + body() { + return Test content; + } + }} + +
+ ); } diff --git a/src/pages/UploadFile/UploadFile.tsx b/src/pages/UploadFile/UploadFile.tsx index 3e284d5..5d4172b 100644 --- a/src/pages/UploadFile/UploadFile.tsx +++ b/src/pages/UploadFile/UploadFile.tsx @@ -4,6 +4,7 @@ import Upload from '@/components/Upload/Upload'; import Button from '@/components/Button/Button'; import Text from '@/components/Text/Text'; import Card from '@/components/Card/Card'; +import ExtraInformation from '@/components/ExtraInformation/ExtraInformation'; import UploadList from './UploadList'; import UploadImage from './UploadImage'; import type { UploadFile, TransformResponse } from '@/components/Upload/types'; @@ -35,6 +36,41 @@ export default function UploadFile() { return (
+ + + + 文件上传涉及服务器,本页仅用于调试,可 clone{' '} + + + {' '} + 以启动本地服务器 + + setShowMenu(false)} - > +
e.preventDefault()} - onDrop={drop} - onDragEnter={dragenter} - onDragLeave={dragleave} - onContextMenu={contextmenu} - >
-
- {isEdit ? ( -
-
setIsEdit(false)}> - 返回 -
-

编辑

-
- width - -
-
- height - -
-
- background-color - + className={style['visual-edit']} + onClick={click} + onContextMenu={() => setShowMenu(false)} + > +
e.preventDefault()} + onDrop={drop} + onDragEnter={dragenter} + onDragLeave={dragleave} + onContextMenu={contextmenu} + >
+
+ {isEdit ? ( +
+
setIsEdit(false)}> + 返回 +
+

编辑

+
+ width + +
+
+ height + +
+
+ background-color + +
+ +
+ +
- -
- -
-
- ) : ( -
-

组件

-
- 盒子 - -
-
- 输入框 - { - /* */ - }} - onDragStart={dragstart} - > + ) : ( +
+

组件

+
+ 盒子 + +
+
+ 输入框 + { + /* */ + }} + onDragStart={dragstart} + > +
+
+ 按钮 + +
-
- 按钮 - -
-
+ )} +
+ + {showMenu && ( +
    +
  • + 编辑 +
  • +
)}
- - {showMenu && ( -
    -
  • - 编辑 -
  • -
- )} -
+ ); } diff --git a/src/store/index.ts b/src/store/index.ts index 6f850e3..0262024 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -1,11 +1,13 @@ import { useSelector, useDispatch } from 'react-redux'; import { configureStore } from '@reduxjs/toolkit'; import screenReducer from './module/screen'; +import colorSchemeReducer from './module/colorScheme'; import type { TypedUseSelectorHook } from 'react-redux'; export const store = configureStore({ reducer: { - screen: screenReducer + screen: screenReducer, + colorScheme: colorSchemeReducer } }); diff --git a/src/store/module/colorScheme.ts b/src/store/module/colorScheme.ts new file mode 100644 index 0000000..c2d7444 --- /dev/null +++ b/src/store/module/colorScheme.ts @@ -0,0 +1,26 @@ +import { createSlice } from '@reduxjs/toolkit'; +import type { PayloadAction } from '@reduxjs/toolkit'; + +export interface ColorScheme { + colorScheme: 'light' | 'dark'; +} + +const initialState: ColorScheme = { + colorScheme: 'light' +}; + +export const colorSchemeSlice = createSlice({ + name: 'colorScheme', + initialState, + reducers: { + setColorScheme(state, actions: PayloadAction) { + state.colorScheme = actions.payload; + + window.document.documentElement.className = actions.payload; + } + } +}); + +export const { setColorScheme } = colorSchemeSlice.actions; + +export default colorSchemeSlice.reducer; diff --git a/src/styles/preset.css b/src/styles/preset.css index 656a5f0..628d279 100644 --- a/src/styles/preset.css +++ b/src/styles/preset.css @@ -38,7 +38,7 @@ .mask { position: fixed; inset: 0; - z-index: 1; + z-index: var(--z-index-highest); background-color: hsla(0deg 100% 0% / 50%); backdrop-filter: blur(5px); opacity: 0; diff --git a/src/styles/theme.css b/src/styles/theme.css index 3244ab9..31c8322 100644 --- a/src/styles/theme.css +++ b/src/styles/theme.css @@ -1,11 +1,79 @@ -@media (prefers-color-scheme: light) { - :root { - --background-color: var(--color-white); - } +html.dark { + --color-primary: #409eff; + --color-primary-light-3: #3375b9; + --color-primary-light-5: #2a598a; + --color-primary-light-7: #213d5b; + --color-primary-light-8: #1d3043; + --color-primary-light-9: #18222c; + --color-primary-dark-2: #66b1ff; + --color-success: #67c23a; + --color-success-light-3: #4e8e2f; + --color-success-light-5: #3e6b27; + --color-success-light-7: #2d481f; + --color-success-light-8: #25371c; + --color-success-light-9: #1c2518; + --color-success-dark-2: #85ce61; + --color-warning: #e6a23c; + --color-warning-light-3: #a77730; + --color-warning-light-5: #7d5b28; + --color-warning-light-7: #533f20; + --color-warning-light-8: #3e301c; + --color-warning-light-9: #292218; + --color-warning-dark-2: #ebb563; + --color-danger: #f56c6c; + --color-danger-light-3: #b25252; + --color-danger-light-5: #854040; + --color-danger-light-7: #582e2e; + --color-danger-light-8: #412626; + --color-danger-light-9: #2b1d1d; + --color-danger-dark-2: #f78989; + --color-error: #f56c6c; + --color-error-light-3: #b25252; + --color-error-light-5: #854040; + --color-error-light-7: #582e2e; + --color-error-light-8: #412626; + --color-error-light-9: #2b1d1d; + --color-error-dark-2: #f78989; + --color-info: #909399; + --color-info-light-3: #6b6d71; + --color-info-light-5: #525457; + --color-info-light-7: #393a3c; + --color-info-light-8: #2d2d2f; + --color-info-light-9: #202121; + --color-info-dark-2: #a6a9ad; + --box-shadow: 0px 12px 32px 4px rgba(0 0 0 / 36%), + 0px 8px 20px rgba(0 0 0 / 72%); + --box-shadow-light: 0px 0px 12px rgba(0 0 0 / 72%); + --box-shadow-lighter: 0px 0px 6px rgba(0 0 0 / 72%); + --box-shadow-dark: 0px 16px 48px 16px rgba(0 0 0 / 72%), 0px 12px 32px #000, + 0px 8px 16px -8px #000; + --bg-color-page: #0a0a0a; + --bg-color: #141414; + --bg-color-overlay: #1d1e1f; + --text-color-primary: #e5eaf3; + --text-color-regular: #cfd3dc; + --text-color-secondary: #a3a6ad; + --text-color-placeholder: #8d9095; + --text-color-disabled: #6c6e72; + --border-color-darker: #636466; + --border-color-dark: #58585b; + --border-color: #4c4d4f; + --border-color-light: #414243; + --border-color-lighter: #363637; + --border-color-extra-light: #2b2b2c; + --fill-color-darker: #424243; + --fill-color-dark: #39393a; + --fill-color: #303030; + --fill-color-light: #262727; + --fill-color-lighter: #1d1d1d; + --fill-color-extra-light: #191919; + --fill-color-blank: transparent; + --mask-color: rgba(0 0 0 / 80%); + --mask-color-extra-light: rgba(0 0 0 / 30%); + + color-scheme: dark; } -@media (prefers-color-scheme: dark) { - :root { - --background-color: #303030; - } +.dark ::-webkit-scrollbar-thumb { + background-color: #fff3; } diff --git a/src/styles/variable.css b/src/styles/variable.css index 53a8682..95b4a4f 100644 --- a/src/styles/variable.css +++ b/src/styles/variable.css @@ -72,6 +72,7 @@ --box-shadow-lighter: 0px 0px 6px rgba(0 0 0 / 12%); --box-shadow-dark: 0px 16px 48px 16px rgba(0 0 0 / 8%), 0px 12px 32px rgba(0 0 0 / 12%), 0px 8px 16px -8px rgba(0 0 0 16%); + --text-color: var(--text-color-primary); --text-color-primary: #303133; --text-color-regular: #606266; --text-color-secondary: #909399; @@ -118,6 +119,11 @@ --overlay-color-lighter: rgba(0 0 0 / 50%); --mask-color: rgba(255 255 255 / 90%); --mask-color-extra-light: rgba(255 255 255 / 30%); + --z-index-slight: -1; + --z-index-normal: 1; + --z-index-useful: 2; + --z-index-important: 3; + --z-index-highest: 10; } @supports (width: stretch) { diff --git a/src/types/index.d.ts b/src/types/index.d.ts index d051a60..f2b00d3 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -19,6 +19,9 @@ declare interface ChildProps extends CommonProps { // eslint-disable-next-line @typescript-eslint/no-explicit-any declare type Fn = (...args: unknown[]) => any; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +declare type ComponentElement = (...args: any[]) => JSX.Element; + declare module '*.worker.ts' { // You need to change `Worker`, if you specified a different value for the `workerType` option class WebpackWorker extends Worker {