Compare commits

..

395 Commits

Author SHA1 Message Date
lindsaym-fa
ae1caa0f66 Merge branch 'next' into patterns-exploration 2024-01-26 10:17:43 -05:00
lindsaym-fa
130844df1c add custom properties to carousel 2024-01-25 14:08:31 -05:00
lindsaym-fa
d6cfa1ab24 add custom properties to tag 2024-01-24 16:40:25 -05:00
Cory LaViska
ec613f8d32 backport 1797 2024-01-24 13:31:42 -05:00
Cory LaViska
52e2518365 backport 1818 2024-01-24 13:24:29 -05:00
Cory LaViska
9b7aad71a9 backport 1831 2024-01-24 13:23:41 -05:00
Cory LaViska
b7541d240b backport 1828 2024-01-24 13:21:27 -05:00
Cory LaViska
c67da1e818 backport 1826 2024-01-24 13:20:36 -05:00
Cory LaViska
265e523a56 backport 1822 2024-01-24 13:16:38 -05:00
Cory LaViska
bfe05d0692 backport 1821 2024-01-24 12:25:13 -05:00
Cory LaViska
651eae8cb6 backport 1820 2024-01-24 12:21:41 -05:00
lindsaym-fa
8c8b3f1853 add custom properties to badge 2024-01-23 11:27:01 -05:00
lindsaym-fa
af01e0d060 Merge branch 'next' into patterns-exploration 2024-01-18 08:50:24 -06:00
lindsaym-fa
d1ed504dd8 update custom properties on checkbox doc 2024-01-18 08:46:51 -06:00
lindsaym-fa
5335c9421a add depth to checkbox 2024-01-17 16:44:34 -06:00
lindsaym-fa
1b380f3f1d document custom properties for checkbox 2024-01-17 09:33:11 -06:00
lindsaym-fa
d166bc0e48 add custom properties to checkbox 2024-01-17 09:08:26 -06:00
lindsaym-fa
595cc303e7 add custom property for progress bar shadows 2024-01-16 14:08:11 -06:00
lindsaym-fa
4260b27fd2 tweak spacing for playful theme 2024-01-16 13:55:59 -06:00
lindsaym-fa
7c6f018c5b rename border tokens with s/m/l convention 2024-01-16 13:50:30 -06:00
lindsaym-fa
b892f1f86a re-integrate borders into main theme stylesheets 2024-01-16 13:42:32 -06:00
lindsaym-fa
a0e9125d61 add custom properties to details component 2024-01-16 13:13:32 -06:00
lindsaym-fa
5b741006a1 tweak playful theme font weights 2024-01-16 12:57:12 -06:00
lindsaym-fa
30bfabc397 add link decoration tokens; undo dark mode borders 2024-01-16 10:02:49 -06:00
lindsaym-fa
23420baa63 tweak blog listing 2024-01-15 09:20:15 -06:00
lindsaym-fa
4e1bea7d94 update fonts, remove font imports from themes 2024-01-15 09:18:34 -06:00
lindsaym-fa
31dd31e857 Merge branch 'next' into patterns-exploration 2024-01-08 23:34:21 -05:00
lindsaym-fa
f2bb9fefee dark theme adjustments 2024-01-08 23:19:14 -05:00
lindsaym-fa
9987ce8d4f simplify themer logic 2024-01-08 22:49:48 -05:00
lindsaym-fa
4ace1efbe0 minor themer tweaks 2024-01-08 18:06:02 -05:00
Konnor Rogers
d7920f2e75 Add logo uploader (#18)
* fix tabbable, add logo uploader

* Add icon chooser and project name to themer

* Add icon chooser and project name to themer

* make theme swapping less jarring

* add depth to themer

* update font families / font weights on theme change

* fix prettier

* update themer to reset values on theme change

* remove custom-elements.mjs

* prettier

* update comments in isVisible

* add PR #

* prettier

* update changelog

* prettier

* update changelog

* fix themer

* ensure target exists

* update icon search

* prettier

* fix select test

* prettier

* fix sprite svg

* remove custom-elements.mjs

* Add small validation to themer

* prettier

* fix conflicts

* prettier

* remove cem-manifest.mjs

---------

Co-authored-by: Cory LaViska <cory@abeautifulsite.net>
2024-01-08 16:43:57 -05:00
Kelsey Jackson
4198cf0f15 Merge pull request #24 from shoelace-style/theming-ui/dark-mode-for-all-themes
add the ability to toggle light and dark mode for themes
2024-01-08 14:03:16 -06:00
Kelsey Jackson
7562905bbf made updates 2024-01-05 15:20:33 -06:00
lindsaym-fa
16477dc434 refactor grid and flex classes 2024-01-05 02:04:40 -05:00
Kelsey Jackson
4914cdb352 Merge pull request #23 from shoelace-style/theming-ui/add-curated-font-list
add list of curated fonts
2024-01-04 18:08:21 -06:00
lindsaym-fa
7c6ca6e487 progress on blog patterns 2024-01-04 19:06:18 -05:00
lindsaym-fa
812ea94ff4 progress on blog patterns, layout utility classes 2024-01-03 19:01:12 -05:00
Kelsey Jackson
0c95c70192 updated spacing issue 2024-01-03 11:30:16 -06:00
Kelsey Jackson
430730f24a Merge branch 'next' into theming-ui/add-curated-font-list 2024-01-03 11:01:05 -06:00
Kelsey Jackson
ab0c615e10 updated text 2024-01-03 10:46:53 -06:00
Kelsey Jackson
716ab94069 Merge branch 'next' into theming-ui/dark-mode-for-all-themes 2024-01-03 10:26:08 -06:00
lindsaym-fa
bf65b6bc0d progress on new blog listing patterns 2024-01-02 17:44:25 -05:00
lindsaym-fa
b3c47d2298 tweak demo margin 2023-12-22 18:42:56 -05:00
lindsaym-fa
5e16866ee6 refactor grids, break patterns into snippets 2023-12-22 18:15:20 -05:00
lindsaym-fa
abf77783ac semantic improvements and style cleanup 2023-12-21 17:54:02 -05:00
lindsaym-fa
5749c13ef0 Merge branch 'next' into patterns-exploration 2023-12-13 17:44:42 -05:00
lindsaym-fa
ccc6f1aa23 adjust applied code background color 2023-12-13 17:44:25 -05:00
lindsaym-fa
893f8b2740 fix sandbox icons 2023-12-13 17:10:08 -05:00
lindsaym-fa
00d5164912 touch up icons 2023-12-13 17:02:24 -05:00
lindsaym-fa
42922f06ed correct icon names 2023-12-13 15:10:57 -05:00
lindsaym-fa
d8479b0afd Merge branch 'next' into patterns-exploration 2023-12-13 14:50:28 -05:00
Cory LaViska
fc9151e573 backport 1787 2023-12-13 12:04:53 -05:00
Kelsey Jackson
cf97bc3c6c add the ability to toggle light and dark mode for themes 2023-12-12 10:58:29 -06:00
Cory LaViska
eb9dbf097c prettier 2023-12-11 16:53:11 -05:00
konnorrogers
5422e6431c fix copying cdn build to _site after its been built 2023-12-11 16:25:24 -05:00
Cory LaViska
f3a921022e Merge branch 'icon' into next 2023-12-11 16:02:12 -05:00
Cory LaViska
be1440aee0 update settings 2023-12-11 16:01:44 -05:00
Kelsey Jackson
fe23a7ddb8 add list of curated fonts 2023-12-11 11:51:53 -06:00
lindsaym-fa
9a427bca28 Merge branch 'next' into patterns-exploration 2023-12-08 17:56:51 -05:00
lindsaym-fa
f53a643cf3 improve typescale 2023-12-08 17:53:33 -05:00
Konnor Rogers
3f604fcee1 prettier (#20) 2023-12-08 15:09:34 -05:00
lindsaym-fa
d8b6db8c5b darken background in themer sample UI 2023-12-08 14:19:54 -05:00
lindsaym-fa
31215dbda4 define font size at root in applied styles 2023-12-08 14:18:24 -05:00
lindsaym-fa
d5a2ab85f9 tweaks and refinements 2023-12-07 22:30:36 -05:00
lindsaym-fa
3c32a38314 add reviews list, overall improvements 2023-12-07 18:00:40 -05:00
Cory LaViska
f00e8c3a65 prettier ci output 2023-12-07 16:30:37 -05:00
Cory LaViska
a4f8bf94ee fix 2023-12-07 16:26:44 -05:00
Cory LaViska
8ae1303188 sigh 2023-12-07 16:26:07 -05:00
Cory LaViska
ffc0248e4c fix build 2023-12-07 15:59:53 -05:00
konnorrogers
81d3f22da6 fix dev server output for errors / logging 2023-12-07 15:18:56 -05:00
Cory LaViska
0fa8e6f550 update build 2023-12-07 14:58:12 -05:00
Cory LaViska
a67d1df89a fix error 2023-12-07 14:57:53 -05:00
Cory LaViska
0fe400c6f4 Merge branch 'next' into icon 2023-12-07 10:09:54 -05:00
Cory LaViska
fcf0a136f2 backport 1771 2023-12-06 16:26:15 -05:00
Cory LaViska
8acfc4c9de backport 1767 2023-12-06 16:19:01 -05:00
Cory LaViska
4f8417806c backport 1764 2023-12-06 12:02:20 -05:00
Cory LaViska
65cb3175af update soooo many icons 2023-12-05 17:37:06 -05:00
Cory LaViska
06135e686b fic code bg color 2023-12-05 13:55:31 -05:00
lindsaym-fa
63cf09f7b6 start progress on product list pattern 2023-12-01 17:53:01 -05:00
lindsaym-fa
10912be451 Merge branch 'next' into patterns-exploration 2023-12-01 12:14:45 -05:00
lindsaym-fa
340351ca4b improve variance between depth levels 2023-12-01 12:12:49 -05:00
Cory LaViska
5701bef6e9 backport 1749 2023-12-01 10:29:37 -05:00
Cory LaViska
62417ed1d1 backport PR 1752 2023-12-01 10:15:20 -05:00
Cory LaViska
545162eaae data-web-awesome instead of data-webawesome 2023-11-28 14:19:08 -05:00
lindsaym-fa
3e07b6da12 progress on product overview pattern 2023-11-22 22:51:57 -05:00
lindsaym-fa
77a8c418ea add Font Awesome theme 2023-11-22 14:55:37 -05:00
lindsaym-fa
641e92a340 improve shadow calculations 2023-11-22 14:35:17 -05:00
lindsaym-fa
3f8535e7b8 remove border color change for alerts 2023-11-22 14:33:41 -05:00
konnorrogers
81a66df7e4 add exportConditions for tests 2023-11-21 11:07:46 -05:00
Lindsay M
ae2480dfe2 Theme revisions (#12)
* remove square, stretch, and squish spacing tokens

* remove units from base tokens

* rename corner tokens with t-shirt size scale

* rename 'font-size' tokens to 'size'

* rename 'neutral' primitives to 'base'

* remove black and white tokens

* improve 'form-controls' tokens

* reintroduce granular focus ring tokens

* fix themer styles

* tweak shadow styles

* improve naming and scope of foundational colors

* overhaul color naming and add new themes

* more classic sl component styles

* make 'chic' theme dark by default

* adjust table row colors

* remove deprecated properties from 'classic' theme

* remove mistakenly committed stylesheets

* revert adjustment to space properties

* delete web-types.json

* revert "rename 'font-size' tokens to 'size'"
2023-11-15 11:43:40 -05:00
Cory LaViska
c95b0b6c66 backport PR 1722 2023-11-14 13:15:57 -05:00
Konnor Rogers
dee01269ad Konnorrogers/backport 1711 and 1714 (#11)
* backport #1711 & #1714

* remove custom-elements.mjs

* prettier
2023-11-14 12:22:18 -05:00
Cory LaViska
e11eb363aa Merge branch 'next' of https://github.com/shoelace-style/webawesome into next 2023-11-13 15:57:49 -05:00
Cory LaViska
0d33cabec4 add back two-way binding info 2023-11-13 15:57:47 -05:00
Konnor Rogers
b5d9b49b27 backport #1707 & #1708 (#10)
* backport #1707 & #1708

* prettier

* fix prettier log level

* fix test

* backport #1707 & #1708
2023-11-08 15:20:06 -05:00
Lindsay M
1b654c7c85 Support theme customizations for depth and borders
* Move custom properties related to shadows and borders to separate stylesheets
* Change base values and themer calculations related to shadows and borders to be unitless
* Add low-level custom properties for alert, button, card, input, select, switch, and textarea
* Add generic guidance for authoring custom properties to the Contributing docs
2023-11-03 13:46:00 -04:00
Cory LaViska
4e53ce870d backport PR 1702 2023-11-03 10:27:03 -04:00
Cory LaViska
932e2e7566 update jet brains plugin and stop writing to package.json 2023-11-02 08:53:17 -04:00
Konnor Rogers
e76a1dc1f6 fix no translation error (#8)
* fix no translation error

* prettier
2023-11-01 16:49:24 -04:00
Cory LaViska
38302a7c28 fix bad port 2023-10-25 13:38:21 -04:00
Cory LaViska
71e5b10f3b backport PR 1684 2023-10-25 13:07:59 -04:00
Cory LaViska
3eda5510c3 fix tests 2023-10-23 12:33:14 -04:00
Cory LaViska
32494e783c backport PR 1605 2023-10-23 12:03:18 -04:00
Cory LaViska
cdf38fe147 remove ts-check 2023-10-23 11:35:32 -04:00
Cory LaViska
302c174055 backport PR 1671 2023-10-23 10:48:37 -04:00
Cory LaViska
fb044aae89 backport PR 1670 2023-10-23 10:19:34 -04:00
Cory LaViska
bf299d8234 backport PR 1670 2023-10-20 09:04:15 -04:00
Cory LaViska
30a3164a96 backport PR 1663 2023-10-19 10:31:24 -04:00
Cory LaViska
2a22fb683c backport PR 1667 2023-10-19 09:43:32 -04:00
Cory LaViska
325ddafb13 backport docs fix 2023-10-19 09:41:39 -04:00
Cory LaViska
fcb2c7868c backport PR 1661 2023-10-18 13:44:20 -04:00
Cory LaViska
46b198866d backport PR 1656 2023-10-18 13:26:39 -04:00
Cory LaViska
9a4da9b763 backport PR 1655 2023-10-16 13:05:53 -04:00
Cory LaViska
7869144f5e backport changelog for 2.10.0 2023-10-16 13:05:37 -04:00
Cory LaViska
2d7d400040 backport PR 1614 2023-10-16 12:47:36 -04:00
Cory LaViska
6f5e5a2433 update default 2023-10-16 12:41:37 -04:00
Cory LaViska
e59a4659d8 fix import 2023-10-16 12:39:21 -04:00
Cory LaViska
2f9732fc3d use discussions for features 2023-10-16 11:37:17 -04:00
Cory LaViska
fdede79155 backport PR 1615 2023-10-13 13:53:41 -04:00
Cory LaViska
3277284473 backport PR 1608 2023-10-12 16:28:19 -04:00
Cory LaViska
b2b8d0d941 backport PR 1583 2023-10-12 15:52:31 -04:00
Cory LaViska
91bfd38a9a update deps to stay in sync with sl 2023-10-12 15:03:38 -04:00
Cory LaViska
f4971456d0 backport PR 1599 2023-10-12 12:18:08 -04:00
Cory LaViska
cc18a90a86 backport PR 1600 2023-10-12 12:11:20 -04:00
Cory LaViska
60b6803437 Merge branch 'themer' into next 2023-10-12 12:01:36 -04:00
Cory LaViska
2b57157502 backport PR 1604 2023-10-12 12:01:10 -04:00
Cory LaViska
967208d69b backport PR 1586 2023-10-02 09:06:58 -05:00
Cory LaViska
3bd13cd7cb Merge branch 'next' into themer 2023-09-29 11:32:24 -04:00
lindsaym-fa
ebe1904479 update and add themes 2023-09-28 22:47:25 -04:00
Cory LaViska
23356f6e39 adjust help text 2023-09-27 16:48:06 -04:00
Cory LaViska
4958ee41ae add favicon 2023-09-27 16:41:35 -04:00
Cory LaViska
9784faa32a remove tooltip for demo 2023-09-27 16:35:21 -04:00
Cory LaViska
a913c22200 cap border radius for checkboxes 2023-09-27 16:35:16 -04:00
Cory LaViska
95dce95183 fix copy button 2023-09-27 16:28:26 -04:00
Cory LaViska
53f9230354 update logo and add form control examples 2023-09-27 16:17:34 -04:00
Cory LaViska
946f08db4b update logo 2023-09-27 16:05:44 -04:00
Cory LaViska
4b0ee8907f more themes for the demo 2023-09-27 14:16:25 -04:00
Cory LaViska
62bb58dc09 backport localize fix 2023-09-27 13:10:21 -04:00
Cory LaViska
1d903fab38 ignore package.json 2023-09-27 13:09:57 -04:00
Cory LaViska
a458f2a6f0 add style guide to themer demo 2023-09-27 13:09:12 -04:00
Cory LaViska
f66e8cec69 remove shadow 2023-09-26 16:45:41 -04:00
Cory LaViska
9fd070639c more knobs 2023-09-26 16:37:56 -04:00
Cory LaViska
528748155a remove sidebar 2023-09-26 12:44:59 -04:00
Cory LaViska
474ffb98d6 retro changelog 2023-09-26 10:15:34 -04:00
Cory LaViska
cb2d5e4eb4 update to 2.9.0 changelog 2023-09-26 09:33:19 -04:00
Cory LaViska
3c51262a37 Merge branch 'next' into themer 2023-09-26 09:11:03 -04:00
Cory LaViska
7e4dba7af1 backport PR 1572 2023-09-26 09:10:53 -04:00
Cory LaViska
319705106b Merge branch 'next' into themer 2023-09-26 08:54:05 -04:00
Cory LaViska
2416f93a79 backport PR #1575 2023-09-26 08:53:55 -04:00
Cory LaViska
e398091a36 backport issue 1576 2023-09-25 09:09:53 -04:00
Cory LaViska
d836bcebbc fix words 2023-09-25 09:00:31 -04:00
Cory LaViska
d08f928818 early early early themer concept 2023-09-22 11:09:34 -04:00
Cory LaViska
c3e74ada39 sample page 2023-09-21 11:58:40 -04:00
Cory LaViska
a2e9a3de96 add form validation classes 2023-09-21 09:41:36 -04:00
Cory LaViska
b2a99c83e3 don't break 2023-09-20 14:48:17 -04:00
Cory LaViska
a4185bc926 fix focus-visible styles 2023-09-20 14:47:58 -04:00
Cory LaViska
8e09db9d40 Merge branch 'next' into applied-styles 2023-09-18 15:17:15 -04:00
Cory LaViska
07ca5a45ae initial 2023-09-18 15:16:08 -04:00
lindsaym-fa
88a8173178 add mellow theme 2023-09-14 15:51:16 -04:00
lindsaym-fa
5a8c6912dc fix switch focus 2023-09-14 12:36:44 -04:00
Cory LaViska
a7c786987d backport fix for 1548 2023-09-14 12:08:33 -04:00
Cory LaViska
1179e48955 sync 2023-09-14 11:48:06 -04:00
Cory LaViska
07f0884462 fix 2023-09-14 11:45:18 -04:00
Cory LaViska
ef3575358e temp dark mode toggle 2023-09-14 11:36:00 -04:00
Cory LaViska
5e2762cbc6 backport PR 1564 2023-09-14 11:19:10 -04:00
Cory LaViska
7e165fa8bd hold 2023-09-14 11:17:31 -04:00
Cory LaViska
33706e0f27 Merge branch 'next' of https://github.com/shoelace-style/webawesome into next 2023-09-14 11:15:52 -04:00
Cory LaViska
e262ed14b0 backport PR 1565 2023-09-14 11:15:17 -04:00
lindsaym-fa
545eb467fc add theme tokens, update usage, add dark mode 2023-09-13 17:51:21 -04:00
Cory LaViska
2848ab68ef backport PR 1563 2023-09-13 11:54:53 -04:00
Cory LaViska
fc1aa42c26 more style updates 2023-09-12 15:58:45 -04:00
Cory LaViska
8baa32d8c9 Merge branch 'next' of https://github.com/shoelace-style/webawesome into next 2023-09-12 15:06:47 -04:00
Cory LaViska
a519077112 inherit font sizes/line-heights 2023-09-12 15:05:53 -04:00
Konnor Rogers
5219188690 Reduce time it takes to replace strings (#6)
* reduce replacer time from 9 seconds to 3 seconds

* prettier

* prettier
2023-09-12 14:46:39 -04:00
lindsaym-fa
267b9eba20 correct shadow usage 2023-09-12 13:12:37 -04:00
lindsaym-fa
9c343ef3fd update color primitives and fix comments 2023-09-12 13:02:59 -04:00
Cory LaViska
e82b076981 fix tag height/spacing 2023-09-12 12:32:28 -04:00
Cory LaViska
97bd88f904 fix link buttons 2023-09-12 12:25:08 -04:00
Cory LaViska
21d8cdbb5c Merge branch 'next' of https://github.com/shoelace-style/webawesome into next 2023-09-12 12:09:12 -04:00
Cory LaViska
a5f8c51904 update bootstrap icons 2023-09-12 12:09:10 -04:00
lindsaym-fa
94ad43e130 improved color mixing for hover and active states 2023-09-11 16:54:20 -04:00
Cory LaViska
1f04cd2a50 prettier 2023-09-11 13:53:21 -04:00
Cory LaViska
5a55c240ee Merge pull request #4 from shoelace-style/theming
Theming API + SL => WA
2023-09-11 13:50:28 -04:00
Lindsay M
e02b36873e Merge pull request #5 from shoelace-style/lindsaym/theming-tune-up
Theming tune up
2023-09-11 13:31:41 -04:00
lindsaym-fa
f89ef95d65 updated global properties and improved usage 2023-09-11 13:21:35 -04:00
Lindsay M
a65db66005 improved naming and usage of --wa-form-controls-* properties 2023-09-08 17:00:09 -04:00
Lindsay M
a6e19d0710 renamed CSS properties for semantic color variants 2023-09-08 16:23:48 -04:00
Cory LaViska
df02aeef89 remove sponsor links 2023-09-08 14:43:15 -04:00
Cory LaViska
2d03f60c70 lint 2023-09-08 14:35:29 -04:00
Cory LaViska
e45b44ad03 stop making shoes 2023-09-08 14:32:23 -04:00
Cory LaViska
015429e05d sl => wa 2023-09-08 13:45:49 -04:00
Cory LaViska
5628381449 backport PR 1558 2023-09-08 08:33:27 -04:00
Cory LaViska
0bf3cf2535 remove webtypes 2023-09-08 08:33:04 -04:00
Cory LaViska
d4aa9ff99e backport PR 1557 2023-09-08 08:31:26 -04:00
Cory LaViska
0229c315bb remaining components 2023-09-07 12:54:44 -04:00
Cory LaViska
67d4458e69 more stylez 2023-09-06 16:13:49 -04:00
Cory LaViska
67bfbed308 input, textarea, and more button styles 2023-09-06 12:32:57 -04:00
Cory LaViska
2c053b6fd3 more components 2023-09-05 16:39:38 -04:00
Cory LaViska
6156e38a34 dialog, drawer, details, alert, divider 2023-09-05 15:16:24 -04:00
Cory LaViska
631df0293c copy button 2023-09-05 14:53:49 -04:00
Cory LaViska
b86a6a54ab carousel 2023-09-05 14:53:45 -04:00
Cory LaViska
201b32f3fb alerts 2023-09-05 14:45:33 -04:00
Cory LaViska
ebed8daee6 buttons, primary, and more 2023-09-05 12:01:19 -04:00
Cory LaViska
55be0a557f more retheming 2023-08-31 16:50:31 -04:00
Cory LaViska
b4c45b480b update docs and theme tokens to use wa 2023-08-31 12:06:32 -04:00
Cory LaViska
8b9df9871a resolve instead of reject 2023-08-30 15:12:13 -04:00
Cory LaViska
af7682aaca update setting 2023-08-30 11:35:19 -04:00
Konnor Rogers
883cb161ec show errors in dev server (#1547)
* show errors in dev server

* fix build

* prettier
2023-08-30 09:42:34 -04:00
Cory LaViska
a2fbe121c3 update ctrl/tinycolor; fixes #1542 (#1545) 2023-08-28 09:39:16 -04:00
Cory LaViska
ab770c566e fix spacing; #1540 (#1544) 2023-08-28 09:27:57 -04:00
Konnor Rogers
1867603225 log stderr in builds (#1543) 2023-08-25 16:20:19 -04:00
Cory LaViska
cf195da424 fix stuck search 2023-08-25 09:35:05 -04:00
Cory LaViska
0cb6aa5d12 reformat by CEM plugin 2023-08-23 15:36:19 -04:00
Cory LaViska
7e4d4c3c98 2.8.0 2023-08-23 12:55:35 -04:00
Cory LaViska
b5ef3191b7 update version 2023-08-23 12:53:47 -04:00
Konnor Rogers
f30481e229 remove unused code path (#1539) 2023-08-23 12:52:42 -04:00
Konnor Rogers
ae010c333b fix: check <slot> elements for assignedElements to allow wrapping focus-trapped elements (#1537)
* fix: internal logic for tabbable checks slotted elements

* prettier

* add better note for generators

* prettier

* fix tests

* prettier

* prettier

* fix tabbable test for safari

* prettier

* Update src/internal/tabbable.ts

Co-authored-by: Cory LaViska <cory@abeautifulsite.net>

* Update src/internal/modal.ts

Co-authored-by: Cory LaViska <cory@abeautifulsite.net>

* Update src/internal/tabbable.ts

Co-authored-by: Cory LaViska <cory@abeautifulsite.net>

---------

Co-authored-by: Cory LaViska <cory@abeautifulsite.net>
2023-08-23 11:43:48 -04:00
Konnor Rogers
43d1f9ee7a fix: use verbatimModuleSyntax and isolatedModules (#1534)
* feat: use verbatimModuleSyntax and isolatedModules

* prettier

* remove newline

* prettier
2023-08-23 10:34:40 -04:00
Cory LaViska
ec17e8736d fix component links; closes #1538 2023-08-23 09:46:23 -04:00
Cory LaViska
44b27e791e fix plop template 2023-08-23 09:29:24 -04:00
Cory LaViska
02385027db fix copy button focus 2023-08-22 17:10:01 -04:00
Cory LaViska
b311072d9b use <sl-copy-button> (#1535) 2023-08-22 17:01:00 -04:00
Cory LaViska
87ac077b0a fix empty attributes in properties table (#1536) 2023-08-22 16:59:08 -04:00
Konnor Rogers
87837df35c remove extra react component wrapper, upgrade to v2 of @lit-labs/react (#1531)
* remove extra react wrapper, upgrade to v2 of @lit-labs/react, call define in module.

* add changelog entry

* prettier
2023-08-22 11:26:54 -04:00
Konnor Rogers
5d72bbd162 remove baseUrl from tsconfig for better dev experience (#1530) 2023-08-22 10:32:15 -04:00
Cory LaViska
a4fc1c5b44 Submenus (#1527)
* [RFC] Proof-of-concept commit for submenu support

This is a Request For Comments to seek directional guidance towards
implementing the submenu slot of menu-item.

Includes:
- SubmenuController to manage event listeners on menu-item.
- Example usage in menu-item documentation.
- Trivial tests to check rendering.

Outstanding questions include:
- Accessibility concerns. E.g. where to handle 'ArrowRight',
  'ArrowLeft'?
- Should selection of menu-item denoting submenu be possible or
  customizable?
- How to parameterize contained popup?
- Implementation concerns:
  - Use of ref / id
  - delegation of some rendering to the controller
  - What to test

Related to [#620](https://github.com/shoelace-style/shoelace/issues/620).

* Update submenu-controller.ts

Removed extraneous `console.log()`.

* PoC working of ArrowRight to focus on submenu.

* Revert "PoC working of ArrowRight to focus on submenu."

(Didn't mean to publish this.)

This reverts commit be04e9a221.

* [WIP] Submenu WIP continues.

- Submenus now close on change-of-focus, not a timeout.
- Keyboard navigation support added.
- Skidding fix for better alignment.
- Submenu documentation moved to Menu page.
- Tests for accessibility, right and left arrow keys.

* Cleanup: Removed dead code and dead code comments.

* style: Eslint warnings and errors fixed. npm run verify now passes.

* fix: 2 changes to menu / submenu on-click behavior:

1. Close submenu on click explicitly, so this occurs even if the menu is
   not inside of an sl-dropdown.

2. In menu, ignore clicks that do not explicitly target a menu-item.
   Clicks that were on (e.g. a menu-border) were emitting select events.

* fix: Prevent menu's extraneous Enter / space key propagation.

Menu's handleKeyDown calls item.click (to emit the selection).
Propagating the keyboard event on Enter / space would the cause re-entry
into a submenu, so prevent the needless propagation.

* Submenu tweaks ...

- 100 ms delay when opening submenus on mouseover
- Shadows added
- Distance added to popup to have submenus overlap menu slightly.

* polish up submenu stuff

* stay highlighted when submenu is open

* update changelog

* resolve feedback

---------

Co-authored-by: Bryce Moore <bryce.moore@gmail.com>
2023-08-21 17:26:41 -04:00
Konnor Rogers
539eaded73 Update React Wrappers with Refs that work (#1526)
* fix react types for refs

* fix displayName

* fix displayName]

* attempt to fix typings for React refs

* fix bad type

* prettier

* add changelog entry

* prettier
2023-08-18 13:31:50 -04:00
Cory LaViska
93b2e78092 Merge branch 'nathangray-next' into next 2023-08-18 12:05:47 -04:00
Cory LaViska
402a00dcd3 update docs 2023-08-18 12:05:22 -04:00
Cory LaViska
b63368d5f6 Merge branch 'next' of github.com:nathangray/shoelace into nathangray-next 2023-08-18 11:23:56 -04:00
Cory LaViska
74c6d3ee36 fix tree tests; #1521 2023-08-18 11:20:14 -04:00
nathan
621aa4362b Add HTMLElement to the getTag() return type 2023-08-18 09:17:02 -06:00
Cory LaViska
c8919ad11f prettier 2023-08-18 09:55:57 -04:00
Stephen Sugden
fad76dd1a2 SlTree: separate expand/collapse and selection behaviour in 'single' mode (#1521)
* Never select tree items when clicking the chevron

This changes the behaviour of sl-tree so that clicking on the expand/collapse icon will not select/deselect the item, only toggle it's expanded state.

* Refactor: inline SlTree.syncTreeItems

This was only called from 2 places, and they each had different
behaviour anyways.

* SlTree: separate expand/collapse from selection

This makes 'multi' and 'single' mode consistent with each other, and
with native file managers.
2023-08-18 09:55:29 -04:00
nathan
b2f6499b87 Fix lint warnings 2023-08-17 13:18:51 -06:00
nathan
9520e850dd Update for path changes
see 3a61d20d93
2023-08-17 11:34:25 -06:00
Cory LaViska
4ee5271a83 Merge branch 'next' of https://github.com/shoelace-style/shoelace into next 2023-08-16 15:01:46 -04:00
Thomas Allmer
d8de7bcc51 fix(docs): Inline Form Validation Docs throw error on top level await (#1522) 2023-08-16 14:59:21 -04:00
Cory LaViska
7ee31be6d6 ignore package.json 2023-08-16 14:57:03 -04:00
Cory LaViska
9cb5ba7ac1 Radio button fix (#1524)
* fix formatting

* fix radio button spacing; fixes #1523
2023-08-16 14:51:46 -04:00
Peter Siska
c380368b61 Fix NPMDIR config (#1518)
* Fix NPMDIR config

* Add missing semi
2023-08-15 10:46:51 -04:00
Konnor Rogers
e298f7e5f4 fix broken tests for shoelace-element (#1516)
* add stub code prior to test

* fix broken test

* prettier

* prettier

* prettier
2023-08-14 11:23:00 -04:00
Cory LaViska
c743561c25 update docs 2023-08-14 10:23:59 -04:00
Alexander Krolick
e73e32fb71 Add docs on setting multiple values in select (#1508) 2023-08-14 10:21:52 -04:00
Cory LaViska
b09a48bec4 fix arg name 2023-08-14 10:02:23 -04:00
Burton Smith
aeef986cf5 JetBrains IDE Integration (#1512)
* upgrade vs code integration package

* add references

* add web-types plugin

* update reference

* run prettier

* update documentation

* run prettier

* remove test script
2023-08-14 09:34:34 -04:00
Cory LaViska
6f08f50639 2.7.0 2023-08-11 13:16:46 -04:00
Cory LaViska
8fc5f598d0 update changelog 2023-08-11 13:13:00 -04:00
Cory LaViska
1383ea3fe8 React import paths (#1507)
* fix react imports in examples

* move types to definition files

* update changelog

* update changelog
2023-08-11 13:09:44 -04:00
king8fisher
f8c37e0d14 Fix missing comma in linear-gradient (#1506) 2023-08-11 13:06:10 -04:00
Cory LaViska
cf543ef335 don't hijack key presses in text fields; fixes #1492 (#1504) 2023-08-11 11:25:46 -04:00
Cory LaViska
a3450a7d83 move emphasis 2023-08-11 11:01:37 -04:00
Cory LaViska
e80b2c9fb9 prettier 2023-08-11 11:01:00 -04:00
Alexander Krolick
8d617fb98c Expand on comment about space-separated value for sl-select (#1502) 2023-08-11 10:58:14 -04:00
Burton Smith
a6e225e47c upgrade vs code integration package (#1500)
* upgrade vs code integration package

* add references
2023-08-11 10:51:33 -04:00
Cory LaViska
e21943f4fb fix typos/whitespace 2023-08-11 10:30:40 -04:00
Cory LaViska
c36df5ecc1 <sl-copy> (#1483)
* copy updates

* Update docs/pages/components/copy.md

Co-authored-by: Thomas Allmer <d4kmor@gmail.com>

* unwrap and fix case

* copy button updates

* use bs icon

* add parts, hoist, and improve parsing a bit

* update docs

* remove comment

---------

Co-authored-by: Thomas Allmer <d4kmor@gmail.com>
2023-08-11 10:27:34 -04:00
Cory LaViska
458def7830 update bootstrap icons and fix license 2023-08-10 12:59:44 -04:00
Cory LaViska
b5d800f07a don't wrap code tags in tables 2023-08-10 11:29:25 -04:00
Cory LaViska
6551a6330b remove default assignee 2023-08-09 16:13:52 -04:00
Cory LaViska
cb5f670909 update changelog 2023-08-09 15:40:36 -04:00
Cory LaViska
5b6c1632bd update var names and use stylesheet; #1496 2023-08-09 15:38:24 -04:00
Tomas Drencak
bf15f2fb8a Toggle visibility of the clear button (#1496) 2023-08-09 15:28:30 -04:00
Konnor Rogers
31ef2f7929 remove side-effects key, update React docs for cherry-picking (#1485)
* remove side-effects, update React docs for cherry-picking

* prettier

* add PR #

* prettier

* fix react import paths

* Update docs/pages/frameworks/react.md

Co-authored-by: Cory LaViska <cory@abeautifulsite.net>

* add colons to imports

---------

Co-authored-by: Cory LaViska <cory@abeautifulsite.net>
2023-08-07 13:20:34 -04:00
Cory LaViska
8aab94f184 switch skypack to esm.sh to fix react examples 2023-08-03 15:27:10 -04:00
Cory LaViska
b7acb27c98 Revert "feat(clipboard): add new component sl-clipboard (#1473)"
This reverts commit 16f3e256b0.
2023-08-02 15:35:11 -04:00
Cory LaViska
dcbbc55f28 fix up/down focus in dropdown; closes #1472 (#1481) 2023-08-01 14:05:11 -04:00
Konnor Rogers
81dfcc2eae fix treeshaking array (#1480)
* fix treeshaking array

* fix treeshaking array

* imports to not use .component
2023-08-01 14:04:36 -04:00
Thomas Allmer
16f3e256b0 feat(clipboard): add new component sl-clipboard (#1473)
* feat(clipboard): add new component sl-clipboard

* using slots

* using a single copyStatus

* feat(clipboard): support inputs/textarea/links and shadow dom

* fix(clipboard): add area-live to announce copied

* feat(clipboard): support any component with a value property
2023-08-01 13:53:11 -04:00
Cory LaViska
75b2da9eab 2.6.0 2023-07-31 15:17:43 -04:00
Cory LaViska
9736f053d9 update version 2023-07-31 15:15:54 -04:00
Cory LaViska
d0b710c26d clear search index and other cache with cmd+shift+r 2023-07-31 15:14:25 -04:00
Cory LaViska
5b83d4d1b0 update changelog 2023-07-31 14:00:57 -04:00
Thomas Allmer
89f0f4a02c feat(details): use details and summary html tag to enable in browser searching (#1470) 2023-07-31 13:58:42 -04:00
Cory LaViska
a067ccb9e0 fix docs 2023-07-27 12:39:44 -04:00
Cory LaViska
1ccea42cca fix card borders 2023-07-26 15:20:51 -04:00
Cory LaViska
0f90dd0f54 update changelog 2023-07-25 22:20:13 -04:00
Ben Anderson
262cbc9a22 Add entry to changelog for types for react-wrapped elements (#1464) 2023-07-25 22:18:54 -04:00
Konnor Rogers
3a61d20d93 Create non-auto-registering routes (#1450)
* initial attempt at not auto defining

* add files with -

* continued work on removing auto-define

* fix component definitions

* update with new tag stuff

* fix lots of things

* fix improper scoped elements

* working through side effects

* continued react wrapper work

* update changelog

* formatting

* fixes

* update changelog

* lint / formatting

* fix version injection

* fix version injection, work on test

* fix version injection, work on test

* fix merge conflicts

* fix jsdoc null issue

* fix templates

* use exports

* working on tests

* working on registration mocking

* fix customElements test

* linting

* fix some test stuff

* clean up test

* clean up comment

* rename scopedElements to dependencies

* linting / formatting

* linting / formatting

* mark all packages external and still bundle

* set bundle false

* set bundle true

* dont minify

* fix merge conflicts

* use built shoelace-element

* fix lint errors

* prettier

* appease eslint

* appease eslint gods

* appease eslint gods

* appease eslint gods

* appease eslint gods

* add shoelace-autoloader

* move it all into 1 function

* add exportmaps note

* prettier

* add jsdelivr entrypoint

* read as utf8

* update docs with .component.js importS

* prettier
2023-07-24 13:00:07 -04:00
Cory LaViska
95f4f87eb8 update changelog 2023-07-19 15:06:25 -04:00
Cory LaViska
5b3cc0d492 add part to docs; #1460 2023-07-19 15:05:52 -04:00
Yehuda Ringler
0de39a8163 Add part to button spinner (#1460) 2023-07-19 15:04:49 -04:00
Cory LaViska
879fd7a224 wait for registration before attaching form handlers; closes #1452 2023-07-18 13:38:20 -04:00
Cory LaViska
50af138424 fix typos 2023-07-18 13:15:21 -04:00
Cory LaViska
9d592f4e08 wait longer to prevent flakiness 2023-07-18 13:13:59 -04:00
Cory LaViska
5016d27af7 remove test because we can't reliably suppress retargeted clicks 2023-07-18 13:11:08 -04:00
Chellappan
7218a19357 Replace .bind() with arrow functions in form controller,modal and slot controller (#1453) 2023-07-18 13:05:00 -04:00
Cory LaViska
33d2d4368f fix logic 2023-07-18 13:03:34 -04:00
Cory LaViska
cca40ca710 remove test because we can't reliably prevent retargeted click handlers 2023-07-18 12:58:22 -04:00
Cory LaViska
c6281859fd remove dead logic 2023-07-18 12:49:22 -04:00
Cory LaViska
956271880d fix for contained 2023-07-18 12:39:44 -04:00
Cory LaViska
201ff4efc5 fix escape key in dialog/drawer; closes #1457 2023-07-18 12:37:52 -04:00
Cory LaViska
f954233bda Revert "Move keydown handler for sl-drawer back to base div (#1459)"
This reverts commit 1e243e4257.
2023-07-18 12:12:43 -04:00
Cory LaViska
8267968b76 update output 2023-07-18 12:08:50 -04:00
Stephen Sugden
1e243e4257 Move keydown handler for sl-drawer back to base div (#1459)
* Move keydown handler for sl-drawer back to base div

This restores the stacking behaviour of drawers

See: #1457

* Autofocus panel of sl-drawer when it is open on firstUpdate
2023-07-18 11:57:16 -04:00
Cory LaViska
0b6c3a46cf Quick fixes (#1458)
* update base path docs

* fix examples

* fix broken CEM data in <sl-popup>

* Update docs/pages/getting-started/installation.md

Co-authored-by: Lindsay M <126139086+lindsaym-fa@users.noreply.github.com>

---------

Co-authored-by: Lindsay M <126139086+lindsaym-fa@users.noreply.github.com>
2023-07-17 14:05:17 -04:00
Cory LaViska
a2e58b7696 fix link 2023-07-17 10:05:00 -04:00
Cory LaViska
119d299657 remove old SPA settings 2023-07-13 17:00:23 -04:00
Cory LaViska
e8634e4178 Popup virtual elements (#1449)
* 1433: POC for comments (+ fix build.watch())

* 1433: consolidate virtualAnchor into anchor

* add virtual element examples

* update changelog

---------

Co-authored-by: Marko <marko@modelcitizen.com>
2023-07-13 16:49:57 -04:00
Cory LaViska
2e2a683d11 cleanup /index.html from search results (#1454) 2023-07-13 16:20:26 -04:00
Cory LaViska
414197acc9 unset last focused item; #1436 (#1446) 2023-07-12 14:52:13 -04:00
Ben Anderson
8fd01e1eda Add event types to react wrapper components (#1419)
* Rename SlSlideChange for consistency with other events

* Setup React event types for events used by Shoelace components

Means that consumers of Shoelace via the React wrapper will be able to
use callback methods with the correct event type, instead of having to
rely on casting and friends when using Typescript.

* Add docs demonstrating importing event types for React callbacks
2023-07-12 11:31:27 -04:00
Cory LaViska
e1ca7d1f59 Lit a11y update (#1444)
* update eslint-plugin-lit-a11y to latest

* update eslint deps

* remove aria- and role attribs from slots; closes #1422
2023-07-12 11:12:15 -04:00
Cory LaViska
f84d6939bd Doc updates (#1445)
* rename to CSS parts

* fix double dashes from merging
2023-07-11 15:23:51 -04:00
Konnor Rogers
82446e2114 Add modal tab tracking (#1403)
* add modal tab tracking

* prettier

* sort by tabindex

* sort by tabindex

* add a dialog test case for shadow roots

* add a changelog note

* add a changelog note

* prettier + test fixes

* prettier + test fixes
2023-07-07 15:32:23 -04:00
Konnor Rogers
a4f0ae9088 fix: valueAsDate now falls back to native implementation (#1399)
* fix: valueAsDate now falls back to native implementation

* changelog

* prettier

* prettier
2023-07-07 13:51:22 -04:00
Cory LaViska
fe3906f766 Don't steal focus when removing focused tree items (#1430)
* don't steal focus when removing focused tree items; #1428

* update PR link
2023-07-06 10:36:41 -04:00
Cory LaViska
c9e644f3fc Allow selecting menu items with space (#1429)
* allow selecting menu items with space; #1423

* update PR
2023-07-06 10:36:29 -04:00
Cory LaViska
8ffbd02db7 update changelog 2023-07-05 16:32:59 -04:00
Evan Harrison
e88d57d17d change .floor to .ceil in getCurrentPage; modify prev function to return to closest previous snappable index (#1420) 2023-07-05 16:26:00 -04:00
Cory LaViska
5f4de6d9f5 skip flaky tests 2023-07-03 15:59:24 -04:00
Cory LaViska
2cce87deeb add links 2023-07-03 15:50:58 -04:00
Cory LaViska
630b5b19a0 fix regression; #1417 2023-07-03 15:49:25 -04:00
Cory LaViska
2ce1451a9f fix typo 2023-07-03 15:17:43 -04:00
Cory LaViska
2d1badba96 this is why we can't have nice things 2023-07-03 13:31:28 -04:00
Cory LaViska
1b5db078a7 move aria attribs off <slot>; fixes #1417 2023-07-03 12:39:42 -04:00
Cory LaViska
91095bd63a better description for lighthouse 2023-07-03 12:38:09 -04:00
Cory LaViska
d9703a64fd restore concurrency 2023-07-03 11:25:43 -04:00
Cory LaViska
4c22e72390 update changelog 2023-07-03 11:21:39 -04:00
dhellgartner
d05b8fca20 Qr code tests (#1416)
* Add tests for qr-code

* Fix a small bug in qr-code

The background color was not passed to the
qr code

---------

Co-authored-by: Dominikus Hellgartner <dominikus.hellgartner@gmail.com>
2023-07-03 11:19:50 -04:00
Evan Harrison
afca2ad2e0 change carousel docs to use correct attr name, slides-per-page (#1415) 2023-07-03 11:14:15 -04:00
Cory LaViska
b2aa854d98 update docs 2023-06-28 15:27:21 -04:00
Cory LaViska
287fff7cf1 Merge branch 'next' of https://github.com/shoelace-style/shoelace into next 2023-06-26 12:25:30 -04:00
Cory LaViska
136ecae4a6 2.5.2 2023-06-26 12:21:04 -04:00
Cory LaViska
cac772d5e6 update version 2023-06-26 12:20:55 -04:00
Cory LaViska
e1dedcb1b5 Fix broken links (#1407)
* add spacing

* update old links
2023-06-26 12:20:13 -04:00
Cory LaViska
c4901eca68 update old links 2023-06-26 12:17:48 -04:00
Cory LaViska
a001c2d12b add spacing 2023-06-26 12:11:15 -04:00
Eddie Cheng R4
c4c622eabd redirect the link to the right page (#1404) 2023-06-26 12:08:54 -04:00
Cory LaViska
1ae018bedd fix broken source buttons in docs (#1401) 2023-06-23 12:03:51 -04:00
Cory LaViska
24929e27c1 skip 2023-06-22 11:23:45 -04:00
Cory LaViska
33a8d92aec update version 2023-06-22 11:11:11 -04:00
Cory LaViska
32d21fa560 2.5.1 2023-06-22 11:10:15 -04:00
Cory LaViska
347d8b7f79 Merge branch 'next' of https://github.com/shoelace-style/shoelace into next 2023-06-22 11:04:34 -04:00
Cory LaViska
8f9c15913b update changelog 2023-06-22 11:04:33 -04:00
Konnor Rogers
60d7f688eb fix extensionless imports (#1394) 2023-06-22 10:56:24 -04:00
Cory LaViska
15f914914c simplify theme toggle 2023-06-22 10:47:41 -04:00
Alan Chambers
2914475821 docs changed theme toggle to theme selector (#1395) 2023-06-22 10:44:08 -04:00
Konnor Rogers
8e831aa3e7 fix source flavors (#1388)
* fix load flavor

* Update docs/assets/scripts/code-previews.js

* fix previews

---------

Co-authored-by: Cory LaViska <cory@abeautifulsite.net>
2023-06-21 11:12:09 -04:00
Cory LaViska
985d4585c4 fixes #1387 (#1392) 2023-06-21 11:07:02 -04:00
Cory LaViska
854db13bd7 2.5.0 2023-06-20 15:26:55 -04:00
Cory LaViska
4ddf80459a ignore 2023-06-20 15:25:04 -04:00
Cory LaViska
89fc2ff643 update version 2023-06-20 15:24:21 -04:00
Konnor Rogers
d7145f1f84 Konnorrogers/fix value as number 2 (#1385)
* fix: garbage collected valueAs*

* weird....

* prettier and tests
2023-06-20 15:22:13 -04:00
Konnor Rogers
441a957432 fix: <sl-carousel> has the wrong import for LocalizeController (#1384)
* fix autoloading translations

* add changelog entry

* prettier

* prettier
2023-06-20 14:02:07 -04:00
Konnor Rogers
67cbb85682 Add support for svg sprites in <sl-icon> (#1374)
* wip: initial implementation for review

* icon testing

* feat: add the ability to use SVG sprite sheets

* finish up spritesheets

* add icon notes

* update plopfile, add changelog entry

* prettier

* linting

* linting

* fix icon test

* eslint fixes?

* prettier

* disable eslint -.-

* linting loop!

* linting loop!

* prettier

* prettier

---------

Co-authored-by: Diego <diego@trebellar.com>
2023-06-20 14:01:58 -04:00
Cory LaViska
0005d16a06 fixes #1380 2023-06-19 15:13:48 -04:00
Cory LaViska
ca5ab03cd4 update docs 2023-06-19 10:12:01 -04:00
Konnor Rogers
c9e30022df overeager %CDNDIR% in sandbox previews. (#1377)
* overeager with sandboxes

* prettier
2023-06-15 13:25:12 -04:00
Konnor Rogers
c167bdd80f Merge pull request #1372 from justinfagnani/no-bind
Code size optimizations: Replace .bind() with arrow functions, add listeners in constructors.
2023-06-15 11:58:08 -04:00
Justin Fagnani
b9f62bb1bc Migrate SlCarousel.handleSlotChange 2023-06-14 15:16:26 +09:00
Justin Fagnani
a01b2cf8a2 Replace .bind() with arrow functions, add listeners in constructors. 2023-06-14 08:52:12 +09:00
Konnor Rogers
f4b2623c8f Merge pull request #1371 from shoelace-style/konnorrogers/fix-the-tests
fix the tests
2023-06-13 16:11:54 -04:00
konnorrogers
af8426579e prettier 2023-06-13 15:59:16 -04:00
konnorrogers
6b9ba9becf eslint 2023-06-13 15:54:09 -04:00
konnorrogers
c6cc7b6983 prettier 2023-06-13 15:43:21 -04:00
konnorrogers
0e869ec18d fix the tests 2023-06-13 15:40:04 -04:00
Cory LaViska
1b347874ef fix tests 2023-06-13 14:22:56 -04:00
Cory LaViska
ff5b1e8573 fix imports 2023-06-13 14:06:37 -04:00
Cory LaViska
73ad76a2fa fix serve 2023-06-13 13:48:50 -04:00
Konnor Rogers
aadcb486a9 fix broken build (#1370)
* fix broken build

* prettier
2023-06-13 12:30:32 -04:00
Cory LaViska
4c854d64a7 upgrade lit 2023-06-13 12:19:39 -04:00
Cory LaViska
c2e02d34ad remove log 2023-06-13 12:19:34 -04:00
Cory LaViska
8c8977549c fix dispose 2023-06-13 12:19:25 -04:00
Cory LaViska
24ef154d42 update esbuild 2023-06-13 11:48:17 -04:00
Cory LaViska
b5a3045bae update typescript 2023-06-13 11:37:33 -04:00
Cory LaViska
7404e496cb Merge branch 'konnorrogers/modify-build-script-for-npm-2' into next 2023-06-13 10:05:00 -04:00
konnorrogers
5ba2c7eeec watch cdn, not dist 2023-06-13 09:31:02 -04:00
Cory LaViska
514a7f3d51 Merge branch 'konnorrogers/modify-build-script-for-npm-2' of https://github.com/shoelace-style/shoelace into konnorrogers/modify-build-script-for-npm-2 2023-06-12 16:24:24 -04:00
Cory LaViska
15474b83b1 update 2023-06-12 16:24:21 -04:00
konnorrogers
a5f1bc6c82 fix circular dependency 2023-06-12 16:23:47 -04:00
Cory LaViska
834d44e0e4 npm 2023-06-12 16:22:20 -04:00
Cory LaViska
c070149ae6 update + formatting 2023-06-12 16:22:08 -04:00
Cory LaViska
b0b6ea943e use cdn bundle for docs 2023-06-12 16:15:52 -04:00
Cory LaViska
65b72217ea remove copydir and fix virtual path for serve 2023-06-12 16:15:29 -04:00
Cory LaViska
c4c2e8e3a9 make esbuild happy again 2023-06-12 15:36:35 -04:00
Cory LaViska
47018d61cd don't bundle anything for npm 2023-06-12 15:32:45 -04:00
konnorrogers
d18db9adfa prettier 2023-06-12 14:20:11 -04:00
konnorrogers
41913c8c58 update docs with cdn / npm paths 2023-06-12 13:45:27 -04:00
konnorrogers
68b982a744 update docs 2023-06-12 12:48:15 -04:00
Cory LaViska
a582302a79 update changelog 2023-06-12 12:13:18 -04:00
Brendon Muir
bd3b2c93ee Fix sl-input[type="date|time"] placeholder on macOS Safari (#1341)
Allowing the background to inherit rather than removing it allows the weird date and time placeholder text opacity to work on macOS Safari.
2023-06-12 12:09:20 -04:00
konnorrogers
4704d63791 Merge branch 'konnorrogers/modify-build-script-for-npm-2' of https://github.com/shoelace-style/shoelace into konnorrogers/modify-build-script-for-npm-2 2023-06-12 11:40:01 -04:00
konnorrogers
415a1477bb changelog, prettier 2023-06-12 11:39:56 -04:00
Cory LaViska
f363d5e187 Merge branch 'next' into konnorrogers/modify-build-script-for-npm-2 2023-06-12 11:36:23 -04:00
Cory LaViska
efb0ee9c48 fix spelling 2023-06-12 11:36:08 -04:00
konnorrogers
96daee5e1a use cdn dir for testing 2023-06-12 11:18:24 -04:00
konnorrogers
d236206cce remove unneeded CLI args 2023-06-12 10:54:33 -04:00
Konnor Rogers
1ef8e1cf73 fix: radio group race condition (#1364)
* fix: radio group race condition

* update changelog

* prettier

* fix changelog
2023-06-08 15:45:34 -04:00
Cory LaViska
dc63f858b0 fix typo 2023-06-08 15:41:03 -04:00
Cory LaViska
b8a3952153 show next/dev versiosn 2023-06-08 15:33:36 -04:00
Cory LaViska
4b2a62f660 prettier 2023-06-08 15:27:32 -04:00
Cory LaViska
08c074e44b prettier 2023-06-08 15:24:56 -04:00
Cory LaViska
d1953b0215 Merge branch 'new-docs' into next 2023-06-08 15:22:02 -04:00
Scott Martin
7cbb26cbdb Correct import statement for all React components (#1363)
The current statement is incorrect and will result in
`Module not found: Package path ./dist/shoelace is not exported from package /your/path/to/node_modules/@shoelace-style/shoelace (see exports field in /your/path/to/node_modules/@shoelace-style/shoelace/package.json)`
2023-06-06 15:27:54 -04:00
509 changed files with 41724 additions and 29839 deletions

View File

@@ -92,7 +92,8 @@ module.exports = {
'@typescript-eslint/member-delimiter-style': 'warn', '@typescript-eslint/member-delimiter-style': 'warn',
'@typescript-eslint/method-signature-style': 'warn', '@typescript-eslint/method-signature-style': 'warn',
'@typescript-eslint/no-extraneous-class': 'error', '@typescript-eslint/no-extraneous-class': 'error',
'@typescript-eslint/no-parameter-properties': 'error', '@typescript-eslint/no-redundant-type-constituents': 'off',
'@typescript-eslint/parameter-properties': 'error',
'@typescript-eslint/strict-boolean-expressions': 'off' '@typescript-eslint/strict-boolean-expressions': 'off'
} }
}, },
@@ -185,6 +186,17 @@ module.exports = {
] ]
} }
], ],
'import/extensions': [
'error',
'always',
{
ignorePackages: true,
pattern: {
js: 'always',
ts: 'never'
}
}
],
'import/no-duplicates': 'warn', 'import/no-duplicates': 'warn',
'sort-imports-es6-autofix/sort-imports-es6': [ 'sort-imports-es6-autofix/sort-imports-es6': [
2, 2,

View File

@@ -3,8 +3,7 @@ name: Bug Report
about: Create a bug report to help us fix a demonstrable problem with code in the library. about: Create a bug report to help us fix a demonstrable problem with code in the library.
title: '' title: ''
labels: bug labels: bug
assignees: claviska assignees:
--- ---
### Describe the bug ### Describe the bug

View File

@@ -1,4 +1,7 @@
contact_links: contact_links:
- name: Feature Requests
url: https://github.com/shoelace-style/shoelace/discussions/categories/ideas
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/shoelace/discussions/categories/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.

View File

@@ -1,17 +0,0 @@
---
name: Feature Request
about: Suggest an idea for this project.
title: ''
labels: feature
assignees: claviska
---
### What issue are you having?
Provide a clear and concise description of the problem you're facing.
### Describe the solution you'd like
How would you like to see the library solve it?
### Describe alternatives you've considered
In what ways have you tried to solve this with the current version?

4
.github/SECURITY.md vendored
View File

@@ -1,7 +1,7 @@
# Reporting Security Issues # Reporting Security Issues
We take security issues in Shoelace very seriously and appreciate your efforts to disclose your findings responsibly. We take security issues in Web Awesome very seriously and appreciate your efforts to disclose your findings responsibly.
To report a security issue, email [cory@abeautifulsite.net](mailto:cory@abeautifulsite.net) and include "SHOELACE SECURITY" in the subject line. To report a security issue, email [cory@fontawesome.com](mailto:cory@abeautifulsite.net) and include "WEB AWESOME SECURITY" in the subject line.
We'll respond as soon as possible and keep you updated throughout the process. We'll respond as soon as possible and keep you updated throughout the process.

3
.gitignore vendored
View File

@@ -1,7 +1,10 @@
_site _site
.cache .cache
.DS_Store .DS_Store
package.json
package-lock.json
dist dist
docs/assets/images/sprite.svg docs/assets/images/sprite.svg
node_modules node_modules
src/react src/react
cdn

View File

@@ -7,5 +7,8 @@ docs/search.json
src/components/icon/icons src/components/icon/icons
src/react/index.ts src/react/index.ts
node_modules node_modules
package.json
package-lock.json package-lock.json
tsconfig.json tsconfig.json
cdn
_site

View File

@@ -2,6 +2,7 @@
"editor.formatOnSave": true, "editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode", "editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.codeActionsOnSave": { "editor.codeActionsOnSave": {
"source.fixAll.eslint": true "source.fixAll.eslint": "explicit"
} },
"debug.enableStatusBarColor": false
} }

View File

@@ -1,4 +1,4 @@
# Contributing to Shoelace # Contributing to Web Awesome
Before contributing, please review the contributions guidelines at: Before contributing, please review the contributions guidelines at:

View File

@@ -1,4 +1,4 @@
Copyright (c) 2020 A Beautiful Site, LLC Copyright (c) 2023 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: 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:

View File

@@ -1,4 +1,4 @@
# Shoelace # Web Awesome
A forward-thinking library of web components. A forward-thinking library of web components.
@@ -9,7 +9,7 @@ A forward-thinking library of web components.
- Built with accessibility in mind ♿️ - Built with accessibility in mind ♿️
- Open source 😸 - Open source 😸
Designed in New Hampshire by [Cory LaViska](https://twitter.com/claviska). Built by the folks behind [Font Awesome](https://fontawesome.com/).
--- ---
@@ -21,15 +21,15 @@ Twitter: [@shoelace_style](https://twitter.com/shoelace_style)
--- ---
## Shoemakers 🥾 ## Developers
Shoemakers, or "Shoelace developers," can use this documentation to learn how to build Shoelace 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 >= 14.17 to build and run the project locally.
**You don't need to do any of this to use Shoelace!** This page is for people who want to contribute to the project, tinker with the source, or create a custom build of Shoelace. **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://shoelace.style) is where you want to be.
### What are you using to build Shoelace? ### 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 [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/).
@@ -38,8 +38,8 @@ Components are built with [LitElement](https://lit-element.polymer-project.org/)
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/shoelace/fork) on GitHub, then clone it locally and install dependencies.
```bash ```bash
git clone https://github.com/YOUR_GITHUB_USERNAME/shoelace git clone https://github.com/YOUR_GITHUB_USERNAME/webawesome
cd shoelace cd webawesome
npm install npm install
``` ```
@@ -63,30 +63,18 @@ npm run build
### Creating New Components ### Creating New Components
To scaffold a new component, run the following command, replacing `sl-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
npm run create sl-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.
### Contributing ### Contributing
Shoelace 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
Shoelace is designed in New Hampshire by [Cory LaViska](https://twitter.com/claviska). Its available under the terms of the MIT license. Web Awesome is available under the terms of the MIT license.
Designing, developing, and supporting this library requires a lot of time, effort, and skill. Id like to keep it open source so everyone can use it, but that doesnt provide me with any income.
**Therefore, if youre using my software to make a profit,** I respectfully ask that you help [fund its development](https://github.com/sponsors/claviska) by becoming a sponsor. There are multiple tiers to choose from with benefits at every level, including prioritized support, bug fixes, feature requests, and advertising.
👇 Your support is very much appreciated! 👇
- [Become a sponsor](https://github.com/sponsors/claviska)
- [Star on GitHub](https://github.com/shoelace-style/shoelace/stargazers)
- [Follow on Twitter](https://twitter.com/shoelace_style)
Whether you're building Shoelace or building something _with_ Shoelace — have fun creating! 🥾

View File

@@ -18,6 +18,7 @@
"CACHEABLE", "CACHEABLE",
"callout", "callout",
"callouts", "callouts",
"cdndir",
"chatbubble", "chatbubble",
"checkmark", "checkmark",
"claviska", "claviska",
@@ -27,6 +28,8 @@
"colocated", "colocated",
"colour", "colour",
"combobox", "combobox",
"Commonmark",
"compat",
"Composability", "Composability",
"Consolas", "Consolas",
"contenteditable", "contenteditable",
@@ -43,11 +46,14 @@
"dogfood", "dogfood",
"dropdowns", "dropdowns",
"easings", "easings",
"endraw",
"endregion",
"enterkeyhint", "enterkeyhint",
"eqeqeq", "eqeqeq",
"erroneou", "erroneou",
"errormessage", "errormessage",
"esbuild", "esbuild",
"exportmaps",
"exportparts", "exportparts",
"fieldsets", "fieldsets",
"formaction", "formaction",
@@ -85,6 +91,7 @@
"listbox", "listbox",
"listitem", "listitem",
"litelement", "litelement",
"longform",
"lowercasing", "lowercasing",
"Lucide", "Lucide",
"maxlength", "maxlength",
@@ -95,6 +102,8 @@
"minlength", "minlength",
"monospace", "monospace",
"mousedown", "mousedown",
"mousemove",
"mouseout",
"mouseup", "mouseup",
"multiselectable", "multiselectable",
"nextjs", "nextjs",
@@ -102,10 +111,16 @@
"noopener", "noopener",
"noreferrer", "noreferrer",
"novalidate", "novalidate",
"npmdir",
"Numberish",
"oklab",
"oklch",
"onscrollend",
"outdir", "outdir",
"ParamagicDev", "ParamagicDev",
"peta", "peta",
"petabit", "petabit",
"Preact",
"prismjs", "prismjs",
"progressbar", "progressbar",
"radiogroup", "radiogroup",
@@ -146,19 +161,24 @@
"tinycolor", "tinycolor",
"transitionend", "transitionend",
"treeitem", "treeitem",
"treeshaking",
"Triaging", "Triaging",
"turbolinks", "turbolinks",
"typeof", "typeof",
"unbundles", "unbundles",
"unbundling", "unbundling",
"unicons", "unicons",
"unsanitized",
"unsupportive", "unsupportive",
"valpha", "valpha",
"valuenow", "valuenow",
"valuetext", "valuetext",
"Vuejs",
"WCAG",
"webawesome",
"WEBP", "WEBP",
"Webpacker", "Webpacker",
"wordmark" "xmark"
], ],
"ignorePaths": [ "ignorePaths": [
"package.json", "package.json",

View File

@@ -1,4 +1,7 @@
import { generateCustomData } from 'cem-plugin-vs-code-custom-data-generator'; 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 { parse } from 'comment-parser';
import { pascalCase } from 'pascal-case'; import { pascalCase } from 'pascal-case';
import commandLineArgs from 'command-line-args'; import commandLineArgs from 'command-line-args';
@@ -26,20 +29,49 @@ function replace(string, terms) {
} }
export default { export default {
globs: ['src/components/**/*.ts'], globs: ['src/components/**/*.component.ts'],
exclude: ['**/*.styles.ts', '**/*.test.ts'], exclude: ['**/*.styles.ts', '**/*.test.ts'],
plugins: [ plugins: [
// Append package data // Append package data
{ {
name: 'shoelace-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 };
} }
}, },
// 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 // Parse custom jsDoc tags
{ {
name: 'shoelace-custom-tags', name: 'wa-custom-tags',
analyzePhase({ ts, node, moduleDoc }) { analyzePhase({ ts, node, moduleDoc }) {
switch (node.kind) { switch (node.kind) {
case ts.SyntaxKind.ClassDeclaration: { case ts.SyntaxKind.ClassDeclaration: {
@@ -58,6 +90,9 @@ export default {
}); });
}); });
// This is what allows us to map JSDOC comments to ReactWrappers.
classDoc['jsDoc'] = node.jsDoc?.map(jsDoc => jsDoc.getFullText()).join('\n');
const parsed = parse(`${customComments}\n */`); const parsed = parse(`${customComments}\n */`);
parsed[0].tags?.forEach(t => { parsed[0].tags?.forEach(t => {
switch (t.tag) { switch (t.tag) {
@@ -105,8 +140,9 @@ export default {
} }
} }
}, },
{ {
name: 'shoelace-react-event-names', name: 'wa-react-event-names',
analyzePhase({ ts, node, moduleDoc }) { analyzePhase({ ts, node, moduleDoc }) {
switch (node.kind) { switch (node.kind) {
case ts.SyntaxKind.ClassDeclaration: { case ts.SyntaxKind.ClassDeclaration: {
@@ -116,14 +152,16 @@ export default {
if (classDoc?.events) { if (classDoc?.events) {
classDoc.events.forEach(event => { classDoc.events.forEach(event => {
event.reactName = `on${pascalCase(event.name)}`; event.reactName = `on${pascalCase(event.name)}`;
event.eventName = `${pascalCase(event.name)}Event`;
}); });
} }
} }
} }
} }
}, },
{ {
name: 'shoelace-translate-module-paths', name: 'wa-translate-module-paths',
packageLinkPhase({ customElementsManifest }) { packageLinkPhase({ customElementsManifest }) {
customElementsManifest?.modules?.forEach(mod => { customElementsManifest?.modules?.forEach(mod => {
// //
@@ -137,7 +175,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: /\.component.(t|j)sx?$/, to: '.js' } // Convert .ts to .js
]; ];
mod.path = replace(mod.path, terms); mod.path = replace(mod.path, terms);
@@ -158,10 +196,35 @@ export default {
}); });
} }
}, },
// Generate custom VS Code data // Generate custom VS Code data
generateCustomData({ customElementVsCodePlugin({
outdir, outdir,
cssFileName: null cssFileName: null,
referencesTemplate: (_, tag) => [
{
name: 'Documentation',
url: `https://shoelace.style/components/${tag.replace('wa-', '')}`
}
]
}),
customElementJetBrainsPlugin({
outdir: './dist',
excludeCss: true,
packageJson: false,
referencesTemplate: (_, tag) => {
return {
name: 'Documentation',
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`
}) })
] ]
}; };

View File

@@ -1,12 +1,12 @@
{% extends "default.njk" %} {% extends "default.njk" %}
{# Find the component based on the `tag` front matter #} {# Find the component based on the `tag` front matter #}
{% set component = getComponent('sl-' + page.fileSlug) %} {% set component = getComponent('wa-' + page.fileSlug) %}
{% block content %} {% block content %}
{# Determine the badge variant #} {# Determine the badge variant #}
{% if component.status == 'stable' %} {% if component.status == 'stable' %}
{% set badgeVariant = 'primary' %} {% set badgeVariant = 'brand' %}
{% elseif component.status == 'experimental' %} {% elseif component.status == 'experimental' %}
{% set badgeVariant = 'warning' %} {% set badgeVariant = 'warning' %}
{% elseif component.status == 'planned' %} {% elseif component.status == 'planned' %}
@@ -26,12 +26,12 @@
</div> </div>
<div class="component-header__info"> <div class="component-header__info">
<sl-badge variant="neutral" pill> <wa-badge variant="neutral" pill>
Since {{component.since or '?' }} Since {{component.since or '?' }}
</sl-badge> </wa-badge>
<sl-badge variant="{{ badgeVariant }}" pill style="text-transform: capitalize;"> <wa-badge variant="{{ badgeVariant }}" pill style="text-transform: capitalize;">
{{ component.status }} {{ component.status }}
</sl-badge> </wa-badge>
</div> </div>
</header> </header>
@@ -39,54 +39,54 @@
{% if component.summary %} {% if component.summary %}
{{ component.summary | markdownInline | safe }} {{ component.summary | markdownInline | safe }}
{% endif %} {% endif %}
</p> </p>
{# Markdown content #} {# Markdown content #}
{{ content | safe }} {{ content | safe }}
{# Importing #} {# Importing #}
<h2>Importing</h2> <h2>Importing</h2>
<p> <p>
If you're using the autoloader or the traditional loader, you can ignore this section. Otherwise, feel free to use If you're using the autoloader or the traditional loader, you can ignore this section. Otherwise, feel free to use
any of the following snippets to <a href="/getting-started/installation#cherry-picking">cherry pick</a> this component. any of the following snippets to <a href="/getting-started/installation#cherry-picking">cherry pick</a> this component.
</p> </p>
<sl-tab-group> <wa-tab-group>
<sl-tab slot="nav" panel="script">Script</sl-tab> <wa-tab slot="nav" panel="script">Script</wa-tab>
<sl-tab slot="nav" panel="import">Import</sl-tab> <wa-tab slot="nav" panel="import">Import</wa-tab>
<sl-tab slot="nav" panel="bundler">Bundler</sl-tab> <wa-tab slot="nav" panel="bundler">Bundler</wa-tab>
<sl-tab slot="nav" panel="react">React</sl-tab> <wa-tab slot="nav" panel="react">React</wa-tab>
<sl-tab-panel name="script"> <wa-tab-panel name="script">
<p> <p>
To import this component from <a href="https://www.jsdelivr.com/package/npm/@shoelace-style/shoelace">the CDN</a> To import this component from <a href="https://www.jsdelivr.com/package/npm/@shoelace-style/shoelace">the CDN</a>
using a script tag: using a script tag:
</p> </p>
<pre><code class="language-html">&lt;script type=&quot;module&quot; src=&quot;https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@{{ meta.version }}/dist/{{ component.path }}&quot;&gt;&lt;/script&gt;</code></pre> <pre><code class="language-html">&lt;script type=&quot;module&quot; src=&quot;https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@{{ meta.version }}/{{ meta.cdndir }}/{{ component.path }}&quot;&gt;&lt;/script&gt;</code></pre>
</sl-tab-panel> </wa-tab-panel>
<sl-tab-panel name="import"> <wa-tab-panel name="import">
<p> <p>
To import this component from <a href="https://www.jsdelivr.com/package/npm/@shoelace-style/shoelace">the CDN</a> To import this component from <a href="https://www.jsdelivr.com/package/npm/@shoelace-style/shoelace">the CDN</a>
using a JavaScript import: using a JavaScript import:
</p> </p>
<pre><code class="language-js">import 'https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@{{ meta.version }}/dist/{{ component.path }}';</code></pre> <pre><code class="language-js">import 'https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@{{ meta.version }}/{{ meta.cdndir }}/{{ component.path }}';</code></pre>
</sl-tab-panel> </wa-tab-panel>
<sl-tab-panel name="bundler"> <wa-tab-panel name="bundler">
<p> <p>
To import this component using <a href="{{ rootUrl('/getting-started/installation#bundling') }}">a bundler</a>: To import this component using <a href="{{ rootUrl('/getting-started/installation#bundling') }}">a bundler</a>:
</p> </p>
<pre><code class="language-js">import '@shoelace-style/shoelace/dist/{{ component.path }}';</code></pre> <pre><code class="language-js">import '@shoelace-style/shoelace/{{ meta.npmdir }}/{{ component.path }}';</code></pre>
</sl-tab-panel> </wa-tab-panel>
<sl-tab-panel name="react"> <wa-tab-panel name="react">
<p> <p>
To import this component as a <a href="/frameworks/react">React component</a>: To import this component as a <a href="/frameworks/react">React component</a>:
</p> </p>
<pre><code class="language-js">import { {{ component.name }} } from '@shoelace-style/shoelace/dist/react';</code></pre> <pre><code class="language-js">import {{ component.name }} from '@shoelace-style/shoelace/{{ meta.npmdir }}/react/{{ component.tagNameWithoutPrefix }}';</code></pre>
</sl-tab-panel> </wa-tab-panel>
</sl-tab-group> </wa-tab-group>
{# Slots #} {# Slots #}
{% if component.slots.length %} {% if component.slots.length %}
@@ -137,15 +137,17 @@
<tr> <tr>
<td> <td>
<code class="nowrap">{{ prop.name }}</code> <code class="nowrap">{{ prop.name }}</code>
{% if prop.attribute != prop.name %} {% if prop.attribute | length > 0 %}
<br> {% if prop.attribute != prop.name %}
<sl-tooltip content="This attribute is different from its property"> <br>
<small> <wa-tooltip content="This attribute is different from its property">
<code class="nowrap"> <small>
{{ prop.attribute }} <code class="nowrap">
</code> {{ prop.attribute }}
</small> </code>
</sl-tooltip> </small>
</wa-tooltip>
{% endif %}
{% endif %} {% endif %}
</td> </td>
<td> <td>
@@ -153,12 +155,12 @@
</td> </td>
<td style="text-align: center;"> <td style="text-align: center;">
{% if prop.reflects %} {% if prop.reflects %}
<sl-icon label="yes" name="check-lg"></sl-icon> <wa-icon label="yes" name="check" variant="solid"></wa-icon>
{% endif %} {% endif %}
</td> </td>
<td> <td>
{% if prop.type.text %} {% if prop.type.text %}
<code>{{ prop.type.text | markdownInline | safe }}</code> <code>{{ prop.type.text | trimPipes | markdownInline | safe }}</code>
{% else %} {% else %}
- -
{% endif %} {% endif %}
@@ -176,7 +178,7 @@
<td class="nowrap"><code>updateComplete</code></td> <td class="nowrap"><code>updateComplete</code></td>
<td> <td>
A read-only promise that resolves when the component has A read-only promise that resolves when the component has
<a href="/getting-started/usage?id=component-rendering-and-updating">finished updating</a>. <a href="/getting-started/usage?#component-rendering-and-updating">finished updating</a>.
</td> </td>
<td></td> <td></td>
<td></td> <td></td>
@@ -185,7 +187,7 @@
</tbody> </tbody>
</table> </table>
<p><em>Learn more about <a href="{{ rootUrl('/getting-started/usage#properties') }}">attributes and properties</a>.</em></p> <p><em>Learn more about <a href="{{ rootUrl('/getting-started/usage#attributes-and-properties') }}">attributes and properties</a>.</em></p>
{% endif %} {% endif %}
{# Events #} {# Events #}
@@ -209,7 +211,7 @@
<td>{{ event.description | markdownInline | safe }}</td> <td>{{ event.description | markdownInline | safe }}</td>
<td> <td>
{% if event.type.text %} {% if event.type.text %}
<code>{{ event.type.text }}</code> <code>{{ event.type.text | trimPipes }}</code>
{% else %} {% else %}
- -
{% endif %} {% endif %}
@@ -243,7 +245,7 @@
{% if method.parameters.length %} {% if method.parameters.length %}
<code> <code>
{% for param in method.parameters %} {% for param in method.parameters %}
{{ param.name }}: {{ param.type.text }}{% if not loop.last %},{% endif %} {{ param.name }}: {{ param.type.text | trimPipes }}{% if not loop.last %},{% endif %}
{% endfor %} {% endfor %}
</code> </code>
{% else %} {% else %}
@@ -305,7 +307,7 @@
</tbody> </tbody>
</table> </table>
<p><em>Learn more about <a href="{{ rootUrl('/getting-started/usage#component-parts') }}">customizing CSS parts</a>.</em></p> <p><em>Learn more about <a href="{{ rootUrl('/getting-started/customizing/#css-parts') }}">customizing CSS parts</a>.</em></p>
{% endif %} {% endif %}
{# Animations #} {# Animations #}
@@ -329,7 +331,7 @@
</tbody> </tbody>
</table> </table>
<p><em>Learn more about <a href="{{ rootUrl('/getting-started/usage#animations') }}">customizing animations</a>.</em></p> <p><em>Learn more about <a href="{{ rootUrl('/getting-started/customizing#animations') }}">customizing animations</a>.</em></p>
{% endif %} {% endif %}
{# Dependencies #} {# Dependencies #}
@@ -337,11 +339,11 @@
<h2>Dependencies</h2> <h2>Dependencies</h2>
<p>This component automatically imports the following dependencies.</p> <p>This component automatically imports the following dependencies.</p>
<ul> <ul>
{% for dependency in component.dependencies %} {% for dependency in component.dependencies %}
<li><code>&lt;{{ dependency }}&gt;</code></li> <li><code>&lt;{{ dependency }}&gt;</code></li>
{% endfor %} {% endfor %}
</ul> </ul>
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View File

@@ -2,7 +2,7 @@
<html <html
lang="en" lang="en"
data-layout="{{ layout }}" data-layout="{{ layout }}"
data-shoelace-version="{{ meta.version }}" data-wa-version="{{ meta.version }}"
> >
<head> <head>
{# Metadata #} {# Metadata #}
@@ -20,7 +20,7 @@
<link rel="stylesheet" href="{{ assetUrl('styles/search.css') }}" /> <link rel="stylesheet" href="{{ assetUrl('styles/search.css') }}" />
{# Favicons #} {# Favicons #}
<link rel="icon" href="{{ assetUrl('images/logo.svg') }}" type="image/x-icon" /> <link rel="icon" href="{{ assetUrl('images/favicon.svg') }}" type="image/x-icon" />
{# Twitter Cards #} {# Twitter Cards #}
<meta name="twitter:card" content="summary" /> <meta name="twitter:card" content="summary" />
@@ -33,20 +33,28 @@
<meta property="og:description" content="{{ meta.description }}" /> <meta property="og:description" content="{{ meta.description }}" />
<meta property="og:image" content="{{ assetUrl(meta.image, true) }}" /> <meta property="og:image" content="{{ assetUrl(meta.image, true) }}" />
{# Shoelace #} {# Web Awesome #}
<link rel="stylesheet" href="/dist/themes/light.css" /> <link rel="stylesheet" href="/dist/themes/applied.css" />
<link rel="stylesheet" href="/dist/themes/dark.css" /> <link rel="stylesheet" href="/dist/themes/forms.css" />
<script type="module" src="/dist/shoelace-autoloader.js"></script> <link id="theme-stylesheet" rel="stylesheet" href="/dist/themes/default.css" />
<link id="theme-stylesheet" rel="stylesheet" href="/dist/themes/demo_patterns.css" />
<link id="theme-stylesheet" rel="stylesheet" href="/dist/themes/demo_sublayout.css" />
<script type="module" src="/dist/autoloader.js"></script>
{# Set the initial theme and menu states here to prevent flashing #} {# Set the initial theme and menu states here to prevent flashing #}
<script> <script>
(() => { (() => {
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
const theme = localStorage.getItem('theme'); const theme = localStorage.getItem('theme') || 'auto';
document.documentElement.classList.toggle('sl-theme-dark', theme === 'dark' || (!theme && prefersDark)); document.documentElement.classList.toggle('wa-theme-default-dark', theme === 'dark' || (theme === 'auto' && prefersDark));
})(); })();
</script> </script>
{# Web Fonts #}
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Assistant:wght@200..800&family=Inter:wght@100..900&family=Lora:wght@400..700&family=Mulish:wght@200..1000&family=Noto+Sans+Display:wght@100..900&family=Noto+Sans+Mono:wght@100..900&family=Noto+Sans:wght@100..900&family=Noto+Serif:wght@100..900&family=Open+Sans:wght@300..800&family=Playfair+Display:wght@400..900&family=Playfair:opsz,wght@5..1200,300;5..1200,400;5..1200,500;5..1200,600&family=Quicksand:wght@300..700&family=Roboto+Flex:opsz,wght@8..144,300;8..144,400;8..144,500;8..144,600&family=Roboto+Mono:wght@300..700&family=Roboto+Serif:opsz,wght@8..144,300;8..144,400;8..144,500;8..144,600&family=Roboto+Slab:wght@300..700&display=swap" rel="stylesheet">
{# Turbo + Scroll positioning #} {# Turbo + Scroll positioning #}
<script src="{{ assetUrl('scripts/turbo.js') }}" type="module"></script> <script src="{{ assetUrl('scripts/turbo.js') }}" type="module"></script>
<script src="{{ assetUrl('scripts/docs.js') }}" defer></script> <script src="{{ assetUrl('scripts/docs.js') }}" defer></script>
@@ -55,7 +63,7 @@
<script src="{{ assetUrl('scripts/search.js') }}" defer></script> <script src="{{ assetUrl('scripts/search.js') }}" defer></script>
</head> </head>
<body> <body>
<a id="skip-to-main" class="visually-hidden" href="#main-content" data-smooth-link="false"> <a id="skip-to-main" class="wa-visually-hidden" href="#main-content" data-smooth-link="false">
Skip to main content Skip to main content
</a> </a>
@@ -68,34 +76,10 @@
</svg> </svg>
</button> </button>
{# Icon toolbar #}
<div id="icon-toolbar">
{# GitHub #}
<a href="https://github.com/shoelace-style/shoelace" title="View Shoelace on GitHub">
<sl-icon name="github"></sl-icon>
</a>
{# Twitter #}
<a href="https://twitter.com/shoelace_style" title="Follow Shoelace on Twitter">
<sl-icon name="twitter"></sl-icon>
</a>
{# Theme toggle #}
<button
id="theme-toggle"
type="button"
aria-label="Toggle light and dark theme"
title="Toggle theme (press backslash)"
>
<sl-icon class="only-light" name="sun-fill"></sl-icon>
<sl-icon class="only-dark" name="moon-fill"></sl-icon>
</button>
</div>
<aside id="sidebar" data-preserve-scroll> <aside id="sidebar" data-preserve-scroll>
<header> <header>
<a href="/"> <a href="/">
<img src="{{ assetUrl('images/wordmark.svg') }}" alt="Shoelace" /> {% include 'logo.njk' %}
</a> </a>
<div class="sidebar-version"> <div class="sidebar-version">
{{ meta.version }} {{ meta.version }}
@@ -103,19 +87,19 @@
</header> </header>
<div class="sidebar-buttons"> <div class="sidebar-buttons">
<sl-button size="small" class="repo-button repo-button--sponsor" href="https://github.com/sponsors/claviska" target="_blank"> <wa-button size="small" class="repo-button repo-button--github" href="https://github.com/shoelace-style/shoelace" target="_blank">
<sl-icon slot="prefix" name="heart"></sl-icon> Sponsor <wa-icon slot="prefix" name="github" family="brands"></wa-icon> Code
</sl-button> </wa-button>
<sl-button size="small" class="repo-button repo-button--github" href="https://github.com/shoelace-style/shoelace" target="_blank"> <wa-button size="small" class="repo-button repo-button--star" href="https://github.com/shoelace-style/shoelace/stargazers" target="_blank">
<sl-icon slot="prefix" name="github"></sl-icon> Code <wa-icon slot="prefix" name="star" variant="solid"></wa-icon> Star
</sl-button> </wa-button>
<sl-button size="small" class="repo-button repo-button--twitter" href="https://twitter.com/shoelace_style" target="_blank"> <wa-button size="small" class="repo-button repo-button--twitter" href="https://twitter.com/shoelace_style" target="_blank">
<sl-icon slot="prefix" name="twitter"></sl-icon> Follow <wa-icon slot="prefix" name="twitter" family="brands"></wa-icon> Follow
</sl-button> </wa-button>
</div> </div>
<button class="search-box" type="button" title="Press / to search" aria-label="Search" data-plugin="search"> <button class="search-box" type="button" title="Press / to search" aria-label="Search" data-plugin="search">
<sl-icon name="search"></sl-icon> <wa-icon name="search"></wa-icon>
<span>Search</span> <span>Search</span>
</button> </button>

1
docs/_includes/logo.njk Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@@ -1,4 +1,25 @@
<ul> <ul>
<li>
<h2>Experimental</h2>
<ul>
<li><a href="/experimental/themer">Themer</a></li>
<li><a href="/experimental/style-guide">Style Guide</a></li>
<li><a href="/experimental/form-validation">Form Validation Styles</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>
<li><a href="/experimental/sandbox">Sandbox</a></li>
<li><a href="/experimental/patterns">Patterns</a></li>
</ul>
</li>
<li> <li>
<h2>Getting Started</h2> <h2>Getting Started</h2>
<ul> <ul>
@@ -34,24 +55,24 @@
<ul> <ul>
{% for component in meta.components %} {% for component in meta.components %}
<li> <li>
<a href="/components/{{ component.tagName | removeSlPrefix }}"> <a href="/components/{{ component.tagName | removeWaPrefix }}">
{{ component.name | classNameToComponentName }} {{ component.name | classNameToComponentName }}
</a> </a>
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>
</li> </li>
<li> <li>
<h2>Design Tokens</h2> <h2>Design Tokens</h2>
<ul> <ul>
<li><a href="/tokens/typography">Typography</a></li> <li><a href="/tokens/typography">Typography</a></li>
<li><a href="/tokens/color">Color</a></li> <li><a href="/tokens/color">Color</a></li>
<li><a href="/tokens/spacing">Spacing</a></li> <li><a href="/tokens/spacing">Spacing</a></li>
<li><a href="/tokens/elevation">Elevation</a></li> <li><a href="/tokens/borders">Borders</a></li>
<li><a href="/tokens/border-radius">Border Radius</a></li> <li><a href="/tokens/shadows">Shadows</a></li>
<li><a href="/tokens/transition">Transition</a></li> <li><a href="/tokens/transition">Transition</a></li>
<li><a href="/tokens/z-index">Z-index</a></li> <li><a href="/tokens/z-index">Z-index</a></li>
<li><a href="/tokens/more">More</a></li> <li><a href="/tokens/more">More Tokens</a></li>
</ul> </ul>
</li> </li>
<li> <li>

View File

@@ -68,7 +68,7 @@ module.exports = function (doc, options) {
<div class="code-preview__preview"> <div class="code-preview__preview">
${code.textContent} ${code.textContent}
<div class="code-preview__resizer"> <div class="code-preview__resizer">
<sl-icon name="grip-vertical"></sl-icon> <wa-icon name="grip-vertical" variant="solid"></wa-icon>
</div> </div>
</div> </div>

View File

@@ -1,3 +1,5 @@
let codeBlockId = 0;
/** /**
* Adds copy code buttons to code fields. The provided doc should be a document object provided by JSDOM. The same * Adds copy code buttons to code fields. The provided doc should be a document object provided by JSDOM. The same
* document will be returned with the appropriate DOM manipulations. * document will be returned with the appropriate DOM manipulations.
@@ -5,19 +7,14 @@
module.exports = function (doc) { module.exports = function (doc) {
doc.querySelectorAll('pre > code').forEach(code => { doc.querySelectorAll('pre > code').forEach(code => {
const pre = code.closest('pre'); const pre = code.closest('pre');
const button = doc.createElement('button'); const button = doc.createElement('wa-copy-button');
button.setAttribute('type', 'button');
button.classList.add('copy-code-button');
button.setAttribute('aria-label', 'Copy');
button.innerHTML = `
<svg class="copy-code-button__copy-icon" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-files" viewBox="0 0 16 16" part="svg">
<path d="M13 0H6a2 2 0 0 0-2 2 2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h7a2 2 0 0 0 2-2 2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm0 13V4a2 2 0 0 0-2-2H5a1 1 0 0 1 1-1h7a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1zM3 4a1 1 0 0 1 1-1h7a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4z"></path>
</svg>
<svg class="copy-code-button__copied-icon" style="display: none;" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-check-lg" viewBox="0 0 16 16" part="svg"> if (!code.id) {
<path d="M12.736 3.97a.733.733 0 0 1 1.047 0c.286.289.29.756.01 1.05L7.88 12.01a.733.733 0 0 1-1.065.02L3.217 8.384a.757.757 0 0 1 0-1.06.733.733 0 0 1 1.047 0l3.052 3.093 5.4-6.425a.247.247 0 0 1 .02-.022Z"></path> code.id = `code-block-${++codeBlockId}`;
</svg> }
`;
button.classList.add('copy-code-button');
button.setAttribute('from', code.id);
pre.append(button); pre.append(button);
}); });

View File

@@ -23,12 +23,20 @@ markdown.use(markdownItReplaceIt);
// Callouts // Callouts
['tip', 'warning', 'danger'].forEach(type => { ['tip', 'warning', 'danger'].forEach(type => {
const variant = type === 'tip' ? 'brand' : type;
let icon = 'circle-info';
if (type === 'warning') icon = 'triangle-exclamation';
if (type === 'danger') icon = 'circle-exclamation';
markdown.use(markdownItContainer, type, { markdown.use(markdownItContainer, type, {
render: function (tokens, idx) { render: function (tokens, idx) {
if (tokens[idx].nesting === 1) { if (tokens[idx].nesting === 1) {
return `<div role="alert" class="callout callout--${type}">`; return `
<wa-alert class="callout" variant="${variant}" open>
<wa-icon slot="icon" name="${icon}" variant="regular"></wa-icon>
`;
} }
return '</div>\n'; return '</wa-alert>\n';
} }
}); });
}); });

View File

@@ -23,4 +23,4 @@ module.exports = function (content, options) {
}; };
return format(content, options); return format(content, options);
} };

View File

@@ -0,0 +1,24 @@
/**
* @typedef {object} Replacement
* @property {string | RegExp} pattern
* @property {string} replacement
*/
/**
* @typedef {Array<Replacement>} Replacements
*/
/**
* @param {Document} content
* @param {Replacements} replacements
*/
module.exports = function (content, replacements) {
/** This seems trivial, but by assigning to a string first, THEN using innerHTML after iterating over every replacement, we reduce the calculations of JSDOM. At the time of writing benchmarks show a reduction from 9seconds to 3 seconds by doing so. */
let html = content.body.innerHTML;
replacements.forEach(replacement => {
html = html.replaceAll(replacement.pattern, replacement.replacement);
});
content.body.innerHTML = html;
};

View File

@@ -0,0 +1,11 @@
<svg width="733" xmlns="http://www.w3.org/2000/svg" height="733">
<circle cy="366.5" cx="366.5" r="366.5"/>
<circle cy="366.5" cx="366.5" r="336.5" fill="#fede58"/>
<path d="M325 665c-121-21-194-115-212-233v-8l-25-1-1-18h481c6 13 10 27 13 41 13 94-38 146-114 193-45 23-93 29-142 26z"/>
<path d="M372 647c52-6 98-28 138-62 28-25 46-56 51-87 4-20 1-57-5-70l-423-1c-2 56 39 118 74 157 31 34 72 54 116 63 11 2 38 2 49 0z" fill="#871945"/>
<path d="M76 342c-13-26-13-57-9-85 6-27 18-52 35-68 21-20 50-23 77-18 15 4 28 12 39 23 18 17 30 40 36 67 4 20 4 41 0 60l-6 21z"/>
<path d="M234 323c5-6 6-40 2-58-3-16-4-16-10-10-14 14-38 14-52 0-15-18-12-41 6-55 3-3 5-5 5-6-1-4-22-8-34-7-42 4-57.6 40-66.2 77-3 17-1 53 4 59H234z" fill="#fff"/>
<path d="M378 343c-2-3-6-20-7-29-5-28-1-57 11-83 15-30 41-52 72-60 29-7 57 0 82 15 26 17 45 49 50 82 2 12 2 33 0 45-1 10-5 26-8 30z"/>
<path d="M565 324c4-5 5-34 4-50-2-14-6-24-8-24-1 0-3 2-6 5-17 17-47 13-58-9-7-16-4-31 8-43 4-4 7-8 7-9 0 0-4-2-8-3-51-17-105 20-115 80-3 15 0 43 3 53z" fill="#fff"/>
<path d="M504 590s-46 40-105 53c-66 15-114-7-114-7s14-76 93-95c76-18 126 49 126 49z" fill="#f9bedd"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="186" height="186" viewBox="0 0 186 186"><g fill="none" fill-rule="evenodd"><rect width="186" height="186" fill="#103257" opacity="0"/><path fill="#F6894C" d="M106.95,13.9672306 C106.95,19.1752428 104.10296,23.7175103 99.8823543,26.1190227 L130.2,48.8851296 L159.91784,39.4892184 C158.760743,37.4541707 158.1,35.0993755 158.1,32.5902046 C158.1,24.8763205 164.345703,18.6229741 172.05,18.6229741 C179.754297,18.6229741 186,24.8763205 186,32.5902046 C186,40.3040179 179.754297,46.5574352 172.05,46.5574352 C171.315566,46.5574352 170.594594,46.5006795 169.890983,46.39107 L137.151086,130.163238 C134.361086,137.302399 127.486526,142 119.830057,142 L66.1699429,142 C58.5134743,142 51.6389143,137.302399 48.8489143,130.163238 L16.1089463,46.39107 C15.4052994,46.5006795 14.6842926,46.5574352 13.95,46.5574352 C6.245632,46.5574352 0,40.3040179 0,32.5902046 C0,24.8763205 6.245632,18.6229741 13.95,18.6229741 C21.654368,18.6229741 27.9,24.8763205 27.9,32.5902046 C27.9,35.0993755 27.2391509,37.4541707 26.0822663,39.4892184 L55.8,48.8851296 L86.1176457,26.1190227 C81.89704,23.7175103 79.05,19.1752428 79.05,13.9672306 C79.05,6.25334639 85.2957029,0 93,0 C100.704297,0 106.95,6.25334639 106.95,13.9672306 Z" transform="translate(0 22)"/></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -1,9 +1,9 @@
(() => { (() => {
function convertModuleLinks(html) { function convertModuleLinks(html) {
html = html html = html
.replace(/@shoelace-style\/shoelace/g, `https://cdn.skypack.dev/@shoelace-style/shoelace@${shoelaceVersion}`) .replace(/@shoelace-style\/shoelace/g, `https://esm.sh/@shoelace-style/shoelace@${waVersion}`)
.replace(/from 'react'/g, `from 'https://cdn.skypack.dev/react@${reactVersion}'`) .replace(/from 'react'/g, `from 'https://esm.sh/react@${reactVersion}'`)
.replace(/from "react"/g, `from "https://cdn.skypack.dev/react@${reactVersion}"`); .replace(/from "react"/g, `from "https://esm.sh/react@${reactVersion}"`);
return html; return html;
} }
@@ -48,30 +48,36 @@
document.documentElement.classList.toggle('flavor-react', flavor === 'react'); document.documentElement.classList.toggle('flavor-react', flavor === 'react');
} }
const shoelaceVersion = document.documentElement.getAttribute('data-shoelace-version'); function syncFlavor() {
setFlavor(getFlavor());
document.querySelectorAll('.code-preview__button--html').forEach(preview => {
if (flavor === 'html') {
preview.classList.add('code-preview__button--selected');
}
});
document.querySelectorAll('.code-preview__button--react').forEach(preview => {
if (flavor === 'react') {
preview.classList.add('code-preview__button--selected');
}
});
}
const waVersion = document.documentElement.getAttribute('data-wa-version');
const reactVersion = '18.2.0'; const reactVersion = '18.2.0';
const cdndir = 'cdn';
const npmdir = 'dist';
let flavor = getFlavor(); let flavor = getFlavor();
let count = 1; let count = 1;
// We need the version to open // We need the version to open
if (!shoelaceVersion) { if (!waVersion) {
throw new Error('The data-shoelace-version attribute is missing from <html>.'); throw new Error('The data-wa-version attribute is missing from <html>.');
} }
// Sync flavor UI on page load // Sync flavor UI on page load
setFlavor(getFlavor()); syncFlavor();
document.querySelectorAll('.code-preview__button--html').forEach(preview => {
if (flavor === 'html') {
preview.classList.add('code-preview__button--selected');
}
});
document.querySelectorAll('.code-preview__button--react').forEach(preview => {
if (flavor === 'react') {
preview.classList.add('code-preview__button--selected');
}
});
// //
// Resizing previews // Resizing previews
@@ -145,12 +151,8 @@
}); });
function toggleSource(codeBlock, force) { function toggleSource(codeBlock, force) {
const toggle = codeBlock.querySelector('.code-preview__toggle'); codeBlock.classList.toggle('code-preview--expanded', force);
event.target.setAttribute('aria-expanded', codeBlock.classList.contains('code-preview--expanded'));
if (toggle) {
codeBlock.classList.toggle('code-preview--expanded', force === undefined ? undefined : force);
event.target.setAttribute('aria-expanded', codeBlock.classList.contains('code-preview--expanded'));
}
} }
// //
@@ -164,9 +166,6 @@
const htmlExample = codeBlock.querySelector('.code-preview__source--html > pre > code')?.textContent; const htmlExample = codeBlock.querySelector('.code-preview__source--html > pre > code')?.textContent;
const reactExample = codeBlock.querySelector('.code-preview__source--react > pre > code')?.textContent; const reactExample = codeBlock.querySelector('.code-preview__source--react > pre > code')?.textContent;
const isReact = flavor === 'react' && typeof reactExample === 'string'; const isReact = flavor === 'react' && typeof reactExample === 'string';
const theme = document.documentElement.classList.contains('sl-theme-dark') ? 'dark' : 'light';
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
const isDark = theme === 'dark' || (theme === 'auto' && prefersDark);
const editors = isReact ? '0010' : '1000'; const editors = isReact ? '0010' : '1000';
let htmlTemplate = ''; let htmlTemplate = '';
let jsTemplate = ''; let jsTemplate = '';
@@ -180,7 +179,7 @@
// HTML templates // HTML templates
if (!isReact) { if (!isReact) {
htmlTemplate = htmlTemplate =
`<script type="module" src="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@${shoelaceVersion}/dist/shoelace.js"></script>\n` + `<script type="module" src="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@${waVersion}/${cdndir}/autoloader.js"></script>\n` +
`\n${htmlExample}`; `\n${htmlExample}`;
jsTemplate = ''; jsTemplate = '';
} }
@@ -189,12 +188,12 @@
if (isReact) { if (isReact) {
htmlTemplate = '<div id="root"></div>'; htmlTemplate = '<div id="root"></div>';
jsTemplate = jsTemplate =
`import React from 'https://cdn.skypack.dev/react@${reactVersion}';\n` + `import React from 'https://esm.sh/react@${reactVersion}';\n` +
`import ReactDOM from 'https://cdn.skypack.dev/react-dom@${reactVersion}';\n` + `import ReactDOM from 'https://esm.sh/react-dom@${reactVersion}';\n` +
`import { setBasePath } from 'https://cdn.skypack.dev/@shoelace-style/shoelace@${shoelaceVersion}/dist/utilities/base-path';\n` + `import { setBasePath } from 'https://esm.sh/@shoelace-style/shoelace@${waVersion}/${cdndir}/utilities/base-path';\n` +
`\n` + `\n` +
`// Set the base path for Shoelace assets\n` + `// Set the base path for Web Awesome assets\n` +
`setBasePath('https://cdn.skypack.dev/@shoelace-style/shoelace@${shoelaceVersion}/dist/')\n` + `setBasePath('https://esm.sh/@shoelace-style/shoelace@${waVersion}/${npmdir}/')\n` +
`\n${convertModuleLinks(reactExample)}\n` + `\n${convertModuleLinks(reactExample)}\n` +
`\n` + `\n` +
`ReactDOM.render(<App />, document.getElementById('root'));`; `ReactDOM.render(<App />, document.getElementById('root'));`;
@@ -202,25 +201,22 @@
// CSS templates // CSS templates
cssTemplate = cssTemplate =
`@import 'https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@${shoelaceVersion}/dist/themes/${ `@import 'https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@${waVersion}/${cdndir}/themes/default.css';\n` +
isDark ? 'dark' : 'light'
}.css';\n` +
'\n' + '\n' +
'body {\n' + 'body {\n' +
' font: 16px sans-serif;\n' + ' font: var(--wa-font-size-root) sans-serif;\n' +
' background-color: var(--sl-color-neutral-0);\n' + ' background-color: var(--wa-color-surface-default);\n' +
' color: var(--sl-color-neutral-900);\n' + ' color: var(--wa-color-text-normal);\n' +
' padding: 1rem;\n' + ' padding: var(--wa-space-m);\n' +
'}'; '}';
// Docs: https://blog.codepen.io/documentation/prefill/ // Docs: https://blog.codepen.io/documentation/prefill/
const data = { const data = {
title: '', title: '',
description: '', description: '',
tags: ['shoelace', 'web components'], tags: ['web awesome', 'web components'],
editors, editors,
head: `<meta name="viewport" content="width=device-width">`, head: `<meta name="viewport" content="width=device-width">`,
html_classes: `sl-theme-${isDark ? 'dark' : 'light'}`,
css_external: ``, css_external: ``,
js_external: ``, js_external: ``,
js_module: true, js_module: true,
@@ -241,4 +237,7 @@
form.remove(); form.remove();
} }
}); });
// Set the initial flavor
window.addEventListener('turbo:load', syncFlavor);
})(); })();

View File

@@ -30,7 +30,6 @@
// Toggle the menu // Toggle the menu
document.addEventListener('click', event => { document.addEventListener('click', event => {
const menuToggle = event.target.closest('#menu-toggle'); const menuToggle = event.target.closest('#menu-toggle');
console.log(event.target, menuToggle);
if (!menuToggle) return; if (!menuToggle) return;
toggleSidebar(); toggleSidebar();
}); });
@@ -74,35 +73,6 @@
updateInert(); updateInert();
})(); })();
//
// Theme switcher
//
(() => {
function toggleTheme() {
const isDark = !document.documentElement.classList.contains('sl-theme-dark');
document.documentElement.classList.toggle('sl-theme-dark', isDark);
localStorage.setItem('theme', isDark ? 'dark' : 'light');
}
// Toggle the theme
document.addEventListener('click', event => {
const themeToggle = event.target.closest('#theme-toggle');
if (!themeToggle) return;
toggleTheme();
});
// Toggle with backslash
document.addEventListener('keydown', event => {
if (
event.key === '\\' &&
!event.composedPath().some(el => ['input', 'textarea'].includes(el?.tagName?.toLowerCase()))
) {
event.preventDefault();
toggleTheme();
}
});
})();
// //
// Open details when printing // Open details when printing
// //
@@ -127,32 +97,6 @@
}); });
})(); })();
//
// Copy code buttons
//
(() => {
document.addEventListener('click', event => {
const button = event.target.closest('.copy-code-button');
const pre = button?.closest('pre');
const code = pre?.querySelector('code');
const copyIcon = button?.querySelector('.copy-code-button__copy-icon');
const copiedIcon = button?.querySelector('.copy-code-button__copied-icon');
if (button && code) {
navigator.clipboard.writeText(code.innerText);
copyIcon.style.display = 'none';
copiedIcon.style.display = 'inline';
button.classList.add('copy-code-button--copied');
setTimeout(() => {
copyIcon.style.display = 'inline';
copiedIcon.style.display = 'none';
button.classList.remove('copy-code-button--copied');
}, 1000);
}
});
})();
// //
// Smooth links // Smooth links
// //
@@ -211,7 +155,7 @@
} }
function updateActiveLinks() { function updateActiveLinks() {
const links = getLinks() const links = getLinks();
// Find the first visible target and activate the respective link // Find the first visible target and activate the respective link
links.find(link => { links.find(link => {
const target = linkTargets.get(link); const target = linkTargets.get(link);
@@ -226,7 +170,7 @@
} }
// Observe link targets // Observe link targets
function observeLinks () { function observeLinks() {
getLinks().forEach(link => { getLinks().forEach(link => {
const hash = link.hash.slice(1); const hash = link.hash.slice(1);
const target = hash ? document.querySelector(`.content__body #${hash}`) : null; const target = hash ? document.querySelector(`.content__body #${hash}`) : null;
@@ -238,8 +182,25 @@
}); });
} }
observeLinks() observeLinks();
document.addEventListener("turbo:load", updateActiveLinks) document.addEventListener('turbo:load', updateActiveLinks);
document.addEventListener("turbo:load", observeLinks) document.addEventListener('turbo:load', observeLinks);
})();
//
// Show custom versions in the sidebar
//
(() => {
function updateVersion() {
const el = document.querySelector('.sidebar-version');
if (!el) return;
if (location.hostname === 'next.shoelace.style') el.textContent = 'Next';
if (location.hostname === 'localhost') el.textContent = 'Development';
}
updateVersion();
document.addEventListener('turbo:load', updateVersion);
})(); })();

View File

@@ -10,7 +10,7 @@
<div class="search__content"> <div class="search__content">
<div class="search__header"> <div class="search__header">
<div id="search-combobox" class="search__input-wrapper"> <div id="search-combobox" class="search__input-wrapper">
<sl-icon name="search"></sl-icon> <wa-icon name="search"></wa-icon>
<input <input
id="search-input" id="search-input"
class="search__input" class="search__input"
@@ -30,7 +30,7 @@
aria-activedescendant aria-activedescendant
> >
<button type="button" class="search__clear-button" aria-label="Clear entry" tabindex="-1" hidden> <button type="button" class="search__clear-button" aria-label="Clear entry" tabindex="-1" hidden>
<sl-icon name="x-circle-fill"></sl-icon> <wa-icon name="circle-xmark" variant="regular"></wa-icon>
</button> </button>
</div> </div>
</div> </div>
@@ -44,8 +44,8 @@
<div class="search__empty">No matching pages</div> <div class="search__empty">No matching pages</div>
</div> </div>
<footer class="search__footer"> <footer class="search__footer">
<small><kbd>↑</kbd> <kbd>↓</kbd> Navigate</small> <small><kbd><wa-icon label="Up" name="arrow-up"></wa-icon></kbd> <kbd><wa-icon label="Down" name="arrow-down"></wa-icon></kbd> Navigate</small>
<small><kbd></kbd> Select</small> <small><kbd><wa-icon label="Enter" name="arrow-turn-down-left"></wa-icon></kbd> Select</small>
<small><kbd>Esc</kbd> Close</small> <small><kbd>Esc</kbd> Close</small>
</footer> </footer>
</div> </div>
@@ -57,16 +57,16 @@
const input = siteSearch.querySelector('.search__input'); const input = siteSearch.querySelector('.search__input');
const clearButton = siteSearch.querySelector('.search__clear-button'); const clearButton = siteSearch.querySelector('.search__clear-button');
const results = siteSearch.querySelector('.search__results'); const results = siteSearch.querySelector('.search__results');
const version = document.documentElement.getAttribute('data-shoelace-version'); const version = document.documentElement.getAttribute('data-wa-version');
const animationDuration = 150; const key = `search_${version}`;
const searchDebounce = 50; const searchDebounce = 50;
const animationDuration = 150;
let isShowing = false; let isShowing = false;
let searchTimeout; let searchTimeout;
let searchIndex; let searchIndex;
let map; let map;
const loadSearchIndex = new Promise(resolve => { const loadSearchIndex = new Promise(resolve => {
const key = `search_${version}`;
const cache = localStorage.getItem(key); const cache = localStorage.getItem(key);
const wait = 'requestIdleCallback' in window ? requestIdleCallback : requestAnimationFrame; const wait = 'requestIdleCallback' in window ? requestIdleCallback : requestAnimationFrame;
@@ -284,7 +284,7 @@
const a = document.createElement('a'); const a = document.createElement('a');
const displayTitle = page.title ?? ''; const displayTitle = page.title ?? '';
const displayDescription = page.description ?? ''; const displayDescription = page.description ?? '';
const displayUrl = page.url.replace(/^\//, ''); const displayUrl = page.url.replace(/^\//, '').replace(/\/$/, '');
let icon = 'file-text'; let icon = 'file-text';
a.setAttribute('role', 'option'); a.setAttribute('role', 'option');
@@ -297,16 +297,16 @@
icon = 'book'; icon = 'book';
} }
if (page.url.includes('components/')) { if (page.url.includes('components/')) {
icon = 'puzzle'; icon = 'puzzle-piece';
} }
if (page.url.includes('tokens/')) { if (page.url.includes('tokens/')) {
icon = 'palette2'; icon = 'swatchbook';
} }
if (page.url.includes('utilities/')) { if (page.url.includes('utilities/')) {
icon = 'wrench'; icon = 'wrench';
} }
if (page.url.includes('tutorials/')) { if (page.url.includes('tutorials/')) {
icon = 'joystick'; icon = 'gamepad';
} }
li.classList.add('search__result'); li.classList.add('search__result');
@@ -317,7 +317,7 @@
a.href = page.url; a.href = page.url;
a.innerHTML = ` a.innerHTML = `
<div class="search__result-icon" aria-hidden="true"> <div class="search__result-icon" aria-hidden="true">
<sl-icon name="${icon}"></sl-icon> <wa-icon name="${icon}"></wa-icon>
</div> </div>
<div class="search__result__details"> <div class="search__result__details">
<div class="search__result-title"></div> <div class="search__result-title"></div>
@@ -357,6 +357,13 @@
} }
}); });
// Purge cache when we press CMD+CTRL+R
document.addEventListener('keydown', event => {
if ((event.metaKey || event.ctrlKey) && event.shiftKey && event.key === 'r') {
localStorage.clear();
}
});
input.addEventListener('input', handleInput); input.addEventListener('input', handleInput);
clearButton.addEventListener('click', handleClear); clearButton.addEventListener('click', handleClear);
@@ -366,4 +373,12 @@
hide(); hide();
} }
}); });
// We're using Turbo, so when a user searches for something, visits a result, and presses the back button, the search
// UI will still be visible but not interactive. This removes the search UI when Turbo renders a page so they don't
// get trapped.
window.addEventListener('turbo:render', () => {
document.body.classList.remove('search-visible');
document.querySelectorAll('.search__overlay, .search__dialog').forEach(el => el.remove());
});
})(); })();

View File

@@ -1,21 +1,21 @@
/* Interactive code blocks */ /* Interactive code blocks */
.code-preview { .code-preview {
position: relative; position: relative;
border-radius: 3px; border-radius: var(--wa-corners-s);
background-color: var(--sl-color-neutral-50); background-color: var(--wa-color-neutral-fill-subtle);
margin-bottom: 1.5rem; margin-bottom: var(--wa-space-xl);
} }
.code-preview__preview { .code-preview__preview {
position: relative; position: relative;
border: solid 1px var(--sl-color-neutral-200); border: var(--wa-border-style) var(--wa-border-width-s) var(--wa-color-surface-border);
border-bottom: none; border-bottom: none;
border-top-left-radius: 3px; border-top-left-radius: var(--wa-corners-s);
border-top-right-radius: 3px; border-top-right-radius: var(--wa-corners-s);
background-color: var(--sl-color-neutral-0); background-color: var(--wa-color-surface-default);
min-width: 20rem; min-width: 20rem;
max-width: 100%; max-width: 100%;
padding: 1.5rem 3.25rem 1.5rem 1.5rem; padding: var(--wa-space-xl) var(--wa-space-3xl) var(--wa-space-xl) var(--wa-space-xl);
} }
/* Block the preview while dragging to prevent iframes from intercepting drag events */ /* Block the preview while dragging to prevent iframes from intercepting drag events */
@@ -39,17 +39,17 @@
right: 0; right: 0;
bottom: 0; bottom: 0;
width: 1.75rem; width: 1.75rem;
font-size: 20px; font-size: var(--wa-font-size-xs);
color: var(--sl-color-neutral-600); color: var(--wa-color-text-quiet);
background-color: var(--sl-color-neutral-0); background-color: var(--wa-color-surface-default);
border-left: solid 1px var(--sl-color-neutral-200); border-left: var(--wa-border-style) var(--wa-border-width-s) var(--wa-color-surface-border);
border-top-right-radius: 3px; border-top-right-radius: var(--wa-corners-s);
cursor: ew-resize; cursor: ew-resize;
} }
@media screen and (max-width: 600px) { @media screen and (max-width: 600px) {
.code-preview__preview { .code-preview__preview {
padding-right: 1.5rem; padding-right: var(--wa-space-xl);
} }
.code-preview__resizer { .code-preview__resizer {
@@ -58,7 +58,7 @@
} }
.code-preview__source { .code-preview__source {
border: solid 1px var(--sl-color-neutral-200); border: var(--wa-border-style) var(--wa-border-width-s) var(--wa-color-surface-border);
border-bottom: none; border-bottom: none;
border-radius: 0 !important; border-radius: 0 !important;
display: none; display: none;
@@ -74,9 +74,9 @@
.code-preview__buttons { .code-preview__buttons {
position: relative; position: relative;
border: solid 1px var(--sl-color-neutral-200); border: var(--wa-border-style) var(--wa-border-width-s) var(--wa-color-surface-border);
border-bottom-left-radius: 3px; border-bottom-left-radius: var(--wa-corners-s);
border-bottom-right-radius: 3px; border-bottom-right-radius: var(--wa-corners-s);
display: flex; display: flex;
} }
@@ -86,18 +86,18 @@
min-width: 2.5rem; min-width: 2.5rem;
border: none; border: none;
border-radius: 0; border-radius: 0;
background: var(--sl-color-neutral-0); background: var(--wa-color-surface-default);
font: inherit; font: inherit;
font-size: 0.7rem; font-size: var(--wa-font-size-xs);
font-weight: 500; font-weight: var(--wa-font-weight-normal);
text-transform: uppercase; text-transform: uppercase;
color: var(--sl-color-neutral-600); color: var(--wa-color-text-quiet);
padding: 0 1rem; padding: 0 1rem;
cursor: pointer; cursor: pointer;
} }
.code-preview__button:not(:last-of-type) { .code-preview__button:not(:last-of-type) {
border-right: solid 1px var(--sl-color-neutral-200); border-right: var(--wa-border-style) var(--wa-border-width-s) var(--wa-color-surface-border);
} }
.code-preview__button--html, .code-preview__button--html,
@@ -109,8 +109,8 @@
} }
.code-preview__button--selected { .code-preview__button--selected {
font-weight: 700; font-weight: var(--wa-font-weight-heavy);
color: var(--sl-color-primary-600); color: var(--wa-color-brand-text-on-surface);
} }
.code-preview__button--codepen { .code-preview__button--codepen {
@@ -120,25 +120,25 @@
} }
.code-preview__button:first-of-type { .code-preview__button:first-of-type {
border-bottom-left-radius: 3px; border-bottom-left-radius: var(--wa-corners-s);
} }
.code-preview__button:last-of-type { .code-preview__button:last-of-type {
border-bottom-right-radius: 3px; border-bottom-right-radius: var(--wa-corners-s);
} }
.code-preview__button:hover, .code-preview__button:hover,
.code-preview__button:active { .code-preview__button:active {
box-shadow: 0 0 0 1px var(--sl-color-primary-400); box-shadow: 0 0 0 var(--wa-border-width-s) var(--wa-color-brand-border-subtle);
border-right-color: transparent; border-right-color: transparent;
background-color: var(--sl-color-primary-50); background-color: var(--wa-color-brand-fill-subtle);
color: var(--sl-color-primary-600); color: var(--wa-color-brand-text-on-surface);
z-index: 1; z-index: 1;
} }
.code-preview__button:focus-visible { .code-preview__button:focus-visible {
outline: none; outline: none;
outline: var(--sl-focus-ring); outline: var(--wa-focus-ring);
z-index: 2; z-index: 2;
} }
@@ -149,7 +149,7 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
width: 100%; width: 100%;
color: var(--sl-color-neutral-600); color: var(--wa-color-text-quiet);
cursor: pointer; cursor: pointer;
} }

File diff suppressed because it is too large Load Diff

View File

@@ -1,32 +1,29 @@
/* Search plugin */ /* Search plugin */
:root, :root {
:root.sl-theme-dark { --docs-search-box-background: var(--wa-form-controls-background);
--docs-search-box-background: var(--sl-color-neutral-0); --docs-search-box-border-width: var(--wa-form-controls-border-width);
--docs-search-box-border-width: 1px; --docs-search-box-border-color: var(--wa-form-controls-resting-color);
--docs-search-box-border-color: var(--sl-color-neutral-300); --docs-search-box-color: var(--wa-form-controls-placeholder-color);
--docs-search-box-color: var(--sl-color-neutral-600);
--docs-search-dialog-background: var(--sl-color-neutral-0);
--docs-search-border-width: var(--docs-border-width);
--docs-search-border-color: var(--docs-border-color);
--docs-search-text-color: var(--sl-color-neutral-900);
--docs-search-text-color-muted: var(--sl-color-neutral-500);
--docs-search-font-weight-normal: var(--sl-font-weight-normal);
--docs-search-font-weight-semibold: var(--sl-font-weight-semibold);
--docs-search-border-radius: calc(2 * var(--docs-border-radius));
--docs-search-accent-color: var(--sl-color-primary-600);
--docs-search-icon-color: var(--sl-color-neutral-500);
--docs-search-icon-color-active: var(--sl-color-neutral-600);
--docs-search-shadow: var(--docs-shadow-x-large);
--docs-search-result-background-hover: var(--sl-color-neutral-100);
--docs-search-result-color-hover: var(--sl-color-neutral-900);
--docs-search-result-background-active: var(--sl-color-primary-600);
--docs-search-result-color-active: var(--sl-color-neutral-0);
--docs-search-focus-ring: var(--sl-focus-ring);
--docs-search-overlay-background: rgb(0 0 0 / 0.33);
}
:root.sl-theme-dark { --docs-search-dialog-background: var(--wa-color-surface-raised);
--docs-search-overlay-background: rgb(71 71 71 / 0.33); --docs-search-border-width: var(--wa-border-width-s);
--docs-search-border-color: var(--wa-color-surface-border);
--docs-search-text-color: var(--wa-color-text-normal);
--docs-search-text-color-muted: var(--wa-color-text-quiet);
--docs-search-font-weight-normal: var(--wa-font-weight-normal);
--docs-search-font-weight-semibold: var(--wa-font-weight-medium);
--docs-search-border-radius: calc(2 * var(--wa-corners-s));
--docs-search-accent-color: var(--wa-color-brand-text-on-surface);
--docs-search-icon-color: var(--wa-color-neutral-spot);
--docs-search-icon-color-active: color-mix(in lch, var(--wa-color-neutral-spot), 8% black);
--docs-search-shadow: var(--wa-shadow-level-3);
--docs-search-result-background-hover: var(--wa-color-neutral-fill-highlight);
--docs-search-result-color-hover: var(--wa-color-neutral-text-on-fill);
--docs-search-result-background-active: var(--wa-color-brand-spot);
--docs-search-result-color-active: var(--wa-color-brand-text-on-spot);
--docs-search-focus-ring: var(--wa-focus-ring);
--docs-search-overlay-background: rgb(0 0 0 / 0.33);
} }
body.search-visible { body.search-visible {
@@ -47,7 +44,7 @@ body.search-visible {
font: inherit; font: inherit;
color: var(--docs-search-box-color); color: var(--docs-search-box-color);
padding: 0.75rem 1rem; padding: 0.75rem 1rem;
margin: var(--sl-spacing-large) 0; margin: var(--wa-space-l) 0;
cursor: pointer; cursor: pointer;
} }
@@ -150,7 +147,7 @@ body.search-visible {
align-items: center; align-items: center;
} }
.search__input-wrapper sl-icon { .search__input-wrapper wa-icon {
width: 1.5rem; width: 1.5rem;
height: 1.5rem; height: 1.5rem;
flex: 0 0 auto; flex: 0 0 auto;
@@ -172,7 +169,7 @@ body.search-visible {
display: none; display: none;
} }
.search__clear-button:active sl-icon { .search__clear-button:active wa-icon {
color: var(--docs-search-icon-color-active); color: var(--docs-search-icon-color-active);
} }
@@ -276,7 +273,7 @@ body.search-visible {
color: var(--docs-search-text-color-muted); color: var(--docs-search-text-color-muted);
} }
.search__result-icon sl-icon { .search__result-icon wa-icon {
font-size: 1.5rem; font-size: 1.5rem;
} }

View File

@@ -5,7 +5,7 @@ const lunr = require('lunr');
const { capitalCase } = require('change-case'); const { capitalCase } = require('change-case');
const { JSDOM } = require('jsdom'); const { JSDOM } = require('jsdom');
const { customElementsManifest, getAllComponents } = require('./_utilities/cem.cjs'); const { customElementsManifest, getAllComponents } = require('./_utilities/cem.cjs');
const shoelaceFlavoredMarkdown = require('./_utilities/markdown.cjs'); const webAwesomeFlavoredMarkdown = require('./_utilities/markdown.cjs');
const activeLinks = require('./_utilities/active-links.cjs'); const activeLinks = require('./_utilities/active-links.cjs');
const anchorHeadings = require('./_utilities/anchor-headings.cjs'); const anchorHeadings = require('./_utilities/anchor-headings.cjs');
const codePreviews = require('./_utilities/code-previews.cjs'); const codePreviews = require('./_utilities/code-previews.cjs');
@@ -16,8 +16,11 @@ const tableOfContents = require('./_utilities/table-of-contents.cjs');
const prettier = require('./_utilities/prettier.cjs'); const prettier = require('./_utilities/prettier.cjs');
const scrollingTables = require('./_utilities/scrolling-tables.cjs'); const scrollingTables = require('./_utilities/scrolling-tables.cjs');
const typography = require('./_utilities/typography.cjs'); const typography = require('./_utilities/typography.cjs');
const replacer = require('./_utilities/replacer.cjs');
const assetsDir = 'assets'; const assetsDir = 'assets';
const cdndir = 'cdn';
const npmdir = 'dist';
const allComponents = getAllComponents(); const allComponents = getAllComponents();
let hasBuiltSearchIndex = false; let hasBuiltSearchIndex = false;
@@ -29,11 +32,13 @@ module.exports = function (eleventyConfig) {
eleventyConfig.addGlobalData('layout', 'default'); // make 'default' the default layout eleventyConfig.addGlobalData('layout', 'default'); // make 'default' the default layout
eleventyConfig.addGlobalData('toc', true); // enable the table of contents eleventyConfig.addGlobalData('toc', true); // enable the table of contents
eleventyConfig.addGlobalData('meta', { eleventyConfig.addGlobalData('meta', {
title: 'Shoelace', title: 'Web Awesome',
description: 'A forward-thinking library of web components.', description: 'A forward-thinking library of web components.',
image: 'images/og-image.png', image: 'images/og-image.png',
version: customElementsManifest.package.version, version: customElementsManifest.package.version,
components: allComponents components: allComponents,
cdndir,
npmdir
}); });
// //
@@ -69,7 +74,7 @@ module.exports = function (eleventyConfig) {
if (!component) { if (!component) {
throw new Error( throw new Error(
`Unable to find a component called "${tagName}". Make sure the file name is the same as the component's tag ` + `Unable to find a component called "${tagName}". Make sure the file name is the same as the component's tag ` +
`name (minus the sl- prefix).` `name (minus the wa- prefix).`
); );
} }
return component; return component;
@@ -78,27 +83,33 @@ module.exports = function (eleventyConfig) {
// //
// Custom markdown syntaxes // Custom markdown syntaxes
// //
eleventyConfig.setLibrary('md', shoelaceFlavoredMarkdown); eleventyConfig.setLibrary('md', webAwesomeFlavoredMarkdown);
// //
// Filters // Filters
// //
eleventyConfig.addFilter('markdown', content => { eleventyConfig.addFilter('markdown', content => {
return shoelaceFlavoredMarkdown.render(content); return webAwesomeFlavoredMarkdown.render(content);
}); });
eleventyConfig.addFilter('markdownInline', content => { eleventyConfig.addFilter('markdownInline', content => {
return shoelaceFlavoredMarkdown.renderInline(content); return webAwesomeFlavoredMarkdown.renderInline(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 if the line wraps.
eleventyConfig.addFilter('trimPipes', content => {
return typeof content === 'string' ? content.replace(/^(\s|\|)/g, '').replace(/(\s|\|)$/g, '') : content;
}); });
eleventyConfig.addFilter('classNameToComponentName', className => { eleventyConfig.addFilter('classNameToComponentName', className => {
let name = capitalCase(className.replace(/^Sl/, '')); let name = capitalCase(className.replace(/^Wa/, ''));
if (name === 'Qr Code') name = 'QR Code'; // manual override if (name === 'Qr Code') name = 'QR Code'; // manual override
return name; return name;
}); });
eleventyConfig.addFilter('removeSlPrefix', tagName => { eleventyConfig.addFilter('removeWaPrefix', tagName => {
return tagName.replace(/^sl-/, ''); return tagName.replace(/^wa-/, '');
}); });
// //
@@ -130,6 +141,12 @@ module.exports = function (eleventyConfig) {
copyCodeButtons(doc); // must be after codePreviews + highlightCodeBlocks copyCodeButtons(doc); // must be after codePreviews + highlightCodeBlocks
typography(doc, '#content'); typography(doc, '#content');
replacer(doc, [
{ pattern: '%VERSION%', replacement: customElementsManifest.package.version },
{ pattern: '%CDNDIR%', replacement: cdndir },
{ pattern: '%NPMDIR%', replacement: npmdir }
]);
// Serialize the Document object to an HTML string and prepend the doctype // Serialize the Document object to an HTML string and prepend the doctype
content = `<!DOCTYPE html>\n${doc.documentElement.outerHTML}`; content = `<!DOCTYPE html>\n${doc.documentElement.outerHTML}`;
@@ -161,7 +178,10 @@ module.exports = function (eleventyConfig) {
this.field('c'); // content this.field('c'); // content
results.forEach((result, index) => { results.forEach((result, index) => {
const url = path.join('/', path.relative(eleventyConfig.dir.output, result.outputPath)).replace(/\\/g, '/'); const url = path
.join('/', path.relative(eleventyConfig.dir.output, result.outputPath))
.replace(/\\/g, '/') // convert backslashes to forward slashes
.replace(/\/index.html$/, '/'); // convert trailing /index.html to /
const doc = new JSDOM(result.content, { const doc = new JSDOM(result.content, {
// We must set a default URL so links are parsed with a hostname. Let's use a bogus TLD so we can easily // We must set a default URL so links are parsed with a hostname. Let's use a bogus TLD so we can easily
// identify which ones are internal and which ones are external. // identify which ones are internal and which ones are external.
@@ -208,7 +228,7 @@ module.exports = function (eleventyConfig) {
eleventyConfig.setServerOptions({ eleventyConfig.setServerOptions({
domDiff: false, // disable dom diffing so custom elements don't break on reload, domDiff: false, // disable dom diffing so custom elements don't break on reload,
port: 4000, // if port 4000 is taken, 11ty will use the next one available port: 4000, // if port 4000 is taken, 11ty will use the next one available
watch: ['dist/**/*'] // additional files to watch that will trigger server updates (array of paths or globs) watch: ['cdn/**/*'] // additional files to watch that will trigger server updates (array of paths or globs)
}); });
// //

View File

@@ -6,24 +6,25 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-alert open> <wa-alert open>
<sl-icon slot="icon" name="info-circle"></sl-icon> <wa-icon slot="icon" name="circle-info" variant="regular"></wa-icon>
This is a standard alert. You can customize its content and even the icon. This is a standard alert. You can customize its content and even the icon.
</sl-alert> </wa-alert>
``` ```
```jsx:react ```jsx:react
import { SlAlert, SlIcon } from '@shoelace-style/shoelace/dist/react'; import WaAlert from '@shoelace-style/shoelace/dist/react/alert';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
const App = () => ( const App = () => (
<SlAlert open> <WaAlert open>
<SlIcon slot="icon" name="info-circle" /> <WaIcon slot="icon" name="circle-info" variant="regular" />
This is a standard alert. You can customize its content and even the icon. This is a standard alert. You can customize its content and even the icon.
</SlAlert> </WaAlert>
); );
``` ```
:::tip :::warning
Alerts will not be visible if the `open` attribute is not present. Alerts will not be visible if the `open` attribute is not present.
::: :::
@@ -34,92 +35,93 @@ Alerts will not be visible if the `open` attribute is not present.
Set the `variant` attribute to change the alert's variant. Set the `variant` attribute to change the alert's variant.
```html:preview ```html:preview
<sl-alert variant="primary" open> <wa-alert variant="brand" open>
<sl-icon slot="icon" name="info-circle"></sl-icon> <wa-icon slot="icon" name="circle-info" variant="regular"></wa-icon>
<strong>This is super informative</strong><br /> <strong>This is super informative</strong><br />
You can tell by how pretty the alert is. You can tell by how pretty the alert is.
</sl-alert> </wa-alert>
<br /> <br />
<sl-alert variant="success" open> <wa-alert variant="success" open>
<sl-icon slot="icon" name="check2-circle"></sl-icon> <wa-icon slot="icon" name="circle-check" variant="regular"></wa-icon>
<strong>Your changes have been saved</strong><br /> <strong>Your changes have been saved</strong><br />
You can safely exit the app now. You can safely exit the app now.
</sl-alert> </wa-alert>
<br /> <br />
<sl-alert variant="neutral" open> <wa-alert variant="neutral" open>
<sl-icon slot="icon" name="gear"></sl-icon> <wa-icon slot="icon" name="gear" variant="regular"></wa-icon>
<strong>Your settings have been updated</strong><br /> <strong>Your settings have been updated</strong><br />
Settings will take affect on next login. Settings will take effect on next login.
</sl-alert> </wa-alert>
<br /> <br />
<sl-alert variant="warning" open> <wa-alert variant="warning" open>
<sl-icon slot="icon" name="exclamation-triangle"></sl-icon> <wa-icon slot="icon" name="triangle-exclamation" variant="regular"></wa-icon>
<strong>Your session has ended</strong><br /> <strong>Your session has ended</strong><br />
Please login again to continue. Please login again to continue.
</sl-alert> </wa-alert>
<br /> <br />
<sl-alert variant="danger" open> <wa-alert variant="danger" open>
<sl-icon slot="icon" name="exclamation-octagon"></sl-icon> <wa-icon slot="icon" name="circle-exclamation" variant="regular"></wa-icon>
<strong>Your account has been deleted</strong><br /> <strong>Your account has been deleted</strong><br />
We're very sorry to see you go! We're very sorry to see you go!
</sl-alert> </wa-alert>
``` ```
```jsx:react ```jsx:react
import { SlAlert, SlIcon } from '@shoelace-style/shoelace/dist/react'; import WaAlert from '@shoelace-style/shoelace/dist/react/alert';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
const App = () => ( const App = () => (
<> <>
<SlAlert variant="primary" open> <WaAlert variant="brand" open>
<SlIcon slot="icon" name="info-circle" /> <WaIcon slot="icon" name="circle-info" variant="regular" />
<strong>This is super informative</strong> <strong>This is super informative</strong>
<br /> <br />
You can tell by how pretty the alert is. You can tell by how pretty the alert is.
</SlAlert> </WaAlert>
<br /> <br />
<SlAlert variant="success" open> <WaAlert variant="success" open>
<SlIcon slot="icon" name="check2-circle" /> <WaIcon slot="icon" name="circle-check" variant="regular" />
<strong>Your changes have been saved</strong> <strong>Your changes have been saved</strong>
<br /> <br />
You can safely exit the app now. You can safely exit the app now.
</SlAlert> </WaAlert>
<br /> <br />
<SlAlert variant="neutral" open> <WaAlert variant="neutral" open>
<SlIcon slot="icon" name="gear" /> <WaIcon slot="icon" name="gear" variant="regular" />
<strong>Your settings have been updated</strong> <strong>Your settings have been updated</strong>
<br /> <br />
Settings will take affect on next login. Settings will take effect on next login.
</SlAlert> </WaAlert>
<br /> <br />
<SlAlert variant="warning" open> <WaAlert variant="warning" open>
<SlIcon slot="icon" name="exclamation-triangle" /> <WaIcon slot="icon" name="triangle-exclamation" variant="regular" />
<strong>Your session has ended</strong> <strong>Your session has ended</strong>
<br /> <br />
Please login again to continue. Please login again to continue.
</SlAlert> </WaAlert>
<br /> <br />
<SlAlert variant="danger" open> <WaAlert variant="danger" open>
<SlIcon slot="icon" name="exclamation-octagon" /> <WaIcon slot="icon" name="circle-exclamation" variant="regular" />
<strong>Your account has been deleted</strong> <strong>Your account has been deleted</strong>
<br /> <br />
We're very sorry to see you go! We're very sorry to see you go!
</SlAlert> </WaAlert>
</> </>
); );
``` ```
@@ -129,14 +131,14 @@ const App = () => (
Add the `closable` attribute to show a close button that will hide the alert. Add the `closable` attribute to show a close button that will hide the alert.
```html:preview ```html:preview
<sl-alert variant="primary" open closable class="alert-closable"> <wa-alert variant="brand" open closable class="alert-closable">
<sl-icon slot="icon" name="info-circle"></sl-icon> <wa-icon slot="icon" name="circle-info" variant="regular"></wa-icon>
You can close this alert any time! You can close this alert any time!
</sl-alert> </wa-alert>
<script> <script>
const alert = document.querySelector('.alert-closable'); const alert = document.querySelector('.alert-closable');
alert.addEventListener('sl-after-hide', () => { alert.addEventListener('wa-after-hide', () => {
setTimeout(() => (alert.open = true), 2000); setTimeout(() => (alert.open = true), 2000);
}); });
</script> </script>
@@ -144,7 +146,8 @@ Add the `closable` attribute to show a close button that will hide the alert.
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlAlert, SlIcon } from '@shoelace-style/shoelace/dist/react'; import WaAlert from '@shoelace-style/shoelace/dist/react/alert';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
const App = () => { const App = () => {
const [open, setOpen] = useState(true); const [open, setOpen] = useState(true);
@@ -155,10 +158,10 @@ const App = () => {
} }
return ( return (
<SlAlert open={open} closable onSlAfterHide={handleHide}> <WaAlert open={open} closable onWaAfterHide={handleHide}>
<SlIcon slot="icon" name="info-circle" /> <WaIcon slot="icon" name="circle-info" variant="regular" />
You can close this alert any time! You can close this alert any time!
</SlAlert> </WaAlert>
); );
}; };
``` ```
@@ -168,16 +171,16 @@ const App = () => {
Icons are optional. Simply omit the `icon` slot if you don't want them. Icons are optional. Simply omit the `icon` slot if you don't want them.
```html:preview ```html:preview
<sl-alert variant="primary" open> Nothing fancy here, just a simple alert. </sl-alert> <wa-alert variant="brand" open> Nothing fancy here, just a simple alert. </wa-alert>
``` ```
```jsx:react ```jsx:react
import { SlAlert } from '@shoelace-style/shoelace/dist/react'; import WaAlert from '@shoelace-style/shoelace/dist/react/alert';
const App = () => ( const App = () => (
<SlAlert variant="primary" open> <WaAlert variant="brand" open>
Nothing fancy here, just a simple alert. Nothing fancy here, just a simple alert.
</SlAlert> </WaAlert>
); );
``` ```
@@ -187,36 +190,38 @@ Set the `duration` attribute to automatically hide an alert after a period of ti
```html:preview ```html:preview
<div class="alert-duration"> <div class="alert-duration">
<sl-button variant="primary">Show Alert</sl-button> <wa-button variant="brand">Show Alert</wa-button>
<sl-alert variant="primary" duration="3000" closable> <wa-alert variant="brand" duration="3000" closable>
<sl-icon slot="icon" name="info-circle"></sl-icon> <wa-icon slot="icon" name="circle-info" variant="regular"></wa-icon>
This alert will automatically hide itself after three seconds, unless you interact with it. This alert will automatically hide itself after three seconds, unless you interact with it.
</sl-alert> </wa-alert>
</div> </div>
<script> <script>
const container = document.querySelector('.alert-duration'); const container = document.querySelector('.alert-duration');
const button = container.querySelector('sl-button'); const button = container.querySelector('wa-button');
const alert = container.querySelector('sl-alert'); const alert = container.querySelector('wa-alert');
button.addEventListener('click', () => alert.show()); button.addEventListener('click', () => alert.show());
</script> </script>
<style> <style>
.alert-duration sl-alert { .alert-duration wa-alert {
margin-top: var(--sl-spacing-medium); margin-top: var(--wa-space-m);
} }
</style> </style>
``` ```
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlAlert, SlButton, SlIcon } from '@shoelace-style/shoelace/dist/react'; import WaAlert from '@shoelace-style/shoelace/dist/react/alert';
import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
const css = ` const css = `
.alert-duration sl-alert { .alert-duration wa-alert {
margin-top: var(--sl-spacing-medium); margin-top: var(--wa-space-m);
} }
`; `;
@@ -226,14 +231,14 @@ const App = () => {
return ( return (
<> <>
<div className="alert-duration"> <div className="alert-duration">
<SlButton variant="primary" onClick={() => setOpen(true)}> <WaButton variant="brand" onClick={() => setOpen(true)}>
Show Alert Show Alert
</SlButton> </WaButton>
<SlAlert variant="primary" duration="3000" open={open} closable onSlAfterHide={() => setOpen(false)}> <WaAlert variant="brand" duration="3000" open={open} closable onWaAfterHide={() => setOpen(false)}>
<SlIcon slot="icon" name="info-circle" /> <WaIcon slot="icon" name="circle-info" variant="regular" />
This alert will automatically hide itself after three seconds, unless you interact with it. This alert will automatically hide itself after three seconds, unless you interact with it.
</SlAlert> </WaAlert>
</div> </div>
<style>{css}</style> <style>{css}</style>
@@ -250,49 +255,49 @@ You should always use the `closable` attribute so users can dismiss the notifica
```html:preview ```html:preview
<div class="alert-toast"> <div class="alert-toast">
<sl-button variant="primary">Primary</sl-button> <wa-button variant="brand">Brand</wa-button>
<sl-button variant="success">Success</sl-button> <wa-button variant="success">Success</wa-button>
<sl-button variant="neutral">Neutral</sl-button> <wa-button variant="neutral">Neutral</wa-button>
<sl-button variant="warning">Warning</sl-button> <wa-button variant="warning">Warning</wa-button>
<sl-button variant="danger">Danger</sl-button> <wa-button variant="danger">Danger</wa-button>
<sl-alert variant="primary" duration="3000" closable> <wa-alert variant="brand" duration="3000" closable>
<sl-icon slot="icon" name="info-circle"></sl-icon> <wa-icon slot="icon" name="circle-info" variant="regular"></wa-icon>
<strong>This is super informative</strong><br /> <strong>This is super informative</strong><br />
You can tell by how pretty the alert is. You can tell by how pretty the alert is.
</sl-alert> </wa-alert>
<sl-alert variant="success" duration="3000" closable> <wa-alert variant="success" duration="3000" closable>
<sl-icon slot="icon" name="check2-circle"></sl-icon> <wa-icon slot="icon" name="circle-check" variant="regular"></wa-icon>
<strong>Your changes have been saved</strong><br /> <strong>Your changes have been saved</strong><br />
You can safely exit the app now. You can safely exit the app now.
</sl-alert> </wa-alert>
<sl-alert variant="neutral" duration="3000" closable> <wa-alert variant="neutral" duration="3000" closable>
<sl-icon slot="icon" name="gear"></sl-icon> <wa-icon slot="icon" name="gear" variant="regular"></wa-icon>
<strong>Your settings have been updated</strong><br /> <strong>Your settings have been updated</strong><br />
Settings will take affect on next login. Settings will take effect on next login.
</sl-alert> </wa-alert>
<sl-alert variant="warning" duration="3000" closable> <wa-alert variant="warning" duration="3000" closable>
<sl-icon slot="icon" name="exclamation-triangle"></sl-icon> <wa-icon slot="icon" name="triangle-exclamation" variant="regular"></wa-icon>
<strong>Your session has ended</strong><br /> <strong>Your session has ended</strong><br />
Please login again to continue. Please login again to continue.
</sl-alert> </wa-alert>
<sl-alert variant="danger" duration="3000" closable> <wa-alert variant="danger" duration="3000" closable>
<sl-icon slot="icon" name="exclamation-octagon"></sl-icon> <wa-icon slot="icon" name="circle-exclamation" variant="regular"></wa-icon>
<strong>Your account has been deleted</strong><br /> <strong>Your account has been deleted</strong><br />
We're very sorry to see you go! We're very sorry to see you go!
</sl-alert> </wa-alert>
</div> </div>
<script> <script>
const container = document.querySelector('.alert-toast'); const container = document.querySelector('.alert-toast');
['primary', 'success', 'neutral', 'warning', 'danger'].map(variant => { ['brand', 'success', 'neutral', 'warning', 'danger'].map(variant => {
const button = container.querySelector(`sl-button[variant="${variant}"]`); const button = container.querySelector(`wa-button[variant="${variant}"]`);
const alert = container.querySelector(`sl-alert[variant="${variant}"]`); const alert = container.querySelector(`wa-alert[variant="${variant}"]`);
button.addEventListener('click', () => alert.toast()); button.addEventListener('click', () => alert.toast());
}); });
@@ -301,14 +306,16 @@ You should always use the `closable` attribute so users can dismiss the notifica
```jsx:react ```jsx:react
import { useRef } from 'react'; import { useRef } from 'react';
import { SlAlert, SlButton, SlIcon } from '@shoelace-style/shoelace/dist/react'; import WaAlert from '@shoelace-style/shoelace/dist/react/alert';
import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
function showToast(alert) { function showToast(alert) {
alert.toast(); alert.toast();
} }
const App = () => { const App = () => {
const primary = useRef(null); const brand = useRef(null);
const success = useRef(null); const success = useRef(null);
const neutral = useRef(null); const neutral = useRef(null);
const warning = useRef(null); const warning = useRef(null);
@@ -316,60 +323,60 @@ const App = () => {
return ( return (
<> <>
<SlButton variant="primary" onClick={() => primary.current.toast()}> <WaButton variant="brand" onClick={() => brand.current.toast()}>
Primary Brand
</SlButton> </WaButton>
<SlButton variant="success" onClick={() => success.current.toast()}> <WaButton variant="success" onClick={() => success.current.toast()}>
Success Success
</SlButton> </WaButton>
<SlButton variant="neutral" onClick={() => neutral.current.toast()}> <WaButton variant="neutral" onClick={() => neutral.current.toast()}>
Neutral Neutral
</SlButton> </WaButton>
<SlButton variant="warning" onClick={() => warning.current.toast()}> <WaButton variant="warning" onClick={() => warning.current.toast()}>
Warning Warning
</SlButton> </WaButton>
<SlButton variant="danger" onClick={() => danger.current.toast()}> <WaButton variant="danger" onClick={() => danger.current.toast()}>
Danger Danger
</SlButton> </WaButton>
<SlAlert ref={primary} variant="primary" duration="3000" closable> <WaAlert ref={brand} variant="brand" duration="3000" closable>
<SlIcon slot="icon" name="info-circle" /> <WaIcon slot="icon" name="circle-info" variant="regular" />
<strong>This is super informative</strong> <strong>This is super informative</strong>
<br /> <br />
You can tell by how pretty the alert is. You can tell by how pretty the alert is.
</SlAlert> </WaAlert>
<SlAlert ref={success} variant="success" duration="3000" closable> <WaAlert ref={success} variant="success" duration="3000" closable>
<SlIcon slot="icon" name="check2-circle" /> <WaIcon slot="icon" name="circle-check" variant="regular" />
<strong>Your changes have been saved</strong> <strong>Your changes have been saved</strong>
<br /> <br />
You can safely exit the app now. You can safely exit the app now.
</SlAlert> </WaAlert>
<SlAlert ref={neutral} variant="neutral" duration="3000" closable> <WaAlert ref={neutral} variant="neutral" duration="3000" closable>
<SlIcon slot="icon" name="gear" /> <WaIcon slot="icon" name="gear" variant="regular" />
<strong>Your settings have been updated</strong> <strong>Your settings have been updated</strong>
<br /> <br />
Settings will take affect on next login. Settings will take effect on next login.
</SlAlert> </WaAlert>
<SlAlert ref={warning} variant="warning" duration="3000" closable> <WaAlert ref={warning} variant="warning" duration="3000" closable>
<SlIcon slot="icon" name="exclamation-triangle" /> <WaIcon slot="icon" name="triangle-exclamation" variant="regular" />
<strong>Your session has ended</strong> <strong>Your session has ended</strong>
<br /> <br />
Please login again to continue. Please login again to continue.
</SlAlert> </WaAlert>
<SlAlert ref={danger} variant="danger" duration="3000" closable> <WaAlert ref={danger} variant="danger" duration="3000" closable>
<SlIcon slot="icon" name="exclamation-octagon" /> <WaIcon slot="icon" name="circle-exclamation" variant="regular" />
<strong>Your account has been deleted</strong> <strong>Your account has been deleted</strong>
<br /> <br />
We're very sorry to see you go! We're very sorry to see you go!
</SlAlert> </WaAlert>
</> </>
); );
}; };
@@ -381,12 +388,12 @@ For convenience, you can create a utility that emits toast notifications with a
```html:preview ```html:preview
<div class="alert-toast-wrapper"> <div class="alert-toast-wrapper">
<sl-button variant="primary">Create Toast</sl-button> <wa-button variant="brand">Create Toast</wa-button>
</div> </div>
<script> <script>
const container = document.querySelector('.alert-toast-wrapper'); const container = document.querySelector('.alert-toast-wrapper');
const button = container.querySelector('sl-button'); const button = container.querySelector('wa-button');
let count = 0; let count = 0;
// Always escape HTML for text arguments! // Always escape HTML for text arguments!
@@ -397,13 +404,13 @@ For convenience, you can create a utility that emits toast notifications with a
} }
// Custom function to emit toast notifications // Custom function to emit toast notifications
function notify(message, variant = 'primary', icon = 'info-circle', duration = 3000) { function notify(message, variant = 'brand', icon = 'circle-info', duration = 3000) {
const alert = Object.assign(document.createElement('sl-alert'), { const alert = Object.assign(document.createElement('wa-alert'), {
variant, variant,
closable: true, closable: true,
duration: duration, duration: duration,
innerHTML: ` innerHTML: `
<sl-icon name="${icon}" slot="icon"></sl-icon> <wa-icon name="${icon}" variant="regular" slot="icon"></wa-icon>
${escapeHtml(message)} ${escapeHtml(message)}
` `
}); });
@@ -422,10 +429,10 @@ For convenience, you can create a utility that emits toast notifications with a
The toast stack is a fixed position singleton element created and managed internally by the alert component. It will be added and removed from the DOM as needed when toasts are shown. When more than one toast is visible, they will stack vertically in the toast stack. The toast stack is a fixed position singleton element created and managed internally by the alert component. It will be added and removed from the DOM as needed when toasts are shown. When more than one toast is visible, they will stack vertically in the toast stack.
By default, the toast stack is positioned at the top-right of the viewport. You can change its position by targeting `.sl-toast-stack` in your stylesheet. To make toasts appear at the top-left of the viewport, for example, use the following styles. By default, the toast stack is positioned at the top-right of the viewport. You can change its position by targeting `.wa-toast-stack` in your stylesheet. To make toasts appear at the top-left of the viewport, for example, use the following styles.
```css ```css
.sl-toast-stack { .wa-toast-stack {
left: 0; left: 0;
right: auto; right: auto;
} }

View File

@@ -6,17 +6,17 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-animated-image <wa-animated-image
src="https://shoelace.style/assets/images/walk.gif" src="https://shoelace.style/assets/images/walk.gif"
alt="Animation of untied shoes walking on pavement" alt="Animation of untied shoes walking on pavement"
></sl-animated-image> ></wa-animated-image>
``` ```
```jsx:react ```jsx:react
import { SlAnimatedImage } from '@shoelace-style/shoelace/dist/react'; import WaAnimatedImage from '@shoelace-style/shoelace/dist/react/animated-image';
const App = () => ( const App = () => (
<SlAnimatedImage <WaAnimatedImage
src="https://shoelace.style/assets/images/walk.gif" src="https://shoelace.style/assets/images/walk.gif"
alt="Animation of untied shoes walking on pavement" alt="Animation of untied shoes walking on pavement"
/> />
@@ -34,17 +34,17 @@ This component uses `<canvas>` to draw freeze frames, so images are subject to [
Both GIF and WEBP images are supported. Both GIF and WEBP images are supported.
```html:preview ```html:preview
<sl-animated-image <wa-animated-image
src="https://shoelace.style/assets/images/tie.webp" src="https://shoelace.style/assets/images/tie.webp"
alt="Animation of a shoe being tied" alt="Animation of a shoe being tied"
></sl-animated-image> ></wa-animated-image>
``` ```
```jsx:react ```jsx:react
import { SlAnimatedImage } from '@shoelace-style/shoelace/dist/react'; import WaAnimatedImage from '@shoelace-style/shoelace/dist/react/animated-image';
const App = () => ( const App = () => (
<SlAnimatedImage src="https://shoelace.style/assets/images/tie.webp" alt="Animation of a shoe being tied" /> <WaAnimatedImage src="https://shoelace.style/assets/images/tie.webp" alt="Animation of a shoe being tied" />
); );
``` ```
@@ -53,21 +53,21 @@ const App = () => (
To set a custom size, apply a width and/or height to the host element. To set a custom size, apply a width and/or height to the host element.
```html:preview ```html:preview
<sl-animated-image <wa-animated-image
src="https://shoelace.style/assets/images/walk.gif" src="https://shoelace.style/assets/images/walk.gif"
alt="Animation of untied shoes walking on pavement" alt="Animation of untied shoes walking on pavement"
style="width: 150px; height: 200px;" style="width: 150px; height: 200px;"
> >
</sl-animated-image> </wa-animated-image>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlAnimatedImage } from '@shoelace-style/shoelace/dist/react'; import WaAnimatedImage from '@shoelace-style/shoelace/dist/react/animated-image';
const App = () => ( const App = () => (
<SlAnimatedImage <WaAnimatedImage
src="https://shoelace.style/assets/images/walk.gif" src="https://shoelace.style/assets/images/walk.gif"
alt="Animation of untied shoes walking on pavement" alt="Animation of untied shoes walking on pavement"
style={{ width: '150px', height: '200px' }} style={{ width: '150px', height: '200px' }}
@@ -82,11 +82,11 @@ const App = () => (
You can change the appearance and location of the control box by targeting the `control-box` part in your styles. You can change the appearance and location of the control box by targeting the `control-box` part in your styles.
```html:preview ```html:preview
<sl-animated-image <wa-animated-image
src="https://shoelace.style/assets/images/walk.gif" src="https://shoelace.style/assets/images/walk.gif"
alt="Animation of untied shoes walking on pavement" alt="Animation of untied shoes walking on pavement"
class="animated-image-custom-control-box" class="animated-image-custom-control-box"
></sl-animated-image> ></wa-animated-image>
<style> <style>
.animated-image-custom-control-box::part(control-box) { .animated-image-custom-control-box::part(control-box) {
@@ -102,7 +102,7 @@ You can change the appearance and location of the control box by targeting the `
``` ```
```jsx:react ```jsx:react
import { SlAnimatedImage } from '@shoelace-style/shoelace/dist/react'; import WaAnimatedImage from '@shoelace-style/shoelace/dist/react/animated-image';
const css = ` const css = `
.animated-image-custom-control-box::part(control-box) { .animated-image-custom-control-box::part(control-box) {
@@ -118,7 +118,7 @@ const css = `
const App = () => ( const App = () => (
<> <>
<SlAnimatedImage <WaAnimatedImage
className="animated-image-custom-control-box" className="animated-image-custom-control-box"
src="https://shoelace.style/assets/images/walk.gif" src="https://shoelace.style/assets/images/walk.gif"
alt="Animation of untied shoes walking on pavement" alt="Animation of untied shoes walking on pavement"

View File

@@ -5,14 +5,14 @@ meta:
layout: component layout: component
--- ---
To animate an element, wrap it in `<sl-animation>` and set an animation `name`. The animation will not start until you add the `play` attribute. Refer to the [properties table](#properties) for a list of all animation options. To animate an element, wrap it in `<wa-animation>` and set an animation `name`. The animation will not start until you add the `play` attribute. Refer to the [properties table](#properties) for a list of all animation options.
```html:preview ```html:preview
<div class="animation-overview"> <div class="animation-overview">
<sl-animation name="bounce" duration="2000" play><div class="box"></div></sl-animation> <wa-animation name="bounce" duration="2000" play><div class="box"></div></wa-animation>
<sl-animation name="jello" duration="2000" play><div class="box"></div></sl-animation> <wa-animation name="jello" duration="2000" play><div class="box"></div></wa-animation>
<sl-animation name="heartBeat" duration="2000" play><div class="box"></div></sl-animation> <wa-animation name="heartBeat" duration="2000" play><div class="box"></div></wa-animation>
<sl-animation name="flip" duration="2000" play><div class="box"></div></sl-animation> <wa-animation name="flip" duration="2000" play><div class="box"></div></wa-animation>
</div> </div>
<style> <style>
@@ -20,21 +20,21 @@ To animate an element, wrap it in `<sl-animation>` and set an animation `name`.
display: inline-block; display: inline-block;
width: 100px; width: 100px;
height: 100px; height: 100px;
background-color: var(--sl-color-primary-600); background-color: var(--wa-color-brand-spot);
margin: 1.5rem; margin: 1.5rem;
} }
</style> </style>
``` ```
```jsx:react ```jsx:react
import { SlAnimation } from '@shoelace-style/shoelace/dist/react'; import WaAnimation from '@shoelace-style/shoelace/dist/react/animation';
const css = ` const css = `
.animation-overview .box { .animation-overview .box {
display: inline-block; display: inline-block;
width: 100px; width: 100px;
height: 100px; height: 100px;
background-color: var(--sl-color-primary-600); background-color: var(--wa-color-brand-spot);
margin: 1.5rem; margin: 1.5rem;
} }
`; `;
@@ -42,18 +42,18 @@ const css = `
const App = () => ( const App = () => (
<> <>
<div class="animation-overview"> <div class="animation-overview">
<SlAnimation name="bounce" duration={2000} play> <WaAnimation name="bounce" duration={2000} play>
<div class="box" /> <div class="box" />
</SlAnimation> </WaAnimation>
<SlAnimation name="jello" duration={2000} play> <WaAnimation name="jello" duration={2000} play>
<div class="box" /> <div class="box" />
</SlAnimation> </WaAnimation>
<SlAnimation name="heartBeat" duration={2000} play> <WaAnimation name="heartBeat" duration={2000} play>
<div class="box" /> <div class="box" />
</SlAnimation> </WaAnimation>
<SlAnimation name="flip" duration={2000} play> <WaAnimation name="flip" duration={2000} play>
<div class="box" /> <div class="box" />
</SlAnimation> </WaAnimation>
</div> </div>
<style>{css}</style> <style>{css}</style>
@@ -62,7 +62,7 @@ const App = () => (
``` ```
:::tip :::tip
The animation will only be applied to the first child element found in `<sl-animation>`. The animation will only be applied to the first child element found in `<wa-animation>`.
::: :::
## Examples ## Examples
@@ -73,14 +73,14 @@ This example demonstrates all of the baked-in animations and easings. Animations
```html:preview ```html:preview
<div class="animation-sandbox"> <div class="animation-sandbox">
<sl-animation name="bounce" easing="ease-in-out" duration="2000" play> <wa-animation name="bounce" easing="ease-in-out" duration="2000" play>
<div class="box"></div> <div class="box"></div>
</sl-animation> </wa-animation>
<div class="controls"> <div class="controls">
<sl-select label="Animation" value="bounce"></sl-select> <wa-select label="Animation" value="bounce"></wa-select>
<sl-select label="Easing" value="linear"></sl-select> <wa-select label="Easing" value="linear"></wa-select>
<sl-input label="Playback Rate" type="number" min="0" max="2" step=".25" value="1"></sl-input> <wa-input label="Playback Rate" type="number" min="0" max="2" step=".25" value="1"></wa-input>
</div> </div>
</div> </div>
@@ -88,15 +88,15 @@ This example demonstrates all of the baked-in animations and easings. Animations
import { getAnimationNames, getEasingNames } from '/dist/utilities/animation.js'; import { getAnimationNames, getEasingNames } from '/dist/utilities/animation.js';
const container = document.querySelector('.animation-sandbox'); const container = document.querySelector('.animation-sandbox');
const animation = container.querySelector('sl-animation'); const animation = container.querySelector('wa-animation');
const animationName = container.querySelector('.controls sl-select:nth-child(1)'); const animationName = container.querySelector('.controls wa-select:nth-child(1)');
const easingName = container.querySelector('.controls sl-select:nth-child(2)'); const easingName = container.querySelector('.controls wa-select:nth-child(2)');
const playbackRate = container.querySelector('sl-input[type="number"]'); const playbackRate = container.querySelector('wa-input[type="number"]');
const animations = getAnimationNames(); const animations = getAnimationNames();
const easings = getEasingNames(); const easings = getEasingNames();
animations.map(name => { animations.map(name => {
const option = Object.assign(document.createElement('sl-option'), { const option = Object.assign(document.createElement('wa-option'), {
textContent: name, textContent: name,
value: name value: name
}); });
@@ -104,23 +104,23 @@ This example demonstrates all of the baked-in animations and easings. Animations
}); });
easings.map(name => { easings.map(name => {
const option = Object.assign(document.createElement('sl-option'), { const option = Object.assign(document.createElement('wa-option'), {
textContent: name, textContent: name,
value: name value: name
}); });
easingName.appendChild(option); easingName.appendChild(option);
}); });
animationName.addEventListener('sl-change', () => (animation.name = animationName.value)); animationName.addEventListener('wa-change', () => (animation.name = animationName.value));
easingName.addEventListener('sl-change', () => (animation.easing = easingName.value)); easingName.addEventListener('wa-change', () => (animation.easing = easingName.value));
playbackRate.addEventListener('sl-input', () => (animation.playbackRate = playbackRate.value)); playbackRate.addEventListener('wa-input', () => (animation.playbackRate = playbackRate.value));
</script> </script>
<style> <style>
.animation-sandbox .box { .animation-sandbox .box {
width: 100px; width: 100px;
height: 100px; height: 100px;
background-color: var(--sl-color-primary-600); background-color: var(--wa-color-brand-spot);
} }
.animation-sandbox .controls { .animation-sandbox .controls {
@@ -128,7 +128,7 @@ This example demonstrates all of the baked-in animations and easings. Animations
margin-top: 2rem; margin-top: 2rem;
} }
.animation-sandbox .controls sl-select { .animation-sandbox .controls wa-select {
margin-bottom: 1rem; margin-bottom: 1rem;
} }
</style> </style>
@@ -140,12 +140,12 @@ Use an [Intersection Observer](https://developer.mozilla.org/en-US/docs/Web/API/
```html:preview ```html:preview
<div class="animation-scroll"> <div class="animation-scroll">
<sl-animation name="jackInTheBox" duration="2000" iterations="1"><div class="box"></div></sl-animation> <wa-animation name="jackInTheBox" duration="2000" iterations="1"><div class="box"></div></wa-animation>
</div> </div>
<script> <script>
const container = document.querySelector('.animation-scroll'); const container = document.querySelector('.animation-scroll');
const animation = container.querySelector('sl-animation'); const animation = container.querySelector('wa-animation');
const box = animation.querySelector('.box'); const box = animation.querySelector('.box');
// Watch for the box to enter and exit the viewport. Note that we're observing the box, not the animation element! // Watch for the box to enter and exit the viewport. Note that we're observing the box, not the animation element!
@@ -166,14 +166,14 @@ Use an [Intersection Observer](https://developer.mozilla.org/en-US/docs/Web/API/
display: inline-block; display: inline-block;
width: 100px; width: 100px;
height: 100px; height: 100px;
background-color: var(--sl-color-primary-600); background-color: var(--wa-color-brand-spot);
} }
</style> </style>
``` ```
```jsx:react ```jsx:react
import { useEffect, useRef, useState } from 'react'; import { useEffect, useRef, useState } from 'react';
import { SlAnimation } from '@shoelace-style/shoelace/dist/react'; import WaAnimation from '@shoelace-style/shoelace/dist/react/animation';
const css = ` const css = `
.animation-scroll { .animation-scroll {
@@ -184,7 +184,7 @@ const css = `
display: inline-block; display: inline-block;
width: 100px; width: 100px;
height: 100px; height: 100px;
background-color: var(--sl-color-primary-600); background-color: var(--wa-color-brand-spot);
} }
`; `;
@@ -210,9 +210,9 @@ const App = () => {
return ( return (
<> <>
<div class="animation-scroll"> <div class="animation-scroll">
<SlAnimation ref={animation} name="jackInTheBox" duration={2000} iterations={1}> <WaAnimation ref={animation} name="jackInTheBox" duration={2000} iterations={1}>
<div ref={box} class="box" /> <div ref={box} class="box" />
</SlAnimation> </WaAnimation>
</div> </div>
<style>{css}</style> <style>{css}</style>
@@ -227,13 +227,13 @@ Supply your own [keyframe formats](https://developer.mozilla.org/en-US/docs/Web/
```html:preview ```html:preview
<div class="animation-keyframes"> <div class="animation-keyframes">
<sl-animation easing="ease-in-out" duration="2000" play> <wa-animation easing="ease-in-out" duration="2000" play>
<div class="box"></div> <div class="box"></div>
</sl-animation> </wa-animation>
</div> </div>
<script> <script>
const animation = document.querySelector('.animation-keyframes sl-animation'); const animation = document.querySelector('.animation-keyframes wa-animation');
animation.keyframes = [ animation.keyframes = [
{ {
offset: 0, offset: 0,
@@ -256,26 +256,26 @@ Supply your own [keyframe formats](https://developer.mozilla.org/en-US/docs/Web/
.animation-keyframes .box { .animation-keyframes .box {
width: 100px; width: 100px;
height: 100px; height: 100px;
background-color: var(--sl-color-primary-600); background-color: var(--wa-color-brand-spot);
} }
</style> </style>
``` ```
```jsx:react ```jsx:react
import { SlAnimation } from '@shoelace-style/shoelace/dist/react'; import WaAnimation from '@shoelace-style/shoelace/dist/react/animation';
const css = ` const css = `
.animation-keyframes .box { .animation-keyframes .box {
width: 100px; width: 100px;
height: 100px; height: 100px;
background-color: var(--sl-color-primary-600); background-color: var(--wa-color-brand-spot);
} }
`; `;
const App = () => ( const App = () => (
<> <>
<div class="animation-keyframes"> <div class="animation-keyframes">
<SlAnimation <WaAnimation
easing="ease-in-out" easing="ease-in-out"
duration={2000} duration={2000}
play play
@@ -297,7 +297,7 @@ const App = () => (
]} ]}
> >
<div class="box" /> <div class="box" />
</SlAnimation> </WaAnimation>
</div> </div>
<style>{css}</style> <style>{css}</style>
@@ -311,15 +311,15 @@ Animations won't play until you apply the `play` attribute. You can omit it init
```html:preview ```html:preview
<div class="animation-form"> <div class="animation-form">
<sl-animation name="rubberBand" duration="1000" iterations="1"> <wa-animation name="rubberBand" duration="1000" iterations="1">
<sl-button variant="primary">Click me</sl-button> <wa-button variant="brand">Click me</wa-button>
</sl-animation> </wa-animation>
</div> </div>
<script> <script>
const container = document.querySelector('.animation-form'); const container = document.querySelector('.animation-form');
const animation = container.querySelector('sl-animation'); const animation = container.querySelector('wa-animation');
const button = container.querySelector('sl-button'); const button = container.querySelector('wa-button');
button.addEventListener('click', () => { button.addEventListener('click', () => {
animation.play = true; animation.play = true;
@@ -329,18 +329,19 @@ Animations won't play until you apply the `play` attribute. You can omit it init
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlAnimation, SlButton } from '@shoelace-style/shoelace/dist/react'; import WaAnimation from '@shoelace-style/shoelace/dist/react/animation';
import WaButton from '@shoelace-style/shoelace/dist/react/button';
const App = () => { const App = () => {
const [play, setPlay] = useState(false); const [play, setPlay] = useState(false);
return ( return (
<div class="animation-form"> <div class="animation-form">
<SlAnimation name="rubberBand" duration={1000} iterations={1} play={play} onSlFinish={() => setPlay(false)}> <WaAnimation name="rubberBand" duration={1000} iterations={1} play={play} onWaFinish={() => setPlay(false)}>
<SlButton variant="primary" onClick={() => setPlay(true)}> <WaButton variant="brand" onClick={() => setPlay(true)}>
Click me Click me
</SlButton> </WaButton>
</SlAnimation> </WaAnimation>
</div> </div>
); );
}; };

View File

@@ -8,13 +8,13 @@ layout: component
By default, a generic icon will be shown. You can personalize avatars by adding custom icons, initials, and images. You should always provide a `label` for assistive devices. By default, a generic icon will be shown. You can personalize avatars by adding custom icons, initials, and images. You should always provide a `label` for assistive devices.
```html:preview ```html:preview
<sl-avatar label="User avatar"></sl-avatar> <wa-avatar label="User avatar"></wa-avatar>
``` ```
```jsx:react ```jsx:react
import { SlAvatar } from '@shoelace-style/shoelace/dist/react'; import WaAvatar from '@shoelace-style/shoelace/dist/react/avatar';
const App = () => <SlAvatar label="User avatar" />; const App = () => <WaAvatar label="User avatar" />;
``` ```
## Examples ## Examples
@@ -25,26 +25,26 @@ To use an image for the avatar, set the `image` and `label` attributes. This wil
Avatar images can be lazily loaded by setting the `loading` attribute to `lazy`. Avatar images can be lazily loaded by setting the `loading` attribute to `lazy`.
```html:preview ```html:preview
<sl-avatar <wa-avatar
image="https://images.unsplash.com/photo-1529778873920-4da4926a72c2?ixlib=rb-1.2.1&auto=format&fit=crop&w=300&q=80" image="https://images.unsplash.com/photo-1529778873920-4da4926a72c2?ixlib=rb-1.2.1&auto=format&fit=crop&w=300&q=80"
label="Avatar of a gray tabby kitten looking down" label="Avatar of a gray tabby kitten looking down"
></sl-avatar> ></wa-avatar>
<sl-avatar <wa-avatar
image="https://images.unsplash.com/photo-1591871937573-74dbba515c4c?ixlib=rb-1.2.1&auto=format&fit=crop&w=300&q=80" image="https://images.unsplash.com/photo-1591871937573-74dbba515c4c?ixlib=rb-1.2.1&auto=format&fit=crop&w=300&q=80"
label="Avatar of a white and grey kitten on grey textile" label="Avatar of a white and grey kitten on grey textile"
loading="lazy" loading="lazy"
></sl-avatar> ></wa-avatar>
``` ```
```jsx:react ```jsx:react
import { SlAvatar } from '@shoelace-style/shoelace/dist/react'; import WaAvatar from '@shoelace-style/shoelace/dist/react/avatar';
const App = () => ( const App = () => (
<SlAvatar <WaAvatar
image="https://images.unsplash.com/photo-1529778873920-4da4926a72c2?ixlib=rb-1.2.1&auto=format&fit=crop&w=300&q=80" image="https://images.unsplash.com/photo-1529778873920-4da4926a72c2?ixlib=rb-1.2.1&auto=format&fit=crop&w=300&q=80"
label="Avatar of a gray tabby kitten looking down" label="Avatar of a gray tabby kitten looking down"
/> />
<SlAvatar <WaAvatar
image="https://images.unsplash.com/photo-1591871937573-74dbba515c4c?ixlib=rb-1.2.1&auto=format&fit=crop&w=300&q=80" image="https://images.unsplash.com/photo-1591871937573-74dbba515c4c?ixlib=rb-1.2.1&auto=format&fit=crop&w=300&q=80"
label="Avatar of a white and grey kitten on grey textile" label="Avatar of a white and grey kitten on grey textile"
loading="lazy" loading="lazy"
@@ -57,13 +57,13 @@ const App = () => (
When you don't have an image to use, you can set the `initials` attribute to show something more personalized than an icon. When you don't have an image to use, you can set the `initials` attribute to show something more personalized than an icon.
```html:preview ```html:preview
<sl-avatar initials="SL" label="Avatar with initials: SL"></sl-avatar> <wa-avatar initials="WA" label="Avatar with initials: SL"></wa-avatar>
``` ```
```jsx:react ```jsx:react
import { SlAvatar } from '@shoelace-style/shoelace/dist/react'; import WaAvatar from '@shoelace-style/shoelace/dist/react/avatar';
const App = () => <SlAvatar initials="SL" label="Avatar with initials: SL" />; const App = () => <WaAvatar initials="WA" label="Avatar with initials: SL" />;
``` ```
### Custom Icons ### Custom Icons
@@ -71,35 +71,36 @@ const App = () => <SlAvatar initials="SL" label="Avatar with initials: SL" />;
When no image or initials are set, an icon will be shown. The default avatar shows a generic "user" icon, but you can customize this with the `icon` slot. When no image or initials are set, an icon will be shown. The default avatar shows a generic "user" icon, but you can customize this with the `icon` slot.
```html:preview ```html:preview
<sl-avatar label="Avatar with an image icon"> <wa-avatar label="Avatar with an image icon">
<sl-icon slot="icon" name="image"></sl-icon> <wa-icon slot="icon" name="image" variant="solid"></wa-icon>
</sl-avatar> </wa-avatar>
<sl-avatar label="Avatar with an archive icon"> <wa-avatar label="Avatar with an archive icon">
<sl-icon slot="icon" name="archive"></sl-icon> <wa-icon slot="icon" name="archive" variant="solid"></wa-icon>
</sl-avatar> </wa-avatar>
<sl-avatar label="Avatar with a briefcase icon"> <wa-avatar label="Avatar with a briefcase icon">
<sl-icon slot="icon" name="briefcase"></sl-icon> <wa-icon slot="icon" name="briefcase" variant="solid"></wa-icon>
</sl-avatar> </wa-avatar>
``` ```
```jsx:react ```jsx:react
import { SlAvatar, SlIcon } from '@shoelace-style/shoelace/dist/react'; import WaAvatar from '@shoelace-style/shoelace/dist/react/avatar';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
const App = () => ( const App = () => (
<> <>
<SlAvatar label="Avatar with an image icon"> <WaAvatar label="Avatar with an image icon">
<SlIcon slot="icon" name="image" /> <WaIcon slot="icon" name="image" />
</SlAvatar> </WaAvatar>
<SlAvatar label="Avatar with an archive icon"> <WaAvatar label="Avatar with an archive icon">
<SlIcon slot="icon" name="archive" /> <WaIcon slot="icon" name="archive" />
</SlAvatar> </WaAvatar>
<SlAvatar label="Avatar with a briefcase icon"> <WaAvatar label="Avatar with a briefcase icon">
<SlIcon slot="icon" name="briefcase" /> <WaIcon slot="icon" name="briefcase" />
</SlAvatar> </WaAvatar>
</> </>
); );
``` ```
@@ -109,19 +110,20 @@ const App = () => (
Avatars can be shaped using the `shape` attribute. Avatars can be shaped using the `shape` attribute.
```html:preview ```html:preview
<sl-avatar shape="square" label="Square avatar"></sl-avatar> <wa-avatar shape="square" label="Square avatar"></wa-avatar>
<sl-avatar shape="rounded" label="Rounded avatar"></sl-avatar> <wa-avatar shape="rounded" label="Rounded avatar"></wa-avatar>
<sl-avatar shape="circle" label="Circle avatar"></sl-avatar> <wa-avatar shape="circle" label="Circle avatar"></wa-avatar>
``` ```
```jsx:react ```jsx:react
import { SlAvatar, SlIcon } from '@shoelace-style/shoelace/dist/react'; import WaAvatar from '@shoelace-style/shoelace/dist/react/avatar';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
const App = () => ( const App = () => (
<> <>
<SlAvatar shape="square" label="Square avatar" /> <WaAvatar shape="square" label="Square avatar" />
<SlAvatar shape="rounded" label="Rounded avatar" /> <WaAvatar shape="rounded" label="Rounded avatar" />
<SlAvatar shape="circle" label="Circle avatar" /> <WaAvatar shape="circle" label="Circle avatar" />
</> </>
); );
``` ```
@@ -132,70 +134,71 @@ You can group avatars with a few lines of CSS.
```html:preview ```html:preview
<div class="avatar-group"> <div class="avatar-group">
<sl-avatar <wa-avatar
image="https://images.unsplash.com/photo-1490150028299-bf57d78394e0?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=256&h=256&q=80&crop=right" image="https://images.unsplash.com/photo-1490150028299-bf57d78394e0?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=256&h=256&q=80&crop=right"
label="Avatar 1 of 4" label="Avatar 1 of 4"
></sl-avatar> ></wa-avatar>
<sl-avatar <wa-avatar
image="https://images.unsplash.com/photo-1503454537195-1dcabb73ffb9?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=256&h=256&crop=left&q=80" image="https://images.unsplash.com/photo-1503454537195-1dcabb73ffb9?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=256&h=256&crop=left&q=80"
label="Avatar 2 of 4" label="Avatar 2 of 4"
></sl-avatar> ></wa-avatar>
<sl-avatar <wa-avatar
image="https://images.unsplash.com/photo-1456439663599-95b042d50252?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=256&h=256&crop=left&q=80" image="https://images.unsplash.com/photo-1456439663599-95b042d50252?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=256&h=256&crop=left&q=80"
label="Avatar 3 of 4" label="Avatar 3 of 4"
></sl-avatar> ></wa-avatar>
<sl-avatar <wa-avatar
image="https://images.unsplash.com/flagged/photo-1554078875-e37cb8b0e27d?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=256&h=256&crop=top&q=80" image="https://images.unsplash.com/flagged/photo-1554078875-e37cb8b0e27d?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=256&h=256&crop=top&q=80"
label="Avatar 4 of 4" label="Avatar 4 of 4"
></sl-avatar> ></wa-avatar>
</div> </div>
<style> <style>
.avatar-group sl-avatar:not(:first-of-type) { .avatar-group wa-avatar:not(:first-of-type) {
margin-left: -1rem; margin-left: calc(-1 * var(--wa-space-m));
} }
.avatar-group sl-avatar::part(base) { .avatar-group wa-avatar::part(base) {
border: solid 2px var(--sl-color-neutral-0); border: solid 2px var(--wa-color-surface-default);
} }
</style> </style>
``` ```
```jsx:react ```jsx:react
import { SlAvatar, SlIcon } from '@shoelace-style/shoelace/dist/react'; import WaAvatar from '@shoelace-style/shoelace/dist/react/avatar';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
const css = ` const css = `
.avatar-group sl-avatar:not(:first-of-type) { .avatar-group wa-avatar:not(:first-of-type) {
margin-left: -1rem; margin-left: calc(-1 * var(--wa-space-m));
} }
.avatar-group sl-avatar::part(base) { .avatar-group wa-avatar::part(base) {
border: solid 2px var(--sl-color-neutral-0); border: solid 2px var(--wa-color-surface-default);
} }
`; `;
const App = () => ( const App = () => (
<> <>
<div className="avatar-group"> <div className="avatar-group">
<SlAvatar <WaAvatar
image="https://images.unsplash.com/photo-1490150028299-bf57d78394e0?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=256&h=256&q=80&crop=right" image="https://images.unsplash.com/photo-1490150028299-bf57d78394e0?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=256&h=256&q=80&crop=right"
label="Avatar 1 of 4" label="Avatar 1 of 4"
/> />
<SlAvatar <WaAvatar
image="https://images.unsplash.com/photo-1503454537195-1dcabb73ffb9?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=256&h=256&crop=left&q=80" image="https://images.unsplash.com/photo-1503454537195-1dcabb73ffb9?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=256&h=256&crop=left&q=80"
label="Avatar 2 of 4" label="Avatar 2 of 4"
/> />
<SlAvatar <WaAvatar
image="https://images.unsplash.com/photo-1456439663599-95b042d50252?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=256&h=256&crop=left&q=80" image="https://images.unsplash.com/photo-1456439663599-95b042d50252?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=256&h=256&crop=left&q=80"
label="Avatar 3 of 4" label="Avatar 3 of 4"
/> />
<SlAvatar <WaAvatar
image="https://images.unsplash.com/flagged/photo-1554078875-e37cb8b0e27d?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=256&h=256&crop=top&q=80" image="https://images.unsplash.com/flagged/photo-1554078875-e37cb8b0e27d?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=256&h=256&crop=top&q=80"
label="Avatar 4 of 4" label="Avatar 4 of 4"
/> />

View File

@@ -6,13 +6,13 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-badge>Badge</sl-badge> <wa-badge>Badge</wa-badge>
``` ```
```jsx:react ```jsx:react
import { SlBadge } from '@shoelace-style/shoelace/dist/react'; import WaBadge from '@shoelace-style/shoelace/dist/react/badge';
const App = () => <SlBadge>Badge</SlBadge>; const App = () => <WaBadge>Badge</WaBadge>;
``` ```
## Examples ## Examples
@@ -22,23 +22,23 @@ const App = () => <SlBadge>Badge</SlBadge>;
Set the `variant` attribute to change the badge's variant. Set the `variant` attribute to change the badge's variant.
```html:preview ```html:preview
<sl-badge variant="primary">Primary</sl-badge> <wa-badge variant="brand">Brand</wa-badge>
<sl-badge variant="success">Success</sl-badge> <wa-badge variant="success">Success</wa-badge>
<sl-badge variant="neutral">Neutral</sl-badge> <wa-badge variant="neutral">Neutral</wa-badge>
<sl-badge variant="warning">Warning</sl-badge> <wa-badge variant="warning">Warning</wa-badge>
<sl-badge variant="danger">Danger</sl-badge> <wa-badge variant="danger">Danger</wa-badge>
``` ```
```jsx:react ```jsx:react
import { SlBadge } from '@shoelace-style/shoelace/dist/react'; import WaBadge from '@shoelace-style/shoelace/dist/react/badge';
const App = () => ( const App = () => (
<> <>
<SlBadge variant="primary">Primary</SlBadge> <WaBadge variant="brand">Brand</WaBadge>
<SlBadge variant="success">Success</SlBadge> <WaBadge variant="success">Success</WaBadge>
<SlBadge variant="neutral">Neutral</SlBadge> <WaBadge variant="neutral">Neutral</WaBadge>
<SlBadge variant="warning">Warning</SlBadge> <WaBadge variant="warning">Warning</WaBadge>
<SlBadge variant="danger">Danger</SlBadge> <WaBadge variant="danger">Danger</WaBadge>
</> </>
); );
``` ```
@@ -48,33 +48,33 @@ const App = () => (
Use the `pill` attribute to give badges rounded edges. Use the `pill` attribute to give badges rounded edges.
```html:preview ```html:preview
<sl-badge variant="primary" pill>Primary</sl-badge> <wa-badge variant="brand" pill>Brand</wa-badge>
<sl-badge variant="success" pill>Success</sl-badge> <wa-badge variant="success" pill>Success</wa-badge>
<sl-badge variant="neutral" pill>Neutral</sl-badge> <wa-badge variant="neutral" pill>Neutral</wa-badge>
<sl-badge variant="warning" pill>Warning</sl-badge> <wa-badge variant="warning" pill>Warning</wa-badge>
<sl-badge variant="danger" pill>Danger</sl-badge> <wa-badge variant="danger" pill>Danger</wa-badge>
``` ```
```jsx:react ```jsx:react
import { SlBadge } from '@shoelace-style/shoelace/dist/react'; import WaBadge from '@shoelace-style/shoelace/dist/react/badge';
const App = () => ( const App = () => (
<> <>
<SlBadge variant="primary" pill> <WaBadge variant="brand" pill>
Primary Brand
</SlBadge> </WaBadge>
<SlBadge variant="success" pill> <WaBadge variant="success" pill>
Success Success
</SlBadge> </WaBadge>
<SlBadge variant="neutral" pill> <WaBadge variant="neutral" pill>
Neutral Neutral
</SlBadge> </WaBadge>
<SlBadge variant="warning" pill> <WaBadge variant="warning" pill>
Warning Warning
</SlBadge> </WaBadge>
<SlBadge variant="danger" pill> <WaBadge variant="danger" pill>
Danger Danger
</SlBadge> </WaBadge>
</> </>
); );
``` ```
@@ -85,25 +85,25 @@ Use the `pulse` attribute to draw attention to the badge with a subtle animation
```html:preview ```html:preview
<div class="badge-pulse"> <div class="badge-pulse">
<sl-badge variant="primary" pill pulse>1</sl-badge> <wa-badge variant="brand" pill pulse>1</wa-badge>
<sl-badge variant="success" pill pulse>1</sl-badge> <wa-badge variant="success" pill pulse>1</wa-badge>
<sl-badge variant="neutral" pill pulse>1</sl-badge> <wa-badge variant="neutral" pill pulse>1</wa-badge>
<sl-badge variant="warning" pill pulse>1</sl-badge> <wa-badge variant="warning" pill pulse>1</wa-badge>
<sl-badge variant="danger" pill pulse>1</sl-badge> <wa-badge variant="danger" pill pulse>1</wa-badge>
</div> </div>
<style> <style>
.badge-pulse sl-badge:not(:last-of-type) { .badge-pulse wa-badge:not(:last-of-type) {
margin-right: 1rem; margin-right: 1rem;
} }
</style> </style>
``` ```
```jsx:react ```jsx:react
import { SlBadge } from '@shoelace-style/shoelace/dist/react'; import WaBadge from '@shoelace-style/shoelace/dist/react/badge';
const css = ` const css = `
.badge-pulse sl-badge:not(:last-of-type) { .badge-pulse wa-badge:not(:last-of-type) {
margin-right: 1rem; margin-right: 1rem;
} }
`; `;
@@ -111,21 +111,21 @@ const css = `
const App = () => ( const App = () => (
<> <>
<div className="badge-pulse"> <div className="badge-pulse">
<SlBadge variant="primary" pill pulse> <WaBadge variant="brand" pill pulse>
1 1
</SlBadge> </WaBadge>
<SlBadge variant="success" pill pulse> <WaBadge variant="success" pill pulse>
1 1
</SlBadge> </WaBadge>
<SlBadge variant="neutral" pill pulse> <WaBadge variant="neutral" pill pulse>
1 1
</SlBadge> </WaBadge>
<SlBadge variant="warning" pill pulse> <WaBadge variant="warning" pill pulse>
1 1
</SlBadge> </WaBadge>
<SlBadge variant="danger" pill pulse> <WaBadge variant="danger" pill pulse>
1 1
</SlBadge> </WaBadge>
</div> </div>
<style>{css}</style> <style>{css}</style>
@@ -138,47 +138,48 @@ const App = () => (
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. 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:preview ```html:preview
<sl-button> <wa-button>
Requests Requests
<sl-badge pill>30</sl-badge> <wa-badge pill>30</wa-badge>
</sl-button> </wa-button>
<sl-button style="margin-inline-start: 1rem;"> <wa-button style="margin-inline-start: 1rem;">
Warnings Warnings
<sl-badge variant="warning" pill>8</sl-badge> <wa-badge variant="warning" pill>8</wa-badge>
</sl-button> </wa-button>
<sl-button style="margin-inline-start: 1rem;"> <wa-button style="margin-inline-start: 1rem;">
Errors Errors
<sl-badge variant="danger" pill>6</sl-badge> <wa-badge variant="danger" pill>6</wa-badge>
</sl-button> </wa-button>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlBadge, SlButton } from '@shoelace-style/shoelace/dist/react'; import WaBadge from '@shoelace-style/shoelace/dist/react/badge';
import WaButton from '@shoelace-style/shoelace/dist/react/button';
const App = () => ( const App = () => (
<> <>
<SlButton> <WaButton>
Requests Requests
<SlBadge pill>30</SlBadge> <WaBadge pill>30</WaBadge>
</SlButton> </WaButton>
<SlButton style={{ marginInlineStart: '1rem' }}> <WaButton style={{ marginInlineStart: '1rem' }}>
Warnings Warnings
<SlBadge variant="warning" pill> <WaBadge variant="warning" pill>
8 8
</SlBadge> </WaBadge>
</SlButton> </WaButton>
<SlButton style={{ marginInlineStart: '1rem' }}> <WaButton style={{ marginInlineStart: '1rem' }}>
Errors Errors
<SlBadge variant="danger" pill> <WaBadge variant="danger" pill>
6 6
</SlBadge> </WaBadge>
</SlButton> </WaButton>
</> </>
); );
``` ```
@@ -190,40 +191,40 @@ const App = () => (
When including badges in menu items, use the `suffix` slot to make sure they're aligned correctly. When including badges in menu items, use the `suffix` slot to make sure they're aligned correctly.
```html:preview ```html:preview
<sl-menu style="max-width: 240px;"> <wa-menu style="max-width: 240px;">
<sl-menu-label>Messages</sl-menu-label> <wa-menu-label>Messages</wa-menu-label>
<sl-menu-item>Comments <sl-badge slot="suffix" variant="neutral" pill>4</sl-badge></sl-menu-item> <wa-menu-item>Comments <wa-badge slot="suffix" variant="neutral" pill>4</wa-badge></wa-menu-item>
<sl-menu-item>Replies <sl-badge slot="suffix" variant="neutral" pill>12</sl-badge></sl-menu-item> <wa-menu-item>Replies <wa-badge slot="suffix" variant="neutral" pill>12</wa-badge></wa-menu-item>
</sl-menu> </wa-menu>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlBadge, SlButton, SlMenu, SlMenuItem, SlMenuLabel } from '@shoelace-style/shoelace/dist/react'; import WaBadge from '@shoelace-style/shoelace/dist/react/badge';
import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
import WaMenuLabel from '@shoelace-style/shoelace/dist/react/menu-label';
const App = () => ( const App = () => (
<SlMenu <WaMenu
style={{ style={{ maxWidth: '240px' }}
maxWidth: '240px',
border: 'solid 1px var(--sl-panel-border-color)',
borderRadius: 'var(--sl-border-radius-medium)'
}}
> >
<SlMenuLabel>Messages</SlMenuLabel> <WaMenuLabel>Messages</WaMenuLabel>
<SlMenuItem> <WaMenuItem>
Comments Comments
<SlBadge slot="suffix" variant="neutral" pill> <WaBadge slot="suffix" variant="neutral" pill>
4 4
</SlBadge> </WaBadge>
</SlMenuItem> </WaMenuItem>
<SlMenuItem> <WaMenuItem>
Replies Replies
<SlBadge slot="suffix" variant="neutral" pill> <WaBadge slot="suffix" variant="neutral" pill>
12 12
</SlBadge> </WaBadge>
</SlMenuItem> </WaMenuItem>
</SlMenu> </WaMenu>
); );
``` ```

View File

@@ -6,28 +6,30 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-breadcrumb> <wa-breadcrumb>
<sl-breadcrumb-item> <wa-breadcrumb-item>
<sl-icon slot="prefix" name="house"></sl-icon> <wa-icon slot="prefix" name="house" variant="solid"></wa-icon>
Home Home
</sl-breadcrumb-item> </wa-breadcrumb-item>
<sl-breadcrumb-item>Clothing</sl-breadcrumb-item> <wa-breadcrumb-item>Clothing</wa-breadcrumb-item>
<sl-breadcrumb-item>Shirts</sl-breadcrumb-item> <wa-breadcrumb-item>Shirts</wa-breadcrumb-item>
</sl-breadcrumb> </wa-breadcrumb>
``` ```
```jsx:react ```jsx:react
import { SlBreadcrumb, SlBreadcrumbItem, SlIcon } from '@shoelace-style/shoelace/dist/react'; import WaBreadcrumb from '@shoelace-style/shoelace/dist/react/breadcrumb';
import WaBreadcrumbItem from '@shoelace-style/shoelace/dist/react/breadcrumb-item';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
const App = () => ( const App = () => (
<SlBreadcrumb> <WaBreadcrumb>
<SlBreadcrumbItem> <WaBreadcrumbItem>
<SlIcon slot="prefix" name="house"></SlIcon> <WaIcon slot="prefix" name="house"></WaIcon>
Home Home
</SlBreadcrumbItem> </WaBreadcrumbItem>
<SlBreadcrumbItem>Clothing</SlBreadcrumbItem> <WaBreadcrumbItem>Clothing</WaBreadcrumbItem>
<SlBreadcrumbItem>Shirts</SlBreadcrumbItem> <WaBreadcrumbItem>Shirts</WaBreadcrumbItem>
</SlBreadcrumb> </WaBreadcrumb>
); );
``` ```

View File

@@ -8,24 +8,25 @@ layout: component
Breadcrumbs are usually placed before a page's main content with the current page shown last to indicate the user's position in the navigation. Breadcrumbs are usually placed before a page's main content with the current page shown last to indicate the user's position in the navigation.
```html:preview ```html:preview
<sl-breadcrumb> <wa-breadcrumb>
<sl-breadcrumb-item>Catalog</sl-breadcrumb-item> <wa-breadcrumb-item>Catalog</wa-breadcrumb-item>
<sl-breadcrumb-item>Clothing</sl-breadcrumb-item> <wa-breadcrumb-item>Clothing</wa-breadcrumb-item>
<sl-breadcrumb-item>Women's</sl-breadcrumb-item> <wa-breadcrumb-item>Women's</wa-breadcrumb-item>
<sl-breadcrumb-item>Shirts &amp; Tops</sl-breadcrumb-item> <wa-breadcrumb-item>Shirts &amp; Tops</wa-breadcrumb-item>
</sl-breadcrumb> </wa-breadcrumb>
``` ```
```jsx:react ```jsx:react
import { SlBreadcrumb, SlBreadcrumbItem } from '@shoelace-style/shoelace/dist/react'; import WaBreadcrumb from '@shoelace-style/shoelace/dist/react/breadcrumb';
import WaBreadcrumbItem from '@shoelace-style/shoelace/dist/react/breadcrumb-item';
const App = () => ( const App = () => (
<SlBreadcrumb> <WaBreadcrumb>
<SlBreadcrumbItem>Catalog</SlBreadcrumbItem> <WaBreadcrumbItem>Catalog</WaBreadcrumbItem>
<SlBreadcrumbItem>Clothing</SlBreadcrumbItem> <WaBreadcrumbItem>Clothing</WaBreadcrumbItem>
<SlBreadcrumbItem>Women's</SlBreadcrumbItem> <WaBreadcrumbItem>Women's</WaBreadcrumbItem>
<SlBreadcrumbItem>Shirts &amp; Tops</SlBreadcrumbItem> <WaBreadcrumbItem>Shirts &amp; Tops</WaBreadcrumbItem>
</SlBreadcrumb> </WaBreadcrumb>
); );
``` ```
@@ -38,30 +39,31 @@ By default, breadcrumb items are rendered as buttons so you can use them to navi
For websites, you'll probably want to use links instead. You can make any breadcrumb item a link by applying an `href` attribute to it. Now, when the user activates it, they'll be taken to the corresponding page — no event listeners required. For websites, you'll probably want to use links instead. You can make any breadcrumb item a link by applying an `href` attribute to it. Now, when the user activates it, they'll be taken to the corresponding page — no event listeners required.
```html:preview ```html:preview
<sl-breadcrumb> <wa-breadcrumb>
<sl-breadcrumb-item href="https://example.com/home">Homepage</sl-breadcrumb-item> <wa-breadcrumb-item href="https://example.com/home">Homepage</wa-breadcrumb-item>
<sl-breadcrumb-item href="https://example.com/home/services">Our Services</sl-breadcrumb-item> <wa-breadcrumb-item href="https://example.com/home/services">Our Services</wa-breadcrumb-item>
<sl-breadcrumb-item href="https://example.com/home/services/digital">Digital Media</sl-breadcrumb-item> <wa-breadcrumb-item href="https://example.com/home/services/digital">Digital Media</wa-breadcrumb-item>
<sl-breadcrumb-item href="https://example.com/home/services/digital/web-design">Web Design</sl-breadcrumb-item> <wa-breadcrumb-item href="https://example.com/home/services/digital/web-design">Web Design</wa-breadcrumb-item>
</sl-breadcrumb> </wa-breadcrumb>
``` ```
```jsx:react ```jsx:react
import { SlBreadcrumb, SlBreadcrumbItem } from '@shoelace-style/shoelace/dist/react'; import WaBreadcrumb from '@shoelace-style/shoelace/dist/react/breadcrumb';
import WaBreadcrumbItem from '@shoelace-style/shoelace/dist/react/breadcrumb-item';
const App = () => ( const App = () => (
<SlBreadcrumb> <WaBreadcrumb>
<SlBreadcrumbItem href="https://example.com/home">Homepage</SlBreadcrumbItem> <WaBreadcrumbItem href="https://example.com/home">Homepage</WaBreadcrumbItem>
<SlBreadcrumbItem href="https://example.com/home/services">Our Services</SlBreadcrumbItem> <WaBreadcrumbItem href="https://example.com/home/services">Our Services</WaBreadcrumbItem>
<SlBreadcrumbItem href="https://example.com/home/services/digital">Digital Media</SlBreadcrumbItem> <WaBreadcrumbItem href="https://example.com/home/services/digital">Digital Media</WaBreadcrumbItem>
<SlBreadcrumbItem href="https://example.com/home/services/digital/web-design">Web Design</SlBreadcrumbItem> <WaBreadcrumbItem href="https://example.com/home/services/digital/web-design">Web Design</WaBreadcrumbItem>
</SlBreadcrumb> </WaBreadcrumb>
); );
``` ```
@@ -70,62 +72,63 @@ const App = () => (
Use the `separator` slot to change the separator that goes between breadcrumb items. Icons work well, but you can also use text or an image. Use the `separator` slot to change the separator that goes between breadcrumb items. Icons work well, but you can also use text or an image.
```html:preview ```html:preview
<sl-breadcrumb> <wa-breadcrumb>
<sl-icon name="dot" slot="separator"></sl-icon> <wa-icon slot="separator" name="angles-right" variant="solid"></wa-icon>
<sl-breadcrumb-item>First</sl-breadcrumb-item> <wa-breadcrumb-item>First</wa-breadcrumb-item>
<sl-breadcrumb-item>Second</sl-breadcrumb-item> <wa-breadcrumb-item>Second</wa-breadcrumb-item>
<sl-breadcrumb-item>Third</sl-breadcrumb-item> <wa-breadcrumb-item>Third</wa-breadcrumb-item>
</sl-breadcrumb> </wa-breadcrumb>
<br /> <br />
<sl-breadcrumb> <wa-breadcrumb>
<sl-icon name="arrow-right" slot="separator"></sl-icon> <wa-icon slot="separator" name="arrow-right" variant="solid"></wa-icon>
<sl-breadcrumb-item>First</sl-breadcrumb-item> <wa-breadcrumb-item>First</wa-breadcrumb-item>
<sl-breadcrumb-item>Second</sl-breadcrumb-item> <wa-breadcrumb-item>Second</wa-breadcrumb-item>
<sl-breadcrumb-item>Third</sl-breadcrumb-item> <wa-breadcrumb-item>Third</wa-breadcrumb-item>
</sl-breadcrumb> </wa-breadcrumb>
<br /> <br />
<sl-breadcrumb> <wa-breadcrumb>
<span slot="separator">/</span> <span slot="separator">/</span>
<sl-breadcrumb-item>First</sl-breadcrumb-item> <wa-breadcrumb-item>First</wa-breadcrumb-item>
<sl-breadcrumb-item>Second</sl-breadcrumb-item> <wa-breadcrumb-item>Second</wa-breadcrumb-item>
<sl-breadcrumb-item>Third</sl-breadcrumb-item> <wa-breadcrumb-item>Third</wa-breadcrumb-item>
</sl-breadcrumb> </wa-breadcrumb>
``` ```
```jsx:react ```jsx:react
import '@shoelace-style/shoelace/dist/components/icon/icon.js'; import '@shoelace-style/shoelace/dist/components/icon/icon.js';
import { SlBreadcrumb, SlBreadcrumbItem } from '@shoelace-style/shoelace/dist/react'; import WaBreadcrumb from '@shoelace-style/shoelace/dist/react/breadcrumb';
import WaBreadcrumbItem from '@shoelace-style/shoelace/dist/react/breadcrumb-item';
const App = () => ( const App = () => (
<> <>
<SlBreadcrumb> <WaBreadcrumb>
<sl-icon name="dot" slot="separator" /> <wa-icon slot="separator" name="angles-right" variant="solid" />
<SlBreadcrumbItem>First</SlBreadcrumbItem> <WaBreadcrumbItem>First</WaBreadcrumbItem>
<SlBreadcrumbItem>Second</SlBreadcrumbItem> <WaBreadcrumbItem>Second</WaBreadcrumbItem>
<SlBreadcrumbItem>Third</SlBreadcrumbItem> <WaBreadcrumbItem>Third</WaBreadcrumbItem>
</SlBreadcrumb> </WaBreadcrumb>
<br /> <br />
<SlBreadcrumb> <WaBreadcrumb>
<sl-icon name="arrow-right" slot="separator" /> <wa-icon slot="separator" name="arrow-right" variant="solid" />
<SlBreadcrumbItem>First</SlBreadcrumbItem> <WaBreadcrumbItem>First</WaBreadcrumbItem>
<SlBreadcrumbItem>Second</SlBreadcrumbItem> <WaBreadcrumbItem>Second</WaBreadcrumbItem>
<SlBreadcrumbItem>Third</SlBreadcrumbItem> <WaBreadcrumbItem>Third</WaBreadcrumbItem>
</SlBreadcrumb> </WaBreadcrumb>
<br /> <br />
<SlBreadcrumb> <WaBreadcrumb>
<span slot="separator">/</span> <span slot="separator">/</span>
<SlBreadcrumbItem>First</SlBreadcrumbItem> <WaBreadcrumbItem>First</WaBreadcrumbItem>
<SlBreadcrumbItem>Second</SlBreadcrumbItem> <WaBreadcrumbItem>Second</WaBreadcrumbItem>
<SlBreadcrumbItem>Third</SlBreadcrumbItem> <WaBreadcrumbItem>Third</WaBreadcrumbItem>
</SlBreadcrumb> </WaBreadcrumb>
</> </>
); );
``` ```
@@ -135,28 +138,30 @@ const App = () => (
Use the `prefix` slot to add content before any breadcrumb item. Use the `prefix` slot to add content before any breadcrumb item.
```html:preview ```html:preview
<sl-breadcrumb> <wa-breadcrumb>
<sl-breadcrumb-item> <wa-breadcrumb-item>
<sl-icon slot="prefix" name="house"></sl-icon> <wa-icon slot="prefix" name="house" variant="solid"></wa-icon>
Home Home
</sl-breadcrumb-item> </wa-breadcrumb-item>
<sl-breadcrumb-item>Articles</sl-breadcrumb-item> <wa-breadcrumb-item>Articles</wa-breadcrumb-item>
<sl-breadcrumb-item>Traveling</sl-breadcrumb-item> <wa-breadcrumb-item>Traveling</wa-breadcrumb-item>
</sl-breadcrumb> </wa-breadcrumb>
``` ```
```jsx:react ```jsx:react
import { SlBreadcrumb, SlBreadcrumbItem, SlIcon } from '@shoelace-style/shoelace/dist/react'; import WaBreadcrumb from '@shoelace-style/shoelace/dist/react/breadcrumb';
import WaBreadcrumbItem from '@shoelace-style/shoelace/dist/react/breadcrumb-item';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
const App = () => ( const App = () => (
<SlBreadcrumb> <WaBreadcrumb>
<SlBreadcrumbItem> <WaBreadcrumbItem>
<SlIcon slot="prefix" name="house" /> <WaIcon slot="prefix" name="house" variant="solid" />
Home Home
</SlBreadcrumbItem> </WaBreadcrumbItem>
<SlBreadcrumbItem>Articles</SlBreadcrumbItem> <WaBreadcrumbItem>Articles</WaBreadcrumbItem>
<SlBreadcrumbItem>Traveling</SlBreadcrumbItem> <WaBreadcrumbItem>Traveling</WaBreadcrumbItem>
</SlBreadcrumb> </WaBreadcrumb>
); );
``` ```
@@ -165,28 +170,30 @@ const App = () => (
Use the `suffix` slot to add content after any breadcrumb item. Use the `suffix` slot to add content after any breadcrumb item.
```html:preview ```html:preview
<sl-breadcrumb> <wa-breadcrumb>
<sl-breadcrumb-item>Documents</sl-breadcrumb-item> <wa-breadcrumb-item>Documents</wa-breadcrumb-item>
<sl-breadcrumb-item>Policies</sl-breadcrumb-item> <wa-breadcrumb-item>Policies</wa-breadcrumb-item>
<sl-breadcrumb-item> <wa-breadcrumb-item>
Security Security
<sl-icon slot="suffix" name="shield-lock"></sl-icon> <wa-icon slot="suffix" name="shield" variant="solid"></wa-icon>
</sl-breadcrumb-item> </wa-breadcrumb-item>
</sl-breadcrumb> </wa-breadcrumb>
``` ```
```jsx:react ```jsx:react
import { SlBreadcrumb, SlBreadcrumbItem, SlIcon } from '@shoelace-style/shoelace/dist/react'; import WaBreadcrumb from '@shoelace-style/shoelace/dist/react/breadcrumb';
import WaBreadcrumbItem from '@shoelace-style/shoelace/dist/react/breadcrumb-item';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
const App = () => ( const App = () => (
<SlBreadcrumb> <WaBreadcrumb>
<SlBreadcrumbItem>Documents</SlBreadcrumbItem> <WaBreadcrumbItem>Documents</WaBreadcrumbItem>
<SlBreadcrumbItem>Policies</SlBreadcrumbItem> <WaBreadcrumbItem>Policies</WaBreadcrumbItem>
<SlBreadcrumbItem> <WaBreadcrumbItem>
Security Security
<SlIcon slot="suffix" name="shield-lock"></SlIcon> <WaIcon slot="suffix" name="shield" variant="solid"></WaIcon>
</SlBreadcrumbItem> </WaBreadcrumbItem>
</SlBreadcrumb> </WaBreadcrumb>
); );
``` ```
@@ -195,57 +202,57 @@ const App = () => (
Dropdown menus can be placed in a prefix or suffix slot to provide additional options. Dropdown menus can be placed in a prefix or suffix slot to provide additional options.
```html:preview ```html:preview
<sl-breadcrumb> <wa-breadcrumb>
<sl-breadcrumb-item>Homepage</sl-breadcrumb-item> <wa-breadcrumb-item>Homepage</wa-breadcrumb-item>
<sl-breadcrumb-item>Our Services</sl-breadcrumb-item> <wa-breadcrumb-item>Our Services</wa-breadcrumb-item>
<sl-breadcrumb-item>Digital Media</sl-breadcrumb-item> <wa-breadcrumb-item>Digital Media</wa-breadcrumb-item>
<sl-breadcrumb-item> <wa-breadcrumb-item>
Web Design Web Design
<sl-dropdown slot="suffix"> <wa-dropdown slot="suffix">
<sl-button slot="trigger" size="small" circle> <wa-button slot="trigger" size="small" pill>
<sl-icon label="More options" name="three-dots"></sl-icon> <wa-icon label="More options" name="ellipsis" variant="solid"></wa-icon>
</sl-button> </wa-button>
<sl-menu> <wa-menu>
<sl-menu-item type="checkbox" checked>Web Design</sl-menu-item> <wa-menu-item type="checkbox" checked>Web Design</wa-menu-item>
<sl-menu-item type="checkbox">Web Development</sl-menu-item> <wa-menu-item type="checkbox">Web Development</wa-menu-item>
<sl-menu-item type="checkbox">Marketing</sl-menu-item> <wa-menu-item type="checkbox">Marketing</wa-menu-item>
</sl-menu> </wa-menu>
</sl-dropdown> </wa-dropdown>
</sl-breadcrumb-item> </wa-breadcrumb-item>
</sl-breadcrumb> </wa-breadcrumb>
``` ```
```jsx:react ```jsx:react
import { import {
SlBreadcrumb, WaBreadcrumb,
SlBreadcrumbItem, WaBreadcrumbItem,
SlButton, WaButton,
SlDropdown, WaDropdown,
SlIcon, WaIcon,
SlMenu, WaMenu,
SlMenuItem WaMenuItem
} from '@shoelace-style/shoelace/dist/react'; } from '@shoelace-style/shoelace/dist/react';
const App = () => ( const App = () => (
<SlBreadcrumb> <WaBreadcrumb>
<SlBreadcrumbItem>Homepage</SlBreadcrumbItem> <WaBreadcrumbItem>Homepage</WaBreadcrumbItem>
<SlBreadcrumbItem>Our Services</SlBreadcrumbItem> <WaBreadcrumbItem>Our Services</WaBreadcrumbItem>
<SlBreadcrumbItem>Digital Media</SlBreadcrumbItem> <WaBreadcrumbItem>Digital Media</WaBreadcrumbItem>
<SlBreadcrumbItem> <WaBreadcrumbItem>
Web Design Web Design
<SlDropdown slot="suffix"> <WaDropdown slot="suffix">
<SlButton slot="trigger" size="small" circle> <WaButton slot="trigger" size="small" pill>
<SlIcon label="More options" name="three-dots"></SlIcon> <WaIcon label="More options" name="ellipsis"></WaIcon>
</SlButton> </WaButton>
<SlMenu> <WaMenu>
<SlMenuItem type="checkbox" checked> <WaMenuItem type="checkbox" checked>
Web Design Web Design
</SlMenuItem> </WaMenuItem>
<SlMenuItem type="checkbox">Web Development</SlMenuItem> <WaMenuItem type="checkbox">Web Development</WaMenuItem>
<SlMenuItem type="checkbox">Marketing</SlMenuItem> <WaMenuItem type="checkbox">Marketing</WaMenuItem>
</SlMenu> </WaMenu>
</SlDropdown> </WaDropdown>
</SlBreadcrumbItem> </WaBreadcrumbItem>
</SlBreadcrumb> </WaBreadcrumb>
); );
``` ```

View File

@@ -6,22 +6,23 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-button-group label="Alignment"> <wa-button-group label="Alignment">
<sl-button>Left</sl-button> <wa-button>Left</wa-button>
<sl-button>Center</sl-button> <wa-button>Center</wa-button>
<sl-button>Right</sl-button> <wa-button>Right</wa-button>
</sl-button-group> </wa-button-group>
``` ```
```jsx:react ```jsx:react
import { SlButton, SlButtonGroup } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaButtonGroup from '@shoelace-style/shoelace/dist/react/button-group';
const App = () => ( const App = () => (
<SlButtonGroup label="Alignment"> <WaButtonGroup label="Alignment">
<SlButton>Left</SlButton> <WaButton>Left</WaButton>
<SlButton>Center</SlButton> <WaButton>Center</WaButton>
<SlButton>Right</SlButton> <WaButton>Right</WaButton>
</SlButtonGroup> </WaButtonGroup>
); );
``` ```
@@ -32,57 +33,58 @@ const App = () => (
All button sizes are supported, but avoid mixing sizes within the same button group. All button sizes are supported, but avoid mixing sizes within the same button group.
```html:preview ```html:preview
<sl-button-group label="Alignment"> <wa-button-group label="Alignment">
<sl-button size="small">Left</sl-button> <wa-button size="small">Left</wa-button>
<sl-button size="small">Center</sl-button> <wa-button size="small">Center</wa-button>
<sl-button size="small">Right</sl-button> <wa-button size="small">Right</wa-button>
</sl-button-group> </wa-button-group>
<br /><br /> <br /><br />
<sl-button-group label="Alignment"> <wa-button-group label="Alignment">
<sl-button size="medium">Left</sl-button> <wa-button size="medium">Left</wa-button>
<sl-button size="medium">Center</sl-button> <wa-button size="medium">Center</wa-button>
<sl-button size="medium">Right</sl-button> <wa-button size="medium">Right</wa-button>
</sl-button-group> </wa-button-group>
<br /><br /> <br /><br />
<sl-button-group label="Alignment"> <wa-button-group label="Alignment">
<sl-button size="large">Left</sl-button> <wa-button size="large">Left</wa-button>
<sl-button size="large">Center</sl-button> <wa-button size="large">Center</wa-button>
<sl-button size="large">Right</sl-button> <wa-button size="large">Right</wa-button>
</sl-button-group> </wa-button-group>
``` ```
```jsx:react ```jsx:react
import { SlButton, SlButtonGroup } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaButtonGroup from '@shoelace-style/shoelace/dist/react/button-group';
const App = () => ( const App = () => (
<> <>
<SlButtonGroup label="Alignment"> <WaButtonGroup label="Alignment">
<SlButton size="small">Left</SlButton> <WaButton size="small">Left</WaButton>
<SlButton size="small">Center</SlButton> <WaButton size="small">Center</WaButton>
<SlButton size="small">Right</SlButton> <WaButton size="small">Right</WaButton>
</SlButtonGroup> </WaButtonGroup>
<br /> <br />
<br /> <br />
<SlButtonGroup label="Alignment"> <WaButtonGroup label="Alignment">
<SlButton size="medium">Left</SlButton> <WaButton size="medium">Left</WaButton>
<SlButton size="medium">Center</SlButton> <WaButton size="medium">Center</WaButton>
<SlButton size="medium">Right</SlButton> <WaButton size="medium">Right</WaButton>
</SlButtonGroup> </WaButtonGroup>
<br /> <br />
<br /> <br />
<SlButtonGroup label="Alignment"> <WaButtonGroup label="Alignment">
<SlButton size="large">Left</SlButton> <WaButton size="large">Left</WaButton>
<SlButton size="large">Center</SlButton> <WaButton size="large">Center</WaButton>
<SlButton size="large">Right</SlButton> <WaButton size="large">Right</WaButton>
</SlButtonGroup> </WaButtonGroup>
</> </>
); );
``` ```
@@ -92,91 +94,92 @@ const App = () => (
Theme buttons are supported through the button's `variant` attribute. Theme buttons are supported through the button's `variant` attribute.
```html:preview ```html:preview
<sl-button-group label="Alignment"> <wa-button-group label="Alignment">
<sl-button variant="primary">Left</sl-button> <wa-button variant="brand">Left</wa-button>
<sl-button variant="primary">Center</sl-button> <wa-button variant="brand">Center</wa-button>
<sl-button variant="primary">Right</sl-button> <wa-button variant="brand">Right</wa-button>
</sl-button-group> </wa-button-group>
<br /><br /> <br /><br />
<sl-button-group label="Alignment"> <wa-button-group label="Alignment">
<sl-button variant="success">Left</sl-button> <wa-button variant="success">Left</wa-button>
<sl-button variant="success">Center</sl-button> <wa-button variant="success">Center</wa-button>
<sl-button variant="success">Right</sl-button> <wa-button variant="success">Right</wa-button>
</sl-button-group> </wa-button-group>
<br /><br /> <br /><br />
<sl-button-group label="Alignment"> <wa-button-group label="Alignment">
<sl-button variant="neutral">Left</sl-button> <wa-button>Left</wa-button>
<sl-button variant="neutral">Center</sl-button> <wa-button>Center</wa-button>
<sl-button variant="neutral">Right</sl-button> <wa-button>Right</wa-button>
</sl-button-group> </wa-button-group>
<br /><br /> <br /><br />
<sl-button-group label="Alignment"> <wa-button-group label="Alignment">
<sl-button variant="warning">Left</sl-button> <wa-button variant="warning">Left</wa-button>
<sl-button variant="warning">Center</sl-button> <wa-button variant="warning">Center</wa-button>
<sl-button variant="warning">Right</sl-button> <wa-button variant="warning">Right</wa-button>
</sl-button-group> </wa-button-group>
<br /><br /> <br /><br />
<sl-button-group label="Alignment"> <wa-button-group label="Alignment">
<sl-button variant="danger">Left</sl-button> <wa-button variant="danger">Left</wa-button>
<sl-button variant="danger">Center</sl-button> <wa-button variant="danger">Center</wa-button>
<sl-button variant="danger">Right</sl-button> <wa-button variant="danger">Right</wa-button>
</sl-button-group> </wa-button-group>
``` ```
```jsx:react ```jsx:react
import { SlButton, SlButtonGroup } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaButtonGroup from '@shoelace-style/shoelace/dist/react/button-group';
const App = () => ( const App = () => (
<> <>
<SlButtonGroup label="Alignment"> <WaButtonGroup label="Alignment">
<SlButton variant="primary">Left</SlButton> <WaButton variant="brand">Left</WaButton>
<SlButton variant="primary">Center</SlButton> <WaButton variant="brand">Center</WaButton>
<SlButton variant="primary">Right</SlButton> <WaButton variant="brand">Right</WaButton>
</SlButtonGroup> </WaButtonGroup>
<br /> <br />
<br /> <br />
<SlButtonGroup label="Alignment"> <WaButtonGroup label="Alignment">
<SlButton variant="success">Left</SlButton> <WaButton variant="success">Left</WaButton>
<SlButton variant="success">Center</SlButton> <WaButton variant="success">Center</WaButton>
<SlButton variant="success">Right</SlButton> <WaButton variant="success">Right</WaButton>
</SlButtonGroup> </WaButtonGroup>
<br /> <br />
<br /> <br />
<SlButtonGroup label="Alignment"> <WaButtonGroup label="Alignment">
<SlButton variant="neutral">Left</SlButton> <WaButton>Left</WaButton>
<SlButton variant="neutral">Center</SlButton> <WaButton>Center</WaButton>
<SlButton variant="neutral">Right</SlButton> <WaButton>Right</WaButton>
</SlButtonGroup> </WaButtonGroup>
<br /> <br />
<br /> <br />
<SlButtonGroup label="Alignment"> <WaButtonGroup label="Alignment">
<SlButton variant="warning">Left</SlButton> <WaButton variant="warning">Left</WaButton>
<SlButton variant="warning">Center</SlButton> <WaButton variant="warning">Center</WaButton>
<SlButton variant="warning">Right</SlButton> <WaButton variant="warning">Right</WaButton>
</SlButtonGroup> </WaButtonGroup>
<br /> <br />
<br /> <br />
<SlButtonGroup label="Alignment"> <WaButtonGroup label="Alignment">
<SlButton variant="danger">Left</SlButton> <WaButton variant="danger">Left</WaButton>
<SlButton variant="danger">Center</SlButton> <WaButton variant="danger">Center</WaButton>
<SlButton variant="danger">Right</SlButton> <WaButton variant="danger">Right</WaButton>
</SlButtonGroup> </WaButtonGroup>
</> </>
); );
``` ```
@@ -186,116 +189,121 @@ const App = () => (
Pill buttons are supported through the button's `pill` attribute. Pill buttons are supported through the button's `pill` attribute.
```html:preview ```html:preview
<sl-button-group label="Alignment"> <wa-button-group label="Alignment">
<sl-button size="small" pill>Left</sl-button> <wa-button size="small" pill>Left</wa-button>
<sl-button size="small" pill>Center</sl-button> <wa-button size="small" pill>Center</wa-button>
<sl-button size="small" pill>Right</sl-button> <wa-button size="small" pill>Right</wa-button>
</sl-button-group> </wa-button-group>
<br /><br /> <br /><br />
<sl-button-group label="Alignment"> <wa-button-group label="Alignment">
<sl-button size="medium" pill>Left</sl-button> <wa-button size="medium" pill>Left</wa-button>
<sl-button size="medium" pill>Center</sl-button> <wa-button size="medium" pill>Center</wa-button>
<sl-button size="medium" pill>Right</sl-button> <wa-button size="medium" pill>Right</wa-button>
</sl-button-group> </wa-button-group>
<br /><br /> <br /><br />
<sl-button-group label="Alignment"> <wa-button-group label="Alignment">
<sl-button size="large" pill>Left</sl-button> <wa-button size="large" pill>Left</wa-button>
<sl-button size="large" pill>Center</sl-button> <wa-button size="large" pill>Center</wa-button>
<sl-button size="large" pill>Right</sl-button> <wa-button size="large" pill>Right</wa-button>
</sl-button-group> </wa-button-group>
``` ```
```jsx:react ```jsx:react
import { SlButton, SlButtonGroup } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaButtonGroup from '@shoelace-style/shoelace/dist/react/button-group';
const App = () => ( const App = () => (
<> <>
<SlButtonGroup label="Alignment"> <WaButtonGroup label="Alignment">
<SlButton size="small" pill> <WaButton size="small" pill>
Left Left
</SlButton> </WaButton>
<SlButton size="small" pill> <WaButton size="small" pill>
Center Center
</SlButton> </WaButton>
<SlButton size="small" pill> <WaButton size="small" pill>
Right Right
</SlButton> </WaButton>
</SlButtonGroup> </WaButtonGroup>
<br /> <br />
<br /> <br />
<SlButtonGroup label="Alignment"> <WaButtonGroup label="Alignment">
<SlButton size="medium" pill> <WaButton size="medium" pill>
Left Left
</SlButton> </WaButton>
<SlButton size="medium" pill> <WaButton size="medium" pill>
Center Center
</SlButton> </WaButton>
<SlButton size="medium" pill> <WaButton size="medium" pill>
Right Right
</SlButton> </WaButton>
</SlButtonGroup> </WaButtonGroup>
<br /> <br />
<br /> <br />
<SlButtonGroup label="Alignment"> <WaButtonGroup label="Alignment">
<SlButton size="large" pill> <WaButton size="large" pill>
Left Left
</SlButton> </WaButton>
<SlButton size="large" pill> <WaButton size="large" pill>
Center Center
</SlButton> </WaButton>
<SlButton size="large" pill> <WaButton size="large" pill>
Right Right
</SlButton> </WaButton>
</SlButtonGroup> </WaButtonGroup>
</> </>
); );
``` ```
### Dropdowns in Button Groups ### Dropdowns in Button Groups
Dropdowns can be placed inside button groups as long as the trigger is an `<sl-button>` element. Dropdowns can be placed inside button groups as long as the trigger is an `<wa-button>` element.
```html:preview ```html:preview
<sl-button-group label="Example Button Group"> <wa-button-group label="Example Button Group">
<sl-button>Button</sl-button> <wa-button>Button</wa-button>
<sl-button>Button</sl-button> <wa-button>Button</wa-button>
<sl-dropdown> <wa-dropdown>
<sl-button slot="trigger" caret>Dropdown</sl-button> <wa-button slot="trigger" caret>Dropdown</wa-button>
<sl-menu> <wa-menu>
<sl-menu-item>Item 1</sl-menu-item> <wa-menu-item>Item 1</wa-menu-item>
<sl-menu-item>Item 2</sl-menu-item> <wa-menu-item>Item 2</wa-menu-item>
<sl-menu-item>Item 3</sl-menu-item> <wa-menu-item>Item 3</wa-menu-item>
</sl-menu> </wa-menu>
</sl-dropdown> </wa-dropdown>
</sl-button-group> </wa-button-group>
``` ```
```jsx:react ```jsx:react
import { SlButton, SlButtonGroup, SlDropdown, SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaButtonGroup from '@shoelace-style/shoelace/dist/react/button-group';
import WaDropdown from '@shoelace-style/shoelace/dist/react/dropdown';
import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const App = () => ( const App = () => (
<SlButtonGroup label="Example Button Group"> <WaButtonGroup label="Example Button Group">
<SlButton>Button</SlButton> <WaButton>Button</WaButton>
<SlButton>Button</SlButton> <WaButton>Button</WaButton>
<SlDropdown> <WaDropdown>
<SlButton slot="trigger" caret> <WaButton slot="trigger" caret>
Dropdown Dropdown
</SlButton> </WaButton>
<SlMenu> <WaMenu>
<SlMenuItem>Item 1</SlMenuItem> <WaMenuItem>Item 1</WaMenuItem>
<SlMenuItem>Item 2</SlMenuItem> <WaMenuItem>Item 2</WaMenuItem>
<SlMenuItem>Item 3</SlMenuItem> <WaMenuItem>Item 3</WaMenuItem>
</SlMenu> </WaMenu>
</SlDropdown> </WaDropdown>
</SlButtonGroup> </WaButtonGroup>
); );
``` ```
@@ -304,36 +312,40 @@ const App = () => (
Create a split button using a button and a dropdown. Use a [visually hidden](/components/visually-hidden) label to ensure the dropdown is accessible to users with assistive devices. Create a split button using a button and a dropdown. Use a [visually hidden](/components/visually-hidden) label to ensure the dropdown is accessible to users with assistive devices.
```html:preview ```html:preview
<sl-button-group label="Example Button Group"> <wa-button-group label="Example Button Group">
<sl-button variant="primary">Save</sl-button> <wa-button variant="brand">Save</wa-button>
<sl-dropdown placement="bottom-end"> <wa-dropdown placement="bottom-end">
<sl-button slot="trigger" variant="primary" caret> <wa-button slot="trigger" variant="brand" caret>
<sl-visually-hidden>More options</sl-visually-hidden> <wa-visually-hidden>More options</wa-visually-hidden>
</sl-button> </wa-button>
<sl-menu> <wa-menu>
<sl-menu-item>Save</sl-menu-item> <wa-menu-item>Save</wa-menu-item>
<sl-menu-item>Save as&hellip;</sl-menu-item> <wa-menu-item>Save as&hellip;</wa-menu-item>
<sl-menu-item>Save all</sl-menu-item> <wa-menu-item>Save all</wa-menu-item>
</sl-menu> </wa-menu>
</sl-dropdown> </wa-dropdown>
</sl-button-group> </wa-button-group>
``` ```
```jsx:react ```jsx:react
import { SlButton, SlButtonGroup, SlDropdown, SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaButtonGroup from '@shoelace-style/shoelace/dist/react/button-group';
import WaDropdown from '@shoelace-style/shoelace/dist/react/dropdown';
import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const App = () => ( const App = () => (
<SlButtonGroup label="Example Button Group"> <WaButtonGroup label="Example Button Group">
<SlButton variant="primary">Save</SlButton> <WaButton variant="brand">Save</WaButton>
<SlDropdown placement="bottom-end"> <WaDropdown placement="bottom-end">
<SlButton slot="trigger" variant="primary" caret></SlButton> <WaButton slot="trigger" variant="brand" caret></WaButton>
<SlMenu> <WaMenu>
<SlMenuItem>Save</SlMenuItem> <WaMenuItem>Save</WaMenuItem>
<SlMenuItem>Save as&hellip;</SlMenuItem> <WaMenuItem>Save as&hellip;</WaMenuItem>
<SlMenuItem>Save all</SlMenuItem> <WaMenuItem>Save all</WaMenuItem>
</SlMenu> </WaMenu>
</SlDropdown> </WaDropdown>
</SlButtonGroup> </WaButtonGroup>
); );
``` ```
@@ -342,39 +354,41 @@ const App = () => (
Buttons can be wrapped in tooltips to provide more detail when the user interacts with them. Buttons can be wrapped in tooltips to provide more detail when the user interacts with them.
```html:preview ```html:preview
<sl-button-group label="Alignment"> <wa-button-group label="Alignment">
<sl-tooltip content="I'm on the left"> <wa-tooltip content="I'm on the left">
<sl-button>Left</sl-button> <wa-button>Left</wa-button>
</sl-tooltip> </wa-tooltip>
<sl-tooltip content="I'm in the middle"> <wa-tooltip content="I'm in the middle">
<sl-button>Center</sl-button> <wa-button>Center</wa-button>
</sl-tooltip> </wa-tooltip>
<sl-tooltip content="I'm on the right"> <wa-tooltip content="I'm on the right">
<sl-button>Right</sl-button> <wa-button>Right</wa-button>
</sl-tooltip> </wa-tooltip>
</sl-button-group> </wa-button-group>
``` ```
```jsx:react ```jsx:react
import { SlButton, SlButtonGroup, SlTooltip } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaButtonGroup from '@shoelace-style/shoelace/dist/react/button-group';
import WaTooltip from '@shoelace-style/shoelace/dist/react/tooltip';
const App = () => ( const App = () => (
<> <>
<SlButtonGroup label="Alignment"> <WaButtonGroup label="Alignment">
<SlTooltip content="I'm on the left"> <WaTooltip content="I'm on the left">
<SlButton>Left</SlButton> <WaButton>Left</WaButton>
</SlTooltip> </WaTooltip>
<SlTooltip content="I'm in the middle"> <WaTooltip content="I'm in the middle">
<SlButton>Center</SlButton> <WaButton>Center</WaButton>
</SlTooltip> </WaTooltip>
<SlTooltip content="I'm on the right"> <WaTooltip content="I'm on the right">
<SlButton>Right</SlButton> <WaButton>Right</WaButton>
</SlTooltip> </WaTooltip>
</SlButtonGroup> </WaButtonGroup>
</> </>
); );
``` ```
@@ -385,107 +399,110 @@ Create interactive toolbars with button groups.
```html:preview ```html:preview
<div class="button-group-toolbar"> <div class="button-group-toolbar">
<sl-button-group label="History"> <wa-button-group label="History">
<sl-tooltip content="Undo"> <wa-tooltip content="Undo">
<sl-button><sl-icon name="arrow-counterclockwise" label="Undo"></sl-icon></sl-button> <wa-button><wa-icon name="undo" variant="solid" label="Undo"></wa-icon></wa-button>
</sl-tooltip> </wa-tooltip>
<sl-tooltip content="Redo"> <wa-tooltip content="Redo">
<sl-button><sl-icon name="arrow-clockwise" label="Redo"></sl-icon></sl-button> <wa-button><wa-icon name="redo" variant="solid" label="Redo"></wa-icon></wa-button>
</sl-tooltip> </wa-tooltip>
</sl-button-group> </wa-button-group>
<sl-button-group label="Formatting"> <wa-button-group label="Formatting">
<sl-tooltip content="Bold"> <wa-tooltip content="Bold">
<sl-button><sl-icon name="type-bold" label="Bold"></sl-icon></sl-button> <wa-button><wa-icon name="bold" variant="solid" label="Bold"></wa-icon></wa-button>
</sl-tooltip> </wa-tooltip>
<sl-tooltip content="Italic"> <wa-tooltip content="Italic">
<sl-button><sl-icon name="type-italic" label="Italic"></sl-icon></sl-button> <wa-button><wa-icon name="italic" variant="solid" label="Italic"></wa-icon></wa-button>
</sl-tooltip> </wa-tooltip>
<sl-tooltip content="Underline"> <wa-tooltip content="Underline">
<sl-button><sl-icon name="type-underline" label="Underline"></sl-icon></sl-button> <wa-button><wa-icon name="underline" variant="solid" label="Underline"></wa-icon></wa-button>
</sl-tooltip> </wa-tooltip>
</sl-button-group> </wa-button-group>
<sl-button-group label="Alignment"> <wa-button-group label="Alignment">
<sl-tooltip content="Align Left"> <wa-tooltip content="Align Left">
<sl-button><sl-icon name="justify-left" label="Align Left"></sl-icon></sl-button> <wa-button><wa-icon name="align-left" variant="solid" label="Align Left"></wa-icon></wa-button>
</sl-tooltip> </wa-tooltip>
<sl-tooltip content="Align Center"> <wa-tooltip content="Align Center">
<sl-button><sl-icon name="justify" label="Align Center"></sl-icon></sl-button> <wa-button><wa-icon name="align-center" variant="solid" label="Align Center"></wa-icon></wa-button>
</sl-tooltip> </wa-tooltip>
<sl-tooltip content="Align Right"> <wa-tooltip content="Align Right">
<sl-button><sl-icon name="justify-right" label="Align Right"></sl-icon></sl-button> <wa-button><wa-icon name="align-right" variant="solid" label="Align Right"></wa-icon></wa-button>
</sl-tooltip> </wa-tooltip>
</sl-button-group> </wa-button-group>
</div> </div>
<style> <style>
.button-group-toolbar sl-button-group:not(:last-of-type) { .button-group-toolbar wa-button-group:not(:last-of-type) {
margin-right: var(--sl-spacing-x-small); margin-right: var(--wa-space-xs);
} }
</style> </style>
``` ```
```jsx:react ```jsx:react
import { SlButton, SlButtonGroup, SlIcon, SlTooltip } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaButtonGroup from '@shoelace-style/shoelace/dist/react/button-group';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
import WaTooltip from '@shoelace-style/shoelace/dist/react/tooltip';
const css = ` const css = `
.button-group-toolbar sl-button-group:not(:last-of-type) { .button-group-toolbar wa-button-group:not(:last-of-type) {
margin-right: var(--sl-spacing-x-small); margin-right: var(--wa-space-xs);
} }
`; `;
const App = () => ( const App = () => (
<> <>
<div className="button-group-toolbar"> <div className="button-group-toolbar">
<SlButtonGroup label="History"> <WaButtonGroup label="History">
<SlTooltip content="Undo"> <WaTooltip content="Undo">
<SlButton> <WaButton>
<SlIcon name="arrow-counterclockwise"></SlIcon> <WaIcon name="undo" variant="solid"></WaIcon>
</SlButton> </WaButton>
</SlTooltip> </WaTooltip>
<SlTooltip content="Redo"> <WaTooltip content="Redo">
<SlButton> <WaButton>
<SlIcon name="arrow-clockwise"></SlIcon> <WaIcon name="redo" variant="solid"></WaIcon>
</SlButton> </WaButton>
</SlTooltip> </WaTooltip>
</SlButtonGroup> </WaButtonGroup>
<SlButtonGroup label="Formatting"> <WaButtonGroup label="Formatting">
<SlTooltip content="Bold"> <WaTooltip content="Bold">
<SlButton> <WaButton>
<SlIcon name="type-bold"></SlIcon> <WaIcon name="bold" variant="solid"></WaIcon>
</SlButton> </WaButton>
</SlTooltip> </WaTooltip>
<SlTooltip content="Italic"> <WaTooltip content="Italic">
<SlButton> <WaButton>
<SlIcon name="type-italic"></SlIcon> <WaIcon name="italic" variant="solid"></WaIcon>
</SlButton> </WaButton>
</SlTooltip> </WaTooltip>
<SlTooltip content="Underline"> <WaTooltip content="Underline">
<SlButton> <WaButton>
<SlIcon name="type-underline"></SlIcon> <WaIcon name="underline" variant="solid"></WaIcon>
</SlButton> </WaButton>
</SlTooltip> </WaTooltip>
</SlButtonGroup> </WaButtonGroup>
<SlButtonGroup label="Alignment"> <WaButtonGroup label="Alignment">
<SlTooltip content="Align Left"> <WaTooltip content="Align Left">
<SlButton> <WaButton>
<SlIcon name="justify-left"></SlIcon> <WaIcon name="align-left" variant="solid"></WaIcon>
</SlButton> </WaButton>
</SlTooltip> </WaTooltip>
<SlTooltip content="Align Center"> <WaTooltip content="Align Center">
<SlButton> <WaButton>
<SlIcon name="justify"></SlIcon> <WaIcon name="align-center" variant="solid"></WaIcon>
</SlButton> </WaButton>
</SlTooltip> </WaTooltip>
<SlTooltip content="Align Right"> <WaTooltip content="Align Right">
<SlButton> <WaButton>
<SlIcon name="justify-right"></SlIcon> <WaIcon name="align-right" variant="solid"></WaIcon>
</SlButton> </WaButton>
</SlTooltip> </WaTooltip>
</SlButtonGroup> </WaButtonGroup>
</div> </div>
<style>{css}</style> <style>{css}</style>

View File

@@ -6,13 +6,13 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-button>Button</sl-button> <wa-button>Button</wa-button>
``` ```
```jsx:react ```jsx:react
import { SlButton } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
const App = () => <SlButton>Button</SlButton>; const App = () => <WaButton>Button</WaButton>;
``` ```
## Examples ## Examples
@@ -22,25 +22,23 @@ const App = () => <SlButton>Button</SlButton>;
Use the `variant` attribute to set the button's variant. Use the `variant` attribute to set the button's variant.
```html:preview ```html:preview
<sl-button variant="default">Default</sl-button> <wa-button variant="brand">Brand</wa-button>
<sl-button variant="primary">Primary</sl-button> <wa-button variant="success">Success</wa-button>
<sl-button variant="success">Success</sl-button> <wa-button variant="neutral">Neutral</wa-button>
<sl-button variant="neutral">Neutral</sl-button> <wa-button variant="warning">Warning</wa-button>
<sl-button variant="warning">Warning</sl-button> <wa-button variant="danger">Danger</wa-button>
<sl-button variant="danger">Danger</sl-button>
``` ```
```jsx:react ```jsx:react
import { SlButton } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
const App = () => ( const App = () => (
<> <>
<SlButton variant="default">Default</SlButton> <WaButton variant="brand">Brand</WaButton>
<SlButton variant="primary">Primary</SlButton> <WaButton variant="success">Success</WaButton>
<SlButton variant="success">Success</SlButton> <WaButton variant="neutral">Neutral</WaButton>
<SlButton variant="neutral">Neutral</SlButton> <WaButton variant="warning">Warning</WaButton>
<SlButton variant="warning">Warning</SlButton> <WaButton variant="danger">Danger</WaButton>
<SlButton variant="danger">Danger</SlButton>
</> </>
); );
``` ```
@@ -50,19 +48,19 @@ const App = () => (
Use the `size` attribute to change a button's size. Use the `size` attribute to change a button's size.
```html:preview ```html:preview
<sl-button size="small">Small</sl-button> <wa-button size="small">Small</wa-button>
<sl-button size="medium">Medium</sl-button> <wa-button size="medium">Medium</wa-button>
<sl-button size="large">Large</sl-button> <wa-button size="large">Large</wa-button>
``` ```
```jsx:react ```jsx:react
import { SlButton } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
const App = () => ( const App = () => (
<> <>
<SlButton size="small">Small</SlButton> <WaButton size="small">Small</WaButton>
<SlButton size="medium">Medium</SlButton> <WaButton size="medium">Medium</WaButton>
<SlButton size="large">Large</SlButton> <WaButton size="large">Large</WaButton>
</> </>
); );
``` ```
@@ -72,37 +70,33 @@ const App = () => (
Use the `outline` attribute to draw outlined buttons with transparent backgrounds. Use the `outline` attribute to draw outlined buttons with transparent backgrounds.
```html:preview ```html:preview
<sl-button variant="default" outline>Default</sl-button> <wa-button variant="brand" outline>Brand</wa-button>
<sl-button variant="primary" outline>Primary</sl-button> <wa-button variant="success" outline>Success</wa-button>
<sl-button variant="success" outline>Success</sl-button> <wa-button variant="neutral" outline>Neutral</wa-button>
<sl-button variant="neutral" outline>Neutral</sl-button> <wa-button variant="warning" outline>Warning</wa-button>
<sl-button variant="warning" outline>Warning</sl-button> <wa-button variant="danger" outline>Danger</wa-button>
<sl-button variant="danger" outline>Danger</sl-button>
``` ```
```jsx:react ```jsx:react
import { SlButton } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
const App = () => ( const App = () => (
<> <>
<SlButton variant="default" outline> <WaButton variant="brand" outline>
Default Brand
</SlButton> </WaButton>
<SlButton variant="primary" outline> <WaButton variant="success" outline>
Primary
</SlButton>
<SlButton variant="success" outline>
Success Success
</SlButton> </WaButton>
<SlButton variant="neutral" outline> <WaButton variant="neutral" outline>
Neutral Neutral
</SlButton> </WaButton>
<SlButton variant="warning" outline> <WaButton variant="warning" outline>
Warning Warning
</SlButton> </WaButton>
<SlButton variant="danger" outline> <WaButton variant="danger" outline>
Danger Danger
</SlButton> </WaButton>
</> </>
); );
``` ```
@@ -112,61 +106,25 @@ const App = () => (
Use the `pill` attribute to give buttons rounded edges. Use the `pill` attribute to give buttons rounded edges.
```html:preview ```html:preview
<sl-button size="small" pill>Small</sl-button> <wa-button size="small" pill>Small</wa-button>
<sl-button size="medium" pill>Medium</sl-button> <wa-button size="medium" pill>Medium</wa-button>
<sl-button size="large" pill>Large</sl-button> <wa-button size="large" pill>Large</wa-button>
``` ```
```jsx:react ```jsx:react
import { SlButton } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
const App = () => ( const App = () => (
<> <>
<SlButton size="small" pill> <WaButton size="small" pill>
Small Small
</SlButton> </WaButton>
<SlButton size="medium" pill> <WaButton size="medium" pill>
Medium Medium
</SlButton> </WaButton>
<SlButton size="large" pill> <WaButton size="large" pill>
Large Large
</SlButton> </WaButton>
</>
);
```
### Circle Buttons
Use the `circle` attribute to create circular icon buttons. When this attribute is set, the button expects a single `<sl-icon>` in the default slot.
```html:preview
<sl-button variant="default" size="small" circle>
<sl-icon name="gear" label="Settings"></sl-icon>
</sl-button>
<sl-button variant="default" size="medium" circle>
<sl-icon name="gear" label="Settings"></sl-icon>
</sl-button>
<sl-button variant="default" size="large" circle>
<sl-icon name="gear" label="Settings"></sl-icon>
</sl-button>
```
```jsx:react
import { SlButton, SlIcon } from '@shoelace-style/shoelace/dist/react';
const App = () => (
<>
<SlButton variant="default" size="small" circle>
<SlIcon name="gear" />
</SlButton>
<SlButton variant="default" size="medium" circle>
<SlIcon name="gear" />
</SlButton>
<SlButton variant="default" size="large" circle>
<SlIcon name="gear" />
</SlButton>
</> </>
); );
``` ```
@@ -176,25 +134,25 @@ const App = () => (
Use the `text` variant to create text buttons that share the same size as regular buttons but don't have backgrounds or borders. Use the `text` variant to create text buttons that share the same size as regular buttons but don't have backgrounds or borders.
```html:preview ```html:preview
<sl-button variant="text" size="small">Text</sl-button> <wa-button variant="text" size="small">Text</wa-button>
<sl-button variant="text" size="medium">Text</sl-button> <wa-button variant="text" size="medium">Text</wa-button>
<sl-button variant="text" size="large">Text</sl-button> <wa-button variant="text" size="large">Text</wa-button>
``` ```
```jsx:react ```jsx:react
import { SlButton } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
const App = () => ( const App = () => (
<> <>
<SlButton variant="text" size="small"> <WaButton variant="text" size="small">
Text Text
</SlButton> </WaButton>
<SlButton variant="text" size="medium"> <WaButton variant="text" size="medium">
Text Text
</SlButton> </WaButton>
<SlButton variant="text" size="large"> <WaButton variant="text" size="large">
Text Text
</SlButton> </WaButton>
</> </>
); );
``` ```
@@ -204,27 +162,27 @@ const App = () => (
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. 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:preview ```html:preview
<sl-button href="https://example.com/">Link</sl-button> <wa-button href="https://example.com/">Link</wa-button>
<sl-button href="https://example.com/" target="_blank">New Window</sl-button> <wa-button href="https://example.com/" target="_blank">New Window</wa-button>
<sl-button href="/assets/images/wordmark.svg" download="shoelace.svg">Download</sl-button> <wa-button href="/assets/images/logo.svg" download="shoelace.svg">Download</wa-button>
<sl-button href="https://example.com/" disabled>Disabled</sl-button> <wa-button href="https://example.com/" disabled>Disabled</wa-button>
``` ```
```jsx:react ```jsx:react
import { SlButton } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
const App = () => ( const App = () => (
<> <>
<SlButton href="https://example.com/">Link</SlButton> <WaButton href="https://example.com/">Link</WaButton>
<SlButton href="https://example.com/" target="_blank"> <WaButton href="https://example.com/" target="_blank">
New Window New Window
</SlButton> </WaButton>
<SlButton href="/assets/images/wordmark.svg" download="shoelace.svg"> <WaButton href="/assets/images/logo.svg" download="shoelace.svg">
Download Download
</SlButton> </WaButton>
<SlButton href="https://example.com/" disabled> <WaButton href="https://example.com/" disabled>
Disabled Disabled
</SlButton> </WaButton>
</> </>
); );
``` ```
@@ -238,27 +196,27 @@ When a `target` is set, the link will receive `rel="noreferrer noopener"` for [s
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. 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:preview ```html:preview
<sl-button variant="default" size="small" style="width: 100%; margin-bottom: 1rem;">Small</sl-button> <wa-button size="small" style="width: 100%; margin-bottom: 1rem;">Small</wa-button>
<sl-button variant="default" size="medium" style="width: 100%; margin-bottom: 1rem;">Medium</sl-button> <wa-button size="medium" style="width: 100%; margin-bottom: 1rem;">Medium</wa-button>
<sl-button variant="default" size="large" style="width: 100%;">Large</sl-button> <wa-button size="large" style="width: 100%;">Large</wa-button>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlButton } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
const App = () => ( const App = () => (
<> <>
<SlButton variant="default" size="small" style={{ width: '100%', marginBottom: '1rem' }}> <WaButton size="small" style={{ width: '100%', marginBottom: '1rem' }}>
Small Small
</SlButton> </WaButton>
<SlButton variant="default" size="medium" style={{ width: '100%', marginBottom: '1rem' }}> <WaButton size="medium" style={{ width: '100%', marginBottom: '1rem' }}>
Medium Medium
</SlButton> </WaButton>
<SlButton variant="default" size="large" style={{ width: '100%' }}> <WaButton size="large" style={{ width: '100%' }}>
Large Large
</SlButton> </WaButton>
</> </>
); );
``` ```
@@ -270,117 +228,118 @@ const App = () => (
Use the `prefix` and `suffix` slots to add icons. Use the `prefix` and `suffix` slots to add icons.
```html:preview ```html:preview
<sl-button variant="default" size="small"> <wa-button size="small">
<sl-icon slot="prefix" name="gear"></sl-icon> <wa-icon slot="prefix" name="gear" variant="solid"></wa-icon>
Settings Settings
</sl-button> </wa-button>
<sl-button variant="default" size="small"> <wa-button size="small">
<sl-icon slot="suffix" name="arrow-counterclockwise"></sl-icon> <wa-icon slot="suffix" name="undo" variant="solid"></wa-icon>
Refresh Refresh
</sl-button> </wa-button>
<sl-button variant="default" size="small"> <wa-button size="small">
<sl-icon slot="prefix" name="link-45deg"></sl-icon> <wa-icon slot="prefix" name="link" variant="solid"></wa-icon>
<sl-icon slot="suffix" name="box-arrow-up-right"></sl-icon> <wa-icon slot="suffix" name="arrow-up-right-from-square" variant="solid"></wa-icon>
Open Open
</sl-button> </wa-button>
<br /><br /> <br /><br />
<sl-button variant="default"> <wa-button>
<sl-icon slot="prefix" name="gear"></sl-icon> <wa-icon slot="prefix" name="gear" variant="solid"></wa-icon>
Settings Settings
</sl-button> </wa-button>
<sl-button variant="default"> <wa-button>
<sl-icon slot="suffix" name="arrow-counterclockwise"></sl-icon> <wa-icon slot="suffix" name="undo" variant="solid"></wa-icon>
Refresh Refresh
</sl-button> </wa-button>
<sl-button variant="default"> <wa-button>
<sl-icon slot="prefix" name="link-45deg"></sl-icon> <wa-icon slot="prefix" name="link" variant="solid"></wa-icon>
<sl-icon slot="suffix" name="box-arrow-up-right"></sl-icon> <wa-icon slot="suffix" name="arrow-up-right-from-square" variant="solid"></wa-icon>
Open Open
</sl-button> </wa-button>
<br /><br /> <br /><br />
<sl-button variant="default" size="large"> <wa-button size="large">
<sl-icon slot="prefix" name="gear"></sl-icon> <wa-icon slot="prefix" name="gear" variant="solid"></wa-icon>
Settings Settings
</sl-button> </wa-button>
<sl-button variant="default" size="large"> <wa-button size="large">
<sl-icon slot="suffix" name="arrow-counterclockwise"></sl-icon> <wa-icon slot="suffix" name="undo" variant="solid"></wa-icon>
Refresh Refresh
</sl-button> </wa-button>
<sl-button variant="default" size="large"> <wa-button size="large">
<sl-icon slot="prefix" name="link-45deg"></sl-icon> <wa-icon slot="prefix" name="link" variant="solid"></wa-icon>
<sl-icon slot="suffix" name="box-arrow-up-right"></sl-icon> <wa-icon slot="suffix" name="arrow-up-right-from-square" variant="solid"></wa-icon>
Open Open
</sl-button> </wa-button>
``` ```
```jsx:react ```jsx:react
import { SlButton, SlIcon } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
const App = () => ( const App = () => (
<> <>
<SlButton variant="default" size="small"> <WaButton size="small">
<SlIcon slot="prefix" name="gear"></SlIcon> <WaIcon slot="prefix" name="gear" variant="solid"></WaIcon>
Settings Settings
</SlButton> </WaButton>
<SlButton variant="default" size="small"> <WaButton size="small">
<SlIcon slot="suffix" name="arrow-counterclockwise"></SlIcon> <WaIcon slot="suffix" name="undo" variant="solid"></WaIcon>
Refresh Refresh
</SlButton> </WaButton>
<SlButton variant="default" size="small"> <WaButton size="small">
<SlIcon slot="prefix" name="link-45deg"></SlIcon> <WaIcon slot="prefix" name="link" variant="solid"></WaIcon>
<SlIcon slot="suffix" name="box-arrow-up-right"></SlIcon> <WaIcon slot="suffix" name="arrow-up-right-from-square" variant="solid"></WaIcon>
Open Open
</SlButton> </WaButton>
<br /> <br />
<br /> <br />
<SlButton variant="default"> <WaButton>
<SlIcon slot="prefix" name="gear"></SlIcon> <WaIcon slot="prefix" name="gear" variant="solid"></WaIcon>
Settings Settings
</SlButton> </WaButton>
<SlButton variant="default"> <WaButton>
<SlIcon slot="suffix" name="arrow-counterclockwise"></SlIcon> <WaIcon slot="suffix" name="undo" variant="solid"></WaIcon>
Refresh Refresh
</SlButton> </WaButton>
<SlButton variant="default"> <WaButton>
<SlIcon slot="prefix" name="link-45deg"></SlIcon> <WaIcon slot="prefix" name="link" variant="solid"></WaIcon>
<SlIcon slot="suffix" name="box-arrow-up-right"></SlIcon> <WaIcon slot="suffix" name="arrow-up-right-from-square" variant="solid"></WaIcon>
Open Open
</SlButton> </WaButton>
<br /> <br />
<br /> <br />
<SlButton variant="default" size="large"> <WaButton size="large">
<SlIcon slot="prefix" name="gear"></SlIcon> <WaIcon slot="prefix" name="gear" variant="solid"></WaIcon>
Settings Settings
</SlButton> </WaButton>
<SlButton variant="default" size="large"> <WaButton size="large">
<SlIcon slot="suffix" name="arrow-counterclockwise"></SlIcon> <WaIcon slot="suffix" name="undo" variant="solid"></WaIcon>
Refresh Refresh
</SlButton> </WaButton>
<SlButton variant="default" size="large"> <WaButton size="large">
<SlIcon slot="prefix" name="link-45deg"></SlIcon> <WaIcon slot="prefix" name="link" variant="solid"></WaIcon>
<SlIcon slot="suffix" name="box-arrow-up-right"></SlIcon> <WaIcon slot="suffix" name="arrow-up-right-from-square" variant="solid"></WaIcon>
Open Open
</SlButton> </WaButton>
</> </>
); );
``` ```
@@ -390,129 +349,117 @@ const App = () => (
Use the `caret` attribute to add a dropdown indicator when a button will trigger a dropdown, menu, or popover. Use the `caret` attribute to add a dropdown indicator when a button will trigger a dropdown, menu, or popover.
```html:preview ```html:preview
<sl-button size="small" caret>Small</sl-button> <wa-button size="small" caret>Small</wa-button>
<sl-button size="medium" caret>Medium</sl-button> <wa-button size="medium" caret>Medium</wa-button>
<sl-button size="large" caret>Large</sl-button> <wa-button size="large" caret>Large</wa-button>
``` ```
```jsx:react ```jsx:react
import { SlButton } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
const App = () => ( const App = () => (
<> <>
<SlButton size="small" caret> <WaButton size="small" caret>
Small Small
</SlButton> </WaButton>
<SlButton size="medium" caret> <WaButton size="medium" caret>
Medium Medium
</SlButton> </WaButton>
<SlButton size="large" caret> <WaButton size="large" caret>
Large Large
</SlButton> </WaButton>
</> </>
); );
``` ```
### Loading ### Loading
Use the `loading` attribute to make a button busy. The width will remain the same as before, preventing adjacent elements from moving around. Clicks will be suppressed until the loading state is removed. Use the `loading` attribute to make a button busy. The width will remain the same as before, preventing adjacent elements from moving around.
```html:preview ```html:preview
<sl-button variant="default" loading>Default</sl-button> <wa-button variant="brand" loading>Brand</wa-button>
<sl-button variant="primary" loading>Primary</sl-button> <wa-button variant="success" loading>Success</wa-button>
<sl-button variant="success" loading>Success</sl-button> <wa-button variant="neutral" loading>Neutral</wa-button>
<sl-button variant="neutral" loading>Neutral</sl-button> <wa-button variant="warning" loading>Warning</wa-button>
<sl-button variant="warning" loading>Warning</sl-button> <wa-button variant="danger" loading>Danger</wa-button>
<sl-button variant="danger" loading>Danger</sl-button>
``` ```
```jsx:react ```jsx:react
import { SlButton } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
const App = () => ( const App = () => (
<> <>
<SlButton variant="default" loading> <WaButton variant="brand" loading>
Default Brand
</SlButton> </WaButton>
<SlButton variant="primary" loading> <WaButton variant="success" loading>
Primary
</SlButton>
<SlButton variant="success" loading>
Success Success
</SlButton> </WaButton>
<SlButton variant="neutral" loading> <WaButton variant="neutral" loading>
Neutral Neutral
</SlButton> </WaButton>
<SlButton variant="warning" loading> <WaButton variant="warning" loading>
Warning Warning
</SlButton> </WaButton>
<SlButton variant="danger" loading> <WaButton variant="danger" loading>
Danger Danger
</SlButton> </WaButton>
</> </>
); );
``` ```
### Disabled ### Disabled
Use the `disabled` attribute to disable a button. Clicks will be suppressed until the disabled state is removed. Use the `disabled` attribute to disable a button.
```html:preview ```html:preview
<sl-button variant="default" disabled>Default</sl-button> <wa-button variant="brand" disabled>Brand</wa-button>
<sl-button variant="primary" disabled>Primary</sl-button> <wa-button variant="success" disabled>Success</wa-button>
<sl-button variant="success" disabled>Success</sl-button> <wa-button variant="neutral" disabled>Neutral</wa-button>
<sl-button variant="neutral" disabled>Neutral</sl-button> <wa-button variant="warning" disabled>Warning</wa-button>
<sl-button variant="warning" disabled>Warning</sl-button> <wa-button variant="danger" disabled>Danger</wa-button>
<sl-button variant="danger" disabled>Danger</sl-button>
``` ```
```jsx:react ```jsx:react
import { SlButton } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
const App = () => ( const App = () => (
<> <>
<SlButton variant="default" disabled> <WaButton variant="brand" disabled>
Default Brand
</SlButton> </WaButton>
<SlButton variant="primary" disabled> <WaButton variant="success" disabled>
Primary
</SlButton>
<SlButton variant="success" disabled>
Success Success
</SlButton> </WaButton>
<SlButton variant="neutral" disabled> <WaButton variant="neutral" disabled>
Neutral Neutral
</SlButton> </WaButton>
<SlButton variant="warning" disabled> <WaButton variant="warning" disabled>
Warning Warning
</SlButton> </WaButton>
<SlButton variant="danger" disabled> <WaButton variant="danger" disabled>
Danger Danger
</SlButton> </WaButton>
</> </>
); );
``` ```
### Styling Buttons ### 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. `sl-button[variant="primary"]`). 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:preview ```html:preview
<sl-button class="pink">Pink Button</sl-button> <wa-button class="pink">Pink Button</wa-button>
<style> <style>
sl-button.pink::part(base) { wa-button.pink::part(base) {
/* Set design tokens for height and border width */ border-radius: 6px;
--sl-input-height-medium: 48px; border: solid 2px;
--sl-input-border-width: 4px; background: #ff1493;
border-radius: 0;
background-color: #ff1493;
border-top-color: #ff7ac1; border-top-color: #ff7ac1;
border-left-color: #ff7ac1; border-left-color: #ff7ac1;
border-bottom-color: #ad005c; border-bottom-color: #ad005c;
@@ -520,22 +467,22 @@ This example demonstrates how to style buttons using a custom class. This is the
color: white; color: white;
font-size: 1.125rem; font-size: 1.125rem;
box-shadow: 0 2px 10px #0002; box-shadow: 0 2px 10px #0002;
transition: var(--sl-transition-medium) transform ease, var(--sl-transition-medium) border ease; transition: var(--wa-transition-normal) all;
} }
sl-button.pink::part(base):hover { wa-button.pink::part(base):hover {
transform: scale(1.05) rotate(-1deg); transform: scale(1.05);
} }
sl-button.pink::part(base):active { wa-button.pink::part(base):active {
border-top-color: #ad005c; border-top-color: #ad005c;
border-right-color: #ff7ac1; border-right-color: #ff7ac1;
border-bottom-color: #ff7ac1; border-bottom-color: #ff7ac1;
border-left-color: #ad005c; border-left-color: #ad005c;
transform: scale(1.05) rotate(-1deg) translateY(2px); transform: translateY(1px);
} }
sl-button.pink::part(base):focus-visible { wa-button.pink::part(base):focus-visible {
outline: dashed 2px deeppink; outline: dashed 2px deeppink;
outline-offset: 4px; outline-offset: 4px;
} }

View File

@@ -6,7 +6,7 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-card class="card-overview"> <wa-card class="card-overview">
<img <img
slot="image" 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" src="https://images.unsplash.com/photo-1559209172-0ff8f6d49ff7?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=80"
@@ -18,10 +18,10 @@ layout: component
<small>6 weeks old</small> <small>6 weeks old</small>
<div slot="footer"> <div slot="footer">
<sl-button variant="primary" pill>More Info</sl-button> <wa-button variant="brand" pill>More Info</wa-button>
<sl-rating></sl-rating> <wa-rating></wa-rating>
</div> </div>
</sl-card> </wa-card>
<style> <style>
.card-overview { .card-overview {
@@ -29,7 +29,7 @@ layout: component
} }
.card-overview small { .card-overview small {
color: var(--sl-color-neutral-500); color: var(--wa-color-text-quiet);
} }
.card-overview [slot='footer'] { .card-overview [slot='footer'] {
@@ -41,7 +41,9 @@ layout: component
``` ```
```jsx:react ```jsx:react
import { SlButton, SlCard, SlRating } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaCard from '@shoelace-style/shoelace/dist/react/card';
import WaRating from '@shoelace-style/shoelace/dist/react/rating';
const css = ` const css = `
.card-overview { .card-overview {
@@ -49,7 +51,7 @@ const css = `
} }
.card-overview small { .card-overview small {
color: var(--sl-color-neutral-500); color: var(--wa-color-text-quiet);
} }
.card-overview [slot="footer"] { .card-overview [slot="footer"] {
@@ -61,7 +63,7 @@ const css = `
const App = () => ( const App = () => (
<> <>
<SlCard className="card-overview"> <WaCard className="card-overview">
<img <img
slot="image" 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" src="https://images.unsplash.com/photo-1559209172-0ff8f6d49ff7?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=80"
@@ -73,12 +75,12 @@ const App = () => (
<br /> <br />
<small>6 weeks old</small> <small>6 weeks old</small>
<div slot="footer"> <div slot="footer">
<SlButton variant="primary" pill> <WaButton variant="brand" pill>
More Info More Info
</SlButton> </WaButton>
<SlRating></SlRating> <WaRating></WaRating>
</div> </div>
</SlCard> </WaCard>
<style>{css}</style> <style>{css}</style>
</> </>
@@ -92,9 +94,9 @@ const App = () => (
Basic cards aren't very exciting, but they can display any content you want them to. Basic cards aren't very exciting, but they can display any content you want them to.
```html:preview ```html:preview
<sl-card class="card-basic"> <wa-card class="card-basic">
This is just a basic card. No image, no header, and no footer. Just your content. This is just a basic card. No image, no header, and no footer. Just your content.
</sl-card> </wa-card>
<style> <style>
.card-basic { .card-basic {
@@ -104,7 +106,7 @@ Basic cards aren't very exciting, but they can display any content you want them
``` ```
```jsx:react ```jsx:react
import { SlCard } from '@shoelace-style/shoelace/dist/react'; import WaCard from '@shoelace-style/shoelace/dist/react/card';
const css = ` const css = `
.card-basic { .card-basic {
@@ -114,9 +116,9 @@ const css = `
const App = () => ( const App = () => (
<> <>
<SlCard className="card-basic"> <WaCard className="card-basic">
This is just a basic card. No image, no header, and no footer. Just your content. This is just a basic card. No image, no header, and no footer. Just your content.
</SlCard> </WaCard>
<style>{css}</style> <style>{css}</style>
</> </>
@@ -128,14 +130,14 @@ const App = () => (
Headers can be used to display titles and more. Headers can be used to display titles and more.
```html:preview ```html:preview
<sl-card class="card-header"> <wa-card class="card-header">
<div slot="header"> <div slot="header">
Header Title Header Title
<sl-icon-button name="gear" label="Settings"></sl-icon-button> <wa-icon-button name="gear" variant="solid" label="Settings"></wa-icon-button>
</div> </div>
This card has a header. You can put all sorts of things in it! This card has a header. You can put all sorts of things in it!
</sl-card> </wa-card>
<style> <style>
.card-header { .card-header {
@@ -152,14 +154,15 @@ Headers can be used to display titles and more.
margin: 0; margin: 0;
} }
.card-header sl-icon-button { .card-header wa-icon-button {
font-size: var(--sl-font-size-medium); font-size: var(--wa-font-size-m);
} }
</style> </style>
``` ```
```jsx:react ```jsx:react
import { SlCard, SlIconButton } from '@shoelace-style/shoelace/dist/react'; import WaCard from '@shoelace-style/shoelace/dist/react/card';
import WaIconButton from '@shoelace-style/shoelace/dist/react/icon-button';
const css = ` const css = `
.card-header { .card-header {
@@ -176,20 +179,20 @@ const css = `
margin: 0; margin: 0;
} }
.card-header sl-icon-button { .card-header wa-icon-button {
font-size: var(--sl-font-size-medium); font-size: var(--wa-font-size-m);
} }
`; `;
const App = () => ( const App = () => (
<> <>
<SlCard className="card-header"> <WaCard className="card-header">
<div slot="header"> <div slot="header">
Header Title Header Title
<SlIconButton name="gear"></SlIconButton> <WaIconButton name="gear" variant="solid"></WaIconButton>
</div> </div>
This card has a header. You can put all sorts of things in it! This card has a header. You can put all sorts of things in it!
</SlCard> </WaCard>
<style>{css}</style> <style>{css}</style>
</> </>
@@ -201,14 +204,14 @@ const App = () => (
Footers can be used to display actions, summaries, or other relevant content. Footers can be used to display actions, summaries, or other relevant content.
```html:preview ```html:preview
<sl-card class="card-footer"> <wa-card class="card-footer">
This card has a footer. You can put all sorts of things in it! This card has a footer. You can put all sorts of things in it!
<div slot="footer"> <div slot="footer">
<sl-rating></sl-rating> <wa-rating></wa-rating>
<sl-button variant="primary">Preview</sl-button> <wa-button variant="brand">Preview</wa-button>
</div> </div>
</sl-card> </wa-card>
<style> <style>
.card-footer { .card-footer {
@@ -224,7 +227,9 @@ Footers can be used to display actions, summaries, or other relevant content.
``` ```
```jsx:react ```jsx:react
import { SlButton, SlCard, SlRating } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaCard from '@shoelace-style/shoelace/dist/react/card';
import WaRating from '@shoelace-style/shoelace/dist/react/rating';
const css = ` const css = `
.card-footer { .card-footer {
@@ -240,15 +245,15 @@ const css = `
const App = () => ( const App = () => (
<> <>
<SlCard className="card-footer"> <WaCard className="card-footer">
This card has a footer. You can put all sorts of things in it! This card has a footer. You can put all sorts of things in it!
<div slot="footer"> <div slot="footer">
<SlRating></SlRating> <WaRating></WaRating>
<SlButton slot="footer" variant="primary"> <WaButton slot="footer" variant="brand">
Preview Preview
</SlButton> </WaButton>
</div> </div>
</SlCard> </WaCard>
<style>{css}</style> <style>{css}</style>
</> </>
@@ -260,14 +265,14 @@ const App = () => (
Cards accept an `image` slot. The image is displayed atop the card and stretches to fit. Cards accept an `image` slot. The image is displayed atop the card and stretches to fit.
```html:preview ```html:preview
<sl-card class="card-image"> <wa-card class="card-image">
<img <img
slot="image" 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" 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." 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. This is a kitten, but not just any kitten. This kitten likes walking along pallets.
</sl-card> </wa-card>
<style> <style>
.card-image { .card-image {
@@ -277,7 +282,7 @@ Cards accept an `image` slot. The image is displayed atop the card and stretches
``` ```
```jsx:react ```jsx:react
import { SlCard } from '@shoelace-style/shoelace/dist/react'; import WaCard from '@shoelace-style/shoelace/dist/react/card';
const css = ` const css = `
.card-image { .card-image {
@@ -287,14 +292,14 @@ const css = `
const App = () => ( const App = () => (
<> <>
<SlCard className="card-image"> <WaCard className="card-image">
<img <img
slot="image" 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" 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." 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. This is a kitten, but not just any kitten. This kitten likes walking along pallets.
</SlCard> </WaCard>
<style>{css}</style> <style>{css}</style>
</> </>

View File

@@ -6,76 +6,77 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-carousel pagination> <wa-carousel pagination>
<sl-carousel-item> <wa-carousel-item>
<img <img
alt="The sun shines on the mountains and trees - Photo by Adam Kool on Unsplash" alt="The sun shines on the mountains and trees - Photo by Adam Kool on Unsplash"
src="/assets/examples/carousel/mountains.jpg" src="/assets/examples/carousel/mountains.jpg"
/> />
</sl-carousel-item> </wa-carousel-item>
<sl-carousel-item> <wa-carousel-item>
<img <img
alt="A waterfall in the middle of a forest - Photo by Thomas Kelly on Unsplash" alt="A waterfall in the middle of a forest - Photo by Thomas Kelly on Unsplash"
src="/assets/examples/carousel/waterfall.jpg" src="/assets/examples/carousel/waterfall.jpg"
/> />
</sl-carousel-item> </wa-carousel-item>
<sl-carousel-item> <wa-carousel-item>
<img <img
alt="The sun is setting over a lavender field - Photo by Leonard Cotte on Unsplash" alt="The sun is setting over a lavender field - Photo by Leonard Cotte on Unsplash"
src="/assets/examples/carousel/sunset.jpg" src="/assets/examples/carousel/sunset.jpg"
/> />
</sl-carousel-item> </wa-carousel-item>
<sl-carousel-item> <wa-carousel-item>
<img <img
alt="A field of grass with the sun setting in the background - Photo by Sapan Patel on Unsplash" alt="A field of grass with the sun setting in the background - Photo by Sapan Patel on Unsplash"
src="/assets/examples/carousel/field.jpg" src="/assets/examples/carousel/field.jpg"
/> />
</sl-carousel-item> </wa-carousel-item>
<sl-carousel-item> <wa-carousel-item>
<img <img
alt="A scenic view of a mountain with clouds rolling in - Photo by V2osk on Unsplash" alt="A scenic view of a mountain with clouds rolling in - Photo by V2osk on Unsplash"
src="/assets/examples/carousel/valley.jpg" src="/assets/examples/carousel/valley.jpg"
/> />
</sl-carousel-item> </wa-carousel-item>
</sl-carousel> </wa-carousel>
``` ```
```jsx:react ```jsx:react
import { SlCarousel, SlCarouselItem } from '@shoelace-style/shoelace/dist/react'; import WaCarousel from '@shoelace-style/shoelace/dist/react/carousel';
import WaCarouselItem from '@shoelace-style/shoelace/dist/react/carousel-item';
const App = () => ( const App = () => (
<SlCarousel pagination> <WaCarousel pagination>
<SlCarouselItem> <WaCarouselItem>
<img <img
alt="The sun shines on the mountains and trees - Photo by Adam Kool on Unsplash" alt="The sun shines on the mountains and trees - Photo by Adam Kool on Unsplash"
src="/assets/examples/carousel/mountains.jpg" src="/assets/examples/carousel/mountains.jpg"
/> />
</SlCarouselItem> </WaCarouselItem>
<SlCarouselItem> <WaCarouselItem>
<img <img
alt="A waterfall in the middle of a forest - Photo by Thomas Kelly on Unsplash" alt="A waterfall in the middle of a forest - Photo by Thomas Kelly on Unsplash"
src="/assets/examples/carousel/waterfall.jpg" src="/assets/examples/carousel/waterfall.jpg"
/> />
</SlCarouselItem> </WaCarouselItem>
<SlCarouselItem> <WaCarouselItem>
<img <img
alt="The sun is setting over a lavender field - Photo by Leonard Cotte on Unsplash" alt="The sun is setting over a lavender field - Photo by Leonard Cotte on Unsplash"
src="/assets/examples/carousel/sunset.jpg" src="/assets/examples/carousel/sunset.jpg"
/> />
</SlCarouselItem> </WaCarouselItem>
<SlCarouselItem> <WaCarouselItem>
<img <img
alt="A field of grass with the sun setting in the background - Photo by Sapan Patel on Unsplash" alt="A field of grass with the sun setting in the background - Photo by Sapan Patel on Unsplash"
src="/assets/examples/carousel/field.jpg" src="/assets/examples/carousel/field.jpg"
/> />
</SlCarouselItem> </WaCarouselItem>
<SlCarouselItem> <WaCarouselItem>
<img <img
alt="A scenic view of a mountain with clouds rolling in - Photo by V2osk on Unsplash" alt="A scenic view of a mountain with clouds rolling in - Photo by V2osk on Unsplash"
src="/assets/examples/carousel/valley.jpg" src="/assets/examples/carousel/valley.jpg"
/> />
</SlCarouselItem> </WaCarouselItem>
</SlCarousel> </WaCarousel>
); );
``` ```

File diff suppressed because it is too large Load Diff

View File

@@ -6,13 +6,13 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-checkbox>Checkbox</sl-checkbox> <wa-checkbox>Checkbox</wa-checkbox>
``` ```
```jsx:react ```jsx:react
import { SlCheckbox } from '@shoelace-style/shoelace/dist/react'; import WaCheckbox from '@shoelace-style/shoelace/dist/react/checkbox';
const App = () => <SlCheckbox>Checkbox</SlCheckbox>; const App = () => <WaCheckbox>Checkbox</WaCheckbox>;
``` ```
:::tip :::tip
@@ -26,13 +26,13 @@ This component works with standard `<form>` elements. Please refer to the sectio
Use the `checked` attribute to activate the checkbox. Use the `checked` attribute to activate the checkbox.
```html:preview ```html:preview
<sl-checkbox checked>Checked</sl-checkbox> <wa-checkbox checked>Checked</wa-checkbox>
``` ```
```jsx:react ```jsx:react
import { SlCheckbox } from '@shoelace-style/shoelace/dist/react'; import WaCheckbox from '@shoelace-style/shoelace/dist/react/checkbox';
const App = () => <SlCheckbox checked>Checked</SlCheckbox>; const App = () => <WaCheckbox checked>Checked</WaCheckbox>;
``` ```
### Indeterminate ### Indeterminate
@@ -40,13 +40,13 @@ const App = () => <SlCheckbox checked>Checked</SlCheckbox>;
Use the `indeterminate` attribute to make the checkbox indeterminate. Use the `indeterminate` attribute to make the checkbox indeterminate.
```html:preview ```html:preview
<sl-checkbox indeterminate>Indeterminate</sl-checkbox> <wa-checkbox indeterminate>Indeterminate</wa-checkbox>
``` ```
```jsx:react ```jsx:react
import { SlCheckbox } from '@shoelace-style/shoelace/dist/react'; import WaCheckbox from '@shoelace-style/shoelace/dist/react/checkbox';
const App = () => <SlCheckbox indeterminate>Indeterminate</SlCheckbox>; const App = () => <WaCheckbox indeterminate>Indeterminate</WaCheckbox>;
``` ```
### Disabled ### Disabled
@@ -54,13 +54,13 @@ const App = () => <SlCheckbox indeterminate>Indeterminate</SlCheckbox>;
Use the `disabled` attribute to disable the checkbox. Use the `disabled` attribute to disable the checkbox.
```html:preview ```html:preview
<sl-checkbox disabled>Disabled</sl-checkbox> <wa-checkbox disabled>Disabled</wa-checkbox>
``` ```
```jsx:react ```jsx:react
import { SlCheckbox } from '@shoelace-style/shoelace/dist/react'; import WaCheckbox from '@shoelace-style/shoelace/dist/react/checkbox';
const App = () => <SlCheckbox disabled>Disabled</SlCheckbox>; const App = () => <WaCheckbox disabled>Disabled</WaCheckbox>;
``` ```
### Sizes ### Sizes
@@ -68,23 +68,23 @@ const App = () => <SlCheckbox disabled>Disabled</SlCheckbox>;
Use the `size` attribute to change a checkbox's size. Use the `size` attribute to change a checkbox's size.
```html:preview ```html:preview
<sl-checkbox size="small">Small</sl-checkbox> <wa-checkbox size="small">Small</wa-checkbox>
<br /> <br />
<sl-checkbox size="medium">Medium</sl-checkbox> <wa-checkbox size="medium">Medium</wa-checkbox>
<br /> <br />
<sl-checkbox size="large">Large</sl-checkbox> <wa-checkbox size="large">Large</wa-checkbox>
``` ```
```jsx:react ```jsx:react
import { SlCheckbox } from '@shoelace-style/shoelace/dist/react'; import WaCheckbox from '@shoelace-style/shoelace/dist/react/checkbox';
const App = () => ( const App = () => (
<> <>
<SlCheckbox size="small">Small</SlCheckbox> <WaCheckbox size="small">Small</WaCheckbox>
<br /> <br />
<SlCheckbox size="medium">Medium</SlCheckbox> <WaCheckbox size="medium">Medium</WaCheckbox>
<br /> <br />
<SlCheckbox size="large">Large</SlCheckbox> <WaCheckbox size="large">Large</WaCheckbox>
</> </>
); );
``` ```
@@ -95,30 +95,32 @@ Use the `setCustomValidity()` method to set a custom validation message. This wi
```html:preview ```html:preview
<form class="custom-validity"> <form class="custom-validity">
<sl-checkbox>Check me</sl-checkbox> <wa-checkbox>Check me</wa-checkbox>
<br /> <br />
<sl-button type="submit" variant="primary" style="margin-top: 1rem;">Submit</sl-button> <wa-button type="submit" variant="brand" style="margin-top: 1rem;">Submit</wa-button>
</form> </form>
<script> <script>
const form = document.querySelector('.custom-validity'); const form = document.querySelector('.custom-validity');
const checkbox = form.querySelector('sl-checkbox'); const checkbox = form.querySelector('wa-checkbox');
const errorMessage = `Don't forget to check me!`; const errorMessage = `Don't forget to check me!`;
// Set initial validity as soon as the element is defined // Set initial validity as soon as the element is defined
customElements.whenDefined('sl-checkbox').then(async () => { customElements.whenDefined('wa-checkbox').then(async () => {
await checkbox.updateComplete; await checkbox.updateComplete;
checkbox.setCustomValidity(errorMessage); checkbox.setCustomValidity(errorMessage);
}); });
// Update validity on change // Update validity on change
checkbox.addEventListener('sl-change', () => { checkbox.addEventListener('wa-change', () => {
checkbox.setCustomValidity(checkbox.checked ? '' : errorMessage); checkbox.setCustomValidity(checkbox.checked ? '' : errorMessage);
}); });
// Handle submit // Handle submit
form.addEventListener('submit', event => { customElements.whenDefined('wa-checkbox').then(() => {
event.preventDefault(); form.addEventListener('submit', event => {
alert('All fields are valid!'); event.preventDefault();
alert('All fields are valid!');
});
}); });
</script> </script>
``` ```
@@ -127,7 +129,8 @@ Use the `setCustomValidity()` method to set a custom validation message. This wi
```jsx:react ```jsx:react
import { useEffect, useRef } from 'react'; import { useEffect, useRef } from 'react';
import { SlButton, SlCheckbox } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaCheckbox from '@shoelace-style/shoelace/dist/react/checkbox';
const App = () => { const App = () => {
const checkbox = useRef(null); const checkbox = useRef(null);
@@ -148,13 +151,13 @@ const App = () => {
return ( return (
<form class="custom-validity" onSubmit={handleSubmit}> <form class="custom-validity" onSubmit={handleSubmit}>
<SlCheckbox ref={checkbox} onSlChange={handleChange}> <WaCheckbox ref={checkbox} onWaChange={handleChange}>
Check me Check me
</SlCheckbox> </WaCheckbox>
<br /> <br />
<SlButton type="submit" variant="primary" style={{ marginTop: '1rem' }}> <WaButton type="submit" variant="brand" style={{ marginTop: '1rem' }}>
Submit Submit
</SlButton> </WaButton>
</form> </form>
); );
}; };

View File

@@ -6,13 +6,13 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-color-picker label="Select a color"></sl-color-picker> <wa-color-picker label="Select a color"></wa-color-picker>
``` ```
```jsx:react ```jsx:react
import { SlColorPicker } from '@shoelace-style/shoelace/dist/react'; import WaColorPicker from '@shoelace-style/shoelace/dist/react/color-picker';
const App = () => <SlColorPicker label="Select a color" />; const App = () => <WaColorPicker label="Select a color" />;
``` ```
:::tip :::tip
@@ -26,13 +26,13 @@ This component works with standard `<form>` elements. Please refer to the sectio
Use the `value` attribute to set an initial value for the color picker. Use the `value` attribute to set an initial value for the color picker.
```html:preview ```html:preview
<sl-color-picker value="#4a90e2" label="Select a color"></sl-color-picker> <wa-color-picker value="#4a90e2" label="Select a color"></wa-color-picker>
``` ```
```jsx:react ```jsx:react
import { SlColorPicker } from '@shoelace-style/shoelace/dist/react'; import WaColorPicker from '@shoelace-style/shoelace/dist/react/color-picker';
const App = () => <SlColorPicker value="#4a90e2" label="Select a color" />; const App = () => <WaColorPicker value="#4a90e2" label="Select a color" />;
``` ```
### Opacity ### Opacity
@@ -40,13 +40,13 @@ const App = () => <SlColorPicker value="#4a90e2" label="Select a color" />;
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`. 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:preview ```html:preview
<sl-color-picker value="#f5a623ff" opacity label="Select a color"></sl-color-picker> <wa-color-picker value="#f5a623ff" opacity label="Select a color"></wa-color-picker>
``` ```
```jsx:react ```jsx:react
import { SlColorPicker } from '@shoelace-style/shoelace/dist/react'; import WaColorPicker from '@shoelace-style/shoelace/dist/react/color-picker';
const App = () => <SlColorPicker opacity label="Select a color" />; const App = () => <WaColorPicker opacity label="Select a color" />;
``` ```
### Formats ### Formats
@@ -56,21 +56,21 @@ Set the color picker's format with the `format` attribute. Valid options include
To prevent users from toggling the format themselves, add the `no-format-toggle` attribute. To prevent users from toggling the format themselves, add the `no-format-toggle` attribute.
```html:preview ```html:preview
<sl-color-picker format="hex" value="#4a90e2" label="Select a color"></sl-color-picker> <wa-color-picker format="hex" value="#4a90e2" label="Select a color"></wa-color-picker>
<sl-color-picker format="rgb" value="rgb(80, 227, 194)" label="Select a color"></sl-color-picker> <wa-color-picker format="rgb" value="rgb(80, 227, 194)" label="Select a color"></wa-color-picker>
<sl-color-picker format="hsl" value="hsl(290, 87%, 47%)" label="Select a color"></sl-color-picker> <wa-color-picker format="hsl" value="hsl(290, 87%, 47%)" label="Select a color"></wa-color-picker>
<sl-color-picker format="hsv" value="hsv(55, 89%, 97%)" label="Select a color"></sl-color-picker> <wa-color-picker format="hsv" value="hsv(55, 89%, 97%)" label="Select a color"></wa-color-picker>
``` ```
```jsx:react ```jsx:react
import { SlColorPicker } from '@shoelace-style/shoelace/dist/react'; import WaColorPicker from '@shoelace-style/shoelace/dist/react/color-picker';
const App = () => ( const App = () => (
<> <>
<SlColorPicker format="hex" value="#4a90e2" /> <WaColorPicker format="hex" value="#4a90e2" />
<SlColorPicker format="rgb" value="rgb(80, 227, 194)" /> <WaColorPicker format="rgb" value="rgb(80, 227, 194)" />
<SlColorPicker format="hsl" value="hsl(290, 87%, 47%)" /> <WaColorPicker format="hsl" value="hsl(290, 87%, 47%)" />
<SlColorPicker format="hsv" value="hsv(55, 89%, 97%)" /> <WaColorPicker format="hsv" value="hsv(55, 89%, 97%)" />
</> </>
); );
``` ```
@@ -80,20 +80,20 @@ const App = () => (
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. 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:preview ```html:preview
<sl-color-picker <wa-color-picker
label="Select a color" label="Select a color"
swatches=" swatches="
#d0021b; #f5a623; #f8e71c; #8b572a; #7ed321; #417505; #bd10e0; #9013fe; #d0021b; #f5a623; #f8e71c; #8b572a; #7ed321; #417505; #bd10e0; #9013fe;
#4a90e2; #50e3c2; #b8e986; #000; #444; #888; #ccc; #fff; #4a90e2; #50e3c2; #b8e986; #000; #444; #888; #ccc; #fff;
" "
></sl-color-picker> ></wa-color-picker>
``` ```
```jsx:react ```jsx:react
import { SlColorPicker } from '@shoelace-style/shoelace/dist/react'; import WaColorPicker from '@shoelace-style/shoelace/dist/react/color-picker';
const App = () => ( const App = () => (
<SlColorPicker <WaColorPicker
label="Select a color" label="Select a color"
swatches=" swatches="
#d0021b; #f5a623; #f8e71c; #8b572a; #7ed321; #417505; #bd10e0; #9013fe; #d0021b; #f5a623; #f8e71c; #8b572a; #7ed321; #417505; #bd10e0; #9013fe;
@@ -108,19 +108,19 @@ const App = () => (
Use the `size` attribute to change the color picker's trigger size. Use the `size` attribute to change the color picker's trigger size.
```html:preview ```html:preview
<sl-color-picker size="small" label="Select a color"></sl-color-picker> <wa-color-picker size="small" label="Select a color"></wa-color-picker>
<sl-color-picker size="medium" label="Select a color"></sl-color-picker> <wa-color-picker size="medium" label="Select a color"></wa-color-picker>
<sl-color-picker size="large" label="Select a color"></sl-color-picker> <wa-color-picker size="large" label="Select a color"></wa-color-picker>
``` ```
```jsx:react ```jsx:react
import { SlColorPicker } from '@shoelace-style/shoelace/dist/react'; import WaColorPicker from '@shoelace-style/shoelace/dist/react/color-picker';
const App = () => ( const App = () => (
<> <>
<SlColorPicker size="small" label="Select a color" /> <WaColorPicker size="small" label="Select a color" />
<SlColorPicker size="medium" label="Select a color" /> <WaColorPicker size="medium" label="Select a color" />
<SlColorPicker size="large" label="Select a color" /> <WaColorPicker size="large" label="Select a color" />
</> </>
); );
``` ```
@@ -130,11 +130,11 @@ const App = () => (
The color picker can be rendered inline instead of in a dropdown using the `inline` attribute. The color picker can be rendered inline instead of in a dropdown using the `inline` attribute.
```html:preview ```html:preview
<sl-color-picker inline label="Select a color"></sl-color-picker> <wa-color-picker inline label="Select a color"></wa-color-picker>
``` ```
```jsx:react ```jsx:react
import { SlColorPicker } from '@shoelace-style/shoelace/dist/react'; import WaColorPicker from '@shoelace-style/shoelace/dist/react/color-picker';
const App = () => <SlColorPicker inline label="Select a color" />; const App = () => <WaColorPicker inline label="Select a color" />;
``` ```

View File

@@ -0,0 +1,258 @@
---
meta:
title: Copy Button
description: Copies data to the clipboard when the user clicks the button.
layout: component
---
```html:preview
<wa-copy-button value="Web Awesome rocks!"></wa-copy-button>
```
```jsx:react
import { WaCopyButton } from '@shoelace-style/shoelace/dist/react/copy-button';
const App = () => (
<WaCopyButton value="Web Awesome rocks!" />
);
```
## Examples
### Custom Labels
Copy Buttons display feedback in a tooltip. You can customize the labels using the `copy-label`, `success-label`, and `error-label` attributes.
```html:preview
<wa-copy-button
value="Custom labels are easy"
copy-label="Click to copy"
success-label="You did it!"
error-label="Whoops, your browser doesn't support this!"
></wa-copy-button>
```
```jsx:react
import { WaCopyButton } from '@shoelace-style/shoelace/dist/react/copy-button';
const App = () => (
<WaCopyButton
value="Custom labels are easy"
copy-label="Click to copy"
success-label="You did it!"
error-label="Whoops, your browser doesn't support this!"
/>
);
```
### Custom Icons
Use the `copy-icon`, `success-icon`, and `error-icon` slots to customize the icons that get displayed for each state. You can use [`<wa-icon>`](/components/icon) or your own images.
```html:preview
<wa-copy-button value="Copied from a custom button">
<wa-icon slot="copy-icon" name="clipboard" variant="regular"></wa-icon>
<wa-icon slot="success-icon" name="thumbs-up" variant="solid"></wa-icon>
<wa-icon slot="error-icon" name="xmark" variant="solid"></wa-icon>
</wa-copy-button>
```
```jsx:react
import { WaCopyButton } from '@shoelace-style/shoelace/dist/react/copy-button';
import { WaIcon } from '@shoelace-style/shoelace/dist/react/icon';
const App = () => (
<>
<WaCopyButton value="Copied from a custom button">
<WaIcon slot="copy-icon" name="clipboard" variant="regular" />
<WaIcon slot="success-icon" name="check" variant="solid" />
<WaIcon slot="error-icon" name="xmark" variant="solid" />
</WaCopyButton>
</>
);
```
### Copying Values From Other Elements
Normally, the data that gets copied will come from the component's `value` attribute, but you can copy data from any element within the same document by providing its `id` to the `from` attribute.
When using the `from` attribute, the element's [`textContent`](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) will be copied by default. Passing an attribute or property modifier will let you copy data from one of the element's attributes or properties instead.
To copy data from an attribute, use `from="id[attr]"` where `id` is the id of the target element and `attr` is the name of the attribute you'd like to copy. To copy data from a property, use `from="id.prop"` where `id` is the id of the target element and `prop` is the name of the property you'd like to copy.
```html:preview
<!-- Copies the span's textContent -->
<span id="my-phone">+1 (234) 456-7890</span>
<wa-copy-button from="my-phone"></wa-copy-button>
<br><br>
<!-- Copies the input's "value" property -->
<wa-input id="my-input" type="text" value="User input" style="display: inline-block; max-width: 300px;"></wa-input>
<wa-copy-button from="my-input.value"></wa-copy-button>
<br><br>
<!-- Copies the link's "href" attribute -->
<a id="my-link" href="https://shoelace.style/">Web Awesome Website</a>
<wa-copy-button from="my-link[href]"></wa-copy-button>
```
```jsx:react
import { WaCopyButton } from '@shoelace-style/shoelace/dist/react/copy-button';
import { WaInput } from '@shoelace-style/shoelace/dist/react/input';
const App = () => (
<>
{/* Copies the span's textContent */}
<span id="my-phone">+1 (234) 456-7890</span>
<WaCopyButton from="my-phone" />
<br /><br />
{/* Copies the input's "value" property */}
<WaInput id="my-input" type="text" />
<WaCopyButton from="my-input.value" />
<br /><br />
{/* Copies the link's "href" attribute */}
<a id="my-link" href="https://shoelace.style/">Web Awesome Website</a>
<WaCopyButton from="my-link[href]" />
</>
);
```
### Handling Errors
A copy error will occur if the value is an empty string, if the `from` attribute points to an id that doesn't exist, or if the browser rejects the operation for any reason. When this happens, the `wa-error` event will be emitted.
This example demonstrates what happens when a copy error occurs. You can customize the error label and icon using the `error-label` attribute and the `error-icon` slot, respectively.
```html:preview
<wa-copy-button from="i-do-not-exist"></wa-copy-button>
```
```jsx:react
import { WaCopyButton } from '@shoelace-style/shoelace/dist/react/copy-button';
const App = () => (
<WaCopyButton from="i-do-not-exist" />
);
```
### Disabled
Copy buttons can be disabled by adding the `disabled` attribute.
```html:preview
<wa-copy-button value="You can't copy me" disabled></wa-copy-button>
```
```jsx:react
import { WaCopyButton } from '@shoelace-style/shoelace/dist/react/copy-button';
const App = () => (
<WaCopyButton value="You can't copy me" disabled />
);
```
### Changing Feedback Duration
A success indicator is briefly shown after copying. You can customize the length of time the indicator is shown using the `feedback-duration` attribute.
```html:preview
<wa-copy-button value="Web Awesome rocks!" feedback-duration="250"></wa-copy-button>
```
```jsx:react
import { WaCopyButton } from '@shoelace-style/shoelace/dist/react/copy-button';
const App = () => (
<WaCopyButton value="Web Awesome rocks!" feedback-duration={250} />
);
```
### Custom Styles
You can customize the button to your liking with CSS.
```html:preview
<wa-copy-button value="I'm so stylish" class="custom-styles">
<wa-icon slot="copy-icon" name="clipboard"></wa-icon>
<wa-icon slot="success-icon" name="thumbs-up"></wa-icon>
<wa-icon slot="error-icon" name="thumbs-down"></wa-icon>
</wa-copy-button>
<style>
.custom-styles {
--success-color: white;
--error-color: white;
color: white;
}
.custom-styles::part(button) {
background-color: #ff1493;
border: solid 2px #ff7ac1;
border-right-color: #ad005c;
border-bottom-color: #ad005c;
border-radius: 6px;
transition: var(--wa-transition-normal) all;
}
.custom-styles::part(button):hover {
transform: scale(1.05);
}
.custom-styles::part(button):active {
transform: translateY(1px);
}
.custom-styles::part(button):focus-visible {
outline: dashed 2px deeppink;
outline-offset: 4px;
}
</style>
```
```jsx:react
import { WaCopyButton } from '@shoelace-style/shoelace/dist/react/copy-button';
const css = `
.custom-styles {
--success-color: white;
--error-color: white;
color: white;
}
.custom-styles::part(button) {
background-color: #ff1493;
border: solid 4px #ff7ac1;
border-right-color: #ad005c;
border-bottom-color: #ad005c;
border-radius: 0;
transition: 100ms scale ease-in-out, 100ms translate ease-in-out;
}
.custom-styles::part(button):hover {
scale: 1.1;
}
.custom-styles::part(button):active {
translate: 0 2px;
}
.custom-styles::part(button):focus-visible {
outline: dashed 2px deeppink;
outline-offset: 4px;
}
`;
const App = () => (
<>
<WaCopyButton value="I'm so stylish" className="custom-styles" />
<style>{css}</style>
</>
);
```

View File

@@ -8,20 +8,20 @@ layout: component
<!-- cspell:dictionaries lorem-ipsum --> <!-- cspell:dictionaries lorem-ipsum -->
```html:preview ```html:preview
<sl-details summary="Toggle Me"> <wa-details summary="Toggle Me">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna 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. aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</sl-details> </wa-details>
``` ```
```jsx:react ```jsx:react
import { SlDetails } from '@shoelace-style/shoelace/dist/react'; import WaDetails from '@shoelace-style/shoelace/dist/react/details';
const App = () => ( const App = () => (
<SlDetails summary="Toggle Me"> <WaDetails summary="Toggle Me">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna 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. aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</SlDetails> </WaDetails>
); );
``` ```
@@ -32,20 +32,20 @@ const App = () => (
Use the `disable` attribute to prevent the details from expanding. Use the `disable` attribute to prevent the details from expanding.
```html:preview ```html:preview
<sl-details summary="Disabled" disabled> <wa-details summary="Disabled" disabled>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna 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. aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</sl-details> </wa-details>
``` ```
```jsx:react ```jsx:react
import { SlDetails } from '@shoelace-style/shoelace/dist/react'; import WaDetails from '@shoelace-style/shoelace/dist/react/details';
const App = () => ( const App = () => (
<SlDetails summary="Disabled" disabled> <WaDetails summary="Disabled" disabled>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna 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. aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</SlDetails> </WaDetails>
); );
``` ```
@@ -54,16 +54,16 @@ const App = () => (
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. 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:preview ```html:preview
<sl-details summary="Toggle Me" class="custom-icons"> <wa-details summary="Toggle Me" class="custom-icons">
<sl-icon name="plus-square" slot="expand-icon"></sl-icon> <wa-icon name="square-plus" slot="expand-icon" variant="regular"></wa-icon>
<sl-icon name="dash-square" slot="collapse-icon"></sl-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 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. aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</sl-details> </wa-details>
<style> <style>
sl-details.custom-icons::part(summary-icon) { wa-details.custom-icons::part(summary-icon) {
/* Disable the expand/collapse animation */ /* Disable the expand/collapse animation */
rotate: none; rotate: none;
} }
@@ -71,10 +71,11 @@ Use the `expand-icon` and `collapse-icon` slots to change the expand and collaps
``` ```
```jsx:react ```jsx:react
import { SlDetails, SlIcon } from '@shoelace-style/shoelace/dist/react'; import WaDetails from '@shoelace-style/shoelace/dist/react/details';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
const css = ` const css = `
sl-details.custom-icon::part(summary-icon) { wa-details.custom-icon::part(summary-icon) {
/* Disable the expand/collapse animation */ /* Disable the expand/collapse animation */
rotate: none; rotate: none;
} }
@@ -82,13 +83,13 @@ const css = `
const App = () => ( const App = () => (
<> <>
<SlDetails summary="Toggle Me" class="custom-icon"> <WaDetails summary="Toggle Me" class="custom-icon">
<SlIcon name="plus-square" slot="expand-icon" /> <WaIcon name="square-plus" slot="expand-icon" />
<SlIcon name="dash-square" slot="collapse-icon" /> <WaIcon name="square-minus" slot="collapse-icon" />
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore 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 magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. consequat.
</SlDetails> </WaDetails>
<style>{css}</style> <style>{css}</style>
</> </>
@@ -97,38 +98,40 @@ const App = () => (
### Grouping Details ### 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 `sl-show` event. 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:preview ```html:preview
<div class="details-group-example"> <div class="details-group-example">
<sl-details summary="First" open> <wa-details summary="First" open>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna 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. aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</sl-details> </wa-details>
<sl-details summary="Second"> <wa-details summary="Second">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna 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. aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</sl-details> </wa-details>
<sl-details summary="Third"> <wa-details summary="Third">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna 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. aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</sl-details> </wa-details>
</div> </div>
<script> <script>
const container = document.querySelector('.details-group-example'); const container = document.querySelector('.details-group-example');
// Close all other details when one is shown // Close all other details when one is shown
container.addEventListener('sl-show', event => { container.addEventListener('wa-show', event => {
[...container.querySelectorAll('sl-details')].map(details => (details.open = event.target === details)); if (event.target.localName === 'wa-details') {
[...container.querySelectorAll('wa-details')].map(details => (details.open = event.target === details));
}
}); });
</script> </script>
<style> <style>
.details-group-example sl-details:not(:last-of-type) { .details-group-example wa-details:not(:last-of-type) {
margin-bottom: var(--sl-spacing-2x-small); margin-bottom: var(--wa-space-2xs);
} }
</style> </style>
``` ```

View File

@@ -8,17 +8,17 @@ layout: component
<!-- cspell:dictionaries lorem-ipsum --> <!-- cspell:dictionaries lorem-ipsum -->
```html:preview ```html:preview
<sl-dialog label="Dialog" class="dialog-overview"> <wa-dialog label="Dialog" class="dialog-overview">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<sl-button slot="footer" variant="primary">Close</sl-button> <wa-button slot="footer" variant="brand">Close</wa-button>
</sl-dialog> </wa-dialog>
<sl-button>Open Dialog</sl-button> <wa-button>Open Dialog</wa-button>
<script> <script>
const dialog = document.querySelector('.dialog-overview'); const dialog = document.querySelector('.dialog-overview');
const openButton = dialog.nextElementSibling; const openButton = dialog.nextElementSibling;
const closeButton = dialog.querySelector('sl-button[slot="footer"]'); const closeButton = dialog.querySelector('wa-button[slot="footer"]');
openButton.addEventListener('click', () => dialog.show()); openButton.addEventListener('click', () => dialog.show());
closeButton.addEventListener('click', () => dialog.hide()); closeButton.addEventListener('click', () => dialog.hide());
@@ -27,21 +27,22 @@ layout: component
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlDialog } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDialog from '@shoelace-style/shoelace/dist/react/dialog';
const App = () => { const App = () => {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
return ( return (
<> <>
<SlDialog label="Dialog" open={open} onSlAfterHide={() => setOpen(false)}> <WaDialog label="Dialog" open={open} onWaAfterHide={() => setOpen(false)}>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<SlButton slot="footer" variant="primary" onClick={() => setOpen(false)}> <WaButton slot="footer" variant="brand" onClick={() => setOpen(false)}>
Close Close
</SlButton> </WaButton>
</SlDialog> </WaDialog>
<SlButton onClick={() => setOpen(true)}>Open Dialog</SlButton> <WaButton onClick={() => setOpen(true)}>Open Dialog</WaButton>
</> </>
); );
}; };
@@ -54,17 +55,17 @@ const App = () => {
Use the `--width` custom property to set the dialog's width. Use the `--width` custom property to set the dialog's width.
```html:preview ```html:preview
<sl-dialog label="Dialog" class="dialog-width" style="--width: 50vw;"> <wa-dialog label="Dialog" class="dialog-width" style="--width: 50vw;">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<sl-button slot="footer" variant="primary">Close</sl-button> <wa-button slot="footer" variant="brand">Close</wa-button>
</sl-dialog> </wa-dialog>
<sl-button>Open Dialog</sl-button> <wa-button>Open Dialog</wa-button>
<script> <script>
const dialog = document.querySelector('.dialog-width'); const dialog = document.querySelector('.dialog-width');
const openButton = dialog.nextElementSibling; const openButton = dialog.nextElementSibling;
const closeButton = dialog.querySelector('sl-button[slot="footer"]'); const closeButton = dialog.querySelector('wa-button[slot="footer"]');
openButton.addEventListener('click', () => dialog.show()); openButton.addEventListener('click', () => dialog.show());
closeButton.addEventListener('click', () => dialog.hide()); closeButton.addEventListener('click', () => dialog.hide());
@@ -75,21 +76,22 @@ Use the `--width` custom property to set the dialog's width.
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlDialog } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDialog from '@shoelace-style/shoelace/dist/react/dialog';
const App = () => { const App = () => {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
return ( return (
<> <>
<SlDialog label="Dialog" open={open} style={{ '--width': '50vw' }} onSlAfterHide={() => setOpen(false)}> <WaDialog label="Dialog" open={open} style={{ '--width': '50vw' }} onWaAfterHide={() => setOpen(false)}>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<SlButton slot="footer" variant="primary" onClick={() => setOpen(false)}> <WaButton slot="footer" variant="brand" onClick={() => setOpen(false)}>
Close Close
</SlButton> </WaButton>
</SlDialog> </WaDialog>
<SlButton onClick={() => setOpen(true)}>Open Dialog</SlButton> <WaButton onClick={() => setOpen(true)}>Open Dialog</WaButton>
</> </>
); );
}; };
@@ -102,19 +104,19 @@ const App = () => {
By design, a dialog's height will never exceed that of the viewport. As such, dialogs will not scroll with the page ensuring the header and footer are always accessible to the user. By design, a dialog's height will never exceed that of the viewport. As such, dialogs will not scroll with the page ensuring the header and footer are always accessible to the user.
```html:preview ```html:preview
<sl-dialog label="Dialog" class="dialog-scrolling"> <wa-dialog label="Dialog" class="dialog-scrolling">
<div style="height: 150vh; border: dashed 2px var(--sl-color-neutral-200); padding: 0 1rem;"> <div style="height: 150vh; border: dashed 2px var(--wa-color-surface-border); padding: 0 1rem;">
<p>Scroll down and give it a try! 👇</p> <p>Scroll down and give it a try! 👇</p>
</div> </div>
<sl-button slot="footer" variant="primary">Close</sl-button> <wa-button slot="footer" variant="brand">Close</wa-button>
</sl-dialog> </wa-dialog>
<sl-button>Open Dialog</sl-button> <wa-button>Open Dialog</wa-button>
<script> <script>
const dialog = document.querySelector('.dialog-scrolling'); const dialog = document.querySelector('.dialog-scrolling');
const openButton = dialog.nextElementSibling; const openButton = dialog.nextElementSibling;
const closeButton = dialog.querySelector('sl-button[slot="footer"]'); const closeButton = dialog.querySelector('wa-button[slot="footer"]');
openButton.addEventListener('click', () => dialog.show()); openButton.addEventListener('click', () => dialog.show());
closeButton.addEventListener('click', () => dialog.hide()); closeButton.addEventListener('click', () => dialog.hide());
@@ -125,30 +127,31 @@ By design, a dialog's height will never exceed that of the viewport. As such, di
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlDialog } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDialog from '@shoelace-style/shoelace/dist/react/dialog';
const App = () => { const App = () => {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
return ( return (
<> <>
<SlDialog label="Dialog" open={open} onSlAfterHide={() => setOpen(false)}> <WaDialog label="Dialog" open={open} onWaAfterHide={() => setOpen(false)}>
<div <div
style={{ style={{
height: '150vh', height: '150vh',
border: 'dashed 2px var(--sl-color-neutral-200)', border: 'dashed 2px var(--wa-color-surface-border)',
padding: '0 1rem' padding: '0 1rem'
}} }}
> >
<p>Scroll down and give it a try! 👇</p> <p>Scroll down and give it a try! 👇</p>
</div> </div>
<SlButton slot="footer" variant="primary" onClick={() => setOpen(false)}> <WaButton slot="footer" variant="brand" onClick={() => setOpen(false)}>
Close Close
</SlButton> </WaButton>
</SlDialog> </WaDialog>
<SlButton onClick={() => setOpen(true)}>Open Dialog</SlButton> <WaButton onClick={() => setOpen(true)}>Open Dialog</WaButton>
</> </>
); );
}; };
@@ -161,18 +164,18 @@ const App = () => {
The header shows a functional close button by default. You can use the `header-actions` slot to add additional [icon buttons](/components/icon-button) if needed. The header shows a functional close button by default. You can use the `header-actions` slot to add additional [icon buttons](/components/icon-button) if needed.
```html:preview ```html:preview
<sl-dialog label="Dialog" class="dialog-header-actions"> <wa-dialog label="Dialog" class="dialog-header-actions">
<sl-icon-button class="new-window" slot="header-actions" name="box-arrow-up-right"></sl-icon-button> <wa-icon-button class="new-window" slot="header-actions" name="arrow-up-right-from-square" variant="solid"></wa-icon-button>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<sl-button slot="footer" variant="primary">Close</sl-button> <wa-button slot="footer" variant="brand">Close</wa-button>
</sl-dialog> </wa-dialog>
<sl-button>Open Dialog</sl-button> <wa-button>Open Dialog</wa-button>
<script> <script>
const dialog = document.querySelector('.dialog-header-actions'); const dialog = document.querySelector('.dialog-header-actions');
const openButton = dialog.nextElementSibling; const openButton = dialog.nextElementSibling;
const closeButton = dialog.querySelector('sl-button[slot="footer"]'); const closeButton = dialog.querySelector('wa-button[slot="footer"]');
const newWindowButton = dialog.querySelector('.new-window'); const newWindowButton = dialog.querySelector('.new-window');
openButton.addEventListener('click', () => dialog.show()); openButton.addEventListener('click', () => dialog.show());
@@ -183,27 +186,29 @@ The header shows a functional close button by default. You can use the `header-a
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlDialog, SlIconButton } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDialog from '@shoelace-style/shoelace/dist/react/dialog';
import WaIconButton from '@shoelace-style/shoelace/dist/react/icon-button';
const App = () => { const App = () => {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
return ( return (
<> <>
<SlDialog label="Dialog" open={open} onSlAfterHide={() => setOpen(false)}> <WaDialog label="Dialog" open={open} onWaAfterHide={() => setOpen(false)}>
<SlIconButton <WaIconButton
class="new-window" class="new-window"
slot="header-actions" slot="header-actions"
name="box-arrow-up-right" name="arrow-up-right-from-square"
onClick={() => window.open(location.href)} onClick={() => window.open(location.href)}
/> />
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<SlButton slot="footer" variant="primary" onClick={() => setOpen(false)}> <WaButton slot="footer" variant="brand" onClick={() => setOpen(false)}>
Close Close
</SlButton> </WaButton>
</SlDialog> </WaDialog>
<SlButton onClick={() => setOpen(true)}>Open Dialog</SlButton> <WaButton onClick={() => setOpen(true)}>Open Dialog</WaButton>
</> </>
); );
}; };
@@ -213,28 +218,28 @@ const App = () => {
By default, dialogs will close when the user clicks the close button, clicks the overlay, or presses the [[Escape]] key. In most cases, the default behavior is the best behavior in terms of UX. However, there are situations where this may be undesirable, such as when data loss will occur. By default, dialogs will close when the user clicks the close button, clicks the overlay, or presses the [[Escape]] key. In most cases, the default behavior is the best behavior in terms of UX. However, there are situations where this may be undesirable, such as when data loss will occur.
To keep the dialog open in such cases, you can cancel the `sl-request-close` event. When canceled, the dialog will remain open and pulse briefly to draw the user's attention to it. To keep the dialog open in such cases, you can cancel the `wa-request-close` event. When canceled, the dialog will remain open and pulse briefly to draw the user's attention to it.
You can use `event.detail.source` to determine what triggered the request to close. This example prevents the dialog from closing when the overlay is clicked, but allows the close button or [[Escape]] to dismiss it. You can use `event.detail.source` to determine what triggered the request to close. This example prevents the dialog from closing when the overlay is clicked, but allows the close button or [[Escape]] to dismiss it.
```html:preview ```html:preview
<sl-dialog label="Dialog" class="dialog-deny-close"> <wa-dialog label="Dialog" class="dialog-deny-close">
This dialog will not close when you click on the overlay. This dialog will not close when you click on the overlay.
<sl-button slot="footer" variant="primary">Close</sl-button> <wa-button slot="footer" variant="brand">Close</wa-button>
</sl-dialog> </wa-dialog>
<sl-button>Open Dialog</sl-button> <wa-button>Open Dialog</wa-button>
<script> <script>
const dialog = document.querySelector('.dialog-deny-close'); const dialog = document.querySelector('.dialog-deny-close');
const openButton = dialog.nextElementSibling; const openButton = dialog.nextElementSibling;
const closeButton = dialog.querySelector('sl-button[slot="footer"]'); const closeButton = dialog.querySelector('wa-button[slot="footer"]');
openButton.addEventListener('click', () => dialog.show()); openButton.addEventListener('click', () => dialog.show());
closeButton.addEventListener('click', () => dialog.hide()); closeButton.addEventListener('click', () => dialog.hide());
// Prevent the dialog from closing when the user clicks on the overlay // Prevent the dialog from closing when the user clicks on the overlay
dialog.addEventListener('sl-request-close', event => { dialog.addEventListener('wa-request-close', event => {
if (event.detail.source === 'overlay') { if (event.detail.source === 'overlay') {
event.preventDefault(); event.preventDefault();
} }
@@ -244,7 +249,8 @@ You can use `event.detail.source` to determine what triggered the request to clo
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlDialog } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDialog from '@shoelace-style/shoelace/dist/react/dialog';
const App = () => { const App = () => {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
@@ -258,14 +264,14 @@ const App = () => {
return ( return (
<> <>
<SlDialog label="Dialog" open={open} onSlRequestClose={handleRequestClose} onSlAfterHide={() => setOpen(false)}> <WaDialog label="Dialog" open={open} onWaRequestClose={handleRequestClose} onWaAfterHide={() => setOpen(false)}>
This dialog will not close when you click on the overlay. This dialog will not close when you click on the overlay.
<SlButton slot="footer" variant="primary" onClick={() => setOpen(false)}> <WaButton slot="footer" variant="brand" onClick={() => setOpen(false)}>
Close Close
</SlButton> </WaButton>
</SlDialog> </WaDialog>
<SlButton onClick={() => setOpen(true)}>Open Dialog</SlButton> <WaButton onClick={() => setOpen(true)}>Open Dialog</WaButton>
</> </>
); );
}; };
@@ -276,18 +282,18 @@ const App = () => {
By default, the dialog's panel will gain focus when opened. This allows a subsequent tab press to focus on the first tabbable element in the dialog. If you want a different element to have focus, add the `autofocus` attribute to it as shown below. By default, the dialog's panel will gain focus when opened. This allows a subsequent tab press to focus on the first tabbable element in the dialog. If you want a different element to have focus, add the `autofocus` attribute to it as shown below.
```html:preview ```html:preview
<sl-dialog label="Dialog" class="dialog-focus"> <wa-dialog label="Dialog" class="dialog-focus">
<sl-input autofocus placeholder="I will have focus when the dialog is opened"></sl-input> <wa-input autofocus placeholder="I will have focus when the dialog is opened"></wa-input>
<sl-button slot="footer" variant="primary">Close</sl-button> <wa-button slot="footer" variant="brand">Close</wa-button>
</sl-dialog> </wa-dialog>
<sl-button>Open Dialog</sl-button> <wa-button>Open Dialog</wa-button>
<script> <script>
const dialog = document.querySelector('.dialog-focus'); const dialog = document.querySelector('.dialog-focus');
const input = dialog.querySelector('sl-input'); const input = dialog.querySelector('wa-input');
const openButton = dialog.nextElementSibling; const openButton = dialog.nextElementSibling;
const closeButton = dialog.querySelector('sl-button[slot="footer"]'); const closeButton = dialog.querySelector('wa-button[slot="footer"]');
openButton.addEventListener('click', () => dialog.show()); openButton.addEventListener('click', () => dialog.show());
closeButton.addEventListener('click', () => dialog.hide()); closeButton.addEventListener('click', () => dialog.hide());
@@ -296,26 +302,28 @@ By default, the dialog's panel will gain focus when opened. This allows a subseq
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlDialog, SlInput } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDialog from '@shoelace-style/shoelace/dist/react/dialog';
import WaInput from '@shoelace-style/shoelace/dist/react/input';
const App = () => { const App = () => {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
return ( return (
<> <>
<SlDialog label="Dialog" open={open} onSlAfterHide={() => setOpen(false)}> <WaDialog label="Dialog" open={open} onWaAfterHide={() => setOpen(false)}>
<SlInput autofocus placeholder="I will have focus when the dialog is opened" /> <WaInput autofocus placeholder="I will have focus when the dialog is opened" />
<SlButton slot="footer" variant="primary" onClick={() => setOpen(false)}> <WaButton slot="footer" variant="brand" onClick={() => setOpen(false)}>
Close Close
</SlButton> </WaButton>
</SlDialog> </WaDialog>
<SlButton onClick={() => setOpen(true)}>Open Dialog</SlButton> <WaButton onClick={() => setOpen(true)}>Open Dialog</WaButton>
</> </>
); );
}; };
``` ```
:::tip :::tip
You can further customize initial focus behavior by canceling the `sl-initial-focus` event and setting focus yourself inside the event handler. You can further customize initial focus behavior by canceling the `wa-initial-focus` event and setting focus yourself inside the event handler.
::: :::

View File

@@ -6,13 +6,13 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-divider></sl-divider> <wa-divider></wa-divider>
``` ```
```jsx:react ```jsx:react
import { SlDivider } from '@shoelace-style/shoelace/dist/react'; import WaDivider from '@shoelace-style/shoelace/dist/react/divider';
const App = () => <SlDivider />; const App = () => <WaDivider />;
``` ```
## Examples ## Examples
@@ -22,15 +22,15 @@ const App = () => <SlDivider />;
Use the `--width` custom property to change the width of the divider. Use the `--width` custom property to change the width of the divider.
```html:preview ```html:preview
<sl-divider style="--width: 4px;"></sl-divider> <wa-divider style="--width: 4px;"></wa-divider>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlDivider } from '@shoelace-style/shoelace/dist/react'; import WaDivider from '@shoelace-style/shoelace/dist/react/divider';
const App = () => <SlDivider style={{ '--width': '4px' }} />; const App = () => <WaDivider style={{ '--width': '4px' }} />;
``` ```
{% endraw %} {% endraw %}
@@ -40,15 +40,15 @@ const App = () => <SlDivider style={{ '--width': '4px' }} />;
Use the `--color` custom property to change the color of the divider. Use the `--color` custom property to change the color of the divider.
```html:preview ```html:preview
<sl-divider style="--color: tomato;"></sl-divider> <wa-divider style="--color: tomato;"></wa-divider>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlDivider } from '@shoelace-style/shoelace/dist/react'; import WaDivider from '@shoelace-style/shoelace/dist/react/divider';
const App = () => <SlDivider style={{ '--color': 'tomato' }} />; const App = () => <WaDivider style={{ '--color': 'tomato' }} />;
``` ```
{% endraw %} {% endraw %}
@@ -60,7 +60,7 @@ Use the `--spacing` custom property to change the amount of space between the di
```html:preview ```html:preview
<div style="text-align: center;"> <div style="text-align: center;">
Above Above
<sl-divider style="--spacing: 2rem;"></sl-divider> <wa-divider style="--spacing: 2rem;"></wa-divider>
Below Below
</div> </div>
``` ```
@@ -68,12 +68,12 @@ Use the `--spacing` custom property to change the amount of space between the di
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlDivider } from '@shoelace-style/shoelace/dist/react'; import WaDivider from '@shoelace-style/shoelace/dist/react/divider';
const App = () => ( const App = () => (
<> <>
Above Above
<SlDivider style={{ '--spacing': '2rem' }} /> <WaDivider style={{ '--spacing': '2rem' }} />
Below Below
</> </>
); );
@@ -88,9 +88,9 @@ Add the `vertical` attribute to draw the divider in a vertical orientation. The
```html:preview ```html:preview
<div style="display: flex; align-items: center; height: 2rem;"> <div style="display: flex; align-items: center; height: 2rem;">
First First
<sl-divider vertical></sl-divider> <wa-divider vertical></wa-divider>
Middle Middle
<sl-divider vertical></sl-divider> <wa-divider vertical></wa-divider>
Last Last
</div> </div>
``` ```
@@ -98,7 +98,7 @@ Add the `vertical` attribute to draw the divider in a vertical orientation. The
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlDivider } from '@shoelace-style/shoelace/dist/react'; import WaDivider from '@shoelace-style/shoelace/dist/react/divider';
const App = () => ( const App = () => (
<div <div
@@ -109,9 +109,9 @@ const App = () => (
}} }}
> >
First First
<SlDivider vertical /> <WaDivider vertical />
Middle Middle
<SlDivider vertical /> <WaDivider vertical />
Last Last
</div> </div>
); );
@@ -124,32 +124,34 @@ const App = () => (
Use dividers in [menus](/components/menu) to visually group menu items. Use dividers in [menus](/components/menu) to visually group menu items.
```html:preview ```html:preview
<sl-menu style="max-width: 200px;"> <wa-menu style="max-width: 200px;">
<sl-menu-item value="1">Option 1</sl-menu-item> <wa-menu-item value="1">Option 1</wa-menu-item>
<sl-menu-item value="2">Option 2</sl-menu-item> <wa-menu-item value="2">Option 2</wa-menu-item>
<sl-menu-item value="3">Option 3</sl-menu-item> <wa-menu-item value="3">Option 3</wa-menu-item>
<sl-divider></sl-divider> <wa-divider></wa-divider>
<sl-menu-item value="4">Option 4</sl-menu-item> <wa-menu-item value="4">Option 4</wa-menu-item>
<sl-menu-item value="5">Option 5</sl-menu-item> <wa-menu-item value="5">Option 5</wa-menu-item>
<sl-menu-item value="6">Option 6</sl-menu-item> <wa-menu-item value="6">Option 6</wa-menu-item>
</sl-menu> </wa-menu>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlDivider, SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react'; import WaDivider from '@shoelace-style/shoelace/dist/react/divider';
import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const App = () => ( const App = () => (
<SlMenu style={{ maxWidth: '200px' }}> <WaMenu style={{ maxWidth: '200px' }}>
<SlMenuItem value="1">Option 1</SlMenuItem> <WaMenuItem value="1">Option 1</WaMenuItem>
<SlMenuItem value="2">Option 2</SlMenuItem> <WaMenuItem value="2">Option 2</WaMenuItem>
<SlMenuItem value="3">Option 3</SlMenuItem> <WaMenuItem value="3">Option 3</WaMenuItem>
<sl-divider /> <wa-divider />
<SlMenuItem value="4">Option 4</SlMenuItem> <WaMenuItem value="4">Option 4</WaMenuItem>
<SlMenuItem value="5">Option 5</SlMenuItem> <WaMenuItem value="5">Option 5</WaMenuItem>
<SlMenuItem value="6">Option 6</SlMenuItem> <WaMenuItem value="6">Option 6</WaMenuItem>
</SlMenu> </WaMenu>
); );
``` ```

View File

@@ -8,17 +8,17 @@ layout: component
<!-- cspell:dictionaries lorem-ipsum --> <!-- cspell:dictionaries lorem-ipsum -->
```html:preview ```html:preview
<sl-drawer label="Drawer" class="drawer-overview"> <wa-drawer label="Drawer" class="drawer-overview">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<sl-button slot="footer" variant="primary">Close</sl-button> <wa-button slot="footer" variant="brand">Close</wa-button>
</sl-drawer> </wa-drawer>
<sl-button>Open Drawer</sl-button> <wa-button>Open Drawer</wa-button>
<script> <script>
const drawer = document.querySelector('.drawer-overview'); const drawer = document.querySelector('.drawer-overview');
const openButton = drawer.nextElementSibling; const openButton = drawer.nextElementSibling;
const closeButton = drawer.querySelector('sl-button[variant="primary"]'); const closeButton = drawer.querySelector('wa-button[variant="brand"]');
openButton.addEventListener('click', () => drawer.show()); openButton.addEventListener('click', () => drawer.show());
closeButton.addEventListener('click', () => drawer.hide()); closeButton.addEventListener('click', () => drawer.hide());
@@ -27,21 +27,22 @@ layout: component
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlDrawer } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDrawer from '@shoelace-style/shoelace/dist/react/drawer';
const App = () => { const App = () => {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
return ( return (
<> <>
<SlDrawer label="Drawer" open={open} onSlAfterHide={() => setOpen(false)}> <WaDrawer label="Drawer" open={open} onWaAfterHide={() => setOpen(false)}>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<SlButton slot="footer" variant="primary" onClick={() => setOpen(false)}> <WaButton slot="footer" variant="brand" onClick={() => setOpen(false)}>
Close Close
</SlButton> </WaButton>
</SlDrawer> </WaDrawer>
<SlButton onClick={() => setOpen(true)}>Open Drawer</SlButton> <WaButton onClick={() => setOpen(true)}>Open Drawer</WaButton>
</> </>
); );
}; };
@@ -54,17 +55,17 @@ const App = () => {
By default, drawers slide in from the end. To make the drawer slide in from the start, set the `placement` attribute to `start`. By default, drawers slide in from the end. To make the drawer slide in from the start, set the `placement` attribute to `start`.
```html:preview ```html:preview
<sl-drawer label="Drawer" placement="start" class="drawer-placement-start"> <wa-drawer label="Drawer" placement="start" class="drawer-placement-start">
This drawer slides in from the start. This drawer slides in from the start.
<sl-button slot="footer" variant="primary">Close</sl-button> <wa-button slot="footer" variant="brand">Close</wa-button>
</sl-drawer> </wa-drawer>
<sl-button>Open Drawer</sl-button> <wa-button>Open Drawer</wa-button>
<script> <script>
const drawer = document.querySelector('.drawer-placement-start'); const drawer = document.querySelector('.drawer-placement-start');
const openButton = drawer.nextElementSibling; const openButton = drawer.nextElementSibling;
const closeButton = drawer.querySelector('sl-button[variant="primary"]'); const closeButton = drawer.querySelector('wa-button[variant="brand"]');
openButton.addEventListener('click', () => drawer.show()); openButton.addEventListener('click', () => drawer.show());
closeButton.addEventListener('click', () => drawer.hide()); closeButton.addEventListener('click', () => drawer.hide());
@@ -73,21 +74,22 @@ By default, drawers slide in from the end. To make the drawer slide in from the
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlDrawer } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDrawer from '@shoelace-style/shoelace/dist/react/drawer';
const App = () => { const App = () => {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
return ( return (
<> <>
<SlDrawer label="Drawer" placement="start" open={open} onSlAfterHide={() => setOpen(false)}> <WaDrawer label="Drawer" placement="start" open={open} onWaAfterHide={() => setOpen(false)}>
This drawer slides in from the start. This drawer slides in from the start.
<SlButton slot="footer" variant="primary" onClick={() => setOpen(false)}> <WaButton slot="footer" variant="brand" onClick={() => setOpen(false)}>
Close Close
</SlButton> </WaButton>
</SlDrawer> </WaDrawer>
<SlButton onClick={() => setOpen(true)}>Open Drawer</SlButton> <WaButton onClick={() => setOpen(true)}>Open Drawer</WaButton>
</> </>
); );
}; };
@@ -98,17 +100,17 @@ const App = () => {
To make the drawer slide in from the top, set the `placement` attribute to `top`. To make the drawer slide in from the top, set the `placement` attribute to `top`.
```html:preview ```html:preview
<sl-drawer label="Drawer" placement="top" class="drawer-placement-top"> <wa-drawer label="Drawer" placement="top" class="drawer-placement-top">
This drawer slides in from the top. This drawer slides in from the top.
<sl-button slot="footer" variant="primary">Close</sl-button> <wa-button slot="footer" variant="brand">Close</wa-button>
</sl-drawer> </wa-drawer>
<sl-button>Open Drawer</sl-button> <wa-button>Open Drawer</wa-button>
<script> <script>
const drawer = document.querySelector('.drawer-placement-top'); const drawer = document.querySelector('.drawer-placement-top');
const openButton = drawer.nextElementSibling; const openButton = drawer.nextElementSibling;
const closeButton = drawer.querySelector('sl-button[variant="primary"]'); const closeButton = drawer.querySelector('wa-button[variant="brand"]');
openButton.addEventListener('click', () => drawer.show()); openButton.addEventListener('click', () => drawer.show());
closeButton.addEventListener('click', () => drawer.hide()); closeButton.addEventListener('click', () => drawer.hide());
@@ -117,21 +119,22 @@ To make the drawer slide in from the top, set the `placement` attribute to `top`
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlDrawer } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDrawer from '@shoelace-style/shoelace/dist/react/drawer';
const App = () => { const App = () => {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
return ( return (
<> <>
<SlDrawer label="Drawer" placement="top" open={open} onSlAfterHide={() => setOpen(false)}> <WaDrawer label="Drawer" placement="top" open={open} onWaAfterHide={() => setOpen(false)}>
This drawer slides in from the top. This drawer slides in from the top.
<SlButton slot="footer" variant="primary" onClick={() => setOpen(false)}> <WaButton slot="footer" variant="brand" onClick={() => setOpen(false)}>
Close Close
</SlButton> </WaButton>
</SlDrawer> </WaDrawer>
<SlButton onClick={() => setOpen(true)}>Open Drawer</SlButton> <WaButton onClick={() => setOpen(true)}>Open Drawer</WaButton>
</> </>
); );
}; };
@@ -142,17 +145,17 @@ const App = () => {
To make the drawer slide in from the bottom, set the `placement` attribute to `bottom`. To make the drawer slide in from the bottom, set the `placement` attribute to `bottom`.
```html:preview ```html:preview
<sl-drawer label="Drawer" placement="bottom" class="drawer-placement-bottom"> <wa-drawer label="Drawer" placement="bottom" class="drawer-placement-bottom">
This drawer slides in from the bottom. This drawer slides in from the bottom.
<sl-button slot="footer" variant="primary">Close</sl-button> <wa-button slot="footer" variant="brand">Close</wa-button>
</sl-drawer> </wa-drawer>
<sl-button>Open Drawer</sl-button> <wa-button>Open Drawer</wa-button>
<script> <script>
const drawer = document.querySelector('.drawer-placement-bottom'); const drawer = document.querySelector('.drawer-placement-bottom');
const openButton = drawer.nextElementSibling; const openButton = drawer.nextElementSibling;
const closeButton = drawer.querySelector('sl-button[variant="primary"]'); const closeButton = drawer.querySelector('wa-button[variant="brand"]');
openButton.addEventListener('click', () => drawer.show()); openButton.addEventListener('click', () => drawer.show());
closeButton.addEventListener('click', () => drawer.hide()); closeButton.addEventListener('click', () => drawer.hide());
@@ -161,21 +164,22 @@ To make the drawer slide in from the bottom, set the `placement` attribute to `b
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlDrawer } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDrawer from '@shoelace-style/shoelace/dist/react/drawer';
const App = () => { const App = () => {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
return ( return (
<> <>
<SlDrawer label="Drawer" placement="bottom" open={open} onSlAfterHide={() => setOpen(false)}> <WaDrawer label="Drawer" placement="bottom" open={open} onWaAfterHide={() => setOpen(false)}>
This drawer slides in from the bottom. This drawer slides in from the bottom.
<SlButton slot="footer" variant="primary" onClick={() => setOpen(false)}> <WaButton slot="footer" variant="brand" onClick={() => setOpen(false)}>
Close Close
</SlButton> </WaButton>
</SlDrawer> </WaDrawer>
<SlButton onClick={() => setOpen(true)}>Open Drawer</SlButton> <WaButton onClick={() => setOpen(true)}>Open Drawer</WaButton>
</> </>
); );
}; };
@@ -189,22 +193,22 @@ Unlike normal drawers, contained drawers are not modal. This means they do not s
```html:preview ```html:preview
<div <div
style="position: relative; border: solid 2px var(--sl-panel-border-color); height: 300px; padding: 1rem; margin-bottom: 1rem;" style="position: relative; border: solid 2px var(--wa-color-surface-border); height: 300px; padding: 1rem; margin-bottom: 1rem;"
> >
The drawer will be contained to this box. This content won't shift or be affected in any way when the drawer opens. The drawer will be contained to this box. This content won't shift or be affected in any way when the drawer opens.
<sl-drawer label="Drawer" contained class="drawer-contained" style="--size: 50%;"> <wa-drawer label="Drawer" contained class="drawer-contained" style="--size: 50%;">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<sl-button slot="footer" variant="primary">Close</sl-button> <wa-button slot="footer" variant="brand">Close</wa-button>
</sl-drawer> </wa-drawer>
</div> </div>
<sl-button>Toggle Drawer</sl-button> <wa-button>Toggle Drawer</wa-button>
<script> <script>
const drawer = document.querySelector('.drawer-contained'); const drawer = document.querySelector('.drawer-contained');
const openButton = drawer.parentElement.nextElementSibling; const openButton = drawer.parentElement.nextElementSibling;
const closeButton = drawer.querySelector('sl-button[variant="primary"]'); const closeButton = drawer.querySelector('wa-button[variant="brand"]');
openButton.addEventListener('click', () => (drawer.open = !drawer.open)); openButton.addEventListener('click', () => (drawer.open = !drawer.open));
closeButton.addEventListener('click', () => drawer.hide()); closeButton.addEventListener('click', () => drawer.hide());
@@ -215,7 +219,8 @@ Unlike normal drawers, contained drawers are not modal. This means they do not s
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlDrawer } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDrawer from '@shoelace-style/shoelace/dist/react/drawer';
const App = () => { const App = () => {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
@@ -225,7 +230,7 @@ const App = () => {
<div <div
style={{ style={{
position: 'relative', position: 'relative',
border: 'solid 2px var(--sl-panel-border-color)', border: 'solid 2px var(--wa-color-surface-border)',
height: '300px', height: '300px',
padding: '1rem', padding: '1rem',
marginBottom: '1rem' marginBottom: '1rem'
@@ -233,22 +238,22 @@ const App = () => {
> >
The drawer will be contained to this box. This content won't shift or be affected in any way when the drawer The drawer will be contained to this box. This content won't shift or be affected in any way when the drawer
opens. opens.
<SlDrawer <WaDrawer
label="Drawer" label="Drawer"
contained contained
no-modal no-modal
open={open} open={open}
onSlAfterHide={() => setOpen(false)} onWaAfterHide={() => setOpen(false)}
style={{ '--size': '50%' }} style={{ '--size': '50%' }}
> >
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<SlButton slot="footer" variant="primary" onClick={() => setOpen(false)}> <WaButton slot="footer" variant="brand" onClick={() => setOpen(false)}>
Close Close
</SlButton> </WaButton>
</SlDrawer> </WaDrawer>
</div> </div>
<SlButton onClick={() => setOpen(true)}>Open Drawer</SlButton> <WaButton onClick={() => setOpen(true)}>Open Drawer</WaButton>
</> </>
); );
}; };
@@ -261,17 +266,17 @@ const App = () => {
Use the `--size` custom property to set the drawer's size. This will be applied to the drawer's width or height depending on its `placement`. Use the `--size` custom property to set the drawer's size. This will be applied to the drawer's width or height depending on its `placement`.
```html:preview ```html:preview
<sl-drawer label="Drawer" class="drawer-custom-size" style="--size: 50vw;"> <wa-drawer label="Drawer" class="drawer-custom-size" style="--size: 50vw;">
This drawer is always 50% of the viewport. This drawer is always 50% of the viewport.
<sl-button slot="footer" variant="primary">Close</sl-button> <wa-button slot="footer" variant="brand">Close</wa-button>
</sl-drawer> </wa-drawer>
<sl-button>Open Drawer</sl-button> <wa-button>Open Drawer</wa-button>
<script> <script>
const drawer = document.querySelector('.drawer-custom-size'); const drawer = document.querySelector('.drawer-custom-size');
const openButton = drawer.nextElementSibling; const openButton = drawer.nextElementSibling;
const closeButton = drawer.querySelector('sl-button[variant="primary"]'); const closeButton = drawer.querySelector('wa-button[variant="brand"]');
openButton.addEventListener('click', () => drawer.show()); openButton.addEventListener('click', () => drawer.show());
closeButton.addEventListener('click', () => drawer.hide()); closeButton.addEventListener('click', () => drawer.hide());
@@ -282,21 +287,22 @@ Use the `--size` custom property to set the drawer's size. This will be applied
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlDrawer } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDrawer from '@shoelace-style/shoelace/dist/react/drawer';
const App = () => { const App = () => {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
return ( return (
<> <>
<SlDrawer label="Drawer" open={open} onSlAfterHide={() => setOpen(false)} style={{ '--size': '50vw' }}> <WaDrawer label="Drawer" open={open} onWaAfterHide={() => setOpen(false)} style={{ '--size': '50vw' }}>
This drawer is always 50% of the viewport. This drawer is always 50% of the viewport.
<SlButton slot="footer" variant="primary" onClick={() => setOpen(false)}> <WaButton slot="footer" variant="brand" onClick={() => setOpen(false)}>
Close Close
</SlButton> </WaButton>
</SlDrawer> </WaDrawer>
<SlButton onClick={() => setOpen(true)}>Open Drawer</SlButton> <WaButton onClick={() => setOpen(true)}>Open Drawer</WaButton>
</> </>
); );
}; };
@@ -309,19 +315,19 @@ const App = () => {
By design, a drawer's height will never exceed 100% of its container. As such, drawers will not scroll with the page to ensure the header and footer are always accessible to the user. By design, a drawer's height will never exceed 100% of its container. As such, drawers will not scroll with the page to ensure the header and footer are always accessible to the user.
```html:preview ```html:preview
<sl-drawer label="Drawer" class="drawer-scrolling"> <wa-drawer label="Drawer" class="drawer-scrolling">
<div style="height: 150vh; border: dashed 2px var(--sl-color-neutral-200); padding: 0 1rem;"> <div style="height: 150vh; border: dashed 2px var(--wa-color-surface-border); padding: 0 1rem;">
<p>Scroll down and give it a try! 👇</p> <p>Scroll down and give it a try! 👇</p>
</div> </div>
<sl-button slot="footer" variant="primary">Close</sl-button> <wa-button slot="footer" variant="brand">Close</wa-button>
</sl-drawer> </wa-drawer>
<sl-button>Open Drawer</sl-button> <wa-button>Open Drawer</wa-button>
<script> <script>
const drawer = document.querySelector('.drawer-scrolling'); const drawer = document.querySelector('.drawer-scrolling');
const openButton = drawer.nextElementSibling; const openButton = drawer.nextElementSibling;
const closeButton = drawer.querySelector('sl-button[variant="primary"]'); const closeButton = drawer.querySelector('wa-button[variant="brand"]');
openButton.addEventListener('click', () => drawer.show()); openButton.addEventListener('click', () => drawer.show());
closeButton.addEventListener('click', () => drawer.hide()); closeButton.addEventListener('click', () => drawer.hide());
@@ -332,29 +338,30 @@ By design, a drawer's height will never exceed 100% of its container. As such, d
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlDrawer } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDrawer from '@shoelace-style/shoelace/dist/react/drawer';
const App = () => { const App = () => {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
return ( return (
<> <>
<SlDrawer label="Drawer" open={open} onSlAfterHide={() => setOpen(false)}> <WaDrawer label="Drawer" open={open} onWaAfterHide={() => setOpen(false)}>
<div <div
style={{ style={{
height: '150vh', height: '150vh',
border: 'dashed 2px var(--sl-color-neutral-200)', border: 'dashed 2px var(--wa-color-surface-border)',
padding: '0 1rem' padding: '0 1rem'
}} }}
> >
<p>Scroll down and give it a try! 👇</p> <p>Scroll down and give it a try! 👇</p>
</div> </div>
<SlButton slot="footer" variant="primary" onClick={() => setOpen(false)}> <WaButton slot="footer" variant="brand" onClick={() => setOpen(false)}>
Close Close
</SlButton> </WaButton>
</SlDrawer> </WaDrawer>
<SlButton onClick={() => setOpen(true)}>Open Drawer</SlButton> <WaButton onClick={() => setOpen(true)}>Open Drawer</WaButton>
</> </>
); );
}; };
@@ -367,18 +374,18 @@ const App = () => {
The header shows a functional close button by default. You can use the `header-actions` slot to add additional [icon buttons](/components/icon-button) if needed. The header shows a functional close button by default. You can use the `header-actions` slot to add additional [icon buttons](/components/icon-button) if needed.
```html:preview ```html:preview
<sl-drawer label="Drawer" class="drawer-header-actions"> <wa-drawer label="Drawer" class="drawer-header-actions">
<sl-icon-button class="new-window" slot="header-actions" name="box-arrow-up-right"></sl-icon-button> <wa-icon-button class="new-window" slot="header-actions" name="arrow-up-right-from-square" variant="solid"></wa-icon-button>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<sl-button slot="footer" variant="primary">Close</sl-button> <wa-button slot="footer" variant="brand">Close</wa-button>
</sl-drawer> </wa-drawer>
<sl-button>Open Drawer</sl-button> <wa-button>Open Drawer</wa-button>
<script> <script>
const drawer = document.querySelector('.drawer-header-actions'); const drawer = document.querySelector('.drawer-header-actions');
const openButton = drawer.nextElementSibling; const openButton = drawer.nextElementSibling;
const closeButton = drawer.querySelector('sl-button[variant="primary"]'); const closeButton = drawer.querySelector('wa-button[variant="brand"]');
const newWindowButton = drawer.querySelector('.new-window'); const newWindowButton = drawer.querySelector('.new-window');
openButton.addEventListener('click', () => drawer.show()); openButton.addEventListener('click', () => drawer.show());
@@ -389,22 +396,24 @@ The header shows a functional close button by default. You can use the `header-a
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlDrawer, SlIconButton } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDrawer from '@shoelace-style/shoelace/dist/react/drawer';
import WaIconButton from '@shoelace-style/shoelace/dist/react/icon-button';
const App = () => { const App = () => {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
return ( return (
<> <>
<SlDrawer label="Drawer" open={open} onSlAfterHide={() => setOpen(false)}> <WaDrawer label="Drawer" open={open} onWaAfterHide={() => setOpen(false)}>
<SlIconButton slot="header-actions" name="box-arrow-up-right" onClick={() => window.open(location.href)} /> <WaIconButton slot="header-actions" name="arrow-up-right-from-square" onClick={() => window.open(location.href)} />
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<SlButton slot="footer" variant="primary" onClick={() => setOpen(false)}> <WaButton slot="footer" variant="brand" onClick={() => setOpen(false)}>
Close Close
</SlButton> </WaButton>
</SlDrawer> </WaDrawer>
<SlButton onClick={() => setOpen(true)}>Open Drawer</SlButton> <WaButton onClick={() => setOpen(true)}>Open Drawer</WaButton>
</> </>
); );
}; };
@@ -414,28 +423,28 @@ const App = () => {
By default, drawers will close when the user clicks the close button, clicks the overlay, or presses the [[Escape]] key. In most cases, the default behavior is the best behavior in terms of UX. However, there are situations where this may be undesirable, such as when data loss will occur. By default, drawers will close when the user clicks the close button, clicks the overlay, or presses the [[Escape]] key. In most cases, the default behavior is the best behavior in terms of UX. However, there are situations where this may be undesirable, such as when data loss will occur.
To keep the drawer open in such cases, you can cancel the `sl-request-close` event. When canceled, the drawer will remain open and pulse briefly to draw the user's attention to it. To keep the drawer open in such cases, you can cancel the `wa-request-close` event. When canceled, the drawer will remain open and pulse briefly to draw the user's attention to it.
You can use `event.detail.source` to determine what triggered the request to close. This example prevents the drawer from closing when the overlay is clicked, but allows the close button or [[Escape]] to dismiss it. You can use `event.detail.source` to determine what triggered the request to close. This example prevents the drawer from closing when the overlay is clicked, but allows the close button or [[Escape]] to dismiss it.
```html:preview ```html:preview
<sl-drawer label="Drawer" class="drawer-deny-close"> <wa-drawer label="Drawer" class="drawer-deny-close">
This drawer will not close when you click on the overlay. This drawer will not close when you click on the overlay.
<sl-button slot="footer" variant="primary">Close</sl-button> <wa-button slot="footer" variant="brand">Close</wa-button>
</sl-drawer> </wa-drawer>
<sl-button>Open Drawer</sl-button> <wa-button>Open Drawer</wa-button>
<script> <script>
const drawer = document.querySelector('.drawer-deny-close'); const drawer = document.querySelector('.drawer-deny-close');
const openButton = drawer.nextElementSibling; const openButton = drawer.nextElementSibling;
const closeButton = drawer.querySelector('sl-button[variant="primary"]'); const closeButton = drawer.querySelector('wa-button[variant="brand"]');
openButton.addEventListener('click', () => drawer.show()); openButton.addEventListener('click', () => drawer.show());
closeButton.addEventListener('click', () => drawer.hide()); closeButton.addEventListener('click', () => drawer.hide());
// Prevent the drawer from closing when the user clicks on the overlay // Prevent the drawer from closing when the user clicks on the overlay
drawer.addEventListener('sl-request-close', event => { drawer.addEventListener('wa-request-close', event => {
if (event.detail.source === 'overlay') { if (event.detail.source === 'overlay') {
event.preventDefault(); event.preventDefault();
} }
@@ -445,7 +454,8 @@ You can use `event.detail.source` to determine what triggered the request to clo
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlDrawer } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDrawer from '@shoelace-style/shoelace/dist/react/drawer';
const App = () => { const App = () => {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
@@ -459,14 +469,14 @@ const App = () => {
return ( return (
<> <>
<SlDrawer label="Drawer" open={open} onSlRequestClose={handleRequestClose} onSlAfterHide={() => setOpen(false)}> <WaDrawer label="Drawer" open={open} onWaRequestClose={handleRequestClose} onWaAfterHide={() => setOpen(false)}>
This drawer will not close when you click on the overlay. This drawer will not close when you click on the overlay.
<SlButton slot="footer" variant="primary" onClick={() => setOpen(false)}> <WaButton slot="footer" variant="brand" onClick={() => setOpen(false)}>
Save &amp; Close Save &amp; Close
</SlButton> </WaButton>
</SlDrawer> </WaDrawer>
<SlButton onClick={() => setOpen(true)}>Open Drawer</SlButton> <WaButton onClick={() => setOpen(true)}>Open Drawer</WaButton>
</> </>
); );
}; };
@@ -477,18 +487,18 @@ const App = () => {
By default, the drawer's panel will gain focus when opened. This allows a subsequent tab press to focus on the first tabbable element in the drawer. If you want a different element to have focus, add the `autofocus` attribute to it as shown below. By default, the drawer's panel will gain focus when opened. This allows a subsequent tab press to focus on the first tabbable element in the drawer. If you want a different element to have focus, add the `autofocus` attribute to it as shown below.
```html:preview ```html:preview
<sl-drawer label="Drawer" class="drawer-focus"> <wa-drawer label="Drawer" class="drawer-focus">
<sl-input autofocus placeholder="I will have focus when the drawer is opened"></sl-input> <wa-input autofocus placeholder="I will have focus when the drawer is opened"></wa-input>
<sl-button slot="footer" variant="primary">Close</sl-button> <wa-button slot="footer" variant="brand">Close</wa-button>
</sl-drawer> </wa-drawer>
<sl-button>Open Drawer</sl-button> <wa-button>Open Drawer</wa-button>
<script> <script>
const drawer = document.querySelector('.drawer-focus'); const drawer = document.querySelector('.drawer-focus');
const input = drawer.querySelector('sl-input'); const input = drawer.querySelector('wa-input');
const openButton = drawer.nextElementSibling; const openButton = drawer.nextElementSibling;
const closeButton = drawer.querySelector('sl-button[variant="primary"]'); const closeButton = drawer.querySelector('wa-button[variant="brand"]');
openButton.addEventListener('click', () => drawer.show()); openButton.addEventListener('click', () => drawer.show());
closeButton.addEventListener('click', () => drawer.hide()); closeButton.addEventListener('click', () => drawer.hide());
@@ -497,26 +507,28 @@ By default, the drawer's panel will gain focus when opened. This allows a subseq
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlDrawer, SlInput } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDrawer from '@shoelace-style/shoelace/dist/react/drawer';
import WaInput from '@shoelace-style/shoelace/dist/react/input';
const App = () => { const App = () => {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
return ( return (
<> <>
<SlDrawer label="Drawer" open={open} onSlAfterHide={() => setOpen(false)}> <WaDrawer label="Drawer" open={open} onWaAfterHide={() => setOpen(false)}>
<SlInput autofocus placeholder="I will have focus when the drawer is opened" /> <WaInput autofocus placeholder="I will have focus when the drawer is opened" />
<SlButton slot="footer" variant="primary" onClick={() => setOpen(false)}> <WaButton slot="footer" variant="brand" onClick={() => setOpen(false)}>
Close Close
</SlButton> </WaButton>
</SlDrawer> </WaDrawer>
<SlButton onClick={() => setOpen(true)}>Open Drawer</SlButton> <WaButton onClick={() => setOpen(true)}>Open Drawer</WaButton>
</> </>
); );
}; };
``` ```
:::tip :::tip
You can further customize initial focus behavior by canceling the `sl-initial-focus` event and setting focus yourself inside the event handler. You can further customize initial focus behavior by canceling the `wa-initial-focus` event and setting focus yourself inside the event handler.
::: :::

View File

@@ -7,59 +7,64 @@ layout: component
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 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) and [select](/components/select)). The API gives you complete control over showing, hiding, and positioning the panel. 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:preview ```html:preview
<sl-dropdown> <wa-dropdown>
<sl-button slot="trigger" caret>Dropdown</sl-button> <wa-button slot="trigger" caret>Dropdown</wa-button>
<sl-menu> <wa-menu>
<sl-menu-item>Dropdown Item 1</sl-menu-item> <wa-menu-item>Dropdown Item 1</wa-menu-item>
<sl-menu-item>Dropdown Item 2</sl-menu-item> <wa-menu-item>Dropdown Item 2</wa-menu-item>
<sl-menu-item>Dropdown Item 3</sl-menu-item> <wa-menu-item>Dropdown Item 3</wa-menu-item>
<sl-divider></sl-divider> <wa-divider></wa-divider>
<sl-menu-item type="checkbox" checked>Checkbox</sl-menu-item> <wa-menu-item type="checkbox" checked>Checkbox</wa-menu-item>
<sl-menu-item disabled>Disabled</sl-menu-item> <wa-menu-item disabled>Disabled</wa-menu-item>
<sl-divider></sl-divider> <wa-divider></wa-divider>
<sl-menu-item> <wa-menu-item>
Prefix Prefix
<sl-icon slot="prefix" name="gift"></sl-icon> <wa-icon slot="prefix" name="gift" variant="solid"></wa-icon>
</sl-menu-item> </wa-menu-item>
<sl-menu-item> <wa-menu-item>
Suffix Icon Suffix Icon
<sl-icon slot="suffix" name="heart"></sl-icon> <wa-icon slot="suffix" name="heart" variant="solid"></wa-icon>
</sl-menu-item> </wa-menu-item>
</sl-menu> </wa-menu>
</sl-dropdown> </wa-dropdown>
``` ```
```jsx:react ```jsx:react
import { SlButton, SlDivider, SlDropdown, SlIcon, SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDivider from '@shoelace-style/shoelace/dist/react/divider';
import WaDropdown from '@shoelace-style/shoelace/dist/react/dropdown';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const App = () => ( const App = () => (
<SlDropdown> <WaDropdown>
<SlButton slot="trigger" caret> <WaButton slot="trigger" caret>
Dropdown Dropdown
</SlButton> </WaButton>
<SlMenu> <WaMenu>
<SlMenuItem>Dropdown Item 1</SlMenuItem> <WaMenuItem>Dropdown Item 1</WaMenuItem>
<SlMenuItem>Dropdown Item 2</SlMenuItem> <WaMenuItem>Dropdown Item 2</WaMenuItem>
<SlMenuItem>Dropdown Item 3</SlMenuItem> <WaMenuItem>Dropdown Item 3</WaMenuItem>
<SlDivider /> <WaDivider />
<SlMenuItem type="checkbox" checked> <WaMenuItem type="checkbox" checked>
Checkbox Checkbox
</SlMenuItem> </WaMenuItem>
<SlMenuItem disabled>Disabled</SlMenuItem> <WaMenuItem disabled>Disabled</WaMenuItem>
<SlDivider /> <WaDivider />
<SlMenuItem> <WaMenuItem>
Prefix Prefix
<SlIcon slot="prefix" name="gift" /> <WaIcon slot="prefix" name="gift" />
</SlMenuItem> </WaMenuItem>
<SlMenuItem> <WaMenuItem>
Suffix Icon Suffix Icon
<SlIcon slot="suffix" name="heart" /> <WaIcon slot="suffix" name="heart" />
</SlMenuItem> </WaMenuItem>
</SlMenu> </WaMenu>
</SlDropdown> </WaDropdown>
); );
``` ```
@@ -67,25 +72,25 @@ const App = () => (
### Getting the Selected Item ### Getting the Selected Item
When dropdowns are used with [menus](/components/menu), you can listen for the [`sl-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. 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:preview ```html:preview
<div class="dropdown-selection"> <div class="dropdown-selection">
<sl-dropdown> <wa-dropdown>
<sl-button slot="trigger" caret>Edit</sl-button> <wa-button slot="trigger" caret>Edit</wa-button>
<sl-menu> <wa-menu>
<sl-menu-item value="cut">Cut</sl-menu-item> <wa-menu-item value="cut">Cut</wa-menu-item>
<sl-menu-item value="copy">Copy</sl-menu-item> <wa-menu-item value="copy">Copy</wa-menu-item>
<sl-menu-item value="paste">Paste</sl-menu-item> <wa-menu-item value="paste">Paste</wa-menu-item>
</sl-menu> </wa-menu>
</sl-dropdown> </wa-dropdown>
</div> </div>
<script> <script>
const container = document.querySelector('.dropdown-selection'); const container = document.querySelector('.dropdown-selection');
const dropdown = container.querySelector('sl-dropdown'); const dropdown = container.querySelector('wa-dropdown');
dropdown.addEventListener('sl-select', event => { dropdown.addEventListener('wa-select', event => {
const selectedItem = event.detail.item; const selectedItem = event.detail.item;
console.log(selectedItem.value); console.log(selectedItem.value);
}); });
@@ -93,7 +98,10 @@ When dropdowns are used with [menus](/components/menu), you can listen for the [
``` ```
```jsx:react ```jsx:react
import { SlButton, SlDropdown, SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDropdown from '@shoelace-style/shoelace/dist/react/dropdown';
import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const App = () => { const App = () => {
function handleSelect(event) { function handleSelect(event) {
@@ -102,16 +110,16 @@ const App = () => {
} }
return ( return (
<SlDropdown> <WaDropdown>
<SlButton slot="trigger" caret> <WaButton slot="trigger" caret>
Edit Edit
</SlButton> </WaButton>
<SlMenu onSlSelect={handleSelect}> <WaMenu onWaSelect={handleSelect}>
<SlMenuItem value="cut">Cut</SlMenuItem> <WaMenuItem value="cut">Cut</WaMenuItem>
<SlMenuItem value="copy">Copy</SlMenuItem> <WaMenuItem value="copy">Copy</WaMenuItem>
<SlMenuItem value="paste">Paste</SlMenuItem> <WaMenuItem value="paste">Paste</WaMenuItem>
</SlMenu> </WaMenu>
</SlDropdown> </WaDropdown>
); );
}; };
``` ```
@@ -120,21 +128,21 @@ Alternatively, you can listen for the `click` event on individual menu items. No
```html:preview ```html:preview
<div class="dropdown-selection-alt"> <div class="dropdown-selection-alt">
<sl-dropdown> <wa-dropdown>
<sl-button slot="trigger" caret>Edit</sl-button> <wa-button slot="trigger" caret>Edit</wa-button>
<sl-menu> <wa-menu>
<sl-menu-item value="cut">Cut</sl-menu-item> <wa-menu-item value="cut">Cut</wa-menu-item>
<sl-menu-item value="copy">Copy</sl-menu-item> <wa-menu-item value="copy">Copy</wa-menu-item>
<sl-menu-item value="paste">Paste</sl-menu-item> <wa-menu-item value="paste">Paste</wa-menu-item>
</sl-menu> </wa-menu>
</sl-dropdown> </wa-dropdown>
</div> </div>
<script> <script>
const container = document.querySelector('.dropdown-selection-alt'); const container = document.querySelector('.dropdown-selection-alt');
const cut = container.querySelector('sl-menu-item[value="cut"]'); const cut = container.querySelector('wa-menu-item[value="cut"]');
const copy = container.querySelector('sl-menu-item[value="copy"]'); const copy = container.querySelector('wa-menu-item[value="copy"]');
const paste = container.querySelector('sl-menu-item[value="paste"]'); const paste = container.querySelector('wa-menu-item[value="paste"]');
cut.addEventListener('click', () => console.log('cut')); cut.addEventListener('click', () => console.log('cut'));
copy.addEventListener('click', () => console.log('copy')); copy.addEventListener('click', () => console.log('copy'));
@@ -143,7 +151,10 @@ Alternatively, you can listen for the `click` event on individual menu items. No
``` ```
```jsx:react ```jsx:react
import { SlButton, SlDropdown, SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDropdown from '@shoelace-style/shoelace/dist/react/dropdown';
import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const App = () => { const App = () => {
function handleCut() { function handleCut() {
@@ -159,16 +170,16 @@ const App = () => {
} }
return ( return (
<SlDropdown> <WaDropdown>
<SlButton slot="trigger" caret> <WaButton slot="trigger" caret>
Edit Edit
</SlButton> </WaButton>
<SlMenu> <WaMenu>
<SlMenuItem onClick={handleCut}>Cut</SlMenuItem> <WaMenuItem onClick={handleCut}>Cut</WaMenuItem>
<SlMenuItem onClick={handleCopy}>Copy</SlMenuItem> <WaMenuItem onClick={handleCopy}>Copy</WaMenuItem>
<SlMenuItem onClick={handlePaste}>Paste</SlMenuItem> <WaMenuItem onClick={handlePaste}>Paste</WaMenuItem>
</SlMenu> </WaMenu>
</SlDropdown> </WaDropdown>
); );
}; };
``` ```
@@ -178,36 +189,40 @@ const App = () => {
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. 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:preview ```html:preview
<sl-dropdown placement="top-start"> <wa-dropdown placement="top-start">
<sl-button slot="trigger" caret>Edit</sl-button> <wa-button slot="trigger" caret>Edit</wa-button>
<sl-menu> <wa-menu>
<sl-menu-item>Cut</sl-menu-item> <wa-menu-item>Cut</wa-menu-item>
<sl-menu-item>Copy</sl-menu-item> <wa-menu-item>Copy</wa-menu-item>
<sl-menu-item>Paste</sl-menu-item> <wa-menu-item>Paste</wa-menu-item>
<sl-divider></sl-divider> <wa-divider></wa-divider>
<sl-menu-item>Find</sl-menu-item> <wa-menu-item>Find</wa-menu-item>
<sl-menu-item>Replace</sl-menu-item> <wa-menu-item>Replace</wa-menu-item>
</sl-menu> </wa-menu>
</sl-dropdown> </wa-dropdown>
``` ```
```jsx:react ```jsx:react
import { SlButton, SlDivider, SlDropdown, SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDivider from '@shoelace-style/shoelace/dist/react/divider';
import WaDropdown from '@shoelace-style/shoelace/dist/react/dropdown';
import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const App = () => ( const App = () => (
<SlDropdown placement="top-start"> <WaDropdown placement="top-start">
<SlButton slot="trigger" caret> <WaButton slot="trigger" caret>
Edit Edit
</SlButton> </WaButton>
<SlMenu> <WaMenu>
<SlMenuItem>Cut</SlMenuItem> <WaMenuItem>Cut</WaMenuItem>
<SlMenuItem>Copy</SlMenuItem> <WaMenuItem>Copy</WaMenuItem>
<SlMenuItem>Paste</SlMenuItem> <WaMenuItem>Paste</WaMenuItem>
<SlDivider /> <WaDivider />
<SlMenuItem>Find</SlMenuItem> <WaMenuItem>Find</WaMenuItem>
<SlMenuItem>Replace</SlMenuItem> <WaMenuItem>Replace</WaMenuItem>
</SlMenu> </WaMenu>
</SlDropdown> </WaDropdown>
); );
``` ```
@@ -216,36 +231,40 @@ const App = () => (
The distance from the panel to the trigger can be customized using the `distance` attribute. This value is specified in pixels. The distance from the panel to the trigger can be customized using the `distance` attribute. This value is specified in pixels.
```html:preview ```html:preview
<sl-dropdown distance="30"> <wa-dropdown distance="30">
<sl-button slot="trigger" caret>Edit</sl-button> <wa-button slot="trigger" caret>Edit</wa-button>
<sl-menu> <wa-menu>
<sl-menu-item>Cut</sl-menu-item> <wa-menu-item>Cut</wa-menu-item>
<sl-menu-item>Copy</sl-menu-item> <wa-menu-item>Copy</wa-menu-item>
<sl-menu-item>Paste</sl-menu-item> <wa-menu-item>Paste</wa-menu-item>
<sl-divider></sl-divider> <wa-divider></wa-divider>
<sl-menu-item>Find</sl-menu-item> <wa-menu-item>Find</wa-menu-item>
<sl-menu-item>Replace</sl-menu-item> <wa-menu-item>Replace</wa-menu-item>
</sl-menu> </wa-menu>
</sl-dropdown> </wa-dropdown>
``` ```
```jsx:react ```jsx:react
import { SlButton, SlDivider, SlDropdown, SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDivider from '@shoelace-style/shoelace/dist/react/divider';
import WaDropdown from '@shoelace-style/shoelace/dist/react/dropdown';
import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const App = () => ( const App = () => (
<SlDropdown distance={30}> <WaDropdown distance={30}>
<SlButton slot="trigger" caret> <WaButton slot="trigger" caret>
Edit Edit
</SlButton> </WaButton>
<SlMenu> <WaMenu>
<SlMenuItem>Cut</SlMenuItem> <WaMenuItem>Cut</WaMenuItem>
<SlMenuItem>Copy</SlMenuItem> <WaMenuItem>Copy</WaMenuItem>
<SlMenuItem>Paste</SlMenuItem> <WaMenuItem>Paste</WaMenuItem>
<SlDivider /> <WaDivider />
<SlMenuItem>Find</SlMenuItem> <WaMenuItem>Find</WaMenuItem>
<SlMenuItem>Replace</SlMenuItem> <WaMenuItem>Replace</WaMenuItem>
</SlMenu> </WaMenu>
</SlDropdown> </WaDropdown>
); );
``` ```
@@ -254,81 +273,179 @@ const App = () => (
The offset of the panel along the trigger can be customized using the `skidding` attribute. This value is specified in pixels. The offset of the panel along the trigger can be customized using the `skidding` attribute. This value is specified in pixels.
```html:preview ```html:preview
<sl-dropdown skidding="30"> <wa-dropdown skidding="30">
<sl-button slot="trigger" caret>Edit</sl-button> <wa-button slot="trigger" caret>Edit</wa-button>
<sl-menu> <wa-menu>
<sl-menu-item>Cut</sl-menu-item> <wa-menu-item>Cut</wa-menu-item>
<sl-menu-item>Copy</sl-menu-item> <wa-menu-item>Copy</wa-menu-item>
<sl-menu-item>Paste</sl-menu-item> <wa-menu-item>Paste</wa-menu-item>
<sl-divider></sl-divider> <wa-divider></wa-divider>
<sl-menu-item>Find</sl-menu-item> <wa-menu-item>Find</wa-menu-item>
<sl-menu-item>Replace</sl-menu-item> <wa-menu-item>Replace</wa-menu-item>
</sl-menu> </wa-menu>
</sl-dropdown> </wa-dropdown>
``` ```
```jsx:react ```jsx:react
import { SlButton, SlDivider, SlDropdown, SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDivider from '@shoelace-style/shoelace/dist/react/divider';
import WaDropdown from '@shoelace-style/shoelace/dist/react/dropdown';
import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const App = () => ( const App = () => (
<SlDropdown skidding={30}> <WaDropdown skidding={30}>
<SlButton slot="trigger" caret> <WaButton slot="trigger" caret>
Edit Edit
</SlButton> </WaButton>
<SlMenu> <WaMenu>
<SlMenuItem>Cut</SlMenuItem> <WaMenuItem>Cut</WaMenuItem>
<SlMenuItem>Copy</SlMenuItem> <WaMenuItem>Copy</WaMenuItem>
<SlMenuItem>Paste</SlMenuItem> <WaMenuItem>Paste</WaMenuItem>
<SlDivider /> <WaDivider />
<SlMenuItem>Find</SlMenuItem> <WaMenuItem>Find</WaMenuItem>
<SlMenuItem>Replace</SlMenuItem> <WaMenuItem>Replace</WaMenuItem>
</SlMenu> </WaMenu>
</SlDropdown> </WaDropdown>
); );
``` ```
### Submenus
To create a submenu, nest an `<wa-menu slot="submenu">` element in a [menu item](/components/menu-item).
```html:preview
<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>
```
```jsx:react
import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDivider from '@shoelace-style/shoelace/dist/react/divider';
import WaDropdown from '@shoelace-style/shoelace/dist/react/dropdown';
import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const css = `
.dropdown-hoist {
border: solid 2px var(--wa-color-surface-border);
padding: var(--wa-space-m);
overflow: hidden;
}
`;
const App = () => (
<>
<WaDropdown>
<WaButton slot="trigger" caret>Edit</WaButton>
<WaMenu style="max-width: 200px;">
<WaMenuItem value="undo">Undo</WaMenuItem>
<WaMenuItem value="redo">Redo</WaMenuItem>
<WaDivider />
<WaMenuItem value="cut">Cut</WaMenuItem>
<WaMenuItem value="copy">Copy</WaMenuItem>
<WaMenuItem value="paste">Paste</WaMenuItem>
<WaDivider />
<WaMenuItem>
Find
<WaMenu slot="submenu">
<WaMenuItem value="find">Find…</WaMenuItem>
<WaMenuItem value="find-previous">Find Next</WaMenuItem>
<WaMenuItem value="find-next">Find Previous</WaMenuItem>
</WaMenu>
</WaMenuItem>
<WaMenuItem>
Transformations
<WaMenu slot="submenu">
<WaMenuItem value="uppercase">Make uppercase</WaMenuItem>
<WaMenuItem value="lowercase">Make lowercase</WaMenuItem>
<WaMenuItem value="capitalize">Capitalize</WaMenuItem>
</WaMenu>
</WaMenuItem>
</WaMenu>
</WaDropdown>
</>
);
```
:::warning
As a UX best practice, avoid using more than one level of submenu when possible.
:::
### Hoisting ### 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, 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. 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:preview ```html:preview
<div class="dropdown-hoist"> <div class="dropdown-hoist">
<sl-dropdown> <wa-dropdown>
<sl-button slot="trigger" caret>No Hoist</sl-button> <wa-button slot="trigger" caret>No Hoist</wa-button>
<sl-menu> <wa-menu>
<sl-menu-item>Item 1</sl-menu-item> <wa-menu-item>Item 1</wa-menu-item>
<sl-menu-item>Item 2</sl-menu-item> <wa-menu-item>Item 2</wa-menu-item>
<sl-menu-item>Item 3</sl-menu-item> <wa-menu-item>Item 3</wa-menu-item>
</sl-menu> </wa-menu>
</sl-dropdown> </wa-dropdown>
<sl-dropdown hoist> <wa-dropdown hoist>
<sl-button slot="trigger" caret>Hoist</sl-button> <wa-button slot="trigger" caret>Hoist</wa-button>
<sl-menu> <wa-menu>
<sl-menu-item>Item 1</sl-menu-item> <wa-menu-item>Item 1</wa-menu-item>
<sl-menu-item>Item 2</sl-menu-item> <wa-menu-item>Item 2</wa-menu-item>
<sl-menu-item>Item 3</sl-menu-item> <wa-menu-item>Item 3</wa-menu-item>
</sl-menu> </wa-menu>
</sl-dropdown> </wa-dropdown>
</div> </div>
<style> <style>
.dropdown-hoist { .dropdown-hoist {
position: relative; position: relative;
border: solid 2px var(--sl-panel-border-color); border: solid 2px var(--wa-color-surface-border);
padding: var(--sl-spacing-medium); padding: var(--wa-space-m);
overflow: hidden; overflow: hidden;
} }
</style> </style>
``` ```
```jsx:react ```jsx:react
import { SlButton, SlDivider, SlDropdown, SlIcon, SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDivider from '@shoelace-style/shoelace/dist/react/divider';
import WaDropdown from '@shoelace-style/shoelace/dist/react/dropdown';
import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const css = ` const css = `
.dropdown-hoist { .dropdown-hoist {
border: solid 2px var(--sl-panel-border-color); border: solid 2px var(--wa-color-surface-border);
padding: var(--sl-spacing-medium); padding: var(--wa-space-m);
overflow: hidden; overflow: hidden;
} }
`; `;
@@ -336,27 +453,27 @@ const css = `
const App = () => ( const App = () => (
<> <>
<div className="dropdown-hoist"> <div className="dropdown-hoist">
<SlDropdown> <WaDropdown>
<SlButton slot="trigger" caret> <WaButton slot="trigger" caret>
No Hoist No Hoist
</SlButton> </WaButton>
<SlMenu> <WaMenu>
<SlMenuItem>Item 1</SlMenuItem> <WaMenuItem>Item 1</WaMenuItem>
<SlMenuItem>Item 2</SlMenuItem> <WaMenuItem>Item 2</WaMenuItem>
<SlMenuItem>Item 3</SlMenuItem> <WaMenuItem>Item 3</WaMenuItem>
</SlMenu> </WaMenu>
</SlDropdown> </WaDropdown>
<SlDropdown hoist> <WaDropdown hoist>
<SlButton slot="trigger" caret> <WaButton slot="trigger" caret>
Hoist Hoist
</SlButton> </WaButton>
<SlMenu> <WaMenu>
<SlMenuItem>Item 1</SlMenuItem> <WaMenuItem>Item 1</WaMenuItem>
<SlMenuItem>Item 2</SlMenuItem> <WaMenuItem>Item 2</WaMenuItem>
<SlMenuItem>Item 3</SlMenuItem> <WaMenuItem>Item 3</WaMenuItem>
</SlMenu> </WaMenu>
</SlDropdown> </WaDropdown>
</div> </div>
<style>{css}</style> <style>{css}</style>

View File

@@ -7,16 +7,16 @@ layout: component
```html:preview ```html:preview
<div class="format-bytes-overview"> <div class="format-bytes-overview">
The file is <sl-format-bytes value="1000"></sl-format-bytes> in size. <br /><br /> The file is <wa-format-bytes value="1000"></wa-format-bytes> in size. <br /><br />
<sl-input type="number" value="1000" label="Number to Format" style="max-width: 180px;"></sl-input> <wa-input type="number" value="1000" label="Number to Format" style="max-width: 180px;"></wa-input>
</div> </div>
<script> <script>
const container = document.querySelector('.format-bytes-overview'); const container = document.querySelector('.format-bytes-overview');
const formatter = container.querySelector('sl-format-bytes'); const formatter = container.querySelector('wa-format-bytes');
const input = container.querySelector('sl-input'); const input = container.querySelector('wa-input');
input.addEventListener('sl-input', () => (formatter.value = input.value || 0)); input.addEventListener('wa-input', () => (formatter.value = input.value || 0));
</script> </script>
``` ```
@@ -24,22 +24,24 @@ layout: component
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlFormatBytes, SlInput } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaFormatBytes from '@shoelace-style/shoelace/dist/react/format-bytes';
import WaInput from '@shoelace-style/shoelace/dist/react/input';
const App = () => { const App = () => {
const [value, setValue] = useState(1000); const [value, setValue] = useState(1000);
return ( return (
<> <>
The file is <SlFormatBytes value={value} /> in size. The file is <WaFormatBytes value={value} /> in size.
<br /> <br />
<br /> <br />
<SlInput <WaInput
type="number" type="number"
value={value} value={value}
label="Number to Format" label="Number to Format"
style={{ maxWidth: '180px' }} style={{ maxWidth: '180px' }}
onSlInput={event => setValue(event.target.value)} onWaInput={event => setValue(event.target.value)}
/> />
</> </>
); );
@@ -55,24 +57,24 @@ const App = () => {
Set the `value` attribute to a number to get the value in bytes. Set the `value` attribute to a number to get the value in bytes.
```html:preview ```html:preview
<sl-format-bytes value="12"></sl-format-bytes><br /> <wa-format-bytes value="12"></wa-format-bytes><br />
<sl-format-bytes value="1200"></sl-format-bytes><br /> <wa-format-bytes value="1200"></wa-format-bytes><br />
<sl-format-bytes value="1200000"></sl-format-bytes><br /> <wa-format-bytes value="1200000"></wa-format-bytes><br />
<sl-format-bytes value="1200000000"></sl-format-bytes> <wa-format-bytes value="1200000000"></wa-format-bytes>
``` ```
```jsx:react ```jsx:react
import { SlFormatBytes } from '@shoelace-style/shoelace/dist/react'; import WaFormatBytes from '@shoelace-style/shoelace/dist/react/format-bytes';
const App = () => ( const App = () => (
<> <>
<SlFormatBytes value="12" /> <WaFormatBytes value="12" />
<br /> <br />
<SlFormatBytes value="1200" /> <WaFormatBytes value="1200" />
<br /> <br />
<SlFormatBytes value="1200000" /> <WaFormatBytes value="1200000" />
<br /> <br />
<SlFormatBytes value="1200000000" /> <WaFormatBytes value="1200000000" />
</> </>
); );
``` ```
@@ -82,24 +84,24 @@ const App = () => (
To get the value in bits, set the `unit` attribute to `bit`. To get the value in bits, set the `unit` attribute to `bit`.
```html:preview ```html:preview
<sl-format-bytes value="12" unit="bit"></sl-format-bytes><br /> <wa-format-bytes value="12" unit="bit"></wa-format-bytes><br />
<sl-format-bytes value="1200" unit="bit"></sl-format-bytes><br /> <wa-format-bytes value="1200" unit="bit"></wa-format-bytes><br />
<sl-format-bytes value="1200000" unit="bit"></sl-format-bytes><br /> <wa-format-bytes value="1200000" unit="bit"></wa-format-bytes><br />
<sl-format-bytes value="1200000000" unit="bit"></sl-format-bytes> <wa-format-bytes value="1200000000" unit="bit"></wa-format-bytes>
``` ```
```jsx:react ```jsx:react
import { SlFormatBytes } from '@shoelace-style/shoelace/dist/react'; import WaFormatBytes from '@shoelace-style/shoelace/dist/react/format-bytes';
const App = () => ( const App = () => (
<> <>
<SlFormatBytes value="12" unit="bit" /> <WaFormatBytes value="12" unit="bit" />
<br /> <br />
<SlFormatBytes value="1200" unit="bit" /> <WaFormatBytes value="1200" unit="bit" />
<br /> <br />
<SlFormatBytes value="1200000" unit="bit" /> <WaFormatBytes value="1200000" unit="bit" />
<br /> <br />
<SlFormatBytes value="1200000000" unit="bit" /> <WaFormatBytes value="1200000000" unit="bit" />
</> </>
); );
``` ```
@@ -109,24 +111,24 @@ const App = () => (
Use the `lang` attribute to set the number formatting locale. Use the `lang` attribute to set the number formatting locale.
```html:preview ```html:preview
<sl-format-bytes value="12" lang="de"></sl-format-bytes><br /> <wa-format-bytes value="12" lang="de"></wa-format-bytes><br />
<sl-format-bytes value="1200" lang="de"></sl-format-bytes><br /> <wa-format-bytes value="1200" lang="de"></wa-format-bytes><br />
<sl-format-bytes value="1200000" lang="de"></sl-format-bytes><br /> <wa-format-bytes value="1200000" lang="de"></wa-format-bytes><br />
<sl-format-bytes value="1200000000" lang="de"></sl-format-bytes> <wa-format-bytes value="1200000000" lang="de"></wa-format-bytes>
``` ```
```jsx:react ```jsx:react
import { SlFormatBytes } from '@shoelace-style/shoelace/dist/react'; import WaFormatBytes from '@shoelace-style/shoelace/dist/react/format-bytes';
const App = () => ( const App = () => (
<> <>
<SlFormatBytes value="12" lang="de" /> <WaFormatBytes value="12" lang="de" />
<br /> <br />
<SlFormatBytes value="1200" lang="de" /> <WaFormatBytes value="1200" lang="de" />
<br /> <br />
<SlFormatBytes value="1200000" lang="de" /> <WaFormatBytes value="1200000" lang="de" />
<br /> <br />
<SlFormatBytes value="1200000000" lang="de" /> <WaFormatBytes value="1200000000" lang="de" />
</> </>
); );
``` ```

View File

@@ -8,14 +8,14 @@ layout: component
Localization is handled by the browser's [`Intl.DateTimeFormat` API](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat). No language packs are required. Localization is handled by the browser's [`Intl.DateTimeFormat` API](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat). No language packs are required.
```html:preview ```html:preview
<!-- Shoelace 2 release date 🎉 --> <!-- Web Awesome 2 release date 🎉 -->
<sl-format-date date="2020-07-15T09:17:00-04:00"></sl-format-date> <wa-format-date date="2020-07-15T09:17:00-04:00"></wa-format-date>
``` ```
```jsx:react ```jsx:react
import { SlFormatDate } from '@shoelace-style/shoelace/dist/react'; import WaFormatDate from '@shoelace-style/shoelace/dist/react/format-date';
const App = () => <SlFormatDate date="2020-07-15T09:17:00-04:00" />; const App = () => <WaFormatDate date="2020-07-15T09:17:00-04:00" />;
``` ```
The `date` attribute determines the date/time to use when formatting. It must be a string that [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse) can interpret or a [`Date`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) object set via JavaScript. If omitted, the current date/time will be assumed. The `date` attribute determines the date/time to use when formatting. It must be a string that [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse) can interpret or a [`Date`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) object set via JavaScript. If omitted, the current date/time will be assumed.
@@ -32,51 +32,51 @@ Formatting options are based on those found in the [`Intl.DateTimeFormat` API](h
```html:preview ```html:preview
<!-- Human-readable date --> <!-- Human-readable date -->
<sl-format-date month="long" day="numeric" year="numeric"></sl-format-date><br /> <wa-format-date month="long" day="numeric" year="numeric"></wa-format-date><br />
<!-- Time --> <!-- Time -->
<sl-format-date hour="numeric" minute="numeric"></sl-format-date><br /> <wa-format-date hour="numeric" minute="numeric"></wa-format-date><br />
<!-- Weekday --> <!-- Weekday -->
<sl-format-date weekday="long"></sl-format-date><br /> <wa-format-date weekday="long"></wa-format-date><br />
<!-- Month --> <!-- Month -->
<sl-format-date month="long"></sl-format-date><br /> <wa-format-date month="long"></wa-format-date><br />
<!-- Year --> <!-- Year -->
<sl-format-date year="numeric"></sl-format-date><br /> <wa-format-date year="numeric"></wa-format-date><br />
<!-- No formatting options --> <!-- No formatting options -->
<sl-format-date></sl-format-date> <wa-format-date></wa-format-date>
``` ```
```jsx:react ```jsx:react
import { SlFormatDate } from '@shoelace-style/shoelace/dist/react'; import WaFormatDate from '@shoelace-style/shoelace/dist/react/format-date';
const App = () => ( const App = () => (
<> <>
{/* Human-readable date */} {/* Human-readable date */}
<SlFormatDate month="long" day="numeric" year="numeric" /> <WaFormatDate month="long" day="numeric" year="numeric" />
<br /> <br />
{/* Time */} {/* Time */}
<SlFormatDate hour="numeric" minute="numeric" /> <WaFormatDate hour="numeric" minute="numeric" />
<br /> <br />
{/* Weekday */} {/* Weekday */}
<SlFormatDate weekday="long" /> <WaFormatDate weekday="long" />
<br /> <br />
{/* Month */} {/* Month */}
<SlFormatDate month="long" /> <WaFormatDate month="long" />
<br /> <br />
{/* Year */} {/* Year */}
<SlFormatDate year="numeric" /> <WaFormatDate year="numeric" />
<br /> <br />
{/* No formatting options */} {/* No formatting options */}
<SlFormatDate /> <WaFormatDate />
</> </>
); );
``` ```
@@ -86,18 +86,18 @@ const App = () => (
By default, the browser will determine whether to use 12-hour or 24-hour time. To force one or the other, set the `hour-format` attribute to `12` or `24`. By default, the browser will determine whether to use 12-hour or 24-hour time. To force one or the other, set the `hour-format` attribute to `12` or `24`.
```html:preview ```html:preview
<sl-format-date hour="numeric" minute="numeric" hour-format="12"></sl-format-date><br /> <wa-format-date hour="numeric" minute="numeric" hour-format="12"></wa-format-date><br />
<sl-format-date hour="numeric" minute="numeric" hour-format="24"></sl-format-date> <wa-format-date hour="numeric" minute="numeric" hour-format="24"></wa-format-date>
``` ```
```jsx:react ```jsx:react
import { SlFormatDate } from '@shoelace-style/shoelace/dist/react'; import WaFormatDate from '@shoelace-style/shoelace/dist/react/format-date';
const App = () => ( const App = () => (
<> <>
<SlFormatDate hour="numeric" minute="numeric" hour-format="12" /> <WaFormatDate hour="numeric" minute="numeric" hour-format="12" />
<br /> <br />
<SlFormatDate hour="numeric" minute="numeric" hour-format="24" /> <WaFormatDate hour="numeric" minute="numeric" hour-format="24" />
</> </>
); );
``` ```
@@ -107,21 +107,21 @@ const App = () => (
Use the `lang` attribute to set the date/time formatting locale. Use the `lang` attribute to set the date/time formatting locale.
```html:preview ```html:preview
English: <sl-format-date lang="en"></sl-format-date><br /> English: <wa-format-date lang="en"></wa-format-date><br />
French: <sl-format-date lang="fr"></sl-format-date><br /> French: <wa-format-date lang="fr"></wa-format-date><br />
Russian: <sl-format-date lang="ru"></sl-format-date> Russian: <wa-format-date lang="ru"></wa-format-date>
``` ```
```jsx:react ```jsx:react
import { SlFormatDate } from '@shoelace-style/shoelace/dist/react'; import WaFormatDate from '@shoelace-style/shoelace/dist/react/format-date';
const App = () => ( const App = () => (
<> <>
English: <SlFormatDate lang="en" /> English: <WaFormatDate lang="en" />
<br /> <br />
French: <SlFormatDate lang="fr" /> French: <WaFormatDate lang="fr" />
<br /> <br />
Russian: <SlFormatDate lang="ru" /> Russian: <WaFormatDate lang="ru" />
</> </>
); );
``` ```

View File

@@ -9,17 +9,17 @@ Localization is handled by the browser's [`Intl.NumberFormat` API](https://devel
```html:preview ```html:preview
<div class="format-number-overview"> <div class="format-number-overview">
<sl-format-number value="1000"></sl-format-number> <wa-format-number value="1000"></wa-format-number>
<br /><br /> <br /><br />
<sl-input type="number" value="1000" label="Number to Format" style="max-width: 180px;"></sl-input> <wa-input type="number" value="1000" label="Number to Format" style="max-width: 180px;"></wa-input>
</div> </div>
<script> <script>
const container = document.querySelector('.format-number-overview'); const container = document.querySelector('.format-number-overview');
const formatter = container.querySelector('sl-format-number'); const formatter = container.querySelector('wa-format-number');
const input = container.querySelector('sl-input'); const input = container.querySelector('wa-input');
input.addEventListener('sl-input', () => (formatter.value = input.value || 0)); input.addEventListener('wa-input', () => (formatter.value = input.value || 0));
</script> </script>
``` ```
@@ -27,22 +27,23 @@ Localization is handled by the browser's [`Intl.NumberFormat` API](https://devel
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlFormatNumber, SlInput } from '@shoelace-style/shoelace/dist/react'; import WaFormatNumber from '@shoelace-style/shoelace/dist/react/format-number';
import WaInput from '@shoelace-style/shoelace/dist/react/input';
const App = () => { const App = () => {
const [value, setValue] = useState(1000); const [value, setValue] = useState(1000);
return ( return (
<> <>
<SlFormatNumber value={value} /> <WaFormatNumber value={value} />
<br /> <br />
<br /> <br />
<SlInput <WaInput
type="number" type="number"
value={value} value={value}
label="Number to Format" label="Number to Format"
style={{ maxWidth: '180px' }} style={{ maxWidth: '180px' }}
onSlInput={event => setValue(event.target.value)} onWaInput={event => setValue(event.target.value)}
/> />
</> </>
); );
@@ -58,27 +59,27 @@ const App = () => {
To get the value as a percent, set the `type` attribute to `percent`. To get the value as a percent, set the `type` attribute to `percent`.
```html:preview ```html:preview
<sl-format-number type="percent" value="0"></sl-format-number><br /> <wa-format-number type="percent" value="0"></wa-format-number><br />
<sl-format-number type="percent" value="0.25"></sl-format-number><br /> <wa-format-number type="percent" value="0.25"></wa-format-number><br />
<sl-format-number type="percent" value="0.50"></sl-format-number><br /> <wa-format-number type="percent" value="0.50"></wa-format-number><br />
<sl-format-number type="percent" value="0.75"></sl-format-number><br /> <wa-format-number type="percent" value="0.75"></wa-format-number><br />
<sl-format-number type="percent" value="1"></sl-format-number> <wa-format-number type="percent" value="1"></wa-format-number>
``` ```
```jsx:react ```jsx:react
import { SlFormatNumber } from '@shoelace-style/shoelace/dist/react'; import WaFormatNumber from '@shoelace-style/shoelace/dist/react/format-number';
const App = () => ( const App = () => (
<> <>
<SlFormatNumber type="percent" value={0} /> <WaFormatNumber type="percent" value={0} />
<br /> <br />
<SlFormatNumber type="percent" value={0.25} /> <WaFormatNumber type="percent" value={0.25} />
<br /> <br />
<SlFormatNumber type="percent" value={0.5} /> <WaFormatNumber type="percent" value={0.5} />
<br /> <br />
<SlFormatNumber type="percent" value={0.75} /> <WaFormatNumber type="percent" value={0.75} />
<br /> <br />
<SlFormatNumber type="percent" value={1} /> <WaFormatNumber type="percent" value={1} />
</> </>
); );
``` ```
@@ -88,21 +89,21 @@ const App = () => (
Use the `lang` attribute to set the number formatting locale. Use the `lang` attribute to set the number formatting locale.
```html:preview ```html:preview
English: <sl-format-number value="2000" lang="en" minimum-fraction-digits="2"></sl-format-number><br /> English: <wa-format-number value="2000" lang="en" minimum-fraction-digits="2"></wa-format-number><br />
German: <sl-format-number value="2000" lang="de" minimum-fraction-digits="2"></sl-format-number><br /> German: <wa-format-number value="2000" lang="de" minimum-fraction-digits="2"></wa-format-number><br />
Russian: <sl-format-number value="2000" lang="ru" minimum-fraction-digits="2"></sl-format-number> Russian: <wa-format-number value="2000" lang="ru" minimum-fraction-digits="2"></wa-format-number>
``` ```
```jsx:react ```jsx:react
import { SlFormatNumber } from '@shoelace-style/shoelace/dist/react'; import WaFormatNumber from '@shoelace-style/shoelace/dist/react/format-number';
const App = () => ( const App = () => (
<> <>
English: <SlFormatNumber value="2000" lang="en" minimum-fraction-digits="2" /> English: <WaFormatNumber value="2000" lang="en" minimum-fraction-digits="2" />
<br /> <br />
German: <SlFormatNumber value="2000" lang="de" minimum-fraction-digits="2" /> German: <WaFormatNumber value="2000" lang="de" minimum-fraction-digits="2" />
<br /> <br />
Russian: <SlFormatNumber value="2000" lang="ru" minimum-fraction-digits="2" /> Russian: <WaFormatNumber value="2000" lang="ru" minimum-fraction-digits="2" />
</> </>
); );
``` ```
@@ -112,27 +113,27 @@ const App = () => (
To format a number as a monetary value, set the `type` attribute to `currency` and set the `currency` attribute to the desired ISO 4217 currency code. You should also specify `lang` to ensure the the number is formatted correctly for the target locale. To format a number as a monetary value, set the `type` attribute to `currency` and set the `currency` attribute to the desired ISO 4217 currency code. You should also specify `lang` to ensure the the number is formatted correctly for the target locale.
```html:preview ```html:preview
<sl-format-number type="currency" currency="USD" value="2000" lang="en-US"></sl-format-number><br /> <wa-format-number type="currency" currency="USD" value="2000" lang="en-US"></wa-format-number><br />
<sl-format-number type="currency" currency="GBP" value="2000" lang="en-GB"></sl-format-number><br /> <wa-format-number type="currency" currency="GBP" value="2000" lang="en-GB"></wa-format-number><br />
<sl-format-number type="currency" currency="EUR" value="2000" lang="de"></sl-format-number><br /> <wa-format-number type="currency" currency="EUR" value="2000" lang="de"></wa-format-number><br />
<sl-format-number type="currency" currency="RUB" value="2000" lang="ru"></sl-format-number><br /> <wa-format-number type="currency" currency="RUB" value="2000" lang="ru"></wa-format-number><br />
<sl-format-number type="currency" currency="CNY" value="2000" lang="zh-cn"></sl-format-number> <wa-format-number type="currency" currency="CNY" value="2000" lang="zh-cn"></wa-format-number>
``` ```
```jsx:react ```jsx:react
import { SlFormatNumber } from '@shoelace-style/shoelace/dist/react'; import WaFormatNumber from '@shoelace-style/shoelace/dist/react/format-number';
const App = () => ( const App = () => (
<> <>
<SlFormatNumber type="currency" currency="USD" value="2000" lang="en-US" /> <WaFormatNumber type="currency" currency="USD" value="2000" lang="en-US" />
<br /> <br />
<SlFormatNumber type="currency" currency="GBP" value="2000" lang="en-GB" /> <WaFormatNumber type="currency" currency="GBP" value="2000" lang="en-GB" />
<br /> <br />
<SlFormatNumber type="currency" currency="EUR" value="2000" lang="de" /> <WaFormatNumber type="currency" currency="EUR" value="2000" lang="de" />
<br /> <br />
<SlFormatNumber type="currency" currency="RUB" value="2000" lang="ru" /> <WaFormatNumber type="currency" currency="RUB" value="2000" lang="ru" />
<br /> <br />
<SlFormatNumber type="currency" currency="CNY" value="2000" lang="zh-cn" /> <WaFormatNumber type="currency" currency="CNY" value="2000" lang="zh-cn" />
</> </>
); );
``` ```

View File

@@ -5,16 +5,16 @@ meta:
layout: component layout: component
--- ---
For a full list of icons that come bundled with Shoelace, refer to the [icon component](/components/icon). For a full list of icons that come bundled with Web Awesome, refer to the [icon component](/components/icon).
```html:preview ```html:preview
<sl-icon-button name="gear" label="Settings"></sl-icon-button> <wa-icon-button name="gear" label="Settings"></wa-icon-button>
``` ```
```jsx:react ```jsx:react
import { SlIconButton } from '@shoelace-style/shoelace/dist/react'; import WaIconButton from '@shoelace-style/shoelace/dist/react/icon-button';
const App = () => <SlIconButton name="gear" label="Settings" />; const App = () => <WaIconButton name="gear" label="Settings" />;
``` ```
## Examples ## Examples
@@ -24,21 +24,21 @@ const App = () => <SlIconButton name="gear" label="Settings" />;
Icon buttons inherit their parent element's `font-size`. Icon buttons inherit their parent element's `font-size`.
```html:preview ```html:preview
<sl-icon-button name="pencil" label="Edit" style="font-size: 1.5rem;"></sl-icon-button> <wa-icon-button name="pen-to-square" variant="solid" label="Edit" style="font-size: 1.5rem;"></wa-icon-button>
<sl-icon-button name="pencil" label="Edit" style="font-size: 2rem;"></sl-icon-button> <wa-icon-button name="pen-to-square" variant="solid" label="Edit" style="font-size: 2rem;"></wa-icon-button>
<sl-icon-button name="pencil" label="Edit" style="font-size: 2.5rem;"></sl-icon-button> <wa-icon-button name="pen-to-square" variant="solid" label="Edit" style="font-size: 2.5rem;"></wa-icon-button>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlIconButton } from '@shoelace-style/shoelace/dist/react'; import WaIconButton from '@shoelace-style/shoelace/dist/react/icon-button';
const App = () => ( const App = () => (
<> <>
<SlIconButton name="pencil" label="Edit" style={{ fontSize: '1.5rem' }} /> <WaIconButton name="pen-to-square" variant="solid" label="Edit" style={{ fontSize: '1.5rem' }} />
<SlIconButton name="pencil" label="Edit" style={{ fontSize: '2rem' }} /> <WaIconButton name="pen-to-square" variant="solid" label="Edit" style={{ fontSize: '2rem' }} />
<SlIconButton name="pencil" label="Edit" style={{ fontSize: '2.5rem' }} /> <WaIconButton name="pen-to-square" variant="solid" label="Edit" style={{ fontSize: '2.5rem' }} />
</> </>
); );
``` ```
@@ -51,41 +51,41 @@ Icon buttons are designed to have a uniform appearance, so their color is not in
```html:preview ```html:preview
<div class="icon-button-color"> <div class="icon-button-color">
<sl-icon-button name="type-bold" label="Bold"></sl-icon-button> <wa-icon-button name="bold" variant="solid" label="Bold"></wa-icon-button>
<sl-icon-button name="type-italic" label="Italic"></sl-icon-button> <wa-icon-button name="italic" variant="solid" label="Italic"></wa-icon-button>
<sl-icon-button name="type-underline" label="Underline"></sl-icon-button> <wa-icon-button name="underline" variant="solid" label="Underline"></wa-icon-button>
</div> </div>
<style> <style>
.icon-button-color sl-icon-button::part(base) { .icon-button-color wa-icon-button::part(base) {
color: #b00091; color: #b00091;
} }
.icon-button-color sl-icon-button::part(base):hover, .icon-button-color wa-icon-button::part(base):hover,
.icon-button-color sl-icon-button::part(base):focus { .icon-button-color wa-icon-button::part(base):focus {
color: #c913aa; color: #c913aa;
} }
.icon-button-color sl-icon-button::part(base):active { .icon-button-color wa-icon-button::part(base):active {
color: #960077; color: #960077;
} }
</style> </style>
``` ```
```jsx:react ```jsx:react
import { SlIconButton } from '@shoelace-style/shoelace/dist/react'; import WaIconButton from '@shoelace-style/shoelace/dist/react/icon-button';
const css = ` const css = `
.icon-button-color sl-icon-button::part(base) { .icon-button-color wa-icon-button::part(base) {
color: #b00091; color: #b00091;
} }
.icon-button-color sl-icon-button::part(base):hover, .icon-button-color wa-icon-button::part(base):hover,
.icon-button-color sl-icon-button::part(base):focus { .icon-button-color wa-icon-button::part(base):focus {
color: #c913aa; color: #c913aa;
} }
.icon-button-color sl-icon-button::part(base):active { .icon-button-color wa-icon-button::part(base):active {
color: #960077; color: #960077;
} }
`; `;
@@ -93,9 +93,9 @@ const css = `
const App = () => ( const App = () => (
<> <>
<div className="icon-button-color"> <div className="icon-button-color">
<SlIconButton name="type-bold" label="Bold" /> <WaIconButton name="type-bold" variant="solid" label="Bold" />
<SlIconButton name="type-italic" label="Italic" /> <WaIconButton name="type-italic" variant="solid" label="Italic" />
<SlIconButton name="type-underline" label="Underline" /> <WaIconButton name="type-underline" variant="solid" label="Underline" />
</div> </div>
<style>{css}</style> <style>{css}</style>
@@ -108,13 +108,13 @@ const App = () => (
Use the `href` attribute to convert the button to a link. Use the `href` attribute to convert the button to a link.
```html:preview ```html:preview
<sl-icon-button name="gear" label="Settings" href="https://example.com" target="_blank"></sl-icon-button> <wa-icon-button name="gear" variant="solid" label="Settings" href="https://example.com" target="_blank"></wa-icon-button>
``` ```
```jsx:react ```jsx:react
import { SlIconButton } from '@shoelace-style/shoelace/dist/react'; import WaIconButton from '@shoelace-style/shoelace/dist/react/icon-button';
const App = () => <SlIconButton name="gear" label="Settings" href="https://example.com" target="_blank" />; const App = () => <WaIconButton name="gear" variant="solid" label="Settings" href="https://example.com" target="_blank" />;
``` ```
### Icon Button with Tooltip ### Icon Button with Tooltip
@@ -122,18 +122,19 @@ const App = () => <SlIconButton name="gear" label="Settings" href="https://examp
Wrap a tooltip around an icon button to provide contextual information to the user. Wrap a tooltip around an icon button to provide contextual information to the user.
```html:preview ```html:preview
<sl-tooltip content="Settings"> <wa-tooltip content="Settings">
<sl-icon-button name="gear" label="Settings"></sl-icon-button> <wa-icon-button name="gear" variant="solid" label="Settings"></wa-icon-button>
</sl-tooltip> </wa-tooltip>
``` ```
```jsx:react ```jsx:react
import { SlIconButton, SlTooltip } from '@shoelace-style/shoelace/dist/react'; import WaIconButton from '@shoelace-style/shoelace/dist/react/icon-button';
import WaTooltip from '@shoelace-style/shoelace/dist/react/tooltip';
const App = () => ( const App = () => (
<SlTooltip content="Settings"> <WaTooltip content="Settings">
<SlIconButton name="gear" label="Settings" /> <WaIconButton name="gear" variant="solid" label="Settings" />
</SlTooltip> </WaTooltip>
); );
``` ```
@@ -142,11 +143,11 @@ const App = () => (
Use the `disabled` attribute to disable the icon button. Use the `disabled` attribute to disable the icon button.
```html:preview ```html:preview
<sl-icon-button name="gear" label="Settings" disabled></sl-icon-button> <wa-icon-button name="gear" variant="solid" label="Settings" disabled></wa-icon-button>
``` ```
```jsx:react ```jsx:react
import { SlIconButton } from '@shoelace-style/shoelace/dist/react'; import WaIconButton from '@shoelace-style/shoelace/dist/react/icon-button';
const App = () => <SlIconButton name="gear" label="Settings" disabled />; const App = () => <WaIconButton name="gear" variant="solid" label="Settings" disabled />;
``` ```

View File

@@ -5,10 +5,10 @@ meta:
layout: component layout: component
--- ---
Shoelace comes bundled with over 1,500 icons courtesy of the [Bootstrap Icons](https://icons.getbootstrap.com/) project. These icons are part of the `default` icon library. If you prefer, you can register [custom icon libraries](#icon-libraries) as well. Web Awesome comes bundled with over 1,500 icons courtesy of the [Bootstrap Icons](https://icons.getbootstrap.com/) project. These icons are part of the `default` icon library. If you prefer, you can register [custom icon libraries](#icon-libraries) as well.
:::tip :::tip
Depending on how you're loading Shoelace, you may need to copy icon assets and/or [set the base path](getting-started/installation#setting-the-base-path) so Shoelace knows where to load them from. Otherwise, icons may not appear and you'll see 404 Not Found errors in the dev console. Depending on how you're loading Web Awesome, you may need to copy icon assets and/or [set the base path](/getting-started/installation/#setting-the-base-path) so Web Awesome knows where to load them from. Otherwise, icons may not appear and you'll see 404 Not Found errors in the dev console.
::: :::
## Default Icons ## Default Icons
@@ -16,87 +16,75 @@ Depending on how you're loading Shoelace, you may need to copy icon assets and/o
All available icons in the `default` icon library are shown below. Click or tap on any icon to copy its name, then you can use it in your HTML like this. All available icons in the `default` icon library are shown below. Click or tap on any icon to copy its name, then you can use it in your HTML like this.
```html ```html
<sl-icon name="icon-name-here"></sl-icon> <wa-icon name="icon-name-here"></wa-icon>
``` ```
<div class="icon-search">
<div class="icon-search-controls">
<sl-input placeholder="Search Icons" clearable>
<sl-icon slot="prefix" name="search"></sl-icon>
</sl-input>
<sl-select value="outline">
<sl-option value="outline">Outlined</sl-option>
<sl-option value="fill">Filled</sl-option>
<sl-option value="all">All icons</sl-option>
</sl-select>
</div>
<div class="icon-list"></div>
<input type="text" class="icon-copy-input" aria-hidden="true" tabindex="-1">
</div>
## Examples ## Examples
TODO - show how to use `family` and `variant` attributes.
TODO - show how to use FA pro via `data-webawesome-kit="..."`
### Colors ### Colors
Icons inherit their color from the current text color. Thus, you can set the `color` property on the `<sl-icon>` element or an ancestor to change the color. Icons inherit their color from the current text color. Thus, you can set the `color` property on the `<wa-icon>` element or an ancestor to change the color.
```html:preview ```html:preview
<div style="color: #4a90e2;"> <div style="color: #4a90e2;">
<sl-icon name="exclamation-triangle"></sl-icon> <wa-icon name="exclamation-triangle"></wa-icon>
<sl-icon name="archive"></sl-icon> <wa-icon name="archive"></wa-icon>
<sl-icon name="battery-charging"></sl-icon> <wa-icon name="battery-three-quarters"></wa-icon>
<sl-icon name="bell"></sl-icon> <wa-icon name="bell"></wa-icon>
</div> </div>
<div style="color: #9013fe;"> <div style="color: #9013fe;">
<sl-icon name="clock"></sl-icon> <wa-icon name="clock"></wa-icon>
<sl-icon name="cloud"></sl-icon> <wa-icon name="cloud"></wa-icon>
<sl-icon name="download"></sl-icon> <wa-icon name="download"></wa-icon>
<sl-icon name="file-earmark"></sl-icon> <wa-icon name="file"></wa-icon>
</div> </div>
<div style="color: #417505;"> <div style="color: #417505;">
<sl-icon name="flag"></sl-icon> <wa-icon name="flag"></wa-icon>
<sl-icon name="heart"></sl-icon> <wa-icon name="heart"></wa-icon>
<sl-icon name="image"></sl-icon> <wa-icon name="image"></wa-icon>
<sl-icon name="lightning"></sl-icon> <wa-icon name="bolt-lightning"></wa-icon>
</div> </div>
<div style="color: #f5a623;"> <div style="color: #f5a623;">
<sl-icon name="mic"></sl-icon> <wa-icon name="microphone"></wa-icon>
<sl-icon name="search"></sl-icon> <wa-icon name="search"></wa-icon>
<sl-icon name="star"></sl-icon> <wa-icon name="star"></wa-icon>
<sl-icon name="trash"></sl-icon> <wa-icon name="trash"></wa-icon>
</div> </div>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlIcon } from '@shoelace-style/shoelace/dist/react'; import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
const App = () => ( const App = () => (
<> <>
<div style={{ color: '#4a90e2' }}> <div style={{ color: '#4a90e2' }}>
<SlIcon name="exclamation-triangle"></SlIcon> <WaIcon name="exclamation-triangle"></WaIcon>
<SlIcon name="archive"></SlIcon> <WaIcon name="archive"></WaIcon>
<SlIcon name="battery-charging"></SlIcon> <WaIcon name="battery-three-quarters"></WaIcon>
<SlIcon name="bell"></SlIcon> <WaIcon name="bell"></WaIcon>
</div> </div>
<div style={{ color: '#9013fe' }}> <div style={{ color: '#9013fe' }}>
<SlIcon name="clock"></SlIcon> <WaIcon name="clock"></WaIcon>
<SlIcon name="cloud"></SlIcon> <WaIcon name="cloud"></WaIcon>
<SlIcon name="download"></SlIcon> <WaIcon name="download"></WaIcon>
<SlIcon name="file-earmark"></SlIcon> <WaIcon name="file"></WaIcon>
</div> </div>
<div style={{ color: '#417505' }}> <div style={{ color: '#417505' }}>
<SlIcon name="flag"></SlIcon> <WaIcon name="flag"></WaIcon>
<SlIcon name="heart"></SlIcon> <WaIcon name="heart"></WaIcon>
<SlIcon name="image"></SlIcon> <WaIcon name="image"></WaIcon>
<SlIcon name="lightning"></SlIcon> <WaIcon name="bolt-lightning"></WaIcon>
</div> </div>
<div style={{ color: '#f5a623' }}> <div style={{ color: '#f5a623' }}>
<SlIcon name="mic"></SlIcon> <WaIcon name="microphone"></WaIcon>
<SlIcon name="search"></SlIcon> <WaIcon name="search"></WaIcon>
<SlIcon name="star"></SlIcon> <WaIcon name="star"></WaIcon>
<SlIcon name="trash"></SlIcon> <WaIcon name="trash"></WaIcon>
</div> </div>
</> </>
); );
@@ -110,48 +98,48 @@ Icons are sized relative to the current font size. To change their size, set the
```html:preview ```html:preview
<div style="font-size: 32px;"> <div style="font-size: 32px;">
<sl-icon name="exclamation-triangle"></sl-icon> <wa-icon name="exclamation-triangle"></wa-icon>
<sl-icon name="archive"></sl-icon> <wa-icon name="archive"></wa-icon>
<sl-icon name="battery-charging"></sl-icon> <wa-icon name="battery-three-quarters"></wa-icon>
<sl-icon name="bell"></sl-icon> <wa-icon name="bell"></wa-icon>
<sl-icon name="clock"></sl-icon> <wa-icon name="clock"></wa-icon>
<sl-icon name="cloud"></sl-icon> <wa-icon name="cloud"></wa-icon>
<sl-icon name="download"></sl-icon> <wa-icon name="download"></wa-icon>
<sl-icon name="file-earmark"></sl-icon> <wa-icon name="file"></wa-icon>
<sl-icon name="flag"></sl-icon> <wa-icon name="flag"></wa-icon>
<sl-icon name="heart"></sl-icon> <wa-icon name="heart"></wa-icon>
<sl-icon name="image"></sl-icon> <wa-icon name="image"></wa-icon>
<sl-icon name="lightning"></sl-icon> <wa-icon name="bolt-lightning"></wa-icon>
<sl-icon name="mic"></sl-icon> <wa-icon name="microphone"></wa-icon>
<sl-icon name="search"></sl-icon> <wa-icon name="search"></wa-icon>
<sl-icon name="star"></sl-icon> <wa-icon name="star"></wa-icon>
<sl-icon name="trash"></sl-icon> <wa-icon name="trash"></wa-icon>
</div> </div>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlIcon } from '@shoelace-style/shoelace/dist/react'; import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
const App = () => ( const App = () => (
<div style={{ fontSize: '32px' }}> <div style={{ fontSize: '32px' }}>
<SlIcon name="exclamation-triangle" /> <WaIcon name="exclamation-triangle" />
<SlIcon name="archive" /> <WaIcon name="archive" />
<SlIcon name="battery-charging" /> <WaIcon name="battery-three-quarters" />
<SlIcon name="bell" /> <WaIcon name="bell" />
<SlIcon name="clock" /> <WaIcon name="clock" />
<SlIcon name="cloud" /> <WaIcon name="cloud" />
<SlIcon name="download" /> <WaIcon name="download" />
<SlIcon name="file-earmark" /> <WaIcon name="file" />
<SlIcon name="flag" /> <WaIcon name="flag" />
<SlIcon name="heart" /> <WaIcon name="heart" />
<SlIcon name="image" /> <WaIcon name="image" />
<SlIcon name="lightning" /> <WaIcon name="bolt-lightning" />
<SlIcon name="mic" /> <WaIcon name="microphone" />
<SlIcon name="search" /> <WaIcon name="search" />
<SlIcon name="star" /> <WaIcon name="star" />
<SlIcon name="trash" /> <WaIcon name="trash" />
</div> </div>
); );
``` ```
@@ -163,13 +151,13 @@ const App = () => (
For non-decorative icons, use the `label` attribute to announce it to assistive devices. For non-decorative icons, use the `label` attribute to announce it to assistive devices.
```html:preview ```html:preview
<sl-icon name="star-fill" label="Add to favorites"></sl-icon> <wa-icon name="star" label="Add to favorites"></wa-icon>
``` ```
```jsx:react ```jsx:react
import { SlIcon } from '@shoelace-style/shoelace/dist/react'; import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
const App = () => <SlIcon name="star-fill" label="Add to favorites" />; const App = () => <WaIcon name="star" label="Add to favorites" />;
``` ```
### Custom Icons ### Custom Icons
@@ -177,24 +165,24 @@ const App = () => <SlIcon name="star-fill" label="Add to favorites" />;
Custom icons can be loaded individually with the `src` attribute. Only SVGs on a local or CORS-enabled endpoint are supported. If you're using more than one custom icon, it might make sense to register a [custom icon library](#icon-libraries). Custom icons can be loaded individually with the `src` attribute. Only SVGs on a local or CORS-enabled endpoint are supported. If you're using more than one custom icon, it might make sense to register a [custom icon library](#icon-libraries).
```html:preview ```html:preview
<sl-icon src="https://shoelace.style/assets/images/shoe.svg" style="font-size: 8rem;"></sl-icon> <wa-icon src="https://shoelace.style/assets/images/shoe.svg" style="font-size: 8rem;"></wa-icon>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlIcon } from '@shoelace-style/shoelace/dist/react'; import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
const App = () => <SlIcon src="https://shoelace.style/assets/images/shoe.svg" style={{ fontSize: '8rem' }}></SlIcon>; const App = () => <WaIcon src="https://shoelace.style/assets/images/shoe.svg" style={{ fontSize: '8rem' }}></WaIcon>;
``` ```
{% endraw %} {% endraw %}
## Icon Libraries ## Icon Libraries
You can register additional icons to use with the `<sl-icon>` component through icon libraries. Icon files can exist locally or on a CORS-enabled endpoint (e.g. a CDN). There is no limit to how many icon libraries you can register and there is no cost associated with registering them, as individual icons are only requested when they're used. You can register additional icons to use with the `<wa-icon>` component through icon libraries. Icon files can exist locally or on a CORS-enabled endpoint (e.g. a CDN). There is no limit to how many icon libraries you can register and there is no cost associated with registering them, as individual icons are only requested when they're used.
Shoelace ships with two built-in icon libraries, `default` and `system`. The [default icon library](#customizing-the-default-library) contains all of the icons in the Bootstrap Icons project. The [system icon library](#customizing-the-system-library) contains only a small subset of icons that are used internally by Shoelace components. Web Awesome ships with two built-in icon libraries, `default` and `system`. The [default icon library](#customizing-the-default-library) contains all of the icons in the Bootstrap Icons project. The [system icon library](#customizing-the-system-library) contains only a small subset of icons that are used internally by Web Awesome components.
To register an additional icon library, use the `registerIconLibrary()` function that's exported from `utilities/icon-library.js`. At a minimum, you must provide a name and a resolver function. The resolver function translates an icon name to a URL where the corresponding SVG file exists. Refer to the examples below to better understand how it works. To register an additional icon library, use the `registerIconLibrary()` function that's exported from `utilities/icon-library.js`. At a minimum, you must provide a name and a resolver function. The resolver function translates an icon name to a URL where the corresponding SVG file exists. Refer to the examples below to better understand how it works.
@@ -213,11 +201,11 @@ Here's an example that registers an icon library located in the `/assets/icons`
</script> </script>
``` ```
To display an icon, set the `library` and `name` attributes of an `<sl-icon>` element. To display an icon, set the `library` and `name` attributes of an `<wa-icon>` element.
```html ```html
<!-- This will show the icon located at /assets/icons/smile.svg --> <!-- This will show the icon located at /assets/icons/smile.svg -->
<sl-icon library="my-icons" name="smile"></sl-icon> <wa-icon library="my-icons" name="smile"></wa-icon>
``` ```
If an icon is used before registration occurs, it will be empty initially but shown when registered. If an icon is used before registration occurs, it will be empty initially but shown when registered.
@@ -246,26 +234,26 @@ Icons in this library are licensed under the [Creative Commons 4.0 License](http
</script> </script>
<div style="font-size: 24px;"> <div style="font-size: 24px;">
<sl-icon library="boxicons" name="bx-bot"></sl-icon> <wa-icon library="boxicons" name="bx-bot"></wa-icon>
<sl-icon library="boxicons" name="bx-cookie"></sl-icon> <wa-icon library="boxicons" name="bx-cookie"></wa-icon>
<sl-icon library="boxicons" name="bx-joystick"></sl-icon> <wa-icon library="boxicons" name="bx-joystick"></wa-icon>
<sl-icon library="boxicons" name="bx-save"></sl-icon> <wa-icon library="boxicons" name="bx-save"></wa-icon>
<sl-icon library="boxicons" name="bx-server"></sl-icon> <wa-icon library="boxicons" name="bx-server"></wa-icon>
<sl-icon library="boxicons" name="bx-wine"></sl-icon> <wa-icon library="boxicons" name="bx-wine"></wa-icon>
<br /> <br />
<sl-icon library="boxicons" name="bxs-bot"></sl-icon> <wa-icon library="boxicons" name="bxs-bot"></wa-icon>
<sl-icon library="boxicons" name="bxs-cookie"></sl-icon> <wa-icon library="boxicons" name="bxs-cookie"></wa-icon>
<sl-icon library="boxicons" name="bxs-joystick"></sl-icon> <wa-icon library="boxicons" name="bxs-joystick"></wa-icon>
<sl-icon library="boxicons" name="bxs-save"></sl-icon> <wa-icon library="boxicons" name="bxs-save"></wa-icon>
<sl-icon library="boxicons" name="bxs-server"></sl-icon> <wa-icon library="boxicons" name="bxs-server"></wa-icon>
<sl-icon library="boxicons" name="bxs-wine"></sl-icon> <wa-icon library="boxicons" name="bxs-wine"></wa-icon>
<br /> <br />
<sl-icon library="boxicons" name="bxl-apple"></sl-icon> <wa-icon library="boxicons" name="bxl-apple"></wa-icon>
<sl-icon library="boxicons" name="bxl-chrome"></sl-icon> <wa-icon library="boxicons" name="bxl-chrome"></wa-icon>
<sl-icon library="boxicons" name="bxl-edge"></sl-icon> <wa-icon library="boxicons" name="bxl-edge"></wa-icon>
<sl-icon library="boxicons" name="bxl-firefox"></sl-icon> <wa-icon library="boxicons" name="bxl-firefox"></wa-icon>
<sl-icon library="boxicons" name="bxl-opera"></sl-icon> <wa-icon library="boxicons" name="bxl-opera"></wa-icon>
<sl-icon library="boxicons" name="bxl-microsoft"></sl-icon> <wa-icon library="boxicons" name="bxl-microsoft"></wa-icon>
</div> </div>
``` ```
@@ -277,12 +265,12 @@ Icons in this library are licensed under the [MIT License](https://github.com/lu
```html:preview ```html:preview
<div style="font-size: 24px;"> <div style="font-size: 24px;">
<sl-icon library="lucide" name="feather"></sl-icon> <wa-icon library="lucide" name="feather"></wa-icon>
<sl-icon library="lucide" name="pie-chart"></sl-icon> <wa-icon library="lucide" name="pie-chart"></wa-icon>
<sl-icon library="lucide" name="settings"></sl-icon> <wa-icon library="lucide" name="settings"></wa-icon>
<sl-icon library="lucide" name="map-pin"></sl-icon> <wa-icon library="lucide" name="map-pin"></wa-icon>
<sl-icon library="lucide" name="printer"></sl-icon> <wa-icon library="lucide" name="printer"></wa-icon>
<sl-icon library="lucide" name="shopping-cart"></sl-icon> <wa-icon library="lucide" name="shopping-cart"></wa-icon>
</div> </div>
<script type="module"> <script type="module">
@@ -317,26 +305,26 @@ Icons in this library are licensed under the [Font Awesome Free License](https:/
</script> </script>
<div style="font-size: 24px;"> <div style="font-size: 24px;">
<sl-icon library="fa" name="far-bell"></sl-icon> <wa-icon library="fa" name="far-bell"></wa-icon>
<sl-icon library="fa" name="far-comment"></sl-icon> <wa-icon library="fa" name="far-comment"></wa-icon>
<sl-icon library="fa" name="far-hand-point-right"></sl-icon> <wa-icon library="fa" name="far-hand-point-right"></wa-icon>
<sl-icon library="fa" name="far-hdd"></sl-icon> <wa-icon library="fa" name="far-hdd"></wa-icon>
<sl-icon library="fa" name="far-heart"></sl-icon> <wa-icon library="fa" name="far-heart"></wa-icon>
<sl-icon library="fa" name="far-star"></sl-icon> <wa-icon library="fa" name="far-star"></wa-icon>
<br /> <br />
<sl-icon library="fa" name="fas-archive"></sl-icon> <wa-icon library="fa" name="fas-archive"></wa-icon>
<sl-icon library="fa" name="fas-book"></sl-icon> <wa-icon library="fa" name="fas-book"></wa-icon>
<sl-icon library="fa" name="fas-chess-knight"></sl-icon> <wa-icon library="fa" name="fas-chess-knight"></wa-icon>
<sl-icon library="fa" name="fas-dice"></sl-icon> <wa-icon library="fa" name="fas-dice"></wa-icon>
<sl-icon library="fa" name="fas-pizza-slice"></sl-icon> <wa-icon library="fa" name="fas-pizza-slice"></wa-icon>
<sl-icon library="fa" name="fas-scroll"></sl-icon> <wa-icon library="fa" name="fas-scroll"></wa-icon>
<br /> <br />
<sl-icon library="fa" name="fab-apple"></sl-icon> <wa-icon library="fa" name="fab-apple"></wa-icon>
<sl-icon library="fa" name="fab-chrome"></sl-icon> <wa-icon library="fa" name="fab-chrome"></wa-icon>
<sl-icon library="fa" name="fab-edge"></sl-icon> <wa-icon library="fa" name="fab-edge"></wa-icon>
<sl-icon library="fa" name="fab-firefox"></sl-icon> <wa-icon library="fa" name="fab-firefox"></wa-icon>
<sl-icon library="fa" name="fab-opera"></sl-icon> <wa-icon library="fa" name="fab-opera"></wa-icon>
<sl-icon library="fa" name="fab-microsoft"></sl-icon> <wa-icon library="fa" name="fab-microsoft"></wa-icon>
</div> </div>
``` ```
@@ -356,12 +344,12 @@ Icons in this library are licensed under the [MIT License](https://github.com/ta
</script> </script>
<div style="font-size: 24px;"> <div style="font-size: 24px;">
<sl-icon library="heroicons" name="chat-bubble-left"></sl-icon> <wa-icon library="heroicons" name="chat-bubble-left"></wa-icon>
<sl-icon library="heroicons" name="cloud"></sl-icon> <wa-icon library="heroicons" name="cloud"></wa-icon>
<sl-icon library="heroicons" name="cog"></sl-icon> <wa-icon library="heroicons" name="cog"></wa-icon>
<sl-icon library="heroicons" name="document-text"></sl-icon> <wa-icon library="heroicons" name="document-text"></wa-icon>
<sl-icon library="heroicons" name="gift"></sl-icon> <wa-icon library="heroicons" name="gift"></wa-icon>
<sl-icon library="heroicons" name="speaker-wave"></sl-icon> <wa-icon library="heroicons" name="speaker-wave"></wa-icon>
</div> </div>
``` ```
@@ -381,12 +369,12 @@ Icons in this library are licensed under the [MIT License](https://github.com/lu
</script> </script>
<div style="font-size: 24px;"> <div style="font-size: 24px;">
<sl-icon library="iconoir" name="check-circled-outline"></sl-icon> <wa-icon library="iconoir" name="check-circled-outline"></wa-icon>
<sl-icon library="iconoir" name="drawer"></sl-icon> <wa-icon library="iconoir" name="drawer"></wa-icon>
<sl-icon library="iconoir" name="keyframes"></sl-icon> <wa-icon library="iconoir" name="keyframes"></wa-icon>
<sl-icon library="iconoir" name="headset-help"></sl-icon> <wa-icon library="iconoir" name="headset-help"></wa-icon>
<sl-icon library="iconoir" name="color-picker"></sl-icon> <wa-icon library="iconoir" name="color-picker"></wa-icon>
<sl-icon library="iconoir" name="wifi"></sl-icon> <wa-icon library="iconoir" name="wifi"></wa-icon>
</div> </div>
``` ```
@@ -412,26 +400,26 @@ Icons in this library are licensed under the [MIT License](https://github.com/io
</script> </script>
<div style="font-size: 24px;"> <div style="font-size: 24px;">
<sl-icon library="ionicons" name="alarm"></sl-icon> <wa-icon library="ionicons" name="alarm"></wa-icon>
<sl-icon library="ionicons" name="american-football"></sl-icon> <wa-icon library="ionicons" name="american-football"></wa-icon>
<sl-icon library="ionicons" name="bug"></sl-icon> <wa-icon library="ionicons" name="bug"></wa-icon>
<sl-icon library="ionicons" name="chatbubble"></sl-icon> <wa-icon library="ionicons" name="chatbubble"></wa-icon>
<sl-icon library="ionicons" name="settings"></sl-icon> <wa-icon library="ionicons" name="settings"></wa-icon>
<sl-icon library="ionicons" name="warning"></sl-icon> <wa-icon library="ionicons" name="warning"></wa-icon>
<br /> <br />
<sl-icon library="ionicons" name="alarm-outline"></sl-icon> <wa-icon library="ionicons" name="alarm-outline"></wa-icon>
<sl-icon library="ionicons" name="american-football-outline"></sl-icon> <wa-icon library="ionicons" name="american-football-outline"></wa-icon>
<sl-icon library="ionicons" name="bug-outline"></sl-icon> <wa-icon library="ionicons" name="bug-outline"></wa-icon>
<sl-icon library="ionicons" name="chatbubble-outline"></sl-icon> <wa-icon library="ionicons" name="chatbubble-outline"></wa-icon>
<sl-icon library="ionicons" name="settings-outline"></sl-icon> <wa-icon library="ionicons" name="settings-outline"></wa-icon>
<sl-icon library="ionicons" name="warning-outline"></sl-icon> <wa-icon library="ionicons" name="warning-outline"></wa-icon>
<br /> <br />
<sl-icon library="ionicons" name="alarm-sharp"></sl-icon> <wa-icon library="ionicons" name="alarm-sharp"></wa-icon>
<sl-icon library="ionicons" name="american-football-sharp"></sl-icon> <wa-icon library="ionicons" name="american-football-sharp"></wa-icon>
<sl-icon library="ionicons" name="bug-sharp"></sl-icon> <wa-icon library="ionicons" name="bug-sharp"></wa-icon>
<sl-icon library="ionicons" name="chatbubble-sharp"></sl-icon> <wa-icon library="ionicons" name="chatbubble-sharp"></wa-icon>
<sl-icon library="ionicons" name="settings-sharp"></sl-icon> <wa-icon library="ionicons" name="settings-sharp"></wa-icon>
<sl-icon library="ionicons" name="warning-sharp"></sl-icon> <wa-icon library="ionicons" name="warning-sharp"></wa-icon>
</div> </div>
``` ```
@@ -452,19 +440,19 @@ Icons in this library are licensed under the [MIT License](https://github.com/mi
</script> </script>
<div style="font-size: 24px;"> <div style="font-size: 24px;">
<sl-icon library="jam" name="calendar"></sl-icon> <wa-icon library="jam" name="calendar"></wa-icon>
<sl-icon library="jam" name="camera"></sl-icon> <wa-icon library="jam" name="camera"></wa-icon>
<sl-icon library="jam" name="filter"></sl-icon> <wa-icon library="jam" name="filter"></wa-icon>
<sl-icon library="jam" name="leaf"></sl-icon> <wa-icon library="jam" name="leaf"></wa-icon>
<sl-icon library="jam" name="picture"></sl-icon> <wa-icon library="jam" name="picture"></wa-icon>
<sl-icon library="jam" name="set-square"></sl-icon> <wa-icon library="jam" name="set-square"></wa-icon>
<br /> <br />
<sl-icon library="jam" name="calendar-f"></sl-icon> <wa-icon library="jam" name="calendar-f"></wa-icon>
<sl-icon library="jam" name="camera-f"></sl-icon> <wa-icon library="jam" name="camera-f"></wa-icon>
<sl-icon library="jam" name="filter-f"></sl-icon> <wa-icon library="jam" name="filter-f"></wa-icon>
<sl-icon library="jam" name="leaf-f"></sl-icon> <wa-icon library="jam" name="leaf-f"></wa-icon>
<sl-icon library="jam" name="picture-f"></sl-icon> <wa-icon library="jam" name="picture-f"></wa-icon>
<sl-icon library="jam" name="set-square-f"></sl-icon> <wa-icon library="jam" name="set-square-f"></wa-icon>
</div> </div>
``` ```
@@ -488,26 +476,26 @@ Icons in this library are licensed under the [Apache 2.0 License](https://github
</script> </script>
<div style="font-size: 24px;"> <div style="font-size: 24px;">
<sl-icon library="material" name="notifications"></sl-icon> <wa-icon library="material" name="notifications"></wa-icon>
<sl-icon library="material" name="email"></sl-icon> <wa-icon library="material" name="email"></wa-icon>
<sl-icon library="material" name="delete"></sl-icon> <wa-icon library="material" name="delete"></wa-icon>
<sl-icon library="material" name="volume_up"></sl-icon> <wa-icon library="material" name="volume_up"></wa-icon>
<sl-icon library="material" name="settings"></sl-icon> <wa-icon library="material" name="settings"></wa-icon>
<sl-icon library="material" name="shopping_basket"></sl-icon> <wa-icon library="material" name="shopping_basket"></wa-icon>
<br /> <br />
<sl-icon library="material" name="notifications_round"></sl-icon> <wa-icon library="material" name="notifications_round"></wa-icon>
<sl-icon library="material" name="email_round"></sl-icon> <wa-icon library="material" name="email_round"></wa-icon>
<sl-icon library="material" name="delete_round"></sl-icon> <wa-icon library="material" name="delete_round"></wa-icon>
<sl-icon library="material" name="volume_up_round"></sl-icon> <wa-icon library="material" name="volume_up_round"></wa-icon>
<sl-icon library="material" name="settings_round"></sl-icon> <wa-icon library="material" name="settings_round"></wa-icon>
<sl-icon library="material" name="shopping_basket_round"></sl-icon> <wa-icon library="material" name="shopping_basket_round"></wa-icon>
<br /> <br />
<sl-icon library="material" name="notifications_sharp"></sl-icon> <wa-icon library="material" name="notifications_sharp"></wa-icon>
<sl-icon library="material" name="email_sharp"></sl-icon> <wa-icon library="material" name="email_sharp"></wa-icon>
<sl-icon library="material" name="delete_sharp"></sl-icon> <wa-icon library="material" name="delete_sharp"></wa-icon>
<sl-icon library="material" name="volume_up_sharp"></sl-icon> <wa-icon library="material" name="volume_up_sharp"></wa-icon>
<sl-icon library="material" name="settings_sharp"></sl-icon> <wa-icon library="material" name="settings_sharp"></wa-icon>
<sl-icon library="material" name="shopping_basket_sharp"></sl-icon> <wa-icon library="material" name="shopping_basket_sharp"></wa-icon>
</div> </div>
``` ```
@@ -532,19 +520,19 @@ Icons in this library are licensed under the [Apache 2.0 License](https://github
</script> </script>
<div style="font-size: 24px;"> <div style="font-size: 24px;">
<sl-icon library="remixicon" name="business/cloud-line"></sl-icon> <wa-icon library="remixicon" name="business/cloud-line"></wa-icon>
<sl-icon library="remixicon" name="design/brush-line"></sl-icon> <wa-icon library="remixicon" name="design/brush-line"></wa-icon>
<sl-icon library="remixicon" name="business/pie-chart-line"></sl-icon> <wa-icon library="remixicon" name="business/pie-chart-line"></wa-icon>
<sl-icon library="remixicon" name="development/bug-line"></sl-icon> <wa-icon library="remixicon" name="development/bug-line"></wa-icon>
<sl-icon library="remixicon" name="media/image-line"></sl-icon> <wa-icon library="remixicon" name="media/image-line"></wa-icon>
<sl-icon library="remixicon" name="system/alert-line"></sl-icon> <wa-icon library="remixicon" name="system/alert-line"></wa-icon>
<br /> <br />
<sl-icon library="remixicon" name="business/cloud-fill"></sl-icon> <wa-icon library="remixicon" name="business/cloud-fill"></wa-icon>
<sl-icon library="remixicon" name="design/brush-fill"></sl-icon> <wa-icon library="remixicon" name="design/brush-fill"></wa-icon>
<sl-icon library="remixicon" name="business/pie-chart-fill"></sl-icon> <wa-icon library="remixicon" name="business/pie-chart-fill"></wa-icon>
<sl-icon library="remixicon" name="development/bug-fill"></sl-icon> <wa-icon library="remixicon" name="development/bug-fill"></wa-icon>
<sl-icon library="remixicon" name="media/image-fill"></sl-icon> <wa-icon library="remixicon" name="media/image-fill"></wa-icon>
<sl-icon library="remixicon" name="system/alert-fill"></sl-icon> <wa-icon library="remixicon" name="system/alert-fill"></wa-icon>
</div> </div>
``` ```
@@ -564,19 +552,19 @@ Icons in this library are licensed under the [MIT License](https://github.com/ta
</script> </script>
<div style="font-size: 24px;"> <div style="font-size: 24px;">
<sl-icon library="tabler" name="alert-triangle"></sl-icon> <wa-icon library="tabler" name="alert-triangle"></wa-icon>
<sl-icon library="tabler" name="arrow-back"></sl-icon> <wa-icon library="tabler" name="arrow-back"></wa-icon>
<sl-icon library="tabler" name="at"></sl-icon> <wa-icon library="tabler" name="at"></wa-icon>
<sl-icon library="tabler" name="ball-baseball"></sl-icon> <wa-icon library="tabler" name="ball-baseball"></wa-icon>
<sl-icon library="tabler" name="cake"></sl-icon> <wa-icon library="tabler" name="cake"></wa-icon>
<sl-icon library="tabler" name="files"></sl-icon> <wa-icon library="tabler" name="files"></wa-icon>
<br /> <br />
<sl-icon library="tabler" name="keyboard"></sl-icon> <wa-icon library="tabler" name="keyboard"></wa-icon>
<sl-icon library="tabler" name="moon"></sl-icon> <wa-icon library="tabler" name="moon"></wa-icon>
<sl-icon library="tabler" name="pig"></sl-icon> <wa-icon library="tabler" name="pig"></wa-icon>
<sl-icon library="tabler" name="printer"></sl-icon> <wa-icon library="tabler" name="printer"></wa-icon>
<sl-icon library="tabler" name="ship"></sl-icon> <wa-icon library="tabler" name="ship"></wa-icon>
<sl-icon library="tabler" name="toilet-paper"></sl-icon> <wa-icon library="tabler" name="toilet-paper"></wa-icon>
</div> </div>
``` ```
@@ -602,25 +590,25 @@ Icons in this library are licensed under the [Apache 2.0 License](https://github
</script> </script>
<div style="font-size: 24px;"> <div style="font-size: 24px;">
<sl-icon library="unicons" name="clock"></sl-icon> <wa-icon library="unicons" name="clock"></wa-icon>
<sl-icon library="unicons" name="graph-bar"></sl-icon> <wa-icon library="unicons" name="graph-bar"></wa-icon>
<sl-icon library="unicons" name="padlock"></sl-icon> <wa-icon library="unicons" name="padlock"></wa-icon>
<sl-icon library="unicons" name="polygon"></sl-icon> <wa-icon library="unicons" name="polygon"></wa-icon>
<sl-icon library="unicons" name="rocket"></sl-icon> <wa-icon library="unicons" name="rocket"></wa-icon>
<sl-icon library="unicons" name="star"></sl-icon> <wa-icon library="unicons" name="star"></wa-icon>
<br /> <br />
<sl-icon library="unicons" name="clock-s"></sl-icon> <wa-icon library="unicons" name="clock-s"></wa-icon>
<sl-icon library="unicons" name="graph-bar-s"></sl-icon> <wa-icon library="unicons" name="graph-bar-s"></wa-icon>
<sl-icon library="unicons" name="padlock-s"></sl-icon> <wa-icon library="unicons" name="padlock-s"></wa-icon>
<sl-icon library="unicons" name="polygon-s"></sl-icon> <wa-icon library="unicons" name="polygon-s"></wa-icon>
<sl-icon library="unicons" name="rocket-s"></sl-icon> <wa-icon library="unicons" name="rocket-s"></wa-icon>
<sl-icon library="unicons" name="star-s"></sl-icon> <wa-icon library="unicons" name="star-s"></wa-icon>
</div> </div>
``` ```
### Customizing the Default Library ### Customizing the Default Library
The default icon library contains over 1,300 icons courtesy of the [Bootstrap Icons](https://icons.getbootstrap.com/) project. These are the icons that display when you use `<sl-icon>` without the `library` attribute. If you prefer to have these icons resolve elsewhere or to a different icon library, register an icon library using the `default` name and a custom resolver. The default icon library contains over 1,300 icons courtesy of the [Bootstrap Icons](https://icons.getbootstrap.com/) project. These are the icons that display when you use `<wa-icon>` without the `library` attribute. If you prefer to have these icons resolve elsewhere or to a different icon library, register an icon library using the `default` name and a custom resolver.
This example will load the same set of icons from the jsDelivr CDN instead of your local assets folder. This example will load the same set of icons from the jsDelivr CDN instead of your local assets folder.
@@ -634,11 +622,42 @@ This example will load the same set of icons from the jsDelivr CDN instead of yo
</script> </script>
``` ```
#### Customize the default library to use SVG sprites
To improve performance you can use a SVG sprites to avoid multiple trips for each SVG. The browser will load the sprite sheet once and then you reference the particular SVG within the sprite sheet using hash selector.
As always, make sure to benchmark these changes. When using HTTP/2, it may in fact be more bandwidth-friendly to use multiple small requests instead of 1 large sprite sheet.
:::danger
When using sprite sheets, the `wa-load` and `wa-error` events will not fire.
:::
:::danger
For security reasons, browsers may apply the same-origin policy on `<use>` elements located in the `<wa-icon>` shadow DOM and may refuse to load a cross-origin URL. There is currently no defined way to set a cross-origin policy for `<use>` elements. For this reason, sprite sheets should only be used if you're self-hosting them.
:::
```html:preview
<script type="module">
import { registerIconLibrary } from '/dist/utilities/icon-library.js';
registerIconLibrary('sprite', {
resolver: name => `/assets/images/sprite.svg#${name}`,
mutator: svg => svg.setAttribute('fill', 'currentColor'),
spriteSheet: true
});
</script>
<div style="font-size: 24px;">
<wa-icon library="sprite" name="clock"></wa-icon>
<wa-icon library="sprite" name="speedometer"></wa-icon>
</div>
```
### Customizing the System Library ### Customizing the System Library
The system library contains only the icons used internally by Shoelace components. Unlike the default icon library, the system library does not rely on physical assets. Instead, its icons are hard-coded as data URIs into the resolver to ensure their availability. The system library contains only the icons used internally by Web Awesome components. Unlike the default icon library, the system library does not rely on physical assets. Instead, its icons are hard-coded as data URIs into the resolver to ensure their availability.
If you want to change the icons Shoelace uses internally, you can register an icon library using the `system` name and a custom resolver. If you choose to do this, it's your responsibility to provide all of the icons that are required by components. You can reference `src/components/library.system.ts` for a complete list of system icons used by Shoelace. If you want to change the icons Web Awesome uses internally, you can register an icon library using the `system` name and a custom resolver. If you choose to do this, it's your responsibility to provide all of the icons that are required by components. You can reference `src/components/library.system.ts` for a complete list of system icons used by Web Awesome.
```html ```html
<script type="module"> <script type="module">
@@ -649,190 +668,3 @@ If you want to change the icons Shoelace uses internally, you can register an ic
}); });
</script> </script>
``` ```
<!-- Supporting scripts and styles for the search utility -->
<script>
function wrapWithTooltip(item) {
const tooltip = document.createElement('sl-tooltip');
tooltip.content = item.getAttribute('data-name');
// Close open tooltips
document.querySelectorAll('.icon-list sl-tooltip[open]').forEach(tooltip => tooltip.hide());
// Wrap it with a tooltip and trick it into showing up
item.parentNode.insertBefore(tooltip, item);
tooltip.appendChild(item);
requestAnimationFrame(() => tooltip.dispatchEvent(new MouseEvent('mouseover')));
}
fetch('/dist/assets/icons/icons.json')
.then(res => res.json())
.then(icons => {
const container = document.querySelector('.icon-search');
const input = container.querySelector('sl-input');
const select = container.querySelector('sl-select');
const copyInput = container.querySelector('.icon-copy-input');
const loader = container.querySelector('.icon-loader');
const list = container.querySelector('.icon-list');
const queue = [];
let inputTimeout;
// Generate icons
icons.map(i => {
const item = document.createElement('div');
item.classList.add('icon-list-item');
item.setAttribute('data-name', i.name);
item.setAttribute('data-terms', [i.name, i.title, ...(i.tags || []), ...(i.categories || [])].join(' '));
item.innerHTML = `
<svg width="1em" height="1em" fill="currentColor">
<use xlink:href="/assets/images/sprite.svg#${i.name}"></use>
</svg>
`;
list.appendChild(item);
// Wrap it with a tooltip the first time the mouse lands on it. We do this instead of baking them into the DOM
// to improve this page's performance. See: https://github.com/shoelace-style/shoelace/issues/1122
item.addEventListener('mouseover', () => wrapWithTooltip(item), { once: true });
// Copy on click
item.addEventListener('click', () => {
const tooltip = item.closest('sl-tooltip');
copyInput.value = i.name;
copyInput.select();
document.execCommand('copy');
if (tooltip) {
tooltip.content = 'Copied!';
setTimeout(() => tooltip.content = i.name, 1000);
}
});
});
// Filter as the user types
input.addEventListener('sl-input', () => {
clearTimeout(inputTimeout);
inputTimeout = setTimeout(() => {
[...list.querySelectorAll('.icon-list-item')].map(item => {
const filter = input.value.toLowerCase();
if (filter === '') {
item.hidden = false;
} else {
const terms = item.getAttribute('data-terms').toLowerCase();
item.hidden = terms.indexOf(filter) < 0;
}
});
}, 250);
});
// Sort by type and remember preference
const iconType = sessionStorage.getItem('sl-icon:type') || 'outline';
select.value = iconType;
list.setAttribute('data-type', select.value);
select.addEventListener('sl-change', () => {
list.setAttribute('data-type', select.value);
sessionStorage.setItem('sl-icon:type', select.value);
});
});
</script>
<style>
.icon-search {
border: solid 1px var(--sl-panel-border-color);
border-radius: var(--sl-border-radius-medium);
padding: var(--sl-spacing-medium);
}
.icon-search [hidden] {
display: none;
}
.icon-search-controls {
display: flex;
}
.icon-search-controls sl-input {
flex: 1 1 auto;
}
.icon-search-controls sl-select {
width: 10rem;
flex: 0 0 auto;
margin-left: 1rem;
}
.icon-loader {
display: flex;
align-items: center;
justify-content: center;
min-height: 30vh;
}
.icon-list {
display: grid;
grid-template-columns: repeat(12, 1fr);
position: relative;
margin-top: 1rem;
}
.icon-loader[hidden],
.icon-list[hidden] {
display: none;
}
.icon-list-item {
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: var(--sl-border-radius-medium);
font-size: 24px;
width: 2em;
height: 2em;
margin: 0 auto;
cursor: copy;
transition: var(--sl-transition-medium) all;
}
.icon-list-item:hover {
background-color: var(--sl-color-primary-50);
color: var(--sl-color-primary-600);
}
.icon-list[data-type="outline"] .icon-list-item[data-name$="-fill"] {
display: none;
}
.icon-list[data-type="fill"] .icon-list-item:not([data-name$="-fill"]) {
display: none;
}
.icon-copy-input {
position: absolute;
opacity: 0;
pointer-events: none;
}
@media screen and (max-width: 1000px) {
.icon-list {
grid-template-columns: repeat(8, 1fr);
}
.icon-list-item {
font-size: 20px;
}
.icon-search-controls {
display: block;
}
.icon-search-controls sl-select {
width: auto;
margin: 1rem 0 0 0;
}
}
@media screen and (max-width: 500px) {
.icon-list {
grid-template-columns: repeat(4, 1fr);
}
}
</style>

View File

@@ -8,7 +8,7 @@ layout: component
For best results, use images that share the same dimensions. The slider can be controlled by dragging or pressing the left and right arrow keys. (Tip: press shift + arrows to move the slider in larger intervals, or home + end to jump to the beginning or end.) For best results, use images that share the same dimensions. The slider can be controlled by dragging or pressing the left and right arrow keys. (Tip: press shift + arrows to move the slider in larger intervals, or home + end to jump to the beginning or end.)
```html:preview ```html:preview
<sl-image-comparer> <wa-image-comparer>
<img <img
slot="before" slot="before"
src="https://images.unsplash.com/photo-1517331156700-3c241d2b4d83?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=800&q=80&sat=-100&bri=-5" src="https://images.unsplash.com/photo-1517331156700-3c241d2b4d83?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=800&q=80&sat=-100&bri=-5"
@@ -19,14 +19,14 @@ For best results, use images that share the same dimensions. The slider can be c
src="https://images.unsplash.com/photo-1517331156700-3c241d2b4d83?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=800&q=80" src="https://images.unsplash.com/photo-1517331156700-3c241d2b4d83?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=800&q=80"
alt="Color version of kittens in a basket looking around." alt="Color version of kittens in a basket looking around."
/> />
</sl-image-comparer> </wa-image-comparer>
``` ```
```jsx:react ```jsx:react
import { SlImageComparer } from '@shoelace-style/shoelace/dist/react'; import WaImageComparer from '@shoelace-style/shoelace/dist/react/image-comparer';
const App = () => ( const App = () => (
<SlImageComparer> <WaImageComparer>
<img <img
slot="before" slot="before"
src="https://images.unsplash.com/photo-1517331156700-3c241d2b4d83?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=800&q=80&sat=-100&bri=-5" src="https://images.unsplash.com/photo-1517331156700-3c241d2b4d83?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=800&q=80&sat=-100&bri=-5"
@@ -37,7 +37,7 @@ const App = () => (
src="https://images.unsplash.com/photo-1517331156700-3c241d2b4d83?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=800&q=80" src="https://images.unsplash.com/photo-1517331156700-3c241d2b4d83?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=800&q=80"
alt="Color version of kittens in a basket looking around." alt="Color version of kittens in a basket looking around."
/> />
</SlImageComparer> </WaImageComparer>
); );
``` ```
@@ -48,7 +48,7 @@ const App = () => (
Use the `position` attribute to set the initial position of the slider. This is a percentage from `0` to `100`. Use the `position` attribute to set the initial position of the slider. This is a percentage from `0` to `100`.
```html:preview ```html:preview
<sl-image-comparer position="25"> <wa-image-comparer position="25">
<img <img
slot="before" slot="before"
src="https://images.unsplash.com/photo-1520903074185-8eca362b3dce?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1200&q=80" src="https://images.unsplash.com/photo-1520903074185-8eca362b3dce?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1200&q=80"
@@ -59,14 +59,14 @@ Use the `position` attribute to set the initial position of the slider. This is
src="https://images.unsplash.com/photo-1520640023173-50a135e35804?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2250&q=80" src="https://images.unsplash.com/photo-1520640023173-50a135e35804?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2250&q=80"
alt="A person sitting on a yellow curb tying shoelaces on a boot." alt="A person sitting on a yellow curb tying shoelaces on a boot."
/> />
</sl-image-comparer> </wa-image-comparer>
``` ```
```jsx:react ```jsx:react
import { SlImageComparer } from '@shoelace-style/shoelace/dist/react'; import WaImageComparer from '@shoelace-style/shoelace/dist/react/image-comparer';
const App = () => ( const App = () => (
<SlImageComparer position={25}> <WaImageComparer position={25}>
<img <img
slot="before" slot="before"
src="https://images.unsplash.com/photo-1520903074185-8eca362b3dce?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1200&q=80" src="https://images.unsplash.com/photo-1520903074185-8eca362b3dce?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1200&q=80"
@@ -77,6 +77,6 @@ const App = () => (
src="https://images.unsplash.com/photo-1520640023173-50a135e35804?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2250&q=80" src="https://images.unsplash.com/photo-1520640023173-50a135e35804?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2250&q=80"
alt="A person sitting on a yellow curb tying shoelaces on a boot." alt="A person sitting on a yellow curb tying shoelaces on a boot."
/> />
</SlImageComparer> </WaImageComparer>
); );
``` ```

View File

@@ -7,39 +7,39 @@ layout: component
Included files are asynchronously requested using `window.fetch()`. Requests are cached, so the same file can be included multiple times, but only one request will be made. Included files are asynchronously requested using `window.fetch()`. Requests are cached, so the same file can be included multiple times, but only one request will be made.
The included content will be inserted into the `<sl-include>` element's default slot so it can be easily accessed and styled through the light DOM. The included content will be inserted into the `<wa-include>` element's default slot so it can be easily accessed and styled through the light DOM.
```html:preview ```html:preview
<sl-include src="https://shoelace.style/assets/examples/include.html"></sl-include> <wa-include src="https://shoelace.style/assets/examples/include.html"></wa-include>
``` ```
```jsx:react ```jsx:react
import { SlInclude } from '@shoelace-style/shoelace/dist/react'; import WaInclude from '@shoelace-style/shoelace/dist/react/include';
const App = () => <SlInclude src="https://shoelace.style/assets/examples/include.html" />; const App = () => <WaInclude src="https://shoelace.style/assets/examples/include.html" />;
``` ```
## Examples ## Examples
### Listening for Events ### Listening for Events
When an include file loads successfully, the `sl-load` event will be emitted. You can listen for this event to add custom loading logic to your includes. When an include file loads successfully, the `wa-load` event will be emitted. You can listen for this event to add custom loading logic to your includes.
If the request fails, the `sl-error` event will be emitted. In this case, `event.detail.status` will contain the resulting HTTP status code of the request, e.g. 404 (not found). If the request fails, the `wa-error` event will be emitted. In this case, `event.detail.status` will contain the resulting HTTP status code of the request, e.g. 404 (not found).
```html ```html
<sl-include src="https://shoelace.style/assets/examples/include.html"></sl-include> <wa-include src="https://shoelace.style/assets/examples/include.html"></wa-include>
<script> <script>
const include = document.querySelector('sl-include'); const include = document.querySelector('wa-include');
include.addEventListener('sl-load', event => { include.addEventListener('wa-load', event => {
if (event.eventPhase === Event.AT_TARGET) { if (event.eventPhase === Event.AT_TARGET) {
console.log('Success'); console.log('Success');
} }
}); });
include.addEventListener('sl-error', event => { include.addEventListener('wa-error', event => {
if (event.eventPhase === Event.AT_TARGET) { if (event.eventPhase === Event.AT_TARGET) {
console.log('Error', event.detail.status); console.log('Error', event.detail.status);
} }

View File

@@ -6,13 +6,13 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-input></sl-input> <wa-input></wa-input>
``` ```
```jsx:react ```jsx:react
import { SlInput } from '@shoelace-style/shoelace/dist/react'; import WaInput from '@shoelace-style/shoelace/dist/react/input';
const App = () => <SlInput />; const App = () => <WaInput />;
``` ```
:::tip :::tip
@@ -26,13 +26,14 @@ This component works with standard `<form>` elements. Please refer to the sectio
Use the `label` attribute to give the input an accessible label. For labels that contain HTML, use the `label` slot instead. Use the `label` attribute to give the input an accessible label. For labels that contain HTML, use the `label` slot instead.
```html:preview ```html:preview
<sl-input label="What is your name?"></sl-input> <wa-input label="What is your name?"></wa-input>
``` ```
```jsx:react ```jsx:react
import { SlIcon, SlInput } from '@shoelace-style/shoelace/dist/react'; import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
import WaInput from '@shoelace-style/shoelace/dist/react/input';
const App = () => <SlInput label="What is your name?" />; const App = () => <WaInput label="What is your name?" />;
``` ```
### Help Text ### Help Text
@@ -40,13 +41,14 @@ const App = () => <SlInput label="What is your name?" />;
Add descriptive help text to an input with the `help-text` attribute. For help texts that contain HTML, use the `help-text` slot instead. Add descriptive help text to an input with the `help-text` attribute. For help texts that contain HTML, use the `help-text` slot instead.
```html:preview ```html:preview
<sl-input label="Nickname" help-text="What would you like people to call you?"></sl-input> <wa-input label="Nickname" help-text="What would you like people to call you?"></wa-input>
``` ```
```jsx:react ```jsx:react
import { SlIcon, SlInput } from '@shoelace-style/shoelace/dist/react'; import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
import WaInput from '@shoelace-style/shoelace/dist/react/input';
const App = () => <SlInput label="Nickname" help-text="What would you like people to call you?" />; const App = () => <WaInput label="Nickname" help-text="What would you like people to call you?" />;
``` ```
### Placeholders ### Placeholders
@@ -54,13 +56,13 @@ const App = () => <SlInput label="Nickname" help-text="What would you like peopl
Use the `placeholder` attribute to add a placeholder. Use the `placeholder` attribute to add a placeholder.
```html:preview ```html:preview
<sl-input placeholder="Type something"></sl-input> <wa-input placeholder="Type something"></wa-input>
``` ```
```jsx:react ```jsx:react
import { SlInput } from '@shoelace-style/shoelace/dist/react'; import WaInput from '@shoelace-style/shoelace/dist/react/input';
const App = () => <SlInput placeholder="Type something" />; const App = () => <WaInput placeholder="Type something" />;
``` ```
### Clearable ### Clearable
@@ -68,13 +70,13 @@ const App = () => <SlInput placeholder="Type something" />;
Add the `clearable` attribute to add a clear button when the input has content. Add the `clearable` attribute to add a clear button when the input has content.
```html:preview ```html:preview
<sl-input placeholder="Clearable" clearable></sl-input> <wa-input placeholder="Clearable" clearable></wa-input>
``` ```
```jsx:react ```jsx:react
import { SlInput } from '@shoelace-style/shoelace/dist/react'; import WaInput from '@shoelace-style/shoelace/dist/react/input';
const App = () => <SlInput placeholder="Clearable" clearable />; const App = () => <WaInput placeholder="Clearable" clearable />;
``` ```
### Toggle Password ### Toggle Password
@@ -82,13 +84,13 @@ const App = () => <SlInput placeholder="Clearable" clearable />;
Add the `password-toggle` attribute to add a toggle button that will show the password when activated. Add the `password-toggle` attribute to add a toggle button that will show the password when activated.
```html:preview ```html:preview
<sl-input type="password" placeholder="Password Toggle" password-toggle></sl-input> <wa-input type="password" placeholder="Password Toggle" password-toggle></wa-input>
``` ```
```jsx:react ```jsx:react
import { SlInput } from '@shoelace-style/shoelace/dist/react'; import WaInput from '@shoelace-style/shoelace/dist/react/input';
const App = () => <SlInput type="password" placeholder="Password Toggle" size="medium" password-toggle />; const App = () => <WaInput type="password" placeholder="Password Toggle" size="medium" password-toggle />;
``` ```
### Filled Inputs ### Filled Inputs
@@ -96,13 +98,13 @@ const App = () => <SlInput type="password" placeholder="Password Toggle" size="m
Add the `filled` attribute to draw a filled input. Add the `filled` attribute to draw a filled input.
```html:preview ```html:preview
<sl-input placeholder="Type something" filled></sl-input> <wa-input placeholder="Type something" filled></wa-input>
``` ```
```jsx:react ```jsx:react
import { SlInput } from '@shoelace-style/shoelace/dist/react'; import WaInput from '@shoelace-style/shoelace/dist/react/input';
const App = () => <SlInput placeholder="Type something" filled />; const App = () => <WaInput placeholder="Type something" filled />;
``` ```
### Disabled ### Disabled
@@ -110,13 +112,13 @@ const App = () => <SlInput placeholder="Type something" filled />;
Use the `disabled` attribute to disable an input. Use the `disabled` attribute to disable an input.
```html:preview ```html:preview
<sl-input placeholder="Disabled" disabled></sl-input> <wa-input placeholder="Disabled" disabled></wa-input>
``` ```
```jsx:react ```jsx:react
import { SlInput } from '@shoelace-style/shoelace/dist/react'; import WaInput from '@shoelace-style/shoelace/dist/react/input';
const App = () => <SlInput placeholder="Disabled" disabled />; const App = () => <WaInput placeholder="Disabled" disabled />;
``` ```
### Sizes ### Sizes
@@ -124,23 +126,23 @@ const App = () => <SlInput placeholder="Disabled" disabled />;
Use the `size` attribute to change an input's size. Use the `size` attribute to change an input's size.
```html:preview ```html:preview
<sl-input placeholder="Small" size="small"></sl-input> <wa-input placeholder="Small" size="small"></wa-input>
<br /> <br />
<sl-input placeholder="Medium" size="medium"></sl-input> <wa-input placeholder="Medium" size="medium"></wa-input>
<br /> <br />
<sl-input placeholder="Large" size="large"></sl-input> <wa-input placeholder="Large" size="large"></wa-input>
``` ```
```jsx:react ```jsx:react
import { SlInput } from '@shoelace-style/shoelace/dist/react'; import WaInput from '@shoelace-style/shoelace/dist/react/input';
const App = () => ( const App = () => (
<> <>
<SlInput placeholder="Small" size="small" /> <WaInput placeholder="Small" size="small" />
<br /> <br />
<SlInput placeholder="Medium" size="medium" /> <WaInput placeholder="Medium" size="medium" />
<br /> <br />
<SlInput placeholder="Large" size="large" /> <WaInput placeholder="Large" size="large" />
</> </>
); );
``` ```
@@ -150,23 +152,23 @@ const App = () => (
Use the `pill` attribute to give inputs rounded edges. Use the `pill` attribute to give inputs rounded edges.
```html:preview ```html:preview
<sl-input placeholder="Small" size="small" pill></sl-input> <wa-input placeholder="Small" size="small" pill></wa-input>
<br /> <br />
<sl-input placeholder="Medium" size="medium" pill></sl-input> <wa-input placeholder="Medium" size="medium" pill></wa-input>
<br /> <br />
<sl-input placeholder="Large" size="large" pill></sl-input> <wa-input placeholder="Large" size="large" pill></wa-input>
``` ```
```jsx:react ```jsx:react
import { SlInput } from '@shoelace-style/shoelace/dist/react'; import WaInput from '@shoelace-style/shoelace/dist/react/input';
const App = () => ( const App = () => (
<> <>
<SlInput placeholder="Small" size="small" pill /> <WaInput placeholder="Small" size="small" pill />
<br /> <br />
<SlInput placeholder="Medium" size="medium" pill /> <WaInput placeholder="Medium" size="medium" pill />
<br /> <br />
<SlInput placeholder="Large" size="large" pill /> <WaInput placeholder="Large" size="large" pill />
</> </>
); );
``` ```
@@ -176,23 +178,23 @@ const App = () => (
The `type` attribute controls the type of input the browser renders. The `type` attribute controls the type of input the browser renders.
```html:preview ```html:preview
<sl-input type="email" placeholder="Email"></sl-input> <wa-input type="email" placeholder="Email"></wa-input>
<br /> <br />
<sl-input type="number" placeholder="Number"></sl-input> <wa-input type="number" placeholder="Number"></wa-input>
<br /> <br />
<sl-input type="date" placeholder="Date"></sl-input> <wa-input type="date" placeholder="Date"></wa-input>
``` ```
```jsx:react ```jsx:react
import { SlInput } from '@shoelace-style/shoelace/dist/react'; import WaInput from '@shoelace-style/shoelace/dist/react/input';
const App = () => ( const App = () => (
<> <>
<SlInput type="email" placeholder="Email" /> <WaInput type="email" placeholder="Email" />
<br /> <br />
<SlInput type="number" placeholder="Number" /> <WaInput type="number" placeholder="Number" />
<br /> <br />
<SlInput type="date" placeholder="Date" /> <WaInput type="date" placeholder="Date" />
</> </>
); );
``` ```
@@ -202,41 +204,42 @@ const App = () => (
Use the `prefix` and `suffix` slots to add icons. Use the `prefix` and `suffix` slots to add icons.
```html:preview ```html:preview
<sl-input placeholder="Small" size="small"> <wa-input placeholder="Small" size="small">
<sl-icon name="house" slot="prefix"></sl-icon> <wa-icon name="house" variant="solid" slot="prefix"></wa-icon>
<sl-icon name="chat" slot="suffix"></sl-icon> <wa-icon name="comment" variant="solid" slot="suffix"></wa-icon>
</sl-input> </wa-input>
<br /> <br />
<sl-input placeholder="Medium" size="medium"> <wa-input placeholder="Medium" size="medium">
<sl-icon name="house" slot="prefix"></sl-icon> <wa-icon name="house" variant="solid" slot="prefix"></wa-icon>
<sl-icon name="chat" slot="suffix"></sl-icon> <wa-icon name="comment" variant="solid" slot="suffix"></wa-icon>
</sl-input> </wa-input>
<br /> <br />
<sl-input placeholder="Large" size="large"> <wa-input placeholder="Large" size="large">
<sl-icon name="house" slot="prefix"></sl-icon> <wa-icon name="house" variant="solid" slot="prefix"></wa-icon>
<sl-icon name="chat" slot="suffix"></sl-icon> <wa-icon name="comment" variant="solid" slot="suffix"></wa-icon>
</sl-input> </wa-input>
``` ```
```jsx:react ```jsx:react
import { SlIcon, SlInput } from '@shoelace-style/shoelace/dist/react'; import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
import WaInput from '@shoelace-style/shoelace/dist/react/input';
const App = () => ( const App = () => (
<> <>
<SlInput placeholder="Small" size="small"> <WaInput placeholder="Small" size="small">
<SlIcon name="house" slot="prefix"></SlIcon> <WaIcon name="house" variant="solid" slot="prefix"></WaIcon>
<SlIcon name="chat" slot="suffix"></SlIcon> <WaIcon name="comment" variant="solid" slot="suffix"></WaIcon>
</SlInput> </WaInput>
<br /> <br />
<SlInput placeholder="Medium" size="medium"> <WaInput placeholder="Medium" size="medium">
<SlIcon name="house" slot="prefix"></SlIcon> <WaIcon name="house" variant="solid" slot="prefix"></WaIcon>
<SlIcon name="chat" slot="suffix"></SlIcon> <WaIcon name="comment" variant="solid" slot="suffix"></WaIcon>
</SlInput> </WaInput>
<br /> <br />
<SlInput placeholder="Large" size="large"> <WaInput placeholder="Large" size="large">
<SlIcon name="house" slot="prefix"></SlIcon> <WaIcon name="house" variant="solid" slot="prefix"></WaIcon>
<SlIcon name="chat" slot="suffix"></SlIcon> <WaIcon name="comment" variant="solid" slot="suffix"></WaIcon>
</SlInput> </WaInput>
</> </>
); );
``` ```
@@ -246,9 +249,9 @@ const App = () => (
Use [CSS parts](#css-parts) to customize the way form controls are drawn. This example uses CSS grid to position the label to the left of the control, but the possible orientations are nearly endless. The same technique works for inputs, textareas, radio groups, and similar form controls. Use [CSS parts](#css-parts) to customize the way form controls are drawn. This example uses CSS grid to position the label to the left of the control, but the possible orientations are nearly endless. The same technique works for inputs, textareas, radio groups, and similar form controls.
```html:preview ```html:preview
<sl-input class="label-on-left" label="Name" help-text="Enter your name"></sl-input> <wa-input class="label-on-left" label="Name" help-text="Enter your name"></wa-input>
<sl-input class="label-on-left" label="Email" type="email" help-text="Enter your email"></sl-input> <wa-input class="label-on-left" label="Email" type="email" help-text="Enter your email"></wa-input>
<sl-textarea class="label-on-left" label="Bio" help-text="Tell us something about yourself"></sl-textarea> <wa-textarea class="label-on-left" label="Bio" help-text="Tell us something about yourself"></wa-textarea>
<style> <style>
.label-on-left { .label-on-left {
@@ -257,13 +260,13 @@ Use [CSS parts](#css-parts) to customize the way form controls are drawn. This e
} }
.label-on-left + .label-on-left { .label-on-left + .label-on-left {
margin-top: var(--sl-spacing-medium); margin-top: var(--wa-space-m);
} }
.label-on-left::part(form-control) { .label-on-left::part(form-control) {
display: grid; display: grid;
grid: auto / var(--label-width) 1fr; grid: auto / var(--label-width) 1fr;
gap: var(--sl-spacing-3x-small) var(--gap-width); gap: var(--wa-space-3xs) var(--gap-width);
align-items: center; align-items: center;
} }

View File

@@ -6,50 +6,53 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-menu style="max-width: 200px;"> <wa-menu style="max-width: 200px;">
<sl-menu-item>Option 1</sl-menu-item> <wa-menu-item>Option 1</wa-menu-item>
<sl-menu-item>Option 2</sl-menu-item> <wa-menu-item>Option 2</wa-menu-item>
<sl-menu-item>Option 3</sl-menu-item> <wa-menu-item>Option 3</wa-menu-item>
<sl-divider></sl-divider> <wa-divider></wa-divider>
<sl-menu-item type="checkbox" checked>Checkbox</sl-menu-item> <wa-menu-item type="checkbox" checked>Checkbox</wa-menu-item>
<sl-menu-item disabled>Disabled</sl-menu-item> <wa-menu-item disabled>Disabled</wa-menu-item>
<sl-divider></sl-divider> <wa-divider></wa-divider>
<sl-menu-item> <wa-menu-item>
Prefix Icon Prefix Icon
<sl-icon slot="prefix" name="gift"></sl-icon> <wa-icon slot="prefix" name="gift" variant="solid"></wa-icon>
</sl-menu-item> </wa-menu-item>
<sl-menu-item> <wa-menu-item>
Suffix Icon Suffix Icon
<sl-icon slot="suffix" name="heart"></sl-icon> <wa-icon slot="suffix" name="heart" variant="solid"></wa-icon>
</sl-menu-item> </wa-menu-item>
</sl-menu> </wa-menu>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlDivider, SlIcon, SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react'; import WaDivider from '@shoelace-style/shoelace/dist/react/divider';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const App = () => ( const App = () => (
<SlMenu style={{ maxWidth: '200px' }}> <WaMenu style={{ maxWidth: '200px' }}>
<SlMenuItem>Option 1</SlMenuItem> <WaMenuItem>Option 1</WaMenuItem>
<SlMenuItem>Option 2</SlMenuItem> <WaMenuItem>Option 2</WaMenuItem>
<SlMenuItem>Option 3</SlMenuItem> <WaMenuItem>Option 3</WaMenuItem>
<SlDivider /> <WaDivider />
<SlMenuItem type="checkbox" checked> <WaMenuItem type="checkbox" checked>
Checkbox Checkbox
</SlMenuItem> </WaMenuItem>
<SlMenuItem disabled>Disabled</SlMenuItem> <WaMenuItem disabled>Disabled</WaMenuItem>
<SlDivider /> <WaDivider />
<SlMenuItem> <WaMenuItem>
Prefix Icon Prefix Icon
<SlIcon slot="prefix" name="gift" /> <WaIcon slot="prefix" name="gift" variant="solid" />
</SlMenuItem> </WaMenuItem>
<SlMenuItem> <WaMenuItem>
Suffix Icon Suffix Icon
<SlIcon slot="suffix" name="heart" /> <WaIcon slot="suffix" name="heart" variant="solid" />
</SlMenuItem> </WaMenuItem>
</SlMenu> </WaMenu>
); );
``` ```
@@ -62,24 +65,25 @@ const App = () => (
Add the `disabled` attribute to disable the menu item so it cannot be selected. Add the `disabled` attribute to disable the menu item so it cannot be selected.
```html:preview ```html:preview
<sl-menu style="max-width: 200px;"> <wa-menu style="max-width: 200px;">
<sl-menu-item>Option 1</sl-menu-item> <wa-menu-item>Option 1</wa-menu-item>
<sl-menu-item disabled>Option 2</sl-menu-item> <wa-menu-item disabled>Option 2</wa-menu-item>
<sl-menu-item>Option 3</sl-menu-item> <wa-menu-item>Option 3</wa-menu-item>
</sl-menu> </wa-menu>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react'; import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const App = () => ( const App = () => (
<SlMenu style={{ maxWidth: '200px' }}> <WaMenu style={{ maxWidth: '200px' }}>
<SlMenuItem>Option 1</SlMenuItem> <WaMenuItem>Option 1</WaMenuItem>
<SlMenuItem disabled>Option 2</SlMenuItem> <WaMenuItem disabled>Option 2</WaMenuItem>
<SlMenuItem>Option 3</SlMenuItem> <WaMenuItem>Option 3</WaMenuItem>
</SlMenu> </WaMenu>
); );
``` ```
@@ -90,54 +94,58 @@ const App = () => (
Add content to the start and end of menu items using the `prefix` and `suffix` slots. Add content to the start and end of menu items using the `prefix` and `suffix` slots.
```html:preview ```html:preview
<sl-menu style="max-width: 200px;"> <wa-menu style="max-width: 200px;">
<sl-menu-item> <wa-menu-item>
<sl-icon slot="prefix" name="house"></sl-icon> <wa-icon slot="prefix" name="house" variant="solid"></wa-icon>
Home Home
</sl-menu-item> </wa-menu-item>
<sl-menu-item> <wa-menu-item>
<sl-icon slot="prefix" name="envelope"></sl-icon> <wa-icon slot="prefix" name="envelope" variant="solid"></wa-icon>
Messages Messages
<sl-badge slot="suffix" variant="primary" pill>12</sl-badge> <wa-badge slot="suffix" variant="brand" pill>12</wa-badge>
</sl-menu-item> </wa-menu-item>
<sl-divider></sl-divider> <wa-divider></wa-divider>
<sl-menu-item> <wa-menu-item>
<sl-icon slot="prefix" name="gear"></sl-icon> <wa-icon slot="prefix" name="gear" variant="solid"></wa-icon>
Settings Settings
</sl-menu-item> </wa-menu-item>
</sl-menu> </wa-menu>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlBadge, SlDivider, SlIcon, SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react'; import WaBadge from '@shoelace-style/shoelace/dist/react/badge';
import WaDivider from '@shoelace-style/shoelace/dist/react/divider';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const App = () => ( const App = () => (
<SlMenu style={{ maxWidth: '200px' }}> <WaMenu style={{ maxWidth: '200px' }}>
<SlMenuItem> <WaMenuItem>
<SlIcon slot="prefix" name="house" /> <WaIcon slot="prefix" name="house" variant="solid" />
Home Home
</SlMenuItem> </WaMenuItem>
<SlMenuItem> <WaMenuItem>
<SlIcon slot="prefix" name="envelope" /> <WaIcon slot="prefix" name="envelope" variant="solid" />
Messages Messages
<SlBadge slot="suffix" variant="primary" pill> <WaBadge slot="suffix" variant="brand" pill>
12 12
</SlBadge> </WaBadge>
</SlMenuItem> </WaMenuItem>
<SlDivider /> <WaDivider />
<SlMenuItem> <WaMenuItem>
<SlIcon slot="prefix" name="gear" /> <WaIcon slot="prefix" name="gear" variant="solid" />
Settings Settings
</SlMenuItem> </WaMenuItem>
</SlMenu> </WaMenu>
); );
``` ```
@@ -150,26 +158,27 @@ Set the `type` attribute to `checkbox` to create a menu item that will toggle on
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. 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:preview ```html:preview
<sl-menu style="max-width: 200px;"> <wa-menu style="max-width: 200px;">
<sl-menu-item type="checkbox">Autosave</sl-menu-item> <wa-menu-item type="checkbox">Autosave</wa-menu-item>
<sl-menu-item type="checkbox" checked>Check Spelling</sl-menu-item> <wa-menu-item type="checkbox" checked>Check Spelling</wa-menu-item>
<sl-menu-item type="checkbox">Word Wrap</sl-menu-item> <wa-menu-item type="checkbox">Word Wrap</wa-menu-item>
</sl-menu> </wa-menu>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react'; import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const App = () => ( const App = () => (
<SlMenu style={{ maxWidth: '200px' }}> <WaMenu style={{ maxWidth: '200px' }}>
<SlMenuItem type="checkbox">Autosave</SlMenuItem> <WaMenuItem type="checkbox">Autosave</WaMenuItem>
<SlMenuItem type="checkbox" checked> <WaMenuItem type="checkbox" checked>
Check Spelling Check Spelling
</SlMenuItem> </WaMenuItem>
<SlMenuItem type="checkbox">Word Wrap</SlMenuItem> <WaMenuItem type="checkbox">Word Wrap</WaMenuItem>
</SlMenu> </WaMenu>
); );
``` ```
@@ -177,23 +186,23 @@ const App = () => (
### Value & Selection ### 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 `sl-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. 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:preview ```html:preview
<sl-menu class="menu-value" style="max-width: 200px;"> <wa-menu class="menu-value" style="max-width: 200px;">
<sl-menu-item value="opt-1">Option 1</sl-menu-item> <wa-menu-item value="opt-1">Option 1</wa-menu-item>
<sl-menu-item value="opt-2">Option 2</sl-menu-item> <wa-menu-item value="opt-2">Option 2</wa-menu-item>
<sl-menu-item value="opt-3">Option 3</sl-menu-item> <wa-menu-item value="opt-3">Option 3</wa-menu-item>
<sl-divider></sl-divider> <wa-divider></wa-divider>
<sl-menu-item type="checkbox" value="opt-4">Checkbox 4</sl-menu-item> <wa-menu-item type="checkbox" value="opt-4">Checkbox 4</wa-menu-item>
<sl-menu-item type="checkbox" value="opt-5">Checkbox 5</sl-menu-item> <wa-menu-item type="checkbox" value="opt-5">Checkbox 5</wa-menu-item>
<sl-menu-item type="checkbox" value="opt-6">Checkbox 6</sl-menu-item> <wa-menu-item type="checkbox" value="opt-6">Checkbox 6</wa-menu-item>
</sl-menu> </wa-menu>
<script> <script>
const menu = document.querySelector('.menu-value'); const menu = document.querySelector('.menu-value');
menu.addEventListener('sl-select', event => { menu.addEventListener('wa-select', event => {
const item = event.detail.item; const item = event.detail.item;
// Log value // Log value
@@ -209,7 +218,8 @@ The `value` attribute can be used to assign a hidden value, such as a unique ide
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react'; import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const App = () => { const App = () => {
function handleSelect(event) { function handleSelect(event) {
@@ -223,11 +233,11 @@ const App = () => {
} }
return ( return (
<SlMenu style={{ maxWidth: '200px' }} onSlSelect={handleSelect}> <WaMenu style={{ maxWidth: '200px' }} onWaSelect={handleSelect}>
<SlMenuItem value="opt-1">Option 1</SlMenuItem> <WaMenuItem value="opt-1">Option 1</WaMenuItem>
<SlMenuItem value="opt-2">Option 2</SlMenuItem> <WaMenuItem value="opt-2">Option 2</WaMenuItem>
<SlMenuItem value="opt-3">Option 3</SlMenuItem> <WaMenuItem value="opt-3">Option 3</WaMenuItem>
</SlMenu> </WaMenu>
); );
}; };
``` ```

View File

@@ -6,36 +6,39 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-menu style="max-width: 200px;"> <wa-menu style="max-width: 200px;">
<sl-menu-label>Fruits</sl-menu-label> <wa-menu-label>Fruits</wa-menu-label>
<sl-menu-item value="apple">Apple</sl-menu-item> <wa-menu-item value="apple">Apple</wa-menu-item>
<sl-menu-item value="banana">Banana</sl-menu-item> <wa-menu-item value="banana">Banana</wa-menu-item>
<sl-menu-item value="orange">Orange</sl-menu-item> <wa-menu-item value="orange">Orange</wa-menu-item>
<sl-divider></sl-divider> <wa-divider></wa-divider>
<sl-menu-label>Vegetables</sl-menu-label> <wa-menu-label>Vegetables</wa-menu-label>
<sl-menu-item value="broccoli">Broccoli</sl-menu-item> <wa-menu-item value="broccoli">Broccoli</wa-menu-item>
<sl-menu-item value="carrot">Carrot</sl-menu-item> <wa-menu-item value="carrot">Carrot</wa-menu-item>
<sl-menu-item value="zucchini">Zucchini</sl-menu-item> <wa-menu-item value="zucchini">Zucchini</wa-menu-item>
</sl-menu> </wa-menu>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlDivider, SlMenu, SlMenuLabel, SlMenuItem } from '@shoelace-style/shoelace/dist/react'; import WaDivider from '@shoelace-style/shoelace/dist/react/divider';
import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuLabel from '@shoelace-style/shoelace/dist/react/menu-label';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const App = () => ( const App = () => (
<SlMenu style={{ maxWidth: '200px' }}> <WaMenu style={{ maxWidth: '200px' }}>
<SlMenuLabel>Fruits</SlMenuLabel> <WaMenuLabel>Fruits</WaMenuLabel>
<SlMenuItem value="apple">Apple</SlMenuItem> <WaMenuItem value="apple">Apple</WaMenuItem>
<SlMenuItem value="banana">Banana</SlMenuItem> <WaMenuItem value="banana">Banana</WaMenuItem>
<SlMenuItem value="orange">Orange</SlMenuItem> <WaMenuItem value="orange">Orange</WaMenuItem>
<SlDivider /> <WaDivider />
<SlMenuLabel>Vegetables</SlMenuLabel> <WaMenuLabel>Vegetables</WaMenuLabel>
<SlMenuItem value="broccoli">Broccoli</SlMenuItem> <WaMenuItem value="broccoli">Broccoli</WaMenuItem>
<SlMenuItem value="carrot">Carrot</SlMenuItem> <WaMenuItem value="carrot">Carrot</WaMenuItem>
<SlMenuItem value="zucchini">Zucchini</SlMenuItem> <WaMenuItem value="zucchini">Zucchini</WaMenuItem>
</SlMenu> </WaMenu>
); );
``` ```

View File

@@ -8,32 +8,34 @@ layout: component
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. 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:preview ```html:preview
<sl-menu style="max-width: 200px;"> <wa-menu style="max-width: 200px;">
<sl-menu-item value="undo">Undo</sl-menu-item> <wa-menu-item value="undo">Undo</wa-menu-item>
<sl-menu-item value="redo">Redo</sl-menu-item> <wa-menu-item value="redo">Redo</wa-menu-item>
<sl-divider></sl-divider> <wa-divider></wa-divider>
<sl-menu-item value="cut">Cut</sl-menu-item> <wa-menu-item value="cut">Cut</wa-menu-item>
<sl-menu-item value="copy">Copy</sl-menu-item> <wa-menu-item value="copy">Copy</wa-menu-item>
<sl-menu-item value="paste">Paste</sl-menu-item> <wa-menu-item value="paste">Paste</wa-menu-item>
<sl-menu-item value="delete">Delete</sl-menu-item> <wa-menu-item value="delete">Delete</wa-menu-item>
</sl-menu> </wa-menu>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlDivider, SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react'; import WaDivider from '@shoelace-style/shoelace/dist/react/divider';
import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const App = () => ( const App = () => (
<SlMenu style={{ maxWidth: '200px' }}> <WaMenu style={{ maxWidth: '200px' }}>
<SlMenuItem value="undo">Undo</SlMenuItem> <WaMenuItem value="undo">Undo</WaMenuItem>
<SlMenuItem value="redo">Redo</SlMenuItem> <WaMenuItem value="redo">Redo</WaMenuItem>
<SlDivider /> <WaDivider />
<SlMenuItem value="cut">Cut</SlMenuItem> <WaMenuItem value="cut">Cut</WaMenuItem>
<SlMenuItem value="copy">Copy</SlMenuItem> <WaMenuItem value="copy">Copy</WaMenuItem>
<SlMenuItem value="paste">Paste</SlMenuItem> <WaMenuItem value="paste">Paste</WaMenuItem>
<SlMenuItem value="delete">Delete</SlMenuItem> <WaMenuItem value="delete">Delete</WaMenuItem>
</SlMenu> </WaMenu>
); );
``` ```
@@ -42,3 +44,112 @@ const App = () => (
:::tip :::tip
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. 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:preview
<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>
```
```jsx:react
import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaDropdown from '@shoelace-style/shoelace/dist/react/dropdown';
import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const App = () => (
<WaDropdown>
<WaButton slot="trigger" caret>Edit</WaButton>
<WaMenu>
<WaMenuItem value="cut">Cut</WaMenuItem>
<WaMenuItem value="copy">Copy</WaMenuItem>
<WaMenuItem value="paste">Paste</WaMenuItem>
</WaMenu>
</WaDropdown>
);
```
### Submenus
To create a submenu, nest an `<wa-menu slot="submenu">` in any [menu item](/components/menu-item).
```html:preview
<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>
```
{% raw %}
```jsx:react
import WaDivider from '@shoelace-style/shoelace/dist/react/divider';
import WaMenu from '@shoelace-style/shoelace/dist/react/menu';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const App = () => (
<WaMenu style={{ maxWidth: '200px' }}>
<WaMenuItem value="undo">Undo</WaMenuItem>
<WaMenuItem value="redo">Redo</WaMenuItem>
<WaDivider />
<WaMenuItem value="cut">Cut</WaMenuItem>
<WaMenuItem value="copy">Copy</WaMenuItem>
<WaMenuItem value="paste">Paste</WaMenuItem>
<WaDivider />
<WaMenuItem>
Find
<WaMenu slot="submenu">
<WaMenuItem value="find">Find…</WaMenuItem>
<WaMenuItem value="find-previous">Find Next</WaMenuItem>
<WaMenuItem value="find-next">Find Previous</WaMenuItem>
</WaMenu>
</WaMenuItem>
<WaMenuItem>
Transformations
<WaMenu slot="submenu">
<WaMenuItem value="uppercase">Make uppercase</WaMenuItem>
<WaMenuItem value="lowercase">Make lowercase</WaMenuItem>
<WaMenuItem value="capitalize">Capitalize</WaMenuItem>
</WaMenu>
</WaMenuItem>
</WaMenu>
);
```
:::warning
As a UX best practice, avoid using more than one level of submenus when possible.
:::
{% endraw %}

View File

@@ -5,22 +5,22 @@ meta:
layout: component layout: component
--- ---
The mutation observer will report changes to the content it wraps through the `sl-mutation` event. When emitted, a collection of [MutationRecord](https://developer.mozilla.org/en-US/docs/Web/API/MutationRecord) objects will be attached to `event.detail` that contains information about how it changed. The mutation observer will report changes to the content it wraps through the `wa-mutation` event. When emitted, a collection of [MutationRecord](https://developer.mozilla.org/en-US/docs/Web/API/MutationRecord) objects will be attached to `event.detail` that contains information about how it changed.
```html:preview ```html:preview
<div class="mutation-overview"> <div class="mutation-overview">
<sl-mutation-observer attr="variant"> <wa-mutation-observer attr="variant">
<sl-button variant="primary">Click to mutate</sl-button> <wa-button variant="brand">Click to mutate</wa-button>
</sl-mutation-observer> </wa-mutation-observer>
<br /> <br />
👆 Click the button and watch the console 👆 Click the button and watch the console
<script> <script>
const container = document.querySelector('.mutation-overview'); const container = document.querySelector('.mutation-overview');
const mutationObserver = container.querySelector('sl-mutation-observer'); const mutationObserver = container.querySelector('wa-mutation-observer');
const button = container.querySelector('sl-button'); const button = container.querySelector('wa-button');
const variants = ['primary', 'success', 'neutral', 'warning', 'danger']; const variants = ['brand', 'success', 'neutral', 'warning', 'danger'];
let clicks = 0; let clicks = 0;
// Change the button's variant attribute // Change the button's variant attribute
@@ -30,13 +30,13 @@ The mutation observer will report changes to the content it wraps through the `s
}); });
// Log mutations // Log mutations
mutationObserver.addEventListener('sl-mutation', event => { mutationObserver.addEventListener('wa-mutation', event => {
console.log(event.detail); console.log(event.detail);
}); });
</script> </script>
<style> <style>
.mutation-overview sl-button { .mutation-overview wa-button {
margin-bottom: 1rem; margin-bottom: 1rem;
} }
</style> </style>
@@ -45,24 +45,20 @@ The mutation observer will report changes to the content it wraps through the `s
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlMutationObserver } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaMutationObserver from '@shoelace-style/shoelace/dist/react/mutation-observer';
const css = ` const css = `
.resize-observer-overview div { .mutation-overview wa-button {
display: flex; margin-bottom: 1rem;
border: solid 2px var(--sl-input-border-color);
align-items: center;
justify-content: center;
text-align: center;
padding: 4rem 2rem;
} }
`; `;
const variants = ['primary', 'success', 'neutral', 'warning', 'danger']; const variants = ['brand', 'success', 'neutral', 'warning', 'danger'];
let clicks = 0; let clicks = 0;
const App = () => { const App = () => {
const [variant, setVariant] = useState('primary'); const [variant, setVariant] = useState('brand');
function handleClick() { function handleClick() {
clicks++; clicks++;
@@ -71,11 +67,14 @@ const App = () => {
return ( return (
<> <>
<SlMutationObserver attr="*" onSlMutation={event => console.log(event.detail)}> <WaMutationObserver attr="*" onWaMutation={event => console.log(event.detail)}>
<SlButton variant={variant} onClick={handleClick}> <WaButton variant={variant} onClick={handleClick}>
Click to mutate Click to mutate
</SlButton> </WaButton>
</SlMutationObserver> </WaMutationObserver>
<br />
👆 Click the button and watch the console
<style>{css}</style> <style>{css}</style>
</> </>
@@ -95,31 +94,31 @@ Use the `child-list` attribute to watch for new child elements that are added or
```html:preview ```html:preview
<div class="mutation-child-list"> <div class="mutation-child-list">
<sl-mutation-observer child-list> <wa-mutation-observer child-list>
<div class="buttons"> <div class="buttons">
<sl-button variant="primary">Add button</sl-button> <wa-button variant="brand">Add button</wa-button>
</div> </div>
</sl-mutation-observer> </wa-mutation-observer>
👆 Add and remove buttons and watch the console 👆 Add and remove buttons and watch the console
<script> <script>
const container = document.querySelector('.mutation-child-list'); const container = document.querySelector('.mutation-child-list');
const mutationObserver = container.querySelector('sl-mutation-observer'); const mutationObserver = container.querySelector('wa-mutation-observer');
const buttons = container.querySelector('.buttons'); const buttons = container.querySelector('.buttons');
const button = container.querySelector('sl-button[variant="primary"]'); const button = container.querySelector('wa-button[variant="brand"]');
let i = 0; let i = 0;
// Add a button // Add a button
button.addEventListener('click', () => { button.addEventListener('click', () => {
const button = document.createElement('sl-button'); const button = document.createElement('wa-button');
button.textContent = ++i; button.textContent = ++i;
buttons.append(button); buttons.append(button);
}); });
// Remove a button // Remove a button
buttons.addEventListener('click', event => { buttons.addEventListener('click', event => {
const target = event.target.closest('sl-button:not([variant="primary"])'); const target = event.target.closest('wa-button:not([variant="brand"])');
event.stopPropagation(); event.stopPropagation();
if (target) { if (target) {
@@ -128,7 +127,7 @@ Use the `child-list` attribute to watch for new child elements that are added or
}); });
// Log mutations // Log mutations
mutationObserver.addEventListener('sl-mutation', event => { mutationObserver.addEventListener('wa-mutation', event => {
console.log(event.detail); console.log(event.detail);
}); });
</script> </script>
@@ -146,7 +145,8 @@ Use the `child-list` attribute to watch for new child elements that are added or
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlMutationObserver } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaMutationObserver from '@shoelace-style/shoelace/dist/react/mutation-observer';
const css = ` const css = `
.mutation-child-list .buttons { .mutation-child-list .buttons {
@@ -173,18 +173,18 @@ const App = () => {
return ( return (
<> <>
<div className="mutation-child-list"> <div className="mutation-child-list">
<SlMutationObserver child-list onSlMutation={event => console.log(event.detail)}> <WaMutationObserver child-list onWaMutation={event => console.log(event.detail)}>
<div className="buttons"> <div className="buttons">
<SlButton variant="primary" onClick={addButton}> <WaButton variant="brand" onClick={addButton}>
Add button Add button
</SlButton> </WaButton>
{buttonIds.map(id => ( {buttonIds.map(id => (
<SlButton key={id} variant="default" onClick={() => removeButton(id)}> <WaButton key={id} variant="default" onClick={() => removeButton(id)}>
{id} {id}
</SlButton> </WaButton>
))} ))}
</div> </div>
</SlMutationObserver> </WaMutationObserver>
</div> </div>
👆 Add and remove buttons and watch the console 👆 Add and remove buttons and watch the console
<style>{css}</style> <style>{css}</style>

View File

@@ -6,22 +6,23 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-select label="Select one"> <wa-select label="Select one">
<sl-option value="option-1">Option 1</sl-option> <wa-option value="option-1">Option 1</wa-option>
<sl-option value="option-2">Option 2</sl-option> <wa-option value="option-2">Option 2</wa-option>
<sl-option value="option-3">Option 3</sl-option> <wa-option value="option-3">Option 3</wa-option>
</sl-select> </wa-select>
``` ```
```jsx:react ```jsx:react
import { SlOption, SlSelect } from '@shoelace-style/shoelace/dist/react'; import WaOption from '@shoelace-style/shoelace/dist/react/option';
import WaSelect from '@shoelace-style/shoelace/dist/react/select';
const App = () => ( const App = () => (
<SlSelect> <WaSelect>
<SlOption value="option-1">Option 1</SlOption> <WaOption value="option-1">Option 1</WaOption>
<SlOption value="option-2">Option 2</SlOption> <WaOption value="option-2">Option 2</WaOption>
<SlOption value="option-3">Option 3</SlOption> <WaOption value="option-3">Option 3</WaOption>
</SlSelect> </WaSelect>
); );
``` ```
@@ -32,24 +33,25 @@ const App = () => (
Use the `disabled` attribute to disable an option and prevent it from being selected. Use the `disabled` attribute to disable an option and prevent it from being selected.
```html:preview ```html:preview
<sl-select label="Select one"> <wa-select label="Select one">
<sl-option value="option-1">Option 1</sl-option> <wa-option value="option-1">Option 1</wa-option>
<sl-option value="option-2" disabled>Option 2</sl-option> <wa-option value="option-2" disabled>Option 2</wa-option>
<sl-option value="option-3">Option 3</sl-option> <wa-option value="option-3">Option 3</wa-option>
</sl-select> </wa-select>
``` ```
```jsx:react ```jsx:react
import { SlOption, SlSelect } from '@shoelace-style/shoelace/dist/react'; import WaOption from '@shoelace-style/shoelace/dist/react/option';
import WaSelect from '@shoelace-style/shoelace/dist/react/select';
const App = () => ( const App = () => (
<SlSelect> <WaSelect>
<SlOption value="option-1">Option 1</SlOption> <WaOption value="option-1">Option 1</WaOption>
<SlOption value="option-2" disabled> <WaOption value="option-2" disabled>
Option 2 Option 2
</SlOption> </WaOption>
<SlOption value="option-3">Option 3</SlOption> <WaOption value="option-3">Option 3</WaOption>
</SlSelect> </WaSelect>
); );
``` ```
@@ -58,23 +60,23 @@ const App = () => (
Add icons to the start and end of menu items using the `prefix` and `suffix` slots. Add icons to the start and end of menu items using the `prefix` and `suffix` slots.
```html:preview ```html:preview
<sl-select label="Select one"> <wa-select label="Select one">
<sl-option value="option-1"> <wa-option value="option-1">
<sl-icon slot="prefix" name="envelope"></sl-icon> <wa-icon slot="prefix" name="envelope" variant="solid"></wa-icon>
Email Email
<sl-icon slot="suffix" name="patch-check"></sl-icon> <wa-icon slot="suffix" name="circle-check" variant="solid"></wa-icon>
</sl-option> </wa-option>
<sl-option value="option-2"> <wa-option value="option-2">
<sl-icon slot="prefix" name="telephone"></sl-icon> <wa-icon slot="prefix" name="phone" variant="solid"></wa-icon>
Phone Phone
<sl-icon slot="suffix" name="patch-check"></sl-icon> <wa-icon slot="suffix" name="circle-check" variant="solid"></wa-icon>
</sl-option> </wa-option>
<sl-option value="option-3"> <wa-option value="option-3">
<sl-icon slot="prefix" name="chat-dots"></sl-icon> <wa-icon slot="prefix" name="comment" variant="solid"></wa-icon>
Chat Chat
<sl-icon slot="suffix" name="patch-check"></sl-icon> <wa-icon slot="suffix" name="circle-check" variant="solid"></wa-icon>
</sl-option> </wa-option>
</sl-select> </wa-select>
``` ```

File diff suppressed because it is too large Load Diff

View File

@@ -6,13 +6,13 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-progress-bar value="50"></sl-progress-bar> <wa-progress-bar value="50"></wa-progress-bar>
``` ```
```jsx:react ```jsx:react
import { SlProgressBar } from '@shoelace-style/shoelace/dist/react'; import WaProgressBar from '@shoelace-style/shoelace/dist/react/progress-bar';
const App = () => <SlProgressBar value={50} />; const App = () => <WaProgressBar value={50} />;
``` ```
## Examples ## Examples
@@ -22,13 +22,13 @@ const App = () => <SlProgressBar value={50} />;
Use the `label` attribute to label the progress bar and tell assistive devices how to announce it. Use the `label` attribute to label the progress bar and tell assistive devices how to announce it.
```html:preview ```html:preview
<sl-progress-bar value="50" label="Upload progress"></sl-progress-bar> <wa-progress-bar value="50" label="Upload progress"></wa-progress-bar>
``` ```
```jsx:react ```jsx:react
import { SlProgressBar } from '@shoelace-style/shoelace/dist/react'; import WaProgressBar from '@shoelace-style/shoelace/dist/react/progress-bar';
const App = () => <SlProgressBar value="50" label="Upload progress" />; const App = () => <WaProgressBar value="50" label="Upload progress" />;
``` ```
### Custom Height ### Custom Height
@@ -36,15 +36,15 @@ const App = () => <SlProgressBar value="50" label="Upload progress" />;
Use the `--height` custom property to set the progress bar's height. Use the `--height` custom property to set the progress bar's height.
```html:preview ```html:preview
<sl-progress-bar value="50" style="--height: 6px;"></sl-progress-bar> <wa-progress-bar value="50" style="--height: 6px;"></wa-progress-bar>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlProgressBar } from '@shoelace-style/shoelace/dist/react'; import WaProgressBar from '@shoelace-style/shoelace/dist/react/progress-bar';
const App = () => <SlProgressBar value={50} style={{ '--height': '6px' }} />; const App = () => <WaProgressBar value={50} style={{ '--height': '6px' }} />;
``` ```
{% endraw %} {% endraw %}
@@ -54,12 +54,12 @@ const App = () => <SlProgressBar value={50} style={{ '--height': '6px' }} />;
Use the default slot to show a value. Use the default slot to show a value.
```html:preview ```html:preview
<sl-progress-bar value="50" class="progress-bar-values">50%</sl-progress-bar> <wa-progress-bar value="50" class="progress-bar-values">50%</wa-progress-bar>
<br /> <br />
<sl-button circle><sl-icon name="dash" label="Decrease"></sl-icon></sl-button> <wa-button circle><wa-icon name="minus" variant="solid" label="Decrease"></wa-icon></wa-button>
<sl-button circle><sl-icon name="plus" label="Increase"></sl-icon></sl-button> <wa-button circle><wa-icon name="plus" variant="solid" label="Increase"></wa-icon></wa-button>
<script> <script>
const progressBar = document.querySelector('.progress-bar-values'); const progressBar = document.querySelector('.progress-bar-values');
@@ -82,7 +82,9 @@ Use the default slot to show a value.
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlIcon, SlProgressBar } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
import WaProgressBar from '@shoelace-style/shoelace/dist/react/progress-bar';
const App = () => { const App = () => {
const [value, setValue] = useState(50); const [value, setValue] = useState(50);
@@ -96,17 +98,17 @@ const App = () => {
return ( return (
<> <>
<SlProgressBar value={value}>{value}%</SlProgressBar> <WaProgressBar value={value}>{value}%</WaProgressBar>
<br /> <br />
<SlButton circle onClick={() => adjustValue(-10)}> <WaButton circle onClick={() => adjustValue(-10)}>
<SlIcon name="dash" label="Decrease" /> <WaIcon name="minus" variant="solid" label="Decrease" />
</SlButton> </WaButton>
<SlButton circle onClick={() => adjustValue(10)}> <WaButton circle onClick={() => adjustValue(10)}>
<SlIcon name="plus" label="Increase" /> <WaIcon name="plus" variant="solid" label="Increase" />
</SlButton> </WaButton>
</> </>
); );
}; };
@@ -117,11 +119,11 @@ const App = () => {
The `indeterminate` attribute can be used to inform the user that the operation is pending, but its status cannot currently be determined. In this state, `value` is ignored and the label, if present, will not be shown. The `indeterminate` attribute can be used to inform the user that the operation is pending, but its status cannot currently be determined. In this state, `value` is ignored and the label, if present, will not be shown.
```html:preview ```html:preview
<sl-progress-bar indeterminate></sl-progress-bar> <wa-progress-bar indeterminate></wa-progress-bar>
``` ```
```jsx:react ```jsx:react
import { SlProgressBar } from '@shoelace-style/shoelace/dist/react'; import WaProgressBar from '@shoelace-style/shoelace/dist/react/progress-bar';
const App = () => <SlProgressBar indeterminate />; const App = () => <WaProgressBar indeterminate />;
``` ```

View File

@@ -6,13 +6,13 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-progress-ring value="25"></sl-progress-ring> <wa-progress-ring value="25"></wa-progress-ring>
``` ```
```jsx:react ```jsx:react
import { SlProgressRing } from '@shoelace-style/shoelace/dist/react'; import WaProgressRing from '@shoelace-style/shoelace/dist/react/progress-ring';
const App = () => <SlProgressRing value="25" />; const App = () => <WaProgressRing value="25" />;
``` ```
## Examples ## Examples
@@ -22,15 +22,15 @@ const App = () => <SlProgressRing value="25" />;
Use the `--size` custom property to set the diameter of the progress ring. Use the `--size` custom property to set the diameter of the progress ring.
```html:preview ```html:preview
<sl-progress-ring value="50" style="--size: 200px;"></sl-progress-ring> <wa-progress-ring value="50" style="--size: 200px;"></wa-progress-ring>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlProgressRing } from '@shoelace-style/shoelace/dist/react'; import WaProgressRing from '@shoelace-style/shoelace/dist/react/progress-ring';
const App = () => <SlProgressRing value="50" style={{ '--size': '200px' }} />; const App = () => <WaProgressRing value="50" style={{ '--size': '200px' }} />;
``` ```
{% endraw %} {% endraw %}
@@ -40,15 +40,15 @@ const App = () => <SlProgressRing value="50" style={{ '--size': '200px' }} />;
Use the `--track-width` and `--indicator-width` custom properties to set the width of the progress ring's track and indicator. Use the `--track-width` and `--indicator-width` custom properties to set the width of the progress ring's track and indicator.
```html:preview ```html:preview
<sl-progress-ring value="50" style="--track-width: 6px; --indicator-width: 12px;"></sl-progress-ring> <wa-progress-ring value="50" style="--track-width: 6px; --indicator-width: 12px;"></wa-progress-ring>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlProgressRing } from '@shoelace-style/shoelace/dist/react'; import WaProgressRing from '@shoelace-style/shoelace/dist/react/progress-ring';
const App = () => <SlProgressRing value="50" style={{ '--track-width': '6px', '--indicator-width': '12px' }} />; const App = () => <WaProgressRing value="50" style={{ '--track-width': '6px', '--indicator-width': '12px' }} />;
``` ```
{% endraw %} {% endraw %}
@@ -58,22 +58,22 @@ const App = () => <SlProgressRing value="50" style={{ '--track-width': '6px', '-
To change the color, use the `--track-color` and `--indicator-color` custom properties. To change the color, use the `--track-color` and `--indicator-color` custom properties.
```html:preview ```html:preview
<sl-progress-ring <wa-progress-ring
value="50" value="50"
style=" style="
--track-color: pink; --track-color: pink;
--indicator-color: deeppink; --indicator-color: deeppink;
" "
></sl-progress-ring> ></wa-progress-ring>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlProgressRing } from '@shoelace-style/shoelace/dist/react'; import WaProgressRing from '@shoelace-style/shoelace/dist/react/progress-ring';
const App = () => ( const App = () => (
<SlProgressRing <WaProgressRing
value="50" value="50"
style={{ style={{
'--track-color': 'pink', '--track-color': 'pink',
@@ -90,13 +90,13 @@ const App = () => (
Use the `label` attribute to label the progress ring and tell assistive devices how to announce it. Use the `label` attribute to label the progress ring and tell assistive devices how to announce it.
```html:preview ```html:preview
<sl-progress-ring value="50" label="Upload progress"></sl-progress-ring> <wa-progress-ring value="50" label="Upload progress"></wa-progress-ring>
``` ```
```jsx:react ```jsx:react
import { SlProgressRing } from '@shoelace-style/shoelace/dist/react'; import WaProgressRing from '@shoelace-style/shoelace/dist/react/progress-ring';
const App = () => <SlProgressRing value="50" label="Upload progress" />; const App = () => <WaProgressRing value="50" label="Upload progress" />;
``` ```
### Showing Values ### Showing Values
@@ -104,12 +104,12 @@ const App = () => <SlProgressRing value="50" label="Upload progress" />;
Use the default slot to show a label inside the progress ring. Use the default slot to show a label inside the progress ring.
```html:preview ```html:preview
<sl-progress-ring value="50" class="progress-ring-values" style="margin-bottom: .5rem;">50%</sl-progress-ring> <wa-progress-ring value="50" class="progress-ring-values" style="margin-bottom: .5rem;">50%</wa-progress-ring>
<br /> <br />
<sl-button circle><sl-icon name="dash" label="Decrease"></sl-icon></sl-button> <wa-button circle><wa-icon name="minus" variant="solid" label="Decrease"></wa-icon></wa-button>
<sl-button circle><sl-icon name="plus" label="Increase"></sl-icon></sl-button> <wa-button circle><wa-icon name="plus" variant="solid" label="Increase"></wa-icon></wa-button>
<script> <script>
const progressRing = document.querySelector('.progress-ring-values'); const progressRing = document.querySelector('.progress-ring-values');
@@ -134,7 +134,9 @@ Use the default slot to show a label inside the progress ring.
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlButton, SlIcon, SlProgressRing } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
import WaProgressRing from '@shoelace-style/shoelace/dist/react/progress-ring';
const App = () => { const App = () => {
const [value, setValue] = useState(50); const [value, setValue] = useState(50);
@@ -148,19 +150,19 @@ const App = () => {
return ( return (
<> <>
<SlProgressRing value={value} style={{ marginBottom: '.5rem' }}> <WaProgressRing value={value} style={{ marginBottom: '.5rem' }}>
{value}% {value}%
</SlProgressRing> </WaProgressRing>
<br /> <br />
<SlButton circle onClick={() => adjustValue(-10)}> <WaButton circle onClick={() => adjustValue(-10)}>
<SlIcon name="dash" label="Decrease" /> <WaIcon name="minus" variant="solid" label="Decrease" />
</SlButton> </WaButton>
<SlButton circle onClick={() => adjustValue(10)}> <WaButton circle onClick={() => adjustValue(10)}>
<SlIcon name="plus" label="Increase" /> <WaIcon name="plus" variant="solid" label="Increase" />
</SlButton> </WaButton>
</> </>
); );
}; };

View File

@@ -9,20 +9,20 @@ QR codes are useful for providing small pieces of information to users who can q
```html:preview ```html:preview
<div class="qr-overview"> <div class="qr-overview">
<sl-qr-code value="https://shoelace.style/" label="Scan this code to visit Shoelace on the web!"></sl-qr-code> <wa-qr-code value="https://shoelace.style/" label="Scan this code to visit Web Awesome on the web!"></wa-qr-code>
<br /> <br />
<sl-input maxlength="255" clearable label="Value"></sl-input> <wa-input maxlength="255" clearable label="Value"></wa-input>
</div> </div>
<script> <script>
const container = document.querySelector('.qr-overview'); const container = document.querySelector('.qr-overview');
const qrCode = container.querySelector('sl-qr-code'); const qrCode = container.querySelector('wa-qr-code');
const input = container.querySelector('sl-input'); const input = container.querySelector('wa-input');
customElements.whenDefined('sl-qr-code').then(() => { customElements.whenDefined('wa-qr-code').then(() => {
input.value = qrCode.value; input.value = qrCode.value;
input.addEventListener('sl-input', () => (qrCode.value = input.value)); input.addEventListener('wa-input', () => (qrCode.value = input.value));
}); });
</script> </script>
@@ -31,7 +31,7 @@ QR codes are useful for providing small pieces of information to users who can q
max-width: 256px; max-width: 256px;
} }
.qr-overview sl-input { .qr-overview wa-input {
margin-top: 1rem; margin-top: 1rem;
} }
</style> </style>
@@ -39,14 +39,15 @@ QR codes are useful for providing small pieces of information to users who can q
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlQrCode, SlInput } from '@shoelace-style/shoelace/dist/react'; import WaQrCode from '@shoelace-style/shoelace/dist/react/qr-code';
import WaInput from '@shoelace-style/shoelace/dist/react/input';
const css = ` const css = `
.qr-overview { .qr-overview {
max-width: 256px; max-width: 256px;
} }
.qr-overview sl-input { .qr-overview wa-input {
margin-top: 1rem; margin-top: 1rem;
} }
`; `;
@@ -57,10 +58,10 @@ const App = () => {
return ( return (
<> <>
<div className="qr-overview"> <div className="qr-overview">
<SlQrCode value={value} label="Scan this code to visit Shoelace on the web!" /> <WaQrCode value={value} label="Scan this code to visit Web Awesome on the web!" />
<br /> <br />
<SlInput maxlength="255" clearable onInput={event => setValue(event.target.value)} /> <WaInput maxlength="255" clearable onInput={event => setValue(event.target.value)} />
</div> </div>
<style>{css}</style> <style>{css}</style>
@@ -76,13 +77,13 @@ const App = () => {
Use the `fill` and `background` attributes to modify the QR code's colors. You should always ensure good contrast for optimal compatibility with QR code scanners. Use the `fill` and `background` attributes to modify the QR code's colors. You should always ensure good contrast for optimal compatibility with QR code scanners.
```html:preview ```html:preview
<sl-qr-code value="https://shoelace.style/" fill="deeppink" background="white"></sl-qr-code> <wa-qr-code value="https://shoelace.style/" fill="deeppink" background="white"></wa-qr-code>
``` ```
```jsx:react ```jsx:react
import { SlQrCode } from '@shoelace-style/shoelace/dist/react'; import WaQrCode from '@shoelace-style/shoelace/dist/react/qr-code';
const App = () => <SlQrCode value="https://shoelace.style/" fill="deeppink" background="white" />; const App = () => <WaQrCode value="https://shoelace.style/" fill="deeppink" background="white" />;
``` ```
### Size ### Size
@@ -90,13 +91,13 @@ const App = () => <SlQrCode value="https://shoelace.style/" fill="deeppink" back
Use the `size` attribute to change the size of the QR code. Use the `size` attribute to change the size of the QR code.
```html:preview ```html:preview
<sl-qr-code value="https://shoelace.style/" size="64"></sl-qr-code> <wa-qr-code value="https://shoelace.style/" size="64"></wa-qr-code>
``` ```
```jsx:react ```jsx:react
import { SlQrCode } from '@shoelace-style/shoelace/dist/react'; import WaQrCode from '@shoelace-style/shoelace/dist/react/qr-code';
const App = () => <SlQrCode value="https://shoelace.style/" size="64" />; const App = () => <WaQrCode value="https://shoelace.style/" size="64" />;
``` ```
### Radius ### Radius
@@ -104,13 +105,13 @@ const App = () => <SlQrCode value="https://shoelace.style/" size="64" />;
Create a rounded effect with the `radius` attribute. Create a rounded effect with the `radius` attribute.
```html:preview ```html:preview
<sl-qr-code value="https://shoelace.style/" radius="0.5"></sl-qr-code> <wa-qr-code value="https://shoelace.style/" radius="0.5"></wa-qr-code>
``` ```
```jsx:react ```jsx:react
import { SlQrCode } from '@shoelace-style/shoelace/dist/react'; import WaQrCode from '@shoelace-style/shoelace/dist/react/qr-code';
const App = () => <SlQrCode value="https://shoelace.style/" radius="0.5" />; const App = () => <WaQrCode value="https://shoelace.style/" radius="0.5" />;
``` ```
### Error Correction ### Error Correction
@@ -119,10 +120,10 @@ QR codes can be rendered with various levels of [error correction](https://www.q
```html:preview ```html:preview
<div class="qr-error-correction"> <div class="qr-error-correction">
<sl-qr-code value="https://shoelace.style/" error-correction="L"></sl-qr-code> <wa-qr-code value="https://shoelace.style/" error-correction="L"></wa-qr-code>
<sl-qr-code value="https://shoelace.style/" error-correction="M"></sl-qr-code> <wa-qr-code value="https://shoelace.style/" error-correction="M"></wa-qr-code>
<sl-qr-code value="https://shoelace.style/" error-correction="Q"></sl-qr-code> <wa-qr-code value="https://shoelace.style/" error-correction="Q"></wa-qr-code>
<sl-qr-code value="https://shoelace.style/" error-correction="H"></sl-qr-code> <wa-qr-code value="https://shoelace.style/" error-correction="H"></wa-qr-code>
</div> </div>
<style> <style>
@@ -135,7 +136,7 @@ QR codes can be rendered with various levels of [error correction](https://www.q
``` ```
```jsx:react ```jsx:react
import { SlQrCode } from '@shoelace-style/shoelace/dist/react'; import WaQrCode from '@shoelace-style/shoelace/dist/react/qr-code';
const css = ` const css = `
.qr-error-correction { .qr-error-correction {
@@ -149,10 +150,10 @@ const App = () => {
return ( return (
<> <>
<div className="qr-error-correction"> <div className="qr-error-correction">
<SlQrCode value="https://shoelace.style/" error-correction="L" /> <WaQrCode value="https://shoelace.style/" error-correction="L" />
<SlQrCode value="https://shoelace.style/" error-correction="M" /> <WaQrCode value="https://shoelace.style/" error-correction="M" />
<SlQrCode value="https://shoelace.style/" error-correction="Q" /> <WaQrCode value="https://shoelace.style/" error-correction="Q" />
<SlQrCode value="https://shoelace.style/" error-correction="H" /> <WaQrCode value="https://shoelace.style/" error-correction="H" />
</div> </div>
<style>{css}</style> <style>{css}</style>

View File

@@ -8,22 +8,23 @@ layout: component
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. 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:preview ```html:preview
<sl-radio-group label="Select an option" name="a" value="1"> <wa-radio-group label="Select an option" name="a" value="1">
<sl-radio-button value="1">Option 1</sl-radio-button> <wa-radio-button value="1">Option 1</wa-radio-button>
<sl-radio-button value="2">Option 2</sl-radio-button> <wa-radio-button value="2">Option 2</wa-radio-button>
<sl-radio-button value="3">Option 3</sl-radio-button> <wa-radio-button value="3">Option 3</wa-radio-button>
</sl-radio-group> </wa-radio-group>
``` ```
```jsx:react ```jsx:react
import { SlRadioButton, SlRadioGroup } from '@shoelace-style/shoelace/dist/react'; import WaRadioButton from '@shoelace-style/shoelace/dist/react/radio-button';
import WaRadioGroup from '@shoelace-style/shoelace/dist/react/radio-group';
const App = () => ( const App = () => (
<SlRadioGroup label="Select an option" name="a" value="1"> <WaRadioGroup label="Select an option" name="a" value="1">
<SlRadioButton value="1">Option 1</SlRadioButton> <WaRadioButton value="1">Option 1</WaRadioButton>
<SlRadioButton value="2">Option 2</SlRadioButton> <WaRadioButton value="2">Option 2</WaRadioButton>
<SlRadioButton value="3">Option 3</SlRadioButton> <WaRadioButton value="3">Option 3</WaRadioButton>
</SlRadioGroup> </WaRadioGroup>
); );
``` ```
@@ -34,22 +35,23 @@ const App = () => (
To set the initial value and checked state, use the `value` attribute on the containing radio group. To set the initial value and checked state, use the `value` attribute on the containing radio group.
```html:preview ```html:preview
<sl-radio-group label="Select an option" name="a" value="1"> <wa-radio-group label="Select an option" name="a" value="1">
<sl-radio-button value="1">Option 1</sl-radio-button> <wa-radio-button value="1">Option 1</wa-radio-button>
<sl-radio-button value="2">Option 2</sl-radio-button> <wa-radio-button value="2">Option 2</wa-radio-button>
<sl-radio-button value="3">Option 3</sl-radio-button> <wa-radio-button value="3">Option 3</wa-radio-button>
</sl-radio-group> </wa-radio-group>
``` ```
```jsx:react ```jsx:react
import { SlRadioButton, SlRadioGroup } from '@shoelace-style/shoelace/dist/react'; import WaRadioButton from '@shoelace-style/shoelace/dist/react/radio-button';
import WaRadioGroup from '@shoelace-style/shoelace/dist/react/radio-group';
const App = () => ( const App = () => (
<SlRadioGroup label="Select an option" name="a" value="1"> <WaRadioGroup label="Select an option" name="a" value="1">
<SlRadioButton value="1">Option 1</SlRadioButton> <WaRadioButton value="1">Option 1</WaRadioButton>
<SlRadioButton value="2">Option 2</SlRadioButton> <WaRadioButton value="2">Option 2</WaRadioButton>
<SlRadioButton value="3">Option 3</SlRadioButton> <WaRadioButton value="3">Option 3</WaRadioButton>
</SlRadioGroup> </WaRadioGroup>
); );
``` ```
@@ -58,24 +60,25 @@ const App = () => (
Use the `disabled` attribute to disable a radio button. Use the `disabled` attribute to disable a radio button.
```html:preview ```html:preview
<sl-radio-group label="Select an option" name="a" value="1"> <wa-radio-group label="Select an option" name="a" value="1">
<sl-radio-button value="1">Option 1</sl-radio-button> <wa-radio-button value="1">Option 1</wa-radio-button>
<sl-radio-button value="2" disabled>Option 2</sl-radio-button> <wa-radio-button value="2" disabled>Option 2</wa-radio-button>
<sl-radio-button value="3">Option 3</sl-radio-button> <wa-radio-button value="3">Option 3</wa-radio-button>
</sl-radio-group> </wa-radio-group>
``` ```
```jsx:react ```jsx:react
import { SlRadioButton, SlRadioGroup } from '@shoelace-style/shoelace/dist/react'; import WaRadioButton from '@shoelace-style/shoelace/dist/react/radio-button';
import WaRadioGroup from '@shoelace-style/shoelace/dist/react/radio-group';
const App = () => ( const App = () => (
<SlRadioGroup label="Select an option" name="a" value="1"> <WaRadioGroup label="Select an option" name="a" value="1">
<SlRadioButton value="1">Option 1</SlRadioButton> <WaRadioButton value="1">Option 1</WaRadioButton>
<SlRadioButton value="2" disabled> <WaRadioButton value="2" disabled>
Option 2 Option 2
</SlRadioButton> </WaRadioButton>
<SlRadioButton value="3">Option 3</SlRadioButton> <WaRadioButton value="3">Option 3</WaRadioButton>
</SlRadioGroup> </WaRadioGroup>
); );
``` ```
@@ -84,54 +87,55 @@ const App = () => (
Use the `size` attribute to change a radio button's size. Use the `size` attribute to change a radio button's size.
```html:preview ```html:preview
<sl-radio-group label="Select an option" name="a" value="1"> <wa-radio-group size="small" label="Select an option" name="a" value="1">
<sl-radio-button size="small" value="1">Option 1</sl-radio-button> <wa-radio-button value="1">Option 1</wa-radio-button>
<sl-radio-button size="small" value="2">Option 2</sl-radio-button> <wa-radio-button value="2">Option 2</wa-radio-button>
<sl-radio-button size="small" value="3">Option 3</sl-radio-button> <wa-radio-button value="3">Option 3</wa-radio-button>
</sl-radio-group> </wa-radio-group>
<br /> <br />
<sl-radio-group label="Select an option" name="a" value="1"> <wa-radio-group size="medium" label="Select an option" name="a" value="1">
<sl-radio-button size="medium" value="1">Option 1</sl-radio-button> <wa-radio-button value="1">Option 1</wa-radio-button>
<sl-radio-button size="medium" value="2">Option 2</sl-radio-button> <wa-radio-button value="2">Option 2</wa-radio-button>
<sl-radio-button size="medium" value="3">Option 3</sl-radio-button> <wa-radio-button value="3">Option 3</wa-radio-button>
</sl-radio-group> </wa-radio-group>
<br /> <br />
<sl-radio-group label="Select an option" name="a" value="1"> <wa-radio-group size="large" label="Select an option" name="a" value="1">
<sl-radio-button size="large" value="1">Option 1</sl-radio-button> <wa-radio-button value="1">Option 1</wa-radio-button>
<sl-radio-button size="large" value="2">Option 2</sl-radio-button> <wa-radio-button value="2">Option 2</wa-radio-button>
<sl-radio-button size="large" value="3">Option 3</sl-radio-button> <wa-radio-button value="3">Option 3</wa-radio-button>
</sl-radio-group> </wa-radio-group>
``` ```
```jsx:react ```jsx:react
import { SlRadioButton, SlRadioGroup } from '@shoelace-style/shoelace/dist/react'; import WaRadioButton from '@shoelace-style/shoelace/dist/react/radio-button';
import WaRadioGroup from '@shoelace-style/shoelace/dist/react/radio-group';
const App = () => ( const App = () => (
<SlRadioGroup label="Select an option" name="a" value="1"> <WaRadioGroup size="small" label="Select an option" name="a" value="1">
<SlRadioButton size="small" value="1">Option 1</SlRadioButton> <WaRadioButton value="1">Option 1</WaRadioButton>
<SlRadioButton size="small" value="2">Option 2</SlRadioButton> <WaRadioButton value="2">Option 2</WaRadioButton>
<SlRadioButton size="small" value="3">Option 3</SlRadioButton> <WaRadioButton value="3">Option 3</WaRadioButton>
</SlRadioGroup> </WaRadioGroup>
<br /> <br />
<SlRadioGroup label="Select an option" name="a" value="1"> <WaRadioGroup size="medium" label="Select an option" name="a" value="1">
<SlRadioButton size="medium" value="1">Option 1</SlRadioButton> <WaRadioButton value="1">Option 1</WaRadioButton>
<SlRadioButton size="medium" value="2">Option 2</SlRadioButton> <WaRadioButton value="2">Option 2</WaRadioButton>
<SlRadioButton size="medium" value="3">Option 3</SlRadioButton> <WaRadioButton value="3">Option 3</WaRadioButton>
</SlRadioGroup> </WaRadioGroup>
<br /> <br />
<SlRadioGroup label="Select an option" name="a" value="1"> <WaRadioGroup size="large" label="Select an option" name="a" value="1">
<SlRadioButton size="large" value="1">Option 1</SlRadioButton> <WaRadioButton value="1">Option 1</WaRadioButton>
<SlRadioButton size="large" value="2">Option 2</SlRadioButton> <WaRadioButton value="2">Option 2</WaRadioButton>
<SlRadioButton size="large" value="3">Option 3</SlRadioButton> <WaRadioButton value="3">Option 3</WaRadioButton>
</SlRadioGroup> </WaRadioGroup>
); );
``` ```
@@ -140,54 +144,55 @@ const App = () => (
Use the `pill` attribute to give radio buttons rounded edges. Use the `pill` attribute to give radio buttons rounded edges.
```html:preview ```html:preview
<sl-radio-group label="Select an option" name="a" value="1"> <wa-radio-group size="small" label="Select an option" name="a" value="1">
<sl-radio-button pill size="small" value="1">Option 1</sl-radio-button> <wa-radio-button pill value="1">Option 1</wa-radio-button>
<sl-radio-button pill size="small" value="2">Option 2</sl-radio-button> <wa-radio-button pill value="2">Option 2</wa-radio-button>
<sl-radio-button pill size="small" value="3">Option 3</sl-radio-button> <wa-radio-button pill value="3">Option 3</wa-radio-button>
</sl-radio-group> </wa-radio-group>
<br /> <br />
<sl-radio-group label="Select an option" name="a" value="1"> <wa-radio-group size="medium" label="Select an option" name="a" value="1">
<sl-radio-button pill size="medium" value="1">Option 1</sl-radio-button> <wa-radio-button pill value="1">Option 1</wa-radio-button>
<sl-radio-button pill size="medium" value="2">Option 2</sl-radio-button> <wa-radio-button pill value="2">Option 2</wa-radio-button>
<sl-radio-button pill size="medium" value="3">Option 3</sl-radio-button> <wa-radio-button pill value="3">Option 3</wa-radio-button>
</sl-radio-group> </wa-radio-group>
<br /> <br />
<sl-radio-group label="Select an option" name="a" value="1"> <wa-radio-group size="large" label="Select an option" name="a" value="1">
<sl-radio-button pill size="large" value="1">Option 1</sl-radio-button> <wa-radio-button pill value="1">Option 1</wa-radio-button>
<sl-radio-button pill size="large" value="2">Option 2</sl-radio-button> <wa-radio-button pill value="2">Option 2</wa-radio-button>
<sl-radio-button pill size="large" value="3">Option 3</sl-radio-button> <wa-radio-button pill value="3">Option 3</wa-radio-button>
</sl-radio-group> </wa-radio-group>
``` ```
```jsx:react ```jsx:react
import { SlRadioButton, SlRadioGroup } from '@shoelace-style/shoelace/dist/react'; import WaRadioButton from '@shoelace-style/shoelace/dist/react/radio-button';
import WaRadioGroup from '@shoelace-style/shoelace/dist/react/radio-group';
const App = () => ( const App = () => (
<SlRadioGroup label="Select an option" name="a" value="1"> <WaRadioGroup size="small" label="Select an option" name="a" value="1">
<SlRadioButton pill size="small" value="1">Option 1</SlRadioButton> <WaRadioButton pill value="1">Option 1</WaRadioButton>
<SlRadioButton pill size="small" value="2">Option 2</SlRadioButton> <WaRadioButton pill value="2">Option 2</WaRadioButton>
<SlRadioButton pill size="small" value="3">Option 3</SlRadioButton> <WaRadioButton pill value="3">Option 3</WaRadioButton>
</SlRadioGroup> </WaRadioGroup>
<br /> <br />
<SlRadioGroup label="Select an option" name="a" value="1"> <WaRadioGroup size="medium" label="Select an option" name="a" value="1">
<SlRadioButton pill size="medium" value="1">Option 1</SlRadioButton> <WaRadioButton pill value="1">Option 1</WaRadioButton>
<SlRadioButton pill size="medium" value="2">Option 2</SlRadioButton> <WaRadioButton pill value="2">Option 2</WaRadioButton>
<SlRadioButton pill size="medium" value="3">Option 3</SlRadioButton> <WaRadioButton pill value="3">Option 3</WaRadioButton>
</SlRadioGroup> </WaRadioGroup>
<br /> <br />
<SlRadioGroup label="Select an option" name="a" value="1"> <WaRadioGroup size="large" label="Select an option" name="a" value="1">
<SlRadioButton pill size="large" value="1">Option 1</SlRadioButton> <WaRadioButton pill value="1">Option 1</WaRadioButton>
<SlRadioButton pill size="large" value="2">Option 2</SlRadioButton> <WaRadioButton pill value="2">Option 2</WaRadioButton>
<SlRadioButton pill size="large" value="3">Option 3</SlRadioButton> <WaRadioButton pill value="3">Option 3</WaRadioButton>
</SlRadioGroup> </WaRadioGroup>
); );
``` ```
@@ -196,46 +201,48 @@ const App = () => (
Use the `prefix` and `suffix` slots to add icons. Use the `prefix` and `suffix` slots to add icons.
```html:preview ```html:preview
<sl-radio-group label="Select an option" name="a" value="1"> <wa-radio-group label="Select an option" name="a" value="1">
<sl-radio-button value="1"> <wa-radio-button value="1">
<sl-icon slot="prefix" name="archive"></sl-icon> <wa-icon slot="prefix" name="archive" variant="solid"></wa-icon>
Option 1 Option 1
</sl-radio-button> </wa-radio-button>
<sl-radio-button value="2"> <wa-radio-button value="2">
<sl-icon slot="suffix" name="bag"></sl-icon> <wa-icon slot="suffix" name="bag-shopping" variant="solid"></wa-icon>
Option 2 Option 2
</sl-radio-button> </wa-radio-button>
<sl-radio-button value="3"> <wa-radio-button value="3">
<sl-icon slot="prefix" name="gift"></sl-icon> <wa-icon slot="prefix" name="gift" variant="solid"></wa-icon>
<sl-icon slot="suffix" name="cart"></sl-icon> <wa-icon slot="suffix" name="shopping-cart" variant="solid"></wa-icon>
Option 3 Option 3
</sl-radio-button> </wa-radio-button>
</sl-radio-group> </wa-radio-group>
``` ```
```jsx:react ```jsx:react
import { SlIcon, SlRadioButton, SlRadioGroup } from '@shoelace-style/shoelace/dist/react'; import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
import WaRadioButton from '@shoelace-style/shoelace/dist/react/radio-button';
import WaRadioGroup from '@shoelace-style/shoelace/dist/react/radio-group';
const App = () => ( const App = () => (
<SlRadioGroup label="Select an option" name="a" value="1"> <WaRadioGroup label="Select an option" name="a" value="1">
<SlRadioButton value="1"> <WaRadioButton value="1">
<SlIcon slot="prefix" name="archive" /> <WaIcon slot="prefix" name="archive" variant="solid" />
Option 1 Option 1
</SlRadioButton> </WaRadioButton>
<SlRadioButton value="2"> <WaRadioButton value="2">
<SlIcon slot="suffix" name="bag" /> <WaIcon slot="suffix" name="bag" variant="solid" />
Option 2 Option 2
</SlRadioButton> </WaRadioButton>
<SlRadioButton value="3"> <WaRadioButton value="3">
<SlIcon slot="prefix" name="gift" /> <WaIcon slot="prefix" name="gift" variant="solid" />
<SlIcon slot="suffix" name="cart" /> <WaIcon slot="suffix" name="cart" variant="solid" />
Option 3 Option 3
</SlRadioButton> </WaRadioButton>
</SlRadioGroup> </WaRadioGroup>
); );
``` ```
@@ -244,53 +251,55 @@ const App = () => (
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. 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:preview ```html:preview
<sl-radio-group label="Select an option" name="a" value="neutral"> <wa-radio-group label="Select an option" name="a" value="neutral">
<sl-radio-button value="angry"> <wa-radio-button value="angry">
<sl-icon name="emoji-angry" label="Angry"></sl-icon> <wa-icon name="face-angry" variant="solid" label="Angry"></wa-icon>
</sl-radio-button> </wa-radio-button>
<sl-radio-button value="sad"> <wa-radio-button value="sad">
<sl-icon name="emoji-frown" label="Sad"></sl-icon> <wa-icon name="face-frown" variant="solid" label="Sad"></wa-icon>
</sl-radio-button> </wa-radio-button>
<sl-radio-button value="neutral"> <wa-radio-button value="neutral">
<sl-icon name="emoji-neutral" label="Neutral"></sl-icon> <wa-icon name="face-meh" variant="solid" label="Neutral"></wa-icon>
</sl-radio-button> </wa-radio-button>
<sl-radio-button value="happy"> <wa-radio-button value="happy">
<sl-icon name="emoji-smile" label="Happy"></sl-icon> <wa-icon name="face-smile" variant="solid" label="Happy"></wa-icon>
</sl-radio-button> </wa-radio-button>
<sl-radio-button value="laughing"> <wa-radio-button value="laughing">
<sl-icon name="emoji-laughing" label="Laughing"></sl-icon> <wa-icon name="face-laugh" variant="solid" label="Laughing"></wa-icon>
</sl-radio-button> </wa-radio-button>
</sl-radio-group> </wa-radio-group>
``` ```
```jsx:react ```jsx:react
import { SlIcon, SlRadioButton, SlRadioGroup } from '@shoelace-style/shoelace/dist/react'; import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
import WaRadioButton from '@shoelace-style/shoelace/dist/react/radio-button';
import WaRadioGroup from '@shoelace-style/shoelace/dist/react/radio-group';
const App = () => ( const App = () => (
<SlRadioGroup label="Select an option" name="a" value="neutral"> <WaRadioGroup label="Select an option" name="a" value="neutral">
<SlRadioButton value="angry"> <WaRadioButton value="angry">
<SlIcon name="emoji-angry" label="Angry" /> <WaIcon name="face-angry" label="Angry" />
</SlRadioButton> </WaRadioButton>
<SlRadioButton value="sad"> <WaRadioButton value="sad">
<SlIcon name="emoji-frown" label="Sad" /> <WaIcon name="face-frown" label="Sad" />
</SlRadioButton> </WaRadioButton>
<SlRadioButton value="neutral"> <WaRadioButton value="neutral">
<SlIcon name="emoji-neutral" label="Neutral" /> <WaIcon name="face-neutral" label="Neutral" />
</SlRadioButton> </WaRadioButton>
<SlRadioButton value="happy"> <WaRadioButton value="happy">
<SlIcon name="emoji-smile" label="Happy" /> <WaIcon name="face-smile" label="Happy" />
</SlRadioButton> </WaRadioButton>
<SlRadioButton value="laughing"> <WaRadioButton value="laughing">
<SlIcon name="emoji-laughing" label="Laughing" /> <WaIcon name="face-laughing" label="Laughing" />
</SlRadioButton> </WaRadioButton>
</SlRadioGroup> </WaRadioGroup>
); );
``` ```

View File

@@ -6,22 +6,23 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-radio-group label="Select an option" name="a" value="1"> <wa-radio-group label="Select an option" name="a" value="1">
<sl-radio value="1">Option 1</sl-radio> <wa-radio value="1">Option 1</wa-radio>
<sl-radio value="2">Option 2</sl-radio> <wa-radio value="2">Option 2</wa-radio>
<sl-radio value="3">Option 3</sl-radio> <wa-radio value="3">Option 3</wa-radio>
</sl-radio-group> </wa-radio-group>
``` ```
```jsx:react ```jsx:react
import { SlRadio, SlRadioGroup } from '@shoelace-style/shoelace/dist/react'; import WaRadio from '@shoelace-style/shoelace/dist/react/radio';
import WaRadioGroup from '@shoelace-style/shoelace/dist/react/radio-group';
const App = () => ( const App = () => (
<SlRadioGroup label="Select an option" name="a" value="1"> <WaRadioGroup label="Select an option" name="a" value="1">
<SlRadio value="1">Option 1</SlRadio> <WaRadio value="1">Option 1</WaRadio>
<SlRadio value="2">Option 2</SlRadio> <WaRadio value="2">Option 2</WaRadio>
<SlRadio value="3">Option 3</SlRadio> <WaRadio value="3">Option 3</WaRadio>
</SlRadioGroup> </WaRadioGroup>
); );
``` ```
@@ -32,22 +33,23 @@ const App = () => (
Add descriptive help text to a radio group with the `help-text` attribute. For help texts that contain HTML, use the `help-text` slot instead. Add descriptive help text to a radio group with the `help-text` attribute. For help texts that contain HTML, use the `help-text` slot instead.
```html:preview ```html:preview
<sl-radio-group label="Select an option" help-text="Choose the most appropriate option." name="a" value="1"> <wa-radio-group label="Select an option" help-text="Choose the most appropriate option." name="a" value="1">
<sl-radio value="1">Option 1</sl-radio> <wa-radio value="1">Option 1</wa-radio>
<sl-radio value="2">Option 2</sl-radio> <wa-radio value="2">Option 2</wa-radio>
<sl-radio value="3">Option 3</sl-radio> <wa-radio value="3">Option 3</wa-radio>
</sl-radio-group> </wa-radio-group>
``` ```
```jsx:react ```jsx:react
import { SlRadio, SlRadioGroup } from '@shoelace-style/shoelace/dist/react'; import WaRadio from '@shoelace-style/shoelace/dist/react/radio';
import WaRadioGroup from '@shoelace-style/shoelace/dist/react/radio-group';
const App = () => ( const App = () => (
<SlRadioGroup label="Select an option" help-text="Choose the most appropriate option." name="a" value="1"> <WaRadioGroup label="Select an option" help-text="Choose the most appropriate option." name="a" value="1">
<SlRadio value="1">Option 1</SlRadio> <WaRadio value="1">Option 1</WaRadio>
<SlRadio value="2">Option 2</SlRadio> <WaRadio value="2">Option 2</WaRadio>
<SlRadio value="3">Option 3</SlRadio> <WaRadio value="3">Option 3</WaRadio>
</SlRadioGroup> </WaRadioGroup>
); );
``` ```
@@ -56,22 +58,23 @@ const App = () => (
[Radio buttons](/components/radio-button) offer an alternate way to display radio controls. In this case, an internal [button group](/components/button-group) is used to group the buttons into a single, cohesive control. [Radio buttons](/components/radio-button) offer an alternate way to display radio controls. In this case, an internal [button group](/components/button-group) is used to group the buttons into a single, cohesive control.
```html:preview ```html:preview
<sl-radio-group label="Select an option" help-text="Select an option that makes you proud." name="a" value="1"> <wa-radio-group label="Select an option" help-text="Select an option that makes you proud." name="a" value="1">
<sl-radio-button value="1">Option 1</sl-radio-button> <wa-radio-button value="1">Option 1</wa-radio-button>
<sl-radio-button value="2">Option 2</sl-radio-button> <wa-radio-button value="2">Option 2</wa-radio-button>
<sl-radio-button value="3">Option 3</sl-radio-button> <wa-radio-button value="3">Option 3</wa-radio-button>
</sl-radio-group> </wa-radio-group>
``` ```
```jsx:react ```jsx:react
import { SlRadioButton, SlRadioGroup } from '@shoelace-style/shoelace/dist/react'; import WaRadioButton from '@shoelace-style/shoelace/dist/react/radio-button';
import WaRadioGroup from '@shoelace-style/shoelace/dist/react/radio-group';
const App = () => ( const App = () => (
<SlRadioGroup label="Select an option" name="a" value="1"> <WaRadioGroup label="Select an option" name="a" value="1">
<SlRadioButton value="1">Option 1</SlRadioButton> <WaRadioButton value="1">Option 1</WaRadioButton>
<SlRadioButton value="2">Option 2</SlRadioButton> <WaRadioButton value="2">Option 2</WaRadioButton>
<SlRadioButton value="3">Option 3</SlRadioButton> <WaRadioButton value="3">Option 3</WaRadioButton>
</SlRadioGroup> </WaRadioGroup>
); );
``` ```
@@ -80,24 +83,25 @@ const App = () => (
Radios and radio buttons can be disabled by adding the `disabled` attribute to the respective options inside the radio group. Radios and radio buttons can be disabled by adding the `disabled` attribute to the respective options inside the radio group.
```html:preview ```html:preview
<sl-radio-group label="Select an option" name="a" value="1"> <wa-radio-group label="Select an option" name="a" value="1">
<sl-radio value="1">Option 1</sl-radio> <wa-radio value="1">Option 1</wa-radio>
<sl-radio value="2" disabled>Option 2</sl-radio> <wa-radio value="2" disabled>Option 2</wa-radio>
<sl-radio value="3">Option 3</sl-radio> <wa-radio value="3">Option 3</wa-radio>
</sl-radio-group> </wa-radio-group>
``` ```
```jsx:react ```jsx:react
import { SlRadio, SlRadioGroup } from '@shoelace-style/shoelace/dist/react'; import WaRadio from '@shoelace-style/shoelace/dist/react/radio';
import WaRadioGroup from '@shoelace-style/shoelace/dist/react/radio-group';
const App = () => ( const App = () => (
<SlRadioGroup label="Select an option" name="a" value="1"> <WaRadioGroup label="Select an option" name="a" value="1">
<SlRadio value="1">Option 1</SlRadio> <WaRadio value="1">Option 1</WaRadio>
<SlRadio value="2" disabled> <WaRadio value="2" disabled>
Option 2 Option 2
</SlRadio> </WaRadio>
<SlRadio value="3">Option 3</SlRadio> <WaRadio value="3">Option 3</WaRadio>
</SlRadioGroup> </WaRadioGroup>
); );
``` ```
@@ -106,16 +110,16 @@ const App = () => (
The size of [Radios](/components/radio) and [Radio Buttons](/components/radio-buttons) will be determined by the Radio Group's `size` attribute. The size of [Radios](/components/radio) and [Radio Buttons](/components/radio-buttons) will be determined by the Radio Group's `size` attribute.
```html preview ```html preview
<sl-radio-group label="Select an option" size="medium" value="medium" class="radio-group-size"> <wa-radio-group label="Select an option" size="medium" value="medium" class="radio-group-size">
<sl-radio value="small">Small</sl-radio> <wa-radio value="small">Small</wa-radio>
<sl-radio value="medium">Medium</sl-radio> <wa-radio value="medium">Medium</wa-radio>
<sl-radio value="large">Large</sl-radio> <wa-radio value="large">Large</wa-radio>
</sl-radio-group> </wa-radio-group>
<script> <script>
const radioGroup = document.querySelector('.radio-group-size'); const radioGroup = document.querySelector('.radio-group-size');
radioGroup.addEventListener('sl-change', () => { radioGroup.addEventListener('wa-change', () => {
radioGroup.size = radioGroup.value; radioGroup.size = radioGroup.value;
}); });
</script> </script>
@@ -123,24 +127,25 @@ The size of [Radios](/components/radio) and [Radio Buttons](/components/radio-bu
```jsx react ```jsx react
import { useState } from 'react'; import { useState } from 'react';
import { SlRadio, SlRadioGroup } from '@shoelace-style/shoelace/dist/react'; import WaRadio from '@shoelace-style/shoelace/dist/react/radio';
import WaRadioGroup from '@shoelace-style/shoelace/dist/react/radio-group';
const App = () => { const App = () => {
const [size, setSize] = useState('medium'); const [size, setSize] = useState('medium');
return ( return (
<> <>
<SlRadioGroup <WaRadioGroup
label="Select an option" label="Select an option"
size={size} size={size}
value={size} value={size}
class="radio-group-size" class="radio-group-size"
onSlChange={event => setSize(event.target.value)} onWaChange={event => setSize(event.target.value)}
> >
<SlRadio value="small">Small</SlRadio> <WaRadio value="small">Small</WaRadio>
<SlRadio value="medium">Medium</SlRadio> <WaRadio value="medium">Medium</WaRadio>
<SlRadio value="large">Large</SlRadio> <WaRadio value="large">Large</WaRadio>
</SlRadioGroup> </WaRadioGroup>
</> </>
); );
}; };
@@ -156,13 +161,13 @@ Setting the `required` attribute to make selecting an option mandatory. If a val
```html:preview ```html:preview
<form class="validation"> <form class="validation">
<sl-radio-group label="Select an option" name="a" required> <wa-radio-group label="Select an option" name="a" required>
<sl-radio value="1">Option 1</sl-radio> <wa-radio value="1">Option 1</wa-radio>
<sl-radio value="2">Option 2</sl-radio> <wa-radio value="2">Option 2</wa-radio>
<sl-radio value="3">Option 3</sl-radio> <wa-radio value="3">Option 3</wa-radio>
</sl-radio-group> </wa-radio-group>
<br /> <br />
<sl-button type="submit" variant="primary">Submit</sl-button> <wa-button type="submit" variant="brand">Submit</wa-button>
</form> </form>
<script> <script>
@@ -177,7 +182,10 @@ Setting the `required` attribute to make selecting an option mandatory. If a val
``` ```
```jsx:react ```jsx:react
import { SlButton, SlIcon, SlRadio, SlRadioGroup } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
import WaRadio from '@shoelace-style/shoelace/dist/react/radio';
import WaRadioGroup from '@shoelace-style/shoelace/dist/react/radio-group';
const App = () => { const App = () => {
function handleSubmit(event) { function handleSubmit(event) {
event.preventDefault(); event.preventDefault();
@@ -186,21 +194,21 @@ const App = () => {
return ( return (
<form class="custom-validity" onSubmit={handleSubmit}> <form class="custom-validity" onSubmit={handleSubmit}>
<SlRadioGroup label="Select an option" name="a" required onSlChange={handleChange}> <WaRadioGroup label="Select an option" name="a" required onWaChange={handleChange}>
<SlRadio value="1"> <WaRadio value="1">
Option 1 Option 1
</SlRadio> </WaRadio>
<SlRadiovalue="2"> <WaRadiovalue="2">
Option 2 Option 2
</SlRadio> </WaRadio>
<SlRadio value="3"> <WaRadio value="3">
Option 3 Option 3
</SlRadio> </WaRadio>
</SlRadioGroup> </WaRadioGroup>
<br /> <br />
<SlButton type="submit" variant="primary"> <WaButton type="submit" variant="brand">
Submit Submit
</SlButton> </WaButton>
</form> </form>
); );
}; };
@@ -212,27 +220,27 @@ Use the `setCustomValidity()` method to set a custom validation message. This wi
```html:preview ```html:preview
<form class="custom-validity"> <form class="custom-validity">
<sl-radio-group label="Select an option" name="a" value="1"> <wa-radio-group label="Select an option" name="a" value="1">
<sl-radio value="1">Not me</sl-radio> <wa-radio value="1">Not me</wa-radio>
<sl-radio value="2">Me neither</sl-radio> <wa-radio value="2">Me neither</wa-radio>
<sl-radio value="3">Choose me</sl-radio> <wa-radio value="3">Choose me</wa-radio>
</sl-radio-group> </wa-radio-group>
<br /> <br />
<sl-button type="submit" variant="primary">Submit</sl-button> <wa-button type="submit" variant="brand">Submit</wa-button>
</form> </form>
<script> <script>
const form = document.querySelector('.custom-validity'); const form = document.querySelector('.custom-validity');
const radioGroup = form.querySelector('sl-radio-group'); const radioGroup = form.querySelector('wa-radio-group');
const errorMessage = 'You must choose the last option'; const errorMessage = 'You must choose the last option';
// Set initial validity as soon as the element is defined // Set initial validity as soon as the element is defined
customElements.whenDefined('sl-radio').then(() => { customElements.whenDefined('wa-radio').then(() => {
radioGroup.setCustomValidity(errorMessage); radioGroup.setCustomValidity(errorMessage);
}); });
// Update validity when a selection is made // Update validity when a selection is made
form.addEventListener('sl-change', () => { form.addEventListener('wa-change', () => {
const isValid = radioGroup.value === '3'; const isValid = radioGroup.value === '3';
radioGroup.setCustomValidity(isValid ? '' : errorMessage); radioGroup.setCustomValidity(isValid ? '' : errorMessage);
}); });
@@ -247,7 +255,10 @@ Use the `setCustomValidity()` method to set a custom validation message. This wi
```jsx:react ```jsx:react
import { useEffect, useRef } from 'react'; import { useEffect, useRef } from 'react';
import { SlButton, SlIcon, SlRadio, SlRadioGroup } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
import WaRadio from '@shoelace-style/shoelace/dist/react/radio';
import WaRadioGroup from '@shoelace-style/shoelace/dist/react/radio-group';
const App = () => { const App = () => {
const radioGroup = useRef(null); const radioGroup = useRef(null);
const errorMessage = 'You must choose this option'; const errorMessage = 'You must choose this option';
@@ -267,15 +278,15 @@ const App = () => {
return ( return (
<form class="custom-validity" onSubmit={handleSubmit}> <form class="custom-validity" onSubmit={handleSubmit}>
<SlRadioGroup ref={radioGroup} label="Select an option" name="a" value="1" onSlChange={handleChange}> <WaRadioGroup ref={radioGroup} label="Select an option" name="a" value="1" onWaChange={handleChange}>
<SlRadio value="1">Not me</SlRadio> <WaRadio value="1">Not me</WaRadio>
<SlRadio value="2">Me neither</SlRadio> <WaRadio value="2">Me neither</WaRadio>
<SlRadio value="3">Choose me</SlRadio> <WaRadio value="3">Choose me</WaRadio>
</SlRadioGroup> </WaRadioGroup>
<br /> <br />
<SlButton type="submit" variant="primary"> <WaButton type="submit" variant="brand">
Submit Submit
</SlButton> </WaButton>
</form> </form>
); );
}; };

View File

@@ -8,22 +8,23 @@ layout: component
Radios are designed to be used with [radio groups](/components/radio-group). Radios are designed to be used with [radio groups](/components/radio-group).
```html:preview ```html:preview
<sl-radio-group label="Select an option" name="a" value="1"> <wa-radio-group label="Select an option" name="a" value="1">
<sl-radio value="1">Option 1</sl-radio> <wa-radio value="1">Option 1</wa-radio>
<sl-radio value="2">Option 2</sl-radio> <wa-radio value="2">Option 2</wa-radio>
<sl-radio value="3">Option 3</sl-radio> <wa-radio value="3">Option 3</wa-radio>
</sl-radio-group> </wa-radio-group>
``` ```
```jsx:react ```jsx:react
import { SlRadio, SlRadioGroup } from '@shoelace-style/shoelace/dist/react'; import WaRadio from '@shoelace-style/shoelace/dist/react/radio';
import WaRadioGroup from '@shoelace-style/shoelace/dist/react/radio-group';
const App = () => ( const App = () => (
<SlRadioGroup label="Select an option" name="a" value="1"> <WaRadioGroup label="Select an option" name="a" value="1">
<SlRadio value="1">Option 1</SlRadio> <WaRadio value="1">Option 1</WaRadio>
<SlRadio value="2">Option 2</SlRadio> <WaRadio value="2">Option 2</WaRadio>
<SlRadio value="3">Option 3</SlRadio> <WaRadio value="3">Option 3</WaRadio>
</SlRadioGroup> </WaRadioGroup>
); );
``` ```
@@ -38,22 +39,23 @@ This component works with standard `<form>` elements. Please refer to the sectio
To set the initial value and checked state, use the `value` attribute on the containing radio group. To set the initial value and checked state, use the `value` attribute on the containing radio group.
```html:preview ```html:preview
<sl-radio-group label="Select an option" name="a" value="3"> <wa-radio-group label="Select an option" name="a" value="3">
<sl-radio value="1">Option 1</sl-radio> <wa-radio value="1">Option 1</wa-radio>
<sl-radio value="2">Option 2</sl-radio> <wa-radio value="2">Option 2</wa-radio>
<sl-radio value="3">Option 3</sl-radio> <wa-radio value="3">Option 3</wa-radio>
</sl-radio-group> </wa-radio-group>
``` ```
```jsx:react ```jsx:react
import { SlRadio, SlRadioGroup } from '@shoelace-style/shoelace/dist/react'; import WaRadio from '@shoelace-style/shoelace/dist/react/radio';
import WaRadioGroup from '@shoelace-style/shoelace/dist/react/radio-group';
const App = () => ( const App = () => (
<SlRadioGroup label="Select an option" name="a" value="3"> <WaRadioGroup label="Select an option" name="a" value="3">
<SlRadio value="1">Option 1</SlRadio> <WaRadio value="1">Option 1</WaRadio>
<SlRadio value="2">Option 2</SlRadio> <WaRadio value="2">Option 2</WaRadio>
<SlRadio value="3">Option 3</SlRadio> <WaRadio value="3">Option 3</WaRadio>
</SlRadioGroup> </WaRadioGroup>
); );
``` ```
@@ -62,24 +64,25 @@ const App = () => (
Use the `disabled` attribute to disable a radio. Use the `disabled` attribute to disable a radio.
```html:preview ```html:preview
<sl-radio-group label="Select an option" name="a" value="1"> <wa-radio-group label="Select an option" name="a" value="1">
<sl-radio value="1">Option 1</sl-radio> <wa-radio value="1">Option 1</wa-radio>
<sl-radio value="2" disabled>Option 2</sl-radio> <wa-radio value="2" disabled>Option 2</wa-radio>
<sl-radio value="3">Option 3</sl-radio> <wa-radio value="3">Option 3</wa-radio>
</sl-radio-group> </wa-radio-group>
``` ```
```jsx:react ```jsx:react
import { SlRadio, SlRadioGroup } from '@shoelace-style/shoelace/dist/react'; import WaRadio from '@shoelace-style/shoelace/dist/react/radio';
import WaRadioGroup from '@shoelace-style/shoelace/dist/react/radio-group';
const App = () => ( const App = () => (
<SlRadioGroup label="Select an option" name="a" value="1"> <WaRadioGroup label="Select an option" name="a" value="1">
<SlRadio value="1">Option 1</SlRadio> <WaRadio value="1">Option 1</WaRadio>
<SlRadio value="2" disabled> <WaRadio value="2" disabled>
Option 2 Option 2
</SlRadio> </WaRadio>
<SlRadio value="3">Option 3</SlRadio> <WaRadio value="3">Option 3</WaRadio>
</SlRadioGroup> </WaRadioGroup>
); );
``` ```
@@ -88,55 +91,55 @@ const App = () => (
Add the `size` attribute to the [Radio Group](/components/radio-group) to change the radios' size. Add the `size` attribute to the [Radio Group](/components/radio-group) to change the radios' size.
```html preview ```html preview
<sl-radio-group size="small" value="1"> <wa-radio-group size="small" value="1">
<sl-radio value="1">Small 1</sl-radio> <wa-radio value="1">Small 1</wa-radio>
<sl-radio value="2">Small 2</sl-radio> <wa-radio value="2">Small 2</wa-radio>
<sl-radio value="3">Small 3</sl-radio> <wa-radio value="3">Small 3</wa-radio>
</sl-radio-group> </wa-radio-group>
<br /> <br />
<sl-radio-group size="medium" value="1"> <wa-radio-group size="medium" value="1">
<sl-radio value="1">Medium 1</sl-radio> <wa-radio value="1">Medium 1</wa-radio>
<sl-radio value="2">Medium 2</sl-radio> <wa-radio value="2">Medium 2</wa-radio>
<sl-radio value="3">Medium 3</sl-radio> <wa-radio value="3">Medium 3</wa-radio>
</sl-radio-group> </wa-radio-group>
<br /> <br />
<sl-radio-group size="large" value="1"> <wa-radio-group size="large" value="1">
<sl-radio value="1">Large 1</sl-radio> <wa-radio value="1">Large 1</wa-radio>
<sl-radio value="2">Large 2</sl-radio> <wa-radio value="2">Large 2</wa-radio>
<sl-radio value="3">Large 3</sl-radio> <wa-radio value="3">Large 3</wa-radio>
</sl-radio-group> </wa-radio-group>
``` ```
```jsx react ```jsx react
import { SlRadio } from '@shoelace-style/shoelace/dist/react'; import WaRadio from '@shoelace-style/shoelace/dist/react/radio';
const App = () => ( const App = () => (
<> <>
<SlRadioGroup size="small" value="1"> <WaRadioGroup size="small" value="1">
<SlRadio value="1">Small 1</SlRadio> <WaRadio value="1">Small 1</WaRadio>
<SlRadio value="2">Small 2</SlRadio> <WaRadio value="2">Small 2</WaRadio>
<SlRadio value="3">Small 3</SlRadio> <WaRadio value="3">Small 3</WaRadio>
</SlRadioGroup> </WaRadioGroup>
<br /> <br />
<SlRadioGroup size="medium" value="1"> <WaRadioGroup size="medium" value="1">
<SlRadio value="1">Medium 1</SlRadio> <WaRadio value="1">Medium 1</WaRadio>
<SlRadio value="2">Medium 2</SlRadio> <WaRadio value="2">Medium 2</WaRadio>
<SlRadio value="3">Medium 3</SlRadio> <WaRadio value="3">Medium 3</WaRadio>
</SlRadioGroup> </WaRadioGroup>
<br /> <br />
<SlRadioGroup size="large" value="1"> <WaRadioGroup size="large" value="1">
<SlRadio value="1">Large 1</SlRadio> <WaRadio value="1">Large 1</WaRadio>
<SlRadio value="2">Large 2</SlRadio> <WaRadio value="2">Large 2</WaRadio>
<SlRadio value="3">Large 3</SlRadio> <WaRadio value="3">Large 3</WaRadio>
</SlRadioGroup> </WaRadioGroup>
</> </>
); );
``` ```

View File

@@ -6,13 +6,13 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-range></sl-range> <wa-range></wa-range>
``` ```
```jsx:react ```jsx:react
import { SlRange } from '@shoelace-style/shoelace/dist/react'; import WaRange from '@shoelace-style/shoelace/dist/react/range';
const App = () => <SlRange />; const App = () => <WaRange />;
``` ```
:::tip :::tip
@@ -26,13 +26,13 @@ This component works with standard `<form>` elements. Please refer to the sectio
Use the `label` attribute to give the range an accessible label. For labels that contain HTML, use the `label` slot instead. Use the `label` attribute to give the range an accessible label. For labels that contain HTML, use the `label` slot instead.
```html:preview ```html:preview
<sl-range label="Volume" min="0" max="100"></sl-range> <wa-range label="Volume" min="0" max="100"></wa-range>
``` ```
```jsx:react ```jsx:react
import { SlRange } from '@shoelace-style/shoelace/dist/react'; import WaRange from '@shoelace-style/shoelace/dist/react/range';
const App = () => <SlRange label="Volume" min={0} max={100} />; const App = () => <WaRange label="Volume" min={0} max={100} />;
``` ```
### Help Text ### Help Text
@@ -40,13 +40,13 @@ const App = () => <SlRange label="Volume" min={0} max={100} />;
Add descriptive help text to a range with the `help-text` attribute. For help texts that contain HTML, use the `help-text` slot instead. 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:preview ```html:preview
<sl-range label="Volume" help-text="Controls the volume of the current song." min="0" max="100"></sl-range> <wa-range label="Volume" help-text="Controls the volume of the current song." min="0" max="100"></wa-range>
``` ```
```jsx:react ```jsx:react
import { SlRange } from '@shoelace-style/shoelace/dist/react'; import WaRange from '@shoelace-style/shoelace/dist/react/range';
const App = () => <SlRange label="Volume" help-text="Controls the volume of the current song." min={0} max={100} />; const App = () => <WaRange label="Volume" help-text="Controls the volume of the current song." min={0} max={100} />;
``` ```
### Min, Max, and Step ### Min, Max, and Step
@@ -54,13 +54,13 @@ const App = () => <SlRange label="Volume" help-text="Controls the volume of the
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. 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:preview ```html:preview
<sl-range min="0" max="10" step="1"></sl-range> <wa-range min="0" max="10" step="1"></wa-range>
``` ```
```jsx:react ```jsx:react
import { SlRange } from '@shoelace-style/shoelace/dist/react'; import WaRange from '@shoelace-style/shoelace/dist/react/range';
const App = () => <SlRange min={0} max={10} step={1} />; const App = () => <WaRange min={0} max={10} step={1} />;
``` ```
### Disabled ### Disabled
@@ -68,13 +68,13 @@ const App = () => <SlRange min={0} max={10} step={1} />;
Use the `disabled` attribute to disable a slider. Use the `disabled` attribute to disable a slider.
```html:preview ```html:preview
<sl-range disabled></sl-range> <wa-range disabled></wa-range>
``` ```
```jsx:react ```jsx:react
import { SlRange } from '@shoelace-style/shoelace/dist/react'; import WaRange from '@shoelace-style/shoelace/dist/react/range';
const App = () => <SlRange disabled />; const App = () => <WaRange disabled />;
``` ```
### Tooltip Placement ### Tooltip Placement
@@ -82,13 +82,13 @@ const App = () => <SlRange disabled />;
By default, the tooltip is shown on top. Set `tooltip` to `bottom` to show it below the slider. By default, the tooltip is shown on top. Set `tooltip` to `bottom` to show it below the slider.
```html:preview ```html:preview
<sl-range tooltip="bottom"></sl-range> <wa-range tooltip="bottom"></wa-range>
``` ```
```jsx:react ```jsx:react
import { SlRange } from '@shoelace-style/shoelace/dist/react'; import WaRange from '@shoelace-style/shoelace/dist/react/range';
const App = () => <SlRange tooltip="bottom" />; const App = () => <WaRange tooltip="bottom" />;
``` ```
### Disable the Tooltip ### Disable the Tooltip
@@ -96,13 +96,13 @@ const App = () => <SlRange tooltip="bottom" />;
To disable the tooltip, set `tooltip` to `none`. To disable the tooltip, set `tooltip` to `none`.
```html:preview ```html:preview
<sl-range tooltip="none"></sl-range> <wa-range tooltip="none"></wa-range>
``` ```
```jsx:react ```jsx:react
import { SlRange } from '@shoelace-style/shoelace/dist/react'; import WaRange from '@shoelace-style/shoelace/dist/react/range';
const App = () => <SlRange tooltip="none" />; const App = () => <WaRange tooltip="none" />;
``` ```
### Custom Track Colors ### Custom Track Colors
@@ -110,24 +110,24 @@ const App = () => <SlRange tooltip="none" />;
You can customize the active and inactive portions of the track using the `--track-color-active` and `--track-color-inactive` custom properties. You can customize the active and inactive portions of the track using the `--track-color-active` and `--track-color-inactive` custom properties.
```html:preview ```html:preview
<sl-range <wa-range
style=" style="
--track-color-active: var(--sl-color-primary-600); --track-color-active: var(--wa-color-brand-spot);
--track-color-inactive: var(--sl-color-primary-100); --track-color-inactive: var(--wa-color-brand-fill-highlight);
" "
></sl-range> ></wa-range>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlRange } from '@shoelace-style/shoelace/dist/react'; import WaRange from '@shoelace-style/shoelace/dist/react/range';
const App = () => ( const App = () => (
<SlRange <WaRange
style={{ style={{
'--track-color-active': 'var(--sl-color-primary-600)', '--track-color-active': 'var(--wa-color-brand-spot)',
'--track-color-inactive': 'var(--sl-color-primary-200)' '--track-color-inactive': 'var(--wa-color-brand-fill-highlight)'
}} }}
/> />
); );
@@ -140,29 +140,29 @@ const App = () => (
You can customize the initial offset of the active track using the `--track-active-offset` custom property. You can customize the initial offset of the active track using the `--track-active-offset` custom property.
```html:preview ```html:preview
<sl-range <wa-range
min="-100" min="-100"
max="100" max="100"
style=" style="
--track-color-active: var(--sl-color-primary-600); --track-color-active: var(--wa-color-brand-spot);
--track-color-inactive: var(--sl-color-primary-100); --track-color-inactive: var(--wa-color-brand-fill-highlight);
--track-active-offset: 50%; --track-active-offset: 50%;
" "
></sl-range> ></wa-range>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlRange } from '@shoelace-style/shoelace/dist/react'; import WaRange from '@shoelace-style/shoelace/dist/react/range';
const App = () => ( const App = () => (
<SlRange <WaRange
min={-100} min={-100}
max={100} max={100}
style={{ style={{
'--track-color-active': 'var(--sl-color-primary-600)', '--track-color-active': 'var(--wa-color-brand-spot)',
'--track-color-inactive': 'var(--sl-color-primary-200)', '--track-color-inactive': 'var(--wa-color-brand-fill-highlight)',
'--track-active-offset': '50%' '--track-active-offset': '50%'
}} }}
/> />
@@ -176,7 +176,7 @@ const App = () => (
You can change the tooltip's content by setting the `tooltipFormatter` property to a function that accepts the range's value as an argument. 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:preview ```html:preview
<sl-range min="0" max="100" step="1" class="range-with-custom-formatter"></sl-range> <wa-range min="0" max="100" step="1" class="range-with-custom-formatter"></wa-range>
<script> <script>
const range = document.querySelector('.range-with-custom-formatter'); const range = document.querySelector('.range-with-custom-formatter');
@@ -185,7 +185,7 @@ You can change the tooltip's content by setting the `tooltipFormatter` property
``` ```
```jsx:react ```jsx:react
import { SlRange } from '@shoelace-style/shoelace/dist/react'; import WaRange from '@shoelace-style/shoelace/dist/react/range';
const App = () => <SlRange min={0} max={100} step={1} tooltipFormatter={value => `Total - ${value}%`} />; const App = () => <WaRange min={0} max={100} step={1} tooltipFormatter={value => `Total - ${value}%`} />;
``` ```

View File

@@ -6,13 +6,13 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-rating label="Rating"></sl-rating> <wa-rating label="Rating"></wa-rating>
``` ```
```jsx:react ```jsx:react
import { SlRating } from '@shoelace-style/shoelace/dist/react'; import WaRating from '@shoelace-style/shoelace/dist/react/rating';
const App = () => <SlRating label="Rating" />; const App = () => <WaRating label="Rating" />;
``` ```
## Examples ## Examples
@@ -22,13 +22,13 @@ const App = () => <SlRating label="Rating" />;
Ratings are commonly identified contextually, so labels aren't displayed. However, you should always provide one for assistive devices using the `label` attribute. Ratings are commonly identified contextually, so labels aren't displayed. However, you should always provide one for assistive devices using the `label` attribute.
```html:preview ```html:preview
<sl-rating label="Rate this component"></sl-rating> <wa-rating label="Rate this component"></wa-rating>
``` ```
```jsx:react ```jsx:react
import { SlRating } from '@shoelace-style/shoelace/dist/react'; import WaRating from '@shoelace-style/shoelace/dist/react/rating';
const App = () => <SlRating label="Rate this component" />; const App = () => <WaRating label="Rate this component" />;
``` ```
### Maximum Value ### Maximum Value
@@ -36,13 +36,13 @@ const App = () => <SlRating label="Rate this component" />;
Ratings are 0-5 by default. To change the maximum possible value, use the `max` attribute. Ratings are 0-5 by default. To change the maximum possible value, use the `max` attribute.
```html:preview ```html:preview
<sl-rating label="Rating" max="3"></sl-rating> <wa-rating label="Rating" max="3"></wa-rating>
``` ```
```jsx:react ```jsx:react
import { SlRating } from '@shoelace-style/shoelace/dist/react'; import WaRating from '@shoelace-style/shoelace/dist/react/rating';
const App = () => <SlRating label="Rating" max={3} />; const App = () => <WaRating label="Rating" max={3} />;
``` ```
### Precision ### Precision
@@ -50,13 +50,13 @@ const App = () => <SlRating label="Rating" max={3} />;
Use the `precision` attribute to let users select fractional ratings. Use the `precision` attribute to let users select fractional ratings.
```html:preview ```html:preview
<sl-rating label="Rating" precision="0.5" value="2.5"></sl-rating> <wa-rating label="Rating" precision="0.5" value="2.5"></wa-rating>
``` ```
```jsx:react ```jsx:react
import { SlRating } from '@shoelace-style/shoelace/dist/react'; import WaRating from '@shoelace-style/shoelace/dist/react/rating';
const App = () => <SlRating label="Rating" precision={0.5} value={2.5} />; const App = () => <WaRating label="Rating" precision={0.5} value={2.5} />;
``` ```
### Symbol Sizes ### Symbol Sizes
@@ -64,15 +64,15 @@ const App = () => <SlRating label="Rating" precision={0.5} value={2.5} />;
Set the `--symbol-size` custom property to adjust the size. Set the `--symbol-size` custom property to adjust the size.
```html:preview ```html:preview
<sl-rating label="Rating" style="--symbol-size: 2rem;"></sl-rating> <wa-rating label="Rating" style="--symbol-size: 2rem;"></wa-rating>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlRating } from '@shoelace-style/shoelace/dist/react'; import WaRating from '@shoelace-style/shoelace/dist/react/rating';
const App = () => <SlRating label="Rating" style={{ '--symbol-size': '2rem' }} />; const App = () => <WaRating label="Rating" style={{ '--symbol-size': '2rem' }} />;
``` ```
{% endraw %} {% endraw %}
@@ -82,13 +82,13 @@ const App = () => <SlRating label="Rating" style={{ '--symbol-size': '2rem' }} /
Use the `readonly` attribute to display a rating that users can't change. Use the `readonly` attribute to display a rating that users can't change.
```html:preview ```html:preview
<sl-rating label="Rating" readonly value="3"></sl-rating> <wa-rating label="Rating" readonly value="3"></wa-rating>
``` ```
```jsx:react ```jsx:react
import { SlRating } from '@shoelace-style/shoelace/dist/react'; import WaRating from '@shoelace-style/shoelace/dist/react/rating';
const App = () => <SlRating label="Rating" readonly value={3} />; const App = () => <WaRating label="Rating" readonly value={3} />;
``` ```
### Disabled ### Disabled
@@ -96,33 +96,33 @@ const App = () => <SlRating label="Rating" readonly value={3} />;
Use the `disable` attribute to disable the rating. Use the `disable` attribute to disable the rating.
```html:preview ```html:preview
<sl-rating label="Rating" disabled value="3"></sl-rating> <wa-rating label="Rating" disabled value="3"></wa-rating>
``` ```
```jsx:react ```jsx:react
import { SlRating } from '@shoelace-style/shoelace/dist/react'; import WaRating from '@shoelace-style/shoelace/dist/react/rating';
const App = () => <SlRating label="Rating" disabled value={3} />; const App = () => <WaRating label="Rating" disabled value={3} />;
``` ```
### Detecting Hover ### Detecting Hover
Use the `sl-hover` event to detect when the user hovers over (or touch and drag) the rating. This lets you hook into values as the user interacts with the rating, but before they select a value. Use the `wa-hover` event to detect when the user hovers over (or touch and drag) the rating. This lets you hook into values as the user interacts with the rating, but before they select a value.
The event has a payload with `phase` and `value` properties. The `phase` property tells when hovering starts, moves to a new value, and ends. The `value` property tells what the rating's value would be if the user were to commit to the hovered value. The event has a payload with `phase` and `value` properties. The `phase` property tells when hovering starts, moves to a new value, and ends. The `value` property tells what the rating's value would be if the user were to commit to the hovered value.
```html:preview ```html:preview
<div class="detect-hover"> <div class="detect-hover">
<sl-rating label="Rating"></sl-rating> <wa-rating label="Rating"></wa-rating>
<span></span> <span></span>
</div> </div>
<script> <script>
const rating = document.querySelector('.detect-hover > sl-rating'); const rating = document.querySelector('.detect-hover > wa-rating');
const span = rating.nextElementSibling; const span = rating.nextElementSibling;
const terms = ['No rating', 'Terrible', 'Bad', 'OK', 'Good', 'Excellent']; const terms = ['No rating', 'Terrible', 'Bad', 'OK', 'Good', 'Excellent'];
rating.addEventListener('sl-hover', event => { rating.addEventListener('wa-hover', event => {
span.textContent = terms[event.detail.value]; span.textContent = terms[event.detail.value];
// Clear feedback when hovering stops // Clear feedback when hovering stops
@@ -137,9 +137,9 @@ The event has a payload with `phase` and `value` properties. The `phase` propert
position: relative; position: relative;
top: -4px; top: -4px;
left: 8px; left: 8px;
border-radius: var(--sl-border-radius-small); border-radius: var(--wa-corners-s);
background: var(--sl-color-neutral-900); background: var(--wa-color-neutral-spot);
color: var(--sl-color-neutral-0); color: var(--wa-color-neutral-text-on-spot);
text-align: center; text-align: center;
padding: 4px 6px; padding: 4px 6px;
} }
@@ -152,7 +152,7 @@ The event has a payload with `phase` and `value` properties. The `phase` propert
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlRating } from '@shoelace-style/shoelace/dist/react'; import WaRating from '@shoelace-style/shoelace/dist/react/rating';
const terms = ['No rating', 'Terrible', 'Bad', 'OK', 'Good', 'Excellent']; const terms = ['No rating', 'Terrible', 'Bad', 'OK', 'Good', 'Excellent'];
const css = ` const css = `
@@ -160,9 +160,9 @@ const css = `
position: relative; position: relative;
top: -4px; top: -4px;
left: 8px; left: 8px;
border-radius: var(--sl-border-radius-small); border-radius: var(--wa-corners-s);
background: var(--sl-color-neutral-900); background: var(--wa-color-neutral-spot);
color: var(--sl-color-neutral-0); color: var(--wa-color-neutral-text-on-spot);
text-align: center; text-align: center;
padding: 4px 6px; padding: 4px 6px;
} }
@@ -173,7 +173,7 @@ const css = `
`; `;
function handleHover(event) { function handleHover(event) {
rating.addEventListener('sl-hover', event => { rating.addEventListener('wa-hover', event => {
setFeedback(terms[event.detail.value]); setFeedback(terms[event.detail.value]);
// Clear feedback when hovering stops // Clear feedback when hovering stops
@@ -189,7 +189,7 @@ const App = () => {
return ( return (
<> <>
<div class="detect-hover"> <div class="detect-hover">
<SlRating label="Rating" onSlHover={handleHover} /> <WaRating label="Rating" onWaHover={handleHover} />
<span>{feedback}</span> <span>{feedback}</span>
</div> </div>
<style>{css}</style> <style>{css}</style>
@@ -203,23 +203,23 @@ const App = () => {
You can provide custom icons by passing a function to the `getSymbol` property. You can provide custom icons by passing a function to the `getSymbol` property.
```html:preview ```html:preview
<sl-rating label="Rating" class="rating-hearts" style="--symbol-color-active: #ff4136;"></sl-rating> <wa-rating label="Rating" class="rating-hearts" style="--symbol-color-active: #ff4136;"></wa-rating>
<script> <script>
const rating = document.querySelector('.rating-hearts'); const rating = document.querySelector('.rating-hearts');
rating.getSymbol = () => '<sl-icon name="heart-fill"></sl-icon>'; rating.getSymbol = () => '<wa-icon name="heart" variant="solid"></wa-icon>';
</script> </script>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlRating } from '@shoelace-style/shoelace/dist/react'; import WaRating from '@shoelace-style/shoelace/dist/react/rating';
const App = () => ( const App = () => (
<SlRating <WaRating
label="Rating" label="Rating"
getSymbol={() => '<sl-icon name="heart-fill"></sl-icon>'} getSymbol={() => '<wa-icon name="heart" variant="solid"></wa-icon>'}
style={{ '--symbol-color-active': '#ff4136' }} style={{ '--symbol-color-active': '#ff4136' }}
/> />
); );
@@ -232,25 +232,25 @@ const App = () => (
You can also use the `getSymbol` property to render different icons based on value. You can also use the `getSymbol` property to render different icons based on value.
```html:preview ```html:preview
<sl-rating label="Rating" class="rating-emojis"></sl-rating> <wa-rating label="Rating" class="rating-emojis"></wa-rating>
<script> <script>
const rating = document.querySelector('.rating-emojis'); const rating = document.querySelector('.rating-emojis');
rating.getSymbol = value => { rating.getSymbol = value => {
const icons = ['emoji-angry', 'emoji-frown', 'emoji-expressionless', 'emoji-smile', 'emoji-laughing']; const icons = ['face-angry', 'face-frown', 'face-meh', 'face-smile', 'face-laugh'];
return `<sl-icon name="${icons[value - 1]}"></sl-icon>`; return `<wa-icon name="${icons[value - 1]}"></wa-icon>`;
}; };
</script> </script>
``` ```
```jsx:react ```jsx:react
import { SlRating } from '@shoelace-style/shoelace/dist/react'; import WaRating from '@shoelace-style/shoelace/dist/react/rating';
function getSymbol(value) { function getSymbol(value) {
const icons = ['emoji-angry', 'emoji-frown', 'emoji-expressionless', 'emoji-smile', 'emoji-laughing']; const icons = ['face-angry', 'face-frown', 'face-meh', 'face-smile', 'face-laugh'];
return `<sl-icon name="${icons[value - 1]}"></sl-icon>`; return `<wa-icon name="${icons[value - 1]}"></wa-icon>`;
} }
const App = () => <SlRating label="Rating" getSymbol={getSymbol} />; const App = () => <WaRating label="Rating" getSymbol={getSymbol} />;
``` ```

View File

@@ -8,14 +8,14 @@ layout: component
Localization is handled by the browser's [`Intl.RelativeTimeFormat` API](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat). No language packs are required. Localization is handled by the browser's [`Intl.RelativeTimeFormat` API](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat). No language packs are required.
```html:preview ```html:preview
<!-- Shoelace 2 release date 🎉 --> <!-- Web Awesome 2 release date 🎉 -->
<sl-relative-time date="2020-07-15T09:17:00-04:00"></sl-relative-time> <wa-relative-time date="2020-07-15T09:17:00-04:00"></wa-relative-time>
``` ```
```jsx:react ```jsx:react
import { SlRelativeTime } from '@shoelace-style/shoelace/dist/react'; import WaRelativeTime from '@shoelace-style/shoelace/dist/react/relative-time';
const App = () => <SlRelativeTime date="2020-07-15T09:17:00-04:00" />; const App = () => <WaRelativeTime date="2020-07-15T09:17:00-04:00" />;
``` ```
The `date` attribute determines when the date/time is calculated from. It must be a string that [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse) can interpret or a [`Date`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) object set via JavaScript. The `date` attribute determines when the date/time is calculated from. It must be a string that [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse) can interpret or a [`Date`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) object set via JavaScript.
@@ -32,23 +32,23 @@ Use the `sync` attribute to update the displayed value automatically as time pas
```html:preview ```html:preview
<div class="relative-time-sync"> <div class="relative-time-sync">
<sl-relative-time sync></sl-relative-time> <wa-relative-time sync></wa-relative-time>
</div> </div>
<script> <script>
const container = document.querySelector('.relative-time-sync'); const container = document.querySelector('.relative-time-sync');
const relativeTime = container.querySelector('sl-relative-time'); const relativeTime = container.querySelector('wa-relative-time');
relativeTime.date = new Date(new Date().getTime() - 60000); relativeTime.date = new Date(new Date().getTime() - 60000);
</script> </script>
``` ```
```jsx:react ```jsx:react
import { SlRelativeTime } from '@shoelace-style/shoelace/dist/react'; import WaRelativeTime from '@shoelace-style/shoelace/dist/react/relative-time';
const date = new Date(new Date().getTime() - 60000); const date = new Date(new Date().getTime() - 60000);
const App = () => <SlRelativeTime date={date} sync />; const App = () => <WaRelativeTime date={date} sync />;
``` ```
### Formatting Styles ### Formatting Styles
@@ -56,21 +56,21 @@ const App = () => <SlRelativeTime date={date} sync />;
You can change how the time is displayed using the `format` attribute. Note that some locales may display the same values for `narrow` and `short` formats. You can change how the time is displayed using the `format` attribute. Note that some locales may display the same values for `narrow` and `short` formats.
```html:preview ```html:preview
<sl-relative-time date="2020-07-15T09:17:00-04:00" format="narrow"></sl-relative-time><br /> <wa-relative-time date="2020-07-15T09:17:00-04:00" format="narrow"></wa-relative-time><br />
<sl-relative-time date="2020-07-15T09:17:00-04:00" format="short"></sl-relative-time><br /> <wa-relative-time date="2020-07-15T09:17:00-04:00" format="short"></wa-relative-time><br />
<sl-relative-time date="2020-07-15T09:17:00-04:00" format="long"></sl-relative-time> <wa-relative-time date="2020-07-15T09:17:00-04:00" format="long"></wa-relative-time>
``` ```
```jsx:react ```jsx:react
import { SlRelativeTime } from '@shoelace-style/shoelace/dist/react'; import WaRelativeTime from '@shoelace-style/shoelace/dist/react/relative-time';
const App = () => ( const App = () => (
<> <>
<SlRelativeTime date="2020-07-15T09:17:00-04:00" format="narrow" /> <WaRelativeTime date="2020-07-15T09:17:00-04:00" format="narrow" />
<br /> <br />
<SlRelativeTime date="2020-07-15T09:17:00-04:00" format="short" /> <WaRelativeTime date="2020-07-15T09:17:00-04:00" format="short" />
<br /> <br />
<SlRelativeTime date="2020-07-15T09:17:00-04:00" format="long" /> <WaRelativeTime date="2020-07-15T09:17:00-04:00" format="long" />
</> </>
); );
``` ```
@@ -80,27 +80,27 @@ const App = () => (
Use the `lang` attribute to set the desired locale. Use the `lang` attribute to set the desired locale.
```html:preview ```html:preview
English: <sl-relative-time date="2020-07-15T09:17:00-04:00" lang="en-US"></sl-relative-time><br /> English: <wa-relative-time date="2020-07-15T09:17:00-04:00" lang="en-US"></wa-relative-time><br />
Chinese: <sl-relative-time date="2020-07-15T09:17:00-04:00" lang="zh-CN"></sl-relative-time><br /> Chinese: <wa-relative-time date="2020-07-15T09:17:00-04:00" lang="zh-CN"></wa-relative-time><br />
German: <sl-relative-time date="2020-07-15T09:17:00-04:00" lang="de"></sl-relative-time><br /> German: <wa-relative-time date="2020-07-15T09:17:00-04:00" lang="de"></wa-relative-time><br />
Greek: <sl-relative-time date="2020-07-15T09:17:00-04:00" lang="el"></sl-relative-time><br /> Greek: <wa-relative-time date="2020-07-15T09:17:00-04:00" lang="el"></wa-relative-time><br />
Russian: <sl-relative-time date="2020-07-15T09:17:00-04:00" lang="ru"></sl-relative-time> Russian: <wa-relative-time date="2020-07-15T09:17:00-04:00" lang="ru"></wa-relative-time>
``` ```
```jsx:react ```jsx:react
import { SlRelativeTime } from '@shoelace-style/shoelace/dist/react'; import WaRelativeTime from '@shoelace-style/shoelace/dist/react/relative-time';
const App = () => ( const App = () => (
<> <>
English: <SlRelativeTime date="2020-07-15T09:17:00-04:00" lang="en-US" /> English: <WaRelativeTime date="2020-07-15T09:17:00-04:00" lang="en-US" />
<br /> <br />
Chinese: <SlRelativeTime date="2020-07-15T09:17:00-04:00" lang="zh-CN" /> Chinese: <WaRelativeTime date="2020-07-15T09:17:00-04:00" lang="zh-CN" />
<br /> <br />
German: <SlRelativeTime date="2020-07-15T09:17:00-04:00" lang="de" /> German: <WaRelativeTime date="2020-07-15T09:17:00-04:00" lang="de" />
<br /> <br />
Greek: <SlRelativeTime date="2020-07-15T09:17:00-04:00" lang="el" /> Greek: <WaRelativeTime date="2020-07-15T09:17:00-04:00" lang="el" />
<br /> <br />
Russian: <SlRelativeTime date="2020-07-15T09:17:00-04:00" lang="ru" /> Russian: <WaRelativeTime date="2020-07-15T09:17:00-04:00" lang="ru" />
</> </>
); );
``` ```

View File

@@ -5,20 +5,20 @@ meta:
layout: component layout: component
--- ---
The resize observer will report changes to the dimensions of the elements it wraps through the `sl-resize` event. When emitted, a collection of [`ResizeObserverEntry`](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserverEntry) objects will be attached to `event.detail` that contains the target element and information about its dimensions. The resize observer will report changes to the dimensions of the elements it wraps through the `wa-resize` event. When emitted, a collection of [`ResizeObserverEntry`](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserverEntry) objects will be attached to `event.detail` that contains the target element and information about its dimensions.
```html:preview ```html:preview
<div class="resize-observer-overview"> <div class="resize-observer-overview">
<sl-resize-observer> <wa-resize-observer>
<div>Resize this box and watch the console 👉</div> <div>Resize this box and watch the console 👉</div>
</sl-resize-observer> </wa-resize-observer>
</div> </div>
<script> <script>
const container = document.querySelector('.resize-observer-overview'); const container = document.querySelector('.resize-observer-overview');
const resizeObserver = container.querySelector('sl-resize-observer'); const resizeObserver = container.querySelector('wa-resize-observer');
resizeObserver.addEventListener('sl-resize', event => { resizeObserver.addEventListener('wa-resize', event => {
console.log(event.detail); console.log(event.detail);
}); });
</script> </script>
@@ -26,7 +26,7 @@ The resize observer will report changes to the dimensions of the elements it wra
<style> <style>
.resize-observer-overview div { .resize-observer-overview div {
display: flex; display: flex;
border: solid 2px var(--sl-input-border-color); border: solid 2px var(--wa-color-surface-border);
align-items: center; align-items: center;
justify-content: center; justify-content: center;
text-align: center; text-align: center;
@@ -36,12 +36,12 @@ The resize observer will report changes to the dimensions of the elements it wra
``` ```
```jsx:react ```jsx:react
import { SlResizeObserver } from '@shoelace-style/shoelace/dist/react'; import WaResizeObserver from '@shoelace-style/shoelace/dist/react/resize-observer';
const css = ` const css = `
.resize-observer-overview div { .resize-observer-overview div {
display: flex; display: flex;
border: solid 2px var(--sl-input-border-color); border: solid 2px var(--wa-color-surface-border);
align-items: center; align-items: center;
justify-content: center; justify-content: center;
text-align: center; text-align: center;
@@ -52,9 +52,9 @@ const css = `
const App = () => ( const App = () => (
<> <>
<div className="resize-observer-overview"> <div className="resize-observer-overview">
<SlResizeObserver onSlResize={event => console.log(event.detail)}> <WaResizeObserver onWaResize={event => console.log(event.detail)}>
<div>Resize this box and watch the console 👉</div> <div>Resize this box and watch the console 👉</div>
</SlResizeObserver> </WaResizeObserver>
</div> </div>
<style>{css}</style> <style>{css}</style>

View File

@@ -6,28 +6,29 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-select> <wa-select>
<sl-option value="option-1">Option 1</sl-option> <wa-option value="option-1">Option 1</wa-option>
<sl-option value="option-2">Option 2</sl-option> <wa-option value="option-2">Option 2</wa-option>
<sl-option value="option-3">Option 3</sl-option> <wa-option value="option-3">Option 3</wa-option>
<sl-option value="option-4">Option 4</sl-option> <wa-option value="option-4">Option 4</wa-option>
<sl-option value="option-5">Option 5</sl-option> <wa-option value="option-5">Option 5</wa-option>
<sl-option value="option-6">Option 6</sl-option> <wa-option value="option-6">Option 6</wa-option>
</sl-select> </wa-select>
``` ```
```jsx:react ```jsx:react
import { SlOption, SlSelect } from '@shoelace-style/shoelace/dist/react'; import WaOption from '@shoelace-style/shoelace/dist/react/option';
import WaSelect from '@shoelace-style/shoelace/dist/react/select';
const App = () => ( const App = () => (
<SlSelect> <WaSelect>
<SlOption value="option-1">Option 1</SlOption> <WaOption value="option-1">Option 1</WaOption>
<SlOption value="option-2">Option 2</SlOption> <WaOption value="option-2">Option 2</WaOption>
<SlOption value="option-3">Option 3</SlOption> <WaOption value="option-3">Option 3</WaOption>
<SlOption value="option-4">Option 4</SlOption> <WaOption value="option-4">Option 4</WaOption>
<SlOption value="option-5">Option 5</SlOption> <WaOption value="option-5">Option 5</WaOption>
<SlOption value="option-6">Option 6</SlOption> <WaOption value="option-6">Option 6</WaOption>
</SlSelect> </WaSelect>
); );
``` ```
@@ -42,22 +43,23 @@ This component works with standard `<form>` elements. Please refer to the sectio
Use the `label` attribute to give the select an accessible label. For labels that contain HTML, use the `label` slot instead. Use the `label` attribute to give the select an accessible label. For labels that contain HTML, use the `label` slot instead.
```html:preview ```html:preview
<sl-select label="Select one"> <wa-select label="Select one">
<sl-option value="option-1">Option 1</sl-option> <wa-option value="option-1">Option 1</wa-option>
<sl-option value="option-2">Option 2</sl-option> <wa-option value="option-2">Option 2</wa-option>
<sl-option value="option-3">Option 3</sl-option> <wa-option value="option-3">Option 3</wa-option>
</sl-select> </wa-select>
``` ```
```jsx:react ```jsx:react
import { SlOption, SlSelect } from '@shoelace-style/shoelace/dist/react'; import WaOption from '@shoelace-style/shoelace/dist/react/option';
import WaSelect from '@shoelace-style/shoelace/dist/react/select';
const App = () => ( const App = () => (
<SlSelect label="Select one"> <WaSelect label="Select one">
<SlOption value="option-1">Option 1</SlOption> <WaOption value="option-1">Option 1</WaOption>
<SlOption value="option-2">Option 2</SlOption> <WaOption value="option-2">Option 2</WaOption>
<SlOption value="option-3">Option 3</SlOption> <WaOption value="option-3">Option 3</WaOption>
</SlSelect> </WaSelect>
); );
``` ```
@@ -66,22 +68,23 @@ const App = () => (
Add descriptive help text to a select with the `help-text` attribute. For help texts that contain HTML, use the `help-text` slot instead. 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:preview ```html:preview
<sl-select label="Experience" help-text="Please tell us your skill level."> <wa-select label="Experience" help-text="Please tell us your skill level.">
<sl-option value="1">Novice</sl-option> <wa-option value="1">Novice</wa-option>
<sl-option value="2">Intermediate</sl-option> <wa-option value="2">Intermediate</wa-option>
<sl-option value="3">Advanced</sl-option> <wa-option value="3">Advanced</wa-option>
</sl-select> </wa-select>
``` ```
```jsx:react ```jsx:react
import { SlOption, SlSelect } from '@shoelace-style/shoelace/dist/react'; import WaOption from '@shoelace-style/shoelace/dist/react/option';
import WaSelect from '@shoelace-style/shoelace/dist/react/select';
const App = () => ( const App = () => (
<SlSelect label="Experience" help-text="Please tell us your skill level."> <WaSelect label="Experience" help-text="Please tell us your skill level.">
<SlOption value="1">Novice</SlOption> <WaOption value="1">Novice</WaOption>
<SlOption value="2">Intermediate</SlOption> <WaOption value="2">Intermediate</WaOption>
<SlOption value="3">Advanced</SlOption> <WaOption value="3">Advanced</WaOption>
</SlSelect> </WaSelect>
); );
``` ```
@@ -90,22 +93,23 @@ const App = () => (
Use the `placeholder` attribute to add a placeholder. Use the `placeholder` attribute to add a placeholder.
```html:preview ```html:preview
<sl-select placeholder="Select one"> <wa-select placeholder="Select one">
<sl-option value="option-1">Option 1</sl-option> <wa-option value="option-1">Option 1</wa-option>
<sl-option value="option-2">Option 2</sl-option> <wa-option value="option-2">Option 2</wa-option>
<sl-option value="option-3">Option 3</sl-option> <wa-option value="option-3">Option 3</wa-option>
</sl-select> </wa-select>
``` ```
```jsx:react ```jsx:react
import { SlOption, SlSelect } from '@shoelace-style/shoelace/dist/react'; import WaOption from '@shoelace-style/shoelace/dist/react/option';
import WaSelect from '@shoelace-style/shoelace/dist/react/select';
const App = () => ( const App = () => (
<SlSelect placeholder="Select one"> <WaSelect placeholder="Select one">
<SlOption value="option-1">Option 1</SlOption> <WaOption value="option-1">Option 1</WaOption>
<SlOption value="option-2">Option 2</SlOption> <WaOption value="option-2">Option 2</WaOption>
<SlOption value="option-3">Option 3</SlOption> <WaOption value="option-3">Option 3</WaOption>
</SlSelect> </WaSelect>
); );
``` ```
@@ -114,22 +118,23 @@ const App = () => (
Use the `clearable` attribute to make the control clearable. The clear button only appears when an option is selected. Use the `clearable` attribute to make the control clearable. The clear button only appears when an option is selected.
```html:preview ```html:preview
<sl-select clearable value="option-1"> <wa-select clearable value="option-1">
<sl-option value="option-1">Option 1</sl-option> <wa-option value="option-1">Option 1</wa-option>
<sl-option value="option-2">Option 2</sl-option> <wa-option value="option-2">Option 2</wa-option>
<sl-option value="option-3">Option 3</sl-option> <wa-option value="option-3">Option 3</wa-option>
</sl-select> </wa-select>
``` ```
```jsx:react ```jsx:react
import { SlOption, SlSelect } from '@shoelace-style/shoelace/dist/react'; import WaOption from '@shoelace-style/shoelace/dist/react/option';
import WaSelect from '@shoelace-style/shoelace/dist/react/select';
const App = () => ( const App = () => (
<SlSelect placeholder="Clearable" clearable> <WaSelect placeholder="Clearable" clearable>
<SlOption value="option-1">Option 1</SlOption> <WaOption value="option-1">Option 1</WaOption>
<SlOption value="option-2">Option 2</SlOption> <WaOption value="option-2">Option 2</WaOption>
<SlOption value="option-3">Option 3</SlOption> <WaOption value="option-3">Option 3</WaOption>
</SlSelect> </WaSelect>
); );
``` ```
@@ -138,22 +143,23 @@ const App = () => (
Add the `filled` attribute to draw a filled select. Add the `filled` attribute to draw a filled select.
```html:preview ```html:preview
<sl-select filled> <wa-select filled>
<sl-option value="option-1">Option 1</sl-option> <wa-option value="option-1">Option 1</wa-option>
<sl-option value="option-2">Option 2</sl-option> <wa-option value="option-2">Option 2</wa-option>
<sl-option value="option-3">Option 3</sl-option> <wa-option value="option-3">Option 3</wa-option>
</sl-select> </wa-select>
``` ```
```jsx:react ```jsx:react
import { SlOption, SlSelect } from '@shoelace-style/shoelace/dist/react'; import WaOption from '@shoelace-style/shoelace/dist/react/option';
import WaSelect from '@shoelace-style/shoelace/dist/react/select';
const App = () => ( const App = () => (
<SlSelect filled> <WaSelect filled>
<SlOption value="option-1">Option 1</SlOption> <WaOption value="option-1">Option 1</WaOption>
<SlOption value="option-2">Option 2</SlOption> <WaOption value="option-2">Option 2</WaOption>
<SlOption value="option-3">Option 3</SlOption> <WaOption value="option-3">Option 3</WaOption>
</SlSelect> </WaSelect>
); );
``` ```
@@ -162,22 +168,23 @@ const App = () => (
Use the `pill` attribute to give selects rounded edges. Use the `pill` attribute to give selects rounded edges.
```html:preview ```html:preview
<sl-select pill> <wa-select pill>
<sl-option value="option-1">Option 1</sl-option> <wa-option value="option-1">Option 1</wa-option>
<sl-option value="option-2">Option 2</sl-option> <wa-option value="option-2">Option 2</wa-option>
<sl-option value="option-3">Option 3</sl-option> <wa-option value="option-3">Option 3</wa-option>
</sl-select> </wa-select>
``` ```
```jsx:react ```jsx:react
import { SlOption, SlSelect } from '@shoelace-style/shoelace/dist/react'; import WaOption from '@shoelace-style/shoelace/dist/react/option';
import WaSelect from '@shoelace-style/shoelace/dist/react/select';
const App = () => ( const App = () => (
<SlSelect pill> <WaSelect pill>
<SlOption value="option-1">Option 1</SlOption> <WaOption value="option-1">Option 1</WaOption>
<SlOption value="option-2">Option 2</SlOption> <WaOption value="option-2">Option 2</WaOption>
<SlOption value="option-3">Option 3</SlOption> <WaOption value="option-3">Option 3</WaOption>
</SlSelect> </WaSelect>
); );
``` ```
@@ -186,22 +193,23 @@ const App = () => (
Use the `disabled` attribute to disable a select. Use the `disabled` attribute to disable a select.
```html:preview ```html:preview
<sl-select placeholder="Disabled" disabled> <wa-select placeholder="Disabled" disabled>
<sl-option value="option-1">Option 1</sl-option> <wa-option value="option-1">Option 1</wa-option>
<sl-option value="option-2">Option 2</sl-option> <wa-option value="option-2">Option 2</wa-option>
<sl-option value="option-3">Option 3</sl-option> <wa-option value="option-3">Option 3</wa-option>
</sl-select> </wa-select>
``` ```
```jsx:react ```jsx:react
import { SlOption, SlSelect } from '@shoelace-style/shoelace/dist/react'; import WaOption from '@shoelace-style/shoelace/dist/react/option';
import WaSelect from '@shoelace-style/shoelace/dist/react/select';
const App = () => ( const App = () => (
<SlSelect placeholder="Disabled" disabled> <WaSelect placeholder="Disabled" disabled>
<SlOption value="option-1">Option 1</SlOption> <WaOption value="option-1">Option 1</WaOption>
<SlOption value="option-2">Option 2</SlOption> <WaOption value="option-2">Option 2</WaOption>
<SlOption value="option-3">Option 3</SlOption> <WaOption value="option-3">Option 3</WaOption>
</SlSelect> </WaSelect>
); );
``` ```
@@ -210,28 +218,29 @@ const App = () => (
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. 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:preview ```html:preview
<sl-select label="Select a Few" value="option-1 option-2 option-3" multiple clearable> <wa-select label="Select a Few" value="option-1 option-2 option-3" multiple clearable>
<sl-option value="option-1">Option 1</sl-option> <wa-option value="option-1">Option 1</wa-option>
<sl-option value="option-2">Option 2</sl-option> <wa-option value="option-2">Option 2</wa-option>
<sl-option value="option-3">Option 3</sl-option> <wa-option value="option-3">Option 3</wa-option>
<sl-option value="option-4">Option 4</sl-option> <wa-option value="option-4">Option 4</wa-option>
<sl-option value="option-5">Option 5</sl-option> <wa-option value="option-5">Option 5</wa-option>
<sl-option value="option-6">Option 6</sl-option> <wa-option value="option-6">Option 6</wa-option>
</sl-select> </wa-select>
``` ```
```jsx:react ```jsx:react
import { SlOption, SlSelect } from '@shoelace-style/shoelace/dist/react'; import WaOption from '@shoelace-style/shoelace/dist/react/option';
import WaSelect from '@shoelace-style/shoelace/dist/react/select';
const App = () => ( const App = () => (
<SlSelect label="Select a Few" value="option-1 option-2 option-3" multiple clearable> <WaSelect label="Select a Few" value="option-1 option-2 option-3" multiple clearable>
<SlOption value="option-1">Option 1</SlOption> <WaOption value="option-1">Option 1</WaOption>
<SlOption value="option-2">Option 2</SlOption> <WaOption value="option-2">Option 2</WaOption>
<SlOption value="option-3">Option 3</SlOption> <WaOption value="option-3">Option 3</WaOption>
<SlOption value="option-4">Option 4</SlOption> <WaOption value="option-4">Option 4</WaOption>
<SlOption value="option-5">Option 5</SlOption> <WaOption value="option-5">Option 5</WaOption>
<SlOption value="option-6">Option 6</SlOption> <WaOption value="option-6">Option 6</WaOption>
</SlSelect> </WaSelect>
); );
``` ```
@@ -241,59 +250,64 @@ Note that multi-select options may wrap, causing the control to expand verticall
### Setting Initial Values ### Setting Initial Values
Use the `value` attribute to set the initial selection. When using `multiple`, use space-delimited values to select more than one option. 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:preview ```html:preview
<sl-select value="option-1 option-2" multiple clearable> <wa-select value="option-1 option-2" multiple clearable>
<sl-option value="option-1">Option 1</sl-option> <wa-option value="option-1">Option 1</wa-option>
<sl-option value="option-2">Option 2</sl-option> <wa-option value="option-2">Option 2</wa-option>
<sl-option value="option-3">Option 3</sl-option> <wa-option value="option-3">Option 3</wa-option>
<sl-option value="option-4">Option 4</sl-option> <wa-option value="option-4">Option 4</wa-option>
</sl-select> </wa-select>
``` ```
```jsx:react ```jsx:react
import { SlDivider, SlOption, SlSelect } from '@shoelace-style/shoelace/dist/react'; import WaDivider from '@shoelace-style/shoelace/dist/react/divider';
import WaOption from '@shoelace-style/shoelace/dist/react/option';
import WaSelect from '@shoelace-style/shoelace/dist/react/select';
const App = () => ( const App = () => (
<SlSelect value="option-1 option-2" multiple clearable> <WaSelect value="option-1 option-2" multiple clearable>
<SlOption value="option-1">Option 1</SlOption> <WaOption value="option-1">Option 1</WaOption>
<SlOption value="option-2">Option 2</SlOption> <WaOption value="option-2">Option 2</WaOption>
<SlOption value="option-3">Option 3</SlOption> <WaOption value="option-3">Option 3</WaOption>
</SlSelect> </WaSelect>
); );
``` ```
### Grouping Options ### Grouping Options
Use `<sl-divider>` to group listbox items visually. You can also use `<small>` to provide labels, but they won't be announced by most assistive devices. 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:preview ```html:preview
<sl-select> <wa-select>
<small>Section 1</small> <small>Section 1</small>
<sl-option value="option-1">Option 1</sl-option> <wa-option value="option-1">Option 1</wa-option>
<sl-option value="option-2">Option 2</sl-option> <wa-option value="option-2">Option 2</wa-option>
<sl-option value="option-3">Option 3</sl-option> <wa-option value="option-3">Option 3</wa-option>
<sl-divider></sl-divider> <wa-divider></wa-divider>
<small>Section 2</small> <small>Section 2</small>
<sl-option value="option-4">Option 4</sl-option> <wa-option value="option-4">Option 4</wa-option>
<sl-option value="option-5">Option 5</sl-option> <wa-option value="option-5">Option 5</wa-option>
<sl-option value="option-6">Option 6</sl-option> <wa-option value="option-6">Option 6</wa-option>
</sl-select> </wa-select>
``` ```
```jsx:react ```jsx:react
import { SlOption, SlSelect } from '@shoelace-style/shoelace/dist/react'; import WaOption from '@shoelace-style/shoelace/dist/react/option';
import WaSelect from '@shoelace-style/shoelace/dist/react/select';
const App = () => ( const App = () => (
<SlSelect> <WaSelect>
<SlOption value="option-1">Option 1</SlOption> <WaOption value="option-1">Option 1</WaOption>
<SlOption value="option-2">Option 2</SlOption> <WaOption value="option-2">Option 2</WaOption>
<SlOption value="option-3">Option 3</SlOption> <WaOption value="option-3">Option 3</WaOption>
<SlOption value="option-4">Option 4</SlOption> <WaOption value="option-4">Option 4</WaOption>
<SlOption value="option-5">Option 5</SlOption> <WaOption value="option-5">Option 5</WaOption>
<SlOption value="option-6">Option 6</SlOption> <WaOption value="option-6">Option 6</WaOption>
</SlSelect> </WaSelect>
); );
``` ```
@@ -302,55 +316,56 @@ const App = () => (
Use the `size` attribute to change a select's size. Note that size does not apply to listbox options. Use the `size` attribute to change a select's size. Note that size does not apply to listbox options.
```html:preview ```html:preview
<sl-select placeholder="Small" size="small"> <wa-select placeholder="Small" size="small">
<sl-option value="option-1">Option 1</sl-option> <wa-option value="option-1">Option 1</wa-option>
<sl-option value="option-2">Option 2</sl-option> <wa-option value="option-2">Option 2</wa-option>
<sl-option value="option-3">Option 3</sl-option> <wa-option value="option-3">Option 3</wa-option>
</sl-select> </wa-select>
<br /> <br />
<sl-select placeholder="Medium" size="medium"> <wa-select placeholder="Medium" size="medium">
<sl-option value="option-1">Option 1</sl-option> <wa-option value="option-1">Option 1</wa-option>
<sl-option value="option-2">Option 2</sl-option> <wa-option value="option-2">Option 2</wa-option>
<sl-option value="option-3">Option 3</sl-option> <wa-option value="option-3">Option 3</wa-option>
</sl-select> </wa-select>
<br /> <br />
<sl-select placeholder="Large" size="large"> <wa-select placeholder="Large" size="large">
<sl-option value="option-1">Option 1</sl-option> <wa-option value="option-1">Option 1</wa-option>
<sl-option value="option-2">Option 2</sl-option> <wa-option value="option-2">Option 2</wa-option>
<sl-option value="option-3">Option 3</sl-option> <wa-option value="option-3">Option 3</wa-option>
</sl-select> </wa-select>
``` ```
```jsx:react ```jsx:react
import { SlOption, SlSelect } from '@shoelace-style/shoelace/dist/react'; import WaOption from '@shoelace-style/shoelace/dist/react/option';
import WaSelect from '@shoelace-style/shoelace/dist/react/select';
const App = () => ( const App = () => (
<> <>
<SlSelect placeholder="Small" size="small"> <WaSelect placeholder="Small" size="small">
<SlOption value="option-1">Option 1</SlOption> <WaOption value="option-1">Option 1</WaOption>
<SlOption value="option-2">Option 2</SlOption> <WaOption value="option-2">Option 2</WaOption>
<SlOption value="option-3">Option 3</SlOption> <WaOption value="option-3">Option 3</WaOption>
</SlSelect> </WaSelect>
<br /> <br />
<SlSelect placeholder="Medium" size="medium"> <WaSelect placeholder="Medium" size="medium">
<SlOption value="option-1">Option 1</SlOption> <WaOption value="option-1">Option 1</WaOption>
<SlOption value="option-2">Option 2</SlOption> <WaOption value="option-2">Option 2</WaOption>
<SlOption value="option-3">Option 3</SlOption> <WaOption value="option-3">Option 3</WaOption>
</SlSelect> </WaSelect>
<br /> <br />
<SlSelect placeholder="Large" size="large"> <WaSelect placeholder="Large" size="large">
<SlOption value="option-1">Option 1</SlOption> <WaOption value="option-1">Option 1</WaOption>
<SlOption value="option-2">Option 2</SlOption> <WaOption value="option-2">Option 2</WaOption>
<SlOption value="option-3">Option 3</SlOption> <WaOption value="option-3">Option 3</WaOption>
</SlSelect> </WaSelect>
</> </>
); );
``` ```
@@ -360,25 +375,23 @@ const App = () => (
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`. 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:preview ```html:preview
<sl-select placement="top"> <wa-select placement="top">
<sl-option value="option-1">Option 1</sl-option> <wa-option value="option-1">Option 1</wa-option>
<sl-option value="option-2">Option 2</sl-option> <wa-option value="option-2">Option 2</wa-option>
<sl-option value="option-3">Option 3</sl-option> <wa-option value="option-3">Option 3</wa-option>
</sl-select> </wa-select>
``` ```
```jsx:react ```jsx:react
import { import WaOption from '@shoelace-style/shoelace/dist/react/option';
SlOption, import WaSelect from '@shoelace-style/shoelace/dist/react/select';
SlSelect
} from '@shoelace-style/shoelace/dist/react';
const App = () => ( const App = () => (
<SlSelect placement="top"> <WaSelect placement="top">
<SlOption value="option-1">Option 1</SlOption> <WaOption value="option-1">Option 1</WaOption>
<SlOption value="option-2">Option 2</SlOption> <WaOption value="option-2">Option 2</WaOption>
<SlOption value="option-3">Option 3</SlOption> <WaOption value="option-3">Option 3</WaOption>
</SlDropdown> </WaDropdown>
); );
``` ```
@@ -387,53 +400,105 @@ const App = () => (
Use the `prefix` slot to prepend an icon to the control. Use the `prefix` slot to prepend an icon to the control.
```html:preview ```html:preview
<sl-select placeholder="Small" size="small" clearable> <wa-select placeholder="Small" size="small" clearable>
<sl-icon name="house" slot="prefix"></sl-icon> <wa-icon slot="prefix" name="house" variant="solid"></wa-icon>
<sl-option value="option-1">Option 1</sl-option> <wa-option value="option-1">Option 1</wa-option>
<sl-option value="option-2">Option 2</sl-option> <wa-option value="option-2">Option 2</wa-option>
<sl-option value="option-3">Option 3</sl-option> <wa-option value="option-3">Option 3</wa-option>
</sl-select> </wa-select>
<br /> <br />
<sl-select placeholder="Medium" size="medium" clearable> <wa-select placeholder="Medium" size="medium" clearable>
<sl-icon name="house" slot="prefix"></sl-icon> <wa-icon slot="prefix" name="house" variant="solid"></wa-icon>
<sl-option value="option-1">Option 1</sl-option> <wa-option value="option-1">Option 1</wa-option>
<sl-option value="option-2">Option 2</sl-option> <wa-option value="option-2">Option 2</wa-option>
<sl-option value="option-3">Option 3</sl-option> <wa-option value="option-3">Option 3</wa-option>
</sl-select> </wa-select>
<br /> <br />
<sl-select placeholder="Large" size="large" clearable> <wa-select placeholder="Large" size="large" clearable>
<sl-icon name="house" slot="prefix"></sl-icon> <wa-icon slot="prefix" name="house" variant="solid"></wa-icon>
<sl-option value="option-1">Option 1</sl-option> <wa-option value="option-1">Option 1</wa-option>
<sl-option value="option-2">Option 2</sl-option> <wa-option value="option-2">Option 2</wa-option>
<sl-option value="option-3">Option 3</sl-option> <wa-option value="option-3">Option 3</wa-option>
</sl-select> </wa-select>
``` ```
```jsx:react ```jsx:react
import { SlIcon, SlOption, SlSelect } from '@shoelace-style/shoelace/dist/react'; import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
import WaOption from '@shoelace-style/shoelace/dist/react/option';
import WaSelect from '@shoelace-style/shoelace/dist/react/select';
const App = () => ( const App = () => (
<> <>
<SlSelect placeholder="Small" size="small"> <WaSelect placeholder="Small" size="small">
<SlIcon name="house" slot="prefix"></SlIcon> <WaIcon slot="prefix" name="house" variant="solid"></WaIcon>
<SlOption value="option-1">Option 1</SlOption> <WaOption value="option-1">Option 1</WaOption>
<SlOption value="option-2">Option 2</SlOption> <WaOption value="option-2">Option 2</WaOption>
<SlOption value="option-3">Option 3</SlOption> <WaOption value="option-3">Option 3</WaOption>
</SlSelect> </WaSelect>
<br /> <br />
<SlSelect placeholder="Medium" size="medium"> <WaSelect placeholder="Medium" size="medium">
<SlIcon name="house" slot="prefix"></SlIcon> <WaIcon slot="prefix" name="house" variant="solid"></WaIcon>
<SlOption value="option-1">Option 1</SlOption> <WaOption value="option-1">Option 1</WaOption>
<SlOption value="option-2">Option 2</SlOption> <WaOption value="option-2">Option 2</WaOption>
<SlOption value="option-3">Option 3</SlOption> <WaOption value="option-3">Option 3</WaOption>
</SlSelect> </WaSelect>
<br /> <br />
<SlSelect placeholder="Large" size="large"> <WaSelect placeholder="Large" size="large">
<SlIcon name="house" slot="prefix"></SlIcon> <WaIcon slot="prefix" name="house" variant="solid"></WaIcon>
<SlOption value="option-1">Option 1</SlOption> <WaOption value="option-1">Option 1</WaOption>
<SlOption value="option-2">Option 2</SlOption> <WaOption value="option-2">Option 2</WaOption>
<SlOption value="option-3">Option 3</SlOption> <WaOption value="option-3">Option 3</WaOption>
</SlSelect> </WaSelect>
</> </>
); );
``` ```
### 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:preview
<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.
:::

View File

@@ -12,13 +12,13 @@ Skeletons try not to be opinionated, as there are endless possibilities for desi
```html:preview ```html:preview
<div class="skeleton-overview"> <div class="skeleton-overview">
<header> <header>
<sl-skeleton></sl-skeleton> <wa-skeleton effect="sheen"></wa-skeleton>
<sl-skeleton></sl-skeleton> <wa-skeleton effect="sheen"></wa-skeleton>
</header> </header>
<sl-skeleton></sl-skeleton> <wa-skeleton effect="sheen"></wa-skeleton>
<sl-skeleton></sl-skeleton> <wa-skeleton effect="sheen"></wa-skeleton>
<sl-skeleton></sl-skeleton> <wa-skeleton effect="sheen"></wa-skeleton>
</div> </div>
<style> <style>
@@ -28,16 +28,16 @@ Skeletons try not to be opinionated, as there are endless possibilities for desi
margin-bottom: 1rem; margin-bottom: 1rem;
} }
.skeleton-overview header sl-skeleton:last-child { .skeleton-overview header wa-skeleton:last-child {
flex: 0 0 auto; flex: 0 0 auto;
width: 30%; width: 30%;
} }
.skeleton-overview sl-skeleton { .skeleton-overview wa-skeleton {
margin-bottom: 1rem; margin-bottom: 1rem;
} }
.skeleton-overview sl-skeleton:nth-child(1) { .skeleton-overview wa-skeleton:nth-child(1) {
float: left; float: left;
width: 3rem; width: 3rem;
height: 3rem; height: 3rem;
@@ -45,18 +45,18 @@ Skeletons try not to be opinionated, as there are endless possibilities for desi
vertical-align: middle; vertical-align: middle;
} }
.skeleton-overview sl-skeleton:nth-child(3) { .skeleton-overview wa-skeleton:nth-child(3) {
width: 95%; width: 95%;
} }
.skeleton-overview sl-skeleton:nth-child(4) { .skeleton-overview wa-skeleton:nth-child(4) {
width: 80%; width: 80%;
} }
</style> </style>
``` ```
```jsx:react ```jsx:react
import { SlSkeleton } from '@shoelace-style/shoelace/dist/react'; import WaSkeleton from '@shoelace-style/shoelace/dist/react/skeleton';
const css = ` const css = `
.skeleton-overview header { .skeleton-overview header {
@@ -65,16 +65,16 @@ const css = `
margin-bottom: 1rem; margin-bottom: 1rem;
} }
.skeleton-overview header sl-skeleton:last-child { .skeleton-overview header wa-skeleton:last-child {
flex: 0 0 auto; flex: 0 0 auto;
width: 30%; width: 30%;
} }
.skeleton-overview sl-skeleton { .skeleton-overview wa-skeleton {
margin-bottom: 1rem; margin-bottom: 1rem;
} }
.skeleton-overview sl-skeleton:nth-child(1) { .skeleton-overview wa-skeleton:nth-child(1) {
float: left; float: left;
width: 3rem; width: 3rem;
height: 3rem; height: 3rem;
@@ -82,11 +82,11 @@ const css = `
vertical-align: middle; vertical-align: middle;
} }
.skeleton-overview sl-skeleton:nth-child(3) { .skeleton-overview wa-skeleton:nth-child(3) {
width: 95%; width: 95%;
} }
.skeleton-overview sl-skeleton:nth-child(4) { .skeleton-overview wa-skeleton:nth-child(4) {
width: 80%; width: 80%;
} }
`; `;
@@ -95,13 +95,13 @@ const App = () => (
<> <>
<div className="skeleton-overview"> <div className="skeleton-overview">
<header> <header>
<SlSkeleton /> <WaSkeleton />
<SlSkeleton /> <WaSkeleton />
</header> </header>
<SlSkeleton /> <WaSkeleton />
<SlSkeleton /> <WaSkeleton />
<SlSkeleton /> <WaSkeleton />
</div> </div>
<style>{css}</style> <style>{css}</style>
@@ -117,36 +117,36 @@ There are two built-in effects, `sheen` and `pulse`. Effects are intentionally s
```html:preview ```html:preview
<div class="skeleton-effects"> <div class="skeleton-effects">
<sl-skeleton effect="none"></sl-skeleton> <wa-skeleton effect="none"></wa-skeleton>
None None
<sl-skeleton effect="sheen"></sl-skeleton> <wa-skeleton effect="sheen"></wa-skeleton>
Sheen Sheen
<sl-skeleton effect="pulse"></sl-skeleton> <wa-skeleton effect="pulse"></wa-skeleton>
Pulse Pulse
</div> </div>
<style> <style>
.skeleton-effects { .skeleton-effects {
font-size: var(--sl-font-size-small); font-size: var(--wa-font-size-s);
} }
.skeleton-effects sl-skeleton:not(:first-child) { .skeleton-effects wa-skeleton:not(:first-child) {
margin-top: 1rem; margin-top: 1rem;
} }
</style> </style>
``` ```
```jsx:react ```jsx:react
import { SlSkeleton } from '@shoelace-style/shoelace/dist/react'; import WaSkeleton from '@shoelace-style/shoelace/dist/react/skeleton';
const css = ` const css = `
.skeleton-effects { .skeleton-effects {
font-size: var(--sl-font-size-small); font-size: var(--wa-font-size-s);
} }
.skeleton-effects sl-skeleton:not(:first-child) { .skeleton-effects wa-skeleton:not(:first-child) {
margin-top: 1rem; margin-top: 1rem;
} }
`; `;
@@ -154,11 +154,11 @@ const css = `
const App = () => ( const App = () => (
<> <>
<div className="skeleton-effects"> <div className="skeleton-effects">
<SlSkeleton effect="none" /> <WaSkeleton effect="none" />
None None
<SlSkeleton effect="sheen" /> <WaSkeleton effect="sheen" />
Sheen Sheen
<SlSkeleton effect="pulse" /> <WaSkeleton effect="pulse" />
Pulse Pulse
</div> </div>
@@ -173,49 +173,49 @@ Use multiple skeletons and some clever styles to simulate paragraphs.
```html:preview ```html:preview
<div class="skeleton-paragraphs"> <div class="skeleton-paragraphs">
<sl-skeleton></sl-skeleton> <wa-skeleton></wa-skeleton>
<sl-skeleton></sl-skeleton> <wa-skeleton></wa-skeleton>
<sl-skeleton></sl-skeleton> <wa-skeleton></wa-skeleton>
<sl-skeleton></sl-skeleton> <wa-skeleton></wa-skeleton>
<sl-skeleton></sl-skeleton> <wa-skeleton></wa-skeleton>
</div> </div>
<style> <style>
.skeleton-paragraphs sl-skeleton { .skeleton-paragraphs wa-skeleton {
margin-bottom: 1rem; margin-bottom: 1rem;
} }
.skeleton-paragraphs sl-skeleton:nth-child(2) { .skeleton-paragraphs wa-skeleton:nth-child(2) {
width: 95%; width: 95%;
} }
.skeleton-paragraphs sl-skeleton:nth-child(4) { .skeleton-paragraphs wa-skeleton:nth-child(4) {
width: 90%; width: 90%;
} }
.skeleton-paragraphs sl-skeleton:last-child { .skeleton-paragraphs wa-skeleton:last-child {
width: 50%; width: 50%;
} }
</style> </style>
``` ```
```jsx:react ```jsx:react
import { SlSkeleton } from '@shoelace-style/shoelace/dist/react'; import WaSkeleton from '@shoelace-style/shoelace/dist/react/skeleton';
const css = ` const css = `
.skeleton-paragraphs sl-skeleton { .skeleton-paragraphs wa-skeleton {
margin-bottom: 1rem; margin-bottom: 1rem;
} }
.skeleton-paragraphs sl-skeleton:nth-child(2) { .skeleton-paragraphs wa-skeleton:nth-child(2) {
width: 95%; width: 95%;
} }
.skeleton-paragraphs sl-skeleton:nth-child(4) { .skeleton-paragraphs wa-skeleton:nth-child(4) {
width: 90%; width: 90%;
} }
.skeleton-paragraphs sl-skeleton:last-child { .skeleton-paragraphs wa-skeleton:last-child {
width: 50%; width: 50%;
} }
`; `;
@@ -223,11 +223,11 @@ const css = `
const App = () => ( const App = () => (
<> <>
<div className="skeleton-paragraphs"> <div className="skeleton-paragraphs">
<SlSkeleton /> <WaSkeleton />
<SlSkeleton /> <WaSkeleton />
<SlSkeleton /> <WaSkeleton />
<SlSkeleton /> <WaSkeleton />
<SlSkeleton /> <WaSkeleton />
</div> </div>
<style>{css}</style> <style>{css}</style>
@@ -241,55 +241,55 @@ Set a matching width and height to make a circle, square, or rounded avatar skel
```html:preview ```html:preview
<div class="skeleton-avatars"> <div class="skeleton-avatars">
<sl-skeleton></sl-skeleton> <wa-skeleton></wa-skeleton>
<sl-skeleton></sl-skeleton> <wa-skeleton></wa-skeleton>
<sl-skeleton></sl-skeleton> <wa-skeleton></wa-skeleton>
</div> </div>
<style> <style>
.skeleton-avatars sl-skeleton { .skeleton-avatars wa-skeleton {
display: inline-block; display: inline-block;
width: 3rem; width: 3rem;
height: 3rem; height: 3rem;
margin-right: 0.5rem; margin-right: 0.5rem;
} }
.skeleton-avatars sl-skeleton:nth-child(1) { .skeleton-avatars wa-skeleton:nth-child(1) {
--border-radius: 0; --border-radius: 0;
} }
.skeleton-avatars sl-skeleton:nth-child(2) { .skeleton-avatars wa-skeleton:nth-child(2) {
--border-radius: var(--sl-border-radius-medium); --border-radius: var(--wa-corners-s);
} }
</style> </style>
``` ```
```jsx:react ```jsx:react
import { SlSkeleton } from '@shoelace-style/shoelace/dist/react'; import WaSkeleton from '@shoelace-style/shoelace/dist/react/skeleton';
const css = ` const css = `
.skeleton-avatars sl-skeleton { .skeleton-avatars wa-skeleton {
display: inline-block; display: inline-block;
width: 3rem; width: 3rem;
height: 3rem; height: 3rem;
margin-right: .5rem; margin-right: .5rem;
} }
.skeleton-avatars sl-skeleton:nth-child(1) { .skeleton-avatars wa-skeleton:nth-child(1) {
--border-radius: 0; --border-radius: 0;
} }
.skeleton-avatars sl-skeleton:nth-child(2) { .skeleton-avatars wa-skeleton:nth-child(2) {
--border-radius: var(--sl-border-radius-medium); --border-radius: var(--wa-corners-s);
} }
`; `;
const App = () => ( const App = () => (
<> <>
<div className="skeleton-avatars"> <div className="skeleton-avatars">
<SlSkeleton /> <WaSkeleton />
<SlSkeleton /> <WaSkeleton />
<SlSkeleton /> <WaSkeleton />
</div> </div>
<style>{css}</style> <style>{css}</style>
@@ -303,26 +303,26 @@ Use the `--border-radius` custom property to make circles, squares, and rectangl
```html:preview ```html:preview
<div class="skeleton-shapes"> <div class="skeleton-shapes">
<sl-skeleton class="square"></sl-skeleton> <wa-skeleton class="square"></wa-skeleton>
<sl-skeleton class="circle"></sl-skeleton> <wa-skeleton class="circle"></wa-skeleton>
<sl-skeleton class="triangle"></sl-skeleton> <wa-skeleton class="triangle"></wa-skeleton>
<sl-skeleton class="cross"></sl-skeleton> <wa-skeleton class="cross"></wa-skeleton>
<sl-skeleton class="comment"></sl-skeleton> <wa-skeleton class="comment"></wa-skeleton>
</div> </div>
<style> <style>
.skeleton-shapes sl-skeleton { .skeleton-shapes wa-skeleton {
display: inline-flex; display: inline-flex;
width: 50px; width: 50px;
height: 50px; height: 50px;
} }
.skeleton-shapes .square::part(indicator) { .skeleton-shapes .square::part(indicator) {
--border-radius: var(--sl-border-radius-medium); --border-radius: var(--wa-corners-s);
} }
.skeleton-shapes .circle::part(indicator) { .skeleton-shapes .circle::part(indicator) {
--border-radius: var(--sl-border-radius-circle); --border-radius: var(--wa-corners-circle);
} }
.skeleton-shapes .triangle::part(indicator) { .skeleton-shapes .triangle::part(indicator) {
@@ -353,28 +353,28 @@ Use the `--border-radius` custom property to make circles, squares, and rectangl
clip-path: polygon(0% 0%, 100% 0%, 100% 75%, 75% 75%, 75% 100%, 50% 75%, 0% 75%); clip-path: polygon(0% 0%, 100% 0%, 100% 75%, 75% 75%, 75% 100%, 50% 75%, 0% 75%);
} }
.skeleton-shapes sl-skeleton:not(:last-child) { .skeleton-shapes wa-skeleton:not(:last-child) {
margin-right: 0.5rem; margin-right: 0.5rem;
} }
</style> </style>
``` ```
```jsx:react ```jsx:react
import { SlSkeleton } from '@shoelace-style/shoelace/dist/react'; import WaSkeleton from '@shoelace-style/shoelace/dist/react/skeleton';
const css = ` const css = `
.skeleton-shapes sl-skeleton { .skeleton-shapes wa-skeleton {
display: inline-flex; display: inline-flex;
width: 50px; width: 50px;
height: 50px; height: 50px;
} }
.skeleton-shapes .square::part(indicator) { .skeleton-shapes .square::part(indicator) {
--border-radius: var(--sl-border-radius-medium); --border-radius: var(--wa-corners-s);
} }
.skeleton-shapes .circle::part(indicator) { .skeleton-shapes .circle::part(indicator) {
--border-radius: var(--sl-border-radius-circle); --border-radius: var(--wa-corners-circle);
} }
.skeleton-shapes .triangle::part(indicator) { .skeleton-shapes .triangle::part(indicator) {
@@ -392,7 +392,7 @@ const css = `
clip-path: polygon(0% 0%, 100% 0%, 100% 75%, 75% 75%, 75% 100%, 50% 75%, 0% 75%); clip-path: polygon(0% 0%, 100% 0%, 100% 75%, 75% 75%, 75% 100%, 50% 75%, 0% 75%);
} }
.skeleton-shapes sl-skeleton:not(:last-child) { .skeleton-shapes wa-skeleton:not(:last-child) {
margin-right: .5rem; margin-right: .5rem;
} }
`; `;
@@ -400,11 +400,11 @@ const css = `
const App = () => ( const App = () => (
<> <>
<div className="skeleton-shapes"> <div className="skeleton-shapes">
<SlSkeleton className="square" /> <WaSkeleton className="square" />
<SlSkeleton className="circle" /> <WaSkeleton className="circle" />
<SlSkeleton className="triangle" /> <WaSkeleton className="triangle" />
<SlSkeleton className="cross" /> <WaSkeleton className="cross" />
<SlSkeleton className="comment" /> <WaSkeleton className="comment" />
</div> </div>
<style>{css}</style> <style>{css}</style>
@@ -417,32 +417,32 @@ const App = () => (
Set the `--color` and `--sheen-color` custom properties to adjust the skeleton's color. Set the `--color` and `--sheen-color` custom properties to adjust the skeleton's color.
```html:preview ```html:preview
<sl-skeleton effect="sheen" style="--color: tomato; --sheen-color: #ffb094;"></sl-skeleton> <wa-skeleton effect="sheen" style="--color: tomato; --sheen-color: #ffb094;"></wa-skeleton>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlSkeleton } from '@shoelace-style/shoelace/dist/react'; import WaSkeleton from '@shoelace-style/shoelace/dist/react/skeleton';
const css = ` const css = `
.skeleton-avatars sl-skeleton { .skeleton-avatars wa-skeleton {
display: inline-block; display: inline-block;
width: 3rem; width: 3rem;
height: 3rem; height: 3rem;
margin-right: .5rem; margin-right: .5rem;
} }
.skeleton-avatars sl-skeleton:nth-child(1) { .skeleton-avatars wa-skeleton:nth-child(1) {
--border-radius: 0; --border-radius: 0;
} }
.skeleton-avatars sl-skeleton:nth-child(2) { .skeleton-avatars wa-skeleton:nth-child(2) {
--border-radius: var(--sl-border-radius-medium); --border-radius: var(--wa-corners-s);
} }
`; `;
const App = () => <SlSkeleton effect="sheen" style={{ '--color': 'tomato', '--sheen-color': '#ffb094' }} />; const App = () => <WaSkeleton effect="sheen" style={{ '--color': 'tomato', '--sheen-color': '#ffb094' }} />;
``` ```
{% endraw %} {% endraw %}

View File

@@ -6,13 +6,13 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-spinner></sl-spinner> <wa-spinner></wa-spinner>
``` ```
```jsx:react ```jsx:react
import { SlSpinner } from '@shoelace-style/shoelace/dist/react'; import WaSpinner from '@shoelace-style/shoelace/dist/react/spinner';
const App = () => <SlSpinner />; const App = () => <WaSpinner />;
``` ```
## Examples ## Examples
@@ -22,21 +22,21 @@ const App = () => <SlSpinner />;
Spinners are sized based on the current font size. To change their size, set the `font-size` property on the spinner itself or on a parent element as shown below. Spinners are sized based on the current font size. To change their size, set the `font-size` property on the spinner itself or on a parent element as shown below.
```html:preview ```html:preview
<sl-spinner></sl-spinner> <wa-spinner></wa-spinner>
<sl-spinner style="font-size: 2rem;"></sl-spinner> <wa-spinner style="font-size: 2rem;"></wa-spinner>
<sl-spinner style="font-size: 3rem;"></sl-spinner> <wa-spinner style="font-size: 3rem;"></wa-spinner>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlSpinner } from '@shoelace-style/shoelace/dist/react'; import WaSpinner from '@shoelace-style/shoelace/dist/react/spinner';
const App = () => ( const App = () => (
<> <>
<SlSpinner /> <WaSpinner />
<SlSpinner style={{ fontSize: '2rem' }} /> <WaSpinner style={{ fontSize: '2rem' }} />
<SlSpinner style={{ fontSize: '3rem' }} /> <WaSpinner style={{ fontSize: '3rem' }} />
</> </>
); );
``` ```
@@ -48,16 +48,16 @@ const App = () => (
The width of the spinner's track can be changed by setting the `--track-width` custom property. The width of the spinner's track can be changed by setting the `--track-width` custom property.
```html:preview ```html:preview
<sl-spinner style="font-size: 50px; --track-width: 10px;"></sl-spinner> <wa-spinner style="font-size: 50px; --track-width: 10px;"></wa-spinner>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlSpinner } from '@shoelace-style/shoelace/dist/react'; import WaSpinner from '@shoelace-style/shoelace/dist/react/spinner';
const App = () => ( const App = () => (
<SlSpinner <WaSpinner
style={{ style={{
fontSize: '3rem', fontSize: '3rem',
'--track-width': '6px' '--track-width': '6px'
@@ -73,16 +73,16 @@ const App = () => (
The spinner's colors can be changed by setting the `--indicator-color` and `--track-color` custom properties. The spinner's colors can be changed by setting the `--indicator-color` and `--track-color` custom properties.
```html:preview ```html:preview
<sl-spinner style="font-size: 3rem; --indicator-color: deeppink; --track-color: pink;"></sl-spinner> <wa-spinner style="font-size: 3rem; --indicator-color: deeppink; --track-color: pink;"></wa-spinner>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlSpinner } from '@shoelace-style/shoelace/dist/react'; import WaSpinner from '@shoelace-style/shoelace/dist/react/spinner';
const App = () => ( const App = () => (
<SlSpinner <WaSpinner
style={{ style={{
fontSize: '3rem', fontSize: '3rem',
'--indicator-color': 'deeppink', '--indicator-color': 'deeppink',

View File

@@ -6,34 +6,34 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-split-panel> <wa-split-panel>
<div <div
slot="start" slot="start"
style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="height: 200px; background: var(--wa-color-surface-lowered); display: flex; align-items: center; justify-content: center; overflow: hidden;"
> >
Start Start
</div> </div>
<div <div
slot="end" slot="end"
style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="height: 200px; background: var(--wa-color-surface-lowered); display: flex; align-items: center; justify-content: center; overflow: hidden;"
> >
End End
</div> </div>
</sl-split-panel> </wa-split-panel>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlSplitPanel } from '@shoelace-style/shoelace/dist/react'; import WaSplitPanel from '@shoelace-style/shoelace/dist/react/split-panel';
const App = () => ( const App = () => (
<SlSplitPanel> <WaSplitPanel>
<div <div
slot="start" slot="start"
style={{ style={{
height: '200px', height: '200px',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -45,7 +45,7 @@ const App = () => (
slot="end" slot="end"
style={{ style={{
height: '200px', height: '200px',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -53,7 +53,7 @@ const App = () => (
> >
End End
</div> </div>
</SlSplitPanel> </WaSplitPanel>
); );
``` ```
@@ -66,20 +66,34 @@ const App = () => (
To set the initial position, use the `position` attribute. If no position is provided, it will default to 50% of the available space. To set the initial position, use the `position` attribute. If no position is provided, it will default to 50% of the available space.
```html:preview ```html:preview
<sl-split-panel position="75"> <wa-split-panel position="75">
<div <div
slot="start" slot="start"
style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="
height: 200px;
background: var(--wa-color-surface-lowered);
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
"
> >
Start Start
</div> </div>
<div <div
slot="end" slot="end"
style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="
height: 200px;
background: var(--wa-color-surface-lowered);
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
"
> >
End End
</div> </div>
</sl-split-panel> </wa-split-panel>
``` ```
### Initial Position in Pixels ### Initial Position in Pixels
@@ -87,34 +101,34 @@ To set the initial position, use the `position` attribute. If no position is pro
To set the initial position in pixels instead of a percentage, use the `position-in-pixels` attribute. To set the initial position in pixels instead of a percentage, use the `position-in-pixels` attribute.
```html:preview ```html:preview
<sl-split-panel position-in-pixels="150"> <wa-split-panel position-in-pixels="150">
<div <div
slot="start" slot="start"
style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="height: 200px; background: var(--wa-color-surface-lowered); display: flex; align-items: center; justify-content: center; overflow: hidden;"
> >
Start Start
</div> </div>
<div <div
slot="end" slot="end"
style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="height: 200px; background: var(--wa-color-surface-lowered); display: flex; align-items: center; justify-content: center; overflow: hidden;"
> >
End End
</div> </div>
</sl-split-panel> </wa-split-panel>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlSplitPanel } from '@shoelace-style/shoelace/dist/react'; import WaSplitPanel from '@shoelace-style/shoelace/dist/react/split-panel';
const App = () => ( const App = () => (
<SlSplitPanel position="200"> <WaSplitPanel position="200">
<div <div
slot="start" slot="start"
style={{ style={{
height: '200px', height: '200px',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -126,7 +140,7 @@ const App = () => (
slot="end" slot="end"
style={{ style={{
height: '200px', height: '200px',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -134,7 +148,7 @@ const App = () => (
> >
End End
</div> </div>
</SlSplitPanel> </WaSplitPanel>
); );
``` ```
@@ -145,34 +159,34 @@ const App = () => (
Add the `vertical` attribute to render the split panel in a vertical orientation where the start and end panels are stacked. You also need to set a height when using the vertical orientation. Add the `vertical` attribute to render the split panel in a vertical orientation where the start and end panels are stacked. You also need to set a height when using the vertical orientation.
```html:preview ```html:preview
<sl-split-panel vertical style="height: 400px;"> <wa-split-panel vertical style="height: 400px;">
<div <div
slot="start" slot="start"
style="height: 100%; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="height: 100%; background: var(--wa-color-surface-lowered); display: flex; align-items: center; justify-content: center; overflow: hidden;"
> >
Start Start
</div> </div>
<div <div
slot="end" slot="end"
style="height: 100%; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="height: 100%; background: var(--wa-color-surface-lowered); display: flex; align-items: center; justify-content: center; overflow: hidden;"
> >
End End
</div> </div>
</sl-split-panel> </wa-split-panel>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlSplitPanel } from '@shoelace-style/shoelace/dist/react'; import WaSplitPanel from '@shoelace-style/shoelace/dist/react/split-panel';
const App = () => ( const App = () => (
<SlSplitPanel vertical style={{ height: '400px' }}> <WaSplitPanel vertical style={{ height: '400px' }}>
<div <div
slot="start" slot="start"
style={{ style={{
height: '100%', height: '100%',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -184,7 +198,7 @@ const App = () => (
slot="end" slot="end"
style={{ style={{
height: '100%', height: '100%',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -192,7 +206,7 @@ const App = () => (
> >
End End
</div> </div>
</SlSplitPanel> </WaSplitPanel>
); );
``` ```
@@ -204,20 +218,20 @@ To snap panels at specific positions while dragging, add the `snap` attribute wi
```html:preview ```html:preview
<div class="split-panel-snapping"> <div class="split-panel-snapping">
<sl-split-panel snap="100px 50%"> <wa-split-panel snap="100px 50%">
<div <div
slot="start" slot="start"
style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="height: 200px; background: var(--wa-color-surface-lowered); display: flex; align-items: center; justify-content: center; overflow: hidden;"
> >
Start Start
</div> </div>
<div <div
slot="end" slot="end"
style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="height: 200px; background: var(--wa-color-surface-lowered); display: flex; align-items: center; justify-content: center; overflow: hidden;"
> >
End End
</div> </div>
</sl-split-panel> </wa-split-panel>
<div class="split-panel-snapping-dots"></div> <div class="split-panel-snapping-dots"></div>
</div> </div>
@@ -235,7 +249,7 @@ To snap panels at specific positions while dragging, add the `snap` attribute wi
width: 6px; width: 6px;
height: 6px; height: 6px;
border-radius: 50%; border-radius: 50%;
background: var(--sl-color-neutral-400); background: var(--wa-color-neutral-spot);
transform: translateX(-3px); transform: translateX(-3px);
} }
@@ -252,7 +266,7 @@ To snap panels at specific positions while dragging, add the `snap` attribute wi
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlSplitPanel } from '@shoelace-style/shoelace/dist/react'; import WaSplitPanel from '@shoelace-style/shoelace/dist/react/split-panel';
const css = ` const css = `
.split-panel-snapping { .split-panel-snapping {
@@ -267,7 +281,7 @@ const css = `
width: 6px; width: 6px;
height: 6px; height: 6px;
border-radius: 50%; border-radius: 50%;
background: var(--sl-color-neutral-400); background: var(--wa-color-neutral-spot);
transform: translateX(-3px); transform: translateX(-3px);
} }
@@ -283,12 +297,12 @@ const css = `
const App = () => ( const App = () => (
<> <>
<div className="split-panel-snapping"> <div className="split-panel-snapping">
<SlSplitPanel snap="100px 50%"> <WaSplitPanel snap="100px 50%">
<div <div
slot="start" slot="start"
style={{ style={{
height: '200px', height: '200px',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -300,7 +314,7 @@ const App = () => (
slot="end" slot="end"
style={{ style={{
height: '200px', height: '200px',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -308,7 +322,7 @@ const App = () => (
> >
End End
</div> </div>
</SlSplitPanel> </WaSplitPanel>
<div className="split-panel-snapping-dots" /> <div className="split-panel-snapping-dots" />
</div> </div>
@@ -325,34 +339,34 @@ const App = () => (
Add the `disabled` attribute to prevent the divider from being repositioned. Add the `disabled` attribute to prevent the divider from being repositioned.
```html:preview ```html:preview
<sl-split-panel disabled> <wa-split-panel disabled>
<div <div
slot="start" slot="start"
style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="height: 200px; background: var(--wa-color-surface-lowered); display: flex; align-items: center; justify-content: center; overflow: hidden;"
> >
Start Start
</div> </div>
<div <div
slot="end" slot="end"
style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="height: 200px; background: var(--wa-color-surface-lowered); display: flex; align-items: center; justify-content: center; overflow: hidden;"
> >
End End
</div> </div>
</sl-split-panel> </wa-split-panel>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlSplitPanel } from '@shoelace-style/shoelace/dist/react'; import WaSplitPanel from '@shoelace-style/shoelace/dist/react/split-panel';
const App = () => ( const App = () => (
<SlSplitPanel disabled> <WaSplitPanel disabled>
<div <div
slot="start" slot="start"
style={{ style={{
height: '200px', height: '200px',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -364,7 +378,7 @@ const App = () => (
slot="end" slot="end"
style={{ style={{
height: '200px', height: '200px',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -372,7 +386,7 @@ const App = () => (
> >
End End
</div> </div>
</SlSplitPanel> </WaSplitPanel>
); );
``` ```
@@ -386,34 +400,34 @@ Try resizing the example below with each option and notice how the panels respon
```html:preview ```html:preview
<div class="split-panel-primary"> <div class="split-panel-primary">
<sl-split-panel> <wa-split-panel>
<div <div
slot="start" slot="start"
style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="height: 200px; background: var(--wa-color-surface-lowered); display: flex; align-items: center; justify-content: center; overflow: hidden;"
> >
Start Start
</div> </div>
<div <div
slot="end" slot="end"
style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="height: 200px; background: var(--wa-color-surface-lowered); display: flex; align-items: center; justify-content: center; overflow: hidden;"
> >
End End
</div> </div>
</sl-split-panel> </wa-split-panel>
<sl-select label="Primary Panel" value="" style="max-width: 200px; margin-top: 1rem;"> <wa-select label="Primary Panel" value="" style="max-width: 200px; margin-top: 1rem;">
<sl-option value="">None</sl-option> <wa-option value="">None</wa-option>
<sl-option value="start">Start</sl-option> <wa-option value="start">Start</wa-option>
<sl-option value="end">End</sl-option> <wa-option value="end">End</wa-option>
</sl-select> </wa-select>
</div> </div>
<script> <script>
const container = document.querySelector('.split-panel-primary'); const container = document.querySelector('.split-panel-primary');
const splitPanel = container.querySelector('sl-split-panel'); const splitPanel = container.querySelector('wa-split-panel');
const select = container.querySelector('sl-select'); const select = container.querySelector('wa-select');
select.addEventListener('sl-change', () => (splitPanel.primary = select.value)); select.addEventListener('wa-change', () => (splitPanel.primary = select.value));
</script> </script>
``` ```
@@ -421,19 +435,21 @@ Try resizing the example below with each option and notice how the panels respon
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlSplitPanel, SlSelect, SlMenuItem } from '@shoelace-style/shoelace/dist/react'; import WaSplitPanel from '@shoelace-style/shoelace/dist/react/split-panel';
import WaSelect from '@shoelace-style/shoelace/dist/react/select';
import WaMenuItem from '@shoelace-style/shoelace/dist/react/menu-item';
const App = () => { const App = () => {
const [primary, setPrimary] = useState(''); const [primary, setPrimary] = useState('');
return ( return (
<> <>
<SlSplitPanel primary={primary}> <WaSplitPanel primary={primary}>
<div <div
slot="start" slot="start"
style={{ style={{
height: '200px', height: '200px',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -445,7 +461,7 @@ const App = () => {
slot="end" slot="end"
style={{ style={{
height: '200px', height: '200px',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -453,18 +469,18 @@ const App = () => {
> >
End End
</div> </div>
</SlSplitPanel> </WaSplitPanel>
<SlSelect <WaSelect
label="Primary Panel" label="Primary Panel"
value={primary} value={primary}
style={{ maxWidth: '200px', marginTop: '1rem' }} style={{ maxWidth: '200px', marginTop: '1rem' }}
onSlChange={event => setPrimary(event.target.value)} onWaChange={event => setPrimary(event.target.value)}
> >
<SlMenuItem value="">None</SlMenuItem> <WaMenuItem value="">None</WaMenuItem>
<SlMenuItem value="start">Start</SlMenuItem> <WaMenuItem value="start">Start</WaMenuItem>
<SlMenuItem value="end">End</SlMenuItem> <WaMenuItem value="end">End</WaMenuItem>
</SlSelect> </WaSelect>
</> </>
); );
}; };
@@ -479,34 +495,34 @@ To set a minimum or maximum size of the primary panel, use the `--min` and `--ma
This examples demonstrates how you can ensure both panels are at least 150px using `--min`, `--max`, and the `calc()` function. This examples demonstrates how you can ensure both panels are at least 150px using `--min`, `--max`, and the `calc()` function.
```html:preview ```html:preview
<sl-split-panel style="--min: 150px; --max: calc(100% - 150px);"> <wa-split-panel style="--min: 150px; --max: calc(100% - 150px);">
<div <div
slot="start" slot="start"
style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="height: 200px; background: var(--wa-color-surface-lowered); display: flex; align-items: center; justify-content: center; overflow: hidden;"
> >
Start Start
</div> </div>
<div <div
slot="end" slot="end"
style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="height: 200px; background: var(--wa-color-surface-lowered); display: flex; align-items: center; justify-content: center; overflow: hidden;"
> >
End End
</div> </div>
</sl-split-panel> </wa-split-panel>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlSplitPanel } from '@shoelace-style/shoelace/dist/react'; import WaSplitPanel from '@shoelace-style/shoelace/dist/react/split-panel';
const App = () => ( const App = () => (
<SlSplitPanel style={{ '--min': '150px', '--max': 'calc(100% - 150px)' }}> <WaSplitPanel style={{ '--min': '150px', '--max': 'calc(100% - 150px)' }}>
<div <div
slot="start" slot="start"
style={{ style={{
height: '200px', height: '200px',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -518,7 +534,7 @@ const App = () => (
slot="end" slot="end"
style={{ style={{
height: '200px', height: '200px',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -526,7 +542,7 @@ const App = () => (
> >
End End
</div> </div>
</SlSplitPanel> </WaSplitPanel>
); );
``` ```
@@ -537,44 +553,44 @@ const App = () => (
Create complex layouts that can be repositioned independently by nesting split panels. Create complex layouts that can be repositioned independently by nesting split panels.
```html:preview ```html:preview
<sl-split-panel> <wa-split-panel>
<div <div
slot="start" slot="start"
style="height: 400px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="height: 400px; background: var(--wa-color-surface-lowered); display: flex; align-items: center; justify-content: center; overflow: hidden"
> >
Start Start
</div> </div>
<div slot="end"> <div slot="end">
<sl-split-panel vertical style="height: 400px;"> <wa-split-panel vertical style="height: 400px;">
<div <div
slot="start" slot="start"
style="height: 100%; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="height: 100%; background: var(--wa-color-surface-lowered); display: flex; align-items: center; justify-content: center; overflow: hidden"
> >
Top Top
</div> </div>
<div <div
slot="end" slot="end"
style="height: 100%; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="height: 100%; background: var(--wa-color-surface-lowered); display: flex; align-items: center; justify-content: center; overflow: hidden"
> >
Bottom Bottom
</div> </div>
</sl-split-panel> </wa-split-panel>
</div> </div>
</sl-split-panel> </wa-split-panel>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlSplitPanel } from '@shoelace-style/shoelace/dist/react'; import WaSplitPanel from '@shoelace-style/shoelace/dist/react/split-panel';
const App = () => ( const App = () => (
<SlSplitPanel> <WaSplitPanel>
<div <div
slot="start" slot="start"
style={{ style={{
height: '400px', height: '400px',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -583,12 +599,12 @@ const App = () => (
Start Start
</div> </div>
<div slot="end"> <div slot="end">
<SlSplitPanel vertical style={{ height: '400px' }}> <WaSplitPanel vertical style={{ height: '400px' }}>
<div <div
slot="start" slot="start"
style={{ style={{
height: '100%', height: '100%',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -600,7 +616,7 @@ const App = () => (
slot="end" slot="end"
style={{ style={{
height: '100%', height: '100%',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -608,9 +624,9 @@ const App = () => (
> >
End End
</div> </div>
</SlSplitPanel> </WaSplitPanel>
</div> </div>
</SlSplitPanel> </WaSplitPanel>
); );
``` ```
@@ -621,36 +637,51 @@ const App = () => (
You can target the `divider` part to apply CSS properties to the divider. To add a custom handle, slot an icon into the `divider` slot. When customizing the divider, make sure to think about focus styles for keyboard users. You can target the `divider` part to apply CSS properties to the divider. To add a custom handle, slot an icon into the `divider` slot. When customizing the divider, make sure to think about focus styles for keyboard users.
```html:preview ```html:preview
<sl-split-panel style="--divider-width: 20px;"> <wa-split-panel style="--divider-width: 20px;">
<sl-icon slot="divider" name="grip-vertical"></sl-icon> <wa-icon slot="divider" name="grip-vertical" variant="solid"></wa-icon>
<div <div
slot="start" slot="start"
style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="
height: 200px;
background: var(--wa-color-surface-lowered);
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
"
> >
Start Start
</div> </div>
<div <div
slot="end" slot="end"
style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="
height: 200px;
background: var(--wa-color-surface-lowered);
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
"
> >
End End
</div> </div>
</sl-split-panel> </wa-split-panel>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlSplitPanel, SlIcon } from '@shoelace-style/shoelace/dist/react'; import WaSplitPanel from '@shoelace-style/shoelace/dist/react/split-panel';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
const App = () => ( const App = () => (
<SlSplitPanel style={{ '--divider-width': '20px' }}> <WaSplitPanel style={{ '--divider-width': '20px' }}>
<SlIcon slot="divider" name="grip-vertical" /> <WaIcon slot="divider" name="grip-vertical" variant="solid" />
<div <div
slot="start" slot="start"
style={{ style={{
height: '200px', height: '200px',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -662,7 +693,7 @@ const App = () => (
slot="end" slot="end"
style={{ style={{
height: '200px', height: '200px',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -670,7 +701,7 @@ const App = () => (
> >
End End
</div> </div>
</SlSplitPanel> </WaSplitPanel>
); );
``` ```
@@ -680,47 +711,61 @@ Here's a more elaborate example that changes the divider's color and width and a
```html:preview ```html:preview
<div class="split-panel-divider"> <div class="split-panel-divider">
<sl-split-panel> <wa-split-panel>
<sl-icon slot="divider" name="grip-vertical"></sl-icon> <wa-icon slot="divider" name="grip-vertical" variant="solid"></wa-icon>
<div <div
slot="start" slot="start"
style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="
height: 200px;
background: var(--wa-color-surface-lowered);
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
"
> >
Start Start
</div> </div>
<div <div
slot="end" slot="end"
style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;" style="
height: 200px;
background: var(--wa-color-surface-lowered);
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
"
> >
End End
</div> </div>
</sl-split-panel> </wa-split-panel>
</div> </div>
<style> <style>
.split-panel-divider sl-split-panel { .split-panel-divider wa-split-panel {
--divider-width: 2px; --divider-width: 4px;
} }
.split-panel-divider sl-split-panel::part(divider) { .split-panel-divider wa-split-panel::part(divider) {
background-color: var(--sl-color-pink-600); background-color: var(--wa-color-red-50);
} }
.split-panel-divider sl-icon { .split-panel-divider wa-icon {
position: absolute; position: absolute;
border-radius: var(--sl-border-radius-small); border-radius: var(--wa-corners-l);
background: var(--sl-color-pink-600); background: var(--wa-color-red-50);
color: var(--sl-color-neutral-0); color: white;
padding: 0.5rem 0.125rem; padding: 0.5rem 0.25rem;
} }
.split-panel-divider sl-split-panel::part(divider):focus-visible { .split-panel-divider wa-split-panel::part(divider):focus-visible {
background-color: var(--sl-color-primary-600); background-color: var(--wa-color-blue-50);
} }
.split-panel-divider sl-split-panel:focus-within sl-icon { .split-panel-divider wa-split-panel:focus-within wa-icon {
background-color: var(--sl-color-primary-600); background-color: var(--wa-color-blue-50);
color: var(--sl-color-neutral-0); color: white;
} }
</style> </style>
``` ```
@@ -728,45 +773,46 @@ Here's a more elaborate example that changes the divider's color and width and a
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlSplitPanel, SlIcon } from '@shoelace-style/shoelace/dist/react'; import WaSplitPanel from '@shoelace-style/shoelace/dist/react/split-panel';
import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
const css = ` const css = `
.split-panel-divider sl-split-panel { .split-panel-divider wa-split-panel {
--divider-width: 2px; --divider-width: 4px;
}
.split-panel-divider wa-split-panel::part(divider) {
background-color: var(--wa-color-red-50);
} }
.split-panel-divider sl-split-panel::part(divider) { .split-panel-divider wa-icon {
background-color: var(--sl-color-pink-600);
}
.split-panel-divider sl-icon {
position: absolute; position: absolute;
border-radius: var(--sl-border-radius-small); border-radius: var(--wa-corners-xs);
background: var(--sl-color-pink-600); background: var(--wa-color-red-50);
color: var(--sl-color-neutral-0); color: white;
padding: .5rem .125rem; padding: .5rem .25rem;
} }
.split-panel-divider sl-split-panel::part(divider):focus-visible { .split-panel-divider wa-split-panel::part(divider):focus-visible {
background-color: var(--sl-color-primary-600); background-color: var(--wa-color-blue-50);
} }
.split-panel-divider sl-split-panel:focus-within sl-icon { .split-panel-divider wa-split-panel:focus-within wa-icon {
background-color: var(--sl-color-primary-600); background-color: var(--wa-color-blue-50);
color: var(--sl-color-neutral-0); color: white;
} }
`; `;
const App = () => ( const App = () => (
<> <>
<div className="split-panel-divider"> <div className="split-panel-divider">
<SlSplitPanel> <WaSplitPanel>
<SlIcon slot="divider" name="grip-vertical" /> <WaIcon slot="divider" name="grip-vertical" variant="solid" />
<div <div
slot="start" slot="start"
style={{ style={{
height: '200px', height: '200px',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -778,7 +824,7 @@ const App = () => (
slot="end" slot="end"
style={{ style={{
height: '200px', height: '200px',
background: 'var(--sl-color-neutral-50)', background: 'var(--wa-color-surface-lowered)',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
@@ -786,7 +832,7 @@ const App = () => (
> >
End End
</div> </div>
</SlSplitPanel> </WaSplitPanel>
</div> </div>
<style>{css}</style> <style>{css}</style>

View File

@@ -6,13 +6,13 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-switch>Switch</sl-switch> <wa-switch>Switch</wa-switch>
``` ```
```jsx:react ```jsx:react
import { SlSwitch } from '@shoelace-style/shoelace/dist/react'; import WaSwitch from '@shoelace-style/shoelace/dist/react/switch';
const App = () => <SlSwitch>Switch</SlSwitch>; const App = () => <WaSwitch>Switch</WaSwitch>;
``` ```
:::tip :::tip
@@ -26,13 +26,13 @@ This component works with standard `<form>` elements. Please refer to the sectio
Use the `checked` attribute to activate the switch. Use the `checked` attribute to activate the switch.
```html:preview ```html:preview
<sl-switch checked>Checked</sl-switch> <wa-switch checked>Checked</wa-switch>
``` ```
```jsx:react ```jsx:react
import { SlSwitch } from '@shoelace-style/shoelace/dist/react'; import WaSwitch from '@shoelace-style/shoelace/dist/react/switch';
const App = () => <SlSwitch checked>Checked</SlSwitch>; const App = () => <WaSwitch checked>Checked</WaSwitch>;
``` ```
### Disabled ### Disabled
@@ -40,13 +40,13 @@ const App = () => <SlSwitch checked>Checked</SlSwitch>;
Use the `disabled` attribute to disable the switch. Use the `disabled` attribute to disable the switch.
```html:preview ```html:preview
<sl-switch disabled>Disabled</sl-switch> <wa-switch disabled>Disabled</wa-switch>
``` ```
```jsx:react ```jsx:react
import { SlSwitch } from '@shoelace-style/shoelace/dist/react'; import WaSwitch from '@shoelace-style/shoelace/dist/react/switch';
const App = () => <SlSwitch disabled>Disabled</SlSwitch>; const App = () => <WaSwitch disabled>Disabled</WaSwitch>;
``` ```
### Sizes ### Sizes
@@ -54,23 +54,23 @@ const App = () => <SlSwitch disabled>Disabled</SlSwitch>;
Use the `size` attribute to change a switch's size. Use the `size` attribute to change a switch's size.
```html:preview ```html:preview
<sl-switch size="small">Small</sl-switch> <wa-switch size="small">Small</wa-switch>
<br /> <br />
<sl-switch size="medium">Medium</sl-switch> <wa-switch size="medium">Medium</wa-switch>
<br /> <br />
<sl-switch size="large">Large</sl-switch> <wa-switch size="large">Large</wa-switch>
``` ```
```jsx:react ```jsx:react
import { SlSwitch } from '@shoelace-style/shoelace/dist/react'; import WaSwitch from '@shoelace-style/shoelace/dist/react/switch';
const App = () => ( const App = () => (
<> <>
<SlSwitch size="small">Small</SlSwitch> <WaSwitch size="small">Small</WaSwitch>
<br /> <br />
<SlSwitch size="medium">Medium</SlSwitch> <WaSwitch size="medium">Medium</WaSwitch>
<br /> <br />
<SlSwitch size="large">Large</SlSwitch> <WaSwitch size="large">Large</WaSwitch>
</> </>
); );
``` ```
@@ -80,16 +80,16 @@ const App = () => (
Use the available custom properties to change how the switch is styled. Use the available custom properties to change how the switch is styled.
```html:preview ```html:preview
<sl-switch style="--width: 80px; --height: 40px; --thumb-size: 36px;">Really big</sl-switch> <wa-switch style="--width: 80px; --height: 40px; --thumb-size: 36px;">Really big</wa-switch>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlSwitch } from '@shoelace-style/shoelace/dist/react'; import WaSwitch from '@shoelace-style/shoelace/dist/react/switch';
const App = () => ( const App = () => (
<SlSwitch <WaSwitch
style={{ style={{
'--width': '80px', '--width': '80px',
'--height': '32px', '--height': '32px',

View File

@@ -8,42 +8,44 @@ layout: component
Tab groups make use of [tabs](/components/tab) and [tab panels](/components/tab-panel). Each tab must be slotted into the `nav` slot and its `panel` must refer to a tab panel of the same name. Tab groups make use of [tabs](/components/tab) and [tab panels](/components/tab-panel). Each tab must be slotted into the `nav` slot and its `panel` must refer to a tab panel of the same name.
```html:preview ```html:preview
<sl-tab-group> <wa-tab-group>
<sl-tab slot="nav" panel="general">General</sl-tab> <wa-tab slot="nav" panel="general">General</wa-tab>
<sl-tab slot="nav" panel="custom">Custom</sl-tab> <wa-tab slot="nav" panel="custom">Custom</wa-tab>
<sl-tab slot="nav" panel="advanced">Advanced</sl-tab> <wa-tab slot="nav" panel="advanced">Advanced</wa-tab>
<sl-tab slot="nav" panel="disabled" disabled>Disabled</sl-tab> <wa-tab slot="nav" panel="disabled" disabled>Disabled</wa-tab>
<sl-tab-panel name="general">This is the general tab panel.</sl-tab-panel> <wa-tab-panel name="general">This is the general tab panel.</wa-tab-panel>
<sl-tab-panel name="custom">This is the custom tab panel.</sl-tab-panel> <wa-tab-panel name="custom">This is the custom tab panel.</wa-tab-panel>
<sl-tab-panel name="advanced">This is the advanced tab panel.</sl-tab-panel> <wa-tab-panel name="advanced">This is the advanced tab panel.</wa-tab-panel>
<sl-tab-panel name="disabled">This is a disabled tab panel.</sl-tab-panel> <wa-tab-panel name="disabled">This is a disabled tab panel.</wa-tab-panel>
</sl-tab-group> </wa-tab-group>
``` ```
```jsx:react ```jsx:react
import { SlTab, SlTabGroup, SlTabPanel } from '@shoelace-style/shoelace/dist/react'; import WaTab from '@shoelace-style/shoelace/dist/react/tab';
import WaTabGroup from '@shoelace-style/shoelace/dist/react/tab-group';
import WaTabPanel from '@shoelace-style/shoelace/dist/react/tab-panel';
const App = () => ( const App = () => (
<SlTabGroup> <WaTabGroup>
<SlTab slot="nav" panel="general"> <WaTab slot="nav" panel="general">
General General
</SlTab> </WaTab>
<SlTab slot="nav" panel="custom"> <WaTab slot="nav" panel="custom">
Custom Custom
</SlTab> </WaTab>
<SlTab slot="nav" panel="advanced"> <WaTab slot="nav" panel="advanced">
Advanced Advanced
</SlTab> </WaTab>
<SlTab slot="nav" panel="disabled" disabled> <WaTab slot="nav" panel="disabled" disabled>
Disabled Disabled
</SlTab> </WaTab>
<SlTabPanel name="general">This is the general tab panel.</SlTabPanel> <WaTabPanel name="general">This is the general tab panel.</WaTabPanel>
<SlTabPanel name="custom">This is the custom tab panel.</SlTabPanel> <WaTabPanel name="custom">This is the custom tab panel.</WaTabPanel>
<SlTabPanel name="advanced">This is the advanced tab panel.</SlTabPanel> <WaTabPanel name="advanced">This is the advanced tab panel.</WaTabPanel>
<SlTabPanel name="disabled">This is a disabled tab panel.</SlTabPanel> <WaTabPanel name="disabled">This is a disabled tab panel.</WaTabPanel>
</SlTabGroup> </WaTabGroup>
); );
``` ```
@@ -54,42 +56,44 @@ const App = () => (
Tabs can be shown on the bottom by setting `placement` to `bottom`. Tabs can be shown on the bottom by setting `placement` to `bottom`.
```html:preview ```html:preview
<sl-tab-group placement="bottom"> <wa-tab-group placement="bottom">
<sl-tab slot="nav" panel="general">General</sl-tab> <wa-tab slot="nav" panel="general">General</wa-tab>
<sl-tab slot="nav" panel="custom">Custom</sl-tab> <wa-tab slot="nav" panel="custom">Custom</wa-tab>
<sl-tab slot="nav" panel="advanced">Advanced</sl-tab> <wa-tab slot="nav" panel="advanced">Advanced</wa-tab>
<sl-tab slot="nav" panel="disabled" disabled>Disabled</sl-tab> <wa-tab slot="nav" panel="disabled" disabled>Disabled</wa-tab>
<sl-tab-panel name="general">This is the general tab panel.</sl-tab-panel> <wa-tab-panel name="general">This is the general tab panel.</wa-tab-panel>
<sl-tab-panel name="custom">This is the custom tab panel.</sl-tab-panel> <wa-tab-panel name="custom">This is the custom tab panel.</wa-tab-panel>
<sl-tab-panel name="advanced">This is the advanced tab panel.</sl-tab-panel> <wa-tab-panel name="advanced">This is the advanced tab panel.</wa-tab-panel>
<sl-tab-panel name="disabled">This is a disabled tab panel.</sl-tab-panel> <wa-tab-panel name="disabled">This is a disabled tab panel.</wa-tab-panel>
</sl-tab-group> </wa-tab-group>
``` ```
```jsx:react ```jsx:react
import { SlTab, SlTabGroup, SlTabPanel } from '@shoelace-style/shoelace/dist/react'; import WaTab from '@shoelace-style/shoelace/dist/react/tab';
import WaTabGroup from '@shoelace-style/shoelace/dist/react/tab-group';
import WaTabPanel from '@shoelace-style/shoelace/dist/react/tab-panel';
const App = () => ( const App = () => (
<SlTabGroup placement="bottom"> <WaTabGroup placement="bottom">
<SlTab slot="nav" panel="general"> <WaTab slot="nav" panel="general">
General General
</SlTab> </WaTab>
<SlTab slot="nav" panel="custom"> <WaTab slot="nav" panel="custom">
Custom Custom
</SlTab> </WaTab>
<SlTab slot="nav" panel="advanced"> <WaTab slot="nav" panel="advanced">
Advanced Advanced
</SlTab> </WaTab>
<SlTab slot="nav" panel="disabled" disabled> <WaTab slot="nav" panel="disabled" disabled>
Disabled Disabled
</SlTab> </WaTab>
<SlTabPanel name="general">This is the general tab panel.</SlTabPanel> <WaTabPanel name="general">This is the general tab panel.</WaTabPanel>
<SlTabPanel name="custom">This is the custom tab panel.</SlTabPanel> <WaTabPanel name="custom">This is the custom tab panel.</WaTabPanel>
<SlTabPanel name="advanced">This is the advanced tab panel.</SlTabPanel> <WaTabPanel name="advanced">This is the advanced tab panel.</WaTabPanel>
<SlTabPanel name="disabled">This is a disabled tab panel.</SlTabPanel> <WaTabPanel name="disabled">This is a disabled tab panel.</WaTabPanel>
</SlTabGroup> </WaTabGroup>
); );
``` ```
@@ -98,42 +102,44 @@ const App = () => (
Tabs can be shown on the starting side by setting `placement` to `start`. Tabs can be shown on the starting side by setting `placement` to `start`.
```html:preview ```html:preview
<sl-tab-group placement="start"> <wa-tab-group placement="start">
<sl-tab slot="nav" panel="general">General</sl-tab> <wa-tab slot="nav" panel="general">General</wa-tab>
<sl-tab slot="nav" panel="custom">Custom</sl-tab> <wa-tab slot="nav" panel="custom">Custom</wa-tab>
<sl-tab slot="nav" panel="advanced">Advanced</sl-tab> <wa-tab slot="nav" panel="advanced">Advanced</wa-tab>
<sl-tab slot="nav" panel="disabled" disabled>Disabled</sl-tab> <wa-tab slot="nav" panel="disabled" disabled>Disabled</wa-tab>
<sl-tab-panel name="general">This is the general tab panel.</sl-tab-panel> <wa-tab-panel name="general">This is the general tab panel.</wa-tab-panel>
<sl-tab-panel name="custom">This is the custom tab panel.</sl-tab-panel> <wa-tab-panel name="custom">This is the custom tab panel.</wa-tab-panel>
<sl-tab-panel name="advanced">This is the advanced tab panel.</sl-tab-panel> <wa-tab-panel name="advanced">This is the advanced tab panel.</wa-tab-panel>
<sl-tab-panel name="disabled">This is a disabled tab panel.</sl-tab-panel> <wa-tab-panel name="disabled">This is a disabled tab panel.</wa-tab-panel>
</sl-tab-group> </wa-tab-group>
``` ```
```jsx:react ```jsx:react
import { SlTab, SlTabGroup, SlTabPanel } from '@shoelace-style/shoelace/dist/react'; import WaTab from '@shoelace-style/shoelace/dist/react/tab';
import WaTabGroup from '@shoelace-style/shoelace/dist/react/tab-group';
import WaTabPanel from '@shoelace-style/shoelace/dist/react/tab-panel';
const App = () => ( const App = () => (
<SlTabGroup placement="start"> <WaTabGroup placement="start">
<SlTab slot="nav" panel="general"> <WaTab slot="nav" panel="general">
General General
</SlTab> </WaTab>
<SlTab slot="nav" panel="custom"> <WaTab slot="nav" panel="custom">
Custom Custom
</SlTab> </WaTab>
<SlTab slot="nav" panel="advanced"> <WaTab slot="nav" panel="advanced">
Advanced Advanced
</SlTab> </WaTab>
<SlTab slot="nav" panel="disabled" disabled> <WaTab slot="nav" panel="disabled" disabled>
Disabled Disabled
</SlTab> </WaTab>
<SlTabPanel name="general">This is the general tab panel.</SlTabPanel> <WaTabPanel name="general">This is the general tab panel.</WaTabPanel>
<SlTabPanel name="custom">This is the custom tab panel.</SlTabPanel> <WaTabPanel name="custom">This is the custom tab panel.</WaTabPanel>
<SlTabPanel name="advanced">This is the advanced tab panel.</SlTabPanel> <WaTabPanel name="advanced">This is the advanced tab panel.</WaTabPanel>
<SlTabPanel name="disabled">This is a disabled tab panel.</SlTabPanel> <WaTabPanel name="disabled">This is a disabled tab panel.</WaTabPanel>
</SlTabGroup> </WaTabGroup>
); );
``` ```
@@ -142,42 +148,44 @@ const App = () => (
Tabs can be shown on the ending side by setting `placement` to `end`. Tabs can be shown on the ending side by setting `placement` to `end`.
```html:preview ```html:preview
<sl-tab-group placement="end"> <wa-tab-group placement="end">
<sl-tab slot="nav" panel="general">General</sl-tab> <wa-tab slot="nav" panel="general">General</wa-tab>
<sl-tab slot="nav" panel="custom">Custom</sl-tab> <wa-tab slot="nav" panel="custom">Custom</wa-tab>
<sl-tab slot="nav" panel="advanced">Advanced</sl-tab> <wa-tab slot="nav" panel="advanced">Advanced</wa-tab>
<sl-tab slot="nav" panel="disabled" disabled>Disabled</sl-tab> <wa-tab slot="nav" panel="disabled" disabled>Disabled</wa-tab>
<sl-tab-panel name="general">This is the general tab panel.</sl-tab-panel> <wa-tab-panel name="general">This is the general tab panel.</wa-tab-panel>
<sl-tab-panel name="custom">This is the custom tab panel.</sl-tab-panel> <wa-tab-panel name="custom">This is the custom tab panel.</wa-tab-panel>
<sl-tab-panel name="advanced">This is the advanced tab panel.</sl-tab-panel> <wa-tab-panel name="advanced">This is the advanced tab panel.</wa-tab-panel>
<sl-tab-panel name="disabled">This is a disabled tab panel.</sl-tab-panel> <wa-tab-panel name="disabled">This is a disabled tab panel.</wa-tab-panel>
</sl-tab-group> </wa-tab-group>
``` ```
```jsx:react ```jsx:react
import { SlTab, SlTabGroup, SlTabPanel } from '@shoelace-style/shoelace/dist/react'; import WaTab from '@shoelace-style/shoelace/dist/react/tab';
import WaTabGroup from '@shoelace-style/shoelace/dist/react/tab-group';
import WaTabPanel from '@shoelace-style/shoelace/dist/react/tab-panel';
const App = () => ( const App = () => (
<SlTabGroup placement="end"> <WaTabGroup placement="end">
<SlTab slot="nav" panel="general"> <WaTab slot="nav" panel="general">
General General
</SlTab> </WaTab>
<SlTab slot="nav" panel="custom"> <WaTab slot="nav" panel="custom">
Custom Custom
</SlTab> </WaTab>
<SlTab slot="nav" panel="advanced"> <WaTab slot="nav" panel="advanced">
Advanced Advanced
</SlTab> </WaTab>
<SlTab slot="nav" panel="disabled" disabled> <WaTab slot="nav" panel="disabled" disabled>
Disabled Disabled
</SlTab> </WaTab>
<SlTabPanel name="general">This is the general tab panel.</SlTabPanel> <WaTabPanel name="general">This is the general tab panel.</WaTabPanel>
<SlTabPanel name="custom">This is the custom tab panel.</SlTabPanel> <WaTabPanel name="custom">This is the custom tab panel.</WaTabPanel>
<SlTabPanel name="advanced">This is the advanced tab panel.</SlTabPanel> <WaTabPanel name="advanced">This is the advanced tab panel.</WaTabPanel>
<SlTabPanel name="disabled">This is a disabled tab panel.</SlTabPanel> <WaTabPanel name="disabled">This is a disabled tab panel.</WaTabPanel>
</SlTabGroup> </WaTabGroup>
); );
``` ```
@@ -186,24 +194,24 @@ const App = () => (
Add the `closable` attribute to a tab to show a close button. This example shows how you can dynamically remove tabs from the DOM when the close button is activated. Add the `closable` attribute to a tab to show a close button. This example shows how you can dynamically remove tabs from the DOM when the close button is activated.
```html:preview ```html:preview
<sl-tab-group class="tabs-closable"> <wa-tab-group class="tabs-closable">
<sl-tab slot="nav" panel="general">General</sl-tab> <wa-tab slot="nav" panel="general">General</wa-tab>
<sl-tab slot="nav" panel="closable-1" closable>Closable 1</sl-tab> <wa-tab slot="nav" panel="closable-1" closable>Closable 1</wa-tab>
<sl-tab slot="nav" panel="closable-2" closable>Closable 2</sl-tab> <wa-tab slot="nav" panel="closable-2" closable>Closable 2</wa-tab>
<sl-tab slot="nav" panel="closable-3" closable>Closable 3</sl-tab> <wa-tab slot="nav" panel="closable-3" closable>Closable 3</wa-tab>
<sl-tab-panel name="general">This is the general tab panel.</sl-tab-panel> <wa-tab-panel name="general">This is the general tab panel.</wa-tab-panel>
<sl-tab-panel name="closable-1">This is the first closable tab panel.</sl-tab-panel> <wa-tab-panel name="closable-1">This is the first closable tab panel.</wa-tab-panel>
<sl-tab-panel name="closable-2">This is the second closable tab panel.</sl-tab-panel> <wa-tab-panel name="closable-2">This is the second closable tab panel.</wa-tab-panel>
<sl-tab-panel name="closable-3">This is the third closable tab panel.</sl-tab-panel> <wa-tab-panel name="closable-3">This is the third closable tab panel.</wa-tab-panel>
</sl-tab-group> </wa-tab-group>
<script> <script>
const tabGroup = document.querySelector('.tabs-closable'); const tabGroup = document.querySelector('.tabs-closable');
tabGroup.addEventListener('sl-close', async event => { tabGroup.addEventListener('wa-close', async event => {
const tab = event.target; const tab = event.target;
const panel = tabGroup.querySelector(`sl-tab-panel[name="${tab.panel}"]`); const panel = tabGroup.querySelector(`wa-tab-panel[name="${tab.panel}"]`);
// Show the previous tab if the tab is currently active // Show the previous tab if the tab is currently active
if (tab.active) { if (tab.active) {
@@ -218,7 +226,9 @@ Add the `closable` attribute to a tab to show a close button. This example shows
``` ```
```jsx:react ```jsx:react
import { SlTab, SlTabGroup, SlTabPanel } from '@shoelace-style/shoelace/dist/react'; import WaTab from '@shoelace-style/shoelace/dist/react/tab';
import WaTabGroup from '@shoelace-style/shoelace/dist/react/tab-group';
import WaTabPanel from '@shoelace-style/shoelace/dist/react/tab-panel';
const App = () => { const App = () => {
function handleClose(event) { function handleClose(event) {
@@ -228,7 +238,7 @@ const App = () => {
// would significantly complicate the example. // would significantly complicate the example.
// //
const tab = event.target; const tab = event.target;
const tabGroup = tab.closest('sl-tab-group'); const tabGroup = tab.closest('wa-tab-group');
const tabPanel = tabGroup.querySelector(`[aria-labelledby="${tab.id}"]`); const tabPanel = tabGroup.querySelector(`[aria-labelledby="${tab.id}"]`);
tab.remove(); tab.remove();
@@ -236,25 +246,25 @@ const App = () => {
} }
return ( return (
<SlTabGroup className="tabs-closable" onSlClose={handleClose}> <WaTabGroup className="tabs-closable" onWaClose={handleClose}>
<SlTab slot="nav" panel="general"> <WaTab slot="nav" panel="general">
General General
</SlTab> </WaTab>
<SlTab slot="nav" panel="closable-1" closable onSlClose={handleClose}> <WaTab slot="nav" panel="closable-1" closable onWaClose={handleClose}>
Closable 1 Closable 1
</SlTab> </WaTab>
<SlTab slot="nav" panel="closable-2" closable onSlClose={handleClose}> <WaTab slot="nav" panel="closable-2" closable onWaClose={handleClose}>
Closable 2 Closable 2
</SlTab> </WaTab>
<SlTab slot="nav" panel="closable-3" closable onSlClose={handleClose}> <WaTab slot="nav" panel="closable-3" closable onWaClose={handleClose}>
Closable 3 Closable 3
</SlTab> </WaTab>
<SlTabPanel name="general">This is the general tab panel.</SlTabPanel> <WaTabPanel name="general">This is the general tab panel.</WaTabPanel>
<SlTabPanel name="closable-1">This is the first closable tab panel.</SlTabPanel> <WaTabPanel name="closable-1">This is the first closable tab panel.</WaTabPanel>
<SlTabPanel name="closable-2">This is the second closable tab panel.</SlTabPanel> <WaTabPanel name="closable-2">This is the second closable tab panel.</WaTabPanel>
<SlTabPanel name="closable-3">This is the third closable tab panel.</SlTabPanel> <WaTabPanel name="closable-3">This is the third closable tab panel.</WaTabPanel>
</SlTabGroup> </WaTabGroup>
); );
}; };
``` ```
@@ -264,138 +274,140 @@ const App = () => {
When there are more tabs than horizontal space allows, the nav will be scrollable. When there are more tabs than horizontal space allows, the nav will be scrollable.
```html:preview ```html:preview
<sl-tab-group> <wa-tab-group>
<sl-tab slot="nav" panel="tab-1">Tab 1</sl-tab> <wa-tab slot="nav" panel="tab-1">Tab 1</wa-tab>
<sl-tab slot="nav" panel="tab-2">Tab 2</sl-tab> <wa-tab slot="nav" panel="tab-2">Tab 2</wa-tab>
<sl-tab slot="nav" panel="tab-3">Tab 3</sl-tab> <wa-tab slot="nav" panel="tab-3">Tab 3</wa-tab>
<sl-tab slot="nav" panel="tab-4">Tab 4</sl-tab> <wa-tab slot="nav" panel="tab-4">Tab 4</wa-tab>
<sl-tab slot="nav" panel="tab-5">Tab 5</sl-tab> <wa-tab slot="nav" panel="tab-5">Tab 5</wa-tab>
<sl-tab slot="nav" panel="tab-6">Tab 6</sl-tab> <wa-tab slot="nav" panel="tab-6">Tab 6</wa-tab>
<sl-tab slot="nav" panel="tab-7">Tab 7</sl-tab> <wa-tab slot="nav" panel="tab-7">Tab 7</wa-tab>
<sl-tab slot="nav" panel="tab-8">Tab 8</sl-tab> <wa-tab slot="nav" panel="tab-8">Tab 8</wa-tab>
<sl-tab slot="nav" panel="tab-9">Tab 9</sl-tab> <wa-tab slot="nav" panel="tab-9">Tab 9</wa-tab>
<sl-tab slot="nav" panel="tab-10">Tab 10</sl-tab> <wa-tab slot="nav" panel="tab-10">Tab 10</wa-tab>
<sl-tab slot="nav" panel="tab-11">Tab 11</sl-tab> <wa-tab slot="nav" panel="tab-11">Tab 11</wa-tab>
<sl-tab slot="nav" panel="tab-12">Tab 12</sl-tab> <wa-tab slot="nav" panel="tab-12">Tab 12</wa-tab>
<sl-tab slot="nav" panel="tab-13">Tab 13</sl-tab> <wa-tab slot="nav" panel="tab-13">Tab 13</wa-tab>
<sl-tab slot="nav" panel="tab-14">Tab 14</sl-tab> <wa-tab slot="nav" panel="tab-14">Tab 14</wa-tab>
<sl-tab slot="nav" panel="tab-15">Tab 15</sl-tab> <wa-tab slot="nav" panel="tab-15">Tab 15</wa-tab>
<sl-tab slot="nav" panel="tab-16">Tab 16</sl-tab> <wa-tab slot="nav" panel="tab-16">Tab 16</wa-tab>
<sl-tab slot="nav" panel="tab-17">Tab 17</sl-tab> <wa-tab slot="nav" panel="tab-17">Tab 17</wa-tab>
<sl-tab slot="nav" panel="tab-18">Tab 18</sl-tab> <wa-tab slot="nav" panel="tab-18">Tab 18</wa-tab>
<sl-tab slot="nav" panel="tab-19">Tab 19</sl-tab> <wa-tab slot="nav" panel="tab-19">Tab 19</wa-tab>
<sl-tab slot="nav" panel="tab-20">Tab 20</sl-tab> <wa-tab slot="nav" panel="tab-20">Tab 20</wa-tab>
<sl-tab-panel name="tab-1">Tab panel 1</sl-tab-panel> <wa-tab-panel name="tab-1">Tab panel 1</wa-tab-panel>
<sl-tab-panel name="tab-2">Tab panel 2</sl-tab-panel> <wa-tab-panel name="tab-2">Tab panel 2</wa-tab-panel>
<sl-tab-panel name="tab-3">Tab panel 3</sl-tab-panel> <wa-tab-panel name="tab-3">Tab panel 3</wa-tab-panel>
<sl-tab-panel name="tab-4">Tab panel 4</sl-tab-panel> <wa-tab-panel name="tab-4">Tab panel 4</wa-tab-panel>
<sl-tab-panel name="tab-5">Tab panel 5</sl-tab-panel> <wa-tab-panel name="tab-5">Tab panel 5</wa-tab-panel>
<sl-tab-panel name="tab-6">Tab panel 6</sl-tab-panel> <wa-tab-panel name="tab-6">Tab panel 6</wa-tab-panel>
<sl-tab-panel name="tab-7">Tab panel 7</sl-tab-panel> <wa-tab-panel name="tab-7">Tab panel 7</wa-tab-panel>
<sl-tab-panel name="tab-8">Tab panel 8</sl-tab-panel> <wa-tab-panel name="tab-8">Tab panel 8</wa-tab-panel>
<sl-tab-panel name="tab-9">Tab panel 9</sl-tab-panel> <wa-tab-panel name="tab-9">Tab panel 9</wa-tab-panel>
<sl-tab-panel name="tab-10">Tab panel 10</sl-tab-panel> <wa-tab-panel name="tab-10">Tab panel 10</wa-tab-panel>
<sl-tab-panel name="tab-11">Tab panel 11</sl-tab-panel> <wa-tab-panel name="tab-11">Tab panel 11</wa-tab-panel>
<sl-tab-panel name="tab-12">Tab panel 12</sl-tab-panel> <wa-tab-panel name="tab-12">Tab panel 12</wa-tab-panel>
<sl-tab-panel name="tab-13">Tab panel 13</sl-tab-panel> <wa-tab-panel name="tab-13">Tab panel 13</wa-tab-panel>
<sl-tab-panel name="tab-14">Tab panel 14</sl-tab-panel> <wa-tab-panel name="tab-14">Tab panel 14</wa-tab-panel>
<sl-tab-panel name="tab-15">Tab panel 15</sl-tab-panel> <wa-tab-panel name="tab-15">Tab panel 15</wa-tab-panel>
<sl-tab-panel name="tab-16">Tab panel 16</sl-tab-panel> <wa-tab-panel name="tab-16">Tab panel 16</wa-tab-panel>
<sl-tab-panel name="tab-17">Tab panel 17</sl-tab-panel> <wa-tab-panel name="tab-17">Tab panel 17</wa-tab-panel>
<sl-tab-panel name="tab-18">Tab panel 18</sl-tab-panel> <wa-tab-panel name="tab-18">Tab panel 18</wa-tab-panel>
<sl-tab-panel name="tab-19">Tab panel 19</sl-tab-panel> <wa-tab-panel name="tab-19">Tab panel 19</wa-tab-panel>
<sl-tab-panel name="tab-20">Tab panel 20</sl-tab-panel> <wa-tab-panel name="tab-20">Tab panel 20</wa-tab-panel>
</sl-tab-group> </wa-tab-group>
``` ```
```jsx:react ```jsx:react
import { SlTab, SlTabGroup, SlTabPanel } from '@shoelace-style/shoelace/dist/react'; import WaTab from '@shoelace-style/shoelace/dist/react/tab';
import WaTabGroup from '@shoelace-style/shoelace/dist/react/tab-group';
import WaTabPanel from '@shoelace-style/shoelace/dist/react/tab-panel';
const App = () => ( const App = () => (
<SlTabGroup> <WaTabGroup>
<SlTab slot="nav" panel="tab-1"> <WaTab slot="nav" panel="tab-1">
Tab 1 Tab 1
</SlTab> </WaTab>
<SlTab slot="nav" panel="tab-2"> <WaTab slot="nav" panel="tab-2">
Tab 2 Tab 2
</SlTab> </WaTab>
<SlTab slot="nav" panel="tab-3"> <WaTab slot="nav" panel="tab-3">
Tab 3 Tab 3
</SlTab> </WaTab>
<SlTab slot="nav" panel="tab-4"> <WaTab slot="nav" panel="tab-4">
Tab 4 Tab 4
</SlTab> </WaTab>
<SlTab slot="nav" panel="tab-5"> <WaTab slot="nav" panel="tab-5">
Tab 5 Tab 5
</SlTab> </WaTab>
<SlTab slot="nav" panel="tab-6"> <WaTab slot="nav" panel="tab-6">
Tab 6 Tab 6
</SlTab> </WaTab>
<SlTab slot="nav" panel="tab-7"> <WaTab slot="nav" panel="tab-7">
Tab 7 Tab 7
</SlTab> </WaTab>
<SlTab slot="nav" panel="tab-8"> <WaTab slot="nav" panel="tab-8">
Tab 8 Tab 8
</SlTab> </WaTab>
<SlTab slot="nav" panel="tab-9"> <WaTab slot="nav" panel="tab-9">
Tab 9 Tab 9
</SlTab> </WaTab>
<SlTab slot="nav" panel="tab-10"> <WaTab slot="nav" panel="tab-10">
Tab 10 Tab 10
</SlTab> </WaTab>
<SlTab slot="nav" panel="tab-11"> <WaTab slot="nav" panel="tab-11">
Tab 11 Tab 11
</SlTab> </WaTab>
<SlTab slot="nav" panel="tab-12"> <WaTab slot="nav" panel="tab-12">
Tab 12 Tab 12
</SlTab> </WaTab>
<SlTab slot="nav" panel="tab-13"> <WaTab slot="nav" panel="tab-13">
Tab 13 Tab 13
</SlTab> </WaTab>
<SlTab slot="nav" panel="tab-14"> <WaTab slot="nav" panel="tab-14">
Tab 14 Tab 14
</SlTab> </WaTab>
<SlTab slot="nav" panel="tab-15"> <WaTab slot="nav" panel="tab-15">
Tab 15 Tab 15
</SlTab> </WaTab>
<SlTab slot="nav" panel="tab-16"> <WaTab slot="nav" panel="tab-16">
Tab 16 Tab 16
</SlTab> </WaTab>
<SlTab slot="nav" panel="tab-17"> <WaTab slot="nav" panel="tab-17">
Tab 17 Tab 17
</SlTab> </WaTab>
<SlTab slot="nav" panel="tab-18"> <WaTab slot="nav" panel="tab-18">
Tab 18 Tab 18
</SlTab> </WaTab>
<SlTab slot="nav" panel="tab-19"> <WaTab slot="nav" panel="tab-19">
Tab 19 Tab 19
</SlTab> </WaTab>
<SlTab slot="nav" panel="tab-20"> <WaTab slot="nav" panel="tab-20">
Tab 20 Tab 20
</SlTab> </WaTab>
<SlTabPanel name="tab-1">Tab panel 1</SlTabPanel> <WaTabPanel name="tab-1">Tab panel 1</WaTabPanel>
<SlTabPanel name="tab-2">Tab panel 2</SlTabPanel> <WaTabPanel name="tab-2">Tab panel 2</WaTabPanel>
<SlTabPanel name="tab-3">Tab panel 3</SlTabPanel> <WaTabPanel name="tab-3">Tab panel 3</WaTabPanel>
<SlTabPanel name="tab-4">Tab panel 4</SlTabPanel> <WaTabPanel name="tab-4">Tab panel 4</WaTabPanel>
<SlTabPanel name="tab-5">Tab panel 5</SlTabPanel> <WaTabPanel name="tab-5">Tab panel 5</WaTabPanel>
<SlTabPanel name="tab-6">Tab panel 6</SlTabPanel> <WaTabPanel name="tab-6">Tab panel 6</WaTabPanel>
<SlTabPanel name="tab-7">Tab panel 7</SlTabPanel> <WaTabPanel name="tab-7">Tab panel 7</WaTabPanel>
<SlTabPanel name="tab-8">Tab panel 8</SlTabPanel> <WaTabPanel name="tab-8">Tab panel 8</WaTabPanel>
<SlTabPanel name="tab-9">Tab panel 9</SlTabPanel> <WaTabPanel name="tab-9">Tab panel 9</WaTabPanel>
<SlTabPanel name="tab-10">Tab panel 10</SlTabPanel> <WaTabPanel name="tab-10">Tab panel 10</WaTabPanel>
<SlTabPanel name="tab-11">Tab panel 11</SlTabPanel> <WaTabPanel name="tab-11">Tab panel 11</WaTabPanel>
<SlTabPanel name="tab-12">Tab panel 12</SlTabPanel> <WaTabPanel name="tab-12">Tab panel 12</WaTabPanel>
<SlTabPanel name="tab-13">Tab panel 13</SlTabPanel> <WaTabPanel name="tab-13">Tab panel 13</WaTabPanel>
<SlTabPanel name="tab-14">Tab panel 14</SlTabPanel> <WaTabPanel name="tab-14">Tab panel 14</WaTabPanel>
<SlTabPanel name="tab-15">Tab panel 15</SlTabPanel> <WaTabPanel name="tab-15">Tab panel 15</WaTabPanel>
<SlTabPanel name="tab-16">Tab panel 16</SlTabPanel> <WaTabPanel name="tab-16">Tab panel 16</WaTabPanel>
<SlTabPanel name="tab-17">Tab panel 17</SlTabPanel> <WaTabPanel name="tab-17">Tab panel 17</WaTabPanel>
<SlTabPanel name="tab-18">Tab panel 18</SlTabPanel> <WaTabPanel name="tab-18">Tab panel 18</WaTabPanel>
<SlTabPanel name="tab-19">Tab panel 19</SlTabPanel> <WaTabPanel name="tab-19">Tab panel 19</WaTabPanel>
<SlTabPanel name="tab-20">Tab panel 20</SlTabPanel> <WaTabPanel name="tab-20">Tab panel 20</WaTabPanel>
</SlTabGroup> </WaTabGroup>
); );
``` ```
@@ -404,41 +416,43 @@ const App = () => (
When focused, keyboard users can press [[Left]] or [[Right]] to select the desired tab. By default, the corresponding tab panel will be shown immediately (automatic activation). You can change this behavior by setting `activation="manual"` which will require the user to press [[Space]] or [[Enter]] before showing the tab panel (manual activation). When focused, keyboard users can press [[Left]] or [[Right]] to select the desired tab. By default, the corresponding tab panel will be shown immediately (automatic activation). You can change this behavior by setting `activation="manual"` which will require the user to press [[Space]] or [[Enter]] before showing the tab panel (manual activation).
```html:preview ```html:preview
<sl-tab-group activation="manual"> <wa-tab-group activation="manual">
<sl-tab slot="nav" panel="general">General</sl-tab> <wa-tab slot="nav" panel="general">General</wa-tab>
<sl-tab slot="nav" panel="custom">Custom</sl-tab> <wa-tab slot="nav" panel="custom">Custom</wa-tab>
<sl-tab slot="nav" panel="advanced">Advanced</sl-tab> <wa-tab slot="nav" panel="advanced">Advanced</wa-tab>
<sl-tab slot="nav" panel="disabled" disabled>Disabled</sl-tab> <wa-tab slot="nav" panel="disabled" disabled>Disabled</wa-tab>
<sl-tab-panel name="general">This is the general tab panel.</sl-tab-panel> <wa-tab-panel name="general">This is the general tab panel.</wa-tab-panel>
<sl-tab-panel name="custom">This is the custom tab panel.</sl-tab-panel> <wa-tab-panel name="custom">This is the custom tab panel.</wa-tab-panel>
<sl-tab-panel name="advanced">This is the advanced tab panel.</sl-tab-panel> <wa-tab-panel name="advanced">This is the advanced tab panel.</wa-tab-panel>
<sl-tab-panel name="disabled">This is a disabled tab panel.</sl-tab-panel> <wa-tab-panel name="disabled">This is a disabled tab panel.</wa-tab-panel>
</sl-tab-group> </wa-tab-group>
``` ```
```jsx:react ```jsx:react
import { SlTab, SlTabGroup, SlTabPanel } from '@shoelace-style/shoelace/dist/react'; import WaTab from '@shoelace-style/shoelace/dist/react/tab';
import WaTabGroup from '@shoelace-style/shoelace/dist/react/tab-group';
import WaTabPanel from '@shoelace-style/shoelace/dist/react/tab-panel';
const App = () => ( const App = () => (
<SlTabGroup activation="manual"> <WaTabGroup activation="manual">
<SlTab slot="nav" panel="general"> <WaTab slot="nav" panel="general">
General General
</SlTab> </WaTab>
<SlTab slot="nav" panel="custom"> <WaTab slot="nav" panel="custom">
Custom Custom
</SlTab> </WaTab>
<SlTab slot="nav" panel="advanced"> <WaTab slot="nav" panel="advanced">
Advanced Advanced
</SlTab> </WaTab>
<SlTab slot="nav" panel="disabled" disabled> <WaTab slot="nav" panel="disabled" disabled>
Disabled Disabled
</SlTab> </WaTab>
<SlTabPanel name="general">This is the general tab panel.</SlTabPanel> <WaTabPanel name="general">This is the general tab panel.</WaTabPanel>
<SlTabPanel name="custom">This is the custom tab panel.</SlTabPanel> <WaTabPanel name="custom">This is the custom tab panel.</WaTabPanel>
<SlTabPanel name="advanced">This is the advanced tab panel.</SlTabPanel> <WaTabPanel name="advanced">This is the advanced tab panel.</WaTabPanel>
<SlTabPanel name="disabled">This is a disabled tab panel.</SlTabPanel> <WaTabPanel name="disabled">This is a disabled tab panel.</WaTabPanel>
</SlTabGroup> </WaTabGroup>
); );
``` ```

View File

@@ -6,42 +6,44 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-tab-group> <wa-tab-group>
<sl-tab slot="nav" panel="general">General</sl-tab> <wa-tab slot="nav" panel="general">General</wa-tab>
<sl-tab slot="nav" panel="custom">Custom</sl-tab> <wa-tab slot="nav" panel="custom">Custom</wa-tab>
<sl-tab slot="nav" panel="advanced">Advanced</sl-tab> <wa-tab slot="nav" panel="advanced">Advanced</wa-tab>
<sl-tab slot="nav" panel="disabled" disabled>Disabled</sl-tab> <wa-tab slot="nav" panel="disabled" disabled>Disabled</wa-tab>
<sl-tab-panel name="general">This is the general tab panel.</sl-tab-panel> <wa-tab-panel name="general">This is the general tab panel.</wa-tab-panel>
<sl-tab-panel name="custom">This is the custom tab panel.</sl-tab-panel> <wa-tab-panel name="custom">This is the custom tab panel.</wa-tab-panel>
<sl-tab-panel name="advanced">This is the advanced tab panel.</sl-tab-panel> <wa-tab-panel name="advanced">This is the advanced tab panel.</wa-tab-panel>
<sl-tab-panel name="disabled">This is a disabled tab panel.</sl-tab-panel> <wa-tab-panel name="disabled">This is a disabled tab panel.</wa-tab-panel>
</sl-tab-group> </wa-tab-group>
``` ```
```jsx:react ```jsx:react
import { SlTab, SlTabGroup, SlTabPanel } from '@shoelace-style/shoelace/dist/react'; import WaTab from '@shoelace-style/shoelace/dist/react/tab';
import WaTabGroup from '@shoelace-style/shoelace/dist/react/tab-group';
import WaTabPanel from '@shoelace-style/shoelace/dist/react/tab-panel';
const App = () => ( const App = () => (
<SlTabGroup> <WaTabGroup>
<SlTab slot="nav" panel="general"> <WaTab slot="nav" panel="general">
General General
</SlTab> </WaTab>
<SlTab slot="nav" panel="custom"> <WaTab slot="nav" panel="custom">
Custom Custom
</SlTab> </WaTab>
<SlTab slot="nav" panel="advanced"> <WaTab slot="nav" panel="advanced">
Advanced Advanced
</SlTab> </WaTab>
<SlTab slot="nav" panel="disabled" disabled> <WaTab slot="nav" panel="disabled" disabled>
Disabled Disabled
</SlTab> </WaTab>
<SlTabPanel name="general">This is the general tab panel.</SlTabPanel> <WaTabPanel name="general">This is the general tab panel.</WaTabPanel>
<SlTabPanel name="custom">This is the custom tab panel.</SlTabPanel> <WaTabPanel name="custom">This is the custom tab panel.</WaTabPanel>
<SlTabPanel name="advanced">This is the advanced tab panel.</SlTabPanel> <WaTabPanel name="advanced">This is the advanced tab panel.</WaTabPanel>
<SlTabPanel name="disabled">This is a disabled tab panel.</SlTabPanel> <WaTabPanel name="disabled">This is a disabled tab panel.</WaTabPanel>
</SlTabGroup> </WaTabGroup>
); );
``` ```

View File

@@ -6,21 +6,21 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-tab>Tab</sl-tab> <wa-tab>Tab</wa-tab>
<sl-tab active>Active</sl-tab> <wa-tab active>Active</wa-tab>
<sl-tab closable>Closable</sl-tab> <wa-tab closable>Closable</wa-tab>
<sl-tab disabled>Disabled</sl-tab> <wa-tab disabled>Disabled</wa-tab>
``` ```
```jsx:react ```jsx:react
import { SlTab } from '@shoelace-style/shoelace/dist/react'; import WaTab from '@shoelace-style/shoelace/dist/react/tab';
const App = () => ( const App = () => (
<> <>
<SlTab>Tab</SlTab> <WaTab>Tab</WaTab>
<SlTab active>Active</SlTab> <WaTab active>Active</WaTab>
<SlTab closable>Closable</SlTab> <WaTab closable>Closable</WaTab>
<SlTab disabled>Disabled</SlTab> <WaTab disabled>Disabled</WaTab>
</> </>
); );
``` ```

View File

@@ -6,23 +6,23 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-tag variant="primary">Primary</sl-tag> <wa-tag variant="brand">Brand</wa-tag>
<sl-tag variant="success">Success</sl-tag> <wa-tag variant="success">Success</wa-tag>
<sl-tag variant="neutral">Neutral</sl-tag> <wa-tag variant="neutral">Neutral</wa-tag>
<sl-tag variant="warning">Warning</sl-tag> <wa-tag variant="warning">Warning</wa-tag>
<sl-tag variant="danger">Danger</sl-tag> <wa-tag variant="danger">Danger</wa-tag>
``` ```
```jsx:react ```jsx:react
import { SlTag } from '@shoelace-style/shoelace/dist/react'; import WaTag from '@shoelace-style/shoelace/dist/react/tag';
const App = () => ( const App = () => (
<> <>
<SlTag variant="primary">Primary</SlTag> <WaTag variant="brand">Brand</WaTag>
<SlTag variant="success">Success</SlTag> <WaTag variant="success">Success</WaTag>
<SlTag variant="neutral">Neutral</SlTag> <WaTag variant="neutral">Neutral</WaTag>
<SlTag variant="warning">Warning</SlTag> <WaTag variant="warning">Warning</WaTag>
<SlTag variant="danger">Danger</SlTag> <WaTag variant="danger">Danger</WaTag>
</> </>
); );
``` ```
@@ -34,19 +34,19 @@ const App = () => (
Use the `size` attribute to change a tab's size. Use the `size` attribute to change a tab's size.
```html:preview ```html:preview
<sl-tag size="small">Small</sl-tag> <wa-tag size="small">Small</wa-tag>
<sl-tag size="medium">Medium</sl-tag> <wa-tag size="medium">Medium</wa-tag>
<sl-tag size="large">Large</sl-tag> <wa-tag size="large">Large</wa-tag>
``` ```
```jsx:react ```jsx:react
import { SlTag } from '@shoelace-style/shoelace/dist/react'; import WaTag from '@shoelace-style/shoelace/dist/react/tag';
const App = () => ( const App = () => (
<> <>
<SlTag size="small">Small</SlTag> <WaTag size="small">Small</WaTag>
<SlTag size="medium">Medium</SlTag> <WaTag size="medium">Medium</WaTag>
<SlTag size="large">Large</SlTag> <WaTag size="large">Large</WaTag>
</> </>
); );
``` ```
@@ -56,25 +56,25 @@ const App = () => (
Use the `pill` attribute to give tabs rounded edges. Use the `pill` attribute to give tabs rounded edges.
```html:preview ```html:preview
<sl-tag size="small" pill>Small</sl-tag> <wa-tag size="small" pill>Small</wa-tag>
<sl-tag size="medium" pill>Medium</sl-tag> <wa-tag size="medium" pill>Medium</wa-tag>
<sl-tag size="large" pill>Large</sl-tag> <wa-tag size="large" pill>Large</wa-tag>
``` ```
```jsx:react ```jsx:react
import { SlTag } from '@shoelace-style/shoelace/dist/react'; import WaTag from '@shoelace-style/shoelace/dist/react/tag';
const App = () => ( const App = () => (
<> <>
<SlTag size="small" pill> <WaTag size="small" pill>
Small Small
</SlTag> </WaTag>
<SlTag size="medium" pill> <WaTag size="medium" pill>
Medium Medium
</SlTag> </WaTag>
<SlTag size="large" pill> <WaTag size="large" pill>
Large Large
</SlTag> </WaTag>
</> </>
); );
``` ```
@@ -85,15 +85,15 @@ Use the `removable` attribute to add a remove button to the tag.
```html:preview ```html:preview
<div class="tags-removable"> <div class="tags-removable">
<sl-tag size="small" removable>Small</sl-tag> <wa-tag size="small" removable>Small</wa-tag>
<sl-tag size="medium" removable>Medium</sl-tag> <wa-tag size="medium" removable>Medium</wa-tag>
<sl-tag size="large" removable>Large</sl-tag> <wa-tag size="large" removable>Large</wa-tag>
</div> </div>
<script> <script>
const div = document.querySelector('.tags-removable'); const div = document.querySelector('.tags-removable');
div.addEventListener('sl-remove', event => { div.addEventListener('wa-remove', event => {
const tag = event.target; const tag = event.target;
tag.style.opacity = '0'; tag.style.opacity = '0';
setTimeout(() => (tag.style.opacity = '1'), 2000); setTimeout(() => (tag.style.opacity = '1'), 2000);
@@ -101,18 +101,18 @@ Use the `removable` attribute to add a remove button to the tag.
</script> </script>
<style> <style>
.tags-removable sl-tag { .tags-removable wa-tag {
transition: var(--sl-transition-medium) opacity; transition: var(--wa-transition-fast) opacity;
} }
</style> </style>
``` ```
```jsx:react ```jsx:react
import { SlTag } from '@shoelace-style/shoelace/dist/react'; import WaTag from '@shoelace-style/shoelace/dist/react/tag';
const css = ` const css = `
.tags-removable sl-tag { .tags-removable wa-tag {
transition: var(--sl-transition-medium) opacity; transition: var(--wa-transition-fast) opacity;
} }
`; `;
@@ -126,17 +126,17 @@ const App = () => {
return ( return (
<> <>
<div className="tags-removable"> <div className="tags-removable">
<SlTag size="small" removable onSlRemove={handleRemove}> <WaTag size="small" removable onWaRemove={handleRemove}>
Small Small
</SlTag> </WaTag>
<SlTag size="medium" removable onSlRemove={handleRemove}> <WaTag size="medium" removable onWaRemove={handleRemove}>
Medium Medium
</SlTag> </WaTag>
<SlTag size="large" removable onSlRemove={handleRemove}> <WaTag size="large" removable onWaRemove={handleRemove}>
Large Large
</SlTag> </WaTag>
</div> </div>
<style>{css}</style> <style>{css}</style>

View File

@@ -6,13 +6,13 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-textarea></sl-textarea> <wa-textarea></wa-textarea>
``` ```
```jsx:react ```jsx:react
import { SlTextarea } from '@shoelace-style/shoelace/dist/react'; import WaTextarea from '@shoelace-style/shoelace/dist/react/textarea';
const App = () => <SlTextarea />; const App = () => <WaTextarea />;
``` ```
:::tip :::tip
@@ -26,13 +26,13 @@ This component works with standard `<form>` elements. Please refer to the sectio
Use the `label` attribute to give the textarea an accessible label. For labels that contain HTML, use the `label` slot instead. Use the `label` attribute to give the textarea an accessible label. For labels that contain HTML, use the `label` slot instead.
```html:preview ```html:preview
<sl-textarea label="Comments"></sl-textarea> <wa-textarea label="Comments"></wa-textarea>
``` ```
```jsx:react ```jsx:react
import { SlTextarea } from '@shoelace-style/shoelace/dist/react'; import WaTextarea from '@shoelace-style/shoelace/dist/react/textarea';
const App = () => <SlTextarea label="Comments" />; const App = () => <WaTextarea label="Comments" />;
``` ```
### Help Text ### Help Text
@@ -40,13 +40,13 @@ const App = () => <SlTextarea label="Comments" />;
Add descriptive help text to a textarea with the `help-text` attribute. For help texts that contain HTML, use the `help-text` slot instead. Add descriptive help text to a textarea with the `help-text` attribute. For help texts that contain HTML, use the `help-text` slot instead.
```html:preview ```html:preview
<sl-textarea label="Feedback" help-text="Please tell us what you think."> </sl-textarea> <wa-textarea label="Feedback" help-text="Please tell us what you think."> </wa-textarea>
``` ```
```jsx:react ```jsx:react
import { SlTextarea } from '@shoelace-style/shoelace/dist/react'; import WaTextarea from '@shoelace-style/shoelace/dist/react/textarea';
const App = () => <SlTextarea label="Feedback" help-text="Please tell us what you think." />; const App = () => <WaTextarea label="Feedback" help-text="Please tell us what you think." />;
``` ```
### Rows ### Rows
@@ -54,13 +54,13 @@ const App = () => <SlTextarea label="Feedback" help-text="Please tell us what yo
Use the `rows` attribute to change the number of text rows that get shown. Use the `rows` attribute to change the number of text rows that get shown.
```html:preview ```html:preview
<sl-textarea rows="2"></sl-textarea> <wa-textarea rows="2"></wa-textarea>
``` ```
```jsx:react ```jsx:react
import { SlTextarea } from '@shoelace-style/shoelace/dist/react'; import WaTextarea from '@shoelace-style/shoelace/dist/react/textarea';
const App = () => <SlTextarea rows={2} />; const App = () => <WaTextarea rows={2} />;
``` ```
### Placeholders ### Placeholders
@@ -68,13 +68,13 @@ const App = () => <SlTextarea rows={2} />;
Use the `placeholder` attribute to add a placeholder. Use the `placeholder` attribute to add a placeholder.
```html:preview ```html:preview
<sl-textarea placeholder="Type something"></sl-textarea> <wa-textarea placeholder="Type something"></wa-textarea>
``` ```
```jsx:react ```jsx:react
import { SlTextarea } from '@shoelace-style/shoelace/dist/react'; import WaTextarea from '@shoelace-style/shoelace/dist/react/textarea';
const App = () => <SlTextarea placeholder="Type something" />; const App = () => <WaTextarea placeholder="Type something" />;
``` ```
### Filled Textareas ### Filled Textareas
@@ -82,13 +82,13 @@ const App = () => <SlTextarea placeholder="Type something" />;
Add the `filled` attribute to draw a filled textarea. Add the `filled` attribute to draw a filled textarea.
```html:preview ```html:preview
<sl-textarea placeholder="Type something" filled></sl-textarea> <wa-textarea placeholder="Type something" filled></wa-textarea>
``` ```
```jsx:react ```jsx:react
import { SlTextarea } from '@shoelace-style/shoelace/dist/react'; import WaTextarea from '@shoelace-style/shoelace/dist/react/textarea';
const App = () => <SlTextarea placeholder="Type something" filled />; const App = () => <WaTextarea placeholder="Type something" filled />;
``` ```
### Disabled ### Disabled
@@ -96,13 +96,13 @@ const App = () => <SlTextarea placeholder="Type something" filled />;
Use the `disabled` attribute to disable a textarea. Use the `disabled` attribute to disable a textarea.
```html:preview ```html:preview
<sl-textarea placeholder="Textarea" disabled></sl-textarea> <wa-textarea placeholder="Textarea" disabled></wa-textarea>
``` ```
```jsx:react ```jsx:react
import { SlTextarea } from '@shoelace-style/shoelace/dist/react'; import WaTextarea from '@shoelace-style/shoelace/dist/react/textarea';
const App = () => <SlTextarea placeholder="Textarea" disabled />; const App = () => <WaTextarea placeholder="Textarea" disabled />;
``` ```
### Sizes ### Sizes
@@ -110,23 +110,23 @@ const App = () => <SlTextarea placeholder="Textarea" disabled />;
Use the `size` attribute to change a textarea's size. Use the `size` attribute to change a textarea's size.
```html:preview ```html:preview
<sl-textarea placeholder="Small" size="small"></sl-textarea> <wa-textarea placeholder="Small" size="small"></wa-textarea>
<br /> <br />
<sl-textarea placeholder="Medium" size="medium"></sl-textarea> <wa-textarea placeholder="Medium" size="medium"></wa-textarea>
<br /> <br />
<sl-textarea placeholder="Large" size="large"></sl-textarea> <wa-textarea placeholder="Large" size="large"></wa-textarea>
``` ```
```jsx:react ```jsx:react
import { SlTextarea } from '@shoelace-style/shoelace/dist/react'; import WaTextarea from '@shoelace-style/shoelace/dist/react/textarea';
const App = () => ( const App = () => (
<> <>
<SlTextarea placeholder="Small" size="small"></SlTextarea> <WaTextarea placeholder="Small" size="small"></WaTextarea>
<br /> <br />
<SlTextarea placeholder="Medium" size="medium"></SlTextarea> <WaTextarea placeholder="Medium" size="medium"></WaTextarea>
<br /> <br />
<SlTextarea placeholder="Large" size="large"></SlTextarea> <WaTextarea placeholder="Large" size="large"></WaTextarea>
</> </>
); );
``` ```
@@ -136,13 +136,13 @@ const App = () => (
By default, textareas can be resized vertically by the user. To prevent resizing, set the `resize` attribute to `none`. By default, textareas can be resized vertically by the user. To prevent resizing, set the `resize` attribute to `none`.
```html:preview ```html:preview
<sl-textarea resize="none"></sl-textarea> <wa-textarea resize="none"></wa-textarea>
``` ```
```jsx:react ```jsx:react
import { SlTextarea } from '@shoelace-style/shoelace/dist/react'; import WaTextarea from '@shoelace-style/shoelace/dist/react/textarea';
const App = () => <SlTextarea resize="none" />; const App = () => <WaTextarea resize="none" />;
``` ```
### Expand with Content ### Expand with Content
@@ -150,11 +150,11 @@ const App = () => <SlTextarea resize="none" />;
Textareas will automatically resize to expand to fit their content when `resize` is set to `auto`. Textareas will automatically resize to expand to fit their content when `resize` is set to `auto`.
```html:preview ```html:preview
<sl-textarea resize="auto"></sl-textarea> <wa-textarea resize="auto"></wa-textarea>
``` ```
```jsx:react ```jsx:react
import { SlTextarea } from '@shoelace-style/shoelace/dist/react'; import WaTextarea from '@shoelace-style/shoelace/dist/react/textarea';
const App = () => <SlTextarea resize="auto" />; const App = () => <WaTextarea resize="auto" />;
``` ```

View File

@@ -10,18 +10,19 @@ A tooltip's target is its _first child element_, so you should only wrap one ele
Tooltips use `display: contents` so they won't interfere with how elements are positioned in a flex or grid layout. Tooltips use `display: contents` so they won't interfere with how elements are positioned in a flex or grid layout.
```html:preview ```html:preview
<sl-tooltip content="This is a tooltip"> <wa-tooltip content="This is a tooltip">
<sl-button>Hover Me</sl-button> <wa-button>Hover Me</wa-button>
</sl-tooltip> </wa-tooltip>
``` ```
```jsx:react ```jsx:react
import { SlButton, SlTooltip } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaTooltip from '@shoelace-style/shoelace/dist/react/tooltip';
const App = () => ( const App = () => (
<SlTooltip content="This is a tooltip"> <WaTooltip content="This is a tooltip">
<SlButton>Hover Me</SlButton> <WaButton>Hover Me</WaButton>
</SlTooltip> </WaTooltip>
); );
``` ```
@@ -34,61 +35,61 @@ Use the `placement` attribute to set the preferred placement of the tooltip.
```html:preview ```html:preview
<div class="tooltip-placement-example"> <div class="tooltip-placement-example">
<div class="tooltip-placement-example-row"> <div class="tooltip-placement-example-row">
<sl-tooltip content="top-start" placement="top-start"> <wa-tooltip content="top-start" placement="top-start">
<sl-button></sl-button> <wa-button></wa-button>
</sl-tooltip> </wa-tooltip>
<sl-tooltip content="top" placement="top"> <wa-tooltip content="top" placement="top">
<sl-button></sl-button> <wa-button></wa-button>
</sl-tooltip> </wa-tooltip>
<sl-tooltip content="top-end" placement="top-end"> <wa-tooltip content="top-end" placement="top-end">
<sl-button></sl-button> <wa-button></wa-button>
</sl-tooltip> </wa-tooltip>
</div> </div>
<div class="tooltip-placement-example-row"> <div class="tooltip-placement-example-row">
<sl-tooltip content="left-start" placement="left-start"> <wa-tooltip content="left-start" placement="left-start">
<sl-button></sl-button> <wa-button></wa-button>
</sl-tooltip> </wa-tooltip>
<sl-tooltip content="right-start" placement="right-start"> <wa-tooltip content="right-start" placement="right-start">
<sl-button></sl-button> <wa-button></wa-button>
</sl-tooltip> </wa-tooltip>
</div> </div>
<div class="tooltip-placement-example-row"> <div class="tooltip-placement-example-row">
<sl-tooltip content="left" placement="left"> <wa-tooltip content="left" placement="left">
<sl-button></sl-button> <wa-button></wa-button>
</sl-tooltip> </wa-tooltip>
<sl-tooltip content="right" placement="right"> <wa-tooltip content="right" placement="right">
<sl-button></sl-button> <wa-button></wa-button>
</sl-tooltip> </wa-tooltip>
</div> </div>
<div class="tooltip-placement-example-row"> <div class="tooltip-placement-example-row">
<sl-tooltip content="left-end" placement="left-end"> <wa-tooltip content="left-end" placement="left-end">
<sl-button></sl-button> <wa-button></wa-button>
</sl-tooltip> </wa-tooltip>
<sl-tooltip content="right-end" placement="right-end"> <wa-tooltip content="right-end" placement="right-end">
<sl-button></sl-button> <wa-button></wa-button>
</sl-tooltip> </wa-tooltip>
</div> </div>
<div class="tooltip-placement-example-row"> <div class="tooltip-placement-example-row">
<sl-tooltip content="bottom-start" placement="bottom-start"> <wa-tooltip content="bottom-start" placement="bottom-start">
<sl-button></sl-button> <wa-button></wa-button>
</sl-tooltip> </wa-tooltip>
<sl-tooltip content="bottom" placement="bottom"> <wa-tooltip content="bottom" placement="bottom">
<sl-button></sl-button> <wa-button></wa-button>
</sl-tooltip> </wa-tooltip>
<sl-tooltip content="bottom-end" placement="bottom-end"> <wa-tooltip content="bottom-end" placement="bottom-end">
<sl-button></sl-button> <wa-button></wa-button>
</sl-tooltip> </wa-tooltip>
</div> </div>
</div> </div>
@@ -104,28 +105,29 @@ Use the `placement` attribute to set the preferred placement of the tooltip.
clear: both; clear: both;
} }
.tooltip-placement-example sl-button { .tooltip-placement-example wa-button {
float: left; float: left;
width: 2.5rem; width: 2.5rem;
margin-right: 0.25rem; margin-right: 0.25rem;
margin-bottom: 0.25rem; margin-bottom: 0.25rem;
} }
.tooltip-placement-example-row:nth-child(1) sl-tooltip:first-child sl-button, .tooltip-placement-example-row:nth-child(1) wa-tooltip:first-child wa-button,
.tooltip-placement-example-row:nth-child(5) sl-tooltip:first-child sl-button { .tooltip-placement-example-row:nth-child(5) wa-tooltip:first-child wa-button {
margin-left: calc(40px + 0.25rem); margin-left: calc(40px + 0.25rem);
} }
.tooltip-placement-example-row:nth-child(2) sl-tooltip:nth-child(2) sl-button, .tooltip-placement-example-row:nth-child(2) wa-tooltip:nth-child(2) wa-button,
.tooltip-placement-example-row:nth-child(3) sl-tooltip:nth-child(2) sl-button, .tooltip-placement-example-row:nth-child(3) wa-tooltip:nth-child(2) wa-button,
.tooltip-placement-example-row:nth-child(4) sl-tooltip:nth-child(2) sl-button { .tooltip-placement-example-row:nth-child(4) wa-tooltip:nth-child(2) wa-button {
margin-left: calc((40px * 3) + (0.25rem * 3)); margin-left: calc((40px * 3) + (0.25rem * 3));
} }
</style> </style>
``` ```
```jsx:react ```jsx:react
import { SlButton, SlTooltip } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaTooltip from '@shoelace-style/shoelace/dist/react/tooltip';
const css = ` const css = `
.tooltip-placement-example { .tooltip-placement-example {
@@ -138,21 +140,21 @@ const css = `
clear: both; clear: both;
} }
.tooltip-placement-example sl-button { .tooltip-placement-example wa-button {
float: left; float: left;
width: 2.5rem; width: 2.5rem;
margin-right: 0.25rem; margin-right: 0.25rem;
margin-bottom: 0.25rem; margin-bottom: 0.25rem;
} }
.tooltip-placement-example-row:nth-child(1) sl-tooltip:first-child sl-button, .tooltip-placement-example-row:nth-child(1) wa-tooltip:first-child wa-button,
.tooltip-placement-example-row:nth-child(5) sl-tooltip:first-child sl-button { .tooltip-placement-example-row:nth-child(5) wa-tooltip:first-child wa-button {
margin-left: calc(40px + 0.25rem); margin-left: calc(40px + 0.25rem);
} }
.tooltip-placement-example-row:nth-child(2) sl-tooltip:nth-child(2) sl-button, .tooltip-placement-example-row:nth-child(2) wa-tooltip:nth-child(2) wa-button,
.tooltip-placement-example-row:nth-child(3) sl-tooltip:nth-child(2) sl-button, .tooltip-placement-example-row:nth-child(3) wa-tooltip:nth-child(2) wa-button,
.tooltip-placement-example-row:nth-child(4) sl-tooltip:nth-child(2) sl-button { .tooltip-placement-example-row:nth-child(4) wa-tooltip:nth-child(2) wa-button {
margin-left: calc((40px * 3) + (0.25rem * 3)); margin-left: calc((40px * 3) + (0.25rem * 3));
} }
`; `;
@@ -161,61 +163,61 @@ const App = () => (
<> <>
<div className="tooltip-placement-example"> <div className="tooltip-placement-example">
<div className="tooltip-placement-example-row"> <div className="tooltip-placement-example-row">
<SlTooltip content="top-start" placement="top-start"> <WaTooltip content="top-start" placement="top-start">
<SlButton /> <WaButton />
</SlTooltip> </WaTooltip>
<SlTooltip content="top" placement="top"> <WaTooltip content="top" placement="top">
<SlButton /> <WaButton />
</SlTooltip> </WaTooltip>
<SlTooltip content="top-end" placement="top-end"> <WaTooltip content="top-end" placement="top-end">
<SlButton /> <WaButton />
</SlTooltip> </WaTooltip>
</div> </div>
<div className="tooltip-placement-example-row"> <div className="tooltip-placement-example-row">
<SlTooltip content="left-start" placement="left-start"> <WaTooltip content="left-start" placement="left-start">
<SlButton /> <WaButton />
</SlTooltip> </WaTooltip>
<SlTooltip content="right-start" placement="right-start"> <WaTooltip content="right-start" placement="right-start">
<SlButton /> <WaButton />
</SlTooltip> </WaTooltip>
</div> </div>
<div className="tooltip-placement-example-row"> <div className="tooltip-placement-example-row">
<SlTooltip content="left" placement="left"> <WaTooltip content="left" placement="left">
<SlButton /> <WaButton />
</SlTooltip> </WaTooltip>
<SlTooltip content="right" placement="right"> <WaTooltip content="right" placement="right">
<SlButton /> <WaButton />
</SlTooltip> </WaTooltip>
</div> </div>
<div className="tooltip-placement-example-row"> <div className="tooltip-placement-example-row">
<SlTooltip content="left-end" placement="left-end"> <WaTooltip content="left-end" placement="left-end">
<SlButton /> <WaButton />
</SlTooltip> </WaTooltip>
<SlTooltip content="right-end" placement="right-end"> <WaTooltip content="right-end" placement="right-end">
<SlButton /> <WaButton />
</SlTooltip> </WaTooltip>
</div> </div>
<div className="tooltip-placement-example-row"> <div className="tooltip-placement-example-row">
<SlTooltip content="bottom-start" placement="bottom-start"> <WaTooltip content="bottom-start" placement="bottom-start">
<SlButton /> <WaButton />
</SlTooltip> </WaTooltip>
<SlTooltip content="bottom" placement="bottom"> <WaTooltip content="bottom" placement="bottom">
<SlButton /> <WaButton />
</SlTooltip> </WaTooltip>
<SlTooltip content="bottom-end" placement="bottom-end"> <WaTooltip content="bottom-end" placement="bottom-end">
<SlButton /> <WaButton />
</SlTooltip> </WaTooltip>
</div> </div>
</div> </div>
@@ -229,18 +231,19 @@ const App = () => (
Set the `trigger` attribute to `click` to toggle the tooltip on click instead of hover. Set the `trigger` attribute to `click` to toggle the tooltip on click instead of hover.
```html:preview ```html:preview
<sl-tooltip content="Click again to dismiss" trigger="click"> <wa-tooltip content="Click again to dismiss" trigger="click">
<sl-button>Click to Toggle</sl-button> <wa-button>Click to Toggle</wa-button>
</sl-tooltip> </wa-tooltip>
``` ```
```jsx:react ```jsx:react
import { SlButton, SlTooltip } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaTooltip from '@shoelace-style/shoelace/dist/react/tooltip';
const App = () => ( const App = () => (
<SlTooltip content="Click again to dismiss" trigger="click"> <WaTooltip content="Click again to dismiss" trigger="click">
<SlButton>Click to Toggle</SlButton> <WaButton>Click to Toggle</WaButton>
</SlTooltip> </WaTooltip>
); );
``` ```
@@ -249,11 +252,11 @@ const App = () => (
Tooltips can be controller programmatically by setting the `trigger` attribute to `manual`. Use the `open` attribute to control when the tooltip is shown. Tooltips can be controller programmatically by setting the `trigger` attribute to `manual`. Use the `open` attribute to control when the tooltip is shown.
```html:preview ```html:preview
<sl-button style="margin-right: 4rem;">Toggle Manually</sl-button> <wa-button style="margin-right: 4rem;">Toggle Manually</wa-button>
<sl-tooltip content="This is an avatar" trigger="manual" class="manual-tooltip"> <wa-tooltip content="This is an avatar" trigger="manual" class="manual-tooltip">
<sl-avatar label="User"></sl-avatar> <wa-avatar label="User"></wa-avatar>
</sl-tooltip> </wa-tooltip>
<script> <script>
const tooltip = document.querySelector('.manual-tooltip'); const tooltip = document.querySelector('.manual-tooltip');
@@ -267,20 +270,22 @@ Tooltips can be controller programmatically by setting the `trigger` attribute t
```jsx:react ```jsx:react
import { useState } from 'react'; import { useState } from 'react';
import { SlAvatar, SlButton, SlTooltip } from '@shoelace-style/shoelace/dist/react'; import WaAvatar from '@shoelace-style/shoelace/dist/react/avatar';
import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaTooltip from '@shoelace-style/shoelace/dist/react/tooltip';
const App = () => { const App = () => {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
return ( return (
<> <>
<SlButton style={{ marginRight: '4rem' }} onClick={() => setOpen(!open)}> <WaButton style={{ marginRight: '4rem' }} onClick={() => setOpen(!open)}>
Toggle Manually Toggle Manually
</SlButton> </WaButton>
<SlTooltip open={open} content="This is an avatar" trigger="manual"> <WaTooltip open={open} content="This is an avatar" trigger="manual">
<SlAvatar /> <WaAvatar />
</SlTooltip> </WaTooltip>
</> </>
); );
}; };
@@ -290,39 +295,40 @@ const App = () => {
### Removing Arrows ### Removing Arrows
You can control the size of tooltip arrows by overriding the `--sl-tooltip-arrow-size` design token. To remove them, set the value to `0` as shown below. You can control the size of tooltip arrows by overriding the `--wa-tooltip-arrow-size` design token. To remove them, set the value to `0` as shown below.
```html:preview ```html:preview
<sl-tooltip content="This is a tooltip" style="--sl-tooltip-arrow-size: 0;"> <wa-tooltip content="This is a tooltip" style="--wa-tooltip-arrow-size: 0;">
<sl-button>No Arrow</sl-button> <wa-button>No Arrow</wa-button>
</sl-tooltip> </wa-tooltip>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlButton, SlTooltip } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaTooltip from '@shoelace-style/shoelace/dist/react/tooltip';
const App = () => ( const App = () => (
<div style={{ '--sl-tooltip-arrow-size': '0' }}> <div style={{ '--wa-tooltip-arrow-size': '0' }}>
<SlTooltip content="This is a tooltip"> <WaTooltip content="This is a tooltip">
<SlButton>Above</SlButton> <WaButton>Above</WaButton>
</SlTooltip> </WaTooltip>
<SlTooltip content="This is a tooltip" placement="bottom"> <WaTooltip content="This is a tooltip" placement="bottom">
<SlButton>Below</SlButton> <WaButton>Below</WaButton>
</SlTooltip> </WaTooltip>
</div> </div>
); );
``` ```
{% endraw %} {% endraw %}
To override it globally, set it in a root block in your stylesheet after the Shoelace stylesheet is loaded. To override it globally, set it in a root block in your stylesheet after the Web Awesome stylesheet is loaded.
```css ```css
:root { :root {
--sl-tooltip-arrow-size: 0; --wa-tooltip-arrow-size: 0;
} }
``` ```
@@ -331,24 +337,25 @@ To override it globally, set it in a root block in your stylesheet after the Sho
Use the `content` slot to create tooltips with HTML content. Tooltips are designed only for text and presentational elements. Avoid placing interactive content, such as buttons, links, and form controls, in a tooltip. Use the `content` slot to create tooltips with HTML content. Tooltips are designed only for text and presentational elements. Avoid placing interactive content, such as buttons, links, and form controls, in a tooltip.
```html:preview ```html:preview
<sl-tooltip> <wa-tooltip>
<div slot="content">I'm not <strong>just</strong> a tooltip, I'm a <em>tooltip</em> with HTML!</div> <div slot="content">I'm not <strong>just</strong> a tooltip, I'm a <em>tooltip</em> with HTML!</div>
<sl-button>Hover me</sl-button> <wa-button>Hover me</wa-button>
</sl-tooltip> </wa-tooltip>
``` ```
```jsx:react ```jsx:react
import { SlButton, SlTooltip } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaTooltip from '@shoelace-style/shoelace/dist/react/tooltip';
const App = () => ( const App = () => (
<SlTooltip> <WaTooltip>
<div slot="content"> <div slot="content">
I'm not <strong>just</strong> a tooltip, I'm a <em>tooltip</em> with HTML! I'm not <strong>just</strong> a tooltip, I'm a <em>tooltip</em> with HTML!
</div> </div>
<SlButton>Hover Me</SlButton> <WaButton>Hover Me</WaButton>
</SlTooltip> </WaTooltip>
); );
``` ```
@@ -357,20 +364,21 @@ const App = () => (
Use the `--max-width` custom property to change the width the tooltip can grow to before wrapping occurs. Use the `--max-width` custom property to change the width the tooltip can grow to before wrapping occurs.
```html:preview ```html:preview
<sl-tooltip style="--max-width: 80px;" content="This tooltip will wrap after only 80 pixels."> <wa-tooltip style="--max-width: 80px;" content="This tooltip will wrap after only 80 pixels.">
<sl-button>Hover me</sl-button> <wa-button>Hover me</wa-button>
</sl-tooltip> </wa-tooltip>
``` ```
{% raw %} {% raw %}
```jsx:react ```jsx:react
import { SlButton, SlTooltip } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaTooltip from '@shoelace-style/shoelace/dist/react/tooltip';
const App = () => ( const App = () => (
<SlTooltip style={{ '--max-width': '80px' }} content="This tooltip will wrap after only 80 pixels."> <WaTooltip style={{ '--max-width': '80px' }} content="This tooltip will wrap after only 80 pixels.">
<SlButton>Hover Me</SlButton> <WaButton>Hover Me</WaButton>
</SlTooltip> </WaTooltip>
); );
``` ```
@@ -378,37 +386,38 @@ const App = () => (
### Hoisting ### Hoisting
Tooltips will be clipped if they're inside a container that has `overflow: auto|hidden|scroll`. The `hoist` attribute forces the tooltip to use a fixed positioning strategy, allowing it to break out of the container. In this case, the tooltip will be positioned relative to its 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. Tooltips will be clipped if they're inside a container that has `overflow: auto|hidden|scroll`. The `hoist` attribute forces the tooltip to use a fixed positioning strategy, allowing it to break out of the container. In this case, the tooltip 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:preview ```html:preview
<div class="tooltip-hoist"> <div class="tooltip-hoist">
<sl-tooltip content="This is a tooltip"> <wa-tooltip content="This is a tooltip">
<sl-button>No Hoist</sl-button> <wa-button>No Hoist</wa-button>
</sl-tooltip> </wa-tooltip>
<sl-tooltip content="This is a tooltip" hoist> <wa-tooltip content="This is a tooltip" hoist>
<sl-button>Hoist</sl-button> <wa-button>Hoist</wa-button>
</sl-tooltip> </wa-tooltip>
</div> </div>
<style> <style>
.tooltip-hoist { .tooltip-hoist {
position: relative; position: relative;
border: solid 2px var(--sl-panel-border-color); border: solid 2px var(--wa-color-surface-border);
overflow: hidden; overflow: hidden;
padding: var(--sl-spacing-medium); padding: var(--wa-space-m);
} }
</style> </style>
``` ```
```jsx:react ```jsx:react
import { SlButton, SlTooltip } from '@shoelace-style/shoelace/dist/react'; import WaButton from '@shoelace-style/shoelace/dist/react/button';
import WaTooltip from '@shoelace-style/shoelace/dist/react/tooltip';
const css = ` const css = `
.tooltip-hoist { .tooltip-hoist {
border: solid 2px var(--sl-panel-border-color); border: solid 2px var(--wa-color-surface-border);
overflow: hidden; overflow: hidden;
padding: var(--sl-spacing-medium); padding: var(--wa-space-m);
position: relative; position: relative;
} }
`; `;
@@ -416,13 +425,13 @@ const css = `
const App = () => ( const App = () => (
<> <>
<div class="tooltip-hoist"> <div class="tooltip-hoist">
<SlTooltip content="This is a tooltip"> <WaTooltip content="This is a tooltip">
<SlButton>No Hoist</SlButton> <WaButton>No Hoist</WaButton>
</SlTooltip> </WaTooltip>
<SlTooltip content="This is a tooltip" hoist> <WaTooltip content="This is a tooltip" hoist>
<SlButton>Hoist</SlButton> <WaButton>Hoist</WaButton>
</SlTooltip> </WaTooltip>
</div> </div>
<style>{css}</style> <style>{css}</style>

View File

@@ -6,33 +6,34 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-tree> <wa-tree>
<sl-tree-item> <wa-tree-item>
Item 1 Item 1
<sl-tree-item>Item A</sl-tree-item> <wa-tree-item>Item A</wa-tree-item>
<sl-tree-item>Item B</sl-tree-item> <wa-tree-item>Item B</wa-tree-item>
<sl-tree-item>Item C</sl-tree-item> <wa-tree-item>Item C</wa-tree-item>
</sl-tree-item> </wa-tree-item>
<sl-tree-item>Item 2</sl-tree-item> <wa-tree-item>Item 2</wa-tree-item>
<sl-tree-item>Item 3</sl-tree-item> <wa-tree-item>Item 3</wa-tree-item>
</sl-tree> </wa-tree>
``` ```
<!-- prettier-ignore --> <!-- prettier-ignore -->
```jsx:react ```jsx:react
import { SlTree, SlTreeItem } from '@shoelace-style/shoelace/dist/react'; import WaTree from '@shoelace-style/shoelace/dist/react/tree';
import WaTreeItem from '@shoelace-style/shoelace/dist/react/tree-item';
const App = () => ( const App = () => (
<SlTree> <WaTree>
<SlTreeItem> <WaTreeItem>
Item 1 Item 1
<SlTreeItem>Item A</SlTreeItem> <WaTreeItem>Item A</WaTreeItem>
<SlTreeItem>Item B</SlTreeItem> <WaTreeItem>Item B</WaTreeItem>
<SlTreeItem>Item C</SlTreeItem> <WaTreeItem>Item C</WaTreeItem>
</SlTreeItem> </WaTreeItem>
<SlTreeItem>Item 2</SlTreeItem> <WaTreeItem>Item 2</WaTreeItem>
<SlTreeItem>Item 3</SlTreeItem> <WaTreeItem>Item 3</WaTreeItem>
</SlTree> </WaTree>
); );
``` ```
@@ -43,43 +44,44 @@ const App = () => (
A tree item can contain other tree items. This allows the node to be expanded or collapsed by the user. A tree item can contain other tree items. This allows the node to be expanded or collapsed by the user.
```html:preview ```html:preview
<sl-tree> <wa-tree>
<sl-tree-item> <wa-tree-item>
Item 1 Item 1
<sl-tree-item> <wa-tree-item>
Item A Item A
<sl-tree-item>Item Z</sl-tree-item> <wa-tree-item>Item Z</wa-tree-item>
<sl-tree-item>Item Y</sl-tree-item> <wa-tree-item>Item Y</wa-tree-item>
<sl-tree-item>Item X</sl-tree-item> <wa-tree-item>Item X</wa-tree-item>
</sl-tree-item> </wa-tree-item>
<sl-tree-item>Item B</sl-tree-item> <wa-tree-item>Item B</wa-tree-item>
<sl-tree-item>Item C</sl-tree-item> <wa-tree-item>Item C</wa-tree-item>
</sl-tree-item> </wa-tree-item>
<sl-tree-item>Item 2</sl-tree-item> <wa-tree-item>Item 2</wa-tree-item>
<sl-tree-item>Item 3</sl-tree-item> <wa-tree-item>Item 3</wa-tree-item>
</sl-tree> </wa-tree>
``` ```
<!-- prettier-ignore --> <!-- prettier-ignore -->
```jsx:react ```jsx:react
import { SlTree, SlTreeItem } from '@shoelace-style/shoelace/dist/react'; import WaTree from '@shoelace-style/shoelace/dist/react/tree';
import WaTreeItem from '@shoelace-style/shoelace/dist/react/tree-item';
const App = () => ( const App = () => (
<SlTree> <WaTree>
<SlTreeItem> <WaTreeItem>
Item 1 Item 1
<SlTreeItem> <WaTreeItem>
Item A Item A
<SlTreeItem>Item Z</SlTreeItem> <WaTreeItem>Item Z</WaTreeItem>
<SlTreeItem>Item Y</SlTreeItem> <WaTreeItem>Item Y</WaTreeItem>
<SlTreeItem>Item X</SlTreeItem> <WaTreeItem>Item X</WaTreeItem>
</SlTreeItem> </WaTreeItem>
<SlTreeItem>Item B</SlTreeItem> <WaTreeItem>Item B</WaTreeItem>
<SlTreeItem>Item C</SlTreeItem> <WaTreeItem>Item C</WaTreeItem>
</SlTreeItem> </WaTreeItem>
<SlTreeItem>Item 2</SlTreeItem> <WaTreeItem>Item 2</WaTreeItem>
<SlTreeItem>Item 3</SlTreeItem> <WaTreeItem>Item 3</WaTreeItem>
</SlTree> </WaTree>
); );
``` ```
@@ -88,33 +90,34 @@ const App = () => (
Use the `selected` attribute to select a tree item initially. Use the `selected` attribute to select a tree item initially.
```html:preview ```html:preview
<sl-tree> <wa-tree>
<sl-tree-item selected> <wa-tree-item selected>
Item 1 Item 1
<sl-tree-item>Item A</sl-tree-item> <wa-tree-item>Item A</wa-tree-item>
<sl-tree-item>Item B</sl-tree-item> <wa-tree-item>Item B</wa-tree-item>
<sl-tree-item>Item C</sl-tree-item> <wa-tree-item>Item C</wa-tree-item>
</sl-tree-item> </wa-tree-item>
<sl-tree-item>Item 2</sl-tree-item> <wa-tree-item>Item 2</wa-tree-item>
<sl-tree-item>Item 3</sl-tree-item> <wa-tree-item>Item 3</wa-tree-item>
</sl-tree> </wa-tree>
``` ```
<!-- prettier-ignore --> <!-- prettier-ignore -->
```jsx:react ```jsx:react
import { SlTree, SlTreeItem } from '@shoelace-style/shoelace/dist/react'; import WaTree from '@shoelace-style/shoelace/dist/react/tree';
import WaTreeItem from '@shoelace-style/shoelace/dist/react/tree-item';
const App = () => ( const App = () => (
<SlTree> <WaTree>
<SlTreeItem selected> <WaTreeItem selected>
Item 1 Item 1
<SlTreeItem>Item A</SlTreeItem> <WaTreeItem>Item A</WaTreeItem>
<SlTreeItem>Item B</SlTreeItem> <WaTreeItem>Item B</WaTreeItem>
<SlTreeItem>Item C</SlTreeItem> <WaTreeItem>Item C</WaTreeItem>
</SlTreeItem> </WaTreeItem>
<SlTreeItem>Item 2</SlTreeItem> <WaTreeItem>Item 2</WaTreeItem>
<SlTreeItem>Item 3</SlTreeItem> <WaTreeItem>Item 3</WaTreeItem>
</SlTree> </WaTree>
); );
``` ```
@@ -123,42 +126,43 @@ const App = () => (
Use the `expanded` attribute to expand a tree item initially. Use the `expanded` attribute to expand a tree item initially.
```html:preview ```html:preview
<sl-tree> <wa-tree>
<sl-tree-item expanded> <wa-tree-item expanded>
Item 1 Item 1
<sl-tree-item expanded> <wa-tree-item expanded>
Item A Item A
<sl-tree-item>Item Z</sl-tree-item> <wa-tree-item>Item Z</wa-tree-item>
<sl-tree-item>Item Y</sl-tree-item> <wa-tree-item>Item Y</wa-tree-item>
<sl-tree-item>Item X</sl-tree-item> <wa-tree-item>Item X</wa-tree-item>
</sl-tree-item> </wa-tree-item>
<sl-tree-item>Item B</sl-tree-item> <wa-tree-item>Item B</wa-tree-item>
<sl-tree-item>Item C</sl-tree-item> <wa-tree-item>Item C</wa-tree-item>
</sl-tree-item> </wa-tree-item>
<sl-tree-item>Item 2</sl-tree-item> <wa-tree-item>Item 2</wa-tree-item>
<sl-tree-item>Item 3</sl-tree-item> <wa-tree-item>Item 3</wa-tree-item>
</sl-tree> </wa-tree>
``` ```
<!-- prettier-ignore --> <!-- prettier-ignore -->
```jsx:react ```jsx:react
import { SlTree, SlTreeItem } from '@shoelace-style/shoelace/dist/react'; import WaTree from '@shoelace-style/shoelace/dist/react/tree';
import WaTreeItem from '@shoelace-style/shoelace/dist/react/tree-item';
const App = () => ( const App = () => (
<SlTree> <WaTree>
<SlTreeItem expanded> <WaTreeItem expanded>
Item 1 Item 1
<SlTreeItem expanded> <WaTreeItem expanded>
Item A Item A
<SlTreeItem>Item Z</SlTreeItem> <WaTreeItem>Item Z</WaTreeItem>
<SlTreeItem>Item Y</SlTreeItem> <WaTreeItem>Item Y</WaTreeItem>
<SlTreeItem>Item X</SlTreeItem> <WaTreeItem>Item X</WaTreeItem>
</SlTreeItem> </WaTreeItem>
<SlTreeItem>Item B</SlTreeItem> <WaTreeItem>Item B</WaTreeItem>
<SlTreeItem>Item C</SlTreeItem> <WaTreeItem>Item C</WaTreeItem>
</SlTreeItem> </WaTreeItem>
<SlTreeItem>Item 2</SlTreeItem> <WaTreeItem>Item 2</WaTreeItem>
<SlTreeItem>Item 3</SlTreeItem> <WaTreeItem>Item 3</WaTreeItem>
</SlTree> </WaTree>
); );
``` ```

View File

@@ -6,67 +6,68 @@ layout: component
--- ---
```html:preview ```html:preview
<sl-tree> <wa-tree>
<sl-tree-item> <wa-tree-item>
Deciduous Deciduous
<sl-tree-item>Birch</sl-tree-item> <wa-tree-item>Birch</wa-tree-item>
<sl-tree-item> <wa-tree-item>
Maple Maple
<sl-tree-item>Field maple</sl-tree-item> <wa-tree-item>Field maple</wa-tree-item>
<sl-tree-item>Red maple</sl-tree-item> <wa-tree-item>Red maple</wa-tree-item>
<sl-tree-item>Sugar maple</sl-tree-item> <wa-tree-item>Sugar maple</wa-tree-item>
</sl-tree-item> </wa-tree-item>
<sl-tree-item>Oak</sl-tree-item> <wa-tree-item>Oak</wa-tree-item>
</sl-tree-item> </wa-tree-item>
<sl-tree-item> <wa-tree-item>
Coniferous Coniferous
<sl-tree-item>Cedar</sl-tree-item> <wa-tree-item>Cedar</wa-tree-item>
<sl-tree-item>Pine</sl-tree-item> <wa-tree-item>Pine</wa-tree-item>
<sl-tree-item>Spruce</sl-tree-item> <wa-tree-item>Spruce</wa-tree-item>
</sl-tree-item> </wa-tree-item>
<sl-tree-item> <wa-tree-item>
Non-trees Non-trees
<sl-tree-item>Bamboo</sl-tree-item> <wa-tree-item>Bamboo</wa-tree-item>
<sl-tree-item>Cactus</sl-tree-item> <wa-tree-item>Cactus</wa-tree-item>
<sl-tree-item>Fern</sl-tree-item> <wa-tree-item>Fern</wa-tree-item>
</sl-tree-item> </wa-tree-item>
</sl-tree> </wa-tree>
``` ```
<!-- prettier-ignore --> <!-- prettier-ignore -->
```jsx:react ```jsx:react
import { SlTree, SlTreeItem } from '@shoelace-style/shoelace/dist/react'; import WaTree from '@shoelace-style/shoelace/dist/react/tree';
import WaTreeItem from '@shoelace-style/shoelace/dist/react/tree-item';
const App = () => ( const App = () => (
<SlTree> <WaTree>
<SlTreeItem> <WaTreeItem>
Deciduous Deciduous
<SlTreeItem>Birch</SlTreeItem> <WaTreeItem>Birch</WaTreeItem>
<SlTreeItem> <WaTreeItem>
Maple Maple
<SlTreeItem>Field maple</SlTreeItem> <WaTreeItem>Field maple</WaTreeItem>
<SlTreeItem>Red maple</SlTreeItem> <WaTreeItem>Red maple</WaTreeItem>
<SlTreeItem>Sugar maple</SlTreeItem> <WaTreeItem>Sugar maple</WaTreeItem>
</SlTreeItem> </WaTreeItem>
<SlTreeItem>Oak</SlTreeItem> <WaTreeItem>Oak</WaTreeItem>
</SlTreeItem> </WaTreeItem>
<SlTreeItem> <WaTreeItem>
Coniferous Coniferous
<SlTreeItem>Cedar</SlTreeItem> <WaTreeItem>Cedar</WaTreeItem>
<SlTreeItem>Pine</SlTreeItem> <WaTreeItem>Pine</WaTreeItem>
<SlTreeItem>Spruce</SlTreeItem> <WaTreeItem>Spruce</WaTreeItem>
</SlTreeItem> </WaTreeItem>
<SlTreeItem> <WaTreeItem>
Non-trees Non-trees
<SlTreeItem>Bamboo</SlTreeItem> <WaTreeItem>Bamboo</WaTreeItem>
<SlTreeItem>Cactus</SlTreeItem> <WaTreeItem>Cactus</WaTreeItem>
<SlTreeItem>Fern</SlTreeItem> <WaTreeItem>Fern</WaTreeItem>
</SlTreeItem> </WaTreeItem>
</SlTree> </WaTree>
); );
``` ```
@@ -81,36 +82,36 @@ The `selection` attribute lets you change the selection behavior of the tree.
- Use `leaf` to only allow leaf nodes to be selected. - Use `leaf` to only allow leaf nodes to be selected.
```html:preview ```html:preview
<sl-select id="selection-mode" value="single" label="Selection"> <wa-select id="selection-mode" value="single" label="Selection">
<sl-option value="single">Single</sl-option> <wa-option value="single">Single</wa-option>
<sl-option value="multiple">Multiple</sl-option> <wa-option value="multiple">Multiple</wa-option>
<sl-option value="leaf">Leaf</sl-option> <wa-option value="leaf">Leaf</wa-option>
</sl-select> </wa-select>
<br /> <br />
<sl-tree class="tree-selectable"> <wa-tree class="tree-selectable">
<sl-tree-item> <wa-tree-item>
Item 1 Item 1
<sl-tree-item> <wa-tree-item>
Item A Item A
<sl-tree-item>Item Z</sl-tree-item> <wa-tree-item>Item Z</wa-tree-item>
<sl-tree-item>Item Y</sl-tree-item> <wa-tree-item>Item Y</wa-tree-item>
<sl-tree-item>Item X</sl-tree-item> <wa-tree-item>Item X</wa-tree-item>
</sl-tree-item> </wa-tree-item>
<sl-tree-item>Item B</sl-tree-item> <wa-tree-item>Item B</wa-tree-item>
<sl-tree-item>Item C</sl-tree-item> <wa-tree-item>Item C</wa-tree-item>
</sl-tree-item> </wa-tree-item>
<sl-tree-item>Item 2</sl-tree-item> <wa-tree-item>Item 2</wa-tree-item>
<sl-tree-item>Item 3</sl-tree-item> <wa-tree-item>Item 3</wa-tree-item>
</sl-tree> </wa-tree>
<script> <script>
const selectionMode = document.querySelector('#selection-mode'); const selectionMode = document.querySelector('#selection-mode');
const tree = document.querySelector('.tree-selectable'); const tree = document.querySelector('.tree-selectable');
selectionMode.addEventListener('sl-change', () => { selectionMode.addEventListener('wa-change', () => {
tree.querySelectorAll('sl-tree-item').forEach(item => (item.selected = false)); tree.querySelectorAll('wa-tree-item').forEach(item => (item.selected = false));
tree.selection = selectionMode.value; tree.selection = selectionMode.value;
}); });
</script> </script>
@@ -118,36 +119,37 @@ The `selection` attribute lets you change the selection behavior of the tree.
<!-- prettier-ignore --> <!-- prettier-ignore -->
```jsx:react ```jsx:react
import { SlTree, SlTreeItem } from '@shoelace-style/shoelace/dist/react'; import WaTree from '@shoelace-style/shoelace/dist/react/tree';
import WaTreeItem from '@shoelace-style/shoelace/dist/react/tree-item';
const App = () => { const App = () => {
const [selection, setSelection] = useState('single'); const [selection, setSelection] = useState('single');
return ( return (
<> <>
<SlSelect label="Selection" value={selection} onSlChange={event => setSelection(event.target.value)}> <WaSelect label="Selection" value={selection} onWaChange={event => setSelection(event.target.value)}>
<SlMenuItem value="single">single</SlMenuItem> <WaMenuItem value="single">single</WaMenuItem>
<SlMenuItem value="multiple">multiple</SlMenuItem> <WaMenuItem value="multiple">multiple</WaMenuItem>
<SlMenuItem value="leaf">leaf</SlMenuItem> <WaMenuItem value="leaf">leaf</WaMenuItem>
</SlSelect> </WaSelect>
<br /> <br />
<SlTree selection={selection}> <WaTree selection={selection}>
<SlTreeItem> <WaTreeItem>
Item 1 Item 1
<SlTreeItem> <WaTreeItem>
Item A Item A
<SlTreeItem>Item Z</SlTreeItem> <WaTreeItem>Item Z</WaTreeItem>
<SlTreeItem>Item Y</SlTreeItem> <WaTreeItem>Item Y</WaTreeItem>
<SlTreeItem>Item X</SlTreeItem> <WaTreeItem>Item X</WaTreeItem>
</SlTreeItem> </WaTreeItem>
<SlTreeItem>Item B</SlTreeItem> <WaTreeItem>Item B</WaTreeItem>
<SlTreeItem>Item C</SlTreeItem> <WaTreeItem>Item C</WaTreeItem>
</SlTreeItem> </WaTreeItem>
<SlTreeItem>Item 2</SlTreeItem> <WaTreeItem>Item 2</WaTreeItem>
<SlTreeItem>Item 3</SlTreeItem> <WaTreeItem>Item 3</WaTreeItem>
</SlTree> </WaTree>
</> </>
); );
}; };
@@ -158,33 +160,33 @@ const App = () => {
Indent guides can be drawn by setting `--indent-guide-width`. You can also change the color, offset, and style, using `--indent-guide-color`, `--indent-guide-style`, and `--indent-guide-offset`, respectively. Indent guides can be drawn by setting `--indent-guide-width`. You can also change the color, offset, and style, using `--indent-guide-color`, `--indent-guide-style`, and `--indent-guide-offset`, respectively.
```html:preview ```html:preview
<sl-tree class="tree-with-lines"> <wa-tree class="tree-with-lines">
<sl-tree-item expanded> <wa-tree-item expanded>
Deciduous Deciduous
<sl-tree-item>Birch</sl-tree-item> <wa-tree-item>Birch</wa-tree-item>
<sl-tree-item expanded> <wa-tree-item expanded>
Maple Maple
<sl-tree-item>Field maple</sl-tree-item> <wa-tree-item>Field maple</wa-tree-item>
<sl-tree-item>Red maple</sl-tree-item> <wa-tree-item>Red maple</wa-tree-item>
<sl-tree-item>Sugar maple</sl-tree-item> <wa-tree-item>Sugar maple</wa-tree-item>
</sl-tree-item> </wa-tree-item>
<sl-tree-item>Oak</sl-tree-item> <wa-tree-item>Oak</wa-tree-item>
</sl-tree-item> </wa-tree-item>
<sl-tree-item> <wa-tree-item>
Coniferous Coniferous
<sl-tree-item>Cedar</sl-tree-item> <wa-tree-item>Cedar</wa-tree-item>
<sl-tree-item>Pine</sl-tree-item> <wa-tree-item>Pine</wa-tree-item>
<sl-tree-item>Spruce</sl-tree-item> <wa-tree-item>Spruce</wa-tree-item>
</sl-tree-item> </wa-tree-item>
<sl-tree-item> <wa-tree-item>
Non-trees Non-trees
<sl-tree-item>Bamboo</sl-tree-item> <wa-tree-item>Bamboo</wa-tree-item>
<sl-tree-item>Cactus</sl-tree-item> <wa-tree-item>Cactus</wa-tree-item>
<sl-tree-item>Fern</sl-tree-item> <wa-tree-item>Fern</wa-tree-item>
</sl-tree-item> </wa-tree-item>
</sl-tree> </wa-tree>
<style> <style>
.tree-with-lines { .tree-with-lines {
@@ -197,36 +199,37 @@ Indent guides can be drawn by setting `--indent-guide-width`. You can also chang
<!-- prettier-ignore --> <!-- prettier-ignore -->
```jsx:react ```jsx:react
import { SlTree, SlTreeItem } from '@shoelace-style/shoelace/dist/react'; import WaTree from '@shoelace-style/shoelace/dist/react/tree';
import WaTreeItem from '@shoelace-style/shoelace/dist/react/tree-item';
const App = () => ( const App = () => (
<SlTree class="tree-with-lines" style={{ '--indent-guide-width': '1px' }}> <WaTree class="tree-with-lines" style={{ '--indent-guide-width': '1px' }}>
<SlTreeItem expanded> <WaTreeItem expanded>
Deciduous Deciduous
<SlTreeItem>Birch</SlTreeItem> <WaTreeItem>Birch</WaTreeItem>
<SlTreeItem expanded> <WaTreeItem expanded>
Maple Maple
<SlTreeItem>Field maple</SlTreeItem> <WaTreeItem>Field maple</WaTreeItem>
<SlTreeItem>Red maple</SlTreeItem> <WaTreeItem>Red maple</WaTreeItem>
<SlTreeItem>Sugar maple</SlTreeItem> <WaTreeItem>Sugar maple</WaTreeItem>
</SlTreeItem> </WaTreeItem>
<SlTreeItem>Oak</SlTreeItem> <WaTreeItem>Oak</WaTreeItem>
</SlTreeItem> </WaTreeItem>
<SlTreeItem> <WaTreeItem>
Coniferous Coniferous
<SlTreeItem>Cedar</SlTreeItem> <WaTreeItem>Cedar</WaTreeItem>
<SlTreeItem>Pine</SlTreeItem> <WaTreeItem>Pine</WaTreeItem>
<SlTreeItem>Spruce</SlTreeItem> <WaTreeItem>Spruce</WaTreeItem>
</SlTreeItem> </WaTreeItem>
<SlTreeItem> <WaTreeItem>
Non-trees Non-trees
<SlTreeItem>Bamboo</SlTreeItem> <WaTreeItem>Bamboo</WaTreeItem>
<SlTreeItem>Cactus</SlTreeItem> <WaTreeItem>Cactus</WaTreeItem>
<SlTreeItem>Fern</SlTreeItem> <WaTreeItem>Fern</WaTreeItem>
</SlTreeItem> </WaTreeItem>
</SlTree> </WaTree>
); );
``` ```
@@ -234,25 +237,25 @@ const App = () => (
### Lazy Loading ### Lazy Loading
Use the `lazy` attribute on a tree item to indicate that the content is not yet present and will be loaded later. When the user tries to expand the node, the `loading` state is set to `true` and the `sl-lazy-load` event will be emitted to allow you to load data asynchronously. The item will remain in a loading state until its content is changed. Use the `lazy` attribute on a tree item to indicate that the content is not yet present and will be loaded later. When the user tries to expand the node, the `loading` state is set to `true` and the `wa-lazy-load` event will be emitted to allow you to load data asynchronously. The item will remain in a loading state until its content is changed.
If you want to disable this behavior after the first load, simply remove the `lazy` attribute and, on the next expand, the existing content will be shown instead. If you want to disable this behavior after the first load, simply remove the `lazy` attribute and, on the next expand, the existing content will be shown instead.
```html:preview ```html:preview
<sl-tree> <wa-tree>
<sl-tree-item lazy>Available Trees</sl-tree-item> <wa-tree-item lazy>Available Trees</wa-tree-item>
</sl-tree> </wa-tree>
<script type="module"> <script type="module">
const lazyItem = document.querySelector('sl-tree-item[lazy]'); const lazyItem = document.querySelector('wa-tree-item[lazy]');
lazyItem.addEventListener('sl-lazy-load', () => { lazyItem.addEventListener('wa-lazy-load', () => {
// Simulate asynchronous loading // Simulate asynchronous loading
setTimeout(() => { setTimeout(() => {
const subItems = ['Birch', 'Cedar', 'Maple', 'Pine']; const subItems = ['Birch', 'Cedar', 'Maple', 'Pine'];
for (const item of subItems) { for (const item of subItems) {
const treeItem = document.createElement('sl-tree-item'); const treeItem = document.createElement('wa-tree-item');
treeItem.innerText = item; treeItem.innerText = item;
lazyItem.append(treeItem); lazyItem.append(treeItem);
} }
@@ -265,7 +268,8 @@ If you want to disable this behavior after the first load, simply remove the `la
``` ```
```jsx:react ```jsx:react
import { SlTree, SlTreeItem } from '@shoelace-style/shoelace/dist/react'; import WaTree from '@shoelace-style/shoelace/dist/react/tree';
import WaTreeItem from '@shoelace-style/shoelace/dist/react/tree-item';
const App = () => { const App = () => {
const [childItems, setChildItems] = useState([]); const [childItems, setChildItems] = useState([]);
@@ -282,14 +286,14 @@ const App = () => {
}; };
return ( return (
<SlTree> <WaTree>
<SlTreeItem lazy={lazy} onSlLazyLoad={handleLazyLoad}> <WaTreeItem lazy={lazy} onWaLazyLoad={handleLazyLoad}>
Available Trees Available Trees
{childItems.map(item => ( {childItems.map(item => (
<SlTreeItem>{item}</SlTreeItem> <WaTreeItem>{item}</WaTreeItem>
))} ))}
</SlTreeItem> </WaTreeItem>
</SlTree> </WaTree>
); );
}; };
``` ```
@@ -299,39 +303,39 @@ const App = () => {
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 `expand-button` part as shown below. 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 `expand-button` part as shown below.
```html:preview ```html:preview
<sl-tree class="custom-icons"> <wa-tree class="custom-icons">
<sl-icon name="plus-square" slot="expand-icon"></sl-icon> <wa-icon name="square-plus" variant="solid" slot="expand-icon"></wa-icon>
<sl-icon name="dash-square" slot="collapse-icon"></sl-icon> <wa-icon name="square-minus" variant="solid" slot="collapse-icon"></wa-icon>
<sl-tree-item> <wa-tree-item>
Deciduous Deciduous
<sl-tree-item>Birch</sl-tree-item> <wa-tree-item>Birch</wa-tree-item>
<sl-tree-item> <wa-tree-item>
Maple Maple
<sl-tree-item>Field maple</sl-tree-item> <wa-tree-item>Field maple</wa-tree-item>
<sl-tree-item>Red maple</sl-tree-item> <wa-tree-item>Red maple</wa-tree-item>
<sl-tree-item>Sugar maple</sl-tree-item> <wa-tree-item>Sugar maple</wa-tree-item>
</sl-tree-item> </wa-tree-item>
<sl-tree-item>Oak</sl-tree-item> <wa-tree-item>Oak</wa-tree-item>
</sl-tree-item> </wa-tree-item>
<sl-tree-item> <wa-tree-item>
Coniferous Coniferous
<sl-tree-item>Cedar</sl-tree-item> <wa-tree-item>Cedar</wa-tree-item>
<sl-tree-item>Pine</sl-tree-item> <wa-tree-item>Pine</wa-tree-item>
<sl-tree-item>Spruce</sl-tree-item> <wa-tree-item>Spruce</wa-tree-item>
</sl-tree-item> </wa-tree-item>
<sl-tree-item> <wa-tree-item>
Non-trees Non-trees
<sl-tree-item>Bamboo</sl-tree-item> <wa-tree-item>Bamboo</wa-tree-item>
<sl-tree-item>Cactus</sl-tree-item> <wa-tree-item>Cactus</wa-tree-item>
<sl-tree-item>Fern</sl-tree-item> <wa-tree-item>Fern</wa-tree-item>
</sl-tree-item> </wa-tree-item>
</sl-tree> </wa-tree>
<style> <style>
.custom-icons sl-tree-item::part(expand-button) { .custom-icons wa-tree-item::part(expand-button) {
/* Disable the expand/collapse animation */ /* Disable the expand/collapse animation */
rotate: none; rotate: none;
} }
@@ -340,39 +344,40 @@ Use the `expand-icon` and `collapse-icon` slots to change the expand and collaps
<!-- prettier-ignore --> <!-- prettier-ignore -->
```jsx:react ```jsx:react
import { SlTree, SlTreeItem } from '@shoelace-style/shoelace/dist/react'; import WaTree from '@shoelace-style/shoelace/dist/react/tree';
import WaTreeItem from '@shoelace-style/shoelace/dist/react/tree-item';
const App = () => ( const App = () => (
<SlTree> <WaTree>
<SlIcon name="plus-square" slot="expand-icon"></SlIcon> <WaIcon name="square-plus" variant="solid" slot="expand-icon"></WaIcon>
<SlIcon name="dash-square" slot="collapse-icon"></SlIcon> <WaIcon name="square-minus" variant="solid" slot="collapse-icon"></WaIcon>
<SlTreeItem> <WaTreeItem>
Deciduous Deciduous
<SlTreeItem>Birch</SlTreeItem> <WaTreeItem>Birch</WaTreeItem>
<SlTreeItem> <WaTreeItem>
Maple Maple
<SlTreeItem>Field maple</SlTreeItem> <WaTreeItem>Field maple</WaTreeItem>
<SlTreeItem>Red maple</SlTreeItem> <WaTreeItem>Red maple</WaTreeItem>
<SlTreeItem>Sugar maple</SlTreeItem> <WaTreeItem>Sugar maple</WaTreeItem>
</SlTreeItem> </WaTreeItem>
<SlTreeItem>Oak</SlTreeItem> <WaTreeItem>Oak</WaTreeItem>
</SlTreeItem> </WaTreeItem>
<SlTreeItem> <WaTreeItem>
Coniferous Coniferous
<SlTreeItem>Cedar</SlTreeItem> <WaTreeItem>Cedar</WaTreeItem>
<SlTreeItem>Pine</SlTreeItem> <WaTreeItem>Pine</WaTreeItem>
<SlTreeItem>Spruce</SlTreeItem> <WaTreeItem>Spruce</WaTreeItem>
</SlTreeItem> </WaTreeItem>
<SlTreeItem> <WaTreeItem>
Non-trees Non-trees
<SlTreeItem>Bamboo</SlTreeItem> <WaTreeItem>Bamboo</WaTreeItem>
<SlTreeItem>Cactus</SlTreeItem> <WaTreeItem>Cactus</WaTreeItem>
<SlTreeItem>Fern</SlTreeItem> <WaTreeItem>Fern</WaTreeItem>
</SlTreeItem> </WaTreeItem>
</SlTree> </WaTree>
); );
``` ```
@@ -381,89 +386,91 @@ const App = () => (
Decorative icons can be used before labels to provide hints for each node. Decorative icons can be used before labels to provide hints for each node.
```html:preview ```html:preview
<sl-tree class="tree-with-icons"> <wa-tree class="tree-with-icons">
<sl-tree-item expanded> <wa-tree-item expanded>
<sl-icon name="folder"></sl-icon> <wa-icon name="folder" variant="regular"></wa-icon>
Documents Documents
<sl-tree-item> <wa-tree-item>
<sl-icon name="folder"> </sl-icon> <wa-icon name="folder" variant="regular"> </wa-icon>
Photos Photos
<sl-tree-item> <wa-tree-item>
<sl-icon name="image"></sl-icon> <wa-icon name="image" variant="regular"></wa-icon>
birds.jpg birds.jpg
</sl-tree-item> </wa-tree-item>
<sl-tree-item> <wa-tree-item>
<sl-icon name="image"></sl-icon> <wa-icon name="image" variant="regular"></wa-icon>
kitten.jpg kitten.jpg
</sl-tree-item> </wa-tree-item>
<sl-tree-item> <wa-tree-item>
<sl-icon name="image"></sl-icon> <wa-icon name="image" variant="regular"></wa-icon>
puppy.jpg puppy.jpg
</sl-tree-item> </wa-tree-item>
</sl-tree-item> </wa-tree-item>
<sl-tree-item> <wa-tree-item>
<sl-icon name="folder"></sl-icon> <wa-icon name="folder" variant="regular"></wa-icon>
Writing Writing
<sl-tree-item> <wa-tree-item>
<sl-icon name="file"></sl-icon> <wa-icon name="file" variant="regular"></wa-icon>
draft.txt draft.txt
</sl-tree-item> </wa-tree-item>
<sl-tree-item> <wa-tree-item>
<sl-icon name="file-pdf"></sl-icon> <wa-icon name="file-pdf" variant="regular"></wa-icon>
final.pdf final.pdf
</sl-tree-item> </wa-tree-item>
<sl-tree-item> <wa-tree-item>
<sl-icon name="file-bar-graph"></sl-icon> <wa-icon name="file-lines" variant="regular"></wa-icon>
sales.xls sales.xls
</sl-tree-item> </wa-tree-item>
</sl-tree-item> </wa-tree-item>
</sl-tree-item> </wa-tree-item>
</sl-tree> </wa-tree>
``` ```
```jsx:react ```jsx:react
import { SlIcon, SlTree, SlTreeItem } from '@shoelace-style/shoelace/dist/react'; import WaIcon from '@shoelace-style/shoelace/dist/react/icon';
import WaTree from '@shoelace-style/shoelace/dist/react/tree';
import WaTreeItem from '@shoelace-style/shoelace/dist/react/tree-item';
const App = () => { const App = () => {
return ( return (
<SlTree class="tree-with-icons"> <WaTree class="tree-with-icons">
<SlTreeItem expanded> <WaTreeItem expanded>
<SlIcon name="folder" /> <WaIcon name="folder" />
Root Root
<SlTreeItem> <WaTreeItem>
<SlIcon name="folder" /> <WaIcon name="folder" />
Folder 1<SlTreeItem> Folder 1<WaTreeItem>
<SlIcon name="files" /> <WaIcon name="files" />
File 1 - 1 File 1 - 1
</SlTreeItem> </WaTreeItem>
<SlTreeItem disabled> <WaTreeItem disabled>
<SlIcon name="files" /> <WaIcon name="files" />
File 1 - 2 File 1 - 2
</SlTreeItem> </WaTreeItem>
<SlTreeItem> <WaTreeItem>
<SlIcon name="files" /> <WaIcon name="files" />
File 1 - 3 File 1 - 3
</SlTreeItem> </WaTreeItem>
</SlTreeItem> </WaTreeItem>
<SlTreeItem> <WaTreeItem>
<SlIcon name="files" /> <WaIcon name="files" />
Folder 2<SlTreeItem> Folder 2<WaTreeItem>
<SlIcon name="files" /> <WaIcon name="files" />
File 2 - 1 File 2 - 1
</SlTreeItem> </WaTreeItem>
<SlTreeItem> <WaTreeItem>
<SlIcon name="files" /> <WaIcon name="files" />
File 2 - 2 File 2 - 2
</SlTreeItem> </WaTreeItem>
</SlTreeItem> </WaTreeItem>
<SlTreeItem> <WaTreeItem>
<SlIcon name="files" /> <WaIcon name="files" />
File 1 File 1
</SlTreeItem> </WaTreeItem>
</SlTreeItem> </WaTreeItem>
</SlTree> </WaTree>
); );
}; };
``` ```

View File

@@ -7,13 +7,13 @@ layout: component
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." 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 keyboards user won't be able to determine where the focus indicator is without it. 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:preview ```html:preview
<div style="min-height: 1.875rem;"> <div style="min-height: 1.875rem;">
<sl-visually-hidden> <wa-visually-hidden>
<a href="#">Skip to main content</a> <a href="#">Skip to main content</a>
</sl-visually-hidden> </wa-visually-hidden>
</div> </div>
``` ```
@@ -26,8 +26,8 @@ In this example, the link will open a new window. Screen readers will announce "
```html:preview ```html:preview
<a href="https://example.com/" target="_blank"> <a href="https://example.com/" target="_blank">
Visit External Page Visit External Page
<sl-icon name="box-arrow-up-right"></sl-icon> <wa-icon name="arrow-up-right-from-square" variant="regular"></wa-icon>
<sl-visually-hidden>opens in a new window</sl-visually-hidden> <wa-visually-hidden>opens in a new window</wa-visually-hidden>
</a> </a>
``` ```
@@ -36,11 +36,11 @@ In this example, the link will open a new window. Screen readers will announce "
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. 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:preview ```html:preview
<sl-card style="width: 100%; max-width: 360px;"> <wa-card style="width: 100%; max-width: 360px;">
<header> <header>
<sl-visually-hidden>Personal Info</sl-visually-hidden> <wa-visually-hidden>Personal Info</wa-visually-hidden>
</header> </header>
<sl-input label="Name" style="margin-bottom: .5rem;"></sl-input> <wa-input label="Name" style="margin-bottom: .5rem;"></wa-input>
<sl-input label="Email" type="email"></sl-input> <wa-input label="Email" type="email"></wa-input>
</sl-card> </wa-card>
``` ```

View File

@@ -0,0 +1,276 @@
---
meta:
title: Blog Listing
description: TODO
toc: false
---
<div class="wa:block-flow:3xl">
<div class="wa:background:college_ruled" style="border-radius:var(--wa-panel-corners); padding: var(--wa-space-3xl); background-color:var(--wa-color-brand-spot-darker); color:var(--wa-color-brand-text-on-spot); text-align: center;">
<h1 style="margin-block-start: 0;">Latest from the Blog</h1>
<p style="margin-block-end: 0;">Lorem ipsum dolor sit amet</p>
</div>
<div class="wa:arrange:aside-end" style="--wa-grid-size: 45ch;">
<div class="wa:block-flow:m">
<div class="wa:frame:landscape">
<img src="https://images.pexels.com/photos/6550721/pexels-photo-6550721.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
<div class="wa:arrange:flex:justify-space_between">
<small><wa-format-date month="long" year="numeric"></wa-format-date></small>
<wa-badge variant="neutral">Design</wa-badge>
</div>
<h1>Pantone's Color of the Year 2024</h1>
<p>PANTONE 13-1023 Peach Fuzz has our new year starting off with lots of warm and fuzzies.</p>
<div class="wa:arrange:flex:gap-s">
<wa-avatar label="User avatar" style="--size: 2rem;"></wa-avatar>
<small>Author</small>
</div>
</div>
<div class="wa:arrange" style="align-content: start;">
<div class="wa:arrange:side-by-side:gap-s">
<div class="wa:block-flow:xs">
<small><wa-format-date date="2023-12-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
<h4>Lorem Ipsum Dolor Sit Amet</h4>
</div>
<div class="wa:frame">
<img src="https://images.pexels.com/photos/1181676/pexels-photo-1181676.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
</div>
<div class="wa:arrange:side-by-side:gap-s">
<div class="wa:block-flow:xs">
<small><wa-format-date date="2023-11-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
<h4>Consectetur Adipiscing Elit</h4>
</div>
<div class="wa:frame">
<img src="https://images.pexels.com/photos/4219654/pexels-photo-4219654.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
</div>
<div class="wa:arrange:side-by-side:gap-s">
<div class="wa:block-flow:xs">
<small><wa-format-date date="2023-11-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
<h4>Nunc Rhoncus Enim Ligula</h4>
</div>
<div class="wa:frame">
<img src="https://images.pexels.com/photos/14822510/pexels-photo-14822510.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
</div>
<div class="wa:arrange:side-by-side:gap-s">
<div class="wa:block-flow:xs">
<small><wa-format-date date="2023-10-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
<h4>Donec Quis Tincidunt Massa</h4>
</div>
<div class="wa:frame">
<img src="https://images.pexels.com/photos/7988116/pexels-photo-7988116.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
</div>
</div>
</div>
<div class="wa:arrange:gap-m" style="background-color:var(--wa-color-brand-fill-subtle); padding:var(--wa-space-3xl); border-radius:var(--wa-panel-corners); box-shadow:var(--wa-shadow-level-1);">
<div class="wa:block-flow:s">
<h2 style="color:var(--wa-color-brand-text-on-fill)"><strong>Don't miss a thing.</strong></h2>
<p style="color:var(--wa-color-neutral-text-on-fill)">Subscribe to receive the latest posts in your inbox.</p>
</div>
<div class="wa:arrange:flex:justify-space_between:gap-s">
<wa-input class="wa:fill_space" type="email" placeholder="your@email.com">
<wa-icon name="envelope" variant="regular" label="email" slot="prefix"></wa-icon>
</wa-input>
<wa-button variant="brand">Subscribe</wa-button>
</div>
</div>
<div class="wa:block-flow:xl">
<div class="wa:arrange:flex:justify-space_between">
<h2>Arts & Culture</h2>
<wa-button outline variant="brand">
See more arts & culture posts
<wa-icon name="arrow-right" slot="suffix"></wa-icon>
</wa-button>
</div>
<div class="wa:arrange:size-s">
<div class="wa:block-flow:xs">
<div class="wa:frame:landscape">
<img src="https://images.pexels.com/photos/14363192/pexels-photo-14363192.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
<div>
<small><wa-format-date date="2023-12-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
</div>
<h4>Headline Dolor Sit Amet</h4>
</div>
<div class="wa:block-flow:xs">
<div class="wa:frame:landscape">
<img src="https://images.pexels.com/photos/8843689/pexels-photo-8843689.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
<div>
<small><wa-format-date date="2023-12-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
</div>
<h4>Headline Dolor Sit Amet</h4>
</div>
<div class="wa:block-flow:xs">
<div class="wa:frame:landscape">
<img src="https://images.pexels.com/photos/1646953/pexels-photo-1646953.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
<div>
<small><wa-format-date date="2023-12-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
</div>
<h4>Headline Dolor Sit Amet</h4>
</div>
<div class="wa:block-flow:xs">
<div class="wa:frame:landscape">
<img src="https://images.pexels.com/photos/3184188/pexels-photo-3184188.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
<div>
<small><wa-format-date date="2023-12-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
</div>
<h4>Headline Dolor Sit Amet</h4>
</div>
</div>
</div>
<div class="wa:block-flow:xl">
<div class="wa:arrange:flex:justify-space_between">
<h2>Design</h2>
<wa-button outline variant="brand">
See more design posts
<wa-icon name="arrow-right" slot="suffix"></wa-icon>
</wa-button>
</div>
<div class="wa:arrange:size-s">
<div class="wa:block-flow:xs">
<div class="wa:frame:landscape">
<img src="https://images.pexels.com/photos/1762851/pexels-photo-1762851.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
<div>
<small><wa-format-date date="2023-12-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
</div>
<h4>Headline Dolor Sit Amet</h4>
</div>
<div class="wa:block-flow:xs">
<div class="wa:frame:landscape">
<img src="https://images.pexels.com/photos/196645/pexels-photo-196645.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
<div>
<small><wa-format-date date="2023-12-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
</div>
<h4>Headline Dolor Sit Amet</h4>
</div>
<div class="wa:block-flow:xs">
<div class="wa:frame:landscape">
<img src="https://images.pexels.com/photos/1194420/pexels-photo-1194420.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
<div>
<small><wa-format-date date="2023-12-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
</div>
<h4>Headline Dolor Sit Amet</h4>
</div>
<div class="wa:block-flow:xs">
<div class="wa:frame:landscape">
<img src="https://images.pexels.com/photos/1779487/pexels-photo-1779487.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
<div>
<small><wa-format-date date="2023-12-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
</div>
<h4>Headline Dolor Sit Amet</h4>
</div>
</div>
</div>
<div class="wa:block-flow:xl">
<div class="wa:arrange:flex:justify-space_between">
<h2>Web Development</h2>
<wa-button outline variant="brand">
See more web development posts
<wa-icon name="arrow-right" slot="suffix"></wa-icon>
</wa-button>
</div>
<div class="wa:arrange:size-s">
<div class="wa:block-flow:xs">
<div class="wa:frame:landscape">
<img src="https://images.pexels.com/photos/6321244/pexels-photo-6321244.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
<div>
<small><wa-format-date date="2023-12-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
</div>
<h4>Headline Dolor Sit Amet</h4>
</div>
<div class="wa:block-flow:xs">
<div class="wa:frame:landscape">
<img src="https://images.pexels.com/photos/5473956/pexels-photo-5473956.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
<div>
<small><wa-format-date date="2023-12-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
</div>
<h4>Headline Dolor Sit Amet</h4>
</div>
<div class="wa:block-flow:xs">
<div class="wa:frame:landscape">
<img src="https://images.pexels.com/photos/4709289/pexels-photo-4709289.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
<div>
<small><wa-format-date date="2023-12-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
</div>
<h4>Headline Dolor Sit Amet</h4>
</div>
<div class="wa:block-flow:xs">
<div class="wa:frame:landscape">
<img src="https://images.pexels.com/photos/3184340/pexels-photo-3184340.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
<div>
<small><wa-format-date date="2023-12-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
</div>
<h4>Headline Dolor Sit Amet</h4>
</div>
</div>
</div>
<div class="wa:arrange:size-s wa:collection">
<div>
<h2>So Fetch&nbsp;<wa-icon name="arrow-trend-up" style="color: var(--wa-color-brand-spot);"></wa-icon></h2>
<p style="margin-block-end:0;">Other readers have been into these trending posts recently.</p>
</div>
<wa-card class="wa:block-flow:xs">
<div class="wa:frame:landscape" slot="image">
<img src="https://images.pexels.com/photos/1194420/pexels-photo-1194420.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
<small><wa-format-date date="2023-12-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
<h4>Headline Dolor Sit Amet</h4>
<wa-badge variant="neutral">Design</wa-badge>
</wa-card>
<wa-card class="wa:block-flow:xs">
<div class="wa:frame:landscape" slot="image">
<img src="https://images.pexels.com/photos/4219654/pexels-photo-4219654.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
<small><wa-format-date date="2023-12-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
<h4>Consectetur Adipiscing Elit</h4>
<wa-badge variant="neutral">Arts & Culture</wa-badge>
</wa-card>
<wa-card class="wa:block-flow:xs">
<div class="wa:frame:landscape" slot="image">
<img src="https://images.pexels.com/photos/6321244/pexels-photo-6321244.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
<small><wa-format-date date="2023-12-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
<h4>Headline Dolor Sit Amet</h4>
<wa-badge variant="neutral">Web Development</wa-badge>
</wa-card>
</div>
<div>
<h2>Browse All Topics</h2>
<div class="wa:arrange:gap-m">
<wa-button outline>Accessibility <wa-icon name="arrow-right" slot="suffix"></wa-icon></wa-button>
<wa-button outline>Arts & Culture <wa-icon name="arrow-right" slot="suffix"></wa-icon></wa-button>
<wa-button outline>Design <wa-icon name="arrow-right" slot="suffix"></wa-icon></wa-button>
<wa-button outline>News <wa-icon name="arrow-right" slot="suffix"></wa-icon></wa-button>
<wa-button outline>Typography <wa-icon name="arrow-right" slot="suffix"></wa-icon></wa-button>
<wa-button outline>Web Development <wa-icon name="arrow-right" slot="suffix"></wa-icon></wa-button>
</div>
</div>
</div>
<style>
:root {
--docs-content-max-width: 72rem;
}
#menu-toggle,
#sidebar {
display: none;
}
main {
padding: var(--docs-content-vertical-spacing) var(--docs-content-padding);
margin: 0;
}
</style>

View File

@@ -0,0 +1,178 @@
---
meta:
title: Blog Post
description: TODO
toc: false
---
<div class="wa:block-flow:3xl">
<div class="wa:overflowing_hero">
<div class="wa:arrange wa:background:brand_spot_gradient" style="border-radius:var(--wa-panel-corners); padding:var(--wa-space-3xl); color:var(--wa-color-brand-text-on-spot);">
<div>
<div class="wa:arrange:flex:justify-space_between:gap-s">
<small><wa-format-date month="long" year="numeric"></wa-format-date></small>
<wa-badge variant="neutral">Design</wa-badge>
</div>
<h1>Pantone's Color of the Year 2024</h1>
<p>PANTONE 13-1023 Peach Fuzz has our new year starting off with lots of warm and fuzzies.</p>
<div class="wa:arrange:flex:gap-s">
<wa-avatar label="User avatar" style="--size: 2rem;"></wa-avatar>
<small>Author</small>
</div>
</div>
<div class="wa:frame:square">
<img src="https://images.pexels.com/photos/6550721/pexels-photo-6550721.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
</div>
</div>
<div class="wa:block-flow:3xl" style="font-size:var(--wa-font-size-l); max-inline-size: 60ch; margin-inline: auto;">
<div class="wa:block-flow:xl">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi vitae sapien non velit feugiat consectetur. Nulla lacinia ante a diam gravida cursus. Quisque fermentum ex a nisi cursus porttitor. Praesent id laoreet mauris, id efficitur sapien. Quisque eget metus velit. Nulla sit amet tristique lectus, tincidunt lobortis velit. Proin vitae facilisis lectus. Nunc vel sapien vitae dui commodo suscipit iaculis eget felis.</p>
<p>Praesent in erat semper, fringilla tellus non, lacinia felis. Nam eu fringilla nisl. Maecenas id tortor tempus, accumsan nisi eget, bibendum arcu. Pellentesque nec enim non nisl varius iaculis. Phasellus interdum nec ex nec faucibus. Vestibulum et quam auctor massa pellentesque tempor. Sed tincidunt nibh felis, ut euismod ante volutpat aliquam. Etiam varius suscipit ornare.</p>
<p>Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed a leo tempus, pretium mi ac, pretium ipsum. Curabitur cursus eleifend enim. Pellentesque feugiat euismod tincidunt. Sed semper velit nunc, nec imperdiet eros varius ac. Aenean aliquam augue at venenatis volutpat. Proin a imperdiet leo. Nullam eget aliquet urna.</p>
<p>Mauris faucibus varius massa vel vulputate. Praesent ac ligula pretium, viverra eros vitae, consequat metus. Morbi commodo vehicula sem, eget scelerisque ipsum rutrum ut. Maecenas cursus dolor mattis risus dapibus pulvinar. Suspendisse ut dolor nec arcu lobortis molestie. Duis pulvinar tellus vitae felis volutpat hendrerit. Vivamus sodales condimentum quam, ut consequat massa viverra sed. Vestibulum laoreet tincidunt lacus nec ullamcorper. Quisque tincidunt turpis et sapien hendrerit, a laoreet massa dictum. Vestibulum dictum posuere lectus. Pellentesque ac lorem sodales, iaculis libero in, eleifend purus. Sed volutpat quam est, ac accumsan dolor viverra a. Duis blandit augue id tortor aliquet tempus. Nulla pharetra nec nisi non placerat. Donec in risus feugiat risus mattis pretium imperdiet a tortor.</p>
<p>Donec eros felis, dictum non placerat vitae, sodales in risus. Etiam felis lectus, consectetur quis tempor non, porta a metus. Cras finibus nibh a est semper, eget consequat libero pretium. Pellentesque placerat feugiat enim sit amet sodales. Proin convallis dui eu nibh tincidunt, a posuere dolor sagittis. Ut egestas et eros eu convallis. Integer eros elit, blandit at euismod sit amet, blandit sed velit. Donec dapibus nulla in augue commodo, at efficitur orci dictum. Nam id accumsan leo. Proin pellentesque tincidunt neque ornare gravida. Phasellus malesuada, orci vel ultricies fringilla, tortor ipsum cursus magna, non fermentum velit nibh at nunc. Duis purus mauris, ullamcorper eu tempus id, ornare gravida odio. Praesent ultrices accumsan iaculis. Maecenas ut metus a lectus venenatis euismod. Sed auctor, dui efficitur molestie convallis, diam odio faucibus turpis, vitae bibendum ante est non ligula.</p>
<wa-divider></wa-divider>
<div class="wa:arrange:flex:justify-space_between" style="font-size:var(--wa-font-size-m);">
<wa-radio-group name="a">
<wa-radio-button value="1"><wa-icon name="hands-clapping" label="Applaud"></wa-icon><small style="margin-inline-start:var(--wa-space-xs);">74</small></wa-radio-button>
<wa-radio-button value="2"><wa-icon name="heart" label="Love"></wa-icon><small style="margin-inline-start:var(--wa-space-xs);">161</small></wa-radio-button>
<wa-radio-button value="3"><wa-icon name="face-laugh-beam" label="Laugh"></wa-icon><small style="margin-inline-start:var(--wa-space-xs);">9</small></wa-radio-button>
<wa-radio-button value="4"><wa-icon name="face-sad-tear" label="Cry"></wa-icon><small style="margin-inline-start:var(--wa-space-xs);">1</small></wa-radio-button>
</wa-radio-group>
<div class="wa:arrange:flex:nowrap:gap-l">
<wa-tooltip content="Save">
<wa-icon-button name="bookmark" label="Save"></wa-icon-button>
</wa-tooltip>
<wa-tooltip content="Share">
<wa-icon-button name="share-from-square" label="Share"></wa-icon-button>
</wa-tooltip>
</div>
</div>
</div>
<div class="wa:block-flow:2xl" style="font-size:var(--wa-font-size-m);">
<h2>Comments</h2>
<div class="wa:arrange:flex:nowrap:gap-s">
<wa-avatar label="User avatar"></wa-avatar>
<wa-textarea class="wa:fill_space" rows="1" placeholder="Add a comment"></wa-textarea>
</div>
<div class="wa:arrange:flex:nowrap:align-start:gap-s">
<wa-avatar image="https://m.media-amazon.com/images/M/MV5BMTBlNDU1NTgtNjY1Zi00ZTU0LTlkN2ItZmM5NDM5NmMyNzk3XkEyXkFqcGdeQXVyMDM2NDM2MQ@@._V1_.jpg" label="User avatar"></wa-avatar>
<div class="wa:fill_space">
<div class="wa:chat_bubble">
<div class="wa:arrange:flex:justify-space_between">
<strong>Din Djarin</strong>
<small>1d</small>
</div>
<span>You expect me to search the galaxy for the home of this creature and deliver it to a race of enemy sorcerers?</span>
</div>
<div class="wa:arrange:flex:gap-m">
<div class="wa:arrange:flex:nowrap:gap-3xs">
<wa-icon-button name="thumbs-up" label="Like" style="color:var(--wa-color-neutral-text-on-surface)"></wa-icon-button>
<small>(3)</small>
</div>
<wa-button variant="text" size="small">Reply</wa-button>
</div>
<div class="wa:arrange:flex:nowrap:align-start:gap-s">
<wa-avatar image="https://cdn.mos.cms.futurecdn.net/zAQrY5fe3HAFvWrTLE6nNi.png" label="User avatar"></wa-avatar>
<div class="wa:fill_space">
<div class="wa:chat_bubble">
<div class="wa:arrange:flex:justify-space_between">
<strong>The Armorer</strong>
<small>12h</small>
</div>
<span>This is the Way.</span>
</div>
<div class="wa:arrange:flex:gap-m">
<div class="wa:arrange:flex:nowrap:gap-3xs">
<wa-icon-button name="thumbs-up" label="Like" style="color:var(--wa-color-neutral-text-on-surface)"></wa-icon-button>
<small>(21)</small>
</div>
<wa-button variant="text" size="small">Reply</wa-button>
</div>
</div>
</div>
</div>
</div>
<div class="wa:arrange:flex:nowrap:align-start:gap-s">
<wa-avatar image="https://static1.srcdn.com/wordpress/wp-content/uploads/2021/07/Nick-Nolte-and-Misty-Rosas-as-Kuiil-in-The-Mandalorian.jpg" label="User avatar"></wa-avatar>
<div class="wa:fill_space">
<div class="wa:chat_bubble">
<div class="wa:arrange:flex:justify-space_between">
<strong>Kuiil</strong>
<small>2w</small>
</div>
<span>I have spoken.</span>
</div>
<div class="wa:arrange:flex:gap-m">
<div class="wa:arrange:flex:nowrap:gap-3xs">
<wa-icon-button name="thumbs-up" label="Like" style="color:var(--wa-color-neutral-text-on-surface)"></wa-icon-button>
<small>(1)</small>
</div>
<wa-button variant="text" size="small">Reply</wa-button>
</div>
</div>
</div>
</div>
</div>
<div class="wa:arrange:gap-m" style="background-color:var(--wa-color-brand-fill-subtle); padding:var(--wa-space-3xl); border-radius:var(--wa-panel-corners); box-shadow:var(--wa-shadow-level-1); margin-top:calc(var(--wa-space-3xl) * 2);">
<div class="wa:block-flow:s">
<h2 style="color:var(--wa-color-brand-text-on-fill)"><strong>Don't miss a thing.</strong></h2>
<p style="color:var(--wa-color-neutral-text-on-fill)">Subscribe to receive the latest posts in your inbox.</p>
</div>
<div class="wa:arrange:flex:gap-s">
<wa-input class="wa:fill_space" type="email" placeholder="your@email.com">
<wa-icon name="envelope" variant="regular" label="email" slot="prefix"></wa-icon>
</wa-input>
<wa-button variant="brand">Subscribe</wa-button>
</div>
</div>
<div style="background-color:var(--wa-color-neutral-fill-subtle); padding:var(--wa-space-3xl); border-radius:var(--wa-panel-corners); box-shadow:var(--wa-shadow-level-1);">
<div class="wa:block-flow:xl">
<h2>You may also like</h2>
<div class="wa:arrange:size-s">
<div class="wa:block-flow:xs">
<div class="wa:frame:landscape">
<img src="https://images.pexels.com/photos/8843689/pexels-photo-8843689.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
<div>
<small><wa-format-date date="2023-12-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
</div>
<h4>Headline Dolor Sit Amet</h4>
</div>
<div class="wa:block-flow:xs">
<div class="wa:frame:landscape">
<img src="https://images.pexels.com/photos/1646953/pexels-photo-1646953.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
<div>
<small><wa-format-date date="2023-12-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
</div>
<h4>Headline Dolor Sit Amet</h4>
</div>
<div class="wa:block-flow:xs">
<div class="wa:frame:landscape">
<img src="https://images.pexels.com/photos/3184188/pexels-photo-3184188.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
<div>
<small><wa-format-date date="2023-12-16T09:17:00-04:00" month="long" year="numeric"></wa-format-date></small>
</div>
<h4>Headline Dolor Sit Amet</h4>
</div>
</div>
</div>
</div>
</div>
<style>
:root {
--docs-content-max-width: 72rem;
}
#menu-toggle,
#sidebar {
display: none;
}
main {
padding: var(--docs-content-vertical-spacing) var(--docs-content-padding);
margin: 0;
}
</style>

View File

@@ -0,0 +1,217 @@
---
meta:
title: Ecommerce Product Page
description: TODO
toc: false
---
<!-- cSpell:dictionaries lorem-ipsum -->
<div class="wa:block-flow:3xl">
<wa-breadcrumb>
<wa-breadcrumb-item>Plants</wa-breadcrumb-item>
<wa-breadcrumb-item>Indoor Plants</wa-breadcrumb-item>
<wa-breadcrumb-item>Orchids</wa-breadcrumb-item>
<wa-breadcrumb-item>Jupiter Moth Orchid</wa-breadcrumb-item>
</wa-breadcrumb>
<div class="wa:container wa:product-overview">
<div class="wa:arrange">
<div class="wa:product-overview:hero">
<img src="https://images.pexels.com/photos/1021386/pexels-photo-1021386.jpeg" alt="">
</div>
<div class="wa:product-overview:description wa:block-flow:2xl">
<div class="wa:product-overview:summary wa:block-flow:s">
<wa-badge>20% Off</wa-badge>
<h1>Jupiter Moth Orchid</h1>
<p class="wa:product-overview:price"><s>$35</s> $28</p>
<div class="wa:product-overview:rating wa:arrange:flex:gap-s">
<wa-rating label="average stars" readonly precision="0.1" value="4.7"></wa-rating>
<a href="#product-reviews"><small>419 reviews</small></a>
</div>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
</div>
<div class="wa:product-overview:actions wa:arrange:flex:gap-s">
<wa-input type="number" value="1" min="1" max="10"></wa-input>
<wa-button class="wa:fill_space" variant="brand">Add to cart</wa-button>
</div>
<div class="wa:product-overview:details wa:block-flow:s">
<wa-details summary="Details">
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="Care instructions">
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>
</div>
</div>
</div>
<div class="wa:container wa:product-reviews" id="product-reviews">
<wa-tab-group>
<wa-tab slot="nav" panel="reviews">Reviews</wa-tab>
<wa-tab slot="nav" panel="questions">Questions</wa-tab>
<wa-tab-panel name="reviews" style="margin-top:var(--wa-space-s);">
<div class="wa:arrange:aside-start">
<div class="wa:product-reviews:overview wa:block-flow:2xl">
<h2>Ratings and reviews</h2>
<div class="wa:block-flow:s">
<div class="wa:product-reviews:summary wa:arrange:flex:gap-s">
<h3 class="wa:arrange:flex:gap-s">
4.7
<wa-rating label="average stars" readonly precision="0.1" value="4.7"></wa-rating>
</h3>
<small>Based on 419 reviews</small>
</div>
<div class="wa:product-reviews:breakdown">
<ol>
<li class="wa:arrange:flex:gap-s">
<span>5</span>
<wa-icon name="star"></wa-icon>
<wa-progress-bar class="wa:fill_space" value="82"></wa-progress-bar>
<span>340</span>
</li>
<li class="wa:arrange:flex:gap-s">
<span>4</span>
<wa-icon name="star"></wa-icon>
<wa-progress-bar class="wa:fill_space" value="12"></wa-progress-bar>
<span>53</span>
</li>
<li class="wa:arrange:flex:gap-s">
<span>3</span>
<wa-icon name="star"></wa-icon>
<wa-progress-bar class="wa:fill_space" value="6"></wa-progress-bar>
<span>24</span>
</li>
<li class="wa:arrange:flex:gap-s">
<span>2</span>
<wa-icon name="star"></wa-icon>
<wa-progress-bar class="wa:fill_space" value="0"></wa-progress-bar>
<span>0</span>
</li>
<li class="wa:arrange:flex:gap-s">
<span>1</span>
<wa-icon name="star"></wa-icon>
<wa-progress-bar class="wa:fill_space" value="1"></wa-progress-bar>
<span>2</span>
</li>
</ol>
</div>
</div>
<wa-divider></wa-divider>
<div class="wa:block-flow:s">
<h3>Happy with your purchase?</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
<wa-button outline size="small" style="width: 100%;">Write a review</wa-button>
</div>
</div>
<div class="wa:product-reviews:list wa:block-flow:2xl">
<div class="wa:product-reviews:review wa:block-flow:s">
<div class="wa:arrange:flex:gap-s">
<wa-avatar label="User avatar"></wa-avatar>
<div class="wa:product-reviews:attribution">
<div class="wa:arrange:flex:gap-s">
<strong>Cory L.</strong> <wa-tag variant="success" size="small"><wa-icon name="check" style="margin-inline-end:var(--wa-space-2xs);"></wa-icon>Verified</wa-tag>
</div>
<small><wa-format-date month="long" day="numeric" year="numeric"></wa-format-date></small>
</div>
</div>
<wa-rating label="Rating" readonly value="5"></wa-rating>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
</div>
<div class="wa:product-reviews:review wa:block-flow:s">
<div class="wa:arrange:flex:gap-s">
<wa-avatar label="User avatar"></wa-avatar>
<div class="wa:product-reviews:attribution">
<div class="wa:arrange:flex:gap-s">
<strong>Konnor R.</strong> <wa-tag variant="success" size="small"><wa-icon name="check" style="margin-inline-end:var(--wa-space-2xs);"></wa-icon>Verified</wa-tag>
</div>
<small><wa-format-date date="2023-11-16T09:17:00-04:00" month="long" day="numeric" year="numeric"></wa-format-date></small>
</div>
</div>
<wa-rating label="Rating" readonly value="4"></wa-rating>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
</div>
<div class="wa:product-reviews:review wa:block-flow:s">
<div class="wa:arrange:flex:gap-s">
<wa-avatar label="User avatar"></wa-avatar>
<div class="wa:product-reviews:attribution">
<div class="wa:arrange:flex:gap-s">
<strong>Kelsey J.</strong> <wa-tag variant="success" size="small"><wa-icon name="check" style="margin-inline-end:var(--wa-space-2xs);"></wa-icon>Verified</wa-tag>
</div>
<small><wa-format-date date="2023-10-31T09:17:00-04:00" month="long" day="numeric" year="numeric"></wa-format-date></small>
</div>
</div>
<wa-rating label="Rating" readonly value="5"></wa-rating>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
</div>
<div class="wa:product-reviews:review wa:block-flow:s">
<div class="wa:arrange:flex:gap-s">
<wa-avatar label="User avatar"></wa-avatar>
<div class="wa:product-reviews:attribution">
<div class="wa:arrange:flex:gap-s">
<strong>Lindsay M.</strong>
</div>
<small><wa-format-date date="2023-07-03T09:17:00-04:00" month="long" day="numeric" year="numeric"></wa-format-date></small>
</div>
</div>
<wa-rating label="Rating" readonly value="5"></wa-rating>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
</div>
<wa-button outline size="small" style="width: 100%;">Load more reviews</wa-button>
</div>
</div>
</wa-tab-panel>
<wa-tab-panel name="questions">
questions
</wa-tab-panel>
</wa-tab-group>
</div>
<div class="wa:container wa:product-list-simple">
<h2>You may also like</h2>
<div class="wa:product-list-simple:items wa:arrange:by-two:size-s">
<wa-card>
<div class="wa:frame:square" slot="image">
<img src="https://images.pexels.com/photos/4076594/pexels-photo-4076594.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
Triumph Tulip<br>
<strong>$14</strong><br>
</wa-card>
<wa-card>
<div class="wa:frame:square" slot="image">
<img src="https://images.pexels.com/photos/4994350/pexels-photo-4994350.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
White Doll's Daisy<br>
<strong>$18</strong>
</wa-card>
<wa-card>
<div class="wa:frame:square" slot="image">
<img src="https://images.pexels.com/photos/2223890/pexels-photo-2223890.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
Common Poppy<br>
<strong>$32</strong>
</wa-card>
<wa-card>
<div class="wa:frame:square" slot="image">
<img src="https://images.pexels.com/photos/1179026/pexels-photo-1179026.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2" alt="">
</div>
Stargazer Lily<br>
<strong>$39</strong>
</wa-card>
</div>
</div>
</div>
<style>
:root {
--docs-content-max-width: 72rem;
}
#menu-toggle,
#sidebar {
display: none;
}
main {
padding: initial;
margin: var(--wa-space-xl);
}
</style>

View File

@@ -0,0 +1,52 @@
---
meta:
title: Form Control Validation
description: TODO
---
# Form Control Validation
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>

View File

@@ -0,0 +1,15 @@
---
meta:
title: Patterns
description: TBD
---
<!-- cSpell:dictionaries lorem-ipsum -->
# Patterns
## Full demos
- [Ecommerce: Product Page](/experimental/demo_patterns/ecommerce_product_page)
- [Blog: Listing Page](/experimental/demo_patterns/blog_listing)
- [Blog: Post Page](/experimental/demo_patterns/blog_post)

View File

@@ -0,0 +1,168 @@
---
meta:
title: Theming Sandbox
description: TODO
---
# Theming Sandbox
#### Card
```html:preview
<wa-card 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:preview
<wa-alert variant="brand" open>
<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-alert>
<br />
<wa-alert variant="success" open>
<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-alert>
<br />
<wa-alert variant="neutral" open>
<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-alert>
<br />
<wa-alert variant="warning" open>
<wa-icon slot="icon" name="triangle-exclamation" variant="regular"></wa-icon>
<strong>Your session has ended</strong><br />
Please login again to continue.
</wa-alert>
<br />
<wa-alert variant="danger" open>
<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-alert>
```
#### Badges and Tags
```html:preview
<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:preview
<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:preview
<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:preview
<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:preview
<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>
```

View File

@@ -0,0 +1,162 @@
---
meta:
title: Style Guide
description: TODO
---
# Style Guide
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
<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
![cat](https://placekitten.com/1200/800)
## 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>

File diff suppressed because it is too large Load Diff

View File

@@ -1,32 +1,56 @@
--- ---
meta: meta:
title: Angular title: Angular
description: Tips for using Shoelace in your Angular app. description: Tips for using Web Awesome in your Angular app.
--- ---
# Angular # Angular
Angular [plays nice](https://custom-elements-everywhere.com/#angular) with custom elements, so you can use Shoelace in your Angular apps with ease. Angular [plays nice](https://custom-elements-everywhere.com/#angular) with custom elements, so you can use Web Awesome in your Angular apps with ease.
## Installation ## Installation
To add Shoelace to your Angular app, install the package from npm. ### Download the npm package
To add Web Awesome to your Angular app, install the package from npm.
```bash ```bash
npm install @shoelace-style/shoelace npm install @shoelace-style/shoelace
``` ```
Next, [include a theme](/getting-started/themes) and set the [base path](/getting-started/installation#setting-the-base-path) for icons and other assets. In this example, we'll import the light theme and use the CDN as a base path. ### Update the Angular Configuration
Next, [include a theme](/getting-started/themes). In this example, we'll import the light theme.
Its also important to load the components by using a `<script>` tag into the index.html file. However, the Angular way to do it is by adding a script configurations into your angular.json file as follows:
```json
"architect": {
"build": {
...
"options": {
...
"styles": [
"src/styles.scss",
"@shoelace-style/shoelace/dist/themes/light.css"
],
"scripts": [
"@shoelace-style/shoelace/dist/shoelace.js"
]
...
```
### Setting up the base path
Next, set the [base path](/getting-started/installation#setting-the-base-path) for icons and other assets in the `main.ts`. In this example, we'll use the CDN as a base path.
```jsx ```jsx
import '@shoelace-style/shoelace/dist/themes/light.css'; import { setBasePath } from '@shoelace-style/shoelace/%NPMDIR%/utilities/base-path';
import { setBasePath } from '@shoelace-style/shoelace/dist/utilities/base-path';
setBasePath('https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@%VERSION%/dist/'); setBasePath('https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@%VERSION%/%CDNDIR%/');
``` ```
:::tip :::tip
If you'd rather not use the CDN for assets, you can create a build task that copies `node_modules/@shoelace-style/shoelace/dist/assets` into a public folder in your app. Then you can point the base path to that folder instead. If you'd rather not use the CDN for assets, you can create a build task that copies `node_modules/@shoelace-style/shoelace/%NPMDIR%/assets` into a public folder in your app. Then you can point the base path to that folder instead.
::: :::
## Configuration ## Configuration
@@ -49,20 +73,20 @@ import { AppComponent } from './app.component';
export class AppModule {} export class AppModule {}
``` ```
## Reference Shoelace components in your Angular component code ## Reference Web Awesome components in your Angular component code
```js ```js
import { SlDrawer } from '@shoelace-style/shoelace'; import { WaDrawer } from '@shoelace-style/shoelace';
@Component({ @Component({
selector: 'app-drawer-example', selector: 'app-drawer-example',
template: '<div id="page"><button (click)="showDrawer()">Show drawer</button><sl-drawer #drawer label="Drawer" class="drawer-focus" style="--size: 50vw"><p>Drawer content</p></sl-drawer></div>' template: '<div id="page"><button (click)="showDrawer()">Show drawer</button><wa-drawer #drawer label="Drawer" class="drawer-focus" style="--size: 50vw"><p>Drawer content</p></wa-drawer></div>'
}) })
export class DrawerExampleComponent implements OnInit { export class DrawerExampleComponent implements OnInit {
// use @ViewChild to get a reference to the #drawer element within component template // use @ViewChild to get a reference to the #drawer element within component template
@ViewChild('drawer') @ViewChild('drawer')
drawer?: ElementRef<SlDrawer>; drawer?: ElementRef<WaDrawer>;
... ...
@@ -75,14 +99,14 @@ export class DrawerExampleComponent implements OnInit {
... ...
showDrawer() { showDrawer() {
// use nativeElement to access Shoelace components // use nativeElement to access Web Awesome components
this.drawer?.nativeElement.show(); this.drawer?.nativeElement.show();
} }
} }
``` ```
Now you can start using Shoelace components in your app! Now you can start using Web Awesome components in your app!
:::tip :::tip
Are you using Shoelace with Angular? [Help us improve this page!](https://github.com/shoelace-style/shoelace/blob/next/docs/frameworks/angular.md) Are you using Web Awesome with Angular? [Help us improve this page!](https://github.com/shoelace-style/shoelace/blob/next/docs/frameworks/angular.md)
::: :::

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