@wordpress/ui 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/README.md +106 -0
- package/build/badge/badge.cjs +3 -3
- package/build/badge/badge.cjs.map +2 -2
- package/build/button/button.cjs +7 -7
- package/build/button/button.cjs.map +2 -2
- package/build/card/content.cjs +54 -0
- package/build/card/content.cjs.map +7 -0
- package/build/card/full-bleed.cjs +57 -0
- package/build/card/full-bleed.cjs.map +7 -0
- package/build/card/header.cjs +54 -0
- package/build/card/header.cjs.map +7 -0
- package/build/card/index.cjs +43 -0
- package/build/card/index.cjs.map +7 -0
- package/build/card/root.cjs +73 -0
- package/build/card/root.cjs.map +7 -0
- package/build/card/title.cjs +55 -0
- package/build/card/title.cjs.map +7 -0
- package/build/card/types.cjs +19 -0
- package/build/card/types.cjs.map +7 -0
- package/build/collapsible/index.cjs +37 -0
- package/build/collapsible/index.cjs.map +7 -0
- package/build/collapsible/panel.cjs +38 -0
- package/build/collapsible/panel.cjs.map +7 -0
- package/build/collapsible/root.cjs +38 -0
- package/build/collapsible/root.cjs.map +7 -0
- package/build/collapsible/trigger.cjs +38 -0
- package/build/collapsible/trigger.cjs.map +7 -0
- package/build/collapsible/types.cjs +19 -0
- package/build/collapsible/types.cjs.map +7 -0
- package/build/collapsible-card/content.cjs +77 -0
- package/build/collapsible-card/content.cjs.map +7 -0
- package/build/collapsible-card/header.cjs +102 -0
- package/build/collapsible-card/header.cjs.map +7 -0
- package/build/collapsible-card/index.cjs +37 -0
- package/build/collapsible-card/index.cjs.map +7 -0
- package/build/collapsible-card/root.cjs +56 -0
- package/build/collapsible-card/root.cjs.map +7 -0
- package/build/collapsible-card/types.cjs +19 -0
- package/build/collapsible-card/types.cjs.map +7 -0
- package/build/dialog/footer.cjs +3 -3
- package/build/dialog/footer.cjs.map +2 -2
- package/build/dialog/header.cjs +3 -3
- package/build/dialog/header.cjs.map +2 -2
- package/build/dialog/popup.cjs +3 -3
- package/build/dialog/popup.cjs.map +2 -2
- package/build/dialog/title.cjs +3 -3
- package/build/dialog/title.cjs.map +2 -2
- package/build/dialog/types.cjs.map +1 -1
- package/build/form/primitives/field/label.cjs +6 -1
- package/build/form/primitives/field/label.cjs.map +2 -2
- package/build/form/primitives/field/types.cjs.map +1 -1
- package/build/form/primitives/fieldset/legend.cjs +5 -1
- package/build/form/primitives/fieldset/legend.cjs.map +2 -2
- package/build/form/primitives/fieldset/types.cjs.map +1 -1
- package/build/form/primitives/input/input.cjs +4 -4
- package/build/form/primitives/input/input.cjs.map +2 -2
- package/build/form/primitives/input-layout/slot.cjs +3 -2
- package/build/form/primitives/input-layout/slot.cjs.map +2 -2
- package/build/form/primitives/select/item.cjs +3 -3
- package/build/form/primitives/select/item.cjs.map +2 -2
- package/build/form/primitives/select/popup.cjs +3 -3
- package/build/form/primitives/select/popup.cjs.map +2 -2
- package/build/form/primitives/select/trigger.cjs +7 -7
- package/build/form/primitives/select/trigger.cjs.map +2 -2
- package/build/index.cjs +13 -0
- package/build/index.cjs.map +2 -2
- package/build/link/index.cjs +31 -0
- package/build/link/index.cjs.map +7 -0
- package/build/link/link.cjs +125 -0
- package/build/link/link.cjs.map +7 -0
- package/build/link/types.cjs +19 -0
- package/build/link/types.cjs.map +7 -0
- package/build/notice/action-button.cjs +3 -3
- package/build/notice/action-button.cjs.map +2 -2
- package/build/notice/action-link.cjs +17 -18
- package/build/notice/action-link.cjs.map +2 -2
- package/build/notice/actions.cjs +3 -3
- package/build/notice/actions.cjs.map +2 -2
- package/build/notice/close-icon.cjs +3 -3
- package/build/notice/close-icon.cjs.map +2 -2
- package/build/notice/description.cjs +26 -15
- package/build/notice/description.cjs.map +3 -3
- package/build/notice/root.cjs +3 -3
- package/build/notice/root.cjs.map +2 -2
- package/build/notice/title.cjs +26 -12
- package/build/notice/title.cjs.map +3 -3
- package/build/notice/types.cjs.map +1 -1
- package/build/tabs/list.cjs +3 -3
- package/build/tabs/list.cjs.map +2 -2
- package/build/tabs/panel.cjs +3 -3
- package/build/tabs/panel.cjs.map +2 -2
- package/build/tabs/tab.cjs +3 -3
- package/build/tabs/tab.cjs.map +2 -2
- package/build/text/index.cjs +31 -0
- package/build/text/index.cjs.map +7 -0
- package/build/text/text.cjs +65 -0
- package/build/text/text.cjs.map +7 -0
- package/build/text/types.cjs +19 -0
- package/build/text/types.cjs.map +7 -0
- package/build/tooltip/popup.cjs +1 -1
- package/build/tooltip/popup.cjs.map +1 -1
- package/build/visually-hidden/visually-hidden.cjs +3 -3
- package/build/visually-hidden/visually-hidden.cjs.map +2 -2
- package/build-module/badge/badge.mjs +3 -3
- package/build-module/badge/badge.mjs.map +2 -2
- package/build-module/button/button.mjs +7 -7
- package/build-module/button/button.mjs.map +2 -2
- package/build-module/card/content.mjs +29 -0
- package/build-module/card/content.mjs.map +7 -0
- package/build-module/card/full-bleed.mjs +32 -0
- package/build-module/card/full-bleed.mjs.map +7 -0
- package/build-module/card/header.mjs +29 -0
- package/build-module/card/header.mjs.map +7 -0
- package/build-module/card/index.mjs +14 -0
- package/build-module/card/index.mjs.map +7 -0
- package/build-module/card/root.mjs +38 -0
- package/build-module/card/root.mjs.map +7 -0
- package/build-module/card/title.mjs +30 -0
- package/build-module/card/title.mjs.map +7 -0
- package/build-module/card/types.mjs +1 -0
- package/build-module/card/types.mjs.map +7 -0
- package/build-module/collapsible/index.mjs +10 -0
- package/build-module/collapsible/index.mjs.map +7 -0
- package/build-module/collapsible/panel.mjs +13 -0
- package/build-module/collapsible/panel.mjs.map +7 -0
- package/build-module/collapsible/root.mjs +13 -0
- package/build-module/collapsible/root.mjs.map +7 -0
- package/build-module/collapsible/trigger.mjs +13 -0
- package/build-module/collapsible/trigger.mjs.map +7 -0
- package/build-module/collapsible/types.mjs +1 -0
- package/build-module/collapsible/types.mjs.map +7 -0
- package/build-module/collapsible-card/content.mjs +42 -0
- package/build-module/collapsible-card/content.mjs.map +7 -0
- package/build-module/collapsible-card/header.mjs +67 -0
- package/build-module/collapsible-card/header.mjs.map +7 -0
- package/build-module/collapsible-card/index.mjs +10 -0
- package/build-module/collapsible-card/index.mjs.map +7 -0
- package/build-module/collapsible-card/root.mjs +21 -0
- package/build-module/collapsible-card/root.mjs.map +7 -0
- package/build-module/collapsible-card/types.mjs +1 -0
- package/build-module/collapsible-card/types.mjs.map +7 -0
- package/build-module/dialog/footer.mjs +3 -3
- package/build-module/dialog/footer.mjs.map +2 -2
- package/build-module/dialog/header.mjs +3 -3
- package/build-module/dialog/header.mjs.map +2 -2
- package/build-module/dialog/popup.mjs +3 -3
- package/build-module/dialog/popup.mjs.map +2 -2
- package/build-module/dialog/title.mjs +3 -3
- package/build-module/dialog/title.mjs.map +2 -2
- package/build-module/form/primitives/field/label.mjs +6 -1
- package/build-module/form/primitives/field/label.mjs.map +2 -2
- package/build-module/form/primitives/fieldset/legend.mjs +5 -1
- package/build-module/form/primitives/fieldset/legend.mjs.map +2 -2
- package/build-module/form/primitives/input/input.mjs +4 -4
- package/build-module/form/primitives/input/input.mjs.map +2 -2
- package/build-module/form/primitives/input-layout/slot.mjs +3 -2
- package/build-module/form/primitives/input-layout/slot.mjs.map +2 -2
- package/build-module/form/primitives/select/item.mjs +3 -3
- package/build-module/form/primitives/select/item.mjs.map +2 -2
- package/build-module/form/primitives/select/popup.mjs +3 -3
- package/build-module/form/primitives/select/popup.mjs.map +2 -2
- package/build-module/form/primitives/select/trigger.mjs +7 -7
- package/build-module/form/primitives/select/trigger.mjs.map +2 -2
- package/build-module/index.mjs +8 -0
- package/build-module/index.mjs.map +2 -2
- package/build-module/link/index.mjs +6 -0
- package/build-module/link/index.mjs.map +7 -0
- package/build-module/link/link.mjs +90 -0
- package/build-module/link/link.mjs.map +7 -0
- package/build-module/link/types.mjs +1 -0
- package/build-module/link/types.mjs.map +7 -0
- package/build-module/notice/action-button.mjs +3 -3
- package/build-module/notice/action-button.mjs.map +2 -2
- package/build-module/notice/action-link.mjs +17 -18
- package/build-module/notice/action-link.mjs.map +2 -2
- package/build-module/notice/actions.mjs +3 -3
- package/build-module/notice/actions.mjs.map +2 -2
- package/build-module/notice/close-icon.mjs +3 -3
- package/build-module/notice/close-icon.mjs.map +2 -2
- package/build-module/notice/description.mjs +16 -15
- package/build-module/notice/description.mjs.map +2 -2
- package/build-module/notice/root.mjs +3 -3
- package/build-module/notice/root.mjs.map +2 -2
- package/build-module/notice/title.mjs +16 -12
- package/build-module/notice/title.mjs.map +2 -2
- package/build-module/tabs/list.mjs +3 -3
- package/build-module/tabs/list.mjs.map +2 -2
- package/build-module/tabs/panel.mjs +3 -3
- package/build-module/tabs/panel.mjs.map +2 -2
- package/build-module/tabs/tab.mjs +3 -3
- package/build-module/tabs/tab.mjs.map +2 -2
- package/build-module/text/index.mjs +6 -0
- package/build-module/text/index.mjs.map +7 -0
- package/build-module/text/text.mjs +30 -0
- package/build-module/text/text.mjs.map +7 -0
- package/build-module/text/types.mjs +1 -0
- package/build-module/text/types.mjs.map +7 -0
- package/build-module/tooltip/popup.mjs +1 -1
- package/build-module/tooltip/popup.mjs.map +1 -1
- package/build-module/visually-hidden/visually-hidden.mjs +3 -3
- package/build-module/visually-hidden/visually-hidden.mjs.map +2 -2
- package/build-types/card/content.d.ts +6 -0
- package/build-types/card/content.d.ts.map +1 -0
- package/build-types/card/full-bleed.d.ts +9 -0
- package/build-types/card/full-bleed.d.ts.map +1 -0
- package/build-types/card/header.d.ts +7 -0
- package/build-types/card/header.d.ts.map +1 -0
- package/build-types/card/index.d.ts +7 -0
- package/build-types/card/index.d.ts.map +1 -0
- package/build-types/card/root.d.ts +23 -0
- package/build-types/card/root.d.ts.map +1 -0
- package/build-types/card/stories/index.story.d.ts +22 -0
- package/build-types/card/stories/index.story.d.ts.map +1 -0
- package/build-types/card/test/index.test.d.ts +2 -0
- package/build-types/card/test/index.test.d.ts.map +1 -0
- package/build-types/card/title.d.ts +7 -0
- package/build-types/card/title.d.ts.map +1 -0
- package/build-types/card/types.d.ts +34 -0
- package/build-types/card/types.d.ts.map +1 -0
- package/build-types/collapsible/index.d.ts +5 -0
- package/build-types/collapsible/index.d.ts.map +1 -0
- package/build-types/collapsible/panel.d.ts +16 -0
- package/build-types/collapsible/panel.d.ts.map +1 -0
- package/build-types/collapsible/root.d.ts +15 -0
- package/build-types/collapsible/root.d.ts.map +1 -0
- package/build-types/collapsible/stories/index.story.d.ts +18 -0
- package/build-types/collapsible/stories/index.story.d.ts.map +1 -0
- package/build-types/collapsible/test/index.test.d.ts +2 -0
- package/build-types/collapsible/test/index.test.d.ts.map +1 -0
- package/build-types/collapsible/trigger.d.ts +15 -0
- package/build-types/collapsible/trigger.d.ts.map +1 -0
- package/build-types/collapsible/types.d.ts +22 -0
- package/build-types/collapsible/types.d.ts.map +1 -0
- package/build-types/collapsible-card/content.d.ts +7 -0
- package/build-types/collapsible-card/content.d.ts.map +1 -0
- package/build-types/collapsible-card/header.d.ts +12 -0
- package/build-types/collapsible-card/header.d.ts.map +1 -0
- package/build-types/collapsible-card/index.d.ts +5 -0
- package/build-types/collapsible-card/index.d.ts.map +1 -0
- package/build-types/collapsible-card/root.d.ts +24 -0
- package/build-types/collapsible-card/root.d.ts.map +1 -0
- package/build-types/collapsible-card/stories/index.story.d.ts +28 -0
- package/build-types/collapsible-card/stories/index.story.d.ts.map +1 -0
- package/build-types/collapsible-card/test/index.test.d.ts +2 -0
- package/build-types/collapsible-card/test/index.test.d.ts.map +1 -0
- package/build-types/collapsible-card/types.d.ts +52 -0
- package/build-types/collapsible-card/types.d.ts.map +1 -0
- package/build-types/dialog/types.d.ts +3 -3
- package/build-types/form/primitives/field/label.d.ts +1 -0
- package/build-types/form/primitives/field/label.d.ts.map +1 -1
- package/build-types/form/primitives/field/stories/index.story.d.ts +5 -0
- package/build-types/form/primitives/field/stories/index.story.d.ts.map +1 -1
- package/build-types/form/primitives/field/types.d.ts +7 -0
- package/build-types/form/primitives/field/types.d.ts.map +1 -1
- package/build-types/form/primitives/fieldset/legend.d.ts +1 -0
- package/build-types/form/primitives/fieldset/legend.d.ts.map +1 -1
- package/build-types/form/primitives/fieldset/stories/index.story.d.ts +5 -0
- package/build-types/form/primitives/fieldset/stories/index.story.d.ts.map +1 -1
- package/build-types/form/primitives/fieldset/types.d.ts +7 -0
- package/build-types/form/primitives/fieldset/types.d.ts.map +1 -1
- package/build-types/form/primitives/input-layout/slot.d.ts.map +1 -1
- package/build-types/index.d.ts +5 -0
- package/build-types/index.d.ts.map +1 -1
- package/build-types/link/index.d.ts +2 -0
- package/build-types/link/index.d.ts.map +1 -0
- package/build-types/link/link.d.ts +7 -0
- package/build-types/link/link.d.ts.map +1 -0
- package/build-types/link/stories/index.story.d.ts +18 -0
- package/build-types/link/stories/index.story.d.ts.map +1 -0
- package/build-types/link/test/index.test.d.ts +2 -0
- package/build-types/link/test/index.test.d.ts.map +1 -0
- package/build-types/link/types.d.ts +33 -0
- package/build-types/link/types.d.ts.map +1 -0
- package/build-types/notice/action-link.d.ts +0 -2
- package/build-types/notice/action-link.d.ts.map +1 -1
- package/build-types/notice/description.d.ts +1 -1
- package/build-types/notice/description.d.ts.map +1 -1
- package/build-types/notice/title.d.ts.map +1 -1
- package/build-types/notice/types.d.ts +3 -2
- package/build-types/notice/types.d.ts.map +1 -1
- package/build-types/text/index.d.ts +2 -0
- package/build-types/text/index.d.ts.map +1 -0
- package/build-types/text/stories/index.story.d.ts +9 -0
- package/build-types/text/stories/index.story.d.ts.map +1 -0
- package/build-types/text/test/index.test.d.ts +2 -0
- package/build-types/text/test/index.test.d.ts.map +1 -0
- package/build-types/text/text.d.ts +7 -0
- package/build-types/text/text.d.ts.map +1 -0
- package/build-types/text/types.d.ts +15 -0
- package/build-types/text/types.d.ts.map +1 -0
- package/package.json +14 -14
- package/src/badge/style.module.css +5 -2
- package/src/button/style.module.css +2 -0
- package/src/card/content.tsx +20 -0
- package/src/card/full-bleed.tsx +26 -0
- package/src/card/header.tsx +21 -0
- package/src/card/index.ts +7 -0
- package/src/card/root.tsx +42 -0
- package/src/card/stories/index.story.tsx +128 -0
- package/src/card/style.module.css +48 -0
- package/src/card/test/index.test.tsx +96 -0
- package/src/card/title.tsx +22 -0
- package/src/card/types.ts +38 -0
- package/src/collapsible/index.ts +5 -0
- package/src/collapsible/panel.tsx +16 -0
- package/src/collapsible/root.tsx +15 -0
- package/src/collapsible/stories/index.story.tsx +108 -0
- package/src/collapsible/test/index.test.tsx +228 -0
- package/src/collapsible/trigger.tsx +15 -0
- package/src/collapsible/types.ts +24 -0
- package/src/collapsible-card/content.tsx +33 -0
- package/src/collapsible-card/header.tsx +53 -0
- package/src/collapsible-card/index.ts +5 -0
- package/src/collapsible-card/root.tsx +37 -0
- package/src/collapsible-card/stories/index.story.tsx +207 -0
- package/src/collapsible-card/style.module.css +78 -0
- package/src/collapsible-card/test/index.test.tsx +181 -0
- package/src/collapsible-card/types.ts +54 -0
- package/src/dialog/style.module.css +5 -5
- package/src/dialog/types.ts +3 -3
- package/src/form/primitives/field/label.tsx +9 -1
- package/src/form/primitives/field/stories/index.story.tsx +17 -0
- package/src/form/primitives/field/test/index.test.tsx +13 -0
- package/src/form/primitives/field/types.ts +7 -0
- package/src/form/primitives/fieldset/legend.tsx +8 -1
- package/src/form/primitives/fieldset/stories/index.story.tsx +20 -0
- package/src/form/primitives/fieldset/test/index.test.tsx +14 -0
- package/src/form/primitives/fieldset/types.ts +7 -0
- package/src/form/primitives/input-layout/slot.tsx +6 -2
- package/src/index.ts +5 -0
- package/src/link/index.ts +1 -0
- package/src/link/link.tsx +73 -0
- package/src/link/stories/index.story.tsx +92 -0
- package/src/link/style.module.css +68 -0
- package/src/link/test/index.test.tsx +93 -0
- package/src/link/types.ts +36 -0
- package/src/notice/action-link.tsx +12 -18
- package/src/notice/description.tsx +12 -14
- package/src/notice/style.module.css +9 -22
- package/src/notice/test/index.test.tsx +2 -2
- package/src/notice/title.tsx +11 -10
- package/src/notice/types.ts +3 -2
- package/src/tabs/style.module.css +1 -1
- package/src/text/index.ts +1 -0
- package/src/text/stories/index.story.tsx +68 -0
- package/src/text/style.module.css +67 -0
- package/src/text/test/index.test.tsx +46 -0
- package/src/text/text.tsx +25 -0
- package/src/text/types.ts +25 -0
- package/src/tooltip/popup.tsx +1 -1
- package/src/utils/css/focus.module.css +4 -2
- package/src/utils/css/item-popup.module.css +1 -0
- package/src/utils/css/select-trigger.module.css +1 -0
- package/src/visually-hidden/style.module.css +1 -0
- package/AGENTS.md +0 -9
- package/CLAUDE.md +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wordpress/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Themeable React UI components for the WordPress Design System.",
|
|
5
5
|
"author": "The WordPress Contributors",
|
|
6
6
|
"license": "GPL-2.0-or-later",
|
|
@@ -44,24 +44,24 @@
|
|
|
44
44
|
"sideEffects": false,
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"@base-ui/react": "^1.2.0",
|
|
47
|
-
"@wordpress/a11y": "^4.
|
|
48
|
-
"@wordpress/compose": "^7.
|
|
49
|
-
"@wordpress/element": "^6.
|
|
50
|
-
"@wordpress/i18n": "^6.
|
|
51
|
-
"@wordpress/icons": "^
|
|
52
|
-
"@wordpress/keycodes": "^4.
|
|
53
|
-
"@wordpress/primitives": "^4.
|
|
54
|
-
"@wordpress/private-apis": "^1.
|
|
55
|
-
"@wordpress/theme": "^0.
|
|
47
|
+
"@wordpress/a11y": "^4.42.0",
|
|
48
|
+
"@wordpress/compose": "^7.42.0",
|
|
49
|
+
"@wordpress/element": "^6.42.0",
|
|
50
|
+
"@wordpress/i18n": "^6.15.0",
|
|
51
|
+
"@wordpress/icons": "^12.0.0",
|
|
52
|
+
"@wordpress/keycodes": "^4.42.0",
|
|
53
|
+
"@wordpress/primitives": "^4.42.0",
|
|
54
|
+
"@wordpress/private-apis": "^1.42.0",
|
|
55
|
+
"@wordpress/theme": "^0.9.0",
|
|
56
56
|
"clsx": "^2.1.1"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
|
-
"@storybook/addon-docs": "^10.
|
|
60
|
-
"@storybook/react-vite": "^10.
|
|
59
|
+
"@storybook/addon-docs": "^10.2.8",
|
|
60
|
+
"@storybook/react-vite": "^10.2.8",
|
|
61
61
|
"@testing-library/jest-dom": "^6.9.1",
|
|
62
62
|
"@types/jest": "^29.5.14",
|
|
63
63
|
"@types/node": "^20.17.10",
|
|
64
|
-
"storybook": "^10.
|
|
64
|
+
"storybook": "^10.2.8"
|
|
65
65
|
},
|
|
66
66
|
"peerDependencies": {
|
|
67
67
|
"react": "^18.0.0",
|
|
@@ -70,5 +70,5 @@
|
|
|
70
70
|
"publishConfig": {
|
|
71
71
|
"access": "public"
|
|
72
72
|
},
|
|
73
|
-
"gitHead": "
|
|
73
|
+
"gitHead": "c20787b1778ae64c2db65643b1c236309d68e6ba"
|
|
74
74
|
}
|
|
@@ -42,7 +42,10 @@
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
.is-none-intent {
|
|
45
|
-
background-color: var(--wpds-color-bg-surface-neutral);
|
|
46
|
-
color: var(--wpds-color-fg-content-neutral
|
|
45
|
+
background-color: var(--wpds-color-bg-surface-neutral-strong);
|
|
46
|
+
color: var(--wpds-color-fg-content-neutral);
|
|
47
|
+
border: var(--wpds-border-width-xs) solid var(--wpds-color-stroke-surface-neutral);
|
|
48
|
+
padding-block: calc(var(--wpds-dimension-padding-xs) - var(--wpds-border-width-xs));
|
|
49
|
+
padding-inline: calc(var(--wpds-dimension-padding-sm) - var(--wpds-border-width-xs));
|
|
47
50
|
}
|
|
48
51
|
}
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
line-height: var(--wpds-font-line-height-sm);
|
|
51
51
|
text-decoration: none;
|
|
52
52
|
color: var(--wp-ui-button-foreground-color);
|
|
53
|
+
cursor: var(--wpds-cursor-control);
|
|
53
54
|
|
|
54
55
|
@media not ( prefers-reduced-motion ) {
|
|
55
56
|
transition: color 0.1s ease-out;
|
|
@@ -61,6 +62,7 @@
|
|
|
61
62
|
|
|
62
63
|
/* Use pointer cursor for buttons that are links */
|
|
63
64
|
&[href] {
|
|
65
|
+
/* stylelint-disable-next-line declaration-property-value-disallowed-list -- Links should always use pointer. */
|
|
64
66
|
cursor: pointer;
|
|
65
67
|
}
|
|
66
68
|
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { mergeProps, useRender } from '@base-ui/react';
|
|
2
|
+
import { forwardRef } from '@wordpress/element';
|
|
3
|
+
import styles from './style.module.css';
|
|
4
|
+
import type { ContentProps } from './types';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The main content area of the card.
|
|
8
|
+
*/
|
|
9
|
+
export const Content = forwardRef< HTMLDivElement, ContentProps >(
|
|
10
|
+
function CardContent( { render, ...props }, ref ) {
|
|
11
|
+
const element = useRender( {
|
|
12
|
+
defaultTagName: 'div',
|
|
13
|
+
render,
|
|
14
|
+
ref,
|
|
15
|
+
props: mergeProps< 'div' >( { className: styles.content }, props ),
|
|
16
|
+
} );
|
|
17
|
+
|
|
18
|
+
return element;
|
|
19
|
+
}
|
|
20
|
+
);
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { mergeProps, useRender } from '@base-ui/react';
|
|
2
|
+
import { forwardRef } from '@wordpress/element';
|
|
3
|
+
import styles from './style.module.css';
|
|
4
|
+
import type { FullBleedProps } from './types';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A container that breaks out of the card's padding to span edge-to-edge.
|
|
8
|
+
* Useful for full-width images, dividers, or embedded content.
|
|
9
|
+
*
|
|
10
|
+
* Must be used as a direct child of `Card.Content` or `Card.Header`.
|
|
11
|
+
*/
|
|
12
|
+
export const FullBleed = forwardRef< HTMLDivElement, FullBleedProps >(
|
|
13
|
+
function CardFullBleed( { render, ...props }, ref ) {
|
|
14
|
+
const element = useRender( {
|
|
15
|
+
defaultTagName: 'div',
|
|
16
|
+
render,
|
|
17
|
+
ref,
|
|
18
|
+
props: mergeProps< 'div' >(
|
|
19
|
+
{ className: styles.fullbleed },
|
|
20
|
+
props
|
|
21
|
+
),
|
|
22
|
+
} );
|
|
23
|
+
|
|
24
|
+
return element;
|
|
25
|
+
}
|
|
26
|
+
);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { mergeProps, useRender } from '@base-ui/react';
|
|
2
|
+
import { forwardRef } from '@wordpress/element';
|
|
3
|
+
import styles from './style.module.css';
|
|
4
|
+
import type { HeaderProps } from './types';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A structural container for the card's heading area, typically containing
|
|
8
|
+
* `Card.Title`.
|
|
9
|
+
*/
|
|
10
|
+
export const Header = forwardRef< HTMLDivElement, HeaderProps >(
|
|
11
|
+
function CardHeader( { render, ...props }, ref ) {
|
|
12
|
+
const element = useRender( {
|
|
13
|
+
defaultTagName: 'div',
|
|
14
|
+
render,
|
|
15
|
+
ref,
|
|
16
|
+
props: mergeProps< 'div' >( { className: styles.header }, props ),
|
|
17
|
+
} );
|
|
18
|
+
|
|
19
|
+
return element;
|
|
20
|
+
}
|
|
21
|
+
);
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { mergeProps, useRender } from '@base-ui/react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import { forwardRef } from '@wordpress/element';
|
|
4
|
+
import resetStyles from '../utils/css/resets.module.css';
|
|
5
|
+
import styles from './style.module.css';
|
|
6
|
+
import type { RootProps } from './types';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* A visually contained surface that groups related content and actions.
|
|
10
|
+
*
|
|
11
|
+
* ```jsx
|
|
12
|
+
* import { Card } from '@wordpress/ui';
|
|
13
|
+
*
|
|
14
|
+
* function MyComponent() {
|
|
15
|
+
* return (
|
|
16
|
+
* <Card.Root>
|
|
17
|
+
* <Card.Header>
|
|
18
|
+
* <Card.Title>Heading</Card.Title>
|
|
19
|
+
* </Card.Header>
|
|
20
|
+
* <Card.Content>
|
|
21
|
+
* <p>Main content here.</p>
|
|
22
|
+
* </Card.Content>
|
|
23
|
+
* </Card.Root>
|
|
24
|
+
* );
|
|
25
|
+
* }
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export const Root = forwardRef< HTMLDivElement, RootProps >( function Card(
|
|
29
|
+
{ render, ...restProps },
|
|
30
|
+
ref
|
|
31
|
+
) {
|
|
32
|
+
const mergedClassName = clsx( styles.root, resetStyles[ 'box-sizing' ] );
|
|
33
|
+
|
|
34
|
+
const element = useRender( {
|
|
35
|
+
defaultTagName: 'div',
|
|
36
|
+
render,
|
|
37
|
+
ref,
|
|
38
|
+
props: mergeProps< 'div' >( { className: mergedClassName }, restProps ),
|
|
39
|
+
} );
|
|
40
|
+
|
|
41
|
+
return element;
|
|
42
|
+
} );
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import * as Card from '../index';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Temporary text component for story examples. This will be replaced by an
|
|
6
|
+
* official DS `<Text />` component once it's available.
|
|
7
|
+
*/
|
|
8
|
+
function Text( { children }: { children: React.ReactNode } ) {
|
|
9
|
+
return (
|
|
10
|
+
<p
|
|
11
|
+
style={ {
|
|
12
|
+
margin: 0,
|
|
13
|
+
fontFamily: 'var(--wpds-font-family-body)',
|
|
14
|
+
fontSize: 'var(--wpds-font-size-md)',
|
|
15
|
+
fontWeight: 'var(--wpds-font-weight-regular)',
|
|
16
|
+
lineHeight: 'var(--wpds-font-line-height-sm)',
|
|
17
|
+
textWrap: 'pretty',
|
|
18
|
+
color: 'var(--wpds-color-fg-content-neutral-weak)',
|
|
19
|
+
} }
|
|
20
|
+
>
|
|
21
|
+
{ children }
|
|
22
|
+
</p>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const meta: Meta< typeof Card.Root > = {
|
|
27
|
+
title: 'Design System/Components/Card',
|
|
28
|
+
component: Card.Root,
|
|
29
|
+
subcomponents: {
|
|
30
|
+
'Card.Header': Card.Header,
|
|
31
|
+
'Card.Content': Card.Content,
|
|
32
|
+
'Card.FullBleed': Card.FullBleed,
|
|
33
|
+
'Card.Title': Card.Title,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
export default meta;
|
|
37
|
+
|
|
38
|
+
type Story = StoryObj< typeof Card.Root >;
|
|
39
|
+
|
|
40
|
+
export const Default: Story = {
|
|
41
|
+
args: {
|
|
42
|
+
children: (
|
|
43
|
+
<>
|
|
44
|
+
<Card.Header>
|
|
45
|
+
<Card.Title>Card title</Card.Title>
|
|
46
|
+
</Card.Header>
|
|
47
|
+
<Card.Content>
|
|
48
|
+
<Text>
|
|
49
|
+
This is the main content area. It can contain any
|
|
50
|
+
elements. This is the main content area. It can contain
|
|
51
|
+
any elements. This is the main content area. It can
|
|
52
|
+
contain any elements. This is the main content area. It
|
|
53
|
+
can contain any elements. This is the main content area.
|
|
54
|
+
It can contain any elements. This is the main content
|
|
55
|
+
area. It can contain any elements.
|
|
56
|
+
</Text>
|
|
57
|
+
<Text>
|
|
58
|
+
This is the main content area. It can contain any
|
|
59
|
+
elements.
|
|
60
|
+
</Text>
|
|
61
|
+
</Card.Content>
|
|
62
|
+
</>
|
|
63
|
+
),
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* `Card.FullBleed` breaks out of the card's padding to span
|
|
69
|
+
* edge-to-edge. Useful for images, dividers, or embedded content.
|
|
70
|
+
*/
|
|
71
|
+
export const WithFullBleed: Story = {
|
|
72
|
+
args: {
|
|
73
|
+
children: (
|
|
74
|
+
<>
|
|
75
|
+
<Card.Header>
|
|
76
|
+
<Card.Title>Featured image</Card.Title>
|
|
77
|
+
</Card.Header>
|
|
78
|
+
<Card.Content>
|
|
79
|
+
<Card.FullBleed>
|
|
80
|
+
<div
|
|
81
|
+
style={ {
|
|
82
|
+
height: 160,
|
|
83
|
+
background:
|
|
84
|
+
'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
|
|
85
|
+
} }
|
|
86
|
+
/>
|
|
87
|
+
</Card.FullBleed>
|
|
88
|
+
<Text>Content below the full-bleed area.</Text>
|
|
89
|
+
</Card.Content>
|
|
90
|
+
</>
|
|
91
|
+
),
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* A minimal card with only a header.
|
|
97
|
+
*/
|
|
98
|
+
export const HeaderOnly: Story = {
|
|
99
|
+
args: {
|
|
100
|
+
children: (
|
|
101
|
+
<Card.Header>
|
|
102
|
+
<Card.Title>Simple card</Card.Title>
|
|
103
|
+
</Card.Header>
|
|
104
|
+
),
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Use the `render` prop to change the underlying HTML elements for
|
|
110
|
+
* better semantics. Here, `Card.Root` renders as a `<section>` and
|
|
111
|
+
* `Card.Title` renders as an `<h2>`.
|
|
112
|
+
*/
|
|
113
|
+
export const CustomSemantics: Story = {
|
|
114
|
+
args: {
|
|
115
|
+
render: <section />,
|
|
116
|
+
children: (
|
|
117
|
+
<>
|
|
118
|
+
<Card.Header>
|
|
119
|
+
{ /* eslint-disable-next-line jsx-a11y/heading-has-content -- content provided via render prop */ }
|
|
120
|
+
<Card.Title render={ <h2 /> }>Section heading</Card.Title>
|
|
121
|
+
</Card.Header>
|
|
122
|
+
<Card.Content>
|
|
123
|
+
<Text>Semantically meaningful card content.</Text>
|
|
124
|
+
</Card.Content>
|
|
125
|
+
</>
|
|
126
|
+
),
|
|
127
|
+
},
|
|
128
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
@layer wp-ui-utilities, wp-ui-components, wp-ui-compositions, wp-ui-overrides;
|
|
2
|
+
|
|
3
|
+
@layer wp-ui-components {
|
|
4
|
+
.root {
|
|
5
|
+
--wp-ui-card-padding: var(--wpds-dimension-padding-2xl);
|
|
6
|
+
--wp-ui-card-header-content-gap: var(--wpds-dimension-gap-xl);
|
|
7
|
+
--wp-ui-card-header-content-margin: calc(var(--wp-ui-card-header-content-gap) - var(--wp-ui-card-padding));
|
|
8
|
+
|
|
9
|
+
display: flex;
|
|
10
|
+
flex-direction: column;
|
|
11
|
+
border: 1px solid var(--wpds-color-stroke-surface-neutral-weak);
|
|
12
|
+
border-radius: var(--wpds-border-radius-lg);
|
|
13
|
+
background-color: var(--wpds-color-bg-surface-neutral-strong);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* Padding is applied to the individual header/content elements to enable
|
|
17
|
+
* the higher-level `CollapsibleCard` component to be fully clickable
|
|
18
|
+
* to expand/collapse the card.
|
|
19
|
+
*/
|
|
20
|
+
.header,
|
|
21
|
+
.content {
|
|
22
|
+
padding: var(--wp-ui-card-padding);
|
|
23
|
+
|
|
24
|
+
&:not(:first-child):not(:last-child) {
|
|
25
|
+
padding-block-end: 0;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* Custom vertical gap between header and content */
|
|
30
|
+
.header + .content {
|
|
31
|
+
padding-block-start: 0;
|
|
32
|
+
margin-block-start: var(--wp-ui-card-header-content-margin);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.fullbleed {
|
|
36
|
+
margin-inline: calc(-1 * var(--wp-ui-card-padding));
|
|
37
|
+
width: calc(100% + 2 * var(--wp-ui-card-padding));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.title {
|
|
41
|
+
margin: 0;
|
|
42
|
+
font-family: var(--wpds-font-family-heading);
|
|
43
|
+
font-size: var(--wpds-font-size-lg);
|
|
44
|
+
font-weight: var(--wpds-font-weight-medium);
|
|
45
|
+
line-height: var(--wpds-font-line-height-sm);
|
|
46
|
+
color: var(--wpds-color-fg-content-neutral);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { render, screen } from '@testing-library/react';
|
|
2
|
+
import { createRef } from '@wordpress/element';
|
|
3
|
+
import * as Card from '../index';
|
|
4
|
+
|
|
5
|
+
describe( 'Card', () => {
|
|
6
|
+
describe( 'basic behaviour', () => {
|
|
7
|
+
it( 'forwards ref', () => {
|
|
8
|
+
const rootRef = createRef< HTMLDivElement >();
|
|
9
|
+
const headerRef = createRef< HTMLDivElement >();
|
|
10
|
+
const contentRef = createRef< HTMLDivElement >();
|
|
11
|
+
const fullBleedRef = createRef< HTMLDivElement >();
|
|
12
|
+
const titleRef = createRef< HTMLDivElement >();
|
|
13
|
+
|
|
14
|
+
render(
|
|
15
|
+
<Card.Root ref={ rootRef }>
|
|
16
|
+
<Card.Header ref={ headerRef }>
|
|
17
|
+
<Card.Title ref={ titleRef }>Title</Card.Title>
|
|
18
|
+
</Card.Header>
|
|
19
|
+
<Card.Content ref={ contentRef }>
|
|
20
|
+
<Card.FullBleed ref={ fullBleedRef }>
|
|
21
|
+
Full width
|
|
22
|
+
</Card.FullBleed>
|
|
23
|
+
</Card.Content>
|
|
24
|
+
</Card.Root>
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
expect( rootRef.current ).toBeInstanceOf( HTMLDivElement );
|
|
28
|
+
expect( headerRef.current ).toBeInstanceOf( HTMLDivElement );
|
|
29
|
+
expect( contentRef.current ).toBeInstanceOf( HTMLDivElement );
|
|
30
|
+
expect( fullBleedRef.current ).toBeInstanceOf( HTMLDivElement );
|
|
31
|
+
expect( titleRef.current ).toBeInstanceOf( HTMLDivElement );
|
|
32
|
+
} );
|
|
33
|
+
|
|
34
|
+
it( 'renders content', () => {
|
|
35
|
+
render(
|
|
36
|
+
<Card.Root>
|
|
37
|
+
<Card.Header>
|
|
38
|
+
<Card.Title>Card heading</Card.Title>
|
|
39
|
+
</Card.Header>
|
|
40
|
+
<Card.Content>
|
|
41
|
+
<p>Main content</p>
|
|
42
|
+
</Card.Content>
|
|
43
|
+
</Card.Root>
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
expect( screen.getByText( 'Card heading' ) ).toBeVisible();
|
|
47
|
+
expect( screen.getByText( 'Main content' ) ).toBeVisible();
|
|
48
|
+
} );
|
|
49
|
+
} );
|
|
50
|
+
|
|
51
|
+
describe( 'fullbleed', () => {
|
|
52
|
+
it( 'renders children', () => {
|
|
53
|
+
render(
|
|
54
|
+
<Card.Root>
|
|
55
|
+
<Card.Content>
|
|
56
|
+
<Card.FullBleed>
|
|
57
|
+
<img
|
|
58
|
+
src="https://example.com/image.jpg"
|
|
59
|
+
alt="test"
|
|
60
|
+
/>
|
|
61
|
+
</Card.FullBleed>
|
|
62
|
+
</Card.Content>
|
|
63
|
+
</Card.Root>
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
expect( screen.getByRole( 'img', { name: 'test' } ) ).toBeVisible();
|
|
67
|
+
} );
|
|
68
|
+
} );
|
|
69
|
+
|
|
70
|
+
describe( 'render prop', () => {
|
|
71
|
+
it( 'allows Root to render as a different element', () => {
|
|
72
|
+
render(
|
|
73
|
+
<Card.Root render={ <section /> } data-testid="card">
|
|
74
|
+
<Card.Content>Content</Card.Content>
|
|
75
|
+
</Card.Root>
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
expect( screen.getByTestId( 'card' ).tagName ).toBe( 'SECTION' );
|
|
79
|
+
} );
|
|
80
|
+
|
|
81
|
+
it( 'allows Title to render as a heading element', () => {
|
|
82
|
+
render(
|
|
83
|
+
<Card.Root>
|
|
84
|
+
<Card.Header>
|
|
85
|
+
{ /* eslint-disable-next-line jsx-a11y/heading-has-content -- content provided via render prop */ }
|
|
86
|
+
<Card.Title render={ <h2 /> }>Heading</Card.Title>
|
|
87
|
+
</Card.Header>
|
|
88
|
+
</Card.Root>
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
expect(
|
|
92
|
+
screen.getByRole( 'heading', { level: 2, name: 'Heading' } )
|
|
93
|
+
).toBeVisible();
|
|
94
|
+
} );
|
|
95
|
+
} );
|
|
96
|
+
} );
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { mergeProps, useRender } from '@base-ui/react';
|
|
2
|
+
import { forwardRef } from '@wordpress/element';
|
|
3
|
+
import styles from './style.module.css';
|
|
4
|
+
import type { TitleProps } from './types';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The title for a card. Renders as a `<div>` by default — use the `render`
|
|
8
|
+
* prop to swap in a semantic heading element when appropriate.
|
|
9
|
+
*/
|
|
10
|
+
export const Title = forwardRef< HTMLDivElement, TitleProps >(
|
|
11
|
+
function CardTitle( { render, ...props }, ref ) {
|
|
12
|
+
const element = useRender( {
|
|
13
|
+
defaultTagName: 'div',
|
|
14
|
+
render,
|
|
15
|
+
ref,
|
|
16
|
+
// TODO: use `Text` component instead, when ready
|
|
17
|
+
props: mergeProps< 'div' >( { className: styles.title }, props ),
|
|
18
|
+
} );
|
|
19
|
+
|
|
20
|
+
return element;
|
|
21
|
+
}
|
|
22
|
+
);
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { ComponentProps } from '../utils/types';
|
|
3
|
+
|
|
4
|
+
export interface RootProps extends ComponentProps< 'div' > {
|
|
5
|
+
/**
|
|
6
|
+
* The content to be rendered inside the card.
|
|
7
|
+
*/
|
|
8
|
+
children?: ReactNode;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface HeaderProps extends ComponentProps< 'div' > {
|
|
12
|
+
/**
|
|
13
|
+
* The content to be rendered inside the header.
|
|
14
|
+
*/
|
|
15
|
+
children?: ReactNode;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface ContentProps extends ComponentProps< 'div' > {
|
|
19
|
+
/**
|
|
20
|
+
* The content to be rendered inside the content area.
|
|
21
|
+
*/
|
|
22
|
+
children?: ReactNode;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface FullBleedProps extends ComponentProps< 'div' > {
|
|
26
|
+
/**
|
|
27
|
+
* The content to be rendered edge-to-edge, breaking out of the
|
|
28
|
+
* card's padding.
|
|
29
|
+
*/
|
|
30
|
+
children?: ReactNode;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface TitleProps extends ComponentProps< 'div' > {
|
|
34
|
+
/**
|
|
35
|
+
* The title text for the card.
|
|
36
|
+
*/
|
|
37
|
+
children?: ReactNode;
|
|
38
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Collapsible as _Collapsible } from '@base-ui/react/collapsible';
|
|
2
|
+
import { forwardRef } from '@wordpress/element';
|
|
3
|
+
import type { PanelProps } from './types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* A panel with the collapsible contents. Hidden when collapsed, visible
|
|
7
|
+
* when expanded.
|
|
8
|
+
*
|
|
9
|
+
* `Collapsible` is a collection of React components that combine to render
|
|
10
|
+
* a collapsible panel controlled by a button.
|
|
11
|
+
*/
|
|
12
|
+
export const Panel = forwardRef< HTMLDivElement, PanelProps >(
|
|
13
|
+
function CollapsiblePanel( props, forwardedRef ) {
|
|
14
|
+
return <_Collapsible.Panel ref={ forwardedRef } { ...props } />;
|
|
15
|
+
}
|
|
16
|
+
);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Collapsible as _Collapsible } from '@base-ui/react/collapsible';
|
|
2
|
+
import { forwardRef } from '@wordpress/element';
|
|
3
|
+
import type { RootProps } from './types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Groups all parts of the collapsible.
|
|
7
|
+
*
|
|
8
|
+
* `Collapsible` is a collection of React components that combine to render
|
|
9
|
+
* a collapsible panel controlled by a button.
|
|
10
|
+
*/
|
|
11
|
+
export const Root = forwardRef< HTMLDivElement, RootProps >(
|
|
12
|
+
function CollapsibleRoot( props, forwardedRef ) {
|
|
13
|
+
return <_Collapsible.Root ref={ forwardedRef } { ...props } />;
|
|
14
|
+
}
|
|
15
|
+
);
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { useState } from '@wordpress/element';
|
|
3
|
+
import * as Collapsible from '../index';
|
|
4
|
+
|
|
5
|
+
const meta: Meta< typeof Collapsible.Root > = {
|
|
6
|
+
title: 'Design System/Components/Collapsible',
|
|
7
|
+
component: Collapsible.Root,
|
|
8
|
+
subcomponents: {
|
|
9
|
+
'Collapsible.Trigger': Collapsible.Trigger,
|
|
10
|
+
'Collapsible.Panel': Collapsible.Panel,
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
export default meta;
|
|
14
|
+
|
|
15
|
+
type Story = StoryObj< typeof Collapsible.Root >;
|
|
16
|
+
|
|
17
|
+
export const Default: Story = {
|
|
18
|
+
args: {
|
|
19
|
+
children: (
|
|
20
|
+
<>
|
|
21
|
+
<Collapsible.Trigger>Toggle</Collapsible.Trigger>
|
|
22
|
+
<Collapsible.Panel>
|
|
23
|
+
<p>Collapsible content here.</p>
|
|
24
|
+
</Collapsible.Panel>
|
|
25
|
+
</>
|
|
26
|
+
),
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export const DefaultOpen: Story = {
|
|
31
|
+
argTypes: { open: { control: false } },
|
|
32
|
+
args: {
|
|
33
|
+
defaultOpen: true,
|
|
34
|
+
children: (
|
|
35
|
+
<>
|
|
36
|
+
<Collapsible.Trigger>Toggle</Collapsible.Trigger>
|
|
37
|
+
<Collapsible.Panel>
|
|
38
|
+
<p>This panel is open by default.</p>
|
|
39
|
+
</Collapsible.Panel>
|
|
40
|
+
</>
|
|
41
|
+
),
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export const Disabled: Story = {
|
|
46
|
+
args: {
|
|
47
|
+
disabled: true,
|
|
48
|
+
children: (
|
|
49
|
+
<>
|
|
50
|
+
<Collapsible.Trigger>Toggle (disabled)</Collapsible.Trigger>
|
|
51
|
+
<Collapsible.Panel>
|
|
52
|
+
<p>This content cannot be toggled.</p>
|
|
53
|
+
</Collapsible.Panel>
|
|
54
|
+
</>
|
|
55
|
+
),
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* When `hiddenUntilFound` is set on `Collapsible.Panel`, the collapsed content
|
|
61
|
+
* remains in the DOM using the `hidden="until-found"` HTML attribute instead of
|
|
62
|
+
* being removed entirely. This lets the browser's native page search (Ctrl/Cmd+F)
|
|
63
|
+
* find text inside collapsed panels and automatically expand them to reveal the
|
|
64
|
+
* match — improving discoverability without sacrificing the collapsed layout.
|
|
65
|
+
*/
|
|
66
|
+
export const HiddenUntilFound: Story = {
|
|
67
|
+
render: function HiddenUntilFound() {
|
|
68
|
+
return (
|
|
69
|
+
<div>
|
|
70
|
+
<p>
|
|
71
|
+
Use the browser's find-in-page (Ctrl/Cmd+F) to search
|
|
72
|
+
for "hidden treasure". The collapsed panel will
|
|
73
|
+
automatically expand to reveal the match.
|
|
74
|
+
</p>
|
|
75
|
+
<Collapsible.Root>
|
|
76
|
+
<Collapsible.Trigger>Expand to reveal</Collapsible.Trigger>
|
|
77
|
+
<Collapsible.Panel hiddenUntilFound>
|
|
78
|
+
<p>
|
|
79
|
+
This is the hidden treasure that can be found via
|
|
80
|
+
the browser's built-in page search even while
|
|
81
|
+
the panel is collapsed.
|
|
82
|
+
</p>
|
|
83
|
+
</Collapsible.Panel>
|
|
84
|
+
</Collapsible.Root>
|
|
85
|
+
</div>
|
|
86
|
+
);
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export const Controlled: Story = {
|
|
91
|
+
argTypes: {
|
|
92
|
+
open: { control: false },
|
|
93
|
+
defaultOpen: { control: false },
|
|
94
|
+
},
|
|
95
|
+
render: function Controlled() {
|
|
96
|
+
const [ open, setOpen ] = useState( false );
|
|
97
|
+
return (
|
|
98
|
+
<Collapsible.Root open={ open } onOpenChange={ setOpen }>
|
|
99
|
+
<Collapsible.Trigger>
|
|
100
|
+
{ open ? 'Close' : 'Open' }
|
|
101
|
+
</Collapsible.Trigger>
|
|
102
|
+
<Collapsible.Panel>
|
|
103
|
+
<p>Controlled collapsible panel.</p>
|
|
104
|
+
</Collapsible.Panel>
|
|
105
|
+
</Collapsible.Root>
|
|
106
|
+
);
|
|
107
|
+
},
|
|
108
|
+
};
|