@wordpress/components 28.7.0 → 28.8.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 (240) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/build/box-control/all-input-control.js +1 -2
  3. package/build/box-control/all-input-control.js.map +1 -1
  4. package/build/box-control/utils.js +1 -1
  5. package/build/box-control/utils.js.map +1 -1
  6. package/build/card/card/component.js +2 -2
  7. package/build/card/card/component.js.map +1 -1
  8. package/build/card/styles.js +18 -18
  9. package/build/card/styles.js.map +1 -1
  10. package/build/combobox-control/index.js +3 -1
  11. package/build/combobox-control/index.js.map +1 -1
  12. package/build/combobox-control/types.js.map +1 -1
  13. package/build/composite/context.js +1 -1
  14. package/build/composite/context.js.map +1 -1
  15. package/build/composite/group-label.js +1 -1
  16. package/build/composite/group-label.js.map +1 -1
  17. package/build/composite/group.js +1 -1
  18. package/build/composite/group.js.map +1 -1
  19. package/build/composite/hover.js +1 -1
  20. package/build/composite/hover.js.map +1 -1
  21. package/build/composite/index.js +17 -26
  22. package/build/composite/index.js.map +1 -1
  23. package/build/composite/item.js +1 -1
  24. package/build/composite/item.js.map +1 -1
  25. package/build/composite/legacy/index.js +59 -8
  26. package/build/composite/legacy/index.js.map +1 -1
  27. package/build/composite/row.js +1 -1
  28. package/build/composite/row.js.map +1 -1
  29. package/build/composite/typeahead.js +1 -1
  30. package/build/composite/typeahead.js.map +1 -1
  31. package/build/composite/types.js.map +1 -1
  32. package/build/custom-select-control-v2/styles.js +9 -9
  33. package/build/custom-select-control-v2/styles.js.map +1 -1
  34. package/build/date-time/date/index.js +1 -1
  35. package/build/date-time/date/index.js.map +1 -1
  36. package/build/date-time/date/styles.js +35 -24
  37. package/build/date-time/date/styles.js.map +1 -1
  38. package/build/date-time/date/use-lilius/index.js +163 -0
  39. package/build/date-time/date/use-lilius/index.js.map +1 -0
  40. package/build/dropdown-menu-v2/styles.js +17 -17
  41. package/build/dropdown-menu-v2/styles.js.map +1 -1
  42. package/build/index.js +7 -0
  43. package/build/index.js.map +1 -1
  44. package/build/modal/index.js +27 -12
  45. package/build/modal/index.js.map +1 -1
  46. package/build/modal/types.js.map +1 -1
  47. package/build/modal/use-modal-exit-animation.js +75 -0
  48. package/build/modal/use-modal-exit-animation.js.map +1 -0
  49. package/build/navigator/navigator-screen/component.js +5 -0
  50. package/build/navigator/navigator-screen/component.js.map +1 -1
  51. package/build/private-apis.js +0 -9
  52. package/build/private-apis.js.map +1 -1
  53. package/build/range-control/styles/range-control-styles.js +28 -28
  54. package/build/range-control/styles/range-control-styles.js.map +1 -1
  55. package/build/slot-fill/index.js +1 -0
  56. package/build/slot-fill/index.js.map +1 -1
  57. package/build/tabs/styles.js +3 -3
  58. package/build/tabs/styles.js.map +1 -1
  59. package/build/tabs/tablist.js +5 -4
  60. package/build/tabs/tablist.js.map +1 -1
  61. package/build/utils/config-values.js +4 -5
  62. package/build/utils/config-values.js.map +1 -1
  63. package/build/utils/element-rect.js +73 -105
  64. package/build/utils/element-rect.js.map +1 -1
  65. package/build-module/box-control/all-input-control.js +2 -2
  66. package/build-module/box-control/all-input-control.js.map +1 -1
  67. package/build-module/box-control/utils.js +1 -1
  68. package/build-module/box-control/utils.js.map +1 -1
  69. package/build-module/card/card/component.js +2 -2
  70. package/build-module/card/card/component.js.map +1 -1
  71. package/build-module/card/styles.js +18 -18
  72. package/build-module/card/styles.js.map +1 -1
  73. package/build-module/combobox-control/index.js +3 -1
  74. package/build-module/combobox-control/index.js.map +1 -1
  75. package/build-module/combobox-control/types.js.map +1 -1
  76. package/build-module/composite/context.js +1 -1
  77. package/build-module/composite/context.js.map +1 -1
  78. package/build-module/composite/group-label.js +1 -1
  79. package/build-module/composite/group-label.js.map +1 -1
  80. package/build-module/composite/group.js +1 -1
  81. package/build-module/composite/group.js.map +1 -1
  82. package/build-module/composite/hover.js +1 -1
  83. package/build-module/composite/hover.js.map +1 -1
  84. package/build-module/composite/index.js +17 -26
  85. package/build-module/composite/index.js.map +1 -1
  86. package/build-module/composite/item.js +1 -1
  87. package/build-module/composite/item.js.map +1 -1
  88. package/build-module/composite/legacy/index.js +56 -8
  89. package/build-module/composite/legacy/index.js.map +1 -1
  90. package/build-module/composite/row.js +1 -1
  91. package/build-module/composite/row.js.map +1 -1
  92. package/build-module/composite/typeahead.js +1 -1
  93. package/build-module/composite/typeahead.js.map +1 -1
  94. package/build-module/composite/types.js.map +1 -1
  95. package/build-module/custom-select-control-v2/styles.js +9 -9
  96. package/build-module/custom-select-control-v2/styles.js.map +1 -1
  97. package/build-module/date-time/date/index.js +1 -2
  98. package/build-module/date-time/date/index.js.map +1 -1
  99. package/build-module/date-time/date/styles.js +31 -24
  100. package/build-module/date-time/date/styles.js.map +1 -1
  101. package/build-module/date-time/date/use-lilius/index.js +158 -0
  102. package/build-module/date-time/date/use-lilius/index.js.map +1 -0
  103. package/build-module/dropdown-menu-v2/styles.js +17 -17
  104. package/build-module/dropdown-menu-v2/styles.js.map +1 -1
  105. package/build-module/index.js +1 -0
  106. package/build-module/index.js.map +1 -1
  107. package/build-module/modal/index.js +29 -12
  108. package/build-module/modal/index.js.map +1 -1
  109. package/build-module/modal/types.js.map +1 -1
  110. package/build-module/modal/use-modal-exit-animation.js +68 -0
  111. package/build-module/modal/use-modal-exit-animation.js.map +1 -0
  112. package/build-module/navigator/navigator-screen/component.js +4 -0
  113. package/build-module/navigator/navigator-screen/component.js.map +1 -1
  114. package/build-module/private-apis.js +0 -9
  115. package/build-module/private-apis.js.map +1 -1
  116. package/build-module/range-control/styles/range-control-styles.js +28 -28
  117. package/build-module/range-control/styles/range-control-styles.js.map +1 -1
  118. package/build-module/slot-fill/index.js +1 -0
  119. package/build-module/slot-fill/index.js.map +1 -1
  120. package/build-module/tabs/styles.js +3 -3
  121. package/build-module/tabs/styles.js.map +1 -1
  122. package/build-module/tabs/tablist.js +5 -4
  123. package/build-module/tabs/tablist.js.map +1 -1
  124. package/build-module/utils/config-values.js +4 -5
  125. package/build-module/utils/config-values.js.map +1 -1
  126. package/build-module/utils/element-rect.js +74 -105
  127. package/build-module/utils/element-rect.js.map +1 -1
  128. package/build-style/style-rtl.css +51 -10
  129. package/build-style/style.css +51 -10
  130. package/build-types/box-control/all-input-control.d.ts.map +1 -1
  131. package/build-types/box-control/utils.d.ts +1 -1
  132. package/build-types/box-control/utils.d.ts.map +1 -1
  133. package/build-types/button-group/stories/index.story.d.ts +2 -2
  134. package/build-types/button-group/stories/index.story.d.ts.map +1 -1
  135. package/build-types/combobox-control/index.d.ts.map +1 -1
  136. package/build-types/combobox-control/stories/index.story.d.ts +4 -0
  137. package/build-types/combobox-control/stories/index.story.d.ts.map +1 -1
  138. package/build-types/combobox-control/types.d.ts +4 -0
  139. package/build-types/combobox-control/types.d.ts.map +1 -1
  140. package/build-types/composite/context.d.ts.map +1 -1
  141. package/build-types/composite/index.d.ts +36 -24
  142. package/build-types/composite/index.d.ts.map +1 -1
  143. package/build-types/composite/legacy/index.d.ts +25 -2
  144. package/build-types/composite/legacy/index.d.ts.map +1 -1
  145. package/build-types/composite/legacy/stories/index.story.d.ts.map +1 -1
  146. package/build-types/composite/stories/index.story.d.ts +9 -9
  147. package/build-types/composite/stories/index.story.d.ts.map +1 -1
  148. package/build-types/composite/types.d.ts +11 -10
  149. package/build-types/composite/types.d.ts.map +1 -1
  150. package/build-types/custom-select-control-v2/styles.d.ts.map +1 -1
  151. package/build-types/date-time/date/index.d.ts +0 -3
  152. package/build-types/date-time/date/index.d.ts.map +1 -1
  153. package/build-types/date-time/date/styles.d.ts.map +1 -1
  154. package/build-types/date-time/date/test/use-lilius.d.ts +2 -0
  155. package/build-types/date-time/date/test/use-lilius.d.ts.map +1 -0
  156. package/build-types/date-time/date/use-lilius/index.d.ts +169 -0
  157. package/build-types/date-time/date/use-lilius/index.d.ts.map +1 -0
  158. package/build-types/index.d.ts +1 -0
  159. package/build-types/index.d.ts.map +1 -1
  160. package/build-types/modal/index.d.ts.map +1 -1
  161. package/build-types/modal/stories/index.story.d.ts +3 -0
  162. package/build-types/modal/stories/index.story.d.ts.map +1 -1
  163. package/build-types/modal/types.d.ts +6 -10
  164. package/build-types/modal/types.d.ts.map +1 -1
  165. package/build-types/modal/use-modal-exit-animation.d.ts +9 -0
  166. package/build-types/modal/use-modal-exit-animation.d.ts.map +1 -0
  167. package/build-types/navigator/navigator-screen/component.d.ts.map +1 -1
  168. package/build-types/private-apis.d.ts.map +1 -1
  169. package/build-types/range-control/styles/range-control-styles.d.ts.map +1 -1
  170. package/build-types/slot-fill/index.d.ts +3 -0
  171. package/build-types/slot-fill/index.d.ts.map +1 -1
  172. package/build-types/tabs/styles.d.ts.map +1 -1
  173. package/build-types/tabs/tablist.d.ts.map +1 -1
  174. package/build-types/utils/config-values.d.ts +0 -1
  175. package/build-types/utils/element-rect.d.ts +32 -74
  176. package/build-types/utils/element-rect.d.ts.map +1 -1
  177. package/package.json +19 -20
  178. package/src/box-control/README.md +7 -0
  179. package/src/box-control/all-input-control.tsx +2 -3
  180. package/src/box-control/utils.ts +1 -1
  181. package/src/button-group/stories/index.story.tsx +10 -15
  182. package/src/card/card/component.tsx +1 -1
  183. package/src/card/styles.ts +1 -1
  184. package/src/card/test/__snapshots__/index.tsx.snap +54 -54
  185. package/src/combobox-control/README.md +7 -0
  186. package/src/combobox-control/index.tsx +2 -0
  187. package/src/combobox-control/test/index.tsx +40 -0
  188. package/src/combobox-control/types.ts +4 -0
  189. package/src/composite/README.md +5 -24
  190. package/src/composite/{context.ts → context.tsx} +1 -2
  191. package/src/composite/group-label.tsx +1 -1
  192. package/src/composite/group.tsx +1 -1
  193. package/src/composite/hover.tsx +1 -1
  194. package/src/composite/index.tsx +17 -28
  195. package/src/composite/item.tsx +1 -1
  196. package/src/composite/legacy/index.tsx +72 -11
  197. package/src/composite/legacy/stories/index.story.tsx +2 -1
  198. package/src/composite/legacy/test/index.tsx +57 -1
  199. package/src/composite/row.tsx +1 -1
  200. package/src/composite/stories/index.story.tsx +185 -169
  201. package/src/composite/typeahead.tsx +1 -1
  202. package/src/composite/types.ts +13 -15
  203. package/src/custom-select-control-v2/styles.ts +1 -0
  204. package/src/date-time/date/index.tsx +1 -1
  205. package/src/date-time/date/styles.ts +31 -11
  206. package/src/date-time/date/test/use-lilius.ts +417 -0
  207. package/src/date-time/date/use-lilius/index.ts +394 -0
  208. package/src/dropdown-menu-v2/styles.ts +1 -1
  209. package/src/form-toggle/style.scss +1 -0
  210. package/src/index.ts +1 -0
  211. package/src/modal/index.tsx +42 -19
  212. package/src/modal/stories/index.story.tsx +8 -14
  213. package/src/modal/style.scss +30 -8
  214. package/src/modal/types.ts +6 -18
  215. package/src/modal/use-modal-exit-animation.ts +99 -0
  216. package/src/navigator/navigator-screen/component.tsx +7 -0
  217. package/src/navigator/test/index.tsx +8 -0
  218. package/src/popover/style.scss +3 -2
  219. package/src/private-apis.ts +0 -9
  220. package/src/range-control/styles/range-control-styles.ts +1 -0
  221. package/src/resizable-box/style.scss +1 -1
  222. package/src/select-control/README.md +2 -2
  223. package/src/slot-fill/index.tsx +1 -0
  224. package/src/snackbar/style.scss +1 -1
  225. package/src/tabs/styles.ts +40 -11
  226. package/src/tabs/tablist.tsx +5 -4
  227. package/src/tooltip/style.scss +1 -0
  228. package/src/utils/config-values.js +4 -5
  229. package/src/utils/element-rect.ts +93 -130
  230. package/tsconfig.tsbuildinfo +1 -1
  231. package/build/composite/store.js +0 -54
  232. package/build/composite/store.js.map +0 -1
  233. package/build-module/composite/store.js +0 -46
  234. package/build-module/composite/store.js.map +0 -1
  235. package/build-types/composite/store.d.ts +0 -25
  236. package/build-types/composite/store.d.ts.map +0 -1
  237. package/build-types/composite/stories/utils.d.ts +0 -29
  238. package/build-types/composite/stories/utils.d.ts.map +0 -1
  239. package/src/composite/store.ts +0 -46
  240. package/src/composite/stories/utils.tsx +0 -76
