@dxos/react-ui 0.8.4-main.21d9917 → 0.8.4-main.2244d791bb

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 (183) hide show
  1. package/dist/lib/browser/{chunk-CEKVHJ27.mjs → chunk-6DTBPJE4.mjs} +4 -4
  2. package/dist/lib/browser/chunk-6DTBPJE4.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +456 -309
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +5 -4
  7. package/dist/lib/browser/testing/index.mjs.map +3 -3
  8. package/dist/lib/node-esm/{chunk-2NHEX4AD.mjs → chunk-JKHQSGNU.mjs} +4 -4
  9. package/dist/lib/node-esm/chunk-JKHQSGNU.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +456 -309
  11. package/dist/lib/node-esm/index.mjs.map +4 -4
  12. package/dist/lib/node-esm/meta.json +1 -1
  13. package/dist/lib/node-esm/testing/index.mjs +5 -4
  14. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  15. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +7 -0
  16. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +1 -1
  17. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  18. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  19. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  20. package/dist/types/src/components/Dialog/AlertDialog.d.ts +4 -2
  21. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  22. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  23. package/dist/types/src/components/Dialog/Dialog.d.ts +7 -1
  24. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  25. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +1 -5
  26. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  27. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  28. package/dist/types/src/components/Input/Input.stories.d.ts +1 -1
  29. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  30. package/dist/types/src/components/List/List.d.ts.map +1 -1
  31. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  32. package/dist/types/src/components/Main/Main.d.ts +8 -9
  33. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  34. package/dist/types/src/components/Main/Main.stories.d.ts +0 -3
  35. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  36. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -1
  37. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  38. package/dist/types/src/components/Message/Message.stories.d.ts +2 -3
  39. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  40. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +23 -26
  41. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  42. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +43 -9
  43. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  44. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  45. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +6 -1
  46. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  47. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  48. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  49. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  50. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  51. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  52. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  53. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  54. package/dist/types/src/components/Splitter/Splitter.d.ts +26 -0
  55. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  56. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  57. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  58. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  59. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  60. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  61. package/dist/types/src/components/Tag/Tag.stories.d.ts +1 -5
  62. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  63. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +1 -0
  64. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  65. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  66. package/dist/types/src/components/Toolbar/Toolbar.d.ts +7 -6
  67. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  68. package/dist/types/src/components/index.d.ts +2 -0
  69. package/dist/types/src/components/index.d.ts.map +1 -1
  70. package/dist/types/src/exemplars/generics.stories.d.ts +17 -0
  71. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  72. package/dist/types/src/exemplars/slot.stories.d.ts +14 -0
  73. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  74. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  75. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  76. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  77. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  78. package/dist/types/src/index.d.ts +1 -0
  79. package/dist/types/src/index.d.ts.map +1 -1
  80. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  81. package/dist/types/src/primitives/Container/Container.d.ts +23 -0
  82. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  83. package/dist/types/src/primitives/Container/Container.stories.d.ts +11 -0
  84. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  85. package/dist/types/src/primitives/Container/Layout.d.ts +18 -0
  86. package/dist/types/src/primitives/Container/Layout.d.ts.map +1 -0
  87. package/dist/types/src/primitives/Container/Layout.stories.d.ts +10 -0
  88. package/dist/types/src/primitives/Container/Layout.stories.d.ts.map +1 -0
  89. package/dist/types/src/primitives/Container/index.d.ts +3 -0
  90. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  91. package/dist/types/src/primitives/Flex/Flex.d.ts +8 -0
  92. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  93. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  94. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  95. package/dist/types/src/primitives/index.d.ts +3 -0
  96. package/dist/types/src/primitives/index.d.ts.map +1 -0
  97. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
  98. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  99. package/dist/types/tsconfig.tsbuildinfo +1 -1
  100. package/package.json +23 -22
  101. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +10 -12
  102. package/src/components/Avatars/Avatar.stories.tsx +2 -2
  103. package/src/components/Avatars/Avatar.tsx +2 -9
  104. package/src/components/Avatars/AvatarGroup.stories.tsx +2 -2
  105. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +2 -2
  106. package/src/components/Breadcrumb/Breadcrumb.tsx +5 -31
  107. package/src/components/Button/Button.stories.tsx +3 -3
  108. package/src/components/Button/Button.tsx +1 -7
  109. package/src/components/Button/IconButton.stories.tsx +2 -2
  110. package/src/components/Button/IconButton.tsx +1 -1
  111. package/src/components/Button/Toggle.stories.tsx +2 -2
  112. package/src/components/Button/ToggleGroup.stories.tsx +2 -2
  113. package/src/components/Dialog/AlertDialog.stories.tsx +6 -7
  114. package/src/components/Dialog/AlertDialog.tsx +78 -9
  115. package/src/components/Dialog/Dialog.stories.tsx +11 -11
  116. package/src/components/Dialog/Dialog.tsx +44 -19
  117. package/src/components/Icon/Icon.stories.tsx +2 -2
  118. package/src/components/Icon/Icon.tsx +1 -1
  119. package/src/components/Input/Input.stories.tsx +11 -10
  120. package/src/components/Input/Input.tsx +10 -25
  121. package/src/components/Link/Link.stories.tsx +2 -2
  122. package/src/components/Link/Link.tsx +1 -1
  123. package/src/components/List/List.stories.tsx +2 -2
  124. package/src/components/List/List.tsx +7 -13
  125. package/src/components/List/Tree.stories.tsx +2 -2
  126. package/src/components/List/Treegrid.stories.tsx +2 -2
  127. package/src/components/List/Treegrid.tsx +4 -9
  128. package/src/components/Main/Main.stories.tsx +41 -23
  129. package/src/components/Main/Main.tsx +128 -71
  130. package/src/components/Menu/ContextMenu.stories.tsx +2 -2
  131. package/src/components/Menu/ContextMenu.tsx +7 -31
  132. package/src/components/Menu/DropdownMenu.stories.tsx +2 -2
  133. package/src/components/Menu/DropdownMenu.tsx +8 -8
  134. package/src/components/Message/Message.stories.tsx +23 -8
  135. package/src/components/Message/Message.tsx +8 -21
  136. package/src/components/Popover/Popover.stories.tsx +2 -2
  137. package/src/components/Popover/Popover.tsx +3 -3
  138. package/src/components/ScrollArea/ScrollArea.stories.tsx +152 -76
  139. package/src/components/ScrollArea/ScrollArea.tsx +68 -116
  140. package/src/components/ScrollArea/index.ts +1 -1
  141. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +24 -9
  142. package/src/components/ScrollContainer/ScrollContainer.tsx +14 -9
  143. package/src/components/Select/Select.stories.tsx +2 -2
  144. package/src/components/Select/Select.tsx +9 -25
  145. package/src/components/Separator/Separator.tsx +1 -1
  146. package/src/components/Skeleton/Skeleton.stories.tsx +52 -0
  147. package/src/components/Skeleton/Skeleton.tsx +26 -0
  148. package/src/components/Skeleton/index.ts +5 -0
  149. package/src/components/Splitter/Splitter.stories.tsx +73 -0
  150. package/src/components/Splitter/Splitter.tsx +123 -0
  151. package/src/components/Splitter/index.ts +5 -0
  152. package/src/components/Status/Status.stories.tsx +2 -2
  153. package/src/components/Status/Status.tsx +2 -2
  154. package/src/components/Tag/Tag.stories.tsx +3 -7
  155. package/src/components/Tag/Tag.tsx +1 -6
  156. package/src/components/ThemeProvider/ThemeProvider.tsx +2 -1
  157. package/src/components/Toast/Toast.stories.tsx +2 -2
  158. package/src/components/Toast/Toast.tsx +6 -10
  159. package/src/components/Toolbar/Toolbar.stories.tsx +2 -2
  160. package/src/components/Toolbar/Toolbar.tsx +13 -9
  161. package/src/components/Tooltip/Tooltip.stories.tsx +2 -2
  162. package/src/components/Tooltip/Tooltip.tsx +2 -2
  163. package/src/components/index.ts +2 -0
  164. package/src/exemplars/generics.stories.tsx +44 -0
  165. package/src/exemplars/slot.stories.tsx +108 -0
  166. package/src/exemplars/tabster.stories.tsx +127 -0
  167. package/src/exemplars/virtualizer.stories.tsx +133 -0
  168. package/src/index.ts +1 -0
  169. package/src/playground/Controls.stories.tsx +3 -4
  170. package/src/playground/Custom.stories.tsx +2 -2
  171. package/src/playground/Typography.stories.tsx +2 -2
  172. package/src/primitives/Container/Container.stories.tsx +67 -0
  173. package/src/primitives/Container/Container.tsx +79 -0
  174. package/src/primitives/Container/Layout.stories.tsx +57 -0
  175. package/src/primitives/Container/Layout.tsx +61 -0
  176. package/src/primitives/Container/index.ts +6 -0
  177. package/src/primitives/Flex/Flex.tsx +26 -0
  178. package/src/primitives/Flex/index.ts +5 -0
  179. package/src/primitives/index.ts +6 -0
  180. package/src/testing/decorators/withLayoutVariants.tsx +1 -1
  181. package/src/testing/decorators/withTheme.tsx +19 -17
  182. package/dist/lib/browser/chunk-CEKVHJ27.mjs.map +0 -7
  183. package/dist/lib/node-esm/chunk-2NHEX4AD.mjs.map +0 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/react-ui",
