@wordpress/ui 0.6.1-next.v.0 → 0.7.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 (297) hide show
  1. package/AGENTS.md +9 -0
  2. package/CHANGELOG.md +32 -1
  3. package/CLAUDE.md +1 -0
  4. package/README.md +13 -12
  5. package/build/badge/badge.cjs +37 -62
  6. package/build/badge/badge.cjs.map +4 -4
  7. package/build/button/button.cjs +3 -3
  8. package/build/button/button.cjs.map +2 -2
  9. package/build/dialog/action.cjs +46 -0
  10. package/build/dialog/action.cjs.map +7 -0
  11. package/build/dialog/close-icon.cjs +57 -0
  12. package/build/dialog/close-icon.cjs.map +7 -0
  13. package/build/dialog/context.cjs +76 -0
  14. package/build/dialog/context.cjs.map +7 -0
  15. package/build/dialog/footer.cjs +64 -0
  16. package/build/dialog/footer.cjs.map +7 -0
  17. package/build/dialog/header.cjs +64 -0
  18. package/build/dialog/header.cjs.map +7 -0
  19. package/build/dialog/index.cjs +52 -0
  20. package/build/dialog/index.cjs.map +7 -0
  21. package/build/dialog/popup.cjs +77 -0
  22. package/build/dialog/popup.cjs.map +7 -0
  23. package/build/dialog/root.cjs +35 -0
  24. package/build/dialog/root.cjs.map +7 -0
  25. package/build/dialog/title.cjs +76 -0
  26. package/build/dialog/title.cjs.map +7 -0
  27. package/build/dialog/trigger.cjs +38 -0
  28. package/build/dialog/trigger.cjs.map +7 -0
  29. package/build/dialog/types.cjs +19 -0
  30. package/build/dialog/types.cjs.map +7 -0
  31. package/build/form/primitives/field/root.cjs +1 -1
  32. package/build/form/primitives/field/root.cjs.map +1 -1
  33. package/build/form/primitives/fieldset/root.cjs +3 -3
  34. package/build/form/primitives/fieldset/root.cjs.map +2 -2
  35. package/build/form/primitives/index.cjs +5 -2
  36. package/build/form/primitives/index.cjs.map +2 -2
  37. package/build/form/primitives/input-layout/input-layout.cjs +3 -3
  38. package/build/form/primitives/input-layout/input-layout.cjs.map +2 -2
  39. package/build/form/primitives/input-layout/slot.cjs +3 -3
  40. package/build/form/primitives/input-layout/slot.cjs.map +2 -2
  41. package/build/form/primitives/select/item.cjs +3 -3
  42. package/build/form/primitives/select/item.cjs.map +2 -2
  43. package/build/form/primitives/select/popup.cjs +3 -3
  44. package/build/form/primitives/select/popup.cjs.map +2 -2
  45. package/build/form/primitives/select/trigger.cjs +3 -3
  46. package/build/form/primitives/select/trigger.cjs.map +2 -2
  47. package/build/{box → form/primitives/textarea}/index.cjs +7 -7
  48. package/build/form/primitives/textarea/index.cjs.map +7 -0
  49. package/build/form/primitives/textarea/textarea.cjs +90 -0
  50. package/build/form/primitives/textarea/textarea.cjs.map +7 -0
  51. package/build/form/primitives/textarea/types.cjs +19 -0
  52. package/build/form/primitives/textarea/types.cjs.map +7 -0
  53. package/build/icon-button/icon-button.cjs +104 -0
  54. package/build/icon-button/icon-button.cjs.map +7 -0
  55. package/build/icon-button/index.cjs +31 -0
  56. package/build/icon-button/index.cjs.map +7 -0
  57. package/build/icon-button/types.cjs +19 -0
  58. package/build/icon-button/types.cjs.map +7 -0
  59. package/build/index.cjs +8 -2
  60. package/build/index.cjs.map +2 -2
  61. package/build/tabs/index.cjs +40 -0
  62. package/build/tabs/index.cjs.map +7 -0
  63. package/build/tabs/list.cjs +145 -0
  64. package/build/tabs/list.cjs.map +7 -0
  65. package/build/tabs/panel.cjs +67 -0
  66. package/build/tabs/panel.cjs.map +7 -0
  67. package/build/tabs/root.cjs +38 -0
  68. package/build/tabs/root.cjs.map +7 -0
  69. package/build/tabs/tab.cjs +71 -0
  70. package/build/tabs/tab.cjs.map +7 -0
  71. package/build/{box → tabs}/types.cjs +1 -1
  72. package/build/tabs/types.cjs.map +7 -0
  73. package/build/tooltip/popup.cjs +3 -3
  74. package/build/tooltip/popup.cjs.map +2 -2
  75. package/build-module/badge/badge.mjs +27 -62
  76. package/build-module/badge/badge.mjs.map +3 -3
  77. package/build-module/button/button.mjs +3 -3
  78. package/build-module/button/button.mjs.map +2 -2
  79. package/build-module/dialog/action.mjs +21 -0
  80. package/build-module/dialog/action.mjs.map +7 -0
  81. package/build-module/dialog/close-icon.mjs +32 -0
  82. package/build-module/dialog/close-icon.mjs.map +7 -0
  83. package/build-module/dialog/context.mjs +57 -0
  84. package/build-module/dialog/context.mjs.map +7 -0
  85. package/build-module/dialog/footer.mjs +29 -0
  86. package/build-module/dialog/footer.mjs.map +7 -0
  87. package/build-module/dialog/header.mjs +29 -0
  88. package/build-module/dialog/header.mjs.map +7 -0
  89. package/build-module/dialog/index.mjs +20 -0
  90. package/build-module/dialog/index.mjs.map +7 -0
  91. package/build-module/dialog/popup.mjs +44 -0
  92. package/build-module/dialog/popup.mjs.map +7 -0
  93. package/build-module/dialog/root.mjs +10 -0
  94. package/build-module/dialog/root.mjs.map +7 -0
  95. package/build-module/dialog/title.mjs +41 -0
  96. package/build-module/dialog/title.mjs.map +7 -0
  97. package/build-module/dialog/trigger.mjs +13 -0
  98. package/build-module/dialog/trigger.mjs.map +7 -0
  99. package/build-module/form/primitives/field/root.mjs +1 -1
  100. package/build-module/form/primitives/field/root.mjs.map +1 -1
  101. package/build-module/form/primitives/fieldset/root.mjs +3 -3
  102. package/build-module/form/primitives/fieldset/root.mjs.map +2 -2
  103. package/build-module/form/primitives/index.mjs +3 -1
  104. package/build-module/form/primitives/index.mjs.map +2 -2
  105. package/build-module/form/primitives/input-layout/input-layout.mjs +3 -3
  106. package/build-module/form/primitives/input-layout/input-layout.mjs.map +2 -2
  107. package/build-module/form/primitives/input-layout/slot.mjs +3 -3
  108. package/build-module/form/primitives/input-layout/slot.mjs.map +2 -2
  109. package/build-module/form/primitives/select/item.mjs +3 -3
  110. package/build-module/form/primitives/select/item.mjs.map +2 -2
  111. package/build-module/form/primitives/select/popup.mjs +3 -3
  112. package/build-module/form/primitives/select/popup.mjs.map +2 -2
  113. package/build-module/form/primitives/select/trigger.mjs +3 -3
  114. package/build-module/form/primitives/select/trigger.mjs.map +2 -2
  115. package/build-module/form/primitives/textarea/index.mjs +6 -0
  116. package/build-module/form/primitives/textarea/index.mjs.map +7 -0
  117. package/build-module/form/primitives/textarea/textarea.mjs +55 -0
  118. package/build-module/form/primitives/textarea/textarea.mjs.map +7 -0
  119. package/build-module/form/primitives/textarea/types.mjs +1 -0
  120. package/build-module/form/primitives/textarea/types.mjs.map +7 -0
  121. package/build-module/icon-button/icon-button.mjs +69 -0
  122. package/build-module/icon-button/icon-button.mjs.map +7 -0
  123. package/build-module/icon-button/index.mjs +6 -0
  124. package/build-module/icon-button/index.mjs.map +7 -0
  125. package/build-module/icon-button/types.mjs +1 -0
  126. package/build-module/icon-button/types.mjs.map +7 -0
  127. package/build-module/index.mjs +5 -1
  128. package/build-module/index.mjs.map +2 -2
  129. package/build-module/tabs/index.mjs +12 -0
  130. package/build-module/tabs/index.mjs.map +7 -0
  131. package/build-module/tabs/list.mjs +110 -0
  132. package/build-module/tabs/list.mjs.map +7 -0
  133. package/build-module/tabs/panel.mjs +32 -0
  134. package/build-module/tabs/panel.mjs.map +7 -0
  135. package/build-module/tabs/root.mjs +13 -0
  136. package/build-module/tabs/root.mjs.map +7 -0
  137. package/build-module/tabs/tab.mjs +36 -0
  138. package/build-module/tabs/tab.mjs.map +7 -0
  139. package/build-module/tabs/types.mjs +1 -0
  140. package/build-module/tabs/types.mjs.map +7 -0
  141. package/build-module/tooltip/popup.mjs +3 -3
  142. package/build-module/tooltip/popup.mjs.map +2 -2
  143. package/build-types/badge/badge.d.ts +1 -2
  144. package/build-types/badge/badge.d.ts.map +1 -1
  145. package/build-types/button/stories/index.story.d.ts +1 -2
  146. package/build-types/button/stories/index.story.d.ts.map +1 -1
  147. package/build-types/dialog/action.d.ts +8 -0
  148. package/build-types/dialog/action.d.ts.map +1 -0
  149. package/build-types/dialog/close-icon.d.ts +8 -0
  150. package/build-types/dialog/close-icon.d.ts.map +1 -0
  151. package/build-types/dialog/context.d.ts +25 -0
  152. package/build-types/dialog/context.d.ts.map +1 -0
  153. package/build-types/dialog/footer.d.ts +8 -0
  154. package/build-types/dialog/footer.d.ts.map +1 -0
  155. package/build-types/dialog/header.d.ts +8 -0
  156. package/build-types/dialog/header.d.ts.map +1 -0
  157. package/build-types/dialog/index.d.ts +10 -0
  158. package/build-types/dialog/index.d.ts.map +1 -0
  159. package/build-types/dialog/popup.d.ts +8 -0
  160. package/build-types/dialog/popup.d.ts.map +1 -0
  161. package/build-types/dialog/root.d.ts +10 -0
  162. package/build-types/dialog/root.d.ts.map +1 -0
  163. package/build-types/dialog/stories/index.story.d.ts +18 -0
  164. package/build-types/dialog/stories/index.story.d.ts.map +1 -0
  165. package/build-types/dialog/test/index.test.d.ts +2 -0
  166. package/build-types/dialog/test/index.test.d.ts.map +1 -0
  167. package/build-types/dialog/title.d.ts +12 -0
  168. package/build-types/dialog/title.d.ts.map +1 -0
  169. package/build-types/dialog/trigger.d.ts +7 -0
  170. package/build-types/dialog/trigger.d.ts.map +1 -0
  171. package/build-types/dialog/types.d.ts +77 -0
  172. package/build-types/dialog/types.d.ts.map +1 -0
  173. package/build-types/form/primitives/field/stories/index.story.d.ts +0 -1
  174. package/build-types/form/primitives/field/stories/index.story.d.ts.map +1 -1
  175. package/build-types/form/primitives/index.d.ts +1 -0
  176. package/build-types/form/primitives/index.d.ts.map +1 -1
  177. package/build-types/form/primitives/input/input.d.ts +1 -1
  178. package/build-types/form/primitives/select/stories/index.story.d.ts +0 -1
  179. package/build-types/form/primitives/select/stories/index.story.d.ts.map +1 -1
  180. package/build-types/form/primitives/textarea/index.d.ts +2 -0
  181. package/build-types/form/primitives/textarea/index.d.ts.map +1 -0
  182. package/build-types/form/primitives/textarea/stories/index.story.d.ts +13 -0
  183. package/build-types/form/primitives/textarea/stories/index.story.d.ts.map +1 -0
  184. package/build-types/form/primitives/textarea/test/index.test.d.ts +2 -0
  185. package/build-types/form/primitives/textarea/test/index.test.d.ts.map +1 -0
  186. package/build-types/form/primitives/textarea/textarea.d.ts +4 -0
  187. package/build-types/form/primitives/textarea/textarea.d.ts.map +1 -0
  188. package/build-types/form/primitives/textarea/types.d.ts +11 -0
  189. package/build-types/form/primitives/textarea/types.d.ts.map +1 -0
  190. package/build-types/icon-button/icon-button.d.ts +13 -0
  191. package/build-types/icon-button/icon-button.d.ts.map +1 -0
  192. package/build-types/icon-button/index.d.ts +2 -0
  193. package/build-types/icon-button/index.d.ts.map +1 -0
  194. package/build-types/icon-button/stories/index.story.d.ts +19 -0
  195. package/build-types/icon-button/stories/index.story.d.ts.map +1 -0
  196. package/build-types/icon-button/test/index.test.d.ts +2 -0
  197. package/build-types/icon-button/test/index.test.d.ts.map +1 -0
  198. package/build-types/icon-button/types.d.ts +36 -0
  199. package/build-types/icon-button/types.d.ts.map +1 -0
  200. package/build-types/index.d.ts +3 -1
  201. package/build-types/index.d.ts.map +1 -1
  202. package/build-types/stack/stories/index.story.d.ts.map +1 -1
  203. package/build-types/tabs/index.d.ts +6 -0
  204. package/build-types/tabs/index.d.ts.map +1 -0
  205. package/build-types/tabs/list.d.ts +16 -0
  206. package/build-types/tabs/list.d.ts.map +1 -0
  207. package/build-types/tabs/panel.d.ts +15 -0
  208. package/build-types/tabs/panel.d.ts.map +1 -0
  209. package/build-types/tabs/root.d.ts +15 -0
  210. package/build-types/tabs/root.d.ts.map +1 -0
  211. package/build-types/tabs/stories/index.story.d.ts +13 -0
  212. package/build-types/tabs/stories/index.story.d.ts.map +1 -0
  213. package/build-types/tabs/tab.d.ts +15 -0
  214. package/build-types/tabs/tab.d.ts.map +1 -0
  215. package/build-types/tabs/test/index.test.d.ts +2 -0
  216. package/build-types/tabs/test/index.test.d.ts.map +1 -0
  217. package/build-types/tabs/types.d.ts +33 -0
  218. package/build-types/tabs/types.d.ts.map +1 -0
  219. package/package.json +12 -10
  220. package/src/badge/badge.tsx +19 -78
  221. package/src/badge/stories/choosing-intent.story.tsx +1 -1
  222. package/src/badge/style.module.css +48 -0
  223. package/src/button/stories/index.story.tsx +3 -16
  224. package/src/button/style.module.css +23 -12
  225. package/src/dialog/action.tsx +22 -0
  226. package/src/dialog/close-icon.tsx +32 -0
  227. package/src/dialog/context.tsx +113 -0
  228. package/src/dialog/footer.tsx +26 -0
  229. package/src/dialog/header.tsx +26 -0
  230. package/src/dialog/index.ts +10 -0
  231. package/src/dialog/popup.tsx +46 -0
  232. package/src/dialog/root.tsx +14 -0
  233. package/src/dialog/stories/index.story.tsx +177 -0
  234. package/src/dialog/style.module.css +114 -0
  235. package/src/dialog/test/index.test.tsx +309 -0
  236. package/src/dialog/title.tsx +39 -0
  237. package/src/dialog/trigger.tsx +14 -0
  238. package/src/dialog/types.ts +93 -0
  239. package/src/form/primitives/field/root.tsx +1 -1
  240. package/src/form/primitives/field/stories/index.story.tsx +0 -1
  241. package/src/form/primitives/fieldset/style.module.css +1 -1
  242. package/src/form/primitives/index.ts +1 -0
  243. package/src/form/primitives/input-layout/style.module.css +5 -8
  244. package/src/form/primitives/select/stories/index.story.tsx +0 -1
  245. package/src/form/primitives/select/test/index.test.tsx +0 -2
  246. package/src/form/primitives/textarea/index.ts +1 -0
  247. package/src/form/primitives/textarea/stories/index.story.tsx +40 -0
  248. package/src/form/primitives/textarea/style.module.css +22 -0
  249. package/src/form/primitives/textarea/test/index.test.tsx +143 -0
  250. package/src/form/primitives/textarea/textarea.tsx +51 -0
  251. package/src/form/primitives/textarea/types.ts +18 -0
  252. package/src/icon-button/icon-button.tsx +65 -0
  253. package/src/icon-button/index.ts +1 -0
  254. package/src/icon-button/stories/index.story.tsx +128 -0
  255. package/src/icon-button/style.module.css +16 -0
  256. package/src/icon-button/test/index.test.tsx +86 -0
  257. package/src/icon-button/types.ts +38 -0
  258. package/src/index.ts +3 -1
  259. package/src/stack/stories/index.story.tsx +4 -5
  260. package/src/tabs/index.ts +6 -0
  261. package/src/tabs/list.tsx +130 -0
  262. package/src/tabs/panel.tsx +23 -0
  263. package/src/tabs/root.tsx +15 -0
  264. package/src/tabs/stories/best-practices.mdx +85 -0
  265. package/src/tabs/stories/index.story.tsx +363 -0
  266. package/src/tabs/style.module.css +269 -0
  267. package/src/tabs/tab.tsx +29 -0
  268. package/src/tabs/test/index.test.tsx +2260 -0
  269. package/src/tabs/types.ts +36 -0
  270. package/src/tooltip/style.module.css +3 -3
  271. package/src/utils/css/item-popup.module.css +2 -2
  272. package/src/utils/css/select-trigger.module.css +1 -1
  273. package/build/box/box.cjs +0 -88
  274. package/build/box/box.cjs.map +0 -7
  275. package/build/box/index.cjs.map +0 -7
  276. package/build/box/types.cjs.map +0 -7
  277. package/build-module/box/box.mjs +0 -63
  278. package/build-module/box/box.mjs.map +0 -7
  279. package/build-module/box/index.mjs +0 -6
  280. package/build-module/box/index.mjs.map +0 -7
  281. package/build-types/box/box.d.ts +0 -7
  282. package/build-types/box/box.d.ts.map +0 -1
  283. package/build-types/box/index.d.ts +0 -2
  284. package/build-types/box/index.d.ts.map +0 -1
  285. package/build-types/box/stories/index.story.d.ts +0 -8
  286. package/build-types/box/stories/index.story.d.ts.map +0 -1
  287. package/build-types/box/test/box.test.d.ts +0 -2
  288. package/build-types/box/test/box.test.d.ts.map +0 -1
  289. package/build-types/box/types.d.ts +0 -46
  290. package/build-types/box/types.d.ts.map +0 -1
  291. package/src/box/box.tsx +0 -118
  292. package/src/box/index.ts +0 -1
  293. package/src/box/stories/index.story.tsx +0 -41
  294. package/src/box/test/box.test.tsx +0 -29
  295. package/src/box/types.ts +0 -61
  296. /package/build-module/{box → dialog}/types.mjs +0 -0
  297. /package/build-module/{box → dialog}/types.mjs.map +0 -0
