@wordpress/components 28.8.3 → 28.9.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 +27 -3
- package/build/autocomplete/index.js +4 -1
- package/build/autocomplete/index.js.map +1 -1
- package/build/border-box-control/border-box-control/component.js +3 -14
- package/build/border-box-control/border-box-control/component.js.map +1 -1
- package/build/border-control/border-control/component.js +1 -2
- package/build/border-control/border-control/component.js.map +1 -1
- package/build/border-control/border-control-dropdown/component.js +2 -14
- package/build/border-control/border-control-dropdown/component.js.map +1 -1
- package/build/border-control/styles.js +13 -13
- package/build/border-control/styles.js.map +1 -1
- package/build/border-control/types.js.map +1 -1
- package/build/box-control/index.js +4 -4
- package/build/box-control/index.js.map +1 -1
- package/build/box-control/types.js.map +1 -1
- package/build/composite/group-label.js +7 -1
- package/build/composite/group-label.js.map +1 -1
- package/build/composite/group.js +7 -1
- package/build/composite/group.js.map +1 -1
- package/build/composite/hover.js +8 -2
- package/build/composite/hover.js.map +1 -1
- package/build/composite/index.js +5 -1
- package/build/composite/index.js.map +1 -1
- package/build/composite/item.js +16 -1
- package/build/composite/item.js.map +1 -1
- package/build/composite/row.js +7 -1
- package/build/composite/row.js.map +1 -1
- package/build/composite/typeahead.js +8 -2
- package/build/composite/typeahead.js.map +1 -1
- package/build/date-time/date/index.js +4 -2
- package/build/date-time/date/index.js.map +1 -1
- package/build/index.js +36 -5
- package/build/index.js.map +1 -1
- package/build/navigator/index.js +128 -32
- package/build/navigator/index.js.map +1 -1
- package/build/navigator/legacy.js +179 -0
- package/build/navigator/legacy.js.map +1 -0
- package/build/navigator/{navigator-provider → navigator}/component.js +5 -40
- package/build/navigator/navigator/component.js.map +1 -0
- package/build/navigator/navigator-back-button/component.js +2 -38
- package/build/navigator/navigator-back-button/component.js.map +1 -1
- package/build/navigator/navigator-back-button/hook.js +1 -1
- package/build/navigator/navigator-back-button/hook.js.map +1 -1
- package/build/navigator/navigator-button/component.js +2 -37
- package/build/navigator/navigator-button/component.js.map +1 -1
- package/build/navigator/navigator-button/hook.js +1 -1
- package/build/navigator/navigator-button/hook.js.map +1 -1
- package/build/navigator/navigator-screen/component.js +40 -62
- package/build/navigator/navigator-screen/component.js.map +1 -1
- package/build/navigator/navigator-screen/use-screen-animate-presence.js +114 -0
- package/build/navigator/navigator-screen/use-screen-animate-presence.js.map +1 -0
- package/build/navigator/navigator-to-parent-button/component.js +3 -7
- package/build/navigator/navigator-to-parent-button/component.js.map +1 -1
- package/build/navigator/styles.js +78 -35
- package/build/navigator/styles.js.map +1 -1
- package/build/navigator/types.js.map +1 -1
- package/build/navigator/use-navigator.js +4 -1
- package/build/navigator/use-navigator.js.map +1 -1
- package/build/search-control/index.js +5 -2
- package/build/search-control/index.js.map +1 -1
- package/build/tabs/styles.js +3 -3
- package/build/tabs/styles.js.map +1 -1
- package/build/tabs/tablist.js +61 -28
- package/build/tabs/tablist.js.map +1 -1
- package/build/tabs/use-track-overflow.js +73 -0
- package/build/tabs/use-track-overflow.js.map +1 -0
- package/build/toggle-group-control/toggle-group-control/as-button-group.js +4 -2
- package/build/toggle-group-control/toggle-group-control/as-button-group.js.map +1 -1
- package/build/toggle-group-control/toggle-group-control/as-radio-group.js +9 -3
- 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 +73 -8
- package/build/toggle-group-control/toggle-group-control/component.js.map +1 -1
- package/build/toggle-group-control/toggle-group-control/styles.js +7 -7
- package/build/toggle-group-control/toggle-group-control/styles.js.map +1 -1
- package/build/toggle-group-control/toggle-group-control-option-base/component.js +10 -19
- package/build/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -1
- package/build/toggle-group-control/toggle-group-control-option-base/styles.js +8 -9
- package/build/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -1
- package/build/toggle-group-control/types.js.map +1 -1
- package/build/utils/element-rect.js +22 -13
- package/build/utils/element-rect.js.map +1 -1
- package/build/utils/hooks/use-on-value-update.js +3 -7
- package/build/utils/hooks/use-on-value-update.js.map +1 -1
- package/build-module/autocomplete/index.js +4 -1
- package/build-module/autocomplete/index.js.map +1 -1
- package/build-module/border-box-control/border-box-control/component.js +3 -14
- package/build-module/border-box-control/border-box-control/component.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-dropdown/component.js +2 -14
- package/build-module/border-control/border-control-dropdown/component.js.map +1 -1
- package/build-module/border-control/styles.js +13 -13
- package/build-module/border-control/styles.js.map +1 -1
- package/build-module/border-control/types.js.map +1 -1
- package/build-module/box-control/index.js +4 -4
- package/build-module/box-control/index.js.map +1 -1
- package/build-module/box-control/types.js.map +1 -1
- package/build-module/composite/group-label.js +7 -1
- package/build-module/composite/group-label.js.map +1 -1
- package/build-module/composite/group.js +7 -1
- package/build-module/composite/group.js.map +1 -1
- package/build-module/composite/hover.js +8 -2
- package/build-module/composite/hover.js.map +1 -1
- package/build-module/composite/index.js +5 -1
- package/build-module/composite/index.js.map +1 -1
- package/build-module/composite/item.js +16 -1
- package/build-module/composite/item.js.map +1 -1
- package/build-module/composite/row.js +7 -1
- package/build-module/composite/row.js.map +1 -1
- package/build-module/composite/typeahead.js +8 -2
- package/build-module/composite/typeahead.js.map +1 -1
- package/build-module/date-time/date/index.js +4 -2
- package/build-module/date-time/date/index.js.map +1 -1
- package/build-module/index.js +14 -4
- package/build-module/index.js.map +1 -1
- package/build-module/navigator/index.js +130 -5
- package/build-module/navigator/index.js.map +1 -1
- package/build-module/navigator/legacy.js +167 -0
- package/build-module/navigator/legacy.js.map +1 -0
- package/build-module/navigator/{navigator-provider → navigator}/component.js +4 -39
- package/build-module/navigator/navigator/component.js.map +1 -0
- package/build-module/navigator/navigator-back-button/component.js +1 -37
- package/build-module/navigator/navigator-back-button/component.js.map +1 -1
- package/build-module/navigator/navigator-back-button/hook.js +1 -1
- package/build-module/navigator/navigator-back-button/hook.js.map +1 -1
- package/build-module/navigator/navigator-button/component.js +1 -36
- package/build-module/navigator/navigator-button/component.js.map +1 -1
- package/build-module/navigator/navigator-button/hook.js +1 -1
- package/build-module/navigator/navigator-button/hook.js.map +1 -1
- package/build-module/navigator/navigator-screen/component.js +39 -61
- package/build-module/navigator/navigator-screen/component.js.map +1 -1
- package/build-module/navigator/navigator-screen/use-screen-animate-presence.js +106 -0
- package/build-module/navigator/navigator-screen/use-screen-animate-presence.js.map +1 -0
- package/build-module/navigator/navigator-to-parent-button/component.js +2 -6
- package/build-module/navigator/navigator-to-parent-button/component.js.map +1 -1
- package/build-module/navigator/styles.js +77 -33
- package/build-module/navigator/styles.js.map +1 -1
- package/build-module/navigator/types.js.map +1 -1
- package/build-module/navigator/use-navigator.js +4 -1
- package/build-module/navigator/use-navigator.js.map +1 -1
- package/build-module/search-control/index.js +5 -2
- package/build-module/search-control/index.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/tablist.js +62 -29
- package/build-module/tabs/tablist.js.map +1 -1
- package/build-module/tabs/use-track-overflow.js +67 -0
- package/build-module/tabs/use-track-overflow.js.map +1 -0
- package/build-module/toggle-group-control/toggle-group-control/as-button-group.js +4 -2
- package/build-module/toggle-group-control/toggle-group-control/as-button-group.js.map +1 -1
- package/build-module/toggle-group-control/toggle-group-control/as-radio-group.js +9 -3
- 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 +76 -10
- 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 +7 -7
- 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/component.js +12 -22
- package/build-module/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -1
- package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js +7 -8
- package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -1
- package/build-module/toggle-group-control/types.js.map +1 -1
- package/build-module/utils/element-rect.js +22 -12
- package/build-module/utils/element-rect.js.map +1 -1
- package/build-module/utils/hooks/use-on-value-update.js +3 -6
- package/build-module/utils/hooks/use-on-value-update.js.map +1 -1
- package/build-style/style-rtl.css +26 -13
- package/build-style/style.css +26 -13
- package/build-types/autocomplete/index.d.ts.map +1 -1
- package/build-types/border-box-control/border-box-control/component.d.ts +5 -15
- package/build-types/border-box-control/border-box-control/component.d.ts.map +1 -1
- package/build-types/border-box-control/border-box-control-split-controls/component.d.ts +2 -1
- package/build-types/border-box-control/border-box-control-split-controls/component.d.ts.map +1 -1
- package/build-types/border-box-control/stories/index.story.d.ts +3 -2
- package/build-types/border-box-control/stories/index.story.d.ts.map +1 -1
- package/build-types/border-control/border-control/component.d.ts +3 -2
- package/build-types/border-control/border-control/component.d.ts.map +1 -1
- package/build-types/border-control/border-control-dropdown/component.d.ts +2 -1
- package/build-types/border-control/border-control-dropdown/component.d.ts.map +1 -1
- package/build-types/border-control/border-control-style-picker/component.d.ts.map +1 -1
- package/build-types/border-control/stories/index.story.d.ts +15 -30
- package/build-types/border-control/stories/index.story.d.ts.map +1 -1
- package/build-types/border-control/styles.d.ts.map +1 -1
- package/build-types/border-control/types.d.ts +12 -7
- package/build-types/border-control/types.d.ts.map +1 -1
- package/build-types/box-control/index.d.ts +4 -4
- package/build-types/box-control/stories/index.story.d.ts.map +1 -1
- package/build-types/box-control/types.d.ts +3 -3
- package/build-types/composite/group-label.d.ts.map +1 -1
- package/build-types/composite/index.d.ts.map +1 -1
- package/build-types/composite/item.d.ts.map +1 -1
- package/build-types/composite/stories/index.story.d.ts +22 -0
- package/build-types/composite/stories/index.story.d.ts.map +1 -1
- package/build-types/composite/test/index.d.ts +2 -0
- package/build-types/composite/test/index.d.ts.map +1 -0
- package/build-types/date-time/date/index.d.ts.map +1 -1
- package/build-types/dropdown/stories/index.story.d.ts.map +1 -1
- package/build-types/dropdown-menu/stories/index.story.d.ts.map +1 -1
- package/build-types/index.d.ts +23 -4
- package/build-types/index.d.ts.map +1 -1
- package/build-types/navigator/index.d.ts +171 -5
- package/build-types/navigator/index.d.ts.map +1 -1
- package/build-types/navigator/legacy.d.ts +226 -0
- package/build-types/navigator/legacy.d.ts.map +1 -0
- package/build-types/navigator/navigator/component.d.ts +3 -0
- package/build-types/navigator/navigator/component.d.ts.map +1 -0
- package/build-types/navigator/navigator-back-button/component.d.ts +0 -35
- package/build-types/navigator/navigator-back-button/component.d.ts.map +1 -1
- package/build-types/navigator/navigator-button/component.d.ts +0 -34
- package/build-types/navigator/navigator-button/component.d.ts.map +1 -1
- package/build-types/navigator/navigator-screen/component.d.ts +0 -35
- package/build-types/navigator/navigator-screen/component.d.ts.map +1 -1
- package/build-types/navigator/navigator-screen/use-screen-animate-presence.d.ts +16 -0
- package/build-types/navigator/navigator-screen/use-screen-animate-presence.d.ts.map +1 -0
- package/build-types/navigator/navigator-to-parent-button/component.d.ts +0 -4
- package/build-types/navigator/navigator-to-parent-button/component.d.ts.map +1 -1
- package/build-types/navigator/stories/index.story.d.ts +5 -5
- package/build-types/navigator/stories/index.story.d.ts.map +1 -1
- package/build-types/navigator/styles.d.ts +20 -7
- package/build-types/navigator/styles.d.ts.map +1 -1
- package/build-types/navigator/types.d.ts +19 -1
- package/build-types/navigator/types.d.ts.map +1 -1
- package/build-types/navigator/use-navigator.d.ts +4 -1
- package/build-types/navigator/use-navigator.d.ts.map +1 -1
- package/build-types/select-control/stories/index.story.d.ts +7 -0
- package/build-types/select-control/stories/index.story.d.ts.map +1 -1
- package/build-types/tabs/stories/index.story.d.ts +2 -1
- package/build-types/tabs/stories/index.story.d.ts.map +1 -1
- package/build-types/tabs/styles.d.ts.map +1 -1
- package/build-types/tabs/tablist.d.ts.map +1 -1
- package/build-types/tabs/use-track-overflow.d.ts +17 -0
- package/build-types/tabs/use-track-overflow.d.ts.map +1 -0
- package/build-types/toggle-group-control/toggle-group-control/as-button-group.d.ts +2 -2
- package/build-types/toggle-group-control/toggle-group-control/as-button-group.d.ts.map +1 -1
- package/build-types/toggle-group-control/toggle-group-control/as-radio-group.d.ts +2 -2
- package/build-types/toggle-group-control/toggle-group-control/as-radio-group.d.ts.map +1 -1
- package/build-types/toggle-group-control/toggle-group-control/component.d.ts.map +1 -1
- package/build-types/toggle-group-control/toggle-group-control/styles.d.ts.map +1 -1
- package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts.map +1 -1
- package/build-types/toggle-group-control/toggle-group-control-option-base/styles.d.ts +0 -1
- package/build-types/toggle-group-control/toggle-group-control-option-base/styles.d.ts.map +1 -1
- package/build-types/toggle-group-control/types.d.ts +2 -1
- package/build-types/toggle-group-control/types.d.ts.map +1 -1
- package/build-types/utils/element-rect.d.ts +8 -0
- package/build-types/utils/element-rect.d.ts.map +1 -1
- package/build-types/utils/hooks/use-on-value-update.d.ts.map +1 -1
- package/package.json +19 -19
- package/src/autocomplete/index.tsx +4 -1
- package/src/border-box-control/border-box-control/README.md +22 -26
- package/src/border-box-control/border-box-control/component.tsx +3 -14
- package/src/border-box-control/stories/index.story.tsx +2 -1
- package/src/border-control/border-control/README.md +26 -36
- package/src/border-control/border-control/component.tsx +1 -2
- package/src/border-control/border-control-dropdown/component.tsx +1 -15
- package/src/border-control/stories/index.story.tsx +4 -10
- package/src/border-control/styles.ts +0 -1
- package/src/border-control/test/index.js +2 -15
- package/src/border-control/types.ts +12 -7
- package/src/box-control/README.md +9 -12
- package/src/box-control/index.tsx +4 -4
- package/src/box-control/stories/index.story.tsx +1 -1
- package/src/box-control/types.ts +3 -3
- package/src/composite/group-label.tsx +7 -5
- package/src/composite/group.tsx +7 -7
- package/src/composite/hover.tsx +7 -7
- package/src/composite/index.tsx +6 -1
- package/src/composite/item.tsx +19 -1
- package/src/composite/legacy/test/index.tsx +22 -21
- package/src/composite/row.tsx +7 -7
- package/src/composite/stories/index.story.tsx +42 -0
- package/src/composite/test/index.tsx +123 -0
- package/src/composite/typeahead.tsx +7 -7
- package/src/date-time/date/index.tsx +2 -0
- package/src/dropdown/stories/index.story.tsx +1 -0
- package/src/dropdown/style.scss +10 -13
- package/src/dropdown-menu/stories/index.story.tsx +3 -0
- package/src/index.ts +19 -1
- package/src/menu-group/style.scss +4 -1
- package/src/menu-items-choice/style.scss +2 -0
- package/src/navigator/README.md +176 -0
- package/src/navigator/index.tsx +131 -0
- package/src/navigator/legacy.ts +169 -0
- package/src/navigator/{navigator-provider → navigator}/component.tsx +6 -44
- package/src/navigator/navigator-back-button/component.tsx +1 -37
- package/src/navigator/navigator-back-button/hook.ts +1 -1
- package/src/navigator/navigator-button/component.tsx +1 -36
- package/src/navigator/navigator-button/hook.ts +1 -1
- package/src/navigator/navigator-screen/component.tsx +48 -76
- package/src/navigator/navigator-screen/use-screen-animate-presence.ts +177 -0
- package/src/navigator/navigator-to-parent-button/component.tsx +2 -7
- package/src/navigator/stories/index.story.tsx +55 -54
- package/src/navigator/styles.ts +112 -41
- package/src/navigator/test/index.tsx +47 -47
- package/src/navigator/types.ts +19 -1
- package/src/navigator/use-navigator.ts +4 -1
- package/src/search-control/index.tsx +2 -2
- package/src/select-control/stories/index.story.tsx +14 -1
- package/src/tabs/stories/index.story.tsx +106 -0
- package/src/tabs/styles.ts +54 -20
- package/src/tabs/tablist.tsx +60 -26
- package/src/tabs/use-track-overflow.ts +76 -0
- package/src/toggle-group-control/test/__snapshots__/index.tsx.snap +208 -44
- package/src/toggle-group-control/toggle-group-control/as-button-group.tsx +18 -10
- package/src/toggle-group-control/toggle-group-control/as-radio-group.tsx +21 -9
- package/src/toggle-group-control/toggle-group-control/component.tsx +114 -6
- package/src/toggle-group-control/toggle-group-control/styles.ts +41 -0
- package/src/toggle-group-control/toggle-group-control-option-base/component.tsx +10 -27
- package/src/toggle-group-control/toggle-group-control-option-base/styles.ts +0 -11
- package/src/toggle-group-control/types.ts +3 -1
- package/src/tools-panel/tools-panel/README.md +10 -10
- package/src/utils/element-rect.ts +32 -15
- package/src/utils/hooks/use-on-value-update.ts +3 -6
- package/tsconfig.tsbuildinfo +1 -1
- package/build/navigator/navigator-provider/component.js.map +0 -1
- package/build/utils/hooks/use-event.js +0 -41
- package/build/utils/hooks/use-event.js.map +0 -1
- package/build-module/navigator/navigator-provider/component.js.map +0 -1
- package/build-module/utils/hooks/use-event.js +0 -35
- package/build-module/utils/hooks/use-event.js.map +0 -1
- package/build-types/navigator/navigator-provider/component.d.ts +0 -37
- package/build-types/navigator/navigator-provider/component.d.ts.map +0 -1
- package/build-types/utils/hooks/use-event.d.ts +0 -20
- package/build-types/utils/hooks/use-event.d.ts.map +0 -1
- package/src/navigator/index.ts +0 -6
- package/src/navigator/navigator-back-button/README.md +0 -15
- package/src/navigator/navigator-button/README.md +0 -38
- package/src/navigator/navigator-provider/README.md +0 -94
- package/src/navigator/navigator-screen/README.md +0 -33
- package/src/navigator/navigator-to-parent-button/README.md +0 -17
- package/src/utils/hooks/use-event.ts +0 -38
|
@@ -60,6 +60,55 @@ exports[`ToggleGroupControl controlled should render correctly with icons 1`] =
|
|
|
60
60
|
outline-offset: -2px;
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
+
@media not ( prefers-reduced-motion ) {
|
|
64
|
+
.emotion-8[data-indicator-animated]::before {
|
|
65
|
+
transition-property: transform,border-radius;
|
|
66
|
+
transition-duration: 0.2s;
|
|
67
|
+
transition-timing-function: ease-out;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.emotion-8::before {
|
|
72
|
+
content: '';
|
|
73
|
+
position: absolute;
|
|
74
|
+
pointer-events: none;
|
|
75
|
+
background: #1e1e1e;
|
|
76
|
+
outline: 2px solid transparent;
|
|
77
|
+
outline-offset: -3px;
|
|
78
|
+
--antialiasing-factor: 100;
|
|
79
|
+
border-radius: calc(
|
|
80
|
+
1px /
|
|
81
|
+
(
|
|
82
|
+
var( --selected-width, 0 ) /
|
|
83
|
+
var( --antialiasing-factor )
|
|
84
|
+
)
|
|
85
|
+
)/1px;
|
|
86
|
+
left: -1px;
|
|
87
|
+
width: calc( var( --antialiasing-factor ) * 1px );
|
|
88
|
+
height: calc( var( --selected-height, 0 ) * 1px );
|
|
89
|
+
transform-origin: left top;
|
|
90
|
+
-webkit-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
|
|
91
|
+
calc(
|
|
92
|
+
var( --selected-width, 0 ) / var( --antialiasing-factor )
|
|
93
|
+
)
|
|
94
|
+
);
|
|
95
|
+
-moz-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
|
|
96
|
+
calc(
|
|
97
|
+
var( --selected-width, 0 ) / var( --antialiasing-factor )
|
|
98
|
+
)
|
|
99
|
+
);
|
|
100
|
+
-ms-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
|
|
101
|
+
calc(
|
|
102
|
+
var( --selected-width, 0 ) / var( --antialiasing-factor )
|
|
103
|
+
)
|
|
104
|
+
);
|
|
105
|
+
transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
|
|
106
|
+
calc(
|
|
107
|
+
var( --selected-width, 0 ) / var( --antialiasing-factor )
|
|
108
|
+
)
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
63
112
|
.emotion-10 {
|
|
64
113
|
display: -webkit-inline-box;
|
|
65
114
|
display: -webkit-inline-flex;
|
|
@@ -150,17 +199,7 @@ exports[`ToggleGroupControl controlled should render correctly with icons 1`] =
|
|
|
150
199
|
line-height: 1;
|
|
151
200
|
}
|
|
152
201
|
|
|
153
|
-
.emotion-
|
|
154
|
-
background: #1e1e1e;
|
|
155
|
-
border-radius: 1px;
|
|
156
|
-
position: absolute;
|
|
157
|
-
inset: 0;
|
|
158
|
-
z-index: 1;
|
|
159
|
-
outline: 2px solid transparent;
|
|
160
|
-
outline-offset: -3px;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
.emotion-18 {
|
|
202
|
+
.emotion-17 {
|
|
164
203
|
-webkit-align-items: center;
|
|
165
204
|
-webkit-box-align: center;
|
|
166
205
|
-ms-flex-align: center;
|
|
@@ -204,22 +243,22 @@ exports[`ToggleGroupControl controlled should render correctly with icons 1`] =
|
|
|
204
243
|
}
|
|
205
244
|
|
|
206
245
|
@media not ( prefers-reduced-motion ) {
|
|
207
|
-
.emotion-
|
|
246
|
+
.emotion-17 {
|
|
208
247
|
-webkit-transition: background 160ms linear,color 160ms linear,font-weight 60ms linear;
|
|
209
248
|
transition: background 160ms linear,color 160ms linear,font-weight 60ms linear;
|
|
210
249
|
}
|
|
211
250
|
}
|
|
212
251
|
|
|
213
|
-
.emotion-
|
|
252
|
+
.emotion-17::-moz-focus-inner {
|
|
214
253
|
border: 0;
|
|
215
254
|
}
|
|
216
255
|
|
|
217
|
-
.emotion-
|
|
256
|
+
.emotion-17[disabled] {
|
|
218
257
|
opacity: 0.4;
|
|
219
258
|
cursor: default;
|
|
220
259
|
}
|
|
221
260
|
|
|
222
|
-
.emotion-
|
|
261
|
+
.emotion-17:active {
|
|
223
262
|
background: #fff;
|
|
224
263
|
}
|
|
225
264
|
|
|
@@ -280,12 +319,6 @@ exports[`ToggleGroupControl controlled should render correctly with icons 1`] =
|
|
|
280
319
|
</svg>
|
|
281
320
|
</div>
|
|
282
321
|
</button>
|
|
283
|
-
<div>
|
|
284
|
-
<div
|
|
285
|
-
class="emotion-15"
|
|
286
|
-
role="presentation"
|
|
287
|
-
/>
|
|
288
|
-
</div>
|
|
289
322
|
</div>
|
|
290
323
|
<div
|
|
291
324
|
class="emotion-10 emotion-11"
|
|
@@ -293,7 +326,7 @@ exports[`ToggleGroupControl controlled should render correctly with icons 1`] =
|
|
|
293
326
|
<button
|
|
294
327
|
aria-checked="false"
|
|
295
328
|
aria-label="Lowercase"
|
|
296
|
-
class="emotion-
|
|
329
|
+
class="emotion-17 components-toggle-group-control-option-base"
|
|
297
330
|
data-value="lowercase"
|
|
298
331
|
data-wp-c16t="true"
|
|
299
332
|
data-wp-component="ToggleGroupControlOptionBase"
|
|
@@ -392,6 +425,55 @@ exports[`ToggleGroupControl controlled should render correctly with text options
|
|
|
392
425
|
outline-offset: -2px;
|
|
393
426
|
}
|
|
394
427
|
|
|
428
|
+
@media not ( prefers-reduced-motion ) {
|
|
429
|
+
.emotion-8[data-indicator-animated]::before {
|
|
430
|
+
transition-property: transform,border-radius;
|
|
431
|
+
transition-duration: 0.2s;
|
|
432
|
+
transition-timing-function: ease-out;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
.emotion-8::before {
|
|
437
|
+
content: '';
|
|
438
|
+
position: absolute;
|
|
439
|
+
pointer-events: none;
|
|
440
|
+
background: #1e1e1e;
|
|
441
|
+
outline: 2px solid transparent;
|
|
442
|
+
outline-offset: -3px;
|
|
443
|
+
--antialiasing-factor: 100;
|
|
444
|
+
border-radius: calc(
|
|
445
|
+
1px /
|
|
446
|
+
(
|
|
447
|
+
var( --selected-width, 0 ) /
|
|
448
|
+
var( --antialiasing-factor )
|
|
449
|
+
)
|
|
450
|
+
)/1px;
|
|
451
|
+
left: -1px;
|
|
452
|
+
width: calc( var( --antialiasing-factor ) * 1px );
|
|
453
|
+
height: calc( var( --selected-height, 0 ) * 1px );
|
|
454
|
+
transform-origin: left top;
|
|
455
|
+
-webkit-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
|
|
456
|
+
calc(
|
|
457
|
+
var( --selected-width, 0 ) / var( --antialiasing-factor )
|
|
458
|
+
)
|
|
459
|
+
);
|
|
460
|
+
-moz-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
|
|
461
|
+
calc(
|
|
462
|
+
var( --selected-width, 0 ) / var( --antialiasing-factor )
|
|
463
|
+
)
|
|
464
|
+
);
|
|
465
|
+
-ms-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
|
|
466
|
+
calc(
|
|
467
|
+
var( --selected-width, 0 ) / var( --antialiasing-factor )
|
|
468
|
+
)
|
|
469
|
+
);
|
|
470
|
+
transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
|
|
471
|
+
calc(
|
|
472
|
+
var( --selected-width, 0 ) / var( --antialiasing-factor )
|
|
473
|
+
)
|
|
474
|
+
);
|
|
475
|
+
}
|
|
476
|
+
|
|
395
477
|
.emotion-10 {
|
|
396
478
|
display: -webkit-inline-box;
|
|
397
479
|
display: -webkit-inline-flex;
|
|
@@ -612,6 +694,55 @@ exports[`ToggleGroupControl uncontrolled should render correctly with icons 1`]
|
|
|
612
694
|
outline-offset: -2px;
|
|
613
695
|
}
|
|
614
696
|
|
|
697
|
+
@media not ( prefers-reduced-motion ) {
|
|
698
|
+
.emotion-8[data-indicator-animated]::before {
|
|
699
|
+
transition-property: transform,border-radius;
|
|
700
|
+
transition-duration: 0.2s;
|
|
701
|
+
transition-timing-function: ease-out;
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
.emotion-8::before {
|
|
706
|
+
content: '';
|
|
707
|
+
position: absolute;
|
|
708
|
+
pointer-events: none;
|
|
709
|
+
background: #1e1e1e;
|
|
710
|
+
outline: 2px solid transparent;
|
|
711
|
+
outline-offset: -3px;
|
|
712
|
+
--antialiasing-factor: 100;
|
|
713
|
+
border-radius: calc(
|
|
714
|
+
1px /
|
|
715
|
+
(
|
|
716
|
+
var( --selected-width, 0 ) /
|
|
717
|
+
var( --antialiasing-factor )
|
|
718
|
+
)
|
|
719
|
+
)/1px;
|
|
720
|
+
left: -1px;
|
|
721
|
+
width: calc( var( --antialiasing-factor ) * 1px );
|
|
722
|
+
height: calc( var( --selected-height, 0 ) * 1px );
|
|
723
|
+
transform-origin: left top;
|
|
724
|
+
-webkit-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
|
|
725
|
+
calc(
|
|
726
|
+
var( --selected-width, 0 ) / var( --antialiasing-factor )
|
|
727
|
+
)
|
|
728
|
+
);
|
|
729
|
+
-moz-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
|
|
730
|
+
calc(
|
|
731
|
+
var( --selected-width, 0 ) / var( --antialiasing-factor )
|
|
732
|
+
)
|
|
733
|
+
);
|
|
734
|
+
-ms-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
|
|
735
|
+
calc(
|
|
736
|
+
var( --selected-width, 0 ) / var( --antialiasing-factor )
|
|
737
|
+
)
|
|
738
|
+
);
|
|
739
|
+
transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
|
|
740
|
+
calc(
|
|
741
|
+
var( --selected-width, 0 ) / var( --antialiasing-factor )
|
|
742
|
+
)
|
|
743
|
+
);
|
|
744
|
+
}
|
|
745
|
+
|
|
615
746
|
.emotion-10 {
|
|
616
747
|
display: -webkit-inline-box;
|
|
617
748
|
display: -webkit-inline-flex;
|
|
@@ -702,17 +833,7 @@ exports[`ToggleGroupControl uncontrolled should render correctly with icons 1`]
|
|
|
702
833
|
line-height: 1;
|
|
703
834
|
}
|
|
704
835
|
|
|
705
|
-
.emotion-
|
|
706
|
-
background: #1e1e1e;
|
|
707
|
-
border-radius: 1px;
|
|
708
|
-
position: absolute;
|
|
709
|
-
inset: 0;
|
|
710
|
-
z-index: 1;
|
|
711
|
-
outline: 2px solid transparent;
|
|
712
|
-
outline-offset: -3px;
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
.emotion-18 {
|
|
836
|
+
.emotion-17 {
|
|
716
837
|
-webkit-align-items: center;
|
|
717
838
|
-webkit-box-align: center;
|
|
718
839
|
-ms-flex-align: center;
|
|
@@ -756,22 +877,22 @@ exports[`ToggleGroupControl uncontrolled should render correctly with icons 1`]
|
|
|
756
877
|
}
|
|
757
878
|
|
|
758
879
|
@media not ( prefers-reduced-motion ) {
|
|
759
|
-
.emotion-
|
|
880
|
+
.emotion-17 {
|
|
760
881
|
-webkit-transition: background 160ms linear,color 160ms linear,font-weight 60ms linear;
|
|
761
882
|
transition: background 160ms linear,color 160ms linear,font-weight 60ms linear;
|
|
762
883
|
}
|
|
763
884
|
}
|
|
764
885
|
|
|
765
|
-
.emotion-
|
|
886
|
+
.emotion-17::-moz-focus-inner {
|
|
766
887
|
border: 0;
|
|
767
888
|
}
|
|
768
889
|
|
|
769
|
-
.emotion-
|
|
890
|
+
.emotion-17[disabled] {
|
|
770
891
|
opacity: 0.4;
|
|
771
892
|
cursor: default;
|
|
772
893
|
}
|
|
773
894
|
|
|
774
|
-
.emotion-
|
|
895
|
+
.emotion-17:active {
|
|
775
896
|
background: #fff;
|
|
776
897
|
}
|
|
777
898
|
|
|
@@ -832,12 +953,6 @@ exports[`ToggleGroupControl uncontrolled should render correctly with icons 1`]
|
|
|
832
953
|
</svg>
|
|
833
954
|
</div>
|
|
834
955
|
</button>
|
|
835
|
-
<div>
|
|
836
|
-
<div
|
|
837
|
-
class="emotion-15"
|
|
838
|
-
role="presentation"
|
|
839
|
-
/>
|
|
840
|
-
</div>
|
|
841
956
|
</div>
|
|
842
957
|
<div
|
|
843
958
|
class="emotion-10 emotion-11"
|
|
@@ -845,7 +960,7 @@ exports[`ToggleGroupControl uncontrolled should render correctly with icons 1`]
|
|
|
845
960
|
<button
|
|
846
961
|
aria-checked="false"
|
|
847
962
|
aria-label="Lowercase"
|
|
848
|
-
class="emotion-
|
|
963
|
+
class="emotion-17 components-toggle-group-control-option-base"
|
|
849
964
|
data-value="lowercase"
|
|
850
965
|
data-wp-c16t="true"
|
|
851
966
|
data-wp-component="ToggleGroupControlOptionBase"
|
|
@@ -938,6 +1053,55 @@ exports[`ToggleGroupControl uncontrolled should render correctly with text optio
|
|
|
938
1053
|
outline-offset: -2px;
|
|
939
1054
|
}
|
|
940
1055
|
|
|
1056
|
+
@media not ( prefers-reduced-motion ) {
|
|
1057
|
+
.emotion-8[data-indicator-animated]::before {
|
|
1058
|
+
transition-property: transform,border-radius;
|
|
1059
|
+
transition-duration: 0.2s;
|
|
1060
|
+
transition-timing-function: ease-out;
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
1063
|
+
|
|
1064
|
+
.emotion-8::before {
|
|
1065
|
+
content: '';
|
|
1066
|
+
position: absolute;
|
|
1067
|
+
pointer-events: none;
|
|
1068
|
+
background: #1e1e1e;
|
|
1069
|
+
outline: 2px solid transparent;
|
|
1070
|
+
outline-offset: -3px;
|
|
1071
|
+
--antialiasing-factor: 100;
|
|
1072
|
+
border-radius: calc(
|
|
1073
|
+
1px /
|
|
1074
|
+
(
|
|
1075
|
+
var( --selected-width, 0 ) /
|
|
1076
|
+
var( --antialiasing-factor )
|
|
1077
|
+
)
|
|
1078
|
+
)/1px;
|
|
1079
|
+
left: -1px;
|
|
1080
|
+
width: calc( var( --antialiasing-factor ) * 1px );
|
|
1081
|
+
height: calc( var( --selected-height, 0 ) * 1px );
|
|
1082
|
+
transform-origin: left top;
|
|
1083
|
+
-webkit-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
|
|
1084
|
+
calc(
|
|
1085
|
+
var( --selected-width, 0 ) / var( --antialiasing-factor )
|
|
1086
|
+
)
|
|
1087
|
+
);
|
|
1088
|
+
-moz-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
|
|
1089
|
+
calc(
|
|
1090
|
+
var( --selected-width, 0 ) / var( --antialiasing-factor )
|
|
1091
|
+
)
|
|
1092
|
+
);
|
|
1093
|
+
-ms-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
|
|
1094
|
+
calc(
|
|
1095
|
+
var( --selected-width, 0 ) / var( --antialiasing-factor )
|
|
1096
|
+
)
|
|
1097
|
+
);
|
|
1098
|
+
transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
|
|
1099
|
+
calc(
|
|
1100
|
+
var( --selected-width, 0 ) / var( --antialiasing-factor )
|
|
1101
|
+
)
|
|
1102
|
+
);
|
|
1103
|
+
}
|
|
1104
|
+
|
|
941
1105
|
.emotion-10 {
|
|
942
1106
|
display: -webkit-inline-box;
|
|
943
1107
|
display: -webkit-inline-flex;
|
|
@@ -26,6 +26,7 @@ function UnforwardedToggleGroupControlAsButtonGroup(
|
|
|
26
26
|
size,
|
|
27
27
|
value: valueProp,
|
|
28
28
|
id: idProp,
|
|
29
|
+
setSelectedElement,
|
|
29
30
|
...otherProps
|
|
30
31
|
}: WordPressComponentProps<
|
|
31
32
|
ToggleGroupControlMainControlProps,
|
|
@@ -54,16 +55,23 @@ function UnforwardedToggleGroupControlAsButtonGroup(
|
|
|
54
55
|
} );
|
|
55
56
|
|
|
56
57
|
const groupContextValue = useMemo(
|
|
57
|
-
() =>
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
[
|
|
58
|
+
(): ToggleGroupControlContextProps => ( {
|
|
59
|
+
baseId,
|
|
60
|
+
value: selectedValue,
|
|
61
|
+
setValue: setSelectedValue,
|
|
62
|
+
isBlock: ! isAdaptiveWidth,
|
|
63
|
+
isDeselectable: true,
|
|
64
|
+
size,
|
|
65
|
+
setSelectedElement,
|
|
66
|
+
} ),
|
|
67
|
+
[
|
|
68
|
+
baseId,
|
|
69
|
+
selectedValue,
|
|
70
|
+
setSelectedValue,
|
|
71
|
+
isAdaptiveWidth,
|
|
72
|
+
size,
|
|
73
|
+
setSelectedElement,
|
|
74
|
+
]
|
|
67
75
|
);
|
|
68
76
|
|
|
69
77
|
return (
|
|
@@ -10,6 +10,7 @@ import { useStoreState } from '@ariakit/react';
|
|
|
10
10
|
*/
|
|
11
11
|
import { useInstanceId } from '@wordpress/compose';
|
|
12
12
|
import { forwardRef, useMemo } from '@wordpress/element';
|
|
13
|
+
import { isRTL } from '@wordpress/i18n';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* Internal dependencies
|
|
@@ -32,6 +33,7 @@ function UnforwardedToggleGroupControlAsRadioGroup(
|
|
|
32
33
|
size,
|
|
33
34
|
value: valueProp,
|
|
34
35
|
id: idProp,
|
|
36
|
+
setSelectedElement,
|
|
35
37
|
...otherProps
|
|
36
38
|
}: WordPressComponentProps<
|
|
37
39
|
ToggleGroupControlMainControlProps,
|
|
@@ -65,21 +67,31 @@ function UnforwardedToggleGroupControlAsRadioGroup(
|
|
|
65
67
|
defaultValue,
|
|
66
68
|
value,
|
|
67
69
|
setValue: wrappedOnChangeProp,
|
|
70
|
+
rtl: isRTL(),
|
|
68
71
|
} );
|
|
69
72
|
|
|
70
73
|
const selectedValue = useStoreState( radio, 'value' );
|
|
71
74
|
const setValue = radio.setValue;
|
|
72
75
|
|
|
73
76
|
const groupContextValue = useMemo(
|
|
74
|
-
() =>
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
77
|
+
(): ToggleGroupControlContextProps => ( {
|
|
78
|
+
baseId,
|
|
79
|
+
isBlock: ! isAdaptiveWidth,
|
|
80
|
+
size,
|
|
81
|
+
// @ts-expect-error - This is wrong and we should fix it.
|
|
82
|
+
value: selectedValue,
|
|
83
|
+
// @ts-expect-error - This is wrong and we should fix it.
|
|
84
|
+
setValue,
|
|
85
|
+
setSelectedElement,
|
|
86
|
+
} ),
|
|
87
|
+
[
|
|
88
|
+
baseId,
|
|
89
|
+
isAdaptiveWidth,
|
|
90
|
+
selectedValue,
|
|
91
|
+
setSelectedElement,
|
|
92
|
+
setValue,
|
|
93
|
+
size,
|
|
94
|
+
]
|
|
83
95
|
);
|
|
84
96
|
|
|
85
97
|
return (
|
|
@@ -2,13 +2,11 @@
|
|
|
2
2
|
* External dependencies
|
|
3
3
|
*/
|
|
4
4
|
import type { ForwardedRef } from 'react';
|
|
5
|
-
import { LayoutGroup } from 'framer-motion';
|
|
6
5
|
|
|
7
6
|
/**
|
|
8
7
|
* WordPress dependencies
|
|
9
8
|
*/
|
|
10
|
-
import {
|
|
11
|
-
import { useMemo } from '@wordpress/element';
|
|
9
|
+
import { useLayoutEffect, useMemo, useState } from '@wordpress/element';
|
|
12
10
|
|
|
13
11
|
/**
|
|
14
12
|
* Internal dependencies
|
|
@@ -22,6 +20,104 @@ import { VisualLabelWrapper } from './styles';
|
|
|
22
20
|
import * as styles from './styles';
|
|
23
21
|
import { ToggleGroupControlAsRadioGroup } from './as-radio-group';
|
|
24
22
|
import { ToggleGroupControlAsButtonGroup } from './as-button-group';
|
|
23
|
+
import type { ElementOffsetRect } from '../../utils/element-rect';
|
|
24
|
+
import { useTrackElementOffsetRect } from '../../utils/element-rect';
|
|
25
|
+
import { useOnValueUpdate } from '../../utils/hooks/use-on-value-update';
|
|
26
|
+
import { useEvent, useMergeRefs } from '@wordpress/compose';
|
|
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
|
+
}
|
|
25
121
|
|
|
26
122
|
function UnconnectedToggleGroupControl(
|
|
27
123
|
props: WordPressComponentProps< ToggleGroupControlProps, 'div', false >,
|
|
@@ -44,10 +140,21 @@ function UnconnectedToggleGroupControl(
|
|
|
44
140
|
...otherProps
|
|
45
141
|
} = useContextSystem( props, 'ToggleGroupControl' );
|
|
46
142
|
|
|
47
|
-
const baseId = useInstanceId( ToggleGroupControl, 'toggle-group-control' );
|
|
48
143
|
const normalizedSize =
|
|
49
144
|
__next40pxDefaultSize && size === 'default' ? '__unstable-large' : size;
|
|
50
145
|
|
|
146
|
+
const [ selectedElement, setSelectedElement ] = useState< HTMLElement >();
|
|
147
|
+
const [ controlElement, setControlElement ] = useState< HTMLElement >();
|
|
148
|
+
const refs = useMergeRefs( [ setControlElement, forwardedRef ] );
|
|
149
|
+
const selectedRect = useTrackElementOffsetRect(
|
|
150
|
+
value ? selectedElement : undefined
|
|
151
|
+
);
|
|
152
|
+
useAnimatedOffsetRect( controlElement, selectedRect, {
|
|
153
|
+
prefix: 'selected',
|
|
154
|
+
dataAttribute: 'indicator-animated',
|
|
155
|
+
transitionEndFilter: ( event ) => event.pseudoElement === '::before',
|
|
156
|
+
} );
|
|
157
|
+
|
|
51
158
|
const cx = useCx();
|
|
52
159
|
|
|
53
160
|
const classes = useMemo(
|
|
@@ -81,15 +188,16 @@ function UnconnectedToggleGroupControl(
|
|
|
81
188
|
) }
|
|
82
189
|
<MainControl
|
|
83
190
|
{ ...otherProps }
|
|
191
|
+
setSelectedElement={ setSelectedElement }
|
|
84
192
|
className={ classes }
|
|
85
193
|
isAdaptiveWidth={ isAdaptiveWidth }
|
|
86
194
|
label={ label }
|
|
87
195
|
onChange={ onChange }
|
|
88
|
-
ref={
|
|
196
|
+
ref={ refs }
|
|
89
197
|
size={ normalizedSize }
|
|
90
198
|
value={ value }
|
|
91
199
|
>
|
|
92
|
-
|
|
200
|
+
{ children }
|
|
93
201
|
</MainControl>
|
|
94
202
|
</BaseControl>
|
|
95
203
|
);
|
|
@@ -26,6 +26,47 @@ export const toggleGroupControl = ( {
|
|
|
26
26
|
|
|
27
27
|
${ toggleGroupControlSize( size ) }
|
|
28
28
|
${ ! isDeselectable && enclosingBorders( isBlock ) }
|
|
29
|
+
|
|
30
|
+
@media not ( prefers-reduced-motion ) {
|
|
31
|
+
&[data-indicator-animated]::before {
|
|
32
|
+
transition-property: transform, border-radius;
|
|
33
|
+
transition-duration: 0.2s;
|
|
34
|
+
transition-timing-function: ease-out;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
&::before {
|
|
39
|
+
content: '';
|
|
40
|
+
position: absolute;
|
|
41
|
+
pointer-events: none;
|
|
42
|
+
background: ${ COLORS.gray[ 900 ] };
|
|
43
|
+
|
|
44
|
+
// Windows High Contrast mode will show this outline, but not the box-shadow.
|
|
45
|
+
outline: 2px solid transparent;
|
|
46
|
+
outline-offset: -3px;
|
|
47
|
+
|
|
48
|
+
/* Using a large value to avoid antialiasing rounding issues
|
|
49
|
+
when scaling in the transform, see: https://stackoverflow.com/a/52159123 */
|
|
50
|
+
--antialiasing-factor: 100;
|
|
51
|
+
/* Adjusting the border radius to match the scaling in the x axis. */
|
|
52
|
+
border-radius: calc(
|
|
53
|
+
${ CONFIG.radiusXSmall } /
|
|
54
|
+
(
|
|
55
|
+
var( --selected-width, 0 ) /
|
|
56
|
+
var( --antialiasing-factor )
|
|
57
|
+
)
|
|
58
|
+
) / ${ CONFIG.radiusXSmall };
|
|
59
|
+
left: -1px; // Correcting for border.
|
|
60
|
+
width: calc( var( --antialiasing-factor ) * 1px );
|
|
61
|
+
height: calc( var( --selected-height, 0 ) * 1px );
|
|
62
|
+
transform-origin: left top;
|
|
63
|
+
transform: translateX( calc( var( --selected-left, 0 ) * 1px ) )
|
|
64
|
+
scaleX(
|
|
65
|
+
calc(
|
|
66
|
+
var( --selected-width, 0 ) / var( --antialiasing-factor )
|
|
67
|
+
)
|
|
68
|
+
);
|
|
69
|
+
}
|
|
29
70
|
`;
|
|
30
71
|
|
|
31
72
|
const enclosingBorders = ( isBlock: ToggleGroupControlProps[ 'isBlock' ] ) => {
|