@wordpress/components 25.12.0 → 25.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (342) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/build/angle-picker-control/index.js +0 -1
  3. package/build/angle-picker-control/index.js.map +1 -1
  4. package/build/border-control/border-control-dropdown/component.js +4 -2
  5. package/build/border-control/border-control-dropdown/component.js.map +1 -1
  6. package/build/border-control/border-control-dropdown/hook.js +3 -2
  7. package/build/border-control/border-control-dropdown/hook.js.map +1 -1
  8. package/build/border-control/styles.js +17 -17
  9. package/build/border-control/styles.js.map +1 -1
  10. package/build/checkbox-control/index.js +1 -1
  11. package/build/checkbox-control/index.js.map +1 -1
  12. package/build/checkbox-control/types.js.map +1 -1
  13. package/build/custom-select-control-v2/index.js +87 -0
  14. package/build/custom-select-control-v2/index.js.map +1 -0
  15. package/build/custom-select-control-v2/styles.js +85 -0
  16. package/build/custom-select-control-v2/styles.js.map +1 -0
  17. package/build/custom-select-control-v2/types.js +6 -0
  18. package/build/custom-select-control-v2/types.js.map +1 -0
  19. package/build/date-time/time/timezone.js +11 -2
  20. package/build/date-time/time/timezone.js.map +1 -1
  21. package/build/dimension-control/index.js +2 -0
  22. package/build/dimension-control/index.js.map +1 -1
  23. package/build/dimension-control/types.js.map +1 -1
  24. package/build/dropdown-menu-v2-ariakit/index.js +49 -20
  25. package/build/dropdown-menu-v2-ariakit/index.js.map +1 -1
  26. package/build/dropdown-menu-v2-ariakit/styles.js +82 -59
  27. package/build/dropdown-menu-v2-ariakit/styles.js.map +1 -1
  28. package/build/dropdown-menu-v2-ariakit/types.js.map +1 -1
  29. package/build/focal-point-picker/controls.js +5 -1
  30. package/build/focal-point-picker/controls.js.map +1 -1
  31. package/build/focal-point-picker/index.js +2 -0
  32. package/build/focal-point-picker/index.js.map +1 -1
  33. package/build/focal-point-picker/styles/focal-point-picker-style.js +15 -15
  34. package/build/focal-point-picker/styles/focal-point-picker-style.js.map +1 -1
  35. package/build/focal-point-picker/types.js.map +1 -1
  36. package/build/font-size-picker/font-size-picker-select.js +2 -0
  37. package/build/font-size-picker/font-size-picker-select.js.map +1 -1
  38. package/build/font-size-picker/font-size-picker-toggle-group.js +2 -0
  39. package/build/font-size-picker/font-size-picker-toggle-group.js.map +1 -1
  40. package/build/font-size-picker/index.js +6 -1
  41. package/build/font-size-picker/index.js.map +1 -1
  42. package/build/font-size-picker/types.js.map +1 -1
  43. package/build/form-token-field/index.js +6 -2
  44. package/build/form-token-field/index.js.map +1 -1
  45. package/build/form-token-field/token-input.js.map +1 -1
  46. package/build/form-token-field/types.js.map +1 -1
  47. package/build/heading/hook.js +6 -3
  48. package/build/heading/hook.js.map +1 -1
  49. package/build/heading/types.js.map +1 -1
  50. package/build/index.native.js +0 -16
  51. package/build/index.native.js.map +1 -1
  52. package/build/mobile/global-styles-context/utils.native.js +13 -0
  53. package/build/mobile/global-styles-context/utils.native.js.map +1 -1
  54. package/build/mobile/utils/alignments.native.js +1 -1
  55. package/build/mobile/utils/alignments.native.js.map +1 -1
  56. package/build/palette-edit/index.js +21 -1
  57. package/build/palette-edit/index.js.map +1 -1
  58. package/build/private-apis.js +3 -2
  59. package/build/private-apis.js.map +1 -1
  60. package/build/query-controls/author-select.js +3 -1
  61. package/build/query-controls/author-select.js.map +1 -1
  62. package/build/query-controls/category-select.js +3 -1
  63. package/build/query-controls/category-select.js.map +1 -1
  64. package/build/query-controls/index.js +6 -1
  65. package/build/query-controls/index.js.map +1 -1
  66. package/build/query-controls/types.js.map +1 -1
  67. package/build/slot-fill/types.js.map +1 -1
  68. package/build/tabs/index.js +24 -5
  69. package/build/tabs/index.js.map +1 -1
  70. package/build/tabs/tab.js +4 -4
  71. package/build/tabs/tab.js.map +1 -1
  72. package/build/tabs/tabpanel.js +4 -3
  73. package/build/tabs/tabpanel.js.map +1 -1
  74. package/build/tabs/types.js.map +1 -1
  75. package/build/text/types.js.map +1 -1
  76. package/build/toggle-group-control/toggle-group-control/utils.js +17 -17
  77. package/build/toggle-group-control/toggle-group-control/utils.js.map +1 -1
  78. package/build/tools-panel/tools-panel-item/hook.js +16 -12
  79. package/build/tools-panel/tools-panel-item/hook.js.map +1 -1
  80. package/build-module/angle-picker-control/index.js +0 -1
  81. package/build-module/angle-picker-control/index.js.map +1 -1
  82. package/build-module/border-control/border-control-dropdown/component.js +4 -2
  83. package/build-module/border-control/border-control-dropdown/component.js.map +1 -1
  84. package/build-module/border-control/border-control-dropdown/hook.js +3 -2
  85. package/build-module/border-control/border-control-dropdown/hook.js.map +1 -1
  86. package/build-module/border-control/styles.js +17 -17
  87. package/build-module/border-control/styles.js.map +1 -1
  88. package/build-module/checkbox-control/index.js +1 -1
  89. package/build-module/checkbox-control/index.js.map +1 -1
  90. package/build-module/checkbox-control/types.js.map +1 -1
  91. package/build-module/custom-select-control-v2/index.js +74 -0
  92. package/build-module/custom-select-control-v2/index.js.map +1 -0
  93. package/build-module/custom-select-control-v2/styles.js +71 -0
  94. package/build-module/custom-select-control-v2/styles.js.map +1 -0
  95. package/build-module/custom-select-control-v2/types.js +2 -0
  96. package/build-module/custom-select-control-v2/types.js.map +1 -0
  97. package/build-module/date-time/time/timezone.js +11 -2
  98. package/build-module/date-time/time/timezone.js.map +1 -1
  99. package/build-module/dimension-control/index.js +2 -0
  100. package/build-module/dimension-control/index.js.map +1 -1
  101. package/build-module/dimension-control/types.js.map +1 -1
  102. package/build-module/dropdown-menu-v2-ariakit/index.js +46 -18
  103. package/build-module/dropdown-menu-v2-ariakit/index.js.map +1 -1
  104. package/build-module/dropdown-menu-v2-ariakit/styles.js +69 -40
  105. package/build-module/dropdown-menu-v2-ariakit/styles.js.map +1 -1
  106. package/build-module/dropdown-menu-v2-ariakit/types.js.map +1 -1
  107. package/build-module/focal-point-picker/controls.js +5 -1
  108. package/build-module/focal-point-picker/controls.js.map +1 -1
  109. package/build-module/focal-point-picker/index.js +2 -0
  110. package/build-module/focal-point-picker/index.js.map +1 -1
  111. package/build-module/focal-point-picker/styles/focal-point-picker-style.js +15 -15
  112. package/build-module/focal-point-picker/styles/focal-point-picker-style.js.map +1 -1
  113. package/build-module/focal-point-picker/types.js.map +1 -1
  114. package/build-module/font-size-picker/font-size-picker-select.js +2 -0
  115. package/build-module/font-size-picker/font-size-picker-select.js.map +1 -1
  116. package/build-module/font-size-picker/font-size-picker-toggle-group.js +2 -0
  117. package/build-module/font-size-picker/font-size-picker-toggle-group.js.map +1 -1
  118. package/build-module/font-size-picker/index.js +6 -1
  119. package/build-module/font-size-picker/index.js.map +1 -1
  120. package/build-module/font-size-picker/types.js.map +1 -1
  121. package/build-module/form-token-field/index.js +6 -2
  122. package/build-module/form-token-field/index.js.map +1 -1
  123. package/build-module/form-token-field/token-input.js.map +1 -1
  124. package/build-module/form-token-field/types.js.map +1 -1
  125. package/build-module/heading/hook.js +6 -3
  126. package/build-module/heading/hook.js.map +1 -1
  127. package/build-module/heading/types.js.map +1 -1
  128. package/build-module/index.native.js +0 -2
  129. package/build-module/index.native.js.map +1 -1
  130. package/build-module/mobile/global-styles-context/utils.native.js +13 -0
  131. package/build-module/mobile/global-styles-context/utils.native.js.map +1 -1
  132. package/build-module/mobile/utils/alignments.native.js +1 -1
  133. package/build-module/mobile/utils/alignments.native.js.map +1 -1
  134. package/build-module/palette-edit/index.js +20 -3
  135. package/build-module/palette-edit/index.js.map +1 -1
  136. package/build-module/private-apis.js +4 -3
  137. package/build-module/private-apis.js.map +1 -1
  138. package/build-module/query-controls/author-select.js +3 -1
  139. package/build-module/query-controls/author-select.js.map +1 -1
  140. package/build-module/query-controls/category-select.js +3 -1
  141. package/build-module/query-controls/category-select.js.map +1 -1
  142. package/build-module/query-controls/index.js +6 -1
  143. package/build-module/query-controls/index.js.map +1 -1
  144. package/build-module/query-controls/types.js.map +1 -1
  145. package/build-module/slot-fill/types.js.map +1 -1
  146. package/build-module/tabs/index.js +25 -6
  147. package/build-module/tabs/index.js.map +1 -1
  148. package/build-module/tabs/tab.js +6 -6
  149. package/build-module/tabs/tab.js.map +1 -1
  150. package/build-module/tabs/tabpanel.js +6 -5
  151. package/build-module/tabs/tabpanel.js.map +1 -1
  152. package/build-module/tabs/types.js.map +1 -1
  153. package/build-module/text/types.js.map +1 -1
  154. package/build-module/toggle-group-control/toggle-group-control/utils.js +17 -17
  155. package/build-module/toggle-group-control/toggle-group-control/utils.js.map +1 -1
  156. package/build-module/tools-panel/tools-panel-item/hook.js +17 -13
  157. package/build-module/tools-panel/tools-panel-item/hook.js.map +1 -1
  158. package/build-style/style-rtl.css +32 -6
  159. package/build-style/style.css +32 -6
  160. package/build-types/angle-picker-control/index.d.ts.map +1 -1
  161. package/build-types/border-control/border-control-dropdown/component.d.ts.map +1 -1
  162. package/build-types/border-control/border-control-dropdown/hook.d.ts +1 -0
  163. package/build-types/border-control/border-control-dropdown/hook.d.ts.map +1 -1
  164. package/build-types/border-control/styles.d.ts +1 -1
  165. package/build-types/border-control/styles.d.ts.map +1 -1
  166. package/build-types/box-control/stories/index.story.d.ts +1944 -0
  167. package/build-types/box-control/stories/index.story.d.ts.map +1 -0
  168. package/build-types/checkbox-control/index.d.ts.map +1 -1
  169. package/build-types/checkbox-control/types.d.ts +3 -2
  170. package/build-types/checkbox-control/types.d.ts.map +1 -1
  171. package/build-types/color-palette/styles.d.ts +4 -1
  172. package/build-types/color-palette/styles.d.ts.map +1 -1
  173. package/build-types/custom-select-control-v2/index.d.ts +6 -0
  174. package/build-types/custom-select-control-v2/index.d.ts.map +1 -0
  175. package/build-types/custom-select-control-v2/stories/index.story.d.ts +19 -0
  176. package/build-types/custom-select-control-v2/stories/index.story.d.ts.map +1 -0
  177. package/build-types/custom-select-control-v2/styles.d.ts +47 -0
  178. package/build-types/custom-select-control-v2/styles.d.ts.map +1 -0
  179. package/build-types/custom-select-control-v2/types.d.ts +57 -0
  180. package/build-types/custom-select-control-v2/types.d.ts.map +1 -0
  181. package/build-types/date-time/date/styles.d.ts +4 -1
  182. package/build-types/date-time/date/styles.d.ts.map +1 -1
  183. package/build-types/date-time/time/timezone.d.ts.map +1 -1
  184. package/build-types/dimension-control/index.d.ts.map +1 -1
  185. package/build-types/dimension-control/types.d.ts +6 -0
  186. package/build-types/dimension-control/types.d.ts.map +1 -1
  187. package/build-types/dropdown-menu-v2-ariakit/index.d.ts +11 -2
  188. package/build-types/dropdown-menu-v2-ariakit/index.d.ts.map +1 -1
  189. package/build-types/dropdown-menu-v2-ariakit/stories/index.story.d.ts.map +1 -1
  190. package/build-types/dropdown-menu-v2-ariakit/styles.d.ts +26 -18
  191. package/build-types/dropdown-menu-v2-ariakit/styles.d.ts.map +1 -1
  192. package/build-types/dropdown-menu-v2-ariakit/types.d.ts +0 -6
  193. package/build-types/dropdown-menu-v2-ariakit/types.d.ts.map +1 -1
  194. package/build-types/focal-point-picker/controls.d.ts +1 -1
  195. package/build-types/focal-point-picker/controls.d.ts.map +1 -1
  196. package/build-types/focal-point-picker/index.d.ts +1 -1
  197. package/build-types/focal-point-picker/index.d.ts.map +1 -1
  198. package/build-types/focal-point-picker/stories/index.story.d.ts +8 -4
  199. package/build-types/focal-point-picker/stories/index.story.d.ts.map +1 -1
  200. package/build-types/focal-point-picker/types.d.ts +7 -0
  201. package/build-types/focal-point-picker/types.d.ts.map +1 -1
  202. package/build-types/font-size-picker/font-size-picker-select.d.ts.map +1 -1
  203. package/build-types/font-size-picker/font-size-picker-toggle-group.d.ts.map +1 -1
  204. package/build-types/font-size-picker/index.d.ts.map +1 -1
  205. package/build-types/font-size-picker/types.d.ts +8 -1
  206. package/build-types/font-size-picker/types.d.ts.map +1 -1
  207. package/build-types/form-token-field/index.d.ts.map +1 -1
  208. package/build-types/form-token-field/token-input.d.ts.map +1 -1
  209. package/build-types/form-token-field/types.d.ts +1 -1
  210. package/build-types/form-token-field/types.d.ts.map +1 -1
  211. package/build-types/heading/component.d.ts +4 -1
  212. package/build-types/heading/component.d.ts.map +1 -1
  213. package/build-types/heading/hook.d.ts.map +1 -1
  214. package/build-types/heading/types.d.ts +20 -1
  215. package/build-types/heading/types.d.ts.map +1 -1
  216. package/build-types/navigation/styles/navigation-styles.d.ts +4 -1
  217. package/build-types/navigation/styles/navigation-styles.d.ts.map +1 -1
  218. package/build-types/palette-edit/index.d.ts +6 -1
  219. package/build-types/palette-edit/index.d.ts.map +1 -1
  220. package/build-types/palette-edit/styles.d.ts +4 -1
  221. package/build-types/palette-edit/styles.d.ts.map +1 -1
  222. package/build-types/private-apis.d.ts.map +1 -1
  223. package/build-types/query-controls/author-select.d.ts +1 -1
  224. package/build-types/query-controls/author-select.d.ts.map +1 -1
  225. package/build-types/query-controls/category-select.d.ts +1 -1
  226. package/build-types/query-controls/category-select.d.ts.map +1 -1
  227. package/build-types/query-controls/index.d.ts +1 -1
  228. package/build-types/query-controls/index.d.ts.map +1 -1
  229. package/build-types/query-controls/types.d.ts +9 -0
  230. package/build-types/query-controls/types.d.ts.map +1 -1
  231. package/build-types/slot-fill/bubbles-virtually/slot.d.ts +1 -1
  232. package/build-types/slot-fill/types.d.ts +16 -6
  233. package/build-types/slot-fill/types.d.ts.map +1 -1
  234. package/build-types/tabs/index.d.ts +3 -2
  235. package/build-types/tabs/index.d.ts.map +1 -1
  236. package/build-types/tabs/stories/index.story.d.ts.map +1 -1
  237. package/build-types/tabs/tab.d.ts +2 -1
  238. package/build-types/tabs/tab.d.ts.map +1 -1
  239. package/build-types/tabs/tabpanel.d.ts +2 -1
  240. package/build-types/tabs/tabpanel.d.ts.map +1 -1
  241. package/build-types/tabs/types.d.ts +8 -3
  242. package/build-types/tabs/types.d.ts.map +1 -1
  243. package/build-types/text/types.d.ts +15 -2
  244. package/build-types/text/types.d.ts.map +1 -1
  245. package/build-types/toggle-group-control/toggle-group-control/utils.d.ts.map +1 -1
  246. package/build-types/tools-panel/tools-panel-item/hook.d.ts.map +1 -1
  247. package/package.json +19 -19
  248. package/src/angle-picker-control/index.tsx +0 -1
  249. package/src/border-control/border-control-dropdown/component.tsx +3 -1
  250. package/src/border-control/border-control-dropdown/hook.ts +3 -2
  251. package/src/border-control/styles.ts +2 -9
  252. package/src/box-control/stories/index.story.tsx +82 -0
  253. package/src/button/style.scss +10 -2
  254. package/src/checkbox-control/README.md +2 -1
  255. package/src/checkbox-control/index.tsx +8 -6
  256. package/src/checkbox-control/test/__snapshots__/index.tsx.snap +3 -8
  257. package/src/checkbox-control/test/index.tsx +7 -0
  258. package/src/checkbox-control/types.ts +3 -2
  259. package/src/combobox-control/README.md +1 -3
  260. package/src/custom-select-control/test/index.js +367 -35
  261. package/src/custom-select-control-v2/README.md +73 -0
  262. package/src/custom-select-control-v2/index.tsx +99 -0
  263. package/src/custom-select-control-v2/stories/index.story.tsx +149 -0
  264. package/src/custom-select-control-v2/styles.ts +76 -0
  265. package/src/custom-select-control-v2/types.ts +63 -0
  266. package/src/date-time/time/timezone.tsx +15 -3
  267. package/src/dimension-control/index.tsx +2 -0
  268. package/src/dimension-control/test/__snapshots__/index.test.js.snap +2 -2
  269. package/src/dimension-control/types.ts +6 -0
  270. package/src/dropdown-menu-v2-ariakit/README.md +19 -5
  271. package/src/dropdown-menu-v2-ariakit/index.tsx +85 -36
  272. package/src/dropdown-menu-v2-ariakit/stories/index.story.tsx +204 -90
  273. package/src/dropdown-menu-v2-ariakit/styles.ts +165 -117
  274. package/src/dropdown-menu-v2-ariakit/test/index.tsx +5 -10
  275. package/src/dropdown-menu-v2-ariakit/types.ts +0 -7
  276. package/src/focal-point-picker/controls.tsx +4 -0
  277. package/src/focal-point-picker/index.tsx +2 -0
  278. package/src/focal-point-picker/styles/focal-point-picker-style.ts +1 -1
  279. package/src/focal-point-picker/types.ts +7 -0
  280. package/src/font-size-picker/font-size-picker-select.tsx +2 -0
  281. package/src/font-size-picker/font-size-picker-toggle-group.tsx +9 -1
  282. package/src/font-size-picker/index.tsx +11 -3
  283. package/src/font-size-picker/types.ts +8 -1
  284. package/src/form-toggle/style.scss +40 -8
  285. package/src/form-token-field/index.tsx +11 -3
  286. package/src/form-token-field/token-input.tsx +1 -3
  287. package/src/form-token-field/types.ts +1 -0
  288. package/src/heading/README.md +6 -1
  289. package/src/heading/hook.ts +6 -3
  290. package/src/heading/types.ts +23 -1
  291. package/src/index.native.js +0 -2
  292. package/src/mobile/global-styles-context/test/utils.native.js +22 -0
  293. package/src/mobile/global-styles-context/utils.native.js +14 -0
  294. package/src/mobile/link-settings/style.native.scss +0 -17
  295. package/src/mobile/utils/alignments.native.js +1 -0
  296. package/src/navigable-container/README.md +1 -1
  297. package/src/palette-edit/index.tsx +22 -8
  298. package/src/palette-edit/style.scss +2 -2
  299. package/src/palette-edit/test/index.tsx +75 -1
  300. package/src/private-apis.ts +4 -2
  301. package/src/query-controls/author-select.tsx +2 -0
  302. package/src/query-controls/category-select.tsx +2 -0
  303. package/src/query-controls/index.tsx +6 -1
  304. package/src/query-controls/types.ts +9 -0
  305. package/src/search-control/README.md +2 -0
  306. package/src/slot-fill/README.md +1 -1
  307. package/src/slot-fill/types.ts +18 -6
  308. package/src/spinner/README.md +2 -0
  309. package/src/tabs/README.md +4 -4
  310. package/src/tabs/index.tsx +34 -3
  311. package/src/tabs/stories/index.story.tsx +56 -48
  312. package/src/tabs/tab.tsx +7 -7
  313. package/src/tabs/tabpanel.tsx +10 -6
  314. package/src/tabs/test/index.tsx +180 -87
  315. package/src/tabs/types.ts +8 -3
  316. package/src/text/README.md +5 -1
  317. package/src/text/types.ts +15 -2
  318. package/src/toggle-control/README.md +2 -2
  319. package/src/toggle-group-control/test/index.tsx +54 -1
  320. package/src/toggle-group-control/toggle-group-control/utils.ts +15 -20
  321. package/src/tools-panel/tools-panel-item/hook.ts +21 -23
  322. package/tsconfig.tsbuildinfo +1 -1
  323. package/build/mobile/inserter-button/index.native.js +0 -98
  324. package/build/mobile/inserter-button/index.native.js.map +0 -1
  325. package/build/mobile/inserter-button/sparkles.js +0 -23
  326. package/build/mobile/inserter-button/sparkles.js.map +0 -1
  327. package/build/mobile/link-settings/image-link-destinations-screen.native.js +0 -119
  328. package/build/mobile/link-settings/image-link-destinations-screen.native.js.map +0 -1
  329. package/build-module/mobile/inserter-button/index.native.js +0 -89
  330. package/build-module/mobile/inserter-button/index.native.js.map +0 -1
  331. package/build-module/mobile/inserter-button/sparkles.js +0 -15
  332. package/build-module/mobile/inserter-button/sparkles.js.map +0 -1
  333. package/build-module/mobile/link-settings/image-link-destinations-screen.native.js +0 -110
  334. package/build-module/mobile/link-settings/image-link-destinations-screen.native.js.map +0 -1
  335. package/build-types/mobile/inserter-button/sparkles.d.ts +0 -3
  336. package/build-types/mobile/inserter-button/sparkles.d.ts.map +0 -1
  337. package/src/box-control/stories/index.story.js +0 -75
  338. package/src/mobile/inserter-button/README.md +0 -62
  339. package/src/mobile/inserter-button/index.native.js +0 -116
  340. package/src/mobile/inserter-button/sparkles.js +0 -15
  341. package/src/mobile/inserter-button/style.native.scss +0 -72
  342. package/src/mobile/link-settings/image-link-destinations-screen.native.js +0 -152
