@wordpress/components 28.9.0 → 28.10.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 +22 -0
- package/build/alignment-matrix-control/icon.js.map +1 -1
- package/build/alignment-matrix-control/types.js.map +1 -1
- package/build/alignment-matrix-control/utils.js.map +1 -1
- package/build/angle-picker-control/angle-circle.js.map +1 -1
- package/build/autocomplete/autocompleter-ui.js +3 -3
- package/build/autocomplete/autocompleter-ui.js.map +1 -1
- package/build/autocomplete/get-default-use-items.js.map +1 -1
- package/build/autocomplete/index.js +1 -0
- package/build/autocomplete/index.js.map +1 -1
- package/build/base-control/hooks.js.map +1 -1
- package/build/base-control/index.js.map +1 -1
- package/build/border-box-control/border-box-control/hook.js.map +1 -1
- package/build/border-box-control/styles.js.map +1 -1
- package/build/border-box-control/utils.js.map +1 -1
- package/build/border-control/border-control/hook.js.map +1 -1
- package/build/border-control/styles.js.map +1 -1
- package/build/box-control/axial-input-controls.js.map +1 -1
- package/build/box-control/icon.js.map +1 -1
- package/build/box-control/index.js.map +1 -1
- package/build/box-control/input-controls.js.map +1 -1
- package/build/button/index.native.js +1 -1
- package/build/button/index.native.js.map +1 -1
- package/build/card/card/component.js +1 -1
- package/build/card/card/component.js.map +1 -1
- package/build/card/styles.js.map +1 -1
- package/build/color-palette/index.js.map +1 -1
- package/build/color-palette/index.native.js +2 -1
- package/build/color-palette/index.native.js.map +1 -1
- package/build/color-picker/styles.js.map +1 -1
- package/build/combobox-control/index.js +1 -1
- package/build/combobox-control/index.js.map +1 -1
- package/build/composite/legacy/index.js.map +1 -1
- package/build/context/context-connect.js +1 -0
- package/build/context/context-connect.js.map +1 -1
- package/build/context/context-system-provider.js +1 -1
- package/build/context/context-system-provider.js.map +1 -1
- package/build/context/get-styled-class-name-from-key.js.map +1 -1
- package/build/custom-gradient-picker/gradient-bar/control-points.js.map +1 -1
- package/build/custom-gradient-picker/index.js.map +1 -1
- package/build/custom-gradient-picker/serializer.js.map +1 -1
- package/build/custom-gradient-picker/utils.js.map +1 -1
- package/build/custom-select-control-v2/styles.js.map +1 -1
- package/build/dashicon/index.js.map +1 -1
- package/build/date-time/date/styles.js.map +1 -1
- package/build/date-time/time/timezone.js.map +1 -1
- package/build/draggable/index.js.map +1 -1
- package/build/drop-zone/index.js +1 -2
- package/build/drop-zone/index.js.map +1 -1
- package/build/dropdown-menu-v2/styles.js.map +1 -1
- package/build/duotone-picker/color-list-picker/index.js.map +1 -1
- package/build/duotone-picker/utils.js.map +1 -1
- package/build/elevation/hook.js.map +1 -1
- package/build/external-link/index.js +20 -23
- package/build/external-link/index.js.map +1 -1
- package/build/focal-point-picker/index.js.map +1 -1
- package/build/focal-point-picker/index.native.js.map +1 -1
- package/build/focal-point-picker/styles/focal-point-style.js.map +1 -1
- package/build/font-size-picker/index.js.map +1 -1
- package/build/form-token-field/index.js +2 -1
- package/build/form-token-field/index.js.map +1 -1
- package/build/form-token-field/suggestions-list.js.map +1 -1
- package/build/form-token-field/token-input.js.map +1 -1
- package/build/form-token-field/token.js +1 -1
- package/build/form-token-field/token.js.map +1 -1
- package/build/gradient-picker/index.js.map +1 -1
- package/build/grid/hook.js.map +1 -1
- package/build/guide/page-control.js +1 -1
- package/build/guide/page-control.js.map +1 -1
- package/build/h-stack/hook.js.map +1 -1
- package/build/heading/hook.js.map +1 -1
- package/build/input-control/index.js.map +1 -1
- package/build/input-control/input-base.js.map +1 -1
- package/build/input-control/styles/input-control-styles.js.map +1 -1
- package/build/item-group/styles.js.map +1 -1
- package/build/menu-group/index.js.map +1 -1
- package/build/mobile/bottom-sheet/bottom-sheet-navigation/navigation-screen.native.js.map +1 -1
- package/build/mobile/bottom-sheet/cell.native.js +4 -4
- package/build/mobile/bottom-sheet/cell.native.js.map +1 -1
- package/build/mobile/bottom-sheet/index.native.js.map +1 -1
- package/build/mobile/bottom-sheet/range-cell.native.js +1 -1
- package/build/mobile/bottom-sheet/range-cell.native.js.map +1 -1
- package/build/mobile/bottom-sheet/range-text-input.native.js.map +1 -1
- package/build/mobile/bottom-sheet/stepper-cell/index.native.js +1 -1
- package/build/mobile/bottom-sheet/stepper-cell/index.native.js.map +1 -1
- package/build/mobile/bottom-sheet/switch-cell.native.js +4 -4
- package/build/mobile/bottom-sheet/switch-cell.native.js.map +1 -1
- package/build/mobile/cycle-select-control/index.native.js.map +1 -1
- package/build/mobile/gradient/index.native.js.map +1 -1
- package/build/mobile/image/index.native.js.map +1 -1
- package/build/mobile/link-picker/index.native.js +1 -1
- package/build/mobile/link-picker/index.native.js.map +1 -1
- package/build/mobile/link-picker/link-picker-results.native.js.map +1 -1
- package/build/mobile/picker/index.android.js.map +1 -1
- package/build/mobile/segmented-control/index.native.js.map +1 -1
- package/build/mobile/utils/get-px-from-css-unit.native.js.map +1 -1
- package/build/mobile/utils/use-unit-converter-to-mobile.native.js.map +1 -1
- package/build/modal/aria-helper.js +2 -1
- package/build/modal/aria-helper.js.map +1 -1
- package/build/modal/index.js +2 -1
- package/build/modal/index.js.map +1 -1
- package/build/modal/use-modal-exit-animation.js.map +1 -1
- package/build/navigation/group/index.js.map +1 -1
- package/build/navigation/item/base.js.map +1 -1
- package/build/navigation/menu/index.js.map +1 -1
- package/build/navigation/menu/menu-title-search.js +2 -2
- package/build/navigation/menu/menu-title-search.js.map +1 -1
- package/build/navigation/menu/menu-title.js.map +1 -1
- package/build/navigation/styles/navigation-styles.js.map +1 -1
- package/build/navigator/navigator/component.js.map +1 -1
- package/build/navigator/navigator-button/hook.js.map +1 -1
- package/build/number-control/styles/number-control-styles.js.map +1 -1
- package/build/palette-edit/index.js +25 -2
- package/build/palette-edit/index.js.map +1 -1
- package/build/popover/index.js +1 -1
- package/build/popover/index.js.map +1 -1
- package/build/popover/overlay-middlewares.js.map +1 -1
- package/build/popover/utils.js.map +1 -1
- package/build/progress-bar/index.js.map +1 -1
- package/build/progress-bar/styles.js.map +1 -1
- package/build/query-controls/index.js.map +1 -1
- package/build/query-controls/index.native.js.map +1 -1
- package/build/radio-control/index.js.map +1 -1
- package/build/radio-control/index.native.js.map +1 -1
- package/build/range-control/index.js.map +1 -1
- package/build/range-control/index.native.js.map +1 -1
- package/build/range-control/rail.js.map +1 -1
- package/build/range-control/styles/range-control-styles.js +32 -32
- package/build/range-control/styles/range-control-styles.js.map +1 -1
- package/build/range-control/tooltip.js +1 -1
- package/build/range-control/tooltip.js.map +1 -1
- package/build/range-control/utils.js.map +1 -1
- package/build/resizable-box/resize-tooltip/label.js.map +1 -1
- package/build/resizable-box/resize-tooltip/utils.js.map +1 -1
- package/build/responsive-wrapper/index.js.map +1 -1
- package/build/sandbox/index.js.map +1 -1
- package/build/sandbox/index.native.js.map +1 -1
- package/build/search-control/index.js +6 -0
- package/build/search-control/index.js.map +1 -1
- package/build/search-control/index.native.js.map +1 -1
- package/build/search-control/types.js.map +1 -1
- package/build/select-control/index.js.map +1 -1
- package/build/select-control/index.native.js.map +1 -1
- package/build/slot-fill/index.js.map +1 -1
- package/build/spinner/styles.js.map +1 -1
- package/build/style-provider/index.js +1 -0
- package/build/style-provider/index.js.map +1 -1
- package/build/surface/hook.js.map +1 -1
- package/build/surface/styles.js.map +1 -1
- package/build/tab-panel/index.js.map +1 -1
- package/build/tabs/index.js.map +1 -1
- package/build/tabs/styles.js +30 -12
- package/build/tabs/styles.js.map +1 -1
- package/build/tabs/tab.js +7 -2
- package/build/tabs/tab.js.map +1 -1
- package/build/tabs/tablist.js +47 -48
- package/build/tabs/tablist.js.map +1 -1
- package/build/tabs/tabpanel.js.map +1 -1
- package/build/text/get-line-height.js.map +1 -1
- package/build/text/styles/text-mixins.native.js.map +1 -1
- package/build/text/utils.js.map +1 -1
- package/build/text-control/index.native.js.map +1 -1
- package/build/text-highlight/index.js.map +1 -1
- package/build/textarea-control/index.js.map +1 -1
- package/build/theme/color-algorithms.js.map +1 -1
- package/build/theme/styles.js.map +1 -1
- package/build/toggle-control/index.js.map +1 -1
- package/build/toggle-control/index.native.js.map +1 -1
- package/build/toggle-group-control/toggle-group-control/as-radio-group.js +9 -1
- package/build/toggle-group-control/toggle-group-control/as-radio-group.js.map +1 -1
- package/build/toggle-group-control/toggle-group-control/component.js +2 -60
- package/build/toggle-group-control/toggle-group-control/component.js.map +1 -1
- package/build/toggle-group-control/toggle-group-control-option-base/component.js +10 -10
- package/build/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -1
- package/build/toggle-group-control/types.js.map +1 -1
- package/build/toolbar/toolbar/index.js.map +1 -1
- package/build/tools-panel/styles.js.map +1 -1
- package/build/tooltip/index.js +5 -1
- package/build/tooltip/index.js.map +1 -1
- package/build/unit-control/index.js.map +1 -1
- package/build/unit-control/utils.js.map +1 -1
- package/build/utils/breakpoint.js.map +1 -1
- package/build/utils/colors-values.js.map +1 -1
- package/build/utils/config-values.js.map +1 -1
- package/build/utils/font-size.js.map +1 -1
- package/build/utils/hooks/use-animated-offset-rect.js +80 -0
- package/build/utils/hooks/use-animated-offset-rect.js.map +1 -0
- package/build/utils/hooks/use-cx.js.map +1 -1
- package/build/utils/math.js +2 -2
- package/build/utils/math.js.map +1 -1
- package/build/utils/space.js.map +1 -1
- package/build/utils/unit-values.js.map +1 -1
- package/build/utils/use-responsive-value.js.map +1 -1
- package/build-module/alignment-matrix-control/cell.js +1 -2
- package/build-module/alignment-matrix-control/cell.js.map +1 -1
- package/build-module/alignment-matrix-control/icon.js.map +1 -1
- package/build-module/alignment-matrix-control/types.js.map +1 -1
- package/build-module/alignment-matrix-control/utils.js.map +1 -1
- package/build-module/angle-picker-control/angle-circle.js.map +1 -1
- package/build-module/angle-picker-control/index.js +1 -2
- package/build-module/angle-picker-control/index.js.map +1 -1
- package/build-module/autocomplete/autocompleter-ui.js +4 -6
- package/build-module/autocomplete/autocompleter-ui.js.map +1 -1
- package/build-module/autocomplete/autocompleter-ui.native.js +1 -2
- package/build-module/autocomplete/autocompleter-ui.native.js.map +1 -1
- package/build-module/autocomplete/get-default-use-items.js.map +1 -1
- package/build-module/autocomplete/index.js +2 -3
- package/build-module/autocomplete/index.js.map +1 -1
- package/build-module/base-control/hooks.js.map +1 -1
- package/build-module/base-control/index.js +1 -2
- package/build-module/base-control/index.js.map +1 -1
- package/build-module/base-control/index.native.js +1 -2
- package/build-module/base-control/index.native.js.map +1 -1
- package/build-module/border-box-control/border-box-control/component.js +1 -2
- package/build-module/border-box-control/border-box-control/component.js.map +1 -1
- package/build-module/border-box-control/border-box-control/hook.js.map +1 -1
- package/build-module/border-box-control/border-box-control-split-controls/component.js +1 -2
- package/build-module/border-box-control/border-box-control-split-controls/component.js.map +1 -1
- package/build-module/border-box-control/styles.js.map +1 -1
- package/build-module/border-box-control/utils.js.map +1 -1
- package/build-module/border-control/border-control/component.js +1 -2
- package/build-module/border-control/border-control/component.js.map +1 -1
- package/build-module/border-control/border-control/hook.js.map +1 -1
- package/build-module/border-control/border-control-dropdown/component.js +1 -3
- package/build-module/border-control/border-control-dropdown/component.js.map +1 -1
- package/build-module/border-control/styles.js.map +1 -1
- package/build-module/box-control/all-input-control.js +1 -3
- package/build-module/box-control/all-input-control.js.map +1 -1
- package/build-module/box-control/axial-input-controls.js +1 -3
- package/build-module/box-control/axial-input-controls.js.map +1 -1
- package/build-module/box-control/icon.js +1 -2
- package/build-module/box-control/icon.js.map +1 -1
- package/build-module/box-control/index.js +1 -2
- package/build-module/box-control/index.js.map +1 -1
- package/build-module/box-control/input-controls.js +1 -3
- package/build-module/box-control/input-controls.js.map +1 -1
- package/build-module/button/index.js +1 -3
- package/build-module/button/index.js.map +1 -1
- package/build-module/button/index.native.js +2 -3
- package/build-module/button/index.native.js.map +1 -1
- package/build-module/card/card/component.js +2 -3
- package/build-module/card/card/component.js.map +1 -1
- package/build-module/card/styles.js.map +1 -1
- package/build-module/checkbox-control/index.js +1 -2
- package/build-module/checkbox-control/index.js.map +1 -1
- package/build-module/circular-option-picker/circular-option-picker-option.js +1 -2
- package/build-module/circular-option-picker/circular-option-picker-option.js.map +1 -1
- package/build-module/circular-option-picker/circular-option-picker.js +1 -2
- package/build-module/circular-option-picker/circular-option-picker.js.map +1 -1
- package/build-module/color-indicator/index.native.js +1 -2
- package/build-module/color-indicator/index.native.js.map +1 -1
- package/build-module/color-palette/index.js +1 -2
- package/build-module/color-palette/index.js.map +1 -1
- package/build-module/color-palette/index.native.js +3 -4
- package/build-module/color-palette/index.native.js.map +1 -1
- package/build-module/color-picker/component.js +1 -2
- package/build-module/color-picker/component.js.map +1 -1
- package/build-module/color-picker/hsl-input.js +1 -3
- package/build-module/color-picker/hsl-input.js.map +1 -1
- package/build-module/color-picker/hsv-color-picker.native.js +1 -2
- package/build-module/color-picker/hsv-color-picker.native.js.map +1 -1
- package/build-module/color-picker/hue-picker.native.js +1 -2
- package/build-module/color-picker/hue-picker.native.js.map +1 -1
- package/build-module/color-picker/index.native.js +1 -3
- package/build-module/color-picker/index.native.js.map +1 -1
- package/build-module/color-picker/input-with-slider.js +1 -2
- package/build-module/color-picker/input-with-slider.js.map +1 -1
- package/build-module/color-picker/rgb-input.js +1 -3
- package/build-module/color-picker/rgb-input.js.map +1 -1
- package/build-module/color-picker/saturation-picker.native.js +1 -2
- package/build-module/color-picker/saturation-picker.native.js.map +1 -1
- package/build-module/color-picker/styles.js.map +1 -1
- package/build-module/combobox-control/index.js +2 -3
- package/build-module/combobox-control/index.js.map +1 -1
- package/build-module/composite/legacy/index.js.map +1 -1
- package/build-module/confirm-dialog/component.js +1 -3
- package/build-module/confirm-dialog/component.js.map +1 -1
- package/build-module/context/context-connect.js +1 -0
- package/build-module/context/context-connect.js.map +1 -1
- package/build-module/context/context-system-provider.js +1 -1
- package/build-module/context/context-system-provider.js.map +1 -1
- package/build-module/context/get-styled-class-name-from-key.js.map +1 -1
- package/build-module/custom-gradient-picker/gradient-bar/control-points.js +1 -3
- package/build-module/custom-gradient-picker/gradient-bar/control-points.js.map +1 -1
- package/build-module/custom-gradient-picker/gradient-bar/index.js +1 -2
- package/build-module/custom-gradient-picker/gradient-bar/index.js.map +1 -1
- package/build-module/custom-gradient-picker/index.js +1 -2
- package/build-module/custom-gradient-picker/index.js.map +1 -1
- package/build-module/custom-gradient-picker/index.native.js +1 -3
- package/build-module/custom-gradient-picker/index.native.js.map +1 -1
- package/build-module/custom-gradient-picker/serializer.js.map +1 -1
- package/build-module/custom-gradient-picker/utils.js.map +1 -1
- package/build-module/custom-select-control/index.js +1 -3
- package/build-module/custom-select-control/index.js.map +1 -1
- package/build-module/custom-select-control-v2/custom-select.js +1 -2
- package/build-module/custom-select-control-v2/custom-select.js.map +1 -1
- package/build-module/custom-select-control-v2/item.js +1 -2
- package/build-module/custom-select-control-v2/item.js.map +1 -1
- package/build-module/custom-select-control-v2/styles.js.map +1 -1
- package/build-module/dashicon/index.js.map +1 -1
- package/build-module/date-time/date/index.js +1 -2
- package/build-module/date-time/date/index.js.map +1 -1
- package/build-module/date-time/date/styles.js.map +1 -1
- package/build-module/date-time/date-time/index.js +1 -3
- package/build-module/date-time/date-time/index.js.map +1 -1
- package/build-module/date-time/time/index.js +1 -2
- package/build-module/date-time/time/index.js.map +1 -1
- package/build-module/date-time/time/time-input/index.js +1 -2
- package/build-module/date-time/time/time-input/index.js.map +1 -1
- package/build-module/date-time/time/timezone.js.map +1 -1
- package/build-module/dimension-control/index.js +1 -3
- package/build-module/dimension-control/index.js.map +1 -1
- package/build-module/draggable/index.js +1 -3
- package/build-module/draggable/index.js.map +1 -1
- package/build-module/drop-zone/index.js +2 -4
- package/build-module/drop-zone/index.js.map +1 -1
- package/build-module/dropdown/index.js +1 -2
- package/build-module/dropdown/index.js.map +1 -1
- package/build-module/dropdown/index.native.js +1 -2
- package/build-module/dropdown/index.native.js.map +1 -1
- package/build-module/dropdown-menu/index.js +1 -2
- package/build-module/dropdown-menu/index.js.map +1 -1
- package/build-module/dropdown-menu/index.native.js +1 -2
- package/build-module/dropdown-menu/index.native.js.map +1 -1
- package/build-module/dropdown-menu-v2/checkbox-item.js +1 -2
- package/build-module/dropdown-menu-v2/checkbox-item.js.map +1 -1
- package/build-module/dropdown-menu-v2/index.js +1 -3
- package/build-module/dropdown-menu-v2/index.js.map +1 -1
- package/build-module/dropdown-menu-v2/item.js +1 -2
- package/build-module/dropdown-menu-v2/item.js.map +1 -1
- package/build-module/dropdown-menu-v2/radio-item.js +1 -2
- package/build-module/dropdown-menu-v2/radio-item.js.map +1 -1
- package/build-module/dropdown-menu-v2/styles.js.map +1 -1
- package/build-module/duotone-picker/color-list-picker/index.js +1 -3
- package/build-module/duotone-picker/color-list-picker/index.js.map +1 -1
- package/build-module/duotone-picker/duotone-picker.js +1 -2
- package/build-module/duotone-picker/duotone-picker.js.map +1 -1
- package/build-module/duotone-picker/utils.js.map +1 -1
- package/build-module/elevation/hook.js.map +1 -1
- package/build-module/external-link/index.js +21 -25
- package/build-module/external-link/index.js.map +1 -1
- package/build-module/external-link/index.native.js +1 -2
- package/build-module/external-link/index.native.js.map +1 -1
- package/build-module/focal-point-picker/controls.js +1 -2
- package/build-module/focal-point-picker/controls.js.map +1 -1
- package/build-module/focal-point-picker/focal-point.native.js +1 -2
- package/build-module/focal-point-picker/focal-point.native.js.map +1 -1
- package/build-module/focal-point-picker/grid.js +1 -2
- package/build-module/focal-point-picker/grid.js.map +1 -1
- package/build-module/focal-point-picker/index.js +1 -2
- package/build-module/focal-point-picker/index.js.map +1 -1
- package/build-module/focal-point-picker/index.native.js +1 -2
- package/build-module/focal-point-picker/index.native.js.map +1 -1
- package/build-module/focal-point-picker/styles/focal-point-style.js.map +1 -1
- package/build-module/focal-point-picker/tooltip/index.native.js +1 -2
- package/build-module/focal-point-picker/tooltip/index.native.js.map +1 -1
- package/build-module/font-size-picker/index.js +1 -2
- package/build-module/font-size-picker/index.js.map +1 -1
- package/build-module/font-size-picker/index.native.js +1 -3
- package/build-module/font-size-picker/index.native.js.map +1 -1
- package/build-module/form-file-upload/index.js +1 -2
- package/build-module/form-file-upload/index.js.map +1 -1
- package/build-module/form-toggle/index.js +1 -2
- package/build-module/form-toggle/index.js.map +1 -1
- package/build-module/form-token-field/index.js +3 -3
- package/build-module/form-token-field/index.js.map +1 -1
- package/build-module/form-token-field/suggestions-list.js +1 -2
- package/build-module/form-token-field/suggestions-list.js.map +1 -1
- package/build-module/form-token-field/token-input.js.map +1 -1
- package/build-module/form-token-field/token.js +2 -3
- package/build-module/form-token-field/token.js.map +1 -1
- package/build-module/gradient-picker/index.js +1 -2
- package/build-module/gradient-picker/index.js.map +1 -1
- package/build-module/grid/hook.js.map +1 -1
- package/build-module/guide/index.js +1 -2
- package/build-module/guide/index.js.map +1 -1
- package/build-module/guide/page-control.js +1 -1
- package/build-module/guide/page-control.js.map +1 -1
- package/build-module/h-stack/hook.js.map +1 -1
- package/build-module/heading/hook.js.map +1 -1
- package/build-module/higher-order/with-fallback-styles/index.js +3 -4
- package/build-module/higher-order/with-fallback-styles/index.js.map +1 -1
- package/build-module/input-control/index.js.map +1 -1
- package/build-module/input-control/input-base.js +1 -2
- package/build-module/input-control/input-base.js.map +1 -1
- package/build-module/input-control/styles/input-control-styles.js.map +1 -1
- package/build-module/item-group/styles.js.map +1 -1
- package/build-module/keyboard-shortcuts/index.js +1 -3
- package/build-module/keyboard-shortcuts/index.js.map +1 -1
- package/build-module/menu-group/index.js +1 -2
- package/build-module/menu-group/index.js.map +1 -1
- package/build-module/menu-item/index.js +1 -2
- package/build-module/menu-item/index.js.map +1 -1
- package/build-module/menu-items-choice/index.js +1 -2
- package/build-module/menu-items-choice/index.js.map +1 -1
- package/build-module/mobile/badge/index.native.js +1 -3
- package/build-module/mobile/badge/index.native.js.map +1 -1
- package/build-module/mobile/bottom-sheet/bottom-sheet-navigation/navigation-screen.native.js +1 -2
- package/build-module/mobile/bottom-sheet/bottom-sheet-navigation/navigation-screen.native.js.map +1 -1
- package/build-module/mobile/bottom-sheet/cell.native.js +5 -6
- package/build-module/mobile/bottom-sheet/cell.native.js.map +1 -1
- package/build-module/mobile/bottom-sheet/color-cell.native.js +1 -2
- package/build-module/mobile/bottom-sheet/color-cell.native.js.map +1 -1
- package/build-module/mobile/bottom-sheet/index.native.js +1 -3
- package/build-module/mobile/bottom-sheet/index.native.js.map +1 -1
- package/build-module/mobile/bottom-sheet/link-suggestion-item-cell.native.js +1 -2
- package/build-module/mobile/bottom-sheet/link-suggestion-item-cell.native.js.map +1 -1
- package/build-module/mobile/bottom-sheet/nav-bar/back-button.native.js +1 -2
- package/build-module/mobile/bottom-sheet/nav-bar/back-button.native.js.map +1 -1
- package/build-module/mobile/bottom-sheet/range-cell.native.js +2 -3
- package/build-module/mobile/bottom-sheet/range-cell.native.js.map +1 -1
- package/build-module/mobile/bottom-sheet/range-text-input.native.js +1 -2
- package/build-module/mobile/bottom-sheet/range-text-input.native.js.map +1 -1
- package/build-module/mobile/bottom-sheet/stepper-cell/index.native.js +2 -3
- package/build-module/mobile/bottom-sheet/stepper-cell/index.native.js.map +1 -1
- package/build-module/mobile/bottom-sheet/stepper-cell/stepper.android.js +1 -2
- package/build-module/mobile/bottom-sheet/stepper-cell/stepper.android.js.map +1 -1
- package/build-module/mobile/bottom-sheet/stepper-cell/stepper.ios.js +1 -2
- package/build-module/mobile/bottom-sheet/stepper-cell/stepper.ios.js.map +1 -1
- package/build-module/mobile/bottom-sheet/sub-sheet/index.native.js +1 -3
- package/build-module/mobile/bottom-sheet/sub-sheet/index.native.js.map +1 -1
- package/build-module/mobile/bottom-sheet/switch-cell.native.js +4 -4
- package/build-module/mobile/bottom-sheet/switch-cell.native.js.map +1 -1
- package/build-module/mobile/bottom-sheet-select-control/index.native.js +1 -3
- package/build-module/mobile/bottom-sheet-select-control/index.native.js.map +1 -1
- package/build-module/mobile/bottom-sheet-text-control/index.native.js +1 -3
- package/build-module/mobile/bottom-sheet-text-control/index.native.js.map +1 -1
- package/build-module/mobile/color-settings/gradient-picker-screen.native.js +1 -2
- package/build-module/mobile/color-settings/gradient-picker-screen.native.js.map +1 -1
- package/build-module/mobile/color-settings/index.native.js +1 -2
- package/build-module/mobile/color-settings/index.native.js.map +1 -1
- package/build-module/mobile/color-settings/palette.screen.native.js +1 -3
- package/build-module/mobile/color-settings/palette.screen.native.js.map +1 -1
- package/build-module/mobile/cycle-select-control/index.native.js.map +1 -1
- package/build-module/mobile/focal-point-settings-panel/index.native.js +1 -2
- package/build-module/mobile/focal-point-settings-panel/index.native.js.map +1 -1
- package/build-module/mobile/gradient/index.native.js +1 -2
- package/build-module/mobile/gradient/index.native.js.map +1 -1
- package/build-module/mobile/html-text-input/index.native.js +1 -2
- package/build-module/mobile/html-text-input/index.native.js.map +1 -1
- package/build-module/mobile/image/icon-retry.native.js +1 -2
- package/build-module/mobile/image/icon-retry.native.js.map +1 -1
- package/build-module/mobile/image/image-editing-button.native.js +1 -2
- package/build-module/mobile/image/image-editing-button.native.js.map +1 -1
- package/build-module/mobile/image/index.native.js +1 -3
- package/build-module/mobile/image/index.native.js.map +1 -1
- package/build-module/mobile/keyboard-avoiding-view/index.ios.js +1 -2
- package/build-module/mobile/keyboard-avoiding-view/index.ios.js.map +1 -1
- package/build-module/mobile/link-picker/index.native.js +2 -3
- package/build-module/mobile/link-picker/index.native.js.map +1 -1
- package/build-module/mobile/link-picker/link-picker-results.native.js.map +1 -1
- package/build-module/mobile/link-settings/index.native.js +1 -3
- package/build-module/mobile/link-settings/index.native.js.map +1 -1
- package/build-module/mobile/link-settings/link-settings-navigation.native.js +1 -2
- package/build-module/mobile/link-settings/link-settings-navigation.native.js.map +1 -1
- package/build-module/mobile/picker/index.android.js +1 -2
- package/build-module/mobile/picker/index.android.js.map +1 -1
- package/build-module/mobile/segmented-control/index.native.js +1 -2
- package/build-module/mobile/segmented-control/index.native.js.map +1 -1
- package/build-module/mobile/utils/get-px-from-css-unit.native.js.map +1 -1
- package/build-module/mobile/utils/use-unit-converter-to-mobile.native.js.map +1 -1
- package/build-module/modal/aria-helper.js +2 -1
- package/build-module/modal/aria-helper.js.map +1 -1
- package/build-module/modal/index.js +3 -4
- package/build-module/modal/index.js.map +1 -1
- package/build-module/modal/use-modal-exit-animation.js.map +1 -1
- package/build-module/navigation/back-button/index.js +1 -2
- package/build-module/navigation/back-button/index.js.map +1 -1
- package/build-module/navigation/group/index.js +1 -2
- package/build-module/navigation/group/index.js.map +1 -1
- package/build-module/navigation/item/base-content.js +1 -3
- package/build-module/navigation/item/base-content.js.map +1 -1
- package/build-module/navigation/item/base.js.map +1 -1
- package/build-module/navigation/item/index.js +1 -2
- package/build-module/navigation/item/index.js.map +1 -1
- package/build-module/navigation/menu/index.js +1 -2
- package/build-module/navigation/menu/index.js.map +1 -1
- package/build-module/navigation/menu/menu-title-search.js +2 -2
- package/build-module/navigation/menu/menu-title-search.js.map +1 -1
- package/build-module/navigation/menu/menu-title.js +1 -2
- package/build-module/navigation/menu/menu-title.js.map +1 -1
- package/build-module/navigation/menu/search-no-results-found.js +1 -2
- package/build-module/navigation/menu/search-no-results-found.js.map +1 -1
- package/build-module/navigation/styles/navigation-styles.js.map +1 -1
- package/build-module/navigator/navigator/component.js.map +1 -1
- package/build-module/navigator/navigator-button/hook.js.map +1 -1
- package/build-module/notice/index.js +1 -2
- package/build-module/notice/index.js.map +1 -1
- package/build-module/notice/index.native.js +1 -3
- package/build-module/notice/index.native.js.map +1 -1
- package/build-module/number-control/index.js +1 -3
- package/build-module/number-control/index.js.map +1 -1
- package/build-module/number-control/styles/number-control-styles.js.map +1 -1
- package/build-module/palette-edit/index.js +25 -5
- package/build-module/palette-edit/index.js.map +1 -1
- package/build-module/panel/actions.native.js +1 -2
- package/build-module/panel/actions.native.js.map +1 -1
- package/build-module/panel/body.js +1 -2
- package/build-module/panel/body.js.map +1 -1
- package/build-module/panel/body.native.js +1 -2
- package/build-module/panel/body.native.js.map +1 -1
- package/build-module/panel/header.js +1 -2
- package/build-module/panel/header.js.map +1 -1
- package/build-module/panel/index.js +1 -2
- package/build-module/panel/index.js.map +1 -1
- package/build-module/placeholder/index.js +1 -2
- package/build-module/placeholder/index.js.map +1 -1
- package/build-module/popover/index.js +2 -4
- package/build-module/popover/index.js.map +1 -1
- package/build-module/popover/overlay-middlewares.js.map +1 -1
- package/build-module/popover/utils.js.map +1 -1
- package/build-module/progress-bar/index.js +1 -2
- package/build-module/progress-bar/index.js.map +1 -1
- package/build-module/progress-bar/styles.js.map +1 -1
- package/build-module/query-controls/index.js.map +1 -1
- package/build-module/query-controls/index.native.js +1 -3
- package/build-module/query-controls/index.native.js.map +1 -1
- package/build-module/radio-control/index.js +1 -2
- package/build-module/radio-control/index.js.map +1 -1
- package/build-module/radio-control/index.native.js +1 -2
- package/build-module/radio-control/index.native.js.map +1 -1
- package/build-module/range-control/index.js +1 -2
- package/build-module/range-control/index.js.map +1 -1
- package/build-module/range-control/index.native.js.map +1 -1
- package/build-module/range-control/mark.js +1 -3
- package/build-module/range-control/mark.js.map +1 -1
- package/build-module/range-control/rail.js +1 -3
- package/build-module/range-control/rail.js.map +1 -1
- package/build-module/range-control/styles/range-control-styles.js +32 -32
- package/build-module/range-control/styles/range-control-styles.js.map +1 -1
- package/build-module/range-control/tooltip.js +1 -1
- package/build-module/range-control/tooltip.js.map +1 -1
- package/build-module/range-control/utils.js.map +1 -1
- package/build-module/resizable-box/index.js +1 -2
- package/build-module/resizable-box/index.js.map +1 -1
- package/build-module/resizable-box/resize-tooltip/index.js +1 -2
- package/build-module/resizable-box/resize-tooltip/index.js.map +1 -1
- package/build-module/resizable-box/resize-tooltip/label.js.map +1 -1
- package/build-module/resizable-box/resize-tooltip/utils.js.map +1 -1
- package/build-module/responsive-wrapper/index.js.map +1 -1
- package/build-module/sandbox/index.js +1 -2
- package/build-module/sandbox/index.js.map +1 -1
- package/build-module/sandbox/index.native.js +1 -2
- package/build-module/sandbox/index.native.js.map +1 -1
- package/build-module/search-control/index.js +6 -0
- package/build-module/search-control/index.js.map +1 -1
- package/build-module/search-control/index.native.js +1 -2
- package/build-module/search-control/index.native.js.map +1 -1
- package/build-module/search-control/types.js.map +1 -1
- package/build-module/select-control/index.js.map +1 -1
- package/build-module/select-control/index.native.js.map +1 -1
- package/build-module/slot-fill/index.js +1 -3
- package/build-module/slot-fill/index.js.map +1 -1
- package/build-module/slot-fill/slot.js +1 -2
- package/build-module/slot-fill/slot.js.map +1 -1
- package/build-module/snackbar/index.js +1 -2
- package/build-module/snackbar/index.js.map +1 -1
- package/build-module/snackbar/list.js +1 -2
- package/build-module/snackbar/list.js.map +1 -1
- package/build-module/spinner/index.js +1 -2
- package/build-module/spinner/index.js.map +1 -1
- package/build-module/spinner/styles.js.map +1 -1
- package/build-module/style-provider/index.js +1 -0
- package/build-module/style-provider/index.js.map +1 -1
- package/build-module/surface/hook.js.map +1 -1
- package/build-module/surface/styles.js.map +1 -1
- package/build-module/tab-panel/index.js +1 -2
- package/build-module/tab-panel/index.js.map +1 -1
- package/build-module/tabs/index.js.map +1 -1
- package/build-module/tabs/styles.js +28 -6
- package/build-module/tabs/styles.js.map +1 -1
- package/build-module/tabs/tab.js +9 -4
- package/build-module/tabs/tab.js.map +1 -1
- package/build-module/tabs/tablist.js +47 -48
- package/build-module/tabs/tablist.js.map +1 -1
- package/build-module/tabs/tabpanel.js.map +1 -1
- package/build-module/text/get-line-height.js.map +1 -1
- package/build-module/text/styles/text-mixins.native.js.map +1 -1
- package/build-module/text/utils.js.map +1 -1
- package/build-module/text-control/index.native.js.map +1 -1
- package/build-module/text-highlight/index.js +1 -2
- package/build-module/text-highlight/index.js.map +1 -1
- package/build-module/textarea-control/index.js.map +1 -1
- package/build-module/theme/color-algorithms.js.map +1 -1
- package/build-module/theme/styles.js.map +1 -1
- package/build-module/tip/index.js +1 -2
- package/build-module/tip/index.js.map +1 -1
- package/build-module/toggle-control/index.js +1 -2
- package/build-module/toggle-control/index.js.map +1 -1
- package/build-module/toggle-control/index.native.js.map +1 -1
- package/build-module/toggle-group-control/toggle-group-control/as-radio-group.js +10 -2
- package/build-module/toggle-group-control/toggle-group-control/as-radio-group.js.map +1 -1
- package/build-module/toggle-group-control/toggle-group-control/component.js +4 -65
- package/build-module/toggle-group-control/toggle-group-control/component.js.map +1 -1
- package/build-module/toggle-group-control/toggle-group-control-option-base/component.js +11 -12
- package/build-module/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -1
- package/build-module/toggle-group-control/types.js.map +1 -1
- package/build-module/toolbar/toolbar/index.js.map +1 -1
- package/build-module/toolbar/toolbar-button/toolbar-button-container.native.js +2 -2
- package/build-module/toolbar/toolbar-button/toolbar-button-container.native.js.map +1 -1
- package/build-module/toolbar/toolbar-group/index.js +1 -2
- package/build-module/toolbar/toolbar-group/index.js.map +1 -1
- package/build-module/tools-panel/styles.js.map +1 -1
- package/build-module/tools-panel/tools-panel/component.js +1 -2
- package/build-module/tools-panel/tools-panel/component.js.map +1 -1
- package/build-module/tools-panel/tools-panel-header/component.js +1 -3
- package/build-module/tools-panel/tools-panel-header/component.js.map +1 -1
- package/build-module/tooltip/index.js +6 -3
- package/build-module/tooltip/index.js.map +1 -1
- package/build-module/tooltip/index.native.js +1 -3
- package/build-module/tooltip/index.native.js.map +1 -1
- package/build-module/tree-grid/cell.js +1 -2
- package/build-module/tree-grid/cell.js.map +1 -1
- package/build-module/unit-control/index.js.map +1 -1
- package/build-module/unit-control/index.native.js +1 -3
- package/build-module/unit-control/index.native.js.map +1 -1
- package/build-module/unit-control/utils.js.map +1 -1
- package/build-module/utils/breakpoint.js.map +1 -1
- package/build-module/utils/colors-values.js.map +1 -1
- package/build-module/utils/config-values.js.map +1 -1
- package/build-module/utils/font-size.js.map +1 -1
- package/build-module/utils/hooks/use-animated-offset-rect.js +74 -0
- package/build-module/utils/hooks/use-animated-offset-rect.js.map +1 -0
- package/build-module/utils/hooks/use-cx.js.map +1 -1
- package/build-module/utils/math.js +2 -2
- package/build-module/utils/math.js.map +1 -1
- package/build-module/utils/space.js.map +1 -1
- package/build-module/utils/unit-values.js.map +1 -1
- package/build-module/utils/use-responsive-value.js.map +1 -1
- package/build-style/style-rtl.css +8 -5
- package/build-style/style.css +8 -5
- package/build-types/alignment-matrix-control/types.d.ts +2 -0
- package/build-types/alignment-matrix-control/types.d.ts.map +1 -1
- package/build-types/drop-zone/index.d.ts.map +1 -1
- package/build-types/modal/aria-helper.d.ts.map +1 -1
- package/build-types/palette-edit/index.d.ts +3 -0
- package/build-types/palette-edit/index.d.ts.map +1 -1
- package/build-types/range-control/styles/range-control-styles.d.ts +1 -1
- package/build-types/range-control/styles/range-control-styles.d.ts.map +1 -1
- package/build-types/search-control/index.d.ts.map +1 -1
- package/build-types/search-control/stories/index.story.d.ts +0 -8
- package/build-types/search-control/stories/index.story.d.ts.map +1 -1
- package/build-types/search-control/types.d.ts +3 -0
- package/build-types/search-control/types.d.ts.map +1 -1
- package/build-types/tabs/styles.d.ts +7 -0
- package/build-types/tabs/styles.d.ts.map +1 -1
- package/build-types/tabs/tab.d.ts.map +1 -1
- package/build-types/tabs/tablist.d.ts.map +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/types.d.ts +1 -0
- package/build-types/toggle-group-control/types.d.ts.map +1 -1
- package/build-types/tooltip/index.d.ts.map +1 -1
- package/build-types/utils/hooks/use-animated-offset-rect.d.ts +62 -0
- package/build-types/utils/hooks/use-animated-offset-rect.d.ts.map +1 -0
- package/package.json +20 -20
- package/schemas/docs-manifest.json +38 -0
- package/src/alignment-matrix-control/README.md +46 -36
- package/src/alignment-matrix-control/docs-manifest.json +12 -0
- package/src/alignment-matrix-control/types.ts +2 -0
- package/src/angle-picker-control/README.md +36 -23
- package/src/angle-picker-control/docs-manifest.json +5 -0
- package/src/button/style.scss +5 -1
- package/src/composite/test/index.tsx +629 -38
- package/src/drop-zone/index.tsx +1 -2
- package/src/drop-zone/style.scss +1 -1
- package/src/modal/aria-helper.ts +1 -0
- package/src/palette-edit/index.tsx +30 -5
- package/src/palette-edit/test/index.tsx +50 -1
- package/src/range-control/styles/range-control-styles.ts +19 -10
- package/src/range-control/tooltip.tsx +1 -1
- package/src/search-control/README.md +2 -0
- package/src/search-control/index.tsx +7 -0
- package/src/search-control/stories/index.story.tsx +0 -15
- package/src/search-control/test/index.tsx +4 -1
- package/src/search-control/types.ts +3 -0
- package/src/tabs/styles.ts +116 -47
- package/src/tabs/tab.tsx +8 -2
- package/src/tabs/tablist.tsx +48 -49
- package/src/toggle-group-control/test/__snapshots__/index.tsx.snap +6 -6
- package/src/toggle-group-control/test/index.tsx +39 -0
- package/src/toggle-group-control/toggle-group-control/as-radio-group.tsx +11 -1
- package/src/toggle-group-control/toggle-group-control/component.tsx +3 -98
- package/src/toggle-group-control/toggle-group-control-option-base/component.tsx +15 -15
- package/src/toggle-group-control/types.ts +1 -0
- package/src/tooltip/index.tsx +8 -1
- package/src/tooltip/test/index.tsx +78 -0
- package/src/utils/hooks/use-animated-offset-rect.ts +107 -0
- package/tsconfig.tsbuildinfo +1 -1
package/src/tabs/tablist.tsx
CHANGED
|
@@ -19,11 +19,43 @@ import { useTabsContext } from './context';
|
|
|
19
19
|
import { TabListWrapper } from './styles';
|
|
20
20
|
import type { WordPressComponentProps } from '../context';
|
|
21
21
|
import clsx from 'clsx';
|
|
22
|
+
import type { ElementOffsetRect } from '../utils/element-rect';
|
|
22
23
|
import { useTrackElementOffsetRect } from '../utils/element-rect';
|
|
23
|
-
import { useOnValueUpdate } from '../utils/hooks/use-on-value-update';
|
|
24
24
|
import { useTrackOverflow } from './use-track-overflow';
|
|
25
|
+
import { useAnimatedOffsetRect } from '../utils/hooks/use-animated-offset-rect';
|
|
25
26
|
|
|
26
|
-
const
|
|
27
|
+
const DEFAULT_SCROLL_MARGIN = 24;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Scrolls a given parent element so that a given rect is visible.
|
|
31
|
+
*
|
|
32
|
+
* The scroll is updated initially and whenever the rect changes.
|
|
33
|
+
*/
|
|
34
|
+
function useScrollRectIntoView(
|
|
35
|
+
parent: HTMLElement | undefined,
|
|
36
|
+
rect: ElementOffsetRect,
|
|
37
|
+
{ margin = DEFAULT_SCROLL_MARGIN } = {}
|
|
38
|
+
) {
|
|
39
|
+
useLayoutEffect( () => {
|
|
40
|
+
if ( ! parent || ! rect ) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const { scrollLeft: parentScroll } = parent;
|
|
45
|
+
const parentWidth = parent.getBoundingClientRect().width;
|
|
46
|
+
const { left: childLeft, width: childWidth } = rect;
|
|
47
|
+
|
|
48
|
+
const parentRightEdge = parentScroll + parentWidth;
|
|
49
|
+
const childRightEdge = childLeft + childWidth;
|
|
50
|
+
const rightOverflow = childRightEdge + margin - parentRightEdge;
|
|
51
|
+
const leftOverflow = parentScroll - ( childLeft - margin );
|
|
52
|
+
if ( leftOverflow > 0 ) {
|
|
53
|
+
parent.scrollLeft = parentScroll - leftOverflow;
|
|
54
|
+
} else if ( rightOverflow > 0 ) {
|
|
55
|
+
parent.scrollLeft = parentScroll + rightOverflow;
|
|
56
|
+
}
|
|
57
|
+
}, [ margin, parent, rect ] );
|
|
58
|
+
}
|
|
27
59
|
|
|
28
60
|
export const TabList = forwardRef<
|
|
29
61
|
HTMLDivElement,
|
|
@@ -35,44 +67,27 @@ export const TabList = forwardRef<
|
|
|
35
67
|
const activeId = useStoreState( store, 'activeId' );
|
|
36
68
|
const selectOnMove = useStoreState( store, 'selectOnMove' );
|
|
37
69
|
const items = useStoreState( store, 'items' );
|
|
38
|
-
const [ parent, setParent ] = useState< HTMLElement
|
|
70
|
+
const [ parent, setParent ] = useState< HTMLElement >();
|
|
39
71
|
const refs = useMergeRefs( [ ref, setParent ] );
|
|
72
|
+
const selectedRect = useTrackElementOffsetRect(
|
|
73
|
+
store?.item( selectedId )?.element
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
// Track overflow to show scroll hints.
|
|
40
77
|
const overflow = useTrackOverflow( parent, {
|
|
41
78
|
first: items?.at( 0 )?.element,
|
|
42
79
|
last: items?.at( -1 )?.element,
|
|
43
80
|
} );
|
|
44
81
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
useOnValueUpdate( selectedId, ( { previousValue } ) => {
|
|
51
|
-
if ( previousValue ) {
|
|
52
|
-
setAnimationEnabled( true );
|
|
53
|
-
}
|
|
82
|
+
// Size, position, and animate the indicator.
|
|
83
|
+
useAnimatedOffsetRect( parent, selectedRect, {
|
|
84
|
+
prefix: 'selected',
|
|
85
|
+
dataAttribute: 'indicator-animated',
|
|
86
|
+
transitionEndFilter: ( event ) => event.pseudoElement === '::before',
|
|
54
87
|
} );
|
|
55
88
|
|
|
56
89
|
// Make sure selected tab is scrolled into view.
|
|
57
|
-
|
|
58
|
-
if ( ! parent || ! selectedTabPosition ) {
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const { scrollLeft: parentScroll } = parent;
|
|
63
|
-
const parentWidth = parent.getBoundingClientRect().width;
|
|
64
|
-
const { left: childLeft, width: childWidth } = selectedTabPosition;
|
|
65
|
-
|
|
66
|
-
const parentRightEdge = parentScroll + parentWidth;
|
|
67
|
-
const childRightEdge = childLeft + childWidth;
|
|
68
|
-
const rightOverflow = childRightEdge + SCROLL_MARGIN - parentRightEdge;
|
|
69
|
-
const leftOverflow = parentScroll - ( childLeft - SCROLL_MARGIN );
|
|
70
|
-
if ( leftOverflow > 0 ) {
|
|
71
|
-
parent.scrollLeft = parentScroll - leftOverflow;
|
|
72
|
-
} else if ( rightOverflow > 0 ) {
|
|
73
|
-
parent.scrollLeft = parentScroll + rightOverflow;
|
|
74
|
-
}
|
|
75
|
-
}, [ parent, selectedTabPosition ] );
|
|
90
|
+
useScrollRectIntoView( parent, selectedRect );
|
|
76
91
|
|
|
77
92
|
const onBlur = () => {
|
|
78
93
|
if ( ! selectOnMove ) {
|
|
@@ -97,30 +112,14 @@ export const TabList = forwardRef<
|
|
|
97
112
|
<Ariakit.TabList
|
|
98
113
|
ref={ refs }
|
|
99
114
|
store={ store }
|
|
100
|
-
render={
|
|
101
|
-
<TabListWrapper
|
|
102
|
-
onTransitionEnd={ ( event ) => {
|
|
103
|
-
if ( event.pseudoElement === '::before' ) {
|
|
104
|
-
setAnimationEnabled( false );
|
|
105
|
-
}
|
|
106
|
-
} }
|
|
107
|
-
/>
|
|
108
|
-
}
|
|
115
|
+
render={ <TabListWrapper /> }
|
|
109
116
|
onBlur={ onBlur }
|
|
110
117
|
tabIndex={ -1 }
|
|
118
|
+
data-select-on-move={ selectOnMove ? 'true' : 'false' }
|
|
111
119
|
{ ...otherProps }
|
|
112
|
-
style={ {
|
|
113
|
-
'--indicator-top': selectedTabPosition.top,
|
|
114
|
-
'--indicator-right': selectedTabPosition.right,
|
|
115
|
-
'--indicator-left': selectedTabPosition.left,
|
|
116
|
-
'--indicator-width': selectedTabPosition.width,
|
|
117
|
-
'--indicator-height': selectedTabPosition.height,
|
|
118
|
-
...otherProps.style,
|
|
119
|
-
} }
|
|
120
120
|
className={ clsx(
|
|
121
121
|
overflow.first && 'is-overflowing-first',
|
|
122
122
|
overflow.last && 'is-overflowing-last',
|
|
123
|
-
animationEnabled && 'is-animation-enabled',
|
|
124
123
|
otherProps.className
|
|
125
124
|
) }
|
|
126
125
|
>
|
|
@@ -283,7 +283,7 @@ exports[`ToggleGroupControl controlled should render correctly with icons 1`] =
|
|
|
283
283
|
class="components-toggle-group-control emotion-8 emotion-9"
|
|
284
284
|
data-wp-c16t="true"
|
|
285
285
|
data-wp-component="ToggleGroupControl"
|
|
286
|
-
id="toggle-group-control-as-radio-group-
|
|
286
|
+
id="toggle-group-control-as-radio-group-12"
|
|
287
287
|
role="radiogroup"
|
|
288
288
|
>
|
|
289
289
|
<div
|
|
@@ -297,7 +297,7 @@ exports[`ToggleGroupControl controlled should render correctly with icons 1`] =
|
|
|
297
297
|
data-value="uppercase"
|
|
298
298
|
data-wp-c16t="true"
|
|
299
299
|
data-wp-component="ToggleGroupControlOptionBase"
|
|
300
|
-
id="toggle-group-control-as-radio-group-
|
|
300
|
+
id="toggle-group-control-as-radio-group-12-32"
|
|
301
301
|
role="radio"
|
|
302
302
|
type="button"
|
|
303
303
|
value="uppercase"
|
|
@@ -330,7 +330,7 @@ exports[`ToggleGroupControl controlled should render correctly with icons 1`] =
|
|
|
330
330
|
data-value="lowercase"
|
|
331
331
|
data-wp-c16t="true"
|
|
332
332
|
data-wp-component="ToggleGroupControlOptionBase"
|
|
333
|
-
id="toggle-group-control-as-radio-group-
|
|
333
|
+
id="toggle-group-control-as-radio-group-12-33"
|
|
334
334
|
role="radio"
|
|
335
335
|
type="button"
|
|
336
336
|
value="lowercase"
|
|
@@ -575,7 +575,7 @@ exports[`ToggleGroupControl controlled should render correctly with text options
|
|
|
575
575
|
class="components-toggle-group-control emotion-8 emotion-9"
|
|
576
576
|
data-wp-c16t="true"
|
|
577
577
|
data-wp-component="ToggleGroupControl"
|
|
578
|
-
id="toggle-group-control-as-radio-group-
|
|
578
|
+
id="toggle-group-control-as-radio-group-11"
|
|
579
579
|
role="radiogroup"
|
|
580
580
|
>
|
|
581
581
|
<div
|
|
@@ -588,7 +588,7 @@ exports[`ToggleGroupControl controlled should render correctly with text options
|
|
|
588
588
|
data-value="rigas"
|
|
589
589
|
data-wp-c16t="true"
|
|
590
590
|
data-wp-component="ToggleGroupControlOptionBase"
|
|
591
|
-
id="toggle-group-control-as-radio-group-
|
|
591
|
+
id="toggle-group-control-as-radio-group-11-30"
|
|
592
592
|
role="radio"
|
|
593
593
|
type="button"
|
|
594
594
|
value="rigas"
|
|
@@ -610,7 +610,7 @@ exports[`ToggleGroupControl controlled should render correctly with text options
|
|
|
610
610
|
data-value="jack"
|
|
611
611
|
data-wp-c16t="true"
|
|
612
612
|
data-wp-component="ToggleGroupControlOptionBase"
|
|
613
|
-
id="toggle-group-control-as-radio-group-
|
|
613
|
+
id="toggle-group-control-as-radio-group-11-31"
|
|
614
614
|
role="radio"
|
|
615
615
|
type="button"
|
|
616
616
|
value="jack"
|
|
@@ -162,6 +162,45 @@ describe.each( [
|
|
|
162
162
|
expect( mockOnChange ).toHaveBeenCalledWith( 'rigas' );
|
|
163
163
|
} );
|
|
164
164
|
|
|
165
|
+
it( 'should not set a value on focus', async () => {
|
|
166
|
+
render(
|
|
167
|
+
<Component label="Test Toggle Group Control">{ options }</Component>
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
const radio = screen.getByRole( 'radio', { name: 'R' } );
|
|
171
|
+
expect( radio ).not.toBeChecked();
|
|
172
|
+
|
|
173
|
+
await press.Tab();
|
|
174
|
+
expect( radio ).toHaveFocus();
|
|
175
|
+
expect( radio ).not.toBeChecked();
|
|
176
|
+
} );
|
|
177
|
+
|
|
178
|
+
if ( mode === 'controlled' ) {
|
|
179
|
+
it( 'should not set a value on focus, after the value is reset', async () => {
|
|
180
|
+
render(
|
|
181
|
+
<Component label="Test Toggle Group Control" value="jack">
|
|
182
|
+
{ options }
|
|
183
|
+
</Component>
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
expect( screen.getByRole( 'radio', { name: 'J' } ) ).toBeChecked();
|
|
187
|
+
|
|
188
|
+
await click( screen.getByRole( 'button', { name: 'Reset' } ) );
|
|
189
|
+
|
|
190
|
+
expect(
|
|
191
|
+
screen.getByRole( 'radio', { name: 'J' } )
|
|
192
|
+
).not.toBeChecked();
|
|
193
|
+
|
|
194
|
+
await press.ShiftTab();
|
|
195
|
+
expect(
|
|
196
|
+
screen.getByRole( 'radio', { name: 'R' } )
|
|
197
|
+
).not.toBeChecked();
|
|
198
|
+
expect(
|
|
199
|
+
screen.getByRole( 'radio', { name: 'J' } )
|
|
200
|
+
).not.toBeChecked();
|
|
201
|
+
} );
|
|
202
|
+
}
|
|
203
|
+
|
|
165
204
|
it( 'should render tooltip where `showTooltip` === `true`', async () => {
|
|
166
205
|
render(
|
|
167
206
|
<Component label="Test Toggle Group Control">
|
|
@@ -9,7 +9,7 @@ import { useStoreState } from '@ariakit/react';
|
|
|
9
9
|
* WordPress dependencies
|
|
10
10
|
*/
|
|
11
11
|
import { useInstanceId } from '@wordpress/compose';
|
|
12
|
-
import { forwardRef, useMemo } from '@wordpress/element';
|
|
12
|
+
import { forwardRef, useEffect, useMemo } from '@wordpress/element';
|
|
13
13
|
import { isRTL } from '@wordpress/i18n';
|
|
14
14
|
|
|
15
15
|
/**
|
|
@@ -73,8 +73,17 @@ function UnforwardedToggleGroupControlAsRadioGroup(
|
|
|
73
73
|
const selectedValue = useStoreState( radio, 'value' );
|
|
74
74
|
const setValue = radio.setValue;
|
|
75
75
|
|
|
76
|
+
// Ensures that the active id is also reset after the value is "reset" by the consumer.
|
|
77
|
+
useEffect( () => {
|
|
78
|
+
if ( selectedValue === '' ) {
|
|
79
|
+
radio.setActiveId( undefined );
|
|
80
|
+
}
|
|
81
|
+
}, [ radio, selectedValue ] );
|
|
82
|
+
|
|
76
83
|
const groupContextValue = useMemo(
|
|
77
84
|
(): ToggleGroupControlContextProps => ( {
|
|
85
|
+
activeItemIsNotFirstItem: () =>
|
|
86
|
+
radio.getState().activeId !== radio.first(),
|
|
78
87
|
baseId,
|
|
79
88
|
isBlock: ! isAdaptiveWidth,
|
|
80
89
|
size,
|
|
@@ -87,6 +96,7 @@ function UnforwardedToggleGroupControlAsRadioGroup(
|
|
|
87
96
|
[
|
|
88
97
|
baseId,
|
|
89
98
|
isAdaptiveWidth,
|
|
99
|
+
radio,
|
|
90
100
|
selectedValue,
|
|
91
101
|
setSelectedElement,
|
|
92
102
|
setValue,
|
|
@@ -6,7 +6,7 @@ import type { ForwardedRef } from 'react';
|
|
|
6
6
|
/**
|
|
7
7
|
* WordPress dependencies
|
|
8
8
|
*/
|
|
9
|
-
import {
|
|
9
|
+
import { useMemo, useState } from '@wordpress/element';
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Internal dependencies
|
|
@@ -20,104 +20,9 @@ import { VisualLabelWrapper } from './styles';
|
|
|
20
20
|
import * as styles from './styles';
|
|
21
21
|
import { ToggleGroupControlAsRadioGroup } from './as-radio-group';
|
|
22
22
|
import { ToggleGroupControlAsButtonGroup } from './as-button-group';
|
|
23
|
-
import type { ElementOffsetRect } from '../../utils/element-rect';
|
|
24
23
|
import { useTrackElementOffsetRect } from '../../utils/element-rect';
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* A utility used to animate something in a container component based on the "offset
|
|
30
|
-
* rect" (position relative to the container and size) of a subelement. For example,
|
|
31
|
-
* this is useful to render an indicator for the selected option of a component, and
|
|
32
|
-
* to animate it when the selected option changes.
|
|
33
|
-
*
|
|
34
|
-
* Takes in a container element and the up-to-date "offset rect" of the target
|
|
35
|
-
* subelement, obtained with `useTrackElementOffsetRect`. Then it does the following:
|
|
36
|
-
*
|
|
37
|
-
* - Adds CSS variables with rect information to the container, so that the indicator
|
|
38
|
-
* can be rendered and animated with them. These are kept up-to-date, enabling CSS
|
|
39
|
-
* transitions on change.
|
|
40
|
-
* - Sets an attribute (`data-subelement-animated` by default) when the tracked
|
|
41
|
-
* element changes, so that the target (e.g. the indicator) can be animated to its
|
|
42
|
-
* new size and position.
|
|
43
|
-
* - Removes the attribute when the animation is done.
|
|
44
|
-
*
|
|
45
|
-
* The need for the attribute is due to the fact that the rect might update in
|
|
46
|
-
* situations other than when the tracked element changes, e.g. the tracked element
|
|
47
|
-
* might be resized. In such cases, there is no need to animate the indicator, and
|
|
48
|
-
* the change in size or position of the indicator needs to be reflected immediately.
|
|
49
|
-
*/
|
|
50
|
-
function useAnimatedOffsetRect(
|
|
51
|
-
/**
|
|
52
|
-
* The container element.
|
|
53
|
-
*/
|
|
54
|
-
container: HTMLElement | undefined,
|
|
55
|
-
/**
|
|
56
|
-
* The rect of the tracked element.
|
|
57
|
-
*/
|
|
58
|
-
rect: ElementOffsetRect,
|
|
59
|
-
{
|
|
60
|
-
prefix = 'subelement',
|
|
61
|
-
dataAttribute = `${ prefix }-animated`,
|
|
62
|
-
transitionEndFilter = () => true,
|
|
63
|
-
}: {
|
|
64
|
-
/**
|
|
65
|
-
* The prefix used for the CSS variables, e.g. if `prefix` is `selected`, the
|
|
66
|
-
* CSS variables will be `--selected-top`, `--selected-left`, etc.
|
|
67
|
-
* @default 'subelement'
|
|
68
|
-
*/
|
|
69
|
-
prefix?: string;
|
|
70
|
-
/**
|
|
71
|
-
* The name of the data attribute used to indicate that the animation is in
|
|
72
|
-
* progress. The `data-` prefix is added automatically.
|
|
73
|
-
*
|
|
74
|
-
* For example, if `dataAttribute` is `indicator-animated`, the attribute will
|
|
75
|
-
* be `data-indicator-animated`.
|
|
76
|
-
* @default `${ prefix }-animated`
|
|
77
|
-
*/
|
|
78
|
-
dataAttribute?: string;
|
|
79
|
-
/**
|
|
80
|
-
* A function that is called with the transition event and returns a boolean
|
|
81
|
-
* indicating whether the animation should be stopped. The default is a function
|
|
82
|
-
* that always returns `true`.
|
|
83
|
-
*
|
|
84
|
-
* For example, if the animated element is the `::before` pseudo-element, the
|
|
85
|
-
* function can be written as `( event ) => event.pseudoElement === '::before'`.
|
|
86
|
-
* @default () => true
|
|
87
|
-
*/
|
|
88
|
-
transitionEndFilter?: ( event: TransitionEvent ) => boolean;
|
|
89
|
-
} = {}
|
|
90
|
-
) {
|
|
91
|
-
const setProperties = useEvent( () => {
|
|
92
|
-
( Object.keys( rect ) as Array< keyof typeof rect > ).forEach(
|
|
93
|
-
( property ) =>
|
|
94
|
-
property !== 'element' &&
|
|
95
|
-
container?.style.setProperty(
|
|
96
|
-
`--${ prefix }-${ property }`,
|
|
97
|
-
String( rect[ property ] )
|
|
98
|
-
)
|
|
99
|
-
);
|
|
100
|
-
} );
|
|
101
|
-
useLayoutEffect( () => {
|
|
102
|
-
setProperties();
|
|
103
|
-
}, [ rect, setProperties ] );
|
|
104
|
-
useOnValueUpdate( rect.element, ( { previousValue } ) => {
|
|
105
|
-
// Only enable the animation when moving from one element to another.
|
|
106
|
-
if ( rect.element && previousValue ) {
|
|
107
|
-
container?.setAttribute( `data-${ dataAttribute }`, '' );
|
|
108
|
-
}
|
|
109
|
-
} );
|
|
110
|
-
useLayoutEffect( () => {
|
|
111
|
-
function onTransitionEnd( event: TransitionEvent ) {
|
|
112
|
-
if ( transitionEndFilter( event ) ) {
|
|
113
|
-
container?.removeAttribute( `data-${ dataAttribute }` );
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
container?.addEventListener( 'transitionend', onTransitionEnd );
|
|
117
|
-
return () =>
|
|
118
|
-
container?.removeEventListener( 'transitionend', onTransitionEnd );
|
|
119
|
-
}, [ dataAttribute, container, transitionEndFilter ] );
|
|
120
|
-
}
|
|
24
|
+
import { useMergeRefs } from '@wordpress/compose';
|
|
25
|
+
import { useAnimatedOffsetRect } from '../../utils/hooks/use-animated-offset-rect';
|
|
121
26
|
|
|
122
27
|
function UnconnectedToggleGroupControl(
|
|
123
28
|
props: WordPressComponentProps< ToggleGroupControlProps, 'div', false >,
|
|
@@ -75,7 +75,6 @@ function ToggleGroupControlOptionBase(
|
|
|
75
75
|
value,
|
|
76
76
|
children,
|
|
77
77
|
showTooltip = false,
|
|
78
|
-
onFocus: onFocusProp,
|
|
79
78
|
disabled,
|
|
80
79
|
...otherButtonProps
|
|
81
80
|
} = buttonProps;
|
|
@@ -132,7 +131,6 @@ function ToggleGroupControlOptionBase(
|
|
|
132
131
|
<button
|
|
133
132
|
{ ...commonProps }
|
|
134
133
|
disabled={ disabled }
|
|
135
|
-
onFocus={ onFocusProp }
|
|
136
134
|
aria-pressed={ isPressed }
|
|
137
135
|
type="button"
|
|
138
136
|
onClick={ buttonOnClick }
|
|
@@ -142,19 +140,21 @@ function ToggleGroupControlOptionBase(
|
|
|
142
140
|
) : (
|
|
143
141
|
<Ariakit.Radio
|
|
144
142
|
disabled={ disabled }
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
143
|
+
onFocusVisible={ () => {
|
|
144
|
+
const selectedValueIsEmpty =
|
|
145
|
+
toggleGroupControlContext.value === null ||
|
|
146
|
+
toggleGroupControlContext.value === '';
|
|
147
|
+
|
|
148
|
+
// Conditions ensure that the first visible focus to a radio group
|
|
149
|
+
// without a selected option will not automatically select the option.
|
|
150
|
+
if (
|
|
151
|
+
! selectedValueIsEmpty ||
|
|
152
|
+
toggleGroupControlContext.activeItemIsNotFirstItem?.()
|
|
153
|
+
) {
|
|
154
|
+
toggleGroupControlContext.setValue( value );
|
|
155
|
+
}
|
|
156
|
+
} }
|
|
157
|
+
render={ <button type="button" { ...commonProps } /> }
|
|
158
158
|
value={ value }
|
|
159
159
|
>
|
|
160
160
|
<ButtonContentView>{ children }</ButtonContentView>
|
package/src/tooltip/index.tsx
CHANGED
|
@@ -107,9 +107,16 @@ function UnforwardedTooltip(
|
|
|
107
107
|
// TODO: this is a temporary workaround to minimize the effects of the
|
|
108
108
|
// Ariakit upgrade. Ariakit doesn't pass the `aria-describedby` prop to
|
|
109
109
|
// the tooltip anchor anymore since 0.4.0, so we need to add it manually.
|
|
110
|
+
// The `aria-describedby` attribute is added only if the anchor doesn't have
|
|
111
|
+
// one already, and if the tooltip text is not the same as the anchor's
|
|
112
|
+
// `aria-label`
|
|
110
113
|
// See: https://github.com/WordPress/gutenberg/pull/64066
|
|
114
|
+
// See: https://github.com/WordPress/gutenberg/pull/65989
|
|
111
115
|
function addDescribedById( element: React.ReactElement ) {
|
|
112
|
-
return describedById &&
|
|
116
|
+
return describedById &&
|
|
117
|
+
mounted &&
|
|
118
|
+
element.props[ 'aria-describedby' ] === undefined &&
|
|
119
|
+
element.props[ 'aria-label' ] !== text
|
|
113
120
|
? cloneElement( element, { 'aria-describedby': describedById } )
|
|
114
121
|
: element;
|
|
115
122
|
}
|
|
@@ -516,4 +516,82 @@ describe( 'Tooltip', () => {
|
|
|
516
516
|
).not.toHaveClass( 'components-tooltip' );
|
|
517
517
|
} );
|
|
518
518
|
} );
|
|
519
|
+
|
|
520
|
+
describe( 'aria-describedby', () => {
|
|
521
|
+
it( "should not override the anchor's aria-describedby attribute if specified", async () => {
|
|
522
|
+
render(
|
|
523
|
+
<>
|
|
524
|
+
<Tooltip { ...props }>
|
|
525
|
+
<button aria-describedby="tooltip-test-description">
|
|
526
|
+
Tooltip anchor
|
|
527
|
+
</button>
|
|
528
|
+
</Tooltip>
|
|
529
|
+
{ /* eslint-disable-next-line no-restricted-syntax */ }
|
|
530
|
+
<p id="tooltip-test-description">Tooltip description</p>
|
|
531
|
+
<button>focus trap outside</button>
|
|
532
|
+
</>
|
|
533
|
+
);
|
|
534
|
+
|
|
535
|
+
expect(
|
|
536
|
+
screen.getByRole( 'button', { name: 'Tooltip anchor' } )
|
|
537
|
+
).toHaveAccessibleDescription( 'Tooltip description' );
|
|
538
|
+
|
|
539
|
+
// Focus the anchor, tooltip should show
|
|
540
|
+
await press.Tab();
|
|
541
|
+
expect(
|
|
542
|
+
screen.getByRole( 'button', { name: 'Tooltip anchor' } )
|
|
543
|
+
).toHaveFocus();
|
|
544
|
+
await waitExpectTooltipToShow();
|
|
545
|
+
|
|
546
|
+
// The anchors should retain its previous accessible description,
|
|
547
|
+
// since the tooltip shouldn't override it.
|
|
548
|
+
expect(
|
|
549
|
+
screen.getByRole( 'button', { name: 'Tooltip anchor' } )
|
|
550
|
+
).toHaveAccessibleDescription( 'Tooltip description' );
|
|
551
|
+
|
|
552
|
+
// Focus the other button, tooltip should hide
|
|
553
|
+
await press.Tab();
|
|
554
|
+
expect(
|
|
555
|
+
screen.getByRole( 'button', { name: 'focus trap outside' } )
|
|
556
|
+
).toHaveFocus();
|
|
557
|
+
await waitExpectTooltipToHide();
|
|
558
|
+
} );
|
|
559
|
+
|
|
560
|
+
it( "should not add the aria-describedby attribute to the anchor if the tooltip text matches the anchor's aria-label", async () => {
|
|
561
|
+
render(
|
|
562
|
+
<>
|
|
563
|
+
<Tooltip { ...props }>
|
|
564
|
+
<button aria-label={ props.text }>
|
|
565
|
+
Tooltip anchor
|
|
566
|
+
</button>
|
|
567
|
+
</Tooltip>
|
|
568
|
+
<button>focus trap outside</button>
|
|
569
|
+
</>
|
|
570
|
+
);
|
|
571
|
+
|
|
572
|
+
expect(
|
|
573
|
+
screen.getByRole( 'button', { name: props.text } )
|
|
574
|
+
).not.toHaveAccessibleDescription();
|
|
575
|
+
|
|
576
|
+
// Focus the anchor, tooltip should show
|
|
577
|
+
await press.Tab();
|
|
578
|
+
expect(
|
|
579
|
+
screen.getByRole( 'button', { name: props.text } )
|
|
580
|
+
).toHaveFocus();
|
|
581
|
+
await waitExpectTooltipToShow();
|
|
582
|
+
|
|
583
|
+
// The anchor shouldn't have an aria-describedby prop
|
|
584
|
+
// because its aria-label matches the tooltip text.
|
|
585
|
+
expect(
|
|
586
|
+
screen.getByRole( 'button', { name: props.text } )
|
|
587
|
+
).not.toHaveAccessibleDescription();
|
|
588
|
+
|
|
589
|
+
// Focus the other button, tooltip should hide
|
|
590
|
+
await press.Tab();
|
|
591
|
+
expect(
|
|
592
|
+
screen.getByRole( 'button', { name: 'focus trap outside' } )
|
|
593
|
+
).toHaveFocus();
|
|
594
|
+
await waitExpectTooltipToHide();
|
|
595
|
+
} );
|
|
596
|
+
} );
|
|
519
597
|
} );
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/* eslint-disable jsdoc/require-param */
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* WordPress dependencies
|
|
5
|
+
*/
|
|
6
|
+
import { useEvent } from '@wordpress/compose';
|
|
7
|
+
import { useLayoutEffect } from '@wordpress/element';
|
|
8
|
+
/**
|
|
9
|
+
* Internal dependencies
|
|
10
|
+
*/
|
|
11
|
+
import type { ElementOffsetRect } from '../element-rect';
|
|
12
|
+
import { useOnValueUpdate } from './use-on-value-update';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* A utility used to animate something in a container component based on the "offset
|
|
16
|
+
* rect" (position relative to the container and size) of a subelement. For example,
|
|
17
|
+
* this is useful to render an indicator for the selected option of a component, and
|
|
18
|
+
* to animate it when the selected option changes.
|
|
19
|
+
*
|
|
20
|
+
* Takes in a container element and the up-to-date "offset rect" of the target
|
|
21
|
+
* subelement, obtained with `useTrackElementOffsetRect`. Then it does the following:
|
|
22
|
+
*
|
|
23
|
+
* - Adds CSS variables with rect information to the container, so that the indicator
|
|
24
|
+
* can be rendered and animated with them. These are kept up-to-date, enabling CSS
|
|
25
|
+
* transitions on change.
|
|
26
|
+
* - Sets an attribute (`data-subelement-animated` by default) when the tracked
|
|
27
|
+
* element changes, so that the target (e.g. the indicator) can be animated to its
|
|
28
|
+
* new size and position.
|
|
29
|
+
* - Removes the attribute when the animation is done.
|
|
30
|
+
*
|
|
31
|
+
* The need for the attribute is due to the fact that the rect might update in
|
|
32
|
+
* situations other than when the tracked element changes, e.g. the tracked element
|
|
33
|
+
* might be resized. In such cases, there is no need to animate the indicator, and
|
|
34
|
+
* the change in size or position of the indicator needs to be reflected immediately.
|
|
35
|
+
*/
|
|
36
|
+
export function useAnimatedOffsetRect(
|
|
37
|
+
/**
|
|
38
|
+
* The container element.
|
|
39
|
+
*/
|
|
40
|
+
container: HTMLElement | undefined,
|
|
41
|
+
/**
|
|
42
|
+
* The rect of the tracked element.
|
|
43
|
+
*/
|
|
44
|
+
rect: ElementOffsetRect,
|
|
45
|
+
{
|
|
46
|
+
prefix = 'subelement',
|
|
47
|
+
dataAttribute = `${ prefix }-animated`,
|
|
48
|
+
transitionEndFilter = () => true,
|
|
49
|
+
}: {
|
|
50
|
+
/**
|
|
51
|
+
* The prefix used for the CSS variables, e.g. if `prefix` is `selected`, the
|
|
52
|
+
* CSS variables will be `--selected-top`, `--selected-left`, etc.
|
|
53
|
+
* @default 'subelement'
|
|
54
|
+
*/
|
|
55
|
+
prefix?: string;
|
|
56
|
+
/**
|
|
57
|
+
* The name of the data attribute used to indicate that the animation is in
|
|
58
|
+
* progress. The `data-` prefix is added automatically.
|
|
59
|
+
*
|
|
60
|
+
* For example, if `dataAttribute` is `indicator-animated`, the attribute will
|
|
61
|
+
* be `data-indicator-animated`.
|
|
62
|
+
* @default `${ prefix }-animated`
|
|
63
|
+
*/
|
|
64
|
+
dataAttribute?: string;
|
|
65
|
+
/**
|
|
66
|
+
* A function that is called with the transition event and returns a boolean
|
|
67
|
+
* indicating whether the animation should be stopped. The default is a function
|
|
68
|
+
* that always returns `true`.
|
|
69
|
+
*
|
|
70
|
+
* For example, if the animated element is the `::before` pseudo-element, the
|
|
71
|
+
* function can be written as `( event ) => event.pseudoElement === '::before'`.
|
|
72
|
+
* @default () => true
|
|
73
|
+
*/
|
|
74
|
+
transitionEndFilter?: ( event: TransitionEvent ) => boolean;
|
|
75
|
+
} = {}
|
|
76
|
+
) {
|
|
77
|
+
const setProperties = useEvent( () => {
|
|
78
|
+
( Object.keys( rect ) as Array< keyof typeof rect > ).forEach(
|
|
79
|
+
( property ) =>
|
|
80
|
+
property !== 'element' &&
|
|
81
|
+
container?.style.setProperty(
|
|
82
|
+
`--${ prefix }-${ property }`,
|
|
83
|
+
String( rect[ property ] )
|
|
84
|
+
)
|
|
85
|
+
);
|
|
86
|
+
} );
|
|
87
|
+
useLayoutEffect( () => {
|
|
88
|
+
setProperties();
|
|
89
|
+
}, [ rect, setProperties ] );
|
|
90
|
+
useOnValueUpdate( rect.element, ( { previousValue } ) => {
|
|
91
|
+
// Only enable the animation when moving from one element to another.
|
|
92
|
+
if ( rect.element && previousValue ) {
|
|
93
|
+
container?.setAttribute( `data-${ dataAttribute }`, '' );
|
|
94
|
+
}
|
|
95
|
+
} );
|
|
96
|
+
useLayoutEffect( () => {
|
|
97
|
+
function onTransitionEnd( event: TransitionEvent ) {
|
|
98
|
+
if ( transitionEndFilter( event ) ) {
|
|
99
|
+
container?.removeAttribute( `data-${ dataAttribute }` );
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
container?.addEventListener( 'transitionend', onTransitionEnd );
|
|
103
|
+
return () =>
|
|
104
|
+
container?.removeEventListener( 'transitionend', onTransitionEnd );
|
|
105
|
+
}, [ dataAttribute, container, transitionEndFilter ] );
|
|
106
|
+
}
|
|
107
|
+
/* eslint-enable jsdoc/require-param */
|