@koide-labs/ui 0.0.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/.husky/pre-commit +1 -0
- package/.storybook/main.ts +25 -0
- package/.storybook/preview-head.html +6 -0
- package/.storybook/preview.tsx +48 -0
- package/.storybook/vitest.setup.ts +8 -0
- package/README.md +11 -0
- package/eslint.config.mjs +29 -0
- package/lint-staged.config.js +15 -0
- package/package.json +95 -0
- package/pnpm-workspace.yaml +2 -0
- package/postcss.config.mjs +7 -0
- package/prettier.config.mjs +24 -0
- package/scripts/build-icon-types.ts +38 -0
- package/src/-types.ts +8 -0
- package/src/-utils.tsx +64 -0
- package/src/components/accordion/accordion.module.css +44 -0
- package/src/components/accordion/accordion.stories.tsx +36 -0
- package/src/components/accordion/index.tsx +67 -0
- package/src/components/alert-dialog/alert-dialog.module.css +5 -0
- package/src/components/alert-dialog/alert-dialog.stories.tsx +53 -0
- package/src/components/alert-dialog/index.tsx +138 -0
- package/src/components/anchor/anchor.module.css +18 -0
- package/src/components/anchor/anchor.stories.tsx +28 -0
- package/src/components/anchor/index.tsx +45 -0
- package/src/components/avatar/avatar.module.css +56 -0
- package/src/components/avatar/avatar.stories.tsx +61 -0
- package/src/components/avatar/index.tsx +82 -0
- package/src/components/badge/badge.module.css +35 -0
- package/src/components/badge/badge.stories.tsx +60 -0
- package/src/components/badge/index.tsx +71 -0
- package/src/components/button/button.module.css +42 -0
- package/src/components/button/button.stories.tsx +108 -0
- package/src/components/button/index.tsx +63 -0
- package/src/components/checkbox/checkbox.module.css +36 -0
- package/src/components/checkbox/checkbox.stories.tsx +21 -0
- package/src/components/checkbox/index.tsx +41 -0
- package/src/components/code/code.module.css +20 -0
- package/src/components/code/code.stories.tsx +42 -0
- package/src/components/code/index.tsx +73 -0
- package/src/components/collapse/collapse.module.css +27 -0
- package/src/components/collapse/collapse.stories.tsx +27 -0
- package/src/components/collapse/index.tsx +59 -0
- package/src/components/command/command.module.css +95 -0
- package/src/components/command/command.stories.tsx +38 -0
- package/src/components/command/index.tsx +108 -0
- package/src/components/context-menu/context-menu.module.css +36 -0
- package/src/components/context-menu/context-menu.stories.tsx +99 -0
- package/src/components/context-menu/index.tsx +242 -0
- package/src/components/dialog/dialog.module.css +71 -0
- package/src/components/dialog/dialog.stories.tsx +29 -0
- package/src/components/dialog/index.tsx +148 -0
- package/src/components/heading/heading.module.css +3 -0
- package/src/components/heading/heading.stories.tsx +52 -0
- package/src/components/heading/index.tsx +112 -0
- package/src/components/icon/icon-names.ts +3189 -0
- package/src/components/icon/icon.module.css +36 -0
- package/src/components/icon/icon.stories.tsx +40 -0
- package/src/components/icon/index.tsx +60 -0
- package/src/components/icon-button/icon-button.module.css +33 -0
- package/src/components/icon-button/icon-button.stories.tsx +59 -0
- package/src/components/icon-button/index.tsx +48 -0
- package/src/components/inline-code/index.tsx +29 -0
- package/src/components/inline-code/inline-code.module.css +13 -0
- package/src/components/inline-code/inline-code.stories.tsx +31 -0
- package/src/components/input/index.tsx +22 -0
- package/src/components/input/input.module.css +23 -0
- package/src/components/input/input.stories.tsx +52 -0
- package/src/components/meter/index.tsx +55 -0
- package/src/components/meter/meter.module.css +23 -0
- package/src/components/meter/meter.stories.tsx +31 -0
- package/src/components/multiline-input/index.tsx +58 -0
- package/src/components/multiline-input/multiline-input.stories.tsx +26 -0
- package/src/components/number-input/index.tsx +74 -0
- package/src/components/number-input/number-input.module.css +41 -0
- package/src/components/number-input/number-input.stories.tsx +24 -0
- package/src/components/password-input/index.tsx +24 -0
- package/src/components/password-input/password-input.module.css +10 -0
- package/src/components/password-input/password-input.stories.tsx +24 -0
- package/src/components/pill/index.tsx +45 -0
- package/src/components/pill/pill.module.css +22 -0
- package/src/components/pill/pill.stories.tsx +83 -0
- package/src/components/popover/index.tsx +94 -0
- package/src/components/popover/popover.module.css +8 -0
- package/src/components/popover/popover.stories.tsx +53 -0
- package/src/components/preview-card/index.tsx +68 -0
- package/src/components/preview-card/preview-card.module.css +5 -0
- package/src/components/preview-card/preview-card.stories.tsx +58 -0
- package/src/components/radio/index.tsx +67 -0
- package/src/components/radio/radio-group.module.css +5 -0
- package/src/components/radio/radio.module.css +36 -0
- package/src/components/radio/radio.stories.tsx +27 -0
- package/src/components/search-bar/index.tsx +60 -0
- package/src/components/search-bar/search-bar.module.css +29 -0
- package/src/components/search-bar/search-bar.stories.tsx +37 -0
- package/src/components/select/index.tsx +132 -0
- package/src/components/select/select.module.css +63 -0
- package/src/components/select/select.stories.tsx +49 -0
- package/src/components/separator/index.tsx +28 -0
- package/src/components/separator/separator.module.css +24 -0
- package/src/components/separator/separator.stories.tsx +40 -0
- package/src/components/slider/index.tsx +28 -0
- package/src/components/slider/slider.module.css +52 -0
- package/src/components/slider/slider.stories.tsx +53 -0
- package/src/components/spinner/index.tsx +14 -0
- package/src/components/spinner/spinner.module.css +13 -0
- package/src/components/spinner/spinner.stories.tsx +17 -0
- package/src/components/stacked-avatars/index.tsx +88 -0
- package/src/components/stacked-avatars/stacked-avatars.module.css +79 -0
- package/src/components/stacked-avatars/stacked-avatars.stories.tsx +48 -0
- package/src/components/status-banner/index.tsx +96 -0
- package/src/components/status-banner/status-banner.module.css +52 -0
- package/src/components/status-banner/status-banner.stories.tsx +44 -0
- package/src/components/surface/index.tsx +83 -0
- package/src/components/surface/surface.module.css +35 -0
- package/src/components/surface/surface.stories.tsx +84 -0
- package/src/components/switch/index.tsx +23 -0
- package/src/components/switch/switch.module.css +45 -0
- package/src/components/switch/switch.stories.tsx +48 -0
- package/src/components/tabs/index.tsx +126 -0
- package/src/components/tabs/tabs.module.css +134 -0
- package/src/components/tabs/tabs.stories.tsx +88 -0
- package/src/components/text/index.tsx +69 -0
- package/src/components/text/text.module.css +76 -0
- package/src/components/text/text.stories.tsx +107 -0
- package/src/components/theme-provider/index.ts +2 -0
- package/src/components/theme-provider/theme-context.tsx +18 -0
- package/src/components/theme-provider/theme-provider.stories.tsx +47 -0
- package/src/components/theme-provider/theme-provider.tsx +77 -0
- package/src/components/timestamp/index.tsx +131 -0
- package/src/components/timestamp/timestamp.module.css +8 -0
- package/src/components/timestamp/timestamp.stories.tsx +37 -0
- package/src/components/toast/index.ts +2 -0
- package/src/components/toast/toast.module.css +163 -0
- package/src/components/toast/toast.stories.tsx +53 -0
- package/src/components/toast/toast.tsx +104 -0
- package/src/components/toast/use-toast-manager.ts +63 -0
- package/src/components/tooltip/index.tsx +61 -0
- package/src/components/tooltip/tooltip-arrow.tsx +17 -0
- package/src/components/tooltip/tooltip.module.css +44 -0
- package/src/components/tooltip/tooltip.stories.tsx +76 -0
- package/src/components/view/index.tsx +137 -0
- package/src/components/view/view.module.css +11 -0
- package/src/components/view/view.stories.tsx +131 -0
- package/src/components/view/view_colorway.module.css +280 -0
- package/src/components/view/view_interactive.module.css +127 -0
- package/src/components/view/view_loading.module.css +58 -0
- package/src/components/visually-hidden/index.ts +1 -0
- package/src/index.ts +49 -0
- package/src/integrations/react-markdown/index.tsx +134 -0
- package/src/integrations/react-markdown/react-markdown.module.css +62 -0
- package/src/integrations/react-markdown/react-markdown.stories.tsx +31 -0
- package/src/integrations/remix.ts +12 -0
- package/src/integrations/tailwind.css +173 -0
- package/src/integrations/twemoij/index.tsx +13 -0
- package/src/integrations/twemoij/twemoji.module.css +7 -0
- package/src/integrations/twemoij/twemoji.stories.tsx +40 -0
- package/src/stories/components/all-variants.tsx +40 -0
- package/src/stories/data.ts +72 -0
- package/src/stories/utils.ts +20 -0
- package/src/styles/core.css +153 -0
- package/src/styles/themes/dark.css +86 -0
- package/src/styles/themes/light.css +86 -0
- package/src/styles/tokens.ts +282 -0
- package/src/styles/transitions.module.css +31 -0
- package/stylelint.config.mjs +29 -0
- package/tsconfig.app.json +35 -0
- package/tsconfig.json +7 -0
- package/tsconfig.node.json +26 -0
- package/vite.config.ts +103 -0
- package/vitest.shims.d.ts +1 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
[data-theme="light"] {
|
|
2
|
+
@nested-import "prismjs/themes/prism.css";
|
|
3
|
+
|
|
4
|
+
--shadow-1: 0px 4px 8px 0px rgba(2, 2, 3, 0.1);
|
|
5
|
+
--shadow-2: 0px 8px 16px 0px rgba(2, 2, 3, 0.15);
|
|
6
|
+
--shadow-3: 0px 16px 32px 0px rgba(2, 2, 3, 0.2);
|
|
7
|
+
|
|
8
|
+
--background-root: #ebeced;
|
|
9
|
+
--background-default: #fcfcfc;
|
|
10
|
+
--background-higher: #f0f1f2;
|
|
11
|
+
--background-highest: #e4e5e6;
|
|
12
|
+
--background-overlay: #f0f1f2a0;
|
|
13
|
+
--foreground-default: #07080a;
|
|
14
|
+
--foreground-dimmer: #3d4047;
|
|
15
|
+
--foreground-dimmest: #5c5f66;
|
|
16
|
+
--outline-dimmest: #d2d4d6;
|
|
17
|
+
--outline-dimmer: #c0c3c4;
|
|
18
|
+
--outline-default: #afb1b3;
|
|
19
|
+
--outline-stronger: #98999c;
|
|
20
|
+
--outline-strongest: #74767a;
|
|
21
|
+
--red-dimmest: #ffc7c7;
|
|
22
|
+
--red-dimmer: #ff9494;
|
|
23
|
+
--red-default: #fa4b4b;
|
|
24
|
+
--red-stronger: #c20a0a;
|
|
25
|
+
--red-strongest: #8a0000;
|
|
26
|
+
--orange-dimmest: #ffcc99;
|
|
27
|
+
--orange-dimmer: #ff9933;
|
|
28
|
+
--orange-default: #d96d00;
|
|
29
|
+
--orange-stronger: #964b00;
|
|
30
|
+
--orange-strongest: #693400;
|
|
31
|
+
--yellow-dimmest: #ebd66e;
|
|
32
|
+
--yellow-dimmer: #cfb015;
|
|
33
|
+
--yellow-default: #a68a00;
|
|
34
|
+
--yellow-stronger: #736000;
|
|
35
|
+
--yellow-strongest: #4f4200;
|
|
36
|
+
--lime-dimmest: #c0e378;
|
|
37
|
+
--lime-dimmer: #93c926;
|
|
38
|
+
--lime-default: #639400;
|
|
39
|
+
--lime-stronger: #466900;
|
|
40
|
+
--lime-strongest: #3a5700;
|
|
41
|
+
--green-dimmest: #7aeb8d;
|
|
42
|
+
--green-dimmer: #3cc954;
|
|
43
|
+
--green-default: #00a11b;
|
|
44
|
+
--green-stronger: #036e15;
|
|
45
|
+
--green-strongest: #004d0d;
|
|
46
|
+
--teal-dimmest: #6fe5fc;
|
|
47
|
+
--teal-dimmer: #22c1e0;
|
|
48
|
+
--teal-default: #0093b0;
|
|
49
|
+
--teal-stronger: #00687d;
|
|
50
|
+
--teal-strongest: #004857;
|
|
51
|
+
--blue-dimmest: #b2d9ff;
|
|
52
|
+
--blue-dimmer: #6bb5ff;
|
|
53
|
+
--blue-default: #0f87ff;
|
|
54
|
+
--blue-stronger: #005cb8;
|
|
55
|
+
--blue-strongest: #004182;
|
|
56
|
+
--blurple-dimmest: #d7cfff;
|
|
57
|
+
--blurple-dimmer: #b2a3ff;
|
|
58
|
+
--blurple-default: #8e78ff;
|
|
59
|
+
--blurple-stronger: #5b40e3;
|
|
60
|
+
--blurple-strongest: #412f9c;
|
|
61
|
+
--purple-dimmest: #e6ccff;
|
|
62
|
+
--purple-dimmer: #d0a1ff;
|
|
63
|
+
--purple-default: #b266ff;
|
|
64
|
+
--purple-stronger: #7f38c7;
|
|
65
|
+
--purple-strongest: #5b278f;
|
|
66
|
+
--magenta-dimmest: #ffbfff;
|
|
67
|
+
--magenta-dimmer: #ff82ff;
|
|
68
|
+
--magenta-default: #eb3beb;
|
|
69
|
+
--magenta-stronger: #a321a3;
|
|
70
|
+
--magenta-strongest: #731c73;
|
|
71
|
+
--pink-dimmest: #ffc7ec;
|
|
72
|
+
--pink-dimmer: #ff87d7;
|
|
73
|
+
--pink-default: #f545ba;
|
|
74
|
+
--pink-stronger: #ab2980;
|
|
75
|
+
--pink-strongest: #781e5a;
|
|
76
|
+
--grey-dimmest: #d5d5d5;
|
|
77
|
+
--grey-dimmer: #b0b0b0;
|
|
78
|
+
--grey-default: #898989;
|
|
79
|
+
--grey-stronger: #616161;
|
|
80
|
+
--grey-strongest: #454545;
|
|
81
|
+
--brown-dimmest: #ffc9ab;
|
|
82
|
+
--brown-dimmer: #dea483;
|
|
83
|
+
--brown-default: #b07f63;
|
|
84
|
+
--brown-stronger: #805740;
|
|
85
|
+
--brown-strongest: #573e30;
|
|
86
|
+
}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import type { InvertRecord, ValueOf } from "~/-types";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Size variants for widths, buttons, icon sizes, you name it!
|
|
5
|
+
* Use `Extract` if you don't want to support all of them but ensure we reuse
|
|
6
|
+
* correct values.
|
|
7
|
+
* @example
|
|
8
|
+
* // only support a subset of size variants
|
|
9
|
+
* Extract<Size, "sm" | "md" | "lg">
|
|
10
|
+
*/
|
|
11
|
+
export type Size = "sm" | "md" | "lg" | "xl" | "2xl" | "3xl";
|
|
12
|
+
|
|
13
|
+
export type SpaceToken = ValueOf<typeof spaceTokens>;
|
|
14
|
+
export type ColorToken = ValueOf<typeof colorTokens>;
|
|
15
|
+
export type InteractiveToken = ValueOf<typeof interactiveTokens>;
|
|
16
|
+
export type Token = ValueOf<typeof tokens>;
|
|
17
|
+
|
|
18
|
+
export const colorTokens = {
|
|
19
|
+
backgroundRoot: "var(--background-root)",
|
|
20
|
+
backgroundDefault: "var(--background-default)",
|
|
21
|
+
backgroundHigher: "var(--background-higher)",
|
|
22
|
+
backgroundHighest: "var(--background-highest)",
|
|
23
|
+
backgroundOverlay: "var(--background-overlay)",
|
|
24
|
+
foregroundDefault: "var(--foreground-default)",
|
|
25
|
+
foregroundDimmer: "var(--foreground-dimmer)",
|
|
26
|
+
foregroundDimmest: "var(--foreground-dimmest)",
|
|
27
|
+
outlineDimmest: "var(--outline-dimmest)",
|
|
28
|
+
outlineDimmer: "var(--outline-dimmer)",
|
|
29
|
+
outlineDefault: "var(--outline-default)",
|
|
30
|
+
outlineStronger: "var(--outline-stronger)",
|
|
31
|
+
outlineStrongest: "var(--outline-strongest)",
|
|
32
|
+
primaryDimmest: "var(--primary-dimmest)",
|
|
33
|
+
primaryDimmer: "var(--primary-dimmer)",
|
|
34
|
+
primaryDefault: "var(--primary-default)",
|
|
35
|
+
primaryStronger: "var(--primary-stronger)",
|
|
36
|
+
primaryStrongest: "var(--primary-strongest)",
|
|
37
|
+
positiveDimmest: "var(--positive-dimmest)",
|
|
38
|
+
positiveDimmer: "var(--positive-dimmer)",
|
|
39
|
+
positiveDefault: "var(--positive-default)",
|
|
40
|
+
positiveStronger: "var(--positive-stronger)",
|
|
41
|
+
positiveStrongest: "var(--positive-strongest)",
|
|
42
|
+
negativeDimmest: "var(--negative-dimmest)",
|
|
43
|
+
negativeDimmer: "var(--negative-dimmer)",
|
|
44
|
+
negativeDefault: "var(--negative-default)",
|
|
45
|
+
negativeStronger: "var(--negative-stronger)",
|
|
46
|
+
negativeStrongest: "var(--negative-strongest)",
|
|
47
|
+
redDimmest: "var(--red-dimmest)",
|
|
48
|
+
redDimmer: "var(--red-dimmer)",
|
|
49
|
+
redDefault: "var(--red-default)",
|
|
50
|
+
redStronger: "var(--red-stronger)",
|
|
51
|
+
redStrongest: "var(--red-strongest)",
|
|
52
|
+
orangeDimmest: "var(--orange-dimmest)",
|
|
53
|
+
orangeDimmer: "var(--orange-dimmer)",
|
|
54
|
+
orangeDefault: "var(--orange-default)",
|
|
55
|
+
orangeStronger: "var(--orange-stronger)",
|
|
56
|
+
orangeStrongest: "var(--orange-strongest)",
|
|
57
|
+
yellowDimmest: "var(--yellow-dimmest)",
|
|
58
|
+
yellowDimmer: "var(--yellow-dimmer)",
|
|
59
|
+
yellowDefault: "var(--yellow-default)",
|
|
60
|
+
yellowStronger: "var(--yellow-stronger)",
|
|
61
|
+
yellowStrongest: "var(--yellow-strongest)",
|
|
62
|
+
limeDimmest: "var(--lime-dimmest)",
|
|
63
|
+
limeDimmer: "var(--lime-dimmer)",
|
|
64
|
+
limeDefault: "var(--lime-default)",
|
|
65
|
+
limeStronger: "var(--lime-stronger)",
|
|
66
|
+
limeStrongest: "var(--lime-strongest)",
|
|
67
|
+
greenDimmest: "var(--green-dimmest)",
|
|
68
|
+
greenDimmer: "var(--green-dimmer)",
|
|
69
|
+
greenDefault: "var(--green-default)",
|
|
70
|
+
greenStronger: "var(--green-stronger)",
|
|
71
|
+
greenStrongest: "var(--green-strongest)",
|
|
72
|
+
tealDimmest: "var(--teal-dimmest)",
|
|
73
|
+
tealDimmer: "var(--teal-dimmer)",
|
|
74
|
+
tealDefault: "var(--teal-default)",
|
|
75
|
+
tealStronger: "var(--teal-stronger)",
|
|
76
|
+
tealStrongest: "var(--teal-strongest)",
|
|
77
|
+
blueDimmest: "var(--blue-dimmest)",
|
|
78
|
+
blueDimmer: "var(--blue-dimmer)",
|
|
79
|
+
blueDefault: "var(--blue-default)",
|
|
80
|
+
blueStronger: "var(--blue-stronger)",
|
|
81
|
+
blueStrongest: "var(--blue-strongest)",
|
|
82
|
+
blurpleDimmest: "var(--blurple-dimmest)",
|
|
83
|
+
blurpleDimmer: "var(--blurple-dimmer)",
|
|
84
|
+
blurpleDefault: "var(--blurple-default)",
|
|
85
|
+
blurpleStronger: "var(--blurple-stronger)",
|
|
86
|
+
blurpleStrongest: "var(--blurple-strongest)",
|
|
87
|
+
purpleDimmest: "var(--purple-dimmest)",
|
|
88
|
+
purpleDimmer: "var(--purple-dimmer)",
|
|
89
|
+
purpleDefault: "var(--purple-default)",
|
|
90
|
+
purpleStronger: "var(--purple-stronger)",
|
|
91
|
+
purpleStrongest: "var(--purple-strongest)",
|
|
92
|
+
magentaDimmest: "var(--magenta-dimmest)",
|
|
93
|
+
magentaDimmer: "var(--magenta-dimmer)",
|
|
94
|
+
magentaDefault: "var(--magenta-default)",
|
|
95
|
+
magentaStronger: "var(--magenta-stronger)",
|
|
96
|
+
magentaStrongest: "var(--magenta-strongest)",
|
|
97
|
+
pinkDimmest: "var(--pink-dimmest)",
|
|
98
|
+
pinkDimmer: "var(--pink-dimmer)",
|
|
99
|
+
pinkDefault: "var(--pink-default)",
|
|
100
|
+
pinkStronger: "var(--pink-stronger)",
|
|
101
|
+
pinkStrongest: "var(--pink-strongest)",
|
|
102
|
+
greyDimmest: "var(--grey-dimmest)",
|
|
103
|
+
greyDimmer: "var(--grey-dimmer)",
|
|
104
|
+
greyDefault: "var(--grey-default)",
|
|
105
|
+
greyStronger: "var(--grey-stronger)",
|
|
106
|
+
greyStrongest: "var(--grey-strongest)",
|
|
107
|
+
brownDimmest: "var(--brown-dimmest)",
|
|
108
|
+
brownDimmer: "var(--brown-dimmer)",
|
|
109
|
+
brownDefault: "var(--brown-default)",
|
|
110
|
+
brownStronger: "var(--brown-stronger)",
|
|
111
|
+
brownStrongest: "var(--brown-strongest)",
|
|
112
|
+
black: "var(--black)",
|
|
113
|
+
white: "var(--white)",
|
|
114
|
+
} as const;
|
|
115
|
+
|
|
116
|
+
export const interactiveTokens = {
|
|
117
|
+
surfaceBackground: "var(--surface-background)",
|
|
118
|
+
interactiveBackground: "var(--surface-interactive-background)",
|
|
119
|
+
interactiveBackgroundActive: "var(--surface-interactive-background--active)",
|
|
120
|
+
interactiveBorder: "var(--surface-interactive-border)",
|
|
121
|
+
interactiveBorderHover: "var(--surface-interactive-border--hover)",
|
|
122
|
+
} as const;
|
|
123
|
+
|
|
124
|
+
export const colorwayTokens = {
|
|
125
|
+
colorwayDimmest: "var(--view-colorway-dimmest)",
|
|
126
|
+
colorwayDimmer: "var(--view-colorway-dimmer)",
|
|
127
|
+
colorwayDefault: "var(--view-colorway-default)",
|
|
128
|
+
colorwayStronger: "var(--view-colorway-stronger)",
|
|
129
|
+
colorwayStrongest: "var(--view-colorway-strongest)",
|
|
130
|
+
} as const;
|
|
131
|
+
|
|
132
|
+
export const spaceTokens = {
|
|
133
|
+
space1: "var(--space-1)",
|
|
134
|
+
space2: "var(--space-2)",
|
|
135
|
+
space4: "var(--space-4)",
|
|
136
|
+
space6: "var(--space-6)",
|
|
137
|
+
space8: "var(--space-8)",
|
|
138
|
+
space12: "var(--space-12)",
|
|
139
|
+
space16: "var(--space-16)",
|
|
140
|
+
space20: "var(--space-20)",
|
|
141
|
+
space24: "var(--space-24)",
|
|
142
|
+
space28: "var(--space-28)",
|
|
143
|
+
space32: "var(--space-32)",
|
|
144
|
+
space40: "var(--space-40)",
|
|
145
|
+
space48: "var(--space-48)",
|
|
146
|
+
space56: "var(--space-56)",
|
|
147
|
+
space64: "var(--space-64)",
|
|
148
|
+
space80: "var(--space-80)",
|
|
149
|
+
space96: "var(--space-96)",
|
|
150
|
+
space128: "var(--space-128)",
|
|
151
|
+
space256: "var(--space-256)",
|
|
152
|
+
spaceDefault: "var(--space-default)",
|
|
153
|
+
} as const;
|
|
154
|
+
|
|
155
|
+
export const borderTokens = {
|
|
156
|
+
borderRadius1: "var(--border-radius-1)",
|
|
157
|
+
borderRadius2: "var(--border-radius-2)",
|
|
158
|
+
borderRadius4: "var(--border-radius-4)",
|
|
159
|
+
borderRadius6: "var(--border-radius-6)",
|
|
160
|
+
borderRadius8: "var(--border-radius-8)",
|
|
161
|
+
borderRadius12: "var(--border-radius-12)",
|
|
162
|
+
borderRadius16: "var(--border-radius-16)",
|
|
163
|
+
borderRadiusDefault: "var(--border-radius-default)",
|
|
164
|
+
borderRadiusRound: "var(--border-radius-round)",
|
|
165
|
+
borderWidthDefault: "var(--border-width-default)",
|
|
166
|
+
} as const;
|
|
167
|
+
|
|
168
|
+
export const shadowTokens = {
|
|
169
|
+
shadow1: "var(--shadow-1)",
|
|
170
|
+
shadow2: "var(--shadow-2)",
|
|
171
|
+
shadow3: "var(--shadow-3)",
|
|
172
|
+
shadowDefault: "var(--shadow-default)",
|
|
173
|
+
} as const;
|
|
174
|
+
|
|
175
|
+
export const typographyTokens = {
|
|
176
|
+
fontFamilyDefault: "var(--font-family-default)",
|
|
177
|
+
fontFamilyCode: "var(--font-family-code)",
|
|
178
|
+
|
|
179
|
+
fontSizeSmall: "var(--font-size-small)",
|
|
180
|
+
fontSizeDefault: "var(--font-size-default)",
|
|
181
|
+
fontSizeSubheadDefault: "var(--font-size-subhead-default)",
|
|
182
|
+
fontSizeSubheadBig: "var(--font-size-subhead-big)",
|
|
183
|
+
fontSizeHeaderDefault: "var(--font-size-header-default)",
|
|
184
|
+
fontSizeHeaderBig: "var(--font-size-header-big)",
|
|
185
|
+
|
|
186
|
+
lineHeightSmall: "var(--line-height-small)",
|
|
187
|
+
lineHeightDefault: "var(--line-height-default)",
|
|
188
|
+
lineHeightSubheadDefault: "var(--line-height-subhead-default)",
|
|
189
|
+
lineHeightSubheadBig: "var(--line-height-subhead-big)",
|
|
190
|
+
lineHeightHeaderDefault: "var(--line-height-header-default)",
|
|
191
|
+
lineHeightHeaderBig: "var(--line-height-header-big)",
|
|
192
|
+
lineHeightSingle: "var(--line-height-single)",
|
|
193
|
+
lineHeightInput: "var(--line-height-input)",
|
|
194
|
+
|
|
195
|
+
fontWeightRegular: "var(--font-weight-regular)",
|
|
196
|
+
fontWeightMedium: "var(--font-weight-medium)",
|
|
197
|
+
fontWeightBold: "var(--font-weight-bold)",
|
|
198
|
+
} as const;
|
|
199
|
+
|
|
200
|
+
export const transitionTokens = {
|
|
201
|
+
transitionDurationSnappy: "var(--transition-duration-snappy)",
|
|
202
|
+
transitionTimingFunctionSnappy: "var(--transition-timing-function-snappy)",
|
|
203
|
+
transitionDurationChill: "var(--transition-duration-chill)",
|
|
204
|
+
transitionTimingFunctionChill: "var(--transition-timing-function-chill)",
|
|
205
|
+
} as const;
|
|
206
|
+
|
|
207
|
+
export const tokens = {
|
|
208
|
+
...colorTokens,
|
|
209
|
+
...colorwayTokens,
|
|
210
|
+
...interactiveTokens,
|
|
211
|
+
...borderTokens,
|
|
212
|
+
...spaceTokens,
|
|
213
|
+
...shadowTokens,
|
|
214
|
+
...typographyTokens,
|
|
215
|
+
...transitionTokens,
|
|
216
|
+
} as const;
|
|
217
|
+
|
|
218
|
+
function invertRecord<T extends Record<string, string>>(record: T) {
|
|
219
|
+
return Object.entries(record).reduce(
|
|
220
|
+
(acc, [key, value]) => ({
|
|
221
|
+
...acc,
|
|
222
|
+
[value]: key,
|
|
223
|
+
}),
|
|
224
|
+
{},
|
|
225
|
+
) as InvertRecord<T>;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const invertedTokens = invertRecord({
|
|
229
|
+
...borderTokens,
|
|
230
|
+
...spaceTokens,
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
const rawTokenValues = {
|
|
234
|
+
borderRadius1: 1,
|
|
235
|
+
borderRadius2: 2,
|
|
236
|
+
borderRadius4: 4,
|
|
237
|
+
borderRadius6: 6,
|
|
238
|
+
borderRadius8: 8,
|
|
239
|
+
borderRadius12: 12,
|
|
240
|
+
borderRadius16: 16,
|
|
241
|
+
borderRadiusDefault: 8,
|
|
242
|
+
borderRadiusRound: 1028,
|
|
243
|
+
borderWidthDefault: 1,
|
|
244
|
+
space1: 1,
|
|
245
|
+
space2: 2,
|
|
246
|
+
space4: 4,
|
|
247
|
+
space6: 6,
|
|
248
|
+
space8: 8,
|
|
249
|
+
space12: 12,
|
|
250
|
+
space16: 16,
|
|
251
|
+
space20: 20,
|
|
252
|
+
space24: 24,
|
|
253
|
+
space28: 28,
|
|
254
|
+
space32: 32,
|
|
255
|
+
space40: 40,
|
|
256
|
+
space48: 48,
|
|
257
|
+
space56: 56,
|
|
258
|
+
space64: 64,
|
|
259
|
+
space80: 80,
|
|
260
|
+
space96: 96,
|
|
261
|
+
space128: 128,
|
|
262
|
+
space256: 256,
|
|
263
|
+
spaceDefault: 8,
|
|
264
|
+
} as const;
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Get the actual value from a CSS variable \
|
|
268
|
+
* You really can't get color values reliably without extracting them from the DOM because of theming
|
|
269
|
+
* @param token (CSS variable)
|
|
270
|
+
* @returns Raw value, or null if one is not found
|
|
271
|
+
*
|
|
272
|
+
* @example
|
|
273
|
+
* getTokenValue(tokens.space80)
|
|
274
|
+
* getTokenValue("var(--space-80)")
|
|
275
|
+
*/
|
|
276
|
+
export function getTokenValue(token: keyof typeof invertedTokens) {
|
|
277
|
+
// TODO create JS values alongside css themes
|
|
278
|
+
// something like getTokenValue(token.primaryDefault, "light")
|
|
279
|
+
// or try dom extraction?
|
|
280
|
+
const tokenKey = invertedTokens[token];
|
|
281
|
+
return rawTokenValues[tokenKey];
|
|
282
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
.transition_opacity {
|
|
2
|
+
transition: opacity var(--transition-duration-snappy)
|
|
3
|
+
var(--transition-timing-function-snappy);
|
|
4
|
+
|
|
5
|
+
&[data-starting-style],
|
|
6
|
+
&[data-ending-style] {
|
|
7
|
+
opacity: 0;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.transition_fade-out {
|
|
12
|
+
&[data-ending-style] {
|
|
13
|
+
opacity: 0;
|
|
14
|
+
transition: opacity var(--transition-duration-snappy)
|
|
15
|
+
var(--transition-timing-function-snappy);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.transition_scale {
|
|
20
|
+
transition:
|
|
21
|
+
opacity var(--transition-duration-snappy)
|
|
22
|
+
var(--transition-timing-function-snappy),
|
|
23
|
+
transform var(--transition-duration-snappy)
|
|
24
|
+
var(--transition-timing-function-snappy);
|
|
25
|
+
|
|
26
|
+
&[data-starting-style],
|
|
27
|
+
&[data-ending-style] {
|
|
28
|
+
transform: scale(0.96);
|
|
29
|
+
opacity: 0;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** @type {import("stylelint").Config} */
|
|
2
|
+
export default {
|
|
3
|
+
extends: ["stylelint-config-standard"],
|
|
4
|
+
plugins: ["stylelint-selector-bem-pattern"],
|
|
5
|
+
/**
|
|
6
|
+
* I kind of want to ignore globals since we break a shit ton of rules
|
|
7
|
+
* https://stylelint.io/user-guide/configure#ignorefiles
|
|
8
|
+
*/
|
|
9
|
+
ignoreFiles: ["src/styles/**/*.css", "src/integrations/tailwind.css"],
|
|
10
|
+
rules: {
|
|
11
|
+
/**
|
|
12
|
+
* We want to use BEM instead
|
|
13
|
+
* Defined here:
|
|
14
|
+
* https://github.com/postcss/postcss-bem-linter?tab=readme-ov-file
|
|
15
|
+
* https://en.bem.info/methodology/naming-convention/
|
|
16
|
+
*/
|
|
17
|
+
"selector-class-pattern": null,
|
|
18
|
+
"plugin/selector-bem-pattern": {
|
|
19
|
+
preset: "bem",
|
|
20
|
+
implicitComponents: true,
|
|
21
|
+
},
|
|
22
|
+
"max-nesting-depth": [
|
|
23
|
+
1,
|
|
24
|
+
{
|
|
25
|
+
ignore: ["pseudo-classes", "blockless-at-rules"],
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
|
4
|
+
"target": "ES2022",
|
|
5
|
+
"useDefineForClassFields": true,
|
|
6
|
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
7
|
+
"module": "ESNext",
|
|
8
|
+
"types": ["vite/client"],
|
|
9
|
+
"skipLibCheck": true,
|
|
10
|
+
|
|
11
|
+
/* Bundler mode */
|
|
12
|
+
"moduleResolution": "bundler",
|
|
13
|
+
"allowImportingTsExtensions": true,
|
|
14
|
+
"verbatimModuleSyntax": true,
|
|
15
|
+
"moduleDetection": "force",
|
|
16
|
+
"noEmit": true,
|
|
17
|
+
"jsx": "react-jsx",
|
|
18
|
+
|
|
19
|
+
/* Linting */
|
|
20
|
+
"strict": true,
|
|
21
|
+
"noUnusedLocals": true,
|
|
22
|
+
"noUnusedParameters": true,
|
|
23
|
+
"erasableSyntaxOnly": true,
|
|
24
|
+
"noFallthroughCasesInSwitch": true,
|
|
25
|
+
"noUncheckedSideEffectImports": true,
|
|
26
|
+
|
|
27
|
+
"plugins": [{ "name": "typescript-plugin-css-modules" }],
|
|
28
|
+
|
|
29
|
+
"baseUrl": ".",
|
|
30
|
+
"paths": {
|
|
31
|
+
"~/*": ["./src/*"]
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"include": ["src"]
|
|
35
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
|
4
|
+
"target": "ES2023",
|
|
5
|
+
"lib": ["ES2023"],
|
|
6
|
+
"module": "ESNext",
|
|
7
|
+
"types": ["node"],
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
|
|
10
|
+
/* Bundler mode */
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"allowImportingTsExtensions": true,
|
|
13
|
+
"verbatimModuleSyntax": true,
|
|
14
|
+
"moduleDetection": "force",
|
|
15
|
+
"noEmit": true,
|
|
16
|
+
|
|
17
|
+
/* Linting */
|
|
18
|
+
"strict": true,
|
|
19
|
+
"noUnusedLocals": true,
|
|
20
|
+
"noUnusedParameters": true,
|
|
21
|
+
"erasableSyntaxOnly": true,
|
|
22
|
+
"noFallthroughCasesInSwitch": true,
|
|
23
|
+
"noUncheckedSideEffectImports": true
|
|
24
|
+
},
|
|
25
|
+
"include": ["vite.config.ts"]
|
|
26
|
+
}
|
package/vite.config.ts
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/// <reference types="vitest/config" />
|
|
2
|
+
// https://vite.dev/config/
|
|
3
|
+
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import path from "path";
|
|
6
|
+
import { storybookTest } from "@storybook/addon-vitest/vitest-plugin";
|
|
7
|
+
import react from "@vitejs/plugin-react";
|
|
8
|
+
import { playwright } from "@vitest/browser-playwright";
|
|
9
|
+
import { glob } from "glob";
|
|
10
|
+
import { defineConfig } from "vite";
|
|
11
|
+
import dts from "vite-plugin-dts";
|
|
12
|
+
import { libInjectCss } from "vite-plugin-lib-inject-css";
|
|
13
|
+
import tsconfigPaths from "vite-tsconfig-paths";
|
|
14
|
+
|
|
15
|
+
const dirname =
|
|
16
|
+
typeof __dirname !== "undefined"
|
|
17
|
+
? __dirname
|
|
18
|
+
: path.dirname(fileURLToPath(import.meta.url));
|
|
19
|
+
|
|
20
|
+
const IGNORE_STORIES = ["src/**/*.stories.tsx", "src/stories/**/*"];
|
|
21
|
+
|
|
22
|
+
// More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon
|
|
23
|
+
export default defineConfig({
|
|
24
|
+
plugins: [
|
|
25
|
+
tsconfigPaths(),
|
|
26
|
+
libInjectCss(),
|
|
27
|
+
react(),
|
|
28
|
+
dts({
|
|
29
|
+
include: ["src"],
|
|
30
|
+
exclude: IGNORE_STORIES,
|
|
31
|
+
tsconfigPath: "./tsconfig.app.json",
|
|
32
|
+
}),
|
|
33
|
+
],
|
|
34
|
+
build: {
|
|
35
|
+
minify: "esbuild",
|
|
36
|
+
lib: {
|
|
37
|
+
entry: {
|
|
38
|
+
index: path.resolve(__dirname, "src/index.ts"),
|
|
39
|
+
},
|
|
40
|
+
formats: ["es"],
|
|
41
|
+
},
|
|
42
|
+
rollupOptions: {
|
|
43
|
+
external: ["react", "react/jsx-runtime", "react-dom"],
|
|
44
|
+
input: Object.fromEntries(
|
|
45
|
+
glob
|
|
46
|
+
.sync(
|
|
47
|
+
[
|
|
48
|
+
"src/**/!(*.d).{ts,tsx}",
|
|
49
|
+
"src/styles/core.css",
|
|
50
|
+
"src/styles/reset.css",
|
|
51
|
+
"src/integrations/tailwind.css",
|
|
52
|
+
],
|
|
53
|
+
{
|
|
54
|
+
ignore: IGNORE_STORIES,
|
|
55
|
+
},
|
|
56
|
+
)
|
|
57
|
+
.map((file) => [
|
|
58
|
+
path.relative(
|
|
59
|
+
"src",
|
|
60
|
+
file.substring(0, file.length - path.extname(file).length),
|
|
61
|
+
),
|
|
62
|
+
path.resolve(__dirname, file),
|
|
63
|
+
]),
|
|
64
|
+
),
|
|
65
|
+
output: {
|
|
66
|
+
globals: {
|
|
67
|
+
react: "React",
|
|
68
|
+
"react/jsx-runtime": "react/jsx-runtime",
|
|
69
|
+
"react-dom": "ReactDOM",
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
copyPublicDir: false,
|
|
74
|
+
},
|
|
75
|
+
test: {
|
|
76
|
+
projects: [
|
|
77
|
+
{
|
|
78
|
+
extends: true,
|
|
79
|
+
plugins: [
|
|
80
|
+
// The plugin will run tests for the stories defined in your Storybook config
|
|
81
|
+
// See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest
|
|
82
|
+
storybookTest({
|
|
83
|
+
configDir: path.join(dirname, ".storybook"),
|
|
84
|
+
}),
|
|
85
|
+
],
|
|
86
|
+
test: {
|
|
87
|
+
name: "storybook",
|
|
88
|
+
browser: {
|
|
89
|
+
enabled: true,
|
|
90
|
+
headless: true,
|
|
91
|
+
provider: playwright({}),
|
|
92
|
+
instances: [
|
|
93
|
+
{
|
|
94
|
+
browser: "chromium",
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
setupFiles: [".storybook/vitest.setup.ts"],
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
},
|
|
103
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/// <reference types="@vitest/browser-playwright" />
|