@wordpress/components 30.6.1-next.ff1cebbba.0 → 30.7.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 (147) hide show
  1. package/CHANGELOG.md +26 -1
  2. package/build/color-palette/styles.js +2 -12
  3. package/build/color-palette/styles.js.map +2 -2
  4. package/build/combobox-control/index.js +1 -2
  5. package/build/combobox-control/index.js.map +2 -2
  6. package/build/custom-select-control-v2/custom-select.js +2 -2
  7. package/build/custom-select-control-v2/custom-select.js.map +2 -2
  8. package/build/date-time/date/styles.js +9 -9
  9. package/build/date-time/date/styles.js.map +2 -2
  10. package/build/focal-point-picker/index.js +21 -10
  11. package/build/focal-point-picker/index.js.map +3 -3
  12. package/build/focal-point-picker/styles/focal-point-picker-style.js +20 -11
  13. package/build/focal-point-picker/styles/focal-point-picker-style.js.map +2 -2
  14. package/build/font-size-picker/font-size-picker-select.js +20 -19
  15. package/build/font-size-picker/font-size-picker-select.js.map +3 -3
  16. package/build/font-size-picker/font-size-picker-toggle-group.js +27 -3
  17. package/build/font-size-picker/font-size-picker-toggle-group.js.map +2 -2
  18. package/build/font-size-picker/index.js +23 -11
  19. package/build/font-size-picker/index.js.map +2 -2
  20. package/build/font-size-picker/styles.js +30 -13
  21. package/build/font-size-picker/styles.js.map +3 -3
  22. package/build/font-size-picker/utils.js +11 -0
  23. package/build/font-size-picker/utils.js.map +2 -2
  24. package/build/palette-edit/styles.js +9 -9
  25. package/build/palette-edit/styles.js.map +2 -2
  26. package/build/popover/index.js +13 -2
  27. package/build/popover/index.js.map +2 -2
  28. package/build/tabs/styles.js +5 -5
  29. package/build/tabs/styles.js.map +1 -1
  30. package/build/tools-panel/styles.js +14 -22
  31. package/build/tools-panel/styles.js.map +2 -2
  32. package/build/utils/base-label.js +12 -12
  33. package/build/utils/base-label.js.map +3 -3
  34. package/build/utils/config-values.js +2 -0
  35. package/build/utils/config-values.js.map +2 -2
  36. package/build-module/color-palette/styles.js +2 -12
  37. package/build-module/color-palette/styles.js.map +2 -2
  38. package/build-module/combobox-control/index.js +1 -2
  39. package/build-module/combobox-control/index.js.map +2 -2
  40. package/build-module/custom-select-control-v2/custom-select.js +1 -1
  41. package/build-module/custom-select-control-v2/custom-select.js.map +1 -1
  42. package/build-module/date-time/date/styles.js +9 -9
  43. package/build-module/date-time/date/styles.js.map +2 -2
  44. package/build-module/focal-point-picker/index.js +23 -12
  45. package/build-module/focal-point-picker/index.js.map +2 -2
  46. package/build-module/focal-point-picker/styles/focal-point-picker-style.js +20 -12
  47. package/build-module/focal-point-picker/styles/focal-point-picker-style.js.map +2 -2
  48. package/build-module/font-size-picker/font-size-picker-select.js +21 -10
  49. package/build-module/font-size-picker/font-size-picker-select.js.map +2 -2
  50. package/build-module/font-size-picker/font-size-picker-toggle-group.js +27 -3
  51. package/build-module/font-size-picker/font-size-picker-toggle-group.js.map +2 -2
  52. package/build-module/font-size-picker/index.js +23 -11
  53. package/build-module/font-size-picker/index.js.map +2 -2
  54. package/build-module/font-size-picker/styles.js +28 -12
  55. package/build-module/font-size-picker/styles.js.map +2 -2
  56. package/build-module/font-size-picker/utils.js +10 -0
  57. package/build-module/font-size-picker/utils.js.map +2 -2
  58. package/build-module/palette-edit/styles.js +9 -9
  59. package/build-module/palette-edit/styles.js.map +2 -2
  60. package/build-module/popover/index.js +13 -2
  61. package/build-module/popover/index.js.map +2 -2
  62. package/build-module/tabs/styles.js +5 -5
  63. package/build-module/tabs/styles.js.map +1 -1
  64. package/build-module/tools-panel/styles.js +14 -22
  65. package/build-module/tools-panel/styles.js.map +2 -2
  66. package/build-module/utils/base-label.js +2 -12
  67. package/build-module/utils/base-label.js.map +2 -2
  68. package/build-module/utils/config-values.js +2 -0
  69. package/build-module/utils/config-values.js.map +2 -2
  70. package/build-style/style-rtl.css +11 -5
  71. package/build-style/style.css +11 -5
  72. package/build-types/card/card-body/component.d.ts.map +1 -1
  73. package/build-types/card/card-body/hook.d.ts.map +1 -1
  74. package/build-types/card/card-footer/component.d.ts +1 -3
  75. package/build-types/card/card-footer/component.d.ts.map +1 -1
  76. package/build-types/card/card-footer/hook.d.ts +6 -0
  77. package/build-types/card/card-footer/hook.d.ts.map +1 -1
  78. package/build-types/card/card-header/component.d.ts +1 -1
  79. package/build-types/card/card-header/component.d.ts.map +1 -1
  80. package/build-types/card/card-header/hook.d.ts +7 -0
  81. package/build-types/card/card-header/hook.d.ts.map +1 -1
  82. package/build-types/card/card-media/hook.d.ts.map +1 -1
  83. package/build-types/card/types.d.ts +3 -8
  84. package/build-types/card/types.d.ts.map +1 -1
  85. package/build-types/color-palette/styles.d.ts.map +1 -1
  86. package/build-types/combobox-control/index.d.ts.map +1 -1
  87. package/build-types/combobox-control/stories/index.story.d.ts.map +1 -1
  88. package/build-types/date-time/date/styles.d.ts.map +1 -1
  89. package/build-types/focal-point-picker/index.d.ts +1 -1
  90. package/build-types/focal-point-picker/index.d.ts.map +1 -1
  91. package/build-types/focal-point-picker/styles/focal-point-picker-style.d.ts +253 -0
  92. package/build-types/focal-point-picker/styles/focal-point-picker-style.d.ts.map +1 -1
  93. package/build-types/font-size-picker/font-size-picker-select.d.ts +3 -0
  94. package/build-types/font-size-picker/font-size-picker-select.d.ts.map +1 -1
  95. package/build-types/font-size-picker/font-size-picker-toggle-group.d.ts.map +1 -1
  96. package/build-types/font-size-picker/index.d.ts.map +1 -1
  97. package/build-types/font-size-picker/styles.d.ts +3 -0
  98. package/build-types/font-size-picker/styles.d.ts.map +1 -1
  99. package/build-types/font-size-picker/test/font-size-picker-select.d.ts +2 -0
  100. package/build-types/font-size-picker/test/font-size-picker-select.d.ts.map +1 -0
  101. package/build-types/font-size-picker/test/font-size-picker-toggle-group.d.ts +2 -0
  102. package/build-types/font-size-picker/test/font-size-picker-toggle-group.d.ts.map +1 -0
  103. package/build-types/font-size-picker/types.d.ts +18 -4
  104. package/build-types/font-size-picker/types.d.ts.map +1 -1
  105. package/build-types/font-size-picker/utils.d.ts +10 -1
  106. package/build-types/font-size-picker/utils.d.ts.map +1 -1
  107. package/build-types/popover/index.d.ts.map +1 -1
  108. package/build-types/utils/base-label.d.ts.map +1 -1
  109. package/build-types/utils/config-values.d.ts +1 -0
  110. package/package.json +20 -20
  111. package/src/badge/styles.scss +1 -0
  112. package/src/button/style.scss +4 -1
  113. package/src/card/types.ts +3 -9
  114. package/src/color-palette/styles.ts +2 -1
  115. package/src/combobox-control/index.tsx +1 -4
  116. package/src/combobox-control/stories/index.story.tsx +0 -1
  117. package/src/combobox-control/test/index.tsx +20 -7
  118. package/src/custom-select-control-v2/custom-select.tsx +1 -1
  119. package/src/date-time/date/styles.ts +1 -0
  120. package/src/dimension-control/test/__snapshots__/index.test.js.snap +4 -4
  121. package/src/dropdown-menu/style.scss +1 -0
  122. package/src/focal-point-picker/index.tsx +26 -16
  123. package/src/focal-point-picker/styles/focal-point-picker-style.ts +11 -1
  124. package/src/font-size-picker/README.md +10 -0
  125. package/src/font-size-picker/font-size-picker-select.tsx +44 -11
  126. package/src/font-size-picker/font-size-picker-toggle-group.tsx +58 -4
  127. package/src/font-size-picker/index.tsx +44 -19
  128. package/src/font-size-picker/styles.ts +9 -0
  129. package/src/font-size-picker/test/font-size-picker-select.tsx +221 -0
  130. package/src/font-size-picker/test/font-size-picker-toggle-group.tsx +275 -0
  131. package/src/font-size-picker/test/index.tsx +460 -2
  132. package/src/font-size-picker/types.ts +24 -4
  133. package/src/font-size-picker/utils.ts +23 -1
  134. package/src/menu-group/style.scss +1 -1
  135. package/src/menu-item/style.scss +1 -0
  136. package/src/modal/style.scss +1 -1
  137. package/src/palette-edit/styles.ts +1 -1
  138. package/src/panel/style.scss +1 -1
  139. package/src/popover/index.tsx +23 -2
  140. package/src/tab-panel/style.scss +1 -1
  141. package/src/tabs/styles.ts +1 -1
  142. package/src/toggle-group-control/test/__snapshots__/index.tsx.snap +4 -4
  143. package/src/tools-panel/styles.ts +2 -2
  144. package/src/utils/base-label.ts +6 -1
  145. package/src/utils/config-values.js +1 -0
  146. package/src/validated-form-controls/style.scss +1 -1
  147. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,275 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { screen } from '@testing-library/react';
