@nextclaw/ui 0.2.3 → 0.2.5

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 (79) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/assets/index-BV3Gyu8h.js +225 -0
  3. package/dist/assets/index-iSLahgqA.css +1 -0
  4. package/dist/index.html +2 -2
  5. package/dist/logos/aihubmix.png +0 -0
  6. package/dist/logos/anthropic.svg +1 -0
  7. package/dist/logos/dashscope.png +0 -0
  8. package/dist/logos/deepseek.png +0 -0
  9. package/dist/logos/dingtalk.svg +1 -0
  10. package/dist/logos/discord.svg +1 -0
  11. package/dist/logos/email.svg +1 -0
  12. package/dist/logos/feishu.svg +12 -0
  13. package/dist/logos/gemini.svg +1 -0
  14. package/dist/logos/groq.svg +1 -0
  15. package/dist/logos/minimax.svg +1 -0
  16. package/dist/logos/mochat.svg +6 -0
  17. package/dist/logos/moonshot.png +0 -0
  18. package/dist/logos/openai.svg +1 -0
  19. package/dist/logos/openrouter.svg +1 -0
  20. package/dist/logos/qq.svg +1 -0
  21. package/dist/logos/slack.svg +1 -0
  22. package/dist/logos/telegram.svg +1 -0
  23. package/dist/logos/vllm.svg +1 -0
  24. package/dist/logos/whatsapp.svg +1 -0
  25. package/dist/logos/zhipu.svg +15 -0
  26. package/package.json +1 -1
  27. package/public/logos/aihubmix.png +0 -0
  28. package/public/logos/anthropic.svg +1 -0
  29. package/public/logos/dashscope.png +0 -0
  30. package/public/logos/deepseek.png +0 -0
  31. package/public/logos/dingtalk.svg +1 -0
  32. package/public/logos/discord.svg +1 -0
  33. package/public/logos/email.svg +1 -0
  34. package/public/logos/feishu.svg +12 -0
  35. package/public/logos/gemini.svg +1 -0
  36. package/public/logos/groq.svg +1 -0
  37. package/public/logos/minimax.svg +1 -0
  38. package/public/logos/mochat.svg +6 -0
  39. package/public/logos/moonshot.png +0 -0
  40. package/public/logos/openai.svg +1 -0
  41. package/public/logos/openrouter.svg +1 -0
  42. package/public/logos/qq.svg +1 -0
  43. package/public/logos/slack.svg +1 -0
  44. package/public/logos/telegram.svg +1 -0
  45. package/public/logos/vllm.svg +1 -0
  46. package/public/logos/whatsapp.svg +1 -0
  47. package/public/logos/zhipu.svg +15 -0
  48. package/src/App.tsx +0 -3
  49. package/src/api/client.ts +15 -1
  50. package/src/api/config.ts +5 -14
  51. package/src/api/types.ts +7 -8
  52. package/src/components/common/LogoBadge.tsx +35 -0
  53. package/src/components/common/StatusBadge.tsx +4 -4
  54. package/src/components/config/ChannelForm.tsx +48 -16
  55. package/src/components/config/ChannelsList.tsx +96 -34
  56. package/src/components/config/ModelConfig.tsx +30 -29
  57. package/src/components/config/ProviderForm.tsx +9 -11
  58. package/src/components/config/ProvidersList.tsx +90 -38
  59. package/src/components/layout/Header.tsx +7 -7
  60. package/src/components/layout/Sidebar.tsx +10 -23
  61. package/src/components/ui/HighlightCard.tsx +29 -29
  62. package/src/components/ui/button.tsx +13 -8
  63. package/src/components/ui/card.tsx +8 -7
  64. package/src/components/ui/dialog.tsx +8 -8
  65. package/src/components/ui/input.tsx +1 -1
  66. package/src/components/ui/label.tsx +1 -1
  67. package/src/components/ui/switch.tsx +3 -3
  68. package/src/components/ui/tabs-custom.tsx +6 -6
  69. package/src/components/ui/tabs.tsx +7 -6
  70. package/src/hooks/useConfig.ts +2 -29
  71. package/src/index.css +103 -56
  72. package/src/lib/i18n.ts +10 -6
  73. package/src/lib/logos.ts +42 -0
  74. package/src/stores/ui.store.ts +1 -1
  75. package/src/styles/design-system.css +248 -0
  76. package/tailwind.config.js +118 -10
  77. package/dist/assets/index-CDd3pWyf.js +0 -235
  78. package/dist/assets/index-CrA44GOI.css +0 -1
  79. package/src/components/config/UiConfig.tsx +0 -189
