@dxos/ui-theme 0.8.4-main.c85a9c8dae → 0.8.4-main.d05539e30a

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 (164) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/browser/index.mjs +423 -499
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/node-esm/index.mjs +423 -499
  7. package/dist/lib/node-esm/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/meta.json +1 -1
  9. package/dist/plugin/node-cjs/{theme.css → main.css} +204 -125
  10. package/dist/plugin/node-cjs/main.css.map +7 -0
  11. package/dist/plugin/node-cjs/meta.json +1 -1
  12. package/dist/plugin/node-cjs/plugins/ThemePlugin.cjs +8 -15
  13. package/dist/plugin/node-cjs/plugins/ThemePlugin.cjs.map +3 -3
  14. package/dist/plugin/node-esm/{theme.css → main.css} +204 -125
  15. package/dist/plugin/node-esm/main.css.map +7 -0
  16. package/dist/plugin/node-esm/meta.json +1 -1
  17. package/dist/plugin/node-esm/plugins/ThemePlugin.mjs +8 -15
  18. package/dist/plugin/node-esm/plugins/ThemePlugin.mjs.map +3 -3
  19. package/dist/types/src/Theme.stories.d.ts.map +1 -1
  20. package/dist/types/src/defs.d.ts +2 -2
  21. package/dist/types/src/defs.d.ts.map +1 -1
  22. package/dist/types/src/fragments/density.d.ts +1 -4
  23. package/dist/types/src/fragments/density.d.ts.map +1 -1
  24. package/dist/types/src/fragments/hover.d.ts +0 -1
  25. package/dist/types/src/fragments/hover.d.ts.map +1 -1
  26. package/dist/types/src/fragments/index.d.ts +0 -5
  27. package/dist/types/src/fragments/index.d.ts.map +1 -1
  28. package/dist/types/src/fragments/text.d.ts +0 -5
  29. package/dist/types/src/fragments/text.d.ts.map +1 -1
  30. package/dist/types/src/index.d.ts +1 -1
  31. package/dist/types/src/index.d.ts.map +1 -1
  32. package/dist/types/src/plugins/ThemePlugin.d.ts +1 -1
  33. package/dist/types/src/plugins/ThemePlugin.d.ts.map +1 -1
  34. package/dist/types/src/theme/components/avatar.d.ts.map +1 -1
  35. package/dist/types/src/theme/components/button.d.ts +2 -2
  36. package/dist/types/src/theme/components/button.d.ts.map +1 -1
  37. package/dist/types/src/theme/components/card.d.ts +3 -2
  38. package/dist/types/src/theme/components/card.d.ts.map +1 -1
  39. package/dist/types/src/theme/components/dialog.d.ts.map +1 -1
  40. package/dist/types/src/theme/components/focus.d.ts +6 -0
  41. package/dist/types/src/theme/components/focus.d.ts.map +1 -0
  42. package/dist/types/src/theme/components/icon-button.d.ts +1 -0
  43. package/dist/types/src/theme/components/icon-button.d.ts.map +1 -1
  44. package/dist/types/src/theme/components/icon.d.ts +3 -0
  45. package/dist/types/src/theme/components/icon.d.ts.map +1 -1
  46. package/dist/types/src/theme/components/index.d.ts +1 -0
  47. package/dist/types/src/theme/components/index.d.ts.map +1 -1
  48. package/dist/types/src/theme/components/input.d.ts +8 -8
  49. package/dist/types/src/theme/components/input.d.ts.map +1 -1
  50. package/dist/types/src/theme/components/link.d.ts.map +1 -1
  51. package/dist/types/src/theme/components/list.d.ts.map +1 -1
  52. package/dist/types/src/theme/components/main.d.ts.map +1 -1
  53. package/dist/types/src/theme/components/message.d.ts.map +1 -1
  54. package/dist/types/src/theme/components/popover.d.ts.map +1 -1
  55. package/dist/types/src/theme/components/scroll-area.d.ts +12 -2
  56. package/dist/types/src/theme/components/scroll-area.d.ts.map +1 -1
  57. package/dist/types/src/theme/components/select.d.ts.map +1 -1
  58. package/dist/types/src/theme/components/status.d.ts +1 -1
  59. package/dist/types/src/theme/components/status.d.ts.map +1 -1
  60. package/dist/types/src/theme/components/toast.d.ts.map +1 -1
  61. package/dist/types/src/theme/components/toolbar.d.ts +0 -1
  62. package/dist/types/src/theme/components/toolbar.d.ts.map +1 -1
  63. package/dist/types/src/theme/components/tooltip.d.ts.map +1 -1
  64. package/dist/types/src/theme/components/treegrid.d.ts.map +1 -1
  65. package/dist/types/src/theme/index.d.ts +1 -0
  66. package/dist/types/src/theme/index.d.ts.map +1 -1
  67. package/dist/types/src/theme/primitives/column.d.ts +25 -3
  68. package/dist/types/src/theme/primitives/column.d.ts.map +1 -1
  69. package/dist/types/src/theme/primitives/panel.d.ts +9 -5
  70. package/dist/types/src/theme/primitives/panel.d.ts.map +1 -1
  71. package/dist/types/src/theme/theme.d.ts.map +1 -1
  72. package/dist/types/src/util/elevation.d.ts.map +1 -0
  73. package/dist/types/src/util/hash-styles.d.ts +1 -1
  74. package/dist/types/src/util/hash-styles.d.ts.map +1 -1
  75. package/dist/types/src/util/index.d.ts +3 -0
  76. package/dist/types/src/util/index.d.ts.map +1 -1
  77. package/dist/types/src/util/mx.d.ts +52 -4
  78. package/dist/types/src/util/mx.d.ts.map +1 -1
  79. package/dist/types/src/util/size.d.ts +27 -0
  80. package/dist/types/src/util/size.d.ts.map +1 -0
  81. package/dist/types/src/util/valence.d.ts +4 -0
  82. package/dist/types/src/util/valence.d.ts.map +1 -0
  83. package/dist/types/tsconfig.tsbuildinfo +1 -1
  84. package/package.json +15 -18
  85. package/src/Theme.stories.tsx +5 -5
  86. package/src/css/DESIGN_SYSTEM.md +159 -0
  87. package/src/css/base/base.css +2 -2
  88. package/src/css/components/button.css +4 -3
  89. package/src/css/components/checkbox.css +1 -1
  90. package/src/css/components/{focus-ring.css → focus.css} +27 -13
  91. package/src/css/components/icon.css +9 -0
  92. package/src/css/components/link.css +3 -0
  93. package/src/css/components/panel.css +45 -45
  94. package/src/css/components/selected.css +76 -0
  95. package/src/css/components/selected.md +101 -0
  96. package/src/css/components/surface.css +4 -4
  97. package/src/css/components/tag.css +25 -23
  98. package/src/css/integrations/codemirror.css +5 -3
  99. package/src/css/integrations/tldraw.css +1 -0
  100. package/src/css/layout/main.css +0 -7
  101. package/src/css/layout/size.css +19 -27
  102. package/src/css/theme/animation.css +31 -0
  103. package/src/css/theme/palette.css +8 -0
  104. package/src/css/theme/semantic.css +48 -36
  105. package/src/css/theme/spacing.css +37 -20
  106. package/src/css/theme/styles.css +22 -22
  107. package/src/css/utilities.css +114 -3
  108. package/src/defs.ts +2 -2
  109. package/src/fragments/AUDIT.md +55 -0
  110. package/src/fragments/density.ts +8 -5
  111. package/src/fragments/hover.ts +0 -2
  112. package/src/fragments/index.ts +1 -6
  113. package/src/fragments/text.ts +1 -6
  114. package/src/index.ts +1 -1
  115. package/src/{theme.css → main.css} +48 -10
  116. package/src/plugins/ThemePlugin.ts +12 -24
  117. package/src/plugins/main.css +45 -0
  118. package/src/theme/components/avatar.ts +3 -4
  119. package/src/theme/components/button.ts +3 -3
  120. package/src/theme/components/card.ts +19 -11
  121. package/src/theme/components/dialog.ts +4 -3
  122. package/src/theme/components/focus.ts +33 -0
  123. package/src/theme/components/icon-button.ts +6 -5
  124. package/src/theme/components/icon.ts +13 -4
  125. package/src/theme/components/index.ts +1 -0
  126. package/src/theme/components/input.ts +18 -33
  127. package/src/theme/components/link.ts +1 -2
  128. package/src/theme/components/list.ts +4 -4
  129. package/src/theme/components/menu.ts +4 -4
  130. package/src/theme/components/message.ts +6 -7
  131. package/src/theme/components/popover.ts +4 -5
  132. package/src/theme/components/scroll-area.ts +58 -46
  133. package/src/theme/components/select.ts +3 -4
  134. package/src/theme/components/status.ts +5 -5
  135. package/src/theme/components/toast.ts +2 -3
  136. package/src/theme/components/toolbar.ts +1 -7
  137. package/src/theme/components/tooltip.ts +2 -3
  138. package/src/theme/components/treegrid.ts +1 -1
  139. package/src/theme/index.ts +1 -0
  140. package/src/theme/primitives/column.ts +49 -8
  141. package/src/theme/primitives/panel.ts +19 -23
  142. package/src/theme/theme.ts +2 -0
  143. package/src/typings.d.ts +3 -0
  144. package/src/util/hash-styles.ts +19 -19
  145. package/src/util/index.ts +3 -0
  146. package/src/util/mx.ts +119 -8
  147. package/src/util/size.ts +103 -0
  148. package/dist/plugin/node-cjs/theme.css.map +0 -7
  149. package/dist/plugin/node-esm/theme.css.map +0 -7
  150. package/dist/types/src/fragments/elevation.d.ts.map +0 -1
  151. package/dist/types/src/fragments/focus.d.ts +0 -4
  152. package/dist/types/src/fragments/focus.d.ts.map +0 -1
  153. package/dist/types/src/fragments/selected.d.ts +0 -4
  154. package/dist/types/src/fragments/selected.d.ts.map +0 -1
  155. package/dist/types/src/fragments/size.d.ts +0 -7
  156. package/dist/types/src/fragments/size.d.ts.map +0 -1
  157. package/dist/types/src/fragments/valence.d.ts +0 -4
  158. package/dist/types/src/fragments/valence.d.ts.map +0 -1
  159. package/src/fragments/focus.ts +0 -11
  160. package/src/fragments/selected.ts +0 -12
  161. package/src/fragments/size.ts +0 -117
  162. /package/dist/types/src/{fragments → util}/elevation.d.ts +0 -0
  163. /package/src/{fragments → util}/elevation.ts +0 -0
  164. /package/src/{fragments → util}/valence.ts +0 -0
