Compare commits
819 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
524342efad | ||
|
|
9b03763b44 | ||
|
|
8346ce06ea | ||
|
|
cf31e00aa3 | ||
|
|
102105efe7 | ||
|
|
da2fdd2745 | ||
|
|
d621ab4976 | ||
|
|
836fb4ca41 | ||
|
|
53db7a5a02 | ||
|
|
492ae3e53c | ||
|
|
a3112d31da | ||
|
|
be210cd49e | ||
|
|
65fb556eda | ||
|
|
7ebad43d19 | ||
|
|
38e8879a96 | ||
|
|
2345f47fae | ||
|
|
857a0cbe3b | ||
|
|
e5ef40b04b | ||
|
|
e7482e8fe6 | ||
|
|
4def9db23f | ||
|
|
2f5ef7f373 | ||
|
|
0b2d5264c1 | ||
|
|
1772829ec1 | ||
|
|
5bb71fc45c | ||
|
|
03aa23a846 | ||
|
|
51fecea7f3 | ||
|
|
e1e69a40bb | ||
|
|
80eb47ed15 | ||
|
|
e673ab4528 | ||
|
|
37b49f5132 | ||
|
|
5ec51829ad | ||
|
|
ca6995cbca | ||
|
|
8bfdabdecc | ||
|
|
971a05d9a5 | ||
|
|
80bf0529d6 | ||
|
|
5b57cbd418 | ||
|
|
c992ab69ff | ||
|
|
3dd04b62b8 | ||
|
|
737219a76a | ||
|
|
1d2e2ea36c | ||
|
|
dff839056f | ||
|
|
5ed8fba75a | ||
|
|
c01e4fb30d | ||
|
|
87f3024442 | ||
|
|
90aa4f46d8 | ||
|
|
003bf2400a | ||
|
|
bf78a8a9f5 | ||
|
|
500aded0b0 | ||
|
|
df6c42f526 | ||
|
|
2b948bc70d | ||
|
|
3b73155ec1 | ||
|
|
0af3996d1e | ||
|
|
5235958002 | ||
|
|
3da172ce9b | ||
|
|
c5efdc5bee | ||
|
|
88c50d906d | ||
|
|
6fb0e2ba25 | ||
|
|
634026e2e6 | ||
|
|
1ab9e3b679 | ||
|
|
d15694c523 | ||
|
|
d8f69da6fd | ||
|
|
1c40816dcb | ||
|
|
4bf61f4b22 | ||
|
|
74fcf4bafb | ||
|
|
9ea8e681f6 | ||
|
|
ddd434aecb | ||
|
|
0a94a27f4e | ||
|
|
895f61bd70 | ||
|
|
c82dccbb7b | ||
|
|
3e79f21eba | ||
|
|
1088f5c30a | ||
|
|
b40518123a | ||
|
|
825e558b65 | ||
|
|
deb3544075 | ||
|
|
d0966dd3af | ||
|
|
b88451311a | ||
|
|
f4c1506107 | ||
|
|
1e8db6c73c | ||
|
|
9baf650d3d | ||
|
|
82c0e58027 | ||
|
|
e1f624d0cf | ||
|
|
c46c433111 | ||
|
|
b102269161 | ||
|
|
ea5cba2e17 | ||
|
|
31250ffa70 | ||
|
|
aee1d33f2d | ||
|
|
2b2c3d4585 | ||
|
|
a7c3300a06 | ||
|
|
8cd6908fe8 | ||
|
|
d39da02e4d | ||
|
|
cf235a8821 | ||
|
|
1ec487d4f5 | ||
|
|
a757681684 | ||
|
|
e0094449a9 | ||
|
|
57e1ebc9cf | ||
|
|
8f0ac31994 | ||
|
|
90425c30a5 | ||
|
|
99be70835e | ||
|
|
4c3c806aa8 | ||
|
|
e251c53fe0 | ||
|
|
a194c57777 | ||
|
|
83b47d5a35 | ||
|
|
d90471c430 | ||
|
|
9cc506bb69 | ||
|
|
ff63ab836a | ||
|
|
cc510e399d | ||
|
|
ef5778ea59 | ||
|
|
8f9735044a | ||
|
|
a21528f998 | ||
|
|
dcb510b642 | ||
|
|
54f7a4fcb3 | ||
|
|
92593c3584 | ||
|
|
ebbdb5fcc2 | ||
|
|
02217694d3 | ||
|
|
0351a79062 | ||
|
|
7edc2e3878 | ||
|
|
64e480febc | ||
|
|
c5971e8374 | ||
|
|
9fd263b256 | ||
|
|
6b7f8f901b | ||
|
|
c67b781fd5 | ||
|
|
71c48b6896 | ||
|
|
c16205fd0f | ||
|
|
fac8d82434 | ||
|
|
603a585210 | ||
|
|
64299212b7 | ||
|
|
d76e93481f | ||
|
|
35e90225b0 | ||
|
|
ff48319c42 | ||
|
|
ccd6dc2d28 | ||
|
|
d931aa13b7 | ||
|
|
e7630e9357 | ||
|
|
953ce3fdea | ||
|
|
40e04af5d4 | ||
|
|
7876bd69fd | ||
|
|
c1cba4dd5e | ||
|
|
a9f3992d2c | ||
|
|
36e4ea5e55 | ||
|
|
7b3bc12a54 | ||
|
|
4af8733795 | ||
|
|
2136f558b9 | ||
|
|
57df2ce523 | ||
|
|
0a4c90be99 | ||
|
|
ae0530cfc6 | ||
|
|
c2019de7d2 | ||
|
|
920ba68108 | ||
|
|
89b8840bb7 | ||
|
|
9b326737e1 | ||
|
|
e0e3a38661 | ||
|
|
86f64dfc98 | ||
|
|
59357357bb | ||
|
|
aab6f42d55 | ||
|
|
3644deccfe | ||
|
|
a6a383e4fc | ||
|
|
66a10b8e50 | ||
|
|
02c972ef67 | ||
|
|
3c19ce5e83 | ||
|
|
ff976c6262 | ||
|
|
52fedb6df3 | ||
|
|
e587b3d6ea | ||
|
|
908ad1cc3b | ||
|
|
bc52049a9b | ||
|
|
e48597cb45 | ||
|
|
9e868428c0 | ||
|
|
e100513b37 | ||
|
|
f0fbb71f25 | ||
|
|
eebe558b6e | ||
|
|
5622d1c89e | ||
|
|
22405c66f0 | ||
|
|
658838fccd | ||
|
|
30a4686886 | ||
|
|
7771136881 | ||
|
|
5ded3984f6 | ||
|
|
b116a78c9f | ||
|
|
c4479dd94f | ||
|
|
12248db893 | ||
|
|
a049cb297d | ||
|
|
9812aae740 | ||
|
|
603a6c5acc | ||
|
|
038185b656 | ||
|
|
ebb5e922bc | ||
|
|
3e1ac0cfbb | ||
|
|
c6b4359612 | ||
|
|
67a387c73d | ||
|
|
87bb3fb066 | ||
|
|
66904cca47 | ||
|
|
76c4a9d8b7 | ||
|
|
851e6ff7e8 | ||
|
|
dbd85cdc95 | ||
|
|
6041372860 | ||
|
|
8bf70eff81 | ||
|
|
ebe0784e8d | ||
|
|
7e78465406 | ||
|
|
9a9d7bb136 | ||
|
|
397c67ff83 | ||
|
|
90092a80ea | ||
|
|
03a55a21bd | ||
|
|
a45238ea54 | ||
|
|
90ed4d8d7c | ||
|
|
56463d3609 | ||
|
|
4975bd3077 | ||
|
|
e0ced3de08 | ||
|
|
ffb1c513c9 | ||
|
|
fc9d1c3f65 | ||
|
|
5a0185c574 | ||
|
|
27b55c6bbd | ||
|
|
6e85da363c | ||
|
|
dacb11d935 | ||
|
|
294b3830bf | ||
|
|
618b5fe466 | ||
|
|
10f12b20c5 | ||
|
|
8fc6b1bf1b | ||
|
|
6b9ae07d8a | ||
|
|
eb2c0ad210 | ||
|
|
b87ca6aa30 | ||
|
|
896a00c4b2 | ||
|
|
92290923d4 | ||
|
|
d1e69cbe98 | ||
|
|
12b6f5b69e | ||
|
|
f8df95e7e0 | ||
|
|
da43dbeed0 | ||
|
|
b9bb735371 | ||
|
|
2f851d8933 | ||
|
|
6fdb90961f | ||
|
|
5b995eaf9f | ||
|
|
53d649e04a | ||
|
|
c9fb5109c9 | ||
|
|
35d4a7780c | ||
|
|
b6adfab047 | ||
|
|
bad8daac6b | ||
|
|
dbd0359ccc | ||
|
|
8c7cfd3cb1 | ||
|
|
ad2af657d7 | ||
|
|
9716ddd9af | ||
|
|
6f00709c3d | ||
|
|
84c1bc8df1 | ||
|
|
48b919ebea | ||
|
|
16639c4b94 | ||
|
8e1b7ab2ac
|
|||
|
3503e65039
|
|||
|
f309967214
|
|||
|
7179ee2a87
|
|||
|
|
f71c19d081 | ||
|
|
bd9c868196 | ||
|
|
85b0e9826c | ||
|
|
21184c6c03 | ||
|
|
fba4012875 | ||
|
|
5ebfc6c379 | ||
|
|
ad4532c150 | ||
|
|
2f9acde332 | ||
|
|
4f0a8207b1 | ||
|
|
df0e7bfec5 | ||
|
|
959a928366 | ||
|
|
c7f21c295c | ||
|
|
6cb00cca9d | ||
|
|
cdae5ed29e | ||
|
|
b3b17ad234 | ||
|
|
0bd23354cc | ||
| 87e6dfe4bf | |||
|
|
4c1392c24d | ||
| 8c0f7a7617 | |||
|
|
0d77508f4c | ||
|
|
59e721d663 | ||
|
|
470957dc69 | ||
|
|
b53f9310e8 | ||
|
|
044715d9a2 | ||
|
|
b9825f89af | ||
|
|
85bb1f98ad | ||
| f188f2cf02 | |||
|
|
9bbc6dc8b8 | ||
|
6dc0f8652a
|
|||
|
b2fedb17c9
|
|||
|
|
8eb9e25a9c | ||
|
|
afc1c603d2 | ||
|
|
acd6230399 | ||
|
|
ade1ee507f | ||
|
|
c3ff63fa91 | ||
|
|
a95197a763 | ||
|
|
cf8b6ab2fe | ||
|
|
8748a7ea57 | ||
|
|
ef2fbe202b | ||
|
|
e14d67ce37 | ||
|
|
e1ff22a210 | ||
|
|
e97609cd11 | ||
|
|
359f6e5d2b | ||
|
|
461d0686ff | ||
|
|
24f2f79e72 | ||
|
|
c96a96eb71 | ||
|
|
ad60fe4aa7 | ||
|
|
3d0d602e11 | ||
|
|
5b61f94360 | ||
|
|
16bebe0a33 | ||
|
|
4593cc0c7e | ||
|
|
cde114d52c | ||
|
|
e01ef63e10 | ||
|
|
bac92080cb | ||
|
|
ba77423944 | ||
|
|
acfb67cf65 | ||
|
|
7605c58e53 | ||
|
|
78c348c3b5 | ||
|
|
eb498f8330 | ||
|
|
48854b5842 | ||
|
|
84477e3680 | ||
|
|
8271ed813f | ||
|
|
88661e725d | ||
|
|
183c8a7e5e | ||
|
|
e1e282f406 | ||
|
|
10832691c4 | ||
|
|
1b598f5ced | ||
|
|
be11066e34 | ||
|
|
fd9e17aa8d | ||
|
|
d98fd05b06 | ||
|
|
96f16352a6 | ||
|
|
3a2cbb377f | ||
|
|
ea7b8b5036 | ||
|
|
36d4c6d7bd | ||
|
|
1d3a4cbb2e | ||
|
|
d1a6dd7de4 | ||
|
|
ab4e0dba1c | ||
|
|
b9ef591bc8 | ||
|
|
6915c0ef9e | ||
|
|
80dd8bcd8e | ||
|
|
265180aedc | ||
|
|
576723dd3d | ||
|
|
4256ef1eed | ||
|
|
a7069fbf1e | ||
|
|
c29376f715 | ||
|
|
2ba9714cad | ||
|
|
12b46de706 | ||
|
|
d482deccb4 | ||
|
|
50dfc81857 | ||
|
|
54a1b6c512 | ||
|
|
fc946e5283 | ||
|
|
19cfdf719c | ||
|
|
de24d11463 | ||
|
|
270b774d7b | ||
|
|
f67e732da1 | ||
|
|
28a065c198 | ||
|
|
90110ec6cd | ||
|
|
32b3b48261 | ||
|
|
77295f0dc3 | ||
|
|
2972d9f76e | ||
|
|
79261a6ab4 | ||
|
|
901833da91 | ||
|
|
a91ef8e596 | ||
|
|
48ab9a4ddd | ||
|
|
9adda47fed | ||
|
|
5aa0c432f2 | ||
|
|
9baf0feab9 | ||
|
|
7131fa555e | ||
|
|
ef3733d534 | ||
|
|
b1c1b98bb8 | ||
|
|
fc6d988a52 | ||
|
|
a035b70841 | ||
|
|
e385dc6503 | ||
|
|
b58d4ddc59 | ||
|
|
0b85ecd9d2 | ||
|
|
00c89596cd | ||
|
|
b3ac93b483 | ||
|
|
ede25cc513 | ||
|
|
c5689556d9 | ||
|
|
5046f3aa07 | ||
|
|
ea5cc55179 | ||
|
|
84af2d54c1 | ||
|
|
c647aa53f5 | ||
|
|
b83b5ba4a9 | ||
|
|
047bb97edf | ||
|
|
5f1e4bd76c | ||
|
|
a4f9d38ea8 | ||
|
|
e383fef979 | ||
|
|
34cc878a50 | ||
|
|
4c290e5d81 | ||
|
|
a1d5d23a42 | ||
|
|
b2204382c8 | ||
|
|
ae8222412a | ||
|
|
40b6bf3376 | ||
|
|
13a8c33aa2 | ||
|
|
6626e5ad90 | ||
|
|
845756c080 | ||
|
|
a32d42a9e6 | ||
|
|
9a5bddcf6d | ||
|
|
1b00c9b158 | ||
|
|
b07ef04914 | ||
|
|
856310cf35 | ||
|
|
500fb337dc | ||
|
|
a0430849ce | ||
|
|
e10a517e9a | ||
|
|
fc20997bfe | ||
|
|
b274efda36 | ||
|
|
82625a3e3f | ||
|
|
f45a36dc03 | ||
|
|
8cd44cdd7e | ||
|
|
167641ccb7 | ||
|
|
32504b53d7 | ||
|
|
bfa545128d | ||
|
|
e88a2f59c9 | ||
|
|
b47949d791 | ||
|
|
d6276c947f | ||
|
|
788143f4e5 | ||
|
|
f7c7990ce9 | ||
|
|
83aa6ff341 | ||
|
|
f6f057d354 | ||
|
|
717137ddb7 | ||
|
|
5ed163b2d3 | ||
|
|
59c132875f | ||
|
|
166926e174 | ||
|
|
46c52c3ef1 | ||
|
|
fa5fd00de9 | ||
|
|
c81c01d484 | ||
|
|
f892c4c690 | ||
|
|
8d57ce050d | ||
|
|
bef5bfa22a | ||
|
|
259eab31c6 | ||
|
|
6d315974cc | ||
|
|
0313408b66 | ||
|
|
b8eabc8717 | ||
|
|
5665370b93 | ||
|
|
e79a04cb35 | ||
|
|
46a5f90152 | ||
|
|
ad39f4a732 | ||
|
|
6b05aecaa8 | ||
|
|
0990774b41 | ||
|
|
e006febdbf | ||
|
|
cfd096ecc3 | ||
|
|
f5d9ad11a5 | ||
|
|
510dc1c023 | ||
|
|
76f5bff3dd | ||
|
|
9bb65a9704 | ||
|
|
b275de6c67 | ||
|
|
fb1841a093 | ||
|
|
d11888daf0 | ||
|
|
24e14f5e74 | ||
|
|
2228176661 | ||
|
|
b21c2bd9ac | ||
|
|
ccf1c012c9 | ||
|
|
d8eaba9b3c | ||
|
|
4babf9a6e8 | ||
|
|
fb902c1ae1 | ||
|
|
3814010e7a | ||
|
|
ebf16c5b61 | ||
|
|
21c1c7b94a | ||
|
|
0fbb2754e7 | ||
|
|
038b1f85a7 | ||
|
|
2287e9817c | ||
|
|
4d9ec940ca | ||
|
|
e439a79970 | ||
|
|
2d6e50115b | ||
|
|
e4a634d78d | ||
|
|
9ff32e590f | ||
|
|
2fda989b05 | ||
|
|
6250683b0e | ||
|
|
30cd4caa33 | ||
|
|
474b6aaa84 | ||
|
|
810ea969d9 | ||
|
|
0d7668346f | ||
|
|
c870aaf5fd | ||
|
|
916d33abab | ||
|
|
0cee22255e | ||
|
|
a9d0a20459 | ||
|
|
7ce391790a | ||
|
|
db6f3bdf0b | ||
|
|
9a6aeae0db | ||
|
|
990b91d892 | ||
|
|
39e0193680 | ||
|
|
684fdce102 | ||
|
|
1f6bbaff32 | ||
|
|
2bdf7d99aa | ||
|
|
4f9f91f3b3 | ||
|
|
24a5c52097 | ||
|
|
fd9e0a6cfa | ||
|
|
14efe14dfe | ||
|
|
e43d909961 | ||
|
|
400cb4bbe2 | ||
|
|
1d78dec65f | ||
|
|
ac6d9bcdbe | ||
|
|
439bfd43c1 | ||
|
|
ac2daf42db | ||
|
|
eb9411586a | ||
|
|
cc328161f6 | ||
|
|
e683a96d40 | ||
|
|
dde79904cf | ||
|
|
3038f00c4d | ||
|
|
d48cc9d3b5 | ||
|
|
25c7218f1b | ||
|
|
d7b85b2009 | ||
|
|
37241289ee | ||
|
|
f65881f79a | ||
|
|
4caaa8c576 | ||
|
|
a6b56cf2e4 | ||
|
|
19dc41fde1 | ||
|
|
b64a58f280 | ||
|
|
602ea813f2 | ||
|
|
4920ae7b80 | ||
|
|
51dca6d107 | ||
|
|
f3c185495d | ||
|
|
babc978dcf | ||
|
|
93e6b10b0f | ||
|
|
2b8183474c | ||
|
|
c23291116c | ||
|
|
cbf4b41f15 | ||
|
|
f42d460c23 | ||
|
|
eeb63a2523 | ||
|
|
c8ff3f7945 | ||
|
|
f67a7b6f78 | ||
|
|
3c8af1ca82 | ||
|
|
cebce2d5ef | ||
|
|
7cf3dfaa79 | ||
|
|
7be46b9a95 | ||
|
|
41293f075a | ||
|
|
b1ac03977e | ||
|
|
155c4f4ff5 | ||
|
|
5639979c1b | ||
|
|
440d20d7be | ||
|
|
2815c143f1 | ||
|
|
de83db8130 | ||
|
|
63009971a8 | ||
|
|
63a9e8907c | ||
|
|
4a5cb65a37 | ||
|
|
c22ecea9d6 | ||
|
|
e161b82ad3 | ||
|
|
8035b35436 | ||
|
|
84b99f815a | ||
|
|
a2c45ae056 | ||
|
|
822a8ff627 | ||
|
|
668928cbff | ||
|
|
59aa73d333 | ||
|
|
70ccf0ff45 | ||
|
|
e338795a0f | ||
|
|
307f110c80 | ||
|
|
dc7ac55939 | ||
|
|
0d6397d724 | ||
|
|
907735f8c6 | ||
|
|
247b5b16d3 | ||
|
|
91f3a5d8bc | ||
|
|
14f10cf9c3 | ||
|
|
ac9a5db009 | ||
|
|
deea70a23a | ||
|
|
3cb69c6b6e | ||
|
|
5a4e8f1a7a | ||
|
|
53e8aba7f5 | ||
|
|
f24d1949ba | ||
|
|
0cd6d9dc42 | ||
|
|
b256387410 | ||
|
|
370bb5a92a | ||
|
|
a88d0e3cd7 | ||
|
|
04af2350b6 | ||
|
|
a7b040642d | ||
|
|
25a674cabb | ||
|
|
146c74e0cb | ||
|
|
b18113d468 | ||
|
|
20ba85a8bb | ||
|
|
dd9aabc971 | ||
|
|
ed180ce6a2 | ||
|
|
c5dcb2937d | ||
|
|
a5292a26e2 | ||
|
|
d8d47fc238 | ||
|
|
ad6619b3b7 | ||
|
|
f70c9227ef | ||
|
|
7a55a6a430 | ||
|
|
1d151c277d | ||
|
|
acc6307a57 | ||
|
|
4da82dd820 | ||
|
|
333aabde1b | ||
|
|
f0968195cb | ||
|
|
5f89308f43 | ||
|
|
8931a4c15a | ||
|
|
8c8c5652ae | ||
|
|
713e0176c7 | ||
|
|
2684277a76 | ||
|
|
271af64d07 | ||
|
|
a9276a5fdb | ||
|
|
d762a7c504 | ||
|
|
a77097a7fa | ||
|
|
fadbb84b6e | ||
|
|
675f0d48bd | ||
|
|
05b787db5a | ||
|
|
0db2502498 | ||
|
|
a4c10bc3b3 | ||
|
|
3de74e4af9 | ||
|
|
acb5157b71 | ||
|
|
73501a4fb9 | ||
|
|
572725eaef | ||
|
|
bc45f98b51 | ||
|
|
66b3a10858 | ||
|
|
0205cdd8c4 | ||
|
|
60008e291e | ||
|
|
0efc6d4311 | ||
|
|
f1c5731005 | ||
|
|
8edd2ccd67 | ||
|
|
d5282ae64e | ||
|
|
8304c27fe2 | ||
|
|
482095ca65 | ||
|
|
90decae0f8 | ||
|
|
c987d1e070 | ||
|
|
34b1834cd7 | ||
|
|
2c511803a5 | ||
|
|
82bbd04cfb | ||
|
|
503474d486 | ||
|
|
cc2bd8bce9 | ||
|
|
8450d15be6 | ||
|
|
2d3e320375 | ||
|
|
48c94e4d30 | ||
|
|
6425cc1e1e | ||
|
|
3cc40fd15f | ||
|
|
252fe0aa9a | ||
|
|
75a15533d2 | ||
|
|
8c5c3fa52c | ||
|
|
6e713c5063 | ||
|
|
2c760038e0 | ||
|
|
ba9bab2b4d | ||
|
|
6cbc677183 | ||
|
|
b74b54f0c2 | ||
|
|
2cf00168eb | ||
|
|
e34ae8878d | ||
|
|
0ab4c4b63d | ||
|
|
2e6bf4c9c7 | ||
|
|
b364923738 | ||
|
|
1986a57662 | ||
|
|
532f7cff8c | ||
|
|
d8a6ba7101 | ||
|
|
cdd3a99ab7 | ||
|
|
9c271d1b2a | ||
|
|
517091cbda | ||
|
|
68783429d4 | ||
|
|
14c33eac1e | ||
|
|
59aa1f7164 | ||
|
|
8fd5b47545 | ||
|
|
7880489034 | ||
|
|
dc8abfe436 | ||
|
|
99569f3781 | ||
|
|
2563850fcc | ||
|
|
7279126bdc | ||
|
|
8ca70e7895 | ||
|
|
12f8cf6a90 | ||
|
|
77d68fc469 | ||
|
|
6a0722a697 | ||
|
|
bf1723e63c | ||
|
|
c2a7e5223b | ||
|
|
cbc2acff7a | ||
|
|
58d0469918 | ||
|
|
b97776cbb8 | ||
|
|
218f7bec7b | ||
|
|
b8f2b7fb1f | ||
|
|
2c2acbba46 | ||
|
|
cd311e0fa1 | ||
|
|
85933c4845 | ||
|
|
b25bf4f7a3 | ||
|
|
b93302153e | ||
|
|
484d16122c | ||
|
|
5bf313924a | ||
|
|
92ef43bcb6 | ||
|
|
f5a7328ed5 | ||
|
|
d7d131d4be | ||
|
|
e0d3686f5d | ||
|
|
8c6e62e1b4 | ||
|
|
5ddd26d492 | ||
|
|
70e068069d | ||
|
|
b26e07722f | ||
|
|
8613a71cf7 | ||
|
|
f701c9c146 | ||
|
|
3988055161 | ||
|
|
c77a37cbb8 | ||
|
|
ff49fa6d48 | ||
|
|
78bf7eca24 | ||
|
|
74c186ea08 | ||
|
|
c118cc5746 | ||
|
|
c81db8994d | ||
|
|
b8c9863a24 | ||
|
|
18a8c714ad | ||
|
|
a819ee9d36 | ||
|
|
bcde05d87d | ||
|
|
5f307409bb | ||
|
|
22ababfc0d | ||
|
|
99f653ab66 | ||
|
|
e9619382d4 | ||
|
|
4ee1e39a4a | ||
|
|
77a6bbc7c5 | ||
|
|
4db25439c9 | ||
|
|
c143f38a94 | ||
|
|
9f9f6d3644 | ||
|
|
12469a031e | ||
|
|
faa5080d64 | ||
|
|
bcee240993 | ||
|
|
72fd9f97da | ||
|
|
6f6b32207a | ||
|
|
30fe86a6df | ||
|
|
e3cadcb4e3 | ||
|
|
5b37478893 | ||
|
|
d245d4ba6a | ||
|
|
3725615262 | ||
|
|
7c7d7d526e | ||
|
|
45d5a3b9d7 | ||
|
|
cdda2abdd1 | ||
|
|
d21df83278 | ||
|
|
1a0ae2f59b | ||
|
|
c0166ceb0b | ||
|
|
f143dbdc1f | ||
|
|
7c7ace90c9 | ||
|
|
c022b56143 | ||
|
|
113fb6fbeb | ||
|
|
fc3340e374 | ||
|
|
9648b75f52 | ||
|
|
4a941e56d9 | ||
|
|
0b8bfe2cdc | ||
|
|
4e68a2c881 | ||
|
|
710ad50ab2 | ||
|
|
10c7bd98c2 | ||
|
|
9e061a8cb4 | ||
|
|
41678f6ac7 | ||
|
|
43bfd5deff | ||
|
|
215b294da4 | ||
|
|
e4dffc73d7 | ||
|
|
c9b61b862b | ||
|
|
c31e9bbcdb | ||
|
|
208929f846 | ||
|
|
61bed2b478 | ||
|
|
8c78a2722c | ||
|
|
7570dc6c52 | ||
|
|
3148a19685 | ||
|
|
7df77d33e4 | ||
|
|
f413f4e31c | ||
|
|
80723cbed1 | ||
|
|
109918a2c6 | ||
|
|
291e9774b4 | ||
|
|
d02b004dc7 | ||
|
|
433f9b81b8 | ||
|
|
cd9eed0c81 | ||
|
|
5f42b1a6ee | ||
|
|
c8a25fc92b | ||
|
|
2c89894372 | ||
|
|
4f29d376ca | ||
|
|
b070f4a1ce | ||
|
|
a16ffd1e0d | ||
|
|
645c592bd1 | ||
|
|
4416c336f5 | ||
|
|
bd05aa5ee0 | ||
|
|
1e8ab0bc8a | ||
|
|
f2247e0c67 | ||
|
|
be332b36aa | ||
|
|
cd708a9f9a | ||
|
|
c3df2d7b23 | ||
|
|
54c3245663 | ||
|
|
4a37a26733 | ||
|
|
c63620c649 | ||
|
|
9793152a71 | ||
|
|
39deb69c34 | ||
|
|
0745eac6c5 | ||
|
|
e4dd9d59f6 | ||
|
|
ed933e68e2 | ||
|
|
3a6950c1ba | ||
|
|
527fc951d3 | ||
|
|
c07e0a1951 | ||
|
|
84e9ead97a | ||
|
|
26bfab5114 | ||
|
|
f8d2d624b7 | ||
|
|
78c390b172 | ||
|
|
5385655b02 | ||
|
|
86cd8d55b2 | ||
|
|
3aa934c020 | ||
|
|
194e98256f | ||
|
|
024f4c81b4 | ||
|
|
8f25df9827 | ||
|
|
f8fbf9a7c7 | ||
|
|
11b952c3e7 | ||
|
|
4691ccf166 | ||
|
|
987a7eda6e | ||
|
|
ec602a0e50 | ||
|
|
73a82f4845 | ||
|
|
8e0511667a | ||
|
|
a699163b46 | ||
|
|
834c79a2fd | ||
|
|
af41947e33 | ||
|
|
98fed28706 | ||
|
|
7bb48ebc8e | ||
|
|
2c54fb0b20 | ||
|
|
4498f5b934 | ||
|
|
d2e6d6d319 | ||
|
|
db5bf0019c | ||
|
|
fae5e52f84 | ||
|
|
2bffab13a0 | ||
|
|
1f979cf22c | ||
|
|
f51c002f46 | ||
|
|
ceb583c8e7 | ||
|
|
361fae7f25 | ||
|
|
e0820c6b2a | ||
|
|
f58d74146d | ||
|
|
81b10d9795 | ||
|
|
faacd68e44 | ||
|
|
86ec24736f | ||
|
|
f219242966 | ||
|
|
5853925121 | ||
|
|
40ec029429 | ||
|
|
3d1ab88a25 | ||
|
|
6269a72df6 | ||
|
|
dc379563f1 | ||
|
|
482330c76b | ||
|
|
a3790094b8 | ||
|
|
66da158840 | ||
|
|
0a32b25bc8 | ||
|
|
66e22b05ef | ||
|
|
3044961de3 | ||
|
|
4857b2e17a | ||
|
|
deaaca537a | ||
|
|
17541d269f | ||
|
|
f82a283b19 | ||
|
|
6129f4c186 | ||
|
|
97756ca5e9 | ||
|
|
ac092ee2dc | ||
|
|
21e197a0d9 | ||
|
|
0548f6a3cf | ||
|
|
c6ce382188 | ||
|
|
df26dff9cc | ||
|
|
bb9b4cd3c7 | ||
|
|
d3b7088653 | ||
|
|
a5c966aa72 | ||
|
|
94a2608462 | ||
|
|
862b9d9a39 | ||
|
|
00961b85c8 | ||
|
|
1b48d59b4c |
3
.commitlintrc.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"extends": ["@commitlint/config-conventional"]
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
module.exports = {
|
||||
extends: 'react-app',
|
||||
parser: '@babel/eslint-parser'
|
||||
extends: ['react-app', 'prettier'],
|
||||
ignorePatterns: ['node_modules/', 'build/', 'coverage/', '*.scss', '*.css', '*.json'],
|
||||
};
|
||||
|
||||
2
.github/CODEOWNERS
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
# Automatically assigned to any PRs
|
||||
* @davidcralph @alexsparkes
|
||||
8
.github/ISSUE_TEMPLATE/bug-report.md
vendored
@@ -1,5 +1,5 @@
|
||||
---
|
||||
name: Bug Report
|
||||
name: Bug Report (Legacy)
|
||||
about: Report a bug to help improve Mue
|
||||
title: "[Bug]"
|
||||
labels: bug
|
||||
@@ -24,10 +24,10 @@ If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Desktop (please complete the following information):**
|
||||
- OS: [e.g. Windows, Ubuntu]
|
||||
- OS Version: [e.g 10, 19.10]
|
||||
- OS Version: [e.g 11, 23.10]
|
||||
- Browser: [e.g. Chrome, Firefox]
|
||||
- Browser Version: [e.g. 70]
|
||||
- Mue Version: [e.g. 0.5]
|
||||
- Browser Version: [e.g. 115]
|
||||
- Mue Version: [e.g. 7.1.0]
|
||||
- Resolution: [e.g 1920x1080]
|
||||
|
||||
**Additional context**
|
||||
|
||||
4
.github/ISSUE_TEMPLATE/feature-request.md
vendored
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: Feature Request
|
||||
about: Request things to be added to mue
|
||||
name: Request a feature
|
||||
about: Request something to be implemented in the extension.
|
||||
title: "[Feature Request]"
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
|
||||
58
.github/ISSUE_TEMPLATE/issue_report.yml
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
name: Report a bug
|
||||
description: Report an issue with the extension.
|
||||
title: "[Bug] Insert issue name here"
|
||||
labels: ["bug"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for taking the time to report a Mue issue!
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: Description
|
||||
description: Describe the issue you are having with the extension
|
||||
placeholder: e.g. It does not save my settings upon editing the Greeting widget
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: version
|
||||
attributes:
|
||||
label: Version
|
||||
description: What version of Mue are you running?
|
||||
options:
|
||||
- 7.0.0
|
||||
- 6.0.6
|
||||
- 6.0.5
|
||||
- 6.0.4
|
||||
- 6.0.3
|
||||
- 6.0.2
|
||||
- 6.0.1
|
||||
- 6.0.0
|
||||
default: 0
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: browsers
|
||||
attributes:
|
||||
label: What browser(s) are you seeing the problem on?
|
||||
multiple: true
|
||||
options:
|
||||
- Mozilla Firefox
|
||||
- Google Chrome
|
||||
- Naver Whale
|
||||
- Microsoft Edge
|
||||
- type: textarea
|
||||
id: logs
|
||||
attributes:
|
||||
label: Relevant log output
|
||||
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
|
||||
render: shell
|
||||
- type: checkboxes
|
||||
id: terms
|
||||
attributes:
|
||||
label: Code of Conduct
|
||||
description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/mue/.github/blob/main/CODE_OF_CONDUCT.md).
|
||||
options:
|
||||
- label: I agree to follow this project's Code of Conduct
|
||||
required: true
|
||||
27
.github/workflows/automerge.yml
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
name: automerge
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: "20.x"
|
||||
- name: Install dependencies
|
||||
run: npm install
|
||||
- name: Build
|
||||
run: npm run build
|
||||
automerge:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
pull-requests: write
|
||||
contents: write
|
||||
|
||||
steps:
|
||||
- uses: fastify/github-action-merge-dependabot@v3.0.0
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
27
.github/workflows/submit.yml
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
name: Submit
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
tag:
|
||||
description: "Release tag to submit, i.e 6.0.5"
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
submit:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Setup Chrome
|
||||
uses: browser-actions/setup-chrome@latest
|
||||
with:
|
||||
chrome-version: latest
|
||||
- name: Download Github Release Assets
|
||||
uses: PlasmoHQ/download-release-asset@v1.0.0
|
||||
with:
|
||||
tag: ${{ github.event.inputs.tag }}
|
||||
- name: Browser Plugin Publish
|
||||
uses: PlasmoHQ/bpp@v2
|
||||
env:
|
||||
PUPPETEER_EXECUTABLE_PATH: /opt/hostedtoolcache/chromium/latest/x64/chrome
|
||||
with:
|
||||
keys: ${{ secrets.SUBMIT_KEYS }}
|
||||
8
.gitignore
vendored
@@ -1,12 +1,18 @@
|
||||
# Directories
|
||||
node_modules/
|
||||
.history/
|
||||
.vscode/
|
||||
build/
|
||||
.idea/
|
||||
dist/
|
||||
|
||||
# Files
|
||||
package-lock.json
|
||||
.stylelintcache
|
||||
yarn-error.log
|
||||
.eslintcache
|
||||
stats.json
|
||||
yarn.lock
|
||||
*.zip
|
||||
keys.json
|
||||
.DS_Store
|
||||
*.zip
|
||||
|
||||
4
.husky/commit-msg.sh
Normal file
@@ -0,0 +1,4 @@
|
||||
#!/bin/sh
|
||||
. "${dirname "$0"}/_/husky/husky.sh"
|
||||
|
||||
npx commitlint --edit $1
|
||||
7
.prettierrc.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"printWidth": 100,
|
||||
"trailingComma": "all",
|
||||
"tabWidth": 2,
|
||||
"semi": true,
|
||||
"singleQuote": true
|
||||
}
|
||||
9
.stylelintrc.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"extends": ["stylelint-config-standard-scss"],
|
||||
"plugins": ["stylelint-scss"],
|
||||
"rules": {
|
||||
"selector-class-pattern": null,
|
||||
"no-descending-specificity": null,
|
||||
"scss/no-global-function-names": null
|
||||
}
|
||||
}
|
||||
5
LICENSE
@@ -1,6 +1,9 @@
|
||||
BSD 3-Clause License
|
||||
|
||||
Copyright (c) 2018-2021 The Mue Authors
|
||||
Copyright (c) 2023-2024 Kaiso One Ltd
|
||||
Copyright (c) 2019-2024 The Mue Authors
|
||||
Copyright (c) 2018-2019 David Ralph
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
|
||||
82
README.md
@@ -1,4 +1,4 @@
|
||||
<img src="https://raw.githubusercontent.com/mue/branding/main/logo/logo_round.png" align="left" width="180px" height="180px"/>
|
||||
<img src="assets/logo.png" align="left" width="180px" height="180px"/>
|
||||
<img align="left" width="0" height="192px" hspace="10"/>
|
||||
|
||||
> <a href="https://muetab.com/">Mue</a>
|
||||
@@ -12,73 +12,92 @@ Mue is a fast, open and free-to-use browser extension that gives a new, fresh an
|
||||
<br>
|
||||
|
||||
## Table of contents
|
||||
* [Screenshots](#screenshot)
|
||||
* [Features](#features)
|
||||
* [Planned Features](#planned-features)
|
||||
* [Installation](#installation)
|
||||
* [Chrome](#chrome)
|
||||
* [Firefox](#firefox)
|
||||
* [Edge Chromium](#edge-chromium)
|
||||
* [Whale](#whale)
|
||||
* [Other](#other)
|
||||
* [Contributing](#development)
|
||||
* [Translations](#translations)
|
||||
* [Credits](#credits)
|
||||
* [Developers](#developers)
|
||||
* [Translators](#translators)
|
||||
* [Contributors](#contributors)
|
||||
* [Resources](#resources)
|
||||
|
||||
- [Table of contents](#table-of-contents)
|
||||
- [Screenshots](#screenshots)
|
||||
- [Features](#features)
|
||||
- [Planned Features](#planned-features)
|
||||
- [Installation](#installation)
|
||||
- [Chrome](#chrome)
|
||||
- [Firefox](#firefox)
|
||||
- [Edge (Chromium)](#edge-chromium)
|
||||
- [Whale](#whale)
|
||||
- [Other](#other)
|
||||
- [Development](#development)
|
||||
- [Translations](#translations)
|
||||
- [Credits](#credits)
|
||||
- [Developers](#developers)
|
||||
- [Translators](#translators)
|
||||
- [Contributors](#contributors)
|
||||
- [Resources](#resources)
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||

|
||||
|
||||
## Features
|
||||
* Fast and free
|
||||
* Supports multiple browsers
|
||||
* Actively developed and open source
|
||||
* Automatically updating [API](https://github.com/mue/api) with new photos, quotes and offline mode
|
||||
* Widgets such as search bar, weather, quick links, clock, date, quote, greeting
|
||||
* Settings - enable/disable various features and customise parts of Mue
|
||||
* Navbar with copy button, favourite background, notes feature etc
|
||||
* [Marketplace](https://github.com/mue/marketplace) - download custom photo packs, quote packs and preset settings made by the community
|
||||
|
||||
- Fast and free
|
||||
- Supports multiple browsers
|
||||
- Actively developed and open source
|
||||
- Automatically updating [API](https://github.com/mue/api) with new photos, quotes and offline mode
|
||||
- Widgets such as search bar, weather, quick links, clock, date, quote, greeting
|
||||
- Settings - enable/disable various features and customise parts of Mue
|
||||
- Navbar with copy button, favourite background, notes feature etc
|
||||
- [Marketplace](https://github.com/mue/marketplace) - download custom photo packs, quote packs and preset settings made by the community
|
||||
|
||||
### Planned Features
|
||||
Please see our [roadmap](https://trello.com/b/w7zhS7Hi/mue-50).
|
||||
|
||||
Please see our [roadmap](https://trello.com/b/w7zhS7Hi/mue-50). We are currently working on a rewrite over on the "phoenix" branch.
|
||||
|
||||
## Installation
|
||||
*A demo of the tab can be found [here](https://demo.muetab.com), and the latest GitHub commit build [here](https://mue.vercel.app)*
|
||||
|
||||
_A demo of the tab can be found [here](https://demo.muetab.com), and the latest GitHub commit build [here](https://mue.vercel.app)_
|
||||
|
||||
### Chrome
|
||||
|
||||
[](https://chrome.google.com/webstore/detail/mue/bngmbednanpcfochchhgbkookpiaiaid)
|
||||
<br>
|
||||
[Chrome Web Store](https://chrome.google.com/webstore/detail/mue/bngmbednanpcfochchhgbkookpiaiaid)
|
||||
|
||||
### Firefox
|
||||
|
||||
[](https://addons.mozilla.org/firefox/addon/mue)
|
||||
<br>
|
||||
[Firefox Add-ons](https://addons.mozilla.org/firefox/addon/mue)
|
||||
|
||||
### Edge (Chromium)
|
||||
|
||||
[Microsoft Edge Addons](https://microsoftedge.microsoft.com/addons/detail/aepnglgjfokepefimhbnibfjekidhmja)
|
||||
|
||||
### Whale
|
||||
|
||||
[Whale Store](https://store.whale.naver.com/detail/ecllekeilcmicbfkkiknfdddbogibbnc)
|
||||
|
||||
### Other
|
||||
|
||||
[GitHub Releases](https://github.com/mue/mue/releases)
|
||||
|
||||
## Development
|
||||
|
||||
Please see the [documentation](https://docs.muetab.com/development#mue-tab).
|
||||
|
||||
### Translations
|
||||
Please see the [documentation](https://docs.muetab.com/translations).
|
||||
|
||||
[](https://hosted.weblate.org/engage/mue/)
|
||||
|
||||
## Credits
|
||||
|
||||
### Developers
|
||||
|
||||
[David Ralph](https://github.com/davidcralph) - Lead development, photographer <br/>
|
||||
[Alex Sparkes](https://github.com/alexsparkes) - Name, lead design, photographer <br/>
|
||||
[Isaac Saunders](https://github.com/eartharoid) - QA, development, photographer <br/>
|
||||
[Wessel Tip](https://github.com/Wessel) - Development <br/>
|
||||
|
||||
### Translators
|
||||
|
||||
[Wessel Tip](https://github.com/Wessel), [Heimen Stoffels](https://github.com/Vistaus) - Dutch <br/>
|
||||
[Alex Sparkes](https://github.com/alexsparkes), [Maxime](https://github.com/exiam) - French <br/>
|
||||
[Anders](https://github.com/FuryingFox) - Norwegian <br/>
|
||||
@@ -86,10 +105,17 @@ Please see the [documentation](https://docs.muetab.com/translations).
|
||||
[Vicente](https://github.com/Vicente015) - Spanish <br/>
|
||||
[Austin Huang](https://github.com/austinhuang0131) - Chinese (Simplified) <br/>
|
||||
[FreeFun](https://github.com/xXFreeFunXx) - German <br/>
|
||||
[Aksal](https://github.com/aksalsf) - Indonesian <br/>
|
||||
[Kağan Can Şit](https://github.com/KaganCanSit) - Turkish <br/>
|
||||
efeaydal - Turkish <br/>
|
||||
|
||||
### Contributors
|
||||
|
||||
Many thanks to the photographers [here](https://api.muetab.com/images/photographers) for letting us use their wonderful photographs.
|
||||
|
||||
And finally, a big thank you to all the other [contributors](https://github.com/mue/mue/graphs/contributors)!
|
||||
|
||||
### Resources
|
||||
|
||||
[Pexels](https://pexels.com), [Unsplash](https://unsplash.com) - Stock photos used for offline mode <br/>
|
||||
[Undraw](https://undraw.co) - Welcome modal images
|
||||
|
||||
BIN
assets/logo.png
Normal file
|
After Width: | Height: | Size: 222 KiB |
|
Before Width: | Height: | Size: 308 KiB After Width: | Height: | Size: 213 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 76 KiB |
@@ -1,6 +0,0 @@
|
||||
module.exports = {
|
||||
presets: ['@babel/preset-env', ['@babel/preset-react', {
|
||||
runtime: 'automatic'
|
||||
}]],
|
||||
plugins: ['@babel/plugin-proposal-class-properties', '@babel/transform-runtime', '@babel/plugin-transform-react-inline-elements', 'babel-plugin-transform-react-class-to-function', '@babel/plugin-transform-react-constant-elements']
|
||||
};
|
||||
115
index.html
Normal file
@@ -0,0 +1,115 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/src/assets/icons/32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/src/assets/icons/16x16.png" />
|
||||
<title>New Tab</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<noscript>
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Lexend+Deca:wght@400&display=swap');
|
||||
|
||||
* {
|
||||
font-family: 'Lexend Deca', sans-serif;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.criticalError {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
.criticalError .criticalError-actions {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.criticalError a {
|
||||
border: 0;
|
||||
border-radius: 12px;
|
||||
padding: 10px 30px 10px 30px;
|
||||
font-size: 1rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-flow: row;
|
||||
justify-content: center;
|
||||
gap: 20px;
|
||||
transition: 0.5s;
|
||||
cursor: pointer;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
* {
|
||||
background-color: #000000;
|
||||
}
|
||||
|
||||
.criticalError .criticalError-message {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.criticalError p {
|
||||
color: rgba(255, 255, 255, 0.7529411765);
|
||||
}
|
||||
|
||||
.criticalError a {
|
||||
background: #0e1013;
|
||||
box-shadow: 0 0 0 1px #484848;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.criticalError a:hover {
|
||||
background: #1e1e1e;
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
* {
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
.criticalError .criticalError-message {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.criticalError p {
|
||||
color: rgba(0, 0, 0, 0.7529411765);
|
||||
}
|
||||
|
||||
.criticalError a {
|
||||
background: #fdfdfd;
|
||||
box-shadow: 0 0 0 1px #484848;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.criticalError a:hover {
|
||||
background: #f5f5f5;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<div class="criticalError">
|
||||
<div class="criticalError-message">
|
||||
<h1>A critical error has occurred</h1>
|
||||
<p>The new tab could not be loaded. Please enable JavaScript and try again.</p>
|
||||
<div class="criticalError-actions">
|
||||
<a href="https://github.com/mue/mue/issues/new/choose" target="_blank" rel="noreferrer"
|
||||
>Report Issue</a
|
||||
>
|
||||
<a href="https://discord.gg/zv8C9F8" target="_blank" rel="noreferrer"
|
||||
>Support Discord</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</noscript>
|
||||
<div id="root"></div>
|
||||
<script type="module" src="/src/index.jsx"></script>
|
||||
</body>
|
||||
</html>
|
||||
9
jsconfig.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"target": "es6",
|
||||
"baseUrl": "src"
|
||||
},
|
||||
"include": ["src"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
8
manifest/_locales/tr_TR/messages.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"name": {
|
||||
"message": "Mue"
|
||||
},
|
||||
"description": {
|
||||
"message": "Modern tarayıcılar için hızlı, açık ve kullanımı ücretsiz yeni sekme sayfası."
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
/* eslint-disable no-undef */
|
||||
chrome.runtime.setUninstallURL('https://muetab.com/uninstall');
|
||||
|
||||
chrome.runtime.onInstalled.addListener((details) => {
|
||||
if (details.reason === 'install') {
|
||||
chrome.tabs.create({
|
||||
url: chrome.runtime.getURL('index.html')
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -1,10 +1,15 @@
|
||||
/* eslint-disable no-use-before-define */
|
||||
/* eslint-disable no-undef */
|
||||
if (typeof browser === 'undefined') {
|
||||
var browser = chrome;
|
||||
}
|
||||
|
||||
browser.runtime.setUninstallURL('https://muetab.com/uninstall');
|
||||
|
||||
browser.runtime.onInstalled.addListener((details) => {
|
||||
if (details.reason === 'install') {
|
||||
browser.tabs.create({
|
||||
url: browser.runtime.getURL('index.html')
|
||||
url: browser.runtime.getURL('index.html'),
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"manifest_version": 2,
|
||||
"manifest_version": 3,
|
||||
"offline_enabled": true,
|
||||
"default_locale": "en",
|
||||
"name": "__MSG_name__",
|
||||
"description": "__MSG_description__",
|
||||
"version": "6.0.3",
|
||||
"version": "7.1.0",
|
||||
"homepage_url": "https://muetab.com",
|
||||
"browser_action": {
|
||||
"action": {
|
||||
"default_icon": "icons/128x128.png"
|
||||
},
|
||||
"chrome_url_overrides": {
|
||||
@@ -17,9 +17,7 @@
|
||||
"48": "icons/48x48.png",
|
||||
"128": "icons/128x128.png"
|
||||
},
|
||||
"content_security_policy": "script-src 'self' https://api.bing.com https://www.google.com; object-src 'self'",
|
||||
"background": {
|
||||
"persistent": false,
|
||||
"scripts": [ "background-chrome.js" ]
|
||||
"service_worker": "background.js"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"manifest_version": 2,
|
||||
"manifest_version": 3,
|
||||
"name": "Mue",
|
||||
"description": "Fast, open and free-to-use new tab page for modern browsers.",
|
||||
"version": "6.0.3",
|
||||
"version": "7.1.0",
|
||||
"homepage_url": "https://muetab.com",
|
||||
"browser_action": {
|
||||
"action": {
|
||||
"default_icon": "icons/128x128.png"
|
||||
},
|
||||
"chrome_url_overrides": {
|
||||
@@ -17,6 +17,5 @@
|
||||
},
|
||||
"chrome_settings_overrides": {
|
||||
"homepage": "index.html"
|
||||
},
|
||||
"content_security_policy": "script-src 'self' https://api.bing.com https://www.google.com; object-src 'self'"
|
||||
}
|
||||
}
|
||||
|
||||
100
package.json
@@ -9,66 +9,56 @@
|
||||
"homepage": "https://muetab.com",
|
||||
"bugs": "https://github.com/mue/mue/issues/new?assignees=&labels=bug&template=bug-report.md&title=%5BBUG%5D",
|
||||
"license": "BSD-3-Clause",
|
||||
"version": "6.0.3",
|
||||
"version": "7.1.0",
|
||||
"dependencies": {
|
||||
"@eartharoid/i18n": "^1.0.2",
|
||||
"@emotion/react": "^11.5.0",
|
||||
"@emotion/styled": "^11.3.0",
|
||||
"@fontsource/lexend-deca": "4.4.5",
|
||||
"@fontsource/montserrat": "4.4.5",
|
||||
"@mui/icons-material": "5.2.0",
|
||||
"@mui/material": "5.2.1",
|
||||
"react": "17.0.2",
|
||||
"react-clock": "3.0.0",
|
||||
"react-color-gradient-picker": "0.1.2",
|
||||
"react-dom": "17.0.2",
|
||||
"react-hot-keys": "2.7.1",
|
||||
"react-modal": "3.14.4",
|
||||
"react-sortable-hoc": "2.0.0",
|
||||
"react-toastify": "8.1.0",
|
||||
"weather-icons-react": "1.2.0"
|
||||
"@eartharoid/i18n": "1.2.1",
|
||||
"@emotion/react": "^11.11.4",
|
||||
"@emotion/styled": "^11.11.5",
|
||||
"@floating-ui/react-dom": "2.1.0",
|
||||
"@fontsource/lexend-deca": "5.0.12",
|
||||
"@fontsource/montserrat": "5.0.17",
|
||||
"@muetab/react-sortable-hoc": "^2.0.1",
|
||||
"@mui/material": "5.15.19",
|
||||
"@sentry/react": "^8.5.0",
|
||||
"embla-carousel-autoplay": "8.1.3",
|
||||
"embla-carousel-react": "8.1.3",
|
||||
"fast-blurhash": "^1.1.2",
|
||||
"image-conversion": "^2.1.1",
|
||||
"react": "^18.3.1",
|
||||
"react-best-gradient-color-picker": "^3.0.7",
|
||||
"react-clock": "5.0.0",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-icons": "^5.2.1",
|
||||
"react-modal": "3.16.1",
|
||||
"react-toastify": "10.0.5",
|
||||
"use-debounce": "^10.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.16.0",
|
||||
"@babel/eslint-parser": "^7.16.3",
|
||||
"@babel/plugin-proposal-class-properties": "^7.16.0",
|
||||
"@babel/plugin-transform-react-constant-elements": "^7.16.0",
|
||||
"@babel/plugin-transform-react-inline-elements": "^7.16.0",
|
||||
"@babel/plugin-transform-runtime": "^7.16.0",
|
||||
"@babel/preset-env": "^7.16.0",
|
||||
"@babel/preset-react": "^7.16.0",
|
||||
"@commitlint/cli": "^19.3.0",
|
||||
"@commitlint/config-conventional": "^19.2.2",
|
||||
"@eartharoid/deep-merge": "^0.0.2",
|
||||
"babel-loader": "^8.2.3",
|
||||
"babel-plugin-transform-react-class-to-function": "^1.2.2",
|
||||
"copy-webpack-plugin": "9.1.0",
|
||||
"css-loader": "^6.5.1",
|
||||
"eslint": "^8.2.0",
|
||||
"eslint-config-react-app": "^6.0.0",
|
||||
"html-webpack-plugin": "^5.5.0",
|
||||
"mini-css-extract-plugin": "^2.4.4",
|
||||
"sass": "^1.43.4",
|
||||
"sass-loader": "^12.3.0",
|
||||
"source-map-loader": "^3.0.0",
|
||||
"webpack": "^5.63.0",
|
||||
"webpack-cli": "^4.9.1",
|
||||
"webpack-dev-server": "^4.4.0"
|
||||
"@vitejs/plugin-react-swc": "^3.6.0",
|
||||
"adm-zip": "^0.5.13",
|
||||
"eslint": "^8.57.0",
|
||||
"eslint-config-prettier": "^9.1.0",
|
||||
"eslint-config-react-app": "^7.0.1",
|
||||
"husky": "^9.0.11",
|
||||
"prettier": "^3.3.0",
|
||||
"sass": "^1.77.4",
|
||||
"stylelint": "^16.6.0",
|
||||
"stylelint-config-standard-scss": "^13.1.0",
|
||||
"stylelint-scss": "^6.3.1",
|
||||
"vite": "5.2.12",
|
||||
"vite-plugin-progress": "^0.0.7"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "webpack serve",
|
||||
"updatetranslations": "cd scripts && node updatetranslations.js",
|
||||
"build": "webpack --mode=production",
|
||||
"chrome": "cp manifest/chrome.json build/manifest.json && cp -r manifest/_locales build/_locales && cp manifest/background-chrome.js build/background-chrome.js",
|
||||
"firefox": "rm -rf build/_locales && cp manifest/firefox.json build/manifest.json"
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
">0.2%",
|
||||
"not dead",
|
||||
"not op_mini all"
|
||||
],
|
||||
"development": [
|
||||
"last 1 chrome version",
|
||||
"last 1 firefox version"
|
||||
]
|
||||
"dev": "vite",
|
||||
"dev:host": "vite --host",
|
||||
"translations": "cd scripts && node updatetranslations.js",
|
||||
"build": "vite build",
|
||||
"pretty": "prettier --write \"./**/*.{js,jsx,json,scss,css}\"",
|
||||
"lint": "eslint \"./src/**/*.{js,jsx}\" && stylelint \"./src/**/*.{scss,css}\"",
|
||||
"lint:fix": "eslint \"./src/**/*.{js,jsx}\" --fix && stylelint \"./src/**/*.{scss,css}\" --fix",
|
||||
"postinstall": "husky"
|
||||
}
|
||||
}
|
||||
|
||||
6428
pnpm-lock.yaml
generated
Normal file
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 645 B |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 9.9 KiB |
@@ -1,34 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang='en'>
|
||||
<head>
|
||||
<meta charset='utf-8' />
|
||||
<meta name='viewport' content='width=device-width, initial-scale=1' />
|
||||
<link rel='icon' type='image/png' sizes='32x32' href='./icons/32x32.png'>
|
||||
<link rel='icon' type='image/png' sizes='16x16' href='./icons/16x16.png'>
|
||||
<title>New Tab</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<noscript>
|
||||
<style>
|
||||
*, a {
|
||||
font-family: 'Lexend Deca', sans-serif;
|
||||
text-align: center;
|
||||
color: black;
|
||||
background: white !important;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
*, a {
|
||||
color: white;
|
||||
background: #2f3640 !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<h1>Error</h1>
|
||||
<h2>You need to enable JavaScript to use Mue</h2>
|
||||
<p>Having trouble? Contact us: <a href='https://muetab.com/contact'>https://muetab.com/contact</a></p>
|
||||
</noscript>
|
||||
<div id='root'></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,14 +1,85 @@
|
||||
// tl;dr this function merges the translation file with the english file in order to add untranslated strings
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const merge = require('@eartharoid/deep-merge');
|
||||
|
||||
fs.readdirSync('../src/translations').forEach((file) => {
|
||||
const compareAndRemoveKeys = (json1, json2) => {
|
||||
for (let key in json1) {
|
||||
if (json2.hasOwnProperty(key)) {
|
||||
if (typeof json1[key] === 'object' && typeof json2[key] === 'object') {
|
||||
compareAndRemoveKeys(json1[key], json2[key]);
|
||||
}
|
||||
} else {
|
||||
delete json1[key];
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const localesDir = path.join(__dirname, '../src/i18n/locales');
|
||||
const achievementsDir = path.join(localesDir, 'achievements');
|
||||
|
||||
// Check if the locales directory exists, if not, create it
|
||||
if (!fs.existsSync(localesDir)) {
|
||||
fs.mkdirSync(localesDir, { recursive: true });
|
||||
}
|
||||
|
||||
// Check if the achievements directory exists, if not, create it
|
||||
if (!fs.existsSync(achievementsDir)) {
|
||||
fs.mkdirSync(achievementsDir, { recursive: true });
|
||||
}
|
||||
|
||||
fs.readdirSync(localesDir).forEach((file) => {
|
||||
if (file === 'en_GB.json') {
|
||||
return;
|
||||
}
|
||||
|
||||
const newdata = merge(require('../src/translations/en_GB.json'), require('../src/translations/' + file));
|
||||
fs.writeFileSync('../src/translations/' + file, JSON.stringify(newdata, null, 2));
|
||||
// add new line
|
||||
fs.appendFileSync('../src/translations/' + file, '\n');
|
||||
if (fs.lstatSync(path.join(localesDir, file)).isDirectory()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const en = require(path.join(localesDir, 'en_GB.json'));
|
||||
const newdata = merge(en, require(path.join(localesDir, file)));
|
||||
|
||||
compareAndRemoveKeys(newdata, en);
|
||||
|
||||
fs.writeFileSync(path.join(localesDir, file), JSON.stringify(newdata, null, 2));
|
||||
|
||||
fs.appendFileSync(path.join(localesDir, file), '\n');
|
||||
});
|
||||
|
||||
fs.readdirSync(achievementsDir).forEach((file) => {
|
||||
if (file === 'en_GB.json') {
|
||||
return;
|
||||
}
|
||||
|
||||
if (fs.lstatSync(path.join(achievementsDir, file)).isDirectory()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const enGBFilePath = path.join(achievementsDir, 'en_GB.json');
|
||||
if (!fs.existsSync(enGBFilePath)) {
|
||||
console.error(`File 'en_GB.json' does not exist in the directory '${achievementsDir}'`);
|
||||
return;
|
||||
}
|
||||
|
||||
const en = require(enGBFilePath);
|
||||
const newdata = merge(en, require(path.join(achievementsDir, file)));
|
||||
|
||||
compareAndRemoveKeys(newdata, en);
|
||||
|
||||
fs.writeFileSync(path.join(achievementsDir, file), JSON.stringify(newdata, null, 2));
|
||||
|
||||
fs.appendFileSync(path.join(achievementsDir, file), '\n');
|
||||
|
||||
const locales = fs.readdirSync(localesDir);
|
||||
locales.forEach((locale) => {
|
||||
if (!fs.existsSync(path.join(achievementsDir, locale))) {
|
||||
// ignore directories
|
||||
if (fs.lstatSync(path.join(localesDir, locale)).isDirectory()) {
|
||||
return;
|
||||
}
|
||||
|
||||
fs.writeFileSync(path.join(achievementsDir, locale), JSON.stringify(en, null, 2));
|
||||
fs.appendFileSync(path.join(achievementsDir, locale), '\n');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
121
src/App.jsx
@@ -1,46 +1,75 @@
|
||||
import variables from 'modules/variables';
|
||||
import { PureComponent } from 'react';
|
||||
import { ToastContainer } from 'react-toastify';
|
||||
|
||||
import Background from 'components/widgets/background/Background';
|
||||
import Widgets from 'components/widgets/Widgets';
|
||||
import Modals from 'components/modals/Modals';
|
||||
|
||||
import { loadSettings, moveSettings } from 'modules/helpers/settings';
|
||||
|
||||
import EventBus from 'modules/helpers/eventbus';
|
||||
|
||||
export default class App extends PureComponent {
|
||||
componentDidMount() {
|
||||
// 4.0 -> 5.0 (the key below is only on 5.0)
|
||||
// now featuring 5.0 -> 5.1
|
||||
// the firstRun check was moved here because the old function was useless
|
||||
if (!localStorage.getItem('firstRun') || !localStorage.getItem('stats')) {
|
||||
moveSettings();
|
||||
window.location.reload();
|
||||
}
|
||||
|
||||
loadSettings();
|
||||
|
||||
EventBus.on('refresh', (data) => {
|
||||
if (data === 'other') {
|
||||
loadSettings(true);
|
||||
}
|
||||
});
|
||||
|
||||
variables.stats.tabLoad();
|
||||
}
|
||||
|
||||
render() {
|
||||
return (
|
||||
<>
|
||||
{(localStorage.getItem('background') === 'true') ? <Background/> : null}
|
||||
<ToastContainer position='bottom-right' autoClose={localStorage.getItem('toastDisplayTime') || 2500} newestOnTop={true} closeOnClick pauseOnFocusLoss/>
|
||||
<div id='center'>
|
||||
<Widgets/>
|
||||
<Modals/>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
}
|
||||
import { useEffect, useState } from 'react';
|
||||
import { ToastContainer } from 'react-toastify';
|
||||
import Background from 'features/background/Background';
|
||||
import Widgets from 'features/misc/views/Widgets';
|
||||
import Modals from 'features/misc/modals/Modals';
|
||||
import { loadSettings, moveSettings } from 'utils/settings';
|
||||
import EventBus from 'utils/eventbus';
|
||||
import variables from 'config/variables';
|
||||
|
||||
const useAppSetup = () => {
|
||||
useEffect(() => {
|
||||
const firstRun = localStorage.getItem('firstRun');
|
||||
const stats = localStorage.getItem('stats');
|
||||
|
||||
if (!firstRun || !stats) {
|
||||
moveSettings();
|
||||
window.location.reload();
|
||||
}
|
||||
|
||||
loadSettings();
|
||||
|
||||
const refreshHandler = (data) => {
|
||||
if (data === 'other') {
|
||||
loadSettings(true);
|
||||
}
|
||||
};
|
||||
|
||||
EventBus.on('refresh', refreshHandler);
|
||||
|
||||
variables.stats.tabLoad();
|
||||
|
||||
return () => {
|
||||
EventBus.off('refresh', refreshHandler);
|
||||
};
|
||||
}, []);
|
||||
};
|
||||
|
||||
const App = () => {
|
||||
const [toastDisplayTime, setToastDisplayTime] = useState(2500);
|
||||
const [showBackground, setShowBackground] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
const storedToastDisplayTime = localStorage.getItem('toastDisplayTime');
|
||||
const storedBackground = localStorage.getItem('background');
|
||||
|
||||
if (storedToastDisplayTime) {
|
||||
setToastDisplayTime(parseInt(storedToastDisplayTime, 10));
|
||||
}
|
||||
|
||||
if (storedBackground === 'true') {
|
||||
setShowBackground(true);
|
||||
}
|
||||
}, []);
|
||||
|
||||
useAppSetup();
|
||||
|
||||
return (
|
||||
<>
|
||||
{showBackground && <Background />}
|
||||
<ToastContainer
|
||||
position="top-center"
|
||||
autoClose={toastDisplayTime}
|
||||
newestOnTop={true}
|
||||
closeOnClick
|
||||
pauseOnFocusLoss
|
||||
/>
|
||||
<div id="center">
|
||||
<Widgets />
|
||||
<Modals />
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default App;
|
||||
|
||||
55
src/ErrorBoundary.jsx
Normal file
@@ -0,0 +1,55 @@
|
||||
import React, { PureComponent } from 'react';
|
||||
|
||||
import { captureException } from '@sentry/react';
|
||||
|
||||
class ErrorBoundary extends PureComponent {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
error: false,
|
||||
errorData: '',
|
||||
showReport: true,
|
||||
};
|
||||
}
|
||||
|
||||
componentDidCatch(error, errorInfo) {
|
||||
this.setState({ error: true, errorData: errorInfo });
|
||||
console.error('Error boundary caught an error:', error, errorInfo);
|
||||
}
|
||||
|
||||
reportError() {
|
||||
captureException(this.state.errorData);
|
||||
this.setState({
|
||||
showReport: false,
|
||||
});
|
||||
}
|
||||
|
||||
render() {
|
||||
if (this.state.error) {
|
||||
return (
|
||||
<div className="criticalError">
|
||||
<div className="criticalError-message">
|
||||
<h1>A critical error has occurred</h1>
|
||||
<p>
|
||||
The new tab page could not be loaded. Please uninstall the extension and try again.
|
||||
</p>
|
||||
<div className="criticalError-actions">
|
||||
{this.state.showReport ? (
|
||||
<button onClick={() => this.reportError()}>Report Issue</button>
|
||||
) : (
|
||||
<p>Sent Successfully</p>
|
||||
)}
|
||||
<a href="https://discord.gg/zv8C9F8" target="_blank" rel="noreferrer">
|
||||
Support Discord
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return this.props.children;
|
||||
}
|
||||
}
|
||||
|
||||
export default ErrorBoundary;
|
||||
BIN
src/assets/icons/128x128.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
src/assets/icons/16x16.png
Normal file
|
After Width: | Height: | Size: 804 B |
BIN
src/assets/icons/32x32.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
src/assets/icons/48x48.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
src/assets/icons/marketplace-placeholder.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
src/assets/icons/mue_about.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
src/assets/icons/mue_dark.png
Normal file
|
After Width: | Height: | Size: 5.5 KiB |
BIN
src/assets/icons/mue_light.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
1
src/assets/icons/undraw_making_art.svg
Normal file
|
After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 308 KiB After Width: | Height: | Size: 308 KiB |
|
Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 104 KiB |
|
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 274 KiB After Width: | Height: | Size: 274 KiB |
|
Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 171 KiB |
|
Before Width: | Height: | Size: 161 KiB After Width: | Height: | Size: 161 KiB |
|
Before Width: | Height: | Size: 157 KiB After Width: | Height: | Size: 157 KiB |
|
Before Width: | Height: | Size: 136 KiB After Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 126 KiB |
|
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 124 KiB |
|
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 45 KiB |
75
src/components/Elements/AddModal/AddModal.jsx
Normal file
@@ -0,0 +1,75 @@
|
||||
import variables from 'config/variables';
|
||||
|
||||
import { useState, memo } from 'react';
|
||||
import { TextareaAutosize } from '@mui/material';
|
||||
import { MdAddLink, MdClose } from 'react-icons/md';
|
||||
import { Tooltip } from 'components/Elements';
|
||||
import { Button } from 'components/Elements';
|
||||
|
||||
function AddModal({ urlError, iconError, addLink, closeModal, edit, editData, editLink }) {
|
||||
const [name, setName] = useState(edit ? editData.name : '');
|
||||
const [url, setUrl] = useState(edit ? editData.url : '');
|
||||
const [icon, setIcon] = useState(edit ? editData.icon : '');
|
||||
|
||||
return (
|
||||
<div className="addLinkModal">
|
||||
<div className="shareHeader">
|
||||
<span className="title">
|
||||
{edit
|
||||
? variables.getMessage('widgets.quicklinks.edit')
|
||||
: variables.getMessage('widgets.quicklinks.new')}
|
||||
</span>
|
||||
<Tooltip title={variables.getMessage('modals.welcome.buttons.close')}>
|
||||
<div className="close" onClick={() => closeModal()}>
|
||||
<MdClose />
|
||||
</div>
|
||||
</Tooltip>
|
||||
</div>
|
||||
<div className="quicklinkModalTextbox">
|
||||
<TextareaAutosize
|
||||
maxRows={1}
|
||||
placeholder={variables.getMessage('widgets.quicklinks.name')}
|
||||
value={name}
|
||||
onChange={(e) => setName(e.target.value.replace(/(\r\n|\n|\r)/gm, ''))}
|
||||
style={{ gridColumn: 'span 2' }}
|
||||
/>
|
||||
<TextareaAutosize
|
||||
maxRows={10}
|
||||
placeholder={variables.getMessage('widgets.quicklinks.url')}
|
||||
value={url}
|
||||
onChange={(e) => setUrl(e.target.value.replace(/(\r\n|\n|\r)/gm, ''))}
|
||||
/>
|
||||
<TextareaAutosize
|
||||
maxRows={10}
|
||||
maxLines={1}
|
||||
placeholder={variables.getMessage('widgets.quicklinks.icon')}
|
||||
value={icon}
|
||||
onChange={(e) => setIcon(e.target.value.replace(/(\r\n|\n|\r)/gm, ''))}
|
||||
/>
|
||||
</div>
|
||||
<div className="addFooter">
|
||||
<span className="dropdown-error">
|
||||
{iconError} {urlError}
|
||||
</span>
|
||||
{edit ? (
|
||||
<Button
|
||||
type="settings"
|
||||
onClick={() => editLink(editData, name, url, icon)}
|
||||
icon={<MdAddLink />}
|
||||
label={variables.getMessage('modals.main.settings.sections.quicklinks.edit')}
|
||||
/>
|
||||
) : (
|
||||
<Button
|
||||
type="settings"
|
||||
onClick={() => addLink(name, url, icon)}
|
||||
icon={<MdAddLink />}
|
||||
label={variables.getMessage('widgets.quicklinks.add')}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
const MemoizedAddModal = memo(AddModal);
|
||||
export { MemoizedAddModal as default, MemoizedAddModal as AddModal };
|
||||
1
src/components/Elements/AddModal/index.jsx
Normal file
@@ -0,0 +1 @@
|
||||
export * from './AddModal';
|
||||
93
src/components/Elements/Button/Button.jsx
Normal file
@@ -0,0 +1,93 @@
|
||||
import React, { forwardRef } from 'react';
|
||||
import Tooltip from 'components/Elements/Tooltip/Tooltip';
|
||||
|
||||
const Button = forwardRef(
|
||||
(
|
||||
{ icon, label, type, iconPlacement, onClick, active, disabled, tooltipTitle, tooltipKey, href },
|
||||
ref,
|
||||
) => {
|
||||
let className;
|
||||
|
||||
switch (type) {
|
||||
case 'settings':
|
||||
className = 'btn-settings';
|
||||
break;
|
||||
case 'secondary':
|
||||
className = 'btn-secondary';
|
||||
break;
|
||||
case 'icon':
|
||||
className = 'btn-icon';
|
||||
break;
|
||||
case 'navigation':
|
||||
className = 'btn-navigation';
|
||||
break;
|
||||
case 'collection':
|
||||
className = 'btn-collection';
|
||||
break;
|
||||
case 'linkIconButton':
|
||||
className = 'btn-icon';
|
||||
break;
|
||||
case 'linkButton':
|
||||
className = 'btn-settings';
|
||||
break;
|
||||
default:
|
||||
className = 'btn-default';
|
||||
}
|
||||
|
||||
if (iconPlacement === 'right') {
|
||||
className += ' flowReverse';
|
||||
}
|
||||
|
||||
if (active) {
|
||||
className += ` ${className}-active`;
|
||||
}
|
||||
|
||||
const button = (
|
||||
<button className={className} onClick={onClick} ref={ref} disabled={disabled}>
|
||||
{icon}
|
||||
{label}
|
||||
</button>
|
||||
);
|
||||
|
||||
const linkButton = (
|
||||
<a className={className} onClick={onClick} ref={ref} disabled={disabled} href={href}>
|
||||
{icon}
|
||||
{label}
|
||||
</a>
|
||||
);
|
||||
|
||||
const linkIconButton = (
|
||||
<Tooltip title={tooltipTitle} key={tooltipKey}>
|
||||
<a
|
||||
className={className}
|
||||
onClick={onClick}
|
||||
ref={ref}
|
||||
disabled={disabled}
|
||||
href={href}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
{icon}
|
||||
{label}
|
||||
</a>
|
||||
</Tooltip>
|
||||
);
|
||||
|
||||
switch (type) {
|
||||
case 'linkIconButton':
|
||||
return linkIconButton;
|
||||
case 'linkButton':
|
||||
return linkButton;
|
||||
case 'icon':
|
||||
return (
|
||||
<Tooltip title={tooltipTitle} key={tooltipKey}>
|
||||
{button}
|
||||
</Tooltip>
|
||||
);
|
||||
default:
|
||||
return button;
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
export { Button as default, Button };
|
||||
1
src/components/Elements/Button/index.jsx
Normal file
@@ -0,0 +1 @@
|
||||
export * from './Button';
|
||||
64
src/components/Elements/MainModal/Main.jsx
Normal file
@@ -0,0 +1,64 @@
|
||||
import variables from 'config/variables';
|
||||
import { Suspense, lazy, useState, memo } from 'react';
|
||||
import { MdClose } from 'react-icons/md';
|
||||
|
||||
import './scss/index.scss';
|
||||
import { Tooltip } from 'components/Elements';
|
||||
const Settings = lazy(() => import('../../../features/misc/views/Settings'));
|
||||
const Addons = lazy(() => import('../../../features/misc/views/Addons'));
|
||||
const Marketplace = lazy(() => import('../../../features/misc/views/Marketplace'));
|
||||
|
||||
const renderLoader = () => (
|
||||
<div style={{ display: 'flex', width: '100%', minHeight: '100%' }}>
|
||||
<div className="modalSidebar">
|
||||
<span className="mainTitle">Mue</span>
|
||||
</div>
|
||||
<div className="modalTabContent">
|
||||
<div className="emptyItems">
|
||||
<div className="emptyMessage">
|
||||
<div className="loaderHolder">
|
||||
<div id="loader"></div>
|
||||
<span className="subtitle">{variables.getMessage('modals.main.loading')}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
function MainModal({ modalClose }) {
|
||||
const [currentTab, setCurrentTab] = useState('settings');
|
||||
|
||||
const changeTab = (type) => {
|
||||
setCurrentTab(type);
|
||||
};
|
||||
|
||||
const renderTab = () => {
|
||||
switch (currentTab) {
|
||||
case 'addons':
|
||||
return <Addons changeTab={changeTab} />;
|
||||
case 'marketplace':
|
||||
return <Marketplace changeTab={changeTab} />;
|
||||
default:
|
||||
return <Settings changeTab={changeTab} />;
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="frame">
|
||||
<Tooltip
|
||||
style={{ position: 'absolute', top: '1rem', right: '1rem' }}
|
||||
title={variables.getMessage('modals.welcome.buttons.close')}
|
||||
key="closeTooltip"
|
||||
>
|
||||
<span className="closeModal" onClick={modalClose}>
|
||||
<MdClose />
|
||||
</span>
|
||||
</Tooltip>
|
||||
<Suspense fallback={renderLoader()}>{renderTab()}</Suspense>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
const MemoizedMainModal = memo(MainModal);
|
||||
export { MemoizedMainModal as default, MemoizedMainModal as MainModal };
|
||||
105
src/components/Elements/MainModal/backend/Tab.jsx
Normal file
@@ -0,0 +1,105 @@
|
||||
import variables from 'config/variables';
|
||||
import { memo, useState, useEffect } from 'react';
|
||||
import {
|
||||
MdSettings as Settings,
|
||||
MdWidgets as Addons,
|
||||
MdShoppingBasket as Marketplace,
|
||||
MdMenu as Navbar,
|
||||
MdEmojiPeople as Greeting,
|
||||
MdAccessAlarm as Time,
|
||||
MdOutlineFormatQuote as Quote,
|
||||
MdLink as QuickLinks,
|
||||
MdDateRange as Date,
|
||||
MdOutlineTextsms as Message,
|
||||
MdOutlinePhoto as Background,
|
||||
MdSearch,
|
||||
MdCloudQueue as Weather,
|
||||
MdFormatPaint as Appearance,
|
||||
MdTranslate as Language,
|
||||
MdOutlineSettings as Advanced,
|
||||
MdBugReport as Experimental,
|
||||
MdOutlineAssessment as Stats,
|
||||
MdOutlineNewReleases as Changelog,
|
||||
MdInfoOutline as About,
|
||||
MdOutlineExtension as Added,
|
||||
MdAddCircleOutline as Create,
|
||||
MdViewAgenda as Overview,
|
||||
MdCollectionsBookmark as Collections,
|
||||
} from 'react-icons/md';
|
||||
|
||||
const iconMapping = {
|
||||
[variables.getMessage('modals.main.marketplace.product.overview')]: <Overview />,
|
||||
[variables.getMessage('modals.main.navbar.settings')]: <Settings />,
|
||||
[variables.getMessage('modals.main.navbar.addons')]: <Addons />,
|
||||
[variables.getMessage('modals.main.navbar.marketplace')]: <Marketplace />,
|
||||
[variables.getMessage('modals.main.settings.sections.appearance.navbar.title')]: <Navbar />,
|
||||
[variables.getMessage('modals.main.settings.sections.greeting.title')]: <Greeting />,
|
||||
[variables.getMessage('modals.main.settings.sections.time.title')]: <Time />,
|
||||
[variables.getMessage('modals.main.settings.sections.quicklinks.title')]: <QuickLinks />,
|
||||
[variables.getMessage('modals.main.settings.sections.quote.title')]: <Quote />,
|
||||
[variables.getMessage('modals.main.settings.sections.date.title')]: <Date />,
|
||||
[variables.getMessage('modals.main.settings.sections.message.title')]: <Message />,
|
||||
[variables.getMessage('modals.main.settings.sections.background.title')]: <Background />,
|
||||
[variables.getMessage('modals.main.settings.sections.search.title')]: <MdSearch />,
|
||||
[variables.getMessage('modals.main.settings.sections.weather.title')]: <Weather />,
|
||||
[variables.getMessage('modals.main.settings.sections.appearance.title')]: <Appearance />,
|
||||
[variables.getMessage('modals.main.settings.sections.language.title')]: <Language />,
|
||||
[variables.getMessage('modals.main.settings.sections.advanced.title')]: <Advanced />,
|
||||
[variables.getMessage('modals.main.settings.sections.stats.title')]: <Stats />,
|
||||
[variables.getMessage('modals.main.settings.sections.experimental.title')]: <Experimental />,
|
||||
[variables.getMessage('modals.main.settings.sections.changelog.title')]: <Changelog />,
|
||||
[variables.getMessage('modals.main.settings.sections.about.title')]: <About />,
|
||||
[variables.getMessage('modals.main.addons.added')]: <Added />,
|
||||
[variables.getMessage('modals.main.addons.create.title')]: <Create />,
|
||||
[variables.getMessage('modals.main.marketplace.all')]: <Addons />,
|
||||
[variables.getMessage('modals.main.marketplace.photo_packs')]: <Background />,
|
||||
[variables.getMessage('modals.main.marketplace.quote_packs')]: <Quote />,
|
||||
[variables.getMessage('modals.main.marketplace.preset_settings')]: <Advanced />,
|
||||
[variables.getMessage('modals.main.marketplace.collections')]: <Collections />,
|
||||
};
|
||||
|
||||
function Tab({ label, currentTab, onClick, navbarTab }) {
|
||||
const [isExperimental, setIsExperimental] = useState(true);
|
||||
|
||||
useEffect(() => {
|
||||
setIsExperimental(localStorage.getItem('experimental') !== 'false');
|
||||
}, []);
|
||||
|
||||
let className = navbarTab ? 'navbar-item' : 'tab-list-item';
|
||||
if (currentTab === label) {
|
||||
className += navbarTab ? ' navbar-item-active' : ' tab-list-active';
|
||||
}
|
||||
|
||||
const icon = iconMapping[label];
|
||||
const divider = [
|
||||
variables.getMessage('modals.main.settings.sections.weather.title'),
|
||||
variables.getMessage('modals.main.settings.sections.language.title'),
|
||||
variables.getMessage('modals.main.marketplace.all'),
|
||||
variables.getMessage('modals.main.settings.sections.experimental.title'),
|
||||
].includes(label);
|
||||
|
||||
const mue = [
|
||||
variables.getMessage('modals.main.marketplace.product.overview'),
|
||||
variables.getMessage('modals.main.addons.added'),
|
||||
variables.getMessage('modals.main.marketplace.all'),
|
||||
].includes(label);
|
||||
|
||||
if (
|
||||
label === variables.getMessage('modals.main.settings.sections.experimental.title') &&
|
||||
!isExperimental
|
||||
) {
|
||||
return <hr />;
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
{mue && <span className="mainTitle">Mue</span>}
|
||||
<button className={className} onClick={() => onClick(label)}>
|
||||
{icon} <span>{label}</span>
|
||||
</button>
|
||||
{divider && <hr />}
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export default memo(Tab);
|
||||
109
src/components/Elements/MainModal/backend/Tabs.jsx
Normal file
@@ -0,0 +1,109 @@
|
||||
import variables from 'config/variables';
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import {
|
||||
MdSettings,
|
||||
MdOutlineShoppingBasket,
|
||||
MdOutlineExtension,
|
||||
MdRefresh,
|
||||
MdClose,
|
||||
} from 'react-icons/md';
|
||||
import Tab from './Tab';
|
||||
import { Button } from 'components/Elements';
|
||||
import ErrorBoundary from '../../../../features/misc/modals/ErrorBoundary';
|
||||
|
||||
const Tabs = (props) => {
|
||||
const [currentTab, setCurrentTab] = useState(props.children[0].props.label);
|
||||
const [currentName, setCurrentName] = useState(props.children[0].props.name);
|
||||
|
||||
const onClick = (tab, name) => {
|
||||
if (name !== currentName) {
|
||||
variables.stats.postEvent('tab', `Opened ${name}`);
|
||||
}
|
||||
|
||||
setCurrentTab(tab);
|
||||
setCurrentName(name);
|
||||
};
|
||||
|
||||
const hideReminder = () => {
|
||||
localStorage.setItem('showReminder', false);
|
||||
document.querySelector('.reminder-info').style.display = 'none';
|
||||
};
|
||||
|
||||
const navbarButtons = [
|
||||
{
|
||||
tab: 'settings',
|
||||
icon: <MdSettings />,
|
||||
},
|
||||
{
|
||||
tab: 'addons',
|
||||
icon: <MdOutlineExtension />,
|
||||
},
|
||||
{
|
||||
tab: 'marketplace',
|
||||
icon: <MdOutlineShoppingBasket />,
|
||||
},
|
||||
];
|
||||
|
||||
const reminderInfo = (
|
||||
<div
|
||||
className="reminder-info"
|
||||
style={{ display: localStorage.getItem('showReminder') === 'true' ? 'flex' : 'none' }}
|
||||
>
|
||||
<div className="shareHeader">
|
||||
<span className="title">{variables.getMessage('modals.main.settings.reminder.title')}</span>
|
||||
<span className="closeModal" onClick={hideReminder}>
|
||||
<MdClose />
|
||||
</span>
|
||||
</div>
|
||||
<span className="subtitle">
|
||||
{variables.getMessage('modals.main.settings.reminder.message')}
|
||||
</span>
|
||||
<button onClick={() => window.location.reload()}>
|
||||
<MdRefresh />
|
||||
{variables.getMessage('modals.main.error_boundary.refresh')}
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
|
||||
return (
|
||||
<div style={{ display: 'flex', width: '100%', minHeight: '100%' }}>
|
||||
<div className="modalSidebar">
|
||||
{props.children.map((tab, index) => (
|
||||
<Tab
|
||||
currentTab={currentTab}
|
||||
key={index}
|
||||
label={tab.props.label}
|
||||
onClick={(nextTab) => onClick(nextTab, tab.props.name)}
|
||||
navbarTab={props.navbar || false}
|
||||
/>
|
||||
))}
|
||||
{reminderInfo}
|
||||
</div>
|
||||
<div className="modalTabContent">
|
||||
<div className="modalNavbar">
|
||||
{navbarButtons.map(({ tab, icon }, index) => (
|
||||
<Button
|
||||
type="navigation"
|
||||
onClick={() => props.changeTab(tab)}
|
||||
icon={icon}
|
||||
label={variables.getMessage(`modals.main.navbar.${tab}`)}
|
||||
active={props.current === tab}
|
||||
key={`${tab}-${index}`}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
{props.children.map((tab, index) => {
|
||||
if (tab.props.label !== currentTab) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return (
|
||||
<ErrorBoundary key={`error-boundary-${index}`}>{tab.props.children}</ErrorBoundary>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Tabs;
|
||||
1
src/components/Elements/MainModal/index.jsx
Normal file
@@ -0,0 +1 @@
|
||||
export * from './Main';
|
||||
405
src/components/Elements/MainModal/scss/index.scss
Normal file
@@ -0,0 +1,405 @@
|
||||
@import 'scss/variables';
|
||||
@import 'modules/sidebar';
|
||||
@import 'modules/navbar';
|
||||
@import 'modules/modalTabContent';
|
||||
@import 'modules/links';
|
||||
@import 'modules/scrollbars';
|
||||
@import 'settings/main';
|
||||
@import 'marketplace/main';
|
||||
|
||||
.Overlay {
|
||||
position: fixed;
|
||||
z-index: 100;
|
||||
inset: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
}
|
||||
|
||||
.Modal {
|
||||
@include themed {
|
||||
color: t($color);
|
||||
}
|
||||
|
||||
box-shadow: 0 0 20px rgb(0 0 0 / 30%);
|
||||
opacity: 1;
|
||||
z-index: -2;
|
||||
transition-timing-function: ease-in;
|
||||
border-radius: map-get($modal, 'border-radius');
|
||||
user-select: none;
|
||||
overflow-y: auto;
|
||||
transform: scale(0);
|
||||
transition: all 0.3s cubic-bezier(0.47, 1.64, 0.41, 0.8);
|
||||
|
||||
&:focus {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
.modalInfoPage {
|
||||
user-select: text;
|
||||
}
|
||||
}
|
||||
|
||||
.closePositioning {
|
||||
position: absolute;
|
||||
top: 3rem;
|
||||
right: 3rem;
|
||||
}
|
||||
|
||||
.closeModal {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
padding: 0.5em;
|
||||
border-radius: 12px;
|
||||
cursor: pointer;
|
||||
transition: 0.5s;
|
||||
|
||||
svg {
|
||||
font-size: 2em;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
@include themed {
|
||||
background: t($modal-sidebarActive);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.ReactModal__Html--open,
|
||||
.ReactModal__Body--open {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* modal transition */
|
||||
.ReactModal__Content--after-open {
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
}
|
||||
|
||||
.ReactModal__Content--before-close {
|
||||
opacity: 0;
|
||||
transform: scale(0);
|
||||
}
|
||||
|
||||
#modal {
|
||||
height: 80vh;
|
||||
width: clamp(60vw, 1400px, 90vw);
|
||||
|
||||
@include themed {
|
||||
background-color: t($modal-background);
|
||||
}
|
||||
}
|
||||
|
||||
/* fixes for font size on extension */
|
||||
label,
|
||||
p,
|
||||
span.modalLink {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 2rem;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.17rem;
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.loaderHolder {
|
||||
display: flex;
|
||||
gap: 15px;
|
||||
flex-flow: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
#loader {
|
||||
display: inline-block;
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
|
||||
@include themed {
|
||||
border: 3px solid t($modal-sidebar);
|
||||
border-radius: 50%;
|
||||
border-top-color: t($modal-sidebarActive);
|
||||
}
|
||||
|
||||
animation: spin 1s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
.headerExtras {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: -1px;
|
||||
padding: 10px 0;
|
||||
|
||||
div:nth-child(1) {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
form {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.link {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
gap: 15px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.MuiOutlinedInput-notchedOutline {
|
||||
@include themed {
|
||||
border-color: t($modal-sidebarActive) !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.headerActions {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
gap: 20px;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
|
||||
.link {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
gap: 15px;
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
|
||||
.marketplaceCondition {
|
||||
display: flex;
|
||||
flex-flow: row !important;
|
||||
gap: -1px;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.languageSettings {
|
||||
margin-bottom: 15px;
|
||||
|
||||
.MuiFormGroup-root {
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.MuiFormControl-root {
|
||||
width: 100% !important;
|
||||
gap: 15px;
|
||||
|
||||
.MuiFormControlLabel-root {
|
||||
display: flex;
|
||||
flex-direction: row-reverse;
|
||||
justify-content: space-between;
|
||||
padding: 5px 5px 5px 20px;
|
||||
transition: 0.3s;
|
||||
|
||||
@include themed {
|
||||
background: t($modal-sidebar);
|
||||
border-radius: t($borderRadius);
|
||||
|
||||
&:hover {
|
||||
background: t($modal-sidebarActive);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.sliderTitle {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: 15px 0;
|
||||
|
||||
.link {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
gap: 15px;
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
|
||||
.moreSettings {
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
justify-content: space-between;
|
||||
padding: 25px;
|
||||
margin-top: 20px;
|
||||
transition: 0.5s;
|
||||
|
||||
@include themed {
|
||||
background: t($modal-sidebar);
|
||||
border-radius: t($borderRadius);
|
||||
box-shadow: 0 0 0 1px t($modal-sidebarActive);
|
||||
|
||||
&:hover {
|
||||
background: t($modal-sidebarActive);
|
||||
}
|
||||
}
|
||||
|
||||
svg {
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.left {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
align-items: center;
|
||||
gap: 25px;
|
||||
|
||||
svg {
|
||||
@include themed {
|
||||
background-image: t($slightGradient);
|
||||
box-shadow: t($boxShadow);
|
||||
}
|
||||
|
||||
padding: 15px;
|
||||
border-radius: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.content {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
}
|
||||
|
||||
.action {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
gap: 20px;
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
|
||||
.reminder-info {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
padding: 15px;
|
||||
gap: 15px;
|
||||
|
||||
@include themed {
|
||||
background-color: t($modal-secondaryColour);
|
||||
border-radius: t($borderRadius);
|
||||
border: 1px solid t($modal-sidebarActive);
|
||||
}
|
||||
|
||||
button {
|
||||
@include basicIconButton(5px, 5px, modal);
|
||||
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 15px;
|
||||
|
||||
svg {
|
||||
margin: 0 !important;
|
||||
}
|
||||
}
|
||||
|
||||
svg {
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
@extend %tabText;
|
||||
}
|
||||
|
||||
.quoteSkeleton {
|
||||
margin-top: 5px;
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 5px;
|
||||
align-items: center;
|
||||
|
||||
div {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
}
|
||||
|
||||
.text {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.skeletonAuthor {
|
||||
font-size: smaller;
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
align-items: center;
|
||||
gap: 25px;
|
||||
padding: 0 20px 0 5px;
|
||||
|
||||
svg {
|
||||
@include themed {
|
||||
background-color: t($modal-sidebar);
|
||||
padding: 10px;
|
||||
border-radius: t($borderRadius);
|
||||
place-items: center;
|
||||
}
|
||||
}
|
||||
|
||||
@include themed {
|
||||
background-color: t($modal-sidebarActive);
|
||||
border-radius: t($borderRadius);
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: medium !important;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
font-size: smaller !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.quickLinksSkeleton {
|
||||
.circles {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
gap: 5px;
|
||||
|
||||
div {
|
||||
margin-top: 10px;
|
||||
padding: 3px;
|
||||
height: 20px;
|
||||
width: 20px;
|
||||
border-radius: 100%;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
|
||||
@include themed {
|
||||
background-color: t($modal-sidebarActive);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.clockSkeleton {
|
||||
font-size: 30px !important;
|
||||
font-weight: bold;
|
||||
}
|
||||
519
src/components/Elements/MainModal/scss/marketplace/_main.scss
Normal file
@@ -0,0 +1,519 @@
|
||||
// this file is too long
|
||||
@import 'modules/item';
|
||||
@import 'modules/buttons';
|
||||
@import 'modules/lightbox';
|
||||
@import 'scss/variables';
|
||||
|
||||
.creatorItems {
|
||||
.item {
|
||||
flex-flow: row !important;
|
||||
}
|
||||
|
||||
.item-back {
|
||||
margin: 0 !important;
|
||||
filter: blur(40px) saturate(180%) brightness(90%) !important;
|
||||
height: 15px !important;
|
||||
width: 200px !important;
|
||||
}
|
||||
|
||||
.item-icon {
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
.card-details {
|
||||
margin: 0 !important;
|
||||
text-align: left;
|
||||
}
|
||||
}
|
||||
|
||||
.items {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
||||
grid-gap: 1.5rem;
|
||||
margin-top: 15px;
|
||||
margin-bottom: 30px;
|
||||
|
||||
.item {
|
||||
position: relative;
|
||||
border-radius: 12px;
|
||||
width: auto;
|
||||
cursor: pointer;
|
||||
transition: 0.5s;
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
gap: 15px;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
background-size: cover;
|
||||
|
||||
@include themed {
|
||||
background-color: t($modal-secondaryColour);
|
||||
box-shadow: 0 0 0 1px t($modal-sidebarActive);
|
||||
|
||||
&:hover {
|
||||
background-color: t($modal-sidebarActive);
|
||||
|
||||
img {
|
||||
background-color: t($modal-sidebarActive);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.tags {
|
||||
margin-top: 7px;
|
||||
}
|
||||
|
||||
.item-back {
|
||||
filter: blur(60px) saturate(180%) brightness(90%);
|
||||
position: absolute;
|
||||
object-fit: cover !important;
|
||||
height: 90px;
|
||||
width: 100px;
|
||||
border-radius: 100px;
|
||||
transition: 0.5s;
|
||||
margin-top: 30px;
|
||||
}
|
||||
|
||||
.item-icon {
|
||||
object-fit: cover !important;
|
||||
height: 60px !important;
|
||||
width: 60px !important;
|
||||
border-radius: 12px;
|
||||
transition: 0.5s;
|
||||
margin-top: 25px;
|
||||
}
|
||||
|
||||
.card-details {
|
||||
z-index: 1;
|
||||
padding: 10px;
|
||||
margin-bottom: 24px;
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 5px;
|
||||
align-items: center;
|
||||
|
||||
.card-title {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.card-subtitle {
|
||||
font-size: 14px;
|
||||
|
||||
@include themed {
|
||||
color: t($subColor);
|
||||
}
|
||||
}
|
||||
|
||||
.card-type {
|
||||
margin-top: 8px;
|
||||
font-size: 12px;
|
||||
font-weight: bolder;
|
||||
|
||||
@include themed {
|
||||
color: t($subColor);
|
||||
}
|
||||
|
||||
border-radius: 150px;
|
||||
padding: 2px 15px;
|
||||
background-color: rgb(255 255 255 / 10%);
|
||||
border: 1px solid rgb(209 213 219 / 30%);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.itemPage {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
justify-content: space-between;
|
||||
|
||||
.itemShowcase {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 25px;
|
||||
width: 60%;
|
||||
max-width: 650px;
|
||||
|
||||
.description {
|
||||
max-lines: 3;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
img {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
table {
|
||||
table-layout: fixed;
|
||||
width: 100%;
|
||||
max-width: 650px !important;
|
||||
word-wrap: break-word !important;
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
.itemInfo {
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
background-size: cover;
|
||||
border-radius: 15px;
|
||||
width: 30%;
|
||||
max-width: 300px;
|
||||
max-height: 700px;
|
||||
|
||||
.front {
|
||||
padding: 20px;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 15px;
|
||||
width: 100%;
|
||||
box-sizing: border-box !important;
|
||||
border-radius: 12px 12px 0 0;
|
||||
backdrop-filter: blur(40px) saturate(150%) brightness(75%);
|
||||
|
||||
@include themed {
|
||||
background-image: linear-gradient(to bottom, transparent, t($modal-background));
|
||||
}
|
||||
}
|
||||
|
||||
.icon {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 5px 25px black;
|
||||
aspect-ratio: 1 / 1;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
.divider {
|
||||
text-transform: uppercase;
|
||||
|
||||
@include themed {
|
||||
color: t($subColor);
|
||||
}
|
||||
}
|
||||
|
||||
.iconButtons {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
grid-template-rows: 1fr;
|
||||
grid-gap: 20px;
|
||||
|
||||
button {
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.emptyItems {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
}
|
||||
|
||||
.emptyMessage {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
grid-gap: 5px;
|
||||
padding: 50px;
|
||||
|
||||
.title,
|
||||
svg {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
svg {
|
||||
font-size: 70px;
|
||||
}
|
||||
|
||||
@include themed {
|
||||
.sideloadIcon {
|
||||
font-size: 50px;
|
||||
color: t($subColor);
|
||||
}
|
||||
}
|
||||
|
||||
button {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
}
|
||||
}
|
||||
|
||||
.emptyNewMessage {
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
flex-flow: column;
|
||||
text-align: center;
|
||||
align-items: center;
|
||||
user-select: none;
|
||||
|
||||
img {
|
||||
width: 200px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
svg {
|
||||
font-size: 70px;
|
||||
|
||||
/* background: -webkit-linear-gradient(90deg,rgba(255,92,39,.7) 37%,rgba(255,70,110,.67) 60%);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent; */
|
||||
}
|
||||
|
||||
button {
|
||||
svg {
|
||||
font-size: 1rem;
|
||||
}
|
||||
}
|
||||
|
||||
.buttonsRow {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
gap: 30px;
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
|
||||
p.author {
|
||||
margin-top: -5px;
|
||||
}
|
||||
|
||||
#item > img,
|
||||
.updateImage,
|
||||
.updateChangelog > p > img {
|
||||
border-radius: 12px;
|
||||
height: 200px;
|
||||
width: auto;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.returnButton {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
border-radius: 12px;
|
||||
cursor: pointer;
|
||||
|
||||
svg {
|
||||
font-size: 2em;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background: rgb(121 121 121 / 22.6%);
|
||||
}
|
||||
}
|
||||
|
||||
.flexTopMarketplace {
|
||||
display: flex;
|
||||
margin-bottom: 15px;
|
||||
|
||||
.tooltip {
|
||||
margin-right: 25px;
|
||||
}
|
||||
|
||||
.mainTitle {
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
}
|
||||
|
||||
.filter {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
gap: 15px;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
.MuiFormControl-root {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.buttonSection {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.tags {
|
||||
max-width: 50%;
|
||||
}
|
||||
}
|
||||
|
||||
.collectionPage {
|
||||
// height: 200px;
|
||||
padding: 1.5rem;
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 15px;
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
|
||||
@include themed {
|
||||
border-radius: t($borderRadius);
|
||||
}
|
||||
|
||||
.nice-tag {
|
||||
border-radius: 150px;
|
||||
padding: 1px 12px;
|
||||
backdrop-filter: blur(16px) saturate(180%);
|
||||
background-color: rgb(255 255 255 / 10%);
|
||||
border: 1px solid rgb(209 213 219 / 30%);
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.content {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
text-align: center;
|
||||
text-shadow: #000 0 0 15px;
|
||||
|
||||
.mainTitle {
|
||||
justify-content: center;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
color: #ccc !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.collection {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: 36px 48px;
|
||||
margin: 15px 0;
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
align-items: center;
|
||||
|
||||
@include themed {
|
||||
box-shadow: 0 0 0 1px t($modal-sidebarActive);
|
||||
border-radius: t($borderRadius);
|
||||
}
|
||||
|
||||
.content {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 15px;
|
||||
max-width: 250px;
|
||||
text-shadow: #000 0 0 15px;
|
||||
|
||||
.title {
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
color: #ccc !important;
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 5;
|
||||
}
|
||||
}
|
||||
|
||||
.items {
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
|
||||
.marketplaceRefresh {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
gap: 5px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.marketplaceSearch {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 10px 30px;
|
||||
border-radius: 10px;
|
||||
font-size: 18px;
|
||||
|
||||
@include themed {
|
||||
box-shadow: 0 0 0 3px t($modal-sidebarActive);
|
||||
background: t($modal-sidebar);
|
||||
}
|
||||
|
||||
input {
|
||||
all: unset;
|
||||
}
|
||||
|
||||
@include themed {
|
||||
&:focus-within {
|
||||
background: t($modal-sidebarActive);
|
||||
box-shadow: 0 0 0 1px t($color);
|
||||
}
|
||||
|
||||
&:disabled {
|
||||
background: t($modal-sidebarActive);
|
||||
cursor: not-allowed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.inCollection {
|
||||
// background-image: linear-gradient(to left, transparent, #000),
|
||||
// url('https://external-preview.redd.it/JyhsEoGMhKIMi3kvfBS24L0IllAO_KrIm4UI-dA1Ax4.jpg?auto=webp&s=b5adf9859b2c1855a5b3085f9453a6e878548505');
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 5px;
|
||||
padding: 5px;
|
||||
margin: 10px 0;
|
||||
|
||||
@include themed {
|
||||
// background-color: t($modal-secondaryColour);
|
||||
// box-shadow: 0 0 0 1px t($modal-sidebarActive);
|
||||
border-radius: t($borderRadius);
|
||||
}
|
||||
|
||||
.title:hover {
|
||||
cursor: pointer;
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
|
||||
.createYourOwn {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 20px;
|
||||
align-items: center;
|
||||
margin-top: 30px;
|
||||
|
||||
svg {
|
||||
font-size: 30px;
|
||||
}
|
||||
}
|
||||
|
||||
.topAddons {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.modalHeader {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 15px;
|
||||
|
||||
.tooltip {
|
||||
margin-right: 25px;
|
||||
}
|
||||
|
||||
.mainTitle {
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
.updateCheck {
|
||||
flex-flow: row !important;
|
||||
}
|
||||
|
||||
.btn-settings {
|
||||
@include modal-button(standard);
|
||||
|
||||
display: inline;
|
||||
margin-top: 0;
|
||||
float: none !important;
|
||||
padding: 0 20px;
|
||||
}
|
||||
|
||||
.btn-secondary {
|
||||
@include modal-button(secondary);
|
||||
|
||||
display: inline;
|
||||
margin-top: 0;
|
||||
float: none !important;
|
||||
padding: 0 20px;
|
||||
}
|
||||
|
||||
.btn-navigation {
|
||||
@include modal-button(standard);
|
||||
|
||||
padding: 0 15px;
|
||||
|
||||
@include themed {
|
||||
background: t($modal-secondaryColour) !important;
|
||||
border-radius: t($borderRadius) !important;
|
||||
box-shadow: t($boxShadow) !important;
|
||||
border: 0 !important;
|
||||
|
||||
&:hover {
|
||||
background: t($modal-sidebarActive) !important;
|
||||
}
|
||||
}
|
||||
|
||||
&:hover {
|
||||
svg {
|
||||
background: var(--tab-active);
|
||||
}
|
||||
|
||||
color: var(--modal-text);
|
||||
}
|
||||
|
||||
span,
|
||||
svg {
|
||||
font-size: 1.1em !important;
|
||||
}
|
||||
|
||||
svg {
|
||||
font-size: 1.2em !important;
|
||||
color: var(--photo-info);
|
||||
}
|
||||
}
|
||||
|
||||
/* safari fix */
|
||||
@supports (-webkit-hyphens: none) {
|
||||
.btn-navigation {
|
||||
display: inline-block !important;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-navigation-active {
|
||||
@include themed {
|
||||
background: t($modal-sidebarActive) !important;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-collection {
|
||||
padding: 1px 12px;
|
||||
backdrop-filter: blur(16px) saturate(180%);
|
||||
background-color: rgb(255 255 255 / 10%);
|
||||
border: 1px solid rgb(209 213 219 / 30%);
|
||||
color: #fff;
|
||||
border-radius: 12px;
|
||||
height: 40px;
|
||||
font-size: 1rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-flow: row;
|
||||
justify-content: center;
|
||||
gap: 20px;
|
||||
transition: 0.5s;
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
backdrop-filter: blur(16px) saturate(180%);
|
||||
background-color: rgb(17 25 40 / 20%);
|
||||
border: 1px solid rgb(255 255 255 / 12.5%);
|
||||
}
|
||||
|
||||
&:active {
|
||||
@include themed {
|
||||
background: t($modal-sidebarActive);
|
||||
box-shadow: 0 0 0 1px t($color);
|
||||
}
|
||||
}
|
||||
|
||||
&:focus {
|
||||
@include themed {
|
||||
background: t($modal-sidebarActive);
|
||||
box-shadow: 0 0 0 1px t($color);
|
||||
}
|
||||
}
|
||||
|
||||
&:disabled {
|
||||
@include themed {
|
||||
background: t($modal-sidebarActive);
|
||||
cursor: not-allowed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
a.btn-collection {
|
||||
height: 40px;
|
||||
text-decoration: none;
|
||||
|
||||
@include themed {
|
||||
border-radius: t($borderRadius);
|
||||
}
|
||||
}
|
||||
|
||||
.flowReverse {
|
||||
flex-flow: row-reverse !important;
|
||||
}
|
||||
|
||||
.btn-icon {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
display: grid;
|
||||
place-content: center;
|
||||
|
||||
@include modal-button(standard);
|
||||
}
|
||||
@@ -0,0 +1,177 @@
|
||||
.side {
|
||||
float: right;
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
p.description {
|
||||
margin-top: 0;
|
||||
max-width: 800px;
|
||||
}
|
||||
|
||||
.moreInfo {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
||||
gap: 30px;
|
||||
|
||||
.items {
|
||||
margin-top: 0 !important;
|
||||
}
|
||||
|
||||
.item {
|
||||
flex: 1 0 40% !important;
|
||||
}
|
||||
|
||||
.infoItem {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
align-items: center;
|
||||
gap: 15px;
|
||||
|
||||
svg {
|
||||
@include themed {
|
||||
background-image: t($slightGradient);
|
||||
box-shadow: t($boxShadow);
|
||||
}
|
||||
|
||||
font-size: 18px;
|
||||
padding: 7px;
|
||||
border-radius: 100%;
|
||||
}
|
||||
|
||||
.text {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
font-size: medium;
|
||||
}
|
||||
}
|
||||
|
||||
.header {
|
||||
// text-transform: uppercase;
|
||||
font-size: small;
|
||||
|
||||
@include themed {
|
||||
color: t($subColor);
|
||||
}
|
||||
}
|
||||
|
||||
span {
|
||||
@include themed {
|
||||
color: t($color);
|
||||
}
|
||||
}
|
||||
|
||||
@include themed {
|
||||
background: t($modal-secondaryColour);
|
||||
box-shadow: 0 0 0 1px t($modal-sidebarActive);
|
||||
border-radius: t($borderRadius);
|
||||
padding: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
.subHeader {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
justify-content: space-between;
|
||||
gap: 25px;
|
||||
|
||||
.itemWarning {
|
||||
padding: 10px 20px;
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
gap: 15px;
|
||||
align-items: center;
|
||||
|
||||
.text {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
}
|
||||
|
||||
svg {
|
||||
@include themed {
|
||||
background-image: t($slightGradient);
|
||||
box-shadow: t($boxShadow);
|
||||
}
|
||||
|
||||
padding: 7px;
|
||||
border-radius: 100%;
|
||||
}
|
||||
|
||||
@include themed {
|
||||
background: t($modal-sidebar);
|
||||
border-radius: t($borderRadius);
|
||||
box-shadow: 0 0 0 1px t($modal-sidebarActive);
|
||||
}
|
||||
}
|
||||
|
||||
.items {
|
||||
margin-top: 0 !important;
|
||||
}
|
||||
|
||||
.item {
|
||||
flex: 1 0 40% !important;
|
||||
}
|
||||
|
||||
.infoItem {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
align-items: center;
|
||||
gap: 15px;
|
||||
flex: 1 0 44%;
|
||||
|
||||
svg {
|
||||
@include themed {
|
||||
background-image: t($slightGradient);
|
||||
box-shadow: t($boxShadow);
|
||||
}
|
||||
|
||||
font-size: 18px;
|
||||
padding: 7px;
|
||||
border-radius: 100%;
|
||||
}
|
||||
|
||||
.text {
|
||||
font-size: medium;
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
}
|
||||
}
|
||||
|
||||
.header {
|
||||
font-size: small;
|
||||
|
||||
@include themed {
|
||||
color: t($subColor);
|
||||
}
|
||||
}
|
||||
|
||||
span {
|
||||
@include themed {
|
||||
color: t($color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.showMoreItems {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.marketplaceDescription {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 15px;
|
||||
|
||||
.subtitle {
|
||||
user-select: text !important;
|
||||
}
|
||||
}
|
||||
|
||||
.moreFromCurator {
|
||||
margin-top: 50px;
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 15px;
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
.lightboxmodal {
|
||||
.lightBoxModal {
|
||||
margin: auto;
|
||||
max-width: 60%;
|
||||
background: none !important;
|
||||
@@ -0,0 +1,264 @@
|
||||
@import 'scss/variables';
|
||||
|
||||
.modalTabContent {
|
||||
width: 100% !important;
|
||||
|
||||
/* button {
|
||||
@include modal-button(standard);
|
||||
} */
|
||||
|
||||
@include themed {
|
||||
padding: 1rem 3rem 3rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
background: t($modal-background);
|
||||
|
||||
@extend %tabText;
|
||||
|
||||
hr {
|
||||
width: 100%;
|
||||
background: rgb(196 196 196 / 74%);
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.settingsRow {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
min-height: 100px;
|
||||
justify-content: space-between;
|
||||
transition: 0.4s ease-in-out;
|
||||
|
||||
/* border-top: 1px solid #ccc; */
|
||||
border-bottom: 1px solid #676767;
|
||||
padding-top: 1rem;
|
||||
padding-bottom: 1rem;
|
||||
|
||||
&.settingsNoBorder {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.content {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
max-width: 50%;
|
||||
}
|
||||
|
||||
.action {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
align-items: flex-end;
|
||||
width: 300px;
|
||||
|
||||
button {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.link {
|
||||
margin-top: 10px;
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
gap: 15px;
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.resetDataButtonsLayout {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
grid-gap: 20px;
|
||||
|
||||
:nth-child(1) {
|
||||
grid-column: span 2;
|
||||
}
|
||||
|
||||
button {
|
||||
@include modal-button(standard);
|
||||
|
||||
padding: 5px 10px;
|
||||
}
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: separate;
|
||||
border-radius: 10px;
|
||||
margin-top: 20px;
|
||||
|
||||
@include themed {
|
||||
box-shadow: 0 0 0 1px t($modal-sidebarActive);
|
||||
padding: 0;
|
||||
border: 0;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
tr:first-child {
|
||||
@include themed {
|
||||
border-radius: t($borderRadius);
|
||||
color: t($subColor);
|
||||
}
|
||||
|
||||
letter-spacing: 2px;
|
||||
|
||||
th {
|
||||
padding: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
tr {
|
||||
th:last-child {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
}
|
||||
}
|
||||
|
||||
::placeholder {
|
||||
@include themed {
|
||||
color: t($subColor);
|
||||
}
|
||||
}
|
||||
|
||||
tr:not(:first-child) {
|
||||
@include themed {
|
||||
background: t($modal-secondaryColour);
|
||||
}
|
||||
|
||||
textarea {
|
||||
width: 90%;
|
||||
margin: 10px;
|
||||
|
||||
@include themed {
|
||||
color: t($color);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.donateButton {
|
||||
@include modal-button(standard);
|
||||
|
||||
flex-flow: row !important;
|
||||
text-decoration: none;
|
||||
height: auto !important;
|
||||
|
||||
svg {
|
||||
font-size: 1.5rem !important;
|
||||
}
|
||||
}
|
||||
|
||||
.flexGrow {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.messageMap {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
align-items: center;
|
||||
gap: 25px;
|
||||
padding: 25px;
|
||||
justify-content: space-between;
|
||||
|
||||
@include themed {
|
||||
background: t($modal-sidebar);
|
||||
border-radius: t($borderRadius);
|
||||
box-shadow: 0 0 0 1px t($modal-sidebarActive);
|
||||
}
|
||||
|
||||
div:nth-child(1) {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
gap: 25px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.icon {
|
||||
@include themed {
|
||||
background-image: t($slightGradient);
|
||||
box-shadow: t($boxShadow);
|
||||
}
|
||||
|
||||
padding: 15px;
|
||||
border-radius: 100%;
|
||||
font-size: 25px;
|
||||
}
|
||||
|
||||
.messageText {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
flex-grow: 3;
|
||||
|
||||
textarea {
|
||||
@include themed {
|
||||
color: t($color);
|
||||
}
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
@include themed {
|
||||
color: t($subColor);
|
||||
font-size: 13px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.messageAction {
|
||||
float: right;
|
||||
}
|
||||
}
|
||||
|
||||
.messagesContainer {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 25px;
|
||||
}
|
||||
|
||||
.eventDateSelection {
|
||||
display: flex !important;
|
||||
flex-flow: row !important;
|
||||
gap: 5px !important;
|
||||
text-align: center !important;
|
||||
|
||||
@include themed {
|
||||
background: t($modal-sidebar);
|
||||
box-shadow: t($boxShadow);
|
||||
color: t($color) !important;
|
||||
}
|
||||
|
||||
hr {
|
||||
height: 100%;
|
||||
margin-right: 5px;
|
||||
|
||||
@include themed {
|
||||
border-color: t($modal-secondaryColour);
|
||||
}
|
||||
}
|
||||
|
||||
border-radius: 12px;
|
||||
height: 40px;
|
||||
font-size: 1rem;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
transition: 0.5s;
|
||||
cursor: pointer;
|
||||
border: 0;
|
||||
padding-left: 10px;
|
||||
padding-right: 5px;
|
||||
|
||||
input[type='tel'] {
|
||||
background: none;
|
||||
outline: none;
|
||||
border: none;
|
||||
max-width: 20px;
|
||||
text-align: center;
|
||||
|
||||
@include themed {
|
||||
color: t($color) !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
12
src/components/Elements/MainModal/scss/modules/_navbar.scss
Normal file
@@ -0,0 +1,12 @@
|
||||
#modal {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
.modalNavbar {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
gap: 25px;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
@import 'scss/variables';
|
||||
|
||||
::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
border-radius: 12px;
|
||||
|
||||
@include themed {
|
||||
background: t($modal-sidebar);
|
||||
}
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
border-radius: 25px;
|
||||
|
||||
@include themed {
|
||||
background: t($modal-sidebarActive);
|
||||
}
|
||||
|
||||
&:hover {
|
||||
@include themed {
|
||||
background: t($btn-backgroundHover);
|
||||
}
|
||||
}
|
||||
|
||||
&:active {
|
||||
@include themed {
|
||||
background: t($btn-backgroundHover);
|
||||
}
|
||||
}
|
||||
}
|
||||
79
src/components/Elements/MainModal/scss/modules/_sidebar.scss
Normal file
@@ -0,0 +1,79 @@
|
||||
@import 'scss/variables';
|
||||
|
||||
.modalSidebar {
|
||||
@include themed {
|
||||
top: 0;
|
||||
left: 0;
|
||||
position: sticky;
|
||||
margin: 0;
|
||||
padding: 0 5px;
|
||||
background: t($modal-sidebar);
|
||||
border-radius: 12px 0 0 12px;
|
||||
overflow: hidden auto;
|
||||
height: 80vh;
|
||||
min-width: 250px;
|
||||
|
||||
.mainTitle {
|
||||
text-align: center;
|
||||
font-size: 35px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
padding: 25px;
|
||||
}
|
||||
|
||||
svg {
|
||||
margin-left: 20px;
|
||||
margin-right: 20px;
|
||||
color: t($subColor);
|
||||
font-size: 17px;
|
||||
}
|
||||
|
||||
hr {
|
||||
height: 1px;
|
||||
background: #ccc;
|
||||
margin: 0 1.75rem;
|
||||
border: none;
|
||||
}
|
||||
|
||||
button {
|
||||
color: t($color);
|
||||
font-size: 18px;
|
||||
list-style: none;
|
||||
cursor: pointer;
|
||||
border-radius: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin: 0.2rem;
|
||||
padding: 0.5rem;
|
||||
transition: 0.5s;
|
||||
outline: none;
|
||||
border: none;
|
||||
background: none;
|
||||
min-width: calc(100% - 1.2em);
|
||||
text-align: left;
|
||||
|
||||
&:hover {
|
||||
background: t($modal-sidebarActive);
|
||||
}
|
||||
|
||||
&:active {
|
||||
background: t($modal-sidebarActive);
|
||||
box-shadow: 0 0 0 0.5px t($color);
|
||||
}
|
||||
|
||||
&:focus {
|
||||
background: t($modal-sidebarActive);
|
||||
box-shadow: 0 0 0 0.5px t($color);
|
||||
}
|
||||
}
|
||||
|
||||
.tab-list-active {
|
||||
background: t($modal-sidebarActive);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.css-j204z7-MuiFormControlLabel-root {
|
||||
margin-left: 0 !important;
|
||||
margin-right: 0 !important;
|
||||
}
|
||||
146
src/components/Elements/MainModal/scss/settings/_main.scss
Normal file
@@ -0,0 +1,146 @@
|
||||
@import 'scss/variables';
|
||||
@import 'modules/material-ui';
|
||||
@import 'modules/tabs/about';
|
||||
@import 'modules/tabs/changelog';
|
||||
@import 'modules/tabs/order';
|
||||
@import 'modules/tabs/stats';
|
||||
|
||||
input {
|
||||
/* colour picker */
|
||||
&[type='color'] {
|
||||
border-radius: 100%;
|
||||
height: 30px;
|
||||
width: 30px;
|
||||
border: none;
|
||||
outline: none;
|
||||
appearance: none;
|
||||
vertical-align: middle;
|
||||
background: none;
|
||||
|
||||
@include themed {
|
||||
border: t($modal-sidebarActive) 1px solid;
|
||||
}
|
||||
|
||||
&::-webkit-color-swatch-wrapper {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
&::-webkit-color-swatch {
|
||||
border: none;
|
||||
border-radius: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
/* firefox fixes for colour picker (using "," didn't work) */
|
||||
&[type='color']::-moz-color-swatch {
|
||||
border-radius: 100%;
|
||||
height: 30px;
|
||||
width: 30px;
|
||||
border: none;
|
||||
outline: none;
|
||||
appearance: none;
|
||||
vertical-align: middle;
|
||||
background: none;
|
||||
|
||||
&::-moz-color-swatch {
|
||||
border: none;
|
||||
border-radius: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
/* date picker */
|
||||
&[type='date'] {
|
||||
width: 260px;
|
||||
flex-flow: column;
|
||||
|
||||
@include themed {
|
||||
background: t($modal-sidebar);
|
||||
border: 1px solid t($modal-sidebarActive);
|
||||
color: t($color);
|
||||
}
|
||||
|
||||
padding: 15px 20px;
|
||||
border-radius: 4px;
|
||||
display: flex !important;
|
||||
cursor: pointer;
|
||||
|
||||
&::-webkit-calendar-picker-indicator {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* dark theme date picker fix */
|
||||
.dark {
|
||||
::-webkit-calendar-picker-indicator {
|
||||
filter: invert(1);
|
||||
}
|
||||
}
|
||||
|
||||
h4 {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.photosEmpty {
|
||||
height: 400px;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
|
||||
button {
|
||||
padding: 0 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.imagesTopBar {
|
||||
padding-top: 25px;
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
div:nth-child(1) {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
align-items: center;
|
||||
gap: 20px;
|
||||
|
||||
svg {
|
||||
font-size: 30px;
|
||||
|
||||
@include themed {
|
||||
color: t($subColor);
|
||||
}
|
||||
}
|
||||
|
||||
div {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
}
|
||||
}
|
||||
|
||||
.topbarbuttons {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
gap: 25px;
|
||||
}
|
||||
|
||||
button {
|
||||
padding: 0 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.customcss textarea {
|
||||
font-family: Consolas, 'Andale Mono WT', 'Andale Mono', 'Lucida Console', 'Lucida Sans Typewriter',
|
||||
'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Liberation Mono', 'Nimbus Mono L', Monaco,
|
||||
'Courier New', Courier, monospace !important;
|
||||
}
|
||||
|
||||
.preferences {
|
||||
transition: 0.4s ease-in-out;
|
||||
}
|
||||
|
||||
.preferencesInactive {
|
||||
opacity: 0.5;
|
||||
pointer-events: none;
|
||||
transition: 0.4s ease-in-out;
|
||||
}
|
||||
@@ -0,0 +1,181 @@
|
||||
/* these are overrides for the material ui default styles */
|
||||
|
||||
@import 'scss/variables';
|
||||
|
||||
.MuiCheckbox-colorPrimary.Mui-checked,
|
||||
.MuiSwitch-colorPrimary.Mui-checked,
|
||||
.MuIconButton-colorPrimary.Mui-checked,
|
||||
.MuiSwitch-thumb,
|
||||
.MuiRadio-colorSecondary.Mui-checked,
|
||||
.PrivateSwitchBase-input-4,
|
||||
.MuiRadio-root,
|
||||
.aboutLink,
|
||||
.MuiSlider-colorPrimary,
|
||||
legend {
|
||||
@include themed {
|
||||
color: t($color) !important;
|
||||
}
|
||||
}
|
||||
|
||||
.MuiFormControlLabel-labelPlacementStart {
|
||||
margin-left: 0 !important;
|
||||
}
|
||||
|
||||
.MuiSwitch-colorPrimary.Mui-checked + .MuiSwitch-track {
|
||||
@include themed {
|
||||
background-color: t($subColor) !important;
|
||||
}
|
||||
}
|
||||
|
||||
.MuiSwitch-track {
|
||||
@include themed {
|
||||
background-color: t($subColor) !important;
|
||||
}
|
||||
}
|
||||
|
||||
.MuiIconButton-label > svg.MuiSvgIcon-root {
|
||||
@include themed {
|
||||
color: t($color) !important;
|
||||
}
|
||||
}
|
||||
|
||||
.MuiTouchRipple-root {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.MuiFormControl-root {
|
||||
margin-top: 10px !important;
|
||||
}
|
||||
|
||||
.checkbox svg {
|
||||
@include themed {
|
||||
fill: t($color) !important;
|
||||
}
|
||||
}
|
||||
|
||||
.radio-title {
|
||||
font-weight: bold;
|
||||
font-size: 1.17rem;
|
||||
}
|
||||
|
||||
.radio-title-small {
|
||||
font-weight: bold;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.MuiSlider-root {
|
||||
margin-bottom: 30px !important;
|
||||
}
|
||||
|
||||
.MuiOutlinedInput-notchedOutline {
|
||||
@include themed {
|
||||
border-color: t($color) !important;
|
||||
}
|
||||
}
|
||||
|
||||
.MuiFormLabel-root-MuiInputLabel-root {
|
||||
@include themed {
|
||||
color: t($color) !important;
|
||||
}
|
||||
}
|
||||
|
||||
.MuiInputLabel-root,
|
||||
.MuiSlider-markLabel,
|
||||
.MuiInputLabel-root,
|
||||
.MuiSelect-icon,
|
||||
.MuiSelect-select,
|
||||
.Mui-focused,
|
||||
legend,
|
||||
.MuiOutlinedInput-input {
|
||||
@include themed {
|
||||
color: t($color) !important;
|
||||
}
|
||||
}
|
||||
|
||||
.MuiMenu-list {
|
||||
@include themed {
|
||||
background-color: t($modal-background);
|
||||
color: t($color);
|
||||
}
|
||||
|
||||
li {
|
||||
&:hover {
|
||||
@include themed {
|
||||
background-color: t($modal-sidebarActive);
|
||||
transition: 0.5s;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.Mui-selected {
|
||||
@include themed {
|
||||
background-color: t($modal-sidebarActive) !important;
|
||||
}
|
||||
}
|
||||
|
||||
.MuiTextField-root,
|
||||
.MuiFormControl-root,
|
||||
.MuiSlider-root {
|
||||
width: 300px !important;
|
||||
}
|
||||
|
||||
.Mui-disabled {
|
||||
color: #818181 !important;
|
||||
cursor: not-allowed;
|
||||
|
||||
.checkbox svg {
|
||||
fill: #818181 !important;
|
||||
}
|
||||
}
|
||||
|
||||
.MuiPaper-root {
|
||||
@include themed {
|
||||
background-color: t($modal-background) !important;
|
||||
}
|
||||
}
|
||||
|
||||
.MuiSlider-valueLabel {
|
||||
@include themed {
|
||||
background-color: t($modal-sidebarActive) !important;
|
||||
}
|
||||
}
|
||||
|
||||
.MuiFormControlLabel-labelPlacementStart {
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.settingsRow {
|
||||
.MuiFormControlLabel-root {
|
||||
flex-direction: row-reverse;
|
||||
margin-right: 0;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
width: 100%;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.MuiFormControlLabel-root {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.css-w66kx-MuiChip-root {
|
||||
@include themed {
|
||||
color: t($color) !important;
|
||||
border: 1px solid t($modal-sidebarActive);
|
||||
background: t($modal-sidebar) !important;
|
||||
border-radius: t($borderRadius);
|
||||
}
|
||||
|
||||
text-transform: capitalize;
|
||||
}
|
||||
|
||||
.MuiChip-root {
|
||||
text-transform: capitalize;
|
||||
|
||||
@include themed {
|
||||
background: t($modal-sidebarActive) !important;
|
||||
color: t($color) !important;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
.aboutLink {
|
||||
&:hover {
|
||||
opacity: 0.8;
|
||||
}
|
||||
}
|
||||
|
||||
.aboutLogo {
|
||||
height: 100px;
|
||||
width: auto;
|
||||
margin: calc(1rem - 15px) 0 1rem;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.aboutContact {
|
||||
flex-flow: row;
|
||||
display: flex;
|
||||
gap: 15px;
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
|
||||
.contributorImages {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 15px;
|
||||
|
||||
img {
|
||||
width: 75px;
|
||||
height: auto;
|
||||
|
||||
@include themed {
|
||||
border-radius: t($borderRadius);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.subtitle-photographers {
|
||||
font-size: 16px;
|
||||
|
||||
@include themed {
|
||||
color: t($color);
|
||||
|
||||
span {
|
||||
color: t($subColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.aboutText {
|
||||
text-align: center;
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
.updateChangelog {
|
||||
max-width: 75%;
|
||||
margin-top: 15px;
|
||||
white-space: pre-wrap;
|
||||
font-size: 18px;
|
||||
|
||||
a {
|
||||
color: var(--modal-link);
|
||||
|
||||
&:hover {
|
||||
opacity: 0.8;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.changelogtab {
|
||||
.mainTitle {
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 95%;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,164 @@
|
||||
@import 'scss/variables';
|
||||
|
||||
.sortableItem {
|
||||
cursor: move;
|
||||
width: 200px;
|
||||
z-index: 999 !important;
|
||||
padding: 15px;
|
||||
margin-bottom: 10px;
|
||||
font-size: 1.325rem;
|
||||
|
||||
@include themed {
|
||||
color: t($color) !important;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
background: t($modal-secondaryColour);
|
||||
border-radius: t($borderRadius);
|
||||
box-shadow: t($boxShadow);
|
||||
|
||||
svg {
|
||||
font-size: 1.3rem;
|
||||
color: t($subColor);
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background: t($modal-sidebarActive) !important;
|
||||
}
|
||||
}
|
||||
|
||||
ul {
|
||||
-webkit-padding-start: 0;
|
||||
padding: 0;
|
||||
list-style-type: none;
|
||||
|
||||
> label {
|
||||
vertical-align: middle;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.sortablecontainer {
|
||||
-webkit-padding-start: 0;
|
||||
padding: 0;
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
.images-row {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
||||
padding: 20px;
|
||||
grid-gap: 20px;
|
||||
|
||||
@include themed {
|
||||
div {
|
||||
border-radius: t($borderRadius);
|
||||
|
||||
// border: 5px t($modal-sidebar) solid;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-flow: column;
|
||||
gap: 5px;
|
||||
position: relative;
|
||||
|
||||
img {
|
||||
width: 100%;
|
||||
height: 200px;
|
||||
object-fit: cover;
|
||||
border-radius: t($borderRadius);
|
||||
}
|
||||
|
||||
button {
|
||||
padding: 0 30px;
|
||||
background: t($modal-background);
|
||||
border: none !important;
|
||||
|
||||
&:hover {
|
||||
background: t($modal-sidebarActive);
|
||||
}
|
||||
}
|
||||
|
||||
.tooltip {
|
||||
position: absolute !important;
|
||||
top: 5px !important;
|
||||
right: 5px !important;
|
||||
}
|
||||
}
|
||||
|
||||
.iconButton {
|
||||
width: calc(100% - 22px);
|
||||
margin-top: 10px;
|
||||
|
||||
@include basicIconButton(11px, 1.3rem, modal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.overviewGrid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
||||
grid-gap: 30px;
|
||||
}
|
||||
|
||||
.tabPreview {
|
||||
width: 100%;
|
||||
aspect-ratio: 2 / 1;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-top: 16px;
|
||||
|
||||
@include themed {
|
||||
background: t($modal-secondaryColour);
|
||||
border-radius: t($borderRadius);
|
||||
box-shadow: t($boxShadow);
|
||||
}
|
||||
|
||||
.previewItem {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
align-items: center;
|
||||
|
||||
.quotediv .quote {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.quotediv .author-holder .author .author-content .title {
|
||||
font-size: 1em !important;
|
||||
|
||||
@include themed {
|
||||
color: t($color) !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.overviewNews {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
margin-top: 16px;
|
||||
padding: 25px;
|
||||
|
||||
.title {
|
||||
font-size: 36px !important;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
font-size: 12px !important;
|
||||
text-align: center;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
.content {
|
||||
margin: 20px 20px 0;
|
||||
}
|
||||
|
||||
@include themed {
|
||||
background: t($modal-secondaryColour);
|
||||
border-radius: t($borderRadius);
|
||||
box-shadow: t($boxShadow);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
.stats {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 30px;
|
||||
width: 100%;
|
||||
|
||||
.rightPanel {
|
||||
.statIcon {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.statGrid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
||||
grid-gap: 10px;
|
||||
|
||||
div {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
}
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
text-transform: capitalize;
|
||||
}
|
||||
|
||||
span {
|
||||
font-size: 20px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.achievements {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 15px;
|
||||
}
|
||||
|
||||
.achievementsGrid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
||||
grid-gap: 10px;
|
||||
}
|
||||
|
||||
.achievement {
|
||||
padding: 20px 10px;
|
||||
display: flex;
|
||||
flex-flow: row !important;
|
||||
align-items: center;
|
||||
|
||||
@include themed {
|
||||
background: t($modal-secondaryColour);
|
||||
border: 1px solid t($modal-sidebarActive);
|
||||
border-radius: t($borderRadius);
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.timestamp {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
align-items: center;
|
||||
gap: 5px;
|
||||
font-size: 12px;
|
||||
|
||||
@include themed {
|
||||
color: t($subColor);
|
||||
}
|
||||
}
|
||||
|
||||
.achievementTitle {
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
svg.trophy {
|
||||
font-size: 20px !important;
|
||||
|
||||
@include themed {
|
||||
background-image: t($slightGradient);
|
||||
box-shadow: t($boxShadow);
|
||||
}
|
||||
|
||||
padding: 15px;
|
||||
border-radius: 100%;
|
||||
}
|
||||
|
||||
svg.trophyLocked {
|
||||
font-size: 20px !important;
|
||||
|
||||
@include themed {
|
||||
background-image: t($modal-sidebarActive);
|
||||
box-shadow: t($boxShadow);
|
||||
}
|
||||
|
||||
padding: 15px;
|
||||
border-radius: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.statSection.rightPanel {
|
||||
padding: 25px;
|
||||
|
||||
@include themed {
|
||||
border-radius: t($borderRadius);
|
||||
background: t($modal-secondaryColour);
|
||||
box-shadow: 0 0 0 1px t($modal-sidebarActive);
|
||||
|
||||
svg {
|
||||
font-size: 50px;
|
||||
color: t($subColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.achievementContent {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 2px;
|
||||
|
||||
.subtitle {
|
||||
font-size: 13px !important;
|
||||
}
|
||||
}
|
||||
|
||||
.statsTopBar {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
button {
|
||||
margin-bottom: 15px;
|
||||
flex-flow: row !important;
|
||||
padding-left: 20px;
|
||||
padding-right: 20px;
|
||||
}
|
||||
}
|
||||
54
src/components/Elements/ResetModal/ResetModal.jsx
Normal file
@@ -0,0 +1,54 @@
|
||||
import { memo } from 'react';
|
||||
import variables from 'config/variables';
|
||||
import { MdClose, MdRestartAlt } from 'react-icons/md';
|
||||
import { setDefaultSettings } from 'utils/settings';
|
||||
import { Tooltip, Button } from 'components/Elements';
|
||||
|
||||
function ResetModal({ modalClose }) {
|
||||
const reset = () => {
|
||||
variables.stats.postEvent('setting', 'Reset');
|
||||
setDefaultSettings('reset');
|
||||
window.location.reload();
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="smallModal">
|
||||
<div className="shareHeader">
|
||||
<span className="title">
|
||||
{variables.getMessage('modals.main.settings.sections.advanced.reset_modal.title')}
|
||||
</span>
|
||||
<Tooltip
|
||||
title={variables.getMessage('modals.main.settings.sections.advanced.reset_modal.cancel')}
|
||||
>
|
||||
<div className="close" onClick={modalClose}>
|
||||
<MdClose />
|
||||
</div>
|
||||
</Tooltip>
|
||||
</div>
|
||||
<span className="title">
|
||||
{variables.getMessage('modals.main.settings.sections.advanced.reset_modal.question')}
|
||||
</span>
|
||||
<span className="subtitle">
|
||||
{variables.getMessage('modals.main.settings.sections.advanced.reset_modal.information')}
|
||||
</span>
|
||||
<div className="resetFooter">
|
||||
<Button
|
||||
type="secondary"
|
||||
onClick={modalClose}
|
||||
icon={<MdClose />}
|
||||
label={variables.getMessage('modals.main.settings.sections.advanced.reset_modal.cancel')}
|
||||
/>
|
||||
<Button
|
||||
type="settings"
|
||||
onClick={() => reset()}
|
||||
icon={<MdRestartAlt />}
|
||||
label={variables.getMessage('modals.main.settings.buttons.reset')}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
const MemoizedResetModal = memo(ResetModal);
|
||||
|
||||
export { MemoizedResetModal as default, MemoizedResetModal as ResetModal };
|
||||
1
src/components/Elements/ResetModal/index.jsx
Normal file
@@ -0,0 +1 @@
|
||||
export * from './ResetModal';
|
||||
130
src/components/Elements/ShareModal/ShareModal.jsx
Normal file
@@ -0,0 +1,130 @@
|
||||
import { memo } from 'react';
|
||||
import variables from 'config/variables';
|
||||
import { MdClose, MdEmail, MdContentCopy } from 'react-icons/md';
|
||||
import { FaFacebookF } from 'react-icons/fa';
|
||||
import { AiFillWechat } from 'react-icons/ai';
|
||||
import { SiTencentqq, SiX } from 'react-icons/si';
|
||||
import Tooltip from '../Tooltip/Tooltip';
|
||||
import { toast } from 'react-toastify';
|
||||
|
||||
import { Button } from 'components/Elements';
|
||||
|
||||
import './sharemodal.scss';
|
||||
|
||||
function ShareModal({ modalClose, data }) {
|
||||
if (data.startsWith('https://cdn.')) {
|
||||
data = {
|
||||
url: data,
|
||||
name: 'this image',
|
||||
};
|
||||
} else if (data.startsWith('"')) {
|
||||
data = {
|
||||
url: data,
|
||||
name: 'this quote',
|
||||
};
|
||||
} else {
|
||||
data = {
|
||||
url: data,
|
||||
name: 'this marketplace item',
|
||||
};
|
||||
}
|
||||
|
||||
const copyLink = () => {
|
||||
navigator.clipboard.writeText(data.url);
|
||||
toast(
|
||||
data.startsWith('"')
|
||||
? variables.getMessage('toasts.quote')
|
||||
: variables.getMessage('toasts.link_copied'),
|
||||
);
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="smallModal">
|
||||
<div className="shareHeader">
|
||||
<span className="title">{variables.getMessage('widgets.quote.share')}</span>
|
||||
<Tooltip title={variables.getMessage('modals.welcome.buttons.close')}>
|
||||
<div className="close" onClick={modalClose}>
|
||||
<MdClose />
|
||||
</div>
|
||||
</Tooltip>
|
||||
</div>
|
||||
<div className="shareButtons">
|
||||
<Button
|
||||
onClick={() =>
|
||||
window
|
||||
.open(
|
||||
`https://x.com/intent/tweet?text=Check out ${data.name} on @getmue: ${data.url}`,
|
||||
'_blank',
|
||||
)
|
||||
.focus()
|
||||
}
|
||||
icon={<SiX />}
|
||||
tooltipTitle="X (Twitter)"
|
||||
type="icon"
|
||||
/>
|
||||
<Button
|
||||
onClick={() =>
|
||||
window
|
||||
.open(`https://www.facebook.com/sharer/sharer.php?u=${data.url}`, '_blank')
|
||||
.focus()
|
||||
}
|
||||
icon={<FaFacebookF />}
|
||||
tooltipTitle="Facebook"
|
||||
type="icon"
|
||||
/>
|
||||
<Button
|
||||
onClick={() =>
|
||||
window
|
||||
.open(
|
||||
'mailto:email@example.com?subject=Check%20out%20this%20%on%20%Mue!&body=' +
|
||||
data.name +
|
||||
'on Mue: ' +
|
||||
data.url,
|
||||
'_blank',
|
||||
)
|
||||
.focus()
|
||||
}
|
||||
icon={<MdEmail />}
|
||||
tooltipTitle="Email"
|
||||
type="icon"
|
||||
/>
|
||||
<Button
|
||||
onClick={() =>
|
||||
window
|
||||
.open(
|
||||
`https://api.qrserver.com/v1/create-qr-code/?size=154x154&data=${data.url}`,
|
||||
'_blank',
|
||||
)
|
||||
.focus()
|
||||
}
|
||||
icon={<AiFillWechat />}
|
||||
tooltipTitle="WeChat"
|
||||
type="icon"
|
||||
/>
|
||||
<Button
|
||||
onClick={() =>
|
||||
window
|
||||
.open(`https://connect.qq.com/widget/shareqq/index.html?url=${data.url}`, '_blank')
|
||||
.focus()
|
||||
}
|
||||
icon={<SiTencentqq />}
|
||||
tooltipTitle="Tencent QQ"
|
||||
type="icon"
|
||||
/>
|
||||
</div>
|
||||
<div className="copy">
|
||||
<input type="text" value={data.url} className="left field" readOnly />
|
||||
<Button
|
||||
onClick={() => copyLink()}
|
||||
icon={<MdContentCopy />}
|
||||
tooltipTitle={variables.getMessage('modals.share.copy_link')}
|
||||
type="icon"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
const MemoizedSharemodal = memo(ShareModal);
|
||||
|
||||
export { MemoizedSharemodal as default, MemoizedSharemodal as ShareModal };
|
||||
1
src/components/Elements/ShareModal/index.jsx
Normal file
@@ -0,0 +1 @@
|
||||
export * from './ShareModal';
|
||||
109
src/components/Elements/ShareModal/sharemodal.scss
Normal file
@@ -0,0 +1,109 @@
|
||||
@import 'scss/variables';
|
||||
|
||||
.smallModal {
|
||||
@extend %tabText;
|
||||
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 15px;
|
||||
padding: 15px;
|
||||
width: 320px;
|
||||
|
||||
@include themed {
|
||||
background: t($modal-secondaryColour);
|
||||
}
|
||||
|
||||
.resetFooter {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
justify-content: flex-end;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.textButton {
|
||||
@include basicIconButton(11px, 1.3rem, modal-text);
|
||||
|
||||
border: none !important;
|
||||
}
|
||||
|
||||
.tooltipTitle {
|
||||
@include themed {
|
||||
background: t($modal-sidebar);
|
||||
box-shadow: 0 0 0 1px t($modal-sidebarActive);
|
||||
color: t($color);
|
||||
}
|
||||
}
|
||||
|
||||
.shareButtons {
|
||||
justify-content: space-between;
|
||||
display: flex;
|
||||
gap: 15px;
|
||||
|
||||
button {
|
||||
width: 40px;
|
||||
}
|
||||
}
|
||||
|
||||
.copy {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
gap: 15px;
|
||||
|
||||
button {
|
||||
width: 40px;
|
||||
}
|
||||
|
||||
input[type='text'] {
|
||||
@include themed {
|
||||
background: t($modal-sidebar);
|
||||
border-radius: t($borderRadius);
|
||||
box-shadow: 0 0 0 1px t($modal-sidebarActive);
|
||||
padding: 11px;
|
||||
flex: 1;
|
||||
color: t($color);
|
||||
}
|
||||
|
||||
border: none;
|
||||
outline: none;
|
||||
}
|
||||
}
|
||||
|
||||
input[type='text'] {
|
||||
@include themed {
|
||||
background: t($modal-sidebar);
|
||||
border-radius: t($borderRadius);
|
||||
box-shadow: 0 0 0 1px t($modal-sidebarActive);
|
||||
padding: 11px;
|
||||
flex: 1;
|
||||
color: t($color);
|
||||
}
|
||||
|
||||
border: none;
|
||||
outline: none;
|
||||
}
|
||||
}
|
||||
|
||||
.shareHeader {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
.close {
|
||||
padding: 15px;
|
||||
place-items: center;
|
||||
display: grid;
|
||||
cursor: pointer;
|
||||
transition: 0.3s;
|
||||
|
||||
@include themed {
|
||||
border-radius: t($borderRadius);
|
||||
}
|
||||
|
||||
&:hover {
|
||||
@include themed {
|
||||
background: t($modal-sidebarActive);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
54
src/components/Elements/Tooltip/Tooltip.jsx
Normal file
@@ -0,0 +1,54 @@
|
||||
import { useState, memo, useRef } from 'react';
|
||||
import { useFloating, flip, offset, shift } from '@floating-ui/react-dom';
|
||||
import './tooltip.scss';
|
||||
|
||||
function Tooltip({ children, title, style, placement, subtitle }) {
|
||||
const [showTooltip, setShowTooltip] = useState(false);
|
||||
const [reference, setReference] = useState(null);
|
||||
const tooltipId = useRef(`tooltip-${Math.random()}`);
|
||||
|
||||
const { x, y, refs, strategy } = useFloating({
|
||||
placement: placement || 'bottom',
|
||||
middleware: [flip(), offset(15), shift()],
|
||||
elements: {
|
||||
reference,
|
||||
},
|
||||
});
|
||||
|
||||
return (
|
||||
<>
|
||||
<div
|
||||
className="tooltip"
|
||||
style={style}
|
||||
onMouseEnter={() => setShowTooltip(true)}
|
||||
onMouseLeave={() => setShowTooltip(false)}
|
||||
onFocus={() => setShowTooltip(true)}
|
||||
onBlur={() => setShowTooltip(false)}
|
||||
ref={setReference}
|
||||
aria-describedby={tooltipId.current}
|
||||
>
|
||||
{children}
|
||||
</div>
|
||||
{showTooltip && (
|
||||
<span
|
||||
ref={refs.setFloating}
|
||||
style={{
|
||||
position: strategy,
|
||||
top: y ?? '',
|
||||
left: x ?? '',
|
||||
display: 'flex',
|
||||
flexFlow: 'column',
|
||||
}}
|
||||
className="tooltipTitle"
|
||||
>
|
||||
{title}
|
||||
<span style={{ fontSize: '8px' }}>{subtitle}</span>
|
||||
</span>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
const MemoizedTooltip = memo(Tooltip);
|
||||
|
||||
export { MemoizedTooltip as default, MemoizedTooltip as Tooltip };
|
||||
1
src/components/Elements/Tooltip/index.jsx
Normal file
@@ -0,0 +1 @@
|
||||
export * from './Tooltip';
|
||||