@wordpress/components 25.9.1 → 25.11.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 (369) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/build/alignment-matrix-control/cell.js +8 -5
  3. package/build/alignment-matrix-control/cell.js.map +1 -1
  4. package/build/alignment-matrix-control/index.js +27 -43
  5. package/build/alignment-matrix-control/index.js.map +1 -1
  6. package/build/alignment-matrix-control/utils.js +29 -9
  7. package/build/alignment-matrix-control/utils.js.map +1 -1
  8. package/build/autocomplete/index.js +104 -52
  9. package/build/autocomplete/index.js.map +1 -1
  10. package/build/circular-option-picker/circular-option-picker-option.js +20 -39
  11. package/build/circular-option-picker/circular-option-picker-option.js.map +1 -1
  12. package/build/circular-option-picker/circular-option-picker.js +11 -32
  13. package/build/circular-option-picker/circular-option-picker.js.map +1 -1
  14. package/build/circular-option-picker/types.js.map +1 -1
  15. package/build/color-palette/index.js +7 -2
  16. package/build/color-palette/index.js.map +1 -1
  17. package/build/color-picker/component.js +12 -2
  18. package/build/color-picker/component.js.map +1 -1
  19. package/build/color-picker/picker.js +77 -1
  20. package/build/color-picker/picker.js.map +1 -1
  21. package/build/color-picker/styles.js +8 -8
  22. package/build/color-picker/styles.js.map +1 -1
  23. package/build/color-picker/types.js.map +1 -1
  24. package/build/composite/v2.js +43 -0
  25. package/build/composite/v2.js.map +1 -0
  26. package/build/confirm-dialog/component.js +74 -8
  27. package/build/confirm-dialog/component.js.map +1 -1
  28. package/build/confirm-dialog/types.js.map +1 -1
  29. package/build/custom-gradient-picker/gradient-bar/control-points.js +13 -4
  30. package/build/custom-gradient-picker/gradient-bar/control-points.js.map +1 -1
  31. package/build/dropdown-menu-v2-ariakit/index.js +217 -0
  32. package/build/dropdown-menu-v2-ariakit/index.js.map +1 -0
  33. package/build/dropdown-menu-v2-ariakit/styles.js +157 -0
  34. package/build/dropdown-menu-v2-ariakit/styles.js.map +1 -0
  35. package/build/dropdown-menu-v2-ariakit/types.js +6 -0
  36. package/build/dropdown-menu-v2-ariakit/types.js.map +1 -0
  37. package/build/font-size-picker/utils.js +1 -1
  38. package/build/font-size-picker/utils.js.map +1 -1
  39. package/build/input-control/styles/input-control-styles.js +23 -23
  40. package/build/input-control/styles/input-control-styles.js.map +1 -1
  41. package/build/mobile/global-styles-context/utils.native.js +1 -1
  42. package/build/mobile/global-styles-context/utils.native.js.map +1 -1
  43. package/build/modal/index.js +45 -16
  44. package/build/modal/index.js.map +1 -1
  45. package/build/palette-edit/index.js +4 -0
  46. package/build/palette-edit/index.js.map +1 -1
  47. package/build/popover/index.js +34 -6
  48. package/build/popover/index.js.map +1 -1
  49. package/build/private-apis.js +18 -2
  50. package/build/private-apis.js.map +1 -1
  51. package/build/progress-bar/styles.js +5 -5
  52. package/build/progress-bar/styles.js.map +1 -1
  53. package/build/sandbox/index.js +1 -1
  54. package/build/sandbox/index.js.map +1 -1
  55. package/build/sandbox/index.native.js +1 -1
  56. package/build/sandbox/index.native.js.map +1 -1
  57. package/build/select-control/styles/select-control-styles.js +8 -8
  58. package/build/select-control/styles/select-control-styles.js.map +1 -1
  59. package/build/slot-fill/bubbles-virtually/slot-fill-provider.js +1 -1
  60. package/build/slot-fill/bubbles-virtually/slot-fill-provider.js.map +1 -1
  61. package/build/tabs/context.js +16 -0
  62. package/build/tabs/context.js.map +1 -0
  63. package/build/tabs/index.js +147 -0
  64. package/build/tabs/index.js.map +1 -0
  65. package/build/tabs/styles.js +38 -0
  66. package/build/tabs/styles.js.map +1 -0
  67. package/build/tabs/tab.js +46 -0
  68. package/build/tabs/tab.js.map +1 -0
  69. package/build/tabs/tablist.js +47 -0
  70. package/build/tabs/tablist.js.map +1 -0
  71. package/build/tabs/tabpanel.js +48 -0
  72. package/build/tabs/tabpanel.js.map +1 -0
  73. package/build/tabs/types.js +6 -0
  74. package/build/tabs/types.js.map +1 -0
  75. package/build/text/component.js +7 -6
  76. package/build/text/component.js.map +1 -1
  77. package/build/text/hook.js +6 -15
  78. package/build/text/hook.js.map +1 -1
  79. package/build/text/index.js.map +1 -1
  80. package/build/text/styles.js +7 -7
  81. package/build/text/styles.js.map +1 -1
  82. package/build/text/types.js.map +1 -1
  83. package/build/text/utils.js +17 -33
  84. package/build/text/utils.js.map +1 -1
  85. package/build/toggle-group-control/toggle-group-control-option-base/component.js +1 -0
  86. package/build/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -1
  87. package/build/toolbar/toolbar/index.js +17 -10
  88. package/build/toolbar/toolbar/index.js.map +1 -1
  89. package/build/toolbar/toolbar/types.js.map +1 -1
  90. package/build/tools-panel/tools-panel-item/hook.js +2 -2
  91. package/build/tools-panel/tools-panel-item/hook.js.map +1 -1
  92. package/build/tools-panel/types.js.map +1 -1
  93. package/build/tooltip/index.js +2 -2
  94. package/build/tooltip/index.js.map +1 -1
  95. package/build/unit-control/utils.js +108 -0
  96. package/build/unit-control/utils.js.map +1 -1
  97. package/build/utils/unit-values.js +1 -1
  98. package/build/utils/unit-values.js.map +1 -1
  99. package/build-module/alignment-matrix-control/cell.js +7 -4
  100. package/build-module/alignment-matrix-control/cell.js.map +1 -1
  101. package/build-module/alignment-matrix-control/index.js +27 -43
  102. package/build-module/alignment-matrix-control/index.js.map +1 -1
  103. package/build-module/alignment-matrix-control/utils.js +29 -8
  104. package/build-module/alignment-matrix-control/utils.js.map +1 -1
  105. package/build-module/autocomplete/index.js +104 -52
  106. package/build-module/autocomplete/index.js.map +1 -1
  107. package/build-module/circular-option-picker/circular-option-picker-option.js +20 -39
  108. package/build-module/circular-option-picker/circular-option-picker-option.js.map +1 -1
  109. package/build-module/circular-option-picker/circular-option-picker.js +10 -31
  110. package/build-module/circular-option-picker/circular-option-picker.js.map +1 -1
  111. package/build-module/circular-option-picker/types.js.map +1 -1
  112. package/build-module/color-palette/index.js +7 -2
  113. package/build-module/color-palette/index.js.map +1 -1
  114. package/build-module/color-picker/component.js +13 -3
  115. package/build-module/color-picker/component.js.map +1 -1
  116. package/build-module/color-picker/picker.js +78 -2
  117. package/build-module/color-picker/picker.js.map +1 -1
  118. package/build-module/color-picker/styles.js +8 -8
  119. package/build-module/color-picker/styles.js.map +1 -1
  120. package/build-module/color-picker/types.js.map +1 -1
  121. package/build-module/composite/v2.js +15 -0
  122. package/build-module/composite/v2.js.map +1 -0
  123. package/build-module/confirm-dialog/component.js +72 -7
  124. package/build-module/confirm-dialog/component.js.map +1 -1
  125. package/build-module/confirm-dialog/types.js.map +1 -1
  126. package/build-module/custom-gradient-picker/gradient-bar/control-points.js +13 -4
  127. package/build-module/custom-gradient-picker/gradient-bar/control-points.js.map +1 -1
  128. package/build-module/dropdown-menu-v2-ariakit/index.js +199 -0
  129. package/build-module/dropdown-menu-v2-ariakit/index.js.map +1 -0
  130. package/build-module/dropdown-menu-v2-ariakit/styles.js +136 -0
  131. package/build-module/dropdown-menu-v2-ariakit/styles.js.map +1 -0
  132. package/build-module/dropdown-menu-v2-ariakit/types.js +2 -0
  133. package/build-module/dropdown-menu-v2-ariakit/types.js.map +1 -0
  134. package/build-module/font-size-picker/utils.js +1 -1
  135. package/build-module/font-size-picker/utils.js.map +1 -1
  136. package/build-module/input-control/styles/input-control-styles.js +23 -23
  137. package/build-module/input-control/styles/input-control-styles.js.map +1 -1
  138. package/build-module/mobile/global-styles-context/utils.native.js +2 -2
  139. package/build-module/mobile/global-styles-context/utils.native.js.map +1 -1
  140. package/build-module/modal/index.js +47 -18
  141. package/build-module/modal/index.js.map +1 -1
  142. package/build-module/palette-edit/index.js +4 -0
  143. package/build-module/palette-edit/index.js.map +1 -1
  144. package/build-module/popover/index.js +34 -6
  145. package/build-module/popover/index.js.map +1 -1
  146. package/build-module/private-apis.js +18 -2
  147. package/build-module/private-apis.js.map +1 -1
  148. package/build-module/progress-bar/styles.js +5 -5
  149. package/build-module/progress-bar/styles.js.map +1 -1
  150. package/build-module/sandbox/index.js +1 -1
  151. package/build-module/sandbox/index.js.map +1 -1
  152. package/build-module/sandbox/index.native.js +1 -1
  153. package/build-module/sandbox/index.native.js.map +1 -1
  154. package/build-module/select-control/styles/select-control-styles.js +8 -8
  155. package/build-module/select-control/styles/select-control-styles.js.map +1 -1
  156. package/build-module/slot-fill/bubbles-virtually/slot-fill-provider.js +1 -1
  157. package/build-module/slot-fill/bubbles-virtually/slot-fill-provider.js.map +1 -1
  158. package/build-module/tabs/context.js +12 -0
  159. package/build-module/tabs/context.js.map +1 -0
  160. package/build-module/tabs/index.js +142 -0
  161. package/build-module/tabs/index.js.map +1 -0
  162. package/build-module/tabs/styles.js +36 -0
  163. package/build-module/tabs/styles.js.map +1 -0
  164. package/build-module/tabs/tab.js +43 -0
  165. package/build-module/tabs/tab.js.map +1 -0
  166. package/build-module/tabs/tablist.js +41 -0
  167. package/build-module/tabs/tablist.js.map +1 -0
  168. package/build-module/tabs/tabpanel.js +43 -0
  169. package/build-module/tabs/tabpanel.js.map +1 -0
  170. package/build-module/tabs/types.js +2 -0
  171. package/build-module/tabs/types.js.map +1 -0
  172. package/build-module/text/component.js +6 -6
  173. package/build-module/text/component.js.map +1 -1
  174. package/build-module/text/hook.js +11 -19
  175. package/build-module/text/hook.js.map +1 -1
  176. package/build-module/text/index.js.map +1 -1
  177. package/build-module/text/styles.js +7 -7
  178. package/build-module/text/styles.js.map +1 -1
  179. package/build-module/text/types.js.map +1 -1
  180. package/build-module/text/utils.js +17 -10
  181. package/build-module/text/utils.js.map +1 -1
  182. package/build-module/toggle-group-control/toggle-group-control-option-base/component.js +1 -0
  183. package/build-module/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -1
  184. package/build-module/toolbar/toolbar/index.js +18 -11
  185. package/build-module/toolbar/toolbar/index.js.map +1 -1
  186. package/build-module/toolbar/toolbar/types.js.map +1 -1
  187. package/build-module/tools-panel/tools-panel-item/hook.js +2 -2
  188. package/build-module/tools-panel/tools-panel-item/hook.js.map +1 -1
  189. package/build-module/tools-panel/types.js.map +1 -1
  190. package/build-module/tooltip/index.js +2 -2
  191. package/build-module/tooltip/index.js.map +1 -1
  192. package/build-module/unit-control/utils.js +108 -0
  193. package/build-module/unit-control/utils.js.map +1 -1
  194. package/build-module/utils/unit-values.js +1 -1
  195. package/build-module/utils/unit-values.js.map +1 -1
  196. package/build-style/style-rtl.css +17 -5
  197. package/build-style/style.css +17 -5
  198. package/build-types/alignment-matrix-control/cell.d.ts +1 -1
  199. package/build-types/alignment-matrix-control/cell.d.ts.map +1 -1
  200. package/build-types/alignment-matrix-control/index.d.ts.map +1 -1
  201. package/build-types/alignment-matrix-control/stories/index.story.d.ts.map +1 -1
  202. package/build-types/alignment-matrix-control/utils.d.ts +9 -9
  203. package/build-types/alignment-matrix-control/utils.d.ts.map +1 -1
  204. package/build-types/autocomplete/index.d.ts.map +1 -1
  205. package/build-types/circular-option-picker/circular-option-picker-option.d.ts.map +1 -1
  206. package/build-types/circular-option-picker/circular-option-picker.d.ts.map +1 -1
  207. package/build-types/circular-option-picker/types.d.ts +4 -6
  208. package/build-types/circular-option-picker/types.d.ts.map +1 -1
  209. package/build-types/color-palette/index.d.ts.map +1 -1
  210. package/build-types/color-picker/component.d.ts.map +1 -1
  211. package/build-types/color-picker/picker.d.ts +1 -1
  212. package/build-types/color-picker/picker.d.ts.map +1 -1
  213. package/build-types/color-picker/styles.d.ts.map +1 -1
  214. package/build-types/color-picker/types.d.ts +3 -0
  215. package/build-types/color-picker/types.d.ts.map +1 -1
  216. package/build-types/composite/v2.d.ts +12 -0
  217. package/build-types/composite/v2.d.ts.map +1 -0
  218. package/build-types/confirm-dialog/component.d.ts +70 -29
  219. package/build-types/confirm-dialog/component.d.ts.map +1 -1
  220. package/build-types/confirm-dialog/stories/index.story.d.ts +11 -0
  221. package/build-types/confirm-dialog/stories/index.story.d.ts.map +1 -0
  222. package/build-types/confirm-dialog/test/index.d.ts +2 -0
  223. package/build-types/confirm-dialog/test/index.d.ts.map +1 -0
  224. package/build-types/confirm-dialog/types.d.ts +32 -10
  225. package/build-types/confirm-dialog/types.d.ts.map +1 -1
  226. package/build-types/custom-gradient-picker/gradient-bar/control-points.d.ts.map +1 -1
  227. package/build-types/dropdown-menu-v2-ariakit/index.d.ts +11 -0
  228. package/build-types/dropdown-menu-v2-ariakit/index.d.ts.map +1 -0
  229. package/build-types/dropdown-menu-v2-ariakit/stories/index.story.d.ts +16 -0
  230. package/build-types/dropdown-menu-v2-ariakit/stories/index.story.d.ts.map +1 -0
  231. package/build-types/dropdown-menu-v2-ariakit/styles.d.ts +88 -0
  232. package/build-types/dropdown-menu-v2-ariakit/styles.d.ts.map +1 -0
  233. package/build-types/dropdown-menu-v2-ariakit/test/index.d.ts +2 -0
  234. package/build-types/dropdown-menu-v2-ariakit/test/index.d.ts.map +1 -0
  235. package/build-types/dropdown-menu-v2-ariakit/types.d.ts +174 -0
  236. package/build-types/dropdown-menu-v2-ariakit/types.d.ts.map +1 -0
  237. package/build-types/font-size-picker/utils.d.ts.map +1 -1
  238. package/build-types/heading/stories/index.story.d.ts.map +1 -1
  239. package/build-types/modal/index.d.ts.map +1 -1
  240. package/build-types/palette-edit/index.d.ts.map +1 -1
  241. package/build-types/popover/index.d.ts +1 -1
  242. package/build-types/popover/index.d.ts.map +1 -1
  243. package/build-types/popover/stories/e2e/index.story.d.ts +1 -1
  244. package/build-types/private-apis.d.ts.map +1 -1
  245. package/build-types/progress-bar/styles.d.ts.map +1 -1
  246. package/build-types/sandbox/index.d.ts.map +1 -1
  247. package/build-types/tabs/context.d.ts +8 -0
  248. package/build-types/tabs/context.d.ts.map +1 -0
  249. package/build-types/tabs/index.d.ts +13 -0
  250. package/build-types/tabs/index.d.ts.map +1 -0
  251. package/build-types/tabs/stories/index.story.d.ts +20 -0
  252. package/build-types/tabs/stories/index.story.d.ts.map +1 -0
  253. package/build-types/tabs/styles.d.ts +17 -0
  254. package/build-types/tabs/styles.d.ts.map +1 -0
  255. package/build-types/tabs/tab.d.ts +10 -0
  256. package/build-types/tabs/tab.d.ts.map +1 -0
  257. package/build-types/tabs/tablist.d.ts +7 -0
  258. package/build-types/tabs/tablist.d.ts.map +1 -0
  259. package/build-types/tabs/tabpanel.d.ts +7 -0
  260. package/build-types/tabs/tabpanel.d.ts.map +1 -0
  261. package/build-types/tabs/test/index.d.ts +2 -0
  262. package/build-types/tabs/test/index.d.ts.map +1 -0
  263. package/build-types/tabs/types.d.ts +134 -0
  264. package/build-types/tabs/types.d.ts.map +1 -0
  265. package/build-types/text/component.d.ts +4 -2
  266. package/build-types/text/component.d.ts.map +1 -1
  267. package/build-types/text/hook.d.ts +171 -165
  268. package/build-types/text/hook.d.ts.map +1 -1
  269. package/build-types/text/index.d.ts +2 -2
  270. package/build-types/text/index.d.ts.map +1 -1
  271. package/build-types/text/stories/index.story.d.ts +21 -0
  272. package/build-types/text/stories/index.story.d.ts.map +1 -0
  273. package/build-types/text/styles.d.ts +7 -7
  274. package/build-types/text/styles.d.ts.map +1 -1
  275. package/build-types/text/types.d.ts +1 -1
  276. package/build-types/text/types.d.ts.map +1 -1
  277. package/build-types/text/utils.d.ts +56 -61
  278. package/build-types/text/utils.d.ts.map +1 -1
  279. package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts.map +1 -1
  280. package/build-types/toolbar/stories/index.story.d.ts +5 -0
  281. package/build-types/toolbar/stories/index.story.d.ts.map +1 -1
  282. package/build-types/toolbar/toolbar/index.d.ts.map +1 -1
  283. package/build-types/toolbar/toolbar/types.d.ts +10 -0
  284. package/build-types/toolbar/toolbar/types.d.ts.map +1 -1
  285. package/build-types/tools-panel/tools-panel-item/hook.d.ts.map +1 -1
  286. package/build-types/tools-panel/types.d.ts +2 -0
  287. package/build-types/tools-panel/types.d.ts.map +1 -1
  288. package/build-types/tooltip/index.d.ts.map +1 -1
  289. package/build-types/unit-control/utils.d.ts.map +1 -1
  290. package/package.json +21 -20
  291. package/src/alignment-matrix-control/cell.tsx +6 -2
  292. package/src/alignment-matrix-control/index.tsx +31 -54
  293. package/src/alignment-matrix-control/stories/index.story.tsx +3 -7
  294. package/src/alignment-matrix-control/test/index.tsx +117 -18
  295. package/src/alignment-matrix-control/utils.tsx +33 -9
  296. package/src/autocomplete/index.tsx +136 -77
  297. package/src/button/style.scss +1 -2
  298. package/src/circular-option-picker/circular-option-picker-option.tsx +24 -38
  299. package/src/circular-option-picker/circular-option-picker.tsx +11 -28
  300. package/src/circular-option-picker/types.ts +6 -5
  301. package/src/color-palette/index.tsx +6 -1
  302. package/src/color-picker/component.tsx +25 -3
  303. package/src/color-picker/picker.tsx +96 -2
  304. package/src/color-picker/styles.ts +0 -1
  305. package/src/color-picker/types.ts +3 -0
  306. package/src/composite/v2.ts +22 -0
  307. package/src/confirm-dialog/README.md +1 -1
  308. package/src/confirm-dialog/component.tsx +79 -13
  309. package/src/confirm-dialog/stories/{index.story.js → index.story.tsx} +26 -24
  310. package/src/confirm-dialog/test/{index.js → index.tsx} +3 -3
  311. package/src/confirm-dialog/types.ts +32 -12
  312. package/src/custom-gradient-picker/gradient-bar/control-points.tsx +32 -25
  313. package/src/dimension-control/test/__snapshots__/index.test.js.snap +8 -8
  314. package/src/dropdown-menu-v2-ariakit/README.md +324 -0
  315. package/src/dropdown-menu-v2-ariakit/index.tsx +318 -0
  316. package/src/dropdown-menu-v2-ariakit/stories/index.story.tsx +506 -0
  317. package/src/dropdown-menu-v2-ariakit/styles.ts +297 -0
  318. package/src/dropdown-menu-v2-ariakit/test/index.tsx +1139 -0
  319. package/src/dropdown-menu-v2-ariakit/types.ts +186 -0
  320. package/src/font-size-picker/utils.ts +2 -1
  321. package/src/heading/stories/index.story.tsx +2 -4
  322. package/src/input-control/styles/input-control-styles.tsx +2 -2
  323. package/src/mobile/global-styles-context/utils.native.js +2 -2
  324. package/src/modal/index.tsx +58 -22
  325. package/src/modal/test/index.tsx +29 -0
  326. package/src/notice/style.scss +0 -1
  327. package/src/palette-edit/index.tsx +4 -0
  328. package/src/popover/index.tsx +99 -57
  329. package/src/popover/style.scss +9 -0
  330. package/src/private-apis.ts +31 -1
  331. package/src/progress-bar/styles.ts +19 -4
  332. package/src/sandbox/index.native.js +1 -1
  333. package/src/sandbox/index.tsx +3 -1
  334. package/src/select-control/styles/select-control-styles.ts +2 -2
  335. package/src/slot-fill/bubbles-virtually/slot-fill-provider.tsx +1 -1
  336. package/src/tabs/README.md +242 -0
  337. package/src/tabs/context.ts +13 -0
  338. package/src/tabs/index.tsx +167 -0
  339. package/src/tabs/stories/index.story.tsx +352 -0
  340. package/src/tabs/styles.ts +103 -0
  341. package/src/tabs/tab.tsx +39 -0
  342. package/src/tabs/tablist.tsx +40 -0
  343. package/src/tabs/tabpanel.tsx +42 -0
  344. package/src/tabs/test/index.tsx +1133 -0
  345. package/src/tabs/types.ts +142 -0
  346. package/src/text/README.md +2 -2
  347. package/src/text/{component.js → component.tsx} +10 -6
  348. package/src/text/{hook.js → hook.ts} +12 -15
  349. package/src/text/stories/index.story.tsx +80 -0
  350. package/src/text/types.ts +1 -6
  351. package/src/text/{utils.js → utils.ts} +40 -14
  352. package/src/toggle-group-control/test/__snapshots__/index.tsx.snap +16 -0
  353. package/src/toggle-group-control/toggle-group-control-option-base/component.tsx +1 -0
  354. package/src/toolbar/stories/index.story.tsx +15 -0
  355. package/src/toolbar/test/index.tsx +8 -0
  356. package/src/toolbar/toolbar/README.md +9 -0
  357. package/src/toolbar/toolbar/index.tsx +21 -12
  358. package/src/toolbar/toolbar/style.scss +9 -0
  359. package/src/toolbar/toolbar/types.ts +10 -0
  360. package/src/tools-panel/tools-panel/README.md +3 -0
  361. package/src/tools-panel/tools-panel-item/hook.ts +4 -6
  362. package/src/tools-panel/types.ts +2 -0
  363. package/src/tooltip/index.tsx +2 -3
  364. package/src/unit-control/utils.ts +124 -0
  365. package/src/utils/unit-values.ts +1 -1
  366. package/tsconfig.tsbuildinfo +1 -1
  367. package/src/text/stories/index.story.js +0 -53
  368. /package/src/text/{index.js → index.ts} +0 -0
  369. /package/src/text/{styles.js → styles.ts} +0 -0