@@ -4,8 +4,8 @@
4
4
 
5
5
  import { type ComponentFunction, type Elevation, type Theme } from '@dxos/ui-types';
6
6
 
7
- import { dataDisabled, subduedFocus, surfaceShadow, surfaceZIndex } from '../../fragments';
8
- import { mx } from '../../util';
7
+ import { dataDisabled } from '../../fragments';
8
+ import { mx, surfaceShadow, surfaceZIndex } from '../../util';
9
9
 
10
10
  export type MenuStyleProps = Partial<{
11
11
  constrainBlockSize: boolean;
@@ -26,8 +26,8 @@ export const menuViewport: ComponentFunction<MenuStyleProps> = (_props, ...etc)
26
26
  export const menuItem: ComponentFunction<MenuStyleProps> = (_props, ...etc) =>
27
27
  mx(
28
28
  'flex cursor-pointer select-none items-center gap-2 rounded-xs px-2 py-2 text-sm',
29
- 'data-[highlighted]:bg-hover-surface',
30
- subduedFocus,
29
+ 'hover:bg-hover-surface data-[highlighted]:bg-hover-surface',
30
+ 'dx-focus-subdued',
31
31
  dataDisabled,
32
32
  ...etc,
33
33
  );
@@ -4,8 +4,7 @@
4
4
 
5
5
  import { type ComponentFunction, type Elevation, type MessageValence, type Theme } from '@dxos/ui-types';
6
6
 
7
- import { messageValence } from '../../fragments';
8
- import { mx } from '../../util';
7
+ import { mx, messageValence } from '../../util';
9
8
 
10
9
  export type MessageStyleProps = {
11
10
  valence?: MessageValence;
@@ -13,23 +12,23 @@ export type MessageStyleProps = {
13
12
  };
14
13
 
15
14
  export const messageRoot: ComponentFunction<MessageStyleProps> = ({ valence }, etc) => {
16
- return mx('grid grid-cols-[min-content_1fr] gap-x-2 p-trim-sm rounded-sm', messageValence(valence), etc);
15
+ return mx('grid grid-cols-[2rem_1fr_2rem] p-1 rounded-sm', messageValence(valence), etc);
17
16
  };
18
17
 
19
18
  export const messageHeader: ComponentFunction<MessageStyleProps> = (_, etc) => {
20
- return mx('col-span-2 grid grid-cols-subgrid items-center', etc);
19
+ return mx('col-span-full grid grid-cols-subgrid items-center', etc);
21
20
  };
22
21
 
23
22
  export const messageTitle: ComponentFunction<MessageStyleProps> = (_, etc) => {
24
- return mx('col-start-2 text-lg gap-trim-sm [&>svg]:inline-block', etc);
23
+ return mx('col-start-2 truncate', etc);
25
24
  };
26
25
 
27
26
  export const messageIcon: ComponentFunction<MessageStyleProps> = (_, etc) => {
28
- return mx('col-start-1', etc);
27
+ return mx('col-start-1 grid place-items-center', etc);
29
28
  };
30
29
 
31
30
  export const messageContent: ComponentFunction<MessageStyleProps> = (_, etc) => {
32
- return mx('grid grid-cols-subgrid col-start-2 first:font-medium', etc);
31
+ return mx('col-start-2 grid grid-cols-subgrid inline first:font-medium', etc);
33
32
  };
34
33
 
35
34
  export const messageTheme: Theme<MessageStyleProps> = {
@@ -4,8 +4,7 @@
4
4
 
5
5
  import { type ComponentFunction, type Elevation, type Theme } from '@dxos/ui-types';
6
6
 
7
- import { focusRing, surfaceShadow, surfaceZIndex } from '../../fragments';
8
- import { mx } from '../../util';
7
+ import { mx, surfaceShadow, surfaceZIndex } from '../../util';
9
8
 
10
9
  export type PopoverStyleProps = Partial<{
11
10
  constrainBlock: boolean;
@@ -18,15 +17,15 @@ export const popoverContent: ComponentFunction<PopoverStyleProps> = ({ elevation
18
17
  'dx-modal-surface border border-separator rounded-sm',
19
18
  surfaceShadow({ elevation: 'positioned' }),
20
19
  surfaceZIndex({ elevation, level: 'menu' }),
21
- focusRing,
20
+ 'dx-focus-ring',
22
21
  ...etc,
23
22
  );
24
23
 
25
24
  export const popoverViewport: ComponentFunction<PopoverStyleProps> = ({ constrainBlock, constrainInline }, ...etc) =>
26
25
  mx(
27
- 'flex flex-col min-h-0 min-w-popover-min-width',
26
+ 'grid grid-rows-[1fr] min-h-0 min-w-popover-min-width',
28
27
  (constrainBlock || constrainInline) && 'overflow-hidden',
29
- // Ensures it respects available height from Radix (or 100dvh).
28
+ constrainBlock && 'max-h-(--radix-popover-content-available-height)',
30
29
  constrainBlock &&
31
30
  'max-h-[min(var(--radix-popover-content-available-height),calc(100dvh-var(--spacing-screen-border)*2))]',
32
31
  constrainInline && 'max-w-(--radix-popover-content-available-width)',
@@ -5,12 +5,24 @@
5
5
  import { type AllowedAxis, type ComponentFunction, type Theme } from '@dxos/ui-types';
6
6
 
7
7
  import { mx } from '../../util';
8
+ import { withColumn } from '../primitives/column';
9
+
10
+ export const scrollbar = {
11
+ thin: {
12
+ size: 4,
13
+ padding: 4,
14
+ },
15
+ coarse: {
16
+ size: 8,
17
+ padding: 8,
18
+ },
19
+ };
8
20
 
9
21
  export type ScrollAreaStyleProps = {
10
22
  orientation?: AllowedAxis;
11
23
  autoHide?: boolean;
12
- /** Balance left/right, top/bottom "margin" with scrollbar. */
13
- margin?: boolean;
24
+ /** Balance left/right, top/bottom offset with scrollbar. */
25
+ centered?: boolean;
14
26
  /** Add default padding. */
15
27
  /** TODO(burdon): Integrate with Column.Root padding. */
16
28
  padding?: boolean;
@@ -21,29 +33,17 @@ export type ScrollAreaStyleProps = {
21
33
  snap?: boolean;
22
34
  };
23
35
 
24
- export const scrollAreaRoot: ComponentFunction<ScrollAreaStyleProps> = ({ orientation, margin, thin }, ...etc) =>
36
+ export const scrollAreaRoot: ComponentFunction<ScrollAreaStyleProps> = ({ orientation }, ...etc) =>
25
37
  mx(
26
- 'overflow-hidden',
27
-
28
- orientation === 'vertical' && 'group/scroll-v dx-container',
29
- orientation === 'horizontal' && 'group/scroll-h dx-container',
30
- orientation === 'all' && 'group/scroll-all dx-container',
31
-
32
- // TODO(burdon): Audit composition.
33
- // Apply col-span-full only when inside a Column.Root grid (detected via dx-column marker).
34
- '[.dx-column_&]:col-span-full',
35
-
36
- // NOTE: Uses --gutter CSS variable
37
- // If contained within Column.Root grid, the gutter is set by that component.
38
- margin && [
39
- orientation === 'vertical' &&
40
- (thin
41
- ? 'pl-[var(--gutter,4px)] pr-[calc(var(--gutter,4px)-4px)]'
42
- : 'pl-[var(--gutter,8px)] pr-[calc(var(--gutter,8px)-8px)]'),
43
- orientation === 'horizontal' && (thin ? 'py-[var(--gutter,4px)]' : 'py-[var(--gutter,8px)]'),
44
- orientation === 'all' &&
45
- (thin ? 'pl-[var(--gutter,4px)] py-[var(--gutter,8px)]' : 'pl-[var(--gutter,8px)] py-[var(--gutter,8px)]'),
46
- ],
38
+ // Expand
39
+ 'dx-container',
40
+
41
+ orientation === 'vertical' && 'group/scroll-v flex flex-col',
42
+ orientation === 'horizontal' && 'group/scroll-h flex',
43
+ orientation === 'all' && 'group/scroll-all',
44
+
45
+ // Apply col-span-full only when inside a Column.Root grid (detected via dx-column-root marker).
46
+ '[.dx-column-root_&]:col-span-full',
47
47
 
48
48
  ...etc,
49
49
  );
@@ -52,24 +52,47 @@ export const scrollAreaRoot: ComponentFunction<ScrollAreaStyleProps> = ({ orient
52
52
  * NOTE: The browser reserves space for scrollbars.
53
53
  */
54
54
  export const scrollAreaViewport: ComponentFunction<ScrollAreaStyleProps> = (
55
- { orientation, autoHide, padding, snap, thin },
55
+ { orientation, centered, padding, snap, autoHide },
56
56
  ...etc
57
- ) =>
58
- mx(
59
- 'h-full w-full',
57
+ ) => {
58
+ return mx(
59
+ 'flex-1 min-h-0 w-full',
60
60
 
61
- orientation === 'vertical' && 'flex flex-col overflow-y-scroll',
62
- orientation === 'horizontal' && 'flex overflow-x-scroll',
63
- orientation === 'all' && 'overflow-scroll',
61
+ // Reset --dx-col so nested components don't try to grid-position themselves.
62
+ // ScrollArea has already consumed --gutter for padding.
63
+ withColumn.consumed(),
64
64
 
65
- thin
66
- ? '[&::-webkit-scrollbar]:w-[4px] [&::-webkit-scrollbar]:h-[4px]'
67
- : '[&::-webkit-scrollbar]:w-[8px] [&::-webkit-scrollbar]:h-[8px]',
65
+ orientation === 'vertical' && 'overflow-y-scroll',
66
+ orientation === 'horizontal' && 'flex overflow-x-scroll overscroll-x-contain',
67
+ orientation === 'all' && 'overflow-scroll',
68
68
 
69
69
  '[&::-webkit-scrollbar-corner]:bg-transparent',
70
70
  '[&::-webkit-scrollbar-track]:bg-transparent',
71
71
  '[&::-webkit-scrollbar-thumb]:rounded-none',
72
72
 
73
+ '[&::-webkit-scrollbar]:w-[var(--scroll-width)] [&::-webkit-scrollbar]:h-[var(--scroll-width)]',
74
+
75
+ // If contained within Column.Root grid the gutter is set by that component (--gutter CSS variable).
76
+ // If centered, left padding compensates for scrollbar width so content is visually centered.
77
+ (orientation === 'vertical' || orientation === 'all') &&
78
+ (padding
79
+ ? [
80
+ centered ? 'pl-[var(--gutter,calc(var(--scroll-width)+var(--scroll-padding)))]' : 'pl-[var(--gutter,0)]',
81
+ 'pr-[calc(var(--gutter,calc(var(--scroll-width)+var(--scroll-padding)))-var(--scroll-width))]',
82
+ ]
83
+ : centered && 'pl-[var(--scroll-width)]'),
84
+
85
+ (orientation === 'horizontal' || orientation === 'all') &&
86
+ (padding
87
+ ? [centered && 'pt-[calc(var(--scroll-width)+var(--scroll-padding))]', 'pb-[var(--scroll-padding)]']
88
+ : centered && 'pt-[var(--scroll-width)]'),
89
+
90
+ snap && [
91
+ orientation === 'vertical' && 'snap-y snap-mandatory',
92
+ orientation === 'horizontal' && 'snap-x snap-mandatory',
93
+ orientation === 'all' && 'snap-both snap-mandatory',
94
+ ],
95
+
73
96
  autoHide
74
97
  ? [
75
98
  orientation === 'vertical' && 'group-hover/scroll-v:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb',
@@ -82,20 +105,9 @@ export const scrollAreaViewport: ComponentFunction<ScrollAreaStyleProps> = (
82
105
  orientation === 'all' && '[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb',
83
106
  ],
84
107
 
85
- padding && [
86
- orientation === 'vertical' && 'px-[4px]',
87
- orientation === 'horizontal' && 'pb-[4px]',
88
- orientation === 'all' && 'pl-[4px] pb-[4px]',
89
- ],
90
-
91
- snap && [
92
- orientation === 'vertical' && 'snap-y snap-mandatory',
93
- orientation === 'horizontal' && 'snap-x snap-mandatory',
94
- orientation === 'all' && 'snap-both snap-mandatory',
95
- ],
96
-
97
108
  ...etc,
98
109
  );
110
+ };
99
111
 
100
112
  export const scrollAreaTheme: Theme<ScrollAreaStyleProps> = {
101
113
  root: scrollAreaRoot,
@@ -4,8 +4,7 @@
4
4
 
5
5
  import { type ComponentFunction, type Elevation, type Theme } from '@dxos/ui-types';
6
6
 
7
- import { ghostHighlighted, surfaceShadow, surfaceZIndex } from '../../fragments';
8
- import { mx } from '../../util';
7
+ import { mx, surfaceShadow, surfaceZIndex } from '../../util';
9
8
 
10
9
  export type SelectStyleProps = Partial<{
11
10
  elevation: Elevation;
@@ -26,9 +25,9 @@ export const selectViewport: ComponentFunction<SelectStyleProps> = (_props, ...e
26
25
  export const selectItem: ComponentFunction<SelectStyleProps> = (_props, ...etc) =>
27
26
  mx(
28
27
  'flex items-center min-h-[2rem] px-3 py-1 gap-2',
29
- 'text-base-surface-text leading-none select-none outline-hidden',
28
+ 'text-base-foreground leading-none select-none outline-hidden',
30
29
  '[&>svg]:invisible [&[data-state=checked]>svg]:visible',
31
- ghostHighlighted,
30
+ 'dx-highlighted',
32
31
  ...etc,
33
32
  );
34
33
 
@@ -7,21 +7,21 @@ import type { ComponentFunction, Theme } from '@dxos/ui-types';
7
7
  import { mx } from '../../util';
8
8
 
9
9
  export type StatusStyleProps = {
10
- indeterminate?: boolean;
11
10
  variant?: 'default' | 'main-bottom';
11
+ indeterminate?: boolean;
12
12
  };
13
13
 
14
14
  export const statusRoot: ComponentFunction<StatusStyleProps> = ({ variant = 'default' }, ...etc) =>
15
15
  mx(
16
- 'h-1 relative bg-hover-overlay rounded-full overflow-hidden',
17
- variant === 'main-bottom' ? 'w-full block' : 'inline-20 inline-block',
16
+ 'h-1 relative rounded-full overflow-hidden',
17
+ variant === 'main-bottom' ? 'w-full block' : 'inline-20 inline-block bg-base-surface',
18
18
  ...etc,
19
19
  );
20
20
 
21
- export const statusBar: ComponentFunction<StatusStyleProps> = ({ indeterminate, variant = 'default' }, ...etc) =>
21
+ export const statusBar: ComponentFunction<StatusStyleProps> = ({ variant = 'default', indeterminate }, ...etc) =>
22
22
  mx(
23
23
  'absolute inset-y-0 block rounded-full',
24
- variant === 'main-bottom' ? 'bg-accent-surface' : 'bg-un-accent',
24
+ variant === 'main-bottom' ? 'bg-composer-300' : 'bg-un-accent',
25
25
  indeterminate ? 'animate-progress-indeterminate' : 'start-0',
26
26
  ...etc,
27
27
  );
@@ -4,8 +4,7 @@
4
4
 
5
5
  import { type ComponentFunction, type Theme } from '@dxos/ui-types';
6
6
 
7
- import { focusRing, surfaceShadow } from '../../fragments';
8
- import { mx } from '../../util';
7
+ import { mx, surfaceShadow } from '../../util';
9
8
 
10
9
  export type ToastStyleProps = Partial<{
11
10
  srOnly: boolean;
@@ -28,7 +27,7 @@ export const toastRoot: ComponentFunction<ToastStyleProps> = (_props, ...etc) =>
28
27
  'radix-swipe-end:animate-toast-swipe-out',
29
28
  'translate-x-radix-toast-swipe-move-x',
30
29
  'radix-swipe-cancel:translate-x-0 radix-swipe-cancel:duration-200 radix-swipe-cancel:ease-[ease]',
31
- focusRing,
30
+ 'dx-focus-ring',
32
31
  ...etc,
33
32
  );
34
33
 
@@ -4,7 +4,6 @@
4
4
 
5
5
  import { type ComponentFunction, type Density, type Theme } from '@dxos/ui-types';
6
6
 
7
- import { textBlockWidth } from '../../fragments';
8
7
  import { mx } from '../../util';
9
8
 
10
9
  export type ToolbarStyleProps = Partial<{
@@ -26,16 +25,11 @@ export const toolbarRoot: ComponentFunction<ToolbarStyleProps> = ({ density, dis
26
25
  );
27
26
  };
28
27
 
29
- export const toolbarInner: ComponentFunction<ToolbarStyleProps> = ({ layoutManaged }, ...etc) => {
30
- return mx(!layoutManaged && ['flex gap-1', textBlockWidth], ...etc);
31
- };
32
-
33
28
  export const toolbarText: ComponentFunction<ToolbarStyleProps> = (_, ...etc) => {
34
- return mx('grow truncate items-center', textBlockWidth, ...etc);
29
+ return mx('px-2 grow truncate items-center', ...etc);
35
30
  };
36
31
 
37
32
  export const toolbarTheme: Theme<ToolbarStyleProps> = {
38
33
  root: toolbarRoot,
39
- inner: toolbarInner,
40
34
  text: toolbarText,
41
35
  };
@@ -4,8 +4,7 @@
4
4
 
5
5
  import { type ComponentFunction, type Elevation, type Theme } from '@dxos/ui-types';
6
6
 
7
- import { surfaceShadow, surfaceZIndex } from '../../fragments';
8
- import { mx } from '../../util';
7
+ import { mx, surfaceShadow, surfaceZIndex } from '../../util';
9
8
 
10
9
  export type TooltipStyleProps = Partial<{
11
10
  elevation: Elevation;
@@ -13,7 +12,7 @@ export type TooltipStyleProps = Partial<{
13
12
 
14
13
  export const tooltipContent: ComponentFunction<TooltipStyleProps> = ({ elevation }, ...etc) =>
15
14
  mx(
16
- 'inline-flex items-center p-1 max-w-64 text-sm bg-inverse-surface text-inverse-surface-text rounded-sm',
15
+ 'inline-flex items-center p-1 max-w-64 text-sm bg-inverse-surface text-inverse-foreground rounded-sm',
17
16
  surfaceShadow({ elevation: 'positioned' }),
18
17
  surfaceZIndex({ elevation, level: 'tooltip' }),
19
18
  ...etc,
@@ -25,7 +25,7 @@ const levelStyles = new Map<number, string>([
25
25
  export const treegridRoot: ComponentFunction<TreegridStyleProps> = (_, ...etc) => mx('grid', ...etc);
26
26
 
27
27
  export const treegridRow: ComponentFunction<TreegridStyleProps> = ({ level = 1 }, ...etc) =>
28
- mx('contents', levelStyles.get(Math.min(Math.max(Math.round(level), 1), 8)), ...etc);
28
+ mx(levelStyles.get(Math.min(Math.max(Math.round(level), 1), 8)), ...etc);
29
29
 
30
30
  export const treegridCell: ComponentFunction<TreegridStyleProps> = ({ indent }, ...etc) =>
31
31
  mx(indent && 'indent', ...etc);
@@ -3,4 +3,5 @@
3
3
  //
4
4
 
5
5
  export * from './components';
6
+ export * from './primitives';
6
7
  export * from './theme';
@@ -6,25 +6,66 @@ import { type ComponentFunction } from '@dxos/ui-types';
6
6
 
7
7
  import { mx } from '../../util';
8
8
 
9
- const columnRoot: ComponentFunction<Record<string, any>> = (_, ...etc) => mx('dx-column w-full min-w-0 grid', ...etc);
9
+ /**
10
+ * Column-aware theme utilities.
11
+ * Components apply these in their theme functions to participate in the Column grid
12
+ * without importing Column React components.
13
+ *
14
+ * CSS custom property cascade:
15
+ * - Column.Root sets `--dx-col: 2 / span 1` (center column placement).
16
+ * - ScrollArea.Viewport resets `--dx-col: auto` after consuming `--gutter`.
17
+ * - Components apply `grid-column: var(--dx-col, auto)` to auto-center in Column
18
+ * or do nothing outside Column / inside ScrollArea.
19
+ */
20
+ export const withColumn = {
21
+ /** Centers element in the Column grid via --dx-col. No-op outside Column or inside ScrollArea. */
22
+ center: () => '[grid-column:var(--dx-col,auto)]',
23
+
24
+ /** Propagates the Column grid to children via subgrid. No-op outside Column.
25
+ * Direct children default to center column unless they are a dx-container (ScrollArea). */
26
+ propagate: () =>
27
+ '[.dx-column-root_&]:col-span-full [.dx-column-root_&]:grid [.dx-column-root_&]:grid-cols-subgrid [.dx-column-root_&]:[&>*:not(.dx-container)]:[grid-column:var(--dx-col,auto)]',
28
+
29
+ /** Resets --dx-col after consuming --gutter. Applied by ScrollArea.Viewport. */
30
+ consumed: () => '[--dx-col:auto]',
31
+ };
32
+
33
+ export type ColumnStyleProps = {};
34
+
35
+ const columnRoot: ComponentFunction<ColumnStyleProps> = (_, ...etc) => {
36
+ return mx('dx-column-root grid', ...etc);
37
+ };
10
38
 
11
39
  /**
12
40
  * Three-column icon-slot row: spans all 3 columns of the parent Column.Root grid.
13
41
  * Uses CSS subgrid to inherit column sizing from the parent Column.
14
42
  * Children map to: [col-1: icon/slot] [col-2: content] [col-3: icon/action].
43
+ * NOTE: Must not use overflow-hidden here since it will clip input focus rings.
15
44
  */
16
- const columnRow: ComponentFunction<Record<string, any>> = (_, ...etc) =>
17
- mx('col-span-3 grid grid-cols-subgrid', ...etc);
45
+ const columnRow: ComponentFunction<ColumnStyleProps> = (_, ...etc) => {
46
+ return mx('col-span-3 grid grid-cols-subgrid', ...etc);
47
+ };
18
48
 
19
49
  /**
20
- * NOTE: Must not use overflow-hidden here since it will clip input focus rings.
21
- * Occupies only the center column (col-2) of the parent Column.Root grid.
50
+ * Bleed placement: spans all 3 columns of the parent Column.Root grid (gutter-to-gutter).
51
+ * Use for `ScrollArea`, full-width dividers, tables, or any content that should ignore gutters.
52
+ */
53
+ const columnBleed: ComponentFunction<ColumnStyleProps> = (_, ...etc) => {
54
+ return mx('col-span-full grid grid-cols-subgrid min-h-0', ...etc);
55
+ };
56
+
57
+ /**
58
+ * Center placement: places the element in column 2 (the central track between gutters) of the
59
+ * parent Column.Root grid. Does NOT use subgrid — placement is explicit on this element only.
60
+ * Safe to nest arbitrary compound components (including those that render `display: contents`).
22
61
  */
23
- const columnSegment: ComponentFunction<Record<string, any>> = (_, ...etc) =>
24
- mx('col-start-2 col-span-1 min-w-0', ...etc);
62
+ const columnCenter: ComponentFunction<ColumnStyleProps> = (_, ...etc) => {
63
+ return mx(withColumn.center(), 'min-h-0', ...etc);
64
+ };
25
65
 
26
66
  export const columnTheme = {
27
67
  root: columnRoot,
28
68
  row: columnRow,
29
- segment: columnSegment,
69
+ bleed: columnBleed,
70
+ center: columnCenter,
30
71
  };
@@ -6,38 +6,34 @@ import { type ComponentFunction } from '@dxos/ui-types';
6
6
 
7
7
  import { mx } from '../../util';
8
8
 
9
- export type PanelProps = {};
9
+ type Size = 'lg' | 'md' | 'sm';
10
10
 
11
- const panelRoot: ComponentFunction<PanelProps> = (_, ...etc) =>
11
+ export type PanelStyleProps = {
12
+ size?: Size;
13
+ };
14
+
15
+ const sizes: Record<Size, string> = {
16
+ lg: 'h-(--dx-topbar-size)',
17
+ md: 'h-(--dx-toolbar-size)',
18
+ sm: 'h-(--dx-statusbar-size)',
19
+ };
20
+
21
+ const panelRoot: ComponentFunction<PanelStyleProps> = (_, ...etc) =>
12
22
  mx(
13
23
  // prettier-ignore
14
- 'h-full w-full grid grid-cols-[100%] overflow-hidden',
24
+ 'dx-container grid grid-cols-[100%] overflow-hidden',
25
+ // Add uncategorized children to content slot.
15
26
  '[&>*:not([data-slot])]:[grid-area:content]',
16
27
  ...etc,
17
28
  );
18
29
 
19
- const panelToolbar: ComponentFunction<PanelProps> = (_, ...etc) =>
20
- mx(
21
- // prettier-ignore
22
- '[grid-area:toolbar]',
23
- 'border-b border-subdued-separator relative',
24
- '[.dx-main-mobile-layout_&]:px-3',
25
- ...etc,
26
- );
30
+ const panelToolbar: ComponentFunction<PanelStyleProps> = ({ size = 'md' }, ...etc) =>
31
+ mx('[grid-area:toolbar]', 'shrink-0', sizes[size], ...etc);
27
32
 
28
- const panelContent: ComponentFunction<PanelProps> = (_, ...etc) =>
29
- mx(
30
- // prettier-ignore
31
- '[grid-area:content] overflow-hidden min-h-0',
32
- ...etc,
33
- );
33
+ const panelContent: ComponentFunction<PanelStyleProps> = (_, ...etc) => mx('[grid-area:content] min-h-0', ...etc);
34
34
 
35
- const panelStatusbar: ComponentFunction<PanelProps> = (_, ...etc) =>
36
- mx(
37
- // prettier-ignore
38
- '[grid-area:statusbar]',
39
- ...etc,
40
- );
35
+ const panelStatusbar: ComponentFunction<PanelStyleProps> = ({ size = 'md' }, ...etc) =>
36
+ mx('[grid-area:statusbar]', 'shrink-0', sizes[size], ...etc);
41
37
 
42
38
  export const panelTheme = {
43
39
  root: panelRoot,
@@ -11,6 +11,7 @@ import {
11
11
  buttonTheme,
12
12
  cardTheme,
13
13
  dialogTheme,
14
+ focusTheme,
14
15
  iconButtonTheme,
15
16
  iconTheme,
16
17
  inputTheme,
@@ -53,6 +54,7 @@ export const defaultTheme: Theme<Record<string, any>> = {
53
54
  button: buttonTheme,
54
55
  card: cardTheme,
55
56
  dialog: dialogTheme,
57
+ focus: focusTheme,
56
58
  icon: iconTheme,
57
59
  iconButton: iconButtonTheme,
58
60
  input: inputTheme,
package/src/typings.d.ts CHANGED
@@ -5,3 +5,6 @@
5
5
  declare module 'fast-glob';
6
6
  declare module 'tailwindcss/stubs/config.full.js';
7
7
  declare module 'tailwindcss-radix';
8
+
9
+ /** Virtual CSS entry from ThemePlugin (`virtualFileId: '@dxos-theme'`). */
10
+ declare module '@dxos-theme';