@dxos/ui-theme 0.8.4-main.bc674ce → 0.8.4-main.ef1bc66f44

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 (91) hide show
  1. package/dist/lib/browser/index.mjs +298 -203
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +298 -203
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/plugin/node-cjs/{chunk-ZVALPM6U.cjs → chunk-YBWOZKXY.cjs} +41 -26
  8. package/dist/plugin/node-cjs/chunk-YBWOZKXY.cjs.map +7 -0
  9. package/dist/plugin/node-cjs/config/tailwind.cjs +2 -2
  10. package/dist/plugin/node-cjs/config/tailwind.cjs.map +1 -1
  11. package/dist/plugin/node-cjs/meta.json +1 -1
  12. package/dist/plugin/node-cjs/plugins/esbuild-plugin.cjs +2 -2
  13. package/dist/plugin/node-cjs/plugins/plugin.cjs +3 -3
  14. package/dist/plugin/node-cjs/theme.css +38 -78
  15. package/dist/plugin/node-cjs/theme.css.map +3 -3
  16. package/dist/plugin/node-esm/{chunk-HJE6EZWE.mjs → chunk-LTGUAP22.mjs} +42 -27
  17. package/dist/plugin/node-esm/chunk-LTGUAP22.mjs.map +7 -0
  18. package/dist/plugin/node-esm/config/tailwind.mjs +1 -1
  19. package/dist/plugin/node-esm/meta.json +1 -1
  20. package/dist/plugin/node-esm/plugins/esbuild-plugin.mjs +1 -1
  21. package/dist/plugin/node-esm/plugins/plugin.mjs +1 -1
  22. package/dist/plugin/node-esm/theme.css +38 -78
  23. package/dist/plugin/node-esm/theme.css.map +3 -3
  24. package/dist/types/src/config/tailwind.d.ts.map +1 -1
  25. package/dist/types/src/config/tokens/index.d.ts +1 -484
  26. package/dist/types/src/config/tokens/index.d.ts.map +1 -1
  27. package/dist/types/src/config/tokens/lengths.d.ts +12 -9
  28. package/dist/types/src/config/tokens/lengths.d.ts.map +1 -1
  29. package/dist/types/src/config/tokens/semantic-colors.d.ts +5 -0
  30. package/dist/types/src/config/tokens/semantic-colors.d.ts.map +1 -1
  31. package/dist/types/src/config/tokens/sememes-system.d.ts +5 -0
  32. package/dist/types/src/config/tokens/sememes-system.d.ts.map +1 -1
  33. package/dist/types/src/config/tokens/sizes.d.ts +2 -0
  34. package/dist/types/src/config/tokens/sizes.d.ts.map +1 -1
  35. package/dist/types/src/config/tokens/tokens.d.ts +498 -0
  36. package/dist/types/src/config/tokens/tokens.d.ts.map +1 -0
  37. package/dist/types/src/index.d.ts +3 -2
  38. package/dist/types/src/index.d.ts.map +1 -1
  39. package/dist/types/src/styles/components/dialog.d.ts +2 -0
  40. package/dist/types/src/styles/components/dialog.d.ts.map +1 -1
  41. package/dist/types/src/styles/components/index.d.ts +1 -0
  42. package/dist/types/src/styles/components/index.d.ts.map +1 -1
  43. package/dist/types/src/styles/components/main.d.ts +0 -5
  44. package/dist/types/src/styles/components/main.d.ts.map +1 -1
  45. package/dist/types/src/styles/components/menu.d.ts.map +1 -1
  46. package/dist/types/src/styles/components/scroll-area.d.ts +12 -5
  47. package/dist/types/src/styles/components/scroll-area.d.ts.map +1 -1
  48. package/dist/types/src/styles/components/skeleton.d.ts +7 -0
  49. package/dist/types/src/styles/components/skeleton.d.ts.map +1 -0
  50. package/dist/types/src/styles/components/toolbar.d.ts +4 -4
  51. package/dist/types/src/styles/components/toolbar.d.ts.map +1 -1
  52. package/dist/types/src/styles/index.d.ts +2 -1
  53. package/dist/types/src/styles/index.d.ts.map +1 -1
  54. package/dist/types/src/styles/primitives/container.d.ts +15 -0
  55. package/dist/types/src/styles/primitives/container.d.ts.map +1 -0
  56. package/dist/types/src/styles/primitives/index.d.ts +2 -0
  57. package/dist/types/src/styles/primitives/index.d.ts.map +1 -0
  58. package/dist/types/src/styles/theme.d.ts +3 -3
  59. package/dist/types/src/styles/theme.d.ts.map +1 -1
  60. package/dist/types/tsconfig.tsbuildinfo +1 -1
  61. package/package.json +5 -5
  62. package/src/Tokens.stories.tsx +2 -2
  63. package/src/config/tailwind.ts +4 -3
  64. package/src/config/tokens/index.ts +2 -88
  65. package/src/config/tokens/lengths.ts +14 -5
  66. package/src/config/tokens/sememes-system.ts +6 -1
  67. package/src/config/tokens/sizes.ts +2 -0
  68. package/src/config/tokens/tokens.ts +90 -0
  69. package/src/index.ts +3 -2
  70. package/src/styles/components/dialog.ts +9 -1
  71. package/src/styles/components/index.ts +1 -0
  72. package/src/styles/components/main.ts +0 -4
  73. package/src/styles/components/menu.ts +2 -10
  74. package/src/styles/components/popover.ts +3 -3
  75. package/src/styles/components/scroll-area.ts +70 -23
  76. package/src/styles/components/skeleton.ts +23 -0
  77. package/src/styles/components/toolbar.ts +16 -9
  78. package/src/styles/components/tooltip.ts +2 -2
  79. package/src/styles/fragments/size.ts +2 -2
  80. package/src/styles/index.ts +2 -1
  81. package/src/styles/layers/dialog.css +1 -5
  82. package/src/styles/layers/index.css +1 -0
  83. package/src/styles/layers/main.css +29 -73
  84. package/src/styles/layers/scrollbar.css +10 -0
  85. package/src/styles/layers/size.css +17 -19
  86. package/src/styles/layers/tokens.css +2 -1
  87. package/src/styles/primitives/container.ts +33 -0
  88. package/src/styles/primitives/index.ts +5 -0
  89. package/src/styles/theme.ts +29 -5
  90. package/dist/plugin/node-cjs/chunk-ZVALPM6U.cjs.map +0 -7
  91. package/dist/plugin/node-esm/chunk-HJE6EZWE.mjs.map +0 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/ui-theme",
