@wordpress/components 21.2.0 → 21.3.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 (302) hide show
  1. package/CHANGELOG.md +35 -3
  2. package/CONTRIBUTING.md +20 -0
  3. package/build/border-box-control/border-box-control/component.js +2 -0
  4. package/build/border-box-control/border-box-control/component.js.map +1 -1
  5. package/build/border-box-control/border-box-control/hook.js +4 -1
  6. package/build/border-box-control/border-box-control/hook.js.map +1 -1
  7. package/build/border-control/border-control/component.js +2 -0
  8. package/build/border-control/border-control/component.js.map +1 -1
  9. package/build/disabled/index.js +6 -26
  10. package/build/disabled/index.js.map +1 -1
  11. package/build/font-size-picker/index.js +1 -1
  12. package/build/font-size-picker/index.js.map +1 -1
  13. package/build/font-size-picker/styles.js +5 -13
  14. package/build/font-size-picker/styles.js.map +1 -1
  15. package/build/font-size-picker/utils.js +1 -1
  16. package/build/font-size-picker/utils.js.map +1 -1
  17. package/build/form-token-field/suggestions-list.js +5 -5
  18. package/build/form-token-field/suggestions-list.js.map +1 -1
  19. package/build/higher-order/with-fallback-styles/index.js +1 -1
  20. package/build/higher-order/with-fallback-styles/index.js.map +1 -1
  21. package/build/index.js +8 -6
  22. package/build/index.js.map +1 -1
  23. package/build/modal/aria-helper.js +2 -3
  24. package/build/modal/aria-helper.js.map +1 -1
  25. package/build/modal/index.js +42 -11
  26. package/build/modal/index.js.map +1 -1
  27. package/build/modal/types.js +6 -0
  28. package/build/modal/types.js.map +1 -0
  29. package/build/navigator/index.js +8 -8
  30. package/build/navigator/index.js.map +1 -1
  31. package/build/navigator/navigator-back-button/component.js +5 -4
  32. package/build/navigator/navigator-back-button/component.js.map +1 -1
  33. package/build/navigator/navigator-back-button/index.js +1 -1
  34. package/build/navigator/navigator-back-button/index.js.map +1 -1
  35. package/build/navigator/navigator-button/component.js +5 -4
  36. package/build/navigator/navigator-button/component.js.map +1 -1
  37. package/build/navigator/navigator-button/index.js +1 -1
  38. package/build/navigator/navigator-button/index.js.map +1 -1
  39. package/build/navigator/navigator-provider/component.js +10 -7
  40. package/build/navigator/navigator-provider/component.js.map +1 -1
  41. package/build/navigator/navigator-provider/index.js +1 -1
  42. package/build/navigator/navigator-provider/index.js.map +1 -1
  43. package/build/navigator/navigator-screen/component.js +24 -27
  44. package/build/navigator/navigator-screen/component.js.map +1 -1
  45. package/build/navigator/navigator-screen/index.js +1 -1
  46. package/build/navigator/navigator-screen/index.js.map +1 -1
  47. package/build/sandbox/index.js +55 -59
  48. package/build/sandbox/index.js.map +1 -1
  49. package/build/sandbox/index.native.js +63 -62
  50. package/build/sandbox/index.native.js.map +1 -1
  51. package/build/slot-fill/bubbles-virtually/slot-fill-provider.js +1 -1
  52. package/build/slot-fill/bubbles-virtually/slot-fill-provider.js.map +1 -1
  53. package/build/tab-panel/index.js +4 -4
  54. package/build/tab-panel/index.js.map +1 -1
  55. package/build/theme/index.js +62 -0
  56. package/build/theme/index.js.map +1 -0
  57. package/build/theme/styles.js +33 -0
  58. package/build/theme/styles.js.map +1 -0
  59. package/build/theme/types.js +6 -0
  60. package/build/theme/types.js.map +1 -0
  61. package/build/tools-panel/tools-panel/hook.js +3 -3
  62. package/build/tools-panel/tools-panel/hook.js.map +1 -1
  63. package/build/tools-panel/tools-panel-item/hook.js +6 -6
  64. package/build/tools-panel/tools-panel-item/hook.js.map +1 -1
  65. package/build/tooltip/index.js +4 -1
  66. package/build/tooltip/index.js.map +1 -1
  67. package/build/tooltip/index.native.js +17 -4
  68. package/build/tooltip/index.native.js.map +1 -1
  69. package/build-module/border-box-control/border-box-control/component.js +2 -0
  70. package/build-module/border-box-control/border-box-control/component.js.map +1 -1
  71. package/build-module/border-box-control/border-box-control/hook.js +4 -1
  72. package/build-module/border-box-control/border-box-control/hook.js.map +1 -1
  73. package/build-module/border-control/border-control/component.js +2 -0
  74. package/build-module/border-control/border-control/component.js.map +1 -1
  75. package/build-module/disabled/index.js +7 -26
  76. package/build-module/disabled/index.js.map +1 -1
  77. package/build-module/font-size-picker/index.js +1 -1
  78. package/build-module/font-size-picker/index.js.map +1 -1
  79. package/build-module/font-size-picker/styles.js +5 -13
  80. package/build-module/font-size-picker/styles.js.map +1 -1
  81. package/build-module/font-size-picker/utils.js +1 -1
  82. package/build-module/font-size-picker/utils.js.map +1 -1
  83. package/build-module/form-token-field/suggestions-list.js +5 -5
  84. package/build-module/form-token-field/suggestions-list.js.map +1 -1
  85. package/build-module/higher-order/with-fallback-styles/index.js +2 -2
  86. package/build-module/higher-order/with-fallback-styles/index.js.map +1 -1
  87. package/build-module/index.js +2 -1
  88. package/build-module/index.js.map +1 -1
  89. package/build-module/modal/aria-helper.js +2 -3
  90. package/build-module/modal/aria-helper.js.map +1 -1
  91. package/build-module/modal/index.js +44 -12
  92. package/build-module/modal/index.js.map +1 -1
  93. package/build-module/modal/types.js +2 -0
  94. package/build-module/modal/types.js.map +1 -0
  95. package/build-module/navigator/index.js +4 -4
  96. package/build-module/navigator/index.js.map +1 -1
  97. package/build-module/navigator/navigator-back-button/component.js +3 -3
  98. package/build-module/navigator/navigator-back-button/component.js.map +1 -1
  99. package/build-module/navigator/navigator-back-button/index.js +1 -1
  100. package/build-module/navigator/navigator-back-button/index.js.map +1 -1
  101. package/build-module/navigator/navigator-button/component.js +3 -3
  102. package/build-module/navigator/navigator-button/component.js.map +1 -1
  103. package/build-module/navigator/navigator-button/index.js +1 -1
  104. package/build-module/navigator/navigator-button/index.js.map +1 -1
  105. package/build-module/navigator/navigator-provider/component.js +8 -6
  106. package/build-module/navigator/navigator-provider/component.js.map +1 -1
  107. package/build-module/navigator/navigator-provider/index.js +1 -1
  108. package/build-module/navigator/navigator-provider/index.js.map +1 -1
  109. package/build-module/navigator/navigator-screen/component.js +12 -26
  110. package/build-module/navigator/navigator-screen/component.js.map +1 -1
  111. package/build-module/navigator/navigator-screen/index.js +1 -1
  112. package/build-module/navigator/navigator-screen/index.js.map +1 -1
  113. package/build-module/sandbox/index.js +56 -59
  114. package/build-module/sandbox/index.js.map +1 -1
  115. package/build-module/sandbox/index.native.js +54 -52
  116. package/build-module/sandbox/index.native.js.map +1 -1
  117. package/build-module/slot-fill/bubbles-virtually/slot-fill-provider.js +1 -1
  118. package/build-module/slot-fill/bubbles-virtually/slot-fill-provider.js.map +1 -1
  119. package/build-module/tab-panel/index.js +4 -4
  120. package/build-module/tab-panel/index.js.map +1 -1
  121. package/build-module/theme/index.js +52 -0
  122. package/build-module/theme/index.js.map +1 -0
  123. package/build-module/theme/styles.js +25 -0
  124. package/build-module/theme/styles.js.map +1 -0
  125. package/build-module/theme/types.js +2 -0
  126. package/build-module/theme/types.js.map +1 -0
  127. package/build-module/tools-panel/tools-panel/hook.js +3 -3
  128. package/build-module/tools-panel/tools-panel/hook.js.map +1 -1
  129. package/build-module/tools-panel/tools-panel-item/hook.js +6 -6
  130. package/build-module/tools-panel/tools-panel-item/hook.js.map +1 -1
  131. package/build-module/tooltip/index.js +4 -1
  132. package/build-module/tooltip/index.js.map +1 -1
  133. package/build-module/tooltip/index.native.js +17 -4
  134. package/build-module/tooltip/index.native.js.map +1 -1
  135. package/build-style/style-rtl.css +26 -22
  136. package/build-style/style.css +26 -22
  137. package/build-types/border-box-control/border-box-control/component.d.ts.map +1 -1
  138. package/build-types/border-box-control/border-box-control/hook.d.ts +1 -0
  139. package/build-types/border-box-control/border-box-control/hook.d.ts.map +1 -1
  140. package/build-types/border-control/border-control/component.d.ts +1 -0
  141. package/build-types/border-control/border-control/component.d.ts.map +1 -1
  142. package/build-types/border-control/border-control/hook.d.ts +1 -0
  143. package/build-types/border-control/border-control/hook.d.ts.map +1 -1
  144. package/build-types/border-control/stories/index.d.ts +6 -0
  145. package/build-types/border-control/stories/index.d.ts.map +1 -1
  146. package/build-types/border-control/types.d.ts +4 -0
  147. package/build-types/border-control/types.d.ts.map +1 -1
  148. package/build-types/confirm-dialog/types.d.ts +5 -1
  149. package/build-types/confirm-dialog/types.d.ts.map +1 -1
  150. package/build-types/disabled/index.d.ts.map +1 -1
  151. package/build-types/font-size-picker/styles.d.ts.map +1 -1
  152. package/build-types/modal/aria-helper.d.ts +4 -4
  153. package/build-types/modal/aria-helper.d.ts.map +1 -1
  154. package/build-types/modal/index.d.ts +35 -2
  155. package/build-types/modal/index.d.ts.map +1 -1
  156. package/build-types/modal/stories/index.d.ts +9 -0
  157. package/build-types/modal/stories/index.d.ts.map +1 -0
  158. package/build-types/modal/test/aria-helper.d.ts +2 -0
  159. package/build-types/modal/test/aria-helper.d.ts.map +1 -0
  160. package/build-types/modal/test/index.d.ts +2 -0
  161. package/build-types/modal/test/index.d.ts.map +1 -0
  162. package/build-types/modal/types.d.ts +134 -0
  163. package/build-types/modal/types.d.ts.map +1 -0
  164. package/build-types/navigator/index.d.ts +4 -4
  165. package/build-types/navigator/index.d.ts.map +1 -1
  166. package/build-types/navigator/navigator-back-button/component.d.ts +4 -2
  167. package/build-types/navigator/navigator-back-button/component.d.ts.map +1 -1
  168. package/build-types/navigator/navigator-back-button/hook.d.ts +1 -0
  169. package/build-types/navigator/navigator-back-button/hook.d.ts.map +1 -1
  170. package/build-types/navigator/navigator-back-button/index.d.ts +1 -1
  171. package/build-types/navigator/navigator-back-button/index.d.ts.map +1 -1
  172. package/build-types/navigator/navigator-button/component.d.ts +4 -2
  173. package/build-types/navigator/navigator-button/component.d.ts.map +1 -1
  174. package/build-types/navigator/navigator-button/hook.d.ts +1 -0
  175. package/build-types/navigator/navigator-button/hook.d.ts.map +1 -1
  176. package/build-types/navigator/navigator-button/index.d.ts +1 -1
  177. package/build-types/navigator/navigator-button/index.d.ts.map +1 -1
  178. package/build-types/navigator/navigator-provider/component.d.ts +2 -2
  179. package/build-types/navigator/navigator-provider/component.d.ts.map +1 -1
  180. package/build-types/navigator/navigator-provider/index.d.ts +1 -1
  181. package/build-types/navigator/navigator-provider/index.d.ts.map +1 -1
  182. package/build-types/navigator/navigator-screen/component.d.ts +2 -2
  183. package/build-types/navigator/navigator-screen/component.d.ts.map +1 -1
  184. package/build-types/navigator/navigator-screen/index.d.ts +1 -1
  185. package/build-types/navigator/navigator-screen/index.d.ts.map +1 -1
  186. package/build-types/navigator/stories/index.d.ts +9 -0
  187. package/build-types/navigator/stories/index.d.ts.map +1 -0
  188. package/build-types/navigator/test/index.d.ts +2 -0
  189. package/build-types/navigator/test/index.d.ts.map +1 -0
  190. package/build-types/navigator/types.d.ts +4 -1
  191. package/build-types/navigator/types.d.ts.map +1 -1
  192. package/build-types/slot-fill/bubbles-virtually/slot-fill-provider.d.ts.map +1 -1
  193. package/build-types/tab-panel/index.d.ts.map +1 -1
  194. package/build-types/theme/index.d.ts +31 -0
  195. package/build-types/theme/index.d.ts.map +1 -0
  196. package/build-types/theme/stories/index.d.ts +13 -0
  197. package/build-types/theme/stories/index.d.ts.map +1 -0
  198. package/build-types/theme/styles.d.ts +10 -0
  199. package/build-types/theme/styles.d.ts.map +1 -0
  200. package/build-types/theme/test/index.d.ts +2 -0
  201. package/build-types/theme/test/index.d.ts.map +1 -0
  202. package/build-types/theme/types.d.ts +21 -0
  203. package/build-types/theme/types.d.ts.map +1 -0
  204. package/build-types/tools-panel/tools-panel/hook.d.ts.map +1 -1
  205. package/build-types/tools-panel/tools-panel-item/hook.d.ts.map +1 -1
  206. package/build-types/tooltip/index.d.ts.map +1 -1
  207. package/package.json +17 -17
  208. package/src/base-field/test/index.js +4 -6
  209. package/src/border-box-control/border-box-control/component.tsx +2 -0
  210. package/src/border-box-control/border-box-control/hook.ts +4 -0
  211. package/src/border-box-control/test/index.js +7 -2
  212. package/src/border-control/border-control/README.md +6 -0
  213. package/src/border-control/border-control/component.tsx +2 -0
  214. package/src/border-control/types.ts +4 -0
  215. package/src/button/style.scss +25 -25
  216. package/src/button/test/index.js +3 -5
  217. package/src/combobox-control/test/index.js +1 -1
  218. package/src/confirm-dialog/types.ts +6 -0
  219. package/src/date-time/time/test/index.tsx +2 -6
  220. package/src/disabled/index.tsx +11 -33
  221. package/src/disabled/test/index.tsx +14 -82
  222. package/src/dropdown/test/index.js +4 -3
  223. package/src/font-size-picker/index.tsx +1 -1
  224. package/src/font-size-picker/styles.ts +3 -1
  225. package/src/font-size-picker/test/index.tsx +2 -2
  226. package/src/font-size-picker/test/utils.ts +5 -5
  227. package/src/font-size-picker/utils.ts +1 -1
  228. package/src/form-file-upload/test/index.tsx +1 -1
  229. package/src/form-token-field/suggestions-list.tsx +5 -5
  230. package/src/higher-order/with-fallback-styles/index.js +6 -2
  231. package/src/higher-order/with-focus-outside/test/index.js +44 -45
  232. package/src/higher-order/with-focus-return/test/index.js +34 -30
  233. package/src/higher-order/with-notices/test/index.js +1 -1
  234. package/src/index.js +2 -1
  235. package/src/input-control/test/index.js +2 -2
  236. package/src/item-group/test/index.js +2 -2
  237. package/src/menu-item/test/index.js +0 -3
  238. package/src/mobile/bottom-sheet/test/range-cell.native.js +16 -14
  239. package/src/modal/README.md +53 -54
  240. package/src/modal/{aria-helper.js → aria-helper.ts} +5 -7
  241. package/src/modal/{index.js → index.tsx} +48 -12
  242. package/src/modal/stories/{index.js → index.tsx} +47 -42
  243. package/src/modal/test/{aria-helper.js → aria-helper.ts} +0 -0
  244. package/src/modal/test/{index.js → index.tsx} +13 -3
  245. package/src/modal/types.ts +144 -0
  246. package/src/navigation/test/index.js +1 -1
  247. package/src/navigator/index.ts +4 -4
  248. package/src/navigator/navigator-back-button/component.tsx +4 -4
  249. package/src/navigator/navigator-back-button/index.ts +1 -1
  250. package/src/navigator/navigator-button/component.tsx +4 -4
  251. package/src/navigator/navigator-button/index.ts +1 -1
  252. package/src/navigator/navigator-provider/component.tsx +6 -4
  253. package/src/navigator/navigator-provider/index.ts +1 -1
  254. package/src/navigator/navigator-screen/component.tsx +20 -26
  255. package/src/navigator/navigator-screen/index.ts +1 -1
  256. package/src/navigator/stories/index.tsx +210 -0
  257. package/src/navigator/test/index.tsx +509 -0
  258. package/src/navigator/types.ts +2 -0
  259. package/src/notice/test/__snapshots__/index.js.snap +39 -38
  260. package/src/notice/test/index.js +15 -36
  261. package/src/notice/test/list.js +6 -14
  262. package/src/number-control/test/index.js +3 -2
  263. package/src/panel/test/body.js +2 -2
  264. package/src/placeholder/style.scss +5 -0
  265. package/src/sandbox/index.js +62 -47
  266. package/src/sandbox/index.native.js +72 -52
  267. package/src/sandbox/test/index.js +7 -10
  268. package/src/shortcut/test/index.tsx +1 -1
  269. package/src/slot-fill/bubbles-virtually/slot-fill-provider.js +5 -3
  270. package/src/style.scss +4 -0
  271. package/src/tab-panel/index.tsx +4 -7
  272. package/src/text-highlight/test/index.tsx +1 -3
  273. package/src/theme/README.md +34 -0
  274. package/src/theme/index.tsx +51 -0
  275. package/src/theme/stories/index.tsx +47 -0
  276. package/src/theme/styles.ts +28 -0
  277. package/src/theme/test/index.tsx +101 -0
  278. package/src/theme/types.ts +21 -0
  279. package/src/toolbar/test/index.js +2 -2
  280. package/src/toolbar-group/test/index.js +6 -10
  281. package/src/tools-panel/test/index.js +4 -6
  282. package/src/tools-panel/tools-panel/hook.ts +2 -9
  283. package/src/tools-panel/tools-panel-item/hook.ts +17 -3
  284. package/src/tooltip/index.js +3 -0
  285. package/src/tooltip/index.native.js +15 -0
  286. package/src/tooltip/test/index.native.js +1 -2
  287. package/src/tree-grid/test/__snapshots__/cell.js.snap +1 -3
  288. package/src/tree-grid/test/__snapshots__/roving-tab-index-item.js.snap +17 -15
  289. package/src/tree-grid/test/__snapshots__/row.js.snap +25 -21
  290. package/src/tree-grid/test/cell.js +4 -4
  291. package/src/tree-grid/test/roving-tab-index-item.js +8 -8
  292. package/src/tree-grid/test/roving-tab-index.js +3 -3
  293. package/src/tree-grid/test/row.js +20 -16
  294. package/src/truncate/test/index.tsx +4 -4
  295. package/src/ui/shortcut/test/index.js +2 -1
  296. package/src/ui/spinner/test/index.js +14 -13
  297. package/src/ui/tooltip/test/index.js +16 -14
  298. package/src/utils/theme-variables.scss +8 -0
  299. package/src/visually-hidden/README.md +4 -0
  300. package/tsconfig.tsbuildinfo +1 -1
  301. package/src/navigator/stories/index.js +0 -194
  302. package/src/navigator/test/index.js +0 -472
