@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,31 @@
1
+ import type { Meta, StoryObj } from "@storybook/react-vite";
2
+
3
+ import { View } from "~/components/view";
4
+
5
+ import { Markdown } from "./index.tsx";
6
+
7
+ const meta = {
8
+ title: "Integrations/Markdown",
9
+ component: Markdown,
10
+ parameters: { layout: "centered" },
11
+ } satisfies Meta<typeof Markdown>;
12
+
13
+ export default meta;
14
+
15
+ type Story = StoryObj<typeof meta>;
16
+
17
+ export const Default: Story = {
18
+ args: {
19
+ children: `# Introduction
20
+
21
+ My initial portfolio (v1) was built completely with React and Tailwind. v1.5 is somewhat of a misnomer, considering it is less of a simple upgrade and more an entire rewrite with Remix for routing and serving markdown files.
22
+
23
+ ![Portfolio home page](https://npham.dev/images/portfolio-home.png)
24
+ `,
25
+ },
26
+ render: (args) => (
27
+ <View style={{ maxWidth: "30rem", width: "100%" }}>
28
+ <Markdown {...args} />
29
+ </View>
30
+ ),
31
+ };
@@ -0,0 +1,12 @@
1
+ export const fonts = [
2
+ { rel: "preconnect", href: "https://fonts.googleapis.com" },
3
+ {
4
+ rel: "preconnect",
5
+ href: "https://fonts.gstatic.com",
6
+ crossOrigin: "anonymous",
7
+ },
8
+ {
9
+ rel: "stylesheet",
10
+ href: "https://fonts.googleapis.com/css2?family=IBM+Plex+Mono&family=IBM+Plex+Sans:wght@400;500;600&display=swap",
11
+ },
12
+ ];
@@ -0,0 +1,173 @@
1
+ @theme {
2
+ --font-sans: var(--font-family-default);
3
+ --font-mono: var(--font-family-code);
4
+
5
+ --text-small: var(--font-size-small);
6
+ --text-default: var(--font-size-default);
7
+ --text-subhead-default: var(--font-size-subhead-default);
8
+ --text-subhead-big: var(--font-size-subhead-big);
9
+ --text-header-default: var(--font-size-header-default);
10
+ --text-header-big: var(--font-size-header-big);
11
+
12
+ --leading-none: 1;
13
+ --leading-small: var(--line-height-small);
14
+ --leading-default: var(--line-height-default);
15
+ --leading-subhead-default: var(--line-height-subhead-default);
16
+ --leading-subhead-big: var(--line-height-subhead-big);
17
+ --leading-header-default: var(--line-height-header-default);
18
+ --leading-header-big: var(--line-height-header-big);
19
+
20
+ --shadow-1: var(--shadow-1);
21
+ --shadow-2: var(--shadow-2);
22
+ --shadow-3: var(--shadow-3);
23
+ --shadow-focus: inset 0 0 0 2px var(--primary-default);
24
+ --shadow-default: var(--shadow-default);
25
+ --shadow-none: "";
26
+
27
+ --color-transparent: transparent;
28
+ --color-white: #fcfcfc;
29
+ --color-black: #0e1525;
30
+
31
+ --color-background-root: var(--background-root);
32
+ --color-background-default: var(--background-default);
33
+ --color-background-higher: var(--background-higher);
34
+ --color-background-highest: var(--background-highest);
35
+ --color-background-overlay: var(--background-overlay);
36
+ --color-foreground-default: var(--foreground-default);
37
+ --color-foreground-dimmer: var(--foreground-dimmer);
38
+ --color-foreground-dimmest: var(--foreground-dimmest);
39
+ --color-outline-dimmest: var(--outline-dimmest);
40
+ --color-outline-dimmer: var(--outline-dimmer);
41
+ --color-outline-default: var(--outline-default);
42
+ --color-outline-stronger: var(--outline-stronger);
43
+ --color-outline-strongest: var(--outline-strongest);
44
+ --color-red-dimmest: var(--red-dimmest);
45
+ --color-red-dimmer: var(--red-dimmer);
46
+ --color-red-default: var(--red-default);
47
+ --color-red-stronger: var(--red-stronger);
48
+ --color-red-strongest: var(--red-strongest);
49
+ --color-orange-dimmest: var(--orange-dimmest);
50
+ --color-orange-dimmer: var(--orange-dimmer);
51
+ --color-orange-default: var(--orange-default);
52
+ --color-orange-stronger: var(--orange-stronger);
53
+ --color-orange-strongest: var(--orange-strongest);
54
+ --color-yellow-dimmest: var(--yellow-dimmest);
55
+ --color-yellow-dimmer: var(--yellow-dimmer);
56
+ --color-yellow-default: var(--yellow-default);
57
+ --color-yellow-stronger: var(--yellow-stronger);
58
+ --color-yellow-strongest: var(--yellow-strongest);
59
+ --color-lime-dimmest: var(--lime-dimmest);
60
+ --color-lime-dimmer: var(--lime-dimmer);
61
+ --color-lime-default: var(--lime-default);
62
+ --color-lime-stronger: var(--lime-stronger);
63
+ --color-lime-strongest: var(--lime-strongest);
64
+ --color-green-dimmest: var(--green-dimmest);
65
+ --color-green-dimmer: var(--green-dimmer);
66
+ --color-green-default: var(--green-default);
67
+ --color-green-stronger: var(--green-stronger);
68
+ --color-green-strongest: var(--green-strongest);
69
+ --color-teal-dimmest: var(--teal-dimmest);
70
+ --color-teal-dimmer: var(--teal-dimmer);
71
+ --color-teal-default: var(--teal-default);
72
+ --color-teal-stronger: var(--teal-stronger);
73
+ --color-teal-strongest: var(--teal-strongest);
74
+ --color-blue-dimmest: var(--blue-dimmest);
75
+ --color-blue-dimmer: var(--blue-dimmer);
76
+ --color-blue-default: var(--blue-default);
77
+ --color-blue-stronger: var(--blue-stronger);
78
+ --color-blue-strongest: var(--blue-strongest);
79
+ --color-blurple-dimmest: var(--blurple-dimmest);
80
+ --color-blurple-dimmer: var(--blurple-dimmer);
81
+ --color-blurple-default: var(--blurple-default);
82
+ --color-blurple-stronger: var(--blurple-stronger);
83
+ --color-blurple-strongest: var(--blurple-strongest);
84
+ --color-purple-dimmest: var(--purple-dimmest);
85
+ --color-purple-dimmer: var(--purple-dimmer);
86
+ --color-purple-default: var(--purple-default);
87
+ --color-purple-stronger: var(--purple-stronger);
88
+ --color-purple-strongest: var(--purple-strongest);
89
+ --color-magenta-dimmest: var(--magenta-dimmest);
90
+ --color-magenta-dimmer: var(--magenta-dimmer);
91
+ --color-magenta-default: var(--magenta-default);
92
+ --color-magenta-stronger: var(--magenta-stronger);
93
+ --color-magenta-strongest: var(--magenta-strongest);
94
+ --color-pink-dimmest: var(--pink-dimmest);
95
+ --color-pink-dimmer: var(--pink-dimmer);
96
+ --color-pink-default: var(--pink-default);
97
+ --color-pink-stronger: var(--pink-stronger);
98
+ --color-pink-strongest: var(--pink-strongest);
99
+ --color-grey-dimmest: var(--grey-dimmest);
100
+ --color-grey-dimmer: var(--grey-dimmer);
101
+ --color-grey-default: var(--grey-default);
102
+ --color-grey-stronger: var(--grey-stronger);
103
+ --color-grey-strongest: var(--grey-strongest);
104
+ --color-brown-dimmest: var(--brown-dimmest);
105
+ --color-brown-dimmer: var(--brown-dimmer);
106
+ --color-brown-default: var(--brown-default);
107
+ --color-brown-stronger: var(--brown-stronger);
108
+ --color-brown-strongest: var(--brown-strongest);
109
+
110
+ /* Primary Aliases */
111
+ --color-primary-dimmest: var(--primary-dimmest);
112
+ --color-primary-dimmer: var(--primary-dimmer);
113
+ --color-primary-default: var(--primary-default);
114
+ --color-primary-stronger: var(--primary-stronger);
115
+ --color-primary-strongest: var(--primary-strongest);
116
+
117
+ /* Positive Aliases */
118
+ --color-positive-dimmest: var(--positive-dimmest);
119
+ --color-positive-dimmer: var(--positive-dimmer);
120
+ --color-positive-default: var(--positive-default);
121
+ --color-positive-stronger: var(--positive-stronger);
122
+ --color-positive-strongest: var(--positive-strongest);
123
+
124
+ /* Negative Aliases */
125
+ --color-negative-dimmest: var(--negative-dimmest);
126
+ --color-negative-dimmer: var(--negative-dimmer);
127
+ --color-negative-default: var(--negative-default);
128
+ --color-negative-stronger: var(--negative-stronger);
129
+ --color-negative-strongest: var(--negative-strongest);
130
+
131
+ /* Warning Aliases */
132
+ --color-warning-dimmest: var(--warning-dimmest);
133
+ --color-warning-dimmer: var(--warning-dimmer);
134
+ --color-warning-default: var(--warning-default);
135
+ --color-warning-stronger: var(--warning-stronger);
136
+ --color-warning-strongest: var(--warning-strongest);
137
+
138
+ /* View Colorway Aliases */
139
+ --color-view-colorway-dimmest: var(--view-colorway-dimmest);
140
+ --color-view-colorway-dimmer: var(--view-colorway-dimmer);
141
+ --color-view-colorway-default: var(--view-colorway-default);
142
+ --color-view-colorway-stronger: var(--view-colorway-stronger);
143
+ --color-view-colorway-strongest: var(--view-colorway-strongest);
144
+
145
+ /* Surface Aliases */
146
+ --color-surface-background: var(--surface-background);
147
+ --color-surface-interactive-background: var(--surface-interactive-background);
148
+ --color-surface-interactive-background-active: var(
149
+ --surface-interactive-background-active
150
+ );
151
+ --color-surface-interactive-border: var(--surface-interactive-border);
152
+ --color-surface-interactive-border-hover: var(
153
+ --surface-interactive-border-hover
154
+ );
155
+
156
+ --default-transition-duration: var(--transition-duration-snappy);
157
+ --default-transition-timing-function: var(
158
+ --transition-timing-function-snappy
159
+ );
160
+
161
+ --ease-snappy: var(--transition-timing-function-snappy);
162
+ --ease-chill: var(--transition-timing-function-chill);
163
+
164
+ --radius-none: 0px;
165
+ --radius-sm: var(--border-radius-2);
166
+ --radius-md: var(--border-radius-4);
167
+ --radius-lg: var(--border-radius-6);
168
+ --radius-xl: var(--border-radius-8);
169
+ --radius-2xl: var(--border-radius-12);
170
+ --radius-3xl: var(--border-radius-16);
171
+ --radius-full: var(--border-radius-round);
172
+ --radius-default: var(--border-radius-default);
173
+ }
@@ -0,0 +1,13 @@
1
+ import styles from "./twemoji.module.css";
2
+
3
+ export function Twemoji(props: { value: string }) {
4
+ const img = props.value.codePointAt(0)?.toString(16);
5
+
6
+ return (
7
+ <img
8
+ src={`https://cdn.jsdelivr.net/gh/twitter/twemoji@v14.0.2/assets/svg/${img}.svg`}
9
+ className={styles["twemoji"]}
10
+ alt={props.value}
11
+ />
12
+ );
13
+ }
@@ -0,0 +1,7 @@
1
+ .twemoji {
2
+ display: inline-block;
3
+ vertical-align: -0.1em;
4
+ margin: 0 0.05em 0 0.1em;
5
+ width: 1em;
6
+ height: 1em;
7
+ }
@@ -0,0 +1,40 @@
1
+ import type { Meta, StoryObj } from "@storybook/react-vite";
2
+
3
+ import { Anchor } from "~/components/anchor";
4
+ import { tokens } from "~/styles/tokens";
5
+
6
+ import { Twemoji } from ".";
7
+ import { Surface } from "../../components/surface";
8
+ import { Text } from "../../components/text";
9
+
10
+ const meta = {
11
+ title: "Integrations/Twemoji",
12
+ component: Twemoji,
13
+ parameters: { layout: "centered" },
14
+ } satisfies Meta<typeof Twemoji>;
15
+
16
+ export default meta;
17
+
18
+ type Story = StoryObj<typeof meta>;
19
+
20
+ export const Default: Story = {
21
+ args: {
22
+ value: "✨",
23
+ },
24
+ render: (args) => (
25
+ <Surface
26
+ style={{ padding: tokens.space16, width: tokens.space256 }}
27
+ elevated
28
+ >
29
+ <Text className="mt-2" multiline>
30
+ Building apps that shine <Twemoji {...args} /> with React and Tailwind.
31
+ Currently using Typescript, but attempting to learn Go. In my spare time
32
+ I do{" "}
33
+ <Anchor href="https://art.natmf.at/" external>
34
+ generative art
35
+ </Anchor>
36
+ , make origami dragons, or vibe to Lo-Fi.
37
+ </Text>
38
+ </Surface>
39
+ ),
40
+ };
@@ -0,0 +1,40 @@
1
+ import { cloneElement, type CSSProperties, type ReactElement } from "react";
2
+
3
+ import { Surface } from "~/components/surface";
4
+ import { Text } from "~/components/text";
5
+ import { View } from "~/components/view";
6
+ import { tokens } from "~/styles/tokens";
7
+
8
+ export function AllVariants(props: {
9
+ /** What's the variant actually called. */
10
+ variantName: string;
11
+ /** Possible values for the variant. */
12
+ variants: string[];
13
+ /** Element that we'll clone with different variants. */
14
+ element: ReactElement;
15
+ /** Override styles on wrapper. */
16
+ style?: CSSProperties;
17
+ }) {
18
+ return (
19
+ <Surface
20
+ elevated
21
+ style={{
22
+ flexDirection: "column",
23
+ gap: tokens.space16,
24
+ padding: tokens.space16,
25
+ ...props.style,
26
+ }}
27
+ >
28
+ {props.variants.map((variant) => (
29
+ <View key={variant} style={{ gap: tokens.space2 }}>
30
+ <Text color="dimmest" size="sm">
31
+ {variant}
32
+ </Text>
33
+ {cloneElement(props.element, {
34
+ [props.variantName]: variant,
35
+ })}
36
+ </View>
37
+ ))}
38
+ </Surface>
39
+ );
40
+ }
@@ -0,0 +1,72 @@
1
+ import type { Background } from "~/components/surface";
2
+ import type { TextProps } from "~/components/text";
3
+ import type {
4
+ Color,
5
+ ColorStyle,
6
+ ColorVariant,
7
+ InteractiveStyle,
8
+ } from "~/components/view";
9
+
10
+ import { type Size } from "../styles/tokens";
11
+
12
+ export const textColors: Array<NonNullable<TextProps["color"]>> = [
13
+ "inherit",
14
+ "default",
15
+ "dimmer",
16
+ "dimmest",
17
+ ];
18
+
19
+ export const surfaceBackgrounds: Background[] = [
20
+ "root",
21
+ "default",
22
+ "higher",
23
+ "highest",
24
+ ];
25
+
26
+ export const sizes: Size[] = ["sm", "md", "lg", "xl", "2xl", "3xl"];
27
+
28
+ export const interactiveStyles: InteractiveStyle[] = [
29
+ "fill",
30
+ "no-fill",
31
+ "outline",
32
+ "fill-outline",
33
+ "list-item",
34
+ ];
35
+
36
+ export const colors: Color[] = [
37
+ "primary",
38
+ "positive",
39
+ "negative",
40
+ "warning",
41
+ "red",
42
+ "orange",
43
+ "yellow",
44
+ "green",
45
+ "teal",
46
+ "blue",
47
+ "blurple",
48
+ "purple",
49
+ "magenta",
50
+ "pink",
51
+ "grey",
52
+ ];
53
+
54
+ export const colorVariants: ColorStyle[] = [
55
+ "outline",
56
+ "outline-static",
57
+ "mute-static",
58
+ "fill",
59
+ "no-fill",
60
+ "fill-static",
61
+ "fill-outline",
62
+ ];
63
+
64
+ export const colorway: ColorVariant[] = (() => {
65
+ const result: ColorVariant[] = [];
66
+ for (const color of colors) {
67
+ for (const variant of colorVariants) {
68
+ result.push(`${color}_${variant}`);
69
+ }
70
+ }
71
+ return result;
72
+ })();
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Shorthand to disable many properties in a story
3
+ * @param keys List of controls to disable
4
+ * @returns
5
+ *
6
+ * @example
7
+ * { argTypes: { message: { table: { disable: true } } } }
8
+ * disable(["message"])
9
+ */
10
+ export function disable<T extends string>(keys: T[]) {
11
+ const result = {} as Record<T, { table: { disable: true } }>;
12
+ for (const key of keys) {
13
+ result[key] = {
14
+ table: {
15
+ disable: true,
16
+ },
17
+ };
18
+ }
19
+ return result;
20
+ }
@@ -0,0 +1,153 @@
1
+ @import "modern-normalize/modern-normalize.css";
2
+
3
+ @import "./themes/light.css";
4
+ @import "./themes/dark.css";
5
+
6
+ /*
7
+ 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
8
+ 2. Remove default margins and padding
9
+ 3. Reset all borders.
10
+ */
11
+ *,
12
+ ::after,
13
+ ::before,
14
+ ::backdrop,
15
+ ::file-selector-button {
16
+ box-sizing: border-box; /* 1 */
17
+ margin: 0; /* 2 */
18
+ border: 0 solid; /* 3 */
19
+ padding: 0; /* 2 */
20
+ }
21
+
22
+ /*
23
+ TODO maybe revisit to add custom animations (just fade)
24
+ @media (prefers-reduced-motion: reduce)
25
+ */
26
+
27
+ :root {
28
+ --black: #0e1525;
29
+ --white: #fcfcfc;
30
+
31
+ --shadow-default: var(--shadow-1);
32
+
33
+ --border-radius-1: 1px;
34
+ --border-radius-2: 2px;
35
+ --border-radius-4: 4px;
36
+ --border-radius-6: 6px;
37
+ --border-radius-8: 8px;
38
+ --border-radius-12: 12px;
39
+ --border-radius-16: 16px;
40
+ --border-radius-default: var(--border-radius-8);
41
+ --border-radius-round: 1028px;
42
+
43
+ --space-1: 1px;
44
+ --space-2: 2px;
45
+ --space-4: 4px;
46
+ --space-6: 6px;
47
+ --space-8: 8px;
48
+ --space-12: 12px;
49
+ --space-16: 16px;
50
+ --space-20: 20px;
51
+ --space-24: 24px;
52
+ --space-28: 28px;
53
+ --space-32: 32px;
54
+ --space-40: 40px;
55
+ --space-48: 48px;
56
+ --space-56: 56px;
57
+ --space-64: 64px;
58
+ --space-80: 80px;
59
+ --space-96: 96px;
60
+ --space-128: 128px;
61
+ --space-256: 256px;
62
+ --space-default: var(--space-8);
63
+
64
+ --font-family-default: "IBM Plex Sans", sans-serif;
65
+ --font-family-code: "IBM Plex Mono", monospace;
66
+
67
+ --font-size-small: 12px;
68
+ --font-size-default: 14px;
69
+ --font-size-subhead-default: 16px;
70
+ --font-size-subhead-big: 20px;
71
+ --font-size-header-default: 24px;
72
+ --font-size-header-big: 32px;
73
+
74
+ --line-height-small: 1.5;
75
+ --line-height-default: 1.6;
76
+ --line-height-subhead-default: 1.375;
77
+ --line-height-subhead-big: 1.4;
78
+ --line-height-header-default: 1.333;
79
+ --line-height-header-big: 1.25;
80
+ --line-height-input: 22px;
81
+ --line-height-single: 1;
82
+
83
+ --font-weight-regular: 400;
84
+ --font-weight-medium: 500;
85
+ --font-weight-bold: 600;
86
+
87
+ --transition-duration-snappy: 120ms;
88
+ --transition-timing-function-snappy: ease-out;
89
+
90
+ --transition-duration-chill: 300ms;
91
+ --transition-timing-function-chill: ease-in-out;
92
+
93
+ --border-width-default: 1px;
94
+ }
95
+
96
+ body {
97
+ /* https://base-ui.com/react/overview/quick-start */
98
+ position: relative;
99
+ overflow-x: hidden;
100
+ font-size: var(--font-size-default);
101
+ line-height: var(--line-height-default);
102
+ font-family: var(--font-family-default);
103
+ }
104
+
105
+ .root {
106
+ isolation: isolate;
107
+ }
108
+
109
+ [data-theme] {
110
+ --shadow-focus: inset 0 0 0 1.5px var(--primary-default);
111
+
112
+ /* Colorway aliases */
113
+ --primary-dimmest: var(--blue-dimmest);
114
+ --primary-dimmer: var(--blue-dimmer);
115
+ --primary-default: var(--blue-default);
116
+ --primary-stronger: var(--blue-stronger);
117
+ --primary-strongest: var(--blue-strongest);
118
+
119
+ --positive-dimmest: var(--green-dimmest);
120
+ --positive-dimmer: var(--green-dimmer);
121
+ --positive-default: var(--green-default);
122
+ --positive-stronger: var(--green-stronger);
123
+ --positive-strongest: var(--green-strongest);
124
+
125
+ --negative-dimmest: var(--red-dimmest);
126
+ --negative-dimmer: var(--red-dimmer);
127
+ --negative-default: var(--red-default);
128
+ --negative-stronger: var(--red-stronger);
129
+ --negative-strongest: var(--red-strongest);
130
+
131
+ --warning-dimmest: var(--yellow-dimmest);
132
+ --warning-dimmer: var(--yellow-dimmer);
133
+ --warning-default: var(--yellow-default);
134
+ --warning-stronger: var(--yellow-stronger);
135
+ --warning-strongest: var(--yellow-strongest);
136
+
137
+ /* Default colorway styles */
138
+ --view-colorway-dimmest: var(--primary-dimmest);
139
+ --view-colorway-dimmer: var(--primary-dimmer);
140
+ --view-colorway-default: var(--primary-default);
141
+ --view-colorway-stronger: var(--primary-stronger);
142
+ --view-colorway-strongest: var(--primary-strongest);
143
+
144
+ /* Default interactive styles */
145
+ --surface-background: var(--background-root);
146
+ --surface-interactive-background: var(--background-default);
147
+ --surface-interactive-background-active: var(--background-higher);
148
+ --surface-interactive-border: var(--outline-dimmest);
149
+ --surface-interactive-border-hover: var(--outline-default);
150
+
151
+ background-color: var(--background-root);
152
+ color: var(--foreground-default);
153
+ }
@@ -0,0 +1,86 @@
1
+ [data-theme="dark"] {
2
+ @nested-import "prismjs/themes/prism-tomorrow.css";
3
+
4
+ --shadow-1: 0px 4px 8px 0px rgba(2, 2, 3, 0.16);
5
+ --shadow-2: 0px 8px 16px 0px rgba(2, 2, 3, 0.32);
6
+ --shadow-3: 0px 16px 32px 0px rgba(2, 2, 3, 0.48);
7
+
8
+ --background-root: #0e1525;
9
+ --background-default: #1c2333;
10
+ --background-higher: #2b3245;
11
+ --background-highest: #3c445c;
12
+ --background-overlay: #0e1525a0;
13
+ --foreground-default: #f5f9fc;
14
+ --foreground-dimmer: #c2c8cc;
15
+ --foreground-dimmest: #9da2a6;
16
+ --outline-dimmest: #2b3245;
17
+ --outline-dimmer: #3c445c;
18
+ --outline-default: #4e5569;
19
+ --outline-stronger: #5f677a;
20
+ --outline-strongest: #70788c;
21
+ --red-dimmest: #660000;
22
+ --red-dimmer: #a60808;
23
+ --red-default: #e52222;
24
+ --red-stronger: #ff6666;
25
+ --red-strongest: #ffcfcf;
26
+ --orange-dimmest: #542a00;
27
+ --orange-dimmer: #703800;
28
+ --orange-default: #ad5700;
29
+ --orange-stronger: #d4781c;
30
+ --orange-strongest: #ffbd7a;
31
+ --yellow-dimmest: #4d4000;
32
+ --yellow-dimmer: #635300;
33
+ --yellow-default: #967d00;
34
+ --yellow-stronger: #bfa730;
35
+ --yellow-strongest: #f2e088;
36
+ --lime-dimmest: #314a00;
37
+ --lime-dimmer: #3d5c00;
38
+ --lime-default: #5a8700;
39
+ --lime-stronger: #87b825;
40
+ --lime-strongest: #c4e581;
41
+ --green-dimmest: #044a10;
42
+ --green-dimmer: #046113;
43
+ --green-default: #009118;
44
+ --green-stronger: #6cd97e;
45
+ --green-strongest: #7aeb8d;
46
+ --teal-dimmest: #004452;
47
+ --teal-dimmer: #006073;
48
+ --teal-default: #0093b0;
49
+ --teal-stronger: #27b9d6;
50
+ --teal-strongest: #69d9f0;
51
+ --blue-dimmest: #004182;
52
+ --blue-dimmer: #0053a6;
53
+ --blue-default: #0079f2;
54
+ --blue-stronger: #57abff;
55
+ --blue-strongest: #b2d9ff;
56
+ --blurple-dimmest: #39298a;
57
+ --blurple-dimmer: #5239cc;
58
+ --blurple-default: #795eff;
59
+ --blurple-stronger: #a694ff;
60
+ --blurple-strongest: #cec4ff;
61
+ --purple-dimmest: #582987;
62
+ --purple-dimmer: #7633b8;
63
+ --purple-default: #a64dff;
64
+ --purple-stronger: #c78fff;
65
+ --purple-strongest: #e2c4ff;
66
+ --magenta-dimmest: #6b1a6b;
67
+ --magenta-dimmer: #8a218a;
68
+ --magenta-default: #c73ac7;
69
+ --magenta-stronger: #f562f5;
70
+ --magenta-strongest: #ffbfff;
71
+ --pink-dimmest: #6e1b52;
72
+ --pink-dimmer: #8f226b;
73
+ --pink-default: #d4359f;
74
+ --pink-stronger: #ff70cf;
75
+ --pink-strongest: #ffbae8;
76
+ --grey-dimmest: #404040;
77
+ --grey-dimmer: #545454;
78
+ --grey-default: #808080;
79
+ --grey-stronger: #a6a6a6;
80
+ --grey-strongest: #d4d4d4;
81
+ --brown-dimmest: #594031;
82
+ --brown-dimmer: #75503b;
83
+ --brown-default: #a3765c;
84
+ --brown-stronger: #d49877;
85
+ --brown-strongest: #ffc8a8;
86
+ }