From 2827f852c088f2036f8eb85dfc87665b8e980c3b Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 26 Oct 2017 23:19:20 -0700 Subject: [PATCH 01/13] Theme: Windows 95 --- .../fonts/premillenium/MSSansSerif.ttf | Bin 0 -> 626300 bytes app/javascript/images/icon_about.png | Bin 0 -> 497 bytes app/javascript/images/icon_blocks.png | Bin 0 -> 356 bytes app/javascript/images/icon_home.png | Bin 0 -> 328 bytes app/javascript/images/icon_likes.png | Bin 0 -> 326 bytes app/javascript/images/icon_local.png | Bin 0 -> 599 bytes app/javascript/images/icon_logout.png | Bin 0 -> 383 bytes app/javascript/images/icon_mutes.png | Bin 0 -> 411 bytes app/javascript/images/icon_pin.png | Bin 0 -> 337 bytes app/javascript/images/icon_public.png | Bin 0 -> 688 bytes app/javascript/images/icon_settings.png | Bin 0 -> 639 bytes app/javascript/images/start.png | Bin 0 -> 263 bytes app/javascript/styles/win95.scss | 1457 +++++++++++++++++ config/themes.yml | 1 + 14 files changed, 1458 insertions(+) create mode 100644 app/javascript/fonts/premillenium/MSSansSerif.ttf create mode 100644 app/javascript/images/icon_about.png create mode 100644 app/javascript/images/icon_blocks.png create mode 100644 app/javascript/images/icon_home.png create mode 100644 app/javascript/images/icon_likes.png create mode 100644 app/javascript/images/icon_local.png create mode 100644 app/javascript/images/icon_logout.png create mode 100644 app/javascript/images/icon_mutes.png create mode 100644 app/javascript/images/icon_pin.png create mode 100644 app/javascript/images/icon_public.png create mode 100644 app/javascript/images/icon_settings.png create mode 100644 app/javascript/images/start.png create mode 100644 app/javascript/styles/win95.scss diff --git a/app/javascript/fonts/premillenium/MSSansSerif.ttf b/app/javascript/fonts/premillenium/MSSansSerif.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3afd76ff2db50db3019c7e19c5fdf2a166253bf2 GIT binary patch literal 626300 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≦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/CUP}V~H-TcLn~9Xu*%aXI?;j#{Ue+%N3-5UU z82C^0SAbvDe-3zEzXf<#{{vvFp$iRfa~s0K``jjQ%kTjA8i+f+(G5IgM1V()IPi2M z9e9S31fFSR0xv`!kg1>2^EmqjXmtYgtV<2kYn;&VK+iy7;Z4qGfe-Zz1^!OYJAn^_ z<}KE(iI>dQAQvJ7!uZ8zZG^CBnL-qx608%r&2`#bF{SRsd9y{`yqPb4LaYFn_QJT~ z1tL!fw%Wwk2DGX;$ulvNu#ax;c6bq>9CKgjiS}X(kMX|E((;ux9YZ$Ia59kwO z(_G@;ig0Kgavfpy;g{3^rKSOYDL%vzWr#Qd4>5EYMi}}TN|!;#!y+MS#Q-rxj1XhQ z1TjU-5VOU6u~;k@tHpY;S=5W&c;E1_I3`Ysb9kPYB=6yvYFa|tHu5V;^CpCi0BPQG z&Sjc+xUk`w<{b+@4fYb(K7r8Uw|^Bu*p~o(uy45bU1iHKID_cunE6XE9|F-(jSts0>m3JnJ^1`=?{Iu!B)hwEa%oepY6eY=wZ*zgz{ z83M_qk$14Y!x_wWgY$N_w>yK_u6G8)CXGDJ_6}zN+YQcBY;Sk^vt93?C1Q;{$@UJX zFWU{y6KrpHYT2%L(0Z{(s@dM*RI%OQRI**~l*1-XpcR6>!zp9C!6{{XyHmn;z4I*V z;%%e_2YFAgcb);<@faGJ1j(e453;?(L7Ro&4bBJH-tJ6byWSZOn>6w~+dG_bY&SUX zXM4LdmhE~6?H_Ao4BI=L=h)uvjApyu83mj2#(UV_;f!Rv!Fe~^+no_?*E_>ulSbaf z_6`SaCVn?K?__(sGnDOm=LL$t^C7^U&L6Qx-V3<>F*GtCl1U?f%=Qjv9@`DhXW8EF z%w@aYLF>yJnZtI2^J%uXJG0rYcj{nMY564EJDgc;H#nbQd%J@k0lwEeGhmZOKF0PA zXFA&r4tgP=Z+E7#UGGeVO&a+K+dG^oY&SR`W_!CcneBS#Q;2_q^Czs47g-}8e@u;h z5t4U8%WK(gaQ=?%?amsu>z&oGDR2BO+dG_9Y&ST6!}fM(CENAR3fQEPzhZlbvz+Y) z=P%jb?kr=w-dPHpH1avNcQ{MfZgBpB?d{HDw(Ffmut_6-#`X?pA=?ekpR&E(S-^I^ z^Vh7AF97av{+u=PdDaNpVscNdj)u6Q6`zgj-HZA?N0f=asCS2>J)7v97pDGi`VaLZ z&dVu+v!MOZ#a?pG0{ag0{lLXua?UVDeBXDmm*7v9C_#%k5cT?Kw3ky+tD^-M zE1VnP`FHqr#QCL*z2sbH>^q?S!o^;4(3ZI&`l*Y(rU$i?m#q89MT5WVVRFFDPOQHXx!VlO#Oz@(0T?qV-F*BB$8e&%8?Iah(n5dEi% zz2sbBjQC!0v6rZYHKrIdjJarGL&DU4q+QT{tX%}%)bh0gtyn{y$h{A0jk92cNCVXE zDjTB&?iYRlJwxijXh>7t{}mE4;JPrm7cbC%f5Gj! zTija=f_DV^1R;?WMWPzNO#eR!-I~DIr`xePjL~Q(B;w5Rem~L1`-$gy;F19I!`Thgg zujs4qWIOiVcI;F;_C3bj(E47%uj{_kMDtGq#P|jhzRx^_ooUB@z*x%NS^DLl4EPH_ z>SFU1cK5?}o`^_b{9>5Dg7kCD`(eQA%=I#Jk@WNJ*pJ$=3+>pC+p&x7*iYKAON@C$ z1gTRX%29d;h{3+&@bfq3uh{;T`5WKA;rC7aCi_?BP2W$+mG2nfZ+zbYyvZTD%(8Uh zF|U|c(RKfw*@h9GW?8~-c`T0zTRzJ#B38f(ikKC)(vX8FFY2(1Ac69R5E#D*3vTaP zrWLdj_+^+)<}WZZg=Fws;PH!MP-)DX%cIpij7O6q-}g6ohx=K)hW%|Z6x;!f)oxp} z{1~+&9RFqg*1999)@bX9g>f*b-?olgh=Dd${1d%MZPoId)Y(=)f3DTvdJ3;mm-x%9 zXRJZ=7Pa*bYl!u%HPm{iH4N`jKWUAy-ffMv-eZlj-s>M?Jx4E4Tc5G!`mV|Mo2>=b zpZXiDKeHBDe{L2n_niL;Z)pG8|24d#{ab6L^*7ck>u;^q))%Zb*56rc zeRtJ2b$!3X5O0(9C2OSCu_I$HEWOc zb!)Hn&(=QcU#$Jszgh>ZZ&(Md|6?7pzG)q{zJ-^$zw2w0akh?G|7IPx{@prZ{fBkZ z`YvAT#{1CL_x&Ec5RLb{0|vcOZ2jK4=l`Lz!PacuHf+!vRL9DceohSYluSgpx&APZDK8rWPbMQKNAzlVA#jD`%i{P9JeeoLj zQ~VORd@|*rWc)R>g$4lDK=>hN` z^dIsy`w#nC{7>Pn^WVF#Y1{rIzI*;}`&#`+eSh$OC-qJZT<#cZ2o4a*P8KCv)@KsV^&|QFSOLp>WA@6 ze`_FWzIQ-x9_Vc}%Fh^RFTvVNS_`ee7Foy{FNsQ|=(ojK>y&j$yx%%)ofhM)Gu98p z^Q_MopiiHeXb0_VG0o0{Za>4ir4}Nk+dRCy-d(p(;H~xkcxQbe-dM*A>sBN5`c9bn z52f3G1^+kv|Ht<$|2KWF`upQ0`CfFZyjbq)7CxTBi}I>&&*9bVo^-n#FJte+o7e~N z9`+%;h28NI_Obsby45rr^-mu9D5*B-gg7fMi6)FQ?{Qx#iLWK1Qr5Ws>zGTb_csB4 z)j>``4RQnccK^Eplm2%BCj989`!oFS0nF|$!SS%GU*YR^|1SaS{l5VGs(&P4(mxz9 z;U58*!SiC-sQpZTGk!}9wX2I^#>&NRwPUZgW4~_4e$$T8JQz!%*)A7L@dc1~-kwU? zROz9&$>Bf7G|*9*=#QLei-eYD3mG5ULJD8ip+}H2m4sC(BsoinbfzmMt;YWCv((GS*|Hn2f!JX>W zP#7_%!2Om1+@>H^eJ9Y){lfR}fKBYv6=0a{gP;G|j$LiX4!V45nZh*&!0_epFhL=5zlqe{8?(Q3n7I@Qoj(3_8GDix1oGTAC2bSXwRJJ$8ZqC zp$w-pT=1z+e(IBAF~j8yS91$3LyVRgzar={#?ekELbi)g@X*8%kB zj*HXcyts_g(<1I5NxfP`OKJsLtu|B}qfOOjYIC#&+G=et&5LU%v@_`SUeT^=HxUZ3 zuP;HkVNb1tHef$lFKx`T(rlilEoB{Qp18Ctv!sntJn2^Z`ATUA_e$G4P}+aCPTIaL z!UUuC&kN)n-BXK&4Mk}+%jEZ&cjR2$v%BORot^_a!ZBz8=T%MHEPrb!q-~T)d-!o_ zf50pAv~d-4_AAT_{L2oXhzyJDkCsO_#X|BsdR9}cJ(vch5@5$>#4ebmrO2M zQ*yNAPHA=N)Y5g#qoKDAIrtwbC1#aL`#l)L5WSQ%0DCNrCg{JfYmY-NNc{#!7Sa7k zrA*4fD6`bZrC88xq;CF)Nwbu382S(3`#EvEZ6N(J(OX6?1ot1V;(ss0tF3|7IYh(i z#=n^-&9mkY&2#2?^!5#K7onf4BlqS|+QL-2a!A@a#>sch!aN&nlARjy6uVzhlF&o_ z1Nyja=*3!AI{K+u-0!6EQ4VBlsM`@vioO0Jq!{F(Z%T2Ybrl`HqJ*L(X>ISdwjc+7 zh9LUhwfHs^E~zA=_fO-kwiT^d7is(3){%@8WE^$Y1p5PUMRWNyW}{L?^UkCvjO^Oh zwqeBM!kKNOL7j$ixrQ0$0CXEe%#;=g^oy*si> z5`x+-{VF7_AzUob{{?UhQS=Y#;{ZRUJprC;%zu?(tqU>2(>2EbK+ss$0nv*SmTh@0 z#|l|-${QG$9P)kBci8tWU!(7c@7uobVC+P>jYgV+>!PpfnC-zY%0HBT{rF1>AleqJ zcA?J17$+eFk8$!iujS)w$o#f>)clTl%sg)XyZK%7d**5LjQJz;qWKf^GUxUjF&KPt z_(OhmNPI1~J^T0?Ve}pJ9Yh$vmE&iDSsX_j6KHsk;2%6q*NGbjS2OxR)lhvMe_ofcN>WsWIR?>redwC4r?k4 zF#om;t14@-UbP8*-3F{!?Ze7SBg*JWl#5DxE=o$3`Fp^ZXdPGoiU)H!`Z{|kQ5ZHe z{3+3mY{vPk(a88|g2wk4Rx(9Oo5(WXBca^~(wMHbGUYTu?K0ypF`UnE5OHd)1Vt9+ zgf<)hWE?aO87~<}jqeyIjPDsQ8$U8G7(X^H8m|~vjh`9UjaQA|8ox8{8oxLGVEWP}L-1WQ3JBM73D>_uU-iFayqP)qtG<`%huGD8_ba)&#gyR;Co(K+os7``l6eM^ zD;3w7Q&O~6;@5UFC%39@7@AoQL&@n%U>@{>5Kfm~gqo=gZA2w%^IGwQcoH?>Q^<2q zqh=oteT_u98;!j8KJk8N?giBHAAtV8ApQZlZnyZF_&?&1K#C*AO@Lgdwp}6l=oyZ| z{LTXCJ^r{l*J9{(=4mBbrPfy)prKwhDp3Mbut0o*(tzPI^4nmjQ7+LW)SFw;W0FvQ z1%xYcrp->lb~sIoYpz2ot3biN_V&@2jhoLG*Yh^k^ zGoNq?jXx%wp^hHfAJMK8@gDJBv@XvfHEi)b>H|l782@STRoAcR7zcre$_jco_&PlW z^;)eN;TVY27~I}EuSH*fv)G0;**)k_9>S{ZajbWr#Vqb+#Nh@;%y&eqW@0`!q9wE( ztq60vwOW5|kTw+ax}&vm+C*)NHeH*Aw4Sdm(w1r~Fcw&+ZPd1C_1Z3s3Jz$8wWAmp zoYv0KTsU^hoCf?${ildmfFMfrOMpK$(67cwZF~IQ-YR`&+`m_48;u(FoK3ojapVyxk zZ-;wL|1bS_aF4+h`oaReBcb#qQO-&8fY7#tZMP{EBwb&pkAZ}Z$ZI39>i?$ZF^oQ& zv}Wy=b{E54TMy_lJ*nsEC3>aaS0A7cM!3FW9fn3Lt*-)JvbF$z-CBw=H;?FMmi0Bj zf!5yvewlDBm-z$y_46(TbnLYvPUbO3TeI2KSirT`2*3#z%AV1P{aBhgi#hjL`+$Fo za8CwPKF>1OGG4(U`G9c=t|WYh@h{R>qmpo~)%q^*FPar89?@nrLhB5TfQhk(c!l__ zuNo&(JVt*-<}%{ZKW@Gau$kzh#VQBq9}`_d>uHw%48s{rA4xbuj(VjN+`}RN7VBq* zu@w?jxRu?0ksw?_w+2(B1aNLhNpta2%)=o855=0?>Zsw=y!=JZ%j=QL2Z)Vmg`O7w zj2!(8>aYFCxd+i64c02ON-@M6@P@@uZ;7`LN&&S`7XfAabPzrn_=WP$J3#9l5@YvFne`SFo<~pXOEbXXZ8Y=e#Cz!)!M1V8_`%V9#04{dJ70dy@4g`0GV@ zJ3@+Zz6pNP$`fhmhO3j;Rl7a*l;7Z3_UPxEAIskIkdC}Ng>x@@2*}mctA3QcOEWcH zb4$;xQEFeuNK07f-J2-E7Pj6r(mEqL>sP+!WeRbHd&j7 zIq2EiJZ+)2L|d+{($;Dlw9VQ!ZKt+J+pitMtn_j1ly(;L(wDVs+6@hB5$H9Ux?hjz z2|Y(I(#!Q)y+3+YL-i5*Xnh=JtfuJHcK5eFn1Xs;2QKN_Hlp-KSKW5UrCSNRf0Y#d zG|OkGQqZGl4^?k&B^`Yd;%p-5;%Aw{P^C!RJj!2LzKZweOK)*k>GzLgZ(n8HdyBR1 ze(W?`K3I31C zyUW`4Ani90)N>d%Gll8eBEls!B&R|*nwYbIT@CMWB{}s&?Dle3y17ZAuv=peQzQ&9 zE+s2Is=lkZIl4odi%YjGO{J)~8*<6nn_myC6IVY{PB(36iUvBx{l2kwWpWrWXGCe# zUGwZCW_c*>2tG{SrS+OldAE&wy=}Mu=j2^|qP3oKEkSJ!!&^-85)^ltGKDF9JD^t0 z^pgxFzm%gumxnoBU*uOQhkZotLcU8V!*GBp>lmv1itny8rWggxc}RhEj4x3rQjX-2 zlDk96qe2;;H6%xqaqLAW_t%E}s)ku=`~I<(ns?Jh`p)5TQ$%W>p`zP|$-8p3rM=#5 zyFu}6-9_VKx87~|@7`w+$GNRw2rZ9AeqF%uBEy{urG;_HFX@U~x6M&0-Ff6!DOuv{ zS*CCa{*4OvwKq_9(;F!J7mp;Ha$*r&_LLJf?ALe{J?qG8 zwTev48uqXggz|{YDL+GQeQ-BtAx$%{J(L^i&%?Qq{`~x*{P_5Zx822<~Ni`x5sk$zk83x?W;X- z&r;_;?*03hQl`sO&Anc=7c2YC?BiR#ZMQ#tfVCvY0IaLtdfTpUAGf!C|J_Tpm#y7p!i_CP9w5yaPUGDz|4rry^;!BHeZIa(U#hRrS7X(4BW{1F*LUfA z^#l50{iuEdYuV@Yi&&R$!dmq${Vuv^HmzUlf8Z6zcUw69Z~4u4qh0&GxfbwSO#c}5 z7_knAeHG>nqG)d?=(_qAtto;6Xk8>u^Cyh^X(iA6JZaL(r2Q}EDZy)`1o{QMykdn~I_}6J&-uOCkVy*uY@EIgi`#!t<9?5}Be6>F7ekETTna-|^KQ``x za$jhV=P;izJ_$|^vkI|4h(h~zl9Pfg|9iAU0GvI;O9u9P8kd;Ug&Y!z%aDJaWwLzx zB*%0;Yw~*>yL-I%;2z7L!LX6xGKSBvv@cSuO~;&ouvN1()-6&5bZZ3V6R8bz9^qKW zoq+yRdZ+c#FN^J1>)(ML9dF0V=)a10iEoI*Sch-K{}}A(xGCO;+4Q);4lHf6c)uRi z)5JJET~8M;=$U$^n1DI)T=4-tU(XjG)JyeJF-fn`E5wI*H^gMDp+7A?tdG*)D?Xw> zr#~lNq*f9)pU_Cd#>nZ{v=0FLJ}9sFQDSL-`D5(1>bmns8>WrK&hzo)AMMM1Sg5`4 zQCvN&FK-;b_Gc7+eF-4l2)@I_`ul@#$U zC1rf;NIBm(Qo%Qk(D{qkTVfS*1?^7T2Xhdn5#|`oNtiP*=V30vT!py~(*koF<{p+c zF^{QX53`2W2>BIT)nN)?%3!Kt`oRo@83HpLW)#d=m%gqaO94`w0E5}4&M zt6`5&z#zy(Qbcz ziMWQi+|*VBpMa9vx7%*+*Lg1w#nR@I+zB30=m&te@YfcbaoQsS%JO#l7KwXum@*Vl zFhxrCSvx@S*`IEQ`|M4?zh^%~oSwdb(^>K=mLOfFaPmdqd?d*%>cCwJhup=lcYL)? z<|nt;Jzs`KL!N1b+q(hpdH$U7uL8O;@~l+wC4_qhF@@y!#Z6DeR*6+=m05jo)02A+ z+xmbt(fXh@+4?ZfoqWWaYE82~iv39EtshwztRJIS@DuA2?tHpp{ik)+x@P^tx^Ddn z_caClL4U{}#!XCf{GajvgMX8M^PA#FU*x+ZFtm^I6wFx|)LYnPD3Ip_b{Yz_OG4a% zX+_a9VX*p!Gg?B!?lTR$&$J?#a+q3}{xE}JhQf@184WWIW+KcKnCUR+pK5bp&_C7C zKgCHSp{;;f4YLkrBg__dtna19ELdxa{}fx%sH5g(2}si4D$$@l!shMCq~_` zuUPc8h2bl-TT1S(aw+RsLJRH721QDfP)hKS9J3YB$MBn0Ch+fB5kMTMvi%A2gb?A>+B;_fD=W=s5f|=Bw*Ft2Hc5y z<5?lke!R}L#cS;@P3`=n@Y>rDo9`1u$z8*cv@YyFBIsGdxU6~PSK!)AP8ngJ`I|Xx02rdtEa9rzxIMX1+jjCYBs<{45gNaGG{x~zHKA4+I5CMurSA= zG1Q}k>oKN0Z{u!**Zpp(*I(kZ|846Sp5hFCJ&|r zrV<8qt3Ci`Fw8KRkuYOm#=}g4nF=!lrVa+F>zY%jLITU>~V&5f=I$DLVND$_PL=R5Z>3 zj_|Y%G_Nq{9)^(C_FHp5;|Ceed;OsHf(c)`LxfZMB_TqkecQaPz*&p~>cdThN4v%F zc{76Xn@wx;RtPoZb99CwHImULX;X1VrB0iRleCMqW!g$@jkaFfq;1t2wB6c1oUCos zj%g=xw)VVsNxO>EwJq9h?VhgdUOlA8^(?(WFVm~_e)>Rt2=;N0(#Pr(^vU`(eWpHJ zpQkU>m*~s&Rr*?e17;<+;bx>g`hNWoPSPCLPw8j%3;JdKntnsSso%kEaHiomB1Xc< zF^Y_GqZYe|2N^?+5yog^oG}qM+)OuS8FP&J#v)^>vBFqwtTQ%Zex}~oW$ZN$7>9A1 z=Y(m^soMV~#f`nN!UfW}P|L zTwpFXmzgWgHRgJAleyJwFn62#%!6hlPT8GA>ORXkLqeHL?hnT^KSOOd<9Q5KR|=1t z^W;}Ab4sZ4Cz#H#?OTLPC<08EQ02FoE}=^AjsIQDFJTqq5~^-hytnYH^a#t5P<7iI z&T~;hLY1dC{i}XGtbWw6sd63!SHsgAu7de4@I2*u0^-RdF>BJV?4L;p~)G zRl1_jUgM&qkx=rO&x_&`Wk(`zDeJTyWe)}`}Bi) zqkc?3sh`o$>z6Rga$RrHZ|nCA9rtC1jJT0y6c}Yjwb9QQXbdri8>5V|#sp)sG0m81 z%r@p33ymela$}XT*4SWdHntf%jXlPGoP0cD95+rGXL087vT@D0VcazC7_Fvh`pt-$ zFmuczv)ru3jlqM=q2>s4v^mb4XihPwo3qS0=6nKDt`swoV;z;evgxnJ83_QKQIZ99LjG9QP(dw2%R5aLWP_VY3n;u>p} zC^SFeLY%q1i#qClH|qs)>)tr~d3(J50`7ADxIGhh?)|NQwf_sar#Xn3aP-OHhrr2g zf!TK<&?m?FZ4b_53Y_8AaEeC~>Tf<$e-mqyt7vA!M&A?bw7|7ngli`mKgsy54!X*Zbx`n&yUa6% zd8V)&Ri=VtwVdQvGyf6Bk95O(@k{l$lboR)GF6^l@iOAq%h+GVFYGm?uyNdVl}8Du z-oS1f?ia^i{Z;g!@?a+|{51-?$!uo74l#Wt<1&p@IVw+YbT!Nmf~#_R!_|DUhQg+; z>8ejPjt`PgI;E+ib4|rLjbz%X^0f!a18SN+Mp|RlAMq8(IbEb4u5;XFIJvyI`6q|z zN!Cx2@okK6>x!%SO~D_$zZt#XJuP^5;lFUl3*8@&d1Tyk@Syt~1a6EFIEgB722~SV zVAoSk?C$jBz6arLw>v0po0xKi;R=_&1w764ibHp|E=ATOTe*)c=*+S^k1$xgRj)td zJOWPIqs4S#4&w~9HH1spiO0)43~7A@*okuy@d)k*)BGOQsq9J(PcJxn zxa5}p&`NZ`PT^GDa!4enuEbHNJgebOdV)&4I?+$_R|zG*gx%zKk8dYRFZ@OU$#>x# z#u@5|*k1`TUx^ShRQWscsPa{}YM37cSLO7ED>{6=^2y`mjb8IWU(#C->HZjLt%g(0 zOP%ttq962~DGaiVEF#>^^9tTezJ2g|{ZURkXCf?^3rD|Opx-Uf?-qhaLd#%Q!mNQ= z53>noD?;4>vm0g~e$xoC5#|`oNtiRBpND-3<|=SnhiQSqY%oUT7@>B8SqkM{9XRf! zAx=qQ9!Mj7^#K%CkA7Us)Pnulhi(JJm8r z>(a;*V+nRDbG_A73jM8iL$)4owHq?`zSVB@bSuki-0<=ywHug!LTi9qGYMW}c#+{5 zhFciELJ<4fh)41>kM?%1kCt?Wv?~t$XM2V^^V2>W@B|ogT|>KLKw;c7+cN_1ztQgN z=j1(J|9_uZHv41ZR=gju8*c?1 zv>L5rcmv=Jz14@ETGy=>>$Y_dH~xF=5bpHPvJ31oyV~w&544Ba!|hRcsc(Wk883g# zv}fD%?1lCcd%3;JUTbf#H{09no%SAkzkSF)Vjs6p*=Oww_GSB;eZ#(K-?3XgrpNDz zcoLo*Pm!nGQ|sxE_Dg9gTwHC}ZgDQ4UXeR0(x~U7>32GyY>&Fjp&gZQ#n9~!s&cq* z*xglkikmlwvb1W3)N|8Z`Vq#vLE0&SaH_C-OuJFUY;xtcv(m4jEMG#VbPr*7irYqW zsNAn*Bu7`_A*M95e5vPdP>z1wu^PKI62vbd?tCMeawMn1Zt?0K!qi(R6tKvcviRvC57tQ@xa( z9!knG(%3_k6q!G}#l5>^SN{s}mk6U?b~Aq8g1L*lg!}{w^*tU9 z?u0uHr#HGl!F1V9xUhwI+?Ip+Iqc-`VfI~yqzgn_I7{gE8T3`MaewVX+-Z6V$5V=M zU(^iTO}Z1is9LdGYM4G9JE9tJKI;Zn@cUwC(>!B6b}wDPnHv-L3U|4m-BV{T$9btb zjOcL-tUVNPJ>fc=4eQW(+Zw>g(MpV zglki1x2{%=8)WJJPCA{9R~wCG;Gn${4*s#+&8BiB>9~v&I=Ke={arTo z>{1)`nl4>Gu~+>O{p{-U!TrSU|CFB`e{l_3e6V;)0#PQak@goY%oJG{q4nPK(Ea20R%$$GPVXr-I_b7+zHBdDU0in00o`1tN>>+` z-E%t5ccgMOm)wW&v#ZMo_p?jMeF#6hx_n?iyVqPOe^hgI(NK5Yc5~U(v&-(f?dI}9 zOLS8=m-mmS#V?-=_qB6+rQFXilRNzOcqVEnhhJ&O-8Fch-R76sv-nN+Y@E!wCW`1( zjwt8XJ1Y4t^%{O5y&s*+5l`X8^UZt*JGH~YZHEQgVL@#oHG`TB6F`fBz6SMG_?G(; z*p)DSVXy;58;tM6U`7HT0|U)#lVGO8%mBR(_FR|+FpFW9!63b9MpMH~xV8yqD@+5- zZkT;A2VolF_89DwFlS)SfXAnoG>(<|=coxxw6Q zZo@vyJ?4J%5c-EaLDb{prmNmzkkJlBKS}X8=;yP=iwFU1Y?!p_02k_qEQM_$<+B%1J?uyl9HCwl= zyLb!F#;b)fyik~Dm)MndUweQ(*dAt&w8vl%)g*hWJ;ScE=h_SG#r86LrM<>pZ*Q`< z+70$@d!K#KZnTftC+#!#dHa%m)xK`G*thL_9^K>hggkLimZ!i|=Bf7d!>QIGp5dNR zp0S<@p2?nRo|%}xn&(;QS>jplS>;*l+2Gmi+2+~l+2h&oIpjIwIqo^-IqSLLx$L>- zx#79#x#MZ|nqI#*;!SvSyhYw}Z>_h#caV3ecZ7Gecbs>kcZzqqcb0dKcfNO#cd2)U zceQt&ccXWUx8A$UyVrZbd)Rx_d%}C#d(L~&d&S%2ZT8;s-u2-SqA%c!`I5doUx}~M z*Vi||H`q7KH_|u8H{LhNH`O=8SLd7STi{#lTjpEoTjN{r+vMBoYw+#%?ZZ8)jlN^P zlfE;2+tXFNuh@dO6z}2vLoZJB#qmyKfxpaOjdueF;uW{y{!#w1{t5oc{%QW1{@MO{ z{)PS}{^i)Aw${G^HOn^tPX8YNe*Yo=5&v<#^mo>O!GGD0m+$;H{dfGWj_LTFh?8(~ zoFb>(sdf50gPftx2xqi2&Y9>;ai%-7oH@>XXOXkiS>dd9*5TIYEl$0&3-2r*z#D)^ zofFP!=bUrVx#BcA&CV_7Za@U=Kp+qcBm;SYl0apkZ(u-Ra9~(qWME8Sd|*;wYG6j7 zE-*K+Ah0;FEU+@LCa^xRDX=xr5ZE2q7dRMb3>*ub44es^4_pdd4O|bj1a1fJ1@)je z7z)ONS;2x}S+F|TFE}tbBse@cDmXScAvifWEjTkcJ2)@6Ft{YRJh&>jHn<_UIk+vj zGq@+XKX@p3BzQb{DtI<{A$U1>EqEh%Gk7Q18ZtxvP$ZNH<%Eht<)PY8|Inb&(9np` z=+L;(#L$$`^w6x(oY4HxqR`UNiqPuNy3oeZmQa0YS7>kOKE1;*EqN@kmyrAW{~o zj`WKRj0}kkkBo|pjZBD4j!cWpjLeSAi!6*Ri7bz-imZ)nh-{8*i|mZ-iR_OYiX4d? zkDQ8}ja-Oaj$Dh}h}?|aiL^$|s6QHsCZajfBD``|8|@z*6df8J5gi>J7o8ZL5}h8M z6`d2EAH^PIjB8NMKN`fT7`S~zIFQ{w8q8w1Z$7-i{yq|P=g*o+!o%Xm4082o5MxzJ zBMB1{l;P%Iu8?H~7KdHw(6&CBF!&Gn5a8(`zwi7Q>lIj|MxH zUw#X;6Q!4u>+;;cc9m{>;c-_g8ad=#Z@4S)7l=Z)mH=+J_FZRO^;UBDLQ{>-I9;yz{mFYG4gY#a`BMiHySzaj|9zGgP`TgAP&LAA-Vlj$7M2B#xJo;g`BA=fQE@sRp-?2K6SR5^cV5^ z+h{2<%P~gOV*kci@dRc&rii}$p6pZp1$YI00Nz4hirGHAM}t#k?*sQZdm<+IUbJW8 zycOZ`G>PsYHEhnWQWRG1lfN1Ix+xp2DxbE}K7`m_wE$yN$mtifqB%;AYm*avzR zw$?V4;fij!q^R(JGY{7Rn3d{qEAh3;*Q11Im1S-QtQG;I-&^xIZ_VSpHIMT@YaS=M zG`b?XI=U{pF}fvMAKew*8$A#`96cI65j`C}7rhw05^ah$M{h;%#zf4H1!A#SGL{!B ziB-n>#sT|P$0o(5#%9FoVsm2)VvA$TVk={7V(Vj@Vq0SkvE8wKv4gS3 z*s<8j*qPY**rnLj*!5UT>~`#4nx5uO3#G-=veF9D%F?RS`lSs_8UE+McxiX@}B|q#aK?m3B7mLfYlDYiT#q zZl>KyYmJ+6e>@UT#B<_B@$z_WynlR9d}w?`d~|$Vd}4e`e0qFVd`^6Rd{KO9d_{b9 zd|iBFd`rAOzAL^rejt80el&g}emZ_GeldO}-V|?+--_Q&7wL9-AU&3zOwUU%Nv}-r zn?4|YaQd+Hk?CX7$EQz9pPD`+y)J!j`hxVu>C4hrrmsm~pS~%5YkEWa?(}`>2h$tV zkENeXKa+kw{ZjhX^y}#@>9^DGCG>4PRN{`IW2Q$ z=IqRQnF}+QWG>HK)!thiN3D->f?*{=+}i_)lNdzjnI}o1JLRa)!aUr5$*;I~nOtpR zer_dQw~U+Tna(2{eH!Dt2`v+a*o7c{b-}u)pnBRjyvV( zvlr-LEg9p;mDFB$DD~MLqE|`2DEc&5lf6RLr_l{ceY$BOzb<2K+!tbB1vIR$y|a9;xboA-O}x?DLt#W*h#*N z*#uR7lY621d`dxCT4lMA@)2e#HC#qyXx&nj+8>cdF}Tts?8aZaD8F zbk{44s~krjX}Pm>DlS8KiT#qCGFLOjq!Ze1O=!@mHck6artnu;%OOWmi95jI=RAOY zb>Nh-aC4(cu5i;jNt;a2%_odoJNfG-{<@H)skN3&ck3F_&3g80qm;muO>LvWzluT+T%}|&boE;{}6KP&QEY2kYSUpgYO3M z`?3gn?hv#O5X6o{%2C4!dbqB$iwHM=!BEb=aQM~oC^g{bc_p;6wv@SD*1Emb9;&vH zd#SwNVr{56mund|S>C(HLX~fSjbbF@+o{YdvFKFO?jio}wW3=iU8Jun-YM2fNq0*w z^Q(Aor3~d4_bF;K86KcDB5gOX6v^;#o;O!;{*kkc0SbvbJKoHA8Nu#x(YeM`!zoLp z%rn|X(y*Mlr2RP1756S=Z^!s+CB;v$FS5klV_fE_i4;!wLeR@}IY+`h3K?G+D!1n6 zc2=#itrm{gVusw0l4VT|r-8jMNEca(d6hs?^!e=L1^&8=;v!o*nd@BraG3RD%qigx z#(zmr8_#)+ds(uza?8tnrZc}G%Q&Zk(VxQU))Lhu!Nmu#v?m!>linZ=oU*R4xX!Vb z65VZ!&oVxe_>BOy0=T&WxLgm^%jhfZq-uxfC_HX&f#s|I8h=5YZmbUxF76V)jGeZK z<;Sb`?=NC~J1KruLn$aFMzF@;?jBN^X7CC*r_z_V@iCdD#p zUtDb$P`*N&asZUQ^4>1i{8pxLsc~zJMh-KVS+~t?64?8Oc4`4&m~^f;a~|N{zT0z_ zEw3yW_i!F6mABu`{9JFNb;Bsk*iZ5$uJ`41>7}N1Yl&Ut%I(WN!zs@E@E2(+d;2mS z)!N>5%i(cx>91Ogs`#%dRQfTJ&->|9rN$(>%n53%_ zrcGgOtfY`@CP7)d${g4m-l?_PMDnE$k#i_5q;79;7{-uHwZuIL?&|Oig;Q!$<~_B~ zDRJ#d;!$x~KY$-0QTw81g!8~S&NJLUar2>qt2}C7RQ6y|UyH((h1A zb&fA^(!+BM6?(5Ntn8QGVvTJkU(mY%RQs+EfsZCRZW?i^QE|29a!2~zdb~1@`g9Ke zmk7$*2Ks?ycZ9Nxa5o?J)?@j9MVIABDW~0gO>PBxE>_Wt2~b*M|F!jjl#qAOmBJbLFlR+HUH=`uk!prC%VkfOgEn9-1r`XvObi0 zlejG1vi!<%hwSO;VdkIQp2u{&1X?2Af#1W$heek7ocP~3S@idK8|b~_8`__WS=yg# zOSCHOFSY-rJwdMmX+yQI;MVDPYA@l&=?`i@#*NdT(O$)^)1T9RqtDSkZ(s35bj|ZF z&n3OD=d$-1{iJW6Z=O*`D_TY$+PP|!`@Zb^vhjp(n{S)Z7yCok8BZdmHJ#q7#PSy4 z;I^L&Eqi#@DWPYt6aj6Hb;LSuow6?Dy^1?lt8LnTJI5}v%k5fws6E0SO>1KI6nnZo z%bsJ;w-?z3 z>FMhk;2Dg!Zbo{>c*c7sd8T@1cc2&w0-!PmAZa*Xs>=3%q6Cf!-nB;oec+vEB*Z$=+$+ncmsndESNICEn%URo=DU z4c^V(ZQh;UJ>LD^L*66aGS&{zJ#ybSL^HV8{`}6 z8{wPio8p`9o8_D1o9|oUTkYH8tM?u79rhjdoxp3a=X@7^SA0#rX5TH}UBB?#c+Vr| zPx|xxCH_i(U;hCAVE-`xNdFlBc)SKX)jtDki;Mkh{Oj?~$5wxXf46_1|DeCof6RZ< zf5v~_f60H7+kcSbp5oe9oNXSOrXS?DZr zmOu19-#2rQ?}P5|?P+iCMC|KT_w+V|c83~6$3iDVXF}&gmqJ%V*F!C#+o5}5J?ssK z!trocxFB2>t`7GL4-5|p4-bzDPYzED&kWBF&kHXMF9|OXuL`dXZwPM=Zwv1X9||7{ z9}k}jUk+aj-w59f-wC%y%!oe{i6kO9k)lX>q&Ct&GAJ@MG9ofMGA=SPG9@xSGAlAC zGC#5=vYz+ro{pT0G)0;tw<33=B5Fqi(O5JY&5M>qE2G1sqoQM@6QYx&)1ot@v!nB( z3!|%|YoptuJ8>f5Nc4F0RP=20Li9%TX7o<9HD<>Au}CZt%ZU}m%44;${;@%^p|KIM z(Xnx{iLoiM>9JX{IkEY%MX{x^6|vQ^b+L`HEwTF8uGrq#f!N{L(b$RD>Dam0#n_ct zQ>;05D|R<6kQPfzrsbveO&gFlIBi(k$h0wOYcR=hgiFFr6nBtASoDn2$oAwD@iEj}|o zJ3cSIFuo+dJiaQvHohUgIle8vGrlLjKYl2FBz`=8DtE-FQ=|j^;q>oM?mp(ClO8WHlS?P1q=cg}9U)sJdb3FZ2dQ*CH`mOZ4i9jNjC`nW% z1}BCk#wR8vrY2@2>JoDk3lfVH%MvRSYZB`dn-W_S4T;@}eTjpK#>BD2$;6q&`NXBf z)x`BgOX7CoUWT3#&&bNC&ghphFk?u@@QhIzlQX7e%*>dbF)w3b#;T098QU^;W*o{m zl5sZULdNBcYZ*5(Zf4xcXib_)e=?FxBy*BQ$?{}vvVU?=a%gfya&&TBa$<5ya(Z%B za!zu7a#3<=az%1=a!ay4c_4W>c{F(B=~>>aP*y=! zS=PX;Az8z-MrDo7nvgX)Yg*RKtl3%fvKD47$y%PZDr;@lhOEt5+p>0M?aA7obqKwi zHP}Zg&%heum!2Hd^y>N4U-IeG-*r7VCtBznB<`|oA;{;v=zXV@TWtyTm0Cb2`NTtK zYz=+`stXUv!5xtlhAD*OZcXruyKPIDj`O*CnacyZ#NjVSLfTxG-x(*rm<~B4v${j3 z#Nn3c6lMy4J1)bZml53!5A#UepmSv|opD2~?;2n22zYvcsIH*-J%V2Xg2nvK!`V3P0iw{XmDruf$O~?@Z}J^4D~@ZTB~& z6Qoy<>5kKY-RN|VnNA6I%>#7qx7Tz>*xL2b3GXr>Gm&4OjzJfm8{Px;B25t~m^w7wDQCg((B&A(DJ_P#dfuGU^Jfxpg z9+qM5g`f4`gPi-&DefJ4OwA{+AKotC&7Vq{lKH`s z%A;Sz2)PLf52d;6w;--~?i=AD0y3{?SCn`@pbzw)_MP-HR0O^+bS@&)| ziu9yegIn0`2uM0f#f5NHCu*5i^H*=>06ZP>8rojp_o`1RM;z~{^V;i0=nXTNv^K!? zWoMl7uN#I`JxckVaW@R9dXew_VhvzLhqzy-ZM=q{_jF6s}F7*RIf}QeIHv zt>UTVW%uTdM>txavAG!fTGmwbQ5{cwaw=11`Ngd@Lnjk_#=GCwl@AUvsZ z;N}I)B*9;|kh_21;ncf>e)`HRIsk#E*wa%rskkWa1FX{Z6->EJ_eOcGtJ=e4B zzNhw>(}MH0yPCuGsJJW3HyJ#jamUjK7wjRF6y>IeJ;mW)^{%5ic>yv=?HUsUEhJr_Kf=8)Hmk*;_}Bpk?pc9iz=RK16Yph zmTO;rdP4T$ zId1^(G0(U>oM&8|-O74}>jbW2T)nCN%-5{zI9#&NNNv?))teMH?FiZsS>CDsp;c<7 zE#mw;$%FHPQ=fiIk>2_bGa#cd9d$wywv#L4KvmAoZnEIKuO0 z=)Yahsdm9l3zg3Gj7wK>m8Z9I-L-C4+5)#P(78UpZ(2ZCJ(f+D< zDs(nA_J|L~yj(C~=x=C5vhyJjVy>Pjx39;S}Tm-iMMuJFYKQ_sMj^a73r(f*QIYv-;!RRzAJri`hoPr=||H~ zq@PYdmwqw*O8YvZNZ7oVm`vpHdSc(i0A5oZnHcj}>x$lt5U(v3WR!JUUmTk;q0<`U zl8oiN&bT3CGp{x7$=J{9jmI-iJ@%U8y5vS)ciffS+rIXAI(d%QADfcRy{3kUo;@pj zPWJrlMcGTUS7fiwUYETwdrNkG_O9%`*$1)@XCKWzk$pP*T=vE6E7?ui&DpoI@8*ac zJ13A6%SqwRQ$eo-!Eq7+_?A&>|3v-v`F3(++yEb=2?&jQWxjS?B?FXvv%y^(t}_fBqWo|)&*i{vHpa`KAu%JXXT`sWSG8=5yFZ*<Xn5GsflWEB(? zloeDL^eY%xFr;93!Ki|<1rrJ;7fdUdSund`UcthGB?Ze1Ru!x**if*!U|Ye?f;|QM z3l0?=DL7tms^DzFg@Vfk*9vYF+$^|L&{}8~`U@k4iNc)1qQdgR+QR;Yg9?Whjwl>m zIIeJF;grJZg|iCh6wWVPRJgQoMd9kgb%h%Xw-nYF?ke0{c%blb;nBhqg{KS86<#d7 zQrJ}3TzISSZjmUmivmTlqGVBCQAtr{QQx8gMT3im6^$$!Q#8J4Qqk0+8AWwPbBh)f zEiPJCw6bVT(fXoIMO%v+igp+6D>_)zSahuDWYL+T^F^16t`=P{YAL#1bgx)1_7;bV z)y4ga2Nn-09$q}Ecx>^6;>pF+if0zjE}mDsuy{%F^5Rv+Yl}A&Z!X?e zyt8;u@&4jN#Yc*d7oRFVTYRDTa`Cm|8^t$^?-aL|m?i#_NJ*k3r=+N)yrj0If61Vd zp(P_qMwg5$nOHKVWO~W0k~t;wOBR(ZEm={rx@29+#*!^1^(DJX_LdwdIb3qIX{l zUFqD?1*MBimzAz8T~oTgbW`cp(uUIArTa<`mNu3iD?M3yru2O2rP8aV*GpSUZizp{a4L&}DijVc>kHlb{C*|f5mWwXoXl`Sk=QntKoRoU9I z4P~3lww3KH+f%l`>`>W}vg2i^%FdQuD7##Ct?WkG&9XaXt$oZs{yvdDi9R`fiu#oI zsqNFh&!9d-`;6!_y3e>i6Z=f*GriBOK6Coa@3W}S(mpHttnRa}&&EDm`qcN?)n{*? z1APwnIojt$pVNKL^|{#RN}r}a&3$h5xmzyE?eai*tUOtsS6)(HS>CsNK>6VEVdW#s z$CQsRpHx1zd`5X)`P}ja<%`Rgm9H#cQ@*}@Q~B2NhVtFz`^pcNHC zGE$kS%&9D@EU&Ds>|Z&ka%km<%F&hMDkoM>shnOpt8z}|{K`d@ODk7YuC82Hxv_Ff zWqswY%Dt5bDi2p4tvpeAy7FA*#mXy{O_j}+w<_;ei7LA)P!+36R^?TdR8>~>tr}1@ zxN2C{$f_|_T~=LP-LHCJ^^oe})uXD%R!^v&Ts^IN zX7%jqdDRQ6msBsWURAxedPDW*>TT6KtM^pzuRc_Lr22UEsp_-U7pgB;U#q@ReY5&b zb!&}TGGSnbH#F}34sC)G}^ol#p?JGXX0?c&;HwJU4a)UL1HRJ*mdp>}uezS@Je zjkU*WPu8BPJzsmN_G<0*+LqeewfCOTpYT2rdLsTr))NI!ls!@XM878nJ~8Bp;s2Mt zcY%-kI_|}PuYGEP)#|l+uU0E*_1;~*g&w=B1tfy8A_S2M#sXuEDIpju6cb7oSrC~} zA_ygzOR>O&O9>@}66$a%kqIS~5=;oCzJy?fQc5ugLPzrI}oB!u; zo1Zj0J7>q>IjT~1eltJqcP^18;m zCb^niEv}iaIj;GxMXn{T<*s&Dr)!;Sqic(++qKKJ*LA@4w(F?txa*Ybtm}g7lIx1= zy6cwfj_bZ#aBJNrx5aIBr??&N9Jk9|>aKG8-SzIt?q>INcdL7@dx3kgd#QVcyTiT4 z-R0io-s;}r-tFG!KIlH|?s1=RpLU;fzvsT}zUsc=?sMODKk!H%y=Sy1+LPe1c``kD z9*?KoQ{xGECVCn@(>yagvpw@X3q5U~WuBmCwP&qogJ-j6n`ftIk7vK%Jm&*RV%hdHl*L_0Yjc|7^HBhfsbpM=(rV8fH@BgEcFF{4Wk#bns{KA|2yZXbsp$)5jbd@lCFY~c8O9P%c)y;M&#yaS zH3JtX{CdjU^H_X-UW}AaJ^`PvVfa`Li^j&2Fjy#2htQXnKF9}3ah3n5y=VWMz; zY3(5yZC8lq{SCvA)1&or@|;f1(hz^dSmLnaZI*3ZTTahNeC=pXp3@mNro7E>hvc;r zLv&cYalVAb9ygBs{FVPIq=)xKSrFnIzZjwooL_n_=Jl;18QwPe`4FFP3xCCAC}y;} z5FLg&zrJw$N`6flDW8v&mw4a9aywV+j-+!WewfW%P8dmkBtDP1d?JJi@9*P`#Yp<~ z+&J=mjf7R0U))&yq4@mz!uvQ9e_Q1>3p2CwCzlF@2Hw6dF{`J6n$I`yREG9qr%xPG~KmR|_*wT2Ka2SYSJj_|4Ep*haeyq#f~ zaD9!0bJ%*#%l~btFJ5M(zQXvtzg(R2dU(IIBG(ru&-)Stk=8PPP3PC&uzvX%-o@!Z{%D%->yywtK72heNW=41;vkKd z@VN19d0%*%uO&vpe?oTE8>!p4hh%Z~-$miIBN?FcsOxwQcP zTH6pl`ne%GY(8=}XcvcMcs%)jHFH8TVK{Sm^5ey~4a>1y9^=>F$2n)_a~o{t}1=CSxA`Nijd z-mfQ>A4$*u7x_m+xq=^;5pjM}c^+pDAAYPKhaM?@9*57@`6J46>)K<<^Xm&2Km6W= zKWF~5`A?b$!s;dN4E)pPYx+irw~_MI6Y}N%Cw(S=_DP@5KI!w>Cw)Hqq|axc z^!X$Fq))f@H?YrntN$tZq|Y!K{u;|8`OGpj9fwV2gJ__@l~7e6Q8&9)-ai2ehs%@cLepo--?>?C>)04qf9_~ zDGmDyqZ2rOIY+-1qUA!Qh5w|s(?WcOlb3Qy=AThUswDb{B+to+zb5`#K>T}Z<>mm$u{NQm`t{|aTKCB#oAx`pGvg*rvXf05%84d3jGZIg&UKs4!8@-udujcIzK=@t5pX1KOMKnGqdiIj@^zGB z%kdHKuD*j}Ty3Y1-@|?}AMuNP7@lW%JwH5oxhMUCSh_w7J>KAFOHD!bk z8(-${-;jPb@0dJ`6DH5_d6D$wkRFOX_{0bHOMDjREcP_Zfq zp^gRN%=iSXO{(nDjx?xrwI03XoL zavk7|_OrO1Ml{PaZy^nTeGf4&CwYn!?P8=^{@0Md@`ofteyL-6pJW(5M?>;3udy#0 zFQ}7|W;T<*BAYMYLq4NneLCdoV`5l@IOy(7B7wBYTcZO*4MeabF ztr42<5ue6F{yy<1q8`oB5Fei6fNz6U_a^bgr}5R663ueOPl+b`0Ta+Ke+Bhuvyg_r zT!K1TU(^U*7Q<;YU(Dp!0`lt+(nctv$?`M-NCMzT{!_{%p?CyzrIR$RT! z@7Kco9bt?VelN!PI}%^YCaj{#N0Iy$h@MFN45F>XXE|yF+(yDvGoSGM0qOY%(lZC? zF#c)c&n5l{F%yQ*zmYuct&~GZOJ5}YS;VKkjC_e`n!j=d(OZYRyBESB*W|(}|SF)N=rmmwQmBy2oUDF|I9d8NNxM^FO>i%H_MJ&tk;MkB5gH@vXJ;Ck z_7Kh201BP;NmQFjvrz{AQa0LYA=_R@TKQ*c`zJ(m>j=M3lzi0IMlzJE**;5}O8gw; z%hZ=RtPYW9kjy@kxj^&>NNY2YmZ|=f2ouqce92BSR0k@5i!@t{m9s<>h6;_B)Qa+9 z{_Z51Cep+CtN8)(X+2da&$D$z(jZ@y$et@m%P*78zashOhxPNAC<{rZ3}xhM(zA`^ zy~HQ1WLoz{%E@8)9447(NuH;FMf^p?r?`?>oO77VZ&P2FP)0iiX*nBdz9#2o_;FXb zzGSWzRnG~T{rrBPo#Q=%Pj)^5pK3NHpFnL{KH>G3^L$SKr^4s#VRLG@Jz;##p2y<< z*ZSo`lu^%TcpO;WGTffW!h!3zoM=@KXa8g9QP(x9d)YlKkRBb7;jsH+tY76v-zBO$)Fi`u@AGFsZRv$H!mKZH5L?q#U*=SilS z_!PtHInpqGSl$S;lYC+MWF-EluuiG>?uU)L`aA=xd%1r3v5?lF&8!Y*wV!$}%J%+h zJdO^Ve;xdg5mt}gfru_^L(cNW9n6ekN$kNEFNPlE~TMk){SdLjvTFzL`TP|99E!QkJEw?TA zEd5bRlrhR26&sZlWsh=36+{(BRYrNE#z#$xYKm%!ni(}GYJSwBs3lR$quQf7qt-=j zjM@^_9knZJZ`6UPx1)|m9gjK{bvEik)TO8^QP-nxMcs+IA1y>{qfOD4Xlryzv?Dqv z+7(?IT@~$*u8*D^-5fnVx;1)k^n&Qc(MzLOM0Z55iSCNt6umWiNA&LKebEP_4@dVz zpNKvkeJ=XF=*!Vpqi;m_Mc<8n5F^FtV@AhB$0WqqVlrd$VmvYBF*PxPn29lsG1FpZ z#LSMF7qc*?EoNCvFlKek+L#S7n`5@c?2OqHvp?og%#oO5F(+fr#GH@07}FbbE#_v- z?U;Kp{jo}{G1eR#8=Dksk9Ect#1_X^#(HDN$4-iEifxIV89OI-e(a*yC9%t6+haRp z*Trs(-4fd!yDN5Y?19*~V~@rjk3AK8Hugg7rPwR6*JE$R-if^*C&X#vOmUVtYg|g4 zBQ7V-6;~Qp73YtukDDCV95+3#HEwR)g1E(TOXF6=b;PZS>x$bHw>54@-0rx2aR=iL z$MwXWh&vs3F7Ca!%W+rZZp8J)-Hm%-m8^Q}Xlt}J!D_Q+TJx+PYq_`2(1urJ|Y!r_FT zgcAv;6V4^PmvA}ZYQl|#zJ$984-%zBed6fE=){CXTViHnUZN+lJh3J*kT@~1F>zYr zjKtZA^AZ;(wk0l03?{BlT${KdadYCf#GQ$I689$_N<5NyEb(OGnZ)yn7ZZCEuO;40 zyq$P2u|G*kGA5amVv~}R>`Bg~f~4Z4$|P^n_@qfmO-U_DGn3{d%}-jCv?OVHQhQQo z(z>LLNn4V-lXfNTO*)YDcGA(L<4LEI&L&+*x|DP!>3Y(wq&rFXlZ9k$vMJe;Y)wu{ zb|mK{yOK+jtCIc6^~sZyo0F#}w;Be1BWsi#uUrd~+BlzJugdg`szJE`|=f=z2P*(^4z zEyd=r<=9-dQd^bHZ>zUWwl&+P+gfdNZ3}FRZA)z{Y#p{Wwl3Qy+g95S+iu%F+dNj?LFIN+f~~QTc7Q&?LnH9rcWE47M+%mW=qRV%S-d5m8aFD1=1#_HKt8V zn~^pymbNo(Pul*pLup6Sj-{PUJCk-k?P6MQ+O@Qs zX}8nvrS;ntyU}j8$J&$ZcDvJFU@x{;+P(Ji_DS|8dy9RheU5#;eUW{MeYw5e-f3TF z-)P@r@3!x<@3kMWzimHiKW;x|KWo2Wzhu8+ziz)}zhl3jE~IPIP3e|&YkEq$BRwbG zm0p@&mF`ckPoJFLoIX9hHGOXSg7n4dOVd}RcciaL?@Hg4zBPSE`tJ07=?Bvfr}w0v zNI#u^F8#gq%js9sZ>0C7-%WqukQ{o)Xh*ao!C`Y`I`SMIN4cZM5pYa&G&-g^W;kX$ z<~bHR+8oOqLC0#xTE_;*X2&+iPRAa{e#arl5yvsdNyiz-dB;UZuj88IrsKBbo})iQ z$uMS^Gh#E6GVB@7jDn2fjLHme#`ug$8BG~288b8HWX#W4l(8gZc}9CiXU4jWjTu`q zx-)iV?9Dik@pi`1jN=)nGR|gP$heeoCF6R=t&BSv_cMh|ZKf&Hl4;FM$#i7qWV$j- zGpjQFne~~IGn+G~XSQa}&0LVVICE*{ip-A8HJM$Rn=-d%?#SGoxi9lz=Hbkq%oCZX zGtXtdmw7q!YUYj1zRbIs53-~zeb(r#=&Xb+TUKUPUX~}TJgX)vkTo%@F>6}ZjI7yN z^RgCZwPh{K3TCa&TAQ^YYjf7NteshVvi4^k$~uyDEbC;}nXL0!7qfb^u4UcKx}9|| ztKX?OjZU*O)|uqAJDtt~XR))=>2;2GPI5LmTbwhUbDZ;?i=0cG%bo4cPUkx3M&}l1 zw{w?suk(QOZRb(vapx)LS?2}kCFd3Ab>}VT9q0XQAzPbm%C=-%vs1Di**V#+?9%M2 zY=3rr_T=p5?CII9*>kfOWG~KMn!O^sBYRDDSN5jtt=T)WcW3X*KA3$tyC?fZ_UY_% z+3#gv&c2#`BfBsAZuWy5DMz0(Iwv|OA;*@JnUj~}$tlmN$qD34%xTP-mNO$~cFw$< zg*k0G%W{G_t8>=oY{=Q1vn^+5&Yqn8IfrtN#*tQf^ajOYY3vIl1$57v(O=U7p*X+nKvAcVq6B z-0s|6xqEXD3OYrbMqGDEzVn-w<512Z%tlT-ln{*c{}oU=k3con0Gj@C+|ew z>AZ7!@8w<2yP9_+uP^Uz-h+H8U!OlZKRQ1l-A*>{A>9)^Ka+h z%kM8x3XBEjg4lwj0(*h8prD|*pt8VQFuq_?K~q6X!OVg=1@j9Q6)Y)OUeI39S+K5P zW5Je!?t)zfdkYQ}yj^g#;CR8Qg0lq|3N95~DY#y6tKd$-{X(HoTWBh@6j}>Y3LS+x zg|5QV!m2`lVSVA`!sf#1g{_5i3l|hFE?io;qOhZIO<`Bzroyd-I|_Ff?khZ4c(|~q z@I>M1!gGc16<#j9T6m+dukdc+1DE8|yGFaBT?sCmE7O(d^0>-fHLiebqN~w0%{9X{ z+cnR%(ADNz<_fx2yVklkxHh}Cxpuntxc0jaxsJGwxlX#yxX!ySx_VvLTsK{}UH4r5 zZpCeMo87VQB)8q|bQidb-IZ>yd%Sy+yUE?+p6QdRBNkJZn5%o=u*uo*kauo_(H!p2MCV&k4_I&pFR~p39!A zo*SM%&t1=hBB@AUG`c9dD51z!lv$Kl3mMaznU zMXQU}7HufnT(qrdXVIRb{qU*$BSpuGP8OXhI$w0LsJG}^(aoaUMfZyOi?|%QE-tPt_7;yXo>bga+)_NVcuw*B;zh+vikBC+7k3t~E8bYVrMSCzSMlEB z1I2F_A1yv!e5&|t@rB|`#aD{27vCzrQ+&TfDAAUfN-QPTl9UohNluBYq_m`}#9vZh zGP$I=WO_+!$=s3!C5uazmaHi0C|Og|RkEpMYsrq1-6i`<4wf7)=_xr;a=PSP$$KT2 zORkpODCsM?Tk@b(D%F>cE{!ftD7BSlmgbduO3O=YN&}@6OB+k4mCh)gT{^FHVQE|G zveIDb>e98P8%j5qZY$kcx~Fu1>7mjirN>H7mYyj+UwW~$xAa=+&C=VY_e%TAlrm$P zxh%FUsmxyHEGsB0E~_l_mW?l)RMu41QZ}<}PTBmjMP*CMmY21cb(XCw+gP@xth;Pi z+1|1PWp9@qEjwOzs_bmpg|bU!SIVxJ-733NcE4OG*Or^gE#=nolyXOTPPwbRw7ja^ zUtV86xxBf2dUDs{-8pt&{vGEh^|PeuvKJMW08Y`w%%&3@MF|T4_ zMO($PieSa+inSFRDmGVatJqnwr(%D_p^76F$0|-%oT)fpaj~Me;#$ScirW?UD*7vx zN@JzDGPW|Q(q8GTET}B5tgQ4_j<1|l*;Lt5IkR$3<^0M;l}jp@SGHGnR<5huSh=OL zyK-0M-pT`&Z&x0zJYIRK@@(aW%1f13Dz8`Gs=QNqf2=T8JJvMTGS)gaWvpXt&REyj z(y>)z{bTFLP9EDlcKX=Xv2({R7`u4v(y=SXc8py!wrlLBv0KOP7`uDyzOe_#9v<5> z_QcrJW6zC!Z|voP*%7s*6>ZaY3GZs^?cPs$NpPyt=)* zvwB_i#_BEA-POCQ_f{XMe!Kc;_3`Rc)n}_OR9~vTQhmMpR`s3g`!zz1w#HOrsj=3i z)HrH#YFss?HB~kKn);f_HO)2CYg%jO)-0%5T(h)hMNLP|nwqYfO*LCy*;jM0 z=5S3<&54@RHRo#HtGQfrwdO`mU(MZ`2eneIzIJqNbZtVdtv0hZuhvsrURzTesGV5b zSUatDM(ym{d9@2`+iI8925VQ>uC3irySa8-?atagwfk!i)gGxmR(rDcOzrvFi?zMA z*J^Lp-mbk@+wWDpMz7f$>rL|7y-sg|x7b_h^?Jv9CwZH^E#8^lIo|o+McyUe<=%F0 zr+1xqqj!t9+q=uV*L%SGw)d#_xc8LztoMTVlJ|=Dy7!j%j`zM#@M(P}pT%eOrT84a z9G}Zq>Z|hkef7S{zGmNaU#oAfZ-H;IZ>evEufw;-*X7&f+v?ll+wI%uJLo&?>+zlN zo%Wscz302^yXw2)>+{|9J@89@y??Yn+MnRJ`7`}_eviN0U*iw>C;A)x)BH31v;Fh@ z3;k{WW&WUlwSTRDgMYJsn}4T&kAJ`akpGDPnE#~zjQ_m+kemBU#HX= z>&$hrbxC#hI%i!$U2$Dyowsg$-K4svx|X_`b#v> zyXyAV9jJS|?r7cdx>I#$>n_w?s=HEmz3x`sox1x0A)pPI0+xU^kP>hNassYEX`m|L z57Y-H2bu%Z1FeC%fdzrZfu(^JfsVkMKv!T>U~6DUV0U0&;2@l%Y|~odK2471KGFjp z!OsK8fjeP%%5nfXax8JSlVt3`zYWRk$5R<5BOM``R&6tIj*uSG45#qV1BW!rHj=qX zdTgZUmdbe(WNu+AF&R1HOl&14Q|}VVHxcJFY5ou7Xrl3(V5E)2Swb?W$etzCY6i(1 zMSJ8Xl3{&)OcqjKsy$~kAAk(AhkTbmB;QH%pv|b6mr)Y1mFoLO>`R%XwnBW!9%ZZ6 zi*%@Wji6l#oLeCbRnBg*`CZhbD?u6gU24U~;tXL(W5GrTS|O^`3O>Jqy}v-5Ahl{x zegqnJDBA(Ue(EcLr)Baf&G(?y0>;62}~jN#?qC9B`6Unf+*q^4gG07rlFg z#=<~-WugWpLHQVDGW+XMQmas3cy1R!8Q}x8Q0&4O6FwNmS;|`ByI>*4A>V2_TE$w) zbCqAhxZhXKfaDD7y^=h=tbmkIWL<@ghxy#|}boyrE# znTRs1FR`ES`3h=g7zzV8;^Hw)H~gHb;sf%a8TAl`l7;kqh&DhgoK5c|4K}09`^2%J z{m=@L*AqvN{enH{g`O<5sG|dtl1wt&bW^~>4(*%3Ve^zY>J#CEoFM9<=jjJI&`Q~_ zy}`8#0OtjI)_hO~IprbEF!up--OG6Ls$^sDkO7_tFUHeMi6skdK;2i(G(0GJqJ!dn^Brh@!Mazpc7Q=`aIa!C9~7mRy|aN`z)9 zaB^u(_v#t}vER^&wq@Y|pv{`=z*(%x1-bz4+lbN@Z47YwG-HAO(g4JORHi^ilHXK( zKsWXOGtfD@Jkb0jZ3WQUfm^_D(3*g5)jSQf7d6W!iutLu9+{~3Ok6?a2ef`=A_rt} zeuc?Uc6vZIGnp~EXNLN+lFb48$1RY2;KbnIwxK*cgN5r?3)&<8jQpBQn*Rdz z$P(fM&q)K$;%OW&$cNCcq{p@btD~+WN5$tV&G!K5c^9jo!ECJD1Z^sZR)-~sn0zW! zuL>U!hDlh9GEbqVg**lo8pg&F)l;pRP1gED}X{Go=I!Mw4ayi;We=WN1|^e7SNsqRk@B_)C~yyqyir3#g-D1U1n(7P5r+Ky3_q^CBt5q{JsYtvs5~(~ zH)8Lwzd%&KrFjKuvS%aCZjBTBQe}F{#~qqEAk)iaD4qq1s1syQKiP9#nFg(>dY4#V zXUG@US1;lqe+5TP)kEJK3ig0^YV;0ZoIouBc~zu&3f~mKY$h3sx&ey$MD$Co`69L{P#7QL*}W9vl(MK8~&kNwA?oZ#R(YZvqh3#%= z7oh54^{Sro&xcfNv6|#SXzd={!*a;8J*-I!>yCULBSGB(ZNygU2r?O&vc!3;KUJBp zauNPjnx}g5G=lWdZcB~%RcMu(kpd_qU#2}Q+Z|Jlt(l6ks_r!3qN@92id9y1Td4m3 zK8-$QY}kq8?Awa_JM|2tg=)WSj19FiKZ~t2WrX}$938f|(w?Rn$4*xQNW;9qdY+9k z?QWnI<^-C#@F^hFbDu11B2O<8$B8ybYlss>4%^MKEDALnL?G-v6HqhFW#-o}sTKJJ zCmyKzC|anl=Ct2eUZdzeLJ`GUZJ@0FpA;KpkJ6^u2(#c%i9>p{zrko!^&G%T13upZ z`r-Q&FruiH_D#)Fpf{stSUurgu?t6JXoW@2uaTpk2r=KsBev@K4~zK(!g=uY0Q!YB z6wpxh^rB|DL*s;26bbSdkOQCPhDeaVz-9_^AbOFrgD|Ybv4Hc9Y0#>&e-ZE*K5Ikx z0B0xZ!Fe&5!?D7DjUtmqkhRk8!xdJQIYFcR3Z2s2p-5nU&B56%*HiBc&>r=4WdZii z_PH7(X+AKp0uexK`O~N2XBW}}io^ZbBb@(y1ju+Pvvp7=S%YICP_C0QaW2CXkidb; z2QY-aCq~pNYBi5AKY)=S&LhNLB+WNT<|4J)rp<#^>$yE_0DFP@c_^MC=3(qK_pz1C zV*VY{^D#!0^bVo13^_15I5(G3@BNx{(5f4~fX`5&g&V2Wj}QTg zuOdg^fwcZI{?ySPU;7Nw+GF(d8I;kaAgx(SKT}8#+u3nvJ5amgeB@3BhM%qo*HA`c zJLqd@GgK)7(u^}`umS;@uwCsflHt!T9!NSR4p`d+w$ihsFB{-+Wx|f|y-Xa-xZcHaa@KMNA$ugY$7i(`odbwFDT5_y_5jXw z`u#{5&;z@Skj$fI(?j;ac;UE*&$x%}3A+nh24`vPo)5#e~`n*R5?R73}!ae!|o}l z)tAmf^9yFBTCeKSYdE`rsADJgP`5xUSUmwl*d^gg9d>V`{}AwLryxsIfzV8Wa{%xN z(1xFE|1Q6d)wT9ntSaT#DIdO$8BF^uR^#&PaxPM2@zyW!ZHPmAJ^2*HGsPI}Lx=Q;R1Lz8a)_gz!LsT-n|2)PxjM$1@-eGz zsP_QZibd}T98EOUv`oguwPJH{1P-)9zebP|XQCb{2{pr~I%&qCg|KtMx{ldQnw4z4 zQzp4cW>{b1Z$kEnzag0=$WeYtt(FY;l=VeB(?L`*!jm`-ofSZ|K+P%s4OMaKy-3sy za}Y*HY(~v+S~$c}_YTddN4kZrKn6666N$5mI1`Zrno;IOCPVgY!*Nk2VD5s?*kiV7 zLd{wO_9fR~UytC-Rb{YMCe71KxHWl-}*_e;-exl)Kc5ou!OIFQ9@&Y)MAELHm93RJ=j0 zI5YtH4v=K?i{&5Jz&U^X*Im}boi-8xqDLBfS zJ?JTW+C=*s^j#B;y{j?-RR(aD58;`BW;{l(e298)!Br1Vk|7VU44_ORnfo}($|Teb z6*#Vp>*=&D0WFl9kOQ+4SNtZFfpZebTFPrw1({GY+;IR4AvT~#STD#^8o>vYX)6T* zdR&921j-o&P6@<3lHoWIQN`#lp}{>FGW@O*5{5HHZ`kuT#0kS0InuCwE@T_XPJ=sElu_#+^*I^jgpUsC39m&_^Dr;MM+aLy zR1G3$SY8c(;)VJOd%i{GaMe3;!k$nfP5|$o@XzEtG;_&joPC4OBhfk-RymBo39I>W zEW#>Ax}%|bN>4+vlch&^I_x}L?8Q-*Pf)bbs;53pcbzi!Hs&d26*!NY0GKxrXNm4P z@N_$!HL+*I7Eq>TI}Wy9tfJYy9cMRuV>RRiX$s0i4FCv8Q;5UvXl$qZ1xxz(0)Oxv z8)X8-*+wV-tomY4`%v``-y;Cp)Tg|5V_#6AL7gV;Ce2KyoL0Id;_SxU0y4N3>?X}F zvYBNY7jX`#dLVDJ(_J_{0L}0n5ZD*ZN@=jK^`vJm{LDld$bs+^PHASq&wnI6@suycDT9CjC` zjARB+pB8{$TFmxr-C_5v;i)0y+@e;qnI4QZX*T)(KHZR*{V7V?qZ|6;p|jdVJ9hEB;?Y_wo3!MuPh4XZiMFLpY2hHPeclUGvQ{ucdG z*GlFWyW2&6i4#c!+XYNy_+anq9`+V`0WvuI-p6W3oJf8#dwxWHu{*rK#=hXp0qhZf zO)KmP((_B2aVJQ#g{sgUN(5-L5N8RUS#2jhw2Ksfjb~_Zrx>D6)kE_Fo>0QEQ2Qd8 z9XPUKGE5Kk#qLkZ-y-h@`@-3M6Rl!*ibXp;nc0AORlR#cIb0J@cVU*Gg>V-J`=#|7 z_8^F}Dnt2)@;u03erQ3I;Cl%HF;&K>%7pYZU=1cVlO7fuY91p_CC(#QQ*bBFV&fk6 z4kwDJ{~pOuUWGLmWmp{EA{iseuow$q1qHEzJ60yc?(oKwFBBV+Ofl9&6+U~SmF0~& zgb&LbGOlH6Uo!R%cbsQK9sW&f%btj4*^i!|VbA}74B!lRUN9bbnWJ=SL^~-}=9^(M zAg>A6GX-n@Fd3Yc-881E9-K8G1AO>~N*tZ{aWn^Ih;xAMWq-{1ZXx*{EH*H2z}&&u z_?R$c_%NAw$!3cx133zwUxk%deWI1!Nxw`o>`pq1Rk|~x&Si%4hjiD2;rvzX9qJ8? ztFMxUdddkss-B@3gP6y0XSD>AxlH>nJ;fMXWjbipqih55+z;|6Xq8z^bMSqt6S_%; z?P2L@L&)l|uT-CHZXh&zC_mGQ89e<9$V)Hcy%IHVY(t!3CysfZ)g+lzN7YmP!`75- zn8)CoyPpRcR@*Sm->0>boy8r&zBEQ!QwHk<7%!+LFef}qXwXy25c7yLJGG`-U14|a z*>04b>c`XF9PVVBmw~$sFkW!t1eOmz$xN76A{s*+=mpkgzL<7e=R4vhZ~DW3KCJtJ^Zia1XtoY{Ek$$pkw z2A}%Cc#ftug~dEQn*sA3Pj?4pAQIpl8`he^m`9x;vwu)VysvBp&U*YQ-lv(;s+<7d zmnf4#rj_Dw*ylkYRuOaBC9&uI9&sK{XTtoaKiCQI;AcJ5dLB=t= zmBP1$V&M(pZ-vhZKNMdT=8JzOt`Kv@ApD;%t`h%3ED*QB|Fz;<;$hJ%z9YUTwurwF zZ-|S;UyFSp^&iqAv0ZybXO;wAoo=F3sC!B`O)ArUQ8!ca>1OE`N#k^{=+;S7b>G%) zlU~+s*BzE#)%{3!S^Ac)SNAW{-@yIt-%5Y0*Xzeff2Viov!uV*d-N63KN#8!ZPL#S z-!ObbI%nuIY?6L%*lyS^T{P@8?38{Hu`yz!bP4=1O7BR&0LOkQ{Yprbu1fzV*rXfM z9l;^pmrX*UJX($s{BoQeFHDrv_u#q=*HyS~z|{xWUAP`Vj}lyZxJJVj4OaqOHn=ijJo4ae4_xJN)xZ@1{zUlQ z2-h^YX23NYu6b}RgsTm%WpD-IS`F7)xHiDG8Ln+`?SyL&T>IfV1lJL`j=^;jt}}3* zhwCEr(F@l#xNgFA8?Jl6?-vAF5hU3Nml>{Dc%1~79WE!lE`X~T=t{V}aE*u8li+HC zs|Bu^z?%cV=fkxK=p}G1hpQc~PPo>=wGpl@aCO7A3$DFz9f0d?xQ@bg9IjJvorUWH zT$kXw0@roWc?*8uf$Ki|v)qanew*O3z-1LAB?W#v;CBv0{-0vBi+T7{p!+rO9?Syx zc@sI96@kWg2l-b({u!(pfU^s}%jXB`yD-y%!+zqsFR3z2l4)Rc=w}L(7a#!O!k=S8 z^uR}?f#aw$Op<=WX*1X}oIk`#fp?AY>UYUJ@?Dt!z#q6PpawyR4r#!wE~H?d6a+e{ z9;12+xn;0ltd|C9)H6t{k`s`_a0|UV@Txir9Ad(BYWq3(IR-Kc>Zt;&KEk?gP$$!% z97YbV`+umP;#3@+;Xgq?>x+J>y+h21KgO6D`Z3^8_^$)58_-q|V2%n8 zkP;!2h_OV$ycDyEDg??+R4q{BiJA)3a{|l_ut5;#6V(XRSHKQIXa%Z$i25eA_%`s~ zAh{Bt{wMKZUW)G!bq=WWL|p^w--!AcGKYc`<+cQ(9Pr9RR25J!5e1n*T0xo(K&>H4 z0_xj>WdQyIY7g-M2k9tLfQ$4KqA+uwLrS&*^-JQN1nS?3l7YHIemFrwA<6?(EWHb3 zAg2=r9?4}yL579@peOlr@SCug{|8Wny}T1B!e0I!P=vh_0~BGeq(Vc&UdacFuvZ`> zGVGO7pa^?7_Z`H36i^KNIY5nwJ?xnWvG)T-*emd<2!_4V1QcPfGy_H0D=@wcdj;|? ztSK-G%6y;*du1t5guU_|pcwX$FI4OiwUMz0)Ku(ow0>Xgbwk+K4Pg&9!+(Ii^4IX2 zuvdNy6k)G{ei`$DUXA8p~ z&=?te&0oR0EbeiB5cZny0!4AJIS3SCuQ>!1VXygHz=h&o(*qP?uYpQ{VXwjUm9Wo7Ml z>>-L7_Bxz1guN~nD8gQ61&XlO#e?UBy$~Suuva{#l?X?)8{oSllC4EbcLON5o#g5Z-0jgMAEp{UV?U zdp+_9d;M2|BJA~GCBt673Mh(u{d%AXdp*oN7WaCb3k-XR0~LEj?P2UC;IVv<(ax}k zS^GP%$J{hB_AqWL_AujB?B4(+!2wu}&%u!kN4H7?u27g_jKbkO$d+hgz!Tr z;L{Z7TX4DD1uhq}^f}*@I*bCcA~24Tj^ED2VO};M-szh>7xZLI`MubZ~L-Vs~j+K?9M?ikTv}t*8tkF8}{I#87s_IXxVsNdvNA zfM;Ul{-CUg2F)8?2CZn&H58tMfAvOelRj5Oa<$tVTh#%?3me&=&n%tSs&yWXL4+h&a!uafry z_DH>#HG4j8klXfr9LQ=#Q7d=oB>3sI>J(9@wbc8~vPRTs@72)jjx>jAkw4NLv>A<} zAtJ>($5^pp&gNeVt-2nA4zMuWwg>9p^tEFzx;xLOj(7JFaLcT=c757Xr1iI*vsPPY z_mRkhv@w3w6(WNq0n*#7&$ki1+B&P>I;(>QV*t<*0G-IlH(E*Unu)GsuiHDwr;ao| zs)FG#yrxU3{K1@mXeR|isnS}5S z>=9jPo266n)%^z4ci2b*bdVbK_%)5iG0vzr8zKZlM9`&)v^xS*joqD*@E*M#>C;34 zAcHR?1!VC>zhd?&W^X@*#*ICDY2Z6M{Ap(5{L|DK0KZXd-yv$@`GyA&DF(Sqi-EJ~ zIqMPC?xl?PHQ-^hKiL!1W5eaoTaVPJEf<_{cOt0Lo52YB z)vLadGkXJjV<4#2iCX=KnUmh|cuC=*=dH(?=I5<%lg2yGTko5Pbf;-CfNpea;m^=% zUh;3!OQK%h_gB_pPfo^7!Lkn#XOQZ*c7RMi4$2qnEpNdI+B?{~O!i@KVe6s(dO*l5tKCWY}!4q4rhG%nh&?^UI!002}bP$nAHY24TY|BIIHDe4P+1b?hE*;-!A?s{QU*vj<`YI`plwjB}j( zi8S=$_~!$o=|#`D$fxKX?B1pi_#+oZ=!6KJ&E{=i6>0x7t)5=$!(W;k1^(UQ{b9lZ zA?&5Oaqy+VAQ+6PYmFM^Ki)|*e=`_?X;GcsbwY$jjL`XN^>t@EYKV^HX#0;s{7#iG z2@&%8sm&1a5%TOkyCYhAh`ioziXI2^+~&n}p=%$reRXO#%bs(-lRMtMpF+_m^d5CDB{DKZ+Ji&f zFNMf@5`e&ggwUzeeDsYTtwGcp|5SPIBmFnnRKyIhR#kkxKT=&3gdx%%93ndzR}u`; z`l()nBpH<1dxE&gC;+~fh;Afs?tDHv3s)c{zqFFF29iDjQqNEygCz7ZNPa0qLU+I= zm~Ax@Omj>{AIxAYm`}8xD4NGm2$A-cL)=c{MrZ^`{KCfXWTv?wvJBdeG*EiSM*Mol zA4&&3|wZ621L0b{MysqQ(5?O$T+1gE41A9rN`bM*E|bG!Q^x{i)`k{7Ua78mfZ8Air%^#9X&3a}UV@gmyhV=plQxkeBtk_%~KtTVX}j>Y$)O#*a-!MQZ!mk>(Cj zFqy=N(PLzj*CBm<^Xr|P*N?v{xLWTS4T902S2R+4TI7TFV2_tz`mNTKdbahQ*X|kh z09uuQWf1;b>94|<#s}>y>A&^|Bs(A}W6s*VE9sSf@RdNK)bi^qSJqY2OKdhkZP_sP zFhHR4KnG!b^so$=q8))%3KT9zUArFYD%)#)MuTXK2=**mTA3d^CA;&umuY)v`}Xy( zuUhrm%E7)!HM7!yR<=JtyZLul`KwWx@qy3Q=*+sUkyd({$A6|Z>BQhW?F^8C4p_2+ zUYl7DBaJ?jX7~Zh5wKuSW4%4i+~~yjN5Q{#lex8hjpOstjXPFFo4xJO3jTq-!)kT- zSFRjv74Uggt>B;jfw|q>VSbH;;q3;;hRGCJogD#tS|ml}Rfwi-Fs>0gsFZZVfUX}V zs8Q*HRa&Qi)o{nzxD9JOqrP2VaKbw4M6XT@QHv{99OEnIXV+P0{rOqsLm~Jz- z*=-x@p`lK{q~{(o6#eLb-o@Cfy#n02zKQw}%Ss99TU@89VZtH*G2r#oGArC z0%Xp1=mtW7D+p9~{S^(8AQvrN_~)^8e-b z?SJX70&k6)aTm%#iB_jpS};$&s?ZO=^TY4>t6*?Vx_&6NjB2TcsRv3eRQHmjkNwWZ z^lVgGVfohU);M>pasFL9^n}KJ?W>m$vVu!12SJUXOc0>rGAdv3QvcJ=v;MK-qG0sT ziqv-m1LHHYy1X2trO9rO>LJGL27_hwpac%EP4Blyej_-_AdE7Y6}aUS>~0L$Yr7h) zdg3XM;OXIk%VH6Z@Q@x`kaTHW;dx9_-M^WkKAPUL{ z$npTaVY%Pu`^e|>`Imz!ql}(O!pfnvL>!x0fGkM=`KySd=pW`-9S?Ir&qJ;J@C470 z9tb6!4vRWUPSyTZt6pEfeY^h%={M^I)*q%T;^@r}bF2=>Lo%SBHk*9%>FxfGJM_xzJv)|KX+HA~_mM#6dpRh(M3R z+@rTCR_FR?r_E;)MxiBY;=gVS()$5;RB!P8q1-l@YJI^LR7VwK zWT5v+JAo6Y-ztJhluXJ%m!gO!?Hg~H^n%G?u~@$5fdBgI>+45j!Z5$w{DyI~(ULjw zt#&MxOrsZB+dJz!UlweNurAUP>9dYD8AVfs%c88bxlBsCrM)}g{0PcOliX*P#Zj8< zY{!PcdLm!9H#jzKgh3yr&6u$}h+Ard**4)LxW5dTiAt-e5j2{6P|=D?a1>amL`K@} zfj|&y5R;+&^=PZB^_}+DBYRA;WHMky*~Q*jV=`k!)UN9rdOblDVLj@h*NWA(Be34z z4|_9u4aHc*=I)h4@0YJJ!RvR1UiT|{n@>_;C#Uwj#uPmv(l_)z$Xi{X|4SM48${Sf z1%ogG2E_{pV(60A-2uD#prRA?hJHcUN6em9m-&QC7_txSg(nVzrqQCwtm|#{3thho zj8C(6%=Uc!WkHtZK2wBXico~0QzM$~`ZVQhCyhdn*`$|D5v+!TLJlf9LLZOh#Gnl- z-(X{=b*af9nM@CS-Hlcg8q(AKevsM?K-CxQ#~;A~WEeR{5EYFYRJ1}2HkKy6ib5tz zf2=%Ri7}%Y=rd^rlb%kpe5pdnwvGI|Bi`-Av4Xno383qp-j=2m^)ztX@WGI)es0tXkeK zNh{jh+y9K>X{Dq&-3Z$fT}%(14MBVY^gGJwO-V7FUj%Pz;?Lrn26!{I58u=XCQZEI zwz(rs4>=UxsaywP-TGFgqR(P+Kd4u0GMjKhzuAXwVCg#zRqJ7hog18s)?1?4`vZN3 z2+=U=`)^D%AG6l!XPMIA=oB^o5GM>w-9ZE3#g207lf850hY&2nLq?cwbU1pXvlEl+;1P$G}Q64``8_!wy)fMZbJ?1P2c zXpp`V-Lk>?`EiTYss6e}O6@e;R#F;>Ftq>1;&{3{NYMzprNGnoylDdz5u>rA2M+)Q zOm(sW&buvEOFA4;LO0zMQmLkRaYB5QZI0>nb~ZvEK|}cK{$92G=W|?3N~rJ(nxl_^hPVQtFv>B zGiWlw`eBQeY<_*3WK(Rb%{wf<>yTc;*gYG}b{MM^V!NW-&EC!inUls~g0#63j?h;^ z_BBTc<_NQh&!BqsQm`>nvbCEhJP3B1M0!gUyd%A(h~B^mt*jkg@bKWn3dckUV+=JwjF8lhEBU5%D(0o|}hm^;k6exu+J>P53u+vzn2zb3RxiZZ4Tc8n&v znZjjm$P_l0SudF*AUz0NdLAGqg!OPHY^1}OWAxIP2q;^_TFZi2)7cJN=?1ebnKd~E ztklgK;M#Xcm;&IiVT?u?qv;fY!k0k|Ia94-U1_$+ef0*>=Fq>E8Z_&`IEa3I`J$h_ zl{u+p|F7NwN6aS33|`@(1Ws>Yjr_yEprkK?X#?_eO)b?2}=<+6JkjzUd{8wL@b9f5lfzlSem#k z0B#*Zkp&^wY3npncK1U1x8bU0q`g4vJF9LhFnQqh%N96^OY^;^jp@N%hXJh_%HPC+ zWc?7w>TovWuFxiTcE2+q8PkKrfE#4t4D;vBLkwC};KRbl8(Rl(4${W2vjf73 zs2pXGf-f~`aF}FRFmPK4*nrJvecn3g3M(n<2?B{KFG%1v-j>(257`o8sJ4U{pyU5` zcRuiKq-ULfM$CPjm9;^1=6Gi3MoyyZTWL><&FToHo(#yRjs{ubrV_&q_^447?rpjA(_;$Q8tR^ zzVAD-?EKkmN_$s6H_}ft^UnMCd7tNbpZ9rRNwRV(U|r=@A)$$h4JKGZl*;4PKmYPK z-TCH^9$PIe#;`=nu@A2{{OSM->jrf4#+VF8)1)Z|n0Gj_{14pm?JSjGFCrZ@a&_1= zH$I60l#m{bwdqGBme{dw+Wpjr0R)?K%6>OF9>=*EQ`_jk{~=Ki5gN2jc~W(}lucfu%7=x*VG`E!fY^@GKI zjRhwBRx}ulYL+oHu_%v;QFV7%op!F|0M@cd%Pd^ck@)z#aa;2NF>tp zY{U?T5%^q3dVDmn)x)AkdVW`WaaY>vr3snR;giLzZO+y_fA<5vXZ1v^zD>aeyni?$ zRh044v1UG<$rKBPblMJDYw6PIsd2p=rjwaj_zLSgfB*2}d^PZxgQ%F*(&2dAY+Tu| zIsWtm7reFPM&ru-YOyjo%dF*mKAny;k&rWqwV0dJ&GxQ!1%iJ|~RV0k;} zUR#RkAd(e>EKChMM}2u;S`}0~IhlE2fOeSfsZI6F&c%_Lu%qa^&J2(X$tIR&C0tvK zYfaNHxmWf-yLs`%SaIq?qi)CZss>(3_e-;9o6BFXu!>cdS8S4Z5zMFUAMv_U~LeJhf{qzqmLyX3otlc~evIxULJ!;_cebUj1Mu zJ6cxdl^r8QrN^aCtBk)$E=? z>5aw36QS_WkM18mFnVC;fn7sU%&$P{k+HFok0H;H{!}{BCj#WqXGfA{G!kl=rdZnM z?p*l*()PIO>3-SM0}GemEp^89L(h6DmJ&%rH|DFf1bOO5gvz5&T{$FU?cUowtJaTX ztP(t2m$6Wc(Yq#s2@X>9^^ZJpvWYG-7ODrkI_0Xuri$6PVo;wd4nnl(ZsV!9e&VU7 zvPfKx`uyTazqvSHuXP!@&(iu5rzS6-d&IB9dBwas}2ci=XJv%Y+Kv*KgpcSf( zp@UyiXJYi|$?1$G`sABBZXJF9nFkK9)K8d&ba^MrUG(+2&Ao+I)||a?e91?#;`Lsa z($LLWN39ni%HhGqAj5;PiCQhrr>R=r9qI^o&>CbYFzTrI{X85!Fd=l=WqZzDa4p&M zu#Y?>4SOW5p>G@=o2@?ZnZ+lce6(8JvPJ34Z0_)GbTuOmO1l(H_4eX^uLY+UC&o5i z32KhjC#*i#-@0l4SZ=vF73V{aO@m=Q?7+9>Fk0L?<;6S;mRH)T)*} zvyhG-dim!Ujq;dw*qZplSKM6(O*dvR@I5;A)aU&YlTowpjuT_A+S1dj#nADxN2Cr3 z(?0QC?_QkPHFn|f@%g{JQ>BH)laj@IBy}Ecd{XqsBK`g8bUFz5KypkuOg?;OVwV?Q z%`g4EtK?zYfewAWj2ZG+4xW;fPRJJI-v0LIo_p@?Z@;ZCJQ!|!d$1Mw9@^~-o(ZG( z+_f^6535~V`MgK9BWB;vz5hdRM%$pe@^=~juK4I|dQ9w!S3b9CESKM^U;E^314sWn zO|1Pn^`vt5{`3R!P47NDxjqeZ?!IsUb3Lydj+sLPVranPYq>j^)96k{J38RZ8~M>$ zBX@aZItBzrwnCoXkC+heq$_3Yx>*T?>M? zkmG9g{1qo}2sal5j(X0r^p=}FxAZctdH(b}4@i>T_&ML_jW!a7RD%-}Wfb#JblNf0 zUFY^e(Y-aq5V9deJ)ZBp85tOUs%EQvhMv@$rCC196IOM>ABt;3R_3+4U*rg3G1ThK zyX%X^#zJwd{&>!1w5<#cXhZfYXP9nq(2~qxIz>71?lvlW0^L(_RypHlaaK9wW^q?@N>bbjC*##I}x9%FJ|3SaqoQlb*}2ZjBsO+zhh5@ zqxWWG&w^hN>$~@PpLe?Vd7qE&SKWKV=W#I1+%ySHwCh0{*7}k~Ke+s%e0nrE zSM}Xp^`ND!`o3^75!wK{sFgigt^R_c39WwV-LvT2_+88}WT3?!i|Yb2o73)ffwEdx z1xl--kx=5HEQo1m?fRkjtX;ofgx9jTvzg7JwsI-7MdU0;21+WdnlZ|~tbX|?v zt?l~2Zf(~G$~;wV*9Uf+& z+YH~LYv#LF&qH#~-1F=|i@M2yIGa0iwlr6p@%;SBiAmr8W>t(Gy_XG%wy?p>q$ma5(y zisbK$UC6zpTK90OCO2rw;i7JO`DG)Xck6L$kFzhY*M%sHcu_2P>192h&({sB;_i#< zZqm|{2}?}t>3Dh6*{%7yQ_>bEwjF)gUD4+4TsxP+NuP`c{%}tu8QXL~Iv+-{NO{GF zd#H3>UaGLs1M{qCMv{Gr7yU@%-S5TZjWGAV)}>+K(qO|>=+ZEJ++s)co{>a z^CCav-Yq=BrFTzy9aMVyoD# zozl}rK2yn;y``WY9Mli%71Ohl1CeARm<#fo946hHwbQNOS?y@YiaFg5++;#aCQU!r zDrPH2S@(2TtiC+GtXGU;HrF!!q!mdfgW2GKowwZ0d}ZF(abOfNh`2jzmzseS7R6Ae zIdM_eMXnW`5&6}dAZW@6cx7%JAx*KeE`v9yOVzEax|qdWE-)|1e3Ez+R*kW$v`trU z@QI{XrJvR@qlrUtB`lo}Iq7O=g=|s6-L5TK`AU5@6Zh_N1O2#_$>-gMwy4w0OtK$| zP|hSADT>KLpGscweFOD6boZq$3kn^D0Y;9H+Gl=)1 zB-;8(yHfNnFx9q-8GpO`kk-;t?ht08>CYiO&i$Zh7j-)NSbtza86JobG zNw(#9a4Bd|jm7ZRbPc7-Y&WRuhmEr4=)!K=O*oOp+s<7xhuXH6Owf6BZJ;?fdtKXe z%7LYN?&zl4Ld$j(PvhPhamJj6wqHlhr8AYZJL>FJ_474Xcap;*Iqc@~U5@M8$*fVH z+En)&xFE;k+m2TzHq9KKFqc><#%CqUY1XI=%}FK&Ji`ysozfPxTFu?#j<}|)T_578 zrpR8cScOccU?D~H#dXa}qA;!MrNA?pJg$Begp0FNew5Hs!_i36Ty--oE(S^?*Jfr7 zR#{lQD9g*?s79QQvuSKBi1up9{!DJcHb!AyHsnuc9Pn9lOZd3W-W}183r`Z(2b`GgckD^WC;PTrtf$2yEY$@+x-WWf9 zdCm*ncJ8U|L9VQJ7ukBNa>j6FE97PxoUcg+RU@+!9}5;c(<^d`Te*j>)Ny!9^WJ;g zNO0(=Ax@6T0iaik4*rIC$CWKzJGjyvC7V7OyTeg(920t{@$F<^BpL6B>e&QqIpMj8}uA!T+%ZtI$bbX%iuAXl(jHyAXVBypD zhheGS_~Ze4a`XTe0z*EEFBKY1bWTe}sP9*%K)Ifl5z-A2m3%W*JyBZnlJIs6?o@{# zb}HBG1i+;roP062JpP#r`?q{%)67R6pKOiCwQzj4XPb?~WAL8o^KA(^mn-KU3m$O$ z`?bWtj{o>{ke}^6H4nrq zIkU2mo}4R8?l07jjq3-tNk25dt*8vad{U}y)5{d{@m=%x-M=`7(^pfk(Z#X*?%y?^ zk7o*|#~zYo?2!+Qp84`0Zr6fltT)m(kT`tu56!Q-WukJJa16)tSr*evnx~VBE!t+w1$Dv51YjhFRcnZVoCGSJT_seb9p>o zd`2mQ%$Y5TKFL!@cW*Yrk7MV9NhLdja)CZ~`lX-yTI;cwKKYZ;nJurETLRSwzPCOD z?_Na2Uc0{}Vp8{%5I@z}!c*De)Ki(&#{LWq9oxKlQ%nuY`M4j?r}=e_e7>A_^XNks zKTN}pZ;p?pOL;x7KVP)0K4$1~BQ8~5K3`JNrs9j-(*yZL|qGoABx-FozRIqk~4Z?W#W6LXT{4u+K%YHBhiuqR7xQEh2Qg~`0c6*QwE zw7Irnw=z8QMc_e621J}H6*F+{_VBG4fS49#42-j=EwI;EnZt+LC(Ps6p%=wzvEbC*n&`db2E&jk zC|Z>5a6NS0M4-Dksv_!4P-V?tFygAS_5~xZdSh=IF(HN%!ozM=RJjGiQqI_v5Cw;V z^5$-%9>Q56#fwpqX%r?+dAD4lcBk7X&US1YcX#`QlZ@l$U=}K+PV=h!Ns`Geob?vt zOAEnxMLlL_D%IihJ_3Ec6>;SZ_H-x;KJOTC|5E@ zDLDNEOUd zsM7n-lbS^+nfHxS_h8Ge>6?5K2hKWWQ&!gVRhmYHT%~1H1t)dS){belbJgXXH?2B& z+^j6ObB?m83r~E(6~->LIizb*uWPr~tS(#Eq?3O%j zNJ*6&Jnoa*EHH3*N>A{~b!d@)5{o?b>Eeq%Q=I)O7Wvs`*gT898AiC}hUTeVEb0OC zKoZ~JfpqWQ@PYKqUi)CUA0re?nEJ5bku%H33-jsvv8|@d76B(8w`V*te3R)EW2Rbt zQ2BHhHg25HH3st4=JG$IJKVxa1Lv@wG@kuuTxU5GuxDC@2lR5ulQRJJ!x(yb%q%QP zx557ff@)gqQm;tqda4)R4T3N3u$cyEss6@=W^3Q8d!z46CA8F_9uHq;#zT_16P*Eq&70>hBtO>blwOW04 z&gwoS&VrSxG!CZuEekD$m2W&1l;rM>+okhr2HPw2 z-r#-wxV{!++X8poIw?A>SD$e`uTm&vEM^WfHP@@)dzIHt%8H~0O{Y2=WV4m+ZksJw zUe4LK{^VZNKa?%`RcA`1jA$wmA3YHS3zqsooi=|-^J zIM1zYj%Ry!yOWJZFx%#j4OAJOf>+x)MIs+7$HUBY@rgRRV>+GUgc&BmTeyy1(z_;` zS!z)=OIGRHY9U;mYAvs?$D@svpmC+vAbX2y?OCl>Le~>?KdL<#TDyFiNF=nOA%W9U zlrYAzygBhI3ES2E@PaKqNi8wd;WHr*X*qB>i9}>*$fa#prC67fk42WUwNx^!Yi$`1 zW0Tg?p@mf^c?FtKF?pz2oVYEcrLrRD3Y)JJdE=5zETPZ10@s66*RJd@7p5j)?{b-) zak}oh#X{XJ)sl`JzU{2Q7i?IQRi+zs9fYy1S|UYjb60fi%}O*e08t}O!Jgd@+%mOd(5IzDc)KVUXEf>vedNTocQvQOk3bKON) zmtbAURdF(MNb0)YnyCRTm5{4WtUt*`Dh~&A=O*X0Os}N1vKN+voIeh2BdLv^c|>bC zQG5*h)X7svKtmwz-KNzTxvh~!UC;3=%w$v>Z z#QjFMAz7W&Mm=?#Po`!Yw}TeA9dfwUbNUmNk;}F7$E|&p$(4o24i;K_78=i#tfl5& zyWZSq&-&B3S~l&xha@pXyOQNmil+nqZZDvicC?HF< ziIABsVLFT|w7xA^1o@QK2wJ5;W8@@lM-l?3LO0X6f-nUllo7f^k3WCV^K$c5ysH?! zh4R?ukCy^7aH{YLs>(y>@K-Mx6p&-%TJqVmS;%NEs|soz)t}O5ooo^PrDNv!C}te&KYmttk?=mPpus z^^$+tsiJ$=bda-GoS!=pm`ynnv-5GCf|^?{wVPMSus(*P_o#DD@8qd+B+o=DlGwalyKs8> za^vL1S+A`#ZfH#`|BUGs*a?|)7)9KD>w*(jBr&+$c;fur}L4-Afm*EG#E%_|(I{>uh(HwFT3%Fmx*;?siyq8k39`B~l`hTBR&2c*|yOVPwJD zelW8)GqO7UJ+JlRS+L@Tg4b|OmX@lsk7csnb|om4 z5wEe#KikO%nM|cps~@BqhP6~0-Od&vR@pJ#Ma32KX6Ty&cQ$Q#XEB$VTP|8S0h(DTs7|5-*2Rg>9SwdYi-*|-W?u%75CM3t5_+!LD0R= zW_7*3uc!v2@s*!}A5b!0=Eg6-*xbk1I_EJ+t-UgITGDO>7gutN!C33WN@+0|Z7raS3^Aq#dF>f7>BiIgtnkWdzVtf74gkZVbK&w#+|(V{FKo4p+RWj~u8h5+ zwLR^a$lpTRDKqEHrwesUt2sV;QT{dw3tNnyxP?+hvFv5)xI+uLZ@jW@iBY$nHXF^ z5=J&^Bg0s5l1I@;VIuBx@_!StpY{s#aZ&KJ1%d77dA8}OJq$&2215!9mwj!mDY4>U zeT_(KR(Dj6th!+tVN-Rg@lD9FBB#=O@icw2>ZmU{r6c-dZhHEgm7^)ugI04pjh2@2 zH%dp<>Rm!l3#3`u+W+(%rIo$~>21OJKI0367fZM}T8;=g`x1LxK|c#C7r2FLpw*bR znHa_yAv~%PxFkhrTJ&*6Ff)*g*MXA@m>33b_8WFPz}WDMNA6liF!d{nk)%Gdkss>t zco3B|?RbQI?lZ6}I@-~KR?w~n>jGSX)h{=HaWqvH&~1vKE#E*Ec-5NPaWV4^WMO4Y zOP`Y&JWoTK0Zzi_ZHOsGV$!k~a`qJZc-Kzuh!Giy-FN9Am_A4gq%2b{96ab z6fuKlE^q=*j11``X|t}iyvb&KTs6NKx(HyNrhZZE^X(H_(<^1oC9jpqVV@ND>4)4$ zn&uN?ugCZqIJn>2B0Dl18QFwPp;>fCL{wI|-NIV9)Ap=uXGIn_f-BC+IiZR8t@#;7 zTq>x4Na``4oziR_qH-;vGDS?8#+h9O_|3_5O5ja{E<2pCs^5&7YDo zCq@SKk(BMwm5gPIJ{BCX-m!PRD@293c13?oZ{TcY2oAGBX%x{iO7D=}KQ$YaS4&Jf z{Hh7ZKRp{OqtA&YS7!20%|;IN*9^-@5ni?_d?D=Ss>m&*Q~0Zp>_=Tje}-GB`lVQ) zm|aOzYdboNE$^3twg)Mjw0WN>;ZeFfVD+uqTGMLM7)%Y>*gDhGm5iVD zaA&fV%%)#iG9xwY)4l1u?|QtT_DGy031S88RTilez~WAKAxzFY#5 z-VJ?0UkM(sS}GO%=F@~7if-aoQ{jN}ag(fSm|HB%j@$TCjqEL#C5`Suwl^~{bkdaE zY75O zN`g$K;9=w3S^@(v&xNHL(zecX=cI7TnR1*J>&IE5@>XLk%SY=6=kSRdUaxy1C$_~3 zdeJrMVkt#-tJJ=kw?-|TX49?ZQhG|Y;^uBES%CZ=1G2kAMTbvr?hXoP$^ zfb3bn!2=-iZRcy_-`7Tme z(hJ8n`Ci&_e)UftH;t{fHYx^Fajo@B=E|2ry{h^%x$3EXm8>o0YQ0cZOi#`IoW|^& zX=W_EZzK4j#%WhY%D(j3R`_Z)Vkoj-r)QXXrOd))lpytp+#tM8+zQemYkAw;J+=Dm z>_Icb5J5!PEplTEkB_m#0`B>H}X&Ye-g$TbE@}cRac$aO7Z`7`x63R9N*K* zW{R+1!K|<>%Phf>n>4uMMF^u^!75tWjEy_`TSX4h8M~O4YTwSkWiKLe@+S{PZ@XU# zw$|SkqUW-@mcdNw;(dIDf@eMaC+u4MzAFPN{s8~`YCNZ|SL53Q{5-r6eeU}B16OPn zKhfg*K#@%NFAE?EotHE^SEL01*yow`+HB{;;-9 z+s66h+PGHY{2A>BwIAesGBOvLQL zy|3l`hTeO7@8$gF-tX=GKF(9U_xIk<`9N=_7sVbu!WSF*IR7rbCOKw>20NtYn*Sme z)JbdsF9*~|d=DTW{_$0a9|k+YTYwxS9tP83KX@c- zX7EyQC%6wl%Sai#75p@)0`iR<1iuW(JM!z`zXAR^Ir3@1zg$Q7hvUf8;H%&~c$Pk( zPj%|A4*|5d{$lV-Ap36zcs+O{fRA+OrSAqm1@-}GrN0OKD)ngW>2(U*ZdxC`6^C^Jf#{MCVo{uuZPum|h~lpCeo=pk?f{0{g8 zpuFgxfz#j|K;nAh0NV9@C!jq&_kte){}DV0$g}4WFbm!dpj!`ZkpDE_^BM3(K!5a* zU(ZF@N(V`h1K$O<1Nh1KA+Qrb8-qF;?*!y$90v5U0ZoiQ2A>7g(Rd1+0px2u3j&PZ z7@!YK=wW^bps&pmAb%4&m_G_006z)d0p10E2|NZq20kg2448i+!h`&9>4stSy*k#1 zQHM@g7^l&_UrV>r4GZI3zWP1}J=75k%Zc@O@4I=#Hh044b2VYv(1{C=sUxhD+%~Do zh`sK*a3QvIp3(kJnlSD|-TSrjs-3WSC(SQ(5j}vh?YSp9QkrzXCoAJ_bGs>fi*BeZLH3{|4w9 z`b~qcmHwg(4gS-{KncLx8g$ptGuqDp=%;-I{2ure_&oR$@BsX*!6OmmPU$S`$R{!d<^Zyx^wXbmJ`Si;6nVf06z6rbpjDm6Sy#O7q{}}iQfK2F* zf_H&K0KK697WjQY9re$FKL<~PGk`MKKq8{O0J=tLbM!j_b&c)-&^AiDqtG_`;{e)5 zrvY@0(*7uVB1-;@J0ki=pa%XY_yTwad_vi@?Yy>X_1ppn49|k`GehQG*fVRea!H2;g0Q8vg zm*A@ax|;NjNgn36fvtePG0DTEY|{Y;!3V(a0C>ivd=uK4O8~l=@Joz5Vzedp5-41U)&_uqZZ{oURBwLJc1C(Pgs4Uow& zubo%L?dr0@N3IK(x+YBX{_eBz{v+M{weskHbqsXUz{~1bZRdRVUZ#=d%KZO1=(0py z%2mfM8$>UtL()z570-n1kGlY}Cg2yP!zMZJ1Msjw&V;1VW8gP|q(u#U4m<_^4qQgx z^n=adJHdAFFTlSB@U%7o;6r71{Q_t5QMT41XAi8PYoY*tiF^lmHMj@75tIRPADIQz zCGwxaF>o9#fqy`Um;jpVuK>ufP8$7T@biE)I(1hz5qz(I0{kiX9H9Qn9%@3P9su7* zUj)Vgb%?$e{2-tWQRFfTA1RyXS2_PSK(3?kLX^CsC&Ax&lMCM_5j=odJTDa6Rs{Gt*y3fMktq zuw*CAo^G5l&7<9WnMRf?^B3Y(-*UTbV|)|x)zM`+WJMj4ZZ?2N#mm6=fHHVHaKJ%u z1pF3&XN2sd&jNT>z&qkRfX}r-@KOMeYd-)c0JPBF1AY@wp7!6tJos~fEUCF6`XW*S zKLn(n`Z<8iMg9c*1t9+j`bF;t-v+h;_*#eV`nv)3(mxGOffd>}0A2#<%jg3Do{u7% z%D#c0qR3hF3^)hid1cpF=m_f3b0_#-0M9G^Lj8NFf6w~?ZRnx>J;+_pN$|JeIrIUv zGpLu52gs|MNBs!r-C!2H5BwKEdyGZ!mtYzApoNa;0cr4E0J$~)4fs*;li(3Rdh^48 zJWS|kegS+L{5AL*Adi>(!87QE2!P)G-v{0Xei8fzaDf+!WSn}%cYyl= zG>yLpK+pIegA?E@;1WYBv>bqk28sY48khjYA0Yk!bsP9?@Nq!i1AhVjHwakW*Z{r* zKz|E8Zv8lT82keGFo15>{{)m{wPE+p9PJgK72yFLR_AT6c=`rm|JV&vGX6?vqmFgy zUb(3o7RGt;HTR>}+|$?USf9tg?S#>vN|$x&`O3F;!o#?Ne;*0Uc<*)LLgYKoYTajH z+|PIKyKQ~t-*mz@cGAGl>gdcl^RgcDSSwfNFIYwRR{P6ti)WGDjxNi;M%5C5;+z1t zfxE!J2k!zO1AhQyetVhlh1&q;%BVIe!2=4jR-q3eYuCcr{8nQOb#uHu{HvGJ2>|&no~t ztZbVPa{d$`twGravS_>+z}E)(8ovjg0RIDg5&SQ30i8e@YFa6UO*K#g{w}E$pUjn}csDJDfK;QHdxA(RU#4K#TqixC4AAfbRX&uOGe8 zkFM%}49tTi*pohwmjLySL$f$#$1kHBkhy{T!7qT118B_G$c06Hte1n=0O(^;Z|h@# zvh5*2J?%#U^tC??&caq30s19DTNCtI0{Ke(HSTl`(6%JyCw~;Y0~`T=0w^!}oDhSQ zH&_7w4xpC?_k&*n=(9okV(`lV+72Z_9=s9ImZ5ipkAP#~3jqGwpabZ#VF!SY8{QSl z?)RYI)Ir~iOegHj^#(DKM_piU^o<3E_`aI}gbwF>W zKW+=_bnk&qcowrohd@ZNLXXW@OTd*5yAed$gZTMK2H`|j$-3Gb0t zb*z;u^C#lBT$knIFGBu1y6ir9RUMLU8^9gl--2HRr_e*20r53tLE8m>3VakG*V^v` zct!gwbP>uV0-vZk;5#}0ckos85WJ|r0l@Rh#|@wAPlCUv4wM;1)}sFbJPz9E9^_8x zqCenFdbu^kD1-Nd{|vr}4uPi1$2-IMPtg<5KL%}M$U=;MReIwU=mKP?_jizQ>elx? zU_baYcm`ZSmZ@9+O967*56|`Q1hl)Ky7!-fje5bigExUW@ILTg!BgOGk#E{Na5uOg zycf6tS`0Li?O^~YXLAbAYZZ-d_tXxreUfHDSGknL9i z`g4f3ZZH9D-0(2~T{fZ*Hgdf&V0!Z!K>5S;S*jnr3{bBWx*#U#S>3MH#=cHnh+NdE84&EEXmD&*?0KkJ5t>Aupv@1}c@zEMZV$MxWrYwqE1b*w&r zefNGXk4h&j#+ml5+FuX;@>OxAU8L&q;99-HxnGfZ|0;a;mMz^hD(+j>%I}u<7UWMI rW1TdIu1WLj-TU?V3;sg~;g`?;;&fr`XIiX2NzGV+T+s=Uu>oI3A) zhLM4L7Sjv9gUO#57#O2HT^vIq4!;f0F~pH2IiTWt28`(mKs;3jZSCI7Kkj zo=@NZMN_pr_1^EI1pC)_6MlO%aC8|@XmLE*vq?es*kASp$t!}a1+k${O4_mFQIgpz zE3$I#u5;k;lq$HconcxNdu3Xx=KtrFa{digs;uq_oFQE+ZgVO8*p{0Yd!0!~li{3i zy1O$EyUttoOFO5Y(wVtMJlV$Wtnahx?Wl@lS`kqh1m+ww5SlJ&*{Js_zyGPuH z;rox}y-BT6{o&p3i|;>wvwhNr+j|vXQNewsb$ l&F$4c9g3AUsY$G^Wz3Rm%h9w`Rs_ZbgQu&X%Q~loCIH2@#KQmp literal 0 HcmV?d00001 diff --git a/app/javascript/images/icon_blocks.png b/app/javascript/images/icon_blocks.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1490875fc2711ad6dc027a28d54cb472e65dcf GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A)o zB%;Kzv?L?Hh=GA)ruR9GQ|GWu$!AX&$B>A_Z>KYI9ai9ReeCz_ z?3auxqvgfS>RX>JzsS4ILBQ*_P5mObMe*jB?LXXGe$)M&rSYGIhDEc4<|Lp0{^Epa zQ!tmJ&vC&c(;lP?6!1=&ACZ0ZRI0$sCE2`1pV#GD{y3cfwyDD~PkJ?j@4tz6(!V6L zXK65ph)!UVVS6_x{D3Tj&>eo6#s-lW&BdZYfedF&#hcbU7#9m3QDwEdX{s2(wdbr| zqrha74iN{1X_^PxB33f6C+%bk<`8Aw;qA3S_werq38$wz6P#AeYjc^AJ-Wu$#qW`$B>A_Z>KYI9ai9Ry?m*9 zwfg_y7j4BGJxw)lXDGOAI9q?LC1}xYHr-C%wFzLa6KS!ZQK0jR>tOE7Vb?gp1uxRU=|7BvkdN;CL XEtmYC+$OLU=tTxkS3j3^P6u;_X2 zT)(Wflb5>MxU@7S-CSeBc%aBm%}{UYo}y_%x2`+PKhGz!YHRepWQWWTJGZW2yg2g$ z&xV;Dwoi1_4yEKwe95CTgXuz|tP%^~0Y;04dJRRF#Y>a?U0+NT`X=^4X2JZne5Z@Q zzD>Ry5FfWr=tglukBZCDL#z6B@oYJz_A5W*pv#V6hq}y5+UF&G5;hwNy%xKGXJb(2^IFgSXaR_B{|EQ9c53+XiS6M10I#0P=Lx$p&Z7{p}W%M_HspIOjgr zCj!Lz-#Pm?`T!uY@YDcjdQ#9g-~zypD2G0XO9t3TN|^=00DNaY1NdSSbk4%MV(iH+ zHRw*L4KqDv$V^Vxe3FPKptjW+yfk&*INGh#^^$1P*vN_h@~#<8-q zXZJGQ00c>oZZPm0Z8^^tn!87fQRME2M^t=5v{B@DnKG6UI;mJbU&nc_8+>4PjY7{u z8>os7ztw;Mhlz*{kN`-9k_}pgj=S=Lr&*A9*gJw&lMF1Q(kdm7y3~@&Pa|IAdjdcr z=h8C?F+^je!5>FJhC!|+4U8w$RARIEXvF|l%)mKb9IjjD0>TnN#Q&p^oW|GrU4Dm& zT<}#!LJE__gavz`ZtbkcPRmY|!Yo*&_X7s_S5+}S-(ia(y$dHIK~a{Rn1L)3Mmy7I z9981lpg_G^6J|zej2gI%%ftO{q=@Sg(P)3{Bq2*=nGlMLis{^pChKYGrCq9**nuk?1BdhXQ16d}7yN1Rs z+Qsf7%8(wjKR{tcaeD&GZuh=feHRUN*q-QYGIH;jVD*0QrKtPS$vix(XD(r1k@>Ky z!K&P=D#4}dC{KZG?CQ892ex!oOJ=Ox(cYSwsKuP3+S1Azh&_*PJt&2QSr2ym&kg0HxI?O4i0NpVMM^X?e5^V~EMq-Hvu!bj) zJ`Q08l&}Is1x^Bc1LQ~E0wg8g2Vw#p`T!QE1ZX?n%_z|cX;D~2TQLO}{T6T|UV)2u zLQbLvyjg)eaC#JwPvD4V0{1p002ovPDHLk FV1jR;pN9Yd literal 0 HcmV?d00001 diff --git a/app/javascript/images/icon_pin.png b/app/javascript/images/icon_pin.png new file mode 100644 index 0000000000000000000000000000000000000000..2329d8c54d8b1707771166c18ee74990a842f328 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A)o zB%;Kzv?L?Hh=GA)ruR9GQ|GWu$pcRp$B>A_Z^HxmniY6*&%R?d zZ@$apcTB_SnOWg7k&n&OP1HKReBIl`rNF{1U~yhoq1#}JL&7A1iS~+dn?(~#K3!JX zu=OU-Qn!}pRsCDlPUktT+86lEeQQuQzxa^|Q(uj#$A4-*+0)C?7f{3Za~5a(X5Qeh zhNi4_lk~nFFpCiTMZBH84jR)isK-3Y6Ryv>H5vfsn|NpGJghS>~b#5WP1^(CAc3*RW<#gz01~4doqdTg=;}VN+rIC?wp?&{)li8p(X_u>!P#&Mo_a zJwaQBeLqOC^nd^_yl9++kjpBcYPr;|2TyqmQpri#RrRmS&niP_5!kjYZk8{Hv#u*7 zGDmPBU9;P@*<@rjz?R=R*Cs%$z0Wn5l)jMQENge)oQ{3)ApurE86Wt5K4>fg^;*w( znn2S7<@_!$lk;RUJKxXq?q9o+2XtdUup*Qevtm%5cO#<@Q(!eFV&;7k_)!W55;jY0 z^7+}9(OreaK5C=Uoch~yXW9eV2iF&|_JdB#C>=TlOE2023g@}tn)R>etjH5zTofqf z7h_$HR9-xP2o!yIi#skaf;Ws7r#C(4Q WVruvNdu`AF0000b&Wn>zY40sxmSf%sv>lo1<*wT=?ilad}bAV zzu!#a^J%ZPa|zt8nO=t6$-SNQBxm#i-6~Tf5}$-bR$OVbK%z=SlMXgCLjxp*h)@Ge|0-|}bGT8icT!=xr4@1=NGf`+!Huk%2oWcYCFJj@@MhILC`?W7+%C z^L7Ndh=kk+kETJ2>f^;xl{C<6R&t%^KuM71N#FM8O)5I8)sjSwhy?e#CL!quuVgiK zYZ9uF7r(8;avcQ+UId3{@IFU~?f*QEXH<5rWa-IwfoxXTsMandDLoES<%<;4qZCAO zf=HuRsqjnvP*vo^8aV4glgQ&&opPN4UNkEeG2B-Kh9V#juRAXtSN1gX<8iU&O$`G1L2;#;Nn(XBZi{XED9tJDB_lsAQU_i(`n!#MU5Bz9R}e-m5IX zM7~|?|BUVYqi3BN9+w%6#he6h^hH`M_u-y%J#*{D3at+z{EC~y+0Bl;U#E5P-?d(& zEskm{qVkSKALU5csJYq0f8GQx-JY`x>~Ea;H^U{!^3`UQ+=;=G%B5zr8-BYkoEx1k z&b5#Ej_%aF8lH(?ZtU4VJ&fP{=y4Av?vVVH=wH+80-QhV@2?M!W8CaC3+O@yPgg&e IbxsLQ0B15`MF0Q* literal 0 HcmV?d00001 diff --git a/app/javascript/styles/win95.scss b/app/javascript/styles/win95.scss new file mode 100644 index 000000000..994fab4bf --- /dev/null +++ b/app/javascript/styles/win95.scss @@ -0,0 +1,1457 @@ +$win95-bg: #bfbfbf; +$win95-window-header: #00007f; +$win95-tooltip-yellow: #ffffcc; + +@mixin win95-border-outset() { + border-left: 2px solid #efefef; + border-top: 2px solid #efefef; + border-right: 2px solid #404040; + border-bottom: 2px solid #404040; + border-radius:0px; +} + +@mixin win95-outset() { + box-shadow: inset -1px -1px 0px #000000, + inset 1px 1px 0px #ffffff, + inset -2px -2px 0px #808080, + inset 2px 2px 0px #dfdfdf; + border-radius:0px; +} + +@mixin win95-border-inset() { + border-left: 2px solid #404040; + border-top: 2px solid #404040; + border-right: 2px solid #efefef; + border-bottom: 2px solid #efefef; + border-radius:0px; +} + +@mixin win95-border-slight-inset() { + border-left: 1px solid #404040; + border-top: 1px solid #404040; + border-right: 1px solid #efefef; + border-bottom: 1px solid #efefef; + border-radius:0px; +} + +@mixin win95-inset() { + box-shadow: inset 1px 1px 0px #000000, + inset -1px -1px 0px #ffffff, + inset 2px 2px 0px #808080, + inset -2px -2px 0px #dfdfdf; + border-width:0px; + border-radius:0px; +} + + +@mixin win95-tab() { + box-shadow: inset -1px 0px 0px #000000, + inset 1px 0px 0px #ffffff, + inset 0px 1px 0px #ffffff, + inset 0px 2px 0px #dfdfdf, + inset -2px 0px 0px #808080, + inset 2px 0px 0px #dfdfdf; + border-radius:0px; + border-top-left-radius: 1px; + border-top-right-radius: 1px; +} + +@mixin win95-reset() { + box-shadow: unset; +} + +@font-face { + font-family:"premillenium"; + src: url('../fonts/premillenium/MSSansSerif.ttf') format('truetype'); +} + +@import 'application'; + +body { + font-size:13px; + font-family: "MS Sans Serif", "premillenium", sans-serif; + color:black; +} + +.ui, +.ui .columns-area, +body.admin { + background: #008080; +} + +.loading-bar { + height:5px; + background-color: #000080; +} + +.tabs-bar { + background: $win95-bg; + @include win95-outset() + height: 30px; +} + +.tabs-bar__link { + color:black; + border:2px outset $win95-bg; + border-top-width: 1px; + border-left-width: 1px; + margin:2px; + padding:3px; +} + +.tabs-bar__link.active { + @include win95-inset(); + color:black; +} + +.tabs-bar__link:last-child::before { + content:"Start"; + color:black; + font-weight:bold; + font-size:15px; + width:80%; + display:block; + position:absolute; + right:0px; +} + +.tabs-bar__link:last-child { + position:relative; + flex-basis:60px !important; + font-size:0px; + color:$win95-bg; + + background-image: url("../images/start.png"); + background-repeat:no-repeat; + background-position:8%; + background-clip:padding-box; + background-size:auto 50%; +} + +.drawer .drawer__inner { + overflow: visible; + height:inherit; +} + +.drawer__pager { + overflow-y:auto; +} + +.column { + max-height:100vh; +} + +.column > .scrollable { + background: $win95-bg; + @include win95-border-outset() + border-top-width:0px; +} + +.column-header__wrapper { + color:white; + font-weight:bold; + background:#7f7f7f; +} + +.column-header { + padding:2px; + font-size:13px; + background:#7f7f7f; + @include win95-border-outset() + border-bottom-width:0px; + color:white; + font-weight:bold; +} + +.column-header__wrapper.active { + background:$win95-window-header; +} + +.column-header__wrapper.active::before { + display:none; +} +.column-header.active { + box-shadow:unset; + background:$win95-window-header; +} + +.column-header.active .column-header__icon { + color:white; +} + +.column-header__button { + background: $win95-bg; + color: black; + line-height:0px; + font-size:14px; + max-height:20px; + padding:0px 2px; + margin-top:2px; + @include win95-outset() +} + +.column-header__button.active, .column-header__button.active:hover { + @include win95-inset(); + background-color:#7f7f7f; +} + +.column-header__back-button { + background: $win95-bg; + color: black; + padding:2px; + max-height:20px; + margin-top:2px; + @include win95-outset() + font-size:13px; + font-weight:bold; +} + +.column-back-button { + background:$win95-bg; + color:black; + @include win95-outset() + padding:2px; + font-size:13px; + font-weight:bold; +} + +.column-back-button--slim-button { + position:absolute; + top:-22px; + right:4px; + max-height:20px; + max-width:60px; + padding:0px 2px; +} + +.column-back-button__icon { + font-size:11px; + margin-top:-3px; +} + +.column-header__collapsible { + border-left:2px outset $win95-bg; + border-right:2px outset $win95-bg; +} + +.column-header__collapsible-inner { + background:$win95-bg; + color:black; +} + +.column-header__collapsible__extra { + color:black; +} + +.column-header__collapsible__extra div[role="group"] { + border: 2px groove $win95-bg; + border-radius:4px; + margin-bottom:8px; + padding:4px; +} + +.column-settings__section { + color:black; + font-weight:bold; + font-size:11px; + position:relative; + top: -12px; + left:4px; + background-color:$win95-bg; + display:inline-block; + padding:0px 4px; + margin-bottom:0px; +} + +.setting-meta__label, .setting-toggle__label { + color:black; + font-weight:normal; +} + +.setting-meta__label span:before { + content:"("; +} +.setting-meta__label span:after { + content:")"; +} + +.setting-toggle { + line-height:13px; +} + +.react-toggle .react-toggle-track { + border-radius:0px; + background-color:white; + @include win95-border-inset(); + + width:12px; + height:12px; +} + +.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track { + background-color:white; +} + +.react-toggle .react-toggle-track-check { + left:2px; + transition:unset; +} + +.react-toggle .react-toggle-track-check svg path { + fill: black; +} + +.react-toggle .react-toggle-track-x { + display:none; +} + +.react-toggle .react-toggle-thumb { + border-radius:0px; + display:none; +} + +.text-btn { + background-color:$win95-bg; + @include win95-outset() + padding:4px; +} + +.text-btn:hover { + text-decoration:none; + color:black; +} + +.text-btn:active { + @include win95-inset(); +} + +.setting-text { + color:black; + background-color:white; + @include win95-inset(); + font-size:13px; + padding:2px; +} + +.setting-text:active, .setting-text:focus, +.setting-text.light:active, .setting-text.light:focus { + color:black; + border-bottom:2px inset $win95-bg; +} + +.column-header__setting-arrows .column-header__setting-btn { + padding:3px 10px; +} + +.column-header__setting-arrows .column-header__setting-btn:last-child { + padding:3px 10px; +} + +.missing-indicator { + background-color:$win95-bg; + color:black; + @include win95-outset() +} + +.missing-indicator > div { + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRUaXRsZQAACJnLyy9Jyy/NSwEAD5IDblIFOhoAAAAXelRYdEF1dGhvcgAACJlLzijKz0vMAQALmgLoDsFj8gAAAQpJREFUOMuVlD0OwjAMhd2oQl04Axfo0IGBgYELcAY6cqQuSO0ZOEAZGBg6VKg74gwsEaoESRVHjusI8aQqzY8/PbtOEz1qkFSn2YevlaNOpLMJh2DwvixhuXtOa6/LCh51DUMEFkAsgAZD207Doin8mQ562JpRE5CHBAAhmIqD1L8AqzUUUJkxc6kr3AgAJ+NuvIWRdk7WcrKl0AUqcIBBHOiEbpS4m27mIL5Onfg3k0rgggeQuS2sDOGSahKR+glgqaGLgUJs951NN1q9D72cQqQWR9cr3sm9YcEssEuz6eEuZh2bu0aSOhQ1MBezu2O/+TVSvEFII3qLsZWrSA2AAUQIh1HpyP/kC++zjVSMj6ntAAAAAElFTkSuQmCC') + no-repeat; + background-position:center center; +} + +.empty-column-indicator, +.error-column { + background: $win95-bg; + color: black; +} + +.status__wrapper { + border: 2px groove $win95-bg; + margin:4px; +} + +.status { + @include win95-border-slight-inset(); + background-color:white; + margin:4px; + padding-bottom:40px; + margin-bottom:8px; +} + +.status.status-direct { + background-color:$win95-bg; +} + +.status__content { + font-size:13px; +} + +.status.light .status__relative-time, +.status.light .display-name span { + color: #7f7f7f; +} + +.status__action-bar { + box-sizing:border-box; + position:absolute; + bottom:-1px; + left:-1px; + background:$win95-bg; + width:calc(100% + 2px); + padding-left:10px; + padding: 4px 2px; + padding-bottom:4px; + border-bottom:2px groove $win95-bg; + border-top:1px outset $win95-bg; + text-align: right; +} + +.status__wrapper .status__action-bar { + border-bottom-width:0px; +} + +.status__action-bar-button { + float:right; +} + +.status__action-bar-dropdown { + margin-left:auto; + margin-right:10px; +} +.status.light .status__content a { + color:blue; +} + +.dropdown__trigger.icon-button { + padding-right:6px; +} + +.detailed-status { + background:white; + background-clip:padding-box; + margin:4px; + border: 2px groove $win95-bg; + padding:4px; +} + +.detailed-status__display-name { + color:#7f7f7f; +} + +.detailed-status__display-name strong { + color:black; + font-weight:bold; +} +.account__avatar, +.account__avatar-overlay-base, +.account__header__avatar, +.account__avatar-overlay-overlay { + @include win95-border-slight-inset(); + clip-path:none; + filter: saturate(1.8) brightness(1.1); +} + +.detailed-status__action-bar { + background-color:$win95-bg; + border:0px; + border-bottom:2px groove $win95-bg; + margin-bottom:8px; + justify-items:left; + padding-left:4px; +} +.icon-button { + background:$win95-bg; + @include win95-border-outset() + padding:0px 0px 0px 0px; + margin-right:4px; +} +.icon-button, +.icon-button.inverted, +.icon-button:hover, +.icon-button.inverted:hover { + color:#3f3f3f; +} + +.icon-button:active { + @include win95-border-inset(); +} + +.status__action-bar > .icon-button { + padding:0px 15px 0px 0px; + min-width:25px; +} + +.icon-button.star-icon, +.icon-button.star-icon:active { + background:transparent; + border:none; +} + +.icon-button.star-icon > i { + background:$win95-bg; + @include win95-border-outset() + padding-bottom:3px; +} + +.icon-button.star-icon:active > i { + @include win95-border-inset(); +} + +.detailed-status__action-bar-dropdown { + margin-left:auto; + justify-content:right; + padding-right:16px; +} + +.detailed-status__button { + flex:0 0 auto; +} + +.detailed-status__button .icon-button { + padding-left:2px; + padding-right:25px; +} + +.status-card { + border-radius:0px; + background:white; + border: 1px solid black; + color:black; +} + +.status-card:hover { + background-color:white; +} + +.status-card__title { + color:blue; + text-decoration:underline; + font-weight:bold; +} + +.load-more { + width:auto; + margin:5px auto; + background: $win95-bg; + @include win95-outset(); + color:black; + padding: 2px 5px; + + &:hover { + background: $win95-bg; + color:black; + } +} + +.status-card__description { + color:black; +} + +.account__display-name strong, .status__display-name strong { + color:black; + font-weight:bold; +} + +.account .account__display-name { + color:black; +} + +.account { + border-bottom: 2px groove $win95-bg; +} + +.reply-indicator__content .status__content__spoiler-link, .status__content .status__content__spoiler-link { + background:$win95-bg; + @include win95-outset() +} + +.reply-indicator__content .status__content__spoiler-link:hover, .status__content .status__content__spoiler-link:hover { + background:$win95-bg; +} + +.reply-indicator__content .status__content__spoiler-link:active, .status__content .status__content__spoiler-link:active { + @include win95-inset(); +} + +.reply-indicator__content a, .status__content a { + color:blue; +} + +.notification { + border: 2px groove $win95-bg; + margin:4px; +} + +.notification__message { + color:black; + font-size:13px; +} + +.notification__display-name { + font-weight:bold; +} + + +.drawer__header { + background: $win95-bg; + @include win95-border-outset() + justify-content:left; + margin-bottom:0px; + padding-bottom:2px; + border-bottom:2px groove $win95-bg; +} + +.drawer__tab { + color:black; + @include win95-outset() + padding:5px; + margin:2px; + flex: 0 0 auto; +} + +.drawer__tab:first-child::before { + content:"Start"; + color:black; + font-weight:bold; + font-size:15px; + width:80%; + display:block; + position:absolute; + right:0px; + +} + +.drawer__tab:first-child { + position:relative; + padding:5px 15px; + width:40px; + font-size:0px; + color:$win95-bg; + + background-image: url("../images/start.png"); + background-repeat:no-repeat; + background-position:8%; + background-clip:padding-box; + background-size:auto 50%; +} + +.drawer__header a:hover { + background-color:transparent; +} + +.drawer__header a:first-child:hover { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII="); + background-repeat:no-repeat; + background-position:8%; + background-clip:padding-box; + background-size:auto 50%; + transition:unset; +} + +.drawer__tab:first-child { + +} + +.search { + background:$win95-bg; + padding-top:2px; + padding:2px; + border:2px outset $win95-bg; + border-top-width:0px; + border-bottom: 2px groove $win95-bg; + margin-bottom:0px; +} + +.search input { + background-color:white; + color:black; + @include win95-border-slight-inset(); +} + +.search__input:focus { + background-color:white; +} + +.search-results__header { + background-color: $win95-bg; + color:black; + border-bottom:2px groove $win95-bg; +} + +.search-results__hashtag { + color:blue; +} + +.search-results__section .account:hover, +.search-results__section .account:hover .account__display-name, +.search-results__section .account:hover .account__display-name strong, +.search-results__section .search-results__hashtag:hover { + background-color:$win95-window-header; + color:white; +} + +.drawer__inner, +.drawer__inner.darker { + background-color:$win95-bg; + border: 2px outset $win95-bg; + border-top-width:0px; +} + +.navigation-bar { + color:black; +} + +.navigation-bar strong { + color:black; + font-weight:bold; +} + +.autosuggest-textarea__textarea, .spoiler-input__input { + border-radius:0px; + @include win95-border-slight-inset(); +} + +.autosuggest-textarea__textarea { + border-bottom:0px; +} + +.compose-form__uploads-wrapper { + border-radius:0px; + border-bottom:1px inset $win95-bg; + border-top-width:0px; +} + +.compose-form__upload-wrapper { + border-left:1px inset $win95-bg; + border-right:1px inset $win95-bg; +} + +.compose-form__buttons { + background-color:$win95-bg; + border-radius:0px; + box-shadow:unset; + border:2px groove $win95-bg; + margin-top:4px; + padding:4px 8px; +} + +.privacy-dropdown.active +.privacy-dropdown__value { + background: $win95-bg; + box-shadow:unset; +} + +.privacy-dropdown__option.active, .privacy-dropdown__option:hover, +.privacy-dropdown__option.active:hover { + background:$win95-window-header; +} + +.privacy-dropdown.active .privacy-dropdown__dropdown { + box-shadow:unset; + color:black; + @include win95-outset() + background: $win95-bg; +} + +.privacy-dropdown__option__content { + color:black; +} + +.privacy-dropdown__option__content strong { + font-weight:bold; +} + +.compose-form__warning::before { + content:"Tip:"; + font-weight:bold; + display:block; + position:absolute; + top:-10px; + background-color:$win95-bg; + font-size:11px; + padding: 0px 5px; +} + +.compose-form__warning { + position:relative; + box-shadow:unset; + border:2px groove $win95-bg; + background-color:$win95-bg; + color:black; +} + +.compose-form__warning a { + color:blue; +} + +.compose-form__warning strong { + color:black; + text-decoration:underline; +} + +.compose-form__buttons button.active:last-child { + @include win95-border-inset(); + background: #dfdfdf; + color:#7f7f7f; +} + +.compose-form__upload-thumbnail { + border-radius:0px; + border:2px groove $win95-bg; + background-color:$win95-bg; + padding:2px; + box-sizing:border-box; +} + +.compose-form__upload-thumbnail .icon-button { + max-width:20px; + max-height:20px; + line-height:10px !important; +} + +.compose-form__upload-thumbnail .icon-button::before { + content:"X"; + font-size:13px; + font-weight:bold; + color:black; +} + +.compose-form__upload-thumbnail .icon-button i { + display:none; +} + +.emoji-dialog.with-search { + box-shadow:unset; + border-radius:0px; + background-color:$win95-bg; + border:1px solid black; + box-sizing:content-box; + +} + +.emoji-dialog .emoji-search { + color:black; + background-color:white; + border-radius:0px; + @include win95-inset(); +} + +.emoji-dialog .emoji-search-wrapper { + border-bottom:2px groove $win95-bg; +} + +.emoji-dialog .emoji-category-title { + color:black; + font-weight:bold; +} + +.reply-indicator { + background-color:$win95-bg; + border-radius:3px; + border:2px groove $win95-bg; +} + +.button { + background-color:$win95-bg; + @include win95-outset() + border-radius:0px; + color:black; + font-weight:bold; +} + +.button:hover, .button:focus { + background-color:$win95-bg; +} + +.button:active { + @include win95-inset(); +} + +#Getting-started { + background-color:$win95-bg; + @include win95-inset(); + border-bottom-width:0px; +} + +#Getting-started::before { + content:"Start"; + color:black; + font-weight:bold; + font-size:15px; + width:80%; + text-align:center; + display:block; + position:absolute; + right:2px; +} + +#Getting-started { + position:relative; + padding:5px 15px; + width:60px; + font-size:0px; + color:$win95-bg; + + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII="); + background-repeat:no-repeat; + background-position:8%; + background-clip:padding-box; + background-size:auto 50%; +} + +.column-subheading { + background-color:$win95-bg; + color:black; + font-size:0px; + border-bottom: 2px groove $win95-bg; + padding:0px; + margin:0px; +} + +.column-link { + background-color:transparent; + background-size:32px 32px; + background-repeat:no-repeat; + background-position: 36px 50%; + color:black; + padding-left:40px; + + &:hover { + background-color: $win95-window-header; + background-size:32px 32px; + background-repeat:no-repeat; + background-position: 36px 50%; + color:white; + } + + i { + font-size: 0px; + width:32px; + } +} + +.column-link[href="/web/timelines/public"] { + background-image: url("../images/icon_public.png"); + &:hover { background-image: url("../images/icon_public.png"); } +} +.column-link[href="/web/timelines/public/local"] { + background-image: url("../images/icon_local.png"); + &:hover { background-image: url("../images/icon_local.png"); } +} +.column-link[href="/web/pinned"] { + background-image: url("../images/icon_pin.png"); + &:hover { background-image: url("../images/icon_pin.png"); } +} +.column-link[href="/web/favourites"] { + background-image: url("../images/icon_likes.png"); + &:hover { background-image: url("../images/icon_likes.png"); } +} +.column-link[href="/web/blocks"] { + background-image: url("../images/icon_blocks.png"); + &:hover { background-image: url("../images/icon_blocks.png"); } +} +.column-link[href="/web/mutes"] { + background-image: url("../images/icon_mutes.png"); + &:hover { background-image: url("../images/icon_mutes.png"); } +} +.column-link[href="/settings/preferences"] { + background-image: url("../images/icon_settings.png"); + &:hover { background-image: url("../images/icon_settings.png"); } +} +.column-link[href="/about/more"] { + background-image: url("../images/icon_about.png"); + &:hover { background-image: url("../images/icon_about.png"); } +} +.column-link[href="/auth/sign_out"] { + background-image: url("../images/icon_logout.png"); + &:hover { background-image: url("../images/icon_logout.png"); } +} + +.getting-started__footer { + display:none; +} + +.getting-started__wrapper::before { + content:"Mastodon 95"; + font-weight:bold; + font-size:23px; + color:white; + line-height:30px; + padding-left:20px; + padding-right:40px; + + left:0px; + bottom:-30px; + display:block; + position:absolute; + background-color:#7f7f7f; + width:200%; + height:30px; + + -ms-transform: rotate(-90deg); + + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + transform-origin:top left; +} + +.getting-started__wrapper { + @include win95-border-outset() + background-color:$win95-bg; +} + +.account__header { + background-color:#7f7f7f; +} + +.account__header .account__header__content { + color:white; +} + +.account__action-bar__tab > span { + color:black; + font-weight:bold; +} + +.account__action-bar__tab strong { + color:black; +} + +.account__action-bar { + border: unset; +} + +.account__action-bar__tab { + border: 1px outset $win95-bg; +} + +.account__action-bar__tab:active { + @include win95-inset(); +} + +.dropdown--active .dropdown__content > ul { + background:$win95-tooltip-yellow; + border-radius:0px; + border:1px solid black; + box-shadow:unset; +} + +.dropdown--active::after { + display:none; +} + +.dropdown--active .icon-button { + color:black; + @include win95-inset(); +} + +.dropdown--active .dropdown__content > ul > li > a { + background:transparent; +} + +.dropdown--active .dropdown__content > ul > li > a:hover { + background:transparent; + color:black; + text-decoration:underline; +} + +.dropdown__sep { + border-color:#7f7f7f; +} + +.detailed-status__action-bar-dropdown .dropdown--active .dropdown__content.dropdown__left { + left:unset; +} + +.dropdown > .icon-button, .detailed-status__button > .icon-button, +.status__action-bar > .icon-button, .star-icon i { + /* i don't know what's going on with the inline + styles someone should look at the react code */ + height: 25px !important; + width: 28px !important; + box-sizing: border-box; +} + +.status__action-bar-button .fa-floppy-o { + padding-top: 2px; +} + +.status__action-bar-dropdown { + position: relative; + top: -3px; +} + +.detailed-status__action-bar-dropdown .dropdown { + position: relative; + top: -4px; +} + +.notification .status__action-bar { + border-bottom: none; +} + +.notification .status { + margin-bottom: 4px; +} + +.status__wrapper .status { + margin-bottom: 3px; +} + +.status__wrapper { + margin-bottom: 8px; +} + +.icon-button .fa-retweet { + position: relative; + top: -1px; +} + +.embed-modal, .error-modal, .onboarding-modal, +.actions-modal, .boost-modal, .confirmation-modal, .report-modal { + @include win95-outset() + background:$win95-bg; +} + +.actions-modal::before, +.boost-modal::before, +.confirmation-modal::before, +.report-modal::before { + content: "Confirmation"; + display:block; + background:$win95-window-header; + color:white; + font-weight:bold; + padding-left:2px; +} + +.boost-modal::before { + content: "Boost confirmation"; +} + +.boost-modal__action-bar > div > span:before { + content: "Tip: "; + font-weight:bold; +} + +.boost-modal__action-bar, .confirmation-modal__action-bar, .report-modal__action-bar { + background:$win95-bg; + margin-top:-15px; +} + +.embed-modal h4, .error-modal h4, .onboarding-modal h4 { + background:$win95-window-header; + color:white; + font-weight:bold; + padding:2px; + font-size:13px; + text-align:left; +} + +.confirmation-modal__action-bar { + .confirmation-modal__cancel-button { + color:black; + + &:active, + &:focus, + &:hover { + color:black; + } + + &:active { + @include win95-inset(); + } + } +} + +.embed-modal .embed-modal__container .embed-modal__html, +.embed-modal .embed-modal__container .embed-modal__html:focus { + background:white; + color:black; + @include win95-inset(); +} + +.modal-root__overlay, +.account__header > div { + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAFnpUWHRUaXRsZQAACJnLzU9JzElKBwALgwLXaCRlPwAAABd6VFh0QXV0aG9yAAAImUvOKMrPS8wBAAuaAugOwWPyAAAAEUlEQVQImWNgYGD4z4AE/gMADwMB/414xEUAAAAASUVORK5CYII='); +} + + +.admin-wrapper::before { + position:absolute; + top:0px; + content:"Control Panel"; + color:white; + background-color:$win95-window-header; + font-size:13px; + font-weight:bold; + width:calc(100%); + margin: 2px; + display:block; + padding:2px; + padding-left:22px; + box-sizing:border-box; +} + +.admin-wrapper { + position:relative; + background: $win95-bg; + @include win95-outset() + width:70vw; + height:80vh; + margin:10vh auto; + color: black; + padding-top:24px; + flex-direction:column; + overflow:hidden; +} + +.admin-wrapper .sidebar-wrapper { + position:static; + height:auto; + flex: 0 0 auto; + margin:2px; +} + +.admin-wrapper .content-wrapper { + flex: 1 1 auto; + width:calc(100% - 20px); + @include win95-border-outset() + position:relative; + margin-left:10px; + margin-right:10px; + margin-bottom:40px; + box-sizing:border-box; +} + +.admin-wrapper .content { + background-color: $win95-bg; + width: 100%; + max-width:100%; + min-height:100%; + box-sizing:border-box; + position:relative; +} + +.admin-wrapper .sidebar { + position:static; + background: $win95-bg; + color:black; + width: 100%; + height:auto; + padding-bottom: 20px; +} + +.admin-wrapper .sidebar .logo { + position:absolute; + top:2px; + left:4px; + width:18px; + height:18px; + margin:0px; +} + +.admin-wrapper .sidebar > ul { + background: $win95-bg; + margin:0px; + margin-left:8px; + color:black; + + & > li { + display:inline-block; + + &#settings, + &#admin { + padding:2px; + border: 0px solid transparent; + } + + &#logout { + position:absolute; + @include win95-outset(); + right:12px; + bottom:10px; + } + + &#web { + display:inline-block; + @include win95-outset(); + position:absolute; + left: 12px; + bottom: 10px; + } + + & > a { + display:inline-block; + @include win95-tab(); + padding:2px 5px; + margin:0px; + color:black; + vertical-align:baseline; + + &.selected { + background: $win95-bg; + color:black; + padding-top: 4px; + padding-bottom:4px; + } + + &:hover { + background: $win95-bg; + color:black; + } + } + + & > ul { + width:calc(100% - 20px); + background: transparent; + position:absolute; + left: 10px; + top:54px; + z-index:3; + + & > li { + background: $win95-bg; + display: inline-block; + vertical-align:baseline; + + & > a { + background: $win95-bg; + @include win95-tab(); + color:black; + padding:2px 5px; + position:relative; + z-index:3; + + &.selected { + background: $win95-bg; + color:black; + padding-bottom:4px; + padding-top: 4px; + padding-right:7px; + margin-left:-2px; + margin-right:-2px; + position:relative; + z-index:4; + + &:first-child { + margin-left:0px; + } + + &:hover { + background: transparent; + color:black; + } + } + + &:hover { + background: $win95-bg; + color:black; + } + } + } + } + } +} + +.flash-message { + background-color:$win95-tooltip-yellow; + color:black; + border:1px solid black; + border-radius:0px; + position:absolute; + top:0px; + left:0px; + width:100%; +} + +.admin-wrapper table { + background-color: white; + @include win95-border-slight-inset(); +} + +.admin-wrapper .content h2, +.simple_form .input.with_label .label_input > label, +.admin-wrapper .content h6, +.admin-wrapper .content > p, +.admin-wrapper .content .muted-hint, +.simple_form span.hint, +.simple_form .check_boxes .checkbox label, +.simple_form .input.with_label.boolean .label_input > label, +.filters .filter-subset a, +.simple_form .input.radio_buttons .radio label, +a.table-action-link, +.simple_form .input.with_block_label > label, +.simple_form p.hint { + color:black; +} + +.table > tbody > tr:nth-child(2n+1) > td, +.table > tbody > tr:nth-child(2n+1) > th { + background-color:white; +} + +.simple_form input[type=text], +.simple_form input[type=number], +.simple_form input[type=email], +.simple_form input[type=password], +.simple_form textarea { + color:black; + background-color:white; + @include win95-border-slight-inset(); +} + +.simple_form button, +.simple_form .button, +.simple_form .block-button +{ + background: $win95-bg; + @include win95-outset() + color:black; + font-weight: normal; + + &:hover { + background: $win95-bg; + } +} + +.simple_form button.negative, +.simple_form .button.negative, +.simple_form .block-button.negative +{ + background: $win95-bg; +} + +.filters .filter-subset { + border: 2px groove $win95-bg; + padding:2px; +} + +.filters .filter-subset a::before { + content: ""; + background-color:white; + border-radius:50%; + border:2px solid black; + border-top-color:#7f7f7f; + border-left-color:#7f7f7f; + border-bottom-color:#f5f5f5; + border-right-color:#f5f5f5; + width:12px; + height:12px; + display:inline-block; + vertical-align:middle; + margin-right:2px; +} + +.filters .filter-subset a.selected::before { + background-color:black; + box-shadow: inset 0 0 0 3px white; +} + +.filters .filter-subset a, +.filters .filter-subset a:hover, +.filters .filter-subset a.selected { + color:black; + border-bottom: 0px solid transparent; +} + diff --git a/config/themes.yml b/config/themes.yml index a1049fae7..bbf8d0f6c 100644 --- a/config/themes.yml +++ b/config/themes.yml @@ -1 +1,2 @@ default: styles/application.scss +win95: styles/win95.scss From c23844418839eea6a0f4c42e146683643996232b Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 14 Nov 2017 01:22:48 -0800 Subject: [PATCH 02/13] Updates and fixes to win95 theme --- app/javascript/styles/win95.scss | 219 +++++++++++++++++++++++++++++-- 1 file changed, 206 insertions(+), 13 deletions(-) diff --git a/app/javascript/styles/win95.scss b/app/javascript/styles/win95.scss index 994fab4bf..885837b53 100644 --- a/app/javascript/styles/win95.scss +++ b/app/javascript/styles/win95.scss @@ -1,6 +1,12 @@ $win95-bg: #bfbfbf; +$win95-dark-grey: #404040; +$win95-mid-grey: #808080; $win95-window-header: #00007f; $win95-tooltip-yellow: #ffffcc; +$win95-blue: blue; + +$ui-base-lighter-color: $win95-dark-grey; +$ui-highlight-color: $win95-window-header; @mixin win95-border-outset() { border-left: 2px solid #efefef; @@ -67,6 +73,53 @@ $win95-tooltip-yellow: #ffffcc; @import 'application'; +/* borrowed from cybrespace style: wider columns and full column width images */ + +@media screen and (min-width: 1300px) { + .column { + flex-grow: 1 !important; + max-width: 400px; + } + + .drawer { + width: 17%; + max-width: 400px; + min-width: 330px; + } +} + +.media-gallery, +.video-player { + max-height:30vh; + height:30vh !important; + position:relative; + margin-top:20px; + margin-left:-68px; + width: calc(100% + 80px) !important; + max-width: calc(100% + 80px); +} + +.detailed-status .media-gallery, +.detailed-status .video-player { + margin-left:-5px; + width: calc(100% + 9px); + max-width: calc(100% + 9px); +} + +.video-player video { + transform: unset; + top: unset; +} + +.detailed-status .media-spoiler, +.status .media-spoiler { + height: 100%!important; + vertical-align: middle; +} + + +/* main win95 style */ + body { font-size:13px; font-family: "MS Sans Serif", "premillenium", sans-serif; @@ -417,15 +470,35 @@ body.admin { .status__action-bar-dropdown { margin-left:auto; margin-right:10px; + + .icon-button { + min-width:28px; + } } .status.light .status__content a { color:blue; } +.focusable:focus { + background: $win95-bg; + .detailed-status__action-bar { + background: $win95-bg; + } + + .status, .detailed-status { + background: white; + outline:2px dotted $win95-mid-grey; + } +} + .dropdown__trigger.icon-button { padding-right:6px; } +.detailed-status__action-bar-dropdown .icon-button { + min-width:28px; +} + .detailed-status { background:white; background-clip:padding-box; @@ -464,12 +537,11 @@ body.admin { @include win95-border-outset() padding:0px 0px 0px 0px; margin-right:4px; -} -.icon-button, -.icon-button.inverted, -.icon-button:hover, -.icon-button.inverted:hover { + color:#3f3f3f; + &.inverted, &:hover, &.inverted:hover, &:active, &:focus { + color:#3f3f3f; + } } .icon-button:active { @@ -487,6 +559,13 @@ body.admin { border:none; } +.icon-button.star-icon.active { + color: $gold-star; + &:active, &:hover, &:focus { + color: $gold-star; + } +} + .icon-button.star-icon > i { background:$win95-bg; @include win95-border-outset() @@ -497,6 +576,10 @@ body.admin { @include win95-border-inset(); } +.text-icon-button { + color:$win95-dark-grey; +} + .detailed-status__action-bar-dropdown { margin-left:auto; justify-content:right; @@ -672,6 +755,20 @@ body.admin { background-color:white; } +.search-popout { + box-shadow: unset; + color:black; + border-radius:0px; + background-color:$win95-tooltip-yellow; + border:1px solid black; + + h4 { + color:black; + text-transform: none; + font-weight:bold; + } +} + .search-results__header { background-color: $win95-bg; color:black; @@ -690,6 +787,18 @@ body.admin { color:white; } +.search__icon .fa { + color:#808080; + + &.active { + opacity:1.0; + } + + &:hover { + color: #808080; + } +} + .drawer__inner, .drawer__inner.darker { background-color:$win95-bg; @@ -857,14 +966,24 @@ body.admin { border-radius:0px; color:black; font-weight:bold; -} -.button:hover, .button:focus { - background-color:$win95-bg; -} + &:hover, &:focus, &:disabled { + background-color:$win95-bg; + } + + &:active { + @include win95-inset(); + } + + &:disabled { + color: #808080; + text-shadow: 1px 1px 0px #efefef; + + &:active { + @include win95-outset(); + } + } -.button:active { - @include win95-inset(); } #Getting-started { @@ -1029,13 +1148,18 @@ body.admin { @include win95-inset(); } -.dropdown--active .dropdown__content > ul { +.dropdown--active .dropdown__content > ul, +.dropdown-menu { background:$win95-tooltip-yellow; border-radius:0px; border:1px solid black; box-shadow:unset; } +.dropdown-menu a { + background-color:transparent; +} + .dropdown--active::after { display:none; } @@ -1055,7 +1179,9 @@ body.admin { text-decoration:underline; } -.dropdown__sep { +.dropdown__sep, +.dropdown-menu__separator +{ border-color:#7f7f7f; } @@ -1206,6 +1332,23 @@ body.admin { overflow:hidden; } +@media screen and (max-width: 1120px) { + .admin-wrapper { + width:90vw; + height:95vh; + margin:2.5vh auto; + } +} + +@media screen and (max-width: 740px) { + .admin-wrapper { + width:100vw; + height:95vh; + height:calc(100vh - 24px); + margin:0px 0px 0px 0px; + } +} + .admin-wrapper .sidebar-wrapper { position:static; height:auto; @@ -1354,6 +1497,36 @@ body.admin { } } +@media screen and (max-width: 1520px) { + .admin-wrapper .sidebar > ul > li > ul { + max-width:1000px; + } + + .admin-wrapper .sidebar { + padding-bottom: 45px; + } +} + +@media screen and (max-width: 600px) { + .admin-wrapper .sidebar > ul > li > ul { + max-width:500px; + } + + .admin-wrapper { + .sidebar { + padding:0px; + padding-bottom: 70px; + width: 100%; + height: auto; + } + .content-wrapper { + overflow:auto; + height:80%; + height:calc(100% - 150px); + } + } +} + .flash-message { background-color:$win95-tooltip-yellow; color:black; @@ -1376,11 +1549,13 @@ body.admin { .admin-wrapper .content > p, .admin-wrapper .content .muted-hint, .simple_form span.hint, +.simple_form h4, .simple_form .check_boxes .checkbox label, .simple_form .input.with_label.boolean .label_input > label, .filters .filter-subset a, .simple_form .input.radio_buttons .radio label, a.table-action-link, +a.table-action-link:hover, .simple_form .input.with_block_label > label, .simple_form p.hint { color:black; @@ -1399,6 +1574,10 @@ a.table-action-link, color:black; background-color:white; @include win95-border-slight-inset(); + + &:active, &:focus { + background-color:white; + } } .simple_form button, @@ -1415,6 +1594,20 @@ a.table-action-link, } } +.simple_form .warning, .table-form .warning +{ + background: $win95-tooltip-yellow; + color:black; + box-shadow: unset; + text-shadow:unset; + border:1px solid black; + + a { + color: blue; + text-decoration:underline; + } +} + .simple_form button.negative, .simple_form .button.negative, .simple_form .block-button.negative From a9ed85717163040fb202d49b0342e9e350cb12ba Mon Sep 17 00:00:00 2001 From: kibigo! Date: Sat, 18 Nov 2017 15:12:52 -0800 Subject: [PATCH 03/13] WIP static themeing --- app/javascript/core/about.js | 1 + app/javascript/{packs => core}/admin.js | 2 + app/javascript/core/common.js | 5 ++ app/javascript/core/embed.js | 23 +++++++ app/javascript/core/home.js | 1 + app/javascript/core/public.js | 1 + app/javascript/core/settings.js | 65 +++++++++++++++++++ app/javascript/core/share.js | 1 + app/javascript/packs/application.js | 3 +- app/javascript/packs/common.js | 6 -- app/javascript/themes/glitch/index.js | 14 ---- .../{ => themes/glitch}/packs/about.js | 2 - app/javascript/themes/glitch/packs/common.js | 3 + app/javascript/themes/glitch/packs/home.js | 7 ++ .../{ => themes/glitch}/packs/public.js | 0 .../{ => themes/glitch}/packs/share.js | 2 - app/javascript/themes/glitch/theme.yml | 19 ++++-- app/javascript/themes/vanilla/theme.yml | 16 +++-- 18 files changed, 135 insertions(+), 36 deletions(-) create mode 100644 app/javascript/core/about.js rename app/javascript/{packs => core}/admin.js (95%) create mode 100644 app/javascript/core/common.js create mode 100644 app/javascript/core/embed.js create mode 100644 app/javascript/core/home.js create mode 100644 app/javascript/core/public.js create mode 100644 app/javascript/core/settings.js create mode 100644 app/javascript/core/share.js delete mode 100644 app/javascript/packs/common.js delete mode 100644 app/javascript/themes/glitch/index.js rename app/javascript/{ => themes/glitch}/packs/about.js (94%) create mode 100644 app/javascript/themes/glitch/packs/common.js create mode 100644 app/javascript/themes/glitch/packs/home.js rename app/javascript/{ => themes/glitch}/packs/public.js (100%) rename app/javascript/{ => themes/glitch}/packs/share.js (94%) diff --git a/app/javascript/core/about.js b/app/javascript/core/about.js new file mode 100644 index 000000000..6ed0e4ad3 --- /dev/null +++ b/app/javascript/core/about.js @@ -0,0 +1 @@ +// This file will be loaded on about pages, regardless of theme. diff --git a/app/javascript/packs/admin.js b/app/javascript/core/admin.js similarity index 95% rename from app/javascript/packs/admin.js rename to app/javascript/core/admin.js index 993827db5..c0bd09bdd 100644 --- a/app/javascript/packs/admin.js +++ b/app/javascript/core/admin.js @@ -1,3 +1,5 @@ +// This file will be loaded on admin pages, regardless of theme. + import { delegate } from 'rails-ujs'; function handleDeleteStatus(event) { diff --git a/app/javascript/core/common.js b/app/javascript/core/common.js new file mode 100644 index 000000000..24c0fdf61 --- /dev/null +++ b/app/javascript/core/common.js @@ -0,0 +1,5 @@ +// This file will be loaded on all pages, regardless of theme. + +import { start } from 'rails-ujs'; + +start(); diff --git a/app/javascript/core/embed.js b/app/javascript/core/embed.js new file mode 100644 index 000000000..8167706a3 --- /dev/null +++ b/app/javascript/core/embed.js @@ -0,0 +1,23 @@ +// This file will be loaded on embed pages, regardless of theme. + +window.addEventListener('message', e => { + const data = e.data || {}; + + if (!window.parent || data.type !== 'setHeight') { + return; + } + + function setEmbedHeight () { + window.parent.postMessage({ + type: 'setHeight', + id: data.id, + height: document.getElementsByTagName('html')[0].scrollHeight, + }, '*'); + }); + + if (['interactive', 'complete'].includes(document.readyState)) { + setEmbedHeight(); + } else { + document.addEventListener('DOMContentLoaded', setEmbedHeight); + } +}); diff --git a/app/javascript/core/home.js b/app/javascript/core/home.js new file mode 100644 index 000000000..3c2e01590 --- /dev/null +++ b/app/javascript/core/home.js @@ -0,0 +1 @@ +// This file will be loaded on home pages, regardless of theme. diff --git a/app/javascript/core/public.js b/app/javascript/core/public.js new file mode 100644 index 000000000..1a36b7a5f --- /dev/null +++ b/app/javascript/core/public.js @@ -0,0 +1 @@ +// This file will be loaded on public pages, regardless of theme. diff --git a/app/javascript/core/settings.js b/app/javascript/core/settings.js new file mode 100644 index 000000000..91332ed5a --- /dev/null +++ b/app/javascript/core/settings.js @@ -0,0 +1,65 @@ +// This file will be loaded on settings pages, regardless of theme. + +function main() { + const { length } = require('stringz'); + const { delegate } = require('rails-ujs'); + + delegate(document, '.webapp-btn', 'click', ({ target, button }) => { + if (button !== 0) { + return true; + } + window.location.href = target.href; + return false; + }); + + delegate(document, '.status__content__spoiler-link', 'click', ({ target }) => { + const contentEl = target.parentNode.parentNode.querySelector('.e-content'); + + if (contentEl.style.display === 'block') { + contentEl.style.display = 'none'; + target.parentNode.style.marginBottom = 0; + } else { + contentEl.style.display = 'block'; + target.parentNode.style.marginBottom = null; + } + + return false; + }); + + delegate(document, '.account_display_name', 'input', ({ target }) => { + const nameCounter = document.querySelector('.name-counter'); + + if (nameCounter) { + nameCounter.textContent = 30 - length(target.value); + } + }); + + delegate(document, '.account_note', 'input', ({ target }) => { + const noteCounter = document.querySelector('.note-counter'); + + if (noteCounter) { + const noteWithoutMetadata = processBio(target.value).text; + noteCounter.textContent = 500 - length(noteWithoutMetadata); + } + }); + + delegate(document, '#account_avatar', 'change', ({ target }) => { + const avatar = document.querySelector('.card.compact .avatar img'); + const [file] = target.files || []; + const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc; + + avatar.src = url; + }); + + delegate(document, '#account_header', 'change', ({ target }) => { + const header = document.querySelector('.card.compact'); + const [file] = target.files || []; + const url = file ? URL.createObjectURL(file) : header.dataset.originalSrc; + + header.style.backgroundImage = `url(${url})`; + }); +} + +loadPolyfills().then(main).catch(error => { + console.error(error); +}); diff --git a/app/javascript/core/share.js b/app/javascript/core/share.js new file mode 100644 index 000000000..98a413632 --- /dev/null +++ b/app/javascript/core/share.js @@ -0,0 +1 @@ +// This file will be loaded on share pages, regardless of theme. diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index 21dc78986..ee5bf244c 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -5,8 +5,7 @@ import loadPolyfills from '../mastodon/load_polyfills'; // import default stylesheet with variables -require('font-awesome/css/font-awesome.css'); - +import 'font-awesome/css/font-awesome.css'; import '../styles/application.scss'; require.context('../images/', true); diff --git a/app/javascript/packs/common.js b/app/javascript/packs/common.js deleted file mode 100644 index 96e6f4b16..000000000 --- a/app/javascript/packs/common.js +++ /dev/null @@ -1,6 +0,0 @@ -import { start } from 'rails-ujs'; -import 'font-awesome/css/font-awesome.css'; - -require.context('../images/', true); - -start(); diff --git a/app/javascript/themes/glitch/index.js b/app/javascript/themes/glitch/index.js deleted file mode 100644 index 407e1f767..000000000 --- a/app/javascript/themes/glitch/index.js +++ /dev/null @@ -1,14 +0,0 @@ -import loadPolyfills from './util/load_polyfills'; - -// import default stylesheet with variables -require('font-awesome/css/font-awesome.css'); - -import './styles/index.scss'; - -require.context('../../images/', true); - -loadPolyfills().then(() => { - require('./util/main').default(); -}).catch(e => { - console.error(e); -}); diff --git a/app/javascript/packs/about.js b/app/javascript/themes/glitch/packs/about.js similarity index 94% rename from app/javascript/packs/about.js rename to app/javascript/themes/glitch/packs/about.js index 6ce8757dc..9639d5453 100644 --- a/app/javascript/packs/about.js +++ b/app/javascript/themes/glitch/packs/about.js @@ -1,7 +1,5 @@ import loadPolyfills from 'themes/glitch/util/load_polyfills'; -require.context('../images/', true); - function loaded() { const TimelineContainer = require('themes/glitch/containers/timeline_container').default; const React = require('react'); diff --git a/app/javascript/themes/glitch/packs/common.js b/app/javascript/themes/glitch/packs/common.js new file mode 100644 index 000000000..3a62700bd --- /dev/null +++ b/app/javascript/themes/glitch/packs/common.js @@ -0,0 +1,3 @@ +import 'font-awesome/css/font-awesome.css'; +require.context('../../images/', true); +import './styles/index.scss'; diff --git a/app/javascript/themes/glitch/packs/home.js b/app/javascript/themes/glitch/packs/home.js new file mode 100644 index 000000000..dada28317 --- /dev/null +++ b/app/javascript/themes/glitch/packs/home.js @@ -0,0 +1,7 @@ +import loadPolyfills from './util/load_polyfills'; + +loadPolyfills().then(() => { + require('./util/main').default(); +}).catch(e => { + console.error(e); +}); diff --git a/app/javascript/packs/public.js b/app/javascript/themes/glitch/packs/public.js similarity index 100% rename from app/javascript/packs/public.js rename to app/javascript/themes/glitch/packs/public.js diff --git a/app/javascript/packs/share.js b/app/javascript/themes/glitch/packs/share.js similarity index 94% rename from app/javascript/packs/share.js rename to app/javascript/themes/glitch/packs/share.js index 9cd95bcee..dc2e677e4 100644 --- a/app/javascript/packs/share.js +++ b/app/javascript/themes/glitch/packs/share.js @@ -1,7 +1,5 @@ import loadPolyfills from 'themes/glitch/util/load_polyfills'; -require.context('../images/', true); - function loaded() { const ComposeContainer = require('themes/glitch/containers/compose_container').default; const React = require('react'); diff --git a/app/javascript/themes/glitch/theme.yml b/app/javascript/themes/glitch/theme.yml index 49fba8f40..cf3fa32c2 100644 --- a/app/javascript/themes/glitch/theme.yml +++ b/app/javascript/themes/glitch/theme.yml @@ -1,16 +1,23 @@ -# (REQUIRED) The location of the pack file inside `pack_directory`. -pack: index.js +# (REQUIRED) The location of the pack files. +pack: + about: packs/about.js + admin: null + common: packs/common.js + embed: null + home: packs/home.js + public: packs/public.js + settings: null + share: packs/share.js -# (OPTIONAL) The directory which contains the pack file. +# (OPTIONAL) The directory which contains the pack files. # Defaults to the theme directory (`app/javascript/themes/[theme]`), -# but in the case of the vanilla Mastodon theme the pack file is -# somewhere else. +# which should be sufficient for like 99% of use-cases lol. # pack_directory: app/javascript/packs # (OPTIONAL) Additional javascript resources to preload, for use with # lazy-loaded components. It is **STRONGLY RECOMMENDED** that you # derive these pathnames from `themes/[your-theme]` to ensure that -# they stay unique. (Of course, vanilla doesn't do this ^^;;) +# they stay unique. preload: - themes/glitch/async/getting_started - themes/glitch/async/compose diff --git a/app/javascript/themes/vanilla/theme.yml b/app/javascript/themes/vanilla/theme.yml index 0b262cc82..b4a1598fc 100644 --- a/app/javascript/themes/vanilla/theme.yml +++ b/app/javascript/themes/vanilla/theme.yml @@ -1,9 +1,17 @@ -# (REQUIRED) The location of the pack file inside `pack_directory`. -pack: application.js +# (REQUIRED) The location of the pack files inside `pack_directory`. +pack: + about: about.js + admin: null + common: common.js + embed: null + home: application.js + public: public.js + settings: null + share: share.js -# (OPTIONAL) The directory which contains the pack file. +# (OPTIONAL) The directory which contains the pack files. # Defaults to the theme directory (`app/javascript/themes/[theme]`), -# but in the case of the vanilla Mastodon theme the pack file is +# but in the case of the vanilla Mastodon theme the pack files are # somewhere else. pack_directory: app/javascript/packs From bdbbd06dad298dc3e1a5f568f4a3ff3635b48f22 Mon Sep 17 00:00:00 2001 From: kibigo! Date: Mon, 20 Nov 2017 22:13:37 -0800 Subject: [PATCH 04/13] Finalized theme loading and stuff --- app/controllers/about_controller.rb | 5 + app/controllers/accounts_controller.rb | 1 + app/controllers/admin/base_controller.rb | 7 +- app/controllers/application_controller.rb | 75 ++++++++++-- .../auth/confirmations_controller.rb | 7 ++ app/controllers/auth/passwords_controller.rb | 5 + .../auth/registrations_controller.rb | 5 + app/controllers/auth/sessions_controller.rb | 5 + .../authorize_follows_controller.rb | 5 + .../follower_accounts_controller.rb | 4 +- .../following_accounts_controller.rb | 4 +- app/controllers/home_controller.rb | 5 + app/controllers/remote_follow_controller.rb | 5 + .../settings/applications_controller.rb | 4 +- app/controllers/settings/base_controller.rb | 12 ++ .../settings/deletes_controller.rb | 4 +- .../settings/exports_controller.rb | 6 +- .../settings/follower_domains_controller.rb | 6 +- .../settings/imports_controller.rb | 5 +- .../settings/keyword_mutes_controller.rb | 5 +- .../settings/notifications_controller.rb | 6 +- .../settings/preferences_controller.rb | 6 +- .../settings/profiles_controller.rb | 5 +- .../settings/sessions_controller.rb | 1 + .../two_factor_authentications_controller.rb | 5 +- app/controllers/shares_controller.rb | 5 + app/controllers/statuses_controller.rb | 2 + app/controllers/stream_entries_controller.rb | 1 + app/controllers/tags_controller.rb | 1 + app/javascript/core/about.js | 1 - app/javascript/core/embed.js | 2 +- app/javascript/core/home.js | 1 - app/javascript/core/public.js | 24 ++++ app/javascript/core/settings.js | 80 ++++--------- app/javascript/core/share.js | 1 - app/javascript/core/theme.yml | 14 +++ app/javascript/locales/index.js | 9 ++ app/javascript/mastodon/locales/index.js | 10 +- app/javascript/packs/about.js | 22 ++++ app/javascript/packs/application.js | 10 -- app/javascript/packs/common.js | 3 + app/javascript/packs/public.js | 75 ++++++++++++ app/javascript/packs/share.js | 22 ++++ app/javascript/styles/common.scss | 5 - app/javascript/styles/win95.scss | 113 +++++++++--------- .../themes/glitch/containers/mastodon.js | 2 +- app/javascript/themes/glitch/packs/common.js | 4 +- app/javascript/themes/glitch/packs/home.js | 4 +- app/javascript/themes/glitch/packs/public.js | 83 +------------ app/javascript/themes/glitch/theme.yml | 39 +++--- app/javascript/themes/vanilla/theme.yml | 35 +++--- app/javascript/themes/win95/index.js | 10 ++ app/javascript/themes/win95/theme.yml | 23 ++++ app/lib/themes.rb | 12 ++ app/views/about/more.html.haml | 1 - app/views/about/show.html.haml | 1 - app/views/admin/reports/show.html.haml | 3 - app/views/admin/statuses/index.html.haml | 3 - app/views/home/index.html.haml | 6 - app/views/layouts/_theme.html.haml | 10 ++ app/views/layouts/admin.html.haml | 3 - app/views/layouts/application.html.haml | 10 +- app/views/layouts/auth.html.haml | 3 - app/views/layouts/embedded.html.haml | 7 +- app/views/layouts/error.html.haml | 4 +- app/views/layouts/modal.html.haml | 3 - app/views/layouts/public.html.haml | 3 - app/views/shares/show.html.haml | 1 - app/views/tags/show.html.haml | 1 - config/webpack/configuration.js | 13 +- config/webpack/generateLocalePacks.js | 2 +- config/webpack/shared.js | 40 ++++--- config/webpacker.yml | 12 -- 73 files changed, 566 insertions(+), 371 deletions(-) create mode 100644 app/controllers/settings/base_controller.rb delete mode 100644 app/javascript/core/about.js delete mode 100644 app/javascript/core/home.js delete mode 100644 app/javascript/core/share.js create mode 100644 app/javascript/core/theme.yml create mode 100644 app/javascript/locales/index.js create mode 100644 app/javascript/packs/about.js create mode 100644 app/javascript/packs/common.js create mode 100644 app/javascript/packs/public.js create mode 100644 app/javascript/packs/share.js delete mode 100644 app/javascript/styles/common.scss create mode 100644 app/javascript/themes/win95/index.js create mode 100644 app/javascript/themes/win95/theme.yml create mode 100644 app/views/layouts/_theme.html.haml diff --git a/app/controllers/about_controller.rb b/app/controllers/about_controller.rb index 47690e81e..8785df14e 100644 --- a/app/controllers/about_controller.rb +++ b/app/controllers/about_controller.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true class AboutController < ApplicationController + before_action :set_pack before_action :set_body_classes before_action :set_instance_presenter, only: [:show, :more, :terms] @@ -21,6 +22,10 @@ class AboutController < ApplicationController helper_method :new_user + def set_pack + use_pack action_name == 'show' ? 'about' : 'common' + end + def set_instance_presenter @instance_presenter = InstancePresenter.new end diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 75915b337..309cb65da 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -7,6 +7,7 @@ class AccountsController < ApplicationController def show respond_to do |format| format.html do + use_pack 'public' @pinned_statuses = [] if current_account && @account.blocking?(current_account) diff --git a/app/controllers/admin/base_controller.rb b/app/controllers/admin/base_controller.rb index db4839a8f..726134509 100644 --- a/app/controllers/admin/base_controller.rb +++ b/app/controllers/admin/base_controller.rb @@ -4,8 +4,13 @@ module Admin class BaseController < ApplicationController include Authorization + layout 'admin' + before_action :require_staff! + before_action :set_pack - layout 'admin' + def set_pack + use_pack 'admin' + end end end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f5dbe837e..7cc4eea27 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -12,8 +12,6 @@ class ApplicationController < ActionController::Base helper_method :current_account helper_method :current_session - helper_method :current_theme - helper_method :theme_data helper_method :single_user_mode? rescue_from ActionController::RoutingError, with: :not_found @@ -54,6 +52,69 @@ class ApplicationController < ActionController::Base new_user_session_path end + def pack(data, pack_name) + return nil unless pack?(data, pack_name) + pack_data = { + common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common'), + name: data['name'], + pack: pack_name, + preload: nil, + stylesheet: false + } + if data['pack'][pack_name].is_a?(Hash) + pack_data[:common] = nil if data['pack'][pack_name]['use_common'] == false + pack_data[:pack] = nil unless data['pack'][pack_name]['filename'] + if data['pack'][pack_name]['preload'] + pack_data[:preload] = [data['pack'][pack_name]['preload']] if data['pack'][pack_name]['preload'].is_a?(String) + pack_data[:preload] = data['pack'][pack_name]['preload'] if data['pack'][pack_name]['preload'].is_a?(Array) + end + pack_data[:stylesheet] = true if data['pack'][pack_name]['stylesheet'] + end + pack_data + end + + def pack?(data, pack_name) + if data['pack'].is_a?(Hash) && data['pack'].key?(pack_name) + return true if data['pack'][pack_name].is_a?(String) || data['pack'][pack_name].is_a?(Hash) + end + false + end + + def nil_pack(data, pack_name) + { + common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common'), + name: data['name'], + pack: nil, + preload: nil, + stylesheet: false + } + end + + def resolve_pack(data, pack_name) + result = pack(data, pack_name) + unless result + if data['name'] && data.key?('fallback') + if data['fallback'].nil? + return nil_pack(data, pack_name) + elsif data['fallback'].is_a?(String) && Themes.instance.get(data['fallback']) + return resolve_pack(Themes.instance.get(data['fallback']), pack_name) + elsif data['fallback'].is_a?(Array) + data['fallback'].each do |fallback| + return resolve_pack(Themes.instance.get(fallback), pack_name) if Themes.instance.get(fallback) + end + end + return nil_pack(data, pack_name) + end + return data.key?('name') && data['name'] != default_theme ? resolve_pack(Themes.instance.get(default_theme), pack_name) : nil_pack(data, pack_name) + end + result + end + + def use_pack(pack_name) + @core = resolve_pack(Themes.instance.core, pack_name) + @theme = resolve_pack(Themes.instance.get(current_theme), pack_name) + end + protected def forbidden @@ -84,13 +145,13 @@ class ApplicationController < ActionController::Base @current_session ||= SessionActivation.find_by(session_id: cookies.signed['_session_id']) end - def current_theme - return Setting.default_settings['theme'] unless Themes.instance.names.include? current_user&.setting_theme - current_user.setting_theme + def default_theme + Setting.default_settings['theme'] end - def theme_data - Themes.instance.get(current_theme) + def current_theme + return default_theme unless Themes.instance.names.include? current_user&.setting_theme + current_user.setting_theme end def cache_collection(raw, klass) diff --git a/app/controllers/auth/confirmations_controller.rb b/app/controllers/auth/confirmations_controller.rb index d5e8e58ed..5ffa1c9a3 100644 --- a/app/controllers/auth/confirmations_controller.rb +++ b/app/controllers/auth/confirmations_controller.rb @@ -2,10 +2,17 @@ class Auth::ConfirmationsController < Devise::ConfirmationsController layout 'auth' + before_action :set_pack def show super do |user| BootstrapTimelineWorker.perform_async(user.account_id) if user.errors.empty? end end + + private + + def set_pack + use_pack 'auth' + end end diff --git a/app/controllers/auth/passwords_controller.rb b/app/controllers/auth/passwords_controller.rb index 171b997dc..e0400aa3d 100644 --- a/app/controllers/auth/passwords_controller.rb +++ b/app/controllers/auth/passwords_controller.rb @@ -2,6 +2,7 @@ class Auth::PasswordsController < Devise::PasswordsController before_action :check_validity_of_reset_password_token, only: :edit + before_action :set_pack layout 'auth' @@ -17,4 +18,8 @@ class Auth::PasswordsController < Devise::PasswordsController def reset_password_token_is_valid? resource_class.with_reset_password_token(params[:reset_password_token]).present? end + + def set_pack + use_pack 'auth' + end end diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb index 223db96ff..cc7a69ab0 100644 --- a/app/controllers/auth/registrations_controller.rb +++ b/app/controllers/auth/registrations_controller.rb @@ -5,6 +5,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController before_action :check_enabled_registrations, only: [:new, :create] before_action :configure_sign_up_params, only: [:create] + before_action :set_path before_action :set_sessions, only: [:edit, :update] before_action :set_instance_presenter, only: [:new, :create, :update] @@ -40,6 +41,10 @@ class Auth::RegistrationsController < Devise::RegistrationsController private + def set_pack + use_pack %w(edit update).include?(action_name) ? 'admin' : 'auth' + end + def set_instance_presenter @instance_presenter = InstancePresenter.new end diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb index a5acb6c36..72d544102 100644 --- a/app/controllers/auth/sessions_controller.rb +++ b/app/controllers/auth/sessions_controller.rb @@ -9,6 +9,7 @@ class Auth::SessionsController < Devise::SessionsController skip_before_action :check_suspension, only: [:destroy] prepend_before_action :authenticate_with_two_factor, if: :two_factor_enabled?, only: [:create] before_action :set_instance_presenter, only: [:new] + before_action :set_pack def create super do |resource| @@ -85,6 +86,10 @@ class Auth::SessionsController < Devise::SessionsController private + def set_pack + use_pack 'auth' + end + def set_instance_presenter @instance_presenter = InstancePresenter.new end diff --git a/app/controllers/authorize_follows_controller.rb b/app/controllers/authorize_follows_controller.rb index 78b564183..2d29bd379 100644 --- a/app/controllers/authorize_follows_controller.rb +++ b/app/controllers/authorize_follows_controller.rb @@ -4,6 +4,7 @@ class AuthorizeFollowsController < ApplicationController layout 'modal' before_action :authenticate_user! + before_action :set_pack def show @account = located_account || render(:error) @@ -23,6 +24,10 @@ class AuthorizeFollowsController < ApplicationController private + def set_pack + use_pack 'modal' + end + def follow_attempt FollowService.new.call(current_account, acct_without_prefix) end diff --git a/app/controllers/follower_accounts_controller.rb b/app/controllers/follower_accounts_controller.rb index 399e79665..080cbde11 100644 --- a/app/controllers/follower_accounts_controller.rb +++ b/app/controllers/follower_accounts_controller.rb @@ -7,7 +7,9 @@ class FollowerAccountsController < ApplicationController @follows = Follow.where(target_account: @account).recent.page(params[:page]).per(FOLLOW_PER_PAGE).preload(:account) respond_to do |format| - format.html + format.html do + use_pack 'public' + end format.json do render json: collection_presenter, diff --git a/app/controllers/following_accounts_controller.rb b/app/controllers/following_accounts_controller.rb index 1e73d4bd4..74e83ad81 100644 --- a/app/controllers/following_accounts_controller.rb +++ b/app/controllers/following_accounts_controller.rb @@ -7,7 +7,9 @@ class FollowingAccountsController < ApplicationController @follows = Follow.where(account: @account).recent.page(params[:page]).per(FOLLOW_PER_PAGE).preload(:target_account) respond_to do |format| - format.html + format.html do + use_pack 'public' + end format.json do render json: collection_presenter, diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 21dde20ce..7437a647e 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -2,6 +2,7 @@ class HomeController < ApplicationController before_action :authenticate_user! + before_action :set_pack before_action :set_initial_state_json def index @@ -37,6 +38,10 @@ class HomeController < ApplicationController redirect_to(default_redirect_path) end + def set_pack + use_pack 'home' + end + def set_initial_state_json serializable_resource = ActiveModelSerializers::SerializableResource.new(InitialStatePresenter.new(initial_state_params), serializer: InitialStateSerializer) @initial_state_json = serializable_resource.to_json diff --git a/app/controllers/remote_follow_controller.rb b/app/controllers/remote_follow_controller.rb index 48b026aa5..e6f379886 100644 --- a/app/controllers/remote_follow_controller.rb +++ b/app/controllers/remote_follow_controller.rb @@ -4,6 +4,7 @@ class RemoteFollowController < ApplicationController layout 'modal' before_action :set_account + before_action :set_pack before_action :gone, if: :suspended_account? def new @@ -31,6 +32,10 @@ class RemoteFollowController < ApplicationController { acct: session[:remote_follow] } end + def set_pack + use_pack 'modal' + end + def set_account @account = Account.find_local!(params[:account_username]) end diff --git a/app/controllers/settings/applications_controller.rb b/app/controllers/settings/applications_controller.rb index 8fc9a0fa9..35a6f7f9e 100644 --- a/app/controllers/settings/applications_controller.rb +++ b/app/controllers/settings/applications_controller.rb @@ -1,9 +1,7 @@ # frozen_string_literal: true -class Settings::ApplicationsController < ApplicationController - layout 'admin' +class Settings::ApplicationsController < Settings::BaseController - before_action :authenticate_user! before_action :set_application, only: [:show, :update, :destroy, :regenerate] before_action :prepare_scopes, only: [:create, :update] diff --git a/app/controllers/settings/base_controller.rb b/app/controllers/settings/base_controller.rb new file mode 100644 index 000000000..7322d461b --- /dev/null +++ b/app/controllers/settings/base_controller.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class Settings::BaseController < ApplicationController + layout 'admin' + + before_action :authenticate_user! + before_action :set_pack + + def set_pack + use_pack 'settings' + end +end diff --git a/app/controllers/settings/deletes_controller.rb b/app/controllers/settings/deletes_controller.rb index 80002b995..e4cb35a8e 100644 --- a/app/controllers/settings/deletes_controller.rb +++ b/app/controllers/settings/deletes_controller.rb @@ -1,10 +1,8 @@ # frozen_string_literal: true -class Settings::DeletesController < ApplicationController - layout 'admin' +class Settings::DeletesController < Settings::BaseController before_action :check_enabled_deletion - before_action :authenticate_user! def show @confirmation = Form::DeleteConfirmation.new diff --git a/app/controllers/settings/exports_controller.rb b/app/controllers/settings/exports_controller.rb index ae62f00c1..9c03ece86 100644 --- a/app/controllers/settings/exports_controller.rb +++ b/app/controllers/settings/exports_controller.rb @@ -1,10 +1,6 @@ # frozen_string_literal: true -class Settings::ExportsController < ApplicationController - layout 'admin' - - before_action :authenticate_user! - +class Settings::ExportsController < Settings::BaseController def show @export = Export.new(current_account) end diff --git a/app/controllers/settings/follower_domains_controller.rb b/app/controllers/settings/follower_domains_controller.rb index 9968504e5..141b2270d 100644 --- a/app/controllers/settings/follower_domains_controller.rb +++ b/app/controllers/settings/follower_domains_controller.rb @@ -2,11 +2,7 @@ require 'sidekiq-bulk' -class Settings::FollowerDomainsController < ApplicationController - layout 'admin' - - before_action :authenticate_user! - +class Settings::FollowerDomainsController < Settings::BaseController def show @account = current_account @domains = current_account.followers.reorder('MIN(follows.id) DESC').group('accounts.domain').select('accounts.domain, count(accounts.id) as accounts_from_domain').page(params[:page]).per(10) diff --git a/app/controllers/settings/imports_controller.rb b/app/controllers/settings/imports_controller.rb index 0db13d1ca..dbd136ebe 100644 --- a/app/controllers/settings/imports_controller.rb +++ b/app/controllers/settings/imports_controller.rb @@ -1,9 +1,6 @@ # frozen_string_literal: true -class Settings::ImportsController < ApplicationController - layout 'admin' - - before_action :authenticate_user! +class Settings::ImportsController < Settings::BaseController before_action :set_account def show diff --git a/app/controllers/settings/keyword_mutes_controller.rb b/app/controllers/settings/keyword_mutes_controller.rb index f79e1b320..699b8a3ef 100644 --- a/app/controllers/settings/keyword_mutes_controller.rb +++ b/app/controllers/settings/keyword_mutes_controller.rb @@ -1,9 +1,6 @@ # frozen_string_literal: true -class Settings::KeywordMutesController < ApplicationController - layout 'admin' - - before_action :authenticate_user! +class Settings::KeywordMutesController < Settings::BaseController before_action :load_keyword_mute, only: [:edit, :update, :destroy] def index diff --git a/app/controllers/settings/notifications_controller.rb b/app/controllers/settings/notifications_controller.rb index ce2530c54..6286e3ebf 100644 --- a/app/controllers/settings/notifications_controller.rb +++ b/app/controllers/settings/notifications_controller.rb @@ -1,10 +1,6 @@ # frozen_string_literal: true -class Settings::NotificationsController < ApplicationController - layout 'admin' - - before_action :authenticate_user! - +class Settings::NotificationsController < Settings::BaseController def show; end def update diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb index 069026715..3aefd90a2 100644 --- a/app/controllers/settings/preferences_controller.rb +++ b/app/controllers/settings/preferences_controller.rb @@ -1,10 +1,6 @@ # frozen_string_literal: true -class Settings::PreferencesController < ApplicationController - layout 'admin' - - before_action :authenticate_user! - +class Settings::PreferencesController < Settings::BaseController def show; end def update diff --git a/app/controllers/settings/profiles_controller.rb b/app/controllers/settings/profiles_controller.rb index 28f78a4fb..dadc3d911 100644 --- a/app/controllers/settings/profiles_controller.rb +++ b/app/controllers/settings/profiles_controller.rb @@ -1,11 +1,8 @@ # frozen_string_literal: true -class Settings::ProfilesController < ApplicationController +class Settings::ProfilesController < Settings::BaseController include ObfuscateFilename - layout 'admin' - - before_action :authenticate_user! before_action :set_account obfuscate_filename [:account, :avatar] diff --git a/app/controllers/settings/sessions_controller.rb b/app/controllers/settings/sessions_controller.rb index 0da1b027b..780ea64b4 100644 --- a/app/controllers/settings/sessions_controller.rb +++ b/app/controllers/settings/sessions_controller.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true +# Intentionally does not inherit from BaseController class Settings::SessionsController < ApplicationController before_action :set_session, only: :destroy diff --git a/app/controllers/settings/two_factor_authentications_controller.rb b/app/controllers/settings/two_factor_authentications_controller.rb index 863cc7351..8c7737e9d 100644 --- a/app/controllers/settings/two_factor_authentications_controller.rb +++ b/app/controllers/settings/two_factor_authentications_controller.rb @@ -1,10 +1,7 @@ # frozen_string_literal: true module Settings - class TwoFactorAuthenticationsController < ApplicationController - layout 'admin' - - before_action :authenticate_user! + class TwoFactorAuthenticationsController < BaseController before_action :verify_otp_required, only: [:create] def show diff --git a/app/controllers/shares_controller.rb b/app/controllers/shares_controller.rb index 994742c3d..81d279c8b 100644 --- a/app/controllers/shares_controller.rb +++ b/app/controllers/shares_controller.rb @@ -4,6 +4,7 @@ class SharesController < ApplicationController layout 'modal' before_action :authenticate_user! + before_action :set_pack before_action :set_body_classes def show @@ -24,6 +25,10 @@ class SharesController < ApplicationController } end + def set_pack + use_pack 'share' + end + def set_body_classes @body_classes = 'compose-standalone' end diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb index e8a360fb5..84c9e7685 100644 --- a/app/controllers/statuses_controller.rb +++ b/app/controllers/statuses_controller.rb @@ -14,6 +14,7 @@ class StatusesController < ApplicationController def show respond_to do |format| format.html do + use_pack 'public' @ancestors = @status.reply? ? cache_collection(@status.ancestors(current_account), Status) : [] @descendants = cache_collection(@status.descendants(current_account), Status) @@ -37,6 +38,7 @@ class StatusesController < ApplicationController end def embed + use_pack 'embed' response.headers['X-Frame-Options'] = 'ALLOWALL' render 'stream_entries/embed', layout: 'embedded' end diff --git a/app/controllers/stream_entries_controller.rb b/app/controllers/stream_entries_controller.rb index 5f61e2182..b597ba4bb 100644 --- a/app/controllers/stream_entries_controller.rb +++ b/app/controllers/stream_entries_controller.rb @@ -14,6 +14,7 @@ class StreamEntriesController < ApplicationController def show respond_to do |format| format.html do + use_pack 'public' @ancestors = @stream_entry.activity.reply? ? cache_collection(@stream_entry.activity.ancestors(current_account), Status) : [] @descendants = cache_collection(@stream_entry.activity.descendants(current_account), Status) end diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb index 9f3090e37..5d11a8139 100644 --- a/app/controllers/tags_controller.rb +++ b/app/controllers/tags_controller.rb @@ -9,6 +9,7 @@ class TagsController < ApplicationController respond_to do |format| format.html do + use_pack 'about' serializable_resource = ActiveModelSerializers::SerializableResource.new(InitialStatePresenter.new(initial_state_params), serializer: InitialStateSerializer) @initial_state_json = serializable_resource.to_json end diff --git a/app/javascript/core/about.js b/app/javascript/core/about.js deleted file mode 100644 index 6ed0e4ad3..000000000 --- a/app/javascript/core/about.js +++ /dev/null @@ -1 +0,0 @@ -// This file will be loaded on about pages, regardless of theme. diff --git a/app/javascript/core/embed.js b/app/javascript/core/embed.js index 8167706a3..6146e6592 100644 --- a/app/javascript/core/embed.js +++ b/app/javascript/core/embed.js @@ -13,7 +13,7 @@ window.addEventListener('message', e => { id: data.id, height: document.getElementsByTagName('html')[0].scrollHeight, }, '*'); - }); + }; if (['interactive', 'complete'].includes(document.readyState)) { setEmbedHeight(); diff --git a/app/javascript/core/home.js b/app/javascript/core/home.js deleted file mode 100644 index 3c2e01590..000000000 --- a/app/javascript/core/home.js +++ /dev/null @@ -1 +0,0 @@ -// This file will be loaded on home pages, regardless of theme. diff --git a/app/javascript/core/public.js b/app/javascript/core/public.js index 1a36b7a5f..47c34a259 100644 --- a/app/javascript/core/public.js +++ b/app/javascript/core/public.js @@ -1 +1,25 @@ // This file will be loaded on public pages, regardless of theme. + +const { delegate } = require('rails-ujs'); + +delegate(document, '.webapp-btn', 'click', ({ target, button }) => { + if (button !== 0) { + return true; + } + window.location.href = target.href; + return false; +}); + +delegate(document, '.status__content__spoiler-link', 'click', ({ target }) => { + const contentEl = target.parentNode.parentNode.querySelector('.e-content'); + + if (contentEl.style.display === 'block') { + contentEl.style.display = 'none'; + target.parentNode.style.marginBottom = 0; + } else { + contentEl.style.display = 'block'; + target.parentNode.style.marginBottom = null; + } + + return false; +}); diff --git a/app/javascript/core/settings.js b/app/javascript/core/settings.js index 91332ed5a..7fb1d8e77 100644 --- a/app/javascript/core/settings.js +++ b/app/javascript/core/settings.js @@ -1,65 +1,37 @@ // This file will be loaded on settings pages, regardless of theme. -function main() { - const { length } = require('stringz'); - const { delegate } = require('rails-ujs'); +const { length } = require('stringz'); +const { delegate } = require('rails-ujs'); - delegate(document, '.webapp-btn', 'click', ({ target, button }) => { - if (button !== 0) { - return true; - } - window.location.href = target.href; - return false; - }); +delegate(document, '.account_display_name', 'input', ({ target }) => { + const nameCounter = document.querySelector('.name-counter'); - delegate(document, '.status__content__spoiler-link', 'click', ({ target }) => { - const contentEl = target.parentNode.parentNode.querySelector('.e-content'); - - if (contentEl.style.display === 'block') { - contentEl.style.display = 'none'; - target.parentNode.style.marginBottom = 0; - } else { - contentEl.style.display = 'block'; - target.parentNode.style.marginBottom = null; - } - - return false; - }); - - delegate(document, '.account_display_name', 'input', ({ target }) => { - const nameCounter = document.querySelector('.name-counter'); - - if (nameCounter) { - nameCounter.textContent = 30 - length(target.value); - } - }); - - delegate(document, '.account_note', 'input', ({ target }) => { - const noteCounter = document.querySelector('.note-counter'); + if (nameCounter) { + nameCounter.textContent = 30 - length(target.value); + } +}); - if (noteCounter) { - const noteWithoutMetadata = processBio(target.value).text; - noteCounter.textContent = 500 - length(noteWithoutMetadata); - } - }); +delegate(document, '.account_note', 'input', ({ target }) => { + const noteCounter = document.querySelector('.note-counter'); - delegate(document, '#account_avatar', 'change', ({ target }) => { - const avatar = document.querySelector('.card.compact .avatar img'); - const [file] = target.files || []; - const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc; + if (noteCounter) { + const noteWithoutMetadata = processBio(target.value).text; + noteCounter.textContent = 500 - length(noteWithoutMetadata); + } +}); - avatar.src = url; - }); +delegate(document, '#account_avatar', 'change', ({ target }) => { + const avatar = document.querySelector('.card.compact .avatar img'); + const [file] = target.files || []; + const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc; - delegate(document, '#account_header', 'change', ({ target }) => { - const header = document.querySelector('.card.compact'); - const [file] = target.files || []; - const url = file ? URL.createObjectURL(file) : header.dataset.originalSrc; + avatar.src = url; +}); - header.style.backgroundImage = `url(${url})`; - }); -} +delegate(document, '#account_header', 'change', ({ target }) => { + const header = document.querySelector('.card.compact'); + const [file] = target.files || []; + const url = file ? URL.createObjectURL(file) : header.dataset.originalSrc; -loadPolyfills().then(main).catch(error => { - console.error(error); + header.style.backgroundImage = `url(${url})`; }); diff --git a/app/javascript/core/share.js b/app/javascript/core/share.js deleted file mode 100644 index 98a413632..000000000 --- a/app/javascript/core/share.js +++ /dev/null @@ -1 +0,0 @@ -// This file will be loaded on share pages, regardless of theme. diff --git a/app/javascript/core/theme.yml b/app/javascript/core/theme.yml new file mode 100644 index 000000000..17e8e66b3 --- /dev/null +++ b/app/javascript/core/theme.yml @@ -0,0 +1,14 @@ +# These packs will be loaded on every appropriate page, regardless of +# theme. +pack: + about: + admin: admin.js + auth: + common: common.js + embed: embed.js + error: + home: + modal: + public: public.js + settings: settings.js + share: diff --git a/app/javascript/locales/index.js b/app/javascript/locales/index.js new file mode 100644 index 000000000..421cb7fab --- /dev/null +++ b/app/javascript/locales/index.js @@ -0,0 +1,9 @@ +let theLocale; + +export function setLocale(locale) { + theLocale = locale; +} + +export function getLocale() { + return theLocale; +} diff --git a/app/javascript/mastodon/locales/index.js b/app/javascript/mastodon/locales/index.js index 421cb7fab..7e7297561 100644 --- a/app/javascript/mastodon/locales/index.js +++ b/app/javascript/mastodon/locales/index.js @@ -1,9 +1 @@ -let theLocale; - -export function setLocale(locale) { - theLocale = locale; -} - -export function getLocale() { - return theLocale; -} +export * from 'locales'; diff --git a/app/javascript/packs/about.js b/app/javascript/packs/about.js new file mode 100644 index 000000000..63e12da42 --- /dev/null +++ b/app/javascript/packs/about.js @@ -0,0 +1,22 @@ +import loadPolyfills from '../mastodon/load_polyfills'; + +function loaded() { + const TimelineContainer = require('../mastodon/containers/timeline_container').default; + const React = require('react'); + const ReactDOM = require('react-dom'); + const mountNode = document.getElementById('mastodon-timeline'); + + if (mountNode !== null) { + const props = JSON.parse(mountNode.getAttribute('data-props')); + ReactDOM.render(, mountNode); + } +} + +function main() { + const ready = require('../mastodon/ready').default; + ready(loaded); +} + +loadPolyfills().then(main).catch(error => { + console.error(error); +}); diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index ee5bf244c..116632dea 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -1,15 +1,5 @@ -// THIS IS THE `vanilla` THEME PACK FILE!! -// IT'S HERE FOR UPSTREAM COMPATIBILITY!! -// THE `glitch` PACK FILE IS IN `themes/glitch/index.js`!! - import loadPolyfills from '../mastodon/load_polyfills'; -// import default stylesheet with variables -import 'font-awesome/css/font-awesome.css'; -import '../styles/application.scss'; - -require.context('../images/', true); - loadPolyfills().then(() => { require('../mastodon/main').default(); }).catch(e => { diff --git a/app/javascript/packs/common.js b/app/javascript/packs/common.js new file mode 100644 index 000000000..f3156c1c6 --- /dev/null +++ b/app/javascript/packs/common.js @@ -0,0 +1,3 @@ +import 'font-awesome/css/font-awesome.css'; +import 'styles/application.scss' +require.context('../images/', true); diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js new file mode 100644 index 000000000..3472af6c1 --- /dev/null +++ b/app/javascript/packs/public.js @@ -0,0 +1,75 @@ +import loadPolyfills from '../mastodon/load_polyfills'; +import ready from '../mastodon/ready'; + +function main() { + const IntlRelativeFormat = require('intl-relativeformat').default; + const emojify = require('../mastodon/features/emoji/emoji').default; + const { getLocale } = require('../mastodon/locales'); + const { localeData } = getLocale(); + const VideoContainer = require('../mastodon/containers/video_container').default; + const MediaGalleryContainer = require('../mastodon/containers/media_gallery_container').default; + const CardContainer = require('../mastodon/containers/card_container').default; + const React = require('react'); + const ReactDOM = require('react-dom'); + + localeData.forEach(IntlRelativeFormat.__addLocaleData); + + ready(() => { + const locale = document.documentElement.lang; + + const dateTimeFormat = new Intl.DateTimeFormat(locale, { + year: 'numeric', + month: 'long', + day: 'numeric', + hour: 'numeric', + minute: 'numeric', + }); + + const relativeFormat = new IntlRelativeFormat(locale); + + [].forEach.call(document.querySelectorAll('.emojify'), (content) => { + content.innerHTML = emojify(content.innerHTML); + }); + + [].forEach.call(document.querySelectorAll('time.formatted'), (content) => { + const datetime = new Date(content.getAttribute('datetime')); + const formattedDate = dateTimeFormat.format(datetime); + + content.title = formattedDate; + content.textContent = formattedDate; + }); + + [].forEach.call(document.querySelectorAll('time.time-ago'), (content) => { + const datetime = new Date(content.getAttribute('datetime')); + + content.title = dateTimeFormat.format(datetime); + content.textContent = relativeFormat.format(datetime); + }); + + [].forEach.call(document.querySelectorAll('.logo-button'), (content) => { + content.addEventListener('click', (e) => { + e.preventDefault(); + window.open(e.target.href, 'mastodon-intent', 'width=400,height=400,resizable=no,menubar=no,status=no,scrollbars=yes'); + }); + }); + + [].forEach.call(document.querySelectorAll('[data-component="Video"]'), (content) => { + const props = JSON.parse(content.getAttribute('data-props')); + ReactDOM.render(, content); + }); + + [].forEach.call(document.querySelectorAll('[data-component="MediaGallery"]'), (content) => { + const props = JSON.parse(content.getAttribute('data-props')); + ReactDOM.render(, content); + }); + + [].forEach.call(document.querySelectorAll('[data-component="Card"]'), (content) => { + const props = JSON.parse(content.getAttribute('data-props')); + ReactDOM.render(, content); + }); + }); +} + +loadPolyfills().then(main).catch(error => { + console.error(error); +}); diff --git a/app/javascript/packs/share.js b/app/javascript/packs/share.js new file mode 100644 index 000000000..e9580f648 --- /dev/null +++ b/app/javascript/packs/share.js @@ -0,0 +1,22 @@ +import loadPolyfills from '../mastodon/load_polyfills'; + +function loaded() { + const ComposeContainer = require('../mastodon/containers/compose_container').default; + const React = require('react'); + const ReactDOM = require('react-dom'); + const mountNode = document.getElementById('mastodon-compose'); + + if (mountNode !== null) { + const props = JSON.parse(mountNode.getAttribute('data-props')); + ReactDOM.render(, mountNode); + } +} + +function main() { + const ready = require('../mastodon/ready').default; + ready(loaded); +} + +loadPolyfills().then(main).catch(error => { + console.error(error); +}); diff --git a/app/javascript/styles/common.scss b/app/javascript/styles/common.scss deleted file mode 100644 index c1772e7ae..000000000 --- a/app/javascript/styles/common.scss +++ /dev/null @@ -1,5 +0,0 @@ -// This makes our fonts available everywhere. - -@import 'fonts/roboto'; -@import 'fonts/roboto-mono'; -@import 'fonts/montserrat'; diff --git a/app/javascript/styles/win95.scss b/app/javascript/styles/win95.scss index 885837b53..6c89fc5bf 100644 --- a/app/javascript/styles/win95.scss +++ b/app/javascript/styles/win95.scss @@ -1,3 +1,8 @@ +// win95 theme from cybrespace. + +// Modified to inherit glitch styles (themes/glitch/styles/index.scss) +// instead of vanilla ones (./application.scss) + $win95-bg: #bfbfbf; $win95-dark-grey: #404040; $win95-mid-grey: #808080; @@ -17,7 +22,7 @@ $ui-highlight-color: $win95-window-header; } @mixin win95-outset() { - box-shadow: inset -1px -1px 0px #000000, + box-shadow: inset -1px -1px 0px #000000, inset 1px 1px 0px #ffffff, inset -2px -2px 0px #808080, inset 2px 2px 0px #dfdfdf; @@ -41,7 +46,7 @@ $ui-highlight-color: $win95-window-header; } @mixin win95-inset() { - box-shadow: inset 1px 1px 0px #000000, + box-shadow: inset 1px 1px 0px #000000, inset -1px -1px 0px #ffffff, inset 2px 2px 0px #808080, inset -2px -2px 0px #dfdfdf; @@ -51,7 +56,7 @@ $ui-highlight-color: $win95-window-header; @mixin win95-tab() { - box-shadow: inset -1px 0px 0px #000000, + box-shadow: inset -1px 0px 0px #000000, inset 1px 0px 0px #ffffff, inset 0px 1px 0px #ffffff, inset 0px 2px 0px #dfdfdf, @@ -71,7 +76,7 @@ $ui-highlight-color: $win95-window-header; src: url('../fonts/premillenium/MSSansSerif.ttf') format('truetype'); } -@import 'application'; +@import '../themes/glitch/styles/index'; // Imports glitch themes /* borrowed from cybrespace style: wider columns and full column width images */ @@ -174,7 +179,7 @@ body.admin { font-size:0px; color:$win95-bg; - background-image: url("../images/start.png"); + background-image: url("../images/start.png"); background-repeat:no-repeat; background-position:8%; background-clip:padding-box; @@ -336,7 +341,7 @@ body.admin { border-radius:0px; background-color:white; @include win95-border-inset(); - + width:12px; height:12px; } @@ -515,9 +520,9 @@ body.admin { color:black; font-weight:bold; } -.account__avatar, -.account__avatar-overlay-base, -.account__header__avatar, +.account__avatar, +.account__avatar-overlay-base, +.account__header__avatar, .account__avatar-overlay-overlay { @include win95-border-slight-inset(); clip-path:none; @@ -627,7 +632,7 @@ body.admin { } .status-card__description { - color:black; + color:black; } .account__display-name strong, .status__display-name strong { @@ -710,8 +715,8 @@ body.admin { width:40px; font-size:0px; color:$win95-bg; - - background-image: url("../images/start.png"); + + background-image: url("../images/start.png"); background-repeat:no-repeat; background-position:8%; background-clip:padding-box; @@ -723,7 +728,7 @@ body.admin { } .drawer__header a:first-child:hover { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII="); + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII="); background-repeat:no-repeat; background-position:8%; background-clip:padding-box; @@ -732,7 +737,7 @@ body.admin { } .drawer__tab:first-child { - + } .search { @@ -844,7 +849,7 @@ body.admin { padding:4px 8px; } -.privacy-dropdown.active +.privacy-dropdown.active .privacy-dropdown__value { background: $win95-bg; box-shadow:unset; @@ -935,7 +940,7 @@ body.admin { background-color:$win95-bg; border:1px solid black; box-sizing:content-box; - + } .emoji-dialog .emoji-search { @@ -1010,8 +1015,8 @@ body.admin { width:60px; font-size:0px; color:$win95-bg; - - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII="); + + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII="); background-repeat:no-repeat; background-position:8%; background-clip:padding-box; @@ -1049,40 +1054,40 @@ body.admin { } } -.column-link[href="/web/timelines/public"] { - background-image: url("../images/icon_public.png"); +.column-link[href="/web/timelines/public"] { + background-image: url("../images/icon_public.png"); &:hover { background-image: url("../images/icon_public.png"); } } -.column-link[href="/web/timelines/public/local"] { - background-image: url("../images/icon_local.png"); +.column-link[href="/web/timelines/public/local"] { + background-image: url("../images/icon_local.png"); &:hover { background-image: url("../images/icon_local.png"); } } -.column-link[href="/web/pinned"] { - background-image: url("../images/icon_pin.png"); +.column-link[href="/web/pinned"] { + background-image: url("../images/icon_pin.png"); &:hover { background-image: url("../images/icon_pin.png"); } } -.column-link[href="/web/favourites"] { - background-image: url("../images/icon_likes.png"); +.column-link[href="/web/favourites"] { + background-image: url("../images/icon_likes.png"); &:hover { background-image: url("../images/icon_likes.png"); } } -.column-link[href="/web/blocks"] { - background-image: url("../images/icon_blocks.png"); +.column-link[href="/web/blocks"] { + background-image: url("../images/icon_blocks.png"); &:hover { background-image: url("../images/icon_blocks.png"); } } -.column-link[href="/web/mutes"] { - background-image: url("../images/icon_mutes.png"); +.column-link[href="/web/mutes"] { + background-image: url("../images/icon_mutes.png"); &:hover { background-image: url("../images/icon_mutes.png"); } } -.column-link[href="/settings/preferences"] { - background-image: url("../images/icon_settings.png"); +.column-link[href="/settings/preferences"] { + background-image: url("../images/icon_settings.png"); &:hover { background-image: url("../images/icon_settings.png"); } } -.column-link[href="/about/more"] { - background-image: url("../images/icon_about.png"); +.column-link[href="/about/more"] { + background-image: url("../images/icon_about.png"); &:hover { background-image: url("../images/icon_about.png"); } } -.column-link[href="/auth/sign_out"] { - background-image: url("../images/icon_logout.png"); +.column-link[href="/auth/sign_out"] { + background-image: url("../images/icon_logout.png"); &:hover { background-image: url("../images/icon_logout.png"); } } @@ -1098,7 +1103,7 @@ body.admin { line-height:30px; padding-left:20px; padding-right:40px; - + left:0px; bottom:-30px; display:block; @@ -1106,9 +1111,9 @@ body.admin { background-color:#7f7f7f; width:200%; height:30px; - + -ms-transform: rotate(-90deg); - + -webkit-transform: rotate(-90deg); transform: rotate(-90deg); transform-origin:top left; @@ -1189,7 +1194,7 @@ body.admin { left:unset; } -.dropdown > .icon-button, .detailed-status__button > .icon-button, +.dropdown > .icon-button, .detailed-status__button > .icon-button, .status__action-bar > .icon-button, .star-icon i { /* i don't know what's going on with the inline styles someone should look at the react code */ @@ -1239,8 +1244,8 @@ body.admin { background:$win95-bg; } -.actions-modal::before, -.boost-modal::before, +.actions-modal::before, +.boost-modal::before, .confirmation-modal::before, .report-modal::before { content: "Confirmation"; @@ -1278,8 +1283,8 @@ body.admin { .confirmation-modal__cancel-button { color:black; - &:active, - &:focus, + &:active, + &:focus, &:hover { color:black; } @@ -1566,10 +1571,10 @@ a.table-action-link:hover, background-color:white; } -.simple_form input[type=text], -.simple_form input[type=number], -.simple_form input[type=email], -.simple_form input[type=password], +.simple_form input[type=text], +.simple_form input[type=number], +.simple_form input[type=email], +.simple_form input[type=password], .simple_form textarea { color:black; background-color:white; @@ -1580,8 +1585,8 @@ a.table-action-link:hover, } } -.simple_form button, -.simple_form .button, +.simple_form button, +.simple_form .button, .simple_form .block-button { background: $win95-bg; @@ -1608,8 +1613,8 @@ a.table-action-link:hover, } } -.simple_form button.negative, -.simple_form .button.negative, +.simple_form button.negative, +.simple_form .button.negative, .simple_form .block-button.negative { background: $win95-bg; @@ -1631,8 +1636,8 @@ a.table-action-link:hover, border-right-color:#f5f5f5; width:12px; height:12px; - display:inline-block; - vertical-align:middle; + display:inline-block; + vertical-align:middle; margin-right:2px; } diff --git a/app/javascript/themes/glitch/containers/mastodon.js b/app/javascript/themes/glitch/containers/mastodon.js index 348470637..755b5564a 100644 --- a/app/javascript/themes/glitch/containers/mastodon.js +++ b/app/javascript/themes/glitch/containers/mastodon.js @@ -9,7 +9,7 @@ import UI from 'themes/glitch/features/ui'; import { hydrateStore } from 'themes/glitch/actions/store'; import { connectUserStream } from 'themes/glitch/actions/streaming'; import { IntlProvider, addLocaleData } from 'react-intl'; -import { getLocale } from 'mastodon/locales'; +import { getLocale } from 'locales'; import initialState from 'themes/glitch/util/initial_state'; const { localeData, messages } = getLocale(); diff --git a/app/javascript/themes/glitch/packs/common.js b/app/javascript/themes/glitch/packs/common.js index 3a62700bd..f4fa129e1 100644 --- a/app/javascript/themes/glitch/packs/common.js +++ b/app/javascript/themes/glitch/packs/common.js @@ -1,3 +1,3 @@ import 'font-awesome/css/font-awesome.css'; -require.context('../../images/', true); -import './styles/index.scss'; +require.context('images/', true); +import 'themes/glitch/styles/index.scss'; diff --git a/app/javascript/themes/glitch/packs/home.js b/app/javascript/themes/glitch/packs/home.js index dada28317..69dddf51c 100644 --- a/app/javascript/themes/glitch/packs/home.js +++ b/app/javascript/themes/glitch/packs/home.js @@ -1,7 +1,7 @@ -import loadPolyfills from './util/load_polyfills'; +import loadPolyfills from 'themes/glitch/util/load_polyfills'; loadPolyfills().then(() => { - require('./util/main').default(); + require('themes/glitch/util/main').default(); }).catch(e => { console.error(e); }); diff --git a/app/javascript/themes/glitch/packs/public.js b/app/javascript/themes/glitch/packs/public.js index 6adacad98..d9a1b9655 100644 --- a/app/javascript/themes/glitch/packs/public.js +++ b/app/javascript/themes/glitch/packs/public.js @@ -2,32 +2,14 @@ import loadPolyfills from 'themes/glitch/util/load_polyfills'; import { processBio } from 'themes/glitch/util/bio_metadata'; import ready from 'themes/glitch/util/ready'; -window.addEventListener('message', e => { - const data = e.data || {}; - - if (!window.parent || data.type !== 'setHeight') { - return; - } - - ready(() => { - window.parent.postMessage({ - type: 'setHeight', - id: data.id, - height: document.getElementsByTagName('html')[0].scrollHeight, - }, '*'); - }); -}); - function main() { - const { length } = require('stringz'); const IntlRelativeFormat = require('intl-relativeformat').default; - const { delegate } = require('rails-ujs'); - const emojify = require('../themes/glitch/util/emoji').default; - const { getLocale } = require('mastodon/locales'); + const emojify = require('themes/glitch/util/emoji').default; + const { getLocale } = require('locales'); const { localeData } = getLocale(); - const VideoContainer = require('../themes/glitch/containers/video_container').default; - const MediaGalleryContainer = require('../themes/glitch/containers/media_gallery_container').default; - const CardContainer = require('../themes/glitch/containers/card_container').default; + const VideoContainer = require('themes/glitch/containers/video_container').default; + const MediaGalleryContainer = require('themes/glitch/containers/media_gallery_container').default; + const CardContainer = require('themes/glitch/containers/card_container').default; const React = require('react'); const ReactDOM = require('react-dom'); @@ -87,61 +69,6 @@ function main() { ReactDOM.render(, content); }); }); - - delegate(document, '.webapp-btn', 'click', ({ target, button }) => { - if (button !== 0) { - return true; - } - window.location.href = target.href; - return false; - }); - - delegate(document, '.status__content__spoiler-link', 'click', ({ target }) => { - const contentEl = target.parentNode.parentNode.querySelector('.e-content'); - - if (contentEl.style.display === 'block') { - contentEl.style.display = 'none'; - target.parentNode.style.marginBottom = 0; - } else { - contentEl.style.display = 'block'; - target.parentNode.style.marginBottom = null; - } - - return false; - }); - - delegate(document, '.account_display_name', 'input', ({ target }) => { - const nameCounter = document.querySelector('.name-counter'); - - if (nameCounter) { - nameCounter.textContent = 30 - length(target.value); - } - }); - - delegate(document, '.account_note', 'input', ({ target }) => { - const noteCounter = document.querySelector('.note-counter'); - - if (noteCounter) { - const noteWithoutMetadata = processBio(target.value).text; - noteCounter.textContent = 500 - length(noteWithoutMetadata); - } - }); - - delegate(document, '#account_avatar', 'change', ({ target }) => { - const avatar = document.querySelector('.card.compact .avatar img'); - const [file] = target.files || []; - const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc; - - avatar.src = url; - }); - - delegate(document, '#account_header', 'change', ({ target }) => { - const header = document.querySelector('.card.compact'); - const [file] = target.files || []; - const url = file ? URL.createObjectURL(file) : header.dataset.originalSrc; - - header.style.backgroundImage = `url(${url})`; - }); } loadPolyfills().then(main).catch(error => { diff --git a/app/javascript/themes/glitch/theme.yml b/app/javascript/themes/glitch/theme.yml index cf3fa32c2..ac6f57546 100644 --- a/app/javascript/themes/glitch/theme.yml +++ b/app/javascript/themes/glitch/theme.yml @@ -1,25 +1,34 @@ # (REQUIRED) The location of the pack files. pack: about: packs/about.js - admin: null - common: packs/common.js - embed: null - home: packs/home.js + admin: + auth: + common: + filename: packs/common.js + stylesheet: true + embed: packs/public.js + error: + home: + filename: packs/home.js + preload: + - themes/glitch/async/getting_started + - themes/glitch/async/compose + - themes/glitch/async/home_timeline + - themes/glitch/async/notifications + stylesheet: true + modal: public: packs/public.js - settings: null + settings: share: packs/share.js # (OPTIONAL) The directory which contains the pack files. # Defaults to the theme directory (`app/javascript/themes/[theme]`), # which should be sufficient for like 99% of use-cases lol. -# pack_directory: app/javascript/packs -# (OPTIONAL) Additional javascript resources to preload, for use with -# lazy-loaded components. It is **STRONGLY RECOMMENDED** that you -# derive these pathnames from `themes/[your-theme]` to ensure that -# they stay unique. -preload: -- themes/glitch/async/getting_started -- themes/glitch/async/compose -- themes/glitch/async/home_timeline -- themes/glitch/async/notifications +# pack_directory: app/javascript/packs + +# (OPTIONAL) By default the theme will fallback to the default theme +# if a particular pack is not provided. You can specify different +# fallbacks here, or disable fallback behaviours altogether by +# specifying a `null` value. +fallback: diff --git a/app/javascript/themes/vanilla/theme.yml b/app/javascript/themes/vanilla/theme.yml index b4a1598fc..67fd9723e 100644 --- a/app/javascript/themes/vanilla/theme.yml +++ b/app/javascript/themes/vanilla/theme.yml @@ -1,12 +1,23 @@ # (REQUIRED) The location of the pack files inside `pack_directory`. pack: about: about.js - admin: null - common: common.js - embed: null - home: application.js + admin: + auth: + common: + filename: common.js + stylesheet: true + embed: public.js + error: + home: + filename: application.js + preload: + - features/getting_started + - features/compose + - features/home_timeline + - features/notifications + modal: public: public.js - settings: null + settings: share: share.js # (OPTIONAL) The directory which contains the pack files. @@ -15,12 +26,8 @@ pack: # somewhere else. pack_directory: app/javascript/packs -# (OPTIONAL) Additional javascript resources to preload, for use with -# lazy-loaded components. It is **STRONGLY RECOMMENDED** that you -# derive these pathnames from `themes/[your-theme]` to ensure that -# they stay unique. (Of course, vanilla doesn't do this ^^;;) -preload: -- features/getting_started -- features/compose -- features/home_timeline -- features/notifications +# (OPTIONAL) By default the theme will fallback to the default theme +# if a particular pack is not provided. You can specify different +# fallbacks here, or disable fallback behaviours altogether by +# specifying a `null` value. +fallback: diff --git a/app/javascript/themes/win95/index.js b/app/javascript/themes/win95/index.js new file mode 100644 index 000000000..bed6a1ef3 --- /dev/null +++ b/app/javascript/themes/win95/index.js @@ -0,0 +1,10 @@ +// These lines are the same as in glitch: +import 'font-awesome/css/font-awesome.css'; +require.context('../../images/', true); + +// …But we want to use our own styles instead. +import 'styles/win95.scss'; + +// Be sure to make this style file import from +// `themes/glitch/styles/index.scss` (the glitch styling), and not +// `application.scss` (which are the vanilla styles). diff --git a/app/javascript/themes/win95/theme.yml b/app/javascript/themes/win95/theme.yml new file mode 100644 index 000000000..43af38198 --- /dev/null +++ b/app/javascript/themes/win95/theme.yml @@ -0,0 +1,23 @@ +# win95 theme. + +# Ported over from `cybrespace:mastodon/theme_win95`. +# + +# You can use this theme file as inspiration for porting over +# a preëxisting Mastodon theme. + +# We only modify the `common` pack, which contains our styling. +pack: + common: + filename: index.js + stylesheet: true + # All unspecified packs will inherit from glitch. + +# By default, the glitch preloads will also be used here. You can +# disable them by setting `preload` to `null`. + +# preload: + +# The `fallback` parameter tells us to use glitch files for everything +# we haven't specified. +fallback: glitch diff --git a/app/lib/themes.rb b/app/lib/themes.rb index f7ec22fd2..7ced9f945 100644 --- a/app/lib/themes.rb +++ b/app/lib/themes.rb @@ -7,15 +7,27 @@ class Themes include Singleton def initialize + + core = YAML.load_file(Rails.root.join('app', 'javascript', 'core', 'theme.yml')) + core['pack'] = Hash.new unless core['pack'] + result = Hash.new Dir.glob(Rails.root.join('app', 'javascript', 'themes', '*', 'theme.yml')) do |path| data = YAML.load_file(path) name = File.basename(File.dirname(path)) if data['pack'] + data['name'] = name result[name] = data end end + + @core = core @conf = result + + end + + def core + @core end def get(name) diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml index 7ffa5ecc3..d92362bd7 100644 --- a/app/views/about/more.html.haml +++ b/app/views/about/more.html.haml @@ -2,7 +2,6 @@ = site_hostname - content_for :header_tags do - = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' = render partial: 'shared/og' .landing-page diff --git a/app/views/about/show.html.haml b/app/views/about/show.html.haml index 385b0b1dc..4f5b53470 100644 --- a/app/views/about/show.html.haml +++ b/app/views/about/show.html.haml @@ -3,7 +3,6 @@ - content_for :header_tags do %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) - = javascript_pack_tag 'about', integrity: true, crossorigin: 'anonymous' = render partial: 'shared/og' .landing-page diff --git a/app/views/admin/reports/show.html.haml b/app/views/admin/reports/show.html.haml index 5747cc274..7dd962bf2 100644 --- a/app/views/admin/reports/show.html.haml +++ b/app/views/admin/reports/show.html.haml @@ -1,6 +1,3 @@ -- content_for :header_tags do - = javascript_pack_tag 'admin', integrity: true, async: true, crossorigin: 'anonymous' - - content_for :page_title do = t('admin.reports.report', id: @report.id) diff --git a/app/views/admin/statuses/index.html.haml b/app/views/admin/statuses/index.html.haml index fe2581527..9747a92cf 100644 --- a/app/views/admin/statuses/index.html.haml +++ b/app/views/admin/statuses/index.html.haml @@ -1,6 +1,3 @@ -- content_for :header_tags do - = javascript_pack_tag 'admin', integrity: true, async: true, crossorigin: 'anonymous' - - content_for :page_title do = t('admin.statuses.title') diff --git a/app/views/home/index.html.haml b/app/views/home/index.html.haml index 63b3a0c26..e8a81656c 100644 --- a/app/views/home/index.html.haml +++ b/app/views/home/index.html.haml @@ -1,13 +1,7 @@ - content_for :header_tags do - - if theme_data['preload'] - - theme_data['preload'].each do |link| - %link{ href: asset_pack_path("#{link}.js"), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ %meta{name: 'applicationServerKey', content: Rails.configuration.x.vapid_public_key} %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) - = javascript_pack_tag "themes/#{current_theme}", integrity: true, crossorigin: 'anonymous' - = stylesheet_pack_tag "themes/#{current_theme}", integrity: true, media: 'all' - .app-holder#mastodon{ data: { props: Oj.dump(default_props) } } %noscript = image_tag asset_pack_path('logo.svg'), alt: 'Mastodon' diff --git a/app/views/layouts/_theme.html.haml b/app/views/layouts/_theme.html.haml new file mode 100644 index 000000000..cdec4b370 --- /dev/null +++ b/app/views/layouts/_theme.html.haml @@ -0,0 +1,10 @@ +- if theme + - if theme[:pack] != 'common' && theme[:common] + = render partial: 'layouts/theme', object: theme[:common] + - if theme[:pack] + = javascript_pack_tag theme[:name] ? "themes/#{theme[:name]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, crossorigin: 'anonymous' + - if theme[:stylesheet] + = stylesheet_pack_tag theme[:name] ? "themes/#{theme[:name]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, media: 'all' + - if theme[:preload] + - theme[:preload].each do |link| + %link{ href: asset_pack_path("#{link}.js"), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml index c98d85f7b..66382db50 100644 --- a/app/views/layouts/admin.html.haml +++ b/app/views/layouts/admin.html.haml @@ -1,6 +1,3 @@ -- content_for :header_tags do - = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' - - content_for :content do .admin-wrapper .sidebar-wrapper diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 24b74c787..99ae7d90d 100755 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -18,16 +18,16 @@ = ' - ' = title - = stylesheet_pack_tag 'common', media: 'all' - = javascript_pack_tag 'common', integrity: true, crossorigin: 'anonymous' + = javascript_pack_tag "locales", integrity: true, crossorigin: 'anonymous' = javascript_pack_tag "locale_#{I18n.locale}", integrity: true, crossorigin: 'anonymous' = csrf_meta_tags - - if controller_name != 'home' - = stylesheet_pack_tag 'application', integrity: true, media: 'all' - = yield :header_tags + -# These must come after :header_tags to ensure our initial state has been defined. + = render partial: 'layouts/theme', object: @core + = render partial: 'layouts/theme', object: @theme + - body_classes ||= @body_classes || '' - body_classes += ' system-font' if current_account&.user&.setting_system_font_ui diff --git a/app/views/layouts/auth.html.haml b/app/views/layouts/auth.html.haml index d8ac733f9..f4812ac6a 100644 --- a/app/views/layouts/auth.html.haml +++ b/app/views/layouts/auth.html.haml @@ -1,6 +1,3 @@ -- content_for :header_tags do - = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' - - content_for :content do .container .logo-container diff --git a/app/views/layouts/embedded.html.haml b/app/views/layouts/embedded.html.haml index 5fc60be17..3960167bf 100644 --- a/app/views/layouts/embedded.html.haml +++ b/app/views/layouts/embedded.html.haml @@ -4,10 +4,9 @@ %meta{ charset: 'utf-8' }/ %meta{ name: 'robots', content: 'noindex' }/ - = stylesheet_pack_tag 'common', media: 'all' = javascript_pack_tag 'common', integrity: true, crossorigin: 'anonymous' - = stylesheet_pack_tag 'application', integrity: true, media: 'all' + = javascript_pack_tag 'embed', integrity: true, crossorigin: 'anonymous' = javascript_pack_tag "locale_#{I18n.locale}", integrity: true, crossorigin: 'anonymous' - = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' - %body.embed + = render partial: 'layouts/theme', object: @core + = render partial: 'layouts/theme', object: @theme = yield diff --git a/app/views/layouts/error.html.haml b/app/views/layouts/error.html.haml index d0eae4434..9904b8fdd 100644 --- a/app/views/layouts/error.html.haml +++ b/app/views/layouts/error.html.haml @@ -5,8 +5,8 @@ %meta{ charset: 'utf-8' }/ %title= safe_join([yield(:page_title), Setting.default_settings['site_title']], ' - ') %meta{ content: 'width=device-width,initial-scale=1', name: 'viewport' }/ - = stylesheet_pack_tag 'common', media: 'all' - = stylesheet_pack_tag 'application', integrity: true, media: 'all' + = render partial: 'layouts/theme', object: @core + = render partial: 'layouts/theme', object: @theme %body.error .dialog %img{ alt: Setting.default_settings['site_title'], src: '/oops.gif' }/ diff --git a/app/views/layouts/modal.html.haml b/app/views/layouts/modal.html.haml index a819e098d..d3519f032 100644 --- a/app/views/layouts/modal.html.haml +++ b/app/views/layouts/modal.html.haml @@ -1,6 +1,3 @@ -- content_for :header_tags do - = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' - - content_for :content do - if user_signed_in? .account-header diff --git a/app/views/layouts/public.html.haml b/app/views/layouts/public.html.haml index 83e92b938..b3795eaad 100644 --- a/app/views/layouts/public.html.haml +++ b/app/views/layouts/public.html.haml @@ -1,6 +1,3 @@ -- content_for :header_tags do - = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' - - content_for :content do .container= yield .footer diff --git a/app/views/shares/show.html.haml b/app/views/shares/show.html.haml index 44b6f145f..4c0390c42 100644 --- a/app/views/shares/show.html.haml +++ b/app/views/shares/show.html.haml @@ -1,5 +1,4 @@ - content_for :header_tags do %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) - = javascript_pack_tag 'share', integrity: true, crossorigin: 'anonymous' #mastodon-compose{ data: { props: Oj.dump(default_props) } } diff --git a/app/views/tags/show.html.haml b/app/views/tags/show.html.haml index ea8b0faa3..e05fe1c39 100644 --- a/app/views/tags/show.html.haml +++ b/app/views/tags/show.html.haml @@ -3,7 +3,6 @@ - content_for :header_tags do %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) - = javascript_pack_tag 'about', integrity: true, crossorigin: 'anonymous' = render 'og' .landing-page.tag-page diff --git a/config/webpack/configuration.js b/config/webpack/configuration.js index 74f75d89b..9514bc547 100644 --- a/config/webpack/configuration.js +++ b/config/webpack/configuration.js @@ -12,14 +12,24 @@ const settings = safeLoad(readFileSync(configPath), 'utf8')[env.NODE_ENV]; const themeFiles = glob.sync('app/javascript/themes/*/theme.yml'); const themes = {}; +const core = function () { + const coreFile = resolve('app', 'javascript', 'core', 'theme.yml'); + const data = safeLoad(readFileSync(coreFile), 'utf8'); + if (!data.pack_directory) { + data.pack_directory = dirname(coreFile); + } + return data.pack ? data : {}; +}(); + for (let i = 0; i < themeFiles.length; i++) { const themeFile = themeFiles[i]; const data = safeLoad(readFileSync(themeFile), 'utf8'); + data.name = basename(dirname(themeFile)); if (!data.pack_directory) { data.pack_directory = dirname(themeFile); } if (data.pack) { - themes[basename(dirname(themeFile))] = data; + themes[data.name] = data; } } @@ -43,6 +53,7 @@ const output = { module.exports = { settings, + core, themes, env, loadersDir, diff --git a/config/webpack/generateLocalePacks.js b/config/webpack/generateLocalePacks.js index cd3bed50c..a943589f7 100644 --- a/config/webpack/generateLocalePacks.js +++ b/config/webpack/generateLocalePacks.js @@ -57,7 +57,7 @@ Object.keys(glitchMessages).forEach(function (key) { // import messages from '../../app/javascript/mastodon/locales/${locale}.json'; import localeData from ${JSON.stringify(localeDataPath)}; -import { setLocale } from '../../app/javascript/mastodon/locales'; +import { setLocale } from 'locales'; ${glitchInject} setLocale({messages: mergedMessages, localeData: localeData}); `; diff --git a/config/webpack/shared.js b/config/webpack/shared.js index 5d176db4e..5b90f27fb 100644 --- a/config/webpack/shared.js +++ b/config/webpack/shared.js @@ -6,33 +6,37 @@ const { sync } = require('glob'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); const ManifestPlugin = require('webpack-manifest-plugin'); const extname = require('path-complete-extname'); -const { env, settings, themes, output, loadersDir } = require('./configuration.js'); +const { env, settings, core, themes, output, loadersDir } = require('./configuration.js'); const localePackPaths = require('./generateLocalePacks'); -const extensionGlob = `**/*{${settings.extensions.join(',')}}*`; -const entryPath = join(settings.source_path, settings.source_entry_path); -const packPaths = sync(join(entryPath, extensionGlob)); +function reducePacks (data, into = {}) { + if (!data.pack) { + return into; + } + Object.keys(data.pack).reduce((map, entry) => { + const pack = data.pack[entry]; + if (!pack) { + return map; + } + const packFile = typeof pack === 'string' ? pack : pack.filename; + if (packFile) { + map[data.name ? `themes/${data.name}/${entry}` : `core/${entry}`] = resolve(data.pack_directory, packFile); + } + return map; + }, into); + return into; +} module.exports = { entry: Object.assign( - packPaths.reduce((map, entry) => { - const localMap = map; - const namespace = relative(join(entryPath), dirname(entry)); - localMap[join(namespace, basename(entry, extname(entry)))] = resolve(entry); - return localMap; - }, {}), + { locales: resolve('app', 'javascript', 'locales') }, localePackPaths.reduce((map, entry) => { const localMap = map; localMap[basename(entry, extname(entry, extname(entry)))] = resolve(entry); return localMap; }, {}), - Object.keys(themes).reduce( - (themePaths, name) => { - const themeData = themes[name]; - themePaths[`themes/${name}`] = resolve(themeData.pack_directory, themeData.pack); - return themePaths; - }, {} - ) + reducePacks(core), + Object.keys(themes).reduce((map, entry) => reducePacks(themes[entry], map), {}) ), output: { @@ -64,7 +68,7 @@ module.exports = { writeToFileEmit: true, }), new webpack.optimize.CommonsChunkPlugin({ - name: 'common', + name: 'locales', minChunks: Infinity, // It doesn't make sense to use common chunks with multiple frontend support. }), ], diff --git a/config/webpacker.yml b/config/webpacker.yml index 8d8470651..50d95813a 100644 --- a/config/webpacker.yml +++ b/config/webpacker.yml @@ -2,7 +2,6 @@ default: &default source_path: app/javascript - source_entry_path: packs public_output_path: packs cache_path: tmp/cache/webpacker @@ -13,17 +12,6 @@ default: &default # Reload manifest.json on all requests so we reload latest compiled packs cache_manifest: false - extensions: - - .js - - .sass - - .scss - - .css - - .png - - .svg - - .gif - - .jpeg - - .jpg - development: <<: *default compile: true From 8812bab6875024f76c59ab43d1dd3717e5e6da68 Mon Sep 17 00:00:00 2001 From: kibigo! Date: Tue, 21 Nov 2017 18:17:38 -0800 Subject: [PATCH 05/13] Minor fixes --- app/javascript/themes/win95/theme.yml | 5 ----- app/views/layouts/embedded.html.haml | 3 +-- config/webpack/configuration.js | 2 +- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/app/javascript/themes/win95/theme.yml b/app/javascript/themes/win95/theme.yml index 43af38198..c4ac8aa55 100644 --- a/app/javascript/themes/win95/theme.yml +++ b/app/javascript/themes/win95/theme.yml @@ -13,11 +13,6 @@ pack: stylesheet: true # All unspecified packs will inherit from glitch. -# By default, the glitch preloads will also be used here. You can -# disable them by setting `preload` to `null`. - -# preload: - # The `fallback` parameter tells us to use glitch files for everything # we haven't specified. fallback: glitch diff --git a/app/views/layouts/embedded.html.haml b/app/views/layouts/embedded.html.haml index 3960167bf..935670514 100644 --- a/app/views/layouts/embedded.html.haml +++ b/app/views/layouts/embedded.html.haml @@ -4,8 +4,7 @@ %meta{ charset: 'utf-8' }/ %meta{ name: 'robots', content: 'noindex' }/ - = javascript_pack_tag 'common', integrity: true, crossorigin: 'anonymous' - = javascript_pack_tag 'embed', integrity: true, crossorigin: 'anonymous' + = javascript_pack_tag "locales", integrity: true, crossorigin: 'anonymous' = javascript_pack_tag "locale_#{I18n.locale}", integrity: true, crossorigin: 'anonymous' = render partial: 'layouts/theme', object: @core = render partial: 'layouts/theme', object: @theme diff --git a/config/webpack/configuration.js b/config/webpack/configuration.js index 9514bc547..f8741c5d8 100644 --- a/config/webpack/configuration.js +++ b/config/webpack/configuration.js @@ -28,7 +28,7 @@ for (let i = 0; i < themeFiles.length; i++) { if (!data.pack_directory) { data.pack_directory = dirname(themeFile); } - if (data.pack) { + if (data.pack && typeof data.pack == 'object') { themes[data.name] = data; } } From 541fe9b110fce15c42ba15df27926552c234afd0 Mon Sep 17 00:00:00 2001 From: kibigo! Date: Thu, 30 Nov 2017 19:29:47 -0800 Subject: [PATCH 06/13] Skins support --- app/controllers/application_controller.rb | 43 +++++++++++------ .../settings/preferences_controller.rb | 1 + app/javascript/core/common.js | 3 ++ app/javascript/core/settings.js | 6 +++ app/javascript/core/theme.yml | 4 +- app/javascript/packs/common.js | 4 +- app/javascript/skins/vanilla/win95.scss | 1 + .../styles/mastodon/components.scss | 8 ++-- app/javascript/styles/win95.scss | 48 +++++++++---------- app/javascript/themes/glitch/packs/common.js | 2 - app/javascript/themes/glitch/packs/public.js | 1 - app/javascript/themes/win95/index.js | 10 ---- app/javascript/themes/win95/theme.yml | 18 ------- app/lib/themes.rb | 25 ++++++++++ app/lib/user_settings_decorator.rb | 7 ++- app/models/user.rb | 2 +- app/views/layouts/_theme.html.haml | 7 ++- app/views/settings/preferences/show.html.haml | 1 + config/locales/simple_form.en.yml | 2 + config/settings.yml | 1 + config/webpack/configuration.js | 28 +++++++++-- config/webpack/shared.js | 20 +++++++- 22 files changed, 157 insertions(+), 85 deletions(-) create mode 100644 app/javascript/skins/vanilla/win95.scss delete mode 100644 app/javascript/themes/win95/index.js delete mode 100644 app/javascript/themes/win95/theme.yml diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 7cc4eea27..f5753963d 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -12,6 +12,8 @@ class ApplicationController < ActionController::Base helper_method :current_account helper_method :current_session + helper_method :current_theme + helper_method :current_skin helper_method :single_user_mode? rescue_from ActionController::RoutingError, with: :not_found @@ -52,14 +54,14 @@ class ApplicationController < ActionController::Base new_user_session_path end - def pack(data, pack_name) + def pack(data, pack_name, skin = 'default') return nil unless pack?(data, pack_name) pack_data = { common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common'), name: data['name'], pack: pack_name, preload: nil, - stylesheet: false + skin: nil, } if data['pack'][pack_name].is_a?(Hash) pack_data[:common] = nil if data['pack'][pack_name]['use_common'] == false @@ -68,7 +70,11 @@ class ApplicationController < ActionController::Base pack_data[:preload] = [data['pack'][pack_name]['preload']] if data['pack'][pack_name]['preload'].is_a?(String) pack_data[:preload] = data['pack'][pack_name]['preload'] if data['pack'][pack_name]['preload'].is_a?(Array) end - pack_data[:stylesheet] = true if data['pack'][pack_name]['stylesheet'] + if skin != 'default' && data['skin'][skin] + pack_data[:skin] = skin if data['skin'][skin].include?(pack_name) + else # default skin + pack_data[:skin] = 'default' if data['pack'][pack_name]['stylesheet'] + end end pack_data end @@ -80,39 +86,39 @@ class ApplicationController < ActionController::Base false end - def nil_pack(data, pack_name) + def nil_pack(data, pack_name, skin = 'default') { - common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common'), + common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common', skin), name: data['name'], pack: nil, preload: nil, - stylesheet: false + skin: nil, } end - def resolve_pack(data, pack_name) - result = pack(data, pack_name) + def resolve_pack(data, pack_name, skin = 'default') + result = pack(data, pack_name, skin) unless result if data['name'] && data.key?('fallback') if data['fallback'].nil? - return nil_pack(data, pack_name) + return nil_pack(data, pack_name, skin) elsif data['fallback'].is_a?(String) && Themes.instance.get(data['fallback']) - return resolve_pack(Themes.instance.get(data['fallback']), pack_name) + return resolve_pack(Themes.instance.get(data['fallback']), pack_name, skin) elsif data['fallback'].is_a?(Array) data['fallback'].each do |fallback| - return resolve_pack(Themes.instance.get(fallback), pack_name) if Themes.instance.get(fallback) + return resolve_pack(Themes.instance.get(fallback), pack_name, skin) if Themes.instance.get(fallback) end end - return nil_pack(data, pack_name) + return nil_pack(data, pack_name, skin) end - return data.key?('name') && data['name'] != default_theme ? resolve_pack(Themes.instance.get(default_theme), pack_name) : nil_pack(data, pack_name) + return data.key?('name') && data['name'] != default_theme ? resolve_pack(Themes.instance.get(default_theme), pack_name, skin) : nil_pack(data, pack_name, skin) end result end def use_pack(pack_name) @core = resolve_pack(Themes.instance.core, pack_name) - @theme = resolve_pack(Themes.instance.get(current_theme), pack_name) + @theme = resolve_pack(Themes.instance.get(current_theme), pack_name, current_skin) end protected @@ -154,6 +160,15 @@ class ApplicationController < ActionController::Base current_user.setting_theme end + def default_skin + 'default' + end + + def current_skin + return default_skin unless Themes.instance.skins_for(current_theme).include? current_user&.setting_skin + current_user.setting_skin + end + def cache_collection(raw, klass) return raw unless klass.respond_to?(:with_includes) diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb index 3aefd90a2..56baebed2 100644 --- a/app/controllers/settings/preferences_controller.rb +++ b/app/controllers/settings/preferences_controller.rb @@ -39,6 +39,7 @@ class Settings::PreferencesController < Settings::BaseController :setting_system_font_ui, :setting_noindex, :setting_theme, + :setting_skin, notification_emails: %i(follow follow_request reblog favourite mention digest), interactions: %i(must_be_follower must_be_following) ) diff --git a/app/javascript/core/common.js b/app/javascript/core/common.js index 24c0fdf61..bb4b97935 100644 --- a/app/javascript/core/common.js +++ b/app/javascript/core/common.js @@ -1,5 +1,8 @@ // This file will be loaded on all pages, regardless of theme. import { start } from 'rails-ujs'; +import 'font-awesome/css/font-awesome.css'; + +require.context('images/', true); start(); diff --git a/app/javascript/core/settings.js b/app/javascript/core/settings.js index 7fb1d8e77..bc5f9ed1d 100644 --- a/app/javascript/core/settings.js +++ b/app/javascript/core/settings.js @@ -3,6 +3,8 @@ const { length } = require('stringz'); const { delegate } = require('rails-ujs'); +import { processBio } from 'themes/glitch/util/bio_metadata'; + delegate(document, '.account_display_name', 'input', ({ target }) => { const nameCounter = document.querySelector('.name-counter'); @@ -35,3 +37,7 @@ delegate(document, '#account_header', 'change', ({ target }) => { header.style.backgroundImage = `url(${url})`; }); + +delegate(document, '#user_setting_theme', 'change', ({ target }) => { + target.form.submit(); +}); diff --git a/app/javascript/core/theme.yml b/app/javascript/core/theme.yml index 17e8e66b3..0dc05a149 100644 --- a/app/javascript/core/theme.yml +++ b/app/javascript/core/theme.yml @@ -4,7 +4,9 @@ pack: about: admin: admin.js auth: - common: common.js + common: + filename: common.js + stylesheet: true embed: embed.js error: home: diff --git a/app/javascript/packs/common.js b/app/javascript/packs/common.js index f3156c1c6..5d42509c5 100644 --- a/app/javascript/packs/common.js +++ b/app/javascript/packs/common.js @@ -1,3 +1 @@ -import 'font-awesome/css/font-awesome.css'; -import 'styles/application.scss' -require.context('../images/', true); +import 'styles/application.scss'; diff --git a/app/javascript/skins/vanilla/win95.scss b/app/javascript/skins/vanilla/win95.scss new file mode 100644 index 000000000..298f6ee9d --- /dev/null +++ b/app/javascript/skins/vanilla/win95.scss @@ -0,0 +1 @@ +@import 'styles/win95'; diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 0ded6f159..8566585c5 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -2075,7 +2075,7 @@ .getting-started { box-sizing: border-box; padding-bottom: 235px; - background: url('../images/mastodon-getting-started.png') no-repeat 0 100%; + background: url('~images/mastodon-getting-started.png') no-repeat 0 100%; flex: 1 0 auto; p { @@ -2270,7 +2270,7 @@ button.icon-button.active i.fa-retweet { justify-content: center; & > div { - background: url('../images/mastodon-not-found.png') no-repeat center -50px; + background: url('~images/mastodon-not-found.png') no-repeat center -50px; padding-top: 210px; width: 100%; } @@ -3143,7 +3143,7 @@ button.icon-button.active i.fa-retweet { img, canvas { display: block; - background: url('../images/void.png') repeat; + background: url('~images/void.png') repeat; object-fit: contain; } @@ -3390,7 +3390,7 @@ button.icon-button.active i.fa-retweet { } .onboarding-modal__page-one__elephant-friend { - background: url('../images/elephant-friend-1.png') no-repeat center center / contain; + background: url('~images/elephant-friend-1.png') no-repeat center center / contain; width: 155px; height: 193px; margin-right: 15px; diff --git a/app/javascript/styles/win95.scss b/app/javascript/styles/win95.scss index 6c89fc5bf..d683218b0 100644 --- a/app/javascript/styles/win95.scss +++ b/app/javascript/styles/win95.scss @@ -1,7 +1,7 @@ // win95 theme from cybrespace. -// Modified to inherit glitch styles (themes/glitch/styles/index.scss) -// instead of vanilla ones (./application.scss) +// Modified by kibi! to use webpack package syntax for urls (eg, +// `url(~images/…)`) for easy importing into skins. $win95-bg: #bfbfbf; $win95-dark-grey: #404040; @@ -73,10 +73,10 @@ $ui-highlight-color: $win95-window-header; @font-face { font-family:"premillenium"; - src: url('../fonts/premillenium/MSSansSerif.ttf') format('truetype'); + src: url('~fonts/premillenium/MSSansSerif.ttf') format('truetype'); } -@import '../themes/glitch/styles/index'; // Imports glitch themes +@import 'application'; /* borrowed from cybrespace style: wider columns and full column width images */ @@ -179,7 +179,7 @@ body.admin { font-size:0px; color:$win95-bg; - background-image: url("../images/start.png"); + background-image: url("~images/start.png"); background-repeat:no-repeat; background-position:8%; background-clip:padding-box; @@ -716,7 +716,7 @@ body.admin { font-size:0px; color:$win95-bg; - background-image: url("../images/start.png"); + background-image: url("~images/start.png"); background-repeat:no-repeat; background-position:8%; background-clip:padding-box; @@ -1055,40 +1055,40 @@ body.admin { } .column-link[href="/web/timelines/public"] { - background-image: url("../images/icon_public.png"); - &:hover { background-image: url("../images/icon_public.png"); } + background-image: url("~images/icon_public.png"); + &:hover { background-image: url("~images/icon_public.png"); } } .column-link[href="/web/timelines/public/local"] { - background-image: url("../images/icon_local.png"); - &:hover { background-image: url("../images/icon_local.png"); } + background-image: url("~images/icon_local.png"); + &:hover { background-image: url("~images/icon_local.png"); } } .column-link[href="/web/pinned"] { - background-image: url("../images/icon_pin.png"); - &:hover { background-image: url("../images/icon_pin.png"); } + background-image: url("~images/icon_pin.png"); + &:hover { background-image: url("~images/icon_pin.png"); } } .column-link[href="/web/favourites"] { - background-image: url("../images/icon_likes.png"); - &:hover { background-image: url("../images/icon_likes.png"); } + background-image: url("~images/icon_likes.png"); + &:hover { background-image: url("~images/icon_likes.png"); } } .column-link[href="/web/blocks"] { - background-image: url("../images/icon_blocks.png"); - &:hover { background-image: url("../images/icon_blocks.png"); } + background-image: url("~images/icon_blocks.png"); + &:hover { background-image: url("~images/icon_blocks.png"); } } .column-link[href="/web/mutes"] { - background-image: url("../images/icon_mutes.png"); - &:hover { background-image: url("../images/icon_mutes.png"); } + background-image: url("~images/icon_mutes.png"); + &:hover { background-image: url("~images/icon_mutes.png"); } } .column-link[href="/settings/preferences"] { - background-image: url("../images/icon_settings.png"); - &:hover { background-image: url("../images/icon_settings.png"); } + background-image: url("~images/icon_settings.png"); + &:hover { background-image: url("~images/icon_settings.png"); } } .column-link[href="/about/more"] { - background-image: url("../images/icon_about.png"); - &:hover { background-image: url("../images/icon_about.png"); } + background-image: url("~images/icon_about.png"); + &:hover { background-image: url("~images/icon_about.png"); } } .column-link[href="/auth/sign_out"] { - background-image: url("../images/icon_logout.png"); - &:hover { background-image: url("../images/icon_logout.png"); } + background-image: url("~images/icon_logout.png"); + &:hover { background-image: url("~images/icon_logout.png"); } } .getting-started__footer { diff --git a/app/javascript/themes/glitch/packs/common.js b/app/javascript/themes/glitch/packs/common.js index f4fa129e1..fd4254a0e 100644 --- a/app/javascript/themes/glitch/packs/common.js +++ b/app/javascript/themes/glitch/packs/common.js @@ -1,3 +1 @@ -import 'font-awesome/css/font-awesome.css'; -require.context('images/', true); import 'themes/glitch/styles/index.scss'; diff --git a/app/javascript/themes/glitch/packs/public.js b/app/javascript/themes/glitch/packs/public.js index d9a1b9655..410e66716 100644 --- a/app/javascript/themes/glitch/packs/public.js +++ b/app/javascript/themes/glitch/packs/public.js @@ -1,5 +1,4 @@ import loadPolyfills from 'themes/glitch/util/load_polyfills'; -import { processBio } from 'themes/glitch/util/bio_metadata'; import ready from 'themes/glitch/util/ready'; function main() { diff --git a/app/javascript/themes/win95/index.js b/app/javascript/themes/win95/index.js deleted file mode 100644 index bed6a1ef3..000000000 --- a/app/javascript/themes/win95/index.js +++ /dev/null @@ -1,10 +0,0 @@ -// These lines are the same as in glitch: -import 'font-awesome/css/font-awesome.css'; -require.context('../../images/', true); - -// …But we want to use our own styles instead. -import 'styles/win95.scss'; - -// Be sure to make this style file import from -// `themes/glitch/styles/index.scss` (the glitch styling), and not -// `application.scss` (which are the vanilla styles). diff --git a/app/javascript/themes/win95/theme.yml b/app/javascript/themes/win95/theme.yml deleted file mode 100644 index c4ac8aa55..000000000 --- a/app/javascript/themes/win95/theme.yml +++ /dev/null @@ -1,18 +0,0 @@ -# win95 theme. - -# Ported over from `cybrespace:mastodon/theme_win95`. -# - -# You can use this theme file as inspiration for porting over -# a preëxisting Mastodon theme. - -# We only modify the `common` pack, which contains our styling. -pack: - common: - filename: index.js - stylesheet: true - # All unspecified packs will inherit from glitch. - -# The `fallback` parameter tells us to use glitch files for everything -# we haven't specified. -fallback: glitch diff --git a/app/lib/themes.rb b/app/lib/themes.rb index 7ced9f945..0819e2c90 100644 --- a/app/lib/themes.rb +++ b/app/lib/themes.rb @@ -17,10 +17,31 @@ class Themes name = File.basename(File.dirname(path)) if data['pack'] data['name'] = name + data['skin'] = { 'default' => [] } result[name] = data end end + Dir.glob(Rails.root.join('app', 'javascript', 'skins', '*', '*')) do |path| + ext = File.extname(path) + skin = File.basename(path) + name = File.basename(File.dirname(path)) + if result[name] + if File.directory?(path) + pack = [] + Dir.glob(File.join(path, '*.{css,scss}')) do |sheet| + pack.push(File.basename(sheet, File.extname(sheet))) + end + elsif ext.match?(/^\.s?css$/i) + skin = File.basename(path, ext) + pack = ['common'] + end + if skin != 'default' + result[name]['skin'][skin] = pack + end + end + end + @core = core @conf = result @@ -37,4 +58,8 @@ class Themes def names @conf.keys end + + def skins_for(name) + @conf[name]['skin'].keys + end end diff --git a/app/lib/user_settings_decorator.rb b/app/lib/user_settings_decorator.rb index d86959c0b..730c70177 100644 --- a/app/lib/user_settings_decorator.rb +++ b/app/lib/user_settings_decorator.rb @@ -27,6 +27,7 @@ class UserSettingsDecorator user.settings['system_font_ui'] = system_font_ui_preference if change?('setting_system_font_ui') user.settings['noindex'] = noindex_preference if change?('setting_noindex') user.settings['theme'] = theme_preference if change?('setting_theme') + user.settings['skin'] = skin_preference if change?('setting_skin') end def merged_notification_emails @@ -76,7 +77,11 @@ class UserSettingsDecorator def theme_preference settings['setting_theme'] end - + + def skin_preference + settings['setting_skin'] + end + def boolean_cast_setting(key) settings[key] == '1' end diff --git a/app/models/user.rb b/app/models/user.rb index b9b228c00..1d42d4f70 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -74,7 +74,7 @@ class User < ApplicationRecord has_many :session_activations, dependent: :destroy delegate :auto_play_gif, :default_sensitive, :unfollow_modal, :boost_modal, :delete_modal, - :reduce_motion, :system_font_ui, :noindex, :theme, + :reduce_motion, :system_font_ui, :noindex, :theme, :skin, to: :settings, prefix: :setting, allow_nil: false def confirmed? diff --git a/app/views/layouts/_theme.html.haml b/app/views/layouts/_theme.html.haml index cdec4b370..941ccc914 100644 --- a/app/views/layouts/_theme.html.haml +++ b/app/views/layouts/_theme.html.haml @@ -3,8 +3,11 @@ = render partial: 'layouts/theme', object: theme[:common] - if theme[:pack] = javascript_pack_tag theme[:name] ? "themes/#{theme[:name]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, crossorigin: 'anonymous' - - if theme[:stylesheet] - = stylesheet_pack_tag theme[:name] ? "themes/#{theme[:name]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, media: 'all' + - if theme[:skin] + - if !theme[:name] || theme[:skin] == 'default' + = stylesheet_pack_tag theme[:name] ? "themes/#{theme[:name]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, media: 'all' + - else + = stylesheet_pack_tag "skins/#{theme[:name]}/#{theme[:skin]}/#{theme[:pack]}" - if theme[:preload] - theme[:preload].each do |link| %link{ href: asset_pack_path("#{link}.js"), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ diff --git a/app/views/settings/preferences/show.html.haml b/app/views/settings/preferences/show.html.haml index 69e26a7be..0d487d9f3 100644 --- a/app/views/settings/preferences/show.html.haml +++ b/app/views/settings/preferences/show.html.haml @@ -28,6 +28,7 @@ .fields-group - if Themes.instance.names.size > 1 = f.input :setting_theme, collection: Themes.instance.names, label_method: lambda { |theme| I18n.t("themes.#{theme}", default: theme) }, wrapper: :with_label, include_blank: false + = f.input :setting_skin, collection: Themes.instance.skins_for(current_theme), label_method: lambda { |skin| I18n.t("themes.#{current_theme}.skins.#{skin}", default: skin) }, wrapper: :with_label, include_blank: false = f.input :setting_unfollow_modal, as: :boolean, wrapper: :with_label = f.input :setting_boost_modal, as: :boolean, wrapper: :with_label diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index faf41f316..b9ef21fef 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -15,6 +15,7 @@ en: other: %{count} characters left setting_noindex: Affects your public profile and status pages setting_theme: Affects how Mastodon looks when you're logged in from any device. + setting_skin: Reskins the selected Mastodon theme imports: data: CSV file exported from another Mastodon instance sessions: @@ -47,6 +48,7 @@ en: setting_reduce_motion: Reduce motion in animations setting_system_font_ui: Use system's default font setting_theme: Site theme + setting_skin: Skin setting_unfollow_modal: Show confirmation dialog before unfollowing someone severity: Severity type: Import type diff --git a/config/settings.yml b/config/settings.yml index 6983484d0..5abf647e8 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -26,6 +26,7 @@ defaults: &defaults system_font_ui: false noindex: false theme: 'glitch' + skin: 'default' notification_emails: follow: false reblog: false diff --git a/config/webpack/configuration.js b/config/webpack/configuration.js index f8741c5d8..cb31c6ab8 100644 --- a/config/webpack/configuration.js +++ b/config/webpack/configuration.js @@ -1,15 +1,16 @@ // Common configuration for webpacker loaded from config/webpacker.yml -const { basename, dirname, join, resolve } = require('path'); +const { basename, dirname, extname, join, resolve } = require('path'); const { env } = require('process'); const { safeLoad } = require('js-yaml'); -const { readFileSync } = require('fs'); +const { lstatSync, readFileSync } = require('fs'); const glob = require('glob'); const configPath = resolve('config', 'webpacker.yml'); const loadersDir = join(__dirname, 'loaders'); const settings = safeLoad(readFileSync(configPath), 'utf8')[env.NODE_ENV]; const themeFiles = glob.sync('app/javascript/themes/*/theme.yml'); +const skinFiles = glob.sync('app/javascript/skins/*/*'); const themes = {}; const core = function () { @@ -25,14 +26,35 @@ for (let i = 0; i < themeFiles.length; i++) { const themeFile = themeFiles[i]; const data = safeLoad(readFileSync(themeFile), 'utf8'); data.name = basename(dirname(themeFile)); + data.skin = {}; if (!data.pack_directory) { data.pack_directory = dirname(themeFile); } - if (data.pack && typeof data.pack == 'object') { + if (data.pack && typeof data.pack === 'object') { themes[data.name] = data; } } +for (let i = 0; i < skinFiles.length; i++) { + const skinFile = skinFiles[i]; + let skin = basename(skinFile); + const name = basename(dirname(skinFile)); + if (!themes[name]) { + continue; + } + const data = themes[name].skin; + if (lstatSync(skinFile).isDirectory()) { + data[skin] = {}; + const skinPacks = glob.sync(skinFile, '*.{css,scss}'); + for (let j = 0; j < skinPacks.length; j++) { + const pack = skinPacks[i]; + data[skin][basename(pack, extname(pack))] = pack; + } + } else if ((skin = skin.match(/^(.*)\.s?css$/i))) { + data[skin[1]] = { common: skinFile }; + } +} + function removeOuterSlashes(string) { return string.replace(/^\/*/, '').replace(/\/*$/, ''); } diff --git a/config/webpack/shared.js b/config/webpack/shared.js index 5b90f27fb..a2550bc81 100644 --- a/config/webpack/shared.js +++ b/config/webpack/shared.js @@ -1,7 +1,7 @@ // Note: You must restart bin/webpack-dev-server for changes to take effect const webpack = require('webpack'); -const { basename, dirname, join, relative, resolve } = require('path'); +const { basename, join, resolve } = require('path'); const { sync } = require('glob'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); const ManifestPlugin = require('webpack-manifest-plugin'); @@ -24,6 +24,24 @@ function reducePacks (data, into = {}) { } return map; }, into); + if (data.name) { + Object.keys(data.skin).reduce((map, entry) => { + const skin = data.skin[entry]; + const skinName = entry; + if (!skin) { + return map; + } + Object.keys(skin).reduce((map, entry) => { + const packFile = skin[entry]; + if (!packFile) { + return map; + } + map[`skins/${data.name}/${skinName}/${entry}`] = resolve(packFile); + return map; + }, into); + return map; + }, into); + } return into; } From d216547382cf1f3419de31e1ee06272e816ea339 Mon Sep 17 00:00:00 2001 From: kibigo! Date: Sun, 3 Dec 2017 22:30:45 -0800 Subject: [PATCH 07/13] Fixed typos --- app/controllers/auth/registrations_controller.rb | 2 +- app/lib/themes.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb index cc7a69ab0..42e852c04 100644 --- a/app/controllers/auth/registrations_controller.rb +++ b/app/controllers/auth/registrations_controller.rb @@ -5,7 +5,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController before_action :check_enabled_registrations, only: [:new, :create] before_action :configure_sign_up_params, only: [:create] - before_action :set_path + before_action :set_pack before_action :set_sessions, only: [:edit, :update] before_action :set_instance_presenter, only: [:new, :create, :update] diff --git a/app/lib/themes.rb b/app/lib/themes.rb index 0819e2c90..f1796d0e3 100644 --- a/app/lib/themes.rb +++ b/app/lib/themes.rb @@ -32,7 +32,7 @@ class Themes Dir.glob(File.join(path, '*.{css,scss}')) do |sheet| pack.push(File.basename(sheet, File.extname(sheet))) end - elsif ext.match?(/^\.s?css$/i) + elsif ext.match(/^\.s?css$/i) skin = File.basename(path, ext) pack = ['common'] end From bc4fa6b198557a7f3989eb0865e2c77ac7451d29 Mon Sep 17 00:00:00 2001 From: kibigo! Date: Sun, 3 Dec 2017 23:26:40 -0800 Subject: [PATCH 08/13] Rename themes -> flavours ? ? --- .gitmodules | 3 - app/controllers/application_controller.rb | 36 +++--- app/javascript/core/settings.js | 2 +- .../glitch/actions/accounts.js | 2 +- .../glitch/actions/alerts.js | 0 .../glitch/actions/blocks.js | 2 +- .../glitch/actions/bundles.js | 0 .../glitch/actions/cards.js | 2 +- .../glitch/actions/columns.js | 0 .../glitch/actions/compose.js | 4 +- .../glitch/actions/domain_blocks.js | 2 +- .../glitch/actions/emojis.js | 0 .../glitch/actions/favourites.js | 2 +- .../glitch/actions/height_cache.js | 0 .../glitch/actions/interactions.js | 2 +- .../glitch/actions/local_settings.js | 0 .../glitch/actions/modal.js | 0 .../glitch/actions/mutes.js | 4 +- .../glitch/actions/notifications.js | 2 +- .../glitch/actions/onboarding.js | 0 .../glitch/actions/pin_statuses.js | 4 +- .../glitch/actions/push_notifications.js | 0 .../glitch/actions/reports.js | 2 +- .../glitch/actions/search.js | 2 +- .../glitch/actions/settings.js | 0 .../glitch/actions/statuses.js | 2 +- .../glitch/actions/store.js | 0 .../glitch/actions/streaming.js | 2 +- .../glitch/actions/timelines.js | 2 +- .../glitch/components/account.js | 2 +- .../glitch/components/attachment_list.js | 0 .../glitch/components/autosuggest_emoji.js | 2 +- .../glitch/components/autosuggest_textarea.js | 4 +- .../glitch/components/avatar.js | 0 .../glitch/components/avatar_overlay.js | 0 .../glitch/components/button.js | 0 .../glitch/components/collapsable.js | 2 +- .../glitch/components/column.js | 2 +- .../glitch/components/column_back_button.js | 0 .../components/column_back_button_slim.js | 0 .../glitch/components/column_header.js | 3 +- .../glitch/components/display_name.js | 0 .../glitch/components/dropdown_menu.js | 2 +- .../components/extended_video_player.js | 0 .../glitch/components/icon_button.js | 2 +- .../intersection_observer_article.js | 4 +- .../glitch/components/load_more.js | 0 .../glitch/components/loading_indicator.js | 0 .../glitch/components/media_gallery.js | 4 +- .../glitch/components/missing_indicator.js | 0 .../components/notification_purge_buttons.js | 0 .../glitch/components/permalink.js | 0 .../glitch/components/relative_timestamp.js | 0 .../glitch/components/scrollable_list.js | 6 +- .../glitch/components/setting_text.js | 0 .../glitch/components/status.js | 4 +- .../glitch/components/status_action_bar.js | 7 +- .../glitch/components/status_content.js | 2 +- .../glitch/components/status_header.js | 0 .../glitch/components/status_list.js | 2 +- .../glitch/components/status_prepend.js | 0 .../components/status_visibility_icon.js | 0 .../glitch/containers/account_container.js | 12 +- .../glitch/containers/card_container.js | 2 +- .../glitch/containers/compose_container.js | 8 +- .../containers/dropdown_menu_container.js | 6 +- ...intersection_observer_article_container.js | 4 +- .../glitch/containers/mastodon.js | 12 +- .../containers/media_gallery_container.js | 2 +- .../notification_purge_buttons_container.js | 6 +- .../glitch/containers/status_container.js | 20 +-- .../glitch/containers/timeline_container.js | 10 +- .../glitch/containers/video_container.js | 2 +- .../features/account/components/action_bar.js | 4 +- .../features/account/components/header.js | 10 +- .../account_gallery/components/media_item.js | 2 +- .../glitch/features/account_gallery/index.js | 16 +-- .../account_timeline/components/header.js | 6 +- .../containers/header_container.js | 16 +-- .../glitch/features/account_timeline/index.js | 4 +- .../glitch/features/blocks/index.js | 10 +- .../components/column_settings.js | 2 +- .../containers/column_settings_container.js | 2 +- .../features/community_timeline/index.js | 12 +- .../compose/components/advanced_options.js | 0 .../components/advanced_options_toggle.js | 0 .../compose/components/attach_options.js | 4 +- .../compose/components/autosuggest_account.js | 4 +- .../compose/components/character_counter.js | 0 .../compose/components/compose_form.js | 12 +- .../features/compose/components/dropdown.js | 2 +- .../components/emoji_picker_dropdown.js | 4 +- .../compose/components/navigation_bar.js | 6 +- .../compose/components/privacy_dropdown.js | 4 +- .../compose/components/reply_indicator.js | 6 +- .../features/compose/components/search.js | 2 +- .../compose/components/search_results.js | 4 +- .../compose/components/text_icon_button.js | 0 .../features/compose/components/upload.js | 4 +- .../compose/components/upload_button.js | 2 +- .../compose/components/upload_form.js | 0 .../compose/components/upload_progress.js | 2 +- .../features/compose/components/warning.js | 2 +- .../containers/advanced_options_container.js | 2 +- .../autosuggest_account_container.js | 2 +- .../containers/compose_form_container.js | 4 +- .../emoji_picker_dropdown_container.js | 4 +- .../containers/navigation_container.js | 2 +- .../containers/privacy_dropdown_container.js | 6 +- .../containers/reply_indicator_container.js | 4 +- .../compose/containers/search_container.js | 2 +- .../containers/search_results_container.js | 0 .../containers/sensitive_button_container.js | 6 +- .../containers/spoiler_button_container.js | 2 +- .../containers/upload_button_container.js | 2 +- .../compose/containers/upload_container.js | 2 +- .../containers/upload_form_container.js | 0 .../containers/upload_progress_container.js | 0 .../compose/containers/warning_container.js | 2 +- .../glitch/features/compose/index.js | 10 +- .../containers/column_settings_container.js | 4 +- .../glitch/features/direct_timeline/index.js | 12 +- .../features/favourited_statuses/index.js | 10 +- .../glitch/features/favourites/index.js | 10 +- .../components/account_authorize.js | 8 +- .../containers/account_authorize_container.js | 4 +- .../glitch/features/follow_requests/index.js | 8 +- .../glitch/features/followers/index.js | 14 +-- .../glitch/features/following/index.js | 14 +-- .../features/generic_not_found/index.js | 11 ++ .../glitch/features/getting_started/index.js | 10 +- .../glitch/features/hashtag_timeline/index.js | 12 +- .../components/column_settings.js | 4 +- .../containers/column_settings_container.js | 2 +- .../glitch/features/home_timeline/index.js | 10 +- .../glitch/features/local_settings/index.js | 4 +- .../local_settings/navigation/index.js | 0 .../local_settings/navigation/item/index.js | 0 .../local_settings/navigation/item/style.scss | 0 .../local_settings/navigation/style.scss | 0 .../features/local_settings/page/index.js | 0 .../local_settings/page/item/index.js | 0 .../local_settings/page/item/style.scss | 0 .../features/local_settings/page/style.scss | 0 .../glitch/features/local_settings/style.scss | 0 .../glitch/features/mutes/index.js | 10 +- .../components/clear_column_button.js | 0 .../components/column_settings.js | 0 .../notifications/components/follow.js | 4 +- .../notifications/components/notification.js | 2 +- .../notifications/components/overlay.js | 0 .../components/setting_toggle.js | 0 .../containers/column_settings_container.js | 8 +- .../containers/notification_container.js | 4 +- .../containers/overlay_container.js | 2 +- .../glitch/features/notifications/index.js | 10 +- .../glitch/features/pinned_statuses/index.js | 8 +- .../containers/column_settings_container.js | 4 +- .../glitch/features/public_timeline/index.js | 12 +- .../glitch/features/reblogs/index.js | 10 +- .../report/components/status_check_box.js | 0 .../containers/status_check_box_container.js | 2 +- .../features/standalone/compose/index.js | 20 +++ .../standalone/hashtag_timeline/index.js | 8 +- .../standalone/public_timeline/index.js | 8 +- .../features/status/components/action_bar.js | 6 +- .../glitch/features/status/components/card.js | 0 .../status/components/detailed_status.js | 14 +-- .../status/containers/card_container.js | 0 .../glitch/features/status/index.js | 26 ++-- .../features/ui/components/actions_modal.js | 10 +- .../features/ui/components/boost_modal.js | 10 +- .../glitch/features/ui/components/bundle.js | 0 .../ui/components/bundle_column_error.js | 4 +- .../ui/components/bundle_modal_error.js | 2 +- .../glitch/features/ui/components/column.js | 4 +- .../features/ui/components/column_header.js | 0 .../features/ui/components/column_link.js | 0 .../features/ui/components/column_loading.js | 4 +- .../ui/components/column_subheading.js | 0 .../features/ui/components/columns_area.js | 4 +- .../ui/components/confirmation_modal.js | 2 +- .../features/ui/components/doodle_modal.js | 6 +- .../features/ui/components/drawer_loading.js | 0 .../features/ui/components/embed_modal.js | 0 .../features/ui/components/image_loader.js | 0 .../features/ui/components/media_modal.js | 4 +- .../features/ui/components/modal_loading.js | 2 +- .../features/ui/components/modal_root.js | 2 +- .../features/ui/components/mute_modal.js | 8 +- .../ui/components/onboarding_modal.js | 10 +- .../features/ui/components/report_modal.js | 10 +- .../glitch/features/ui/components/tabs_bar.js | 2 +- .../features/ui/components/upload_area.js | 2 +- .../features/ui/components/video_modal.js | 2 +- .../ui/containers/bundle_container.js | 2 +- .../ui/containers/columns_area_container.js | 0 .../ui/containers/loading_bar_container.js | 0 .../features/ui/containers/modal_container.js | 2 +- .../ui/containers/notifications_container.js | 4 +- .../ui/containers/status_list_container.js | 6 +- .../glitch/features/ui/index.js | 16 +-- .../glitch/features/video/index.js | 2 +- .../glitch/middleware/errors.js | 2 +- .../glitch/middleware/loading_bar.js | 0 .../glitch/middleware/sounds.js | 0 .../glitch/packs/about.js | 6 +- .../flavours/glitch/packs/common.js | 1 + app/javascript/flavours/glitch/packs/home.js | 7 ++ .../glitch/packs/public.js | 12 +- .../glitch/packs/share.js | 6 +- .../glitch/reducers/accounts.js | 24 ++-- .../glitch/reducers/accounts_counters.js | 22 ++-- .../glitch/reducers/alerts.js | 2 +- .../glitch/reducers/cards.js | 2 +- .../glitch/reducers/compose.js | 10 +- .../glitch/reducers/contexts.js | 4 +- .../glitch/reducers/custom_emojis.js | 6 +- .../glitch/reducers/height_cache.js | 2 +- .../glitch/reducers/index.js | 0 .../glitch/reducers/local_settings.js | 4 +- .../glitch/reducers/media_attachments.js | 2 +- .../glitch/reducers/meta.js | 2 +- .../glitch/reducers/modal.js | 2 +- .../glitch/reducers/mutes.js | 2 +- .../glitch/reducers/notifications.js | 6 +- .../glitch/reducers/push_notifications.js | 4 +- .../glitch/reducers/relationships.js | 4 +- .../glitch/reducers/reports.js | 2 +- .../glitch/reducers/search.js | 4 +- .../glitch/reducers/settings.js | 10 +- .../glitch/reducers/status_lists.js | 6 +- .../glitch/reducers/statuses.js | 18 +-- .../glitch/reducers/timelines.js | 4 +- .../glitch/reducers/user_lists.js | 8 +- .../glitch/selectors/index.js | 0 .../glitch/service_worker/entry.js | 0 .../service_worker/web_push_notifications.js | 0 .../glitch/store/configureStore.js | 0 .../glitch/styles/_mixins.scss | 0 .../glitch/styles/about.scss | 0 .../glitch/styles/accounts.scss | 0 .../glitch/styles/admin.scss | 0 .../glitch/styles/basics.scss | 0 .../glitch/styles/boost.scss | 0 .../glitch/styles/compact_header.scss | 0 .../glitch/styles/components.scss | 0 .../glitch/styles/containers.scss | 0 .../glitch/styles/doodle.scss | 0 .../glitch/styles/emoji_picker.scss | 0 .../glitch/styles/footer.scss | 0 .../glitch/styles/forms.scss | 0 .../glitch/styles/index.scss | 0 .../glitch/styles/landing_strip.scss | 0 .../glitch/styles/lists.scss | 0 .../glitch/styles/reset copy.scss | 0 .../glitch/styles/reset.scss | 0 .../glitch/styles/rtl.scss | 0 .../glitch/styles/stream_entries.scss | 0 .../glitch/styles/tables.scss | 0 .../glitch/styles/variables.scss | 0 .../{themes => flavours}/glitch/theme.yml | 8 +- .../{themes => flavours}/glitch/util/api.js | 0 .../flavours/glitch/util/async-components.js | 115 ++++++++++++++++++ .../glitch/util/base_polyfills.js | 0 .../glitch/util/bio_metadata.js | 0 .../glitch/util/counter.js | 0 .../glitch/util/emoji/emoji_compressed.js | 0 .../glitch/util/emoji/emoji_map.json | 0 .../util/emoji/emoji_mart_data_light.js | 0 .../util/emoji/emoji_mart_search_light.js | 0 .../glitch/util/emoji/emoji_picker.js | 0 .../util/emoji/emoji_unicode_mapping_light.js | 0 .../glitch/util/emoji/emoji_utils.js | 0 .../glitch/util/emoji/index.js | 2 +- .../glitch/util/emoji/unicode_to_filename.js | 0 .../util/emoji/unicode_to_unified_name.js | 0 .../glitch/util/extra_polyfills.js | 0 .../glitch/util/fullscreen.js | 0 .../glitch/util/get_rect_from_entry.js | 0 .../glitch/util/initial_state.js | 0 .../util/intersection_observer_wrapper.js | 0 .../glitch/util/is_mobile.js | 0 .../glitch/util/link_header.js | 0 .../glitch/util/load_polyfills.js | 0 .../{themes => flavours}/glitch/util/main.js | 2 +- .../glitch/util/optional_motion.js | 2 +- .../glitch/util/performance.js | 0 .../glitch/util/react_router_helpers.js | 6 +- .../{themes => flavours}/glitch/util/ready.js | 0 .../glitch/util/reduced_motion.js | 0 .../{themes => flavours}/glitch/util/rtl.js | 0 .../glitch/util/schedule_idle_task.js | 0 .../glitch/util/scroll.js | 0 .../glitch/util/stream.js | 0 .../glitch/util/url_regex.js | 0 .../{themes => flavours}/glitch/util/uuid.js | 0 .../glitch/util/web_push_subscription.js | 4 +- .../{themes => flavours}/vanilla/theme.yml | 0 .../features/generic_not_found/index.js | 11 -- .../features/standalone/compose/index.js | 20 --- app/javascript/themes/glitch/packs/common.js | 1 - app/javascript/themes/glitch/packs/home.js | 7 -- .../themes/glitch/util/async-components.js | 115 ------------------ app/javascript/themes/mastodon-go | 1 - app/lib/themes.rb | 6 +- app/models/user.rb | 2 +- app/views/layouts/_theme.html.haml | 6 +- app/views/settings/preferences/show.html.haml | 2 +- config/locales/simple_form.en.yml | 6 +- config/settings.yml | 2 +- config/webpack/configuration.js | 22 ++-- config/webpack/shared.js | 6 +- 313 files changed, 665 insertions(+), 681 deletions(-) rename app/javascript/{themes => flavours}/glitch/actions/accounts.js (99%) rename app/javascript/{themes => flavours}/glitch/actions/alerts.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/blocks.js (97%) rename app/javascript/{themes => flavours}/glitch/actions/bundles.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/cards.js (96%) rename app/javascript/{themes => flavours}/glitch/actions/columns.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/compose.js (98%) rename app/javascript/{themes => flavours}/glitch/actions/domain_blocks.js (97%) rename app/javascript/{themes => flavours}/glitch/actions/emojis.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/favourites.js (97%) rename app/javascript/{themes => flavours}/glitch/actions/height_cache.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/interactions.js (99%) rename app/javascript/{themes => flavours}/glitch/actions/local_settings.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/modal.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/mutes.js (95%) rename app/javascript/{themes => flavours}/glitch/actions/notifications.js (99%) rename app/javascript/{themes => flavours}/glitch/actions/onboarding.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/pin_statuses.js (90%) rename app/javascript/{themes => flavours}/glitch/actions/push_notifications.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/reports.js (97%) rename app/javascript/{themes => flavours}/glitch/actions/search.js (96%) rename app/javascript/{themes => flavours}/glitch/actions/settings.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/statuses.js (99%) rename app/javascript/{themes => flavours}/glitch/actions/store.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/streaming.js (96%) rename app/javascript/{themes => flavours}/glitch/actions/timelines.js (99%) rename app/javascript/{themes => flavours}/glitch/components/account.js (98%) rename app/javascript/{themes => flavours}/glitch/components/attachment_list.js (100%) rename app/javascript/{themes => flavours}/glitch/components/autosuggest_emoji.js (90%) rename app/javascript/{themes => flavours}/glitch/components/autosuggest_textarea.js (97%) rename app/javascript/{themes => flavours}/glitch/components/avatar.js (100%) rename app/javascript/{themes => flavours}/glitch/components/avatar_overlay.js (100%) rename app/javascript/{themes => flavours}/glitch/components/button.js (100%) rename app/javascript/{themes => flavours}/glitch/components/collapsable.js (92%) rename app/javascript/{themes => flavours}/glitch/components/column.js (95%) rename app/javascript/{themes => flavours}/glitch/components/column_back_button.js (100%) rename app/javascript/{themes => flavours}/glitch/components/column_back_button_slim.js (100%) rename app/javascript/{themes => flavours}/glitch/components/column_header.js (98%) rename app/javascript/{themes => flavours}/glitch/components/display_name.js (100%) rename app/javascript/{themes => flavours}/glitch/components/dropdown_menu.js (98%) rename app/javascript/{themes => flavours}/glitch/components/extended_video_player.js (100%) rename app/javascript/{themes => flavours}/glitch/components/icon_button.js (98%) rename app/javascript/{themes => flavours}/glitch/components/intersection_observer_article.js (96%) rename app/javascript/{themes => flavours}/glitch/components/load_more.js (100%) rename app/javascript/{themes => flavours}/glitch/components/loading_indicator.js (100%) rename app/javascript/{themes => flavours}/glitch/components/media_gallery.js (98%) rename app/javascript/{themes => flavours}/glitch/components/missing_indicator.js (100%) rename app/javascript/{themes => flavours}/glitch/components/notification_purge_buttons.js (100%) rename app/javascript/{themes => flavours}/glitch/components/permalink.js (100%) rename app/javascript/{themes => flavours}/glitch/components/relative_timestamp.js (100%) rename app/javascript/{themes => flavours}/glitch/components/scrollable_list.js (95%) rename app/javascript/{themes => flavours}/glitch/components/setting_text.js (100%) rename app/javascript/{themes => flavours}/glitch/components/status.js (98%) rename app/javascript/{themes => flavours}/glitch/components/status_action_bar.js (96%) rename app/javascript/{themes => flavours}/glitch/components/status_content.js (99%) rename app/javascript/{themes => flavours}/glitch/components/status_header.js (100%) rename app/javascript/{themes => flavours}/glitch/components/status_list.js (95%) rename app/javascript/{themes => flavours}/glitch/components/status_prepend.js (100%) rename app/javascript/{themes => flavours}/glitch/components/status_visibility_icon.js (100%) rename app/javascript/{themes => flavours}/glitch/containers/account_container.js (84%) rename app/javascript/{themes => flavours}/glitch/containers/card_container.js (84%) rename app/javascript/{themes => flavours}/glitch/containers/compose_container.js (74%) rename app/javascript/{themes => flavours}/glitch/containers/dropdown_menu_container.js (65%) rename app/javascript/{themes => flavours}/glitch/containers/intersection_observer_article_container.js (70%) rename app/javascript/{themes => flavours}/glitch/containers/mastodon.js (82%) rename app/javascript/{themes => flavours}/glitch/containers/media_gallery_container.js (92%) rename app/javascript/{themes => flavours}/glitch/containers/notification_purge_buttons_container.js (86%) rename app/javascript/{themes => flavours}/glitch/containers/status_container.js (85%) rename app/javascript/{themes => flavours}/glitch/containers/timeline_container.js (72%) rename app/javascript/{themes => flavours}/glitch/containers/video_container.js (91%) rename app/javascript/{themes => flavours}/glitch/features/account/components/action_bar.js (97%) rename app/javascript/{themes => flavours}/glitch/features/account/components/header.js (92%) rename app/javascript/{themes => flavours}/glitch/features/account_gallery/components/media_item.js (93%) rename app/javascript/{themes => flavours}/glitch/features/account_gallery/index.js (84%) rename app/javascript/{themes => flavours}/glitch/features/account_timeline/components/header.js (90%) rename app/javascript/{themes => flavours}/glitch/features/account_timeline/containers/header_container.js (86%) rename app/javascript/{themes => flavours}/glitch/features/account_timeline/index.js (93%) rename app/javascript/{themes => flavours}/glitch/features/blocks/index.js (81%) rename app/javascript/{themes => flavours}/glitch/features/community_timeline/components/column_settings.js (94%) rename app/javascript/{themes => flavours}/glitch/features/community_timeline/containers/column_settings_container.js (86%) rename app/javascript/{themes => flavours}/glitch/features/community_timeline/index.js (85%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/advanced_options.js (100%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/advanced_options_toggle.js (100%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/attach_options.js (96%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/autosuggest_account.js (82%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/character_counter.js (100%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/compose_form.js (96%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/dropdown.js (96%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/emoji_picker_dropdown.js (98%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/navigation_bar.js (87%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/privacy_dropdown.js (98%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/reply_indicator.js (90%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/search.js (98%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/search_results.js (93%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/text_icon_button.js (100%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/upload.js (96%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/upload_button.js (97%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/upload_form.js (100%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/upload_progress.js (94%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/warning.js (93%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/advanced_options_container.js (85%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/autosuggest_account_container.js (86%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/compose_form_container.js (93%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/emoji_picker_dropdown_container.js (93%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/navigation_container.js (81%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/privacy_dropdown_container.js (73%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/reply_indicator_container.js (79%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/search_container.js (93%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/search_results_container.js (100%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/sensitive_button_container.js (91%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/spoiler_button_container.js (89%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/upload_button_container.js (90%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/upload_container.js (84%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/upload_form_container.js (100%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/upload_progress_container.js (100%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/warning_container.js (94%) rename app/javascript/{themes => flavours}/glitch/features/compose/index.js (93%) rename app/javascript/{themes => flavours}/glitch/features/direct_timeline/containers/column_settings_container.js (67%) rename app/javascript/{themes => flavours}/glitch/features/direct_timeline/index.js (85%) rename app/javascript/{themes => flavours}/glitch/features/favourited_statuses/index.js (87%) rename app/javascript/{themes => flavours}/glitch/features/favourites/index.js (79%) rename app/javascript/{themes => flavours}/glitch/features/follow_requests/components/account_authorize.js (87%) rename app/javascript/{themes => flavours}/glitch/features/follow_requests/containers/account_authorize_container.js (78%) rename app/javascript/{themes => flavours}/glitch/features/follow_requests/index.js (85%) rename app/javascript/{themes => flavours}/glitch/features/followers/index.js (83%) rename app/javascript/{themes => flavours}/glitch/features/following/index.js (83%) create mode 100644 app/javascript/flavours/glitch/features/generic_not_found/index.js rename app/javascript/{themes => flavours}/glitch/features/getting_started/index.js (95%) rename app/javascript/{themes => flavours}/glitch/features/hashtag_timeline/index.js (86%) rename app/javascript/{themes => flavours}/glitch/features/home_timeline/components/column_settings.js (92%) rename app/javascript/{themes => flavours}/glitch/features/home_timeline/containers/column_settings_container.js (84%) rename app/javascript/{themes => flavours}/glitch/features/home_timeline/index.js (86%) rename app/javascript/{themes => flavours}/glitch/features/local_settings/index.js (91%) rename app/javascript/{themes => flavours}/glitch/features/local_settings/navigation/index.js (100%) rename app/javascript/{themes => flavours}/glitch/features/local_settings/navigation/item/index.js (100%) rename app/javascript/{themes => flavours}/glitch/features/local_settings/navigation/item/style.scss (100%) rename app/javascript/{themes => flavours}/glitch/features/local_settings/navigation/style.scss (100%) rename app/javascript/{themes => flavours}/glitch/features/local_settings/page/index.js (100%) rename app/javascript/{themes => flavours}/glitch/features/local_settings/page/item/index.js (100%) rename app/javascript/{themes => flavours}/glitch/features/local_settings/page/item/style.scss (100%) rename app/javascript/{themes => flavours}/glitch/features/local_settings/page/style.scss (100%) rename app/javascript/{themes => flavours}/glitch/features/local_settings/style.scss (100%) rename app/javascript/{themes => flavours}/glitch/features/mutes/index.js (81%) rename app/javascript/{themes => flavours}/glitch/features/notifications/components/clear_column_button.js (100%) rename app/javascript/{themes => flavours}/glitch/features/notifications/components/column_settings.js (100%) rename app/javascript/{themes => flavours}/glitch/features/notifications/components/follow.js (95%) rename app/javascript/{themes => flavours}/glitch/features/notifications/components/notification.js (96%) rename app/javascript/{themes => flavours}/glitch/features/notifications/components/overlay.js (100%) rename app/javascript/{themes => flavours}/glitch/features/notifications/components/setting_toggle.js (100%) rename app/javascript/{themes => flavours}/glitch/features/notifications/containers/column_settings_container.js (81%) rename app/javascript/{themes => flavours}/glitch/features/notifications/containers/notification_container.js (84%) rename app/javascript/{themes => flavours}/glitch/features/notifications/containers/overlay_container.js (84%) rename app/javascript/{themes => flavours}/glitch/features/notifications/index.js (94%) rename app/javascript/{themes => flavours}/glitch/features/pinned_statuses/index.js (82%) rename app/javascript/{themes => flavours}/glitch/features/public_timeline/containers/column_settings_container.js (67%) rename app/javascript/{themes => flavours}/glitch/features/public_timeline/index.js (85%) rename app/javascript/{themes => flavours}/glitch/features/reblogs/index.js (79%) rename app/javascript/{themes => flavours}/glitch/features/report/components/status_check_box.js (100%) rename app/javascript/{themes => flavours}/glitch/features/report/containers/status_check_box_container.js (88%) create mode 100644 app/javascript/flavours/glitch/features/standalone/compose/index.js rename app/javascript/{themes => flavours}/glitch/features/standalone/hashtag_timeline/index.js (84%) rename app/javascript/{themes => flavours}/glitch/features/standalone/public_timeline/index.js (85%) rename app/javascript/{themes => flavours}/glitch/features/status/components/action_bar.js (95%) rename app/javascript/{themes => flavours}/glitch/features/status/components/card.js (100%) rename app/javascript/{themes => flavours}/glitch/features/status/components/detailed_status.js (90%) rename app/javascript/{themes => flavours}/glitch/features/status/containers/card_container.js (100%) rename app/javascript/{themes => flavours}/glitch/features/status/index.js (91%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/actions_modal.js (86%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/boost_modal.js (88%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/bundle.js (100%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/bundle_column_error.js (88%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/bundle_modal_error.js (95%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/column.js (93%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/column_header.js (100%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/column_link.js (100%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/column_loading.js (83%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/column_subheading.js (100%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/columns_area.js (98%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/confirmation_modal.js (95%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/doodle_modal.js (98%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/drawer_loading.js (100%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/embed_modal.js (100%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/image_loader.js (100%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/media_modal.js (96%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/modal_loading.js (86%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/modal_root.js (98%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/mute_modal.js (91%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/onboarding_modal.js (97%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/report_modal.js (89%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/tabs_bar.js (98%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/upload_area.js (96%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/video_modal.js (94%) rename app/javascript/{themes => flavours}/glitch/features/ui/containers/bundle_container.js (91%) rename app/javascript/{themes => flavours}/glitch/features/ui/containers/columns_area_container.js (100%) rename app/javascript/{themes => flavours}/glitch/features/ui/containers/loading_bar_container.js (100%) rename app/javascript/{themes => flavours}/glitch/features/ui/containers/modal_container.js (86%) rename app/javascript/{themes => flavours}/glitch/features/ui/containers/notifications_container.js (76%) rename app/javascript/{themes => flavours}/glitch/features/ui/containers/status_list_container.js (92%) rename app/javascript/{themes => flavours}/glitch/features/ui/index.js (96%) rename app/javascript/{themes => flavours}/glitch/features/video/index.js (99%) rename app/javascript/{themes => flavours}/glitch/middleware/errors.js (92%) rename app/javascript/{themes => flavours}/glitch/middleware/loading_bar.js (100%) rename app/javascript/{themes => flavours}/glitch/middleware/sounds.js (100%) rename app/javascript/{themes => flavours}/glitch/packs/about.js (67%) create mode 100644 app/javascript/flavours/glitch/packs/common.js create mode 100644 app/javascript/flavours/glitch/packs/home.js rename app/javascript/{themes => flavours}/glitch/packs/public.js (85%) rename app/javascript/{themes => flavours}/glitch/packs/share.js (66%) rename app/javascript/{themes => flavours}/glitch/reducers/accounts.js (85%) rename app/javascript/{themes => flavours}/glitch/reducers/accounts_counters.js (87%) rename app/javascript/{themes => flavours}/glitch/reducers/alerts.js (93%) rename app/javascript/{themes => flavours}/glitch/reducers/cards.js (80%) rename app/javascript/{themes => flavours}/glitch/reducers/compose.js (97%) rename app/javascript/{themes => flavours}/glitch/reducers/contexts.js (91%) rename app/javascript/{themes => flavours}/glitch/reducers/custom_emojis.js (63%) rename app/javascript/{themes => flavours}/glitch/reducers/height_cache.js (85%) rename app/javascript/{themes => flavours}/glitch/reducers/index.js (100%) rename app/javascript/{themes => flavours}/glitch/reducers/local_settings.js (88%) rename app/javascript/{themes => flavours}/glitch/reducers/media_attachments.js (83%) rename app/javascript/{themes => flavours}/glitch/reducers/meta.js (84%) rename app/javascript/{themes => flavours}/glitch/reducers/modal.js (81%) rename app/javascript/{themes => flavours}/glitch/reducers/mutes.js (94%) rename app/javascript/{themes => flavours}/glitch/reducers/notifications.js (97%) rename app/javascript/{themes => flavours}/glitch/reducers/push_notifications.js (91%) rename app/javascript/{themes => flavours}/glitch/reducers/relationships.js (93%) rename app/javascript/{themes => flavours}/glitch/reducers/reports.js (97%) rename app/javascript/{themes => flavours}/glitch/reducers/search.js (90%) rename app/javascript/{themes => flavours}/glitch/reducers/settings.js (88%) rename app/javascript/{themes => flavours}/glitch/reducers/status_lists.js (94%) rename app/javascript/{themes => flavours}/glitch/reducers/statuses.js (90%) rename app/javascript/{themes => flavours}/glitch/reducers/timelines.js (98%) rename app/javascript/{themes => flavours}/glitch/reducers/user_lists.js (95%) rename app/javascript/{themes => flavours}/glitch/selectors/index.js (100%) rename app/javascript/{themes => flavours}/glitch/service_worker/entry.js (100%) rename app/javascript/{themes => flavours}/glitch/service_worker/web_push_notifications.js (100%) rename app/javascript/{themes => flavours}/glitch/store/configureStore.js (100%) rename app/javascript/{themes => flavours}/glitch/styles/_mixins.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/about.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/accounts.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/admin.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/basics.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/boost.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/compact_header.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/components.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/containers.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/doodle.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/emoji_picker.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/footer.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/forms.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/index.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/landing_strip.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/lists.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/reset copy.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/reset.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/rtl.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/stream_entries.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/tables.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/variables.scss (100%) rename app/javascript/{themes => flavours}/glitch/theme.yml (83%) rename app/javascript/{themes => flavours}/glitch/util/api.js (100%) create mode 100644 app/javascript/flavours/glitch/util/async-components.js rename app/javascript/{themes => flavours}/glitch/util/base_polyfills.js (100%) rename app/javascript/{themes => flavours}/glitch/util/bio_metadata.js (100%) rename app/javascript/{themes => flavours}/glitch/util/counter.js (100%) rename app/javascript/{themes => flavours}/glitch/util/emoji/emoji_compressed.js (100%) rename app/javascript/{themes => flavours}/glitch/util/emoji/emoji_map.json (100%) rename app/javascript/{themes => flavours}/glitch/util/emoji/emoji_mart_data_light.js (100%) rename app/javascript/{themes => flavours}/glitch/util/emoji/emoji_mart_search_light.js (100%) rename app/javascript/{themes => flavours}/glitch/util/emoji/emoji_picker.js (100%) rename app/javascript/{themes => flavours}/glitch/util/emoji/emoji_unicode_mapping_light.js (100%) rename app/javascript/{themes => flavours}/glitch/util/emoji/emoji_utils.js (100%) rename app/javascript/{themes => flavours}/glitch/util/emoji/index.js (97%) rename app/javascript/{themes => flavours}/glitch/util/emoji/unicode_to_filename.js (100%) rename app/javascript/{themes => flavours}/glitch/util/emoji/unicode_to_unified_name.js (100%) rename app/javascript/{themes => flavours}/glitch/util/extra_polyfills.js (100%) rename app/javascript/{themes => flavours}/glitch/util/fullscreen.js (100%) rename app/javascript/{themes => flavours}/glitch/util/get_rect_from_entry.js (100%) rename app/javascript/{themes => flavours}/glitch/util/initial_state.js (100%) rename app/javascript/{themes => flavours}/glitch/util/intersection_observer_wrapper.js (100%) rename app/javascript/{themes => flavours}/glitch/util/is_mobile.js (100%) rename app/javascript/{themes => flavours}/glitch/util/link_header.js (100%) rename app/javascript/{themes => flavours}/glitch/util/load_polyfills.js (100%) rename app/javascript/{themes => flavours}/glitch/util/main.js (95%) rename app/javascript/{themes => flavours}/glitch/util/optional_motion.js (68%) rename app/javascript/{themes => flavours}/glitch/util/performance.js (100%) rename app/javascript/{themes => flavours}/glitch/util/react_router_helpers.js (85%) rename app/javascript/{themes => flavours}/glitch/util/ready.js (100%) rename app/javascript/{themes => flavours}/glitch/util/reduced_motion.js (100%) rename app/javascript/{themes => flavours}/glitch/util/rtl.js (100%) rename app/javascript/{themes => flavours}/glitch/util/schedule_idle_task.js (100%) rename app/javascript/{themes => flavours}/glitch/util/scroll.js (100%) rename app/javascript/{themes => flavours}/glitch/util/stream.js (100%) rename app/javascript/{themes => flavours}/glitch/util/url_regex.js (100%) rename app/javascript/{themes => flavours}/glitch/util/uuid.js (100%) rename app/javascript/{themes => flavours}/glitch/util/web_push_subscription.js (97%) rename app/javascript/{themes => flavours}/vanilla/theme.yml (100%) delete mode 100644 app/javascript/themes/glitch/features/generic_not_found/index.js delete mode 100644 app/javascript/themes/glitch/features/standalone/compose/index.js delete mode 100644 app/javascript/themes/glitch/packs/common.js delete mode 100644 app/javascript/themes/glitch/packs/home.js delete mode 100644 app/javascript/themes/glitch/util/async-components.js delete mode 160000 app/javascript/themes/mastodon-go diff --git a/.gitmodules b/.gitmodules index 35b0cd787..e69de29bb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "app/javascript/themes/mastodon-go"] - path = app/javascript/themes/mastodon-go - url = https://github.com/marrus-sh/mastodon-go diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f5753963d..d116c4767 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -12,7 +12,7 @@ class ApplicationController < ActionController::Base helper_method :current_account helper_method :current_session - helper_method :current_theme + helper_method :current_flavour helper_method :current_skin helper_method :single_user_mode? @@ -57,8 +57,8 @@ class ApplicationController < ActionController::Base def pack(data, pack_name, skin = 'default') return nil unless pack?(data, pack_name) pack_data = { - common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common'), - name: data['name'], + common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.flavour(current_flavour) : Themes.instance.core, 'common'), + flavour: data['name'], pack: pack_name, preload: nil, skin: nil, @@ -88,8 +88,8 @@ class ApplicationController < ActionController::Base def nil_pack(data, pack_name, skin = 'default') { - common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common', skin), - name: data['name'], + common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.flavour(current_flavour) : Themes.instance.core, 'common', skin), + flavour: data['name'], pack: nil, preload: nil, skin: nil, @@ -102,23 +102,23 @@ class ApplicationController < ActionController::Base if data['name'] && data.key?('fallback') if data['fallback'].nil? return nil_pack(data, pack_name, skin) - elsif data['fallback'].is_a?(String) && Themes.instance.get(data['fallback']) - return resolve_pack(Themes.instance.get(data['fallback']), pack_name, skin) + elsif data['fallback'].is_a?(String) && Themes.instance.flavour(data['fallback']) + return resolve_pack(Themes.instance.flavour(data['fallback']), pack_name, skin) elsif data['fallback'].is_a?(Array) data['fallback'].each do |fallback| - return resolve_pack(Themes.instance.get(fallback), pack_name, skin) if Themes.instance.get(fallback) + return resolve_pack(Themes.instance.flavour(fallback), pack_name, skin) if Themes.instance.flavour(fallback) end end return nil_pack(data, pack_name, skin) end - return data.key?('name') && data['name'] != default_theme ? resolve_pack(Themes.instance.get(default_theme), pack_name, skin) : nil_pack(data, pack_name, skin) + return data.key?('name') && data['name'] != Setting.default_settings['flavour'] ? resolve_pack(Themes.instance.flavour(Setting.default_settings['flavour']), pack_name, skin) : nil_pack(data, pack_name, skin) end result end def use_pack(pack_name) @core = resolve_pack(Themes.instance.core, pack_name) - @theme = resolve_pack(Themes.instance.get(current_theme), pack_name, current_skin) + @theme = resolve_pack(Themes.instance.flavour(current_flavour), pack_name, current_skin) end protected @@ -151,21 +151,13 @@ class ApplicationController < ActionController::Base @current_session ||= SessionActivation.find_by(session_id: cookies.signed['_session_id']) end - def default_theme - Setting.default_settings['theme'] - end - - def current_theme - return default_theme unless Themes.instance.names.include? current_user&.setting_theme - current_user.setting_theme - end - - def default_skin - 'default' + def current_flavour + return Setting.default_settings['flavour'] unless Themes.instance.flavours.include? current_user&.setting_flavour + current_user.setting_flavour end def current_skin - return default_skin unless Themes.instance.skins_for(current_theme).include? current_user&.setting_skin + return 'default' unless Themes.instance.skins_for(current_flavour).include? current_user&.setting_skin current_user.setting_skin end diff --git a/app/javascript/core/settings.js b/app/javascript/core/settings.js index bc5f9ed1d..1e4bb4ced 100644 --- a/app/javascript/core/settings.js +++ b/app/javascript/core/settings.js @@ -3,7 +3,7 @@ const { length } = require('stringz'); const { delegate } = require('rails-ujs'); -import { processBio } from 'themes/glitch/util/bio_metadata'; +import { processBio } from 'flavours/glitch/util/bio_metadata'; delegate(document, '.account_display_name', 'input', ({ target }) => { const nameCounter = document.querySelector('.name-counter'); diff --git a/app/javascript/themes/glitch/actions/accounts.js b/app/javascript/flavours/glitch/actions/accounts.js similarity index 99% rename from app/javascript/themes/glitch/actions/accounts.js rename to app/javascript/flavours/glitch/actions/accounts.js index f1a8c5471..8ab92f9e7 100644 --- a/app/javascript/themes/glitch/actions/accounts.js +++ b/app/javascript/flavours/glitch/actions/accounts.js @@ -1,4 +1,4 @@ -import api, { getLinks } from 'themes/glitch/util/api'; +import api, { getLinks } from 'flavours/glitch/util/api'; export const ACCOUNT_FETCH_REQUEST = 'ACCOUNT_FETCH_REQUEST'; export const ACCOUNT_FETCH_SUCCESS = 'ACCOUNT_FETCH_SUCCESS'; diff --git a/app/javascript/themes/glitch/actions/alerts.js b/app/javascript/flavours/glitch/actions/alerts.js similarity index 100% rename from app/javascript/themes/glitch/actions/alerts.js rename to app/javascript/flavours/glitch/actions/alerts.js diff --git a/app/javascript/themes/glitch/actions/blocks.js b/app/javascript/flavours/glitch/actions/blocks.js similarity index 97% rename from app/javascript/themes/glitch/actions/blocks.js rename to app/javascript/flavours/glitch/actions/blocks.js index 6ba9460f0..fe44ca19a 100644 --- a/app/javascript/themes/glitch/actions/blocks.js +++ b/app/javascript/flavours/glitch/actions/blocks.js @@ -1,4 +1,4 @@ -import api, { getLinks } from 'themes/glitch/util/api'; +import api, { getLinks } from 'flavours/glitch/util/api'; import { fetchRelationships } from './accounts'; export const BLOCKS_FETCH_REQUEST = 'BLOCKS_FETCH_REQUEST'; diff --git a/app/javascript/themes/glitch/actions/bundles.js b/app/javascript/flavours/glitch/actions/bundles.js similarity index 100% rename from app/javascript/themes/glitch/actions/bundles.js rename to app/javascript/flavours/glitch/actions/bundles.js diff --git a/app/javascript/themes/glitch/actions/cards.js b/app/javascript/flavours/glitch/actions/cards.js similarity index 96% rename from app/javascript/themes/glitch/actions/cards.js rename to app/javascript/flavours/glitch/actions/cards.js index 2a1bc369a..c897daf58 100644 --- a/app/javascript/themes/glitch/actions/cards.js +++ b/app/javascript/flavours/glitch/actions/cards.js @@ -1,4 +1,4 @@ -import api from 'themes/glitch/util/api'; +import api from 'flavours/glitch/util/api'; export const STATUS_CARD_FETCH_REQUEST = 'STATUS_CARD_FETCH_REQUEST'; export const STATUS_CARD_FETCH_SUCCESS = 'STATUS_CARD_FETCH_SUCCESS'; diff --git a/app/javascript/themes/glitch/actions/columns.js b/app/javascript/flavours/glitch/actions/columns.js similarity index 100% rename from app/javascript/themes/glitch/actions/columns.js rename to app/javascript/flavours/glitch/actions/columns.js diff --git a/app/javascript/themes/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js similarity index 98% rename from app/javascript/themes/glitch/actions/compose.js rename to app/javascript/flavours/glitch/actions/compose.js index 07c469477..32746f27b 100644 --- a/app/javascript/themes/glitch/actions/compose.js +++ b/app/javascript/flavours/glitch/actions/compose.js @@ -1,6 +1,6 @@ -import api from 'themes/glitch/util/api'; +import api from 'flavours/glitch/util/api'; import { throttle } from 'lodash'; -import { search as emojiSearch } from 'themes/glitch/util/emoji/emoji_mart_search_light'; +import { search as emojiSearch } from 'flavours/glitch/util/emoji/emoji_mart_search_light'; import { useEmoji } from './emojis'; import { diff --git a/app/javascript/themes/glitch/actions/domain_blocks.js b/app/javascript/flavours/glitch/actions/domain_blocks.js similarity index 97% rename from app/javascript/themes/glitch/actions/domain_blocks.js rename to app/javascript/flavours/glitch/actions/domain_blocks.js index 0a880394a..8506df91c 100644 --- a/app/javascript/themes/glitch/actions/domain_blocks.js +++ b/app/javascript/flavours/glitch/actions/domain_blocks.js @@ -1,4 +1,4 @@ -import api, { getLinks } from 'themes/glitch/util/api'; +import api, { getLinks } from 'flavours/glitch/util/api'; export const DOMAIN_BLOCK_REQUEST = 'DOMAIN_BLOCK_REQUEST'; export const DOMAIN_BLOCK_SUCCESS = 'DOMAIN_BLOCK_SUCCESS'; diff --git a/app/javascript/themes/glitch/actions/emojis.js b/app/javascript/flavours/glitch/actions/emojis.js similarity index 100% rename from app/javascript/themes/glitch/actions/emojis.js rename to app/javascript/flavours/glitch/actions/emojis.js diff --git a/app/javascript/themes/glitch/actions/favourites.js b/app/javascript/flavours/glitch/actions/favourites.js similarity index 97% rename from app/javascript/themes/glitch/actions/favourites.js rename to app/javascript/flavours/glitch/actions/favourites.js index e9b3559af..decdcee4f 100644 --- a/app/javascript/themes/glitch/actions/favourites.js +++ b/app/javascript/flavours/glitch/actions/favourites.js @@ -1,4 +1,4 @@ -import api, { getLinks } from 'themes/glitch/util/api'; +import api, { getLinks } from 'flavours/glitch/util/api'; export const FAVOURITED_STATUSES_FETCH_REQUEST = 'FAVOURITED_STATUSES_FETCH_REQUEST'; export const FAVOURITED_STATUSES_FETCH_SUCCESS = 'FAVOURITED_STATUSES_FETCH_SUCCESS'; diff --git a/app/javascript/themes/glitch/actions/height_cache.js b/app/javascript/flavours/glitch/actions/height_cache.js similarity index 100% rename from app/javascript/themes/glitch/actions/height_cache.js rename to app/javascript/flavours/glitch/actions/height_cache.js diff --git a/app/javascript/themes/glitch/actions/interactions.js b/app/javascript/flavours/glitch/actions/interactions.js similarity index 99% rename from app/javascript/themes/glitch/actions/interactions.js rename to app/javascript/flavours/glitch/actions/interactions.js index d61a7ba2a..ceeb2773b 100644 --- a/app/javascript/themes/glitch/actions/interactions.js +++ b/app/javascript/flavours/glitch/actions/interactions.js @@ -1,4 +1,4 @@ -import api from 'themes/glitch/util/api'; +import api from 'flavours/glitch/util/api'; export const REBLOG_REQUEST = 'REBLOG_REQUEST'; export const REBLOG_SUCCESS = 'REBLOG_SUCCESS'; diff --git a/app/javascript/themes/glitch/actions/local_settings.js b/app/javascript/flavours/glitch/actions/local_settings.js similarity index 100% rename from app/javascript/themes/glitch/actions/local_settings.js rename to app/javascript/flavours/glitch/actions/local_settings.js diff --git a/app/javascript/themes/glitch/actions/modal.js b/app/javascript/flavours/glitch/actions/modal.js similarity index 100% rename from app/javascript/themes/glitch/actions/modal.js rename to app/javascript/flavours/glitch/actions/modal.js diff --git a/app/javascript/themes/glitch/actions/mutes.js b/app/javascript/flavours/glitch/actions/mutes.js similarity index 95% rename from app/javascript/themes/glitch/actions/mutes.js rename to app/javascript/flavours/glitch/actions/mutes.js index bb19e8657..e06130533 100644 --- a/app/javascript/themes/glitch/actions/mutes.js +++ b/app/javascript/flavours/glitch/actions/mutes.js @@ -1,6 +1,6 @@ -import api, { getLinks } from 'themes/glitch/util/api'; +import api, { getLinks } from 'flavours/glitch/util/api'; import { fetchRelationships } from './accounts'; -import { openModal } from 'themes/glitch/actions/modal'; +import { openModal } from 'flavours/glitch/actions/modal'; export const MUTES_FETCH_REQUEST = 'MUTES_FETCH_REQUEST'; export const MUTES_FETCH_SUCCESS = 'MUTES_FETCH_SUCCESS'; diff --git a/app/javascript/themes/glitch/actions/notifications.js b/app/javascript/flavours/glitch/actions/notifications.js similarity index 99% rename from app/javascript/themes/glitch/actions/notifications.js rename to app/javascript/flavours/glitch/actions/notifications.js index fbf06f7c4..9b9ebf86d 100644 --- a/app/javascript/themes/glitch/actions/notifications.js +++ b/app/javascript/flavours/glitch/actions/notifications.js @@ -1,4 +1,4 @@ -import api, { getLinks } from 'themes/glitch/util/api'; +import api, { getLinks } from 'flavours/glitch/util/api'; import { List as ImmutableList } from 'immutable'; import IntlMessageFormat from 'intl-messageformat'; import { fetchRelationships } from './accounts'; diff --git a/app/javascript/themes/glitch/actions/onboarding.js b/app/javascript/flavours/glitch/actions/onboarding.js similarity index 100% rename from app/javascript/themes/glitch/actions/onboarding.js rename to app/javascript/flavours/glitch/actions/onboarding.js diff --git a/app/javascript/themes/glitch/actions/pin_statuses.js b/app/javascript/flavours/glitch/actions/pin_statuses.js similarity index 90% rename from app/javascript/themes/glitch/actions/pin_statuses.js rename to app/javascript/flavours/glitch/actions/pin_statuses.js index b3e064e58..d3d1a154f 100644 --- a/app/javascript/themes/glitch/actions/pin_statuses.js +++ b/app/javascript/flavours/glitch/actions/pin_statuses.js @@ -1,10 +1,10 @@ -import api from 'themes/glitch/util/api'; +import api from 'flavours/glitch/util/api'; export const PINNED_STATUSES_FETCH_REQUEST = 'PINNED_STATUSES_FETCH_REQUEST'; export const PINNED_STATUSES_FETCH_SUCCESS = 'PINNED_STATUSES_FETCH_SUCCESS'; export const PINNED_STATUSES_FETCH_FAIL = 'PINNED_STATUSES_FETCH_FAIL'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; export function fetchPinnedStatuses() { return (dispatch, getState) => { diff --git a/app/javascript/themes/glitch/actions/push_notifications.js b/app/javascript/flavours/glitch/actions/push_notifications.js similarity index 100% rename from app/javascript/themes/glitch/actions/push_notifications.js rename to app/javascript/flavours/glitch/actions/push_notifications.js diff --git a/app/javascript/themes/glitch/actions/reports.js b/app/javascript/flavours/glitch/actions/reports.js similarity index 97% rename from app/javascript/themes/glitch/actions/reports.js rename to app/javascript/flavours/glitch/actions/reports.js index 93f9085b2..ad4fd18a9 100644 --- a/app/javascript/themes/glitch/actions/reports.js +++ b/app/javascript/flavours/glitch/actions/reports.js @@ -1,4 +1,4 @@ -import api from 'themes/glitch/util/api'; +import api from 'flavours/glitch/util/api'; import { openModal, closeModal } from './modal'; export const REPORT_INIT = 'REPORT_INIT'; diff --git a/app/javascript/themes/glitch/actions/search.js b/app/javascript/flavours/glitch/actions/search.js similarity index 96% rename from app/javascript/themes/glitch/actions/search.js rename to app/javascript/flavours/glitch/actions/search.js index 414e4755e..e86bd848e 100644 --- a/app/javascript/themes/glitch/actions/search.js +++ b/app/javascript/flavours/glitch/actions/search.js @@ -1,4 +1,4 @@ -import api from 'themes/glitch/util/api'; +import api from 'flavours/glitch/util/api'; export const SEARCH_CHANGE = 'SEARCH_CHANGE'; export const SEARCH_CLEAR = 'SEARCH_CLEAR'; diff --git a/app/javascript/themes/glitch/actions/settings.js b/app/javascript/flavours/glitch/actions/settings.js similarity index 100% rename from app/javascript/themes/glitch/actions/settings.js rename to app/javascript/flavours/glitch/actions/settings.js diff --git a/app/javascript/themes/glitch/actions/statuses.js b/app/javascript/flavours/glitch/actions/statuses.js similarity index 99% rename from app/javascript/themes/glitch/actions/statuses.js rename to app/javascript/flavours/glitch/actions/statuses.js index 702f4e9b6..8b49083ac 100644 --- a/app/javascript/themes/glitch/actions/statuses.js +++ b/app/javascript/flavours/glitch/actions/statuses.js @@ -1,4 +1,4 @@ -import api from 'themes/glitch/util/api'; +import api from 'flavours/glitch/util/api'; import { deleteFromTimelines } from './timelines'; import { fetchStatusCard } from './cards'; diff --git a/app/javascript/themes/glitch/actions/store.js b/app/javascript/flavours/glitch/actions/store.js similarity index 100% rename from app/javascript/themes/glitch/actions/store.js rename to app/javascript/flavours/glitch/actions/store.js diff --git a/app/javascript/themes/glitch/actions/streaming.js b/app/javascript/flavours/glitch/actions/streaming.js similarity index 96% rename from app/javascript/themes/glitch/actions/streaming.js rename to app/javascript/flavours/glitch/actions/streaming.js index ccf6c27d8..595eefa41 100644 --- a/app/javascript/themes/glitch/actions/streaming.js +++ b/app/javascript/flavours/glitch/actions/streaming.js @@ -1,4 +1,4 @@ -import { connectStream } from 'themes/glitch/util/stream'; +import { connectStream } from 'flavours/glitch/util/stream'; import { updateTimeline, deleteFromTimelines, diff --git a/app/javascript/themes/glitch/actions/timelines.js b/app/javascript/flavours/glitch/actions/timelines.js similarity index 99% rename from app/javascript/themes/glitch/actions/timelines.js rename to app/javascript/flavours/glitch/actions/timelines.js index 5ce14fbe9..3fabf3885 100644 --- a/app/javascript/themes/glitch/actions/timelines.js +++ b/app/javascript/flavours/glitch/actions/timelines.js @@ -1,4 +1,4 @@ -import api, { getLinks } from 'themes/glitch/util/api'; +import api, { getLinks } from 'flavours/glitch/util/api'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; export const TIMELINE_UPDATE = 'TIMELINE_UPDATE'; diff --git a/app/javascript/themes/glitch/components/account.js b/app/javascript/flavours/glitch/components/account.js similarity index 98% rename from app/javascript/themes/glitch/components/account.js rename to app/javascript/flavours/glitch/components/account.js index d0ff77050..c8dacb0ab 100644 --- a/app/javascript/themes/glitch/components/account.js +++ b/app/javascript/flavours/glitch/components/account.js @@ -7,7 +7,7 @@ import Permalink from './permalink'; import IconButton from './icon_button'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; const messages = defineMessages({ follow: { id: 'account.follow', defaultMessage: 'Follow' }, diff --git a/app/javascript/themes/glitch/components/attachment_list.js b/app/javascript/flavours/glitch/components/attachment_list.js similarity index 100% rename from app/javascript/themes/glitch/components/attachment_list.js rename to app/javascript/flavours/glitch/components/attachment_list.js diff --git a/app/javascript/themes/glitch/components/autosuggest_emoji.js b/app/javascript/flavours/glitch/components/autosuggest_emoji.js similarity index 90% rename from app/javascript/themes/glitch/components/autosuggest_emoji.js rename to app/javascript/flavours/glitch/components/autosuggest_emoji.js index 3c6f915e4..79e113d9c 100644 --- a/app/javascript/themes/glitch/components/autosuggest_emoji.js +++ b/app/javascript/flavours/glitch/components/autosuggest_emoji.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import unicodeMapping from 'themes/glitch/util/emoji/emoji_unicode_mapping_light'; +import unicodeMapping from 'flavours/glitch/util/emoji/emoji_unicode_mapping_light'; const assetHost = process.env.CDN_HOST || ''; diff --git a/app/javascript/themes/glitch/components/autosuggest_textarea.js b/app/javascript/flavours/glitch/components/autosuggest_textarea.js similarity index 97% rename from app/javascript/themes/glitch/components/autosuggest_textarea.js rename to app/javascript/flavours/glitch/components/autosuggest_textarea.js index fa93847a2..551528e5a 100644 --- a/app/javascript/themes/glitch/components/autosuggest_textarea.js +++ b/app/javascript/flavours/glitch/components/autosuggest_textarea.js @@ -1,9 +1,9 @@ import React from 'react'; -import AutosuggestAccountContainer from 'themes/glitch/features/compose/containers/autosuggest_account_container'; +import AutosuggestAccountContainer from 'flavours/glitch/features/compose/containers/autosuggest_account_container'; import AutosuggestEmoji from './autosuggest_emoji'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import { isRtl } from 'themes/glitch/util/rtl'; +import { isRtl } from 'flavours/glitch/util/rtl'; import ImmutablePureComponent from 'react-immutable-pure-component'; import Textarea from 'react-textarea-autosize'; import classNames from 'classnames'; diff --git a/app/javascript/themes/glitch/components/avatar.js b/app/javascript/flavours/glitch/components/avatar.js similarity index 100% rename from app/javascript/themes/glitch/components/avatar.js rename to app/javascript/flavours/glitch/components/avatar.js diff --git a/app/javascript/themes/glitch/components/avatar_overlay.js b/app/javascript/flavours/glitch/components/avatar_overlay.js similarity index 100% rename from app/javascript/themes/glitch/components/avatar_overlay.js rename to app/javascript/flavours/glitch/components/avatar_overlay.js diff --git a/app/javascript/themes/glitch/components/button.js b/app/javascript/flavours/glitch/components/button.js similarity index 100% rename from app/javascript/themes/glitch/components/button.js rename to app/javascript/flavours/glitch/components/button.js diff --git a/app/javascript/themes/glitch/components/collapsable.js b/app/javascript/flavours/glitch/components/collapsable.js similarity index 92% rename from app/javascript/themes/glitch/components/collapsable.js rename to app/javascript/flavours/glitch/components/collapsable.js index 8bc0a54f4..fe125a729 100644 --- a/app/javascript/themes/glitch/components/collapsable.js +++ b/app/javascript/flavours/glitch/components/collapsable.js @@ -1,5 +1,5 @@ import React from 'react'; -import Motion from 'themes/glitch/util/optional_motion'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; import PropTypes from 'prop-types'; diff --git a/app/javascript/themes/glitch/components/column.js b/app/javascript/flavours/glitch/components/column.js similarity index 95% rename from app/javascript/themes/glitch/components/column.js rename to app/javascript/flavours/glitch/components/column.js index adeba9cc1..57c4c7a40 100644 --- a/app/javascript/themes/glitch/components/column.js +++ b/app/javascript/flavours/glitch/components/column.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import detectPassiveEvents from 'detect-passive-events'; -import { scrollTop } from 'themes/glitch/util/scroll'; +import { scrollTop } from 'flavours/glitch/util/scroll'; export default class Column extends React.PureComponent { diff --git a/app/javascript/themes/glitch/components/column_back_button.js b/app/javascript/flavours/glitch/components/column_back_button.js similarity index 100% rename from app/javascript/themes/glitch/components/column_back_button.js rename to app/javascript/flavours/glitch/components/column_back_button.js diff --git a/app/javascript/themes/glitch/components/column_back_button_slim.js b/app/javascript/flavours/glitch/components/column_back_button_slim.js similarity index 100% rename from app/javascript/themes/glitch/components/column_back_button_slim.js rename to app/javascript/flavours/glitch/components/column_back_button_slim.js diff --git a/app/javascript/themes/glitch/components/column_header.js b/app/javascript/flavours/glitch/components/column_header.js similarity index 98% rename from app/javascript/themes/glitch/components/column_header.js rename to app/javascript/flavours/glitch/components/column_header.js index e601082c8..ae90b6f81 100644 --- a/app/javascript/themes/glitch/components/column_header.js +++ b/app/javascript/flavours/glitch/components/column_header.js @@ -4,8 +4,7 @@ import classNames from 'classnames'; import { defineMessages, FormattedMessage, injectIntl } from 'react-intl'; import ImmutablePropTypes from 'react-immutable-proptypes'; -// Glitch imports -import NotificationPurgeButtonsContainer from 'themes/glitch/containers/notification_purge_buttons_container'; +import NotificationPurgeButtonsContainer from 'flavours/glitch/containers/notification_purge_buttons_container'; const messages = defineMessages({ show: { id: 'column_header.show_settings', defaultMessage: 'Show settings' }, diff --git a/app/javascript/themes/glitch/components/display_name.js b/app/javascript/flavours/glitch/components/display_name.js similarity index 100% rename from app/javascript/themes/glitch/components/display_name.js rename to app/javascript/flavours/glitch/components/display_name.js diff --git a/app/javascript/themes/glitch/components/dropdown_menu.js b/app/javascript/flavours/glitch/components/dropdown_menu.js similarity index 98% rename from app/javascript/themes/glitch/components/dropdown_menu.js rename to app/javascript/flavours/glitch/components/dropdown_menu.js index d30dc2aaf..d4a886a8b 100644 --- a/app/javascript/themes/glitch/components/dropdown_menu.js +++ b/app/javascript/flavours/glitch/components/dropdown_menu.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import IconButton from './icon_button'; import Overlay from 'react-overlays/lib/Overlay'; -import Motion from 'themes/glitch/util/optional_motion'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; import detectPassiveEvents from 'detect-passive-events'; diff --git a/app/javascript/themes/glitch/components/extended_video_player.js b/app/javascript/flavours/glitch/components/extended_video_player.js similarity index 100% rename from app/javascript/themes/glitch/components/extended_video_player.js rename to app/javascript/flavours/glitch/components/extended_video_player.js diff --git a/app/javascript/themes/glitch/components/icon_button.js b/app/javascript/flavours/glitch/components/icon_button.js similarity index 98% rename from app/javascript/themes/glitch/components/icon_button.js rename to app/javascript/flavours/glitch/components/icon_button.js index 31cdf4703..13b91e8a1 100644 --- a/app/javascript/themes/glitch/components/icon_button.js +++ b/app/javascript/flavours/glitch/components/icon_button.js @@ -1,5 +1,5 @@ import React from 'react'; -import Motion from 'themes/glitch/util/optional_motion'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; import PropTypes from 'prop-types'; import classNames from 'classnames'; diff --git a/app/javascript/themes/glitch/components/intersection_observer_article.js b/app/javascript/flavours/glitch/components/intersection_observer_article.js similarity index 96% rename from app/javascript/themes/glitch/components/intersection_observer_article.js rename to app/javascript/flavours/glitch/components/intersection_observer_article.js index f0139ac75..8b06f9a8c 100644 --- a/app/javascript/themes/glitch/components/intersection_observer_article.js +++ b/app/javascript/flavours/glitch/components/intersection_observer_article.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import scheduleIdleTask from 'themes/glitch/util/schedule_idle_task'; -import getRectFromEntry from 'themes/glitch/util/get_rect_from_entry'; +import scheduleIdleTask from 'flavours/glitch/util/schedule_idle_task'; +import getRectFromEntry from 'flavours/glitch/util/get_rect_from_entry'; import { is } from 'immutable'; // Diff these props in the "rendered" state diff --git a/app/javascript/themes/glitch/components/load_more.js b/app/javascript/flavours/glitch/components/load_more.js similarity index 100% rename from app/javascript/themes/glitch/components/load_more.js rename to app/javascript/flavours/glitch/components/load_more.js diff --git a/app/javascript/themes/glitch/components/loading_indicator.js b/app/javascript/flavours/glitch/components/loading_indicator.js similarity index 100% rename from app/javascript/themes/glitch/components/loading_indicator.js rename to app/javascript/flavours/glitch/components/loading_indicator.js diff --git a/app/javascript/themes/glitch/components/media_gallery.js b/app/javascript/flavours/glitch/components/media_gallery.js similarity index 98% rename from app/javascript/themes/glitch/components/media_gallery.js rename to app/javascript/flavours/glitch/components/media_gallery.js index b6b40c585..d2e80de49 100644 --- a/app/javascript/themes/glitch/components/media_gallery.js +++ b/app/javascript/flavours/glitch/components/media_gallery.js @@ -4,9 +4,9 @@ import PropTypes from 'prop-types'; import { is } from 'immutable'; import IconButton from './icon_button'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import { isIOS } from 'themes/glitch/util/is_mobile'; +import { isIOS } from 'flavours/glitch/util/is_mobile'; import classNames from 'classnames'; -import { autoPlayGif } from 'themes/glitch/util/initial_state'; +import { autoPlayGif } from 'flavours/glitch/util/initial_state'; const messages = defineMessages({ toggle_visible: { id: 'media_gallery.toggle_visible', defaultMessage: 'Toggle visibility' }, diff --git a/app/javascript/themes/glitch/components/missing_indicator.js b/app/javascript/flavours/glitch/components/missing_indicator.js similarity index 100% rename from app/javascript/themes/glitch/components/missing_indicator.js rename to app/javascript/flavours/glitch/components/missing_indicator.js diff --git a/app/javascript/themes/glitch/components/notification_purge_buttons.js b/app/javascript/flavours/glitch/components/notification_purge_buttons.js similarity index 100% rename from app/javascript/themes/glitch/components/notification_purge_buttons.js rename to app/javascript/flavours/glitch/components/notification_purge_buttons.js diff --git a/app/javascript/themes/glitch/components/permalink.js b/app/javascript/flavours/glitch/components/permalink.js similarity index 100% rename from app/javascript/themes/glitch/components/permalink.js rename to app/javascript/flavours/glitch/components/permalink.js diff --git a/app/javascript/themes/glitch/components/relative_timestamp.js b/app/javascript/flavours/glitch/components/relative_timestamp.js similarity index 100% rename from app/javascript/themes/glitch/components/relative_timestamp.js rename to app/javascript/flavours/glitch/components/relative_timestamp.js diff --git a/app/javascript/themes/glitch/components/scrollable_list.js b/app/javascript/flavours/glitch/components/scrollable_list.js similarity index 95% rename from app/javascript/themes/glitch/components/scrollable_list.js rename to app/javascript/flavours/glitch/components/scrollable_list.js index ccdcd7c85..8b1e3c93d 100644 --- a/app/javascript/themes/glitch/components/scrollable_list.js +++ b/app/javascript/flavours/glitch/components/scrollable_list.js @@ -1,13 +1,13 @@ import React, { PureComponent } from 'react'; import { ScrollContainer } from 'react-router-scroll-4'; import PropTypes from 'prop-types'; -import IntersectionObserverArticleContainer from 'themes/glitch/containers/intersection_observer_article_container'; +import IntersectionObserverArticleContainer from 'flavours/glitch/containers/intersection_observer_article_container'; import LoadMore from './load_more'; -import IntersectionObserverWrapper from 'themes/glitch/util/intersection_observer_wrapper'; +import IntersectionObserverWrapper from 'flavours/glitch/util/intersection_observer_wrapper'; import { throttle } from 'lodash'; import { List as ImmutableList } from 'immutable'; import classNames from 'classnames'; -import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from 'themes/glitch/util/fullscreen'; +import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from 'flavours/glitch/util/fullscreen'; export default class ScrollableList extends PureComponent { diff --git a/app/javascript/themes/glitch/components/setting_text.js b/app/javascript/flavours/glitch/components/setting_text.js similarity index 100% rename from app/javascript/themes/glitch/components/setting_text.js rename to app/javascript/flavours/glitch/components/setting_text.js diff --git a/app/javascript/themes/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js similarity index 98% rename from app/javascript/themes/glitch/components/status.js rename to app/javascript/flavours/glitch/components/status.js index e2ef47f5f..6662285d0 100644 --- a/app/javascript/themes/glitch/components/status.js +++ b/app/javascript/flavours/glitch/components/status.js @@ -6,9 +6,9 @@ import StatusHeader from './status_header'; import StatusContent from './status_content'; import StatusActionBar from './status_action_bar'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { MediaGallery, Video } from 'themes/glitch/util/async-components'; +import { MediaGallery, Video } from 'flavours/glitch/util/async-components'; import { HotKeys } from 'react-hotkeys'; -import NotificationOverlayContainer from 'themes/glitch/features/notifications/containers/overlay_container'; +import NotificationOverlayContainer from 'flavours/glitch/features/notifications/containers/overlay_container'; // We use the component (and not the container) since we do not want // to use the progress bar to show download progress diff --git a/app/javascript/themes/glitch/components/status_action_bar.js b/app/javascript/flavours/glitch/components/status_action_bar.js similarity index 96% rename from app/javascript/themes/glitch/components/status_action_bar.js rename to app/javascript/flavours/glitch/components/status_action_bar.js index 9d615ed7c..5a06782be 100644 --- a/app/javascript/themes/glitch/components/status_action_bar.js +++ b/app/javascript/flavours/glitch/components/status_action_bar.js @@ -1,14 +1,11 @@ -// THIS FILE EXISTS FOR UPSTREAM COMPATIBILITY & SHOULDN'T BE USED !! -// SEE INSTEAD : glitch/components/status/action_bar - import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; import IconButton from './icon_button'; -import DropdownMenuContainer from 'themes/glitch/containers/dropdown_menu_container'; +import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; import RelativeTimestamp from './relative_timestamp'; const messages = defineMessages({ diff --git a/app/javascript/themes/glitch/components/status_content.js b/app/javascript/flavours/glitch/components/status_content.js similarity index 99% rename from app/javascript/themes/glitch/components/status_content.js rename to app/javascript/flavours/glitch/components/status_content.js index 3eba6eaa0..0c40e62cc 100644 --- a/app/javascript/themes/glitch/components/status_content.js +++ b/app/javascript/flavours/glitch/components/status_content.js @@ -1,7 +1,7 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import { isRtl } from 'themes/glitch/util/rtl'; +import { isRtl } from 'flavours/glitch/util/rtl'; import { FormattedMessage } from 'react-intl'; import Permalink from './permalink'; import classnames from 'classnames'; diff --git a/app/javascript/themes/glitch/components/status_header.js b/app/javascript/flavours/glitch/components/status_header.js similarity index 100% rename from app/javascript/themes/glitch/components/status_header.js rename to app/javascript/flavours/glitch/components/status_header.js diff --git a/app/javascript/themes/glitch/components/status_list.js b/app/javascript/flavours/glitch/components/status_list.js similarity index 95% rename from app/javascript/themes/glitch/components/status_list.js rename to app/javascript/flavours/glitch/components/status_list.js index ddb1354c6..f190ba6ab 100644 --- a/app/javascript/themes/glitch/components/status_list.js +++ b/app/javascript/flavours/glitch/components/status_list.js @@ -1,7 +1,7 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import StatusContainer from 'themes/glitch/containers/status_container'; +import StatusContainer from 'flavours/glitch/containers/status_container'; import ImmutablePureComponent from 'react-immutable-pure-component'; import ScrollableList from './scrollable_list'; diff --git a/app/javascript/themes/glitch/components/status_prepend.js b/app/javascript/flavours/glitch/components/status_prepend.js similarity index 100% rename from app/javascript/themes/glitch/components/status_prepend.js rename to app/javascript/flavours/glitch/components/status_prepend.js diff --git a/app/javascript/themes/glitch/components/status_visibility_icon.js b/app/javascript/flavours/glitch/components/status_visibility_icon.js similarity index 100% rename from app/javascript/themes/glitch/components/status_visibility_icon.js rename to app/javascript/flavours/glitch/components/status_visibility_icon.js diff --git a/app/javascript/themes/glitch/containers/account_container.js b/app/javascript/flavours/glitch/containers/account_container.js similarity index 84% rename from app/javascript/themes/glitch/containers/account_container.js rename to app/javascript/flavours/glitch/containers/account_container.js index c1ce49987..bc84d299b 100644 --- a/app/javascript/themes/glitch/containers/account_container.js +++ b/app/javascript/flavours/glitch/containers/account_container.js @@ -1,8 +1,8 @@ import React from 'react'; import { connect } from 'react-redux'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import { makeGetAccount } from 'themes/glitch/selectors'; -import Account from 'themes/glitch/components/account'; +import { makeGetAccount } from 'flavours/glitch/selectors'; +import Account from 'flavours/glitch/components/account'; import { followAccount, unfollowAccount, @@ -10,10 +10,10 @@ import { unblockAccount, muteAccount, unmuteAccount, -} from 'themes/glitch/actions/accounts'; -import { openModal } from 'themes/glitch/actions/modal'; -import { initMuteModal } from 'themes/glitch/actions/mutes'; -import { unfollowModal } from 'themes/glitch/util/initial_state'; +} from 'flavours/glitch/actions/accounts'; +import { openModal } from 'flavours/glitch/actions/modal'; +import { initMuteModal } from 'flavours/glitch/actions/mutes'; +import { unfollowModal } from 'flavours/glitch/util/initial_state'; const messages = defineMessages({ unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' }, diff --git a/app/javascript/themes/glitch/containers/card_container.js b/app/javascript/flavours/glitch/containers/card_container.js similarity index 84% rename from app/javascript/themes/glitch/containers/card_container.js rename to app/javascript/flavours/glitch/containers/card_container.js index 8285437bb..dec7df522 100644 --- a/app/javascript/themes/glitch/containers/card_container.js +++ b/app/javascript/flavours/glitch/containers/card_container.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import Card from 'themes/glitch/features/status/components/card'; +import Card from 'flavours/glitch/features/status/components/card'; import { fromJS } from 'immutable'; export default class CardContainer extends React.PureComponent { diff --git a/app/javascript/themes/glitch/containers/compose_container.js b/app/javascript/flavours/glitch/containers/compose_container.js similarity index 74% rename from app/javascript/themes/glitch/containers/compose_container.js rename to app/javascript/flavours/glitch/containers/compose_container.js index 82980ee36..60f6a9c9f 100644 --- a/app/javascript/themes/glitch/containers/compose_container.js +++ b/app/javascript/flavours/glitch/containers/compose_container.js @@ -1,12 +1,12 @@ import React from 'react'; import { Provider } from 'react-redux'; import PropTypes from 'prop-types'; -import configureStore from 'themes/glitch/store/configureStore'; -import { hydrateStore } from 'themes/glitch/actions/store'; +import configureStore from 'flavours/glitch/store/configureStore'; +import { hydrateStore } from 'flavours/glitch/actions/store'; import { IntlProvider, addLocaleData } from 'react-intl'; import { getLocale } from 'mastodon/locales'; -import Compose from 'themes/glitch/features/standalone/compose'; -import initialState from 'themes/glitch/util/initial_state'; +import Compose from 'flavours/glitch/features/standalone/compose'; +import initialState from 'flavours/glitch/util/initial_state'; const { localeData, messages } = getLocale(); addLocaleData(localeData); diff --git a/app/javascript/themes/glitch/containers/dropdown_menu_container.js b/app/javascript/flavours/glitch/containers/dropdown_menu_container.js similarity index 65% rename from app/javascript/themes/glitch/containers/dropdown_menu_container.js rename to app/javascript/flavours/glitch/containers/dropdown_menu_container.js index 15e8da2e3..0b4f72fa1 100644 --- a/app/javascript/themes/glitch/containers/dropdown_menu_container.js +++ b/app/javascript/flavours/glitch/containers/dropdown_menu_container.js @@ -1,7 +1,7 @@ -import { openModal, closeModal } from 'themes/glitch/actions/modal'; +import { openModal, closeModal } from 'flavours/glitch/actions/modal'; import { connect } from 'react-redux'; -import DropdownMenu from 'themes/glitch/components/dropdown_menu'; -import { isUserTouching } from 'themes/glitch/util/is_mobile'; +import DropdownMenu from 'flavours/glitch/components/dropdown_menu'; +import { isUserTouching } from 'flavours/glitch/util/is_mobile'; const mapStateToProps = state => ({ isModalOpen: state.get('modal').modalType === 'ACTIONS', diff --git a/app/javascript/themes/glitch/containers/intersection_observer_article_container.js b/app/javascript/flavours/glitch/containers/intersection_observer_article_container.js similarity index 70% rename from app/javascript/themes/glitch/containers/intersection_observer_article_container.js rename to app/javascript/flavours/glitch/containers/intersection_observer_article_container.js index 6ede64738..f2741f2d4 100644 --- a/app/javascript/themes/glitch/containers/intersection_observer_article_container.js +++ b/app/javascript/flavours/glitch/containers/intersection_observer_article_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; -import IntersectionObserverArticle from 'themes/glitch/components/intersection_observer_article'; -import { setHeight } from 'themes/glitch/actions/height_cache'; +import IntersectionObserverArticle from 'flavours/glitch/components/intersection_observer_article'; +import { setHeight } from 'flavours/glitch/actions/height_cache'; const makeMapStateToProps = (state, props) => ({ cachedHeight: state.getIn(['height_cache', props.saveHeightKey, props.id]), diff --git a/app/javascript/themes/glitch/containers/mastodon.js b/app/javascript/flavours/glitch/containers/mastodon.js similarity index 82% rename from app/javascript/themes/glitch/containers/mastodon.js rename to app/javascript/flavours/glitch/containers/mastodon.js index 755b5564a..1c98cd5f7 100644 --- a/app/javascript/themes/glitch/containers/mastodon.js +++ b/app/javascript/flavours/glitch/containers/mastodon.js @@ -1,16 +1,16 @@ import React from 'react'; import { Provider } from 'react-redux'; import PropTypes from 'prop-types'; -import configureStore from 'themes/glitch/store/configureStore'; -import { showOnboardingOnce } from 'themes/glitch/actions/onboarding'; +import configureStore from 'flavours/glitch/store/configureStore'; +import { showOnboardingOnce } from 'flavours/glitch/actions/onboarding'; import { BrowserRouter, Route } from 'react-router-dom'; import { ScrollContext } from 'react-router-scroll-4'; -import UI from 'themes/glitch/features/ui'; -import { hydrateStore } from 'themes/glitch/actions/store'; -import { connectUserStream } from 'themes/glitch/actions/streaming'; +import UI from 'flavours/glitch/features/ui'; +import { hydrateStore } from 'flavours/glitch/actions/store'; +import { connectUserStream } from 'flavours/glitch/actions/streaming'; import { IntlProvider, addLocaleData } from 'react-intl'; import { getLocale } from 'locales'; -import initialState from 'themes/glitch/util/initial_state'; +import initialState from 'flavours/glitch/util/initial_state'; const { localeData, messages } = getLocale(); addLocaleData(localeData); diff --git a/app/javascript/themes/glitch/containers/media_gallery_container.js b/app/javascript/flavours/glitch/containers/media_gallery_container.js similarity index 92% rename from app/javascript/themes/glitch/containers/media_gallery_container.js rename to app/javascript/flavours/glitch/containers/media_gallery_container.js index 86965f73b..54bfbf453 100644 --- a/app/javascript/themes/glitch/containers/media_gallery_container.js +++ b/app/javascript/flavours/glitch/containers/media_gallery_container.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { IntlProvider, addLocaleData } from 'react-intl'; import { getLocale } from 'mastodon/locales'; -import MediaGallery from 'themes/glitch/components/media_gallery'; +import MediaGallery from 'flavours/glitch/components/media_gallery'; import { fromJS } from 'immutable'; const { localeData, messages } = getLocale(); diff --git a/app/javascript/themes/glitch/containers/notification_purge_buttons_container.js b/app/javascript/flavours/glitch/containers/notification_purge_buttons_container.js similarity index 86% rename from app/javascript/themes/glitch/containers/notification_purge_buttons_container.js rename to app/javascript/flavours/glitch/containers/notification_purge_buttons_container.js index ee4cb84cd..2570cf4a5 100644 --- a/app/javascript/themes/glitch/containers/notification_purge_buttons_container.js +++ b/app/javascript/flavours/glitch/containers/notification_purge_buttons_container.js @@ -3,13 +3,13 @@ import { connect } from 'react-redux'; import { defineMessages, injectIntl } from 'react-intl'; // Our imports. -import NotificationPurgeButtons from 'themes/glitch/components/notification_purge_buttons'; +import NotificationPurgeButtons from 'flavours/glitch/components/notification_purge_buttons'; import { deleteMarkedNotifications, enterNotificationClearingMode, markAllNotifications, -} from 'themes/glitch/actions/notifications'; -import { openModal } from 'themes/glitch/actions/modal'; +} from 'flavours/glitch/actions/notifications'; +import { openModal } from 'flavours/glitch/actions/modal'; const messages = defineMessages({ clearMessage: { id: 'notifications.marked_clear_confirmation', defaultMessage: 'Are you sure you want to permanently clear all selected notifications?' }, diff --git a/app/javascript/themes/glitch/containers/status_container.js b/app/javascript/flavours/glitch/containers/status_container.js similarity index 85% rename from app/javascript/themes/glitch/containers/status_container.js rename to app/javascript/flavours/glitch/containers/status_container.js index 14906723a..1a4f35278 100644 --- a/app/javascript/themes/glitch/containers/status_container.js +++ b/app/javascript/flavours/glitch/containers/status_container.js @@ -1,11 +1,11 @@ import React from 'react'; import { connect } from 'react-redux'; -import Status from 'themes/glitch/components/status'; -import { makeGetStatus } from 'themes/glitch/selectors'; +import Status from 'flavours/glitch/components/status'; +import { makeGetStatus } from 'flavours/glitch/selectors'; import { replyCompose, mentionCompose, -} from 'themes/glitch/actions/compose'; +} from 'flavours/glitch/actions/compose'; import { reblog, favourite, @@ -13,14 +13,14 @@ import { unfavourite, pin, unpin, -} from 'themes/glitch/actions/interactions'; -import { blockAccount } from 'themes/glitch/actions/accounts'; -import { muteStatus, unmuteStatus, deleteStatus } from 'themes/glitch/actions/statuses'; -import { initMuteModal } from 'themes/glitch/actions/mutes'; -import { initReport } from 'themes/glitch/actions/reports'; -import { openModal } from 'themes/glitch/actions/modal'; +} from 'flavours/glitch/actions/interactions'; +import { blockAccount } from 'flavours/glitch/actions/accounts'; +import { muteStatus, unmuteStatus, deleteStatus } from 'flavours/glitch/actions/statuses'; +import { initMuteModal } from 'flavours/glitch/actions/mutes'; +import { initReport } from 'flavours/glitch/actions/reports'; +import { openModal } from 'flavours/glitch/actions/modal'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import { boostModal, deleteModal } from 'themes/glitch/util/initial_state'; +import { boostModal, deleteModal } from 'flavours/glitch/util/initial_state'; const messages = defineMessages({ deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, diff --git a/app/javascript/themes/glitch/containers/timeline_container.js b/app/javascript/flavours/glitch/containers/timeline_container.js similarity index 72% rename from app/javascript/themes/glitch/containers/timeline_container.js rename to app/javascript/flavours/glitch/containers/timeline_container.js index a75f8808d..c5ffe1b63 100644 --- a/app/javascript/themes/glitch/containers/timeline_container.js +++ b/app/javascript/flavours/glitch/containers/timeline_container.js @@ -1,13 +1,13 @@ import React from 'react'; import { Provider } from 'react-redux'; import PropTypes from 'prop-types'; -import configureStore from 'themes/glitch/store/configureStore'; -import { hydrateStore } from 'themes/glitch/actions/store'; +import configureStore from 'flavours/glitch/store/configureStore'; +import { hydrateStore } from 'flavours/glitch/actions/store'; import { IntlProvider, addLocaleData } from 'react-intl'; import { getLocale } from 'mastodon/locales'; -import PublicTimeline from 'themes/glitch/features/standalone/public_timeline'; -import HashtagTimeline from 'themes/glitch/features/standalone/hashtag_timeline'; -import initialState from 'themes/glitch/util/initial_state'; +import PublicTimeline from 'flavours/glitch/features/standalone/public_timeline'; +import HashtagTimeline from 'flavours/glitch/features/standalone/hashtag_timeline'; +import initialState from 'flavours/glitch/util/initial_state'; const { localeData, messages } = getLocale(); addLocaleData(localeData); diff --git a/app/javascript/themes/glitch/containers/video_container.js b/app/javascript/flavours/glitch/containers/video_container.js similarity index 91% rename from app/javascript/themes/glitch/containers/video_container.js rename to app/javascript/flavours/glitch/containers/video_container.js index 2b0e98666..b206e9a10 100644 --- a/app/javascript/themes/glitch/containers/video_container.js +++ b/app/javascript/flavours/glitch/containers/video_container.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { IntlProvider, addLocaleData } from 'react-intl'; import { getLocale } from 'mastodon/locales'; -import Video from 'themes/glitch/features/video'; +import Video from 'flavours/glitch/features/video'; const { localeData, messages } = getLocale(); addLocaleData(localeData); diff --git a/app/javascript/themes/glitch/features/account/components/action_bar.js b/app/javascript/flavours/glitch/features/account/components/action_bar.js similarity index 97% rename from app/javascript/themes/glitch/features/account/components/action_bar.js rename to app/javascript/flavours/glitch/features/account/components/action_bar.js index 0edd5c848..7c9c1af4e 100644 --- a/app/javascript/themes/glitch/features/account/components/action_bar.js +++ b/app/javascript/flavours/glitch/features/account/components/action_bar.js @@ -1,10 +1,10 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import DropdownMenuContainer from 'themes/glitch/containers/dropdown_menu_container'; +import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container'; import { Link } from 'react-router-dom'; import { defineMessages, injectIntl, FormattedMessage, FormattedNumber } from 'react-intl'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; const messages = defineMessages({ mention: { id: 'account.mention', defaultMessage: 'Mention @{name}' }, diff --git a/app/javascript/themes/glitch/features/account/components/header.js b/app/javascript/flavours/glitch/features/account/components/header.js similarity index 92% rename from app/javascript/themes/glitch/features/account/components/header.js rename to app/javascript/flavours/glitch/features/account/components/header.js index 696bb1991..f5ecaae71 100644 --- a/app/javascript/themes/glitch/features/account/components/header.js +++ b/app/javascript/flavours/glitch/features/account/components/header.js @@ -4,12 +4,12 @@ import PropTypes from 'prop-types'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import Avatar from 'themes/glitch/components/avatar'; -import IconButton from 'themes/glitch/components/icon_button'; +import Avatar from 'flavours/glitch/components/avatar'; +import IconButton from 'flavours/glitch/components/icon_button'; -import emojify from 'themes/glitch/util/emoji'; -import { me } from 'themes/glitch/util/initial_state'; -import { processBio } from 'themes/glitch/util/bio_metadata'; +import emojify from 'flavours/glitch/util/emoji'; +import { me } from 'flavours/glitch/util/initial_state'; +import { processBio } from 'flavours/glitch/util/bio_metadata'; const messages = defineMessages({ unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' }, diff --git a/app/javascript/themes/glitch/features/account_gallery/components/media_item.js b/app/javascript/flavours/glitch/features/account_gallery/components/media_item.js similarity index 93% rename from app/javascript/themes/glitch/features/account_gallery/components/media_item.js rename to app/javascript/flavours/glitch/features/account_gallery/components/media_item.js index 88c9156b5..e52d3b0bb 100644 --- a/app/javascript/themes/glitch/features/account_gallery/components/media_item.js +++ b/app/javascript/flavours/glitch/features/account_gallery/components/media_item.js @@ -1,7 +1,7 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import Permalink from 'themes/glitch/components/permalink'; +import Permalink from 'flavours/glitch/components/permalink'; export default class MediaItem extends ImmutablePureComponent { diff --git a/app/javascript/themes/glitch/features/account_gallery/index.js b/app/javascript/flavours/glitch/features/account_gallery/index.js similarity index 84% rename from app/javascript/themes/glitch/features/account_gallery/index.js rename to app/javascript/flavours/glitch/features/account_gallery/index.js index a21c089da..951e019e3 100644 --- a/app/javascript/themes/glitch/features/account_gallery/index.js +++ b/app/javascript/flavours/glitch/features/account_gallery/index.js @@ -2,18 +2,18 @@ import React from 'react'; import { connect } from 'react-redux'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import { fetchAccount } from 'themes/glitch/actions/accounts'; -import { refreshAccountMediaTimeline, expandAccountMediaTimeline } from 'themes/glitch/actions/timelines'; -import LoadingIndicator from 'themes/glitch/components/loading_indicator'; -import Column from 'themes/glitch/features/ui/components/column'; -import ColumnBackButton from 'themes/glitch/components/column_back_button'; +import { fetchAccount } from 'flavours/glitch/actions/accounts'; +import { refreshAccountMediaTimeline, expandAccountMediaTimeline } from 'flavours/glitch/actions/timelines'; +import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import Column from 'flavours/glitch/features/ui/components/column'; +import ColumnBackButton from 'flavours/glitch/components/column_back_button'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { getAccountGallery } from 'themes/glitch/selectors'; +import { getAccountGallery } from 'flavours/glitch/selectors'; import MediaItem from './components/media_item'; -import HeaderContainer from 'themes/glitch/features/account_timeline/containers/header_container'; +import HeaderContainer from 'flavours/glitch/features/account_timeline/containers/header_container'; import { FormattedMessage } from 'react-intl'; import { ScrollContainer } from 'react-router-scroll-4'; -import LoadMore from 'themes/glitch/components/load_more'; +import LoadMore from 'flavours/glitch/components/load_more'; const mapStateToProps = (state, props) => ({ medias: getAccountGallery(state, props.params.accountId), diff --git a/app/javascript/themes/glitch/features/account_timeline/components/header.js b/app/javascript/flavours/glitch/features/account_timeline/components/header.js similarity index 90% rename from app/javascript/themes/glitch/features/account_timeline/components/header.js rename to app/javascript/flavours/glitch/features/account_timeline/components/header.js index c719a7bcb..4ad677fbe 100644 --- a/app/javascript/themes/glitch/features/account_timeline/components/header.js +++ b/app/javascript/flavours/glitch/features/account_timeline/components/header.js @@ -1,9 +1,9 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import InnerHeader from 'themes/glitch/features/account/components/header'; -import ActionBar from 'themes/glitch/features/account/components/action_bar'; -import MissingIndicator from 'themes/glitch/components/missing_indicator'; +import InnerHeader from 'flavours/glitch/features/account/components/header'; +import ActionBar from 'flavours/glitch/features/account/components/action_bar'; +import MissingIndicator from 'flavours/glitch/components/missing_indicator'; import ImmutablePureComponent from 'react-immutable-pure-component'; export default class Header extends ImmutablePureComponent { diff --git a/app/javascript/themes/glitch/features/account_timeline/containers/header_container.js b/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js similarity index 86% rename from app/javascript/themes/glitch/features/account_timeline/containers/header_container.js rename to app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js index 766b57b56..815a1a613 100644 --- a/app/javascript/themes/glitch/features/account_timeline/containers/header_container.js +++ b/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js @@ -1,6 +1,6 @@ import React from 'react'; import { connect } from 'react-redux'; -import { makeGetAccount } from 'themes/glitch/selectors'; +import { makeGetAccount } from 'flavours/glitch/selectors'; import Header from '../components/header'; import { followAccount, @@ -8,14 +8,14 @@ import { blockAccount, unblockAccount, unmuteAccount, -} from 'themes/glitch/actions/accounts'; -import { mentionCompose } from 'themes/glitch/actions/compose'; -import { initMuteModal } from 'themes/glitch/actions/mutes'; -import { initReport } from 'themes/glitch/actions/reports'; -import { openModal } from 'themes/glitch/actions/modal'; -import { blockDomain, unblockDomain } from 'themes/glitch/actions/domain_blocks'; +} from 'flavours/glitch/actions/accounts'; +import { mentionCompose } from 'flavours/glitch/actions/compose'; +import { initMuteModal } from 'flavours/glitch/actions/mutes'; +import { initReport } from 'flavours/glitch/actions/reports'; +import { openModal } from 'flavours/glitch/actions/modal'; +import { blockDomain, unblockDomain } from 'flavours/glitch/actions/domain_blocks'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import { unfollowModal } from 'themes/glitch/util/initial_state'; +import { unfollowModal } from 'flavours/glitch/util/initial_state'; const messages = defineMessages({ unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' }, diff --git a/app/javascript/themes/glitch/features/account_timeline/index.js b/app/javascript/flavours/glitch/features/account_timeline/index.js similarity index 93% rename from app/javascript/themes/glitch/features/account_timeline/index.js rename to app/javascript/flavours/glitch/features/account_timeline/index.js index 81336ef3a..75dba5049 100644 --- a/app/javascript/themes/glitch/features/account_timeline/index.js +++ b/app/javascript/flavours/glitch/features/account_timeline/index.js @@ -2,8 +2,8 @@ import React from 'react'; import { connect } from 'react-redux'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import { fetchAccount } from 'themes/glitch/actions/accounts'; -import { refreshAccountTimeline, expandAccountTimeline } from 'themes/glitch/actions/timelines'; +import { fetchAccount } from 'flavours/glitch/actions/accounts'; +import { refreshAccountTimeline, expandAccountTimeline } from 'flavours/glitch/actions/timelines'; import StatusList from '../../components/status_list'; import LoadingIndicator from '../../components/loading_indicator'; import Column from '../ui/components/column'; diff --git a/app/javascript/themes/glitch/features/blocks/index.js b/app/javascript/flavours/glitch/features/blocks/index.js similarity index 81% rename from app/javascript/themes/glitch/features/blocks/index.js rename to app/javascript/flavours/glitch/features/blocks/index.js index 70630818c..edd448921 100644 --- a/app/javascript/themes/glitch/features/blocks/index.js +++ b/app/javascript/flavours/glitch/features/blocks/index.js @@ -2,12 +2,12 @@ import React from 'react'; import { connect } from 'react-redux'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import LoadingIndicator from 'themes/glitch/components/loading_indicator'; +import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; import { ScrollContainer } from 'react-router-scroll-4'; -import Column from 'themes/glitch/features/ui/components/column'; -import ColumnBackButtonSlim from 'themes/glitch/components/column_back_button_slim'; -import AccountContainer from 'themes/glitch/containers/account_container'; -import { fetchBlocks, expandBlocks } from 'themes/glitch/actions/blocks'; +import Column from 'flavours/glitch/features/ui/components/column'; +import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim'; +import AccountContainer from 'flavours/glitch/containers/account_container'; +import { fetchBlocks, expandBlocks } from 'flavours/glitch/actions/blocks'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/javascript/themes/glitch/features/community_timeline/components/column_settings.js b/app/javascript/flavours/glitch/features/community_timeline/components/column_settings.js similarity index 94% rename from app/javascript/themes/glitch/features/community_timeline/components/column_settings.js rename to app/javascript/flavours/glitch/features/community_timeline/components/column_settings.js index 988e36308..6dc292ee5 100644 --- a/app/javascript/themes/glitch/features/community_timeline/components/column_settings.js +++ b/app/javascript/flavours/glitch/features/community_timeline/components/column_settings.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import SettingText from 'themes/glitch/components/setting_text'; +import SettingText from 'flavours/glitch/components/setting_text'; const messages = defineMessages({ filter_regex: { id: 'home.column_settings.filter_regex', defaultMessage: 'Filter out by regular expressions' }, diff --git a/app/javascript/themes/glitch/features/community_timeline/containers/column_settings_container.js b/app/javascript/flavours/glitch/features/community_timeline/containers/column_settings_container.js similarity index 86% rename from app/javascript/themes/glitch/features/community_timeline/containers/column_settings_container.js rename to app/javascript/flavours/glitch/features/community_timeline/containers/column_settings_container.js index cd9c34365..84234a836 100644 --- a/app/javascript/themes/glitch/features/community_timeline/containers/column_settings_container.js +++ b/app/javascript/flavours/glitch/features/community_timeline/containers/column_settings_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import ColumnSettings from '../components/column_settings'; -import { changeSetting } from 'themes/glitch/actions/settings'; +import { changeSetting } from 'flavours/glitch/actions/settings'; const mapStateToProps = state => ({ settings: state.getIn(['settings', 'community']), diff --git a/app/javascript/themes/glitch/features/community_timeline/index.js b/app/javascript/flavours/glitch/features/community_timeline/index.js similarity index 85% rename from app/javascript/themes/glitch/features/community_timeline/index.js rename to app/javascript/flavours/glitch/features/community_timeline/index.js index 9d255bd01..55355414f 100644 --- a/app/javascript/themes/glitch/features/community_timeline/index.js +++ b/app/javascript/flavours/glitch/features/community_timeline/index.js @@ -1,17 +1,17 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; -import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container'; -import Column from 'themes/glitch/components/column'; -import ColumnHeader from 'themes/glitch/components/column_header'; +import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container'; +import Column from 'flavours/glitch/components/column'; +import ColumnHeader from 'flavours/glitch/components/column_header'; import { refreshCommunityTimeline, expandCommunityTimeline, -} from 'themes/glitch/actions/timelines'; -import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns'; +} from 'flavours/glitch/actions/timelines'; +import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import ColumnSettingsContainer from './containers/column_settings_container'; -import { connectCommunityStream } from 'themes/glitch/actions/streaming'; +import { connectCommunityStream } from 'flavours/glitch/actions/streaming'; const messages = defineMessages({ title: { id: 'column.community', defaultMessage: 'Local timeline' }, diff --git a/app/javascript/themes/glitch/features/compose/components/advanced_options.js b/app/javascript/flavours/glitch/features/compose/components/advanced_options.js similarity index 100% rename from app/javascript/themes/glitch/features/compose/components/advanced_options.js rename to app/javascript/flavours/glitch/features/compose/components/advanced_options.js diff --git a/app/javascript/themes/glitch/features/compose/components/advanced_options_toggle.js b/app/javascript/flavours/glitch/features/compose/components/advanced_options_toggle.js similarity index 100% rename from app/javascript/themes/glitch/features/compose/components/advanced_options_toggle.js rename to app/javascript/flavours/glitch/features/compose/components/advanced_options_toggle.js diff --git a/app/javascript/themes/glitch/features/compose/components/attach_options.js b/app/javascript/flavours/glitch/features/compose/components/attach_options.js similarity index 96% rename from app/javascript/themes/glitch/features/compose/components/attach_options.js rename to app/javascript/flavours/glitch/features/compose/components/attach_options.js index c396714f3..6c7a1f55f 100644 --- a/app/javascript/themes/glitch/features/compose/components/attach_options.js +++ b/app/javascript/flavours/glitch/features/compose/components/attach_options.js @@ -6,10 +6,10 @@ import { injectIntl, defineMessages } from 'react-intl'; // Our imports // import ComposeDropdown from './dropdown'; -import { uploadCompose } from 'themes/glitch/actions/compose'; +import { uploadCompose } from 'flavours/glitch/actions/compose'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { openModal } from 'themes/glitch/actions/modal'; +import { openModal } from 'flavours/glitch/actions/modal'; const messages = defineMessages({ upload : diff --git a/app/javascript/themes/glitch/features/compose/components/autosuggest_account.js b/app/javascript/flavours/glitch/features/compose/components/autosuggest_account.js similarity index 82% rename from app/javascript/themes/glitch/features/compose/components/autosuggest_account.js rename to app/javascript/flavours/glitch/features/compose/components/autosuggest_account.js index 4a98d89fe..3d474af30 100644 --- a/app/javascript/themes/glitch/features/compose/components/autosuggest_account.js +++ b/app/javascript/flavours/glitch/features/compose/components/autosuggest_account.js @@ -1,6 +1,6 @@ import React from 'react'; -import Avatar from 'themes/glitch/components/avatar'; -import DisplayName from 'themes/glitch/components/display_name'; +import Avatar from 'flavours/glitch/components/avatar'; +import DisplayName from 'flavours/glitch/components/display_name'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/javascript/themes/glitch/features/compose/components/character_counter.js b/app/javascript/flavours/glitch/features/compose/components/character_counter.js similarity index 100% rename from app/javascript/themes/glitch/features/compose/components/character_counter.js rename to app/javascript/flavours/glitch/features/compose/components/character_counter.js diff --git a/app/javascript/themes/glitch/features/compose/components/compose_form.js b/app/javascript/flavours/glitch/features/compose/components/compose_form.js similarity index 96% rename from app/javascript/themes/glitch/features/compose/components/compose_form.js rename to app/javascript/flavours/glitch/features/compose/components/compose_form.js index 54b1944a4..67ce935f4 100644 --- a/app/javascript/themes/glitch/features/compose/components/compose_form.js +++ b/app/javascript/flavours/glitch/features/compose/components/compose_form.js @@ -1,12 +1,12 @@ import React from 'react'; import CharacterCounter from './character_counter'; -import Button from 'themes/glitch/components/button'; +import Button from 'flavours/glitch/components/button'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; import ReplyIndicatorContainer from '../containers/reply_indicator_container'; -import AutosuggestTextarea from 'themes/glitch/components/autosuggest_textarea'; +import AutosuggestTextarea from 'flavours/glitch/components/autosuggest_textarea'; import { defineMessages, injectIntl } from 'react-intl'; -import Collapsable from 'themes/glitch/components/collapsable'; +import Collapsable from 'flavours/glitch/components/collapsable'; import SpoilerButtonContainer from '../containers/spoiler_button_container'; import PrivacyDropdownContainer from '../containers/privacy_dropdown_container'; import ComposeAdvancedOptionsContainer from '../containers/advanced_options_container'; @@ -14,12 +14,12 @@ import SensitiveButtonContainer from '../containers/sensitive_button_container'; import EmojiPickerDropdown from '../containers/emoji_picker_dropdown_container'; import UploadFormContainer from '../containers/upload_form_container'; import WarningContainer from '../containers/warning_container'; -import { isMobile } from 'themes/glitch/util/is_mobile'; +import { isMobile } from 'flavours/glitch/util/is_mobile'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { length } from 'stringz'; -import { countableText } from 'themes/glitch/util/counter'; +import { countableText } from 'flavours/glitch/util/counter'; import ComposeAttachOptions from './attach_options'; -import initialState from 'themes/glitch/util/initial_state'; +import initialState from 'flavours/glitch/util/initial_state'; const maxChars = initialState.max_toot_chars; diff --git a/app/javascript/themes/glitch/features/compose/components/dropdown.js b/app/javascript/flavours/glitch/features/compose/components/dropdown.js similarity index 96% rename from app/javascript/themes/glitch/features/compose/components/dropdown.js rename to app/javascript/flavours/glitch/features/compose/components/dropdown.js index f3d9f094e..1b0000fb7 100644 --- a/app/javascript/themes/glitch/features/compose/components/dropdown.js +++ b/app/javascript/flavours/glitch/features/compose/components/dropdown.js @@ -3,7 +3,7 @@ import React from 'react'; import PropTypes from 'prop-types'; // Our imports. -import IconButton from 'themes/glitch/components/icon_button'; +import IconButton from 'flavours/glitch/components/icon_button'; const iconStyle = { height : null, diff --git a/app/javascript/themes/glitch/features/compose/components/emoji_picker_dropdown.js b/app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.js similarity index 98% rename from app/javascript/themes/glitch/features/compose/components/emoji_picker_dropdown.js rename to app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.js index fd59efb85..cf89f91d3 100644 --- a/app/javascript/themes/glitch/features/compose/components/emoji_picker_dropdown.js +++ b/app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.js @@ -1,12 +1,12 @@ import React from 'react'; import PropTypes from 'prop-types'; import { defineMessages, injectIntl } from 'react-intl'; -import { EmojiPicker as EmojiPickerAsync } from 'themes/glitch/util/async-components'; +import { EmojiPicker as EmojiPickerAsync } from 'flavours/glitch/util/async-components'; import Overlay from 'react-overlays/lib/Overlay'; import classNames from 'classnames'; import ImmutablePropTypes from 'react-immutable-proptypes'; import detectPassiveEvents from 'detect-passive-events'; -import { buildCustomEmojis } from 'themes/glitch/util/emoji'; +import { buildCustomEmojis } from 'flavours/glitch/util/emoji'; const messages = defineMessages({ emoji: { id: 'emoji_button.label', defaultMessage: 'Insert emoji' }, diff --git a/app/javascript/themes/glitch/features/compose/components/navigation_bar.js b/app/javascript/flavours/glitch/features/compose/components/navigation_bar.js similarity index 87% rename from app/javascript/themes/glitch/features/compose/components/navigation_bar.js rename to app/javascript/flavours/glitch/features/compose/components/navigation_bar.js index 24a70949b..1b6d74123 100644 --- a/app/javascript/themes/glitch/features/compose/components/navigation_bar.js +++ b/app/javascript/flavours/glitch/features/compose/components/navigation_bar.js @@ -1,9 +1,9 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import Avatar from 'themes/glitch/components/avatar'; -import IconButton from 'themes/glitch/components/icon_button'; -import Permalink from 'themes/glitch/components/permalink'; +import Avatar from 'flavours/glitch/components/avatar'; +import IconButton from 'flavours/glitch/components/icon_button'; +import Permalink from 'flavours/glitch/components/permalink'; import { FormattedMessage } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/javascript/themes/glitch/features/compose/components/privacy_dropdown.js b/app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.js similarity index 98% rename from app/javascript/themes/glitch/features/compose/components/privacy_dropdown.js rename to app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.js index 0cd92d174..90f062f8f 100644 --- a/app/javascript/themes/glitch/features/compose/components/privacy_dropdown.js +++ b/app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.js @@ -1,9 +1,9 @@ import React from 'react'; import PropTypes from 'prop-types'; import { injectIntl, defineMessages } from 'react-intl'; -import IconButton from 'themes/glitch/components/icon_button'; +import IconButton from 'flavours/glitch/components/icon_button'; import Overlay from 'react-overlays/lib/Overlay'; -import Motion from 'themes/glitch/util/optional_motion'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; import detectPassiveEvents from 'detect-passive-events'; import classNames from 'classnames'; diff --git a/app/javascript/themes/glitch/features/compose/components/reply_indicator.js b/app/javascript/flavours/glitch/features/compose/components/reply_indicator.js similarity index 90% rename from app/javascript/themes/glitch/features/compose/components/reply_indicator.js rename to app/javascript/flavours/glitch/features/compose/components/reply_indicator.js index 9a8d10ceb..cb28e51be 100644 --- a/app/javascript/themes/glitch/features/compose/components/reply_indicator.js +++ b/app/javascript/flavours/glitch/features/compose/components/reply_indicator.js @@ -1,9 +1,9 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import Avatar from 'themes/glitch/components/avatar'; -import IconButton from 'themes/glitch/components/icon_button'; -import DisplayName from 'themes/glitch/components/display_name'; +import Avatar from 'flavours/glitch/components/avatar'; +import IconButton from 'flavours/glitch/components/icon_button'; +import DisplayName from 'flavours/glitch/components/display_name'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/javascript/themes/glitch/features/compose/components/search.js b/app/javascript/flavours/glitch/features/compose/components/search.js similarity index 98% rename from app/javascript/themes/glitch/features/compose/components/search.js rename to app/javascript/flavours/glitch/features/compose/components/search.js index c3218137f..1ce66b19d 100644 --- a/app/javascript/themes/glitch/features/compose/components/search.js +++ b/app/javascript/flavours/glitch/features/compose/components/search.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import Overlay from 'react-overlays/lib/Overlay'; -import Motion from 'themes/glitch/util/optional_motion'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; const messages = defineMessages({ diff --git a/app/javascript/themes/glitch/features/compose/components/search_results.js b/app/javascript/flavours/glitch/features/compose/components/search_results.js similarity index 93% rename from app/javascript/themes/glitch/features/compose/components/search_results.js rename to app/javascript/flavours/glitch/features/compose/components/search_results.js index 3fdafa5f3..2a4818d4e 100644 --- a/app/javascript/themes/glitch/features/compose/components/search_results.js +++ b/app/javascript/flavours/glitch/features/compose/components/search_results.js @@ -1,8 +1,8 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { FormattedMessage } from 'react-intl'; -import AccountContainer from 'themes/glitch/containers/account_container'; -import StatusContainer from 'themes/glitch/containers/status_container'; +import AccountContainer from 'flavours/glitch/containers/account_container'; +import StatusContainer from 'flavours/glitch/containers/status_container'; import { Link } from 'react-router-dom'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/javascript/themes/glitch/features/compose/components/text_icon_button.js b/app/javascript/flavours/glitch/features/compose/components/text_icon_button.js similarity index 100% rename from app/javascript/themes/glitch/features/compose/components/text_icon_button.js rename to app/javascript/flavours/glitch/features/compose/components/text_icon_button.js diff --git a/app/javascript/themes/glitch/features/compose/components/upload.js b/app/javascript/flavours/glitch/features/compose/components/upload.js similarity index 96% rename from app/javascript/themes/glitch/features/compose/components/upload.js rename to app/javascript/flavours/glitch/features/compose/components/upload.js index ded376ada..a1fc93234 100644 --- a/app/javascript/themes/glitch/features/compose/components/upload.js +++ b/app/javascript/flavours/glitch/features/compose/components/upload.js @@ -1,8 +1,8 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import IconButton from 'themes/glitch/components/icon_button'; -import Motion from 'themes/glitch/util/optional_motion'; +import IconButton from 'flavours/glitch/components/icon_button'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { defineMessages, injectIntl } from 'react-intl'; diff --git a/app/javascript/themes/glitch/features/compose/components/upload_button.js b/app/javascript/flavours/glitch/features/compose/components/upload_button.js similarity index 97% rename from app/javascript/themes/glitch/features/compose/components/upload_button.js rename to app/javascript/flavours/glitch/features/compose/components/upload_button.js index d7742adfe..f06167a2a 100644 --- a/app/javascript/themes/glitch/features/compose/components/upload_button.js +++ b/app/javascript/flavours/glitch/features/compose/components/upload_button.js @@ -1,5 +1,5 @@ import React from 'react'; -import IconButton from 'themes/glitch/components/icon_button'; +import IconButton from 'flavours/glitch/components/icon_button'; import PropTypes from 'prop-types'; import { defineMessages, injectIntl } from 'react-intl'; import { connect } from 'react-redux'; diff --git a/app/javascript/themes/glitch/features/compose/components/upload_form.js b/app/javascript/flavours/glitch/features/compose/components/upload_form.js similarity index 100% rename from app/javascript/themes/glitch/features/compose/components/upload_form.js rename to app/javascript/flavours/glitch/features/compose/components/upload_form.js diff --git a/app/javascript/themes/glitch/features/compose/components/upload_progress.js b/app/javascript/flavours/glitch/features/compose/components/upload_progress.js similarity index 94% rename from app/javascript/themes/glitch/features/compose/components/upload_progress.js rename to app/javascript/flavours/glitch/features/compose/components/upload_progress.js index b923d0a22..2a3b8ceb4 100644 --- a/app/javascript/themes/glitch/features/compose/components/upload_progress.js +++ b/app/javascript/flavours/glitch/features/compose/components/upload_progress.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import Motion from 'themes/glitch/util/optional_motion'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; import { FormattedMessage } from 'react-intl'; diff --git a/app/javascript/themes/glitch/features/compose/components/warning.js b/app/javascript/flavours/glitch/features/compose/components/warning.js similarity index 93% rename from app/javascript/themes/glitch/features/compose/components/warning.js rename to app/javascript/flavours/glitch/features/compose/components/warning.js index 82df55a31..4962e76c8 100644 --- a/app/javascript/themes/glitch/features/compose/components/warning.js +++ b/app/javascript/flavours/glitch/features/compose/components/warning.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import Motion from 'themes/glitch/util/optional_motion'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; export default class Warning extends React.PureComponent { diff --git a/app/javascript/themes/glitch/features/compose/containers/advanced_options_container.js b/app/javascript/flavours/glitch/features/compose/containers/advanced_options_container.js similarity index 85% rename from app/javascript/themes/glitch/features/compose/containers/advanced_options_container.js rename to app/javascript/flavours/glitch/features/compose/containers/advanced_options_container.js index 9f168942a..da381568b 100644 --- a/app/javascript/themes/glitch/features/compose/containers/advanced_options_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/advanced_options_container.js @@ -2,7 +2,7 @@ import { connect } from 'react-redux'; // Our imports. -import { toggleComposeAdvancedOption } from 'themes/glitch/actions/compose'; +import { toggleComposeAdvancedOption } from 'flavours/glitch/actions/compose'; import ComposeAdvancedOptions from '../components/advanced_options'; const mapStateToProps = state => ({ diff --git a/app/javascript/themes/glitch/features/compose/containers/autosuggest_account_container.js b/app/javascript/flavours/glitch/features/compose/containers/autosuggest_account_container.js similarity index 86% rename from app/javascript/themes/glitch/features/compose/containers/autosuggest_account_container.js rename to app/javascript/flavours/glitch/features/compose/containers/autosuggest_account_container.js index 96eb70c18..0e1c328fe 100644 --- a/app/javascript/themes/glitch/features/compose/containers/autosuggest_account_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/autosuggest_account_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import AutosuggestAccount from '../components/autosuggest_account'; -import { makeGetAccount } from 'themes/glitch/selectors'; +import { makeGetAccount } from 'flavours/glitch/selectors'; const makeMapStateToProps = () => { const getAccount = makeGetAccount(); diff --git a/app/javascript/themes/glitch/features/compose/containers/compose_form_container.js b/app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js similarity index 93% rename from app/javascript/themes/glitch/features/compose/containers/compose_form_container.js rename to app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js index 7afa988f1..e2e93e44b 100644 --- a/app/javascript/themes/glitch/features/compose/containers/compose_form_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import ComposeForm from '../components/compose_form'; -import { changeComposeVisibility, uploadCompose } from 'themes/glitch/actions/compose'; +import { changeComposeVisibility, uploadCompose } from 'flavours/glitch/actions/compose'; import { changeCompose, submitCompose, @@ -9,7 +9,7 @@ import { selectComposeSuggestion, changeComposeSpoilerText, insertEmojiCompose, -} from 'themes/glitch/actions/compose'; +} from 'flavours/glitch/actions/compose'; const mapStateToProps = state => ({ text: state.getIn(['compose', 'text']), diff --git a/app/javascript/themes/glitch/features/compose/containers/emoji_picker_dropdown_container.js b/app/javascript/flavours/glitch/features/compose/containers/emoji_picker_dropdown_container.js similarity index 93% rename from app/javascript/themes/glitch/features/compose/containers/emoji_picker_dropdown_container.js rename to app/javascript/flavours/glitch/features/compose/containers/emoji_picker_dropdown_container.js index 55a13bd65..ba85edd87 100644 --- a/app/javascript/themes/glitch/features/compose/containers/emoji_picker_dropdown_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/emoji_picker_dropdown_container.js @@ -1,9 +1,9 @@ import { connect } from 'react-redux'; import EmojiPickerDropdown from '../components/emoji_picker_dropdown'; -import { changeSetting } from 'themes/glitch/actions/settings'; +import { changeSetting } from 'flavours/glitch/actions/settings'; import { createSelector } from 'reselect'; import { Map as ImmutableMap } from 'immutable'; -import { useEmoji } from 'themes/glitch/actions/emojis'; +import { useEmoji } from 'flavours/glitch/actions/emojis'; const perLine = 8; const lines = 2; diff --git a/app/javascript/themes/glitch/features/compose/containers/navigation_container.js b/app/javascript/flavours/glitch/features/compose/containers/navigation_container.js similarity index 81% rename from app/javascript/themes/glitch/features/compose/containers/navigation_container.js rename to app/javascript/flavours/glitch/features/compose/containers/navigation_container.js index b6d737b46..eb630ffbb 100644 --- a/app/javascript/themes/glitch/features/compose/containers/navigation_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/navigation_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import NavigationBar from '../components/navigation_bar'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; const mapStateToProps = state => { return { diff --git a/app/javascript/themes/glitch/features/compose/containers/privacy_dropdown_container.js b/app/javascript/flavours/glitch/features/compose/containers/privacy_dropdown_container.js similarity index 73% rename from app/javascript/themes/glitch/features/compose/containers/privacy_dropdown_container.js rename to app/javascript/flavours/glitch/features/compose/containers/privacy_dropdown_container.js index 9636ceab2..cb94fcc80 100644 --- a/app/javascript/themes/glitch/features/compose/containers/privacy_dropdown_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/privacy_dropdown_container.js @@ -1,8 +1,8 @@ import { connect } from 'react-redux'; import PrivacyDropdown from '../components/privacy_dropdown'; -import { changeComposeVisibility } from 'themes/glitch/actions/compose'; -import { openModal, closeModal } from 'themes/glitch/actions/modal'; -import { isUserTouching } from 'themes/glitch/util/is_mobile'; +import { changeComposeVisibility } from 'flavours/glitch/actions/compose'; +import { openModal, closeModal } from 'flavours/glitch/actions/modal'; +import { isUserTouching } from 'flavours/glitch/util/is_mobile'; const mapStateToProps = state => ({ isModalOpen: state.get('modal').modalType === 'ACTIONS', diff --git a/app/javascript/themes/glitch/features/compose/containers/reply_indicator_container.js b/app/javascript/flavours/glitch/features/compose/containers/reply_indicator_container.js similarity index 79% rename from app/javascript/themes/glitch/features/compose/containers/reply_indicator_container.js rename to app/javascript/flavours/glitch/features/compose/containers/reply_indicator_container.js index 6dcabb3cd..a7c82d135 100644 --- a/app/javascript/themes/glitch/features/compose/containers/reply_indicator_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/reply_indicator_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; -import { cancelReplyCompose } from 'themes/glitch/actions/compose'; -import { makeGetStatus } from 'themes/glitch/selectors'; +import { cancelReplyCompose } from 'flavours/glitch/actions/compose'; +import { makeGetStatus } from 'flavours/glitch/selectors'; import ReplyIndicator from '../components/reply_indicator'; const makeMapStateToProps = () => { diff --git a/app/javascript/themes/glitch/features/compose/containers/search_container.js b/app/javascript/flavours/glitch/features/compose/containers/search_container.js similarity index 93% rename from app/javascript/themes/glitch/features/compose/containers/search_container.js rename to app/javascript/flavours/glitch/features/compose/containers/search_container.js index a450d27e7..8f4bfcf08 100644 --- a/app/javascript/themes/glitch/features/compose/containers/search_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/search_container.js @@ -4,7 +4,7 @@ import { clearSearch, submitSearch, showSearch, -} from 'themes/glitch/actions/search'; +} from 'flavours/glitch/actions/search'; import Search from '../components/search'; const mapStateToProps = state => ({ diff --git a/app/javascript/themes/glitch/features/compose/containers/search_results_container.js b/app/javascript/flavours/glitch/features/compose/containers/search_results_container.js similarity index 100% rename from app/javascript/themes/glitch/features/compose/containers/search_results_container.js rename to app/javascript/flavours/glitch/features/compose/containers/search_results_container.js diff --git a/app/javascript/themes/glitch/features/compose/containers/sensitive_button_container.js b/app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.js similarity index 91% rename from app/javascript/themes/glitch/features/compose/containers/sensitive_button_container.js rename to app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.js index a710dd104..cf6706c0e 100644 --- a/app/javascript/themes/glitch/features/compose/containers/sensitive_button_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.js @@ -2,9 +2,9 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import classNames from 'classnames'; -import IconButton from 'themes/glitch/components/icon_button'; -import { changeComposeSensitivity } from 'themes/glitch/actions/compose'; -import Motion from 'themes/glitch/util/optional_motion'; +import IconButton from 'flavours/glitch/components/icon_button'; +import { changeComposeSensitivity } from 'flavours/glitch/actions/compose'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; import { injectIntl, defineMessages } from 'react-intl'; diff --git a/app/javascript/themes/glitch/features/compose/containers/spoiler_button_container.js b/app/javascript/flavours/glitch/features/compose/containers/spoiler_button_container.js similarity index 89% rename from app/javascript/themes/glitch/features/compose/containers/spoiler_button_container.js rename to app/javascript/flavours/glitch/features/compose/containers/spoiler_button_container.js index 160e71ba9..d7b4246bc 100644 --- a/app/javascript/themes/glitch/features/compose/containers/spoiler_button_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/spoiler_button_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import TextIconButton from '../components/text_icon_button'; -import { changeComposeSpoilerness } from 'themes/glitch/actions/compose'; +import { changeComposeSpoilerness } from 'flavours/glitch/actions/compose'; import { injectIntl, defineMessages } from 'react-intl'; const messages = defineMessages({ diff --git a/app/javascript/themes/glitch/features/compose/containers/upload_button_container.js b/app/javascript/flavours/glitch/features/compose/containers/upload_button_container.js similarity index 90% rename from app/javascript/themes/glitch/features/compose/containers/upload_button_container.js rename to app/javascript/flavours/glitch/features/compose/containers/upload_button_container.js index f332eae1a..4c1cb49e9 100644 --- a/app/javascript/themes/glitch/features/compose/containers/upload_button_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/upload_button_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import UploadButton from '../components/upload_button'; -import { uploadCompose } from 'themes/glitch/actions/compose'; +import { uploadCompose } from 'flavours/glitch/actions/compose'; const mapStateToProps = state => ({ disabled: state.getIn(['compose', 'is_uploading']) || (state.getIn(['compose', 'media_attachments']).size > 3 || state.getIn(['compose', 'media_attachments']).some(m => m.get('type') === 'video')), diff --git a/app/javascript/themes/glitch/features/compose/containers/upload_container.js b/app/javascript/flavours/glitch/features/compose/containers/upload_container.js similarity index 84% rename from app/javascript/themes/glitch/features/compose/containers/upload_container.js rename to app/javascript/flavours/glitch/features/compose/containers/upload_container.js index eea514bf5..368038425 100644 --- a/app/javascript/themes/glitch/features/compose/containers/upload_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/upload_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import Upload from '../components/upload'; -import { undoUploadCompose, changeUploadCompose } from 'themes/glitch/actions/compose'; +import { undoUploadCompose, changeUploadCompose } from 'flavours/glitch/actions/compose'; const mapStateToProps = (state, { id }) => ({ media: state.getIn(['compose', 'media_attachments']).find(item => item.get('id') === id), diff --git a/app/javascript/themes/glitch/features/compose/containers/upload_form_container.js b/app/javascript/flavours/glitch/features/compose/containers/upload_form_container.js similarity index 100% rename from app/javascript/themes/glitch/features/compose/containers/upload_form_container.js rename to app/javascript/flavours/glitch/features/compose/containers/upload_form_container.js diff --git a/app/javascript/themes/glitch/features/compose/containers/upload_progress_container.js b/app/javascript/flavours/glitch/features/compose/containers/upload_progress_container.js similarity index 100% rename from app/javascript/themes/glitch/features/compose/containers/upload_progress_container.js rename to app/javascript/flavours/glitch/features/compose/containers/upload_progress_container.js diff --git a/app/javascript/themes/glitch/features/compose/containers/warning_container.js b/app/javascript/flavours/glitch/features/compose/containers/warning_container.js similarity index 94% rename from app/javascript/themes/glitch/features/compose/containers/warning_container.js rename to app/javascript/flavours/glitch/features/compose/containers/warning_container.js index 225d6a1dd..f20c75b91 100644 --- a/app/javascript/themes/glitch/features/compose/containers/warning_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/warning_container.js @@ -3,7 +3,7 @@ import { connect } from 'react-redux'; import Warning from '../components/warning'; import PropTypes from 'prop-types'; import { FormattedMessage } from 'react-intl'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; const mapStateToProps = state => ({ needsLockWarning: state.getIn(['compose', 'privacy']) === 'private' && !state.getIn(['accounts', me, 'locked']), diff --git a/app/javascript/themes/glitch/features/compose/index.js b/app/javascript/flavours/glitch/features/compose/index.js similarity index 93% rename from app/javascript/themes/glitch/features/compose/index.js rename to app/javascript/flavours/glitch/features/compose/index.js index 3fcaf416f..02b97ad00 100644 --- a/app/javascript/themes/glitch/features/compose/index.js +++ b/app/javascript/flavours/glitch/features/compose/index.js @@ -4,16 +4,16 @@ import NavigationContainer from './containers/navigation_container'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; -import { mountCompose, unmountCompose } from 'themes/glitch/actions/compose'; -import { openModal } from 'themes/glitch/actions/modal'; -import { changeLocalSetting } from 'themes/glitch/actions/local_settings'; +import { mountCompose, unmountCompose } from 'flavours/glitch/actions/compose'; +import { openModal } from 'flavours/glitch/actions/modal'; +import { changeLocalSetting } from 'flavours/glitch/actions/local_settings'; import { Link } from 'react-router-dom'; import { injectIntl, defineMessages } from 'react-intl'; import SearchContainer from './containers/search_container'; -import Motion from 'themes/glitch/util/optional_motion'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; import SearchResultsContainer from './containers/search_results_container'; -import { changeComposing } from 'themes/glitch/actions/compose'; +import { changeComposing } from 'flavours/glitch/actions/compose'; const messages = defineMessages({ start: { id: 'getting_started.heading', defaultMessage: 'Getting started' }, diff --git a/app/javascript/themes/glitch/features/direct_timeline/containers/column_settings_container.js b/app/javascript/flavours/glitch/features/direct_timeline/containers/column_settings_container.js similarity index 67% rename from app/javascript/themes/glitch/features/direct_timeline/containers/column_settings_container.js rename to app/javascript/flavours/glitch/features/direct_timeline/containers/column_settings_container.js index 2a40c65a5..d3e4b4216 100644 --- a/app/javascript/themes/glitch/features/direct_timeline/containers/column_settings_container.js +++ b/app/javascript/flavours/glitch/features/direct_timeline/containers/column_settings_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; -import ColumnSettings from 'themes/glitch/features/community_timeline/components/column_settings'; -import { changeSetting } from 'themes/glitch/actions/settings'; +import ColumnSettings from 'flavours/glitch/features/community_timeline/components/column_settings'; +import { changeSetting } from 'flavours/glitch/actions/settings'; const mapStateToProps = state => ({ settings: state.getIn(['settings', 'direct']), diff --git a/app/javascript/themes/glitch/features/direct_timeline/index.js b/app/javascript/flavours/glitch/features/direct_timeline/index.js similarity index 85% rename from app/javascript/themes/glitch/features/direct_timeline/index.js rename to app/javascript/flavours/glitch/features/direct_timeline/index.js index 6b29cf94d..81096c0ec 100644 --- a/app/javascript/themes/glitch/features/direct_timeline/index.js +++ b/app/javascript/flavours/glitch/features/direct_timeline/index.js @@ -1,17 +1,17 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; -import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container'; -import Column from 'themes/glitch/components/column'; -import ColumnHeader from 'themes/glitch/components/column_header'; +import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container'; +import Column from 'flavours/glitch/components/column'; +import ColumnHeader from 'flavours/glitch/components/column_header'; import { refreshDirectTimeline, expandDirectTimeline, -} from 'themes/glitch/actions/timelines'; -import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns'; +} from 'flavours/glitch/actions/timelines'; +import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import ColumnSettingsContainer from './containers/column_settings_container'; -import { connectDirectStream } from 'themes/glitch/actions/streaming'; +import { connectDirectStream } from 'flavours/glitch/actions/streaming'; const messages = defineMessages({ title: { id: 'column.direct', defaultMessage: 'Direct messages' }, diff --git a/app/javascript/themes/glitch/features/favourited_statuses/index.js b/app/javascript/flavours/glitch/features/favourited_statuses/index.js similarity index 87% rename from app/javascript/themes/glitch/features/favourited_statuses/index.js rename to app/javascript/flavours/glitch/features/favourited_statuses/index.js index 80345e0e2..e20dda718 100644 --- a/app/javascript/themes/glitch/features/favourited_statuses/index.js +++ b/app/javascript/flavours/glitch/features/favourited_statuses/index.js @@ -2,11 +2,11 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { fetchFavouritedStatuses, expandFavouritedStatuses } from 'themes/glitch/actions/favourites'; -import Column from 'themes/glitch/features/ui/components/column'; -import ColumnHeader from 'themes/glitch/components/column_header'; -import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns'; -import StatusList from 'themes/glitch/components/status_list'; +import { fetchFavouritedStatuses, expandFavouritedStatuses } from 'flavours/glitch/actions/favourites'; +import Column from 'flavours/glitch/features/ui/components/column'; +import ColumnHeader from 'flavours/glitch/components/column_header'; +import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns'; +import StatusList from 'flavours/glitch/components/status_list'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/javascript/themes/glitch/features/favourites/index.js b/app/javascript/flavours/glitch/features/favourites/index.js similarity index 79% rename from app/javascript/themes/glitch/features/favourites/index.js rename to app/javascript/flavours/glitch/features/favourites/index.js index d7b8ac3b1..055a15ccb 100644 --- a/app/javascript/themes/glitch/features/favourites/index.js +++ b/app/javascript/flavours/glitch/features/favourites/index.js @@ -2,12 +2,12 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import LoadingIndicator from 'themes/glitch/components/loading_indicator'; -import { fetchFavourites } from 'themes/glitch/actions/interactions'; +import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { fetchFavourites } from 'flavours/glitch/actions/interactions'; import { ScrollContainer } from 'react-router-scroll-4'; -import AccountContainer from 'themes/glitch/containers/account_container'; -import Column from 'themes/glitch/features/ui/components/column'; -import ColumnBackButton from 'themes/glitch/components/column_back_button'; +import AccountContainer from 'flavours/glitch/containers/account_container'; +import Column from 'flavours/glitch/features/ui/components/column'; +import ColumnBackButton from 'flavours/glitch/components/column_back_button'; import ImmutablePureComponent from 'react-immutable-pure-component'; const mapStateToProps = (state, props) => ({ diff --git a/app/javascript/themes/glitch/features/follow_requests/components/account_authorize.js b/app/javascript/flavours/glitch/features/follow_requests/components/account_authorize.js similarity index 87% rename from app/javascript/themes/glitch/features/follow_requests/components/account_authorize.js rename to app/javascript/flavours/glitch/features/follow_requests/components/account_authorize.js index ce386d888..dead0753f 100644 --- a/app/javascript/themes/glitch/features/follow_requests/components/account_authorize.js +++ b/app/javascript/flavours/glitch/features/follow_requests/components/account_authorize.js @@ -1,10 +1,10 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import Permalink from 'themes/glitch/components/permalink'; -import Avatar from 'themes/glitch/components/avatar'; -import DisplayName from 'themes/glitch/components/display_name'; -import IconButton from 'themes/glitch/components/icon_button'; +import Permalink from 'flavours/glitch/components/permalink'; +import Avatar from 'flavours/glitch/components/avatar'; +import DisplayName from 'flavours/glitch/components/display_name'; +import IconButton from 'flavours/glitch/components/icon_button'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/javascript/themes/glitch/features/follow_requests/containers/account_authorize_container.js b/app/javascript/flavours/glitch/features/follow_requests/containers/account_authorize_container.js similarity index 78% rename from app/javascript/themes/glitch/features/follow_requests/containers/account_authorize_container.js rename to app/javascript/flavours/glitch/features/follow_requests/containers/account_authorize_container.js index 78ae77eee..693e98e8c 100644 --- a/app/javascript/themes/glitch/features/follow_requests/containers/account_authorize_container.js +++ b/app/javascript/flavours/glitch/features/follow_requests/containers/account_authorize_container.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux'; -import { makeGetAccount } from 'themes/glitch/selectors'; +import { makeGetAccount } from 'flavours/glitch/selectors'; import AccountAuthorize from '../components/account_authorize'; -import { authorizeFollowRequest, rejectFollowRequest } from 'themes/glitch/actions/accounts'; +import { authorizeFollowRequest, rejectFollowRequest } from 'flavours/glitch/actions/accounts'; const makeMapStateToProps = () => { const getAccount = makeGetAccount(); diff --git a/app/javascript/themes/glitch/features/follow_requests/index.js b/app/javascript/flavours/glitch/features/follow_requests/index.js similarity index 85% rename from app/javascript/themes/glitch/features/follow_requests/index.js rename to app/javascript/flavours/glitch/features/follow_requests/index.js index 3f44f518a..04ff3f111 100644 --- a/app/javascript/themes/glitch/features/follow_requests/index.js +++ b/app/javascript/flavours/glitch/features/follow_requests/index.js @@ -2,12 +2,12 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import LoadingIndicator from 'themes/glitch/components/loading_indicator'; +import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; import { ScrollContainer } from 'react-router-scroll-4'; -import Column from 'themes/glitch/features/ui/components/column'; -import ColumnBackButtonSlim from 'themes/glitch/components/column_back_button_slim'; +import Column from 'flavours/glitch/features/ui/components/column'; +import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim'; import AccountAuthorizeContainer from './containers/account_authorize_container'; -import { fetchFollowRequests, expandFollowRequests } from 'themes/glitch/actions/accounts'; +import { fetchFollowRequests, expandFollowRequests } from 'flavours/glitch/actions/accounts'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/javascript/themes/glitch/features/followers/index.js b/app/javascript/flavours/glitch/features/followers/index.js similarity index 83% rename from app/javascript/themes/glitch/features/followers/index.js rename to app/javascript/flavours/glitch/features/followers/index.js index d586bf41d..f0ef29ff6 100644 --- a/app/javascript/themes/glitch/features/followers/index.js +++ b/app/javascript/flavours/glitch/features/followers/index.js @@ -2,18 +2,18 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import LoadingIndicator from 'themes/glitch/components/loading_indicator'; +import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; import { fetchAccount, fetchFollowers, expandFollowers, -} from 'themes/glitch/actions/accounts'; +} from 'flavours/glitch/actions/accounts'; import { ScrollContainer } from 'react-router-scroll-4'; -import AccountContainer from 'themes/glitch/containers/account_container'; -import Column from 'themes/glitch/features/ui/components/column'; -import HeaderContainer from 'themes/glitch/features/account_timeline/containers/header_container'; -import LoadMore from 'themes/glitch/components/load_more'; -import ColumnBackButton from 'themes/glitch/components/column_back_button'; +import AccountContainer from 'flavours/glitch/containers/account_container'; +import Column from 'flavours/glitch/features/ui/components/column'; +import HeaderContainer from 'flavours/glitch/features/account_timeline/containers/header_container'; +import LoadMore from 'flavours/glitch/components/load_more'; +import ColumnBackButton from 'flavours/glitch/components/column_back_button'; import ImmutablePureComponent from 'react-immutable-pure-component'; const mapStateToProps = (state, props) => ({ diff --git a/app/javascript/themes/glitch/features/following/index.js b/app/javascript/flavours/glitch/features/following/index.js similarity index 83% rename from app/javascript/themes/glitch/features/following/index.js rename to app/javascript/flavours/glitch/features/following/index.js index c306faf21..f30f7b0d9 100644 --- a/app/javascript/themes/glitch/features/following/index.js +++ b/app/javascript/flavours/glitch/features/following/index.js @@ -2,18 +2,18 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import LoadingIndicator from 'themes/glitch/components/loading_indicator'; +import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; import { fetchAccount, fetchFollowing, expandFollowing, -} from 'themes/glitch/actions/accounts'; +} from 'flavours/glitch/actions/accounts'; import { ScrollContainer } from 'react-router-scroll-4'; -import AccountContainer from 'themes/glitch/containers/account_container'; -import Column from 'themes/glitch/features/ui/components/column'; -import HeaderContainer from 'themes/glitch/features/account_timeline/containers/header_container'; -import LoadMore from 'themes/glitch/components/load_more'; -import ColumnBackButton from 'themes/glitch/components/column_back_button'; +import AccountContainer from 'flavours/glitch/containers/account_container'; +import Column from 'flavours/glitch/features/ui/components/column'; +import HeaderContainer from 'flavours/glitch/features/account_timeline/containers/header_container'; +import LoadMore from 'flavours/glitch/components/load_more'; +import ColumnBackButton from 'flavours/glitch/components/column_back_button'; import ImmutablePureComponent from 'react-immutable-pure-component'; const mapStateToProps = (state, props) => ({ diff --git a/app/javascript/flavours/glitch/features/generic_not_found/index.js b/app/javascript/flavours/glitch/features/generic_not_found/index.js new file mode 100644 index 000000000..d01a1ba47 --- /dev/null +++ b/app/javascript/flavours/glitch/features/generic_not_found/index.js @@ -0,0 +1,11 @@ +import React from 'react'; +import Column from 'flavours/glitch/features/ui/components/column'; +import MissingIndicator from 'flavours/glitch/components/missing_indicator'; + +const GenericNotFound = () => ( + + + +); + +export default GenericNotFound; diff --git a/app/javascript/themes/glitch/features/getting_started/index.js b/app/javascript/flavours/glitch/features/getting_started/index.js similarity index 95% rename from app/javascript/themes/glitch/features/getting_started/index.js rename to app/javascript/flavours/glitch/features/getting_started/index.js index 74b019cf1..2af0fcf48 100644 --- a/app/javascript/themes/glitch/features/getting_started/index.js +++ b/app/javascript/flavours/glitch/features/getting_started/index.js @@ -1,14 +1,14 @@ import React from 'react'; -import Column from 'themes/glitch/features/ui/components/column'; -import ColumnLink from 'themes/glitch/features/ui/components/column_link'; -import ColumnSubheading from 'themes/glitch/features/ui/components/column_subheading'; +import Column from 'flavours/glitch/features/ui/components/column'; +import ColumnLink from 'flavours/glitch/features/ui/components/column_link'; +import ColumnSubheading from 'flavours/glitch/features/ui/components/column_subheading'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { connect } from 'react-redux'; -import { openModal } from 'themes/glitch/actions/modal'; +import { openModal } from 'flavours/glitch/actions/modal'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; const messages = defineMessages({ heading: { id: 'getting_started.heading', defaultMessage: 'Getting started' }, diff --git a/app/javascript/themes/glitch/features/hashtag_timeline/index.js b/app/javascript/flavours/glitch/features/hashtag_timeline/index.js similarity index 86% rename from app/javascript/themes/glitch/features/hashtag_timeline/index.js rename to app/javascript/flavours/glitch/features/hashtag_timeline/index.js index a878931b3..9f3c9bec7 100644 --- a/app/javascript/themes/glitch/features/hashtag_timeline/index.js +++ b/app/javascript/flavours/glitch/features/hashtag_timeline/index.js @@ -1,16 +1,16 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; -import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container'; -import Column from 'themes/glitch/components/column'; -import ColumnHeader from 'themes/glitch/components/column_header'; +import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container'; +import Column from 'flavours/glitch/components/column'; +import ColumnHeader from 'flavours/glitch/components/column_header'; import { refreshHashtagTimeline, expandHashtagTimeline, -} from 'themes/glitch/actions/timelines'; -import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns'; +} from 'flavours/glitch/actions/timelines'; +import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns'; import { FormattedMessage } from 'react-intl'; -import { connectHashtagStream } from 'themes/glitch/actions/streaming'; +import { connectHashtagStream } from 'flavours/glitch/actions/streaming'; const mapStateToProps = (state, props) => ({ hasUnread: state.getIn(['timelines', `hashtag:${props.params.id}`, 'unread']) > 0, diff --git a/app/javascript/themes/glitch/features/home_timeline/components/column_settings.js b/app/javascript/flavours/glitch/features/home_timeline/components/column_settings.js similarity index 92% rename from app/javascript/themes/glitch/features/home_timeline/components/column_settings.js rename to app/javascript/flavours/glitch/features/home_timeline/components/column_settings.js index 533da6c36..604a7c6dc 100644 --- a/app/javascript/themes/glitch/features/home_timeline/components/column_settings.js +++ b/app/javascript/flavours/glitch/features/home_timeline/components/column_settings.js @@ -2,8 +2,8 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import SettingToggle from 'themes/glitch/features/notifications/components/setting_toggle'; -import SettingText from 'themes/glitch/components/setting_text'; +import SettingToggle from 'flavours/glitch/features/notifications/components/setting_toggle'; +import SettingText from 'flavours/glitch/components/setting_text'; const messages = defineMessages({ filter_regex: { id: 'home.column_settings.filter_regex', defaultMessage: 'Filter out by regular expressions' }, diff --git a/app/javascript/themes/glitch/features/home_timeline/containers/column_settings_container.js b/app/javascript/flavours/glitch/features/home_timeline/containers/column_settings_container.js similarity index 84% rename from app/javascript/themes/glitch/features/home_timeline/containers/column_settings_container.js rename to app/javascript/flavours/glitch/features/home_timeline/containers/column_settings_container.js index a0062f564..19a8e792f 100644 --- a/app/javascript/themes/glitch/features/home_timeline/containers/column_settings_container.js +++ b/app/javascript/flavours/glitch/features/home_timeline/containers/column_settings_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import ColumnSettings from '../components/column_settings'; -import { changeSetting, saveSettings } from 'themes/glitch/actions/settings'; +import { changeSetting, saveSettings } from 'flavours/glitch/actions/settings'; const mapStateToProps = state => ({ settings: state.getIn(['settings', 'home']), diff --git a/app/javascript/themes/glitch/features/home_timeline/index.js b/app/javascript/flavours/glitch/features/home_timeline/index.js similarity index 86% rename from app/javascript/themes/glitch/features/home_timeline/index.js rename to app/javascript/flavours/glitch/features/home_timeline/index.js index 8a65891cd..2dfec6bbe 100644 --- a/app/javascript/themes/glitch/features/home_timeline/index.js +++ b/app/javascript/flavours/glitch/features/home_timeline/index.js @@ -1,11 +1,11 @@ import React from 'react'; import { connect } from 'react-redux'; -import { expandHomeTimeline } from 'themes/glitch/actions/timelines'; +import { expandHomeTimeline } from 'flavours/glitch/actions/timelines'; import PropTypes from 'prop-types'; -import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container'; -import Column from 'themes/glitch/components/column'; -import ColumnHeader from 'themes/glitch/components/column_header'; -import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns'; +import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container'; +import Column from 'flavours/glitch/components/column'; +import ColumnHeader from 'flavours/glitch/components/column_header'; +import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import ColumnSettingsContainer from './containers/column_settings_container'; import { Link } from 'react-router-dom'; diff --git a/app/javascript/themes/glitch/features/local_settings/index.js b/app/javascript/flavours/glitch/features/local_settings/index.js similarity index 91% rename from app/javascript/themes/glitch/features/local_settings/index.js rename to app/javascript/flavours/glitch/features/local_settings/index.js index 6c5d51413..81d9a3f41 100644 --- a/app/javascript/themes/glitch/features/local_settings/index.js +++ b/app/javascript/flavours/glitch/features/local_settings/index.js @@ -7,8 +7,8 @@ import { connect } from 'react-redux'; // Our imports import LocalSettingsPage from './page'; import LocalSettingsNavigation from './navigation'; -import { closeModal } from 'themes/glitch/actions/modal'; -import { changeLocalSetting } from 'themes/glitch/actions/local_settings'; +import { closeModal } from 'flavours/glitch/actions/modal'; +import { changeLocalSetting } from 'flavours/glitch/actions/local_settings'; // Stylesheet imports import './style.scss'; diff --git a/app/javascript/themes/glitch/features/local_settings/navigation/index.js b/app/javascript/flavours/glitch/features/local_settings/navigation/index.js similarity index 100% rename from app/javascript/themes/glitch/features/local_settings/navigation/index.js rename to app/javascript/flavours/glitch/features/local_settings/navigation/index.js diff --git a/app/javascript/themes/glitch/features/local_settings/navigation/item/index.js b/app/javascript/flavours/glitch/features/local_settings/navigation/item/index.js similarity index 100% rename from app/javascript/themes/glitch/features/local_settings/navigation/item/index.js rename to app/javascript/flavours/glitch/features/local_settings/navigation/item/index.js diff --git a/app/javascript/themes/glitch/features/local_settings/navigation/item/style.scss b/app/javascript/flavours/glitch/features/local_settings/navigation/item/style.scss similarity index 100% rename from app/javascript/themes/glitch/features/local_settings/navigation/item/style.scss rename to app/javascript/flavours/glitch/features/local_settings/navigation/item/style.scss diff --git a/app/javascript/themes/glitch/features/local_settings/navigation/style.scss b/app/javascript/flavours/glitch/features/local_settings/navigation/style.scss similarity index 100% rename from app/javascript/themes/glitch/features/local_settings/navigation/style.scss rename to app/javascript/flavours/glitch/features/local_settings/navigation/style.scss diff --git a/app/javascript/themes/glitch/features/local_settings/page/index.js b/app/javascript/flavours/glitch/features/local_settings/page/index.js similarity index 100% rename from app/javascript/themes/glitch/features/local_settings/page/index.js rename to app/javascript/flavours/glitch/features/local_settings/page/index.js diff --git a/app/javascript/themes/glitch/features/local_settings/page/item/index.js b/app/javascript/flavours/glitch/features/local_settings/page/item/index.js similarity index 100% rename from app/javascript/themes/glitch/features/local_settings/page/item/index.js rename to app/javascript/flavours/glitch/features/local_settings/page/item/index.js diff --git a/app/javascript/themes/glitch/features/local_settings/page/item/style.scss b/app/javascript/flavours/glitch/features/local_settings/page/item/style.scss similarity index 100% rename from app/javascript/themes/glitch/features/local_settings/page/item/style.scss rename to app/javascript/flavours/glitch/features/local_settings/page/item/style.scss diff --git a/app/javascript/themes/glitch/features/local_settings/page/style.scss b/app/javascript/flavours/glitch/features/local_settings/page/style.scss similarity index 100% rename from app/javascript/themes/glitch/features/local_settings/page/style.scss rename to app/javascript/flavours/glitch/features/local_settings/page/style.scss diff --git a/app/javascript/themes/glitch/features/local_settings/style.scss b/app/javascript/flavours/glitch/features/local_settings/style.scss similarity index 100% rename from app/javascript/themes/glitch/features/local_settings/style.scss rename to app/javascript/flavours/glitch/features/local_settings/style.scss diff --git a/app/javascript/themes/glitch/features/mutes/index.js b/app/javascript/flavours/glitch/features/mutes/index.js similarity index 81% rename from app/javascript/themes/glitch/features/mutes/index.js rename to app/javascript/flavours/glitch/features/mutes/index.js index 1158b8262..87517eec9 100644 --- a/app/javascript/themes/glitch/features/mutes/index.js +++ b/app/javascript/flavours/glitch/features/mutes/index.js @@ -2,12 +2,12 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import LoadingIndicator from 'themes/glitch/components/loading_indicator'; +import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; import { ScrollContainer } from 'react-router-scroll-4'; -import Column from 'themes/glitch/features/ui/components/column'; -import ColumnBackButtonSlim from 'themes/glitch/components/column_back_button_slim'; -import AccountContainer from 'themes/glitch/containers/account_container'; -import { fetchMutes, expandMutes } from 'themes/glitch/actions/mutes'; +import Column from 'flavours/glitch/features/ui/components/column'; +import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim'; +import AccountContainer from 'flavours/glitch/containers/account_container'; +import { fetchMutes, expandMutes } from 'flavours/glitch/actions/mutes'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/javascript/themes/glitch/features/notifications/components/clear_column_button.js b/app/javascript/flavours/glitch/features/notifications/components/clear_column_button.js similarity index 100% rename from app/javascript/themes/glitch/features/notifications/components/clear_column_button.js rename to app/javascript/flavours/glitch/features/notifications/components/clear_column_button.js diff --git a/app/javascript/themes/glitch/features/notifications/components/column_settings.js b/app/javascript/flavours/glitch/features/notifications/components/column_settings.js similarity index 100% rename from app/javascript/themes/glitch/features/notifications/components/column_settings.js rename to app/javascript/flavours/glitch/features/notifications/components/column_settings.js diff --git a/app/javascript/themes/glitch/features/notifications/components/follow.js b/app/javascript/flavours/glitch/features/notifications/components/follow.js similarity index 95% rename from app/javascript/themes/glitch/features/notifications/components/follow.js rename to app/javascript/flavours/glitch/features/notifications/components/follow.js index 8a0f01736..4b682733e 100644 --- a/app/javascript/themes/glitch/features/notifications/components/follow.js +++ b/app/javascript/flavours/glitch/features/notifications/components/follow.js @@ -7,8 +7,8 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import { HotKeys } from 'react-hotkeys'; // Our imports. -import Permalink from 'themes/glitch/components/permalink'; -import AccountContainer from 'themes/glitch/containers/account_container'; +import Permalink from 'flavours/glitch/components/permalink'; +import AccountContainer from 'flavours/glitch/containers/account_container'; import NotificationOverlayContainer from '../containers/overlay_container'; export default class NotificationFollow extends ImmutablePureComponent { diff --git a/app/javascript/themes/glitch/features/notifications/components/notification.js b/app/javascript/flavours/glitch/features/notifications/components/notification.js similarity index 96% rename from app/javascript/themes/glitch/features/notifications/components/notification.js rename to app/javascript/flavours/glitch/features/notifications/components/notification.js index a309d3a42..185da8395 100644 --- a/app/javascript/themes/glitch/features/notifications/components/notification.js +++ b/app/javascript/flavours/glitch/features/notifications/components/notification.js @@ -5,7 +5,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; // Our imports, -import StatusContainer from 'themes/glitch/containers/status_container'; +import StatusContainer from 'flavours/glitch/containers/status_container'; import NotificationFollow from './follow'; export default class Notification extends ImmutablePureComponent { diff --git a/app/javascript/themes/glitch/features/notifications/components/overlay.js b/app/javascript/flavours/glitch/features/notifications/components/overlay.js similarity index 100% rename from app/javascript/themes/glitch/features/notifications/components/overlay.js rename to app/javascript/flavours/glitch/features/notifications/components/overlay.js diff --git a/app/javascript/themes/glitch/features/notifications/components/setting_toggle.js b/app/javascript/flavours/glitch/features/notifications/components/setting_toggle.js similarity index 100% rename from app/javascript/themes/glitch/features/notifications/components/setting_toggle.js rename to app/javascript/flavours/glitch/features/notifications/components/setting_toggle.js diff --git a/app/javascript/themes/glitch/features/notifications/containers/column_settings_container.js b/app/javascript/flavours/glitch/features/notifications/containers/column_settings_container.js similarity index 81% rename from app/javascript/themes/glitch/features/notifications/containers/column_settings_container.js rename to app/javascript/flavours/glitch/features/notifications/containers/column_settings_container.js index ddc8495f4..ce502700c 100644 --- a/app/javascript/themes/glitch/features/notifications/containers/column_settings_container.js +++ b/app/javascript/flavours/glitch/features/notifications/containers/column_settings_container.js @@ -1,10 +1,10 @@ import { connect } from 'react-redux'; import { defineMessages, injectIntl } from 'react-intl'; import ColumnSettings from '../components/column_settings'; -import { changeSetting, saveSettings } from 'themes/glitch/actions/settings'; -import { clearNotifications } from 'themes/glitch/actions/notifications'; -import { changeAlerts as changePushNotifications, saveSettings as savePushNotificationSettings } from 'themes/glitch/actions/push_notifications'; -import { openModal } from 'themes/glitch/actions/modal'; +import { changeSetting, saveSettings } from 'flavours/glitch/actions/settings'; +import { clearNotifications } from 'flavours/glitch/actions/notifications'; +import { changeAlerts as changePushNotifications, saveSettings as savePushNotificationSettings } from 'flavours/glitch/actions/push_notifications'; +import { openModal } from 'flavours/glitch/actions/modal'; const messages = defineMessages({ clearMessage: { id: 'notifications.clear_confirmation', defaultMessage: 'Are you sure you want to permanently clear all your notifications?' }, diff --git a/app/javascript/themes/glitch/features/notifications/containers/notification_container.js b/app/javascript/flavours/glitch/features/notifications/containers/notification_container.js similarity index 84% rename from app/javascript/themes/glitch/features/notifications/containers/notification_container.js rename to app/javascript/flavours/glitch/features/notifications/containers/notification_container.js index b61aaa21c..c60e72e1c 100644 --- a/app/javascript/themes/glitch/features/notifications/containers/notification_container.js +++ b/app/javascript/flavours/glitch/features/notifications/containers/notification_container.js @@ -2,9 +2,9 @@ import { connect } from 'react-redux'; // Our imports. -import { makeGetNotification } from 'themes/glitch/selectors'; +import { makeGetNotification } from 'flavours/glitch/selectors'; import Notification from '../components/notification'; -import { mentionCompose } from 'themes/glitch/actions/compose'; +import { mentionCompose } from 'flavours/glitch/actions/compose'; const makeMapStateToProps = () => { const getNotification = makeGetNotification(); diff --git a/app/javascript/themes/glitch/features/notifications/containers/overlay_container.js b/app/javascript/flavours/glitch/features/notifications/containers/overlay_container.js similarity index 84% rename from app/javascript/themes/glitch/features/notifications/containers/overlay_container.js rename to app/javascript/flavours/glitch/features/notifications/containers/overlay_container.js index 52649cdd7..ee2d19814 100644 --- a/app/javascript/themes/glitch/features/notifications/containers/overlay_container.js +++ b/app/javascript/flavours/glitch/features/notifications/containers/overlay_container.js @@ -3,7 +3,7 @@ import { connect } from 'react-redux'; // Our imports. import NotificationOverlay from '../components/overlay'; -import { markNotificationForDelete } from 'themes/glitch/actions/notifications'; +import { markNotificationForDelete } from 'flavours/glitch/actions/notifications'; const mapDispatchToProps = dispatch => ({ onMarkForDelete(id, yes) { diff --git a/app/javascript/themes/glitch/features/notifications/index.js b/app/javascript/flavours/glitch/features/notifications/index.js similarity index 94% rename from app/javascript/themes/glitch/features/notifications/index.js rename to app/javascript/flavours/glitch/features/notifications/index.js index 1ecde660a..12b0b5b83 100644 --- a/app/javascript/themes/glitch/features/notifications/index.js +++ b/app/javascript/flavours/glitch/features/notifications/index.js @@ -2,21 +2,21 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import Column from 'themes/glitch/components/column'; -import ColumnHeader from 'themes/glitch/components/column_header'; +import Column from 'flavours/glitch/components/column'; +import ColumnHeader from 'flavours/glitch/components/column_header'; import { enterNotificationClearingMode, expandNotifications, scrollTopNotifications, -} from 'themes/glitch/actions/notifications'; -import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns'; +} from 'flavours/glitch/actions/notifications'; +import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns'; import NotificationContainer from './containers/notification_container'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import ColumnSettingsContainer from './containers/column_settings_container'; import { createSelector } from 'reselect'; import { List as ImmutableList } from 'immutable'; import { debounce } from 'lodash'; -import ScrollableList from 'themes/glitch/components/scrollable_list'; +import ScrollableList from 'flavours/glitch/components/scrollable_list'; const messages = defineMessages({ title: { id: 'column.notifications', defaultMessage: 'Notifications' }, diff --git a/app/javascript/themes/glitch/features/pinned_statuses/index.js b/app/javascript/flavours/glitch/features/pinned_statuses/index.js similarity index 82% rename from app/javascript/themes/glitch/features/pinned_statuses/index.js rename to app/javascript/flavours/glitch/features/pinned_statuses/index.js index 0a3997850..f56d70176 100644 --- a/app/javascript/themes/glitch/features/pinned_statuses/index.js +++ b/app/javascript/flavours/glitch/features/pinned_statuses/index.js @@ -2,10 +2,10 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { fetchPinnedStatuses } from 'themes/glitch/actions/pin_statuses'; -import Column from 'themes/glitch/features/ui/components/column'; -import ColumnBackButtonSlim from 'themes/glitch/components/column_back_button_slim'; -import StatusList from 'themes/glitch/components/status_list'; +import { fetchPinnedStatuses } from 'flavours/glitch/actions/pin_statuses'; +import Column from 'flavours/glitch/features/ui/components/column'; +import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim'; +import StatusList from 'flavours/glitch/components/status_list'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/javascript/themes/glitch/features/public_timeline/containers/column_settings_container.js b/app/javascript/flavours/glitch/features/public_timeline/containers/column_settings_container.js similarity index 67% rename from app/javascript/themes/glitch/features/public_timeline/containers/column_settings_container.js rename to app/javascript/flavours/glitch/features/public_timeline/containers/column_settings_container.js index 0185a7724..b13e20645 100644 --- a/app/javascript/themes/glitch/features/public_timeline/containers/column_settings_container.js +++ b/app/javascript/flavours/glitch/features/public_timeline/containers/column_settings_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; -import ColumnSettings from 'themes/glitch/features/community_timeline/components/column_settings'; -import { changeSetting } from 'themes/glitch/actions/settings'; +import ColumnSettings from 'flavours/glitch/features/community_timeline/components/column_settings'; +import { changeSetting } from 'flavours/glitch/actions/settings'; const mapStateToProps = state => ({ settings: state.getIn(['settings', 'public']), diff --git a/app/javascript/themes/glitch/features/public_timeline/index.js b/app/javascript/flavours/glitch/features/public_timeline/index.js similarity index 85% rename from app/javascript/themes/glitch/features/public_timeline/index.js rename to app/javascript/flavours/glitch/features/public_timeline/index.js index f5b3865af..bbdd4612e 100644 --- a/app/javascript/themes/glitch/features/public_timeline/index.js +++ b/app/javascript/flavours/glitch/features/public_timeline/index.js @@ -1,17 +1,17 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; -import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container'; -import Column from 'themes/glitch/components/column'; -import ColumnHeader from 'themes/glitch/components/column_header'; +import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container'; +import Column from 'flavours/glitch/components/column'; +import ColumnHeader from 'flavours/glitch/components/column_header'; import { refreshPublicTimeline, expandPublicTimeline, -} from 'themes/glitch/actions/timelines'; -import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns'; +} from 'flavours/glitch/actions/timelines'; +import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import ColumnSettingsContainer from './containers/column_settings_container'; -import { connectPublicStream } from 'themes/glitch/actions/streaming'; +import { connectPublicStream } from 'flavours/glitch/actions/streaming'; const messages = defineMessages({ title: { id: 'column.public', defaultMessage: 'Federated timeline' }, diff --git a/app/javascript/themes/glitch/features/reblogs/index.js b/app/javascript/flavours/glitch/features/reblogs/index.js similarity index 79% rename from app/javascript/themes/glitch/features/reblogs/index.js rename to app/javascript/flavours/glitch/features/reblogs/index.js index 8723f7c7c..25b792b39 100644 --- a/app/javascript/themes/glitch/features/reblogs/index.js +++ b/app/javascript/flavours/glitch/features/reblogs/index.js @@ -2,12 +2,12 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import LoadingIndicator from 'themes/glitch/components/loading_indicator'; -import { fetchReblogs } from 'themes/glitch/actions/interactions'; +import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { fetchReblogs } from 'flavours/glitch/actions/interactions'; import { ScrollContainer } from 'react-router-scroll-4'; -import AccountContainer from 'themes/glitch/containers/account_container'; -import Column from 'themes/glitch/features/ui/components/column'; -import ColumnBackButton from 'themes/glitch/components/column_back_button'; +import AccountContainer from 'flavours/glitch/containers/account_container'; +import Column from 'flavours/glitch/features/ui/components/column'; +import ColumnBackButton from 'flavours/glitch/components/column_back_button'; import ImmutablePureComponent from 'react-immutable-pure-component'; const mapStateToProps = (state, props) => ({ diff --git a/app/javascript/themes/glitch/features/report/components/status_check_box.js b/app/javascript/flavours/glitch/features/report/components/status_check_box.js similarity index 100% rename from app/javascript/themes/glitch/features/report/components/status_check_box.js rename to app/javascript/flavours/glitch/features/report/components/status_check_box.js diff --git a/app/javascript/themes/glitch/features/report/containers/status_check_box_container.js b/app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js similarity index 88% rename from app/javascript/themes/glitch/features/report/containers/status_check_box_container.js rename to app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js index 40d55fb3c..9bfd41ffc 100644 --- a/app/javascript/themes/glitch/features/report/containers/status_check_box_container.js +++ b/app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import StatusCheckBox from '../components/status_check_box'; -import { toggleStatusReport } from 'themes/glitch/actions/reports'; +import { toggleStatusReport } from 'flavours/glitch/actions/reports'; import { Set as ImmutableSet } from 'immutable'; const mapStateToProps = (state, { id }) => ({ diff --git a/app/javascript/flavours/glitch/features/standalone/compose/index.js b/app/javascript/flavours/glitch/features/standalone/compose/index.js new file mode 100644 index 000000000..b33c21cb5 --- /dev/null +++ b/app/javascript/flavours/glitch/features/standalone/compose/index.js @@ -0,0 +1,20 @@ +import React from 'react'; +import ComposeFormContainer from 'flavours/glitch/features/compose/containers/compose_form_container'; +import NotificationsContainer from 'flavours/glitch/features/ui/containers/notifications_container'; +import LoadingBarContainer from 'flavours/glitch/features/ui/containers/loading_bar_container'; +import ModalContainer from 'flavours/glitch/features/ui/containers/modal_container'; + +export default class Compose extends React.PureComponent { + + render () { + return ( +

+ ); + } + +} diff --git a/app/javascript/themes/glitch/features/standalone/hashtag_timeline/index.js b/app/javascript/flavours/glitch/features/standalone/hashtag_timeline/index.js similarity index 84% rename from app/javascript/themes/glitch/features/standalone/hashtag_timeline/index.js rename to app/javascript/flavours/glitch/features/standalone/hashtag_timeline/index.js index 7c56f264f..0ad2cef80 100644 --- a/app/javascript/themes/glitch/features/standalone/hashtag_timeline/index.js +++ b/app/javascript/flavours/glitch/features/standalone/hashtag_timeline/index.js @@ -1,13 +1,13 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; -import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container'; +import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container'; import { refreshHashtagTimeline, expandHashtagTimeline, -} from 'themes/glitch/actions/timelines'; -import Column from 'themes/glitch/components/column'; -import ColumnHeader from 'themes/glitch/components/column_header'; +} from 'flavours/glitch/actions/timelines'; +import Column from 'flavours/glitch/components/column'; +import ColumnHeader from 'flavours/glitch/components/column_header'; @connect() export default class HashtagTimeline extends React.PureComponent { diff --git a/app/javascript/themes/glitch/features/standalone/public_timeline/index.js b/app/javascript/flavours/glitch/features/standalone/public_timeline/index.js similarity index 85% rename from app/javascript/themes/glitch/features/standalone/public_timeline/index.js rename to app/javascript/flavours/glitch/features/standalone/public_timeline/index.js index b3fb55288..717f6fcaf 100644 --- a/app/javascript/themes/glitch/features/standalone/public_timeline/index.js +++ b/app/javascript/flavours/glitch/features/standalone/public_timeline/index.js @@ -1,13 +1,13 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; -import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container'; +import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container'; import { refreshPublicTimeline, expandPublicTimeline, -} from 'themes/glitch/actions/timelines'; -import Column from 'themes/glitch/components/column'; -import ColumnHeader from 'themes/glitch/components/column_header'; +} from 'flavours/glitch/actions/timelines'; +import Column from 'flavours/glitch/components/column'; +import ColumnHeader from 'flavours/glitch/components/column_header'; import { defineMessages, injectIntl } from 'react-intl'; const messages = defineMessages({ diff --git a/app/javascript/themes/glitch/features/status/components/action_bar.js b/app/javascript/flavours/glitch/features/status/components/action_bar.js similarity index 95% rename from app/javascript/themes/glitch/features/status/components/action_bar.js rename to app/javascript/flavours/glitch/features/status/components/action_bar.js index 6cda988d1..4d660ee3c 100644 --- a/app/javascript/themes/glitch/features/status/components/action_bar.js +++ b/app/javascript/flavours/glitch/features/status/components/action_bar.js @@ -1,10 +1,10 @@ import React from 'react'; import PropTypes from 'prop-types'; -import IconButton from 'themes/glitch/components/icon_button'; +import IconButton from 'flavours/glitch/components/icon_button'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import DropdownMenuContainer from 'themes/glitch/containers/dropdown_menu_container'; +import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container'; import { defineMessages, injectIntl } from 'react-intl'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; const messages = defineMessages({ delete: { id: 'status.delete', defaultMessage: 'Delete' }, diff --git a/app/javascript/themes/glitch/features/status/components/card.js b/app/javascript/flavours/glitch/features/status/components/card.js similarity index 100% rename from app/javascript/themes/glitch/features/status/components/card.js rename to app/javascript/flavours/glitch/features/status/components/card.js diff --git a/app/javascript/themes/glitch/features/status/components/detailed_status.js b/app/javascript/flavours/glitch/features/status/components/detailed_status.js similarity index 90% rename from app/javascript/themes/glitch/features/status/components/detailed_status.js rename to app/javascript/flavours/glitch/features/status/components/detailed_status.js index 7606bfbf3..7c6f436d6 100644 --- a/app/javascript/themes/glitch/features/status/components/detailed_status.js +++ b/app/javascript/flavours/glitch/features/status/components/detailed_status.js @@ -1,17 +1,17 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import Avatar from 'themes/glitch/components/avatar'; -import DisplayName from 'themes/glitch/components/display_name'; -import StatusContent from 'themes/glitch/components/status_content'; -import StatusGallery from 'themes/glitch/components/media_gallery'; -import AttachmentList from 'themes/glitch/components/attachment_list'; +import Avatar from 'flavours/glitch/components/avatar'; +import DisplayName from 'flavours/glitch/components/display_name'; +import StatusContent from 'flavours/glitch/components/status_content'; +import StatusGallery from 'flavours/glitch/components/media_gallery'; +import AttachmentList from 'flavours/glitch/components/attachment_list'; import { Link } from 'react-router-dom'; import { FormattedDate, FormattedNumber } from 'react-intl'; import CardContainer from '../containers/card_container'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import Video from 'themes/glitch/features/video'; -import VisibilityIcon from 'themes/glitch/components/status_visibility_icon'; +import Video from 'flavours/glitch/features/video'; +import VisibilityIcon from 'flavours/glitch/components/status_visibility_icon'; export default class DetailedStatus extends ImmutablePureComponent { diff --git a/app/javascript/themes/glitch/features/status/containers/card_container.js b/app/javascript/flavours/glitch/features/status/containers/card_container.js similarity index 100% rename from app/javascript/themes/glitch/features/status/containers/card_container.js rename to app/javascript/flavours/glitch/features/status/containers/card_container.js diff --git a/app/javascript/themes/glitch/features/status/index.js b/app/javascript/flavours/glitch/features/status/index.js similarity index 91% rename from app/javascript/themes/glitch/features/status/index.js rename to app/javascript/flavours/glitch/features/status/index.js index 57af94a9a..73b212bba 100644 --- a/app/javascript/themes/glitch/features/status/index.js +++ b/app/javascript/flavours/glitch/features/status/index.js @@ -3,11 +3,11 @@ import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { fetchStatus } from 'themes/glitch/actions/statuses'; -import MissingIndicator from 'themes/glitch/components/missing_indicator'; +import { fetchStatus } from 'flavours/glitch/actions/statuses'; +import MissingIndicator from 'flavours/glitch/components/missing_indicator'; import DetailedStatus from './components/detailed_status'; import ActionBar from './components/action_bar'; -import Column from 'themes/glitch/features/ui/components/column'; +import Column from 'flavours/glitch/features/ui/components/column'; import { favourite, unfavourite, @@ -15,23 +15,23 @@ import { unreblog, pin, unpin, -} from 'themes/glitch/actions/interactions'; +} from 'flavours/glitch/actions/interactions'; import { replyCompose, mentionCompose, -} from 'themes/glitch/actions/compose'; -import { deleteStatus } from 'themes/glitch/actions/statuses'; -import { initReport } from 'themes/glitch/actions/reports'; -import { makeGetStatus } from 'themes/glitch/selectors'; +} from 'flavours/glitch/actions/compose'; +import { deleteStatus } from 'flavours/glitch/actions/statuses'; +import { initReport } from 'flavours/glitch/actions/reports'; +import { makeGetStatus } from 'flavours/glitch/selectors'; import { ScrollContainer } from 'react-router-scroll-4'; -import ColumnBackButton from 'themes/glitch/components/column_back_button'; -import StatusContainer from 'themes/glitch/containers/status_container'; -import { openModal } from 'themes/glitch/actions/modal'; +import ColumnBackButton from 'flavours/glitch/components/column_back_button'; +import StatusContainer from 'flavours/glitch/containers/status_container'; +import { openModal } from 'flavours/glitch/actions/modal'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { HotKeys } from 'react-hotkeys'; -import { boostModal, deleteModal } from 'themes/glitch/util/initial_state'; -import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from 'themes/glitch/util/fullscreen'; +import { boostModal, deleteModal } from 'flavours/glitch/util/initial_state'; +import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from 'flavours/glitch/util/fullscreen'; const messages = defineMessages({ deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, diff --git a/app/javascript/themes/glitch/features/ui/components/actions_modal.js b/app/javascript/flavours/glitch/features/ui/components/actions_modal.js similarity index 86% rename from app/javascript/themes/glitch/features/ui/components/actions_modal.js rename to app/javascript/flavours/glitch/features/ui/components/actions_modal.js index 7a2b78b63..0873c282f 100644 --- a/app/javascript/themes/glitch/features/ui/components/actions_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/actions_modal.js @@ -2,11 +2,11 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import StatusContent from 'themes/glitch/components/status_content'; -import Avatar from 'themes/glitch/components/avatar'; -import RelativeTimestamp from 'themes/glitch/components/relative_timestamp'; -import DisplayName from 'themes/glitch/components/display_name'; -import IconButton from 'themes/glitch/components/icon_button'; +import StatusContent from 'flavours/glitch/components/status_content'; +import Avatar from 'flavours/glitch/components/avatar'; +import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp'; +import DisplayName from 'flavours/glitch/components/display_name'; +import IconButton from 'flavours/glitch/components/icon_button'; import classNames from 'classnames'; export default class ActionsModal extends ImmutablePureComponent { diff --git a/app/javascript/themes/glitch/features/ui/components/boost_modal.js b/app/javascript/flavours/glitch/features/ui/components/boost_modal.js similarity index 88% rename from app/javascript/themes/glitch/features/ui/components/boost_modal.js rename to app/javascript/flavours/glitch/features/ui/components/boost_modal.js index 49781db10..9652bcb2d 100644 --- a/app/javascript/themes/glitch/features/ui/components/boost_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/boost_modal.js @@ -2,11 +2,11 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import Button from 'themes/glitch/components/button'; -import StatusContent from 'themes/glitch/components/status_content'; -import Avatar from 'themes/glitch/components/avatar'; -import RelativeTimestamp from 'themes/glitch/components/relative_timestamp'; -import DisplayName from 'themes/glitch/components/display_name'; +import Button from 'flavours/glitch/components/button'; +import StatusContent from 'flavours/glitch/components/status_content'; +import Avatar from 'flavours/glitch/components/avatar'; +import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp'; +import DisplayName from 'flavours/glitch/components/display_name'; import ImmutablePureComponent from 'react-immutable-pure-component'; const messages = defineMessages({ diff --git a/app/javascript/themes/glitch/features/ui/components/bundle.js b/app/javascript/flavours/glitch/features/ui/components/bundle.js similarity index 100% rename from app/javascript/themes/glitch/features/ui/components/bundle.js rename to app/javascript/flavours/glitch/features/ui/components/bundle.js diff --git a/app/javascript/themes/glitch/features/ui/components/bundle_column_error.js b/app/javascript/flavours/glitch/features/ui/components/bundle_column_error.js similarity index 88% rename from app/javascript/themes/glitch/features/ui/components/bundle_column_error.js rename to app/javascript/flavours/glitch/features/ui/components/bundle_column_error.js index daedc6299..3e979a250 100644 --- a/app/javascript/themes/glitch/features/ui/components/bundle_column_error.js +++ b/app/javascript/flavours/glitch/features/ui/components/bundle_column_error.js @@ -4,8 +4,8 @@ import { defineMessages, injectIntl } from 'react-intl'; import Column from './column'; import ColumnHeader from './column_header'; -import ColumnBackButtonSlim from 'themes/glitch/components/column_back_button_slim'; -import IconButton from 'themes/glitch/components/icon_button'; +import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim'; +import IconButton from 'flavours/glitch/components/icon_button'; const messages = defineMessages({ title: { id: 'bundle_column_error.title', defaultMessage: 'Network error' }, diff --git a/app/javascript/themes/glitch/features/ui/components/bundle_modal_error.js b/app/javascript/flavours/glitch/features/ui/components/bundle_modal_error.js similarity index 95% rename from app/javascript/themes/glitch/features/ui/components/bundle_modal_error.js rename to app/javascript/flavours/glitch/features/ui/components/bundle_modal_error.js index 8cca32ae9..2c14a1e5c 100644 --- a/app/javascript/themes/glitch/features/ui/components/bundle_modal_error.js +++ b/app/javascript/flavours/glitch/features/ui/components/bundle_modal_error.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { defineMessages, injectIntl } from 'react-intl'; -import IconButton from 'themes/glitch/components/icon_button'; +import IconButton from 'flavours/glitch/components/icon_button'; const messages = defineMessages({ error: { id: 'bundle_modal_error.message', defaultMessage: 'Something went wrong while loading this component.' }, diff --git a/app/javascript/themes/glitch/features/ui/components/column.js b/app/javascript/flavours/glitch/features/ui/components/column.js similarity index 93% rename from app/javascript/themes/glitch/features/ui/components/column.js rename to app/javascript/flavours/glitch/features/ui/components/column.js index 73a5bc15e..ab78414e0 100644 --- a/app/javascript/themes/glitch/features/ui/components/column.js +++ b/app/javascript/flavours/glitch/features/ui/components/column.js @@ -2,8 +2,8 @@ import React from 'react'; import ColumnHeader from './column_header'; import PropTypes from 'prop-types'; import { debounce } from 'lodash'; -import { scrollTop } from 'themes/glitch/util/scroll'; -import { isMobile } from 'themes/glitch/util/is_mobile'; +import { scrollTop } from 'flavours/glitch/util/scroll'; +import { isMobile } from 'flavours/glitch/util/is_mobile'; export default class Column extends React.PureComponent { diff --git a/app/javascript/themes/glitch/features/ui/components/column_header.js b/app/javascript/flavours/glitch/features/ui/components/column_header.js similarity index 100% rename from app/javascript/themes/glitch/features/ui/components/column_header.js rename to app/javascript/flavours/glitch/features/ui/components/column_header.js diff --git a/app/javascript/themes/glitch/features/ui/components/column_link.js b/app/javascript/flavours/glitch/features/ui/components/column_link.js similarity index 100% rename from app/javascript/themes/glitch/features/ui/components/column_link.js rename to app/javascript/flavours/glitch/features/ui/components/column_link.js diff --git a/app/javascript/themes/glitch/features/ui/components/column_loading.js b/app/javascript/flavours/glitch/features/ui/components/column_loading.js similarity index 83% rename from app/javascript/themes/glitch/features/ui/components/column_loading.js rename to app/javascript/flavours/glitch/features/ui/components/column_loading.js index 75f26218a..ba2d0824e 100644 --- a/app/javascript/themes/glitch/features/ui/components/column_loading.js +++ b/app/javascript/flavours/glitch/features/ui/components/column_loading.js @@ -1,8 +1,8 @@ import React from 'react'; import PropTypes from 'prop-types'; -import Column from 'themes/glitch/components/column'; -import ColumnHeader from 'themes/glitch/components/column_header'; +import Column from 'flavours/glitch/components/column'; +import ColumnHeader from 'flavours/glitch/components/column_header'; import ImmutablePureComponent from 'react-immutable-pure-component'; export default class ColumnLoading extends ImmutablePureComponent { diff --git a/app/javascript/themes/glitch/features/ui/components/column_subheading.js b/app/javascript/flavours/glitch/features/ui/components/column_subheading.js similarity index 100% rename from app/javascript/themes/glitch/features/ui/components/column_subheading.js rename to app/javascript/flavours/glitch/features/ui/components/column_subheading.js diff --git a/app/javascript/themes/glitch/features/ui/components/columns_area.js b/app/javascript/flavours/glitch/features/ui/components/columns_area.js similarity index 98% rename from app/javascript/themes/glitch/features/ui/components/columns_area.js rename to app/javascript/flavours/glitch/features/ui/components/columns_area.js index 452950363..264f60724 100644 --- a/app/javascript/themes/glitch/features/ui/components/columns_area.js +++ b/app/javascript/flavours/glitch/features/ui/components/columns_area.js @@ -11,10 +11,10 @@ import BundleContainer from '../containers/bundle_container'; import ColumnLoading from './column_loading'; import DrawerLoading from './drawer_loading'; import BundleColumnError from './bundle_column_error'; -import { Compose, Notifications, HomeTimeline, CommunityTimeline, PublicTimeline, HashtagTimeline, DirectTimeline, FavouritedStatuses } from 'themes/glitch/util/async-components'; +import { Compose, Notifications, HomeTimeline, CommunityTimeline, PublicTimeline, HashtagTimeline, DirectTimeline, FavouritedStatuses } from 'flavours/glitch/util/async-components'; import detectPassiveEvents from 'detect-passive-events'; -import { scrollRight } from 'themes/glitch/util/scroll'; +import { scrollRight } from 'flavours/glitch/util/scroll'; const componentMap = { 'COMPOSE': Compose, diff --git a/app/javascript/themes/glitch/features/ui/components/confirmation_modal.js b/app/javascript/flavours/glitch/features/ui/components/confirmation_modal.js similarity index 95% rename from app/javascript/themes/glitch/features/ui/components/confirmation_modal.js rename to app/javascript/flavours/glitch/features/ui/components/confirmation_modal.js index 3d568aec3..d4d1e587e 100644 --- a/app/javascript/themes/glitch/features/ui/components/confirmation_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/confirmation_modal.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { injectIntl, FormattedMessage } from 'react-intl'; -import Button from 'themes/glitch/components/button'; +import Button from 'flavours/glitch/components/button'; @injectIntl export default class ConfirmationModal extends React.PureComponent { diff --git a/app/javascript/themes/glitch/features/ui/components/doodle_modal.js b/app/javascript/flavours/glitch/features/ui/components/doodle_modal.js similarity index 98% rename from app/javascript/themes/glitch/features/ui/components/doodle_modal.js rename to app/javascript/flavours/glitch/features/ui/components/doodle_modal.js index 819656dbf..9c74451b3 100644 --- a/app/javascript/themes/glitch/features/ui/components/doodle_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/doodle_modal.js @@ -1,12 +1,12 @@ import React from 'react'; import PropTypes from 'prop-types'; -import Button from 'themes/glitch/components/button'; +import Button from 'flavours/glitch/components/button'; import ImmutablePureComponent from 'react-immutable-pure-component'; import Atrament from 'atrament'; // the doodling library import { connect } from 'react-redux'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { doodleSet, uploadCompose } from 'themes/glitch/actions/compose'; -import IconButton from 'themes/glitch/components/icon_button'; +import { doodleSet, uploadCompose } from 'flavours/glitch/actions/compose'; +import IconButton from 'flavours/glitch/components/icon_button'; import { debounce, mapValues } from 'lodash'; import classNames from 'classnames'; diff --git a/app/javascript/themes/glitch/features/ui/components/drawer_loading.js b/app/javascript/flavours/glitch/features/ui/components/drawer_loading.js similarity index 100% rename from app/javascript/themes/glitch/features/ui/components/drawer_loading.js rename to app/javascript/flavours/glitch/features/ui/components/drawer_loading.js diff --git a/app/javascript/themes/glitch/features/ui/components/embed_modal.js b/app/javascript/flavours/glitch/features/ui/components/embed_modal.js similarity index 100% rename from app/javascript/themes/glitch/features/ui/components/embed_modal.js rename to app/javascript/flavours/glitch/features/ui/components/embed_modal.js diff --git a/app/javascript/themes/glitch/features/ui/components/image_loader.js b/app/javascript/flavours/glitch/features/ui/components/image_loader.js similarity index 100% rename from app/javascript/themes/glitch/features/ui/components/image_loader.js rename to app/javascript/flavours/glitch/features/ui/components/image_loader.js diff --git a/app/javascript/themes/glitch/features/ui/components/media_modal.js b/app/javascript/flavours/glitch/features/ui/components/media_modal.js similarity index 96% rename from app/javascript/themes/glitch/features/ui/components/media_modal.js rename to app/javascript/flavours/glitch/features/ui/components/media_modal.js index 1dad972b2..e56147c5b 100644 --- a/app/javascript/themes/glitch/features/ui/components/media_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/media_modal.js @@ -2,9 +2,9 @@ import React from 'react'; import ReactSwipeableViews from 'react-swipeable-views'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import ExtendedVideoPlayer from 'themes/glitch/components/extended_video_player'; +import ExtendedVideoPlayer from 'flavours/glitch/components/extended_video_player'; import { defineMessages, injectIntl } from 'react-intl'; -import IconButton from 'themes/glitch/components/icon_button'; +import IconButton from 'flavours/glitch/components/icon_button'; import ImmutablePureComponent from 'react-immutable-pure-component'; import ImageLoader from './image_loader'; diff --git a/app/javascript/themes/glitch/features/ui/components/modal_loading.js b/app/javascript/flavours/glitch/features/ui/components/modal_loading.js similarity index 86% rename from app/javascript/themes/glitch/features/ui/components/modal_loading.js rename to app/javascript/flavours/glitch/features/ui/components/modal_loading.js index e14d20fbb..b1c322154 100644 --- a/app/javascript/themes/glitch/features/ui/components/modal_loading.js +++ b/app/javascript/flavours/glitch/features/ui/components/modal_loading.js @@ -1,6 +1,6 @@ import React from 'react'; -import LoadingIndicator from 'themes/glitch/components/loading_indicator'; +import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; // Keep the markup in sync with // (make sure they have the same dimensions) diff --git a/app/javascript/themes/glitch/features/ui/components/modal_root.js b/app/javascript/flavours/glitch/features/ui/components/modal_root.js similarity index 98% rename from app/javascript/themes/glitch/features/ui/components/modal_root.js rename to app/javascript/flavours/glitch/features/ui/components/modal_root.js index fbe794170..61b239283 100644 --- a/app/javascript/themes/glitch/features/ui/components/modal_root.js +++ b/app/javascript/flavours/glitch/features/ui/components/modal_root.js @@ -15,7 +15,7 @@ import { ReportModal, SettingsModal, EmbedModal, -} from 'themes/glitch/util/async-components'; +} from 'flavours/glitch/util/async-components'; const MODAL_COMPONENTS = { 'MEDIA': () => Promise.resolve({ default: MediaModal }), diff --git a/app/javascript/themes/glitch/features/ui/components/mute_modal.js b/app/javascript/flavours/glitch/features/ui/components/mute_modal.js similarity index 91% rename from app/javascript/themes/glitch/features/ui/components/mute_modal.js rename to app/javascript/flavours/glitch/features/ui/components/mute_modal.js index ffccdc84d..0202b1ab1 100644 --- a/app/javascript/themes/glitch/features/ui/components/mute_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/mute_modal.js @@ -3,10 +3,10 @@ import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import { injectIntl, FormattedMessage } from 'react-intl'; import Toggle from 'react-toggle'; -import Button from 'themes/glitch/components/button'; -import { closeModal } from 'themes/glitch/actions/modal'; -import { muteAccount } from 'themes/glitch/actions/accounts'; -import { toggleHideNotifications } from 'themes/glitch/actions/mutes'; +import Button from 'flavours/glitch/components/button'; +import { closeModal } from 'flavours/glitch/actions/modal'; +import { muteAccount } from 'flavours/glitch/actions/accounts'; +import { toggleHideNotifications } from 'flavours/glitch/actions/mutes'; const mapStateToProps = state => { diff --git a/app/javascript/themes/glitch/features/ui/components/onboarding_modal.js b/app/javascript/flavours/glitch/features/ui/components/onboarding_modal.js similarity index 97% rename from app/javascript/themes/glitch/features/ui/components/onboarding_modal.js rename to app/javascript/flavours/glitch/features/ui/components/onboarding_modal.js index 58875262e..21f1addea 100644 --- a/app/javascript/themes/glitch/features/ui/components/onboarding_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/onboarding_modal.js @@ -5,16 +5,16 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import ReactSwipeableViews from 'react-swipeable-views'; import classNames from 'classnames'; -import Permalink from 'themes/glitch/components/permalink'; -import ComposeForm from 'themes/glitch/features/compose/components/compose_form'; -import Search from 'themes/glitch/features/compose/components/search'; -import NavigationBar from 'themes/glitch/features/compose/components/navigation_bar'; +import Permalink from 'flavours/glitch/components/permalink'; +import ComposeForm from 'flavours/glitch/features/compose/components/compose_form'; +import Search from 'flavours/glitch/features/compose/components/search'; +import NavigationBar from 'flavours/glitch/features/compose/components/navigation_bar'; import ColumnHeader from './column_header'; import { List as ImmutableList, Map as ImmutableMap, } from 'immutable'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; const noop = () => { }; diff --git a/app/javascript/themes/glitch/features/ui/components/report_modal.js b/app/javascript/flavours/glitch/features/ui/components/report_modal.js similarity index 89% rename from app/javascript/themes/glitch/features/ui/components/report_modal.js rename to app/javascript/flavours/glitch/features/ui/components/report_modal.js index e6153948e..b4dc1e3d6 100644 --- a/app/javascript/themes/glitch/features/ui/components/report_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/report_modal.js @@ -1,15 +1,15 @@ import React from 'react'; import { connect } from 'react-redux'; -import { changeReportComment, submitReport } from 'themes/glitch/actions/reports'; -import { refreshAccountTimeline } from 'themes/glitch/actions/timelines'; +import { changeReportComment, submitReport } from 'flavours/glitch/actions/reports'; +import { refreshAccountTimeline } from 'flavours/glitch/actions/timelines'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { makeGetAccount } from 'themes/glitch/selectors'; +import { makeGetAccount } from 'flavours/glitch/selectors'; import { defineMessages, FormattedMessage, injectIntl } from 'react-intl'; -import StatusCheckBox from 'themes/glitch/features/report/containers/status_check_box_container'; +import StatusCheckBox from 'flavours/glitch/features/report/containers/status_check_box_container'; import { OrderedSet } from 'immutable'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import Button from 'themes/glitch/components/button'; +import Button from 'flavours/glitch/components/button'; const messages = defineMessages({ placeholder: { id: 'report.placeholder', defaultMessage: 'Additional comments' }, diff --git a/app/javascript/themes/glitch/features/ui/components/tabs_bar.js b/app/javascript/flavours/glitch/features/ui/components/tabs_bar.js similarity index 98% rename from app/javascript/themes/glitch/features/ui/components/tabs_bar.js rename to app/javascript/flavours/glitch/features/ui/components/tabs_bar.js index ef5deae99..89b455dd8 100644 --- a/app/javascript/themes/glitch/features/ui/components/tabs_bar.js +++ b/app/javascript/flavours/glitch/features/ui/components/tabs_bar.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import { NavLink } from 'react-router-dom'; import { FormattedMessage, injectIntl } from 'react-intl'; import { debounce } from 'lodash'; -import { isUserTouching } from 'themes/glitch/util/is_mobile'; +import { isUserTouching } from 'flavours/glitch/util/is_mobile'; export const links = [ , diff --git a/app/javascript/themes/glitch/features/ui/components/upload_area.js b/app/javascript/flavours/glitch/features/ui/components/upload_area.js similarity index 96% rename from app/javascript/themes/glitch/features/ui/components/upload_area.js rename to app/javascript/flavours/glitch/features/ui/components/upload_area.js index 72a450215..cc6b6d171 100644 --- a/app/javascript/themes/glitch/features/ui/components/upload_area.js +++ b/app/javascript/flavours/glitch/features/ui/components/upload_area.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import Motion from 'themes/glitch/util/optional_motion'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; import { FormattedMessage } from 'react-intl'; diff --git a/app/javascript/themes/glitch/features/ui/components/video_modal.js b/app/javascript/flavours/glitch/features/ui/components/video_modal.js similarity index 94% rename from app/javascript/themes/glitch/features/ui/components/video_modal.js rename to app/javascript/flavours/glitch/features/ui/components/video_modal.js index 91168c790..22fa998fb 100644 --- a/app/javascript/themes/glitch/features/ui/components/video_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/video_modal.js @@ -1,7 +1,7 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import Video from 'themes/glitch/features/video'; +import Video from 'flavours/glitch/features/video'; import ImmutablePureComponent from 'react-immutable-pure-component'; export default class VideoModal extends ImmutablePureComponent { diff --git a/app/javascript/themes/glitch/features/ui/containers/bundle_container.js b/app/javascript/flavours/glitch/features/ui/containers/bundle_container.js similarity index 91% rename from app/javascript/themes/glitch/features/ui/containers/bundle_container.js rename to app/javascript/flavours/glitch/features/ui/containers/bundle_container.js index e6f9afcf7..c9086c9bc 100644 --- a/app/javascript/themes/glitch/features/ui/containers/bundle_container.js +++ b/app/javascript/flavours/glitch/features/ui/containers/bundle_container.js @@ -2,7 +2,7 @@ import { connect } from 'react-redux'; import Bundle from '../components/bundle'; -import { fetchBundleRequest, fetchBundleSuccess, fetchBundleFail } from 'themes/glitch/actions/bundles'; +import { fetchBundleRequest, fetchBundleSuccess, fetchBundleFail } from 'flavours/glitch/actions/bundles'; const mapDispatchToProps = dispatch => ({ onFetch () { diff --git a/app/javascript/themes/glitch/features/ui/containers/columns_area_container.js b/app/javascript/flavours/glitch/features/ui/containers/columns_area_container.js similarity index 100% rename from app/javascript/themes/glitch/features/ui/containers/columns_area_container.js rename to app/javascript/flavours/glitch/features/ui/containers/columns_area_container.js diff --git a/app/javascript/themes/glitch/features/ui/containers/loading_bar_container.js b/app/javascript/flavours/glitch/features/ui/containers/loading_bar_container.js similarity index 100% rename from app/javascript/themes/glitch/features/ui/containers/loading_bar_container.js rename to app/javascript/flavours/glitch/features/ui/containers/loading_bar_container.js diff --git a/app/javascript/themes/glitch/features/ui/containers/modal_container.js b/app/javascript/flavours/glitch/features/ui/containers/modal_container.js similarity index 86% rename from app/javascript/themes/glitch/features/ui/containers/modal_container.js rename to app/javascript/flavours/glitch/features/ui/containers/modal_container.js index c26f19886..f074002e4 100644 --- a/app/javascript/themes/glitch/features/ui/containers/modal_container.js +++ b/app/javascript/flavours/glitch/features/ui/containers/modal_container.js @@ -1,5 +1,5 @@ import { connect } from 'react-redux'; -import { closeModal } from 'themes/glitch/actions/modal'; +import { closeModal } from 'flavours/glitch/actions/modal'; import ModalRoot from '../components/modal_root'; const mapStateToProps = state => ({ diff --git a/app/javascript/themes/glitch/features/ui/containers/notifications_container.js b/app/javascript/flavours/glitch/features/ui/containers/notifications_container.js similarity index 76% rename from app/javascript/themes/glitch/features/ui/containers/notifications_container.js rename to app/javascript/flavours/glitch/features/ui/containers/notifications_container.js index 5bd4017f5..88d482bcf 100644 --- a/app/javascript/themes/glitch/features/ui/containers/notifications_container.js +++ b/app/javascript/flavours/glitch/features/ui/containers/notifications_container.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux'; import { NotificationStack } from 'react-notification'; -import { dismissAlert } from 'themes/glitch/actions/alerts'; -import { getAlerts } from 'themes/glitch/selectors'; +import { dismissAlert } from 'flavours/glitch/actions/alerts'; +import { getAlerts } from 'flavours/glitch/selectors'; const mapStateToProps = state => ({ notifications: getAlerts(state), diff --git a/app/javascript/themes/glitch/features/ui/containers/status_list_container.js b/app/javascript/flavours/glitch/features/ui/containers/status_list_container.js similarity index 92% rename from app/javascript/themes/glitch/features/ui/containers/status_list_container.js rename to app/javascript/flavours/glitch/features/ui/containers/status_list_container.js index 807c82e16..69508f9ff 100644 --- a/app/javascript/themes/glitch/features/ui/containers/status_list_container.js +++ b/app/javascript/flavours/glitch/features/ui/containers/status_list_container.js @@ -1,10 +1,10 @@ import { connect } from 'react-redux'; -import StatusList from 'themes/glitch/components/status_list'; -import { scrollTopTimeline } from 'themes/glitch/actions/timelines'; +import StatusList from 'flavours/glitch/components/status_list'; +import { scrollTopTimeline } from 'flavours/glitch/actions/timelines'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; import { createSelector } from 'reselect'; import { debounce } from 'lodash'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; const makeGetStatusIds = () => createSelector([ (state, { type }) => state.getIn(['settings', type], ImmutableMap()), diff --git a/app/javascript/themes/glitch/features/ui/index.js b/app/javascript/flavours/glitch/features/ui/index.js similarity index 96% rename from app/javascript/themes/glitch/features/ui/index.js rename to app/javascript/flavours/glitch/features/ui/index.js index b59a2e637..620630faf 100644 --- a/app/javascript/themes/glitch/features/ui/index.js +++ b/app/javascript/flavours/glitch/features/ui/index.js @@ -6,13 +6,13 @@ import TabsBar from './components/tabs_bar'; import ModalContainer from './containers/modal_container'; import { connect } from 'react-redux'; import { Redirect, withRouter } from 'react-router-dom'; -import { isMobile } from 'themes/glitch/util/is_mobile'; +import { isMobile } from 'flavours/glitch/util/is_mobile'; import { debounce } from 'lodash'; -import { uploadCompose, resetCompose } from 'themes/glitch/actions/compose'; -import { refreshHomeTimeline } from 'themes/glitch/actions/timelines'; -import { refreshNotifications } from 'themes/glitch/actions/notifications'; -import { clearHeight } from 'themes/glitch/actions/height_cache'; -import { WrappedSwitch, WrappedRoute } from 'themes/glitch/util/react_router_helpers'; +import { uploadCompose, resetCompose } from 'flavours/glitch/actions/compose'; +import { refreshHomeTimeline } from 'flavours/glitch/actions/timelines'; +import { refreshNotifications } from 'flavours/glitch/actions/notifications'; +import { clearHeight } from 'flavours/glitch/actions/height_cache'; +import { WrappedSwitch, WrappedRoute } from 'flavours/glitch/util/react_router_helpers'; import UploadArea from './components/upload_area'; import ColumnsAreaContainer from './containers/columns_area_container'; import classNames from 'classnames'; @@ -38,9 +38,9 @@ import { Blocks, Mutes, PinnedStatuses, -} from 'themes/glitch/util/async-components'; +} from 'flavours/glitch/util/async-components'; import { HotKeys } from 'react-hotkeys'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; import { defineMessages, injectIntl } from 'react-intl'; // Dummy import, to make sure that ends up in the application bundle. diff --git a/app/javascript/themes/glitch/features/video/index.js b/app/javascript/flavours/glitch/features/video/index.js similarity index 99% rename from app/javascript/themes/glitch/features/video/index.js rename to app/javascript/flavours/glitch/features/video/index.js index 0ecbe37c9..97c1c27fa 100644 --- a/app/javascript/themes/glitch/features/video/index.js +++ b/app/javascript/flavours/glitch/features/video/index.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { throttle } from 'lodash'; import classNames from 'classnames'; -import { isFullscreen, requestFullscreen, exitFullscreen } from 'themes/glitch/util/fullscreen'; +import { isFullscreen, requestFullscreen, exitFullscreen } from 'flavours/glitch/util/fullscreen'; const messages = defineMessages({ play: { id: 'video.play', defaultMessage: 'Play' }, diff --git a/app/javascript/themes/glitch/middleware/errors.js b/app/javascript/flavours/glitch/middleware/errors.js similarity index 92% rename from app/javascript/themes/glitch/middleware/errors.js rename to app/javascript/flavours/glitch/middleware/errors.js index c54e7b0a2..f3dfc8b06 100644 --- a/app/javascript/themes/glitch/middleware/errors.js +++ b/app/javascript/flavours/glitch/middleware/errors.js @@ -1,4 +1,4 @@ -import { showAlert } from 'themes/glitch/actions/alerts'; +import { showAlert } from 'flavours/glitch/actions/alerts'; const defaultFailSuffix = 'FAIL'; diff --git a/app/javascript/themes/glitch/middleware/loading_bar.js b/app/javascript/flavours/glitch/middleware/loading_bar.js similarity index 100% rename from app/javascript/themes/glitch/middleware/loading_bar.js rename to app/javascript/flavours/glitch/middleware/loading_bar.js diff --git a/app/javascript/themes/glitch/middleware/sounds.js b/app/javascript/flavours/glitch/middleware/sounds.js similarity index 100% rename from app/javascript/themes/glitch/middleware/sounds.js rename to app/javascript/flavours/glitch/middleware/sounds.js diff --git a/app/javascript/themes/glitch/packs/about.js b/app/javascript/flavours/glitch/packs/about.js similarity index 67% rename from app/javascript/themes/glitch/packs/about.js rename to app/javascript/flavours/glitch/packs/about.js index 9639d5453..bc0a4887b 100644 --- a/app/javascript/themes/glitch/packs/about.js +++ b/app/javascript/flavours/glitch/packs/about.js @@ -1,7 +1,7 @@ -import loadPolyfills from 'themes/glitch/util/load_polyfills'; +import loadPolyfills from 'flavours/glitch/util/load_polyfills'; function loaded() { - const TimelineContainer = require('themes/glitch/containers/timeline_container').default; + const TimelineContainer = require('flavours/glitch/containers/timeline_container').default; const React = require('react'); const ReactDOM = require('react-dom'); const mountNode = document.getElementById('mastodon-timeline'); @@ -13,7 +13,7 @@ function loaded() { } function main() { - const ready = require('themes/glitch/util/ready').default; + const ready = require('flavours/glitch/util/ready').default; ready(loaded); } diff --git a/app/javascript/flavours/glitch/packs/common.js b/app/javascript/flavours/glitch/packs/common.js new file mode 100644 index 000000000..07445d2b3 --- /dev/null +++ b/app/javascript/flavours/glitch/packs/common.js @@ -0,0 +1 @@ +import 'flavours/glitch/styles/index.scss'; diff --git a/app/javascript/flavours/glitch/packs/home.js b/app/javascript/flavours/glitch/packs/home.js new file mode 100644 index 000000000..b8f7b7d8e --- /dev/null +++ b/app/javascript/flavours/glitch/packs/home.js @@ -0,0 +1,7 @@ +import loadPolyfills from 'flavours/glitch/util/load_polyfills'; + +loadPolyfills().then(() => { + require('flavours/glitch/util/main').default(); +}).catch(e => { + console.error(e); +}); diff --git a/app/javascript/themes/glitch/packs/public.js b/app/javascript/flavours/glitch/packs/public.js similarity index 85% rename from app/javascript/themes/glitch/packs/public.js rename to app/javascript/flavours/glitch/packs/public.js index 410e66716..9ea82b53a 100644 --- a/app/javascript/themes/glitch/packs/public.js +++ b/app/javascript/flavours/glitch/packs/public.js @@ -1,14 +1,14 @@ -import loadPolyfills from 'themes/glitch/util/load_polyfills'; -import ready from 'themes/glitch/util/ready'; +import loadPolyfills from 'flavours/glitch/util/load_polyfills'; +import ready from 'flavours/glitch/util/ready'; function main() { const IntlRelativeFormat = require('intl-relativeformat').default; - const emojify = require('themes/glitch/util/emoji').default; + const emojify = require('flavours/glitch/util/emoji').default; const { getLocale } = require('locales'); const { localeData } = getLocale(); - const VideoContainer = require('themes/glitch/containers/video_container').default; - const MediaGalleryContainer = require('themes/glitch/containers/media_gallery_container').default; - const CardContainer = require('themes/glitch/containers/card_container').default; + const VideoContainer = require('flavours/glitch/containers/video_container').default; + const MediaGalleryContainer = require('flavours/glitch/containers/media_gallery_container').default; + const CardContainer = require('flavours/glitch/containers/card_container').default; const React = require('react'); const ReactDOM = require('react-dom'); diff --git a/app/javascript/themes/glitch/packs/share.js b/app/javascript/flavours/glitch/packs/share.js similarity index 66% rename from app/javascript/themes/glitch/packs/share.js rename to app/javascript/flavours/glitch/packs/share.js index dc2e677e4..9f2aa2553 100644 --- a/app/javascript/themes/glitch/packs/share.js +++ b/app/javascript/flavours/glitch/packs/share.js @@ -1,7 +1,7 @@ -import loadPolyfills from 'themes/glitch/util/load_polyfills'; +import loadPolyfills from 'flavours/glitch/util/load_polyfills'; function loaded() { - const ComposeContainer = require('themes/glitch/containers/compose_container').default; + const ComposeContainer = require('flavours/glitch/containers/compose_container').default; const React = require('react'); const ReactDOM = require('react-dom'); const mountNode = document.getElementById('mastodon-compose'); @@ -13,7 +13,7 @@ function loaded() { } function main() { - const ready = require('themes/glitch/util/ready').default; + const ready = require('flavours/glitch/util/ready').default; ready(loaded); } diff --git a/app/javascript/themes/glitch/reducers/accounts.js b/app/javascript/flavours/glitch/reducers/accounts.js similarity index 85% rename from app/javascript/themes/glitch/reducers/accounts.js rename to app/javascript/flavours/glitch/reducers/accounts.js index 0a65d3723..5113a281a 100644 --- a/app/javascript/themes/glitch/reducers/accounts.js +++ b/app/javascript/flavours/glitch/reducers/accounts.js @@ -6,16 +6,16 @@ import { FOLLOWING_EXPAND_SUCCESS, FOLLOW_REQUESTS_FETCH_SUCCESS, FOLLOW_REQUESTS_EXPAND_SUCCESS, -} from 'themes/glitch/actions/accounts'; +} from 'flavours/glitch/actions/accounts'; import { BLOCKS_FETCH_SUCCESS, BLOCKS_EXPAND_SUCCESS, -} from 'themes/glitch/actions/blocks'; +} from 'flavours/glitch/actions/blocks'; import { MUTES_FETCH_SUCCESS, MUTES_EXPAND_SUCCESS, -} from 'themes/glitch/actions/mutes'; -import { COMPOSE_SUGGESTIONS_READY } from 'themes/glitch/actions/compose'; +} from 'flavours/glitch/actions/mutes'; +import { COMPOSE_SUGGESTIONS_READY } from 'flavours/glitch/actions/compose'; import { REBLOG_SUCCESS, UNREBLOG_SUCCESS, @@ -23,28 +23,28 @@ import { UNFAVOURITE_SUCCESS, REBLOGS_FETCH_SUCCESS, FAVOURITES_FETCH_SUCCESS, -} from 'themes/glitch/actions/interactions'; +} from 'flavours/glitch/actions/interactions'; import { TIMELINE_REFRESH_SUCCESS, TIMELINE_UPDATE, TIMELINE_EXPAND_SUCCESS, -} from 'themes/glitch/actions/timelines'; +} from 'flavours/glitch/actions/timelines'; import { STATUS_FETCH_SUCCESS, CONTEXT_FETCH_SUCCESS, -} from 'themes/glitch/actions/statuses'; -import { SEARCH_FETCH_SUCCESS } from 'themes/glitch/actions/search'; +} from 'flavours/glitch/actions/statuses'; +import { SEARCH_FETCH_SUCCESS } from 'flavours/glitch/actions/search'; import { NOTIFICATIONS_UPDATE, NOTIFICATIONS_REFRESH_SUCCESS, NOTIFICATIONS_EXPAND_SUCCESS, -} from 'themes/glitch/actions/notifications'; +} from 'flavours/glitch/actions/notifications'; import { FAVOURITED_STATUSES_FETCH_SUCCESS, FAVOURITED_STATUSES_EXPAND_SUCCESS, -} from 'themes/glitch/actions/favourites'; -import { STORE_HYDRATE } from 'themes/glitch/actions/store'; -import emojify from 'themes/glitch/util/emoji'; +} from 'flavours/glitch/actions/favourites'; +import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; +import emojify from 'flavours/glitch/util/emoji'; import { Map as ImmutableMap, fromJS } from 'immutable'; import escapeTextContentForBrowser from 'escape-html'; diff --git a/app/javascript/themes/glitch/reducers/accounts_counters.js b/app/javascript/flavours/glitch/reducers/accounts_counters.js similarity index 87% rename from app/javascript/themes/glitch/reducers/accounts_counters.js rename to app/javascript/flavours/glitch/reducers/accounts_counters.js index e3728ecd7..a9aebd26f 100644 --- a/app/javascript/themes/glitch/reducers/accounts_counters.js +++ b/app/javascript/flavours/glitch/reducers/accounts_counters.js @@ -8,16 +8,16 @@ import { FOLLOW_REQUESTS_EXPAND_SUCCESS, ACCOUNT_FOLLOW_SUCCESS, ACCOUNT_UNFOLLOW_SUCCESS, -} from 'themes/glitch/actions/accounts'; +} from 'flavours/glitch/actions/accounts'; import { BLOCKS_FETCH_SUCCESS, BLOCKS_EXPAND_SUCCESS, -} from 'themes/glitch/actions/blocks'; +} from 'flavours/glitch/actions/blocks'; import { MUTES_FETCH_SUCCESS, MUTES_EXPAND_SUCCESS, -} from 'themes/glitch/actions/mutes'; -import { COMPOSE_SUGGESTIONS_READY } from 'themes/glitch/actions/compose'; +} from 'flavours/glitch/actions/mutes'; +import { COMPOSE_SUGGESTIONS_READY } from 'flavours/glitch/actions/compose'; import { REBLOG_SUCCESS, UNREBLOG_SUCCESS, @@ -25,27 +25,27 @@ import { UNFAVOURITE_SUCCESS, REBLOGS_FETCH_SUCCESS, FAVOURITES_FETCH_SUCCESS, -} from 'themes/glitch/actions/interactions'; +} from 'flavours/glitch/actions/interactions'; import { TIMELINE_REFRESH_SUCCESS, TIMELINE_UPDATE, TIMELINE_EXPAND_SUCCESS, -} from 'themes/glitch/actions/timelines'; +} from 'flavours/glitch/actions/timelines'; import { STATUS_FETCH_SUCCESS, CONTEXT_FETCH_SUCCESS, -} from 'themes/glitch/actions/statuses'; -import { SEARCH_FETCH_SUCCESS } from 'themes/glitch/actions/search'; +} from 'flavours/glitch/actions/statuses'; +import { SEARCH_FETCH_SUCCESS } from 'flavours/glitch/actions/search'; import { NOTIFICATIONS_UPDATE, NOTIFICATIONS_REFRESH_SUCCESS, NOTIFICATIONS_EXPAND_SUCCESS, -} from 'themes/glitch/actions/notifications'; +} from 'flavours/glitch/actions/notifications'; import { FAVOURITED_STATUSES_FETCH_SUCCESS, FAVOURITED_STATUSES_EXPAND_SUCCESS, -} from 'themes/glitch/actions/favourites'; -import { STORE_HYDRATE } from 'themes/glitch/actions/store'; +} from 'flavours/glitch/actions/favourites'; +import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; import { Map as ImmutableMap, fromJS } from 'immutable'; const normalizeAccount = (state, account) => state.set(account.id, fromJS({ diff --git a/app/javascript/themes/glitch/reducers/alerts.js b/app/javascript/flavours/glitch/reducers/alerts.js similarity index 93% rename from app/javascript/themes/glitch/reducers/alerts.js rename to app/javascript/flavours/glitch/reducers/alerts.js index ad66b63f6..50f8d30f7 100644 --- a/app/javascript/themes/glitch/reducers/alerts.js +++ b/app/javascript/flavours/glitch/reducers/alerts.js @@ -2,7 +2,7 @@ import { ALERT_SHOW, ALERT_DISMISS, ALERT_CLEAR, -} from 'themes/glitch/actions/alerts'; +} from 'flavours/glitch/actions/alerts'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; const initialState = ImmutableList([]); diff --git a/app/javascript/themes/glitch/reducers/cards.js b/app/javascript/flavours/glitch/reducers/cards.js similarity index 80% rename from app/javascript/themes/glitch/reducers/cards.js rename to app/javascript/flavours/glitch/reducers/cards.js index 35be30444..92ecfd086 100644 --- a/app/javascript/themes/glitch/reducers/cards.js +++ b/app/javascript/flavours/glitch/reducers/cards.js @@ -1,4 +1,4 @@ -import { STATUS_CARD_FETCH_SUCCESS } from 'themes/glitch/actions/cards'; +import { STATUS_CARD_FETCH_SUCCESS } from 'flavours/glitch/actions/cards'; import { Map as ImmutableMap, fromJS } from 'immutable'; diff --git a/app/javascript/themes/glitch/reducers/compose.js b/app/javascript/flavours/glitch/reducers/compose.js similarity index 97% rename from app/javascript/themes/glitch/reducers/compose.js rename to app/javascript/flavours/glitch/reducers/compose.js index be359fcb4..aaa36b696 100644 --- a/app/javascript/themes/glitch/reducers/compose.js +++ b/app/javascript/flavours/glitch/reducers/compose.js @@ -28,12 +28,12 @@ import { COMPOSE_UPLOAD_CHANGE_FAIL, COMPOSE_DOODLE_SET, COMPOSE_RESET, -} from 'themes/glitch/actions/compose'; -import { TIMELINE_DELETE } from 'themes/glitch/actions/timelines'; -import { STORE_HYDRATE } from 'themes/glitch/actions/store'; +} from 'flavours/glitch/actions/compose'; +import { TIMELINE_DELETE } from 'flavours/glitch/actions/timelines'; +import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable'; -import uuid from 'themes/glitch/util/uuid'; -import { me } from 'themes/glitch/util/initial_state'; +import uuid from 'flavours/glitch/util/uuid'; +import { me } from 'flavours/glitch/util/initial_state'; const initialState = ImmutableMap({ mounted: false, diff --git a/app/javascript/themes/glitch/reducers/contexts.js b/app/javascript/flavours/glitch/reducers/contexts.js similarity index 91% rename from app/javascript/themes/glitch/reducers/contexts.js rename to app/javascript/flavours/glitch/reducers/contexts.js index 56c930bd5..53e93a589 100644 --- a/app/javascript/themes/glitch/reducers/contexts.js +++ b/app/javascript/flavours/glitch/reducers/contexts.js @@ -1,5 +1,5 @@ -import { CONTEXT_FETCH_SUCCESS } from 'themes/glitch/actions/statuses'; -import { TIMELINE_DELETE, TIMELINE_CONTEXT_UPDATE } from 'themes/glitch/actions/timelines'; +import { CONTEXT_FETCH_SUCCESS } from 'flavours/glitch/actions/statuses'; +import { TIMELINE_DELETE, TIMELINE_CONTEXT_UPDATE } from 'flavours/glitch/actions/timelines'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; const initialState = ImmutableMap({ diff --git a/app/javascript/themes/glitch/reducers/custom_emojis.js b/app/javascript/flavours/glitch/reducers/custom_emojis.js similarity index 63% rename from app/javascript/themes/glitch/reducers/custom_emojis.js rename to app/javascript/flavours/glitch/reducers/custom_emojis.js index e3f1e0018..592cea8dc 100644 --- a/app/javascript/themes/glitch/reducers/custom_emojis.js +++ b/app/javascript/flavours/glitch/reducers/custom_emojis.js @@ -1,7 +1,7 @@ import { List as ImmutableList } from 'immutable'; -import { STORE_HYDRATE } from 'themes/glitch/actions/store'; -import { search as emojiSearch } from 'themes/glitch/util/emoji/emoji_mart_search_light'; -import { buildCustomEmojis } from 'themes/glitch/util/emoji'; +import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; +import { search as emojiSearch } from 'flavours/glitch/util/emoji/emoji_mart_search_light'; +import { buildCustomEmojis } from 'flavours/glitch/util/emoji'; const initialState = ImmutableList(); diff --git a/app/javascript/themes/glitch/reducers/height_cache.js b/app/javascript/flavours/glitch/reducers/height_cache.js similarity index 85% rename from app/javascript/themes/glitch/reducers/height_cache.js rename to app/javascript/flavours/glitch/reducers/height_cache.js index 93c31b42c..8b05e0b19 100644 --- a/app/javascript/themes/glitch/reducers/height_cache.js +++ b/app/javascript/flavours/glitch/reducers/height_cache.js @@ -1,5 +1,5 @@ import { Map as ImmutableMap } from 'immutable'; -import { HEIGHT_CACHE_SET, HEIGHT_CACHE_CLEAR } from 'themes/glitch/actions/height_cache'; +import { HEIGHT_CACHE_SET, HEIGHT_CACHE_CLEAR } from 'flavours/glitch/actions/height_cache'; const initialState = ImmutableMap(); diff --git a/app/javascript/themes/glitch/reducers/index.js b/app/javascript/flavours/glitch/reducers/index.js similarity index 100% rename from app/javascript/themes/glitch/reducers/index.js rename to app/javascript/flavours/glitch/reducers/index.js diff --git a/app/javascript/themes/glitch/reducers/local_settings.js b/app/javascript/flavours/glitch/reducers/local_settings.js similarity index 88% rename from app/javascript/themes/glitch/reducers/local_settings.js rename to app/javascript/flavours/glitch/reducers/local_settings.js index b1ffa047e..69d98741b 100644 --- a/app/javascript/themes/glitch/reducers/local_settings.js +++ b/app/javascript/flavours/glitch/reducers/local_settings.js @@ -2,8 +2,8 @@ import { Map as ImmutableMap } from 'immutable'; // Our imports. -import { STORE_HYDRATE } from 'themes/glitch/actions/store'; -import { LOCAL_SETTING_CHANGE } from 'themes/glitch/actions/local_settings'; +import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; +import { LOCAL_SETTING_CHANGE } from 'flavours/glitch/actions/local_settings'; const initialState = ImmutableMap({ layout : 'auto', diff --git a/app/javascript/themes/glitch/reducers/media_attachments.js b/app/javascript/flavours/glitch/reducers/media_attachments.js similarity index 83% rename from app/javascript/themes/glitch/reducers/media_attachments.js rename to app/javascript/flavours/glitch/reducers/media_attachments.js index 69a44639c..6e6058576 100644 --- a/app/javascript/themes/glitch/reducers/media_attachments.js +++ b/app/javascript/flavours/glitch/reducers/media_attachments.js @@ -1,4 +1,4 @@ -import { STORE_HYDRATE } from 'themes/glitch/actions/store'; +import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; import { Map as ImmutableMap } from 'immutable'; const initialState = ImmutableMap({ diff --git a/app/javascript/themes/glitch/reducers/meta.js b/app/javascript/flavours/glitch/reducers/meta.js similarity index 84% rename from app/javascript/themes/glitch/reducers/meta.js rename to app/javascript/flavours/glitch/reducers/meta.js index 2249f1d78..a98dc436a 100644 --- a/app/javascript/themes/glitch/reducers/meta.js +++ b/app/javascript/flavours/glitch/reducers/meta.js @@ -1,4 +1,4 @@ -import { STORE_HYDRATE } from 'themes/glitch/actions/store'; +import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; import { Map as ImmutableMap } from 'immutable'; const initialState = ImmutableMap({ diff --git a/app/javascript/themes/glitch/reducers/modal.js b/app/javascript/flavours/glitch/reducers/modal.js similarity index 81% rename from app/javascript/themes/glitch/reducers/modal.js rename to app/javascript/flavours/glitch/reducers/modal.js index 97fb31203..80bc11dda 100644 --- a/app/javascript/themes/glitch/reducers/modal.js +++ b/app/javascript/flavours/glitch/reducers/modal.js @@ -1,4 +1,4 @@ -import { MODAL_OPEN, MODAL_CLOSE } from 'themes/glitch/actions/modal'; +import { MODAL_OPEN, MODAL_CLOSE } from 'flavours/glitch/actions/modal'; const initialState = { modalType: null, diff --git a/app/javascript/themes/glitch/reducers/mutes.js b/app/javascript/flavours/glitch/reducers/mutes.js similarity index 94% rename from app/javascript/themes/glitch/reducers/mutes.js rename to app/javascript/flavours/glitch/reducers/mutes.js index 8fe4ae0c3..8f52a7704 100644 --- a/app/javascript/themes/glitch/reducers/mutes.js +++ b/app/javascript/flavours/glitch/reducers/mutes.js @@ -3,7 +3,7 @@ import Immutable from 'immutable'; import { MUTES_INIT_MODAL, MUTES_TOGGLE_HIDE_NOTIFICATIONS, -} from 'themes/glitch/actions/mutes'; +} from 'flavours/glitch/actions/mutes'; const initialState = Immutable.Map({ new: Immutable.Map({ diff --git a/app/javascript/themes/glitch/reducers/notifications.js b/app/javascript/flavours/glitch/reducers/notifications.js similarity index 97% rename from app/javascript/themes/glitch/reducers/notifications.js rename to app/javascript/flavours/glitch/reducers/notifications.js index c4f505053..fb2b3f549 100644 --- a/app/javascript/themes/glitch/reducers/notifications.js +++ b/app/javascript/flavours/glitch/reducers/notifications.js @@ -14,12 +14,12 @@ import { NOTIFICATIONS_DELETE_MARKED_FAIL, NOTIFICATIONS_ENTER_CLEARING_MODE, NOTIFICATIONS_MARK_ALL_FOR_DELETE, -} from 'themes/glitch/actions/notifications'; +} from 'flavours/glitch/actions/notifications'; import { ACCOUNT_BLOCK_SUCCESS, ACCOUNT_MUTE_SUCCESS, -} from 'themes/glitch/actions/accounts'; -import { TIMELINE_DELETE } from 'themes/glitch/actions/timelines'; +} from 'flavours/glitch/actions/accounts'; +import { TIMELINE_DELETE } from 'flavours/glitch/actions/timelines'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; const initialState = ImmutableMap({ diff --git a/app/javascript/themes/glitch/reducers/push_notifications.js b/app/javascript/flavours/glitch/reducers/push_notifications.js similarity index 91% rename from app/javascript/themes/glitch/reducers/push_notifications.js rename to app/javascript/flavours/glitch/reducers/push_notifications.js index 744e4a0eb..f0a800d23 100644 --- a/app/javascript/themes/glitch/reducers/push_notifications.js +++ b/app/javascript/flavours/glitch/reducers/push_notifications.js @@ -1,5 +1,5 @@ -import { STORE_HYDRATE } from 'themes/glitch/actions/store'; -import { SET_BROWSER_SUPPORT, SET_SUBSCRIPTION, CLEAR_SUBSCRIPTION, ALERTS_CHANGE } from 'themes/glitch/actions/push_notifications'; +import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; +import { SET_BROWSER_SUPPORT, SET_SUBSCRIPTION, CLEAR_SUBSCRIPTION, ALERTS_CHANGE } from 'flavours/glitch/actions/push_notifications'; import Immutable from 'immutable'; const initialState = Immutable.Map({ diff --git a/app/javascript/themes/glitch/reducers/relationships.js b/app/javascript/flavours/glitch/reducers/relationships.js similarity index 93% rename from app/javascript/themes/glitch/reducers/relationships.js rename to app/javascript/flavours/glitch/reducers/relationships.js index d9135d6da..6303089ac 100644 --- a/app/javascript/themes/glitch/reducers/relationships.js +++ b/app/javascript/flavours/glitch/reducers/relationships.js @@ -6,11 +6,11 @@ import { ACCOUNT_MUTE_SUCCESS, ACCOUNT_UNMUTE_SUCCESS, RELATIONSHIPS_FETCH_SUCCESS, -} from 'themes/glitch/actions/accounts'; +} from 'flavours/glitch/actions/accounts'; import { DOMAIN_BLOCK_SUCCESS, DOMAIN_UNBLOCK_SUCCESS, -} from 'themes/glitch/actions/domain_blocks'; +} from 'flavours/glitch/actions/domain_blocks'; import { Map as ImmutableMap, fromJS } from 'immutable'; const normalizeRelationship = (state, relationship) => state.set(relationship.id, fromJS(relationship)); diff --git a/app/javascript/themes/glitch/reducers/reports.js b/app/javascript/flavours/glitch/reducers/reports.js similarity index 97% rename from app/javascript/themes/glitch/reducers/reports.js rename to app/javascript/flavours/glitch/reducers/reports.js index b714374ea..c18fbcdc6 100644 --- a/app/javascript/themes/glitch/reducers/reports.js +++ b/app/javascript/flavours/glitch/reducers/reports.js @@ -6,7 +6,7 @@ import { REPORT_CANCEL, REPORT_STATUS_TOGGLE, REPORT_COMMENT_CHANGE, -} from 'themes/glitch/actions/reports'; +} from 'flavours/glitch/actions/reports'; import { Map as ImmutableMap, Set as ImmutableSet } from 'immutable'; const initialState = ImmutableMap({ diff --git a/app/javascript/themes/glitch/reducers/search.js b/app/javascript/flavours/glitch/reducers/search.js similarity index 90% rename from app/javascript/themes/glitch/reducers/search.js rename to app/javascript/flavours/glitch/reducers/search.js index aec9e2efb..f9bf92098 100644 --- a/app/javascript/themes/glitch/reducers/search.js +++ b/app/javascript/flavours/glitch/reducers/search.js @@ -3,8 +3,8 @@ import { SEARCH_CLEAR, SEARCH_FETCH_SUCCESS, SEARCH_SHOW, -} from 'themes/glitch/actions/search'; -import { COMPOSE_MENTION, COMPOSE_REPLY } from 'themes/glitch/actions/compose'; +} from 'flavours/glitch/actions/search'; +import { COMPOSE_MENTION, COMPOSE_REPLY } from 'flavours/glitch/actions/compose'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; const initialState = ImmutableMap({ diff --git a/app/javascript/themes/glitch/reducers/settings.js b/app/javascript/flavours/glitch/reducers/settings.js similarity index 88% rename from app/javascript/themes/glitch/reducers/settings.js rename to app/javascript/flavours/glitch/reducers/settings.js index c22bbbd8d..ceafbc467 100644 --- a/app/javascript/themes/glitch/reducers/settings.js +++ b/app/javascript/flavours/glitch/reducers/settings.js @@ -1,9 +1,9 @@ -import { SETTING_CHANGE, SETTING_SAVE } from 'themes/glitch/actions/settings'; -import { COLUMN_ADD, COLUMN_REMOVE, COLUMN_MOVE } from 'themes/glitch/actions/columns'; -import { STORE_HYDRATE } from 'themes/glitch/actions/store'; -import { EMOJI_USE } from 'themes/glitch/actions/emojis'; +import { SETTING_CHANGE, SETTING_SAVE } from 'flavours/glitch/actions/settings'; +import { COLUMN_ADD, COLUMN_REMOVE, COLUMN_MOVE } from 'flavours/glitch/actions/columns'; +import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; +import { EMOJI_USE } from 'flavours/glitch/actions/emojis'; import { Map as ImmutableMap, fromJS } from 'immutable'; -import uuid from 'themes/glitch/util/uuid'; +import uuid from 'flavours/glitch/util/uuid'; const initialState = ImmutableMap({ saved: true, diff --git a/app/javascript/themes/glitch/reducers/status_lists.js b/app/javascript/flavours/glitch/reducers/status_lists.js similarity index 94% rename from app/javascript/themes/glitch/reducers/status_lists.js rename to app/javascript/flavours/glitch/reducers/status_lists.js index 8dc7d374e..5a3d0db0c 100644 --- a/app/javascript/themes/glitch/reducers/status_lists.js +++ b/app/javascript/flavours/glitch/reducers/status_lists.js @@ -1,17 +1,17 @@ import { FAVOURITED_STATUSES_FETCH_SUCCESS, FAVOURITED_STATUSES_EXPAND_SUCCESS, -} from 'themes/glitch/actions/favourites'; +} from 'flavours/glitch/actions/favourites'; import { PINNED_STATUSES_FETCH_SUCCESS, -} from 'themes/glitch/actions/pin_statuses'; +} from 'flavours/glitch/actions/pin_statuses'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; import { FAVOURITE_SUCCESS, UNFAVOURITE_SUCCESS, PIN_SUCCESS, UNPIN_SUCCESS, -} from 'themes/glitch/actions/interactions'; +} from 'flavours/glitch/actions/interactions'; const initialState = ImmutableMap({ favourites: ImmutableMap({ diff --git a/app/javascript/themes/glitch/reducers/statuses.js b/app/javascript/flavours/glitch/reducers/statuses.js similarity index 90% rename from app/javascript/themes/glitch/reducers/statuses.js rename to app/javascript/flavours/glitch/reducers/statuses.js index ef8086865..410bc013b 100644 --- a/app/javascript/themes/glitch/reducers/statuses.js +++ b/app/javascript/flavours/glitch/reducers/statuses.js @@ -9,37 +9,37 @@ import { UNFAVOURITE_SUCCESS, PIN_SUCCESS, UNPIN_SUCCESS, -} from 'themes/glitch/actions/interactions'; +} from 'flavours/glitch/actions/interactions'; import { STATUS_FETCH_SUCCESS, CONTEXT_FETCH_SUCCESS, STATUS_MUTE_SUCCESS, STATUS_UNMUTE_SUCCESS, -} from 'themes/glitch/actions/statuses'; +} from 'flavours/glitch/actions/statuses'; import { TIMELINE_REFRESH_SUCCESS, TIMELINE_UPDATE, TIMELINE_DELETE, TIMELINE_EXPAND_SUCCESS, -} from 'themes/glitch/actions/timelines'; +} from 'flavours/glitch/actions/timelines'; import { ACCOUNT_BLOCK_SUCCESS, ACCOUNT_MUTE_SUCCESS, -} from 'themes/glitch/actions/accounts'; +} from 'flavours/glitch/actions/accounts'; import { NOTIFICATIONS_UPDATE, NOTIFICATIONS_REFRESH_SUCCESS, NOTIFICATIONS_EXPAND_SUCCESS, -} from 'themes/glitch/actions/notifications'; +} from 'flavours/glitch/actions/notifications'; import { FAVOURITED_STATUSES_FETCH_SUCCESS, FAVOURITED_STATUSES_EXPAND_SUCCESS, -} from 'themes/glitch/actions/favourites'; +} from 'flavours/glitch/actions/favourites'; import { PINNED_STATUSES_FETCH_SUCCESS, -} from 'themes/glitch/actions/pin_statuses'; -import { SEARCH_FETCH_SUCCESS } from 'themes/glitch/actions/search'; -import emojify from 'themes/glitch/util/emoji'; +} from 'flavours/glitch/actions/pin_statuses'; +import { SEARCH_FETCH_SUCCESS } from 'flavours/glitch/actions/search'; +import emojify from 'flavours/glitch/util/emoji'; import { Map as ImmutableMap, fromJS } from 'immutable'; import escapeTextContentForBrowser from 'escape-html'; diff --git a/app/javascript/themes/glitch/reducers/timelines.js b/app/javascript/flavours/glitch/reducers/timelines.js similarity index 98% rename from app/javascript/themes/glitch/reducers/timelines.js rename to app/javascript/flavours/glitch/reducers/timelines.js index 7f19a1897..679e1601e 100644 --- a/app/javascript/themes/glitch/reducers/timelines.js +++ b/app/javascript/flavours/glitch/reducers/timelines.js @@ -10,12 +10,12 @@ import { TIMELINE_SCROLL_TOP, TIMELINE_CONNECT, TIMELINE_DISCONNECT, -} from 'themes/glitch/actions/timelines'; +} from 'flavours/glitch/actions/timelines'; import { ACCOUNT_BLOCK_SUCCESS, ACCOUNT_MUTE_SUCCESS, ACCOUNT_UNFOLLOW_SUCCESS, -} from 'themes/glitch/actions/accounts'; +} from 'flavours/glitch/actions/accounts'; import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable'; const initialState = ImmutableMap(); diff --git a/app/javascript/themes/glitch/reducers/user_lists.js b/app/javascript/flavours/glitch/reducers/user_lists.js similarity index 95% rename from app/javascript/themes/glitch/reducers/user_lists.js rename to app/javascript/flavours/glitch/reducers/user_lists.js index 8c3a7d748..a4df9ec8d 100644 --- a/app/javascript/themes/glitch/reducers/user_lists.js +++ b/app/javascript/flavours/glitch/reducers/user_lists.js @@ -7,19 +7,19 @@ import { FOLLOW_REQUESTS_EXPAND_SUCCESS, FOLLOW_REQUEST_AUTHORIZE_SUCCESS, FOLLOW_REQUEST_REJECT_SUCCESS, -} from 'themes/glitch/actions/accounts'; +} from 'flavours/glitch/actions/accounts'; import { REBLOGS_FETCH_SUCCESS, FAVOURITES_FETCH_SUCCESS, -} from 'themes/glitch/actions/interactions'; +} from 'flavours/glitch/actions/interactions'; import { BLOCKS_FETCH_SUCCESS, BLOCKS_EXPAND_SUCCESS, -} from 'themes/glitch/actions/blocks'; +} from 'flavours/glitch/actions/blocks'; import { MUTES_FETCH_SUCCESS, MUTES_EXPAND_SUCCESS, -} from 'themes/glitch/actions/mutes'; +} from 'flavours/glitch/actions/mutes'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; const initialState = ImmutableMap({ diff --git a/app/javascript/themes/glitch/selectors/index.js b/app/javascript/flavours/glitch/selectors/index.js similarity index 100% rename from app/javascript/themes/glitch/selectors/index.js rename to app/javascript/flavours/glitch/selectors/index.js diff --git a/app/javascript/themes/glitch/service_worker/entry.js b/app/javascript/flavours/glitch/service_worker/entry.js similarity index 100% rename from app/javascript/themes/glitch/service_worker/entry.js rename to app/javascript/flavours/glitch/service_worker/entry.js diff --git a/app/javascript/themes/glitch/service_worker/web_push_notifications.js b/app/javascript/flavours/glitch/service_worker/web_push_notifications.js similarity index 100% rename from app/javascript/themes/glitch/service_worker/web_push_notifications.js rename to app/javascript/flavours/glitch/service_worker/web_push_notifications.js diff --git a/app/javascript/themes/glitch/store/configureStore.js b/app/javascript/flavours/glitch/store/configureStore.js similarity index 100% rename from app/javascript/themes/glitch/store/configureStore.js rename to app/javascript/flavours/glitch/store/configureStore.js diff --git a/app/javascript/themes/glitch/styles/_mixins.scss b/app/javascript/flavours/glitch/styles/_mixins.scss similarity index 100% rename from app/javascript/themes/glitch/styles/_mixins.scss rename to app/javascript/flavours/glitch/styles/_mixins.scss diff --git a/app/javascript/themes/glitch/styles/about.scss b/app/javascript/flavours/glitch/styles/about.scss similarity index 100% rename from app/javascript/themes/glitch/styles/about.scss rename to app/javascript/flavours/glitch/styles/about.scss diff --git a/app/javascript/themes/glitch/styles/accounts.scss b/app/javascript/flavours/glitch/styles/accounts.scss similarity index 100% rename from app/javascript/themes/glitch/styles/accounts.scss rename to app/javascript/flavours/glitch/styles/accounts.scss diff --git a/app/javascript/themes/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss similarity index 100% rename from app/javascript/themes/glitch/styles/admin.scss rename to app/javascript/flavours/glitch/styles/admin.scss diff --git a/app/javascript/themes/glitch/styles/basics.scss b/app/javascript/flavours/glitch/styles/basics.scss similarity index 100% rename from app/javascript/themes/glitch/styles/basics.scss rename to app/javascript/flavours/glitch/styles/basics.scss diff --git a/app/javascript/themes/glitch/styles/boost.scss b/app/javascript/flavours/glitch/styles/boost.scss similarity index 100% rename from app/javascript/themes/glitch/styles/boost.scss rename to app/javascript/flavours/glitch/styles/boost.scss diff --git a/app/javascript/themes/glitch/styles/compact_header.scss b/app/javascript/flavours/glitch/styles/compact_header.scss similarity index 100% rename from app/javascript/themes/glitch/styles/compact_header.scss rename to app/javascript/flavours/glitch/styles/compact_header.scss diff --git a/app/javascript/themes/glitch/styles/components.scss b/app/javascript/flavours/glitch/styles/components.scss similarity index 100% rename from app/javascript/themes/glitch/styles/components.scss rename to app/javascript/flavours/glitch/styles/components.scss diff --git a/app/javascript/themes/glitch/styles/containers.scss b/app/javascript/flavours/glitch/styles/containers.scss similarity index 100% rename from app/javascript/themes/glitch/styles/containers.scss rename to app/javascript/flavours/glitch/styles/containers.scss diff --git a/app/javascript/themes/glitch/styles/doodle.scss b/app/javascript/flavours/glitch/styles/doodle.scss similarity index 100% rename from app/javascript/themes/glitch/styles/doodle.scss rename to app/javascript/flavours/glitch/styles/doodle.scss diff --git a/app/javascript/themes/glitch/styles/emoji_picker.scss b/app/javascript/flavours/glitch/styles/emoji_picker.scss similarity index 100% rename from app/javascript/themes/glitch/styles/emoji_picker.scss rename to app/javascript/flavours/glitch/styles/emoji_picker.scss diff --git a/app/javascript/themes/glitch/styles/footer.scss b/app/javascript/flavours/glitch/styles/footer.scss similarity index 100% rename from app/javascript/themes/glitch/styles/footer.scss rename to app/javascript/flavours/glitch/styles/footer.scss diff --git a/app/javascript/themes/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss similarity index 100% rename from app/javascript/themes/glitch/styles/forms.scss rename to app/javascript/flavours/glitch/styles/forms.scss diff --git a/app/javascript/themes/glitch/styles/index.scss b/app/javascript/flavours/glitch/styles/index.scss similarity index 100% rename from app/javascript/themes/glitch/styles/index.scss rename to app/javascript/flavours/glitch/styles/index.scss diff --git a/app/javascript/themes/glitch/styles/landing_strip.scss b/app/javascript/flavours/glitch/styles/landing_strip.scss similarity index 100% rename from app/javascript/themes/glitch/styles/landing_strip.scss rename to app/javascript/flavours/glitch/styles/landing_strip.scss diff --git a/app/javascript/themes/glitch/styles/lists.scss b/app/javascript/flavours/glitch/styles/lists.scss similarity index 100% rename from app/javascript/themes/glitch/styles/lists.scss rename to app/javascript/flavours/glitch/styles/lists.scss diff --git a/app/javascript/themes/glitch/styles/reset copy.scss b/app/javascript/flavours/glitch/styles/reset copy.scss similarity index 100% rename from app/javascript/themes/glitch/styles/reset copy.scss rename to app/javascript/flavours/glitch/styles/reset copy.scss diff --git a/app/javascript/themes/glitch/styles/reset.scss b/app/javascript/flavours/glitch/styles/reset.scss similarity index 100% rename from app/javascript/themes/glitch/styles/reset.scss rename to app/javascript/flavours/glitch/styles/reset.scss diff --git a/app/javascript/themes/glitch/styles/rtl.scss b/app/javascript/flavours/glitch/styles/rtl.scss similarity index 100% rename from app/javascript/themes/glitch/styles/rtl.scss rename to app/javascript/flavours/glitch/styles/rtl.scss diff --git a/app/javascript/themes/glitch/styles/stream_entries.scss b/app/javascript/flavours/glitch/styles/stream_entries.scss similarity index 100% rename from app/javascript/themes/glitch/styles/stream_entries.scss rename to app/javascript/flavours/glitch/styles/stream_entries.scss diff --git a/app/javascript/themes/glitch/styles/tables.scss b/app/javascript/flavours/glitch/styles/tables.scss similarity index 100% rename from app/javascript/themes/glitch/styles/tables.scss rename to app/javascript/flavours/glitch/styles/tables.scss diff --git a/app/javascript/themes/glitch/styles/variables.scss b/app/javascript/flavours/glitch/styles/variables.scss similarity index 100% rename from app/javascript/themes/glitch/styles/variables.scss rename to app/javascript/flavours/glitch/styles/variables.scss diff --git a/app/javascript/themes/glitch/theme.yml b/app/javascript/flavours/glitch/theme.yml similarity index 83% rename from app/javascript/themes/glitch/theme.yml rename to app/javascript/flavours/glitch/theme.yml index ac6f57546..9d24f0107 100644 --- a/app/javascript/themes/glitch/theme.yml +++ b/app/javascript/flavours/glitch/theme.yml @@ -11,10 +11,10 @@ pack: home: filename: packs/home.js preload: - - themes/glitch/async/getting_started - - themes/glitch/async/compose - - themes/glitch/async/home_timeline - - themes/glitch/async/notifications + - flavours/glitch/async/getting_started + - flavours/glitch/async/compose + - flavours/glitch/async/home_timeline + - flavours/glitch/async/notifications stylesheet: true modal: public: packs/public.js diff --git a/app/javascript/themes/glitch/util/api.js b/app/javascript/flavours/glitch/util/api.js similarity index 100% rename from app/javascript/themes/glitch/util/api.js rename to app/javascript/flavours/glitch/util/api.js diff --git a/app/javascript/flavours/glitch/util/async-components.js b/app/javascript/flavours/glitch/util/async-components.js new file mode 100644 index 000000000..b7ac4d3ec --- /dev/null +++ b/app/javascript/flavours/glitch/util/async-components.js @@ -0,0 +1,115 @@ +export function EmojiPicker () { + return import(/* webpackChunkName: "flavours/glitch/async/emoji_picker" */'flavours/glitch/util/emoji/emoji_picker'); +} + +export function Compose () { + return import(/* webpackChunkName: "flavours/glitch/async/compose" */'flavours/glitch/features/compose'); +} + +export function Notifications () { + return import(/* webpackChunkName: "flavours/glitch/async/notifications" */'flavours/glitch/features/notifications'); +} + +export function HomeTimeline () { + return import(/* webpackChunkName: "flavours/glitch/async/home_timeline" */'flavours/glitch/features/home_timeline'); +} + +export function PublicTimeline () { + return import(/* webpackChunkName: "flavours/glitch/async/public_timeline" */'flavours/glitch/features/public_timeline'); +} + +export function CommunityTimeline () { + return import(/* webpackChunkName: "flavours/glitch/async/community_timeline" */'flavours/glitch/features/community_timeline'); +} + +export function HashtagTimeline () { + return import(/* webpackChunkName: "flavours/glitch/async/hashtag_timeline" */'flavours/glitch/features/hashtag_timeline'); +} + +export function DirectTimeline() { + return import(/* webpackChunkName: "flavours/glitch/async/direct_timeline" */'flavours/glitch/features/direct_timeline'); +} + +export function Status () { + return import(/* webpackChunkName: "flavours/glitch/async/status" */'flavours/glitch/features/status'); +} + +export function GettingStarted () { + return import(/* webpackChunkName: "flavours/glitch/async/getting_started" */'flavours/glitch/features/getting_started'); +} + +export function PinnedStatuses () { + return import(/* webpackChunkName: "flavours/glitch/async/pinned_statuses" */'flavours/glitch/features/pinned_statuses'); +} + +export function AccountTimeline () { + return import(/* webpackChunkName: "flavours/glitch/async/account_timeline" */'flavours/glitch/features/account_timeline'); +} + +export function AccountGallery () { + return import(/* webpackChunkName: "flavours/glitch/async/account_gallery" */'flavours/glitch/features/account_gallery'); +} + +export function Followers () { + return import(/* webpackChunkName: "flavours/glitch/async/followers" */'flavours/glitch/features/followers'); +} + +export function Following () { + return import(/* webpackChunkName: "flavours/glitch/async/following" */'flavours/glitch/features/following'); +} + +export function Reblogs () { + return import(/* webpackChunkName: "flavours/glitch/async/reblogs" */'flavours/glitch/features/reblogs'); +} + +export function Favourites () { + return import(/* webpackChunkName: "flavours/glitch/async/favourites" */'flavours/glitch/features/favourites'); +} + +export function FollowRequests () { + return import(/* webpackChunkName: "flavours/glitch/async/follow_requests" */'flavours/glitch/features/follow_requests'); +} + +export function GenericNotFound () { + return import(/* webpackChunkName: "flavours/glitch/async/generic_not_found" */'flavours/glitch/features/generic_not_found'); +} + +export function FavouritedStatuses () { + return import(/* webpackChunkName: "flavours/glitch/async/favourited_statuses" */'flavours/glitch/features/favourited_statuses'); +} + +export function Blocks () { + return import(/* webpackChunkName: "flavours/glitch/async/blocks" */'flavours/glitch/features/blocks'); +} + +export function Mutes () { + return import(/* webpackChunkName: "flavours/glitch/async/mutes" */'flavours/glitch/features/mutes'); +} + +export function OnboardingModal () { + return import(/* webpackChunkName: "flavours/glitch/async/onboarding_modal" */'flavours/glitch/features/ui/components/onboarding_modal'); +} + +export function MuteModal () { + return import(/* webpackChunkName: "flavours/glitch/async/mute_modal" */'flavours/glitch/features/ui/components/mute_modal'); +} + +export function ReportModal () { + return import(/* webpackChunkName: "flavours/glitch/async/report_modal" */'flavours/glitch/features/ui/components/report_modal'); +} + +export function SettingsModal () { + return import(/* webpackChunkName: "flavours/glitch/async/settings_modal" */'flavours/glitch/features/local_settings'); +} + +export function MediaGallery () { + return import(/* webpackChunkName: "flavours/glitch/async/media_gallery" */'flavours/glitch/components/media_gallery'); +} + +export function Video () { + return import(/* webpackChunkName: "flavours/glitch/async/video" */'flavours/glitch/features/video'); +} + +export function EmbedModal () { + return import(/* webpackChunkName: "flavours/glitch/async/embed_modal" */'flavours/glitch/features/ui/components/embed_modal'); +} diff --git a/app/javascript/themes/glitch/util/base_polyfills.js b/app/javascript/flavours/glitch/util/base_polyfills.js similarity index 100% rename from app/javascript/themes/glitch/util/base_polyfills.js rename to app/javascript/flavours/glitch/util/base_polyfills.js diff --git a/app/javascript/themes/glitch/util/bio_metadata.js b/app/javascript/flavours/glitch/util/bio_metadata.js similarity index 100% rename from app/javascript/themes/glitch/util/bio_metadata.js rename to app/javascript/flavours/glitch/util/bio_metadata.js diff --git a/app/javascript/themes/glitch/util/counter.js b/app/javascript/flavours/glitch/util/counter.js similarity index 100% rename from app/javascript/themes/glitch/util/counter.js rename to app/javascript/flavours/glitch/util/counter.js diff --git a/app/javascript/themes/glitch/util/emoji/emoji_compressed.js b/app/javascript/flavours/glitch/util/emoji/emoji_compressed.js similarity index 100% rename from app/javascript/themes/glitch/util/emoji/emoji_compressed.js rename to app/javascript/flavours/glitch/util/emoji/emoji_compressed.js diff --git a/app/javascript/themes/glitch/util/emoji/emoji_map.json b/app/javascript/flavours/glitch/util/emoji/emoji_map.json similarity index 100% rename from app/javascript/themes/glitch/util/emoji/emoji_map.json rename to app/javascript/flavours/glitch/util/emoji/emoji_map.json diff --git a/app/javascript/themes/glitch/util/emoji/emoji_mart_data_light.js b/app/javascript/flavours/glitch/util/emoji/emoji_mart_data_light.js similarity index 100% rename from app/javascript/themes/glitch/util/emoji/emoji_mart_data_light.js rename to app/javascript/flavours/glitch/util/emoji/emoji_mart_data_light.js diff --git a/app/javascript/themes/glitch/util/emoji/emoji_mart_search_light.js b/app/javascript/flavours/glitch/util/emoji/emoji_mart_search_light.js similarity index 100% rename from app/javascript/themes/glitch/util/emoji/emoji_mart_search_light.js rename to app/javascript/flavours/glitch/util/emoji/emoji_mart_search_light.js diff --git a/app/javascript/themes/glitch/util/emoji/emoji_picker.js b/app/javascript/flavours/glitch/util/emoji/emoji_picker.js similarity index 100% rename from app/javascript/themes/glitch/util/emoji/emoji_picker.js rename to app/javascript/flavours/glitch/util/emoji/emoji_picker.js diff --git a/app/javascript/themes/glitch/util/emoji/emoji_unicode_mapping_light.js b/app/javascript/flavours/glitch/util/emoji/emoji_unicode_mapping_light.js similarity index 100% rename from app/javascript/themes/glitch/util/emoji/emoji_unicode_mapping_light.js rename to app/javascript/flavours/glitch/util/emoji/emoji_unicode_mapping_light.js diff --git a/app/javascript/themes/glitch/util/emoji/emoji_utils.js b/app/javascript/flavours/glitch/util/emoji/emoji_utils.js similarity index 100% rename from app/javascript/themes/glitch/util/emoji/emoji_utils.js rename to app/javascript/flavours/glitch/util/emoji/emoji_utils.js diff --git a/app/javascript/themes/glitch/util/emoji/index.js b/app/javascript/flavours/glitch/util/emoji/index.js similarity index 97% rename from app/javascript/themes/glitch/util/emoji/index.js rename to app/javascript/flavours/glitch/util/emoji/index.js index 8c45a58fe..31c3e14ca 100644 --- a/app/javascript/themes/glitch/util/emoji/index.js +++ b/app/javascript/flavours/glitch/util/emoji/index.js @@ -1,4 +1,4 @@ -import { autoPlayGif } from 'themes/glitch/util/initial_state'; +import { autoPlayGif } from 'flavours/glitch/util/initial_state'; import unicodeMapping from './emoji_unicode_mapping_light'; import Trie from 'substring-trie'; diff --git a/app/javascript/themes/glitch/util/emoji/unicode_to_filename.js b/app/javascript/flavours/glitch/util/emoji/unicode_to_filename.js similarity index 100% rename from app/javascript/themes/glitch/util/emoji/unicode_to_filename.js rename to app/javascript/flavours/glitch/util/emoji/unicode_to_filename.js diff --git a/app/javascript/themes/glitch/util/emoji/unicode_to_unified_name.js b/app/javascript/flavours/glitch/util/emoji/unicode_to_unified_name.js similarity index 100% rename from app/javascript/themes/glitch/util/emoji/unicode_to_unified_name.js rename to app/javascript/flavours/glitch/util/emoji/unicode_to_unified_name.js diff --git a/app/javascript/themes/glitch/util/extra_polyfills.js b/app/javascript/flavours/glitch/util/extra_polyfills.js similarity index 100% rename from app/javascript/themes/glitch/util/extra_polyfills.js rename to app/javascript/flavours/glitch/util/extra_polyfills.js diff --git a/app/javascript/themes/glitch/util/fullscreen.js b/app/javascript/flavours/glitch/util/fullscreen.js similarity index 100% rename from app/javascript/themes/glitch/util/fullscreen.js rename to app/javascript/flavours/glitch/util/fullscreen.js diff --git a/app/javascript/themes/glitch/util/get_rect_from_entry.js b/app/javascript/flavours/glitch/util/get_rect_from_entry.js similarity index 100% rename from app/javascript/themes/glitch/util/get_rect_from_entry.js rename to app/javascript/flavours/glitch/util/get_rect_from_entry.js diff --git a/app/javascript/themes/glitch/util/initial_state.js b/app/javascript/flavours/glitch/util/initial_state.js similarity index 100% rename from app/javascript/themes/glitch/util/initial_state.js rename to app/javascript/flavours/glitch/util/initial_state.js diff --git a/app/javascript/themes/glitch/util/intersection_observer_wrapper.js b/app/javascript/flavours/glitch/util/intersection_observer_wrapper.js similarity index 100% rename from app/javascript/themes/glitch/util/intersection_observer_wrapper.js rename to app/javascript/flavours/glitch/util/intersection_observer_wrapper.js diff --git a/app/javascript/themes/glitch/util/is_mobile.js b/app/javascript/flavours/glitch/util/is_mobile.js similarity index 100% rename from app/javascript/themes/glitch/util/is_mobile.js rename to app/javascript/flavours/glitch/util/is_mobile.js diff --git a/app/javascript/themes/glitch/util/link_header.js b/app/javascript/flavours/glitch/util/link_header.js similarity index 100% rename from app/javascript/themes/glitch/util/link_header.js rename to app/javascript/flavours/glitch/util/link_header.js diff --git a/app/javascript/themes/glitch/util/load_polyfills.js b/app/javascript/flavours/glitch/util/load_polyfills.js similarity index 100% rename from app/javascript/themes/glitch/util/load_polyfills.js rename to app/javascript/flavours/glitch/util/load_polyfills.js diff --git a/app/javascript/themes/glitch/util/main.js b/app/javascript/flavours/glitch/util/main.js similarity index 95% rename from app/javascript/themes/glitch/util/main.js rename to app/javascript/flavours/glitch/util/main.js index c10a64ded..fe57fa962 100644 --- a/app/javascript/themes/glitch/util/main.js +++ b/app/javascript/flavours/glitch/util/main.js @@ -1,5 +1,5 @@ import * as WebPushSubscription from './web_push_subscription'; -import Mastodon from 'themes/glitch/containers/mastodon'; +import Mastodon from 'flavours/glitch/containers/mastodon'; import React from 'react'; import ReactDOM from 'react-dom'; import ready from './ready'; diff --git a/app/javascript/themes/glitch/util/optional_motion.js b/app/javascript/flavours/glitch/util/optional_motion.js similarity index 68% rename from app/javascript/themes/glitch/util/optional_motion.js rename to app/javascript/flavours/glitch/util/optional_motion.js index b8a57b22f..eecb6634e 100644 --- a/app/javascript/themes/glitch/util/optional_motion.js +++ b/app/javascript/flavours/glitch/util/optional_motion.js @@ -1,4 +1,4 @@ -import { reduceMotion } from 'themes/glitch/util/initial_state'; +import { reduceMotion } from 'flavours/glitch/util/initial_state'; import ReducedMotion from './reduced_motion'; import Motion from 'react-motion/lib/Motion'; diff --git a/app/javascript/themes/glitch/util/performance.js b/app/javascript/flavours/glitch/util/performance.js similarity index 100% rename from app/javascript/themes/glitch/util/performance.js rename to app/javascript/flavours/glitch/util/performance.js diff --git a/app/javascript/themes/glitch/util/react_router_helpers.js b/app/javascript/flavours/glitch/util/react_router_helpers.js similarity index 85% rename from app/javascript/themes/glitch/util/react_router_helpers.js rename to app/javascript/flavours/glitch/util/react_router_helpers.js index c02fb5247..1dba5e9bb 100644 --- a/app/javascript/themes/glitch/util/react_router_helpers.js +++ b/app/javascript/flavours/glitch/util/react_router_helpers.js @@ -2,9 +2,9 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Switch, Route } from 'react-router-dom'; -import ColumnLoading from 'themes/glitch/features/ui/components/column_loading'; -import BundleColumnError from 'themes/glitch/features/ui/components/bundle_column_error'; -import BundleContainer from 'themes/glitch/features/ui/containers/bundle_container'; +import ColumnLoading from 'flavours/glitch/features/ui/components/column_loading'; +import BundleColumnError from 'flavours/glitch/features/ui/components/bundle_column_error'; +import BundleContainer from 'flavours/glitch/features/ui/containers/bundle_container'; // Small wrapper to pass multiColumn to the route components export class WrappedSwitch extends React.PureComponent { diff --git a/app/javascript/themes/glitch/util/ready.js b/app/javascript/flavours/glitch/util/ready.js similarity index 100% rename from app/javascript/themes/glitch/util/ready.js rename to app/javascript/flavours/glitch/util/ready.js diff --git a/app/javascript/themes/glitch/util/reduced_motion.js b/app/javascript/flavours/glitch/util/reduced_motion.js similarity index 100% rename from app/javascript/themes/glitch/util/reduced_motion.js rename to app/javascript/flavours/glitch/util/reduced_motion.js diff --git a/app/javascript/themes/glitch/util/rtl.js b/app/javascript/flavours/glitch/util/rtl.js similarity index 100% rename from app/javascript/themes/glitch/util/rtl.js rename to app/javascript/flavours/glitch/util/rtl.js diff --git a/app/javascript/themes/glitch/util/schedule_idle_task.js b/app/javascript/flavours/glitch/util/schedule_idle_task.js similarity index 100% rename from app/javascript/themes/glitch/util/schedule_idle_task.js rename to app/javascript/flavours/glitch/util/schedule_idle_task.js diff --git a/app/javascript/themes/glitch/util/scroll.js b/app/javascript/flavours/glitch/util/scroll.js similarity index 100% rename from app/javascript/themes/glitch/util/scroll.js rename to app/javascript/flavours/glitch/util/scroll.js diff --git a/app/javascript/themes/glitch/util/stream.js b/app/javascript/flavours/glitch/util/stream.js similarity index 100% rename from app/javascript/themes/glitch/util/stream.js rename to app/javascript/flavours/glitch/util/stream.js diff --git a/app/javascript/themes/glitch/util/url_regex.js b/app/javascript/flavours/glitch/util/url_regex.js similarity index 100% rename from app/javascript/themes/glitch/util/url_regex.js rename to app/javascript/flavours/glitch/util/url_regex.js diff --git a/app/javascript/themes/glitch/util/uuid.js b/app/javascript/flavours/glitch/util/uuid.js similarity index 100% rename from app/javascript/themes/glitch/util/uuid.js rename to app/javascript/flavours/glitch/util/uuid.js diff --git a/app/javascript/themes/glitch/util/web_push_subscription.js b/app/javascript/flavours/glitch/util/web_push_subscription.js similarity index 97% rename from app/javascript/themes/glitch/util/web_push_subscription.js rename to app/javascript/flavours/glitch/util/web_push_subscription.js index 70b26105b..de185b6d9 100644 --- a/app/javascript/themes/glitch/util/web_push_subscription.js +++ b/app/javascript/flavours/glitch/util/web_push_subscription.js @@ -1,6 +1,6 @@ import axios from 'axios'; -import { store } from 'themes/glitch/containers/mastodon'; -import { setBrowserSupport, setSubscription, clearSubscription } from 'themes/glitch/actions/push_notifications'; +import { store } from 'flavours/glitch/containers/mastodon'; +import { setBrowserSupport, setSubscription, clearSubscription } from 'flavours/glitch/actions/push_notifications'; // Taken from https://www.npmjs.com/package/web-push const urlBase64ToUint8Array = (base64String) => { diff --git a/app/javascript/themes/vanilla/theme.yml b/app/javascript/flavours/vanilla/theme.yml similarity index 100% rename from app/javascript/themes/vanilla/theme.yml rename to app/javascript/flavours/vanilla/theme.yml diff --git a/app/javascript/themes/glitch/features/generic_not_found/index.js b/app/javascript/themes/glitch/features/generic_not_found/index.js deleted file mode 100644 index ccd2b87b2..000000000 --- a/app/javascript/themes/glitch/features/generic_not_found/index.js +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; -import Column from 'themes/glitch/features/ui/components/column'; -import MissingIndicator from 'themes/glitch/components/missing_indicator'; - -const GenericNotFound = () => ( - - - -); - -export default GenericNotFound; diff --git a/app/javascript/themes/glitch/features/standalone/compose/index.js b/app/javascript/themes/glitch/features/standalone/compose/index.js deleted file mode 100644 index 8a8118178..000000000 --- a/app/javascript/themes/glitch/features/standalone/compose/index.js +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react'; -import ComposeFormContainer from 'themes/glitch/features/compose/containers/compose_form_container'; -import NotificationsContainer from 'themes/glitch/features/ui/containers/notifications_container'; -import LoadingBarContainer from 'themes/glitch/features/ui/containers/loading_bar_container'; -import ModalContainer from 'themes/glitch/features/ui/containers/modal_container'; - -export default class Compose extends React.PureComponent { - - render () { - return ( -
- - - - -
- ); - } - -} diff --git a/app/javascript/themes/glitch/packs/common.js b/app/javascript/themes/glitch/packs/common.js deleted file mode 100644 index fd4254a0e..000000000 --- a/app/javascript/themes/glitch/packs/common.js +++ /dev/null @@ -1 +0,0 @@ -import 'themes/glitch/styles/index.scss'; diff --git a/app/javascript/themes/glitch/packs/home.js b/app/javascript/themes/glitch/packs/home.js deleted file mode 100644 index 69dddf51c..000000000 --- a/app/javascript/themes/glitch/packs/home.js +++ /dev/null @@ -1,7 +0,0 @@ -import loadPolyfills from 'themes/glitch/util/load_polyfills'; - -loadPolyfills().then(() => { - require('themes/glitch/util/main').default(); -}).catch(e => { - console.error(e); -}); diff --git a/app/javascript/themes/glitch/util/async-components.js b/app/javascript/themes/glitch/util/async-components.js deleted file mode 100644 index 91e85fed5..000000000 --- a/app/javascript/themes/glitch/util/async-components.js +++ /dev/null @@ -1,115 +0,0 @@ -export function EmojiPicker () { - return import(/* webpackChunkName: "themes/glitch/async/emoji_picker" */'themes/glitch/util/emoji/emoji_picker'); -} - -export function Compose () { - return import(/* webpackChunkName: "themes/glitch/async/compose" */'themes/glitch/features/compose'); -} - -export function Notifications () { - return import(/* webpackChunkName: "themes/glitch/async/notifications" */'themes/glitch/features/notifications'); -} - -export function HomeTimeline () { - return import(/* webpackChunkName: "themes/glitch/async/home_timeline" */'themes/glitch/features/home_timeline'); -} - -export function PublicTimeline () { - return import(/* webpackChunkName: "themes/glitch/async/public_timeline" */'themes/glitch/features/public_timeline'); -} - -export function CommunityTimeline () { - return import(/* webpackChunkName: "themes/glitch/async/community_timeline" */'themes/glitch/features/community_timeline'); -} - -export function HashtagTimeline () { - return import(/* webpackChunkName: "themes/glitch/async/hashtag_timeline" */'themes/glitch/features/hashtag_timeline'); -} - -export function DirectTimeline() { - return import(/* webpackChunkName: "themes/glitch/async/direct_timeline" */'themes/glitch/features/direct_timeline'); -} - -export function Status () { - return import(/* webpackChunkName: "themes/glitch/async/status" */'themes/glitch/features/status'); -} - -export function GettingStarted () { - return import(/* webpackChunkName: "themes/glitch/async/getting_started" */'themes/glitch/features/getting_started'); -} - -export function PinnedStatuses () { - return import(/* webpackChunkName: "themes/glitch/async/pinned_statuses" */'themes/glitch/features/pinned_statuses'); -} - -export function AccountTimeline () { - return import(/* webpackChunkName: "themes/glitch/async/account_timeline" */'themes/glitch/features/account_timeline'); -} - -export function AccountGallery () { - return import(/* webpackChunkName: "themes/glitch/async/account_gallery" */'themes/glitch/features/account_gallery'); -} - -export function Followers () { - return import(/* webpackChunkName: "themes/glitch/async/followers" */'themes/glitch/features/followers'); -} - -export function Following () { - return import(/* webpackChunkName: "themes/glitch/async/following" */'themes/glitch/features/following'); -} - -export function Reblogs () { - return import(/* webpackChunkName: "themes/glitch/async/reblogs" */'themes/glitch/features/reblogs'); -} - -export function Favourites () { - return import(/* webpackChunkName: "themes/glitch/async/favourites" */'themes/glitch/features/favourites'); -} - -export function FollowRequests () { - return import(/* webpackChunkName: "themes/glitch/async/follow_requests" */'themes/glitch/features/follow_requests'); -} - -export function GenericNotFound () { - return import(/* webpackChunkName: "themes/glitch/async/generic_not_found" */'themes/glitch/features/generic_not_found'); -} - -export function FavouritedStatuses () { - return import(/* webpackChunkName: "themes/glitch/async/favourited_statuses" */'themes/glitch/features/favourited_statuses'); -} - -export function Blocks () { - return import(/* webpackChunkName: "themes/glitch/async/blocks" */'themes/glitch/features/blocks'); -} - -export function Mutes () { - return import(/* webpackChunkName: "themes/glitch/async/mutes" */'themes/glitch/features/mutes'); -} - -export function OnboardingModal () { - return import(/* webpackChunkName: "themes/glitch/async/onboarding_modal" */'themes/glitch/features/ui/components/onboarding_modal'); -} - -export function MuteModal () { - return import(/* webpackChunkName: "themes/glitch/async/mute_modal" */'themes/glitch/features/ui/components/mute_modal'); -} - -export function ReportModal () { - return import(/* webpackChunkName: "themes/glitch/async/report_modal" */'themes/glitch/features/ui/components/report_modal'); -} - -export function SettingsModal () { - return import(/* webpackChunkName: "themes/glitch/async/settings_modal" */'themes/glitch/features/local_settings'); -} - -export function MediaGallery () { - return import(/* webpackChunkName: "themes/glitch/async/media_gallery" */'themes/glitch/components/media_gallery'); -} - -export function Video () { - return import(/* webpackChunkName: "themes/glitch/async/video" */'themes/glitch/features/video'); -} - -export function EmbedModal () { - return import(/* webpackChunkName: "themes/glitch/async/embed_modal" */'themes/glitch/features/ui/components/embed_modal'); -} diff --git a/app/javascript/themes/mastodon-go b/app/javascript/themes/mastodon-go deleted file mode 160000 index 74c0293e8..000000000 --- a/app/javascript/themes/mastodon-go +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 74c0293e83dbb49ea4f27eea108526df6216d2a2 diff --git a/app/lib/themes.rb b/app/lib/themes.rb index f1796d0e3..863326e2d 100644 --- a/app/lib/themes.rb +++ b/app/lib/themes.rb @@ -12,7 +12,7 @@ class Themes core['pack'] = Hash.new unless core['pack'] result = Hash.new - Dir.glob(Rails.root.join('app', 'javascript', 'themes', '*', 'theme.yml')) do |path| + Dir.glob(Rails.root.join('app', 'javascript', 'flavours', '*', 'theme.yml')) do |path| data = YAML.load_file(path) name = File.basename(File.dirname(path)) if data['pack'] @@ -51,11 +51,11 @@ class Themes @core end - def get(name) + def flavour(name) @conf[name] end - def names + def flavours @conf.keys end diff --git a/app/models/user.rb b/app/models/user.rb index 1d42d4f70..2458cf298 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -74,7 +74,7 @@ class User < ApplicationRecord has_many :session_activations, dependent: :destroy delegate :auto_play_gif, :default_sensitive, :unfollow_modal, :boost_modal, :delete_modal, - :reduce_motion, :system_font_ui, :noindex, :theme, :skin, + :reduce_motion, :system_font_ui, :noindex, :flavour, :skin, to: :settings, prefix: :setting, allow_nil: false def confirmed? diff --git a/app/views/layouts/_theme.html.haml b/app/views/layouts/_theme.html.haml index 941ccc914..39727953d 100644 --- a/app/views/layouts/_theme.html.haml +++ b/app/views/layouts/_theme.html.haml @@ -2,10 +2,10 @@ - if theme[:pack] != 'common' && theme[:common] = render partial: 'layouts/theme', object: theme[:common] - if theme[:pack] - = javascript_pack_tag theme[:name] ? "themes/#{theme[:name]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, crossorigin: 'anonymous' + = javascript_pack_tag theme[:flavour] ? "flavours/#{theme[:flavour]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, crossorigin: 'anonymous' - if theme[:skin] - - if !theme[:name] || theme[:skin] == 'default' - = stylesheet_pack_tag theme[:name] ? "themes/#{theme[:name]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, media: 'all' + - if !theme[:flavour] || theme[:skin] == 'default' + = stylesheet_pack_tag theme[:flavour] ? "flavours/#{theme[:flavour]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, media: 'all' - else = stylesheet_pack_tag "skins/#{theme[:name]}/#{theme[:skin]}/#{theme[:pack]}" - if theme[:preload] diff --git a/app/views/settings/preferences/show.html.haml b/app/views/settings/preferences/show.html.haml index 0d487d9f3..030a902cf 100644 --- a/app/views/settings/preferences/show.html.haml +++ b/app/views/settings/preferences/show.html.haml @@ -27,7 +27,7 @@ .fields-group - if Themes.instance.names.size > 1 - = f.input :setting_theme, collection: Themes.instance.names, label_method: lambda { |theme| I18n.t("themes.#{theme}", default: theme) }, wrapper: :with_label, include_blank: false + = f.input :setting_flavour, collection: Themes.instance.flavours, label_method: lambda { |flavour| I18n.t("themes.#{flavour}", default: flavour) }, wrapper: :with_label, include_blank: false = f.input :setting_skin, collection: Themes.instance.skins_for(current_theme), label_method: lambda { |skin| I18n.t("themes.#{current_theme}.skins.#{skin}", default: skin) }, wrapper: :with_label, include_blank: false = f.input :setting_unfollow_modal, as: :boolean, wrapper: :with_label diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index b9ef21fef..1ce24e3c6 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -14,8 +14,8 @@ en: one: 1 character left other: %{count} characters left setting_noindex: Affects your public profile and status pages - setting_theme: Affects how Mastodon looks when you're logged in from any device. - setting_skin: Reskins the selected Mastodon theme + setting_flavour: Affects how Mastodon looks when you're logged in from any device + setting_skin: Reskins the selected Mastodon flavour imports: data: CSV file exported from another Mastodon instance sessions: @@ -47,7 +47,7 @@ en: setting_noindex: Opt-out of search engine indexing setting_reduce_motion: Reduce motion in animations setting_system_font_ui: Use system's default font - setting_theme: Site theme + setting_flavour: Mastodon Flavour setting_skin: Skin setting_unfollow_modal: Show confirmation dialog before unfollowing someone severity: Severity diff --git a/config/settings.yml b/config/settings.yml index 5abf647e8..48d971d44 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -25,7 +25,7 @@ defaults: &defaults reduce_motion: false system_font_ui: false noindex: false - theme: 'glitch' + flavour: 'glitch' skin: 'default' notification_emails: follow: false diff --git a/config/webpack/configuration.js b/config/webpack/configuration.js index cb31c6ab8..59d46c78d 100644 --- a/config/webpack/configuration.js +++ b/config/webpack/configuration.js @@ -9,9 +9,9 @@ const glob = require('glob'); const configPath = resolve('config', 'webpacker.yml'); const loadersDir = join(__dirname, 'loaders'); const settings = safeLoad(readFileSync(configPath), 'utf8')[env.NODE_ENV]; -const themeFiles = glob.sync('app/javascript/themes/*/theme.yml'); +const flavourFiles = glob.sync('app/javascript/flavours/*/theme.yml'); const skinFiles = glob.sync('app/javascript/skins/*/*'); -const themes = {}; +const flavours = {}; const core = function () { const coreFile = resolve('app', 'javascript', 'core', 'theme.yml'); @@ -22,16 +22,16 @@ const core = function () { return data.pack ? data : {}; }(); -for (let i = 0; i < themeFiles.length; i++) { - const themeFile = themeFiles[i]; - const data = safeLoad(readFileSync(themeFile), 'utf8'); - data.name = basename(dirname(themeFile)); +for (let i = 0; i < flavourFiles.length; i++) { + const flavourFile = flavourFiles[i]; + const data = safeLoad(readFileSync(flavourFile), 'utf8'); + data.name = basename(dirname(flavourFile)); data.skin = {}; if (!data.pack_directory) { - data.pack_directory = dirname(themeFile); + data.pack_directory = dirname(flavourFile); } if (data.pack && typeof data.pack === 'object') { - themes[data.name] = data; + flavours[data.name] = data; } } @@ -39,10 +39,10 @@ for (let i = 0; i < skinFiles.length; i++) { const skinFile = skinFiles[i]; let skin = basename(skinFile); const name = basename(dirname(skinFile)); - if (!themes[name]) { + if (!flavours[name]) { continue; } - const data = themes[name].skin; + const data = flavours[name].skin; if (lstatSync(skinFile).isDirectory()) { data[skin] = {}; const skinPacks = glob.sync(skinFile, '*.{css,scss}'); @@ -76,7 +76,7 @@ const output = { module.exports = { settings, core, - themes, + flavours, env, loadersDir, output, diff --git a/config/webpack/shared.js b/config/webpack/shared.js index a2550bc81..e4b057ffb 100644 --- a/config/webpack/shared.js +++ b/config/webpack/shared.js @@ -6,7 +6,7 @@ const { sync } = require('glob'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); const ManifestPlugin = require('webpack-manifest-plugin'); const extname = require('path-complete-extname'); -const { env, settings, core, themes, output, loadersDir } = require('./configuration.js'); +const { env, settings, core, flavours, output, loadersDir } = require('./configuration.js'); const localePackPaths = require('./generateLocalePacks'); function reducePacks (data, into = {}) { @@ -20,7 +20,7 @@ function reducePacks (data, into = {}) { } const packFile = typeof pack === 'string' ? pack : pack.filename; if (packFile) { - map[data.name ? `themes/${data.name}/${entry}` : `core/${entry}`] = resolve(data.pack_directory, packFile); + map[data.name ? `flavours/${data.name}/${entry}` : `core/${entry}`] = resolve(data.pack_directory, packFile); } return map; }, into); @@ -54,7 +54,7 @@ module.exports = { return localMap; }, {}), reducePacks(core), - Object.keys(themes).reduce((map, entry) => reducePacks(themes[entry], map), {}) + Object.keys(flavours).reduce((map, entry) => reducePacks(flavours[entry], map), {}) ), output: { From 7c75702d05483747cbeb5be0a0745143b9bedc5b Mon Sep 17 00:00:00 2001 From: kibigo! Date: Sun, 3 Dec 2017 23:52:13 -0800 Subject: [PATCH 09/13] Fixed image require --- app/javascript/core/common.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/core/common.js b/app/javascript/core/common.js index bb4b97935..a7073ef0e 100644 --- a/app/javascript/core/common.js +++ b/app/javascript/core/common.js @@ -3,6 +3,6 @@ import { start } from 'rails-ujs'; import 'font-awesome/css/font-awesome.css'; -require.context('images/', true); +require.context('../images/', true); start(); From 1c74ede69e7a9916c19da6f05daa215231eba81c Mon Sep 17 00:00:00 2001 From: kibigo! Date: Mon, 4 Dec 2017 00:19:39 -0800 Subject: [PATCH 10/13] Fixed a name + localizations --- app/views/settings/preferences/show.html.haml | 2 +- config/locales/simple_form.en.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/views/settings/preferences/show.html.haml b/app/views/settings/preferences/show.html.haml index 030a902cf..40589fbec 100644 --- a/app/views/settings/preferences/show.html.haml +++ b/app/views/settings/preferences/show.html.haml @@ -26,7 +26,7 @@ %h4= t 'preferences.web' .fields-group - - if Themes.instance.names.size > 1 + - if Themes.instance.flavours.size > 1 = f.input :setting_flavour, collection: Themes.instance.flavours, label_method: lambda { |flavour| I18n.t("themes.#{flavour}", default: flavour) }, wrapper: :with_label, include_blank: false = f.input :setting_skin, collection: Themes.instance.skins_for(current_theme), label_method: lambda { |skin| I18n.t("themes.#{current_theme}.skins.#{skin}", default: skin) }, wrapper: :with_label, include_blank: false diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 1ce24e3c6..66ec13634 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -13,8 +13,8 @@ en: note: one: 1 character left other: %{count} characters left - setting_noindex: Affects your public profile and status pages setting_flavour: Affects how Mastodon looks when you're logged in from any device + setting_noindex: Affects your public profile and status pages setting_skin: Reskins the selected Mastodon flavour imports: data: CSV file exported from another Mastodon instance @@ -44,11 +44,11 @@ en: setting_default_privacy: Post privacy setting_default_sensitive: Always mark media as sensitive setting_delete_modal: Show confirmation dialog before deleting a toot + setting_flavour: Mastodon Flavour setting_noindex: Opt-out of search engine indexing setting_reduce_motion: Reduce motion in animations - setting_system_font_ui: Use system's default font - setting_flavour: Mastodon Flavour setting_skin: Skin + setting_system_font_ui: Use system's default font setting_unfollow_modal: Show confirmation dialog before unfollowing someone severity: Severity type: Import type From a807e3b71bcc052d4b0859dd42739b4ae7def098 Mon Sep 17 00:00:00 2001 From: David Yip Date: Mon, 4 Dec 2017 11:35:35 -0600 Subject: [PATCH 11/13] current_theme -> current_flavour (#229) --- app/views/settings/preferences/show.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/settings/preferences/show.html.haml b/app/views/settings/preferences/show.html.haml index 40589fbec..9564c0399 100644 --- a/app/views/settings/preferences/show.html.haml +++ b/app/views/settings/preferences/show.html.haml @@ -28,7 +28,7 @@ .fields-group - if Themes.instance.flavours.size > 1 = f.input :setting_flavour, collection: Themes.instance.flavours, label_method: lambda { |flavour| I18n.t("themes.#{flavour}", default: flavour) }, wrapper: :with_label, include_blank: false - = f.input :setting_skin, collection: Themes.instance.skins_for(current_theme), label_method: lambda { |skin| I18n.t("themes.#{current_theme}.skins.#{skin}", default: skin) }, wrapper: :with_label, include_blank: false + = f.input :setting_skin, collection: Themes.instance.skins_for(current_flavour), label_method: lambda { |skin| I18n.t("themes.#{current_flavour}.skins.#{skin}", default: skin) }, wrapper: :with_label, include_blank: false = f.input :setting_unfollow_modal, as: :boolean, wrapper: :with_label = f.input :setting_boost_modal, as: :boolean, wrapper: :with_label From 5bed0f10ed4628049ca14fb188804654574be1bf Mon Sep 17 00:00:00 2001 From: kibigo! Date: Mon, 4 Dec 2017 21:54:36 -0800 Subject: [PATCH 12/13] Various fixes --- app/controllers/settings/preferences_controller.rb | 2 +- app/javascript/core/settings.js | 2 +- app/lib/user_settings_decorator.rb | 6 +++--- app/views/layouts/_theme.html.haml | 2 +- config/locales/simple_form.en.yml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb index 56baebed2..277f0f657 100644 --- a/app/controllers/settings/preferences_controller.rb +++ b/app/controllers/settings/preferences_controller.rb @@ -38,7 +38,7 @@ class Settings::PreferencesController < Settings::BaseController :setting_reduce_motion, :setting_system_font_ui, :setting_noindex, - :setting_theme, + :setting_flavour, :setting_skin, notification_emails: %i(follow follow_request reblog favourite mention digest), interactions: %i(must_be_follower must_be_following) diff --git a/app/javascript/core/settings.js b/app/javascript/core/settings.js index 1e4bb4ced..ada5fba2b 100644 --- a/app/javascript/core/settings.js +++ b/app/javascript/core/settings.js @@ -38,6 +38,6 @@ delegate(document, '#account_header', 'change', ({ target }) => { header.style.backgroundImage = `url(${url})`; }); -delegate(document, '#user_setting_theme', 'change', ({ target }) => { +delegate(document, '#user_setting_flavour, #user_setting_skin', 'change', ({ target }) => { target.form.submit(); }); diff --git a/app/lib/user_settings_decorator.rb b/app/lib/user_settings_decorator.rb index 730c70177..8af384a2d 100644 --- a/app/lib/user_settings_decorator.rb +++ b/app/lib/user_settings_decorator.rb @@ -26,7 +26,7 @@ class UserSettingsDecorator user.settings['reduce_motion'] = reduce_motion_preference if change?('setting_reduce_motion') user.settings['system_font_ui'] = system_font_ui_preference if change?('setting_system_font_ui') user.settings['noindex'] = noindex_preference if change?('setting_noindex') - user.settings['theme'] = theme_preference if change?('setting_theme') + user.settings['flavour'] = flavour_preference if change?('setting_flavour') user.settings['skin'] = skin_preference if change?('setting_skin') end @@ -74,8 +74,8 @@ class UserSettingsDecorator boolean_cast_setting 'setting_noindex' end - def theme_preference - settings['setting_theme'] + def flavour_preference + settings['setting_flavour'] end def skin_preference diff --git a/app/views/layouts/_theme.html.haml b/app/views/layouts/_theme.html.haml index 39727953d..066d9de42 100644 --- a/app/views/layouts/_theme.html.haml +++ b/app/views/layouts/_theme.html.haml @@ -7,7 +7,7 @@ - if !theme[:flavour] || theme[:skin] == 'default' = stylesheet_pack_tag theme[:flavour] ? "flavours/#{theme[:flavour]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, media: 'all' - else - = stylesheet_pack_tag "skins/#{theme[:name]}/#{theme[:skin]}/#{theme[:pack]}" + = stylesheet_pack_tag "skins/#{theme[:flavour]}/#{theme[:skin]}/#{theme[:pack]}" - if theme[:preload] - theme[:preload].each do |link| %link{ href: asset_pack_path("#{link}.js"), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 35b45fbc9..756f6b119 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -46,7 +46,7 @@ en: setting_default_privacy: Post privacy setting_default_sensitive: Always mark media as sensitive setting_delete_modal: Show confirmation dialog before deleting a toot - setting_flavour: Mastodon Flavour + setting_flavour: Flavour setting_noindex: Opt-out of search engine indexing setting_reduce_motion: Reduce motion in animations setting_skin: Skin From 017fc81caf8f265e5c5543186877437485625795 Mon Sep 17 00:00:00 2001 From: David Yip Date: Wed, 6 Dec 2017 16:19:43 -0600 Subject: [PATCH 13/13] Prepend check_enabled_deletion to Settings::DeletesController (#229) The specs for Settings::DeletesController include an example that sets Settings.open_deletion to false and expects the "if deletion is not available, redirect to root" logic to run. However, this spec does not set up a user, which means that the spec (intentionally or otherwise) expects this redirection to work with unauthenticated access. We should preserve that behavior. To do so, we prepend the deletion check to the action chain set up by Settings::BaseController, so that said check occurs before the authenticate_user! check. --- app/controllers/settings/deletes_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/settings/deletes_controller.rb b/app/controllers/settings/deletes_controller.rb index e4cb35a8e..4c1121471 100644 --- a/app/controllers/settings/deletes_controller.rb +++ b/app/controllers/settings/deletes_controller.rb @@ -2,7 +2,7 @@ class Settings::DeletesController < Settings::BaseController - before_action :check_enabled_deletion + prepend_before_action :check_enabled_deletion def show @confirmation = Form::DeleteConfirmation.new