@@ -120,17 +120,20 @@ describe( 'BorderBoxControl', () => {
120
120
  expect( widthInput.value ).toBe( '1' );
121
121
  } );
122
122
 
123
- it( 'should render placeholder when border values are mixed', () => {
123
+ it( 'should render placeholder and omit unit select when border values are mixed', () => {
124
124
  renderBorderBoxControl( { value: mixedBorders } );
125
125
 
126
126
  // First render of control with mixed values should show split view.
127
127
  clickButton( 'Link sides' );
128
128
 
129
129
  const widthInput = screen.getByRole( 'spinbutton' );
130
+ const unitSelect = screen.queryByRole( 'combobox' );
131
+
130
132
  expect( widthInput ).toHaveAttribute( 'placeholder', 'Mixed' );
133
+ expect( unitSelect ).not.toBeInTheDocument();
131
134
  } );
132
135
 
133
- it( 'should render shared border width when switching to linked view', async () => {
136
+ it( 'should render shared border width and unit select when switching to linked view', async () => {
134
137
  // Render control with mixed border values but consistent widths.
135
138
  renderBorderBoxControl( {
136
139
  value: {
@@ -144,8 +147,10 @@ describe( 'BorderBoxControl', () => {
144
147
  // First render of control with mixed values should show split view.
145
148
  clickButton( 'Link sides' );
146
149
  const linkedInput = screen.getByRole( 'spinbutton' );
150
+ const unitSelect = screen.getByRole( 'combobox' );
147
151
 
148
152
  expect( linkedInput.value ).toBe( '5' );
153
+ expect( unitSelect ).toBeInTheDocument();
149
154
  } );
150
155
 
151
156
  it( 'should omit style options when requested', () => {
@@ -66,6 +66,12 @@ This toggles the ability to choose custom colors.
66
66
 
67
67
  - Required: No
68
68
 
69
+ ### `disableUnits`: `boolean`
70
+
71
+ This controls whether unit selection should be disabled.
72
+
73
+ - Required: No
74
+
69
75
  ### `enableAlpha`: `boolean`
70
76
 
71
77
  This controls whether the alpha channel will be offered when selecting
@@ -39,6 +39,7 @@ const UnconnectedBorderControl = (
39
39
  const {
40
40
  colors,
41
41
  disableCustomColors,
42
+ disableUnits,
42
43
  enableAlpha,
43
44
  enableStyle = true,
44
45
  hideLabelFromVision,
@@ -97,6 +98,7 @@ const UnconnectedBorderControl = (
97
98
  onChange={ onWidthChange }
98
99
  value={ border?.width || '' }
99
100
  placeholder={ placeholder }
101
+ disableUnits={ disableUnits }
100
102
  __unstableInputWidth={ inputWidth }
101
103
  />
102
104
  { withSlider && (
@@ -67,6 +67,10 @@ export type LabelProps = {
67
67
 
68
68
  export type BorderControlProps = ColorProps &
69
69
  LabelProps & {
70
+ /**
71
+ * This controls whether unit selection should be disabled.
72
+ */
73
+ disableUnits?: boolean;
70
74
  /**
71
75
  * This controls whether to include border style options within the
72
76
  * `BorderDropdown` sub-component.
@@ -20,7 +20,7 @@
20
20
 
21
21
  &[aria-expanded="true"],
22
22
  &:hover {
23
- color: var(--wp-admin-theme-color);
23
+ color: $components-color-accent;
24
24
  }
25
25
 
26
26
  // Unset some hovers, instead of adding :not specificity.
@@ -31,7 +31,7 @@
31
31
  // Focus.
32
32
  // See https://github.com/WordPress/gutenberg/issues/13267 for more context on these selectors.
33
33
  &:focus:not(:disabled) {
34
- box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
34
+ box-shadow: 0 0 0 var(--wp-admin-border-width-focus) $components-color-accent;
35
35
 
36
36
  // Windows High Contrast mode will show this outline, but not the box-shadow.
37
37
  outline: 3px solid transparent;
@@ -43,7 +43,7 @@
43
43
 
44
44
  &.is-primary {
45
45
  white-space: nowrap;
46
- background: var(--wp-admin-theme-color);
46
+ background: $components-color-accent;
47
47
  color: $white;
48
48
  text-decoration: none;
49
49
  text-shadow: none;
@@ -52,18 +52,18 @@
52
52
  outline: 1px solid transparent;
53
53
 
54
54
  &:hover:not(:disabled) {
55
- background: var(--wp-admin-theme-color-darker-10);
55
+ background: $components-color-accent-darker-10;
56
56
  color: $white;
57
57
  }
58
58
 
59
59
  &:active:not(:disabled) {
60
- background: var(--wp-admin-theme-color-darker-20);
61
- border-color: var(--wp-admin-theme-color-darker-20);
60
+ background: $components-color-accent-darker-20;
61
+ border-color: $components-color-accent-darker-20;
62
62
  color: $white;
63
63
  }
64
64
 
65
65
  &:focus:not(:disabled) {
66
- box-shadow: inset 0 0 0 1px $white, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
66
+ box-shadow: inset 0 0 0 1px $white, 0 0 0 var(--wp-admin-border-width-focus) $components-color-accent;
67
67
  }
68
68
 
69
69
  &:disabled,
@@ -72,15 +72,15 @@
72
72
  &[aria-disabled="true"]:enabled, // This catches a situation where a Button is aria-disabled, but not disabled.
73
73
  &[aria-disabled="true"]:active:enabled {
74
74
  color: rgba($white, 0.4);
75
- background: var(--wp-admin-theme-color);
76
- border-color: var(--wp-admin-theme-color);
75
+ background: $components-color-accent;
76
+ border-color: $components-color-accent;
77
77
  opacity: 1;
78
78
  outline: none;
79
79
 
80
80
  &:focus:enabled {
81
81
  box-shadow:
82
82
  0 0 0 $border-width $white,
83
- 0 0 0 3px var(--wp-admin-theme-color);
83
+ 0 0 0 3px $components-color-accent;
84
84
  }
85
85
  }
86
86
 
@@ -93,13 +93,13 @@
93
93
  /* stylelint-disable */
94
94
  background-image: linear-gradient(
95
95
  -45deg,
96
- var(--wp-admin-theme-color) 33%,
97
- var(--wp-admin-theme-color-darker-20) 33%,
98
- var(--wp-admin-theme-color-darker-20) 70%,
99
- var(--wp-admin-theme-color) 70%
96
+ $components-color-accent 33%,
97
+ $components-color-accent-darker-20 33%,
98
+ $components-color-accent-darker-20 70%,
99
+ $components-color-accent 70%
100
100
  );
101
101
  /* stylelint-enable */
102
- border-color: var(--wp-admin-theme-color);
102
+ border-color: $components-color-accent;
103
103
  }
104
104
  }
105
105
 
@@ -114,13 +114,13 @@
114
114
 
115
115
  &:active:not(:disabled) {
116
116
  background: $gray-300;
117
- color: var(--wp-admin-theme-color-darker-10);
117
+ color: $components-color-accent-darker-10;
118
118
  box-shadow: none;
119
119
  }
120
120
 
121
121
  &:hover:not(:disabled) {
122
- color: var(--wp-admin-theme-color-darker-10);
123
- box-shadow: inset 0 0 0 $border-width var(--wp-admin-theme-color-darker-10);
122
+ color: $components-color-accent-darker-10;
123
+ box-shadow: inset 0 0 0 $border-width $components-color-accent-darker-10;
124
124
  }
125
125
 
126
126
  &:disabled,
@@ -140,10 +140,10 @@
140
140
  */
141
141
 
142
142
  &.is-secondary {
143
- box-shadow: inset 0 0 0 $border-width var(--wp-admin-theme-color);
143
+ box-shadow: inset 0 0 0 $border-width $components-color-accent;
144
144
  outline: 1px solid transparent; // Shown in high contrast mode.
145
145
  white-space: nowrap;
146
- color: var(--wp-admin-theme-color);
146
+ color: $components-color-accent;
147
147
  background: transparent;
148
148
  }
149
149
 
@@ -153,7 +153,7 @@
153
153
 
154
154
  &.is-tertiary {
155
155
  white-space: nowrap;
156
- color: var(--wp-admin-theme-color);
156
+ color: $components-color-accent;
157
157
  background: transparent;
158
158
  padding: $grid-unit-15 * 0.5; // This reduces the horizontal padding on tertiary/text buttons, so as to space them optically.
159
159
 
@@ -182,7 +182,7 @@
182
182
  }
183
183
 
184
184
  &:focus:not(:disabled) {
185
- color: var(--wp-admin-theme-color);
185
+ color: $components-color-accent;
186
186
  }
187
187
 
188
188
  &:active:not(:disabled) {
@@ -230,7 +230,7 @@
230
230
  background: none;
231
231
  outline: none;
232
232
  text-align: left;
233
- color: var(--wp-admin-theme-color);
233
+ color: $components-color-accent;
234
234
  text-decoration: underline;
235
235
  transition-property: border, background, color;
236
236
  transition-duration: 0.05s;
@@ -253,7 +253,7 @@
253
253
  }
254
254
 
255
255
  &:focus:not(:disabled) {
256
- color: var(--wp-admin-theme-color);
256
+ color: $components-color-accent;
257
257
  }
258
258
  }
259
259
  }
@@ -333,7 +333,7 @@
333
333
  background: $gray-900;
334
334
 
335
335
  &:focus:not(:disabled) {
336
- box-shadow: inset 0 0 0 1px $white, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
336
+ box-shadow: inset 0 0 0 1px $white, 0 0 0 var(--wp-admin-border-width-focus) $components-color-accent;
337
337
 
338
338
  // Windows High Contrast mode will show this outline, but not the box-shadow.
339
339
  outline: 2px solid transparent;
@@ -27,7 +27,7 @@ describe( 'Button', () => {
27
27
  expect( button ).not.toHaveClass( 'is-large' );
28
28
  expect( button ).not.toHaveClass( 'is-primary' );
29
29
  expect( button ).not.toHaveClass( 'is-pressed' );
30
- expect( button ).not.toHaveAttribute( 'disabled' );
30
+ expect( button ).toBeEnabled();
31
31
  expect( button ).not.toHaveAttribute( 'aria-disabled' );
32
32
  expect( button ).toHaveAttribute( 'type', 'button' );
33
33
  } );
@@ -114,16 +114,14 @@ describe( 'Button', () => {
114
114
  it( 'should add a disabled prop to the button', () => {
115
115
  render( <Button disabled /> );
116
116
 
117
- expect( screen.getByRole( 'button' ) ).toHaveAttribute(
118
- 'disabled'
119
- );
117
+ expect( screen.getByRole( 'button' ) ).toBeDisabled();
120
118
  } );
121
119
 
122
120
  it( 'should add only aria-disabled attribute when disabled and isFocusable are true', () => {
123
121
  render( <Button disabled __experimentalIsFocusable /> );
124
122
  const button = screen.getByRole( 'button' );
125
123
 
126
- expect( button ).not.toHaveAttribute( 'disabled' );
124
+ expect( button ).toBeEnabled();
127
125
  expect( button ).toHaveAttribute( 'aria-disabled' );
128
126
  } );
129
127
 
@@ -271,7 +271,7 @@ describe.each( [
271
271
 
272
272
  // No options are rendered if no match is found
273
273
  await user.keyboard( unmatchedString );
274
- expect( screen.queryByRole( 'option' ) ).toBeNull();
274
+ expect( screen.queryByRole( 'option' ) ).not.toBeInTheDocument();
275
275
 
276
276
  // Clearing the input renders all options again
277
277
  await user.clear( input );
@@ -3,7 +3,13 @@
3
3
  */
4
4
  import type { MouseEvent, KeyboardEvent, ReactNode } from 'react';
5
5
 
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import type { ModalProps } from '../modal/types';
10
+
6
11
  export type DialogInputEvent =
12
+ | Parameters< ModalProps[ 'onRequestClose' ] >[ 0 ]
7
13
  | KeyboardEvent< HTMLDivElement >
8
14
  | MouseEvent< HTMLButtonElement >;
9
15
 
@@ -303,12 +303,8 @@ describe( 'TimePicker', () => {
303
303
  * This is not ideal, but best of we can do for now until we refactor
304
304
  * AM/PM into accessible elements, like radio buttons.
305
305
  */
306
- expect(
307
- screen.getByText( 'AM' ).classList.contains( 'is-primary' )
308
- ).toBe( false );
309
- expect(
310
- screen.getByText( 'PM' ).classList.contains( 'is-primary' )
311
- ).toBe( true );
306
+ expect( screen.getByText( 'AM' ) ).not.toHaveClass( 'is-primary' );
307
+ expect( screen.getByText( 'PM' ) ).toHaveClass( 'is-primary' );
312
308
  } );
313
309
 
314
310
  it( 'should have different layouts/orders for 12/24 hour formats', () => {
@@ -1,13 +1,7 @@
1
- /**
2
- * External dependencies
3
- */
4
- import type { HTMLProps } from 'react';
5
-
6
1
  /**
7
2
  * WordPress dependencies
8
3
  */
9
- import { useDisabled } from '@wordpress/compose';
10
- import { createContext, forwardRef } from '@wordpress/element';
4
+ import { createContext } from '@wordpress/element';
11
5
 
12
6
  /**
13
7
  * Internal dependencies
@@ -20,15 +14,6 @@ import { useCx } from '../utils';
20
14
  const Context = createContext< boolean >( false );
21
15
  const { Consumer, Provider } = Context;
22
16
 
23
- // Extracting this ContentWrapper component in order to make it more explicit
24
- // the same 'ContentWrapper' component is needed so that React can reconcile
25
- // the dom correctly when switching between disabled/non-disabled (instead
26
- // of thrashing the previous DOM and therefore losing the form fields values).
27
- const ContentWrapper = forwardRef<
28
- HTMLDivElement,
29
- HTMLProps< HTMLDivElement >
30
- >( ( props, ref ) => <div { ...props } ref={ ref } /> );
31
-
32
17
  /**
33
18
  * `Disabled` is a component which disables descendant tabbable elements and prevents pointer interaction.
34
19
  *
@@ -65,29 +50,22 @@ function Disabled( {
65
50
  isDisabled = true,
66
51
  ...props
67
52
  }: WordPressComponentProps< DisabledProps, 'div' > ) {
68
- const ref = useDisabled();
69
53
  const cx = useCx();
70
- if ( ! isDisabled ) {
71
- return (
72
- <Provider value={ false }>
73
- <ContentWrapper>{ children }</ContentWrapper>
74
- </Provider>
75
- );
76
- }
77
54
 
78
55
  return (
79
- <Provider value={ true }>
80
- <ContentWrapper
81
- ref={ ref }
82
- className={ cx(
83
- disabledStyles,
84
- className,
85
- 'components-disabled'
86
- ) }
56
+ <Provider value={ isDisabled }>
57
+ <div
58
+ // @ts-ignore Reason: inert is a recent HTML attribute
59
+ inert={ isDisabled ? 'true' : undefined }
60
+ className={
61
+ isDisabled
62
+ ? cx( disabledStyles, className, 'components-disabled' )
63
+ : undefined
64
+ }
87
65
  { ...props }
88
66
  >
89
67
  { children }
90
- </ContentWrapper>
68
+ </div>
91
69
  </Provider>
92
70
  );
93
71
  }
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { render, screen, waitFor } from '@testing-library/react';
4
+ import { render, screen } from '@testing-library/react';
5
5
 
6
6
  /**
7
7
  * Internal dependencies
@@ -9,35 +9,6 @@ import { render, screen, waitFor } from '@testing-library/react';
9
9
  import Disabled from '../';
10
10
  import userEvent from '@testing-library/user-event';
11
11
 
12
- jest.mock( '@wordpress/dom', () => {
13
- const focus = jest.requireActual( '../../../../dom/src' ).focus;
14
- return {
15
- focus: {
16
- ...focus,
17
- focusable: {
18
- ...focus.focusable,
19
- find( context: Element, options = { sequential: false } ) {
20
- // In JSDOM, all elements have zero'd widths and height.
21
- // This is a metric for focusable's `isVisible`, so find
22
- // and apply an arbitrary non-zero width.
23
- Array.from( context.querySelectorAll( '*' ) ).forEach(
24
- ( element ) => {
25
- Object.defineProperties( element, {
26
- offsetWidth: {
27
- get: () => 1,
28
- configurable: true,
29
- },
30
- } );
31
- }
32
- );
33
-
34
- return focus.focusable.find( context, options );
35
- },
36
- },
37
- },
38
- };
39
- } );
40
-
41
12
  describe( 'Disabled', () => {
42
13
  const Form = () => (
43
14
  <form title="form">
@@ -47,18 +18,14 @@ describe( 'Disabled', () => {
47
18
  );
48
19
 
49
20
  it( 'will disable all fields', () => {
50
- render(
21
+ const { container } = render(
51
22
  <Disabled>
52
23
  <Form />
53
24
  </Disabled>
54
25
  );
55
26
 
56
- const input = screen.getByRole( 'textbox' );
57
- const contentEditable = screen.getByTitle( 'edit my content' );
58
- expect( input ).toBeDisabled();
59
- expect( contentEditable ).toHaveAttribute( 'contenteditable', 'false' );
60
- expect( contentEditable ).not.toHaveAttribute( 'tabindex' );
61
- expect( contentEditable ).not.toHaveAttribute( 'disabled' );
27
+ // @ts-ignore
28
+ expect( container.firstChild ).toHaveAttribute( 'inert' );
62
29
  } );
63
30
 
64
31
  it( 'should cleanly un-disable via reconciliation', () => {
@@ -71,19 +38,15 @@ describe( 'Disabled', () => {
71
38
  <Form />
72
39
  );
73
40
 
74
- const { rerender } = render( <MaybeDisable /> );
41
+ const { container, rerender } = render( <MaybeDisable /> );
75
42
 
76
- const input = screen.getByRole( 'textbox' );
77
- const contentEditable = screen.getByTitle( 'edit my content' );
78
-
79
- expect( input ).toBeDisabled();
80
- expect( contentEditable ).toHaveAttribute( 'contenteditable', 'false' );
43
+ // @ts-ignore
44
+ expect( container.firstChild ).toHaveAttribute( 'inert' );
81
45
 
82
46
  rerender( <MaybeDisable isDisabled={ false } /> );
83
47
 
84
- expect( input ).not.toBeDisabled();
85
- expect( contentEditable ).toHaveAttribute( 'contenteditable', 'true' );
86
- expect( contentEditable ).toHaveAttribute( 'tabindex' );
48
+ // @ts-ignore
49
+ expect( container.firstChild ).not.toHaveAttribute( 'inert' );
87
50
  } );
88
51
 
89
52
  it( 'will disable or enable descendant fields based on the isDisabled prop value', () => {
@@ -93,46 +56,15 @@ describe( 'Disabled', () => {
93
56
  </Disabled>
94
57
  );
95
58
 
96
- const { rerender } = render( <MaybeDisable /> );
97
-
98
- const input = screen.getByRole( 'textbox' );
99
- const contentEditable = screen.getByTitle( 'edit my content' );
59
+ const { rerender, container } = render( <MaybeDisable /> );
100
60
 
101
- expect( input ).toBeDisabled();
102
- expect( contentEditable ).toHaveAttribute( 'contenteditable', 'false' );
61
+ // @ts-ignore
62
+ expect( container.firstChild ).toHaveAttribute( 'inert' );
103
63
 
104
64
  rerender( <MaybeDisable isDisabled={ false } /> );
105
65
 
106
- expect( input ).not.toBeDisabled();
107
- expect( contentEditable ).toHaveAttribute( 'contenteditable', 'true' );
108
- } );
109
-
110
- it( 'will disable all fields on sneaky DOM manipulation', async () => {
111
- render(
112
- <Disabled>
113
- <Form />
114
- </Disabled>
115
- );
116
-
117
- const form = screen.getByTitle( 'form' );
118
- form.insertAdjacentHTML(
119
- 'beforeend',
120
- '<input title="sneaky input" />'
121
- );
122
- form.insertAdjacentHTML(
123
- 'beforeend',
124
- '<div title="sneaky editable content" contentEditable tabIndex={ 0 } />'
125
- );
126
- const sneakyInput = screen.getByTitle( 'sneaky input' );
127
- const sneakyEditable = screen.getByTitle( 'sneaky editable content' );
128
-
129
- await waitFor( () => expect( sneakyInput ).toBeDisabled() );
130
- await waitFor( () =>
131
- expect( sneakyEditable ).toHaveAttribute(
132
- 'contenteditable',
133
- 'false'
134
- )
135
- );
66
+ // @ts-ignore
67
+ expect( container.firstChild ).not.toHaveAttribute( 'inert' );
136
68
  } );
137
69
 
138
70
  it( 'should preserve input values when toggling the isDisabled prop', async () => {
@@ -28,9 +28,10 @@ describe( 'Dropdown', () => {
28
28
  it( 'should toggle the dropdown properly', () => {
29
29
  const expectButtonExpanded = ( container, expanded ) => {
30
30
  expect( container.querySelectorAll( 'button' ) ).toHaveLength( 1 );
31
- expect(
32
- getButtonElement( container ).getAttribute( 'aria-expanded' )
33
- ).toBe( expanded.toString() );
31
+ expect( getButtonElement( container ) ).toHaveAttribute(
32
+ 'aria-expanded',
33
+ expanded.toString()
34
+ );
34
35
  };
35
36
 
36
37
  const {
@@ -139,7 +139,7 @@ const UnforwardedFontSizePicker = (
139
139
  }
140
140
 
141
141
  // Calculate the `hint` for toggle group control.
142
- let hint = selectedOption.name;
142
+ let hint = selectedOption?.name || selectedOption.slug;
143
143
  if (
144
144
  ! fontSizesContainComplexValues &&
145
145
  typeof selectedOption.size === 'string'
@@ -19,12 +19,14 @@ export const Container = styled.fieldset`
19
19
  `;
20
20
 
21
21
  export const HeaderLabel = styled( BaseControl.VisualLabel )`
22
+ display: flex;
23
+ gap: ${ space( 1 ) };
24
+ justify-content: flex-start;
22
25
  margin-bottom: 0;
23
26
  `;
24
27
 
25
28
  export const HeaderHint = styled.span`
26
29
  color: ${ COLORS.gray[ 700 ] };
27
- margin-left: ${ space( 1 ) };
28
30
  `;
29
31
 
30
32
  export const Controls = styled.div< {
@@ -215,7 +215,7 @@ describe( 'FontSizePicker', () => {
215
215
  );
216
216
  const element = screen.getByLabelText( 'Large' );
217
217
  expect( element ).toBeInTheDocument();
218
- expect( element.children[ 0 ].textContent ).toBe( 'L' );
218
+ expect( element.children[ 0 ] ).toHaveTextContent( 'L' );
219
219
  } );
220
220
  it( 'should use incremental sequence of t-shirt sizes as labels if we have complex css', () => {
221
221
  const fontSizes = [
@@ -240,7 +240,7 @@ describe( 'FontSizePicker', () => {
240
240
  const extraLargeElement =
241
241
  screen.getByLabelText( 'Extra Large' );
242
242
  expect( extraLargeElement ).toBeInTheDocument();
243
- expect( extraLargeElement.children[ 0 ].textContent ).toBe(
243
+ expect( extraLargeElement.children[ 0 ] ).toHaveTextContent(
244
244
  'XL'
245
245
  );
246
246
  } );
@@ -120,33 +120,33 @@ describe( 'getToggleGroupOptions', () => {
120
120
  ).toEqual( [
121
121
  {
122
122
  key: '1',
123
- value: '1',
124
123
  label: 'S',
125
124
  name: '1',
125
+ value: '1',
126
126
  },
127
127
  {
128
128
  key: '2',
129
- value: '2',
130
129
  label: 'M',
131
130
  name: '2',
131
+ value: '2',
132
132
  },
133
133
  {
134
134
  key: '3',
135
- value: '3',
136
135
  label: 'L',
137
136
  name: '3',
137
+ value: '3',
138
138
  },
139
139
  {
140
140
  key: '4',
141
- value: '4',
142
141
  label: 'XL',
143
142
  name: '4',
143
+ value: '4',
144
144
  },
145
145
  {
146
146
  key: '5',
147
- value: '5',
148
147
  label: 'XXL',
149
148
  name: 'XXL',
149
+ value: '5',
150
150
  },
151
151
  ] );
152
152
  } );
@@ -112,7 +112,7 @@ function getSelectOptions(
112
112
  ];
113
113
  return options.map( ( { slug, name, size } ) => ( {
114
114
  key: slug,
115
- name,
115
+ name: name || slug,
116
116
  size,
117
117
  __experimentalHint:
118
118
  size && isSimpleCssValue( size ) && parseFloat( String( size ) ),
@@ -41,7 +41,7 @@ describe( 'FormFileUpload', () => {
41
41
  const button = screen.getByText( 'My Upload Button' );
42
42
  const input = screen.getByTestId( 'form-file-upload-input' );
43
43
  expect( button ).toBeInTheDocument();
44
- expect( input.style.display ).toBe( 'none' );
44
+ expect( input ).toHaveStyle( 'display: none' );
45
45
  } );
46
46
 
47
47
  it( 'should not fire a change event after selecting the same file', async () => {
@@ -38,7 +38,7 @@ export function SuggestionsList< T extends string | { value: string } >( {
38
38
  ( listNode ) => {
39
39
  // only have to worry about scrolling selected suggestion into view
40
40
  // when already expanded.
41
- let id: number;
41
+ let rafId: number | undefined;
42
42
  if (
43
43
  selectedIndex > -1 &&
44
44
  scrollIntoView &&
@@ -52,14 +52,14 @@ export function SuggestionsList< T extends string | { value: string } >( {
52
52
  onlyScrollIfNeeded: true,
53
53
  }
54
54
  );
55
- id = window.setTimeout( () => {
55
+ rafId = requestAnimationFrame( () => {
56
56
  setScrollingIntoView( false );
57
- }, 100 );
57
+ } );
58
58
  }
59
59
 
60
60
  return () => {
61
- if ( id !== undefined ) {
62
- window.clearTimeout( id );
61
+ if ( rafId !== undefined ) {
62
+ cancelAnimationFrame( rafId );
63
63
  }
64
64
  };
65
65
  },