@bbki.ng/ui 0.1.1
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/.storybook/main.ts +21 -0
- package/.storybook/preview-head.html +10 -0
- package/.storybook/preview.tsx +30 -0
- package/CHANGELOG.md +8 -0
- package/README.md +124 -0
- package/package.json +57 -0
- package/scripts/build-tokens.ts +170 -0
- package/src/atoms/blink-dot/BlinkDot.stories.tsx +44 -0
- package/src/atoms/blink-dot/BlinkDot.tsx +45 -0
- package/src/atoms/blink-dot/index.ts +2 -0
- package/src/atoms/button/Button.stories.tsx +84 -0
- package/src/atoms/button/Button.tsx +59 -0
- package/src/atoms/button/Button.types.ts +20 -0
- package/src/atoms/button/Button.variants.ts +58 -0
- package/src/atoms/button/index.ts +3 -0
- package/src/atoms/link/Link.stories.tsx +121 -0
- package/src/atoms/link/Link.tsx +69 -0
- package/src/atoms/link/Link.types.ts +26 -0
- package/src/atoms/link/Link.variants.ts +55 -0
- package/src/atoms/link/index.ts +3 -0
- package/src/atoms/logo/Logo.stories.tsx +37 -0
- package/src/atoms/logo/Logo.tsx +49 -0
- package/src/atoms/logo/Logo.types.ts +4 -0
- package/src/atoms/logo/index.ts +2 -0
- package/src/index.ts +54 -0
- package/src/layout/container/Container.stories.tsx +73 -0
- package/src/layout/container/Container.tsx +57 -0
- package/src/layout/container/index.ts +2 -0
- package/src/layout/grid/Grid.stories.tsx +106 -0
- package/src/layout/grid/Grid.tsx +86 -0
- package/src/layout/grid/index.ts +2 -0
- package/src/layout/index.ts +4 -0
- package/src/molecules/article/Article.stories.tsx +45 -0
- package/src/molecules/article/Article.tsx +25 -0
- package/src/molecules/article/Article.types.ts +11 -0
- package/src/molecules/article/index.ts +2 -0
- package/src/molecules/breadcrumb/Breadcrumb.stories.tsx +60 -0
- package/src/molecules/breadcrumb/Breadcrumb.tsx +43 -0
- package/src/molecules/breadcrumb/Breadcrumb.types.ts +19 -0
- package/src/molecules/breadcrumb/index.ts +2 -0
- package/src/molecules/list/List.stories.tsx +84 -0
- package/src/molecules/list/List.tsx +79 -0
- package/src/molecules/list/List.types.ts +23 -0
- package/src/molecules/list/index.ts +2 -0
- package/src/molecules/nav/Nav.stories.tsx +45 -0
- package/src/molecules/nav/Nav.tsx +29 -0
- package/src/molecules/nav/Nav.types.ts +10 -0
- package/src/molecules/nav/index.ts +2 -0
- package/src/molecules/panel/Panel.stories.tsx +42 -0
- package/src/molecules/panel/Panel.tsx +27 -0
- package/src/molecules/panel/Panel.types.ts +6 -0
- package/src/molecules/panel/index.ts +2 -0
- package/src/molecules/table/Table.stories.tsx +54 -0
- package/src/molecules/table/Table.tsx +31 -0
- package/src/molecules/table/Table.types.ts +20 -0
- package/src/molecules/table/index.ts +2 -0
- package/src/organisms/canvas/Canvas.tsx +79 -0
- package/src/organisms/canvas/Canvas.types.ts +25 -0
- package/src/organisms/canvas/index.ts +3 -0
- package/src/organisms/canvas/useRenderer.ts +44 -0
- package/src/organisms/drop-image/DropImage.stories.tsx +36 -0
- package/src/organisms/drop-image/DropImage.tsx +193 -0
- package/src/organisms/drop-image/DropImage.types.ts +26 -0
- package/src/organisms/drop-image/index.ts +3 -0
- package/src/organisms/drop-image/useDropImage.ts +124 -0
- package/src/organisms/drop-image/utils.ts +1 -0
- package/src/organisms/drop-zone/DropZone.tsx +58 -0
- package/src/organisms/drop-zone/DropZone.types.ts +9 -0
- package/src/organisms/drop-zone/index.ts +2 -0
- package/src/organisms/loading-spiral/LoadingSpiral.stories.tsx +30 -0
- package/src/organisms/loading-spiral/LoadingSpiral.tsx +44 -0
- package/src/organisms/loading-spiral/LoadingSpiral.types.ts +4 -0
- package/src/organisms/loading-spiral/constants.ts +62 -0
- package/src/organisms/loading-spiral/createOptions.ts +31 -0
- package/src/organisms/loading-spiral/createSettings.ts +26 -0
- package/src/organisms/loading-spiral/index.ts +2 -0
- package/src/organisms/loading-spiral/useCanvasRef.ts +23 -0
- package/src/organisms/loading-spiral/utils.ts +5 -0
- package/src/organisms/page/Page.stories.tsx +65 -0
- package/src/organisms/page/Page.tsx +71 -0
- package/src/organisms/page/Page.types.ts +23 -0
- package/src/organisms/page/index.ts +8 -0
- package/src/styles.css +151 -0
- package/src/theme/ThemeContext.tsx +20 -0
- package/src/theme/ThemeProvider.tsx +93 -0
- package/src/theme/index.ts +3 -0
- package/src/tokens/css/dark.css +111 -0
- package/src/tokens/css/light.css +111 -0
- package/src/tokens/index.ts +127 -0
- package/tokens/base/colors.json +54 -0
- package/tokens/base/shadows.json +34 -0
- package/tokens/base/spacing.json +21 -0
- package/tokens/base/typography.json +35 -0
- package/tokens/semantic/dark.json +50 -0
- package/tokens/semantic/light.json +54 -0
- package/tsconfig.json +22 -0
- package/vite.config.ts +44 -0
package/src/styles.css
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
@import 'tailwindcss';
|
|
2
|
+
|
|
3
|
+
/* Token CSS 变量 - 由 build-tokens 脚本生成 */
|
|
4
|
+
@import './tokens/css/light.css';
|
|
5
|
+
|
|
6
|
+
/* 深色主题 - 通过类名切换 */
|
|
7
|
+
.dark {
|
|
8
|
+
@import './tokens/css/dark.css';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/* 系统偏好 */
|
|
12
|
+
@media (prefers-color-scheme: dark) {
|
|
13
|
+
:root:not(.light) {
|
|
14
|
+
@import './tokens/css/dark.css';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@theme inline {
|
|
19
|
+
/* Colors - 映射到生成的 CSS 变量 */
|
|
20
|
+
--color-background: var(--color-background);
|
|
21
|
+
--color-foreground: var(--color-foreground);
|
|
22
|
+
--color-muted: var(--color-muted);
|
|
23
|
+
--color-muted-foreground: var(--color-muted-foreground);
|
|
24
|
+
--color-border: var(--color-border);
|
|
25
|
+
--color-primary: var(--color-primary);
|
|
26
|
+
--color-primary-foreground: var(--color-primary-foreground);
|
|
27
|
+
--color-secondary: var(--color-secondary);
|
|
28
|
+
--color-secondary-foreground: var(--color-secondary-foreground);
|
|
29
|
+
--color-accent: var(--color-accent);
|
|
30
|
+
--color-accent-foreground: var(--color-accent-foreground);
|
|
31
|
+
--color-destructive: var(--color-destructive);
|
|
32
|
+
--color-destructive-foreground: var(--color-destructive-foreground);
|
|
33
|
+
--color-content-primary: var(--color-content-primary);
|
|
34
|
+
--color-content-secondary: var(--color-content-secondary);
|
|
35
|
+
--color-content-disabled: var(--color-content-disabled);
|
|
36
|
+
--color-content-action: var(--color-content-action);
|
|
37
|
+
--color-content-danger: var(--color-content-danger);
|
|
38
|
+
--color-content-special: var(--color-content-special);
|
|
39
|
+
--color-special: var(--color-special);
|
|
40
|
+
--color-logo: var(--color-logo);
|
|
41
|
+
--color-status-error: var(--color-status-error);
|
|
42
|
+
--color-status-warning: var(--color-status-warning);
|
|
43
|
+
--color-status-success: var(--color-status-success);
|
|
44
|
+
--color-status-info: var(--color-status-info);
|
|
45
|
+
|
|
46
|
+
--font-sans: var(--font-sans);
|
|
47
|
+
--font-mono: var(--font-mono);
|
|
48
|
+
|
|
49
|
+
/* Spacing - required for p-*, m-* utilities */
|
|
50
|
+
--spacing: var(--spacing-4);
|
|
51
|
+
--spacing-0: var(--spacing-0);
|
|
52
|
+
--spacing-1: var(--spacing-1);
|
|
53
|
+
--spacing-2: var(--spacing-2);
|
|
54
|
+
--spacing-3: var(--spacing-3);
|
|
55
|
+
--spacing-4: var(--spacing-4);
|
|
56
|
+
--spacing-5: var(--spacing-5);
|
|
57
|
+
--spacing-6: var(--spacing-6);
|
|
58
|
+
--spacing-8: var(--spacing-8);
|
|
59
|
+
--spacing-10: var(--spacing-10);
|
|
60
|
+
--spacing-12: var(--spacing-12);
|
|
61
|
+
--spacing-16: var(--spacing-16);
|
|
62
|
+
--spacing-20: var(--spacing-20);
|
|
63
|
+
--spacing-24: var(--spacing-24);
|
|
64
|
+
--spacing-32: var(--spacing-32);
|
|
65
|
+
--spacing-40: var(--spacing-40);
|
|
66
|
+
--spacing-48: var(--spacing-48);
|
|
67
|
+
--spacing-64: var(--spacing-64);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@layer base {
|
|
71
|
+
* {
|
|
72
|
+
border-color: var(--color-border);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
body {
|
|
76
|
+
background-color: var(--color-background);
|
|
77
|
+
color: var(--color-foreground);
|
|
78
|
+
font-family: var(--font-sans);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* Custom animations */
|
|
83
|
+
@keyframes blink {
|
|
84
|
+
0%,
|
|
85
|
+
100% {
|
|
86
|
+
opacity: 1;
|
|
87
|
+
}
|
|
88
|
+
75% {
|
|
89
|
+
opacity: 0;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@utility animate-ping-fast {
|
|
94
|
+
animation: blink 0.1s infinite;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
@utility no-scrollbar {
|
|
98
|
+
&::-webkit-scrollbar {
|
|
99
|
+
display: none;
|
|
100
|
+
}
|
|
101
|
+
-ms-overflow-style: none; /* IE and Edge */
|
|
102
|
+
scrollbar-width: none; /* Firefox */
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
@utility blur-cover {
|
|
106
|
+
background-color: rgba(255, 255, 255, 0.5);
|
|
107
|
+
backdrop-filter: blur(7px);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@utility gradient-blur-cover {
|
|
111
|
+
backdrop-filter: blur(7px);
|
|
112
|
+
background-image: linear-gradient(#ffffff, #ffffff80);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
@utility lqip-blur {
|
|
116
|
+
backdrop-filter: blur(20px);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
@utility animate-ping-fast {
|
|
120
|
+
animation: blink 0.1s infinite;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
@layer utilities {
|
|
124
|
+
.prose {
|
|
125
|
+
a,
|
|
126
|
+
&:where(a):not(:where([class~='not-prose'] *)) {
|
|
127
|
+
color: rgb(37, 99, 235);
|
|
128
|
+
text-decoration: none;
|
|
129
|
+
padding: 4px;
|
|
130
|
+
border-radius: 0.25rem;
|
|
131
|
+
word-break: break-all;
|
|
132
|
+
&:hover {
|
|
133
|
+
background-color: rgb(219, 234, 254);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
&:active {
|
|
137
|
+
line-height: 1;
|
|
138
|
+
display: inline-block;
|
|
139
|
+
transform: scale(0.97);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
@utility text-blur {
|
|
146
|
+
backdrop-filter: blur(8px);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
@utility text-blur-tiny {
|
|
150
|
+
backdrop-filter: blur(2px);
|
|
151
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
|
|
3
|
+
export type Theme = 'light' | 'dark' | 'system';
|
|
4
|
+
|
|
5
|
+
export interface ThemeContextValue {
|
|
6
|
+
theme: Theme;
|
|
7
|
+
resolvedTheme: 'light' | 'dark';
|
|
8
|
+
setTheme: (theme: Theme) => void;
|
|
9
|
+
toggleTheme: () => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const ThemeContext = createContext<ThemeContextValue | undefined>(undefined);
|
|
13
|
+
|
|
14
|
+
export const useTheme = (): ThemeContextValue => {
|
|
15
|
+
const context = useContext(ThemeContext);
|
|
16
|
+
if (!context) {
|
|
17
|
+
throw new Error('useTheme must be used within ThemeProvider');
|
|
18
|
+
}
|
|
19
|
+
return context;
|
|
20
|
+
};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import React, { useEffect, useState, useCallback, useMemo } from 'react';
|
|
2
|
+
import { ThemeContext, Theme } from './ThemeContext';
|
|
3
|
+
|
|
4
|
+
interface ThemeProviderProps {
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
defaultTheme?: Theme;
|
|
7
|
+
storageKey?: string;
|
|
8
|
+
enableSystem?: boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const ThemeProvider: React.FC<ThemeProviderProps> = ({
|
|
12
|
+
children,
|
|
13
|
+
defaultTheme = 'light',
|
|
14
|
+
storageKey = 'bb-ui-theme',
|
|
15
|
+
enableSystem = true,
|
|
16
|
+
}) => {
|
|
17
|
+
const [theme, setThemeState] = useState<Theme>(() => {
|
|
18
|
+
if (typeof window !== 'undefined') {
|
|
19
|
+
const stored = localStorage.getItem(storageKey) as Theme | null;
|
|
20
|
+
if (stored) return stored;
|
|
21
|
+
}
|
|
22
|
+
return defaultTheme;
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const [resolvedTheme, setResolvedTheme] = useState<'light' | 'dark'>('light');
|
|
26
|
+
|
|
27
|
+
const getSystemTheme = useCallback((): 'light' | 'dark' => {
|
|
28
|
+
if (typeof window === 'undefined') return 'light';
|
|
29
|
+
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
|
30
|
+
}, []);
|
|
31
|
+
|
|
32
|
+
const resolveTheme = useCallback(
|
|
33
|
+
(t: Theme): 'light' | 'dark' => {
|
|
34
|
+
if (t === 'system' && enableSystem) {
|
|
35
|
+
return getSystemTheme();
|
|
36
|
+
}
|
|
37
|
+
return t === 'dark' ? 'dark' : 'light';
|
|
38
|
+
},
|
|
39
|
+
[enableSystem, getSystemTheme]
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
const root = window.document.documentElement;
|
|
44
|
+
const resolved = resolveTheme(theme);
|
|
45
|
+
|
|
46
|
+
root.classList.remove('light', 'dark');
|
|
47
|
+
root.classList.add(resolved);
|
|
48
|
+
setResolvedTheme(resolved);
|
|
49
|
+
|
|
50
|
+
localStorage.setItem(storageKey, theme);
|
|
51
|
+
}, [theme, resolveTheme, storageKey]);
|
|
52
|
+
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
if (!enableSystem) return;
|
|
55
|
+
|
|
56
|
+
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
|
57
|
+
const handleChange = () => {
|
|
58
|
+
if (theme === 'system') {
|
|
59
|
+
const resolved = getSystemTheme();
|
|
60
|
+
const root = window.document.documentElement;
|
|
61
|
+
root.classList.remove('light', 'dark');
|
|
62
|
+
root.classList.add(resolved);
|
|
63
|
+
setResolvedTheme(resolved);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
mediaQuery.addEventListener('change', handleChange);
|
|
68
|
+
return () => mediaQuery.removeEventListener('change', handleChange);
|
|
69
|
+
}, [theme, enableSystem, getSystemTheme]);
|
|
70
|
+
|
|
71
|
+
const setTheme = useCallback((newTheme: Theme) => {
|
|
72
|
+
setThemeState(newTheme);
|
|
73
|
+
}, []);
|
|
74
|
+
|
|
75
|
+
const toggleTheme = useCallback(() => {
|
|
76
|
+
setThemeState(prev => {
|
|
77
|
+
const resolved = resolveTheme(prev);
|
|
78
|
+
return resolved === 'light' ? 'dark' : 'light';
|
|
79
|
+
});
|
|
80
|
+
}, [resolveTheme]);
|
|
81
|
+
|
|
82
|
+
const value = useMemo(
|
|
83
|
+
() => ({
|
|
84
|
+
theme,
|
|
85
|
+
resolvedTheme,
|
|
86
|
+
setTheme,
|
|
87
|
+
toggleTheme,
|
|
88
|
+
}),
|
|
89
|
+
[theme, resolvedTheme, setTheme, toggleTheme]
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;
|
|
93
|
+
};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--color-gray-50: #f9fafb;
|
|
3
|
+
--color-gray-100: #f3f4f6;
|
|
4
|
+
--color-gray-150: #9ca3af;
|
|
5
|
+
--color-gray-200: #e5e7eb;
|
|
6
|
+
--color-gray-300: #d1d5db;
|
|
7
|
+
--color-gray-400: #9ca3af;
|
|
8
|
+
--color-gray-500: #6b7280;
|
|
9
|
+
--color-gray-600: #4b5563;
|
|
10
|
+
--color-gray-700: #374151;
|
|
11
|
+
--color-gray-800: #1f2937;
|
|
12
|
+
--color-gray-900: #111827;
|
|
13
|
+
--color-gray-950: #030712;
|
|
14
|
+
--color-pink-50: #fdf4f4;
|
|
15
|
+
--color-pink-100: #fbd1d2;
|
|
16
|
+
--color-pink-150: #f8babc;
|
|
17
|
+
--color-xwy-50: #fdf4f4;
|
|
18
|
+
--color-xwy-100: #fbd1d2;
|
|
19
|
+
--color-xwy-150: #f8babc;
|
|
20
|
+
--color-red-50: #fef2f2;
|
|
21
|
+
--color-red-100: #fee2e2;
|
|
22
|
+
--color-red-200: #fecaca;
|
|
23
|
+
--color-red-300: #fca5a5;
|
|
24
|
+
--color-red-400: #f87171;
|
|
25
|
+
--color-red-500: #ef4444;
|
|
26
|
+
--color-red-600: #dc2626;
|
|
27
|
+
--color-blue-50: #eff6ff;
|
|
28
|
+
--color-blue-100: #dbeafe;
|
|
29
|
+
--color-blue-500: #3b82f6;
|
|
30
|
+
--color-blue-600: #2563eb;
|
|
31
|
+
--color-white: #ffffff;
|
|
32
|
+
--color-black: #000000;
|
|
33
|
+
--color-background: #030712;
|
|
34
|
+
--color-foreground: #f9fafb;
|
|
35
|
+
--color-muted: #1f2937;
|
|
36
|
+
--color-muted-foreground: #9ca3af;
|
|
37
|
+
--color-border: #1f2937;
|
|
38
|
+
--color-primary: #3b82f6;
|
|
39
|
+
--color-primary-foreground: #ffffff;
|
|
40
|
+
--color-secondary: #1f2937;
|
|
41
|
+
--color-secondary-foreground: #f9fafb;
|
|
42
|
+
--color-accent: #f8babc;
|
|
43
|
+
--color-accent-foreground: #030712;
|
|
44
|
+
--color-destructive: #ef4444;
|
|
45
|
+
--color-logo: #9ca3af;
|
|
46
|
+
--color-destructive-foreground: #ffffff;
|
|
47
|
+
--color-special: #fdf4f4;
|
|
48
|
+
--color-special-foreground: #f8babc;
|
|
49
|
+
--color-content-primary: #f9fafb;
|
|
50
|
+
--color-content-secondary: #9ca3af;
|
|
51
|
+
--color-content-disabled: #6b7280;
|
|
52
|
+
--color-content-action: #000000;
|
|
53
|
+
--color-content-special: #f8babc;
|
|
54
|
+
--color-content-danger: #f87171;
|
|
55
|
+
--color-status-error: #ef4444;
|
|
56
|
+
--color-status-warning: #f87171;
|
|
57
|
+
--color-status-success: #4ade80;
|
|
58
|
+
--color-status-info: #3b82f6;
|
|
59
|
+
--shadow-none: none;
|
|
60
|
+
--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
|
|
61
|
+
--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
|
|
62
|
+
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
|
|
63
|
+
--shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
|
|
64
|
+
--shadow-button: 0px 15px 15px rgba(0, 0, 0, 0.1), 0px 5px 5px -2px rgba(0, 0, 0, 0.04);
|
|
65
|
+
--shadow-button-hover:
|
|
66
|
+
0px 10px 15px -3px rgba(0, 0, 0, 0.1), 0px 5px 5px -2px rgba(0, 0, 0, 0.04);
|
|
67
|
+
--shadow-input:
|
|
68
|
+
inset 0px 10px 25px -15px rgba(0, 0, 0, 0.25), inset 0px 5px 10px -5px rgba(17, 24, 39, 0.2);
|
|
69
|
+
--shadow-panel: 0px 20px 25px -5px rgba(0, 0, 0, 0.1), 0px 10px 10px -5px rgba(0, 0, 0, 0.04);
|
|
70
|
+
--spacing-0: 0;
|
|
71
|
+
--spacing-1: 0.125rem;
|
|
72
|
+
--spacing-2: 0.25rem;
|
|
73
|
+
--spacing-3: 0.375rem;
|
|
74
|
+
--spacing-4: 0.5rem;
|
|
75
|
+
--spacing-5: 0.625rem;
|
|
76
|
+
--spacing-6: 0.75rem;
|
|
77
|
+
--spacing-8: 1rem;
|
|
78
|
+
--spacing-10: 1.25rem;
|
|
79
|
+
--spacing-12: 1.5rem;
|
|
80
|
+
--spacing-16: 2rem;
|
|
81
|
+
--spacing-20: 2.5rem;
|
|
82
|
+
--spacing-24: 3rem;
|
|
83
|
+
--spacing-32: 4rem;
|
|
84
|
+
--spacing-40: 5rem;
|
|
85
|
+
--spacing-48: 6rem;
|
|
86
|
+
--spacing-64: 8rem;
|
|
87
|
+
--font-sans:
|
|
88
|
+
'PT Sans', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
|
|
89
|
+
'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
|
|
90
|
+
'Segoe UI Symbol', 'Noto Color Emoji';
|
|
91
|
+
--font-mono:
|
|
92
|
+
ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New',
|
|
93
|
+
monospace;
|
|
94
|
+
--font-size-xs: 0.75rem;
|
|
95
|
+
--font-size-sm: 0.875rem;
|
|
96
|
+
--font-size-base: 1rem;
|
|
97
|
+
--font-size-lg: 1.125rem;
|
|
98
|
+
--font-size-xl: 1.25rem;
|
|
99
|
+
--font-size-2xl: 1.5rem;
|
|
100
|
+
--font-size-3xl: 1.875rem;
|
|
101
|
+
--font-size-4xl: 2.25rem;
|
|
102
|
+
--line-height-none: 1;
|
|
103
|
+
--line-height-tight: 1.25;
|
|
104
|
+
--line-height-snug: 1.375;
|
|
105
|
+
--line-height-normal: 1.5;
|
|
106
|
+
--line-height-relaxed: 1.625;
|
|
107
|
+
--font-weight-normal: 400;
|
|
108
|
+
--font-weight-medium: 500;
|
|
109
|
+
--font-weight-semibold: 600;
|
|
110
|
+
--font-weight-bold: 700;
|
|
111
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--color-gray-50: #f9fafb;
|
|
3
|
+
--color-gray-100: #f3f4f6;
|
|
4
|
+
--color-gray-150: #9ca3af;
|
|
5
|
+
--color-gray-200: #e5e7eb;
|
|
6
|
+
--color-gray-300: #d1d5db;
|
|
7
|
+
--color-gray-400: #9ca3af;
|
|
8
|
+
--color-gray-500: #6b7280;
|
|
9
|
+
--color-gray-600: #4b5563;
|
|
10
|
+
--color-gray-700: #374151;
|
|
11
|
+
--color-gray-800: #1f2937;
|
|
12
|
+
--color-gray-900: #111827;
|
|
13
|
+
--color-gray-950: #030712;
|
|
14
|
+
--color-pink-50: #fdf4f4;
|
|
15
|
+
--color-pink-100: #fbd1d2;
|
|
16
|
+
--color-pink-150: #f8babc;
|
|
17
|
+
--color-xwy-50: #fdf4f4;
|
|
18
|
+
--color-xwy-100: #fbd1d2;
|
|
19
|
+
--color-xwy-150: #f8babc;
|
|
20
|
+
--color-red-50: #fef2f2;
|
|
21
|
+
--color-red-100: #fee2e2;
|
|
22
|
+
--color-red-200: #fecaca;
|
|
23
|
+
--color-red-300: #fca5a5;
|
|
24
|
+
--color-red-400: #f87171;
|
|
25
|
+
--color-red-500: #ef4444;
|
|
26
|
+
--color-red-600: #dc2626;
|
|
27
|
+
--color-blue-50: #eff6ff;
|
|
28
|
+
--color-blue-100: #dbeafe;
|
|
29
|
+
--color-blue-500: #3b82f6;
|
|
30
|
+
--color-blue-600: #2563eb;
|
|
31
|
+
--color-white: #ffffff;
|
|
32
|
+
--color-black: #000000;
|
|
33
|
+
--color-background: #ffffff;
|
|
34
|
+
--color-foreground: #111827;
|
|
35
|
+
--color-muted: #f3f4f6;
|
|
36
|
+
--color-muted-foreground: #6b7280;
|
|
37
|
+
--color-border: #e5e7eb;
|
|
38
|
+
--color-primary: #2563eb;
|
|
39
|
+
--color-primary-foreground: #ffffff;
|
|
40
|
+
--color-secondary: #f3f4f6;
|
|
41
|
+
--color-secondary-foreground: #111827;
|
|
42
|
+
--color-accent: #fbd1d2;
|
|
43
|
+
--color-accent-foreground: #111827;
|
|
44
|
+
--color-destructive: #dc2626;
|
|
45
|
+
--color-destructive-foreground: #ffffff;
|
|
46
|
+
--color-special: #fdf4f4;
|
|
47
|
+
--color-logo: #9ca3af;
|
|
48
|
+
--color-special-foreground: #111827;
|
|
49
|
+
--color-content-primary: #111827;
|
|
50
|
+
--color-content-special: #f8babc;
|
|
51
|
+
--color-content-secondary: #4b5563;
|
|
52
|
+
--color-content-disabled: #9ca3af;
|
|
53
|
+
--color-content-action: #000000;
|
|
54
|
+
--color-content-danger: #ef4444;
|
|
55
|
+
--color-status-error: #dc2626;
|
|
56
|
+
--color-status-warning: #ef4444;
|
|
57
|
+
--color-status-success: #22c55e;
|
|
58
|
+
--color-status-info: #2563eb;
|
|
59
|
+
--shadow-none: none;
|
|
60
|
+
--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
|
|
61
|
+
--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
|
|
62
|
+
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
|
|
63
|
+
--shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
|
|
64
|
+
--shadow-button: 0px 15px 15px rgba(0, 0, 0, 0.1), 0px 5px 5px -2px rgba(0, 0, 0, 0.04);
|
|
65
|
+
--shadow-button-hover:
|
|
66
|
+
0px 10px 15px -3px rgba(0, 0, 0, 0.1), 0px 5px 5px -2px rgba(0, 0, 0, 0.04);
|
|
67
|
+
--shadow-input:
|
|
68
|
+
inset 0px 10px 25px -15px rgba(0, 0, 0, 0.25), inset 0px 5px 10px -5px rgba(17, 24, 39, 0.2);
|
|
69
|
+
--shadow-panel: 0px 20px 25px -5px rgba(0, 0, 0, 0.1), 0px 10px 10px -5px rgba(0, 0, 0, 0.04);
|
|
70
|
+
--spacing-0: 0;
|
|
71
|
+
--spacing-1: 0.125rem;
|
|
72
|
+
--spacing-2: 0.25rem;
|
|
73
|
+
--spacing-3: 0.375rem;
|
|
74
|
+
--spacing-4: 0.5rem;
|
|
75
|
+
--spacing-5: 0.625rem;
|
|
76
|
+
--spacing-6: 0.75rem;
|
|
77
|
+
--spacing-8: 1rem;
|
|
78
|
+
--spacing-10: 1.25rem;
|
|
79
|
+
--spacing-12: 1.5rem;
|
|
80
|
+
--spacing-16: 2rem;
|
|
81
|
+
--spacing-20: 2.5rem;
|
|
82
|
+
--spacing-24: 3rem;
|
|
83
|
+
--spacing-32: 4rem;
|
|
84
|
+
--spacing-40: 5rem;
|
|
85
|
+
--spacing-48: 6rem;
|
|
86
|
+
--spacing-64: 8rem;
|
|
87
|
+
--font-sans:
|
|
88
|
+
'PT Sans', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
|
|
89
|
+
'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
|
|
90
|
+
'Segoe UI Symbol', 'Noto Color Emoji';
|
|
91
|
+
--font-mono:
|
|
92
|
+
ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New',
|
|
93
|
+
monospace;
|
|
94
|
+
--font-size-xs: 0.75rem;
|
|
95
|
+
--font-size-sm: 0.875rem;
|
|
96
|
+
--font-size-base: 1rem;
|
|
97
|
+
--font-size-lg: 1.125rem;
|
|
98
|
+
--font-size-xl: 1.25rem;
|
|
99
|
+
--font-size-2xl: 1.5rem;
|
|
100
|
+
--font-size-3xl: 1.875rem;
|
|
101
|
+
--font-size-4xl: 2.25rem;
|
|
102
|
+
--line-height-none: 1;
|
|
103
|
+
--line-height-tight: 1.25;
|
|
104
|
+
--line-height-snug: 1.375;
|
|
105
|
+
--line-height-normal: 1.5;
|
|
106
|
+
--line-height-relaxed: 1.625;
|
|
107
|
+
--font-weight-normal: 400;
|
|
108
|
+
--font-weight-medium: 500;
|
|
109
|
+
--font-weight-semibold: 600;
|
|
110
|
+
--font-weight-bold: 700;
|
|
111
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-generated from design tokens
|
|
3
|
+
* Do not edit manually
|
|
4
|
+
*/
|
|
5
|
+
export const tokens = {
|
|
6
|
+
colors: {},
|
|
7
|
+
base: {
|
|
8
|
+
color: {
|
|
9
|
+
'gray-50': 'var(--color-gray-50)',
|
|
10
|
+
'gray-100': 'var(--color-gray-100)',
|
|
11
|
+
'gray-150': 'var(--color-gray-150)',
|
|
12
|
+
'gray-200': 'var(--color-gray-200)',
|
|
13
|
+
'gray-300': 'var(--color-gray-300)',
|
|
14
|
+
'gray-400': 'var(--color-gray-400)',
|
|
15
|
+
'gray-500': 'var(--color-gray-500)',
|
|
16
|
+
'gray-600': 'var(--color-gray-600)',
|
|
17
|
+
'gray-700': 'var(--color-gray-700)',
|
|
18
|
+
'gray-800': 'var(--color-gray-800)',
|
|
19
|
+
'gray-900': 'var(--color-gray-900)',
|
|
20
|
+
'gray-950': 'var(--color-gray-950)',
|
|
21
|
+
'pink-50': 'var(--color-pink-50)',
|
|
22
|
+
'pink-100': 'var(--color-pink-100)',
|
|
23
|
+
'pink-150': 'var(--color-pink-150)',
|
|
24
|
+
'xwy-50': 'var(--color-xwy-50)',
|
|
25
|
+
'xwy-100': 'var(--color-xwy-100)',
|
|
26
|
+
'xwy-150': 'var(--color-xwy-150)',
|
|
27
|
+
'red-50': 'var(--color-red-50)',
|
|
28
|
+
'red-100': 'var(--color-red-100)',
|
|
29
|
+
'red-200': 'var(--color-red-200)',
|
|
30
|
+
'red-300': 'var(--color-red-300)',
|
|
31
|
+
'red-400': 'var(--color-red-400)',
|
|
32
|
+
'red-500': 'var(--color-red-500)',
|
|
33
|
+
'red-600': 'var(--color-red-600)',
|
|
34
|
+
'blue-50': 'var(--color-blue-50)',
|
|
35
|
+
'blue-100': 'var(--color-blue-100)',
|
|
36
|
+
'blue-500': 'var(--color-blue-500)',
|
|
37
|
+
'blue-600': 'var(--color-blue-600)',
|
|
38
|
+
white: 'var(--color-white)',
|
|
39
|
+
black: 'var(--color-black)',
|
|
40
|
+
background: 'var(--color-background)',
|
|
41
|
+
foreground: 'var(--color-foreground)',
|
|
42
|
+
muted: 'var(--color-muted)',
|
|
43
|
+
mutedForeground: 'var(--color-muted-foreground)',
|
|
44
|
+
border: 'var(--color-border)',
|
|
45
|
+
primary: 'var(--color-primary)',
|
|
46
|
+
primaryForeground: 'var(--color-primary-foreground)',
|
|
47
|
+
secondary: 'var(--color-secondary)',
|
|
48
|
+
secondaryForeground: 'var(--color-secondary-foreground)',
|
|
49
|
+
accent: 'var(--color-accent)',
|
|
50
|
+
accentForeground: 'var(--color-accent-foreground)',
|
|
51
|
+
destructive: 'var(--color-destructive)',
|
|
52
|
+
destructiveForeground: 'var(--color-destructive-foreground)',
|
|
53
|
+
special: 'var(--color-special)',
|
|
54
|
+
logo: 'var(--color-logo)',
|
|
55
|
+
specialForeground: 'var(--color-special-foreground)',
|
|
56
|
+
'content-primary': 'var(--color-content-primary)',
|
|
57
|
+
'content-special': 'var(--color-content-special)',
|
|
58
|
+
'content-secondary': 'var(--color-content-secondary)',
|
|
59
|
+
'content-disabled': 'var(--color-content-disabled)',
|
|
60
|
+
'content-action': 'var(--color-content-action)',
|
|
61
|
+
'content-danger': 'var(--color-content-danger)',
|
|
62
|
+
'status-error': 'var(--color-status-error)',
|
|
63
|
+
'status-warning': 'var(--color-status-warning)',
|
|
64
|
+
'status-success': 'var(--color-status-success)',
|
|
65
|
+
'status-info': 'var(--color-status-info)',
|
|
66
|
+
},
|
|
67
|
+
shadow: {
|
|
68
|
+
none: 'var(--shadow-none)',
|
|
69
|
+
sm: 'var(--shadow-sm)',
|
|
70
|
+
md: 'var(--shadow-md)',
|
|
71
|
+
lg: 'var(--shadow-lg)',
|
|
72
|
+
xl: 'var(--shadow-xl)',
|
|
73
|
+
button: 'var(--shadow-button)',
|
|
74
|
+
buttonHover: 'var(--shadow-button-hover)',
|
|
75
|
+
input: 'var(--shadow-input)',
|
|
76
|
+
panel: 'var(--shadow-panel)',
|
|
77
|
+
},
|
|
78
|
+
spacing: {
|
|
79
|
+
'0': 'var(--spacing-0)',
|
|
80
|
+
'1': 'var(--spacing-1)',
|
|
81
|
+
'2': 'var(--spacing-2)',
|
|
82
|
+
'3': 'var(--spacing-3)',
|
|
83
|
+
'4': 'var(--spacing-4)',
|
|
84
|
+
'5': 'var(--spacing-5)',
|
|
85
|
+
'6': 'var(--spacing-6)',
|
|
86
|
+
'8': 'var(--spacing-8)',
|
|
87
|
+
'10': 'var(--spacing-10)',
|
|
88
|
+
'12': 'var(--spacing-12)',
|
|
89
|
+
'16': 'var(--spacing-16)',
|
|
90
|
+
'20': 'var(--spacing-20)',
|
|
91
|
+
'24': 'var(--spacing-24)',
|
|
92
|
+
'32': 'var(--spacing-32)',
|
|
93
|
+
'40': 'var(--spacing-40)',
|
|
94
|
+
'48': 'var(--spacing-48)',
|
|
95
|
+
'64': 'var(--spacing-64)',
|
|
96
|
+
},
|
|
97
|
+
font: {
|
|
98
|
+
sans: 'var(--font-sans)',
|
|
99
|
+
mono: 'var(--font-mono)',
|
|
100
|
+
},
|
|
101
|
+
fontSize: {
|
|
102
|
+
xs: 'var(--font-size-xs)',
|
|
103
|
+
sm: 'var(--font-size-sm)',
|
|
104
|
+
base: 'var(--font-size-base)',
|
|
105
|
+
lg: 'var(--font-size-lg)',
|
|
106
|
+
xl: 'var(--font-size-xl)',
|
|
107
|
+
'2xl': 'var(--font-size-2xl)',
|
|
108
|
+
'3xl': 'var(--font-size-3xl)',
|
|
109
|
+
'4xl': 'var(--font-size-4xl)',
|
|
110
|
+
},
|
|
111
|
+
lineHeight: {
|
|
112
|
+
none: 'var(--line-height-none)',
|
|
113
|
+
tight: 'var(--line-height-tight)',
|
|
114
|
+
snug: 'var(--line-height-snug)',
|
|
115
|
+
normal: 'var(--line-height-normal)',
|
|
116
|
+
relaxed: 'var(--line-height-relaxed)',
|
|
117
|
+
},
|
|
118
|
+
fontWeight: {
|
|
119
|
+
normal: 'var(--font-weight-normal)',
|
|
120
|
+
medium: 'var(--font-weight-medium)',
|
|
121
|
+
semibold: 'var(--font-weight-semibold)',
|
|
122
|
+
bold: 'var(--font-weight-bold)',
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
} as const;
|
|
126
|
+
|
|
127
|
+
export type ThemeTokens = typeof tokens;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"color": {
|
|
3
|
+
"gray": {
|
|
4
|
+
"50": { "value": "#f9fafb", "type": "color" },
|
|
5
|
+
"100": { "value": "#f3f4f6", "type": "color" },
|
|
6
|
+
"150": { "value": "#9ca3af", "type": "color" },
|
|
7
|
+
"200": { "value": "#e5e7eb", "type": "color" },
|
|
8
|
+
"300": { "value": "#d1d5db", "type": "color" },
|
|
9
|
+
"400": { "value": "#9ca3af", "type": "color" },
|
|
10
|
+
"500": { "value": "#6b7280", "type": "color" },
|
|
11
|
+
"600": { "value": "#4b5563", "type": "color" },
|
|
12
|
+
"700": { "value": "#374151", "type": "color" },
|
|
13
|
+
"800": { "value": "#1f2937", "type": "color" },
|
|
14
|
+
"900": { "value": "#111827", "type": "color" },
|
|
15
|
+
"950": { "value": "#030712", "type": "color" }
|
|
16
|
+
},
|
|
17
|
+
"pink": {
|
|
18
|
+
"50": { "value": "#fdf4f4", "type": "color" },
|
|
19
|
+
"100": { "value": "#fbd1d2", "type": "color" },
|
|
20
|
+
"150": { "value": "#f8babc", "type": "color" }
|
|
21
|
+
},
|
|
22
|
+
"xwy": {
|
|
23
|
+
"50": {
|
|
24
|
+
"value": "#fdf4f4",
|
|
25
|
+
"type": "color"
|
|
26
|
+
},
|
|
27
|
+
"100": {
|
|
28
|
+
"value": "#fbd1d2",
|
|
29
|
+
"type": "color"
|
|
30
|
+
},
|
|
31
|
+
"150": {
|
|
32
|
+
"value": "#f8babc",
|
|
33
|
+
"type": "color"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"red": {
|
|
37
|
+
"50": { "value": "#fef2f2", "type": "color" },
|
|
38
|
+
"100": { "value": "#fee2e2", "type": "color" },
|
|
39
|
+
"200": { "value": "#fecaca", "type": "color" },
|
|
40
|
+
"300": { "value": "#fca5a5", "type": "color" },
|
|
41
|
+
"400": { "value": "#f87171", "type": "color" },
|
|
42
|
+
"500": { "value": "#ef4444", "type": "color" },
|
|
43
|
+
"600": { "value": "#dc2626", "type": "color" }
|
|
44
|
+
},
|
|
45
|
+
"blue": {
|
|
46
|
+
"50": { "value": "#eff6ff", "type": "color" },
|
|
47
|
+
"100": { "value": "#dbeafe", "type": "color" },
|
|
48
|
+
"500": { "value": "#3b82f6", "type": "color" },
|
|
49
|
+
"600": { "value": "#2563eb", "type": "color" }
|
|
50
|
+
},
|
|
51
|
+
"white": { "value": "#ffffff", "type": "color" },
|
|
52
|
+
"black": { "value": "#000000", "type": "color" }
|
|
53
|
+
}
|
|
54
|
+
}
|