@@ -0,0 +1,149 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import type { Meta, StoryFn } from '@storybook/react';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { useState } from '@wordpress/element';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import { CustomSelect, CustomSelectItem } from '..';
15
+
16
+ const meta: Meta< typeof CustomSelect > = {
17
+ title: 'Components (Experimental)/CustomSelectControl v2',
18
+ component: CustomSelect,
19
+ subcomponents: {
20
+ // @ts-expect-error - See https://github.com/storybookjs/storybook/issues/23170
21
+ CustomSelectItem,
22
+ },
23
+ argTypes: {
24
+ children: { control: { type: null } },
25
+ renderSelectedValue: { control: { type: null } },
26
+ value: { control: { type: null } },
27
+ },
28
+ parameters: {
29
+ actions: { argTypesRegex: '^on.*' },
30
+ controls: { expanded: true },
31
+ docs: {
32
+ canvas: { sourceState: 'shown' },
33
+ source: { excludeDecorators: true },
34
+ },
35
+ },
36
+ decorators: [
37
+ ( Story ) => (
38
+ <div
39
+ style={ {
40
+ minHeight: '150px',
41
+ } }
42
+ >
43
+ <Story />
44
+ </div>
45
+ ),
46
+ ],
47
+ };
48
+ export default meta;
49
+
50
+ const Template: StoryFn< typeof CustomSelect > = ( props ) => {
51
+ return <CustomSelect { ...props } />;
52
+ };
53
+
54
+ const ControlledTemplate: StoryFn< typeof CustomSelect > = ( props ) => {
55
+ const [ value, setValue ] = useState< string | string[] >();
56
+ return (
57
+ <CustomSelect
58
+ { ...props }
59
+ onChange={ ( nextValue ) => {
60
+ setValue( nextValue );
61
+ props.onChange?.( nextValue );
62
+ } }
63
+ value={ value }
64
+ />
65
+ );
66
+ };
67
+
68
+ export const Default = Template.bind( {} );
69
+ Default.args = {
70
+ label: 'Label',
71
+ children: (
72
+ <>
73
+ <CustomSelectItem value="Small">
74
+ <span style={ { fontSize: '75%' } }>Small</span>
75
+ </CustomSelectItem>
76
+ <CustomSelectItem value="Something bigger">
77
+ <span style={ { fontSize: '200%' } }>Something bigger</span>
78
+ </CustomSelectItem>
79
+ </>
80
+ ),
81
+ };
82
+
83
+ /**
84
+ * Multiple selection can be enabled by using an array for the `value` and
85
+ * `defaultValue` props. The argument of the `onChange` function will also
86
+ * change accordingly.
87
+ */
88
+ export const MultiSelect = Template.bind( {} );
89
+ MultiSelect.args = {
90
+ defaultValue: [ 'lavender', 'tangerine' ],
91
+ label: 'Select Colors',
92
+ renderSelectedValue: ( currentValue: string | string[] ) => {
93
+ if ( ! Array.isArray( currentValue ) ) {
94
+ return currentValue;
95
+ }
96
+ if ( currentValue.length === 0 ) return 'No colors selected';
97
+ if ( currentValue.length === 1 ) return currentValue[ 0 ];
98
+ return `${ currentValue.length } colors selected`;
99
+ },
100
+ children: (
101
+ <>
102
+ { [
103
+ 'amber',
104
+ 'aquamarine',
105
+ 'flamingo pink',
106
+ 'lavender',
107
+ 'maroon',
108
+ 'tangerine',
109
+ ].map( ( item ) => (
110
+ <CustomSelectItem key={ item } value={ item }>
111
+ { item }
112
+ </CustomSelectItem>
113
+ ) ) }
114
+ </>
115
+ ),
116
+ };
117
+
118
+ const renderControlledValue = ( gravatar: string | string[] ) => {
119
+ const avatar = `https://gravatar.com/avatar?d=${ gravatar }`;
120
+ return (
121
+ <div style={ { display: 'flex', alignItems: 'center' } }>
122
+ <img
123
+ style={ { maxHeight: '75px', marginRight: '10px' } }
124
+ key={ avatar }
125
+ src={ avatar }
126
+ alt=""
127
+ aria-hidden="true"
128
+ />
129
+ <span>{ gravatar }</span>
130
+ </div>
131
+ );
132
+ };
133
+
134
+ export const Controlled = ControlledTemplate.bind( {} );
135
+ Controlled.args = {
136
+ label: 'Default Gravatars',
137
+ renderSelectedValue: renderControlledValue,
138
+ children: (
139
+ <>
140
+ { [ 'mystery-person', 'identicon', 'wavatar', 'retro' ].map(
141
+ ( option ) => (
142
+ <CustomSelectItem key={ option } value={ option }>
143
+ { renderControlledValue( option ) }
144
+ </CustomSelectItem>
145
+ )
146
+ ) }
147
+ </>
148
+ ),
149
+ };
@@ -0,0 +1,76 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import styled from '@emotion/styled';
5
+ // eslint-disable-next-line no-restricted-imports
6
+ import * as Ariakit from '@ariakit/react';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import { COLORS } from '../utils';
12
+ import { space } from '../utils/space';
13
+ import type { CustomSelectProps } from './types';
14
+
15
+ export const CustomSelectLabel = styled( Ariakit.SelectLabel )`
16
+ font-size: 11px;
17
+ font-weight: 500;
18
+ line-height: 1.4;
19
+ text-transform: uppercase;
20
+ margin-bottom: ${ space( 2 ) };
21
+ `;
22
+
23
+ const inputHeights = {
24
+ default: 40,
25
+ small: 24,
26
+ };
27
+
28
+ export const CustomSelectButton = styled( Ariakit.Select, {
29
+ // Do not forward `hasCustomRenderProp` to the underlying Ariakit.Select component
30
+ shouldForwardProp: ( prop ) => prop !== 'hasCustomRenderProp',
31
+ } )( ( {
32
+ size,
33
+ hasCustomRenderProp,
34
+ }: {
35
+ size: NonNullable< CustomSelectProps[ 'size' ] >;
36
+ hasCustomRenderProp: boolean;
37
+ } ) => {
38
+ const isSmallSize = size === 'small' && ! hasCustomRenderProp;
39
+ const heightProperty = hasCustomRenderProp ? 'minHeight' : 'height';
40
+
41
+ return {
42
+ display: 'flex',
43
+ justifyContent: 'space-between',
44
+ alignItems: 'center',
45
+ backgroundColor: COLORS.white,
46
+ border: `1px solid ${ COLORS.gray[ 600 ] }`,
47
+ borderRadius: space( 0.5 ),
48
+ cursor: 'pointer',
49
+ width: '100%',
50
+ [ heightProperty ]: `${ inputHeights[ size ] }px`,
51
+ padding: isSmallSize ? space( 2 ) : space( 4 ),
52
+ fontSize: isSmallSize ? '11px' : '13px',
53
+ '&[data-focus-visible]': {
54
+ outlineStyle: 'solid',
55
+ },
56
+ '&[aria-expanded="true"]': {
57
+ outlineStyle: `1.5px solid ${ COLORS.theme.accent }`,
58
+ },
59
+ };
60
+ } );
61
+
62
+ export const CustomSelectPopover = styled( Ariakit.SelectPopover )`
63
+ border-radius: ${ space( 0.5 ) };
64
+ background: ${ COLORS.white };
65
+ border: 1px solid ${ COLORS.gray[ 900 ] };
66
+ `;
67
+
68
+ export const CustomSelectItem = styled( Ariakit.SelectItem )`
69
+ display: flex;
70
+ align-items: center;
71
+ justify-content: space-between;
72
+ padding: ${ space( 2 ) };
73
+ &[data-active-item] {
74
+ background-color: ${ COLORS.gray[ 300 ] };
75
+ }
76
+ `;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ // eslint-disable-next-line no-restricted-imports
5
+ import type * as Ariakit from '@ariakit/react';
6
+
7
+ export type CustomSelectContext =
8
+ | {
9
+ /**
10
+ * The store object returned by Ariakit's `useSelectStore` hook.
11
+ */
12
+ store: Ariakit.SelectStore;
13
+ }
14
+ | undefined;
15
+
16
+ export type CustomSelectProps = {
17
+ /**
18
+ * The child elements. This should be composed of CustomSelectItem components.
19
+ */
20
+ children: React.ReactNode;
21
+ /**
22
+ * An optional default value for the control. If left `undefined`, the first
23
+ * non-disabled item will be used.
24
+ */
25
+ defaultValue?: string | string[];
26
+ /**
27
+ * Label for the control.
28
+ */
29
+ label: string;
30
+ /**
31
+ * A function that receives the new value of the input.
32
+ */
33
+ onChange?: ( newValue: string | string[] ) => void;
34
+ /**
35
+ * Can be used to render select UI with custom styled values.
36
+ */
37
+ renderSelectedValue?: (
38
+ selectedValue: string | string[]
39
+ ) => React.ReactNode;
40
+ /**
41
+ * The size of the control.
42
+ *
43
+ * @default 'default'
44
+ */
45
+ size?: 'default' | 'small';
46
+ /**
47
+ * Can be used to externally control the value of the control.
48
+ */
49
+ value?: string | string[];
50
+ };
51
+
52
+ export type CustomSelectItemProps = {
53
+ /**
54
+ * The value of the select item. This will be used as the children if
55
+ * children are left `undefined`.
56
+ */
57
+ value: string;
58
+ /**
59
+ * The children to display for each select item. The `value` will be
60
+ * used if left `undefined`.
61
+ */
62
+ children?: React.ReactNode;
63
+ };
@@ -32,12 +32,24 @@ const TimeZone = () => {
32
32
  ? timezone.abbr
33
33
  : `UTC${ offsetSymbol }${ timezone.offset }`;
34
34
 
35
+ // Replace underscore with space in strings like `America/Costa_Rica`.
36
+ const prettyTimezoneString = timezone.string.replace( '_', ' ' );
37
+
35
38
  const timezoneDetail =
36
39
  'UTC' === timezone.string
37
40
  ? __( 'Coordinated Universal Time' )
38
- : `(${ zoneAbbr }) ${ timezone.string.replace( '_', ' ' ) }`;
39
-
40
- return (
41
+ : `(${ zoneAbbr }) ${ prettyTimezoneString }`;
42
+
43
+ // When the prettyTimezoneString is empty, there is no additional timezone
44
+ // detail information to show in a Tooltip.
45
+ const hasNoAdditionalTimezoneDetail =
46
+ prettyTimezoneString.trim().length === 0;
47
+
48
+ return hasNoAdditionalTimezoneDetail ? (
49
+ <StyledComponent className="components-datetime__timezone">
50
+ { zoneAbbr }
51
+ </StyledComponent>
52
+ ) : (
41
53
  <Tooltip placement="top" text={ timezoneDetail }>
42
54
  <StyledComponent className="components-datetime__timezone">
43
55
  { zoneAbbr }
@@ -42,6 +42,7 @@ import type { SelectControlSingleSelectionProps } from '../select-control/types'
42
42
  */
43
43
  export function DimensionControl( props: DimensionControlProps ) {
44
44
  const {
45
+ __next40pxDefaultSize = false,
45
46
  label,
46
47
  value,
47
48
  sizes = sizesTable,
@@ -85,6 +86,7 @@ export function DimensionControl( props: DimensionControlProps ) {
85
86
 
86
87
  return (
87
88
  <SelectControl
89
+ __next40pxDefaultSize={ __next40pxDefaultSize }
88
90
  className={ classnames(
89
91
  className,
90
92
  'block-editor-dimension-control'
@@ -764,7 +764,7 @@ exports[`DimensionControl rendering renders with icon and custom icon label 1`]
764
764
  xmlns="http://www.w3.org/2000/svg"
765
765
  >
766
766
  <path
767
- d="M18 11.2h-5.2V6h-1.6v5.2H6v1.6h5.2V18h1.6v-5.2H18z"
767
+ d="M11 12.5V17.5H12.5V12.5H17.5V11H12.5V6H11V11H6V12.5H11Z"
768
768
  />
769
769
  </svg>
770
770
  Margin
@@ -1057,7 +1057,7 @@ exports[`DimensionControl rendering renders with icon and default icon label 1`]
1057
1057
  xmlns="http://www.w3.org/2000/svg"
1058
1058
  >
1059
1059
  <path
1060
- d="M18 11.2h-5.2V6h-1.6v5.2H6v1.6h5.2V18h1.6v-5.2H18z"
1060
+ d="M11 12.5V17.5H12.5V12.5H17.5V11H12.5V6H11V11H6V12.5H11Z"
1061
1061
  />
1062
1062
  </svg>
1063
1063
  Margin
@@ -45,4 +45,10 @@ export type DimensionControlProps = {
45
45
  * @default ''
46
46
  */
47
47
  className?: string;
48
+ /**
49
+ * Start opting into the larger default height that will become the default size in a future version.
50
+ *
51
+ * @default false
52
+ */
53
+ __next40pxDefaultSize?: boolean;
48
54
  };
@@ -284,9 +284,9 @@ Event handler called when the checked radio menu item changes.
284
284
 
285
285
  - Required: no
286
286
 
287
- ### `DropdownMenuGroup`
287
+ ### `DropdownMenuItemLabel`
288
288
 
289
- Used to group menu items.
289
+ Used to render the menu item's label.
290
290
 
291
291
  #### Props
292
292
 
@@ -294,13 +294,27 @@ The component accepts the following props:
294
294
 
295
295
  ##### `children`: `React.ReactNode`
296
296
 
297
- The contents of the group.
297
+ The label contents.
298
+
299
+ - Required: yes
300
+
301
+ ### `DropdownMenuItemHelpText`
302
+
303
+ Used to render the menu item's help text.
304
+
305
+ #### Props
306
+
307
+ The component accepts the following props:
308
+
309
+ ##### `children`: `React.ReactNode`
310
+
311
+ The help text contents.
298
312
 
299
313
  - Required: yes
300
314
 
301
- ### `DropdownMenuGroupLabel`
315
+ ### `DropdownMenuGroup`
302
316
 
303
- Used to render a group label.
317
+ Used to group menu items.
304
318
 
305
319
  #### Props
306
320
 
@@ -30,7 +30,6 @@ import type {
30
30
  DropdownMenuContext as DropdownMenuContextType,
31
31
  DropdownMenuProps,
32
32
  DropdownMenuGroupProps,
33
- DropdownMenuGroupLabelProps,
34
33
  DropdownMenuItemProps,
35
34
  DropdownMenuCheckboxItemProps,
36
35
  DropdownMenuRadioItemProps,
@@ -55,16 +54,23 @@ export const DropdownMenuItem = forwardRef<
55
54
  <Styled.DropdownMenuItem
56
55
  ref={ ref }
57
56
  { ...props }
57
+ accessibleWhenDisabled
58
58
  hideOnClick={ hideOnClick }
59
59
  store={ dropdownMenuContext?.store }
60
60
  >
61
- { prefix && (
62
- <Styled.ItemPrefixWrapper>{ prefix }</Styled.ItemPrefixWrapper>
63
- ) }
64
- { children }
65
- { suffix && (
66
- <Styled.ItemSuffixWrapper>{ suffix }</Styled.ItemSuffixWrapper>
67
- ) }
61
+ <Styled.ItemPrefixWrapper>{ prefix }</Styled.ItemPrefixWrapper>
62
+
63
+ <Styled.DropdownMenuItemContentWrapper>
64
+ <Styled.DropdownMenuItemChildrenWrapper>
65
+ { children }
66
+ </Styled.DropdownMenuItemChildrenWrapper>
67
+
68
+ { suffix && (
69
+ <Styled.ItemSuffixWrapper>
70
+ { suffix }
71
+ </Styled.ItemSuffixWrapper>
72
+ ) }
73
+ </Styled.DropdownMenuItemContentWrapper>
68
74
  </Styled.DropdownMenuItem>
69
75
  );
70
76
  } );
@@ -82,20 +88,30 @@ export const DropdownMenuCheckboxItem = forwardRef<
82
88
  <Styled.DropdownMenuCheckboxItem
83
89
  ref={ ref }
84
90
  { ...props }
91
+ accessibleWhenDisabled
85
92
  hideOnClick={ hideOnClick }
86
93
  store={ dropdownMenuContext?.store }
87
94
  >
88
95
  <Ariakit.MenuItemCheck
89
96
  store={ dropdownMenuContext?.store }
90
97
  render={ <Styled.ItemPrefixWrapper /> }
98
+ // Override some ariakit inline styles
99
+ style={ { width: 'auto', height: 'auto' } }
91
100
  >
92
101
  <Icon icon={ check } size={ 24 } />
93
102
  </Ariakit.MenuItemCheck>
94
103
 
95
- { children }
96
- { suffix && (
97
- <Styled.ItemSuffixWrapper>{ suffix }</Styled.ItemSuffixWrapper>
98
- ) }
104
+ <Styled.DropdownMenuItemContentWrapper>
105
+ <Styled.DropdownMenuItemChildrenWrapper>
106
+ { children }
107
+ </Styled.DropdownMenuItemChildrenWrapper>
108
+
109
+ { suffix && (
110
+ <Styled.ItemSuffixWrapper>
111
+ { suffix }
112
+ </Styled.ItemSuffixWrapper>
113
+ ) }
114
+ </Styled.DropdownMenuItemContentWrapper>
99
115
  </Styled.DropdownMenuCheckboxItem>
100
116
  );
101
117
  } );
@@ -119,17 +135,30 @@ export const DropdownMenuRadioItem = forwardRef<
119
135
  <Styled.DropdownMenuRadioItem
120
136
  ref={ ref }
121
137
  { ...props }
138
+ accessibleWhenDisabled
122
139
  hideOnClick={ hideOnClick }
123
140
  store={ dropdownMenuContext?.store }
124
141
  >
125
142
  <Ariakit.MenuItemCheck
126
143
  store={ dropdownMenuContext?.store }
127
144
  render={ <Styled.ItemPrefixWrapper /> }
145
+ // Override some ariakit inline styles
146
+ style={ { width: 'auto', height: 'auto' } }
128
147
  >
129
148
  <Icon icon={ radioCheck } size={ 24 } />
130
149
  </Ariakit.MenuItemCheck>
131
- { children }
132
- { suffix }
150
+
151
+ <Styled.DropdownMenuItemContentWrapper>
152
+ <Styled.DropdownMenuItemChildrenWrapper>
153
+ { children }
154
+ </Styled.DropdownMenuItemChildrenWrapper>
155
+
156
+ { suffix && (
157
+ <Styled.ItemSuffixWrapper>
158
+ { suffix }
159
+ </Styled.ItemSuffixWrapper>
160
+ ) }
161
+ </Styled.DropdownMenuItemContentWrapper>
133
162
  </Styled.DropdownMenuRadioItem>
134
163
  );
135
164
  } );
@@ -148,20 +177,6 @@ export const DropdownMenuGroup = forwardRef<
148
177
  );