@@ -0,0 +1,269 @@
1
+ @layer wp-ui-utilities, wp-ui-components, wp-ui-compositions, wp-ui-overrides;
2
+
3
+ @layer wp-ui-components {
4
+ .tablist {
5
+ display: flex;
6
+ align-items: stretch;
7
+ overflow-inline: auto;
8
+ overscroll-behavior-inline: none;
9
+
10
+ --direction-factor: 1;
11
+ --direction-start: left;
12
+ --direction-end: right;
13
+
14
+ &:dir(rtl) {
15
+ --direction-factor: -1;
16
+ --direction-start: right;
17
+ --direction-end: left;
18
+ }
19
+
20
+ position: relative;
21
+
22
+ &[data-orientation="horizontal"] {
23
+ --fade-width: 4rem;
24
+ --fade-gradient-base: transparent 0%, #000 var(--fade-width);
25
+ --fade-gradient-composed: var(--fade-gradient-base), #000 60%, transparent 50%;
26
+
27
+ width: fit-content;
28
+
29
+ &.is-overflowing-first {
30
+ mask-image: linear-gradient(to var(--direction-end), var(--fade-gradient-base));
31
+ }
32
+
33
+ &.is-overflowing-last {
34
+ mask-image: linear-gradient(to var(--direction-start), var(--fade-gradient-base));
35
+ }
36
+
37
+ &.is-overflowing-first.is-overflowing-last {
38
+ mask-image:
39
+ linear-gradient(to right, var(--fade-gradient-composed)),
40
+ linear-gradient(to left, var(--fade-gradient-composed));
41
+ }
42
+
43
+ &.is-minimal-variant {
44
+ gap: 1rem;
45
+ }
46
+ }
47
+
48
+ &[data-orientation="vertical"] {
49
+ flex-direction: column;
50
+ }
51
+ }
52
+
53
+ .indicator {
54
+ @media not ( prefers-reduced-motion ) {
55
+ transition-property:
56
+ translate,
57
+ width,
58
+ height,
59
+ border-radius,
60
+ border-block;
61
+ transition-duration: 0.2s;
62
+ transition-timing-function: ease-out;
63
+ }
64
+
65
+ position: absolute;
66
+ pointer-events: none;
67
+
68
+ /* Windows high contrast mode. */
69
+ outline: 2px solid transparent;
70
+ outline-offset: -1px;
71
+
72
+ &[data-orientation="horizontal"] {
73
+ z-index: 1;
74
+ /* stylelint-disable-next-line plugin/use-logical-properties-and-values -- Physical properties are necessary for the indicator to work as expected. */
75
+ left: 0;
76
+ bottom: 0;
77
+ height: var(--wpds-border-width-focus);
78
+
79
+ width: var(--active-tab-width);
80
+ translate: var(--active-tab-left) 0;
81
+ background-color: var(--wpds-color-stroke-interactive-neutral-strong);
82
+ }
83
+
84
+ &[data-orientation="vertical"] {
85
+ z-index: 0;
86
+ border-radius: var(--wpds-border-radius-sm);
87
+ top: 0;
88
+ /* stylelint-disable-next-line plugin/use-logical-properties-and-values -- Physical properties are necessary for the indicator to work as expected. */
89
+ left: 50%;
90
+ width: 100%;
91
+ height: var(--active-tab-height);
92
+ translate: -50% var(--active-tab-top);
93
+ background-color: var(--wpds-color-bg-interactive-neutral-weak-active);
94
+ }
95
+
96
+ .tablist[data-select-on-move="true"]:has(:focus-visible)
97
+ &[data-orientation="vertical"] {
98
+ box-sizing: border-box;
99
+ border:
100
+ var(--wpds-border-width-focus) solid
101
+ var(--wpds-color-stroke-focus-brand);
102
+ }
103
+ }
104
+
105
+ .tab {
106
+ /* Resets */
107
+ border-radius: 0;
108
+ background: transparent;
109
+ border: none;
110
+ box-shadow: none;
111
+ outline: none; /* Focus ring applied to the ::after pseudo-element */
112
+ padding: 0;
113
+
114
+ /* Positioning */
115
+ z-index: 1;
116
+ flex: 1 0 auto;
117
+ position: relative;
118
+ display: flex;
119
+ align-items: center;
120
+
121
+ /* Appearance */
122
+ cursor: pointer;
123
+
124
+ /* Typography */
125
+ font-family: var(--wpds-font-family-body);
126
+ font-size: var(--wpds-font-size-md);
127
+ white-space: nowrap;
128
+
129
+ /* Characters in some languages (e.g. Japanese) may have a native higher line-height. */
130
+
131
+ line-height: 1.2;
132
+ font-weight: 400;
133
+ color: var(--wpds-color-fg-interactive-neutral);
134
+
135
+ &[data-disabled] {
136
+ cursor: default;
137
+ color: var(--wpds-color-fg-interactive-neutral-disabled);
138
+
139
+ @media ( forced-colors: active ) {
140
+ color: GrayText;
141
+ }
142
+ }
143
+
144
+ &:not([data-disabled]):is(:hover, :focus-visible) {
145
+ color: var(--wpds-color-fg-interactive-neutral-active);
146
+ }
147
+
148
+ /* Focus indicator. */
149
+ &::after {
150
+ position: absolute;
151
+ z-index: -1;
152
+ pointer-events: none;
153
+
154
+ /* Outline works for Windows high contrast mode as well. */
155
+ outline:
156
+ var(--wpds-border-width-focus) solid
157
+ var(--wpds-color-stroke-focus-brand);
158
+ border-radius: var(--wpds-border-radius-sm);
159
+
160
+ /* Animation */
161
+ opacity: 0;
162
+
163
+ @media not ( prefers-reduced-motion ) {
164
+ transition: opacity 0.1s linear;
165
+ }
166
+ }
167
+
168
+ &:focus-visible::after {
169
+ opacity: 1;
170
+ }
171
+
172
+ [data-orientation="horizontal"] & {
173
+ padding-inline: var(--wpds-dimension-padding-lg);
174
+ height: 48px; /* TODO: use semantic size/height tokens when available */
175
+ scroll-margin: 24px;
176
+
177
+ &::after {
178
+ content: "";
179
+ inset: var(--wpds-dimension-padding-md);
180
+ }
181
+ }
182
+
183
+ .is-minimal-variant[data-orientation="horizontal"] & {
184
+ padding-inline: 0;
185
+
186
+ &::after {
187
+ /*
188
+ * Prevent clipping the focus ring at the tablist edge.
189
+ * Use rounding, as the focus ring width may have sub-pixel values
190
+ * depending on the screen pixel ratio.
191
+ */
192
+ inset-inline: round(up, var(--wpds-border-width-focus), 1px);
193
+ }
194
+ }
195
+
196
+ [data-orientation="vertical"] & {
197
+ padding: var(--wpds-dimension-padding-sm) var(--wpds-dimension-padding-md);
198
+ min-height: 40px; /* TODO: use semantic size/height tokens when available */
199
+ }
200
+
201
+ [data-orientation="vertical"][data-select-on-move="false"] &::after {
202
+ content: "";
203
+ inset: var(--wpds-border-width-focus); /* TODO: Use or create new control/interactive padding token */
204
+ }
205
+ }
206
+
207
+ .tab-children {
208
+ flex-grow: 1;
209
+
210
+ display: flex;
211
+ align-items: center;
212
+
213
+ [data-orientation="horizontal"] & {
214
+ justify-content: center;
215
+ }
216
+
217
+ [data-orientation="vertical"] & {
218
+ justify-content: start;
219
+ }
220
+ }
221
+
222
+ .tab-chevron {
223
+ flex-shrink: 0;
224
+ margin-inline-end: calc(var(--wpds-dimension-gap-xs) * -1);
225
+
226
+ [data-orientation="horizontal"] & {
227
+ display: none;
228
+ }
229
+ opacity: 0;
230
+
231
+ [role="tab"]:is([aria-selected="true"], :focus-visible, :hover) & {
232
+ opacity: 1;
233
+ }
234
+
235
+ /*
236
+ * The chevron is transitioned into existence when selectOnMove is enabled,
237
+ * because otherwise it looks jarring, as it shows up outside of the focus
238
+ * indicator that's being animated at the same time.
239
+ */
240
+ @media not ( prefers-reduced-motion ) {
241
+ [data-select-on-move="true"]
242
+ [role="tab"]:is([aria-selected="true"])
243
+ & {
244
+ transition: opacity 0.15s 0.15s linear;
245
+ }
246
+ }
247
+
248
+ &:dir(rtl) {
249
+ rotate: 180deg;
250
+ }
251
+ }
252
+
253
+ .tabpanel {
254
+ &:focus {
255
+ box-shadow: none;
256
+ outline: none;
257
+ }
258
+
259
+ &:focus-visible {
260
+ box-shadow:
261
+ 0 0 0 var(--wpds-border-width-focus)
262
+ var(--wpds-color-stroke-focus-brand);
263
+
264
+ /* Windows high contrast mode. */
265
+ outline: 2px solid transparent;
266
+ outline-offset: 0;
267
+ }
268
+ }
269
+ }
@@ -0,0 +1,29 @@
1
+ import { forwardRef } from '@wordpress/element';
2
+ import clsx from 'clsx';
3
+ import { Tabs as _Tabs } from '@base-ui/react/tabs';
4
+ import { chevronRight } from '@wordpress/icons';
5
+ import { Icon } from '../icon';
6
+ import styles from './style.module.css';
7
+ import type { TabProps } from './types';
8
+
9
+ /**
10
+ * An individual interactive tab button that toggles the corresponding panel.
11
+ *
12
+ * `Tabs` is a collection of React components that combine to render
13
+ * an [ARIA-compliant tabs pattern](https://www.w3.org/WAI/ARIA/apg/patterns/tabs/).
14
+ */
15
+ export const Tab = forwardRef< HTMLButtonElement, TabProps >( function Tab(
16
+ { className, children, ...otherProps },
17
+ forwardedRef
18
+ ) {
19
+ return (
20
+ <_Tabs.Tab
21
+ ref={ forwardedRef }
22
+ className={ clsx( styles.tab, className ) }
23
+ { ...otherProps }
24
+ >
25
+ <span className={ styles[ 'tab-children' ] }>{ children }</span>
26
+ <Icon icon={ chevronRight } className={ styles[ 'tab-chevron' ] } />
27
+ </_Tabs.Tab>
28
+ );
29
+ } );