@dxos/ui-theme 0.8.4-main.c85a9c8dae → 0.8.4-main.e00bdcdb52
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.
- package/dist/lib/browser/index.mjs +397 -471
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +397 -471
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/plugin/node-cjs/{theme.css → main.css} +122 -55
- package/dist/plugin/node-cjs/main.css.map +7 -0
- package/dist/plugin/node-cjs/meta.json +1 -1
- package/dist/plugin/node-cjs/plugins/ThemePlugin.cjs +8 -15
- package/dist/plugin/node-cjs/plugins/ThemePlugin.cjs.map +3 -3
- package/dist/plugin/node-esm/{theme.css → main.css} +122 -55
- package/dist/plugin/node-esm/main.css.map +7 -0
- package/dist/plugin/node-esm/meta.json +1 -1
- package/dist/plugin/node-esm/plugins/ThemePlugin.mjs +8 -15
- package/dist/plugin/node-esm/plugins/ThemePlugin.mjs.map +3 -3
- package/dist/types/src/Theme.stories.d.ts.map +1 -1
- package/dist/types/src/defs.d.ts +2 -2
- package/dist/types/src/defs.d.ts.map +1 -1
- package/dist/types/src/fragments/density.d.ts +1 -4
- package/dist/types/src/fragments/density.d.ts.map +1 -1
- package/dist/types/src/fragments/index.d.ts +0 -5
- package/dist/types/src/fragments/index.d.ts.map +1 -1
- package/dist/types/src/fragments/text.d.ts +0 -5
- package/dist/types/src/fragments/text.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/plugins/ThemePlugin.d.ts +1 -1
- package/dist/types/src/plugins/ThemePlugin.d.ts.map +1 -1
- package/dist/types/src/theme/components/avatar.d.ts.map +1 -1
- package/dist/types/src/theme/components/card.d.ts +3 -2
- package/dist/types/src/theme/components/card.d.ts.map +1 -1
- package/dist/types/src/theme/components/dialog.d.ts.map +1 -1
- package/dist/types/src/theme/components/focus.d.ts +6 -0
- package/dist/types/src/theme/components/focus.d.ts.map +1 -0
- package/dist/types/src/theme/components/icon-button.d.ts +1 -0
- package/dist/types/src/theme/components/icon-button.d.ts.map +1 -1
- package/dist/types/src/theme/components/icon.d.ts +3 -0
- package/dist/types/src/theme/components/icon.d.ts.map +1 -1
- package/dist/types/src/theme/components/index.d.ts +1 -0
- package/dist/types/src/theme/components/index.d.ts.map +1 -1
- package/dist/types/src/theme/components/input.d.ts +8 -8
- package/dist/types/src/theme/components/input.d.ts.map +1 -1
- package/dist/types/src/theme/components/link.d.ts.map +1 -1
- package/dist/types/src/theme/components/list.d.ts.map +1 -1
- package/dist/types/src/theme/components/main.d.ts.map +1 -1
- package/dist/types/src/theme/components/message.d.ts.map +1 -1
- package/dist/types/src/theme/components/popover.d.ts.map +1 -1
- package/dist/types/src/theme/components/scroll-area.d.ts +12 -2
- package/dist/types/src/theme/components/scroll-area.d.ts.map +1 -1
- package/dist/types/src/theme/components/select.d.ts.map +1 -1
- package/dist/types/src/theme/components/status.d.ts +1 -1
- package/dist/types/src/theme/components/status.d.ts.map +1 -1
- package/dist/types/src/theme/components/toast.d.ts.map +1 -1
- package/dist/types/src/theme/components/toolbar.d.ts +0 -1
- package/dist/types/src/theme/components/toolbar.d.ts.map +1 -1
- package/dist/types/src/theme/components/tooltip.d.ts.map +1 -1
- package/dist/types/src/theme/components/treegrid.d.ts.map +1 -1
- package/dist/types/src/theme/index.d.ts +1 -0
- package/dist/types/src/theme/index.d.ts.map +1 -1
- package/dist/types/src/theme/primitives/column.d.ts +25 -3
- package/dist/types/src/theme/primitives/column.d.ts.map +1 -1
- package/dist/types/src/theme/primitives/panel.d.ts +9 -5
- package/dist/types/src/theme/primitives/panel.d.ts.map +1 -1
- package/dist/types/src/theme/theme.d.ts.map +1 -1
- package/dist/types/src/util/elevation.d.ts.map +1 -0
- package/dist/types/src/util/hash-styles.d.ts.map +1 -1
- package/dist/types/src/util/index.d.ts +3 -0
- package/dist/types/src/util/index.d.ts.map +1 -1
- package/dist/types/src/util/mx.d.ts +52 -4
- package/dist/types/src/util/mx.d.ts.map +1 -1
- package/dist/types/src/util/size.d.ts +27 -0
- package/dist/types/src/util/size.d.ts.map +1 -0
- package/dist/types/src/util/valence.d.ts +4 -0
- package/dist/types/src/util/valence.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -15
- package/src/css/components/button.css +2 -1
- package/src/css/components/{focus-ring.css → focus.css} +15 -1
- package/src/css/components/icon.css +9 -0
- package/src/css/components/panel.css +22 -22
- package/src/css/components/selected.css +30 -0
- package/src/css/components/tag.css +3 -1
- package/src/css/integrations/codemirror.css +5 -3
- package/src/css/integrations/tldraw.css +1 -0
- package/src/css/layout/main.css +0 -7
- package/src/css/layout/size.css +19 -27
- package/src/css/theme/animation.css +31 -0
- package/src/css/theme/palette.css +8 -0
- package/src/css/theme/semantic.css +25 -9
- package/src/css/theme/spacing.css +36 -19
- package/src/css/utilities.css +114 -3
- package/src/defs.ts +1 -1
- package/src/fragments/AUDIT.md +57 -0
- package/src/fragments/density.ts +8 -5
- package/src/fragments/index.ts +1 -6
- package/src/fragments/text.ts +1 -6
- package/src/index.ts +1 -1
- package/src/{theme.css → main.css} +10 -6
- package/src/plugins/ThemePlugin.ts +12 -24
- package/src/plugins/main.css +45 -0
- package/src/theme/components/avatar.ts +3 -4
- package/src/theme/components/button.ts +1 -1
- package/src/theme/components/card.ts +19 -11
- package/src/theme/components/dialog.ts +4 -3
- package/src/theme/components/focus.ts +33 -0
- package/src/theme/components/icon-button.ts +6 -5
- package/src/theme/components/icon.ts +13 -4
- package/src/theme/components/index.ts +1 -0
- package/src/theme/components/input.ts +15 -30
- package/src/theme/components/link.ts +1 -2
- package/src/theme/components/list.ts +4 -4
- package/src/theme/components/menu.ts +4 -4
- package/src/theme/components/message.ts +2 -3
- package/src/theme/components/popover.ts +4 -5
- package/src/theme/components/scroll-area.ts +58 -46
- package/src/theme/components/select.ts +2 -3
- package/src/theme/components/status.ts +5 -5
- package/src/theme/components/toast.ts +2 -3
- package/src/theme/components/toolbar.ts +1 -7
- package/src/theme/components/tooltip.ts +1 -2
- package/src/theme/components/treegrid.ts +1 -1
- package/src/theme/index.ts +1 -0
- package/src/theme/primitives/column.ts +49 -8
- package/src/theme/primitives/panel.ts +19 -23
- package/src/theme/theme.ts +2 -0
- package/src/typings.d.ts +3 -0
- package/src/util/index.ts +3 -0
- package/src/util/mx.ts +119 -8
- package/src/util/size.ts +103 -0
- package/dist/plugin/node-cjs/theme.css.map +0 -7
- package/dist/plugin/node-esm/theme.css.map +0 -7
- package/dist/types/src/fragments/elevation.d.ts.map +0 -1
- package/dist/types/src/fragments/focus.d.ts +0 -4
- package/dist/types/src/fragments/focus.d.ts.map +0 -1
- package/dist/types/src/fragments/selected.d.ts +0 -4
- package/dist/types/src/fragments/selected.d.ts.map +0 -1
- package/dist/types/src/fragments/size.d.ts +0 -7
- package/dist/types/src/fragments/size.d.ts.map +0 -1
- package/dist/types/src/fragments/valence.d.ts +0 -4
- package/dist/types/src/fragments/valence.d.ts.map +0 -1
- package/src/fragments/focus.ts +0 -11
- package/src/fragments/selected.ts +0 -12
- package/src/fragments/size.ts +0 -117
- /package/dist/types/src/{fragments → util}/elevation.d.ts +0 -0
- /package/src/{fragments → util}/elevation.ts +0 -0
- /package/src/{fragments → util}/valence.ts +0 -0
|
@@ -11,23 +11,8 @@ import {
|
|
|
11
11
|
type Size,
|
|
12
12
|
} from '@dxos/ui-types';
|
|
13
13
|
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
coarseDimensions,
|
|
17
|
-
computeSize,
|
|
18
|
-
fineBlockSize,
|
|
19
|
-
fineDimensions,
|
|
20
|
-
focusRing,
|
|
21
|
-
getSize,
|
|
22
|
-
getSizeHeight,
|
|
23
|
-
getSizeWidth,
|
|
24
|
-
sizeValue,
|
|
25
|
-
staticDisabled,
|
|
26
|
-
staticFocusRing,
|
|
27
|
-
subduedFocus,
|
|
28
|
-
textValence,
|
|
29
|
-
} from '../../fragments';
|
|
30
|
-
import { mx } from '../../util';
|
|
14
|
+
import { densityDimensions, staticDisabled } from '../../fragments';
|
|
15
|
+
import { getSize, getHeight, getWidth, mx, snapSize, sizeValue, textValence } from '../../util';
|
|
31
16
|
|
|
32
17
|
export type InputStyleProps = Partial<{
|
|
33
18
|
variant: 'default' | 'subdued' | 'static';
|
|
@@ -73,30 +58,30 @@ const inputValence = (valence?: MessageValence) => {
|
|
|
73
58
|
};
|
|
74
59
|
|
|
75
60
|
const sharedSubduedInputStyles: ComponentFragment<InputStyleProps> = (props) => [
|
|
76
|
-
'py-0 w-full bg-transparent text-current placeholder-placeholder',
|
|
77
61
|
'[[data-drag-autoscroll="active"]_&]:pointer-events-none',
|
|
78
|
-
|
|
79
|
-
|
|
62
|
+
'py-0 w-full bg-transparent text-current placeholder-placeholder',
|
|
63
|
+
'dx-focus-subdued',
|
|
64
|
+
densityDimensions(props.density),
|
|
80
65
|
props.disabled && staticDisabled,
|
|
81
66
|
];
|
|
82
67
|
|
|
83
68
|
const sharedDefaultInputStyles: ComponentFragment<InputStyleProps> = (props) => [
|
|
84
|
-
'py-0 w-full text-base-surface-text rounded-xs placeholder-placeholder',
|
|
85
69
|
'[[data-drag-autoscroll="active"]_&]:pointer-events-none',
|
|
70
|
+
'py-0 w-full text-base-surface-text rounded-xs placeholder-placeholder',
|
|
86
71
|
textInputSurfaceFocus,
|
|
87
|
-
props.density
|
|
72
|
+
densityDimensions(props.density),
|
|
88
73
|
props.disabled ? staticDisabled : textInputSurfaceHover,
|
|
89
74
|
];
|
|
90
75
|
|
|
91
76
|
const sharedStaticInputStyles: ComponentFragment<InputStyleProps> = (props) => [
|
|
92
|
-
'py-0 w-full text-base-surface-text rounded-xs placeholder-placeholder',
|
|
93
77
|
'[[data-drag-autoscroll="active"]_&]:pointer-events-none',
|
|
78
|
+
'py-0 w-full text-base-surface-text rounded-xs placeholder-placeholder',
|
|
94
79
|
textInputSurfaceFocus,
|
|
95
80
|
textInputSurfaceHover,
|
|
96
81
|
props.focused && 'bg-attention-surface',
|
|
97
82
|
inputValence(props.validationValence),
|
|
98
83
|
props.disabled && staticDisabled,
|
|
99
|
-
props.focused &&
|
|
84
|
+
props.focused && 'dx-focus-static',
|
|
100
85
|
];
|
|
101
86
|
|
|
102
87
|
const inputInput: ComponentFunction<InputStyleProps> = (props, ...etc) =>
|
|
@@ -106,28 +91,28 @@ const inputInput: ComponentFunction<InputStyleProps> = (props, ...etc) =>
|
|
|
106
91
|
? mx(...sharedStaticInputStyles(props), ...etc)
|
|
107
92
|
: mx(
|
|
108
93
|
...sharedDefaultInputStyles(props),
|
|
109
|
-
!props.disabled &&
|
|
94
|
+
!props.disabled && 'dx-focus-ring',
|
|
110
95
|
inputValence(props.validationValence),
|
|
111
96
|
...etc,
|
|
112
97
|
);
|
|
113
98
|
|
|
114
|
-
const inputTextArea: ComponentFunction<InputStyleProps> = (props, ...etc) => inputInput(props, ...
|
|
99
|
+
const inputTextArea: ComponentFunction<InputStyleProps> = (props, ...etc) => inputInput(props, ...etc);
|
|
115
100
|
|
|
116
101
|
const inputCheckbox: ComponentFunction<InputStyleProps> = ({ size = 5 }, ...etc) =>
|
|
117
102
|
mx('dx-checkbox dx-focus-ring', getSize(size), ...etc);
|
|
118
103
|
|
|
119
104
|
const inputCheckboxIndicator: ComponentFunction<InputStyleProps> = ({ size = 5, checked }, ...etc) =>
|
|
120
|
-
mx(getSize(
|
|
105
|
+
mx(getSize(snapSize(sizeValue(size) * 0.65, 4)), !checked && 'invisible', ...etc);
|
|
121
106
|
|
|
122
107
|
const inputSwitch: ComponentFunction<InputStyleProps> = ({ size = 5, disabled }, ...etc) =>
|
|
123
108
|
mx(
|
|
124
|
-
|
|
125
|
-
|
|
109
|
+
getHeight(size),
|
|
110
|
+
getWidth(snapSize(sizeValue(size) * 1.75, 9)),
|
|
126
111
|
booleanInputSurface,
|
|
127
112
|
!disabled && booleanInputSurfaceHover,
|
|
128
113
|
// TODO(burdon): Added m-1 margin to make 40px width to align with 40px icon button.
|
|
129
114
|
'cursor-pointer shrink-0 rounded-full px-1 mx-1 relative',
|
|
130
|
-
|
|
115
|
+
'dx-focus-ring',
|
|
131
116
|
...etc,
|
|
132
117
|
);
|
|
133
118
|
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
|
|
5
5
|
import { type ComponentFunction, type Theme } from '@dxos/ui-types';
|
|
6
6
|
|
|
7
|
-
import { focusRing } from '../../fragments';
|
|
8
7
|
import { mx } from '../../util';
|
|
9
8
|
|
|
10
9
|
export type LinkStyleProps = {
|
|
@@ -17,7 +16,7 @@ export const linkRoot: ComponentFunction<LinkStyleProps> = ({ variant }, ...etc)
|
|
|
17
16
|
variant === 'neutral'
|
|
18
17
|
? 'text-inherit hover:opacity-90 visited:text-inherit visited:hover:opacity-90'
|
|
19
18
|
: 'text-accent-text hover:text-accent-text-hover visited:text-accent-text visited:hover:text-accent-text-hover',
|
|
20
|
-
|
|
19
|
+
'dx-focus-ring',
|
|
21
20
|
...etc,
|
|
22
21
|
);
|
|
23
22
|
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
import { type ComponentFunction, type Density, type Theme } from '@dxos/ui-types';
|
|
6
6
|
|
|
7
|
-
import { densityBlockSize,
|
|
8
|
-
import { mx } from '../../util';
|
|
7
|
+
import { densityBlockSize, ghostHover } from '../../fragments';
|
|
8
|
+
import { getSize, mx } from '../../util';
|
|
9
9
|
|
|
10
10
|
export type ListStyleProps = Partial<{
|
|
11
11
|
density: Density;
|
|
@@ -21,13 +21,13 @@ export const listItemEndcap: ComponentFunction<ListStyleProps> = ({ density }, .
|
|
|
21
21
|
mx(density === 'fine' ? getSize(8) : getSize(10), 'shrink-0 flex items-center justify-center', ...etc);
|
|
22
22
|
|
|
23
23
|
export const listItemHeading: ComponentFunction<ListStyleProps> = ({ density }, ...etc) =>
|
|
24
|
-
mx(densityBlockSize(density), 'flex items-center', ...etc);
|
|
24
|
+
mx(densityBlockSize(density), 'flex items-center overflow-hidden [&>span]:truncate', ...etc);
|
|
25
25
|
|
|
26
26
|
export const listItemDragHandleIcon: ComponentFunction<ListStyleProps> = (_props, ...etc) =>
|
|
27
27
|
mx(getSize(5), 'mt-2.5', ...etc);
|
|
28
28
|
|
|
29
29
|
export const listItemOpenTrigger: ComponentFunction<ListStyleProps> = ({ density }, ...etc) =>
|
|
30
|
-
mx('w-5 rounded-sm flex justify-center items-center', densityBlockSize(density), ghostHover,
|
|
30
|
+
mx('w-5 rounded-sm flex justify-center items-center', densityBlockSize(density), ghostHover, 'dx-focus-ring', ...etc);
|
|
31
31
|
|
|
32
32
|
export const listItemOpenTriggerIcon: ComponentFunction<ListStyleProps> = (_props, ...etc) => {
|
|
33
33
|
return mx(getSize(5), ...etc);
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
import { type ComponentFunction, type Elevation, type Theme } from '@dxos/ui-types';
|
|
6
6
|
|
|
7
|
-
import { dataDisabled
|
|
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
|
-
|
|
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 '../../
|
|
8
|
-
import { mx } from '../../util';
|
|
7
|
+
import { mx, messageValence } from '../../util';
|
|
9
8
|
|
|
10
9
|
export type MessageStyleProps = {
|
|
11
10
|
valence?: MessageValence;
|
|
@@ -21,7 +20,7 @@ export const messageHeader: ComponentFunction<MessageStyleProps> = (_, etc) => {
|
|
|
21
20
|
};
|
|
22
21
|
|
|
23
22
|
export const messageTitle: ComponentFunction<MessageStyleProps> = (_, etc) => {
|
|
24
|
-
return mx('col-start-2
|
|
23
|
+
return mx('col-start-2 gap-trim-sm [&>svg]:inline-block', etc);
|
|
25
24
|
};
|
|
26
25
|
|
|
27
26
|
export const messageIcon: ComponentFunction<MessageStyleProps> = (_, etc) => {
|
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import { type ComponentFunction, type Elevation, type Theme } from '@dxos/ui-types';
|
|
6
6
|
|
|
7
|
-
import {
|
|
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
|
-
|
|
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
|
-
'
|
|
26
|
+
'grid grid-rows-[1fr] min-h-0 min-w-popover-min-width',
|
|
28
27
|
(constrainBlock || constrainInline) && 'overflow-hidden',
|
|
29
|
-
|
|
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
|
|
13
|
-
|
|
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
|
|
36
|
+
export const scrollAreaRoot: ComponentFunction<ScrollAreaStyleProps> = ({ orientation }, ...etc) =>
|
|
25
37
|
mx(
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
orientation === '
|
|
30
|
-
orientation === '
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
// Apply col-span-full only when inside a Column.Root grid (detected via dx-column marker).
|
|
34
|
-
'[.dx-
|
|
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,
|
|
55
|
+
{ orientation, centered, padding, snap, autoHide },
|
|
56
56
|
...etc
|
|
57
|
-
) =>
|
|
58
|
-
mx(
|
|
59
|
-
'h-
|
|
57
|
+
) => {
|
|
58
|
+
return mx(
|
|
59
|
+
'flex-1 min-h-0 w-full',
|
|
60
60
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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 {
|
|
8
|
-
import { mx } from '../../util';
|
|
7
|
+
import { mx, surfaceShadow, surfaceZIndex } from '../../util';
|
|
9
8
|
|
|
10
9
|
export type SelectStyleProps = Partial<{
|
|
11
10
|
elevation: Elevation;
|
|
@@ -28,7 +27,7 @@ export const selectItem: ComponentFunction<SelectStyleProps> = (_props, ...etc)
|
|
|
28
27
|
'flex items-center min-h-[2rem] px-3 py-1 gap-2',
|
|
29
28
|
'text-base-surface-text leading-none select-none outline-hidden',
|
|
30
29
|
'[&>svg]:invisible [&[data-state=checked]>svg]:visible',
|
|
31
|
-
|
|
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
|
|
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> = ({
|
|
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-
|
|
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 {
|
|
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
|
-
|
|
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',
|
|
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 '../../
|
|
8
|
-
import { mx } from '../../util';
|
|
7
|
+
import { mx, surfaceShadow, surfaceZIndex } from '../../util';
|
|
9
8
|
|
|
10
9
|
export type TooltipStyleProps = Partial<{
|
|
11
10
|
elevation: Elevation;
|
|
@@ -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(
|
|
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);
|
package/src/theme/index.ts
CHANGED
|
@@ -6,25 +6,66 @@ import { type ComponentFunction } from '@dxos/ui-types';
|
|
|
6
6
|
|
|
7
7
|
import { mx } from '../../util';
|
|
8
8
|
|
|
9
|
-
|
|
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<
|
|
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
|
-
*
|
|
21
|
-
*
|
|
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
|
|
24
|
-
mx('
|
|
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
|
-
|
|
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
|
-
|
|
9
|
+
type Size = 'lg' | 'md' | 'sm';
|
|
10
10
|
|
|
11
|
-
|
|
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
|
-
'
|
|
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<
|
|
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<
|
|
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<
|
|
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,
|
package/src/theme/theme.ts
CHANGED
|
@@ -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