mirror of
https://github.com/fmhy/edit.git
synced 2026-01-28 10:51:02 +00:00
Compare commits
620 Commits
revert-409
...
imgbot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
27bec76f21 | ||
|
|
7af5eb1e25 | ||
|
|
c792150402 | ||
|
|
bb984b1329 | ||
|
|
e7af12a753 | ||
|
|
535951fe12 | ||
|
|
640c36d2ca | ||
|
|
180d36b70b | ||
|
|
0936b896af | ||
|
|
cdc50f7a8a | ||
|
|
8936cc3545 | ||
|
|
421c9a1cab | ||
|
|
dd405caf2f | ||
|
|
9b8043d948 | ||
|
|
00c405f2fb | ||
|
|
570c7f1780 | ||
|
|
ea1c0f7937 | ||
|
|
f6152be439 | ||
|
|
6149cdc420 | ||
|
|
e5b9ccda88 | ||
|
|
392b1d9ece | ||
|
|
6615104763 | ||
|
|
148ace38bb | ||
|
|
48a62e2e37 | ||
|
|
3b3b3fef19 | ||
|
|
e512816041 | ||
|
|
f186a67049 | ||
|
|
b574771638 | ||
|
|
4cb3a3a12e | ||
|
|
f3f0e01887 | ||
|
|
382a56168d | ||
|
|
88bf229cd3 | ||
|
|
8824ca15d3 | ||
|
|
8d4fe256ce | ||
|
|
97c9dd3730 | ||
|
|
3980357204 | ||
|
|
c1d4257ac3 | ||
|
|
cfeb18d2a0 | ||
|
|
2f1d364b70 | ||
|
|
b4454a496d | ||
|
|
393b64d481 | ||
|
|
a0ffbc890d | ||
|
|
4d162271cf | ||
|
|
a0216c0381 | ||
|
|
4ee816b497 | ||
|
|
887dcdc9c0 | ||
|
|
fd171130a9 | ||
|
|
6e7a285a46 | ||
|
|
b053290951 | ||
|
|
04d4449346 | ||
|
|
91775cc1dd | ||
|
|
ffb5eabd2d | ||
|
|
bec133394e | ||
|
|
bf54290287 | ||
|
|
33162eca11 | ||
|
|
0096e2fbde | ||
|
|
ac1422c52f | ||
|
|
9308764802 | ||
|
|
31bd66e455 | ||
|
|
aa95a444c5 | ||
|
|
c0f71dfae8 | ||
|
|
30b4ba4ffa | ||
|
|
35ffe199d2 | ||
|
|
5091acc1f3 | ||
|
|
4861b4bdb9 | ||
|
|
32b11ba3c0 | ||
|
|
e099fab018 | ||
|
|
da772d5491 | ||
|
|
c21b1a1686 | ||
|
|
4746986df0 | ||
|
|
10014801ca | ||
|
|
fc9cab8d7e | ||
|
|
03377cd68e | ||
|
|
eccf8472b1 | ||
|
|
7e2b4c3ba5 | ||
|
|
3551faed9d | ||
|
|
0757624cb2 | ||
|
|
617663d9dd | ||
|
|
4ec2ecb22e | ||
|
|
50b013d356 | ||
|
|
04b1829c7a | ||
|
|
5e08bbe913 | ||
|
|
8bb9a04331 | ||
|
|
4b340191ad | ||
|
|
e6fb8d7520 | ||
|
|
ce280b9af7 | ||
|
|
da9cb76361 | ||
|
|
99acae6f45 | ||
|
|
89ca8d01ce | ||
|
|
3e2556c484 | ||
|
|
98ec650b29 | ||
|
|
1eed3819fd | ||
|
|
2e126b84f0 | ||
|
|
025eeacd06 | ||
|
|
dc5d4abfc7 | ||
|
|
ad15525706 | ||
|
|
c7ca6554ea | ||
|
|
25c48d13d6 | ||
|
|
3f0e9d04f4 | ||
|
|
4102c327b6 | ||
|
|
d6bf9dc79a | ||
|
|
27bc24bf0d | ||
|
|
a252f8ee65 | ||
|
|
f271deb08b | ||
|
|
2721c780c0 | ||
|
|
dd4b15d4c0 | ||
|
|
d5c6b60030 | ||
|
|
9c6335f390 | ||
|
|
2fbe367f5e | ||
|
|
c143af0052 | ||
|
|
ad14fc0dd6 | ||
|
|
0ce6061497 | ||
|
|
6cf024a4ad | ||
|
|
361e48f862 | ||
|
|
a34a97eb41 | ||
|
|
4a3fb8da60 | ||
|
|
46b6ae53bb | ||
|
|
10fa9f6d17 | ||
|
|
28d58ed18f | ||
|
|
802f418346 | ||
|
|
8b53fe3833 | ||
|
|
1ce78cec8c | ||
|
|
bfc15e8141 | ||
|
|
703831f6ea | ||
|
|
bfda08e659 | ||
|
|
11dff3a3bd | ||
|
|
c7c73a89b0 | ||
|
|
3987f9dfad | ||
|
|
8f8c904749 | ||
|
|
3f5ba2e81b | ||
|
|
f8b6701c5f | ||
|
|
c17c00a78b | ||
|
|
578fb35f0e | ||
|
|
5cb9aa242e | ||
|
|
f89bf55ab0 | ||
|
|
56329f8bf0 | ||
|
|
908a1d8ce4 | ||
|
|
57ef8769a2 | ||
|
|
9e57d11f79 | ||
|
|
7719ec6480 | ||
|
|
2e22f762ee | ||
|
|
4d333ec136 | ||
|
|
6fd5b90dd3 | ||
|
|
f18ea4564c | ||
|
|
8e72e0a355 | ||
|
|
2cf2ebb03f | ||
|
|
0ba2c0e2f5 | ||
|
|
177c0a5a68 | ||
|
|
13b2363b88 | ||
|
|
5c49f26194 | ||
|
|
5464eea1fb | ||
|
|
0c6aeb1529 | ||
|
|
e8a9e4efd9 | ||
|
|
cc9c619396 | ||
|
|
ad0d06c80a | ||
|
|
5bd1fbe5d3 | ||
|
|
12ad47cdab | ||
|
|
51154004a9 | ||
|
|
164b76a958 | ||
|
|
9e97239032 | ||
|
|
b58a0dc20d | ||
|
|
45267f26c5 | ||
|
|
a4b38f7b7d | ||
|
|
07f665dfbe | ||
|
|
e77d1236fb | ||
|
|
1aee200af2 | ||
|
|
89a2d03d34 | ||
|
|
6f78d7a1db | ||
|
|
773e1240d0 | ||
|
|
890af91b09 | ||
|
|
9686ef1231 | ||
|
|
15d4b5f022 | ||
|
|
819efba5fa | ||
|
|
14ceabb78c | ||
|
|
e8737adc1f | ||
|
|
9e1531c52d | ||
|
|
8ef2265c7a | ||
|
|
d048934ae2 | ||
|
|
235bd9381a | ||
|
|
51fbba0ded | ||
|
|
120de77f3f | ||
|
|
278de41202 | ||
|
|
343bc3580d | ||
|
|
2dfe3ca1e7 | ||
|
|
d66e86d54f | ||
|
|
98939c6376 | ||
|
|
f2fd183f9e | ||
|
|
ea5dc10e4c | ||
|
|
f256306ce2 | ||
|
|
b049f16b3d | ||
|
|
448fbca0e2 | ||
|
|
75cbdb891e | ||
|
|
589ad9926b | ||
|
|
31aaccaf96 | ||
|
|
27b95895a2 | ||
|
|
6dea6a4787 | ||
|
|
5ae4585893 | ||
|
|
fdc2f71688 | ||
|
|
8f9c692c35 | ||
|
|
a0eb8daf80 | ||
|
|
3e1625c50e | ||
|
|
a29938a5fa | ||
|
|
6eba8bacb0 | ||
|
|
c0cd54db92 | ||
|
|
aefd4d9904 | ||
|
|
6498b20e34 | ||
|
|
07208a44f0 | ||
|
|
e264f4a055 | ||
|
|
3af6821067 | ||
|
|
4a4209a5eb | ||
|
|
577fad2afe | ||
|
|
26c83fb33a | ||
|
|
6e29ed0279 | ||
|
|
2f8fc29f41 | ||
|
|
2e5ec1b05b | ||
|
|
4866e9a9fd | ||
|
|
0440d4a42a | ||
|
|
450c1f96bb | ||
|
|
e23b76a2d0 | ||
|
|
b437067446 | ||
|
|
7ccfc962a7 | ||
|
|
3d89ad0609 | ||
|
|
bd2f3130c0 | ||
|
|
36c87302b1 | ||
|
|
1a1f553391 | ||
|
|
2ed2975823 | ||
|
|
13dcb5c227 | ||
|
|
78c786be62 | ||
|
|
df265614b8 | ||
|
|
968a775e7b | ||
|
|
09e43b4954 | ||
|
|
998e4bc6b6 | ||
|
|
865e7ebda1 | ||
|
|
89ec4df6a5 | ||
|
|
574741cb5c | ||
|
|
336e7ebc14 | ||
|
|
ee96f6bfbf | ||
|
|
c4da34aed5 | ||
|
|
960247e1e6 | ||
|
|
710cb07fd5 | ||
|
|
989c4014f0 | ||
|
|
4ec20e6c77 | ||
|
|
d693d12e92 | ||
|
|
f27c8ea98a | ||
|
|
153642bef7 | ||
|
|
0a1800ab2d | ||
|
|
c0b40925c8 | ||
|
|
b28e00a9a3 | ||
|
|
cd13e9c3e2 | ||
|
|
788b1bfc78 | ||
|
|
ad333805f1 | ||
|
|
a503a0d6d9 | ||
|
|
a5efcd7f35 | ||
|
|
3d55f6a2b4 | ||
|
|
0d8168208e | ||
|
|
a2194b2938 | ||
|
|
4ac2e3b086 | ||
|
|
1c58eb7658 | ||
|
|
b66e260234 | ||
|
|
31ebf15adc | ||
|
|
01e6e0cf60 | ||
|
|
bdcaf00d04 | ||
|
|
ad6b0578d7 | ||
|
|
da5e1d36c6 | ||
|
|
5113079583 | ||
|
|
f56151ce29 | ||
|
|
e826bb9edb | ||
|
|
207b9831ba | ||
|
|
04ca6a6c34 | ||
|
|
052380391c | ||
|
|
606035ca0b | ||
|
|
c354e2237b | ||
|
|
9bd66f0d3c | ||
|
|
56d2f0b7c3 | ||
|
|
2b514517c4 | ||
|
|
ac280bc08d | ||
|
|
5c42098bf4 | ||
|
|
778db6224b | ||
|
|
d4b5a7e3aa | ||
|
|
4660fd5103 | ||
|
|
6840cbc617 | ||
|
|
b5bacb8f10 | ||
|
|
af984aa3c2 | ||
|
|
4dc16cb031 | ||
|
|
0add5de49a | ||
|
|
1dda502975 | ||
|
|
06bcc47284 | ||
|
|
65c8ae79e9 | ||
|
|
cfb7eaaf23 | ||
|
|
f4f4a843e2 | ||
|
|
dcb2f2ffd3 | ||
|
|
c11d628228 | ||
|
|
898def8ce8 | ||
|
|
a52510a373 | ||
|
|
076fcbdcee | ||
|
|
7318161158 | ||
|
|
5a17bd3516 | ||
|
|
cd1f631b75 | ||
|
|
bb78e85f5d | ||
|
|
0fd0a0b998 | ||
|
|
94972f3d44 | ||
|
|
97409972e6 | ||
|
|
b8608aeca0 | ||
|
|
21162b2b0e | ||
|
|
08d2f06cb7 | ||
|
|
8673432157 | ||
|
|
868f9f9be8 | ||
|
|
c8504dfd35 | ||
|
|
abacc2e3cc | ||
|
|
5df8307628 | ||
|
|
b73e07bd6a | ||
|
|
e376cd6203 | ||
|
|
91ab13fa62 | ||
|
|
385728eb1b | ||
|
|
0768e7677d | ||
|
|
73e7ec2292 | ||
|
|
bbfcdfa094 | ||
|
|
e697cd491f | ||
|
|
d673e51173 | ||
|
|
cd27c7234c | ||
|
|
d4d4ad0d85 | ||
|
|
d0b9c2079b | ||
|
|
a7c32ec25b | ||
|
|
c3cea020b3 | ||
|
|
f00f987cbb | ||
|
|
8540818411 | ||
|
|
7b6cbb05c3 | ||
|
|
0a38a95b91 | ||
|
|
1f422a2a76 | ||
|
|
b76a0d725b | ||
|
|
0f2539d45f | ||
|
|
513978b53d | ||
|
|
bd486e03e1 | ||
|
|
533d364ef7 | ||
|
|
9a9cd6dd47 | ||
|
|
6e79c3db50 | ||
|
|
743ce80d22 | ||
|
|
6e7ff296f7 | ||
|
|
8a9af74a19 | ||
|
|
dd6b535210 | ||
|
|
76dfb3af9e | ||
|
|
9c928d6b05 | ||
|
|
c22066d442 | ||
|
|
e0eb555875 | ||
|
|
890443fbf5 | ||
|
|
69efb7e618 | ||
|
|
1063d62f7f | ||
|
|
710b7e3346 | ||
|
|
cbf74af77a | ||
|
|
de08257487 | ||
|
|
1de66d0875 | ||
|
|
d60634b3ae | ||
|
|
5366c90b64 | ||
|
|
9f94bc6b98 | ||
|
|
b32a007beb | ||
|
|
b1b7bfac08 | ||
|
|
0baed4e56f | ||
|
|
5abfcfbefb | ||
|
|
0f3bc5af73 | ||
|
|
793245f134 | ||
|
|
48dc1c401a | ||
|
|
f696aabd5b | ||
|
|
8850dbc999 | ||
|
|
7b936a8aef | ||
|
|
ca3e91a635 | ||
|
|
4e882f194a | ||
|
|
426bab437d | ||
|
|
93e35c349d | ||
|
|
f983060bcc | ||
|
|
ca5cdf3df8 | ||
|
|
ad547e4166 | ||
|
|
de504b3643 | ||
|
|
c454b0d132 | ||
|
|
c7ff01183d | ||
|
|
ea839dd122 | ||
|
|
624e70a83a | ||
|
|
46baf9747f | ||
|
|
2addd8f8d1 | ||
|
|
44fa3c9974 | ||
|
|
eb6a8b09dc | ||
|
|
3a48f62e5c | ||
|
|
02a9495a1d | ||
|
|
ca10ba73b3 | ||
|
|
57f4970582 | ||
|
|
72e33d988a | ||
|
|
967ab0e1bd | ||
|
|
410bf2129a | ||
|
|
7f66db77d9 | ||
|
|
092c9df0c7 | ||
|
|
0eb047a2d5 | ||
|
|
3c0575599e | ||
|
|
6136b07860 | ||
|
|
b1b3c3645b | ||
|
|
6fc4a8c9b3 | ||
|
|
84949eef78 | ||
|
|
f2967a8ce3 | ||
|
|
74efeaa681 | ||
|
|
6c3c762fe7 | ||
|
|
dbcae9e9e5 | ||
|
|
0e25d38a89 | ||
|
|
006f5bb365 | ||
|
|
937100250d | ||
|
|
ada5c993cd | ||
|
|
14f8494e10 | ||
|
|
2dce9b2e55 | ||
|
|
17e2996d1d | ||
|
|
a853904d89 | ||
|
|
b6d0bee257 | ||
|
|
b7908b34bd | ||
|
|
a1ccc71799 | ||
|
|
e9178954b6 | ||
|
|
06c01778a1 | ||
|
|
ee01fcb8ef | ||
|
|
3801ac976a | ||
|
|
d4772512c0 | ||
|
|
427d290aad | ||
|
|
05b35eb2c4 | ||
|
|
48e4a88cf5 | ||
|
|
cdaf89a046 | ||
|
|
164a0fe3be | ||
|
|
caec4b383b | ||
|
|
90dbf0f2da | ||
|
|
fe426c9766 | ||
|
|
e6d4e6ddc9 | ||
|
|
aa14b5c818 | ||
|
|
29a89dcef4 | ||
|
|
6cd1f460be | ||
|
|
9d23437a40 | ||
|
|
f4f92bb70d | ||
|
|
3f8286b960 | ||
|
|
6e6484eb26 | ||
|
|
314737ec4f | ||
|
|
a817bef23b | ||
|
|
805a15d257 | ||
|
|
365dbd6f4c | ||
|
|
b8a66c7493 | ||
|
|
2d22602b70 | ||
|
|
cd64df604c | ||
|
|
0bfc3248e0 | ||
|
|
729cc86826 | ||
|
|
823a5a18b6 | ||
|
|
51aa9c7279 | ||
|
|
2a44ec4e53 | ||
|
|
f9267b1c78 | ||
|
|
853f446efa | ||
|
|
2284231f2e | ||
|
|
26ffe87ec3 | ||
|
|
15b1e0ebc2 | ||
|
|
7757c030ad | ||
|
|
954fd41ee3 | ||
|
|
a2008b4b6d | ||
|
|
424d6bbc4c | ||
|
|
6105b4136c | ||
|
|
1bd12d0804 | ||
|
|
f332bce34f | ||
|
|
8e6c47d56f | ||
|
|
4655a761fa | ||
|
|
2576177b93 | ||
|
|
ee1e91d2f4 | ||
|
|
2e7ff408f2 | ||
|
|
c3f07c05e2 | ||
|
|
5dcd25cdf0 | ||
|
|
ef4a66976b | ||
|
|
1cf3732b94 | ||
|
|
30e12008d7 | ||
|
|
d2692bf619 | ||
|
|
2a5b4b10c7 | ||
|
|
df055d35e1 | ||
|
|
a34693f77b | ||
|
|
43babf2889 | ||
|
|
721d9a04e9 | ||
|
|
dc1605ea66 | ||
|
|
0158819a5b | ||
|
|
4949cb7e2d | ||
|
|
da86125209 | ||
|
|
baacd94d8c | ||
|
|
a5220e1485 | ||
|
|
7a1ca832ad | ||
|
|
538105ee82 | ||
|
|
c480a1fbac | ||
|
|
54b54b2fb5 | ||
|
|
5dac9d2ace | ||
|
|
735ef1ef00 | ||
|
|
1cf999bd5f | ||
|
|
6ea5a99f33 | ||
|
|
f5207b6594 | ||
|
|
8916ddff19 | ||
|
|
b1e462eb01 | ||
|
|
f9247acd95 | ||
|
|
e0b8a9d74d | ||
|
|
9370881785 | ||
|
|
9fbb892b6b | ||
|
|
6f9b185652 | ||
|
|
437ead7842 | ||
|
|
440d2bc8bc | ||
|
|
16b9d0d792 | ||
|
|
4cf08e325f | ||
|
|
4579204da0 | ||
|
|
92fe247fa6 | ||
|
|
b4fe45dd71 | ||
|
|
6c45101ea1 | ||
|
|
2b95b071d1 | ||
|
|
befbbc139d | ||
|
|
66495289cd | ||
|
|
ebe8db79ad | ||
|
|
3a5dfc91ee | ||
|
|
da858248d9 | ||
|
|
37723e0aa0 | ||
|
|
c106dc446e | ||
|
|
edb557785d | ||
|
|
31843af937 | ||
|
|
3bf1ca0ae4 | ||
|
|
d5c92e2b42 | ||
|
|
c633357d91 | ||
|
|
a1c3a44184 | ||
|
|
004036de92 | ||
|
|
bb79a8d409 | ||
|
|
142aa16b3e | ||
|
|
d81ed3c0a1 | ||
|
|
3964b638fa | ||
|
|
25ddc501d1 | ||
|
|
12b9839894 | ||
|
|
3ad38d1567 | ||
|
|
5dc30dcba0 | ||
|
|
51aa3560ca | ||
|
|
b81feb041d | ||
|
|
db8fa62e1b | ||
|
|
136e282187 | ||
|
|
75556dfbd8 | ||
|
|
e3f361520c | ||
|
|
976bff91a8 | ||
|
|
18b29bedce | ||
|
|
08a053f53b | ||
|
|
2253ed9a71 | ||
|
|
6e5833fa75 | ||
|
|
d25884c425 | ||
|
|
0322532de1 | ||
|
|
82dafd2fca | ||
|
|
fe12d49c8a | ||
|
|
99db99df54 | ||
|
|
5f39107772 | ||
|
|
61d4ac48e3 | ||
|
|
cf547e51f9 | ||
|
|
9b9089f123 | ||
|
|
c886916a9f | ||
|
|
76820b519f | ||
|
|
badae3f31f | ||
|
|
2b7e49034a | ||
|
|
8f827fe184 | ||
|
|
5c86701330 | ||
|
|
51f9d8bd61 | ||
|
|
cf92bd988a | ||
|
|
1c1fc947c0 | ||
|
|
fba9149dde | ||
|
|
b10d3e8c58 | ||
|
|
840fa48991 | ||
|
|
bf4002d0f6 | ||
|
|
c7bd76b3b4 | ||
|
|
75f7e2ca79 | ||
|
|
e018996355 | ||
|
|
333717cc27 | ||
|
|
7f333ead3b | ||
|
|
d48d19088b | ||
|
|
6a9d02ffa1 | ||
|
|
10cc5149f4 | ||
|
|
a0e6dad80b | ||
|
|
ad443c9a98 | ||
|
|
ce8a7b09e8 | ||
|
|
784f3bfe3b | ||
|
|
2177e6a493 | ||
|
|
f77eaf90b4 | ||
|
|
707e3d3d5d | ||
|
|
9696bc95ab | ||
|
|
602a9026ee | ||
|
|
f0d684ba1f | ||
|
|
648a842334 | ||
|
|
0f47f1e06e | ||
|
|
9241bdb253 | ||
|
|
1611164cc9 | ||
|
|
be1f6a32e2 | ||
|
|
37ae201856 | ||
|
|
f4e334843c | ||
|
|
56c79f656b | ||
|
|
313301cbe4 | ||
|
|
c1575b3151 | ||
|
|
9ecab9ea23 | ||
|
|
abe000b866 | ||
|
|
cfb11357e4 | ||
|
|
044ae7d8fa | ||
|
|
9ca8c4dec4 | ||
|
|
7d4fb4a7db | ||
|
|
fc69565281 | ||
|
|
aa1f047074 | ||
|
|
8b045d7672 | ||
|
|
17f7259d3e | ||
|
|
952640763b | ||
|
|
51cd160369 | ||
|
|
97c3d748dc | ||
|
|
f2339b2d48 | ||
|
|
76468ccef7 | ||
|
|
890b582bee | ||
|
|
5c5f284e5f | ||
|
|
3bf555699a | ||
|
|
63a0f4eaee | ||
|
|
2d2b3fff9c | ||
|
|
21e850f7cd | ||
|
|
5905e4f750 | ||
|
|
6d28ce4898 | ||
|
|
62b5c1ce11 | ||
|
|
0537710c51 | ||
|
|
841144ca10 | ||
|
|
ae5be6c810 | ||
|
|
71231efdec | ||
|
|
0f06b039a5 | ||
|
|
3cbbccc1a9 | ||
|
|
fb03aacbc7 | ||
|
|
6e57f4b5d2 | ||
|
|
f7f1b8b398 | ||
|
|
5407d4e40d | ||
|
|
639368f2cd |
11
.github/CONTRIBUTING.md
vendored
11
.github/CONTRIBUTING.md
vendored
@@ -17,10 +17,10 @@ Here you'll find some general guidelines for those who would like to start contr
|
|||||||
|
|
||||||
**Don't submit any of the following:**
|
**Don't submit any of the following:**
|
||||||
|
|
||||||
- **💰️ Paid / Trial Sites** - We don't accept any paid or free trial only entries, with the exception of select paid [VPNs](/privacy#vpn) and [Debrid](/downloading#leeches-debrid).
|
- **💰️ Paid / Trial Sites** - We don't accept any paid or free trial only entries, with the exception of select paid [VPNs](/privacy#vpn) and [Debrid](/downloading#debrid-leeches).
|
||||||
- **🕹️ Emulators** - Already listed on [Index Sites](/gaming#emulators).
|
- **🕹️ Emulators** - Already listed on [Index Sites](/gaming#emulators).
|
||||||
- **🌐 Web Browsers** - Good open-source browsers are already listed, so we just accept [indexes](/internet-tools#browser-tools), privacy-focused, and good mobile ones.
|
- **🌐 Web Browsers** - Good open-source browsers are already listed, so we just accept [indexes](/internet-tools#browser-tools), privacy-focused, and good mobile ones.
|
||||||
- **🔻 Leeches** - Unless it's not already listed on existing [Leech Lists](/downloading#leeches-debrid), don't submit these.
|
- **🔻 Leeches** - Unless it's not already listed on existing [Leech Lists](/downloading#debrid-leeches), don't submit these.
|
||||||
- **🐧 Linux Distros** - Already listed on [Index Sites](/linux-macos#linux-distros).
|
- **🐧 Linux Distros** - Already listed on [Index Sites](/linux-macos#linux-distros).
|
||||||
- **🌍 Non-english Software** - We don't add non-english software sites (APKs, games, torrents, etc.) unless they have a very good reputation.
|
- **🌍 Non-english Software** - We don't add non-english software sites (APKs, games, torrents, etc.) unless they have a very good reputation.
|
||||||
- **🗂️ Coding Libraries** - There's too many of them and there are better places to find them.
|
- **🗂️ Coding Libraries** - There's too many of them and there are better places to find them.
|
||||||
@@ -33,7 +33,8 @@ Here you'll find some general guidelines for those who would like to start contr
|
|||||||
For submitting new links, follow these steps:
|
For submitting new links, follow these steps:
|
||||||
|
|
||||||
- Make sure it's not already in the wiki. The easiest way to do this is to check our [Single Page](https://api.fmhy.net/single-page) using `ctrl+f`.
|
- Make sure it's not already in the wiki. The easiest way to do this is to check our [Single Page](https://api.fmhy.net/single-page) using `ctrl+f`.
|
||||||
- Reach out via the feedback system, [GitHub](https://github.com/fmhy/edit), or join our [Discord](https://github.com/fmhy/FMHY/wiki/FMHY-Discord).
|
- Don't spam a bunch of un-tested links at once. Try to only send things you genuinely feel might be worth adding.
|
||||||
|
- Reach out via the feedback system, [GitHub](https://github.com/fmhy/edit), or join our [Discord](https://github.com/fmhy/FMHY/wiki/FMHY-Discord). Note that we have to check sites ourselves, so using a issue, rather than pull request is easier.
|
||||||
- You can optionally include socials, tools, or any other additional info alongside the entry.
|
- You can optionally include socials, tools, or any other additional info alongside the entry.
|
||||||
|
|
||||||
### Reporting a Site
|
### Reporting a Site
|
||||||
@@ -71,7 +72,7 @@ Instructions on various ways to edit the wiki and preview changes.
|
|||||||
|
|
||||||
### GitHub Editor
|
### GitHub Editor
|
||||||
|
|
||||||
You can use the build-in web editor in two ways:
|
You can use the built-in web editor in two ways:
|
||||||
|
|
||||||
1. Find the file you want to edit, look for the edit icon (of a pencil) and click on it, then make your changes.
|
1. Find the file you want to edit, look for the edit icon (of a pencil) and click on it, then make your changes.
|
||||||
|
|
||||||
@@ -121,4 +122,4 @@ This creates an environment in the browser [(with 60h/month free quota)](https:/
|
|||||||
|
|
||||||
Making changes on a local repository may require a basic understanding of Git. You can find learning resources [here](/educational#developer-learning).
|
Making changes on a local repository may require a basic understanding of Git. You can find learning resources [here](/educational#developer-learning).
|
||||||
|
|
||||||
More info on manual setup can be found [here](/other/selfhosting).
|
More info on manual setup can be found [here](/other/selfhosting).
|
||||||
|
|||||||
6
.github/README.md
vendored
6
.github/README.md
vendored
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
- Website: [fmhy.net](https://fmhy.net)
|
- Website: [fmhy.net](https://fmhy.net)
|
||||||
- News & Monthly Updates: [fmhy.net/posts](https://fmhy.net/posts)
|
- News & Monthly Updates: [fmhy.net/posts](https://fmhy.net/posts)
|
||||||
- Backups: [github.com/fmhy/FMHY/wiki/Backups](https://github.com/fmhy/FMHY/wiki/Backups)
|
- Backups, Markdown, JSON API: [github.com/fmhy/FMHY/wiki/Backups](https://github.com/fmhy/FMHY/wiki/Backups)
|
||||||
- Neither the site nor GitHub host any files
|
- Neither the site nor GitHub host any files
|
||||||
|
|
||||||
## 🗺️ Emoji Legend
|
## 🗺️ Emoji Legend
|
||||||
@@ -32,5 +32,5 @@ Here are a few ways you can get involved:
|
|||||||
## 🔔 Follow
|
## 🔔 Follow
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<a href="https://github.com/fmhy/FMHY/wiki/FMHY-Discord"><img width="30px" src="./assets/discord.svg" alt="Discord"></a> <a href="https://github.com/fmhy"><img width="30px" src="./assets/github.svg" alt="GitHub"></a> <a href="https://bsky.app/profile/fmhy.net"><img width="30px" src="./assets/bluesky.svg" alt="Bluesky"></a>
|
<a href="https://github.com/fmhy/FMHY/wiki/FMHY-Discord"><img width="30px" src="./assets/discord.svg" alt="Discord"></a> <a href="https://github.com/fmhy"><img width="30px" src="./assets/github.svg" alt="GitHub"></a>
|
||||||
</p>
|
</p>
|
||||||
29
.github/assets/nginx.conf
vendored
Normal file
29
.github/assets/nginx.conf
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name _;
|
||||||
|
|
||||||
|
root /usr/share/nginx/html;
|
||||||
|
index index.html;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.html;
|
||||||
|
add_header X-Frame-Options "DENY";
|
||||||
|
add_header X-Content-Type-Options "nosniff";
|
||||||
|
add_header X-XSS-Protection "1; mode=block";
|
||||||
|
add_header Referrer-Policy "no-referrer-when-downgrade";
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~* \.(?:css|js|jpg|jpeg|gif|png|svg|ico|woff2?)$ {
|
||||||
|
expires 30d;
|
||||||
|
add_header Cache-Control "public";
|
||||||
|
}
|
||||||
|
|
||||||
|
error_log /var/log/nginx/error.log warn;
|
||||||
|
access_log /var/log/nginx/access.log;
|
||||||
|
}
|
||||||
|
|
||||||
|
gzip on;
|
||||||
|
gzip_types text/plain text/css application/javascript application/json image/svg+xml;
|
||||||
|
gzip_min_length 1000;
|
||||||
|
gzip_proxied any;
|
||||||
|
gzip_vary on;
|
||||||
@@ -4,6 +4,7 @@ import UnoCSS from 'unocss/vite'
|
|||||||
import AutoImport from 'unplugin-auto-import/vite'
|
import AutoImport from 'unplugin-auto-import/vite'
|
||||||
import OptimizeExclude from 'vite-plugin-optimize-exclude'
|
import OptimizeExclude from 'vite-plugin-optimize-exclude'
|
||||||
import Terminal from 'vite-plugin-terminal'
|
import Terminal from 'vite-plugin-terminal'
|
||||||
|
import { VitePWA } from 'vite-plugin-pwa'
|
||||||
import { defineConfig } from 'vitepress'
|
import { defineConfig } from 'vitepress'
|
||||||
import {
|
import {
|
||||||
commitRef,
|
commitRef,
|
||||||
@@ -19,6 +20,7 @@ import { defs, emojiRender, movePlugin } from './markdown/emoji'
|
|||||||
import { headersPlugin } from './markdown/headers'
|
import { headersPlugin } from './markdown/headers'
|
||||||
import { toggleStarredPlugin } from './markdown/toggleStarred'
|
import { toggleStarredPlugin } from './markdown/toggleStarred'
|
||||||
import { transformsPlugin } from './transformer'
|
import { transformsPlugin } from './transformer'
|
||||||
|
import { replaceNoteLink } from './utils/markdown'
|
||||||
|
|
||||||
// @unocss-include
|
// @unocss-include
|
||||||
|
|
||||||
@@ -43,11 +45,14 @@ export default defineConfig({
|
|||||||
['meta', { name: 'og:locale', content: 'en' }],
|
['meta', { name: 'og:locale', content: 'en' }],
|
||||||
['link', { rel: 'icon', href: '/test.png' }],
|
['link', { rel: 'icon', href: '/test.png' }],
|
||||||
// PWA
|
// PWA
|
||||||
['link', { rel: 'icon', href: '/test.png', type: 'image/svg+xml' }],
|
['link', { rel: 'manifest', href: '/manifest.json' }],
|
||||||
['link', { rel: 'alternate icon', href: '/test.png' }],
|
['link', { rel: 'icon', href: '/pwa_icon.png', type: 'image/svg+xml' }],
|
||||||
['link', { rel: 'mask-icon', href: '/test.png', color: '#7bc5e4' }],
|
['link', { rel: 'alternate icon', href: '/pwa_icon.png' }],
|
||||||
|
['link', { rel: 'mask-icon', href: '/pwa_icon.png', color: '#000000ff' }],
|
||||||
['meta', { name: 'keywords', content: meta.keywords.join(' ') }],
|
['meta', { name: 'keywords', content: meta.keywords.join(' ') }],
|
||||||
['link', { rel: 'apple-touch-icon', href: '/test.png', sizes: '192x192' }],
|
['link', { rel: 'apple-touch-icon', href: '/pwa_icon.png', sizes: '192x192' }],
|
||||||
|
['meta', { name: 'apple-mobile-web-app-capable', content: 'yes' }],
|
||||||
|
['meta', { name: 'apple-mobile-web-app-status-bar-style', content: 'default' }],
|
||||||
// Bing site verification
|
// Bing site verification
|
||||||
[
|
[
|
||||||
'meta',
|
'meta',
|
||||||
@@ -92,7 +97,13 @@ export default defineConfig({
|
|||||||
{
|
{
|
||||||
find: /^.*VPSwitchAppearance\.vue$/,
|
find: /^.*VPSwitchAppearance\.vue$/,
|
||||||
replacement: fileURLToPath(
|
replacement: fileURLToPath(
|
||||||
new URL('./theme/Appearance.vue', import.meta.url)
|
new URL('./theme/components/ThemeDropdown.vue', import.meta.url)
|
||||||
|
)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
find: /^.*VPLocalSearchBox\.vue$/,
|
||||||
|
replacement: fileURLToPath(
|
||||||
|
new URL('./theme/components/VPLocalSearchBox.vue', import.meta.url)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -116,6 +127,58 @@ export default defineConfig({
|
|||||||
filepath: './.cache/imports.json'
|
filepath: './.cache/imports.json'
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
VitePWA({
|
||||||
|
registerType: 'autoUpdate',
|
||||||
|
workbox: {
|
||||||
|
globPatterns: ['**/*.{js,css,html,ico,png,svg,woff2}'],
|
||||||
|
runtimeCaching: [
|
||||||
|
{
|
||||||
|
urlPattern: /^https:\/\/fonts\.googleapis\.com\/.*/i,
|
||||||
|
handler: 'CacheFirst',
|
||||||
|
options: {
|
||||||
|
cacheName: 'google-fonts-cache',
|
||||||
|
expiration: {
|
||||||
|
maxEntries: 10,
|
||||||
|
maxAgeSeconds: 60 * 60 * 24 * 365 // 365 days
|
||||||
|
},
|
||||||
|
cacheableResponse: {
|
||||||
|
statuses: [0, 200]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
manifest: {
|
||||||
|
name: 'FMHY - freemediaheckyeah',
|
||||||
|
short_name: 'FMHY',
|
||||||
|
description: 'The largest collection of free stuff on the internet!',
|
||||||
|
theme_color: '#000000ff',
|
||||||
|
background_color: '#000000ff',
|
||||||
|
display: 'standalone',
|
||||||
|
orientation: 'portrait',
|
||||||
|
scope: '/',
|
||||||
|
start_url: '/',
|
||||||
|
icons: [
|
||||||
|
{
|
||||||
|
src: '/fmhy.ico',
|
||||||
|
sizes: '16x16',
|
||||||
|
type: 'image/x-icon'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src: '/pwa_icon.png',
|
||||||
|
sizes: '192x192',
|
||||||
|
type: 'image/png',
|
||||||
|
purpose: 'any maskable'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src: '/pwa_icon.png',
|
||||||
|
sizes: '512x512',
|
||||||
|
type: 'image/png',
|
||||||
|
purpose: 'any maskable'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}),
|
||||||
transformsPlugin(),
|
transformsPlugin(),
|
||||||
{
|
{
|
||||||
name: 'custom:adjust-order',
|
name: 'custom:adjust-order',
|
||||||
@@ -146,6 +209,7 @@ export default defineConfig({
|
|||||||
md.use(emojiRender)
|
md.use(emojiRender)
|
||||||
md.use(toggleStarredPlugin)
|
md.use(toggleStarredPlugin)
|
||||||
meta.build.api && md.use(headersPlugin)
|
meta.build.api && md.use(headersPlugin)
|
||||||
|
replaceNoteLink(md)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
themeConfig: {
|
themeConfig: {
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ export const search: DefaultTheme.Config['search'] = {
|
|||||||
},
|
},
|
||||||
searchOptions: {
|
searchOptions: {
|
||||||
combineWith: 'AND',
|
combineWith: 'AND',
|
||||||
fuzzy: true,
|
fuzzy: false,
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
boostDocument: (documentId, term, storedFields: Record) => {
|
boostDocument: (documentId, term, storedFields: Record) => {
|
||||||
const titles = (storedFields?.titles as string[])
|
const titles = (storedFields?.titles as string[])
|
||||||
@@ -154,37 +154,30 @@ export const socialLinks: DefaultTheme.SocialLink[] = [
|
|||||||
{
|
{
|
||||||
icon: 'reddit',
|
icon: 'reddit',
|
||||||
link: 'https://reddit.com/r/FREEMEDIAHECKYEAH'
|
link: 'https://reddit.com/r/FREEMEDIAHECKYEAH'
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: 'bluesky',
|
|
||||||
link: 'https://bsky.app/profile/fmhy.net'
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
export const nav: DefaultTheme.NavItem[] = [
|
export const nav: DefaultTheme.NavItem[] = [
|
||||||
|
{ text: '📑 Changelog', link: '/posts/changelog-sites' },
|
||||||
{ text: '📖 Glossary', link: 'https://rentry.org/The-Piracy-Glossary' },
|
{ text: '📖 Glossary', link: 'https://rentry.org/The-Piracy-Glossary' },
|
||||||
{
|
{
|
||||||
text: '💾 Backups',
|
text: '💾 Backups',
|
||||||
link: 'https://github.com/fmhy/FMHY/wiki/Backups'
|
link: '/other/backups'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: '🌱 Ecosystem',
|
text: '🌱 Ecosystem',
|
||||||
items: [
|
items: [
|
||||||
{ text: '🌐 Search', link: '/posts/search' },
|
{ text: '🌐 Search', link: '/posts/search' },
|
||||||
|
{ text: '❓ FAQs', link: '/other/FAQ' },
|
||||||
{ text: '🔖 Bookmarks', link: 'https://github.com/fmhy/bookmarks' },
|
{ text: '🔖 Bookmarks', link: 'https://github.com/fmhy/bookmarks' },
|
||||||
{ text: '✅ SafeGuard', link: 'https://github.com/fmhy/FMHY-SafeGuard' },
|
{ text: '✅ SafeGuard', link: 'https://github.com/fmhy/FMHY-SafeGuard' },
|
||||||
{ text: '🚀 Startpage', link: 'https://fmhy.net/startpage' },
|
{ text: '🚀 Startpage', link: 'https://fmhy.net/startpage' },
|
||||||
{ text: '📋 snowbin', link: 'https://pastes.fmhy.net' },
|
{ text: '📋 snowbin', link: 'https://pastes.fmhy.net' },
|
||||||
{
|
|
||||||
text: '®️ Redlib',
|
|
||||||
link: 'https://redlib.fmhy.net/r/FREEMEDIAHECKYEAH/wiki/index'
|
|
||||||
},
|
|
||||||
{ text: '🔎 SearXNG', link: 'https://searx.fmhy.net/' },
|
{ text: '🔎 SearXNG', link: 'https://searx.fmhy.net/' },
|
||||||
{
|
{
|
||||||
text: '💡 Site Hunting',
|
text: '💡 Site Hunting',
|
||||||
link: 'https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/find-new-sites/'
|
link: 'https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/find-new-sites/'
|
||||||
},
|
},
|
||||||
{ text: '❓ FAQs', link: 'https://redd.it/xrxen7' },
|
|
||||||
{
|
{
|
||||||
text: '😇 SFW FMHY',
|
text: '😇 SFW FMHY',
|
||||||
link: 'https://rentry.org/piracy'
|
link: 'https://rentry.org/piracy'
|
||||||
|
|||||||
@@ -17,23 +17,27 @@
|
|||||||
import type { MarkdownRenderer } from 'vitepress'
|
import type { MarkdownRenderer } from 'vitepress'
|
||||||
|
|
||||||
const excluded = ['Beginners Guide']
|
const excluded = ['Beginners Guide']
|
||||||
|
const starredMarkers = [':star:', ':glowing-star:', '⭐', '🌟']
|
||||||
|
const indexMarkers = ['🌐', ':globe_with_meridians:', ':globe-with-meridians:']
|
||||||
|
|
||||||
export function toggleStarredPlugin(md: MarkdownRenderer) {
|
export function toggleStarredPlugin(md: MarkdownRenderer) {
|
||||||
md.renderer.rules.list_item_open = (tokens, index, options, env, self) => {
|
md.renderer.rules.list_item_open = (tokens, index, options, env, self) => {
|
||||||
const contentToken = tokens[index + 2]
|
const contentToken = tokens[index + 2]
|
||||||
|
|
||||||
// Ensure the token exists
|
if (!contentToken) return self.renderToken(tokens, index, options)
|
||||||
if (contentToken) {
|
|
||||||
const content = contentToken.content
|
|
||||||
|
|
||||||
if (
|
const content = contentToken.content
|
||||||
!excluded.includes(env.frontmatter.title) &&
|
const isStarred =
|
||||||
(content.includes(':star:') || content.includes(':glowing-star:'))
|
!excluded.includes(env.frontmatter.title) &&
|
||||||
) {
|
starredMarkers.some((marker) => content.includes(marker))
|
||||||
return `<li class="starred">`
|
const isIndex = indexMarkers.some((marker) => content.includes(marker))
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return self.renderToken(tokens, index, options)
|
if (!isStarred && !isIndex) return self.renderToken(tokens, index, options)
|
||||||
|
|
||||||
|
const classes = []
|
||||||
|
if (isStarred) classes.push('starred')
|
||||||
|
if (isIndex) classes.push('index')
|
||||||
|
|
||||||
|
return `<li class="${classes.join(' ')}">`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
7
docs/.vitepress/notes/advanced-logic-calculators.md
Normal file
7
docs/.vitepress/notes/advanced-logic-calculators.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#### Advanced Logic Calculators
|
||||||
|
|
||||||
|
* analytic tableaux generator: https://www.umsu.de/trees/
|
||||||
|
* natural deduction proof checker: https://proofs.openlogicproject.org/
|
||||||
|
* propositional logic calculator (finds models): https://www.inf.unibz.it/~franconi/teaching/propcalc/
|
||||||
|
* a tutorial on sequent calculus: http://logitext.mit.edu/tutorial
|
||||||
|
* modal logic playground (for constructing models): https://rkirsling.github.io/modallogic/
|
||||||
4
docs/.vitepress/notes/alt-twitch-player-extensions.md
Normal file
4
docs/.vitepress/notes/alt-twitch-player-extensions.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#### Alt Twitch Player Extensions
|
||||||
|
|
||||||
|
* https://addons.mozilla.org/en-US/firefox/addon/twitch_5/
|
||||||
|
* https://chrome.google.com/webstore/detail/alternate-player-for-twit/bhplkbgoehhhddaoolmakpocnenplmhf
|
||||||
6
docs/.vitepress/notes/alt-warp-clients.md
Normal file
6
docs/.vitepress/notes/alt-warp-clients.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#### Alt Warp Clients
|
||||||
|
|
||||||
|
If you can't connect, try Scanner Settings -> Endpoint -> Suggested -> Try different IP's to find one that works
|
||||||
|
|
||||||
|
* https://github.com/bepass-org/oblivion-desktop
|
||||||
|
* https://github.com/bepass-org/oblivion
|
||||||
3
docs/.vitepress/notes/android-spotify-note.md
Normal file
3
docs/.vitepress/notes/android-spotify-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Android Spotify Note
|
||||||
|
|
||||||
|
Many modded apks are buggy as of now and may not work at all.
|
||||||
5
docs/.vitepress/notes/apkmirror-extensions.md
Normal file
5
docs/.vitepress/notes/apkmirror-extensions.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#### APKMirror Extensions
|
||||||
|
|
||||||
|
* https://addons.mozilla.org/en-US/firefox/addon/toolbox-google-play-store/
|
||||||
|
* https://chrome.google.com/webstore/detail/toolbox-for-google-play-s/fepaalfjfchbdianlgginbmpeeacahoo
|
||||||
|
* https://addons.opera.com/en/extensions/details/toolbox-for-google-play-storetm/
|
||||||
3
docs/.vitepress/notes/app-lock.md
Normal file
3
docs/.vitepress/notes/app-lock.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### App Lock
|
||||||
|
|
||||||
|
Keep in mind this is a privacy utility meant to prevent common snooping, its not claiming to be a security tool, and will not stop forensic analysis.
|
||||||
3
docs/.vitepress/notes/audiobookbay-warning.md
Normal file
3
docs/.vitepress/notes/audiobookbay-warning.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Audiobookbay Warning
|
||||||
|
|
||||||
|
Avoid Fake download links, use [Torrents / Magnets](https://i.ibb.co/8sV2061/0fa8159b11bb.png), or paste info hash into torrent client
|
||||||
3
docs/.vitepress/notes/aurora-note.md
Normal file
3
docs/.vitepress/notes/aurora-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Aurora Note
|
||||||
|
|
||||||
|
Keep in mind that some apps that exist do not work unless you installed them from the google play store. This is usually true for things like banking apps, or some institutions app.
|
||||||
3
docs/.vitepress/notes/better-reasoning.md
Normal file
3
docs/.vitepress/notes/better-reasoning.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Better Reasoning
|
||||||
|
|
||||||
|
For better reasoning, switch mode to "think deeper"
|
||||||
3
docs/.vitepress/notes/bookmarkeddit.md
Normal file
3
docs/.vitepress/notes/bookmarkeddit.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Bookmarkeddit
|
||||||
|
|
||||||
|
This also extends the amount of saved posts you can view (reddit caps at 1000 by default)
|
||||||
7
docs/.vitepress/notes/buster-note.md
Normal file
7
docs/.vitepress/notes/buster-note.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#### Buster Note
|
||||||
|
|
||||||
|
The client app simulates user interactions which greatly improves the success rate of buster. You can download the app through the extensions option page, or get it from the link below:
|
||||||
|
|
||||||
|
https://github.com/dessant/buster-client
|
||||||
|
|
||||||
|
The app is available for Windows, Linux, and macOS
|
||||||
3
docs/.vitepress/notes/buzzheavier-warning.md
Normal file
3
docs/.vitepress/notes/buzzheavier-warning.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Buzzheavier Warning
|
||||||
|
|
||||||
|
Make sure you have an [adblocker](https://fmhy.net/adblockvpnguide#adblocking) when using Buzzheavier as there are hidden ads on download pages with malicious content. Both the download button and torrent buttons should automatically start a download in your browser, NOT redirect you to another page.
|
||||||
3
docs/.vitepress/notes/bypass-freedlink.md
Normal file
3
docs/.vitepress/notes/bypass-freedlink.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Bypass FREEdlink
|
||||||
|
|
||||||
|
You still need to bypass Cloudflare captcha by yourself. This only bypasses timer on single downloads. You may still need to wait normal time to download another file which is enforced from server-side.
|
||||||
3
docs/.vitepress/notes/captcha-4pda.md
Normal file
3
docs/.vitepress/notes/captcha-4pda.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Captcha 4PDA
|
||||||
|
|
||||||
|
Use Google Gemini to translate the captcha
|
||||||
5
docs/.vitepress/notes/chatgpt-limits.md
Normal file
5
docs/.vitepress/notes/chatgpt-limits.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#### ChatGPT Limits
|
||||||
|
|
||||||
|
* GPT-5.1-medium (1 Daily)
|
||||||
|
* GPT-5.1-chat (10 per 5 hours)
|
||||||
|
* GPT-5.1- mini (Unlimited)
|
||||||
4
docs/.vitepress/notes/clipboard2file-addons.md
Normal file
4
docs/.vitepress/notes/clipboard2file-addons.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#### Clipboard2File Addons
|
||||||
|
|
||||||
|
* https://github.com/vord1080/clipboard2file/
|
||||||
|
* https://github.com/daijro/Clipboard2File-Chrome
|
||||||
3
docs/.vitepress/notes/cofi-note.md
Normal file
3
docs/.vitepress/notes/cofi-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Cofi Note
|
||||||
|
|
||||||
|
Useful if you're a coffee enthusiast. The methods are created by James Hoffmann, he's a world champion barista and popular YouTuber
|
||||||
3
docs/.vitepress/notes/crystaldiskinfo.md
Normal file
3
docs/.vitepress/notes/crystaldiskinfo.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### CrystalDiskInfo
|
||||||
|
|
||||||
|
Avoid versions labeled "Ads".
|
||||||
5
docs/.vitepress/notes/csrin-search.md
Normal file
5
docs/.vitepress/notes/csrin-search.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#### CS.RIN Search
|
||||||
|
|
||||||
|
If your initial search doesn't work, trying searching the same term again within the "search these results" engine on the results screen.
|
||||||
|
|
||||||
|
<img width="1307" height="97" alt="image" src="https://github.com/user-attachments/assets/b2f149b9-8a9a-4250-8754-e63f50b82c59" />
|
||||||
3
docs/.vitepress/notes/dodi-warning.md
Normal file
3
docs/.vitepress/notes/dodi-warning.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### DODI Warning
|
||||||
|
|
||||||
|
Its highly recommended to stick to dodi's 1337x page or main website, as sites they linked to have fake DDL buttons, and shouldn't be used without an adblocker
|
||||||
3
docs/.vitepress/notes/dolby-access-atmos-note.md
Normal file
3
docs/.vitepress/notes/dolby-access-atmos-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Dolby Access / Atmos Note
|
||||||
|
|
||||||
|
Many headsets come with Dolby Access for free without letting users know. You can check if you're licensed by opening Dolby Access, going to settings, and looking in the [bottom right corner](https://i.imgur.com/9vJA6CL.png). Its much better than things like iCue or similar apps.
|
||||||
3
docs/.vitepress/notes/driver-note.md
Normal file
3
docs/.vitepress/notes/driver-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Driver Note
|
||||||
|
|
||||||
|
Only install the drivers you actually need. Don't install all new drivers at once, as this could lead to things breaking, especially system audio.
|
||||||
3
docs/.vitepress/notes/eaglercraft-note.md
Normal file
3
docs/.vitepress/notes/eaglercraft-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Eaglercraft Note
|
||||||
|
|
||||||
|
Play on Chromium-based browsers for the best performance
|
||||||
5
docs/.vitepress/notes/eruda.md
Normal file
5
docs/.vitepress/notes/eruda.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#### Eruda
|
||||||
|
|
||||||
|
Eruda Console for mobile browsers bookmarklet:
|
||||||
|
|
||||||
|
`javascript:(function () { var script = document.createElement('script'); script.src="//cdn.jsdelivr.net/npm/eruda"; document.body.appendChild(script); script.onload = function () { eruda.init() } })();`
|
||||||
3
docs/.vitepress/notes/filebin-warning.md
Normal file
3
docs/.vitepress/notes/filebin-warning.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Filebin Warning
|
||||||
|
|
||||||
|
Anyone with a link to a "bin" has full access to it. They can add new files, delete existing files, etc
|
||||||
3
docs/.vitepress/notes/filelu-warning.md
Normal file
3
docs/.vitepress/notes/filelu-warning.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Filelu Warning
|
||||||
|
|
||||||
|
According to their FAQ question "When will my files expire?", you must login to your account at least once every 180 days to prevent your account being deleted.
|
||||||
4
docs/.vitepress/notes/filezilla.md
Normal file
4
docs/.vitepress/notes/filezilla.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#### FileZilla
|
||||||
|
|
||||||
|
Keep in mind the link on their frontpage is sponsored and has adware, but you can get to the non-adware version by following the link on fmhy,
|
||||||
|
or pressing download on the FileZilla website, and then clicking "additional downloads" under the big download button.
|
||||||
3
docs/.vitepress/notes/flicker-proxy.md
Normal file
3
docs/.vitepress/notes/flicker-proxy.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Flicker Proxy
|
||||||
|
|
||||||
|
Note that the proxy may be slower, but it can be used in cases where the site or TMDb is blocked.
|
||||||
3
docs/.vitepress/notes/fluxy-repacks.md
Normal file
3
docs/.vitepress/notes/fluxy-repacks.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Fluxy Repacks
|
||||||
|
|
||||||
|
Note that though it has repacks in the name, its not actually a repack site.
|
||||||
4
docs/.vitepress/notes/forest-extensions.md
Normal file
4
docs/.vitepress/notes/forest-extensions.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#### Forest Extensions
|
||||||
|
|
||||||
|
* https://addons.mozilla.org/en-US/firefox/addon/forest-stay-focused-be-present/
|
||||||
|
* https://chrome.google.com/webstore/detail/forest-stay-focused-be-pr/kjacjjdnoddnpbbcjilcajfhhbdhkpgk
|
||||||
3
docs/.vitepress/notes/foxit-warning.md
Normal file
3
docs/.vitepress/notes/foxit-warning.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Foxit Warning
|
||||||
|
|
||||||
|
The installer tries to install McAfee WebAdvisor + PhantomPDF Business. They can be skipped by clicking "decline" both times.
|
||||||
7
docs/.vitepress/notes/freegogpcgames-note.md
Normal file
7
docs/.vitepress/notes/freegogpcgames-note.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#### FreeGOGPCGames Note
|
||||||
|
|
||||||
|
Many titles on the site are the older versions of the installers. The digital signature on the installer is signed by GOG Limited, which is the old company name before it was merged with GOG Sp. z o.o and all digital file signatures were updated to reflect this name change.
|
||||||
|
|
||||||
|
The hash does not match the gog-games database because the digital file signatures differ on the installer. Installing either version will produce identical sets of files since the game version remains unchanged.
|
||||||
|
|
||||||
|
/u/AtariRiot66
|
||||||
3
docs/.vitepress/notes/general-tweak-warning.md
Normal file
3
docs/.vitepress/notes/general-tweak-warning.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### General Tweak Warning
|
||||||
|
|
||||||
|
Its not recommended to use these unless you know what you're doing. Always research first, never just "Apply All" tweaks randomly.
|
||||||
9
docs/.vitepress/notes/glitchwave-note.md
Normal file
9
docs/.vitepress/notes/glitchwave-note.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
#### Glitchwave Note
|
||||||
|
|
||||||
|
For charts you can specify months and days using URLs like the following examples
|
||||||
|
|
||||||
|
January 2006:
|
||||||
|
`https://glitchwave.com/charts/popular/game/2006.01/excl:ratings/`
|
||||||
|
|
||||||
|
Jan-Feb 2018:
|
||||||
|
`https://glitchwave.com/charts/popular/game/2018.01-2018.02/excl:ratings/`
|
||||||
3
docs/.vitepress/notes/google-song-identification.md
Normal file
3
docs/.vitepress/notes/google-song-identification.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Google Song Identification
|
||||||
|
|
||||||
|
Google and YouTube Music mobile apps have song identification button next to the search box.
|
||||||
3
docs/.vitepress/notes/google-translate-note.md
Normal file
3
docs/.vitepress/notes/google-translate-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Google Translate Note
|
||||||
|
|
||||||
|
Google translate can serve as a web proxy. Simply paste your URL into the translate field and then click on the result and view the page in the original language. This way you can navigate any web-page via google.com. Google is almost never blocked so this trick works on most occasions.
|
||||||
3
docs/.vitepress/notes/hdo-box-note.md
Normal file
3
docs/.vitepress/notes/hdo-box-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### HDO Box Note
|
||||||
|
|
||||||
|
To use the app, HDO Box may ask you to install a third-party video player which contains ads. Check out the DNS Adblocking section on FMHY for adblocking solutions.
|
||||||
3
docs/.vitepress/notes/hugging-face-warning.md
Normal file
3
docs/.vitepress/notes/hugging-face-warning.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Hugging Face Warning
|
||||||
|
|
||||||
|
HuggingFace uses a system called ZeroGPU to manage access to their high-end GPUs. To make sure that their GPUs don't get fully used up, there are limits on how long you can use the GPU on Spaces like this one that utilize ZeroGPU. The rate limit is 120 seconds daily for non-logged in users. You can get around the 120 second limit by changing your IP address, which can be done by using a proxy or VPN while logged out. If you sign up for a free HuggingFace account, you get a much higher 300 second rate limit, but changing your IP won't reset the limit
|
||||||
3
docs/.vitepress/notes/instaeclipse-note.md
Normal file
3
docs/.vitepress/notes/instaeclipse-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Instaeclipse Note
|
||||||
|
|
||||||
|
Use ['advanced'](https://wispydocs.pages.dev/revanced-obtainium/#advanced) to build clean apks, or use antisplitm with revanced manager.
|
||||||
5
docs/.vitepress/notes/irc-highway-note.md
Normal file
5
docs/.vitepress/notes/irc-highway-note.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#### IRC Highway Note
|
||||||
|
|
||||||
|
To request a book run: @request [author] [title] - Requests without both [author] and [title] are deleted.
|
||||||
|
|
||||||
|
To view request status and rules run: @request-list
|
||||||
3
docs/.vitepress/notes/jdownloader.md
Normal file
3
docs/.vitepress/notes/jdownloader.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Jdownloader
|
||||||
|
|
||||||
|
Keep in mind the link on their frontpage is sponsored and has adware, but jdownloader2 which is linked on fmhy, does not contain any adware.
|
||||||
4
docs/.vitepress/notes/limit-bypass-note.md
Normal file
4
docs/.vitepress/notes/limit-bypass-note.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#### Limit Bypass Note
|
||||||
|
|
||||||
|
- sparsebox: ios 17.0 - 18.1 beta 4 (not including 17.7.1, 17.7.2)
|
||||||
|
- live container: ios 16+
|
||||||
3
docs/.vitepress/notes/liteapk-modyolo-note.md
Normal file
3
docs/.vitepress/notes/liteapk-modyolo-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### LiteAPK + Modyolo Note
|
||||||
|
|
||||||
|
The site is safe, but they are known for mislabeling things like RockMods releases as their own, and mislabeling versions to make it look like they have newer things than they really do.
|
||||||
3
docs/.vitepress/notes/malware-removal-forums.md
Normal file
3
docs/.vitepress/notes/malware-removal-forums.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Malware Removal Forums
|
||||||
|
|
||||||
|
Note that many of these will suggest removing pirated software, but if you got everything from trusted sources, there is no real need to do that.
|
||||||
3
docs/.vitepress/notes/megabasterd-note.md
Normal file
3
docs/.vitepress/notes/megabasterd-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Megabasterd Note
|
||||||
|
|
||||||
|
Free proxies work but they are very hit and miss
|
||||||
13
docs/.vitepress/notes/mobilism-ranks.md
Normal file
13
docs/.vitepress/notes/mobilism-ranks.md
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#### Mobilism Ranks
|
||||||
|
|
||||||
|
The users in red. Administrators are members assigned with the highest level of control over the entire board. Usually they’re Section Heads. Most Administrators are Section Heads but not all Section Heads are administrators.
|
||||||
|
|
||||||
|
The users in green. They moderate! Moderators are members of our staff who make everyone follows the site’s rules.
|
||||||
|
|
||||||
|
The users in light green. They’re similar to moderators but do not have the same authority. Oftentimes helpers eventually become moderators.
|
||||||
|
|
||||||
|
The people in orange. Mobilism has an Android Review Section and a Book Review Section. Users who are part of their review teams are the Reviewers.
|
||||||
|
|
||||||
|
The guys in purple. Different sections have different requirements for becoming a Major Releaser but generally it comes with making significant contributions to the release sections.
|
||||||
|
|
||||||
|
The users in blue. VIPs are either members who were rewarded with VIP status for their contributions, or donated to support Mobilism. VIPs have access to VIP sections: VIP Releases, VIP Requests, VIP Talk, receive extra WRZ$ and do not see any ads.
|
||||||
3
docs/.vitepress/notes/mori-note.md
Normal file
3
docs/.vitepress/notes/mori-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Māori Note
|
||||||
|
|
||||||
|
Māori is the indigenous language of mainland New Zealand. Due to the [Native Schools Act](https://en.wikipedia.org/wiki/M%C4%81ori_language#Suppression_and_decline) in 1867, children were forbidden to speak it in the classroom, under penalty of corporal punishment, which led to a rapid decline of speakers. There are now [revitalization efforts](https://en.wikipedia.org/wiki/M%C4%81ori_language_revival) (such as Tōku Reo) attempting to promote and reinforce its use.
|
||||||
11
docs/.vitepress/notes/movie-web.md
Normal file
11
docs/.vitepress/notes/movie-web.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
#### movie-web
|
||||||
|
|
||||||
|
You can [enable an extension](https://pstream.org/onboarding/extension) / [2](https://github.com/sussy-code/browser-ext/releases/) that will add more sources, but it needs to connect to all sites to function. The extension is safe, and many people use it, the permissions are just needed in order for the [extension to work correctly](https://rentry.co/htagcrv4).
|
||||||
|
|
||||||
|
Note that it can be ran in a new browser or fresh browser profile if you don't want to use your main browser.
|
||||||
|
|
||||||
|
For a setup guide (including 4k) you can watch this video:
|
||||||
|
https://vimeo.com/1059834885/c3ab398d42
|
||||||
|
|
||||||
|
Docs + selfhosting guides can be found here:
|
||||||
|
https://docs.pstream.mov/
|
||||||
5
docs/.vitepress/notes/movieparadise-code.md
Normal file
5
docs/.vitepress/notes/movieparadise-code.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#### MovieParadise Code
|
||||||
|
|
||||||
|
* In order to unlock the better host (1fichier) you need to signup code. This is important as without it the site will be rapidgator only links which are very slow. You can get a code from the link below, or the pins in our #free-stuff discord channel.
|
||||||
|
|
||||||
|
**[Click Here To Get Code](https://rentry.org/he8fhzku)**
|
||||||
3
docs/.vitepress/notes/mvsep-note.md
Normal file
3
docs/.vitepress/notes/mvsep-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### MVSEP Note
|
||||||
|
|
||||||
|
Register for wav and flac output, and lower queue times
|
||||||
10
docs/.vitepress/notes/oneclick-note.md
Normal file
10
docs/.vitepress/notes/oneclick-note.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
#### OneClick Note
|
||||||
|
|
||||||
|
Main features include:
|
||||||
|
- Download links straight to Google Drive.
|
||||||
|
- Torrent to Google Drive.
|
||||||
|
- Google Drive Download Manager (similar to pyLoad).
|
||||||
|
- Spotify Downloader.
|
||||||
|
- Jellyfin Support.
|
||||||
|
- RClone + WebUI.
|
||||||
|
- And much more.
|
||||||
3
docs/.vitepress/notes/openasar.md
Normal file
3
docs/.vitepress/notes/openasar.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Openasar
|
||||||
|
|
||||||
|
The Vencord installer has an option to install OpenAsar, but you may need to click the install button twice (only once more after clicking "Accept").
|
||||||
14
docs/.vitepress/notes/openrgb-beta.md
Normal file
14
docs/.vitepress/notes/openrgb-beta.md
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
#### OpenRGB Beta
|
||||||
|
|
||||||
|
How to download OpenRGB beta.
|
||||||
|
|
||||||
|
Why?
|
||||||
|
Because the latest version that you can download from the website dates from July 9 2023, and since a new device is added to the software almost every day, using the beta version becomes a necessity.
|
||||||
|
|
||||||
|
Go to Gitlab OpenRgb site `https://gitlab.com/CalcProgrammer1/OpenRGB` and on the left go to Build => Pipelines and then download the appropriate version from the download button on the top right.
|
||||||
|
(Note: Before downloading it should say Passed at the top left.)
|
||||||
|
|
||||||
|
Supported devices (0.9) => `https://openrgb.org/devices_0.9.html`
|
||||||
|
(The link may become outdated after a while, go to the OpenRGB site `https://openrgb.org/index.html` and find the newer one in the menu on the top right.)
|
||||||
|
|
||||||
|
Supported devices (Latest experimental) => `https://openrgb.org/devices.html`
|
||||||
20
docs/.vitepress/notes/pollinations-limits.md
Normal file
20
docs/.vitepress/notes/pollinations-limits.md
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
#### Pollinations Limits
|
||||||
|
|
||||||
|
For `chat.pollinations.ai` (and the underlying API), the rate limits depend on how you're using it:
|
||||||
|
|
||||||
|
**Anonymous / Free Tier (No Login)**
|
||||||
|
- **Text/Chat**: ~1 request every **3 seconds** (per IP).
|
||||||
|
- **Images**: ~1 request every **5 seconds** (per IP).
|
||||||
|
|
||||||
|
**Logged In (Pollen System)**
|
||||||
|
- Users get a **daily free Pollen allowance** based on their tier.
|
||||||
|
- **Publishable Keys (`pk_`)**: Rate limited to prevent abuse (e.g., ~1 pollen/hour per IP).
|
||||||
|
- **Secret Keys (`sk_`)**: **No rate limits** (requests run as fast as you can pay for them with Pollen).
|
||||||
|
|
||||||
|
If you're hitting limits on the chat site:
|
||||||
|
1. Slow down slightly (wait 3-5s between messages).
|
||||||
|
2. **Log in** at [enter.pollinations.ai](https://enter.pollinations.ai) to use your daily free credits.
|
||||||
|
3. If you need massive throughput, use an API key (`sk_`) with purchased credits.
|
||||||
|
|
||||||
|
To use this site for image generation, scroll down to "Image Feed" and change it to "Try" from "Watch". Available models are flux (schnell), turbo (SDXL Turbo), and gptimage. For gptimage, allowed resolutions are 1024x1024, 1536x1024 (landscape), and 1024x1536 (portrait). Change the seed to a random number for different output. The "Write the 'Imagine' word only" button is the submit button. Pretty sure its unlimited for all models, at least through UI.
|
||||||
|
|
||||||
4
docs/.vitepress/notes/printeditwe-addons.md
Normal file
4
docs/.vitepress/notes/printeditwe-addons.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#### PrintEditWe Addons
|
||||||
|
|
||||||
|
* https://addons.mozilla.org/en-US/firefox/addon/print-edit-we/
|
||||||
|
* https://chrome.google.com/webstore/detail/print-edit-we/olnblpmehglpcallpnbgmikjblmkopia
|
||||||
5
docs/.vitepress/notes/proton-torrenting.md
Normal file
5
docs/.vitepress/notes/proton-torrenting.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#### Proton Torrenting
|
||||||
|
|
||||||
|
Torrenting on Proton VPN's free plan is only possible when using an OpenVPN configuration / [Guide](https://protonvpn.com/support/vpn-config-download). Note that they do expire, so you'll have to make new ones occasionally.
|
||||||
|
|
||||||
|
OpenVPN login credentials are located [here](https://account.protonvpn.com/account-password).
|
||||||
8
docs/.vitepress/notes/ranks-1337x.md
Normal file
8
docs/.vitepress/notes/ranks-1337x.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#### Ranks 1337x
|
||||||
|
|
||||||
|
* ⬛ Black - Admin
|
||||||
|
* 🟩 Green - Moderator
|
||||||
|
* 🟦 Blue - VIP (Very Trusted)
|
||||||
|
* 🟨 Yellow - Uploader (Trusted)
|
||||||
|
* 🟥 Red - Trial Uploader
|
||||||
|
* ⬜ Grey - User
|
||||||
3
docs/.vitepress/notes/reaper-note.md
Normal file
3
docs/.vitepress/notes/reaper-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Reaper Note
|
||||||
|
|
||||||
|
Asks user to buy after 60 days, but you can just close the popup and keep using for free
|
||||||
3
docs/.vitepress/notes/redditfilter-note.md
Normal file
3
docs/.vitepress/notes/redditfilter-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### RedditFilter Note
|
||||||
|
|
||||||
|
Go to Settings → Feed Filter and untoggle 'Promoted' to not see ads. Those that don't like AI suggestions can untoggle 'Recommended' as well.
|
||||||
3
docs/.vitepress/notes/rgshows-autoplay.md
Normal file
3
docs/.vitepress/notes/rgshows-autoplay.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### RGShows Autoplay
|
||||||
|
|
||||||
|
If you're using Firefox and you want autoplay, hit the permissions on your url search bar and allow both audio + video.
|
||||||
3
docs/.vitepress/notes/sanet-warning.md
Normal file
3
docs/.vitepress/notes/sanet-warning.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Sanet Warning
|
||||||
|
|
||||||
|
Note that Sanet has been known to host things like KMS Matrix, so its best to avoid it for software and games
|
||||||
4
docs/.vitepress/notes/savepagewe.md
Normal file
4
docs/.vitepress/notes/savepagewe.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#### SavePageWe
|
||||||
|
|
||||||
|
* https://addons.mozilla.org/en-US/firefox/addon/save-page-we/
|
||||||
|
* https://chrome.google.com/webstore/detail/save-page-we/dhhpefjklgkmgeafimnjhojgjamoafof
|
||||||
5
docs/.vitepress/notes/scrollanywhere-addons.md
Normal file
5
docs/.vitepress/notes/scrollanywhere-addons.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#### ScrollAnywhere Addons
|
||||||
|
|
||||||
|
* https://addons.mozilla.org/en-US/firefox/addon/scroll_anywhere/
|
||||||
|
* https://chrome.google.com/webstore/detail/scrollanywhere/jehmdpemhgfgjblpkilmeoafmkhbckhi
|
||||||
|
* https://addons.opera.com/en/extensions/details/scrollanywhere/?display=en
|
||||||
3
docs/.vitepress/notes/sd-maid.md
Normal file
3
docs/.vitepress/notes/sd-maid.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### SD Maid
|
||||||
|
|
||||||
|
Google play version is paid. Press donate to unlock the app on F-Droid and GitHub versions.
|
||||||
3
docs/.vitepress/notes/sh-note.md
Normal file
3
docs/.vitepress/notes/sh-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### SH Note
|
||||||
|
|
||||||
|
Based on popular [card game](https://en.wikipedia.org/wiki/Secret_Hitler), created by cards against humanity co-founder.
|
||||||
3
docs/.vitepress/notes/site-favicon-dl.md
Normal file
3
docs/.vitepress/notes/site-favicon-dl.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Site Favicon DL
|
||||||
|
|
||||||
|
You can also do `https://www.google.com/s2/favicons?domain=URL&sz=64` where URL is the URL of the site you want and sz is the size in pixels
|
||||||
3
docs/.vitepress/notes/soft98-note.md
Normal file
3
docs/.vitepress/notes/soft98-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Soft98 Note
|
||||||
|
|
||||||
|
Enable `AdGuard - Ads` filterlist in uBlock to allow downloads to work. To remove all ads, you can also get the [AdGuard Extra Userscript](https://github.com/AdguardTeam/AdGuardExtra?tab=readme-ov-file#userscript) (not the extension) and enable it in your script manager. Note that you may need to disable filter `ir: PersianBlocker`.
|
||||||
9
docs/.vitepress/notes/softarchive-mirrors.md
Normal file
9
docs/.vitepress/notes/softarchive-mirrors.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
#### SoftArchive Mirrors
|
||||||
|
|
||||||
|
- https://sanet.download/
|
||||||
|
- https://softarchive.is/
|
||||||
|
- https://sanet.lc/
|
||||||
|
- https://sanet.ws/
|
||||||
|
- https://sanet.st/
|
||||||
|
- https://sanet.sb/
|
||||||
|
- https://soft.ac/
|
||||||
3
docs/.vitepress/notes/sora.md
Normal file
3
docs/.vitepress/notes/sora.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Sora
|
||||||
|
|
||||||
|
Bypass the need for a invite code by installing Sora Mobile, and logging into OpenAI.
|
||||||
5
docs/.vitepress/notes/spicetify-note.md
Normal file
5
docs/.vitepress/notes/spicetify-note.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#### Spicetify Note
|
||||||
|
|
||||||
|
Join their [Discord](https://discord.gg/VnevqPp2Rr) for version compatibility.
|
||||||
|
|
||||||
|
Note that you can use the store built in to get a full list of addons and themes.
|
||||||
3
docs/.vitepress/notes/sport7.md
Normal file
3
docs/.vitepress/notes/sport7.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Sport7
|
||||||
|
|
||||||
|
Note that many sites use this player, but Sport7 is their main site.
|
||||||
3
docs/.vitepress/notes/steam-controller-support.md
Normal file
3
docs/.vitepress/notes/steam-controller-support.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Steam Controller Support
|
||||||
|
|
||||||
|
Steam has built in support for most controller types, just add your games to steam, right click the game, and turn on your controller
|
||||||
3
docs/.vitepress/notes/steam-currency-converter-note.md
Normal file
3
docs/.vitepress/notes/steam-currency-converter-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Steam Currency Converter Note
|
||||||
|
|
||||||
|
For instant currency conversion : Go to Firefox's extensions settings, click on the add-on, enter the permissions section and allow the sites there
|
||||||
4
docs/.vitepress/notes/tabiverse-extensions.md
Normal file
4
docs/.vitepress/notes/tabiverse-extensions.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#### Tabiverse Extensions
|
||||||
|
|
||||||
|
* https://addons.mozilla.org/firefox/addon/tabiverse/
|
||||||
|
* https://chromewebstore.google.com/detail/hpplgjkooibhfkmmepoikcjpadcojcik
|
||||||
3
docs/.vitepress/notes/tautulli-note.md
Normal file
3
docs/.vitepress/notes/tautulli-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Tautulli Note
|
||||||
|
|
||||||
|
This will sometimes get falsely flagged by defender and removed automatically, so it may need to be allowed manually.
|
||||||
3
docs/.vitepress/notes/teamspeak-warning.md
Normal file
3
docs/.vitepress/notes/teamspeak-warning.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### TeamSpeak Warning
|
||||||
|
|
||||||
|
Note that teamspeak server admins can view IPs, so only join servers you trust
|
||||||
3
docs/.vitepress/notes/thunderbird.md
Normal file
3
docs/.vitepress/notes/thunderbird.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Thunderbird
|
||||||
|
|
||||||
|
To get real-time notification, press the three lines in the top left corner, select the account you want to configure, select Manage Folders, then select the folder you want from below. You can then select inbox and enable push. (Notifications must be enabled).
|
||||||
5
docs/.vitepress/notes/tinyurl-note.md
Normal file
5
docs/.vitepress/notes/tinyurl-note.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#### TinyURL Note
|
||||||
|
|
||||||
|
To reveal the destination URL, replace "www" with "preview" in the URL like so:
|
||||||
|
|
||||||
|
https://preview.tinyurl.com/5erwtst5
|
||||||
3
docs/.vitepress/notes/video-downloadhelper.md
Normal file
3
docs/.vitepress/notes/video-downloadhelper.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Video DownloadHelper
|
||||||
|
|
||||||
|
Note that some versions of this extension give a watermark on sites that need conversion. It seems to happen on the Windows + Firefox version.
|
||||||
3
docs/.vitepress/notes/vuenxx-note.md
Normal file
3
docs/.vitepress/notes/vuenxx-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Vuenxx Note
|
||||||
|
|
||||||
|
If you want to download the files, you need to send the screenshot that you subscribed to the vuenxx youtube channel to the discord "teyit" channel. After a while the download channels will open.
|
||||||
3
docs/.vitepress/notes/welib-note.md
Normal file
3
docs/.vitepress/notes/welib-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### WeLib Note
|
||||||
|
|
||||||
|
WeLib is *not* connected to Anna's Archive, they simply mirror Anna's content onto their own site that has a different UI. It is not updated as often, and they don't share their codebase improvements publicly, so they aren't endorsed by Anna's themselves.
|
||||||
3
docs/.vitepress/notes/winrar.md
Normal file
3
docs/.vitepress/notes/winrar.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### WinRAR
|
||||||
|
|
||||||
|
WinRAR does not auto-update, and because it had a remote code execution vulnerability in the past, you should make sure you've manually updated **to 7.13 or later** to be safe.
|
||||||
3
docs/.vitepress/notes/yet-another-call-blocker-note.md
Normal file
3
docs/.vitepress/notes/yet-another-call-blocker-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### Yet Another Call Blocker Note
|
||||||
|
|
||||||
|
The app itself isn't maintained, but the repo contains the "main" phone number database. It is updated once in a couple of months. The app receives daily (incremental) updates directly from third-party services.
|
||||||
4
docs/.vitepress/notes/youtube-tweaks.md
Normal file
4
docs/.vitepress/notes/youtube-tweaks.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#### YouTube Tweaks
|
||||||
|
|
||||||
|
* https://addons.mozilla.org/firefox/addon/youtube-tweaks/
|
||||||
|
* https://chrome.google.com/webstore/detail/youtube-tweaks/oeakphpfoaeggagmgphfejmfjbhjfhhh
|
||||||
3
docs/.vitepress/notes/yts-yify-note.md
Normal file
3
docs/.vitepress/notes/yts-yify-note.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#### YTS / Yify Note
|
||||||
|
|
||||||
|
YTS / Yify has many fake ripoff sites out there, make 100% sure you're on one of the official domains before downloading.
|
||||||
@@ -1,9 +1,12 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { useData } from 'vitepress'
|
||||||
import DefaultTheme from 'vitepress/theme'
|
import DefaultTheme from 'vitepress/theme'
|
||||||
import Announcement from './components/Announcement.vue'
|
import Announcement from './components/Announcement.vue'
|
||||||
import Sidebar from './components/SidebarCard.vue'
|
import Sidebar from './components/SidebarCard.vue'
|
||||||
|
import { useTheme } from './themes/themeHandler'
|
||||||
|
|
||||||
const { isDark } = useData()
|
const { isDark } = useData()
|
||||||
|
const { setMode } = useTheme()
|
||||||
|
|
||||||
const enableTransitions = () =>
|
const enableTransitions = () =>
|
||||||
'startViewTransition' in document &&
|
'startViewTransition' in document &&
|
||||||
@@ -12,6 +15,8 @@ const enableTransitions = () =>
|
|||||||
provide('toggle-appearance', async ({ clientX: x, clientY: y }: MouseEvent) => {
|
provide('toggle-appearance', async ({ clientX: x, clientY: y }: MouseEvent) => {
|
||||||
if (!enableTransitions()) {
|
if (!enableTransitions()) {
|
||||||
isDark.value = !isDark.value
|
isDark.value = !isDark.value
|
||||||
|
// Sync with theme handler
|
||||||
|
setMode(isDark.value ? 'dark' : 'light')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,6 +31,8 @@ provide('toggle-appearance', async ({ clientX: x, clientY: y }: MouseEvent) => {
|
|||||||
// @ts-expect-error
|
// @ts-expect-error
|
||||||
await document.startViewTransition(async () => {
|
await document.startViewTransition(async () => {
|
||||||
isDark.value = !isDark.value
|
isDark.value = !isDark.value
|
||||||
|
// Sync with theme handler
|
||||||
|
setMode(isDark.value ? 'dark' : 'light')
|
||||||
await nextTick()
|
await nextTick()
|
||||||
}).ready
|
}).ready
|
||||||
|
|
||||||
|
|||||||
@@ -1,88 +1,265 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { colors } from '@fmhy/colors'
|
import { colors } from '@fmhy/colors'
|
||||||
import { useStorage, useStyleTag } from '@vueuse/core'
|
import { useStorage } from '@vueuse/core'
|
||||||
import { watch } from 'vue'
|
import { watch, onMounted, nextTick } from 'vue'
|
||||||
|
import { useTheme } from '../themes/themeHandler'
|
||||||
const colorScales = [
|
import { themeRegistry } from '../themes/configs'
|
||||||
'50',
|
import type { Theme } from '../themes/types'
|
||||||
'100',
|
import Switch from './Switch.vue'
|
||||||
'200',
|
|
||||||
'300',
|
|
||||||
'400',
|
|
||||||
'500',
|
|
||||||
'600',
|
|
||||||
'700',
|
|
||||||
'800',
|
|
||||||
'900',
|
|
||||||
'950'
|
|
||||||
] as const
|
|
||||||
|
|
||||||
type ColorNames = keyof typeof colors
|
type ColorNames = keyof typeof colors
|
||||||
const selectedColor = useStorage<ColorNames>('preferred-color', 'swarm')
|
const selectedColor = useStorage<ColorNames>('preferred-color', 'swarm')
|
||||||
|
|
||||||
|
// Use the theme system
|
||||||
|
const { amoledEnabled, setAmoledEnabled, setTheme, state, mode, themeName } = useTheme()
|
||||||
|
|
||||||
const colorOptions = Object.keys(colors).filter(
|
const colorOptions = Object.keys(colors).filter(
|
||||||
(key) => typeof colors[key as keyof typeof colors] === 'object'
|
(key) => typeof colors[key as keyof typeof colors] === 'object'
|
||||||
) as Array<ColorNames>
|
) as Array<ColorNames>
|
||||||
|
|
||||||
const { css } = useStyleTag('', { id: 'brand-color' })
|
// Preset themes (exclude dynamically generated color- themes)
|
||||||
|
const presetThemeNames = Object.keys(themeRegistry).filter((k) => !k.startsWith('color-'))
|
||||||
|
|
||||||
const updateThemeColor = (colorName: ColorNames) => {
|
const getThemePreviewStyle = (name: string) => {
|
||||||
const colorSet = colors[colorName]
|
const theme = themeRegistry[name]
|
||||||
|
if (!theme) return {}
|
||||||
|
const modeKey = (mode && (mode as any).value) ? (mode as any).value as keyof typeof theme.modes : 'light'
|
||||||
|
const modeColors = theme.modes[modeKey]
|
||||||
|
|
||||||
const cssVars = colorScales
|
if (theme.preview) {
|
||||||
.map((scale) => `--vp-c-brand-${scale}: ${colorSet[scale]};`)
|
// If preview is a URL or gradient, use it directly
|
||||||
.join('\n ')
|
if (theme.preview.startsWith('http') || theme.preview.startsWith('data:')) {
|
||||||
|
return { backgroundImage: `url(${theme.preview})`, backgroundSize: 'cover' }
|
||||||
css.value = `
|
|
||||||
:root {
|
|
||||||
${cssVars}
|
|
||||||
--vp-c-brand-1: ${colorSet[500]};
|
|
||||||
--vp-c-brand-2: ${colorSet[600]};
|
|
||||||
--vp-c-brand-3: ${colorSet[800]};
|
|
||||||
--vp-c-brand-soft: ${colorSet[400]};
|
|
||||||
}
|
}
|
||||||
|
return { background: theme.preview }
|
||||||
|
}
|
||||||
|
|
||||||
.dark {
|
if (modeColors?.brand && modeColors.brand[1] && modeColors.brand[2]) {
|
||||||
${cssVars}
|
return {
|
||||||
--vp-c-brand-1: ${colorSet[400]};
|
background: `linear-gradient(135deg, ${modeColors.brand[1]} 0%, ${modeColors.brand[2]} 100%)`
|
||||||
--vp-c-brand-2: ${colorSet[500]};
|
|
||||||
--vp-c-brand-3: ${colorSet[700]};
|
|
||||||
--vp-c-brand-soft: ${colorSet[300]};
|
|
||||||
}
|
}
|
||||||
`
|
}
|
||||||
|
|
||||||
|
// Fallback to CSS var brand if present
|
||||||
|
return { background: 'var(--vp-c-brand-1)' }
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize theme color
|
const generateThemeFromColor = (colorName: ColorNames): Theme => {
|
||||||
updateThemeColor(selectedColor.value)
|
const colorSet = colors[colorName]
|
||||||
|
|
||||||
watch(selectedColor, updateThemeColor)
|
return {
|
||||||
|
name: `color-${colorName}`,
|
||||||
|
displayName: normalizeColorName(colorName),
|
||||||
|
modes: {
|
||||||
|
light: {
|
||||||
|
brand: {
|
||||||
|
1: colorSet[500],
|
||||||
|
2: colorSet[600],
|
||||||
|
3: colorSet[800],
|
||||||
|
soft: colorSet[400]
|
||||||
|
},
|
||||||
|
bg: '#f8fafc',
|
||||||
|
bgAlt: '#eef2f5',
|
||||||
|
bgElv: 'rgba(255, 255, 255, 0.8)',
|
||||||
|
bgMark: 'rgb(226, 232, 240)',
|
||||||
|
text: {
|
||||||
|
1: '#0f172a',
|
||||||
|
2: '#334155',
|
||||||
|
3: '#64748b'
|
||||||
|
},
|
||||||
|
button: {
|
||||||
|
brand: {
|
||||||
|
bg: colorSet[500],
|
||||||
|
border: colorSet[400],
|
||||||
|
text: 'rgba(255, 255, 255)',
|
||||||
|
hoverBorder: colorSet[400],
|
||||||
|
hoverText: 'rgba(255, 255, 255)',
|
||||||
|
hoverBg: colorSet[400],
|
||||||
|
activeBorder: colorSet[400],
|
||||||
|
activeText: 'rgba(255, 255, 255)',
|
||||||
|
activeBg: colorSet[500]
|
||||||
|
},
|
||||||
|
alt: {
|
||||||
|
bg: '#484848',
|
||||||
|
text: '#f0eeee',
|
||||||
|
hoverBg: '#484848',
|
||||||
|
hoverText: '#f0eeee'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
customBlock: {
|
||||||
|
info: {
|
||||||
|
bg: `${colorSet[100]}`,
|
||||||
|
border: `${colorSet[800]}`,
|
||||||
|
text: `${colorSet[800]}`,
|
||||||
|
textDeep: `${colorSet[900]}`
|
||||||
|
},
|
||||||
|
tip: {
|
||||||
|
bg: '#D8F8E4',
|
||||||
|
border: '#447A61',
|
||||||
|
text: '#2D6A58',
|
||||||
|
textDeep: '#166534'
|
||||||
|
},
|
||||||
|
warning: {
|
||||||
|
bg: '#FCEFC3',
|
||||||
|
border: '#9A8034',
|
||||||
|
text: '#9C701B',
|
||||||
|
textDeep: '#92400e'
|
||||||
|
},
|
||||||
|
danger: {
|
||||||
|
bg: '#FBE1E2',
|
||||||
|
border: '#B3565E',
|
||||||
|
text: '#912239',
|
||||||
|
textDeep: '#991b1b'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
selection: {
|
||||||
|
bg: colorSet[200]
|
||||||
|
},
|
||||||
|
home: {
|
||||||
|
heroNameColor: 'transparent',
|
||||||
|
heroNameBackground: '-webkit-linear-gradient(120deg, #c4b5fd 30%, #7bc5e4)',
|
||||||
|
heroImageBackground: 'linear-gradient(-45deg, #c4b5fd 50%, #47caff 50%)',
|
||||||
|
heroImageFilter: 'blur(44px)'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dark: {
|
||||||
|
brand: {
|
||||||
|
1: colorSet[400],
|
||||||
|
2: colorSet[500],
|
||||||
|
3: colorSet[600],
|
||||||
|
soft: colorSet[300]
|
||||||
|
},
|
||||||
|
bg: '#1A1A1A',
|
||||||
|
bgAlt: '#171717',
|
||||||
|
bgElv: '#1a1a1acc',
|
||||||
|
button: {
|
||||||
|
brand: {
|
||||||
|
bg: colorSet[400],
|
||||||
|
border: colorSet[300],
|
||||||
|
text: 'rgba(15, 23, 42)',
|
||||||
|
hoverBorder: colorSet[300],
|
||||||
|
hoverText: 'rgba(15, 23, 42)',
|
||||||
|
hoverBg: colorSet[300],
|
||||||
|
activeBorder: colorSet[300],
|
||||||
|
activeText: 'rgba(15, 23, 42)',
|
||||||
|
activeBg: colorSet[400]
|
||||||
|
},
|
||||||
|
alt: {
|
||||||
|
bg: '#484848',
|
||||||
|
text: '#f0eeee',
|
||||||
|
hoverBg: '#484848',
|
||||||
|
hoverText: '#f0eeee'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
customBlock: {
|
||||||
|
info: {
|
||||||
|
bg: `${colorSet[950]}`,
|
||||||
|
border: `${colorSet[700]}`,
|
||||||
|
text: `${colorSet[200]}`,
|
||||||
|
textDeep: `${colorSet[200]}`
|
||||||
|
},
|
||||||
|
tip: {
|
||||||
|
bg: '#0C2A20',
|
||||||
|
border: '#184633',
|
||||||
|
text: '#B0EBC9',
|
||||||
|
textDeep: '#166534'
|
||||||
|
},
|
||||||
|
warning: {
|
||||||
|
bg: '#403207',
|
||||||
|
border: '#7E6211',
|
||||||
|
text: '#F9DE88',
|
||||||
|
textDeep: '#92400e'
|
||||||
|
},
|
||||||
|
danger: {
|
||||||
|
bg: '#3F060A',
|
||||||
|
border: '#7C0F18',
|
||||||
|
text: '#F7C1BC',
|
||||||
|
textDeep: '#991b1b'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
selection: {
|
||||||
|
bg: colorSet[800]
|
||||||
|
},
|
||||||
|
home: {
|
||||||
|
heroNameColor: 'transparent',
|
||||||
|
heroNameBackground: '-webkit-linear-gradient(120deg, #c4b5fd 30%, #7bc5e4)',
|
||||||
|
heroImageBackground: 'linear-gradient(-45deg, #c4b5fd 50%, #47caff 50%)',
|
||||||
|
heroImageFilter: 'blur(44px)'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const normalizeColorName = (colorName: string) =>
|
const normalizeColorName = (colorName: string) =>
|
||||||
colorName.replaceAll(/-/g, ' ').charAt(0).toUpperCase() +
|
colorName.replaceAll(/-/g, ' ').charAt(0).toUpperCase() +
|
||||||
colorName.slice(1).replaceAll(/-/g, ' ')
|
colorName.slice(1).replaceAll(/-/g, ' ')
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
// apply saved theme on load
|
||||||
|
if (selectedColor.value) {
|
||||||
|
const theme = generateThemeFromColor(selectedColor.value)
|
||||||
|
themeRegistry[`color-${selectedColor.value}`] = theme
|
||||||
|
await nextTick()
|
||||||
|
setTheme(`color-${selectedColor.value}`)
|
||||||
|
}
|
||||||
|
// Wait for next tick to ensure theme handler is fully initialized
|
||||||
|
await nextTick()
|
||||||
|
})
|
||||||
|
|
||||||
|
watch(selectedColor, async (color) => {
|
||||||
|
if (!color) return;
|
||||||
|
const theme = generateThemeFromColor(color)
|
||||||
|
themeRegistry[`color-${color}`] = theme
|
||||||
|
await nextTick()
|
||||||
|
setTheme(`color-${color}`)
|
||||||
|
})
|
||||||
|
|
||||||
|
const toggleAmoled = () => {
|
||||||
|
setAmoledEnabled(!amoledEnabled.value)
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<div class="flex flex-wrap gap-2">
|
<div class="flex flex-wrap gap-2">
|
||||||
|
<!-- Color picker generated themes (render first) -->
|
||||||
<div v-for="color in colorOptions" :key="color">
|
<div v-for="color in colorOptions" :key="color">
|
||||||
<button
|
<button
|
||||||
:class="[
|
:class="[
|
||||||
'inline-block w-6 h-6 rounded-full transition-all duration-200'
|
'inline-block w-6 h-6 rounded-full transition-all duration-200 border-2',
|
||||||
|
(themeName && themeName.value === `color-${color}`)
|
||||||
|
? 'border-slate-200 dark:border-slate-400 shadow-lg'
|
||||||
|
: 'border-transparent'
|
||||||
]"
|
]"
|
||||||
@click="selectedColor = color"
|
@click="selectedColor = color"
|
||||||
:title="normalizeColorName(color)"
|
:title="normalizeColorName(color)"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="inline-block w-6 h-6 rounded-full"
|
class="inline-block w-full h-full rounded-full"
|
||||||
:style="{ backgroundColor: colors[color][500] }"
|
:style="{ backgroundColor: colors[color][500], backgroundSize: 'cover', backgroundPosition: 'center', backgroundRepeat: 'no-repeat' }"
|
||||||
/>
|
></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Preset themes (render at the end) -->
|
||||||
|
<div v-for="t in presetThemeNames" :key="t">
|
||||||
|
<button
|
||||||
|
:class="[
|
||||||
|
'inline-block w-6 h-6 rounded-full transition-all duration-200 border-2',
|
||||||
|
(themeName && themeName.value === t)
|
||||||
|
? 'border-slate-200 dark:border-slate-400 shadow-lg'
|
||||||
|
: 'border-transparent'
|
||||||
|
]"
|
||||||
|
@click="selectedColor = '' as ColorNames; setTheme(t)"
|
||||||
|
:title="themeRegistry[t].displayName"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="inline-block w-full h-full rounded-full"
|
||||||
|
:style="Object.assign({ backgroundSize: 'cover', backgroundPosition: 'center', backgroundRepeat: 'no-repeat' }, getThemePreviewStyle(t))"
|
||||||
|
></span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mt-2 text-sm text-$vp-c-text-2">
|
|
||||||
Selected: {{ normalizeColorName(selectedColor) }}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -145,36 +145,28 @@ const toggleCard = () => (isCardShown.value = !isCardShown.value)
|
|||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<div
|
<div
|
||||||
class="mt-2 p-4 border-2 border-solid bg-brand-50 border-brand-300 dark:bg-brand-950 dark:border-brand-800 rounded-xl col-span-3 transition-colors duration-250"
|
class="mt-2 p-4 border-2 border-solid bg-$vp-c-bg-alt border-$vp-c-divider rounded-xl col-span-3 transition-colors duration-250"
|
||||||
>
|
>
|
||||||
<div class="flex items-start md:items-center gap-3">
|
<div class="flex items-start md:items-center gap-3">
|
||||||
<div class="pt-1 md:pt-0">
|
<div class="pt-1 md:pt-0">
|
||||||
<div
|
<div class="w-10 h-10 rounded-full flex items-center justify-center bg-$vp-c-brand-3">
|
||||||
class="w-10 h-10 rounded-full flex items-center justify-center bg-brand-500 dark:bg-brand-400"
|
|
||||||
>
|
|
||||||
<span
|
<span
|
||||||
:class="
|
:class="
|
||||||
isCardShown === false
|
isCardShown === false
|
||||||
? `i-lucide:mail w-6 h-6 text-white dark:text-brand-950`
|
? `i-lucide:mail w-6 h-6 text-white`
|
||||||
: `i-lucide:mail-x w-6 h-6 text-white dark:text-brand-950`
|
: `i-lucide:mail-x w-6 h-6 text-white`
|
||||||
"
|
"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div class="flex-grow flex items-start md:items-center gap-3 flex-col md:flex-row">
|
||||||
class="flex-grow flex items-start md:items-center gap-3 flex-col md:flex-row"
|
|
||||||
>
|
|
||||||
<div class="flex-grow">
|
<div class="flex-grow">
|
||||||
<div class="font-semibold text-brand-950 dark:text-brand-50">
|
<div class="font-semibold text-$vp-c-text-1">Got feedback?</div>
|
||||||
Got feedback?
|
<div class="text-sm text-$vp-c-text-2">We'd love to know what you think about this page.</div>
|
||||||
</div>
|
|
||||||
<div class="text-sm text-brand-800 dark:text-brand-100">
|
|
||||||
We'd love to know what you think about this page.
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<button
|
<button
|
||||||
class="inline-block text-center rounded-full px-4 py-2.5 text-sm font-medium border-2 border-solid text-brand-700 border-brand-300 dark:text-brand-100 dark:border-brand-800"
|
class="bg-[#25262B] inline-block text-center rounded-full px-4 py-2.5 text-sm font-medium border-2 border-solid text-white border-$vp-c-divider"
|
||||||
@click="toggleCard()"
|
@click="toggleCard()"
|
||||||
>
|
>
|
||||||
Share Feedback
|
Share Feedback
|
||||||
@@ -199,7 +191,7 @@ const toggleCard = () => (isCardShown.value = !isCardShown.value)
|
|||||||
<button
|
<button
|
||||||
v-for="item in feedbackOptions"
|
v-for="item in feedbackOptions"
|
||||||
:key="item.value"
|
:key="item.value"
|
||||||
class="bg-bg border-$vp-c-default-soft hover:border-primary mt-2 select-none rounded border-2 border-solid font-bold transition-all duration-250 rounded-lg text-[14px] font-500 leading-normal m-0 px-3 py-1.5 text-center align-middle whitespace-nowrap"
|
class="bg-[#25262B] border-$vp-c-default-soft hover:border-primary mt-2 select-none rounded border-2 border-solid font-bold transition-all duration-250 rounded-lg text-[14px] text-white font-500 leading-normal m-0 px-3 py-1.5 text-center align-middle whitespace-nowrap"
|
||||||
@click="handleSubmit(item.value)"
|
@click="handleSubmit(item.value)"
|
||||||
>
|
>
|
||||||
<span>{{ item.label }}</span>
|
<span>{{ item.label }}</span>
|
||||||
@@ -240,9 +232,10 @@ const toggleCard = () => (isCardShown.value = !isCardShown.value)
|
|||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
class="border border-div rounded-lg transition-colors duration-250 inline-block text-14px font-500 leading-1.5 px-3 py-3 text-center align-middle whitespace-nowrap disabled:opacity-50 text-text-2 bg-brand-100 dark:bg-brand-700 border-brand-800 dark:border-brand-700 disabled:bg-brand-100 dark:disabled:bg-brand-900 hover:border-brand-900 dark:hover:border-brand-800 hover:bg-brand-200 dark:hover:bg-brand-800"
|
class="btn btn-primary"
|
||||||
:disabled="isDisabled"
|
:disabled="isDisabled"
|
||||||
@click="handleSubmit()"
|
@click="handleSubmit()"
|
||||||
|
:style="isDisabled ? {} : { 'background-color': 'var(--vp-button-brand-bg)', 'border-color': 'var(--vp-button-brand-border)', color: 'var(--vp-button-brand-text)' }"
|
||||||
>
|
>
|
||||||
Send Feedback 📩
|
Send Feedback 📩
|
||||||
</button>
|
</button>
|
||||||
@@ -284,14 +277,14 @@ const toggleCard = () => (isCardShown.value = !isCardShown.value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
.btn-primary {
|
.btn-primary {
|
||||||
color: #fff;
|
color: var(--vp-button-brand-text);
|
||||||
background-color: var(--vp-c-brand);
|
background-color: var(--vp-button-brand-bg);
|
||||||
border-color: var(--vp-c-brand);
|
border-color: var(--vp-button-brand-border);
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-primary:hover {
|
.btn-primary:hover {
|
||||||
background-color: var(--vp-c-brand-darker);
|
background-color: var(--vp-button-brand-hover-bg);
|
||||||
border-color: var(--vp-c-brand-darker);
|
border-color: var(--vp-button-brand-hover-border);
|
||||||
}
|
}
|
||||||
|
|
||||||
.heading {
|
.heading {
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import Field from './CardField.vue'
|
import Field from './CardField.vue'
|
||||||
import ColorPicker from './ColorPicker.vue'
|
import ColorPicker from './ColorPicker.vue'
|
||||||
|
import ThemeSelector from './ThemeSelector.vue'
|
||||||
import InputField from './InputField.vue'
|
import InputField from './InputField.vue'
|
||||||
import ToggleStarred from './ToggleStarred.vue'
|
import ToggleStarred from './ToggleStarred.vue'
|
||||||
|
import ToggleIndexes from './ToggleIndexes.vue'
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -25,7 +27,18 @@ import ToggleStarred from './ToggleStarred.vue'
|
|||||||
<ToggleStarred />
|
<ToggleStarred />
|
||||||
</template>
|
</template>
|
||||||
</InputField>
|
</InputField>
|
||||||
|
<InputField id="toggle-indexes" label="Toggle Indexes">
|
||||||
|
<template #display>
|
||||||
|
<ToggleIndexes />
|
||||||
|
</template>
|
||||||
|
</InputField>
|
||||||
|
|
||||||
<ColorPicker />
|
<div class="mt-4">
|
||||||
|
<ColorPicker />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-6 pt-6 border-t border-$vp-c-divider">
|
||||||
|
<ThemeSelector />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -1,14 +1,26 @@
|
|||||||
<script setup>
|
<script setup lang="ts">
|
||||||
import { Switch } from '@headlessui/vue'
|
import { Switch as HeadlessSwitch } from '@headlessui/vue'
|
||||||
import { ref } from 'vue'
|
|
||||||
|
|
||||||
const enabled = ref(false)
|
const props = defineProps<{
|
||||||
|
modelValue: boolean
|
||||||
|
disabled?: boolean
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const emit = defineEmits<{
|
||||||
|
(event: 'update:modelValue', value: boolean): void
|
||||||
|
}>()
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<Switch v-model="enabled" class="switch" :class="{ enabled }">
|
<HeadlessSwitch
|
||||||
|
:model-value="props.modelValue"
|
||||||
|
:disabled="props.disabled"
|
||||||
|
class="switch"
|
||||||
|
:class="{ enabled: props.modelValue, disabled: props.disabled }"
|
||||||
|
@update:modelValue="emit('update:modelValue', $event)"
|
||||||
|
>
|
||||||
<span class="thumb" />
|
<span class="thumb" />
|
||||||
</Switch>
|
</HeadlessSwitch>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
@@ -29,6 +41,23 @@ const enabled = ref(false)
|
|||||||
.switch.enabled {
|
.switch.enabled {
|
||||||
background-color: var(--vp-c-brand);
|
background-color: var(--vp-c-brand);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.switch.disabled {
|
||||||
|
opacity: 0.5;
|
||||||
|
pointer-events: none;
|
||||||
|
background-color: var(--vp-c-bg-soft, #2f2f2f);
|
||||||
|
border-color: var(--vp-c-divider, #666);
|
||||||
|
}
|
||||||
|
|
||||||
|
.switch.disabled .thumb {
|
||||||
|
background-color: #fff;
|
||||||
|
box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.2), var(--vp-shadow-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark .switch.disabled {
|
||||||
|
background-color: #2f2f2f;
|
||||||
|
border-color: #7d7d7d;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
@@ -43,7 +72,7 @@ const enabled = ref(false)
|
|||||||
width: 20px;
|
width: 20px;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
box-shadow: var(--vp-shadow-1);
|
box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.08), var(--vp-shadow-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.switch.enabled .thumb {
|
.switch.enabled .thumb {
|
||||||
|
|||||||
184
docs/.vitepress/theme/components/ThemeDropdown.vue
Normal file
184
docs/.vitepress/theme/components/ThemeDropdown.vue
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, computed, onMounted, onUnmounted } from 'vue'
|
||||||
|
import { useTheme } from '../themes/themeHandler'
|
||||||
|
import type { DisplayMode } from '../themes/types'
|
||||||
|
|
||||||
|
const { mode, setMode, state, amoledEnabled, setAmoledEnabled } = useTheme()
|
||||||
|
|
||||||
|
const isOpen = ref(false)
|
||||||
|
const dropdownRef = ref<HTMLElement | null>(null)
|
||||||
|
|
||||||
|
interface ModeChoice {
|
||||||
|
mode: DisplayMode
|
||||||
|
label: string
|
||||||
|
icon: string
|
||||||
|
isAmoled?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
const modeChoices: ModeChoice[] = [
|
||||||
|
{ mode: 'light', label: 'Light', icon: 'i-ph-sun-duotone' },
|
||||||
|
{ mode: 'dark', label: 'Dark', icon: 'i-ph-moon-duotone' },
|
||||||
|
{ mode: 'dark', label: 'AMOLED', icon: 'i-ph-moon-stars-duotone', isAmoled: true }
|
||||||
|
]
|
||||||
|
|
||||||
|
const currentChoice = computed(() => {
|
||||||
|
const current = (mode && (mode as any).value) ? (mode as any).value : 'light'
|
||||||
|
if (current === 'dark' && amoledEnabled.value) {
|
||||||
|
return modeChoices[2] // AMOLED option
|
||||||
|
}
|
||||||
|
return modeChoices.find(choice => choice.mode === current && !choice.isAmoled) || modeChoices[0]
|
||||||
|
})
|
||||||
|
|
||||||
|
const toggleDropdown = () => {
|
||||||
|
isOpen.value = !isOpen.value
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectMode = (choice: ModeChoice) => {
|
||||||
|
if (choice.isAmoled) {
|
||||||
|
setMode('dark')
|
||||||
|
setAmoledEnabled(true)
|
||||||
|
} else {
|
||||||
|
setMode(choice.mode)
|
||||||
|
setAmoledEnabled(false)
|
||||||
|
}
|
||||||
|
isOpen.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
const isActiveChoice = (choice: ModeChoice) => {
|
||||||
|
const current = (mode && (mode as any).value) ? (mode as any).value : 'light'
|
||||||
|
if (choice.isAmoled) {
|
||||||
|
return current === 'dark' && amoledEnabled.value
|
||||||
|
}
|
||||||
|
return choice.mode === current && !choice.isAmoled && !amoledEnabled.value
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleClickOutside = (event: MouseEvent) => {
|
||||||
|
if (dropdownRef.value && !dropdownRef.value.contains(event.target as Node)) {
|
||||||
|
isOpen.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
document.addEventListener('click', handleClickOutside)
|
||||||
|
})
|
||||||
|
|
||||||
|
onUnmounted(() => {
|
||||||
|
document.removeEventListener('click', handleClickOutside)
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div ref="dropdownRef" class="theme-dropdown">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="theme-dropdown-toggle"
|
||||||
|
:title="currentChoice.label"
|
||||||
|
@click="toggleDropdown"
|
||||||
|
>
|
||||||
|
<ClientOnly>
|
||||||
|
<div :class="[currentChoice.icon, 'text-xl']" />
|
||||||
|
</ClientOnly>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<Transition name="dropdown">
|
||||||
|
<div v-if="isOpen" class="theme-dropdown-menu">
|
||||||
|
<button
|
||||||
|
v-for="(choice, index) in modeChoices"
|
||||||
|
:key="index"
|
||||||
|
class="theme-dropdown-item"
|
||||||
|
:class="{ active: isActiveChoice(choice) }"
|
||||||
|
@click="selectMode(choice)"
|
||||||
|
>
|
||||||
|
<div :class="[choice.icon, 'text-lg']" />
|
||||||
|
<span>{{ choice.label }}</span>
|
||||||
|
<div v-if="isActiveChoice(choice)" class="i-ph-check text-lg ml-auto" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</Transition>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.theme-dropdown {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dropdown-toggle {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
width: 36px;
|
||||||
|
height: 36px;
|
||||||
|
color: var(--vp-c-text-2);
|
||||||
|
transition: color 0.5s;
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
cursor: pointer;
|
||||||
|
border-radius: 8px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: var(--vp-c-text-1);
|
||||||
|
background: var(--vp-c-bg-elv);
|
||||||
|
transition: color 0.25s, background 0.25s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dropdown-menu {
|
||||||
|
position: absolute;
|
||||||
|
top: calc(100% + 8px);
|
||||||
|
right: 0;
|
||||||
|
min-width: 180px;
|
||||||
|
background: var(--vp-c-bg-elv);
|
||||||
|
border: 1px solid var(--vp-c-divider);
|
||||||
|
border-radius: 8px;
|
||||||
|
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
|
||||||
|
padding: 6px;
|
||||||
|
z-index: 1000;
|
||||||
|
backdrop-filter: blur(12px);
|
||||||
|
|
||||||
|
.dark & {
|
||||||
|
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dropdown-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 12px;
|
||||||
|
width: 100%;
|
||||||
|
padding: 8px 12px;
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
border-radius: 6px;
|
||||||
|
color: var(--vp-c-text-1);
|
||||||
|
cursor: pointer;
|
||||||
|
transition: background 0.2s;
|
||||||
|
font-size: 14px;
|
||||||
|
text-align: left;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: var(--vp-c-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
color: var(--vp-c-brand-1);
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-enter-active,
|
||||||
|
.dropdown-leave-active {
|
||||||
|
transition: opacity 0.15s ease, transform 0.15s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-enter-from,
|
||||||
|
.dropdown-leave-to {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(-8px);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
47
docs/.vitepress/theme/components/ThemeSelector.vue
Normal file
47
docs/.vitepress/theme/components/ThemeSelector.vue
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { computed } from 'vue'
|
||||||
|
import { useTheme } from '../themes/themeHandler'
|
||||||
|
import { themeRegistry } from '../themes/configs'
|
||||||
|
|
||||||
|
const { themeName, setTheme, getAvailableThemes, state, mode } = useTheme()
|
||||||
|
|
||||||
|
const availableThemes = computed(() => getAvailableThemes())
|
||||||
|
|
||||||
|
const getThemePreview = (name: string) => {
|
||||||
|
const theme = themeRegistry[name]
|
||||||
|
if (theme?.preview) {
|
||||||
|
return theme.preview
|
||||||
|
}
|
||||||
|
// Fallback: create gradient from theme's brand colors if they exist
|
||||||
|
const modeKey = (mode && (mode as any).value) ? (mode as any).value : 'light'
|
||||||
|
const colors = modeKey === 'dark' ? theme?.modes.dark : theme?.modes.light
|
||||||
|
|
||||||
|
if (colors?.brand && colors.brand[1] && colors.brand[2] && colors.brand[3]) {
|
||||||
|
return `linear-gradient(135deg, ${colors.brand[1]} 0%, ${colors.brand[2]} 50%, ${colors.brand[3]} 100%)`
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'linear-gradient(135deg, var(--vp-c-brand-1) 0%, var(--vp-c-brand-2) 100%)'
|
||||||
|
}
|
||||||
|
|
||||||
|
const normalizeThemeName = (name: string) =>
|
||||||
|
name.replaceAll(/-/g, ' ').charAt(0).toUpperCase() +
|
||||||
|
name.slice(1).replaceAll(/-/g, ' ')
|
||||||
|
|
||||||
|
const currentDisplayName = computed(() => {
|
||||||
|
const t = themeName && (themeName as any).value ? (themeName as any).value : ''
|
||||||
|
if (!t) return 'Default'
|
||||||
|
const cfg = themeRegistry[t]
|
||||||
|
if (cfg && cfg.displayName) return cfg.displayName
|
||||||
|
// fallback: humanize the key
|
||||||
|
return normalizeThemeName(t)
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<div class="text-sm text-$vp-c-text-2">
|
||||||
|
<span class="font-medium">Theme:</span>
|
||||||
|
<span class="ml-1">{{ currentDisplayName }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
67
docs/.vitepress/theme/components/ToggleIndexes.vue
Normal file
67
docs/.vitepress/theme/components/ToggleIndexes.vue
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { onBeforeUnmount, onMounted, ref } from 'vue'
|
||||||
|
import Switch from './Switch.vue'
|
||||||
|
|
||||||
|
const isDisabled = ref(false)
|
||||||
|
const isOn = ref(false)
|
||||||
|
|
||||||
|
const syncState = () => {
|
||||||
|
const root = document.documentElement
|
||||||
|
isDisabled.value = root.classList.contains('starred-only')
|
||||||
|
isOn.value = root.classList.contains('indexes-only')
|
||||||
|
}
|
||||||
|
|
||||||
|
let observer: MutationObserver | undefined
|
||||||
|
|
||||||
|
onMounted(() =>
|
||||||
|
(observer = new MutationObserver(syncState)).observe(document.documentElement, {
|
||||||
|
attributes: true,
|
||||||
|
attributeFilter: ['class']
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
onMounted(syncState)
|
||||||
|
|
||||||
|
onBeforeUnmount(() => observer?.disconnect())
|
||||||
|
|
||||||
|
const toggleIndexes = (value: boolean) => {
|
||||||
|
if (isDisabled.value) {
|
||||||
|
isOn.value = document.documentElement.classList.contains('indexes-only')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const root = document.documentElement
|
||||||
|
const enabling = value
|
||||||
|
const wasStarred = root.classList.contains('starred-only')
|
||||||
|
|
||||||
|
root.classList.toggle('indexes-only', enabling)
|
||||||
|
|
||||||
|
if (enabling) {
|
||||||
|
root.dataset.starredWasOn = wasStarred ? 'true' : 'false'
|
||||||
|
|
||||||
|
if (wasStarred) {
|
||||||
|
root.classList.remove('starred-only')
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (root.dataset.starredWasOn === 'true') {
|
||||||
|
root.classList.add('starred-only')
|
||||||
|
}
|
||||||
|
|
||||||
|
delete root.dataset.starredWasOn
|
||||||
|
}
|
||||||
|
|
||||||
|
isOn.value = enabling
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<Switch v-model="isOn"
|
||||||
|
:disabled="isDisabled"
|
||||||
|
:class="{ disabled: isDisabled }"@update:modelValue="toggleIndexes" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.indexes-only .vp-doc li:not(.index) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,16 +1,53 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { onBeforeUnmount, onMounted, ref } from 'vue'
|
||||||
import Switch from './Switch.vue'
|
import Switch from './Switch.vue'
|
||||||
|
|
||||||
const toggleStarred = () =>
|
const isDisabled = ref(false)
|
||||||
document.documentElement.classList.toggle('starred-only')
|
const isOn = ref(false)
|
||||||
|
|
||||||
|
const syncState = () => {
|
||||||
|
const root = document.documentElement
|
||||||
|
isDisabled.value = root.classList.contains('indexes-only')
|
||||||
|
isOn.value = root.classList.contains('starred-only')
|
||||||
|
}
|
||||||
|
|
||||||
|
let observer: MutationObserver | undefined
|
||||||
|
|
||||||
|
onMounted(() =>
|
||||||
|
(observer = new MutationObserver(syncState)).observe(document.documentElement, {
|
||||||
|
attributes: true,
|
||||||
|
attributeFilter: ['class']
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
onMounted(syncState)
|
||||||
|
|
||||||
|
onBeforeUnmount(() => observer?.disconnect())
|
||||||
|
|
||||||
|
const toggleStarred = (value: boolean) => {
|
||||||
|
if (isDisabled.value) {
|
||||||
|
isOn.value = document.documentElement.classList.contains('starred-only')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const root = document.documentElement
|
||||||
|
root.classList.toggle('starred-only', value)
|
||||||
|
root.dataset.starredWasOn = value ? 'true' : 'false'
|
||||||
|
isOn.value = value
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<Switch @click="toggleStarred()" />
|
<Switch
|
||||||
|
v-model="isOn"
|
||||||
|
:disabled="isDisabled"
|
||||||
|
:class="{ disabled: isDisabled }"
|
||||||
|
@update:modelValue="toggleStarred"
|
||||||
|
/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.starred-only li:not(.starred) {
|
.starred-only .vp-doc li:not(.starred) {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user