@wordpress/components 25.13.0 → 25.14.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.
Files changed (224) hide show
  1. package/CHANGELOG.md +38 -1
  2. package/build/border-control/border-control-dropdown/component.js +4 -2
  3. package/build/border-control/border-control-dropdown/component.js.map +1 -1
  4. package/build/border-control/border-control-dropdown/hook.js +3 -2
  5. package/build/border-control/border-control-dropdown/hook.js.map +1 -1
  6. package/build/border-control/styles.js +17 -17
  7. package/build/border-control/styles.js.map +1 -1
  8. package/build/checkbox-control/index.js +1 -1
  9. package/build/checkbox-control/index.js.map +1 -1
  10. package/build/checkbox-control/types.js.map +1 -1
  11. package/build/date-time/time/timezone.js +11 -2
  12. package/build/date-time/time/timezone.js.map +1 -1
  13. package/build/dimension-control/index.js +2 -0
  14. package/build/dimension-control/index.js.map +1 -1
  15. package/build/dimension-control/types.js.map +1 -1
  16. package/build/dropdown-menu-v2-ariakit/styles.js +14 -14
  17. package/build/dropdown-menu-v2-ariakit/styles.js.map +1 -1
  18. package/build/focal-point-picker/controls.js +5 -1
  19. package/build/focal-point-picker/controls.js.map +1 -1
  20. package/build/focal-point-picker/index.js +2 -0
  21. package/build/focal-point-picker/index.js.map +1 -1
  22. package/build/focal-point-picker/styles/focal-point-picker-style.js +15 -15
  23. package/build/focal-point-picker/styles/focal-point-picker-style.js.map +1 -1
  24. package/build/focal-point-picker/types.js.map +1 -1
  25. package/build/font-size-picker/font-size-picker-select.js +2 -0
  26. package/build/font-size-picker/font-size-picker-select.js.map +1 -1
  27. package/build/font-size-picker/font-size-picker-toggle-group.js +2 -0
  28. package/build/font-size-picker/font-size-picker-toggle-group.js.map +1 -1
  29. package/build/font-size-picker/index.js +6 -1
  30. package/build/font-size-picker/index.js.map +1 -1
  31. package/build/font-size-picker/types.js.map +1 -1
  32. package/build/index.native.js +0 -16
  33. package/build/index.native.js.map +1 -1
  34. package/build/mobile/global-styles-context/utils.native.js +13 -0
  35. package/build/mobile/global-styles-context/utils.native.js.map +1 -1
  36. package/build/palette-edit/index.js +21 -1
  37. package/build/palette-edit/index.js.map +1 -1
  38. package/build/query-controls/author-select.js +3 -1
  39. package/build/query-controls/author-select.js.map +1 -1
  40. package/build/query-controls/category-select.js +3 -1
  41. package/build/query-controls/category-select.js.map +1 -1
  42. package/build/query-controls/index.js +6 -1
  43. package/build/query-controls/index.js.map +1 -1
  44. package/build/query-controls/types.js.map +1 -1
  45. package/build/tabs/index.js +18 -1
  46. package/build/tabs/index.js.map +1 -1
  47. package/build/tabs/tab.js +2 -2
  48. package/build/tabs/tab.js.map +1 -1
  49. package/build/tabs/tabpanel.js +3 -2
  50. package/build/tabs/tabpanel.js.map +1 -1
  51. package/build/tabs/types.js.map +1 -1
  52. package/build/toggle-group-control/toggle-group-control/utils.js +17 -17
  53. package/build/toggle-group-control/toggle-group-control/utils.js.map +1 -1
  54. package/build/tools-panel/tools-panel-item/hook.js +11 -11
  55. package/build/tools-panel/tools-panel-item/hook.js.map +1 -1
  56. package/build-module/border-control/border-control-dropdown/component.js +4 -2
  57. package/build-module/border-control/border-control-dropdown/component.js.map +1 -1
  58. package/build-module/border-control/border-control-dropdown/hook.js +3 -2
  59. package/build-module/border-control/border-control-dropdown/hook.js.map +1 -1
  60. package/build-module/border-control/styles.js +17 -17
  61. package/build-module/border-control/styles.js.map +1 -1
  62. package/build-module/checkbox-control/index.js +1 -1
  63. package/build-module/checkbox-control/index.js.map +1 -1
  64. package/build-module/checkbox-control/types.js.map +1 -1
  65. package/build-module/date-time/time/timezone.js +11 -2
  66. package/build-module/date-time/time/timezone.js.map +1 -1
  67. package/build-module/dimension-control/index.js +2 -0
  68. package/build-module/dimension-control/index.js.map +1 -1
  69. package/build-module/dimension-control/types.js.map +1 -1
  70. package/build-module/dropdown-menu-v2-ariakit/styles.js +14 -14
  71. package/build-module/dropdown-menu-v2-ariakit/styles.js.map +1 -1
  72. package/build-module/focal-point-picker/controls.js +5 -1
  73. package/build-module/focal-point-picker/controls.js.map +1 -1
  74. package/build-module/focal-point-picker/index.js +2 -0
  75. package/build-module/focal-point-picker/index.js.map +1 -1
  76. package/build-module/focal-point-picker/styles/focal-point-picker-style.js +15 -15
  77. package/build-module/focal-point-picker/styles/focal-point-picker-style.js.map +1 -1
  78. package/build-module/focal-point-picker/types.js.map +1 -1
  79. package/build-module/font-size-picker/font-size-picker-select.js +2 -0
  80. package/build-module/font-size-picker/font-size-picker-select.js.map +1 -1
  81. package/build-module/font-size-picker/font-size-picker-toggle-group.js +2 -0
  82. package/build-module/font-size-picker/font-size-picker-toggle-group.js.map +1 -1
  83. package/build-module/font-size-picker/index.js +6 -1
  84. package/build-module/font-size-picker/index.js.map +1 -1
  85. package/build-module/font-size-picker/types.js.map +1 -1
  86. package/build-module/index.native.js +0 -2
  87. package/build-module/index.native.js.map +1 -1
  88. package/build-module/mobile/global-styles-context/utils.native.js +13 -0
  89. package/build-module/mobile/global-styles-context/utils.native.js.map +1 -1
  90. package/build-module/palette-edit/index.js +20 -3
  91. package/build-module/palette-edit/index.js.map +1 -1
  92. package/build-module/query-controls/author-select.js +3 -1
  93. package/build-module/query-controls/author-select.js.map +1 -1
  94. package/build-module/query-controls/category-select.js +3 -1
  95. package/build-module/query-controls/category-select.js.map +1 -1
  96. package/build-module/query-controls/index.js +6 -1
  97. package/build-module/query-controls/index.js.map +1 -1
  98. package/build-module/query-controls/types.js.map +1 -1
  99. package/build-module/tabs/index.js +18 -1
  100. package/build-module/tabs/index.js.map +1 -1
  101. package/build-module/tabs/tab.js +2 -2
  102. package/build-module/tabs/tab.js.map +1 -1
  103. package/build-module/tabs/tabpanel.js +3 -2
  104. package/build-module/tabs/tabpanel.js.map +1 -1
  105. package/build-module/tabs/types.js.map +1 -1
  106. package/build-module/toggle-group-control/toggle-group-control/utils.js +17 -17
  107. package/build-module/toggle-group-control/toggle-group-control/utils.js.map +1 -1
  108. package/build-module/tools-panel/tools-panel-item/hook.js +11 -11
  109. package/build-module/tools-panel/tools-panel-item/hook.js.map +1 -1
  110. package/build-style/style-rtl.css +1 -1
  111. package/build-style/style.css +1 -1
  112. package/build-types/border-control/border-control-dropdown/component.d.ts.map +1 -1
  113. package/build-types/border-control/border-control-dropdown/hook.d.ts +1 -0
  114. package/build-types/border-control/border-control-dropdown/hook.d.ts.map +1 -1
  115. package/build-types/border-control/styles.d.ts +1 -1
  116. package/build-types/border-control/styles.d.ts.map +1 -1
  117. package/build-types/checkbox-control/index.d.ts.map +1 -1
  118. package/build-types/checkbox-control/types.d.ts +3 -2
  119. package/build-types/checkbox-control/types.d.ts.map +1 -1
  120. package/build-types/date-time/time/timezone.d.ts.map +1 -1
  121. package/build-types/dimension-control/index.d.ts.map +1 -1
  122. package/build-types/dimension-control/types.d.ts +6 -0
  123. package/build-types/dimension-control/types.d.ts.map +1 -1
  124. package/build-types/dropdown-menu-v2-ariakit/styles.d.ts.map +1 -1
  125. package/build-types/focal-point-picker/controls.d.ts +1 -1
  126. package/build-types/focal-point-picker/controls.d.ts.map +1 -1
  127. package/build-types/focal-point-picker/index.d.ts +1 -1
  128. package/build-types/focal-point-picker/index.d.ts.map +1 -1
  129. package/build-types/focal-point-picker/stories/index.story.d.ts +8 -4
  130. package/build-types/focal-point-picker/stories/index.story.d.ts.map +1 -1
  131. package/build-types/focal-point-picker/types.d.ts +7 -0
  132. package/build-types/focal-point-picker/types.d.ts.map +1 -1
  133. package/build-types/font-size-picker/font-size-picker-select.d.ts.map +1 -1
  134. package/build-types/font-size-picker/font-size-picker-toggle-group.d.ts.map +1 -1
  135. package/build-types/font-size-picker/index.d.ts.map +1 -1
  136. package/build-types/font-size-picker/types.d.ts +8 -1
  137. package/build-types/font-size-picker/types.d.ts.map +1 -1
  138. package/build-types/palette-edit/index.d.ts +6 -1
  139. package/build-types/palette-edit/index.d.ts.map +1 -1
  140. package/build-types/query-controls/author-select.d.ts +1 -1
  141. package/build-types/query-controls/author-select.d.ts.map +1 -1
  142. package/build-types/query-controls/category-select.d.ts +1 -1
  143. package/build-types/query-controls/category-select.d.ts.map +1 -1
  144. package/build-types/query-controls/index.d.ts +1 -1
  145. package/build-types/query-controls/index.d.ts.map +1 -1
  146. package/build-types/query-controls/types.d.ts +9 -0
  147. package/build-types/query-controls/types.d.ts.map +1 -1
  148. package/build-types/tabs/index.d.ts +2 -2
  149. package/build-types/tabs/index.d.ts.map +1 -1
  150. package/build-types/tabs/tab.d.ts +2 -1
  151. package/build-types/tabs/tab.d.ts.map +1 -1
  152. package/build-types/tabs/tabpanel.d.ts +2 -1
  153. package/build-types/tabs/tabpanel.d.ts.map +1 -1
  154. package/build-types/tabs/types.d.ts +8 -3
  155. package/build-types/tabs/types.d.ts.map +1 -1
  156. package/build-types/toggle-group-control/toggle-group-control/utils.d.ts.map +1 -1
  157. package/build-types/tools-panel/tools-panel-item/hook.d.ts.map +1 -1
  158. package/package.json +19 -19
  159. package/src/border-control/border-control-dropdown/component.tsx +3 -1
  160. package/src/border-control/border-control-dropdown/hook.ts +3 -2
  161. package/src/border-control/styles.ts +2 -9
  162. package/src/checkbox-control/README.md +2 -1
  163. package/src/checkbox-control/index.tsx +8 -6
  164. package/src/checkbox-control/test/__snapshots__/index.tsx.snap +3 -8
  165. package/src/checkbox-control/test/index.tsx +7 -0
  166. package/src/checkbox-control/types.ts +3 -2
  167. package/src/custom-select-control/test/index.js +367 -35
  168. package/src/date-time/time/timezone.tsx +15 -3
  169. package/src/dimension-control/index.tsx +2 -0
  170. package/src/dimension-control/test/__snapshots__/index.test.js.snap +2 -2
  171. package/src/dimension-control/types.ts +6 -0
  172. package/src/dropdown-menu-v2-ariakit/styles.ts +12 -0
  173. package/src/focal-point-picker/controls.tsx +4 -0
  174. package/src/focal-point-picker/index.tsx +2 -0
  175. package/src/focal-point-picker/styles/focal-point-picker-style.ts +1 -1
  176. package/src/focal-point-picker/types.ts +7 -0
  177. package/src/font-size-picker/font-size-picker-select.tsx +2 -0
  178. package/src/font-size-picker/font-size-picker-toggle-group.tsx +9 -1
  179. package/src/font-size-picker/index.tsx +11 -3
  180. package/src/font-size-picker/types.ts +8 -1
  181. package/src/form-toggle/style.scss +4 -2
  182. package/src/index.native.js +0 -2
  183. package/src/mobile/global-styles-context/test/utils.native.js +22 -0
  184. package/src/mobile/global-styles-context/utils.native.js +14 -0
  185. package/src/mobile/link-settings/style.native.scss +0 -17
  186. package/src/palette-edit/index.tsx +22 -8
  187. package/src/palette-edit/style.scss +2 -2
  188. package/src/palette-edit/test/index.tsx +75 -1
  189. package/src/query-controls/author-select.tsx +2 -0
  190. package/src/query-controls/category-select.tsx +2 -0
  191. package/src/query-controls/index.tsx +6 -1
  192. package/src/query-controls/types.ts +9 -0
  193. package/src/search-control/README.md +2 -0
  194. package/src/spinner/README.md +2 -0
  195. package/src/tabs/README.md +4 -4
  196. package/src/tabs/index.tsx +22 -1
  197. package/src/tabs/stories/index.story.tsx +48 -48
  198. package/src/tabs/tab.tsx +3 -3
  199. package/src/tabs/tabpanel.tsx +7 -3
  200. package/src/tabs/test/index.tsx +180 -106
  201. package/src/tabs/types.ts +8 -3
  202. package/src/toggle-group-control/test/index.tsx +54 -1
  203. package/src/toggle-group-control/toggle-group-control/utils.ts +15 -20
  204. package/src/tools-panel/tools-panel-item/hook.ts +10 -21
  205. package/tsconfig.tsbuildinfo +1 -1
  206. package/build/mobile/inserter-button/index.native.js +0 -98
  207. package/build/mobile/inserter-button/index.native.js.map +0 -1
  208. package/build/mobile/inserter-button/sparkles.js +0 -23
  209. package/build/mobile/inserter-button/sparkles.js.map +0 -1
  210. package/build/mobile/link-settings/image-link-destinations-screen.native.js +0 -119
  211. package/build/mobile/link-settings/image-link-destinations-screen.native.js.map +0 -1
  212. package/build-module/mobile/inserter-button/index.native.js +0 -89
  213. package/build-module/mobile/inserter-button/index.native.js.map +0 -1
  214. package/build-module/mobile/inserter-button/sparkles.js +0 -15
  215. package/build-module/mobile/inserter-button/sparkles.js.map +0 -1
  216. package/build-module/mobile/link-settings/image-link-destinations-screen.native.js +0 -110
  217. package/build-module/mobile/link-settings/image-link-destinations-screen.native.js.map +0 -1
  218. package/build-types/mobile/inserter-button/sparkles.d.ts +0 -3
  219. package/build-types/mobile/inserter-button/sparkles.d.ts.map +0 -1
  220. package/src/mobile/inserter-button/README.md +0 -62
  221. package/src/mobile/inserter-button/index.native.js +0 -116
  222. package/src/mobile/inserter-button/sparkles.js +0 -15
  223. package/src/mobile/inserter-button/style.native.scss +0 -72
  224. package/src/mobile/link-settings/image-link-destinations-screen.native.js +0 -152
