@wordpress/ui 0.11.1-next.v.202604091042.0 → 0.12.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 +58 -1
- package/CONTRIBUTING.md +124 -0
- package/README.md +17 -9
- package/build/alert-dialog/index.cjs +3 -0
- package/build/alert-dialog/index.cjs.map +2 -2
- package/build/alert-dialog/popup.cjs +120 -55
- package/build/alert-dialog/popup.cjs.map +3 -3
- package/build/alert-dialog/portal.cjs +38 -0
- package/build/alert-dialog/portal.cjs.map +7 -0
- package/build/alert-dialog/types.cjs.map +1 -1
- package/build/badge/badge.cjs +14 -14
- package/build/badge/badge.cjs.map +2 -2
- package/build/button/button.cjs +6 -6
- package/build/button/button.cjs.map +2 -2
- 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 +4 -4
- package/build/card/root.cjs.map +2 -2
- package/build/card/title.cjs +5 -25
- package/build/card/title.cjs.map +4 -4
- package/build/collapsible-card/content.cjs +9 -5
- package/build/collapsible-card/content.cjs.map +2 -2
- package/build/collapsible-card/header.cjs +14 -4
- package/build/collapsible-card/header.cjs.map +3 -3
- package/build/dialog/content.cjs +85 -0
- package/build/dialog/content.cjs.map +7 -0
- package/build/dialog/context.cjs +12 -44
- package/build/dialog/context.cjs.map +2 -2
- package/build/dialog/description.cjs +59 -0
- package/build/dialog/description.cjs.map +7 -0
- package/build/dialog/footer.cjs +5 -4
- package/build/dialog/footer.cjs.map +2 -2
- package/build/dialog/header.cjs +5 -4
- package/build/dialog/header.cjs.map +2 -2
- package/build/dialog/index.cjs +9 -0
- package/build/dialog/index.cjs.map +2 -2
- package/build/dialog/popup.cjs +21 -8
- package/build/dialog/popup.cjs.map +2 -2
- package/build/dialog/portal.cjs +38 -0
- package/build/dialog/portal.cjs.map +7 -0
- package/build/dialog/root.cjs +3 -2
- package/build/dialog/root.cjs.map +2 -2
- package/build/dialog/title.cjs +16 -22
- package/build/dialog/title.cjs.map +3 -3
- package/build/dialog/types.cjs.map +1 -1
- package/build/drawer/action.cjs +48 -0
- package/build/drawer/action.cjs.map +7 -0
- package/build/drawer/close-icon.cjs +58 -0
- package/build/drawer/close-icon.cjs.map +7 -0
- package/build/drawer/content.cjs +86 -0
- package/build/drawer/content.cjs.map +7 -0
- package/build/drawer/context.cjs +44 -0
- package/build/drawer/context.cjs.map +7 -0
- package/build/drawer/description.cjs +47 -0
- package/build/drawer/description.cjs.map +7 -0
- package/build/drawer/footer.cjs +65 -0
- package/build/drawer/footer.cjs.map +7 -0
- package/build/drawer/header.cjs +65 -0
- package/build/drawer/header.cjs.map +7 -0
- package/build/drawer/index.cjs +61 -0
- package/build/drawer/index.cjs.map +7 -0
- package/build/drawer/popup.cjs +103 -0
- package/build/drawer/popup.cjs.map +7 -0
- package/build/drawer/portal.cjs +38 -0
- package/build/drawer/portal.cjs.map +7 -0
- package/build/drawer/root.cjs +49 -0
- package/build/drawer/root.cjs.map +7 -0
- package/build/drawer/title.cjs +70 -0
- package/build/drawer/title.cjs.map +7 -0
- package/build/drawer/trigger.cjs +38 -0
- package/build/drawer/trigger.cjs.map +7 -0
- package/build/drawer/types.cjs +19 -0
- package/build/drawer/types.cjs.map +7 -0
- package/build/empty-state/actions.cjs +3 -3
- package/build/empty-state/actions.cjs.map +2 -2
- package/build/empty-state/description.cjs +8 -5
- package/build/empty-state/description.cjs.map +2 -2
- package/build/empty-state/icon.cjs +3 -3
- package/build/empty-state/icon.cjs.map +2 -2
- package/build/empty-state/root.cjs +3 -3
- package/build/empty-state/root.cjs.map +2 -2
- package/build/empty-state/title.cjs +8 -5
- package/build/empty-state/title.cjs.map +2 -2
- package/build/empty-state/visual.cjs +3 -3
- package/build/empty-state/visual.cjs.map +2 -2
- package/build/form/primitives/autocomplete/clear.cjs +62 -0
- package/build/form/primitives/autocomplete/clear.cjs.map +7 -0
- package/build/form/primitives/autocomplete/collection.cjs +38 -0
- package/build/form/primitives/autocomplete/collection.cjs.map +7 -0
- package/build/form/primitives/autocomplete/empty.cjs +67 -0
- package/build/form/primitives/autocomplete/empty.cjs.map +7 -0
- package/build/form/primitives/autocomplete/index.cjs +64 -0
- package/build/form/primitives/autocomplete/index.cjs.map +7 -0
- package/build/form/primitives/autocomplete/input-group.cjs +36 -0
- package/build/form/primitives/autocomplete/input-group.cjs.map +7 -0
- package/build/form/primitives/autocomplete/input.cjs +47 -0
- package/build/form/primitives/autocomplete/input.cjs.map +7 -0
- package/build/form/primitives/autocomplete/item.cjs +81 -0
- package/build/form/primitives/autocomplete/item.cjs.map +7 -0
- package/build/form/primitives/autocomplete/list-body.cjs +57 -0
- package/build/form/primitives/autocomplete/list-body.cjs.map +7 -0
- package/build/form/primitives/autocomplete/list.cjs +67 -0
- package/build/form/primitives/autocomplete/list.cjs.map +7 -0
- package/build/form/primitives/autocomplete/popup.cjs +102 -0
- package/build/form/primitives/autocomplete/popup.cjs.map +7 -0
- package/build/form/primitives/autocomplete/portal.cjs +38 -0
- package/build/form/primitives/autocomplete/portal.cjs.map +7 -0
- package/build/form/primitives/autocomplete/root.cjs +35 -0
- package/build/form/primitives/autocomplete/root.cjs.map +7 -0
- package/build/form/primitives/autocomplete/types.cjs +19 -0
- package/build/form/primitives/autocomplete/types.cjs.map +7 -0
- package/build/form/primitives/autocomplete/value.cjs +35 -0
- package/build/form/primitives/autocomplete/value.cjs.map +7 -0
- package/build/form/primitives/field/description.cjs +6 -6
- package/build/form/primitives/field/description.cjs.map +2 -2
- 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 +2 -2
- package/build/form/primitives/fieldset/description.cjs +6 -6
- package/build/form/primitives/fieldset/description.cjs.map +2 -2
- 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/index.cjs +3 -0
- package/build/form/primitives/index.cjs.map +2 -2
- package/build/form/primitives/input/input.cjs +6 -6
- package/build/form/primitives/input/input.cjs.map +2 -2
- package/build/form/primitives/input-layout/input-layout.cjs +6 -6
- package/build/form/primitives/input-layout/input-layout.cjs.map +2 -2
- package/build/form/primitives/input-layout/slot.cjs +3 -3
- package/build/form/primitives/input-layout/slot.cjs.map +2 -2
- package/build/form/primitives/select/index.cjs +3 -0
- package/build/form/primitives/select/index.cjs.map +2 -2
- package/build/form/primitives/select/item.cjs +4 -5
- package/build/form/primitives/select/item.cjs.map +2 -2
- package/build/form/primitives/select/popup.cjs +12 -11
- package/build/form/primitives/select/popup.cjs.map +2 -2
- package/build/form/primitives/select/portal.cjs +38 -0
- package/build/form/primitives/select/portal.cjs.map +7 -0
- package/build/form/primitives/select/trigger.cjs +3 -3
- package/build/form/primitives/select/trigger.cjs.map +1 -1
- package/build/form/primitives/select/types.cjs.map +1 -1
- package/build/form/primitives/textarea/textarea.cjs +3 -3
- package/build/form/primitives/textarea/textarea.cjs.map +2 -2
- package/build/index.cjs +3 -0
- package/build/index.cjs.map +2 -2
- package/build/link/link.cjs +11 -21
- package/build/link/link.cjs.map +2 -2
- package/build/link/types.cjs.map +1 -1
- package/build/notice/action-button.cjs +3 -3
- package/build/notice/action-button.cjs.map +2 -2
- package/build/notice/action-link.cjs +8 -7
- 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/root.cjs +3 -3
- 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 +4 -4
- package/build/popover/arrow.cjs.map +2 -2
- package/build/popover/context.cjs +4 -44
- package/build/popover/context.cjs.map +2 -2
- package/build/popover/description.cjs +2 -25
- package/build/popover/description.cjs.map +4 -4
- package/build/popover/index.cjs +3 -0
- package/build/popover/index.cjs.map +2 -2
- package/build/popover/popup.cjs +15 -15
- package/build/popover/popup.cjs.map +2 -2
- package/build/popover/portal.cjs +38 -0
- package/build/popover/portal.cjs.map +7 -0
- package/build/popover/root.cjs.map +1 -1
- package/build/popover/title.cjs +19 -5
- package/build/popover/title.cjs.map +3 -3
- package/build/popover/types.cjs.map +1 -1
- package/build/tabs/context.cjs +9 -22
- package/build/tabs/context.cjs.map +2 -2
- package/build/tabs/list.cjs +4 -5
- package/build/tabs/list.cjs.map +2 -2
- package/build/tabs/panel.cjs +19 -6
- package/build/tabs/panel.cjs.map +3 -3
- package/build/tabs/tab.cjs +4 -4
- package/build/tabs/tab.cjs.map +2 -2
- package/build/text/text.cjs +8 -8
- package/build/text/text.cjs.map +2 -2
- package/build/tooltip/index.cjs +3 -0
- package/build/tooltip/index.cjs.map +2 -2
- package/build/tooltip/popup.cjs +11 -13
- package/build/tooltip/popup.cjs.map +3 -3
- package/build/tooltip/portal.cjs +38 -0
- package/build/tooltip/portal.cjs.map +7 -0
- package/build/tooltip/provider.cjs +2 -2
- package/build/tooltip/provider.cjs.map +3 -3
- package/build/tooltip/root.cjs.map +3 -3
- package/build/tooltip/trigger.cjs +2 -2
- package/build/tooltip/trigger.cjs.map +3 -3
- package/build/tooltip/types.cjs.map +1 -1
- package/build/utils/create-overlay-modal-context.cjs +48 -0
- package/build/utils/create-overlay-modal-context.cjs.map +7 -0
- package/build/utils/create-overlay-title-validation.cjs +93 -0
- package/build/utils/create-overlay-title-validation.cjs.map +7 -0
- package/build/utils/render-portal-with-children.cjs +37 -0
- package/build/utils/render-portal-with-children.cjs.map +7 -0
- package/build/utils/types.cjs.map +1 -1
- package/build/utils/use-deprioritized-initial-focus.cjs +8 -8
- package/build/utils/use-deprioritized-initial-focus.cjs.map +2 -2
- package/build/utils/use-overlay-scroll-state-attributes.cjs +140 -0
- package/build/utils/use-overlay-scroll-state-attributes.cjs.map +7 -0
- package/build/utils/use-schedule-validation.cjs +59 -0
- package/build/utils/use-schedule-validation.cjs.map +7 -0
- package/build/visually-hidden/visually-hidden.cjs +5 -1
- package/build/visually-hidden/visually-hidden.cjs.map +2 -2
- package/build-module/alert-dialog/index.mjs +2 -0
- package/build-module/alert-dialog/index.mjs.map +2 -2
- package/build-module/alert-dialog/popup.mjs +124 -56
- package/build-module/alert-dialog/popup.mjs.map +3 -3
- package/build-module/alert-dialog/portal.mjs +13 -0
- package/build-module/alert-dialog/portal.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 +6 -6
- package/build-module/button/button.mjs.map +2 -2
- 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 +4 -4
- package/build-module/card/root.mjs.map +2 -2
- package/build-module/card/title.mjs +5 -15
- package/build-module/card/title.mjs.map +3 -3
- package/build-module/collapsible-card/content.mjs +9 -5
- package/build-module/collapsible-card/content.mjs.map +2 -2
- package/build-module/collapsible-card/header.mjs +14 -4
- package/build-module/collapsible-card/header.mjs.map +3 -3
- package/build-module/dialog/content.mjs +50 -0
- package/build-module/dialog/content.mjs.map +7 -0
- package/build-module/dialog/context.mjs +10 -51
- package/build-module/dialog/context.mjs.map +2 -2
- package/build-module/dialog/description.mjs +34 -0
- package/build-module/dialog/description.mjs.map +7 -0
- package/build-module/dialog/footer.mjs +5 -4
- package/build-module/dialog/footer.mjs.map +2 -2
- package/build-module/dialog/header.mjs +5 -4
- package/build-module/dialog/header.mjs.map +2 -2
- package/build-module/dialog/index.mjs +6 -0
- package/build-module/dialog/index.mjs.map +2 -2
- package/build-module/dialog/popup.mjs +23 -10
- package/build-module/dialog/popup.mjs.map +2 -2
- package/build-module/dialog/portal.mjs +13 -0
- package/build-module/dialog/portal.mjs.map +7 -0
- package/build-module/dialog/root.mjs +3 -2
- package/build-module/dialog/root.mjs.map +2 -2
- package/build-module/dialog/title.mjs +17 -13
- package/build-module/dialog/title.mjs.map +2 -2
- package/build-module/drawer/action.mjs +23 -0
- package/build-module/drawer/action.mjs.map +7 -0
- package/build-module/drawer/close-icon.mjs +33 -0
- package/build-module/drawer/close-icon.mjs.map +7 -0
- package/build-module/drawer/content.mjs +51 -0
- package/build-module/drawer/content.mjs.map +7 -0
- package/build-module/drawer/context.mjs +16 -0
- package/build-module/drawer/context.mjs.map +7 -0
- package/build-module/drawer/description.mjs +22 -0
- package/build-module/drawer/description.mjs.map +7 -0
- package/build-module/drawer/footer.mjs +30 -0
- package/build-module/drawer/footer.mjs.map +7 -0
- package/build-module/drawer/header.mjs +30 -0
- package/build-module/drawer/header.mjs.map +7 -0
- package/build-module/drawer/index.mjs +26 -0
- package/build-module/drawer/index.mjs.map +7 -0
- package/build-module/drawer/popup.mjs +70 -0
- package/build-module/drawer/popup.mjs.map +7 -0
- package/build-module/drawer/portal.mjs +13 -0
- package/build-module/drawer/portal.mjs.map +7 -0
- package/build-module/drawer/root.mjs +24 -0
- package/build-module/drawer/root.mjs.map +7 -0
- package/build-module/drawer/title.mjs +45 -0
- package/build-module/drawer/title.mjs.map +7 -0
- package/build-module/drawer/trigger.mjs +13 -0
- package/build-module/drawer/trigger.mjs.map +7 -0
- package/build-module/drawer/types.mjs +1 -0
- package/build-module/empty-state/actions.mjs +3 -3
- package/build-module/empty-state/actions.mjs.map +2 -2
- package/build-module/empty-state/description.mjs +8 -5
- package/build-module/empty-state/description.mjs.map +2 -2
- package/build-module/empty-state/icon.mjs +3 -3
- package/build-module/empty-state/icon.mjs.map +2 -2
- package/build-module/empty-state/root.mjs +3 -3
- package/build-module/empty-state/root.mjs.map +2 -2
- package/build-module/empty-state/title.mjs +8 -5
- package/build-module/empty-state/title.mjs.map +2 -2
- package/build-module/empty-state/visual.mjs +3 -3
- package/build-module/empty-state/visual.mjs.map +2 -2
- package/build-module/form/primitives/autocomplete/clear.mjs +37 -0
- package/build-module/form/primitives/autocomplete/clear.mjs.map +7 -0
- package/build-module/form/primitives/autocomplete/collection.mjs +13 -0
- package/build-module/form/primitives/autocomplete/collection.mjs.map +7 -0
- package/build-module/form/primitives/autocomplete/empty.mjs +32 -0
- package/build-module/form/primitives/autocomplete/empty.mjs.map +7 -0
- package/build-module/form/primitives/autocomplete/index.mjs +28 -0
- package/build-module/form/primitives/autocomplete/index.mjs.map +7 -0
- package/build-module/form/primitives/autocomplete/input-group.mjs +11 -0
- package/build-module/form/primitives/autocomplete/input-group.mjs.map +7 -0
- package/build-module/form/primitives/autocomplete/input.mjs +22 -0
- package/build-module/form/primitives/autocomplete/input.mjs.map +7 -0
- package/build-module/form/primitives/autocomplete/item.mjs +46 -0
- package/build-module/form/primitives/autocomplete/item.mjs.map +7 -0
- package/build-module/form/primitives/autocomplete/list-body.mjs +32 -0
- package/build-module/form/primitives/autocomplete/list-body.mjs.map +7 -0
- package/build-module/form/primitives/autocomplete/list.mjs +32 -0
- package/build-module/form/primitives/autocomplete/list.mjs.map +7 -0
- package/build-module/form/primitives/autocomplete/popup.mjs +69 -0
- package/build-module/form/primitives/autocomplete/popup.mjs.map +7 -0
- package/build-module/form/primitives/autocomplete/portal.mjs +13 -0
- package/build-module/form/primitives/autocomplete/portal.mjs.map +7 -0
- package/build-module/form/primitives/autocomplete/root.mjs +10 -0
- package/build-module/form/primitives/autocomplete/root.mjs.map +7 -0
- package/build-module/form/primitives/autocomplete/types.mjs +1 -0
- package/build-module/form/primitives/autocomplete/value.mjs +10 -0
- package/build-module/form/primitives/autocomplete/value.mjs.map +7 -0
- package/build-module/form/primitives/field/description.mjs +6 -6
- package/build-module/form/primitives/field/description.mjs.map +2 -2
- 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 +2 -2
- package/build-module/form/primitives/fieldset/description.mjs +6 -6
- package/build-module/form/primitives/fieldset/description.mjs.map +2 -2
- 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/index.mjs +2 -0
- package/build-module/form/primitives/index.mjs.map +2 -2
- package/build-module/form/primitives/input/input.mjs +6 -6
- package/build-module/form/primitives/input/input.mjs.map +2 -2
- package/build-module/form/primitives/input-layout/input-layout.mjs +6 -6
- package/build-module/form/primitives/input-layout/input-layout.mjs.map +2 -2
- package/build-module/form/primitives/input-layout/slot.mjs +3 -3
- package/build-module/form/primitives/input-layout/slot.mjs.map +2 -2
- package/build-module/form/primitives/select/index.mjs +2 -0
- package/build-module/form/primitives/select/index.mjs.map +2 -2
- package/build-module/form/primitives/select/item.mjs +4 -5
- package/build-module/form/primitives/select/item.mjs.map +2 -2
- package/build-module/form/primitives/select/popup.mjs +12 -11
- package/build-module/form/primitives/select/popup.mjs.map +2 -2
- package/build-module/form/primitives/select/portal.mjs +13 -0
- package/build-module/form/primitives/select/portal.mjs.map +7 -0
- package/build-module/form/primitives/select/trigger.mjs +3 -3
- package/build-module/form/primitives/select/trigger.mjs.map +1 -1
- package/build-module/form/primitives/textarea/textarea.mjs +3 -3
- package/build-module/form/primitives/textarea/textarea.mjs.map +2 -2
- package/build-module/index.mjs +2 -0
- package/build-module/index.mjs.map +2 -2
- package/build-module/link/link.mjs +11 -21
- package/build-module/link/link.mjs.map +2 -2
- 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 +8 -7
- 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/root.mjs +3 -3
- 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 +4 -4
- package/build-module/popover/arrow.mjs.map +2 -2
- package/build-module/popover/context.mjs +4 -51
- package/build-module/popover/context.mjs.map +2 -2
- package/build-module/popover/description.mjs +2 -15
- package/build-module/popover/description.mjs.map +3 -3
- package/build-module/popover/index.mjs +2 -0
- package/build-module/popover/index.mjs.map +2 -2
- package/build-module/popover/popup.mjs +16 -16
- package/build-module/popover/popup.mjs.map +2 -2
- package/build-module/popover/portal.mjs +13 -0
- package/build-module/popover/portal.mjs.map +7 -0
- package/build-module/popover/root.mjs.map +1 -1
- package/build-module/popover/title.mjs +20 -6
- package/build-module/popover/title.mjs.map +3 -3
- package/build-module/tabs/context.mjs +11 -24
- package/build-module/tabs/context.mjs.map +2 -2
- package/build-module/tabs/list.mjs +4 -5
- package/build-module/tabs/list.mjs.map +2 -2
- package/build-module/tabs/panel.mjs +19 -6
- package/build-module/tabs/panel.mjs.map +3 -3
- package/build-module/tabs/tab.mjs +4 -4
- package/build-module/tabs/tab.mjs.map +2 -2
- package/build-module/text/text.mjs +8 -8
- package/build-module/text/text.mjs.map +2 -2
- package/build-module/tooltip/index.mjs +2 -0
- package/build-module/tooltip/index.mjs.map +2 -2
- package/build-module/tooltip/popup.mjs +14 -16
- package/build-module/tooltip/popup.mjs.map +2 -2
- package/build-module/tooltip/portal.mjs +13 -0
- package/build-module/tooltip/portal.mjs.map +7 -0
- package/build-module/tooltip/provider.mjs +3 -3
- package/build-module/tooltip/provider.mjs.map +2 -2
- package/build-module/tooltip/root.mjs +2 -2
- package/build-module/tooltip/root.mjs.map +2 -2
- package/build-module/tooltip/trigger.mjs +3 -3
- package/build-module/tooltip/trigger.mjs.map +2 -2
- package/build-module/utils/create-overlay-modal-context.mjs +23 -0
- package/build-module/utils/create-overlay-modal-context.mjs.map +7 -0
- package/build-module/utils/create-overlay-title-validation.mjs +75 -0
- package/build-module/utils/create-overlay-title-validation.mjs.map +7 -0
- package/build-module/utils/render-portal-with-children.mjs +12 -0
- package/build-module/utils/render-portal-with-children.mjs.map +7 -0
- package/build-module/utils/use-deprioritized-initial-focus.mjs +9 -9
- package/build-module/utils/use-deprioritized-initial-focus.mjs.map +2 -2
- package/build-module/utils/use-overlay-scroll-state-attributes.mjs +114 -0
- package/build-module/utils/use-overlay-scroll-state-attributes.mjs.map +7 -0
- package/build-module/utils/use-schedule-validation.mjs +34 -0
- package/build-module/utils/use-schedule-validation.mjs.map +7 -0
- package/build-module/visually-hidden/visually-hidden.mjs +5 -1
- package/build-module/visually-hidden/visually-hidden.mjs.map +2 -2
- package/build-types/alert-dialog/index.d.ts +1 -0
- package/build-types/alert-dialog/index.d.ts.map +1 -1
- package/build-types/alert-dialog/popup.d.ts.map +1 -1
- package/build-types/alert-dialog/portal.d.ts +9 -0
- package/build-types/alert-dialog/portal.d.ts.map +1 -0
- package/build-types/alert-dialog/stories/index.story.d.ts +29 -1
- package/build-types/alert-dialog/stories/index.story.d.ts.map +1 -1
- package/build-types/alert-dialog/types.d.ts +27 -1
- package/build-types/alert-dialog/types.d.ts.map +1 -1
- package/build-types/badge/badge.d.ts.map +1 -1
- package/build-types/badge/stories/index.story.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/stories/index.story.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/header.d.ts.map +1 -1
- package/build-types/collapsible-card/stories/index.story.d.ts.map +1 -1
- package/build-types/dialog/content.d.ts +17 -0
- package/build-types/dialog/content.d.ts.map +1 -0
- package/build-types/dialog/context.d.ts +11 -16
- package/build-types/dialog/context.d.ts.map +1 -1
- package/build-types/dialog/description.d.ts +9 -0
- package/build-types/dialog/description.d.ts.map +1 -0
- package/build-types/dialog/footer.d.ts +8 -1
- package/build-types/dialog/footer.d.ts.map +1 -1
- package/build-types/dialog/header.d.ts +8 -1
- package/build-types/dialog/header.d.ts.map +1 -1
- package/build-types/dialog/index.d.ts +4 -1
- package/build-types/dialog/index.d.ts.map +1 -1
- package/build-types/dialog/popup.d.ts +3 -0
- package/build-types/dialog/popup.d.ts.map +1 -1
- package/build-types/dialog/portal.d.ts +10 -0
- package/build-types/dialog/portal.d.ts.map +1 -0
- package/build-types/dialog/root.d.ts +14 -4
- package/build-types/dialog/root.d.ts.map +1 -1
- package/build-types/dialog/stories/index.story.d.ts +37 -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 +66 -6
- package/build-types/dialog/types.d.ts.map +1 -1
- package/build-types/drawer/action.d.ts +8 -0
- package/build-types/drawer/action.d.ts.map +1 -0
- package/build-types/drawer/close-icon.d.ts +8 -0
- package/build-types/drawer/close-icon.d.ts.map +1 -0
- package/build-types/drawer/content.d.ts +21 -0
- package/build-types/drawer/content.d.ts.map +1 -0
- package/build-types/drawer/context.d.ts +20 -0
- package/build-types/drawer/context.d.ts.map +1 -0
- package/build-types/drawer/description.d.ts +9 -0
- package/build-types/drawer/description.d.ts.map +1 -0
- package/build-types/drawer/footer.d.ts +15 -0
- package/build-types/drawer/footer.d.ts.map +1 -0
- package/build-types/drawer/header.d.ts +15 -0
- package/build-types/drawer/header.d.ts.map +1 -0
- package/build-types/drawer/index.d.ts +13 -0
- package/build-types/drawer/index.d.ts.map +1 -0
- package/build-types/drawer/popup.d.ts +16 -0
- package/build-types/drawer/popup.d.ts.map +1 -0
- package/build-types/drawer/portal.d.ts +10 -0
- package/build-types/drawer/portal.d.ts.map +1 -0
- package/build-types/drawer/root.d.ts +21 -0
- package/build-types/drawer/root.d.ts.map +1 -0
- package/build-types/drawer/stories/index.story.d.ts +63 -0
- package/build-types/drawer/stories/index.story.d.ts.map +1 -0
- package/build-types/drawer/test/index.test.d.ts +2 -0
- package/build-types/drawer/test/index.test.d.ts.map +1 -0
- package/build-types/drawer/title.d.ts +22 -0
- package/build-types/drawer/title.d.ts.map +1 -0
- package/build-types/drawer/trigger.d.ts +7 -0
- package/build-types/drawer/trigger.d.ts.map +1 -0
- package/build-types/drawer/types.d.ts +146 -0
- package/build-types/drawer/types.d.ts.map +1 -0
- package/build-types/empty-state/description.d.ts.map +1 -1
- package/build-types/empty-state/stories/index.story.d.ts +1 -1
- package/build-types/empty-state/stories/index.story.d.ts.map +1 -1
- package/build-types/empty-state/title.d.ts.map +1 -1
- package/build-types/form/input-control/stories/index.story.d.ts +1 -1
- package/build-types/form/input-control/stories/index.story.d.ts.map +1 -1
- package/build-types/form/primitives/autocomplete/clear.d.ts +13 -0
- package/build-types/form/primitives/autocomplete/clear.d.ts.map +1 -0
- package/build-types/form/primitives/autocomplete/collection.d.ts +3 -0
- package/build-types/form/primitives/autocomplete/collection.d.ts.map +1 -0
- package/build-types/form/primitives/autocomplete/empty.d.ts +10 -0
- package/build-types/form/primitives/autocomplete/empty.d.ts.map +1 -0
- package/build-types/form/primitives/autocomplete/index.d.ts +13 -0
- package/build-types/form/primitives/autocomplete/index.d.ts.map +1 -0
- package/build-types/form/primitives/autocomplete/input-group.d.ts +16 -0
- package/build-types/form/primitives/autocomplete/input-group.d.ts.map +1 -0
- package/build-types/form/primitives/autocomplete/input.d.ts +3 -0
- package/build-types/form/primitives/autocomplete/input.d.ts.map +1 -0
- package/build-types/form/primitives/autocomplete/item.d.ts +10 -0
- package/build-types/form/primitives/autocomplete/item.d.ts.map +1 -0
- package/build-types/form/primitives/autocomplete/list-body.d.ts +13 -0
- package/build-types/form/primitives/autocomplete/list-body.d.ts.map +1 -0
- package/build-types/form/primitives/autocomplete/list.d.ts +11 -0
- package/build-types/form/primitives/autocomplete/list.d.ts.map +1 -0
- package/build-types/form/primitives/autocomplete/popup.d.ts +11 -0
- package/build-types/form/primitives/autocomplete/popup.d.ts.map +1 -0
- package/build-types/form/primitives/autocomplete/portal.d.ts +8 -0
- package/build-types/form/primitives/autocomplete/portal.d.ts.map +1 -0
- package/build-types/form/primitives/autocomplete/root.d.ts +8 -0
- package/build-types/form/primitives/autocomplete/root.d.ts.map +1 -0
- package/build-types/form/primitives/autocomplete/stories/fixtures.d.ts +8 -0
- package/build-types/form/primitives/autocomplete/stories/fixtures.d.ts.map +1 -0
- package/build-types/form/primitives/autocomplete/stories/index.story.d.ts +41 -0
- package/build-types/form/primitives/autocomplete/stories/index.story.d.ts.map +1 -0
- package/build-types/form/primitives/autocomplete/test/index.test.d.ts +2 -0
- package/build-types/form/primitives/autocomplete/test/index.test.d.ts.map +1 -0
- package/build-types/form/primitives/autocomplete/types.d.ts +44 -0
- package/build-types/form/primitives/autocomplete/types.d.ts.map +1 -0
- package/build-types/form/primitives/autocomplete/value.d.ts +3 -0
- package/build-types/form/primitives/autocomplete/value.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 +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 +1 -1
- package/build-types/form/primitives/fieldset/stories/index.story.d.ts.map +1 -1
- package/build-types/form/primitives/index.d.ts +1 -0
- package/build-types/form/primitives/index.d.ts.map +1 -1
- package/build-types/form/primitives/input/stories/index.story.d.ts +1 -1
- package/build-types/form/primitives/input/stories/index.story.d.ts.map +1 -1
- package/build-types/form/primitives/input-layout/stories/index.story.d.ts +1 -1
- package/build-types/form/primitives/input-layout/stories/index.story.d.ts.map +1 -1
- package/build-types/form/primitives/select/index.d.ts +1 -0
- package/build-types/form/primitives/select/index.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 +10 -1
- package/build-types/form/primitives/select/popup.d.ts.map +1 -1
- package/build-types/form/primitives/select/portal.d.ts +8 -0
- package/build-types/form/primitives/select/portal.d.ts.map +1 -0
- package/build-types/form/primitives/select/stories/index.story.d.ts +14 -6
- package/build-types/form/primitives/select/stories/index.story.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 +18 -3
- package/build-types/form/primitives/select/types.d.ts.map +1 -1
- package/build-types/index.d.ts +1 -0
- package/build-types/index.d.ts.map +1 -1
- package/build-types/link/link.d.ts.map +1 -1
- package/build-types/link/stories/index.story.d.ts +2 -3
- package/build-types/link/stories/index.story.d.ts.map +1 -1
- package/build-types/link/types.d.ts +1 -2
- package/build-types/link/types.d.ts.map +1 -1
- package/build-types/notice/action-link.d.ts.map +1 -1
- package/build-types/popover/context.d.ts +6 -13
- package/build-types/popover/context.d.ts.map +1 -1
- package/build-types/popover/description.d.ts +0 -1
- package/build-types/popover/description.d.ts.map +1 -1
- package/build-types/popover/index.d.ts +2 -1
- package/build-types/popover/index.d.ts.map +1 -1
- package/build-types/popover/popup.d.ts +3 -2
- package/build-types/popover/popup.d.ts.map +1 -1
- package/build-types/popover/portal.d.ts +9 -0
- package/build-types/popover/portal.d.ts.map +1 -0
- package/build-types/popover/root.d.ts +2 -2
- package/build-types/popover/stories/index.story.d.ts +24 -16
- package/build-types/popover/stories/index.story.d.ts.map +1 -1
- package/build-types/popover/title.d.ts.map +1 -1
- package/build-types/popover/types.d.ts +8 -15
- package/build-types/popover/types.d.ts.map +1 -1
- package/build-types/stack/stories/index.story.d.ts.map +1 -1
- package/build-types/tabs/context.d.ts.map +1 -1
- 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/stories/index.story.d.ts +1 -1
- package/build-types/tabs/stories/index.story.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.map +1 -1
- package/build-types/tooltip/index.d.ts +2 -1
- package/build-types/tooltip/index.d.ts.map +1 -1
- package/build-types/tooltip/popup.d.ts.map +1 -1
- package/build-types/tooltip/portal.d.ts +8 -0
- package/build-types/tooltip/portal.d.ts.map +1 -0
- package/build-types/tooltip/provider.d.ts +1 -1
- package/build-types/tooltip/provider.d.ts.map +1 -1
- package/build-types/tooltip/root.d.ts +9 -8
- package/build-types/tooltip/root.d.ts.map +1 -1
- package/build-types/tooltip/stories/index.story.d.ts +18 -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/trigger.d.ts.map +1 -1
- package/build-types/tooltip/types.d.ts +13 -5
- package/build-types/tooltip/types.d.ts.map +1 -1
- package/build-types/utils/create-overlay-modal-context.d.ts +14 -0
- package/build-types/utils/create-overlay-modal-context.d.ts.map +1 -0
- package/build-types/utils/create-overlay-title-validation.d.ts +15 -0
- package/build-types/utils/create-overlay-title-validation.d.ts.map +1 -0
- package/build-types/utils/render-portal-with-children.d.ts +16 -0
- package/build-types/utils/render-portal-with-children.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 +9 -8
- package/build-types/utils/use-deprioritized-initial-focus.d.ts.map +1 -1
- package/build-types/utils/use-overlay-scroll-state-attributes.d.ts +85 -0
- package/build-types/utils/use-overlay-scroll-state-attributes.d.ts.map +1 -0
- package/build-types/utils/use-schedule-validation.d.ts +13 -0
- package/build-types/utils/use-schedule-validation.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 +18 -0
- package/build-types/visually-hidden/visually-hidden.d.ts.map +1 -1
- package/package.json +12 -12
- package/src/alert-dialog/index.ts +1 -0
- package/src/alert-dialog/popup.tsx +114 -45
- package/src/alert-dialog/portal.tsx +17 -0
- package/src/alert-dialog/stories/index.story.tsx +123 -3
- package/src/alert-dialog/style.module.css +13 -4
- package/src/alert-dialog/test/index.test.tsx +380 -0
- package/src/alert-dialog/types.ts +33 -1
- package/src/badge/badge.tsx +11 -14
- package/src/badge/stories/choosing-intent.story.tsx +1 -1
- package/src/badge/stories/index.story.tsx +1 -0
- package/src/badge/style.module.css +0 -4
- package/src/button/style.module.css +4 -4
- package/src/card/stories/index.story.tsx +5 -4
- package/src/card/style.module.css +0 -4
- package/src/card/test/index.test.tsx +17 -0
- package/src/card/title.tsx +6 -5
- package/src/collapsible/stories/index.story.tsx +1 -0
- package/src/collapsible-card/content.tsx +12 -1
- package/src/collapsible-card/header.tsx +2 -0
- package/src/collapsible-card/stories/index.story.tsx +6 -5
- package/src/collapsible-card/style.module.css +16 -4
- package/src/dialog/content.tsx +47 -0
- package/src/dialog/context.tsx +14 -98
- package/src/dialog/description.tsx +27 -0
- package/src/dialog/footer.tsx +10 -2
- package/src/dialog/header.tsx +10 -2
- package/src/dialog/index.ts +16 -1
- package/src/dialog/popup.tsx +28 -7
- package/src/dialog/portal.tsx +18 -0
- package/src/dialog/root.tsx +22 -5
- package/src/dialog/stories/index.story.tsx +224 -47
- package/src/dialog/style.module.css +78 -24
- package/src/dialog/test/index.test.tsx +907 -148
- package/src/dialog/title.tsx +27 -13
- package/src/dialog/types.ts +71 -5
- package/src/drawer/action.tsx +28 -0
- package/src/drawer/close-icon.tsx +33 -0
- package/src/drawer/content.tsx +50 -0
- package/src/drawer/context.tsx +29 -0
- package/src/drawer/description.tsx +25 -0
- package/src/drawer/footer.tsx +34 -0
- package/src/drawer/header.tsx +34 -0
- package/src/drawer/index.ts +25 -0
- package/src/drawer/popup.tsx +100 -0
- package/src/drawer/portal.tsx +18 -0
- package/src/drawer/root.tsx +41 -0
- package/src/drawer/stories/index.story.tsx +543 -0
- package/src/drawer/style.module.css +324 -0
- package/src/drawer/test/index.test.tsx +1097 -0
- package/src/drawer/title.tsx +53 -0
- package/src/drawer/trigger.tsx +14 -0
- package/src/drawer/types.ts +174 -0
- package/src/empty-state/description.tsx +6 -2
- package/src/empty-state/stories/index.story.tsx +2 -1
- package/src/empty-state/style.module.css +1 -1
- package/src/empty-state/test/description.test.tsx +13 -0
- package/src/empty-state/test/title.test.tsx +13 -0
- package/src/empty-state/title.tsx +9 -2
- package/src/form/input-control/stories/index.story.tsx +4 -1
- package/src/form/primitives/autocomplete/clear.tsx +35 -0
- package/src/form/primitives/autocomplete/collection.tsx +13 -0
- package/src/form/primitives/autocomplete/empty.tsx +17 -0
- package/src/form/primitives/autocomplete/index.ts +12 -0
- package/src/form/primitives/autocomplete/input-group.tsx +16 -0
- package/src/form/primitives/autocomplete/input.tsx +20 -0
- package/src/form/primitives/autocomplete/item.tsx +24 -0
- package/src/form/primitives/autocomplete/list-body.tsx +23 -0
- package/src/form/primitives/autocomplete/list.tsx +17 -0
- package/src/form/primitives/autocomplete/popup.tsx +42 -0
- package/src/form/primitives/autocomplete/portal.tsx +16 -0
- package/src/form/primitives/autocomplete/root.tsx +11 -0
- package/src/form/primitives/autocomplete/stories/fixtures.ts +35 -0
- package/src/form/primitives/autocomplete/stories/index.story.tsx +437 -0
- package/src/form/primitives/autocomplete/style.module.css +7 -0
- package/src/form/primitives/autocomplete/test/index.test.tsx +162 -0
- package/src/form/primitives/autocomplete/types.ts +74 -0
- package/src/form/primitives/autocomplete/value.tsx +6 -0
- package/src/form/primitives/field/details.tsx +4 -2
- package/src/form/primitives/field/label.tsx +9 -5
- package/src/form/primitives/field/root.tsx +2 -2
- package/src/form/primitives/field/stories/index.story.tsx +1 -1
- package/src/form/primitives/field/test/index.test.tsx +11 -0
- package/src/form/primitives/fieldset/legend.tsx +9 -4
- package/src/form/primitives/fieldset/stories/index.story.tsx +1 -1
- package/src/form/primitives/fieldset/test/index.test.tsx +22 -0
- package/src/form/primitives/index.ts +1 -0
- package/src/form/primitives/input/stories/index.story.tsx +2 -1
- package/src/form/primitives/input-layout/stories/index.story.tsx +2 -1
- package/src/form/primitives/input-layout/style.module.css +3 -3
- package/src/form/primitives/select/index.ts +1 -0
- package/src/form/primitives/select/item.tsx +0 -1
- package/src/form/primitives/select/popup.tsx +34 -34
- package/src/form/primitives/select/portal.tsx +16 -0
- package/src/form/primitives/select/stories/index.story.tsx +21 -7
- package/src/form/primitives/select/test/index.test.tsx +64 -1
- package/src/form/primitives/select/types.ts +21 -4
- package/src/index.ts +1 -0
- package/src/link/link.tsx +12 -26
- package/src/link/stories/index.story.tsx +6 -11
- package/src/link/style.module.css +6 -18
- package/src/link/test/index.test.tsx +31 -27
- package/src/link/types.ts +1 -2
- package/src/notice/action-link.tsx +7 -4
- package/src/notice/style.module.css +6 -6
- package/src/popover/context.tsx +6 -89
- package/src/popover/description.tsx +2 -11
- package/src/popover/index.ts +2 -1
- package/src/popover/popup.tsx +17 -15
- package/src/popover/portal.tsx +17 -0
- package/src/popover/root.tsx +2 -2
- package/src/popover/stories/index.story.tsx +57 -26
- package/src/popover/style.module.css +36 -7
- package/src/popover/test/index.test.tsx +189 -74
- package/src/popover/title.tsx +10 -9
- package/src/popover/types.ts +10 -15
- package/src/stack/stories/index.story.tsx +1 -0
- package/src/tabs/context.tsx +14 -34
- package/src/tabs/list.tsx +0 -1
- package/src/tabs/panel.tsx +7 -2
- package/src/tabs/stories/index.story.tsx +2 -1
- package/src/tabs/style.module.css +2 -19
- package/src/tabs/test/index.test.tsx +7 -3
- package/src/text/stories/index.story.tsx +1 -0
- package/src/text/style.module.css +49 -49
- package/src/text/text.tsx +2 -2
- package/src/tooltip/index.ts +2 -1
- package/src/tooltip/popup.tsx +24 -27
- package/src/tooltip/portal.tsx +16 -0
- package/src/tooltip/provider.tsx +3 -3
- package/src/tooltip/root.tsx +11 -10
- package/src/tooltip/stories/index.story.tsx +39 -1
- package/src/tooltip/stories/usage-guidelines.mdx +91 -0
- package/src/tooltip/stories/usage-guidelines.story.tsx +123 -0
- package/src/tooltip/style.module.css +14 -2
- package/src/tooltip/test/index.test.tsx +67 -0
- package/src/tooltip/trigger.tsx +3 -7
- package/src/tooltip/types.ts +16 -5
- package/src/utils/create-overlay-modal-context.tsx +34 -0
- package/src/utils/create-overlay-title-validation.tsx +116 -0
- package/src/utils/css/field.module.css +10 -10
- package/src/utils/css/global-css-defense.module.css +1 -1
- package/src/utils/css/item-popup.module.css +11 -13
- package/src/utils/css/overlay-chrome.module.css +222 -0
- package/src/utils/render-portal-with-children.ts +27 -0
- package/src/utils/test/use-deprioritized-initial-focus.test.tsx +3 -3
- package/src/utils/types.ts +7 -2
- package/src/utils/use-deprioritized-initial-focus.ts +23 -17
- package/src/utils/use-overlay-scroll-state-attributes.ts +272 -0
- package/src/utils/use-schedule-validation.ts +45 -0
- package/src/visually-hidden/stories/index.story.tsx +26 -0
- package/src/visually-hidden/visually-hidden.tsx +23 -1
- package/build/types/css-modules.d.cjs +0 -2
- package/build/types/react.d.cjs +0 -5
- package/build/types/react.d.cjs.map +0 -7
- package/build-module/types/css-modules.d.mjs +0 -1
- package/build-module/types/react.d.mjs +0 -3
- package/build-module/types/react.d.mjs.map +0 -7
- package/src/types/css-modules.d.ts +0 -4
- package/src/types/react.d.ts +0 -7
- /package/build-module/{types/css-modules.d.mjs.map → drawer/types.mjs.map} +0 -0
- /package/{build/types/css-modules.d.cjs.map → build-module/form/primitives/autocomplete/types.mjs.map} +0 -0
|
@@ -84,4 +84,71 @@ describe( 'Tooltip', () => {
|
|
|
84
84
|
screen.queryByText( 'Tooltip content' )
|
|
85
85
|
).not.toBeInTheDocument();
|
|
86
86
|
} );
|
|
87
|
+
|
|
88
|
+
describe( 'portal', () => {
|
|
89
|
+
it( 'should render inside the portal container when a custom target is provided', async () => {
|
|
90
|
+
const user = userEvent.setup();
|
|
91
|
+
const containerRef = createRef< HTMLDivElement >();
|
|
92
|
+
|
|
93
|
+
render(
|
|
94
|
+
<TestProvider>
|
|
95
|
+
<div data-testid="wrapper">
|
|
96
|
+
<Tooltip.Root>
|
|
97
|
+
<Tooltip.Trigger>Hover me</Tooltip.Trigger>
|
|
98
|
+
<div
|
|
99
|
+
ref={ containerRef }
|
|
100
|
+
data-testid="custom-container"
|
|
101
|
+
/>
|
|
102
|
+
<Tooltip.Popup
|
|
103
|
+
portal={
|
|
104
|
+
<Tooltip.Portal
|
|
105
|
+
container={ containerRef }
|
|
106
|
+
/>
|
|
107
|
+
}
|
|
108
|
+
>
|
|
109
|
+
Tooltip content
|
|
110
|
+
</Tooltip.Popup>
|
|
111
|
+
</Tooltip.Root>
|
|
112
|
+
</div>
|
|
113
|
+
</TestProvider>
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
await user.hover(
|
|
117
|
+
screen.getByRole( 'button', { name: 'Hover me' } )
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
const content = await screen.findByText( 'Tooltip content' );
|
|
121
|
+
expect( content ).toBeVisible();
|
|
122
|
+
|
|
123
|
+
expect( screen.getByTestId( 'custom-container' ) ).toContainElement(
|
|
124
|
+
content
|
|
125
|
+
);
|
|
126
|
+
} );
|
|
127
|
+
|
|
128
|
+
it( 'should render with a portal by default', async () => {
|
|
129
|
+
const user = userEvent.setup();
|
|
130
|
+
|
|
131
|
+
render(
|
|
132
|
+
<TestProvider>
|
|
133
|
+
<div data-testid="wrapper">
|
|
134
|
+
<Tooltip.Root>
|
|
135
|
+
<Tooltip.Trigger>Hover me</Tooltip.Trigger>
|
|
136
|
+
<Tooltip.Popup>Tooltip content</Tooltip.Popup>
|
|
137
|
+
</Tooltip.Root>
|
|
138
|
+
</div>
|
|
139
|
+
</TestProvider>
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
await user.hover(
|
|
143
|
+
screen.getByRole( 'button', { name: 'Hover me' } )
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
const content = await screen.findByText( 'Tooltip content' );
|
|
147
|
+
expect( content ).toBeVisible();
|
|
148
|
+
|
|
149
|
+
expect( screen.getByTestId( 'wrapper' ) ).not.toContainElement(
|
|
150
|
+
content
|
|
151
|
+
);
|
|
152
|
+
} );
|
|
153
|
+
} );
|
|
87
154
|
} );
|
package/src/tooltip/trigger.tsx
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
import { Tooltip } from '@base-ui/react/tooltip';
|
|
1
|
+
import { Tooltip as _Tooltip } from '@base-ui/react/tooltip';
|
|
2
2
|
import { forwardRef } from '@wordpress/element';
|
|
3
3
|
import type { TriggerProps } from './types';
|
|
4
4
|
|
|
5
5
|
const Trigger = forwardRef< HTMLButtonElement, TriggerProps >(
|
|
6
|
-
function TooltipTrigger(
|
|
7
|
-
return
|
|
8
|
-
<Tooltip.Trigger ref={ ref } { ...props }>
|
|
9
|
-
{ children }
|
|
10
|
-
</Tooltip.Trigger>
|
|
11
|
-
);
|
|
6
|
+
function TooltipTrigger( props, ref ) {
|
|
7
|
+
return <_Tooltip.Trigger ref={ ref } { ...props } />;
|
|
12
8
|
}
|
|
13
9
|
);
|
|
14
10
|
|
package/src/tooltip/types.ts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import type { ReactNode } from 'react';
|
|
2
|
-
import type { Tooltip } from '@base-ui/react/tooltip';
|
|
1
|
+
import type { ComponentPropsWithoutRef, ReactElement, ReactNode } from 'react';
|
|
2
|
+
import type { Tooltip as _Tooltip } from '@base-ui/react/tooltip';
|
|
3
|
+
|
|
3
4
|
import type { ComponentProps } from '../utils/types';
|
|
4
5
|
|
|
5
|
-
export type
|
|
6
|
+
export type PortalProps = ComponentPropsWithoutRef< typeof _Tooltip.Portal >;
|
|
7
|
+
|
|
8
|
+
export type RootProps = Pick< _Tooltip.Root.Props, 'disabled' | 'children' >;
|
|
6
9
|
|
|
7
10
|
export type ProviderProps = Pick<
|
|
8
|
-
|
|
11
|
+
_Tooltip.Provider.Props,
|
|
9
12
|
'delay' | 'children'
|
|
10
13
|
>;
|
|
11
14
|
|
|
@@ -18,9 +21,17 @@ export interface TriggerProps extends ComponentProps< 'button' > {
|
|
|
18
21
|
|
|
19
22
|
export interface PopupProps
|
|
20
23
|
extends ComponentProps< 'div' >,
|
|
21
|
-
Pick<
|
|
24
|
+
Pick< _Tooltip.Positioner.Props, 'align' | 'side' | 'sideOffset' > {
|
|
22
25
|
/**
|
|
23
26
|
* The content to be rendered inside the component.
|
|
24
27
|
*/
|
|
25
28
|
children?: ReactNode;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Optional portal element, typically `<Tooltip.Portal />` with custom
|
|
32
|
+
* `container`. When omitted, `Tooltip.Popup` uses `Tooltip.Portal` with
|
|
33
|
+
* default props. Do not pass `children` on the portal element; they would
|
|
34
|
+
* be ignored.
|
|
35
|
+
*/
|
|
36
|
+
portal?: ReactElement< Omit< PortalProps, 'children' > >;
|
|
26
37
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createContext, useContext } from '@wordpress/element';
|
|
2
|
+
|
|
3
|
+
type OverlayModalProviderProps< Modal > = {
|
|
4
|
+
modal: Modal;
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Creates a modal context pair (`Provider` + `useModal`) for overlay
|
|
10
|
+
* primitives like Dialog and Drawer.
|
|
11
|
+
*/
|
|
12
|
+
export function createOverlayModalContext< Modal >( initialValue: Modal ) {
|
|
13
|
+
const OverlayModalContext = createContext< Modal >( initialValue );
|
|
14
|
+
|
|
15
|
+
function OverlayModalProvider( {
|
|
16
|
+
modal,
|
|
17
|
+
children,
|
|
18
|
+
}: OverlayModalProviderProps< Modal > ) {
|
|
19
|
+
return (
|
|
20
|
+
<OverlayModalContext.Provider value={ modal }>
|
|
21
|
+
{ children }
|
|
22
|
+
</OverlayModalContext.Provider>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function useOverlayModal() {
|
|
27
|
+
return useContext( OverlayModalContext );
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
Provider: OverlayModalProvider,
|
|
32
|
+
useModal: useOverlayModal,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createContext,
|
|
3
|
+
useCallback,
|
|
4
|
+
useContext,
|
|
5
|
+
useEffect,
|
|
6
|
+
useMemo,
|
|
7
|
+
useRef,
|
|
8
|
+
} from '@wordpress/element';
|
|
9
|
+
import { useScheduleValidation } from './use-schedule-validation';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Whether validation is enabled. This is a build-time constant that allows
|
|
13
|
+
* bundlers to tree-shake all validation code in production builds.
|
|
14
|
+
*/
|
|
15
|
+
const VALIDATION_ENABLED = process.env.NODE_ENV !== 'production';
|
|
16
|
+
|
|
17
|
+
type OverlayValidationContextType = {
|
|
18
|
+
registerTitle: ( element: HTMLElement | null ) => () => void;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
type OverlayValidationProviderProps = {
|
|
22
|
+
children: React.ReactNode;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Creates development-only title validation helpers for overlay primitives.
|
|
27
|
+
*/
|
|
28
|
+
export function createOverlayTitleValidation( componentName: string ) {
|
|
29
|
+
const componentNameLowerCase = componentName.toLowerCase();
|
|
30
|
+
const OverlayValidationContext = VALIDATION_ENABLED
|
|
31
|
+
? createContext< OverlayValidationContextType | null >( null )
|
|
32
|
+
: ( null as unknown as React.Context< OverlayValidationContextType | null > );
|
|
33
|
+
|
|
34
|
+
function useValidationContextDev() {
|
|
35
|
+
return useContext( OverlayValidationContext );
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function useValidationContextProd() {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const useValidationContext = VALIDATION_ENABLED
|
|
43
|
+
? useValidationContextDev
|
|
44
|
+
: useValidationContextProd;
|
|
45
|
+
|
|
46
|
+
function ValidationProviderDev( {
|
|
47
|
+
children,
|
|
48
|
+
}: OverlayValidationProviderProps ) {
|
|
49
|
+
const titleElementRef = useRef< HTMLElement | null >( null );
|
|
50
|
+
|
|
51
|
+
const scheduleValidation = useScheduleValidation( () => {
|
|
52
|
+
const titleElement = titleElementRef.current;
|
|
53
|
+
|
|
54
|
+
if ( ! titleElement ) {
|
|
55
|
+
throw new Error(
|
|
56
|
+
`${ componentName }: Missing <${ componentName }.Title>. ` +
|
|
57
|
+
`For accessibility, every ${ componentNameLowerCase } requires a title. ` +
|
|
58
|
+
'If needed, the title can be visually hidden but must not be omitted.'
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const textContent = titleElement.textContent?.trim();
|
|
63
|
+
if ( ! textContent ) {
|
|
64
|
+
throw new Error(
|
|
65
|
+
`${ componentName }: <${ componentName }.Title> cannot be empty. ` +
|
|
66
|
+
`Provide meaningful text content for the ${ componentNameLowerCase } title.`
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
} );
|
|
70
|
+
|
|
71
|
+
const registerTitle = useCallback(
|
|
72
|
+
( element: HTMLElement | null ) => {
|
|
73
|
+
titleElementRef.current = element;
|
|
74
|
+
scheduleValidation();
|
|
75
|
+
|
|
76
|
+
return () => {
|
|
77
|
+
titleElementRef.current = null;
|
|
78
|
+
scheduleValidation();
|
|
79
|
+
};
|
|
80
|
+
},
|
|
81
|
+
[ scheduleValidation ]
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
const contextValue = useMemo(
|
|
85
|
+
() => ( { registerTitle } ),
|
|
86
|
+
[ registerTitle ]
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
// Schedule an initial validation on mount to catch missing titles
|
|
90
|
+
// (when no Title component is rendered, registerTitle is never called).
|
|
91
|
+
useEffect( () => {
|
|
92
|
+
scheduleValidation();
|
|
93
|
+
}, [ scheduleValidation ] );
|
|
94
|
+
|
|
95
|
+
return (
|
|
96
|
+
<OverlayValidationContext.Provider value={ contextValue }>
|
|
97
|
+
{ children }
|
|
98
|
+
</OverlayValidationContext.Provider>
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function ValidationProviderProd( {
|
|
103
|
+
children,
|
|
104
|
+
}: OverlayValidationProviderProps ) {
|
|
105
|
+
return <>{ children }</>;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const ValidationProvider = VALIDATION_ENABLED
|
|
109
|
+
? ValidationProviderDev
|
|
110
|
+
: ValidationProviderProd;
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
ValidationProvider,
|
|
114
|
+
useValidationContext,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
@@ -2,29 +2,29 @@
|
|
|
2
2
|
|
|
3
3
|
@layer wp-ui-utilities {
|
|
4
4
|
.label {
|
|
5
|
-
--wp-ui-field-label-line-height: var(--wpds-
|
|
5
|
+
--wp-ui-field-label-line-height: var(--wpds-typography-line-height-xs);
|
|
6
6
|
|
|
7
|
-
font-family: var(--wpds-font-family-body);
|
|
8
|
-
font-size: var(--wpds-font-size-xs);
|
|
7
|
+
font-family: var(--wpds-typography-font-family-body);
|
|
8
|
+
font-size: var(--wpds-typography-font-size-xs);
|
|
9
9
|
line-height: var(--wp-ui-field-label-line-height);
|
|
10
|
-
font-weight: var(--wpds-font-weight-medium);
|
|
10
|
+
font-weight: var(--wpds-typography-font-weight-medium);
|
|
11
11
|
text-transform: uppercase;
|
|
12
12
|
color: var(--wpds-color-fg-content-neutral);
|
|
13
13
|
|
|
14
14
|
&.is-plain {
|
|
15
|
-
font-size: var(--wpds-font-size-md);
|
|
15
|
+
font-size: var(--wpds-typography-font-size-md);
|
|
16
16
|
text-transform: none;
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
.description {
|
|
21
|
-
--_gcd-p-font-size: var(--wpds-font-size-sm);
|
|
22
|
-
--_gcd-p-line-height: var(--wpds-
|
|
21
|
+
--_gcd-p-font-size: var(--wpds-typography-font-size-sm);
|
|
22
|
+
--_gcd-p-line-height: var(--wpds-typography-line-height-xs);
|
|
23
23
|
--_gcd-p-margin: 0;
|
|
24
24
|
|
|
25
|
-
font-family: var(--wpds-font-family-body);
|
|
26
|
-
font-size: var(--wpds-font-size-sm);
|
|
27
|
-
line-height: var(--wpds-
|
|
25
|
+
font-family: var(--wpds-typography-font-family-body);
|
|
26
|
+
font-size: var(--wpds-typography-font-size-sm);
|
|
27
|
+
line-height: var(--wpds-typography-line-height-xs);
|
|
28
28
|
color: var(--wpds-color-fg-content-neutral-weak);
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -103,7 +103,7 @@ p.p {
|
|
|
103
103
|
:is(h1, h2, h3, h4, h5, h6).heading {
|
|
104
104
|
color: var(--_gcd-heading-color, var(--wpds-color-fg-content-neutral));
|
|
105
105
|
font-size: var(--_gcd-heading-font-size, inherit);
|
|
106
|
-
font-weight: var(--_gcd-heading-font-weight, var(--wpds-font-weight-medium));
|
|
106
|
+
font-weight: var(--_gcd-heading-font-weight, var(--wpds-typography-font-weight-medium));
|
|
107
107
|
margin: var(--_gcd-heading-margin, 0);
|
|
108
108
|
}
|
|
109
109
|
|
|
@@ -13,11 +13,11 @@
|
|
|
13
13
|
min-width: var(--anchor-width);
|
|
14
14
|
max-width: var(--available-width);
|
|
15
15
|
border-radius: var(--wpds-border-radius-md);
|
|
16
|
-
border:
|
|
16
|
+
border: var(--wpds-border-width-xs) 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
|
}
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
padding-block: var(--wp-ui-popup-padding);
|
|
46
46
|
|
|
47
47
|
.list-scrollable-container:not(:empty) + & {
|
|
48
|
-
border-block-start:
|
|
48
|
+
border-block-start: var(--wpds-border-width-xs) solid var(--wpds-color-stroke-surface-neutral);
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
|
|
@@ -55,8 +55,7 @@
|
|
|
55
55
|
--wp-ui-popup-item-padding-inline: 12px;
|
|
56
56
|
--wp-ui-popup-item-padding-block: 4px;
|
|
57
57
|
|
|
58
|
-
display:
|
|
59
|
-
grid-template-columns: 24px 1fr;
|
|
58
|
+
display: flex;
|
|
60
59
|
align-items: center;
|
|
61
60
|
justify-content: flex-start;
|
|
62
61
|
gap: var(--wpds-dimension-gap-xs);
|
|
@@ -106,23 +105,22 @@
|
|
|
106
105
|
}
|
|
107
106
|
}
|
|
108
107
|
|
|
109
|
-
.item-indicator {
|
|
110
|
-
|
|
108
|
+
.item-indicator-icon {
|
|
109
|
+
flex-shrink: 0;
|
|
111
110
|
}
|
|
112
111
|
|
|
113
|
-
|
|
112
|
+
/* Only style when there is content, because otherwise the element would block clicks
|
|
113
|
+
on the .list beneath it (both share grid-area: main and overlap). */
|
|
114
|
+
.empty:not(:empty) {
|
|
114
115
|
--wp-ui-popup-empty-min-height: 40px;
|
|
115
116
|
--wp-ui-popup-empty-padding-inline: 12px;
|
|
116
117
|
|
|
117
118
|
grid-area: main;
|
|
118
119
|
display: flex;
|
|
119
120
|
align-items: center;
|
|
121
|
+
min-height: var(--wp-ui-popup-empty-min-height);
|
|
120
122
|
padding-inline: var(--wp-ui-popup-empty-padding-inline);
|
|
121
123
|
color: var(--wpds-color-fg-content-neutral-weak);
|
|
122
|
-
|
|
123
|
-
&:not(:empty) {
|
|
124
|
-
min-height: var(--wp-ui-popup-empty-min-height);
|
|
125
|
-
}
|
|
126
124
|
}
|
|
127
125
|
|
|
128
126
|
}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
@layer wp-ui-utilities, wp-ui-components, wp-ui-compositions, wp-ui-overrides;
|
|
2
|
+
|
|
3
|
+
@layer wp-ui-components {
|
|
4
|
+
/*
|
|
5
|
+
* Shared chrome + scroll-container primitives for overlay popups
|
|
6
|
+
* (Dialog, AlertDialog, Drawer).
|
|
7
|
+
*
|
|
8
|
+
* Layout model: the popup is a vertical flex column with three regions
|
|
9
|
+
* — `.header`, `.content`, `.footer`. Only `.content` scrolls; the
|
|
10
|
+
* chrome sits at the popup's block-axis edges as natural flex siblings.
|
|
11
|
+
*
|
|
12
|
+
* Sticky opt-out for `Dialog` / `Drawer` is expressed in the DOM by
|
|
13
|
+
* placing `Dialog.Header` / `Dialog.Footer` (or the Drawer equivalents)
|
|
14
|
+
* inside `Dialog.Content` / `Drawer.Content` so they scroll with the
|
|
15
|
+
* body; AlertDialog exposes the same choice via `stickyHeader` /
|
|
16
|
+
* `stickyFooter` props, since it owns its internal DOM.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/*
|
|
20
|
+
* Chrome: flex row, no background (the popup already paints it), no
|
|
21
|
+
* sticky positioning. Block-axis padding is asymmetric: the outer
|
|
22
|
+
* side (popup edge) uses `padding-2xl` to match the inset that used
|
|
23
|
+
* to live on the popup; the inner side (toward `.content`) uses the
|
|
24
|
+
* tokenized `gap-lg` in full.
|
|
25
|
+
*
|
|
26
|
+
* No separator border here — the base chrome has none. The pinned
|
|
27
|
+
* case (where a separator is needed) adds a `border-block-*: 1px
|
|
28
|
+
* solid transparent` on the inner side and subtracts 1px from that
|
|
29
|
+
* same padding so the chrome's overall border-box height stays
|
|
30
|
+
* identical to the non-pinned case. See the `:has(~ .content)` /
|
|
31
|
+
* `.content ~` rules below.
|
|
32
|
+
*
|
|
33
|
+
* `min-height` on `.header` keeps the header footprint stable whether
|
|
34
|
+
* or not a close icon is rendered (notably the AlertDialog case, which
|
|
35
|
+
* has no close button).
|
|
36
|
+
*/
|
|
37
|
+
.header {
|
|
38
|
+
display: flex;
|
|
39
|
+
align-items: center;
|
|
40
|
+
gap: var(--wpds-dimension-gap-sm);
|
|
41
|
+
padding-block: var(--wpds-dimension-padding-2xl) var(--wpds-dimension-gap-lg);
|
|
42
|
+
padding-inline: var(--wpds-dimension-padding-2xl);
|
|
43
|
+
/* TODO: refactor to a DS element size token when available. */
|
|
44
|
+
min-height: 32px;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.footer {
|
|
48
|
+
display: flex;
|
|
49
|
+
justify-content: flex-end;
|
|
50
|
+
align-items: center;
|
|
51
|
+
gap: var(--wpds-dimension-gap-sm);
|
|
52
|
+
padding-block: var(--wpds-dimension-gap-lg) var(--wpds-dimension-padding-2xl);
|
|
53
|
+
padding-inline: var(--wpds-dimension-padding-2xl);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/*
|
|
57
|
+
* Overlay heading defaults: anchor the title to the inline start and
|
|
58
|
+
* set the neutral text color explicitly. `--_gcd-heading-color` and
|
|
59
|
+
* `--_gcd-heading-margin` defend against the heading-reset rules in
|
|
60
|
+
* `global-css-defense.module.css`, which would otherwise take over a
|
|
61
|
+
* `<h2>` rendered via `Text`.
|
|
62
|
+
*/
|
|
63
|
+
.title {
|
|
64
|
+
color: var(--wpds-color-fg-content-neutral);
|
|
65
|
+
--_gcd-heading-color: var(--wpds-color-fg-content-neutral);
|
|
66
|
+
|
|
67
|
+
margin-inline-end: auto;
|
|
68
|
+
--_gcd-heading-margin: 0 auto 0 0;
|
|
69
|
+
|
|
70
|
+
&:dir(rtl) {
|
|
71
|
+
--_gcd-heading-margin: 0 0 0 auto;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/*
|
|
76
|
+
* Scroll container. `flex: 1 1 auto` + `min-block-size: 0` lets it
|
|
77
|
+
* shrink below its content size so `overflow-block: auto` can actually
|
|
78
|
+
* show a scrollbar when content exceeds the available space. Default
|
|
79
|
+
* padding is `padding-2xl` on all sides; the yield rules below strip
|
|
80
|
+
* block padding when chrome occupies that edge.
|
|
81
|
+
*
|
|
82
|
+
* Scrolling is intentionally block-axis-only. `overflow-inline: hidden`
|
|
83
|
+
* clips wide content instead of introducing a horizontal scrollbar:
|
|
84
|
+
* the sibling chrome doesn't scroll inline, the popup edge already
|
|
85
|
+
* clips, and `useOverlayScrollStateAttributes` only tracks block-axis
|
|
86
|
+
* overflow (tabindex + separator state). Overlay consumers should
|
|
87
|
+
* constrain content width rather than rely on horizontal scroll.
|
|
88
|
+
*/
|
|
89
|
+
.content {
|
|
90
|
+
flex: 1 1 auto;
|
|
91
|
+
min-block-size: 0;
|
|
92
|
+
overflow-block: auto;
|
|
93
|
+
overflow-inline: hidden;
|
|
94
|
+
padding: var(--wpds-dimension-padding-2xl);
|
|
95
|
+
|
|
96
|
+
/*
|
|
97
|
+
* The shared `outset-ring--focus-visible` utility (composed by
|
|
98
|
+
* the Content components) uses an `outline-offset` of `+1px`,
|
|
99
|
+
* which for this scroll container would put the ring outside
|
|
100
|
+
* the popup's rounded corners and have it clipped by the
|
|
101
|
+
* popup's `overflow: hidden`. Inset the ring by the focus
|
|
102
|
+
* width instead, so it sits flush inside the content box.
|
|
103
|
+
*
|
|
104
|
+
* The shared utility's transition shorthand (`transition:
|
|
105
|
+
* outline …`) only animates outline-color and outline-width,
|
|
106
|
+
* not outline-offset, so the negative offset applied here is
|
|
107
|
+
* static — visually, the ring still fades in/out via color
|
|
108
|
+
* change while the offset stays put.
|
|
109
|
+
*/
|
|
110
|
+
&:focus-visible {
|
|
111
|
+
outline-offset: calc(var(--wpds-border-width-focus) * -1);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/*
|
|
116
|
+
* Pinned chrome: reserve 1px on the inner side for the separator
|
|
117
|
+
* border and subtract that same 1px from the adjacent padding. Net
|
|
118
|
+
* effect on block-axis height is zero — the chrome's overall
|
|
119
|
+
* border-box matches the non-pinned case — while the border provides
|
|
120
|
+
* a fixed slot that the scroll-state rules below colorize.
|
|
121
|
+
*
|
|
122
|
+
* `.content` then drops its matching block-axis padding on that
|
|
123
|
+
* edge, because the chrome already supplies the popup-edge
|
|
124
|
+
* `padding-2xl` + inner `gap-lg`.
|
|
125
|
+
*
|
|
126
|
+
* Sibling relationships intentionally use the general-sibling
|
|
127
|
+
* combinator (`~`) and `:has(~ …)` instead of the adjacent
|
|
128
|
+
* combinator, so an extra element between header / content / footer
|
|
129
|
+
* (custom wrappers, an a11y live region, etc.) doesn't silently
|
|
130
|
+
* break the pinned layout. The expected DOM shape is still
|
|
131
|
+
* header → content → footer; additional siblings in between are
|
|
132
|
+
* tolerated.
|
|
133
|
+
*/
|
|
134
|
+
.header:has(~ .content) {
|
|
135
|
+
padding-block-end: calc(var(--wpds-dimension-gap-lg) - 1px);
|
|
136
|
+
border-block-end: 1px solid transparent;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.header ~ .content {
|
|
140
|
+
padding-block-start: 0;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.content ~ .footer {
|
|
144
|
+
padding-block-start: calc(var(--wpds-dimension-gap-lg) - 1px);
|
|
145
|
+
border-block-start: 1px solid transparent;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.content:has(~ .footer) {
|
|
149
|
+
padding-block-end: 0;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/*
|
|
153
|
+
* Non-pinned case: when `.header` / `.footer` live inside `.content`
|
|
154
|
+
* (scrolls with body). The scroll container already supplies the
|
|
155
|
+
* inline popup-edge padding, so nested chrome always collapses its
|
|
156
|
+
* own `padding-inline` regardless of its position inside `.content`
|
|
157
|
+
* (no `:first-child` / `:last-child` guard). Block-axis padding is
|
|
158
|
+
* only collapsed at the scroll edges — the `:first-child` /
|
|
159
|
+
* `:last-child` rules keep the body's `gap-lg` visual separation
|
|
160
|
+
* between the chrome and any preceding / following siblings inside
|
|
161
|
+
* `.content`. No border — the separator is specific to the pinned
|
|
162
|
+
* case.
|
|
163
|
+
*/
|
|
164
|
+
.content > .header {
|
|
165
|
+
padding-inline: 0;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.content > .header:first-child {
|
|
169
|
+
padding-block-start: 0;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.content > .footer {
|
|
173
|
+
padding-inline: 0;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.content > .footer:last-child {
|
|
177
|
+
padding-block-end: 0;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/*
|
|
181
|
+
* Separator coloring. The transparent border on the pinned chrome is
|
|
182
|
+
* colorized when the adjacent scroll container reports off-screen
|
|
183
|
+
* content in that direction. Toggling the color (not the border's
|
|
184
|
+
* existence) means no layout shift on scroll.
|
|
185
|
+
*
|
|
186
|
+
* `useOverlayScrollStateAttributes` owns the
|
|
187
|
+
* `data-wp-ui-overlay-scrolled-from-*` toggles, so CSS handles the
|
|
188
|
+
* visual state without React re-rendering on scroll.
|
|
189
|
+
*
|
|
190
|
+
* Forced-colors note: `border-color: transparent` is preserved as-is
|
|
191
|
+
* in forced-colors mode per spec, so the default (non-scrolled)
|
|
192
|
+
* state stays invisible. When the color toggles to a token value
|
|
193
|
+
* below, the UA substitutes a system color (typically `CanvasText`),
|
|
194
|
+
* so the separator remains visible in forced-colors mode without
|
|
195
|
+
* any additional rules.
|
|
196
|
+
*/
|
|
197
|
+
.header:has(~ [data-wp-ui-overlay-scroll-container][data-wp-ui-overlay-scrolled-from-top]) {
|
|
198
|
+
border-block-end-color: var(--wpds-color-stroke-surface-neutral);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
[data-wp-ui-overlay-scroll-container][data-wp-ui-overlay-scrolled-from-bottom] ~ .footer {
|
|
202
|
+
border-block-start-color: var(--wpds-color-stroke-surface-neutral);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/*
|
|
206
|
+
* `overscroll-behavior: contain` stops scroll chaining from the overlay
|
|
207
|
+
* to whatever sits behind it. We only want that when the overlay is
|
|
208
|
+
* modal: a non-modal overlay lets the page underneath remain
|
|
209
|
+
* interactive, and chaining scroll to the page there is the intuitive
|
|
210
|
+
* behavior.
|
|
211
|
+
*
|
|
212
|
+
* `data-wp-ui-overlay-modal` is toggled on the popup by each component
|
|
213
|
+
* (Dialog / Drawer mirror their `modal` prop; AlertDialog is always
|
|
214
|
+
* modal). The scroll container always lives inside the popup —
|
|
215
|
+
* `Dialog.Content` / `Drawer.Content` for the public API, or an
|
|
216
|
+
* internal container for AlertDialog — so a single descendant
|
|
217
|
+
* selector anchored at the modal popup covers all three.
|
|
218
|
+
*/
|
|
219
|
+
[data-wp-ui-overlay-modal] [data-wp-ui-overlay-scroll-container] {
|
|
220
|
+
overscroll-behavior: contain;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { cloneElement } from '@wordpress/element';
|
|
2
|
+
import type { ReactElement, ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Renders overlay markup (`children`) through an optional `portal` element from
|
|
6
|
+
* `portal={ <Component.Portal … /> }`, or through the package default portal.
|
|
7
|
+
*
|
|
8
|
+
* Shared by overlay `Popup` components so portal merge behavior stays consistent.
|
|
9
|
+
*
|
|
10
|
+
* @param portal Optional element from the `portal` prop (should have no
|
|
11
|
+
* `children`; callers type this via `Omit<PortalProps,'children'>`).
|
|
12
|
+
* When omitted, `defaultPortal` is used. Injected `children`
|
|
13
|
+
* replace any subtree on the portal element.
|
|
14
|
+
* @param defaultPortal Unpopulated default portal element (e.g. `<Dialog.Portal />`).
|
|
15
|
+
* @param children Popup subtree (backdrop, positioner, etc.) to inject as the portal’s children.
|
|
16
|
+
*/
|
|
17
|
+
export function renderPortalWithChildren(
|
|
18
|
+
portal: ReactElement | undefined,
|
|
19
|
+
defaultPortal: ReactElement,
|
|
20
|
+
children: ReactNode
|
|
21
|
+
): ReactElement {
|
|
22
|
+
const rootPortal = portal ?? defaultPortal;
|
|
23
|
+
|
|
24
|
+
return cloneElement( rootPortal, {
|
|
25
|
+
children,
|
|
26
|
+
} );
|
|
27
|
+
}
|
|
@@ -17,7 +17,7 @@ function TestHarness( {
|
|
|
17
17
|
} ) {
|
|
18
18
|
const result = useDeprioritizedInitialFocus( {
|
|
19
19
|
initialFocus,
|
|
20
|
-
|
|
20
|
+
deprioritizedAttributes: [ ATTR ],
|
|
21
21
|
} );
|
|
22
22
|
|
|
23
23
|
useEffect( () => {
|
|
@@ -156,7 +156,7 @@ describe( 'useDeprioritizedInitialFocus', () => {
|
|
|
156
156
|
} ) {
|
|
157
157
|
const result = useDeprioritizedInitialFocus( {
|
|
158
158
|
initialFocus: undefined,
|
|
159
|
-
|
|
159
|
+
deprioritizedAttributes: [ ATTR ],
|
|
160
160
|
} );
|
|
161
161
|
|
|
162
162
|
useEffect( () => {
|
|
@@ -200,7 +200,7 @@ describe( 'useDeprioritizedInitialFocus', () => {
|
|
|
200
200
|
} ) {
|
|
201
201
|
const result = useDeprioritizedInitialFocus( {
|
|
202
202
|
initialFocus: undefined,
|
|
203
|
-
|
|
203
|
+
deprioritizedAttributes: [ ATTR ],
|
|
204
204
|
} );
|
|
205
205
|
|
|
206
206
|
useEffect( () => {
|
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.
|