@@ -188,6 +188,46 @@ describe.each( [
188
188
  expect( input ).toHaveValue( targetOption.label );
189
189
  } );
190
190
 
191
+ it( 'calls onFilterValueChange whenever the textbox changes', async () => {
192
+ const user = userEvent.setup();
193
+ const onFilterValueChangeSpy = jest.fn();
194
+ render(
195
+ <Component
196
+ options={ timezones }
197
+ label={ defaultLabelText }
198
+ onFilterValueChange={ onFilterValueChangeSpy }
199
+ />
200
+ );
201
+
202
+ const input = getInput( defaultLabelText );
203
+
204
+ await user.type( input, 'a' );
205
+ expect( onFilterValueChangeSpy ).toHaveBeenCalledWith( 'a' );
206
+ } );
207
+
208
+ it( 'clears the textbox value if there is no selected value on blur', async () => {
209
+ const user = userEvent.setup();
210
+ const onFilterValueChangeSpy = jest.fn();
211
+ render(
212
+ <Component
213
+ options={ timezones }
214
+ label={ defaultLabelText }
215
+ onFilterValueChange={ onFilterValueChangeSpy }
216
+ />
217
+ );
218
+ const input = getInput( defaultLabelText );
219
+
220
+ await user.type( input, 'a' );
221
+ expect( input ).toHaveValue( 'a' );
222
+
223
+ // Blur and focus the input.
224
+ await user.tab();
225
+ await user.click( input );
226
+
227
+ expect( input ).toHaveValue( '' );
228
+ expect( onFilterValueChangeSpy ).toHaveBeenLastCalledWith( '' );
229
+ } );
230
+
191
231
  it( 'should select the correct option from a search', async () => {
192
232
  const user = await userEvent.setup();
193
233
  const targetOption = timezones[ 13 ];
@@ -82,4 +82,8 @@ export type ComboboxControlProps = Pick<
82
82
  * The current value of the control.
83
83
  */
84
84
  value?: string | null;
85
+ /**
86
+ * If passed, the combobox input will show a placeholder string if no values are present.
87
+ */
88
+ placeholder?: string;
85
89
  };
@@ -1,18 +1,13 @@
1
1
  # `Composite`
2
2
 
3
- <div class="callout callout-alert">
4
- This feature is still experimental. “Experimental” means this is an early implementation subject to drastic and breaking changes.
5
- </div>
6
-
7
3
  `Composite` provides a single tab stop on the page and allows navigation through the focusable descendants with arrow keys. This abstract component is based on the [WAI-ARIA Composite Role⁠](https://w3c.github.io/aria/#composite).
8
4
 
9
5
  ## Usage
10
6
 
11
7
  ```jsx
12
- import { Composite, useCompositeStore } from '@wordpress/components';
8
+ import { Composite } from '@wordpress/components';
13
9
 
14
- const store = useCompositeStore();
15
- <Composite store={store}>
10
+ <Composite>
16
11
  <Composite.Group>
17
12
  <Composite.GroupLabel>Label</Composite.GroupLabel>
18
13
  <Composite.Item>Item 1</Composite.Item>
@@ -21,11 +16,11 @@ const store = useCompositeStore();
21
16
  </Composite>
22
17
  ```
23
18
 
24
- ## Hooks
19
+ ## Components
25
20
 
26
- ### `useCompositeStore`
21
+ ### `Composite`
27
22
 
28
- Creates a composite store.
23
+ Renders a composite widget.
29
24
 
30
25
  #### Props
31
26
 
@@ -131,20 +126,6 @@ This only affects the composite widget behavior. You still need to set `dir="rtl
131
126
  - Required: no
132
127
  - Default: `false`
133
128
 
134
- ## Components
135
-
136
- ### `Composite`
137
-
138
- Renders a composite widget.
139
-
140
- #### Props
141
-
142
- ##### `store`: `CompositeStore<CompositeStoreItem>`
143
-
144
- Object returned by the `useCompositeStore` hook.
145
-
146
- - Required: yes
147
-
148
129
  ##### `render`: `RenderProp<React.HTMLAttributes<any> & { ref?: React.Ref<any> | undefined; }> | React.ReactElement<any, string | React.JSXElementConstructor<any>>`
149
130
 
150
131
  Allows the component to be rendered as a different HTML element or React component. The value can be a React element or a function that takes in the original component props and gives back a React element with the props merged.
@@ -8,7 +8,6 @@ import { createContext, useContext } from '@wordpress/element';
8
8
  */
9
9
  import type { CompositeContextProps } from './types';
10
10
 
11
- export const CompositeContext =
12
- createContext< CompositeContextProps >( undefined );
11
+ export const CompositeContext = createContext< CompositeContextProps >( {} );
13
12
 
14
13
  export const useCompositeContext = () => useContext( CompositeContext );
@@ -22,7 +22,7 @@ export const CompositeGroupLabel = forwardRef<
22
22
  const context = useCompositeContext();
23
23
  return (
24
24
  <Ariakit.CompositeGroupLabel
25
- store={ context?.store }
25
+ store={ context.store as Ariakit.CompositeStore }
26
26
  { ...props }
27
27
  ref={ ref }
28
28
  />
@@ -22,7 +22,7 @@ export const CompositeGroup = forwardRef<
22
22
  const context = useCompositeContext();
23
23
  return (
24
24
  <Ariakit.CompositeGroup
25
- store={ context?.store }
25
+ store={ context.store as Ariakit.CompositeStore }
26
26
  { ...props }
27
27
  ref={ ref }
28
28
  />
@@ -22,7 +22,7 @@ export const CompositeHover = forwardRef<
22
22
  const context = useCompositeContext();
23
23
  return (
24
24
  <Ariakit.CompositeHover
25
- store={ context?.store }
25
+ store={ context.store as Ariakit.CompositeStore }
26
26
  { ...props }
27
27
  ref={ ref }
28
28
  />
@@ -16,6 +16,7 @@ import * as Ariakit from '@ariakit/react';
16
16
  /**
17
17
  * WordPress dependencies
18
18
  */
19
+ import { isRTL } from '@wordpress/i18n';
19
20
  import { useMemo, forwardRef } from '@wordpress/element';
20
21
 
21
22
  /**
@@ -38,10 +39,9 @@ import type { CompositeProps } from './types';
38
39
  *
39
40
  * @example
40
41
  * ```jsx
41
- * import { Composite, useCompositeStore } from '@wordpress/components';
42
+ * import { Composite } from '@wordpress/components';
42
43
  *
43
- * const store = useCompositeStore();
44
- * <Composite store={store}>
44
+ * <Composite>
45
45
  * <Composite.Item>Item 1</Composite.Item>
46
46
  * <Composite.Item>Item 2</Composite.Item>
47
47
  * </Composite>
@@ -62,21 +62,18 @@ export const Composite = Object.assign(
62
62
  focusShift = false,
63
63
  virtualFocus = false,
64
64
  orientation = 'both',
65
- rtl = false,
65
+ rtl = isRTL(),
66
66
 
67
67
  // Composite component props
68
68
  children,
69
69
  disabled = false,
70
70
 
71
- // To be removed
72
- store: storeProp,
73
-
74
71
  // Rest props
75
72
  ...props
76
73
  },
77
74
  ref
78
75
  ) {
79
- const newStore = Ariakit.useCompositeStore( {
76
+ const store = Ariakit.useCompositeStore( {
80
77
  activeId,
81
78
  defaultActiveId,
82
79
  setActiveId,
@@ -88,8 +85,6 @@ export const Composite = Object.assign(
88
85
  rtl,
89
86
  } );
90
87
 
91
- const store = storeProp || newStore;
92
-
93
88
  const contextValue = useMemo(
94
89
  () => ( {
95
90
  store,
@@ -116,10 +111,9 @@ export const Composite = Object.assign(
116
111
  *
117
112
  * @example
118
113
  * ```jsx
119
- * import { Composite, useCompositeStore } from '@wordpress/components';
114
+ * import { Composite } from '@wordpress/components';
120
115
  *
121
- * const store = useCompositeStore();
122
- * <Composite store={store}>
116
+ * <Composite>
123
117
  * <Composite.Group>
124
118
  * <Composite.GroupLabel>Label</Composite.GroupLabel>
125
119
  * <Composite.Item>Item 1</Composite.Item>
@@ -138,10 +132,9 @@ export const Composite = Object.assign(
138
132
  *
139
133
  * @example
140
134
  * ```jsx
141
- * import { Composite, useCompositeStore } from '@wordpress/components';
135
+ * import { Composite } from '@wordpress/components';
142
136
  *
143
- * const store = useCompositeStore();
144
- * <Composite store={store}>
137
+ * <Composite>
145
138
  * <Composite.Group>
146
139
  * <Composite.GroupLabel>Label</Composite.GroupLabel>
147
140
  * <Composite.Item>Item 1</Composite.Item>
@@ -158,10 +151,9 @@ export const Composite = Object.assign(
158
151
  *
159
152
  * @example
160
153
  * ```jsx
161
- * import { Composite, useCompositeStore } from '@wordpress/components';
154
+ * import { Composite } from '@wordpress/components';
162
155
  *
163
- * const store = useCompositeStore();
164
- * <Composite store={store}>
156
+ * <Composite>
165
157
  * <Composite.Item>Item 1</Composite.Item>
166
158
  * <Composite.Item>Item 2</Composite.Item>
167
159
  * <Composite.Item>Item 3</Composite.Item>
@@ -176,10 +168,9 @@ export const Composite = Object.assign(
176
168
  *
177
169
  * @example
178
170
  * ```jsx
179
- * import { Composite, useCompositeStore } from '@wordpress/components';
171
+ * import { Composite } from '@wordpress/components';
180
172
  *
181
- * const store = useCompositeStore();
182
- * <Composite store={store}>
173
+ * <Composite>
183
174
  * <Composite.Row>
184
175
  * <Composite.Item>Item 1.1</Composite.Item>
185
176
  * <Composite.Item>Item 1.2</Composite.Item>
@@ -201,10 +192,9 @@ export const Composite = Object.assign(
201
192
  *
202
193
  * @example
203
194
  * ```jsx
204
- * import { Composite, useCompositeStore } from '@wordpress/components';
195
+ * import { Composite } from '@wordpress/components';
205
196
  *
206
- * const store = useCompositeStore();
207
- * <Composite store={store}>
197
+ * <Composite>
208
198
  * <Composite.Hover render={ <Composite.Item /> }>
209
199
  * Item 1
210
200
  * </Composite.Hover>
@@ -224,10 +214,9 @@ export const Composite = Object.assign(
224
214
  *
225
215
  * @example
226
216
  * ```jsx
227
- * import { Composite, useCompositeStore } from '@wordpress/components';
217
+ * import { Composite } from '@wordpress/components';
228
218
  *
229
- * const store = useCompositeStore();
230
- * <Composite store={store} render={ <CompositeTypeahead /> }>
219
+ * <Composite render={ <CompositeTypeahead /> }>
231
220
  * <Composite.Item>Item 1</Composite.Item>
232
221
  * <Composite.Item>Item 2</Composite.Item>
233
222
  * </Composite>
@@ -22,7 +22,7 @@ export const CompositeItem = forwardRef<
22
22
  const context = useCompositeContext();
23
23
  return (
24
24
  <Ariakit.CompositeItem
25
- store={ context?.store }
25
+ store={ context.store as Ariakit.CompositeStore }
26
26
  { ...props }
27
27
  ref={ ref }
28
28
  />
@@ -13,17 +13,22 @@
13
13
  * @see https://ariakit.org/components/composite
14
14
  */
15
15
 
16
+ /**
17
+ * External dependencies
18
+ */
19
+ import * as Ariakit from '@ariakit/react';
20
+
16
21
  /**
17
22
  * WordPress dependencies
18
23
  */
19
24
  import { forwardRef } from '@wordpress/element';
25
+ import { useInstanceId } from '@wordpress/compose';
26
+ import deprecated from '@wordpress/deprecated';
20
27
 
21
28
  /**
22
29
  * Internal dependencies
23
30
  */
24
31
  import { Composite as Current } from '..';
25
- import { useCompositeStore } from '../store';
26
- import { useInstanceId } from '@wordpress/compose';
27
32
 
28
33
  type Orientation = 'horizontal' | 'vertical';
29
34
 
@@ -79,7 +84,7 @@ export interface LegacyStateOptions {
79
84
 
80
85
  type Component = React.FunctionComponent< any >;
81
86
 
82
- type CompositeStore = ReturnType< typeof useCompositeStore >;
87
+ type CompositeStore = ReturnType< typeof Ariakit.useCompositeStore >;
83
88
  type CompositeStoreState = { store: CompositeStore };
84
89
  export type CompositeState = CompositeStoreState &
85
90
  Required< Pick< LegacyStateOptions, 'baseId' > >;
@@ -119,12 +124,31 @@ function mapLegacyStatePropsToComponentProps(
119
124
  return legacyProps;
120
125
  }
121
126
 
127
+ const LEGACY_TO_NEW_DISPLAY_NAME = {
128
+ __unstableComposite: 'Composite',
129
+ __unstableCompositeGroup: 'Composite.Group or Composite.Row',
130
+ __unstableCompositeItem: 'Composite.Item',
131
+ __unstableUseCompositeState: 'Composite',
132
+ };
133
+
122
134
  function proxyComposite< C extends Component >(
123
135
  ProxiedComponent: C | React.ForwardRefExoticComponent< C >,
124
136
  propMap: Record< string, string > = {}
125
137
  ): CompositeComponent< C > {
126
- const displayName = ProxiedComponent.displayName;
138
+ const displayName = ProxiedComponent.displayName ?? '';
139
+
127
140
  const Component = ( legacyProps: CompositeStateProps ) => {
141
+ deprecated( `wp.components.${ displayName }`, {
142
+ since: '6.7',
143
+ alternative: LEGACY_TO_NEW_DISPLAY_NAME.hasOwnProperty(
144
+ displayName
145
+ )
146
+ ? LEGACY_TO_NEW_DISPLAY_NAME[
147
+ displayName as keyof typeof LEGACY_TO_NEW_DISPLAY_NAME
148
+ ]
149
+ : undefined,
150
+ } );
151
+
128
152
  const { store, ...rest } =
129
153
  mapLegacyStatePropsToComponentProps( legacyProps );
130
154
  const props = rest as ComponentProps< C >;
@@ -149,7 +173,7 @@ function proxyComposite< C extends Component >(
149
173
  // `CompositeRow`, but this has been split into two different
150
174
  // components. We handle that difference by checking on the
151
175
  // provided role, and returning the appropriate component.
152
- const unproxiedCompositeGroup = forwardRef<
176
+ const UnproxiedCompositeGroup = forwardRef<
153
177
  any,
154
178
  React.ComponentPropsWithoutRef< typeof Current.Group | typeof Current.Row >
155
179
  >( ( { role, ...props }, ref ) => {
@@ -157,15 +181,52 @@ const unproxiedCompositeGroup = forwardRef<
157
181
  return <Component ref={ ref } role={ role } { ...props } />;
158
182
  } );
159
183
 
160
- export const Composite = proxyComposite( Current, { baseId: 'id' } );
161
- export const CompositeGroup = proxyComposite( unproxiedCompositeGroup );
162
- export const CompositeItem = proxyComposite( Current.Item, {
163
- focusable: 'accessibleWhenDisabled',
164
- } );
184
+ /**
185
+ * _Note: please use the `Composite` component instead._
186
+ *
187
+ * @deprecated
188
+ */
189
+ export const Composite = proxyComposite(
190
+ Object.assign( Current, { displayName: '__unstableComposite' } ),
191
+ { baseId: 'id' }
192
+ );
193
+ /**
194
+ * _Note: please use the `Composite.Row` or `Composite.Group` components instead._
195
+ *
196
+ * @deprecated
197
+ */
198
+ export const CompositeGroup = proxyComposite(
199
+ Object.assign( UnproxiedCompositeGroup, {
200
+ displayName: '__unstableCompositeGroup',
201
+ } )
202
+ );
203
+ /**
204
+ * _Note: please use the `Composite.Item` component instead._
205
+ *
206
+ * @deprecated
207
+ */
208
+ export const CompositeItem = proxyComposite(
209
+ Object.assign( Current.Item, {
210
+ displayName: '__unstableCompositeItem',
211
+ } ),
212
+ {
213
+ focusable: 'accessibleWhenDisabled',
214
+ }
215
+ );
165
216
 
217
+ /**
218
+ * _Note: please use the `Composite` component instead._
219
+ *
220
+ * @deprecated
221
+ */
166
222
  export function useCompositeState(
167
223
  legacyStateOptions: LegacyStateOptions = {}
168
224
  ): CompositeState {
225
+ deprecated( `wp.components.__unstableUseCompositeState`, {
226
+ since: '6.7',
227
+ alternative: LEGACY_TO_NEW_DISPLAY_NAME.__unstableUseCompositeState,
228
+ } );
229
+
169
230
  const {
170
231
  baseId,
171
232
  currentId: defaultActiveId,
@@ -180,7 +241,7 @@ export function useCompositeState(
180
241
 
181
242
  return {
182
243
  baseId: useInstanceId( Composite, 'composite', baseId ),
183
- store: useCompositeStore( {
244
+ store: Ariakit.useCompositeStore( {
184
245
  defaultActiveId,
185
246
  rtl,
186
247
  orientation,
@@ -15,7 +15,8 @@ import {
15
15
  import { UseCompositeStatePlaceholder, transform } from './utils';
16
16
 
17
17
  const meta: Meta< typeof UseCompositeStatePlaceholder > = {
18
- title: 'Components/Composite',
18
+ title: 'Components (Deprecated)/Composite (Unstable)',
19
+ id: 'components-composite-unstable',
19
20
  component: UseCompositeStatePlaceholder,
20
21
  subcomponents: {
21
22
  Composite,
@@ -1,7 +1,12 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { queryByAttribute, render, screen } from '@testing-library/react';
4
+ import {
5
+ queryByAttribute,
6
+ render,
7
+ screen,
8
+ renderHook,
9
+ } from '@testing-library/react';
5
10
  import { press, waitFor } from '@ariakit/test';
6
11
 
7
12
  /**
@@ -156,6 +161,57 @@ function getShiftTestItems() {
156
161
  };
157
162
  }
158
163
 
164
+ // Checking for deprecation warnings before other tests because the `deprecated`
165
+ // utility only fires a console.warn the first time a component is rendered.
166
+ describe( 'Shows a deprecation warning', () => {
167
+ it( 'useCompositeState', () => {
168
+ renderHook( () => useCompositeState() );
169
+ expect( console ).toHaveWarnedWith(
170
+ 'wp.components.__unstableUseCompositeState is deprecated since version 6.7. Please use Composite instead.'
171
+ );
172
+ } );
173
+ it( 'Composite', () => {
174
+ const Test = () => {
175
+ const props = useCompositeState();
176
+ return <Composite { ...props } />;
177
+ };
178
+ render( <Test /> );
179
+ expect( console ).toHaveWarnedWith(
180
+ 'wp.components.__unstableComposite is deprecated since version 6.7. Please use Composite instead.'
181
+ );
182
+ } );
183
+ it( 'CompositeItem', () => {
184
+ const Test = () => {
185
+ const props = useCompositeState();
186
+ return (
187
+ <Composite { ...props }>
188
+ <CompositeItem { ...props } />
189
+ </Composite>
190
+ );
191
+ };
192
+ render( <Test /> );
193
+ expect( console ).toHaveWarnedWith(
194
+ 'wp.components.__unstableCompositeItem is deprecated since version 6.7. Please use Composite.Item instead.'
195
+ );
196
+ } );
197
+ it( 'CompositeGroup', () => {
198
+ const Test = () => {
199
+ const props = useCompositeState();
200
+ return (
201
+ <Composite { ...props }>
202
+ <CompositeGroup { ...props }>
203
+ <CompositeItem { ...props } />
204
+ </CompositeGroup>
205
+ </Composite>
206
+ );
207
+ };
208
+ render( <Test /> );
209
+ expect( console ).toHaveWarnedWith(
210
+ 'wp.components.__unstableCompositeGroup is deprecated since version 6.7. Please use Composite.Group or Composite.Row instead.'
211
+ );
212
+ } );
213
+ } );
214
+
159
215
  describe.each( [
160
216
  [
161
217
  'With "spread" state',
@@ -22,7 +22,7 @@ export const CompositeRow = forwardRef<
22
22
  const context = useCompositeContext();
23
23
  return (
24
24
  <Ariakit.CompositeRow
25
- store={ context?.store }
25
+ store={ context.store as Ariakit.CompositeStore }
26
26
  { ...props }
27
27
  ref={ ref }
28
28
  />