@dxos/ui-theme 0.0.0 → 0.8.4-main.52d7546f51
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 +3499 -0
- package/dist/lib/browser/index.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -0
- package/dist/lib/node-esm/index.mjs +3501 -0
- package/dist/lib/node-esm/index.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -0
- package/dist/plugin/node-cjs/chunk-TH5YZMTA.cjs +1633 -0
- package/dist/plugin/node-cjs/chunk-TH5YZMTA.cjs.map +7 -0
- package/dist/plugin/node-cjs/chunk-UUMDOU7E.cjs +79 -0
- package/dist/plugin/node-cjs/chunk-UUMDOU7E.cjs.map +7 -0
- package/dist/plugin/node-cjs/config/tailwind.cjs +29 -0
- package/dist/plugin/node-cjs/config/tailwind.cjs.map +7 -0
- package/dist/plugin/node-cjs/meta.json +1 -0
- package/dist/plugin/node-cjs/plugins/esbuild-plugin.cjs +90 -0
- package/dist/plugin/node-cjs/plugins/esbuild-plugin.cjs.map +7 -0
- package/dist/plugin/node-cjs/plugins/plugin.cjs +124 -0
- package/dist/plugin/node-cjs/plugins/plugin.cjs.map +7 -0
- package/dist/plugin/node-cjs/theme.css +1378 -0
- package/dist/plugin/node-cjs/theme.css.map +7 -0
- package/dist/plugin/node-esm/chunk-6EGZAB2N.mjs +1628 -0
- package/dist/plugin/node-esm/chunk-6EGZAB2N.mjs.map +7 -0
- package/dist/plugin/node-esm/chunk-AFRHJHP4.mjs +49 -0
- package/dist/plugin/node-esm/chunk-AFRHJHP4.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 +98 -0
- package/dist/plugin/node-esm/plugins/plugin.mjs.map +7 -0
- package/dist/plugin/node-esm/theme.css +1378 -0
- package/dist/plugin/node-esm/theme.css.map +7 -0
- package/dist/types/src/Tokens.stories.d.ts +10 -0
- package/dist/types/src/Tokens.stories.d.ts.map +1 -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/colors/alias-colors.d.ts +21 -0
- package/dist/types/src/config/tokens/colors/alias-colors.d.ts.map +1 -0
- package/dist/types/src/config/tokens/colors/index.d.ts +5 -0
- package/dist/types/src/config/tokens/colors/index.d.ts.map +1 -0
- package/dist/types/src/config/tokens/colors/physical-colors.d.ts +23 -0
- package/dist/types/src/config/tokens/colors/physical-colors.d.ts.map +1 -0
- package/dist/types/src/config/tokens/colors/semantic-colors.d.ts +192 -0
- package/dist/types/src/config/tokens/colors/semantic-colors.d.ts.map +1 -0
- package/dist/types/src/config/tokens/colors/sememes-calls.d.ts +3 -0
- package/dist/types/src/config/tokens/colors/sememes-calls.d.ts.map +1 -0
- package/dist/types/src/config/tokens/colors/sememes-codemirror.d.ts +43 -0
- package/dist/types/src/config/tokens/colors/sememes-codemirror.d.ts.map +1 -0
- package/dist/types/src/config/tokens/colors/sememes-hue.d.ts +4 -0
- package/dist/types/src/config/tokens/colors/sememes-hue.d.ts.map +1 -0
- package/dist/types/src/config/tokens/colors/sememes-sheet.d.ts +58 -0
- package/dist/types/src/config/tokens/colors/sememes-sheet.d.ts.map +1 -0
- package/dist/types/src/config/tokens/colors/sememes-system.d.ts +104 -0
- package/dist/types/src/config/tokens/colors/sememes-system.d.ts.map +1 -0
- package/dist/types/src/config/tokens/colors/types.d.ts +5 -0
- package/dist/types/src/config/tokens/colors/types.d.ts.map +1 -0
- package/dist/types/src/config/tokens/index.d.ts +3 -0
- package/dist/types/src/config/tokens/index.d.ts.map +1 -0
- package/dist/types/src/config/tokens/lengths.d.ts +142 -0
- package/dist/types/src/config/tokens/lengths.d.ts.map +1 -0
- package/dist/types/src/config/tokens/sizes.d.ts +9 -0
- package/dist/types/src/config/tokens/sizes.d.ts.map +1 -0
- package/dist/types/src/config/tokens/tokens.d.ts +498 -0
- package/dist/types/src/config/tokens/tokens.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +13 -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 +20 -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 +17 -0
- package/dist/types/src/styles/components/dialog.d.ts.map +1 -0
- package/dist/types/src/styles/components/icon-button.d.ts +8 -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 +25 -0
- package/dist/types/src/styles/components/index.d.ts.map +1 -0
- package/dist/types/src/styles/components/input.d.ts +110 -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 +16 -0
- package/dist/types/src/styles/components/scroll-area.d.ts.map +1 -0
- package/dist/types/src/styles/components/select.d.ts +13 -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/skeleton.d.ts +7 -0
- package/dist/types/src/styles/components/skeleton.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 +11 -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 +17 -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 +5 -0
- package/dist/types/src/styles/index.d.ts.map +1 -0
- package/dist/types/src/styles/primitives/container.d.ts +15 -0
- package/dist/types/src/styles/primitives/container.d.ts.map +1 -0
- package/dist/types/src/styles/primitives/index.d.ts +2 -0
- package/dist/types/src/styles/primitives/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 +3 -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-styles.d.ts +15 -0
- package/dist/types/src/util/hash-styles.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 +10 -6
- package/src/Tokens.stories.tsx +2 -2
- package/src/config/index.ts +1 -1
- package/src/config/tailwind.ts +79 -64
- package/src/config/tokens/colors/index.ts +8 -0
- package/src/config/tokens/{sememes-system.ts → colors/sememes-system.ts} +79 -70
- package/src/config/tokens/index.ts +2 -88
- package/src/config/tokens/lengths.ts +18 -10
- package/src/config/tokens/sizes.ts +7 -2
- package/src/config/tokens/tokens.ts +87 -0
- package/src/index.ts +4 -3
- package/src/styles/components/dialog.ts +27 -3
- package/src/styles/components/index.ts +1 -0
- package/src/styles/components/input.ts +2 -2
- package/src/styles/components/main.ts +7 -9
- package/src/styles/components/menu.ts +2 -10
- package/src/styles/components/popover.ts +3 -3
- package/src/styles/components/scroll-area.ts +70 -23
- package/src/styles/components/skeleton.ts +23 -0
- package/src/styles/components/tag.ts +1 -1
- package/src/styles/components/toolbar.ts +16 -9
- package/src/styles/components/tooltip.ts +2 -2
- package/src/styles/fragments/motion.ts +1 -1
- package/src/styles/fragments/size.ts +2 -2
- package/src/styles/index.ts +2 -1
- package/src/styles/layers/dialog.css +52 -21
- package/src/styles/layers/index.css +1 -0
- package/src/styles/layers/main.css +30 -7
- package/src/styles/layers/scrollbar.css +11 -0
- package/src/styles/layers/size.css +26 -21
- package/src/styles/layers/tokens.css +3 -1
- package/src/styles/layers/typography.css +22 -2
- package/src/styles/primitives/container.ts +33 -0
- package/src/styles/primitives/index.ts +5 -0
- package/src/styles/theme.ts +18 -5
- package/src/tailwind.ts +3 -1
- package/src/types.ts +1 -1
- /package/src/config/tokens/{alias-colors.ts → colors/alias-colors.ts} +0 -0
- /package/src/config/tokens/{physical-colors.ts → colors/physical-colors.ts} +0 -0
- /package/src/config/tokens/{semantic-colors.ts → colors/semantic-colors.ts} +0 -0
- /package/src/config/tokens/{sememes-calls.ts → colors/sememes-calls.ts} +0 -0
- /package/src/config/tokens/{sememes-codemirror.ts → colors/sememes-codemirror.ts} +0 -0
- /package/src/config/tokens/{sememes-hue.ts → colors/sememes-hue.ts} +0 -0
- /package/src/config/tokens/{sememes-sheet.ts → colors/sememes-sheet.ts} +0 -0
- /package/src/config/tokens/{types.ts → colors/types.ts} +0 -0
|
@@ -0,0 +1,87 @@
|
|
|
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, huePalettes, physicalColors, semanticColors, systemAliases, systemSememes } from './colors';
|
|
10
|
+
import { lengthsFacet, maxSizesFacet } from './lengths';
|
|
11
|
+
|
|
12
|
+
const adapterConfig: TailwindAdapterConfig = {
|
|
13
|
+
colors: {
|
|
14
|
+
facet: 'colors',
|
|
15
|
+
disposition: 'overwrite',
|
|
16
|
+
tokenization: 'recursive',
|
|
17
|
+
},
|
|
18
|
+
borderWidth: {
|
|
19
|
+
facet: 'lengths',
|
|
20
|
+
disposition: 'extend',
|
|
21
|
+
tokenization: 'omit-series',
|
|
22
|
+
},
|
|
23
|
+
ringWidth: {
|
|
24
|
+
facet: 'lengths',
|
|
25
|
+
disposition: 'extend',
|
|
26
|
+
tokenization: 'omit-series',
|
|
27
|
+
},
|
|
28
|
+
ringOffsetWidth: {
|
|
29
|
+
facet: 'lengths',
|
|
30
|
+
disposition: 'extend',
|
|
31
|
+
tokenization: 'omit-series',
|
|
32
|
+
},
|
|
33
|
+
outlineWidth: {
|
|
34
|
+
facet: 'lengths',
|
|
35
|
+
disposition: 'extend',
|
|
36
|
+
tokenization: 'omit-series',
|
|
37
|
+
},
|
|
38
|
+
spacing: {
|
|
39
|
+
facet: 'lengths',
|
|
40
|
+
disposition: 'extend',
|
|
41
|
+
tokenization: 'keep-series',
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export const hues = Object.keys(huePalettes);
|
|
46
|
+
|
|
47
|
+
export const tokenSet = {
|
|
48
|
+
colors: {
|
|
49
|
+
physical: physicalColors,
|
|
50
|
+
semantic: semanticColors,
|
|
51
|
+
alias: aliasColors,
|
|
52
|
+
},
|
|
53
|
+
lengths: lengthsFacet,
|
|
54
|
+
maxSizes: maxSizesFacet,
|
|
55
|
+
} satisfies TokenSet;
|
|
56
|
+
|
|
57
|
+
export const userDefaultTokenSet = {
|
|
58
|
+
colors: {
|
|
59
|
+
physical: {
|
|
60
|
+
definitions: {
|
|
61
|
+
series: {
|
|
62
|
+
neutral: physicalColors.definitions!.series!.neutral,
|
|
63
|
+
primary: physicalColors.definitions!.series!.primary,
|
|
64
|
+
},
|
|
65
|
+
accompanyingSeries: physicalColors.definitions!.accompanyingSeries,
|
|
66
|
+
},
|
|
67
|
+
conditions: physicalColors.conditions,
|
|
68
|
+
series: {
|
|
69
|
+
neutral: physicalColors.series.neutral,
|
|
70
|
+
primary: physicalColors.series.primary,
|
|
71
|
+
},
|
|
72
|
+
namespace: physicalColors.namespace,
|
|
73
|
+
},
|
|
74
|
+
semantic: {
|
|
75
|
+
conditions: semanticColors.conditions,
|
|
76
|
+
sememes: systemSememes,
|
|
77
|
+
namespace: semanticColors.namespace,
|
|
78
|
+
},
|
|
79
|
+
alias: {
|
|
80
|
+
conditions: aliasColors.conditions,
|
|
81
|
+
aliases: systemAliases,
|
|
82
|
+
namespace: aliasColors.namespace,
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
} satisfies TokenSet;
|
|
86
|
+
|
|
87
|
+
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 {
|
|
5
|
+
import { tailwindConfig } from './config';
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
// TODO(burdon): Factor out public vs. internals.
|
|
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
|
|
13
|
+
const { theme: tokens } = tailwindConfig({});
|
|
13
14
|
|
|
14
15
|
export { tokens };
|
|
15
16
|
|
|
@@ -7,20 +7,41 @@ import { type ComponentFunction, type Elevation, type Theme } from '@dxos/ui-typ
|
|
|
7
7
|
import { mx } from '../../util';
|
|
8
8
|
import { descriptionText } from '../fragments';
|
|
9
9
|
|
|
10
|
+
export type DialogSize = 'sm' | 'md' | 'lg' | 'xl';
|
|
11
|
+
|
|
12
|
+
const sizeMap: Record<DialogSize, string> = {
|
|
13
|
+
sm: 'md:!max-is-[24rem]',
|
|
14
|
+
md: 'md:!max-is-[32rem]',
|
|
15
|
+
lg: 'md:!max-is-[40rem]',
|
|
16
|
+
xl: 'md:!max-is-[60rem]',
|
|
17
|
+
};
|
|
18
|
+
|
|
10
19
|
export type DialogStyleProps = {
|
|
11
20
|
srOnly?: boolean;
|
|
12
21
|
inOverlayLayout?: boolean;
|
|
13
22
|
elevation?: Elevation;
|
|
23
|
+
size?: DialogSize;
|
|
14
24
|
};
|
|
15
25
|
|
|
16
26
|
export const dialogOverlay: ComponentFunction<DialogStyleProps> = (_props, ...etc) => mx('dx-dialog__overlay', ...etc);
|
|
17
27
|
|
|
18
|
-
export const dialogContent: ComponentFunction<DialogStyleProps> = ({ inOverlayLayout }, ...etc) =>
|
|
19
|
-
mx(
|
|
20
|
-
'@container dx-dialog__content dx-focus-ring modal-surface density-coarse',
|
|
28
|
+
export const dialogContent: ComponentFunction<DialogStyleProps> = ({ inOverlayLayout, size }, ...etc) => {
|
|
29
|
+
return mx(
|
|
30
|
+
'@container dx-dialog__content dx-focus-ring modal-surface density-coarse is-full gap-4',
|
|
21
31
|
!inOverlayLayout && 'fixed z-50 top-[50%] left-[50%] -translate-x-[50%] -translate-y-[50%]',
|
|
32
|
+
size && sizeMap[size],
|
|
22
33
|
...etc,
|
|
23
34
|
);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export const dialogHeader: ComponentFunction<DialogStyleProps> = (_props, ...etc) =>
|
|
38
|
+
mx('dx-dialog__header flex items-center justify-between', ...etc);
|
|
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);
|
|
24
45
|
|
|
25
46
|
export const dialogTitle: ComponentFunction<DialogStyleProps> = ({ srOnly }, ...etc) =>
|
|
26
47
|
mx('dx-dialog__title', srOnly && 'sr-only', ...etc);
|
|
@@ -31,6 +52,9 @@ export const dialogDescription: ComponentFunction<DialogStyleProps> = ({ srOnly
|
|
|
31
52
|
export const dialogTheme: Theme<DialogStyleProps> = {
|
|
32
53
|
overlay: dialogOverlay,
|
|
33
54
|
content: dialogContent,
|
|
55
|
+
header: dialogHeader,
|
|
56
|
+
body: dialogBody,
|
|
57
|
+
actionbar: dialogActionBar,
|
|
34
58
|
title: dialogTitle,
|
|
35
59
|
description: dialogDescription,
|
|
36
60
|
};
|
|
@@ -47,6 +47,7 @@ export type InputMetaStyleProps = Partial<{
|
|
|
47
47
|
validationValence: MessageValence;
|
|
48
48
|
}>;
|
|
49
49
|
|
|
50
|
+
// TODO(burdon): Use semantic tokens.
|
|
50
51
|
export const neutralInputValence = '';
|
|
51
52
|
export const successInputValence = 'shadow-emerald-500/50 dark:shadow-emerald-600/50';
|
|
52
53
|
export const infoInputValence = 'shadow-cyan-500/50 dark:shadow-cyan-600/50';
|
|
@@ -64,8 +65,7 @@ const booleanInputSurface =
|
|
|
64
65
|
const booleanInputSurfaceHover =
|
|
65
66
|
'hover:bg-unAccentHover hover:aria-checked:bg-accentSurfaceHover hover:aria-[checked=mixed]:bg-accentSurfaceHover';
|
|
66
67
|
|
|
67
|
-
|
|
68
|
-
'text-description text-xs font-medium mbs-inputSpacingBlock mbe-labelSpacingBlock first:mbs-0';
|
|
68
|
+
const inputTextLabel = 'text-sm text-description plb-1';
|
|
69
69
|
|
|
70
70
|
export const inputValence = (valence?: MessageValence) => {
|
|
71
71
|
switch (valence) {
|
|
@@ -6,26 +6,24 @@ import { type ComponentFunction } from '@dxos/ui-types';
|
|
|
6
6
|
|
|
7
7
|
import { mx } from '../../util';
|
|
8
8
|
|
|
9
|
-
// Padding to apply to in-flow elements which need to clear the fixed topbar
|
|
9
|
+
// Padding to apply to in-flow elements which need to clear the fixed topbar/bottombar.
|
|
10
10
|
export const topbarBlockPaddingStart = 'pbs-[--topbar-size] sticky-top-from-topbar-bottom';
|
|
11
11
|
export const bottombarBlockPaddingEnd = 'pbe-[--statusbar-size] sticky-bottom-from-statusbar-bottom';
|
|
12
12
|
|
|
13
|
+
export const mainPadding = 'dx-main-content-padding';
|
|
14
|
+
export const mainPaddingTransitions = 'dx-main-content-padding-transitions';
|
|
15
|
+
export const mainIntrinsicSize = 'dx-main-intrinsic-size';
|
|
16
|
+
|
|
13
17
|
export type MainStyleProps = Partial<{
|
|
14
18
|
bounce: boolean;
|
|
15
19
|
handlesFocus: boolean;
|
|
16
20
|
}>;
|
|
17
21
|
|
|
18
|
-
export const mainSidebar: ComponentFunction<MainStyleProps> = (_, ...etc) =>
|
|
19
|
-
mx('dx-main-sidebar', 'dx-focus-ring-inset-over-all', ...etc);
|
|
20
|
-
|
|
21
|
-
export const mainPadding = 'dx-main-content-padding';
|
|
22
|
-
|
|
23
|
-
export const mainPaddingTransitions = 'dx-main-content-padding-transitions';
|
|
24
|
-
|
|
25
22
|
export const mainContent: ComponentFunction<MainStyleProps> = ({ bounce }, ...etc) =>
|
|
26
23
|
mx(mainPadding, mainPaddingTransitions, bounce && 'dx-main-bounce-layout', 'dx-focus-ring-main', ...etc);
|
|
27
24
|
|
|
28
|
-
export const
|
|
25
|
+
export const mainSidebar: ComponentFunction<MainStyleProps> = (_, ...etc) =>
|
|
26
|
+
mx('dx-main-sidebar', 'dx-focus-ring-inset-over-all', ...etc);
|
|
29
27
|
|
|
30
28
|
export const mainOverlay: ComponentFunction<MainStyleProps> = (_, ...etc) => mx('dx-main-overlay', ...etc);
|
|
31
29
|
|
|
@@ -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-
|
|
20
|
-
constrainInline && 'max-is-[--radix-popover-content-available-width] overflow-
|
|
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
|
|
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> = (
|
|
12
|
-
mx(
|
|
18
|
+
export const scrollAreaRoot: ComponentFunction<ScrollAreaStyleProps> = ({ orientation, margin, thin }, ...etc) =>
|
|
19
|
+
mx(
|
|
20
|
+
'overflow-hidden',
|
|
13
21
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
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
|
-
'
|
|
31
|
-
|
|
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
|
+
};
|
|
@@ -16,7 +16,7 @@ export type TagStyleProps = {
|
|
|
16
16
|
palette?: ChromaticPalette | NeutralPalette | MessageValence;
|
|
17
17
|
};
|
|
18
18
|
|
|
19
|
-
export const tagRoot: ComponentFunction<TagStyleProps> = (
|
|
19
|
+
export const tagRoot: ComponentFunction<TagStyleProps> = (_, ...etc) => mx('dx-tag', ...etc);
|
|
20
20
|
|
|
21
21
|
export const tagTheme: Theme<TagStyleProps> = {
|
|
22
22
|
root: tagRoot,
|
|
@@ -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<{
|
|
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
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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,
|
|
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,
|
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
export const popperMotion =
|
|
6
|
-
'will-change-[opacity,transform] data-[side=top]:animate-
|
|
6
|
+
'will-change-[opacity,transform] data-[side=top]:animate-slide-down-and-fade data-[side=right]:animate-slide-left-and-fade data-[side=bottom]:animate-slide-up-and-fade data-[side=left]:animate-slide-right-and-fade';
|
|
@@ -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'],
|
package/src/styles/index.ts
CHANGED
|
@@ -1,42 +1,73 @@
|
|
|
1
1
|
@layer dx-components {
|
|
2
2
|
.dx-dialog__overlay {
|
|
3
|
-
@apply
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
@apply z-50 fixed grid inset-inline-0 block-start-0 bs-dvh pbs-[env(safe-area-inset-top)] place-items-center overflow-auto bg-scrimSurface;
|
|
4
|
+
|
|
5
|
+
&[data-state='open'] {
|
|
6
|
+
@apply animate-fade-in;
|
|
6
7
|
}
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
|
|
9
|
+
&[data-state='closed'] {
|
|
10
|
+
@apply animate-fade-out;
|
|
9
11
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
&[data-block-align="start"]{
|
|
12
|
+
|
|
13
|
+
&[data-block-align='start'] {
|
|
14
14
|
align-items: start;
|
|
15
15
|
justify-items: center;
|
|
16
16
|
}
|
|
17
|
-
|
|
17
|
+
|
|
18
|
+
&[data-block-align='center'] {
|
|
18
19
|
place-items: center;
|
|
19
20
|
}
|
|
20
|
-
|
|
21
|
+
|
|
22
|
+
&[data-block-align='end'] {
|
|
21
23
|
align-items: end;
|
|
22
24
|
justify-items: center;
|
|
23
25
|
}
|
|
24
26
|
}
|
|
27
|
+
|
|
28
|
+
@media (min-width: theme('screens.sm')) {
|
|
29
|
+
.dx-dialog__overlay {
|
|
30
|
+
@apply p-[calc(env(safe-area-inset-top)+.6rem)];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
@media (min-width: theme('screens.md')) {
|
|
35
|
+
.dx-dialog__overlay {
|
|
36
|
+
@apply p-[calc(env(safe-area-inset-top)+1.2rem)];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@media (min-width: theme('screens.lg')) {
|
|
41
|
+
.dx-dialog__overlay {
|
|
42
|
+
@apply p-[calc(env(safe-area-inset-top)+2.4rem)];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
25
46
|
.dx-dialog__content {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
47
|
+
@apply flex flex-col is-dvw max-bs-full max-is-full p-4 overflow-hidden shadow-md backdrop-blur;
|
|
48
|
+
|
|
49
|
+
&[data-state='open'] {
|
|
50
|
+
@apply animate-slide-up-and-fade;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
&[data-state='closed'] {
|
|
54
|
+
@apply animate-slide-down-and-fade;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@media (min-width: theme('screens.sm')) {
|
|
59
|
+
.dx-dialog__content {
|
|
30
60
|
@apply is-[95vw] border rounded-md border-separator;
|
|
31
61
|
}
|
|
32
|
-
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@media (min-width: theme('screens.md')) {
|
|
65
|
+
.dx-dialog__content {
|
|
33
66
|
@apply max-is-[24rem];
|
|
34
67
|
}
|
|
35
68
|
}
|
|
69
|
+
|
|
36
70
|
.dx-dialog__title {
|
|
37
|
-
@apply
|
|
38
|
-
}
|
|
39
|
-
.dx-dialog__description {
|
|
40
|
-
@apply mlb-2;
|
|
71
|
+
@apply shrink-0 text-xl font-medium;
|
|
41
72
|
}
|
|
42
|
-
}
|
|
73
|
+
}
|