@zmzai/theme 0.8.1 → 0.8.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zmzai/theme",
3
- "version": "0.8.1",
3
+ "version": "0.8.4",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "zmzai 全品牌设计系统 — Radix UI + framer-motion + Tailwind v4 + MiSans",
@@ -60,6 +60,12 @@
60
60
  "README.md",
61
61
  "LICENSE"
62
62
  ],
63
+ "scripts": {
64
+ "build": "tsc -p tsconfig.json --noEmit",
65
+ "typecheck": "tsc --noEmit",
66
+ "playground": "vite playground --port 5174",
67
+ "prepublishOnly": "pnpm typecheck"
68
+ },
63
69
  "peerDependencies": {
64
70
  "react": "^19.0.0",
65
71
  "react-dom": "^19.0.0",
@@ -99,9 +105,5 @@
99
105
  "remark-gfm": "^4.0.1",
100
106
  "tailwind-merge": "^2.5.0"
101
107
  },
102
- "scripts": {
103
- "build": "tsc -p tsconfig.json --noEmit",
104
- "typecheck": "tsc --noEmit",
105
- "playground": "vite playground --port 5174"
106
- }
107
- }
108
+ "packageManager": "pnpm@10.34.5+sha512.a4ee05f2f73658255bd6a89859c065a45c28a57daefae2c893a168ee2b73168c37b91e83e57ea67654ad03f03031746430e8bce38e362e042605fb8abc80192e"
109
+ }
Binary file
@@ -143,7 +143,7 @@ export function AppShell({
143
143
  {/* 移动端抽屉 */}
144
144
  {drawerOpen ? (
145
145
  <div className="fixed inset-0 z-40 lg:hidden" role="presentation">
146
- <div className="absolute inset-0 bg-black/30" onClick={() => setDrawerOpen(false)} />
146
+ <div className="absolute inset-0 bg-ink/40" onClick={() => setDrawerOpen(false)} />
147
147
  <nav className="absolute inset-y-0 left-0 flex w-64 flex-col gap-5 overflow-y-auto border-r border-line bg-bg px-3 py-4">
148
148
  {brandBlock}
149
149
  <SidebarSections sections={sections} pathname={pathname} link={Link} onNavigate={() => setDrawerOpen(false)} />
@@ -79,7 +79,7 @@ export function CommandPalette({ open, onClose, items, placeholder = "搜索页
79
79
  };
80
80
 
81
81
  return (
82
- <div className="fixed inset-0 z-50 flex items-start justify-center bg-black/30 px-4 pt-[12vh]" onClick={onClose} role="presentation">
82
+ <div className="fixed inset-0 z-50 flex items-start justify-center bg-ink/40 px-4 pt-[12vh]" onClick={onClose} role="presentation">
83
83
  <div
84
84
  className="w-full max-w-xl overflow-hidden rounded-xl border border-line bg-bg shadow-lg"
85
85
  onClick={(event) => event.stopPropagation()}
@@ -11,6 +11,7 @@ export const badgeVariants = cva(
11
11
  variant: {
12
12
  solid: "bg-ink text-bg",
13
13
  outline: "border border-line text-ink-2",
14
+ live: "border border-live/30 bg-live/10 text-live",
14
15
  success: "border border-success/30 bg-success/10 text-success",
15
16
  warning: "border border-warning/30 bg-warning/10 text-warning",
16
17
  danger: "border border-danger/30 bg-danger/10 text-danger",
@@ -26,7 +27,7 @@ export const badgeVariants = cva(
26
27
  );
27
28
 
28
29
  export interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {
29
- variant?: "solid" | "outline" | "success" | "warning" | "danger" | "accent";
30
+ variant?: "solid" | "outline" | "live" | "success" | "warning" | "danger" | "accent";
30
31
  size?: "sm" | "md";
31
32
  }
32
33
 
@@ -17,7 +17,7 @@ export interface ButtonProps
17
17
  * Button — primary interactive element.
18
18
  *
19
19
  * - Uses framer-motion for hover/active micro-interactions
20
- * - Pill radius on all variants
20
+ * - Sharp radius (rounded-sm, 3px) on all variants
21
21
  * - `loading` prop shows a spinner and disables
22
22
  *
23
23
  * @example
@@ -26,14 +26,14 @@ export const buttonVariants = cva(
26
26
  variants: {
27
27
  variant: {
28
28
  primary:
29
- // 反色按钮:bg-ink 上用 bg 色作文字(浅色=白、深色=黑),硬编码 text-white 在深色主题下不可读
30
- "bg-ink text-bg hover:shadow-md active:scale-[0.98]",
29
+ // 反色按钮:交互结构挂 accent(v0.8.4 收敛,与 ink 值同),文字用 accent-ink 而非硬编码 text-white
30
+ "bg-accent text-accent-ink hover:shadow-md active:scale-[0.98]",
31
31
  secondary:
32
32
  "border border-line text-ink hover:border-ink hover:bg-surface-2 active:scale-[0.98]",
33
33
  ghost:
34
34
  "text-ink-2 hover:bg-surface-2 hover:text-ink active:scale-[0.98]",
35
35
  danger:
36
- "bg-danger text-white hover:shadow-md active:scale-[0.98]",
36
+ "bg-danger text-accent-ink hover:shadow-md active:scale-[0.98]",
37
37
  },
38
38
  size: {
39
39
  sm: "h-8 px-4 text-xs",
@@ -14,7 +14,7 @@ export const cardVariants = cva(
14
14
  variant: {
15
15
  default: "border-line",
16
16
  interactive:
17
- "border-line hover:border-ink hover:-translate-y-0.5 hover:shadow-[0_8px_24px_rgba(0,0,0,0.08)] cursor-pointer",
17
+ "border-line hover:border-ink hover:-translate-y-0.5 hover:shadow-lg cursor-pointer",
18
18
  surface: "bg-surface border-line",
19
19
  },
20
20
  padding: {
@@ -44,7 +44,7 @@ export function DialogContent({ children, className }: DialogContentProps) {
44
44
  animate={{ opacity: 1 }}
45
45
  exit={{ opacity: 0 }}
46
46
  transition={{ duration: 0.2 }}
47
- className="fixed inset-0 z-50 bg-black/40 backdrop-blur-sm"
47
+ className="fixed inset-0 z-50 bg-ink/40 backdrop-blur-sm"
48
48
  />
49
49
  </DialogPrimitive.Overlay>
50
50
  <DialogPrimitive.Content asChild>
@@ -3,7 +3,7 @@
3
3
  .diff-summary { display: flex; justify-content: space-between; gap: 0.75rem; font-family: var(--font-mono); font-size: 0.625rem; letter-spacing: 0.07em; text-transform: uppercase; color: var(--color-muted); }
4
4
  .diff-summary-stats { display: inline-flex; gap: 0.5rem; }
5
5
  .diff-add-count { color: var(--color-success); font-style: normal; }
6
- .diff-del-count { color: #b03a28; font-style: normal; }
6
+ .diff-del-count { color: var(--color-danger); font-style: normal; }
7
7
  .diff-file { border: 1px solid var(--color-line); border-radius: var(--radius); background: var(--color-surface); overflow: hidden; }
8
8
  .diff-file-head { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; padding: 0.4rem 0.6rem; border-bottom: 1px solid var(--color-line); background: var(--color-surface-strong); }
9
9
  .diff-file-path { font-family: var(--font-mono); font-size: 0.6875rem; color: var(--color-ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@@ -14,9 +14,9 @@
14
14
  .diff-text { padding-left: 0.5rem; white-space: pre-wrap; overflow-wrap: anywhere; }
15
15
  .diff-line.hunk { background: color-mix(in oklab, var(--color-accent-ink) 82%, var(--color-accent)); color: var(--color-accent-strong); }
16
16
  .diff-line.add { background: color-mix(in oklab, var(--color-success) 16%, var(--color-surface)); color: var(--color-ink); }
17
- .diff-line.remove { background: color-mix(in oklab, #b03a28 14%, var(--color-surface)); color: var(--color-ink); }
17
+ .diff-line.remove { background: color-mix(in oklab, var(--color-danger) 14%, var(--color-surface)); color: var(--color-ink); }
18
18
  .diff-line.meta { color: var(--color-muted); background: var(--color-surface); }
19
19
  .diff-line.context { color: var(--color-muted); background: var(--color-surface); }
20
20
  .diff-line.add .diff-gutter { color: var(--color-success); }
21
- .diff-line.remove .diff-gutter { color: #b03a28; }
21
+ .diff-line.remove .diff-gutter { color: var(--color-danger); }
22
22
  .diff-preview { max-height: min(48dvh, 34rem); margin: 0; overflow: auto; padding: 0.75rem; border: 1px solid var(--color-line); background: var(--color-ink); color: var(--color-paper); font-family: var(--font-mono); font-size: 0.65625rem; line-height: 1.7; white-space: pre-wrap; overflow-wrap: anywhere; }
@@ -301,7 +301,7 @@
301
301
  }
302
302
 
303
303
  .why-card.dark .why-card-icon {
304
- border-color: oklch(1 0 0 / 0.2);
304
+ border-color: color-mix(in oklab, var(--color-bg) 20%, transparent);
305
305
  }
306
306
 
307
307
  /* ── Integration chips ── */
@@ -425,6 +425,5 @@
425
425
  .nav-shell.floating .site-nav {
426
426
  border-radius: var(--radius-pill);
427
427
  border-color: transparent;
428
- box-shadow: 0 8px 32px -8px oklch(0.15 0.010 30 / 0.18),
429
- 0 1px 3px oklch(0.15 0.010 30 / 0.06);
428
+ box-shadow: var(--shadow-lg);
430
429
  }
@@ -78,7 +78,7 @@ export function LayoutGrid({ items, className }: LayoutGridProps) {
78
78
  <motion.div
79
79
  layoutId={`layout-card-${activeItem.id}`}
80
80
  onClick={(e) => e.stopPropagation()}
81
- className="relative max-h-[85vh] w-full max-w-2xl overflow-y-auto rounded-xl border border-line bg-bg p-6 shadow-2xl"
81
+ className="relative max-h-[85vh] w-full max-w-2xl overflow-y-auto rounded-xl border border-line bg-bg p-6 shadow-xl"
82
82
  >
83
83
  {/* Close button */}
84
84
  <button
@@ -25,7 +25,7 @@ export interface MagneticButtonProps
25
25
  * layout shift.
26
26
  *
27
27
  * @example
28
- * <MagneticButton className="rounded-full bg-ink px-6 py-3 text-white">
28
+ * <MagneticButton className="rounded-full bg-ink px-6 py-3 text-accent-ink">
29
29
  * 立即开始
30
30
  * </MagneticButton>
31
31
  */
@@ -68,7 +68,7 @@ export function MagneticButton({
68
68
  onMouseLeave={handleMouseLeave}
69
69
  style={{ x: springX, y: springY }}
70
70
  className={cn(
71
- "relative inline-flex cursor-pointer items-center justify-center rounded-full bg-ink px-6 py-3 text-sm font-medium text-white transition-colors hover:bg-ink/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-bg disabled:cursor-not-allowed disabled:opacity-50",
71
+ "relative inline-flex cursor-pointer items-center justify-center rounded-full bg-ink px-6 py-3 text-sm font-medium text-accent-ink transition-colors hover:bg-ink/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-bg disabled:cursor-not-allowed disabled:opacity-50",
72
72
  className
73
73
  )}
74
74
  {...props}
@@ -8,8 +8,8 @@
8
8
  .markdown-body ul, .markdown-body ol { margin: 0.6rem 0; padding-left: 1.35rem; }
9
9
  .markdown-body li { margin: 0.25rem 0; }
10
10
  .markdown-body blockquote { margin: 0.7rem 0; padding-left: 0.9rem; border-left: 3px solid var(--color-ink); color: var(--color-muted); }
11
- .markdown-body a { color: var(--color-accent-strong); text-decoration: underline; text-underline-offset: 2px; }
12
- .markdown-body a:hover { color: var(--color-accent); }
11
+ .markdown-body a { color: var(--color-ink); text-decoration: underline; text-underline-offset: 2px; text-decoration-color: var(--color-ink-3); }
12
+ .markdown-body a:hover { text-decoration-color: var(--color-ink); }
13
13
  .markdown-body code { font-family: var(--font-mono); font-size: 0.82em; padding: 0.12em 0.35em; background: var(--color-surface-strong); border: 1px solid var(--color-line); }
14
14
  .markdown-body table { border-collapse: collapse; margin: 0.8rem 0; width: 100%; font-size: 0.85rem; }
15
15
  .markdown-body th, .markdown-body td { border: 1px solid var(--color-line); padding: 0.4rem 0.6rem; text-align: left; }
@@ -19,19 +19,20 @@
19
19
 
20
20
  .md-codeblock { margin: 0.8rem 0; border: 1px solid var(--color-line); border-radius: var(--radius); overflow: hidden; }
21
21
  .md-codeblock-head { display: flex; align-items: center; justify-content: space-between; padding: 0.35rem 0.6rem; border-bottom: 1px solid var(--color-line); background: var(--color-surface-strong); font-family: var(--font-mono); font-size: 0.625rem; letter-spacing: 0.07em; text-transform: uppercase; color: var(--color-muted); }
22
- .md-copy { border: 0; border-bottom: 1px solid currentColor; background: transparent; color: var(--color-accent-strong); font: inherit; padding: 0; cursor: pointer; }
23
- .md-copy:hover { color: var(--color-accent); }
22
+ .md-copy { border: 0; border-bottom: 1px solid currentColor; background: transparent; color: var(--color-ink-2); font: inherit; padding: 0; cursor: pointer; }
23
+ .md-copy:hover { color: var(--color-ink); }
24
24
  .md-codeblock pre { max-height: 24rem; margin: 0; overflow: auto; padding: 0.75rem; background: var(--color-ink); color: var(--color-paper); font-family: var(--font-mono); font-size: 0.75rem; line-height: 1.65; }
25
25
  .md-codeblock code { font-family: inherit; }
26
26
 
27
- /* hljs 暖墨主题(深底暖字) */
28
- .md-codeblock .hljs-comment, .md-codeblock .hljs-quote { color: #9a9184; font-style: italic; }
29
- .md-codeblock .hljs-keyword, .md-codeblock .hljs-selector-tag, .md-codeblock .hljs-literal { color: #e08a7a; }
30
- .md-codeblock .hljs-string, .md-codeblock .hljs-attr, .md-codeblock .hljs-template-tag { color: #c9b896; }
31
- .md-codeblock .hljs-number, .md-codeblock .hljs-built_in, .md-codeblock .hljs-symbol { color: #d9a05b; }
32
- .md-codeblock .hljs-title, .md-codeblock .hljs-section, .md-codeblock .hljs-function .hljs-title { color: #f2e9d8; }
33
- .md-codeblock .hljs-type, .md-codeblock .hljs-class .hljs-title { color: #e8c4a8; }
34
- .md-codeblock .hljs-variable, .md-codeblock .hljs-template-variable { color: #f2e9d8; }
35
- .md-codeblock .hljs-params { color: #f2e9d8; }
36
- .md-codeblock .hljs-meta, .md-codeblock .hljs-tag { color: #9a9184; }
37
- .md-codeblock .hljs-name { color: #e08a7a; }
27
+ /* hljs 墨骨主题(深底:绿系 + 琥珀 + 中性,与品牌语义色同族)。
28
+ 曾用暖纸时代的暖墨色(#9a9184/#e08a7a…),v0.8.1 换为墨骨配色。 */
29
+ .md-codeblock .hljs-comment, .md-codeblock .hljs-quote { color: #8B8E96; font-style: italic; }
30
+ .md-codeblock .hljs-keyword, .md-codeblock .hljs-selector-tag, .md-codeblock .hljs-literal { color: #5CCE7A; }
31
+ .md-codeblock .hljs-string, .md-codeblock .hljs-attr, .md-codeblock .hljs-template-tag { color: #9FD68C; }
32
+ .md-codeblock .hljs-number, .md-codeblock .hljs-built_in, .md-codeblock .hljs-symbol { color: #E2B868; }
33
+ .md-codeblock .hljs-title, .md-codeblock .hljs-section, .md-codeblock .hljs-function .hljs-title { color: #E9EAEC; }
34
+ .md-codeblock .hljs-type, .md-codeblock .hljs-class .hljs-title { color: #86CE96; }
35
+ .md-codeblock .hljs-variable, .md-codeblock .hljs-template-variable { color: #E9EAEC; }
36
+ .md-codeblock .hljs-params { color: #E9EAEC; }
37
+ .md-codeblock .hljs-meta, .md-codeblock .hljs-tag { color: #8B8E96; }
38
+ .md-codeblock .hljs-name { color: #5CCE7A; }
@@ -8,11 +8,11 @@
8
8
  height: 2.25rem;
9
9
  padding: 0 0.75rem;
10
10
  border-radius: var(--radius-sm, 2px);
11
- border: 1px solid var(--color-line, oklch(0.85 0.02 80));
12
- background: var(--color-bg, oklch(0.97 0.01 80));
11
+ border: 1px solid var(--color-line);
12
+ background: var(--color-bg);
13
13
  font-size: 0.875rem;
14
14
  font-weight: 500;
15
- color: var(--color-ink, oklch(0.2 0.02 80));
15
+ color: var(--color-ink);
16
16
  cursor: pointer;
17
17
  outline: none;
18
18
  transition: border-color 0.15s ease;
@@ -20,15 +20,15 @@
20
20
  }
21
21
 
22
22
  .ms-trigger:hover {
23
- border-color: oklch(0.4 0.02 80 / 0.4);
23
+ border-color: var(--color-ink-3);
24
24
  }
25
25
 
26
26
  .ms-trigger:focus-visible {
27
- border-color: var(--color-ink, oklch(0.2 0.02 80));
27
+ border-color: var(--color-ink);
28
28
  }
29
29
 
30
30
  .ms-trigger-placeholder {
31
- color: var(--color-ink-3, oklch(0.6 0.02 80));
31
+ color: var(--color-ink-3);
32
32
  }
33
33
 
34
34
  .ms-trigger-chevron {
@@ -46,8 +46,8 @@
46
46
  max-height: 28rem;
47
47
  overflow-y: auto;
48
48
  border-radius: var(--radius-sm, 2px);
49
- border: 1px solid var(--color-line, oklch(0.85 0.02 80));
50
- background: var(--color-bg, oklch(0.97 0.01 80));
49
+ border: 1px solid var(--color-line);
50
+ background: var(--color-bg);
51
51
  box-shadow: var(--shadow-xl);
52
52
  padding: 0.25rem;
53
53
  }
@@ -62,7 +62,7 @@
62
62
  align-items: center;
63
63
  gap: 0.5rem;
64
64
  padding: 0.5rem 0.5rem 0.25rem;
65
- border-bottom: 1px solid var(--color-line, oklch(0.85 0.02 80));
65
+ border-bottom: 1px solid var(--color-line);
66
66
  margin-bottom: 0.25rem;
67
67
  }
68
68
 
@@ -70,20 +70,20 @@
70
70
  flex: 1;
71
71
  height: 1.75rem;
72
72
  padding: 0 0.5rem;
73
- border: 1px solid var(--color-line, oklch(0.85 0.02 80));
73
+ border: 1px solid var(--color-line);
74
74
  border-radius: var(--radius-sm, 2px);
75
- background: var(--color-bg, oklch(0.97 0.01 80));
75
+ background: var(--color-bg);
76
76
  font-size: 0.8125rem;
77
- color: var(--color-ink, oklch(0.2 0.02 80));
77
+ color: var(--color-ink);
78
78
  outline: none;
79
79
  }
80
80
 
81
81
  .ms-search-input::placeholder {
82
- color: var(--color-ink-3, oklch(0.6 0.02 80));
82
+ color: var(--color-ink-3);
83
83
  }
84
84
 
85
85
  .ms-search-input:focus {
86
- border-color: var(--color-ink, oklch(0.2 0.02 80));
86
+ border-color: var(--color-ink);
87
87
  }
88
88
 
89
89
  /* Featured section */
@@ -109,12 +109,12 @@
109
109
 
110
110
  .ms-featured-item:hover,
111
111
  .ms-featured-item:focus-visible {
112
- background: var(--color-surface-2, oklch(0.93 0.01 80));
112
+ background: var(--color-surface-2);
113
113
  outline: none;
114
114
  }
115
115
 
116
116
  .ms-featured-item.ms-selected {
117
- background: var(--color-surface-2, oklch(0.93 0.01 80));
117
+ background: var(--color-surface-2);
118
118
  }
119
119
 
120
120
  .ms-featured-icon {
@@ -132,14 +132,14 @@
132
132
  .ms-featured-name {
133
133
  font-size: 0.875rem;
134
134
  font-weight: 500;
135
- color: var(--color-ink, oklch(0.2 0.02 80));
135
+ color: var(--color-ink);
136
136
  line-height: 1.3;
137
137
  }
138
138
 
139
139
  .ms-featured-desc {
140
140
  margin-top: 0.125rem;
141
141
  font-size: 0.75rem;
142
- color: var(--color-ink-2, oklch(0.5 0.02 80));
142
+ color: var(--color-ink-2);
143
143
  line-height: 1.3;
144
144
  }
145
145
 
@@ -153,7 +153,7 @@
153
153
  .ms-separator {
154
154
  margin: 0.375rem 0.5rem;
155
155
  height: 1px;
156
- background: var(--color-line, oklch(0.85 0.02 80));
156
+ background: var(--color-line);
157
157
  }
158
158
 
159
159
  /* Channel group */
@@ -173,15 +173,15 @@
173
173
  font: inherit;
174
174
  font-size: 0.8125rem;
175
175
  font-weight: 500;
176
- color: var(--color-ink-2, oklch(0.5 0.02 80));
176
+ color: var(--color-ink-2);
177
177
  border-radius: var(--radius-sm, 2px);
178
178
  transition: background 0.1s ease, color 0.1s ease;
179
179
  }
180
180
 
181
181
  .ms-channel-trigger:hover,
182
182
  .ms-channel-trigger:focus-visible {
183
- background: var(--color-surface-2, oklch(0.93 0.01 80));
184
- color: var(--color-ink, oklch(0.2 0.02 80));
183
+ background: var(--color-surface-2);
184
+ color: var(--color-ink);
185
185
  outline: none;
186
186
  }
187
187
 
@@ -203,7 +203,7 @@
203
203
 
204
204
  .ms-channel-count {
205
205
  font-size: 0.6875rem;
206
- color: var(--color-ink-3, oklch(0.6 0.02 80));
206
+ color: var(--color-ink-3);
207
207
  font-weight: 400;
208
208
  }
209
209
 
@@ -222,7 +222,7 @@
222
222
  cursor: pointer;
223
223
  font: inherit;
224
224
  font-size: 0.8125rem;
225
- color: var(--color-ink-2, oklch(0.5 0.02 80));
225
+ color: var(--color-ink-2);
226
226
  border-radius: var(--radius-sm, 2px);
227
227
  transition: background 0.1s ease;
228
228
  width: 100%;
@@ -231,13 +231,13 @@
231
231
 
232
232
  .ms-model-item:hover,
233
233
  .ms-model-item:focus-visible {
234
- background: var(--color-surface-2, oklch(0.93 0.01 80));
235
- color: var(--color-ink, oklch(0.2 0.02 80));
234
+ background: var(--color-surface-2);
235
+ color: var(--color-ink);
236
236
  outline: none;
237
237
  }
238
238
 
239
239
  .ms-model-item.ms-selected {
240
- color: var(--color-ink, oklch(0.2 0.02 80));
240
+ color: var(--color-ink);
241
241
  font-weight: 500;
242
242
  }
243
243
 
@@ -262,7 +262,7 @@
262
262
 
263
263
  .ms-model-meta {
264
264
  font-size: 0.6875rem;
265
- color: var(--color-ink-3, oklch(0.6 0.02 80));
265
+ color: var(--color-ink-3);
266
266
  font-weight: 400;
267
267
  flex-shrink: 0;
268
268
  }
@@ -272,5 +272,5 @@
272
272
  padding: 1.5rem 1rem;
273
273
  text-align: center;
274
274
  font-size: 0.8125rem;
275
- color: var(--color-ink-3, oklch(0.6 0.02 80));
275
+ color: var(--color-ink-3);
276
276
  }
@@ -21,7 +21,7 @@ export interface MovingBorderProps {
21
21
  *
22
22
  * Uses CSS `@property --angle` for a smooth rotating light beam around
23
23
  * the border. Based on Aceternity's Moving Border, adapted to zmzai's
24
- * blue accent. Only the border moves — inner content stays static.
24
+ * brand accent (ink since v0.8.3). Only the border moves — inner content stays static.
25
25
  *
26
26
  * @example
27
27
  * <MovingBorder duration={5}>
@@ -49,7 +49,7 @@ export function MultiStepLoader({
49
49
  transition={{ type: "spring", stiffness: 400, damping: 25 }}
50
50
  className="flex h-5 w-5 items-center justify-center rounded-full bg-ink"
51
51
  >
52
- <svg className="h-3 w-3 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="3">
52
+ <svg className="h-3 w-3 text-bg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="3">
53
53
  <polyline points="20 6 9 17 4 12" />
54
54
  </svg>
55
55
  </motion.div>
@@ -33,7 +33,7 @@ export function Notch({ children, visible = false, className, ...props }: NotchP
33
33
  exit={{ y: -60, opacity: 0 }}
34
34
  transition={{ duration: 0.35, ease: [0.16, 1, 0.3, 1] }}
35
35
  className={cn(
36
- "pointer-events-auto flex items-center gap-2 rounded-full border border-line bg-ink px-4 py-2 text-sm text-white shadow-lg",
36
+ "pointer-events-auto flex items-center gap-2 rounded-full border border-line bg-ink px-4 py-2 text-sm text-accent-ink shadow-lg",
37
37
  className
38
38
  )}
39
39
  {...props}
@@ -16,8 +16,8 @@ export interface StickyBannerProps extends HTMLAttributes<HTMLDivElement> {
16
16
 
17
17
  const variantStyles: Record<BannerVariant, string> = {
18
18
  info: "bg-surface text-ink border-line",
19
- warning: "bg-ink text-bg border-ink",
20
- danger: "bg-bg text-ink border-ink border-2",
19
+ warning: "border-warning bg-warning-tint text-warning",
20
+ danger: "border-danger bg-danger-tint text-danger",
21
21
  };
22
22
 
23
23
  /**
@@ -73,7 +73,7 @@ function TimelineItemRow({ item, isLast }: { item: TimelineItem; isLast: boolean
73
73
  <div className="relative z-10 flex-shrink-0 pt-0.5">
74
74
  {status === "done" && (
75
75
  <div className="flex h-3.5 w-3.5 items-center justify-center rounded-full bg-ink">
76
- <svg className="h-2 w-2 text-white" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="2.5">
76
+ <svg className="h-2 w-2 text-bg" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="2.5">
77
77
  <polyline points="10 3 5 8 2 5" />
78
78
  </svg>
79
79
  </div>
@@ -33,7 +33,7 @@ export function ToolCard({ call, sessionIdle = false }: { call: ToolCall; sessio
33
33
  <span className="tool-card-glyph" aria-hidden><Icon name={state.status === "completed" ? "check" : interrupted || state.status === "error" ? "cross" : "chevron-down"} size={12} /></span>
34
34
  <span className="tool-card-label">{title}</span>
35
35
  {(state.status === "error" || interrupted) && <Badge variant="danger" size="sm">失败</Badge>}
36
- {running && !interrupted && <Badge variant="warning" size="sm">运行中</Badge>}
36
+ {running && !interrupted && <Badge variant="live" size="sm">运行中</Badge>}
37
37
  {toolDuration(call) && <span className="tool-card-duration">{toolDuration(call)}</span>}
38
38
  <Icon name="chevron-down" size={12} className={isOpen ? "tool-card-chevron open" : "tool-card-chevron"} />
39
39
  </button>
@@ -36,7 +36,7 @@ export function Tooltip({ children, content, side = "top", className }: TooltipP
36
36
  side={side}
37
37
  sideOffset={6}
38
38
  className={cn(
39
- "z-50 rounded-lg bg-ink px-2.5 py-1.5 text-xs font-medium text-white shadow-md",
39
+ "z-50 rounded-lg bg-ink px-2.5 py-1.5 text-xs font-medium text-accent-ink shadow-md",
40
40
  "data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95",
41
41
  "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
42
42
  className
@@ -16,7 +16,8 @@
16
16
  * v0.1.x 黑白 Monochrome
17
17
  * v0.2~0.5 暖纸 + 印章红
18
18
  * v0.6.x 纯白 + 荧光绿(accent 一色包打天下,装饰过载 → 观感 demo)
19
- * v0.7.0 纯白 + 墨黑结构 + 绿色语义(现行)
19
+ * v0.8.x 纯白 + 墨黑结构 + 绿色语义
20
+ * v0.8.3 品牌色全墨 Monochrome(现行)
20
21
  */
21
22
 
22
23
  @theme {
@@ -46,15 +47,17 @@
46
47
  --color-accent-ink: oklch(1 0 0);
47
48
  --color-accent-strong: oklch(0.09 0.004 265);
48
49
  --color-accent-tint: oklch(0.968 0.002 265);
49
- --color-accent-readable: var(--color-accent);
50
+ --color-accent-readable: var(--color-accent); /* deprecated(v0.6 荧光绿遗迹),新代码直接用 accent */
50
51
 
51
52
  /* ══════════════════════════════════════════════════════
52
- 3. Brand green 品牌资产专用
53
- 只给 favicon / logo / 印章 / 极少数品牌位。
54
- 不承担交互语义,不进按钮、不进边框。
53
+ 3. Brand — 品牌资产专用(v0.8.3 起为全墨 Monochrome)
54
+ 品牌色 = 墨黑:favicon 黑底白云、印章墨印。
55
+ 只给品牌资产位,不承担交互语义,不进按钮、不进边框;
56
+ 语义绿(live / success)是功能色,原样保留。
57
+ 沿革:v0.6 荧光绿 → v0.8.1 草本绿 #1D7729 → v0.8.3 全墨。
55
58
  ══════════════════════════════════════════════════════ */
56
- --color-brand: oklch(0.499 0.14 145); /* 5.67:1 */
57
- --color-brand-tint: oklch(0.955 0.035 145);
59
+ --color-brand: oklch(0.21 0.008 265);
60
+ --color-brand-tint: oklch(0.968 0.002 265);
58
61
 
59
62
  /* ══════════════════════════════════════════════════════
60
63
  4. Semantic — 语义色
@@ -63,6 +66,7 @@
63
66
  对照:v0.6 的荧光绿在白底只有 1.8:1,21 处 text-accent 全部不达标。
64
67
  ══════════════════════════════════════════════════════ */
65
68
  --color-live: oklch(0.499 0.17 145); /* 运行中 / 活跃 · 5.55:1 */
69
+ --color-live-tint: oklch(0.955 0.045 145); /* live 浅底(badge/提示条,与 success-tint 同构) */
66
70
  --color-success: oklch(0.499 0.13 145); /* 成功 · 5.70:1 */
67
71
  --color-success-tint: oklch(0.955 0.035 145);
68
72
  --color-warning: oklch(0.499 0.12 75); /* 告警 · 6.14:1 */
@@ -119,14 +123,15 @@
119
123
  /* ══════════════════════════════════════════════════════
120
124
  9. Motion
121
125
  ══════════════════════════════════════════════════════ */
122
- --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
123
- --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
126
+ --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
127
+ --ease-out-expo: cubic-bezier(0.19, 1, 0.22, 1); /* landing/各站用;v0.8.4 起由包提供 */
128
+ --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
124
129
 
125
130
  /* ══════════════════════════════════════════════════════
126
131
  10. Backward-compat aliases
127
132
  v1 token 名 → v0.7 值,让既有 267 个 class 无需改动。
128
133
  ══════════════════════════════════════════════════════ */
129
- --color-paper: var(--color-bg);
134
+ --color-paper: var(--color-bg); /* deprecated(v1 遗迹),新代码用 --color-bg */
130
135
  --color-muted: var(--color-ink-2);
131
136
  --color-surface-strong: var(--color-surface-2);
132
137
  --animate-dur-fast: 150ms;