mirror of
https://github.com/pengzhanbo/vuepress-theme-plume.git
synced 2026-04-23 10:58:13 +08:00
Compare commits
2212 Commits
v1.0.0-bet
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d69e0b9765 | ||
|
|
02038f2df0 | ||
|
|
e5126663ef | ||
|
|
402f259086 | ||
|
|
58ea2fc8cb | ||
|
|
6ebb1bda6e | ||
|
|
68f39695c4 | ||
|
|
76787f6530 | ||
|
|
e2b47da532 | ||
|
|
035d521e96 | ||
|
|
bfd0c8409c | ||
|
|
e11c7a8fcd | ||
|
|
1329051536 | ||
|
|
0677f6749e | ||
|
|
28963eb419 | ||
|
|
cfc89adab8 | ||
|
|
e0ba59a6f9 | ||
|
|
352874b29a | ||
|
|
c824ad85f4 | ||
|
|
db2eda82f3 | ||
|
|
e9fe35bc4f | ||
|
|
709ade741c | ||
|
|
d8b79e89e8 | ||
|
|
dbc6f0be0f | ||
|
|
9fe294b9dd | ||
|
|
ecf100cfc6 | ||
|
|
b7ee45642e | ||
|
|
54c05c8cea | ||
|
|
86cb872ce6 | ||
|
|
a6cb3820b1 | ||
|
|
184d1aee76 | ||
|
|
cbc5c55891 | ||
|
|
4f40f8441d | ||
|
|
fe0d4bbc92 | ||
|
|
39a76a35d7 | ||
|
|
a01bc13c66 | ||
|
|
1b213d4c28 | ||
|
|
aede6f5d87 | ||
|
|
7febfbf237 | ||
|
|
7ce4e40521 | ||
|
|
12c4f5b39e | ||
|
|
aa54090b5d | ||
|
|
192b260d2b | ||
|
|
75df783295 | ||
|
|
97a5ba20c3 | ||
|
|
896c7e22df | ||
|
|
77856e36c5 | ||
|
|
552f0f5c32 | ||
|
|
7751e4c798 | ||
|
|
17646708b1 | ||
|
|
f14d663bb5 | ||
|
|
50fa747ec1 | ||
|
|
f6da09df54 | ||
|
|
9b9f8f3f77 | ||
|
|
aa19049f5b | ||
|
|
fd1dd7c695 | ||
|
|
916e9141d9 | ||
|
|
ca51a345fb | ||
|
|
f11e8501d0 | ||
|
|
3f047914d5 | ||
|
|
0a3810be2b | ||
|
|
c541e05997 | ||
|
|
feb69a282e | ||
|
|
c109d54961 | ||
|
|
948c31779b | ||
|
|
09a95b7597 | ||
|
|
ce32605aee | ||
|
|
f7d3546962 | ||
|
|
5980fd81f3 | ||
|
|
f2fe79f923 | ||
|
|
7234eebe7e | ||
|
|
479680bba6 | ||
|
|
cd68f1cdd9 | ||
|
|
97c7a53aed | ||
|
|
03dc9da8dc | ||
|
|
a4c9c85b00 | ||
|
|
1ed3dd9154 | ||
|
|
bfd1d1692f | ||
|
|
6db6a58c27 | ||
|
|
9751059fcd | ||
|
|
fc9984b27c | ||
|
|
5930c60462 | ||
|
|
f173d069bd | ||
|
|
5c201e3ed0 | ||
|
|
77da8a3470 | ||
|
|
9c3899135b | ||
|
|
dc160b3db4 | ||
|
|
84bd873efa | ||
|
|
8d4ce99c16 | ||
|
|
8a873e1e58 | ||
|
|
2780abd782 | ||
|
|
b1f996cb0e | ||
|
|
78a2859398 | ||
|
|
8daddcac5d | ||
|
|
c5759e3a2e | ||
|
|
3e68b44771 | ||
|
|
d2b4654ae3 | ||
|
|
5a73b59297 | ||
|
|
98a969c112 | ||
|
|
8cd08f4f02 | ||
|
|
32e4f92c61 | ||
|
|
d573fada7a | ||
|
|
a13ed1f503 | ||
|
|
07c274cdbf | ||
|
|
ab4ff06756 | ||
|
|
b65529743e | ||
|
|
c46379bc9f | ||
|
|
6cd8066ee0 | ||
|
|
4ad05ad9f5 | ||
|
|
6a41d44322 | ||
|
|
f804ba8420 | ||
|
|
2a5bd30fe3 | ||
|
|
a3d8e225b9 | ||
|
|
f51dff1d58 | ||
|
|
85fc35f119 | ||
|
|
48970dd559 | ||
|
|
1dfbb872f7 | ||
|
|
79397faa65 | ||
|
|
7b17ccf378 | ||
|
|
7a0aee5fb9 | ||
|
|
a94333d9bd | ||
|
|
5217be0bfc | ||
|
|
6420ddf8ba | ||
|
|
6656b3213b | ||
|
|
a74c475d7c | ||
|
|
6d0781b647 | ||
|
|
cc3582c1f9 | ||
|
|
2cadb7d88c | ||
|
|
7ed70230af | ||
|
|
36c0eddd86 | ||
|
|
b242e59bbe | ||
|
|
9bbba1ada6 | ||
|
|
e2c9d50539 | ||
|
|
ed5c53f494 | ||
|
|
fe9ee0dbfc | ||
|
|
2bcf761ef1 | ||
|
|
ccf34d4bc8 | ||
|
|
f7c0fe0dd3 | ||
|
|
3f9422df83 | ||
|
|
46ec0fb123 | ||
|
|
a5f6f991f8 | ||
|
|
eb73f3d3f1 | ||
|
|
a15f4e206d | ||
|
|
ce19b84232 | ||
|
|
b86a121707 | ||
|
|
c0bb6bcc14 | ||
|
|
98684ed66a | ||
|
|
15aa159999 | ||
|
|
956869ab1e | ||
|
|
6e601f9f0e | ||
|
|
f7bc044147 | ||
|
|
a91cdb60d7 | ||
|
|
15e62010c2 | ||
|
|
a350e62645 | ||
|
|
95d345bf6d | ||
|
|
c42a601467 | ||
|
|
46797a0757 | ||
|
|
65da8469ce | ||
|
|
6383347813 | ||
|
|
2c360ac59e | ||
|
|
b128511c28 | ||
|
|
8f2f93ec7e | ||
|
|
8faba7bf10 | ||
|
|
c8ab57e843 | ||
|
|
9a77bf4eef | ||
|
|
157281aec8 | ||
|
|
07710247bb | ||
|
|
9b2b73e05b | ||
|
|
8f3c070d07 | ||
|
|
29b5197c47 | ||
|
|
5f82bdeb67 | ||
|
|
d677fc99de | ||
|
|
4b1cecf2bd | ||
|
|
32f4a8be5a | ||
|
|
3553022597 | ||
|
|
cd37921975 | ||
|
|
78b4b9f572 | ||
|
|
ab4354e648 | ||
|
|
20ebeb5e62 | ||
|
|
4957c8b1de | ||
|
|
3df96e2702 | ||
|
|
3c4985ac1a | ||
|
|
3a907e0ba8 | ||
|
|
db8a46eb4c | ||
|
|
c97a5af473 | ||
|
|
bba98984d6 | ||
|
|
41d2a81a09 | ||
|
|
6a3babcf76 | ||
|
|
f599a4223c | ||
|
|
e0b972c3cb | ||
|
|
2bb5c0e2d5 | ||
|
|
7691cdc9a0 | ||
|
|
c1f59cf451 | ||
|
|
fc3676d6dc | ||
|
|
73f4935ca9 | ||
|
|
f9b8c6adf2 | ||
|
|
8c1d34cb87 | ||
|
|
631188df85 | ||
|
|
a9082dc012 | ||
|
|
1b62b0bf6c | ||
|
|
75c12ba458 | ||
|
|
25c3880ea4 | ||
|
|
ddb77a06a5 | ||
|
|
a4bea8202b | ||
|
|
57617e6658 | ||
|
|
ea54d08a50 | ||
|
|
945cc72860 | ||
|
|
4884b1acce | ||
|
|
532ad960a4 | ||
|
|
ad1f02de62 | ||
|
|
20728f504d | ||
|
|
5b780c28d0 | ||
|
|
e8fa516b2e | ||
|
|
e87ae4fc16 | ||
|
|
5b07f2dd21 | ||
|
|
6fc6385de4 | ||
|
|
ab26dec457 | ||
|
|
4119b67e0b | ||
|
|
05d55e5035 | ||
|
|
f95e7c8412 | ||
|
|
4e7fb91a56 | ||
|
|
cd120220f2 | ||
|
|
a63c094df9 | ||
|
|
336205627e | ||
|
|
a5dfef7202 | ||
|
|
87cda0c824 | ||
|
|
b6ee4a4b3d | ||
|
|
2fc6ea5064 | ||
|
|
aa8e774a1b | ||
|
|
606f47a5a6 | ||
|
|
e6daf07456 | ||
|
|
3d48446769 | ||
|
|
802911c179 | ||
|
|
192017b892 | ||
|
|
cfa70320c8 | ||
|
|
d4ad65a1ea | ||
|
|
0e38265f96 | ||
|
|
fbb6ec9a63 | ||
|
|
19868d147e | ||
|
|
73e6b9d5ca | ||
|
|
ca3986917c | ||
|
|
be565baf59 | ||
|
|
aa6168c31d | ||
|
|
51e1f5260c | ||
|
|
441b991b65 | ||
|
|
5fb7b7a216 | ||
|
|
2d40e20f51 | ||
|
|
7f9d72416a | ||
|
|
ded49c4e88 | ||
|
|
0a23b94232 | ||
|
|
6325d097cb | ||
|
|
65d3c0551e | ||
|
|
eeb2ce5350 | ||
|
|
e0c0e639d0 | ||
|
|
1471547bcd | ||
|
|
6cd97bb4b8 | ||
|
|
1f2458f75c | ||
|
|
437d56dd6c | ||
|
|
7adb00be5b | ||
|
|
74b4ddf8f5 | ||
|
|
d30325dd96 | ||
|
|
ca84eaeb13 | ||
|
|
0212ec34a8 | ||
|
|
707d534b95 | ||
|
|
4abc1eeb58 | ||
|
|
1503a20fbe | ||
|
|
a2d52602d3 | ||
|
|
fffff72fcd | ||
|
|
89cb6a585a | ||
|
|
c476c2059b | ||
|
|
1686836e38 | ||
|
|
5c0d211d82 | ||
|
|
aa9c64f00f | ||
|
|
f505a2636e | ||
|
|
8cec3f23e4 | ||
|
|
338ca4ad7c | ||
|
|
86b7f2e695 | ||
|
|
3a07f590cb | ||
|
|
0f350226ef | ||
|
|
729a0d6840 | ||
|
|
9afb57815c | ||
|
|
3b99ecc46f | ||
|
|
a8c689f6e9 | ||
|
|
4a8fd3f7fc | ||
|
|
b3843c7d97 | ||
|
|
c2bd0f938e | ||
|
|
385059f214 | ||
|
|
c6347676cd | ||
|
|
104370ca42 | ||
|
|
9f3de6b8ea | ||
|
|
3b5e2cc5b3 | ||
|
|
53b90b512c | ||
|
|
9ed4acc097 | ||
|
|
2e1ad23112 | ||
|
|
133c4f996f | ||
|
|
b37af47dca | ||
|
|
2a8385f3aa | ||
|
|
22b65fd22c | ||
|
|
b87a5cfd7a | ||
|
|
4f7b0cabb6 | ||
|
|
5996f1062f | ||
|
|
4d2361a704 | ||
|
|
fae5825618 | ||
|
|
731b11f159 | ||
|
|
1dd9dabb63 | ||
|
|
a05aa7f598 | ||
|
|
687439e697 | ||
|
|
bb30b51a9b | ||
|
|
9357b21af1 | ||
|
|
5cbf0ddfcf | ||
|
|
001896b5fa | ||
|
|
69b9d0bc3d | ||
|
|
dd958c30cf | ||
|
|
2bb5625eb4 | ||
|
|
3523df74db | ||
|
|
7a95f6ab95 | ||
|
|
242ef3a7a8 | ||
|
|
086528606e | ||
|
|
2757301d61 | ||
|
|
3051b5d146 | ||
|
|
3bca540085 | ||
|
|
cfc9cefe78 | ||
|
|
5c00e4f9cf | ||
|
|
2c39edf849 | ||
|
|
46b2da25a6 | ||
|
|
7c0dfc562e | ||
|
|
0da7055c2b | ||
|
|
6902067ea6 | ||
|
|
172aa3fb9c | ||
|
|
89314f4cb4 | ||
|
|
22a5f10add | ||
|
|
94e755c422 | ||
|
|
49d84dcfb4 | ||
|
|
e8e8614d6e | ||
|
|
96eb076496 | ||
|
|
2059cf92ff | ||
|
|
c8f16bbf43 | ||
|
|
27e9ab0982 | ||
|
|
bc27437730 | ||
|
|
21045599d0 | ||
|
|
e32c2d2d6b | ||
|
|
caf1cd03c9 | ||
|
|
e128f524ac | ||
|
|
94d3b4fdf8 | ||
|
|
437f6cd75e | ||
|
|
f02617908f | ||
|
|
e113f6850a | ||
|
|
fde93517d9 | ||
|
|
b08401ee30 | ||
|
|
05bfd4add1 | ||
|
|
d976263a46 | ||
|
|
371834640b | ||
|
|
b120633453 | ||
|
|
0443c6ff05 | ||
|
|
9f1948cf05 | ||
|
|
1702995aec | ||
|
|
cd23571014 | ||
|
|
11ede1754f | ||
|
|
528ddc0676 | ||
|
|
b8ce0cd151 | ||
|
|
cc0692145a | ||
|
|
7f7ada919f | ||
|
|
5e4cc987f3 | ||
|
|
a872cc278b | ||
|
|
fa26b7bd5f | ||
|
|
70dc62e4ae | ||
|
|
7964cbfde1 | ||
|
|
3e9314194b | ||
|
|
f7f39b8f32 | ||
|
|
0fe98a38f1 | ||
|
|
cd1d457d31 | ||
|
|
57d08bd501 | ||
|
|
534683817e | ||
|
|
877d2736d6 | ||
|
|
6f9dc24941 | ||
|
|
156e32c17c | ||
|
|
3c07909c34 | ||
|
|
d27121a558 | ||
|
|
4590703e63 | ||
|
|
2cbae991af | ||
|
|
020f276dff | ||
|
|
79fecda01f | ||
|
|
2c43798697 | ||
|
|
7eb9f5cd58 | ||
|
|
f7ec566ae5 | ||
|
|
309be687b4 | ||
|
|
cd2b7fd26d | ||
|
|
a8fac92bf0 | ||
|
|
dc42be6035 | ||
|
|
e2fb1c10e8 | ||
|
|
14cba534e4 | ||
|
|
4f60b5424d | ||
|
|
0078731ee4 | ||
|
|
a49327e27b | ||
|
|
214c036e1a | ||
|
|
6f15557f11 | ||
|
|
338334f479 | ||
|
|
6ef3db166a | ||
|
|
9efa2c1a80 | ||
|
|
a5c874cdcf | ||
|
|
953277c77d | ||
|
|
118f57c791 | ||
|
|
fefe83b0bc | ||
|
|
ebd316a415 | ||
|
|
818ea804bc | ||
|
|
93a430506a | ||
|
|
1cae20bdf8 | ||
|
|
e660a522b2 | ||
|
|
bb792a7e12 | ||
|
|
f864ccb187 | ||
|
|
0ac2f40431 | ||
|
|
1dcd46c9c0 | ||
|
|
1f89d7f515 | ||
|
|
c21c9bdefa | ||
|
|
7086bb0be9 | ||
|
|
8f9eb1666f | ||
|
|
3c2a34729e | ||
|
|
d5ea846e8a | ||
|
|
46effe8866 | ||
|
|
7ed3f6ffd1 | ||
|
|
cb8d8af2ce | ||
|
|
d0295ee844 | ||
|
|
76344550fc | ||
|
|
921e8100ae | ||
|
|
d6a47419e4 | ||
|
|
3c384a4362 | ||
|
|
0b948fe551 | ||
|
|
555d369b80 | ||
|
|
1c83d2e99a | ||
|
|
ca66d587ec | ||
|
|
4e100a3a01 | ||
|
|
d2a849af64 | ||
|
|
3ba41b90b8 | ||
|
|
d52856f0fc | ||
|
|
470513d07b | ||
|
|
ede0eb8184 | ||
|
|
c9ead12e35 | ||
|
|
7592eafd38 | ||
|
|
1e98061021 | ||
|
|
45853ab51d | ||
|
|
665a8fa530 | ||
|
|
d63deb5076 | ||
|
|
4746e0082b | ||
|
|
e1bccbefeb | ||
|
|
2ced06b729 | ||
|
|
1de7cfc773 | ||
|
|
cd9c664e81 | ||
|
|
97dcc97aa1 | ||
|
|
9ef8322940 | ||
|
|
dcecbfdd8d | ||
|
|
79af255cd8 | ||
|
|
dadf303ea3 | ||
|
|
5d255998db | ||
|
|
8bfe995a20 | ||
|
|
149732520a | ||
|
|
0425046e9e | ||
|
|
eda194cd53 | ||
|
|
6677dcae62 | ||
|
|
698ce3ef59 | ||
|
|
b4c139bc72 | ||
|
|
aaa473572c | ||
|
|
1f8a9ce251 | ||
|
|
c4da089745 | ||
|
|
79ab31d0f2 | ||
|
|
2c9006caf7 | ||
|
|
901142d97b | ||
|
|
9fef6654ae | ||
|
|
bd0e9404da | ||
|
|
f9276fdb75 | ||
|
|
61ca08c8b4 | ||
|
|
d3105eaa7d | ||
|
|
8424074753 | ||
|
|
43b5060116 | ||
|
|
07822e4185 | ||
|
|
b3561ef383 | ||
|
|
4733505cf2 | ||
|
|
31e3b41a27 | ||
|
|
3b214f1b58 | ||
|
|
5c24d4a877 | ||
|
|
f13e967c66 | ||
|
|
d14961d038 | ||
|
|
497aeb37d6 | ||
|
|
fdb17160ec | ||
|
|
d8ca727a9f | ||
|
|
a3208fc309 | ||
|
|
56c5eb5257 | ||
|
|
16c768f3a9 | ||
|
|
10708c97b4 | ||
|
|
1bc33acb2a | ||
|
|
d96ba6b8ea | ||
|
|
bde6afad9c | ||
|
|
6ca72d08ef | ||
|
|
a35ac8eae8 | ||
|
|
740bc4e364 | ||
|
|
0bf7c865ac | ||
|
|
a446a86dbf | ||
|
|
7ecce2db5c | ||
|
|
729a0cbd40 | ||
|
|
e709dada3a | ||
|
|
599e43fd3c | ||
|
|
7e255412c1 | ||
|
|
0ed3b45ba5 | ||
|
|
3071354b20 | ||
|
|
a74c0b924f | ||
|
|
2e7f69bb62 | ||
|
|
58381ba294 | ||
|
|
a023ca8654 | ||
|
|
b07426dfc6 | ||
|
|
7c05f3abc3 | ||
|
|
e7fd9b50da | ||
|
|
4f267faa2b | ||
|
|
9196d62221 | ||
|
|
cc7dd036d6 | ||
|
|
614d7f5f0f | ||
|
|
939e51c5c3 | ||
|
|
b4dffe8825 | ||
|
|
73ed8dc9c5 | ||
|
|
0bceda590c | ||
|
|
337d9ab662 | ||
|
|
207353de03 | ||
|
|
610a34cb52 | ||
|
|
1b2832743b | ||
|
|
79d5312cb8 | ||
|
|
6bbfc031fb | ||
|
|
8111351224 | ||
|
|
cbc728b249 | ||
|
|
eef222086f | ||
|
|
a0de3c660a | ||
|
|
97f046015c | ||
|
|
9fc6c5fae4 | ||
|
|
fa8ddc99e7 | ||
|
|
095cfcfd1e | ||
|
|
74841a9ff6 | ||
|
|
f3f53ae791 | ||
|
|
795ec510fd | ||
|
|
1365c83109 | ||
|
|
487448d611 | ||
|
|
560eef0a48 | ||
|
|
f195f6f7bc | ||
|
|
52024c24c8 | ||
|
|
ef2bff1a68 | ||
|
|
44c92faacf | ||
|
|
dc331337b7 | ||
|
|
86eefbab9b | ||
|
|
320b5f7336 | ||
|
|
74dfa34cee | ||
|
|
e8860a54ec | ||
|
|
b28112efc2 | ||
|
|
52d04631d9 | ||
|
|
8edbcb828a | ||
|
|
54233a330f | ||
|
|
15e1a00edd | ||
|
|
2b746892fc | ||
|
|
3731e376e3 | ||
|
|
6fd6c0c250 | ||
|
|
9a07a8226b | ||
|
|
6237446482 | ||
|
|
497fe23001 | ||
|
|
6a8195684a | ||
|
|
6b390dbd95 | ||
|
|
9f99ae3ca7 | ||
|
|
2f9ad84553 | ||
|
|
10541145e0 | ||
|
|
6235833e7f | ||
|
|
9dd5a21676 | ||
|
|
5b883a1396 | ||
|
|
cf5d8f9f58 | ||
|
|
82759121e6 | ||
|
|
cca923a235 | ||
|
|
dd5c984578 | ||
|
|
7b8fae22b1 | ||
|
|
5173e7f2ed | ||
|
|
de69b22dcc | ||
|
|
e34690836b | ||
|
|
feb35b4307 | ||
|
|
414e4fb433 | ||
|
|
4f5d37df6e | ||
|
|
19c350fdda | ||
|
|
cb88227146 | ||
|
|
3c27c45e7e | ||
|
|
bfd784467d | ||
|
|
a64cc6e274 | ||
|
|
de7b25ed7c | ||
|
|
0fd6cac574 | ||
|
|
3061c1085c | ||
|
|
5a81b419c3 | ||
|
|
fb08a2dc10 | ||
|
|
3d9361e2f1 | ||
|
|
79d3ee6565 | ||
|
|
2b7bd41b8b | ||
|
|
2a3b79a602 | ||
|
|
a4ac3a30e0 | ||
|
|
4cc290de28 | ||
|
|
f8d74757ef | ||
|
|
131225577e | ||
|
|
b8b32201ef | ||
|
|
de5469201a | ||
|
|
0f3f1f0ba7 | ||
|
|
4e7c27a980 | ||
|
|
ed019cad06 | ||
|
|
88701c2519 | ||
|
|
0f4db622f7 | ||
|
|
bfa6c6ac0e | ||
|
|
783bfc6583 | ||
|
|
6e6f9af12c | ||
|
|
4227b8a91e | ||
|
|
d4e76e0b0b | ||
|
|
00a858761c | ||
|
|
6e1992f811 | ||
|
|
99ba7be92d | ||
|
|
5ee3bc4d2f | ||
|
|
7a515b7ba4 | ||
|
|
b879c62442 | ||
|
|
2505e7f623 | ||
|
|
8608a716e6 | ||
|
|
607aaf4533 | ||
|
|
901c3d5063 | ||
|
|
8b01067b96 | ||
|
|
a20e26d645 | ||
|
|
8c7c95a410 | ||
|
|
f0146608ff | ||
|
|
6f11b50bee | ||
|
|
d9cc70168e | ||
|
|
4735ca7b97 | ||
|
|
2d24a61d7d | ||
|
|
41116562fd | ||
|
|
b153b90ce6 | ||
|
|
1058de5774 | ||
|
|
bc86a7d868 | ||
|
|
3eaf2908c4 | ||
|
|
f8d32835df | ||
|
|
1f0ec7feaf | ||
|
|
fded7e807a | ||
|
|
ddc82895ab | ||
|
|
4e0304e2a6 | ||
|
|
a1c2a9b700 | ||
|
|
4f998a16c3 | ||
|
|
49b37962e5 | ||
|
|
877ee4c55b | ||
|
|
9f2858e418 | ||
|
|
662b369663 | ||
|
|
9a2e088119 | ||
|
|
e0ae83d321 | ||
|
|
b13f1725f1 | ||
|
|
29f9b87128 | ||
|
|
b7ced3b501 | ||
|
|
6442ffa25a | ||
|
|
8dd860e570 | ||
|
|
6d36926b51 | ||
|
|
62c37b69f5 | ||
|
|
460510ef67 | ||
|
|
48887d5094 | ||
|
|
06752c3d70 | ||
|
|
f8e6246841 | ||
|
|
3bacc633f1 | ||
|
|
8631727ec3 | ||
|
|
861512d402 | ||
|
|
90db034671 | ||
|
|
3017bd7a94 | ||
|
|
63a53d6c18 | ||
|
|
a2282f51c6 | ||
|
|
6a8ba55bbf | ||
|
|
a40d5b49f2 | ||
|
|
fe1ea1167d | ||
|
|
1de058f6ec | ||
|
|
b6df5e1e1c | ||
|
|
4ed2ed49a8 | ||
|
|
149d31818f | ||
|
|
c703b89e1c | ||
|
|
58cc9aba20 | ||
|
|
425d4cabf5 | ||
|
|
df306e78bc | ||
|
|
30d1c046ff | ||
|
|
363a0dd425 | ||
|
|
62c43d25ee | ||
|
|
4a39d39331 | ||
|
|
f81c011e6a | ||
|
|
8b9c50b0fe | ||
|
|
93a3da2934 | ||
|
|
b671875bcc | ||
|
|
0ce2754a34 | ||
|
|
000299666d | ||
|
|
40bbb22487 | ||
|
|
9c796c228f | ||
|
|
1dba45f04a | ||
|
|
62b66036a6 | ||
|
|
fac123b983 | ||
|
|
cb731d9041 | ||
|
|
a9f6bd0a0c | ||
|
|
11db9059c5 | ||
|
|
1db995c887 | ||
|
|
756cc54e80 | ||
|
|
71aea89792 | ||
|
|
fe99eb9881 | ||
|
|
3458326d99 | ||
|
|
8c2349cb3e | ||
|
|
caf39fa7ca | ||
|
|
e21ed8355f | ||
|
|
55b62d72cb | ||
|
|
e727f60606 | ||
|
|
e81ae1a09c | ||
|
|
6b653a3650 | ||
|
|
afd2b05049 | ||
|
|
929e2ce59e | ||
|
|
4da8c75cc7 | ||
|
|
59402b7a7e | ||
|
|
96d25a2df9 | ||
|
|
5b85cc91a8 | ||
|
|
463bbd3fed | ||
|
|
045f131ba4 | ||
|
|
8dff33a481 | ||
|
|
0205ec8681 | ||
|
|
b5c7b0536d | ||
|
|
2e28989a09 | ||
|
|
712e78f144 | ||
|
|
7c7dddaf06 | ||
|
|
fb0c1a1b55 | ||
|
|
248826886a | ||
|
|
2cd8bd493c | ||
|
|
5f9f84f35c | ||
|
|
ec3cf75f9c | ||
|
|
ff8acf090c | ||
|
|
067d0e2264 | ||
|
|
c276a77d4e | ||
|
|
0b7a955343 | ||
|
|
ef113f7df7 | ||
|
|
b8af2aaa92 | ||
|
|
268e62d43b | ||
|
|
d3deac99fd | ||
|
|
4e158964d2 | ||
|
|
f21c42a3c7 | ||
|
|
70dfe79c2a | ||
|
|
0e22ad0258 | ||
|
|
bd4c3506dc | ||
|
|
2557af8e01 | ||
|
|
d261dc312a | ||
|
|
361ef45a0f | ||
|
|
e9b6bce8e6 | ||
|
|
a21d9ed0b5 | ||
|
|
055bf6156c | ||
|
|
164e8843a2 | ||
|
|
d21410cb70 | ||
|
|
f0b2190fe4 | ||
|
|
fce7faf54b | ||
|
|
4d18728234 | ||
|
|
7a85035e97 | ||
|
|
66c20e755b | ||
|
|
1d01d7c536 | ||
|
|
d022114498 | ||
|
|
a93d53c77a | ||
|
|
e5d732bc79 | ||
|
|
a776852a8a | ||
|
|
b5ca59d1fe | ||
|
|
801d1a6ac7 | ||
|
|
71304ee160 | ||
|
|
52a9d15fee | ||
|
|
d298c2a60f | ||
|
|
ea934efee7 | ||
|
|
f47df1449b | ||
|
|
8d3930560a | ||
|
|
829fab5508 | ||
|
|
611c2f7815 | ||
|
|
51ced760e5 | ||
|
|
cdee6dc105 | ||
|
|
23b3db2abd | ||
|
|
e7ba5621f7 | ||
|
|
54c460e2c9 | ||
|
|
0393fc4169 | ||
|
|
c375f3ae29 | ||
|
|
a9c8d7dac3 | ||
|
|
5e0cb36a65 | ||
|
|
d31fe6f9dd | ||
|
|
5ed2ab0f0d | ||
|
|
dc38c4a7c6 | ||
|
|
03c50115ad | ||
|
|
6068c7f73f | ||
|
|
597a199776 | ||
|
|
1262d1a0b7 | ||
|
|
9906f1a4e2 | ||
|
|
8b39248f96 | ||
|
|
6533332280 | ||
|
|
de2a5a3037 | ||
|
|
c8afeef782 | ||
|
|
bdb1fc5eb3 | ||
|
|
bb46f41eaa | ||
|
|
d11dd2d12c | ||
|
|
980727e1c1 | ||
|
|
4a5d72c92a | ||
|
|
d0efd008d8 | ||
|
|
e258b96b84 | ||
|
|
6bf06c985e | ||
|
|
f2f2730759 | ||
|
|
49c896b8ce | ||
|
|
c09895ef1c | ||
|
|
11b57c4f36 | ||
|
|
7746b8dc25 | ||
|
|
6e037dcdc0 | ||
|
|
bdcb49661c | ||
|
|
50e8f4c7e2 | ||
|
|
04ada17d5f | ||
|
|
6f2d3958f4 | ||
|
|
77ef9c5589 | ||
|
|
64fe1e2cd7 | ||
|
|
c4438afaa5 | ||
|
|
3a73312414 | ||
|
|
175173027d | ||
|
|
f3c4a061ce | ||
|
|
f1778562c3 | ||
|
|
bbef6a8f18 | ||
|
|
b97b7f2e5f | ||
|
|
b36ebadcb8 | ||
|
|
b9f7340c25 | ||
|
|
545e4832f6 | ||
|
|
0c53be8f10 | ||
|
|
ad700d6917 | ||
|
|
a8f3df3619 | ||
|
|
1f003a42c4 | ||
|
|
bf35ec11d3 | ||
|
|
08a2d6107f | ||
|
|
7685f24525 | ||
|
|
23404a8b56 | ||
|
|
30603d0097 | ||
|
|
13d4cb1065 | ||
|
|
6a141ff202 | ||
|
|
de6f70ce6c | ||
|
|
6ea670c16a | ||
|
|
436a818c2e | ||
|
|
e87a245e85 | ||
|
|
960b2ca65a | ||
|
|
e74130c19d | ||
|
|
7adc10b71e | ||
|
|
30d707036e | ||
|
|
611f625185 | ||
|
|
a36cd5b8ae | ||
|
|
d52a77e808 | ||
|
|
6898acb46f | ||
|
|
23d70a66bb | ||
|
|
bc53f1d82e | ||
|
|
3390b49c1f | ||
|
|
97b59bfc76 | ||
|
|
f714a0c648 | ||
|
|
4237310560 | ||
|
|
b98f46a914 | ||
|
|
4591a3e1cc | ||
|
|
ea898f4fc0 | ||
|
|
e4b418104d | ||
|
|
8e1d950644 | ||
|
|
bde63d9844 | ||
|
|
931b698b19 | ||
|
|
a394624538 | ||
|
|
ec0bc9977f | ||
|
|
eadbc76082 | ||
|
|
ef78eeab7a | ||
|
|
91f26e77a2 | ||
|
|
d9f2bd61ae | ||
|
|
a56cf914b8 | ||
|
|
43d9c09db7 | ||
|
|
1bb314f245 | ||
|
|
561d8eb3c0 | ||
|
|
bcb45a1be8 | ||
|
|
b6d0f67f2b | ||
|
|
7c779b237f | ||
|
|
3f7fa4133c | ||
|
|
8154a4f55c | ||
|
|
f006c41be8 | ||
|
|
be9333271d | ||
|
|
f4cc4529b8 | ||
|
|
38e6009fda | ||
|
|
cb9d7f18ed | ||
|
|
1b5d9daaa9 | ||
|
|
33328eabff | ||
|
|
67ce159da0 | ||
|
|
0313a8e00e | ||
|
|
5f626ae369 | ||
|
|
4cb44704de | ||
|
|
49c281dd79 | ||
|
|
8e06a4450f | ||
|
|
35e85c5fb4 | ||
|
|
7e69d5d838 | ||
|
|
e01ba19fce | ||
|
|
b8f43267ad | ||
|
|
ae92e59c89 | ||
|
|
6ad30d15a2 | ||
|
|
a7595025b7 | ||
|
|
aa638a864f | ||
|
|
e347537986 | ||
|
|
bf565cc256 | ||
|
|
b09122e1b3 | ||
|
|
c4025cb489 | ||
|
|
c6907dfe74 | ||
|
|
c32dd3eb93 | ||
|
|
2e4c544879 | ||
|
|
f3b6d3c2f4 | ||
|
|
b8c1b68519 | ||
|
|
c589252ea7 | ||
|
|
9ef85fe858 | ||
|
|
012cbafaaf | ||
|
|
2b5c0dfc80 | ||
|
|
ecfcbd8850 | ||
|
|
4464703b7b | ||
|
|
f655249b07 | ||
|
|
2dd8d239ce | ||
|
|
452500d391 | ||
|
|
eb58c60743 | ||
|
|
7913caee50 | ||
|
|
3fe7497df1 | ||
|
|
b721bf08f9 | ||
|
|
08eeac7cb8 | ||
|
|
6d918ca7b8 | ||
|
|
cd533d6f02 | ||
|
|
5509bf460c | ||
|
|
6fac619031 | ||
|
|
f0ea849072 | ||
|
|
45b2a36798 | ||
|
|
2a355705ff | ||
|
|
a6079d69ae | ||
|
|
1444af6533 | ||
|
|
84c1ae39a1 | ||
|
|
341267b37e | ||
|
|
5d112d0e37 | ||
|
|
5115791aa7 | ||
|
|
ae20e24fe2 | ||
|
|
e2421a0c92 | ||
|
|
c177fd6917 | ||
|
|
1e076fea5a | ||
|
|
8a0b0e7092 | ||
|
|
1db43196aa | ||
|
|
25c4a78767 | ||
|
|
713e7bcc2a | ||
|
|
ebef7e6031 | ||
|
|
c2fcb3279e | ||
|
|
1ba44572e6 | ||
|
|
2f73602883 | ||
|
|
da64267432 | ||
|
|
a63ac17513 | ||
|
|
3c5c0272d2 | ||
|
|
b2224d33d4 | ||
|
|
fe3945ccc3 | ||
|
|
117522969e | ||
|
|
b0a6736d05 | ||
|
|
ecbb1f1552 | ||
|
|
af603fcaf6 | ||
|
|
9e042a637b | ||
|
|
3998c7edb2 | ||
|
|
ce5acd750b | ||
|
|
769fc3d414 | ||
|
|
ca21d1b8cb | ||
|
|
49672724eb | ||
|
|
269c0db965 | ||
|
|
4644765090 | ||
|
|
6504493b61 | ||
|
|
1beb8ddf6e | ||
|
|
eff4ec3a1a | ||
|
|
43d3e56230 | ||
|
|
88d90743dc | ||
|
|
6a3c64326a | ||
|
|
52c954a27a | ||
|
|
c8089f54a5 | ||
|
|
64bf308e2f | ||
|
|
39f920f6f8 | ||
|
|
36e311c301 | ||
|
|
e421cb6dc3 | ||
|
|
b9ba65bc8d | ||
|
|
5c9af763bd | ||
|
|
1e779a7b86 | ||
|
|
b85a9e7a01 | ||
|
|
9c6fccd53c | ||
|
|
ff5508b313 | ||
|
|
d7b697870c | ||
|
|
f2213f807b | ||
|
|
a1a30e70b1 | ||
|
|
174f7f00d9 | ||
|
|
d84c4d90bf | ||
|
|
e05634d3f4 | ||
|
|
b8485cb369 | ||
|
|
a11166de6e | ||
|
|
04f488e349 | ||
|
|
0056a961db | ||
|
|
2cf606b1de | ||
|
|
ce921e209d | ||
|
|
533898e3a6 | ||
|
|
e86b8d81df | ||
|
|
003ef01a57 | ||
|
|
c83a2e081f | ||
|
|
01a3abf28f | ||
|
|
1d7233d44c | ||
|
|
ef34b915b0 | ||
|
|
defa4d28ce | ||
|
|
39ad1c56d2 | ||
|
|
bf672279c4 | ||
|
|
8f6057adb0 | ||
|
|
ecee1cfe2a | ||
|
|
1985a27579 | ||
|
|
474ee6f0a0 | ||
|
|
89b2601ec7 | ||
|
|
1c40b25cfa | ||
|
|
c2ec990c35 | ||
|
|
22e9abe2e0 | ||
|
|
3e9ef80e3e | ||
|
|
5b5409d2ef | ||
|
|
4907bf4b29 | ||
|
|
b99d926c0b | ||
|
|
db28c8bd8c | ||
|
|
5f0dd0dfa2 | ||
|
|
0f1ffc7532 | ||
|
|
be47c9a025 | ||
|
|
409bd6c3e3 | ||
|
|
fcb2ca4507 | ||
|
|
7dc63192c8 | ||
|
|
fe1329779c | ||
|
|
a93b50dd34 | ||
|
|
24920486cb | ||
|
|
8ccc64c009 | ||
|
|
7ac20d29af | ||
|
|
28e718d71e | ||
|
|
85b9d774fe | ||
|
|
272b921168 | ||
|
|
bde059ac3a | ||
|
|
cd6edc89a5 | ||
|
|
3a787897ab | ||
|
|
3760b359e8 | ||
|
|
520dce22c1 | ||
|
|
89e0cb04e8 | ||
|
|
7c2e3d9f39 | ||
|
|
ab7d368485 | ||
|
|
be47414c16 | ||
|
|
2ac70ebdd1 | ||
|
|
84c7722cf8 | ||
|
|
a557e4d111 | ||
|
|
34a1d7a19c | ||
|
|
6724466c84 | ||
|
|
03b4daab3c | ||
|
|
3d3b49da57 | ||
|
|
1d09eb4183 | ||
|
|
33132297e1 | ||
|
|
eaa0b466ac | ||
|
|
ee33ed946a | ||
|
|
74f1e20d13 | ||
|
|
15a2e4fc81 | ||
|
|
6ec660ba3e | ||
|
|
e08cad3f9e | ||
|
|
430c40c3b0 | ||
|
|
811f7f4361 | ||
|
|
27b6f70b91 | ||
|
|
4fcbd5511e | ||
|
|
aeee0ec8de | ||
|
|
2fd8da5b7c | ||
|
|
bc527fdd4d | ||
|
|
0e9e1e7900 | ||
|
|
c5216e122d | ||
|
|
0c7e900da8 | ||
|
|
30adbecc8c | ||
|
|
f60e4ea63e | ||
|
|
ccbfc16db5 | ||
|
|
585d8112c6 | ||
|
|
3316ee5ebd | ||
|
|
ef2bda65a1 | ||
|
|
bf9ef6372a | ||
|
|
29326ec381 | ||
|
|
90612c27fe | ||
|
|
022719529e | ||
|
|
db5d81677f | ||
|
|
cffb935b4f | ||
|
|
80d4b122b4 | ||
|
|
2376379772 | ||
|
|
03b645e791 | ||
|
|
2443f99f46 | ||
|
|
220940b2a5 | ||
|
|
4b2739bff0 | ||
|
|
0af1391496 | ||
|
|
047e0527f5 | ||
|
|
5f13a1ba46 | ||
|
|
3d3cb43243 | ||
|
|
cc9b5f8a40 | ||
|
|
c16cf37dd1 | ||
|
|
d7885aae48 | ||
|
|
d9c43b5738 | ||
|
|
38eb41a48d | ||
|
|
233ae3337f | ||
|
|
447aa4647c | ||
|
|
6c93c151c1 | ||
|
|
129860f6f4 | ||
|
|
29b8e0caf1 | ||
|
|
2ebde528a4 | ||
|
|
b4d551ff0a | ||
|
|
a4c68287d2 | ||
|
|
f5e8bdfd82 | ||
|
|
d44ac5fcd2 | ||
|
|
9579152326 | ||
|
|
74079390f6 | ||
|
|
a4dc03f736 | ||
|
|
2bcb499374 | ||
|
|
91981b44eb | ||
|
|
d87e785e6f | ||
|
|
b37de62121 | ||
|
|
55b96875b1 | ||
|
|
ec0012e822 | ||
|
|
befd779ed5 | ||
|
|
b55a0f7546 | ||
|
|
543f6ea66f | ||
|
|
7891ca8d78 | ||
|
|
059ed95cb2 | ||
|
|
28d45d566c | ||
|
|
42f0d22bfc | ||
|
|
6304264a03 | ||
|
|
bf6d102795 | ||
|
|
d18baa8406 | ||
|
|
8ac657b828 | ||
|
|
e2cca7dd3b | ||
|
|
f79f7bd03a | ||
|
|
22e37fc819 | ||
|
|
a7c40e0bd5 | ||
|
|
06287ca270 | ||
|
|
7832a9b13c | ||
|
|
1358f77b50 | ||
|
|
421fce40da | ||
|
|
5cb39d2897 | ||
|
|
87f1d5e547 | ||
|
|
e3b1c3cc53 | ||
|
|
27fdc6943b | ||
|
|
4c5b952af2 | ||
|
|
3a07d55e75 | ||
|
|
369a170813 | ||
|
|
dae7b1ccda | ||
|
|
de6ebed284 | ||
|
|
edc0297c0c | ||
|
|
e6f2e3fe64 | ||
|
|
24229ddb6e | ||
|
|
8c007d1114 | ||
|
|
33b7c99372 | ||
|
|
c9d58bd418 | ||
|
|
5b0d47678c | ||
|
|
fbcd141a39 | ||
|
|
720cde6573 | ||
|
|
1ff7796d57 | ||
|
|
bb4ee6bb2d | ||
|
|
48a6596297 | ||
|
|
199bbd9a9a | ||
|
|
4a49b9f027 | ||
|
|
f69490af58 | ||
|
|
784d43f297 | ||
|
|
f8057468b1 | ||
|
|
60b75e3e2e | ||
|
|
dc35228461 | ||
|
|
f6ae1a1149 | ||
|
|
64e9a0f330 | ||
|
|
85a923f736 | ||
|
|
7ccbfefe34 | ||
|
|
8c44d2e472 | ||
|
|
ff06eabffe | ||
|
|
306f8ea03e | ||
|
|
bf65d79c50 | ||
|
|
8fa9ec0b4a | ||
|
|
bf4b8dcb06 | ||
|
|
7a1bc8f73d | ||
|
|
5f6825a645 | ||
|
|
6928ee4bb4 | ||
|
|
ce23370713 | ||
|
|
4bad4b90d6 | ||
|
|
b55d268285 | ||
|
|
6bf5302da1 | ||
|
|
ac8984d050 | ||
|
|
a81c20a21c | ||
|
|
aa96c35bd5 | ||
|
|
46b382e0b3 | ||
|
|
4c44462e61 | ||
|
|
5e9d2d043a | ||
|
|
ce544d2dfc | ||
|
|
8c6604e5af | ||
|
|
b1b79ecae4 | ||
|
|
e690d48d0c | ||
|
|
8e1d931783 | ||
|
|
7128af8e49 | ||
|
|
f32511be6a | ||
|
|
fa06931985 | ||
|
|
78449a88fe | ||
|
|
87466969b8 | ||
|
|
5d0d626eef | ||
|
|
2fc28878fa | ||
|
|
6a1152fa93 | ||
|
|
62ac0b3371 | ||
|
|
688c96452e | ||
|
|
9f8de682fa | ||
|
|
9f6368b7a4 | ||
|
|
8b657c3042 | ||
|
|
72ccb4800c | ||
|
|
0992180581 | ||
|
|
696e927ae5 | ||
|
|
fbd70023ee | ||
|
|
55010d644b | ||
|
|
55ba1988a4 | ||
|
|
9398bef54d | ||
|
|
5d30f5cf5b | ||
|
|
19864cf269 | ||
|
|
0ab9186e3a | ||
|
|
97416e4402 | ||
|
|
8d07dab951 | ||
|
|
95f739fc39 | ||
|
|
0d7e685169 | ||
|
|
d615f34240 | ||
|
|
25214d36d3 | ||
|
|
8888d9fe5c | ||
|
|
d11bf77403 | ||
|
|
2178a55ca0 | ||
|
|
9829013c93 | ||
|
|
936b0b4851 | ||
|
|
9f341b131e | ||
|
|
4325c27968 | ||
|
|
257d2c9db2 | ||
|
|
4c6cbd285b | ||
|
|
e69f0adba5 | ||
|
|
f8812922ea | ||
|
|
b02ccb4ed9 | ||
|
|
6e494c2d3a | ||
|
|
d42d4943cd | ||
|
|
9b1d0d3a25 | ||
|
|
b9aacd68e9 | ||
|
|
8366f4d9d2 | ||
|
|
e56ea81f03 | ||
|
|
a79fcf9cd4 | ||
|
|
1c14ada868 | ||
|
|
6a8e2d9158 | ||
|
|
98e85b0ece | ||
|
|
0510e261df | ||
|
|
e35e3d99ef | ||
|
|
2219f2019e | ||
|
|
4501a1654e | ||
|
|
fc23e4950b | ||
|
|
400bf02856 | ||
|
|
b83a69a681 | ||
|
|
647c291d2f | ||
|
|
198e13d885 | ||
|
|
c259c484e2 | ||
|
|
9308355c04 | ||
|
|
c1a4d586b4 | ||
|
|
7efa63fe31 | ||
|
|
6b3c2cd8bb | ||
|
|
3b4482d0f1 | ||
|
|
1658a4c93a | ||
|
|
48e07444b6 | ||
|
|
69772acd67 | ||
|
|
7769bc888f | ||
|
|
1aa96afd07 | ||
|
|
0a32536fed | ||
|
|
ab1c30eac3 | ||
|
|
0142fe9fa3 | ||
|
|
1ef9744e04 | ||
|
|
329049ec55 | ||
|
|
b92135e6d9 | ||
|
|
4bba330516 | ||
|
|
f20af9d245 | ||
|
|
8438cd546b | ||
|
|
332d284415 | ||
|
|
3cb7d8862f | ||
|
|
e03388098e | ||
|
|
27116d7071 | ||
|
|
9a64ee07bf | ||
|
|
0ac4e70abc | ||
|
|
718d9a091a | ||
|
|
8714d76a0e | ||
|
|
766285e8f8 | ||
|
|
cfbea845a4 | ||
|
|
ff776efb98 | ||
|
|
67f7b0e0c6 | ||
|
|
5db3481b7e | ||
|
|
589999b40f | ||
|
|
45df7b0653 | ||
|
|
708984ef72 | ||
|
|
4438447ce3 | ||
|
|
7882539221 | ||
|
|
3ed4058ae2 | ||
|
|
8c3d6137b1 | ||
|
|
d49e70f48e | ||
|
|
31a5c01d2d | ||
|
|
2c91011697 | ||
|
|
0fb444b68f | ||
|
|
9a8df18286 | ||
|
|
025a6bf680 | ||
|
|
5a600048d5 | ||
|
|
57500524c5 | ||
|
|
4958f67ea2 | ||
|
|
617125cab2 | ||
|
|
b8de316dcf | ||
|
|
e677d89104 | ||
|
|
cbba7868bf | ||
|
|
5ae11c766b | ||
|
|
bdcd054a05 | ||
|
|
dd9b56f8cc | ||
|
|
9128e9bc55 | ||
|
|
7b3bd7426e | ||
|
|
e1fbb7dc46 | ||
|
|
c53d57a789 | ||
|
|
f9bcda56eb | ||
|
|
e55df63d04 | ||
|
|
307152cdba | ||
|
|
5a3d62b844 | ||
|
|
446152374e | ||
|
|
aa8275632a | ||
|
|
dc4f749a0b | ||
|
|
0decf2a651 | ||
|
|
2f71b29ae9 | ||
|
|
1e31b12caf | ||
|
|
7448483586 | ||
|
|
6952ba94c3 | ||
|
|
8e5d9a5e80 | ||
|
|
e5e1fb3dc6 | ||
|
|
4132167597 | ||
|
|
10cb625401 | ||
|
|
b90efc8bec | ||
|
|
12bee93df0 | ||
|
|
030a62d22e | ||
|
|
074ade93a1 | ||
|
|
787626e2e4 | ||
|
|
babd6114c3 | ||
|
|
bf72d5025d | ||
|
|
75e72761b5 | ||
|
|
3817b64bb7 | ||
|
|
f90599c788 | ||
|
|
8c3e5f0f06 | ||
|
|
4789f1e104 | ||
|
|
f792bf6cc7 | ||
|
|
7c8a1084fe | ||
|
|
d19251cf4d | ||
|
|
69d1b0f2d9 | ||
|
|
86a814cb1e | ||
|
|
f64d51a0cd | ||
|
|
deefadca1e | ||
|
|
46edb7bef5 | ||
|
|
2a7c11378c | ||
|
|
850d2005e5 | ||
|
|
85798e1c1c | ||
|
|
126da9fb5f | ||
|
|
62e128a960 | ||
|
|
bea5c8b524 | ||
|
|
1df3505d89 | ||
|
|
018cecf7e7 | ||
|
|
d9be40e342 | ||
|
|
e77c8cbc54 | ||
|
|
28ae80e284 | ||
|
|
9e19de62bb | ||
|
|
5f743f13c3 | ||
|
|
5a54fc2565 | ||
|
|
3490c47850 | ||
|
|
155667234d | ||
|
|
a941d90712 | ||
|
|
0b037dcc11 | ||
|
|
b079a8652a | ||
|
|
5479607695 | ||
|
|
473da760f0 | ||
|
|
427b887a47 | ||
|
|
dfc525c1f4 | ||
|
|
404a158791 | ||
|
|
618ea13715 | ||
|
|
921b9a49d0 | ||
|
|
6aad40af28 | ||
|
|
8cb497dac9 | ||
|
|
08bf8a08eb | ||
|
|
d45dfd667b | ||
|
|
fbe57418f9 | ||
|
|
89e99f10fa | ||
|
|
7e065208a9 | ||
|
|
830bae053f | ||
|
|
e5a7fbce4d | ||
|
|
8ecaaf1c45 | ||
|
|
e23faea2ba | ||
|
|
86a50e9601 | ||
|
|
3b0208b356 | ||
|
|
862c886ff6 | ||
|
|
93adb30012 | ||
|
|
cb71585079 | ||
|
|
3018f6789b | ||
|
|
82401f0ddd | ||
|
|
b2f122c4a2 | ||
|
|
cad905e2a3 | ||
|
|
d60edf987c | ||
|
|
2082e270bd | ||
|
|
d5aab6ae78 | ||
|
|
fbdac2d320 | ||
|
|
932637f67f | ||
|
|
b115a3ea73 | ||
|
|
ec7f9b00b3 | ||
|
|
842506a259 | ||
|
|
c3302ef55f | ||
|
|
74a69948b8 | ||
|
|
e395e98128 | ||
|
|
a0eac82f4e | ||
|
|
ddb6834a7c | ||
|
|
e33e684a0e | ||
|
|
824a517aed | ||
|
|
0871d47cee | ||
|
|
ecc757f40a | ||
|
|
4558b8ac4e | ||
|
|
86e425bcf6 | ||
|
|
90f5409642 | ||
|
|
131be4424f | ||
|
|
6856100bf4 | ||
|
|
4c63fd38da | ||
|
|
ec00e78362 | ||
|
|
b6e6a2674f | ||
|
|
0e070210e2 | ||
|
|
08cb6c4ab7 | ||
|
|
a3c6ea16a5 | ||
|
|
86718cec67 | ||
|
|
15a70502bb | ||
|
|
a78f94a4df | ||
|
|
58b414c975 | ||
|
|
95f19a3999 | ||
|
|
6b30b03811 | ||
|
|
77f2032458 | ||
|
|
f39ac3041c | ||
|
|
9f53a3e943 | ||
|
|
aa65b124d7 | ||
|
|
021f46ef3f | ||
|
|
de404b24db | ||
|
|
826a527951 | ||
|
|
49de9c88db | ||
|
|
a493edb48f | ||
|
|
48c6113f77 | ||
|
|
e358224217 | ||
|
|
252fdd0caf | ||
|
|
12e607e01c | ||
|
|
7e1094b510 | ||
|
|
4cdd51a2c6 | ||
|
|
3d7199fe29 | ||
|
|
5af709a762 | ||
|
|
bc38fad18c | ||
|
|
ca383cdd7d | ||
|
|
350483795b | ||
|
|
c143c14b63 | ||
|
|
6c3b11c191 | ||
|
|
e45526a37c | ||
|
|
a504cdedf8 | ||
|
|
2238637d94 | ||
|
|
0afd3e59ef | ||
|
|
715f48ed56 | ||
|
|
71e707f312 | ||
|
|
251ad8848d | ||
|
|
7ff8fbe093 | ||
|
|
cf14ee0a3d | ||
|
|
5787a47c47 | ||
|
|
db65ebeb1d | ||
|
|
4e399e26a2 | ||
|
|
3876c2d908 | ||
|
|
5addb31e91 | ||
|
|
2127ca44a8 | ||
|
|
1182f3edc0 | ||
|
|
2b2a43ed6d | ||
|
|
b2d244c646 | ||
|
|
e1955e8a03 | ||
|
|
5184f1f9fb | ||
|
|
c70f0d61e5 | ||
|
|
44f51c3e65 | ||
|
|
b600e20ba9 | ||
|
|
536ed6110a | ||
|
|
35e6e0f480 | ||
|
|
428b8eea58 | ||
|
|
08f090305c | ||
|
|
cd2c5d2335 | ||
|
|
174c7a0569 | ||
|
|
a288c99537 | ||
|
|
95cc4a2115 | ||
|
|
ba721e72f9 | ||
|
|
8e9ed082c9 | ||
|
|
25d8aa1fb3 | ||
|
|
9a5eda49a8 | ||
|
|
7daf764fa0 | ||
|
|
c54c4d8b09 | ||
|
|
2eeaf78fc5 | ||
|
|
af695aa3eb | ||
|
|
3f348cb00d | ||
|
|
411e9dc41d | ||
|
|
cdcade404b | ||
|
|
f1570e49a8 | ||
|
|
6dd3bbacc0 | ||
|
|
72357e9c37 | ||
|
|
837237c118 | ||
|
|
782f607dbb | ||
|
|
16f7ed699b | ||
|
|
54a3b088d7 | ||
|
|
5fee968c1a | ||
|
|
da6190fa1c | ||
|
|
9a9489031c | ||
|
|
4fd0bda3c8 | ||
|
|
40e84df411 | ||
|
|
55bb284219 | ||
|
|
c6c1d5406a | ||
|
|
75c29c1d6d | ||
|
|
de4f84bd63 | ||
|
|
1e6ec5e624 | ||
|
|
80b3da3e58 | ||
|
|
c6a2b8cab2 | ||
|
|
cc4837c45d | ||
|
|
82bbc77c26 | ||
|
|
1c6ee0ff8f | ||
|
|
ae9fb143c0 | ||
|
|
7f7d382961 | ||
|
|
67ab7c734a | ||
|
|
d964954f6f | ||
|
|
23729608d2 | ||
|
|
4349ab023c | ||
|
|
20d06c0de8 | ||
|
|
053cabf38c | ||
|
|
a590786541 | ||
|
|
3a6ebcf3d4 | ||
|
|
9124f788a3 | ||
|
|
58520f2f50 | ||
|
|
e1c31e21dd | ||
|
|
65ac90c094 | ||
|
|
29ff7bdbd8 | ||
|
|
23120fd88a | ||
|
|
07b911a5a3 | ||
|
|
9a441c0941 | ||
|
|
041450e0d7 | ||
|
|
c554001df3 | ||
|
|
c2fc5ad7b1 | ||
|
|
b8379e2245 | ||
|
|
0715ee97bd | ||
|
|
cd7485c246 | ||
|
|
53dfcb83b1 | ||
|
|
b77a6334d7 | ||
|
|
15acdf6b91 | ||
|
|
9641fd0c99 | ||
|
|
6ce7fa6687 | ||
|
|
e41be4a871 | ||
|
|
be7de7bdbd | ||
|
|
c3d9a4e6de | ||
|
|
e3f79a8db6 | ||
|
|
805374de71 | ||
|
|
6ce97965a1 | ||
|
|
5908363aca | ||
|
|
3cada0bfd2 | ||
|
|
c1a9868ead | ||
|
|
e6357fc992 | ||
|
|
822d861dae | ||
|
|
36f80431d3 | ||
|
|
23d1128c4b | ||
|
|
34106ec709 | ||
|
|
d2bcc3fd07 | ||
|
|
4ad09b9df3 | ||
|
|
5d7f8ce0fe | ||
|
|
8423e6a203 | ||
|
|
7489a81537 | ||
|
|
7d7dede526 | ||
|
|
0fcfe3f0d6 | ||
|
|
c09cd98075 | ||
|
|
308c31408a | ||
|
|
f44bcece2c | ||
|
|
aee47e8797 | ||
|
|
3cf8bf5642 | ||
|
|
2fb3da0747 | ||
|
|
5c9ae41380 | ||
|
|
563514f047 | ||
|
|
2e39974c54 | ||
|
|
b6f2c1450b | ||
|
|
3e730eca1c | ||
|
|
6dbe98d33a | ||
|
|
9370464cc9 | ||
|
|
6912c0e878 | ||
|
|
bbee85299a | ||
|
|
156e5aef27 | ||
|
|
2ba25c94c7 | ||
|
|
16f35c4b36 | ||
|
|
920d3d1157 | ||
|
|
eb4a73b6d7 | ||
|
|
90896934eb | ||
|
|
9ea9141baa | ||
|
|
d0638d5bf4 | ||
|
|
a1fa99188c | ||
|
|
52bf814192 | ||
|
|
f27d232e2f | ||
|
|
ca097146cf | ||
|
|
ed48677397 | ||
|
|
314940e7cf | ||
|
|
51610c4c6a | ||
|
|
c2daeaae6a | ||
|
|
c56bae8d58 | ||
|
|
207efbd12a | ||
|
|
f1577fcec1 | ||
|
|
f2860d96da | ||
|
|
ee30acbc15 | ||
|
|
bb8a971c90 | ||
|
|
ba235c421f | ||
|
|
deb17c7ebc | ||
|
|
13bd752369 | ||
|
|
6c07a62ae4 | ||
|
|
1eb541efae | ||
|
|
8778705380 | ||
|
|
bfa9164037 | ||
|
|
83bae10344 | ||
|
|
faa00fc75c | ||
|
|
4a086c4cb1 | ||
|
|
2be308b262 | ||
|
|
53f54e3a90 | ||
|
|
f553491001 | ||
|
|
ef737098b5 | ||
|
|
89c0085d08 | ||
|
|
cca2262c77 | ||
|
|
032bb68b4c | ||
|
|
489208f948 | ||
|
|
dc450caeb5 | ||
|
|
305ba20beb | ||
|
|
bc8f5aded3 | ||
|
|
09bbd7eb99 | ||
|
|
05487158cc | ||
|
|
471084ff23 | ||
|
|
ab4ee5d6f2 | ||
|
|
0d46ef46d7 | ||
|
|
7d5e7a0226 | ||
|
|
9ffdf2c5fa | ||
|
|
535c28f645 | ||
|
|
bd8dea5743 | ||
|
|
67577e7067 | ||
|
|
254eb7a9ea | ||
|
|
ba899ec7ca | ||
|
|
ecd20647dd | ||
|
|
205cb1336c | ||
|
|
615c388fcb | ||
|
|
b0148d46a4 | ||
|
|
ef64ada12f | ||
|
|
ff18a9b267 | ||
|
|
8f28c80583 | ||
|
|
c37b1308e9 | ||
|
|
4d950b7618 | ||
|
|
4adc7862b5 | ||
|
|
aa70bf9809 | ||
|
|
5b4da6f04b | ||
|
|
96166b2a4d | ||
|
|
90ddf0a72a | ||
|
|
8e985b8d05 | ||
|
|
0ef1269818 | ||
|
|
79dd3488b1 | ||
|
|
979d4d645f | ||
|
|
89c8a0e1d5 | ||
|
|
cec3191adc | ||
|
|
5159c5a434 | ||
|
|
e409ece6fd | ||
|
|
7245a3a9c7 | ||
|
|
16c65daea9 | ||
|
|
d6c9fba835 | ||
|
|
b47546aa22 | ||
|
|
040de83f5b | ||
|
|
7b44273121 | ||
|
|
5f2234ea3b | ||
|
|
24261ab269 | ||
|
|
d98785ada7 | ||
|
|
41a3744db2 | ||
|
|
38ef295bc2 | ||
|
|
9dfa6c976f | ||
|
|
e707e9a057 | ||
|
|
dd19f195ea | ||
|
|
96326a5855 | ||
|
|
a34a216f90 | ||
|
|
b4057e3820 | ||
|
|
91fc1357d3 | ||
|
|
698792275a | ||
|
|
bf6df4c2b6 | ||
|
|
c821a39f0c | ||
|
|
c55d5214ec | ||
|
|
50a59e2aca | ||
|
|
b495949b0d | ||
|
|
56ef3dbe65 | ||
|
|
b764d2a10e | ||
|
|
f3feaf499a | ||
|
|
977d965c12 | ||
|
|
ae598a1f0f | ||
|
|
5210925f87 | ||
|
|
21268e6e2b | ||
|
|
fed4efb566 | ||
|
|
526e8d13c1 | ||
|
|
42bf1481a1 | ||
|
|
61e6e17894 | ||
|
|
e3a9c07ed3 | ||
|
|
062cc88a6a | ||
|
|
a44a6ad2ee | ||
|
|
13f7421022 | ||
|
|
5e75106987 | ||
|
|
ba62cea775 | ||
|
|
3f85824875 | ||
|
|
08784df599 | ||
|
|
8a969abb27 | ||
|
|
8d56e989d4 | ||
|
|
c1e0c854f6 | ||
|
|
15c1f52b27 | ||
|
|
5f280420ef | ||
|
|
9952a3fd85 | ||
|
|
1a2a06a124 | ||
|
|
a35258fa47 | ||
|
|
ce3f45733c | ||
|
|
a3a43f6a12 | ||
|
|
eb30e03116 | ||
|
|
28cfb04490 | ||
|
|
0e4cb1a8c6 | ||
|
|
554167d123 | ||
|
|
d087249840 | ||
|
|
5ffcd27bab | ||
|
|
ad2bf1551b | ||
|
|
206c9357cb | ||
|
|
d6ca07e628 | ||
|
|
38bfad7513 | ||
|
|
87e0c39362 | ||
|
|
afb88ee4be | ||
|
|
81870e0c23 | ||
|
|
1beacde121 | ||
|
|
84faa40883 | ||
|
|
185dadcd6f | ||
|
|
0f8acc37dc | ||
|
|
ea6617554e | ||
|
|
7f95ebb6dd | ||
|
|
77846006a5 | ||
|
|
230944a5e3 | ||
|
|
8a96e1fe37 | ||
|
|
7b946d7b49 | ||
|
|
ca8fa1fb27 | ||
|
|
fd7801518e | ||
|
|
54c3ed5f1a | ||
|
|
e2305cb337 | ||
|
|
7933b824b9 | ||
|
|
1677a19db5 | ||
|
|
b3d6b2377a | ||
|
|
77f2f2c354 | ||
|
|
a83e665cbd | ||
|
|
ebfbf1fb67 | ||
|
|
d0fdf79477 | ||
|
|
de8d9e0d61 | ||
|
|
f0c500da5f | ||
|
|
3e34309fb4 | ||
|
|
804e6df160 | ||
|
|
2dbbc79a75 | ||
|
|
981ee99046 | ||
|
|
ab798d4234 | ||
|
|
1400837eef | ||
|
|
83922dcc50 | ||
|
|
3e5ecada8e | ||
|
|
6b5fd5d427 | ||
|
|
8f7f4cab42 | ||
|
|
1e0ac4315b | ||
|
|
33aaf369cf | ||
|
|
7b52af5d32 | ||
|
|
bc4100e4a1 | ||
|
|
d25b830f34 | ||
|
|
fcbd562dc3 | ||
|
|
26bf20de2b | ||
|
|
ac4768d90e | ||
|
|
1b7f810133 | ||
|
|
fa14c4c00b | ||
|
|
5a96bacdec | ||
|
|
30ac4e3ac9 | ||
|
|
fe5da597ce | ||
|
|
12917050c8 | ||
|
|
36aa6c99b5 | ||
|
|
d5306d9a49 | ||
|
|
91dd748c24 | ||
|
|
9d6f49423f | ||
|
|
d2ed16874f | ||
|
|
1355bd580d | ||
|
|
2f8607fc96 | ||
|
|
bf3a0afabb | ||
|
|
6d6aaea628 | ||
|
|
6fb37eeb63 | ||
|
|
e4e03e0ae2 | ||
|
|
a268b84849 | ||
|
|
a3fa5e444e | ||
|
|
12b1770e9d | ||
|
|
2aeb5456df | ||
|
|
a3c0f944dd | ||
|
|
b6783d1198 | ||
|
|
5d17abb6ef | ||
|
|
dc7474fcd7 | ||
|
|
5ff9570018 | ||
|
|
530797d61a | ||
|
|
689bde34bb | ||
|
|
66f1f037e4 | ||
|
|
1fe16bd579 | ||
|
|
5885ac0f08 | ||
|
|
3cde020044 | ||
|
|
4ad71d2e53 | ||
|
|
8625c68202 | ||
|
|
33e2fb78c8 | ||
|
|
72f7e56577 | ||
|
|
c4d9a10efc | ||
|
|
aac83e0c14 | ||
|
|
75c59c588c | ||
|
|
8fafa54940 | ||
|
|
448c4d51e8 | ||
|
|
cc72019e2b | ||
|
|
fb2703fb56 | ||
|
|
a69a8ead5d | ||
|
|
a798601680 | ||
|
|
eca6a139fd | ||
|
|
68246491a8 | ||
|
|
f01bb62bab | ||
|
|
dd14296700 | ||
|
|
d0c52cf732 | ||
|
|
3760ba2ecd | ||
|
|
c0c3122592 | ||
|
|
2abdb84ae8 | ||
|
|
fd550e460b | ||
|
|
90e6b81fb7 | ||
|
|
85b6d2c7d7 | ||
|
|
d537d5af93 | ||
|
|
d32cd37b25 | ||
|
|
5a74a66ef7 | ||
|
|
0d2feb4cf8 | ||
|
|
d040519780 | ||
|
|
6e4b1704b6 | ||
|
|
f01cfe98ae | ||
|
|
8915ced914 | ||
|
|
2ab6ae2b1c | ||
|
|
e61e069b20 | ||
|
|
c803cd8144 | ||
|
|
387228a838 | ||
|
|
d7b5abb6e6 | ||
|
|
4f914d8eee | ||
|
|
a598209a51 | ||
|
|
7b8fea5d40 | ||
|
|
713b2cfbb7 | ||
|
|
bcc894ba98 | ||
|
|
496bbae295 | ||
|
|
90465d2b02 | ||
|
|
bd0f857e6a | ||
|
|
7ab06863e7 | ||
|
|
0dc441a0e6 | ||
|
|
cebf7ec45d | ||
|
|
5a923fdf49 | ||
|
|
6f97ba44da | ||
|
|
0244f6886f | ||
|
|
db5220a015 | ||
|
|
6e6c214e59 | ||
|
|
15d9265b21 | ||
|
|
a81947aca4 | ||
|
|
3b00215b8b | ||
|
|
fe117e18df | ||
|
|
95e0ad68e9 | ||
|
|
616672fa59 | ||
|
|
1ebab7054a | ||
|
|
f4e6560b96 | ||
|
|
1ac989b998 | ||
|
|
db40b71a18 | ||
|
|
5b881e861d | ||
|
|
3ab460b01b | ||
|
|
25d703b906 | ||
|
|
e5db17fb7e | ||
|
|
4f02717ea3 | ||
|
|
a20393238b | ||
|
|
f91e282588 | ||
|
|
68e52273bc | ||
|
|
492b4fc4d5 | ||
|
|
6e92b9a9f8 | ||
|
|
b2fdbc18b6 | ||
|
|
46f4372fbf | ||
|
|
4f158ad275 | ||
|
|
fc540f6a3e | ||
|
|
aa9b8727db | ||
|
|
99f04bb2d0 | ||
|
|
086516a4a0 | ||
|
|
37d0bac7c9 | ||
|
|
0d329f7f4a | ||
|
|
bb68f998a7 | ||
|
|
918fba3e5e | ||
|
|
b9ffac184a | ||
|
|
5ccb6f02c4 | ||
|
|
58eb1c88a0 | ||
|
|
49236d812d | ||
|
|
7055d1f866 | ||
|
|
c84a2441b8 | ||
|
|
d330af8271 | ||
|
|
0eb2e9f129 | ||
|
|
21059df58b | ||
|
|
e0870e03db | ||
|
|
ebbca3dfa0 | ||
|
|
03058ea7a1 | ||
|
|
694adebd83 | ||
|
|
b6a9601e9f | ||
|
|
66287448b4 | ||
|
|
8e70389a31 | ||
|
|
94a824436a | ||
|
|
46f6df489e | ||
|
|
f64a6da55f | ||
|
|
8e959bcd98 | ||
|
|
617c6c9243 | ||
|
|
1111e855cb | ||
|
|
14e37ed52f | ||
|
|
c9c7bb441c | ||
|
|
19dd1f002a | ||
|
|
92fb84d946 | ||
|
|
1b7d3dae33 | ||
|
|
387dff9a60 | ||
|
|
1db07c4215 | ||
|
|
8f2507bbb2 | ||
|
|
d2aba8de87 | ||
|
|
0085ac9c7c | ||
|
|
e37fc6e647 | ||
|
|
9a9e68d526 | ||
|
|
a7306aa7ae | ||
|
|
b0cbe45d7d | ||
|
|
1877865e81 | ||
|
|
7bc527956c | ||
|
|
0782fe06f8 | ||
|
|
2dfe9e4170 | ||
|
|
2f08ccd6b4 | ||
|
|
0f88f5064f | ||
|
|
f746d46141 | ||
|
|
35c067d369 | ||
|
|
df7772e76e | ||
|
|
f6d3cadd7d | ||
|
|
4e831de35d | ||
|
|
a66892598f | ||
|
|
e29d431dfd | ||
|
|
1808946143 | ||
|
|
1766ebdf51 | ||
|
|
a3f2e72d94 | ||
|
|
ffab2b30d1 | ||
|
|
e14b1a8bf1 | ||
|
|
98d641ee52 | ||
|
|
41b555b577 | ||
|
|
3c2ee45cc9 | ||
|
|
01e3afd30d | ||
|
|
0c1a84f27c | ||
|
|
61ff38a301 | ||
|
|
599b37dd67 | ||
|
|
95542b82de | ||
|
|
b9a8492e08 | ||
|
|
620f888146 | ||
|
|
c6081913d2 | ||
|
|
bf29308a90 | ||
|
|
faa228c3d3 | ||
|
|
4f255e51ec | ||
|
|
8b9833449b | ||
|
|
6bdb95a826 | ||
|
|
53bca6a680 | ||
|
|
6fd089418d | ||
|
|
ce7eeed087 | ||
|
|
8dbf3868b2 | ||
|
|
a52ba5a646 | ||
|
|
2d49ca649a | ||
|
|
3798ef9e38 | ||
|
|
56cd453b52 | ||
|
|
ccebdeff66 | ||
|
|
0bdbcc30a0 | ||
|
|
5486aa9d4f | ||
|
|
c79f944fa8 | ||
|
|
38ca019add | ||
|
|
2ba7868e2a | ||
|
|
6e962500bf | ||
|
|
6d3149e6ff | ||
|
|
7d12839838 | ||
|
|
57872ce288 | ||
|
|
c30b21f835 | ||
|
|
b132ecf8c9 | ||
|
|
fb4e223f89 | ||
|
|
7f1fb3906a | ||
|
|
ae4496d591 | ||
|
|
73314557d2 | ||
|
|
e40bf973e3 | ||
|
|
f7991a26d2 | ||
|
|
03a1e00707 | ||
|
|
20ea694d12 | ||
|
|
3bb5fda2fd | ||
|
|
78cea01c88 | ||
|
|
ae2fb0b601 | ||
|
|
d980c361ba | ||
|
|
7c3b1adae7 | ||
|
|
606834d753 | ||
|
|
29faa9bdf3 | ||
|
|
7ebd7d73f3 | ||
|
|
249ea11fbb | ||
|
|
30fe922a0c | ||
|
|
145f07c175 | ||
|
|
39160c27e7 | ||
|
|
06cee33227 | ||
|
|
ca3e31c1e9 | ||
|
|
fcb794e057 | ||
|
|
9d233bf4d7 | ||
|
|
a487c1cad4 | ||
|
|
43ce8b45c7 | ||
|
|
ff1ee52708 | ||
|
|
a19d3bc476 | ||
|
|
3699b01799 | ||
|
|
31fb97ed3c | ||
|
|
576b514d3a | ||
|
|
7ed17d6f19 | ||
|
|
bcbd2fd209 | ||
|
|
ed1610916b | ||
|
|
6ddc00986f | ||
|
|
a24ea40d02 | ||
|
|
f573b62633 | ||
|
|
86ddff5966 | ||
|
|
3d31767dc0 | ||
|
|
6bdcd25730 | ||
|
|
dab3f46257 | ||
|
|
547860c4b1 | ||
|
|
b29a93eae1 | ||
|
|
2a76f26f94 | ||
|
|
df899d895f | ||
|
|
5fc26ffd74 | ||
|
|
2c4bc4e18d | ||
|
|
22b72b769d | ||
|
|
042561d245 | ||
|
|
2c3136146a | ||
|
|
71fe247a35 | ||
|
|
ae7adc6f8a | ||
|
|
3331455790 | ||
|
|
74c1bff8c5 | ||
|
|
0c84dbaef5 | ||
|
|
5e55b53e04 | ||
|
|
19ed2a7fb3 | ||
|
|
c3a438e34a | ||
|
|
794cb28a41 | ||
|
|
dea3a15e42 | ||
|
|
41f493d401 | ||
|
|
163aea7bf9 | ||
|
|
2e953a28a6 | ||
|
|
7acb7792bb | ||
|
|
e834e621c2 | ||
|
|
a15d067d9b | ||
|
|
06144f8704 | ||
|
|
e82186ce68 | ||
|
|
4c10215333 | ||
|
|
de43164550 | ||
|
|
98923f50e5 | ||
|
|
3fdff1e96b | ||
|
|
9e67199885 | ||
|
|
2e26fc7224 | ||
|
|
6863f025ee | ||
|
|
ad3140fa75 | ||
|
|
299f281baa | ||
|
|
d0a6e6c77b | ||
|
|
8dc5cc336b | ||
|
|
2fe3104253 | ||
|
|
b089d28af5 | ||
|
|
5d3473e1b3 | ||
|
|
03a1401c33 | ||
|
|
0a017c8541 | ||
|
|
5131ee2385 | ||
|
|
46d38ed8ff | ||
|
|
520a70fc3f | ||
|
|
0d0db5f14f | ||
|
|
9c3d5c4b5c | ||
|
|
2bdecbdc0c | ||
|
|
78fab2f3f1 | ||
|
|
e094ae6c8f | ||
|
|
3afcd9c938 | ||
|
|
2691569107 | ||
|
|
c1587fd3cd | ||
|
|
016d092ee0 | ||
|
|
2c5bc7d29e | ||
|
|
764c58693e | ||
|
|
4e98011b65 | ||
|
|
f94c443b2d | ||
|
|
4b0078d010 | ||
|
|
86f51ff271 | ||
|
|
8120ad3e65 | ||
|
|
1689b9c691 | ||
|
|
5842436b6c | ||
|
|
b859801a1b | ||
|
|
20340f735f | ||
|
|
82051c2398 | ||
|
|
cb89ffdcf3 | ||
|
|
e1e845a470 | ||
|
|
7b88251c7b | ||
|
|
a2296e9dc9 | ||
|
|
8d45712f49 | ||
|
|
12bcd2c0bc | ||
|
|
cc605597ed | ||
|
|
fa5f758b54 | ||
|
|
e1141bcea0 | ||
|
|
b28b4c8acd | ||
|
|
0ca612eca4 | ||
|
|
e5aa059678 | ||
|
|
57e225e0d9 | ||
|
|
55af9ac332 | ||
|
|
acf98e984e | ||
|
|
253921e53d | ||
|
|
37eca5459d | ||
|
|
1d4814abe5 | ||
|
|
9737e9810c | ||
|
|
5de60d4d6e | ||
|
|
44a05f1ffe | ||
|
|
6c61b32768 | ||
|
|
6bb8eac570 | ||
|
|
b20d79dbe6 | ||
|
|
728a6868e6 | ||
|
|
46f6277dfb | ||
|
|
517c8bc697 | ||
|
|
3789443485 | ||
|
|
c55f60a8b9 | ||
|
|
f7da863f9d | ||
|
|
d97d049e74 | ||
|
|
9f81aa2d20 | ||
|
|
7d5457b733 | ||
|
|
170f916252 | ||
|
|
d0c0950b89 | ||
|
|
32e759400d | ||
|
|
491e5b013c | ||
|
|
7ae82300a0 | ||
|
|
380a8c98be | ||
|
|
894e272727 | ||
|
|
fd759c68ed | ||
|
|
1da1b0a57c | ||
|
|
896b9b1732 | ||
|
|
b2c0d40966 | ||
|
|
fe401bfc8b | ||
|
|
bf9ccc4a79 | ||
|
|
b956b20b75 | ||
|
|
9c03bbdf1f | ||
|
|
c62218e358 | ||
|
|
224ab36160 | ||
|
|
1bf2c82d01 | ||
|
|
b18464fe0e | ||
|
|
f1c776eb4f | ||
|
|
9edaeb9dcf | ||
|
|
ec67e529cb | ||
|
|
f8ecdd907e | ||
|
|
2eb58f773a | ||
|
|
26b59ceaac | ||
|
|
1af31ef0d2 | ||
|
|
5263c58656 | ||
|
|
10af20343a | ||
|
|
edf54568ea | ||
|
|
1d63a9c4f4 | ||
|
|
14724edd0b | ||
|
|
02c67e5bb0 | ||
|
|
7509ca3dcf | ||
|
|
10cfbdb80f | ||
|
|
f721129a35 | ||
|
|
b943557671 | ||
|
|
69a18b910c | ||
|
|
ca041664df | ||
|
|
3242b849f0 | ||
|
|
0f7734825d | ||
|
|
19b1581281 | ||
|
|
335d273d2c | ||
|
|
c330ced690 | ||
|
|
5de058362e | ||
|
|
c2852610dd | ||
|
|
1c375f3a39 | ||
|
|
9045ac3f9d | ||
|
|
4513fd4f3a | ||
|
|
5cc6409b80 | ||
|
|
df921c8a48 | ||
|
|
e57f70a75b | ||
|
|
118b05add1 | ||
|
|
1d5196eca2 | ||
|
|
f4aca014ed | ||
|
|
7503c7fffe | ||
|
|
48599f4dd2 | ||
|
|
93e034fa9f | ||
|
|
c0ea46b8c5 | ||
|
|
5dca5acb96 | ||
|
|
d02fe5880b | ||
|
|
61d1e2e37f | ||
|
|
f10248f267 | ||
|
|
3fdc41ccb5 | ||
|
|
29d1705da5 | ||
|
|
e04e2a1973 | ||
|
|
781670a066 | ||
|
|
a57af599e6 | ||
|
|
397c8e4364 | ||
|
|
00bca40d89 | ||
|
|
27bd8d31c0 | ||
|
|
28ba0b2897 | ||
|
|
844feeae74 | ||
|
|
7a2a2af562 | ||
|
|
1a7702ee89 | ||
|
|
bcf234e4d2 | ||
|
|
9d6a7b80b6 | ||
|
|
42ca717884 | ||
|
|
fd97fa21fe | ||
|
|
bc8cc994e8 | ||
|
|
40a5dd81b4 | ||
|
|
866e496ad9 | ||
|
|
3becc6ecc7 | ||
|
|
4771d32c23 | ||
|
|
17e118b845 | ||
|
|
84441c4981 | ||
|
|
e03bff1802 | ||
|
|
a8d0ae47c7 | ||
|
|
5e45cf6b6b | ||
|
|
a2794d72ea | ||
|
|
00615012a4 | ||
|
|
c9defafe39 | ||
|
|
dfc7217efa | ||
|
|
420ec9fb66 | ||
|
|
01136d2737 | ||
|
|
7b3a6e2252 | ||
|
|
3bfd7bbf1d | ||
|
|
2d4479909f | ||
|
|
0c9674f75f | ||
|
|
5515096a6c | ||
|
|
311244556b | ||
|
|
1986ed13b6 | ||
|
|
de27dc9a8b | ||
|
|
5eb42e0b61 | ||
|
|
2dd672e103 | ||
|
|
4263673bd4 | ||
|
|
1c49d85ada | ||
|
|
e35b1d3ca7 | ||
|
|
c47db01028 | ||
|
|
2a15507845 | ||
|
|
f4077dc492 | ||
|
|
820f2f91dd | ||
|
|
7b2ad0e97c | ||
|
|
6f0423366c | ||
|
|
f1877e8f46 | ||
|
|
689d9606b9 | ||
|
|
6bfb3a36a8 | ||
|
|
39c179e511 | ||
|
|
9fb2513810 | ||
|
|
ebaf5f2609 | ||
|
|
5add2b9c2a | ||
|
|
f5e56b25df | ||
|
|
c419358455 |
@ -1,6 +0,0 @@
|
||||
node_modules/
|
||||
.temp/
|
||||
lib/
|
||||
dist/
|
||||
!.vuepress/
|
||||
!.*.js
|
||||
68
.eslintrc.js
68
.eslintrc.js
@ -1,68 +0,0 @@
|
||||
module.exports = {
|
||||
root: true,
|
||||
extends: 'vuepress',
|
||||
globals: {
|
||||
__VUEPRESS_VERSION__: 'readonly',
|
||||
__VUEPRESS_DEV__: 'readonly',
|
||||
__VUEPRESS_SSR__: 'readonly',
|
||||
__VUE_HMR_RUNTIME__: 'readonly',
|
||||
__VUE_OPTIONS_API__: 'readonly',
|
||||
__VUE_PROD_DEVTOOLS__: 'readonly',
|
||||
},
|
||||
overrides: [
|
||||
{
|
||||
files: ['*.ts', '*.vue'],
|
||||
extends: 'vuepress-typescript',
|
||||
parserOptions: {
|
||||
project: ['./tsconfig.json'],
|
||||
},
|
||||
rules: {
|
||||
'@typescript-eslint/ban-ts-comment': 'off',
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
'@typescript-eslint/no-non-null-assertion': 'off',
|
||||
'@typescript-eslint/no-var-requires': 'off',
|
||||
'vue/component-tags-order': [
|
||||
'error',
|
||||
{
|
||||
order: ['script', 'template', 'style'],
|
||||
},
|
||||
],
|
||||
'vue/multi-word-component-names': 'off',
|
||||
},
|
||||
},
|
||||
{
|
||||
files: ['*.vue'],
|
||||
globals: {
|
||||
defineEmits: 'readonly',
|
||||
defineProps: 'readonly',
|
||||
},
|
||||
rules: {
|
||||
// disable for setup script
|
||||
'@typescript-eslint/no-unused-vars': 'off',
|
||||
},
|
||||
},
|
||||
{
|
||||
files: ['clientAppEnhance.ts'],
|
||||
rules: {
|
||||
'vue/match-component-file-name': 'off',
|
||||
},
|
||||
},
|
||||
{
|
||||
files: ['**/__tests__/**/*.ts'],
|
||||
env: {
|
||||
jest: true,
|
||||
},
|
||||
rules: {
|
||||
'@typescript-eslint/explicit-function-return-type': 'off',
|
||||
'vue/one-component-per-file': 'off',
|
||||
'import/no-extraneous-dependencies': 'off',
|
||||
},
|
||||
},
|
||||
{
|
||||
files: ['docs/**'],
|
||||
rules: {
|
||||
'import/no-extraneous-dependencies': 'off',
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
||||
3
.gitattributes
vendored
3
.gitattributes
vendored
@ -4,7 +4,10 @@
|
||||
*.png binary
|
||||
*.jpg binary
|
||||
*.jpeg binary
|
||||
*.webp binary
|
||||
*.ico binary
|
||||
*.gif binary
|
||||
*.tff binary
|
||||
*.woff binary
|
||||
*.woff2 binary
|
||||
*.pdf binary
|
||||
|
||||
15
.github/FUNDING.yml
vendored
Normal file
15
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
# github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
# patreon: # Replace with a single Patreon username
|
||||
# open_collective: # Replace with a single Open Collective username
|
||||
# ko_fi: # Replace with a single Ko-fi username
|
||||
# tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
# community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
# liberapay: # Replace with a single Liberapay username
|
||||
# issuehunt: # Replace with a single IssueHunt username
|
||||
# lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
||||
# polar: # Replace with a single Polar username
|
||||
# buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
|
||||
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||
- https://theme-plume.vuejs.press/sponsor/
|
||||
73
.github/ISSUE_TEMPLATE/bug-report.yml
vendored
Normal file
73
.github/ISSUE_TEMPLATE/bug-report.yml
vendored
Normal file
@ -0,0 +1,73 @@
|
||||
name: Bug report
|
||||
description: Create a report to help us improve
|
||||
title: '[Bug] '
|
||||
labels:
|
||||
- bug
|
||||
assignees: pengzhanbo
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: checklist
|
||||
attributes:
|
||||
label: Checklist
|
||||
description: |-
|
||||
Make SURE that you follow these statements.
|
||||
options:
|
||||
- label: I am using **LTS** version of Node.js.
|
||||
required: true
|
||||
|
||||
- label: I am using the **latest v2 version** of VuePress and VuePress official plugins.
|
||||
required: true
|
||||
|
||||
- label: I am using the **latest version** of vuepress-theme-plume and all plugins in this repo.
|
||||
required: true
|
||||
|
||||
- label: I followed the docs and I double checked my configuration.
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: package
|
||||
attributes:
|
||||
label: Package name
|
||||
description: Which package are you reporting
|
||||
value: vuepress-theme-plume
|
||||
placeholder: package name
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: checkboxes
|
||||
id: operating-systems
|
||||
attributes:
|
||||
label: Which operating system are you using?
|
||||
description: You may select more than one. Don’t select anything if it's not about the environment.
|
||||
options:
|
||||
- label: macOS
|
||||
- label: Windows
|
||||
- label: Linux
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
## Describe the bug
|
||||
|
||||
> If applicable, add screenshots and log to help explain your problem.
|
||||
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: Describe the bug
|
||||
description: A clear and concise description of what the bug is.
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: reproduction
|
||||
attributes:
|
||||
label: Minimal reproduction
|
||||
description: |-
|
||||
If you are not reporting something obvious, a minimal reproduction repo and related log is required. you can fork [stackblitz.com](https://stackblitz.com/edit/vuepress-theme-plume-playground) to create a minimal reproduction.
|
||||
placeholder: reproduction repo url
|
||||
- type: textarea
|
||||
id: additional-context
|
||||
attributes:
|
||||
label: Additional context
|
||||
description: If you are not reporting something obvious, related log is required.
|
||||
placeholder: Add any other context about the problem here. Especially the issue occurs in certain OS, browser or configuration.
|
||||
73
.github/ISSUE_TEMPLATE/bug-report.zh-CN.yml
vendored
Normal file
73
.github/ISSUE_TEMPLATE/bug-report.zh-CN.yml
vendored
Normal file
@ -0,0 +1,73 @@
|
||||
name: 问题报告
|
||||
description: 创建一份问题报告以帮助我们改进
|
||||
title: '[Bug] '
|
||||
labels:
|
||||
- bug
|
||||
assignees: pengzhanbo
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: checklist
|
||||
attributes:
|
||||
label: 检查清单
|
||||
description: |-
|
||||
确保你遵循以下陈述。
|
||||
options:
|
||||
- label: 我正在使用**LTS**版本的Node.js。
|
||||
required: true
|
||||
|
||||
- label: 我正在使用 **最新 v2 版本** 的 VuePress 和 VuePress 官方插件。
|
||||
required: true
|
||||
|
||||
- label: 我正在使用此仓库中的 **最新版本** 的 vuepress-theme-plume 及其所有插件。
|
||||
required: true
|
||||
|
||||
- label: 我按照文档操作,并仔细检查了我的配置。
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: package
|
||||
attributes:
|
||||
label: 包名
|
||||
description: 您要报告哪个包
|
||||
value: vuepress-theme-plume
|
||||
placeholder: package name
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: checkboxes
|
||||
id: operating-systems
|
||||
attributes:
|
||||
label: 你正在使用哪个操作系统?
|
||||
description: 您可以选择多个选项。如果与环境无关,请不要选择任何选项。
|
||||
options:
|
||||
- label: macOS
|
||||
- label: Windows
|
||||
- label: Linux
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
## 描述该错误
|
||||
|
||||
> 如有需要,请添加截图和日志以帮助解释您的问题。
|
||||
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: 描述该错误
|
||||
description: 一个清晰简洁的错误描述。
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: reproduction
|
||||
attributes:
|
||||
label: 最小复现
|
||||
description: |-
|
||||
若非报告显而易见的问题,需提供最小化复现仓库及相关日志。你可通过 fork [stackblitz.com](https://stackblitz.com/edit/vuepress-theme-plume-playground) 来创建最小化复现环境。
|
||||
placeholder: 复现项目 url
|
||||
- type: textarea
|
||||
id: additional-context
|
||||
attributes:
|
||||
label: 附加上下文
|
||||
description: 如果你报告的问题不明显,需要提供相关日志。
|
||||
placeholder: 在此添加有关问题的其他上下文信息。特别是问题在特定操作系统、浏览器或配置下出现。
|
||||
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Questions about theme and plugins
|
||||
url: https://github.com/pengzhanbo/vuepress-theme-plume/discussions/new
|
||||
about: Please ask questions in Discussion.
|
||||
33
.github/ISSUE_TEMPLATE/feature-request.yml
vendored
Normal file
33
.github/ISSUE_TEMPLATE/feature-request.yml
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
name: Feature request
|
||||
description: Suggest an idea for this project
|
||||
title: '[Feature Request]'
|
||||
labels:
|
||||
- enhancement
|
||||
assignees: pengzhanbo
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: checklist
|
||||
attributes:
|
||||
label: Checklist
|
||||
description: Make sure that you follow these statements.
|
||||
options:
|
||||
- label: I searched existing issues and no one else requests similar feature.
|
||||
required: true
|
||||
|
||||
- label: I think that 25%+ users are positive towards this feature.
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: feature
|
||||
attributes:
|
||||
label: Describe the feature
|
||||
description: What's it for and why you want
|
||||
placeholder: A clear and concise description of what the feature is, and what it will enhance or solve. Ex. I'm always frustrated when [...]
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: additional-context
|
||||
attributes:
|
||||
label: Additional context
|
||||
placeholder: Add any other context or screenshots about the feature request here.
|
||||
33
.github/ISSUE_TEMPLATE/feature-request.zh-CN.yml
vendored
Normal file
33
.github/ISSUE_TEMPLATE/feature-request.zh-CN.yml
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
name: 新功能建议
|
||||
description: 为该项目提出一个想法
|
||||
title: '[Feature Request]'
|
||||
labels:
|
||||
- enhancement
|
||||
assignees: pengzhanbo
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: checklist
|
||||
attributes:
|
||||
label: 检查清单
|
||||
description: 确保遵循以下陈述。
|
||||
options:
|
||||
- label: 我搜索了现有问题,没有其他人请求类似功能。
|
||||
required: true
|
||||
|
||||
- label: 我认为25%以上的用户对此功能持积极态度。
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: feature
|
||||
attributes:
|
||||
label: 描述该功能
|
||||
description: 它有什么用,你为什么想要
|
||||
placeholder: 功能清晰简洁的描述,以及它将增强或解决的问题。例如,我总是感到困难,当 [...]
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: additional-context
|
||||
attributes:
|
||||
label: 附加上下文
|
||||
placeholder: 在此添加有关功能请求的任何其他上下文或截图。
|
||||
52
.github/workflows/docs-deploy.yaml
vendored
Normal file
52
.github/workflows/docs-deploy.yaml
vendored
Normal file
@ -0,0 +1,52 @@
|
||||
name: Deploy Docs
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
# 以下文件发生变化时触发部署,这些文件与版本无关,因此可以自动更新
|
||||
- docs/demos.md
|
||||
- docs/sponsor.md
|
||||
- CONTRIBUTING.md
|
||||
- CONTRIBUTING.en-US.md
|
||||
workflow_dispatch:
|
||||
workflow_call:
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
deploy-docs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 24
|
||||
cache: pnpm
|
||||
|
||||
- name: Install deps
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Build Packages
|
||||
run: pnpm build:package
|
||||
|
||||
- name: Docs build
|
||||
env:
|
||||
NODE_OPTIONS: --max_old_space_size=8192
|
||||
run: pnpm docs:build
|
||||
|
||||
- name: Deploy docs
|
||||
uses: JamesIves/github-pages-deploy-action@v4
|
||||
with:
|
||||
branch: gh-pages
|
||||
folder: docs/.vuepress/dist
|
||||
single-commit: true
|
||||
45
.github/workflows/example-layout-slots-deploy.yaml
vendored
Normal file
45
.github/workflows/example-layout-slots-deploy.yaml
vendored
Normal file
@ -0,0 +1,45 @@
|
||||
name: Deploy Example Layout Slots
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- v*
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
deploy-docs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 24
|
||||
cache: pnpm
|
||||
|
||||
- name: Install deps
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Build Packages
|
||||
run: pnpm build:package
|
||||
|
||||
- name: Docs build
|
||||
env:
|
||||
NODE_OPTIONS: --max_old_space_size=8192
|
||||
run: cd examples/layout-slots && pnpm docs:build
|
||||
|
||||
- name: Deploy docs
|
||||
uses: JamesIves/github-pages-deploy-action@v4
|
||||
with:
|
||||
branch: gh-pages-layout-slots
|
||||
folder: examples/layout-slots/docs/.vuepress/dist
|
||||
single-commit: true
|
||||
37
.github/workflows/lint.yaml
vendored
Normal file
37
.github/workflows/lint.yaml
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
name: Linter
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
pull_request:
|
||||
branches: [main]
|
||||
workflow_call:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 24
|
||||
cache: pnpm
|
||||
|
||||
- name: Install deps
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Linter
|
||||
run: |
|
||||
pnpm run lint:check
|
||||
pnpm run lint:css
|
||||
55
.github/workflows/release.yaml
vendored
Normal file
55
.github/workflows/release.yaml
vendored
Normal file
@ -0,0 +1,55 @@
|
||||
name: Release
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- v*
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
id-token: write
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
uses: ./.github/workflows/lint.yaml
|
||||
|
||||
test:
|
||||
uses: ./.github/workflows/test.yaml
|
||||
|
||||
release:
|
||||
if: github.repository == 'pengzhanbo/vuepress-theme-plume'
|
||||
needs: [test, lint]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
|
||||
- uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 24
|
||||
registry-url: https://registry.npmjs.org
|
||||
cache: pnpm
|
||||
|
||||
- name: Install deps
|
||||
run: pnpm install
|
||||
|
||||
- name: Update npm
|
||||
run: npm i -g npm@latest
|
||||
|
||||
- name: Build And Publish
|
||||
id: publish
|
||||
run: |
|
||||
pnpm build
|
||||
pnpm release:publish --no-git-checks
|
||||
pnpm release:sync
|
||||
|
||||
- run: npx changelogithub
|
||||
env:
|
||||
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
||||
|
||||
deploy:
|
||||
uses: ./.github/workflows/docs-deploy.yaml
|
||||
43
.github/workflows/test.yaml
vendored
Normal file
43
.github/workflows/test.yaml
vendored
Normal file
@ -0,0 +1,43 @@
|
||||
name: Test
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
pull_request:
|
||||
branches: [main]
|
||||
workflow_call:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
unit-test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 24
|
||||
cache: pnpm
|
||||
|
||||
- name: Install deps
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Unit Test
|
||||
env:
|
||||
NODE_OPTIONS: --max_old_space_size=8192
|
||||
run: pnpm run test
|
||||
|
||||
- name: Upload coverage
|
||||
if: github.ref == 'refs/heads/main'
|
||||
uses: codecov/codecov-action@v5
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
17
.gitignore
vendored
17
.gitignore
vendored
@ -1,13 +1,20 @@
|
||||
node_modules
|
||||
**/node_modules/
|
||||
|
||||
docs/.vuepress/.cache
|
||||
docs/.vuepress/.temp
|
||||
docs/.vuepress/dist
|
||||
**/.vuepress/.cache
|
||||
**/.vuepress/.temp
|
||||
**/.vuepress/dist
|
||||
|
||||
lib
|
||||
lib/
|
||||
dist/
|
||||
|
||||
.DS_Store
|
||||
|
||||
*.log
|
||||
*.tsbuildinfo
|
||||
.mind
|
||||
|
||||
coverage/
|
||||
.idea
|
||||
|
||||
.claude/
|
||||
!.claude/skills/
|
||||
|
||||
1
.husky/commit-msg
Executable file
1
.husky/commit-msg
Executable file
@ -0,0 +1 @@
|
||||
npx commitlint --edit $1
|
||||
1
.husky/pre-commit
Executable file
1
.husky/pre-commit
Executable file
@ -0,0 +1 @@
|
||||
npx lint-staged
|
||||
31
.markdownlint.json
Normal file
31
.markdownlint.json
Normal file
@ -0,0 +1,31 @@
|
||||
{
|
||||
"default": true,
|
||||
"heading-style": {
|
||||
"style": "atx"
|
||||
},
|
||||
"ul-style": {
|
||||
"style": "dash"
|
||||
},
|
||||
"no-duplicate-heading": false,
|
||||
"first-line-h1": false,
|
||||
"first-line-heading": false,
|
||||
"no-blanks-blockquote": false,
|
||||
"line-length": {
|
||||
"line_length": 140,
|
||||
"tables": false,
|
||||
"code_blocks": false
|
||||
},
|
||||
"no-inline-html": false,
|
||||
"hr-style": {
|
||||
"style": "---"
|
||||
},
|
||||
"fenced-code-language": false,
|
||||
"code-block-style": false,
|
||||
"emphasis-style": false,
|
||||
"no-hard-tabs": {
|
||||
"spaces_per_tab": 2,
|
||||
"ignore_code_languages": ["xml"]
|
||||
},
|
||||
"link-image-reference-definitions": false,
|
||||
"no-bare-urls": false
|
||||
}
|
||||
4
.markdownlintignore
Normal file
4
.markdownlintignore
Normal file
@ -0,0 +1,4 @@
|
||||
**/node_modules/**
|
||||
**/*.snippet.md
|
||||
CHANGELOG.*.md
|
||||
CHANGELOG.md
|
||||
7
.stylelintignore
Normal file
7
.stylelintignore
Normal file
@ -0,0 +1,7 @@
|
||||
node_modules
|
||||
|
||||
.cache
|
||||
.temp
|
||||
|
||||
lib
|
||||
dist
|
||||
8
.vscode/extensions.json
vendored
Normal file
8
.vscode/extensions.json
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"recommendations": [
|
||||
"vue.volar",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"stylelint.vscode-stylelint",
|
||||
"DavidAnson.vscode-markdownlint"
|
||||
]
|
||||
}
|
||||
29
.vscode/launch.json
vendored
Normal file
29
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "dev",
|
||||
"request": "launch",
|
||||
"type": "node-terminal",
|
||||
"command": "pnpm dev"
|
||||
},
|
||||
{
|
||||
"name": "build",
|
||||
"request": "launch",
|
||||
"type": "node-terminal",
|
||||
"command": "pnpm build"
|
||||
},
|
||||
{
|
||||
"name": "docs:dev",
|
||||
"type": "node-terminal",
|
||||
"request": "launch",
|
||||
"command": "pnpm docs:dev"
|
||||
},
|
||||
{
|
||||
"name": "docs:build",
|
||||
"type": "node-terminal",
|
||||
"request": "launch",
|
||||
"command": "pnpm docs:build"
|
||||
}
|
||||
]
|
||||
}
|
||||
79
.vscode/settings.json
vendored
79
.vscode/settings.json
vendored
@ -8,22 +8,85 @@
|
||||
"[markdown]": {
|
||||
"files.trimTrailingWhitespace": false
|
||||
},
|
||||
"[typescript]": {
|
||||
"editor.defaultFormatter": "vscode.typescript-language-features"
|
||||
},
|
||||
"css.validate": false,
|
||||
"scss.validate": false,
|
||||
"less.validate": false,
|
||||
"typescript.tsdk": "node_modules/typescript/lib",
|
||||
"stylelint.packageManager": "pnpm",
|
||||
"eslint.rules.customizations": [
|
||||
{ "rule": "style/*", "severity": "off" },
|
||||
{ "rule": "format/*", "severity": "off" },
|
||||
{ "rule": "*-indent", "severity": "off" },
|
||||
{ "rule": "*-spacing", "severity": "off" },
|
||||
{ "rule": "*-spaces", "severity": "off" },
|
||||
{ "rule": "*-order", "severity": "off" },
|
||||
{ "rule": "*-dangle", "severity": "off" },
|
||||
{ "rule": "*-newline", "severity": "off" },
|
||||
{ "rule": "*quotes", "severity": "off" },
|
||||
{ "rule": "*semi", "severity": "off" }
|
||||
],
|
||||
"editor.formatOnSave": false,
|
||||
"prettier.enable": false,
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.fixAll.stylelint": "explicit",
|
||||
"source.fixAll.eslint": "explicit",
|
||||
"source.fixAll.markdownlint": "explicit",
|
||||
"source.organizeImports": "never"
|
||||
},
|
||||
"editor.formatOnPaste": false,
|
||||
"eslint.validate": [
|
||||
"javascript",
|
||||
"javascriptreact",
|
||||
"typescript",
|
||||
"typescriptreact",
|
||||
"vue",
|
||||
"html",
|
||||
"markdown",
|
||||
"json",
|
||||
"jsonc",
|
||||
"yaml"
|
||||
],
|
||||
"stylelint.validate": [
|
||||
"css",
|
||||
"scss",
|
||||
"postcss",
|
||||
"vue"
|
||||
],
|
||||
"cSpell.words": [
|
||||
"caniuse",
|
||||
"composables",
|
||||
"Docsearch",
|
||||
"nprogress",
|
||||
"tsbuildinfo",
|
||||
"vite",
|
||||
"vuepress",
|
||||
"vueuse"
|
||||
"acfun",
|
||||
"bilibili",
|
||||
"bumpp",
|
||||
"caniuse",
|
||||
"colours",
|
||||
"commitlint",
|
||||
"composables",
|
||||
"Docsearch",
|
||||
"esbuild",
|
||||
"fontawesome",
|
||||
"frontmatter",
|
||||
"gsap",
|
||||
"iarna",
|
||||
"iconfont",
|
||||
"iconify",
|
||||
"katex",
|
||||
"leancloud",
|
||||
"nprogress",
|
||||
"pnpm",
|
||||
"portfinder",
|
||||
"qrcode",
|
||||
"shiki",
|
||||
"shikiji",
|
||||
"shikijs",
|
||||
"taze",
|
||||
"Tongji",
|
||||
"tsbuildinfo",
|
||||
"tsdown",
|
||||
"twoslash",
|
||||
"vite",
|
||||
"vuepress",
|
||||
"vueuse"
|
||||
]
|
||||
}
|
||||
|
||||
9550
CHANGELOG.BETA.md
Normal file
9550
CHANGELOG.BETA.md
Normal file
File diff suppressed because it is too large
Load Diff
2527
CHANGELOG.md
2527
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
111
CLAUDE.md
Normal file
111
CLAUDE.md
Normal file
@ -0,0 +1,111 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## Project Overview
|
||||
|
||||
vuepress-theme-plume is a VuePress 2 theme monorepo for building blogs, documentation, and knowledge bases.
|
||||
It includes a main theme, several plugins, a CLI tool, and example implementations.
|
||||
|
||||
## Commands
|
||||
|
||||
```bash
|
||||
# Install dependencies
|
||||
pnpm install
|
||||
|
||||
# Build all packages (required after clone, outputs to lib/)
|
||||
pnpm build
|
||||
|
||||
# Development - runs theme + docs dev servers concurrently
|
||||
pnpm dev
|
||||
|
||||
# Lint (eslint + stylelint)
|
||||
pnpm lint
|
||||
pnpm lint:fix # auto-fix
|
||||
|
||||
# Run tests (vitest)
|
||||
pnpm test
|
||||
|
||||
# Run a single test file
|
||||
pnpm test src/path/to/file.spec.ts
|
||||
|
||||
# Run tests related to changed files (for pre-commit)
|
||||
cross-env TZ=Etc/UTC vitest related --run
|
||||
|
||||
# Build docs only
|
||||
pnpm docs:build
|
||||
|
||||
# Serve docs locally
|
||||
pnpm docs:serve
|
||||
|
||||
# Release workflow
|
||||
pnpm release # runs lint + build + version bump + changelog + git commit
|
||||
```
|
||||
|
||||
## Monorepo Structure
|
||||
|
||||
```txt
|
||||
├── theme/ # Main VuePress theme (vuepress-theme-plume)
|
||||
├── plugins/ # VuePress plugins
|
||||
│ ├── plugin-search/ # Full-text fuzzy search
|
||||
│ ├── plugin-md-power/ # Markdown enhancements
|
||||
│ └── plugin-fonts/ # Special character font support
|
||||
├── cli/ # CLI tool (create project scaffolding)
|
||||
├── docs/ # Documentation site
|
||||
└── examples/ # Example implementations
|
||||
├── pure-blog/
|
||||
└── layout-slots/
|
||||
```
|
||||
|
||||
## Theme Architecture
|
||||
|
||||
The theme is organized into three layers:
|
||||
|
||||
- **`src/node/`** - Build-time code (runs during `vuepress build/dev`)
|
||||
- `prepare/` - Content preparation (frontmatter parsing, collection resolution)
|
||||
- `plugins/` - VuePress plugin registration
|
||||
- `config/` - Theme configuration handling
|
||||
- `autoFrontmatter/` - Automatic frontmatter generation
|
||||
|
||||
- **`src/client/`** - Client-side code (runs in browser)
|
||||
- `components/` - Vue components
|
||||
- `composables/` - Vue composables (outline, search, etc.)
|
||||
- `styles/` - CSS/SCSS styles
|
||||
- `features/` - Feature-specific components and logic
|
||||
|
||||
- **`src/shared/`** - Shared code (used by both node and client)
|
||||
- `frontmatter/` - Frontmatter schemas and utilities
|
||||
- `locale/` - i18n translations
|
||||
- `options.ts` - Theme options types
|
||||
- `features/` - Feature flags and shared feature logic
|
||||
|
||||
## Build Output
|
||||
|
||||
Each package uses [tsdown](https://tsdown.dev/) to compile TypeScript. Build output goes to `lib/`:
|
||||
|
||||
- `lib/node/` - Node-side exports
|
||||
- `lib/client/` - Client-side exports
|
||||
- `lib/shared/` - Shared exports
|
||||
|
||||
The `lib/` directory is gitignored and must be built with `pnpm build`.
|
||||
|
||||
## Testing
|
||||
|
||||
Tests use Vitest with coverage enabled. Test files are located at `**/__test__/**/*.spec.ts` and are excluded from coverage reports. Run tests with timezone fixed to UTC to ensure consistent results.
|
||||
|
||||
## Key Dependencies
|
||||
|
||||
- **VuePress**: v2.0.0-rc.28 with @vuepress/bundler-vite
|
||||
- **Vue**: ^3.5.30
|
||||
- **Shiki**: ^4.x for syntax highlighting
|
||||
- **VueUse**: ^14.x for composables
|
||||
- **markdown-it**: ^14.x for Markdown processing
|
||||
|
||||
## Development Notes
|
||||
|
||||
- Node.js 20.19.0+ required
|
||||
- pnpm catalogs are used for dependency management (`dev`, `peer`, `prod`, `vuepress`)
|
||||
- The theme depends on `vuepress-plugin-md-power` and `@vuepress-plume/plugin-search` as workspace dependencies
|
||||
- Some peer dependencies are optional (e.g., artplayer, dashjs, three.js)
|
||||
- Plugins (`plugins/*`) do not have dev commands — changes require `pnpm build` to take effect
|
||||
- The `lib/` directory is gitignored and must be rebuilt after `pnpm install`
|
||||
128
CODE_OF_CONDUCT.md
Normal file
128
CODE_OF_CONDUCT.md
Normal file
@ -0,0 +1,128 @@
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
We as members, contributors, and leaders pledge to make participation in our
|
||||
community a harassment-free experience for everyone, regardless of age, body
|
||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||
identity and expression, level of experience, education, socio-economic status,
|
||||
nationality, personal appearance, race, religion, or sexual identity
|
||||
and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||
diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to a positive environment for our
|
||||
community include:
|
||||
|
||||
* Demonstrating empathy and kindness toward other people
|
||||
* Being respectful of differing opinions, viewpoints, and experiences
|
||||
* Giving and gracefully accepting constructive feedback
|
||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||
and learning from the experience
|
||||
* Focusing on what is best not just for us as individuals, but for the
|
||||
overall community
|
||||
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
* The use of sexualized language or imagery, and sexual attention or
|
||||
advances of any kind
|
||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or email
|
||||
address, without their explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Community leaders are responsible for clarifying and enforcing our standards of
|
||||
acceptable behavior and will take appropriate and fair corrective action in
|
||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||
or harmful.
|
||||
|
||||
Community leaders have the right and responsibility to remove, edit, or reject
|
||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||
decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies within all community spaces, and also applies when
|
||||
an individual is officially representing the community in public spaces.
|
||||
Examples of representing our community include using an official e-mail address,
|
||||
posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported to the community leaders responsible for enforcement at
|
||||
q942450674@outlook.com.
|
||||
All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining
|
||||
the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||
unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing
|
||||
clarity around the nature of the violation and an explanation of why the
|
||||
behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series
|
||||
of actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No
|
||||
interaction with the people involved, including unsolicited interaction with
|
||||
those enforcing the Code of Conduct, for a specified period of time. This
|
||||
includes avoiding interactions in community spaces as well as external channels
|
||||
like social media. Violating these terms may lead to a temporary or
|
||||
permanent ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including
|
||||
sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public
|
||||
communication with the community for a specified period of time. No public or
|
||||
private interaction with the people involved, including unsolicited interaction
|
||||
with those enforcing the Code of Conduct, is allowed during this period.
|
||||
Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community
|
||||
standards, including sustained inappropriate behavior, harassment of an
|
||||
individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within
|
||||
the community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 2.0, available at
|
||||
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
||||
|
||||
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
||||
enforcement ladder](https://github.com/mozilla/diversity).
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at
|
||||
https://www.contributor-covenant.org/faq. Translations are available at
|
||||
https://www.contributor-covenant.org/translations.
|
||||
76
CONTRIBUTING.en-US.md
Normal file
76
CONTRIBUTING.en-US.md
Normal file
@ -0,0 +1,76 @@
|
||||
# Contribution Guide
|
||||
|
||||
## Overview
|
||||
|
||||
The project repository uses [pnpm workspaces](https://pnpm.io/zh/workspaces) to implement
|
||||
a [Monorepo](https://en.wikipedia.org/wiki/Monorepo), which stores multiple interrelated independent Packages.
|
||||
|
||||
- The theme is developed and maintained in the `theme` directory.
|
||||
- Plugins are developed and maintained in the `plugins` directory.
|
||||
- Documentation is developed and maintained in the `docs` directory.
|
||||
|
||||
In the `plugins` directory:
|
||||
|
||||
- `plugin-search`: Provides full-text fuzzy search functionality for the theme.
|
||||
- `plugin-md-power`: Provides enhanced markdown features.
|
||||
- `plugin-fonts`: Provides special character font support
|
||||
|
||||
## Development Configuration
|
||||
|
||||
Development requirements:
|
||||
|
||||
- [Node.js](http://nodejs.org/) version 20.19.0+
|
||||
- [pnpm](https://pnpm.io/zh/) version 9+
|
||||
|
||||
Clone the repository and install dependencies:
|
||||
|
||||
```sh
|
||||
pnpm install
|
||||
```
|
||||
|
||||
Before starting the development service for the first time, build the source code:
|
||||
|
||||
```sh
|
||||
pnpm build
|
||||
```
|
||||
|
||||
### Main Tools
|
||||
|
||||
- [TypeScript](https://www.typescriptlang.org/) as the development language.
|
||||
- [ESLint](https://eslint.org/) for code checking and formatting.
|
||||
- [StyleLint](https://stylelint.io/) for code checking and formatting.
|
||||
|
||||
### Scripts
|
||||
|
||||
#### `pnpm build`
|
||||
|
||||
The `build` command uses `tsc` to compile the source code into `.js` files in the `lib` directory.
|
||||
It also copies resources that do not need to be compiled to the corresponding `lib` directory.
|
||||
|
||||
After cloning the repository, you need to run this command first to ensure that the project code
|
||||
can run smoothly, as the compiled output directory is excluded from the repository by `.gitignore`.
|
||||
|
||||
#### `pnpm dev`
|
||||
|
||||
The `dev` command starts two services locally. One runs the `tsup:watch & copy:watch` for
|
||||
the `theme` directory, and the other runs the `vuepress` development service for the example `docs` directory.
|
||||
|
||||
By default, all plugins under the `plugins` directory do not have a `dev` command.
|
||||
Therefore, changes to the `plugins` directory may require running the `pnpm build` command to rebuild.
|
||||
Some changes to the `plugins/**/node` directory require re-running `pnpm dev` to take effect.
|
||||
|
||||
#### `pnpm lint`
|
||||
|
||||
The `lint` command uses ESLint to check all source files.
|
||||
|
||||
When `lint` reports errors, you can manually modify the source code to fix the ESLint errors, or run `pnpm lint:fix` to automatically fix them.
|
||||
|
||||
#### `pnpm test`
|
||||
|
||||
The `test` command uses Vitest to run all tests.
|
||||
|
||||
### IDE Support
|
||||
|
||||
It is recommended to use `vs code` for development. This repository is configured with
|
||||
the recommended `vs code` extensions for developing this theme. When you import this repository,
|
||||
`vs code` may recommend that you install some extensions.
|
||||
74
CONTRIBUTING.md
Normal file
74
CONTRIBUTING.md
Normal file
@ -0,0 +1,74 @@
|
||||
# 贡献指南
|
||||
|
||||
## 概览
|
||||
|
||||
项目仓库借助于 [pnpm 工作空间](https://pnpm.io/zh/workspaces) 来实现
|
||||
[Monorepo](https://en.wikipedia.org/wiki/Monorepo) ,存放了多个互相关联的独立 Package 。
|
||||
|
||||
- 主题于 `theme` 目录中进行开发维护。
|
||||
- 插件于 `plugins` 目录中进行开发维护。
|
||||
- 文档于 `docs` 目录中进行开发维护。
|
||||
|
||||
在 `plugins` 目录中:
|
||||
|
||||
- `plugin-search`: 为主题提供 全文模糊搜索 功能
|
||||
- `plugin-md-power`: 提供 markdown 增强功能
|
||||
- `plugin-fonts`: 提供特殊字符字体支持
|
||||
|
||||
## 开发配置
|
||||
|
||||
开发要求:
|
||||
|
||||
- [Node.js](http://nodejs.org/) version 20.19.0+
|
||||
- [pnpm](https://pnpm.io/zh/) version 9+
|
||||
|
||||
克隆代码仓库,并安装依赖:
|
||||
|
||||
```sh
|
||||
pnpm install
|
||||
```
|
||||
|
||||
在首次启动开发服务前,先构建源代码:
|
||||
|
||||
```sh
|
||||
pnpm build
|
||||
```
|
||||
|
||||
### 主要工具
|
||||
|
||||
- [TypeScript](https://www.typescriptlang.org/) 作为开发语言
|
||||
- [ESLint](https://eslint.org/) 用于代码检查和格式化
|
||||
- [StyleLint](https://stylelint.io/) 用于代码检查和格式化
|
||||
|
||||
### 脚本
|
||||
|
||||
#### `pnpm build`
|
||||
|
||||
`build` 命令使用 `tsc` 将源代码编译成 `lib` 目录下的 `.js` 文件。
|
||||
同时复制 不需要编译的资源到对应的`lib` 目录下。
|
||||
|
||||
你在克隆代码仓库后,需要先执行该命令来确保项目代码可以顺利运行,因为编译后的输出目录被 `.gitignore` 排除在仓库以外了。
|
||||
|
||||
#### `pnpm dev`
|
||||
|
||||
`dev` 命令会在本地开启两个服务,一个是运行 主题 `theme` 目录的 `tsup:watch & copy:watch`,
|
||||
一个是运行 示例 `docs` 目录的 `vuepress` 开发服务。
|
||||
|
||||
`plugins` 目录下的所有插件,默认都没有 `dev` 命令,因此,你对 `plugins` 下的改动,可能需要执行 `pnpm build` 命令
|
||||
进行重新构建,部分对 `plugins/**/node` 目录下的改动,需要重新执行 `pnpm dev` 才能生效。
|
||||
|
||||
#### `pnpm lint`
|
||||
|
||||
`lint` 命令使用 ESLint 来检查所有源文件。
|
||||
|
||||
当 `lint` 给出了错误时,你可以手动修改源码以修复 eslint 的报错。
|
||||
也可以执行 `pnpm lint:fix` 来自动修复。
|
||||
|
||||
#### `pnpm test`
|
||||
|
||||
`test` 命令使用 Vitest 来运行所有测试。
|
||||
|
||||
### IDE 支持
|
||||
|
||||
推荐使用 `vs code` 进行开发。本仓库配置了开发本主题时,推荐的 `vs code` 扩展,
|
||||
当你导入本仓库时,`vs code` 可能会推荐你安装一些扩展。
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (C) 2021 - PRESENT by pengzhanbo
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
12
SECURITY.md
Normal file
12
SECURITY.md
Normal file
@ -0,0 +1,12 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
| Version | Supported |
|
||||
| ---------------- | ------------------ |
|
||||
| >= 1.0.0-rc.190 | :white_check_mark: |
|
||||
| < 1.0.0-rc.190 | :x: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
Please [open an issue](https://github.com/pengzhanbo/vuepress-theme-plume/issues/new?assignees=pengzhanbo&title=%5BSecurity%5D).
|
||||
21
cli/LICENSE
Normal file
21
cli/LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (C) 2021 - PRESENT by pengzhanbo
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
14
cli/README.md
Normal file
14
cli/README.md
Normal file
@ -0,0 +1,14 @@
|
||||
# create-vuepress-theme-plume
|
||||
|
||||
The cli for create vuepress-theme-plume's project
|
||||
|
||||
## Usage
|
||||
|
||||
```sh
|
||||
# npm
|
||||
npm init vuepress-theme-plume@latest
|
||||
# pnpm
|
||||
pnpm create vuepress-theme-plume@latest
|
||||
# yarn
|
||||
yarn create vuepress-theme-plume@latest
|
||||
```
|
||||
2
cli/bin/index.js
Executable file
2
cli/bin/index.js
Executable file
@ -0,0 +1,2 @@
|
||||
#!/usr/bin/env node
|
||||
import '../lib/index.js'
|
||||
52
cli/package.json
Normal file
52
cli/package.json
Normal file
@ -0,0 +1,52 @@
|
||||
{
|
||||
"name": "create-vuepress-theme-plume",
|
||||
"type": "module",
|
||||
"version": "1.0.0-rc.196",
|
||||
"description": "The cli for create vuepress-theme-plume's project",
|
||||
"author": "pengzhanbo <q942450674@outlook.com> (https://github.com/pengzhanbo/)",
|
||||
"license": "MIT",
|
||||
"homepage": "https://theme-plume.vuejs.press/",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/pengzhanbo/vuepress-theme-plume.git",
|
||||
"directory": "cli"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/pengzhanbo/vuepress-theme-plume/issues"
|
||||
},
|
||||
"keywords": [
|
||||
"VuePress",
|
||||
"theme",
|
||||
"plume",
|
||||
"cli"
|
||||
],
|
||||
"bin": "./bin/index.js",
|
||||
"files": [
|
||||
"bin",
|
||||
"lib",
|
||||
"templates"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "tsdown --config-loader unrun"
|
||||
},
|
||||
"dependencies": {
|
||||
"@clack/prompts": "catalog:prod",
|
||||
"@pengzhanbo/utils": "catalog:prod",
|
||||
"cac": "catalog:prod",
|
||||
"handlebars": "catalog:prod",
|
||||
"nano-spawn": "catalog:prod",
|
||||
"os-locale": "catalog:prod",
|
||||
"picocolors": "catalog:prod",
|
||||
"sort-package-json": "catalog:prod"
|
||||
},
|
||||
"plume-deps": {
|
||||
"vuepress": "2.0.0-rc.28",
|
||||
"vue": "^3.5.32",
|
||||
"http-server": "^14.1.1",
|
||||
"typescript": "^5.9.3"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public",
|
||||
"provenance": true
|
||||
}
|
||||
}
|
||||
89
cli/src/constants.ts
Normal file
89
cli/src/constants.ts
Normal file
@ -0,0 +1,89 @@
|
||||
import type { Bundler, Langs, Options } from './types.js'
|
||||
|
||||
/**
|
||||
* Language options for VuePress configuration
|
||||
*
|
||||
* 语言选项,用于 VuePress 配置
|
||||
*/
|
||||
export const languageOptions: Options<Langs> = [
|
||||
{ label: 'English', value: 'en-US' },
|
||||
{ label: '简体中文', value: 'zh-CN' },
|
||||
]
|
||||
|
||||
/**
|
||||
* Bundler options for VuePress build tool
|
||||
*
|
||||
* 构建器选项,用于 VuePress 构建工具
|
||||
*/
|
||||
export const bundlerOptions: Options<Bundler> = [
|
||||
{ label: 'Vite', value: 'vite' },
|
||||
{ label: 'Webpack', value: 'webpack' },
|
||||
]
|
||||
|
||||
/**
|
||||
* Operation mode for VuePress CLI
|
||||
*
|
||||
* VuePress CLI 操作模式
|
||||
* @readonly
|
||||
* @enum {number}
|
||||
*/
|
||||
export enum Mode {
|
||||
/**
|
||||
* Initialize existing directory
|
||||
*
|
||||
* 初始化现有目录
|
||||
*/
|
||||
init,
|
||||
/**
|
||||
* Create new project
|
||||
*
|
||||
* 创建新项目
|
||||
*/
|
||||
create,
|
||||
}
|
||||
|
||||
/**
|
||||
* Deployment type for VuePress site
|
||||
*
|
||||
* VuePress 站点部署类型
|
||||
* @readonly
|
||||
* @enum {string}
|
||||
*/
|
||||
export enum DeployType {
|
||||
/**
|
||||
* GitHub Pages deployment
|
||||
*
|
||||
* GitHub Pages 部署
|
||||
*/
|
||||
github = 'github',
|
||||
/**
|
||||
* Vercel deployment
|
||||
*
|
||||
* Vercel 部署
|
||||
*/
|
||||
vercel = 'vercel',
|
||||
/**
|
||||
* Netlify deployment
|
||||
*
|
||||
* Netlify 部署
|
||||
*/
|
||||
netlify = 'netlify',
|
||||
/**
|
||||
* Custom deployment
|
||||
*
|
||||
* 自定义部署
|
||||
*/
|
||||
custom = 'custom',
|
||||
}
|
||||
|
||||
/**
|
||||
* Deployment options for hosting platforms
|
||||
*
|
||||
* 部署选项,用于托管平台
|
||||
*/
|
||||
export const deployOptions: Options<DeployType> = [
|
||||
{ label: 'Custom', value: DeployType.custom },
|
||||
{ label: 'GitHub Pages', value: DeployType.github },
|
||||
{ label: 'Vercel', value: DeployType.vercel },
|
||||
{ label: 'Netlify', value: DeployType.netlify },
|
||||
]
|
||||
165
cli/src/generate.ts
Normal file
165
cli/src/generate.ts
Normal file
@ -0,0 +1,165 @@
|
||||
import type { File, ResolvedData } from './types.js'
|
||||
import fs from 'node:fs'
|
||||
import path from 'node:path'
|
||||
import process from 'node:process'
|
||||
import spawn from 'nano-spawn'
|
||||
import { DeployType, Mode } from './constants.js'
|
||||
import { createPackageJson } from './packageJson.js'
|
||||
import { createRender } from './render.js'
|
||||
import { getTemplate, readFiles, readJsonFile, writeFiles } from './utils/index.js'
|
||||
|
||||
/**
|
||||
* Generate VuePress project files
|
||||
*
|
||||
* 生成 VuePress 项目文件
|
||||
*
|
||||
* @param mode - Operation mode (init or create) / 操作模式(初始化或创建)
|
||||
* @param data - Resolved configuration data / 解析后的配置数据
|
||||
* @param cwd - Current working directory / 当前工作目录
|
||||
*/
|
||||
export async function generate(
|
||||
mode: Mode,
|
||||
data: ResolvedData,
|
||||
cwd: string = process.cwd(),
|
||||
): Promise<void> {
|
||||
let userPkg: Record<string, any> = {}
|
||||
if (mode === Mode.init) {
|
||||
const pkgPath = path.join(cwd, 'package.json')
|
||||
if (fs.existsSync(pkgPath)) {
|
||||
userPkg = (await readJsonFile(pkgPath)) || {}
|
||||
}
|
||||
}
|
||||
|
||||
const fileList: File[] = [
|
||||
// add package.json
|
||||
await createPackageJson(mode, userPkg, data),
|
||||
// add docs files
|
||||
...await createDocsFiles(data),
|
||||
// add vuepress and theme-plume configs
|
||||
...updateFileListTarget(await readFiles(getTemplate('.vuepress')), `${data.docsDir}/.vuepress`),
|
||||
]
|
||||
|
||||
// add repo root files
|
||||
if (mode === Mode.create) {
|
||||
fileList.push(...await readFiles(getTemplate('common')))
|
||||
if (data.packageManager === 'pnpm') {
|
||||
fileList.push({
|
||||
filepath: '.npmrc',
|
||||
content: 'shamefully-hoist=true\nshell-emulator=true',
|
||||
})
|
||||
}
|
||||
if (data.packageManager === 'yarn') {
|
||||
const { output } = await spawn('yarn', ['--version'])
|
||||
if (output.startsWith('2')) {
|
||||
fileList.push({
|
||||
filepath: '.yarnrc.yml',
|
||||
content: 'nodeLinker: \'node-modules\'\n',
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// rewrite git files begin ==================================
|
||||
if (data.git) {
|
||||
const gitFiles = await readFiles(getTemplate('git'))
|
||||
if (mode === Mode.init) {
|
||||
const gitignorePath = path.join(cwd, '.gitignore')
|
||||
const docs = data.docsDir
|
||||
if (fs.existsSync(gitignorePath)) {
|
||||
const content = await fs.promises.readFile(gitignorePath, 'utf-8')
|
||||
fileList.push({
|
||||
filepath: '.gitignore',
|
||||
content: `${content}\n${docs}/.vuepress/.cache\n${docs}/.vuepress/.temp\n${docs}/.vuepress/dist\n`,
|
||||
})
|
||||
fileList.push(...gitFiles.filter(({ filepath }) => filepath !== '.gitignore'))
|
||||
}
|
||||
else {
|
||||
fileList.push(...gitFiles)
|
||||
}
|
||||
}
|
||||
else {
|
||||
fileList.push(...gitFiles)
|
||||
}
|
||||
}
|
||||
// rewrite git files end ====================================
|
||||
|
||||
if (data.packageManager === 'yarn') {
|
||||
fileList.push({
|
||||
filepath: '.yarnrc.yml',
|
||||
content: 'nodeLinker: \'node-modules\'\n',
|
||||
})
|
||||
}
|
||||
|
||||
if (data.deploy !== DeployType.custom) {
|
||||
fileList.push(...await readFiles(getTemplate(`deploy/${data.deploy}`)))
|
||||
}
|
||||
|
||||
const render = createRender(data)
|
||||
|
||||
const renderedFiles = fileList.map((file) => {
|
||||
if (file.filepath.endsWith('.handlebars'))
|
||||
file.content = render(file.content)
|
||||
|
||||
return file
|
||||
})
|
||||
|
||||
const ext = data.useTs ? '' : userPkg.type !== 'module' ? '.mjs' : '.js'
|
||||
const REG_EXT = /\.ts$/
|
||||
const output = mode === Mode.create ? path.join(cwd, data.root) : cwd
|
||||
await writeFiles(renderedFiles, output, (filepath) => {
|
||||
if (filepath.endsWith('.d.ts'))
|
||||
return filepath
|
||||
if (ext)
|
||||
return filepath.replace(REG_EXT, ext)
|
||||
return filepath
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Create documentation files based on configuration
|
||||
*
|
||||
* 根据配置创建文档文件
|
||||
*
|
||||
* @param data - Resolved configuration data / 解析后的配置数据
|
||||
* @returns Array of file objects / 文件对象数组
|
||||
*/
|
||||
async function createDocsFiles(data: ResolvedData): Promise<File[]> {
|
||||
const fileList: File[] = []
|
||||
if (data.multiLanguage) {
|
||||
const enDocs = await readFiles(getTemplate('docs/en'))
|
||||
const zhDocs = await readFiles(getTemplate('docs/zh'))
|
||||
|
||||
if (data.defaultLanguage === 'en-US') {
|
||||
fileList.push(...enDocs)
|
||||
fileList.push(...updateFileListTarget(zhDocs, 'zh'))
|
||||
}
|
||||
else {
|
||||
fileList.push(...zhDocs)
|
||||
fileList.push(...updateFileListTarget(enDocs, 'en'))
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (data.defaultLanguage === 'en-US')
|
||||
fileList.push(...await readFiles(getTemplate('docs/en')))
|
||||
else
|
||||
fileList.push(...await readFiles(getTemplate('docs/zh')))
|
||||
}
|
||||
|
||||
return updateFileListTarget(fileList, data.docsDir)
|
||||
}
|
||||
|
||||
/**
|
||||
* Update file list target path
|
||||
*
|
||||
* 更新文件列表的目标路径
|
||||
*
|
||||
* @param fileList - Array of files / 文件数组
|
||||
* @param target - Target directory path / 目标目录路径
|
||||
* @returns Updated file array / 更新后的文件数组
|
||||
*/
|
||||
function updateFileListTarget(fileList: File[], target: string): File[] {
|
||||
return fileList.map(({ filepath, content }) => ({
|
||||
filepath: path.join(target, filepath),
|
||||
content,
|
||||
}))
|
||||
}
|
||||
32
cli/src/index.ts
Normal file
32
cli/src/index.ts
Normal file
@ -0,0 +1,32 @@
|
||||
/**
|
||||
* VuePress Theme Plume CLI Entry Point
|
||||
*
|
||||
* VuePress Theme Plume CLI 入口文件
|
||||
*
|
||||
* This module provides command-line interface for creating and initializing
|
||||
* VuePress projects with vuepress-theme-plume.
|
||||
*
|
||||
* 本模块提供用于创建和初始化 VuePress 项目的命令行接口。
|
||||
*
|
||||
* @module cli
|
||||
*/
|
||||
import cac from 'cac'
|
||||
import { version } from '../package.json'
|
||||
import { Mode } from './constants.js'
|
||||
import { run } from './run.js'
|
||||
|
||||
const cli = cac('create-vuepress-theme-plume')
|
||||
|
||||
cli
|
||||
.command('[root]', 'create a new vuepress-theme-plume project / 创建新的 vuepress-theme-plume 项目')
|
||||
.action((root: string) => run(Mode.create, root))
|
||||
|
||||
cli
|
||||
.command('init [root]', 'Initial vuepress-theme-plume in the existing project / 在现有项目中初始化 vuepress-theme-plume')
|
||||
.action((root: string) => run(Mode.init, root))
|
||||
|
||||
cli.help()
|
||||
|
||||
cli.version(version)
|
||||
|
||||
cli.parse()
|
||||
30
cli/src/locales/en.ts
Normal file
30
cli/src/locales/en.ts
Normal file
@ -0,0 +1,30 @@
|
||||
import type { Locale } from '../types.js'
|
||||
|
||||
/**
|
||||
* English locale configuration for CLI prompts and messages.
|
||||
*
|
||||
* CLI 提示和消息的英语本地化配置。
|
||||
*/
|
||||
export const en: Locale = {
|
||||
'question.root': 'Where would you want to initialize VuePress?',
|
||||
'question.site.name': 'Site Name:',
|
||||
'question.site.description': 'Site Description:',
|
||||
'question.bundler': 'Select a bundler',
|
||||
'question.multiLanguage': 'Do you want to use multiple languages?',
|
||||
'question.defaultLanguage': 'Select the default language of the site',
|
||||
'question.useTs': 'Use TypeScript?',
|
||||
'question.injectNpmScripts': 'Inject npm scripts?',
|
||||
'question.deploy': 'Deploy type:',
|
||||
'question.git': 'Initialize a git repository?',
|
||||
'question.installDeps': 'Install dependencies?',
|
||||
|
||||
'spinner.start': '🚀 Creating...',
|
||||
'spinner.stop': '🎉 Create success!',
|
||||
'spinner.git': '📄 Initializing git repository...',
|
||||
'spinner.install': '📦 Installing dependencies...',
|
||||
'spinner.command': '🔨 Execute the following command to start:',
|
||||
|
||||
'hint.cancel': 'Operation cancelled.',
|
||||
'hint.root': 'The path cannot be an absolute path, and cannot contain the parent path.',
|
||||
'hint.root.illegal': 'Project names cannot contain special characters.',
|
||||
}
|
||||
17
cli/src/locales/index.ts
Normal file
17
cli/src/locales/index.ts
Normal file
@ -0,0 +1,17 @@
|
||||
import type { Langs, Locale } from '../types.js'
|
||||
import { en } from './en.js'
|
||||
import { zh } from './zh.js'
|
||||
|
||||
/**
|
||||
* Locale configurations for different languages.
|
||||
*
|
||||
* 不同语言的本地化配置。
|
||||
*
|
||||
* Maps language codes to their respective locale strings.
|
||||
*
|
||||
* 将语言代码映射到相应的本地化字符串。
|
||||
*/
|
||||
export const locales: Record<Langs, Locale> = {
|
||||
'zh-CN': zh,
|
||||
'en-US': en,
|
||||
}
|
||||
30
cli/src/locales/zh.ts
Normal file
30
cli/src/locales/zh.ts
Normal file
@ -0,0 +1,30 @@
|
||||
import type { Locale } from '../types.js'
|
||||
|
||||
/**
|
||||
* Chinese (Simplified) locale configuration for CLI prompts and messages.
|
||||
*
|
||||
* CLI 提示和消息的简体中文本地化配置。
|
||||
*/
|
||||
export const zh: Locale = {
|
||||
'question.root': '您想在哪里初始化 VuePress?',
|
||||
'question.site.name': '站点名称:',
|
||||
'question.site.description': '站点描述信息:',
|
||||
'question.bundler': '请选择打包工具',
|
||||
'question.multiLanguage': '是否使用多语言?',
|
||||
'question.defaultLanguage': '请选择站点默认语言',
|
||||
'question.useTs': '是否使用 TypeScript?',
|
||||
'question.injectNpmScripts': '是否注入 npm 脚本?',
|
||||
'question.deploy': '部署方式:',
|
||||
'question.git': '是否初始化 git 仓库?',
|
||||
'question.installDeps': '是否安装依赖?',
|
||||
|
||||
'spinner.start': '🚀 正在创建...',
|
||||
'spinner.stop': '🎉 创建成功!',
|
||||
'spinner.git': '📄 初始化 git 仓库...',
|
||||
'spinner.install': '📦 安装依赖...',
|
||||
'spinner.command': '🔨 执行以下命令即可启动:',
|
||||
|
||||
'hint.cancel': '操作已取消。',
|
||||
'hint.root': '文件路径不能是绝对路径,不能包含父路径。',
|
||||
'hint.root.illegal': '文件夹不能包含特殊字符。',
|
||||
}
|
||||
148
cli/src/packageJson.ts
Normal file
148
cli/src/packageJson.ts
Normal file
@ -0,0 +1,148 @@
|
||||
import type { File, ResolvedData } from './types.js'
|
||||
import { attemptAsync, kebabCase } from '@pengzhanbo/utils'
|
||||
import spawn from 'nano-spawn'
|
||||
import _sortPackageJson from 'sort-package-json'
|
||||
import { Mode } from './constants.js'
|
||||
import { readJsonFile, resolve } from './utils/index.js'
|
||||
|
||||
/**
|
||||
* Sort package.json fields in a consistent order.
|
||||
*
|
||||
* 按一致顺序排序 package.json 字段。
|
||||
*
|
||||
* @param json - Package.json object to sort / 要排序的 package.json 对象
|
||||
* @returns Sorted package.json object / 排序后的 package.json 对象
|
||||
*/
|
||||
function sortPackageJson(json: Record<any, any>) {
|
||||
return _sortPackageJson(json, {
|
||||
sortOrder: ['name', 'type', 'version', 'private', 'description', 'packageManager', 'author', 'license', 'scripts', 'devDependencies', 'dependencies', 'pnpm'],
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Create package.json file for VuePress project
|
||||
*
|
||||
* 为 VuePress 项目创建 package.json 文件
|
||||
*
|
||||
* @param mode - Operation mode (init or create) / 操作模式(初始化或创建)
|
||||
* @param pkg - Existing package.json data / 现有的 package.json 数据
|
||||
* @param data - Resolved configuration data / 解析后的配置数据
|
||||
* @param data.packageManager - Package manager to use / 要使用的包管理器
|
||||
* @param data.siteName - Site name / 站点名称
|
||||
* @param data.siteDescription - Site description / 站点描述
|
||||
* @param data.docsDir - Documentation directory path / 文档目录路径
|
||||
* @param data.bundler - Bundler to use / 要使用的打包器
|
||||
* @param data.injectNpmScripts - Whether to inject npm scripts / 是否注入 npm 脚本
|
||||
*
|
||||
* @returns File object with package.json content / 包含 package.json 内容的文件对象
|
||||
*/
|
||||
export async function createPackageJson(
|
||||
mode: Mode,
|
||||
pkg: Record<string, any>,
|
||||
{
|
||||
packageManager,
|
||||
docsDir,
|
||||
siteName,
|
||||
siteDescription,
|
||||
bundler,
|
||||
injectNpmScripts,
|
||||
}: ResolvedData,
|
||||
): Promise<File> {
|
||||
if (mode === Mode.create) {
|
||||
pkg.name = kebabCase(siteName)
|
||||
pkg.type = 'module'
|
||||
pkg.version = '1.0.0'
|
||||
pkg.description = siteDescription
|
||||
|
||||
if (packageManager !== 'npm') {
|
||||
let [, version] = await attemptAsync(getPackageManagerVersion, packageManager)
|
||||
if (version) {
|
||||
if (packageManager === 'yarn' && version.startsWith('1')) {
|
||||
version = '4.10.3'
|
||||
}
|
||||
pkg.packageManager = `${packageManager}@${version}`
|
||||
|
||||
// pnpm@10 should add `onlyBuiltDependencies`
|
||||
if (packageManager === 'pnpm' && version.startsWith('10')) {
|
||||
pkg.pnpm = {
|
||||
onlyBuiltDependencies: ['@parcel/watcher', 'esbuild'],
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const [, userInfo] = await attemptAsync(getUserInfo)
|
||||
if (userInfo) {
|
||||
pkg.author = userInfo.username + (userInfo.email ? ` <${userInfo.email}>` : '')
|
||||
}
|
||||
pkg.license = 'MIT'
|
||||
pkg.engines = { node: '^20.19.0 || >=22.0.0' }
|
||||
}
|
||||
|
||||
if (injectNpmScripts) {
|
||||
pkg.scripts ??= {}
|
||||
pkg.scripts = {
|
||||
...pkg.scripts,
|
||||
'docs:dev': `vuepress dev ${docsDir}`,
|
||||
'docs:dev-clean': `vuepress dev ${docsDir} --clean-cache --clean-temp`,
|
||||
'docs:build': `vuepress build ${docsDir} --clean-cache --clean-temp`,
|
||||
'docs:preview': `http-server ${docsDir}/.vuepress/dist`,
|
||||
}
|
||||
if (mode === Mode.create) {
|
||||
pkg.scripts['vp-update'] = `${packageManager === 'npm' ? 'npx' : `${packageManager} dlx`} vp-update`
|
||||
}
|
||||
}
|
||||
|
||||
pkg.devDependencies ??= {}
|
||||
|
||||
const hasDep = (dep: string) => pkg.devDependencies?.[dep] || pkg.dependencies?.[dep]
|
||||
|
||||
const context = (await readJsonFile(resolve('package.json')))!
|
||||
const meta = context['plume-deps']
|
||||
|
||||
pkg.devDependencies[`@vuepress/bundler-${bundler}`] = `${meta.vuepress}`
|
||||
pkg.devDependencies.vuepress = `${meta.vuepress}`
|
||||
pkg.devDependencies['vuepress-theme-plume'] = `${context.version}`
|
||||
|
||||
const deps: string[] = ['http-server']
|
||||
if (!hasDep('vue'))
|
||||
deps.push('vue')
|
||||
|
||||
deps.push('typescript')
|
||||
|
||||
for (const dep of deps)
|
||||
pkg.devDependencies[dep] = meta[dep]
|
||||
|
||||
return {
|
||||
filepath: 'package.json',
|
||||
content: JSON.stringify(sortPackageJson(pkg), null, 2),
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get user information from git global configuration.
|
||||
*
|
||||
* 从 git 全局配置获取用户信息。
|
||||
*
|
||||
* @returns User information object with username and email / 包含用户名和邮箱的用户信息对象
|
||||
* @throws Error if git command fails / 如果 git 命令失败则抛出错误
|
||||
*/
|
||||
async function getUserInfo() {
|
||||
const { output: username } = await spawn('git', ['config', '--global', 'user.name'])
|
||||
const { output: email } = await spawn('git', ['config', '--global', 'user.email'])
|
||||
return { username, email }
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the version of a package manager.
|
||||
*
|
||||
* 获取包管理器的版本。
|
||||
*
|
||||
* @param pkg - Package manager name (npm, yarn, pnpm) / 包管理器名称
|
||||
* @returns Version string of the package manager / 包管理器的版本字符串
|
||||
* @throws Error if package manager command fails / 如果包管理器命令失败则抛出错误
|
||||
*/
|
||||
async function getPackageManagerVersion(pkg: string) {
|
||||
const { output } = await spawn(pkg, ['--version'])
|
||||
return output
|
||||
}
|
||||
155
cli/src/prompt.ts
Normal file
155
cli/src/prompt.ts
Normal file
@ -0,0 +1,155 @@
|
||||
import type { Bundler, Langs, PromptResult } from './types.js'
|
||||
import { createRequire } from 'node:module'
|
||||
import process from 'node:process'
|
||||
import { cancel, confirm, group, select, text } from '@clack/prompts'
|
||||
import osLocale from 'os-locale'
|
||||
import { bundlerOptions, deployOptions, DeployType, languageOptions, Mode } from './constants.js'
|
||||
import { setLang, t } from './translate.js'
|
||||
|
||||
const require = createRequire(process.cwd())
|
||||
|
||||
const REG_DIR_CHAR = /[<>:"\\|?*[\]]/
|
||||
|
||||
/**
|
||||
* Prompt user for project configuration
|
||||
*
|
||||
* 提示用户输入项目配置
|
||||
*
|
||||
* @param mode - Operation mode (init or create) / 操作模式(初始化或创建)
|
||||
* @param root - Optional root directory path / 可选的根目录路径
|
||||
* @returns Resolved prompt result / 解析后的提示结果
|
||||
*/
|
||||
export async function prompt(mode: Mode, root?: string): Promise<PromptResult> {
|
||||
let hasTs = false
|
||||
if (mode === Mode.init) {
|
||||
try {
|
||||
hasTs = !!require.resolve('typescript')
|
||||
}
|
||||
catch {}
|
||||
}
|
||||
|
||||
const result: PromptResult = await group({
|
||||
displayLang: async () => {
|
||||
const locale = osLocale()
|
||||
|
||||
if (locale === 'zh-CN' || locale === 'zh-Hans') {
|
||||
setLang('zh-CN')
|
||||
return 'zh-CN'
|
||||
}
|
||||
|
||||
if (locale === 'en-US') {
|
||||
setLang('en-US')
|
||||
return 'en-US'
|
||||
}
|
||||
|
||||
const lang = await select<Langs>({
|
||||
message: 'Select a language to display / 选择显示语言',
|
||||
options: languageOptions,
|
||||
})
|
||||
|
||||
if (typeof lang === 'string')
|
||||
setLang(lang)
|
||||
|
||||
return lang
|
||||
},
|
||||
|
||||
root: async () => {
|
||||
if (root)
|
||||
return root
|
||||
const DEFAULT_ROOT = mode === Mode.init ? './docs' : './my-project'
|
||||
return await text({
|
||||
message: t('question.root'),
|
||||
placeholder: DEFAULT_ROOT,
|
||||
validate(value) {
|
||||
// not absolute path or parent path
|
||||
if (value?.startsWith('/') || value?.startsWith('..'))
|
||||
return t('hint.root')
|
||||
|
||||
// not contains illegal characters
|
||||
if (value && REG_DIR_CHAR.test(value))
|
||||
return t('hint.root.illegal')
|
||||
|
||||
return undefined
|
||||
},
|
||||
defaultValue: DEFAULT_ROOT,
|
||||
})
|
||||
},
|
||||
|
||||
siteName: () => text({
|
||||
message: t('question.site.name'),
|
||||
placeholder: 'My Vuepress Site',
|
||||
defaultValue: 'My Vuepress Site',
|
||||
}),
|
||||
|
||||
siteDescription: () => text({
|
||||
message: t('question.site.description'),
|
||||
}),
|
||||
|
||||
multiLanguage: () => confirm({
|
||||
message: t('question.multiLanguage'),
|
||||
initialValue: false,
|
||||
}),
|
||||
|
||||
defaultLanguage: () => select<Langs>({
|
||||
message: t('question.defaultLanguage'),
|
||||
options: languageOptions,
|
||||
}),
|
||||
|
||||
useTs: async () => {
|
||||
if (mode === Mode.init)
|
||||
return hasTs
|
||||
if (hasTs)
|
||||
return true
|
||||
return await confirm({
|
||||
message: t('question.useTs'),
|
||||
initialValue: true,
|
||||
})
|
||||
},
|
||||
|
||||
injectNpmScripts: async () => {
|
||||
if (mode === Mode.create)
|
||||
return true
|
||||
return await confirm({
|
||||
message: t('question.injectNpmScripts'),
|
||||
initialValue: true,
|
||||
})
|
||||
},
|
||||
|
||||
bundler: () => select<Bundler>({
|
||||
message: t('question.bundler'),
|
||||
options: bundlerOptions,
|
||||
}),
|
||||
|
||||
deploy: async () => {
|
||||
if (mode === Mode.init) {
|
||||
return DeployType.custom
|
||||
}
|
||||
return await select<DeployType>({
|
||||
message: t('question.deploy'),
|
||||
options: deployOptions,
|
||||
initialValue: DeployType.custom,
|
||||
})
|
||||
},
|
||||
|
||||
git: async () => {
|
||||
if (mode === Mode.init)
|
||||
return false
|
||||
return confirm({
|
||||
message: t('question.git'),
|
||||
initialValue: true,
|
||||
})
|
||||
},
|
||||
|
||||
install: () => confirm({
|
||||
message: t('question.installDeps'),
|
||||
initialValue: true,
|
||||
}),
|
||||
}, {
|
||||
onCancel: () => {
|
||||
cancel(t('hint.cancel'))
|
||||
process.exit(0)
|
||||
},
|
||||
})
|
||||
|
||||
return result
|
||||
}
|
||||
57
cli/src/render.ts
Normal file
57
cli/src/render.ts
Normal file
@ -0,0 +1,57 @@
|
||||
import type { ResolvedData } from './types.js'
|
||||
import { kebabCase } from '@pengzhanbo/utils'
|
||||
import handlebars from 'handlebars'
|
||||
|
||||
/**
|
||||
* Extended resolved data with additional rendering information
|
||||
*
|
||||
* 扩展的解析数据,包含额外的渲染信息
|
||||
*/
|
||||
export interface RenderData extends ResolvedData {
|
||||
/** Project name in kebab-case / 项目名称(kebab-case 格式) */
|
||||
name: string
|
||||
/** Site name / 网站名称 */
|
||||
siteName: string
|
||||
/** Locale configuration array / 语言配置数组 */
|
||||
locales: { path: string, lang: string, isEn: boolean, prefix: string }[]
|
||||
/** Whether default language is English / 默认语言是否为英语 */
|
||||
isEN: boolean
|
||||
}
|
||||
|
||||
handlebars.registerHelper('removeLeadingSlash', (path: string) => path.replace(/^\//, ''))
|
||||
handlebars.registerHelper('equal', (a: string, b: string) => a === b)
|
||||
|
||||
/**
|
||||
* Create render function with Handlebars template engine
|
||||
*
|
||||
* 使用 Handlebars 模板引擎创建渲染函数
|
||||
*
|
||||
* @param result - Resolved configuration data / 解析后的配置数据
|
||||
* @returns Render function that processes Handlebars templates / 处理 Handlebars 模板的渲染函数
|
||||
*/
|
||||
export function createRender(result: ResolvedData) {
|
||||
const data: RenderData = {
|
||||
...result,
|
||||
name: kebabCase(result.siteName),
|
||||
isEN: result.defaultLanguage === 'en-US',
|
||||
locales: result.defaultLanguage === 'en-US'
|
||||
? [
|
||||
{ path: '/', lang: 'en-US', isEn: true, prefix: 'en' },
|
||||
{ path: '/zh/', lang: 'zh-CN', isEn: false, prefix: 'zh' },
|
||||
]
|
||||
: [
|
||||
{ path: '/', lang: 'zh-CN', isEn: false, prefix: 'zh' },
|
||||
{ path: '/en/', lang: 'en-US', isEn: true, prefix: 'en' },
|
||||
],
|
||||
}
|
||||
return function render(source: string): string {
|
||||
try {
|
||||
const template = handlebars.compile(source)
|
||||
return template(data)
|
||||
}
|
||||
catch (e) {
|
||||
console.error(e)
|
||||
return source
|
||||
}
|
||||
}
|
||||
}
|
||||
97
cli/src/run.ts
Normal file
97
cli/src/run.ts
Normal file
@ -0,0 +1,97 @@
|
||||
import type { PromptResult, ResolvedData } from './types.js'
|
||||
import path from 'node:path'
|
||||
import process from 'node:process'
|
||||
import { intro, outro, spinner } from '@clack/prompts'
|
||||
import { sleep } from '@pengzhanbo/utils'
|
||||
import spawn from 'nano-spawn'
|
||||
import colors from 'picocolors'
|
||||
import { Mode } from './constants.js'
|
||||
import { generate } from './generate.js'
|
||||
import { prompt } from './prompt.js'
|
||||
import { t } from './translate.js'
|
||||
import { getPackageManager } from './utils/index.js'
|
||||
|
||||
/**
|
||||
* Run the CLI workflow for VuePress project initialization or creation
|
||||
*
|
||||
* 执行 VuePress 项目初始化或创建的 CLI 工作流程
|
||||
*
|
||||
* @param mode - Operation mode (init or create) / 操作模式(初始化或创建)
|
||||
* @param root - Root directory path / 根目录路径
|
||||
*/
|
||||
export async function run(mode: Mode, root?: string): Promise<void> {
|
||||
intro(colors.cyan('Welcome to VuePress and vuepress-theme-plume !'))
|
||||
|
||||
const result = await prompt(mode, root)
|
||||
const data = resolveData(result, mode)
|
||||
|
||||
const progress = spinner()
|
||||
progress.start(t('spinner.start'))
|
||||
|
||||
try {
|
||||
await generate(mode, data)
|
||||
}
|
||||
catch (e) {
|
||||
console.error(`${colors.red('generate files error: ')}\n`, e)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
// Delay for some time, I/O may not be completed yet,
|
||||
// executing subsequent tasks at this point may cause issues.
|
||||
await sleep(200)
|
||||
|
||||
const cwd = path.join(process.cwd(), data.root)
|
||||
if (data.git) {
|
||||
progress.message(t('spinner.git'))
|
||||
try {
|
||||
await spawn('git', ['init'], { cwd })
|
||||
}
|
||||
catch (e) {
|
||||
console.error(`${colors.red('git init error: ')}\n`, e)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
const pm = data.packageManager
|
||||
|
||||
if (data.install) {
|
||||
progress.message(t('spinner.install'))
|
||||
try {
|
||||
await spawn(pm, ['install'], { cwd })
|
||||
}
|
||||
catch (e) {
|
||||
console.error(`${colors.red('install dependencies error: ')}\n`, e)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
const cdCommand = mode === Mode.create ? colors.green(`cd ${data.root}`) : ''
|
||||
const runCommand = colors.green(`${pm} run docs:dev`)
|
||||
const installCommand = colors.green(`${pm} install`)
|
||||
|
||||
progress.stop(t('spinner.stop'))
|
||||
|
||||
if (mode === Mode.create) {
|
||||
outro(`${t('spinner.command')}
|
||||
${cdCommand}
|
||||
${data.install ? '' : `${installCommand} && `}${runCommand}`)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve prompt result into final configuration data.
|
||||
*
|
||||
* 将提示结果解析为最终配置数据。
|
||||
*
|
||||
* @param result - Prompt result from user input / 用户输入的提示结果
|
||||
* @param mode - Operation mode (init or create) / 操作模式(初始化或创建)
|
||||
* @returns Resolved configuration data / 解析后的配置数据
|
||||
*/
|
||||
function resolveData(result: PromptResult, mode: Mode): ResolvedData {
|
||||
return {
|
||||
...result,
|
||||
packageManager: getPackageManager(),
|
||||
docsDir: mode === Mode.create ? 'docs' : result.root.replace(/^\.\//, '').replace(/\/$/, ''),
|
||||
siteDescription: result.siteDescription || '',
|
||||
}
|
||||
}
|
||||
47
cli/src/translate.ts
Normal file
47
cli/src/translate.ts
Normal file
@ -0,0 +1,47 @@
|
||||
import type { Langs, Locale } from './types.js'
|
||||
import { locales } from './locales/index.js'
|
||||
|
||||
interface Translate {
|
||||
setLang: (lang: Langs) => void
|
||||
t: (key: keyof Locale) => string
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a translate instance with specified language
|
||||
*
|
||||
* 创建指定语言的翻译实例
|
||||
*
|
||||
* @param lang - Language code / 语言代码
|
||||
* @returns Translate interface / 翻译接口
|
||||
*/
|
||||
function createTranslate(lang?: Langs): Translate {
|
||||
let current: Langs = lang || 'en-US'
|
||||
|
||||
return {
|
||||
setLang: (lang) => {
|
||||
current = lang
|
||||
},
|
||||
t: key => locales[current][key],
|
||||
}
|
||||
}
|
||||
|
||||
const translate = createTranslate()
|
||||
|
||||
/**
|
||||
* Get translated string by key
|
||||
*
|
||||
* 根据键获取翻译后的字符串
|
||||
*
|
||||
* @param key - Locale key / 本地化键名
|
||||
* @returns Translated string / 翻译后的字符串
|
||||
*/
|
||||
export const t: Translate['t'] = translate.t
|
||||
|
||||
/**
|
||||
* Set current language
|
||||
*
|
||||
* 设置当前语言
|
||||
*
|
||||
* @param lang - Language code to set / 要设置的语言代码
|
||||
*/
|
||||
export const setLang: Translate['setLang'] = translate.setLang
|
||||
276
cli/src/types.ts
Normal file
276
cli/src/types.ts
Normal file
@ -0,0 +1,276 @@
|
||||
import type { DeployType } from './constants.js'
|
||||
|
||||
/**
|
||||
* Supported language codes for VuePress site
|
||||
*
|
||||
* VuePress 站点支持的语言代码
|
||||
*/
|
||||
export type Langs = 'zh-CN' | 'en-US'
|
||||
|
||||
/**
|
||||
* Locale configuration for CLI prompts and messages
|
||||
*
|
||||
* CLI 提示和消息的国际化配置
|
||||
*/
|
||||
export interface Locale {
|
||||
/**
|
||||
* Question: Project root directory name
|
||||
*
|
||||
* 问题:项目根目录名称
|
||||
*/
|
||||
'question.root': string
|
||||
/**
|
||||
* Question: Site name
|
||||
*
|
||||
* 问题:站点名称
|
||||
*/
|
||||
'question.site.name': string
|
||||
/**
|
||||
* Question: Site description
|
||||
*
|
||||
* 问题:站点描述
|
||||
*/
|
||||
'question.site.description': string
|
||||
/**
|
||||
* Question: Enable multi-language support
|
||||
*
|
||||
* 问题:启用多语言支持
|
||||
*/
|
||||
'question.multiLanguage': string
|
||||
/**
|
||||
* Question: Default language
|
||||
*
|
||||
* 问题:默认语言
|
||||
*/
|
||||
'question.defaultLanguage': string
|
||||
/**
|
||||
* Question: Build tool bundler
|
||||
*
|
||||
* 问题:构建工具
|
||||
*/
|
||||
'question.bundler': string
|
||||
/**
|
||||
* Question: Use TypeScript
|
||||
*
|
||||
* 问题:使用 TypeScript
|
||||
*/
|
||||
'question.useTs': string
|
||||
/**
|
||||
* Question: Inject npm scripts
|
||||
*
|
||||
* 问题:注入 npm 脚本
|
||||
*/
|
||||
'question.injectNpmScripts': string
|
||||
/**
|
||||
* Question: Initialize git repository
|
||||
*
|
||||
* 问题:初始化 git 仓库
|
||||
*/
|
||||
'question.git': string
|
||||
/**
|
||||
* Question: Deployment type
|
||||
*
|
||||
* 问题:部署类型
|
||||
*/
|
||||
'question.deploy': string
|
||||
/**
|
||||
* Question: Install dependencies
|
||||
*
|
||||
* 问题:安装依赖
|
||||
*/
|
||||
'question.installDeps': string
|
||||
|
||||
/**
|
||||
* Spinner: Start message
|
||||
*
|
||||
* 加载动画:开始消息
|
||||
*/
|
||||
'spinner.start': string
|
||||
/**
|
||||
* Spinner: Stop message
|
||||
*
|
||||
* 加载动画:停止消息
|
||||
*/
|
||||
'spinner.stop': string
|
||||
/**
|
||||
* Spinner: Git init message
|
||||
*
|
||||
* 加载动画:Git 初始化消息
|
||||
*/
|
||||
'spinner.git': string
|
||||
/**
|
||||
* Spinner: Install message
|
||||
*
|
||||
* 加载动画:安装消息
|
||||
*/
|
||||
'spinner.install': string
|
||||
/**
|
||||
* Spinner: Command hint message
|
||||
*
|
||||
* 加载动画:命令提示消息
|
||||
*/
|
||||
'spinner.command': string
|
||||
|
||||
/**
|
||||
* Hint: Cancel operation
|
||||
*
|
||||
* 提示:取消操作
|
||||
*/
|
||||
'hint.cancel': string
|
||||
/**
|
||||
* Hint: Root directory
|
||||
*
|
||||
* 提示:根目录
|
||||
*/
|
||||
'hint.root': string
|
||||
/**
|
||||
* Hint: Illegal root directory name
|
||||
*
|
||||
* 提示:非法的根目录名称
|
||||
*/
|
||||
'hint.root.illegal': string
|
||||
}
|
||||
|
||||
/**
|
||||
* Package manager types
|
||||
*
|
||||
* 包管理器类型
|
||||
*/
|
||||
export type PackageManager = 'npm' | 'yarn' | 'pnpm'
|
||||
|
||||
/**
|
||||
* Build tool bundler types
|
||||
*
|
||||
* 构建工具类型
|
||||
*/
|
||||
export type Bundler = 'vite' | 'webpack'
|
||||
|
||||
/**
|
||||
* Generic options type for CLI prompts
|
||||
*
|
||||
* CLI 提示的通用选项类型
|
||||
*
|
||||
* @template Value - The value type for options
|
||||
* @template Label - The label type for options
|
||||
*/
|
||||
export type Options<Value = string, Label = string> = { label: Label, value: Value }[]
|
||||
|
||||
/**
|
||||
* File structure for generated project
|
||||
*
|
||||
* 生成项目的文件结构
|
||||
*/
|
||||
export interface File {
|
||||
/**
|
||||
* File path relative to project root
|
||||
*
|
||||
* 相对于项目根目录的文件路径
|
||||
*/
|
||||
filepath: string
|
||||
/**
|
||||
* File content
|
||||
*
|
||||
* 文件内容
|
||||
*/
|
||||
content: string
|
||||
}
|
||||
|
||||
/**
|
||||
* Result from CLI prompts
|
||||
*
|
||||
* CLI 提示结果
|
||||
*/
|
||||
export interface PromptResult {
|
||||
/**
|
||||
* CLI display language
|
||||
*
|
||||
* CLI 显示语言
|
||||
*/
|
||||
displayLang: string
|
||||
/**
|
||||
* Project root directory name
|
||||
*
|
||||
* 项目根目录名称
|
||||
*/
|
||||
root: string
|
||||
/**
|
||||
* Site name
|
||||
*
|
||||
* 站点名称
|
||||
*/
|
||||
siteName: string
|
||||
/**
|
||||
* Site description
|
||||
*
|
||||
* 站点描述
|
||||
*/
|
||||
siteDescription: string
|
||||
/**
|
||||
* Build tool bundler
|
||||
*
|
||||
* 构建工具
|
||||
*/
|
||||
bundler: Bundler
|
||||
/**
|
||||
* Enable multi-language support
|
||||
*
|
||||
* 启用多语言支持
|
||||
*/
|
||||
multiLanguage: boolean
|
||||
/**
|
||||
* Default language
|
||||
*
|
||||
* 默认语言
|
||||
*/
|
||||
defaultLanguage: Langs
|
||||
/**
|
||||
* Use TypeScript
|
||||
*
|
||||
* 使用 TypeScript
|
||||
*/
|
||||
useTs: boolean
|
||||
/**
|
||||
* Inject npm scripts
|
||||
*
|
||||
* 注入 npm 脚本
|
||||
*/
|
||||
injectNpmScripts: boolean
|
||||
/**
|
||||
* Deployment type
|
||||
*
|
||||
* 部署类型
|
||||
*/
|
||||
deploy: DeployType
|
||||
/**
|
||||
* Initialize git repository
|
||||
*
|
||||
* 初始化 git 仓库
|
||||
*/
|
||||
git: boolean
|
||||
/**
|
||||
* Install dependencies
|
||||
*
|
||||
* 安装依赖
|
||||
*/
|
||||
install: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolved data after processing prompts
|
||||
*
|
||||
* 处理提示后的解析数据
|
||||
*/
|
||||
export interface ResolvedData extends PromptResult {
|
||||
/**
|
||||
* Selected package manager
|
||||
*
|
||||
* 选择的包管理器
|
||||
*/
|
||||
packageManager: PackageManager
|
||||
/**
|
||||
* Documentation directory name
|
||||
*
|
||||
* 文档目录名称
|
||||
*/
|
||||
docsDir: string
|
||||
}
|
||||
68
cli/src/utils/fs.ts
Normal file
68
cli/src/utils/fs.ts
Normal file
@ -0,0 +1,68 @@
|
||||
import type { File } from '../types.js'
|
||||
import fs from 'node:fs/promises'
|
||||
import path from 'node:path'
|
||||
|
||||
/**
|
||||
* Read all files from a directory recursively
|
||||
*
|
||||
* 递归读取目录下的所有文件
|
||||
*
|
||||
* @param root - Root directory path to read from / 要读取的根目录路径
|
||||
* @returns Array of file objects / 文件对象数组
|
||||
*/
|
||||
export async function readFiles(root: string): Promise<File[]> {
|
||||
const filepaths = await fs.readdir(root, { recursive: true })
|
||||
const files: File[] = []
|
||||
for (const file of filepaths) {
|
||||
const filepath = path.join(root, file)
|
||||
if ((await fs.stat(filepath)).isFile()) {
|
||||
files.push({
|
||||
filepath: file,
|
||||
content: await fs.readFile(filepath, 'utf-8'),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return files
|
||||
}
|
||||
|
||||
/**
|
||||
* Write files to target directory
|
||||
*
|
||||
* 将文件写入目标目录
|
||||
*
|
||||
* @param files - Array of file objects to write / 要写入的文件对象数组
|
||||
* @param target - Target directory path / 目标目录路径
|
||||
* @param rewrite - Optional function to rewrite file paths / 可选的文件路径重写函数
|
||||
*/
|
||||
export async function writeFiles(
|
||||
files: File[],
|
||||
target: string,
|
||||
rewrite?: (path: string) => string,
|
||||
): Promise<void> {
|
||||
for (const { filepath, content } of files) {
|
||||
let root = path.join(target, filepath).replace(/\.handlebars$/, '')
|
||||
if (rewrite)
|
||||
root = rewrite(root)
|
||||
await fs.mkdir(path.dirname(root), { recursive: true })
|
||||
await fs.writeFile(root, content)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Read and parse JSON file
|
||||
*
|
||||
* 读取并解析 JSON 文件
|
||||
*
|
||||
* @param filepath - Path to JSON file / JSON 文件路径
|
||||
* @returns Parsed JSON object or null if parsing fails / 解析后的 JSON 对象,解析失败返回 null
|
||||
*/
|
||||
export async function readJsonFile<T extends Record<string, any> = Record<string, any>>(filepath: string): Promise<T | null> {
|
||||
try {
|
||||
const content = await fs.readFile(filepath, 'utf-8')
|
||||
return JSON.parse(content)
|
||||
}
|
||||
catch {
|
||||
return null
|
||||
}
|
||||
}
|
||||
20
cli/src/utils/getPackageManager.ts
Normal file
20
cli/src/utils/getPackageManager.ts
Normal file
@ -0,0 +1,20 @@
|
||||
import type { PackageManager } from '../types.js'
|
||||
import process from 'node:process'
|
||||
|
||||
/**
|
||||
* Detect the current package manager from environment variables.
|
||||
*
|
||||
* 从环境变量检测当前使用的包管理器。
|
||||
*
|
||||
* @returns The detected package manager name / 检测到的包管理器名称
|
||||
* @example
|
||||
* // When using pnpm
|
||||
* const pm = getPackageManager() // returns 'pnpm'
|
||||
*
|
||||
* // When using npm
|
||||
* const pm = getPackageManager() // returns 'npm'
|
||||
*/
|
||||
export function getPackageManager(): PackageManager {
|
||||
const name = process.env?.npm_config_user_agent || 'npm'
|
||||
return name.split('/')[0] as PackageManager
|
||||
}
|
||||
27
cli/src/utils/index.ts
Normal file
27
cli/src/utils/index.ts
Normal file
@ -0,0 +1,27 @@
|
||||
import path from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
export const __dirname: string = path.dirname(fileURLToPath(import.meta.url))
|
||||
|
||||
/**
|
||||
* Resolve path relative to the project root
|
||||
*
|
||||
* 相对于项目根目录解析路径
|
||||
*
|
||||
* @param args - Path segments to resolve / 要解析的路径段
|
||||
* @returns Resolved absolute path / 解析后的绝对路径
|
||||
*/
|
||||
export const resolve = (...args: string[]): string => path.resolve(__dirname, '../', ...args)
|
||||
|
||||
/**
|
||||
* Get template directory path
|
||||
*
|
||||
* 获取模板目录路径
|
||||
*
|
||||
* @param dir - Subdirectory name within templates / templates 中的子目录名称
|
||||
* @returns Resolved template directory path / 解析后的模板目录路径
|
||||
*/
|
||||
export const getTemplate = (dir: string): string => resolve('templates', dir)
|
||||
|
||||
export * from './fs.js'
|
||||
export * from './getPackageManager.js'
|
||||
22
cli/templates/.vuepress/client.ts.handlebars
Normal file
22
cli/templates/.vuepress/client.ts.handlebars
Normal file
@ -0,0 +1,22 @@
|
||||
import { defineClientConfig } from 'vuepress/client'
|
||||
// import RepoCard from 'vuepress-theme-plume/features/RepoCard.vue'
|
||||
// import NpmBadge from 'vuepress-theme-plume/features/NpmBadge.vue'
|
||||
// import NpmBadgeGroup from 'vuepress-theme-plume/features/NpmBadgeGroup.vue'
|
||||
// import Swiper from 'vuepress-theme-plume/features/Swiper.vue'
|
||||
|
||||
// import CustomComponent from './theme/components/Custom.vue'
|
||||
|
||||
// import './theme/styles/custom.css'
|
||||
|
||||
export default defineClientConfig({
|
||||
enhance({ app }) {
|
||||
// built-in components
|
||||
// app.component('RepoCard', RepoCard)
|
||||
// app.component('NpmBadge', NpmBadge)
|
||||
// app.component('NpmBadgeGroup', NpmBadgeGroup)
|
||||
// app.component('Swiper', Swiper) // you should install `swiper`
|
||||
|
||||
// your custom components
|
||||
// app.component('CustomComponent', CustomComponent)
|
||||
},
|
||||
})
|
||||
124
cli/templates/.vuepress/collections.ts.handlebars
Normal file
124
cli/templates/.vuepress/collections.ts.handlebars
Normal file
@ -0,0 +1,124 @@
|
||||
/**
|
||||
* @see https://theme-plume.vuejs.press/guide/collection/ 查看文档了解配置详情。
|
||||
*
|
||||
* Collections 配置文件,它在 `.vuepress/plume.config.{{#if useTs}}ts{{else}}js{{/if}}` 中被导入。
|
||||
*
|
||||
* 请注意,你应该先在这里配置好 Collections,然后再启动 vuepress,主题会在启动 vuepress 时,
|
||||
* 读取这里配置的 Collections,然后在与 Collection 相关的 Markdown 文件中,自动生成 permalink。
|
||||
*
|
||||
* collection 的 type 为 `post` 时,表示为 文档列表类型(即没有侧边导航栏,有文档列表页)
|
||||
* 可用于实现如 博客、专栏 等以文章列表聚合形式的文档集合 (内容相对碎片化的)
|
||||
*
|
||||
* collection 的 type 为 `doc` 时,表示为文档类型(即有侧边导航栏)
|
||||
* 可用于实现如 笔记、知识库、文档等以侧边导航栏形式的文档集合 (内容强关联、成体系的)
|
||||
* 如果发现 侧边栏没有显示,那么请检查你的配置是否正确,以及 Markdown 文件中的 permalink
|
||||
* 是否是以对应的 Collection 配置的 link 的前缀开头。 是否展示侧边栏是根据 页面链接 的前缀 与 `collection.link`
|
||||
* 的前缀是否匹配来决定。
|
||||
*/
|
||||
|
||||
/**
|
||||
* 在受支持的 IDE 中会智能提示配置项。
|
||||
*
|
||||
* - `defineCollections` 是用于定义 collection 集合的帮助函数
|
||||
* - `defineCollection` 是用于定义单个 collection 配置的帮助函数
|
||||
*
|
||||
* 通过 `defineCollection` 定义的 collection 配置,应该填入 `defineCollections` 中
|
||||
*/
|
||||
import { defineCollection, defineCollections } from 'vuepress-theme-plume'
|
||||
|
||||
{{#if multiLanguage}}
|
||||
{{#each locales}}
|
||||
/* =================== locale: {{ lang }} ======================= */
|
||||
|
||||
const {{ prefix }}Blog = defineCollection({
|
||||
// post 类型,这里用于实现 博客功能
|
||||
type: 'post',
|
||||
// 文档集合所在目录,相对于 `docs{{ path }}`
|
||||
dir: 'blog',
|
||||
// 文档标题,它将用于在页面的面包屑导航中显示
|
||||
title: 'Blog',
|
||||
// 文章列表页的链接,如果 `linkPrefix` 未定义,它也将作为 相关的文章的 permalink 的前缀
|
||||
link: '/blog/',
|
||||
// linkPrefix: '/article/', // 相关文章的链接前缀
|
||||
// postList: true, // 是否启用文章列表页
|
||||
// tags: true, // 是否启用标签页
|
||||
// archives: true, // 是否启用归档页
|
||||
// categories: true, // 是否启用分类页
|
||||
// postCover: 'right', // 文章封面位置
|
||||
// pagination: 15, // 每页显示文章数量
|
||||
})
|
||||
|
||||
const {{ prefix }}DemoDoc = defineCollection({
|
||||
// doc 类型,该类型带有侧边栏
|
||||
type: 'doc',
|
||||
// 文档集合所在目录,相对于 `docs{{ path }}`
|
||||
dir: 'demo',
|
||||
// `dir` 所指向的目录中的所有 markdown 文件,其 permalink 需要以 `linkPrefix` 配置作为前缀
|
||||
// 如果 前缀不一致,则无法生成侧边栏。
|
||||
// 所以请确保 markdown 文件的 permalink 都以 `{{ path }}` + `linkPrefix` 开头
|
||||
linkPrefix: '/demo',
|
||||
// 文档标题,它将用于在页面的面包屑导航中显示
|
||||
title: 'Demo',
|
||||
// 手动配置侧边栏结构
|
||||
sidebar: ['', 'foo', 'bar'],
|
||||
// 根据文件结构自动生成侧边栏
|
||||
// sidebar: 'auto',
|
||||
})
|
||||
|
||||
/**
|
||||
* 导出所有的 collections
|
||||
* ({{ prefix }}Blog 为博客示例,如果不需要博客功能,请删除)
|
||||
* ({{ prefix }}DemoDoc 为参考示例,如果不需要它,请删除)
|
||||
*/
|
||||
export const {{ prefix }}Collections = defineCollections([
|
||||
{{ prefix }}Blog,
|
||||
{{ prefix }}DemoDoc,
|
||||
])
|
||||
|
||||
{{/each}}
|
||||
{{else}}
|
||||
const blog = defineCollection({
|
||||
// post 类型,这里用于实现 博客功能
|
||||
type: 'post',
|
||||
// 文档集合所在目录,相对于 `docs{{ path }}`
|
||||
dir: 'blog',
|
||||
// 文档标题,它将用于在页面的面包屑导航中显示
|
||||
title: 'Blog',
|
||||
// 文章列表页的链接,如果 `linkPrefix` 未定义,它也将作为 相关的文章的 permalink 的前缀
|
||||
link: '/blog/',
|
||||
// linkPrefix: '/article/', // 相关文章的链接前缀
|
||||
// postList: true, // 是否启用文章列表页
|
||||
// tags: true, // 是否启用标签页
|
||||
// archives: true, // 是否启用归档页
|
||||
// categories: true, // 是否启用分类页
|
||||
// postCover: 'right', // 文章封面位置
|
||||
// pagination: 15, // 每页显示文章数量
|
||||
})
|
||||
|
||||
const demoDoc = defineCollection({
|
||||
// doc 类型,该类型带有侧边栏
|
||||
type: 'doc',
|
||||
// 文档集合所在目录,相对于 `docs{{ path }}`
|
||||
dir: 'demo',
|
||||
// `dir` 所指向的目录中的所有 markdown 文件,其 permalink 需要以 `linkPrefix` 配置作为前缀
|
||||
// 如果 前缀不一致,则无法生成侧边栏。
|
||||
// 所以请确保 markdown 文件的 permalink 都以 `linkPrefix` 开头
|
||||
linkPrefix: '/demo',
|
||||
// 文档标题,它将用于在页面的面包屑导航中显示
|
||||
title: 'Demo',
|
||||
// 手动配置侧边栏结构
|
||||
sidebar: ['', 'foo', 'bar'],
|
||||
// 根据文件结构自动生成侧边栏
|
||||
// sidebar: 'auto',
|
||||
})
|
||||
|
||||
/**
|
||||
* 导出所有的 collections
|
||||
* (blog 为博客示例,如果不需要博客功能,请删除)
|
||||
* (demoDoc 为参考示例,如果不需要它,请删除)
|
||||
*/
|
||||
export default defineCollections([
|
||||
blog,
|
||||
demoDoc,
|
||||
])
|
||||
{{/if}}
|
||||
194
cli/templates/.vuepress/config.ts.handlebars
Normal file
194
cli/templates/.vuepress/config.ts.handlebars
Normal file
@ -0,0 +1,194 @@
|
||||
/**
|
||||
* 查看以下文档了解主题配置
|
||||
* - @see https://theme-plume.vuejs.press/config/intro/ 配置说明
|
||||
* - @see https://theme-plume.vuejs.press/config/theme/ 主题配置项
|
||||
*
|
||||
* 请注意,对此文件的修改都会重启 vuepress 服务。
|
||||
* 部分配置项的更新没有必要重启 vuepress 服务,建议请在 `.vuepress/config.{{#if useTs}}ts{{else}}js{{/if}}` 文件中配置
|
||||
*
|
||||
* 特别的,请不要在两个配置文件中重复配置相同的项,当前文件的配置项会被覆盖
|
||||
*/
|
||||
|
||||
import { {{ bundler }}Bundler } from '@vuepress/bundler-{{ bundler }}'
|
||||
import { defineUserConfig } from 'vuepress'
|
||||
import { plumeTheme } from 'vuepress-theme-plume'
|
||||
|
||||
export default defineUserConfig({
|
||||
base: '/',
|
||||
lang: '{{ defaultLanguage }}',
|
||||
{{#if multiLanguage}}
|
||||
locales: {
|
||||
{{#each locales}}
|
||||
'{{ path }}': {
|
||||
title: '{{ ../siteName }}',
|
||||
lang: '{{ lang }}',
|
||||
description: '{{ ../siteDescription }}',
|
||||
},
|
||||
{{/each}}
|
||||
},
|
||||
{{else}}
|
||||
title: '{{ siteName }}',
|
||||
description: '{{ siteDescription }}',
|
||||
{{/if}}
|
||||
|
||||
head: [
|
||||
// 配置站点图标
|
||||
['link', { rel: 'icon', type: 'image/png', href: 'https://theme-plume.vuejs.press/favicon-32x32.png' }],
|
||||
],
|
||||
|
||||
bundler: {{ bundler }}Bundler(),
|
||||
shouldPrefetch: false, // 站点较大,页面数量较多时,不建议启用
|
||||
|
||||
theme: plumeTheme({
|
||||
/* 添加您的部署域名, 有助于 SEO, 生成 sitemap */
|
||||
// hostname: 'https://your_site_url',
|
||||
|
||||
/* 文档仓库配置,用于 editLink */
|
||||
// docsRepo: '',
|
||||
// docsDir: '{{ docsDir }}',
|
||||
// docsBranch: '',
|
||||
|
||||
/* 页内信息 */
|
||||
// editLink: true,
|
||||
// lastUpdated: true,
|
||||
// contributors: true,
|
||||
// changelog: false,
|
||||
|
||||
/**
|
||||
* 编译缓存,加快编译速度
|
||||
* @see https://theme-plume.vuejs.press/config/theme/#cache
|
||||
*/
|
||||
cache: 'filesystem',
|
||||
|
||||
/**
|
||||
* 为 markdown 文件自动添加 frontmatter 配置
|
||||
* @see https://theme-plume.vuejs.press/config/theme/#autofrontmatter
|
||||
*/
|
||||
// autoFrontmatter: {
|
||||
// permalink: true, // 是否生成永久链接
|
||||
// createTime: true, // 是否生成创建时间
|
||||
// title: true, // 是否生成标题
|
||||
// },
|
||||
|
||||
/* 本地搜索, 默认启用 */
|
||||
search: { provider: 'local' },
|
||||
|
||||
/**
|
||||
* Algolia DocSearch
|
||||
* 启用此搜索需要将 本地搜索 search 设置为 false
|
||||
* @see https://theme-plume.vuejs.press/config/plugins/search/#algolia-docsearch
|
||||
*/
|
||||
// search: {
|
||||
// provider: 'algolia',
|
||||
// appId: '',
|
||||
// apiKey: '',
|
||||
// indices: [''],
|
||||
// },
|
||||
|
||||
/**
|
||||
* Shiki 代码高亮
|
||||
* @see https://theme-plume.vuejs.press/config/plugins/code-highlight/
|
||||
*/
|
||||
// codeHighlighter: {
|
||||
// twoslash: true, // 启用 twoslash
|
||||
// whitespace: true, // 启用 空格/Tab 高亮
|
||||
// lineNumbers: true, // 启用行号
|
||||
// },
|
||||
|
||||
/* 文章字数统计、阅读时间,设置为 false 则禁用 */
|
||||
// readingTime: true,
|
||||
|
||||
/**
|
||||
* markdown
|
||||
* @see https://theme-plume.vuejs.press/config/markdown/
|
||||
*/
|
||||
// markdown: {
|
||||
// abbr: true, // 启用 abbr 语法 *[label]: content
|
||||
// annotation: true, // 启用 annotation 语法 [+label]: content
|
||||
// pdf: true, // 启用 PDF 嵌入 @[pdf](/xxx.pdf)
|
||||
// caniuse: true, // 启用 caniuse 语法 @[caniuse](feature_name)
|
||||
// plot: true, // 启用隐秘文本语法 !!xxxx!!
|
||||
// bilibili: true, // 启用嵌入 bilibili视频 语法 @[bilibili](bid)
|
||||
// youtube: true, // 启用嵌入 youtube视频 语法 @[youtube](video_id)
|
||||
// artPlayer: true, // 启用嵌入 artPlayer 本地视频 语法 @[artPlayer](url)
|
||||
// audioReader: true, // 启用嵌入音频朗读功能 语法 @[audioReader](url)
|
||||
// icon: { provider: 'iconify' }, // 启用内置图标语法 ::icon-name::
|
||||
// table: true, // 启用表格增强容器语法 ::: table
|
||||
// codepen: true, // 启用嵌入 codepen 语法 @[codepen](user/slash)
|
||||
// replit: true, // 启用嵌入 replit 语法 @[replit](user/repl-name)
|
||||
// codeSandbox: true, // 启用嵌入 codeSandbox 语法 @[codeSandbox](id)
|
||||
// jsfiddle: true, // 启用嵌入 jsfiddle 语法 @[jsfiddle](user/id)
|
||||
// npmTo: true, // 启用 npm-to 容器 ::: npm-to
|
||||
// demo: true, // 启用 demo 容器 ::: demo
|
||||
// collapse: true, // 启用折叠容器 ::: collapse
|
||||
// repl: { // 启用 代码演示容器
|
||||
// go: true, // ::: go-repl
|
||||
// rust: true, // ::: rust-repl
|
||||
// kotlin: true, // ::: kotlin-repl
|
||||
// python: true, // ::: python-repl
|
||||
// },
|
||||
// math: { // 启用数学公式
|
||||
// type: 'katex',
|
||||
// },
|
||||
// chartjs: true, // 启用 chart.js
|
||||
// echarts: true, // 启用 ECharts
|
||||
// mermaid: true, // 启用 mermaid
|
||||
// flowchart: true, // 启用 flowchart
|
||||
// image: {
|
||||
// figure: true, // 启用 figure
|
||||
// lazyload: true, // 启用图片懒加载
|
||||
// mark: true, // 启用图片标记
|
||||
// size: true, // 启用图片大小
|
||||
// },
|
||||
// include: true, // 在 Markdown 文件中导入其他 markdown 文件内容
|
||||
// imageSize: 'local', // 启用 自动填充 图片宽高属性,避免页面抖动
|
||||
// },
|
||||
|
||||
/**
|
||||
* 水印
|
||||
* @see https://theme-plume.vuejs.press/guide/features/watermark/
|
||||
*/
|
||||
// watermark: true,
|
||||
|
||||
/**
|
||||
* 评论 comments
|
||||
* @see https://theme-plume.vuejs.press/guide/features/comments/
|
||||
*/
|
||||
// comment: {
|
||||
// provider: '', // "Artalk" | "Giscus" | "Twikoo" | "Waline"
|
||||
// comment: true,
|
||||
// repo: '',
|
||||
// repoId: '',
|
||||
// category: '',
|
||||
// categoryId: '',
|
||||
// mapping: 'pathname',
|
||||
// reactionsEnabled: true,
|
||||
// inputPosition: 'top',
|
||||
// },
|
||||
|
||||
/**
|
||||
* 资源链接替换
|
||||
* @see https://theme-plume.vuejs.press/guide/features/replace-assets/
|
||||
*/
|
||||
// replaceAssets: 'https://cdn.example.com',
|
||||
|
||||
/**
|
||||
* 加密功能
|
||||
* @see https://theme-plume.vuejs.press/guide/features/encryption/
|
||||
*/
|
||||
// encrypt: {},
|
||||
|
||||
/**
|
||||
* 启用 llmstxt 插件,用于为大语言模型提供更友好的内容
|
||||
* @see https://theme-plume.vuejs.press/guide/features/llmstxt/
|
||||
*/
|
||||
// llmstxt: {
|
||||
{{#if multiLanguage}}
|
||||
// locale: '/', // 默认仅为主语言生成 llms 友好内容
|
||||
// locale: 'all', // 为所有语言生成 llms 友好内容
|
||||
{{else}}
|
||||
// locale: '/', // 默认仅为主语言生成 llms 友好内容
|
||||
{{/if}}
|
||||
// }
|
||||
}),
|
||||
})
|
||||
34
cli/templates/.vuepress/navbar.ts.handlebars
Normal file
34
cli/templates/.vuepress/navbar.ts.handlebars
Normal file
@ -0,0 +1,34 @@
|
||||
/**
|
||||
* @see https://theme-plume.vuejs.press/config/navigation/ 查看文档了解配置详情
|
||||
*
|
||||
* Navbar 配置文件,它在 `.vuepress/plume.config.{{#if useTs}}ts{{else}}js{{/if}}` 中被导入。
|
||||
*/
|
||||
|
||||
import { defineNavbarConfig } from 'vuepress-theme-plume'
|
||||
|
||||
{{#if multiLanguage}}
|
||||
{{#each locales}}
|
||||
export const {{prefix}}Navbar = defineNavbarConfig([
|
||||
{ text: '{{#if isEn}}Home{{else}}首页{{/if}}', link: '{{ path }}' },
|
||||
{ text: '{{#if isEn}}Blog{{else}}博客{{/if}}', link: '{{ path }}blog/' },
|
||||
{ text: '{{#if isEn}}Tags{{else}}标签{{/if}}', link: '{{ path }}blog/tags/' },
|
||||
{ text: '{{#if isEn}}Archives{{else}}归档{{/if}}', link: '{{ path }}blog/archives/' },
|
||||
{
|
||||
text: '{{#if isEn}}Notes{{else}}笔记{{/if}}',
|
||||
items: [{ text: '{{#if isEn}}Demo{{else}}示例{{/if}}', link: '{{ path }}demo/README.md' }]
|
||||
},
|
||||
])
|
||||
|
||||
{{/each}}
|
||||
{{else}}
|
||||
export default defineNavbarConfig([
|
||||
{ text: '{{#if isEn}}Home{{else}}首页{{/if}}', link: '/' },
|
||||
{ text: '{{#if isEn}}Blog{{else}}博客{{/if}}', link: '/blog/' },
|
||||
{ text: '{{#if isEn}}Tags{{else}}标签{{/if}}', link: '/blog/tags/' },
|
||||
{ text: '{{#if isEn}}Archives{{else}}归档{{/if}}', link: '/blog/archives/' },
|
||||
{
|
||||
text: '{{#if isEn}}Notes{{else}}笔记{{/if}}',
|
||||
items: [{ text: '{{#if isEn}}Demo{{else}}示例{{/if}}', link: '/demo/README.md' }]
|
||||
},
|
||||
])
|
||||
{{/if}}
|
||||
121
cli/templates/.vuepress/plume.config.ts.handlebars
Normal file
121
cli/templates/.vuepress/plume.config.ts.handlebars
Normal file
@ -0,0 +1,121 @@
|
||||
/**
|
||||
* 查看以下文档了解主题配置
|
||||
* - @see https://theme-plume.vuejs.press/config/intro/ 配置说明
|
||||
* - @see https://theme-plume.vuejs.press/config/theme/ 主题配置项
|
||||
*
|
||||
* 请注意,对此文件的修改不会重启 vuepress 服务,而是通过热更新的方式生效
|
||||
* 但同时部分配置项不支持热更新,请查看文档说明
|
||||
* 对于不支持热更新的配置项,请在 `.vuepress/config.{{#if useTs}}ts{{else}}js{{/if}}` 文件中配置
|
||||
*
|
||||
* 特别的,请不要在两个配置文件中重复配置相同的项,当前文件的配置项会覆盖 `.vuepress/config.{{#if useTs}}ts{{else}}js{{/if}}` 文件中的配置
|
||||
*/
|
||||
|
||||
import { defineThemeConfig } from 'vuepress-theme-plume'
|
||||
{{#if multiLanguage}}
|
||||
import { enCollections, zhCollections } from './collections'
|
||||
import { enNavbar, zhNavbar } from './navbar'
|
||||
{{else}}
|
||||
import navbar from './navbar'
|
||||
import collections from './collections'
|
||||
{{/if}}
|
||||
|
||||
/**
|
||||
* @see https://theme-plume.vuejs.press/config/theme/
|
||||
*/
|
||||
export default defineThemeConfig({
|
||||
logo: 'https://theme-plume.vuejs.press/plume.png',
|
||||
|
||||
appearance: true, // 配置 深色模式
|
||||
|
||||
social: [
|
||||
{ icon: 'github', link: '/' },
|
||||
],
|
||||
// navbarSocialInclude: ['github'], // 允许显示在导航栏的 social 社交链接
|
||||
// aside: true, // 页内侧边栏, 默认显示在右侧
|
||||
// outline: [2, 3], // 页内大纲, 默认显示 h2, h3
|
||||
|
||||
/**
|
||||
* 文章版权信息
|
||||
* @see https://theme-plume.vuejs.press/guide/features/copyright/
|
||||
*/
|
||||
// copyright: true,
|
||||
|
||||
// prevPage: true, // 是否启用上一页链接
|
||||
// nextPage: true, // 是否启用下一页链接
|
||||
// createTime: true, // 是否显示文章创建时间
|
||||
|
||||
/* 站点页脚 */
|
||||
// footer: {
|
||||
// message: 'Power by <a target="_blank" href="https://v2.vuepress.vuejs.org/">VuePress</a> & <a target="_blank" href="https://theme-plume.vuejs.press">vuepress-theme-plume</a>',
|
||||
// copyright: '',
|
||||
// },
|
||||
|
||||
{{#unless multiLanguage}}
|
||||
/**
|
||||
* @see https://theme-plume.vuejs.press/config/theme/#profile
|
||||
*/
|
||||
profile: {
|
||||
avatar: 'https://theme-plume.vuejs.press/plume.png',
|
||||
name: '{{ siteName }}',
|
||||
description: '{{ siteDescription }}',
|
||||
// circle: true,
|
||||
// location: '',
|
||||
// organization: '',
|
||||
},
|
||||
|
||||
navbar,
|
||||
collections,
|
||||
|
||||
/**
|
||||
* 公告板
|
||||
* @see https://theme-plume.vuejs.press/guide/features/bulletin/
|
||||
*/
|
||||
// bulletin: {
|
||||
// layout: 'top-right',
|
||||
// contentType: 'markdown',
|
||||
// title: '公告板标题',
|
||||
// content: '公告板内容',
|
||||
// },
|
||||
|
||||
{{/unless}}
|
||||
/* 过渡动画 @see https://theme-plume.vuejs.press/config/theme/#transition */
|
||||
// transition: {
|
||||
// page: true, // 启用 页面间跳转过渡动画
|
||||
// postList: true, // 启用 博客文章列表过渡动画
|
||||
// appearance: 'fade', // 启用 深色模式切换过渡动画, 或配置过渡动画类型
|
||||
// },
|
||||
|
||||
{{#if multiLanguage}}
|
||||
locales: {
|
||||
{{#each locales}}
|
||||
'{{ path }}': {
|
||||
/**
|
||||
* @see https://theme-plume.vuejs.press/config/theme/#profile
|
||||
*/
|
||||
profile: {
|
||||
avatar: 'https://theme-plume.vuejs.press/plume.png',
|
||||
name: '{{ ../siteName }}',
|
||||
description: '{{ ../siteDescription }}',
|
||||
// circle: true,
|
||||
// location: '',
|
||||
// organization: '',
|
||||
},
|
||||
|
||||
navbar: {{ prefix }}Navbar,
|
||||
collections: {{ prefix }}Collections,
|
||||
|
||||
/**
|
||||
* 公告板
|
||||
* @see https://theme-plume.vuejs.press/guide/features/bulletin/
|
||||
*/
|
||||
// bulletin: {
|
||||
// layout: 'top-right',
|
||||
// contentType: 'markdown',
|
||||
// title: '',
|
||||
// content: '',
|
||||
// },
|
||||
},
|
||||
{{/each}}
|
||||
},
|
||||
{{/if}}
|
||||
})
|
||||
8
cli/templates/.vuepress/public/plume.svg
Normal file
8
cli/templates/.vuepress/public/plume.svg
Normal file
@ -0,0 +1,8 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 72 72">
|
||||
<path fill="#5086a1" d="M42.334 49.147a29.945 29.945 0 0 1-19.338-8.151c-8.014-7.365-8.378-18.076-8.533-22.649l-.022-.627a2.904 2.904 0 0 1 3.457-2.951c17.005 3.355 21.695 16.324 22.056 17.4a49.543 49.543 0 0 1 3.574 15.922a1 1 0 0 1-.967 1.052c-.029.001-.106.004-.227.004" />
|
||||
<path fill="#8cccd5" d="M44.436 55.316c-11.646 0-17.376-6.974-17.653-7.354a1 1 0 0 1 .262-1.424a11.103 11.103 0 0 1 12.774-1.574c-1.465-9.078 1.877-13.568 2.031-13.77a.998.998 0 0 1 .75-.39a.97.97 0 0 1 .78.325c8.944 9.771 8.793 16.532 7.908 19.691c-.034.14-1.062 4.092-4.772 4.406c-.711.062-1.405.09-2.08.09" />
|
||||
<g fill="none" stroke="#333" stroke-linecap="round" stroke-linejoin="round" stroke-width="1">
|
||||
<path d="M55.184 57.69S34.96 45.877 23.097 24.206m22.131 30.096c-11.93.46-17.628-6.88-17.628-6.88" />
|
||||
<path d="M40.528 42.483c-.56-7.195 2.116-10.679 2.116-10.679c8.834 9.654 8.406 16.162 7.681 18.747m-13.311-3.129a30.15 30.15 0 0 1-13.341-7.162c-8.072-7.419-8.067-18.241-8.232-22.577a1.903 1.903 0 0 1 2.264-1.932C34.694 19.103 39.02 32.528 39.02 32.528" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
11
cli/templates/.vuepress/theme/components/Custom.vue
Normal file
11
cli/templates/.vuepress/theme/components/Custom.vue
Normal file
@ -0,0 +1,11 @@
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
|
||||
const message = ref('Hello World!')
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="my-custom-content">
|
||||
{{ message }}
|
||||
</div>
|
||||
</template>
|
||||
6
cli/templates/.vuepress/theme/shim.d.ts
vendored
Normal file
6
cli/templates/.vuepress/theme/shim.d.ts
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
declare module '*.vue' {
|
||||
import type { ComponentOptions } from 'vue'
|
||||
|
||||
const comp: ComponentOptions
|
||||
export default comp
|
||||
}
|
||||
50
cli/templates/.vuepress/theme/styles/custom.css
Normal file
50
cli/templates/.vuepress/theme/styles/custom.css
Normal file
@ -0,0 +1,50 @@
|
||||
:root {
|
||||
/** 主题颜色 */
|
||||
|
||||
/*
|
||||
--vp-c-brand-1: #5086a1;
|
||||
--vp-c-brand-2: #6aa1b7;
|
||||
--vp-c-brand-3: #8cccd5;
|
||||
--vp-c-brand-soft: rgba(131, 208, 218, 0.314);
|
||||
*/
|
||||
|
||||
/** 背景颜色 */
|
||||
|
||||
/*
|
||||
--vp-c-bg: #fff;
|
||||
--vp-c-bg-alt: #f6f6f7;
|
||||
--vp-c-bg-elv: #fff;
|
||||
--vp-c-bg-soft: #f6f6f7;
|
||||
*/
|
||||
|
||||
/** 文本颜色 */
|
||||
|
||||
/*
|
||||
--vp-c-text-1: rgba(60, 60, 67);
|
||||
--vp-c-text-2: rgba(60, 60, 67, 0.78);
|
||||
--vp-c-text-3: rgba(60, 60, 67, 0.56);
|
||||
*/
|
||||
}
|
||||
|
||||
/** 深色模式 */
|
||||
[data-theme="dark"] {
|
||||
/*
|
||||
--vp-c-brand-1: #8cccd5;
|
||||
--vp-c-brand-2: #6aa1b7;
|
||||
--vp-c-brand-3: #5086a1;
|
||||
--vp-c-brand-soft: rgba(131, 208, 218, 0.314);
|
||||
*/
|
||||
|
||||
/*
|
||||
--vp-c-bg: #1b1b1f;
|
||||
--vp-c-bg-alt: #161618;
|
||||
--vp-c-bg-elv: #202127;
|
||||
--vp-c-bg-soft: #202127;
|
||||
*/
|
||||
|
||||
/*
|
||||
--vp-c-text-1: rgba(255, 255, 245, 0.86);
|
||||
--vp-c-text-2: rgba(235, 235, 245, 0.6);
|
||||
--vp-c-text-3: rgba(235, 235, 245, 0.38);
|
||||
*/
|
||||
}
|
||||
74
cli/templates/common/README.md.handlebars
Normal file
74
cli/templates/common/README.md.handlebars
Normal file
@ -0,0 +1,74 @@
|
||||
# {{ name }}
|
||||
|
||||
The Site is generated using [vuepress](https://vuepress.vuejs.org/) and [vuepress-theme-plume](https://github.com/pengzhanbo/vuepress-theme-plume)
|
||||
|
||||
## Install
|
||||
|
||||
```sh
|
||||
{{#if (equal packageManager "pnpm")}}
|
||||
pnpm i
|
||||
{{else if (equal packageManager "yarn")}}
|
||||
yarn
|
||||
{{else}}
|
||||
npm i
|
||||
{{/if}}
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
{{#if (equal packageManager "pnpm")}}
|
||||
```sh
|
||||
# start dev server
|
||||
pnpm docs:dev
|
||||
# build for production
|
||||
pnpm docs:build
|
||||
# preview production build in local
|
||||
pnpm docs:preview
|
||||
# update vuepress and theme
|
||||
pnpm vp-update
|
||||
```
|
||||
{{else if (equal packageManager "yarn")}}
|
||||
```sh
|
||||
# start dev server
|
||||
yarn docs:dev
|
||||
# build for production
|
||||
yarn docs:build
|
||||
# preview production build in local
|
||||
yarn docs:preview
|
||||
# update vuepress and theme
|
||||
yarn vp-update
|
||||
```
|
||||
{{else}}
|
||||
```sh
|
||||
# start dev server
|
||||
npm run docs:dev
|
||||
# build for production
|
||||
npm run docs:build
|
||||
# preview production build in local
|
||||
npm run docs:preview
|
||||
# update vuepress and theme
|
||||
npm run vp-update
|
||||
```
|
||||
{{/if}}
|
||||
|
||||
{{#if (equal deploy "github")}}
|
||||
## Deploy to GitHub Pages
|
||||
|
||||
The plume theme has been created with GitHub Actions: `.github/workflows/docs-deploy.yml`. You also need to make the following settings in the GitHub repository:
|
||||
|
||||
- [ ] `settings > Actions > General`, Scroll to the bottom of the page, under `Workflow permissions`, check `Read and write permissions`, and click the save button.
|
||||
|
||||
- [ ] `settings > Pages`, In `Build and deployment`, select `Deploy from a branch` for `Source`, choose `gh-pages` for `Branch`, and click the save button.
|
||||
(The `gh-pages` branch may not exist upon first creation. You can complete the above setup first, push the code to the main branch, wait for `github actions` to finish, and then proceed with the setup.)
|
||||
|
||||
- [ ] Modify the `base` option in `docs/.vuepress/config.ts`:
|
||||
- If you are planning to deploy to `https://<USERNAME>.github.io/`, you can skip this step as `base` defaults to `"/"`.
|
||||
- If you are planning to deploy to `https://<USERNAME>.github.io/<REPO>/`, meaning your repository URL is `https://github.com/<USERNAME>/<REPO>`, set `base` to `"/<REPO>/"`.
|
||||
|
||||
To customize a domain name, please refer to [Github Pages](https://docs.github.com/zh/pages/configuring-a-custom-domain-for-your-github-pages-site/about-custom-domains-and-github-pages)
|
||||
|
||||
{{/if}}
|
||||
## Documents
|
||||
|
||||
- [vuepress](https://vuepress.vuejs.org/)
|
||||
- [vuepress-theme-plume](https://theme-plume.vuejs.press/)
|
||||
74
cli/templates/common/README.zh-CN.md.handlebars
Normal file
74
cli/templates/common/README.zh-CN.md.handlebars
Normal file
@ -0,0 +1,74 @@
|
||||
# {{ name }}
|
||||
|
||||
网站使用 [vuepress](https://vuepress.vuejs.org/) 和 [vuepress-theme-plume](https://github.com/pengzhanbo/vuepress-theme-plume) 构建生成。
|
||||
|
||||
## Install
|
||||
|
||||
```sh
|
||||
{{#if (equal packageManager "pnpm")}}
|
||||
pnpm i
|
||||
{{else if (equal packageManager "yarn")}}
|
||||
yarn
|
||||
{{else}}
|
||||
npm i
|
||||
{{/if}}
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
{{#if (equal packageManager "pnpm")}}
|
||||
```sh
|
||||
# 启动开发服务
|
||||
pnpm docs:dev
|
||||
# 构建生产包
|
||||
pnpm docs:build
|
||||
# 本地预览生产服务
|
||||
pnpm docs:preview
|
||||
# 更新 vuepress 和主题
|
||||
pnpm vp-update
|
||||
```
|
||||
{{else if (equal packageManager "yarn")}}
|
||||
```sh
|
||||
# 启动开发服务
|
||||
yarn docs:dev
|
||||
# 构建生产包
|
||||
yarn docs:build
|
||||
# 本地预览生产服务
|
||||
yarn docs:preview
|
||||
# update vuepress and theme
|
||||
yarn vp-update
|
||||
```
|
||||
{{else}}
|
||||
```sh
|
||||
# 启动开发服务
|
||||
npm run docs:dev
|
||||
# 构建生产包
|
||||
npm run docs:build
|
||||
# 本地预览生产服务
|
||||
npm run docs:preview
|
||||
# 更新 vuepress 和主题
|
||||
npm run vp-update
|
||||
```
|
||||
{{/if}}
|
||||
|
||||
{{#if (equal deploy "github")}}
|
||||
## 部署到 GitHub Pages
|
||||
|
||||
主题已创建 github actions: `.github/workflows/docs-deploy.yml`,你还需要在 github 仓库中进行以下设置:
|
||||
|
||||
- [ ] `settings > Actions > General`,拉到页面底部,在 `Workflow permissions` 下,勾选 `Read and write permissions`,并点击保存按钮
|
||||
|
||||
- [ ] `settings > Pages`, 在 `Build and deployment` 中,`Source` 选择 `Deploy from a branch`, `Branch` 选择 `gh-pages`,并点击保存按钮
|
||||
(首次创建可能没有 `gh-pages`分支,你可以先完成上面的设置后,推送一次代码到主分支,等待 `github actions` 完成后再进行设置)
|
||||
|
||||
- [ ] 修改 `docs/.vuepress/config.ts` 中的 `base` 选项:
|
||||
- 如果你准备发布到 `https://<USERNAME>.github.io/` ,你可以省略这一步,因为 `base` 默认就是 `"/"` 。
|
||||
- 如果你准备发布到 `https://<USERNAME>.github.io/<REPO>/` ,也就是说你的仓库地址是 `https://github.com/<USERNAME>/<REPO>` ,则将 `base` 设置为 `"/<REPO>/"`。
|
||||
|
||||
如需要自定义域名,请查看 [Github Pages 文档](https://docs.github.com/zh/pages/configuring-a-custom-domain-for-your-github-pages-site/about-custom-domains-and-github-pages)
|
||||
|
||||
{{/if}}
|
||||
## 文档
|
||||
|
||||
- [vuepress](https://vuepress.vuejs.org/)
|
||||
- [vuepress-theme-plume](https://theme-plume.vuejs.press/)
|
||||
84
cli/templates/deploy/github/.github/workflows/deploy.yml.handlebars
vendored
Normal file
84
cli/templates/deploy/github/.github/workflows/deploy.yml.handlebars
vendored
Normal file
@ -0,0 +1,84 @@
|
||||
name: deploy
|
||||
|
||||
on:
|
||||
# 每当 push 到 main 分支时触发部署
|
||||
# Deployment is triggered whenever a push is made to the main branch.
|
||||
push:
|
||||
branches: [main]
|
||||
# 手动触发部署
|
||||
# Manually trigger deployment
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
docs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
# “最近更新时间” 等 git 日志相关信息,需要拉取全部提交记录
|
||||
# "Last updated time" and other git log-related information require fetching all commit records.
|
||||
fetch-depth: 0
|
||||
|
||||
{{#if (equal packageManager "pnpm")}}
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
|
||||
{{/if}}
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
# 选择要使用的 node 版本
|
||||
node-version: 22
|
||||
|
||||
{{#if (equal packageManager "npm")}}
|
||||
# 安装依赖
|
||||
# Install dependencies
|
||||
- name: Install Dependencies
|
||||
run: npm ci
|
||||
{{/if}}
|
||||
|
||||
{{#if (equal packageManager "pnpm")}}
|
||||
# 安装依赖
|
||||
# Install dependencies
|
||||
- name: Install Dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
{{/if}}
|
||||
|
||||
{{#if (equal packageManager "yarn")}}
|
||||
- name: Run install
|
||||
uses: borales/actions-yarn@v4
|
||||
with:
|
||||
cmd: install
|
||||
{{/if}}
|
||||
|
||||
# 运行构建脚本
|
||||
# Run the build script
|
||||
{{#unless (equal packageManager "yarn")}}
|
||||
- name: Build VuePress site
|
||||
env:
|
||||
NODE_OPTIONS: --max_old_space_size=8192
|
||||
run: {{packageManager}} run docs:build
|
||||
{{/unless}}
|
||||
{{#if (equal packageManager "yarn")}}
|
||||
- name: Build VuePress site
|
||||
uses: borales/actions-yarn@v4
|
||||
env:
|
||||
NODE_OPTIONS: --max_old_space_size=8192
|
||||
with:
|
||||
cmd: docs:build
|
||||
{{/if}}
|
||||
|
||||
|
||||
# 查看 workflow 的文档来获取更多信息
|
||||
# @see https://github.com/crazy-max/ghaction-github-pages
|
||||
- name: Deploy to GitHub Pages
|
||||
uses: crazy-max/ghaction-github-pages@v4
|
||||
with:
|
||||
# 部署到 gh-pages 分支
|
||||
target_branch: gh-pages
|
||||
# 部署目录为 VuePress 的默认输出目录
|
||||
build_dir: {{docsDir}}/.vuepress/dist
|
||||
env:
|
||||
# @see https://docs.github.com/cn/actions/reference/authentication-in-a-workflow#about-the-github_token-secret
|
||||
GITHUB_TOKEN: $\{{ secrets.GITHUB_TOKEN }}
|
||||
9
cli/templates/deploy/netlify/netlify.toml.handlebars
Normal file
9
cli/templates/deploy/netlify/netlify.toml.handlebars
Normal file
@ -0,0 +1,9 @@
|
||||
# prevent Netlify npm install
|
||||
|
||||
[build]
|
||||
publish = "{{ docsDir }}/.vuepress/dist"
|
||||
command = "{{#if (equal packageManager 'yarn')}}yarn && yarn{{else}}{{packageManager}} run{{/if}} docs:build"
|
||||
|
||||
[build.environment]
|
||||
NODE_VERSION = "22"
|
||||
NPM_FLAGS = "--version"
|
||||
6
cli/templates/deploy/vercel/vercel.json.handlebars
Normal file
6
cli/templates/deploy/vercel/vercel.json.handlebars
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"framework": null,
|
||||
"buildCommand": "{{#if (equal packageManager 'yarn')}}yarn{{else}}{{packageManager}} run{{/if}} docs:build",
|
||||
"installCommand": "{{#if (equal packageManager 'yarn')}}yarn{{else}}{{packageManager}} install{{/if}}",
|
||||
"outputDirectory": "{{ docsDir }}/.vuepress/dist"
|
||||
}
|
||||
23
cli/templates/docs/en/README.md.handlebars
Normal file
23
cli/templates/docs/en/README.md.handlebars
Normal file
@ -0,0 +1,23 @@
|
||||
---
|
||||
pageLayout: home
|
||||
externalLinkIcon: false
|
||||
config:
|
||||
-
|
||||
type: hero
|
||||
full: true
|
||||
forceDark: true
|
||||
effect: lightning
|
||||
hero:
|
||||
name: Theme Plume
|
||||
tagline: VuePress Next Theme
|
||||
text: A simple, feature-rich, document & blog
|
||||
actions:
|
||||
-
|
||||
theme: brand
|
||||
text: Blog
|
||||
link: {{#if (equal defaultLanguage 'en-US')}}/{{else}}/en/{{/if}}blog/
|
||||
-
|
||||
theme: alt
|
||||
text: Github →
|
||||
link: https://github.com/pengzhanbo/vuepress-theme-plume
|
||||
---
|
||||
@ -0,0 +1,8 @@
|
||||
---
|
||||
title: Custom Component
|
||||
tags:
|
||||
- preview
|
||||
- component
|
||||
---
|
||||
|
||||
<CustomComponent />
|
||||
322
cli/templates/docs/en/blog/preview/markdown.md
Normal file
322
cli/templates/docs/en/blog/preview/markdown.md
Normal file
@ -0,0 +1,322 @@
|
||||
---
|
||||
title: Markdown
|
||||
tags:
|
||||
- markdown
|
||||
---
|
||||
|
||||
## Heading 2
|
||||
|
||||
### Heading 3
|
||||
|
||||
#### Heading 4
|
||||
|
||||
##### Heading 5
|
||||
|
||||
###### Heading 6
|
||||
|
||||
Bold: **Bold text**
|
||||
|
||||
Italic: _Italic text_
|
||||
|
||||
~~Deleted text~~
|
||||
|
||||
Content ==Highlight==
|
||||
|
||||
Mathematical expression: $-(2^{n-1})$ ~ $2^{n-1} -1$
|
||||
|
||||
$\frac {\partial^r} {\partial \omega^r} \left(\frac {y^{\omega}} {\omega}\right)
|
||||
= \left(\frac {y^{\omega}} {\omega}\right) \left\{(\log y)^r + \sum_{i=1}^r \frac {(-1)^ Ir \cdots (r-i+1) (\log y)^{ri}} {\omega^i} \right\}$
|
||||
|
||||
19^th^
|
||||
|
||||
H~2~O
|
||||
|
||||
::: center
|
||||
content center
|
||||
:::
|
||||
|
||||
::: right
|
||||
content right
|
||||
:::
|
||||
|
||||
- Unordered List 1
|
||||
- Unordered List 2
|
||||
- Unordered List 3
|
||||
|
||||
1. Ordered List 1
|
||||
2. Ordered List 2
|
||||
3. Ordered List 3
|
||||
|
||||
- [ ] Task List 1
|
||||
- [ ] Task List 2
|
||||
- [x] Task List 3
|
||||
- [x] Task List 4
|
||||
|
||||
| Tables | Are | Cool |
|
||||
| ------------- |:-------------:| -----:|
|
||||
| col 3 is | right-aligned | $1600 |
|
||||
| col 2 is | centered | $12 |
|
||||
| zebra stripes | are neat | $1 |
|
||||
|
||||
> quote content
|
||||
>
|
||||
> quote content
|
||||
|
||||
[links](/)
|
||||
|
||||
[outside links](https://github.com/pengzhanbo)
|
||||
|
||||
**Badge:**
|
||||
|
||||
- <Badge type="info" text="info badge" />
|
||||
- <Badge type="tip" text="tip badge" />
|
||||
- <Badge type="warning" text="warning badge" />
|
||||
- <Badge type="danger" text="danger badge" />
|
||||
|
||||
**icons:**
|
||||
|
||||
- home - <Icon name="material-symbols:home" color="currentColor" size="1em" />
|
||||
- vscode - <Icon name="skill-icons:vscode-dark" size="2em" />
|
||||
- twitter - <Icon name="skill-icons:twitter" size="2em" />
|
||||
|
||||
**demo wrapper:**
|
||||
|
||||
::: window title="Demo" height="200px"
|
||||
<style scoped>
|
||||
.open-door {
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
padding: 20px;
|
||||
}
|
||||
.open-door .main {
|
||||
background: #ccc;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="open-door">
|
||||
<div class="main">main</div>
|
||||
<div class="aside">aside</div>
|
||||
</div>
|
||||
|
||||
:::
|
||||
|
||||
**code block:**
|
||||
|
||||
```js whitespace
|
||||
const a = 1
|
||||
const b = 2
|
||||
const c = a + b
|
||||
|
||||
// [!code word:obj]
|
||||
const obj = {
|
||||
toLong: {
|
||||
deep: {
|
||||
deep: {
|
||||
deep: {
|
||||
value: 'this is to long text. this is to long text. this is to long text. this is to long text.', // [!code highlight]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**code groups:**
|
||||
|
||||
::: code-tabs
|
||||
@tab tab1
|
||||
|
||||
```js
|
||||
const a = 1
|
||||
const b = 2
|
||||
const c = a + b
|
||||
```
|
||||
|
||||
@tab tab2
|
||||
|
||||
```ts
|
||||
const a: number = 1
|
||||
const b: number = 2
|
||||
const c: number = a + b
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
**code highlight:**
|
||||
|
||||
```ts
|
||||
function foo() {
|
||||
const a = 1 // [!code highlight]
|
||||
|
||||
console.log(a)
|
||||
|
||||
const b = 2 // [!code ++]
|
||||
const c = 3 // [!code --]
|
||||
|
||||
console.log(a + b + c) // [!code error]
|
||||
console.log(a + b) // [!code warning]
|
||||
}
|
||||
```
|
||||
|
||||
**code focus:**
|
||||
|
||||
```ts
|
||||
function foo() {
|
||||
const a = 1 // [!code focus]
|
||||
}
|
||||
```
|
||||
|
||||
::: note
|
||||
note content [link](https://github.com/pengzhanbo) `inline code`
|
||||
|
||||
```js
|
||||
const a = 1
|
||||
const b = 2
|
||||
const c = a + b
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
::: info
|
||||
content [link](https://github.com/pengzhanbo) `inline code`
|
||||
|
||||
```js
|
||||
const a = 1
|
||||
const b = 2
|
||||
const c = a + b
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
::: tip
|
||||
content [link](https://github.com/pengzhanbo) `inline code`
|
||||
|
||||
```js
|
||||
const a = 1
|
||||
const b = 2
|
||||
const c = a + b
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
::: warning
|
||||
content [link](https://github.com/pengzhanbo) `inline code`
|
||||
|
||||
```js
|
||||
const a = 1
|
||||
const b = 2
|
||||
const c = a + b
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
::: caution
|
||||
content [link](https://github.com/pengzhanbo) `inline code`
|
||||
|
||||
```js
|
||||
const a = 1
|
||||
const b = 2
|
||||
const c = a + b
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
::: important
|
||||
content [link](https://github.com/pengzhanbo) `inline code`
|
||||
|
||||
```js
|
||||
const a = 1
|
||||
const b = 2
|
||||
const c = a + b
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
**GFM alert:**
|
||||
|
||||
> [!note]
|
||||
> note
|
||||
|
||||
> [!info]
|
||||
> info
|
||||
|
||||
> [!tip]
|
||||
> tip
|
||||
|
||||
> [!warning]
|
||||
> warning
|
||||
|
||||
> [!caution]
|
||||
> caution
|
||||
|
||||
> [!important]
|
||||
> important
|
||||
|
||||
**code demo:**
|
||||
|
||||
:::: demo title="Demo" desc="A normal demo"
|
||||
|
||||
::: code-tabs
|
||||
@tab HTML
|
||||
|
||||
```html
|
||||
<div id="app">
|
||||
<h3>vuepress-theme-plume</h3>
|
||||
</div>
|
||||
```
|
||||
|
||||
@tab Javascript
|
||||
|
||||
```js
|
||||
const a = 'So Awesome!'
|
||||
const app = document.querySelector('#app')
|
||||
app.appendChild(window.document.createElement('small')).textContent = a
|
||||
```
|
||||
|
||||
@tab CSS
|
||||
|
||||
```css
|
||||
#app {
|
||||
font-size: 2em;
|
||||
text-align: center;
|
||||
}
|
||||
```
|
||||
|
||||
:::
|
||||
::::
|
||||
|
||||
**tab card:**
|
||||
|
||||
::: tabs
|
||||
@tab title 1
|
||||
content block
|
||||
|
||||
@tab title 2
|
||||
content block
|
||||
:::
|
||||
|
||||
:::: warning
|
||||
::: tabs
|
||||
@tab title 1
|
||||
content block
|
||||
|
||||
@tab title 2
|
||||
content block
|
||||
:::
|
||||
::::
|
||||
|
||||
**footnote:**
|
||||
|
||||
footnote 1 link[^first]。
|
||||
|
||||
footnote 2 link[^second]。
|
||||
|
||||
inline footnote ^[^first] definition。
|
||||
|
||||
Repeated footnote definition[^second]。
|
||||
|
||||
[^first]: footnote **you can contain special mark**
|
||||
|
||||
also can contain paragraph
|
||||
|
||||
[^second]: footnote content.
|
||||
6
cli/templates/docs/en/demo/README.md
Normal file
6
cli/templates/docs/en/demo/README.md
Normal file
@ -0,0 +1,6 @@
|
||||
---
|
||||
title: Demo
|
||||
---
|
||||
|
||||
- [bar](./bar.md)
|
||||
- [foo](./foo.md)
|
||||
5
cli/templates/docs/en/demo/bar.md
Normal file
5
cli/templates/docs/en/demo/bar.md
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
title: bar
|
||||
---
|
||||
|
||||
[foo](./foo.md)
|
||||
5
cli/templates/docs/en/demo/foo.md
Normal file
5
cli/templates/docs/en/demo/foo.md
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
title: foo
|
||||
---
|
||||
|
||||
[bar](./bar.md)
|
||||
23
cli/templates/docs/zh/README.md.handlebars
Normal file
23
cli/templates/docs/zh/README.md.handlebars
Normal file
@ -0,0 +1,23 @@
|
||||
---
|
||||
pageLayout: home
|
||||
externalLinkIcon: false
|
||||
config:
|
||||
-
|
||||
type: hero
|
||||
full: true
|
||||
forceDark: true
|
||||
effect: lightning
|
||||
hero:
|
||||
name: Theme Plume
|
||||
tagline: VuePress Next Theme
|
||||
text: 一个简约的,功能丰富的 vuepress 文档&博客 主题
|
||||
actions:
|
||||
-
|
||||
theme: brand
|
||||
text: 博客
|
||||
link: {{#if (equal defaultLanguage 'zh-CN')}}/{{else}}/zh/{{/if}}blog/
|
||||
-
|
||||
theme: alt
|
||||
text: Github →
|
||||
link: https://github.com/pengzhanbo/vuepress-theme-plume
|
||||
---
|
||||
@ -0,0 +1,8 @@
|
||||
---
|
||||
title: 自定义组件
|
||||
tags:
|
||||
- 预览
|
||||
- 组件
|
||||
---
|
||||
|
||||
<CustomComponent />
|
||||
346
cli/templates/docs/zh/blog/preview/markdown.md
Normal file
346
cli/templates/docs/zh/blog/preview/markdown.md
Normal file
@ -0,0 +1,346 @@
|
||||
---
|
||||
title: Markdown
|
||||
tags:
|
||||
- markdown
|
||||
---
|
||||
|
||||
## 标题H2
|
||||
|
||||
### 标题H3
|
||||
|
||||
#### 标题H4
|
||||
|
||||
##### 标题H5
|
||||
|
||||
###### 标题H6
|
||||
|
||||
## 标题2 Badge <Badge type="tip" text="Badge" />
|
||||
|
||||
### 标题3 Badge <Badge type="warning" text="Badge" />
|
||||
|
||||
#### 标题4 Badge <Badge type="danger" text="Badge" />
|
||||
|
||||
正文内容。
|
||||
|
||||
`@property` CSS at-rule是 [CSS Houdini API](https://developer.mozilla.org/zh-CN/docs/Web/Guide/Houdini)
|
||||
的一部分,它允许开发者显式地定义他们的 [CSS 自定义属性](https://developer.mozilla.org/zh-CN/docs/Web/CSS/--*),
|
||||
允许进行属性类型检查、设定默认值以及定义该自定义属性是否可以被继承。
|
||||
|
||||
`@property` 的出现,极大的增强了 CSS 的能力。
|
||||
|
||||
加粗:**加粗文字**
|
||||
|
||||
斜体: _斜体文字_
|
||||
|
||||
~~删除文字~~
|
||||
|
||||
内容 ==标记==
|
||||
|
||||
数学表达式: $-(2^{n-1})$ ~ $2^{n-1} -1$
|
||||
|
||||
$\frac {\partial^r} {\partial \omega^r} \left(\frac {y^{\omega}} {\omega}\right)
|
||||
= \left(\frac {y^{\omega}} {\omega}\right) \left\{(\log y)^r + \sum_{i=1}^r \frac {(-1)^ Ir \cdots (r-i+1) (\log y)^{ri}} {\omega^i} \right\}$
|
||||
|
||||
19^th^
|
||||
|
||||
H~2~O
|
||||
|
||||
::: center
|
||||
内容居中
|
||||
:::
|
||||
|
||||
::: right
|
||||
内容右对齐
|
||||
:::
|
||||
|
||||
- 无序列表1
|
||||
- 无序列表2
|
||||
- 无序列表3
|
||||
|
||||
1. 有序列表1
|
||||
2. 有序列表2
|
||||
3. 有序列表3
|
||||
|
||||
- [ ] 任务列表1
|
||||
- [ ] 任务列表2
|
||||
- [x] 任务列表3
|
||||
- [x] 任务列表4
|
||||
|
||||
| Tables | Are | Cool |
|
||||
| ------------- |:-------------:| -----:|
|
||||
| col 3 is | right-aligned | $1600 |
|
||||
| col 2 is | centered | $12 |
|
||||
| zebra stripes | are neat | $1 |
|
||||
|
||||
> 引用内容
|
||||
>
|
||||
> 引用内容
|
||||
|
||||
[链接](/)
|
||||
|
||||
[外部链接](https://github.com/pengzhanbo)
|
||||
|
||||

|
||||
|
||||
**Badge:**
|
||||
|
||||
- <Badge type="info" text="info badge" />
|
||||
- <Badge type="tip" text="tip badge" />
|
||||
- <Badge type="warning" text="warning badge" />
|
||||
- <Badge type="danger" text="danger badge" />
|
||||
|
||||
**图标:**
|
||||
|
||||
- home - <Icon name="material-symbols:home" color="currentColor" size="1em" />
|
||||
- vscode - <Icon name="skill-icons:vscode-dark" size="2em" />
|
||||
- twitter - <Icon name="skill-icons:twitter" size="2em" />
|
||||
|
||||
**示例容器:**
|
||||
|
||||
::: window title="示例" height="200px"
|
||||
<style scoped>
|
||||
.open-door {
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
padding: 20px;
|
||||
}
|
||||
.open-door .main {
|
||||
background: #ccc;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="open-door">
|
||||
<div class="main">main</div>
|
||||
<div class="aside">aside</div>
|
||||
</div>
|
||||
|
||||
:::
|
||||
|
||||
**代码:**
|
||||
|
||||
```js whitespace
|
||||
const a = 1
|
||||
const b = 2
|
||||
const c = a + b
|
||||
|
||||
// [!code word:obj]
|
||||
const obj = {
|
||||
toLong: {
|
||||
deep: {
|
||||
deep: {
|
||||
deep: {
|
||||
value: 'this is to long text. this is to long text. this is to long text. this is to long text.', // [!code highlight]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**代码分组:**
|
||||
|
||||
::: code-tabs
|
||||
@tab tab1
|
||||
|
||||
```js
|
||||
const a = 1
|
||||
const b = 2
|
||||
const c = a + b
|
||||
```
|
||||
|
||||
@tab tab2
|
||||
|
||||
```ts
|
||||
const a: number = 1
|
||||
const b: number = 2
|
||||
const c: number = a + b
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
**代码块高亮:**
|
||||
|
||||
```ts
|
||||
function foo() {
|
||||
const a = 1 // [!code highlight]
|
||||
|
||||
console.log(a)
|
||||
|
||||
const b = 2 // [!code ++]
|
||||
const c = 3 // [!code --]
|
||||
|
||||
console.log(a + b + c) // [!code error]
|
||||
console.log(a + b) // [!code warning]
|
||||
}
|
||||
```
|
||||
|
||||
**代码块聚焦:**
|
||||
|
||||
```ts
|
||||
function foo() {
|
||||
const a = 1 // [!code focus]
|
||||
}
|
||||
```
|
||||
|
||||
::: tip 仅标题
|
||||
:::
|
||||
|
||||
::: note 注释
|
||||
注释内容 [link](https://github.com/pengzhanbo) `inline code`
|
||||
|
||||
```js
|
||||
const a = 1
|
||||
const b = 2
|
||||
const c = a + b
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
::: info 信息
|
||||
信息内容 [link](https://github.com/pengzhanbo) `inline code`
|
||||
|
||||
```js
|
||||
const a = 1
|
||||
const b = 2
|
||||
const c = a + b
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
::: tip 提示
|
||||
提示内容 [link](https://github.com/pengzhanbo) `inline code`
|
||||
|
||||
```js
|
||||
const a = 1
|
||||
const b = 2
|
||||
const c = a + b
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
::: warning 警告
|
||||
警告内容 [link](https://github.com/pengzhanbo) `inline code`
|
||||
|
||||
```js
|
||||
const a = 1
|
||||
const b = 2
|
||||
const c = a + b
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
::: caution 错误
|
||||
错误内容 [link](https://github.com/pengzhanbo) `inline code`
|
||||
|
||||
```js
|
||||
const a = 1
|
||||
const b = 2
|
||||
const c = a + b
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
::: important 重要
|
||||
重要内容 [link](https://github.com/pengzhanbo) `inline code`
|
||||
|
||||
```js
|
||||
const a = 1
|
||||
const b = 2
|
||||
const c = a + b
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
::: details 详细标题
|
||||
|
||||
这里是内容。
|
||||
:::
|
||||
|
||||
**GFM alert:**
|
||||
|
||||
> [!note]
|
||||
> note
|
||||
|
||||
> [!info]
|
||||
> info
|
||||
|
||||
> [!tip]
|
||||
> tip
|
||||
|
||||
> [!warning]
|
||||
> warning
|
||||
|
||||
> [!caution]
|
||||
> caution
|
||||
|
||||
> [!important]
|
||||
> important
|
||||
|
||||
**代码演示:**
|
||||
|
||||
:::: demo title="常规示例" desc="一个常规示例"
|
||||
|
||||
::: code-tabs
|
||||
@tab HTML
|
||||
|
||||
```html
|
||||
<div id="app">
|
||||
<h3>vuepress-theme-plume</h3>
|
||||
</div>
|
||||
```
|
||||
|
||||
@tab Javascript
|
||||
|
||||
```js
|
||||
const a = 'So Awesome!'
|
||||
const app = document.querySelector('#app')
|
||||
app.appendChild(window.document.createElement('small')).textContent = a
|
||||
```
|
||||
|
||||
@tab CSS
|
||||
|
||||
```css
|
||||
#app {
|
||||
font-size: 2em;
|
||||
text-align: center;
|
||||
}
|
||||
```
|
||||
|
||||
:::
|
||||
::::
|
||||
|
||||
**选项卡:**
|
||||
|
||||
::: tabs
|
||||
@tab 标题1
|
||||
内容区块
|
||||
|
||||
@tab 标题2
|
||||
内容区块
|
||||
:::
|
||||
|
||||
:::: warning
|
||||
::: tabs
|
||||
@tab 标题1
|
||||
内容区块
|
||||
|
||||
@tab 标题2
|
||||
内容区块
|
||||
:::
|
||||
::::
|
||||
|
||||
**脚注:**
|
||||
|
||||
脚注 1 链接[^first]。
|
||||
|
||||
脚注 2 链接[^second]。
|
||||
|
||||
行内的脚注^[行内脚注文本] 定义。
|
||||
|
||||
重复的页脚定义[^second]。
|
||||
|
||||
[^first]: 脚注 **可以包含特殊标记**
|
||||
|
||||
也可以由多个段落组成
|
||||
|
||||
[^second]: 脚注文字。
|
||||
6
cli/templates/docs/zh/demo/README.md
Normal file
6
cli/templates/docs/zh/demo/README.md
Normal file
@ -0,0 +1,6 @@
|
||||
---
|
||||
title: Demo
|
||||
---
|
||||
|
||||
- [bar](./bar.md)
|
||||
- [foo](./foo.md)
|
||||
5
cli/templates/docs/zh/demo/bar.md
Normal file
5
cli/templates/docs/zh/demo/bar.md
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
title: bar
|
||||
---
|
||||
|
||||
[foo](./foo.md)
|
||||
5
cli/templates/docs/zh/demo/foo.md
Normal file
5
cli/templates/docs/zh/demo/foo.md
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
title: foo
|
||||
---
|
||||
|
||||
[bar](./bar.md)
|
||||
13
cli/templates/git/.gitattributes.handlebars
Normal file
13
cli/templates/git/.gitattributes.handlebars
Normal file
@ -0,0 +1,13 @@
|
||||
* text eol=lf
|
||||
*.txt text eol=crlf
|
||||
|
||||
*.png binary
|
||||
*.jpg binary
|
||||
*.jpeg binary
|
||||
*.ico binary
|
||||
*.gif binary
|
||||
*.webp binary
|
||||
*.tff binary
|
||||
*.woff binary
|
||||
*.woff2 binary
|
||||
*.pdf binary
|
||||
8
cli/templates/git/.gitignore.handlebars
Normal file
8
cli/templates/git/.gitignore.handlebars
Normal file
@ -0,0 +1,8 @@
|
||||
**/node_modules
|
||||
|
||||
{{ docsDir }}/.vuepress/.cache
|
||||
{{ docsDir }}/.vuepress/.temp
|
||||
{{ docsDir }}/.vuepress/dist
|
||||
|
||||
.DS_Store
|
||||
*.log
|
||||
10
cli/tsdown.config.ts
Normal file
10
cli/tsdown.config.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import { defineConfig } from 'tsdown'
|
||||
|
||||
export default defineConfig({
|
||||
entry: ['src/index.ts'],
|
||||
outDir: 'lib',
|
||||
dts: true,
|
||||
format: 'esm',
|
||||
sourcemap: false,
|
||||
fixedExtension: false,
|
||||
})
|
||||
15
commitlint.config.js
Normal file
15
commitlint.config.js
Normal file
@ -0,0 +1,15 @@
|
||||
import fs from 'node:fs'
|
||||
import path from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
||||
|
||||
const packages = fs.readdirSync(path.resolve(__dirname, 'plugins'))
|
||||
|
||||
export default {
|
||||
extends: ['@commitlint/config-conventional'],
|
||||
rules: {
|
||||
'scope-enum': [2, 'always', ['docs', 'theme', 'cli', ...packages]],
|
||||
'footer-max-line-length': [0],
|
||||
},
|
||||
}
|
||||
9
docs/.vuepress/bulletin.md
Normal file
9
docs/.vuepress/bulletin.md
Normal file
@ -0,0 +1,9 @@
|
||||
::: center
|
||||
|
||||
**QQ 交流群:** [792882761](https://qm.qq.com/q/FbPPoOIscE)
|
||||
|
||||
{width="618" height="616" style="width: 200px"}
|
||||
|
||||
您在使用过程中遇到任何问题,欢迎通过 [issue](https://github.com/pengzhanbo/vuepress-theme-plume/issues/new/choose) 反馈。也欢迎加入我们的 QQ 交流群一起讨论。
|
||||
|
||||
:::
|
||||
32
docs/.vuepress/client.ts
Normal file
32
docs/.vuepress/client.ts
Normal file
@ -0,0 +1,32 @@
|
||||
import type { ClientConfig } from 'vuepress/client'
|
||||
import { defineMermaidConfig } from '@vuepress/plugin-markdown-chart/client'
|
||||
import { defineAsyncComponent, h } from 'vue'
|
||||
import { Layout } from 'vuepress-theme-plume/client'
|
||||
import VPPostItem from 'vuepress-theme-plume/components/Posts/VPPostItem.vue'
|
||||
import PageContextMenu from 'vuepress-theme-plume/features/PageContextMenu.vue'
|
||||
import { defineClientConfig } from 'vuepress/client'
|
||||
import AsideNav from '~/components/AsideNav.vue'
|
||||
import { setupThemeColors } from '~/composables/theme-colors.js'
|
||||
|
||||
defineMermaidConfig({
|
||||
class: {
|
||||
hideEmptyMembersBox: true,
|
||||
},
|
||||
look: 'handDrawn',
|
||||
})
|
||||
|
||||
export default defineClientConfig({
|
||||
enhance({ app }) {
|
||||
app.component('VPPostItem', VPPostItem)
|
||||
app.component('TintPlate', defineAsyncComponent(() => import('vuepress-theme-plume/components/background/TintPlate.vue')))
|
||||
},
|
||||
setup() {
|
||||
setupThemeColors()
|
||||
},
|
||||
layouts: {
|
||||
Layout: h(Layout, null, {
|
||||
'aside-outline-after': () => h(AsideNav),
|
||||
'doc-title-after': () => h(PageContextMenu),
|
||||
}),
|
||||
},
|
||||
}) as ClientConfig
|
||||
13
docs/.vuepress/collections/en/index.ts
Normal file
13
docs/.vuepress/collections/en/index.ts
Normal file
@ -0,0 +1,13 @@
|
||||
import { defineCollections, type ThemeCollections } from 'vuepress-theme-plume'
|
||||
import { themeConfig } from './theme-config.js'
|
||||
import { themeGuide } from './theme-guide.js'
|
||||
import { tools } from './tools.js'
|
||||
|
||||
export const enCollections: ThemeCollections = defineCollections([
|
||||
// 博客
|
||||
{ type: 'post', dir: '/blog/', link: '/blog/', title: 'Blog' },
|
||||
// 文档
|
||||
themeGuide,
|
||||
themeConfig,
|
||||
tools,
|
||||
])
|
||||
53
docs/.vuepress/collections/en/theme-config.ts
Normal file
53
docs/.vuepress/collections/en/theme-config.ts
Normal file
@ -0,0 +1,53 @@
|
||||
import type { ThemeCollectionItem } from 'vuepress-theme-plume'
|
||||
import { defineCollection } from 'vuepress-theme-plume'
|
||||
|
||||
export const themeConfig: ThemeCollectionItem = defineCollection({
|
||||
type: 'doc',
|
||||
title: 'Config',
|
||||
dir: 'config',
|
||||
linkPrefix: '/config/',
|
||||
sidebar: [
|
||||
{
|
||||
text: 'Configuration',
|
||||
collapsed: false,
|
||||
items: [
|
||||
'intro',
|
||||
'theme',
|
||||
'locales',
|
||||
'navbar',
|
||||
'sidebar',
|
||||
'collections',
|
||||
'markdown',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Page Configuration',
|
||||
prefix: 'frontmatter',
|
||||
collapsed: false,
|
||||
items: [
|
||||
'basic',
|
||||
'home',
|
||||
'post',
|
||||
'friend',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Built-in Plugins',
|
||||
prefix: 'plugins',
|
||||
collapsed: false,
|
||||
items: [
|
||||
'',
|
||||
'shiki',
|
||||
'search',
|
||||
'reading-time',
|
||||
'llms',
|
||||
'markdown-enhance',
|
||||
'markdown-power',
|
||||
'markdown-image',
|
||||
'markdown-math',
|
||||
'markdown-include',
|
||||
'watermark',
|
||||
],
|
||||
},
|
||||
],
|
||||
})
|
||||
202
docs/.vuepress/collections/en/theme-guide.ts
Normal file
202
docs/.vuepress/collections/en/theme-guide.ts
Normal file
@ -0,0 +1,202 @@
|
||||
import type { ThemeCollectionItem } from 'vuepress-theme-plume'
|
||||
import { defineCollection } from 'vuepress-theme-plume'
|
||||
|
||||
export const themeGuide: ThemeCollectionItem = defineCollection({
|
||||
type: 'doc',
|
||||
dir: 'guide',
|
||||
title: 'Guide',
|
||||
linkPrefix: '/guide/',
|
||||
sidebar: [
|
||||
{
|
||||
text: 'Quick Start',
|
||||
collapsed: false,
|
||||
icon: 'carbon:idea',
|
||||
prefix: 'quick-start',
|
||||
items: [
|
||||
'intro',
|
||||
'usage',
|
||||
'project-structure',
|
||||
{
|
||||
text: 'Collection',
|
||||
link: 'collection',
|
||||
items: ['collection-post', 'collection-doc'],
|
||||
},
|
||||
'sidebar',
|
||||
'write',
|
||||
'auto-frontmatter',
|
||||
'locales',
|
||||
'deployment',
|
||||
'optimize-build',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Write',
|
||||
icon: 'fluent-mdl2:edit-create',
|
||||
collapsed: false,
|
||||
items: [
|
||||
{
|
||||
text: 'markdown',
|
||||
icon: 'material-symbols:markdown-outline',
|
||||
prefix: 'markdown',
|
||||
collapsed: true,
|
||||
items: [
|
||||
'basic',
|
||||
'extensions',
|
||||
'attrs',
|
||||
'emoji',
|
||||
'math',
|
||||
'table',
|
||||
'icons',
|
||||
'mark',
|
||||
'plot',
|
||||
'abbr',
|
||||
'annotation',
|
||||
'container',
|
||||
'github-alerts',
|
||||
'card',
|
||||
'steps',
|
||||
'file-tree',
|
||||
'code-tree',
|
||||
'field',
|
||||
'tabs',
|
||||
'qrcode',
|
||||
'timeline',
|
||||
'demo-wrapper',
|
||||
'flex',
|
||||
'collapse',
|
||||
'npm-to',
|
||||
'caniuse',
|
||||
'chat',
|
||||
'include',
|
||||
'env',
|
||||
'obsidian',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'code block',
|
||||
prefix: 'code',
|
||||
icon: 'ph:code-bold',
|
||||
collapsed: true,
|
||||
items: [
|
||||
'intro',
|
||||
'features',
|
||||
'copy-code',
|
||||
'code-tabs',
|
||||
'import',
|
||||
'twoslash',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'code repl',
|
||||
prefix: 'repl',
|
||||
icon: 'carbon:demo',
|
||||
collapsed: true,
|
||||
items: [
|
||||
'frontend',
|
||||
'rust',
|
||||
'golang',
|
||||
'kotlin',
|
||||
'python',
|
||||
'codepen',
|
||||
'jsFiddle',
|
||||
'codeSandbox',
|
||||
'replit',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'charts',
|
||||
icon: 'mdi:chart-line',
|
||||
prefix: 'chart',
|
||||
collapsed: true,
|
||||
items: [
|
||||
'chart',
|
||||
'echarts',
|
||||
'mermaid',
|
||||
'flowchart',
|
||||
'markmap',
|
||||
'plantuml',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'resource embedded',
|
||||
icon: 'dashicons:embed-video',
|
||||
prefix: 'embed',
|
||||
collapsed: true,
|
||||
items: [
|
||||
'pdf',
|
||||
'bilibili',
|
||||
'acfun',
|
||||
'youtube',
|
||||
'artplayer',
|
||||
'audioReader',
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Features',
|
||||
icon: 'lucide:box',
|
||||
collapsed: false,
|
||||
prefix: 'features',
|
||||
items: [
|
||||
'icon',
|
||||
'search',
|
||||
'image-preview',
|
||||
'comments',
|
||||
'bulletin',
|
||||
'encryption',
|
||||
'contributors',
|
||||
'changelog',
|
||||
'copyright',
|
||||
'watermark',
|
||||
'friend-links',
|
||||
'replace-assets',
|
||||
'seo',
|
||||
'sitemap',
|
||||
'llmstxt',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Component',
|
||||
prefix: 'components',
|
||||
icon: 'uiw:component',
|
||||
collapsed: false,
|
||||
items: [
|
||||
'badge',
|
||||
'icon',
|
||||
'plot',
|
||||
'card',
|
||||
'link-card',
|
||||
'image-card',
|
||||
'card-grid',
|
||||
'card-masonry',
|
||||
'home-box',
|
||||
'repo-card',
|
||||
'npm-badge',
|
||||
'swiper',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Customization',
|
||||
icon: 'material-symbols:dashboard-customize-outline-rounded',
|
||||
collapsed: false,
|
||||
prefix: 'custom',
|
||||
items: [
|
||||
{ text: 'Custom Homepage', link: 'home', items: ['home-hero-effect'] },
|
||||
'style',
|
||||
'slots',
|
||||
'component-overrides',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'API',
|
||||
icon: 'mdi:api',
|
||||
prefix: 'api',
|
||||
collapsed: false,
|
||||
items: [
|
||||
'client',
|
||||
'node',
|
||||
],
|
||||
},
|
||||
],
|
||||
})
|
||||
20
docs/.vuepress/collections/en/tools.ts
Normal file
20
docs/.vuepress/collections/en/tools.ts
Normal file
@ -0,0 +1,20 @@
|
||||
import type { ThemeCollectionItem } from 'vuepress-theme-plume'
|
||||
import { defineCollection } from 'vuepress-theme-plume'
|
||||
|
||||
export const tools: ThemeCollectionItem = defineCollection({
|
||||
type: 'doc',
|
||||
dir: 'tools',
|
||||
title: 'Theme Tools',
|
||||
linkPrefix: '/tools/',
|
||||
sidebar: [
|
||||
{
|
||||
text: 'Tools',
|
||||
icon: 'tabler:tools',
|
||||
items: [
|
||||
'custom-theme',
|
||||
'home-hero-tint-plate',
|
||||
'caniuse',
|
||||
],
|
||||
},
|
||||
],
|
||||
})
|
||||
2
docs/.vuepress/collections/index.ts
Normal file
2
docs/.vuepress/collections/index.ts
Normal file
@ -0,0 +1,2 @@
|
||||
export * from './en/index.js'
|
||||
export * from './zh/index.js'
|
||||
13
docs/.vuepress/collections/zh/index.ts
Normal file
13
docs/.vuepress/collections/zh/index.ts
Normal file
@ -0,0 +1,13 @@
|
||||
import { defineCollections, type ThemeCollections } from 'vuepress-theme-plume'
|
||||
import { themeConfig } from './theme-config.js'
|
||||
import { themeGuide } from './theme-guide.js'
|
||||
import { tools } from './tools.js'
|
||||
|
||||
export const zhCollections: ThemeCollections = defineCollections([
|
||||
// 博客
|
||||
{ type: 'post', dir: '/blog/', link: '/blog/', title: '博客' },
|
||||
// 文档
|
||||
themeGuide,
|
||||
themeConfig,
|
||||
tools,
|
||||
])
|
||||
53
docs/.vuepress/collections/zh/theme-config.ts
Normal file
53
docs/.vuepress/collections/zh/theme-config.ts
Normal file
@ -0,0 +1,53 @@
|
||||
import type { ThemeCollectionItem } from 'vuepress-theme-plume'
|
||||
import { defineCollection } from 'vuepress-theme-plume'
|
||||
|
||||
export const themeConfig: ThemeCollectionItem = defineCollection({
|
||||
type: 'doc',
|
||||
title: '配置',
|
||||
dir: 'config',
|
||||
linkPrefix: '/config/',
|
||||
sidebar: [
|
||||
{
|
||||
text: '配置',
|
||||
collapsed: false,
|
||||
items: [
|
||||
'intro',
|
||||
'theme',
|
||||
'locales',
|
||||
'navbar',
|
||||
'sidebar',
|
||||
'collections',
|
||||
'markdown',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '页面配置',
|
||||
prefix: 'frontmatter',
|
||||
collapsed: false,
|
||||
items: [
|
||||
'basic',
|
||||
'home',
|
||||
'post',
|
||||
'friend',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '内置插件',
|
||||
prefix: 'plugins',
|
||||
collapsed: false,
|
||||
items: [
|
||||
'',
|
||||
'shiki',
|
||||
'search',
|
||||
'reading-time',
|
||||
'llms',
|
||||
'markdown-enhance',
|
||||
'markdown-power',
|
||||
'markdown-image',
|
||||
'markdown-math',
|
||||
'markdown-include',
|
||||
'watermark',
|
||||
],
|
||||
},
|
||||
],
|
||||
})
|
||||
202
docs/.vuepress/collections/zh/theme-guide.ts
Normal file
202
docs/.vuepress/collections/zh/theme-guide.ts
Normal file
@ -0,0 +1,202 @@
|
||||
import type { ThemeCollectionItem } from 'vuepress-theme-plume'
|
||||
import { defineCollection } from 'vuepress-theme-plume'
|
||||
|
||||
export const themeGuide: ThemeCollectionItem = defineCollection({
|
||||
type: 'doc',
|
||||
dir: 'guide',
|
||||
title: '指南',
|
||||
linkPrefix: '/guide/',
|
||||
sidebar: [
|
||||
{
|
||||
text: '从这里开始',
|
||||
collapsed: false,
|
||||
icon: 'carbon:idea',
|
||||
prefix: 'quick-start',
|
||||
items: [
|
||||
'intro',
|
||||
'usage',
|
||||
'project-structure',
|
||||
{
|
||||
text: '集合',
|
||||
link: 'collection',
|
||||
items: ['collection-post', 'collection-doc'],
|
||||
},
|
||||
'sidebar',
|
||||
'write',
|
||||
'auto-frontmatter',
|
||||
'locales',
|
||||
'deployment',
|
||||
'optimize-build',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '写作',
|
||||
icon: 'fluent-mdl2:edit-create',
|
||||
collapsed: false,
|
||||
items: [
|
||||
{
|
||||
text: 'markdown',
|
||||
icon: 'material-symbols:markdown-outline',
|
||||
prefix: 'markdown',
|
||||
collapsed: true,
|
||||
items: [
|
||||
'basic',
|
||||
'extensions',
|
||||
'attrs',
|
||||
'emoji',
|
||||
'math',
|
||||
'table',
|
||||
'icons',
|
||||
'mark',
|
||||
'plot',
|
||||
'abbr',
|
||||
'annotation',
|
||||
'container',
|
||||
'github-alerts',
|
||||
'card',
|
||||
'steps',
|
||||
'file-tree',
|
||||
'code-tree',
|
||||
'field',
|
||||
'tabs',
|
||||
'qrcode',
|
||||
'timeline',
|
||||
'demo-wrapper',
|
||||
'flex',
|
||||
'collapse',
|
||||
'npm-to',
|
||||
'caniuse',
|
||||
'chat',
|
||||
'include',
|
||||
'env',
|
||||
'obsidian',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '代码块',
|
||||
prefix: 'code',
|
||||
icon: 'ph:code-bold',
|
||||
collapsed: true,
|
||||
items: [
|
||||
'intro',
|
||||
'features',
|
||||
'copy-code',
|
||||
'code-tabs',
|
||||
'import',
|
||||
'twoslash',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '代码演示',
|
||||
prefix: 'repl',
|
||||
icon: 'carbon:demo',
|
||||
collapsed: true,
|
||||
items: [
|
||||
'frontend',
|
||||
'rust',
|
||||
'golang',
|
||||
'kotlin',
|
||||
'python',
|
||||
'codepen',
|
||||
'jsFiddle',
|
||||
'codeSandbox',
|
||||
'replit',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '图表',
|
||||
icon: 'mdi:chart-line',
|
||||
prefix: 'chart',
|
||||
collapsed: true,
|
||||
items: [
|
||||
'chart',
|
||||
'echarts',
|
||||
'mermaid',
|
||||
'flowchart',
|
||||
'markmap',
|
||||
'plantuml',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '资源嵌入',
|
||||
icon: 'dashicons:embed-video',
|
||||
prefix: 'embed',
|
||||
collapsed: true,
|
||||
items: [
|
||||
'pdf',
|
||||
'bilibili',
|
||||
'acfun',
|
||||
'youtube',
|
||||
'artplayer',
|
||||
'audioReader',
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '功能',
|
||||
icon: 'lucide:box',
|
||||
collapsed: false,
|
||||
prefix: 'features',
|
||||
items: [
|
||||
'icon',
|
||||
'search',
|
||||
'image-preview',
|
||||
'comments',
|
||||
'bulletin',
|
||||
'encryption',
|
||||
'contributors',
|
||||
'changelog',
|
||||
'copyright',
|
||||
'watermark',
|
||||
'friend-links',
|
||||
'replace-assets',
|
||||
'seo',
|
||||
'sitemap',
|
||||
'llmstxt',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '组件',
|
||||
prefix: 'components',
|
||||
icon: 'uiw:component',
|
||||
collapsed: false,
|
||||
items: [
|
||||
'badge',
|
||||
'icon',
|
||||
'plot',
|
||||
'card',
|
||||
'link-card',
|
||||
'image-card',
|
||||
'card-grid',
|
||||
'card-masonry',
|
||||
'home-box',
|
||||
'repo-card',
|
||||
'npm-badge',
|
||||
'swiper',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '自定义',
|
||||
icon: 'material-symbols:dashboard-customize-outline-rounded',
|
||||
collapsed: false,
|
||||
prefix: 'custom',
|
||||
items: [
|
||||
{ text: '自定义首页', link: 'home', items: ['home-hero-effect'] },
|
||||
'style',
|
||||
'slots',
|
||||
'component-overrides',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'API',
|
||||
icon: 'mdi:api',
|
||||
prefix: 'api',
|
||||
collapsed: false,
|
||||
items: [
|
||||
'client',
|
||||
'node',
|
||||
],
|
||||
},
|
||||
],
|
||||
})
|
||||
20
docs/.vuepress/collections/zh/tools.ts
Normal file
20
docs/.vuepress/collections/zh/tools.ts
Normal file
@ -0,0 +1,20 @@
|
||||
import type { ThemeCollectionItem } from 'vuepress-theme-plume'
|
||||
import { defineCollection } from 'vuepress-theme-plume'
|
||||
|
||||
export const tools: ThemeCollectionItem = defineCollection({
|
||||
type: 'doc',
|
||||
dir: 'tools',
|
||||
title: '工具',
|
||||
linkPrefix: '/tools/',
|
||||
sidebar: [
|
||||
{
|
||||
text: '工具',
|
||||
icon: 'tabler:tools',
|
||||
items: [
|
||||
'custom-theme',
|
||||
'home-hero-tint-plate',
|
||||
'caniuse',
|
||||
],
|
||||
},
|
||||
],
|
||||
})
|
||||
@ -1,91 +1,52 @@
|
||||
import * as path from 'path'
|
||||
import type { PlumeThemeOptions } from '@vuepress-plume/vuepress-theme-plume'
|
||||
import { defineUserConfig } from '@vuepress/cli'
|
||||
import type { UserConfig } from 'vuepress'
|
||||
import fs from 'node:fs'
|
||||
import path from 'node:path'
|
||||
import { viteBundler } from '@vuepress/bundler-vite'
|
||||
import { addViteOptimizeDepsInclude, addViteSsrExternal } from '@vuepress/helper'
|
||||
import { defineUserConfig } from 'vuepress'
|
||||
import { theme } from './theme.js'
|
||||
|
||||
export default defineUserConfig<PlumeThemeOptions>({
|
||||
lang: 'zh',
|
||||
title: 'Plume Theme',
|
||||
description: '',
|
||||
public: path.resolve(__dirname, '../public'),
|
||||
theme: '@vuepress-plume/vuepress-theme-plume',
|
||||
themeConfig: {
|
||||
logo: 'https://pengzhanbo.cn/g.gif',
|
||||
avatar: {
|
||||
url: 'https://via.placeholder.com/300?text=Profile+Photo',
|
||||
name: 'Plume Theme',
|
||||
description: 'The Theme for Vuepress 2.0',
|
||||
},
|
||||
social: {
|
||||
email: 'volodymyr@foxmail.com',
|
||||
github: 'pengzhanbo',
|
||||
QQ: '942450674',
|
||||
weiBo: 'https://weibo.com',
|
||||
zhiHu: 'https://zhihu.com',
|
||||
facebook: 'https://baidu.com',
|
||||
twitter: 'https://baidu.com',
|
||||
linkedin: 'https://baidu.com',
|
||||
},
|
||||
notes: {
|
||||
notes: [
|
||||
{
|
||||
link: 'typescript',
|
||||
dir: 'typescript',
|
||||
text: 'Typescript',
|
||||
sidebar: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
darkMode: true,
|
||||
navbar: [
|
||||
{ text: '首页', link: '/' },
|
||||
{
|
||||
text: '分类',
|
||||
link: '/category/',
|
||||
},
|
||||
{
|
||||
text: '标签',
|
||||
link: '/tag/',
|
||||
},
|
||||
{
|
||||
text: '笔记',
|
||||
children: [
|
||||
// {
|
||||
// text: '技术',
|
||||
// children: [{ text: '《typescript学习笔记》', link: '/' }],
|
||||
// },
|
||||
// {
|
||||
// text: '技术',
|
||||
// children: [{ text: '《typescript学习笔记》', link: '/' }],
|
||||
// },
|
||||
{
|
||||
text: 'typescript',
|
||||
link: '/note/typescript/',
|
||||
},
|
||||
{
|
||||
text: '标签',
|
||||
link: '/tag/',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
footer: {
|
||||
copyright: 'Copyright © 2022-present pengzhanbo',
|
||||
},
|
||||
themePlugins: {
|
||||
caniuse: {
|
||||
mode: 'embed',
|
||||
},
|
||||
search: {
|
||||
// hotKeys: ['s', '/'],
|
||||
// maxSuggestions: 5,
|
||||
// isSearchable: (page) => page.path !== '/',
|
||||
// getExtraFields: () => [],
|
||||
locales: {
|
||||
'/': {
|
||||
placeholder: '搜索',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
const pnpmWorkspace = fs.readFileSync(path.resolve(__dirname, '../../pnpm-workspace.yaml'), 'utf-8')
|
||||
const vuepress = pnpmWorkspace.match(/vuepress:\s(2.+)/)?.[1] || ''
|
||||
|
||||
export default defineUserConfig({
|
||||
base: '/',
|
||||
lang: 'zh-CN',
|
||||
source: path.resolve(__dirname, '../'),
|
||||
public: path.resolve(__dirname, 'public'),
|
||||
|
||||
locales: {
|
||||
'/': { title: 'Plume 主题', lang: 'zh-CN' },
|
||||
'/en/': { title: 'Plume Theme', lang: 'en-US' },
|
||||
},
|
||||
})
|
||||
|
||||
head: [
|
||||
['link', { rel: 'icon', type: 'image/png', sizes: '32x32', href: '/favicon-32x32.png' }],
|
||||
['link', { rel: 'icon', type: 'image/png', sizes: '16x16', href: '/favicon-16x16.png' }],
|
||||
['meta', { name: 'google-site-verification', content: 'AaTP7bapCAcoO9ZGE67ilpy99GL6tYqtD30tRHjO9Ps' }],
|
||||
],
|
||||
|
||||
pagePatterns: ['**/*.md', '!**/*.snippet.md', '!.vuepress', '!node_modules', '!docs/guide/repl/demo/*'],
|
||||
|
||||
extendsBundlerOptions(bundlerOptions, app) {
|
||||
addViteOptimizeDepsInclude(bundlerOptions, app, '@simonwep/pickr')
|
||||
addViteSsrExternal(bundlerOptions, app, '@simonwep/pickr')
|
||||
},
|
||||
|
||||
define: {
|
||||
__VUEPRESS_VERSION__: vuepress,
|
||||
// debug hydration mismatch
|
||||
// __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'true',
|
||||
},
|
||||
|
||||
alias: {
|
||||
'~/theme': path.resolve(__dirname, './themes'),
|
||||
'~/components': path.resolve(__dirname, './themes/components'),
|
||||
'~/composables': path.resolve(__dirname, './themes/composables'),
|
||||
},
|
||||
|
||||
bundler: viteBundler(),
|
||||
shouldPrefetch: false,
|
||||
|
||||
theme,
|
||||
}) as UserConfig
|
||||
|
||||
103
docs/.vuepress/navbar.ts
Normal file
103
docs/.vuepress/navbar.ts
Normal file
@ -0,0 +1,103 @@
|
||||
import type { ThemeNavItem } from 'vuepress-theme-plume'
|
||||
import { defineNavbarConfig } from 'vuepress-theme-plume'
|
||||
import { version } from '../../package.json'
|
||||
|
||||
export const zhNavbar: ThemeNavItem[] = defineNavbarConfig([
|
||||
{
|
||||
text: '指南',
|
||||
icon: 'icon-park-outline:guide-board',
|
||||
link: '/guide/quick-start/intro.md',
|
||||
activeMatch: '^/guide/',
|
||||
},
|
||||
{
|
||||
text: '配置',
|
||||
icon: 'icon-park-outline:setting-two',
|
||||
link: '/config/intro.md',
|
||||
activeMatch: '^/config/',
|
||||
},
|
||||
{
|
||||
text: '博客',
|
||||
link: '/blog/',
|
||||
icon: 'material-symbols:article-outline',
|
||||
activeMatch: '^/(blog|article)/',
|
||||
},
|
||||
{
|
||||
text: '案例',
|
||||
link: '/demos/',
|
||||
icon: 'map:wind-surfing',
|
||||
},
|
||||
{
|
||||
text: '更多',
|
||||
icon: 'icon-park-outline:more-three',
|
||||
items: [
|
||||
{ text: '常见问题', link: '/faq/', icon: 'wpf:faq' },
|
||||
{ text: '喝杯奶茶', link: '/sponsor/', icon: 'line-md:coffee-loop' },
|
||||
{ text: '主题工具', link: '/tools/', icon: 'jam:tools' },
|
||||
{ text: '友情链接', link: '/friends/', icon: 'carbon:friendship' },
|
||||
{
|
||||
text: 'Vuepress',
|
||||
icon: 'logos:vue',
|
||||
items: [
|
||||
{ text: '官方文档', link: 'https://v2.vuepress.vuejs.org', icon: 'logos:vue' },
|
||||
{ text: '生态系统', link: 'https://ecosystem.vuejs.press/', icon: 'logos:vue' },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: `${version}`,
|
||||
icon: 'codicon:versions',
|
||||
badge: '新',
|
||||
items: [
|
||||
{ text: '更新日志', link: '/changelog/' },
|
||||
{ text: '参与贡献', link: '/contributing/' },
|
||||
],
|
||||
},
|
||||
])
|
||||
|
||||
export const enNavbar: ThemeNavItem[] = defineNavbarConfig([
|
||||
{
|
||||
text: 'Guide',
|
||||
icon: 'icon-park-outline:guide-board',
|
||||
link: '/en/guide/intro/',
|
||||
activeMatch: '^/en/guide/',
|
||||
},
|
||||
{
|
||||
text: 'Config',
|
||||
icon: 'icon-park-outline:setting-two',
|
||||
link: '/en/config/intro/',
|
||||
activeMatch: '^/en/config/',
|
||||
},
|
||||
{
|
||||
text: 'Blog',
|
||||
link: '/en/blog/',
|
||||
icon: 'material-symbols:article-outline',
|
||||
activeMatch: '^/en/(blog|article)/',
|
||||
},
|
||||
{
|
||||
text: 'More',
|
||||
icon: 'icon-park-outline:more-three',
|
||||
items: [
|
||||
{ text: 'FAQ', link: '/en/faq/', icon: 'wpf:faq' },
|
||||
{ text: 'Theme Tools', link: '/en/tools/', icon: 'jam:tools' },
|
||||
{ text: 'Friend Links', link: '/en/friends/', icon: 'carbon:friendship' },
|
||||
{
|
||||
text: 'Vuepress',
|
||||
icon: 'logos:vue',
|
||||
items: [
|
||||
{ text: 'Official Docs', link: 'https://v2.vuepress.vuejs.org', icon: 'logos:vue' },
|
||||
{ text: 'Ecosystem', link: 'https://ecosystem.vuejs.press/', icon: 'logos:vue' },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: `${version}`,
|
||||
icon: 'codicon:versions',
|
||||
badge: 'New',
|
||||
items: [
|
||||
{ text: 'Changelog', link: '/en/changelog/' },
|
||||
{ text: 'Contributing', link: '/en/contributing/' },
|
||||
],
|
||||
},
|
||||
])
|
||||
54
docs/.vuepress/plume.config.ts
Normal file
54
docs/.vuepress/plume.config.ts
Normal file
@ -0,0 +1,54 @@
|
||||
import type { ThemeConfig } from 'vuepress-theme-plume'
|
||||
import path from 'node:path'
|
||||
import { defineThemeConfig } from 'vuepress-theme-plume'
|
||||
import { enCollections, zhCollections } from './collections/index.js'
|
||||
import { enNavbar, zhNavbar } from './navbar.js'
|
||||
|
||||
export default defineThemeConfig({
|
||||
logo: '/plume.png',
|
||||
|
||||
profile: {
|
||||
avatar: '/plume.png',
|
||||
name: 'Plume Theme',
|
||||
description: 'The Theme for Vuepress 2.0',
|
||||
location: 'GuangZhou, China',
|
||||
organization: 'pengzhanbo',
|
||||
},
|
||||
|
||||
transition: { appearance: 'circle-clip' },
|
||||
|
||||
social: [
|
||||
{ icon: 'github', link: 'https://github.com/pengzhanbo/vuepress-theme-plume' },
|
||||
{ icon: 'qq', link: 'https://qm.qq.com/q/FbPPoOIscE' },
|
||||
],
|
||||
navbarSocialInclude: ['github', 'qq'],
|
||||
|
||||
footer: {
|
||||
copyright: 'Copyright © 2021-present pengzhanbo',
|
||||
},
|
||||
|
||||
locales: {
|
||||
'/': {
|
||||
navbar: zhNavbar,
|
||||
collections: zhCollections,
|
||||
},
|
||||
'/en/': {
|
||||
navbar: enNavbar,
|
||||
collections: enCollections,
|
||||
},
|
||||
},
|
||||
|
||||
encrypt: {
|
||||
rules: {
|
||||
'/article/enx7c9s/': '123456',
|
||||
},
|
||||
},
|
||||
|
||||
bulletin: {
|
||||
layout: 'top-right',
|
||||
lifetime: 'always',
|
||||
// title: '🎉 公告 🎉',
|
||||
contentFile: path.join(__dirname, 'bulletin.md'),
|
||||
enablePage: page => page.path === '/guide/features/bulletin/',
|
||||
},
|
||||
}) as ThemeConfig
|
||||
1
docs/.vuepress/public/CNAME
Normal file
1
docs/.vuepress/public/CNAME
Normal file
@ -0,0 +1 @@
|
||||
plume.pengzhanbo.cn
|
||||
4
docs/.vuepress/public/_redirects
Normal file
4
docs/.vuepress/public/_redirects
Normal file
@ -0,0 +1,4 @@
|
||||
/llms.md /llms.txt 200!
|
||||
/llms-full.md /llms-full.txt 200!
|
||||
/en/llms.md /en/llms.txt 200!
|
||||
/en/llms-full.md /en/llms-full.txt 200!
|
||||
1040
docs/.vuepress/public/data/flare.json
Normal file
1040
docs/.vuepress/public/data/flare.json
Normal file
File diff suppressed because it is too large
Load Diff
BIN
docs/.vuepress/public/favicon-16x16.png
Normal file
BIN
docs/.vuepress/public/favicon-16x16.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 714 B |
BIN
docs/.vuepress/public/favicon-32x32.png
Normal file
BIN
docs/.vuepress/public/favicon-32x32.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.9 KiB |
BIN
docs/.vuepress/public/favicon.ico
Normal file
BIN
docs/.vuepress/public/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user