3
- "version": "0.8.4-main.21d9917",
3
+ "version": "0.8.4-main.2244d791bb",
4
4
  "description": "Low-level React components for DXOS, applying a theme to a core group of primitives",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -14,16 +14,16 @@
14
14
  "type": "module",
15
15
  "exports": {
16
16
  ".": {
17
- "source": "./src/index.ts",
18
- "types": "./dist/types/src/index.d.ts",
19
17
  "browser": "./dist/lib/browser/index.mjs",
20
- "node": "./dist/lib/node-esm/index.mjs"
18
+ "node": "./dist/lib/node-esm/index.mjs",
19
+ "source": "./src/index.ts",
20
+ "types": "./dist/types/src/index.d.ts"
21
21
  },
22
22
  "./testing": {
23
- "source": "./src/testing/index.ts",
24
- "types": "./dist/types/src/testing/index.d.ts",
25
23
  "browser": "./dist/lib/browser/testing/index.mjs",
26
- "node": "./dist/lib/node-esm/testing/index.mjs"
24
+ "node": "./dist/lib/node-esm/testing/index.mjs",
25
+ "source": "./src/testing/index.ts",
26
+ "types": "./dist/types/src/testing/index.d.ts"
27
27
  }
28
28
  },
29
29
  "types": "dist/types/src/index.d.ts",