@@ -0,0 +1,506 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import type { Meta, StoryFn } from '@storybook/react';
5
+ import styled from '@emotion/styled';
6
+ import { css } from '@emotion/react';
7
+
8
+ /**
9
+ * WordPress dependencies
10
+ */
11
+ import { wordpress } from '@wordpress/icons';
12
+ import { useState, useMemo, useContext } from '@wordpress/element';
13
+
14
+ /**
15
+ * Internal dependencies
16
+ */
17
+ import { COLORS, useCx } from '../../utils';
18
+ import {
19
+ DropdownMenu,
20
+ DropdownMenuItem,
21
+ DropdownMenuCheckboxItem,
22
+ DropdownMenuGroup,
23
+ DropdownMenuGroupLabel,
24
+ DropdownMenuSeparator,
25
+ DropdownMenuContext,
26
+ DropdownMenuRadioItem,
27
+ } from '..';
28
+ import Icon from '../../icon';
29
+ import Button from '../../button';
30
+ import Modal from '../../modal';
31
+ import { createSlotFill, Provider as SlotFillProvider } from '../../slot-fill';
32
+ import { ContextSystemProvider } from '../../context';
33
+
34
+ const meta: Meta< typeof DropdownMenu > = {
35
+ title: 'Components (Experimental)/DropdownMenu v2 ariakit',
36
+ component: DropdownMenu,
37
+ subcomponents: {
38
+ // @ts-expect-error - See https://github.com/storybookjs/storybook/issues/23170
39
+ DropdownMenuItem,
40
+ },
41
+ argTypes: {
42
+ children: { control: { type: null } },
43
+ },
44
+ parameters: {
45
+ actions: { argTypesRegex: '^on.*' },
46
+ controls: { expanded: true },
47
+ docs: {
48
+ canvas: { sourceState: 'shown' },
49
+ source: { excludeDecorators: true },
50
+ },
51
+ },
52
+ decorators: [
53
+ // Layout wrapper
54
+ ( Story ) => (
55
+ <div
56
+ style={ {
57
+ minHeight: '300px',
58
+ } }
59
+ >
60
+ <Story />
61
+ </div>
62
+ ),
63
+ ],
64
+ };
65
+ export default meta;
66
+
67
+ const ItemHelpText = styled.span`
68
+ font-size: 12px;
69
+ color: ${ COLORS.gray[ '700' ] };
70
+
71
+ /* when the immediate parent item is hovered / focused */
72
+ [data-active-item] > * > &,
73
+ /* when the parent item is a submenu trigger and the submenu is open */
74
+ [aria-expanded='true'] > &,
75
+ /* when the parent item is disabled */
76
+ [aria-disabled='true'] > & {
77
+ color: inherit;
78
+ }
79
+ `;
80
+
81
+ export const Default: StoryFn< typeof DropdownMenu > = ( props ) => (
82
+ <DropdownMenu { ...props }>
83
+ <DropdownMenuItem>Default item</DropdownMenuItem>
84
+ <DropdownMenuItem hideOnClick={ false }>
85
+ <div
86
+ style={ {
87
+ display: 'inline-flex',
88
+ flexDirection: 'column',
89
+ } }
90
+ >
91
+ Other item
92
+ <ItemHelpText>
93
+ Won&apos;t close the menu when clicked
94
+ </ItemHelpText>
95
+ </div>
96
+ </DropdownMenuItem>
97
+ <DropdownMenuItem disabled>Disabled item</DropdownMenuItem>
98
+ <DropdownMenuSeparator />
99
+ <DropdownMenuGroup>
100
+ <DropdownMenuGroupLabel>Prefix and suffix</DropdownMenuGroupLabel>
101
+ <DropdownMenuItem
102
+ prefix={ <Icon icon={ wordpress } size={ 24 } /> }
103
+ >
104
+ With prefix
105
+ </DropdownMenuItem>
106
+ <DropdownMenuItem suffix={ <span>⌘S</span> }>
107
+ With suffix
108
+ </DropdownMenuItem>
109
+ <DropdownMenuItem
110
+ disabled
111
+ prefix={ <Icon icon={ wordpress } size={ 24 } /> }
112
+ suffix={ <span>⌥⌘T</span> }
113
+ >
114
+ Disabled with prefix and suffix
115
+ </DropdownMenuItem>
116
+ </DropdownMenuGroup>
117
+ </DropdownMenu>
118
+ );
119
+ Default.args = {
120
+ trigger: (
121
+ <Button __next40pxDefaultSize variant="secondary">
122
+ Open menu
123
+ </Button>
124
+ ),
125
+ };
126
+
127
+ export const WithSubmenu: StoryFn< typeof DropdownMenu > = ( props ) => (
128
+ <DropdownMenu { ...props }>
129
+ <DropdownMenuItem>Level 1 item</DropdownMenuItem>
130
+ <DropdownMenu
131
+ trigger={ <DropdownMenuItem>Submenu trigger</DropdownMenuItem> }
132
+ >
133
+ <DropdownMenuItem>Level 2 item</DropdownMenuItem>
134
+ <DropdownMenuItem>Level 2 item</DropdownMenuItem>
135
+ <DropdownMenu
136
+ trigger={ <DropdownMenuItem>Submenu trigger</DropdownMenuItem> }
137
+ >
138
+ <DropdownMenuItem>Level 3 item</DropdownMenuItem>
139
+ <DropdownMenuItem>Level 3 item</DropdownMenuItem>
140
+ </DropdownMenu>
141
+ </DropdownMenu>
142
+ </DropdownMenu>
143
+ );
144
+ WithSubmenu.args = {
145
+ ...Default.args,
146
+ };
147
+
148
+ export const WithCheckboxes: StoryFn< typeof DropdownMenu > = ( props ) => {
149
+ const [ isAChecked, setAChecked ] = useState( false );
150
+ const [ isBChecked, setBChecked ] = useState( true );
151
+ const [ multipleCheckboxesValue, setMultipleCheckboxesValue ] = useState<
152
+ string[]
153
+ >( [ 'b' ] );
154
+
155
+ const onMultipleCheckboxesCheckedChange: React.ComponentProps<
156
+ typeof DropdownMenuCheckboxItem
157
+ >[ 'onChange' ] = ( e ) => {
158
+ setMultipleCheckboxesValue( ( prevValues ) => {
159
+ if ( prevValues.includes( e.target.value ) ) {
160
+ return prevValues.filter( ( val ) => val !== e.target.value );
161
+ }
162
+ return [ ...prevValues, e.target.value ];
163
+ } );
164
+ };
165
+
166
+ return (
167
+ <DropdownMenu { ...props }>
168
+ <DropdownMenuGroup>
169
+ <DropdownMenuGroupLabel>
170
+ Individual, uncontrolled checkboxes
171
+ </DropdownMenuGroupLabel>
172
+ <DropdownMenuCheckboxItem
173
+ name="checkbox-individual-uncontrolled-a"
174
+ value="a"
175
+ >
176
+ Checkbox item A (initially unchecked)
177
+ </DropdownMenuCheckboxItem>
178
+ <DropdownMenuCheckboxItem
179
+ name="checkbox-individual-uncontrolled-b"
180
+ value="b"
181
+ defaultChecked
182
+ >
183
+ Checkbox item B (initially checked)
184
+ </DropdownMenuCheckboxItem>
185
+ </DropdownMenuGroup>
186
+ <DropdownMenuSeparator />
187
+ <DropdownMenuGroup>
188
+ <DropdownMenuGroupLabel>
189
+ Individual, controlled checkboxes
190
+ </DropdownMenuGroupLabel>
191
+ <DropdownMenuCheckboxItem
192
+ name="checkbox-individual-controlled-a"
193
+ value="a"
194
+ checked={ isAChecked }
195
+ onChange={ ( e ) => setAChecked( e.target.checked ) }
196
+ >
197
+ Checkbox item A
198
+ </DropdownMenuCheckboxItem>
199
+ <DropdownMenuCheckboxItem
200
+ name="checkbox-individual-controlled-b"
201
+ value="b"
202
+ checked={ isBChecked }
203
+ onChange={ ( e ) => setBChecked( e.target.checked ) }
204
+ >
205
+ Checkbox item B (initially checked)
206
+ </DropdownMenuCheckboxItem>
207
+ </DropdownMenuGroup>
208
+ <DropdownMenuSeparator />
209
+ <DropdownMenuGroup>
210
+ <DropdownMenuGroupLabel>
211
+ Multiple, uncontrolled checkboxes
212
+ </DropdownMenuGroupLabel>
213
+ <DropdownMenuCheckboxItem
214
+ name="checkbox-multiple-uncontrolled"
215
+ value="a"
216
+ >
217
+ Checkbox item A (initially unchecked)
218
+ </DropdownMenuCheckboxItem>
219
+ <DropdownMenuCheckboxItem
220
+ name="checkbox-multiple-uncontrolled"
221
+ value="b"
222
+ defaultChecked
223
+ >
224
+ Checkbox item B (initially checked)
225
+ </DropdownMenuCheckboxItem>
226
+ </DropdownMenuGroup>
227
+ <DropdownMenuSeparator />
228
+ <DropdownMenuGroup>
229
+ <DropdownMenuGroupLabel>
230
+ Multiple, controlled checkboxes
231
+ </DropdownMenuGroupLabel>
232
+ <DropdownMenuCheckboxItem
233
+ name="checkbox-multiple-controlled"
234
+ value="a"
235
+ checked={ multipleCheckboxesValue.includes( 'a' ) }
236
+ onChange={ onMultipleCheckboxesCheckedChange }
237
+ >
238
+ Checkbox item A (initially unchecked)
239
+ </DropdownMenuCheckboxItem>
240
+ <DropdownMenuCheckboxItem
241
+ name="checkbox-multiple-controlled"
242
+ value="b"
243
+ checked={ multipleCheckboxesValue.includes( 'b' ) }
244
+ onChange={ onMultipleCheckboxesCheckedChange }
245
+ >
246
+ Checkbox item B (initially checked)
247
+ </DropdownMenuCheckboxItem>
248
+ </DropdownMenuGroup>
249
+ </DropdownMenu>
250
+ );
251
+ };
252
+ WithCheckboxes.args = {
253
+ ...Default.args,
254
+ };
255
+
256
+ export const WithRadios: StoryFn< typeof DropdownMenu > = ( props ) => {
257
+ const [ radioValue, setRadioValue ] = useState( 'two' );
258
+ const onRadioChange: React.ComponentProps<
259
+ typeof DropdownMenuRadioItem
260
+ >[ 'onChange' ] = ( e ) => setRadioValue( e.target.value );
261
+
262
+ return (
263
+ <DropdownMenu { ...props }>
264
+ <DropdownMenuGroup>
265
+ <DropdownMenuGroupLabel>
266
+ Uncontrolled radios
267
+ </DropdownMenuGroupLabel>
268
+ <DropdownMenuRadioItem name="radio-uncontrolled" value="one">
269
+ Radio item 1
270
+ </DropdownMenuRadioItem>
271
+ <DropdownMenuRadioItem
272
+ name="radio-uncontrolled"
273
+ value="two"
274
+ defaultChecked
275
+ >
276
+ Radio item 2 (initially checked)
277
+ </DropdownMenuRadioItem>
278
+ </DropdownMenuGroup>
279
+ <DropdownMenuSeparator />
280
+ <DropdownMenuGroup>
281
+ <DropdownMenuGroupLabel>
282
+ Controlled radios
283
+ </DropdownMenuGroupLabel>
284
+ <DropdownMenuRadioItem
285
+ name="radio-controlled"
286
+ value="one"
287
+ checked={ radioValue === 'one' }
288
+ onChange={ onRadioChange }
289
+ >
290
+ Radio item 1
291
+ </DropdownMenuRadioItem>
292
+ <DropdownMenuRadioItem
293
+ name="radio-controlled"
294
+ value="two"
295
+ checked={ radioValue === 'two' }
296
+ onChange={ onRadioChange }
297
+ >
298
+ Radio item 2 (initially checked)
299
+ </DropdownMenuRadioItem>
300
+ </DropdownMenuGroup>
301
+ </DropdownMenu>
302
+ );
303
+ };
304
+ WithRadios.args = {
305
+ ...Default.args,
306
+ };
307
+
308
+ const modalOnTopOfDropdown = css`
309
+ && {
310
+ z-index: 1000000;
311
+ }
312
+ `;
313
+
314
+ // For more examples with `Modal`, check https://ariakit.org/examples/menu-wordpress-modal
315
+ export const WithModals: StoryFn< typeof DropdownMenu > = ( props ) => {
316
+ const [ isOuterModalOpen, setOuterModalOpen ] = useState( false );
317
+ const [ isInnerModalOpen, setInnerModalOpen ] = useState( false );
318
+
319
+ const cx = useCx();
320
+ const modalOverlayClassName = cx( modalOnTopOfDropdown );
321
+
322
+ return (
323
+ <>
324
+ <DropdownMenu { ...props }>
325
+ <DropdownMenuItem
326
+ onClick={ () => setOuterModalOpen( true ) }
327
+ hideOnClick={ false }
328
+ >
329
+ Open outer modal
330
+ </DropdownMenuItem>
331
+ <DropdownMenuItem
332
+ onClick={ () => setInnerModalOpen( true ) }
333
+ hideOnClick={ false }
334
+ >
335
+ Open inner modal
336
+ </DropdownMenuItem>
337
+ { isInnerModalOpen && (
338
+ <Modal
339
+ onRequestClose={ () => setInnerModalOpen( false ) }
340
+ overlayClassName={ modalOverlayClassName }
341
+ >
342
+ Modal&apos;s contents
343
+ <button onClick={ () => setInnerModalOpen( false ) }>
344
+ Close
345
+ </button>
346
+ </Modal>
347
+ ) }
348
+ </DropdownMenu>
349
+ { isOuterModalOpen && (
350
+ <Modal
351
+ onRequestClose={ () => setOuterModalOpen( false ) }
352
+ overlayClassName={ modalOverlayClassName }
353
+ >
354
+ Modal&apos;s contents
355
+ <button onClick={ () => setOuterModalOpen( false ) }>
356
+ Close
357
+ </button>
358
+ </Modal>
359
+ ) }
360
+ </>
361
+ );
362
+ };
363
+ WithModals.args = {
364
+ ...Default.args,
365
+ };
366
+
367
+ const ExampleSlotFill = createSlotFill( 'Example' );
368
+
369
+ const Slot = () => {
370
+ const dropdownMenuContext = useContext( DropdownMenuContext );
371
+
372
+ // Forwarding the content of the slot so that it can be used by the fill
373
+ const fillProps = useMemo(
374
+ () => ( {
375
+ forwardedContext: [
376
+ [
377
+ DropdownMenuContext.Provider,
378
+ { value: dropdownMenuContext },
379
+ ],
380
+ ],
381
+ } ),
382
+ [ dropdownMenuContext ]
383
+ );
384
+
385
+ return <ExampleSlotFill.Slot fillProps={ fillProps } bubblesVirtually />;
386
+ };
387
+
388
+ type ForwardedContextTuple< P = {} > = [
389
+ React.ComponentType< React.PropsWithChildren< P > >,
390
+ P,
391
+ ];
392
+
393
+ const Fill = ( { children }: { children: React.ReactNode } ) => {
394
+ const innerMarkup = <>{ children }</>;
395
+
396
+ return (
397
+ <ExampleSlotFill.Fill>
398
+ { ( fillProps: { forwardedContext?: ForwardedContextTuple[] } ) => {
399
+ const { forwardedContext = [] } = fillProps;
400
+
401
+ return forwardedContext.reduce(
402
+ ( inner: JSX.Element, [ Provider, props ] ) => (
403
+ <Provider { ...props }>{ inner }</Provider>
404
+ ),
405
+ innerMarkup
406
+ );
407
+ } }
408
+ </ExampleSlotFill.Fill>
409
+ );
410
+ };
411
+
412
+ export const WithSlotFill: StoryFn< typeof DropdownMenu > = ( props ) => {
413
+ return (
414
+ <SlotFillProvider>
415
+ <DropdownMenu { ...props }>
416
+ <DropdownMenuItem>Item</DropdownMenuItem>
417
+ <Slot />
418
+ </DropdownMenu>
419
+
420
+ <Fill>
421
+ <DropdownMenuItem>Item from fill</DropdownMenuItem>
422
+ <DropdownMenu
423
+ trigger={
424
+ <DropdownMenuItem>Submenu from fill</DropdownMenuItem>
425
+ }
426
+ >
427
+ <DropdownMenuItem>Submenu item from fill</DropdownMenuItem>
428
+ </DropdownMenu>
429
+ </Fill>
430
+ </SlotFillProvider>
431
+ );
432
+ };
433
+ WithSlotFill.args = {
434
+ ...Default.args,
435
+ };
436
+
437
+ const toolbarVariantContextValue = {
438
+ DropdownMenu: {
439
+ variant: 'toolbar',
440
+ },
441
+ };
442
+ export const ToolbarVariant: StoryFn< typeof DropdownMenu > = ( props ) => (
443
+ <ContextSystemProvider value={ toolbarVariantContextValue }>
444
+ <DropdownMenu { ...props }>
445
+ <DropdownMenuItem>Level 1 item</DropdownMenuItem>
446
+ <DropdownMenuItem>Level 1 item</DropdownMenuItem>
447
+ <DropdownMenuSeparator />
448
+ <DropdownMenu
449
+ trigger={ <DropdownMenuItem>Submenu trigger</DropdownMenuItem> }
450
+ >
451
+ <DropdownMenuItem>Level 2 item</DropdownMenuItem>
452
+ </DropdownMenu>
453
+ </DropdownMenu>
454
+ </ContextSystemProvider>
455
+ );
456
+ ToolbarVariant.args = {
457
+ ...Default.args,
458
+ };
459
+
460
+ export const InsideModal: StoryFn< typeof DropdownMenu > = ( props ) => {
461
+ const [ isModalOpen, setModalOpen ] = useState( false );
462
+ return (
463
+ <>
464
+ <Button
465
+ onClick={ () => setModalOpen( true ) }
466
+ __next40pxDefaultSize
467
+ variant="secondary"
468
+ >
469
+ Open modal
470
+ </Button>
471
+ { isModalOpen && (
472
+ <Modal onRequestClose={ () => setModalOpen( false ) }>
473
+ <DropdownMenu { ...props }>
474
+ <DropdownMenuItem>Level 1 item</DropdownMenuItem>
475
+ <DropdownMenuItem>Level 1 item</DropdownMenuItem>
476
+ <DropdownMenuSeparator />
477
+ <DropdownMenu
478
+ trigger={
479
+ <DropdownMenuItem>
480
+ Submenu trigger
481
+ </DropdownMenuItem>
482
+ }
483
+ >
484
+ <DropdownMenuItem>Level 2 item</DropdownMenuItem>
485
+ </DropdownMenu>
486
+ </DropdownMenu>
487
+ <Button onClick={ () => setModalOpen( false ) }>
488
+ Close modal
489
+ </Button>
490
+ </Modal>
491
+ ) }
492
+ </>
493
+ );
494
+ };
495
+ InsideModal.args = {
496
+ ...Default.args,
497
+ hideOnEscape: ( e ) => {
498
+ e.stopPropagation();
499
+ return true;
500
+ },
501
+ };
502
+ InsideModal.parameters = {
503
+ docs: {
504
+ source: { type: 'code' },
505
+ },
506
+ };