Compare commits

..

209 Commits

Author SHA1 Message Date
Cory LaViska
a884a0c1f0 remove examples 2024-06-12 11:06:49 -04:00
Cory LaViska
847ad26814 Merge pull request #123 from shoelace-style/konnorrogers/disconnect-tooltip
Tooltips associated via selectors
2024-06-12 10:14:21 -04:00
konnorrogers
e943572d36 prettier 2024-06-12 03:28:09 -04:00
konnorrogers
62f2b1c0fb fix tooltips and everything to go along with it 2024-06-12 03:23:45 -04:00
konnorrogers
c98945a885 prettier 2024-06-11 17:52:38 -04:00
konnorrogers
e42ac799af prettier 2024-06-11 17:45:34 -04:00
konnorrogers
dbbe580ef1 prettier 2024-06-11 17:08:34 -04:00
konnorrogers
fb33dd7036 remove content property 2024-06-11 16:43:04 -04:00
konnorrogers
dc12e16d83 update tooltip 2024-06-11 16:41:42 -04:00
konnorrogers
2e7096c66f update tooltip 2024-06-11 16:37:42 -04:00
Cory LaViska
700ccff3cd Merge pull request #124 from shoelace-style/wa-icon
Update <wa-icon> docs and add support for duotone
2024-06-11 15:48:04 -04:00
Cory LaViska
530673dcd1 change data attrib 2024-06-11 14:38:22 -04:00
Cory LaViska
5d5ac5576e update comments 2024-06-11 14:38:11 -04:00
Cory LaViska
39b5737a7f expose kit functions 2024-06-11 14:38:05 -04:00
Cory LaViska
2157b209a2 update to FA 2024-06-11 14:37:59 -04:00
Cory LaViska
4942eaedb3 add kit code info 2024-06-11 14:24:00 -04:00
konnorrogers
ca6ebecfdc add tooltip changelog 2024-06-11 13:56:59 -04:00
konnorrogers
77e1708657 fix tooltip docs, remove stopAnimations 2024-06-11 13:53:05 -04:00
konnorrogers
42b711b45a prettier 2024-06-11 13:14:10 -04:00
konnorrogers
ca524a03f3 fix tooltip docs, remove stopAnimations 2024-06-11 13:07:49 -04:00
Cory LaViska
4ee831f18a cleanup unused file 2024-06-11 13:00:14 -04:00
Cory LaViska
8430d6076b add custom props for duotone icons 2024-06-11 12:44:15 -04:00
konnorrogers
9c17b0e16b Merge branch 'next' of https://github.com/shoelace-style/webawesome into konnorrogers/disconnect-tooltip 2024-06-11 12:05:28 -04:00
Cory LaViska
1d1080f2e4 fix fw styles and update docs 2024-06-11 11:57:24 -04:00
konnorrogers
a715e0c1b6 working on tooltip 2024-06-11 11:54:58 -04:00
Cory LaViska
a134b1a359 fix examples and remove ::danger 2024-06-11 11:21:28 -04:00
Cory LaViska
d0b673c99d remove old sprite entry 2024-06-11 11:21:17 -04:00
Cory LaViska
55ba270b83 add support for fixed width 2024-06-11 10:51:49 -04:00
Cory LaViska
db94c609bd backport 2060 2024-06-11 10:29:51 -04:00
Konnor Rogers
823bac0174 Implement roving tabindex for tab-group (#118)
* backport roving tabindeX

* update changelog

* prettier

* implement current tab

* finish backporting

* implement current tab

* fixing tabs

* prettier

* remove unnecessary options

* remove bad docs

---------

Co-authored-by: Cory LaViska <cory@abeautifulsite.net>
2024-06-10 12:43:08 -04:00
konnorrogers
2423af3da2 disconnecting tooltip 2024-06-07 12:56:03 -04:00
Cory LaViska
81a3f29650 never return invalid durations 2024-06-05 11:43:51 -04:00
Cory LaViska
1b509dd44b remove old tests 2024-06-04 11:48:06 -04:00
Cory LaViska
a326671a21 Merge pull request #122 from shoelace-style/konnorrogers/remove-value-as-from-input
remove valueAs* getters / setters
2024-06-04 11:43:27 -04:00
konnorrogers
3dcf3af5c5 Merge branch 'next' of https://github.com/shoelace-style/webawesome into konnorrogers/remove-value-as-from-input 2024-06-04 11:32:30 -04:00
konnorrogers
7e72337ff3 remove valueAs* getters / setters 2024-06-04 11:30:12 -04:00
Cory LaViska
71bd7c039d Merge pull request #121 from shoelace-style/menus
fix menu focus colors
2024-06-04 11:19:07 -04:00
Cory LaViska
126c4f1789 fix menu focus colors 2024-06-04 11:16:42 -04:00
Cory LaViska
efc640974a Merge pull request #120 from shoelace-style/events
DRAFT: Events subclass Event instead of using CustomEvent
2024-06-04 11:08:22 -04:00
Cory LaViska
9385ebd893 don't emit twice 2024-06-04 10:59:05 -04:00
Cory LaViska
0900b012af move comment 2024-06-04 10:41:18 -04:00
Cory LaViska
f94ef27a0b remove unused event 2024-06-03 14:11:18 -04:00
Cory LaViska
dccda93f6a make show/hide cancelable 2024-06-03 14:08:03 -04:00
Cory LaViska
a293e13540 backport shoelace pr 2024-06-03 09:55:21 -04:00
Cory LaViska
2f586f4437 eslint 2024-05-31 14:40:44 -04:00
Cory LaViska
5f01216858 fix sl prefixes 2024-05-31 14:39:42 -04:00
Cory LaViska
3154652a00 fix prefix 2024-05-31 14:39:36 -04:00
Cory LaViska
0ea9fd3f6f update contributing 2024-05-31 14:34:53 -04:00
Cory LaViska
081ef02b72 events subclass Event instead of using CustomEvent now 2024-05-31 14:28:19 -04:00
Cory LaViska
f32175bf1e Merge pull request #119 from shoelace-style/docs
Add examples to docs
2024-05-31 11:21:01 -04:00
Cory LaViska
a1e9192db7 add examples; closes #112 2024-05-31 11:20:24 -04:00
Cory LaViska
c69de376df remove unused utility styles 2024-05-31 11:15:35 -04:00
Cory LaViska
db2e6df86d Merge pull request #117 from shoelace-style/alerts
Rename alert to callout and remove toast/dynamic behaviors
2024-05-29 13:01:23 -04:00
Cory LaViska
000bce99f8 remove unused attribute 2024-05-29 12:33:59 -04:00
Cory LaViska
3191b71235 alert => callout; fixes #104 2024-05-29 12:30:54 -04:00
Cory LaViska
6f62f96f11 fix spinner styles when host element isn't a square 2024-05-29 12:08:29 -04:00
Cory LaViska
eee439ffd2 Merge pull request #116 from shoelace-style/submenu-rtl
Fif RTL in submenu controllers and elsewhere
2024-05-28 16:41:17 -04:00
Cory LaViska
fc5e3a4cd9 remove unused 2024-05-28 16:29:49 -04:00
Cory LaViska
3119a75c19 fix ltrs 2024-05-28 15:28:20 -04:00
Cory LaViska
c3bd625d46 remove unused imports 2024-05-28 15:25:36 -04:00
Cory LaViska
92e343dd8b update changelog 2024-05-28 15:20:32 -04:00
Cory LaViska
ec41613c23 one more 2024-05-28 15:13:33 -04:00
Cory LaViska
e255006d8c fix RTL in submenus and elsewhere 2024-05-28 15:09:06 -04:00
Cory LaViska
3303a31255 Merge pull request #115 from shoelace-style/animations
Remove JS custom animations; fixes #110
2024-05-28 14:29:16 -04:00
Cory LaViska
497ccebb73 remove unused function 2024-05-28 14:24:56 -04:00
Cory LaViska
702ff2fd31 remove unused function 2024-05-28 14:24:37 -04:00
Cory LaViska
1dbef2449a 200ms not 250ms 2024-05-28 14:23:28 -04:00
Cory LaViska
50b817093d add hide duration to dialog/drawer 2024-05-28 14:23:21 -04:00
Cory LaViska
0995da09ef add back stop animations 2024-05-28 14:23:06 -04:00
Cory LaViska
53b5484f2b remove js animations from tree item 2024-05-28 14:22:54 -04:00
Cory LaViska
f803bee9a9 remove animations from CEM 2024-05-28 14:18:31 -04:00
Cory LaViska
a9e95ee493 remove js animations from select 2024-05-28 14:03:27 -04:00
Cory LaViska
a30326e4de tweak durations 2024-05-28 14:01:08 -04:00
Cory LaViska
99fe58c96f remove JS animations from dropdwon 2024-05-28 13:58:51 -04:00
Cory LaViska
2111b3c6fb remove JS animations from details 2024-05-28 13:51:48 -04:00
Cory LaViska
22e8ae39a2 remove comments 2024-05-28 13:36:11 -04:00
Cory LaViska
2941db66e4 add <br> 2024-05-28 13:35:40 -04:00
Cory LaViska
cd8d5d0eea jsdoc comments on static fields break the docs 2024-05-28 13:30:51 -04:00
Cory LaViska
56dcd409a7 newline 2024-05-28 13:30:19 -04:00
Cory LaViska
88a9093137 add raw tags 2024-05-28 13:18:35 -04:00
Cory LaViska
f77acb4716 fix comments 2024-05-28 13:08:42 -04:00
Cory LaViska
2f470f129f update comments 2024-05-28 13:07:50 -04:00
Cory LaViska
2d666a0c40 remove unused import 2024-05-28 13:07:38 -04:00
Cory LaViska
51509ddff5 wrap comments 2024-05-28 12:41:44 -04:00
Cory LaViska
d1ae120833 remove js animations from tooltip 2024-05-28 11:53:36 -04:00
Cory LaViska
6dc847f0a4 add built-in animation classes to popup 2024-05-28 11:53:28 -04:00
Cory LaViska
1a6a45c624 update class name 2024-05-28 11:15:26 -04:00
Cory LaViska
79a312acce update changelog 2024-05-28 11:09:56 -04:00
Cory LaViska
41582042fb remove js animations from copy button 2024-05-28 11:09:50 -04:00
Cory LaViska
14556a847f remove js animations from alert 2024-05-28 11:09:40 -04:00
Cory LaViska
463de572fe remove customizing animation docs 2024-05-28 11:09:26 -04:00
Cory LaViska
91d3a98fa4 import utility styles via CSS instead of build 2024-05-28 11:09:15 -04:00
Cory LaViska
a18470e5f7 use nanoid for unsecure contexts 2024-05-28 10:42:25 -04:00
Cory LaViska
0856f20e2f replace uuid util with crypto.randomUUID() 2024-05-28 09:46:15 -04:00
Cory LaViska
d0b9c42d7c prettier 2024-05-24 15:38:20 -04:00
Cory LaViska
a1d614600d Merge pull request #89 from shoelace-style/konnorrogers/form-association-experiment
[DRAFT]: initial prototype of form association experiment
2024-05-24 14:46:20 -04:00
Cory LaViska
3cf3492e23 Merge branch 'next' into konnorrogers/form-association-experiment 2024-05-24 14:46:03 -04:00
Cory LaViska
05193f55f8 Merge pull request #114 from shoelace-style/dialog
Dialog + drawer now use <dialog>
2024-05-24 14:37:50 -04:00
konnorrogers
b8a357c6cc fix all tests 2024-05-23 16:59:15 -04:00
konnorrogers
07599df5f4 fix all tests 2024-05-23 16:58:04 -04:00
konnorrogers
da46b4faf7 Merge branch 'konnorrogers/form-association-experiment' of https://github.com/shoelace-style/webawesome into konnorrogers/form-association-experiment 2024-05-23 16:16:50 -04:00
konnorrogers
ec1305c671 working on feedback 2024-05-23 16:16:45 -04:00
Konnor Rogers
bb47ca0ccd Update src/components/radio-group/radio-group.ts
Co-authored-by: Cory LaViska <cory@abeautifulsite.net>
2024-05-23 16:16:17 -04:00
Cory LaViska
bf7117951a drawer uses <dialog> now 2024-05-23 14:14:02 -04:00
konnorrogers
24851812c1 Merge branch 'next' of https://github.com/shoelace-style/webawesome into konnorrogers/form-association-experiment 2024-05-23 13:14:24 -04:00
Cory LaViska
4be761379d use <dialog> for <wa-dialog> 2024-05-22 14:13:40 -04:00
Cory LaViska
25f3c9b508 Merge pull request #111 from shoelace-style/talbs/update-docs-sidebar
Docs: Add Page component link to Docs Sidebar
2024-05-22 14:10:56 -04:00
Brian Talbot
120067a69d adding Page component to docs sidebar 2024-05-22 13:17:57 -04:00
konnorrogers
0cca54b731 fix test suite to use data-wa-* 2024-05-21 18:40:14 -04:00
Cory LaViska
258d1713e8 add missing image 2024-05-21 16:31:20 -04:00
Cory LaViska
f3cbec4e96 update when family/variant changes; fixes #438 2024-05-21 16:25:07 -04:00
konnorrogers
f0d5a115fc prettier 2024-05-20 18:13:05 -04:00
konnorrogers
8222334835 remove bad examples 2024-05-20 18:12:32 -04:00
Konnor Rogers
f3953bd5c9 Apply suggestions from code review
Co-authored-by: Cory LaViska <cory@abeautifulsite.net>
2024-05-20 18:12:23 -04:00
Konnor Rogers
1d05c315ac Apply suggestions from code review
Co-authored-by: Cory LaViska <cory@abeautifulsite.net>
2024-05-20 13:44:18 -04:00
Cory LaViska
0abd0dec5f Merge pull request #109 from shoelace-style/safari-spinner
fixes #95
2024-05-15 13:53:57 -04:00
Cory LaViska
6d92f03fb2 fix test/remove test 2024-05-15 13:53:44 -04:00
Cory LaViska
8deaaf04e3 fixes #95 2024-05-15 13:51:59 -04:00
Cory LaViska
c4a084ee41 docs fix 2024-05-15 13:13:52 -04:00
Cory LaViska
596697c5c5 Merge pull request #107 from shoelace-style/tab-indicator
Rework active tab indicator and more tab goodness
2024-05-13 16:57:31 -04:00
Cory LaViska
28c8bf1815 remove unused imports 2024-05-13 16:50:55 -04:00
Cory LaViska
296a2e6366 rework tab group 2024-05-13 16:38:32 -04:00
Cory LaViska
4b93aafccf fixes #68 2024-05-13 15:11:22 -04:00
Konnor Rogers
c9f9a88637 Merge branch 'next' of https://github.com/shoelace-style/webawesome into konnorrogers/form-association-experiment 2024-05-11 11:21:56 -04:00
Konnor Rogers
9cb1073082 prettier 2024-05-11 03:29:35 -04:00
Konnor Rogers
a13c02ab02 add test for hasInteracted 2024-05-11 03:28:23 -04:00
konnorrogers
797d6d1eb1 prettier 2024-05-10 21:43:41 -04:00
konnorrogers
4342242455 update everything 2024-05-10 21:31:16 -04:00
Cory LaViska
65c781c086 backport shoelace#2008 2024-05-10 11:13:24 -04:00
Cory LaViska
0b9a0bbb72 backport shoelace#2007 2024-05-10 10:45:53 -04:00
Cory LaViska
d828437316 backport shoelace#2006 2024-05-10 10:18:42 -04:00
konnorrogers
45064505ce switch passes tests 2024-05-09 17:50:23 -04:00
konnorrogers
0cdc54aba7 fix input tests 2024-05-09 12:08:06 -04:00
Cory LaViska
13207d48df Merge pull request #102 from shoelace-style/backports
remove slot detection; #69
2024-05-08 17:21:59 -04:00
Cory LaViska
e8f7342cb6 remove slot detection; #69 2024-05-08 17:20:58 -04:00
konnorrogers
23249dc4e9 prettier 2024-05-08 16:16:14 -04:00
Cory LaViska
1703d1452d Merge pull request #101 from shoelace-style/backports
Backports
2024-05-08 16:05:16 -04:00
Cory LaViska
d0dd3b59e5 backport shoelace#1923 2024-05-08 16:02:43 -04:00
konnorrogers
e6a4eadf1c fixing validation 2024-05-08 14:24:11 -04:00
konnorrogers
34bba3db19 working on tests 2024-05-07 23:00:03 -04:00
konnorrogers
1174200f20 prettier 2024-05-07 19:42:50 -04:00
konnorrogers
1039d8e057 update to use .ts files 2024-05-07 19:33:22 -04:00
konnorrogers
51518df076 remove form controls.md 2024-05-07 16:06:07 -04:00
konnorrogers
398b4c47de remove .component.ts files 2024-05-07 13:52:52 -04:00
konnorrogers
598f598bd0 Merge branch 'next' of https://github.com/shoelace-style/webawesome into konnorrogers/form-association-experiment 2024-05-07 13:03:23 -04:00
Cory LaViska
b28d0ad5c7 backport shoelace#1986 2024-05-07 11:50:30 -04:00
Cory LaViska
2f74995680 backport shoelace#1942 2024-05-07 11:47:30 -04:00
Cory LaViska
c7099f67fa backport shoelace#1967 2024-05-07 11:46:16 -04:00
Cory LaViska
39c4bcf3ea backport shoelace#1948 2024-05-07 11:43:12 -04:00
Cory LaViska
1e059c1fb9 backport shoelace#1911 2024-05-07 11:42:30 -04:00
Cory LaViska
bf5ed6c92a backport shoelace#1922 2024-05-07 11:40:21 -04:00
Cory LaViska
80ce2088a0 backport shoelace#1927 2024-05-07 11:37:41 -04:00
Cory LaViska
61c7329885 add missing bracket 2024-05-07 11:37:16 -04:00
Cory LaViska
11137cf6e3 backport shoelace#1935 2024-05-07 11:34:10 -04:00
Cory LaViska
4444cf45fb backport shoelace#1937 2024-05-07 11:32:36 -04:00
Cory LaViska
659bfda3ba backport shoelace#1895 2024-05-07 11:31:40 -04:00
Cory LaViska
ab4813b38e backport shoelace#1881 2024-05-07 11:27:57 -04:00
Cory LaViska
456b37fa9b backport shoelace#2003 2024-05-07 11:27:00 -04:00
Cory LaViska
7c70242b10 backport shoelace#1893 2024-05-07 11:26:31 -04:00
Cory LaViska
757539f5d2 backport shoelace#1897 2024-05-07 11:25:31 -04:00
konnorrogers
dd33acef98 finish radio group tests 2024-05-06 18:37:57 -04:00
konnorrogers
46f73540ce add notes 2024-05-06 18:27:05 -04:00
konnorrogers
163bb16a1f update radios 2024-05-06 14:08:59 -04:00
Cory LaViska
e8d1b408ac fix missing description errors 2024-05-06 12:34:08 -04:00
Cory LaViska
608df60a9c fix search borders 2024-04-29 12:41:34 -04:00
Cory LaViska
3fb8910ba1 fix code block and copy styles 2024-04-29 12:23:11 -04:00
Cory LaViska
88a1a829f9 rename kitchen sink to themer 2024-04-29 12:16:34 -04:00
Cory LaViska
4901d87ffb update code example syntax 2024-04-29 11:33:06 -04:00
Cory LaViska
ef8d22d3bd remove warning 2024-04-29 11:25:10 -04:00
Cory LaViska
2a25d2aa6f remove log/eslint 2024-04-29 11:12:07 -04:00
Cory LaViska
edbf152f2c fix script 2024-04-29 11:09:16 -04:00
Cory LaViska
8c3b283893 Merge branch 'next' into 11ty3 2024-04-29 11:05:22 -04:00
Cory LaViska
ac576eab7b don't use the autoloader for testing 2024-04-29 10:56:17 -04:00
Cory LaViska
d30cf62f50 compare rounded values 2024-04-29 10:55:52 -04:00
Cory LaViska
6aa641bb33 fix image paths 2024-04-29 10:55:47 -04:00
Cory LaViska
90fdb93ae1 fix missing react tab and copy/code styles 2024-04-29 10:14:11 -04:00
konnorrogers
f7b520b251 Merge branch 'konnorrogers/form-association-experiment' of https://github.com/shoelace-style/webawesome into konnorrogers/form-association-experiment 2024-04-26 13:49:42 -04:00
konnorrogers
1f83a4619f upgrade color picker to form associated 2024-04-26 13:42:49 -04:00
Konnor Rogers
07e0863ce9 converting validators 2024-04-25 00:00:17 -04:00
konnorrogers
84782b3cbe fixing type issues 2024-04-24 18:45:50 -04:00
konnorrogers
ffdcb04a84 working on continued form association 2024-04-24 14:25:30 -04:00
Cory LaViska
f1a65e7dc8 copy dist to production site 2024-04-17 15:11:10 -04:00
Cory LaViska
5ebc1b0cf0 Merge branch '11ty3' of https://github.com/shoelace-style/webawesome into 11ty3 2024-04-17 13:40:11 -04:00
Cory LaViska
f2c09ed486 update tests to use autoloader 2024-04-17 13:40:08 -04:00
Cory LaViska
eee77a13cf not needed 2024-04-17 13:39:16 -04:00
konnorrogers
6fb7e82b7a add form styling 2024-04-17 11:56:31 -04:00
konnorrogers
3dd2fc7669 copy over new themes 2024-04-17 11:53:26 -04:00
Cory LaViska
d0a348111a remove unused var 2024-04-17 11:34:48 -04:00
Cory LaViska
6663afdd10 fix link 2024-04-17 11:27:46 -04:00
Cory LaViska
878fe3b3de heavyyyy 2024-04-17 11:24:33 -04:00
Cory LaViska
67b2888489 oh no where did astro go 2024-04-17 11:20:27 -04:00
konnorrogers
af8be3216f finish select 2024-04-16 18:10:42 -04:00
konnorrogers
fb8430d9e5 working on checkbox 2024-04-11 14:26:25 -04:00
konnorrogers
c028a7a468 Merge branch 'next' of https://github.com/shoelace-style/webawesome into konnorrogers/form-association-experiment 2024-04-10 13:17:03 -04:00
Kelsey Jackson
6423c766e0 Merge pull request #92 from shoelace-style/kj/pattern-building
Kj/pattern building
2024-04-10 10:16:07 -05:00
Kelsey Jackson
6856362174 addressed feedback 2024-04-10 10:01:13 -05:00
konnorrogers
b927019e0c get button working 2024-04-08 11:37:13 -04:00
Kelsey Jackson
1f8640b5f2 added folder to config 2024-04-05 08:13:53 -05:00
Kelsey Jackson
a49b8af638 Merge branch 'next' into kj/pattern-building 2024-04-05 08:04:52 -05:00
Kelsey Jackson
8e49d99d99 e-commerce patterns 2024-04-05 08:03:15 -05:00
konnorrogers
bc9eb79e5e working on button 2024-04-03 18:58:14 -04:00
konnorrogers
c80e35ef58 fix tests for input 2024-03-29 17:44:24 -04:00
konnorrogers
e2ca0e4d5e fix form tests 2024-03-29 14:16:57 -04:00
konnorrogers
e0d79a271a prettier 2024-03-27 14:36:11 -04:00
konnorrogers
a77b9a92cd prettier 2024-03-27 14:34:12 -04:00
konnorrogers
967ffd6e39 fix textarea 2024-03-27 14:32:21 -04:00
konnorrogers
23dbadab91 more work on form association 2024-03-27 14:03:49 -04:00
konnorrogers
6b3d2fe052 prettier 2024-03-19 14:27:33 -04:00
konnorrogers
d566a829e6 initial prototype of form association experiment 2024-03-19 14:22:44 -04:00
1487 changed files with 22608 additions and 49763 deletions

View File

@@ -42,17 +42,19 @@ module.exports = {
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',
'@typescript-eslint/no-implied-eval': 'error',
'no-invalid-this': 'off',
'@typescript-eslint/no-invalid-this': 'error',
'no-shadow': 'off',
'@typescript-eslint/no-shadow': 'error',
'no-throw-literal': 'off',
'@typescript-eslint/no-throw-literal': 'error',
'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',

1
.gitignore vendored
View File

@@ -4,7 +4,6 @@ _site
package.json
package-lock.json
dist
docs/assets/images/sprite.svg
docs/public/pagefind
node_modules
src/react

View File

@@ -1,5 +1,5 @@
*.hbs
*.mdx
*.md
.cache
.github
cspell.json

View File

@@ -141,6 +141,8 @@
"scroller",
"Segoe",
"semibold",
"Shortcode",
"Shortcodes",
"sitedir",
"slotchange",
"smartquotes",
@@ -156,6 +158,7 @@
"testid",
"textareas",
"textfield",
"Themer",
"tinycolor",
"transitionend",
"treeitem",

View File

@@ -1,24 +1,13 @@
import * as path from 'path';
import { customElementJetBrainsPlugin } from 'custom-element-jet-brains-integration';
import { customElementVsCodePlugin } from 'custom-element-vs-code-integration';
import { customElementVuejsPlugin } from 'custom-element-vuejs-integration';
import { parse } from 'comment-parser';
import { pascalCase } from 'pascal-case';
import commandLineArgs from 'command-line-args';
import fs from 'fs';
const packageData = JSON.parse(fs.readFileSync('./package.json', 'utf8'));
const { name, description, version, author, homepage, license } = packageData;
const { outdir } = commandLineArgs([
{ name: 'litelement', type: String },
{ name: 'analyze', defaultOption: true },
{ name: 'outdir', type: String }
]);
function noDash(string) {
return string.replace(/^\s?-/, '').trim();
}
const outdir = 'dist';
function replace(string, terms) {
terms.forEach(({ from, to }) => {
@@ -29,8 +18,10 @@ function replace(string, terms) {
}
export default {
globs: ['src/components/**/*.component.ts'],
globs: ['src/components/**/*.ts'],
exclude: ['**/*.styles.ts', '**/*.test.ts'],
litelement: true,
outdir,
plugins: [
// Append package data
{
@@ -40,35 +31,6 @@ export default {
}
},
// Infer tag names because we no longer use @customElement decorators.
{
name: 'wa-infer-tag-names',
analyzePhase({ ts, node, moduleDoc }) {
switch (node.kind) {
case ts.SyntaxKind.ClassDeclaration: {
const className = node.name.getText();
const classDoc = moduleDoc?.declarations?.find(declaration => declaration.name === className);
const importPath = moduleDoc.path;
// This is kind of a best guess at components. "thing.component.ts"
if (!importPath.endsWith('.component.ts')) {
return;
}
const tagNameWithoutPrefix = path.basename(importPath, '.component.ts');
const tagName = 'wa-' + tagNameWithoutPrefix;
classDoc.tagNameWithoutPrefix = tagNameWithoutPrefix;
classDoc.tagName = tagName;
// This used to be set to true by @customElement
classDoc.customElement = true;
}
}
}
},
// Parse custom jsDoc tags
{
name: 'wa-custom-tags',
@@ -77,7 +39,7 @@ export default {
case ts.SyntaxKind.ClassDeclaration: {
const className = node.name.getText();
const classDoc = moduleDoc?.declarations?.find(declaration => declaration.name === className);
const customTags = ['animation', 'dependency', 'documentation', 'since', 'status', 'title'];
const customTags = ['dependency', 'documentation', 'since', 'status', 'title'];
let customComments = '/**';
node.jsDoc?.forEach(jsDoc => {
@@ -96,17 +58,6 @@ export default {
const parsed = parse(`${customComments}\n */`);
parsed[0].tags?.forEach(t => {
switch (t.tag) {
// Animations
case 'animation':
if (!Array.isArray(classDoc['animations'])) {
classDoc['animations'] = [];
}
classDoc['animations'].push({
name: t.name,
description: noDash(t.description)
});
break;
// Dependencies
case 'dependency':
if (!Array.isArray(classDoc['dependencies'])) {
@@ -151,6 +102,7 @@ export default {
if (classDoc?.events) {
classDoc.events.forEach(event => {
if (!event.name) return;
event.reactName = `on${pascalCase(event.name)}`;
event.eventName = `${pascalCase(event.name)}Event`;
});
@@ -175,7 +127,7 @@ export default {
//
const terms = [
{ from: /^src\//, to: '' }, // Strip the src/ prefix
{ from: /\.component.(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);
@@ -219,12 +171,15 @@ export default {
url: `https://shoelace.style/components/${tag.replace('wa-', '')}`
};
}
}),
customElementVuejsPlugin({
outdir: './dist/types/vue',
fileName: 'index.d.ts',
componentTypePath: (_, tag) => `../../components/${tag.replace('wa-', '')}/${tag.replace('wa-', '')}.component.js`
})
//
// TODO - figure out why this broke when events were updated
//
// customElementVuejsPlugin({
// outdir: './dist/types/vue',
// fileName: 'index.d.ts',
// componentTypePath: (_, tag) => `../../components/${tag.replace('wa-', '')}/${tag.replace('wa-', '')}.js`
// })
]
};

126
docs/.eleventy.js Normal file
View File

@@ -0,0 +1,126 @@
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']
};
}

View File

@@ -1,4 +0,0 @@
{
"recommendations": ["astro-build.astro-vscode"],
"unwantedRecommendations": []
}

View File

@@ -1,11 +0,0 @@
{
"version": "0.2.0",
"configurations": [
{
"command": "./node_modules/.bin/astro dev",
"name": "Development server",
"request": "launch",
"type": "node-terminal"
}
]
}

11
docs/404.md Normal file
View File

@@ -0,0 +1,11 @@
---
title: Not Found
description: Sorry, I couldn't find that.
layout: page.njk
permalink: 404.html
noindex: true
---
<p class="subtitle">{{ description }}</p>
<p>Have you tried searching?</p>

98
docs/_includes/base.njk Normal file

File diff suppressed because one or more lines are too long

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

61
docs/_includes/search.njk Normal file
View File

@@ -0,0 +1,61 @@
<wa-dialog id="site-search" no-header>
<div id="site-search-container">
{# Header #}
<header>
<div id="site-search-input-wrapper">
<wa-input
id="site-search-input"
type="search"
filled
size="large"
clearable
placeholder="Search"
autofocus
autocomplete="off"
autocorrect="off"
autocapitalize="off"
enterkeyhint="go"
spellcheck="false"
maxlength="100"
role="combobox"
aria-autocomplete="list"
aria-expanded="true"
aria-controls="site-search-listbox"
aria-haspopup="listbox"
aria-activedescendant
>
<wa-icon slot="prefix" name="search"></wa-icon>
</wa-input>
</div>
</header>
{# Body #}
<div id="site-search-body">
<ul
id="site-search-listbox"
role="listbox"
aria-label="Search results"
></ul>
<div id="site-search-empty">
<wa-icon name="web-awesome" family="brands"></wa-icon>
No results
</div>
</div>
{# Footer #}
<footer>
<small>
<kbd aria-label="Up"><wa-icon name="arrow-up" family="micro"></wa-icon></kbd>
<kbd aria-label="Down"><wa-icon name="arrow-down" family="micro"></wa-icon></kbd>
Navigate
</small>
<small>
<kbd>Enter</kbd>
Select
</small>
<small><kbd>Esc</kbd> Close</small>
</footer>
</div>
</wa-dialog>

234
docs/_includes/sidebar.njk Normal file
View File

@@ -0,0 +1,234 @@
{# 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 &amp; 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>

298
docs/_layouts/component.njk Normal file
View File

@@ -0,0 +1,298 @@
{% set hasSidebar = true %}
{% set hasOutline = true %}
{% set component = getComponent('wa-' + page.fileSlug) %}
{% set description = component.summary %}
{% extends '../_includes/base.njk' %}
{# Component header #}
{% block beforeContent %}
<h1 class="title">{{ title }}</h1>
<div class="component-info">
<code class="component-tag">&lt;{{ component.tagName }}&gt;</code>
<wa-badge variant="neutral">Since {{ component.since }}</wa-badge>
<wa-badge
{% if component.status == 'stable' %}variant="brand"{% endif %}
{% if component.status == 'experimental' %}variant="warning"{% endif %}
>
{{ component.status }}
</wa-badge>
</div>
<p class="component-summary">
{{ component.summary }}
</p>
{% endblock %}
{# Content #}
{% block content %}
{{ content | safe }}
{% endblock %}
{# Component API #}
{% block afterContent %}
{# Slots #}
{% if component.slots.length %}
<h2>Slots</h2>
<div class="table-scroll">
<table class="component-table">
<thead>
<tr>
<th class="table-name">Name</th>
<th class="table-description">Description</th>
</tr>
</thead>
<tbody>
{% for slot in component.slots %}
<tr>
<td class="table-name">
{% if slot.name %}
<code>{{ slot.name }}</code>
{% else %}
(default)
{% endif %}
</td>
<td class="table-description">{{ slot.description | inlineMarkdown | safe }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
{# Properties #}
{% if component.properties.length %}
<h2>Properties</h2>
<div class="table-scroll">
<table class="component-table">
<thead>
<tr>
<th class="table-name">Name</th>
<th class="table-attribute">Attribute</th>
<th class="table-description">Description</th>
<th class="table-reflects">Reflects</th>
<th class="table-type">Type</th>
<th class="table-default">Default</th>
</tr>
</thead>
<tbody>
{% for prop in component.properties %}
<tr>
<td class="table-name">
<code>{{ prop.name }}</code>
</td>
<td class="table-attribute">
{% if prop.attribute %}
<code>{{ prop.attribute }}</code>
{% endif %}
</td>
<td class="table-description">
{{ prop.description | inlineMarkdown | safe }}
</td>
<td class="table-checkmark">
{% if prop.reflects %}
<wa-icon name="check"></wa-icon>
{% endif %}
</td>
<td class="table-type">
{% if prop.type.text %}
<code>{{ prop.type.text | trimPipes | inlineMarkdown | safe }}</code>
{% endif %}
</td>
<td class="table-default">
{% if prop.default %}
<code>{{ prop.default | inlineMarkdown | safe }}</code>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
{# Methods #}
{% if component.methods.length %}
<h2>Methods</h2>
<div class="table-scroll">
<table class="component-table">
<thead>
<tr>
<th class="table-name">Name</th>
<th class="table-description">Description</th>
<th class="table-arguments">Arguments</th>
</tr>
</thead>
<tbody>
{% for method in component.methods %}
<tr>
<td class="table-name"><code>{{ method.name }}()</code></td>
<td class="table-description">{{ method.description | inlineMarkdown | safe }}</td>
<td class="table-arguments">
{% if method.parameters.length %}
<code>
{% for param in method.parameters %}
{{ param.name }}: {{ param.type.text | trimPipes }}{% if not loop.last %},{% endif %}
{% endfor %}
</code>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
{# States #}
{% if component.states.length %}
<h2>States</h2>
<div class="table-scroll">
<table class="component-table">
<thead>
<tr>
<th class="table-name">Name</th>
<th class="table-description">Description</th>
<th class="table-selector">CSS selector</th>
</tr>
</thead>
<tbody>
{% for state in component.states %}
<tr>
<td class="table-name"><code>{{ state.name }}</code></td>
<td class="table-description">{{ state.description | inlineMarkdown | safe }}</td>
<td class="table-selector"><code>[data-state-{{ state.name }}]</code></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
{# Events #}
{% if component.events.length %}
<h2>Events</h2>
<div class="table-scroll">
<table class="component-table">
<thead>
<tr>
<th class="table-name">Name</th>
<th class="table-description">Description</th>
</tr>
</thead>
<tbody>
{% for event in component.events %}
{% if event.name %}
<tr>
<td class="table-name"><code>{{ event.name }}</code></td>
<td class="table-description">{{ event.description | inlineMarkdown | safe }}</td>
</tr>
{% endif %}
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
{# Custom Properties #}
{% if component.cssProperties.length %}
<h2>CSS custom properties</h2>
<div class="table-scroll">
<table class="component-table">
<thead>
<tr>
<th class="table-name">Name</th>
<th class="table-description">Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
{% for cssProperty in component.cssProperties %}
<tr>
<td class="table-name"><code>{{ cssProperty.name }}</code></td>
<td class="table-description">{{ cssProperty.description | inlineMarkdown | safe }}</td>
<td class="table-default">
{% if cssProperty.default %}
<code>{{ cssProperty.default }}</code>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
{# CSS Parts #}
{% if component.cssParts.length %}
<h2>CSS parts</h2>
<div class="table-scroll">
<table class="component-table">
<thead>
<tr>
<th class="table-name">Name</th>
<th class="table-description">Description</th>
<th class="table-selector">CSS selector</th>
</tr>
</thead>
<tbody>
{% for cssPart in component.cssParts %}
<tr>
<td class="table-name"><code>{{ cssPart.name }}</code></td>
<td class="table-description">{{ cssPart.description | inlineMarkdown | safe }}</td>
<td class="table-selector"><code>::part({{ cssPart.name }})</code></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
{# Dependencies #}
{% if component.dependencies.length %}
<h2>Dependencies</h2>
<p>
This component automatically imports the following elements. Subdependencies, if any exist, will also be included in this list.
</p>
<ul class="dependency-list">
{% for dependency in component.dependencies %}
<li><a href="/docs/components/{{ dependency | stripPrefix }}"><code>&lt;{{ dependency }}&gt;</code></a></li>
{% endfor %}
</ul>
{% endif %}
{# Importing #}
<h2>Importing</h2>
<p>
The <a href="/docs/#autoloading">autoloader</a> is the recommended way to import components. If you prefer to do it manually, use one of the following code snippets.
</p>
<wa-tab-group label="How would you like to import this component?">
<wa-tab slot="nav" panel="cdn">CDN</wa-tab>
<wa-tab slot="nav" panel="npm">npm</wa-tab>
<wa-tab slot="nav" panel="react">React</wa-tab>
<wa-tab-panel name="cdn">
<p>
To manually import this component from the CDN, use the following code.
</p>
<pre><code class="language-js">import '{% cdnUrl component.path %}';</code></pre>
</wa-tab-panel>
<wa-tab-panel name="npm">
<p>
To manually import this component from npm, use the following code.
</p>
<pre><code class="language-js">import '@shoelace-style/webawesome/{{ component.path }}';</code></pre>
</wa-tab-panel>
<wa-tab-panel name="react">
<p>
To manually import this component from React, use the following code.
</p>
<pre><code class="language-js">import '@shoelace-style/webawesome/react/{{ component.tagName | stripPrefix }}';</code></pre>
</wa-tab-panel>
</wa-tab-group>
{% endblock %}

5
docs/_layouts/docs.njk Normal file
View File

@@ -0,0 +1,5 @@
{% set hasSidebar = true %}
{% set hasOutline = true %}
{% set section = 'docs' %}
{% extends "../_includes/base.njk" %}

4
docs/_layouts/page.njk Normal file
View File

@@ -0,0 +1,4 @@
{% set hasSidebar = true %}
{% set hasOutline = false %}
{% extends "../_includes/base.njk" %}

View File

@@ -0,0 +1,78 @@
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();
});
};
}

View File

@@ -0,0 +1,82 @@
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();
});
};
}

32
docs/_utils/copy-code.js Normal file
View File

@@ -0,0 +1,32 @@
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();
});
};
}

View File

@@ -0,0 +1,53 @@
import { parse } from 'node-html-parser';
function normalize(pathname) {
pathname = pathname.trim();
// Must start with a slash
if (!pathname.startsWith('/')) {
pathname = `/${pathname}`;
}
// Must not end in a slash
if (pathname.endsWith('/')) {
pathname = pathname.slice(0, -1);
}
// Convert /index.html to /
if (pathname.endsWith('/index.html')) {
pathname = pathname.slice(0, -10);
}
return pathname;
}
/**
* Eleventy plugin to decorate current links with a custom class.
*/
export function currentLink(options = {}) {
options = {
container: 'body',
className: 'current',
...options
};
return function (eleventyConfig) {
eleventyConfig.addTransform('current-link', function (content) {
const doc = parse(content);
const container = doc.querySelector(options.container);
if (!container) {
return content;
}
// Compare the href attribute to 11ty's page URL
container.querySelectorAll('a[href]').forEach(a => {
if (normalize(a.getAttribute('href')) === normalize(this.page.url)) {
a.classList.add(options.className);
}
});
return doc.toString();
});
};
}

View File

@@ -0,0 +1,32 @@
import { format } from 'prettier';
import defaultOptions from '../../prettier.config.js';
/**
* Formats a string of code using Prettier.
*
* @param {string} code - The code to format.
* @param {*} options - Prettier options. Defaults are taken from the project's root config. See this page for more
* info: https://prettier.io/docs/en/options.html
*/
export async function formatCode(string, options) {
return await format(string, {
...defaultOptions,
...options
});
}
/**
* Eleventy plugin to format page HTML using Prettier.
*/
export function formatCodePlugin(options = {}) {
options = {
parser: 'html',
...options
};
return function (eleventyConfig) {
eleventyConfig.addTransform('format-code', content => {
return formatCode(content, options);
});
};
}

View File

@@ -0,0 +1,72 @@
/* eslint sort-imports-es6-autofix/sort-imports-es6: 0 */
import { parse } from 'node-html-parser';
import Prism from 'prismjs';
import 'prismjs/plugins/custom-class/prism-custom-class.js';
import PrismLoader from 'prismjs/components/index.js';
PrismLoader('diff');
PrismLoader.silent = true;
Prism.plugins.customClass.prefix('code-');
/**
* Highlights a string of code using the specified language.
*
* @param {string} code - The code to highlight.
* @param {string} language - The language the code is written in. For available languages, refer to this page:
* https://prismjs.com/#supported-languages
*/
export function highlightCode(code, language = 'plain') {
const alias = language.replace(/^diff-/, '');
const isDiff = /^diff-/i.test(language);
if (!Prism.languages[alias]) {
PrismLoader(alias);
if (!Prism.languages[alias]) {
throw new Error(`Unsupported language for code highlighting: "${language}"`);
}
}
if (isDiff) {
Prism.languages[language] = Prism.languages.diff;
}
return Prism.highlight(code, Prism.languages[language], language);
}
/**
* Eleventy plugin to highlight code blocks with the `language-*` attribute using Prism.js. Unlike most plugins, this
* works on the entire document — not just markdown content.
*/
export function highlightCodePlugin(options = {}) {
options = {
container: 'body',
...options
};
return function (eleventyConfig) {
eleventyConfig.addTransform('highlight-code', content => {
const doc = parse(content, { blockTextElements: { code: true } });
const container = doc.querySelector(options.container);
if (!container) {
return content;
}
// Look for <code class="language-*"> and highlight each one
container.querySelectorAll('code[class*="language-"]').forEach(code => {
const langClass = [...code.classList.values()].find(val => val.startsWith('language-'));
const lang = langClass ? langClass.replace(/^language-/, '') : 'plain';
try {
code.innerHTML = highlightCode(code.textContent ?? '', lang);
} catch (err) {
if (!options.ignoreMissingLangs) {
throw new Error(err.message);
}
}
});
return doc.toString();
});
};
}

71
docs/_utils/manifest.js Normal file
View File

@@ -0,0 +1,71 @@
import { fileURLToPath } from 'url';
import { dirname, resolve } from 'path';
import { readFileSync } from 'fs';
const __dirname = dirname(fileURLToPath(import.meta.url));
const manifest = JSON.parse(readFileSync(resolve(__dirname, '../../dist/custom-elements.json'), 'utf-8'));
/**
* @returns Fetches components from custom-elements.json and returns them in more sane format.
*/
export function getComponents() {
const components = [];
manifest.modules?.forEach(module => {
module.declarations?.forEach(declaration => {
if (declaration.customElement) {
// Generate the dist path based on the src path and attach it to the component
declaration.path = module.path.replace(/^src\//, 'dist/').replace(/\.ts$/, '.js');
// Remove private members and those that lack a description
const members = declaration.members?.filter(member => member.description && member.privacy !== 'private');
const methods = members?.filter(prop => prop.kind === 'method' && prop.privacy !== 'private');
const properties = members?.filter(prop => {
// Look for a corresponding attribute
const attribute = declaration.attributes?.find(attr => attr.fieldName === prop.name);
if (attribute) {
prop.attribute = attribute.name || attribute.fieldName;
}
return prop.kind === 'field' && prop.privacy !== 'private';
});
components.push({
...declaration,
methods,
properties
});
}
});
});
// Build dependency graphs
components.forEach(component => {
const dependencies = [];
// Recursively fetch sub-dependencies
function getDependencies(tag) {
const cmp = components.find(c => c.tagName === tag);
if (!cmp || !Array.isArray(component.dependencies)) {
return;
}
cmp.dependencies?.forEach(dependentTag => {
if (!dependencies.includes(dependentTag)) {
dependencies.push(dependentTag);
}
getDependencies(dependentTag);
});
}
getDependencies(component.tagName);
component.dependencies = dependencies.sort();
});
// Sort by name
return components.sort((a, b) => {
if (a.name < b.name) return -1;
if (a.name > b.name) return 1;
return 0;
});
}

63
docs/_utils/markdown.js Normal file
View File

@@ -0,0 +1,63 @@
import MarkdownIt from 'markdown-it';
import markdownItAttrs from 'markdown-it-attrs';
import markdownItContainer from 'markdown-it-container';
import markdownItIns from 'markdown-it-ins';
import markdownItKbd from 'markdown-it-kbd';
import markdownItMark from 'markdown-it-mark';
/**
* A custom Markdown It instance with added features.
*/
export const markdown = MarkdownIt({
html: true,
xhtmlOut: false,
breaks: false,
langPrefix: 'language-',
linkify: false,
typographer: false
});
markdown.use(markdownItIns);
markdown.use(markdownItKbd);
markdown.use(markdownItMark);
['info', 'warning'].forEach(type => {
markdown.use(markdownItContainer, type, {
render: function (tokens, idx) {
const variant = type === 'warning' ? 'warning' : 'info';
const icon = type === 'warning' ? 'triangle-exclamation' : 'circle-info';
if (tokens[idx].nesting === 1) {
return `
<div class="callout callout-${variant}">
<wa-icon class="callout-icon" name="${icon}"></wa-icon>
<div class="callout-content">
`;
}
return '</div></div>\n';
}
});
});
markdown.use(markdownItContainer, 'aside', {
render: function (tokens, idx) {
if (tokens[idx].nesting === 1) {
return `<aside>`;
}
return '</aside>\n';
}
});
markdown.use(markdownItContainer, 'details', {
validate: params => params.trim().match(/^details\s+(.*)$/),
render: (tokens, idx) => {
const m = tokens[idx].info.trim().match(/^details\s+(.*)$/);
if (tokens[idx].nesting === 1) {
return `<details>\n<summary><span>${markdown.utils.escapeHtml(m[1])}</span></summary>\n`;
}
return '</details>\n';
}
});
markdown.use(markdownItAttrs, {
allowedAttributes: ['id', 'class', 'data']
});

69
docs/_utils/outline.js Normal file
View File

@@ -0,0 +1,69 @@
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();
});
};
}

View File

@@ -0,0 +1,19 @@
/**
* Eleventy plugin to replace arbitrary text in the page's HTML.
*
* @param replacement - The terms to replace and what to replace them with. This must be an object (or an array of
* objects) containing a `replace` key that's a string or RegExp and a `replaceWith` key that's a string.
*/
export function replaceTextPlugin(replacements = []) {
replacements = Array.isArray(replacements) ? replacements : [replacements];
return function (eleventyConfig) {
eleventyConfig.addTransform('replace-text', function (content) {
replacements.forEach(replacement => {
content = content.replace(replacement.replace, replacement.replaceWith);
});
return content;
});
};
}

76
docs/_utils/search.js Normal file
View File

@@ -0,0 +1,76 @@
/* 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');
});
});
};
}

View File

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 91 KiB

View File

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 69 KiB

View File

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 100 KiB

View File

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View File

Before

Width:  |  Height:  |  Size: 175 KiB

After

Width:  |  Height:  |  Size: 175 KiB

View File

Before

Width:  |  Height:  |  Size: 308 B

After

Width:  |  Height:  |  Size: 308 B

View File

Before

Width:  |  Height:  |  Size: 356 B

After

Width:  |  Height:  |  Size: 356 B

View File

Before

Width:  |  Height:  |  Size: 786 B

After

Width:  |  Height:  |  Size: 786 B

View File

Before

Width:  |  Height:  |  Size: 607 B

After

Width:  |  Height:  |  Size: 607 B

View File

Before

Width:  |  Height:  |  Size: 305 B

After

Width:  |  Height:  |  Size: 305 B

View File

Before

Width:  |  Height:  |  Size: 872 B

After

Width:  |  Height:  |  Size: 872 B

View File

Before

Width:  |  Height:  |  Size: 465 B

After

Width:  |  Height:  |  Size: 465 B

View File

Before

Width:  |  Height:  |  Size: 770 B

After

Width:  |  Height:  |  Size: 770 B

View File

Before

Width:  |  Height:  |  Size: 330 B

After

Width:  |  Height:  |  Size: 330 B

View File

Before

Width:  |  Height:  |  Size: 754 B

After

Width:  |  Height:  |  Size: 754 B

View File

Before

Width:  |  Height:  |  Size: 812 B

After

Width:  |  Height:  |  Size: 812 B

View File

Before

Width:  |  Height:  |  Size: 322 B

After

Width:  |  Height:  |  Size: 322 B

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 465 B

After

Width:  |  Height:  |  Size: 465 B

View File

Before

Width:  |  Height:  |  Size: 321 B

After

Width:  |  Height:  |  Size: 321 B

View File

Before

Width:  |  Height:  |  Size: 289 B

After

Width:  |  Height:  |  Size: 289 B

View File

Before

Width:  |  Height:  |  Size: 267 B

After

Width:  |  Height:  |  Size: 267 B

View File

Before

Width:  |  Height:  |  Size: 460 B

After

Width:  |  Height:  |  Size: 460 B

View File

Before

Width:  |  Height:  |  Size: 333 B

After

Width:  |  Height:  |  Size: 333 B

View File

Before

Width:  |  Height:  |  Size: 305 B

After

Width:  |  Height:  |  Size: 305 B

View File

Before

Width:  |  Height:  |  Size: 337 B

After

Width:  |  Height:  |  Size: 337 B

View File

Before

Width:  |  Height:  |  Size: 383 B

After

Width:  |  Height:  |  Size: 383 B

View File

Before

Width:  |  Height:  |  Size: 272 B

After

Width:  |  Height:  |  Size: 272 B

View File

Before

Width:  |  Height:  |  Size: 421 B

After

Width:  |  Height:  |  Size: 421 B

View File

Before

Width:  |  Height:  |  Size: 525 B

After

Width:  |  Height:  |  Size: 525 B

View File

Before

Width:  |  Height:  |  Size: 1003 B

After

Width:  |  Height:  |  Size: 1003 B

View File

Before

Width:  |  Height:  |  Size: 619 B

After

Width:  |  Height:  |  Size: 619 B

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 351 B

After

Width:  |  Height:  |  Size: 351 B

View File

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

Before

Width:  |  Height:  |  Size: 456 B

After

Width:  |  Height:  |  Size: 456 B

View File

Before

Width:  |  Height:  |  Size: 387 B

After

Width:  |  Height:  |  Size: 387 B

View File

Before

Width:  |  Height:  |  Size: 973 B

After

Width:  |  Height:  |  Size: 973 B

View File

Before

Width:  |  Height:  |  Size: 441 B

After

Width:  |  Height:  |  Size: 441 B

View File

Before

Width:  |  Height:  |  Size: 463 B

After

Width:  |  Height:  |  Size: 463 B

View File

Before

Width:  |  Height:  |  Size: 334 B

After

Width:  |  Height:  |  Size: 334 B

View File

Before

Width:  |  Height:  |  Size: 315 B

After

Width:  |  Height:  |  Size: 315 B

View File

Before

Width:  |  Height:  |  Size: 402 B

After

Width:  |  Height:  |  Size: 402 B

View File

Before

Width:  |  Height:  |  Size: 225 B

After

Width:  |  Height:  |  Size: 225 B

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 423 B

After

Width:  |  Height:  |  Size: 423 B

View File

Before

Width:  |  Height:  |  Size: 789 B

After

Width:  |  Height:  |  Size: 789 B

View File

Before

Width:  |  Height:  |  Size: 360 B

After

Width:  |  Height:  |  Size: 360 B

View File

Before

Width:  |  Height:  |  Size: 267 B

After

Width:  |  Height:  |  Size: 267 B

View File

Before

Width:  |  Height:  |  Size: 998 B

After

Width:  |  Height:  |  Size: 998 B

View File

Before

Width:  |  Height:  |  Size: 399 B

After

Width:  |  Height:  |  Size: 399 B

View File

Before

Width:  |  Height:  |  Size: 574 B

After

Width:  |  Height:  |  Size: 574 B

View File

Before

Width:  |  Height:  |  Size: 454 B

After

Width:  |  Height:  |  Size: 454 B

View File

Before

Width:  |  Height:  |  Size: 919 B

After

Width:  |  Height:  |  Size: 919 B

View File

Before

Width:  |  Height:  |  Size: 375 B

After

Width:  |  Height:  |  Size: 375 B

View File

Before

Width:  |  Height:  |  Size: 427 B

After

Width:  |  Height:  |  Size: 427 B

View File

Before

Width:  |  Height:  |  Size: 308 B

After

Width:  |  Height:  |  Size: 308 B

View File

Before

Width:  |  Height:  |  Size: 443 B

After

Width:  |  Height:  |  Size: 443 B

View File

Before

Width:  |  Height:  |  Size: 492 B

After

Width:  |  Height:  |  Size: 492 B

View File

Before

Width:  |  Height:  |  Size: 303 B

After

Width:  |  Height:  |  Size: 303 B

View File

Before

Width:  |  Height:  |  Size: 685 B

After

Width:  |  Height:  |  Size: 685 B

View File

Before

Width:  |  Height:  |  Size: 350 B

After

Width:  |  Height:  |  Size: 350 B

View File

Before

Width:  |  Height:  |  Size: 607 B

After

Width:  |  Height:  |  Size: 607 B

View File

Before

Width:  |  Height:  |  Size: 1020 B

After

Width:  |  Height:  |  Size: 1020 B

View File

Before

Width:  |  Height:  |  Size: 910 B

After

Width:  |  Height:  |  Size: 910 B

View File

Before

Width:  |  Height:  |  Size: 412 B

After

Width:  |  Height:  |  Size: 412 B

View File

Before

Width:  |  Height:  |  Size: 385 B

After

Width:  |  Height:  |  Size: 385 B

View File

Before

Width:  |  Height:  |  Size: 356 B

After

Width:  |  Height:  |  Size: 356 B

View File

Before

Width:  |  Height:  |  Size: 366 B

After

Width:  |  Height:  |  Size: 366 B

View File

Before

Width:  |  Height:  |  Size: 372 B

After

Width:  |  Height:  |  Size: 372 B

Some files were not shown because too many files have changed in this diff Show More