@wordpress/ui 0.5.1-next.v.0 → 0.6.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 (257) hide show
  1. package/CHANGELOG.md +5 -1
  2. package/build/box/box.cjs +2 -2
  3. package/build/box/box.cjs.map +2 -2
  4. package/build/button/button.cjs +18 -303
  5. package/build/button/button.cjs.map +3 -3
  6. package/build/form/primitives/constants.cjs +35 -0
  7. package/build/form/primitives/constants.cjs.map +7 -0
  8. package/build/form/primitives/field/description.cjs +6 -33
  9. package/build/form/primitives/field/description.cjs.map +2 -2
  10. package/build/form/primitives/field/details.cjs +6 -33
  11. package/build/form/primitives/field/details.cjs.map +2 -2
  12. package/build/form/primitives/field/label.cjs +6 -33
  13. package/build/form/primitives/field/label.cjs.map +2 -2
  14. package/build/form/primitives/field/root.cjs +6 -17
  15. package/build/form/primitives/field/root.cjs.map +2 -2
  16. package/build/form/primitives/fieldset/description.cjs +6 -33
  17. package/build/form/primitives/fieldset/description.cjs.map +2 -2
  18. package/build/form/primitives/fieldset/details.cjs +6 -33
  19. package/build/form/primitives/fieldset/details.cjs.map +2 -2
  20. package/build/form/primitives/fieldset/legend.cjs +6 -33
  21. package/build/form/primitives/fieldset/legend.cjs.map +2 -2
  22. package/build/form/primitives/fieldset/root.cjs +6 -16
  23. package/build/form/primitives/fieldset/root.cjs.map +2 -2
  24. package/build/form/primitives/index.cjs +8 -2
  25. package/build/form/primitives/index.cjs.map +2 -2
  26. package/build/form/primitives/input/index.cjs +31 -0
  27. package/build/form/primitives/input/index.cjs.map +7 -0
  28. package/build/form/primitives/input/input.cjs +82 -0
  29. package/build/form/primitives/input/input.cjs.map +7 -0
  30. package/build/form/primitives/input/types.cjs +19 -0
  31. package/build/form/primitives/input/types.cjs.map +7 -0
  32. package/build/form/primitives/input-layout/input-layout.cjs +12 -111
  33. package/build/form/primitives/input-layout/input-layout.cjs.map +3 -3
  34. package/build/form/primitives/input-layout/slot.cjs +6 -94
  35. package/build/form/primitives/input-layout/slot.cjs.map +2 -2
  36. package/build/form/primitives/select/index.cjs +40 -0
  37. package/build/form/primitives/select/index.cjs.map +7 -0
  38. package/build/form/primitives/select/item.cjs +98 -0
  39. package/build/form/primitives/select/item.cjs.map +7 -0
  40. package/build/form/primitives/select/popup.cjs +109 -0
  41. package/build/form/primitives/select/popup.cjs.map +7 -0
  42. package/build/form/primitives/select/root.cjs +35 -0
  43. package/build/form/primitives/select/root.cjs.map +7 -0
  44. package/build/form/primitives/select/trigger.cjs +116 -0
  45. package/build/form/primitives/select/trigger.cjs.map +7 -0
  46. package/build/form/primitives/select/types.cjs +19 -0
  47. package/build/form/primitives/select/types.cjs.map +7 -0
  48. package/build/index.cjs +19 -0
  49. package/build/index.cjs.map +2 -2
  50. package/build/lock-unlock.cjs +37 -0
  51. package/build/lock-unlock.cjs.map +7 -0
  52. package/build/stack/stack.cjs +6 -11
  53. package/build/stack/stack.cjs.map +2 -2
  54. package/build/tooltip/index.cjs +40 -0
  55. package/build/tooltip/index.cjs.map +7 -0
  56. package/build/tooltip/popup.cjs +100 -0
  57. package/build/tooltip/popup.cjs.map +7 -0
  58. package/build/tooltip/provider.cjs +35 -0
  59. package/build/tooltip/provider.cjs.map +7 -0
  60. package/build/tooltip/root.cjs +35 -0
  61. package/build/tooltip/root.cjs.map +7 -0
  62. package/build/tooltip/trigger.cjs +38 -0
  63. package/build/tooltip/trigger.cjs.map +7 -0
  64. package/build/tooltip/types.cjs +19 -0
  65. package/build/tooltip/types.cjs.map +7 -0
  66. package/build/utils/types.cjs.map +1 -1
  67. package/build/visually-hidden/visually-hidden.cjs +6 -19
  68. package/build/visually-hidden/visually-hidden.cjs.map +2 -2
  69. package/build-module/box/box.mjs +2 -2
  70. package/build-module/box/box.mjs.map +2 -2
  71. package/build-module/button/button.mjs +18 -303
  72. package/build-module/button/button.mjs.map +3 -3
  73. package/build-module/form/primitives/constants.mjs +10 -0
  74. package/build-module/form/primitives/constants.mjs.map +7 -0
  75. package/build-module/form/primitives/field/description.mjs +6 -33
  76. package/build-module/form/primitives/field/description.mjs.map +2 -2
  77. package/build-module/form/primitives/field/details.mjs +6 -33
  78. package/build-module/form/primitives/field/details.mjs.map +2 -2
  79. package/build-module/form/primitives/field/label.mjs +6 -33
  80. package/build-module/form/primitives/field/label.mjs.map +2 -2
  81. package/build-module/form/primitives/field/root.mjs +6 -17
  82. package/build-module/form/primitives/field/root.mjs.map +2 -2
  83. package/build-module/form/primitives/fieldset/description.mjs +6 -33
  84. package/build-module/form/primitives/fieldset/description.mjs.map +2 -2
  85. package/build-module/form/primitives/fieldset/details.mjs +6 -33
  86. package/build-module/form/primitives/fieldset/details.mjs.map +2 -2
  87. package/build-module/form/primitives/fieldset/legend.mjs +6 -33
  88. package/build-module/form/primitives/fieldset/legend.mjs.map +2 -2
  89. package/build-module/form/primitives/fieldset/root.mjs +6 -16
  90. package/build-module/form/primitives/fieldset/root.mjs.map +2 -2
  91. package/build-module/form/primitives/index.mjs +5 -1
  92. package/build-module/form/primitives/index.mjs.map +2 -2
  93. package/build-module/form/primitives/input/index.mjs +6 -0
  94. package/build-module/form/primitives/input/index.mjs.map +7 -0
  95. package/build-module/form/primitives/input/input.mjs +47 -0
  96. package/build-module/form/primitives/input/input.mjs.map +7 -0
  97. package/build-module/form/primitives/input/types.mjs +1 -0
  98. package/build-module/form/primitives/input/types.mjs.map +7 -0
  99. package/build-module/form/primitives/input-layout/input-layout.mjs +12 -111
  100. package/build-module/form/primitives/input-layout/input-layout.mjs.map +3 -3
  101. package/build-module/form/primitives/input-layout/slot.mjs +6 -94
  102. package/build-module/form/primitives/input-layout/slot.mjs.map +2 -2
  103. package/build-module/form/primitives/select/index.mjs +12 -0
  104. package/build-module/form/primitives/select/index.mjs.map +7 -0
  105. package/build-module/form/primitives/select/item.mjs +63 -0
  106. package/build-module/form/primitives/select/item.mjs.map +7 -0
  107. package/build-module/form/primitives/select/popup.mjs +76 -0
  108. package/build-module/form/primitives/select/popup.mjs.map +7 -0
  109. package/build-module/form/primitives/select/root.mjs +10 -0
  110. package/build-module/form/primitives/select/root.mjs.map +7 -0
  111. package/build-module/form/primitives/select/trigger.mjs +81 -0
  112. package/build-module/form/primitives/select/trigger.mjs.map +7 -0
  113. package/build-module/form/primitives/select/types.mjs +1 -0
  114. package/build-module/form/primitives/select/types.mjs.map +7 -0
  115. package/build-module/index.mjs +4 -0
  116. package/build-module/index.mjs.map +2 -2
  117. package/build-module/lock-unlock.mjs +11 -0
  118. package/build-module/lock-unlock.mjs.map +7 -0
  119. package/build-module/stack/stack.mjs +6 -11
  120. package/build-module/stack/stack.mjs.map +2 -2
  121. package/build-module/tooltip/index.mjs +12 -0
  122. package/build-module/tooltip/index.mjs.map +7 -0
  123. package/build-module/tooltip/popup.mjs +67 -0
  124. package/build-module/tooltip/popup.mjs.map +7 -0
  125. package/build-module/tooltip/provider.mjs +10 -0
  126. package/build-module/tooltip/provider.mjs.map +7 -0
  127. package/build-module/tooltip/root.mjs +10 -0
  128. package/build-module/tooltip/root.mjs.map +7 -0
  129. package/build-module/tooltip/trigger.mjs +13 -0
  130. package/build-module/tooltip/trigger.mjs.map +7 -0
  131. package/build-module/tooltip/types.mjs +1 -0
  132. package/build-module/tooltip/types.mjs.map +7 -0
  133. package/build-module/visually-hidden/visually-hidden.mjs +6 -19
  134. package/build-module/visually-hidden/visually-hidden.mjs.map +2 -2
  135. package/build-types/badge/stories/choosing-intent.story.d.ts +17 -0
  136. package/build-types/badge/stories/choosing-intent.story.d.ts.map +1 -0
  137. package/build-types/badge/stories/index.story.d.ts +1 -1
  138. package/build-types/badge/stories/index.story.d.ts.map +1 -1
  139. package/build-types/box/stories/index.story.d.ts +1 -1
  140. package/build-types/box/stories/index.story.d.ts.map +1 -1
  141. package/build-types/button/stories/index.story.d.ts +1 -1
  142. package/build-types/button/stories/index.story.d.ts.map +1 -1
  143. package/build-types/form/primitives/constants.d.ts +9 -0
  144. package/build-types/form/primitives/constants.d.ts.map +1 -0
  145. package/build-types/form/primitives/field/stories/index.story.d.ts +1 -1
  146. package/build-types/form/primitives/field/stories/index.story.d.ts.map +1 -1
  147. package/build-types/form/primitives/fieldset/stories/index.story.d.ts +1 -1
  148. package/build-types/form/primitives/fieldset/stories/index.story.d.ts.map +1 -1
  149. package/build-types/form/primitives/index.d.ts +2 -0
  150. package/build-types/form/primitives/index.d.ts.map +1 -1
  151. package/build-types/form/primitives/input/index.d.ts +2 -0
  152. package/build-types/form/primitives/input/index.d.ts.map +1 -0
  153. package/build-types/form/primitives/input/input.d.ts +10 -0
  154. package/build-types/form/primitives/input/input.d.ts.map +1 -0
  155. package/build-types/form/primitives/input/stories/index.story.d.ts +13 -0
  156. package/build-types/form/primitives/input/stories/index.story.d.ts.map +1 -0
  157. package/build-types/form/primitives/input/test/index.test.d.ts +2 -0
  158. package/build-types/form/primitives/input/test/index.test.d.ts.map +1 -0
  159. package/build-types/form/primitives/input/types.d.ts +27 -0
  160. package/build-types/form/primitives/input/types.d.ts.map +1 -0
  161. package/build-types/form/primitives/input-layout/stories/index.story.d.ts +1 -1
  162. package/build-types/form/primitives/input-layout/stories/index.story.d.ts.map +1 -1
  163. package/build-types/form/primitives/select/index.d.ts +5 -0
  164. package/build-types/form/primitives/select/index.d.ts.map +1 -0
  165. package/build-types/form/primitives/select/item.d.ts +7 -0
  166. package/build-types/form/primitives/select/item.d.ts.map +1 -0
  167. package/build-types/form/primitives/select/popup.d.ts +2 -0
  168. package/build-types/form/primitives/select/popup.d.ts.map +1 -0
  169. package/build-types/form/primitives/select/root.d.ts +3 -0
  170. package/build-types/form/primitives/select/root.d.ts.map +1 -0
  171. package/build-types/form/primitives/select/stories/index.story.d.ts +50 -0
  172. package/build-types/form/primitives/select/stories/index.story.d.ts.map +1 -0
  173. package/build-types/form/primitives/select/test/index.test.d.ts +2 -0
  174. package/build-types/form/primitives/select/test/index.test.d.ts.map +1 -0
  175. package/build-types/form/primitives/select/trigger.d.ts +7 -0
  176. package/build-types/form/primitives/select/trigger.d.ts.map +1 -0
  177. package/build-types/form/primitives/select/types.d.ts +42 -0
  178. package/build-types/form/primitives/select/types.d.ts.map +1 -0
  179. package/build-types/icon/stories/index.story.d.ts +1 -1
  180. package/build-types/icon/stories/index.story.d.ts.map +1 -1
  181. package/build-types/index.d.ts +1 -0
  182. package/build-types/index.d.ts.map +1 -1
  183. package/build-types/lock-unlock.d.ts +2 -0
  184. package/build-types/lock-unlock.d.ts.map +1 -0
  185. package/build-types/stack/stories/index.story.d.ts +1 -1
  186. package/build-types/stack/stories/index.story.d.ts.map +1 -1
  187. package/build-types/tooltip/index.d.ts +6 -0
  188. package/build-types/tooltip/index.d.ts.map +1 -0
  189. package/build-types/tooltip/popup.d.ts +4 -0
  190. package/build-types/tooltip/popup.d.ts.map +1 -0
  191. package/build-types/tooltip/provider.d.ts +4 -0
  192. package/build-types/tooltip/provider.d.ts.map +1 -0
  193. package/build-types/tooltip/root.d.ts +4 -0
  194. package/build-types/tooltip/root.d.ts.map +1 -0
  195. package/build-types/tooltip/stories/index.story.d.ts +23 -0
  196. package/build-types/tooltip/stories/index.story.d.ts.map +1 -0
  197. package/build-types/tooltip/test/index.test.d.ts +2 -0
  198. package/build-types/tooltip/test/index.test.d.ts.map +1 -0
  199. package/build-types/tooltip/trigger.d.ts +4 -0
  200. package/build-types/tooltip/trigger.d.ts.map +1 -0
  201. package/build-types/tooltip/types.d.ts +18 -0
  202. package/build-types/tooltip/types.d.ts.map +1 -0
  203. package/build-types/utils/types.d.ts +0 -3
  204. package/build-types/utils/types.d.ts.map +1 -1
  205. package/build-types/visually-hidden/stories/index.story.d.ts +1 -1
  206. package/build-types/visually-hidden/stories/index.story.d.ts.map +1 -1
  207. package/package.json +12 -10
  208. package/src/badge/stories/choosing-intent.mdx +29 -32
  209. package/src/badge/stories/choosing-intent.story.tsx +129 -0
  210. package/src/badge/stories/index.story.tsx +1 -1
  211. package/src/box/box.tsx +2 -2
  212. package/src/box/stories/index.story.tsx +1 -1
  213. package/src/box/test/box.test.tsx +0 -11
  214. package/src/button/stories/index.story.tsx +1 -6
  215. package/src/button/style.module.css +2 -2
  216. package/src/button/test/button.test.tsx +1 -16
  217. package/src/form/primitives/constants.ts +10 -0
  218. package/src/form/primitives/field/stories/index.story.tsx +1 -1
  219. package/src/form/primitives/fieldset/stories/index.story.tsx +1 -1
  220. package/src/form/primitives/index.ts +2 -0
  221. package/src/form/primitives/input/index.ts +1 -0
  222. package/src/form/primitives/input/input.tsx +28 -0
  223. package/src/form/primitives/input/stories/index.story.tsx +40 -0
  224. package/src/form/primitives/input/style.module.css +34 -0
  225. package/src/form/primitives/input/test/index.test.tsx +13 -0
  226. package/src/form/primitives/input/types.ts +31 -0
  227. package/src/form/primitives/input-layout/stories/index.story.tsx +1 -1
  228. package/src/form/primitives/input-layout/style.module.css +5 -4
  229. package/src/form/primitives/select/index.ts +4 -0
  230. package/src/form/primitives/select/item.tsx +39 -0
  231. package/src/form/primitives/select/popup.tsx +55 -0
  232. package/src/form/primitives/select/root.tsx +6 -0
  233. package/src/form/primitives/select/stories/index.story.tsx +276 -0
  234. package/src/form/primitives/select/style.module.css +7 -0
  235. package/src/form/primitives/select/test/index.test.tsx +35 -0
  236. package/src/form/primitives/select/trigger.tsx +58 -0
  237. package/src/form/primitives/select/types.ts +52 -0
  238. package/src/icon/stories/index.story.tsx +1 -1
  239. package/src/index.ts +1 -0
  240. package/src/lock-unlock.ts +7 -0
  241. package/src/stack/stories/index.story.tsx +1 -1
  242. package/src/stories/introduction.mdx +1 -1
  243. package/src/tooltip/index.ts +6 -0
  244. package/src/tooltip/popup.tsx +64 -0
  245. package/src/tooltip/provider.tsx +8 -0
  246. package/src/tooltip/root.tsx +8 -0
  247. package/src/tooltip/stories/index.story.tsx +97 -0
  248. package/src/tooltip/style.module.css +20 -0
  249. package/src/tooltip/test/index.test.tsx +87 -0
  250. package/src/tooltip/trigger.tsx +15 -0
  251. package/src/tooltip/types.ts +26 -0
  252. package/src/utils/css/dropdown-motion.module.css +47 -0
  253. package/src/utils/css/focus.module.css +1 -1
  254. package/src/utils/css/item-popup.module.css +127 -0
  255. package/src/utils/css/select-trigger.module.css +58 -0
  256. package/src/utils/types.ts +0 -3
  257. package/src/visually-hidden/stories/index.story.tsx +1 -1