@@ -40,7 +40,7 @@
40
40
  ],
41
41
  "dependencies": {
42
42
  "@atlaskit/pragmatic-drag-and-drop-hitbox": "1.1.0",
43
- "@effect-atom/atom-react": "^0.4.6",
43
+ "@effect-atom/atom-react": "^0.5.0",
44
44
  "@fluentui/react-tabster": "9.26.11",
45
45
  "@radix-ui/primitive": "1.1.1",
46
46
  "@radix-ui/react-alert-dialog": "1.1.6",
@@ -78,36 +78,37 @@
78
78
  "keyborg": "^2.5.0",
79
79
  "react-i18next": "^11.18.6",
80
80
  "react-remove-scroll": "^2.6.0",
81
- "@dxos/debug": "0.8.4-main.21d9917",
82
- "@dxos/async": "0.8.4-main.21d9917",
83
- "@dxos/invariant": "0.8.4-main.21d9917",
84
- "@dxos/react-hooks": "0.8.4-main.21d9917",
85
- "@dxos/log": "0.8.4-main.21d9917",
86
- "@dxos/lit-ui": "0.8.4-main.21d9917",
87
- "@dxos/ui-types": "0.8.4-main.21d9917",
88
- "@dxos/react-input": "0.8.4-main.21d9917",
89
- "@dxos/react-list": "0.8.4-main.21d9917",
90
- "@dxos/util": "0.8.4-main.21d9917"
81
+ "@dxos/async": "0.8.4-main.2244d791bb",
82
+ "@dxos/debug": "0.8.4-main.2244d791bb",
83
+ "@dxos/invariant": "0.8.4-main.2244d791bb",
84
+ "@dxos/lit-ui": "0.8.4-main.2244d791bb",
85
+ "@dxos/log": "0.8.4-main.2244d791bb",
86
+ "@dxos/react-hooks": "0.8.4-main.2244d791bb",
87
+ "@dxos/react-list": "0.8.4-main.2244d791bb",
88
+ "@dxos/react-input": "0.8.4-main.2244d791bb",
89
+ "@dxos/ui-types": "0.8.4-main.2244d791bb",
90
+ "@dxos/util": "0.8.4-main.2244d791bb"
91
91
  },
92
92
  "devDependencies": {
93
93
  "@dnd-kit/core": "^6.0.5",
94
94
  "@dnd-kit/sortable": "^7.0.1",
95
95
  "@dnd-kit/utilities": "^3.2.0",
96
96
  "@phosphor-icons/react": "2.1.10",
97
+ "@tanstack/react-virtual": "^3.13.18",
97
98
  "@types/react": "~19.2.7",
98
99
  "@types/react-dom": "~19.2.3",
99
100
  "react": "~19.2.3",
100
101
  "react-dom": "~19.2.3",
101
102
  "tabster": "^8.5.5",
102
103
  "vite": "7.1.9",
103
- "@dxos/random": "0.8.4-main.21d9917",
104
- "@dxos/ui-theme": "0.8.4-main.21d9917",
105
- "@dxos/util": "0.8.4-main.21d9917"
104
+ "@dxos/random": "0.8.4-main.2244d791bb",
105
+ "@dxos/ui-theme": "0.8.4-main.2244d791bb",
106
+ "@dxos/util": "0.8.4-main.2244d791bb"
106
107
  },
107
108
  "peerDependencies": {
108
109
  "react": "~19.2.3",
109
110
  "react-dom": "~19.2.3",
110
- "@dxos/ui-theme": "0.8.4-main.21d9917"
111
+ "@dxos/ui-theme": "0.8.4-main.2244d791bb"
111
112
  },
