@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.
Files changed (170) hide show
  1. package/.husky/pre-commit +1 -0
  2. package/.storybook/main.ts +25 -0
  3. package/.storybook/preview-head.html +6 -0
  4. package/.storybook/preview.tsx +48 -0
  5. package/.storybook/vitest.setup.ts +8 -0
  6. package/README.md +11 -0
  7. package/eslint.config.mjs +29 -0
  8. package/lint-staged.config.js +15 -0
  9. package/package.json +95 -0
  10. package/pnpm-workspace.yaml +2 -0
  11. package/postcss.config.mjs +7 -0
  12. package/prettier.config.mjs +24 -0
  13. package/scripts/build-icon-types.ts +38 -0
  14. package/src/-types.ts +8 -0
  15. package/src/-utils.tsx +64 -0
  16. package/src/components/accordion/accordion.module.css +44 -0
  17. package/src/components/accordion/accordion.stories.tsx +36 -0
  18. package/src/components/accordion/index.tsx +67 -0
  19. package/src/components/alert-dialog/alert-dialog.module.css +5 -0
  20. package/src/components/alert-dialog/alert-dialog.stories.tsx +53 -0
  21. package/src/components/alert-dialog/index.tsx +138 -0
  22. package/src/components/anchor/anchor.module.css +18 -0
  23. package/src/components/anchor/anchor.stories.tsx +28 -0
  24. package/src/components/anchor/index.tsx +45 -0
  25. package/src/components/avatar/avatar.module.css +56 -0
  26. package/src/components/avatar/avatar.stories.tsx +61 -0
  27. package/src/components/avatar/index.tsx +82 -0
  28. package/src/components/badge/badge.module.css +35 -0
  29. package/src/components/badge/badge.stories.tsx +60 -0
  30. package/src/components/badge/index.tsx +71 -0
  31. package/src/components/button/button.module.css +42 -0
  32. package/src/components/button/button.stories.tsx +108 -0
  33. package/src/components/button/index.tsx +63 -0
  34. package/src/components/checkbox/checkbox.module.css +36 -0
  35. package/src/components/checkbox/checkbox.stories.tsx +21 -0
  36. package/src/components/checkbox/index.tsx +41 -0
  37. package/src/components/code/code.module.css +20 -0
  38. package/src/components/code/code.stories.tsx +42 -0
  39. package/src/components/code/index.tsx +73 -0
  40. package/src/components/collapse/collapse.module.css +27 -0
  41. package/src/components/collapse/collapse.stories.tsx +27 -0
  42. package/src/components/collapse/index.tsx +59 -0
  43. package/src/components/command/command.module.css +95 -0
  44. package/src/components/command/command.stories.tsx +38 -0
  45. package/src/components/command/index.tsx +108 -0
  46. package/src/components/context-menu/context-menu.module.css +36 -0
  47. package/src/components/context-menu/context-menu.stories.tsx +99 -0
  48. package/src/components/context-menu/index.tsx +242 -0
  49. package/src/components/dialog/dialog.module.css +71 -0
  50. package/src/components/dialog/dialog.stories.tsx +29 -0
  51. package/src/components/dialog/index.tsx +148 -0
  52. package/src/components/heading/heading.module.css +3 -0
  53. package/src/components/heading/heading.stories.tsx +52 -0
  54. package/src/components/heading/index.tsx +112 -0
  55. package/src/components/icon/icon-names.ts +3189 -0
  56. package/src/components/icon/icon.module.css +36 -0
  57. package/src/components/icon/icon.stories.tsx +40 -0
  58. package/src/components/icon/index.tsx +60 -0
  59. package/src/components/icon-button/icon-button.module.css +33 -0
  60. package/src/components/icon-button/icon-button.stories.tsx +59 -0
  61. package/src/components/icon-button/index.tsx +48 -0
  62. package/src/components/inline-code/index.tsx +29 -0
  63. package/src/components/inline-code/inline-code.module.css +13 -0
  64. package/src/components/inline-code/inline-code.stories.tsx +31 -0
  65. package/src/components/input/index.tsx +22 -0
  66. package/src/components/input/input.module.css +23 -0
  67. package/src/components/input/input.stories.tsx +52 -0
  68. package/src/components/meter/index.tsx +55 -0
  69. package/src/components/meter/meter.module.css +23 -0
  70. package/src/components/meter/meter.stories.tsx +31 -0
  71. package/src/components/multiline-input/index.tsx +58 -0
  72. package/src/components/multiline-input/multiline-input.stories.tsx +26 -0
  73. package/src/components/number-input/index.tsx +74 -0
  74. package/src/components/number-input/number-input.module.css +41 -0
  75. package/src/components/number-input/number-input.stories.tsx +24 -0
  76. package/src/components/password-input/index.tsx +24 -0
  77. package/src/components/password-input/password-input.module.css +10 -0
  78. package/src/components/password-input/password-input.stories.tsx +24 -0
  79. package/src/components/pill/index.tsx +45 -0
  80. package/src/components/pill/pill.module.css +22 -0
  81. package/src/components/pill/pill.stories.tsx +83 -0
  82. package/src/components/popover/index.tsx +94 -0
  83. package/src/components/popover/popover.module.css +8 -0
  84. package/src/components/popover/popover.stories.tsx +53 -0
  85. package/src/components/preview-card/index.tsx +68 -0
  86. package/src/components/preview-card/preview-card.module.css +5 -0
  87. package/src/components/preview-card/preview-card.stories.tsx +58 -0
  88. package/src/components/radio/index.tsx +67 -0
  89. package/src/components/radio/radio-group.module.css +5 -0
  90. package/src/components/radio/radio.module.css +36 -0
  91. package/src/components/radio/radio.stories.tsx +27 -0
  92. package/src/components/search-bar/index.tsx +60 -0
  93. package/src/components/search-bar/search-bar.module.css +29 -0
  94. package/src/components/search-bar/search-bar.stories.tsx +37 -0
  95. package/src/components/select/index.tsx +132 -0
  96. package/src/components/select/select.module.css +63 -0
  97. package/src/components/select/select.stories.tsx +49 -0
  98. package/src/components/separator/index.tsx +28 -0
  99. package/src/components/separator/separator.module.css +24 -0
  100. package/src/components/separator/separator.stories.tsx +40 -0
  101. package/src/components/slider/index.tsx +28 -0
  102. package/src/components/slider/slider.module.css +52 -0
  103. package/src/components/slider/slider.stories.tsx +53 -0
  104. package/src/components/spinner/index.tsx +14 -0
  105. package/src/components/spinner/spinner.module.css +13 -0
  106. package/src/components/spinner/spinner.stories.tsx +17 -0
  107. package/src/components/stacked-avatars/index.tsx +88 -0
  108. package/src/components/stacked-avatars/stacked-avatars.module.css +79 -0
  109. package/src/components/stacked-avatars/stacked-avatars.stories.tsx +48 -0
  110. package/src/components/status-banner/index.tsx +96 -0
  111. package/src/components/status-banner/status-banner.module.css +52 -0
  112. package/src/components/status-banner/status-banner.stories.tsx +44 -0
  113. package/src/components/surface/index.tsx +83 -0
  114. package/src/components/surface/surface.module.css +35 -0
  115. package/src/components/surface/surface.stories.tsx +84 -0
  116. package/src/components/switch/index.tsx +23 -0
  117. package/src/components/switch/switch.module.css +45 -0
  118. package/src/components/switch/switch.stories.tsx +48 -0
  119. package/src/components/tabs/index.tsx +126 -0
  120. package/src/components/tabs/tabs.module.css +134 -0
  121. package/src/components/tabs/tabs.stories.tsx +88 -0
  122. package/src/components/text/index.tsx +69 -0
  123. package/src/components/text/text.module.css +76 -0
  124. package/src/components/text/text.stories.tsx +107 -0
  125. package/src/components/theme-provider/index.ts +2 -0
  126. package/src/components/theme-provider/theme-context.tsx +18 -0
  127. package/src/components/theme-provider/theme-provider.stories.tsx +47 -0
  128. package/src/components/theme-provider/theme-provider.tsx +77 -0
  129. package/src/components/timestamp/index.tsx +131 -0
  130. package/src/components/timestamp/timestamp.module.css +8 -0
  131. package/src/components/timestamp/timestamp.stories.tsx +37 -0
  132. package/src/components/toast/index.ts +2 -0
  133. package/src/components/toast/toast.module.css +163 -0
  134. package/src/components/toast/toast.stories.tsx +53 -0
  135. package/src/components/toast/toast.tsx +104 -0
  136. package/src/components/toast/use-toast-manager.ts +63 -0
  137. package/src/components/tooltip/index.tsx +61 -0
  138. package/src/components/tooltip/tooltip-arrow.tsx +17 -0
  139. package/src/components/tooltip/tooltip.module.css +44 -0
  140. package/src/components/tooltip/tooltip.stories.tsx +76 -0
  141. package/src/components/view/index.tsx +137 -0
  142. package/src/components/view/view.module.css +11 -0
  143. package/src/components/view/view.stories.tsx +131 -0
  144. package/src/components/view/view_colorway.module.css +280 -0
  145. package/src/components/view/view_interactive.module.css +127 -0
  146. package/src/components/view/view_loading.module.css +58 -0
  147. package/src/components/visually-hidden/index.ts +1 -0
  148. package/src/index.ts +49 -0
  149. package/src/integrations/react-markdown/index.tsx +134 -0
  150. package/src/integrations/react-markdown/react-markdown.module.css +62 -0
  151. package/src/integrations/react-markdown/react-markdown.stories.tsx +31 -0
  152. package/src/integrations/remix.ts +12 -0
  153. package/src/integrations/tailwind.css +173 -0
  154. package/src/integrations/twemoij/index.tsx +13 -0
  155. package/src/integrations/twemoij/twemoji.module.css +7 -0
  156. package/src/integrations/twemoij/twemoji.stories.tsx +40 -0
  157. package/src/stories/components/all-variants.tsx +40 -0
  158. package/src/stories/data.ts +72 -0
  159. package/src/stories/utils.ts +20 -0
  160. package/src/styles/core.css +153 -0
  161. package/src/styles/themes/dark.css +86 -0
  162. package/src/styles/themes/light.css +86 -0
  163. package/src/styles/tokens.ts +282 -0
  164. package/src/styles/transitions.module.css +31 -0
  165. package/stylelint.config.mjs +29 -0
  166. package/tsconfig.app.json +35 -0
  167. package/tsconfig.json +7 -0
  168. package/tsconfig.node.json +26 -0
  169. package/vite.config.ts +103 -0
  170. 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,7 @@
1
+ {
2
+ "files": [],
3
+ "references": [
4
+ { "path": "./tsconfig.app.json" },
5
+ { "path": "./tsconfig.node.json" }
6
+ ]
7
+ }
@@ -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" />