@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 { describe, expect, it, vi } from 'vitest';
|
|
1
2
|
import { screen, waitFor } from '@testing-library/react';
|
|
2
3
|
import { press, click } from '@ariakit/test';
|
|
3
4
|
import { render } from '@ariakit/test/react';
|
|
@@ -5,16 +6,17 @@ import { useEffect, useState } from '@wordpress/element';
|
|
|
5
6
|
import { isRTL } from '@wordpress/i18n';
|
|
6
7
|
import { Tabs } from '..';
|
|
7
8
|
import type { TabsProps } from '../types';
|
|
9
|
+
globalThis.wpVitest.mockResizeObserver();
|
|
8
10
|
|
|
9
11
|
// Setup mocking the `isRTL` function to test arrow key navigation behavior.
|
|
10
|
-
|
|
11
|
-
const original =
|
|
12
|
+
vi.mock( import( '@wordpress/i18n' ), async ( importOriginal ) => {
|
|
13
|
+
const original = await importOriginal();
|
|
12
14
|
return {
|
|
13
15
|
...original,
|
|
14
|
-
isRTL:
|
|
16
|
+
isRTL: vi.fn( () => false ),
|
|
15
17
|
};
|
|
16
18
|
} );
|
|
17
|
-
const mockedIsRTL = isRTL
|
|
19
|
+
const mockedIsRTL = vi.mocked( isRTL );
|
|
18
20
|
|
|
19
21
|
type Tab = {
|
|
20
22
|
tabId: string;
|
|
@@ -335,7 +337,7 @@ describe( 'Tabs', () => {
|
|
|
335
337
|
|
|
336
338
|
describe( 'pointer interactions', () => {
|
|
337
339
|
it( 'should select a tab when clicked', async () => {
|
|
338
|
-
const mockOnSelect =
|
|
340
|
+
const mockOnSelect = vi.fn();
|
|
339
341
|
|
|
340
342
|
await render(
|
|
341
343
|
<UncontrolledTabs tabs={ TABS } onSelect={ mockOnSelect } />
|
|
@@ -385,7 +387,7 @@ describe( 'Tabs', () => {
|
|
|
385
387
|
} );
|
|
386
388
|
|
|
387
389
|
it( 'should not select a disabled tab when clicked', async () => {
|
|
388
|
-
const mockOnSelect =
|
|
390
|
+
const mockOnSelect = vi.fn();
|
|
389
391
|
|
|
390
392
|
await render(
|
|
391
393
|
<UncontrolledTabs
|
|
@@ -641,7 +643,7 @@ describe( 'Tabs', () => {
|
|
|
641
643
|
} );
|
|
642
644
|
|
|
643
645
|
it( 'should ignore any changes to the `defaultTabId` prop after the first render', async () => {
|
|
644
|
-
const mockOnSelect =
|
|
646
|
+
const mockOnSelect = vi.fn();
|
|
645
647
|
|
|
646
648
|
const { rerender } = await render(
|
|
647
649
|
<UncontrolledTabs
|
|
@@ -929,7 +931,7 @@ describe( 'Tabs', () => {
|
|
|
929
931
|
} );
|
|
930
932
|
|
|
931
933
|
it( 'should select tabs in the tablist when using the left and right arrow keys by default (automatic tab activation)', async () => {
|
|
932
|
-
const mockOnSelect =
|
|
934
|
+
const mockOnSelect = vi.fn();
|
|
933
935
|
|
|
934
936
|
await render(
|
|
935
937
|
<Component tabs={ TABS } onSelect={ mockOnSelect } />
|
|
@@ -1008,7 +1010,7 @@ describe( 'Tabs', () => {
|
|
|
1008
1010
|
} );
|
|
1009
1011
|
|
|
1010
1012
|
it( 'should not automatically select tabs in the tablist when pressing the left and right arrow keys if the `selectOnMove` prop is set to `false` (manual tab activation)', async () => {
|
|
1011
|
-
const mockOnSelect =
|
|
1013
|
+
const mockOnSelect = vi.fn();
|
|
1012
1014
|
|
|
1013
1015
|
await render(
|
|
1014
1016
|
<Component
|
|
@@ -1081,7 +1083,7 @@ describe( 'Tabs', () => {
|
|
|
1081
1083
|
} );
|
|
1082
1084
|
|
|
1083
1085
|
it( 'should not select tabs in the tablist when using the up and down arrow keys, unless the `orientation` prop is set to `vertical`', async () => {
|
|
1084
|
-
const mockOnSelect =
|
|
1086
|
+
const mockOnSelect = vi.fn();
|
|
1085
1087
|
|
|
1086
1088
|
const { rerender } = await render(
|
|
1087
1089
|
<Component tabs={ TABS } onSelect={ mockOnSelect } />
|
|
@@ -1185,7 +1187,7 @@ describe( 'Tabs', () => {
|
|
|
1185
1187
|
} );
|
|
1186
1188
|
|
|
1187
1189
|
it( 'should loop tab focus at the end of the tablist when using arrow keys', async () => {
|
|
1188
|
-
const mockOnSelect =
|
|
1190
|
+
const mockOnSelect = vi.fn();
|
|
1189
1191
|
|
|
1190
1192
|
await render(
|
|
1191
1193
|
<Component tabs={ TABS } onSelect={ mockOnSelect } />
|
|
@@ -1250,7 +1252,7 @@ describe( 'Tabs', () => {
|
|
|
1250
1252
|
// For this test only, mock the writing direction to RTL.
|
|
1251
1253
|
mockedIsRTL.mockImplementation( () => true );
|
|
1252
1254
|
|
|
1253
|
-
const mockOnSelect =
|
|
1255
|
+
const mockOnSelect = vi.fn();
|
|
1254
1256
|
|
|
1255
1257
|
await render(
|
|
1256
1258
|
<Component tabs={ TABS } onSelect={ mockOnSelect } />
|
|
@@ -1332,7 +1334,7 @@ describe( 'Tabs', () => {
|
|
|
1332
1334
|
} );
|
|
1333
1335
|
|
|
1334
1336
|
it( 'should focus tabs in the tablist even if disabled', async () => {
|
|
1335
|
-
const mockOnSelect =
|
|
1337
|
+
const mockOnSelect = vi.fn();
|
|
1336
1338
|
|
|
1337
1339
|
await render(
|
|
1338
1340
|
<Component
|
|
@@ -1534,7 +1536,7 @@ describe( 'Tabs', () => {
|
|
|
1534
1536
|
describe( 'removing a tab', () => {
|
|
1535
1537
|
describe( 'with no explicitly set initial tab', () => {
|
|
1536
1538
|
it( 'should not select a new tab when the selected tab is removed', async () => {
|
|
1537
|
-
const mockOnSelect =
|
|
1539
|
+
const mockOnSelect = vi.fn();
|
|
1538
1540
|
|
|
1539
1541
|
const { rerender } = await render(
|
|
1540
1542
|
<UncontrolledTabs
|
|
@@ -1600,7 +1602,7 @@ describe( 'Tabs', () => {
|
|
|
1600
1602
|
'when using the `%s` prop [%s]',
|
|
1601
1603
|
( propName, _mode, Component ) => {
|
|
1602
1604
|
it( 'should not select a new tab when the selected tab is removed', async () => {
|
|
1603
|
-
const mockOnSelect =
|
|
1605
|
+
const mockOnSelect = vi.fn();
|
|
1604
1606
|
|
|
1605
1607
|
const initialComponentProps = {
|
|
1606
1608
|
tabs: TABS,
|
|
@@ -1662,7 +1664,7 @@ describe( 'Tabs', () => {
|
|
|
1662
1664
|
} );
|
|
1663
1665
|
|
|
1664
1666
|
it( `should not select the tab matching the \`${ propName }\` prop as a fallback when the selected tab is removed`, async () => {
|
|
1665
|
-
const mockOnSelect =
|
|
1667
|
+
const mockOnSelect = vi.fn();
|
|
1666
1668
|
|
|
1667
1669
|
const initialComponentProps = {
|
|
1668
1670
|
tabs: TABS,
|
|
@@ -1758,7 +1760,7 @@ describe( 'Tabs', () => {
|
|
|
1758
1760
|
'when using the `%s` prop [%s]',
|
|
1759
1761
|
( propName, _mode, Component ) => {
|
|
1760
1762
|
it( `should select a newly added tab if it matches the \`${ propName }\` prop`, async () => {
|
|
1761
|
-
const mockOnSelect =
|
|
1763
|
+
const mockOnSelect = vi.fn();
|
|
1762
1764
|
|
|
1763
1765
|
const initialComponentProps = {
|
|
1764
1766
|
tabs: TABS,
|
|
@@ -1812,7 +1814,7 @@ describe( 'Tabs', () => {
|
|
|
1812
1814
|
'when using the `%s` prop [%s]',
|
|
1813
1815
|
( propName, _mode, Component ) => {
|
|
1814
1816
|
it( `should keep the initial tab matching the \`${ propName }\` prop as selected even if it becomes disabled`, async () => {
|
|
1815
|
-
const mockOnSelect =
|
|
1817
|
+
const mockOnSelect = vi.fn();
|
|
1816
1818
|
|
|
1817
1819
|
const initialComponentProps = {
|
|
1818
1820
|
tabs: TABS,
|
|
@@ -1874,7 +1876,7 @@ describe( 'Tabs', () => {
|
|
|
1874
1876
|
} );
|
|
1875
1877
|
|
|
1876
1878
|
it( 'should keep the current tab selected by the user as selected even if it becomes disabled', async () => {
|
|
1877
|
-
const mockOnSelect =
|
|
1879
|
+
const mockOnSelect = vi.fn();
|
|
1878
1880
|
|
|
1879
1881
|
const { rerender } = await render(
|
|
1880
1882
|
<Component
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
display: block;
|
|
7
7
|
background: $components-color-background;
|
|
8
8
|
color: $components-color-foreground;
|
|
9
|
-
/* stylelint-disable-next-line
|
|
9
|
+
/* stylelint-disable-next-line logical-css/require-logical-keywords -- Preserve Emotion `resize: vertical`; `block` is not equivalent in vertical writing modes. */
|
|
10
10
|
resize: vertical;
|
|
11
11
|
|
|
12
12
|
@include input-control;
|
|
@@ -21,9 +21,10 @@
|
|
|
21
21
|
min-height: 38px;
|
|
22
22
|
|
|
23
23
|
&:disabled {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
border-color: var(--wpds-color-stroke-interactive-neutral-disabled);
|
|
25
|
+
color: var(--wpds-color-foreground-interactive-neutral-disabled);
|
|
26
|
+
// Core's `form.css` sets its own background on disabled textareas.
|
|
27
|
+
background: $components-color-background;
|
|
27
28
|
}
|
|
28
29
|
|
|
29
30
|
// Use opacity to work in various editor styles.
|
|
@@ -53,4 +54,8 @@
|
|
|
53
54
|
color: $components-color-light-gray-placeholder;
|
|
54
55
|
}
|
|
55
56
|
}
|
|
57
|
+
|
|
58
|
+
&:disabled::placeholder {
|
|
59
|
+
color: var(--wpds-color-foreground-interactive-neutral-disabled);
|
|
60
|
+
}
|
|
56
61
|
}
|
package/src/tip/style.scss
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
1
2
|
import { render, screen } from '@testing-library/react';
|
|
2
3
|
import ToggleControl from '..';
|
|
3
4
|
|
|
5
|
+
globalThis.wpVitest.mockMatchMedia();
|
|
6
|
+
|
|
4
7
|
describe( 'ToggleControl', () => {
|
|
5
8
|
it( 'should label the toggle', () => {
|
|
6
9
|
render( <ToggleControl label="My toggle" onChange={ () => {} } /> );
|
|
@@ -11,7 +14,7 @@ describe( 'ToggleControl', () => {
|
|
|
11
14
|
} );
|
|
12
15
|
|
|
13
16
|
it( 'triggers change callback with boolean', () => {
|
|
14
|
-
const onChange =
|
|
17
|
+
const onChange = vi.fn();
|
|
15
18
|
|
|
16
19
|
render( <ToggleControl label="My toggle" onChange={ onChange } /> );
|
|
17
20
|
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
import { createContext, useContext } from '@wordpress/element';
|
|
2
2
|
import type { ToggleGroupControlContextProps } from './types';
|
|
3
3
|
|
|
4
|
-
const ToggleGroupControlContext = createContext
|
|
5
|
-
|
|
6
|
-
);
|
|
4
|
+
const ToggleGroupControlContext = createContext<
|
|
5
|
+
ToggleGroupControlContextProps | undefined
|
|
6
|
+
>( undefined );
|
|
7
7
|
ToggleGroupControlContext.displayName = 'ToggleGroupControlContext';
|
|
8
8
|
|
|
9
|
-
export const useToggleGroupControlContext = (
|
|
10
|
-
|
|
9
|
+
export const useToggleGroupControlContext = (
|
|
10
|
+
componentName = 'ToggleGroupControlOptionBase'
|
|
11
|
+
) => {
|
|
12
|
+
const context = useContext( ToggleGroupControlContext );
|
|
13
|
+
if ( ! context ) {
|
|
14
|
+
throw new Error(
|
|
15
|
+
`${ componentName } can only be rendered inside ToggleGroupControl.`
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
return context;
|
|
19
|
+
};
|
|
11
20
|
export default ToggleGroupControlContext;
|
|
@@ -39,8 +39,9 @@ const Template: StoryFn< typeof ToggleGroupControl > = ( {
|
|
|
39
39
|
onChange,
|
|
40
40
|
...props
|
|
41
41
|
} ) => {
|
|
42
|
-
const [ value, setValue ] =
|
|
43
|
-
|
|
42
|
+
const [ value, setValue ] = useState< ToggleGroupControlProps[ 'value' ] >(
|
|
43
|
+
props.value
|
|
44
|
+
);
|
|
44
45
|
|
|
45
46
|
return (
|
|
46
47
|
<ToggleGroupControl
|
|
@@ -135,3 +136,15 @@ Deselectable.args = {
|
|
|
135
136
|
...WithIcons.args,
|
|
136
137
|
isDeselectable: true,
|
|
137
138
|
};
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* When the `disabled` prop is true, the control is unselectable.
|
|
142
|
+
*/
|
|
143
|
+
export const Disabled: StoryFn< typeof ToggleGroupControl > = Template.bind(
|
|
144
|
+
{}
|
|
145
|
+
);
|
|
146
|
+
Disabled.args = {
|
|
147
|
+
...Default.args,
|
|
148
|
+
disabled: true,
|
|
149
|
+
value: 'left',
|
|
150
|
+
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { describe, expect, it, test, vi } from 'vitest';
|
|
1
2
|
import { render, screen, waitFor } from '@testing-library/react';
|
|
2
3
|
import { press, click, hover, sleep } from '@ariakit/test';
|
|
3
4
|
import { useState } from '@wordpress/element';
|
|
@@ -12,12 +13,22 @@ import { TOOLTIP_DELAY } from '../../tooltip';
|
|
|
12
13
|
import type { ToggleGroupControlProps } from '../types';
|
|
13
14
|
import controlStyles from '../toggle-group-control/style.module.scss';
|
|
14
15
|
import optionStyles from '../toggle-group-control-option-base/style.module.scss';
|
|
16
|
+
globalThis.wpVitest.mockResizeObserver();
|
|
15
17
|
|
|
16
18
|
const hoverOutside = async () => {
|
|
17
19
|
await hover( document.body );
|
|
18
20
|
await hover( document.body, { clientX: 10, clientY: 10 } );
|
|
19
21
|
};
|
|
20
22
|
|
|
23
|
+
const expectGroupChromeDisabled = ( group: HTMLElement ) => {
|
|
24
|
+
expect( group ).toBeVisible();
|
|
25
|
+
expect( group ).toHaveAttribute( 'aria-disabled', 'true' );
|
|
26
|
+
// `toBeEnabled()` treats aria-disabled as disabled, so it cannot
|
|
27
|
+
// catch an HTML `disabled` leak onto this div.
|
|
28
|
+
// eslint-disable-next-line jest-dom/prefer-enabled-disabled
|
|
29
|
+
expect( group ).not.toHaveAttribute( 'disabled' );
|
|
30
|
+
};
|
|
31
|
+
|
|
21
32
|
const getGeneratedEmotionClassNames = ( element: HTMLElement ) =>
|
|
22
33
|
Array.from( element.classList ).filter( ( className ) =>
|
|
23
34
|
/^(css|emotion)-/.test( className )
|
|
@@ -90,6 +101,32 @@ const optionsWithDisabledOption = (
|
|
|
90
101
|
</>
|
|
91
102
|
);
|
|
92
103
|
|
|
104
|
+
describe( 'required context', () => {
|
|
105
|
+
it( 'throws when ToggleGroupControlOption is outside ToggleGroupControl', () => {
|
|
106
|
+
expect( () =>
|
|
107
|
+
render( <ToggleGroupControlOption value="value" label="Label" /> )
|
|
108
|
+
).toThrow(
|
|
109
|
+
'ToggleGroupControlOption can only be rendered inside ToggleGroupControl.'
|
|
110
|
+
);
|
|
111
|
+
expect( console ).toHaveErrored();
|
|
112
|
+
} );
|
|
113
|
+
|
|
114
|
+
it( 'throws when ToggleGroupControlOptionIcon is outside ToggleGroupControl', () => {
|
|
115
|
+
expect( () =>
|
|
116
|
+
render(
|
|
117
|
+
<ToggleGroupControlOptionIcon
|
|
118
|
+
value="value"
|
|
119
|
+
label="Label"
|
|
120
|
+
icon={ formatUppercase }
|
|
121
|
+
/>
|
|
122
|
+
)
|
|
123
|
+
).toThrow(
|
|
124
|
+
'ToggleGroupControlOptionIcon can only be rendered inside ToggleGroupControl.'
|
|
125
|
+
);
|
|
126
|
+
expect( console ).toHaveErrored();
|
|
127
|
+
} );
|
|
128
|
+
} );
|
|
129
|
+
|
|
93
130
|
describe.each( [
|
|
94
131
|
[ 'uncontrolled', ToggleGroupControl ],
|
|
95
132
|
[ 'controlled', ControlledToggleGroupControl ],
|
|
@@ -98,17 +135,27 @@ describe.each( [
|
|
|
98
135
|
|
|
99
136
|
describe( 'should render correctly', () => {
|
|
100
137
|
it( 'with text options', () => {
|
|
101
|
-
|
|
138
|
+
render(
|
|
102
139
|
<Component label="Test Toggle Group Control">
|
|
103
140
|
{ options }
|
|
104
141
|
</Component>
|
|
105
142
|
);
|
|
106
143
|
|
|
107
|
-
expect(
|
|
144
|
+
expect(
|
|
145
|
+
screen.getByRole( 'radiogroup', {
|
|
146
|
+
name: 'Test Toggle Group Control',
|
|
147
|
+
} )
|
|
148
|
+
).toBeInTheDocument();
|
|
149
|
+
expect(
|
|
150
|
+
screen.getByRole( 'radio', { name: 'R' } )
|
|
151
|
+
).toBeInTheDocument();
|
|
152
|
+
expect(
|
|
153
|
+
screen.getByRole( 'radio', { name: 'J' } )
|
|
154
|
+
).toBeInTheDocument();
|
|
108
155
|
} );
|
|
109
156
|
|
|
110
157
|
it( 'with icons', () => {
|
|
111
|
-
|
|
158
|
+
render(
|
|
112
159
|
<Component value="uppercase" label="Test Toggle Group Control">
|
|
113
160
|
<ToggleGroupControlOptionIcon
|
|
114
161
|
value="uppercase"
|
|
@@ -123,7 +170,12 @@ describe.each( [
|
|
|
123
170
|
</Component>
|
|
124
171
|
);
|
|
125
172
|
|
|
126
|
-
expect(
|
|
173
|
+
expect(
|
|
174
|
+
screen.getByRole( 'radio', { name: 'Uppercase' } )
|
|
175
|
+
).toBeChecked();
|
|
176
|
+
expect(
|
|
177
|
+
screen.getByRole( 'radio', { name: 'Lowercase' } )
|
|
178
|
+
).not.toBeChecked();
|
|
127
179
|
} );
|
|
128
180
|
} );
|
|
129
181
|
it( 'should render with the correct option initially selected when `value` is defined', () => {
|
|
@@ -143,7 +195,7 @@ describe.each( [
|
|
|
143
195
|
expect( screen.getByRole( 'radio', { name: 'J' } ) ).not.toBeChecked();
|
|
144
196
|
} );
|
|
145
197
|
it( 'should call onChange with proper value', async () => {
|
|
146
|
-
const mockOnChange =
|
|
198
|
+
const mockOnChange = vi.fn();
|
|
147
199
|
|
|
148
200
|
render(
|
|
149
201
|
<Component
|
|
@@ -402,7 +454,7 @@ describe.each( [
|
|
|
402
454
|
describe( 'isDeselectable', () => {
|
|
403
455
|
describe( 'isDeselectable = false', () => {
|
|
404
456
|
it( 'should not be deselectable', async () => {
|
|
405
|
-
const mockOnChange =
|
|
457
|
+
const mockOnChange = vi.fn();
|
|
406
458
|
|
|
407
459
|
render(
|
|
408
460
|
<Component
|
|
@@ -453,7 +505,7 @@ describe.each( [
|
|
|
453
505
|
} );
|
|
454
506
|
|
|
455
507
|
it( 'should ignore disabled radio options', async () => {
|
|
456
|
-
const mockOnChange =
|
|
508
|
+
const mockOnChange = vi.fn();
|
|
457
509
|
|
|
458
510
|
render(
|
|
459
511
|
<Component
|
|
@@ -501,7 +553,7 @@ describe.each( [
|
|
|
501
553
|
|
|
502
554
|
describe( 'isDeselectable = true', () => {
|
|
503
555
|
it( 'should be deselectable', async () => {
|
|
504
|
-
const mockOnChange =
|
|
556
|
+
const mockOnChange = vi.fn();
|
|
505
557
|
|
|
506
558
|
render(
|
|
507
559
|
<Component
|
|
@@ -567,7 +619,7 @@ describe.each( [
|
|
|
567
619
|
} );
|
|
568
620
|
|
|
569
621
|
it( 'should ignore disabled options', async () => {
|
|
570
|
-
const mockOnChange =
|
|
622
|
+
const mockOnChange = vi.fn();
|
|
571
623
|
|
|
572
624
|
render(
|
|
573
625
|
<Component
|
|
@@ -626,6 +678,228 @@ describe.each( [
|
|
|
626
678
|
} );
|
|
627
679
|
} );
|
|
628
680
|
} );
|
|
681
|
+
|
|
682
|
+
describe( 'disabled', () => {
|
|
683
|
+
it( 'should not select another option when the control is disabled', async () => {
|
|
684
|
+
const mockOnChange = vi.fn();
|
|
685
|
+
|
|
686
|
+
render(
|
|
687
|
+
<Component
|
|
688
|
+
value="rigas"
|
|
689
|
+
label="Test"
|
|
690
|
+
disabled
|
|
691
|
+
onChange={ mockOnChange }
|
|
692
|
+
>
|
|
693
|
+
{ options }
|
|
694
|
+
</Component>
|
|
695
|
+
);
|
|
696
|
+
|
|
697
|
+
expectGroupChromeDisabled(
|
|
698
|
+
screen.getByRole( 'radiogroup', { name: 'Test' } )
|
|
699
|
+
);
|
|
700
|
+
|
|
701
|
+
expect( screen.getByRole( 'radio', { name: 'R' } ) ).toBeChecked();
|
|
702
|
+
|
|
703
|
+
await click( screen.getByRole( 'radio', { name: 'J' } ) );
|
|
704
|
+
|
|
705
|
+
expect( screen.getByRole( 'radio', { name: 'R' } ) ).toBeChecked();
|
|
706
|
+
expect(
|
|
707
|
+
screen.getByRole( 'radio', { name: 'J' } )
|
|
708
|
+
).not.toBeChecked();
|
|
709
|
+
expect( mockOnChange ).not.toHaveBeenCalled();
|
|
710
|
+
|
|
711
|
+
await press.ArrowRight();
|
|
712
|
+
expect( mockOnChange ).not.toHaveBeenCalled();
|
|
713
|
+
} );
|
|
714
|
+
|
|
715
|
+
it( 'should skip the disabled control when tabbing', async () => {
|
|
716
|
+
render(
|
|
717
|
+
<>
|
|
718
|
+
<button>Before ToggleGroupControl</button>
|
|
719
|
+
<Component value="rigas" label="Test" disabled>
|
|
720
|
+
{ options }
|
|
721
|
+
</Component>
|
|
722
|
+
<button>After ToggleGroupControl</button>
|
|
723
|
+
</>
|
|
724
|
+
);
|
|
725
|
+
|
|
726
|
+
await press.Tab();
|
|
727
|
+
expect(
|
|
728
|
+
screen.getByRole( 'button', {
|
|
729
|
+
name: 'Before ToggleGroupControl',
|
|
730
|
+
} )
|
|
731
|
+
).toHaveFocus();
|
|
732
|
+
|
|
733
|
+
await press.Tab();
|
|
734
|
+
|
|
735
|
+
const expectedFocusTarget =
|
|
736
|
+
mode === 'uncontrolled'
|
|
737
|
+
? screen.getByRole( 'button', {
|
|
738
|
+
name: 'After ToggleGroupControl',
|
|
739
|
+
} )
|
|
740
|
+
: screen.getByRole( 'button', { name: 'Reset' } );
|
|
741
|
+
|
|
742
|
+
expect( expectedFocusTarget ).toHaveFocus();
|
|
743
|
+
} );
|
|
744
|
+
|
|
745
|
+
it( 'should keep the selected option when the control is disabled', () => {
|
|
746
|
+
render(
|
|
747
|
+
<Component value="jack" label="Test" disabled>
|
|
748
|
+
{ options }
|
|
749
|
+
</Component>
|
|
750
|
+
);
|
|
751
|
+
|
|
752
|
+
expect( screen.getByRole( 'radio', { name: 'J' } ) ).toBeChecked();
|
|
753
|
+
expect(
|
|
754
|
+
screen.getByRole( 'radio', { name: 'R' } )
|
|
755
|
+
).not.toBeChecked();
|
|
756
|
+
} );
|
|
757
|
+
|
|
758
|
+
it( 'should not call onChange when a disabled control is clicked', async () => {
|
|
759
|
+
const mockOnChange = vi.fn();
|
|
760
|
+
|
|
761
|
+
render(
|
|
762
|
+
<Component
|
|
763
|
+
value="rigas"
|
|
764
|
+
label="Test"
|
|
765
|
+
disabled
|
|
766
|
+
onChange={ mockOnChange }
|
|
767
|
+
>
|
|
768
|
+
{ options }
|
|
769
|
+
</Component>
|
|
770
|
+
);
|
|
771
|
+
|
|
772
|
+
await click( screen.getByRole( 'radio', { name: 'J' } ) );
|
|
773
|
+
await click( screen.getByRole( 'radio', { name: 'R' } ) );
|
|
774
|
+
|
|
775
|
+
expect( mockOnChange ).not.toHaveBeenCalled();
|
|
776
|
+
} );
|
|
777
|
+
|
|
778
|
+
it( 'should disable every option when the control is disabled, including options without their own disabled prop', () => {
|
|
779
|
+
render(
|
|
780
|
+
<Component value="pizza" label="Test" disabled>
|
|
781
|
+
{ optionsWithDisabledOption }
|
|
782
|
+
</Component>
|
|
783
|
+
);
|
|
784
|
+
|
|
785
|
+
expectGroupChromeDisabled(
|
|
786
|
+
screen.getByRole( 'radiogroup', { name: 'Test' } )
|
|
787
|
+
);
|
|
788
|
+
|
|
789
|
+
expect(
|
|
790
|
+
screen.getByRole( 'radio', { name: 'Pizza' } )
|
|
791
|
+
).toBeDisabled();
|
|
792
|
+
expect(
|
|
793
|
+
screen.getByRole( 'radio', { name: 'Rice' } )
|
|
794
|
+
).toBeDisabled();
|
|
795
|
+
expect(
|
|
796
|
+
screen.getByRole( 'radio', { name: 'Pasta' } )
|
|
797
|
+
).toBeDisabled();
|
|
798
|
+
} );
|
|
799
|
+
|
|
800
|
+
it( 'should not deselect the pressed option when the control is disabled', async () => {
|
|
801
|
+
const mockOnChange = vi.fn();
|
|
802
|
+
|
|
803
|
+
render(
|
|
804
|
+
<Component
|
|
805
|
+
value="rigas"
|
|
806
|
+
label="Test"
|
|
807
|
+
onChange={ mockOnChange }
|
|
808
|
+
isDeselectable
|
|
809
|
+
disabled
|
|
810
|
+
>
|
|
811
|
+
{ options }
|
|
812
|
+
</Component>
|
|
813
|
+
);
|
|
814
|
+
|
|
815
|
+
expectGroupChromeDisabled(
|
|
816
|
+
screen.getByRole( 'group', { name: 'Test' } )
|
|
817
|
+
);
|
|
818
|
+
|
|
819
|
+
const pressed = screen.getByRole( 'button', {
|
|
820
|
+
name: 'R',
|
|
821
|
+
pressed: true,
|
|
822
|
+
} );
|
|
823
|
+
expect( pressed ).toBeVisible();
|
|
824
|
+
expect( pressed ).toBeDisabled();
|
|
825
|
+
|
|
826
|
+
await click( pressed );
|
|
827
|
+
|
|
828
|
+
expect(
|
|
829
|
+
screen.getByRole( 'button', {
|
|
830
|
+
name: 'R',
|
|
831
|
+
pressed: true,
|
|
832
|
+
} )
|
|
833
|
+
).toBeVisible();
|
|
834
|
+
expect( mockOnChange ).not.toHaveBeenCalled();
|
|
835
|
+
} );
|
|
836
|
+
|
|
837
|
+
it( 'should skip a deselectable disabled control when tabbing', async () => {
|
|
838
|
+
render(
|
|
839
|
+
<>
|
|
840
|
+
<button>Before ToggleGroupControl</button>
|
|
841
|
+
<Component
|
|
842
|
+
isDeselectable
|
|
843
|
+
value="rigas"
|
|
844
|
+
label="Test"
|
|
845
|
+
disabled
|
|
846
|
+
>
|
|
847
|
+
{ options }
|
|
848
|
+
</Component>
|
|
849
|
+
<button>After ToggleGroupControl</button>
|
|
850
|
+
</>
|
|
851
|
+
);
|
|
852
|
+
|
|
853
|
+
await press.Tab();
|
|
854
|
+
expect(
|
|
855
|
+
screen.getByRole( 'button', {
|
|
856
|
+
name: 'Before ToggleGroupControl',
|
|
857
|
+
} )
|
|
858
|
+
).toHaveFocus();
|
|
859
|
+
|
|
860
|
+
await press.Tab();
|
|
861
|
+
|
|
862
|
+
const expectedFocusTarget =
|
|
863
|
+
mode === 'uncontrolled'
|
|
864
|
+
? screen.getByRole( 'button', {
|
|
865
|
+
name: 'After ToggleGroupControl',
|
|
866
|
+
} )
|
|
867
|
+
: screen.getByRole( 'button', { name: 'Reset' } );
|
|
868
|
+
|
|
869
|
+
expect( expectedFocusTarget ).toHaveFocus();
|
|
870
|
+
} );
|
|
871
|
+
|
|
872
|
+
it( 'should not call onChange when a deselectable disabled control is clicked', async () => {
|
|
873
|
+
const mockOnChange = vi.fn();
|
|
874
|
+
|
|
875
|
+
render(
|
|
876
|
+
<Component
|
|
877
|
+
value="rigas"
|
|
878
|
+
label="Test"
|
|
879
|
+
onChange={ mockOnChange }
|
|
880
|
+
isDeselectable
|
|
881
|
+
disabled
|
|
882
|
+
>
|
|
883
|
+
{ options }
|
|
884
|
+
</Component>
|
|
885
|
+
);
|
|
886
|
+
|
|
887
|
+
await click(
|
|
888
|
+
screen.getByRole( 'button', {
|
|
889
|
+
name: 'R',
|
|
890
|
+
pressed: true,
|
|
891
|
+
} )
|
|
892
|
+
);
|
|
893
|
+
await click(
|
|
894
|
+
screen.getByRole( 'button', {
|
|
895
|
+
name: 'J',
|
|
896
|
+
pressed: false,
|
|
897
|
+
} )
|
|
898
|
+
);
|
|
899
|
+
|
|
900
|
+
expect( mockOnChange ).not.toHaveBeenCalled();
|
|
901
|
+
} );
|
|
902
|
+
} );
|
|
629
903
|
} );
|
|
630
904
|
|
|
631
905
|
test( 'should render block styles without Emotion-generated classes', () => {
|
|
@@ -18,11 +18,7 @@ import {
|
|
|
18
18
|
|
|
19
19
|
function Example() {
|
|
20
20
|
return (
|
|
21
|
-
<ToggleGroupControl
|
|
22
|
-
label="my label"
|
|
23
|
-
value="vertical"
|
|
24
|
-
isBlock
|
|
25
|
-
>
|
|
21
|
+
<ToggleGroupControl label="my label" value="vertical" isBlock>
|
|
26
22
|
<ToggleGroupControlOption value="horizontal" label="Horizontal" />
|
|
27
23
|
<ToggleGroupControlOption value="vertical" label="Vertical" />
|
|
28
24
|
</ToggleGroupControl>
|
|
@@ -84,3 +80,10 @@ Callback when a segment is selected.
|
|
|
84
80
|
The value of the `ToggleGroupControl`.
|
|
85
81
|
|
|
86
82
|
- Required: No
|
|
83
|
+
|
|
84
|
+
### `disabled`: `boolean`
|
|
85
|
+
|
|
86
|
+
If true, every option is unselectable. The selected value is left as-is.
|
|
87
|
+
|
|
88
|
+
- Required: No
|
|
89
|
+
- Default: `false`
|