112
113
  "publishConfig": {
113
114
  "access": "public"
@@ -18,12 +18,7 @@ const AnchoredOverflowRoot = forwardRef<HTMLDivElement, AnchoredOverflowRootProp
18
18
  const { tx } = useThemeContext();
19
19
  const Root = asChild ? Slot : Primitive.div;
20
20
  return (
21
- <Root
22
- role='none'
23
- {...props}
24
- className={tx('anchoredOverflow.root', 'overflow-anchored', {}, classNames)}
25
- ref={forwardedRef}
26
- >
21
+ <Root role='none' {...props} className={tx('anchoredOverflow.root', {}, classNames)} ref={forwardedRef}>
27
22
  {children}
28
23
  </Root>
29
24
  );
@@ -39,18 +34,21 @@ const AnchoredOverflowAnchor = forwardRef<HTMLDivElement, AnchoredOverflowAnchor
39
34
  const { tx } = useThemeContext();
40
35
  const Root = asChild ? Slot : Primitive.div;
41
36
  return (
42
- <Root
43
- role='none'
44
- {...props}
45
- className={tx('anchoredOverflow.anchor', 'overflow-anchor', {}, classNames)}
46
- ref={forwardedRef}
47
- >
37
+ <Root role='none' {...props} className={tx('anchoredOverflow.anchor', {}, classNames)} ref={forwardedRef}>
48
38
  {children}
49
39
  </Root>
50
40
  );
51
41
  },
52
42
  );
53
43
 
44
+ /**
45
+ * This component leverages the CSS https://developer.mozilla.org/en-US/docs/Web/CSS/overflow-anchor property to prevent unwanted scroll jumps when content is dynamically
46
+ * added above the viewport. This is particularly useful for:
47
+ * - Chat applications where new messages are prepended to the list.
48
+ * - Notification feeds where new items appear at the top.
49
+ * - Any scenario where content is inserted at the start of a scrollable container.
50
+ */
51
+ // TODO(burdon): Move into container?
54
52
  export const AnchoredOverflow = {
55
53
  Root: AnchoredOverflowRoot,
56
54
  Anchor: AnchoredOverflowAnchor,
@@ -57,9 +57,9 @@ const DefaultStory = (props: StoryProps) => {
57
57
  };
58
58
 
59
59
  const meta = {
60
- title: 'ui/react-ui-core/Avatar',
60
+ title: 'ui/react-ui-core/components/Avatar',
61
61
  component: Avatar.Root,
62
- decorators: [withTheme],
62
+ decorators: [withTheme()],
63
63
  } satisfies Meta<typeof Avatar.Root>;
64
64
 
65
65
  export default meta;
@@ -67,14 +67,7 @@ const AvatarLabel = forwardRef<HTMLSpanElement, AvatarLabelProps>(
67
67
  const Root = asChild ? Slot : Primitive.span;
68
68
  const { tx } = useThemeContext();
69
69
  const { labelId } = useAvatarContext('AvatarLabel');
70
- return (
71
- <Root
72
- {...props}
73
- id={labelId}
74
- ref={forwardedRef}
75
- className={tx('avatar.label', 'avatar__label', { srOnly }, classNames)}
76
- />
77
- );
70
+ return <Root {...props} id={labelId} ref={forwardedRef} className={tx('avatar.label', { srOnly }, classNames)} />;
78
71
  },
79
72
  );
80
73
 
@@ -93,7 +86,7 @@ const AvatarDescription = forwardRef<HTMLSpanElement, AvatarDescriptionProps>(
93
86
  {...props}
94
87
  id={descriptionId}
95
88
  ref={forwardedRef}
96
- className={tx('avatar.description', 'avatar__description', { srOnly }, classNames)}
89
+ className={tx('avatar.description', { srOnly }, classNames)}
97
90
  />
98
91
  );
99
92
  },
@@ -38,9 +38,9 @@ const DefaultStory = () => {
38
38
  };
39
39
 
40
40
  const meta = {
41
- title: 'ui/react-ui-core/AvatarGroup',
41
+ title: 'ui/react-ui-core/components/AvatarGroup',
42
42
  render: DefaultStory,
43
- decorators: [withTheme],
43
+ decorators: [withTheme()],
44
44
  } satisfies Meta<typeof DefaultStory>;
45
45
 
46
46
  export default meta;
@@ -39,10 +39,10 @@ const DefaultStory = (props: BreadcrumbRootProps) => {
39
39
  };
40
40
 
41
41
  const meta = {
42
- title: 'ui/react-ui-core/Breadcrumb',
42
+ title: 'ui/react-ui-core/components/Breadcrumb',
43
43
  component: Breadcrumb.Root as any,
44
44
  render: DefaultStory,
45
- decorators: [withTheme],
45
+ decorators: [withTheme()],
46
46
  } satisfies Meta<typeof DefaultStory>;
47
47
 
48
48
  export default meta;
@@ -20,14 +20,7 @@ const BreadcrumbRoot = forwardRef<HTMLDivElement, BreadcrumbRootProps>(
20
20
  ({ asChild, classNames, ...props }, forwardedRef) => {
21
21
  const { tx } = useThemeContext();
22
22
  const Root = asChild ? Slot : Primitive.div;
23
- return (
24
- <Root
25
- role='navigation'
26
- {...props}
27
- className={tx('breadcrumb.root', 'breadcrumb', {}, classNames)}
28
- ref={forwardedRef}
29
- />
30
- );
23
+ return <Root role='navigation' {...props} className={tx('breadcrumb.root', {}, classNames)} ref={forwardedRef} />;
31
24
  },
32
25
  );
