@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
@@ -1,13 +1,11 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import ShallowRenderer from 'react-test-renderer/shallow';
5
- import { create } from 'react-test-renderer';
4
+ import { render } from '@testing-library/react';
6
5
 
7
6
  /**
8
7
  * WordPress dependencies
9
8
  */
10
- import TokenList from '@wordpress/token-list';
11
9
  import { speak } from '@wordpress/a11y';
12
10
 
13
11
  /**
@@ -23,9 +21,7 @@ describe( 'Notice', () => {
23
21
  } );
24
22
 
25
23
  it( 'should match snapshot', () => {
26
- const renderer = new ShallowRenderer();
27
-
28
- renderer.render(
24
+ const { container } = render(
29
25
  <Notice
30
26
  status="success"
31
27
  actions={ [
@@ -38,63 +34,47 @@ describe( 'Notice', () => {
38
34
  </Notice>
39
35
  );
40
36
 
41
- expect( renderer.getRenderOutput() ).toMatchSnapshot();
37
+ expect( container ).toMatchSnapshot();
42
38
  } );
43
39
 
44
40
  it( 'should not have is-dismissible class when isDismissible prop is false', () => {
45
- const renderer = new ShallowRenderer();
46
-
47
- renderer.render( <Notice isDismissible={ false } /> );
41
+ const { container } = render( <Notice isDismissible={ false } /> );
48
42
 
49
- const classes = new TokenList(
50
- renderer.getRenderOutput().props.className
51
- );
52
- expect( classes.contains( 'components-notice' ) ).toBe( true );
53
- expect( classes.contains( 'is-dismissible' ) ).toBe( false );
43
+ expect( container.firstChild ).toHaveClass( 'components-notice' );
44
+ expect( container.firstChild ).not.toHaveClass( 'is-dismissible' );
54
45
  } );
55
46
 
56
47
  it( 'should default to info status', () => {
57
- const renderer = new ShallowRenderer();
48
+ const { container } = render( <Notice /> );
58
49
 
59
- renderer.render( <Notice /> );
60
-
61
- const classes = new TokenList(
62
- renderer.getRenderOutput().props.className
63
- );
64
- expect( classes.contains( 'is-info' ) ).toBe( true );
50
+ expect( container.firstChild ).toHaveClass( 'is-info' );
65
51
  } );
66
52
 
67
53
  describe( 'useSpokenMessage', () => {
68
54
  it( 'should speak the given message', () => {
69
- const tree = create( <Notice>FYI</Notice> );
70
- tree.update();
55
+ render( <Notice>FYI</Notice> );
71
56
 
72
57
  expect( speak ).toHaveBeenCalledWith( 'FYI', 'polite' );
73
58
  } );
74
59
 
75
60
  it( 'should speak the given message by explicit politeness', () => {
76
- const tree = create(
77
- <Notice politeness="assertive">Uh oh!</Notice>
78
- );
79
- tree.update();
61
+ render( <Notice politeness="assertive">Uh oh!</Notice> );
80
62
 
81
63
  expect( speak ).toHaveBeenCalledWith( 'Uh oh!', 'assertive' );
82
64
  } );
83
65
 
84
66
  it( 'should speak the given message by implicit politeness by status', () => {
85
- const tree = create( <Notice status="error">Uh oh!</Notice> );
86
- tree.update();
67
+ render( <Notice status="error">Uh oh!</Notice> );
87
68
 
88
69
  expect( speak ).toHaveBeenCalledWith( 'Uh oh!', 'assertive' );
89
70
  } );
90
71
 
91
72
  it( 'should speak the given message, preferring explicit to implicit politeness', () => {
92
- const tree = create(
73
+ render(
93
74
  <Notice politeness="polite" status="error">
94
75
  No need to panic
95
76
  </Notice>
96
77
  );
97
- tree.update();
98
78
 
99
79
  expect( speak ).toHaveBeenCalledWith(
100
80
  'No need to panic',
@@ -105,12 +85,11 @@ describe( 'Notice', () => {
105
85
  it( 'should coerce a message to a string', () => {
106
86
  // This test assumes that `@wordpress/a11y` is capable of handling
107
87
  // markup strings appropriately.
108
- const tree = create(
88
+ render(
109
89
  <Notice>
110
90
  With <em>emphasis</em> this time.
111
91
  </Notice>
112
92
  );
113
- tree.update();
114
93
 
115
94
  expect( speak ).toHaveBeenCalledWith(
116
95
  'With <em>emphasis</em> this time.',
@@ -119,12 +98,12 @@ describe( 'Notice', () => {
119
98
  } );
120
99
 
121
100
  it( 'should not re-speak an effectively equivalent element message', () => {
122
- const tree = create(
101
+ const { rerender } = render(
123
102
  <Notice>
124
103
  With <em>emphasis</em> this time.
125
104
  </Notice>
126
105
  );
127
- tree.update(
106
+ rerender(
128
107
  <Notice>
129
108
  With <em>emphasis</em> this time.
130
109
  </Notice>
@@ -1,12 +1,7 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import ShallowRenderer from 'react-test-renderer/shallow';
5
-
6
- /**
7
- * WordPress dependencies
8
- */
9
- import TokenList from '@wordpress/token-list';
4
+ import { render } from '@testing-library/react';
10
5
 