@@ -0,0 +1,87 @@
1
+ import { render, screen, waitFor } from '@testing-library/react';
2
+ import userEvent from '@testing-library/user-event';
3
+ import { createRef } from '@wordpress/element';
4
+ import * as Tooltip from '../index';
5
+ import type { ProviderProps } from '../types';
6
+
7
+ // Test wrapper that sets delay={0} to avoid real-time delays in tests.
8
+ function TestProvider( { children, ...props }: ProviderProps ) {
9
+ return (
10
+ <Tooltip.Provider delay={ 0 } { ...props }>
11
+ { children }
12
+ </Tooltip.Provider>
13
+ );
14
+ }
15
+
16
+ describe( 'Tooltip', () => {
17
+ it( 'forwards ref', async () => {
18
+ const user = userEvent.setup();
19
+ const triggerRef = createRef< HTMLButtonElement >();
20
+ const popupRef = createRef< HTMLDivElement >();
21
+
22
+ render(
23
+ <TestProvider>
24
+ <Tooltip.Root>
25
+ <Tooltip.Trigger ref={ triggerRef }>
26
+ <span>Hover me</span>
27
+ </Tooltip.Trigger>
28
+ <Tooltip.Popup ref={ popupRef }>Tooltip text</Tooltip.Popup>
29
+ </Tooltip.Root>
30
+ </TestProvider>
31
+ );
32
+
33
+ // Test trigger ref before interaction
34
+ expect( triggerRef.current ).toBeInstanceOf( HTMLButtonElement );
35
+
36
+ // Hover over the trigger to open the tooltip
37
+ await user.hover( triggerRef.current! );
38
+
39
+ // Wait for the tooltip popup to appear
40
+ await waitFor( () => {
41
+ expect( popupRef.current ).toBeInstanceOf( HTMLDivElement );
42
+ } );
43
+ } );
44
+
45
+ it( 'shows tooltip on hover', async () => {
46
+ const user = userEvent.setup();
47
+
48
+ render(
49
+ <TestProvider>
50
+ <Tooltip.Root>
51
+ <Tooltip.Trigger>Hover me</Tooltip.Trigger>
52
+ <Tooltip.Popup>Tooltip content</Tooltip.Popup>
53
+ </Tooltip.Root>
54
+ </TestProvider>
55
+ );
56
+
57
+ const trigger = screen.getByRole( 'button', { name: 'Hover me' } );
58
+ await user.hover( trigger );
59
+
60
+ // waitFor is used intentionally: even with delay={0}, the popup appearing
61
+ // is conceptually async (state change → render → portal mount). This also
62
+ // makes the test resilient to future internal changes in base-ui.
63
+ await waitFor( () => {
64
+ expect( screen.getByText( 'Tooltip content' ) ).toBeVisible();
65
+ } );
66
+ } );
67
+
68
+ it( 'does not show tooltip when disabled', async () => {
69
+ const user = userEvent.setup();
70
+
71
+ render(
72
+ <TestProvider>
73
+ <Tooltip.Root disabled>
74
+ <Tooltip.Trigger>Hover me</Tooltip.Trigger>
75
+ <Tooltip.Popup>Tooltip content</Tooltip.Popup>
76
+ </Tooltip.Root>
77
+ </TestProvider>
78
+ );
79
+
80
+ const trigger = screen.getByRole( 'button', { name: 'Hover me' } );
81
+ await user.hover( trigger );
82
+
83
+ expect(
84
+ screen.queryByText( 'Tooltip content' )
85
+ ).not.toBeInTheDocument();
86
+ } );
87
+ } );
@@ -0,0 +1,15 @@
1
+ import { Tooltip } from '@base-ui/react/tooltip';
2
+ import { forwardRef } from '@wordpress/element';
3
+ import type { TriggerProps } from './types';
4
+
5
+ const Trigger = forwardRef< HTMLButtonElement, TriggerProps >(
6
+ function TooltipTrigger( { children, ...props }, ref ) {
7
+ return (
8
+ <Tooltip.Trigger ref={ ref } { ...props }>
9
+ { children }
10
+ </Tooltip.Trigger>
11
+ );
12
+ }
13
+ );
14
+
15
+ export { Trigger };
@@ -0,0 +1,26 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { Tooltip } from '@base-ui/react/tooltip';
3
+ import type { ComponentProps } from '../utils/types';
4
+
5
+ export type RootProps = Pick< Tooltip.Root.Props, 'disabled' | 'children' >;
6
+
7
+ export type ProviderProps = Pick<
8
+ Tooltip.Provider.Props,
9
+ 'delay' | 'children'
10
+ >;
11
+
12
+ export interface TriggerProps extends ComponentProps< 'button' > {
13
+ /**
14
+ * The content to be rendered inside the component.
15
+ */
16
+ children?: ReactNode;
17
+ }
18
+
19
+ export interface PopupProps
20
+ extends ComponentProps< 'div' >,
21
+ Pick< Tooltip.Positioner.Props, 'align' | 'side' | 'sideOffset' > {
22
+ /**
23
+ * The content to be rendered inside the component.
24
+ */
25
+ children?: ReactNode;
26
+ }
@@ -0,0 +1,47 @@
1
+ /*
2
+ * Motion configuration for dropdown-like popovers.
3
+ * Keep constants in sync with: packages/components/src/utils/dropdown-motion.ts
4
+ */
5
+
6
+ @layer wp-ui-utilities, wp-ui-components, wp-ui-compositions, wp-ui-overrides;
7
+
8
+ @layer wp-ui-utilities {
9
+ .dropdown-motion {
10
+ --wp-ui-dropdown-slide-distance: 4px;
11
+ --wp-ui-dropdown-slide-duration: 200ms;
12
+ --wp-ui-dropdown-slide-easing: cubic-bezier(0, 0, 0, 1);
13
+ --wp-ui-dropdown-fade-duration: 80ms;
14
+ --wp-ui-dropdown-fade-easing: linear;
15
+
16
+ @media not ( prefers-reduced-motion ) {
17
+ transition-property: transform, opacity;
18
+ transition-duration:
19
+ var(--wp-ui-dropdown-slide-duration),
20
+ var(--wp-ui-dropdown-fade-duration);
21
+ transition-timing-function:
22
+ var(--wp-ui-dropdown-slide-easing),
23
+ var(--wp-ui-dropdown-fade-easing);
24
+ will-change: transform, opacity;
25
+ }
26
+
27
+ opacity: 0;
28
+
29
+ &[data-side="bottom"] {
30
+ transform: translateY(calc(-1 * var(--wp-ui-dropdown-slide-distance)));
31
+ }
32
+ &[data-side="top"] {
33
+ transform: translateY(var(--wp-ui-dropdown-slide-distance));
34
+ }
35
+ &[data-side="left"] {
36
+ transform: translateX(var(--wp-ui-dropdown-slide-distance));
37
+ }
38
+ &[data-side="right"] {
39
+ transform: translateX(calc(-1 * var(--wp-ui-dropdown-slide-distance)));
40
+ }
41
+
42
+ &[data-open]:not([data-starting-style]) {
43
+ opacity: 1;
44
+ transform: translate(0);
45
+ }
46
+ }
47
+ }
@@ -25,7 +25,7 @@
25
25
  .outset-ring--focus-within:focus-within,
