@wordpress/components 25.9.1 → 25.11.1-next.f8d8eceb.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 (364) 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/tabs/context.js +16 -0
  60. package/build/tabs/context.js.map +1 -0
  61. package/build/tabs/index.js +147 -0
  62. package/build/tabs/index.js.map +1 -0
  63. package/build/tabs/styles.js +38 -0
  64. package/build/tabs/styles.js.map +1 -0
  65. package/build/tabs/tab.js +46 -0
  66. package/build/tabs/tab.js.map +1 -0
  67. package/build/tabs/tablist.js +47 -0
  68. package/build/tabs/tablist.js.map +1 -0
  69. package/build/tabs/tabpanel.js +48 -0
  70. package/build/tabs/tabpanel.js.map +1 -0
  71. package/build/tabs/types.js +6 -0
  72. package/build/tabs/types.js.map +1 -0
  73. package/build/text/component.js +7 -6
  74. package/build/text/component.js.map +1 -1
  75. package/build/text/hook.js +6 -15
  76. package/build/text/hook.js.map +1 -1
  77. package/build/text/index.js.map +1 -1
  78. package/build/text/styles.js +7 -7
  79. package/build/text/styles.js.map +1 -1
  80. package/build/text/types.js.map +1 -1
  81. package/build/text/utils.js +17 -33
  82. package/build/text/utils.js.map +1 -1
  83. package/build/toggle-group-control/toggle-group-control-option-base/component.js +1 -0
  84. package/build/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -1
  85. package/build/toolbar/toolbar/index.js +17 -10
  86. package/build/toolbar/toolbar/index.js.map +1 -1
  87. package/build/toolbar/toolbar/types.js.map +1 -1
  88. package/build/tools-panel/tools-panel-item/hook.js +2 -2
  89. package/build/tools-panel/tools-panel-item/hook.js.map +1 -1
  90. package/build/tools-panel/types.js.map +1 -1
  91. package/build/tooltip/index.js +2 -2
  92. package/build/tooltip/index.js.map +1 -1
  93. package/build/unit-control/utils.js +108 -0
  94. package/build/unit-control/utils.js.map +1 -1
  95. package/build/utils/unit-values.js +1 -1
  96. package/build/utils/unit-values.js.map +1 -1
  97. package/build-module/alignment-matrix-control/cell.js +7 -4
  98. package/build-module/alignment-matrix-control/cell.js.map +1 -1
  99. package/build-module/alignment-matrix-control/index.js +27 -43
  100. package/build-module/alignment-matrix-control/index.js.map +1 -1
  101. package/build-module/alignment-matrix-control/utils.js +29 -8
  102. package/build-module/alignment-matrix-control/utils.js.map +1 -1
  103. package/build-module/autocomplete/index.js +104 -52
  104. package/build-module/autocomplete/index.js.map +1 -1
  105. package/build-module/circular-option-picker/circular-option-picker-option.js +20 -39
  106. package/build-module/circular-option-picker/circular-option-picker-option.js.map +1 -1
  107. package/build-module/circular-option-picker/circular-option-picker.js +10 -31
  108. package/build-module/circular-option-picker/circular-option-picker.js.map +1 -1
  109. package/build-module/circular-option-picker/types.js.map +1 -1
  110. package/build-module/color-palette/index.js +7 -2
  111. package/build-module/color-palette/index.js.map +1 -1
  112. package/build-module/color-picker/component.js +13 -3
  113. package/build-module/color-picker/component.js.map +1 -1
  114. package/build-module/color-picker/picker.js +78 -2
  115. package/build-module/color-picker/picker.js.map +1 -1
  116. package/build-module/color-picker/styles.js +8 -8
  117. package/build-module/color-picker/styles.js.map +1 -1
  118. package/build-module/color-picker/types.js.map +1 -1
  119. package/build-module/composite/v2.js +15 -0
  120. package/build-module/composite/v2.js.map +1 -0
  121. package/build-module/confirm-dialog/component.js +72 -7
  122. package/build-module/confirm-dialog/component.js.map +1 -1
  123. package/build-module/confirm-dialog/types.js.map +1 -1
  124. package/build-module/custom-gradient-picker/gradient-bar/control-points.js +13 -4
  125. package/build-module/custom-gradient-picker/gradient-bar/control-points.js.map +1 -1
  126. package/build-module/dropdown-menu-v2-ariakit/index.js +199 -0
  127. package/build-module/dropdown-menu-v2-ariakit/index.js.map +1 -0
  128. package/build-module/dropdown-menu-v2-ariakit/styles.js +136 -0
  129. package/build-module/dropdown-menu-v2-ariakit/styles.js.map +1 -0
  130. package/build-module/dropdown-menu-v2-ariakit/types.js +2 -0
  131. package/build-module/dropdown-menu-v2-ariakit/types.js.map +1 -0
  132. package/build-module/font-size-picker/utils.js +1 -1
  133. package/build-module/font-size-picker/utils.js.map +1 -1
  134. package/build-module/input-control/styles/input-control-styles.js +23 -23
  135. package/build-module/input-control/styles/input-control-styles.js.map +1 -1
  136. package/build-module/mobile/global-styles-context/utils.native.js +2 -2
  137. package/build-module/mobile/global-styles-context/utils.native.js.map +1 -1
  138. package/build-module/modal/index.js +47 -18
  139. package/build-module/modal/index.js.map +1 -1
  140. package/build-module/palette-edit/index.js +4 -0
  141. package/build-module/palette-edit/index.js.map +1 -1
  142. package/build-module/popover/index.js +34 -6
  143. package/build-module/popover/index.js.map +1 -1
  144. package/build-module/private-apis.js +18 -2
  145. package/build-module/private-apis.js.map +1 -1
  146. package/build-module/progress-bar/styles.js +5 -5
  147. package/build-module/progress-bar/styles.js.map +1 -1
  148. package/build-module/sandbox/index.js +1 -1
  149. package/build-module/sandbox/index.js.map +1 -1
  150. package/build-module/sandbox/index.native.js +1 -1
  151. package/build-module/sandbox/index.native.js.map +1 -1
  152. package/build-module/select-control/styles/select-control-styles.js +8 -8
  153. package/build-module/select-control/styles/select-control-styles.js.map +1 -1
  154. package/build-module/tabs/context.js +12 -0
  155. package/build-module/tabs/context.js.map +1 -0
  156. package/build-module/tabs/index.js +142 -0
  157. package/build-module/tabs/index.js.map +1 -0
  158. package/build-module/tabs/styles.js +36 -0
  159. package/build-module/tabs/styles.js.map +1 -0
  160. package/build-module/tabs/tab.js +43 -0
  161. package/build-module/tabs/tab.js.map +1 -0
  162. package/build-module/tabs/tablist.js +41 -0
  163. package/build-module/tabs/tablist.js.map +1 -0
  164. package/build-module/tabs/tabpanel.js +43 -0
  165. package/build-module/tabs/tabpanel.js.map +1 -0
  166. package/build-module/tabs/types.js +2 -0
  167. package/build-module/tabs/types.js.map +1 -0
  168. package/build-module/text/component.js +6 -6
  169. package/build-module/text/component.js.map +1 -1
  170. package/build-module/text/hook.js +11 -19
  171. package/build-module/text/hook.js.map +1 -1
  172. package/build-module/text/index.js.map +1 -1
  173. package/build-module/text/styles.js +7 -7
  174. package/build-module/text/styles.js.map +1 -1
  175. package/build-module/text/types.js.map +1 -1
  176. package/build-module/text/utils.js +17 -10
  177. package/build-module/text/utils.js.map +1 -1
  178. package/build-module/toggle-group-control/toggle-group-control-option-base/component.js +1 -0
  179. package/build-module/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -1
  180. package/build-module/toolbar/toolbar/index.js +18 -11
  181. package/build-module/toolbar/toolbar/index.js.map +1 -1
  182. package/build-module/toolbar/toolbar/types.js.map +1 -1
  183. package/build-module/tools-panel/tools-panel-item/hook.js +2 -2
  184. package/build-module/tools-panel/tools-panel-item/hook.js.map +1 -1
  185. package/build-module/tools-panel/types.js.map +1 -1
  186. package/build-module/tooltip/index.js +2 -2
  187. package/build-module/tooltip/index.js.map +1 -1
  188. package/build-module/unit-control/utils.js +108 -0
  189. package/build-module/unit-control/utils.js.map +1 -1
  190. package/build-module/utils/unit-values.js +1 -1
  191. package/build-module/utils/unit-values.js.map +1 -1
  192. package/build-style/style-rtl.css +17 -5
  193. package/build-style/style.css +17 -5
  194. package/build-types/alignment-matrix-control/cell.d.ts +1 -1
  195. package/build-types/alignment-matrix-control/cell.d.ts.map +1 -1
  196. package/build-types/alignment-matrix-control/index.d.ts.map +1 -1
  197. package/build-types/alignment-matrix-control/stories/index.story.d.ts.map +1 -1
  198. package/build-types/alignment-matrix-control/utils.d.ts +9 -9
  199. package/build-types/alignment-matrix-control/utils.d.ts.map +1 -1
  200. package/build-types/autocomplete/index.d.ts.map +1 -1
  201. package/build-types/circular-option-picker/circular-option-picker-option.d.ts.map +1 -1
  202. package/build-types/circular-option-picker/circular-option-picker.d.ts.map +1 -1
  203. package/build-types/circular-option-picker/types.d.ts +4 -6
  204. package/build-types/circular-option-picker/types.d.ts.map +1 -1
  205. package/build-types/color-palette/index.d.ts.map +1 -1
  206. package/build-types/color-picker/component.d.ts.map +1 -1
  207. package/build-types/color-picker/picker.d.ts +1 -1
  208. package/build-types/color-picker/picker.d.ts.map +1 -1
  209. package/build-types/color-picker/styles.d.ts.map +1 -1
  210. package/build-types/color-picker/types.d.ts +3 -0
  211. package/build-types/color-picker/types.d.ts.map +1 -1
  212. package/build-types/composite/v2.d.ts +12 -0
  213. package/build-types/composite/v2.d.ts.map +1 -0
  214. package/build-types/confirm-dialog/component.d.ts +70 -29
  215. package/build-types/confirm-dialog/component.d.ts.map +1 -1
  216. package/build-types/confirm-dialog/stories/index.story.d.ts +11 -0
  217. package/build-types/confirm-dialog/stories/index.story.d.ts.map +1 -0
  218. package/build-types/confirm-dialog/test/index.d.ts +2 -0
  219. package/build-types/confirm-dialog/test/index.d.ts.map +1 -0
  220. package/build-types/confirm-dialog/types.d.ts +32 -10
  221. package/build-types/confirm-dialog/types.d.ts.map +1 -1
  222. package/build-types/custom-gradient-picker/gradient-bar/control-points.d.ts.map +1 -1
  223. package/build-types/dropdown-menu-v2-ariakit/index.d.ts +11 -0
  224. package/build-types/dropdown-menu-v2-ariakit/index.d.ts.map +1 -0
  225. package/build-types/dropdown-menu-v2-ariakit/stories/index.story.d.ts +16 -0
  226. package/build-types/dropdown-menu-v2-ariakit/stories/index.story.d.ts.map +1 -0
  227. package/build-types/dropdown-menu-v2-ariakit/styles.d.ts +88 -0
  228. package/build-types/dropdown-menu-v2-ariakit/styles.d.ts.map +1 -0
  229. package/build-types/dropdown-menu-v2-ariakit/test/index.d.ts +2 -0
  230. package/build-types/dropdown-menu-v2-ariakit/test/index.d.ts.map +1 -0
  231. package/build-types/dropdown-menu-v2-ariakit/types.d.ts +174 -0
  232. package/build-types/dropdown-menu-v2-ariakit/types.d.ts.map +1 -0
  233. package/build-types/font-size-picker/utils.d.ts.map +1 -1
  234. package/build-types/heading/stories/index.story.d.ts.map +1 -1
  235. package/build-types/modal/index.d.ts.map +1 -1
  236. package/build-types/palette-edit/index.d.ts.map +1 -1
  237. package/build-types/popover/index.d.ts +1 -1
  238. package/build-types/popover/index.d.ts.map +1 -1
  239. package/build-types/popover/stories/e2e/index.story.d.ts +1 -1
  240. package/build-types/private-apis.d.ts.map +1 -1
  241. package/build-types/progress-bar/styles.d.ts.map +1 -1
  242. package/build-types/sandbox/index.d.ts.map +1 -1
  243. package/build-types/tabs/context.d.ts +8 -0
  244. package/build-types/tabs/context.d.ts.map +1 -0
  245. package/build-types/tabs/index.d.ts +13 -0
  246. package/build-types/tabs/index.d.ts.map +1 -0
  247. package/build-types/tabs/stories/index.story.d.ts +20 -0
  248. package/build-types/tabs/stories/index.story.d.ts.map +1 -0
  249. package/build-types/tabs/styles.d.ts +17 -0
  250. package/build-types/tabs/styles.d.ts.map +1 -0
  251. package/build-types/tabs/tab.d.ts +10 -0
  252. package/build-types/tabs/tab.d.ts.map +1 -0
  253. package/build-types/tabs/tablist.d.ts +7 -0
  254. package/build-types/tabs/tablist.d.ts.map +1 -0
  255. package/build-types/tabs/tabpanel.d.ts +7 -0
  256. package/build-types/tabs/tabpanel.d.ts.map +1 -0
  257. package/build-types/tabs/test/index.d.ts +2 -0
  258. package/build-types/tabs/test/index.d.ts.map +1 -0
  259. package/build-types/tabs/types.d.ts +134 -0
  260. package/build-types/tabs/types.d.ts.map +1 -0
  261. package/build-types/text/component.d.ts +4 -2
  262. package/build-types/text/component.d.ts.map +1 -1
  263. package/build-types/text/hook.d.ts +171 -165
  264. package/build-types/text/hook.d.ts.map +1 -1
  265. package/build-types/text/index.d.ts +2 -2
  266. package/build-types/text/index.d.ts.map +1 -1
  267. package/build-types/text/stories/index.story.d.ts +21 -0
  268. package/build-types/text/stories/index.story.d.ts.map +1 -0
  269. package/build-types/text/styles.d.ts +7 -7
  270. package/build-types/text/styles.d.ts.map +1 -1
  271. package/build-types/text/types.d.ts +1 -1
  272. package/build-types/text/types.d.ts.map +1 -1
  273. package/build-types/text/utils.d.ts +56 -61
  274. package/build-types/text/utils.d.ts.map +1 -1
  275. package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts.map +1 -1
  276. package/build-types/toolbar/stories/index.story.d.ts +5 -0
  277. package/build-types/toolbar/stories/index.story.d.ts.map +1 -1
  278. package/build-types/toolbar/toolbar/index.d.ts.map +1 -1
  279. package/build-types/toolbar/toolbar/types.d.ts +10 -0
  280. package/build-types/toolbar/toolbar/types.d.ts.map +1 -1
  281. package/build-types/tools-panel/tools-panel-item/hook.d.ts.map +1 -1
  282. package/build-types/tools-panel/types.d.ts +2 -0
  283. package/build-types/tools-panel/types.d.ts.map +1 -1
  284. package/build-types/tooltip/index.d.ts.map +1 -1
  285. package/build-types/unit-control/utils.d.ts.map +1 -1
  286. package/package.json +21 -20
  287. package/src/alignment-matrix-control/cell.tsx +6 -2
  288. package/src/alignment-matrix-control/index.tsx +31 -54
  289. package/src/alignment-matrix-control/stories/index.story.tsx +3 -7
  290. package/src/alignment-matrix-control/test/index.tsx +117 -18
  291. package/src/alignment-matrix-control/utils.tsx +33 -9
  292. package/src/autocomplete/index.tsx +136 -77
  293. package/src/button/style.scss +1 -2
  294. package/src/circular-option-picker/circular-option-picker-option.tsx +24 -38
  295. package/src/circular-option-picker/circular-option-picker.tsx +11 -28
  296. package/src/circular-option-picker/types.ts +6 -5
  297. package/src/color-palette/index.tsx +6 -1
  298. package/src/color-picker/component.tsx +25 -3
  299. package/src/color-picker/picker.tsx +96 -2
  300. package/src/color-picker/styles.ts +0 -1
  301. package/src/color-picker/types.ts +3 -0
  302. package/src/composite/v2.ts +22 -0
  303. package/src/confirm-dialog/README.md +1 -1
  304. package/src/confirm-dialog/component.tsx +79 -13
  305. package/src/confirm-dialog/stories/{index.story.js → index.story.tsx} +26 -24
  306. package/src/confirm-dialog/test/{index.js → index.tsx} +3 -3
  307. package/src/confirm-dialog/types.ts +32 -12
  308. package/src/custom-gradient-picker/gradient-bar/control-points.tsx +32 -25
  309. package/src/dimension-control/test/__snapshots__/index.test.js.snap +8 -8
  310. package/src/dropdown-menu-v2-ariakit/README.md +324 -0
  311. package/src/dropdown-menu-v2-ariakit/index.tsx +318 -0
  312. package/src/dropdown-menu-v2-ariakit/stories/index.story.tsx +506 -0
  313. package/src/dropdown-menu-v2-ariakit/styles.ts +297 -0
  314. package/src/dropdown-menu-v2-ariakit/test/index.tsx +1139 -0
  315. package/src/dropdown-menu-v2-ariakit/types.ts +186 -0
  316. package/src/font-size-picker/utils.ts +2 -1
  317. package/src/heading/stories/index.story.tsx +2 -4
  318. package/src/input-control/styles/input-control-styles.tsx +2 -2
  319. package/src/mobile/global-styles-context/utils.native.js +2 -2
  320. package/src/modal/index.tsx +58 -22
  321. package/src/modal/test/index.tsx +29 -0
  322. package/src/notice/style.scss +0 -1
  323. package/src/palette-edit/index.tsx +4 -0
  324. package/src/popover/index.tsx +99 -57
  325. package/src/popover/style.scss +9 -0
  326. package/src/private-apis.ts +31 -1
  327. package/src/progress-bar/styles.ts +19 -4
  328. package/src/sandbox/index.native.js +1 -1
  329. package/src/sandbox/index.tsx +3 -1
  330. package/src/select-control/styles/select-control-styles.ts +2 -2
  331. package/src/tabs/README.md +242 -0
  332. package/src/tabs/context.ts +13 -0
  333. package/src/tabs/index.tsx +167 -0
  334. package/src/tabs/stories/index.story.tsx +352 -0
  335. package/src/tabs/styles.ts +103 -0
  336. package/src/tabs/tab.tsx +39 -0
  337. package/src/tabs/tablist.tsx +40 -0
  338. package/src/tabs/tabpanel.tsx +42 -0
  339. package/src/tabs/test/index.tsx +1133 -0
  340. package/src/tabs/types.ts +142 -0
  341. package/src/text/README.md +2 -2
  342. package/src/text/{component.js → component.tsx} +10 -6
  343. package/src/text/{hook.js → hook.ts} +12 -15
  344. package/src/text/stories/index.story.tsx +80 -0
  345. package/src/text/types.ts +1 -6
  346. package/src/text/{utils.js → utils.ts} +40 -14
  347. package/src/toggle-group-control/test/__snapshots__/index.tsx.snap +16 -0
  348. package/src/toggle-group-control/toggle-group-control-option-base/component.tsx +1 -0
  349. package/src/toolbar/stories/index.story.tsx +15 -0
  350. package/src/toolbar/test/index.tsx +8 -0
  351. package/src/toolbar/toolbar/README.md +9 -0
  352. package/src/toolbar/toolbar/index.tsx +21 -12
  353. package/src/toolbar/toolbar/style.scss +9 -0
  354. package/src/toolbar/toolbar/types.ts +10 -0
  355. package/src/tools-panel/tools-panel/README.md +3 -0
  356. package/src/tools-panel/tools-panel-item/hook.ts +4 -6
  357. package/src/tools-panel/types.ts +2 -0
  358. package/src/tooltip/index.tsx +2 -3
  359. package/src/unit-control/utils.ts +124 -0
  360. package/src/utils/unit-values.ts +1 -1
  361. package/tsconfig.tsbuildinfo +1 -1
  362. package/src/text/stories/index.story.js +0 -53
  363. /package/src/text/{index.js → index.ts} +0 -0
  364. /package/src/text/{styles.js → styles.ts} +0 -0