11
6
  /**
12
7
  * Internal dependencies
@@ -15,14 +10,11 @@ import NoticeList from '../list';
15
10
 
16
11
  describe( 'NoticeList', () => {
17
12
  it( 'should merge className', () => {
18
- const renderer = new ShallowRenderer();
19
-
20
- renderer.render( <NoticeList notices={ [] } className="is-ok" /> );
21
-
22
- const classes = new TokenList(
23
- renderer.getRenderOutput().props.className
13
+ const { container } = render(
14
+ <NoticeList notices={ [] } className="is-ok" />
24
15
  );
25
- expect( classes.contains( 'is-ok' ) ).toBe( true );
26
- expect( classes.contains( 'components-notice-list' ) ).toBe( true );
16
+
17
+ expect( container.firstChild ).toHaveClass( 'is-ok' );
18
+ expect( container.firstChild ).toHaveClass( 'components-notice-list' );
27
19
  } );
28
20
  } );
@@ -90,9 +90,10 @@ describe( 'NumberControl', () => {
90
90
  // After the blur, the `onChange` callback fires asynchronously.
91
91
  await waitFor( () => {
92
92
  expect( spy ).toHaveBeenCalledTimes( 2 );
93
- expect( spy ).toHaveBeenNthCalledWith( 1, '1' );
94
- expect( spy ).toHaveBeenNthCalledWith( 2, 4 );
95
93
  } );
94
+
95
+ expect( spy ).toHaveBeenNthCalledWith( 1, '1' );
96
+ expect( spy ).toHaveBeenNthCalledWith( 2, 4 );
96
97
  } );
97
98
 
98
99
  it( 'should call onChange callback when value is not valid', () => {
@@ -67,7 +67,7 @@ describe( 'PanelBody', () => {
67
67
  let panelContent = getPanelBodyContent( container );
68
68
 
69
69
  expect( panelContent ).toBeTruthy();
70
- expect( panelContent.getAttribute( 'hidden' ) ).toBe( '' );
70
+ expect( panelContent ).toHaveAttribute( 'hidden', '' );
71
71
 
72
72
  rerender(
73
73
  <PanelBody opened={ false }>
@@ -77,7 +77,7 @@ describe( 'PanelBody', () => {
77
77
  panelContent = getPanelBodyContent( container );
78
78
 
79
79
  expect( panelContent ).toBeTruthy();
80
- expect( panelContent.getAttribute( 'hidden' ) ).toBeNull();
80
+ expect( panelContent ).not.toHaveAttribute( 'hidden' );
81
81
  } );
82
82
  } );
83
83
 
@@ -182,6 +182,9 @@
182
182
  backdrop-filter: blur(100px);
183
183
  background-color: transparent;
184
184
 
185
+ // This appears to fix an occasional Chrome bug where the blurred background would have an incorrect color.
186
+ backface-visibility: hidden;
187
+
185
188
  // Invert the colors in themes deemed dark.
186
189
  .is-dark-theme & {
187
190
  background-color: rgba($black, 0.1);
@@ -201,6 +204,7 @@
201
204
  .components-placeholder__instructions,
202
205
  .components-button {
203
206
  opacity: 0;
207
+ pointer-events: none;
204
208
  transition: opacity 0.1s linear;
205
209
  @include reduce-motion("transition");
206
210
  }
@@ -210,6 +214,7 @@
210
214
  .components-placeholder__instructions,
211
215
  .components-button {
212
216
  opacity: 1;
217
+ pointer-events: auto;
213
218
  }
214
219
  }
215
220
 
@@ -9,64 +9,79 @@ import {
9
9
  } from '@wordpress/element';
10
10
  import { useFocusableIframe, useMergeRefs } from '@wordpress/compose';
11
11
 
12
- const observeAndResizeJS = `
13
- ( function() {
14
- var observer;
12
+ const observeAndResizeJS = function () {
13
+ const { MutationObserver } = window;
15
14
 
16
- if ( ! window.MutationObserver || ! document.body || ! window.parent ) {
17
- return;
18
- }
15
+ if ( ! MutationObserver || ! document.body || ! window.parent ) {
16
+ return;
17
+ }
19
18
 
20
- function sendResize() {
21
- var clientBoundingRect = document.body.getBoundingClientRect();
19
+ function sendResize() {
20
+ const clientBoundingRect = document.body.getBoundingClientRect();
22
21
 
23
- window.parent.postMessage( {
22
+ window.parent.postMessage(
23
+ {
24
24
  action: 'resize',
25
25
  width: clientBoundingRect.width,
26
26
  height: clientBoundingRect.height,
27
- }, '*' );
28
- }
27
+ },
28
+ '*'
29
+ );
30
+ }
29
31
 
30
- observer = new MutationObserver( sendResize );
31
- observer.observe( document.body, {
32
- attributes: true,
33
- attributeOldValue: false,
34
- characterData: true,
35
- characterDataOldValue: false,
36
- childList: true,
37
- subtree: true
38
- } );
39
-
40
- window.addEventListener( 'load', sendResize, true );
41
-
42
- // Hack: Remove viewport unit styles, as these are relative
43
- // the iframe root and interfere with our mechanism for
44
- // determining the unconstrained page bounds.
45
- function removeViewportStyles( ruleOrNode ) {
46
- if( ruleOrNode.style ) {
47
- [ 'width', 'height', 'minHeight', 'maxHeight' ].forEach( function( style ) {
48
- if ( /^\\d+(vmin|vmax|vh|vw)$/.test( ruleOrNode.style[ style ] ) ) {
49
- ruleOrNode.style[ style ] = '';
50
- }
51
- } );
52
- }
32
+ const observer = new MutationObserver( sendResize );
33
+ observer.observe( document.body, {
34
+ attributes: true,
35
+ attributeOldValue: false,
36
+ characterData: true,
37
+ characterDataOldValue: false,
38
+ childList: true,
39
+ subtree: true,
40
+ } );
41
+
42
+ window.addEventListener( 'load', sendResize, true );
43
+
44
+ // Hack: Remove viewport unit styles, as these are relative
45
+ // the iframe root and interfere with our mechanism for
46
+ // determining the unconstrained page bounds.
47
+ function removeViewportStyles( ruleOrNode ) {
48
+ if ( ruleOrNode.style ) {
49
+ [ 'width', 'height', 'minHeight', 'maxHeight' ].forEach( function (
50
+ style
51
+ ) {
52
+ if (
53
+ /^\\d+(vmin|vmax|vh|vw)$/.test( ruleOrNode.style[ style ] )
54
+ ) {
55
+ ruleOrNode.style[ style ] = '';
56
+ }
57
+ } );
53
58
  }
59
+ }
54
60
 
55
- Array.prototype.forEach.call( document.querySelectorAll( '[style]' ), removeViewportStyles );
56
- Array.prototype.forEach.call( document.styleSheets, function( stylesheet ) {
57
- Array.prototype.forEach.call( stylesheet.cssRules || stylesheet.rules, removeViewportStyles );
58
- } );
61
+ Array.prototype.forEach.call(
62
+ document.querySelectorAll( '[style]' ),
63
+ removeViewportStyles
64
+ );
65
+ Array.prototype.forEach.call(
66
+ document.styleSheets,
67
+ function ( stylesheet ) {
68
+ Array.prototype.forEach.call(
69
+ stylesheet.cssRules || stylesheet.rules,
70
+ removeViewportStyles
71
+ );
72
+ }
73
+ );
59
74
 
60
- document.body.style.position = 'absolute';
61
- document.body.style.width = '100%';
62
- document.body.setAttribute( 'data-resizable-iframe-connected', '' );
75
+ document.body.style.position = 'absolute';
76
+ document.body.style.width = '100%';
77
+ document.body.setAttribute( 'data-resizable-iframe-connected', '' );
63
78
 
64
- sendResize();
79
+ sendResize();
65
80
 
66
- // Resize events can change the width of elements with 100% width, but we don't
67
- // get an DOM mutations for that, so do the resize when the window is resized, too.
68
- window.addEventListener( 'resize', sendResize, true );
69
- } )();`;
81
+ // Resize events can change the width of elements with 100% width, but we don't
82
+ // get an DOM mutations for that, so do the resize when the window is resized, too.
83
+ window.addEventListener( 'resize', sendResize, true );
84
+ };
70
85
 
71
86
  const style = `
72
87
  body {
@@ -153,7 +168,7 @@ export default function Sandbox( {
153
168
  <script
154
169
  type="text/javascript"
155
170
  dangerouslySetInnerHTML={ {
156
- __html: observeAndResizeJS,
171
+ __html: `(${ observeAndResizeJS.toString() })();`,
157
172
  } }
158
173
  />
159
174
  { scripts.map( ( src ) => (
@@ -22,67 +22,85 @@ import { usePreferredColorScheme } from '@wordpress/compose';
22
22
  */