26
26
  .outset-ring--focus-within-except-active:focus-within:not(:has(:active)),
27
27
  .outset-ring--focus-within-visible:focus-within:has(:focus-visible) {
28
- outline-width: var(--wpds-border-width-interactive-focus);
28
+ outline-width: var(--wpds-border-width-focus);
29
29
  outline-color: var(--wpds-color-stroke-focus-brand);
30
30
  }
31
31
  }
@@ -0,0 +1,127 @@
1
+ @layer wp-ui-utilities, wp-ui-components, wp-ui-compositions, wp-ui-overrides;
2
+
3
+ @layer wp-ui-utilities {
4
+ .popup {
5
+ composes: dropdown-motion from "./dropdown-motion.module.css";
6
+
7
+ --wp-ui-popup-padding: 4px;
8
+
9
+ display: grid;
10
+ grid-template-rows: auto minmax(0, 1fr);
11
+ grid-template-areas: "header" "main";
12
+ max-height: min(var(--available-height), 480px, 60dvh);
13
+ min-width: var(--anchor-width);
14
+ max-width: var(--available-width);
15
+ border-radius: var(--wpds-border-radius-md);
16
+ border: 1px solid var(--wpds-color-stroke-surface-neutral);
17
+ box-shadow: var(--wpds-elevation-medium);
18
+ background-color: var(--wpds-color-bg-surface-neutral-strong);
19
+ font-family: var(--wpds-font-family-body);
20
+ font-size: var(--wpds-font-size-md);
21
+ line-height: 1.4;
22
+ color: var(--wpds-color-fg-interactive-neutral);
23
+ }
24
+
25
+ .list {
26
+ display: grid;
27
+ grid-area: main;
28
+ grid-template-rows: minmax(0, 1fr) auto;
29
+ grid-template-areas: "scrollable" "footer";
30
+ }
31
+
32
+ .list-scrollable-container {
33
+ overflow-block: auto;
34
+ overscroll-behavior: contain;
35
+ grid-area: scrollable;
36
+ scroll-padding-block: var(--wp-ui-popup-padding);
37
+
38
+ &:not(:empty) {
39
+ padding-block: var(--wp-ui-popup-padding);
40
+ }
41
+ }
42
+
43
+ .list-footer {
44
+ grid-area: footer;
45
+ padding-block: var(--wp-ui-popup-padding);
46
+
47
+ .list-scrollable-container:not(:empty) + & {
48
+ border-block-start: 1px solid var(--wpds-color-stroke-surface-neutral);
49
+ }
50
+ }
51
+
52
+ /* TODO: Use padding token */
53
+ .item {
54
+ --wp-ui-popup-item-height: 40px;
55
+ --wp-ui-popup-item-padding-inline: 12px;
56
+ --wp-ui-popup-item-padding-block: 4px;
57
+
58
+ display: grid;
59
+ grid-template-columns: 24px 1fr;
60
+ align-items: center;
61
+ justify-content: flex-start;
62
+ gap: var(--wpds-dimension-gap-2xs);
63
+ min-height: var(--wp-ui-popup-item-height);
64
+ border-radius: var(--wpds-border-radius-sm);
65
+ user-select: none;
66
+ margin-inline: var(--wp-ui-popup-padding);
67
+ padding-block: var(--wp-ui-popup-item-padding-block);
68
+
69
+ /* Optically adjust the prefix icon to a more balanced position. */
70
+ padding-inline-start: calc(var(--wp-ui-popup-item-padding-inline) - 4px);
71
+ padding-inline-end: var(--wp-ui-popup-item-padding-inline);
72
+
73
+ &.is-size-compact {
74
+ --wp-ui-popup-item-height: 32px;
75
+ --wp-ui-popup-item-padding-inline: 8px;
76
+ }
77
+
78
+ &.is-size-small {
79
+ --wp-ui-popup-item-height: 24px;
80
+ --wp-ui-popup-item-padding-inline: 8px;
81
+ --wp-ui-popup-item-padding-block: 2px;
82
+ }
83
+
84
+ &:not([data-selected]) {
85
+ .item-indicator-icon {
86
+ opacity: 0;
87
+ }
88
+ }
89
+
90
+ &[data-highlighted]:not([aria-disabled="true"]) {
91
+ background-color: var(--wpds-color-bg-interactive-brand-weak-active);
92
+ color: var(--wpds-color-fg-interactive-neutral);
93
+
94
+ @media ( forced-colors: active ) {
95
+ outline: 1px solid Highlight;
96
+ }
97
+ }
98
+
99
+ &[aria-disabled="true"] {
100
+ color: var(--wpds-color-fg-interactive-neutral-disabled);
101
+
102
+ @media ( forced-colors: active ) {
103
+ color: GrayText;
104
+ }
105
+ }
106
+ }
107
+
108
+ .item-indicator {
109
+ justify-self: center;
110
+ }
111
+
112
+ .empty {
113
+ --wp-ui-popup-empty-min-height: 40px;
114
+ --wp-ui-popup-empty-padding-inline: 12px;
115
+
116
+ grid-area: main;
117
+ display: flex;
118
+ align-items: center;
119
+ padding-inline: var(--wp-ui-popup-empty-padding-inline);
120
+ color: var(--wpds-color-fg-content-neutral-weak);
121
+
122
+ &:not(:empty) {
123
+ min-height: var(--wp-ui-popup-empty-min-height);
124
+ }
125
+ }
126
+
127
+ }
@@ -0,0 +1,58 @@
1
+ @layer wp-ui-utilities, wp-ui-components, wp-ui-compositions, wp-ui-overrides;
2
+
3
+ @layer wp-ui-utilities {
4
+ .trigger-wrapper {
5
+ &.is-minimal {
6
+ width: fit-content;
7
+ }
8
+ }
9
+
10
+ .trigger {
11
+ display: flex;
12
+ justify-content: space-between;
13
+ align-items: center;
14
+ gap: var(--wpds-dimension-gap-2xs);
15
+ width: 100%;
16
+ padding-block: 4px;
17
+
18
+ /* Optically adjust the caret to a more balanced position. */
19
+ padding-inline-start: var(--wp-ui-input-layout-padding-inline);
20
+ padding-inline-end: calc(var(--wp-ui-input-layout-padding-inline) - 4px);
21
+
22
+ background-color: transparent;
23
+ border: none;
24
+ color: var(--wpds-color-fg-interactive-neutral);
25
+ font-family: inherit;
26
+ font-size: inherit;
27
+ line-height: 1.4;
28
+ text-align: start;
29
+ user-select: none;
30
+
31
+ &.is-minimal {
32
+ width: auto;
33
+ }
34
+
35
+ &:focus {
36
+ outline: none; /* handled by InputLayout component */
37
+ }
38
+
39
+ &[data-disabled] {
40
+ background-color: var(--wpds-color-bg-interactive-neutral-weak-disabled);
41
+ color: var(--wpds-color-fg-interactive-neutral-disabled);
42
+ }
43
+ }
44
+
45
+ .trigger-value {
46
+ overflow: hidden;
47
+ text-overflow: ellipsis;
48
+ white-space: nowrap;
49
+
50
+ &.is-placeholder {
51
+ color: var(--wpds-color-fg-interactive-neutral-disabled);
52
+ }
53
+ }
54
+
55
+ .trigger-caret {
56
+ flex: 0 0 auto;
57
+ }
58
+ }
@@ -1,6 +1,3 @@
1
- /**
2
- * External dependencies
3
- */
4
1
  import {
5
2
  type ElementType,
6
3
  type ComponentPropsWithoutRef,
@@ -1,4 +1,4 @@
1
- import type { Meta, StoryObj } from '@storybook/react-webpack5';
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
2
  import { VisuallyHidden } from '../';
3
3
 
4
4
  const meta: Meta< typeof VisuallyHidden > = {