@wordpress/ui 0.9.1-next.v.202603161435.0 → 0.11.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 +76 -1
- package/CONTRIBUTING.md +180 -0
- package/README.md +34 -6
- package/build/alert-dialog/context.cjs +39 -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 +165 -0
- package/build/alert-dialog/popup.cjs.map +7 -0
- package/build/alert-dialog/root.cjs +152 -0
- package/build/alert-dialog/root.cjs.map +7 -0
- package/build/alert-dialog/trigger.cjs +38 -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 +14 -14
- package/build/badge/badge.cjs.map +2 -2
- package/build/button/button.cjs +18 -8
- package/build/button/button.cjs.map +3 -3
- package/build/card/content.cjs +4 -4
- package/build/card/content.cjs.map +2 -2
- package/build/card/full-bleed.cjs +4 -4
- package/build/card/full-bleed.cjs.map +2 -2
- package/build/card/header.cjs +4 -4
- package/build/card/header.cjs.map +2 -2
- package/build/card/root.cjs +6 -6
- package/build/card/root.cjs.map +2 -2
- package/build/card/title.cjs +14 -21
- 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 +39 -18
- 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 +24 -6
- package/build/dialog/popup.cjs.map +2 -2
- package/build/dialog/title.cjs +10 -19
- package/build/dialog/title.cjs.map +3 -3
- 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 +69 -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 +71 -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 +17 -4
- package/build/form/primitives/field/description.cjs.map +3 -3
- package/build/form/primitives/field/details.cjs +4 -4
- package/build/form/primitives/field/details.cjs.map +2 -2
- package/build/form/primitives/field/label.cjs +8 -8
- package/build/form/primitives/field/label.cjs.map +2 -2
- package/build/form/primitives/field/root.cjs +2 -2
- package/build/form/primitives/field/root.cjs.map +1 -1
- package/build/form/primitives/fieldset/description.cjs +20 -4
- package/build/form/primitives/fieldset/description.cjs.map +3 -3
- package/build/form/primitives/fieldset/details.cjs +3 -3
- package/build/form/primitives/fieldset/details.cjs.map +2 -2
- package/build/form/primitives/fieldset/legend.cjs +8 -7
- package/build/form/primitives/fieldset/legend.cjs.map +2 -2
- 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 +23 -7
- package/build/form/primitives/input/input.cjs.map +3 -3
- package/build/form/primitives/input-layout/input-layout.cjs +15 -5
- package/build/form/primitives/input-layout/input-layout.cjs.map +3 -3
- package/build/form/primitives/input-layout/slot.cjs +6 -5
- 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 +9 -9
- package/build/form/primitives/select/popup.cjs.map +2 -2
- package/build/form/primitives/select/trigger.cjs +6 -6
- package/build/form/primitives/select/trigger.cjs.map +2 -2
- package/build/form/primitives/select/types.cjs.map +1 -1
- package/build/form/primitives/textarea/textarea.cjs +23 -4
- package/build/form/primitives/textarea/textarea.cjs.map +3 -3
- 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 +11 -2
- package/build/index.cjs.map +2 -2
- package/build/link/link.cjs +18 -8
- package/build/link/link.cjs.map +3 -3
- package/build/notice/action-button.cjs +3 -3
- package/build/notice/action-button.cjs.map +2 -2
- package/build/notice/action-link.cjs +3 -3
- 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 +3 -3
- package/build/notice/description.cjs.map +2 -2
- package/build/notice/index.cjs.map +1 -1
- package/build/notice/root.cjs +5 -5
- package/build/notice/root.cjs.map +2 -2
- package/build/notice/title.cjs +3 -3
- package/build/notice/title.cjs.map +2 -2
- package/build/popover/arrow.cjs +94 -0
- package/build/popover/arrow.cjs.map +7 -0
- package/build/popover/close.cjs +45 -0
- package/build/popover/close.cjs.map +7 -0
- package/build/popover/context.cjs +76 -0
- package/build/popover/context.cjs.map +7 -0
- package/build/popover/description.cjs +70 -0
- package/build/popover/description.cjs.map +7 -0
- package/build/popover/index.cjs +49 -0
- package/build/popover/index.cjs.map +7 -0
- package/build/popover/popup.cjs +138 -0
- package/build/popover/popup.cjs.map +7 -0
- package/build/popover/root.cjs +35 -0
- package/build/popover/root.cjs.map +7 -0
- package/build/popover/title.cjs +56 -0
- package/build/popover/title.cjs.map +7 -0
- package/build/popover/trigger.cjs +38 -0
- package/build/popover/trigger.cjs.map +7 -0
- package/build/popover/types.cjs +19 -0
- package/build/popover/types.cjs.map +7 -0
- 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 -4
- 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 +20 -5
- package/build/text/text.cjs.map +3 -3
- package/build/tooltip/popup.cjs +7 -6
- package/build/tooltip/popup.cjs.map +2 -2
- package/build/tooltip/root.cjs.map +2 -2
- package/build/tooltip/types.cjs.map +1 -1
- package/build/utils/types.cjs.map +1 -1
- 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 +2 -2
- package/build-module/alert-dialog/context.mjs +14 -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 +132 -0
- package/build-module/alert-dialog/popup.mjs.map +7 -0
- package/build-module/alert-dialog/root.mjs +133 -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 +14 -14
- package/build-module/badge/badge.mjs.map +2 -2
- package/build-module/button/button.mjs +18 -8
- package/build-module/button/button.mjs.map +3 -3
- package/build-module/card/content.mjs +4 -4
- package/build-module/card/content.mjs.map +2 -2
- package/build-module/card/full-bleed.mjs +4 -4
- package/build-module/card/full-bleed.mjs.map +2 -2
- package/build-module/card/header.mjs +4 -4
- package/build-module/card/header.mjs.map +2 -2
- package/build-module/card/root.mjs +6 -6
- package/build-module/card/root.mjs.map +2 -2
- package/build-module/card/title.mjs +14 -21
- package/build-module/card/title.mjs.map +3 -3
- 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 +40 -19
- 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 +24 -6
- package/build-module/dialog/popup.mjs.map +2 -2
- package/build-module/dialog/title.mjs +10 -9
- 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 +34 -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 +36 -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 +17 -4
- package/build-module/form/primitives/field/description.mjs.map +3 -3
- package/build-module/form/primitives/field/details.mjs +4 -4
- package/build-module/form/primitives/field/details.mjs.map +2 -2
- package/build-module/form/primitives/field/label.mjs +8 -8
- package/build-module/form/primitives/field/label.mjs.map +2 -2
- package/build-module/form/primitives/field/root.mjs +2 -2
- package/build-module/form/primitives/field/root.mjs.map +1 -1
- package/build-module/form/primitives/fieldset/description.mjs +20 -4
- package/build-module/form/primitives/fieldset/description.mjs.map +3 -3
- package/build-module/form/primitives/fieldset/details.mjs +3 -3
- package/build-module/form/primitives/fieldset/details.mjs.map +2 -2
- package/build-module/form/primitives/fieldset/legend.mjs +8 -7
- package/build-module/form/primitives/fieldset/legend.mjs.map +2 -2
- 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 +23 -7
- package/build-module/form/primitives/input/input.mjs.map +3 -3
- package/build-module/form/primitives/input-layout/input-layout.mjs +15 -5
- package/build-module/form/primitives/input-layout/input-layout.mjs.map +3 -3
- package/build-module/form/primitives/input-layout/slot.mjs +6 -5
- 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 +9 -9
- package/build-module/form/primitives/select/popup.mjs.map +2 -2
- package/build-module/form/primitives/select/trigger.mjs +6 -6
- package/build-module/form/primitives/select/trigger.mjs.map +2 -2
- package/build-module/form/primitives/textarea/textarea.mjs +23 -4
- package/build-module/form/primitives/textarea/textarea.mjs.map +3 -3
- 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 +7 -1
- package/build-module/index.mjs.map +2 -2
- package/build-module/link/link.mjs +18 -8
- package/build-module/link/link.mjs.map +3 -3
- 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 +3 -3
- 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 +3 -3
- package/build-module/notice/description.mjs.map +2 -2
- package/build-module/notice/index.mjs.map +1 -1
- package/build-module/notice/root.mjs +5 -5
- package/build-module/notice/root.mjs.map +2 -2
- package/build-module/notice/title.mjs +3 -3
- package/build-module/notice/title.mjs.map +2 -2
- package/build-module/popover/arrow.mjs +59 -0
- package/build-module/popover/arrow.mjs.map +7 -0
- package/build-module/popover/close.mjs +20 -0
- package/build-module/popover/close.mjs.map +7 -0
- package/build-module/popover/context.mjs +57 -0
- package/build-module/popover/context.mjs.map +7 -0
- package/build-module/popover/description.mjs +35 -0
- package/build-module/popover/description.mjs.map +7 -0
- package/build-module/popover/index.mjs +18 -0
- package/build-module/popover/index.mjs.map +7 -0
- package/build-module/popover/popup.mjs +105 -0
- package/build-module/popover/popup.mjs.map +7 -0
- package/build-module/popover/root.mjs +10 -0
- package/build-module/popover/root.mjs.map +7 -0
- package/build-module/popover/title.mjs +31 -0
- package/build-module/popover/title.mjs.map +7 -0
- package/build-module/popover/trigger.mjs +13 -0
- package/build-module/popover/trigger.mjs.map +7 -0
- package/build-module/popover/types.mjs +1 -0
- package/build-module/popover/types.mjs.map +7 -0
- 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 -4
- 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 +20 -5
- package/build-module/text/text.mjs.map +3 -3
- package/build-module/tooltip/popup.mjs +7 -6
- package/build-module/tooltip/popup.mjs.map +2 -2
- 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 +2 -2
- package/build-types/alert-dialog/context.d.ts +11 -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 +18 -0
- package/build-types/alert-dialog/root.d.ts.map +1 -0
- package/build-types/alert-dialog/stories/index.story.d.ts +56 -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 +7 -0
- package/build-types/alert-dialog/trigger.d.ts.map +1 -0
- package/build-types/alert-dialog/types.d.ts +105 -0
- package/build-types/alert-dialog/types.d.ts.map +1 -0
- package/build-types/badge/badge.d.ts.map +1 -1
- package/build-types/button/button.d.ts.map +1 -1
- package/build-types/card/stories/index.story.d.ts.map +1 -1
- package/build-types/card/title.d.ts.map +1 -1
- package/build-types/collapsible/panel.d.ts +2 -1
- package/build-types/collapsible/panel.d.ts.map +1 -1
- package/build-types/collapsible/root.d.ts +2 -1
- package/build-types/collapsible/root.d.ts.map +1 -1
- package/build-types/collapsible/trigger.d.ts +2 -1
- package/build-types/collapsible/trigger.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 +8 -6
- package/build-types/dialog/stories/index.story.d.ts.map +1 -1
- package/build-types/dialog/title.d.ts +12 -2
- package/build-types/dialog/title.d.ts.map +1 -1
- package/build-types/dialog/types.d.ts +13 -6
- 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/description.d.ts +2 -1
- package/build-types/form/primitives/field/description.d.ts.map +1 -1
- package/build-types/form/primitives/field/details.d.ts +2 -1
- package/build-types/form/primitives/field/details.d.ts.map +1 -1
- package/build-types/form/primitives/field/label.d.ts +2 -1
- package/build-types/form/primitives/field/label.d.ts.map +1 -1
- package/build-types/form/primitives/field/stories/index.story.d.ts.map +1 -1
- package/build-types/form/primitives/fieldset/description.d.ts +2 -1
- package/build-types/form/primitives/fieldset/description.d.ts.map +1 -1
- package/build-types/form/primitives/fieldset/details.d.ts +2 -1
- package/build-types/form/primitives/fieldset/details.d.ts.map +1 -1
- package/build-types/form/primitives/fieldset/legend.d.ts +2 -1
- package/build-types/form/primitives/fieldset/legend.d.ts.map +1 -1
- package/build-types/form/primitives/fieldset/root.d.ts +2 -1
- package/build-types/form/primitives/fieldset/root.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/input.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/input-layout.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/primitives/select/item.d.ts +6 -2
- package/build-types/form/primitives/select/item.d.ts.map +1 -1
- package/build-types/form/primitives/select/popup.d.ts +11 -1
- package/build-types/form/primitives/select/popup.d.ts.map +1 -1
- package/build-types/form/primitives/select/trigger.d.ts +12 -2
- package/build-types/form/primitives/select/trigger.d.ts.map +1 -1
- package/build-types/form/primitives/select/types.d.ts +13 -3
- package/build-types/form/primitives/select/types.d.ts.map +1 -1
- package/build-types/form/primitives/textarea/textarea.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 +4 -1
- package/build-types/index.d.ts.map +1 -1
- package/build-types/link/link.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/popover/arrow.d.ts +10 -0
- package/build-types/popover/arrow.d.ts.map +1 -0
- package/build-types/popover/close.d.ts +11 -0
- package/build-types/popover/close.d.ts.map +1 -0
- package/build-types/popover/context.d.ts +22 -0
- package/build-types/popover/context.d.ts.map +1 -0
- package/build-types/popover/description.d.ts +10 -0
- package/build-types/popover/description.d.ts.map +1 -0
- package/build-types/popover/index.d.ts +9 -0
- package/build-types/popover/index.d.ts.map +1 -0
- package/build-types/popover/popup.d.ts +11 -0
- package/build-types/popover/popup.d.ts.map +1 -0
- package/build-types/popover/root.d.ts +37 -0
- package/build-types/popover/root.d.ts.map +1 -0
- package/build-types/popover/stories/index.story.d.ts +211 -0
- package/build-types/popover/stories/index.story.d.ts.map +1 -0
- package/build-types/popover/stories/utils.d.ts +25 -0
- package/build-types/popover/stories/utils.d.ts.map +1 -0
- package/build-types/popover/test/index.test.d.ts +2 -0
- package/build-types/popover/test/index.test.d.ts.map +1 -0
- package/build-types/popover/title.d.ts +20 -0
- package/build-types/popover/title.d.ts.map +1 -0
- package/build-types/popover/trigger.d.ts +10 -0
- package/build-types/popover/trigger.d.ts.map +1 -0
- package/build-types/popover/types.d.ts +83 -0
- package/build-types/popover/types.d.ts.map +1 -0
- package/build-types/tabs/context.d.ts +26 -0
- package/build-types/tabs/context.d.ts.map +1 -0
- package/build-types/tabs/list.d.ts +2 -1
- package/build-types/tabs/list.d.ts.map +1 -1
- package/build-types/tabs/panel.d.ts +2 -1
- package/build-types/tabs/panel.d.ts.map +1 -1
- package/build-types/tabs/root.d.ts +2 -1
- package/build-types/tabs/root.d.ts.map +1 -1
- package/build-types/tabs/tab.d.ts +2 -1
- package/build-types/tabs/tab.d.ts.map +1 -1
- package/build-types/text/stories/index.story.d.ts +4 -0
- package/build-types/text/stories/index.story.d.ts.map +1 -1
- package/build-types/text/text.d.ts.map +1 -1
- package/build-types/tooltip/popup.d.ts.map +1 -1
- package/build-types/tooltip/root.d.ts +13 -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/tooltip/stories/usage-guidelines.story.d.ts +21 -0
- package/build-types/tooltip/stories/usage-guidelines.story.d.ts.map +1 -0
- package/build-types/tooltip/types.d.ts +4 -0
- package/build-types/tooltip/types.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/types.d.ts +6 -2
- package/build-types/utils/types.d.ts.map +1 -1
- package/build-types/utils/use-deprioritized-initial-focus.d.ts +36 -0
- package/build-types/utils/use-deprioritized-initial-focus.d.ts.map +1 -0
- package/build-types/visually-hidden/stories/index.story.d.ts +7 -0
- package/build-types/visually-hidden/stories/index.story.d.ts.map +1 -1
- package/build-types/visually-hidden/visually-hidden.d.ts +34 -0
- package/build-types/visually-hidden/visually-hidden.d.ts.map +1 -1
- package/package.json +17 -16
- package/src/alert-dialog/context.tsx +22 -0
- package/src/alert-dialog/index.ts +3 -0
- package/src/alert-dialog/popup.tsx +116 -0
- package/src/alert-dialog/root.tsx +226 -0
- package/src/alert-dialog/stories/index.story.tsx +305 -0
- package/src/alert-dialog/style.module.css +21 -0
- package/src/alert-dialog/test/index.test.tsx +1509 -0
- package/src/alert-dialog/trigger.tsx +15 -0
- package/src/alert-dialog/types.ts +119 -0
- package/src/badge/badge.tsx +11 -14
- package/src/badge/style.module.css +0 -4
- package/src/button/button.tsx +2 -0
- package/src/button/style.module.css +9 -3
- package/src/card/stories/index.story.tsx +4 -5
- package/src/card/style.module.css +4 -10
- package/src/card/test/index.test.tsx +17 -1
- package/src/card/title.tsx +14 -12
- 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 +102 -4
- 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 +23 -3
- package/src/dialog/stories/index.story.tsx +33 -28
- package/src/dialog/style.module.css +18 -14
- package/src/dialog/test/index.test.tsx +180 -4
- package/src/dialog/title.tsx +21 -9
- package/src/dialog/types.ts +20 -6
- package/src/empty-state/actions.tsx +24 -0
- package/src/empty-state/description.tsx +31 -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 +26 -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 +26 -0
- package/src/empty-state/test/visual.test.tsx +17 -0
- package/src/empty-state/title.tsx +29 -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/description.tsx +6 -1
- package/src/form/primitives/field/details.tsx +4 -2
- package/src/form/primitives/field/label.tsx +9 -5
- package/src/form/primitives/field/stories/index.story.tsx +2 -7
- package/src/form/primitives/field/test/index.test.tsx +11 -0
- package/src/form/primitives/fieldset/description.tsx +9 -1
- package/src/form/primitives/fieldset/legend.tsx +9 -4
- package/src/form/primitives/fieldset/stories/index.story.tsx +2 -7
- package/src/form/primitives/fieldset/test/index.test.tsx +22 -0
- package/src/form/primitives/input/input.tsx +6 -1
- package/src/form/primitives/input/stories/index.story.tsx +7 -0
- package/src/form/primitives/input/style.module.css +4 -0
- package/src/form/primitives/input-layout/input-layout.tsx +2 -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/input-layout/style.module.css +3 -3
- package/src/form/primitives/select/popup.tsx +5 -2
- package/src/form/primitives/select/test/index.test.tsx +60 -1
- package/src/form/primitives/select/types.ts +14 -4
- package/src/form/primitives/stories/overview.mdx +15 -0
- package/src/form/primitives/textarea/textarea.tsx +11 -2
- package/src/form/stories/shared.tsx +21 -0
- package/src/form/types.ts +34 -0
- package/src/index.ts +4 -1
- package/src/link/link.tsx +2 -0
- package/src/link/style.module.css +11 -1
- package/src/notice/index.ts +0 -2
- package/src/notice/style.module.css +6 -6
- package/src/popover/arrow.tsx +49 -0
- package/src/popover/close.tsx +24 -0
- package/src/popover/context.tsx +100 -0
- package/src/popover/description.tsx +29 -0
- package/src/popover/index.ts +9 -0
- package/src/popover/popup.tsx +106 -0
- package/src/popover/root.tsx +41 -0
- package/src/popover/stories/index.story.tsx +1315 -0
- package/src/popover/stories/utils.tsx +91 -0
- package/src/popover/style.module.css +64 -0
- package/src/popover/test/index.test.tsx +727 -0
- package/src/popover/title.tsx +47 -0
- package/src/popover/trigger.tsx +17 -0
- package/src/popover/types.ts +113 -0
- package/src/tabs/context.tsx +170 -0
- package/src/tabs/list.tsx +0 -1
- package/src/tabs/panel.tsx +3 -0
- package/src/tabs/root.tsx +6 -1
- package/src/tabs/style.module.css +3 -3
- package/src/tabs/tab.tsx +3 -0
- package/src/tabs/test/index.test.tsx +162 -0
- package/src/text/stories/index.story.tsx +4 -2
- package/src/text/style.module.css +62 -36
- package/src/text/test/index.test.tsx +1 -4
- package/src/text/text.tsx +8 -1
- package/src/tooltip/popup.tsx +2 -1
- package/src/tooltip/root.tsx +13 -0
- package/src/tooltip/stories/index.story.tsx +20 -15
- package/src/tooltip/stories/usage-guidelines.mdx +91 -0
- package/src/tooltip/stories/usage-guidelines.story.tsx +119 -0
- package/src/tooltip/style.module.css +2 -2
- package/src/tooltip/test/index.test.tsx +61 -0
- package/src/tooltip/types.ts +5 -0
- package/src/utils/css/field.module.css +12 -9
- package/src/utils/css/focus.module.css +7 -5
- package/src/utils/css/global-css-defense.module.css +117 -0
- package/src/utils/css/item-popup.module.css +3 -2
- 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/types.ts +7 -2
- package/src/utils/use-deprioritized-initial-focus.ts +84 -0
- package/src/visually-hidden/stories/index.story.tsx +25 -0
- package/src/visually-hidden/visually-hidden.tsx +34 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Unlayered defense against wp-admin global CSS (common.css, forms.css).
|
|
3
|
+
*
|
|
4
|
+
* CSS cascade layers always lose to unlayered styles, so @wordpress/ui's
|
|
5
|
+
* layered component styles get overridden by wp-admin's broad bare-element
|
|
6
|
+
* selectors. This file provides unlayered, class-scoped defenses that
|
|
7
|
+
* restore control to the component.
|
|
8
|
+
*
|
|
9
|
+
* Mechanism (custom property bridge):
|
|
10
|
+
* .input { font-size: var(--_gcd-input-font-size, inherit); }
|
|
11
|
+
*
|
|
12
|
+
* - The class selector beats admin bare-element selectors in specificity.
|
|
13
|
+
* - Each property reads a custom property. The fallback values are what
|
|
14
|
+
* makes sense for @wordpress/ui, to minimize the number of overrides
|
|
15
|
+
* in each individual component stylesheet.
|
|
16
|
+
* - Component CSS modules only need to define the custom properties for
|
|
17
|
+
* the specific properties they want to override.
|
|
18
|
+
* - Custom property definitions aren't suppressed by cascade layers, so the
|
|
19
|
+
* layered value propagates through to the unlayered declaration.
|
|
20
|
+
*
|
|
21
|
+
* Usage: apply the element-specific class directly to each element that
|
|
22
|
+
* needs defense (e.g. defenseStyles.input on an <input>).
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
/*
|
|
26
|
+
* ==========================================================================
|
|
27
|
+
* forms.css defense - https://github.com/WordPress/wordpress-develop/blob/trunk/src/wp-admin/css/forms.css
|
|
28
|
+
* ==========================================================================
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
.button {
|
|
32
|
+
box-sizing: var(--_gcd-button-box-sizing, border-box);
|
|
33
|
+
font-family: var(--_gcd-button-font-family, inherit);
|
|
34
|
+
font-size: var(--_gcd-button-font-size, inherit);
|
|
35
|
+
font-weight: var(--_gcd-button-font-weight, inherit);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.input {
|
|
39
|
+
box-sizing: var(--_gcd-input-box-sizing, border-box);
|
|
40
|
+
font-family: var(--_gcd-input-font-family, inherit);
|
|
41
|
+
font-size: var(--_gcd-input-font-size, inherit);
|
|
42
|
+
font-weight: var(--_gcd-input-font-weight, inherit);
|
|
43
|
+
margin: var(--_gcd-input-margin, 0);
|
|
44
|
+
|
|
45
|
+
/* Also targets textarea elements, which the `Input` primitive can render as. We combine these textarea defenses
|
|
46
|
+
into the input defenses to minimize the number of tokens, but they should be split if it ever becomes necessary. */
|
|
47
|
+
&:is(textarea, [type="text"], [type="password"], [type="color"], [type="date"], [type="datetime"], [type="datetime-local"], [type="email"], [type="month"], [type="number"], [type="search"], [type="tel"], [type="time"], [type="url"], [type="week"]) {
|
|
48
|
+
box-shadow: var(--_gcd-input-box-shadow, 0 0 0 transparent);
|
|
49
|
+
border-radius: var(--_gcd-input-border-radius, 0);
|
|
50
|
+
border: var(--_gcd-input-border, none);
|
|
51
|
+
background-color: var(--_gcd-input-background-color, transparent);
|
|
52
|
+
color: var(--_gcd-input-color, var(--wpds-color-fg-interactive-neutral));
|
|
53
|
+
|
|
54
|
+
&:focus {
|
|
55
|
+
border-color: var(--_gcd-input-border-color-focus, var(--wp-admin-theme-color));
|
|
56
|
+
box-shadow: var(--_gcd-input-box-shadow-focus, none);
|
|
57
|
+
outline: var(--_gcd-input-outline-focus, none);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
&:disabled {
|
|
61
|
+
background: var(--_gcd-input-background-disabled, transparent);
|
|
62
|
+
border-color: var(--_gcd-input-border-color-disabled, transparent);
|
|
63
|
+
box-shadow: var(--_gcd-input-box-shadow-disabled, none);
|
|
64
|
+
color: var(--_gcd-input-color-disabled, var(--wpds-color-fg-interactive-neutral-disabled));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
&::placeholder {
|
|
68
|
+
color: var(--_gcd-input-placeholder-color, var(--wpds-color-fg-interactive-neutral-disabled));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
&:is(textarea, [type="text"], [type="password"], [type="date"], [type="datetime"], [type="datetime-local"], [type="email"], [type="month"], [type="number"], [type="search"], [type="tel"], [type="time"], [type="url"], [type="week"]) {
|
|
73
|
+
padding: var(--_gcd-input-padding, 0);
|
|
74
|
+
line-height: var(--_gcd-input-line-height, inherit);
|
|
75
|
+
min-height: var(--_gcd-input-min-height, auto);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.textarea {
|
|
80
|
+
box-sizing: var(--_gcd-textarea-box-sizing, border-box);
|
|
81
|
+
overflow: var(--_gcd-textarea-overflow, auto);
|
|
82
|
+
resize: var(--_gcd-textarea-resize, block);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/*
|
|
86
|
+
* ==========================================================================
|
|
87
|
+
* common.css defense - https://github.com/WordPress/wordpress-develop/blob/trunk/src/wp-admin/css/common.css
|
|
88
|
+
* ==========================================================================
|
|
89
|
+
*/
|
|
90
|
+
|
|
91
|
+
.div {
|
|
92
|
+
outline: var(--_gcd-div-outline, 0 solid transparent);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* Narrowed down to p elements only, to support element multiplicity of Text component. */
|
|
96
|
+
p.p {
|
|
97
|
+
font-size: var(--_gcd-p-font-size, 13px);
|
|
98
|
+
line-height: var(--_gcd-p-line-height, 1.5);
|
|
99
|
+
margin: var(--_gcd-p-margin, 0);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* Narrowed down to h[1-6] elements only, to support element multiplicity of Text component. */
|
|
103
|
+
:is(h1, h2, h3, h4, h5, h6).heading {
|
|
104
|
+
color: var(--_gcd-heading-color, var(--wpds-color-fg-content-neutral));
|
|
105
|
+
font-size: var(--_gcd-heading-font-size, inherit);
|
|
106
|
+
font-weight: var(--_gcd-heading-font-weight, var(--wpds-typography-font-weight-medium));
|
|
107
|
+
margin: var(--_gcd-heading-margin, 0);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.a,
|
|
111
|
+
.a:is(:hover, :focus, :active) {
|
|
112
|
+
outline: var(--_gcd-a-outline, 0 solid transparent);
|
|
113
|
+
color: var(--_gcd-a-color, inherit);
|
|
114
|
+
box-shadow: var(--_gcd-a-box-shadow, none);
|
|
115
|
+
border-radius: var(--_gcd-a-border-radius, 0);
|
|
116
|
+
transition: var(--_gcd-a-transition, none);
|
|
117
|
+
}
|
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
border: 1px solid var(--wpds-color-stroke-surface-neutral);
|
|
17
17
|
box-shadow: var(--wpds-elevation-md);
|
|
18
18
|
background-color: var(--wpds-color-bg-surface-neutral-strong);
|
|
19
|
-
font-family: var(--wpds-font-family-body);
|
|
20
|
-
font-size: var(--wpds-font-size-md);
|
|
19
|
+
font-family: var(--wpds-typography-font-family-body);
|
|
20
|
+
font-size: var(--wpds-typography-font-size-md);
|
|
21
21
|
line-height: 1.4;
|
|
22
22
|
color: var(--wpds-color-fg-interactive-neutral);
|
|
23
23
|
}
|
|
@@ -60,6 +60,7 @@
|
|
|
60
60
|
align-items: center;
|
|
61
61
|
justify-content: flex-start;
|
|
62
62
|
gap: var(--wpds-dimension-gap-xs);
|
|
63
|
+
cursor: var(--wpds-cursor-control);
|
|
63
64
|
min-height: var(--wp-ui-popup-item-height);
|
|
64
65
|
border-radius: var(--wpds-border-radius-sm);
|
|
65
66
|
user-select: none;
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { render, screen } from '@testing-library/react';
|
|
2
|
+
import { createRef, useEffect } from '@wordpress/element';
|
|
3
|
+
import { useDeprioritizedInitialFocus } from '../use-deprioritized-initial-focus';
|
|
4
|
+
|
|
5
|
+
const ATTR = 'data-test-deprioritized';
|
|
6
|
+
|
|
7
|
+
function TestHarness( {
|
|
8
|
+
initialFocus,
|
|
9
|
+
onResolved,
|
|
10
|
+
}: {
|
|
11
|
+
initialFocus?: Parameters<
|
|
12
|
+
typeof useDeprioritizedInitialFocus
|
|
13
|
+
>[ 0 ][ 'initialFocus' ];
|
|
14
|
+
onResolved: (
|
|
15
|
+
result: ReturnType< typeof useDeprioritizedInitialFocus >
|
|
16
|
+
) => void;
|
|
17
|
+
} ) {
|
|
18
|
+
const result = useDeprioritizedInitialFocus( {
|
|
19
|
+
initialFocus,
|
|
20
|
+
deprioritizedAttribute: ATTR,
|
|
21
|
+
} );
|
|
22
|
+
|
|
23
|
+
useEffect( () => {
|
|
24
|
+
onResolved( result );
|
|
25
|
+
} );
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<div ref={ result.popupRef } data-testid="popup">
|
|
29
|
+
<button { ...{ [ ATTR ]: '' } }>Close</button>
|
|
30
|
+
<button>Action</button>
|
|
31
|
+
<input type="text" />
|
|
32
|
+
</div>
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
describe( 'useDeprioritizedInitialFocus', () => {
|
|
37
|
+
describe( 'passthrough', () => {
|
|
38
|
+
it( 'passes through false unchanged', () => {
|
|
39
|
+
let resolved: ReturnType< typeof useDeprioritizedInitialFocus >;
|
|
40
|
+
|
|
41
|
+
render(
|
|
42
|
+
<TestHarness
|
|
43
|
+
initialFocus={ false }
|
|
44
|
+
onResolved={ ( r ) => {
|
|
45
|
+
resolved = r;
|
|
46
|
+
} }
|
|
47
|
+
/>
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
expect( resolved!.resolvedInitialFocus ).toBe( false );
|
|
51
|
+
} );
|
|
52
|
+
|
|
53
|
+
it( 'passes through a ref unchanged', () => {
|
|
54
|
+
const ref = createRef< HTMLElement >();
|
|
55
|
+
let resolved: ReturnType< typeof useDeprioritizedInitialFocus >;
|
|
56
|
+
|
|
57
|
+
render(
|
|
58
|
+
<TestHarness
|
|
59
|
+
initialFocus={ ref }
|
|
60
|
+
onResolved={ ( r ) => {
|
|
61
|
+
resolved = r;
|
|
62
|
+
} }
|
|
63
|
+
/>
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
expect( resolved!.resolvedInitialFocus ).toBe( ref );
|
|
67
|
+
} );
|
|
68
|
+
|
|
69
|
+
it( 'passes through a custom callback unchanged', () => {
|
|
70
|
+
const cb = () => true as const;
|
|
71
|
+
let resolved: ReturnType< typeof useDeprioritizedInitialFocus >;
|
|
72
|
+
|
|
73
|
+
render(
|
|
74
|
+
<TestHarness
|
|
75
|
+
initialFocus={ cb }
|
|
76
|
+
onResolved={ ( r ) => {
|
|
77
|
+
resolved = r;
|
|
78
|
+
} }
|
|
79
|
+
/>
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
expect( resolved!.resolvedInitialFocus ).toBe( cb );
|
|
83
|
+
} );
|
|
84
|
+
} );
|
|
85
|
+
|
|
86
|
+
describe( 'default behavior (initialFocus undefined or true)', () => {
|
|
87
|
+
it.each( [ undefined, true ] )(
|
|
88
|
+
'returns a callback when initialFocus is %s',
|
|
89
|
+
( value ) => {
|
|
90
|
+
let resolved: ReturnType< typeof useDeprioritizedInitialFocus >;
|
|
91
|
+
|
|
92
|
+
render(
|
|
93
|
+
<TestHarness
|
|
94
|
+
initialFocus={ value }
|
|
95
|
+
onResolved={ ( r ) => {
|
|
96
|
+
resolved = r;
|
|
97
|
+
} }
|
|
98
|
+
/>
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
expect( typeof resolved!.resolvedInitialFocus ).toBe(
|
|
102
|
+
'function'
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
it( 'returns the popup element on touch interactions', () => {
|
|
108
|
+
let resolved: ReturnType< typeof useDeprioritizedInitialFocus >;
|
|
109
|
+
|
|
110
|
+
render(
|
|
111
|
+
<TestHarness
|
|
112
|
+
onResolved={ ( r ) => {
|
|
113
|
+
resolved = r;
|
|
114
|
+
} }
|
|
115
|
+
/>
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
const callback = resolved!.resolvedInitialFocus as (
|
|
119
|
+
type: string
|
|
120
|
+
) => HTMLElement | boolean | null;
|
|
121
|
+
const result = callback( 'touch' );
|
|
122
|
+
|
|
123
|
+
expect( result ).toBe( screen.getByTestId( 'popup' ) );
|
|
124
|
+
} );
|
|
125
|
+
|
|
126
|
+
it( 'skips the deprioritized element on non-touch interactions', () => {
|
|
127
|
+
let resolved: ReturnType< typeof useDeprioritizedInitialFocus >;
|
|
128
|
+
|
|
129
|
+
render(
|
|
130
|
+
<TestHarness
|
|
131
|
+
onResolved={ ( r ) => {
|
|
132
|
+
resolved = r;
|
|
133
|
+
} }
|
|
134
|
+
/>
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
const callback = resolved!.resolvedInitialFocus as (
|
|
138
|
+
type: string
|
|
139
|
+
) => HTMLElement | boolean | null;
|
|
140
|
+
const result = callback( 'mouse' );
|
|
141
|
+
|
|
142
|
+
// Should return the Action button, skipping Close
|
|
143
|
+
expect( result ).toBeInstanceOf( HTMLButtonElement );
|
|
144
|
+
expect( result as HTMLButtonElement ).toHaveTextContent( 'Action' );
|
|
145
|
+
} );
|
|
146
|
+
|
|
147
|
+
it( 'falls back to default when only deprioritized elements exist', () => {
|
|
148
|
+
let resolved: ReturnType< typeof useDeprioritizedInitialFocus >;
|
|
149
|
+
|
|
150
|
+
function OnlyDeprioritized( {
|
|
151
|
+
onResolved: onResolvedProp,
|
|
152
|
+
}: {
|
|
153
|
+
onResolved: (
|
|
154
|
+
r: ReturnType< typeof useDeprioritizedInitialFocus >
|
|
155
|
+
) => void;
|
|
156
|
+
} ) {
|
|
157
|
+
const result = useDeprioritizedInitialFocus( {
|
|
158
|
+
initialFocus: undefined,
|
|
159
|
+
deprioritizedAttribute: ATTR,
|
|
160
|
+
} );
|
|
161
|
+
|
|
162
|
+
useEffect( () => {
|
|
163
|
+
onResolvedProp( result );
|
|
164
|
+
} );
|
|
165
|
+
|
|
166
|
+
return (
|
|
167
|
+
<div ref={ result.popupRef } data-testid="popup">
|
|
168
|
+
<button { ...{ [ ATTR ]: '' } }>Close</button>
|
|
169
|
+
<p>No other tabbable elements</p>
|
|
170
|
+
</div>
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
render(
|
|
175
|
+
<OnlyDeprioritized
|
|
176
|
+
onResolved={ ( r ) => {
|
|
177
|
+
resolved = r;
|
|
178
|
+
} }
|
|
179
|
+
/>
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
const callback = resolved!.resolvedInitialFocus as (
|
|
183
|
+
type: string
|
|
184
|
+
) => HTMLElement | boolean | null;
|
|
185
|
+
const result = callback( 'keyboard' );
|
|
186
|
+
|
|
187
|
+
// Falls back to Base UI's default
|
|
188
|
+
expect( result ).toBe( true );
|
|
189
|
+
} );
|
|
190
|
+
|
|
191
|
+
it( 'returns true when popupRef is not attached', () => {
|
|
192
|
+
let resolved: ReturnType< typeof useDeprioritizedInitialFocus >;
|
|
193
|
+
|
|
194
|
+
function NoRef( {
|
|
195
|
+
onResolved: onResolvedProp,
|
|
196
|
+
}: {
|
|
197
|
+
onResolved: (
|
|
198
|
+
r: ReturnType< typeof useDeprioritizedInitialFocus >
|
|
199
|
+
) => void;
|
|
200
|
+
} ) {
|
|
201
|
+
const result = useDeprioritizedInitialFocus( {
|
|
202
|
+
initialFocus: undefined,
|
|
203
|
+
deprioritizedAttribute: ATTR,
|
|
204
|
+
} );
|
|
205
|
+
|
|
206
|
+
useEffect( () => {
|
|
207
|
+
onResolvedProp( result );
|
|
208
|
+
} );
|
|
209
|
+
|
|
210
|
+
// Intentionally not attaching popupRef to any element
|
|
211
|
+
return <div>Nothing</div>;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
render(
|
|
215
|
+
<NoRef
|
|
216
|
+
onResolved={ ( r ) => {
|
|
217
|
+
resolved = r;
|
|
218
|
+
} }
|
|
219
|
+
/>
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
const callback = resolved!.resolvedInitialFocus as (
|
|
223
|
+
type: string
|
|
224
|
+
) => HTMLElement | boolean | null;
|
|
225
|
+
|
|
226
|
+
expect( callback( 'touch' ) ).toBe( true );
|
|
227
|
+
expect( callback( 'mouse' ) ).toBe( true );
|
|
228
|
+
} );
|
|
229
|
+
} );
|
|
230
|
+
} );
|
package/src/utils/types.ts
CHANGED
|
@@ -14,13 +14,18 @@ type ComponentRenderFn< Props > = (
|
|
|
14
14
|
|
|
15
15
|
export type ComponentProps< E extends ElementType > = Omit<
|
|
16
16
|
ComponentPropsWithoutRef< E >,
|
|
17
|
-
'className' | 'children' | 'render'
|
|
17
|
+
'className' | 'children' | 'render' | 'style'
|
|
18
18
|
> & {
|
|
19
19
|
/**
|
|
20
|
-
* CSS class name to apply to the
|
|
20
|
+
* CSS class name to apply to the element.
|
|
21
21
|
*/
|
|
22
22
|
className?: string;
|
|
23
23
|
|
|
24
|
+
/**
|
|
25
|
+
* CSS style to apply to the element.
|
|
26
|
+
*/
|
|
27
|
+
style?: React.CSSProperties;
|
|
28
|
+
|
|
24
29
|
/**
|
|
25
30
|
* Replaces the component's default HTML element using a given React
|
|
26
31
|
* element, or a function that returns a React element.
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { Popover as _Popover } from '@base-ui/react/popover';
|
|
2
|
+
import { useMemo, useRef } from '@wordpress/element';
|
|
3
|
+
import { tabbable } from 'tabbable';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The `initialFocus` type shared by Base UI overlay popups (Dialog, Popover,
|
|
7
|
+
* AlertDialog, etc.). We derive it from `Popover.Popup.Props` here, but it
|
|
8
|
+
* is identical across all overlay components.
|
|
9
|
+
*/
|
|
10
|
+
type InitialFocus = _Popover.Popup.Props[ 'initialFocus' ];
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Options matching Base UI's internal tabbable configuration.
|
|
14
|
+
* @see https://github.com/floating-ui/floating-ui/blob/master/packages/react/src/utils/tabbable.ts
|
|
15
|
+
*/
|
|
16
|
+
const getTabbableOptions = () => ( {
|
|
17
|
+
getShadowRoot: true,
|
|
18
|
+
displayCheck:
|
|
19
|
+
typeof ResizeObserver === 'function' &&
|
|
20
|
+
ResizeObserver.toString().includes( '[native code]' )
|
|
21
|
+
? ( 'full' as const )
|
|
22
|
+
: ( 'none' as const ),
|
|
23
|
+
} );
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Returns a resolved `initialFocus` value that deprioritizes elements
|
|
27
|
+
* marked with a given data attribute (e.g. a close icon), and an internal
|
|
28
|
+
* ref that must be merged onto the popup element.
|
|
29
|
+
*
|
|
30
|
+
* When `initialFocus` is `undefined` or `true` (the default behavior),
|
|
31
|
+
* the hook replaces it with a callback that:
|
|
32
|
+
* 1. On touch interactions — focuses the popup element itself (preventing
|
|
33
|
+
* the virtual keyboard on Android), matching Base UI's default.
|
|
34
|
+
* 2. On other interactions — returns the first tabbable element that does
|
|
35
|
+
* *not* carry `deprioritizedAttribute`. Falls back to Base UI's default
|
|
36
|
+
* when the deprioritized element is the only tabbable element.
|
|
37
|
+
*
|
|
38
|
+
* All other `initialFocus` values (`false`, `RefObject`, callback) pass
|
|
39
|
+
* through unchanged.
|
|
40
|
+
*
|
|
41
|
+
* @param props
|
|
42
|
+
* @param props.initialFocus The consumer-provided `initialFocus` value.
|
|
43
|
+
* @param props.deprioritizedAttribute The data attribute whose elements should be deprioritized.
|
|
44
|
+
*/
|
|
45
|
+
export function useDeprioritizedInitialFocus( {
|
|
46
|
+
initialFocus,
|
|
47
|
+
deprioritizedAttribute,
|
|
48
|
+
}: {
|
|
49
|
+
initialFocus: InitialFocus;
|
|
50
|
+
deprioritizedAttribute: string;
|
|
51
|
+
} ) {
|
|
52
|
+
const popupRef = useRef< HTMLDivElement >( null );
|
|
53
|
+
|
|
54
|
+
const resolvedInitialFocus = useMemo( (): InitialFocus => {
|
|
55
|
+
if ( initialFocus !== undefined && initialFocus !== true ) {
|
|
56
|
+
return initialFocus;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return ( interactionType ): HTMLElement | boolean | null => {
|
|
60
|
+
if ( interactionType === 'touch' ) {
|
|
61
|
+
return popupRef.current ?? true;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const popup = popupRef.current;
|
|
65
|
+
if ( ! popup ) {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const tabbables = tabbable( popup, getTabbableOptions() );
|
|
70
|
+
for ( const el of tabbables ) {
|
|
71
|
+
if (
|
|
72
|
+
el instanceof HTMLElement &&
|
|
73
|
+
! el.hasAttribute( deprioritizedAttribute )
|
|
74
|
+
) {
|
|
75
|
+
return el;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return true;
|
|
80
|
+
};
|
|
81
|
+
}, [ initialFocus, deprioritizedAttribute ] );
|
|
82
|
+
|
|
83
|
+
return { resolvedInitialFocus, popupRef };
|
|
84
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { useId } from '@wordpress/element';
|
|
2
3
|
import { VisuallyHidden } from '../';
|
|
3
4
|
|
|
4
5
|
const meta: Meta< typeof VisuallyHidden > = {
|
|
@@ -20,3 +21,27 @@ export const Default: Story = {
|
|
|
20
21
|
</>
|
|
21
22
|
),
|
|
22
23
|
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Use the `render` prop to change the underlying HTML element.
|
|
27
|
+
* By default, `VisuallyHidden` renders a `<div>`. Here it renders
|
|
28
|
+
* a `<label>` instead, keeping the native label–input association
|
|
29
|
+
* while hiding the label text visually.
|
|
30
|
+
*/
|
|
31
|
+
export const WithCustomElement: Story = {
|
|
32
|
+
render: function WithCustomElementStory() {
|
|
33
|
+
const inputId = useId();
|
|
34
|
+
return (
|
|
35
|
+
<>
|
|
36
|
+
{ /* eslint-disable-next-line jsx-a11y/label-has-associated-control */ }
|
|
37
|
+
<VisuallyHidden render={ <label htmlFor={ inputId } /> }>
|
|
38
|
+
Accessible label
|
|
39
|
+
</VisuallyHidden>
|
|
40
|
+
<input
|
|
41
|
+
id={ inputId }
|
|
42
|
+
placeholder="This input has a visually hidden label"
|
|
43
|
+
/>
|
|
44
|
+
</>
|
|
45
|
+
);
|
|
46
|
+
},
|
|
47
|
+
};
|
|
@@ -6,6 +6,40 @@ import styles from './style.module.css';
|
|
|
6
6
|
/**
|
|
7
7
|
* Visually hides content while keeping it accessible to screen readers.
|
|
8
8
|
* Useful when providing context that's only meaningful to assistive technology.
|
|
9
|
+
*
|
|
10
|
+
* Renders a `<div>` by default. Use the `render` prop to swap the
|
|
11
|
+
* underlying element while preserving the visually-hidden behavior.
|
|
12
|
+
*
|
|
13
|
+
* ## Composing with other components
|
|
14
|
+
*
|
|
15
|
+
* When composing with another component that uses the `render` prop
|
|
16
|
+
* pattern, there are two directions — and they produce different results.
|
|
17
|
+
*
|
|
18
|
+
* Most of the time you'll want `VisuallyHidden` as the **host** (outer
|
|
19
|
+
* component) and pass the other component via `render`. This keeps the
|
|
20
|
+
* other component's HTML element and semantics intact, while
|
|
21
|
+
* `VisuallyHidden` only adds its hiding styles:
|
|
22
|
+
*
|
|
23
|
+
* ```jsx
|
|
24
|
+
* // OtherComponent keeps its semantic element (e.g. <h2>).
|
|
25
|
+
* <VisuallyHidden render={ <OtherComponent /> }>
|
|
26
|
+
* Accessible text
|
|
27
|
+
* </VisuallyHidden>
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* The opposite direction is also possible, but be aware that it replaces
|
|
31
|
+
* the other component's element with VisuallyHidden's default `<div>`:
|
|
32
|
+
*
|
|
33
|
+
* ```jsx
|
|
34
|
+
* // OtherComponent's element becomes a <div>.
|
|
35
|
+
* <OtherComponent render={ <VisuallyHidden /> }>
|
|
36
|
+
* Accessible text
|
|
37
|
+
* </OtherComponent>
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* Choose based on what you need: if the other component's semantic
|
|
41
|
+
* element matters (e.g. `<label>`, `<legend>`, `<h2>`), keep
|
|
42
|
+
* `VisuallyHidden` as the host so the element is preserved.
|
|
9
43
|
*/
|
|
10
44
|
export const VisuallyHidden = forwardRef< HTMLDivElement, VisuallyHiddenProps >(
|
|
11
45
|
function VisuallyHidden( { render, ...restProps }, ref ) {
|