@wordpress/components 25.14.0 → 25.15.1-next.79a6196f.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 +51 -0
- package/CONTRIBUTING.md +57 -115
- package/LICENSE.md +1 -1
- package/build/base-control/index.js +17 -13
- package/build/base-control/index.js.map +1 -1
- package/build/border-box-control/border-box-control-linked-button/component.js +1 -1
- package/build/border-box-control/border-box-control-linked-button/component.js.map +1 -1
- package/build/border-control/border-control-style-picker/component.js +1 -1
- package/build/border-control/border-control-style-picker/component.js.map +1 -1
- package/build/box-control/index.js +1 -1
- package/build/box-control/index.js.map +1 -1
- package/build/box-control/linked-button.js +1 -1
- package/build/box-control/linked-button.js.map +1 -1
- package/build/button/index.js +1 -1
- package/build/button/index.js.map +1 -1
- package/build/color-palette/index.native.js +11 -7
- package/build/color-palette/index.native.js.map +1 -1
- package/build/color-picker/color-copy-button.js +1 -1
- package/build/color-picker/color-copy-button.js.map +1 -1
- package/build/context/wordpress-component.js.map +1 -1
- package/build/custom-select-control-v2/index.js +11 -10
- package/build/custom-select-control-v2/index.js.map +1 -1
- package/build/date-time/date/styles.js +8 -8
- package/build/date-time/date/styles.js.map +1 -1
- package/build/dropdown-menu-v2/index.js +205 -159
- package/build/dropdown-menu-v2/index.js.map +1 -1
- package/build/dropdown-menu-v2/styles.js +86 -77
- package/build/dropdown-menu-v2/styles.js.map +1 -1
- package/build/dropdown-menu-v2/types.js.map +1 -1
- package/build/duotone-picker/duotone-picker.js +4 -3
- package/build/duotone-picker/duotone-picker.js.map +1 -1
- package/build/font-size-picker/index.js +4 -2
- package/build/font-size-picker/index.js.map +1 -1
- package/build/font-size-picker/index.native.js +6 -3
- package/build/font-size-picker/index.native.js.map +1 -1
- package/build/form-token-field/index.js +10 -5
- package/build/form-token-field/index.js.map +1 -1
- package/build/form-token-field/token.js +1 -0
- package/build/form-token-field/token.js.map +1 -1
- package/build/gradient-picker/index.js +3 -2
- package/build/gradient-picker/index.js.map +1 -1
- package/build/index.native.js +20 -3
- package/build/index.native.js.map +1 -1
- package/build/input-control/styles/input-control-styles.js +32 -29
- package/build/input-control/styles/input-control-styles.js.map +1 -1
- package/build/input-control/types.js.map +1 -1
- package/build/lock-unlock.js +18 -0
- package/build/lock-unlock.js.map +1 -0
- package/build/mobile/bottom-sheet/index.native.js +8 -0
- package/build/mobile/bottom-sheet/index.native.js.map +1 -1
- package/build/mobile/color-settings/palette.screen.native.js +8 -4
- package/build/mobile/color-settings/palette.screen.native.js.map +1 -1
- package/build/mobile/global-styles-context/utils.native.js +26 -13
- package/build/mobile/global-styles-context/utils.native.js.map +1 -1
- package/build/mobile/image/constants.js +12 -0
- package/build/mobile/image/constants.js.map +1 -0
- package/build/mobile/image/index.native.js +26 -18
- package/build/mobile/image/index.native.js.map +1 -1
- package/build/mobile/keyboard-aware-flat-list/index.android.js +40 -8
- package/build/mobile/keyboard-aware-flat-list/index.android.js.map +1 -1
- package/build/mobile/keyboard-aware-flat-list/index.ios.js +44 -68
- package/build/mobile/keyboard-aware-flat-list/index.ios.js.map +1 -1
- package/build/mobile/keyboard-aware-flat-list/use-scroll-to-element.native.js +39 -0
- package/build/mobile/keyboard-aware-flat-list/use-scroll-to-element.native.js.map +1 -0
- package/build/mobile/keyboard-aware-flat-list/{use-scroll-to-text-input.native.js → use-scroll-to-section.native.js} +22 -29
- package/build/mobile/keyboard-aware-flat-list/use-scroll-to-section.native.js.map +1 -0
- package/build/mobile/keyboard-aware-flat-list/use-scroll.native.js +93 -0
- package/build/mobile/keyboard-aware-flat-list/use-scroll.native.js.map +1 -0
- package/build/mobile/utils/get-px-from-css-unit.native.js +302 -0
- package/build/mobile/utils/get-px-from-css-unit.native.js.map +1 -0
- package/build/modal/index.js +18 -13
- package/build/modal/index.js.map +1 -1
- package/build/navigation/menu/menu-title.js +1 -1
- package/build/navigation/menu/menu-title.js.map +1 -1
- package/build/navigator/navigator-provider/component.js +13 -15
- package/build/navigator/navigator-provider/component.js.map +1 -1
- package/build/navigator/navigator-screen/component.js +23 -63
- package/build/navigator/navigator-screen/component.js.map +1 -1
- package/build/navigator/styles.js +52 -0
- package/build/navigator/styles.js.map +1 -0
- package/build/number-control/index.js +4 -8
- package/build/number-control/index.js.map +1 -1
- package/build/number-control/types.js.map +1 -1
- package/build/palette-edit/index.js +15 -54
- package/build/palette-edit/index.js.map +1 -1
- package/build/private-apis.js +11 -26
- package/build/private-apis.js.map +1 -1
- package/build/private-apis.native.js +21 -0
- package/build/private-apis.native.js.map +1 -0
- package/build/radio-control/index.js +1 -0
- package/build/radio-control/index.js.map +1 -1
- package/build/range-control/index.js +1 -1
- package/build/range-control/index.js.map +1 -1
- package/build/select-control/styles/select-control-styles.js +15 -25
- package/build/select-control/styles/select-control-styles.js.map +1 -1
- package/build/slot-fill/index.js +3 -2
- package/build/slot-fill/index.js.map +1 -1
- package/build/slot-fill/types.js.map +1 -1
- package/build/snackbar/types.js.map +1 -1
- package/build/tabs/styles.js +3 -3
- package/build/tabs/styles.js.map +1 -1
- package/build/tabs/tabpanel.js +9 -7
- package/build/tabs/tabpanel.js.map +1 -1
- package/build/toggle-group-control/toggle-group-control/component.js +4 -4
- package/build/toggle-group-control/toggle-group-control/component.js.map +1 -1
- package/build/toggle-group-control/toggle-group-control/styles.js +29 -15
- package/build/toggle-group-control/toggle-group-control/styles.js.map +1 -1
- package/build/toggle-group-control/toggle-group-control-option-base/styles.js +9 -9
- package/build/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -1
- package/build/tools-panel/tools-panel/component.js +3 -1
- package/build/tools-panel/tools-panel/component.js.map +1 -1
- package/build/tools-panel/tools-panel-header/component.js +9 -8
- package/build/tools-panel/tools-panel-header/component.js.map +1 -1
- package/build/tools-panel/types.js.map +1 -1
- package/build/tooltip/index.js +34 -10
- package/build/tooltip/index.js.map +1 -1
- package/build/tooltip/types.js.map +1 -1
- package/build/truncate/hook.js +10 -4
- package/build/truncate/hook.js.map +1 -1
- package/build/truncate/types.js.map +1 -1
- package/build/unit-control/index.js +1 -1
- package/build/unit-control/index.js.map +1 -1
- package/build/utils/strings.js +34 -3
- package/build/utils/strings.js.map +1 -1
- package/build-module/base-control/index.js +16 -12
- package/build-module/base-control/index.js.map +1 -1
- package/build-module/border-box-control/border-box-control-linked-button/component.js +1 -1
- package/build-module/border-box-control/border-box-control-linked-button/component.js.map +1 -1
- package/build-module/border-control/border-control-style-picker/component.js +1 -1
- package/build-module/border-control/border-control-style-picker/component.js.map +1 -1
- package/build-module/box-control/index.js +1 -1
- package/build-module/box-control/index.js.map +1 -1
- package/build-module/box-control/linked-button.js +1 -1
- package/build-module/box-control/linked-button.js.map +1 -1
- package/build-module/button/index.js +1 -1
- package/build-module/button/index.js.map +1 -1
- package/build-module/color-palette/index.native.js +11 -7
- package/build-module/color-palette/index.native.js.map +1 -1
- package/build-module/color-picker/color-copy-button.js +1 -1
- package/build-module/color-picker/color-copy-button.js.map +1 -1
- package/build-module/context/wordpress-component.js.map +1 -1
- package/build-module/custom-select-control-v2/index.js +11 -10
- package/build-module/custom-select-control-v2/index.js.map +1 -1
- package/build-module/date-time/date/styles.js +8 -8
- package/build-module/date-time/date/styles.js.map +1 -1
- package/build-module/dropdown-menu-v2/index.js +201 -154
- package/build-module/dropdown-menu-v2/index.js.map +1 -1
- package/build-module/dropdown-menu-v2/styles.js +68 -61
- package/build-module/dropdown-menu-v2/styles.js.map +1 -1
- package/build-module/dropdown-menu-v2/types.js.map +1 -1
- package/build-module/duotone-picker/duotone-picker.js +4 -3
- package/build-module/duotone-picker/duotone-picker.js.map +1 -1
- package/build-module/font-size-picker/index.js +4 -2
- package/build-module/font-size-picker/index.js.map +1 -1
- package/build-module/font-size-picker/index.native.js +5 -2
- package/build-module/font-size-picker/index.native.js.map +1 -1
- package/build-module/form-token-field/index.js +10 -5
- package/build-module/form-token-field/index.js.map +1 -1
- package/build-module/form-token-field/token.js +1 -0
- package/build-module/form-token-field/token.js.map +1 -1
- package/build-module/gradient-picker/index.js +3 -2
- package/build-module/gradient-picker/index.js.map +1 -1
- package/build-module/index.native.js +6 -1
- package/build-module/index.native.js.map +1 -1
- package/build-module/input-control/styles/input-control-styles.js +31 -29
- package/build-module/input-control/styles/input-control-styles.js.map +1 -1
- package/build-module/input-control/types.js.map +1 -1
- package/build-module/lock-unlock.js +9 -0
- package/build-module/lock-unlock.js.map +1 -0
- package/build-module/mobile/bottom-sheet/index.native.js +9 -1
- package/build-module/mobile/bottom-sheet/index.native.js.map +1 -1
- package/build-module/mobile/color-settings/palette.screen.native.js +8 -4
- package/build-module/mobile/color-settings/palette.screen.native.js.map +1 -1
- package/build-module/mobile/global-styles-context/utils.native.js +25 -13
- package/build-module/mobile/global-styles-context/utils.native.js.map +1 -1
- package/build-module/mobile/image/constants.js +5 -0
- package/build-module/mobile/image/constants.js.map +1 -0
- package/build-module/mobile/image/index.native.js +25 -16
- package/build-module/mobile/image/index.native.js.map +1 -1
- package/build-module/mobile/keyboard-aware-flat-list/index.android.js +40 -6
- package/build-module/mobile/keyboard-aware-flat-list/index.android.js.map +1 -1
- package/build-module/mobile/keyboard-aware-flat-list/index.ios.js +46 -68
- package/build-module/mobile/keyboard-aware-flat-list/index.ios.js.map +1 -1
- package/build-module/mobile/keyboard-aware-flat-list/use-scroll-to-element.native.js +33 -0
- package/build-module/mobile/keyboard-aware-flat-list/use-scroll-to-element.native.js.map +1 -0
- package/build-module/mobile/keyboard-aware-flat-list/{use-scroll-to-text-input.native.js → use-scroll-to-section.native.js} +21 -27
- package/build-module/mobile/keyboard-aware-flat-list/use-scroll-to-section.native.js.map +1 -0
- package/build-module/mobile/keyboard-aware-flat-list/use-scroll.native.js +86 -0
- package/build-module/mobile/keyboard-aware-flat-list/use-scroll.native.js.map +1 -0
- package/build-module/mobile/utils/get-px-from-css-unit.native.js +294 -0
- package/build-module/mobile/utils/get-px-from-css-unit.native.js.map +1 -0
- package/build-module/modal/index.js +18 -13
- package/build-module/modal/index.js.map +1 -1
- package/build-module/navigation/menu/menu-title.js +1 -1
- package/build-module/navigation/menu/menu-title.js.map +1 -1
- package/build-module/navigator/navigator-provider/component.js +3 -16
- package/build-module/navigator/navigator-provider/component.js.map +1 -1
- package/build-module/navigator/navigator-screen/component.js +16 -70
- package/build-module/navigator/navigator-screen/component.js.map +1 -1
- package/build-module/navigator/styles.js +47 -0
- package/build-module/navigator/styles.js.map +1 -0
- package/build-module/number-control/index.js +4 -8
- package/build-module/number-control/index.js.map +1 -1
- package/build-module/number-control/types.js.map +1 -1
- package/build-module/palette-edit/index.js +15 -51
- package/build-module/palette-edit/index.js.map +1 -1
- package/build-module/private-apis.js +10 -23
- package/build-module/private-apis.js.map +1 -1
- package/build-module/private-apis.native.js +14 -0
- package/build-module/private-apis.native.js.map +1 -0
- package/build-module/radio-control/index.js +1 -0
- package/build-module/radio-control/index.js.map +1 -1
- package/build-module/range-control/index.js +1 -1
- package/build-module/range-control/index.js.map +1 -1
- package/build-module/select-control/styles/select-control-styles.js +15 -25
- package/build-module/select-control/styles/select-control-styles.js.map +1 -1
- package/build-module/slot-fill/index.js +3 -2
- package/build-module/slot-fill/index.js.map +1 -1
- package/build-module/slot-fill/types.js.map +1 -1
- package/build-module/snackbar/types.js.map +1 -1
- package/build-module/tabs/styles.js +3 -3
- package/build-module/tabs/styles.js.map +1 -1
- package/build-module/tabs/tabpanel.js +9 -7
- package/build-module/tabs/tabpanel.js.map +1 -1
- package/build-module/toggle-group-control/toggle-group-control/component.js +4 -4
- package/build-module/toggle-group-control/toggle-group-control/component.js.map +1 -1
- package/build-module/toggle-group-control/toggle-group-control/styles.js +29 -15
- package/build-module/toggle-group-control/toggle-group-control/styles.js.map +1 -1
- package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js +9 -9
- package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -1
- package/build-module/tools-panel/tools-panel/component.js +3 -1
- package/build-module/tools-panel/tools-panel/component.js.map +1 -1
- package/build-module/tools-panel/tools-panel-header/component.js +9 -8
- package/build-module/tools-panel/tools-panel-header/component.js.map +1 -1
- package/build-module/tools-panel/types.js.map +1 -1
- package/build-module/tooltip/index.js +34 -12
- package/build-module/tooltip/index.js.map +1 -1
- package/build-module/tooltip/types.js.map +1 -1
- package/build-module/truncate/hook.js +10 -4
- package/build-module/truncate/hook.js.map +1 -1
- package/build-module/truncate/types.js.map +1 -1
- package/build-module/unit-control/index.js +1 -1
- package/build-module/unit-control/index.js.map +1 -1
- package/build-module/utils/strings.js +32 -2
- package/build-module/utils/strings.js.map +1 -1
- package/build-style/style-rtl.css +29 -5
- package/build-style/style.css +29 -5
- package/build-types/base-control/index.d.ts +3 -27
- package/build-types/base-control/index.d.ts.map +1 -1
- package/build-types/base-control/stories/index.story.d.ts +4 -1
- package/build-types/base-control/stories/index.story.d.ts.map +1 -1
- package/build-types/border-box-control/border-box-control/hook.d.ts +4 -4
- package/build-types/border-box-control/border-box-control-linked-button/hook.d.ts +6 -6
- package/build-types/border-box-control/border-box-control-split-controls/hook.d.ts +4 -4
- package/build-types/border-box-control/border-box-control-visualizer/hook.d.ts +4 -4
- package/build-types/border-box-control/stories/index.story.d.ts +1 -1
- package/build-types/border-control/border-control/hook.d.ts +4 -4
- package/build-types/border-control/border-control-dropdown/hook.d.ts +4 -4
- package/build-types/border-control/border-control-style-picker/hook.d.ts +4 -4
- package/build-types/border-control/stories/index.story.d.ts +6 -6
- package/build-types/box-control/stories/index.story.d.ts +42 -42
- package/build-types/box-control/styles/box-control-styles.d.ts +1 -1
- package/build-types/button/deprecated.d.ts +3 -3
- package/build-types/card/card/hook.d.ts +4 -4
- package/build-types/card/card-body/hook.d.ts +4 -4
- package/build-types/card/card-divider/hook.d.ts +4 -4
- package/build-types/card/card-footer/hook.d.ts +4 -4
- package/build-types/card/card-header/hook.d.ts +4 -4
- package/build-types/card/card-media/hook.d.ts +4 -4
- package/build-types/color-palette/styles.d.ts +2 -2
- package/build-types/color-picker/component.d.ts +2 -2
- package/build-types/color-picker/stories/index.story.d.ts +1 -1
- package/build-types/color-picker/stories/index.story.d.ts.map +1 -1
- package/build-types/color-picker/styles.d.ts +3 -3
- package/build-types/composite/test/index.d.ts.map +1 -0
- package/build-types/context/wordpress-component.d.ts +3 -3
- package/build-types/context/wordpress-component.d.ts.map +1 -1
- package/build-types/custom-select-control-v2/index.d.ts +3 -2
- package/build-types/custom-select-control-v2/index.d.ts.map +1 -1
- package/build-types/custom-select-control-v2/stories/index.story.d.ts +4 -3
- package/build-types/custom-select-control-v2/stories/index.story.d.ts.map +1 -1
- package/build-types/date-time/date/styles.d.ts +3 -3
- package/build-types/date-time/date-time/styles.d.ts +1 -1
- package/build-types/date-time/time/styles.d.ts +4 -4
- package/build-types/dropdown/index.d.ts +1 -1
- package/build-types/dropdown/index.d.ts.map +1 -1
- package/build-types/dropdown/stories/index.story.d.ts +3 -3
- package/build-types/dropdown/stories/index.story.d.ts.map +1 -1
- package/build-types/dropdown-menu/index.d.ts +1 -1
- package/build-types/dropdown-menu/index.d.ts.map +1 -1
- package/build-types/dropdown-menu/stories/index.story.d.ts +2 -2
- package/build-types/dropdown-menu/stories/index.story.d.ts.map +1 -1
- package/build-types/dropdown-menu-v2/index.d.ts +18 -15
- package/build-types/dropdown-menu-v2/index.d.ts.map +1 -1
- package/build-types/dropdown-menu-v2/stories/index.story.d.ts +7 -2
- package/build-types/dropdown-menu-v2/stories/index.story.d.ts.map +1 -1
- package/build-types/dropdown-menu-v2/styles.d.ts +77 -23
- package/build-types/dropdown-menu-v2/styles.d.ts.map +1 -1
- package/build-types/dropdown-menu-v2/types.d.ts +89 -173
- package/build-types/dropdown-menu-v2/types.d.ts.map +1 -1
- package/build-types/duotone-picker/duotone-picker.d.ts.map +1 -1
- package/build-types/elevation/hook.d.ts +4 -4
- package/build-types/flex/flex/hook.d.ts +4 -4
- package/build-types/flex/flex-block/hook.d.ts +4 -4
- package/build-types/flex/flex-item/hook.d.ts +4 -4
- package/build-types/focal-point-picker/stories/index.story.d.ts +4 -4
- package/build-types/focal-point-picker/styles/focal-point-picker-style.d.ts +1 -1
- package/build-types/font-size-picker/index.d.ts.map +1 -1
- package/build-types/font-size-picker/styles.d.ts +1 -1
- package/build-types/form-token-field/index.d.ts.map +1 -1
- package/build-types/form-token-field/token.d.ts.map +1 -1
- package/build-types/grid/hook.d.ts +4 -4
- package/build-types/h-stack/hook.d.ts +4 -4
- package/build-types/heading/component.d.ts +1 -1
- package/build-types/heading/hook.d.ts +4 -4
- package/build-types/input-control/styles/input-control-styles.d.ts +11 -0
- package/build-types/input-control/styles/input-control-styles.d.ts.map +1 -1
- package/build-types/input-control/types.d.ts +1 -1
- package/build-types/input-control/types.d.ts.map +1 -1
- package/build-types/item-group/item/hook.d.ts +4 -4
- package/build-types/item-group/item-group/hook.d.ts +4 -4
- package/build-types/lock-unlock.d.ts +3 -0
- package/build-types/lock-unlock.d.ts.map +1 -0
- package/build-types/menu-item/index.d.ts +1 -1
- package/build-types/menu-item/stories/index.story.d.ts +4 -4
- package/build-types/mobile/image/constants.d.ts +5 -0
- package/build-types/mobile/image/constants.d.ts.map +1 -0
- package/build-types/modal/index.d.ts.map +1 -1
- package/build-types/navigation/styles/navigation-styles.d.ts +3 -3
- package/build-types/navigator/navigator-back-button/hook.d.ts +6 -6
- package/build-types/navigator/navigator-button/hook.d.ts +6 -6
- package/build-types/navigator/navigator-provider/component.d.ts.map +1 -1
- package/build-types/navigator/navigator-screen/component.d.ts +1 -7
- package/build-types/navigator/navigator-screen/component.d.ts.map +1 -1
- package/build-types/navigator/styles.d.ts +9 -0
- package/build-types/navigator/styles.d.ts.map +1 -0
- package/build-types/number-control/index.d.ts +1 -1
- package/build-types/number-control/index.d.ts.map +1 -1
- package/build-types/number-control/stories/index.story.d.ts +1 -1
- package/build-types/number-control/types.d.ts +1 -1
- package/build-types/palette-edit/index.d.ts +3 -8
- package/build-types/palette-edit/index.d.ts.map +1 -1
- package/build-types/palette-edit/styles.d.ts +3 -3
- package/build-types/popover/index.d.ts +1 -1
- package/build-types/popover/index.d.ts.map +1 -1
- package/build-types/popover/stories/e2e/index.story.d.ts +1 -1
- package/build-types/private-apis.d.ts +0 -1
- package/build-types/private-apis.d.ts.map +1 -1
- package/build-types/radio-control/index.d.ts.map +1 -1
- package/build-types/range-control/index.d.ts +1 -1
- package/build-types/range-control/styles/range-control-styles.d.ts +1 -1
- package/build-types/resizable-box/index.d.ts +1 -1
- package/build-types/resizable-box/resize-tooltip/index.d.ts +1 -1
- package/build-types/resizable-box/stories/index.story.d.ts +2 -2
- package/build-types/scrollable/hook.d.ts +4 -4
- package/build-types/search-control/index.d.ts +1 -1
- package/build-types/search-control/stories/index.story.d.ts +2 -2
- package/build-types/select-control/styles/select-control-styles.d.ts.map +1 -1
- package/build-types/slot-fill/index.d.ts +1 -1
- package/build-types/slot-fill/index.d.ts.map +1 -1
- package/build-types/slot-fill/types.d.ts +4 -0
- package/build-types/slot-fill/types.d.ts.map +1 -1
- package/build-types/snackbar/index.d.ts +2 -2
- package/build-types/snackbar/stories/index.story.d.ts +0 -3
- package/build-types/snackbar/stories/index.story.d.ts.map +1 -1
- package/build-types/snackbar/types.d.ts +1 -1
- package/build-types/snackbar/types.d.ts.map +1 -1
- package/build-types/spacer/hook.d.ts +4 -4
- package/build-types/surface/hook.d.ts +4 -4
- package/build-types/tabs/styles.d.ts.map +1 -1
- package/build-types/tabs/tabpanel.d.ts +1 -1
- package/build-types/tabs/tabpanel.d.ts.map +1 -1
- package/build-types/text/hook.d.ts +4 -4
- package/build-types/text-control/index.d.ts +1 -1
- package/build-types/textarea-control/index.d.ts +1 -1
- package/build-types/toggle-control/stories/index.story.d.ts +2 -2
- 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-radio-group.d.ts +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/styles.d.ts +2 -2
- package/build-types/toggle-group-control/toggle-group-control/styles.d.ts.map +1 -1
- package/build-types/toggle-group-control/toggle-group-control-option/component.d.ts +1 -1
- package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts +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-base/styles.d.ts.map +1 -1
- package/build-types/toggle-group-control/toggle-group-control-option-icon/component.d.ts +1 -1
- package/build-types/toolbar/toolbar-button/index.d.ts +3 -3
- package/build-types/tools-panel/tools-panel/component.d.ts.map +1 -1
- package/build-types/tools-panel/tools-panel/hook.d.ts +5 -4
- package/build-types/tools-panel/tools-panel/hook.d.ts.map +1 -1
- package/build-types/tools-panel/tools-panel-header/component.d.ts.map +1 -1
- package/build-types/tools-panel/tools-panel-header/hook.d.ts +5 -4
- package/build-types/tools-panel/tools-panel-header/hook.d.ts.map +1 -1
- package/build-types/tools-panel/tools-panel-item/hook.d.ts +4 -4
- package/build-types/tools-panel/types.d.ts +9 -0
- package/build-types/tools-panel/types.d.ts.map +1 -1
- package/build-types/tooltip/index.d.ts +1 -1
- package/build-types/tooltip/index.d.ts.map +1 -1
- package/build-types/tooltip/stories/index.story.d.ts +10 -1
- package/build-types/tooltip/stories/index.story.d.ts.map +1 -1
- package/build-types/tooltip/types.d.ts +3 -0
- package/build-types/tooltip/types.d.ts.map +1 -1
- package/build-types/truncate/hook.d.ts +5 -5
- package/build-types/truncate/hook.d.ts.map +1 -1
- package/build-types/truncate/types.d.ts +4 -0
- package/build-types/truncate/types.d.ts.map +1 -1
- package/build-types/unit-control/index.d.ts +1 -1
- package/build-types/unit-control/styles/unit-control-styles.d.ts +1 -1
- package/build-types/utils/strings.d.ts +14 -2
- package/build-types/utils/strings.d.ts.map +1 -1
- package/build-types/v-stack/hook.d.ts +4 -4
- package/build-types/v-stack/stories/index.story.d.ts +1 -1
- package/package.json +20 -21
- package/src/alignment-matrix-control/test/index.tsx +10 -16
- package/src/base-control/index.tsx +21 -16
- package/src/border-box-control/border-box-control-linked-button/component.tsx +1 -1
- package/src/border-control/border-control-style-picker/component.tsx +1 -1
- package/src/box-control/index.tsx +1 -1
- package/src/box-control/linked-button.tsx +1 -1
- package/src/button/README.md +32 -6
- package/src/button/index.tsx +1 -1
- package/src/button-group/README.md +0 -6
- package/src/card/card/README.md +1 -1
- package/src/checkbox-control/README.md +1 -9
- package/src/color-palette/index.native.js +18 -7
- package/src/color-picker/color-copy-button.tsx +1 -1
- package/src/combobox-control/README.md +0 -6
- package/src/composite/test/index.tsx +576 -0
- package/src/context/wordpress-component.ts +11 -6
- package/src/custom-select-control/README.md +0 -6
- package/src/custom-select-control-v2/index.tsx +13 -12
- package/src/date-time/date/styles.ts +3 -3
- package/src/dropdown-menu/README.md +0 -5
- package/src/dropdown-menu-v2/README.md +75 -136
- package/src/dropdown-menu-v2/index.tsx +321 -231
- package/src/dropdown-menu-v2/stories/index.story.tsx +522 -126
- package/src/dropdown-menu-v2/styles.ts +226 -151
- package/src/dropdown-menu-v2/test/index.tsx +480 -188
- package/src/dropdown-menu-v2/types.ts +98 -184
- package/src/duotone-picker/duotone-picker.tsx +7 -3
- package/src/font-size-picker/index.native.js +8 -2
- package/src/font-size-picker/index.tsx +4 -2
- package/src/form-toggle/README.md +0 -6
- package/src/form-token-field/index.tsx +11 -7
- package/src/form-token-field/test/index.tsx +97 -0
- package/src/form-token-field/token.tsx +1 -0
- package/src/gradient-picker/index.tsx +2 -2
- package/src/index.native.js +6 -1
- package/src/input-control/styles/input-control-styles.tsx +10 -8
- package/src/input-control/types.ts +1 -1
- package/src/lock-unlock.js +10 -0
- package/src/menu-group/README.md +0 -8
- package/src/menu-items-choice/README.md +0 -7
- package/src/mobile/bottom-sheet/index.native.js +15 -1
- package/src/mobile/color-settings/palette.screen.native.js +7 -5
- package/src/mobile/global-styles-context/test/fixtures/theme.native.js +0 -20
- package/src/mobile/global-styles-context/utils.native.js +28 -19
- package/src/mobile/image/constants.js +1 -0
- package/src/mobile/image/index.native.js +55 -18
- package/src/mobile/image/style.native.scss +35 -9
- package/src/mobile/keyboard-aware-flat-list/index.android.js +50 -5
- package/src/mobile/keyboard-aware-flat-list/index.ios.js +65 -91
- package/src/mobile/keyboard-aware-flat-list/test/{use-scroll-to-text-input.native.js → use-scroll-to-section.native.js} +27 -25
- package/src/mobile/keyboard-aware-flat-list/test/use-scroll.native.js +71 -0
- package/src/mobile/keyboard-aware-flat-list/use-scroll-to-element.native.js +41 -0
- package/src/mobile/keyboard-aware-flat-list/{use-scroll-to-text-input.native.js → use-scroll-to-section.native.js} +22 -27
- package/src/mobile/keyboard-aware-flat-list/use-scroll.native.js +100 -0
- package/src/mobile/utils/get-px-from-css-unit.native.js +329 -0
- package/src/mobile/utils/test/get-px-from-css-unit.native.js +172 -0
- package/src/modal/README.md +0 -6
- package/src/modal/index.tsx +18 -16
- package/src/modal/test/index.tsx +90 -1
- package/src/navigation/menu/menu-title.tsx +1 -1
- package/src/navigator/navigator-provider/component.tsx +3 -4
- package/src/navigator/navigator-screen/component.tsx +15 -93
- package/src/navigator/styles.ts +71 -0
- package/src/navigator/test/index.tsx +0 -64
- package/src/notice/README.md +0 -6
- package/src/number-control/README.md +2 -2
- package/src/number-control/index.tsx +4 -8
- package/src/number-control/types.ts +1 -1
- package/src/palette-edit/index.tsx +15 -58
- package/src/palette-edit/test/index.tsx +1 -75
- package/src/panel/README.md +0 -6
- package/src/private-apis.native.js +13 -0
- package/src/private-apis.ts +12 -37
- package/src/radio-control/README.md +0 -6
- package/src/radio-control/index.tsx +4 -1
- package/src/radio-control/style.scss +29 -2
- package/src/radio-group/README.md +0 -6
- package/src/range-control/README.md +1 -9
- package/src/range-control/index.tsx +1 -1
- package/src/search-control/README.md +0 -6
- package/src/select-control/README.md +0 -6
- package/src/select-control/styles/select-control-styles.ts +10 -28
- package/src/slot-fill/index.tsx +5 -2
- package/src/slot-fill/types.ts +5 -0
- package/src/snackbar/README.md +0 -6
- package/src/snackbar/stories/index.story.tsx +7 -5
- package/src/snackbar/style.scss +4 -3
- package/src/snackbar/types.ts +2 -1
- package/src/spacer/README.md +0 -2
- package/src/tab-panel/README.md +0 -5
- package/src/tab-panel/test/index.tsx +39 -56
- package/src/tabs/styles.ts +7 -1
- package/src/tabs/tabpanel.tsx +7 -6
- package/src/tabs/test/index.tsx +56 -0
- package/src/text-control/README.md +0 -6
- package/src/textarea-control/README.md +0 -6
- package/src/toggle-group-control/test/__snapshots__/index.tsx.snap +12 -16
- package/src/toggle-group-control/test/index.tsx +58 -45
- package/src/toggle-group-control/toggle-group-control/component.tsx +5 -4
- package/src/toggle-group-control/toggle-group-control/styles.ts +13 -19
- package/src/toggle-group-control/toggle-group-control-option/README.md +1 -1
- package/src/toggle-group-control/toggle-group-control-option-base/README.md +1 -1
- package/src/toggle-group-control/toggle-group-control-option-base/styles.ts +3 -2
- package/src/toggle-group-control/toggle-group-control-option-icon/README.md +1 -1
- package/src/toolbar/toolbar/README.md +0 -6
- package/src/tools-panel/test/index.tsx +12 -20
- package/src/tools-panel/tools-panel/README.md +7 -0
- package/src/tools-panel/tools-panel/component.tsx +2 -0
- package/src/tools-panel/tools-panel-header/README.md +7 -0
- package/src/tools-panel/tools-panel-header/component.tsx +20 -13
- package/src/tools-panel/types.ts +9 -0
- package/src/tooltip/README.md +4 -0
- package/src/tooltip/index.tsx +48 -10
- package/src/tooltip/stories/index.story.tsx +18 -1
- package/src/tooltip/test/index.tsx +404 -254
- package/src/tooltip/types.ts +4 -0
- package/src/tree-grid/README.md +0 -4
- package/src/truncate/README.md +8 -0
- package/src/truncate/hook.ts +17 -10
- package/src/truncate/test/index.tsx +54 -27
- package/src/truncate/types.ts +4 -0
- package/src/unit-control/index.tsx +1 -1
- package/src/utils/strings.ts +30 -2
- package/src/utils/test/strings.js +96 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/build/dropdown-menu-v2-ariakit/index.js +0 -256
- package/build/dropdown-menu-v2-ariakit/index.js.map +0 -1
- package/build/dropdown-menu-v2-ariakit/styles.js +0 -180
- package/build/dropdown-menu-v2-ariakit/styles.js.map +0 -1
- package/build/dropdown-menu-v2-ariakit/types.js +0 -6
- package/build/dropdown-menu-v2-ariakit/types.js.map +0 -1
- package/build/mobile/keyboard-aware-flat-list/use-scroll-to-text-input.native.js.map +0 -1
- package/build-module/dropdown-menu-v2-ariakit/index.js +0 -237
- package/build-module/dropdown-menu-v2-ariakit/index.js.map +0 -1
- package/build-module/dropdown-menu-v2-ariakit/styles.js +0 -165
- package/build-module/dropdown-menu-v2-ariakit/styles.js.map +0 -1
- package/build-module/dropdown-menu-v2-ariakit/types.js +0 -2
- package/build-module/dropdown-menu-v2-ariakit/types.js.map +0 -1
- package/build-module/mobile/keyboard-aware-flat-list/use-scroll-to-text-input.native.js.map +0 -1
- package/build-types/dropdown-menu-v2-ariakit/index.d.ts +0 -20
- package/build-types/dropdown-menu-v2-ariakit/index.d.ts.map +0 -1
- package/build-types/dropdown-menu-v2-ariakit/stories/index.story.d.ts +0 -16
- package/build-types/dropdown-menu-v2-ariakit/stories/index.story.d.ts.map +0 -1
- package/build-types/dropdown-menu-v2-ariakit/styles.d.ts +0 -96
- package/build-types/dropdown-menu-v2-ariakit/styles.d.ts.map +0 -1
- package/build-types/dropdown-menu-v2-ariakit/test/index.d.ts.map +0 -1
- package/build-types/dropdown-menu-v2-ariakit/types.d.ts +0 -168
- package/build-types/dropdown-menu-v2-ariakit/types.d.ts.map +0 -1
- package/src/dropdown-menu-v2-ariakit/README.md +0 -331
- package/src/dropdown-menu-v2-ariakit/index.tsx +0 -383
- package/src/dropdown-menu-v2-ariakit/stories/index.story.tsx +0 -617
- package/src/dropdown-menu-v2-ariakit/styles.ts +0 -345
- package/src/dropdown-menu-v2-ariakit/test/index.tsx +0 -1108
- package/src/dropdown-menu-v2-ariakit/types.ts +0 -179
- /package/build-types/{dropdown-menu-v2-ariakit → composite}/test/index.d.ts +0 -0
|
@@ -1,1108 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* External dependencies
|
|
3
|
-
*/
|
|
4
|
-
import { render, screen, waitFor } from '@testing-library/react';
|
|
5
|
-
import { press, click, hover, type } from '@ariakit/test';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* WordPress dependencies
|
|
9
|
-
*/
|
|
10
|
-
import { useState } from '@wordpress/element';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Internal dependencies
|
|
14
|
-
*/
|
|
15
|
-
import {
|
|
16
|
-
DropdownMenu,
|
|
17
|
-
DropdownMenuCheckboxItem,
|
|
18
|
-
DropdownMenuItem,
|
|
19
|
-
DropdownMenuRadioItem,
|
|
20
|
-
DropdownMenuSeparator,
|
|
21
|
-
DropdownMenuGroup,
|
|
22
|
-
} from '..';
|
|
23
|
-
|
|
24
|
-
const delay = ( delayInMs: number ) => {
|
|
25
|
-
return new Promise( ( resolve ) => setTimeout( resolve, delayInMs ) );
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
describe( 'DropdownMenu', () => {
|
|
29
|
-
// See https://www.w3.org/WAI/ARIA/apg/patterns/menu-button/
|
|
30
|
-
it( 'should follow the WAI-ARIA spec', async () => {
|
|
31
|
-
render(
|
|
32
|
-
<DropdownMenu trigger={ <button>Open dropdown</button> }>
|
|
33
|
-
<DropdownMenuItem>Dropdown menu item</DropdownMenuItem>
|
|
34
|
-
<DropdownMenuSeparator />
|
|
35
|
-
<DropdownMenu
|
|
36
|
-
trigger={
|
|
37
|
-
<DropdownMenuItem>Dropdown submenu</DropdownMenuItem>
|
|
38
|
-
}
|
|
39
|
-
>
|
|
40
|
-
<DropdownMenuItem>Dropdown submenu item 1</DropdownMenuItem>
|
|
41
|
-
<DropdownMenuItem>Dropdown submenu item 2</DropdownMenuItem>
|
|
42
|
-
</DropdownMenu>
|
|
43
|
-
</DropdownMenu>
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
const toggleButton = screen.getByRole( 'button', {
|
|
47
|
-
name: 'Open dropdown',
|
|
48
|
-
} );
|
|
49
|
-
|
|
50
|
-
expect( toggleButton ).toHaveAttribute( 'aria-haspopup', 'menu' );
|
|
51
|
-
expect( toggleButton ).toHaveAttribute( 'aria-expanded', 'false' );
|
|
52
|
-
|
|
53
|
-
await click( toggleButton );
|
|
54
|
-
|
|
55
|
-
expect( toggleButton ).toHaveAttribute( 'aria-expanded', 'true' );
|
|
56
|
-
|
|
57
|
-
expect(
|
|
58
|
-
screen.getByRole( 'menu', { name: toggleButton.textContent ?? '' } )
|
|
59
|
-
).toHaveFocus();
|
|
60
|
-
expect( screen.getByRole( 'separator' ) ).toHaveAttribute(
|
|
61
|
-
'aria-orientation',
|
|
62
|
-
'horizontal'
|
|
63
|
-
);
|
|
64
|
-
expect( screen.getAllByRole( 'menuitem' ) ).toHaveLength( 2 );
|
|
65
|
-
|
|
66
|
-
const submenuTrigger = screen.getByRole( 'menuitem', {
|
|
67
|
-
name: 'Dropdown submenu',
|
|
68
|
-
} );
|
|
69
|
-
expect( submenuTrigger ).toHaveAttribute( 'aria-haspopup', 'menu' );
|
|
70
|
-
expect( submenuTrigger ).toHaveAttribute( 'aria-expanded', 'false' );
|
|
71
|
-
|
|
72
|
-
await hover( submenuTrigger );
|
|
73
|
-
|
|
74
|
-
// Wait for the open animation after hovering
|
|
75
|
-
await waitFor( () =>
|
|
76
|
-
expect(
|
|
77
|
-
screen.getByRole( 'menu', {
|
|
78
|
-
name: submenuTrigger.textContent ?? '',
|
|
79
|
-
} )
|
|
80
|
-
).toBeVisible()
|
|
81
|
-
);
|
|
82
|
-
|
|
83
|
-
expect( submenuTrigger ).toHaveAttribute( 'aria-expanded', 'true' );
|
|
84
|
-
expect( submenuTrigger ).toHaveAttribute(
|
|
85
|
-
'aria-controls',
|
|
86
|
-
screen.getAllByRole( 'menu' )[ 1 ].id
|
|
87
|
-
);
|
|
88
|
-
} );
|
|
89
|
-
|
|
90
|
-
describe( 'pointer and keyboard interactions', () => {
|
|
91
|
-
it( 'should open and focus the menu when clicking the trigger', async () => {
|
|
92
|
-
render(
|
|
93
|
-
<DropdownMenu trigger={ <button>Open dropdown</button> }>
|
|
94
|
-
<DropdownMenuItem>Dropdown menu item</DropdownMenuItem>
|
|
95
|
-
</DropdownMenu>
|
|
96
|
-
);
|
|
97
|
-
|
|
98
|
-
const toggleButton = screen.getByRole( 'button', {
|
|
99
|
-
name: 'Open dropdown',
|
|
100
|
-
} );
|
|
101
|
-
|
|
102
|
-
// DropdownMenu closed
|
|
103
|
-
expect( screen.queryByRole( 'menu' ) ).not.toBeInTheDocument();
|
|
104
|
-
|
|
105
|
-
// Click to open the menu
|
|
106
|
-
await click( toggleButton );
|
|
107
|
-
|
|
108
|
-
// DropdownMenu open, focus is on the menu wrapper
|
|
109
|
-
expect( screen.getByRole( 'menu' ) ).toHaveFocus();
|
|
110
|
-
} );
|
|
111
|
-
|
|
112
|
-
it( 'should open and focus the first item when pressing the arrow down key on the trigger', async () => {
|
|
113
|
-
render(
|
|
114
|
-
<DropdownMenu trigger={ <button>Open dropdown</button> }>
|
|
115
|
-
<DropdownMenuItem disabled>First item</DropdownMenuItem>
|
|
116
|
-
<DropdownMenuItem>Second item</DropdownMenuItem>
|
|
117
|
-
<DropdownMenuItem>Third item</DropdownMenuItem>
|
|
118
|
-
</DropdownMenu>
|
|
119
|
-
);
|
|
120
|
-
|
|
121
|
-
const toggleButton = screen.getByRole( 'button', {
|
|
122
|
-
name: 'Open dropdown',
|
|
123
|
-
} );
|
|
124
|
-
|
|
125
|
-
// Move focus on the toggle
|
|
126
|
-
await press.Tab();
|
|
127
|
-
|
|
128
|
-
expect( toggleButton ).toHaveFocus();
|
|
129
|
-
|
|
130
|
-
// DropdownMenu closed
|
|
131
|
-
expect( screen.queryByRole( 'menuitem' ) ).not.toBeInTheDocument();
|
|
132
|
-
|
|
133
|
-
await press.ArrowDown();
|
|
134
|
-
|
|
135
|
-
// DropdownMenu open, focus is on the first focusable item
|
|
136
|
-
// (disabled items are still focusable and accessible)
|
|
137
|
-
expect(
|
|
138
|
-
screen.getByRole( 'menuitem', { name: 'First item' } )
|
|
139
|
-
).toHaveFocus();
|
|
140
|
-
} );
|
|
141
|
-
|
|
142
|
-
it( 'should open and focus the first item when pressing the space key on the trigger', async () => {
|
|
143
|
-
render(
|
|
144
|
-
<DropdownMenu trigger={ <button>Open dropdown</button> }>
|
|
145
|
-
<DropdownMenuItem disabled>First item</DropdownMenuItem>
|
|
146
|
-
<DropdownMenuItem>Second item</DropdownMenuItem>
|
|
147
|
-
<DropdownMenuItem>Third item</DropdownMenuItem>
|
|
148
|
-
</DropdownMenu>
|
|
149
|
-
);
|
|
150
|
-
|
|
151
|
-
const toggleButton = screen.getByRole( 'button', {
|
|
152
|
-
name: 'Open dropdown',
|
|
153
|
-
} );
|
|
154
|
-
|
|
155
|
-
// Move focus on the toggle
|
|
156
|
-
await press.Tab();
|
|
157
|
-
|
|
158
|
-
expect( toggleButton ).toHaveFocus();
|
|
159
|
-
|
|
160
|
-
// DropdownMenu closed
|
|
161
|
-
expect( screen.queryByRole( 'menuitem' ) ).not.toBeInTheDocument();
|
|
162
|
-
|
|
163
|
-
await press.Space();
|
|
164
|
-
|
|
165
|
-
// DropdownMenu open, focus is on the first focusable item
|
|
166
|
-
// (disabled items are still focusable and accessible
|
|
167
|
-
expect(
|
|
168
|
-
screen.getByRole( 'menuitem', { name: 'First item' } )
|
|
169
|
-
).toHaveFocus();
|
|
170
|
-
} );
|
|
171
|
-
|
|
172
|
-
it( 'should close when pressing the escape key', async () => {
|
|
173
|
-
render(
|
|
174
|
-
<DropdownMenu trigger={ <button>Open dropdown</button> }>
|
|
175
|
-
<DropdownMenuItem>Dropdown menu item</DropdownMenuItem>
|
|
176
|
-
</DropdownMenu>
|
|
177
|
-
);
|
|
178
|
-
|
|
179
|
-
const trigger = screen.getByRole( 'button', {
|
|
180
|
-
name: 'Open dropdown',
|
|
181
|
-
} );
|
|
182
|
-
|
|
183
|
-
await click( trigger );
|
|
184
|
-
|
|
185
|
-
// Focuses menu on mouse click, focuses first item on keyboard press
|
|
186
|
-
// Can be changed with a custom useEffect
|
|
187
|
-
expect( screen.getByRole( 'menu' ) ).toHaveFocus();
|
|
188
|
-
|
|
189
|
-
// Pressing esc will close the menu and move focus to the toggle
|
|
190
|
-
await press.Escape();
|
|
191
|
-
|
|
192
|
-
expect( screen.queryByRole( 'menu' ) ).not.toBeInTheDocument();
|
|
193
|
-
|
|
194
|
-
await waitFor( () =>
|
|
195
|
-
expect(
|
|
196
|
-
screen.getByRole( 'button', { name: 'Open dropdown' } )
|
|
197
|
-
).toHaveFocus()
|
|
198
|
-
);
|
|
199
|
-
} );
|
|
200
|
-
|
|
201
|
-
it( 'should close when clicking outside of the content', async () => {
|
|
202
|
-
render(
|
|
203
|
-
<DropdownMenu
|
|
204
|
-
defaultOpen
|
|
205
|
-
trigger={ <button>Open dropdown</button> }
|
|
206
|
-
>
|
|
207
|
-
<DropdownMenuItem>Dropdown menu item</DropdownMenuItem>
|
|
208
|
-
</DropdownMenu>
|
|
209
|
-
);
|
|
210
|
-
|
|
211
|
-
expect( screen.getByRole( 'menu' ) ).toBeInTheDocument();
|
|
212
|
-
|
|
213
|
-
// Click on the body (ie. outside of the dropdown menu)
|
|
214
|
-
await click( document.body );
|
|
215
|
-
|
|
216
|
-
expect( screen.queryByRole( 'menu' ) ).not.toBeInTheDocument();
|
|
217
|
-
} );
|
|
218
|
-
|
|
219
|
-
it( 'should close when clicking on a menu item', async () => {
|
|
220
|
-
render(
|
|
221
|
-
<DropdownMenu
|
|
222
|
-
defaultOpen
|
|
223
|
-
trigger={ <button>Open dropdown</button> }
|
|
224
|
-
>
|
|
225
|
-
<DropdownMenuItem>Dropdown menu item</DropdownMenuItem>
|
|
226
|
-
</DropdownMenu>
|
|
227
|
-
);
|
|
228
|
-
|
|
229
|
-
expect( screen.getByRole( 'menu' ) ).toBeInTheDocument();
|
|
230
|
-
|
|
231
|
-
// Clicking a menu item will close the menu
|
|
232
|
-
await click( screen.getByRole( 'menuitem' ) );
|
|
233
|
-
|
|
234
|
-
expect( screen.queryByRole( 'menu' ) ).not.toBeInTheDocument();
|
|
235
|
-
} );
|
|
236
|
-
|
|
237
|
-
it( 'should not close when clicking on a menu item when the `hideOnClick` prop is set to `false`', async () => {
|
|
238
|
-
render(
|
|
239
|
-
<DropdownMenu
|
|
240
|
-
defaultOpen
|
|
241
|
-
trigger={ <button>Open dropdown</button> }
|
|
242
|
-
>
|
|
243
|
-
<DropdownMenuItem hideOnClick={ false }>
|
|
244
|
-
Dropdown menu item
|
|
245
|
-
</DropdownMenuItem>
|
|
246
|
-
</DropdownMenu>
|
|
247
|
-
);
|
|
248
|
-
|
|
249
|
-
expect( screen.getByRole( 'menu' ) ).toBeVisible();
|
|
250
|
-
|
|
251
|
-
// Clicking a menu item will close the menu
|
|
252
|
-
await click( screen.getByRole( 'menuitem' ) );
|
|
253
|
-
|
|
254
|
-
expect( screen.getByRole( 'menu' ) ).toBeVisible();
|
|
255
|
-
} );
|
|
256
|
-
|
|
257
|
-
it( 'should not close when clicking on a disabled menu item', async () => {
|
|
258
|
-
render(
|
|
259
|
-
<DropdownMenu
|
|
260
|
-
defaultOpen
|
|
261
|
-
trigger={ <button>Open dropdown</button> }
|
|
262
|
-
>
|
|
263
|
-
<DropdownMenuItem disabled>
|
|
264
|
-
Dropdown menu item
|
|
265
|
-
</DropdownMenuItem>
|
|
266
|
-
</DropdownMenu>
|
|
267
|
-
);
|
|
268
|
-
|
|
269
|
-
expect( screen.getByRole( 'menu' ) ).toBeInTheDocument();
|
|
270
|
-
|
|
271
|
-
// Clicking a disabled menu item won't close the menu
|
|
272
|
-
await click( screen.getByRole( 'menuitem' ) );
|
|
273
|
-
|
|
274
|
-
expect( screen.getByRole( 'menu' ) ).toBeInTheDocument();
|
|
275
|
-
} );
|
|
276
|
-
|
|
277
|
-
it( 'should reveal submenu content when hovering over the submenu trigger', async () => {
|
|
278
|
-
render(
|
|
279
|
-
<DropdownMenu
|
|
280
|
-
defaultOpen
|
|
281
|
-
trigger={ <button>Open dropdown</button> }
|
|
282
|
-
>
|
|
283
|
-
<DropdownMenuItem>Dropdown menu item 1</DropdownMenuItem>
|
|
284
|
-
<DropdownMenuItem>Dropdown menu item 2</DropdownMenuItem>
|
|
285
|
-
<DropdownMenu
|
|
286
|
-
trigger={
|
|
287
|
-
<DropdownMenuItem>
|
|
288
|
-
Dropdown submenu
|
|
289
|
-
</DropdownMenuItem>
|
|
290
|
-
}
|
|
291
|
-
>
|
|
292
|
-
<DropdownMenuItem>
|
|
293
|
-
Dropdown submenu item 1
|
|
294
|
-
</DropdownMenuItem>
|
|
295
|
-
<DropdownMenuItem>
|
|
296
|
-
Dropdown submenu item 2
|
|
297
|
-
</DropdownMenuItem>
|
|
298
|
-
</DropdownMenu>
|
|
299
|
-
<DropdownMenuItem>Dropdown menu item 3</DropdownMenuItem>
|
|
300
|
-
</DropdownMenu>
|
|
301
|
-
);
|
|
302
|
-
|
|
303
|
-
// Before hover, submenu items are not rendered
|
|
304
|
-
expect(
|
|
305
|
-
screen.queryByRole( 'menuitem', {
|
|
306
|
-
name: 'Dropdown submenu item 1',
|
|
307
|
-
} )
|
|
308
|
-
).not.toBeInTheDocument();
|
|
309
|
-
|
|
310
|
-
await hover(
|
|
311
|
-
screen.getByRole( 'menuitem', { name: 'Dropdown submenu' } )
|
|
312
|
-
);
|
|
313
|
-
|
|
314
|
-
// After hover, submenu items are rendered
|
|
315
|
-
// Reason for `findByRole`: due to the animation, we've got to wait
|
|
316
|
-
// a short amount of time for the submenu to appear
|
|
317
|
-
await screen.findByRole( 'menuitem', {
|
|
318
|
-
name: 'Dropdown submenu item 1',
|
|
319
|
-
} );
|
|
320
|
-
} );
|
|
321
|
-
|
|
322
|
-
it( 'should navigate menu items and subitems using the arrow, spacebar and enter keys', async () => {
|
|
323
|
-
render(
|
|
324
|
-
<DropdownMenu
|
|
325
|
-
defaultOpen
|
|
326
|
-
trigger={ <button>Open dropdown</button> }
|
|
327
|
-
>
|
|
328
|
-
<DropdownMenuItem>Dropdown menu item 1</DropdownMenuItem>
|
|
329
|
-
<DropdownMenuItem>Dropdown menu item 2</DropdownMenuItem>
|
|
330
|
-
<DropdownMenu
|
|
331
|
-
trigger={
|
|
332
|
-
<DropdownMenuItem>
|
|
333
|
-
Dropdown submenu
|
|
334
|
-
</DropdownMenuItem>
|
|
335
|
-
}
|
|
336
|
-
>
|
|
337
|
-
<DropdownMenuItem>
|
|
338
|
-
Dropdown submenu item 1
|
|
339
|
-
</DropdownMenuItem>
|
|
340
|
-
<DropdownMenuItem>
|
|
341
|
-
Dropdown submenu item 2
|
|
342
|
-
</DropdownMenuItem>
|
|
343
|
-
</DropdownMenu>
|
|
344
|
-
<DropdownMenuItem>Dropdown menu item 3</DropdownMenuItem>
|
|
345
|
-
</DropdownMenu>
|
|
346
|
-
);
|
|
347
|
-
|
|
348
|
-
// The menu is focused automatically when `defaultOpen` is set.
|
|
349
|
-
await waitFor( () =>
|
|
350
|
-
expect( screen.getByRole( 'menu' ) ).toHaveFocus()
|
|
351
|
-
);
|
|
352
|
-
|
|
353
|
-
// Arrow up/down selects menu items
|
|
354
|
-
// The selection wraps around from last to first and viceversa
|
|
355
|
-
await press.ArrowDown();
|
|
356
|
-
expect(
|
|
357
|
-
screen.getByRole( 'menuitem', { name: 'Dropdown menu item 1' } )
|
|
358
|
-
).toHaveFocus();
|
|
359
|
-
|
|
360
|
-
await press.ArrowDown();
|
|
361
|
-
expect(
|
|
362
|
-
screen.getByRole( 'menuitem', { name: 'Dropdown menu item 2' } )
|
|
363
|
-
).toHaveFocus();
|
|
364
|
-
|
|
365
|
-
await press.ArrowDown();
|
|
366
|
-
expect(
|
|
367
|
-
screen.getByRole( 'menuitem', { name: 'Dropdown submenu' } )
|
|
368
|
-
).toHaveFocus();
|
|
369
|
-
|
|
370
|
-
await press.ArrowDown();
|
|
371
|
-
expect(
|
|
372
|
-
screen.getByRole( 'menuitem', { name: 'Dropdown menu item 3' } )
|
|
373
|
-
).toHaveFocus();
|
|
374
|
-
|
|
375
|
-
await press.ArrowDown();
|
|
376
|
-
expect(
|
|
377
|
-
screen.getByRole( 'menuitem', { name: 'Dropdown menu item 1' } )
|
|
378
|
-
).toHaveFocus();
|
|
379
|
-
|
|
380
|
-
await press.ArrowUp();
|
|
381
|
-
expect(
|
|
382
|
-
screen.getByRole( 'menuitem', { name: 'Dropdown menu item 3' } )
|
|
383
|
-
).toHaveFocus();
|
|
384
|
-
|
|
385
|
-
await press.ArrowUp();
|
|
386
|
-
expect(
|
|
387
|
-
screen.getByRole( 'menuitem', { name: 'Dropdown submenu' } )
|
|
388
|
-
).toHaveFocus();
|
|
389
|
-
|
|
390
|
-
// Arrow right/left can be used to enter/leave submenus
|
|
391
|
-
await press.ArrowRight();
|
|
392
|
-
expect(
|
|
393
|
-
screen.getByRole( 'menuitem', {
|
|
394
|
-
name: 'Dropdown submenu item 1',
|
|
395
|
-
} )
|
|
396
|
-
).toHaveFocus();
|
|
397
|
-
|
|
398
|
-
await press.ArrowDown();
|
|
399
|
-
expect(
|
|
400
|
-
screen.getByRole( 'menuitem', {
|
|
401
|
-
name: 'Dropdown submenu item 2',
|
|
402
|
-
} )
|
|
403
|
-
).toHaveFocus();
|
|
404
|
-
|
|
405
|
-
await press.ArrowLeft();
|
|
406
|
-
expect(
|
|
407
|
-
screen.getByRole( 'menuitem', {
|
|
408
|
-
name: 'Dropdown submenu',
|
|
409
|
-
} )
|
|
410
|
-
).toHaveFocus();
|
|
411
|
-
|
|
412
|
-
// Spacebar or enter key can also be used to enter a submenu
|
|
413
|
-
await press.Enter();
|
|
414
|
-
expect(
|
|
415
|
-
screen.getByRole( 'menuitem', {
|
|
416
|
-
name: 'Dropdown submenu item 1',
|
|
417
|
-
} )
|
|
418
|
-
).toHaveFocus();
|
|
419
|
-
|
|
420
|
-
await press.ArrowLeft();
|
|
421
|
-
expect(
|
|
422
|
-
screen.getByRole( 'menuitem', {
|
|
423
|
-
name: 'Dropdown submenu',
|
|
424
|
-
} )
|
|
425
|
-
).toHaveFocus();
|
|
426
|
-
|
|
427
|
-
await press.Space();
|
|
428
|
-
expect(
|
|
429
|
-
screen.getByRole( 'menuitem', {
|
|
430
|
-
name: 'Dropdown submenu item 1',
|
|
431
|
-
} )
|
|
432
|
-
).toHaveFocus();
|
|
433
|
-
|
|
434
|
-
await press.ArrowLeft();
|
|
435
|
-
expect(
|
|
436
|
-
screen.getByRole( 'menuitem', {
|
|
437
|
-
name: 'Dropdown submenu',
|
|
438
|
-
} )
|
|
439
|
-
).toHaveFocus();
|
|
440
|
-
} );
|
|
441
|
-
|
|
442
|
-
it( 'should check radio items and keep the menu open when clicking (controlled)', async () => {
|
|
443
|
-
const onRadioValueChangeSpy = jest.fn();
|
|
444
|
-
|
|
445
|
-
const ControlledRadioGroup = () => {
|
|
446
|
-
const [ radioValue, setRadioValue ] = useState( 'two' );
|
|
447
|
-
const onRadioChange: React.ComponentProps<
|
|
448
|
-
typeof DropdownMenuRadioItem
|
|
449
|
-
>[ 'onChange' ] = ( e ) => {
|
|
450
|
-
onRadioValueChangeSpy( e.target.value );
|
|
451
|
-
setRadioValue( e.target.value );
|
|
452
|
-
};
|
|
453
|
-
return (
|
|
454
|
-
<DropdownMenu trigger={ <button>Open dropdown</button> }>
|
|
455
|
-
<DropdownMenuGroup>
|
|
456
|
-
<DropdownMenuRadioItem
|
|
457
|
-
name="radio-test"
|
|
458
|
-
value="radio-one"
|
|
459
|
-
checked={ radioValue === 'radio-one' }
|
|
460
|
-
onChange={ onRadioChange }
|
|
461
|
-
>
|
|
462
|
-
Radio item one
|
|
463
|
-
</DropdownMenuRadioItem>
|
|
464
|
-
<DropdownMenuRadioItem
|
|
465
|
-
name="radio-test"
|
|
466
|
-
value="radio-two"
|
|
467
|
-
checked={ radioValue === 'radio-two' }
|
|
468
|
-
onChange={ onRadioChange }
|
|
469
|
-
>
|
|
470
|
-
Radio item two
|
|
471
|
-
</DropdownMenuRadioItem>
|
|
472
|
-
</DropdownMenuGroup>
|
|
473
|
-
</DropdownMenu>
|
|
474
|
-
);
|
|
475
|
-
};
|
|
476
|
-
|
|
477
|
-
render( <ControlledRadioGroup /> );
|
|
478
|
-
|
|
479
|
-
// Open dropdown
|
|
480
|
-
await click(
|
|
481
|
-
screen.getByRole( 'button', { name: 'Open dropdown' } )
|
|
482
|
-
);
|
|
483
|
-
|
|
484
|
-
// No radios should be checked at this point
|
|
485
|
-
expect( screen.getAllByRole( 'menuitemradio' ) ).toHaveLength( 2 );
|
|
486
|
-
expect(
|
|
487
|
-
screen.getByRole( 'menuitemradio', { name: 'Radio item one' } )
|
|
488
|
-
).not.toBeChecked();
|
|
489
|
-
expect(
|
|
490
|
-
screen.getByRole( 'menuitemradio', { name: 'Radio item two' } )
|
|
491
|
-
).not.toBeChecked();
|
|
492
|
-
|
|
493
|
-
// Click first radio item, make sure that the callback fires
|
|
494
|
-
await click(
|
|
495
|
-
screen.getByRole( 'menuitemradio', { name: 'Radio item one' } )
|
|
496
|
-
);
|
|
497
|
-
expect( onRadioValueChangeSpy ).toHaveBeenCalledTimes( 1 );
|
|
498
|
-
expect( onRadioValueChangeSpy ).toHaveBeenLastCalledWith(
|
|
499
|
-
'radio-one'
|
|
500
|
-
);
|
|
501
|
-
|
|
502
|
-
// Make sure that first radio is checked
|
|
503
|
-
expect(
|
|
504
|
-
screen.getByRole( 'menuitemradio', { name: 'Radio item one' } )
|
|
505
|
-
).toBeChecked();
|
|
506
|
-
expect(
|
|
507
|
-
screen.getByRole( 'menuitemradio', { name: 'Radio item two' } )
|
|
508
|
-
).not.toBeChecked();
|
|
509
|
-
|
|
510
|
-
// Click second radio item, make sure that the callback fires
|
|
511
|
-
await click(
|
|
512
|
-
screen.getByRole( 'menuitemradio', { name: 'Radio item two' } )
|
|
513
|
-
);
|
|
514
|
-
expect( onRadioValueChangeSpy ).toHaveBeenCalledTimes( 2 );
|
|
515
|
-
expect( onRadioValueChangeSpy ).toHaveBeenLastCalledWith(
|
|
516
|
-
'radio-two'
|
|
517
|
-
);
|
|
518
|
-
|
|
519
|
-
// Make sure that second radio is selected
|
|
520
|
-
expect(
|
|
521
|
-
screen.getByRole( 'menuitemradio', { name: 'Radio item one' } )
|
|
522
|
-
).not.toBeChecked();
|
|
523
|
-
expect(
|
|
524
|
-
screen.getByRole( 'menuitemradio', { name: 'Radio item two' } )
|
|
525
|
-
).toBeChecked();
|
|
526
|
-
} );
|
|
527
|
-
|
|
528
|
-
it( 'should check radio items and keep the menu open when clicking (uncontrolled)', async () => {
|
|
529
|
-
const onRadioValueChangeSpy = jest.fn();
|
|
530
|
-
render(
|
|
531
|
-
<DropdownMenu trigger={ <button>Open dropdown</button> }>
|
|
532
|
-
<DropdownMenuGroup>
|
|
533
|
-
<DropdownMenuRadioItem
|
|
534
|
-
name="radio-test"
|
|
535
|
-
value="radio-one"
|
|
536
|
-
onChange={ ( e ) =>
|
|
537
|
-
onRadioValueChangeSpy( e.target.value )
|
|
538
|
-
}
|
|
539
|
-
>
|
|
540
|
-
Radio item one
|
|
541
|
-
</DropdownMenuRadioItem>
|
|
542
|
-
<DropdownMenuRadioItem
|
|
543
|
-
name="radio-test"
|
|
544
|
-
value="radio-two"
|
|
545
|
-
defaultChecked
|
|
546
|
-
onChange={ ( e ) =>
|
|
547
|
-
onRadioValueChangeSpy( e.target.value )
|
|
548
|
-
}
|
|
549
|
-
>
|
|
550
|
-
Radio item two
|
|
551
|
-
</DropdownMenuRadioItem>
|
|
552
|
-
</DropdownMenuGroup>
|
|
553
|
-
</DropdownMenu>
|
|
554
|
-
);
|
|
555
|
-
|
|
556
|
-
// Open dropdown
|
|
557
|
-
await click(
|
|
558
|
-
screen.getByRole( 'button', { name: 'Open dropdown' } )
|
|
559
|
-
);
|
|
560
|
-
|
|
561
|
-
// Radio item two should be checked (`defaultChecked` prop)
|
|
562
|
-
expect( screen.getAllByRole( 'menuitemradio' ) ).toHaveLength( 2 );
|
|
563
|
-
expect(
|
|
564
|
-
screen.getByRole( 'menuitemradio', { name: 'Radio item one' } )
|
|
565
|
-
).not.toBeChecked();
|
|
566
|
-
expect(
|
|
567
|
-
screen.getByRole( 'menuitemradio', { name: 'Radio item two' } )
|
|
568
|
-
).toBeChecked();
|
|
569
|
-
|
|
570
|
-
// Click first radio item, make sure that the callback fires
|
|
571
|
-
await click(
|
|
572
|
-
screen.getByRole( 'menuitemradio', { name: 'Radio item one' } )
|
|
573
|
-
);
|
|
574
|
-
expect( onRadioValueChangeSpy ).toHaveBeenCalledTimes( 1 );
|
|
575
|
-
expect( onRadioValueChangeSpy ).toHaveBeenLastCalledWith(
|
|
576
|
-
'radio-one'
|
|
577
|
-
);
|
|
578
|
-
|
|
579
|
-
// Make sure that first radio is checked
|
|
580
|
-
expect(
|
|
581
|
-
screen.getByRole( 'menuitemradio', { name: 'Radio item one' } )
|
|
582
|
-
).toBeChecked();
|
|
583
|
-
expect(
|
|
584
|
-
screen.getByRole( 'menuitemradio', { name: 'Radio item two' } )
|
|
585
|
-
).not.toBeChecked();
|
|
586
|
-
|
|
587
|
-
// Click second radio item, make sure that the callback fires
|
|
588
|
-
await click(
|
|
589
|
-
screen.getByRole( 'menuitemradio', { name: 'Radio item two' } )
|
|
590
|
-
);
|
|
591
|
-
expect( onRadioValueChangeSpy ).toHaveBeenCalledTimes( 2 );
|
|
592
|
-
expect( onRadioValueChangeSpy ).toHaveBeenLastCalledWith(
|
|
593
|
-
'radio-two'
|
|
594
|
-
);
|
|
595
|
-
|
|
596
|
-
// Make sure that second radio is selected
|
|
597
|
-
expect(
|
|
598
|
-
screen.getByRole( 'menuitemradio', { name: 'Radio item one' } )
|
|
599
|
-
).not.toBeChecked();
|
|
600
|
-
expect(
|
|
601
|
-
screen.getByRole( 'menuitemradio', { name: 'Radio item two' } )
|
|
602
|
-
).toBeChecked();
|
|
603
|
-
} );
|
|
604
|
-
|
|
605
|
-
it( 'should check checkbox items and keep the menu open when clicking (controlled)', async () => {
|
|
606
|
-
const onCheckboxValueChangeSpy = jest.fn();
|
|
607
|
-
|
|
608
|
-
const ControlledRadioGroup = () => {
|
|
609
|
-
const [ itemOneChecked, setItemOneChecked ] =
|
|
610
|
-
useState< boolean >();
|
|
611
|
-
const [ itemTwoChecked, setItemTwoChecked ] =
|
|
612
|
-
useState< boolean >();
|
|
613
|
-
|
|
614
|
-
return (
|
|
615
|
-
<DropdownMenu trigger={ <button>Open dropdown</button> }>
|
|
616
|
-
<DropdownMenuCheckboxItem
|
|
617
|
-
name="item-one"
|
|
618
|
-
value="item-one-value"
|
|
619
|
-
checked={ itemOneChecked }
|
|
620
|
-
onChange={ ( e ) => {
|
|
621
|
-
onCheckboxValueChangeSpy(
|
|
622
|
-
e.target.name,
|
|
623
|
-
e.target.value,
|
|
624
|
-
e.target.checked
|
|
625
|
-
);
|
|
626
|
-
setItemOneChecked( e.target.checked );
|
|
627
|
-
} }
|
|
628
|
-
>
|
|
629
|
-
Checkbox item one
|
|
630
|
-
</DropdownMenuCheckboxItem>
|
|
631
|
-
|
|
632
|
-
<DropdownMenuCheckboxItem
|
|
633
|
-
name="item-two"
|
|
634
|
-
value="item-two-value"
|
|
635
|
-
checked={ itemTwoChecked }
|
|
636
|
-
onChange={ ( e ) => {
|
|
637
|
-
onCheckboxValueChangeSpy(
|
|
638
|
-
e.target.name,
|
|
639
|
-
e.target.value,
|
|
640
|
-
e.target.checked
|
|
641
|
-
);
|
|
642
|
-
setItemTwoChecked( e.target.checked );
|
|
643
|
-
} }
|
|
644
|
-
>
|
|
645
|
-
Checkbox item two
|
|
646
|
-
</DropdownMenuCheckboxItem>
|
|
647
|
-
</DropdownMenu>
|
|
648
|
-
);
|
|
649
|
-
};
|
|
650
|
-
|
|
651
|
-
render( <ControlledRadioGroup /> );
|
|
652
|
-
|
|
653
|
-
// Open dropdown
|
|
654
|
-
await click(
|
|
655
|
-
screen.getByRole( 'button', { name: 'Open dropdown' } )
|
|
656
|
-
);
|
|
657
|
-
|
|
658
|
-
// No checkboxes should be checked at this point
|
|
659
|
-
expect( screen.getAllByRole( 'menuitemcheckbox' ) ).toHaveLength(
|
|
660
|
-
2
|
|
661
|
-
);
|
|
662
|
-
expect(
|
|
663
|
-
screen.getByRole( 'menuitemcheckbox', {
|
|
664
|
-
name: 'Checkbox item one',
|
|
665
|
-
} )
|
|
666
|
-
).not.toBeChecked();
|
|
667
|
-
expect(
|
|
668
|
-
screen.getByRole( 'menuitemcheckbox', {
|
|
669
|
-
name: 'Checkbox item two',
|
|
670
|
-
} )
|
|
671
|
-
).not.toBeChecked();
|
|
672
|
-
|
|
673
|
-
// Click first checkbox item, make sure that the callback fires
|
|
674
|
-
await click(
|
|
675
|
-
screen.getByRole( 'menuitemcheckbox', {
|
|
676
|
-
name: 'Checkbox item one',
|
|
677
|
-
} )
|
|
678
|
-
);
|
|
679
|
-
expect( onCheckboxValueChangeSpy ).toHaveBeenCalledTimes( 1 );
|
|
680
|
-
expect( onCheckboxValueChangeSpy ).toHaveBeenLastCalledWith(
|
|
681
|
-
'item-one',
|
|
682
|
-
'item-one-value',
|
|
683
|
-
true
|
|
684
|
-
);
|
|
685
|
-
|
|
686
|
-
// Make sure that first checkbox is checked
|
|
687
|
-
expect(
|
|
688
|
-
screen.getByRole( 'menuitemcheckbox', {
|
|
689
|
-
name: 'Checkbox item one',
|
|
690
|
-
} )
|
|
691
|
-
).toBeChecked();
|
|
692
|
-
|
|
693
|
-
// Click second checkbox item, make sure that the callback fires
|
|
694
|
-
await click(
|
|
695
|
-
screen.getByRole( 'menuitemcheckbox', {
|
|
696
|
-
name: 'Checkbox item two',
|
|
697
|
-
} )
|
|
698
|
-
);
|
|
699
|
-
expect( onCheckboxValueChangeSpy ).toHaveBeenCalledTimes( 2 );
|
|
700
|
-
expect( onCheckboxValueChangeSpy ).toHaveBeenLastCalledWith(
|
|
701
|
-
'item-two',
|
|
702
|
-
'item-two-value',
|
|
703
|
-
true
|
|
704
|
-
);
|
|
705
|
-
|
|
706
|
-
// Make sure that second checkbox is selected
|
|
707
|
-
expect(
|
|
708
|
-
screen.getByRole( 'menuitemcheckbox', {
|
|
709
|
-
name: 'Checkbox item two',
|
|
710
|
-
} )
|
|
711
|
-
).toBeChecked();
|
|
712
|
-
|
|
713
|
-
// Click second checkbox item, make sure that the callback fires
|
|
714
|
-
await click(
|
|
715
|
-
screen.getByRole( 'menuitemcheckbox', {
|
|
716
|
-
name: 'Checkbox item two',
|
|
717
|
-
} )
|
|
718
|
-
);
|
|
719
|
-
expect( onCheckboxValueChangeSpy ).toHaveBeenCalledTimes( 3 );
|
|
720
|
-
expect( onCheckboxValueChangeSpy ).toHaveBeenLastCalledWith(
|
|
721
|
-
'item-two',
|
|
722
|
-
'item-two-value',
|
|
723
|
-
false
|
|
724
|
-
);
|
|
725
|
-
|
|
726
|
-
// Make sure that second checkbox is unselected
|
|
727
|
-
expect(
|
|
728
|
-
screen.getByRole( 'menuitemcheckbox', {
|
|
729
|
-
name: 'Checkbox item two',
|
|
730
|
-
} )
|
|
731
|
-
).not.toBeChecked();
|
|
732
|
-
} );
|
|
733
|
-
|
|
734
|
-
it( 'should check checkbox items and keep the menu open when clicking (uncontrolled)', async () => {
|
|
735
|
-
const onCheckboxValueChangeSpy = jest.fn();
|
|
736
|
-
|
|
737
|
-
render(
|
|
738
|
-
<DropdownMenu trigger={ <button>Open dropdown</button> }>
|
|
739
|
-
<DropdownMenuCheckboxItem
|
|
740
|
-
name="item-one"
|
|
741
|
-
value="item-one-value"
|
|
742
|
-
onChange={ ( e ) => {
|
|
743
|
-
onCheckboxValueChangeSpy(
|
|
744
|
-
e.target.name,
|
|
745
|
-
e.target.value,
|
|
746
|
-
e.target.checked
|
|
747
|
-
);
|
|
748
|
-
} }
|
|
749
|
-
>
|
|
750
|
-
Checkbox item one
|
|
751
|
-
</DropdownMenuCheckboxItem>
|
|
752
|
-
|
|
753
|
-
<DropdownMenuCheckboxItem
|
|
754
|
-
name="item-two"
|
|
755
|
-
value="item-two-value"
|
|
756
|
-
defaultChecked
|
|
757
|
-
onChange={ ( e ) => {
|
|
758
|
-
onCheckboxValueChangeSpy(
|
|
759
|
-
e.target.name,
|
|
760
|
-
e.target.value,
|
|
761
|
-
e.target.checked
|
|
762
|
-
);
|
|
763
|
-
} }
|
|
764
|
-
>
|
|
765
|
-
Checkbox item two
|
|
766
|
-
</DropdownMenuCheckboxItem>
|
|
767
|
-
</DropdownMenu>
|
|
768
|
-
);
|
|
769
|
-
|
|
770
|
-
// Open dropdown
|
|
771
|
-
await click(
|
|
772
|
-
screen.getByRole( 'button', { name: 'Open dropdown' } )
|
|
773
|
-
);
|
|
774
|
-
|
|
775
|
-
// Checkbox item two should be checked (`defaultChecked`)
|
|
776
|
-
expect( screen.getAllByRole( 'menuitemcheckbox' ) ).toHaveLength(
|
|
777
|
-
2
|
|
778
|
-
);
|
|
779
|
-
expect(
|
|
780
|
-
screen.getByRole( 'menuitemcheckbox', {
|
|
781
|
-
name: 'Checkbox item one',
|
|
782
|
-
} )
|
|
783
|
-
).not.toBeChecked();
|
|
784
|
-
expect(
|
|
785
|
-
screen.getByRole( 'menuitemcheckbox', {
|
|
786
|
-
name: 'Checkbox item two',
|
|
787
|
-
} )
|
|
788
|
-
).toBeChecked();
|
|
789
|
-
|
|
790
|
-
// Click first checkbox item, make sure that the callback fires
|
|
791
|
-
await click(
|
|
792
|
-
screen.getByRole( 'menuitemcheckbox', {
|
|
793
|
-
name: 'Checkbox item one',
|
|
794
|
-
} )
|
|
795
|
-
);
|
|
796
|
-
expect( onCheckboxValueChangeSpy ).toHaveBeenCalledTimes( 1 );
|
|
797
|
-
expect( onCheckboxValueChangeSpy ).toHaveBeenLastCalledWith(
|
|
798
|
-
'item-one',
|
|
799
|
-
'item-one-value',
|
|
800
|
-
true
|
|
801
|
-
);
|
|
802
|
-
|
|
803
|
-
// Make sure that first checkbox is checked
|
|
804
|
-
expect(
|
|
805
|
-
screen.getByRole( 'menuitemcheckbox', {
|
|
806
|
-
name: 'Checkbox item one',
|
|
807
|
-
} )
|
|
808
|
-
).toBeChecked();
|
|
809
|
-
|
|
810
|
-
// Click second checkbox item, make sure that the callback fires
|
|
811
|
-
await click(
|
|
812
|
-
screen.getByRole( 'menuitemcheckbox', {
|
|
813
|
-
name: 'Checkbox item two',
|
|
814
|
-
} )
|
|
815
|
-
);
|
|
816
|
-
expect( onCheckboxValueChangeSpy ).toHaveBeenCalledTimes( 2 );
|
|
817
|
-
expect( onCheckboxValueChangeSpy ).toHaveBeenLastCalledWith(
|
|
818
|
-
'item-two',
|
|
819
|
-
'item-two-value',
|
|
820
|
-
false
|
|
821
|
-
);
|
|
822
|
-
|
|
823
|
-
// Make sure that second checkbox is unchecked
|
|
824
|
-
expect(
|
|
825
|
-
screen.getByRole( 'menuitemcheckbox', {
|
|
826
|
-
name: 'Checkbox item two',
|
|
827
|
-
} )
|
|
828
|
-
).not.toBeChecked();
|
|
829
|
-
|
|
830
|
-
// Click second checkbox item, make sure that the callback fires
|
|
831
|
-
await click(
|
|
832
|
-
screen.getByRole( 'menuitemcheckbox', {
|
|
833
|
-
name: 'Checkbox item two',
|
|
834
|
-
} )
|
|
835
|
-
);
|
|
836
|
-
expect( onCheckboxValueChangeSpy ).toHaveBeenCalledTimes( 3 );
|
|
837
|
-
expect( onCheckboxValueChangeSpy ).toHaveBeenLastCalledWith(
|
|
838
|
-
'item-two',
|
|
839
|
-
'item-two-value',
|
|
840
|
-
true
|
|
841
|
-
);
|
|
842
|
-
|
|
843
|
-
// Make sure that second checkbox is unselected
|
|
844
|
-
expect(
|
|
845
|
-
screen.getByRole( 'menuitemcheckbox', {
|
|
846
|
-
name: 'Checkbox item two',
|
|
847
|
-
} )
|
|
848
|
-
).toBeChecked();
|
|
849
|
-
} );
|
|
850
|
-
} );
|
|
851
|
-
|
|
852
|
-
describe( 'modality', () => {
|
|
853
|
-
it( 'should be modal by default', async () => {
|
|
854
|
-
render(
|
|
855
|
-
<>
|
|
856
|
-
<DropdownMenu trigger={ <button>Open dropdown</button> }>
|
|
857
|
-
<DropdownMenuItem>Dropdown menu item</DropdownMenuItem>
|
|
858
|
-
</DropdownMenu>
|
|
859
|
-
<button>Button outside of dropdown</button>
|
|
860
|
-
</>
|
|
861
|
-
);
|
|
862
|
-
|
|
863
|
-
// Click to open the menu
|
|
864
|
-
await click(
|
|
865
|
-
screen.getByRole( 'button', {
|
|
866
|
-
name: 'Open dropdown',
|
|
867
|
-
} )
|
|
868
|
-
);
|
|
869
|
-
|
|
870
|
-
// DropdownMenu open, focus is on the menu wrapper
|
|
871
|
-
expect( screen.getByRole( 'menu' ) ).toHaveFocus();
|
|
872
|
-
|
|
873
|
-
expect(
|
|
874
|
-
screen.queryByRole( 'button', {
|
|
875
|
-
name: 'Button outside of dropdown',
|
|
876
|
-
} )
|
|
877
|
-
).not.toBeInTheDocument();
|
|
878
|
-
} );
|
|
879
|
-
|
|
880
|
-
it( 'should not be modal when the `modal` prop is set to `false`', async () => {
|
|
881
|
-
render(
|
|
882
|
-
<>
|
|
883
|
-
<DropdownMenu
|
|
884
|
-
trigger={ <button>Open dropdown</button> }
|
|
885
|
-
modal={ false }
|
|
886
|
-
>
|
|
887
|
-
<DropdownMenuItem>Dropdown menu item</DropdownMenuItem>
|
|
888
|
-
</DropdownMenu>
|
|
889
|
-
<button>Button outside of dropdown</button>
|
|
890
|
-
</>
|
|
891
|
-
);
|
|
892
|
-
|
|
893
|
-
// Click to open the menu
|
|
894
|
-
await click(
|
|
895
|
-
screen.getByRole( 'button', {
|
|
896
|
-
name: 'Open dropdown',
|
|
897
|
-
} )
|
|
898
|
-
);
|
|
899
|
-
|
|
900
|
-
// DropdownMenu open, focus is on the menu wrapper
|
|
901
|
-
expect( screen.getByRole( 'menu' ) ).toHaveFocus();
|
|
902
|
-
|
|
903
|
-
// DropdownMenu is not modal, therefore the outer button is part of the
|
|
904
|
-
// accessibility tree and can be found.
|
|
905
|
-
const outerButton = screen.getByRole( 'button', {
|
|
906
|
-
name: 'Button outside of dropdown',
|
|
907
|
-
} );
|
|
908
|
-
|
|
909
|
-
// The outer button can be focused by pressing tab. Doing so will cause
|
|
910
|
-
// the DropdownMenu to close.
|
|
911
|
-
await press.Tab();
|
|
912
|
-
expect( outerButton ).toBeInTheDocument();
|
|
913
|
-
expect( screen.queryByRole( 'menu' ) ).not.toBeInTheDocument();
|
|
914
|
-
} );
|
|
915
|
-
} );
|
|
916
|
-
|
|
917
|
-
describe( 'items prefix and suffix', () => {
|
|
918
|
-
it( 'should display a prefix on regular items', async () => {
|
|
919
|
-
render(
|
|
920
|
-
<DropdownMenu trigger={ <button>Open dropdown</button> }>
|
|
921
|
-
<DropdownMenuItem prefix={ <>Item prefix</> }>
|
|
922
|
-
Dropdown menu item
|
|
923
|
-
</DropdownMenuItem>
|
|
924
|
-
</DropdownMenu>
|
|
925
|
-
);
|
|
926
|
-
|
|
927
|
-
// Click to open the menu
|
|
928
|
-
await click(
|
|
929
|
-
screen.getByRole( 'button', {
|
|
930
|
-
name: 'Open dropdown',
|
|
931
|
-
} )
|
|
932
|
-
);
|
|
933
|
-
|
|
934
|
-
// The contents of the prefix are rendered before the item's children
|
|
935
|
-
expect(
|
|
936
|
-
screen.getByRole( 'menuitem', {
|
|
937
|
-
name: 'Item prefix Dropdown menu item',
|
|
938
|
-
} )
|
|
939
|
-
).toBeInTheDocument();
|
|
940
|
-
} );
|
|
941
|
-
|
|
942
|
-
it( 'should display a suffix on regular items', async () => {
|
|
943
|
-
render(
|
|
944
|
-
<DropdownMenu trigger={ <button>Open dropdown</button> }>
|
|
945
|
-
<DropdownMenuItem suffix={ <>Item suffix</> }>
|
|
946
|
-
Dropdown menu item
|
|
947
|
-
</DropdownMenuItem>
|
|
948
|
-
</DropdownMenu>
|
|
949
|
-
);
|
|
950
|
-
|
|
951
|
-
// Click to open the menu
|
|
952
|
-
await click(
|
|
953
|
-
screen.getByRole( 'button', {
|
|
954
|
-
name: 'Open dropdown',
|
|
955
|
-
} )
|
|
956
|
-
);
|
|
957
|
-
|
|
958
|
-
// The contents of the suffix are rendered after the item's children
|
|
959
|
-
expect(
|
|
960
|
-
screen.getByRole( 'menuitem', {
|
|
961
|
-
name: 'Dropdown menu item Item suffix',
|
|
962
|
-
} )
|
|
963
|
-
).toBeInTheDocument();
|
|
964
|
-
} );
|
|
965
|
-
|
|
966
|
-
it( 'should display a suffix on radio items', async () => {
|
|
967
|
-
render(
|
|
968
|
-
<DropdownMenu trigger={ <button>Open dropdown</button> }>
|
|
969
|
-
<DropdownMenuRadioItem
|
|
970
|
-
name="radio-test"
|
|
971
|
-
value="radio-one"
|
|
972
|
-
suffix="Radio suffix"
|
|
973
|
-
>
|
|
974
|
-
Radio item one
|
|
975
|
-
</DropdownMenuRadioItem>
|
|
976
|
-
</DropdownMenu>
|
|
977
|
-
);
|
|
978
|
-
|
|
979
|
-
// Click to open the menu
|
|
980
|
-
await click(
|
|
981
|
-
screen.getByRole( 'button', {
|
|
982
|
-
name: 'Open dropdown',
|
|
983
|
-
} )
|
|
984
|
-
);
|
|
985
|
-
|
|
986
|
-
// The contents of the suffix are rendered after the item's children
|
|
987
|
-
expect(
|
|
988
|
-
screen.getByRole( 'menuitemradio', {
|
|
989
|
-
name: 'Radio item one Radio suffix',
|
|
990
|
-
} )
|
|
991
|
-
).toBeInTheDocument();
|
|
992
|
-
} );
|
|
993
|
-
|
|
994
|
-
it( 'should display a suffix on checkbox items', async () => {
|
|
995
|
-
render(
|
|
996
|
-
<DropdownMenu trigger={ <button>Open dropdown</button> }>
|
|
997
|
-
<DropdownMenuCheckboxItem
|
|
998
|
-
name="checkbox-test"
|
|
999
|
-
value="checkbox-one"
|
|
1000
|
-
suffix="Checkbox suffix"
|
|
1001
|
-
>
|
|
1002
|
-
Checkbox item one
|
|
1003
|
-
</DropdownMenuCheckboxItem>
|
|
1004
|
-
</DropdownMenu>
|
|
1005
|
-
);
|
|
1006
|
-
|
|
1007
|
-
// Click to open the menu
|
|
1008
|
-
await click(
|
|
1009
|
-
screen.getByRole( 'button', {
|
|
1010
|
-
name: 'Open dropdown',
|
|
1011
|
-
} )
|
|
1012
|
-
);
|
|
1013
|
-
|
|
1014
|
-
// The contents of the suffix are rendered after the item's children
|
|
1015
|
-
expect(
|
|
1016
|
-
screen.getByRole( 'menuitemcheckbox', {
|
|
1017
|
-
name: 'Checkbox item one Checkbox suffix',
|
|
1018
|
-
} )
|
|
1019
|
-
).toBeInTheDocument();
|
|
1020
|
-
} );
|
|
1021
|
-
} );
|
|
1022
|
-
|
|
1023
|
-
describe( 'typeahead', () => {
|
|
1024
|
-
it( 'should highlight matching item', async () => {
|
|
1025
|
-
render(
|
|
1026
|
-
<DropdownMenu trigger={ <button>Open dropdown</button> }>
|
|
1027
|
-
<DropdownMenuItem>One</DropdownMenuItem>
|
|
1028
|
-
<DropdownMenuItem>Two</DropdownMenuItem>
|
|
1029
|
-
</DropdownMenu>
|
|
1030
|
-
);
|
|
1031
|
-
|
|
1032
|
-
// Click to open the menu
|
|
1033
|
-
await click(
|
|
1034
|
-
screen.getByRole( 'button', {
|
|
1035
|
-
name: 'Open dropdown',
|
|
1036
|
-
} )
|
|
1037
|
-
);
|
|
1038
|
-
expect( screen.getByRole( 'menu' ) ).toHaveFocus();
|
|
1039
|
-
|
|
1040
|
-
// Type "tw", it should match and focus the item with content "Two"
|
|
1041
|
-
await type( 'tw' );
|
|
1042
|
-
expect(
|
|
1043
|
-
screen.getByRole( 'menuitem', { name: 'Two' } )
|
|
1044
|
-
).toHaveFocus();
|
|
1045
|
-
|
|
1046
|
-
// Wait for the typeahead timer to reset and interpret
|
|
1047
|
-
// the next keystrokes as a new search
|
|
1048
|
-
await delay( 500 );
|
|
1049
|
-
|
|
1050
|
-
// Type "on", it should match and focus the item with content "One"
|
|
1051
|
-
await type( 'on' );
|
|
1052
|
-
expect(
|
|
1053
|
-
screen.getByRole( 'menuitem', { name: 'One' } )
|
|
1054
|
-
).toHaveFocus();
|
|
1055
|
-
} );
|
|
1056
|
-
|
|
1057
|
-
it( 'should keep previous focus when no matches are found', async () => {
|
|
1058
|
-
render(
|
|
1059
|
-
<DropdownMenu trigger={ <button>Open dropdown</button> }>
|
|
1060
|
-
<DropdownMenuItem>One</DropdownMenuItem>
|
|
1061
|
-
<DropdownMenuItem>Two</DropdownMenuItem>
|
|
1062
|
-
</DropdownMenu>
|
|
1063
|
-
);
|
|
1064
|
-
|
|
1065
|
-
// Click to open the menu
|
|
1066
|
-
await click(
|
|
1067
|
-
screen.getByRole( 'button', {
|
|
1068
|
-
name: 'Open dropdown',
|
|
1069
|
-
} )
|
|
1070
|
-
);
|
|
1071
|
-
expect( screen.getByRole( 'menu' ) ).toHaveFocus();
|
|
1072
|
-
|
|
1073
|
-
// Type a string that doesn't match any items. Focus shouldn't move.
|
|
1074
|
-
await type( 'abc' );
|
|
1075
|
-
expect( screen.getByRole( 'menu' ) ).toHaveFocus();
|
|
1076
|
-
|
|
1077
|
-
// Wait for the typeahead timer to reset and interpret
|
|
1078
|
-
// the next keystrokes as a new search
|
|
1079
|
-
await delay( 500 );
|
|
1080
|
-
|
|
1081
|
-
// Type "on", it should match and focus the item with content "One"
|
|
1082
|
-
await type( 'on' );
|
|
1083
|
-
expect(
|
|
1084
|
-
screen.getByRole( 'menuitem', { name: 'One' } )
|
|
1085
|
-
).toHaveFocus();
|
|
1086
|
-
|
|
1087
|
-
// Wait for the typeahead timer to reset and interpret
|
|
1088
|
-
// the next keystrokes as a new search
|
|
1089
|
-
await delay( 500 );
|
|
1090
|
-
|
|
1091
|
-
// Type a string that doesn't match any items. Focus shouldn't move.
|
|
1092
|
-
await type( 'abc' );
|
|
1093
|
-
expect(
|
|
1094
|
-
screen.getByRole( 'menuitem', { name: 'One' } )
|
|
1095
|
-
).toHaveFocus();
|
|
1096
|
-
|
|
1097
|
-
// Wait for the typeahead timer to reset and interpret
|
|
1098
|
-
// the next keystrokes as a new search
|
|
1099
|
-
await delay( 500 );
|
|
1100
|
-
|
|
1101
|
-
// Type "tw", it should match and focus the item with content "Two"
|
|
1102
|
-
await type( 'tw' );
|
|
1103
|
-
expect(
|
|
1104
|
-
screen.getByRole( 'menuitem', { name: 'Two' } )
|
|
1105
|
-
).toHaveFocus();
|
|
1106
|
-
} );
|
|
1107
|
-
} );
|
|
1108
|
-
} );
|