5
+ import userEvent from '@testing-library/user-event';
6
+ import { render } from '@ariakit/test/react';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import FontSizePickerToggleGroup from '../font-size-picker-toggle-group';
12
+ import type { FontSize } from '../types';
13
+
14
+ describe( 'FontSizePickerToggleGroup', () => {
15
+ const fontSizes: FontSize[] = [
16
+ {
17
+ slug: 'small',
18
+ name: 'Small',
19
+ size: '12px',
20
+ },
21
+ {
22
+ slug: 'medium',
23
+ name: 'Medium',
24
+ size: '16px',
25
+ },
26
+ {
27
+ slug: 'large',
28
+ name: 'Large',
29
+ size: '20px',
30
+ },
31
+ ];
32
+
33
+ describe( 'valueMode prop', () => {
34
+ it( 'should find font size by size value when valueMode is literal', async () => {
35
+ const onChange = jest.fn();
36
+ await render(
37
+ <FontSizePickerToggleGroup
38
+ fontSizes={ fontSizes }
39
+ value="16px"
40
+ valueMode="literal"
41
+ onChange={ onChange }
42
+ __next40pxDefaultSize={ false }
43
+ size="default"
44
+ />
45
+ );
46
+ // Should select the medium option (16px)
47
+ expect(
48
+ screen.getByRole( 'radio', { checked: true } )
49
+ ).toHaveAccessibleName( 'Medium' );
50
+ } );
51
+
52
+ it( 'should find font size by slug when valueMode is slug', async () => {
53
+ const onChange = jest.fn();
54
+ await render(
55
+ <FontSizePickerToggleGroup
56
+ fontSizes={ fontSizes }
57
+ value="medium"
58
+ valueMode="slug"
59
+ onChange={ onChange }
60
+ __next40pxDefaultSize={ false }
61
+ size="default"
62
+ />
63
+ );
64
+ // Should select the medium option
65
+ expect(
66
+ screen.getByRole( 'radio', { checked: true } )
67
+ ).toHaveAccessibleName( 'Medium' );
68
+ } );
69
+
70
+ it( 'should handle undefined value', async () => {
71
+ const onChange = jest.fn();
72
+ await render(
73
+ <FontSizePickerToggleGroup
74
+ fontSizes={ fontSizes }
75
+ value={ undefined }
76
+ valueMode="literal"
77
+ onChange={ onChange }
78
+ __next40pxDefaultSize={ false }
79
+ size="default"
80
+ />
81
+ );
82
+ // Should have no selection
83
+ expect(
84
+ screen.queryByRole( 'radio', { checked: true } )
85
+ ).not.toBeInTheDocument();
86
+ } );
87
+
88
+ it( 'should handle empty string value', async () => {
89
+ const onChange = jest.fn();
90
+ await render(
91
+ <FontSizePickerToggleGroup
92
+ fontSizes={ fontSizes }
93
+ value=""
94
+ valueMode="literal"
95
+ onChange={ onChange }
96
+ __next40pxDefaultSize={ false }
97
+ size="default"
98
+ />
99
+ );
100
+ // Should have no selection
101
+ expect(
102
+ screen.queryByRole( 'radio', { checked: true } )
103
+ ).not.toBeInTheDocument();
104
+ } );
105
+ } );
106
+
107
+ describe( 'onChange callback', () => {
108
+ it( 'should call onChange with FontSize object as second parameter', async () => {
109
+ const user = userEvent.setup();
110
+ const onChange = jest.fn();
111
+ await render(
112
+ <FontSizePickerToggleGroup
113
+ fontSizes={ fontSizes }
114
+ onChange={ onChange }
115
+ __next40pxDefaultSize={ false }
116
+ size="default"
117
+ />
118
+ );
119
+ await user.click( screen.getByRole( 'radio', { name: 'Small' } ) );
120
+ expect( onChange ).toHaveBeenCalledWith( '12px', fontSizes[ 0 ] );
121
+ } );
122
+
123
+ it( 'should call onChange with FontSize object when selecting a different option', async () => {
124
+ const user = userEvent.setup();
125
+ const onChange = jest.fn();
126
+ await render(
127
+ <FontSizePickerToggleGroup
128
+ fontSizes={ fontSizes }
129
+ value="medium"
130
+ onChange={ onChange }
131
+ __next40pxDefaultSize={ false }
132
+ size="default"
133
+ />
134
+ );
135
+ // Click a different option
136
+ await user.click( screen.getByRole( 'radio', { name: 'Small' } ) );
137
+ expect( onChange ).toHaveBeenCalledWith( '12px', fontSizes[ 0 ] );
138
+ } );
139
+ } );
140
+
141
+ describe( 'edge cases', () => {
142
+ const fontSizesWithDuplicates: FontSize[] = [
143
+ {
144
+ slug: 'small-1',
145
+ name: 'Small 1',
146
+ size: '12px',
147
+ },
148
+ {
149
+ slug: 'small-2',
150
+ name: 'Small 2',
151
+ size: '12px',
152
+ },
153
+ {
154
+ slug: 'medium',
155
+ name: 'Medium',
156
+ size: '16px',
157
+ },
158
+ ];
159
+
160
+ it( 'should handle multiple font sizes with same value in literal mode', async () => {
161
+ const onChange = jest.fn();
162
+ await render(
163
+ <FontSizePickerToggleGroup
164
+ fontSizes={ fontSizesWithDuplicates }
165
+ value="12px"
166
+ valueMode="literal"
167
+ onChange={ onChange }
168
+ __next40pxDefaultSize={ false }
169
+ size="default"
170
+ />
171
+ );
172
+ // Should have no selection when there are multiple matches
173
+ expect(
174
+ screen.queryByRole( 'radio', { checked: true } )
175
+ ).not.toBeInTheDocument();
176
+ } );
177
+
178
+ it( 'should handle multiple font sizes with same value in slug mode', async () => {
179
+ const onChange = jest.fn();
180
+ await render(
181
+ <FontSizePickerToggleGroup
182
+ fontSizes={ fontSizesWithDuplicates }
183
+ value="small-1"
184
+ valueMode="slug"
185
+ onChange={ onChange }
186
+ __next40pxDefaultSize={ false }
187
+ size="default"
188
+ />
189
+ );
190
+ // Should select the specific font size by slug
191
+ expect(
192
+ screen.getByRole( 'radio', { checked: true } )
193
+ ).toHaveAccessibleName( 'Small 1' );
194
+ } );
195
+ } );
196
+
197
+ describe( 'heterogeneous font sizes', () => {
198
+ const heterogeneousFontSizes: FontSize[] = [
199
+ {
200
+ slug: 'small',
201
+ name: 'Small',
202
+ size: '12px',
203
+ },
204
+ {
205
+ slug: 'medium',
206
+ name: 'Medium',
207
+ size: '1em',
208
+ },
209
+ {
210
+ slug: 'large',
211
+ name: 'Large',
212
+ size: '2rem',
213
+ },
214
+ {
215
+ slug: 'x-large',
216
+ name: 'Extra Large',
217
+ size: 'clamp(1.75rem, 3vw, 2.25rem)',
218
+ },
219
+ ];
220
+
221
+ it( 'should handle different units in literal mode', async () => {
222
+ const onChange = jest.fn();
223
+ await render(
224
+ <FontSizePickerToggleGroup
225
+ fontSizes={ heterogeneousFontSizes }
226
+ value="1em"
227
+ valueMode="literal"
228
+ onChange={ onChange }
229
+ __next40pxDefaultSize={ false }
230
+ size="default"
231
+ />
232
+ );
233
+ // Should select the medium option (1em)
234
+ expect(
235
+ screen.getByRole( 'radio', { checked: true } )
236
+ ).toHaveAccessibleName( 'Medium' );
237
+ } );
238
+
239
+ it( 'should handle complex font size values in literal mode', async () => {
240
+ const onChange = jest.fn();
241
+ await render(
242
+ <FontSizePickerToggleGroup
243
+ fontSizes={ heterogeneousFontSizes }
244
+ value="clamp(1.75rem, 3vw, 2.25rem)"
245
+ valueMode="literal"
246
+ onChange={ onChange }
247
+ __next40pxDefaultSize={ false }
248
+ size="default"
249
+ />
250
+ );
251
+ // Should select the extra large option
252
+ expect(
253
+ screen.getByRole( 'radio', { checked: true } )
254
+ ).toHaveAccessibleName( 'Extra Large' );
255
+ } );
256
+
257
+ it( 'should handle different units in slug mode', async () => {
258
+ const onChange = jest.fn();
259
+ await render(
260
+ <FontSizePickerToggleGroup
261
+ fontSizes={ heterogeneousFontSizes }
262
+ value="medium"
263
+ valueMode="slug"
264
+ onChange={ onChange }
265
+ __next40pxDefaultSize={ false }
266
+ size="default"
267
+ />
268
+ );
269
+ // Should select the medium option
270
+ expect(
271
+ screen.getByRole( 'radio', { checked: true } )
272
+ ).toHaveAccessibleName( 'Medium' );
273
+ } );
274
+ } );
275
+ } );