@wordpress/ui 0.9.1-next.v.202603161435.0 → 0.10.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 +38 -1
- package/CONTRIBUTING.md +31 -0
- package/build/alert-dialog/context.cjs +34 -0
- package/build/alert-dialog/context.cjs.map +7 -0
- package/build/alert-dialog/index.cjs +37 -0
- package/build/alert-dialog/index.cjs.map +7 -0
- package/build/alert-dialog/popup.cjs +93 -0
- package/build/alert-dialog/popup.cjs.map +7 -0
- package/build/alert-dialog/root.cjs +52 -0
- package/build/alert-dialog/root.cjs.map +7 -0
- package/build/alert-dialog/trigger.cjs +48 -0
- package/build/alert-dialog/trigger.cjs.map +7 -0
- package/build/alert-dialog/types.cjs +19 -0
- package/build/alert-dialog/types.cjs.map +7 -0
- package/build/badge/badge.cjs +2 -2
- package/build/badge/badge.cjs.map +1 -1
- package/build/button/button.cjs +7 -7
- package/build/button/button.cjs.map +2 -2
- package/build/card/content.cjs +3 -3
- package/build/card/content.cjs.map +2 -2
- package/build/card/full-bleed.cjs +3 -3
- package/build/card/full-bleed.cjs.map +2 -2
- package/build/card/header.cjs +3 -3
- package/build/card/header.cjs.map +2 -2
- package/build/card/root.cjs +5 -5
- package/build/card/root.cjs.map +2 -2
- package/build/card/title.cjs +26 -13
- package/build/card/title.cjs.map +3 -3
- package/build/collapsible-card/content.cjs +24 -3
- package/build/collapsible-card/content.cjs.map +4 -4
- package/build/collapsible-card/context.cjs +35 -0
- package/build/collapsible-card/context.cjs.map +7 -0
- package/build/collapsible-card/header-description.cjs +52 -0
- package/build/collapsible-card/header-description.cjs.map +7 -0
- package/build/collapsible-card/header.cjs +38 -17
- package/build/collapsible-card/header.cjs.map +2 -2
- package/build/collapsible-card/index.cjs +3 -0
- package/build/collapsible-card/index.cjs.map +2 -2
- package/build/collapsible-card/types.cjs.map +1 -1
- package/build/dialog/action.cjs +4 -2
- package/build/dialog/action.cjs.map +2 -2
- package/build/dialog/close-icon.cjs +2 -1
- package/build/dialog/close-icon.cjs.map +2 -2
- 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 +22 -5
- 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/empty-state/actions.cjs +66 -0
- package/build/empty-state/actions.cjs.map +7 -0
- package/build/empty-state/description.cjs +66 -0
- package/build/empty-state/description.cjs.map +7 -0
- package/build/empty-state/icon.cjs +69 -0
- package/build/empty-state/icon.cjs.map +7 -0
- package/build/empty-state/index.cjs +46 -0
- package/build/empty-state/index.cjs.map +7 -0
- package/build/empty-state/root.cjs +66 -0
- package/build/empty-state/root.cjs.map +7 -0
- package/build/empty-state/title.cjs +68 -0
- package/build/empty-state/title.cjs.map +7 -0
- package/build/empty-state/types.cjs +19 -0
- package/build/empty-state/types.cjs.map +7 -0
- package/build/empty-state/visual.cjs +66 -0
- package/build/empty-state/visual.cjs.map +7 -0
- package/build/form/index.cjs +27 -0
- package/build/form/index.cjs.map +7 -0
- package/build/form/input-control/index.cjs +31 -0
- package/build/form/input-control/index.cjs.map +7 -0
- package/build/form/input-control/input-control.cjs +50 -0
- package/build/form/input-control/input-control.cjs.map +7 -0
- package/build/form/input-control/types.cjs +19 -0
- package/build/form/input-control/types.cjs.map +7 -0
- package/build/form/primitives/field/description.cjs +2 -2
- package/build/form/primitives/field/description.cjs.map +1 -1
- package/build/form/primitives/field/details.cjs +2 -2
- package/build/form/primitives/field/details.cjs.map +1 -1
- package/build/form/primitives/field/label.cjs +2 -2
- package/build/form/primitives/field/label.cjs.map +1 -1
- package/build/form/primitives/field/root.cjs +4 -4
- package/build/form/primitives/field/root.cjs.map +2 -2
- package/build/form/primitives/fieldset/description.cjs +2 -2
- package/build/form/primitives/fieldset/description.cjs.map +1 -1
- package/build/form/primitives/fieldset/details.cjs +2 -2
- package/build/form/primitives/fieldset/details.cjs.map +1 -1
- package/build/form/primitives/fieldset/legend.cjs +2 -2
- package/build/form/primitives/fieldset/legend.cjs.map +1 -1
- package/build/form/primitives/fieldset/root.cjs +2 -2
- package/build/form/primitives/fieldset/root.cjs.map +1 -1
- package/build/form/primitives/input/input.cjs +4 -4
- package/build/form/primitives/input/input.cjs.map +1 -1
- package/build/form/primitives/input-layout/input-layout.cjs +4 -4
- package/build/form/primitives/input-layout/input-layout.cjs.map +1 -1
- package/build/form/primitives/input-layout/slot.cjs +5 -4
- package/build/form/primitives/input-layout/slot.cjs.map +2 -2
- package/build/form/primitives/select/item.cjs +5 -5
- package/build/form/primitives/select/item.cjs.map +2 -2
- package/build/form/primitives/select/popup.cjs +7 -7
- package/build/form/primitives/select/popup.cjs.map +2 -2
- package/build/form/primitives/select/trigger.cjs +5 -5
- package/build/form/primitives/select/trigger.cjs.map +2 -2
- package/build/form/primitives/textarea/textarea.cjs +3 -3
- package/build/form/primitives/textarea/textarea.cjs.map +2 -2
- package/build/form/types.cjs +19 -0
- package/build/form/types.cjs.map +7 -0
- package/build/icon-button/icon-button.cjs +2 -2
- package/build/icon-button/icon-button.cjs.map +1 -1
- package/build/index.cjs +8 -2
- package/build/index.cjs.map +2 -2
- package/build/link/link.cjs +6 -6
- package/build/link/link.cjs.map +1 -1
- package/build/notice/action-button.cjs +2 -2
- package/build/notice/action-button.cjs.map +1 -1
- package/build/notice/action-link.cjs +2 -2
- package/build/notice/action-link.cjs.map +1 -1
- package/build/notice/actions.cjs +2 -2
- package/build/notice/actions.cjs.map +1 -1
- package/build/notice/close-icon.cjs +2 -2
- package/build/notice/close-icon.cjs.map +1 -1
- package/build/notice/description.cjs +2 -2
- package/build/notice/description.cjs.map +1 -1
- package/build/notice/index.cjs.map +1 -1
- package/build/notice/root.cjs +4 -4
- package/build/notice/root.cjs.map +1 -1
- package/build/notice/title.cjs +2 -2
- package/build/notice/title.cjs.map +1 -1
- package/build/stack/stack.cjs +2 -2
- package/build/stack/stack.cjs.map +1 -1
- package/build/tabs/context.cjs +121 -0
- package/build/tabs/context.cjs.map +7 -0
- package/build/tabs/list.cjs +3 -3
- package/build/tabs/list.cjs.map +2 -2
- package/build/tabs/panel.cjs +5 -3
- package/build/tabs/panel.cjs.map +2 -2
- package/build/tabs/root.cjs +2 -1
- package/build/tabs/root.cjs.map +2 -2
- package/build/tabs/tab.cjs +5 -3
- package/build/tabs/tab.cjs.map +2 -2
- package/build/text/text.cjs +2 -2
- package/build/text/text.cjs.map +1 -1
- package/build/tooltip/popup.cjs +4 -4
- package/build/tooltip/popup.cjs.map +1 -1
- package/build/tooltip/root.cjs.map +2 -2
- package/build/utils/use-deprioritized-initial-focus.cjs +64 -0
- package/build/utils/use-deprioritized-initial-focus.cjs.map +7 -0
- package/build/visually-hidden/visually-hidden.cjs +2 -2
- package/build/visually-hidden/visually-hidden.cjs.map +1 -1
- package/build-module/alert-dialog/context.mjs +9 -0
- package/build-module/alert-dialog/context.mjs.map +7 -0
- package/build-module/alert-dialog/index.mjs +10 -0
- package/build-module/alert-dialog/index.mjs.map +7 -0
- package/build-module/alert-dialog/popup.mjs +58 -0
- package/build-module/alert-dialog/popup.mjs.map +7 -0
- package/build-module/alert-dialog/root.mjs +27 -0
- package/build-module/alert-dialog/root.mjs.map +7 -0
- package/build-module/alert-dialog/trigger.mjs +13 -0
- package/build-module/alert-dialog/trigger.mjs.map +7 -0
- package/build-module/alert-dialog/types.mjs +1 -0
- package/build-module/alert-dialog/types.mjs.map +7 -0
- package/build-module/badge/badge.mjs +2 -2
- package/build-module/badge/badge.mjs.map +1 -1
- package/build-module/button/button.mjs +7 -7
- package/build-module/button/button.mjs.map +2 -2
- package/build-module/card/content.mjs +3 -3
- package/build-module/card/content.mjs.map +2 -2
- package/build-module/card/full-bleed.mjs +3 -3
- package/build-module/card/full-bleed.mjs.map +2 -2
- package/build-module/card/header.mjs +3 -3
- package/build-module/card/header.mjs.map +2 -2
- package/build-module/card/root.mjs +5 -5
- package/build-module/card/root.mjs.map +2 -2
- package/build-module/card/title.mjs +16 -13
- package/build-module/card/title.mjs.map +2 -2
- package/build-module/collapsible-card/content.mjs +24 -3
- package/build-module/collapsible-card/content.mjs.map +3 -3
- package/build-module/collapsible-card/context.mjs +10 -0
- package/build-module/collapsible-card/context.mjs.map +7 -0
- package/build-module/collapsible-card/header-description.mjs +27 -0
- package/build-module/collapsible-card/header-description.mjs.map +7 -0
- package/build-module/collapsible-card/header.mjs +39 -18
- package/build-module/collapsible-card/header.mjs.map +2 -2
- package/build-module/collapsible-card/index.mjs +2 -0
- package/build-module/collapsible-card/index.mjs.map +2 -2
- package/build-module/dialog/action.mjs +4 -2
- package/build-module/dialog/action.mjs.map +2 -2
- package/build-module/dialog/close-icon.mjs +2 -1
- package/build-module/dialog/close-icon.mjs.map +2 -2
- 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 +22 -5
- 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/empty-state/actions.mjs +31 -0
- package/build-module/empty-state/actions.mjs.map +7 -0
- package/build-module/empty-state/description.mjs +31 -0
- package/build-module/empty-state/description.mjs.map +7 -0
- package/build-module/empty-state/icon.mjs +34 -0
- package/build-module/empty-state/icon.mjs.map +7 -0
- package/build-module/empty-state/index.mjs +16 -0
- package/build-module/empty-state/index.mjs.map +7 -0
- package/build-module/empty-state/root.mjs +31 -0
- package/build-module/empty-state/root.mjs.map +7 -0
- package/build-module/empty-state/title.mjs +33 -0
- package/build-module/empty-state/title.mjs.map +7 -0
- package/build-module/empty-state/types.mjs +1 -0
- package/build-module/empty-state/types.mjs.map +7 -0
- package/build-module/empty-state/visual.mjs +31 -0
- package/build-module/empty-state/visual.mjs.map +7 -0
- package/build-module/form/index.mjs +4 -0
- package/build-module/form/index.mjs.map +7 -0
- package/build-module/form/input-control/index.mjs +6 -0
- package/build-module/form/input-control/index.mjs.map +7 -0
- package/build-module/form/input-control/input-control.mjs +25 -0
- package/build-module/form/input-control/input-control.mjs.map +7 -0
- package/build-module/form/input-control/types.mjs +1 -0
- package/build-module/form/input-control/types.mjs.map +7 -0
- package/build-module/form/primitives/field/description.mjs +2 -2
- package/build-module/form/primitives/field/description.mjs.map +1 -1
- package/build-module/form/primitives/field/details.mjs +2 -2
- package/build-module/form/primitives/field/details.mjs.map +1 -1
- package/build-module/form/primitives/field/label.mjs +2 -2
- package/build-module/form/primitives/field/label.mjs.map +1 -1
- package/build-module/form/primitives/field/root.mjs +4 -4
- package/build-module/form/primitives/field/root.mjs.map +2 -2
- package/build-module/form/primitives/fieldset/description.mjs +2 -2
- package/build-module/form/primitives/fieldset/description.mjs.map +1 -1
- package/build-module/form/primitives/fieldset/details.mjs +2 -2
- package/build-module/form/primitives/fieldset/details.mjs.map +1 -1
- package/build-module/form/primitives/fieldset/legend.mjs +2 -2
- package/build-module/form/primitives/fieldset/legend.mjs.map +1 -1
- package/build-module/form/primitives/fieldset/root.mjs +2 -2
- package/build-module/form/primitives/fieldset/root.mjs.map +1 -1
- package/build-module/form/primitives/input/input.mjs +4 -4
- package/build-module/form/primitives/input/input.mjs.map +1 -1
- package/build-module/form/primitives/input-layout/input-layout.mjs +4 -4
- package/build-module/form/primitives/input-layout/input-layout.mjs.map +1 -1
- package/build-module/form/primitives/input-layout/slot.mjs +5 -4
- package/build-module/form/primitives/input-layout/slot.mjs.map +2 -2
- package/build-module/form/primitives/select/item.mjs +5 -5
- package/build-module/form/primitives/select/item.mjs.map +2 -2
- package/build-module/form/primitives/select/popup.mjs +7 -7
- package/build-module/form/primitives/select/popup.mjs.map +2 -2
- package/build-module/form/primitives/select/trigger.mjs +5 -5
- package/build-module/form/primitives/select/trigger.mjs.map +2 -2
- package/build-module/form/primitives/textarea/textarea.mjs +3 -3
- package/build-module/form/primitives/textarea/textarea.mjs.map +2 -2
- package/build-module/form/types.mjs +1 -0
- package/build-module/form/types.mjs.map +7 -0
- package/build-module/icon-button/icon-button.mjs +2 -2
- package/build-module/icon-button/icon-button.mjs.map +1 -1
- package/build-module/index.mjs +5 -1
- package/build-module/index.mjs.map +2 -2
- package/build-module/link/link.mjs +6 -6
- package/build-module/link/link.mjs.map +1 -1
- package/build-module/notice/action-button.mjs +2 -2
- package/build-module/notice/action-button.mjs.map +1 -1
- package/build-module/notice/action-link.mjs +2 -2
- package/build-module/notice/action-link.mjs.map +1 -1
- package/build-module/notice/actions.mjs +2 -2
- package/build-module/notice/actions.mjs.map +1 -1
- package/build-module/notice/close-icon.mjs +2 -2
- package/build-module/notice/close-icon.mjs.map +1 -1
- package/build-module/notice/description.mjs +2 -2
- package/build-module/notice/description.mjs.map +1 -1
- package/build-module/notice/index.mjs.map +1 -1
- package/build-module/notice/root.mjs +4 -4
- package/build-module/notice/root.mjs.map +1 -1
- package/build-module/notice/title.mjs +2 -2
- package/build-module/notice/title.mjs.map +1 -1
- package/build-module/stack/stack.mjs +2 -2
- package/build-module/stack/stack.mjs.map +1 -1
- package/build-module/tabs/context.mjs +101 -0
- package/build-module/tabs/context.mjs.map +7 -0
- package/build-module/tabs/list.mjs +3 -3
- package/build-module/tabs/list.mjs.map +2 -2
- package/build-module/tabs/panel.mjs +5 -3
- package/build-module/tabs/panel.mjs.map +2 -2
- package/build-module/tabs/root.mjs +2 -1
- package/build-module/tabs/root.mjs.map +2 -2
- package/build-module/tabs/tab.mjs +5 -3
- package/build-module/tabs/tab.mjs.map +2 -2
- package/build-module/text/text.mjs +2 -2
- package/build-module/text/text.mjs.map +1 -1
- package/build-module/tooltip/popup.mjs +4 -4
- package/build-module/tooltip/popup.mjs.map +1 -1
- package/build-module/tooltip/root.mjs.map +2 -2
- package/build-module/utils/use-deprioritized-initial-focus.mjs +39 -0
- package/build-module/utils/use-deprioritized-initial-focus.mjs.map +7 -0
- package/build-module/visually-hidden/visually-hidden.mjs +2 -2
- package/build-module/visually-hidden/visually-hidden.mjs.map +1 -1
- package/build-types/alert-dialog/context.d.ts +8 -0
- package/build-types/alert-dialog/context.d.ts.map +1 -0
- package/build-types/alert-dialog/index.d.ts +4 -0
- package/build-types/alert-dialog/index.d.ts.map +1 -0
- package/build-types/alert-dialog/popup.d.ts +4 -0
- package/build-types/alert-dialog/popup.d.ts.map +1 -0
- package/build-types/alert-dialog/root.d.ts +24 -0
- package/build-types/alert-dialog/root.d.ts.map +1 -0
- package/build-types/alert-dialog/stories/index.story.d.ts +44 -0
- package/build-types/alert-dialog/stories/index.story.d.ts.map +1 -0
- package/build-types/alert-dialog/test/index.test.d.ts +2 -0
- package/build-types/alert-dialog/test/index.test.d.ts.map +1 -0
- package/build-types/alert-dialog/trigger.d.ts +6 -0
- package/build-types/alert-dialog/trigger.d.ts.map +1 -0
- package/build-types/alert-dialog/types.d.ts +70 -0
- package/build-types/alert-dialog/types.d.ts.map +1 -0
- package/build-types/card/title.d.ts.map +1 -1
- package/build-types/collapsible-card/content.d.ts.map +1 -1
- package/build-types/collapsible-card/context.d.ts +4 -0
- package/build-types/collapsible-card/context.d.ts.map +1 -0
- package/build-types/collapsible-card/header-description.d.ts +15 -0
- package/build-types/collapsible-card/header-description.d.ts.map +1 -0
- package/build-types/collapsible-card/header.d.ts.map +1 -1
- package/build-types/collapsible-card/index.d.ts +2 -1
- package/build-types/collapsible-card/index.d.ts.map +1 -1
- package/build-types/collapsible-card/stories/index.story.d.ts +10 -0
- package/build-types/collapsible-card/stories/index.story.d.ts.map +1 -1
- package/build-types/collapsible-card/types.d.ts +21 -0
- package/build-types/collapsible-card/types.d.ts.map +1 -1
- package/build-types/dialog/action.d.ts.map +1 -1
- package/build-types/dialog/close-icon.d.ts.map +1 -1
- package/build-types/dialog/popup.d.ts.map +1 -1
- package/build-types/dialog/stories/index.story.d.ts +0 -6
- package/build-types/dialog/stories/index.story.d.ts.map +1 -1
- package/build-types/dialog/types.d.ts +5 -5
- package/build-types/dialog/types.d.ts.map +1 -1
- package/build-types/empty-state/actions.d.ts +7 -0
- package/build-types/empty-state/actions.d.ts.map +1 -0
- package/build-types/empty-state/description.d.ts +7 -0
- package/build-types/empty-state/description.d.ts.map +1 -0
- package/build-types/empty-state/icon.d.ts +7 -0
- package/build-types/empty-state/icon.d.ts.map +1 -0
- package/build-types/empty-state/index.d.ts +8 -0
- package/build-types/empty-state/index.d.ts.map +1 -0
- package/build-types/empty-state/root.d.ts +6 -0
- package/build-types/empty-state/root.d.ts.map +1 -0
- package/build-types/empty-state/stories/index.story.d.ts +8 -0
- package/build-types/empty-state/stories/index.story.d.ts.map +1 -0
- package/build-types/empty-state/test/actions.test.d.ts +2 -0
- package/build-types/empty-state/test/actions.test.d.ts.map +1 -0
- package/build-types/empty-state/test/description.test.d.ts +2 -0
- package/build-types/empty-state/test/description.test.d.ts.map +1 -0
- package/build-types/empty-state/test/icon.test.d.ts +2 -0
- package/build-types/empty-state/test/icon.test.d.ts.map +1 -0
- package/build-types/empty-state/test/root.test.d.ts +2 -0
- package/build-types/empty-state/test/root.test.d.ts.map +1 -0
- package/build-types/empty-state/test/title.test.d.ts +2 -0
- package/build-types/empty-state/test/title.test.d.ts.map +1 -0
- package/build-types/empty-state/test/visual.test.d.ts +2 -0
- package/build-types/empty-state/test/visual.test.d.ts.map +1 -0
- package/build-types/empty-state/title.d.ts +6 -0
- package/build-types/empty-state/title.d.ts.map +1 -0
- package/build-types/empty-state/types.d.ts +40 -0
- package/build-types/empty-state/types.d.ts.map +1 -0
- package/build-types/empty-state/visual.d.ts +7 -0
- package/build-types/empty-state/visual.d.ts.map +1 -0
- package/build-types/form/index.d.ts +3 -0
- package/build-types/form/index.d.ts.map +1 -0
- package/build-types/form/input-control/index.d.ts +2 -0
- package/build-types/form/input-control/index.d.ts.map +1 -0
- package/build-types/form/input-control/input-control.d.ts +6 -0
- package/build-types/form/input-control/input-control.d.ts.map +1 -0
- package/build-types/form/input-control/stories/index.story.d.ts +16 -0
- package/build-types/form/input-control/stories/index.story.d.ts.map +1 -0
- package/build-types/form/input-control/test/index.test.d.ts +2 -0
- package/build-types/form/input-control/test/index.test.d.ts.map +1 -0
- package/build-types/form/input-control/types.d.ts +4 -0
- package/build-types/form/input-control/types.d.ts.map +1 -0
- package/build-types/form/primitives/field/stories/index.story.d.ts.map +1 -1
- package/build-types/form/primitives/fieldset/stories/index.story.d.ts.map +1 -1
- package/build-types/form/primitives/input/stories/index.story.d.ts +2 -0
- package/build-types/form/primitives/input/stories/index.story.d.ts.map +1 -1
- package/build-types/form/primitives/input-layout/slot.d.ts.map +1 -1
- package/build-types/form/primitives/input-layout/stories/index.story.d.ts +5 -0
- package/build-types/form/primitives/input-layout/stories/index.story.d.ts.map +1 -1
- package/build-types/form/stories/shared.d.ts +3 -0
- package/build-types/form/stories/shared.d.ts.map +1 -0
- package/build-types/form/types.d.ts +30 -0
- package/build-types/form/types.d.ts.map +1 -0
- package/build-types/index.d.ts +3 -1
- package/build-types/index.d.ts.map +1 -1
- package/build-types/notice/index.d.ts +0 -1
- package/build-types/notice/index.d.ts.map +1 -1
- package/build-types/tabs/context.d.ts +26 -0
- package/build-types/tabs/context.d.ts.map +1 -0
- package/build-types/tabs/panel.d.ts.map +1 -1
- package/build-types/tabs/root.d.ts.map +1 -1
- package/build-types/tabs/tab.d.ts.map +1 -1
- package/build-types/tooltip/root.d.ts +12 -0
- package/build-types/tooltip/root.d.ts.map +1 -1
- package/build-types/tooltip/stories/index.story.d.ts.map +1 -1
- package/build-types/utils/test/use-deprioritized-initial-focus.test.d.ts +2 -0
- package/build-types/utils/test/use-deprioritized-initial-focus.test.d.ts.map +1 -0
- package/build-types/utils/use-deprioritized-initial-focus.d.ts +35 -0
- package/build-types/utils/use-deprioritized-initial-focus.d.ts.map +1 -0
- package/package.json +17 -16
- package/src/alert-dialog/context.tsx +14 -0
- package/src/alert-dialog/index.ts +3 -0
- package/src/alert-dialog/popup.tsx +58 -0
- package/src/alert-dialog/root.tsx +48 -0
- package/src/alert-dialog/stories/index.story.tsx +254 -0
- package/src/alert-dialog/style.module.css +10 -0
- package/src/alert-dialog/test/index.test.tsx +537 -0
- package/src/alert-dialog/trigger.tsx +15 -0
- package/src/alert-dialog/types.ts +83 -0
- package/src/button/style.module.css +2 -0
- package/src/card/stories/index.story.tsx +1 -1
- package/src/card/style.module.css +3 -5
- package/src/card/title.tsx +12 -11
- package/src/collapsible-card/content.tsx +16 -3
- package/src/collapsible-card/context.ts +7 -0
- package/src/collapsible-card/header-description.tsx +43 -0
- package/src/collapsible-card/header.tsx +47 -24
- package/src/collapsible-card/index.ts +2 -1
- package/src/collapsible-card/stories/index.story.tsx +99 -1
- package/src/collapsible-card/style.module.css +34 -2
- package/src/collapsible-card/test/index.test.tsx +96 -9
- package/src/collapsible-card/types.ts +22 -0
- package/src/dialog/action.tsx +8 -2
- package/src/dialog/close-icon.tsx +1 -0
- package/src/dialog/popup.tsx +21 -2
- package/src/dialog/stories/index.story.tsx +0 -28
- package/src/dialog/style.module.css +5 -5
- package/src/dialog/test/index.test.tsx +117 -0
- package/src/dialog/types.ts +11 -5
- package/src/empty-state/actions.tsx +24 -0
- package/src/empty-state/description.tsx +27 -0
- package/src/empty-state/icon.tsx +24 -0
- package/src/empty-state/index.ts +8 -0
- package/src/empty-state/root.tsx +23 -0
- package/src/empty-state/stories/index.story.tsx +64 -0
- package/src/empty-state/style.module.css +53 -0
- package/src/empty-state/test/actions.test.tsx +18 -0
- package/src/empty-state/test/description.test.tsx +13 -0
- package/src/empty-state/test/icon.test.tsx +13 -0
- package/src/empty-state/test/root.test.tsx +13 -0
- package/src/empty-state/test/title.test.tsx +13 -0
- package/src/empty-state/test/visual.test.tsx +17 -0
- package/src/empty-state/title.tsx +23 -0
- package/src/empty-state/types.ts +45 -0
- package/src/empty-state/visual.tsx +24 -0
- package/src/form/index.ts +3 -0
- package/src/form/input-control/index.ts +1 -0
- package/src/form/input-control/input-control.tsx +33 -0
- package/src/form/input-control/stories/index.story.tsx +163 -0
- package/src/form/input-control/test/index.test.tsx +53 -0
- package/src/form/input-control/types.ts +5 -0
- package/src/form/primitives/field/root.tsx +2 -2
- package/src/form/primitives/field/stories/index.story.tsx +2 -7
- package/src/form/primitives/fieldset/stories/index.story.tsx +2 -7
- package/src/form/primitives/input/stories/index.story.tsx +7 -0
- package/src/form/primitives/input-layout/slot.tsx +6 -2
- package/src/form/primitives/input-layout/stories/index.story.tsx +22 -1
- package/src/form/primitives/stories/overview.mdx +15 -0
- package/src/form/primitives/textarea/textarea.tsx +1 -1
- package/src/form/stories/shared.tsx +19 -0
- package/src/form/types.ts +34 -0
- package/src/index.ts +3 -1
- package/src/notice/index.ts +0 -2
- package/src/notice/style.module.css +1 -1
- package/src/tabs/context.tsx +170 -0
- package/src/tabs/panel.tsx +3 -0
- package/src/tabs/root.tsx +6 -1
- package/src/tabs/style.module.css +1 -1
- package/src/tabs/tab.tsx +3 -0
- package/src/tabs/test/index.test.tsx +162 -0
- package/src/tooltip/root.tsx +12 -0
- package/src/tooltip/stories/index.story.tsx +20 -15
- package/src/utils/css/item-popup.module.css +1 -0
- package/src/utils/css/select-trigger.module.css +1 -0
- package/src/utils/test/use-deprioritized-initial-focus.test.tsx +230 -0
- package/src/utils/use-deprioritized-initial-focus.ts +83 -0
package/src/card/title.tsx
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { mergeProps, useRender } from '@base-ui/react';
|
|
2
1
|
import { forwardRef } from '@wordpress/element';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import { Text } from '../text';
|
|
3
4
|
import styles from './style.module.css';
|
|
4
5
|
import type { TitleProps } from './types';
|
|
5
6
|
|
|
@@ -8,15 +9,15 @@ import type { TitleProps } from './types';
|
|
|
8
9
|
* prop to swap in a semantic heading element when appropriate.
|
|
9
10
|
*/
|
|
10
11
|
export const Title = forwardRef< HTMLDivElement, TitleProps >(
|
|
11
|
-
function CardTitle( { render, ...props }, ref ) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
12
|
+
function CardTitle( { className, render, children, ...props }, ref ) {
|
|
13
|
+
return (
|
|
14
|
+
<Text
|
|
15
|
+
variant="heading-lg"
|
|
16
|
+
render={ render ?? <div ref={ ref } { ...props } /> }
|
|
17
|
+
className={ clsx( styles.title, className ) }
|
|
18
|
+
>
|
|
19
|
+
{ children }
|
|
20
|
+
</Text>
|
|
21
|
+
);
|
|
21
22
|
}
|
|
22
23
|
);
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { forwardRef } from '@wordpress/element';
|
|
2
|
+
import clsx from 'clsx';
|
|
2
3
|
import * as Card from '../card';
|
|
3
4
|
import * as Collapsible from '../collapsible';
|
|
5
|
+
import styles from './style.module.css';
|
|
4
6
|
import type { ContentProps } from './types';
|
|
5
7
|
|
|
6
8
|
/**
|
|
@@ -8,13 +10,24 @@ import type { ContentProps } from './types';
|
|
|
8
10
|
* visible when expanded.
|
|
9
11
|
*/
|
|
10
12
|
export const Content = forwardRef< HTMLDivElement, ContentProps >(
|
|
11
|
-
function CollapsibleCardContent(
|
|
13
|
+
function CollapsibleCardContent(
|
|
14
|
+
{ className, render, children, hiddenUntilFound = true, ...restProps },
|
|
15
|
+
ref
|
|
16
|
+
) {
|
|
12
17
|
return (
|
|
13
18
|
<Collapsible.Panel
|
|
14
19
|
ref={ ref }
|
|
15
|
-
|
|
20
|
+
className={ clsx( styles.content, className ) }
|
|
21
|
+
hiddenUntilFound={ hiddenUntilFound }
|
|
16
22
|
{ ...restProps }
|
|
17
|
-
|
|
23
|
+
>
|
|
24
|
+
<Card.Content
|
|
25
|
+
className={ styles[ 'content-inner' ] }
|
|
26
|
+
render={ render }
|
|
27
|
+
>
|
|
28
|
+
{ children }
|
|
29
|
+
</Card.Content>
|
|
30
|
+
</Collapsible.Panel>
|
|
18
31
|
);
|
|
19
32
|
}
|
|
20
33
|
);
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { forwardRef, useContext, useEffect, useId } from '@wordpress/element';
|
|
2
|
+
import { HeaderDescriptionIdContext } from './context';
|
|
3
|
+
import type { HeaderDescriptionProps } from './types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Secondary content placed in the collapsible card header that describes
|
|
7
|
+
* the trigger button via `aria-describedby`. Use it for supplementary
|
|
8
|
+
* information such as status badges or summary values.
|
|
9
|
+
*
|
|
10
|
+
* The content is visually rendered but marked `aria-hidden` so that
|
|
11
|
+
* assistive technologies consume it only through the `aria-describedby`
|
|
12
|
+
* relationship on the trigger, avoiding double announcements.
|
|
13
|
+
*
|
|
14
|
+
* Avoid interactive elements (buttons, links, inputs) inside this
|
|
15
|
+
* component — the entire header is the toggle trigger.
|
|
16
|
+
*/
|
|
17
|
+
export const HeaderDescription = forwardRef<
|
|
18
|
+
HTMLDivElement,
|
|
19
|
+
HeaderDescriptionProps
|
|
20
|
+
>( function CollapsibleCardHeaderDescription(
|
|
21
|
+
{ children, className, ...restProps },
|
|
22
|
+
ref
|
|
23
|
+
) {
|
|
24
|
+
const descriptionId = useId();
|
|
25
|
+
const { setDescriptionId } = useContext( HeaderDescriptionIdContext );
|
|
26
|
+
|
|
27
|
+
useEffect( () => {
|
|
28
|
+
setDescriptionId( descriptionId );
|
|
29
|
+
return () => setDescriptionId( undefined );
|
|
30
|
+
}, [ descriptionId, setDescriptionId ] );
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<div
|
|
34
|
+
ref={ ref }
|
|
35
|
+
id={ descriptionId }
|
|
36
|
+
aria-hidden="true"
|
|
37
|
+
className={ className }
|
|
38
|
+
{ ...restProps }
|
|
39
|
+
>
|
|
40
|
+
{ children }
|
|
41
|
+
</div>
|
|
42
|
+
);
|
|
43
|
+
} );
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import clsx from 'clsx';
|
|
2
|
-
import { forwardRef } from '@wordpress/element';
|
|
2
|
+
import { forwardRef, useMemo, useState } from '@wordpress/element';
|
|
3
3
|
import { chevronDown } from '@wordpress/icons';
|
|
4
4
|
import * as Card from '../card';
|
|
5
5
|
import * as Collapsible from '../collapsible';
|
|
6
6
|
import { Icon } from '../icon';
|
|
7
7
|
import styles from './style.module.css';
|
|
8
8
|
import focusStyles from '../utils/css/focus.module.css';
|
|
9
|
+
import { HeaderDescriptionIdContext } from './context';
|
|
9
10
|
import type { HeaderProps } from './types';
|
|
10
11
|
|
|
11
12
|
/**
|
|
@@ -22,32 +23,54 @@ export const Header = forwardRef< HTMLDivElement, HeaderProps >(
|
|
|
22
23
|
{ children, className, render, ...restProps },
|
|
23
24
|
ref
|
|
24
25
|
) {
|
|
26
|
+
const [ descriptionId, setDescriptionId ] = useState< string >();
|
|
27
|
+
|
|
28
|
+
const contextValue = useMemo(
|
|
29
|
+
() => ( { setDescriptionId } ),
|
|
30
|
+
[ setDescriptionId ]
|
|
31
|
+
);
|
|
32
|
+
|
|
25
33
|
return (
|
|
26
|
-
<
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
<
|
|
40
|
-
|
|
34
|
+
<HeaderDescriptionIdContext.Provider value={ contextValue }>
|
|
35
|
+
<Collapsible.Trigger
|
|
36
|
+
className={ clsx( styles.header, className ) }
|
|
37
|
+
render={
|
|
38
|
+
<Card.Header
|
|
39
|
+
ref={ ref }
|
|
40
|
+
render={ render }
|
|
41
|
+
{ ...restProps }
|
|
42
|
+
/>
|
|
43
|
+
}
|
|
44
|
+
nativeButton={ false }
|
|
45
|
+
aria-describedby={ descriptionId }
|
|
46
|
+
>
|
|
47
|
+
<div className={ styles[ 'header-content' ] }>
|
|
48
|
+
{ children }
|
|
49
|
+
</div>
|
|
50
|
+
<div
|
|
41
51
|
className={ clsx(
|
|
42
|
-
styles[ 'header-trigger' ]
|
|
43
|
-
// While the interactive trigger element is the whole header,
|
|
44
|
-
// the focus ring will be displayed only on the icon to visually
|
|
45
|
-
// emulate it being the button.
|
|
46
|
-
focusStyles[ 'outset-ring--focus-parent-visible' ]
|
|
52
|
+
styles[ 'header-trigger-positioner' ]
|
|
47
53
|
) }
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
54
|
+
>
|
|
55
|
+
<div
|
|
56
|
+
className={ clsx(
|
|
57
|
+
styles[ 'header-trigger-wrapper' ],
|
|
58
|
+
// While the interactive trigger element is the whole header,
|
|
59
|
+
// the focus ring will be displayed only on the icon to visually
|
|
60
|
+
// emulate it being the button.
|
|
61
|
+
focusStyles[
|
|
62
|
+
'outset-ring--focus-parent-visible'
|
|
63
|
+
]
|
|
64
|
+
) }
|
|
65
|
+
>
|
|
66
|
+
<Icon
|
|
67
|
+
icon={ chevronDown }
|
|
68
|
+
className={ styles[ 'header-trigger' ] }
|
|
69
|
+
/>
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
</Collapsible.Trigger>
|
|
73
|
+
</HeaderDescriptionIdContext.Provider>
|
|
51
74
|
);
|
|
52
75
|
}
|
|
53
76
|
);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
2
|
import * as Card from '../../card';
|
|
3
3
|
import * as CollapsibleCard from '../index';
|
|
4
|
+
import { Stack } from '../../stack';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Temporary text component for story examples. This will be replaced by an
|
|
@@ -11,7 +12,7 @@ function Text( { children }: { children: React.ReactNode } ) {
|
|
|
11
12
|
<p
|
|
12
13
|
style={ {
|
|
13
14
|
margin: 0,
|
|
14
|
-
fontFamily:
|
|
15
|
+
fontFamily: 'var(--wpds-font-family-body)',
|
|
15
16
|
fontSize: 'var(--wpds-font-size-md)',
|
|
16
17
|
fontWeight: 'var(--wpds-font-weight-regular)',
|
|
17
18
|
lineHeight: 'var(--wpds-font-line-height-sm)',
|
|
@@ -29,6 +30,7 @@ const meta: Meta< typeof CollapsibleCard.Root > = {
|
|
|
29
30
|
component: CollapsibleCard.Root,
|
|
30
31
|
subcomponents: {
|
|
31
32
|
'CollapsibleCard.Header': CollapsibleCard.Header,
|
|
33
|
+
'CollapsibleCard.HeaderDescription': CollapsibleCard.HeaderDescription,
|
|
32
34
|
'CollapsibleCard.Content': CollapsibleCard.Content,
|
|
33
35
|
},
|
|
34
36
|
};
|
|
@@ -105,6 +107,102 @@ export const Disabled: Story = {
|
|
|
105
107
|
},
|
|
106
108
|
};
|
|
107
109
|
|
|
110
|
+
/**
|
|
111
|
+
* Multiple collapsible cards stacked vertically, simulating a typical
|
|
112
|
+
* settings-panel or FAQ-style layout.
|
|
113
|
+
*/
|
|
114
|
+
export const Stacked: Story = {
|
|
115
|
+
parameters: { controls: { disable: true } },
|
|
116
|
+
render: () => (
|
|
117
|
+
<div
|
|
118
|
+
style={ {
|
|
119
|
+
display: 'flex',
|
|
120
|
+
flexDirection: 'column',
|
|
121
|
+
gap: 'var(--wpds-dimension-gap-lg)',
|
|
122
|
+
} }
|
|
123
|
+
>
|
|
124
|
+
{ [
|
|
125
|
+
'General',
|
|
126
|
+
'Advanced',
|
|
127
|
+
'Accessibility',
|
|
128
|
+
'Performance',
|
|
129
|
+
'Privacy',
|
|
130
|
+
'Notifications',
|
|
131
|
+
].map( ( title ) => (
|
|
132
|
+
<CollapsibleCard.Root key={ title }>
|
|
133
|
+
<CollapsibleCard.Header>
|
|
134
|
+
<Card.Title>{ title }</Card.Title>
|
|
135
|
+
</CollapsibleCard.Header>
|
|
136
|
+
<CollapsibleCard.Content>
|
|
137
|
+
<Text>
|
|
138
|
+
Configure all { title.toLowerCase() } settings for
|
|
139
|
+
your site. Changes here affect how your site behaves
|
|
140
|
+
across all pages and posts.
|
|
141
|
+
</Text>
|
|
142
|
+
<Text>
|
|
143
|
+
Review each option carefully before saving. Some
|
|
144
|
+
changes may require a page reload to take effect.
|
|
145
|
+
Hover over individual options for more details about
|
|
146
|
+
what they control.
|
|
147
|
+
</Text>
|
|
148
|
+
<Text>
|
|
149
|
+
If you're unsure about a setting, you can
|
|
150
|
+
always reset to defaults using the button at the
|
|
151
|
+
bottom of this section. Your previous configuration
|
|
152
|
+
will be saved as a backup.
|
|
153
|
+
</Text>
|
|
154
|
+
</CollapsibleCard.Content>
|
|
155
|
+
</CollapsibleCard.Root>
|
|
156
|
+
) ) }
|
|
157
|
+
</div>
|
|
158
|
+
),
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* A collapsible card with a `HeaderDescription` that provides supplementary
|
|
163
|
+
* information (e.g. status, summary) as an `aria-describedby` relationship.
|
|
164
|
+
*/
|
|
165
|
+
export const WithHeaderDescription: Story = {
|
|
166
|
+
// `defaultOpen` (uncontrolled) and `open` (controlled) should not be
|
|
167
|
+
// used together — disable the `open` control to avoid confusion.
|
|
168
|
+
argTypes: { open: { control: false } },
|
|
169
|
+
args: {
|
|
170
|
+
defaultOpen: true,
|
|
171
|
+
},
|
|
172
|
+
render: ( { open, defaultOpen, onOpenChange, disabled, ...restArgs } ) => (
|
|
173
|
+
<CollapsibleCard.Root
|
|
174
|
+
open={ open }
|
|
175
|
+
defaultOpen={ defaultOpen }
|
|
176
|
+
onOpenChange={ onOpenChange }
|
|
177
|
+
disabled={ disabled }
|
|
178
|
+
{ ...restArgs }
|
|
179
|
+
>
|
|
180
|
+
<CollapsibleCard.Header>
|
|
181
|
+
<Stack justify="space-between">
|
|
182
|
+
<Card.Title>Settings</Card.Title>
|
|
183
|
+
<CollapsibleCard.HeaderDescription>
|
|
184
|
+
<span
|
|
185
|
+
style={ {
|
|
186
|
+
fontSize: 'var(--wpds-font-size-sm)',
|
|
187
|
+
color: 'var(--wpds-color-fg-content-neutral-weak)',
|
|
188
|
+
} }
|
|
189
|
+
>
|
|
190
|
+
3 items configured
|
|
191
|
+
</span>
|
|
192
|
+
</CollapsibleCard.HeaderDescription>
|
|
193
|
+
</Stack>
|
|
194
|
+
</CollapsibleCard.Header>
|
|
195
|
+
<CollapsibleCard.Content>
|
|
196
|
+
<Text>
|
|
197
|
+
The header description provides supplementary context to the
|
|
198
|
+
trigger button. Assistive technologies will announce the
|
|
199
|
+
description alongside the button label.
|
|
200
|
+
</Text>
|
|
201
|
+
</CollapsibleCard.Content>
|
|
202
|
+
</CollapsibleCard.Root>
|
|
203
|
+
),
|
|
204
|
+
};
|
|
205
|
+
|
|
108
206
|
/**
|
|
109
207
|
* Visual comparison: a `CollapsibleCard` (open) next to a regular `Card`
|
|
110
208
|
* to verify identical spacing and layout.
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
min-width: 0;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
.header-trigger-
|
|
9
|
+
.header-trigger-positioner {
|
|
10
10
|
flex-shrink: 0;
|
|
11
11
|
align-self: center;
|
|
12
12
|
/* Prevent the trigger from making the header taller than its content,
|
|
@@ -15,7 +15,9 @@
|
|
|
15
15
|
overflow: visible;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
.header-trigger {
|
|
18
|
+
.header-trigger-wrapper {
|
|
19
|
+
display: flex;
|
|
20
|
+
|
|
19
21
|
/* Offset by half the button's own height so it visually centers
|
|
20
22
|
at the wrapper's midpoint (which `align-self: center` places at
|
|
21
23
|
the vertical center of the header). */
|
|
@@ -25,6 +27,12 @@
|
|
|
25
27
|
border-radius: var(--wpds-border-radius-sm);
|
|
26
28
|
}
|
|
27
29
|
|
|
30
|
+
.header-trigger {
|
|
31
|
+
@media not (prefers-reduced-motion) {
|
|
32
|
+
transition: rotate 0.15s ease-out;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
28
36
|
.header[data-panel-open] .header-trigger {
|
|
29
37
|
rotate: 180deg;
|
|
30
38
|
}
|
|
@@ -33,9 +41,33 @@
|
|
|
33
41
|
.header[data-disabled] .header-trigger {
|
|
34
42
|
color: var(--wpds-color-fg-interactive-neutral-disabled);
|
|
35
43
|
}
|
|
44
|
+
|
|
45
|
+
.content {
|
|
46
|
+
height: var(--collapsible-panel-height);
|
|
47
|
+
overflow: hidden;
|
|
48
|
+
margin-block-start: var(--wp-ui-card-header-content-margin);
|
|
49
|
+
|
|
50
|
+
&[hidden]:not([hidden="until-found"]) {
|
|
51
|
+
display: none;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
&[data-starting-style],
|
|
55
|
+
&[data-ending-style] {
|
|
56
|
+
height: 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@media not (prefers-reduced-motion) {
|
|
60
|
+
transition: all 150ms ease-out;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
36
64
|
}
|
|
37
65
|
|
|
38
66
|
@layer wp-ui-compositions {
|
|
67
|
+
.content-inner {
|
|
68
|
+
padding-block-start: 0;
|
|
69
|
+
}
|
|
70
|
+
|
|
39
71
|
.header {
|
|
40
72
|
display: flex;
|
|
41
73
|
flex-direction: row;
|
|
@@ -53,9 +53,7 @@ describe( 'CollapsibleCard', () => {
|
|
|
53
53
|
</CollapsibleCard.Root>
|
|
54
54
|
);
|
|
55
55
|
|
|
56
|
-
expect(
|
|
57
|
-
screen.queryByText( 'Hidden content' )
|
|
58
|
-
).not.toBeInTheDocument();
|
|
56
|
+
expect( screen.getByText( 'Hidden content' ) ).not.toBeVisible();
|
|
59
57
|
} );
|
|
60
58
|
|
|
61
59
|
it( 'shows content when defaultOpen is true', () => {
|
|
@@ -87,9 +85,7 @@ describe( 'CollapsibleCard', () => {
|
|
|
87
85
|
</CollapsibleCard.Root>
|
|
88
86
|
);
|
|
89
87
|
|
|
90
|
-
expect(
|
|
91
|
-
screen.queryByText( 'Toggle content' )
|
|
92
|
-
).not.toBeInTheDocument();
|
|
88
|
+
expect( screen.getByText( 'Toggle content' ) ).not.toBeVisible();
|
|
93
89
|
|
|
94
90
|
await user.click(
|
|
95
91
|
screen.getByRole( 'button', {
|
|
@@ -107,9 +103,7 @@ describe( 'CollapsibleCard', () => {
|
|
|
107
103
|
} )
|
|
108
104
|
);
|
|
109
105
|
|
|
110
|
-
expect(
|
|
111
|
-
screen.queryByText( 'Toggle content' )
|
|
112
|
-
).not.toBeInTheDocument();
|
|
106
|
+
expect( screen.getByText( 'Toggle content' ) ).not.toBeVisible();
|
|
113
107
|
} );
|
|
114
108
|
|
|
115
109
|
it( 'calls onOpenChange when toggled', async () => {
|
|
@@ -184,4 +178,97 @@ describe( 'CollapsibleCard', () => {
|
|
|
184
178
|
).toBeVisible();
|
|
185
179
|
} );
|
|
186
180
|
} );
|
|
181
|
+
|
|
182
|
+
describe( 'HeaderDescription', () => {
|
|
183
|
+
it( 'sets aria-describedby on the trigger pointing to the description', () => {
|
|
184
|
+
render(
|
|
185
|
+
<CollapsibleCard.Root>
|
|
186
|
+
<CollapsibleCard.Header>
|
|
187
|
+
<Card.Title>Settings</Card.Title>
|
|
188
|
+
<CollapsibleCard.HeaderDescription data-testid="desc">
|
|
189
|
+
3 errors
|
|
190
|
+
</CollapsibleCard.HeaderDescription>
|
|
191
|
+
</CollapsibleCard.Header>
|
|
192
|
+
<CollapsibleCard.Content>
|
|
193
|
+
<p>Content</p>
|
|
194
|
+
</CollapsibleCard.Content>
|
|
195
|
+
</CollapsibleCard.Root>
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
const trigger = screen.getByRole( 'button', {
|
|
199
|
+
name: 'Settings',
|
|
200
|
+
} );
|
|
201
|
+
const descriptionElement = screen.getByTestId( 'desc' );
|
|
202
|
+
|
|
203
|
+
expect( descriptionElement ).toHaveAttribute( 'id' );
|
|
204
|
+
expect( trigger ).toHaveAttribute(
|
|
205
|
+
'aria-describedby',
|
|
206
|
+
descriptionElement.id
|
|
207
|
+
);
|
|
208
|
+
} );
|
|
209
|
+
|
|
210
|
+
it( 'marks the description content as aria-hidden', () => {
|
|
211
|
+
render(
|
|
212
|
+
<CollapsibleCard.Root>
|
|
213
|
+
<CollapsibleCard.Header>
|
|
214
|
+
<Card.Title>Settings</Card.Title>
|
|
215
|
+
<CollapsibleCard.HeaderDescription data-testid="desc">
|
|
216
|
+
<span>Status: OK</span>
|
|
217
|
+
</CollapsibleCard.HeaderDescription>
|
|
218
|
+
</CollapsibleCard.Header>
|
|
219
|
+
</CollapsibleCard.Root>
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
const descriptionWrapper = screen.getByTestId( 'desc' );
|
|
223
|
+
expect( descriptionWrapper ).toHaveAttribute(
|
|
224
|
+
'aria-hidden',
|
|
225
|
+
'true'
|
|
226
|
+
);
|
|
227
|
+
} );
|
|
228
|
+
|
|
229
|
+
it( 'does not set aria-describedby when HeaderDescription is absent', () => {
|
|
230
|
+
render(
|
|
231
|
+
<CollapsibleCard.Root>
|
|
232
|
+
<CollapsibleCard.Header>
|
|
233
|
+
<Card.Title>Title</Card.Title>
|
|
234
|
+
</CollapsibleCard.Header>
|
|
235
|
+
</CollapsibleCard.Root>
|
|
236
|
+
);
|
|
237
|
+
|
|
238
|
+
const trigger = screen.getByRole( 'button', { name: 'Title' } );
|
|
239
|
+
expect( trigger ).not.toHaveAttribute( 'aria-describedby' );
|
|
240
|
+
} );
|
|
241
|
+
|
|
242
|
+
it( 'forwards ref on HeaderDescription', () => {
|
|
243
|
+
const descRef = createRef< HTMLDivElement >();
|
|
244
|
+
|
|
245
|
+
render(
|
|
246
|
+
<CollapsibleCard.Root>
|
|
247
|
+
<CollapsibleCard.Header>
|
|
248
|
+
<Card.Title>Title</Card.Title>
|
|
249
|
+
<CollapsibleCard.HeaderDescription ref={ descRef }>
|
|
250
|
+
Description
|
|
251
|
+
</CollapsibleCard.HeaderDescription>
|
|
252
|
+
</CollapsibleCard.Header>
|
|
253
|
+
</CollapsibleCard.Root>
|
|
254
|
+
);
|
|
255
|
+
|
|
256
|
+
expect( descRef.current ).toBeInstanceOf( HTMLDivElement );
|
|
257
|
+
} );
|
|
258
|
+
|
|
259
|
+
it( 'renders description content visually', () => {
|
|
260
|
+
render(
|
|
261
|
+
<CollapsibleCard.Root>
|
|
262
|
+
<CollapsibleCard.Header>
|
|
263
|
+
<Card.Title>Title</Card.Title>
|
|
264
|
+
<CollapsibleCard.HeaderDescription>
|
|
265
|
+
Badge content
|
|
266
|
+
</CollapsibleCard.HeaderDescription>
|
|
267
|
+
</CollapsibleCard.Header>
|
|
268
|
+
</CollapsibleCard.Root>
|
|
269
|
+
);
|
|
270
|
+
|
|
271
|
+
expect( screen.getByText( 'Badge content' ) ).toBeVisible();
|
|
272
|
+
} );
|
|
273
|
+
} );
|
|
187
274
|
} );
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
|
+
import type { PanelProps } from '../collapsible/types';
|
|
2
3
|
import type { ComponentProps } from '../utils/types';
|
|
3
4
|
|
|
4
5
|
export interface RootProps extends ComponentProps< 'div' > {
|
|
@@ -36,9 +37,30 @@ export interface HeaderProps extends ComponentProps< 'div' > {
|
|
|
36
37
|
children?: ReactNode;
|
|
37
38
|
}
|
|
38
39
|
|
|
40
|
+
export interface HeaderDescriptionProps extends ComponentProps< 'div' > {
|
|
41
|
+
/**
|
|
42
|
+
* Secondary content that describes the header trigger via
|
|
43
|
+
* `aria-describedby`. Rendered visually but marked `aria-hidden`
|
|
44
|
+
* so assistive technologies consume it only through the description
|
|
45
|
+
* relationship, avoiding double announcements.
|
|
46
|
+
*
|
|
47
|
+
* Avoid interactive elements — the entire header is the toggle trigger.
|
|
48
|
+
*/
|
|
49
|
+
children?: ReactNode;
|
|
50
|
+
}
|
|
51
|
+
|
|
39
52
|
export interface ContentProps extends ComponentProps< 'div' > {
|
|
40
53
|
/**
|
|
41
54
|
* The content to be rendered inside the collapsible content area.
|
|
42
55
|
*/
|
|
43
56
|
children?: ReactNode;
|
|
57
|
+
/**
|
|
58
|
+
* Allows the browser’s built-in page search to find and expand the panel contents.
|
|
59
|
+
*
|
|
60
|
+
* Overrides the `keepMounted` prop and uses `hidden="until-found"`
|
|
61
|
+
* to hide the element without removing it from the DOM.
|
|
62
|
+
*
|
|
63
|
+
* @default true
|
|
64
|
+
*/
|
|
65
|
+
hiddenUntilFound?: PanelProps[ 'hiddenUntilFound' ];
|
|
44
66
|
}
|
package/src/dialog/action.tsx
CHANGED
|
@@ -8,11 +8,17 @@ import type { ActionProps } from './types';
|
|
|
8
8
|
* Accepts all Button component props for styling.
|
|
9
9
|
*/
|
|
10
10
|
const Action = forwardRef< HTMLButtonElement, ActionProps >(
|
|
11
|
-
function DialogAction( { render, ...props }, ref ) {
|
|
11
|
+
function DialogAction( { render, disabled, loading, ...props }, ref ) {
|
|
12
|
+
// Resolve `disabled` the same way Button does so that
|
|
13
|
+
// _Dialog.Close's internal useButton (which controls
|
|
14
|
+
// aria-disabled) stays in sync with the rendered Button.
|
|
15
|
+
const resolvedDisabled = disabled ?? loading;
|
|
16
|
+
|
|
12
17
|
return (
|
|
13
18
|
<_Dialog.Close
|
|
14
19
|
ref={ ref }
|
|
15
|
-
render={ <Button render={ render } /> }
|
|
20
|
+
render={ <Button render={ render } loading={ loading } /> }
|
|
21
|
+
disabled={ resolvedDisabled }
|
|
16
22
|
{ ...props }
|
|
17
23
|
/>
|
|
18
24
|
);
|
package/src/dialog/popup.tsx
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { Dialog as _Dialog } from '@base-ui/react/dialog';
|
|
2
2
|
import clsx from 'clsx';
|
|
3
3
|
import { forwardRef } from '@wordpress/element';
|
|
4
|
+
import { useMergeRefs } from '@wordpress/compose';
|
|
4
5
|
import {
|
|
5
6
|
type ThemeProvider as ThemeProviderType,
|
|
6
7
|
privateApis as themePrivateApis,
|
|
7
8
|
} from '@wordpress/theme';
|
|
8
9
|
import { unlock } from '../lock-unlock';
|
|
10
|
+
import { useDeprioritizedInitialFocus } from '../utils/use-deprioritized-initial-focus';
|
|
9
11
|
import { DialogValidationProvider } from './context';
|
|
10
12
|
import styles from './style.module.css';
|
|
11
13
|
import type { PopupProps } from './types';
|
|
@@ -13,25 +15,42 @@ import type { PopupProps } from './types';
|
|
|
13
15
|
const ThemeProvider: typeof ThemeProviderType =
|
|
14
16
|
unlock( themePrivateApis ).ThemeProvider;
|
|
15
17
|
|
|
18
|
+
const CLOSE_ICON_ATTR = 'data-wp-ui-dialog-close-icon';
|
|
19
|
+
|
|
16
20
|
/**
|
|
17
21
|
* Renders the dialog popup element that contains the dialog content.
|
|
18
22
|
* Uses a portal to render outside the DOM hierarchy.
|
|
19
23
|
*/
|
|
20
24
|
const Popup = forwardRef< HTMLDivElement, PopupProps >( function DialogPopup(
|
|
21
|
-
{
|
|
25
|
+
{
|
|
26
|
+
className,
|
|
27
|
+
size = 'medium',
|
|
28
|
+
initialFocus,
|
|
29
|
+
finalFocus,
|
|
30
|
+
children,
|
|
31
|
+
...props
|
|
32
|
+
},
|
|
22
33
|
ref
|
|
23
34
|
) {
|
|
35
|
+
const { resolvedInitialFocus, popupRef } = useDeprioritizedInitialFocus( {
|
|
36
|
+
initialFocus,
|
|
37
|
+
deprioritizedAttribute: CLOSE_ICON_ATTR,
|
|
38
|
+
} );
|
|
39
|
+
const mergedRef = useMergeRefs( [ ref, popupRef ] );
|
|
40
|
+
|
|
24
41
|
return (
|
|
25
42
|
<_Dialog.Portal>
|
|
26
43
|
<_Dialog.Backdrop className={ styles.backdrop } />
|
|
27
44
|
<ThemeProvider>
|
|
28
45
|
<_Dialog.Popup
|
|
29
|
-
ref={
|
|
46
|
+
ref={ mergedRef }
|
|
30
47
|
className={ clsx(
|
|
31
48
|
styles.popup,
|
|
32
49
|
className,
|
|
33
50
|
styles[ `is-${ size }` ]
|
|
34
51
|
) }
|
|
52
|
+
initialFocus={ resolvedInitialFocus }
|
|
53
|
+
finalFocus={ finalFocus }
|
|
35
54
|
{ ...props }
|
|
36
55
|
>
|
|
37
56
|
<DialogValidationProvider>
|