3
- "version": "0.8.4-main.bc674ce",
3
+ "version": "0.8.4-main.ef1bc66f44",
4
4
  "description": "A set of design system tokens to use with DXOS UI.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -64,16 +64,16 @@
64
64
  "tailwindcss": "~3.4.1",
65
65
  "tailwindcss-logical": "^3.0.0",
66
66
  "tailwindcss-radix": "^2.8.0",
67
- "@dxos/util": "0.8.4-main.bc674ce",
68
- "@dxos/node-std": "0.8.4-main.bc674ce"
67
+ "@dxos/node-std": "0.8.4-main.ef1bc66f44",
68
+ "@dxos/util": "0.8.4-main.ef1bc66f44"
69
69
  },
70
70
  "devDependencies": {
71
71
  "@ch-ui/colors": "1.2.1",
72
72
  "@types/lodash.merge": "^4.6.6",
73
73
  "@types/postcss-import": "^14.0.3",
74
- "esbuild": "0.25.10",
74
+ "esbuild": "0.25.11",
75
75
  "vite": "7.1.9",
76
- "@dxos/ui-types": "0.8.4-main.bc674ce"
76
+ "@dxos/ui-types": "0.8.4-main.ef1bc66f44"
77
77
  },
78
78
  "publishConfig": {
79
79
  "access": "public"
@@ -14,7 +14,7 @@ const Swatch = ({ variableName, value, semantic, physical }: TokenAudit<HelicalA
14
14
  const [luminosity, alpha] = parseAlphaLuminosity(value);
15
15
 
16
16
  return (
17
- <div className='shrink-0 is-40 flex flex-col rounded overflow-hidden'>
17
+ <div className='shrink-0 is-48 flex flex-col rounded overflow-hidden'>
18
18
  <dd className='aspect-video' style={{ background: `var(${variableName})` }}></dd>
19
19
  <dt className='text-xs bg-baseSurface grow pli-2 plb-1'>
20
20
  <p className='text-sm'>
@@ -26,7 +26,7 @@ const Swatch = ({ variableName, value, semantic, physical }: TokenAudit<HelicalA
26
26
  {semantic.length > 0 && (
27
27
  <ul>
28
28
  {semantic.map(({ sememeName, conditionId }) => {
29
- const sememeCondition = `${sememeName} / ${conditionId}`;
29
+ const sememeCondition = `${conditionId}:${sememeName}`;
30
30
  return <li key={sememeCondition}>{sememeCondition}</li>;
31
31
  })}
32
32
  </ul>
@@ -38,12 +38,13 @@ export const tailwindConfig = ({
38
38
  {
39
39
  // Generates is-card-default-width, is-card-min-width, etc.
40
40
  spacing: {
41
+ 'prose-max-width': 'var(--dx-prose-max-width)',
42
+ 'container-max-width': 'var(--dx-container-max-width)',
41
43
  'card-default-width': 'var(--dx-card-default-width)',
42
44
  'card-min-width': 'var(--dx-card-min-width)',
43
45
  'card-max-width': 'var(--dx-card-max-width)',
44
- 'container-max-width': 'var(--dx-container-max-width)',
45
- 'popover-max-width': 'var(--dx-popover-max-width)',
46
- 'prose-max-width': 'var(--dx-prose-max-width)',
46
+ 'card-min-height': 'var(--dx-card-min-height)',
47
+ 'card-max-height': 'var(--dx-card-max-height)',
47
48
  },
48
49
  backgroundImage: {
49
50
  'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))',
@@ -1,92 +1,6 @@
1
1
  //
2
- // Copyright 2024 DXOS.org
2
+ // Copyright 2026 DXOS.org
3
3
  //
4
4
 
5
- import { type TailwindAdapterConfig } from '@ch-ui/tailwind-tokens';
6
- import adapter from '@ch-ui/tailwind-tokens';
7
- import { type TokenSet } from '@ch-ui/tokens';
8
-
9
- import { aliasColors } from './alias-colors';
10
- import { lengthsFacet, maxSizesFacet } from './lengths';
11
- import { huePalettes, physicalColors } from './physical-colors';
12
- import { semanticColors } from './semantic-colors';
13
- import { systemAliases, systemSememes } from './sememes-system';
14
-
15
5
  export * from './sizes';
16
-
17
- export const hues = Object.keys(huePalettes);
18
-
19
- export const tokenSet = {
20
- colors: {
21
- physical: physicalColors,
22
- semantic: semanticColors,
23
- alias: aliasColors,
24
- },
25
- lengths: lengthsFacet,
26
- maxSizes: maxSizesFacet,
27
- } satisfies TokenSet;
28
-
29
- const adapterConfig: TailwindAdapterConfig = {
30
- colors: {
31
- facet: 'colors',
32
- disposition: 'overwrite',
33
- tokenization: 'recursive',
34
- },
35
- borderWidth: {
36
- facet: 'lengths',
37
- disposition: 'extend',
38
- tokenization: 'omit-series',
39
- },
40
- ringWidth: {
41
- facet: 'lengths',
42
- disposition: 'extend',
43
- tokenization: 'omit-series',
44
- },
45
- ringOffsetWidth: {
46
- facet: 'lengths',
47
- disposition: 'extend',
48
- tokenization: 'omit-series',
49
- },
50
- outlineWidth: {
51
- facet: 'lengths',
52
- disposition: 'extend',
53
- tokenization: 'omit-series',
54
- },
55
- spacing: {
56
- facet: 'lengths',
57
- disposition: 'extend',
58
- tokenization: 'keep-series',
59
- },
60
- };
61
-
62
- export const userDefaultTokenSet = {
63
- colors: {
64
- physical: {
65
- definitions: {
66
- series: {
67
- neutral: physicalColors.definitions!.series!.neutral,
68
- primary: physicalColors.definitions!.series!.primary,
69
- },
70
- accompanyingSeries: physicalColors.definitions!.accompanyingSeries,
71
- },
72
- conditions: physicalColors.conditions,
73
- series: {
74
- neutral: physicalColors.series.neutral,
75
- primary: physicalColors.series.primary,
76
- },
77
- namespace: physicalColors.namespace,
78
- },
79
- semantic: {
80
- conditions: semanticColors.conditions,
81
- sememes: systemSememes,
82
- namespace: semanticColors.namespace,
83
- },
84
- alias: {
85
- conditions: aliasColors.conditions,
86
- aliases: systemAliases,
87
- namespace: aliasColors.namespace,
88
- },
89
- },
90
- } satisfies TokenSet;
91
-
92
- export const tokensTailwindConfig = adapter(tokenSet, adapterConfig);
6
+ export * from './tokens';
@@ -5,7 +5,13 @@
5
5
 
6
6
  import { type Facet, type LinearPhysicalLayer } from '@ch-ui/tokens';
7
7
 
8
- import { cardDefaultInlineSize, cardMaxInlineSize, cardMinInlineSize } from './sizes';
8
+ import {
9
+ cardDefaultInlineSize,
10
+ cardMaxBlockSize,
11
+ cardMaxInlineSize,
12
+ cardMinBlockSize,
13
+ cardMinInlineSize,
14
+ } from './sizes';
9
15
 
10
16
  export const lengthsFacet = {
11
17
  physical: {
@@ -58,11 +64,13 @@ export const lengthsFacet = {
58
64
  noLine: { fine: ['focusOffset'] },
59
65
  hairLine: { fine: ['modalLine', 'landmarkLine', 'positionedLine', 'gridGap', 'gridFocusIndicatorWidth'] },
60
66
  thickLine: { fine: ['focusLine'], gridFocusStack: ['gridFocusIndicatorWidth'] },
61
- trimXs: { fine: ['cardSpacingChrome', 'labelSpacingBlock', 'inputSpacingBlock'] }, // TODO(burdon): Remove need for this.
62
- trimSm: { fine: ['cardSpacingInline', 'cardSpacingBlock', 'cardSpacingGap'] },
63
- trimMd: { coarse: ['cardSpacingInline', 'cardSpacingBlock', 'cardSpacingGap'] },
64
67
  inputFine: { fine: ['iconButtonPadding'] },
65
68
  inputCoarse: { coarse: ['iconButtonPadding'] },
69
+
70
+ trimXs: { fine: ['cardSpacingChrome', 'labelSpacingBlock', 'inputSpacingBlock'] },
71
+ // TODO(burdon): Remove?
72
+ trimSm: { fine: ['cardSpacingInline', 'cardSpacingBlock', 'cardSpacingGap'] },
73
+ trimMd: { coarse: ['cardSpacingInline', 'cardSpacingBlock', 'cardSpacingGap'] },
66
74
  },
67
75
  },
68
76
  } satisfies Facet;
@@ -88,10 +96,11 @@ export const maxSizesFacet = {
88
96
  sememes: {
89
97
  'prose-max-width': { root: ['size', 50] },
90
98
  'container-max-width': { root: ['size', 50] },
91
- 'popover-max-width': { root: ['size', cardDefaultInlineSize] },
92
99
  'card-default-width': { root: ['size', cardDefaultInlineSize] },
93
100
  'card-min-width': { root: ['size', cardMinInlineSize] },
94
101
  'card-max-width': { root: ['size', cardMaxInlineSize] },
102
+ 'card-min-height': { root: ['size', cardMinBlockSize] },
103
+ 'card-max-height': { root: ['size', cardMaxBlockSize] },
95
104
  },
96
105
  },
97
106
  } satisfies Facet;
@@ -113,9 +113,14 @@ export const systemSememes = {
113
113
  separatorBase: contrastCadence(3, 2),
114
114
  separatorGroup: contrastCadence(3, 2.5),
115
115
  separatorModal: contrastCadence(3, 3),
116
-
117
116
  subduedSeparator: contrastCadence(3, 1),
118
117
 
118
+ scrollbarTrack: contrastCadence(0),
119
+ scrollbarThumbSubdued: contrastCadence(1, 1),
120
+ scrollbarThumb: contrastCadence(2.5, 2.5),
121
+ scrollbarThumbHover: contrastCadence(3.5, 3.5),
122
+ scrollbarThumbActive: contrastCadence(4.5, 4.5),
123
+
119
124
  unAccent: {
120
125
  light: ['neutral', 400],
121
126
  dark: ['neutral', 400],
@@ -8,3 +8,5 @@
8
8
  export const cardMinInlineSize = 18;
9
9
  export const cardDefaultInlineSize = 20; // 320px
10
10
  export const cardMaxInlineSize = 22;
11
+ export const cardMinBlockSize = 18;
12
+ export const cardMaxBlockSize = 30;
@@ -0,0 +1,90 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { type TailwindAdapterConfig } from '@ch-ui/tailwind-tokens';
6
+ import adapter from '@ch-ui/tailwind-tokens';
7
+ import { type TokenSet } from '@ch-ui/tokens';
8
+
9
+ import { aliasColors } from './alias-colors';
10
+ import { lengthsFacet, maxSizesFacet } from './lengths';
11
+ import { huePalettes, physicalColors } from './physical-colors';
12
+ import { semanticColors } from './semantic-colors';
13
+ import { systemAliases, systemSememes } from './sememes-system';
14
+
15
+ export const hues = Object.keys(huePalettes);
16
+
17
+ export const tokenSet = {
18
+ colors: {
19
+ physical: physicalColors,
20
+ semantic: semanticColors,
21
+ alias: aliasColors,
22
+ },
23
+ lengths: lengthsFacet,
24
+ maxSizes: maxSizesFacet,
25
+ } satisfies TokenSet;
26
+
27
+ const adapterConfig: TailwindAdapterConfig = {
28
+ colors: {
29
+ facet: 'colors',
30
+ disposition: 'overwrite',
31
+ tokenization: 'recursive',
32
+ },
33
+ borderWidth: {
34
+ facet: 'lengths',
35
+ disposition: 'extend',
36
+ tokenization: 'omit-series',
37
+ },
38
+ ringWidth: {
39
+ facet: 'lengths',
40
+ disposition: 'extend',
41
+ tokenization: 'omit-series',
42
+ },
43
+ ringOffsetWidth: {
44
+ facet: 'lengths',
45
+ disposition: 'extend',
46
+ tokenization: 'omit-series',
47
+ },
48
+ outlineWidth: {
49
+ facet: 'lengths',
50
+ disposition: 'extend',
51
+ tokenization: 'omit-series',
52
+ },
53
+ spacing: {
54
+ facet: 'lengths',
55
+ disposition: 'extend',
56
+ tokenization: 'keep-series',
57
+ },
58
+ };
59
+
60
+ export const userDefaultTokenSet = {
61
+ colors: {
62
+ physical: {
63
+ definitions: {
64
+ series: {
65
+ neutral: physicalColors.definitions!.series!.neutral,
66
+ primary: physicalColors.definitions!.series!.primary,
67
+ },
68
+ accompanyingSeries: physicalColors.definitions!.accompanyingSeries,
69
+ },
70
+ conditions: physicalColors.conditions,
71
+ series: {
72
+ neutral: physicalColors.series.neutral,
73
+ primary: physicalColors.series.primary,
74
+ },
75
+ namespace: physicalColors.namespace,
76
+ },
77
+ semantic: {
78
+ conditions: semanticColors.conditions,
79
+ sememes: systemSememes,
80
+ namespace: semanticColors.namespace,
81
+ },
82
+ alias: {
83
+ conditions: aliasColors.conditions,
84
+ aliases: systemAliases,
85
+ namespace: aliasColors.namespace,
86
+ },
87
+ },
88
+ } satisfies TokenSet;
89
+
90
+ export const tokensTailwindConfig = adapter(tokenSet, adapterConfig);
package/src/index.ts CHANGED
@@ -2,14 +2,15 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import { type TailwindConfig, tailwindConfig } from './config';
5
+ import { tailwindConfig } from './config';
6
6
 
7
+ // TODO(burdon): Factor out public vs. internals.
7
8
  export { cardDefaultInlineSize, cardMinInlineSize, cardMaxInlineSize, hues, userDefaultTokenSet } from './config';
8
9
  export * from './styles';
9
10
  export * from './types';
10
11
  export * from './util';
11
12
 
12
- const tokens: TailwindConfig['theme'] = tailwindConfig({}).theme;
13
+ const { theme: tokens } = tailwindConfig({});
13
14
 
14
15
  export { tokens };
15
16
 
@@ -27,7 +27,7 @@ export const dialogOverlay: ComponentFunction<DialogStyleProps> = (_props, ...et
27
27
 
28
28
  export const dialogContent: ComponentFunction<DialogStyleProps> = ({ inOverlayLayout, size }, ...etc) => {
29
29
  return mx(
30
- '@container dx-dialog__content dx-focus-ring modal-surface density-coarse is-full gap-2',
30
+ '@container dx-dialog__content dx-focus-ring modal-surface density-coarse is-full gap-4',
31
31
  !inOverlayLayout && 'fixed z-50 top-[50%] left-[50%] -translate-x-[50%] -translate-y-[50%]',
32
32
  size && sizeMap[size],
33
33
  ...etc,
@@ -37,6 +37,12 @@ export const dialogContent: ComponentFunction<DialogStyleProps> = ({ inOverlayLa
37
37
  export const dialogHeader: ComponentFunction<DialogStyleProps> = (_props, ...etc) =>
38
38
  mx('dx-dialog__header flex items-center justify-between', ...etc);
39
39
 
40
+ export const dialogBody: ComponentFunction<DialogStyleProps> = (_props, ...etc) =>
41
+ mx('dx-dialog__body flex flex-col gap-4 bs-full overflow-hidden', ...etc);
42
+
43
+ export const dialogActionBar: ComponentFunction<DialogStyleProps> = (_props, ...etc) =>
44
+ mx('dx-dialog__actionbar flex items-center density-coarse', ...etc);
45
+
40
46
  export const dialogTitle: ComponentFunction<DialogStyleProps> = ({ srOnly }, ...etc) =>
41
47
  mx('dx-dialog__title', srOnly && 'sr-only', ...etc);
42
48
 
@@ -47,6 +53,8 @@ export const dialogTheme: Theme<DialogStyleProps> = {
47
53
  overlay: dialogOverlay,
48
54
  content: dialogContent,
49
55
  header: dialogHeader,
56
+ body: dialogBody,
57
+ actionbar: dialogActionBar,
50
58
  title: dialogTitle,
51
59
  description: dialogDescription,
52
60
  };
@@ -19,6 +19,7 @@ export * from './popover';
19
19
  export * from './scroll-area';
20
20
  export * from './select';
21
21
  export * from './separator';
22
+ export * from './skeleton';
22
23
  export * from './status';
23
24
  export * from './tag';
24
25
  export * from './toast';
@@ -25,14 +25,10 @@ export const mainContent: ComponentFunction<MainStyleProps> = ({ bounce }, ...et
25
25
  export const mainSidebar: ComponentFunction<MainStyleProps> = (_, ...etc) =>
26
26
  mx('dx-main-sidebar', 'dx-focus-ring-inset-over-all', ...etc);
27
27
 
28
- export const mainDrawer: ComponentFunction<MainStyleProps> = (_, ...etc) =>
29
- mx('dx-main-drawer', 'dx-focus-ring-inset-over-all', ...etc);
30
-
31
28
  export const mainOverlay: ComponentFunction<MainStyleProps> = (_, ...etc) => mx('dx-main-overlay', ...etc);
32
29
 
33
30
  export const mainTheme = {
34
31
  content: mainContent,
35
32
  sidebar: mainSidebar,
36
- drawer: mainDrawer,
37
33
  overlay: mainOverlay,
38
34
  };
@@ -5,15 +5,7 @@
5
5
  import { type ComponentFunction, type Elevation, type Theme } from '@dxos/ui-types';
6
6
 
7
7
  import { mx } from '../../util';
8
- import {
9
- dataDisabled,
10
- descriptionText,
11
- modalSurface,
12
- popperMotion,
13
- subduedFocus,
14
- surfaceShadow,
15
- surfaceZIndex,
16
- } from '../fragments';
8
+ import { dataDisabled, descriptionText, modalSurface, subduedFocus, surfaceShadow, surfaceZIndex } from '../fragments';
17
9
 
18
10
  export type MenuStyleProps = Partial<{
19
11
  constrainBlockSize: boolean;
@@ -29,7 +21,7 @@ export const menuContent: ComponentFunction<MenuStyleProps> = ({ elevation }, ..
29
21
  surfaceZIndex({ elevation, level: 'menu' }),
30
22
  surfaceShadow({ elevation: 'positioned' }),
31
23
  modalSurface,
32
- popperMotion,
24
+ // popperMotion,
33
25
  ...etc,
34
26
  );
35
27
 
@@ -15,9 +15,9 @@ export type PopoverStyleProps = Partial<{
15
15
 
16
16
  export const popoverViewport: ComponentFunction<PopoverStyleProps> = ({ constrainBlock, constrainInline }, ...etc) =>
17
17
  mx(
18
- 'rounded-md',
19
- constrainBlock && 'max-bs-[--radix-popover-content-available-height] overflow-y-auto',
20
- constrainInline && 'max-is-[--radix-popover-content-available-width] overflow-x-auto',
18
+ 'flex flex-col rounded-md',
19
+ constrainBlock && 'max-bs-[--radix-popover-content-available-height] overflow-hidden',
20
+ constrainInline && 'max-is-[--radix-popover-content-available-width] overflow-hidden',
21
21
  ...etc,
22
22
  );
23
23
 
@@ -1,43 +1,90 @@
1
1
  //
2
- // Copyright 2023 DXOS.org
2
+ // Copyright 2026 DXOS.org
3
3
  //
4
4
 
5
- import { type ComponentFunction, type Theme } from '@dxos/ui-types';
5
+ import { type AllowedAxis, type ComponentFunction, type Theme } from '@dxos/ui-types';
6
6
 
7
7
  import { mx } from '../../util';
8
8
 
9
- export type ScrollAreaStyleProps = {};
9
+ export type ScrollAreaStyleProps = {
10
+ orientation?: AllowedAxis;
11
+ autoHide?: boolean;
12
+ margin?: boolean;
13
+ padding?: boolean;
14
+ thin?: boolean;
15
+ snap?: boolean;
16
+ };
10
17
 
11
- export const scrollAreaRoot: ComponentFunction<ScrollAreaStyleProps> = (_props, ...etc) =>
12
- mx('__bs-full __is-full overflow-hidden', ...etc);
18
+ export const scrollAreaRoot: ComponentFunction<ScrollAreaStyleProps> = ({ orientation, margin, thin }, ...etc) =>
19
+ mx(
20
+ 'overflow-hidden',
13
21
 
14
- export const scrollAreaViewport: ComponentFunction<ScrollAreaStyleProps> = (_props, ...etc) =>
15
- // mx('bs-full is-full [&>div]:is-full [&>div]:bs-auto', ...etc);
16
- mx('bs-full is-full [&>div]:table-fixed [&>div]:is-full', ...etc);
22
+ orientation === 'vertical' && 'group/scroll-v bs-full is-full min-bs-0',
23
+ orientation === 'horizontal' && 'group/scroll-h bs-full is-full min-is-0',
24
+ orientation === 'all' && 'group/scroll-all bs-full is-full min-bs-0 min-is-0',
25
+
26
+ // Balance left/right, top/bottom "margin" with scrollbar.
27
+ margin && [
28
+ orientation === 'vertical' && (thin ? 'pis-[4px]' : 'pis-[8px]'),
29
+ orientation === 'horizontal' && (thin ? 'pbs-[4px]' : 'pbs-[8px]'),
30
+ orientation === 'all' && (thin ? 'pis-[4px] pbs-[8px]' : 'pis-[8px] pbs-[8px]'),
31
+ ],
17
32
 
18
- export const scrollAreaScrollbar: ComponentFunction<ScrollAreaStyleProps> = (_props, ...etc) =>
19
- mx(
20
- 'flex select-none touch-none p-0.5 ease-out',
21
- 'data-[orientation=vertical]:is-1.5 sm:data-[orientation=vertical]:data-[variant=coarse]:is-3',
22
- 'data-[orientation=horizontal]:flex-col data-[orientation=horizontal]:bs-1.5 sm:data-[orientation=horizontal]:data-[variant=coarse]:bs-3',
23
- 'sm:data-[variant=coarse]:bg-separator rounded-full',
24
- '[&>div]:bg-unAccent sm:[&[data-variant=coarse]>div]:bg-attention',
25
33
  ...etc,
26
34
  );
27
35
 
28
- export const scrollAreaThumb: ComponentFunction<ScrollAreaStyleProps> = (_props, ...etc) =>
36
+ /**
37
+ * NOTE: The browser reserves space for scrollbars.
38
+ */
39
+ export const scrollAreaViewport: ComponentFunction<ScrollAreaStyleProps> = (
40
+ { orientation, autoHide, padding, snap, thin },
41
+ ...etc
42
+ ) =>
29
43
  mx(
30
- 'flex-1 rounded-full relative',
31
- "before:content-[''] before:absolute before:top-1/2 before:left-1/2 before:-translate-x-1/2 before:-translate-y-1/2 before:is-full before:bs-full before:min-w-[6px] before:min-h-[6px]",
44
+ 'bs-full is-full',
45
+
46
+ orientation === 'vertical' && 'flex flex-col overflow-y-scroll',
47
+ orientation === 'horizontal' && 'flex overflow-x-scroll',
48
+ orientation === 'all' && 'overflow-scroll',
49
+
50
+ thin
51
+ ? '[&::-webkit-scrollbar]:is-[4px] [&::-webkit-scrollbar]:bs-[4px]'
52
+ : '[&::-webkit-scrollbar]:is-[8px] [&::-webkit-scrollbar]:bs-[8px]',
53
+
54
+ // '[&::-webkit-scrollbar-thumb]:rounded-full',
55
+ '[&::-webkit-scrollbar-thumb]:bg-transparent',
56
+ '[&::-webkit-scrollbar-corner]:bg-transparent',
57
+
58
+ // TODO(burdon): Define token.
59
+ autoHide
60
+ ? [
61
+ orientation === 'vertical' && 'group-hover/scroll-v:[&::-webkit-scrollbar-thumb]:bg-subduedSeparator',
62
+ orientation === 'horizontal' && 'group-hover/scroll-h:[&::-webkit-scrollbar-thumb]:bg-subduedSeparator',
63
+ orientation === 'all' && 'group-hover/scroll-all:[&::-webkit-scrollbar-thumb]:bg-subduedSeparator',
64
+ ]
65
+ : [
66
+ orientation === 'vertical' && '[&::-webkit-scrollbar-thumb]:bg-subduedSeparator',
67
+ orientation === 'horizontal' && '[&::-webkit-scrollbar-thumb]:bg-subduedSeparator',
68
+ orientation === 'all' && '[&::-webkit-scrollbar-thumb]:bg-subduedSeparator',
69
+ ],
70
+
71
+ // TODO(burdon): Are scrollbars reserved on native devices?
72
+ padding && [
73
+ orientation === 'vertical' && 'pli-[4px]',
74
+ orientation === 'horizontal' && 'pbe-[4px]',
75
+ orientation === 'all' && 'pis-[4px] pbe-[4px]',
76
+ ],
77
+
78
+ snap && [
79
+ orientation === 'vertical' && 'snap-y snap-mandatory',
80
+ orientation === 'horizontal' && 'snap-x snap-mandatory',
81
+ orientation === 'all' && 'snap-both snap-mandatory',
82
+ ],
83
+
32
84
  ...etc,
33
85
  );
34
86
 
35
- export const scrollAreaCorner: ComponentFunction<ScrollAreaStyleProps> = (_props, ...etc) => mx(...etc);
36
-
37
87
  export const scrollAreaTheme: Theme<ScrollAreaStyleProps> = {
38
88
  root: scrollAreaRoot,
39
89
  viewport: scrollAreaViewport,
40
- scrollbar: scrollAreaScrollbar,
41
- thumb: scrollAreaThumb,
42
- corner: scrollAreaCorner,
43
90
  };
@@ -0,0 +1,23 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import type { ComponentFunction, Theme } from '@dxos/ui-types';
6
+
7
+ import { mx } from '../../util';
8
+
9
+ export type SkeletonStyleProps = {
10
+ variant?: 'default' | 'circle' | 'text';
11
+ };
12
+
13
+ export const skeletonRoot: ComponentFunction<SkeletonStyleProps> = ({ variant = 'default' }, ...etc) =>
14
+ mx(
15
+ 'animate-pulse bg-neutral-250 dark:bg-neutral-750 rounded-md',
16
+ variant === 'circle' && 'rounded-full',
17
+ variant === 'text' && 'rounded',
18
+ ...etc,
19
+ );
20
+
21
+ export const skeletonTheme: Theme<SkeletonStyleProps> = {
22
+ root: skeletonRoot,
23
+ };
@@ -2,21 +2,28 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import { type ComponentFunction, type Theme } from '@dxos/ui-types';
5
+ import { type ComponentFunction, type Density, type Theme } from '@dxos/ui-types';
6
6
 
7
7
  import { mx } from '../../util';
8
8
  import { textBlockWidth } from '../fragments';
9
9
 
10
- export type ToolbarStyleProps = Partial<{ layoutManaged: boolean; disabled: boolean }>;
10
+ export type ToolbarStyleProps = Partial<{
11
+ density: Density;
12
+ disabled: boolean;
13
+ layoutManaged: boolean;
14
+ }>;
11
15
 
12
16
  export const toolbarLayout =
13
- 'is-full shrink-0 flex flex-nowrap items-center gap-1 p-1 overflow-x-auto scrollbar-none contain-layout';
14
-
15
- // TODO(burdon): Detect: &:not([data-is-attention-source]_&)]:
16
- export const toolbarInactive = '*:opacity-20';
17
-
18
- export const toolbarRoot: ComponentFunction<ToolbarStyleProps> = ({ layoutManaged, disabled }, ...etc) => {
19
- return mx('bg-toolbarSurface dx-toolbar', !layoutManaged && toolbarLayout, disabled && toolbarInactive, ...etc);
17
+ 'is-full shrink-0 flex flex-nowrap p-1 gap-1 items-center overflow-x-auto scrollbar-none contain-layout';
18
+
19
+ export const toolbarRoot: ComponentFunction<ToolbarStyleProps> = ({ density, disabled, layoutManaged }, ...etc) => {
20
+ return mx(
21
+ 'bg-toolbarSurface dx-toolbar',
22
+ density === 'coarse' && 'bs-[var(--rail-size)] !pli-3',
23
+ disabled && '*:opacity-20',
24
+ !layoutManaged && toolbarLayout,
25
+ ...etc,
26
+ );
20
27
  };
21
28
 
22
29
  export const toolbarInner: ComponentFunction<ToolbarStyleProps> = ({ layoutManaged }, ...etc) => {
@@ -5,7 +5,7 @@
5
5
  import { type ComponentFunction, type Elevation, type Theme } from '@dxos/ui-types';
6
6
 
7
7
  import { mx } from '../../util';
8
- import { chromeText, popperMotion, surfaceShadow, surfaceZIndex } from '../fragments';
8
+ import { chromeText, surfaceShadow, surfaceZIndex } from '../fragments';
9
9
 
10
10
  export type TooltipStyleProps = Partial<{
11
11
  elevation: Elevation;
@@ -14,7 +14,7 @@ export type TooltipStyleProps = Partial<{
14
14
  export const tooltipContent: ComponentFunction<TooltipStyleProps> = ({ elevation }, ...etc) =>
15
15
  mx(
16
16
  'inline-flex items-center rounded-sm plb-1 pli-2 max-is-64 bg-inverseSurface text-inverseSurfaceText',
17
- popperMotion,
17
+ // popperMotion,
18
18
  surfaceShadow({ elevation: 'positioned' }),
19
19
  surfaceZIndex({ elevation, level: 'tooltip' }),
20
20
  chromeText,
@@ -8,7 +8,7 @@ import { mx } from '../../util';
8
8
 
9
9
  export const sizeWidthMap = new Map<Size, string>([
10
10
  [0, 'is-0'],
11
- ['px', 'is-px'],
11
+ ['px', 'is-px'], // 1px
12
12
  [0.5, 'is-0.5'],
13
13
  [1, 'is-1'],
14
14
  [1.5, 'is-1.5'],
@@ -46,7 +46,7 @@ export const sizeWidthMap = new Map<Size, string>([
46
46
 
47
47
  export const sizeHeightMap = new Map<Size, string>([
48
48
  [0, 'bs-0'],
49
- ['px', 'bs-px'],
49
+ ['px', 'bs-px'], // 1px
50
50
  [0.5, 'bs-0.5'],
51
51
  [1, 'bs-1'],
52
52
  [1.5, 'bs-1.5'],
@@ -2,6 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export * from './fragments';
6
5
  export * from './components';
6
+ export * from './fragments';
7
+ export * from './primitives';
7
8
  export * from './theme';