33
26
 
@@ -37,14 +30,7 @@ const BreadcrumbList = forwardRef<HTMLOListElement, BreadcrumbListProps>(
37
30
  ({ asChild, classNames, ...props }, forwardedRef) => {
38
31
  const { tx } = useThemeContext();
39
32
  const Root = asChild ? Slot : Primitive.ol;
40
- return (
41
- <Root
42
- role='list'
43
- {...props}
44
- className={tx('breadcrumb.list', 'breadcrumb__list', {}, classNames)}
45
- ref={forwardedRef}
46
- />
47
- );
33
+ return <Root role='list' {...props} className={tx('breadcrumb.list', {}, classNames)} ref={forwardedRef} />;
48
34
  },
49
35
  );
50
36
 
@@ -54,14 +40,7 @@ const BreadcrumbListItem = forwardRef<HTMLLIElement, BreadcrumbListItemProps>(
54
40
  ({ asChild, classNames, ...props }, forwardedRef) => {
55
41
  const { tx } = useThemeContext();
56
42
  const Root = asChild ? Slot : Primitive.li;
57
- return (
58
- <Root
59
- role='listitem'
60
- {...props}
61
- className={tx('breadcrumb.listItem', 'breadcrumb__list__item', {}, classNames)}
62
- ref={forwardedRef}
63
- />
64
- );
43
+ return <Root role='listitem' {...props} className={tx('breadcrumb.listItem', {}, classNames)} ref={forwardedRef} />;
65
44
  },
66
45
  );
67
46
 
@@ -79,12 +58,7 @@ const BreadcrumbCurrent = forwardRef<HTMLHeadingElement, BreadcrumbCurrentProps>
79
58
  const { tx } = useThemeContext();
80
59
  const Root = asChild ? Slot : 'h1';
81
60
  return (
82
- <Root
83
- {...props}
84
- aria-current='page'
85
- className={tx('breadcrumb.current', 'breadcrumb__item__heading--current', {}, classNames)}
86
- ref={forwardedRef}
87
- />
61
+ <Root {...props} aria-current='page' className={tx('breadcrumb.current', {}, classNames)} ref={forwardedRef} />
88
62
  );
89
63
  },
90
64
  );