@@ -0,0 +1,352 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import type { Meta, StoryFn } from '@storybook/react';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { wordpress, more, link } from '@wordpress/icons';
10
+ import { useState } from '@wordpress/element';
11
+
12
+ /**
13
+ * Internal dependencies
14
+ */
15
+ import Tabs from '..';
16
+ import { Slot, Fill, Provider as SlotFillProvider } from '../../slot-fill';
17
+ import DropdownMenu from '../../dropdown-menu';
18
+ import Button from '../../button';
19
+
20
+ const meta: Meta< typeof Tabs > = {
21
+ title: 'Components (Experimental)/Tabs',
22
+ component: Tabs,
23
+ parameters: {
24
+ actions: { argTypesRegex: '^on.*' },
25
+ controls: { expanded: true },
26
+ docs: { canvas: { sourceState: 'shown' } },
27
+ },
28
+ };
29
+ export default meta;
30
+
31
+ const Template: StoryFn< typeof Tabs > = ( props ) => {
32
+ return (
33
+ <Tabs { ...props }>
34
+ <Tabs.TabList>
35
+ <Tabs.Tab id={ 'tab1' }>Tab 1</Tabs.Tab>
36
+ <Tabs.Tab id={ 'tab2' }>Tab 2</Tabs.Tab>
37
+ <Tabs.Tab id={ 'tab3' }>Tab 3</Tabs.Tab>
38
+ </Tabs.TabList>
39
+ <Tabs.TabPanel id={ 'tab1' }>
40
+ <p>Selected tab: Tab 1</p>
41
+ </Tabs.TabPanel>
42
+ <Tabs.TabPanel id={ 'tab2' }>
43
+ <p>Selected tab: Tab 2</p>
44
+ </Tabs.TabPanel>
45
+ <Tabs.TabPanel id={ 'tab3' }>
46
+ <p>Selected tab: Tab 3</p>
47
+ </Tabs.TabPanel>
48
+ </Tabs>
49
+ );
50
+ };
51
+
52
+ export const Default = Template.bind( {} );
53
+
54
+ const DisabledTabTemplate: StoryFn< typeof Tabs > = ( props ) => {
55
+ return (
56
+ <Tabs { ...props }>
57
+ <Tabs.TabList>
58
+ <Tabs.Tab id={ 'tab1' } disabled={ true }>
59
+ Tab 1
60
+ </Tabs.Tab>
61
+ <Tabs.Tab id={ 'tab2' }>Tab 2</Tabs.Tab>
62
+ <Tabs.Tab id={ 'tab3' }>Tab 3</Tabs.Tab>
63
+ </Tabs.TabList>
64
+ <Tabs.TabPanel id={ 'tab1' }>
65
+ <p>Selected tab: Tab 1</p>
66
+ </Tabs.TabPanel>
67
+ <Tabs.TabPanel id={ 'tab2' }>
68
+ <p>Selected tab: Tab 2</p>
69
+ </Tabs.TabPanel>
70
+ <Tabs.TabPanel id={ 'tab3' }>
71
+ <p>Selected tab: Tab 3</p>
72
+ </Tabs.TabPanel>
73
+ </Tabs>
74
+ );
75
+ };
76
+ export const DisabledTab = DisabledTabTemplate.bind( {} );
77
+
78
+ const WithTabIconsAndTooltipsTemplate: StoryFn< typeof Tabs > = ( props ) => {
79
+ return (
80
+ <Tabs { ...props }>
81
+ <Tabs.TabList>
82
+ <Tabs.Tab
83
+ id={ 'tab1' }
84
+ render={
85
+ <Button icon={ wordpress } label="Tab 1" showTooltip />
86
+ }
87
+ />
88
+ <Tabs.Tab
89
+ id={ 'tab2' }
90
+ render={
91
+ <Button icon={ link } label="Tab 2" showTooltip />
92
+ }
93
+ />
94
+ <Tabs.Tab
95
+ id={ 'tab3' }
96
+ render={
97
+ <Button icon={ more } label="Tab 3" showTooltip />
98
+ }
99
+ />
100
+ </Tabs.TabList>
101
+ <Tabs.TabPanel id={ 'tab1' }>
102
+ <p>Selected tab: Tab 1</p>
103
+ </Tabs.TabPanel>
104
+ <Tabs.TabPanel id={ 'tab2' }>
105
+ <p>Selected tab: Tab 2</p>
106
+ </Tabs.TabPanel>
107
+ <Tabs.TabPanel id={ 'tab3' }>
108
+ <p>Selected tab: Tab 3</p>
109
+ </Tabs.TabPanel>
110
+ </Tabs>
111
+ );
112
+ };
113
+ export const WithTabIconsAndTooltips = WithTabIconsAndTooltipsTemplate.bind(
114
+ {}
115
+ );
116
+
117
+ export const ManualActivation = Template.bind( {} );
118
+ ManualActivation.args = {
119
+ selectOnMove: false,
120
+ };
121
+
122
+ const UsingSlotFillTemplate: StoryFn< typeof Tabs > = ( props ) => {
123
+ return (
124
+ <SlotFillProvider>
125
+ <Tabs { ...props }>
126
+ <Tabs.TabList>
127
+ <Tabs.Tab id={ 'tab1' }>Tab 1</Tabs.Tab>
128
+ <Tabs.Tab id={ 'tab2' }>Tab 2</Tabs.Tab>
129
+ <Tabs.Tab id={ 'tab3' }>Tab 3</Tabs.Tab>
130
+ </Tabs.TabList>
131
+ <Fill name="tabs-are-fun">
132
+ <Tabs.TabPanel id={ 'tab1' }>
133
+ <p>Selected tab: Tab 1</p>
134
+ </Tabs.TabPanel>
135
+ <Tabs.TabPanel id={ 'tab2' }>
136
+ <p>Selected tab: Tab 2</p>
137
+ </Tabs.TabPanel>
138
+ <Tabs.TabPanel id={ 'tab3' }>
139
+ <p>Selected tab: Tab 3</p>
140
+ </Tabs.TabPanel>
141
+ </Fill>
142
+ </Tabs>
143
+ <div
144
+ style={ {
145
+ border: '2px solid #999',
146
+ width: '300px',
147
+ margin: '20px auto',
148
+ } }
149
+ >
150
+ <p>other stuff</p>
151
+ <p>other stuff</p>
152
+ <p>this is fun!</p>
153
+ <p>other stuff</p>
154
+ <Slot bubblesVirtually as="div" name="tabs-are-fun" />
155
+ </div>
156
+ </SlotFillProvider>
157
+ );
158
+ };
159
+ export const UsingSlotFill = UsingSlotFillTemplate.bind( {} );
160
+ UsingSlotFill.storyName = 'Using SlotFill';
161
+
162
+ const CloseButtonTemplate: StoryFn< typeof Tabs > = ( props ) => {
163
+ const [ isOpen, setIsOpen ] = useState( true );
164
+
165
+ return (
166
+ <>
167
+ { isOpen ? (
168
+ <div
169
+ style={ {
170
+ width: '400px',
171
+ height: '100vh',
172
+ borderRight: '1px solid #333',
173
+ } }
174
+ >
175
+ <Tabs { ...props }>
176
+ <div
177
+ style={ {
178
+ display: 'flex',
179
+ borderBottom: '1px solid #333',
180
+ } }
181
+ >
182
+ <Tabs.TabList>
183
+ <Tabs.Tab id={ 'tab1' }>Tab 1</Tabs.Tab>
184
+ <Tabs.Tab id={ 'tab2' }>Tab 2</Tabs.Tab>
185
+ <Tabs.Tab id={ 'tab3' }>Tab 3</Tabs.Tab>
186
+ </Tabs.TabList>
187
+ <Button
188
+ variant={ 'tertiary' }
189
+ style={ {
190
+ marginLeft: 'auto',
191
+ alignSelf: 'center',
192
+ } }
193
+ onClick={ () => setIsOpen( false ) }
194
+ >
195
+ Close Tabs
196
+ </Button>
197
+ </div>
198
+ <Tabs.TabPanel id={ 'tab1' }>
199
+ <p>Selected tab: Tab 1</p>
200
+ </Tabs.TabPanel>
201
+ <Tabs.TabPanel id={ 'tab2' }>
202
+ <p>Selected tab: Tab 2</p>
203
+ </Tabs.TabPanel>
204
+ <Tabs.TabPanel id={ 'tab3' }>
205
+ <p>Selected tab: Tab 3</p>
206
+ </Tabs.TabPanel>
207
+ </Tabs>
208
+ </div>
209
+ ) : (
210
+ <Button
211
+ variant={ 'tertiary' }
212
+ onClick={ () => setIsOpen( true ) }
213
+ >
214
+ Open Tabs
215
+ </Button>
216
+ ) }
217
+ </>
218
+ );
219
+ };
220
+ export const InsertCustomElements = CloseButtonTemplate.bind( {} );
221
+
222
+ const ControlledModeTemplate: StoryFn< typeof Tabs > = ( props ) => {
223
+ const [ selectedTabId, setSelectedTabId ] = useState<
224
+ string | undefined | null
225
+ >( props.selectedTabId );
226
+
227
+ return (
228
+ <>
229
+ <Tabs
230
+ { ...props }
231
+ selectedTabId={ selectedTabId }
232
+ onSelect={ ( selectedId ) => {
233
+ setSelectedTabId( selectedId );
234
+ props.onSelect?.( selectedId );
235
+ } }
236
+ >
237
+ <Tabs.TabList>
238
+ <Tabs.Tab id={ 'tab1' }>Tab 1</Tabs.Tab>
239
+
240
+ <Tabs.Tab id={ 'tab2' }>Tab 2</Tabs.Tab>
241
+
242
+ <Tabs.Tab id={ 'tab3' }>Tab 3</Tabs.Tab>
243
+ </Tabs.TabList>
244
+ <Tabs.TabPanel id={ 'tab1' }>
245
+ <p>Selected tab: Tab 1</p>
246
+ </Tabs.TabPanel>
247
+ <Tabs.TabPanel id={ 'tab2' }>
248
+ <p>Selected tab: Tab 2</p>
249
+ </Tabs.TabPanel>
250
+ <Tabs.TabPanel id={ 'tab3' }>
251
+ <p>Selected tab: Tab 3</p>
252
+ </Tabs.TabPanel>
253
+ </Tabs>
254
+ {
255
+ <div style={ { marginTop: '200px' } }>
256
+ <p>Select a tab:</p>
257
+ <DropdownMenu
258
+ controls={ [
259
+ {
260
+ onClick: () => setSelectedTabId( 'tab1' ),
261
+ title: 'Tab 1',
262
+ isActive: selectedTabId === 'tab1',
263
+ },
264
+ {
265
+ onClick: () => setSelectedTabId( 'tab2' ),
266
+ title: 'Tab 2',
267
+ isActive: selectedTabId === 'tab2',
268
+ },
269
+ {
270
+ onClick: () => setSelectedTabId( 'tab3' ),
271
+ title: 'Tab 3',
272
+ isActive: selectedTabId === 'tab3',
273
+ },
274
+ ] }
275
+ label="Choose a tab. The power is yours."
276
+ />
277
+ </div>
278
+ }
279
+ </>
280
+ );
281
+ };
282
+
283
+ export const ControlledMode = ControlledModeTemplate.bind( {} );
284
+ ControlledMode.args = {
285
+ selectedTabId: 'tab3',
286
+ };
287
+
288
+ const TabBecomesDisabledTemplate: StoryFn< typeof Tabs > = ( props ) => {
289
+ const [ disableTab2, setDisableTab2 ] = useState( false );
290
+
291
+ return (
292
+ <>
293
+ <Button
294
+ variant="primary"
295
+ onClick={ () => setDisableTab2( ! disableTab2 ) }
296
+ >
297
+ { disableTab2 ? 'Enable' : 'Disable' } Tab 2
298
+ </Button>
299
+ <Tabs { ...props }>
300
+ <Tabs.TabList>
301
+ <Tabs.Tab id={ 'tab1' }>Tab 1</Tabs.Tab>
302
+ <Tabs.Tab id={ 'tab2' } disabled={ disableTab2 }>
303
+ Tab 2
304
+ </Tabs.Tab>
305
+ <Tabs.Tab id={ 'tab3' }>Tab 3</Tabs.Tab>
306
+ </Tabs.TabList>
307
+ <Tabs.TabPanel id={ 'tab1' }>
308
+ <p>Selected tab: Tab 1</p>
309
+ </Tabs.TabPanel>
310
+ <Tabs.TabPanel id={ 'tab2' }>
311
+ <p>Selected tab: Tab 2</p>
312
+ </Tabs.TabPanel>
313
+ <Tabs.TabPanel id={ 'tab3' }>
314
+ <p>Selected tab: Tab 3</p>
315
+ </Tabs.TabPanel>
316
+ </Tabs>
317
+ </>
318
+ );
319
+ };
320
+ export const TabBecomesDisabled = TabBecomesDisabledTemplate.bind( {} );
321
+
322
+ const TabGetsRemovedTemplate: StoryFn< typeof Tabs > = ( props ) => {
323
+ const [ removeTab1, setRemoveTab1 ] = useState( false );
324
+
325
+ return (
326
+ <>
327
+ <Button
328
+ variant="primary"
329
+ onClick={ () => setRemoveTab1( ! removeTab1 ) }
330
+ >
331
+ { removeTab1 ? 'Restore' : 'Remove' } Tab 1
332
+ </Button>
333
+ <Tabs { ...props }>
334
+ <Tabs.TabList>
335
+ { ! removeTab1 && <Tabs.Tab id={ 'tab1' }>Tab 1</Tabs.Tab> }
336
+ <Tabs.Tab id={ 'tab2' }>Tab 2</Tabs.Tab>
337
+ <Tabs.Tab id={ 'tab3' }>Tab 3</Tabs.Tab>
338
+ </Tabs.TabList>
339
+ <Tabs.TabPanel id={ 'tab1' }>
340
+ <p>Selected tab: Tab 1</p>
341
+ </Tabs.TabPanel>
342
+ <Tabs.TabPanel id={ 'tab2' }>
343
+ <p>Selected tab: Tab 2</p>
344
+ </Tabs.TabPanel>
345
+ <Tabs.TabPanel id={ 'tab3' }>
346
+ <p>Selected tab: Tab 3</p>
347
+ </Tabs.TabPanel>
348
+ </Tabs>
349
+ </>
350
+ );
351
+ };
352
+ export const TabGetsRemoved = TabGetsRemovedTemplate.bind( {} );
@@ -0,0 +1,103 @@
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 { reduceMotion } from '../utils/reduce-motion';
14
+
15
+ export const TabListWrapper = styled.div`
16
+ display: flex;
17
+ align-items: stretch;
18
+ flex-direction: row;
19
+ &[aria-orientation='vertical'] {
20
+ flex-direction: column;
21
+ }
22
+ `;
23
+
24
+ export const Tab = styled( Ariakit.Tab )`
25
+ && {
26
+ position: relative;
27
+ border-radius: 0;
28
+ height: ${ space( 12 ) };
29
+ background: transparent;
30
+ border: none;
31
+ box-shadow: none;
32
+ cursor: pointer;
33
+ padding: 3px ${ space( 4 ) }; // Use padding to offset the [aria-selected="true"] border, this benefits Windows High Contrast mode
34
+ margin-left: 0;
35
+ font-weight: 500;
36
+
37
+ &[aria-disabled='true'] {
38
+ cursor: default;
39
+ opacity: 0.3;
40
+ }
41
+
42
+ &:focus:not( :disabled ) {
43
+ position: relative;
44
+ box-shadow: none;
45
+ outline: none;
46
+ }
47
+
48
+ // Tab indicator
49
+ &::after {
50
+ content: '';
51
+ position: absolute;
52
+ right: 0;
53
+ bottom: 0;
54
+ left: 0;
55
+ pointer-events: none;
56
+
57
+ // Draw the indicator.
58
+ background: ${ COLORS.theme.accent };
59
+ height: calc( 0 * var( --wp-admin-border-width-focus ) );
60
+ border-radius: 0;
61
+
62
+ // Animation
63
+ transition: all 0.1s linear;
64
+ ${ reduceMotion( 'transition' ) };
65
+ }
66
+
67
+ // Active.
68
+ &[aria-selected='true']::after {
69
+ height: calc( 1 * var( --wp-admin-border-width-focus ) );
70
+
71
+ // Windows high contrast mode.
72
+ outline: 2px solid transparent;
73
+ outline-offset: -1px;
74
+ }
75
+
76
+ // Focus.
77
+ &::before {
78
+ content: '';
79
+ position: absolute;
80
+ top: ${ space( 3 ) };
81
+ right: ${ space( 3 ) };
82
+ bottom: ${ space( 3 ) };
83
+ left: ${ space( 3 ) };
84
+ pointer-events: none;
85
+
86
+ // Draw the indicator.
87
+ box-shadow: 0 0 0 0 transparent;
88
+ border-radius: 2px;
89
+
90
+ // Animation
91
+ transition: all 0.1s linear;
92
+ ${ reduceMotion( 'transition' ) };
93
+ }
94
+
95
+ &:focus-visible::before {
96
+ box-shadow: 0 0 0 var( --wp-admin-border-width-focus )
97
+ ${ COLORS.theme.accent };
98
+
99
+ // Windows high contrast mode.
100
+ outline: 2px solid transparent;
101
+ }
102
+ }
103
+ `;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+
5
+ import { useContext, forwardRef } from '@wordpress/element';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import type { TabProps } from './types';
11
+ import warning from '@wordpress/warning';
12
+ import { TabsContext } from './context';
13
+ import { Tab as StyledTab } from './styles';
14
+
15
+ export const Tab = forwardRef< HTMLButtonElement, TabProps >( function Tab(
16
+ { children, id, className, disabled, render, style },
17
+ ref
18
+ ) {
19
+ const context = useContext( TabsContext );
20
+ if ( ! context ) {
21
+ warning( '`Tabs.TabList` must be wrapped in a `Tabs` component.' );
22
+ return null;
23
+ }
24
+ const { store, instanceId } = context;
25
+ const instancedTabId = `${ instanceId }-${ id }`;
26
+ return (
27
+ <StyledTab
28
+ ref={ ref }
29
+ store={ store }
30
+ id={ instancedTabId }
31
+ className={ className }
32
+ style={ style }
33
+ disabled={ disabled }
34
+ render={ render }
35
+ >
36
+ { children }
37
+ </StyledTab>
38
+ );
39
+ } );
@@ -0,0 +1,40 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ // eslint-disable-next-line no-restricted-imports
5
+ import * as Ariakit from '@ariakit/react';
6
+
7
+ /**
8
+ * WordPress dependencies
9
+ */
10
+ import warning from '@wordpress/warning';
11
+ import { forwardRef } from '@wordpress/element';
12
+
13
+ /**
14
+ * Internal dependencies
15
+ */
16
+ import type { TabListProps } from './types';
17
+ import { useTabsContext } from './context';
18
+ import { TabListWrapper } from './styles';
19
+
20
+ export const TabList = forwardRef< HTMLDivElement, TabListProps >(
21
+ function TabList( { children, className, style }, ref ) {
22
+ const context = useTabsContext();
23
+ if ( ! context ) {
24
+ warning( '`Tabs.TabList` must be wrapped in a `Tabs` component.' );
25
+ return null;
26
+ }
27
+ const { store } = context;
28
+ return (
29
+ <Ariakit.TabList
30
+ ref={ ref }
31
+ style={ style }
32
+ store={ store }
33
+ className={ className }
34
+ render={ <TabListWrapper /> }
35
+ >
36
+ { children }
37
+ </Ariakit.TabList>
38
+ );
39
+ }
40
+ );
@@ -0,0 +1,42 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ // eslint-disable-next-line no-restricted-imports
5
+ import * as Ariakit from '@ariakit/react';
6
+
7
+ /**
8
+ * WordPress dependencies
9
+ */
10
+
11
+ import { forwardRef, useContext } from '@wordpress/element';
12
+
13
+ /**
14
+ * Internal dependencies
15
+ */
16
+ import type { TabPanelProps } from './types';
17
+
18
+ import warning from '@wordpress/warning';
19
+ import { TabsContext } from './context';
20
+
21
+ export const TabPanel = forwardRef< HTMLDivElement, TabPanelProps >(
22
+ function TabPanel( { children, id, className, style }, ref ) {
23
+ const context = useContext( TabsContext );
24
+ if ( ! context ) {
25
+ warning( '`Tabs.TabPanel` must be wrapped in a `Tabs` component.' );
26
+ return null;
27
+ }
28
+ const { store, instanceId } = context;
29
+
30
+ return (
31
+ <Ariakit.TabPanel
32
+ ref={ ref }
33
+ style={ style }
34
+ store={ store }
35
+ id={ `${ instanceId }-${ id }-view` }
36
+ className={ className }
37
+ >
38
+ { children }
39
+ </Ariakit.TabPanel>
40
+ );
41
+ }
42
+ );