Compare commits
1505 Commits
react-exam
...
tree-item-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6bf9c5a083 | ||
|
|
bb0a961784 | ||
|
|
e2f2a8a0d3 | ||
|
|
86293cc3e1 | ||
|
|
8fb521d9ef | ||
|
|
afdba40296 | ||
|
|
decd4340a8 | ||
|
|
2491ca45ac | ||
|
|
411d385d65 | ||
|
|
634828d89a | ||
|
|
17fd3d238c | ||
|
|
ab0f2a1411 | ||
|
|
4069360242 | ||
|
|
8c51c5b933 | ||
|
|
5a6ce1c4d3 | ||
|
|
e695b54dcd | ||
|
|
9a3fc59e6a | ||
|
|
dfaa959951 | ||
|
|
9d6ded49b9 | ||
|
|
3451255454 | ||
|
|
20628a98eb | ||
|
|
3d4b3ada27 | ||
|
|
0bead172fe | ||
|
|
9ca3e6f39c | ||
|
|
e2c7286ccc | ||
|
|
46812e08c5 | ||
|
|
0f601df74a | ||
|
|
eb2410ff88 | ||
|
|
479fff4b61 | ||
|
|
9c7b341889 | ||
|
|
d09973b571 | ||
|
|
a03da137e3 | ||
|
|
d8b0447151 | ||
|
|
6f0bd4e872 | ||
|
|
55973a7eff | ||
|
|
e9aa72cc87 | ||
|
|
9716ecec41 | ||
|
|
776b980ce5 | ||
|
|
02f58d3c8b | ||
|
|
fba18efad6 | ||
|
|
4a7f9dfe00 | ||
|
|
1fbde40bab | ||
|
|
14bd0459df | ||
|
|
e4a4d2eb18 | ||
|
|
a465f0348f | ||
|
|
5e1eba1751 | ||
|
|
00f79f3749 | ||
|
|
788804774f | ||
|
|
986b8c4d99 | ||
|
|
d18d44eaa6 | ||
|
|
29422d196a | ||
|
|
d68351b8b0 | ||
|
|
0d2b5c7381 | ||
|
|
c221bdd6fc | ||
|
|
a4b2fc7c13 | ||
|
|
887797e3b8 | ||
|
|
246a64ffa5 | ||
|
|
ac5ae9e193 | ||
|
|
2a22696cc9 | ||
|
|
85949f5502 | ||
|
|
2e0d72ca92 | ||
|
|
4c9aed87a0 | ||
|
|
eb9bda5e28 | ||
|
|
8d590d2597 | ||
|
|
ef0b9ff742 | ||
|
|
f906b07d98 | ||
|
|
1bfebe36a3 | ||
|
|
2ae0138d00 | ||
|
|
3612f72a3f | ||
|
|
0f6cf33020 | ||
|
|
95fb68c7fa | ||
|
|
7d3c676ea8 | ||
|
|
9f02a55ebb | ||
|
|
0a70f1b7ab | ||
|
|
122ce96d26 | ||
|
|
6dd1d6263c | ||
|
|
23793333f0 | ||
|
|
bac343f900 | ||
|
|
205e3bf131 | ||
|
|
927562127f | ||
|
|
3a23e48473 | ||
|
|
925cc2816f | ||
|
|
03949b8673 | ||
|
|
96733925d6 | ||
|
|
d792ac00e9 | ||
|
|
3bf62371d0 | ||
|
|
22e7372a63 | ||
|
|
a4788cd01d | ||
|
|
7675aeb788 | ||
|
|
24f6508716 | ||
|
|
322491d84d | ||
|
|
f89638bc6d | ||
|
|
951dbabfc4 | ||
|
|
096aa1f22d | ||
|
|
ee5f7cddef | ||
|
|
0aefdc20cd | ||
|
|
0d5d7b5e73 | ||
|
|
ac97c7087a | ||
|
|
eeb41f4d99 | ||
|
|
b0680f19a9 | ||
|
|
1101a3cf07 | ||
|
|
3c0924fac2 | ||
|
|
d490d04ebc | ||
|
|
52b5f557e0 | ||
|
|
dd1c689e33 | ||
|
|
f398899991 | ||
|
|
8fc0ee89ff | ||
|
|
ed17964f10 | ||
|
|
64ce424c42 | ||
|
|
51253650e1 | ||
|
|
0b45173192 | ||
|
|
0eb8eaea00 | ||
|
|
334e3361b4 | ||
|
|
5e482739a9 | ||
|
|
c0b18f6580 | ||
|
|
c18df17429 | ||
|
|
2ec957ff76 | ||
|
|
1fd68dfb3c | ||
|
|
0b5689de62 | ||
|
|
8ffd9991db | ||
|
|
566f98359c | ||
|
|
6387dffe75 | ||
|
|
bb747d50dd | ||
|
|
2704ef7197 | ||
|
|
336a3acdd0 | ||
|
|
e68640b8ca | ||
|
|
487b629995 | ||
|
|
255647d2a9 | ||
|
|
53f1b3615d | ||
|
|
d00d8bac4e | ||
|
|
87864924e1 | ||
|
|
ce3496a621 | ||
|
|
cf80b57a79 | ||
|
|
694a9eccb9 | ||
|
|
502df6ee9c | ||
|
|
44142fb56d | ||
|
|
7e00d2b02e | ||
|
|
fcf37f83a1 | ||
|
|
0beceff73f | ||
|
|
afe60eae69 | ||
|
|
b4f45f4ff1 | ||
|
|
fd4cded708 | ||
|
|
4b2b72e822 | ||
|
|
56657ebcfc | ||
|
|
844015df7b | ||
|
|
d5da2e2db5 | ||
|
|
efbc404524 | ||
|
|
b6afa148ae | ||
|
|
7c3795897c | ||
|
|
986e52f977 | ||
|
|
6dce88429a | ||
|
|
04497cfd13 | ||
|
|
75116a5b0c | ||
|
|
5e192023b4 | ||
|
|
26b29189db | ||
|
|
ac20e495d9 | ||
|
|
4ac31e06f3 | ||
|
|
4993b1034f | ||
|
|
b3b93091f7 | ||
|
|
8cf20d9938 | ||
|
|
63296b7ed5 | ||
|
|
0e56ed0cbb | ||
|
|
e70cb5c66d | ||
|
|
913abd0db1 | ||
|
|
d2798a96da | ||
|
|
42729153db | ||
|
|
c2df5ca1ea | ||
|
|
c49813c7c1 | ||
|
|
f63dfbfff0 | ||
|
|
9a7947debd | ||
|
|
d2e1653519 | ||
|
|
5b7004e72d | ||
|
|
7ccfed9e93 | ||
|
|
4f1de3918b | ||
|
|
adaea2fa5f | ||
|
|
e016e4bd48 | ||
|
|
5e0b5f3fe6 | ||
|
|
493e1c06b9 | ||
|
|
8b763d0392 | ||
|
|
9d82749abb | ||
|
|
3e3e5276a6 | ||
|
|
a0a47b1bdf | ||
|
|
fa51cff947 | ||
|
|
fd08d4f227 | ||
|
|
7008c0cef7 | ||
|
|
e9ce8659f6 | ||
|
|
325d6f211b | ||
|
|
bd1570ec76 | ||
|
|
406f3a0e81 | ||
|
|
08babbce6d | ||
|
|
293b86705a | ||
|
|
fe5ab48c06 | ||
|
|
35e9dfe88d | ||
|
|
44567ec967 | ||
|
|
bfdd0bd6d0 | ||
|
|
f3f5d40b7b | ||
|
|
3d75d6b59c | ||
|
|
f30801ab66 | ||
|
|
f92ef1f74e | ||
|
|
da27a8dc74 | ||
|
|
437e0d9aec | ||
|
|
583d9c0616 | ||
|
|
cb29033eaf | ||
|
|
c02ac306af | ||
|
|
56d678b504 | ||
|
|
b1864eb93d | ||
|
|
d2b5613e85 | ||
|
|
f7ca634822 | ||
|
|
35d33c89b9 | ||
|
|
094bd478ff | ||
|
|
0b619a99f1 | ||
|
|
89cf48c865 | ||
|
|
b7a6ebd228 | ||
|
|
6c8bbd51d1 | ||
|
|
6085b9698c | ||
|
|
17ee36175b | ||
|
|
3c7bb71a59 | ||
|
|
d66b552962 | ||
|
|
6f6e23c78c | ||
|
|
310f7a8c5d | ||
|
|
9a7b258108 | ||
|
|
e10aba0ed1 | ||
|
|
1ea5dae9ad | ||
|
|
21310bd367 | ||
|
|
c1478e5865 | ||
|
|
9b8433c996 | ||
|
|
57dac67aab | ||
|
|
441bfd7b72 | ||
|
|
7150c59334 | ||
|
|
bd2a3c3b64 | ||
|
|
11519625ed | ||
|
|
f19848c11e | ||
|
|
36b21b0be7 | ||
|
|
fe2c2ab7af | ||
|
|
b98b9baba4 | ||
|
|
7b18be876b | ||
|
|
c9e6895ef7 | ||
|
|
64c8647dee | ||
|
|
9e9a00547a | ||
|
|
f747483e32 | ||
|
|
8719bbc88b | ||
|
|
0ff5e7fb7a | ||
|
|
2a52b2766f | ||
|
|
1e8bbc3b06 | ||
|
|
1ef9cb9601 | ||
|
|
5b54410212 | ||
|
|
f621fbb224 | ||
|
|
f5624fbf4a | ||
|
|
f65bc3918e | ||
|
|
f49c10b05b | ||
|
|
3b6c018fed | ||
|
|
c10e1e77c9 | ||
|
|
a1e879035c | ||
|
|
d2625fccab | ||
|
|
29c8ad08bb | ||
|
|
0f68e6f0dd | ||
|
|
4dca2b9541 | ||
|
|
36ccaa4aaa | ||
|
|
c86d7635aa | ||
|
|
d84e842a4e | ||
|
|
fb8c06235f | ||
|
|
f6a10e9dda | ||
|
|
5ce34677ed | ||
|
|
8ebc839dfd | ||
|
|
2779eb1753 | ||
|
|
341ca809e9 | ||
|
|
7232ddee5d | ||
|
|
f63001f18e | ||
|
|
8b831f6ece | ||
|
|
4dee3d0f2d | ||
|
|
10a78d99af | ||
|
|
99d9024339 | ||
|
|
313e31a3f2 | ||
|
|
4eeabc57e5 | ||
|
|
c8c0d0f848 | ||
|
|
e8687b895d | ||
|
|
7743b670ed | ||
|
|
88e99d7cd3 | ||
|
|
c0d18ab9f0 | ||
|
|
6576f67cfa | ||
|
|
057ff5fb31 | ||
|
|
1dac76a35e | ||
|
|
e7f2962984 | ||
|
|
956dc9bdd9 | ||
|
|
62020be8c1 | ||
|
|
429cf68301 | ||
|
|
dd77663a75 | ||
|
|
fa9f18f002 | ||
|
|
c2e2e1afcc | ||
|
|
2628f4ff7c | ||
|
|
16722a191d | ||
|
|
21243729c6 | ||
|
|
1581b99796 | ||
|
|
103cbc439e | ||
|
|
3a40ffe58a | ||
|
|
453e8ff501 | ||
|
|
dc556e5379 | ||
|
|
c11d6129a3 | ||
|
|
dd5c32680a | ||
|
|
81996cbc63 | ||
|
|
d20945d78b | ||
|
|
07327be95e | ||
|
|
b99d7771dc | ||
|
|
10cc9bdc68 | ||
|
|
bc598dad92 | ||
|
|
ff61ac002f | ||
|
|
63ec9d5bc1 | ||
|
|
555327b2fc | ||
|
|
15c6eaec90 | ||
|
|
6f856fbd89 | ||
|
|
df46e1db3b | ||
|
|
d21d829c29 | ||
|
|
2331e88dcf | ||
|
|
c162983ca2 | ||
|
|
0d09037916 | ||
|
|
d2e32a0a53 | ||
|
|
71d45eabbd | ||
|
|
eac60a9022 | ||
|
|
f8dca5d1a8 | ||
|
|
5980b5f843 | ||
|
|
9a3ffb04ba | ||
|
|
04d37224e0 | ||
|
|
f4a63f9e22 | ||
|
|
3ab342ebb6 | ||
|
|
48fe9389c8 | ||
|
|
6b2a081fa0 | ||
|
|
afb2082c79 | ||
|
|
7bdc9a2cc4 | ||
|
|
dead18d23c | ||
|
|
2b37c54d7c | ||
|
|
35b61e5cf3 | ||
|
|
cc33805d27 | ||
|
|
6e548dd85b | ||
|
|
212ca5b0a6 | ||
|
|
b96c3f318b | ||
|
|
b0aba7ce07 | ||
|
|
e39bb856c4 | ||
|
|
23dc884678 | ||
|
|
4e14f25831 | ||
|
|
b15502a01e | ||
|
|
73f6eeacbd | ||
|
|
5921f3eeaa | ||
|
|
35338ef643 | ||
|
|
5c950a7874 | ||
|
|
a7ea989170 | ||
|
|
7253ed8ab0 | ||
|
|
37e82b70fa | ||
|
|
39d1b82634 | ||
|
|
1259a9b78d | ||
|
|
59077e75d2 | ||
|
|
62ddf13a6a | ||
|
|
684bb25244 | ||
|
|
1f2ebf5e7a | ||
|
|
2182d3c692 | ||
|
|
074c7a16d6 | ||
|
|
4130246833 | ||
|
|
bbda731f56 | ||
|
|
6492ee7728 | ||
|
|
73e1c04b37 | ||
|
|
49bb6af154 | ||
|
|
9b8d73a2ea | ||
|
|
0b4c1a5934 | ||
|
|
8b17b3d3e0 | ||
|
|
f5d1b74e00 | ||
|
|
40ea444c48 | ||
|
|
403927687e | ||
|
|
6af4e849af | ||
|
|
2c839a4225 | ||
|
|
3703ef26da | ||
|
|
3640b4c6e1 | ||
|
|
27fc269a94 | ||
|
|
a5b2fffb7a | ||
|
|
7de6a676b8 | ||
|
|
3c77d400f8 | ||
|
|
6ee10f44f4 | ||
|
|
6afc6e928c | ||
|
|
f8fcbd60ec | ||
|
|
bdd25571a8 | ||
|
|
38c13640fc | ||
|
|
00a3b1aa8d | ||
|
|
22298781c5 | ||
|
|
fe27710f57 | ||
|
|
d94589d113 | ||
|
|
3508bf6339 | ||
|
|
61e65ffcb9 | ||
|
|
aed28adbe4 | ||
|
|
15b8bde81b | ||
|
|
9ee3fb5d28 | ||
|
|
47aa376c08 | ||
|
|
69ba974a50 | ||
|
|
8dfb411e5e | ||
|
|
a35a8fd2ad | ||
|
|
2503005bbd | ||
|
|
78027170ea | ||
|
|
a20aa48992 | ||
|
|
ac8accd664 | ||
|
|
c571573063 | ||
|
|
e813440315 | ||
|
|
cfc3f181a3 | ||
|
|
7545f04c46 | ||
|
|
38bd6528fe | ||
|
|
2202ea9642 | ||
|
|
58fbcede51 | ||
|
|
971200cc88 | ||
|
|
b75d3b615c | ||
|
|
9d1c47449e | ||
|
|
003fd28cb0 | ||
|
|
2f300d8930 | ||
|
|
f13deb87bb | ||
|
|
deb9fd70b3 | ||
|
|
ff3b3d6558 | ||
|
|
6b3edb8a56 | ||
|
|
6162b8b115 | ||
|
|
cff752b600 | ||
|
|
7892a94b9b | ||
|
|
40a58ff35f | ||
|
|
0f2950c4cc | ||
|
|
b334884f57 | ||
|
|
734417d66b | ||
|
|
2cfd651d2f | ||
|
|
3e2d1b98be | ||
|
|
40f332f37c | ||
|
|
bfda64f690 | ||
|
|
883d6df2ef | ||
|
|
b4240fd321 | ||
|
|
8755a834f6 | ||
|
|
8d905296b8 | ||
|
|
8eba1e5003 | ||
|
|
21aa85acc0 | ||
|
|
404c15b303 | ||
|
|
8a26afc334 | ||
|
|
513a1e35a9 | ||
|
|
09f668fc99 | ||
|
|
d451ba98e5 | ||
|
|
fd287edd56 | ||
|
|
8424b49646 | ||
|
|
fa24c0f70e | ||
|
|
1bba87c66d | ||
|
|
0db9ca12e3 | ||
|
|
041555fe99 | ||
|
|
b41dbd2de7 | ||
|
|
7c6f31e0c7 | ||
|
|
9e84274a93 | ||
|
|
2b3803f91e | ||
|
|
faed8da3cd | ||
|
|
17cf902f53 | ||
|
|
8214ff6b2d | ||
|
|
c9979e15f8 | ||
|
|
fcfe2bde7d | ||
|
|
59dcaaff83 | ||
|
|
5bad30ec30 | ||
|
|
87c1762146 | ||
|
|
899edd1d5e | ||
|
|
872a110b1e | ||
|
|
07fe6d598e | ||
|
|
79bafc513a | ||
|
|
1d03f7bee0 | ||
|
|
a9bf1bd838 | ||
|
|
c0ca739366 | ||
|
|
a6745602d6 | ||
|
|
da4f619d95 | ||
|
|
1283a696a5 | ||
|
|
d12b97b0b0 | ||
|
|
e5c2884880 | ||
|
|
1d600a77c4 | ||
|
|
db3c568ba2 | ||
|
|
4bb9805ba6 | ||
|
|
bd935fa8d5 | ||
|
|
c3e582b47b | ||
|
|
4d094a4e19 | ||
|
|
782c404bdf | ||
|
|
f1438981b2 | ||
|
|
18b88c2f5c | ||
|
|
a2d85f49a3 | ||
|
|
be00026cd3 | ||
|
|
58ed88bc5a | ||
|
|
1d14e186f3 | ||
|
|
5f672aabc2 | ||
|
|
db08e12a32 | ||
|
|
e0fc639226 | ||
|
|
e6c662b543 | ||
|
|
d1de9a9a73 | ||
|
|
4931de8eb4 | ||
|
|
71e7227763 | ||
|
|
dd671e15aa | ||
|
|
2daeea0349 | ||
|
|
3cb6625c1d | ||
|
|
c4b5446d01 | ||
|
|
41affca083 | ||
|
|
132dbfabcc | ||
|
|
4fc6224464 | ||
|
|
4921d1c32e | ||
|
|
54d71d2319 | ||
|
|
c1ecca0169 | ||
|
|
d6a91919e0 | ||
|
|
4621094ea1 | ||
|
|
726dc73e2a | ||
|
|
4bfebf3249 | ||
|
|
99ad0abdd3 | ||
|
|
902e2b6367 | ||
|
|
7f3210b12d | ||
|
|
eee63bdecd | ||
|
|
a91fd07ed7 | ||
|
|
34aa8917a6 | ||
|
|
715c2c0def | ||
|
|
13b5385633 | ||
|
|
d25f3748c4 | ||
|
|
b6620ddf7e | ||
|
|
d70d4a91b1 | ||
|
|
bb1f7b2b7a | ||
|
|
9921c17d63 | ||
|
|
7f964f9b56 | ||
|
|
31eeea1630 | ||
|
|
ffda52a7cf | ||
|
|
9be7919c60 | ||
|
|
c30f3c4b09 | ||
|
|
7e8f13b5cb | ||
|
|
97ab986425 | ||
|
|
f1fa7f713e | ||
|
|
3394a95057 | ||
|
|
eed9ddb9b3 | ||
|
|
daf5e7734d | ||
|
|
63133d0e33 | ||
|
|
b2d74145b8 | ||
|
|
17eeccbc5d | ||
|
|
68f645e776 | ||
|
|
b3e4c59197 | ||
|
|
6080a85035 | ||
|
|
f7e088c8df | ||
|
|
80e1c05b37 | ||
|
|
99f0273783 | ||
|
|
8e13683a30 | ||
|
|
fd73542d2c | ||
|
|
bde0ed7403 | ||
|
|
8dc49f7119 | ||
|
|
25cb96aa30 | ||
|
|
360273ac27 | ||
|
|
404d59d9d6 | ||
|
|
ce1ce6caca | ||
|
|
74ecc52a15 | ||
|
|
a64cc60ad5 | ||
|
|
c5f91ec2f7 | ||
|
|
4f9af1e871 | ||
|
|
aeb25f3a7d | ||
|
|
b89ee673e6 | ||
|
|
3c70c44b8a | ||
|
|
d8881c0b1e | ||
|
|
88b6fe2fbe | ||
|
|
6a0725cf00 | ||
|
|
3ff8745910 | ||
|
|
0cb72adb28 | ||
|
|
3d35f5d4e0 | ||
|
|
815cc4220b | ||
|
|
a7caf19b34 | ||
|
|
71c054d6e4 | ||
|
|
e1bf5471bf | ||
|
|
099edc5186 | ||
|
|
e3560dcf98 | ||
|
|
f2bb2c84a0 | ||
|
|
13b3342017 | ||
|
|
d1c1d689ce | ||
|
|
44e5e37a2b | ||
|
|
566aae927d | ||
|
|
7258c001a7 | ||
|
|
7a70940c6a | ||
|
|
45f4edc426 | ||
|
|
da32015f27 | ||
|
|
03d8238edb | ||
|
|
34f8744493 | ||
|
|
fa3fe5f753 | ||
|
|
fc6c7de1fd | ||
|
|
0037712549 | ||
|
|
5301945bfa | ||
|
|
1298651dd8 | ||
|
|
5f9695fde1 | ||
|
|
2eb2597efe | ||
|
|
431e82261b | ||
|
|
df51149d0a | ||
|
|
fba0b11343 | ||
|
|
3618e93490 | ||
|
|
cfa95307d1 | ||
|
|
15344c2a2a | ||
|
|
3974aa5130 | ||
|
|
a6702ad6d2 | ||
|
|
ecf21adddc | ||
|
|
52c24fc3b7 | ||
|
|
d464714d7b | ||
|
|
7d089bbe2f | ||
|
|
71914afc91 | ||
|
|
9d139e3fa0 | ||
|
|
db3039e9fe | ||
|
|
9494b9bb67 | ||
|
|
7e1f4f0351 | ||
|
|
5ebe4f4d3e | ||
|
|
dfb9d53a25 | ||
|
|
c2c1a2ff5b | ||
|
|
ac86c037a1 | ||
|
|
6b07c9a040 | ||
|
|
24a76f6a7c | ||
|
|
89c0667e9c | ||
|
|
434084ea4e | ||
|
|
1738c6345b | ||
|
|
0ac7916a1b | ||
|
|
e7979991e3 | ||
|
|
07f70098f8 | ||
|
|
17146698db | ||
|
|
bf852b1296 | ||
|
|
e367c0ef29 | ||
|
|
01210ef364 | ||
|
|
40648e15fb | ||
|
|
ab67ecfad3 | ||
|
|
a07f6280a3 | ||
|
|
6822b25772 | ||
|
|
200188b0c3 | ||
|
|
bc6fe95f13 | ||
|
|
3a33fa208a | ||
|
|
3ec4e6de07 | ||
|
|
eb07dc1410 | ||
|
|
5bfeb8044e | ||
|
|
aa915c3e28 | ||
|
|
c79457a607 | ||
|
|
419f0610e4 | ||
|
|
7ab5ca8640 | ||
|
|
c39faff936 | ||
|
|
6d31db57f6 | ||
|
|
21ed4f82b0 | ||
|
|
844e374a72 | ||
|
|
e5f4c14608 | ||
|
|
1ad963f5ad | ||
|
|
4476117932 | ||
|
|
e52a7a5ce5 | ||
|
|
fa66f4262d | ||
|
|
a87f3627bb | ||
|
|
06e432589f | ||
|
|
b4c4074ae1 | ||
|
|
19042fcca4 | ||
|
|
8541369ae1 | ||
|
|
31cfdf5704 | ||
|
|
3511a60b93 | ||
|
|
e55e091192 | ||
|
|
09df23dff8 | ||
|
|
f4a88c3b3a | ||
|
|
559efcd1d2 | ||
|
|
e046015ed5 | ||
|
|
44dbdd14cc | ||
|
|
5e3fed605e | ||
|
|
4b4f2247c5 | ||
|
|
eca15dc7fc | ||
|
|
eca444bbaa | ||
|
|
f39308dbc5 | ||
|
|
fc84e1a50d | ||
|
|
ef7d47e2b9 | ||
|
|
a9af3172ad | ||
|
|
cde8bea97a | ||
|
|
33b4045dad | ||
|
|
bc4ad39f2e | ||
|
|
b868b1e8fc | ||
|
|
e916d771b0 | ||
|
|
bd6fe74c7d | ||
|
|
ac7437894a | ||
|
|
55ebe6e20b | ||
|
|
e6388e7671 | ||
|
|
9a21ae6f52 | ||
|
|
cd3386ce78 | ||
|
|
26b9bbb515 | ||
|
|
bda0ec0313 | ||
|
|
2490fbeaca | ||
|
|
297149021e | ||
|
|
c700c3ec09 | ||
|
|
b383d8bf2d | ||
|
|
1dcf895be1 | ||
|
|
19fd55ca97 | ||
|
|
fa094d924d | ||
|
|
2a957e6316 | ||
|
|
90b6a9a8ac | ||
|
|
99fdd90601 | ||
|
|
ecaa461638 | ||
|
|
d3a65ee35d | ||
|
|
8ab1489cc4 | ||
|
|
093c42ce66 | ||
|
|
ed3e7014e3 | ||
|
|
7db62766dc | ||
|
|
2de515bce7 | ||
|
|
80949c2988 | ||
|
|
c7a35afefb | ||
|
|
89dd462720 | ||
|
|
ce40d5e997 | ||
|
|
752cbb2f16 | ||
|
|
2048df8a40 | ||
|
|
beace5a611 | ||
|
|
1a8908acf7 | ||
|
|
812badd721 | ||
|
|
8142da95d8 | ||
|
|
546c9c67b4 | ||
|
|
d5fe23ab39 | ||
|
|
3b10933151 | ||
|
|
51a416718d | ||
|
|
08f327c224 | ||
|
|
b196ccc0bc | ||
|
|
c62eed16aa | ||
|
|
e982c10987 | ||
|
|
23af07bcd5 | ||
|
|
6aca515024 | ||
|
|
7d3f8b175c | ||
|
|
e2acfd106f | ||
|
|
cfd282df4b | ||
|
|
d0567c7ae9 | ||
|
|
f076dd1afa | ||
|
|
83fb761d41 | ||
|
|
fd337dd1ee | ||
|
|
22883021e9 | ||
|
|
02b72f991b | ||
|
|
84734a56b6 | ||
|
|
c159964490 | ||
|
|
5c8e044f4d | ||
|
|
a238880dbe | ||
|
|
307c989e3b | ||
|
|
c33d17b4a2 | ||
|
|
9d3e2bd214 | ||
|
|
6e99787425 | ||
|
|
43a1179513 | ||
|
|
8887056651 | ||
|
|
ec3251d0c6 | ||
|
|
f5ac87c8a3 | ||
|
|
a3d8f712ce | ||
|
|
0fdf4e0f4d | ||
|
|
013cf46be8 | ||
|
|
cbd74eded2 | ||
|
|
960c6d8da3 | ||
|
|
ef81c77c60 | ||
|
|
01918ca784 | ||
|
|
b0bb014167 | ||
|
|
9f12c1d9ab | ||
|
|
4456a8df5c | ||
|
|
8e7816f308 | ||
|
|
3861041bc1 | ||
|
|
e29ae5d18e | ||
|
|
6ef2e92923 | ||
|
|
562fec9ac7 | ||
|
|
b38568f5c5 | ||
|
|
c0012f5b94 | ||
|
|
41ee75bbfe | ||
|
|
54f7916ddb | ||
|
|
e170b488ea | ||
|
|
cd172ede8c | ||
|
|
d1b38af039 | ||
|
|
506fb2588b | ||
|
|
123a8c331f | ||
|
|
1a1847eeb5 | ||
|
|
835326a2db | ||
|
|
1905ca9b77 | ||
|
|
fc3688df97 | ||
|
|
107f074f99 | ||
|
|
5d3e58bde0 | ||
|
|
f5b8f2257d | ||
|
|
52c0fdf6de | ||
|
|
c2c42f56ba | ||
|
|
328d6989d9 | ||
|
|
49465c9a1d | ||
|
|
394a028973 | ||
|
|
431d23d420 | ||
|
|
c230a42053 | ||
|
|
378f100729 | ||
|
|
87314f8864 | ||
|
|
70a8fc6425 | ||
|
|
486b0649e0 | ||
|
|
63a2367cc5 | ||
|
|
995d0f2af4 | ||
|
|
874bb5cbf6 | ||
|
|
15495bd9bd | ||
|
|
f4678e12c6 | ||
|
|
2bf7ebbb71 | ||
|
|
68e53a4ef1 | ||
|
|
0f0b9d50cd | ||
|
|
5d13583da7 | ||
|
|
f99f32d054 | ||
|
|
39acaeba70 | ||
|
|
e87c725e07 | ||
|
|
31a3421709 | ||
|
|
5d1fb7c477 | ||
|
|
13e606c1cb | ||
|
|
42dd64f397 | ||
|
|
53e87e4dcd | ||
|
|
dabaef3fab | ||
|
|
d5939efc30 | ||
|
|
d345878de6 | ||
|
|
609578ff30 | ||
|
|
648137a964 | ||
|
|
cd487bf8be | ||
|
|
239ddcf75d | ||
|
|
ad2e945e44 | ||
|
|
11f7adefc2 | ||
|
|
909986b520 | ||
|
|
8de5fc9580 | ||
|
|
197aedcc70 | ||
|
|
491533e09c | ||
|
|
474d8d7c7b | ||
|
|
8d83076ef2 | ||
|
|
e69632ff60 | ||
|
|
996fa6df57 | ||
|
|
239782a7d8 | ||
|
|
7d3a629a1e | ||
|
|
067ae799fd | ||
|
|
ea165cb477 | ||
|
|
d33b5c4870 | ||
|
|
96db264724 | ||
|
|
dda4575aa4 | ||
|
|
2322762cc6 | ||
|
|
4a14eb3282 | ||
|
|
931faf911c | ||
|
|
f4db1e37e0 | ||
|
|
833b7b1207 | ||
|
|
622ee91323 | ||
|
|
d206414825 | ||
|
|
73d26ece05 | ||
|
|
3b90a1cc31 | ||
|
|
289ce105dc | ||
|
|
deb2752d35 | ||
|
|
df4393e033 | ||
|
|
cf34747701 | ||
|
|
ad467f0691 | ||
|
|
142403fe78 | ||
|
|
60f2b9657b | ||
|
|
a41787d23a | ||
|
|
252adbd830 | ||
|
|
c8db30fa0f | ||
|
|
fa415005eb | ||
|
|
ba8046bff5 | ||
|
|
948254dd29 | ||
|
|
82b799c1a4 | ||
|
|
358444bc1d | ||
|
|
dbab4ae645 | ||
|
|
f5ed55513b | ||
|
|
d6fb269381 | ||
|
|
3734f9cea5 | ||
|
|
5a058a8808 | ||
|
|
e2d99e3c86 | ||
|
|
e74edd8f68 | ||
|
|
d961203d17 | ||
|
|
be752371a6 | ||
|
|
af3b83318b | ||
|
|
b0cd38e2c5 | ||
|
|
0d8d718b7a | ||
|
|
54687046ab | ||
|
|
22529870f4 | ||
|
|
8aafea456d | ||
|
|
cfb70f2135 | ||
|
|
1d02644996 | ||
|
|
312809a766 | ||
|
|
5e221f6c3a | ||
|
|
232734563f | ||
|
|
5cbc64ad4f | ||
|
|
35858e0549 | ||
|
|
752b8d462e | ||
|
|
1da80bee80 | ||
|
|
315dd40734 | ||
|
|
5a82b7ad99 | ||
|
|
1a29875940 | ||
|
|
be0631bd3e | ||
|
|
e882102aff | ||
|
|
97c0470f13 | ||
|
|
47badda35c | ||
|
|
b2353ca9bd | ||
|
|
65310be0b0 | ||
|
|
ac9960c1f0 | ||
|
|
b9393068a7 | ||
|
|
9c216f60ff | ||
|
|
ce65a49dbe | ||
|
|
e973b599aa | ||
|
|
9979028d7e | ||
|
|
d09ea4a73a | ||
|
|
1bf83499b0 | ||
|
|
9c4e4a2280 | ||
|
|
f8e61f72c4 | ||
|
|
d08b95378a | ||
|
|
c1153708f6 | ||
|
|
d676c1b569 | ||
|
|
77f50a4890 | ||
|
|
24e2b47ff1 | ||
|
|
651c38afbf | ||
|
|
2dec73b2c5 | ||
|
|
ad36ba5569 | ||
|
|
1855d1b809 | ||
|
|
543fa3c85c | ||
|
|
fe05300bdc | ||
|
|
0eebf44292 | ||
|
|
7c40243da3 | ||
|
|
4a046684c8 | ||
|
|
49eeca1617 | ||
|
|
88e2af266f | ||
|
|
0bcc788752 | ||
|
|
5d687f1aa0 | ||
|
|
8fbd0b54e4 | ||
|
|
37a1680a85 | ||
|
|
2b0acca219 | ||
|
|
5293f0fa63 | ||
|
|
7d52f00d8d | ||
|
|
f8e367a5e7 | ||
|
|
b9541ba2e0 | ||
|
|
25ee6ef1ad | ||
|
|
45cb5598fc | ||
|
|
a6bf9ea58c | ||
|
|
1e1877c954 | ||
|
|
47c9f43954 | ||
|
|
2136fed4cb | ||
|
|
4b6baa93a6 | ||
|
|
ef4cbd915d | ||
|
|
d9b8fc6806 | ||
|
|
6bb6bcc538 | ||
|
|
e60a5032da | ||
|
|
a6b71e119c | ||
|
|
8e01281c12 | ||
|
|
a31de87882 | ||
|
|
dbfaa4299f | ||
|
|
78432c41d8 | ||
|
|
0d003c0309 | ||
|
|
0a796d618f | ||
|
|
84909930fb | ||
|
|
cbab3b09e5 | ||
|
|
8a321951d3 | ||
|
|
4852f5614f | ||
|
|
87621ef109 | ||
|
|
6a9c7dd2bc | ||
|
|
1fb8088fc8 | ||
|
|
27c58637eb | ||
|
|
426a242d26 | ||
|
|
7a7a7abe78 | ||
|
|
aade89b66e | ||
|
|
771a1559ef | ||
|
|
74ae758819 | ||
|
|
5e2081451d | ||
|
|
1ffdc19305 | ||
|
|
6996d17531 | ||
|
|
1e3b93d579 | ||
|
|
70fab26e6b | ||
|
|
725fb1f013 | ||
|
|
6d4c8e5942 | ||
|
|
b6e0ca5d45 | ||
|
|
35571c1d4e | ||
|
|
82a5aff8db | ||
|
|
e74a30f62a | ||
|
|
11d3a73f05 | ||
|
|
9fefb6d65a | ||
|
|
4b18c74b83 | ||
|
|
f739c6c143 | ||
|
|
9739aceb9f | ||
|
|
afde497a1a | ||
|
|
666f1e5d52 | ||
|
|
1013e83032 | ||
|
|
b15d938c7e | ||
|
|
c066c5f30b | ||
|
|
abbfd9b43d | ||
|
|
ee0167a059 | ||
|
|
f86c07bdab | ||
|
|
699595496e | ||
|
|
fa42764a4b | ||
|
|
15bbafd631 | ||
|
|
9423178df5 | ||
|
|
9260d35b4c | ||
|
|
10156a8218 | ||
|
|
d0574677c1 | ||
|
|
7b0274a657 | ||
|
|
325eaeb225 | ||
|
|
f840d623d5 | ||
|
|
f9590195a5 | ||
|
|
53eb0d8f30 | ||
|
|
b0c4c7263b | ||
|
|
b5d1a71f46 | ||
|
|
dd7b673328 | ||
|
|
9f0276f55e | ||
|
|
15d250b103 | ||
|
|
0c40579be4 | ||
|
|
f0f080a428 | ||
|
|
54b511b709 | ||
|
|
c50da3429b | ||
|
|
ad3cd289dd | ||
|
|
b1fffc7df9 | ||
|
|
587db10022 | ||
|
|
47294ad0ed | ||
|
|
28ebab868b | ||
|
|
07d15fd863 | ||
|
|
2c9eb385fd | ||
|
|
6d9f513f68 | ||
|
|
4b56a03144 | ||
|
|
9c17d27af4 | ||
|
|
cc37a5c44b | ||
|
|
9e6ee89585 | ||
|
|
ea25de8040 | ||
|
|
7bee00d706 | ||
|
|
6b9f064aeb | ||
|
|
e9377cf746 | ||
|
|
35d2b7f12a | ||
|
|
922d7d9894 | ||
|
|
24f5f3c4ca | ||
|
|
8358127992 | ||
|
|
67563b2bba | ||
|
|
73e9e9ab3a | ||
|
|
7ce393feb8 | ||
|
|
b25e58b24b | ||
|
|
cb0240c91d | ||
|
|
16302c0130 | ||
|
|
88f2f99290 | ||
|
|
36a397ddaa | ||
|
|
8fd897e348 | ||
|
|
adc76b4eb1 | ||
|
|
cbb4aa8be1 | ||
|
|
968930c543 | ||
|
|
4be8a46cdd | ||
|
|
c02496ff02 | ||
|
|
4b8afb4bc3 | ||
|
|
01aa2afc15 | ||
|
|
4f3539cb43 | ||
|
|
260bd47030 | ||
|
|
f27c982962 | ||
|
|
19340adcfb | ||
|
|
f22e598ad6 | ||
|
|
68f693cbc0 | ||
|
|
2f6fe33e2c | ||
|
|
c307cfde1c | ||
|
|
883ef50186 | ||
|
|
c359556605 | ||
|
|
3e18309367 | ||
|
|
2fb0cc7d6d | ||
|
|
26449e12e5 | ||
|
|
7058de0568 | ||
|
|
0c3438e1a5 | ||
|
|
bae9b57c2a | ||
|
|
739c45d34c | ||
|
|
32df4598fc | ||
|
|
f52daeecdc | ||
|
|
930216e3f7 | ||
|
|
8e40a082f5 | ||
|
|
e3fdf61e4a | ||
|
|
414b29b046 | ||
|
|
ba4cdc9b28 | ||
|
|
99704faeb4 | ||
|
|
78c446f525 | ||
|
|
b50b4ca632 | ||
|
|
21d84332e4 | ||
|
|
c88a2c788d | ||
|
|
b1c459c226 | ||
|
|
a8ddefe31e | ||
|
|
80d23a4efe | ||
|
|
5393a86e2b | ||
|
|
1d822db30d | ||
|
|
654cd0b0bd | ||
|
|
6da942083c | ||
|
|
f15814c784 | ||
|
|
60c7c91e8a | ||
|
|
62cf254365 | ||
|
|
747f185dc5 | ||
|
|
1a61bd9583 | ||
|
|
7cff8fadde | ||
|
|
67abde6d97 | ||
|
|
6e0b3d820c | ||
|
|
998180b05d | ||
|
|
ee9cc49956 | ||
|
|
3f79b35878 | ||
|
|
fd3ec885f9 | ||
|
|
22ca715ddb | ||
|
|
5e6b8628d4 | ||
|
|
0a980addc3 | ||
|
|
9bbfa1aeb2 | ||
|
|
48fc9d9779 | ||
|
|
8ec8e2a9b4 | ||
|
|
5ec5979136 | ||
|
|
4926ad6ce5 | ||
|
|
f013756b7b | ||
|
|
feb092a7fa | ||
|
|
406e899b34 | ||
|
|
4d89c344d1 | ||
|
|
b9f484ceb6 | ||
|
|
1920ae8c1e | ||
|
|
08422c29e7 | ||
|
|
59a70dd5b7 | ||
|
|
86a80d3e78 | ||
|
|
1cebae7868 | ||
|
|
7b0ab1f7b7 | ||
|
|
1aebdf4a06 | ||
|
|
e94a424596 | ||
|
|
14db763613 | ||
|
|
65ced601e9 | ||
|
|
2f0b259d96 | ||
|
|
8267dd91d9 | ||
|
|
2149a1efde | ||
|
|
7990717a95 | ||
|
|
4526effbfa | ||
|
|
a8774b5c88 | ||
|
|
fbc5946e71 | ||
|
|
0fbdf110b1 | ||
|
|
d37d873b4c | ||
|
|
d5419ab0d0 | ||
|
|
4805cdb64c | ||
|
|
5d74d8163b | ||
|
|
76c74fc8a9 | ||
|
|
321f53f953 | ||
|
|
849def9ef2 | ||
|
|
911668617b | ||
|
|
d55e750ecd | ||
|
|
08d6af502c | ||
|
|
9a68409ccd | ||
|
|
b8f4a38c80 | ||
|
|
a86acc9717 | ||
|
|
a1fc75689e | ||
|
|
0a5e4ab99c | ||
|
|
fd8876b3c4 | ||
|
|
994cba2fcf | ||
|
|
fb565d202e | ||
|
|
adb655a53b | ||
|
|
2d19c5d915 | ||
|
|
ff0e00e4e4 | ||
|
|
1ea76cc08a | ||
|
|
786b3c3da2 | ||
|
|
c74049a140 | ||
|
|
e7a0444c67 | ||
|
|
32ed169ca8 | ||
|
|
9e2f1d15d8 | ||
|
|
8d93a44566 | ||
|
|
471cb0287d | ||
|
|
1428ec0708 | ||
|
|
4ed0a93ec6 | ||
|
|
ba125dc06a | ||
|
|
fe8b0624fe | ||
|
|
56dc07e30d | ||
|
|
6dd31748e9 | ||
|
|
2f4379716a | ||
|
|
58ac1c920d | ||
|
|
abedd14cac | ||
|
|
73ca47b608 | ||
|
|
5ddc832e9d | ||
|
|
c097b21443 | ||
|
|
17fb0ef94e | ||
|
|
2089065499 | ||
|
|
b168214952 | ||
|
|
678e3bd108 | ||
|
|
6cc030fa06 | ||
|
|
b84bd8e3cf | ||
|
|
8c1921da15 | ||
|
|
9a86311bc4 | ||
|
|
5950100615 | ||
|
|
4e3e0aad14 | ||
|
|
6cc3b05fb7 | ||
|
|
0e75ec6758 | ||
|
|
f157d4dfa4 | ||
|
|
3c81f9c5e9 | ||
|
|
d97bf9a9e9 | ||
|
|
bda66ab4b9 | ||
|
|
2719880636 | ||
|
|
ca20f4de22 | ||
|
|
9080810c20 | ||
|
|
0a6b36d3c8 | ||
|
|
0cf6765d56 | ||
|
|
7b3e572d25 | ||
|
|
be387992e6 | ||
|
|
1f8a282971 | ||
|
|
8c804957fa | ||
|
|
8b1fc9a18f | ||
|
|
bd35c23784 | ||
|
|
aef3ed8bcb | ||
|
|
01b23a3e88 | ||
|
|
4185f3816b | ||
|
|
4522b40879 | ||
|
|
c2d240b393 | ||
|
|
85c2a38cef | ||
|
|
d9c64baefb | ||
|
|
05b693ed12 | ||
|
|
6cef8ae54d | ||
|
|
0d3ec37abe | ||
|
|
b83d5b3ec1 | ||
|
|
5889053025 | ||
|
|
84f7a22dfe | ||
|
|
413c478f19 | ||
|
|
6c0c8843c8 | ||
|
|
0245429d78 | ||
|
|
9f445a2083 | ||
|
|
d9e1b0abb9 | ||
|
|
37dcafdc47 | ||
|
|
07a10ef465 | ||
|
|
1cb0dba351 | ||
|
|
17465c7d92 | ||
|
|
2f16308b1e | ||
|
|
fb0cb42d62 | ||
|
|
03a75169f6 | ||
|
|
c57cdb75b5 | ||
|
|
e5fced8cee | ||
|
|
866c3a79d7 | ||
|
|
8e4d7ce3af | ||
|
|
a6080560b9 | ||
|
|
50fc61bd06 | ||
|
|
96f017824e | ||
|
|
644e8a9d47 | ||
|
|
03ec323733 | ||
|
|
b104a29950 | ||
|
|
6e44c1af0b | ||
|
|
dfbaaac019 | ||
|
|
7ab01f3270 | ||
|
|
d3fafd6db2 | ||
|
|
e9af6d3ad4 | ||
|
|
387cbbc21c | ||
|
|
6a62e6a0a4 | ||
|
|
53d69774d3 | ||
|
|
961c63570a | ||
|
|
0e5350b9bb | ||
|
|
32a777e49e | ||
|
|
e48243b492 | ||
|
|
ce21410233 | ||
|
|
1456b37915 | ||
|
|
0636023797 | ||
|
|
f271dde950 | ||
|
|
735e713ef6 | ||
|
|
2cad68bd18 | ||
|
|
67c7d79f37 | ||
|
|
d8f9356e1c | ||
|
|
78dd896386 | ||
|
|
6fe026357e | ||
|
|
06e72f557f | ||
|
|
c6aa11c114 | ||
|
|
adf03087a9 | ||
|
|
63df4f9631 | ||
|
|
4158ca903a | ||
|
|
3e513d5eee | ||
|
|
0f00b9931b | ||
|
|
e142b7a504 | ||
|
|
4f29770bcb | ||
|
|
502853483a | ||
|
|
7c46ffed47 | ||
|
|
7b9f30ad90 | ||
|
|
a8273ab5fa | ||
|
|
0054ea02b7 | ||
|
|
b7a8c6226c | ||
|
|
d52ce2f9c3 | ||
|
|
6e1520c868 | ||
|
|
ff11d86a9d | ||
|
|
36fd982263 | ||
|
|
0341c1c73e | ||
|
|
2970b3edf2 | ||
|
|
f9b17a2e04 | ||
|
|
ec08532b88 | ||
|
|
43c5c009f0 | ||
|
|
fcc96e3b76 | ||
|
|
9339f87ead | ||
|
|
25944d8d7d | ||
|
|
14914abf65 | ||
|
|
cd9fa25a2e | ||
|
|
2ade7be332 | ||
|
|
6e99c20987 | ||
|
|
774d0de537 | ||
|
|
b200a4e40c | ||
|
|
42e3408993 | ||
|
|
4dc20ed989 | ||
|
|
24512bc34d | ||
|
|
1e0c095169 | ||
|
|
f66a6d6481 | ||
|
|
4b9176cce1 | ||
|
|
145c5b7c5a | ||
|
|
f58cb6b08a | ||
|
|
8535b94087 | ||
|
|
4bda5725b5 | ||
|
|
6a1572eaf6 | ||
|
|
7b897b5448 | ||
|
|
33eccfc5f8 | ||
|
|
3ecc14d399 | ||
|
|
d026d5c796 | ||
|
|
9fddb4eb01 | ||
|
|
7ae82d722d | ||
|
|
7474a80ff9 | ||
|
|
5ac40d728c | ||
|
|
f6dd3d383d | ||
|
|
5969d4cbdb | ||
|
|
3b6cea10d2 | ||
|
|
76e55f840a | ||
|
|
1569d10d4b | ||
|
|
c4d5e9d2f0 | ||
|
|
c8e534de0b | ||
|
|
236ecd0240 | ||
|
|
1175b02d29 | ||
|
|
0a5b845b97 | ||
|
|
6b58a7ac61 | ||
|
|
514e394a49 | ||
|
|
d89197eb78 | ||
|
|
3fd29bb252 | ||
|
|
17b5c0b79e | ||
|
|
7b1d5d480b | ||
|
|
18de476ebd | ||
|
|
0be8efdc25 | ||
|
|
508a1511f8 | ||
|
|
42c0f9a8d1 | ||
|
|
495a59e33e | ||
|
|
0cd821e954 | ||
|
|
2079767828 | ||
|
|
b88687e85d | ||
|
|
7af3cc3c4f | ||
|
|
ab532a1153 | ||
|
|
f454285aba | ||
|
|
7f53665755 | ||
|
|
99377f5f11 | ||
|
|
2aee4c6cc9 | ||
|
|
7cff365355 | ||
|
|
9a4cc2b151 | ||
|
|
37a458aee0 | ||
|
|
24389e5ab9 | ||
|
|
f534051053 | ||
|
|
6c1bd0e064 | ||
|
|
d8fa532caa | ||
|
|
18688ef231 | ||
|
|
6318d84a1d | ||
|
|
4a27c5efff | ||
|
|
b69ba66408 | ||
|
|
1cdbf8d36d | ||
|
|
c0285fc9dd | ||
|
|
7b47f74c26 | ||
|
|
c450efa222 | ||
|
|
9ccf1e988b | ||
|
|
2544f2e163 | ||
|
|
89c3651580 | ||
|
|
df7da2e5ef | ||
|
|
6566b54fe9 | ||
|
|
8c8f307bb1 | ||
|
|
f51338237e | ||
|
|
7c9881ed9e | ||
|
|
16cdfbb11b | ||
|
|
7e5fa4e620 | ||
|
|
8ab6ffb4e1 | ||
|
|
8a15dcb379 | ||
|
|
49d06bdbcd | ||
|
|
34c8967726 | ||
|
|
1dba8635ad | ||
|
|
6c86926ee5 | ||
|
|
d1cdc4c245 | ||
|
|
3f16d6fc3c | ||
|
|
fddbf37a3a | ||
|
|
9492fb7afc | ||
|
|
a02f8e8670 | ||
|
|
c1d940466c | ||
|
|
b72e09b4e3 | ||
|
|
6704db88b7 | ||
|
|
877874813e | ||
|
|
ae9ff38fa0 | ||
|
|
5181377820 | ||
|
|
997be64cf9 | ||
|
|
f33735d321 | ||
|
|
8ad5878c33 | ||
|
|
a57dd53c1b | ||
|
|
4fef023bea | ||
|
|
851d276b48 | ||
|
|
ab91ab1a89 | ||
|
|
ba893cadc9 | ||
|
|
50dda5d487 | ||
|
|
0b1b976ff5 | ||
|
|
007b74bcf0 | ||
|
|
12d0622f03 | ||
|
|
fcf58f9648 | ||
|
|
878f2454fe | ||
|
|
e06f6ffe52 | ||
|
|
7bc36712b1 | ||
|
|
f1627630ad | ||
|
|
efda5a32f9 | ||
|
|
8c6f86abe0 | ||
|
|
def14fba53 | ||
|
|
b3d10b3e45 | ||
|
|
31248dbd6f | ||
|
|
c031efe84f | ||
|
|
25d7e83e68 | ||
|
|
458b1b599f | ||
|
|
015e5fc333 | ||
|
|
8fa942375a | ||
|
|
231df0a036 | ||
|
|
a41c917d17 | ||
|
|
8168249c56 | ||
|
|
32e1dc40d0 | ||
|
|
dba74b58ba | ||
|
|
30825dc8e3 | ||
|
|
a9f6091b60 | ||
|
|
3db2fad222 | ||
|
|
03321c646f | ||
|
|
53917b9e25 | ||
|
|
f43e35c3a9 | ||
|
|
c385101e1f | ||
|
|
edc384890d | ||
|
|
00ab1d9021 | ||
|
|
2cd34ad71c | ||
|
|
93c8ec1a26 | ||
|
|
fb5cb77c1b | ||
|
|
1ec44cef06 | ||
|
|
301996ed57 | ||
|
|
0224a3ff98 | ||
|
|
47d0184ed8 | ||
|
|
a388cd30e0 | ||
|
|
4adfcecb80 | ||
|
|
a62f9b28f0 | ||
|
|
cd837cb291 | ||
|
|
dfa1f2adf7 | ||
|
|
d88f27f3e1 | ||
|
|
4357323bbb | ||
|
|
bd40f7b9c6 | ||
|
|
83715779dc | ||
|
|
715a4286f9 | ||
|
|
02f4b67b7f | ||
|
|
b189696ac5 | ||
|
|
5c0013e74f | ||
|
|
96b3b57d81 | ||
|
|
22e4d10031 | ||
|
|
c37f86bbd6 | ||
|
|
0e4066b476 | ||
|
|
232f12576c | ||
|
|
f4f56fc344 | ||
|
|
16209d02b6 | ||
|
|
fce5357354 | ||
|
|
7709a63384 | ||
|
|
21cbf76baf | ||
|
|
089265a022 | ||
|
|
f1ee5ee508 | ||
|
|
83bc4bf2fb | ||
|
|
f734a85665 | ||
|
|
33c859a8ca | ||
|
|
a2f63a1b63 | ||
|
|
dd37a1c2bd | ||
|
|
8c23d78362 | ||
|
|
0e6f83b9c3 | ||
|
|
2d39099061 | ||
|
|
65718a9728 | ||
|
|
0c297196ad | ||
|
|
670a581d12 | ||
|
|
a9e0a71fa1 | ||
|
|
17b34dc432 | ||
|
|
6144c849e3 | ||
|
|
28410618ec | ||
|
|
0c8ea73282 | ||
|
|
c350614e8e | ||
|
|
1cc8d9ad28 | ||
|
|
f208b5bb0f | ||
|
|
9e93d178f9 | ||
|
|
fbd7347d4c | ||
|
|
602ef0e8f3 | ||
|
|
d7e4719895 | ||
|
|
01e75456e8 | ||
|
|
acb9c69d4d | ||
|
|
275652f301 | ||
|
|
1319ae748c | ||
|
|
095ee2bfd0 | ||
|
|
ed45d37b3d | ||
|
|
dd040d3b39 | ||
|
|
3b813a9421 | ||
|
|
0dccdaecdf | ||
|
|
d9f0665766 | ||
|
|
282d79da4a | ||
|
|
889ded3b01 | ||
|
|
42103edc38 | ||
|
|
da4380dabd | ||
|
|
d1a9793fec | ||
|
|
db092bbf52 | ||
|
|
f8e7fe7905 | ||
|
|
62888735f2 | ||
|
|
7a9872d5b7 | ||
|
|
6807dc8493 | ||
|
|
70e927db3b | ||
|
|
abc4c4a130 | ||
|
|
86d1ff3cef | ||
|
|
2631a05e74 | ||
|
|
7e8b79545f | ||
|
|
3ce6260110 | ||
|
|
8d74d159ba | ||
|
|
3de1eb1c51 | ||
|
|
dc8e8b9904 | ||
|
|
67535f6af0 | ||
|
|
0b9ca99053 | ||
|
|
25787847fd | ||
|
|
b621f5c2d0 | ||
|
|
fb34961fdf | ||
|
|
27ab7ee41b | ||
|
|
00f01da4f4 | ||
|
|
84430f461a | ||
|
|
1c1cad0cbb | ||
|
|
30463c3cd8 | ||
|
|
d86253a7b1 | ||
|
|
e76624a5fd | ||
|
|
8df82c359a | ||
|
|
f77b869283 | ||
|
|
cabdba9bd1 | ||
|
|
08f39419a3 | ||
|
|
da8e8ad1f6 | ||
|
|
cf7a2fa672 | ||
|
|
eda6d20fe8 | ||
|
|
445118b20d | ||
|
|
1d3826f19c | ||
|
|
3c5b25aa92 | ||
|
|
78d31430a5 | ||
|
|
b6f1833d97 | ||
|
|
0afef0f30e | ||
|
|
5d0578ec3c | ||
|
|
4f60188e3e | ||
|
|
cfa4e964a0 | ||
|
|
870df3f030 | ||
|
|
1d05474b51 | ||
|
|
40c8488712 | ||
|
|
cb56535cd5 | ||
|
|
c3a2fbdfb0 | ||
|
|
99f6da8521 | ||
|
|
3c86c52e5c | ||
|
|
0c63db27ab | ||
|
|
ba002752ee | ||
|
|
8d9448acd9 | ||
|
|
125d72958f | ||
|
|
5e8c924aa6 | ||
|
|
6f6c2dce3c |
@@ -1,10 +0,0 @@
|
|||||||
.cache
|
|
||||||
docs/dist
|
|
||||||
docs/search.json
|
|
||||||
docs/**/*.min.js
|
|
||||||
dist
|
|
||||||
examples
|
|
||||||
node_modules
|
|
||||||
src/react
|
|
||||||
scripts
|
|
||||||
|
|
||||||
213
.eslintrc.cjs
@@ -1,213 +0,0 @@
|
|||||||
/* eslint-env node */
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
plugins: [
|
|
||||||
'@typescript-eslint',
|
|
||||||
'wc',
|
|
||||||
'lit',
|
|
||||||
'lit-a11y',
|
|
||||||
'chai-expect',
|
|
||||||
'chai-friendly',
|
|
||||||
'import',
|
|
||||||
'sort-imports-es6-autofix'
|
|
||||||
],
|
|
||||||
extends: [
|
|
||||||
'eslint:recommended',
|
|
||||||
'plugin:wc/recommended',
|
|
||||||
'plugin:wc/best-practice',
|
|
||||||
'plugin:lit/recommended',
|
|
||||||
'plugin:lit-a11y/recommended'
|
|
||||||
],
|
|
||||||
env: {
|
|
||||||
es2021: true,
|
|
||||||
browser: true
|
|
||||||
},
|
|
||||||
parserOptions: {
|
|
||||||
sourceType: 'module'
|
|
||||||
},
|
|
||||||
overrides: [
|
|
||||||
{
|
|
||||||
extends: [
|
|
||||||
'plugin:@typescript-eslint/eslint-recommended',
|
|
||||||
'plugin:@typescript-eslint/recommended',
|
|
||||||
'plugin:@typescript-eslint/recommended-requiring-type-checking'
|
|
||||||
],
|
|
||||||
parser: '@typescript-eslint/parser',
|
|
||||||
parserOptions: {
|
|
||||||
sourceType: 'module',
|
|
||||||
project: './tsconfig.json',
|
|
||||||
tsconfigRootDir: __dirname
|
|
||||||
},
|
|
||||||
files: ['*.ts'],
|
|
||||||
rules: {
|
|
||||||
'default-param-last': 'off',
|
|
||||||
'@typescript-eslint/default-param-last': 'error',
|
|
||||||
'no-console': 'warn',
|
|
||||||
'no-empty-function': 'off',
|
|
||||||
'@typescript-eslint/no-empty-function': 'warn',
|
|
||||||
'no-implied-eval': 'off',
|
|
||||||
'no-invalid-this': 'off',
|
|
||||||
'no-shadow': 'off',
|
|
||||||
'no-throw-literal': 'off',
|
|
||||||
'no-unused-expressions': 'off',
|
|
||||||
'lit-a11y/no-autofocus': 'off',
|
|
||||||
'@typescript-eslint/no-implied-eval': 'error',
|
|
||||||
'@typescript-eslint/no-invalid-this': 'error',
|
|
||||||
'@typescript-eslint/no-throw-literal': 'error',
|
|
||||||
'@typescript-eslint/no-shadow': 'error',
|
|
||||||
'@typescript-eslint/prefer-regexp-exec': 'off',
|
|
||||||
'@typescript-eslint/no-unused-expressions': 'error',
|
|
||||||
'@typescript-eslint/unbound-method': 'off',
|
|
||||||
'@typescript-eslint/no-non-null-assertion': 'off',
|
|
||||||
'@typescript-eslint/no-floating-promises': 'off',
|
|
||||||
'@typescript-eslint/no-misused-promises': [
|
|
||||||
'error',
|
|
||||||
{
|
|
||||||
checksVoidReturn: false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'@typescript-eslint/consistent-type-assertions': [
|
|
||||||
'warn',
|
|
||||||
{
|
|
||||||
assertionStyle: 'as',
|
|
||||||
objectLiteralTypeAssertions: 'never'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'@typescript-eslint/consistent-type-imports': 'warn',
|
|
||||||
'@typescript-eslint/no-base-to-string': 'error',
|
|
||||||
'@typescript-eslint/no-confusing-non-null-assertion': 'error',
|
|
||||||
'@typescript-eslint/no-invalid-void-type': 'error',
|
|
||||||
'@typescript-eslint/no-require-imports': 'error',
|
|
||||||
'@typescript-eslint/no-unnecessary-boolean-literal-compare': 'warn',
|
|
||||||
'@typescript-eslint/no-unnecessary-condition': 'off',
|
|
||||||
'@typescript-eslint/no-unnecessary-qualifier': 'warn',
|
|
||||||
'@typescript-eslint/non-nullable-type-assertion-style': 'warn',
|
|
||||||
'@typescript-eslint/prefer-for-of': 'warn',
|
|
||||||
'@typescript-eslint/prefer-optional-chain': 'warn',
|
|
||||||
'@typescript-eslint/prefer-ts-expect-error': 'warn',
|
|
||||||
'@typescript-eslint/prefer-return-this-type': 'error',
|
|
||||||
'@typescript-eslint/prefer-string-starts-ends-with': 'warn',
|
|
||||||
'@typescript-eslint/require-array-sort-compare': 'error',
|
|
||||||
'@typescript-eslint/unified-signatures': 'warn',
|
|
||||||
'@typescript-eslint/array-type': 'warn',
|
|
||||||
'@typescript-eslint/consistent-type-definitions': ['warn', 'interface'],
|
|
||||||
'@typescript-eslint/member-delimiter-style': 'warn',
|
|
||||||
'@typescript-eslint/method-signature-style': 'warn',
|
|
||||||
'@typescript-eslint/no-extraneous-class': 'error',
|
|
||||||
'@typescript-eslint/no-redundant-type-constituents': 'off',
|
|
||||||
'@typescript-eslint/parameter-properties': 'error',
|
|
||||||
'@typescript-eslint/strict-boolean-expressions': 'off'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
files: ['**/*.cjs'],
|
|
||||||
env: {
|
|
||||||
node: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
extends: ['plugin:chai-expect/recommended', 'plugin:chai-friendly/recommended'],
|
|
||||||
files: ['*.test.ts'],
|
|
||||||
rules: {
|
|
||||||
'@typescript-eslint/no-unsafe-call': 'off',
|
|
||||||
'@typescript-eslint/no-unused-expressions': 'off'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
rules: {
|
|
||||||
'no-template-curly-in-string': 'error',
|
|
||||||
'array-callback-return': 'error',
|
|
||||||
'comma-dangle': 'off',
|
|
||||||
'consistent-return': 'error',
|
|
||||||
curly: 'off',
|
|
||||||
'default-param-last': 'error',
|
|
||||||
eqeqeq: 'error',
|
|
||||||
'lit-a11y/click-events-have-key-events': 'off',
|
|
||||||
'no-constructor-return': 'error',
|
|
||||||
'no-empty-function': 'warn',
|
|
||||||
'no-eval': 'error',
|
|
||||||
'no-extend-native': 'error',
|
|
||||||
'no-extra-bind': 'error',
|
|
||||||
'no-floating-decimal': 'error',
|
|
||||||
'no-implicit-coercion': 'off',
|
|
||||||
'no-implicit-globals': 'error',
|
|
||||||
'no-implied-eval': 'error',
|
|
||||||
'no-invalid-this': 'error',
|
|
||||||
'no-labels': 'error',
|
|
||||||
'no-lone-blocks': 'error',
|
|
||||||
'no-new': 'error',
|
|
||||||
'no-new-func': 'error',
|
|
||||||
'no-new-wrappers': 'error',
|
|
||||||
'no-octal-escape': 'error',
|
|
||||||
'no-proto': 'error',
|
|
||||||
'no-return-assign': 'warn',
|
|
||||||
'no-script-url': 'error',
|
|
||||||
'no-self-compare': 'warn',
|
|
||||||
'no-sequences': 'warn',
|
|
||||||
'no-throw-literal': 'error',
|
|
||||||
'no-unmodified-loop-condition': 'error',
|
|
||||||
'no-unused-expressions': 'warn',
|
|
||||||
'no-useless-call': 'error',
|
|
||||||
'no-useless-concat': 'error',
|
|
||||||
'no-useless-return': 'warn',
|
|
||||||
'prefer-promise-reject-errors': 'error',
|
|
||||||
radix: 'off',
|
|
||||||
'require-await': 'error',
|
|
||||||
'wrap-iife': ['warn', 'inside'],
|
|
||||||
'no-shadow': 'error',
|
|
||||||
'no-array-constructor': 'error',
|
|
||||||
'no-bitwise': 'error',
|
|
||||||
'no-multi-assign': 'warn',
|
|
||||||
'no-new-object': 'error',
|
|
||||||
'no-useless-computed-key': 'warn',
|
|
||||||
'no-useless-rename': 'warn',
|
|
||||||
'no-var': 'error',
|
|
||||||
'prefer-const': 'warn',
|
|
||||||
'prefer-numeric-literals': 'warn',
|
|
||||||
'prefer-object-spread': 'warn',
|
|
||||||
'prefer-rest-params': 'warn',
|
|
||||||
'prefer-spread': 'warn',
|
|
||||||
'prefer-template': 'off',
|
|
||||||
'no-else-return': 'off',
|
|
||||||
'func-names': ['warn', 'never'],
|
|
||||||
'one-var': ['warn', 'never'],
|
|
||||||
'operator-assignment': 'warn',
|
|
||||||
'prefer-arrow-callback': 'warn',
|
|
||||||
'no-restricted-imports': [
|
|
||||||
'warn',
|
|
||||||
{
|
|
||||||
paths: [
|
|
||||||
{
|
|
||||||
name: '.',
|
|
||||||
message: 'Usage of local index imports is not allowed.'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: './index',
|
|
||||||
message: 'Import from the source file instead.'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'import/extensions': [
|
|
||||||
'error',
|
|
||||||
'always',
|
|
||||||
{
|
|
||||||
ignorePackages: true,
|
|
||||||
pattern: {
|
|
||||||
js: 'always',
|
|
||||||
ts: 'never'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'import/no-duplicates': 'warn',
|
|
||||||
'sort-imports-es6-autofix/sort-imports-es6': [
|
|
||||||
2,
|
|
||||||
{
|
|
||||||
ignoreCase: true,
|
|
||||||
ignoreMemberSort: false,
|
|
||||||
memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single']
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'wc/guard-super-call': 'off'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
4
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,7 +1,7 @@
|
|||||||
contact_links:
|
contact_links:
|
||||||
- name: Feature Requests
|
- name: Feature Requests
|
||||||
url: https://github.com/shoelace-style/shoelace/discussions/categories/ideas
|
url: https://github.com/shoelace-style/webawesome/discussions/categories/ideas-suggestions
|
||||||
about: All requests for new features should go here.
|
about: All requests for new features should go here.
|
||||||
- name: Help & Support
|
- name: Help & Support
|
||||||
url: https://github.com/shoelace-style/shoelace/discussions/categories/help
|
url: https://github.com/shoelace-style/webawesome/discussions/categories/ask-for-help
|
||||||
about: Please don't create issues for personal help requests. Instead, ask your question on the discussion forum.
|
about: Please don't create issues for personal help requests. Instead, ask your question on the discussion forum.
|
||||||
|
|||||||
48
.github/workflows/client_tests.yml
vendored
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
# # This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node
|
||||||
|
# # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||||
|
|
||||||
|
name: Client Tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches: [next]
|
||||||
|
pull_request:
|
||||||
|
branches: [next]
|
||||||
|
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
client_test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
node-version: [20.x]
|
||||||
|
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
|
cache: 'npm'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm ci
|
||||||
|
- name: Lint
|
||||||
|
run: npm run prettier
|
||||||
|
working-directory: ./packages/webawesome
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: npm run build
|
||||||
|
working-directory: ./packages/webawesome
|
||||||
|
|
||||||
|
- name: Install Playwright
|
||||||
|
run: npx playwright install --with-deps
|
||||||
|
working-directory: ./packages/webawesome
|
||||||
|
|
||||||
|
- name: Run CSR tests
|
||||||
|
# FAIL_FAST to fail on first failing test.
|
||||||
|
run: FAIL_FAST="true" CSR_ONLY="true" npm run test
|
||||||
|
working-directory: ./packages/webawesome
|
||||||
30
.github/workflows/node.js.yml
vendored
@@ -1,30 +0,0 @@
|
|||||||
# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node
|
|
||||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
|
||||||
|
|
||||||
name: Node.js CI
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [next]
|
|
||||||
pull_request:
|
|
||||||
branches: [next]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node-version: [18.x]
|
|
||||||
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: ${{ matrix.node-version }}
|
|
||||||
cache: 'npm'
|
|
||||||
- run: npx playwright install-deps
|
|
||||||
- run: npm ci
|
|
||||||
- run: npm run verify
|
|
||||||
42
.github/workflows/ssr_tests.yml
vendored
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node
|
||||||
|
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||||
|
|
||||||
|
name: SSR Tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
# push:
|
||||||
|
# branches: [next]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
ssr_test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
node-version: [20.x]
|
||||||
|
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
|
cache: 'npm'
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm ci
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: npm run build
|
||||||
|
working-directory: ./packages/webawesome
|
||||||
|
|
||||||
|
- name: Install Playwright
|
||||||
|
run: npx playwright install --with-deps
|
||||||
|
working-directory: ./packages/webawesome
|
||||||
|
|
||||||
|
- name: Run SSR tests
|
||||||
|
# FAIL_FAST to fail on first failing test.
|
||||||
|
run: FAIL_FAST="true" SSR_ONLY="true" npm run test
|
||||||
|
working-directory: ./packages/webawesome
|
||||||
|
|
||||||
15
.gitignore
vendored
@@ -1,11 +1,12 @@
|
|||||||
_site
|
_site
|
||||||
.cache
|
.cache
|
||||||
.DS_Store
|
.DS_Store
|
||||||
package.json
|
dist/
|
||||||
package-lock.json
|
dist-cdn/
|
||||||
dist
|
|
||||||
docs/public/pagefind
|
|
||||||
node_modules
|
node_modules
|
||||||
src/react
|
packages/**/*/src/react
|
||||||
cdn
|
cdn/
|
||||||
.astro
|
yarn.lock
|
||||||
|
_bundle_
|
||||||
|
/packages/webawesome-pro
|
||||||
|
/packages/webawesome-app
|
||||||
|
|||||||
28
.gitpod.yml
@@ -1,28 +0,0 @@
|
|||||||
tasks:
|
|
||||||
- init: npm install && npm run build
|
|
||||||
command: npm run start
|
|
||||||
|
|
||||||
ports:
|
|
||||||
- port: 3001
|
|
||||||
onOpen: ignore
|
|
||||||
- port: 4000-4999
|
|
||||||
onOpen: open-preview
|
|
||||||
|
|
||||||
github:
|
|
||||||
prebuilds:
|
|
||||||
# enable for the master/default branch (defaults to true)
|
|
||||||
master: true
|
|
||||||
# enable for all branches in this repo (defaults to false)
|
|
||||||
branches: true
|
|
||||||
# enable for pull requests coming from this repo (defaults to true)
|
|
||||||
pullRequests: true
|
|
||||||
# enable for pull requests coming from forks (defaults to false)
|
|
||||||
pullRequestsFromForks: true
|
|
||||||
# add a check to pull requests (defaults to true)
|
|
||||||
addCheck: true
|
|
||||||
# add a "Review in Gitpod" button as a comment to pull requests (defaults to false)
|
|
||||||
addComment: false
|
|
||||||
# add a "Review in Gitpod" button to the pull request's description (defaults to false)
|
|
||||||
addBadge: true
|
|
||||||
# add a label once the prebuild is ready to pull requests (defaults to false)
|
|
||||||
addLabel: true
|
|
||||||
@@ -1,15 +1,23 @@
|
|||||||
|
# Files are relative to .prettierignore at the root of this monorepo.
|
||||||
|
# <https://github.com/prettier/prettier-vscode/issues/1252>
|
||||||
|
|
||||||
*.hbs
|
*.hbs
|
||||||
*.md
|
*.md
|
||||||
.cache
|
!packages/webawesome/docs/docs/patterns/**/*.md
|
||||||
|
docs/docs/patterns/blog-news/post-list.md
|
||||||
|
**/*/.cache
|
||||||
.github
|
.github
|
||||||
cspell.json
|
cspell.json
|
||||||
dist
|
packages/**/*/dist
|
||||||
docs/search.json
|
packages/**/*/dist-cdn
|
||||||
src/components/icon/icons
|
packages/**/*/docs/search.json
|
||||||
src/react/index.ts
|
packages/**/*/src/components/icon/icons
|
||||||
|
packages/**/*/src/react/index.ts
|
||||||
|
**/*/package.json
|
||||||
|
**/*/package-lock.json
|
||||||
|
**/*/tsconfig.json
|
||||||
|
**/*/tsconfig.prod.json
|
||||||
node_modules
|
node_modules
|
||||||
package.json
|
|
||||||
package-lock.json
|
packages/**/*/_site
|
||||||
tsconfig.json
|
packages/webawesome/docs/assets/scripts/prism-downloaded.js
|
||||||
cdn
|
|
||||||
_site
|
|
||||||
|
|||||||
4
.vscode/extensions.json
vendored
@@ -3,7 +3,7 @@
|
|||||||
"dbaeumer.vscode-eslint",
|
"dbaeumer.vscode-eslint",
|
||||||
"esbenp.prettier-vscode",
|
"esbenp.prettier-vscode",
|
||||||
"bierner.lit-html",
|
"bierner.lit-html",
|
||||||
"bashmish.es6-string-css",
|
"streetsidesoftware.code-spell-checker",
|
||||||
"streetsidesoftware.code-spell-checker"
|
"ronnidc.nunjucks"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
1
.vscode/settings.json
vendored
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"editor.formatOnSave": true,
|
"editor.formatOnSave": true,
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||||
|
"prettier.enable": true,
|
||||||
"editor.codeActionsOnSave": {
|
"editor.codeActionsOnSave": {
|
||||||
"source.fixAll.eslint": "explicit"
|
"source.fixAll.eslint": "explicit"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2,4 +2,4 @@
|
|||||||
|
|
||||||
Before contributing, please review the contributions guidelines at:
|
Before contributing, please review the contributions guidelines at:
|
||||||
|
|
||||||
[shoelace.style/resources/contributing](https://shoelace.style/resources/contributing)
|
[webawesome.com/docs/resources/contributing](https://webawesome.com/docs/resources/contributing)
|
||||||
|
|||||||
55
README.md
@@ -11,29 +11,51 @@ Built by the folks behind [Font Awesome](https://fontawesome.com/).
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Documentation: [shoelace.style](https://shoelace.style)
|
Documentation: [webawesome.com](https://webawesome.com)
|
||||||
|
|
||||||
Source: [github.com/shoelace-style/shoelace](https://github.com/shoelace-style/shoelace)
|
Source: [github.com/shoelace-style/webawesome](https://github.com/shoelace-style/webawesome)
|
||||||
|
|
||||||
Twitter: [@shoelace_style](https://twitter.com/shoelace_style)
|
Twitter: [@webawesomer](https://twitter.com/webawesomer)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Developers ✨
|
## Developers ✨
|
||||||
|
|
||||||
Developers can use this documentation to learn how to build Web Awesome from source. You will need Node >= 14.17 to build and run the project locally.
|
Developers can use this documentation to learn how to build Web Awesome from source. You will need Node.js 14.17 or later to build and run the project locally.
|
||||||
|
|
||||||
**You don't need to do any of this to use Web Awesome!** This page is for people who want to contribute to the project, tinker with the source, or create a custom build of Web Awesome.
|
**You don't need to do any of this to use Web Awesome!** This page is for people who want to contribute to the project, tinker with the source, or create a custom build of Web Awesome.
|
||||||
|
|
||||||
If that's not what you're trying to do, the [documentation website](https://shoelace.style) is where you want to be.
|
If that's not what you're trying to do, the [documentation website](https://webawesome.com) is where you want to be.
|
||||||
|
|
||||||
### What are you using to build Web Awesome?
|
### What are you using to build Web Awesome?
|
||||||
|
|
||||||
Components are built with [LitElement](https://lit-element.polymer-project.org/), a custom elements base class that provides an intuitive API and reactive data binding. The build is a custom script with bundling powered by [esbuild](https://esbuild.github.io/).
|
Components are built with [Lit](https://lit.dev/), a custom elements base class that provides an intuitive API and reactive data binding. The build is a custom script with bundling powered by [esbuild](https://esbuild.github.io/).
|
||||||
|
|
||||||
|
### Understanding the Web Awesome monorepo
|
||||||
|
|
||||||
|
Web Awesome uses [npm workspaces](https://docs.npmjs.com/cli/v11/using-npm/workspaces) for its monorepo structure and is fairly minimal in what it provides.
|
||||||
|
|
||||||
|
By using npm workspaces and a monorepo structure, we can get consistent builds, shared configurations, and reduced duplication across repositories which reduces regressions and forces consistency across `webawesome`, `webawesome-pro`, and `webawesome-app`.
|
||||||
|
|
||||||
|
Generally, if you plan to only work with the free version of `webawesome` it is easiest to go to `packages/webawesome` and run all commands from there.
|
||||||
|
|
||||||
|
### Where do npm dependencies go?
|
||||||
|
|
||||||
|
Any dependencies intended to be used across all packages (i.e., `prettier`, `eslint`) that are **not** used at runtime should be in the root `devDependencies` of `package.json`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install -D -w prettier
|
||||||
|
```
|
||||||
|
|
||||||
|
Any dependencies that will be used at runtime by a package should be part of the specific package's `dependencies` such as `lit`. This is required because if that dependency is not in the `packages/*/package.json`, it will not be installed when used via npm.
|
||||||
|
|
||||||
|
Individual packages are also free to install `devDependencies` as needed as long as they are specific to that package only.
|
||||||
|
|
||||||
|
To install a package specific to a Web Awesome package, change your working directory to that package's root (i.e., `cd packages/webawesome && npm install <package-name>`).
|
||||||
|
|
||||||
### Forking the Repo
|
### Forking the Repo
|
||||||
|
|
||||||
Start by [forking the repo](https://github.com/shoelace-style/shoelace/fork) on GitHub, then clone it locally and install dependencies.
|
Start by [forking the repo](https://github.com/shoelace-style/webawesome/fork) on GitHub, then clone it locally and install dependencies.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/YOUR_GITHUB_USERNAME/webawesome
|
git clone https://github.com/YOUR_GITHUB_USERNAME/webawesome
|
||||||
@@ -43,36 +65,49 @@ npm install
|
|||||||
|
|
||||||
### Developing
|
### Developing
|
||||||
|
|
||||||
Once you've cloned the repo, run the following command.
|
Once you've cloned the repo, run the following command from the respective directory within `packages/*`.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
cd packages/webawesome
|
||||||
npm start
|
npm start
|
||||||
```
|
```
|
||||||
|
|
||||||
This will spin up the dev server. After the initial build, a browser will open automatically. There is currently no hot module reloading (HMR), as browser's don't provide a way to reregister custom elements, but most changes to the source will reload the browser automatically.
|
This will spin up the dev server. After the initial build, a browser will open automatically. There is currently no hot module reloading (HMR), as browsers don't provide a way to reregister custom elements, but most changes to the source will reload the browser automatically.
|
||||||
|
|
||||||
### Building
|
### Building
|
||||||
|
|
||||||
To generate a production build, run the following command.
|
To generate a production build, run the following command.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
cd packages/webawesome
|
||||||
npm run build
|
npm run build
|
||||||
```
|
```
|
||||||
|
|
||||||
|
You can also run `npm run build:serve` to start an [`http-server`](https://www.npmjs.com/package/http-server) instance on `http://localhost:4000` after the build completes, so you can preview the production build.
|
||||||
|
|
||||||
### Creating New Components
|
### Creating New Components
|
||||||
|
|
||||||
To scaffold a new component, run the following command, replacing `wa-tag-name` with the desired tag name.
|
To scaffold a new component, run the following command, replacing `wa-tag-name` with the desired tag name.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
cd packages/webawesome
|
||||||
npm run create wa-tag-name
|
npm run create wa-tag-name
|
||||||
```
|
```
|
||||||
|
|
||||||
This will generate a source file, a stylesheet, and a docs page for you. When you start the dev server, you'll find the new component in the "Components" section of the sidebar.
|
This will generate a source file, a stylesheet, and a docs page for you. When you start the dev server, you'll find the new component in the "Components" section of the sidebar.
|
||||||
|
|
||||||
|
### Adding additional packages
|
||||||
|
|
||||||
|
Right now the only additional packages are in private repositories.
|
||||||
|
|
||||||
|
To add additional packages from other repositories, run `git clone <url> packages/<package-name>` to clone your repo into `packages/`.
|
||||||
|
|
||||||
|
Make sure to run `npm install` at the root of the monorepo after adding your package!
|
||||||
|
|
||||||
### Contributing
|
### Contributing
|
||||||
|
|
||||||
Web Awesome is an open source project and contributions are encouraged! If you're interesting in contributing, please review the [contribution guidelines](CONTRIBUTING.md) first.
|
Web Awesome is an open source project and contributions are encouraged! If you're interesting in contributing, please review the [contribution guidelines](CONTRIBUTING.md) first.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Web Awesome is available under the terms of the MIT license.
|
Web Awesome is available under the terms of the [MIT License](LICENSE.md).
|
||||||
|
|||||||
1
VERSIONS.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
3.0.0
|
||||||
51
cspell.json
@@ -5,26 +5,31 @@
|
|||||||
"allowfullscreen",
|
"allowfullscreen",
|
||||||
"animationend",
|
"animationend",
|
||||||
"Animista",
|
"Animista",
|
||||||
|
"APG",
|
||||||
"apos",
|
"apos",
|
||||||
"atrule",
|
"atrule",
|
||||||
|
"autocapitalize",
|
||||||
"autocorrect",
|
"autocorrect",
|
||||||
"autofix",
|
"autofix",
|
||||||
|
"autofocus",
|
||||||
"autoload",
|
"autoload",
|
||||||
"autoloader",
|
"autoloader",
|
||||||
"autoloading",
|
"autoloading",
|
||||||
"autoplay",
|
"autoplay",
|
||||||
"bezier",
|
"bezier",
|
||||||
|
"Blockquotes",
|
||||||
"boxicons",
|
"boxicons",
|
||||||
"CACHEABLE",
|
"CACHEABLE",
|
||||||
"callout",
|
"callout",
|
||||||
"callouts",
|
"callouts",
|
||||||
"cdndir",
|
"canvastext",
|
||||||
"chatbubble",
|
"chatbubble",
|
||||||
"checkmark",
|
"checkmark",
|
||||||
"Clippy",
|
"Clippy",
|
||||||
"codebases",
|
"codebases",
|
||||||
"codepen",
|
"codepen",
|
||||||
"colocated",
|
"colocated",
|
||||||
|
"colorjs",
|
||||||
"colour",
|
"colour",
|
||||||
"combobox",
|
"combobox",
|
||||||
"Commonmark",
|
"Commonmark",
|
||||||
@@ -39,14 +44,23 @@
|
|||||||
"crutchcorn",
|
"crutchcorn",
|
||||||
"csspart",
|
"csspart",
|
||||||
"cssproperty",
|
"cssproperty",
|
||||||
|
"cssstate",
|
||||||
|
"datalist",
|
||||||
"datetime",
|
"datetime",
|
||||||
"describedby",
|
"describedby",
|
||||||
|
"dictsort",
|
||||||
"Docsify",
|
"Docsify",
|
||||||
"dogfood",
|
"dogfood",
|
||||||
"dropdowns",
|
"dropdowns",
|
||||||
"easings",
|
"easings",
|
||||||
|
"ecommerce",
|
||||||
|
"eleventy",
|
||||||
|
"elif",
|
||||||
|
"endfor",
|
||||||
|
"endmarkdown",
|
||||||
"endraw",
|
"endraw",
|
||||||
"endregion",
|
"endregion",
|
||||||
|
"endset",
|
||||||
"enterkeyhint",
|
"enterkeyhint",
|
||||||
"eqeqeq",
|
"eqeqeq",
|
||||||
"erroneou",
|
"erroneou",
|
||||||
@@ -54,7 +68,11 @@
|
|||||||
"esbuild",
|
"esbuild",
|
||||||
"exportmaps",
|
"exportmaps",
|
||||||
"exportparts",
|
"exportparts",
|
||||||
|
"fetchpriority",
|
||||||
"fieldsets",
|
"fieldsets",
|
||||||
|
"focusin",
|
||||||
|
"focusout",
|
||||||
|
"fontawesome",
|
||||||
"formaction",
|
"formaction",
|
||||||
"formdata",
|
"formdata",
|
||||||
"formenctype",
|
"formenctype",
|
||||||
@@ -63,25 +81,31 @@
|
|||||||
"formtarget",
|
"formtarget",
|
||||||
"FOUC",
|
"FOUC",
|
||||||
"FOUCE",
|
"FOUCE",
|
||||||
|
"Frontmatter",
|
||||||
"fullscreen",
|
"fullscreen",
|
||||||
"gestern",
|
"gestern",
|
||||||
"giga",
|
"giga",
|
||||||
"globby",
|
"globby",
|
||||||
"Grayscale",
|
"Grayscale",
|
||||||
|
"groupby",
|
||||||
"haspopup",
|
"haspopup",
|
||||||
"heroicons",
|
"heroicons",
|
||||||
"hexa",
|
"hexa",
|
||||||
|
"Hotwire",
|
||||||
|
"hrefs",
|
||||||
"Iconoir",
|
"Iconoir",
|
||||||
"Iframes",
|
"Iframes",
|
||||||
"iife",
|
"iife",
|
||||||
"inputmode",
|
"inputmode",
|
||||||
"ionicon",
|
"ionicon",
|
||||||
"ionicons",
|
"ionicons",
|
||||||
|
"jank",
|
||||||
"jsDelivr",
|
"jsDelivr",
|
||||||
"jsfiddle",
|
"jsfiddle",
|
||||||
"jsonata",
|
|
||||||
"keydown",
|
"keydown",
|
||||||
"keyframes",
|
"keyframes",
|
||||||
|
"keymaker",
|
||||||
|
"Konnor",
|
||||||
"Kool",
|
"Kool",
|
||||||
"labelledby",
|
"labelledby",
|
||||||
"Laravel",
|
"Laravel",
|
||||||
@@ -96,8 +120,10 @@
|
|||||||
"Menlo",
|
"Menlo",
|
||||||
"menuitemcheckbox",
|
"menuitemcheckbox",
|
||||||
"menuitemradio",
|
"menuitemradio",
|
||||||
|
"metaframeworks",
|
||||||
"middlewares",
|
"middlewares",
|
||||||
"minlength",
|
"minlength",
|
||||||
|
"minmax",
|
||||||
"monospace",
|
"monospace",
|
||||||
"mousedown",
|
"mousedown",
|
||||||
"mousemove",
|
"mousemove",
|
||||||
@@ -106,11 +132,15 @@
|
|||||||
"multiselectable",
|
"multiselectable",
|
||||||
"nextjs",
|
"nextjs",
|
||||||
"nocheck",
|
"nocheck",
|
||||||
|
"noindex",
|
||||||
"noopener",
|
"noopener",
|
||||||
"noreferrer",
|
"noreferrer",
|
||||||
|
"noscript",
|
||||||
|
"Notdog",
|
||||||
"novalidate",
|
"novalidate",
|
||||||
"npmdir",
|
"nowrap",
|
||||||
"Numberish",
|
"Numberish",
|
||||||
|
"nums",
|
||||||
"oklab",
|
"oklab",
|
||||||
"oklch",
|
"oklch",
|
||||||
"onscrollend",
|
"onscrollend",
|
||||||
@@ -119,10 +149,13 @@
|
|||||||
"peta",
|
"peta",
|
||||||
"petabit",
|
"petabit",
|
||||||
"Preact",
|
"Preact",
|
||||||
|
"preconnect",
|
||||||
|
"prerendered",
|
||||||
"prismjs",
|
"prismjs",
|
||||||
"progressbar",
|
"progressbar",
|
||||||
"radiogroup",
|
"radiogroup",
|
||||||
"Railsbyte",
|
"Railsbyte",
|
||||||
|
"referrerpolicy",
|
||||||
"remixicon",
|
"remixicon",
|
||||||
"reregister",
|
"reregister",
|
||||||
"resizer",
|
"resizer",
|
||||||
@@ -139,25 +172,32 @@
|
|||||||
"scrollbars",
|
"scrollbars",
|
||||||
"scrollend",
|
"scrollend",
|
||||||
"scroller",
|
"scroller",
|
||||||
|
"Scrollers",
|
||||||
"Segoe",
|
"Segoe",
|
||||||
|
"selectattr",
|
||||||
"semibold",
|
"semibold",
|
||||||
|
"shadowrootmode",
|
||||||
"Shortcode",
|
"Shortcode",
|
||||||
"Shortcodes",
|
"Shortcodes",
|
||||||
"sitedir",
|
"sitedir",
|
||||||
"slotchange",
|
"slotchange",
|
||||||
"smartquotes",
|
"smartquotes",
|
||||||
"spacebar",
|
"spacebar",
|
||||||
|
"srcdoc",
|
||||||
"stylesheet",
|
"stylesheet",
|
||||||
|
"svgs",
|
||||||
"Tabbable",
|
"Tabbable",
|
||||||
"tabindex",
|
"tabindex",
|
||||||
"tabler",
|
"tabler",
|
||||||
"tablist",
|
"tablist",
|
||||||
"tabpanel",
|
"tabpanel",
|
||||||
|
"tbody",
|
||||||
"templating",
|
"templating",
|
||||||
"tera",
|
"tera",
|
||||||
"testid",
|
"testid",
|
||||||
"textareas",
|
"textareas",
|
||||||
"textfield",
|
"textfield",
|
||||||
|
"thead",
|
||||||
"Themer",
|
"Themer",
|
||||||
"tinycolor",
|
"tinycolor",
|
||||||
"transitionend",
|
"transitionend",
|
||||||
@@ -168,6 +208,7 @@
|
|||||||
"typeof",
|
"typeof",
|
||||||
"unbundles",
|
"unbundles",
|
||||||
"unbundling",
|
"unbundling",
|
||||||
|
"Uncategorized",
|
||||||
"unicons",
|
"unicons",
|
||||||
"unsanitized",
|
"unsanitized",
|
||||||
"unsupportive",
|
"unsupportive",
|
||||||
@@ -178,9 +219,11 @@
|
|||||||
"Vuejs",
|
"Vuejs",
|
||||||
"WCAG",
|
"WCAG",
|
||||||
"webawesome",
|
"webawesome",
|
||||||
|
"webawesomer",
|
||||||
"WEBP",
|
"WEBP",
|
||||||
"Webpacker",
|
"Webpacker",
|
||||||
"xmark"
|
"xmark",
|
||||||
|
"zoomable"
|
||||||
],
|
],
|
||||||
"ignorePaths": [
|
"ignorePaths": [
|
||||||
"package.json",
|
"package.json",
|
||||||
|
|||||||
@@ -1,126 +0,0 @@
|
|||||||
import { parse } from 'path';
|
|
||||||
import { markdown } from './_utils/markdown.js';
|
|
||||||
import { anchorHeadingsPlugin } from './_utils/anchor-headings.js';
|
|
||||||
import { codeExamplesPlugin } from './_utils/code-examples.js';
|
|
||||||
import { copyCodePlugin } from './_utils/copy-code.js';
|
|
||||||
import { currentLink } from './_utils/current-link.js';
|
|
||||||
import { highlightCodePlugin } from './_utils/highlight-code.js';
|
|
||||||
import { formatCodePlugin } from './_utils/format-code.js';
|
|
||||||
import { replaceTextPlugin } from './_utils/replace-text.js';
|
|
||||||
import { searchPlugin } from './_utils/search.js';
|
|
||||||
import { readFile } from 'fs/promises';
|
|
||||||
import { outlinePlugin } from './_utils/outline.js';
|
|
||||||
import { getComponents } from './_utils/manifest.js';
|
|
||||||
import process from 'process';
|
|
||||||
|
|
||||||
const packageData = JSON.parse(await readFile('./package.json', 'utf-8'));
|
|
||||||
const isDeveloping = process.argv.includes('--develop');
|
|
||||||
|
|
||||||
export default function (eleventyConfig) {
|
|
||||||
// Add template data
|
|
||||||
eleventyConfig.addGlobalData('package', packageData);
|
|
||||||
|
|
||||||
// Template filters - {{ content | filter }}
|
|
||||||
eleventyConfig.addFilter('inlineMarkdown', content => markdown.renderInline(content || ''));
|
|
||||||
eleventyConfig.addFilter('markdown', content => markdown.render(content || ''));
|
|
||||||
eleventyConfig.addFilter('stripExtension', string => parse(string).name);
|
|
||||||
eleventyConfig.addFilter('stripPrefix', content => content.replace(/^wa-/, ''));
|
|
||||||
eleventyConfig.addFilter('trimPipes', content => {
|
|
||||||
// Trims whitespace and pipes from the start and end of a string. Useful for CEM types, which can be pipe-delimited.
|
|
||||||
// With Prettier 3, this means a leading pipe will exist be present when the line wraps.
|
|
||||||
return typeof content === 'string' ? content.replace(/^(\s|\|)/g, '').replace(/(\s|\|)$/g, '') : content;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Shortcodes - {% shortCode arg1, arg2 %}
|
|
||||||
eleventyConfig.addShortcode('cdnUrl', location => {
|
|
||||||
return (
|
|
||||||
`https://cdn.jsdelivr.net/npm/@shoelace-style/webawesome@${packageData.version}/` + location.replace(/^\//, '')
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Helpers
|
|
||||||
eleventyConfig.addNunjucksGlobal('getComponent', tagName => {
|
|
||||||
const component = getComponents().find(c => c.tagName === tagName);
|
|
||||||
|
|
||||||
if (!component) {
|
|
||||||
throw new Error(
|
|
||||||
`Unable to find "<${tagName}>". Make sure the file name is the same as the tag name (without prefix).`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return component;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Use our own markdown instance
|
|
||||||
eleventyConfig.setLibrary('md', markdown);
|
|
||||||
|
|
||||||
// Add anchors to headings
|
|
||||||
eleventyConfig.addPlugin(anchorHeadingsPlugin({ container: '#content' }));
|
|
||||||
|
|
||||||
// Add an outline to the page
|
|
||||||
eleventyConfig.addPlugin(
|
|
||||||
outlinePlugin({
|
|
||||||
container: '#content',
|
|
||||||
target: '.outline-links',
|
|
||||||
selector: 'h2, h3',
|
|
||||||
ifEmpty: doc => {
|
|
||||||
doc.querySelector('#outline')?.remove();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
// Add current link classes
|
|
||||||
eleventyConfig.addPlugin(currentLink());
|
|
||||||
|
|
||||||
// Add code examples for `<code class="example">` blocks
|
|
||||||
eleventyConfig.addPlugin(codeExamplesPlugin());
|
|
||||||
|
|
||||||
// Highlight code blocks with Prism
|
|
||||||
eleventyConfig.addPlugin(highlightCodePlugin());
|
|
||||||
|
|
||||||
// Add copy code buttons to code blocks
|
|
||||||
eleventyConfig.addPlugin(copyCodePlugin());
|
|
||||||
|
|
||||||
// Various text replacements
|
|
||||||
eleventyConfig.addPlugin(
|
|
||||||
replaceTextPlugin([
|
|
||||||
// Replace [issue:1234] with a link to the issue on GitHub
|
|
||||||
{
|
|
||||||
replace: /\[pr:([0-9]+)\]/gs,
|
|
||||||
replaceWith: '<a href="https://github.com/shoelace-style/webawesome/pull/$1">#$1</a>'
|
|
||||||
},
|
|
||||||
// Replace [pr:1234] with a link to the pull request on GitHub
|
|
||||||
{
|
|
||||||
replace: /\[issue:([0-9]+)\]/gs,
|
|
||||||
replaceWith: '<a href="https://github.com/shoelace-style/webawesome/issues/$1">#$1</a>'
|
|
||||||
},
|
|
||||||
// Replace [discuss:1234] with a link to the discussion on GitHub
|
|
||||||
{
|
|
||||||
replace: /\[discuss:([0-9]+)\]/gs,
|
|
||||||
replaceWith: '<a href="https://github.com/shoelace-style/webawesome/discussions/$1">#$1</a>'
|
|
||||||
}
|
|
||||||
])
|
|
||||||
);
|
|
||||||
|
|
||||||
// Build the search index
|
|
||||||
eleventyConfig.addPlugin(
|
|
||||||
searchPlugin({
|
|
||||||
filename: '',
|
|
||||||
selectorsToIgnore: ['code.example'],
|
|
||||||
getContent: doc => doc.querySelector('#content')?.textContent ?? ''
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
// Production-only plugins
|
|
||||||
if (!isDeveloping) {
|
|
||||||
// Run Prettier on each file (prod only because it can be slow)
|
|
||||||
eleventyConfig.addPlugin(formatCodePlugin());
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
dir: {
|
|
||||||
includes: '_includes',
|
|
||||||
layouts: '_layouts'
|
|
||||||
},
|
|
||||||
templateFormats: ['njk', 'md']
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<svg class="logo" xmlns="http://www.w3.org/2000/svg" width="277" height="211" viewBox="0 0 277 211"><g fill="none" fill-rule="evenodd"><path fill="#F6894C" d="M159.275,20.7541243 C159.275,28.4927904 155.035053,35.2422161 148.749528,38.8106604 L193.9,72.6391714 L238.157213,58.6776414 C236.43401,55.6537326 235.45,52.1547058 235.45,48.42629 C235.45,36.96411 244.751396,27.6721657 256.225,27.6721657 C267.698604,27.6721657 277,36.96411 277,48.42629 C277,59.8883646 267.698604,69.1804143 256.225,69.1804143 C255.131246,69.1804143 254.057541,69.0960801 253.00969,68.9332096 L204.251886,193.411571 C200.096886,204.019762 189.858966,211 178.45659,211 L98.5434095,211 C87.1410343,211 76.9031143,204.019762 72.7481143,193.411571 L23.990205,68.9332096 C22.9423008,69.0960801 21.8685432,69.1804143 20.775,69.1804143 C9.30129067,69.1804143 0,59.8883646 0,48.42629 C0,36.96411 9.30129067,27.6721657 20.775,27.6721657 C32.2487093,27.6721657 41.55,36.96411 41.55,48.42629 C41.55,52.1547058 40.5658322,55.6537326 38.842945,58.6776414 L83.1,72.6391714 L128.250472,38.8106604 C121.964947,35.2422161 117.725,28.4927904 117.725,20.7541243 C117.725,9.29194428 127.026396,0 138.5,0 C149.973604,0 159.275,9.29194428 159.275,20.7541243 Z"/></g></svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
@@ -1,234 +0,0 @@
|
|||||||
{# Getting started #}
|
|
||||||
<h2>Getting Started</h2>
|
|
||||||
<ul>
|
|
||||||
<li><a href="/docs/installation">Installation</a></li>
|
|
||||||
<li><a href="/docs/usage">Usage</a></li>
|
|
||||||
<li><a href="/docs/themes">Themes</a></li>
|
|
||||||
<li><a href="/docs/customizing">Customizing</a></li>
|
|
||||||
<li><a href="/docs/localization">Localization</a></li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
{# Experimental #}
|
|
||||||
<h2>Experimental</h2>
|
|
||||||
<ul>
|
|
||||||
<li><a href="/docs/experimental/themer">Theme Builder</a></li>
|
|
||||||
<li><a href="/docs/experimental/style-guide">Style Guide</a></li>
|
|
||||||
<li><a href="/docs/experimental/form-validation">Form Validation Styles</a></li>
|
|
||||||
<li><a href="/docs/experimental/sandbox">Sandbox</a></li>
|
|
||||||
<li style="margin-top: .5rem;"><wa-switch id="theme-toggle">Dark mode</wa-switch></li>
|
|
||||||
<script type="module">
|
|
||||||
// Temporary dark toggle
|
|
||||||
const toggle = document.getElementById('theme-toggle');
|
|
||||||
toggle.checked = document.documentElement.classList.contains('wa-theme-default-dark');
|
|
||||||
|
|
||||||
toggle.addEventListener('wa-change', () => {
|
|
||||||
document.documentElement.classList.toggle('wa-theme-default-dark');
|
|
||||||
localStorage.setItem('theme', toggle.checked ? 'dark' : 'light');
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
|
|
||||||
{# Resources #}
|
|
||||||
<h2>Resources</h2>
|
|
||||||
<ul>
|
|
||||||
<li><a href="https://github.com/shoelace-style/shoelace/discussions">Help & Support</a></li>
|
|
||||||
<li><a href="/docs/resources/community">Community</a></li>
|
|
||||||
<li><a href="/docs/resources/accessibility">Accessibility</a></li>
|
|
||||||
<li><a href="/docs/resources/contributing">Contributing</a></li>
|
|
||||||
<li><a href="/docs/resources/changelog">Changelog</a></li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
{# Components #}
|
|
||||||
<h2>Components</h2>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/animated-image">Animated Image</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/animation">Animation</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/avatar">Avatar</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/badge">Badge</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/breadcrumb">Breadcrumb</a>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/breadcrumb-item">Breadcrumb Item</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/button">Button</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/button-group">Button Group</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/callout">Callout</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/card">Card</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/carousel">Carousel</a>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/carousel-item">Carousel Item</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/checkbox">Checkbox</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/color-picker">Color Picker</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/copy-button">Copy Button</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/details">Details</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/dialog">Dialog</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/divider">Divider</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/drawer">Drawer</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/dropdown">Dropdown</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/format-bytes">Format Bytes</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/format-date">Format Date</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/format-number">Format Number</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/icon">Icon</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/icon-button">Icon Button</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/image-comparer">Image Comparer</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/include">Include</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/input">Input</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/menu">Menu</a>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/menu-item">Menu Item</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/menu-label">Menu Label</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/mutation-observer">Mutation Observer</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/option">Option</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/page">Page</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/popup">Popup</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/progress-bar">Progress Bar</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/progress-ring">Progress Ring</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/qr-code">QR Code</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/radio-group">Radio Group</a>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/radio">Radio</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/radio-button">Radio Button</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/range">Range</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/rating">Rating</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/relative-time">Relative Time</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/resize-observer">Resize Observer</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/select">Select</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/skeleton">Skeleton</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/spinner">Spinner</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/split-panel">Split Panel</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/switch">Switch</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/tab-group">Tab Group</a>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/tab">Tab</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/tab-panel">Tab Panel</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/tag">Tag</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/textarea">Textarea</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/tooltip">Tooltip</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/tree">Tree</a>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/tree-item">Tree Item</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/docs/components/visually-hidden">Visually Hidden</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
import { parse } from 'node-html-parser';
|
|
||||||
import { v4 as uuid } from 'uuid';
|
|
||||||
import slugify from 'slugify';
|
|
||||||
|
|
||||||
function createId(text) {
|
|
||||||
let slug = slugify(String(text), {
|
|
||||||
remove: /[^\w|\s]/g,
|
|
||||||
lower: true
|
|
||||||
});
|
|
||||||
|
|
||||||
// ids must start with a letter
|
|
||||||
if (!/^[a-z]/i.test(slug)) {
|
|
||||||
slug = `wa_${slug}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
return slug;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Eleventy plugin to add anchors to headings to content.
|
|
||||||
*/
|
|
||||||
export function anchorHeadingsPlugin(options = {}) {
|
|
||||||
options = {
|
|
||||||
container: 'body',
|
|
||||||
headingSelector: 'h2, h3, h4, h5, h6',
|
|
||||||
anchorLabel: 'Jump to heading',
|
|
||||||
...options
|
|
||||||
};
|
|
||||||
|
|
||||||
return function (eleventyConfig) {
|
|
||||||
eleventyConfig.addTransform('anchor-headings', content => {
|
|
||||||
const doc = parse(content);
|
|
||||||
const container = doc.querySelector(options.container);
|
|
||||||
|
|
||||||
if (!container) {
|
|
||||||
return content;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Look for headings
|
|
||||||
container.querySelectorAll(options.headingSelector).forEach(heading => {
|
|
||||||
const hasAnchor = heading.querySelector('a');
|
|
||||||
const clone = parse(heading.outerHTML);
|
|
||||||
|
|
||||||
// Create a clone of the heading so we can remove [data-no-anchor] elements from the text content
|
|
||||||
clone.querySelectorAll('[data-no-anchor]').forEach(el => el.remove());
|
|
||||||
|
|
||||||
const slug = createId(clone.textContent ?? '') ?? uuid().slice(-12);
|
|
||||||
let id = slug;
|
|
||||||
let suffix = 0;
|
|
||||||
|
|
||||||
// Make sure the slug is unique in the document
|
|
||||||
while (doc.getElementById(id) !== null) {
|
|
||||||
id = `${slug}-${++suffix}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hasAnchor || !id) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the anchor
|
|
||||||
const anchor = parse(`
|
|
||||||
<a href="#${encodeURIComponent(id)}">
|
|
||||||
<span class="wa-visually-hidden"></span>
|
|
||||||
<span aria-hidden="true">#</span>
|
|
||||||
</a>
|
|
||||||
`);
|
|
||||||
anchor.querySelector('.wa-visually-hidden').textContent = options.anchorLabel;
|
|
||||||
|
|
||||||
// Update the heading
|
|
||||||
heading.setAttribute('id', id);
|
|
||||||
heading.classList.add('anchor-heading');
|
|
||||||
heading.appendChild(anchor);
|
|
||||||
});
|
|
||||||
|
|
||||||
return doc.toString();
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
import { parse } from 'node-html-parser';
|
|
||||||
import { v4 as uuid } from 'uuid';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Eleventy plugin to turn `<code class="example">` blocks into live examples.
|
|
||||||
*/
|
|
||||||
export function codeExamplesPlugin(options = {}) {
|
|
||||||
options = {
|
|
||||||
container: 'body',
|
|
||||||
...options
|
|
||||||
};
|
|
||||||
|
|
||||||
return function (eleventyConfig) {
|
|
||||||
eleventyConfig.addTransform('code-examples', content => {
|
|
||||||
const doc = parse(content, { blockTextElements: { code: true } });
|
|
||||||
const container = doc.querySelector(options.container);
|
|
||||||
|
|
||||||
if (!container) {
|
|
||||||
return content;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Look for external links
|
|
||||||
container.querySelectorAll('code.example').forEach(code => {
|
|
||||||
const pre = code.closest('pre');
|
|
||||||
const hasButtons = !code.classList.contains('no-buttons');
|
|
||||||
const isOpen = code.classList.contains('open') || !hasButtons;
|
|
||||||
const noEdit = code.classList.contains('no-edit');
|
|
||||||
const id = `code-example-${uuid().slice(-12)}`;
|
|
||||||
let preview = pre.textContent;
|
|
||||||
|
|
||||||
// Run preview scripts as modules to prevent collisions
|
|
||||||
const root = parse(preview, { blockTextElements: { script: true } });
|
|
||||||
root.querySelectorAll('script').forEach(script => script.setAttribute('type', 'module'));
|
|
||||||
preview = root.toString();
|
|
||||||
|
|
||||||
const codeExample = parse(`
|
|
||||||
<div class="code-example ${isOpen ? 'open' : ''}">
|
|
||||||
<div class="code-example-preview">
|
|
||||||
${preview}
|
|
||||||
</div>
|
|
||||||
<div class="code-example-source" id="${id}">
|
|
||||||
${pre.outerHTML}
|
|
||||||
</div>
|
|
||||||
${
|
|
||||||
hasButtons
|
|
||||||
? `
|
|
||||||
<div class="code-example-buttons">
|
|
||||||
<button
|
|
||||||
class="code-example-toggle"
|
|
||||||
type="button"
|
|
||||||
aria-expanded="${isOpen ? 'true' : 'false'}"
|
|
||||||
aria-controls="${id}"
|
|
||||||
>
|
|
||||||
Code
|
|
||||||
<wa-icon name="chevron-down"></wa-icon>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
${
|
|
||||||
noEdit
|
|
||||||
? ''
|
|
||||||
: `
|
|
||||||
<button class="code-example-pen" type="button">
|
|
||||||
<wa-icon name="pen-to-square"></wa-icon>
|
|
||||||
Edit
|
|
||||||
</button>
|
|
||||||
`
|
|
||||||
}
|
|
||||||
|
|
||||||
`
|
|
||||||
: ''
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
`);
|
|
||||||
|
|
||||||
pre.replaceWith(codeExample);
|
|
||||||
});
|
|
||||||
|
|
||||||
return doc.toString();
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
import { parse } from 'node-html-parser';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Eleventy plugin to add copy buttons to code blocks.
|
|
||||||
*/
|
|
||||||
export function copyCodePlugin(options = {}) {
|
|
||||||
options = {
|
|
||||||
container: 'body',
|
|
||||||
...options
|
|
||||||
};
|
|
||||||
|
|
||||||
return function (eleventyConfig) {
|
|
||||||
eleventyConfig.addTransform('copy-code', content => {
|
|
||||||
const doc = parse(content, { blockTextElements: { code: true } });
|
|
||||||
const container = doc.querySelector(options.container);
|
|
||||||
|
|
||||||
if (!container) {
|
|
||||||
return content;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Look for code blocks
|
|
||||||
container.querySelectorAll('pre > code').forEach(code => {
|
|
||||||
const pre = code.closest('pre');
|
|
||||||
|
|
||||||
// Add a copy button (we set the copy data at runtime to reduce page bloat)
|
|
||||||
pre.innerHTML = `<wa-copy-button class="copy-button" hoist></wa-copy-button>` + pre.innerHTML;
|
|
||||||
});
|
|
||||||
|
|
||||||
return doc.toString();
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
import { parse } from 'node-html-parser';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Eleventy plugin to add an outline (table of contents) to the page. Headings must have an id, otherwise they won't be
|
|
||||||
* included in the outline. An unordered list containing links will be appended to the target element.
|
|
||||||
*
|
|
||||||
* If no headings are found for the outline, the `ifEmpty()` function will be called with a `node-html-parser` object as
|
|
||||||
* the first argument. This can be used to toggle classes or remove elements when the outline is empty.
|
|
||||||
*
|
|
||||||
* See the `node-html-parser` docs for more details: https://www.npmjs.com/package/node-html-parser
|
|
||||||
*/
|
|
||||||
export function outlinePlugin(options = {}) {
|
|
||||||
options = {
|
|
||||||
container: 'body',
|
|
||||||
target: '.outline',
|
|
||||||
selector: 'h2,h3',
|
|
||||||
ifEmpty: () => null,
|
|
||||||
...options
|
|
||||||
};
|
|
||||||
|
|
||||||
return function (eleventyConfig) {
|
|
||||||
eleventyConfig.addTransform('outline', content => {
|
|
||||||
const doc = parse(content);
|
|
||||||
const container = doc.querySelector(options.container);
|
|
||||||
const ul = parse('<ul></ul>');
|
|
||||||
let numLinks = 0;
|
|
||||||
|
|
||||||
if (!container) {
|
|
||||||
return content;
|
|
||||||
}
|
|
||||||
|
|
||||||
container.querySelectorAll(options.selector).forEach(heading => {
|
|
||||||
const id = heading.getAttribute('id');
|
|
||||||
const level = heading.tagName.slice(1);
|
|
||||||
const clone = parse(heading.outerHTML);
|
|
||||||
|
|
||||||
if (heading.closest('[data-no-outline]')) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a clone of the heading so we can remove links and [data-no-outline] elements from the text content
|
|
||||||
clone.querySelectorAll('a').forEach(a => a.remove());
|
|
||||||
clone.querySelectorAll('[data-no-outline]').forEach(el => el.remove());
|
|
||||||
|
|
||||||
// Generate the link
|
|
||||||
const li = parse(`<li data-level="${level}"><a></a></li>`);
|
|
||||||
const a = li.querySelector('a');
|
|
||||||
a.setAttribute('href', `#${encodeURIComponent(id)}`);
|
|
||||||
a.textContent = clone.textContent.trim().replace(/#$/, '');
|
|
||||||
|
|
||||||
// Add it to the list
|
|
||||||
ul.firstChild.appendChild(li);
|
|
||||||
numLinks++;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (numLinks > 0) {
|
|
||||||
// Append the list to all matching targets
|
|
||||||
doc.querySelectorAll(options.target).forEach(target => {
|
|
||||||
target.appendChild(parse(ul.outerHTML));
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
// Remove if empty
|
|
||||||
options.ifEmpty(doc);
|
|
||||||
}
|
|
||||||
|
|
||||||
return doc.toString();
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
/* eslint-disable no-invalid-this */
|
|
||||||
import { dirname, join } from 'path';
|
|
||||||
import { mkdir, writeFile } from 'fs/promises';
|
|
||||||
import { parse } from 'node-html-parser';
|
|
||||||
import lunr from 'lunr';
|
|
||||||
|
|
||||||
function collapseWhitespace(string) {
|
|
||||||
return string.replace(/\s+/g, ' ');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Eleventy plugin to build a Lunr search index.
|
|
||||||
*/
|
|
||||||
export function searchPlugin(options = {}) {
|
|
||||||
options = {
|
|
||||||
filename: '',
|
|
||||||
selectorsToIgnore: [],
|
|
||||||
getTitle: doc => doc.querySelector('title')?.textContent ?? '',
|
|
||||||
getDescription: doc => doc.querySelector('meta[name="description"]')?.getAttribute('content') ?? '',
|
|
||||||
getHeadings: doc => [...doc.querySelectorAll('h1, h2, h3, h4, h5, h6')].map(heading => heading.textContent ?? ''),
|
|
||||||
getContent: doc => doc.querySelector('body')?.textContent ?? '',
|
|
||||||
...options
|
|
||||||
};
|
|
||||||
|
|
||||||
return function (eleventyConfig) {
|
|
||||||
const pagesToIndex = [];
|
|
||||||
|
|
||||||
eleventyConfig.addTransform('search', function (content) {
|
|
||||||
const doc = parse(content, {
|
|
||||||
blockTextElements: {
|
|
||||||
script: false,
|
|
||||||
noscript: false,
|
|
||||||
style: false,
|
|
||||||
pre: false,
|
|
||||||
code: false
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Remove content that shouldn't be searchable to reduce the index size
|
|
||||||
options.selectorsToIgnore.forEach(selector => {
|
|
||||||
doc.querySelectorAll(selector).forEach(el => el.remove());
|
|
||||||
});
|
|
||||||
|
|
||||||
pagesToIndex.push({
|
|
||||||
title: collapseWhitespace(options.getTitle(doc)),
|
|
||||||
description: collapseWhitespace(options.getDescription(doc)),
|
|
||||||
headings: options.getHeadings(doc).map(collapseWhitespace),
|
|
||||||
content: collapseWhitespace(options.getContent(doc)),
|
|
||||||
url: this.page.url === '/' ? '/' : this.page.url.replace(/\/$/, '')
|
|
||||||
});
|
|
||||||
|
|
||||||
return content;
|
|
||||||
});
|
|
||||||
|
|
||||||
eleventyConfig.on('eleventy.after', ({ dir }) => {
|
|
||||||
const outputFilename = join(dir.output, 'search.json');
|
|
||||||
const map = [];
|
|
||||||
const searchIndex = lunr(async function () {
|
|
||||||
let index = 0;
|
|
||||||
|
|
||||||
this.ref('id');
|
|
||||||
this.field('t', { boost: 20 });
|
|
||||||
this.field('h', { boost: 10 });
|
|
||||||
this.field('c');
|
|
||||||
|
|
||||||
for (const page of pagesToIndex) {
|
|
||||||
this.add({ id: index, t: page.title, h: page.headings, c: page.content });
|
|
||||||
map[index] = { title: page.title, description: page.description, url: page.url };
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
await mkdir(dirname(outputFilename), { recursive: true });
|
|
||||||
await writeFile(outputFilename, JSON.stringify({ searchIndex, map }), 'utf-8');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 35 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg class="logo" xmlns="http://www.w3.org/2000/svg" width="277" height="211" viewBox="0 0 277 211"><g fill="none" fill-rule="evenodd"><path fill="#F6894C" d="M159.275,20.7541243 C159.275,28.4927904 155.035053,35.2422161 148.749528,38.8106604 L193.9,72.6391714 L238.157213,58.6776414 C236.43401,55.6537326 235.45,52.1547058 235.45,48.42629 C235.45,36.96411 244.751396,27.6721657 256.225,27.6721657 C267.698604,27.6721657 277,36.96411 277,48.42629 C277,59.8883646 267.698604,69.1804143 256.225,69.1804143 C255.131246,69.1804143 254.057541,69.0960801 253.00969,68.9332096 L204.251886,193.411571 C200.096886,204.019762 189.858966,211 178.45659,211 L98.5434095,211 C87.1410343,211 76.9031143,204.019762 72.7481143,193.411571 L23.990205,68.9332096 C22.9423008,69.0960801 21.8685432,69.1804143 20.775,69.1804143 C9.30129067,69.1804143 0,59.8883646 0,48.42629 C0,36.96411 9.30129067,27.6721657 20.775,27.6721657 C32.2487093,27.6721657 41.55,36.96411 41.55,48.42629 C41.55,52.1547058 40.5658322,55.6537326 38.842945,58.6776414 L83.1,72.6391714 L128.250472,38.8106604 C121.964947,35.2422161 117.725,28.4927904 117.725,20.7541243 C117.725,9.29194428 127.026396,0 138.5,0 C149.973604,0 159.275,9.29194428 159.275,20.7541243 Z"/></g></svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
@@ -1,3 +0,0 @@
|
|||||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M11.63 3.625C11.63 4.27911 11.2435 4.84296 10.6865 5.10064L14 8L17.2622 7.34755C17.0968 7.10642 17 6.81452 17 6.5C17 5.67157 17.6716 5 18.5 5C19.3284 5 20 5.67157 20 6.5C20 7.31157 19.3555 7.9726 18.5504 7.99917L15.0307 15.8207C14.7077 16.5384 13.9939 17 13.2068 17H6.79317C6.00615 17 5.29229 16.5384 4.96933 15.8207L1.44963 7.99917C0.64452 7.9726 0 7.31157 0 6.5C0 5.67157 0.671573 5 1.5 5C2.32843 5 3 5.67157 3 6.5C3 6.81452 2.9032 7.10642 2.73777 7.34755L6 8L9.31702 5.09761C8.76346 4.83855 8.38 4.27656 8.38 3.625C8.38 2.72754 9.10754 2 10.005 2C10.9025 2 11.63 2.72754 11.63 3.625Z" fill="currentColor"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 722 B |
@@ -1,3 +0,0 @@
|
|||||||
<svg viewBox="0 0 20 16" xmlns="http://www.w3.org/2000/svg" fill="#f68a4c">
|
|
||||||
<path d="M11.63 1.625C11.63 2.27911 11.2435 2.84296 10.6865 3.10064L14 6L17.2622 5.34755C17.0968 5.10642 17 4.81452 17 4.5C17 3.67157 17.6716 3 18.5 3C19.3284 3 20 3.67157 20 4.5C20 5.31157 19.3555 5.9726 18.5504 5.99917L15.0307 13.8207C14.7077 14.5384 13.9939 15 13.2068 15H6.79317C6.00615 15 5.29229 14.5384 4.96933 13.8207L1.44963 5.99917C0.64452 5.9726 0 5.31157 0 4.5C0 3.67157 0.671573 3 1.5 3C2.32843 3 3 3.67157 3 4.5C3 4.81452 2.9032 5.10642 2.73777 5.34755L6 6L9.31702 3.09761C8.76346 2.83855 8.38 2.27656 8.38 1.625C8.38 0.727537 9.10754 0 10.005 0C10.9025 0 11.63 0.727537 11.63 1.625Z"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 684 B |
|
Before Width: | Height: | Size: 8.3 KiB |
@@ -1,57 +0,0 @@
|
|||||||
document.addEventListener('click', event => {
|
|
||||||
const toggle = event.target?.closest('.code-example-toggle');
|
|
||||||
const pen = event.target?.closest('.code-example-pen');
|
|
||||||
|
|
||||||
// Toggle source
|
|
||||||
if (toggle) {
|
|
||||||
const codeExample = toggle.closest('.code-example');
|
|
||||||
const isOpen = !codeExample.classList.contains('open');
|
|
||||||
|
|
||||||
toggle.setAttribute('aria-expanded', isOpen ? 'true' : 'false');
|
|
||||||
codeExample.classList.toggle('open', isOpen);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Edit in CodePen
|
|
||||||
if (pen) {
|
|
||||||
const codeExample = pen.closest('.code-example');
|
|
||||||
const code = codeExample.querySelector('code');
|
|
||||||
const version = document.documentElement.dataset.version;
|
|
||||||
const html =
|
|
||||||
`<script type="module" src="https://cdn.jsdelivr.net/npm/@shoelace-style/webawesome@${version}/dist/webawesome.loader.js"></script>` +
|
|
||||||
`\n\n` +
|
|
||||||
`${code.textContent}`;
|
|
||||||
const css = 'body {\n font: 16px sans-serif;\n padding: 1rem;\n}\n';
|
|
||||||
const js = '';
|
|
||||||
|
|
||||||
const form = document.createElement('form');
|
|
||||||
form.action = 'https://codepen.io/pen/define';
|
|
||||||
form.method = 'POST';
|
|
||||||
form.target = '_blank';
|
|
||||||
|
|
||||||
const data = {
|
|
||||||
title: '',
|
|
||||||
description: '',
|
|
||||||
tags: ['webawesome'],
|
|
||||||
editors: '1000',
|
|
||||||
head: '<meta name="viewport" content="width=device-width">',
|
|
||||||
html_classes: '',
|
|
||||||
css_external: '',
|
|
||||||
js_external: '',
|
|
||||||
js_module: true,
|
|
||||||
js_pre_processor: 'none',
|
|
||||||
html,
|
|
||||||
css,
|
|
||||||
js
|
|
||||||
};
|
|
||||||
|
|
||||||
const input = document.createElement('input');
|
|
||||||
input.type = 'hidden';
|
|
||||||
input.name = 'data';
|
|
||||||
input.value = JSON.stringify(data);
|
|
||||||
form.append(input);
|
|
||||||
|
|
||||||
document.documentElement.append(form);
|
|
||||||
form.submit();
|
|
||||||
form.remove();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
function setCopyValue() {
|
|
||||||
document.querySelectorAll('.copy-button').forEach(copyButton => {
|
|
||||||
const pre = copyButton.closest('pre');
|
|
||||||
const code = pre?.querySelector('code');
|
|
||||||
|
|
||||||
if (code) {
|
|
||||||
copyButton.value = code.textContent;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set data for all copy buttons when the page loads
|
|
||||||
setCopyValue();
|
|
||||||
|
|
||||||
document.addEventListener('turbo:load', setCopyValue);
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
// Smooth links
|
|
||||||
document.addEventListener('click', event => {
|
|
||||||
const link = event.target.closest('a');
|
|
||||||
const id = (link?.hash ?? '').substr(1);
|
|
||||||
|
|
||||||
if (!link || link.getAttribute('data-smooth-link') === 'off') {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (id) {
|
|
||||||
const target = document.getElementById(id);
|
|
||||||
const headerHeight = document.querySelector('wa-page > header').clientHeight;
|
|
||||||
|
|
||||||
if (target) {
|
|
||||||
event.preventDefault();
|
|
||||||
window.scroll({
|
|
||||||
top: target.offsetTop - headerHeight,
|
|
||||||
behavior: 'smooth'
|
|
||||||
});
|
|
||||||
history.pushState(undefined, undefined, `#${id}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Scroll classes
|
|
||||||
function updateScrollClass() {
|
|
||||||
document.body.classList.toggle('scrolled-down', window.scrollY >= 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
window.addEventListener('scroll', updateScrollClass);
|
|
||||||
window.addEventListener('turbo:render', updateScrollClass);
|
|
||||||
updateScrollClass();
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
import 'https://cdn.jsdelivr.net/npm/@hotwired/turbo@7.3.0/+esm';
|
|
||||||
|
|
||||||
if (!window.___turboScrollPositions___) {
|
|
||||||
window.___turboScrollPositions___ = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
const positions = window.___turboScrollPositions___;
|
|
||||||
|
|
||||||
function saveScrollPosition() {
|
|
||||||
document.querySelectorAll('[data-remember-scroll]').forEach(el => {
|
|
||||||
if (el.id) {
|
|
||||||
positions[el.id] = {
|
|
||||||
top: el.scrollTop,
|
|
||||||
left: el.scrollLeft
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
console.warn(`Can't save scroll position for elements without an id.`, el);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function restoreScrollPosition(event) {
|
|
||||||
const el = event.detail?.newBody || document;
|
|
||||||
|
|
||||||
el.querySelectorAll('[data-remember-scroll]').forEach(el => {
|
|
||||||
if (positions[el.id]) {
|
|
||||||
el.scrollTop = positions[el.id].top;
|
|
||||||
el.scrollLeft = positions[el.id].left;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
window.addEventListener('turbo:before-cache', saveScrollPosition);
|
|
||||||
window.addEventListener('turbo:before-render', restoreScrollPosition);
|
|
||||||
window.addEventListener('turbo:render', restoreScrollPosition);
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
.code-example {
|
|
||||||
border: var(--wa-border-style) var(--wa-panel-border-width) var(--wa-color-neutral-border-subtle);
|
|
||||||
border-radius: var(--wa-corners-m);
|
|
||||||
color: var(--wa-color-text-normal);
|
|
||||||
margin-block-end: var(--wa-flow-spacing);
|
|
||||||
}
|
|
||||||
|
|
||||||
.code-example-preview {
|
|
||||||
padding: 2rem;
|
|
||||||
border-bottom: var(--wa-border-style) var(--wa-panel-border-width) var(--wa-color-neutral-border-subtle);
|
|
||||||
|
|
||||||
> :first-child {
|
|
||||||
margin-block-start: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
> :last-child {
|
|
||||||
margin-block-end: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.code-example-source {
|
|
||||||
border-bottom: var(--wa-border-style) var(--wa-panel-border-width) var(--wa-color-neutral-border-subtle);
|
|
||||||
}
|
|
||||||
|
|
||||||
.code-example:not(.open) .code-example-source {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.code-example.open .code-example-toggle wa-icon {
|
|
||||||
rotate: 180deg;
|
|
||||||
}
|
|
||||||
|
|
||||||
.code-example-source pre {
|
|
||||||
position: relative;
|
|
||||||
border-radius: 0;
|
|
||||||
margin: 0;
|
|
||||||
white-space: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
.code-example-source:not(:has(+ .code-example-buttons)) {
|
|
||||||
border-bottom: none;
|
|
||||||
|
|
||||||
pre {
|
|
||||||
border-bottom-right-radius: var(--wa-corners-m);
|
|
||||||
border-bottom-left-radius: var(--wa-corners-m);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.code-example-buttons {
|
|
||||||
display: flex;
|
|
||||||
align-items: stretch;
|
|
||||||
|
|
||||||
button {
|
|
||||||
all: unset;
|
|
||||||
flex: 1 0 auto;
|
|
||||||
font-size: 0.875rem;
|
|
||||||
color: var(--wa-color-text-quiet);
|
|
||||||
border-left: var(--wa-border-style) var(--wa-panel-border-width) var(--wa-color-neutral-border-subtle);
|
|
||||||
text-align: center;
|
|
||||||
padding: 0.5rem;
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
&:first-of-type {
|
|
||||||
border-left: none;
|
|
||||||
border-bottom-left-radius: var(--wa-corners-m);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:last-of-type {
|
|
||||||
border-bottom-right-radius: var(--wa-corners-m);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:focus-visible {
|
|
||||||
outline: var(--wa-focus-ring);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.code-example-pen {
|
|
||||||
flex: 0 0 100px;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
wa-icon {
|
|
||||||
width: 1em;
|
|
||||||
height: 1em;
|
|
||||||
vertical-align: -2px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
.code-comment,
|
|
||||||
.code-prolog,
|
|
||||||
.code-doctype,
|
|
||||||
.code-cdata,
|
|
||||||
.code-operator,
|
|
||||||
.code-punctuation {
|
|
||||||
color: var(--wa-color-base-50);
|
|
||||||
}
|
|
||||||
|
|
||||||
.code-namespace {
|
|
||||||
opacity: 0.7;
|
|
||||||
}
|
|
||||||
|
|
||||||
.code-property,
|
|
||||||
.code-keyword,
|
|
||||||
.code-tag,
|
|
||||||
.code-url {
|
|
||||||
color: #7c3aed; /* violet */
|
|
||||||
}
|
|
||||||
|
|
||||||
.code-symbol,
|
|
||||||
.code-deleted,
|
|
||||||
.code-important {
|
|
||||||
color: var(--wa-color-red-40);
|
|
||||||
}
|
|
||||||
|
|
||||||
.code-boolean,
|
|
||||||
.code-constant,
|
|
||||||
.code-selector,
|
|
||||||
.code-attr-name,
|
|
||||||
.code-string,
|
|
||||||
.code-char,
|
|
||||||
.code-builtin,
|
|
||||||
.code-inserted {
|
|
||||||
color: var(--wa-color-green-40);
|
|
||||||
}
|
|
||||||
|
|
||||||
.code-atrule,
|
|
||||||
.code-attr-value,
|
|
||||||
.code-number,
|
|
||||||
.code-variable,
|
|
||||||
.code-function,
|
|
||||||
.code-class-name,
|
|
||||||
.code-regex {
|
|
||||||
color: var(--wa-color-yellow-40);
|
|
||||||
}
|
|
||||||
|
|
||||||
.code-important,
|
|
||||||
.code-bold {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.code-italic {
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
.copy-button {
|
|
||||||
position: absolute;
|
|
||||||
top: 0.25rem;
|
|
||||||
right: 0.25rem;
|
|
||||||
font-family: var(--wa-font-family-body);
|
|
||||||
color: var(--wa-color-neutral-text-on-fill);
|
|
||||||
background-color: var(--wa-color-neutral-fill-subtle);
|
|
||||||
border-radius: var(--wa-corners-s);
|
|
||||||
padding: 0.25rem;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: var(--wa-color-neutral-fill-highlight);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:focus-visible {
|
|
||||||
outline: var(--wa-focus-ring);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (hover: hover) {
|
|
||||||
.copy-button:not(:focus-within) {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre:hover > .copy-button {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,133 +0,0 @@
|
|||||||
@import 'code-examples.css';
|
|
||||||
@import 'code-highlighter.css';
|
|
||||||
@import 'copy-code.css';
|
|
||||||
@import 'outline.css';
|
|
||||||
@import 'search.css';
|
|
||||||
|
|
||||||
wa-page[view='desktop'] [data-toggle-nav] {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Header */
|
|
||||||
wa-page::part(header) {
|
|
||||||
background-color: var(--wa-color-surface-default);
|
|
||||||
border-bottom: var(--wa-border-style) var(--wa-panel-border-width) var(--wa-color-neutral-border-subtle);
|
|
||||||
}
|
|
||||||
|
|
||||||
wa-page > header {
|
|
||||||
flex: 1 1 auto;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
max-width: 1200px;
|
|
||||||
height: 60px;
|
|
||||||
padding-inline: 2rem;
|
|
||||||
|
|
||||||
svg {
|
|
||||||
width: auto;
|
|
||||||
max-height: 26px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Navigation sidebar */
|
|
||||||
wa-page[view='desktop']::part(navigation) {
|
|
||||||
border-right: var(--wa-border-style) var(--wa-panel-border-width) var(--wa-color-neutral-border-subtle);
|
|
||||||
}
|
|
||||||
|
|
||||||
wa-page[view='desktop'] > #sidebar {
|
|
||||||
min-width: 320px;
|
|
||||||
padding: 2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
#sidebar,
|
|
||||||
#outline {
|
|
||||||
h2 {
|
|
||||||
font-size: 1.125rem;
|
|
||||||
margin-block-end: 0.5rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#sidebar nav {
|
|
||||||
padding-bottom: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Main content */
|
|
||||||
wa-page > main {
|
|
||||||
max-width: 80ch;
|
|
||||||
padding: 2rem;
|
|
||||||
margin-inline: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Current link */
|
|
||||||
#sidebar,
|
|
||||||
#outline {
|
|
||||||
.current {
|
|
||||||
font-weight: var(--wa-font-weight-heavy);
|
|
||||||
text-decoration-style: solid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Anchor headings */
|
|
||||||
.anchor-heading a {
|
|
||||||
visibility: hidden;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (hover: hover) {
|
|
||||||
.anchor-heading:hover a {
|
|
||||||
visibility: visible;
|
|
||||||
padding: 0 0.125em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Callouts */
|
|
||||||
.callout {
|
|
||||||
display: flex;
|
|
||||||
gap: 1rem;
|
|
||||||
border: var(--wa-border-style) var(--wa-border-width-m);
|
|
||||||
border-radius: var(--wa-corners-m);
|
|
||||||
padding: 1rem;
|
|
||||||
margin-block-end: var(--wa-flow-spacing);
|
|
||||||
|
|
||||||
:first-child {
|
|
||||||
margin-block-start: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
:last-child {
|
|
||||||
margin-block-end: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.callout-icon {
|
|
||||||
flex: 0 0 auto;
|
|
||||||
font-size: 1.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.callout-content {
|
|
||||||
flex: 1 1 auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.callout-info {
|
|
||||||
background-color: var(--wa-color-brand-fill-subtle);
|
|
||||||
border-color: var(--wa-color-brand-border-subtle);
|
|
||||||
|
|
||||||
.callout-icon {
|
|
||||||
color: var(--wa-color-brand-text-on-fill);
|
|
||||||
}
|
|
||||||
|
|
||||||
code {
|
|
||||||
background-color: var(--wa-color-brand-fill-highlight);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.callout-warning {
|
|
||||||
background-color: var(--wa-color-warning-fill-subtle);
|
|
||||||
border-color: var(--wa-color-warning-border-subtle);
|
|
||||||
|
|
||||||
.callout-icon {
|
|
||||||
color: var(--wa-color-warning-text-on-fill);
|
|
||||||
}
|
|
||||||
|
|
||||||
code {
|
|
||||||
background-color: var(--wa-color-warning-fill-highlight);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
---
|
|
||||||
title: Badge
|
|
||||||
description: Badges are used to draw attention and display statuses or counts.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-badge>Badge</wa-badge>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Variants
|
|
||||||
|
|
||||||
Set the `variant` attribute to change the badge's variant.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-badge variant="brand">Brand</wa-badge>
|
|
||||||
<wa-badge variant="success">Success</wa-badge>
|
|
||||||
<wa-badge variant="neutral">Neutral</wa-badge>
|
|
||||||
<wa-badge variant="warning">Warning</wa-badge>
|
|
||||||
<wa-badge variant="danger">Danger</wa-badge>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Pill Badges
|
|
||||||
|
|
||||||
Use the `pill` attribute to give badges rounded edges.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-badge variant="brand" pill>Brand</wa-badge>
|
|
||||||
<wa-badge variant="success" pill>Success</wa-badge>
|
|
||||||
<wa-badge variant="neutral" pill>Neutral</wa-badge>
|
|
||||||
<wa-badge variant="warning" pill>Warning</wa-badge>
|
|
||||||
<wa-badge variant="danger" pill>Danger</wa-badge>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Pulsating Badges
|
|
||||||
|
|
||||||
Use the `pulse` attribute to draw attention to the badge with a subtle animation.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<div class="badge-pulse">
|
|
||||||
<wa-badge variant="brand" pill pulse>1</wa-badge>
|
|
||||||
<wa-badge variant="success" pill pulse>1</wa-badge>
|
|
||||||
<wa-badge variant="neutral" pill pulse>1</wa-badge>
|
|
||||||
<wa-badge variant="warning" pill pulse>1</wa-badge>
|
|
||||||
<wa-badge variant="danger" pill pulse>1</wa-badge>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.badge-pulse wa-badge:not(:last-of-type) {
|
|
||||||
margin-right: 1rem;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
```
|
|
||||||
|
|
||||||
### With Buttons
|
|
||||||
|
|
||||||
One of the most common use cases for badges is attaching them to buttons. To make this easier, badges will be automatically positioned at the top-right when they're a child of a button.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-button>
|
|
||||||
Requests
|
|
||||||
<wa-badge pill>30</wa-badge>
|
|
||||||
</wa-button>
|
|
||||||
|
|
||||||
<wa-button style="margin-inline-start: 1rem;">
|
|
||||||
Warnings
|
|
||||||
<wa-badge variant="warning" pill>8</wa-badge>
|
|
||||||
</wa-button>
|
|
||||||
|
|
||||||
<wa-button style="margin-inline-start: 1rem;">
|
|
||||||
Errors
|
|
||||||
<wa-badge variant="danger" pill>6</wa-badge>
|
|
||||||
</wa-button>
|
|
||||||
```
|
|
||||||
|
|
||||||
### With Menu Items
|
|
||||||
|
|
||||||
When including badges in menu items, use the `suffix` slot to make sure they're aligned correctly.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-menu style="max-width: 240px;">
|
|
||||||
<wa-menu-label>Messages</wa-menu-label>
|
|
||||||
<wa-menu-item>Comments <wa-badge slot="suffix" variant="neutral" pill>4</wa-badge></wa-menu-item>
|
|
||||||
<wa-menu-item>Replies <wa-badge slot="suffix" variant="neutral" pill>12</wa-badge></wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
```
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
---
|
|
||||||
title: Breadcrumb Item
|
|
||||||
description: Breadcrumb Items are used inside breadcrumbs to represent different links.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-breadcrumb>
|
|
||||||
<wa-breadcrumb-item>
|
|
||||||
<wa-icon slot="prefix" name="house" variant="solid"></wa-icon>
|
|
||||||
Home
|
|
||||||
</wa-breadcrumb-item>
|
|
||||||
<wa-breadcrumb-item>Clothing</wa-breadcrumb-item>
|
|
||||||
<wa-breadcrumb-item>Shirts</wa-breadcrumb-item>
|
|
||||||
</wa-breadcrumb>
|
|
||||||
```
|
|
||||||
|
|
||||||
:::info
|
|
||||||
Additional demonstrations can be found in the [breadcrumb examples](/components/breadcrumb).
|
|
||||||
:::
|
|
||||||
@@ -1,223 +0,0 @@
|
|||||||
---
|
|
||||||
title: Button
|
|
||||||
description: Buttons represent actions that are available to the user.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-button>Button</wa-button>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Variants
|
|
||||||
|
|
||||||
Use the `variant` attribute to set the button's variant.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-button variant="brand">Brand</wa-button>
|
|
||||||
<wa-button variant="success">Success</wa-button>
|
|
||||||
<wa-button variant="neutral">Neutral</wa-button>
|
|
||||||
<wa-button variant="warning">Warning</wa-button>
|
|
||||||
<wa-button variant="danger">Danger</wa-button>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Sizes
|
|
||||||
|
|
||||||
Use the `size` attribute to change a button's size.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-button size="small">Small</wa-button>
|
|
||||||
<wa-button size="medium">Medium</wa-button>
|
|
||||||
<wa-button size="large">Large</wa-button>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Outline Buttons
|
|
||||||
|
|
||||||
Use the `outline` attribute to draw outlined buttons with transparent backgrounds.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-button variant="brand" outline>Brand</wa-button>
|
|
||||||
<wa-button variant="success" outline>Success</wa-button>
|
|
||||||
<wa-button variant="neutral" outline>Neutral</wa-button>
|
|
||||||
<wa-button variant="warning" outline>Warning</wa-button>
|
|
||||||
<wa-button variant="danger" outline>Danger</wa-button>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Pill Buttons
|
|
||||||
|
|
||||||
Use the `pill` attribute to give buttons rounded edges.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-button size="small" pill>Small</wa-button>
|
|
||||||
<wa-button size="medium" pill>Medium</wa-button>
|
|
||||||
<wa-button size="large" pill>Large</wa-button>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Text Buttons
|
|
||||||
|
|
||||||
Use the `text` variant to create text buttons that share the same size as regular buttons but don't have backgrounds or borders.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-button variant="text" size="small">Text</wa-button>
|
|
||||||
<wa-button variant="text" size="medium">Text</wa-button>
|
|
||||||
<wa-button variant="text" size="large">Text</wa-button>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Link Buttons
|
|
||||||
|
|
||||||
It's often helpful to have a button that works like a link. This is possible by setting the `href` attribute, which will make the component render an `<a>` under the hood. This gives you all the default link behavior the browser provides (e.g. [[CMD/CTRL/SHIFT]] + [[CLICK]]) and exposes the `target` and `download` attributes.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-button href="https://example.com/">Link</wa-button>
|
|
||||||
<wa-button href="https://example.com/" target="_blank">New Window</wa-button>
|
|
||||||
<wa-button href="/assets/images/logo.svg" download="shoelace.svg">Download</wa-button>
|
|
||||||
<wa-button href="https://example.com/" disabled>Disabled</wa-button>
|
|
||||||
```
|
|
||||||
|
|
||||||
:::info
|
|
||||||
When a `target` is set, the link will receive `rel="noreferrer noopener"` for [security reasons](https://mathiasbynens.github.io/rel-noopener/).
|
|
||||||
:::
|
|
||||||
|
|
||||||
### Setting a Custom Width
|
|
||||||
|
|
||||||
As expected, buttons can be given a custom width by setting the `width` attribute. This is useful for making buttons span the full width of their container on smaller screens.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-button size="small" style="width: 100%; margin-bottom: 1rem;">Small</wa-button>
|
|
||||||
<wa-button size="medium" style="width: 100%; margin-bottom: 1rem;">Medium</wa-button>
|
|
||||||
<wa-button size="large" style="width: 100%;">Large</wa-button>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Prefix and Suffix Icons
|
|
||||||
|
|
||||||
Use the `prefix` and `suffix` slots to add icons.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-button size="small">
|
|
||||||
<wa-icon slot="prefix" name="gear" variant="solid"></wa-icon>
|
|
||||||
Settings
|
|
||||||
</wa-button>
|
|
||||||
|
|
||||||
<wa-button size="small">
|
|
||||||
<wa-icon slot="suffix" name="undo" variant="solid"></wa-icon>
|
|
||||||
Refresh
|
|
||||||
</wa-button>
|
|
||||||
|
|
||||||
<wa-button size="small">
|
|
||||||
<wa-icon slot="prefix" name="link" variant="solid"></wa-icon>
|
|
||||||
<wa-icon slot="suffix" name="arrow-up-right-from-square" variant="solid"></wa-icon>
|
|
||||||
Open
|
|
||||||
</wa-button>
|
|
||||||
|
|
||||||
<br /><br />
|
|
||||||
|
|
||||||
<wa-button>
|
|
||||||
<wa-icon slot="prefix" name="gear" variant="solid"></wa-icon>
|
|
||||||
Settings
|
|
||||||
</wa-button>
|
|
||||||
|
|
||||||
<wa-button>
|
|
||||||
<wa-icon slot="suffix" name="undo" variant="solid"></wa-icon>
|
|
||||||
Refresh
|
|
||||||
</wa-button>
|
|
||||||
|
|
||||||
<wa-button>
|
|
||||||
<wa-icon slot="prefix" name="link" variant="solid"></wa-icon>
|
|
||||||
<wa-icon slot="suffix" name="arrow-up-right-from-square" variant="solid"></wa-icon>
|
|
||||||
Open
|
|
||||||
</wa-button>
|
|
||||||
|
|
||||||
<br /><br />
|
|
||||||
|
|
||||||
<wa-button size="large">
|
|
||||||
<wa-icon slot="prefix" name="gear" variant="solid"></wa-icon>
|
|
||||||
Settings
|
|
||||||
</wa-button>
|
|
||||||
|
|
||||||
<wa-button size="large">
|
|
||||||
<wa-icon slot="suffix" name="undo" variant="solid"></wa-icon>
|
|
||||||
Refresh
|
|
||||||
</wa-button>
|
|
||||||
|
|
||||||
<wa-button size="large">
|
|
||||||
<wa-icon slot="prefix" name="link" variant="solid"></wa-icon>
|
|
||||||
<wa-icon slot="suffix" name="arrow-up-right-from-square" variant="solid"></wa-icon>
|
|
||||||
Open
|
|
||||||
</wa-button>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Caret
|
|
||||||
|
|
||||||
Use the `caret` attribute to add a dropdown indicator when a button will trigger a dropdown, menu, or popover.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-button size="small" caret>Small</wa-button>
|
|
||||||
<wa-button size="medium" caret>Medium</wa-button>
|
|
||||||
<wa-button size="large" caret>Large</wa-button>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Loading
|
|
||||||
|
|
||||||
Use the `loading` attribute to make a button busy. The width will remain the same as before, preventing adjacent elements from moving around.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-button variant="brand" loading>Brand</wa-button>
|
|
||||||
<wa-button variant="success" loading>Success</wa-button>
|
|
||||||
<wa-button variant="neutral" loading>Neutral</wa-button>
|
|
||||||
<wa-button variant="warning" loading>Warning</wa-button>
|
|
||||||
<wa-button variant="danger" loading>Danger</wa-button>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Disabled
|
|
||||||
|
|
||||||
Use the `disabled` attribute to disable a button.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-button variant="brand" disabled>Brand</wa-button>
|
|
||||||
<wa-button variant="success" disabled>Success</wa-button>
|
|
||||||
<wa-button variant="neutral" disabled>Neutral</wa-button>
|
|
||||||
<wa-button variant="warning" disabled>Warning</wa-button>
|
|
||||||
<wa-button variant="danger" disabled>Danger</wa-button>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Styling Buttons
|
|
||||||
|
|
||||||
This example demonstrates how to style buttons using a custom class. This is the recommended approach if you need to add additional variations. To customize an existing variation, modify the selector to target the button's `variant` attribute instead of a class (e.g. `wa-button[variant="brand"]`).
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-button class="pink">Pink Button</wa-button>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
wa-button.pink::part(base) {
|
|
||||||
border-radius: 6px;
|
|
||||||
border: solid 2px;
|
|
||||||
background: #ff1493;
|
|
||||||
border-top-color: #ff7ac1;
|
|
||||||
border-left-color: #ff7ac1;
|
|
||||||
border-bottom-color: #ad005c;
|
|
||||||
border-right-color: #ad005c;
|
|
||||||
color: white;
|
|
||||||
font-size: 1.125rem;
|
|
||||||
box-shadow: 0 2px 10px #0002;
|
|
||||||
transition: var(--wa-transition-normal) all;
|
|
||||||
}
|
|
||||||
|
|
||||||
wa-button.pink::part(base):hover {
|
|
||||||
transform: scale(1.05);
|
|
||||||
}
|
|
||||||
|
|
||||||
wa-button.pink::part(base):active {
|
|
||||||
border-top-color: #ad005c;
|
|
||||||
border-right-color: #ff7ac1;
|
|
||||||
border-bottom-color: #ff7ac1;
|
|
||||||
border-left-color: #ad005c;
|
|
||||||
transform: translateY(1px);
|
|
||||||
}
|
|
||||||
|
|
||||||
wa-button.pink::part(base):focus-visible {
|
|
||||||
outline: dashed 2px deeppink;
|
|
||||||
outline-offset: 4px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
```
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
---
|
|
||||||
title: Callout
|
|
||||||
description: Callouts are used to display important messages inline.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-callout>
|
|
||||||
<wa-icon slot="icon" name="circle-info" variant="regular"></wa-icon>
|
|
||||||
This is a standard callout. You can customize its content and even the icon.
|
|
||||||
</wa-callout>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Variants
|
|
||||||
|
|
||||||
Set the `variant` attribute to change the callout's variant.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-callout variant="brand">
|
|
||||||
<wa-icon slot="icon" name="circle-info" variant="regular"></wa-icon>
|
|
||||||
<strong>This is super informative</strong><br />
|
|
||||||
You can tell by how pretty the callout is.
|
|
||||||
</wa-callout>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<wa-callout variant="success">
|
|
||||||
<wa-icon slot="icon" name="circle-check" variant="regular"></wa-icon>
|
|
||||||
<strong>Your changes have been saved</strong><br />
|
|
||||||
You can safely exit the app now.
|
|
||||||
</wa-callout>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<wa-callout variant="neutral">
|
|
||||||
<wa-icon slot="icon" name="gear" variant="regular"></wa-icon>
|
|
||||||
<strong>Your settings have been updated</strong><br />
|
|
||||||
Settings will take effect on next login.
|
|
||||||
</wa-callout>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<wa-callout variant="warning">
|
|
||||||
<wa-icon slot="icon" name="triangle-exclamation" variant="regular"></wa-icon>
|
|
||||||
<strong>Your session has ended</strong><br />
|
|
||||||
Please login again to continue.
|
|
||||||
</wa-callout>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<wa-callout variant="danger">
|
|
||||||
<wa-icon slot="icon" name="circle-exclamation" variant="regular"></wa-icon>
|
|
||||||
<strong>Your account has been deleted</strong><br />
|
|
||||||
We're very sorry to see you go!
|
|
||||||
</wa-callout>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Without Icons
|
|
||||||
|
|
||||||
Icons are optional. Simply omit the `icon` slot if you don't want them.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-callout variant="brand"> Nothing fancy here, just a simple callout. </wa-callout>
|
|
||||||
```
|
|
||||||
@@ -1,141 +0,0 @@
|
|||||||
---
|
|
||||||
title: Card
|
|
||||||
description: Cards can be used to group related subjects in a container.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-card with-image with-footer class="card-overview">
|
|
||||||
<img
|
|
||||||
slot="image"
|
|
||||||
src="https://images.unsplash.com/photo-1559209172-0ff8f6d49ff7?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=80"
|
|
||||||
alt="A kitten sits patiently between a terracotta pot and decorative grasses."
|
|
||||||
/>
|
|
||||||
|
|
||||||
<strong>Mittens</strong><br />
|
|
||||||
This kitten is as cute as he is playful. Bring him home today!<br />
|
|
||||||
<small>6 weeks old</small>
|
|
||||||
|
|
||||||
<div slot="footer">
|
|
||||||
<wa-button variant="brand" pill>More Info</wa-button>
|
|
||||||
<wa-rating></wa-rating>
|
|
||||||
</div>
|
|
||||||
</wa-card>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.card-overview {
|
|
||||||
max-width: 300px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-overview small {
|
|
||||||
color: var(--wa-color-text-quiet);
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-overview [slot='footer'] {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Basic Card
|
|
||||||
|
|
||||||
Basic cards aren't very exciting, but they can display any content you want them to.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-card class="card-basic">
|
|
||||||
This is just a basic card. No image, no header, and no footer. Just your content.
|
|
||||||
</wa-card>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.card-basic {
|
|
||||||
max-width: 300px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Card with Header
|
|
||||||
|
|
||||||
Headers can be used to display titles and more. Use the `with-header` attribute to add a header to the card.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-card with-header class="card-header">
|
|
||||||
<div slot="header">
|
|
||||||
Header Title
|
|
||||||
<wa-icon-button name="gear" variant="solid" label="Settings"></wa-icon-button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
This card has a header. You can put all sorts of things in it!
|
|
||||||
</wa-card>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.card-header {
|
|
||||||
max-width: 300px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-header [slot='header'] {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-header h3 {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-header wa-icon-button {
|
|
||||||
font-size: var(--wa-font-size-m);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Card with Footer
|
|
||||||
|
|
||||||
Footers can be used to display actions, summaries, or other relevant content. Use the `with-footer` attribute to add a footer to the card.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-card with-footer class="card-footer">
|
|
||||||
This card has a footer. You can put all sorts of things in it!
|
|
||||||
|
|
||||||
<div slot="footer">
|
|
||||||
<wa-rating></wa-rating>
|
|
||||||
<wa-button variant="brand">Preview</wa-button>
|
|
||||||
</div>
|
|
||||||
</wa-card>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.card-footer {
|
|
||||||
max-width: 300px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-footer [slot='footer'] {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Images
|
|
||||||
|
|
||||||
Card images are displayed atop the card and will stretch to fit. Use the `with-image` attribute to add an image to the card.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-card with-image class="card-image">
|
|
||||||
<img
|
|
||||||
slot="image"
|
|
||||||
src="https://images.unsplash.com/photo-1547191783-94d5f8f6d8b1?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=400&q=80"
|
|
||||||
alt="A kitten walks towards camera on top of pallet."
|
|
||||||
/>
|
|
||||||
This is a kitten, but not just any kitten. This kitten likes walking along pallets.
|
|
||||||
</wa-card>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.card-image {
|
|
||||||
max-width: 300px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
```
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
---
|
|
||||||
title: Carousel Item
|
|
||||||
description: A carousel item represent a slide within a carousel.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-carousel pagination>
|
|
||||||
<wa-carousel-item>
|
|
||||||
<img
|
|
||||||
alt="The sun shines on the mountains and trees - Photo by Adam Kool on Unsplash"
|
|
||||||
src="/assets/examples/carousel/mountains.jpg"
|
|
||||||
/>
|
|
||||||
</wa-carousel-item>
|
|
||||||
<wa-carousel-item>
|
|
||||||
<img
|
|
||||||
alt="A waterfall in the middle of a forest - Photo by Thomas Kelly on Unsplash"
|
|
||||||
src="/assets/examples/carousel/waterfall.jpg"
|
|
||||||
/>
|
|
||||||
</wa-carousel-item>
|
|
||||||
<wa-carousel-item>
|
|
||||||
<img
|
|
||||||
alt="The sun is setting over a lavender field - Photo by Leonard Cotte on Unsplash"
|
|
||||||
src="/assets/examples/carousel/sunset.jpg"
|
|
||||||
/>
|
|
||||||
</wa-carousel-item>
|
|
||||||
<wa-carousel-item>
|
|
||||||
<img
|
|
||||||
alt="A field of grass with the sun setting in the background - Photo by Sapan Patel on Unsplash"
|
|
||||||
src="/assets/examples/carousel/field.jpg"
|
|
||||||
/>
|
|
||||||
</wa-carousel-item>
|
|
||||||
<wa-carousel-item>
|
|
||||||
<img
|
|
||||||
alt="A scenic view of a mountain with clouds rolling in - Photo by V2osk on Unsplash"
|
|
||||||
src="/assets/examples/carousel/valley.jpg"
|
|
||||||
/>
|
|
||||||
</wa-carousel-item>
|
|
||||||
</wa-carousel>
|
|
||||||
```
|
|
||||||
|
|
||||||
:::info
|
|
||||||
Additional demonstrations can be found in the [carousel examples](/components/carousel).
|
|
||||||
:::
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
---
|
|
||||||
title: Color Picker
|
|
||||||
description: Color pickers allow the user to select a color.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<form>
|
|
||||||
<wa-color-picker required label="Select a color"></wa-color-picker>
|
|
||||||
<wa-button type="submit">Submit</wa-button>
|
|
||||||
</form>
|
|
||||||
```
|
|
||||||
|
|
||||||
:::info
|
|
||||||
This component works with standard `<form>` elements. Please refer to the section on [form controls](/getting-started/form-controls) to learn more about form submission and client-side validation.
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Initial Value
|
|
||||||
|
|
||||||
Use the `value` attribute to set an initial value for the color picker.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-color-picker value="#4a90e2" label="Select a color"></wa-color-picker>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Opacity
|
|
||||||
|
|
||||||
Use the `opacity` attribute to enable the opacity slider. When this is enabled, the value will be displayed as HEXA, RGBA, HSLA, or HSVA based on `format`.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-color-picker value="#f5a623ff" opacity label="Select a color"></wa-color-picker>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Formats
|
|
||||||
|
|
||||||
Set the color picker's format with the `format` attribute. Valid options include `hex`, `rgb`, `hsl`, and `hsv`. Note that the color picker's input will accept any parsable format (including CSS color names) regardless of this option.
|
|
||||||
|
|
||||||
To prevent users from toggling the format themselves, add the `no-format-toggle` attribute.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-color-picker format="hex" value="#4a90e2" label="Select a color"></wa-color-picker>
|
|
||||||
<wa-color-picker format="rgb" value="rgb(80, 227, 194)" label="Select a color"></wa-color-picker>
|
|
||||||
<wa-color-picker format="hsl" value="hsl(290, 87%, 47%)" label="Select a color"></wa-color-picker>
|
|
||||||
<wa-color-picker format="hsv" value="hsv(55, 89%, 97%)" label="Select a color"></wa-color-picker>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Swatches
|
|
||||||
|
|
||||||
Use the `swatches` attribute to add convenient presets to the color picker. Any format the color picker can parse is acceptable (including CSS color names), but each value must be separated by a semicolon (`;`). Alternatively, you can pass an array of color values to this property using JavaScript.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-color-picker
|
|
||||||
label="Select a color"
|
|
||||||
swatches="
|
|
||||||
#d0021b; #f5a623; #f8e71c; #8b572a; #7ed321; #417505; #bd10e0; #9013fe;
|
|
||||||
#4a90e2; #50e3c2; #b8e986; #000; #444; #888; #ccc; #fff;
|
|
||||||
"
|
|
||||||
></wa-color-picker>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Sizes
|
|
||||||
|
|
||||||
Use the `size` attribute to change the color picker's trigger size.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-color-picker size="small" label="Select a color"></wa-color-picker>
|
|
||||||
<wa-color-picker size="medium" label="Select a color"></wa-color-picker>
|
|
||||||
<wa-color-picker size="large" label="Select a color"></wa-color-picker>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Inline
|
|
||||||
|
|
||||||
The color picker can be rendered inline instead of in a dropdown using the `inline` attribute.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-color-picker inline label="Select a color"></wa-color-picker>
|
|
||||||
```
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
---
|
|
||||||
title: Details
|
|
||||||
description: Details show a brief summary and expand to show additional content.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
<!-- cspell:dictionaries lorem-ipsum -->
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-details summary="Toggle Me">
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
|
||||||
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
|
||||||
</wa-details>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Disabled
|
|
||||||
|
|
||||||
Use the `disable` attribute to prevent the details from expanding.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-details summary="Disabled" disabled>
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
|
||||||
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
|
||||||
</wa-details>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Customizing the Summary Icon
|
|
||||||
|
|
||||||
Use the `expand-icon` and `collapse-icon` slots to change the expand and collapse icons, respectively. To disable the animation, override the `rotate` property on the `summary-icon` part as shown below.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-details summary="Toggle Me" class="custom-icons">
|
|
||||||
<wa-icon name="square-plus" slot="expand-icon" variant="regular"></wa-icon>
|
|
||||||
<wa-icon name="square-minus" slot="collapse-icon" variant="regular"></wa-icon>
|
|
||||||
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
|
||||||
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
|
||||||
</wa-details>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
wa-details.custom-icons::part(summary-icon) {
|
|
||||||
/* Disable the expand/collapse animation */
|
|
||||||
rotate: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Grouping Details
|
|
||||||
|
|
||||||
Details are designed to function independently, but you can simulate a group or "accordion" where only one is shown at a time by listening for the `wa-show` event.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<div class="details-group-example">
|
|
||||||
<wa-details summary="First" open>
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
|
||||||
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
|
||||||
</wa-details>
|
|
||||||
|
|
||||||
<wa-details summary="Second">
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
|
||||||
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
|
||||||
</wa-details>
|
|
||||||
|
|
||||||
<wa-details summary="Third">
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
|
||||||
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
|
||||||
</wa-details>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
const container = document.querySelector('.details-group-example');
|
|
||||||
|
|
||||||
// Close all other details when one is shown
|
|
||||||
container.addEventListener('wa-show', event => {
|
|
||||||
if (event.target.localName === 'wa-details') {
|
|
||||||
[...container.querySelectorAll('wa-details')].map(details => (details.open = event.target === details));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.details-group-example wa-details:not(:last-of-type) {
|
|
||||||
margin-bottom: var(--wa-space-2xs);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
```
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
---
|
|
||||||
title: Divider
|
|
||||||
description: Dividers are used to visually separate or group elements.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-divider></wa-divider>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Width
|
|
||||||
|
|
||||||
Use the `--width` custom property to change the width of the divider.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-divider style="--width: 4px;"></wa-divider>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Color
|
|
||||||
|
|
||||||
Use the `--color` custom property to change the color of the divider.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-divider style="--color: tomato;"></wa-divider>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Spacing
|
|
||||||
|
|
||||||
Use the `--spacing` custom property to change the amount of space between the divider and it's neighboring elements.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<div style="text-align: center;">
|
|
||||||
Above
|
|
||||||
<wa-divider style="--spacing: 2rem;"></wa-divider>
|
|
||||||
Below
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Vertical
|
|
||||||
|
|
||||||
Add the `vertical` attribute to draw the divider in a vertical orientation. The divider will span the full height of its container. Vertical dividers work especially well inside of a flex container.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<div style="display: flex; align-items: center; height: 2rem;">
|
|
||||||
First
|
|
||||||
<wa-divider vertical></wa-divider>
|
|
||||||
Middle
|
|
||||||
<wa-divider vertical></wa-divider>
|
|
||||||
Last
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Menu Dividers
|
|
||||||
|
|
||||||
Use dividers in [menus](/components/menu) to visually group menu items.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-menu style="max-width: 200px;">
|
|
||||||
<wa-menu-item value="1">Option 1</wa-menu-item>
|
|
||||||
<wa-menu-item value="2">Option 2</wa-menu-item>
|
|
||||||
<wa-menu-item value="3">Option 3</wa-menu-item>
|
|
||||||
<wa-divider></wa-divider>
|
|
||||||
<wa-menu-item value="4">Option 4</wa-menu-item>
|
|
||||||
<wa-menu-item value="5">Option 5</wa-menu-item>
|
|
||||||
<wa-menu-item value="6">Option 6</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
```
|
|
||||||
@@ -1,216 +0,0 @@
|
|||||||
---
|
|
||||||
title: Dropdown
|
|
||||||
description: 'Dropdowns expose additional content that "drops down" in a panel.'
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
Dropdowns consist of a trigger and a panel. By default, activating the trigger will expose the panel and interacting outside of the panel will close it.
|
|
||||||
|
|
||||||
Dropdowns are designed to work well with [menus](/components/menu) to provide a list of options the user can select from. However, dropdowns can also be used in lower-level applications (e.g. [color picker](/components/color-picker)). The API gives you complete control over showing, hiding, and positioning the panel.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-dropdown>
|
|
||||||
<wa-button slot="trigger" caret>Dropdown</wa-button>
|
|
||||||
<wa-menu>
|
|
||||||
<wa-menu-item>Dropdown Item 1</wa-menu-item>
|
|
||||||
<wa-menu-item>Dropdown Item 2</wa-menu-item>
|
|
||||||
<wa-menu-item>Dropdown Item 3</wa-menu-item>
|
|
||||||
<wa-divider></wa-divider>
|
|
||||||
<wa-menu-item type="checkbox" checked>Checkbox</wa-menu-item>
|
|
||||||
<wa-menu-item disabled>Disabled</wa-menu-item>
|
|
||||||
<wa-divider></wa-divider>
|
|
||||||
<wa-menu-item>
|
|
||||||
Prefix
|
|
||||||
<wa-icon slot="prefix" name="gift" variant="solid"></wa-icon>
|
|
||||||
</wa-menu-item>
|
|
||||||
<wa-menu-item>
|
|
||||||
Suffix Icon
|
|
||||||
<wa-icon slot="suffix" name="heart" variant="solid"></wa-icon>
|
|
||||||
</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
</wa-dropdown>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Getting the Selected Item
|
|
||||||
|
|
||||||
When dropdowns are used with [menus](/components/menu), you can listen for the [`wa-select`](/components/menu#events) event to determine which menu item was selected. The menu item element will be exposed in `event.detail.item`. You can set `value` props to make it easier to identify commands.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<div class="dropdown-selection">
|
|
||||||
<wa-dropdown>
|
|
||||||
<wa-button slot="trigger" caret>Edit</wa-button>
|
|
||||||
<wa-menu>
|
|
||||||
<wa-menu-item value="cut">Cut</wa-menu-item>
|
|
||||||
<wa-menu-item value="copy">Copy</wa-menu-item>
|
|
||||||
<wa-menu-item value="paste">Paste</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
</wa-dropdown>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
const container = document.querySelector('.dropdown-selection');
|
|
||||||
const dropdown = container.querySelector('wa-dropdown');
|
|
||||||
|
|
||||||
dropdown.addEventListener('wa-select', event => {
|
|
||||||
const selectedItem = event.detail.item;
|
|
||||||
console.log(selectedItem.value);
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
```
|
|
||||||
|
|
||||||
Alternatively, you can listen for the `click` event on individual menu items. Note that, using this approach, disabled menu items will still emit a `click` event.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<div class="dropdown-selection-alt">
|
|
||||||
<wa-dropdown>
|
|
||||||
<wa-button slot="trigger" caret>Edit</wa-button>
|
|
||||||
<wa-menu>
|
|
||||||
<wa-menu-item value="cut">Cut</wa-menu-item>
|
|
||||||
<wa-menu-item value="copy">Copy</wa-menu-item>
|
|
||||||
<wa-menu-item value="paste">Paste</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
</wa-dropdown>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
const container = document.querySelector('.dropdown-selection-alt');
|
|
||||||
const cut = container.querySelector('wa-menu-item[value="cut"]');
|
|
||||||
const copy = container.querySelector('wa-menu-item[value="copy"]');
|
|
||||||
const paste = container.querySelector('wa-menu-item[value="paste"]');
|
|
||||||
|
|
||||||
cut.addEventListener('click', () => console.log('cut'));
|
|
||||||
copy.addEventListener('click', () => console.log('copy'));
|
|
||||||
paste.addEventListener('click', () => console.log('paste'));
|
|
||||||
</script>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Placement
|
|
||||||
|
|
||||||
The preferred placement of the dropdown can be set with the `placement` attribute. Note that the actual position may vary to ensure the panel remains in the viewport.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-dropdown placement="top-start">
|
|
||||||
<wa-button slot="trigger" caret>Edit</wa-button>
|
|
||||||
<wa-menu>
|
|
||||||
<wa-menu-item>Cut</wa-menu-item>
|
|
||||||
<wa-menu-item>Copy</wa-menu-item>
|
|
||||||
<wa-menu-item>Paste</wa-menu-item>
|
|
||||||
<wa-divider></wa-divider>
|
|
||||||
<wa-menu-item>Find</wa-menu-item>
|
|
||||||
<wa-menu-item>Replace</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
</wa-dropdown>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Distance
|
|
||||||
|
|
||||||
The distance from the panel to the trigger can be customized using the `distance` attribute. This value is specified in pixels.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-dropdown distance="30">
|
|
||||||
<wa-button slot="trigger" caret>Edit</wa-button>
|
|
||||||
<wa-menu>
|
|
||||||
<wa-menu-item>Cut</wa-menu-item>
|
|
||||||
<wa-menu-item>Copy</wa-menu-item>
|
|
||||||
<wa-menu-item>Paste</wa-menu-item>
|
|
||||||
<wa-divider></wa-divider>
|
|
||||||
<wa-menu-item>Find</wa-menu-item>
|
|
||||||
<wa-menu-item>Replace</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
</wa-dropdown>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Skidding
|
|
||||||
|
|
||||||
The offset of the panel along the trigger can be customized using the `skidding` attribute. This value is specified in pixels.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-dropdown skidding="30">
|
|
||||||
<wa-button slot="trigger" caret>Edit</wa-button>
|
|
||||||
<wa-menu>
|
|
||||||
<wa-menu-item>Cut</wa-menu-item>
|
|
||||||
<wa-menu-item>Copy</wa-menu-item>
|
|
||||||
<wa-menu-item>Paste</wa-menu-item>
|
|
||||||
<wa-divider></wa-divider>
|
|
||||||
<wa-menu-item>Find</wa-menu-item>
|
|
||||||
<wa-menu-item>Replace</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
</wa-dropdown>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Submenus
|
|
||||||
|
|
||||||
To create a submenu, nest an `<wa-menu slot="submenu">` element in a [menu item](/components/menu-item).
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-dropdown>
|
|
||||||
<wa-button slot="trigger" caret>Edit</wa-button>
|
|
||||||
|
|
||||||
<wa-menu style="max-width: 200px;">
|
|
||||||
<wa-menu-item value="undo">Undo</wa-menu-item>
|
|
||||||
<wa-menu-item value="redo">Redo</wa-menu-item>
|
|
||||||
<wa-divider></wa-divider>
|
|
||||||
<wa-menu-item value="cut">Cut</wa-menu-item>
|
|
||||||
<wa-menu-item value="copy">Copy</wa-menu-item>
|
|
||||||
<wa-menu-item value="paste">Paste</wa-menu-item>
|
|
||||||
<wa-divider></wa-divider>
|
|
||||||
<wa-menu-item>
|
|
||||||
Find
|
|
||||||
<wa-menu slot="submenu">
|
|
||||||
<wa-menu-item value="find">Find…</wa-menu-item>
|
|
||||||
<wa-menu-item value="find-previous">Find Next</wa-menu-item>
|
|
||||||
<wa-menu-item value="find-next">Find Previous</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
</wa-menu-item>
|
|
||||||
<wa-menu-item>
|
|
||||||
Transformations
|
|
||||||
<wa-menu slot="submenu">
|
|
||||||
<wa-menu-item value="uppercase">Make uppercase</wa-menu-item>
|
|
||||||
<wa-menu-item value="lowercase">Make lowercase</wa-menu-item>
|
|
||||||
<wa-menu-item value="capitalize">Capitalize</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
</wa-dropdown>
|
|
||||||
```
|
|
||||||
|
|
||||||
:::warning
|
|
||||||
As a UX best practice, avoid using more than one level of submenu when possible.
|
|
||||||
:::
|
|
||||||
|
|
||||||
### Hoisting
|
|
||||||
|
|
||||||
Dropdown panels will be clipped if they're inside a container that has `overflow: auto|hidden`. The `hoist` attribute forces the panel to use a fixed positioning strategy, allowing it to break out of the container. In this case, the panel will be positioned relative to its [containing block](https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#Identifying_the_containing_block), which is usually the viewport unless an ancestor uses a `transform`, `perspective`, or `filter`. [Refer to this page](https://developer.mozilla.org/en-US/docs/Web/CSS/position#fixed) for more details.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<div class="dropdown-hoist">
|
|
||||||
<wa-dropdown>
|
|
||||||
<wa-button slot="trigger" caret>No Hoist</wa-button>
|
|
||||||
<wa-menu>
|
|
||||||
<wa-menu-item>Item 1</wa-menu-item>
|
|
||||||
<wa-menu-item>Item 2</wa-menu-item>
|
|
||||||
<wa-menu-item>Item 3</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
</wa-dropdown>
|
|
||||||
|
|
||||||
<wa-dropdown hoist>
|
|
||||||
<wa-button slot="trigger" caret>Hoist</wa-button>
|
|
||||||
<wa-menu>
|
|
||||||
<wa-menu-item>Item 1</wa-menu-item>
|
|
||||||
<wa-menu-item>Item 2</wa-menu-item>
|
|
||||||
<wa-menu-item>Item 3</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
</wa-dropdown>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.dropdown-hoist {
|
|
||||||
position: relative;
|
|
||||||
border: solid 2px var(--wa-color-surface-border);
|
|
||||||
padding: var(--wa-space-m);
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
```
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
---
|
|
||||||
title: Icon Button
|
|
||||||
description: Icons buttons are simple, icon-only buttons that can be used for actions and in toolbars.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
For a full list of icons that come bundled with Web Awesome, refer to the [icon component](/components/icon).
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-icon-button name="gear" label="Settings"></wa-icon-button>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Sizes
|
|
||||||
|
|
||||||
Icon buttons inherit their parent element's `font-size`.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-icon-button name="pen-to-square" variant="solid" label="Edit" style="font-size: 1.5rem;"></wa-icon-button>
|
|
||||||
<wa-icon-button name="pen-to-square" variant="solid" label="Edit" style="font-size: 2rem;"></wa-icon-button>
|
|
||||||
<wa-icon-button name="pen-to-square" variant="solid" label="Edit" style="font-size: 2.5rem;"></wa-icon-button>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Colors
|
|
||||||
|
|
||||||
Icon buttons are designed to have a uniform appearance, so their color is not inherited. However, you can still customize them by styling the `base` part.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<div class="icon-button-color">
|
|
||||||
<wa-icon-button name="bold" variant="solid" label="Bold"></wa-icon-button>
|
|
||||||
<wa-icon-button name="italic" variant="solid" label="Italic"></wa-icon-button>
|
|
||||||
<wa-icon-button name="underline" variant="solid" label="Underline"></wa-icon-button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.icon-button-color wa-icon-button::part(base) {
|
|
||||||
color: #b00091;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon-button-color wa-icon-button::part(base):hover,
|
|
||||||
.icon-button-color wa-icon-button::part(base):focus {
|
|
||||||
color: #c913aa;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon-button-color wa-icon-button::part(base):active {
|
|
||||||
color: #960077;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Link Buttons
|
|
||||||
|
|
||||||
Use the `href` attribute to convert the button to a link.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-icon-button name="gear" variant="solid" label="Settings" href="https://example.com" target="_blank"></wa-icon-button>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Icon Button with Tooltip
|
|
||||||
|
|
||||||
Wrap a tooltip around an icon button to provide contextual information to the user.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-icon-button id="icon-button" name="gear" variant="solid" label="Settings"></wa-icon-button>
|
|
||||||
<wa-tooltip for="icon-button">Settings</wa-tooltip>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Disabled
|
|
||||||
|
|
||||||
Use the `disabled` attribute to disable the icon button.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-icon-button name="gear" variant="solid" label="Settings" disabled></wa-icon-button>
|
|
||||||
```
|
|
||||||
@@ -1,123 +0,0 @@
|
|||||||
---
|
|
||||||
title: Menu Item
|
|
||||||
description: Menu items provide options for the user to pick from in a menu.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-menu style="max-width: 200px;">
|
|
||||||
<wa-menu-item>Option 1</wa-menu-item>
|
|
||||||
<wa-menu-item>Option 2</wa-menu-item>
|
|
||||||
<wa-menu-item>Option 3</wa-menu-item>
|
|
||||||
<wa-divider></wa-divider>
|
|
||||||
<wa-menu-item type="checkbox" checked>Checkbox</wa-menu-item>
|
|
||||||
<wa-menu-item disabled>Disabled</wa-menu-item>
|
|
||||||
<wa-divider></wa-divider>
|
|
||||||
<wa-menu-item>
|
|
||||||
Prefix Icon
|
|
||||||
<wa-icon slot="prefix" name="gift" variant="solid"></wa-icon>
|
|
||||||
</wa-menu-item>
|
|
||||||
<wa-menu-item>
|
|
||||||
Suffix Icon
|
|
||||||
<wa-icon slot="suffix" name="heart" variant="solid"></wa-icon>
|
|
||||||
</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Prefix & Suffix
|
|
||||||
|
|
||||||
Add content to the start and end of menu items using the `prefix` and `suffix` slots.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-menu style="max-width: 200px;">
|
|
||||||
<wa-menu-item>
|
|
||||||
<wa-icon slot="prefix" name="house" variant="solid"></wa-icon>
|
|
||||||
Home
|
|
||||||
</wa-menu-item>
|
|
||||||
|
|
||||||
<wa-menu-item>
|
|
||||||
<wa-icon slot="prefix" name="envelope" variant="solid"></wa-icon>
|
|
||||||
Messages
|
|
||||||
<wa-badge slot="suffix" variant="brand" pill>12</wa-badge>
|
|
||||||
</wa-menu-item>
|
|
||||||
|
|
||||||
<wa-divider></wa-divider>
|
|
||||||
|
|
||||||
<wa-menu-item>
|
|
||||||
<wa-icon slot="prefix" name="gear" variant="solid"></wa-icon>
|
|
||||||
Settings
|
|
||||||
</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Disabled
|
|
||||||
|
|
||||||
Add the `disabled` attribute to disable the menu item so it cannot be selected.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-menu style="max-width: 200px;">
|
|
||||||
<wa-menu-item>Option 1</wa-menu-item>
|
|
||||||
<wa-menu-item disabled>Option 2</wa-menu-item>
|
|
||||||
<wa-menu-item>Option 3</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Loading
|
|
||||||
|
|
||||||
Use the `loading` attribute to indicate that a menu item is busy. Like a disabled menu item, clicks will be suppressed until the loading state is removed.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-menu style="max-width: 200px;">
|
|
||||||
<wa-menu-item>Option 1</wa-menu-item>
|
|
||||||
<wa-menu-item loading>Option 2</wa-menu-item>
|
|
||||||
<wa-menu-item>Option 3</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Checkbox Menu Items
|
|
||||||
|
|
||||||
Set the `type` attribute to `checkbox` to create a menu item that will toggle on and off when selected. You can use the `checked` attribute to set the initial state.
|
|
||||||
|
|
||||||
Checkbox menu items are visually indistinguishable from regular menu items. Their ability to be toggled is primarily inferred from context, much like you'd find in the menu of a native app.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-menu style="max-width: 200px;">
|
|
||||||
<wa-menu-item type="checkbox">Autosave</wa-menu-item>
|
|
||||||
<wa-menu-item type="checkbox" checked>Check Spelling</wa-menu-item>
|
|
||||||
<wa-menu-item type="checkbox">Word Wrap</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Value & Selection
|
|
||||||
|
|
||||||
The `value` attribute can be used to assign a hidden value, such as a unique identifier, to a menu item. When an item is selected, the `wa-select` event will be emitted and a reference to the item will be available at `event.detail.item`. You can use this reference to access the selected item's value, its checked state, and more.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-menu class="menu-value" style="max-width: 200px;">
|
|
||||||
<wa-menu-item value="opt-1">Option 1</wa-menu-item>
|
|
||||||
<wa-menu-item value="opt-2">Option 2</wa-menu-item>
|
|
||||||
<wa-menu-item value="opt-3">Option 3</wa-menu-item>
|
|
||||||
<wa-divider></wa-divider>
|
|
||||||
<wa-menu-item type="checkbox" value="opt-4">Checkbox 4</wa-menu-item>
|
|
||||||
<wa-menu-item type="checkbox" value="opt-5">Checkbox 5</wa-menu-item>
|
|
||||||
<wa-menu-item type="checkbox" value="opt-6">Checkbox 6</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
const menu = document.querySelector('.menu-value');
|
|
||||||
|
|
||||||
menu.addEventListener('wa-select', event => {
|
|
||||||
const item = event.detail.item;
|
|
||||||
|
|
||||||
// Log value
|
|
||||||
if (item.type === 'checkbox') {
|
|
||||||
console.log(`Selected value: ${item.value} (${item.checked ? 'checked' : 'unchecked'})`);
|
|
||||||
} else {
|
|
||||||
console.log(`Selected value: ${item.value}`);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
```
|
|
||||||
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
---
|
|
||||||
title: Menu Label
|
|
||||||
description: Menu labels are used to describe a group of menu items.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-menu style="max-width: 200px;">
|
|
||||||
<wa-menu-label>Fruits</wa-menu-label>
|
|
||||||
<wa-menu-item value="apple">Apple</wa-menu-item>
|
|
||||||
<wa-menu-item value="banana">Banana</wa-menu-item>
|
|
||||||
<wa-menu-item value="orange">Orange</wa-menu-item>
|
|
||||||
<wa-divider></wa-divider>
|
|
||||||
<wa-menu-label>Vegetables</wa-menu-label>
|
|
||||||
<wa-menu-item value="broccoli">Broccoli</wa-menu-item>
|
|
||||||
<wa-menu-item value="carrot">Carrot</wa-menu-item>
|
|
||||||
<wa-menu-item value="zucchini">Zucchini</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
```
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
---
|
|
||||||
title: Menu
|
|
||||||
description: Menus provide a list of options for the user to choose from.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
You can use [menu items](/components/menu-item), [menu labels](/components/menu-label), and [dividers](/components/divider) to compose a menu. Menus support keyboard interactions, including type-to-select an option.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-menu style="max-width: 200px;">
|
|
||||||
<wa-menu-item value="undo">Undo</wa-menu-item>
|
|
||||||
<wa-menu-item value="redo">Redo</wa-menu-item>
|
|
||||||
<wa-divider></wa-divider>
|
|
||||||
<wa-menu-item value="cut">Cut</wa-menu-item>
|
|
||||||
<wa-menu-item value="copy">Copy</wa-menu-item>
|
|
||||||
<wa-menu-item value="paste">Paste</wa-menu-item>
|
|
||||||
<wa-menu-item value="delete">Delete</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
```
|
|
||||||
|
|
||||||
:::info
|
|
||||||
Menus are intended for system menus (dropdown menus, select menus, context menus, etc.). They should not be mistaken for navigation menus which serve a different purpose and have a different semantic meaning. If you're building navigation, use `<nav>` and `<a>` elements instead.
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### In Dropdowns
|
|
||||||
|
|
||||||
Menus work really well when used inside [dropdowns](/components/dropdown).
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-dropdown>
|
|
||||||
<wa-button slot="trigger" caret>Edit</wa-button>
|
|
||||||
<wa-menu>
|
|
||||||
<wa-menu-item value="cut">Cut</wa-menu-item>
|
|
||||||
<wa-menu-item value="copy">Copy</wa-menu-item>
|
|
||||||
<wa-menu-item value="paste">Paste</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
</wa-dropdown>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Submenus
|
|
||||||
|
|
||||||
To create a submenu, nest an `<wa-menu slot="submenu">` in any [menu item](/components/menu-item).
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-menu style="max-width: 200px;">
|
|
||||||
<wa-menu-item value="undo">Undo</wa-menu-item>
|
|
||||||
<wa-menu-item value="redo">Redo</wa-menu-item>
|
|
||||||
<wa-divider></wa-divider>
|
|
||||||
<wa-menu-item value="cut">Cut</wa-menu-item>
|
|
||||||
<wa-menu-item value="copy">Copy</wa-menu-item>
|
|
||||||
<wa-menu-item value="paste">Paste</wa-menu-item>
|
|
||||||
<wa-divider></wa-divider>
|
|
||||||
<wa-menu-item>
|
|
||||||
Find
|
|
||||||
<wa-menu slot="submenu">
|
|
||||||
<wa-menu-item value="find">Find…</wa-menu-item>
|
|
||||||
<wa-menu-item value="find-previous">Find Next</wa-menu-item>
|
|
||||||
<wa-menu-item value="find-next">Find Previous</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
</wa-menu-item>
|
|
||||||
<wa-menu-item>
|
|
||||||
Transformations
|
|
||||||
<wa-menu slot="submenu">
|
|
||||||
<wa-menu-item value="uppercase">Make uppercase</wa-menu-item>
|
|
||||||
<wa-menu-item value="lowercase">Make lowercase</wa-menu-item>
|
|
||||||
<wa-menu-item value="capitalize">Capitalize</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
</wa-menu-item>
|
|
||||||
</wa-menu>
|
|
||||||
```
|
|
||||||
|
|
||||||
:::warning
|
|
||||||
As a UX best practice, avoid using more than one level of submenus when possible.
|
|
||||||
:::
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
---
|
|
||||||
title: Option
|
|
||||||
description: Options define the selectable items within various form controls such as select.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-select label="Select one">
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2">Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Disabled
|
|
||||||
|
|
||||||
Use the `disabled` attribute to disable an option and prevent it from being selected.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-select label="Select one">
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2" disabled>Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Prefix & Suffix
|
|
||||||
|
|
||||||
Add icons to the start and end of menu items using the `prefix` and `suffix` slots.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-select label="Select one">
|
|
||||||
<wa-option value="option-1">
|
|
||||||
<wa-icon slot="prefix" name="envelope" variant="solid"></wa-icon>
|
|
||||||
Email
|
|
||||||
<wa-icon slot="suffix" name="circle-check" variant="solid"></wa-icon>
|
|
||||||
</wa-option>
|
|
||||||
|
|
||||||
<wa-option value="option-2">
|
|
||||||
<wa-icon slot="prefix" name="phone" variant="solid"></wa-icon>
|
|
||||||
Phone
|
|
||||||
<wa-icon slot="suffix" name="circle-check" variant="solid"></wa-icon>
|
|
||||||
</wa-option>
|
|
||||||
|
|
||||||
<wa-option value="option-3">
|
|
||||||
<wa-icon slot="prefix" name="comment" variant="solid"></wa-icon>
|
|
||||||
Chat
|
|
||||||
<wa-icon slot="suffix" name="circle-check" variant="solid"></wa-icon>
|
|
||||||
</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
```
|
|
||||||
@@ -1,118 +0,0 @@
|
|||||||
---
|
|
||||||
title: Page
|
|
||||||
description: Layouts offer an easy way to scaffold pages using minimal markup.
|
|
||||||
layout: 'component.njk'
|
|
||||||
---
|
|
||||||
|
|
||||||
The layout component is designed to power full webpages. It is flexible enough to handle most modern designs and includes a simple mechanism for handling desktop and mobile navigation.
|
|
||||||
|
|
||||||
A number of sections are available as part of the layout, most of which are optional. Content is added by [slotting elements](/getting-started/usage/#slots) into various locations.
|
|
||||||
|
|
||||||
This component _does not_ implement any [content sectioning](https://developer.mozilla.org/en-US/docs/Web/HTML/Element#content_sectioning) or "semantic elements" internally (such as `<main>`, `<header>`, `<footer>`, etc.). Instead, it is recommended that you slot in content sectioning elements wherever you feel they're appropriate.
|
|
||||||
|
|
||||||
## Layout Anatomy
|
|
||||||
|
|
||||||
This image depicts the layout's anatomy, including the default positions of each section. The labels represent the [named slots](#slots) you can use to populate them.
|
|
||||||
|
|
||||||
Most slots are optional. Slots that have no content will not be shown, allowing you to opt-in to just the sections of the layout you actually need.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
:::info
|
|
||||||
If you're not familiar with how slots work in HTML, you might want to [learn more about slots](/getting-started/usage/#slots) before using this component.
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Sticky Sections
|
|
||||||
|
|
||||||
The following sections of the layout are "sticky" by default, meaning they remain in position as the user scrolls.
|
|
||||||
|
|
||||||
- `banner`
|
|
||||||
- `header`
|
|
||||||
- `sub-header`
|
|
||||||
- `aside`
|
|
||||||
- `menu`
|
|
||||||
|
|
||||||
This is often desirable, but you can change this behavior using the `disable-sticky` attribute. Use a space-delimited list of names to tell the layout which sections should not be sticky.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<wa-page disable-sticky="header aside"> ... </wa-page>
|
|
||||||
```
|
|
||||||
|
|
||||||
## How to Apply Spacing to Your Layout
|
|
||||||
|
|
||||||
The layout component _does not_ apply spacing for you. You can apply the appropriate paddings or margins directly to the elements you slot in to fine tune your spacing needs.
|
|
||||||
|
|
||||||
TODO - add example here
|
|
||||||
|
|
||||||
When using `<wa-page>`, make sure to zero out all paddings and margins on `<html>` and `<body>`, otherwise you may see unexpected gaps. The following styles are highly recommended when using `<wa-page>`.
|
|
||||||
|
|
||||||
```css
|
|
||||||
html,
|
|
||||||
body {
|
|
||||||
min-height: 100%;
|
|
||||||
height: 100%;
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Skip To Content
|
|
||||||
|
|
||||||
The layout provides a "skip to content" link that's visually hidden until the user tabs into it. You don't have to do anything to configure this, unless you want to change the text displayed in the link. In that case, you can slot in your own text using the `skip-to-content` slot.
|
|
||||||
|
|
||||||
This example localizes the "skip to content" link for German users.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<wa-page>
|
|
||||||
...
|
|
||||||
<span slot="skip-to-content">Zum Inhalt springen</span>
|
|
||||||
...
|
|
||||||
</wa-page>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Responsiveness
|
|
||||||
|
|
||||||
The layout component tries not to have too many opinions in terms of responsive behaviors — you get to decide with your own CSS and media queries how your content responds! However, the navigation menu _does_ respond by collapsing on smaller screens. The breakpoint at which this occurs is 768px by default, but you can change it using the `mobile-breakpoint` attribute.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<wa-page mobile-breakpoint="600"> ... </wa-page>
|
|
||||||
```
|
|
||||||
|
|
||||||
You can provide a button to toggle the navigation menu anywhere inside the layout by adding the `data-toggle-nav` attribute. (This _does not_ have to be a Web Awesome button.)
|
|
||||||
|
|
||||||
```html
|
|
||||||
<wa-page mobile-breakpoint="600">
|
|
||||||
...
|
|
||||||
<wa-button data-toggle-nav>Menu</wa-button>
|
|
||||||
...
|
|
||||||
</wa-page>
|
|
||||||
```
|
|
||||||
|
|
||||||
Alternatively, you can apply `nav-state="open"` and `nav-state="closed"` to the layout component to show and hide the navigation, respectively.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<wa-page nav-state="open"> ... </wa-page>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Providing Navigation Items
|
|
||||||
|
|
||||||
- TODO - example with navigation items
|
|
||||||
- TODO - example with`<h2>` and `<a>` as navigation items
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Hero Layout
|
|
||||||
|
|
||||||
- TODO - Sticky header + main + footer
|
|
||||||
|
|
||||||
### Blog Layout
|
|
||||||
|
|
||||||
- TODO - Sticky header + main + aside + footer (blog)
|
|
||||||
|
|
||||||
### App Layout
|
|
||||||
|
|
||||||
- TODO - Menu + main, plus maybe headers and footers in each (app)
|
|
||||||
|
|
||||||
### Docs Layout
|
|
||||||
|
|
||||||
- TODO - Menu + main + aside + footer (docs)
|
|
||||||
@@ -1,149 +0,0 @@
|
|||||||
---
|
|
||||||
title: Radio Button
|
|
||||||
description: Radios buttons allow the user to select a single option from a group using a button-like control.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
Radio buttons are designed to be used with [radio groups](/components/radio-group). When a radio button has focus, the arrow keys can be used to change the selected option just like standard radio controls.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-radio-group label="Select an option" name="a" value="1">
|
|
||||||
<wa-radio-button value="1">Option 1</wa-radio-button>
|
|
||||||
<wa-radio-button value="2">Option 2</wa-radio-button>
|
|
||||||
<wa-radio-button value="3">Option 3</wa-radio-button>
|
|
||||||
</wa-radio-group>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Checked States
|
|
||||||
|
|
||||||
To set the initial value and checked state, use the `value` attribute on the containing radio group.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-radio-group label="Select an option" name="a" value="1">
|
|
||||||
<wa-radio-button value="1">Option 1</wa-radio-button>
|
|
||||||
<wa-radio-button value="2">Option 2</wa-radio-button>
|
|
||||||
<wa-radio-button value="3">Option 3</wa-radio-button>
|
|
||||||
</wa-radio-group>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Disabled
|
|
||||||
|
|
||||||
Use the `disabled` attribute to disable a radio button.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-radio-group label="Select an option" name="a" value="1">
|
|
||||||
<wa-radio-button value="1">Option 1</wa-radio-button>
|
|
||||||
<wa-radio-button value="2" disabled>Option 2</wa-radio-button>
|
|
||||||
<wa-radio-button value="3">Option 3</wa-radio-button>
|
|
||||||
</wa-radio-group>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Sizes
|
|
||||||
|
|
||||||
Use the `size` attribute to change a radio button's size.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-radio-group size="small" label="Select an option" name="a" value="1">
|
|
||||||
<wa-radio-button value="1">Option 1</wa-radio-button>
|
|
||||||
<wa-radio-button value="2">Option 2</wa-radio-button>
|
|
||||||
<wa-radio-button value="3">Option 3</wa-radio-button>
|
|
||||||
</wa-radio-group>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<wa-radio-group size="medium" label="Select an option" name="a" value="1">
|
|
||||||
<wa-radio-button value="1">Option 1</wa-radio-button>
|
|
||||||
<wa-radio-button value="2">Option 2</wa-radio-button>
|
|
||||||
<wa-radio-button value="3">Option 3</wa-radio-button>
|
|
||||||
</wa-radio-group>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<wa-radio-group size="large" label="Select an option" name="a" value="1">
|
|
||||||
<wa-radio-button value="1">Option 1</wa-radio-button>
|
|
||||||
<wa-radio-button value="2">Option 2</wa-radio-button>
|
|
||||||
<wa-radio-button value="3">Option 3</wa-radio-button>
|
|
||||||
</wa-radio-group>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Pill Buttons
|
|
||||||
|
|
||||||
Use the `pill` attribute to give radio buttons rounded edges.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-radio-group size="small" label="Select an option" name="a" value="1">
|
|
||||||
<wa-radio-button pill value="1">Option 1</wa-radio-button>
|
|
||||||
<wa-radio-button pill value="2">Option 2</wa-radio-button>
|
|
||||||
<wa-radio-button pill value="3">Option 3</wa-radio-button>
|
|
||||||
</wa-radio-group>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<wa-radio-group size="medium" label="Select an option" name="a" value="1">
|
|
||||||
<wa-radio-button pill value="1">Option 1</wa-radio-button>
|
|
||||||
<wa-radio-button pill value="2">Option 2</wa-radio-button>
|
|
||||||
<wa-radio-button pill value="3">Option 3</wa-radio-button>
|
|
||||||
</wa-radio-group>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<wa-radio-group size="large" label="Select an option" name="a" value="1">
|
|
||||||
<wa-radio-button pill value="1">Option 1</wa-radio-button>
|
|
||||||
<wa-radio-button pill value="2">Option 2</wa-radio-button>
|
|
||||||
<wa-radio-button pill value="3">Option 3</wa-radio-button>
|
|
||||||
</wa-radio-group>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Prefix and Suffix Icons
|
|
||||||
|
|
||||||
Use the `prefix` and `suffix` slots to add icons.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-radio-group label="Select an option" name="a" value="1">
|
|
||||||
<wa-radio-button value="1">
|
|
||||||
<wa-icon slot="prefix" name="archive" variant="solid"></wa-icon>
|
|
||||||
Option 1
|
|
||||||
</wa-radio-button>
|
|
||||||
|
|
||||||
<wa-radio-button value="2">
|
|
||||||
<wa-icon slot="suffix" name="bag-shopping" variant="solid"></wa-icon>
|
|
||||||
Option 2
|
|
||||||
</wa-radio-button>
|
|
||||||
|
|
||||||
<wa-radio-button value="3">
|
|
||||||
<wa-icon slot="prefix" name="gift" variant="solid"></wa-icon>
|
|
||||||
<wa-icon slot="suffix" name="shopping-cart" variant="solid"></wa-icon>
|
|
||||||
Option 3
|
|
||||||
</wa-radio-button>
|
|
||||||
</wa-radio-group>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Buttons with Icons
|
|
||||||
|
|
||||||
You can omit button labels and use icons instead. Make sure to set a `label` attribute on each icon so screen readers will announce each option correctly.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-radio-group label="Select an option" name="a" value="neutral">
|
|
||||||
<wa-radio-button value="angry">
|
|
||||||
<wa-icon name="face-angry" variant="solid" label="Angry"></wa-icon>
|
|
||||||
</wa-radio-button>
|
|
||||||
|
|
||||||
<wa-radio-button value="sad">
|
|
||||||
<wa-icon name="face-frown" variant="solid" label="Sad"></wa-icon>
|
|
||||||
</wa-radio-button>
|
|
||||||
|
|
||||||
<wa-radio-button value="neutral">
|
|
||||||
<wa-icon name="face-meh" variant="solid" label="Neutral"></wa-icon>
|
|
||||||
</wa-radio-button>
|
|
||||||
|
|
||||||
<wa-radio-button value="happy">
|
|
||||||
<wa-icon name="face-smile" variant="solid" label="Happy"></wa-icon>
|
|
||||||
</wa-radio-button>
|
|
||||||
|
|
||||||
<wa-radio-button value="laughing">
|
|
||||||
<wa-icon name="face-laugh" variant="solid" label="Laughing"></wa-icon>
|
|
||||||
</wa-radio-button>
|
|
||||||
</wa-radio-group>
|
|
||||||
```
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
---
|
|
||||||
title: Radio
|
|
||||||
description: Radios allow the user to select a single option from a group.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
Radios are designed to be used with [radio groups](/components/radio-group).
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-radio-group label="Select an option" name="a" value="1">
|
|
||||||
<wa-radio value="1">Option 1</wa-radio><br>
|
|
||||||
<wa-radio value="2">Option 2</wa-radio><br>
|
|
||||||
<wa-radio value="3">Option 3</wa-radio>
|
|
||||||
</wa-radio-group>
|
|
||||||
```
|
|
||||||
|
|
||||||
:::info
|
|
||||||
This component works with standard `<form>` elements. Please refer to the section on [form controls](/getting-started/form-controls) to learn more about form submission and client-side validation.
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Initial Value
|
|
||||||
|
|
||||||
To set the initial value and checked state, use the `value` attribute on the containing radio group.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-radio-group label="Select an option" name="a" value="3">
|
|
||||||
<wa-radio value="1">Option 1</wa-radio><br>
|
|
||||||
<wa-radio value="2">Option 2</wa-radio><br>
|
|
||||||
<wa-radio value="3">Option 3</wa-radio>
|
|
||||||
</wa-radio-group>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Disabled
|
|
||||||
|
|
||||||
Use the `disabled` attribute to disable a radio.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-radio-group label="Select an option" name="a" value="1">
|
|
||||||
<wa-radio value="1">Option 1</wa-radio><br>
|
|
||||||
<wa-radio value="2" disabled>Option 2</wa-radio><br>
|
|
||||||
<wa-radio value="3">Option 3</wa-radio>
|
|
||||||
</wa-radio-group>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Sizes
|
|
||||||
|
|
||||||
Add the `size` attribute to the [Radio Group](/components/radio-group) to change the radios' size.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-radio-group size="small" value="1">
|
|
||||||
<wa-radio value="1">Small 1</wa-radio><br>
|
|
||||||
<wa-radio value="2">Small 2</wa-radio><br>
|
|
||||||
<wa-radio value="3">Small 3</wa-radio>
|
|
||||||
</wa-radio-group>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<wa-radio-group size="medium" value="1">
|
|
||||||
<wa-radio value="1">Medium 1</wa-radio><br>
|
|
||||||
<wa-radio value="2">Medium 2</wa-radio><br>
|
|
||||||
<wa-radio value="3">Medium 3</wa-radio>
|
|
||||||
</wa-radio-group>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<wa-radio-group size="large" value="1">
|
|
||||||
<wa-radio value="1">Large 1</wa-radio><br>
|
|
||||||
<wa-radio value="2">Large 2</wa-radio><br>
|
|
||||||
<wa-radio value="3">Large 3</wa-radio>
|
|
||||||
</wa-radio-group>
|
|
||||||
```
|
|
||||||
@@ -1,105 +0,0 @@
|
|||||||
---
|
|
||||||
title: Range
|
|
||||||
description: Ranges allow the user to select a single value within a given range using a slider.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-range></wa-range>
|
|
||||||
```
|
|
||||||
|
|
||||||
:::info
|
|
||||||
This component works with standard `<form>` elements. Please refer to the section on [form controls](/getting-started/form-controls) to learn more about form submission and client-side validation.
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Labels
|
|
||||||
|
|
||||||
Use the `label` attribute to give the range an accessible label. For labels that contain HTML, use the `label` slot instead.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-range label="Volume" min="0" max="100"></wa-range>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Help Text
|
|
||||||
|
|
||||||
Add descriptive help text to a range with the `help-text` attribute. For help texts that contain HTML, use the `help-text` slot instead.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-range label="Volume" help-text="Controls the volume of the current song." min="0" max="100"></wa-range>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Min, Max, and Step
|
|
||||||
|
|
||||||
Use the `min` and `max` attributes to set the range's minimum and maximum values, respectively. The `step` attribute determines the value's interval when increasing and decreasing.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-range min="0" max="10" step="1"></wa-range>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Disabled
|
|
||||||
|
|
||||||
Use the `disabled` attribute to disable a slider.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-range disabled></wa-range>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Tooltip Placement
|
|
||||||
|
|
||||||
By default, the tooltip is shown on top. Set `tooltip` to `bottom` to show it below the slider.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-range tooltip="bottom"></wa-range>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Disable the Tooltip
|
|
||||||
|
|
||||||
To disable the tooltip, set `tooltip` to `none`.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-range tooltip="none"></wa-range>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Custom Track Colors
|
|
||||||
|
|
||||||
You can customize the active and inactive portions of the track using the `--track-color-active` and `--track-color-inactive` custom properties.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-range
|
|
||||||
style="
|
|
||||||
--track-color-active: var(--wa-color-brand-spot);
|
|
||||||
--track-color-inactive: var(--wa-color-brand-fill-highlight);
|
|
||||||
"
|
|
||||||
></wa-range>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Custom Track Offset
|
|
||||||
|
|
||||||
You can customize the initial offset of the active track using the `--track-active-offset` custom property.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-range
|
|
||||||
min="-100"
|
|
||||||
max="100"
|
|
||||||
style="
|
|
||||||
--track-color-active: var(--wa-color-brand-spot);
|
|
||||||
--track-color-inactive: var(--wa-color-brand-fill-highlight);
|
|
||||||
--track-active-offset: 50%;
|
|
||||||
"
|
|
||||||
></wa-range>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Custom Tooltip Formatter
|
|
||||||
|
|
||||||
You can change the tooltip's content by setting the `tooltipFormatter` property to a function that accepts the range's value as an argument.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-range min="0" max="100" step="1" class="range-with-custom-formatter"></wa-range>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
const range = document.querySelector('.range-with-custom-formatter');
|
|
||||||
range.tooltipFormatter = value => `Total - ${value}%`;
|
|
||||||
</script>
|
|
||||||
```
|
|
||||||
@@ -1,275 +0,0 @@
|
|||||||
---
|
|
||||||
title: Select
|
|
||||||
description: Selects allow you to choose items from a menu of predefined options.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-select>
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2">Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
<wa-option value="option-4">Option 4</wa-option>
|
|
||||||
<wa-option value="option-5">Option 5</wa-option>
|
|
||||||
<wa-option value="option-6">Option 6</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
```
|
|
||||||
|
|
||||||
:::info
|
|
||||||
This component works with standard `<form>` elements. Please refer to the section on [form controls](/getting-started/form-controls) to learn more about form submission and client-side validation.
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Labels
|
|
||||||
|
|
||||||
Use the `label` attribute to give the select an accessible label. For labels that contain HTML, use the `label` slot instead.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-select label="Select one">
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2">Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Help Text
|
|
||||||
|
|
||||||
Add descriptive help text to a select with the `help-text` attribute. For help texts that contain HTML, use the `help-text` slot instead.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-select label="Experience" help-text="Please tell us your skill level.">
|
|
||||||
<wa-option value="1">Novice</wa-option>
|
|
||||||
<wa-option value="2">Intermediate</wa-option>
|
|
||||||
<wa-option value="3">Advanced</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Placeholders
|
|
||||||
|
|
||||||
Use the `placeholder` attribute to add a placeholder.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-select placeholder="Select one">
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2">Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Clearable
|
|
||||||
|
|
||||||
Use the `clearable` attribute to make the control clearable. The clear button only appears when an option is selected.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-select clearable value="option-1">
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2">Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Filled Selects
|
|
||||||
|
|
||||||
Add the `filled` attribute to draw a filled select.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-select filled>
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2">Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Pill
|
|
||||||
|
|
||||||
Use the `pill` attribute to give selects rounded edges.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-select pill>
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2">Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Disabled
|
|
||||||
|
|
||||||
Use the `disabled` attribute to disable a select.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-select placeholder="Disabled" disabled>
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2">Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Multiple
|
|
||||||
|
|
||||||
To allow multiple options to be selected, use the `multiple` attribute. It's a good practice to use `clearable` when this option is enabled. To set multiple values at once, set `value` to a space-delimited list of values.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-select label="Select a Few" value="option-1 option-2 option-3" multiple clearable>
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2">Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
<wa-option value="option-4">Option 4</wa-option>
|
|
||||||
<wa-option value="option-5">Option 5</wa-option>
|
|
||||||
<wa-option value="option-6">Option 6</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
```
|
|
||||||
|
|
||||||
:::info
|
|
||||||
Note that multi-select options may wrap, causing the control to expand vertically. You can use the `max-options-visible` attribute to control the maximum number of selected options to show at once.
|
|
||||||
:::
|
|
||||||
|
|
||||||
### Setting Initial Values
|
|
||||||
|
|
||||||
Use the `value` attribute to set the initial selection.
|
|
||||||
|
|
||||||
When using `multiple`, the `value` _attribute_ uses space-delimited values to select more than one option. Because of this, `<wa-option>` values cannot contain spaces. If you're accessing the `value` _property_ through Javascript, it will be an array.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-select value="option-1 option-2" multiple clearable>
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2">Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
<wa-option value="option-4">Option 4</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Grouping Options
|
|
||||||
|
|
||||||
Use `<wa-divider>` to group listbox items visually. You can also use `<small>` to provide labels, but they won't be announced by most assistive devices.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-select>
|
|
||||||
<small>Section 1</small>
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2">Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
<wa-divider></wa-divider>
|
|
||||||
<small>Section 2</small>
|
|
||||||
<wa-option value="option-4">Option 4</wa-option>
|
|
||||||
<wa-option value="option-5">Option 5</wa-option>
|
|
||||||
<wa-option value="option-6">Option 6</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Sizes
|
|
||||||
|
|
||||||
Use the `size` attribute to change a select's size. Note that size does not apply to listbox options.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-select placeholder="Small" size="small">
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2">Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<wa-select placeholder="Medium" size="medium">
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2">Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<wa-select placeholder="Large" size="large">
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2">Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Placement
|
|
||||||
|
|
||||||
The preferred placement of the select's listbox can be set with the `placement` attribute. Note that the actual position may vary to ensure the panel remains in the viewport. Valid placements are `top` and `bottom`.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-select placement="top">
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2">Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Prefix Icons
|
|
||||||
|
|
||||||
Use the `prefix` slot to prepend an icon to the control.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-select placeholder="Small" size="small" clearable>
|
|
||||||
<wa-icon slot="prefix" name="house" variant="solid"></wa-icon>
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2">Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
<br />
|
|
||||||
<wa-select placeholder="Medium" size="medium" clearable>
|
|
||||||
<wa-icon slot="prefix" name="house" variant="solid"></wa-icon>
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2">Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
<br />
|
|
||||||
<wa-select placeholder="Large" size="large" clearable>
|
|
||||||
<wa-icon slot="prefix" name="house" variant="solid"></wa-icon>
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2">Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Custom Tags
|
|
||||||
|
|
||||||
When multiple options can be selected, you can provide custom tags by passing a function to the `getTag` property. Your function can return a string of HTML, a <a href="https://lit.dev/docs/templates/overview/">Lit Template</a>, or an [`HTMLElement`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement). The `getTag()` function will be called for each option. The first argument is an `<wa-option>` element and the second argument is the tag's index (its position in the tag list).
|
|
||||||
|
|
||||||
Remember that custom tags are rendered in a shadow root. To style them, you can use the `style` attribute in your template or you can add your own [parts](/getting-started/customizing/#css-parts) and target them with the [`::part()`](https://developer.mozilla.org/en-US/docs/Web/CSS/::part) selector.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-select
|
|
||||||
placeholder="Select one"
|
|
||||||
value="email phone"
|
|
||||||
multiple
|
|
||||||
clearable
|
|
||||||
class="custom-tag"
|
|
||||||
>
|
|
||||||
<wa-option value="email">
|
|
||||||
<wa-icon slot="prefix" name="envelope" variant="solid"></wa-icon>
|
|
||||||
Email
|
|
||||||
</wa-option>
|
|
||||||
<wa-option value="phone">
|
|
||||||
<wa-icon slot="prefix" name="phone" variant="solid"></wa-icon>
|
|
||||||
Phone
|
|
||||||
</wa-option>
|
|
||||||
<wa-option value="chat">
|
|
||||||
<wa-icon slot="prefix" name="comment" variant="solid"></wa-icon>
|
|
||||||
Chat
|
|
||||||
</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
|
|
||||||
<script type="module">
|
|
||||||
const select = document.querySelector('.custom-tag');
|
|
||||||
|
|
||||||
select.getTag = (option, index) => {
|
|
||||||
// Use the same icon used in the <wa-option>
|
|
||||||
const name = option.querySelector('wa-icon[slot="prefix"]').name;
|
|
||||||
|
|
||||||
// You can return a string, a Lit Template, or an HTMLElement here
|
|
||||||
return `
|
|
||||||
<wa-tag removable>
|
|
||||||
<wa-icon name="${name}" style="padding-inline-end: .5rem;"></wa-icon>
|
|
||||||
${option.getTextLabel()}
|
|
||||||
</wa-tag>
|
|
||||||
`;
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
```
|
|
||||||
|
|
||||||
:::warning
|
|
||||||
Be sure you trust the content you are outputting! Passing unsanitized user input to `getTag()` can result in XSS vulnerabilities.
|
|
||||||
:::
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
---
|
|
||||||
title: Tab Panel
|
|
||||||
description: Tab panels are used inside tab groups to display tabbed content.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-tab-group>
|
|
||||||
<wa-tab slot="nav" panel="general">General</wa-tab>
|
|
||||||
<wa-tab slot="nav" panel="custom">Custom</wa-tab>
|
|
||||||
<wa-tab slot="nav" panel="advanced">Advanced</wa-tab>
|
|
||||||
<wa-tab slot="nav" panel="disabled" disabled>Disabled</wa-tab>
|
|
||||||
|
|
||||||
<wa-tab-panel name="general">This is the general tab panel.</wa-tab-panel>
|
|
||||||
<wa-tab-panel name="custom">This is the custom tab panel.</wa-tab-panel>
|
|
||||||
<wa-tab-panel name="advanced">This is the advanced tab panel.</wa-tab-panel>
|
|
||||||
<wa-tab-panel name="disabled">This is a disabled tab panel.</wa-tab-panel>
|
|
||||||
</wa-tab-group>
|
|
||||||
```
|
|
||||||
|
|
||||||
:::info
|
|
||||||
Additional demonstrations can be found in the [tab group examples](/components/tab-group).
|
|
||||||
:::
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
---
|
|
||||||
title: Tab
|
|
||||||
description: Tabs are used inside tab groups to represent and activate tab panels.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
:::info
|
|
||||||
Additional demonstrations can be found in the [tab group examples](/components/tab-group).
|
|
||||||
:::
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
---
|
|
||||||
title: Tag
|
|
||||||
description: Tags are used as labels to organize things or to indicate a selection.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-tag variant="brand">Brand</wa-tag>
|
|
||||||
<wa-tag variant="success">Success</wa-tag>
|
|
||||||
<wa-tag variant="neutral">Neutral</wa-tag>
|
|
||||||
<wa-tag variant="warning">Warning</wa-tag>
|
|
||||||
<wa-tag variant="danger">Danger</wa-tag>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Sizes
|
|
||||||
|
|
||||||
Use the `size` attribute to change a tab's size.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-tag size="small">Small</wa-tag>
|
|
||||||
<wa-tag size="medium">Medium</wa-tag>
|
|
||||||
<wa-tag size="large">Large</wa-tag>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Pill
|
|
||||||
|
|
||||||
Use the `pill` attribute to give tabs rounded edges.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-tag size="small" pill>Small</wa-tag>
|
|
||||||
<wa-tag size="medium" pill>Medium</wa-tag>
|
|
||||||
<wa-tag size="large" pill>Large</wa-tag>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Removable
|
|
||||||
|
|
||||||
Use the `removable` attribute to add a remove button to the tag.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<div class="tags-removable">
|
|
||||||
<wa-tag size="small" removable>Small</wa-tag>
|
|
||||||
<wa-tag size="medium" removable>Medium</wa-tag>
|
|
||||||
<wa-tag size="large" removable>Large</wa-tag>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
const div = document.querySelector('.tags-removable');
|
|
||||||
|
|
||||||
div.addEventListener('wa-remove', event => {
|
|
||||||
const tag = event.target;
|
|
||||||
tag.style.opacity = '0';
|
|
||||||
setTimeout(() => (tag.style.opacity = '1'), 2000);
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.tags-removable wa-tag {
|
|
||||||
transition: var(--wa-transition-fast) opacity;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
```
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
---
|
|
||||||
title: Tree Item
|
|
||||||
description: A tree item serves as a hierarchical node that lives inside a tree.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-tree>
|
|
||||||
<wa-tree-item>
|
|
||||||
Item 1
|
|
||||||
<wa-tree-item>Item A</wa-tree-item>
|
|
||||||
<wa-tree-item>Item B</wa-tree-item>
|
|
||||||
<wa-tree-item>Item C</wa-tree-item>
|
|
||||||
</wa-tree-item>
|
|
||||||
<wa-tree-item>Item 2</wa-tree-item>
|
|
||||||
<wa-tree-item>Item 3</wa-tree-item>
|
|
||||||
</wa-tree>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Nested tree items
|
|
||||||
|
|
||||||
A tree item can contain other tree items. This allows the node to be expanded or collapsed by the user.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-tree>
|
|
||||||
<wa-tree-item>
|
|
||||||
Item 1
|
|
||||||
<wa-tree-item>
|
|
||||||
Item A
|
|
||||||
<wa-tree-item>Item Z</wa-tree-item>
|
|
||||||
<wa-tree-item>Item Y</wa-tree-item>
|
|
||||||
<wa-tree-item>Item X</wa-tree-item>
|
|
||||||
</wa-tree-item>
|
|
||||||
<wa-tree-item>Item B</wa-tree-item>
|
|
||||||
<wa-tree-item>Item C</wa-tree-item>
|
|
||||||
</wa-tree-item>
|
|
||||||
<wa-tree-item>Item 2</wa-tree-item>
|
|
||||||
<wa-tree-item>Item 3</wa-tree-item>
|
|
||||||
</wa-tree>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Selected
|
|
||||||
|
|
||||||
Use the `selected` attribute to select a tree item initially.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-tree>
|
|
||||||
<wa-tree-item selected>
|
|
||||||
Item 1
|
|
||||||
<wa-tree-item>Item A</wa-tree-item>
|
|
||||||
<wa-tree-item>Item B</wa-tree-item>
|
|
||||||
<wa-tree-item>Item C</wa-tree-item>
|
|
||||||
</wa-tree-item>
|
|
||||||
<wa-tree-item>Item 2</wa-tree-item>
|
|
||||||
<wa-tree-item>Item 3</wa-tree-item>
|
|
||||||
</wa-tree>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Expanded
|
|
||||||
|
|
||||||
Use the `expanded` attribute to expand a tree item initially.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-tree>
|
|
||||||
<wa-tree-item expanded>
|
|
||||||
Item 1
|
|
||||||
<wa-tree-item expanded>
|
|
||||||
Item A
|
|
||||||
<wa-tree-item>Item Z</wa-tree-item>
|
|
||||||
<wa-tree-item>Item Y</wa-tree-item>
|
|
||||||
<wa-tree-item>Item X</wa-tree-item>
|
|
||||||
</wa-tree-item>
|
|
||||||
<wa-tree-item>Item B</wa-tree-item>
|
|
||||||
<wa-tree-item>Item C</wa-tree-item>
|
|
||||||
</wa-tree-item>
|
|
||||||
<wa-tree-item>Item 2</wa-tree-item>
|
|
||||||
<wa-tree-item>Item 3</wa-tree-item>
|
|
||||||
</wa-tree>
|
|
||||||
```
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
---
|
|
||||||
title: Visually Hidden
|
|
||||||
description: The visually hidden utility makes content accessible to assistive devices without displaying it on the screen.
|
|
||||||
layout: component.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
According to [The A11Y Project](https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/), "there are real world situations where visually hiding content may be appropriate, while the content should remain available to assistive technologies, such as screen readers. For instance, hiding a search field's label as a common magnifying glass icon is used in its stead."
|
|
||||||
|
|
||||||
Since visually hidden content can receive focus when tabbing, the element will become visible when something inside receives focus. This behavior is intentional, as sighted keyboard user won't be able to determine where the focus indicator is without it.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<div style="min-height: 1.875rem;">
|
|
||||||
<wa-visually-hidden>
|
|
||||||
<a href="#">Skip to main content</a>
|
|
||||||
</wa-visually-hidden>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Links That Open in New Windows
|
|
||||||
|
|
||||||
In this example, the link will open a new window. Screen readers will announce "opens in a new window" even though the text content isn't visible to sighted users.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<a href="https://example.com/" target="_blank">
|
|
||||||
Visit External Page
|
|
||||||
<wa-icon name="arrow-up-right-from-square" variant="regular"></wa-icon>
|
|
||||||
<wa-visually-hidden>opens in a new window</wa-visually-hidden>
|
|
||||||
</a>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Content Conveyed By Context
|
|
||||||
|
|
||||||
Adding a label may seem redundant at times, but they're very helpful for unsighted users. Rather than omit them, you can provide context to unsighted users with visually hidden content that will be announced by assistive devices such as screen readers.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-card style="width: 100%; max-width: 360px;">
|
|
||||||
<header>
|
|
||||||
<wa-visually-hidden>Personal Info</wa-visually-hidden>
|
|
||||||
</header>
|
|
||||||
<wa-input label="Name" style="margin-bottom: .5rem;"></wa-input>
|
|
||||||
<wa-input label="Email" type="email"></wa-input>
|
|
||||||
</wa-card>
|
|
||||||
```
|
|
||||||
@@ -1,109 +0,0 @@
|
|||||||
---
|
|
||||||
title: Customizing
|
|
||||||
description: Learn how to customize Web Awesome through parts and custom properties.
|
|
||||||
layout: page.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
Web Awesome components can be customized at a high level through design tokens. This gives you control over theme colors and general styling. For more advanced customizations, you can make use of CSS parts and custom properties to target individual components.
|
|
||||||
|
|
||||||
## Design Tokens
|
|
||||||
|
|
||||||
Web Awesome makes use of several design tokens to provide a consistent appearance across components. You can customize them and use them in your own application with pure CSS — no preprocessor required.
|
|
||||||
|
|
||||||
Design tokens offer a high-level way to customize the library with minimal effort. There are no component-specific variables, however, as design tokens are intended to be generic and highly reusable. To customize an individual component, refer to the section entitled [CSS Parts](#css-parts).
|
|
||||||
|
|
||||||
Design tokens are accessed through CSS custom properties that are defined in your theme. Because design tokens live at the page level, they're prefixed with `--wa-` to avoid collisions with other libraries.
|
|
||||||
|
|
||||||
To customize a design token, simply override it in your stylesheet using a `:root` block. Here's an example that changes the primary theme to purple based on existing [color primitives](/tokens/color#primitives).
|
|
||||||
|
|
||||||
```css
|
|
||||||
:root {
|
|
||||||
/* Changes the primary theme color to purple using primitives */
|
|
||||||
--wa-color-primary-50: var(--wa-color-purple-50);
|
|
||||||
--wa-color-primary-100: var(--wa-color-purple-100);
|
|
||||||
--wa-color-primary-200: var(--wa-color-purple-200);
|
|
||||||
--wa-color-primary-300: var(--wa-color-purple-300);
|
|
||||||
--wa-color-primary-400: var(--wa-color-purple-400);
|
|
||||||
--wa-color-primary-500: var(--wa-color-purple-500);
|
|
||||||
--wa-color-primary-600: var(--wa-color-purple-600);
|
|
||||||
--wa-color-primary-700: var(--wa-color-purple-700);
|
|
||||||
--wa-color-primary-800: var(--wa-color-purple-800);
|
|
||||||
--wa-color-primary-900: var(--wa-color-purple-900);
|
|
||||||
--wa-color-primary-950: var(--wa-color-purple-950);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Many design tokens are described further along in this documentation. For a complete list, refer to `src/themes/default.css` in the project's [source code](https://github.com/shoelace-style/shoelace/blob/current/src/themes/default.css).
|
|
||||||
|
|
||||||
## CSS Parts
|
|
||||||
|
|
||||||
Whereas design tokens offer a high-level way to customize the library, CSS parts offer a low-level way to customize individual components. Again, this is done with pure CSS — no preprocessor required.
|
|
||||||
|
|
||||||
Web Awesome components use a [shadow DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM) to encapsulate their styles and behaviors. As a result, you can't simply target their internals with the usual CSS selectors. Instead, components expose "parts" that can be targeted with the [CSS part selector](https://developer.mozilla.org/en-US/docs/Web/CSS/::part), or `::part()`.
|
|
||||||
|
|
||||||
Here's an example that modifies buttons with the `tomato-button` class.
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-button class="tomato-button"> Tomato Button </wa-button>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.tomato-button::part(base) {
|
|
||||||
background: var(--wa-color-neutral-0);
|
|
||||||
border: solid 1px tomato;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tomato-button::part(base):hover {
|
|
||||||
background: rgba(255, 99, 71, 0.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.tomato-button::part(base):active {
|
|
||||||
background: rgba(255, 99, 71, 0.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.tomato-button::part(base):focus-visible {
|
|
||||||
box-shadow: 0 0 0 3px rgba(255, 99, 71, 0.33);
|
|
||||||
}
|
|
||||||
|
|
||||||
.tomato-button::part(label) {
|
|
||||||
color: tomato;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
```
|
|
||||||
|
|
||||||
At first glance, this approach might seem a bit verbose or even limiting, but it comes with a few important advantages:
|
|
||||||
|
|
||||||
- Customizations can be made to components with explicit selectors, such as `::part(icon)`, rather than implicit selectors, such as `.button > div > span + .icon`, that are much more fragile.
|
|
||||||
|
|
||||||
- The internal structure of a component will likely change as it evolves. By exposing CSS parts through an API, the internals can be reworked without fear of breaking customizations as long as its parts remain intact.
|
|
||||||
|
|
||||||
- It encourages us to think more about how components are designed and how customizations should be allowed before users can take advantage of them. Once we opt a part into the component's API, it's guaranteed to be supported and can't be removed until a major version of the library is released.
|
|
||||||
|
|
||||||
Most (but not all) components expose parts. You can find them in each component's API documentation under the "CSS Parts" section.
|
|
||||||
|
|
||||||
## Custom Properties
|
|
||||||
|
|
||||||
For convenience, some components expose CSS custom properties you can override. These are not design tokens, nor do they have the same `--wa-` prefix since they're scoped to a component.
|
|
||||||
|
|
||||||
You can set custom properties on a component in your stylesheet.
|
|
||||||
|
|
||||||
```css
|
|
||||||
wa-avatar {
|
|
||||||
--size: 6rem;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
This will also work if you need to target a subset of components with a specific class.
|
|
||||||
|
|
||||||
```css
|
|
||||||
wa-avatar.your-class {
|
|
||||||
--size: 6rem;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Alternatively, you can set them inline directly on the element.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<wa-avatar style="--size: 6rem;"></wa-avatar>
|
|
||||||
```
|
|
||||||
|
|
||||||
Not all components expose CSS custom properties. For those that do, they can be found in the component's API documentation.
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
---
|
|
||||||
title: Form Control Validation
|
|
||||||
description: TODO
|
|
||||||
layout: page.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
Adding the `wa-valid` or `wa-invalid` class to a form control will change its appearance. This is useful for applying validation styles to server-rendered form controls.
|
|
||||||
|
|
||||||
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 2rem;">
|
|
||||||
<div>
|
|
||||||
<h3>Valid</h3>
|
|
||||||
<wa-input class="wa-valid" label="Name" help-text="Just a first name is fine" placeholder="Enter your name"></wa-input><br>
|
|
||||||
<wa-select class="wa-valid" label="Choose one" help-text="Make a choice already">
|
|
||||||
<wa-option>There can be only one!</wa-option>
|
|
||||||
<wa-option>Well, maybe two is OK</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
<wa-textarea class="wa-valid" label="Bio" help-text="Tell us about yourself" placeholder="Enter a bio"></wa-textarea><br>
|
|
||||||
<wa-range class="wa-valid" value="50" label="Volume" help-text="Crank it up"></wa-range><br>
|
|
||||||
<wa-checkbox class="wa-valid" checked>I am awesome</wa-checkbox><br>
|
|
||||||
<wa-checkbox class="wa-valid">So am I</wa-checkbox><br><br>
|
|
||||||
<wa-switch class="wa-valid" checked>Still awesome</wa-switch><br>
|
|
||||||
<wa-switch class="wa-valid">More awesome</wa-switch><br><br>
|
|
||||||
<wa-radio-group class="wa-valid" label="Select an option" name="a" value="1">
|
|
||||||
<wa-radio value="1">Option 1</wa-radio>
|
|
||||||
<wa-radio value="2">Option 2</wa-radio>
|
|
||||||
<wa-radio value="3">Option 3</wa-radio>
|
|
||||||
</wa-radio-group><br>
|
|
||||||
<wa-button variant="brand">Submit Form</wa-button>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3>Invalid</h3>
|
|
||||||
<wa-input class="wa-invalid" label="Name" help-text="Just a first name is fine" placeholder="Enter your name"></wa-input><br>
|
|
||||||
<wa-select class="wa-invalid" label="Choose one" help-text="Make a choice already">
|
|
||||||
<wa-option>There can be only one!</wa-option>
|
|
||||||
<wa-option>Well, maybe two is OK</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
<wa-textarea class="wa-invalid" label="Bio" help-text="Tell us about yourself" placeholder="Enter a bio"></wa-textarea><br>
|
|
||||||
<wa-range class="wa-invalid" value="50" label="Volume" help-text="Crank it up"></wa-range><br>
|
|
||||||
<wa-checkbox class="wa-invalid" checked>I am awesome</wa-checkbox><br>
|
|
||||||
<wa-checkbox class="wa-invalid">So am I</wa-checkbox><br><br>
|
|
||||||
<wa-switch class="wa-invalid" checked>Still awesome</wa-switch><br>
|
|
||||||
<wa-switch class="wa-invalid">More awesome</wa-switch><br><br>
|
|
||||||
<wa-radio-group class="wa-invalid" label="Select an option" name="a" value="1">
|
|
||||||
<wa-radio value="1">Option 1</wa-radio>
|
|
||||||
<wa-radio value="2">Option 2</wa-radio>
|
|
||||||
<wa-radio value="3">Option 3</wa-radio>
|
|
||||||
</wa-radio-group><br>
|
|
||||||
<wa-button variant="brand">Submit Form</wa-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
title: Patterns
|
|
||||||
description: TODO
|
|
||||||
---
|
|
||||||
@@ -1,166 +0,0 @@
|
|||||||
---
|
|
||||||
title: Theming Sandbox
|
|
||||||
description: TODO
|
|
||||||
layout: page.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
## Card
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-card with-image class="card-overview">
|
|
||||||
<img
|
|
||||||
slot="image"
|
|
||||||
src="https://images.unsplash.com/photo-1559209172-0ff8f6d49ff7?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=80"
|
|
||||||
alt="A kitten sits patiently between a terracotta pot and decorative grasses."
|
|
||||||
/>
|
|
||||||
|
|
||||||
<strong>Mittens</strong><br />
|
|
||||||
This kitten is as cute as he is playful. Bring him home today!<br />
|
|
||||||
<small>6 weeks old</small>
|
|
||||||
|
|
||||||
<div slot="footer">
|
|
||||||
<wa-button variant="brand" pill>More Info</wa-button>
|
|
||||||
<wa-rating></wa-rating>
|
|
||||||
</div>
|
|
||||||
</wa-card>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.card-overview {
|
|
||||||
max-width: 300px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-overview small {
|
|
||||||
color: var(--wa-color-text-quiet);
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-overview [slot='footer'] {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Alerts
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-callout variant="brand">
|
|
||||||
<wa-icon slot="icon" name="circle-info" variant="regular"></wa-icon>
|
|
||||||
<strong>This is super informative</strong><br />
|
|
||||||
You can tell by how pretty the alert is.
|
|
||||||
</wa-callout>
|
|
||||||
<br />
|
|
||||||
<wa-callout variant="success">
|
|
||||||
<wa-icon slot="icon" name="circle-check" variant="regular"></wa-icon>
|
|
||||||
<strong>Your changes have been saved</strong><br />
|
|
||||||
You can safely exit the app now.
|
|
||||||
</wa-callout>
|
|
||||||
<br />
|
|
||||||
<wa-callout variant="neutral">
|
|
||||||
<wa-icon slot="icon" name="gear" variant="regular"></wa-icon>
|
|
||||||
<strong>Your settings have been updated</strong><br />
|
|
||||||
Settings will take affect on next login.
|
|
||||||
</wa-callout>
|
|
||||||
<br />
|
|
||||||
<wa-callout variant="warning">
|
|
||||||
<wa-icon slot="icon" name="triangle-exclamation" variant="regular"></wa-icon>
|
|
||||||
<strong>Your session has ended</strong><br />
|
|
||||||
Please login again to continue.
|
|
||||||
</wa-callout>
|
|
||||||
<br />
|
|
||||||
<wa-callout variant="danger">
|
|
||||||
<wa-icon slot="icon" name="circle-exclamation" variant="regular"></wa-icon>
|
|
||||||
<strong>Your account has been deleted</strong><br />
|
|
||||||
We're very sorry to see you go!
|
|
||||||
</wa-callout>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Badges and Tags
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-badge variant="brand">Brand</wa-badge>
|
|
||||||
<wa-badge variant="success">Success</wa-badge>
|
|
||||||
<wa-badge variant="neutral">Neutral</wa-badge>
|
|
||||||
<wa-badge variant="warning">Warning</wa-badge>
|
|
||||||
<wa-badge variant="danger">Danger</wa-badge>
|
|
||||||
<br />
|
|
||||||
<wa-tag variant="brand">Brand</wa-tag>
|
|
||||||
<wa-tag variant="success">Success</wa-tag>
|
|
||||||
<wa-tag variant="neutral">Neutral</wa-tag>
|
|
||||||
<wa-tag variant="warning">Warning</wa-tag>
|
|
||||||
<wa-tag variant="danger">Danger</wa-tag>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Buttons
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-button variant="brand">Brand</wa-button>
|
|
||||||
<wa-button variant="success">Success</wa-button>
|
|
||||||
<wa-button variant="neutral">Neutral</wa-button>
|
|
||||||
<wa-button variant="warning">Warning</wa-button>
|
|
||||||
<wa-button variant="danger">Danger</wa-button>
|
|
||||||
<br /><br />
|
|
||||||
<wa-button variant="brand" outline>Brand</wa-button>
|
|
||||||
<wa-button variant="success" outline>Success</wa-button>
|
|
||||||
<wa-button variant="neutral" outline>Neutral</wa-button>
|
|
||||||
<wa-button variant="warning" outline>Warning</wa-button>
|
|
||||||
<wa-button variant="danger" outline>Danger</wa-button>
|
|
||||||
<br /><br />
|
|
||||||
<wa-button variant="text">Brand</wa-button>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Form controls
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-checkbox>Unchecked</wa-checkbox>
|
|
||||||
<br />
|
|
||||||
<wa-checkbox checked>Checked</wa-checkbox>
|
|
||||||
<br /><br />
|
|
||||||
<wa-radio-group label="Radio" name="a" value="1">
|
|
||||||
<wa-radio value="1">Option 1</wa-radio>
|
|
||||||
<wa-radio value="2">Option 2</wa-radio>
|
|
||||||
<wa-radio value="3">Option 3</wa-radio>
|
|
||||||
</wa-radio-group>
|
|
||||||
<br />
|
|
||||||
<wa-switch>Switch off</wa-switch>
|
|
||||||
<br />
|
|
||||||
<wa-switch checked>Switch on</wa-switch>
|
|
||||||
<br /><br />
|
|
||||||
<wa-input label="Label" help-text="Super helpful and/or contextual content" placeholder="Placeholder"></wa-input>
|
|
||||||
<br />
|
|
||||||
<wa-select label="Select">
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2">Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
<wa-option value="option-4">Option 4</wa-option>
|
|
||||||
<wa-option value="option-5">Option 5</wa-option>
|
|
||||||
<wa-option value="option-6">Option 6</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Progress
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-progress-ring value="25" style="--indicator-width: 4px;"></wa-progress-ring>
|
|
||||||
<wa-progress-bar value="60"></wa-progress-bar>
|
|
||||||
<wa-spinner></wa-spinner>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Shadows
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<style>
|
|
||||||
div.shadow {
|
|
||||||
border: 1px solid var(--wa-color-surface-border);
|
|
||||||
border-radius: var(--wa-corners-s);
|
|
||||||
display: inline-block;
|
|
||||||
height: 4rem;
|
|
||||||
margin-right: 2rem;
|
|
||||||
width: 4rem;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<div class="shadow" style="box-shadow: var(--wa-shadow-inset);"></div>
|
|
||||||
<div class="shadow" style="box-shadow: var(--wa-shadow-level-1);"></div>
|
|
||||||
<div class="shadow" style="box-shadow: var(--wa-shadow-level-2);"></div>
|
|
||||||
<div class="shadow" style="box-shadow: var(--wa-shadow-level-3);"></div>
|
|
||||||
```
|
|
||||||
@@ -1,165 +0,0 @@
|
|||||||
---
|
|
||||||
title: Style Guide
|
|
||||||
description: TODO
|
|
||||||
layout: page.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
The styles shown below can be all yours by adding Web Awesome's applied stylesheet to your project.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Typography
|
|
||||||
|
|
||||||
Vel risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Amet mauris commodo quis imperdiet. Bibendum ut tristique et egestas quis ipsum suspendisse. Sit amet nulla facilisi morbi tempus iaculis urna id volutpat.
|
|
||||||
|
|
||||||
Cras pulvinar mattis nunc sed blandit libero. Facilisis magna etiam tempor orci. Scelerisque eleifend donec pretium vulputate sapien nec. Donec et odio pellentesque diam volutpat commodo sed egestas egestas. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque.
|
|
||||||
|
|
||||||
> What is a Web year now, about three months? And when people can browse around, discover new things, and download them fast, when we all have agents - then Web years could slip by before human beings can notice.
|
|
||||||
>
|
|
||||||
> — Tim Berners-Lee
|
|
||||||
|
|
||||||
## Inline Text
|
|
||||||
|
|
||||||
```html
|
|
||||||
|
|
||||||
Feugiat nisl pretium fusce id. Ipsum dolor sit amet consectetur adipiscing elit. Eget nunc lobortis mattis aliquam faucibus purus. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Urna condimentum mattis pellentesque id nibh tortor id.
|
|
||||||
```
|
|
||||||
|
|
||||||
<div class="docs-grid">
|
|
||||||
<p><strong>Bold</strong></p>
|
|
||||||
<p><em>Italics</em></p>
|
|
||||||
<p><u>Underline</u></p>
|
|
||||||
<p><del>Deleted</del></p>
|
|
||||||
<p><ins>Inserted</ins></p>
|
|
||||||
<p><s>Strike-through</s></p>
|
|
||||||
<p><small>Small</small></p>
|
|
||||||
<p><span>Text <sub>Sub</sub></span></p>
|
|
||||||
<p><span>Text <sup>Sup</sup></span></p>
|
|
||||||
<p><abbr title="Abbreviation">Abbr.</abbr></p>
|
|
||||||
<p><kbd>Keyboard</kbd></p>
|
|
||||||
<p><mark>Highlighted</mark></p>
|
|
||||||
<p><a href="#">Link text</a></p>
|
|
||||||
<p><code>Inline code</code></p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
## Lists
|
|
||||||
|
|
||||||
- List item 1
|
|
||||||
- List item 2
|
|
||||||
- List item 3
|
|
||||||
- Subitem a
|
|
||||||
- Subitem b
|
|
||||||
|
|
||||||
1. List item 1
|
|
||||||
2. List item 2
|
|
||||||
3. List item 3
|
|
||||||
- Subitem a
|
|
||||||
- Subitem b
|
|
||||||
|
|
||||||
## Headings
|
|
||||||
|
|
||||||
### Heading 3
|
|
||||||
|
|
||||||
Feugiat nisl pretium fusce id. Ipsum dolor sit amet consectetur adipiscing elit. Eget nunc lobortis mattis aliquam faucibus purus. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Urna condimentum mattis pellentesque id nibh tortor id.
|
|
||||||
|
|
||||||
#### Heading 4
|
|
||||||
|
|
||||||
Gravida arcu ac tortor dignissim convallis aenean. Pellentesque pulvinar pellentesque habitant morbi tristique senectus et. Ipsum nunc aliquet bibendum enim facilisis gravida neque. Donec adipiscing tristique risus nec feugiat in.
|
|
||||||
|
|
||||||
##### Heading 5
|
|
||||||
|
|
||||||
Enim diam vulputate ut pharetra sit. Enim facilisis gravida neque convallis a cras. Enim neque volutpat ac tincidunt vitae semper. Sed egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium.
|
|
||||||
|
|
||||||
###### Heading 6
|
|
||||||
|
|
||||||
Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Facilisis mauris sit amet massa vitae. Nunc faucibus a pellentesque sit amet porttitor. Adipiscing tristique risus nec feugiat in fermentum.
|
|
||||||
|
|
||||||
## Details
|
|
||||||
|
|
||||||
Individual details look like this.
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Tincidunt nunc pulvinar</summary>
|
|
||||||
<p>Ut lectus arcu bibendum at varius. Convallis a cras semper auctor neque vitae. Odio pellentesque diam volutpat commodo sed egestas. Amet dictum sit amet justo donec enim diam vulputate ut.</p>
|
|
||||||
</details>
|
|
||||||
|
|
||||||
Grouping them provides accordion-style functionality.
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Enim diam</summary>
|
|
||||||
<p>Nunc faucibus a pellentesque sit amet porttitor. Adipiscing tristique risus nec feugiat in fermentum. Leo duis ut diam quam nulla porttitor massa id. Mauris nunc congue nisi vitae.</p>
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Arcu non odio</summary>
|
|
||||||
<p>Sed libero enim sed faucibus turpis in eu mi bibendum. Nunc mi ipsum faucibus vitae aliquet nec. Ultricies tristique nulla aliquet enim tortor. Tellus at urna condimentum mattis pellentesque.</p>
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Ut porttitor</summary>
|
|
||||||
<p>Eu facilisis sed odio morbi quis commodo odio aenean sed. Sit amet purus gravida quis blandit turpis cursus. Eu consequat ac felis donec et odio pellentesque diam volutpat.</p>
|
|
||||||
</details>
|
|
||||||
|
|
||||||
## Code Blocks
|
|
||||||
|
|
||||||
```
|
|
||||||
// do a thing
|
|
||||||
export function thing() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Images
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Tables
|
|
||||||
|
|
||||||
<table>
|
|
||||||
<caption>I'm just a table</caption>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Column 1</th>
|
|
||||||
<th>Column 2</th>
|
|
||||||
<th>Column 3</th>
|
|
||||||
<th>Column 4</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>Cell</td>
|
|
||||||
<td>Cell</td>
|
|
||||||
<td>Cell</td>
|
|
||||||
<td>Cell</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Cell</td>
|
|
||||||
<td>Cell</td>
|
|
||||||
<td>Cell</td>
|
|
||||||
<td>Cell</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Cell</td>
|
|
||||||
<td>Cell</td>
|
|
||||||
<td>Cell</td>
|
|
||||||
<td>Cell</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Cell</td>
|
|
||||||
<td>Cell</td>
|
|
||||||
<td>Cell</td>
|
|
||||||
<td>Cell</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
## Definition Lists
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt>Definition 1</dt>
|
|
||||||
<dd>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</dd>
|
|
||||||
<dt>Definition 2</dt>
|
|
||||||
<dd>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</dd>
|
|
||||||
<dt>Definition 3</dt>
|
|
||||||
<dd>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.</dd>
|
|
||||||
</dl>
|
|
||||||
@@ -1,209 +0,0 @@
|
|||||||
---
|
|
||||||
title: Installation
|
|
||||||
description: Choose the installation method that works best for you.
|
|
||||||
layout: page.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
You can load Web Awesome via CDN or by installing it locally. If you're using a framework, make sure to check out the pages for [React](/frameworks/react), [Vue](/frameworks/vue), and [Angular](/frameworks/angular) for additional information.
|
|
||||||
|
|
||||||
## CDN Installation (Easiest)
|
|
||||||
|
|
||||||
<wa-tab-group>
|
|
||||||
<wa-tab slot="nav" panel="autoloader" active>Autoloader</wa-tab>
|
|
||||||
<wa-tab slot="nav" panel="traditional">Traditional Loader</wa-tab>
|
|
||||||
|
|
||||||
<wa-tab-panel name="autoloader">
|
|
||||||
|
|
||||||
The experimental autoloader is the easiest and most efficient way to use Web Awesome. A lightweight script watches the DOM for unregistered Web Awesome elements and lazy loads them for you — even if they're added dynamically.
|
|
||||||
|
|
||||||
While convenient, autoloading may lead to a [Flash of Undefined Custom Elements](https://www.abeautifulsite.net/posts/flash-of-undefined-custom-elements/). The linked article describes some ways to alleviate it.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@%VERSION%/%CDNDIR%/themes/default.css" />
|
|
||||||
<script type="module" src="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@%VERSION%/%CDNDIR%/autoloader.js"></script>
|
|
||||||
```
|
|
||||||
|
|
||||||
</wa-tab-panel>
|
|
||||||
|
|
||||||
<wa-tab-panel name="traditional">
|
|
||||||
|
|
||||||
The traditional CDN loader registers all Web Awesome elements up front. Note that, if you're only using a handful of components, it will be much more efficient to stick with the autoloader. However, you can also [cherry pick](#cherry-picking) components if you want to load specific ones up front.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@%VERSION%/%CDNDIR%/themes/default.css" />
|
|
||||||
<script type="module" src="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@%VERSION%/%CDNDIR%/autoloader.js" ></script>
|
|
||||||
```
|
|
||||||
|
|
||||||
</wa-tab-panel>
|
|
||||||
</wa-tab-group>
|
|
||||||
|
|
||||||
### Dark Theme
|
|
||||||
|
|
||||||
The code above will load the light theme. If you want to use the [dark theme](/getting-started/themes#dark-theme) instead, update the stylesheet as shown below and add `<html class="wa-theme-default-dark">` to your page.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@%VERSION%/%CDNDIR%/themes/dark.css" />
|
|
||||||
```
|
|
||||||
|
|
||||||
### Light & Dark Theme
|
|
||||||
|
|
||||||
If you want to load the light or dark theme based on the user's `prefers-color-scheme` setting, use the stylesheets below. The `media` attributes ensure that only the user's preferred theme stylesheet loads and the `onload` attribute sets the appropriate [theme class](/getting-started/themes) on the `<html>` element.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<link
|
|
||||||
rel="stylesheet"
|
|
||||||
media="(prefers-color-scheme:light)"
|
|
||||||
href="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@%VERSION%/%CDNDIR%/themes/default.css"
|
|
||||||
/>
|
|
||||||
<link
|
|
||||||
rel="stylesheet"
|
|
||||||
media="(prefers-color-scheme:dark)"
|
|
||||||
href="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@%VERSION%/%CDNDIR%/themes/dark.css"
|
|
||||||
onload="document.documentElement.classList.add('wa-theme-default-dark');"
|
|
||||||
/>
|
|
||||||
```
|
|
||||||
|
|
||||||
Now you can [start using Web Awesome!](/getting-started/usage)
|
|
||||||
|
|
||||||
## npm installation
|
|
||||||
|
|
||||||
If you don't want to use the CDN, you can install Web Awesome from npm with the following command.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm install @shoelace-style/shoelace
|
|
||||||
```
|
|
||||||
|
|
||||||
It's up to you to make the source files available to your app. One way to do this is to create a route in your app called `/shoelace` that serves static files from `node_modules/@shoelace-style/shoelace`.
|
|
||||||
|
|
||||||
Once you've done that, add the following tags to your page. Make sure to update `href` and `src` so they point to the route you created.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<link rel="stylesheet" href="/shoelace/%NPMDIR%/themes/default.css" />
|
|
||||||
<script type="module" src="/shoelace/%NPMDIR%/autoloader.js"></script>
|
|
||||||
```
|
|
||||||
|
|
||||||
Alternatively, [you can use a bundler](#bundling).
|
|
||||||
|
|
||||||
:::info
|
|
||||||
For clarity, the docs will usually show imports from `@shoelace-style/shoelace`. If you're not using a module resolver or bundler, you'll need to adjust these paths to point to the folder Web Awesome is in.
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Setting the Base Path
|
|
||||||
|
|
||||||
Some components rely on assets (icons, images, etc.) and Web Awesome needs to know where they're located. For convenience, Web Awesome will try to auto-detect the correct location based on the script you've loaded it from. This assumes assets are colocated with `autoloader.js` and will "just work" for most users.
|
|
||||||
|
|
||||||
However, if you're [cherry picking](#cherry-picking) or [bundling](#bundling) Web Awesome, you'll need to set the base path. You can do this one of two ways.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<!-- Option 1: the data-webawesome attribute -->
|
|
||||||
<script src="bundle.js" data-webawesome="/path/to/web-awesome/%NPMDIR%"></script>
|
|
||||||
|
|
||||||
<!-- Option 2: the setBasePath() method -->
|
|
||||||
<script type="module">
|
|
||||||
import { setBasePath } from '/path/to/web-awesome/%NPMDIR%/webawesome.js';
|
|
||||||
setBasePath('/path/to/web-awesome/%NPMDIR%');
|
|
||||||
</script>
|
|
||||||
```
|
|
||||||
|
|
||||||
:::info
|
|
||||||
An easy way to make sure the base path is configured properly is to check if [icons](/components/icon) are loading.
|
|
||||||
:::
|
|
||||||
|
|
||||||
### Referencing Assets
|
|
||||||
|
|
||||||
Most of the magic behind assets is handled internally by Web Awesome, but if you need to reference the base path for any reason, the same module exports a function called `getBasePath()`. An optional string argument can be passed, allowing you to get the full path to any asset.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<script type="module">
|
|
||||||
import { getBasePath, setBasePath } from '/path/to/web-awesome/%NPMDIR%/webawesome.js';
|
|
||||||
|
|
||||||
setBasePath('/path/to/assets');
|
|
||||||
|
|
||||||
// ...
|
|
||||||
|
|
||||||
// Get the base path, e.g. /path/to/assets
|
|
||||||
const basePath = getBasePath();
|
|
||||||
|
|
||||||
// Get the path to an asset, e.g. /path/to/assets/file.ext
|
|
||||||
const assetPath = getBasePath('file.ext');
|
|
||||||
</script>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Setting a Kit Code
|
|
||||||
|
|
||||||
Font Awesome users can set their kit code to unlock Font Awesome Pro icons. You can provide it through the `data-fa-kit-code` attribute or by calling the `setKitCode()` method.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<!-- Option 1: the data-fa-kit-code attribute -->
|
|
||||||
<script src="bundle.js" data-fa-kit-code="abc123"></script>
|
|
||||||
|
|
||||||
<!-- Option 2: the setKitCode() method -->
|
|
||||||
<script type="module">
|
|
||||||
import { setKitCode } from '/path/to/web-awesome/%NPMDIR%/webawesome.js';
|
|
||||||
setBasePath('/path/to/web-awesome/%NPMDIR%');
|
|
||||||
</script>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Cherry Picking
|
|
||||||
|
|
||||||
Cherry picking can be done from [the CDN](#cdn-installation-easiest) or from [npm](#npm-installation). This approach will load only the components you need up front, while limiting the number of files the browser has to download. The disadvantage is that you need to import each individual component.
|
|
||||||
|
|
||||||
Here's an example that loads only the button component. Again, if you're not using a module resolver, you'll need to adjust the path to point to the folder Web Awesome is in.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<link rel="stylesheet" href="/path/to/web-awesome/%NPMDIR%/themes/default.css" />
|
|
||||||
|
|
||||||
<script type="module" data-webawesome="/path/to/web-awesome/%NPMDIR%">
|
|
||||||
import '/path/to/web-awesome/%NPMDIR%/components/button/button.js';
|
|
||||||
|
|
||||||
// <wa-button> is ready to use!
|
|
||||||
</script>
|
|
||||||
```
|
|
||||||
|
|
||||||
You can copy and paste the code to import a component from the "Importing" section of the component's documentation. Note that some components have dependencies that are automatically imported when you cherry pick. If a component has dependencies, they will be listed in the "Dependencies" section of its docs.
|
|
||||||
|
|
||||||
:::warning
|
|
||||||
You will see files named `chunk.[hash].js` in the `chunks` directory. Never import these files directly, as they are generated and change from version to version.
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Bundling
|
|
||||||
|
|
||||||
Web Awesome is distributed as a collection of standard ES modules that [all modern browsers can understand](https://caniuse.com/es6-module). However, importing a lot of modules can result in a lot of HTTP requests and potentially longer load times. Using a CDN can alleviate this, but some users may wish to further optimize their imports with a bundler.
|
|
||||||
|
|
||||||
To use Web Awesome with a bundler, first install Web Awesome along with your bundler of choice.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm install @shoelace-style/webawesome
|
|
||||||
```
|
|
||||||
|
|
||||||
Now it's time to configure your bundler. Configurations vary for each tool, but here are some examples to help you get started.
|
|
||||||
|
|
||||||
- [Example webpack config](https://github.com/shoelace-style/webpack-example/blob/master/webpack.config.js)
|
|
||||||
- [Example Rollup config](https://github.com/shoelace-style/rollup-example/blob/master/rollup.config.js)
|
|
||||||
|
|
||||||
Once your bundler is configured, you'll be able to import Web Awesome components and utilities.
|
|
||||||
|
|
||||||
```js
|
|
||||||
import '/path/to/web-awesome/%NPMDIR%/themes/default.css';
|
|
||||||
import '/path/to/web-awesome/%NPMDIR%/components/button/button.js';
|
|
||||||
import '/path/to/web-awesome/%NPMDIR%/components/icon/icon.js';
|
|
||||||
import '/path/to/web-awesome/%NPMDIR%/components/input/input.js';
|
|
||||||
import '/path/to/web-awesome/%NPMDIR%/components/rating/rating.js';
|
|
||||||
import { setBasePath } from '/path/to/web-awesome/%NPMDIR%/webawesome.js';
|
|
||||||
|
|
||||||
// Set the base path to the folder you copied Web Awesome's assets to
|
|
||||||
setBasePath('/path/to/web-awesome/%NPMDIR%');
|
|
||||||
|
|
||||||
// <wa-button>, <wa-icon>, <wa-input>, and <wa-rating> are ready to use!
|
|
||||||
```
|
|
||||||
|
|
||||||
## The difference between CDN and npm
|
|
||||||
|
|
||||||
You'll notice that the CDN links all start with `/%CDNDIR%/<path>` and npm imports use `/%NPMDIR%/<path>`. The `/%CDNDIR%` files are bundled separately from the `/%NPMDIR%` files. The `/%CDNDIR%` files come pre-bundled, which means all dependencies are inlined so you do not need to worry about loading additional libraries. The `/%NPMDIR%` files **DO NOT** come pre-bundled, allowing your bundler of choice to more efficiently deduplicate dependencies, resulting in smaller bundles and optimal code sharing.
|
|
||||||
|
|
||||||
TL;DR:
|
|
||||||
|
|
||||||
- `/path/to/web-awesome/%CDNDIR%` is for CDN users
|
|
||||||
- `/path/to/web-awesome/%NPMDIR%` is for npm users
|
|
||||||
|
|
||||||
This change was introduced in `v2.5.0` to address issues around installations from npm loading multiple versions of libraries (such as the Lit) that Web Awesome uses internally.
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
title: App
|
|
||||||
description: TODO
|
|
||||||
---
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
title: Blog
|
|
||||||
description: TODO
|
|
||||||
---
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
title: Business
|
|
||||||
description: TODO
|
|
||||||
---
|
|
||||||
@@ -1,717 +0,0 @@
|
|||||||
---
|
|
||||||
title: E-commerce
|
|
||||||
description: TODO
|
|
||||||
layout: page.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
TODO Page Description
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Slide Over
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-card class="card-header" style="width: 500px;">
|
|
||||||
<div slot="header">
|
|
||||||
<strong>Shopping Cart</strong>
|
|
||||||
<wa-icon-button name="close" variant="solid" label="Settings"></wa-icon-button>
|
|
||||||
</div>
|
|
||||||
<section class="cart-item">
|
|
||||||
<img src="https://source.unsplash.com/white-and-red-nike-air-force-1-high--iJgjj33eEk" alt="" width="300">
|
|
||||||
<div>
|
|
||||||
<div style="display:flex; justify-content: space-between; font-weight: 600;">
|
|
||||||
<span>AJ1</span>
|
|
||||||
<span>$170.00</span>
|
|
||||||
</div>
|
|
||||||
<div style="font-size: small;">Off-white Jordan One</div>
|
|
||||||
<div style="display:flex; justify-content: space-between; align-items: center;">
|
|
||||||
<span>Qty: 1</span>
|
|
||||||
<wa-button variant="text" size="small">Remove</wa-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
<section class="cart-item">
|
|
||||||
<img src="https://source.unsplash.com/smiling-woman-in-black-and-white-print-t-shirt-VW5VjskNXZ8" alt="" width="300">
|
|
||||||
<div>
|
|
||||||
<div style="display:flex; justify-content: space-between; font-weight: 600;">
|
|
||||||
<span>The Trails</span>
|
|
||||||
<span>$35.00</span>
|
|
||||||
</div>
|
|
||||||
<div style="font-size: small;">50/50 Cotton Poly Blend</div>
|
|
||||||
<div style="display:flex; justify-content: space-between; align-items: center;">
|
|
||||||
<span>Qty: 1</span>
|
|
||||||
<wa-button variant="text" size="small">Remove</wa-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
<section class="cart-item">
|
|
||||||
<img src="https://source.unsplash.com/man-standing-in-front-of-door-dG4Eb_oC5iM" alt="" width="300">
|
|
||||||
<div>
|
|
||||||
<div style="display:flex; justify-content: space-between; font-weight: 600;">
|
|
||||||
<span>Outcast</span>
|
|
||||||
<span>$27.00</span>
|
|
||||||
</div>
|
|
||||||
<div style="font-size: small;">100% Cotton</div>
|
|
||||||
<div style="display:flex; justify-content: space-between; align-items: center;">
|
|
||||||
<span>Qty: 1</span>
|
|
||||||
<wa-button variant="text" size="small">Remove</wa-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<div slot="footer">
|
|
||||||
<div style="display:flex; justify-content: space-between; font-weight: 600;">
|
|
||||||
<span>Subtotal</span>
|
|
||||||
<span>$232.00</span>
|
|
||||||
</div>
|
|
||||||
<div style="font-size: small; margin-bottom: 1rem;">Shipping and taxes calculated at checkout.</div>
|
|
||||||
<wa-button size="medium" variant="brand" style="width: 100%; margin-bottom: 1rem;">Medium</wa-button>
|
|
||||||
or <a href="#">Continue shopping <wa-icon-button name="arrow-right" variant="solid" label="Settings"></wa-icon-button></a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</wa-card>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
|
|
||||||
|
|
||||||
.card-header [slot='header'] {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-header h3 {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-header wa-icon-button {
|
|
||||||
font-size: var(--wa-font-size-m);
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-item {
|
|
||||||
display: flex;
|
|
||||||
gap: 2rem;
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
|
|
||||||
&:not(:last-of-type) {
|
|
||||||
padding-bottom: 1rem;
|
|
||||||
border-bottom: 1px solid var(--border-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
img {
|
|
||||||
width: 6rem;
|
|
||||||
flex-grow: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
div {
|
|
||||||
flex-grow: 11;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
</style>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Two Column Cart
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<div class="two-column">
|
|
||||||
<h1>Shopping Cart</h1>
|
|
||||||
<div class="first-column">
|
|
||||||
<section class="cart-item">
|
|
||||||
<img class="cart-item-image" src="https://source.unsplash.com/white-crew-neck-t-shirt-acn5ERAeSb4" alt="" width="300">
|
|
||||||
<div class="cart-item-info">
|
|
||||||
<div class="cart-item-meta">
|
|
||||||
<div>
|
|
||||||
<span style="font-size: larger">Classic</span>
|
|
||||||
<div>White - L</div>
|
|
||||||
<span style="font-size: larger">$15.00</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<wa-select placeholder="1">
|
|
||||||
<wa-option value="option-1">1</wa-option>
|
|
||||||
<wa-option value="option-2">2</wa-option>
|
|
||||||
<wa-option value="option-3">3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
<wa-icon-button name="close" variant="solid" label="Settings"></wa-icon-button>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div style="display: flex;justify-content: flex-start;align-items: baseline;">
|
|
||||||
<wa-icon name="check" style="color: green; margin-right: 0.5rem;"></wa-icon> In Stock
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
<section class="cart-item">
|
|
||||||
<img class="cart-item-image" src="https://source.unsplash.com/blue-and-white-checkered-dress-shirt-RqYTuWkTdEs" alt="" width="300">
|
|
||||||
<div class="cart-item-info">
|
|
||||||
<div class="cart-item-meta">
|
|
||||||
<div>
|
|
||||||
<span style="font-size: larger">Button Up</span>
|
|
||||||
<div>Blue - L</div>
|
|
||||||
<span style="font-size: larger">$20.00</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<wa-select placeholder="1">
|
|
||||||
<wa-option value="option-1">1</wa-option>
|
|
||||||
<wa-option value="option-2">2</wa-option>
|
|
||||||
<wa-option value="option-3">3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
<wa-icon-button name="close" variant="solid" label="Settings"></wa-icon-button>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div style="display: flex;justify-content: flex-start;align-items: baseline;">
|
|
||||||
<wa-icon name="check" style="color: green; margin-right: 0.5rem;"></wa-icon> In Stock
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
<section class="cart-item">
|
|
||||||
<img class="cart-item-image" src="https://source.unsplash.com/white-and-blue-cat-printed-crew-neck-t-shirt-fEt6Wd4t4j0" alt="" width="300">
|
|
||||||
<div class="cart-item-info">
|
|
||||||
<div class="cart-item-meta">
|
|
||||||
<div>
|
|
||||||
<span style="font-size: larger">Kitten</span>
|
|
||||||
<div>Egg - L</div>
|
|
||||||
<span style="font-size: larger">$20.00</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<wa-select placeholder="1">
|
|
||||||
<wa-option value="option-1">1</wa-option>
|
|
||||||
<wa-option value="option-2">2</wa-option>
|
|
||||||
<wa-option value="option-3">3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
<wa-icon-button name="close" variant="solid" label="Settings"></wa-icon-button>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div style="display: flex;justify-content: flex-start;align-items: baseline;">
|
|
||||||
<wa-icon name="check" style="color: green; margin-right: 0.5rem;"></wa-icon> In Stock
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<wa-card class="card-header second-column">
|
|
||||||
<div slot="header">
|
|
||||||
Order Summary
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div style="display:flex; justify-content: space-between; border-bottom: 1px solid var(--border-color); padding-bottom: 1rem;">
|
|
||||||
<span>Subtotal</span>
|
|
||||||
<span>$55.00</span>
|
|
||||||
</div>
|
|
||||||
<div style="display:flex; justify-content: space-between; border-bottom: 1px solid var(--border-color); padding-bottom: 1rem;">
|
|
||||||
<span>Shipping</span>
|
|
||||||
<span>$5.00</span>
|
|
||||||
</div>
|
|
||||||
<div style="display:flex; justify-content: space-between; border-bottom: 1px solid var(--border-color); padding-bottom: 1rem;">
|
|
||||||
<span>Tax</span>
|
|
||||||
<span>$5.50</span>
|
|
||||||
</div>
|
|
||||||
<div style="display:flex; justify-content: space-between; border-bottom: 1px solid var(--border-color); padding-bottom: 1rem;">
|
|
||||||
<span>Order Total</span>
|
|
||||||
<span>$65.50</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<wa-button size="medium" variant="brand" style="width: 100%; margin-bottom: 1rem;">Checkout</wa-button>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</wa-card>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.two-column {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(12, 1fr);
|
|
||||||
column-gap: 1rem;
|
|
||||||
|
|
||||||
.first-column {
|
|
||||||
grid-column: 1/8;
|
|
||||||
}
|
|
||||||
|
|
||||||
.second-column {
|
|
||||||
grid-column: 8/14
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-item {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: 30% 61%;
|
|
||||||
column-gap: 0.5rem;
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
|
|
||||||
&:not(:last-of-type) {
|
|
||||||
padding-bottom: 1rem;
|
|
||||||
border-bottom: 1px solid rgb(48, 50, 59);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-item-meta {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: 45% 35% 20%;
|
|
||||||
column-gap: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
width: 100%;
|
|
||||||
grid-column: 1 / end;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Single Column Cart
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<div class="single-column">
|
|
||||||
<h1>Shopping Cart</h1>
|
|
||||||
<div class="first-half half">
|
|
||||||
<section class="cart-item">
|
|
||||||
<img class="cart-item-image" src="https://source.unsplash.com/black-convertible-coupe-0CZwuZhiC84" alt="" >
|
|
||||||
<div>
|
|
||||||
<span style="display: flex;justify-content: space-between;">
|
|
||||||
<span><strong>Convertible</strong></span>
|
|
||||||
<span>$32.00</span>
|
|
||||||
</span>
|
|
||||||
<div>Eggplant</div>
|
|
||||||
|
|
||||||
<div style="display: flex;justify-content: space-between;align-items: baseline;">
|
|
||||||
<span><wa-icon name="check" style="color: green; margin-right: 0.5rem;"></wa-icon> In Stock</span>
|
|
||||||
<wa-button variant="text" size="small">Remove</wa-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</section>
|
|
||||||
<section class="cart-item">
|
|
||||||
<img class="cart-item-image" src="https://source.unsplash.com/blue-open-door-pickup-truck-BCKgFzJbwz4" alt="" >
|
|
||||||
<div>
|
|
||||||
<span style="display: flex;justify-content: space-between;">
|
|
||||||
<span><strong>Pickup</strong></span>
|
|
||||||
<span>$32.00</span>
|
|
||||||
</span>
|
|
||||||
<div>Sky Blue</div>
|
|
||||||
|
|
||||||
<div style="display: flex;justify-content: space-between;align-items: baseline;">
|
|
||||||
<span><wa-icon name="check" style="color: green; margin-right: 0.5rem;"></wa-icon> In Stock</span>
|
|
||||||
<wa-button variant="text" size="small">Remove</wa-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</section>
|
|
||||||
<section class="cart-item">
|
|
||||||
<img class="cart-item-image" src="https://source.unsplash.com/red-and-white-volkswagen-t-2-scale-model-GlDRYsruYJ8" alt="" >
|
|
||||||
<div>
|
|
||||||
<span style="display: flex;justify-content: space-between;">
|
|
||||||
<span><strong>Volkswagon T2</strong></span>
|
|
||||||
<span>$32.00</span>
|
|
||||||
</span>
|
|
||||||
<div>Red/White</div>
|
|
||||||
|
|
||||||
<div style="display: flex;justify-content: space-between;align-items: baseline;">
|
|
||||||
<span><wa-icon name="check" style="color: green; margin-right: 0.5rem;"></wa-icon> In Stock</span>
|
|
||||||
<wa-button variant="text" size="small">Remove</wa-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</section>
|
|
||||||
<div slot="footer">
|
|
||||||
<div style="display:flex; justify-content: space-between; font-weight: 600;">
|
|
||||||
<span>Subtotal</span>
|
|
||||||
<span>$96.00</span>
|
|
||||||
</div>
|
|
||||||
<div style="font-size: small; margin-bottom: 1rem;">Shipping and taxes calculated at checkout.</div>
|
|
||||||
<wa-button size="medium" variant="brand" style="width: 100%; margin-bottom: 1rem;">Medium</wa-button>
|
|
||||||
or <a href="#">Continue shopping <wa-icon-button name="arrow-right" variant="solid" label="Settings"></wa-icon-button></a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<style>
|
|
||||||
.single-column {
|
|
||||||
.cart-item {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(12, 1fr);
|
|
||||||
column-gap: 1rem;
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
|
|
||||||
&:not(:last-of-type) {
|
|
||||||
padding-bottom: 1rem;
|
|
||||||
border-bottom: 1px solid rgb(48, 50, 59);
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
grid-column: 1/4;
|
|
||||||
width: 100%;
|
|
||||||
object-fit: cover;
|
|
||||||
height: 90px;
|
|
||||||
}
|
|
||||||
|
|
||||||
div {
|
|
||||||
grid-column: 4/-1;
|
|
||||||
align-content: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Product Quickview
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<wa-card class="card-header">
|
|
||||||
<div slot="header">
|
|
||||||
<strong>Quickview</strong>
|
|
||||||
<wa-icon-button name="close" variant="solid" label="Settings"></wa-icon-button>
|
|
||||||
</div>
|
|
||||||
<div style="
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: 35% 65%;
|
|
||||||
grid-column-gap: 1rem;
|
|
||||||
">
|
|
||||||
<img class="cart-item-image" src="https://source.unsplash.com/white-crew-neck-t-shirt-acn5ERAeSb4" alt="" width="300">
|
|
||||||
<div>
|
|
||||||
<h3>Quality Cotton Tee</h3>
|
|
||||||
<span>$45.00</span>
|
|
||||||
<div style="display: flex;justify-content: space-between;">
|
|
||||||
<wa-rating label="Rating" precision="0.5" value="2.5"></wa-rating>
|
|
||||||
<a href="#">See all ratings</a>
|
|
||||||
</div>
|
|
||||||
<wa-radio-group label="Color" name="a" value="1" style="margin-bottom: 1rem">
|
|
||||||
<wa-radio-button value="1">White</wa-radio-button>
|
|
||||||
<wa-radio-button value="2">Gray</wa-radio-button>
|
|
||||||
<wa-radio-button value="3">Black</wa-radio-button>
|
|
||||||
</wa-radio-group>
|
|
||||||
<wa-radio-group label="Size" name="a" value="1" style="margin-bottom: 1rem">
|
|
||||||
<wa-radio-button value="1">Small</wa-radio-button>
|
|
||||||
<wa-radio-button value="2">Medium</wa-radio-button>
|
|
||||||
<wa-radio-button value="3">Large</wa-radio-button>
|
|
||||||
</wa-radio-group>
|
|
||||||
<wa-button size="medium" variant="brand" style="width: 100%; margin: 1rem 0;">Add to Cart</wa-button>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</wa-card>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Product Review
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<div>
|
|
||||||
<div>
|
|
||||||
<h2>Customer Reviews</h2>
|
|
||||||
<div>
|
|
||||||
<wa-rating label="Rating" precision="0.5" value="2.5"></wa-rating> Based on 1624 reviews
|
|
||||||
</div>
|
|
||||||
<div style="margin-bottom: 2rem;">
|
|
||||||
<span><wa-progress-bar value="50"></wa-progress-bar></span>
|
|
||||||
<h3>Share your Thoughts</h3>
|
|
||||||
<p>If you’ve used this product, share your thoughts with other customers</p>
|
|
||||||
<wa-button size="medium">Write a Review</wa-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div style="margin-top: 1rem;">
|
|
||||||
<div>
|
|
||||||
<div style="border-bottom: 1px solid #eee; margin-bottom: 1rem;">
|
|
||||||
<span style="display: flex; align-items: center;">
|
|
||||||
<wa-avatar image="https://source.unsplash.com/bman-wearing-henley-top-portrait-7YVZYZeITc8" label="man-wearing-henley" style="margin-right: 1rem;"></wa-avatar>
|
|
||||||
<span style="display: flex; flex-direction: column">Mark Henry <wa-rating label="Rating" precision="0.5" value="2.5"></wa-rating></span>
|
|
||||||
</span>
|
|
||||||
<p><em>I initially had my doubts, but once I got the widgets and played around with them, I became a believer.</em></p>
|
|
||||||
</div>
|
|
||||||
<div style="border-bottom: 1px solid #eee; margin-bottom: 1rem;">
|
|
||||||
<span style="display: flex; align-items: center;">
|
|
||||||
<wa-avatar image="https://source.unsplash.com/woman-wearing-black-crew-neck-shirt-3TLl_97HNJo" label="lady-in-turtleneck" style="margin-right: 1rem;"></wa-avatar>
|
|
||||||
<span style="display: flex; flex-direction: column">Liz Michaels <wa-rating label="Rating" precision="0.5" value="2.5"></wa-rating></span>
|
|
||||||
</span>
|
|
||||||
<p><em>I'd definitely but these again.</em></p>
|
|
||||||
</div>
|
|
||||||
<div style="border-bottom: 1px solid #eee; margin-bottom: 1rem;">
|
|
||||||
<span style="display: flex; align-items: center;">
|
|
||||||
<wa-avatar image="https://source.unsplash.com/man-with-index-finger-on-lips-RukI4qZGlQs" label="man-with-hair" style="margin-right: 1rem;"></wa-avatar>
|
|
||||||
<span style="display: flex; flex-direction: column">Todd Smith <wa-rating label="Rating" precision="0.5" value="2.5"></wa-rating></span>
|
|
||||||
</span>
|
|
||||||
<p><em>It was everything I wanted and more, would totally recommend.</em></p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Order History
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<div>
|
|
||||||
<h2>Order History</h2>
|
|
||||||
<p>Check the status of recent orders, manage returns, and download invoices.</p>
|
|
||||||
<div class="order-history-meta">
|
|
||||||
<span class="order-history-meta-item">
|
|
||||||
<strong>Order number</strong>
|
|
||||||
<span>WU88191111</span>
|
|
||||||
</span>
|
|
||||||
<span class="order-history-meta-item">
|
|
||||||
<strong>Date placed</strong>
|
|
||||||
<span>January 22, 2021</span>
|
|
||||||
</span>
|
|
||||||
<span class="order-history-meta-item">
|
|
||||||
<strong>Total amount</strong>
|
|
||||||
<span>$95.00</span>
|
|
||||||
</span>
|
|
||||||
<span style="display: grid;grid-template-columns: 1fr 1fr;column-gap: 1rem;">
|
|
||||||
<wa-button variant="neutral" outline>View Order</wa-button>
|
|
||||||
<wa-button variant="neutral" outline>View Invoice</wa-button>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<div class="order-history-list-item" style="align-items: center;">
|
|
||||||
<img class="cart-item-image" src="https://source.unsplash.com/beige-wooden-bar-stool-4kTbAMRAHtQ" alt="">
|
|
||||||
<div>
|
|
||||||
<span style="display: flex;justify-content: space-between;">
|
|
||||||
<span><strong>Kitchen Stool</strong></span>
|
|
||||||
<span><strong>$55.00</strong></span>
|
|
||||||
</span>
|
|
||||||
<p>TODO: add a description</p>
|
|
||||||
<span>
|
|
||||||
<a href="#">View Product</a> | <a href="#">Buy Again</a>
|
|
||||||
</span>
|
|
||||||
<br/>
|
|
||||||
<span>Out for Delivery</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="order-history-list-item" style="margin-top: 1rem; align-items: center;">
|
|
||||||
<img class="cart-item-image" src="https://source.unsplash.com/green-succulent-in-teal-ceramic-vase-miziNqvJx5M" alt="">
|
|
||||||
<div>
|
|
||||||
<span style="display: flex;justify-content: space-between;">
|
|
||||||
<span><strong>Succulent</strong></span>
|
|
||||||
<span><strong>$5.00</strong></span>
|
|
||||||
</span>
|
|
||||||
<p>TODO: add a description</p>
|
|
||||||
<span>
|
|
||||||
<a href="#">View Product</a> | <a href="#">Buy Again</a>
|
|
||||||
</span>
|
|
||||||
<br/>
|
|
||||||
<span>Out for Delivery</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="order-history-list-item" style="margin-top: 1rem; align-items: center;">
|
|
||||||
<img class="cart-item-image" src="https://source.unsplash.com/battercreek-coffee-pack-rsnzc-8dVs0" alt="">
|
|
||||||
<div>
|
|
||||||
<span style="display: flex;justify-content: space-between;">
|
|
||||||
<span><strong>French Roast</strong></span>
|
|
||||||
<span><strong>$35.00</strong></span>
|
|
||||||
</span>
|
|
||||||
<p>TODO: add a description</p>
|
|
||||||
<span>
|
|
||||||
<a href="#">View Product</a> | <a href="#">Buy Again</a>
|
|
||||||
</span>
|
|
||||||
<br/>
|
|
||||||
<span>Out for Delivery</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<style>
|
|
||||||
.order-history-meta {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
|
|
||||||
.order-history-meta-item {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.order-history-list-item {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: 18% 79%;
|
|
||||||
column-gap: 1rem;
|
|
||||||
border-bottom: 1px solid #eee;
|
|
||||||
padding-bottom: 1rem;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Checkout
|
|
||||||
|
|
||||||
```html {.example}
|
|
||||||
<div class="checkout-form">
|
|
||||||
<div class="checkout-form-inputs">
|
|
||||||
<h4 class="full-row" style="margin-top: 0.5rem;">Contact Info</h4>
|
|
||||||
<wa-input type="email" label="Email Address" class="full-row"></wa-input>
|
|
||||||
<hr class="full-row" />
|
|
||||||
<h4 class="full-row" style="margin-top: 0.5rem;">Shipping Information</h4>
|
|
||||||
<wa-input label="First Name" class="first-half"></wa-input>
|
|
||||||
<wa-input label="Last Name" class="second-half" style="margin-top: 1.5rem;"></wa-input>
|
|
||||||
<wa-input label="Company" class="full-row" style="margin-top: 1.5rem;"></wa-input>
|
|
||||||
<wa-input label="Address" class="full-row" style="margin-top: 1.5rem;"></wa-input>
|
|
||||||
<wa-input label="City" class="first-half" style="margin-top: 1.5rem;"></wa-input>
|
|
||||||
<wa-select label="Country" placeholder="Country" class="second-half" style="margin-top: 1.5rem;">
|
|
||||||
<wa-option value="option-1">Option 1</wa-option>
|
|
||||||
<wa-option value="option-2">Option 2</wa-option>
|
|
||||||
<wa-option value="option-3">Option 3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
<wa-input label="State" class="first-half" style="margin-top: 1.5rem;"></wa-input>
|
|
||||||
<wa-input label="Postal Code" class="second-half" style="margin-top: 1.5rem;"></wa-input>
|
|
||||||
<wa-input label="Phone" class=" full-row" style="margin-top: 1.5rem;"></wa-input>
|
|
||||||
<hr class="full-row" />
|
|
||||||
<wa-radio-group label="Delivery Method" help-text="Select an option that makes you proud." name="a" value="1" class="full-row" style="margin-top: 1.5rem;">
|
|
||||||
<wa-radio-button value="1">Standard</wa-radio-button>
|
|
||||||
<wa-radio-button value="2">Express</wa-radio-button>
|
|
||||||
</wa-radio-group>
|
|
||||||
<hr class="full-row" />
|
|
||||||
<h4 class="full-row" style="margin-top: 0.5rem;">Payment</h4>
|
|
||||||
<wa-radio-group label="Select an option" name="a" value="1" class="full-row" style="margin-top: 1.5rem;">
|
|
||||||
<wa-radio value="1">Credit Card</wa-radio>
|
|
||||||
<wa-radio value="3">Paypal</wa-radio>
|
|
||||||
</wa-radio-group>
|
|
||||||
<wa-input label="Card Number" class="full-row" style="margin-top: 1.5rem;"></wa-input>
|
|
||||||
<wa-input label="Name on Card" class="full-row" style="margin-top: 1.5rem;"></wa-input>
|
|
||||||
<wa-input label="Expiration Date" class="first-half" style="margin-top: 1.5rem;"></wa-input>
|
|
||||||
<wa-input label="CVC" class="second-half" style="margin-top: 1.5rem;"></wa-input>
|
|
||||||
</div>
|
|
||||||
<div class="checkout-form-summary">
|
|
||||||
<h4>Order Summary</h4>
|
|
||||||
<wa-card class="card-basic">
|
|
||||||
<div class="summary-item">
|
|
||||||
<img src="https://source.unsplash.com/pair-of-white-and-orange-athletic-shoes-on-white-box-dwKiHoqqxk8">
|
|
||||||
<div class="summary-item-info">
|
|
||||||
<span style="display: flex; justify-content: space-between;">
|
|
||||||
<span class="item-heading">Dolce Runners</span>
|
|
||||||
<wa-icon-button name="trash" variant="solid" label="Settings"></wa-icon-button>
|
|
||||||
</span>
|
|
||||||
<span class="subtle">Cream/Seafoam</span>
|
|
||||||
<br />
|
|
||||||
<span class="subtle">12.5</span>
|
|
||||||
<span style="display:flex;justify-content: space-between; width: 100%;margin: 1rem 0 2rem;">
|
|
||||||
<span class="item-price">$0.00</span>
|
|
||||||
<wa-select placeholder="1" style="width: 70px; margin-left: auto">
|
|
||||||
<wa-option value="option-1">1</wa-option>
|
|
||||||
<wa-option value="option-2">2</wa-option>
|
|
||||||
<wa-option value="option-3">3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<hr style="grid-column: 1 / -1;">
|
|
||||||
</div>
|
|
||||||
<div class="summary-item">
|
|
||||||
<img src="https://source.unsplash.com/white-and-brown-nike-sneaker-LV_4qM5Gf9c">
|
|
||||||
<div class="summary-item-info">
|
|
||||||
<span style="display: flex; justify-content: space-between;">
|
|
||||||
<span class="item-heading">Dunk High</span>
|
|
||||||
<wa-icon-button name="trash" variant="solid" label="Settings"></wa-icon-button>
|
|
||||||
</span>
|
|
||||||
<span class="subtle">Sand/Amber/Black</span>
|
|
||||||
<br />
|
|
||||||
<span class="subtle">12.5</span>
|
|
||||||
<span style="display:flex;justify-content: space-between; width: 100%;margin: 1rem 0 2rem;">
|
|
||||||
<span class="item-price">$180.00</span>
|
|
||||||
<wa-select placeholder="1" style="width: 70px; margin-left: auto">
|
|
||||||
<wa-option value="option-1">1</wa-option>
|
|
||||||
<wa-option value="option-2">2</wa-option>
|
|
||||||
<wa-option value="option-3">3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<hr style="grid-column: 1 / -1;">
|
|
||||||
</div>
|
|
||||||
<div class="summary-item">
|
|
||||||
<img src="https://source.unsplash.com/black-and-white-new-balance-low-top-sneaker-6zO5VKogoZE">
|
|
||||||
<div class="summary-item-info">
|
|
||||||
<span style="display: flex; justify-content: space-between;">
|
|
||||||
<span class="item-heading">NB Runner</span>
|
|
||||||
<wa-icon-button name="trash" variant="solid" label="Settings"></wa-icon-button>
|
|
||||||
</span>
|
|
||||||
<span class="subtle">Forrest Green</span>
|
|
||||||
<br />
|
|
||||||
<span class="subtle">12.5</span>
|
|
||||||
<span style="display:flex;justify-content: space-between; width: 100%;margin: 1rem 0 2rem;">
|
|
||||||
<span class="item-price">$48.99</span>
|
|
||||||
<wa-select placeholder="1" style="width: 70px; margin-left: auto">
|
|
||||||
<wa-option value="option-1">1</wa-option>
|
|
||||||
<wa-option value="option-2">2</wa-option>
|
|
||||||
<wa-option value="option-3">3</wa-option>
|
|
||||||
</wa-select>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<hr style="grid-column: 1 / -1;">
|
|
||||||
</div>
|
|
||||||
<wa-button size="medium" variant="brand" style="width: 100%; margin-bottom: 1rem;">Confirm Order</wa-button>
|
|
||||||
</wa-card>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.checkout-form {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: 1fr;
|
|
||||||
grid-column-gap: 1rem;
|
|
||||||
|
|
||||||
.checkout-form-inputs {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(6, 1fr);
|
|
||||||
grid-column-gap: 1rem;
|
|
||||||
}
|
|
||||||
.summary-item {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(12, 1fr);
|
|
||||||
grid-column-gap: 1rem;
|
|
||||||
|
|
||||||
img {
|
|
||||||
grid-column: 1/4;
|
|
||||||
}
|
|
||||||
|
|
||||||
.summary-item-info {
|
|
||||||
grid-column: 4/12;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* & hr {
|
|
||||||
border-width: 1px;
|
|
||||||
margin: 1rem 0;
|
|
||||||
} */
|
|
||||||
.subtle {
|
|
||||||
font-size: small;
|
|
||||||
}
|
|
||||||
|
|
||||||
.item-heading {
|
|
||||||
font-size: large:
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Grid utilities */
|
|
||||||
|
|
||||||
.full-row {
|
|
||||||
grid-column: 1/-1
|
|
||||||
}
|
|
||||||
|
|
||||||
.first-half {
|
|
||||||
grid-column: 1/4
|
|
||||||
}
|
|
||||||
|
|
||||||
.second-half {
|
|
||||||
grid-column: 4/7
|
|
||||||
}
|
|
||||||
|
|
||||||
.first-third {
|
|
||||||
rid-column: 1/3
|
|
||||||
}
|
|
||||||
.second-third {
|
|
||||||
rid-column: 3/5
|
|
||||||
}
|
|
||||||
.last-third {
|
|
||||||
rid-column: 5/7
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
```
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
title: Entertainment
|
|
||||||
description: TODO
|
|
||||||
---
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
title: Membership
|
|
||||||
description: TODO
|
|
||||||
---
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
title: News
|
|
||||||
description: TODO
|
|
||||||
---
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
title: Non-profit
|
|
||||||
description: TODO
|
|
||||||
---
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
title: Portfolio
|
|
||||||
description: TODO
|
|
||||||
---
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
title: Product Landing
|
|
||||||
description: TODO
|
|
||||||
---
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
---
|
|
||||||
title: Community
|
|
||||||
description: Web Awesome has a growing community of designers and developers that are building amazing things with web components.
|
|
||||||
layout: page.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
Web Awesome has a growing community of designers and developers that are building amazing things with web components. We'd love for you to become a part of it!
|
|
||||||
|
|
||||||
Please be respectful of other users and remember that Web Awesome is an open source project. We'll try to help when we can, but there's no guarantee we'll be able solve your problem. Please manage your expectations and don't forget to contribute back to the conversation when you can!
|
|
||||||
|
|
||||||
## Discussion Forum
|
|
||||||
|
|
||||||
The [discussion forum](https://github.com/shoelace-style/shoelace/discussions) is open to anyone with a GitHub account. This is the best place to:
|
|
||||||
|
|
||||||
- Ask for help
|
|
||||||
- Share ideas and get feedback
|
|
||||||
- Show the community what you're working on
|
|
||||||
- Learn more about the project, its values, and its roadmap
|
|
||||||
|
|
||||||
<wa-button variant="brand" href="https://github.com/shoelace-style/shoelace/discussions" target="_blank" style="margin-block-end: var(--wa-flow-spacing);">
|
|
||||||
<wa-icon name="github" family="brands" slot="prefix"></wa-icon>
|
|
||||||
Join the Discussion
|
|
||||||
</wa-button>
|
|
||||||
|
|
||||||
## Community Chat
|
|
||||||
|
|
||||||
The [community chat](https://discord.gg/mg8f26C) is open to the public and powered by [Discord](https://discord.com/). This is a good place to:
|
|
||||||
|
|
||||||
- Ask for help
|
|
||||||
- Share ideas and get feedback
|
|
||||||
- Show the community what you're working on
|
|
||||||
- Chat live with other designers, developers, and Web Awesome fans
|
|
||||||
|
|
||||||
<wa-button variant="brand" href="https://discord.gg/mg8f26C" target="_blank" style="margin-block-end: var(--wa-flow-spacing);">
|
|
||||||
<wa-icon name="discord" family="brands" slot="prefix"></wa-icon>
|
|
||||||
Join the Chat
|
|
||||||
</wa-button>
|
|
||||||
|
|
||||||
## Twitter
|
|
||||||
|
|
||||||
Follow [@webawesomer](https://twitter.com/webawesomer) on Twitter for general updates and announcements about Web Awesome. This is a great place to say "hi" or to share something you're working on.
|
|
||||||
|
|
||||||
**Please avoid using Twitter for support questions.** The [discussion forum](https://github.com/shoelace-style/shoelace/discussions) is a much better place to share code snippets, screenshots, and other troubleshooting info. You'll have much better luck there, as more users will have a chance to help you.
|
|
||||||
|
|
||||||
<wa-button variant="brand" href="https://twitter.com/webawesomer" target="_blank" style="margin-block-end: var(--wa-flow-spacing);">
|
|
||||||
<wa-icon name="twitter" family="brands" slot="prefix"></wa-icon>
|
|
||||||
Follow on Twitter
|
|
||||||
</wa-button>
|
|
||||||
@@ -1,150 +0,0 @@
|
|||||||
---
|
|
||||||
title: Themes
|
|
||||||
description: Everything you need to know about theming Web Awesome.
|
|
||||||
layout: page.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
Web Awesome is designed to be highly customizable through pure CSS. Out of the box, you can choose from a light or dark theme. Alternatively, you can design your own theme.
|
|
||||||
|
|
||||||
A theme is nothing more than a stylesheet that uses the Web Awesome API to define design tokens and apply custom styles to components. To create a theme, you will need a decent understanding of CSS, including [CSS Custom Properties](https://developer.mozilla.org/en-US/docs/Web/CSS/--*) and the [`::part` selector](https://developer.mozilla.org/en-US/docs/Web/CSS/::part).
|
|
||||||
|
|
||||||
:::info
|
|
||||||
For component developers, built-in themes are also available as JavaScript modules that export [Lit CSSResult](https://lit.dev/docs/api/styles/#CSSResult) objects. You can find them in `/%NPMDIR%/themes/*.styles.js`.
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Theme Basics
|
|
||||||
|
|
||||||
All themes are scoped to classes using the `wa-theme-{name}` convention, where `{name}` is a lowercase, hyphen-delimited value representing the name of the theme. The included light and dark themes use `wa-theme-default-light` and `wa-theme-default-dark`, respectively. A custom theme called "Purple Power", for example, would use a class called `wa-theme-purple-power`
|
|
||||||
|
|
||||||
All selectors must be scoped to the theme's class to ensure interoperability with other themes. You should also scope them to `:host` so they can be imported and applied to custom element shadow roots.
|
|
||||||
|
|
||||||
```css
|
|
||||||
:host,
|
|
||||||
.wa-theme-purple-power {
|
|
||||||
/* ... */
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Activating Themes
|
|
||||||
|
|
||||||
To activate a theme, import it and apply the theme's class to the `<html>` element. This example imports and activates the built-in dark theme.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<html class="wa-theme-default-dark">
|
|
||||||
<head>
|
|
||||||
<link rel="stylesheet" href="path/to/shoelace/%NPMDIR%/themes/dark.css" />
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
...
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
```
|
|
||||||
|
|
||||||
:::info
|
|
||||||
There is one exception to this rule — the light theme _does not_ need to be activated. For convenience, the light theme is scoped to `:root` and will be activated by default when imported.
|
|
||||||
:::
|
|
||||||
|
|
||||||
### Using Multiple Themes
|
|
||||||
|
|
||||||
You can activate themes on various containers throughout the page. This example uses the light theme with a dark-themed sidebar.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<link rel="stylesheet" href="path/to/shoelace/%NPMDIR%/themes/default.css" />
|
|
||||||
<link rel="stylesheet" href="path/to/shoelace/%NPMDIR%/themes/dark.css" />
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<nav class="wa-theme-default-dark">
|
|
||||||
<!-- dark-themed sidebar -->
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<!-- light-themed content -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
```
|
|
||||||
|
|
||||||
It's for this reason that themes must be scoped to specific classes.
|
|
||||||
|
|
||||||
## Creating Themes
|
|
||||||
|
|
||||||
There are two ways to create themes. The easiest way is to customize a built-in theme. The advanced way is to create a new theme from scratch. Which method you choose depends on your project's requirements and the amount of effort you're willing to commit to.
|
|
||||||
|
|
||||||
### Customizing a Built-in Theme
|
|
||||||
|
|
||||||
The easiest way to customize Web Awesome is to override one of the built-in themes. You can do this by importing the light or dark theme as-is, then creating a separate stylesheet that overrides [design tokens](/getting-started/customizing#design-tokens) and adds [component styles](/getting-started/customizing#component-parts) to your liking. You must import your theme _after_ the built-in theme.
|
|
||||||
|
|
||||||
If you're customizing the light theme, you should scope your styles to the following selectors.
|
|
||||||
|
|
||||||
```css
|
|
||||||
:root,
|
|
||||||
:host,
|
|
||||||
.wa-theme-default-light {
|
|
||||||
/* your custom styles here */
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
If you're customizing the dark theme, you should scope your styles to the following selectors.
|
|
||||||
|
|
||||||
```css
|
|
||||||
:host,
|
|
||||||
.wa-theme-default-dark {
|
|
||||||
/* your custom styles here */
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
By customizing a built-in theme, you'll maintain a smaller stylesheet containing only the changes you've made. Contrast this to [creating a new theme](#creating-a-new-theme), where you need to explicitly define every design token required by the library. This approach is more "future-proof," as new design tokens that emerge in subsequent versions of Web Awesome will be accounted for by the built-in theme.
|
|
||||||
|
|
||||||
While this approach is easier to maintain, the drawback is that your theme can't be activated independently — it's tied to the built-in theme you're extending.
|
|
||||||
|
|
||||||
### Creating a New Theme
|
|
||||||
|
|
||||||
Creating a new theme is more of an undertaking than [customizing an existing one](#customizing-a-built-in-theme). At a minimum, you must implement all of the required design tokens. The easiest way to do this is by "forking" one of the built-in themes and modifying it from there.
|
|
||||||
|
|
||||||
Start by changing the selector to match your theme's name. Assuming your new theme is called "Purple Power", your theme should be scoped like this.
|
|
||||||
|
|
||||||
```css
|
|
||||||
:host,
|
|
||||||
.wa-theme-purple-power {
|
|
||||||
/* your custom styles here */
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
By creating a new theme, you won't be relying on a built-in theme as a foundation. Because the theme is decoupled from the built-ins, you can activate it independently as an alternative to the built-ins. This is the recommended approach if you're looking to open source your theme for others to use.
|
|
||||||
|
|
||||||
You will, however, need to maintain your theme more carefully, as new versions of Web Awesome may introduce new design tokens that your theme won't have accounted for. Because of this, it's recommended that you clearly specify which version(s) of Web Awesome your theme is designed to work with and keep it up to date as new versions of Web Awesome are released.
|
|
||||||
|
|
||||||
## Dark Theme
|
|
||||||
|
|
||||||
The built-in dark theme uses an inverted color scale so, if you're using design tokens as intended, you'll get dark mode for free. While this isn't the same as a professionally curated dark theme, it provides an excellent baseline for one and you're encouraged to customize it depending on your needs.
|
|
||||||
|
|
||||||
The dark theme works by taking the light theme's [color tokens](/tokens/color) and "flipping" the scale so 100 becomes 900, 200 becomes 800, 300 becomes 700, etc. Next, the luminance of each primitive was fine-tuned to avoid true black, which is often undesirable in dark themes, and provide a richer experience. The result is a custom dark palette that complements the light theme and makes it easy to offer light and dark modes with minimal effort.
|
|
||||||
|
|
||||||
To install the dark theme, add the following to the `<head>` section of your page.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<link
|
|
||||||
rel="stylesheet"
|
|
||||||
href="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@%VERSION%/%CDNDIR%/themes/dark.css"
|
|
||||||
/>
|
|
||||||
```
|
|
||||||
|
|
||||||
To activate the theme, apply the `wa-theme-default-dark` class to the `<html>` element.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<html class="wa-theme-default-dark">
|
|
||||||
...
|
|
||||||
</html>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Detecting the User's Color Scheme Preference
|
|
||||||
|
|
||||||
Web Awesome doesn't try to auto-detect the user's light/dark mode preference. This should be done at the application level. As a best practice, to provide a dark theme in your app, you should:
|
|
||||||
|
|
||||||
- Check for [`prefers-color-scheme`](https://stackoverflow.com/a/57795495/567486) and use its value by default
|
|
||||||
- Allow the user to override the setting in your app
|
|
||||||
- Remember the user's preference and restore it on subsequent logins
|
|
||||||
|
|
||||||
Web Awesome avoids using the `prefers-color-scheme` media query because not all apps support dark mode, and it would break things for the ones that don't.
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
---
|
|
||||||
title: Web Awesome
|
|
||||||
description: Build better with Web Awesome, the open source library of web components from Font Awesome.
|
|
||||||
layout: page.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
This is the homepage. It will soon look awesome. Until then, click the button. 👇
|
|
||||||
|
|
||||||
<wa-button variant="brand" href="/docs/components/button">Go somewhere</wa-button>
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
export default {
|
export default {
|
||||||
'*.{js,ts,json,html,xml,css,scss,sass,md}': 'cspell --no-must-find-files',
|
'*.{js,ts,json,html,xml,css,scss,sass,md}': 'cspell --no-must-find-files',
|
||||||
'src/**/*.{js,ts}': 'eslint --max-warnings 0 --fix',
|
'src/**/*.{js,ts}': 'eslint --max-warnings 0 --fix',
|
||||||
'*': 'prettier --write --ignore-unknown'
|
'*': 'prettier --write --ignore-unknown',
|
||||||
};
|
};
|
||||||
|
|||||||
6796
package-lock.json
generated
127
package.json
@@ -1,142 +1,87 @@
|
|||||||
{
|
{
|
||||||
"name": "@shoelace-style/shoelace",
|
"name": "@webawesome/monorepo",
|
||||||
|
"private": true,
|
||||||
"description": "A forward-thinking library of web components.",
|
"description": "A forward-thinking library of web components.",
|
||||||
"version": "2.8.0",
|
"version": "3.0.0-alpha.13",
|
||||||
"homepage": "https://github.com/shoelace-style/shoelace",
|
"homepage": "https://webawesome.com/",
|
||||||
"author": "Web Awesome",
|
"author": "Web Awesome",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"customElements": "dist/custom-elements.json",
|
|
||||||
"web-types": "./dist/web-types.json",
|
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"types": "dist/webawesome.d.ts",
|
"workspaces": [
|
||||||
"jsdelivr": "./cdn/autoloader.js",
|
"packages/*"
|
||||||
"exports": {
|
|
||||||
".": {
|
|
||||||
"types": "./dist/webawesome.d.ts",
|
|
||||||
"import": "./dist/webawesome.js"
|
|
||||||
},
|
|
||||||
"./dist/custom-elements.json": "./dist/custom-elements.json",
|
|
||||||
"./dist/webawesome.js": "./dist/webawesome.js",
|
|
||||||
"./dist/autoloader.js": "./dist/autoloader.js",
|
|
||||||
"./dist/themes/*": "./dist/themes/*",
|
|
||||||
"./dist/components/*": "./dist/components/*",
|
|
||||||
"./dist/utilities/*": "./dist/utilities/*",
|
|
||||||
"./dist/react": "./dist/react/index.js",
|
|
||||||
"./dist/react/*": "./dist/react/*",
|
|
||||||
"./dist/translations/*": "./dist/translations/*"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"dist",
|
|
||||||
"cdn"
|
|
||||||
],
|
],
|
||||||
"keywords": [
|
|
||||||
"web components",
|
|
||||||
"custom elements",
|
|
||||||
"components"
|
|
||||||
],
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/shoelace-style/shoelace.git"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/shoelace-style/shoelace/issues"
|
|
||||||
},
|
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node scripts/build.js --develop",
|
"check-updates": "npx npm-check-updates --interactive --format group",
|
||||||
"build": "node scripts/build.js",
|
"start": "cd packages/webawesome && npm run start",
|
||||||
"create": "plop --plopfile scripts/plop/plopfile.js",
|
"start:pro": "cd packages/webawesome-pro && npm run start"
|
||||||
"prepare": "npm i --ignore-scripts && npx playwright install",
|
|
||||||
"test": "web-test-runner --group default",
|
|
||||||
"test:component": "web-test-runner -- --watch --group",
|
|
||||||
"test:watch": "web-test-runner --watch --group default",
|
|
||||||
"lint": "eslint src --max-warnings 0",
|
|
||||||
"lint:fix": "eslint src --max-warnings 0 --fix",
|
|
||||||
"prettier": "prettier --check --log-level=warn .",
|
|
||||||
"prettier:fix": "prettier --write --log-level=warn .",
|
|
||||||
"spellcheck": "cspell \"**/*.{js,ts,json,html,css,md}\" --no-progress",
|
|
||||||
"verify": "npm run prettier && npm run lint && npm run build && npm run test",
|
|
||||||
"prepublishOnly": "npm run verify"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=14.17.0"
|
"node": ">=14.17.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
|
||||||
"@ctrl/tinycolor": "^4.0.2",
|
|
||||||
"@floating-ui/dom": "^1.5.3",
|
|
||||||
"@shoelace-style/animations": "^1.1.0",
|
|
||||||
"@shoelace-style/localize": "^3.1.2",
|
|
||||||
"composed-offset-position": "^0.0.4",
|
|
||||||
"lit": "^3.0.0",
|
|
||||||
"qr-creator": "^1.0.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@11ty/eleventy": "3.0.0-alpha.5",
|
"@11ty/eleventy": "3.0.0",
|
||||||
"@custom-elements-manifest/analyzer": "^0.9.4",
|
"@custom-elements-manifest/analyzer": "^0.10.4",
|
||||||
"@lit/react": "^1.0.0",
|
"@lit-labs/eleventy-plugin-lit": "^1.0.3",
|
||||||
|
"@lit-labs/testing": "^0.2.5",
|
||||||
|
"@lit/react": "^1.0.8",
|
||||||
"@open-wc/testing": "^3.2.0",
|
"@open-wc/testing": "^3.2.0",
|
||||||
"@types/mocha": "^10.0.2",
|
"@types/mocha": "^10.0.10",
|
||||||
"@types/react": "^18.2.28",
|
"@types/react": "^18.2.28",
|
||||||
"@typescript-eslint/eslint-plugin": "^6.7.5",
|
|
||||||
"@typescript-eslint/parser": "^6.7.5",
|
|
||||||
"@web/dev-server-esbuild": "^0.3.6",
|
"@web/dev-server-esbuild": "^0.3.6",
|
||||||
"@web/test-runner": "^0.18.1",
|
"@web/test-runner": "^0.19.0",
|
||||||
"@web/test-runner-commands": "^0.9.0",
|
"@web/test-runner-commands": "^0.9.0",
|
||||||
"@web/test-runner-playwright": "^0.11.0",
|
"@web/test-runner-playwright": "^0.11.0",
|
||||||
"browser-sync": "^2.29.3",
|
"browser-sync": "^2.29.3",
|
||||||
"chalk": "^5.3.0",
|
"chalk": "^5.3.0",
|
||||||
"change-case": "^4.1.2",
|
"change-case": "^4.1.2",
|
||||||
"chokidar": "^3.5.3",
|
"chokidar": "^3.5.3",
|
||||||
|
"colorjs.io": "^0.6.0-alpha.1",
|
||||||
"command-line-args": "^5.2.1",
|
"command-line-args": "^5.2.1",
|
||||||
"comment-parser": "^1.4.0",
|
"comment-parser": "^1.4.1",
|
||||||
"cspell": "^6.18.1",
|
"cspell": "^6.18.1",
|
||||||
"custom-element-jet-brains-integration": "^1.4.0",
|
"custom-element-jet-brains-integration": "^1.6.2",
|
||||||
"custom-element-vs-code-integration": "^1.2.1",
|
"custom-element-vs-code-integration": "^1.4.1",
|
||||||
"custom-element-vuejs-integration": "^1.0.0",
|
"custom-element-vuejs-integration": "^1.3.3",
|
||||||
"del": "^7.1.0",
|
"del": "^7.1.0",
|
||||||
"download": "^8.0.0",
|
"download": "^8.0.0",
|
||||||
"esbuild": "^0.19.4",
|
"esbuild": "0.23.1",
|
||||||
"esbuild-plugin-replace": "^1.4.0",
|
"esbuild-plugin-replace": "^1.4.0",
|
||||||
"eslint": "^8.51.0",
|
|
||||||
"eslint-plugin-chai-expect": "^3.0.0",
|
|
||||||
"eslint-plugin-chai-friendly": "^0.7.2",
|
|
||||||
"eslint-plugin-import": "^2.28.1",
|
|
||||||
"eslint-plugin-lit": "^1.9.1",
|
|
||||||
"eslint-plugin-lit-a11y": "^4.1.0",
|
|
||||||
"eslint-plugin-markdown": "^3.0.1",
|
|
||||||
"eslint-plugin-sort-imports-es6-autofix": "^0.6.0",
|
|
||||||
"eslint-plugin-wc": "^2.0.4",
|
|
||||||
"front-matter": "^4.0.2",
|
"front-matter": "^4.0.2",
|
||||||
"get-port": "^7.0.0",
|
"get-port": "^7.1.0",
|
||||||
"globby": "^13.2.2",
|
"globby": "^13.2.2",
|
||||||
"husky": "^8.0.3",
|
"husky": "^8.0.3",
|
||||||
"lint-staged": "^14.0.1",
|
"lint-staged": "^14.0.1",
|
||||||
"lunr": "^2.3.9",
|
"lunr": "^2.3.9",
|
||||||
"markdown-it": "^14.1.0",
|
"markdown-it": "^14.1.0",
|
||||||
"markdown-it-attrs": "^4.1.6",
|
"markdown-it-attrs": "^4.3.0",
|
||||||
"markdown-it-container": "^3.0.0",
|
"markdown-it-container": "^3.0.0",
|
||||||
"markdown-it-ins": "^3.0.1",
|
"markdown-it-ins": "^3.0.1",
|
||||||
"markdown-it-kbd": "^2.2.2",
|
"markdown-it-kbd": "^2.2.2",
|
||||||
"markdown-it-mark": "^3.0.1",
|
"markdown-it-mark": "^3.0.1",
|
||||||
"marked": "^11.1.0",
|
"marked": "^11.1.0",
|
||||||
"node-html-parser": "^6.1.13",
|
"node-html-parser": "^6.1.13",
|
||||||
"ora": "^8.0.1",
|
"npm-check-updates": "^17.1.11",
|
||||||
|
"ora": "^8.1.1",
|
||||||
"pascal-case": "^3.1.2",
|
"pascal-case": "^3.1.2",
|
||||||
"playwright": "^1.42.0",
|
"playwright": "^1.49.1",
|
||||||
"plop": "^4.0.0",
|
"plop": "^4.0.1",
|
||||||
"prettier": "^3.0.3",
|
"prettier": "^3.4.2",
|
||||||
|
"prettier-plugin-organize-imports": "^4.1.0",
|
||||||
"prismjs": "^1.29.0",
|
"prismjs": "^1.29.0",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"recursive-copy": "^2.0.14",
|
"recursive-copy": "^2.0.14",
|
||||||
"sinon": "^16.1.0",
|
"sinon": "^16.1.0",
|
||||||
"source-map": "^0.7.4",
|
"source-map": "^0.7.4",
|
||||||
"tslib": "^2.6.2",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.2.2",
|
"typescript": "^5.7.2",
|
||||||
"user-agent-data-types": "^0.3.1",
|
"user-agent-data-types": "^0.4.2",
|
||||||
"uuid": "^9.0.1"
|
"uuid": "^9.0.1"
|
||||||
},
|
},
|
||||||
|
"overrides": {
|
||||||
|
"playwright": "^1.49.1"
|
||||||
|
},
|
||||||
"lint-staged": {
|
"lint-staged": {
|
||||||
"*.{ts,js}": [
|
"*.{ts,js}": [
|
||||||
"eslint --max-warnings 0 --cache --fix",
|
|
||||||
"prettier --write"
|
"prettier --write"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
4
packages/webawesome/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
_site
|
||||||
|
dist
|
||||||
|
dist-cdn
|
||||||
|
src/react
|
||||||
7
packages/webawesome/LICENSE.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
Copyright (c) 2025 Fonticons, Inc.
|
||||||
|
|
||||||
|
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.
|
||||||
1
packages/webawesome/README.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Visit our documentation! <https://webawesome.com>
|
||||||
@@ -1,13 +1,17 @@
|
|||||||
|
import { jsxTypesPlugin } from '@wc-toolkit/jsx-types';
|
||||||
import { customElementJetBrainsPlugin } from 'custom-element-jet-brains-integration';
|
import { customElementJetBrainsPlugin } from 'custom-element-jet-brains-integration';
|
||||||
import { customElementVsCodePlugin } from 'custom-element-vs-code-integration';
|
import { customElementVsCodePlugin } from 'custom-element-vs-code-integration';
|
||||||
import { customElementVuejsPlugin } from 'custom-element-vuejs-integration';
|
// import { customElementVuejsPlugin } from 'custom-element-vuejs-integration';
|
||||||
import { parse } from 'comment-parser';
|
import { parse } from 'comment-parser';
|
||||||
import { pascalCase } from 'pascal-case';
|
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
|
import * as path from 'node:path';
|
||||||
|
import { pascalCase } from 'pascal-case';
|
||||||
|
import * as url from 'url';
|
||||||
|
const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
||||||
|
|
||||||
const packageData = JSON.parse(fs.readFileSync('./package.json', 'utf8'));
|
const packageData = JSON.parse(fs.readFileSync(path.join(__dirname, 'package.json'), 'utf8'));
|
||||||
const { name, description, version, author, homepage, license } = packageData;
|
const { name, description, version, author, homepage, license } = packageData;
|
||||||
const outdir = 'dist';
|
const outdir = 'dist-cdn';
|
||||||
|
|
||||||
function replace(string, terms) {
|
function replace(string, terms) {
|
||||||
terms.forEach(({ from, to }) => {
|
terms.forEach(({ from, to }) => {
|
||||||
@@ -28,7 +32,7 @@ export default {
|
|||||||
name: 'wa-package-data',
|
name: 'wa-package-data',
|
||||||
packageLinkPhase({ customElementsManifest }) {
|
packageLinkPhase({ customElementsManifest }) {
|
||||||
customElementsManifest.package = { name, description, version, author, homepage, license };
|
customElementsManifest.package = { name, description, version, author, homepage, license };
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
// Parse custom jsDoc tags
|
// Parse custom jsDoc tags
|
||||||
@@ -83,13 +87,13 @@ export default {
|
|||||||
classDoc[t.tag].push({
|
classDoc[t.tag].push({
|
||||||
name: t.name,
|
name: t.name,
|
||||||
description: t.description,
|
description: t.description,
|
||||||
type: t.type || undefined
|
type: t.type || undefined,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -109,7 +113,7 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -127,7 +131,7 @@ export default {
|
|||||||
//
|
//
|
||||||
const terms = [
|
const terms = [
|
||||||
{ from: /^src\//, to: '' }, // Strip the src/ prefix
|
{ from: /^src\//, to: '' }, // Strip the src/ prefix
|
||||||
{ from: /\.(t|j)sx?$/, to: '.js' } // Convert .ts to .js
|
{ from: /\.(t|j)sx?$/, to: '.js' }, // Convert .ts to .js
|
||||||
];
|
];
|
||||||
|
|
||||||
mod.path = replace(mod.path, terms);
|
mod.path = replace(mod.path, terms);
|
||||||
@@ -146,7 +150,7 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
// Generate custom VS Code data
|
// Generate custom VS Code data
|
||||||
@@ -156,22 +160,33 @@ export default {
|
|||||||
referencesTemplate: (_, tag) => [
|
referencesTemplate: (_, tag) => [
|
||||||
{
|
{
|
||||||
name: 'Documentation',
|
name: 'Documentation',
|
||||||
url: `https://shoelace.style/components/${tag.replace('wa-', '')}`
|
url: `https://webawesome.com/docs/components/${tag.replace('wa-', '')}`,
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
// Generate custom JetBrains data
|
||||||
customElementJetBrainsPlugin({
|
customElementJetBrainsPlugin({
|
||||||
outdir: './dist',
|
outdir: './dist-cdn',
|
||||||
excludeCss: true,
|
excludeCss: true,
|
||||||
packageJson: false,
|
packageJson: false,
|
||||||
referencesTemplate: (_, tag) => {
|
referencesTemplate: (_, tag) => {
|
||||||
return {
|
return {
|
||||||
name: 'Documentation',
|
name: 'Documentation',
|
||||||
url: `https://shoelace.style/components/${tag.replace('wa-', '')}`
|
url: `https://webawesome.com/docs/components/${tag.replace('wa-', '')}`,
|
||||||
};
|
};
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
|
|
||||||
|
// Generate JSX types (see https://wc-toolkit.com/integrations/jsx/)
|
||||||
|
jsxTypesPlugin({
|
||||||
|
fileName: 'custom-elements-jsx.d.ts',
|
||||||
|
outdir,
|
||||||
|
defaultExport: true,
|
||||||
|
componentTypePath: (_name, _tag, modulePath) => {
|
||||||
|
return `./${modulePath}`;
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
|
||||||
//
|
//
|
||||||
// TODO - figure out why this broke when events were updated
|
// TODO - figure out why this broke when events were updated
|
||||||
@@ -181,5 +196,5 @@ export default {
|
|||||||
// fileName: 'index.d.ts',
|
// fileName: 'index.d.ts',
|
||||||
// componentTypePath: (_, tag) => `../../components/${tag.replace('wa-', '')}/${tag.replace('wa-', '')}.js`
|
// componentTypePath: (_, tag) => `../../components/${tag.replace('wa-', '')}/${tag.replace('wa-', '')}.js`
|
||||||
// })
|
// })
|
||||||
]
|
],
|
||||||
};
|
};
|
||||||
376
packages/webawesome/docs/.eleventy.js
Normal file
@@ -0,0 +1,376 @@
|
|||||||
|
import { nanoid } from 'nanoid';
|
||||||
|
import { parse as HTMLParse } from 'node-html-parser';
|
||||||
|
import * as fs from 'node:fs';
|
||||||
|
import * as path from 'node:path';
|
||||||
|
import { anchorHeadingsTransformer } from './_transformers/anchor-headings.js';
|
||||||
|
import { codeExamplesTransformer } from './_transformers/code-examples.js';
|
||||||
|
import { copyCodeTransformer } from './_transformers/copy-code.js';
|
||||||
|
import { currentLinkTransformer } from './_transformers/current-link.js';
|
||||||
|
import { highlightCodeTransformer } from './_transformers/highlight-code.js';
|
||||||
|
import { outlineTransformer } from './_transformers/outline.js';
|
||||||
|
import { getComponents } from './_utils/manifest.js';
|
||||||
|
import { markdown } from './_utils/markdown.js';
|
||||||
|
import { SimulateWebAwesomeApp } from './_utils/simulate-webawesome-app.js';
|
||||||
|
// import { formatCodePlugin } from './_plugins/format-code.js';
|
||||||
|
// import litPlugin from '@lit-labs/eleventy-plugin-lit';
|
||||||
|
import { readFile } from 'fs/promises';
|
||||||
|
import process from 'process';
|
||||||
|
import * as url from 'url';
|
||||||
|
import { replaceTextPlugin } from './_plugins/replace-text.js';
|
||||||
|
import { searchPlugin } from './_plugins/search.js';
|
||||||
|
const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
||||||
|
const isDev = process.argv.includes('--develop');
|
||||||
|
const passThroughExtensions = ['js', 'css', 'png', 'svg', 'jpg', 'mp4'];
|
||||||
|
|
||||||
|
async function getPackageData() {
|
||||||
|
return JSON.parse(await readFile(path.join(__dirname, '..', 'package.json'), 'utf-8'));
|
||||||
|
}
|
||||||
|
|
||||||
|
export default async function (eleventyConfig) {
|
||||||
|
const docsDir = path.join(process.env.BASE_DIR || '.', 'docs');
|
||||||
|
let packageData = await getPackageData();
|
||||||
|
let allComponents = getComponents();
|
||||||
|
|
||||||
|
const distDir = process.env.UNBUNDLED_DIST_DIRECTORY || path.resolve(__dirname, '../dist');
|
||||||
|
const customElementsManifest = path.join(distDir, 'custom-elements.json');
|
||||||
|
const stylesheets = path.join(distDir, 'styles');
|
||||||
|
|
||||||
|
eleventyConfig.addWatchTarget(customElementsManifest);
|
||||||
|
eleventyConfig.setWatchThrottleWaitTime(10); // in milliseconds
|
||||||
|
|
||||||
|
eleventyConfig.on('eleventy.beforeWatch', async function (changedFiles) {
|
||||||
|
let updatePackageData = false;
|
||||||
|
let updateComponentData = false;
|
||||||
|
changedFiles.forEach(file => {
|
||||||
|
if (file.includes('package.json')) {
|
||||||
|
updatePackageData = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file.includes('custom-elements.json')) {
|
||||||
|
updateComponentData = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (updatePackageData) {
|
||||||
|
packageData = await getPackageData();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (updateComponentData) {
|
||||||
|
allComponents = getComponents();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If you plan to add or remove any of these extensions, make sure to let either Konnor or Cory know as these
|
||||||
|
* passthrough extensions will also need to be updated in the Web Awesome App.
|
||||||
|
*/
|
||||||
|
const passThrough = [...passThroughExtensions.map(ext => path.join(docsDir, '**/*.' + ext))];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the guard we use for now to make sure our final built files don't need a 2nd pass by the server. This keeps
|
||||||
|
* us able to still deploy the bare HTML files on Vercel until the app is ready.
|
||||||
|
*/
|
||||||
|
const serverBuild = process.env.WEBAWESOME_SERVER === 'true';
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set all global template data here
|
||||||
|
//
|
||||||
|
eleventyConfig.addGlobalData('package', packageData);
|
||||||
|
eleventyConfig.addGlobalData('layout', 'page.njk');
|
||||||
|
eleventyConfig.addGlobalData('server', {
|
||||||
|
head: '',
|
||||||
|
loginOrAvatar: '',
|
||||||
|
flashes: '',
|
||||||
|
});
|
||||||
|
|
||||||
|
// Site metadata for social sharing (Open Graph, canonical URLs, etc.)
|
||||||
|
const siteMetadata = {
|
||||||
|
url: 'https://webawesome.com',
|
||||||
|
name: 'Web Awesome',
|
||||||
|
description: 'Build better with Web Awesome, the open source library of web components from Font Awesome.',
|
||||||
|
image: 'https://webawesome.com/assets/images/open-graph/default.png',
|
||||||
|
};
|
||||||
|
|
||||||
|
// Title composition/stripping config - single source of truth
|
||||||
|
const SITE_NAME = siteMetadata.name;
|
||||||
|
const SITE_TITLE_SEPARATORS = ['|'];
|
||||||
|
|
||||||
|
// Helper to escape user-provided strings for safe use inside RegExp sources
|
||||||
|
const escapeRegExp = string => (string + '').replace(/[.*+?^${}()|[\\]\\]/g, '\\$&');
|
||||||
|
|
||||||
|
// Precompute a reusable regex to strip a trailing site name suffix from titles, e.g. " | Web Awesome"
|
||||||
|
// Supports configured separators and flexible whitespace. This keeps search titles clean and improves Lunr scoring
|
||||||
|
const siteNameEscapedForRegex = escapeRegExp(SITE_NAME);
|
||||||
|
const separatorsEscaped = SITE_TITLE_SEPARATORS.map(s => escapeRegExp(s)).join('');
|
||||||
|
const siteTitleSuffixPattern = new RegExp(`\\s*[${separatorsEscaped}]\\s*${siteNameEscapedForRegex}$`);
|
||||||
|
|
||||||
|
// Helper to remove the site suffix from a page title. Keep this in sync with how page titles
|
||||||
|
// are composed (see eleventyComputed.pageTitle) so search indexing stays consistent
|
||||||
|
const stripSiteTitleSuffix = title => (title || '').replace(siteTitleSuffixPattern, '');
|
||||||
|
|
||||||
|
// Helper to compose a full page title with site suffix when appropriate
|
||||||
|
// Uses the same separator set as the stripping logic for consistency
|
||||||
|
const composePageTitle = baseTitle => {
|
||||||
|
const title = baseTitle || SITE_NAME;
|
||||||
|
const preferredSeparator = SITE_TITLE_SEPARATORS[0] || '|';
|
||||||
|
return title !== SITE_NAME ? `${title} ${preferredSeparator} ${SITE_NAME}` : title;
|
||||||
|
};
|
||||||
|
|
||||||
|
eleventyConfig.addGlobalData('siteMetadata', siteMetadata);
|
||||||
|
|
||||||
|
// Template filters - {{ content | filter }}
|
||||||
|
eleventyConfig.addFilter('inlineMarkdown', content => markdown.renderInline(content || ''));
|
||||||
|
eleventyConfig.addFilter('markdown', content => markdown.render(content || ''));
|
||||||
|
eleventyConfig.addFilter('stripExtension', string => path.parse(string + '').name);
|
||||||
|
eleventyConfig.addFilter('stripPrefix', content => content.replace(/^wa-/, ''));
|
||||||
|
eleventyConfig.addFilter('uniqueId', (_value, length = 8) => nanoid(length));
|
||||||
|
|
||||||
|
eleventyConfig.addGlobalData('eleventyComputed', {
|
||||||
|
// Page title with smart + default site name formatting
|
||||||
|
pageTitle: data => composePageTitle(data.title),
|
||||||
|
// Open Graph title with smart + default site name formatting
|
||||||
|
ogTitle: data => composePageTitle(data.ogTitle || data.title),
|
||||||
|
ogDescription: data => data.ogDescription || data.description,
|
||||||
|
ogImage: data => data.ogImage || siteMetadata.image,
|
||||||
|
ogUrl: data => {
|
||||||
|
if (data.ogUrl) return data.ogUrl;
|
||||||
|
const url = data.page?.url || '';
|
||||||
|
return url ? `${siteMetadata.url}${url}` : siteMetadata.url;
|
||||||
|
},
|
||||||
|
ogType: data => data.ogType || 'website',
|
||||||
|
});
|
||||||
|
|
||||||
|
// Trims whitespace and pipes from the start and end of a string. Useful for CEM types, which can be pipe-delimited.
|
||||||
|
// With Prettier 3, this means a leading pipe will exist be present when the line wraps.
|
||||||
|
eleventyConfig.addFilter('trimPipes', content => {
|
||||||
|
return typeof content === 'string' ? content.replace(/^(\s|\|)/g, '').replace(/(\s|\|)$/g, '') : content;
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @example
|
||||||
|
{% set foo = {foo: "bar"} %}
|
||||||
|
{% set bar = {bar: "baz"} %}
|
||||||
|
{% set merged = foo | merge(bar) %}
|
||||||
|
{{ merged | dump }}
|
||||||
|
*/
|
||||||
|
eleventyConfig.addFilter('merge', function (obj1, obj2) {
|
||||||
|
return Object.assign({}, obj1, obj2);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Custom filter to sort with a priority item first, e.g.
|
||||||
|
// {{ collection | sortWithFirst('fileSlug', 'default') }} => the item with the fileSlug of 'default' will be first
|
||||||
|
eleventyConfig.addFilter('sortWithFirst', function (collection, property, firstValue) {
|
||||||
|
const items = [...collection]; // Create a copy to avoid mutating original
|
||||||
|
return items.sort((a, b) => {
|
||||||
|
const aValue = property ? a[property] : a;
|
||||||
|
const bValue = property ? b[property] : b;
|
||||||
|
if (aValue === firstValue) return -1;
|
||||||
|
if (bValue === firstValue) return 1;
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
//
|
||||||
|
// Add the componentPages collection
|
||||||
|
//
|
||||||
|
eleventyConfig.addCollection('componentPages', function (collectionApi) {
|
||||||
|
const componentPages = collectionApi.getFilteredByGlob(
|
||||||
|
path.join(eleventyConfig.directories.input, 'docs/components/**/*.md'),
|
||||||
|
);
|
||||||
|
|
||||||
|
return componentPages.map(page => {
|
||||||
|
const componentName = path.basename(page.inputPath, '.md');
|
||||||
|
const tagName = `wa-${componentName}`;
|
||||||
|
const component = allComponents.find(c => c.tagName === tagName);
|
||||||
|
|
||||||
|
// Add component to the page's data
|
||||||
|
if (component) {
|
||||||
|
page.data.component = component;
|
||||||
|
}
|
||||||
|
|
||||||
|
return page;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Shortcodes - {% shortCode arg1, arg2 %}
|
||||||
|
eleventyConfig.addShortcode('cdnUrl', location => {
|
||||||
|
// We use WA (free) via the public CDN for CodePen examples
|
||||||
|
return (
|
||||||
|
`https://cdn.jsdelivr.net/npm/@awesome.me/webawesome@${packageData.version}/dist-cdn/` +
|
||||||
|
(location || '').replace(/^\//, '')
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Turns `{% server "foo" %} into `{{ server.foo | safe }}` when the WEBAWESOME_SERVER variable is set to "true"
|
||||||
|
eleventyConfig.addShortcode('server', function (property) {
|
||||||
|
if (serverBuild) {
|
||||||
|
return `{{ server.${property} | safe }}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
// Paired shortcodes - {% shortCode %}content{% endShortCode %}
|
||||||
|
eleventyConfig.addPairedShortcode('markdown', content => markdown.render(content || ''));
|
||||||
|
|
||||||
|
// Helpers
|
||||||
|
eleventyConfig.addNunjucksGlobal('getComponent', tagName => {
|
||||||
|
const component = allComponents.find(c => c.tagName === tagName);
|
||||||
|
if (!component) {
|
||||||
|
throw new Error(
|
||||||
|
`Unable to find "<${tagName}>". Make sure the file name is the same as the tag name (without prefix).`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return component;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Use our own markdown instance
|
||||||
|
eleventyConfig.setLibrary('md', markdown);
|
||||||
|
|
||||||
|
// for files with `unpublished: true`, it will make sure they do not make it into the final build at all, but will be usable in development.
|
||||||
|
eleventyConfig.addPreprocessor('unpublished', '*', (data, content) => {
|
||||||
|
if (data.unpublished && process.env.ELEVENTY_RUN_MODE === 'build') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return content;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add anchors to headings
|
||||||
|
eleventyConfig.addTransform('doc-transforms', function (content) {
|
||||||
|
let doc = HTMLParse(content, { blockTextElements: { code: true } });
|
||||||
|
|
||||||
|
const transformers = [
|
||||||
|
anchorHeadingsTransformer({ container: '#content' }),
|
||||||
|
outlineTransformer({
|
||||||
|
container: '#content',
|
||||||
|
target: '.outline-links',
|
||||||
|
selector: 'h2, h3',
|
||||||
|
ifEmpty: doc => {
|
||||||
|
doc.querySelector('#outline')?.remove();
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
// Add current link classes
|
||||||
|
currentLinkTransformer(),
|
||||||
|
codeExamplesTransformer(),
|
||||||
|
highlightCodeTransformer(),
|
||||||
|
copyCodeTransformer(),
|
||||||
|
];
|
||||||
|
|
||||||
|
for (const transformer of transformers) {
|
||||||
|
transformer.call(this, doc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return doc.toString();
|
||||||
|
});
|
||||||
|
|
||||||
|
eleventyConfig.addPlugin(
|
||||||
|
replaceTextPlugin([
|
||||||
|
{
|
||||||
|
replace: /\[version\]/gs,
|
||||||
|
replaceWith: packageData.version,
|
||||||
|
},
|
||||||
|
// Replace [issue:1234] with a link to the issue on GitHub
|
||||||
|
{
|
||||||
|
replace: /\[pr:([0-9]+)\]/gs,
|
||||||
|
replaceWith: '<a href="https://github.com/shoelace-style/webawesome/pull/$1" target="_blank">#$1</a>',
|
||||||
|
},
|
||||||
|
// Replace [pr:1234] with a link to the pull request on GitHub
|
||||||
|
{
|
||||||
|
replace: /\[issue:([0-9]+)\]/gs,
|
||||||
|
replaceWith: '<a href="https://github.com/shoelace-style/webawesome/issues/$1" target="_blank">#$1</a>',
|
||||||
|
},
|
||||||
|
// Replace [discuss:1234] with a link to the discussion on GitHub
|
||||||
|
{
|
||||||
|
replace: /\[discuss:([0-9]+)\]/gs,
|
||||||
|
replaceWith: '<a href="https://github.com/shoelace-style/webawesome/discussions/$1" target="_blank">#$1</a>',
|
||||||
|
},
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Build the search index
|
||||||
|
eleventyConfig.addPlugin(
|
||||||
|
searchPlugin({
|
||||||
|
filename: '',
|
||||||
|
selectorsToIgnore: ['code.example'],
|
||||||
|
// Use <title> but strip a trailing site name suffix for cleaner search results
|
||||||
|
getTitle: doc => {
|
||||||
|
const raw = doc.querySelector('title')?.textContent ?? '';
|
||||||
|
return stripSiteTitleSuffix(raw);
|
||||||
|
},
|
||||||
|
getContent: doc => doc.querySelector('#content')?.textContent ?? '',
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Production-only plugins
|
||||||
|
//
|
||||||
|
// TODO - disabled because it takes about a minute to run now
|
||||||
|
//
|
||||||
|
// if (!isDev) {
|
||||||
|
// // Run Prettier on each file (prod only because it can be slow)
|
||||||
|
// eleventyConfig.addPlugin(formatCodePlugin());
|
||||||
|
// }
|
||||||
|
|
||||||
|
// This needs to happen in "eleventy.after" otherwise incremental builds never update.
|
||||||
|
eleventyConfig.on('eleventy.after', function () {
|
||||||
|
const baseDir = process.env.BASE_DIR || 'docs';
|
||||||
|
let assetsDir = path.join(baseDir, 'assets');
|
||||||
|
const siteAssetsDir = path.join(eleventyConfig.directories.output, 'assets');
|
||||||
|
fs.cpSync(assetsDir, siteAssetsDir, { recursive: true });
|
||||||
|
|
||||||
|
// Passthrough copy for manifest.json (PWA manifest file)
|
||||||
|
fs.cpSync(path.join(baseDir, 'manifest.json'), path.join(eleventyConfig.directories.output, 'manifest.json'));
|
||||||
|
});
|
||||||
|
|
||||||
|
for (let glob of passThrough) {
|
||||||
|
eleventyConfig.addPassthroughCopy(glob);
|
||||||
|
}
|
||||||
|
|
||||||
|
// // SSR plugin
|
||||||
|
// if (!isDev) {
|
||||||
|
// //
|
||||||
|
// // Problematic components in SSR land:
|
||||||
|
// // - animation (breaks on navigation + ssr with Turbo)
|
||||||
|
// // - mutation-observer (why SSR this?)
|
||||||
|
// // - resize-observer (why SSR this?)
|
||||||
|
// // - tooltip (why SSR this?)
|
||||||
|
// //
|
||||||
|
// const omittedModules = [];
|
||||||
|
// const componentModules = componentList
|
||||||
|
// .filter(component => !omittedModules.includes(component.tagName.split(/wa-/)[1]))
|
||||||
|
// .map(component => {
|
||||||
|
// const name = component.tagName.split(/wa-/)[1];
|
||||||
|
// const componentDirectory = process.env.UNBUNDLED_DIST_DIRECTORY || path.join('.', 'dist');
|
||||||
|
// return path.join(componentDirectory, 'components', name, `${name}.js`);
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// eleventyConfig.addPlugin(litPlugin, {
|
||||||
|
// mode: 'worker',
|
||||||
|
// componentModules,
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
|
||||||
|
// For a server build, we expect a server to run the second transform.
|
||||||
|
// For dev builds, we run the second transform in a middleware.
|
||||||
|
if (!isDev && !serverBuild) {
|
||||||
|
eleventyConfig.addTransform('simulate-webawesome-app', function (content) {
|
||||||
|
// Only run the transform on files nunjucks would transform.
|
||||||
|
if (!this.page.inputPath.match(/.(md|html|njk)$/)) {
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** This largely mimics what an app would do and just stubs out what we don't care about. */
|
||||||
|
return SimulateWebAwesomeApp(content);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const config = {
|
||||||
|
markdownTemplateEngine: 'njk',
|
||||||
|
dir: {
|
||||||
|
input: 'docs',
|
||||||
|
includes: '_includes',
|
||||||
|
layouts: '_layouts',
|
||||||
|
},
|
||||||
|
templateFormats: ['njk', 'md'],
|
||||||
|
};
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: Not Found
|
title: Not Found
|
||||||
description: Sorry, I couldn't find that.
|
description: Sorry, I couldn't find that.
|
||||||
layout: page.njk
|
layout: page
|
||||||
permalink: 404.html
|
permalink: 404.html
|
||||||
noindex: true
|
noindex: true
|
||||||
---
|
---
|
||||||
312
packages/webawesome/docs/503.md
Normal file
@@ -0,0 +1,312 @@
|
|||||||
|
---
|
||||||
|
title: Web Awesome is Undergoing Maintenance
|
||||||
|
description: We're performing routine maintenance to keep things running smoothly. Check back soon!
|
||||||
|
layout: blank
|
||||||
|
permalink: 503.html
|
||||||
|
noindex: true
|
||||||
|
unlisted: true
|
||||||
|
---
|
||||||
|
|
||||||
|
{% block head %}
|
||||||
|
|
||||||
|
<link id="site-stylesheet" rel="stylesheet" href="/assets/styles/theme-site.css" />
|
||||||
|
<link id="site-stylesheet" rel="stylesheet" href="/assets/styles/site.css" />
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--scene-vertical-offset: calc(var(--wa-space-2xs) * -1);
|
||||||
|
--wa-font-family-heading: cera-round-pro;
|
||||||
|
--vehicle-offset: 25ch;
|
||||||
|
--vehicle-duration: 20s;
|
||||||
|
--vehicle-start: calc(-1 * var(--vehicle-offset));
|
||||||
|
--vehicle-end: calc(100% + var(--vehicle-offset));
|
||||||
|
}
|
||||||
|
|
||||||
|
html, wa-page {
|
||||||
|
background-color: var(--wa-color-surface-lowered);
|
||||||
|
}
|
||||||
|
|
||||||
|
wa-icon[name='traffic-cone'] {
|
||||||
|
--primary-color: var(--wa-color-brand-70);
|
||||||
|
--secondary-color: var(--wa-color-text-normal);
|
||||||
|
--secondary-opacity: 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
wa-page.background-grid {
|
||||||
|
--grid-line-color: color-mix(in oklab, var(--wa-color-text-normal), transparent 96%);
|
||||||
|
--subgrid-line-color: color-mix(in oklab, var(--wa-color-text-normal), transparent 98%);
|
||||||
|
}
|
||||||
|
|
||||||
|
wa-page > [slot='main-footer'] {
|
||||||
|
border-block-end: var(--wa-border-style) calc(var(--wa-border-width-l) * 10) var(--wa-color-text-normal);
|
||||||
|
padding: 0;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-content {
|
||||||
|
margin-inline: auto;
|
||||||
|
max-width: var(--content-width-l);
|
||||||
|
padding-inline: var(--content-padding-inline);
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-brand-logo {
|
||||||
|
font-size: var(--wa-font-size-xl);
|
||||||
|
color: var(--wa-brand-orange);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* centering main-content */
|
||||||
|
wa-page::part(main-content) {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content {
|
||||||
|
max-width: var(--content-width-m);
|
||||||
|
padding-inline: var(--content-padding-inline);
|
||||||
|
margin-inline: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.heading-stacked-subtitle {
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.heading-stacked-subtitle wa-icon {
|
||||||
|
position: relative;
|
||||||
|
inset-block-start: calc(var(--wa-space-3xs) * -0.75);
|
||||||
|
font-size: 0.75em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.heading-stacked-subtitle wa-icon[name="traffic-cone"] {
|
||||||
|
--secondary-color: var(--wa-color-text-normal);
|
||||||
|
--primary-color: var(--wa-color-brand-70);
|
||||||
|
margin-inline: calc(var(--wa-space-xs) * -1.15) calc(var(--wa-space-xs) * -0.75);
|
||||||
|
}
|
||||||
|
|
||||||
|
.copy {
|
||||||
|
code {
|
||||||
|
font-size: 0.75em;
|
||||||
|
}
|
||||||
|
|
||||||
|
strong {
|
||||||
|
text-decoration: underline;
|
||||||
|
text-decoration-color: var(--wa-color-brand-70);
|
||||||
|
text-decoration-thickness: var(--wa-border-width-m);
|
||||||
|
text-underline-offset: var(--wa-space-2xs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.status {
|
||||||
|
width: 100%;
|
||||||
|
--min-column-size: 30ch;
|
||||||
|
|
||||||
|
wa-callout {
|
||||||
|
background-color: var(--wa-color-surface-default);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.linkies {
|
||||||
|
/* nudge those linkies left */
|
||||||
|
margin-inline-start: calc(var(--wa-space-xs) * -1);
|
||||||
|
|
||||||
|
a {
|
||||||
|
padding-inline: var(--wa-space-xs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.scene {
|
||||||
|
width: 100%;
|
||||||
|
position: relative;
|
||||||
|
overflow-x: clip;
|
||||||
|
inset-block-end: var(--scene-vertical-offset);
|
||||||
|
|
||||||
|
.vehicle {
|
||||||
|
position: absolute;
|
||||||
|
inset-inline-start: var(--vehicle-start);
|
||||||
|
inset-block-end: 0; /* align all vehicles to bottom */
|
||||||
|
animation: driveAcross var(--vehicle-duration) linear infinite;
|
||||||
|
transform-origin: center;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vehicle-with-object {
|
||||||
|
white-space: nowrap;
|
||||||
|
display: flex;
|
||||||
|
align-items: baseline;
|
||||||
|
gap: var(--wa-space-3xs);
|
||||||
|
}
|
||||||
|
|
||||||
|
.scene-left {
|
||||||
|
position: absolute;
|
||||||
|
inset-block-end: 0;
|
||||||
|
inset-inline-start: var(--wa-space-l);
|
||||||
|
}
|
||||||
|
|
||||||
|
.scene-left wa-icon[name='toilet-portable'] {
|
||||||
|
position: relative;
|
||||||
|
inset-block-start: var(--scene-vertical-offset);
|
||||||
|
margin-inline: calc(var(--wa-space-xs) * -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.scene-left wa-icon[name='traffic-cone'] {
|
||||||
|
position: relative;
|
||||||
|
inset-block-start: var(--scene-vertical-offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
.blocks {
|
||||||
|
position: absolute;
|
||||||
|
inset-inline-end: calc(var(--wa-space-l) * -1);
|
||||||
|
inset-block-end: 0;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blocks wa-icon[name='block-brick'] {
|
||||||
|
margin-inline: calc(var(--wa-space-xs) * -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.blocks-bottom {
|
||||||
|
margin-block-start: calc(var(--wa-space-2xs) * -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
wa-icon[family='duotone'] {
|
||||||
|
--secondary-opacity: 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
wa-icon[name='bulldozer'],
|
||||||
|
wa-icon[name='excavator'] {
|
||||||
|
--secondary-color: var(--wa-color-brand-70);
|
||||||
|
}
|
||||||
|
|
||||||
|
wa-icon[name='block-brick'],
|
||||||
|
wa-icon[name='toilet-portable'] {
|
||||||
|
--secondary-color: var(--wa-color-neutral-70);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes driveAcross {
|
||||||
|
0% {
|
||||||
|
left: var(--vehicle-start);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
left: var(--vehicle-end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Unique rumble animations for each vehicle type */
|
||||||
|
@keyframes rumble-bulldozer {
|
||||||
|
0%, 100% { transform: translateY(0px) rotate(0deg); }
|
||||||
|
25% { transform: translateY(-1px) rotate(0.5deg); }
|
||||||
|
50% { transform: translateY(1px) rotate(-0.3deg); }
|
||||||
|
75% { transform: translateY(-0.5px) rotate(0.2deg); }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Apply rumble animation to the single vehicle */
|
||||||
|
.vehicle-driving { animation: driveAcross var(--vehicle-duration) linear infinite; }
|
||||||
|
.vehicle wa-icon[name="bulldozer"] { animation: rumble-bulldozer 0.1s ease-in-out infinite; }
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<wa-page disable-sticky="header" class="background-grid">
|
||||||
|
<header slot="header">
|
||||||
|
<div class="header-content wa-split" style="flex-wrap: nowrap;">
|
||||||
|
<wa-icon variant="brands" name="web-awesome" class="icon-brand-logo"></wa-icon>
|
||||||
|
<div>
|
||||||
|
<wa-button id="contact-us-button" appearance="plain" href="mailto:hello@webawesome.com?subject=Help%2C%20Web%20Awesome">
|
||||||
|
<wa-icon variant="regular" name="headset" label="Need help? Contact Us" class="icon-embiggen"></wa-icon>
|
||||||
|
</wa-button>
|
||||||
|
<wa-tooltip for="contact-us-button" aria-hidden="true">Contact Us</wa-tooltip>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<main id="content">
|
||||||
|
<div class="content-container wa-stack wa-gap-xl wa-align-items-center">
|
||||||
|
<h1 class="brand-font wa-stack wa-gap-s heading heading-stacked" style="text-align: center;">
|
||||||
|
<span class="wa-heading-l heading-stacked-subtitle">
|
||||||
|
under
|
||||||
|
<span class="wa-visually-hidden">maintenance</span>
|
||||||
|
<span aria-hidden="true">
|
||||||
|
m
|
||||||
|
<wa-icon family="duotone" variant="solid" name="traffic-cone"></wa-icon>
|
||||||
|
inten
|
||||||
|
<wa-icon family="duotone" variant="solid" name="traffic-cone"></wa-icon>
|
||||||
|
nce
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
<span class="wa-heading-4xl heading-stacked-title">Hey! We're Workin' Here</span>
|
||||||
|
</h1>
|
||||||
|
<p class="copy wa-body-l line-length line-length-m" style="text-align: center;">Mind the <code>wa-gap</code>! webawesome.com is undergoing maintenance and will be back shortly.</p>
|
||||||
|
<div class="wa-grid wa-gap-xl status">
|
||||||
|
<wa-callout appearance="plain" variant="neutral">
|
||||||
|
<wa-icon slot="icon" family="duotone" variant="regular" name="diamond-exclamation" class="icon-embiggen" style="--secondary-opacity: 1; --secondary-color: var(--wa-color-warning-fill-normal);"></wa-icon>
|
||||||
|
<strong>Temporarily Unavailable</strong><br />
|
||||||
|
Access to Docs, Accounts, and Teams
|
||||||
|
</wa-callout>
|
||||||
|
<wa-callout appearance="plain" variant="neutral">
|
||||||
|
<wa-icon slot="icon" family="duotone" variant="regular" name="bolt" class="icon-embiggen" style="--secondary-opacity: 1; --secondary-color: var(--wa-color-success-fill-normal);"></wa-icon>
|
||||||
|
<strong>Fully Operational</strong><br />
|
||||||
|
Services (such as CDNs) and Support
|
||||||
|
</wa-callout>
|
||||||
|
</div>
|
||||||
|
<div class="wa-cluster wa-gap-xs linkies">
|
||||||
|
<h2 class="wa-visually-hidden">Web Awesome Elsewhere</h2>
|
||||||
|
<a href="https://github.com/shoelace-style/webawesome" rel="noopener noreferrer" target="_blank" class="appearance-plain">
|
||||||
|
<wa-icon family="brands" name="github" label="GitHub"></wa-icon>
|
||||||
|
</a>
|
||||||
|
<a href="https://bsky.app/profile/webawesome.com" rel="noopener noreferrer" target="_blank" class="appearance-plain">
|
||||||
|
<wa-icon family="brands" name="bluesky" label="Bluesky"></wa-icon>
|
||||||
|
</a>
|
||||||
|
<a href="https://mastodon.social/@webawesome" rel="noopener noreferrer" target="_blank" class="appearance-plain">
|
||||||
|
<wa-icon family="brands" name="mastodon" label="Mastodon"></wa-icon>
|
||||||
|
</a>
|
||||||
|
<a href="https://x.com/webawesomer" rel="noopener noreferrer" target="_blank" class="appearance-plain">
|
||||||
|
<wa-icon family="brands" name="x-twitter" label="Twitter (X)"></wa-icon>
|
||||||
|
</a>
|
||||||
|
<a href="https://www.threads.com/@web.awesome" rel="noopener noreferrer" target="_blank" class="appearance-plain">
|
||||||
|
<wa-icon family="brands" name="threads" label="Threads"></wa-icon>
|
||||||
|
</a>
|
||||||
|
<a href="mailto:hello@webawesome.com?subject=Help%2C%20Web%20Awesome" class="appearance-plain">
|
||||||
|
<wa-icon variant="regular" name="envelope" label="Email Web Awesome"></wa-icon>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
<div slot="main-footer" class="footer">
|
||||||
|
<div class="scene">
|
||||||
|
<div class="scene-left wa-cluster wa-align-items-end">
|
||||||
|
<wa-icon family="duotone" variant="solid" name="traffic-cone"></wa-icon>
|
||||||
|
<div class="wa-cluster wa-gap-0">
|
||||||
|
<wa-icon family="duotone" variant="regular" name="toilet-portable" class="wa-font-size-2xl"></wa-icon>
|
||||||
|
<wa-icon family="duotone" variant="regular" name="toilet-portable" class="wa-font-size-2xl"></wa-icon>
|
||||||
|
<wa-icon family="duotone" variant="regular" name="toilet-portable" class="wa-font-size-2xl"></wa-icon>
|
||||||
|
</div>
|
||||||
|
<wa-icon family="duotone" variant="regular" name="excavator" class="wa-font-size-3xl"></wa-icon>
|
||||||
|
<wa-icon family="duotone" variant="solid" name="traffic-cone"></wa-icon>
|
||||||
|
</div>
|
||||||
|
<div class="blocks wa-stack wa-align-items-center wa-gap-0">
|
||||||
|
<div class="blocks-top wa-cluster wa-gap-0">
|
||||||
|
<wa-icon family="duotone" variant="regular" name="block-brick" class="wa-font-size-2xl"></wa-icon>
|
||||||
|
<wa-icon family="duotone" variant="regular" name="block-brick" class="wa-font-size-2xl"></wa-icon>
|
||||||
|
<wa-icon family="duotone" variant="regular" name="block-brick" class="wa-font-size-2xl"></wa-icon>
|
||||||
|
</div>
|
||||||
|
<div class="blocks-bottom wa-cluster wa-gap-0">
|
||||||
|
<wa-icon family="duotone" variant="regular" name="block-brick" class="wa-font-size-2xl"></wa-icon>
|
||||||
|
<wa-icon family="duotone" variant="regular" name="block-brick" class="wa-font-size-2xl"></wa-icon>
|
||||||
|
<wa-icon family="duotone" variant="regular" name="block-brick" class="wa-font-size-2xl"></wa-icon>
|
||||||
|
<wa-icon family="duotone" variant="regular" name="block-brick" class="wa-font-size-2xl"></wa-icon>
|
||||||
|
<wa-icon family="duotone" variant="regular" name="block-brick" class="wa-font-size-2xl"></wa-icon>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="track">
|
||||||
|
<wa-icon family="duotone" variant="regular" name="bulldozer" class="spacer-dot-gif wa-font-size-3xl" style="opacity: 0;"></wa-icon>
|
||||||
|
<span class="vehicle vehicle-driving vehicle-with-object">
|
||||||
|
<wa-icon family="duotone" variant="regular" name="bulldozer" class="wa-font-size-3xl"></wa-icon>
|
||||||
|
<wa-icon family="duotone" variant="regular" name="block-brick" class="wa-font-size-2xl" style="position: relative; inset-inline-start: calc(var(--wa-space-2xs) * -1);"></wa-icon>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</wa-page>
|
||||||
738
packages/webawesome/docs/_data/themer.js
Normal file
@@ -0,0 +1,738 @@
|
|||||||
|
/**
|
||||||
|
* All themes used in the themer.
|
||||||
|
*/
|
||||||
|
export const themes = [
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// #region Default
|
||||||
|
//
|
||||||
|
name: 'Default',
|
||||||
|
description: 'Your trusty companion, like a perfectly broken-in pair of jeans.',
|
||||||
|
filename: 'default.css',
|
||||||
|
isPro: false,
|
||||||
|
fonts: {
|
||||||
|
body: {
|
||||||
|
name: 'OS Default (sans-serif)',
|
||||||
|
css: 'ui-sans-serif, system-ui, sans-serif',
|
||||||
|
href: null,
|
||||||
|
},
|
||||||
|
heading: {
|
||||||
|
name: 'OS Default (sans-serif)',
|
||||||
|
css: 'ui-sans-serif, system-ui, sans-serif',
|
||||||
|
href: null,
|
||||||
|
},
|
||||||
|
code: {
|
||||||
|
name: 'OS Default (monospace)',
|
||||||
|
css: 'ui-monospace, monospace',
|
||||||
|
href: null,
|
||||||
|
},
|
||||||
|
longform: {
|
||||||
|
name: 'OS Default (serif)',
|
||||||
|
css: 'ui-serif, serif',
|
||||||
|
href: null,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
icons: {
|
||||||
|
family: 'classic',
|
||||||
|
weight: 1,
|
||||||
|
},
|
||||||
|
palette: {
|
||||||
|
name: 'Default',
|
||||||
|
filename: 'default.css',
|
||||||
|
},
|
||||||
|
colorBrand: {
|
||||||
|
color: 'blue',
|
||||||
|
},
|
||||||
|
tokens: {
|
||||||
|
// Fonts
|
||||||
|
'--wa-font-family-body': 'ui-sans-serif, system-ui, sans-serif',
|
||||||
|
'--wa-font-family-heading': 'var(--wa-font-family-body)',
|
||||||
|
'--wa-font-family-code': 'ui-monospace, monospace',
|
||||||
|
'--wa-font-family-longform': 'ui-serif, serif',
|
||||||
|
'--wa-font-weight-body': 400,
|
||||||
|
'--wa-font-weight-heading': 600,
|
||||||
|
'--wa-font-weight-code': 400,
|
||||||
|
'--wa-font-weight-longform': 400,
|
||||||
|
|
||||||
|
// Elements
|
||||||
|
'--wa-border-radius-scale': 1,
|
||||||
|
'--wa-space-scale': 1,
|
||||||
|
'--wa-border-width-scale': 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
//
|
||||||
|
// #region Awesome
|
||||||
|
//
|
||||||
|
{
|
||||||
|
name: 'Awesome',
|
||||||
|
description: 'Punchy and vibrant, the rock star of themes.',
|
||||||
|
filename: 'awesome.css',
|
||||||
|
isPro: false,
|
||||||
|
fonts: {
|
||||||
|
body: {
|
||||||
|
name: 'Quicksand',
|
||||||
|
css: 'Quicksand, sans-serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Quicksand:wght@300..700&display=swap',
|
||||||
|
},
|
||||||
|
heading: {
|
||||||
|
name: 'Quicksand',
|
||||||
|
css: 'Quicksand, sans-serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Quicksand:wght@300..700&display=swap',
|
||||||
|
},
|
||||||
|
code: {
|
||||||
|
name: 'OS Default (monospace)',
|
||||||
|
css: 'ui-monospace, monospace',
|
||||||
|
href: null,
|
||||||
|
},
|
||||||
|
longform: {
|
||||||
|
name: 'Crimson Pro',
|
||||||
|
css: '"Crimson Pro", serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Crimson+Pro:ital,wght@0,200..900;1,200..900&display=swap',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
icons: {
|
||||||
|
family: 'classic',
|
||||||
|
weight: 2,
|
||||||
|
},
|
||||||
|
palette: {
|
||||||
|
name: 'Bright',
|
||||||
|
filename: 'bright.css',
|
||||||
|
},
|
||||||
|
colorBrand: {
|
||||||
|
color: 'blue',
|
||||||
|
},
|
||||||
|
tokens: {
|
||||||
|
// Fonts
|
||||||
|
'--wa-font-family-body': 'Quicksand, sans-serif',
|
||||||
|
'--wa-font-family-heading': 'var(--wa-font-family-body)',
|
||||||
|
'--wa-font-family-code': 'ui-monospace, monospace',
|
||||||
|
'--wa-font-family-longform': '"Crimson Pro", serif',
|
||||||
|
'--wa-font-weight-body': 500,
|
||||||
|
'--wa-font-weight-heading': 700,
|
||||||
|
'--wa-font-weight-code': 500,
|
||||||
|
'--wa-font-weight-longform': 500,
|
||||||
|
|
||||||
|
// Elements
|
||||||
|
'--wa-border-radius-scale': 1.5,
|
||||||
|
'--wa-space-scale': 1,
|
||||||
|
'--wa-border-width-scale': 2,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
//
|
||||||
|
// #region Shoelace
|
||||||
|
//
|
||||||
|
{
|
||||||
|
name: 'Shoelace',
|
||||||
|
description: 'The original, familiar look you know and love from Shoelace.',
|
||||||
|
filename: 'shoelace.css',
|
||||||
|
isPro: false,
|
||||||
|
fonts: {
|
||||||
|
body: {
|
||||||
|
name: 'OS Default (sans-serif)',
|
||||||
|
css: 'ui-sans-serif, system-ui, sans-serif',
|
||||||
|
href: null,
|
||||||
|
},
|
||||||
|
heading: {
|
||||||
|
name: 'OS Default (sans-serif)',
|
||||||
|
css: 'ui-sans-serif, system-ui, sans-serif',
|
||||||
|
href: null,
|
||||||
|
},
|
||||||
|
code: {
|
||||||
|
name: 'OS Default (monospace)',
|
||||||
|
css: 'ui-monospace, monospace',
|
||||||
|
href: null,
|
||||||
|
},
|
||||||
|
longform: {
|
||||||
|
name: 'OS Default (serif)',
|
||||||
|
css: 'ui-serif, serif',
|
||||||
|
href: null,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
icons: {
|
||||||
|
family: 'classic',
|
||||||
|
weight: 1,
|
||||||
|
},
|
||||||
|
palette: {
|
||||||
|
name: 'Shoelace',
|
||||||
|
filename: 'shoelace.css',
|
||||||
|
},
|
||||||
|
colorBrand: {
|
||||||
|
color: 'blue',
|
||||||
|
},
|
||||||
|
tokens: {
|
||||||
|
// Fonts
|
||||||
|
'--wa-font-family-body': 'ui-sans-serif, system-ui, sans-serif',
|
||||||
|
'--wa-font-family-heading': 'var(--wa-font-family-body)',
|
||||||
|
'--wa-font-family-code': 'ui-monospace, monospace',
|
||||||
|
'--wa-font-family-longform': 'ui-serif, serif',
|
||||||
|
'--wa-font-weight-body': 400,
|
||||||
|
'--wa-font-weight-heading': 600,
|
||||||
|
'--wa-font-weight-code': 400,
|
||||||
|
'--wa-font-weight-longform': 400,
|
||||||
|
|
||||||
|
// Elements
|
||||||
|
'--wa-border-radius-scale': 0.7,
|
||||||
|
'--wa-space-scale': 1,
|
||||||
|
'--wa-border-width-scale': 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
//
|
||||||
|
// #region Active
|
||||||
|
//
|
||||||
|
{
|
||||||
|
name: 'Active',
|
||||||
|
description: 'Energetic and tactile, always in motion.',
|
||||||
|
filename: 'active.css',
|
||||||
|
isPro: true,
|
||||||
|
fonts: {
|
||||||
|
body: {
|
||||||
|
name: 'Inter',
|
||||||
|
css: 'Inter, sans-serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Inter:ital,wght@0,100..900;1,100..900&display=swap',
|
||||||
|
},
|
||||||
|
heading: {
|
||||||
|
name: 'Inter',
|
||||||
|
css: 'Inter, sans-serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Inter:ital,wght@0,100..900;1,100..900&display=swap',
|
||||||
|
},
|
||||||
|
code: {
|
||||||
|
name: 'Geist Mono',
|
||||||
|
css: '"Geist Mono", monospace',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Geist+Mono:wght@100..900&display=swap',
|
||||||
|
},
|
||||||
|
longform: {
|
||||||
|
name: 'Aleo',
|
||||||
|
css: 'Aleo, serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Aleo:ital,wght@0,100..900;1,100..900&display=swap',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
icons: {
|
||||||
|
family: 'classic',
|
||||||
|
weight: 1,
|
||||||
|
},
|
||||||
|
palette: {
|
||||||
|
name: 'Rudimentary',
|
||||||
|
filename: 'rudimentary.css',
|
||||||
|
},
|
||||||
|
colorBrand: {
|
||||||
|
color: 'green',
|
||||||
|
},
|
||||||
|
tokens: {
|
||||||
|
// Fonts
|
||||||
|
'--wa-font-family-body': 'Inter, sans-serif',
|
||||||
|
'--wa-font-family-heading': 'var(--wa-font-family-body)',
|
||||||
|
'--wa-font-family-code': '"Geist Mono", monospace',
|
||||||
|
'--wa-font-family-longform': 'Aleo, serif',
|
||||||
|
'--wa-font-weight-body': 400,
|
||||||
|
'--wa-font-weight-heading': 650,
|
||||||
|
'--wa-font-weight-code': 400,
|
||||||
|
'--wa-font-weight-longform': 400,
|
||||||
|
|
||||||
|
// Elements
|
||||||
|
'--wa-border-radius-scale': 1.75,
|
||||||
|
'--wa-space-scale': 1,
|
||||||
|
'--wa-border-width-scale': 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
//
|
||||||
|
// #region Brutalist
|
||||||
|
//
|
||||||
|
{
|
||||||
|
name: 'Brutalist',
|
||||||
|
description: 'Sharp, square, and unapologetically bold.',
|
||||||
|
filename: 'brutalist.css',
|
||||||
|
isPro: true,
|
||||||
|
fonts: {
|
||||||
|
body: {
|
||||||
|
name: 'Space Grotesk',
|
||||||
|
css: '"Space Grotesk", sans-serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Space+Grotesk:wght@300..700&display=swap',
|
||||||
|
},
|
||||||
|
heading: {
|
||||||
|
name: 'IBM Plex Sans Condensed',
|
||||||
|
css: '"IBM Plex Sans Condensed", sans-serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=IBM+Plex+Sans+Condensed:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&display=swap',
|
||||||
|
},
|
||||||
|
code: {
|
||||||
|
name: 'Space Mono',
|
||||||
|
css: '"Space Mono", monospace',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700&display=swap',
|
||||||
|
},
|
||||||
|
longform: {
|
||||||
|
name: 'Podkova',
|
||||||
|
css: 'Podkova, serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Podkova:wght@400..800&display=swap',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
icons: {
|
||||||
|
family: 'classic',
|
||||||
|
weight: 2,
|
||||||
|
},
|
||||||
|
palette: {
|
||||||
|
name: 'Default',
|
||||||
|
filename: 'default.css',
|
||||||
|
},
|
||||||
|
colorBrand: {
|
||||||
|
color: 'blue',
|
||||||
|
},
|
||||||
|
tokens: {
|
||||||
|
// Fonts
|
||||||
|
'--wa-font-family-body': 'Space Grotesk, sans-serif',
|
||||||
|
'--wa-font-family-heading': 'IBM Plex Sans Condensed, sans-serif',
|
||||||
|
'--wa-font-family-code': 'Space Mono, monospace',
|
||||||
|
'--wa-font-family-longform': 'Podkova, serif',
|
||||||
|
'--wa-font-weight-body': 400,
|
||||||
|
'--wa-font-weight-heading': 500,
|
||||||
|
'--wa-font-weight-code': 400,
|
||||||
|
'--wa-font-weight-longform': 400,
|
||||||
|
|
||||||
|
// Elements
|
||||||
|
'--wa-border-radius-scale': 0,
|
||||||
|
'--wa-space-scale': 1.125,
|
||||||
|
'--wa-border-width-scale': 2,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
//
|
||||||
|
// #region Glossy
|
||||||
|
//
|
||||||
|
{
|
||||||
|
name: 'Glossy',
|
||||||
|
description: 'Bustling with plenty of luster and shine.',
|
||||||
|
filename: 'glossy.css',
|
||||||
|
isPro: true,
|
||||||
|
fonts: {
|
||||||
|
body: {
|
||||||
|
name: 'Figtree',
|
||||||
|
css: 'Figtree, sans-serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Figtree:ital,wght@0,300..900;1,300..900&display=swap',
|
||||||
|
},
|
||||||
|
heading: {
|
||||||
|
name: 'Figtree',
|
||||||
|
css: 'Figtree, sans-serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Figtree:ital,wght@0,300..900;1,300..900&display=swap',
|
||||||
|
},
|
||||||
|
code: {
|
||||||
|
name: 'Chivo Mono',
|
||||||
|
css: '"Chivo Mono", monospace',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Chivo+Mono:ital,wght@0,100..900;1,100..900&display=swap',
|
||||||
|
},
|
||||||
|
longform: {
|
||||||
|
name: 'Fraunces',
|
||||||
|
css: 'Fraunces, serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Fraunces:ital,wght@0,100..900;1,100..900&display=swap',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
icons: {
|
||||||
|
family: 'classic',
|
||||||
|
weight: 1,
|
||||||
|
},
|
||||||
|
palette: {
|
||||||
|
name: 'Elegant',
|
||||||
|
filename: 'elegant.css',
|
||||||
|
},
|
||||||
|
colorBrand: {
|
||||||
|
color: 'indigo',
|
||||||
|
},
|
||||||
|
tokens: {
|
||||||
|
// Fonts
|
||||||
|
'--wa-font-family-body': 'Figtree, sans-serif',
|
||||||
|
'--wa-font-family-heading': 'var(--wa-font-family-body)',
|
||||||
|
'--wa-font-family-code': '"Chivo Mono", monospace',
|
||||||
|
'--wa-font-family-longform': 'Fraunces, serif',
|
||||||
|
'--wa-font-weight-body': 400,
|
||||||
|
'--wa-font-weight-heading': 800,
|
||||||
|
'--wa-font-weight-code': 400,
|
||||||
|
'--wa-font-weight-longform': 350,
|
||||||
|
|
||||||
|
// Elements
|
||||||
|
'--wa-border-radius-scale': 1.33,
|
||||||
|
'--wa-space-scale': 1.125,
|
||||||
|
'--wa-border-width-scale': 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
//
|
||||||
|
// #region Matter
|
||||||
|
//
|
||||||
|
{
|
||||||
|
name: 'Matter',
|
||||||
|
description: 'Digital design inspired by the real world.',
|
||||||
|
filename: 'matter.css',
|
||||||
|
isPro: true,
|
||||||
|
fonts: {
|
||||||
|
body: {
|
||||||
|
name: 'Wix Madefor Text',
|
||||||
|
css: '"Wix Madefor Text", sans-serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Wix+Madefor+Text:ital,wght@0,400..800;1,400..800&display=swap',
|
||||||
|
},
|
||||||
|
heading: {
|
||||||
|
name: 'Wix Madefor Text',
|
||||||
|
css: '"Wix Madefor Text", sans-serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Wix+Madefor+Text:ital,wght@0,400..800;1,400..800&display=swap',
|
||||||
|
},
|
||||||
|
code: {
|
||||||
|
name: 'Roboto Mono',
|
||||||
|
css: '"Roboto Mono", monospace',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&display=swap',
|
||||||
|
},
|
||||||
|
longform: {
|
||||||
|
name: 'Roboto Serif',
|
||||||
|
css: '"Roboto Serif", serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Roboto+Serif:ital,wght@0,100..900;1,100..900&display=swap',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
icons: {
|
||||||
|
family: 'classic',
|
||||||
|
weight: 1,
|
||||||
|
},
|
||||||
|
palette: {
|
||||||
|
name: 'Mild',
|
||||||
|
filename: 'mild.css',
|
||||||
|
},
|
||||||
|
colorBrand: {
|
||||||
|
color: 'purple',
|
||||||
|
},
|
||||||
|
tokens: {
|
||||||
|
// Fonts
|
||||||
|
'--wa-font-family-body': 'Wix Madefor Text, sans-serif',
|
||||||
|
'--wa-font-family-heading': 'var(--wa-font-family-body)',
|
||||||
|
'--wa-font-family-code': 'Roboto Mono, monospace',
|
||||||
|
'--wa-font-family-longform': 'Roboto Serif, serif',
|
||||||
|
'--wa-font-weight-body': 400,
|
||||||
|
'--wa-font-weight-heading': 500,
|
||||||
|
'--wa-font-weight-code': 400,
|
||||||
|
'--wa-font-weight-longform': 400,
|
||||||
|
|
||||||
|
// Elements
|
||||||
|
'--wa-border-radius-scale': 1.33,
|
||||||
|
'--wa-space-scale': 1,
|
||||||
|
'--wa-border-width-scale': 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
//
|
||||||
|
// #region Mellow
|
||||||
|
//
|
||||||
|
{
|
||||||
|
name: 'Mellow',
|
||||||
|
description: 'Soft and soothing, like a lazy Sunday morning.',
|
||||||
|
filename: 'mellow.css',
|
||||||
|
isPro: true,
|
||||||
|
fonts: {
|
||||||
|
body: {
|
||||||
|
name: 'Mulish',
|
||||||
|
css: 'Mulish, sans-serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Mulish:ital,wght@0,200..1000;1,200..1000&display=swap',
|
||||||
|
},
|
||||||
|
heading: {
|
||||||
|
name: 'Lora',
|
||||||
|
css: 'Lora, serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Lora:ital,wght@0,400..700;1,400..700&display=swap',
|
||||||
|
},
|
||||||
|
code: {
|
||||||
|
name: 'OS Default (monospace)',
|
||||||
|
css: 'ui-monospace, monospace',
|
||||||
|
href: null,
|
||||||
|
},
|
||||||
|
longform: {
|
||||||
|
name: 'Lora',
|
||||||
|
css: 'Lora, serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Lora:ital,wght@0,400..700;1,400..700&display=swap',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
icons: {
|
||||||
|
family: 'classic',
|
||||||
|
weight: 1.5,
|
||||||
|
},
|
||||||
|
palette: {
|
||||||
|
name: 'Natural',
|
||||||
|
filename: 'natural.css',
|
||||||
|
},
|
||||||
|
colorBrand: {
|
||||||
|
color: 'blue',
|
||||||
|
},
|
||||||
|
tokens: {
|
||||||
|
// Fonts
|
||||||
|
'--wa-font-family-body': 'Mulish, sans-serif',
|
||||||
|
'--wa-font-family-heading': 'Lora, serif',
|
||||||
|
'--wa-font-family-code': 'ui-monospace, monospace',
|
||||||
|
'--wa-font-family-longform': 'Lora, serif',
|
||||||
|
'--wa-font-weight-body': 400,
|
||||||
|
'--wa-font-weight-heading': 700,
|
||||||
|
'--wa-font-weight-code': 400,
|
||||||
|
'--wa-font-weight-longform': 400,
|
||||||
|
|
||||||
|
// Elements
|
||||||
|
'--wa-border-radius-scale': 1,
|
||||||
|
'--wa-space-scale': 1.125,
|
||||||
|
'--wa-border-width-scale': 1.5,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
//
|
||||||
|
// #region Playful
|
||||||
|
//
|
||||||
|
{
|
||||||
|
name: 'Playful',
|
||||||
|
description: 'Cheerful and engaging, like a playground on screen.',
|
||||||
|
filename: 'playful.css',
|
||||||
|
isPro: true,
|
||||||
|
fonts: {
|
||||||
|
body: {
|
||||||
|
name: 'Nunito',
|
||||||
|
css: 'Nunito, sans-serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Nunito:ital,wght@0,200..1000;1,200..1000&display=swap',
|
||||||
|
},
|
||||||
|
heading: {
|
||||||
|
name: 'Fredoka',
|
||||||
|
css: 'Fredoka, sans-serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Fredoka:wght@300..700&display=swap',
|
||||||
|
},
|
||||||
|
code: {
|
||||||
|
name: 'Azeret Mono',
|
||||||
|
css: '"Azeret Mono", monospace',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Azeret+Mono:ital,wght@0,100..900;1,100..900&display=swap',
|
||||||
|
},
|
||||||
|
longform: {
|
||||||
|
name: 'BioRhyme',
|
||||||
|
css: 'BioRhyme, serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=BioRhyme:wght@200..800&display=swap',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
icons: {
|
||||||
|
family: 'classic',
|
||||||
|
weight: 3,
|
||||||
|
},
|
||||||
|
palette: {
|
||||||
|
name: 'Rudimentary',
|
||||||
|
filename: 'rudimentary.css',
|
||||||
|
},
|
||||||
|
colorBrand: {
|
||||||
|
color: 'purple',
|
||||||
|
},
|
||||||
|
tokens: {
|
||||||
|
// Fonts
|
||||||
|
'--wa-font-family-body': 'Nunito, sans-serif',
|
||||||
|
'--wa-font-family-heading': 'Fredoka, sans-serif',
|
||||||
|
'--wa-font-family-code': 'Azeret Mono, monospace',
|
||||||
|
'--wa-font-family-longform': 'BioRhyme, serif',
|
||||||
|
'--wa-font-weight-body': 500,
|
||||||
|
'--wa-font-weight-heading': 600,
|
||||||
|
'--wa-font-weight-code': 400,
|
||||||
|
'--wa-font-weight-longform': 400,
|
||||||
|
|
||||||
|
// Elements
|
||||||
|
'--wa-border-radius-scale': 2,
|
||||||
|
'--wa-space-scale': 1,
|
||||||
|
'--wa-border-width-scale': 3,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
//
|
||||||
|
// #region Premium
|
||||||
|
//
|
||||||
|
{
|
||||||
|
name: 'Premium',
|
||||||
|
description: 'The ultimate in sophistication and style.',
|
||||||
|
filename: 'premium.css',
|
||||||
|
isPro: true,
|
||||||
|
fonts: {
|
||||||
|
body: {
|
||||||
|
name: 'DM Sans',
|
||||||
|
css: '"DM Sans", sans-serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=DM+Sans:ital,wght@0,100..1000;1,100..1000&display=swap',
|
||||||
|
},
|
||||||
|
heading: {
|
||||||
|
name: 'Playfair Display',
|
||||||
|
css: '"Playfair Display", serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Playfair+Display:ital,wght@0,400..900;1,400..900&display=swap',
|
||||||
|
},
|
||||||
|
code: {
|
||||||
|
name: 'OS Default (monospace)',
|
||||||
|
css: 'ui-monospace, monospace',
|
||||||
|
href: null,
|
||||||
|
},
|
||||||
|
longform: {
|
||||||
|
name: 'Playfair',
|
||||||
|
css: 'Playfair, serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Playfair:ital,wght@0,300..900;1,300..900&display=swap',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
icons: {
|
||||||
|
family: 'classic',
|
||||||
|
weight: 1.5,
|
||||||
|
},
|
||||||
|
palette: {
|
||||||
|
name: 'Anodized',
|
||||||
|
filename: 'anodized.css',
|
||||||
|
},
|
||||||
|
colorBrand: {
|
||||||
|
color: 'cyan',
|
||||||
|
},
|
||||||
|
tokens: {
|
||||||
|
// Fonts
|
||||||
|
'--wa-font-family-body': 'DM Sans, sans-serif',
|
||||||
|
'--wa-font-family-heading': 'Playfair Display, serif',
|
||||||
|
'--wa-font-family-code': 'ui-monospace, monospace',
|
||||||
|
'--wa-font-family-longform': 'Playfair, serif',
|
||||||
|
'--wa-font-weight-body': 400,
|
||||||
|
'--wa-font-weight-heading': 500,
|
||||||
|
'--wa-font-weight-code': 400,
|
||||||
|
'--wa-font-weight-longform': 400,
|
||||||
|
|
||||||
|
// Elements
|
||||||
|
'--wa-border-radius-scale': 0.5,
|
||||||
|
'--wa-space-scale': 1,
|
||||||
|
'--wa-border-width-scale': 1.5,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
//
|
||||||
|
// #region Tailspin
|
||||||
|
//
|
||||||
|
{
|
||||||
|
name: 'Tailspin',
|
||||||
|
description: 'Like a bird in flight, guiding you from there to here.',
|
||||||
|
filename: 'tailspin.css',
|
||||||
|
isPro: true,
|
||||||
|
fonts: {
|
||||||
|
body: {
|
||||||
|
name: 'Inter',
|
||||||
|
css: 'Inter, sans-serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Inter:ital,wght@0,100..900;1,100..900&display=swap',
|
||||||
|
},
|
||||||
|
heading: {
|
||||||
|
name: 'Inter',
|
||||||
|
css: 'Inter, sans-serif',
|
||||||
|
href: 'https://fonts.bunny.net/css2?family=Inter:ital,wght@0,100..900;1,100..900&display=swap',
|
||||||
|
},
|
||||||
|
code: {
|
||||||
|
name: 'OS Default (monospace)',
|
||||||
|
css: 'ui-monospace, monospace',
|
||||||
|
href: null,
|
||||||
|
},
|
||||||
|
longform: {
|
||||||
|
name: 'OS Default (serif)',
|
||||||
|
css: 'ui-serif, serif',
|
||||||
|
href: null,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
icons: {
|
||||||
|
family: 'classic',
|
||||||
|
weight: 1,
|
||||||
|
},
|
||||||
|
palette: {
|
||||||
|
name: 'Vogue',
|
||||||
|
filename: 'vogue.css',
|
||||||
|
},
|
||||||
|
colorBrand: {
|
||||||
|
color: 'indigo',
|
||||||
|
},
|
||||||
|
tokens: {
|
||||||
|
// Fonts
|
||||||
|
'--wa-font-family-body': 'Inter, sans-serif',
|
||||||
|
'--wa-font-family-heading': 'var(--wa-font-family-body)',
|
||||||
|
'--wa-font-family-code': 'ui-monospace, monospace',
|
||||||
|
'--wa-font-family-longform': 'ui-serif, serif',
|
||||||
|
'--wa-font-weight-body': 400,
|
||||||
|
'--wa-font-weight-heading': 700,
|
||||||
|
'--wa-font-weight-code': 400,
|
||||||
|
'--wa-font-weight-longform': 400,
|
||||||
|
|
||||||
|
// Elements
|
||||||
|
'--wa-border-radius-scale': 1,
|
||||||
|
'--wa-space-scale': 0.875,
|
||||||
|
'--wa-border-width-scale': 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// #endregion
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All fonts used by themes, collected from the four font categories.
|
||||||
|
*/
|
||||||
|
export const fonts = themes
|
||||||
|
.flatMap(theme => [theme.fonts.body, theme.fonts.heading, theme.fonts.code, theme.fonts.longform])
|
||||||
|
.filter(
|
||||||
|
(font, index, array) =>
|
||||||
|
array.findIndex(f => f.name === font.name && f.css === font.css && f.href === font.href) === index,
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Font presets derived from themes, with unique font names in order: heading > body > code > longform
|
||||||
|
*/
|
||||||
|
export const fontPresets = themes
|
||||||
|
.map(theme => {
|
||||||
|
const fontNames = [
|
||||||
|
theme.fonts.heading.name,
|
||||||
|
theme.fonts.body.name,
|
||||||
|
theme.fonts.code.name,
|
||||||
|
theme.fonts.longform.name,
|
||||||
|
];
|
||||||
|
const uniqueFonts = fontNames.filter((name, index) => fontNames.indexOf(name) === index);
|
||||||
|
|
||||||
|
return {
|
||||||
|
name: theme.name,
|
||||||
|
displayName: uniqueFonts.join(' · '),
|
||||||
|
fontFamilyBody: theme.fonts.body.css,
|
||||||
|
fontFamilyHeading: theme.fonts.heading.css,
|
||||||
|
fontFamilyCode: theme.fonts.code.css,
|
||||||
|
fontFamilyLongform: theme.fonts.longform.css,
|
||||||
|
fontWeightBody: theme.tokens['--wa-font-weight-body'],
|
||||||
|
fontWeightHeading: theme.tokens['--wa-font-weight-heading'],
|
||||||
|
fontWeightCode: theme.tokens['--wa-font-weight-code'],
|
||||||
|
fontWeightLongform: theme.tokens['--wa-font-weight-longform'],
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.filter((preset, index, array) => array.findIndex(p => p.displayName === preset.displayName) === index);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Element presets derived from themes.
|
||||||
|
*/
|
||||||
|
export const elementPresets = themes.map(theme => ({
|
||||||
|
name: theme.name,
|
||||||
|
borderRadiusScale: theme.tokens['--wa-border-radius-scale'],
|
||||||
|
spaceScale: theme.tokens['--wa-space-scale'],
|
||||||
|
borderWidthScale: theme.tokens['--wa-border-width-scale'],
|
||||||
|
}));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All palettes used by themes in a simple array.
|
||||||
|
*/
|
||||||
|
export const palettes = themes
|
||||||
|
.map(theme => ({
|
||||||
|
...theme.palette,
|
||||||
|
isPro: theme.isPro,
|
||||||
|
}))
|
||||||
|
.filter(
|
||||||
|
(palette, index, array) =>
|
||||||
|
array.findIndex(p => p.name === palette.name && p.filename === palette.filename) === index,
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Available icons.
|
||||||
|
*/
|
||||||
|
export const icons = [
|
||||||
|
{ name: 'Classic', libraryName: 'classic' },
|
||||||
|
{ name: 'Sharp', libraryName: 'sharp' },
|
||||||
|
{ name: 'Duotone', libraryName: 'duotone' },
|
||||||
|
{ name: 'Sharp Duotone', libraryName: 'sharp-duotone' },
|
||||||
|
];
|
||||||
|
|
||||||
|
export const colors = ['red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'indigo', 'purple', 'pink', 'gray'];
|
||||||
|
export const tints = ['95', '90', '80', '70', '60', '50', '40', '30', '20', '10', '05'];
|
||||||
19
packages/webawesome/docs/_includes/_banner-wa-launch.njk
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{% raw %}
|
||||||
|
{%- if req.stripe.discount.active and not currentUser.hasPro -%}
|
||||||
|
<div slot="banner" class="banner-wa-launch wa-dark">
|
||||||
|
<div class="banner-content wa-split">
|
||||||
|
<div class="wa-cluster wa-gap-s">
|
||||||
|
<wa-icon name="badge-percent" class="banner-icon"></wa-icon>
|
||||||
|
<p class="wa-body-s">
|
||||||
|
<strong style="margin-inline-end: var(--wa-space-2xs)">Web Awesome is here!</strong>
|
||||||
|
Celebrate with <span class="appearance-underlined variant-drawn">20% off</span> on a Web Awesome Pro plan… <span class="appearance-underlined variant-drawn">for life</span>!
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<wa-button appearance="outlined" variant="brand" size="small" href="/purchase" class="brand-font">
|
||||||
|
<wa-icon slot="start" variant="regular" name="rocket-launch"></wa-icon>
|
||||||
|
Get Pro + Save 20%
|
||||||
|
</wa-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{%- endif -%}
|
||||||
|
{% endraw %}
|
||||||
95
packages/webawesome/docs/_includes/_dialog-wa-launch.njk
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
{% raw %}
|
||||||
|
{%- if req.stripe.discount.active and not currentUser.hasPro -%}
|
||||||
|
<wa-dialog id="dialog-site" light-dismiss without-header>
|
||||||
|
|
||||||
|
<div class="background-wa-pattern" style="justify-content: center; margin-inline: calc(var(--spacing) * -1); margin-block-start: calc(var(--spacing) * -1); margin-block-end: var(--spacing); background: linear-gradient(to bottom, var(--wa-color-brand), var(--wa-color-brand-50)); color: var(--wa-color-brand-on-loud); padding: var(--wa-space-3xl) var(--spacing); --background-pattern-opacity: 0.2; --background-pattern-image: url('/assets/images/bg-wa-pattern.svg');">
|
||||||
|
|
||||||
|
<div class="wa-stack wa-align-items-center" style="text-align: center;">
|
||||||
|
<wa-icon name="party-horn" family="duotone" variant="solid" style="font-size: var(--wa-font-size-3xl); --secondary-color: var(--wa-color-brand-40); --secondary-opacity: 1.0;"></wa-icon>
|
||||||
|
<h2 class="wa-heading-2xl brand-font">Get a lifetime discount on Web Awesome Pro!</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="wa-stack wa-gap-l">
|
||||||
|
<p>Celebrate our official launch with a 20% discount on a Web Awesome Pro plan…<span class="appearance-underlined variant-drawn" style="--underline-color: var(--wa-color-brand);">for life</span>! But hurry, this lifetime discount is only available for a limited time.</p>
|
||||||
|
|
||||||
|
<div class="wa-split">
|
||||||
|
<wa-button type="button" appearance="plain" data-dialog="close" class="plausible-event-name=launch_dialog:close_button_click">Maybe Later</wa-button>
|
||||||
|
<wa-button variant="neutral" appearance="accent" href="/purchase" class="brand-font plausible-event-name=launch_dialog:pro_purchase_button_click">
|
||||||
|
<wa-icon slot="start" variant="regular" name="rocket-launch"></wa-icon>
|
||||||
|
Get Pro + Save 20%
|
||||||
|
</wa-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</wa-dialog>
|
||||||
|
|
||||||
|
<script type="module">
|
||||||
|
(function() {
|
||||||
|
const SITE_DIALOG_DISMISSED_KEY = 'dialog-wa-launch-sale-dismissed';
|
||||||
|
|
||||||
|
// Early exit if user has dismissed the dialog
|
||||||
|
try {
|
||||||
|
if (localStorage.getItem(SITE_DIALOG_DISMISSED_KEY) === 'true') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
// localStorage may be disabled or unavailable
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for DOM and dialog element
|
||||||
|
const dialog = document.getElementById('dialog-site');
|
||||||
|
if (!dialog) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function to safely track Plausible events
|
||||||
|
const trackEvent = (eventName) => {
|
||||||
|
if (typeof plausible !== 'undefined') {
|
||||||
|
plausible(eventName);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Initialize dialog functionality
|
||||||
|
let initCalled = false;
|
||||||
|
const initDialog = () => {
|
||||||
|
// Prevent double initialization
|
||||||
|
if (initCalled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
initCalled = true;
|
||||||
|
|
||||||
|
// Track when dialog is shown
|
||||||
|
dialog.addEventListener('wa-show', () => {
|
||||||
|
trackEvent('launch_dialog:view');
|
||||||
|
}, { once: true });
|
||||||
|
|
||||||
|
// Track when dialog is dismissed
|
||||||
|
dialog.addEventListener('wa-hide', (event) => {
|
||||||
|
// Track overlay click or Escape key dismissal
|
||||||
|
// Button clicks are tracked via CSS classes, so we only track non-button dismissals
|
||||||
|
if (event.detail?.source === dialog) {
|
||||||
|
trackEvent('launch_dialog:overlay_click');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save dismissal state to localStorage
|
||||||
|
try {
|
||||||
|
localStorage.setItem(SITE_DIALOG_DISMISSED_KEY, 'true');
|
||||||
|
} catch (e) {
|
||||||
|
// localStorage may be disabled or unavailable
|
||||||
|
}
|
||||||
|
}, { once: true });
|
||||||
|
|
||||||
|
// Show dialog after a short delay to ensure page is loaded
|
||||||
|
setTimeout(() => {
|
||||||
|
dialog.open = true;
|
||||||
|
}, 500);
|
||||||
|
};
|
||||||
|
|
||||||
|
customElements.whenDefined("wa-dialog").then(() => {
|
||||||
|
initDialog()
|
||||||
|
})
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
{%- endif -%}
|
||||||
|
{% endraw %}
|
||||||
150
packages/webawesome/docs/_includes/base.njk
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
{% if hasAnchors == undefined %}{% set hasAnchors = true %}{% endif %}
|
||||||
|
{% if hasBanner == undefined %}{% set hasBanner = true %}{% endif %}
|
||||||
|
{% if hasSiteDialog == undefined %}{% set hasSiteDialog = true %}{% endif %}
|
||||||
|
{% if hasGeneratedTitle == undefined %}{% set hasGeneratedTitle = true %}{% endif %}
|
||||||
|
<html lang="en" data-fa-kit-code="38c11e3f20" data-version="{{ package.version }}" class="wa-cloak"{% if hasAnchors == false %} data-no-anchor{% endif %}>
|
||||||
|
<head>
|
||||||
|
{% include 'head.njk' %}
|
||||||
|
<meta name="theme-color" content="#f36944">
|
||||||
|
|
||||||
|
<script type="module" src="/assets/scripts/code-examples.js"></script>
|
||||||
|
<script type="module" src="/assets/scripts/scroll.js"></script>
|
||||||
|
<script type="module" src="/assets/scripts/turbo.js"></script>
|
||||||
|
<script type="module" src="/assets/scripts/search.js"></script>
|
||||||
|
<script type="module" src="/assets/scripts/search-list.js"></script>
|
||||||
|
<script type="module" src="/assets/scripts/outline.js"></script>
|
||||||
|
<script type="module" src="/assets/scripts/color-scheme.js"></script>
|
||||||
|
<script type="module" src="/assets/scripts/theme.js"></script>
|
||||||
|
{% if hasSidebar %}<script type="module" src="/assets/scripts/sidebar.js"></script>{% endif %}
|
||||||
|
<script defer data-domain="webawesome.com" src="https://plausible.io/js/script.js"></script>
|
||||||
|
|
||||||
|
{% block head %}
|
||||||
|
<link rel="stylesheet" href="/assets/styles/docs.css" />
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
<script type="module">
|
||||||
|
// Set the initial color scheme before the page renders to prevent flashing
|
||||||
|
const value = localStorage.getItem('color-scheme') || 'auto';
|
||||||
|
const isDark = value === 'dark' || (value === 'auto' && matchMedia('(prefers-color-scheme: dark)').matches);
|
||||||
|
document.documentElement.classList.toggle('wa-dark', isDark);
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body class="layout-{{ layout | stripExtension }} page-{{ pageClass or page.fileSlug or 'home' }}{{ ' page-wide' if wide }}">
|
||||||
|
|
||||||
|
{% set defaultWaPageAttributes = defaultWaPageAttributes or { view: 'desktop', 'disable-navigation-toggle': true, 'mobile-breakpoint': 1180, 'disable-sticky': 'banner' } %}
|
||||||
|
{% set waPageAttributes = waPageAttributes or {} %}
|
||||||
|
{% set mergedWaPageAttributes = defaultWaPageAttributes | merge(waPageAttributes) %}
|
||||||
|
<wa-page
|
||||||
|
{% for key, value in mergedWaPageAttributes %}
|
||||||
|
{% if value != null and value != false %}
|
||||||
|
{{ key }}="{{ value }}"
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
>
|
||||||
|
{% block pageBanner %}
|
||||||
|
{% if hasBanner %}
|
||||||
|
{#- WA Launch Banner -#}
|
||||||
|
{% include "_banner-wa-launch.njk" ignore missing %}
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block pageHeader %}
|
||||||
|
<header slot="header" class="wa-split">
|
||||||
|
{# Nav toggle #}
|
||||||
|
<wa-button appearance="plain" size="small" data-toggle-nav>
|
||||||
|
<wa-icon name="bars" label="Toggle navigation" class="icon-default icon-embiggen"></wa-icon>
|
||||||
|
<wa-icon name="burger" aria-hidden="true" class="icon-hover icon-embiggen"></wa-icon>
|
||||||
|
</wa-button>
|
||||||
|
|
||||||
|
{# Logo - Desktop #}
|
||||||
|
<a class="brand-logo wa-desktop-only" href="/" aria-label="Web Awesome">
|
||||||
|
{% include "logo.njk" %}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
{#- Logo - mobile branding -#}
|
||||||
|
<a href="/" class="brand-logo wa-mobile-only" aria-label="Web Awesome">
|
||||||
|
{# Logo - Mobile #}
|
||||||
|
{% include "logo-simple.njk" %}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div id="docs-toolbar" class="wa-cluster gap-s">
|
||||||
|
<div class="wa-desktop-only wa-cluster wa-gap-2xs">
|
||||||
|
{% include "theme-selector.njk" %}
|
||||||
|
{% include "color-scheme-selector.njk" %}
|
||||||
|
{% include "github-icon-buttons.njk" %}
|
||||||
|
</div>
|
||||||
|
{#- Login -#}
|
||||||
|
{% include "login-or-avatar.njk" ignore missing %}
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{# Sidebar #}
|
||||||
|
{% if hasSidebar %}
|
||||||
|
{# Mobile selectors #}
|
||||||
|
<div class="wa-mobile-only" slot="navigation-header">
|
||||||
|
<div class="wa-cluster wa-gap-s">
|
||||||
|
<a class="brand-logo" href="/" aria-label="Web Awesome">{% include "logo-simple.njk" %}</a>
|
||||||
|
<div class="wa-cluster wa-gap-2xs" style="flex-wrap: nowrap;">
|
||||||
|
{% include "theme-selector.njk" %}
|
||||||
|
{% include "color-scheme-selector.njk" %}
|
||||||
|
{% include "github-icon-buttons.njk" %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div slot="navigation" id="sidebar" class="docs-aside" data-remember-scroll>
|
||||||
|
{% include "sidebar.njk" %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{# Outline #}
|
||||||
|
{% if hasOutline %}
|
||||||
|
<aside slot="aside" id="outline" class="docs-aside">
|
||||||
|
<nav id="outline-standard" class="outline-links">
|
||||||
|
<h2><a href="#content">{{ title }}</a></h2>
|
||||||
|
</nav>
|
||||||
|
</aside>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{# Main #}
|
||||||
|
<main id="content">
|
||||||
|
{# Expandable outline #}
|
||||||
|
{% if hasOutline %}
|
||||||
|
<nav id="outline-expandable">
|
||||||
|
<details class="outline-links">
|
||||||
|
<summary>On this page</summary>
|
||||||
|
</details>
|
||||||
|
</nav>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div id="flashes">{% server "flashes" %}</div>
|
||||||
|
|
||||||
|
{% block header %}
|
||||||
|
{% if hasGeneratedTitle %}
|
||||||
|
<h1 class="title">{{ title }}</h1>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block beforeContent %}{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{{ content | safe }}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block afterContent %}{% endblock %}
|
||||||
|
</main>
|
||||||
|
|
||||||
|
{% include 'search.njk' %}
|
||||||
|
|
||||||
|
{#- Site-Wide Dialog -#}
|
||||||
|
{% if hasSiteDialog %}
|
||||||
|
{% include "_dialog-wa-launch.njk" ignore missing %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{# Footer #}
|
||||||
|
{% block pageFooter %}{% endblock %}
|
||||||
|
</wa-page>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
35
packages/webawesome/docs/_includes/color-scheme-selector.njk
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<wa-dropdown class="color-scheme-selector" title="Press \ to toggle">
|
||||||
|
<wa-button slot="trigger" id="color-scheme-selector-trigger" appearance="plain">
|
||||||
|
<wa-icon name="sun-bright" variant="regular" class="icon-embiggen only-light"></wa-icon>
|
||||||
|
<wa-icon name="moon-stars" variant="regular" class="icon-embiggen only-dark"></wa-icon>
|
||||||
|
</wa-button>
|
||||||
|
<wa-dropdown-item value="light">
|
||||||
|
<wa-icon slot="icon" name="sun-bright" variant="regular" class="icon-embiggen"></wa-icon>
|
||||||
|
Light
|
||||||
|
</wa-dropdown-item>
|
||||||
|
<wa-dropdown-item value="dark">
|
||||||
|
<wa-icon slot="icon" name="moon-stars" variant="regular" class="icon-embiggen"></wa-icon>
|
||||||
|
Dark
|
||||||
|
</wa-dropdown-item>
|
||||||
|
<wa-divider></wa-divider>
|
||||||
|
<wa-dropdown-item value="auto">
|
||||||
|
<wa-icon slot="icon" name="sun-bright" variant="regular" class="only-light icon-embiggen"></wa-icon>
|
||||||
|
<wa-icon slot="icon" name="moon-stars" variant="regular" class="only-dark icon-embiggen"></wa-icon>
|
||||||
|
System
|
||||||
|
</wa-dropdown-item>
|
||||||
|
</wa-dropdown>
|
||||||
|
<wa-tooltip for="color-scheme-selector-trigger" id="color-scheme-tooltip">Select Color Scheme</wa-tooltip>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// Handle dropdown selection and trigger input event for color-scheme.js
|
||||||
|
document.querySelectorAll('wa-dropdown.color-scheme-selector').forEach(el => {
|
||||||
|
el.addEventListener('wa-select', (event) => {
|
||||||
|
const selectedValue = event.detail.item.value;
|
||||||
|
|
||||||
|
// Trigger input event for color-scheme.js
|
||||||
|
el.value = selectedValue;
|
||||||
|
el.dispatchEvent(new Event('input', { bubbles: true }));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||