149
178
  } );
150
179
 
151
- export const DropdownMenuGroupLabel = forwardRef<
152
- HTMLDivElement,
153
- WordPressComponentProps< DropdownMenuGroupLabelProps, 'div', false >
154
- >( function DropdownMenuGroupLabel( props, ref ) {
155
- const dropdownMenuContext = useContext( DropdownMenuContext );
156
- return (
157
- <Styled.DropdownMenuGroupLabel
158
- ref={ ref }
159
- { ...props }
160
- store={ dropdownMenuContext?.store }
161
- />
162
- );
163
- } );
164
-
165
180
  const UnconnectedDropdownMenu = (
166
181
  props: WordPressComponentProps< DropdownMenuProps, 'div', false >,
167
182
  ref: React.ForwardedRef< HTMLDivElement >
@@ -280,12 +295,16 @@ const UnconnectedDropdownMenu = (
280
295
  dropdownMenuStore.parent
281
296
  ? cloneElement( trigger, {
282
297
  // Add submenu arrow, unless a `suffix` is explicitly specified
283
- suffix: trigger.props.suffix ?? (
284
- <Styled.SubmenuChevronIcon
285
- aria-hidden="true"
286
- icon={ chevronRightSmall }
287
- size={ 24 }
288
- />
298
+ suffix: (
299
+ <>
300
+ { trigger.props.suffix }
301
+ <Styled.SubmenuChevronIcon
302
+ aria-hidden="true"
303
+ icon={ chevronRightSmall }
304
+ size={ 24 }
305
+ preserveAspectRatio="xMidYMid slice"
306
+ />
307
+ </>
289
308
  ),
290
309
  } )
291
310
  : trigger
@@ -297,8 +316,12 @@ const UnconnectedDropdownMenu = (
297
316
  { ...otherProps }
298
317
  modal={ modal }
299
318
  store={ dropdownMenuStore }
300
- gutter={ gutter ?? ( dropdownMenuStore.parent ? 16 : 8 ) }
301
- shift={ shift ?? ( dropdownMenuStore.parent ? -8 : 0 ) }
319
+ // Root menu has an 8px distance from its trigger,
320
+ // otherwise 0 (which causes the submenu to slightly overlap)
321
+ gutter={ gutter ?? ( dropdownMenuStore.parent ? 0 : 8 ) }
322
+ // Align nested menu by the same (but opposite) amount
323
+ // as the menu container's padding.
324
+ shift={ shift ?? ( dropdownMenuStore.parent ? -4 : 0 ) }
302
325
  hideOnHoverOutside={ false }
303
326
  data-side={ appliedPlacementSide }
304
327
  variant={ variant }
@@ -332,3 +355,29 @@ export const DropdownMenuSeparator = forwardRef<
332
355
  />
333
356
  );
334
357
  } );
358
+
359
+ export const DropdownMenuItemLabel = forwardRef<
360
+ HTMLSpanElement,
361
+ WordPressComponentProps< { children: React.ReactNode }, 'span', true >
362
+ >( function DropdownMenuItemLabel( props, ref ) {
363
+ return (
364
+ <Styled.DropdownMenuItemLabel
365
+ numberOfLines={ 1 }
366
+ ref={ ref }
367
+ { ...props }
368
+ />
369
+ );
370
+ } );
371
+
372
+ export const DropdownMenuItemHelpText = forwardRef<
373
+ HTMLSpanElement,
374
+ WordPressComponentProps< { children: React.ReactNode }, 'span', true >
375
+ >( function DropdownMenuItemHelpText( props, ref ) {
376
+ return (
377
+ <Styled.DropdownMenuItemHelpText
378
+ numberOfLines={ 2 }
379
+ ref={ ref }
380
+ { ...props }
381
+ />
382
+ );
383
+ } );