@@ -0,0 +1,248 @@
1
+ /**
2
+ * NextClaw Design System
3
+ * Inspired by modern SaaS landing pages (e.g., 推理时代)
4
+ * Clean, professional, with blue accent
5
+ */
6
+
7
+ @layer base {
8
+ :root {
9
+ /* ========================================
10
+ BRAND COLORS
11
+ ======================================== */
12
+ --brand-50: 217 100% 97%;
13
+ --brand-100: 217 100% 94%;
14
+ --brand-200: 217 95% 87%;
15
+ --brand-300: 217 90% 77%;
16
+ --brand-400: 217 85% 65%;
17
+ --brand-500: 217 80% 55%;
18
+ --brand-600: 217 75% 48%;
19
+ --brand-700: 217 70% 40%;
20
+ --brand-800: 217 65% 33%;
21
+ --brand-900: 217 60% 25%;
22
+
23
+ /* ========================================
24
+ NEUTRAL COLORS (Gray Scale)
25
+ ======================================== */
26
+ --gray-50: 210 20% 98%;
27
+ --gray-100: 220 14% 96%;
28
+ --gray-200: 220 13% 91%;
29
+ --gray-300: 216 12% 84%;
30
+ --gray-400: 218 11% 65%;
31
+ --gray-500: 220 9% 46%;
32
+ --gray-600: 215 14% 34%;
33
+ --gray-700: 217 19% 27%;
34
+ --gray-800: 215 28% 17%;
35
+ --gray-900: 221 39% 11%;
36
+
37
+ /* ========================================
38
+ SEMANTIC COLORS
39
+ ======================================== */
40
+ /* Background */
41
+ --background: 210 20% 98%;
42
+ --background-secondary: 220 14% 96%;
43
+ --background-tertiary: 220 13% 91%;
44
+
45
+ /* Foreground (Text) */
46
+ --foreground: 221 39% 11%;
47
+ --foreground-secondary: 215 28% 17%;
48
+ --foreground-tertiary: 220 9% 46%;
49
+ --foreground-muted: 218 11% 65%;
50
+
51
+ /* Primary (Brand Blue) */
52
+ --primary: 217 80% 55%;
53
+ --primary-hover: 217 75% 48%;
54
+ --primary-active: 217 70% 40%;
55
+ --primary-foreground: 0 0% 100%;
56
+
57
+ /* Secondary */
58
+ --secondary: 220 14% 96%;
59
+ --secondary-hover: 220 13% 91%;
60
+ --secondary-foreground: 215 28% 17%;
61
+
62
+ /* Accent */
63
+ --accent: 217 100% 97%;
64
+ --accent-foreground: 217 70% 40%;
65
+
66
+ /* Muted */
67
+ --muted: 220 14% 96%;
68
+ --muted-foreground: 220 9% 46%;
69
+
70
+ /* Destructive */
71
+ --destructive: 0 84% 60%;
72
+ --destructive-foreground: 0 0% 98%;
73
+
74
+ /* Success */
75
+ --success: 142 76% 36%;
76
+ --success-foreground: 0 0% 100%;
77
+
78
+ /* Warning */
79
+ --warning: 38 92% 50%;
80
+ --warning-foreground: 0 0% 100%;
81
+
82
+ /* ========================================
83
+ UI ELEMENTS
84
+ ======================================== */
85
+ /* Card */
86
+ --card: 0 0% 100%;
87
+ --card-foreground: 221 39% 11%;
88
+ --card-border: 220 13% 91%;
89
+
90
+ /* Popover */
91
+ --popover: 0 0% 100%;
92
+ --popover-foreground: 221 39% 11%;
93
+
94
+ /* Border */
95
+ --border: 220 13% 91%;
96
+ --border-hover: 216 12% 84%;
97
+ --border-active: 217 80% 55%;
98
+
99
+ /* Input */
100
+ --input: 0 0% 100%;
101
+ --input-border: 220 13% 91%;
102
+ --input-focus: 217 80% 55%;
103
+
104
+ /* Ring (Focus) */
105
+ --ring: 217 80% 55%;
106
+ --ring-offset: 0 0% 100%;
107
+
108
+ /* ========================================
109
+ SPACING SYSTEM
110
+ ======================================== */
111
+ --space-0: 0px;
112
+ --space-1: 4px;
113
+ --space-2: 8px;
114
+ --space-3: 12px;
115
+ --space-4: 16px;
116
+ --space-5: 20px;
117
+ --space-6: 24px;
118
+ --space-8: 32px;
119
+ --space-10: 40px;
120
+ --space-12: 48px;
121
+ --space-16: 64px;
122
+ --space-20: 80px;
123
+ --space-24: 96px;
124
+
125
+ /* ========================================
126
+ BORDER RADIUS
127
+ ======================================== */
128
+ --radius-sm: 6px;
129
+ --radius-md: 8px;
130
+ --radius-lg: 12px;
131
+ --radius-xl: 16px;
132
+ --radius-2xl: 20px;
133
+ --radius-3xl: 24px;
134
+ --radius-full: 9999px;
135
+
136
+ /* ========================================
137
+ SHADOWS
138
+ ======================================== */
139
+ --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);
140
+ --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
141
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
142
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
143
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
144
+ --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);
145
+
146
+ /* Card Shadow */
147
+ --shadow-card: 0 1px 3px 0 rgb(0 0 0 / 0.05), 0 1px 2px -1px rgb(0 0 0 / 0.05);
148
+ --shadow-card-hover: 0 10px 15px -3px rgb(0 0 0 / 0.08), 0 4px 6px -4px rgb(0 0 0 / 0.05);
149
+
150
+ /* ========================================
151
+ TYPOGRAPHY
152
+ ======================================== */
153
+ --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;
154
+ --font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
155
+
156
+ /* Font Sizes */
157
+ --text-xs: 12px;
158
+ --text-sm: 14px;
159
+ --text-base: 16px;
160
+ --text-lg: 18px;
161
+ --text-xl: 20px;
162
+ --text-2xl: 24px;
163
+ --text-3xl: 30px;
164
+ --text-4xl: 36px;
165
+ --text-5xl: 48px;
166
+
167
+ /* Font Weights */
168
+ --font-normal: 400;
169
+ --font-medium: 500;
170
+ --font-semibold: 600;
171
+ --font-bold: 700;
172
+
173
+ /* Line Heights */
174
+ --leading-tight: 1.25;
175
+ --leading-snug: 1.375;
176
+ --leading-normal: 1.5;
177
+ --leading-relaxed: 1.625;
178
+
179
+ /* Letter Spacing */
180
+ --tracking-tight: -0.025em;
181
+ --tracking-normal: 0;
182
+ --tracking-wide: 0.025em;
183
+
184
+ /* ========================================
185
+ TRANSITIONS
186
+ ======================================== */
187
+ --transition-fast: 150ms ease;
188
+ --transition-base: 200ms ease;
189
+ --transition-slow: 300ms ease;
190
+
191
+ /* ========================================
192
+ Z-INDEX SCALE
193
+ ======================================== */
194
+ --z-dropdown: 100;
195
+ --z-sticky: 200;
196
+ --z-fixed: 300;
197
+ --z-modal-backdrop: 400;
198
+ --z-modal: 500;
199
+ --z-popover: 600;
200
+ --z-tooltip: 700;
201
+ }
202
+ }
203
+
204
+ @layer utilities {
205
+ /* ========================================
206
+ UTILITY CLASSES
207
+ ======================================== */
208
+
209
+ /* Brand Colors */
210
+ .bg-brand-50 { background-color: hsl(var(--brand-50)); }
211
+ .bg-brand-100 { background-color: hsl(var(--brand-100)); }
212
+ .bg-brand-500 { background-color: hsl(var(--brand-500)); }
213
+ .bg-brand-600 { background-color: hsl(var(--brand-600)); }
214
+ .text-brand-500 { color: hsl(var(--brand-500)); }
215
+ .text-brand-600 { color: hsl(var(--brand-600)); }
216
+ .border-brand-500 { border-color: hsl(var(--brand-500)); }
217
+
218
+ /* Gray Colors */
219
+ .bg-gray-50 { background-color: hsl(var(--gray-50)); }
220
+ .bg-gray-100 { background-color: hsl(var(--gray-100)); }
221
+ .bg-gray-900 { background-color: hsl(var(--gray-900)); }
222
+ .text-gray-500 { color: hsl(var(--gray-500)); }
223
+ .text-gray-600 { color: hsl(var(--gray-600)); }
224
+ .text-gray-900 { color: hsl(var(--gray-900)); }
225
+
226
+ /* Shadows */
227
+ .shadow-card { box-shadow: var(--shadow-card); }
228
+ .shadow-card-hover { box-shadow: var(--shadow-card-hover); }
229
+
230
+ /* Gradient Backgrounds */
231
+ .bg-gradient-hero {
232
+ background: linear-gradient(180deg, hsl(var(--background)) 0%, hsl(var(--gray-50)) 100%);
233
+ }
234
+
235
+ /* Glass Effect */
236
+ .glass {
237
+ background: rgba(255, 255, 255, 0.8);
238
+ backdrop-filter: blur(12px);
239
+ -webkit-backdrop-filter: blur(12px);
240
+ }
241
+
242
+ /* Focus Ring */
243
+ .focus-ring {
244
+ @apply focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2;
245
+ --tw-ring-color: hsl(var(--ring));
246
+ --tw-ring-offset-color: hsl(var(--ring-offset));
247
+ }
248
+ }
@@ -5,39 +5,147 @@ export default {
5
5
  theme: {
6
6
  extend: {
7
7
  colors: {
8
+ /* Semantic Colors */
8
9
  border: 'hsl(var(--border))',
9
10
  input: 'hsl(var(--input))',
10
11
  ring: 'hsl(var(--ring))',
11
12
  background: 'hsl(var(--background))',
12
13
  foreground: 'hsl(var(--foreground))',
14
+
15
+ /* Primary (Brand Blue) */
13
16
  primary: {
14
17
  DEFAULT: 'hsl(var(--primary))',
15
- foreground: 'hsl(var(--primary-foreground))'
18
+ foreground: 'hsl(var(--primary-foreground))',
19
+ 50: 'hsl(var(--brand-50))',
20
+ 100: 'hsl(var(--brand-100))',
21
+ 200: 'hsl(var(--brand-200))',
22
+ 300: 'hsl(var(--brand-300))',
23
+ 400: 'hsl(var(--brand-400))',
24
+ 500: 'hsl(var(--brand-500))',
25
+ 600: 'hsl(var(--brand-600))',
26
+ 700: 'hsl(var(--brand-700))',
27
+ 800: 'hsl(var(--brand-800))',
28
+ 900: 'hsl(var(--brand-900))',
16
29
  },
30
+
31
+ /* Secondary */
17
32
  secondary: {
18
33
  DEFAULT: 'hsl(var(--secondary))',
19
- foreground: 'hsl(var(--secondary-foreground))'
34
+ foreground: 'hsl(var(--secondary-foreground))',
20
35
  },
36
+
37
+ /* Muted */
21
38
  muted: {
22
39
  DEFAULT: 'hsl(var(--muted))',
23
- foreground: 'hsl(var(--muted-foreground))'
40
+ foreground: 'hsl(var(--muted-foreground))',
24
41
  },
42
+
43
+ /* Accent */
25
44
  accent: {
26
45
  DEFAULT: 'hsl(var(--accent))',
27
- foreground: 'hsl(var(--accent-foreground))'
46
+ foreground: 'hsl(var(--accent-foreground))',
28
47
  },
48
+
49
+ /* Destructive */
29
50
  destructive: {
30
51
  DEFAULT: 'hsl(var(--destructive))',
31
- foreground: 'hsl(var(--destructive-foreground))'
32
- }
52
+ foreground: 'hsl(var(--destructive-foreground))',
53
+ },
54
+
55
+ /* Card */
56
+ card: {
57
+ DEFAULT: 'hsl(var(--card))',
58
+ foreground: 'hsl(var(--card-foreground))',
59
+ },
60
+
61
+ /* Popover */
62
+ popover: {
63
+ DEFAULT: 'hsl(var(--popover))',
64
+ foreground: 'hsl(var(--popover-foreground))',
65
+ },
66
+
67
+ /* Gray Scale */
68
+ gray: {
69
+ 50: 'hsl(var(--gray-50))',
70
+ 100: 'hsl(var(--gray-100))',
71
+ 200: 'hsl(var(--gray-200))',
72
+ 300: 'hsl(var(--gray-300))',
73
+ 400: 'hsl(var(--gray-400))',
74
+ 500: 'hsl(var(--gray-500))',
75
+ 600: 'hsl(var(--gray-600))',
76
+ 700: 'hsl(var(--gray-700))',
77
+ 800: 'hsl(var(--gray-800))',
78
+ 900: 'hsl(var(--gray-900))',
79
+ },
80
+
81
+ /* Legacy Milk Colors (for compatibility) */
82
+ milk: {
83
+ 50: 'hsl(var(--milk-50))',
84
+ 100: 'hsl(var(--milk-100))',
85
+ 200: 'hsl(var(--milk-200))',
86
+ 300: 'hsl(var(--milk-300))',
87
+ 400: 'hsl(var(--milk-400))',
88
+ 500: 'hsl(var(--milk-500))',
89
+ 600: 'hsl(var(--milk-600))',
90
+ 700: 'hsl(var(--milk-700))',
91
+ 800: 'hsl(var(--milk-800))',
92
+ 900: 'hsl(var(--milk-900))',
93
+ },
33
94
  },
95
+
34
96
  borderRadius: {
35
97
  lg: 'var(--radius)',
36
98
  md: 'calc(var(--radius) - 2px)',
37
- sm: 'calc(var(--radius) - 4px)'
38
- }
39
- }
99
+ sm: 'calc(var(--radius) - 4px)',
100
+ xl: 'calc(var(--radius) + 4px)',
101
+ '2xl': 'calc(var(--radius) + 8px)',
102
+ },
103
+
104
+ fontFamily: {
105
+ sans: ['var(--font-sans)'],
106
+ mono: ['var(--font-mono)'],
107
+ },
108
+
109
+ boxShadow: {
110
+ 'card': 'var(--shadow-card)',
111
+ 'card-hover': 'var(--shadow-card-hover)',
112
+ 'premium': 'var(--shadow-premium)',
113
+ 'premium-hover': 'var(--shadow-premium-hover)',
114
+ },
115
+
116
+ transitionDuration: {
117
+ 'fast': '150ms',
118
+ 'base': '200ms',
119
+ 'slow': '300ms',
120
+ },
121
+
122
+ animation: {
123
+ 'fade-in': 'fadeIn 0.4s cubic-bezier(0.16, 1, 0.3, 1) forwards',
124
+ 'slide-in': 'slideIn 0.35s cubic-bezier(0.16, 1, 0.3, 1) forwards',
125
+ 'scale-in': 'scaleIn 0.35s cubic-bezier(0.16, 1, 0.3, 1) forwards',
126
+ 'pulse-soft': 'pulse-soft 3s ease-in-out infinite',
127
+ },
128
+
129
+ keyframes: {
130
+ fadeIn: {
131
+ '0%': { opacity: '0', transform: 'translateY(12px)' },
132
+ '100%': { opacity: '1', transform: 'translateY(0)' },
133
+ },
134
+ slideIn: {
135
+ '0%': { opacity: '0', transform: 'translateX(-12px)' },
136
+ '100%': { opacity: '1', transform: 'translateX(0)' },
137
+ },
138
+ scaleIn: {
139
+ '0%': { opacity: '0', transform: 'scale(0.97)' },
140
+ '100%': { opacity: '1', transform: 'scale(1)' },
141
+ },
142
+ 'pulse-soft': {
143
+ '0%, 100%': { opacity: '1' },
144
+ '50%': { opacity: '0.8' },
145
+ },
146
+ },
147
+ },
40
148
  },
41
149
  // eslint-disable-next-line @typescript-eslint/no-require-imports
42
- plugins: [require('tailwindcss-animate')]
150
+ plugins: [require('tailwindcss-animate')],
43
151
  };