package/src/tabs/types.ts CHANGED
@@ -78,8 +78,10 @@ export type TabListProps = {
78
78
  export type TabProps = {
79
79
  /**
80
80
  * The id of the tab, which is prepended with the `Tabs` instanceId.
81
+ * The value of this prop should match with the value of the `tabId` prop on
82
+ * the corresponding `Tabs.TabPanel` component.
81
83
  */
82
- id: string;
84
+ tabId: string;
83
85
  /**
84
86
  * The children elements, generally the text to display on the tab.
85
87
  */
@@ -103,9 +105,12 @@ export type TabPanelProps = {
103
105
  */
104
106
  children?: React.ReactNode;
105
107
  /**
106
- * A unique identifier for the tabpanel, which is used to generate a unique `id` for the underlying element.
108
+ * A unique identifier for the tabpanel, which is used to generate an
109
+ * instanced id for the underlying element.
110
+ * The value of this prop should match with the value of the `tabId` prop on
111
+ * the corresponding `Tabs.Tab` component.
107
112
  */
108
- id: string;
113
+ tabId: string;
109
114
  /**
110
115
  * Determines whether or not the tabpanel element should be focusable.
111
116
  * If `false`, pressing the tab key will skip over the tabpanel, and instead
@@ -25,8 +25,11 @@ import cleanupTooltip from '../../tooltip/test/utils';
25
25
  const ControlledToggleGroupControl = ( {
26
26
  value: valueProp,
27
27
  onChange,
28
+ extraButtonOptions,
28
29
  ...props
29
- }: ToggleGroupControlProps ) => {
30
+ }: ToggleGroupControlProps & {
31
+ extraButtonOptions?: { name: string; value: string }[];
32
+ } ) => {
30
33
  const [ value, setValue ] = useState( valueProp );
31
34
 
32
35
  return (
@@ -40,6 +43,14 @@ const ControlledToggleGroupControl = ( {
40
43
  value={ value }
41
44
  />
42
45
  <Button onClick={ () => setValue( undefined ) }>Reset</Button>
46
+ { extraButtonOptions?.map( ( obj ) => (
47
+ <Button
48
+ key={ obj.value }
49
+ onClick={ () => setValue( obj.value ) }
50
+ >
51
+ { obj.name }
52
+ </Button>
53
+ ) ) }
43
54
  </>
44
55
  );
45
56
  };
@@ -192,6 +203,48 @@ describe.each( [
192
203
  expect( rigasOption ).not.toBeChecked();
193
204
  expect( jackOption ).not.toBeChecked();
194
205
  } );
206
+
207
+ it( 'should update correctly when triggered by external updates', async () => {
208
+ const user = userEvent.setup();
209
+
210
+ render(
211
+ <Component
212
+ value="rigas"
213
+ label="Test Toggle Group Control"
214
+ extraButtonOptions={ [
215
+ { name: 'Rigas', value: 'rigas' },
216
+ { name: 'Jack', value: 'jack' },
217
+ ] }
218
+ >
219
+ { options }
220
+ </Component>
221
+ );
222
+
223
+ expect( screen.getByRole( 'radio', { name: 'R' } ) ).toBeChecked();
224
+ expect(
225
+ screen.getByRole( 'radio', { name: 'J' } )
226
+ ).not.toBeChecked();
227
+
228
+ await user.click( screen.getByRole( 'button', { name: 'Jack' } ) );
229
+ expect( screen.getByRole( 'radio', { name: 'J' } ) ).toBeChecked();
230
+ expect(
231
+ screen.getByRole( 'radio', { name: 'R' } )
232
+ ).not.toBeChecked();
233
+
234
+ await user.click( screen.getByRole( 'button', { name: 'Rigas' } ) );
235
+ expect( screen.getByRole( 'radio', { name: 'R' } ) ).toBeChecked();
236
+ expect(
237
+ screen.getByRole( 'radio', { name: 'J' } )
238
+ ).not.toBeChecked();
239
+
240
+ await user.click( screen.getByRole( 'button', { name: 'Reset' } ) );
241
+ expect(
242
+ screen.getByRole( 'radio', { name: 'R' } )
243
+ ).not.toBeChecked();
244
+ expect(
245
+ screen.getByRole( 'radio', { name: 'J' } )
246
+ ).not.toBeChecked();
247
+ } );
195
248
  }
196
249
 
197
250
  describe( 'isDeselectable', () => {
@@ -21,30 +21,25 @@ type ValueProp = ToggleGroupControlProps[ 'value' ];
21
21
  export function useComputeControlledOrUncontrolledValue(
22
22
  valueProp: ValueProp
23
23
  ): { value: ValueProp; defaultValue: ValueProp } {
24
- const hasEverBeenUsedInControlledMode = useRef( false );
25
- const previousValueProp = usePrevious( valueProp );
24
+ const prevValueProp = usePrevious( valueProp );
25
+ const prevIsControlled = useRef( false );
26
26
 
27
+ // Assume the component is being used in controlled mode on the first re-render
28
+ // that has a different `valueProp` from the previous render.
29
+ const isControlled =
30
+ prevIsControlled.current ||
31
+ ( prevValueProp !== undefined &&
32
+ valueProp !== undefined &&
33
+ prevValueProp !== valueProp );
27
34
  useEffect( () => {
28
- if ( ! hasEverBeenUsedInControlledMode.current ) {
29
- // Assume the component is being used in controlled mode if:
30
- // - the `value` prop is not `undefined`
31
- // - the `value` prop was not previously `undefined` and was given a new value
32
- hasEverBeenUsedInControlledMode.current =
33
- valueProp !== undefined &&
34
- previousValueProp !== undefined &&
35
- valueProp !== previousValueProp;
36
- }
37
- }, [ valueProp, previousValueProp ] );
35
+ prevIsControlled.current = isControlled;
36
+ }, [ isControlled ] );
38
37
 
39
- let value, defaultValue;
40
-
41
- if ( hasEverBeenUsedInControlledMode.current ) {
38
+ if ( isControlled ) {
42
39
  // When in controlled mode, use `''` instead of `undefined`
43
- value = valueProp ?? '';
44
- } else {
45
- // When in uncontrolled mode, the `value` should be intended as the initial value
46
- defaultValue = valueProp;
40
+ return { value: valueProp ?? '', defaultValue: undefined };
47
41
  }
48
42
 
49
- return { value, defaultValue };
43
+ // When in uncontrolled mode, the `value` should be intended as the initial value
44
+ return { value: undefined, defaultValue: valueProp };
50
45
  }
@@ -52,11 +52,14 @@ export function useToolsPanelItem(
52
52
  __experimentalLastVisibleItemClass,
53
53
  } = useToolsPanelContext();
54
54
 
55
- const hasValueCallback = useCallback( hasValue, [ panelId, hasValue ] );
56
- const resetAllFilterCallback = useCallback( resetAllFilter, [
57
- panelId,
58
- resetAllFilter,
59
- ] );
55
+ // hasValue is a new function on every render, so do not add it as a
56
+ // dependency to the useCallback hook! If needed, we should use a ref.
57
+ // eslint-disable-next-line react-hooks/exhaustive-deps
58
+ const hasValueCallback = useCallback( hasValue, [ panelId ] );
59
+ // resetAllFilter is a new function on every render, so do not add it as a
60
+ // dependency to the useCallback hook! If needed, we should use a ref.
61
+ // eslint-disable-next-line react-hooks/exhaustive-deps
62
+ const resetAllFilterCallback = useCallback( resetAllFilter, [ panelId ] );
60
63
  const previousPanelId = usePrevious( currentPanelId );
61
64
 
62
65
  const hasMatchingPanel =
@@ -126,27 +129,13 @@ export function useToolsPanelItem(
126
129
  const newValueSet = isValueSet && ! wasValueSet;
127
130
 
128
131
  // Notify the panel when an item's value has been set.
129
- //
130
- // 1. For default controls, this is so "reset" appears beside its menu item.
131
- // 2. For optional controls, when the panel ID is `null`, it allows the
132
- // panel to ensure the item is toggled on for display in the menu, given the
133
- // value has been set external to the control.
134
132
  useEffect( () => {
135
133
  if ( ! newValueSet ) {
136
134
  return;
137
135
  }
138
136
 
139
- if ( isShownByDefault || currentPanelId === null ) {
140
- flagItemCustomization( label, menuGroup );
141
- }
142
- }, [
143
- currentPanelId,
144
- newValueSet,
145
- isShownByDefault,
146
- menuGroup,
147
- label,
148
- flagItemCustomization,
149
- ] );
137
+ flagItemCustomization( label, menuGroup );
138
+ }, [ newValueSet, menuGroup, label, flagItemCustomization ] );
150
139
 
151
140
  // Determine if the panel item's corresponding menu is being toggled and
152
141
  // trigger appropriate callback if it is.