@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,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
|
+

|
|
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,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
|
+
}
|