@ohos-ports/dxos-react-ui-theme 0.8.3-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +8 -0
- package/README.md +25 -0
- package/README.yml +1 -0
- package/dist/lib/browser/index.mjs +3199 -0
- package/dist/lib/browser/index.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -0
- package/dist/plugin/node/chunk-3IKFINB6.cjs +1500 -0
- package/dist/plugin/node/chunk-3IKFINB6.cjs.map +7 -0
- package/dist/plugin/node/chunk-QA5KMUXP.cjs +70 -0
- package/dist/plugin/node/chunk-QA5KMUXP.cjs.map +7 -0
- package/dist/plugin/node/config/tailwind.cjs +29 -0
- package/dist/plugin/node/config/tailwind.cjs.map +7 -0
- package/dist/plugin/node/meta.json +1 -0
- package/dist/plugin/node/plugins/esbuild-plugin.cjs +90 -0
- package/dist/plugin/node/plugins/esbuild-plugin.cjs.map +7 -0
- package/dist/plugin/node/plugins/plugin.cjs +123 -0
- package/dist/plugin/node/plugins/plugin.cjs.map +7 -0
- package/dist/plugin/node/theme.css +1223 -0
- package/dist/plugin/node/theme.css.map +7 -0
- package/dist/plugin/node-esm/chunk-LNTZCFPD.mjs +1493 -0
- package/dist/plugin/node-esm/chunk-LNTZCFPD.mjs.map +7 -0
- package/dist/plugin/node-esm/chunk-TFKSVC5U.mjs +50 -0
- package/dist/plugin/node-esm/chunk-TFKSVC5U.mjs.map +7 -0
- package/dist/plugin/node-esm/config/tailwind.mjs +8 -0
- package/dist/plugin/node-esm/config/tailwind.mjs.map +7 -0
- package/dist/plugin/node-esm/meta.json +1 -0
- package/dist/plugin/node-esm/plugins/esbuild-plugin.mjs +63 -0
- package/dist/plugin/node-esm/plugins/esbuild-plugin.mjs.map +7 -0
- package/dist/plugin/node-esm/plugins/plugin.mjs +97 -0
- package/dist/plugin/node-esm/plugins/plugin.mjs.map +7 -0
- package/dist/plugin/node-esm/theme.css +1223 -0
- package/dist/plugin/node-esm/theme.css.map +7 -0
- package/dist/types/src/config/index.d.ts +3 -0
- package/dist/types/src/config/index.d.ts.map +1 -0
- package/dist/types/src/config/tailwind.d.ts +9 -0
- package/dist/types/src/config/tailwind.d.ts.map +1 -0
- package/dist/types/src/config/tokens/Tokens.stories.d.ts +7 -0
- package/dist/types/src/config/tokens/Tokens.stories.d.ts.map +1 -0
- package/dist/types/src/config/tokens/alias-colors.d.ts +14 -0
- package/dist/types/src/config/tokens/alias-colors.d.ts.map +1 -0
- package/dist/types/src/config/tokens/index.d.ts +438 -0
- package/dist/types/src/config/tokens/index.d.ts.map +1 -0
- package/dist/types/src/config/tokens/lengths.d.ts +116 -0
- package/dist/types/src/config/tokens/lengths.d.ts.map +1 -0
- package/dist/types/src/config/tokens/physical-colors.d.ts +23 -0
- package/dist/types/src/config/tokens/physical-colors.d.ts.map +1 -0
- package/dist/types/src/config/tokens/semantic-colors.d.ts +179 -0
- package/dist/types/src/config/tokens/semantic-colors.d.ts.map +1 -0
- package/dist/types/src/config/tokens/sememes-calls.d.ts +3 -0
- package/dist/types/src/config/tokens/sememes-calls.d.ts.map +1 -0
- package/dist/types/src/config/tokens/sememes-codemirror.d.ts +43 -0
- package/dist/types/src/config/tokens/sememes-codemirror.d.ts.map +1 -0
- package/dist/types/src/config/tokens/sememes-hue.d.ts +4 -0
- package/dist/types/src/config/tokens/sememes-hue.d.ts.map +1 -0
- package/dist/types/src/config/tokens/sememes-sheet.d.ts +52 -0
- package/dist/types/src/config/tokens/sememes-sheet.d.ts.map +1 -0
- package/dist/types/src/config/tokens/sememes-system.d.ts +91 -0
- package/dist/types/src/config/tokens/sememes-system.d.ts.map +1 -0
- package/dist/types/src/config/tokens/types.d.ts +5 -0
- package/dist/types/src/config/tokens/types.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +8 -0
- package/dist/types/src/index.d.ts.map +1 -0
- package/dist/types/src/plugins/esbuild-plugin.d.ts +9 -0
- package/dist/types/src/plugins/esbuild-plugin.d.ts.map +1 -0
- package/dist/types/src/plugins/plugin.d.ts +17 -0
- package/dist/types/src/plugins/plugin.d.ts.map +1 -0
- package/dist/types/src/plugins/resolveContent.d.ts +2 -0
- package/dist/types/src/plugins/resolveContent.d.ts.map +1 -0
- package/dist/types/src/styles/components/anchored-overflow.d.ts +6 -0
- package/dist/types/src/styles/components/anchored-overflow.d.ts.map +1 -0
- package/dist/types/src/styles/components/avatar.d.ts +21 -0
- package/dist/types/src/styles/components/avatar.d.ts.map +1 -0
- package/dist/types/src/styles/components/breadcrumb.d.ts +9 -0
- package/dist/types/src/styles/components/breadcrumb.d.ts.map +1 -0
- package/dist/types/src/styles/components/button.d.ts +19 -0
- package/dist/types/src/styles/components/button.d.ts.map +1 -0
- package/dist/types/src/styles/components/dialog.d.ts +12 -0
- package/dist/types/src/styles/components/dialog.d.ts.map +1 -0
- package/dist/types/src/styles/components/icon-button.d.ts +5 -0
- package/dist/types/src/styles/components/icon-button.d.ts.map +1 -0
- package/dist/types/src/styles/components/icon.d.ts +7 -0
- package/dist/types/src/styles/components/icon.d.ts.map +1 -0
- package/dist/types/src/styles/components/index.d.ts +24 -0
- package/dist/types/src/styles/components/index.d.ts.map +1 -0
- package/dist/types/src/styles/components/input.d.ts +111 -0
- package/dist/types/src/styles/components/input.d.ts.map +1 -0
- package/dist/types/src/styles/components/link.d.ts +7 -0
- package/dist/types/src/styles/components/link.d.ts.map +1 -0
- package/dist/types/src/styles/components/list.d.ts +14 -0
- package/dist/types/src/styles/components/list.d.ts.map +1 -0
- package/dist/types/src/styles/components/main.d.ts +28 -0
- package/dist/types/src/styles/components/main.d.ts.map +1 -0
- package/dist/types/src/styles/components/menu.d.ts +13 -0
- package/dist/types/src/styles/components/menu.d.ts.map +1 -0
- package/dist/types/src/styles/components/message.d.ts +11 -0
- package/dist/types/src/styles/components/message.d.ts.map +1 -0
- package/dist/types/src/styles/components/popover.d.ts +11 -0
- package/dist/types/src/styles/components/popover.d.ts.map +1 -0
- package/dist/types/src/styles/components/scroll-area.d.ts +9 -0
- package/dist/types/src/styles/components/scroll-area.d.ts.map +1 -0
- package/dist/types/src/styles/components/select.d.ts +14 -0
- package/dist/types/src/styles/components/select.d.ts.map +1 -0
- package/dist/types/src/styles/components/separator.d.ts +8 -0
- package/dist/types/src/styles/components/separator.d.ts.map +1 -0
- package/dist/types/src/styles/components/status.d.ts +9 -0
- package/dist/types/src/styles/components/status.d.ts.map +1 -0
- package/dist/types/src/styles/components/tag.d.ts +7 -0
- package/dist/types/src/styles/components/tag.d.ts.map +1 -0
- package/dist/types/src/styles/components/toast.d.ts +12 -0
- package/dist/types/src/styles/components/toast.d.ts.map +1 -0
- package/dist/types/src/styles/components/toolbar.d.ts +8 -0
- package/dist/types/src/styles/components/toolbar.d.ts.map +1 -0
- package/dist/types/src/styles/components/tooltip.d.ts +8 -0
- package/dist/types/src/styles/components/tooltip.d.ts.map +1 -0
- package/dist/types/src/styles/components/treegrid.d.ts +10 -0
- package/dist/types/src/styles/components/treegrid.d.ts.map +1 -0
- package/dist/types/src/styles/fragments/density.d.ts +13 -0
- package/dist/types/src/styles/fragments/density.d.ts.map +1 -0
- package/dist/types/src/styles/fragments/dimension.d.ts +5 -0
- package/dist/types/src/styles/fragments/dimension.d.ts.map +1 -0
- package/dist/types/src/styles/fragments/disabled.d.ts +3 -0
- package/dist/types/src/styles/fragments/disabled.d.ts.map +1 -0
- package/dist/types/src/styles/fragments/elevation.d.ts +15 -0
- package/dist/types/src/styles/fragments/elevation.d.ts.map +1 -0
- package/dist/types/src/styles/fragments/focus.d.ts +6 -0
- package/dist/types/src/styles/fragments/focus.d.ts.map +1 -0
- package/dist/types/src/styles/fragments/group.d.ts +5 -0
- package/dist/types/src/styles/fragments/group.d.ts.map +1 -0
- package/dist/types/src/styles/fragments/hover.d.ts +16 -0
- package/dist/types/src/styles/fragments/hover.d.ts.map +1 -0
- package/dist/types/src/styles/fragments/index.d.ts +17 -0
- package/dist/types/src/styles/fragments/index.d.ts.map +1 -0
- package/dist/types/src/styles/fragments/layout.d.ts +3 -0
- package/dist/types/src/styles/fragments/layout.d.ts.map +1 -0
- package/dist/types/src/styles/fragments/motion.d.ts +2 -0
- package/dist/types/src/styles/fragments/motion.d.ts.map +1 -0
- package/dist/types/src/styles/fragments/ornament.d.ts +5 -0
- package/dist/types/src/styles/fragments/ornament.d.ts.map +1 -0
- package/dist/types/src/styles/fragments/selected.d.ts +13 -0
- package/dist/types/src/styles/fragments/selected.d.ts.map +1 -0
- package/dist/types/src/styles/fragments/shimmer.d.ts +3 -0
- package/dist/types/src/styles/fragments/shimmer.d.ts.map +1 -0
- package/dist/types/src/styles/fragments/size.d.ts +9 -0
- package/dist/types/src/styles/fragments/size.d.ts.map +1 -0
- package/dist/types/src/styles/fragments/surface.d.ts +9 -0
- package/dist/types/src/styles/fragments/surface.d.ts.map +1 -0
- package/dist/types/src/styles/fragments/text.d.ts +7 -0
- package/dist/types/src/styles/fragments/text.d.ts.map +1 -0
- package/dist/types/src/styles/fragments/valence.d.ts +13 -0
- package/dist/types/src/styles/fragments/valence.d.ts.map +1 -0
- package/dist/types/src/styles/index.d.ts +4 -0
- package/dist/types/src/styles/index.d.ts.map +1 -0
- package/dist/types/src/styles/theme.d.ts +5 -0
- package/dist/types/src/styles/theme.d.ts.map +1 -0
- package/dist/types/src/tailwind.d.ts +1 -0
- package/dist/types/src/tailwind.d.ts.map +1 -0
- package/dist/types/src/types.d.ts +3 -0
- package/dist/types/src/types.d.ts.map +1 -0
- package/dist/types/src/util/hash.d.ts +8 -0
- package/dist/types/src/util/hash.d.ts.map +1 -0
- package/dist/types/src/util/index.d.ts +3 -0
- package/dist/types/src/util/index.d.ts.map +1 -0
- package/dist/types/src/util/mx.d.ts +2 -0
- package/dist/types/src/util/mx.d.ts.map +1 -0
- package/dist/types/src/util/withLogical.d.ts +164 -0
- package/dist/types/src/util/withLogical.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -0
- package/package.json +58 -0
- package/plugin.d.ts +7 -0
- package/plugin.js +10 -0
- package/src/config/index.ts +6 -0
- package/src/config/tailwind.ts +236 -0
- package/src/config/tokens/Tokens.stories.tsx +94 -0
- package/src/config/tokens/alias-colors.ts +38 -0
- package/src/config/tokens/index.ts +90 -0
- package/src/config/tokens/lengths.ts +87 -0
- package/src/config/tokens/physical-colors.ts +125 -0
- package/src/config/tokens/semantic-colors.ts +27 -0
- package/src/config/tokens/sememes-calls.ts +17 -0
- package/src/config/tokens/sememes-codemirror.ts +50 -0
- package/src/config/tokens/sememes-hue.ts +54 -0
- package/src/config/tokens/sememes-sheet.ts +60 -0
- package/src/config/tokens/sememes-system.ts +255 -0
- package/src/config/tokens/types.ts +9 -0
- package/src/index.ts +15 -0
- package/src/plugins/esbuild-plugin.ts +60 -0
- package/src/plugins/plugin.ts +127 -0
- package/src/plugins/resolveContent.ts +55 -0
- package/src/styles/components/README.md +6 -0
- package/src/styles/components/anchored-overflow.ts +20 -0
- package/src/styles/components/avatar.ts +96 -0
- package/src/styles/components/breadcrumb.ts +29 -0
- package/src/styles/components/button.ts +48 -0
- package/src/styles/components/dialog.ts +36 -0
- package/src/styles/components/icon-button.ts +17 -0
- package/src/styles/components/icon.ts +19 -0
- package/src/styles/components/index.ts +27 -0
- package/src/styles/components/input.ts +176 -0
- package/src/styles/components/link.ts +26 -0
- package/src/styles/components/list.ts +46 -0
- package/src/styles/components/main.ts +36 -0
- package/src/styles/components/menu.ts +60 -0
- package/src/styles/components/message.ts +36 -0
- package/src/styles/components/popover.ts +40 -0
- package/src/styles/components/scroll-area.ts +42 -0
- package/src/styles/components/select.ts +64 -0
- package/src/styles/components/separator.ts +24 -0
- package/src/styles/components/status.ts +32 -0
- package/src/styles/components/tag.ts +23 -0
- package/src/styles/components/toast.ts +55 -0
- package/src/styles/components/toolbar.ts +20 -0
- package/src/styles/components/tooltip.ts +29 -0
- package/src/styles/components/treegrid.ts +37 -0
- package/src/styles/fragments/density.ts +17 -0
- package/src/styles/fragments/dimension.ts +8 -0
- package/src/styles/fragments/disabled.ts +6 -0
- package/src/styles/fragments/elevation.ts +29 -0
- package/src/styles/fragments/focus.ts +16 -0
- package/src/styles/fragments/group.ts +12 -0
- package/src/styles/fragments/hover.ts +24 -0
- package/src/styles/fragments/index.ts +20 -0
- package/src/styles/fragments/layout.ts +7 -0
- package/src/styles/fragments/motion.ts +6 -0
- package/src/styles/fragments/ornament.ts +10 -0
- package/src/styles/fragments/selected.ts +45 -0
- package/src/styles/fragments/shimmer.ts +9 -0
- package/src/styles/fragments/size.ts +117 -0
- package/src/styles/fragments/surface.ts +29 -0
- package/src/styles/fragments/text.ts +13 -0
- package/src/styles/fragments/valence.ts +48 -0
- package/src/styles/index.ts +7 -0
- package/src/styles/layers/anchored-overflow.css +9 -0
- package/src/styles/layers/attention.css +8 -0
- package/src/styles/layers/base.css +25 -0
- package/src/styles/layers/button.css +76 -0
- package/src/styles/layers/can-scroll.css +26 -0
- package/src/styles/layers/checkbox.css +50 -0
- package/src/styles/layers/dialog.css +42 -0
- package/src/styles/layers/drag-preview.css +18 -0
- package/src/styles/layers/focus-ring.css +129 -0
- package/src/styles/layers/hues.css +110 -0
- package/src/styles/layers/index.css +21 -0
- package/src/styles/layers/main.css +162 -0
- package/src/styles/layers/native.css +14 -0
- package/src/styles/layers/positioning.css +23 -0
- package/src/styles/layers/size.css +299 -0
- package/src/styles/layers/surfaces.css +31 -0
- package/src/styles/layers/tag.css +123 -0
- package/src/styles/layers/tldraw.css +91 -0
- package/src/styles/layers/tokens.css +44 -0
- package/src/styles/layers/typography.css +152 -0
- package/src/styles/theme.ts +69 -0
- package/src/tailwind.ts +5 -0
- package/src/theme.css +5 -0
- package/src/types.ts +7 -0
- package/src/typings.d.ts +8 -0
- package/src/util/hash.ts +39 -0
- package/src/util/index.ts +6 -0
- package/src/util/mx.ts +34 -0
- package/src/util/withLogical.ts +114 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type ColorSememes } from './types';
|
|
6
|
+
|
|
7
|
+
// TODO(burdon): This should be broader than just calls.
|
|
8
|
+
export const callsSememes: ColorSememes = {
|
|
9
|
+
callActive: {
|
|
10
|
+
light: ['green', '500'],
|
|
11
|
+
dark: ['green', '500'],
|
|
12
|
+
},
|
|
13
|
+
callAlert: {
|
|
14
|
+
light: ['rose', '500'],
|
|
15
|
+
dark: ['rose', '500'],
|
|
16
|
+
},
|
|
17
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type ColorSememes } from './types';
|
|
6
|
+
|
|
7
|
+
export const codemirrorSememes = {
|
|
8
|
+
// NOTE: background styles for the main content area must have transparency otherwise they will mask the selection.
|
|
9
|
+
cmCodeblock: {
|
|
10
|
+
light: ['neutral', '500/.1'],
|
|
11
|
+
dark: ['neutral', '500/.1'],
|
|
12
|
+
},
|
|
13
|
+
cmActiveLine: {
|
|
14
|
+
light: ['neutral', '200/.5'],
|
|
15
|
+
dark: ['neutral', '800/.5'],
|
|
16
|
+
},
|
|
17
|
+
cmSeparator: {
|
|
18
|
+
light: ['primary', 500],
|
|
19
|
+
dark: ['primary', 500],
|
|
20
|
+
},
|
|
21
|
+
cmCursor: {
|
|
22
|
+
light: ['neutral', 900],
|
|
23
|
+
dark: ['neutral', 100],
|
|
24
|
+
},
|
|
25
|
+
cmSelection: {
|
|
26
|
+
light: ['primary', '400/.5'],
|
|
27
|
+
dark: ['primary', '600/.5'],
|
|
28
|
+
},
|
|
29
|
+
cmFocusedSelection: {
|
|
30
|
+
light: ['primary', 400],
|
|
31
|
+
dark: ['primary', 600],
|
|
32
|
+
},
|
|
33
|
+
cmHighlight: {
|
|
34
|
+
light: ['neutral', 950],
|
|
35
|
+
dark: ['neutral', 50],
|
|
36
|
+
},
|
|
37
|
+
cmHighlightSurface: {
|
|
38
|
+
light: ['sky', 200],
|
|
39
|
+
dark: ['cyan', 600],
|
|
40
|
+
},
|
|
41
|
+
// TODO(burdon): Factor out def (in common with sheet).
|
|
42
|
+
cmComment: {
|
|
43
|
+
light: ['neutral', 950],
|
|
44
|
+
dark: ['neutral', 50],
|
|
45
|
+
},
|
|
46
|
+
cmCommentSurface: {
|
|
47
|
+
light: ['green', 200],
|
|
48
|
+
dark: ['green', 600],
|
|
49
|
+
},
|
|
50
|
+
} satisfies ColorSememes;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { huePalettes } from './physical-colors';
|
|
6
|
+
import { type ColorAliases, type ColorSememes } from './types';
|
|
7
|
+
|
|
8
|
+
export const hueSememes: ColorSememes = [...Object.keys(huePalettes), 'neutral', 'primary'].reduce(
|
|
9
|
+
(acc: ColorSememes, palette) => {
|
|
10
|
+
acc[`${palette}Cursor`] = {
|
|
11
|
+
light: [palette, 400],
|
|
12
|
+
dark: [palette, 300],
|
|
13
|
+
};
|
|
14
|
+
acc[`${palette}Text`] = {
|
|
15
|
+
light: [palette, 550],
|
|
16
|
+
dark: [palette, 300],
|
|
17
|
+
};
|
|
18
|
+
acc[`${palette}Fill`] = {
|
|
19
|
+
light: [palette, 500],
|
|
20
|
+
dark: [palette, 500],
|
|
21
|
+
};
|
|
22
|
+
acc[`${palette}Surface`] = {
|
|
23
|
+
light: [palette, 200],
|
|
24
|
+
dark: [palette, 700],
|
|
25
|
+
};
|
|
26
|
+
acc[`${palette}SurfaceText`] = {
|
|
27
|
+
light: [palette, 700],
|
|
28
|
+
dark: [palette, 200],
|
|
29
|
+
};
|
|
30
|
+
acc[`${palette}Screen`] = {
|
|
31
|
+
light: [palette, 100],
|
|
32
|
+
dark: [palette, 800],
|
|
33
|
+
};
|
|
34
|
+
return acc;
|
|
35
|
+
},
|
|
36
|
+
{},
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
const valenceAliasSememeStems = ['Text', 'Surface', 'SurfaceText', 'Fill', 'Cursor'];
|
|
40
|
+
const valenceMapping = {
|
|
41
|
+
emerald: ['success'],
|
|
42
|
+
cyan: ['info'],
|
|
43
|
+
amber: ['warning'],
|
|
44
|
+
rose: ['error'],
|
|
45
|
+
primary: ['current'],
|
|
46
|
+
fuchsia: ['internal'],
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export const valenceAliases: ColorAliases = valenceAliasSememeStems.reduce((acc: ColorAliases, stem) => {
|
|
50
|
+
return Object.entries(valenceMapping).reduce((acc: ColorAliases, [hue, valences]) => {
|
|
51
|
+
acc[`${hue}${stem}`] = { root: valences.map((valence) => `${valence}${stem}`) };
|
|
52
|
+
return acc;
|
|
53
|
+
}, acc);
|
|
54
|
+
}, {});
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type { ColorAliases, ColorSememes } from './types';
|
|
6
|
+
|
|
7
|
+
export const sheetSememes = {
|
|
8
|
+
// NOTE: background styles for the main content area must have transparency otherwise they will mask the selection.
|
|
9
|
+
axisSurface: {
|
|
10
|
+
light: ['neutral', 50],
|
|
11
|
+
dark: ['neutral', 800],
|
|
12
|
+
},
|
|
13
|
+
axisText: {
|
|
14
|
+
light: ['neutral', 800],
|
|
15
|
+
dark: ['neutral', 200],
|
|
16
|
+
},
|
|
17
|
+
axisSelectedSurface: {
|
|
18
|
+
light: ['neutral', 100],
|
|
19
|
+
dark: ['neutral', 900],
|
|
20
|
+
},
|
|
21
|
+
axisSelectedText: {
|
|
22
|
+
light: ['neutral', 100],
|
|
23
|
+
dark: ['neutral', 900],
|
|
24
|
+
},
|
|
25
|
+
gridCell: {
|
|
26
|
+
// TODO(thure): Why override only dark?
|
|
27
|
+
light: ['neutral', '50/0'],
|
|
28
|
+
dark: ['neutral', 850],
|
|
29
|
+
},
|
|
30
|
+
gridCellSelected: {
|
|
31
|
+
// TODO(thure): Can this not just use `attention`?
|
|
32
|
+
light: ['neutral', 50],
|
|
33
|
+
dark: ['neutral', 800],
|
|
34
|
+
},
|
|
35
|
+
gridOverlay: {
|
|
36
|
+
light: ['primary', '500/.5'],
|
|
37
|
+
dark: ['primary', '500/.5'],
|
|
38
|
+
},
|
|
39
|
+
gridSelectionOverlay: {
|
|
40
|
+
light: ['primary', '500/.2'],
|
|
41
|
+
dark: ['primary', '500/.2'],
|
|
42
|
+
},
|
|
43
|
+
gridHighlight: {
|
|
44
|
+
light: ['emerald', '500/.5'],
|
|
45
|
+
dark: ['emerald', '500/.5'],
|
|
46
|
+
},
|
|
47
|
+
// TODO(burdon): Factor out def (in common with editor).
|
|
48
|
+
gridCommented: {
|
|
49
|
+
light: ['green', 200],
|
|
50
|
+
dark: ['green', 600],
|
|
51
|
+
},
|
|
52
|
+
gridCommentedActive: {
|
|
53
|
+
light: ['green', '200/.5'],
|
|
54
|
+
dark: ['green', '600/.5'],
|
|
55
|
+
},
|
|
56
|
+
} satisfies ColorSememes;
|
|
57
|
+
|
|
58
|
+
export const sheetAliases = {
|
|
59
|
+
activeSurface: { root: ['gridLine'] },
|
|
60
|
+
} satisfies ColorAliases;
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
// TODO(thure): TS2742
|
|
6
|
+
/* eslint-disable unused-imports/no-unused-imports */
|
|
7
|
+
import * as _colors from '@ch-ui/colors';
|
|
8
|
+
|
|
9
|
+
import { type ColorAliases, type ColorSememes } from './types';
|
|
10
|
+
|
|
11
|
+
// TODO(burdon): Move to util.
|
|
12
|
+
const getMapValue = <T>(map: Record<string, T>, key: string, defaultValue: () => T): T => {
|
|
13
|
+
let value = map[key];
|
|
14
|
+
if (!value) {
|
|
15
|
+
value = defaultValue();
|
|
16
|
+
map[key] = value;
|
|
17
|
+
}
|
|
18
|
+
return value;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
type Sememe = ColorSememes[string];
|
|
22
|
+
|
|
23
|
+
const applyAlpha = (sememe: Sememe, alpha: number): Sememe => {
|
|
24
|
+
if (alpha >= 1) {
|
|
25
|
+
return sememe;
|
|
26
|
+
} else {
|
|
27
|
+
return {
|
|
28
|
+
light: [sememe.light![0], `${sememe.light![1]}/${alpha}`],
|
|
29
|
+
dark: [sememe.dark![0], `${sememe.dark![1]}/${alpha}`],
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// Luminosity extrema and key points.
|
|
35
|
+
|
|
36
|
+
// Both elevation cadences go from darker to lighter from “elevation” 0 to `ELEVATION_SCALE`,
|
|
37
|
+
// whereas both contrast cadences go from highest contrast at 0 to lowest contrast at `CONTRAST_SCALE`.
|
|
38
|
+
|
|
39
|
+
const DARK_ELEVATION_MIN = 855;
|
|
40
|
+
const DARK_ELEVATION_MAX = 731;
|
|
41
|
+
|
|
42
|
+
const DARK_CONTRAST_MIN = 750;
|
|
43
|
+
const DARK_CONTRAST_MAX = 665;
|
|
44
|
+
|
|
45
|
+
const LIGHT_ELEVATION_MIN = 0;
|
|
46
|
+
const LIGHT_ELEVATION_MAX = 0;
|
|
47
|
+
|
|
48
|
+
const LIGHT_CONTRAST_MIN = 82;
|
|
49
|
+
const LIGHT_CONTRAST_MAX = 24;
|
|
50
|
+
|
|
51
|
+
const ELEVATION_SCALE = 2;
|
|
52
|
+
const CONTRAST_SCALE = 3;
|
|
53
|
+
|
|
54
|
+
const darkElevationCadence = (depth: number) =>
|
|
55
|
+
Math.round(
|
|
56
|
+
DARK_ELEVATION_MAX + (DARK_ELEVATION_MIN - DARK_ELEVATION_MAX) * ((ELEVATION_SCALE - depth) / ELEVATION_SCALE),
|
|
57
|
+
);
|
|
58
|
+
const darkContrastCadence = (depth: number) =>
|
|
59
|
+
Math.round(
|
|
60
|
+
DARK_CONTRAST_MAX + (DARK_CONTRAST_MIN - DARK_CONTRAST_MAX) * ((ELEVATION_SCALE - depth) / ELEVATION_SCALE),
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
const lightElevationCadence = (depth: number) =>
|
|
64
|
+
Math.round(
|
|
65
|
+
LIGHT_ELEVATION_MIN + (LIGHT_ELEVATION_MAX - LIGHT_ELEVATION_MIN) * ((CONTRAST_SCALE - depth) / CONTRAST_SCALE),
|
|
66
|
+
);
|
|
67
|
+
const lightContrastCadence = (depth: number) =>
|
|
68
|
+
Math.round(LIGHT_CONTRAST_MAX + (LIGHT_CONTRAST_MIN - LIGHT_CONTRAST_MAX) * (depth / CONTRAST_SCALE));
|
|
69
|
+
|
|
70
|
+
const elevationCadence = (lightDepth: number, darkDepth: number = lightDepth, alpha: number = 1): Sememe =>
|
|
71
|
+
applyAlpha(
|
|
72
|
+
{
|
|
73
|
+
light: ['neutral', lightElevationCadence(lightDepth)],
|
|
74
|
+
dark: ['neutral', darkElevationCadence(darkDepth)],
|
|
75
|
+
},
|
|
76
|
+
alpha,
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
const contrastCadence = (lightDepth: number, darkDepth: number = lightDepth, alpha: number = 1): Sememe =>
|
|
80
|
+
applyAlpha(
|
|
81
|
+
{
|
|
82
|
+
light: ['neutral', lightContrastCadence(lightDepth)],
|
|
83
|
+
dark: ['neutral', darkContrastCadence(darkDepth)],
|
|
84
|
+
},
|
|
85
|
+
alpha,
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
export const systemSememes = {
|
|
89
|
+
//
|
|
90
|
+
// Elevation cadence tokens
|
|
91
|
+
//
|
|
92
|
+
baseSurface: elevationCadence(0),
|
|
93
|
+
groupSurface: elevationCadence(1),
|
|
94
|
+
modalSurface: elevationCadence(2, 1.7),
|
|
95
|
+
|
|
96
|
+
//
|
|
97
|
+
// Contrast cadence tokens
|
|
98
|
+
//
|
|
99
|
+
|
|
100
|
+
textInputSurfaceBase: contrastCadence(0, 0),
|
|
101
|
+
textInputSurfaceGroup: contrastCadence(0, 0.5),
|
|
102
|
+
textInputSurfaceModal: contrastCadence(0, 1),
|
|
103
|
+
|
|
104
|
+
inputSurfaceBase: contrastCadence(1, 0.5),
|
|
105
|
+
inputSurfaceGroup: contrastCadence(1, 1),
|
|
106
|
+
inputSurfaceModal: contrastCadence(1, 1.5),
|
|
107
|
+
|
|
108
|
+
hoverSurfaceBase: contrastCadence(2, 1.5),
|
|
109
|
+
hoverSurfaceGroup: contrastCadence(2, 2),
|
|
110
|
+
hoverSurfaceModal: contrastCadence(2, 2.5),
|
|
111
|
+
|
|
112
|
+
separatorBase: contrastCadence(3, 2),
|
|
113
|
+
separatorGroup: contrastCadence(3, 2.5),
|
|
114
|
+
separatorModal: contrastCadence(3, 3),
|
|
115
|
+
|
|
116
|
+
subduedSeparator: contrastCadence(3, 1),
|
|
117
|
+
|
|
118
|
+
unAccent: {
|
|
119
|
+
light: ['neutral', 400],
|
|
120
|
+
dark: ['neutral', 400],
|
|
121
|
+
},
|
|
122
|
+
unAccentHover: {
|
|
123
|
+
light: ['neutral', 450],
|
|
124
|
+
dark: ['neutral', 450],
|
|
125
|
+
},
|
|
126
|
+
hoverOverlay: {
|
|
127
|
+
light: ['neutral', '450/.1'],
|
|
128
|
+
dark: ['neutral', '450/.1'],
|
|
129
|
+
},
|
|
130
|
+
|
|
131
|
+
//
|
|
132
|
+
// Special surfaces.
|
|
133
|
+
//
|
|
134
|
+
|
|
135
|
+
// Screen overlay for modal dialogs.
|
|
136
|
+
scrimSurface: applyAlpha({ light: ['neutral', LIGHT_CONTRAST_MAX], dark: ['neutral', DARK_ELEVATION_MIN] }, 0.65),
|
|
137
|
+
|
|
138
|
+
// High contrast for focused interactive elements. (Technically this is part of the surface cadence, but the contrast cadence is on the opposite side of the elevation cadence as this point.)
|
|
139
|
+
focusSurface: {
|
|
140
|
+
light: ['neutral', 0],
|
|
141
|
+
dark: ['neutral', 1000],
|
|
142
|
+
},
|
|
143
|
+
|
|
144
|
+
// For tooltips only; the highest elevation from the opposite theme
|
|
145
|
+
inverseSurface: {
|
|
146
|
+
light: ['neutral', DARK_ELEVATION_MIN],
|
|
147
|
+
dark: ['neutral', LIGHT_ELEVATION_MIN],
|
|
148
|
+
},
|
|
149
|
+
|
|
150
|
+
//
|
|
151
|
+
// Accent surfaces
|
|
152
|
+
//
|
|
153
|
+
|
|
154
|
+
accentSurfaceRelated: {
|
|
155
|
+
light: ['primary', '300/.1'],
|
|
156
|
+
dark: ['primary', '400/.1'],
|
|
157
|
+
},
|
|
158
|
+
accentSurfaceHover: {
|
|
159
|
+
light: ['primary', 600],
|
|
160
|
+
dark: ['primary', 475],
|
|
161
|
+
},
|
|
162
|
+
accentSurface: {
|
|
163
|
+
light: ['primary', 500],
|
|
164
|
+
dark: ['primary', 500],
|
|
165
|
+
},
|
|
166
|
+
|
|
167
|
+
//
|
|
168
|
+
// Text (text-) and other foregrounds
|
|
169
|
+
// TODO(thure): Establish contrast-order cadence for text.
|
|
170
|
+
//
|
|
171
|
+
|
|
172
|
+
baseText: {
|
|
173
|
+
light: ['neutral', 1000],
|
|
174
|
+
dark: ['neutral', 50],
|
|
175
|
+
},
|
|
176
|
+
inverseSurfaceText: {
|
|
177
|
+
light: ['neutral', 50],
|
|
178
|
+
dark: ['neutral', 1000],
|
|
179
|
+
},
|
|
180
|
+
description: {
|
|
181
|
+
light: ['neutral', 500],
|
|
182
|
+
dark: ['neutral', 400],
|
|
183
|
+
},
|
|
184
|
+
subdued: {
|
|
185
|
+
light: ['neutral', 700],
|
|
186
|
+
dark: ['neutral', 300],
|
|
187
|
+
},
|
|
188
|
+
accentText: {
|
|
189
|
+
light: ['primary', 550],
|
|
190
|
+
dark: ['primary', 400],
|
|
191
|
+
},
|
|
192
|
+
accentTextHover: {
|
|
193
|
+
light: ['primary', 500],
|
|
194
|
+
dark: ['primary', 350],
|
|
195
|
+
},
|
|
196
|
+
neutralFocusIndicator: {
|
|
197
|
+
light: ['neutral', 300],
|
|
198
|
+
dark: ['neutral', 450],
|
|
199
|
+
},
|
|
200
|
+
accentFocusIndicator: {
|
|
201
|
+
light: ['primary', 300],
|
|
202
|
+
dark: ['primary', 450],
|
|
203
|
+
},
|
|
204
|
+
accentSurfaceText: {
|
|
205
|
+
light: ['neutral', 0],
|
|
206
|
+
dark: ['neutral', 0],
|
|
207
|
+
},
|
|
208
|
+
} satisfies ColorSememes;
|
|
209
|
+
|
|
210
|
+
type SememeName = keyof typeof systemSememes;
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Alias map.
|
|
214
|
+
*/
|
|
215
|
+
const aliasDefs: Record<string, Record<string, SememeName>> = {
|
|
216
|
+
// The background color appearing in overscroll and between planks when Deck is enabled.
|
|
217
|
+
deckSurface: { root: 'groupSurface' },
|
|
218
|
+
|
|
219
|
+
// Secondary aliases
|
|
220
|
+
textInputSurface: { root: 'textInputSurfaceBase', group: 'textInputSurfaceGroup', modal: 'textInputSurfaceModal' },
|
|
221
|
+
inputSurface: { root: 'inputSurfaceBase', group: 'inputSurfaceGroup', modal: 'inputSurfaceModal' },
|
|
222
|
+
hoverSurface: { root: 'hoverSurfaceBase', group: 'hoverSurfaceGroup', modal: 'hoverSurfaceModal' },
|
|
223
|
+
separator: { root: 'separatorBase', group: 'separatorGroup', modal: 'separatorModal' },
|
|
224
|
+
|
|
225
|
+
// Selected items, current items, other surfaces needing special contrast against baseSurface.
|
|
226
|
+
activeSurface: { root: 'inputSurface' as any /* TODO(thure): strongly type secondary aliases. */ },
|
|
227
|
+
|
|
228
|
+
// Main sidebar panel.
|
|
229
|
+
sidebarSurface: { root: 'groupSurface' },
|
|
230
|
+
|
|
231
|
+
// Plank header.
|
|
232
|
+
headerSurface: { root: 'groupSurface' },
|
|
233
|
+
|
|
234
|
+
// Forms, cards, etc.
|
|
235
|
+
cardSurface: { root: 'groupSurface' },
|
|
236
|
+
|
|
237
|
+
// Toolbars, table/sheet headers, etc.
|
|
238
|
+
toolbarSurface: { root: 'groupSurface' },
|
|
239
|
+
|
|
240
|
+
// TODO: rename uses of this token to `focusSurface` and remove this alias.
|
|
241
|
+
attention: { root: 'focusSurface' },
|
|
242
|
+
|
|
243
|
+
// In “master-detail” patterns, the background of the item in the list which is enumerated in the adjacent view.
|
|
244
|
+
currentRelated: { root: 'accentSurfaceRelated' },
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
export const systemAliases: ColorAliases = Object.entries(aliasDefs).reduce((aliases, [alias, values]) => {
|
|
248
|
+
Object.entries(values).forEach(([key, sememe]) => {
|
|
249
|
+
const record = getMapValue(aliases, sememe, () => ({}));
|
|
250
|
+
const list = getMapValue<string[]>(record, key, () => []);
|
|
251
|
+
list.push(alias);
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
return aliases;
|
|
255
|
+
}, {} as ColorAliases);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type { AliasLayer, ResolvedHelicalArcSeries, HelicalArcValue, SemanticLayer } from '@ch-ui/tokens';
|
|
6
|
+
|
|
7
|
+
export type PhysicalPalette = Omit<ResolvedHelicalArcSeries, 'extends' | 'physicalValueRelation'>;
|
|
8
|
+
export type ColorSememes = SemanticLayer<string, string, HelicalArcValue>['sememes'];
|
|
9
|
+
export type ColorAliases = AliasLayer<string>['aliases'];
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { tailwindConfig, type TailwindConfig } from './config';
|
|
6
|
+
|
|
7
|
+
const tokens: TailwindConfig['theme'] = tailwindConfig({}).theme;
|
|
8
|
+
|
|
9
|
+
export * from './styles';
|
|
10
|
+
export * from './types';
|
|
11
|
+
export * from './util';
|
|
12
|
+
|
|
13
|
+
export { userDefaultTokenSet, hues } from './config/tokens';
|
|
14
|
+
|
|
15
|
+
export { tokens };
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import autoprefixer from 'autoprefixer';
|
|
6
|
+
import type { Plugin } from 'esbuild';
|
|
7
|
+
import stylePlugin from 'esbuild-style-plugin';
|
|
8
|
+
import { mkdir, cp } from 'node:fs/promises';
|
|
9
|
+
import { resolve, relative, join, basename } from 'node:path';
|
|
10
|
+
import tailwindcss from 'tailwindcss';
|
|
11
|
+
import type { ThemeConfig } from 'tailwindcss/types/config';
|
|
12
|
+
|
|
13
|
+
import { resolveKnownPeers } from './resolveContent';
|
|
14
|
+
import { tailwindConfig } from '../config';
|
|
15
|
+
|
|
16
|
+
export const ThemePlugins = async (options: {
|
|
17
|
+
content: string[];
|
|
18
|
+
root?: string;
|
|
19
|
+
outdir: string;
|
|
20
|
+
extensions?: Partial<ThemeConfig>[];
|
|
21
|
+
}): Promise<Plugin[]> => {
|
|
22
|
+
const resolvedContent = options.root ? await resolveKnownPeers(options.content, options.root) : options.content;
|
|
23
|
+
return [
|
|
24
|
+
// TODO(thure): This really shouldn’t be this way, but after hours of searching for a reasonable way to do this I came up empty. The prior art I found was mainly this thread, though it’s only tangentially related: https://github.com/evanw/esbuild/issues/800#issuecomment-786151076
|
|
25
|
+
{
|
|
26
|
+
name: 'esbuild-plugin-dxos-ui-theme-resolvers',
|
|
27
|
+
setup: async (build) => {
|
|
28
|
+
const fontsDir = join(options.outdir, 'node_modules/@dxos/react-ui-theme/fonts');
|
|
29
|
+
try {
|
|
30
|
+
await mkdir(fontsDir);
|
|
31
|
+
} catch (_err) {}
|
|
32
|
+
build.onResolve({ filter: /\.woff2$/ }, async (args) => {
|
|
33
|
+
const depPath = resolve(args.resolveDir, args.path);
|
|
34
|
+
const destPath = join(fontsDir, basename(args.path));
|
|
35
|
+
try {
|
|
36
|
+
await cp(depPath, destPath);
|
|
37
|
+
} catch (_err) {}
|
|
38
|
+
return { path: `./${relative(options.outdir, join('fonts', basename(args.path)))}`, external: true };
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
// TODO(thure): theme.css must be part of entryPoints in order to be processed with `stylePlugin`, but this should not be necessary. ESBuild would not load theme.css using stylePlugin if referenced within index.ts(x) as with the Vite plugin.
|
|
43
|
+
// TODO(thure): Note also that because it is an entryPoint, the developer has to reference the built theme.css from `index.html`, which is inflexible and possibly inconvenient.
|
|
44
|
+
// TODO(zhenyasav): autoprefixer version misalignment with esbuild-style-plugin requires the `as any`
|
|
45
|
+
stylePlugin({
|
|
46
|
+
postcss: {
|
|
47
|
+
plugins: [
|
|
48
|
+
tailwindcss(
|
|
49
|
+
tailwindConfig({
|
|
50
|
+
env: process.env.NODE_ENV,
|
|
51
|
+
content: resolvedContent,
|
|
52
|
+
extensions: options.extensions,
|
|
53
|
+
}),
|
|
54
|
+
),
|
|
55
|
+
autoprefixer as any,
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
}),
|
|
59
|
+
];
|
|
60
|
+
};
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
/* eslint-disable no-console */
|
|
6
|
+
|
|
7
|
+
import chTokens from '@ch-ui/tokens';
|
|
8
|
+
import autoprefixer from 'autoprefixer';
|
|
9
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
10
|
+
import { resolve } from 'node:path';
|
|
11
|
+
import postcss from 'postcss';
|
|
12
|
+
import postcssImport from 'postcss-import';
|
|
13
|
+
import tailwindcss from 'tailwindcss';
|
|
14
|
+
import nesting from 'tailwindcss/nesting';
|
|
15
|
+
import { type ThemeConfig } from 'tailwindcss/types/config';
|
|
16
|
+
import { type UserConfig, type Plugin } from 'vite';
|
|
17
|
+
|
|
18
|
+
import { resolveKnownPeers } from './resolveContent';
|
|
19
|
+
import { tailwindConfig, tokenSet } from '../config';
|
|
20
|
+
|
|
21
|
+
export type ThemePluginOptions = {
|
|
22
|
+
jit?: boolean;
|
|
23
|
+
cssPath?: string;
|
|
24
|
+
srcCssPath?: string;
|
|
25
|
+
virtualFileId?: string;
|
|
26
|
+
content?: string[];
|
|
27
|
+
root?: string;
|
|
28
|
+
verbose?: boolean;
|
|
29
|
+
extensions?: Partial<ThemeConfig>[];
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
let environment!: string;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Configures PostCSS pipeline for theme.css processing.
|
|
36
|
+
* @param environment - The current environment (development/production).
|
|
37
|
+
* @param config - Theme plugin configuration options.
|
|
38
|
+
* @returns Array of PostCSS plugins.
|
|
39
|
+
*/
|
|
40
|
+
const createPostCSSPipeline = (environment: string, config: ThemePluginOptions): postcss.Transformer[] => [
|
|
41
|
+
// Handles @import statements in CSS.
|
|
42
|
+
postcssImport(),
|
|
43
|
+
// Processes CSS nesting syntax.
|
|
44
|
+
nesting,
|
|
45
|
+
// Processes custom design tokens.
|
|
46
|
+
chTokens({ config: () => tokenSet }),
|
|
47
|
+
// Processes Tailwind directives and utilities.
|
|
48
|
+
tailwindcss(
|
|
49
|
+
tailwindConfig({
|
|
50
|
+
env: environment,
|
|
51
|
+
content: config.content,
|
|
52
|
+
extensions: config.extensions,
|
|
53
|
+
}),
|
|
54
|
+
),
|
|
55
|
+
// Adds vendor prefixes.
|
|
56
|
+
autoprefixer as any,
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Vite plugin to configure theme.
|
|
61
|
+
*/
|
|
62
|
+
export const ThemePlugin = (options: ThemePluginOptions): Plugin => {
|
|
63
|
+
const config: ThemePluginOptions = {
|
|
64
|
+
jit: true,
|
|
65
|
+
cssPath: resolve(__dirname, '../theme.css'),
|
|
66
|
+
srcCssPath: resolve(__dirname, '../../../../src/theme.css'),
|
|
67
|
+
virtualFileId: '@dxos-theme',
|
|
68
|
+
...options,
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
if (process.env.DEBUG) {
|
|
72
|
+
console.log('ThemePlugin config:\n', JSON.stringify(config, null, 2));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
name: 'vite-plugin-dxos-ui-theme',
|
|
77
|
+
config: async ({ root }, env): Promise<UserConfig> => {
|
|
78
|
+
environment = env.mode;
|
|
79
|
+
const content = root ? await resolveKnownPeers(config.content ?? [], root) : config.content;
|
|
80
|
+
if (options.verbose) {
|
|
81
|
+
console.log('content', content);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
css: {
|
|
86
|
+
postcss: {
|
|
87
|
+
plugins: createPostCSSPipeline(environment, config),
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
},
|
|
92
|
+
resolveId: (id) => {
|
|
93
|
+
if (id === config.virtualFileId) {
|
|
94
|
+
return config.cssPath;
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
handleHotUpdate: async ({ file, server }) => {
|
|
98
|
+
// NOTE(ZaymonFC): Changes to *any* CSS file triggers this step. We might want to refine this.
|
|
99
|
+
// Ignore the output file to prevent infinite loops.
|
|
100
|
+
if (file.endsWith('.css') && file !== config.cssPath) {
|
|
101
|
+
try {
|
|
102
|
+
// Get reference to the theme virtual module.
|
|
103
|
+
const module = server.moduleGraph.getModuleById(config.cssPath!);
|
|
104
|
+
|
|
105
|
+
if (module) {
|
|
106
|
+
// Read the source theme file that imports all other CSS files.
|
|
107
|
+
const css = await readFile(config.srcCssPath!, 'utf8');
|
|
108
|
+
const processor = postcss(createPostCSSPipeline(environment, config));
|
|
109
|
+
console.log('[theme-plugin] Reprocessing CSS with PostCSS.');
|
|
110
|
+
const result = await processor.process(css, {
|
|
111
|
+
from: config.srcCssPath,
|
|
112
|
+
to: config.cssPath,
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
if (result.css) {
|
|
116
|
+
await writeFile(config.cssPath!, result.css);
|
|
117
|
+
// Return the module to trigger HMR update.
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
} catch (err) {
|
|
122
|
+
console.error('[theme-plugin] Error:', err);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
};
|