@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.
Files changed (97) hide show
  1. package/.storybook/main.ts +21 -0
  2. package/.storybook/preview-head.html +10 -0
  3. package/.storybook/preview.tsx +30 -0
  4. package/CHANGELOG.md +8 -0
  5. package/README.md +124 -0
  6. package/package.json +57 -0
  7. package/scripts/build-tokens.ts +170 -0
  8. package/src/atoms/blink-dot/BlinkDot.stories.tsx +44 -0
  9. package/src/atoms/blink-dot/BlinkDot.tsx +45 -0
  10. package/src/atoms/blink-dot/index.ts +2 -0
  11. package/src/atoms/button/Button.stories.tsx +84 -0
  12. package/src/atoms/button/Button.tsx +59 -0
  13. package/src/atoms/button/Button.types.ts +20 -0
  14. package/src/atoms/button/Button.variants.ts +58 -0
  15. package/src/atoms/button/index.ts +3 -0
  16. package/src/atoms/link/Link.stories.tsx +121 -0
  17. package/src/atoms/link/Link.tsx +69 -0
  18. package/src/atoms/link/Link.types.ts +26 -0
  19. package/src/atoms/link/Link.variants.ts +55 -0
  20. package/src/atoms/link/index.ts +3 -0
  21. package/src/atoms/logo/Logo.stories.tsx +37 -0
  22. package/src/atoms/logo/Logo.tsx +49 -0
  23. package/src/atoms/logo/Logo.types.ts +4 -0
  24. package/src/atoms/logo/index.ts +2 -0
  25. package/src/index.ts +54 -0
  26. package/src/layout/container/Container.stories.tsx +73 -0
  27. package/src/layout/container/Container.tsx +57 -0
  28. package/src/layout/container/index.ts +2 -0
  29. package/src/layout/grid/Grid.stories.tsx +106 -0
  30. package/src/layout/grid/Grid.tsx +86 -0
  31. package/src/layout/grid/index.ts +2 -0
  32. package/src/layout/index.ts +4 -0
  33. package/src/molecules/article/Article.stories.tsx +45 -0
  34. package/src/molecules/article/Article.tsx +25 -0
  35. package/src/molecules/article/Article.types.ts +11 -0
  36. package/src/molecules/article/index.ts +2 -0
  37. package/src/molecules/breadcrumb/Breadcrumb.stories.tsx +60 -0
  38. package/src/molecules/breadcrumb/Breadcrumb.tsx +43 -0
  39. package/src/molecules/breadcrumb/Breadcrumb.types.ts +19 -0
  40. package/src/molecules/breadcrumb/index.ts +2 -0
  41. package/src/molecules/list/List.stories.tsx +84 -0
  42. package/src/molecules/list/List.tsx +79 -0
  43. package/src/molecules/list/List.types.ts +23 -0
  44. package/src/molecules/list/index.ts +2 -0
  45. package/src/molecules/nav/Nav.stories.tsx +45 -0
  46. package/src/molecules/nav/Nav.tsx +29 -0
  47. package/src/molecules/nav/Nav.types.ts +10 -0
  48. package/src/molecules/nav/index.ts +2 -0
  49. package/src/molecules/panel/Panel.stories.tsx +42 -0
  50. package/src/molecules/panel/Panel.tsx +27 -0
  51. package/src/molecules/panel/Panel.types.ts +6 -0
  52. package/src/molecules/panel/index.ts +2 -0
  53. package/src/molecules/table/Table.stories.tsx +54 -0
  54. package/src/molecules/table/Table.tsx +31 -0
  55. package/src/molecules/table/Table.types.ts +20 -0
  56. package/src/molecules/table/index.ts +2 -0
  57. package/src/organisms/canvas/Canvas.tsx +79 -0
  58. package/src/organisms/canvas/Canvas.types.ts +25 -0
  59. package/src/organisms/canvas/index.ts +3 -0
  60. package/src/organisms/canvas/useRenderer.ts +44 -0
  61. package/src/organisms/drop-image/DropImage.stories.tsx +36 -0
  62. package/src/organisms/drop-image/DropImage.tsx +193 -0
  63. package/src/organisms/drop-image/DropImage.types.ts +26 -0
  64. package/src/organisms/drop-image/index.ts +3 -0
  65. package/src/organisms/drop-image/useDropImage.ts +124 -0
  66. package/src/organisms/drop-image/utils.ts +1 -0
  67. package/src/organisms/drop-zone/DropZone.tsx +58 -0
  68. package/src/organisms/drop-zone/DropZone.types.ts +9 -0
  69. package/src/organisms/drop-zone/index.ts +2 -0
  70. package/src/organisms/loading-spiral/LoadingSpiral.stories.tsx +30 -0
  71. package/src/organisms/loading-spiral/LoadingSpiral.tsx +44 -0
  72. package/src/organisms/loading-spiral/LoadingSpiral.types.ts +4 -0
  73. package/src/organisms/loading-spiral/constants.ts +62 -0
  74. package/src/organisms/loading-spiral/createOptions.ts +31 -0
  75. package/src/organisms/loading-spiral/createSettings.ts +26 -0
  76. package/src/organisms/loading-spiral/index.ts +2 -0
  77. package/src/organisms/loading-spiral/useCanvasRef.ts +23 -0
  78. package/src/organisms/loading-spiral/utils.ts +5 -0
  79. package/src/organisms/page/Page.stories.tsx +65 -0
  80. package/src/organisms/page/Page.tsx +71 -0
  81. package/src/organisms/page/Page.types.ts +23 -0
  82. package/src/organisms/page/index.ts +8 -0
  83. package/src/styles.css +151 -0
  84. package/src/theme/ThemeContext.tsx +20 -0
  85. package/src/theme/ThemeProvider.tsx +93 -0
  86. package/src/theme/index.ts +3 -0
  87. package/src/tokens/css/dark.css +111 -0
  88. package/src/tokens/css/light.css +111 -0
  89. package/src/tokens/index.ts +127 -0
  90. package/tokens/base/colors.json +54 -0
  91. package/tokens/base/shadows.json +34 -0
  92. package/tokens/base/spacing.json +21 -0
  93. package/tokens/base/typography.json +35 -0
  94. package/tokens/semantic/dark.json +50 -0
  95. package/tokens/semantic/light.json +54 -0
  96. package/tsconfig.json +22 -0
  97. 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,3 @@
1
+ export { ThemeProvider } from './ThemeProvider';
2
+ export { useTheme, ThemeContext } from './ThemeContext';
3
+ export type { Theme, ThemeContextValue } from './ThemeContext';
@@ -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
+ }