23
23
  import sandboxStyles from './style.scss';
24
24
 
25
- const observeAndResizeJS = `
26
- ( function() {
27
- var observer;
28
-
29
- if ( ! window.MutationObserver || ! document.body || ! window.parent ) {
30
- return;
31
- }
25
+ const observeAndResizeJS = function () {
26
+ // Hermes requires a special directive to preserve the original source code
27
+ // when using `Function.prototype.toString()` below.
28
+ // https://github.com/facebook/hermes/issues/114#issuecomment-887106990
29
+ 'show source';
30
+ const { MutationObserver } = window;
31
+
32
+ if ( ! MutationObserver || ! document.body || ! window.parent ) {
33
+ return;
34
+ }
32
35
 
33
- function sendResize() {
34
- var clientBoundingRect = document.body.getBoundingClientRect();
36
+ function sendResize() {
37
+ const clientBoundingRect = document.body.getBoundingClientRect();
35
38
 
36
- // The function postMessage is exposed by the react-native-webview library
37
- // to communicate between React Native and the WebView, in this case,
38
- // we use it for notifying resize changes.
39
- window.ReactNativeWebView.postMessage(JSON.stringify( {
40
- action: 'resize',
39
+ // The function postMessage is exposed by the react-native-webview library
40
+ // to communicate between React Native and the WebView, in this case,
41
+ // we use it for notifying resize changes.
42
+ window.ReactNativeWebView.postMessage(
43
+ JSON.stringify( {
44
+ action: 'resize',
41
45
  width: clientBoundingRect.width,
42
46
  height: clientBoundingRect.height,
43
- }));
44
- }
47
+ } )
48
+ );
49
+ }
45
50
 
46
- observer = new MutationObserver( sendResize );
47
- observer.observe( document.body, {
48
- attributes: true,
49
- attributeOldValue: false,
50
- characterData: true,
51
- characterDataOldValue: false,
52
- childList: true,
53
- subtree: true
54
- } );
55
-
56
- window.addEventListener( 'load', sendResize, true );
57
-
58
- // Hack: Remove viewport unit styles, as these are relative
59
- // the iframe root and interfere with our mechanism for
60
- // determining the unconstrained page bounds.
61
- function removeViewportStyles( ruleOrNode ) {
62
- if( ruleOrNode.style ) {
63
- [ 'width', 'height', 'minHeight', 'maxHeight' ].forEach( function( style ) {
64
- if ( /^\\d+(vmin|vmax|vh|vw)$/.test( ruleOrNode.style[ style ] ) ) {
65
- ruleOrNode.style[ style ] = '';
66
- }
67
- } );
68
- }
51
+ const observer = new MutationObserver( sendResize );
52
+ observer.observe( document.body, {
53
+ attributes: true,
54
+ attributeOldValue: false,
55
+ characterData: true,
56
+ characterDataOldValue: false,
57
+ childList: true,
58
+ subtree: true,
59
+ } );
60
+
61
+ window.addEventListener( 'load', sendResize, true );
62
+
63
+ // Hack: Remove viewport unit styles, as these are relative
64
+ // the iframe root and interfere with our mechanism for
65
+ // determining the unconstrained page bounds.
66
+ function removeViewportStyles( ruleOrNode ) {
67
+ if ( ruleOrNode.style ) {
68
+ [ 'width', 'height', 'minHeight', 'maxHeight' ].forEach( function (
69
+ style
70
+ ) {
71
+ if (
72
+ /^\\d+(vmin|vmax|vh|vw)$/.test( ruleOrNode.style[ style ] )
73
+ ) {
74
+ ruleOrNode.style[ style ] = '';
75
+ }
76
+ } );
69
77
  }
78
+ }
70
79
 
71
- Array.prototype.forEach.call( document.querySelectorAll( '[style]' ), removeViewportStyles );
72
- Array.prototype.forEach.call( document.styleSheets, function( stylesheet ) {
73
- Array.prototype.forEach.call( stylesheet.cssRules || stylesheet.rules, removeViewportStyles );
74
- } );
80
+ Array.prototype.forEach.call(
81
+ document.querySelectorAll( '[style]' ),
82
+ removeViewportStyles
83
+ );
84
+ Array.prototype.forEach.call(
85
+ document.styleSheets,
86
+ function ( stylesheet ) {
87
+ Array.prototype.forEach.call(
88
+ stylesheet.cssRules || stylesheet.rules,
89
+ removeViewportStyles
90
+ );
91
+ }
92
+ );
75
93
 
76
- document.body.style.position = 'absolute';
77
- document.body.style.width = '100%';
78
- document.body.setAttribute( 'data-resizable-iframe-connected', '' );
94
+ document.body.style.position = 'absolute';
95
+ document.body.style.width = '100%';
96
+ document.body.setAttribute( 'data-resizable-iframe-connected', '' );
79
97
 
80
- sendResize();
98
+ sendResize();
81
99
 
82
- // Resize events can change the width of elements with 100% width, but we don't
83
- // get an DOM mutations for that, so do the resize when the window is resized, too.
84
- window.addEventListener( 'resize', sendResize, true );
85
- } )();`;
100
+ // Resize events can change the width of elements with 100% width, but we don't
101
+ // get an DOM mutations for that, so do the resize when the window is resized, too.
102
+ window.addEventListener( 'resize', sendResize, true );
103
+ };
86
104
 