@@ -98,7 +72,7 @@ const BreadcrumbSeparator = ({ children, classNames, ...props }: BreadcrumbSepar
98
72
  role='separator'
99
73
  aria-hidden='true'
100
74
  {...props}
101
- className={tx('breadcrumb.separator', 'breadcrumb__separator', {}, classNames)}
75
+ className={tx('breadcrumb.separator', {}, classNames)}
102
76
  >
103
77
  {children ?? <Icon icon='ph--dot--bold' />}
104
78
  </Primitive.span>
@@ -13,7 +13,7 @@ import { Button, ButtonGroup, type ButtonProps } from './Button';
13
13
 
14
14
  const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
15
15
  return (
16
- <div>
16
+ <div className='flex items-center gap-2 p-1'>
17
17
  <Button {...args}>{children}</Button>
18
18
  <Button {...args} disabled>
19
19
  {children}
@@ -33,10 +33,10 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
33
33
  };
34
34
 
35
35
  const meta = {
36
- title: 'ui/react-ui-core/Button',
36
+ title: 'ui/react-ui-core/components/Button',
37
37
  component: Button,
38
38
  render: DefaultStory,
39
- decorators: [withTheme, withLayoutVariants()],
39
+ decorators: [withTheme(), withLayoutVariants()],
40
40
  } satisfies Meta<typeof Button>;
41
41
 
42
42
  export default meta;
@@ -56,7 +56,6 @@ const Button = memo(
56
56
  data-props={inGroup ? 'grouped' : ''}
57
57
  className={tx(
58
58
  'button.root',
59
- 'button',
60
59
  {
61
60
  variant,
62
61
  inGroup,
@@ -88,12 +87,7 @@ const ButtonGroup = forwardRef<HTMLDivElement, ButtonGroupProps>(
88
87
  const elevation = useElevationContext(propsElevation);
89
88
  const Root = asChild ? Slot : Primitive.div;
90
89
  return (
91
- <Root
92
- role='none'
93
- {...props}
94
- className={tx('button.group', 'button-group', { elevation }, classNames)}
95
- ref={forwardedRef}
96
- >
90
+ <Root role='none' {...props} className={tx('button.group', { elevation }, classNames)} ref={forwardedRef}>
97
91
  <ButtonGroupProvider inGroup>{children}</ButtonGroupProvider>
98
92
  </Root>
99
93
  );
@@ -24,10 +24,10 @@ const DefaultStory = (props: IconButtonProps) => {
24
24
  };
25
25
 
26
26
  const meta = {
27
- title: 'ui/react-ui-core/IconButton',
27
+ title: 'ui/react-ui-core/components/IconButton',
28
28
  component: IconButton,
29
29
  render: DefaultStory as any,
30
- decorators: [withTheme],
30
+ decorators: [withTheme()],
31
31
  } satisfies Meta<typeof IconButton>;
32
32
 
33
33
  export default meta;
@@ -52,7 +52,7 @@ const LabelledIconButton = forwardRef<HTMLButtonElement, IconButtonProps>(
52
52
  ) => {
53
53
  const { tx } = useThemeContext();
54
54
  return (
55
- <Button {...props} classNames={tx('iconButton.root', 'iconButton', { iconOnly }, classNames)} ref={forwardedRef}>
55
+ <Button {...props} classNames={tx('iconButton.root', { iconOnly }, classNames)} ref={forwardedRef}>
56
56
  {icon && !iconEnd && <Icon icon={icon} size={size} classNames={iconClassNames} />}
57
57
  <span className={iconOnly ? 'sr-only' : undefined}>{label}</span>
58
58
  {icon && iconEnd && <Icon icon={icon} size={size} classNames={iconClassNames} />}
@@ -19,10 +19,10 @@ const DefaultStory = (props: ToggleProps) => {
19
19
  };
20
20
 
21
21
  const meta = {
22
- title: 'ui/react-ui-core/Toggle',
22
+ title: 'ui/react-ui-core/components/Toggle',
23
23
  component: Toggle,
24
24
  render: DefaultStory,
25
- decorators: [withTheme],
25
+ decorators: [withTheme()],
26
26
  parameters: {
27
27
  layout: 'centered',
28
28
  },
@@ -25,10 +25,10 @@ const DefaultStory = (props: ToggleGroupProps) => {
25
25
  };
26
26
 
27
27
  const meta = {
28
- title: 'ui/react-ui-core/ToggleGroup',
28
+ title: 'ui/react-ui-core/components/ToggleGroup',
29
29
  component: ToggleGroup,
30
30
  render: DefaultStory,
31
- decorators: [withTheme],
31
+ decorators: [withTheme()],
32
32
  } satisfies Meta<typeof ToggleGroup>;
33
33
 
34
34
  export default meta;
@@ -7,7 +7,6 @@ import React from 'react';
7
7
 
8
8
  import { withTheme } from '../../testing';
9
9
  import { Button } from '../Button';
10
- import { Toolbar } from '../Toolbar';
11
10
 
12
11
  import { AlertDialog } from './AlertDialog';
13
12
 
@@ -31,15 +30,15 @@ const DefaultStory = ({ title, description, body, openTrigger, cancelTrigger, ac
31
30
  <AlertDialog.Title>{title}</AlertDialog.Title>
32
31
  <AlertDialog.Description>{description}</AlertDialog.Description>
33
32
  <p className='mbs-2 mbe-8'>{body}</p>
34
- <Toolbar.Root>
33
+ <AlertDialog.ActionBar>
35
34
  <div className='grow' />
36
35
  <AlertDialog.Cancel asChild>
37
- <Toolbar.Button>{cancelTrigger}</Toolbar.Button>
36
+ <Button>{cancelTrigger}</Button>
38
37
  </AlertDialog.Cancel>
39
38
  <AlertDialog.Action asChild>
40
- <Toolbar.Button variant='primary'>{actionTrigger}</Toolbar.Button>
39
+ <Button variant='primary'>{actionTrigger}</Button>
41
40
  </AlertDialog.Action>
42
- </Toolbar.Root>
41
+ </AlertDialog.ActionBar>
43
42
  </AlertDialog.Content>
44
43
  </AlertDialog.Overlay>
45
44
  </AlertDialog.Root>
@@ -47,10 +46,10 @@ const DefaultStory = ({ title, description, body, openTrigger, cancelTrigger, ac
47
46
  };
48
47
 
49
48
  const meta = {
50
- title: 'ui/react-ui-core/AlertDialog',
49
+ title: 'ui/react-ui-core/components/AlertDialog',
51
50
  component: AlertDialog.Root as any,
52
51
  render: DefaultStory as any,
53
- decorators: [withTheme],
52
+ decorators: [withTheme()],
54
53
  } satisfies Meta<typeof DefaultStory>;
55
54
 
56
55
  export default meta;
@@ -23,12 +23,21 @@ import {
23
23
  type AlertDialogTriggerProps as AlertDialogTriggerPrimitiveProps,
24
24
  } from '@radix-ui/react-alert-dialog';
25
25
  import { createContext } from '@radix-ui/react-context';
26
- import React, { type ForwardRefExoticComponent, type FunctionComponent, forwardRef } from 'react';
26
+ import React, {
27
+ type ForwardRefExoticComponent,
28
+ type FunctionComponent,
29
+ type PropsWithChildren,
30
+ forwardRef,
31
+ } from 'react';
27
32
 
28
33
  import { useThemeContext } from '../../hooks';
29
34
  import { type ThemedClassName } from '../../util';
30
35
  import { ElevationProvider } from '../ElevationProvider';
31
36
 
37
+ //
38
+ // Root
39
+ //
40
+
32
41
  type AlertDialogRootProps = AlertDialogRootPrimitiveProps;
33
42
 
34
43
  const AlertDialogRoot: FunctionComponent<AlertDialogRootProps> = (props) => (
@@ -37,22 +46,42 @@ const AlertDialogRoot: FunctionComponent<AlertDialogRootProps> = (props) => (
37
46
  </ElevationProvider>
38
47
  );
39
48
 
49
+ //
50
+ // Trigger
51
+ //
52
+
40
53
  type AlertDialogTriggerProps = AlertDialogTriggerPrimitiveProps;
41
54
 
42
55
  const AlertDialogTrigger: FunctionComponent<AlertDialogTriggerProps> = AlertDialogTriggerPrimitive;
43
56
 
57
+ //
58
+ // Portal
59
+ //
60
+
44
61
  type AlertDialogPortalProps = AlertDialogPortalPrimitiveProps;
45
62
 
46
63
  const AlertDialogPortal: FunctionComponent<AlertDialogPortalProps> = AlertDialogPortalPrimitive;
47
64
 
65
+ //
66
+ // Cancel
67
+ //
68
+
48
69
  type AlertDialogCancelProps = AlertDialogCancelPrimitiveProps;
49
70
 
50
71
  const AlertDialogCancel: FunctionComponent<AlertDialogCancelProps> = AlertDialogCancelPrimitive;
51
72
 
73
+ //
74
+ // Action
75
+ //
76
+
52
77
  type AlertDialogActionProps = AlertDialogActionPrimitiveProps;
53
78
 
54
79
  const AlertDialogAction: FunctionComponent<AlertDialogActionProps> = AlertDialogActionPrimitive;
55
80
 
81
+ //
82
+ // Title
83
+ //
84
+
56
85
  type AlertDialogTitleProps = ThemedClassName<AlertDialogTitlePrimitiveProps> & { srOnly?: boolean };
57
86
 
58
87
  const AlertDialogTitle: ForwardRefExoticComponent<AlertDialogTitleProps> = forwardRef<
@@ -61,14 +90,14 @@ const AlertDialogTitle: ForwardRefExoticComponent<AlertDialogTitleProps> = forwa
61
90
  >(({ classNames, srOnly, ...props }, forwardedRef) => {
62
91
  const { tx } = useThemeContext();
63
92
  return (
64
- <AlertDialogTitlePrimitive
65
- {...props}
66
- className={tx('dialog.title', 'dialog--alert__title', { srOnly }, classNames)}
67
- ref={forwardedRef}
68
- />
93
+ <AlertDialogTitlePrimitive {...props} className={tx('dialog.title', { srOnly }, classNames)} ref={forwardedRef} />
69
94
  );
70
95
  });
71
96
 
97
+ //
98
+ // Description
99
+ //
100
+
72
101
  type AlertDialogDescriptionProps = ThemedClassName<AlertDialogDescriptionPrimitiveProps> & { srOnly?: boolean };
73
102
 
74
103
  const AlertDialogDescription: ForwardRefExoticComponent<AlertDialogTitleProps> = forwardRef<
@@ -79,15 +108,22 @@ const AlertDialogDescription: ForwardRefExoticComponent<AlertDialogTitleProps> =
79
108
  return (
80
109
  <AlertDialogDescriptionPrimitive
81
110
  {...props}
82
- className={tx('dialog.description', 'dialog--alert__description', { srOnly }, classNames)}
111
+ className={tx('dialog.description', { srOnly }, classNames)}
83
112
  ref={forwardedRef}
84
113
  />
85
114
  );
86
115
  });
87
116
 
88
117
  type OverlayLayoutContextValue = { inOverlayLayout?: boolean };
118
+
119
+ //
120
+ // Context
121
+ //
122
+
89
123
  const ALERT_DIALOG_OVERLAY_NAME = 'AlertDialogOverlay';
90
124
  const ALERT_DIALOG_CONTENT_NAME = 'AlertDialogContent';
125
+ const ALERT_DIALOG_ACTIONBAR_NAME = 'AlertDialogActionBar';
126
+
91
127
  const [OverlayLayoutProvider, useOverlayLayoutContext] = createContext<OverlayLayoutContextValue>(
92
128
  ALERT_DIALOG_OVERLAY_NAME,
93
129
  {
@@ -95,6 +131,10 @@ const [OverlayLayoutProvider, useOverlayLayoutContext] = createContext<OverlayLa
95
131
  },
96
132
  );
97
133
 
134
+ //
135
+ // Overlay
136
+ //
137
+
98
138
  type AlertDialogOverlayProps = ThemedClassName<AlertDialogOverlayPrimitiveProps> & {
99
139
  blockAlign?: 'center' | 'start' | 'end';
100
140
  };
@@ -109,7 +149,6 @@ const AlertDialogOverlay: ForwardRefExoticComponent<AlertDialogOverlayProps> = f
109
149
  {...props}
110
150
  className={tx(
111
151
  'dialog.overlay',
112
- 'dialog--alert__overlay',
113
152
  {},
114
153
  classNames,
115
154
  'data-[block-align=start]:justify-center',
@@ -126,6 +165,10 @@ const AlertDialogOverlay: ForwardRefExoticComponent<AlertDialogOverlayProps> = f
126
165
 
127
166
  AlertDialogOverlay.displayName = ALERT_DIALOG_OVERLAY_NAME;
128
167
 
168
+ //
169
+ // Content
170
+ //
171
+
129
172
  type AlertDialogContentProps = ThemedClassName<AlertDialogContentPrimitiveProps>;
130
173
 
131
174
  const AlertDialogContent: ForwardRefExoticComponent<AlertDialogContentProps> = forwardRef<
@@ -137,7 +180,7 @@ const AlertDialogContent: ForwardRefExoticComponent<AlertDialogContentProps> = f
137
180
  return (
138
181
  <AlertDialogContentPrimitive
139
182
  {...props}
140
- className={tx('dialog.content', 'dialog--alert', { inOverlayLayout }, classNames)}
183
+ className={tx('dialog.content', { inOverlayLayout }, classNames)}
141
184
  ref={forwardedRef}
142
185
  >
143
186
  {children}
@@ -147,6 +190,30 @@ const AlertDialogContent: ForwardRefExoticComponent<AlertDialogContentProps> = f
147
190
 
148
191
  AlertDialogContent.displayName = ALERT_DIALOG_CONTENT_NAME;
149
192
 
193
+ //
194
+ // ActionBar
195
+ //
196
+
197
+ type AlertDialogActionBarProps = ThemedClassName<PropsWithChildren>;
198
+
199
+ const AlertDialogActionBar: ForwardRefExoticComponent<AlertDialogActionBarProps> = forwardRef<
200
+ HTMLDivElement,
201
+ AlertDialogActionBarProps
202
+ >(({ children, classNames, ...props }, forwardedRef) => {
203
+ const { tx } = useThemeContext();
204
+ return (
205
+ <div {...props} className={tx('dialog.actionbar', {}, classNames)} ref={forwardedRef}>
206
+ {children}
207
+ </div>
208
+ );
209
+ });
210
+
211
+ AlertDialogActionBar.displayName = ALERT_DIALOG_ACTIONBAR_NAME;
212
+
213
+ //
214
+ // AlertDialog
215
+ //
216
+
150
217
  export const AlertDialog = {
151
218
  Root: AlertDialogRoot,
152
219
  Trigger: AlertDialogTrigger,
@@ -155,6 +222,7 @@ export const AlertDialog = {
155
222
  Content: AlertDialogContent,
156
223
  Title: AlertDialogTitle,
157
224
  Description: AlertDialogDescription,
225
+ ActionBar: AlertDialogActionBar,
158
226
  Cancel: AlertDialogCancel,
159
227
  Action: AlertDialogAction,
160
228
  };
@@ -167,6 +235,7 @@ export type {
167
235
  AlertDialogContentProps,
168
236
  AlertDialogTitleProps,
169
237
  AlertDialogDescriptionProps,
238
+ AlertDialogActionBarProps,
170
239
  AlertDialogCancelProps,
171
240
  AlertDialogActionProps,
172
241
  };
@@ -37,10 +37,14 @@ const DefaultStory = ({ size, title, description, openTrigger, closeTrigger, blo
37
37
  </Dialog.Close>
38
38
  )}
39
39
  </Dialog.Header>
40
- <Dialog.Description>{description}</Dialog.Description>
41
- <Dialog.Close asChild>
42
- <Button variant='primary'>{closeTrigger}</Button>
43
- </Dialog.Close>
40
+ <Dialog.Body>
41
+ <Dialog.Description>{description}</Dialog.Description>
42
+ </Dialog.Body>
43
+ <Dialog.ActionBar>
44
+ <Dialog.Close asChild>
45
+ <Button variant='primary'>{closeTrigger}</Button>
46
+ </Dialog.Close>
47
+ </Dialog.ActionBar>
44
48
  </Dialog.Content>
45
49
  </Dialog.Overlay>
46
50
  </Dialog.Root>
@@ -48,15 +52,11 @@ const DefaultStory = ({ size, title, description, openTrigger, closeTrigger, blo
48
52
  };
49
53
 
50
54
  const meta = {
51
- title: 'ui/react-ui-core/Dialog',
55
+ title: 'ui/react-ui-core/components/Dialog',
52
56
  component: Dialog as any,
53
57
  render: DefaultStory,
54
- decorators: [withTheme],
55
- parameters: {
56
- chromatic: {
57
- disableSnapshot: false,
58
- },
59
- },
58
+ decorators: [withTheme()],
59
+ parameters: {},
60
60
  } satisfies Meta<typeof DefaultStory>;
61
61
 
62
62
  export default meta;