@wordpress/components 40.0.0 → 40.1.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 +40 -0
- package/CONTRIBUTING.md +2 -0
- package/build/border-box-control/border-box-control/component.cjs +37 -5
- package/build/border-box-control/border-box-control/component.cjs.map +3 -3
- package/build/border-box-control/border-box-control/hook.cjs +24 -3
- package/build/border-box-control/border-box-control/hook.cjs.map +3 -3
- package/build/border-box-control/border-box-control-linked-button/hook.cjs +2 -2
- package/build/border-box-control/border-box-control-linked-button/hook.cjs.map +2 -2
- package/build/border-box-control/border-box-control-split-controls/hook.cjs +2 -2
- package/build/border-box-control/border-box-control-split-controls/hook.cjs.map +2 -2
- package/build/border-box-control/border-box-control-visualizer/hook.cjs +2 -2
- package/build/border-box-control/border-box-control-visualizer/hook.cjs.map +2 -2
- package/build/color-palette/index.cjs +1 -1
- package/build/color-palette/index.cjs.map +2 -2
- package/build/composite/context.cjs +9 -2
- package/build/composite/context.cjs.map +2 -2
- package/build/composite/group-label.cjs +4 -0
- package/build/composite/group-label.cjs.map +2 -2
- package/build/composite/group.cjs +10 -2
- package/build/composite/group.cjs.map +2 -2
- package/build/composite/item.cjs +4 -0
- package/build/composite/item.cjs.map +3 -3
- package/build/context/context-system-provider.cjs +2 -5
- package/build/context/context-system-provider.cjs.map +3 -3
- package/build/context/use-context-system.cjs +7 -2
- package/build/context/use-context-system.cjs.map +2 -2
- package/build/disabled/index.cjs +1 -1
- package/build/disabled/index.cjs.map +2 -2
- package/build/draggable/index.cjs.map +1 -1
- package/build/form-token-field/index.cjs +1 -1
- package/build/form-token-field/index.cjs.map +2 -2
- package/build/icon/index.cjs +30 -12
- package/build/icon/index.cjs.map +2 -2
- package/build/input-control/styles/input-control-styles.cjs +42 -27
- package/build/input-control/styles/input-control-styles.cjs.map +2 -2
- package/build/item-group/context.cjs +1 -0
- package/build/item-group/context.cjs.map +2 -2
- package/build/item-group/item/component.cjs +12 -0
- package/build/item-group/item/component.cjs.map +3 -3
- package/build/item-group/item/hook.cjs +7 -6
- package/build/item-group/item/hook.cjs.map +2 -2
- package/build/item-group/item-group/component.cjs +1 -0
- package/build/item-group/item-group/component.cjs.map +2 -2
- package/build/item-group/item-group/hook.cjs +1 -1
- package/build/item-group/item-group/hook.cjs.map +2 -2
- package/build/progress-bar/index.cjs +1 -1
- package/build/progress-bar/index.cjs.map +2 -2
- package/build/resizable-box/index.cjs.map +1 -1
- package/build/snackbar/index.cjs +8 -5
- package/build/snackbar/index.cjs.map +2 -2
- package/build/textarea-control/index.cjs +1 -1
- package/build/textarea-control/index.cjs.map +2 -2
- package/build/toggle-group-control/context.cjs +8 -2
- package/build/toggle-group-control/context.cjs.map +2 -2
- package/build/toggle-group-control/toggle-group-control/as-button-group.cjs +5 -2
- package/build/toggle-group-control/toggle-group-control/as-button-group.cjs.map +2 -2
- package/build/toggle-group-control/toggle-group-control/as-radio-group.cjs +5 -2
- package/build/toggle-group-control/toggle-group-control/as-radio-group.cjs.map +2 -2
- package/build/toggle-group-control/toggle-group-control/component.cjs +3 -1
- package/build/toggle-group-control/toggle-group-control/component.cjs.map +2 -2
- package/build/toggle-group-control/toggle-group-control-option/component.cjs +2 -0
- package/build/toggle-group-control/toggle-group-control-option/component.cjs.map +2 -2
- package/build/toggle-group-control/toggle-group-control-option-base/component.cjs +2 -1
- package/build/toggle-group-control/toggle-group-control-option-base/component.cjs.map +2 -2
- package/build/toggle-group-control/toggle-group-control-option-icon/component.cjs +2 -0
- package/build/toggle-group-control/toggle-group-control-option-icon/component.cjs.map +2 -2
- package/build/tools-panel/tools-panel/hook.cjs +102 -106
- package/build/tools-panel/tools-panel/hook.cjs.map +2 -2
- package/build/tools-panel/tools-panel-item/hook.cjs +33 -33
- package/build/tools-panel/tools-panel-item/hook.cjs.map +2 -2
- package/build/tree-grid/cell.cjs +4 -0
- package/build/tree-grid/cell.cjs.map +2 -2
- package/build/tree-grid/roving-tab-index-item.cjs +5 -1
- package/build/tree-grid/roving-tab-index-item.cjs.map +2 -2
- package/build/tree-grid/row.cjs +6 -1
- package/build/tree-grid/row.cjs.map +2 -2
- package/build/tree-grid/use-validate-tree-grid-structure.cjs +81 -0
- package/build/tree-grid/use-validate-tree-grid-structure.cjs.map +7 -0
- package/build/utils/colors-values.cjs +3 -2
- package/build/utils/colors-values.cjs.map +2 -2
- package/build-module/border-box-control/border-box-control/component.mjs +38 -6
- package/build-module/border-box-control/border-box-control/component.mjs.map +2 -2
- package/build-module/border-box-control/border-box-control/hook.mjs +14 -3
- package/build-module/border-box-control/border-box-control/hook.mjs.map +2 -2
- package/build-module/border-box-control/border-box-control-linked-button/hook.mjs +2 -2
- package/build-module/border-box-control/border-box-control-linked-button/hook.mjs.map +2 -2
- package/build-module/border-box-control/border-box-control-split-controls/hook.mjs +2 -2
- package/build-module/border-box-control/border-box-control-split-controls/hook.mjs.map +2 -2
- package/build-module/border-box-control/border-box-control-visualizer/hook.mjs +2 -2
- package/build-module/border-box-control/border-box-control-visualizer/hook.mjs.map +2 -2
- package/build-module/color-palette/index.mjs +1 -1
- package/build-module/color-palette/index.mjs.map +2 -2
- package/build-module/composite/context.mjs +6 -1
- package/build-module/composite/context.mjs.map +2 -2
- package/build-module/composite/group-label.mjs +5 -1
- package/build-module/composite/group-label.mjs.map +2 -2
- package/build-module/composite/group.mjs +11 -3
- package/build-module/composite/group.mjs.map +2 -2
- package/build-module/composite/item.mjs +4 -0
- package/build-module/composite/item.mjs.map +2 -2
- package/build-module/context/context-system-provider.mjs +2 -5
- package/build-module/context/context-system-provider.mjs.map +3 -3
- package/build-module/context/use-context-system.mjs +7 -2
- package/build-module/context/use-context-system.mjs.map +2 -2
- package/build-module/disabled/index.mjs +1 -1
- package/build-module/disabled/index.mjs.map +2 -2
- package/build-module/draggable/index.mjs.map +1 -1
- package/build-module/form-token-field/index.mjs +1 -1
- package/build-module/form-token-field/index.mjs.map +2 -2
- package/build-module/icon/index.mjs +30 -12
- package/build-module/icon/index.mjs.map +2 -2
- package/build-module/input-control/styles/input-control-styles.mjs +42 -27
- package/build-module/input-control/styles/input-control-styles.mjs.map +2 -2
- package/build-module/item-group/context.mjs +1 -0
- package/build-module/item-group/context.mjs.map +2 -2
- package/build-module/item-group/item/component.mjs +12 -0
- package/build-module/item-group/item/component.mjs.map +2 -2
- package/build-module/item-group/item/hook.mjs +7 -6
- package/build-module/item-group/item/hook.mjs.map +2 -2
- package/build-module/item-group/item-group/component.mjs +1 -0
- package/build-module/item-group/item-group/component.mjs.map +2 -2
- package/build-module/item-group/item-group/hook.mjs +1 -1
- package/build-module/item-group/item-group/hook.mjs.map +2 -2
- package/build-module/progress-bar/index.mjs +1 -1
- package/build-module/progress-bar/index.mjs.map +2 -2
- package/build-module/resizable-box/index.mjs.map +1 -1
- package/build-module/snackbar/index.mjs +8 -5
- package/build-module/snackbar/index.mjs.map +2 -2
- package/build-module/textarea-control/index.mjs +1 -1
- package/build-module/textarea-control/index.mjs.map +2 -2
- package/build-module/toggle-group-control/context.mjs +8 -2
- package/build-module/toggle-group-control/context.mjs.map +2 -2
- package/build-module/toggle-group-control/toggle-group-control/as-button-group.mjs +5 -2
- package/build-module/toggle-group-control/toggle-group-control/as-button-group.mjs.map +2 -2
- package/build-module/toggle-group-control/toggle-group-control/as-radio-group.mjs +5 -2
- package/build-module/toggle-group-control/toggle-group-control/as-radio-group.mjs.map +2 -2
- package/build-module/toggle-group-control/toggle-group-control/component.mjs +3 -1
- package/build-module/toggle-group-control/toggle-group-control/component.mjs.map +2 -2
- package/build-module/toggle-group-control/toggle-group-control-option/component.mjs +2 -0
- package/build-module/toggle-group-control/toggle-group-control-option/component.mjs.map +2 -2
- package/build-module/toggle-group-control/toggle-group-control-option-base/component.mjs +2 -1
- package/build-module/toggle-group-control/toggle-group-control-option-base/component.mjs.map +2 -2
- package/build-module/toggle-group-control/toggle-group-control-option-icon/component.mjs +2 -0
- package/build-module/toggle-group-control/toggle-group-control-option-icon/component.mjs.map +2 -2
- package/build-module/tools-panel/tools-panel/hook.mjs +103 -107
- package/build-module/tools-panel/tools-panel/hook.mjs.map +2 -2
- package/build-module/tools-panel/tools-panel-item/hook.mjs +35 -35
- package/build-module/tools-panel/tools-panel-item/hook.mjs.map +2 -2
- package/build-module/tree-grid/cell.mjs +5 -1
- package/build-module/tree-grid/cell.mjs.map +2 -2
- package/build-module/tree-grid/roving-tab-index-item.mjs +5 -1
- package/build-module/tree-grid/roving-tab-index-item.mjs.map +2 -2
- package/build-module/tree-grid/row.mjs +7 -2
- package/build-module/tree-grid/row.mjs.map +2 -2
- package/build-module/tree-grid/use-validate-tree-grid-structure.mjs +56 -0
- package/build-module/tree-grid/use-validate-tree-grid-structure.mjs.map +7 -0
- package/build-module/utils/colors-values.mjs +3 -2
- package/build-module/utils/colors-values.mjs.map +2 -2
- package/build-style/style-rtl.css +27 -85
- package/build-style/style.css +27 -85
- package/build-types/border-box-control/border-box-control/component.d.ts +4 -0
- package/build-types/border-box-control/border-box-control/component.d.ts.map +1 -1
- package/build-types/border-box-control/border-box-control/hook.d.ts +4 -2
- package/build-types/border-box-control/border-box-control/hook.d.ts.map +1 -1
- package/build-types/border-box-control/types.d.ts +6 -2
- package/build-types/border-box-control/types.d.ts.map +1 -1
- package/build-types/composite/context.d.ts +2 -0
- package/build-types/composite/context.d.ts.map +1 -1
- package/build-types/composite/group-label.d.ts.map +1 -1
- package/build-types/composite/group.d.ts.map +1 -1
- package/build-types/composite/item.d.ts.map +1 -1
- package/build-types/composite/types.d.ts +1 -1
- package/build-types/context/context-system-provider.d.ts +8 -6
- package/build-types/context/context-system-provider.d.ts.map +1 -1
- package/build-types/context/use-context-system.d.ts.map +1 -1
- package/build-types/icon/index.d.ts.map +1 -1
- package/build-types/input-control/styles/input-control-styles.d.ts.map +1 -1
- package/build-types/item-group/context.d.ts.map +1 -1
- package/build-types/item-group/item/component.d.ts.map +1 -1
- package/build-types/item-group/item/hook.d.ts +1 -1
- package/build-types/item-group/item/hook.d.ts.map +1 -1
- package/build-types/item-group/item-group/component.d.ts.map +1 -1
- package/build-types/item-group/types.d.ts +4 -0
- package/build-types/item-group/types.d.ts.map +1 -1
- package/build-types/popover/types.d.ts +6 -2
- package/build-types/popover/types.d.ts.map +1 -1
- package/build-types/snackbar/index.d.ts.map +1 -1
- package/build-types/toggle-group-control/context.d.ts +2 -2
- package/build-types/toggle-group-control/context.d.ts.map +1 -1
- package/build-types/toggle-group-control/toggle-group-control/as-button-group.d.ts +1 -1
- package/build-types/toggle-group-control/toggle-group-control/as-button-group.d.ts.map +1 -1
- package/build-types/toggle-group-control/toggle-group-control/as-radio-group.d.ts +1 -1
- package/build-types/toggle-group-control/toggle-group-control/as-radio-group.d.ts.map +1 -1
- package/build-types/toggle-group-control/toggle-group-control/component.d.ts.map +1 -1
- package/build-types/toggle-group-control/toggle-group-control-option/component.d.ts +2 -2
- package/build-types/toggle-group-control/toggle-group-control-option/component.d.ts.map +1 -1
- package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts.map +1 -1
- package/build-types/toggle-group-control/toggle-group-control-option-icon/component.d.ts +2 -2
- package/build-types/toggle-group-control/toggle-group-control-option-icon/component.d.ts.map +1 -1
- package/build-types/toggle-group-control/types.d.ts +12 -3
- package/build-types/toggle-group-control/types.d.ts.map +1 -1
- package/build-types/tools-panel/tools-panel/hook.d.ts +4 -4
- package/build-types/tools-panel/tools-panel/hook.d.ts.map +1 -1
- package/build-types/tools-panel/tools-panel-item/hook.d.ts.map +1 -1
- package/build-types/tools-panel/types.d.ts +52 -9
- package/build-types/tools-panel/types.d.ts.map +1 -1
- package/build-types/tree-grid/cell.d.ts.map +1 -1
- package/build-types/tree-grid/roving-tab-index-item.d.ts.map +1 -1
- package/build-types/tree-grid/row.d.ts.map +1 -1
- package/build-types/tree-grid/use-validate-tree-grid-structure.d.ts +2 -0
- package/build-types/tree-grid/use-validate-tree-grid-structure.d.ts.map +1 -0
- package/build-types/utils/colors-values.d.ts.map +1 -1
- package/emotion-to-scss-modules.md +149 -0
- package/package.json +28 -27
- package/src/alignment-matrix-control/test/{index.tsx → index.jsdom.test.tsx} +5 -4
- package/src/angle-picker-control/style.module.scss +1 -1
- package/src/autocomplete/test/get-autocomplete-match.ts +2 -1
- package/src/autocomplete/test/{index.tsx → index.jsdom.test.tsx} +2 -1
- package/src/badge/test/{index.tsx → index.jsdom.test.tsx} +1 -0
- package/src/base-control/stories/index.story.tsx +2 -2
- package/src/base-control/test/{index.tsx → index.jsdom.test.tsx} +1 -0
- package/src/border-box-control/border-box-control/README.md +5 -3
- package/src/border-box-control/border-box-control/component.tsx +83 -15
- package/src/border-box-control/border-box-control/hook.ts +19 -1
- package/src/border-box-control/stories/index.story.tsx +10 -0
- package/src/border-box-control/style.module.scss +34 -3
- package/src/border-box-control/test/{index.tsx → index.jsdom.test.tsx} +138 -2
- package/src/border-box-control/test/utils.ts +11 -0
- package/src/border-box-control/types.ts +6 -2
- package/src/border-control/test/{index.js → index.jsdom.test.tsx} +44 -24
- package/src/box-control/test/{index.tsx → index.jsdom.test.tsx} +6 -3
- package/src/button/style.scss +0 -6
- package/src/button/test/{index.tsx → index.jsdom.test.tsx} +6 -2
- package/src/checkbox-control/stories/index.story.tsx +1 -1
- package/src/checkbox-control/style.scss +2 -2
- package/src/checkbox-control/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +10 -7
- package/src/checkbox-control/test/{index.tsx → index.jsdom.test.tsx} +4 -1
- package/src/circular-option-picker/test/{index.tsx → index.jsdom.test.tsx} +1 -0
- package/src/color-indicator/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +2 -2
- package/src/color-indicator/test/{index.tsx → index.jsdom.test.tsx} +1 -0
- package/src/color-palette/index.tsx +1 -1
- package/src/color-palette/test/{index.tsx → index.jsdom.test.tsx} +25 -22
- package/src/color-palette/test/{utils.ts → utils.jsdom.test.ts} +1 -0
- package/src/combobox-control/test/{index.tsx → index.jsdom.test.tsx} +12 -7
- package/src/composite/README.md +1 -1
- package/src/composite/context.tsx +6 -0
- package/src/composite/group-label.tsx +8 -1
- package/src/composite/group.tsx +9 -2
- package/src/composite/item.tsx +6 -0
- package/src/composite/legacy/test/{index.tsx → index.jsdom.test.tsx} +6 -13
- package/src/composite/test/{index.tsx → index.jsdom.test.tsx} +60 -17
- package/src/composite/types.ts +1 -1
- package/src/confirm-dialog/test/{index.tsx → index.jsdom.test.tsx} +16 -14
- package/src/content-editable-control/test/{index.tsx → index.jsdom.test.tsx} +4 -3
- package/src/context/{context-system-provider.js → context-system-provider.tsx} +19 -5
- package/src/context/stories/{ComponentsProvider.stories.jsx → ComponentsProvider.stories.tsx} +2 -2
- package/src/context/test/context-connect.tsx +1 -2
- package/src/context/test/{context-system-provider.js → context-system-provider.jsdom.test.tsx} +93 -51
- package/src/context/test/wordpress-component.tsx +1 -2
- package/src/context/use-context-system.js +13 -4
- package/src/custom-gradient-picker/gradient-bar/test/{utils.ts → utils.jsdom.test.ts} +6 -5
- package/src/custom-gradient-picker/test/serializer.ts +1 -0
- package/src/custom-select-control-v2/test/{index.tsx → index.jsdom.test.tsx} +4 -1
- package/src/date-time/date-picker/test/{index.tsx → index.jsdom.test.tsx} +6 -3
- package/src/date-time/date-picker/test/{use-lilius.ts → use-lilius.jsdom.test.ts} +1 -0
- package/src/date-time/date-time/test/{index.tsx → index.jsdom.test.tsx} +20 -11
- package/src/date-time/test/utils.test.ts +9 -0
- package/src/date-time/time-picker/test/{index.tsx → index.jsdom.test.tsx} +37 -27
- package/src/date-time/time-picker/time-input/test/{index.tsx → index.jsdom.test.tsx} +8 -3
- package/src/disabled/index.tsx +7 -7
- package/src/disabled/test/{index.tsx → index.jsdom.test.tsx} +26 -0
- package/src/draggable/index.tsx +1 -1
- package/src/draggable/style.module.scss +1 -1
- package/src/dropdown/style.module.scss +2 -2
- package/src/dropdown/test/{index.tsx → index.jsdom.test.tsx} +1 -0
- package/src/dropdown-menu/test/{index.tsx → index.jsdom.test.tsx} +5 -4
- package/src/duotone-picker/test/{custom-duotone-bar.tsx → custom-duotone-bar.jsdom.test.tsx} +11 -8
- package/src/duotone-picker/test/{index.tsx → index.jsdom.test.tsx} +11 -10
- package/src/external-link/test/{index.tsx → index.jsdom.test.tsx} +5 -4
- package/src/focal-point-picker/test/{index.tsx → index.jsdom.test.tsx} +12 -9
- package/src/focal-point-picker/test/{media.tsx → media.jsdom.test.tsx} +1 -0
- package/src/font-size-picker/test/{font-size-picker-select.tsx → font-size-picker-select.jsdom.test.tsx} +19 -16
- package/src/font-size-picker/test/{font-size-picker-toggle-group.tsx → font-size-picker-toggle-group.jsdom.test.tsx} +13 -11
- package/src/font-size-picker/test/{index.tsx → index.jsdom.test.tsx} +19 -14
- package/src/font-size-picker/test/utils.ts +1 -0
- package/src/form-toggle/style.scss +1 -1
- package/src/form-toggle/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +4 -4
- package/src/form-toggle/test/{index.tsx → index.jsdom.test.tsx} +2 -1
- package/src/form-token-field/index.tsx +1 -1
- package/src/form-token-field/test/{index.tsx → index.jsdom.test.tsx} +86 -44
- package/src/gradient-picker/test/{index.tsx → index.jsdom.test.tsx} +12 -9
- package/src/guide/test/{index.tsx → index.jsdom.test.tsx} +4 -2
- package/src/h-stack/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +4 -4
- package/src/h-stack/test/{index.tsx → index.jsdom.test.tsx} +3 -0
- package/src/higher-order/with-fallback-styles/test/{index.tsx → index.jsdom.test.tsx} +3 -2
- package/src/higher-order/with-filters/test/__snapshots__/index.jsdom.test.tsx.snap +87 -0
- package/src/higher-order/with-filters/test/{index.tsx → index.jsdom.test.tsx} +6 -5
- package/src/higher-order/with-focus-outside/test/{index.tsx → index.jsdom.test.tsx} +2 -1
- package/src/higher-order/with-focus-return/test/{index.tsx → index.jsdom.test.tsx} +1 -0
- package/src/higher-order/with-notices/test/{index.tsx → index.jsdom.test.tsx} +1 -0
- package/src/higher-order/with-spoken-messages/test/{index.tsx → index.jsdom.test.tsx} +3 -2
- package/src/icon/index.tsx +28 -12
- package/src/icon/test/{index.tsx → index.jsdom.test.tsx} +66 -0
- package/src/input-control/styles/input-control-styles.tsx +38 -7
- package/src/input-control/test/{index.js → index.jsdom.test.tsx} +16 -10
- package/src/isolated-event-container/test/{index.tsx → index.jsdom.test.tsx} +4 -3
- package/src/item-group/context.ts +1 -0
- package/src/item-group/item/component.tsx +19 -1
- package/src/item-group/item/hook.ts +2 -3
- package/src/item-group/item-group/component.tsx +1 -0
- package/src/item-group/style.module.scss +1 -2
- package/src/item-group/test/__snapshots__/{index.js.snap → index.jsdom.test.tsx.snap} +9 -9
- package/src/item-group/test/{index.js → index.jsdom.test.tsx} +99 -2
- package/src/item-group/types.ts +4 -0
- package/src/keyboard-shortcuts/test/{index.tsx → index.jsdom.test.tsx} +5 -4
- package/src/menu/test/{index.tsx → index.jsdom.test.tsx} +67 -23
- package/src/menu-group/test/{index.tsx → index.jsdom.test.tsx} +1 -0
- package/src/menu-item/test/__snapshots__/{index.js.snap → index.jsdom.test.tsx.snap} +5 -5
- package/src/menu-item/test/{index.js → index.jsdom.test.tsx} +1 -0
- package/src/modal/test/{aria-helper.ts → aria-helper.jsdom.test.ts} +1 -0
- package/src/modal/test/{index.tsx → index.jsdom.test.tsx} +9 -5
- package/src/navigable-container/test/{navigable-menu.tsx → navigable-menu.jsdom.test.tsx} +7 -5
- package/src/navigable-container/test/{tababble-container.tsx → tababble-container.jsdom.test.tsx} +5 -3
- package/src/navigator/test/{index.tsx → index.jsdom.test.tsx} +5 -2
- package/src/navigator/test/router.ts +1 -0
- package/src/notice/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +7 -4
- package/src/notice/test/{index.tsx → index.jsdom.test.tsx} +8 -4
- package/src/notice/test/{list.tsx → list.jsdom.test.tsx} +1 -0
- package/src/number-control/test/{index.tsx → index.jsdom.test.tsx} +9 -6
- package/src/palette-edit/test/{index.tsx → index.jsdom.test.tsx} +16 -13
- package/src/panel/test/__snapshots__/body.jsdom.test.tsx.snap +9 -0
- package/src/panel/test/__snapshots__/header.jsdom.test.tsx.snap +9 -0
- package/src/panel/test/__snapshots__/index.jsdom.test.tsx.snap +17 -0
- package/src/panel/test/__snapshots__/row.jsdom.test.tsx.snap +17 -0
- package/src/panel/test/{body.tsx → body.jsdom.test.tsx} +2 -1
- package/src/panel/test/{header.tsx → header.jsdom.test.tsx} +1 -0
- package/src/panel/test/{index.tsx → index.jsdom.test.tsx} +1 -0
- package/src/panel/test/{row.tsx → row.jsdom.test.tsx} +1 -0
- package/src/placeholder/style.scss +0 -5
- package/src/placeholder/test/{index.tsx → index.jsdom.test.tsx} +19 -14
- package/src/popover/README.md +2 -2
- package/src/popover/test/{index.tsx → index.jsdom.test.tsx} +23 -0
- package/src/popover/types.ts +9 -3
- package/src/progress-bar/style.module.scss +9 -1
- package/src/query-controls/test/terms.ts +1 -0
- package/src/radio-control/test/{index.tsx → index.jsdom.test.tsx} +14 -11
- package/src/range-control/test/{index.tsx → index.jsdom.test.tsx} +10 -7
- package/src/resizable-box/index.tsx +1 -1
- package/src/sandbox/test/{index.tsx → index.jsdom.test.tsx} +1 -0
- package/src/scroll-lock/test/{index.tsx → index.jsdom.test.tsx} +1 -0
- package/src/shortcut/test/__snapshots__/index.jsdom.test.tsx.snap +15 -0
- package/src/shortcut/test/{index.tsx → index.jsdom.test.tsx} +1 -0
- package/src/slot-fill/test/{index.js → index.jsdom.test.tsx} +4 -3
- package/src/slot-fill/test/{slot.js → slot.jsdom.test.tsx} +17 -9
- package/src/snackbar/index.tsx +10 -6
- package/src/snackbar/test/{index.tsx → index.jsdom.test.tsx} +41 -11
- package/src/snackbar/test/list.jsdom.test.tsx +100 -0
- package/src/style-provider/test/{index.tsx → index.jsdom.test.tsx} +1 -0
- package/src/surface/style.module.scss +2 -2
- package/src/surface/test/{index.tsx → index.jsdom.test.tsx} +1 -0
- package/src/tab-panel/style.scss +4 -23
- package/src/tab-panel/test/{index.tsx → index.jsdom.test.tsx} +22 -21
- package/src/tabs/test/{index.tsx → index.jsdom.test.tsx} +21 -19
- package/src/text-control/test/{text-control.tsx → text-control.jsdom.test.tsx} +1 -0
- package/src/text-highlight/test/{index.tsx → index.jsdom.test.tsx} +1 -0
- package/src/textarea-control/style.module.scss +9 -4
- package/src/tip/style.scss +1 -1
- package/src/toggle-control/test/{index.tsx → index.jsdom.test.tsx} +4 -1
- package/src/toggle-group-control/context.ts +14 -5
- package/src/toggle-group-control/stories/index.story.tsx +15 -2
- package/src/toggle-group-control/test/{index.tsx → index.jsdom.test.tsx} +283 -9
- package/src/toggle-group-control/toggle-group-control/README.md +8 -5
- package/src/toggle-group-control/toggle-group-control/as-button-group.tsx +4 -0
- package/src/toggle-group-control/toggle-group-control/as-radio-group.tsx +4 -0
- package/src/toggle-group-control/toggle-group-control/component.tsx +2 -0
- package/src/toggle-group-control/toggle-group-control/style.module.scss +8 -2
- package/src/toggle-group-control/toggle-group-control-option/README.md +8 -5
- package/src/toggle-group-control/toggle-group-control-option/component.tsx +2 -0
- package/src/toggle-group-control/toggle-group-control-option-base/component.tsx +4 -1
- package/src/toggle-group-control/toggle-group-control-option-icon/README.md +7 -0
- package/src/toggle-group-control/toggle-group-control-option-icon/component.tsx +2 -0
- package/src/toggle-group-control/types.ts +12 -3
- package/src/toolbar/test/{index.tsx → index.jsdom.test.tsx} +1 -0
- package/src/toolbar/test/{toolbar-group.tsx → toolbar-group.jsdom.test.tsx} +2 -1
- package/src/tools-panel/test/{index.tsx → index.jsdom.test.tsx} +595 -47
- package/src/tools-panel/tools-panel/hook.ts +195 -180
- package/src/tools-panel/tools-panel-item/README.md +42 -1
- package/src/tools-panel/tools-panel-item/hook.ts +97 -69
- package/src/tools-panel/types.ts +54 -9
- package/src/tooltip/test/{index.tsx → index.jsdom.test.tsx} +5 -3
- package/src/tree-grid/cell.tsx +6 -2
- package/src/tree-grid/roving-tab-index-item.tsx +7 -3
- package/src/tree-grid/row.tsx +8 -2
- package/src/tree-grid/test/__snapshots__/{cell.tsx.snap → cell.jsdom.test.tsx.snap} +2 -2
- package/src/tree-grid/test/__snapshots__/index.jsdom.test.tsx.snap +3 -0
- package/src/tree-grid/test/__snapshots__/roving-tab-index-item.jsdom.test.tsx.snap +27 -0
- package/src/tree-grid/test/__snapshots__/roving-tab-index.jsdom.test.tsx.snap +9 -0
- package/src/tree-grid/test/__snapshots__/{row.tsx.snap → row.jsdom.test.tsx.snap} +9 -5
- package/src/tree-grid/test/cell.jsdom.test.tsx +149 -0
- package/src/tree-grid/test/{index.tsx → index.jsdom.test.tsx} +9 -7
- package/src/tree-grid/test/{roving-tab-index-item.tsx → roving-tab-index-item.jsdom.test.tsx} +4 -1
- package/src/tree-grid/test/{roving-tab-index.tsx → roving-tab-index.jsdom.test.tsx} +1 -0
- package/src/tree-grid/test/row.jsdom.test.tsx +132 -0
- package/src/tree-grid/use-validate-tree-grid-structure.ts +104 -0
- package/src/truncate/style.module.scss +0 -1
- package/src/truncate/test/{index.tsx → index.jsdom.test.tsx} +1 -0
- package/src/unit-control/test/{index.tsx → index.jsdom.test.tsx} +22 -19
- package/src/unit-control/test/utils.ts +1 -0
- package/src/utils/colors-values.js +5 -4
- package/src/utils/hooks/test/{use-controlled-state.js → use-controlled-state.jsdom.test.tsx} +22 -7
- package/src/utils/hooks/test/{use-controlled-value.js → use-controlled-value.jsdom.test.tsx} +6 -3
- package/src/utils/hooks/test/{use-cx.js → use-cx.jsdom.test.tsx} +8 -5
- package/src/utils/test/colors.js +1 -0
- package/src/utils/test/{get-node-text.js → get-node-text.tsx} +1 -0
- package/src/utils/test/math.js +1 -0
- package/src/utils/test/rtl.js +1 -0
- package/src/utils/test/space.js +1 -0
- package/src/utils/test/strings.js +1 -0
- package/src/utils/test/unit-values.js +1 -0
- package/src/v-stack/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +4 -4
- package/src/v-stack/test/{index.tsx → index.jsdom.test.tsx} +3 -0
- package/src/validated-form-controls/style.scss +11 -15
- package/src/validated-form-controls/test/{content-editable-control.tsx → content-editable-control.jsdom.test.tsx} +1 -1
- package/src/validated-form-controls/test/{custom-select-control.tsx → custom-select-control.jsdom.test.tsx} +3 -0
- package/src/validated-form-controls/test/{input-control.tsx → input-control.jsdom.test.tsx} +3 -0
- package/src/validated-form-controls/test/{range-control.tsx → range-control.jsdom.test.tsx} +3 -0
- package/src/validated-form-controls/test/{textarea-control.tsx → textarea-control.jsdom.test.tsx} +1 -0
- package/src/view/test/__snapshots__/{index.js.snap → index.jsdom.test.tsx.snap} +7 -7
- package/src/view/test/{index.js → index.jsdom.test.tsx} +7 -2
- package/src/context/test/__snapshots__/context-system-provider.js.snap +0 -35
- package/src/higher-order/with-filters/test/__snapshots__/index.tsx.snap +0 -87
- package/src/panel/test/__snapshots__/body.tsx.snap +0 -9
- package/src/panel/test/__snapshots__/header.tsx.snap +0 -9
- package/src/panel/test/__snapshots__/index.tsx.snap +0 -17
- package/src/panel/test/__snapshots__/row.tsx.snap +0 -17
- package/src/shortcut/test/__snapshots__/index.tsx.snap +0 -15
- package/src/snackbar/test/list.tsx +0 -39
- package/src/toggle-group-control/test/__snapshots__/index.tsx.snap +0 -359
- package/src/tree-grid/test/__snapshots__/index.tsx.snap +0 -3
- package/src/tree-grid/test/__snapshots__/roving-tab-index-item.tsx.snap +0 -27
- package/src/tree-grid/test/__snapshots__/roving-tab-index.tsx.snap +0 -9
- package/src/tree-grid/test/cell.tsx +0 -46
- package/src/tree-grid/test/row.tsx +0 -37
- /package/src/card/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +0 -0
- /package/src/card/test/{index.tsx → index.jsdom.test.tsx} +0 -0
- /package/src/color-picker/test/{index.tsx → index.jsdom.test.tsx} +0 -0
- /package/src/custom-gradient-picker/test/{index.tsx → index.jsdom.test.tsx} +0 -0
- /package/src/custom-select-control/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +0 -0
- /package/src/custom-select-control/test/{index.tsx → index.jsdom.test.tsx} +0 -0
- /package/src/divider/test/{index.tsx → index.jsdom.test.tsx} +0 -0
- /package/src/elevation/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +0 -0
- /package/src/elevation/test/{index.tsx → index.jsdom.test.tsx} +0 -0
- /package/src/flex/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +0 -0
- /package/src/flex/test/{index.tsx → index.jsdom.test.tsx} +0 -0
- /package/src/form-file-upload/test/{index.tsx → index.jsdom.test.tsx} +0 -0
- /package/src/grid/test/{grid.tsx → grid.jsdom.test.tsx} +0 -0
- /package/src/heading/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +0 -0
- /package/src/heading/test/{index.tsx → index.jsdom.test.tsx} +0 -0
- /package/src/input-control/test/__snapshots__/{index.js.snap → index.jsdom.test.tsx.snap} +0 -0
- /package/src/progress-bar/test/{index.tsx → index.jsdom.test.tsx} +0 -0
- /package/src/resizable-box/resize-tooltip/test/{index.tsx → index.jsdom.test.tsx} +0 -0
- /package/src/resizable-box/resize-tooltip/test/{label.tsx → label.jsdom.test.tsx} +0 -0
- /package/src/scrollable/test/{index.tsx → index.jsdom.test.tsx} +0 -0
- /package/src/search-control/test/{index.tsx → index.jsdom.test.tsx} +0 -0
- /package/src/select-control/test/__snapshots__/{select-control.tsx.snap → select-control.jsdom.test.tsx.snap} +0 -0
- /package/src/select-control/test/{select-control.tsx → select-control.jsdom.test.tsx} +0 -0
- /package/src/slot-fill/test/__snapshots__/{slot.js.snap → slot.jsdom.test.tsx.snap} +0 -0
- /package/src/spacer/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +0 -0
- /package/src/spacer/test/{index.tsx → index.jsdom.test.tsx} +0 -0
- /package/src/text/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +0 -0
- /package/src/text/test/{index.tsx → index.jsdom.test.tsx} +0 -0
- /package/src/utils/test/{polymorphic-element.tsx → polymorphic-element.jsdom.test.tsx} +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
1
2
|
import { render, waitFor } from '@testing-library/react';
|
|
2
3
|
import { addFilter, removeAllFilters, removeFilter } from '@wordpress/hooks';
|
|
3
4
|
import withFilters from '..';
|
|
@@ -56,7 +57,7 @@ describe( 'withFilters', () => {
|
|
|
56
57
|
} );
|
|
57
58
|
|
|
58
59
|
it( 'should not re-render component when new filter added before component was mounted', async () => {
|
|
59
|
-
const SpiedComponent =
|
|
60
|
+
const SpiedComponent = vi.fn( () => <div>Spied component</div> );
|
|
60
61
|
addFilter(
|
|
61
62
|
hookName,
|
|
62
63
|
'test/enhanced-component-spy-1',
|
|
@@ -77,7 +78,7 @@ describe( 'withFilters', () => {
|
|
|
77
78
|
} );
|
|
78
79
|
|
|
79
80
|
it( 'should re-render component once when new filter added after component was mounted', async () => {
|
|
80
|
-
const SpiedComponent =
|
|
81
|
+
const SpiedComponent = vi.fn( () => <div>Spied component</div> );
|
|
81
82
|
const EnhancedComponent = withFilters( hookName )( SpiedComponent );
|
|
82
83
|
|
|
83
84
|
const { container } = render( <EnhancedComponent /> );
|
|
@@ -101,7 +102,7 @@ describe( 'withFilters', () => {
|
|
|
101
102
|
} );
|
|
102
103
|
|
|
103
104
|
it( 'should re-render component once when two filters added in the same animation frame', async () => {
|
|
104
|
-
const SpiedComponent =
|
|
105
|
+
const SpiedComponent = vi.fn( () => <div>Spied component</div> );
|
|
105
106
|
const EnhancedComponent = withFilters( hookName )( SpiedComponent );
|
|
106
107
|
|
|
107
108
|
const { container } = render( <EnhancedComponent /> );
|
|
@@ -134,7 +135,7 @@ describe( 'withFilters', () => {
|
|
|
134
135
|
} );
|
|
135
136
|
|
|
136
137
|
it( 'should re-render component twice when new filter added and removed in two different animation frames', async () => {
|
|
137
|
-
const SpiedComponent =
|
|
138
|
+
const SpiedComponent = vi.fn( () => <div>Spied component</div> );
|
|
138
139
|
const EnhancedComponent = withFilters( hookName )( SpiedComponent );
|
|
139
140
|
const { container } = render( <EnhancedComponent /> );
|
|
140
141
|
|
|
@@ -163,7 +164,7 @@ describe( 'withFilters', () => {
|
|
|
163
164
|
} );
|
|
164
165
|
|
|
165
166
|
it( 'should re-render both components once each when one filter added', async () => {
|
|
166
|
-
const SpiedComponent =
|
|
167
|
+
const SpiedComponent = vi.fn( () => <div>Spied component</div> );
|
|
167
168
|
const EnhancedComponent = withFilters( hookName )( SpiedComponent );
|
|
168
169
|
|
|
169
170
|
const CombinedComponents = () => (
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
1
2
|
import { render, screen, waitFor } from '@testing-library/react';
|
|
2
3
|
import userEvent from '@testing-library/user-event';
|
|
3
4
|
import { Component } from '@wordpress/element';
|
|
@@ -39,7 +40,7 @@ describe( 'withFocusOutside', () => {
|
|
|
39
40
|
origHasFocus = document.hasFocus;
|
|
40
41
|
document.hasFocus = () => true;
|
|
41
42
|
|
|
42
|
-
onFocusOutside =
|
|
43
|
+
onFocusOutside = vi.fn();
|
|
43
44
|
} );
|
|
44
45
|
|
|
45
46
|
afterEach( () => {
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
1
2
|
import { render } from '@testing-library/react';
|
|
2
3
|
import withSpokenMessages from '../';
|
|
3
4
|
|
|
4
5
|
describe( 'withSpokenMessages', () => {
|
|
5
6
|
it( 'should generate speak and debouncedSpeak props', () => {
|
|
6
|
-
const testSpeak =
|
|
7
|
-
const testDebouncedSpeak =
|
|
7
|
+
const testSpeak = vi.fn();
|
|
8
|
+
const testDebouncedSpeak = vi.fn();
|
|
8
9
|
const isFunction = ( maybeFunc: any ) =>
|
|
9
10
|
typeof maybeFunc === 'function';
|
|
10
11
|
const DumpComponent = withSpokenMessages(
|
package/src/icon/index.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ComponentType, HTMLProps, SVGProps } from 'react';
|
|
1
|
+
import type { ComponentType, CSSProperties, HTMLProps, SVGProps } from 'react';
|
|
2
2
|
import {
|
|
3
3
|
cloneElement,
|
|
4
4
|
createElement,
|
|
@@ -19,6 +19,7 @@ type SizeProps = {
|
|
|
19
19
|
size?: number;
|
|
20
20
|
width?: number | string;
|
|
21
21
|
height?: number | string;
|
|
22
|
+
style?: CSSProperties;
|
|
22
23
|
};
|
|
23
24
|
|
|
24
25
|
type AdditionalProps< T > = T extends ComponentType< infer U >
|
|
@@ -88,23 +89,38 @@ function Icon( {
|
|
|
88
89
|
} );
|
|
89
90
|
}
|
|
90
91
|
|
|
91
|
-
if (
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
92
|
+
if ( isValidElement< SizeProps >( icon ) ) {
|
|
93
|
+
const { style: consumerStyle, ...restProps } =
|
|
94
|
+
additionalProps as SVGProps< SVGSVGElement >;
|
|
95
|
+
const mergedStyle =
|
|
96
|
+
icon.props.style || consumerStyle
|
|
97
|
+
? { ...icon.props.style, ...consumerStyle }
|
|
98
|
+
: undefined;
|
|
99
|
+
const styleProps = mergedStyle ? { style: mergedStyle } : {};
|
|
98
100
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
+
if ( icon.type === 'svg' || icon.type === SVG ) {
|
|
102
|
+
const appliedProps = {
|
|
103
|
+
...icon.props,
|
|
104
|
+
width: size,
|
|
105
|
+
height: size,
|
|
106
|
+
...restProps,
|
|
107
|
+
// Merge styles so the icon's intrinsic style (e.g. `fill: none` on
|
|
108
|
+
// stroke-based icons) is preserved unless the consumer overrides
|
|
109
|
+
// the same property explicitly.
|
|
110
|
+
...styleProps,
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
return <SVG { ...appliedProps } />;
|
|
114
|
+
}
|
|
101
115
|
|
|
102
|
-
if ( isValidElement< SizeProps >( icon ) ) {
|
|
103
116
|
return cloneElement( icon, {
|
|
104
117
|
size,
|
|
105
118
|
width: size,
|
|
106
119
|
height: size,
|
|
107
|
-
...
|
|
120
|
+
...restProps,
|
|
121
|
+
// Merge styles so the icon's intrinsic style is preserved unless
|
|
122
|
+
// the consumer overrides the same property explicitly.
|
|
123
|
+
...styleProps,
|
|
108
124
|
} );
|
|
109
125
|
}
|
|
110
126
|
|
|
@@ -95,4 +95,70 @@ describe( 'Icon', () => {
|
|
|
95
95
|
|
|
96
96
|
expect( screen.getByTestId( testId ) ).toHaveClass( className );
|
|
97
97
|
} );
|
|
98
|
+
|
|
99
|
+
it( "merges a consumer 'style' prop with the icon's intrinsic style", () => {
|
|
100
|
+
const strokeIcon = (
|
|
101
|
+
<SVG style={ { fill: 'none' } }>
|
|
102
|
+
<Path d="M5 4v3h5.5v12h3V7H19V4z" />
|
|
103
|
+
</SVG>
|
|
104
|
+
);
|
|
105
|
+
render(
|
|
106
|
+
<Icon
|
|
107
|
+
data-testid={ testId }
|
|
108
|
+
icon={ strokeIcon }
|
|
109
|
+
style={ { marginInlineStart: 4 } }
|
|
110
|
+
/>
|
|
111
|
+
);
|
|
112
|
+
const icon = screen.getByTestId( testId );
|
|
113
|
+
|
|
114
|
+
// The icon's intrinsic `fill: none` survives…
|
|
115
|
+
expect( icon ).toHaveStyle( 'fill: none' );
|
|
116
|
+
// …alongside the consumer-supplied style.
|
|
117
|
+
expect( icon ).toHaveStyle( 'margin-inline-start: 4px' );
|
|
118
|
+
} );
|
|
119
|
+
|
|
120
|
+
it( "lets a consumer 'style' override the icon's intrinsic style", () => {
|
|
121
|
+
const strokeIcon = (
|
|
122
|
+
<SVG style={ { fill: 'none' } }>
|
|
123
|
+
<Path d="M5 4v3h5.5v12h3V7H19V4z" />
|
|
124
|
+
</SVG>
|
|
125
|
+
);
|
|
126
|
+
render(
|
|
127
|
+
<Icon
|
|
128
|
+
data-testid={ testId }
|
|
129
|
+
icon={ strokeIcon }
|
|
130
|
+
style={ { fill: 'red' } }
|
|
131
|
+
/>
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
expect( screen.getByTestId( testId ) ).toHaveStyle( 'fill: red' );
|
|
135
|
+
} );
|
|
136
|
+
|
|
137
|
+
it( "merges a consumer 'style' with a non-svg element's intrinsic style", () => {
|
|
138
|
+
render(
|
|
139
|
+
<Icon
|
|
140
|
+
icon={
|
|
141
|
+
<span data-testid={ testId } style={ { fill: 'none' } } />
|
|
142
|
+
}
|
|
143
|
+
style={ { marginInlineStart: 4 } }
|
|
144
|
+
/>
|
|
145
|
+
);
|
|
146
|
+
const icon = screen.getByTestId( testId );
|
|
147
|
+
|
|
148
|
+
expect( icon ).toHaveStyle( 'fill: none' );
|
|
149
|
+
expect( icon ).toHaveStyle( 'margin-inline-start: 4px' );
|
|
150
|
+
} );
|
|
151
|
+
|
|
152
|
+
it( "does not add a 'style' prop to a non-svg element without styles", () => {
|
|
153
|
+
let hasStyleProp = true;
|
|
154
|
+
const CustomIcon = ( props: Record< string, unknown > ) => {
|
|
155
|
+
hasStyleProp = 'style' in props;
|
|
156
|
+
return <span data-testid={ testId } />;
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
render( <Icon icon={ <CustomIcon /> } /> );
|
|
160
|
+
|
|
161
|
+
expect( screen.getByTestId( testId ) ).toBeVisible();
|
|
162
|
+
expect( hasStyleProp ).toBe( false );
|
|
163
|
+
} );
|
|
98
164
|
} );
|
|
@@ -47,6 +47,21 @@ const backdropBorderColor = ( {
|
|
|
47
47
|
return COLORS.ui.border;
|
|
48
48
|
};
|
|
49
49
|
|
|
50
|
+
const backdropDisabledStyles = ( {
|
|
51
|
+
disabled,
|
|
52
|
+
isBorderless,
|
|
53
|
+
}: BackdropProps ) => {
|
|
54
|
+
if ( ! disabled || isBorderless ) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return css`
|
|
59
|
+
@media ( forced-colors: active ) {
|
|
60
|
+
border-color: GrayText;
|
|
61
|
+
}
|
|
62
|
+
`;
|
|
63
|
+
};
|
|
64
|
+
|
|
50
65
|
export const BackdropUI = styled.div< BackdropProps >`
|
|
51
66
|
&&& {
|
|
52
67
|
box-sizing: border-box;
|
|
@@ -64,6 +79,7 @@ export const BackdropUI = styled.div< BackdropProps >`
|
|
|
64
79
|
top: 0;
|
|
65
80
|
|
|
66
81
|
${ rtl( { paddingLeft: 2 } ) }
|
|
82
|
+
${ backdropDisabledStyles }
|
|
67
83
|
}
|
|
68
84
|
`;
|
|
69
85
|
|
|
@@ -75,11 +91,17 @@ export const Root = styled( Flex )`
|
|
|
75
91
|
`;
|
|
76
92
|
|
|
77
93
|
const containerDisabledStyles = ( { disabled }: ContainerProps ) => {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
94
|
+
if ( ! disabled ) {
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
81
97
|
|
|
82
|
-
return css
|
|
98
|
+
return css`
|
|
99
|
+
color: ${ COLORS.ui.textDisabled };
|
|
100
|
+
|
|
101
|
+
@media ( forced-colors: active ) {
|
|
102
|
+
color: GrayText;
|
|
103
|
+
}
|
|
104
|
+
`;
|
|
83
105
|
};
|
|
84
106
|
|
|
85
107
|
const containerWidthStyles = ( {
|
|
@@ -110,6 +132,7 @@ export const Container = styled.div< ContainerProps >`
|
|
|
110
132
|
display: flex;
|
|
111
133
|
flex: 1;
|
|
112
134
|
position: relative;
|
|
135
|
+
background-color: ${ COLORS.ui.background };
|
|
113
136
|
|
|
114
137
|
${ containerDisabledStyles }
|
|
115
138
|
${ containerWidthStyles }
|
|
@@ -129,9 +152,17 @@ const disabledStyles = ( { disabled }: InputProps ) => {
|
|
|
129
152
|
return '';
|
|
130
153
|
}
|
|
131
154
|
|
|
132
|
-
return css
|
|
133
|
-
color: COLORS.ui.textDisabled
|
|
134
|
-
|
|
155
|
+
return css`
|
|
156
|
+
color: ${ COLORS.ui.textDisabled };
|
|
157
|
+
|
|
158
|
+
@media ( forced-colors: active ) {
|
|
159
|
+
color: GrayText;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
&:disabled::placeholder {
|
|
163
|
+
color: ${ COLORS.ui.textDisabled };
|
|
164
|
+
}
|
|
165
|
+
`;
|
|
135
166
|
};
|
|
136
167
|
|
|
137
168
|
export const fontSizeStyles = ( { inputSize: size }: InputProps ) => {
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { render, screen } from '@testing-library/react';
|
|
2
2
|
import userEvent from '@testing-library/user-event';
|
|
3
|
+
import type { KeyboardEvent } from 'react';
|
|
3
4
|
import { useState } from '@wordpress/element';
|
|
4
5
|
import BaseInputControl from '../';
|
|
5
6
|
import InputControlPrefixWrapper from '../input-prefix-wrapper';
|
|
7
|
+
import type { InputControlProps } from '../types';
|
|
6
8
|
|
|
7
|
-
const getInput = () => screen.getByTestId( 'input' );
|
|
9
|
+
const getInput = () => screen.getByTestId< HTMLInputElement >( 'input' );
|
|
8
10
|
|
|
9
11
|
describe( 'InputControl', () => {
|
|
10
|
-
const InputControl = ( props ) => {
|
|
12
|
+
const InputControl = ( props: InputControlProps ) => {
|
|
11
13
|
return <BaseInputControl { ...props } data-testid="input" />;
|
|
12
14
|
};
|
|
13
|
-
|
|
14
15
|
describe( 'Basic rendering', () => {
|
|
15
16
|
it( 'should render', () => {
|
|
16
17
|
render( <InputControl /> );
|
|
@@ -85,14 +86,16 @@ describe( 'InputControl', () => {
|
|
|
85
86
|
it( 'should work as a controlled component given normal, falsy or nullish values', async () => {
|
|
86
87
|
const user = await userEvent.setup();
|
|
87
88
|
const spy = jest.fn();
|
|
88
|
-
const heldKeySet = new Set();
|
|
89
|
+
const heldKeySet = new Set< string >();
|
|
89
90
|
const Example = () => {
|
|
90
|
-
const [ state, setState ] = useState
|
|
91
|
-
|
|
91
|
+
const [ state, setState ] = useState< string | undefined >(
|
|
92
|
+
'one'
|
|
93
|
+
);
|
|
94
|
+
const onChange = ( value: string | undefined ) => {
|
|
92
95
|
setState( value );
|
|
93
96
|
spy( value );
|
|
94
97
|
};
|
|
95
|
-
const onKeyDown = ( { key } ) => {
|
|
98
|
+
const onKeyDown = ( { key }: KeyboardEvent ) => {
|
|
96
99
|
heldKeySet.add( key );
|
|
97
100
|
if ( key === 'Escape' ) {
|
|
98
101
|
if ( heldKeySet.has( 'Meta' ) ) {
|
|
@@ -104,7 +107,8 @@ describe( 'InputControl', () => {
|
|
|
104
107
|
}
|
|
105
108
|
}
|
|
106
109
|
};
|
|
107
|
-
const onKeyUp = ( { key } ) =>
|
|
110
|
+
const onKeyUp = ( { key }: KeyboardEvent ) =>
|
|
111
|
+
heldKeySet.delete( key );
|
|
108
112
|
return (
|
|
109
113
|
<InputControl
|
|
110
114
|
value={ state }
|
|
@@ -189,7 +193,8 @@ describe( 'InputControl', () => {
|
|
|
189
193
|
let { value } = state;
|
|
190
194
|
if (
|
|
191
195
|
action.type === 'COMMIT' &&
|
|
192
|
-
action.payload.event
|
|
196
|
+
action.payload.event?.type === 'blur' &&
|
|
197
|
+
value !== undefined
|
|
193
198
|
) {
|
|
194
199
|
value = value.replace( /\bnow\b/, 'meow' );
|
|
195
200
|
}
|
|
@@ -219,7 +224,8 @@ describe( 'InputControl', () => {
|
|
|
219
224
|
<InputControl
|
|
220
225
|
label="Test"
|
|
221
226
|
prefix={ prefix }
|
|
222
|
-
|
|
227
|
+
// @ts-expect-error Verify the legacy value that is omitted from the public type.
|
|
228
|
+
size="__unstable-large"
|
|
223
229
|
/>
|
|
224
230
|
);
|
|
225
231
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
1
2
|
import { render, screen, within } from '@testing-library/react';
|
|
2
3
|
import userEvent from '@testing-library/user-event';
|
|
3
4
|
import IsolatedEventContainer from '..';
|
|
@@ -5,7 +6,7 @@ import IsolatedEventContainer from '..';
|
|
|
5
6
|
describe( 'IsolatedEventContainer', () => {
|
|
6
7
|
it( 'should pass props to container', async () => {
|
|
7
8
|
const user = userEvent.setup();
|
|
8
|
-
const clickHandler =
|
|
9
|
+
const clickHandler = vi.fn();
|
|
9
10
|
render(
|
|
10
11
|
<IsolatedEventContainer
|
|
11
12
|
title="Container"
|
|
@@ -38,8 +39,8 @@ describe( 'IsolatedEventContainer', () => {
|
|
|
38
39
|
it( 'should stop event propagation only for mousedown, but not for keydown', async () => {
|
|
39
40
|
const user = userEvent.setup();
|
|
40
41
|
|
|
41
|
-
const mousedownHandler =
|
|
42
|
-
const keydownHandler =
|
|
42
|
+
const mousedownHandler = vi.fn();
|
|
43
|
+
const keydownHandler = vi.fn();
|
|
43
44
|
render(
|
|
44
45
|
<button
|
|
45
46
|
onMouseDown={ mousedownHandler }
|
|
@@ -2,6 +2,7 @@ import { createContext, useContext } from '@wordpress/element';
|
|
|
2
2
|
import type { ItemGroupContext as Context } from './types';
|
|
3
3
|
|
|
4
4
|
export const ItemGroupContext = createContext( {
|
|
5
|
+
isList: false,
|
|
5
6
|
size: 'medium',
|
|
6
7
|
} as Context );
|
|
7
8
|
ItemGroupContext.displayName = 'ItemGroupContext';
|
|
@@ -1,18 +1,36 @@
|
|
|
1
1
|
import type { ForwardedRef } from 'react';
|
|
2
|
+
import { useEffect, useRef } from '@wordpress/element';
|
|
2
3
|
import type { ItemProps } from '../types';
|
|
3
4
|
import { useItem } from './hook';
|
|
4
5
|
import type { WordPressComponentProps } from '../../context';
|
|
5
6
|
import { contextConnect } from '../../context';
|
|
6
7
|
import { View } from '../../view';
|
|
8
|
+
import { useItemGroupContext } from '../context';
|
|
7
9
|
|
|
8
10
|
function UnconnectedItem(
|
|
9
11
|
props: WordPressComponentProps< ItemProps, 'div' >,
|
|
10
12
|
forwardedRef: ForwardedRef< any >
|
|
11
13
|
) {
|
|
12
14
|
const { role, wrapperClassName, ...otherProps } = useItem( props );
|
|
15
|
+
const itemRef = useRef< HTMLDivElement >( null );
|
|
16
|
+
const { isList } = useItemGroupContext();
|
|
17
|
+
|
|
18
|
+
useEffect( () => {
|
|
19
|
+
if (
|
|
20
|
+
isList &&
|
|
21
|
+
role === 'listitem' &&
|
|
22
|
+
! itemRef.current?.closest(
|
|
23
|
+
'ol, ul, menu, [role="list"], [role="directory"]'
|
|
24
|
+
)
|
|
25
|
+
) {
|
|
26
|
+
throw new Error(
|
|
27
|
+
'Item with list semantics must be rendered inside an element with role="list".'
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
}, [ isList, role ] );
|
|
13
31
|
|
|
14
32
|
return (
|
|
15
|
-
<div role={ role } className={ wrapperClassName }>
|
|
33
|
+
<div ref={ itemRef } role={ role } className={ wrapperClassName }>
|
|
16
34
|
<View { ...otherProps } ref={ forwardedRef } />
|
|
17
35
|
</div>
|
|
18
36
|
);
|
|
@@ -12,17 +12,16 @@ const sizeClassName = {
|
|
|
12
12
|
};
|
|
13
13
|
|
|
14
14
|
export function useItem( props: WordPressComponentProps< ItemProps, 'div' > ) {
|
|
15
|
+
const { isList, spacedAround, size: contextSize } = useItemGroupContext();
|
|
15
16
|
const {
|
|
16
17
|
as: asProp,
|
|
17
18
|
className,
|
|
18
19
|
onClick,
|
|
19
|
-
role = 'listitem',
|
|
20
|
+
role = isList ? 'listitem' : undefined,
|
|
20
21
|
size: sizeProp,
|
|
21
22
|
...otherProps
|
|
22
23
|
} = useContextSystem( props, 'Item' );
|
|
23
24
|
|
|
24
|
-
const { spacedAround, size: contextSize } = useItemGroupContext();
|
|
25
|
-
|
|
26
25
|
const size = sizeProp || contextSize;
|
|
27
26
|
|
|
28
27
|
const as = asProp || ( typeof onClick !== 'undefined' ? 'button' : 'div' );
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
2
|
|
|
3
|
-
exports[`ItemGroup Item should read the value of the size prop from context when the prop is not defined 1`] = `
|
|
3
|
+
exports[`ItemGroup > Item > should read the value of the size prop from context when the prop is not defined 1`] = `
|
|
4
4
|
Snapshot Diff:
|
|
5
5
|
- First value
|
|
6
6
|
+ Second value
|
|
@@ -33,15 +33,15 @@ Snapshot Diff:
|
|
|
33
33
|
</div>
|
|
34
34
|
`;
|
|
35
35
|
|
|
36
|
-
exports[`ItemGroup Item should use different amounts of padding depending on the value of the size prop 1`] = `
|
|
36
|
+
exports[`ItemGroup > Item > should use different amounts of padding depending on the value of the size prop 1`] = `
|
|
37
37
|
Snapshot Diff:
|
|
38
38
|
- First value
|
|
39
39
|
+ Second value
|
|
40
40
|
|
|
41
|
-
@@ -
|
|
41
|
+
@@ -1,11 +1,11 @@
|
|
42
|
+
<div>
|
|
42
43
|
<div
|
|
43
44
|
class="style-item-wrapper"
|
|
44
|
-
role="listitem"
|
|
45
45
|
>
|
|
46
46
|
<div
|
|
47
47
|
- class="style-item style-is-size-medium components-item"
|
|
@@ -53,7 +53,7 @@ Snapshot Diff:
|
|
|
53
53
|
</div>
|
|
54
54
|
`;
|
|
55
55
|
|
|
56
|
-
exports[`ItemGroup ItemGroup component should render correctly 1`] = `
|
|
56
|
+
exports[`ItemGroup > ItemGroup component > should render correctly 1`] = `
|
|
57
57
|
<div>
|
|
58
58
|
<div
|
|
59
59
|
class="style-item-group style-is-rounded components-item-group"
|
|
@@ -77,7 +77,7 @@ exports[`ItemGroup ItemGroup component should render correctly 1`] = `
|
|
|
77
77
|
</div>
|
|
78
78
|
`;
|
|
79
79
|
|
|
80
|
-
exports[`ItemGroup ItemGroup component should render items individually when the isSeparated prop is true 1`] = `
|
|
80
|
+
exports[`ItemGroup > ItemGroup component > should render items individually when the isSeparated prop is true 1`] = `
|
|
81
81
|
Snapshot Diff:
|
|
82
82
|
- First value
|
|
83
83
|
+ Second value
|
|
@@ -105,7 +105,7 @@ Snapshot Diff:
|
|
|
105
105
|
</div>
|
|
106
106
|
`;
|
|
107
107
|
|
|
108
|
-
exports[`ItemGroup ItemGroup component should show borders when the isBordered prop is true 1`] = `
|
|
108
|
+
exports[`ItemGroup > ItemGroup component > should show borders when the isBordered prop is true 1`] = `
|
|
109
109
|
Snapshot Diff:
|
|
110
110
|
- First value
|
|
111
111
|
+ Second value
|
|
@@ -133,7 +133,7 @@ Snapshot Diff:
|
|
|
133
133
|
</div>
|
|
134
134
|
`;
|
|
135
135
|
|
|
136
|
-
exports[`ItemGroup ItemGroup component should show rounded corners when the isRounded prop is true 1`] = `
|
|
136
|
+
exports[`ItemGroup > ItemGroup component > should show rounded corners when the isRounded prop is true 1`] = `
|
|
137
137
|
Snapshot Diff:
|
|
138
138
|
- First value
|
|
139
139
|
+ Second value
|
|
@@ -1,9 +1,70 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
1
2
|
import { render, screen } from '@testing-library/react';
|
|
2
3
|
import userEvent from '@testing-library/user-event';
|
|
4
|
+
import { createPortal } from '@wordpress/element';
|
|
3
5
|
import { Item, ItemGroup } from '..';
|
|
4
6
|
|
|
5
7
|
describe( 'ItemGroup', () => {
|
|
6
8
|
describe( 'ItemGroup component', () => {
|
|
9
|
+
it( 'accepts an Item nested within a semantic list', () => {
|
|
10
|
+
render(
|
|
11
|
+
<ItemGroup>
|
|
12
|
+
<div>
|
|
13
|
+
<Item>Nested item</Item>
|
|
14
|
+
</div>
|
|
15
|
+
</ItemGroup>
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
expect( screen.getByRole( 'listitem' ) ).toHaveTextContent(
|
|
19
|
+
'Nested item'
|
|
20
|
+
);
|
|
21
|
+
} );
|
|
22
|
+
|
|
23
|
+
it( 'throws when an Item with list semantics is outside a semantic list', () => {
|
|
24
|
+
const portalContainer = document.createElement( 'div' );
|
|
25
|
+
document.body.append( portalContainer );
|
|
26
|
+
|
|
27
|
+
try {
|
|
28
|
+
expect( () =>
|
|
29
|
+
render(
|
|
30
|
+
<ItemGroup>
|
|
31
|
+
{ createPortal(
|
|
32
|
+
<Item>Portaled item</Item>,
|
|
33
|
+
portalContainer
|
|
34
|
+
) }
|
|
35
|
+
</ItemGroup>
|
|
36
|
+
)
|
|
37
|
+
).toThrow(
|
|
38
|
+
'Item with list semantics must be rendered inside an element with role="list".'
|
|
39
|
+
);
|
|
40
|
+
expect( console ).toHaveErrored();
|
|
41
|
+
} finally {
|
|
42
|
+
portalContainer.remove();
|
|
43
|
+
}
|
|
44
|
+
} );
|
|
45
|
+
|
|
46
|
+
it( 'accepts custom children', () => {
|
|
47
|
+
render(
|
|
48
|
+
<ItemGroup>
|
|
49
|
+
<div>Custom item</div>
|
|
50
|
+
</ItemGroup>
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
expect( screen.getByText( 'Custom item' ) ).toBeVisible();
|
|
54
|
+
} );
|
|
55
|
+
|
|
56
|
+
it( 'preserves custom roles', () => {
|
|
57
|
+
render(
|
|
58
|
+
<ItemGroup role="group">
|
|
59
|
+
<div>
|
|
60
|
+
<Item role="presentation">Custom item</Item>
|
|
61
|
+
</div>
|
|
62
|
+
</ItemGroup>
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
expect( screen.getByRole( 'group' ) ).toBeVisible();
|
|
66
|
+
} );
|
|
67
|
+
|
|
7
68
|
it( 'should render correctly', () => {
|
|
8
69
|
const { container } = render(
|
|
9
70
|
<ItemGroup>
|
|
@@ -66,9 +127,45 @@ describe( 'ItemGroup', () => {
|
|
|
66
127
|
} );
|
|
67
128
|
|
|
68
129
|
describe( 'Item', () => {
|
|
130
|
+
it( 'uses list semantics only within a list-semantic ItemGroup', () => {
|
|
131
|
+
const { rerender } = render( <Item>Standalone item</Item> );
|
|
132
|
+
|
|
133
|
+
expect( screen.queryByRole( 'listitem' ) ).not.toBeInTheDocument();
|
|
134
|
+
|
|
135
|
+
rerender(
|
|
136
|
+
<ItemGroup role="group">
|
|
137
|
+
<Item>Non-list item</Item>
|
|
138
|
+
</ItemGroup>
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
expect( screen.queryByRole( 'listitem' ) ).not.toBeInTheDocument();
|
|
142
|
+
|
|
143
|
+
rerender(
|
|
144
|
+
<ItemGroup>
|
|
145
|
+
<Item>Grouped item</Item>
|
|
146
|
+
</ItemGroup>
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
expect( screen.getByRole( 'listitem' ) ).toHaveTextContent(
|
|
150
|
+
'Grouped item'
|
|
151
|
+
);
|
|
152
|
+
} );
|
|
153
|
+
|
|
154
|
+
it( 'uses list semantics within an ItemGroup with the directory role', () => {
|
|
155
|
+
render(
|
|
156
|
+
<ItemGroup role="directory">
|
|
157
|
+
<Item>Directory item</Item>
|
|
158
|
+
</ItemGroup>
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
expect( screen.getByRole( 'listitem' ) ).toHaveTextContent(
|
|
162
|
+
'Directory item'
|
|
163
|
+
);
|
|
164
|
+
} );
|
|
165
|
+
|
|
69
166
|
it( 'should render as a `button` if the `onClick` handler is specified', async () => {
|
|
70
167
|
const user = userEvent.setup();
|
|
71
|
-
const spy =
|
|
168
|
+
const spy = vi.fn();
|
|
72
169
|
render( <Item onClick={ spy }>Code is poetry</Item> );
|
|
73
170
|
|
|
74
171
|
const button = screen.getByRole( 'button' );
|
|
@@ -81,7 +178,7 @@ describe( 'ItemGroup', () => {
|
|
|
81
178
|
} );
|
|
82
179
|
|
|
83
180
|
it( 'should give priority to the `as` prop even if the `onClick` handler is specified', () => {
|
|
84
|
-
const spy =
|
|
181
|
+
const spy = vi.fn();
|
|
85
182
|
const { rerender } = render(
|
|
86
183
|
<Item onClick={ spy }>Code is poetry</Item>
|
|
87
184
|
);
|