87
105
  const style = `
88
106
  body {
@@ -215,7 +233,9 @@ function Sandbox( {
215
233
  <script
216
234
  type="text/javascript"
217
235
  dangerouslySetInnerHTML={ {
218
- __html: customJS || observeAndResizeJS,
236
+ __html:
237
+ customJS ||
238
+ `(${ observeAndResizeJS.toString() })();`,
219
239
  } }
220
240
  />
221
241
  { scripts.map( ( src ) => (
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { act, fireEvent, render } from '@testing-library/react';
4
+ import { fireEvent, render, screen } from '@testing-library/react';
5
5
 
6
6
  /**
7
7
  * WordPress dependencies
@@ -39,28 +39,25 @@ describe( 'Sandbox', () => {
39
39
  };
40
40
 
41
41
  it( 'should rerender with new emdeded content if html prop changes', () => {
42
- let result;
43
- act( () => {
44
- result = render( <TestWrapper /> );
45
- } );
42
+ const result = render( <TestWrapper /> );
46
43
 
47
44
  const iframe = result.container.querySelector( '.components-sandbox' );
48
45
 
49
46
  let sandboxedIframe =
50
47
  iframe.contentWindow.document.body.querySelector( '.mock-iframe' );
51
48
 
52
- expect( sandboxedIframe.getAttribute( 'src' ) ).toBe(
49
+ expect( sandboxedIframe ).toHaveAttribute(
50
+ 'src',
53
51
  'https://super.embed'
54
52
  );
55
53
 
56
- act( () => {
57
- fireEvent.click( result.getByRole( 'button' ) );
58
- } );
54
+ fireEvent.click( screen.getByRole( 'button' ) );
59
55
 
60
56
  sandboxedIframe =
61
57
  iframe.contentWindow.document.body.querySelector( '.mock-iframe' );
62
58
 
63
- expect( sandboxedIframe.getAttribute( 'src' ) ).toBe(
59
+ expect( sandboxedIframe ).toHaveAttribute(
60
+ 'src',
64
61
  'https://another.super.embed'
65
62
  );
66
63
  } );
@@ -11,7 +11,7 @@ import Shortcut from '..';
11
11
  describe( 'Shortcut', () => {
12
12
  it( 'does not render anything if no shortcut prop is provided', () => {
13
13
  const { container } = render( <Shortcut /> );
14
- expect( container.firstChild ).toBe( null );
14
+ expect( container ).toBeEmptyDOMElement();
15
15
  } );
16
16
 
17
17
  it( 'renders the shortcut display text when a string is passed as the shortcut', () => {
@@ -67,9 +67,11 @@ function useSlotRegistry() {
67
67
  if ( fills.current.get( name ) ) {
68
68
  fills.current.set(
69
69
  name,
70
- fills.current
71
- .get( name )
72
- .filter( ( fillRef ) => fillRef !== ref )
70
+ valRef(
71
+ fills.current
72
+ .get( name )
73
+ .filter( ( fillRef ) => fillRef !== ref )
74
+ )
73
75
  );
74
76
  }
75
77
  }, [] );
package/src/style.scss CHANGED
@@ -1,3 +1,7 @@
1
+ // Variables
2
+ @import "./utils/theme-variables.scss";
3
+
4
+ // Components
1
5
  @import "./animate/style.scss";
2
6
  @import "./autocomplete/style.scss";
3
7
  @import "./button-group/style.scss";
@@ -85,7 +85,7 @@ export function TabPanel( {
85
85
  const instanceId = useInstanceId( TabPanel, 'tab-panel' );
86
86
  const [ selected, setSelected ] = useState< string >();
87
87
 
88
- const handleClick = ( tabKey: string ) => {
88
+ const handleTabSelection = ( tabKey: string ) => {
89
89
  setSelected( tabKey );
90
90
  onSelect?.( tabKey );
91
91
  };
@@ -98,11 +98,8 @@ export function TabPanel( {
98
98
 
99
99
  useEffect( () => {
100
100
  const newSelectedTab = find( tabs, { name: selected } );
101
- if ( ! newSelectedTab ) {
102
- setSelected(
103
- initialTabName ||
104
- ( tabs.length > 0 ? tabs[ 0 ].name : undefined )
105
- );
101
+ if ( ! newSelectedTab && tabs.length > 0 ) {
102
+ handleTabSelection( initialTabName || tabs[ 0 ].name );
106
103
  }
107
104
  }, [ tabs ] );
108
105
 
@@ -127,7 +124,7 @@ export function TabPanel( {
127
124
  aria-controls={ `${ instanceId }-${ tab.name }-view` }
128
125
  selected={ tab.name === selected }
129
126
  key={ tab.name }
130
- onClick={ () => handleClick( tab.name ) }
127
+ onClick={ () => handleTabSelection( tab.name ) }
131
128
  >
132
129
  { tab.title }
133
130
  </TabButton>
@@ -50,9 +50,7 @@ describe( 'TextHighlight', () => {
50
50
  expect( highlightedEls ).toHaveLength( 2 );
51
51
 
52
52
  highlightedEls.forEach( ( el ) => {
53
- expect( el.textContent ).toEqual(
54
- expect.stringContaining( highlight )
55
- );
53
+ expect( el ).toHaveTextContent( highlight );
56
54
  } );
57
55
  } );
58
56
 
@@ -0,0 +1,34 @@
1
+ # Theme
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
+ `Theme` allows defining theme variables for components in the `@wordpress/components` package.
8
+
9
+ Multiple `Theme` components can be nested in order to override specific theme variables.
10
+
11
+ ## Usage
12
+
13
+ ```jsx
14
+ import { __experimentalTheme as Theme } from '@wordpress/components';
15
+
16
+ const Example = () => {
17
+ return (
18
+ <Theme accent="red">
19
+ <Button variant="primary">I'm red</Button>
20
+ <Theme accent="blue">
21
+ <Button variant="primary">I'm blue</Button>
22
+ </Theme>
23
+ </Theme>
24
+ );
25
+ };
26
+ ```
27
+
28
+ ## Props
29
+
30
+ ### `accent`: `string`
31
+
32
+ Used to set the accent color (used by components as the primary color). If an accent color is not defined, the default fallback value is the original WP Admin main theme color. No all valid CSS color syntaxes are supported — in particular, keywords (like `'currentcolor'`, `'inherit'`, `'initial'`, `'revert'`, `'unset'`...) and CSS custom properties (e.g. `var(--my-custom-property)`) are _not_ supported values for this property.
33
+
34
+ - Required: No