@qijenchen/design-system 0.1.0-beta.128 → 0.1.0-beta.129

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.
@@ -9,10 +9,10 @@
9
9
  * 同 AgentLogo 漸層停駐;2026-09-02 對定稿標誌覆核:兩極各落於藍 252-268 /
10
10
  * 青 190-210 家族內 ✓)。
11
11
  * - 內置 24 標誌(AgentLogo 簡化檔自動生效)。
12
- * - 動畫:待機=靜止(常駐邊角鈕,持續呼吸干擾周邊視野);有新訊=招喚態
12
+ * - 動畫:待機=靜止(=標誌 still 態,2026-09-02 全家族統一);有新訊=招喚態
13
13
  * (標誌本體蓄勢,漣漪由邊框光圈代位:35% 拍點自邊框射出 r 21→27、寬 2.5、.35→0);
14
14
  * 懸停=陰影升一級+微放大;皆 --motion-duration-overlay 過場。
15
- * - 減動作:光圈屬常駐位移 loop → prefers-reduced-motion 全停(標誌內部自落待機呼吸)。
15
+ * - 減動作:光圈屬常駐位移 loop → prefers-reduced-motion 全停(標誌內部自回靜止)。
16
16
  */
17
17
  import * as React from 'react';
18
18
  export interface AgentFabProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {
@@ -5,15 +5,16 @@
5
5
  * - 造型:user 提供之黃金比例莫比烏斯 SVG 定稿(內橢圓長短軸比 φ=1.618、軸角 121.717°;
6
6
  * agent-panel.spec.md「AgentLogo」節)。漸層停駐色=品牌資產常數(色相落於 DS 藍 252-268 /
7
7
  * 土耳其藍 190-210 家族;資產內嵌 oklch,非 semantic token — 詳 spec 同節)。
8
- * - 狀態動畫:agent-panel.spec.md「AgentLogo」節(靜止/待機/招喚/思考;一息 3s 家族)。
8
+ * - 狀態動畫:agent-panel.spec.md「AgentLogo」節(靜止/招喚/思考;一息 3s 家族;
9
+ * 2026-09-02 拍板:待機一律靜止,併入 still,無獨立呼吸態)。
9
10
  * - 緩動:--motion-easing-swell / --motion-easing-settle(tokens/motion/motion.css)。
10
11
  * SMIL keySplines 不能吃 CSS var,以下常數為 token 值的逐字鏡像,改 token 必同步此處。
11
- * - 減動作:互動觸發必可停(WCAG 2.3.3);常駐 loop 全停,以待機純透明度呼吸為 fallback
12
- * (非位移動態;agent-panel.spec.md「轉場與減動作」)。
12
+ * - 減動作:互動觸發必可停(WCAG 2.3.3);常駐 loop 全停 → 一律回靜止
13
+ * (agent-panel.spec.md「轉場與減動作」)。
13
14
  */
14
15
  import * as React from 'react';
15
- /** 狀態:still 靜止 / idle 待機 / attract 招喚 / think 思考(=回覆中)。 */
16
- export type AgentLogoState = 'still' | 'idle' | 'attract' | 'think';
16
+ /** 狀態:still 靜止(=待機)/ attract 招喚 / think 思考(=回覆中)。 */
17
+ export type AgentLogoState = 'still' | 'attract' | 'think';
17
18
  export interface AgentLogoProps extends React.SVGAttributes<SVGSVGElement> {
18
19
  /** 動態狀態;預設 still(靜止)。 */
19
20
  state?: AgentLogoState;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-logo.d.ts","sourceRoot":"","sources":["../../../src/components/AgentPanel/agent-logo.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAgE9B,2DAA2D;AAC3D,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAA;AAEnE,MAAM,WAAW,cAAe,SAAQ,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC;IACxE,yBAAyB;IACzB,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,CAAA;IACvC;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,YAUtC;AAwGD,QAAA,MAAM,SAAS,sFA0Nd,CAAA;AAGD,OAAO,EAAE,SAAS,EAAE,CAAA"}
1
+ {"version":3,"file":"agent-logo.d.ts","sourceRoot":"","sources":["../../../src/components/AgentPanel/agent-logo.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAgE9B,qDAAqD;AACrD,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAA;AAE1D,MAAM,WAAW,cAAe,SAAQ,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC;IACxE,yBAAyB;IACzB,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,CAAA;IACvC;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,YAUtC;AAwGD,QAAA,MAAM,SAAS,sFAsMd,CAAA;AAGD,OAAO,EAAE,SAAS,EAAE,CAAA"}
@@ -155,7 +155,7 @@ const AgentLogo = React.forwardRef(
155
155
  const uid = React.useId().replace(/[^a-zA-Z0-9]/g, "");
156
156
  const reduced = usePrefersReducedMotion();
157
157
  const simplified = detail === "simplified" || detail === "auto" && size <= 24;
158
- const effectiveState = reduced && state !== "still" ? "idle" : state;
158
+ const effectiveState = reduced ? "still" : state;
159
159
  const ids = {
160
160
  blue: `${uid}bs`,
161
161
  turq: `${uid}ts`,
@@ -166,8 +166,6 @@ const AgentLogo = React.forwardRef(
166
166
  };
167
167
  const isThink = effectiveState === "think";
168
168
  const isAttract = effectiveState === "attract";
169
- const isIdle = effectiveState === "idle";
170
- const reducedIdle = reduced && state !== "still";
171
169
  const defs = /* @__PURE__ */ jsxs("defs", { children: [
172
170
  /* @__PURE__ */ jsxs(
173
171
  "linearGradient",
@@ -313,22 +311,6 @@ const AgentLogo = React.forwardRef(
313
311
  ] })
314
312
  ] }) })
315
313
  ] });
316
- } else if (isIdle) {
317
- content = /* @__PURE__ */ jsxs("g", { children: [
318
- /* @__PURE__ */ jsx(
319
- "animate",
320
- {
321
- attributeName: "opacity",
322
- values: "1;.75;1",
323
- keyTimes: "0;.5;1",
324
- dur: BREATH_DUR,
325
- repeatCount: "indefinite",
326
- calcMode: "spline",
327
- keySplines: `${SWELL};${SETTLE}`
328
- }
329
- ),
330
- body
331
- ] });
332
314
  } else {
333
315
  content = body;
334
316
  }
@@ -345,7 +327,6 @@ const AgentLogo = React.forwardRef(
345
327
  "aria-label": label,
346
328
  "aria-hidden": label ? void 0 : true,
347
329
  "data-state": effectiveState,
348
- "data-reduced-motion": reducedIdle ? "" : void 0,
349
330
  ...props,
350
331
  children: [
351
332
  defs,
@@ -1 +1 @@
1
- {"version":3,"file":"agent-logo.js","sources":["../../../src/components/AgentPanel/agent-logo.tsx"],"sourcesContent":["/**\n * AgentLogo — 智慧代理標誌與狀態動畫(AgentPanel 家族附屬資產)。\n *\n * ── 消費的 SSOT ──\n * - 造型:user 提供之黃金比例莫比烏斯 SVG 定稿(內橢圓長短軸比 φ=1.618、軸角 121.717°;\n * agent-panel.spec.md「AgentLogo」節)。漸層停駐色=品牌資產常數(色相落於 DS 藍 252-268 /\n * 土耳其藍 190-210 家族;資產內嵌 oklch,非 semantic token — 詳 spec 同節)。\n * - 狀態動畫:agent-panel.spec.md「AgentLogo」節(靜止/待機/招喚/思考;一息 3s 家族)。\n * - 緩動:--motion-easing-swell / --motion-easing-settle(tokens/motion/motion.css)。\n * SMIL keySplines 不能吃 CSS var,以下常數為 token 值的逐字鏡像,改 token 必同步此處。\n * - 減動作:互動觸發必可停(WCAG 2.3.3);常駐 loop 全停,以待機純透明度呼吸為 fallback\n * (非位移動態;agent-panel.spec.md「轉場與減動作」)。\n */\nimport * as React from 'react'\nimport { cn } from '@/lib/utils'\n\n/** 一息 3 秒(標誌狀態動畫家族共用節拍;文字微光 2s 另計 — spec「動畫總表」)。 */\nconst BREATH_DUR = '3s'\n/** = var(--motion-easing-swell) 的 SMIL 鏡像。 */\nconst SWELL = '0.4 0.14 0.3 1'\n/** = var(--motion-easing-settle) 的 SMIL 鏡像。 */\nconst SETTLE = '0.2 0 0.38 0.9'\n\n/* ── 幾何(user 定稿 SVG 逐字;viewBox 0 0 1254 1254,圓心 627) ── */\nconst D_TURQ =\n 'M 635.006,98.806 A 505.300,505.300 0 0 1 732.146,1099.915 C 566.063,1098.281 425.041,927.384 417.637,778.287 A 349.828,216.206 121.717474 1 0 885.536,308.027 C 847.485,198.771 746.887,109.003 635.006,98.806 Z'\nconst D_BLUE =\n 'M 635.006,98.806 A 505.300,505.300 0 1 0 732.146,1099.915 C 566.063,1098.281 425.041,927.384 417.637,778.287 A 349.828,216.206 121.717474 0 1 885.536,308.027 C 847.485,198.771 746.887,109.003 635.006,98.806 Z'\n/** 負空間呼吸(思考態):洞由橢圓變正圓的形變終點(弧端點重參數化,指令結構與原路徑同構)。 */\nconst D_TURQ_ROUND =\n 'M 635.006,98.806 A 505.300,505.300 0 0 1 732.146,1099.915 C 566.063,1098.281 425.041,927.384 419.706,711.508 A 283.017,283.017 121.717474 1 0 862.379,370.696 C 847.485,198.771 746.887,109.003 635.006,98.806 Z'\nconst D_BLUE_ROUND =\n 'M 635.006,98.806 A 505.300,505.300 0 1 0 732.146,1099.915 C 566.063,1098.281 425.041,927.384 419.706,711.508 A 283.017,283.017 121.717474 0 1 862.379,370.696 C 847.485,198.771 746.887,109.003 635.006,98.806 Z'\n\ntype Stop = readonly [number, string, number?]\n/* 完整版(>24):五停駐雙緞帶 + 底面陰影 + 提亮(原稿逐層保留)。 */\nconst BLUE_SURFACE: readonly Stop[] = [\n [0, 'oklch(.72 .15 252)'],\n [0.28, 'oklch(.64 .19 255)'],\n [0.58, 'oklch(.55 .21 260)'],\n [0.82, 'oklch(.42 .21 265)'],\n [1, 'oklch(.35 .19 268)'],\n]\nconst TURQ_SURFACE: readonly Stop[] = [\n [0, 'oklch(.82 .12 190)'],\n [0.3, 'oklch(.76 .12 194)'],\n [0.58, 'oklch(.66 .13 199)'],\n [0.82, 'oklch(.52 .12 205)'],\n [1, 'oklch(.44 .11 210)'],\n]\nconst TURQ_UNDERSIDE: readonly Stop[] = [\n [0, 'oklch(.28 .08 210)', 0.82],\n [0.34, 'oklch(.30 .08 208)', 0.47],\n [0.74, 'oklch(.30 .08 208)', 0],\n]\nconst BLUE_LIFT: readonly Stop[] = [\n [0, 'oklch(.85 .07 235)', 0.3],\n [0.48, 'oklch(.85 .07 235)', 0.1],\n [1, 'oklch(.85 .07 235)', 0],\n]\n/* 簡化版(≤24):去陰影提亮、兩停駐高對比(圖標光學校正慣例;取五停駐頭尾)。 */\nconst BLUE_SIMPLE: readonly Stop[] = [\n [0, 'oklch(.72 .15 252)'],\n [1, 'oklch(.35 .19 268)'],\n]\nconst TURQ_SIMPLE: readonly Stop[] = [\n [0, 'oklch(.82 .12 190)'],\n [1, 'oklch(.44 .11 210)'],\n]\n/* 招喚漣漪:雙色放射盤(內藍→過渡→青→邊緣透明;波色呼應本體兩緞帶色相家族)。 */\nconst WAVE_STOPS: readonly Stop[] = [\n [0, 'oklch(.60 .18 250)', 0.5],\n [0.55, 'oklch(.63 .15 220)', 0.44],\n [0.8, 'oklch(.66 .12 196)', 0.34],\n [1, 'oklch(.66 .12 196)', 0],\n]\n\n/** 狀態:still 靜止 / idle 待機 / attract 招喚 / think 思考(=回覆中)。 */\nexport type AgentLogoState = 'still' | 'idle' | 'attract' | 'think'\n\nexport interface AgentLogoProps extends React.SVGAttributes<SVGSVGElement> {\n /** 動態狀態;預設 still(靜止)。 */\n state?: AgentLogoState\n /** 邊長 px;預設 24。≤24 自動切簡化造型(detail=\"auto\")。 */\n size?: number\n /** 造型細節檔;auto = size ≤ 24 用簡化版(去陰影提亮、兩停駐高對比)。 */\n detail?: 'auto' | 'full' | 'simplified'\n /**\n * 招喚態漣漪;預設 true。AgentFab 置 false(按鈕內放不下漣漪,由邊框光圈代位 —\n * spec「FAB」節),本體蓄勢(脹 1.07+吸氣微亮)不變。\n */\n ripple?: boolean\n /** 無障礙名稱;裝飾用途可省略(將標 aria-hidden)。 */\n label?: string\n}\n\n/**\n * 常駐 loop 遵 prefers-reduced-motion 全停(嚴於 WCAG 2.3.3 條文)。\n * @internal AgentPanel 家族內部共用(AgentFab 光圈同一策略)。\n */\nexport function usePrefersReducedMotion() {\n const [reduced, setReduced] = React.useState(false)\n React.useEffect(() => {\n const query = window.matchMedia('(prefers-reduced-motion: reduce)')\n setReduced(query.matches)\n const onChange = (event: MediaQueryListEvent) => setReduced(event.matches)\n query.addEventListener('change', onChange)\n return () => query.removeEventListener('change', onChange)\n }, [])\n return reduced\n}\n\nfunction GradientStops({ stops }: { stops: readonly Stop[] }) {\n return (\n <>\n {stops.map(([offset, color, opacity]) => (\n <stop\n key={offset}\n offset={offset}\n stopColor={color}\n {...(opacity !== undefined ? { stopOpacity: opacity } : {})}\n />\n ))}\n </>\n )\n}\n\n/** 思考態:色場定錨於畫布 — 漸層以本體旋轉的同構逆轉實現「幾何流過色場」。 */\nfunction GradientCounterSpin() {\n return (\n <>\n <animateTransform\n attributeName=\"gradientTransform\"\n type=\"rotate\"\n values=\"0 627 627;-90 627 627\"\n dur=\"0.3s\"\n begin=\"0s\"\n fill=\"freeze\"\n calcMode=\"spline\"\n keyTimes=\"0;1\"\n keySplines=\"0.6 0 1 1\"\n />\n <animateTransform\n attributeName=\"gradientTransform\"\n type=\"rotate\"\n values=\"-90 627 627;-450 627 627\"\n dur=\"0.6s\"\n begin=\"0.3s\"\n repeatCount=\"indefinite\"\n />\n </>\n )\n}\n\n/** 思考態負空間呼吸:洞橢圓↔正圓,6s 一輪(吸 swell / 吐 settle)。 */\nfunction HoleMorph({ from, round }: { from: string; round: string }) {\n return (\n <animate\n attributeName=\"d\"\n values={`${from};${round};${from}`}\n keyTimes=\"0;.5;1\"\n dur=\"6s\"\n repeatCount=\"indefinite\"\n calcMode=\"spline\"\n keySplines={`${SWELL};${SETTLE}`}\n />\n )\n}\n\ninterface BodyProps {\n ids: Record<'blue' | 'turq' | 'under' | 'lift', string>\n simplified: boolean\n morph: boolean\n}\n\n/** 本體雙緞帶(完整=4 層;簡化=2 層);morph=true 時掛負空間形變。 */\nfunction LogoBody({ ids, simplified, morph }: BodyProps) {\n const turqMorph = morph ? <HoleMorph from={D_TURQ} round={D_TURQ_ROUND} /> : null\n const blueMorph = morph ? <HoleMorph from={D_BLUE} round={D_BLUE_ROUND} /> : null\n return (\n <>\n <path d={D_TURQ} fill={`url(#${ids.turq})`}>{turqMorph}</path>\n {!simplified && (\n <path d={D_TURQ} fill={`url(#${ids.under})`}>{turqMorph}</path>\n )}\n <path d={D_BLUE} fill={`url(#${ids.blue})`}>{blueMorph}</path>\n {!simplified && (\n <path d={D_BLUE} fill={`url(#${ids.lift})`}>{blueMorph}</path>\n )}\n </>\n )\n}\n\n/** 吸氣微亮:白色疊層 0→14%→0(招喚與思考同一套語言;思考與 6s 圓化同拍)。 */\nfunction InhaleOverlay({ morph, dur, keyTimes }: { morph: boolean; dur: string; keyTimes: string }) {\n const turqMorph = morph ? <HoleMorph from={D_TURQ} round={D_TURQ_ROUND} /> : null\n const blueMorph = morph ? <HoleMorph from={D_BLUE} round={D_BLUE_ROUND} /> : null\n return (\n <g opacity=\"0\" pointerEvents=\"none\">\n <animate\n attributeName=\"opacity\"\n values=\"0;.14;0\"\n keyTimes={keyTimes}\n dur={dur}\n repeatCount=\"indefinite\"\n calcMode=\"spline\"\n keySplines={`${SWELL};${SETTLE}`}\n />\n <path d={D_BLUE} fill=\"#fff\">{blueMorph}</path>\n <path d={D_TURQ} fill=\"#fff\">{turqMorph}</path>\n </g>\n )\n}\n\nconst AgentLogo = React.forwardRef<SVGSVGElement, AgentLogoProps>(\n (\n {\n state = 'still',\n size = 24,\n detail = 'auto',\n ripple = true,\n label,\n className,\n style,\n ...props\n },\n ref,\n ) => {\n const uid = React.useId().replace(/[^a-zA-Z0-9]/g, '')\n const reduced = usePrefersReducedMotion()\n const simplified = detail === 'simplified' || (detail === 'auto' && size <= 24)\n /** 減動作:常駐 loop 全停,fallback = 待機純透明度呼吸(非位移)。 */\n const effectiveState: AgentLogoState =\n reduced && state !== 'still' ? 'idle' : state\n const ids = {\n blue: `${uid}bs`,\n turq: `${uid}ts`,\n under: `${uid}tu`,\n lift: `${uid}bl`,\n wave: `${uid}wg`,\n mask: `${uid}wm`,\n }\n const isThink = effectiveState === 'think'\n const isAttract = effectiveState === 'attract'\n const isIdle = effectiveState === 'idle'\n const reducedIdle = reduced && state !== 'still'\n\n const defs = (\n <defs>\n <linearGradient\n id={ids.blue}\n gradientUnits=\"userSpaceOnUse\"\n x1=\"390\"\n y1=\"1055\"\n x2=\"770\"\n y2=\"110\"\n >\n <GradientStops stops={simplified ? BLUE_SIMPLE : BLUE_SURFACE} />\n {isThink && <GradientCounterSpin />}\n </linearGradient>\n <linearGradient\n id={ids.turq}\n gradientUnits=\"userSpaceOnUse\"\n x1=\"990\"\n y1=\"145\"\n x2=\"650\"\n y2=\"1090\"\n >\n <GradientStops stops={simplified ? TURQ_SIMPLE : TURQ_SURFACE} />\n {isThink && <GradientCounterSpin />}\n </linearGradient>\n {!simplified && (\n <>\n <radialGradient\n id={ids.under}\n gradientUnits=\"userSpaceOnUse\"\n cx=\"490\"\n cy=\"815\"\n r=\"520\"\n >\n <GradientStops stops={TURQ_UNDERSIDE} />\n </radialGradient>\n <radialGradient\n id={ids.lift}\n gradientUnits=\"userSpaceOnUse\"\n cx=\"350\"\n cy=\"930\"\n r=\"510\"\n >\n <GradientStops stops={BLUE_LIFT} />\n </radialGradient>\n </>\n )}\n {isAttract && ripple && (\n <>\n <radialGradient id={ids.wave}>\n <GradientStops stops={WAVE_STOPS} />\n </radialGradient>\n <mask id={ids.mask} maskUnits=\"userSpaceOnUse\" x=\"-600\" y=\"-600\" width=\"2454\" height=\"2454\">\n <rect x=\"-600\" y=\"-600\" width=\"2454\" height=\"2454\" fill=\"#fff\" />\n <circle cx=\"627\" cy=\"627\" r=\"512\" fill=\"#000\" />\n </mask>\n </>\n )}\n </defs>\n )\n\n const body = <LogoBody ids={ids} simplified={simplified} morph={isThink} />\n\n let content: React.ReactNode\n if (isThink) {\n // 兩段旋轉:啟動加速 0.3s(ease-in)→ 等速 0.6s/圈(linear=轉圈慣例);\n // 平移座標系內旋轉不得帶圓心(帶了=轉心位移兩倍遠)。結束減速由狀態切換的\n // 0.15s 淡出承接(SMIL loop 無終點,減速檔屬 state-exit,spec「AgentLogo」節)。\n content = (\n <g transform=\"translate(627 627)\">\n <g>\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n values=\"0;90\"\n dur=\"0.3s\"\n begin=\"0s\"\n fill=\"freeze\"\n calcMode=\"spline\"\n keyTimes=\"0;1\"\n keySplines=\"0.6 0 1 1\"\n />\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n values=\"90;450\"\n dur=\"0.6s\"\n begin=\"0.3s\"\n repeatCount=\"indefinite\"\n />\n <g transform=\"translate(-627 -627)\">\n {body}\n <InhaleOverlay morph dur=\"6s\" keyTimes=\"0;.5;1\" />\n </g>\n </g>\n </g>\n )\n } else if (isAttract) {\n // 招喚:蓄勢(本體脹 1.07 + 吸氣微亮)→ 35% 拍點波離體、本體回落同拍。\n content = (\n <>\n {ripple && (\n <g mask={`url(#${ids.mask})`}>\n <circle cx=\"627\" cy=\"627\" r=\"560\" fill={`url(#${ids.wave})`} opacity=\"0\">\n <animate\n attributeName=\"r\"\n values=\"560;560;830\"\n keyTimes=\"0;.35;1\"\n dur={BREATH_DUR}\n repeatCount=\"indefinite\"\n calcMode=\"spline\"\n keySplines={`0 0 1 1;${SETTLE}`}\n />\n <animate\n attributeName=\"opacity\"\n values=\"0;1;0\"\n keyTimes=\"0;.35;1\"\n dur={BREATH_DUR}\n repeatCount=\"indefinite\"\n calcMode=\"spline\"\n keySplines={`0 0 1 1;${SETTLE}`}\n />\n </circle>\n </g>\n )}\n <g transform=\"translate(627 627)\">\n <g>\n <animateTransform\n attributeName=\"transform\"\n type=\"scale\"\n values=\"1;1.07;1\"\n keyTimes=\"0;.35;1\"\n dur={BREATH_DUR}\n repeatCount=\"indefinite\"\n calcMode=\"spline\"\n keySplines={`${SWELL};${SETTLE}`}\n />\n <g transform=\"translate(-627 -627)\">\n {body}\n <InhaleOverlay morph={false} dur={BREATH_DUR} keyTimes=\"0;.35;1\" />\n </g>\n </g>\n </g>\n </>\n )\n } else if (isIdle) {\n // 待機:純透明度呼吸 3s、最低 75%(非位移=減動作安全;亦為減動作 fallback)。\n content = (\n <g>\n <animate\n attributeName=\"opacity\"\n values=\"1;.75;1\"\n keyTimes=\"0;.5;1\"\n dur={BREATH_DUR}\n repeatCount=\"indefinite\"\n calcMode=\"spline\"\n keySplines={`${SWELL};${SETTLE}`}\n />\n {body}\n </g>\n )\n } else {\n content = body\n }\n\n return (\n <svg\n ref={ref}\n width={size}\n height={size}\n viewBox=\"0 0 1254 1254\"\n className={cn('shrink-0', className)}\n // 招喚波以透明度收尾,溢出視窗屬設計(波暈散出標誌框外)。\n style={{ overflow: isAttract && ripple ? 'visible' : undefined, ...style }}\n role={label ? 'img' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n data-state={effectiveState}\n data-reduced-motion={reducedIdle ? '' : undefined}\n {...props}\n >\n {defs}\n {content}\n </svg>\n )\n },\n)\nAgentLogo.displayName = 'AgentLogo'\n\nexport { AgentLogo }\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-logo.js","sources":["../../../src/components/AgentPanel/agent-logo.tsx"],"sourcesContent":["/**\n * AgentLogo — 智慧代理標誌與狀態動畫(AgentPanel 家族附屬資產)。\n *\n * ── 消費的 SSOT ──\n * - 造型:user 提供之黃金比例莫比烏斯 SVG 定稿(內橢圓長短軸比 φ=1.618、軸角 121.717°;\n * agent-panel.spec.md「AgentLogo」節)。漸層停駐色=品牌資產常數(色相落於 DS 藍 252-268 /\n * 土耳其藍 190-210 家族;資產內嵌 oklch,非 semantic token — 詳 spec 同節)。\n * - 狀態動畫:agent-panel.spec.md「AgentLogo」節(靜止/招喚/思考;一息 3s 家族;\n * 2026-09-02 拍板:待機一律靜止,併入 still,無獨立呼吸態)。\n * - 緩動:--motion-easing-swell / --motion-easing-settle(tokens/motion/motion.css)。\n * SMIL keySplines 不能吃 CSS var,以下常數為 token 值的逐字鏡像,改 token 必同步此處。\n * - 減動作:互動觸發必可停(WCAG 2.3.3);常駐 loop 全停 → 一律回靜止\n * (agent-panel.spec.md「轉場與減動作」)。\n */\nimport * as React from 'react'\nimport { cn } from '@/lib/utils'\n\n/** 一息 3 秒(標誌狀態動畫家族共用節拍;文字微光 2s 另計 — spec「動畫總表」)。 */\nconst BREATH_DUR = '3s'\n/** = var(--motion-easing-swell) 的 SMIL 鏡像。 */\nconst SWELL = '0.4 0.14 0.3 1'\n/** = var(--motion-easing-settle) 的 SMIL 鏡像。 */\nconst SETTLE = '0.2 0 0.38 0.9'\n\n/* ── 幾何(user 定稿 SVG 逐字;viewBox 0 0 1254 1254,圓心 627) ── */\nconst D_TURQ =\n 'M 635.006,98.806 A 505.300,505.300 0 0 1 732.146,1099.915 C 566.063,1098.281 425.041,927.384 417.637,778.287 A 349.828,216.206 121.717474 1 0 885.536,308.027 C 847.485,198.771 746.887,109.003 635.006,98.806 Z'\nconst D_BLUE =\n 'M 635.006,98.806 A 505.300,505.300 0 1 0 732.146,1099.915 C 566.063,1098.281 425.041,927.384 417.637,778.287 A 349.828,216.206 121.717474 0 1 885.536,308.027 C 847.485,198.771 746.887,109.003 635.006,98.806 Z'\n/** 負空間呼吸(思考態):洞由橢圓變正圓的形變終點(弧端點重參數化,指令結構與原路徑同構)。 */\nconst D_TURQ_ROUND =\n 'M 635.006,98.806 A 505.300,505.300 0 0 1 732.146,1099.915 C 566.063,1098.281 425.041,927.384 419.706,711.508 A 283.017,283.017 121.717474 1 0 862.379,370.696 C 847.485,198.771 746.887,109.003 635.006,98.806 Z'\nconst D_BLUE_ROUND =\n 'M 635.006,98.806 A 505.300,505.300 0 1 0 732.146,1099.915 C 566.063,1098.281 425.041,927.384 419.706,711.508 A 283.017,283.017 121.717474 0 1 862.379,370.696 C 847.485,198.771 746.887,109.003 635.006,98.806 Z'\n\ntype Stop = readonly [number, string, number?]\n/* 完整版(>24):五停駐雙緞帶 + 底面陰影 + 提亮(原稿逐層保留)。 */\nconst BLUE_SURFACE: readonly Stop[] = [\n [0, 'oklch(.72 .15 252)'],\n [0.28, 'oklch(.64 .19 255)'],\n [0.58, 'oklch(.55 .21 260)'],\n [0.82, 'oklch(.42 .21 265)'],\n [1, 'oklch(.35 .19 268)'],\n]\nconst TURQ_SURFACE: readonly Stop[] = [\n [0, 'oklch(.82 .12 190)'],\n [0.3, 'oklch(.76 .12 194)'],\n [0.58, 'oklch(.66 .13 199)'],\n [0.82, 'oklch(.52 .12 205)'],\n [1, 'oklch(.44 .11 210)'],\n]\nconst TURQ_UNDERSIDE: readonly Stop[] = [\n [0, 'oklch(.28 .08 210)', 0.82],\n [0.34, 'oklch(.30 .08 208)', 0.47],\n [0.74, 'oklch(.30 .08 208)', 0],\n]\nconst BLUE_LIFT: readonly Stop[] = [\n [0, 'oklch(.85 .07 235)', 0.3],\n [0.48, 'oklch(.85 .07 235)', 0.1],\n [1, 'oklch(.85 .07 235)', 0],\n]\n/* 簡化版(≤24):去陰影提亮、兩停駐高對比(圖標光學校正慣例;取五停駐頭尾)。 */\nconst BLUE_SIMPLE: readonly Stop[] = [\n [0, 'oklch(.72 .15 252)'],\n [1, 'oklch(.35 .19 268)'],\n]\nconst TURQ_SIMPLE: readonly Stop[] = [\n [0, 'oklch(.82 .12 190)'],\n [1, 'oklch(.44 .11 210)'],\n]\n/* 招喚漣漪:雙色放射盤(內藍→過渡→青→邊緣透明;波色呼應本體兩緞帶色相家族)。 */\nconst WAVE_STOPS: readonly Stop[] = [\n [0, 'oklch(.60 .18 250)', 0.5],\n [0.55, 'oklch(.63 .15 220)', 0.44],\n [0.8, 'oklch(.66 .12 196)', 0.34],\n [1, 'oklch(.66 .12 196)', 0],\n]\n\n/** 狀態:still 靜止(=待機)/ attract 招喚 / think 思考(=回覆中)。 */\nexport type AgentLogoState = 'still' | 'attract' | 'think'\n\nexport interface AgentLogoProps extends React.SVGAttributes<SVGSVGElement> {\n /** 動態狀態;預設 still(靜止)。 */\n state?: AgentLogoState\n /** 邊長 px;預設 24。≤24 自動切簡化造型(detail=\"auto\")。 */\n size?: number\n /** 造型細節檔;auto = size ≤ 24 用簡化版(去陰影提亮、兩停駐高對比)。 */\n detail?: 'auto' | 'full' | 'simplified'\n /**\n * 招喚態漣漪;預設 true。AgentFab 置 false(按鈕內放不下漣漪,由邊框光圈代位 —\n * spec「FAB」節),本體蓄勢(脹 1.07+吸氣微亮)不變。\n */\n ripple?: boolean\n /** 無障礙名稱;裝飾用途可省略(將標 aria-hidden)。 */\n label?: string\n}\n\n/**\n * 常駐 loop 遵 prefers-reduced-motion 全停(嚴於 WCAG 2.3.3 條文)。\n * @internal AgentPanel 家族內部共用(AgentFab 光圈同一策略)。\n */\nexport function usePrefersReducedMotion() {\n const [reduced, setReduced] = React.useState(false)\n React.useEffect(() => {\n const query = window.matchMedia('(prefers-reduced-motion: reduce)')\n setReduced(query.matches)\n const onChange = (event: MediaQueryListEvent) => setReduced(event.matches)\n query.addEventListener('change', onChange)\n return () => query.removeEventListener('change', onChange)\n }, [])\n return reduced\n}\n\nfunction GradientStops({ stops }: { stops: readonly Stop[] }) {\n return (\n <>\n {stops.map(([offset, color, opacity]) => (\n <stop\n key={offset}\n offset={offset}\n stopColor={color}\n {...(opacity !== undefined ? { stopOpacity: opacity } : {})}\n />\n ))}\n </>\n )\n}\n\n/** 思考態:色場定錨於畫布 — 漸層以本體旋轉的同構逆轉實現「幾何流過色場」。 */\nfunction GradientCounterSpin() {\n return (\n <>\n <animateTransform\n attributeName=\"gradientTransform\"\n type=\"rotate\"\n values=\"0 627 627;-90 627 627\"\n dur=\"0.3s\"\n begin=\"0s\"\n fill=\"freeze\"\n calcMode=\"spline\"\n keyTimes=\"0;1\"\n keySplines=\"0.6 0 1 1\"\n />\n <animateTransform\n attributeName=\"gradientTransform\"\n type=\"rotate\"\n values=\"-90 627 627;-450 627 627\"\n dur=\"0.6s\"\n begin=\"0.3s\"\n repeatCount=\"indefinite\"\n />\n </>\n )\n}\n\n/** 思考態負空間呼吸:洞橢圓↔正圓,6s 一輪(吸 swell / 吐 settle)。 */\nfunction HoleMorph({ from, round }: { from: string; round: string }) {\n return (\n <animate\n attributeName=\"d\"\n values={`${from};${round};${from}`}\n keyTimes=\"0;.5;1\"\n dur=\"6s\"\n repeatCount=\"indefinite\"\n calcMode=\"spline\"\n keySplines={`${SWELL};${SETTLE}`}\n />\n )\n}\n\ninterface BodyProps {\n ids: Record<'blue' | 'turq' | 'under' | 'lift', string>\n simplified: boolean\n morph: boolean\n}\n\n/** 本體雙緞帶(完整=4 層;簡化=2 層);morph=true 時掛負空間形變。 */\nfunction LogoBody({ ids, simplified, morph }: BodyProps) {\n const turqMorph = morph ? <HoleMorph from={D_TURQ} round={D_TURQ_ROUND} /> : null\n const blueMorph = morph ? <HoleMorph from={D_BLUE} round={D_BLUE_ROUND} /> : null\n return (\n <>\n <path d={D_TURQ} fill={`url(#${ids.turq})`}>{turqMorph}</path>\n {!simplified && (\n <path d={D_TURQ} fill={`url(#${ids.under})`}>{turqMorph}</path>\n )}\n <path d={D_BLUE} fill={`url(#${ids.blue})`}>{blueMorph}</path>\n {!simplified && (\n <path d={D_BLUE} fill={`url(#${ids.lift})`}>{blueMorph}</path>\n )}\n </>\n )\n}\n\n/** 吸氣微亮:白色疊層 0→14%→0(招喚與思考同一套語言;思考與 6s 圓化同拍)。 */\nfunction InhaleOverlay({ morph, dur, keyTimes }: { morph: boolean; dur: string; keyTimes: string }) {\n const turqMorph = morph ? <HoleMorph from={D_TURQ} round={D_TURQ_ROUND} /> : null\n const blueMorph = morph ? <HoleMorph from={D_BLUE} round={D_BLUE_ROUND} /> : null\n return (\n <g opacity=\"0\" pointerEvents=\"none\">\n <animate\n attributeName=\"opacity\"\n values=\"0;.14;0\"\n keyTimes={keyTimes}\n dur={dur}\n repeatCount=\"indefinite\"\n calcMode=\"spline\"\n keySplines={`${SWELL};${SETTLE}`}\n />\n <path d={D_BLUE} fill=\"#fff\">{blueMorph}</path>\n <path d={D_TURQ} fill=\"#fff\">{turqMorph}</path>\n </g>\n )\n}\n\nconst AgentLogo = React.forwardRef<SVGSVGElement, AgentLogoProps>(\n (\n {\n state = 'still',\n size = 24,\n detail = 'auto',\n ripple = true,\n label,\n className,\n style,\n ...props\n },\n ref,\n ) => {\n const uid = React.useId().replace(/[^a-zA-Z0-9]/g, '')\n const reduced = usePrefersReducedMotion()\n const simplified = detail === 'simplified' || (detail === 'auto' && size <= 24)\n /** 減動作:常駐 loop 全停,一律回靜止。 */\n const effectiveState: AgentLogoState = reduced ? 'still' : state\n const ids = {\n blue: `${uid}bs`,\n turq: `${uid}ts`,\n under: `${uid}tu`,\n lift: `${uid}bl`,\n wave: `${uid}wg`,\n mask: `${uid}wm`,\n }\n const isThink = effectiveState === 'think'\n const isAttract = effectiveState === 'attract'\n\n const defs = (\n <defs>\n <linearGradient\n id={ids.blue}\n gradientUnits=\"userSpaceOnUse\"\n x1=\"390\"\n y1=\"1055\"\n x2=\"770\"\n y2=\"110\"\n >\n <GradientStops stops={simplified ? BLUE_SIMPLE : BLUE_SURFACE} />\n {isThink && <GradientCounterSpin />}\n </linearGradient>\n <linearGradient\n id={ids.turq}\n gradientUnits=\"userSpaceOnUse\"\n x1=\"990\"\n y1=\"145\"\n x2=\"650\"\n y2=\"1090\"\n >\n <GradientStops stops={simplified ? TURQ_SIMPLE : TURQ_SURFACE} />\n {isThink && <GradientCounterSpin />}\n </linearGradient>\n {!simplified && (\n <>\n <radialGradient\n id={ids.under}\n gradientUnits=\"userSpaceOnUse\"\n cx=\"490\"\n cy=\"815\"\n r=\"520\"\n >\n <GradientStops stops={TURQ_UNDERSIDE} />\n </radialGradient>\n <radialGradient\n id={ids.lift}\n gradientUnits=\"userSpaceOnUse\"\n cx=\"350\"\n cy=\"930\"\n r=\"510\"\n >\n <GradientStops stops={BLUE_LIFT} />\n </radialGradient>\n </>\n )}\n {isAttract && ripple && (\n <>\n <radialGradient id={ids.wave}>\n <GradientStops stops={WAVE_STOPS} />\n </radialGradient>\n <mask id={ids.mask} maskUnits=\"userSpaceOnUse\" x=\"-600\" y=\"-600\" width=\"2454\" height=\"2454\">\n <rect x=\"-600\" y=\"-600\" width=\"2454\" height=\"2454\" fill=\"#fff\" />\n <circle cx=\"627\" cy=\"627\" r=\"512\" fill=\"#000\" />\n </mask>\n </>\n )}\n </defs>\n )\n\n const body = <LogoBody ids={ids} simplified={simplified} morph={isThink} />\n\n let content: React.ReactNode\n if (isThink) {\n // 兩段旋轉:啟動加速 0.3s(ease-in)→ 等速 0.6s/圈(linear=轉圈慣例);\n // 平移座標系內旋轉不得帶圓心(帶了=轉心位移兩倍遠)。結束減速由狀態切換的\n // 0.15s 淡出承接(SMIL loop 無終點,減速檔屬 state-exit,spec「AgentLogo」節)。\n content = (\n <g transform=\"translate(627 627)\">\n <g>\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n values=\"0;90\"\n dur=\"0.3s\"\n begin=\"0s\"\n fill=\"freeze\"\n calcMode=\"spline\"\n keyTimes=\"0;1\"\n keySplines=\"0.6 0 1 1\"\n />\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n values=\"90;450\"\n dur=\"0.6s\"\n begin=\"0.3s\"\n repeatCount=\"indefinite\"\n />\n <g transform=\"translate(-627 -627)\">\n {body}\n <InhaleOverlay morph dur=\"6s\" keyTimes=\"0;.5;1\" />\n </g>\n </g>\n </g>\n )\n } else if (isAttract) {\n // 招喚:蓄勢(本體脹 1.07 + 吸氣微亮)→ 35% 拍點波離體、本體回落同拍。\n content = (\n <>\n {ripple && (\n <g mask={`url(#${ids.mask})`}>\n <circle cx=\"627\" cy=\"627\" r=\"560\" fill={`url(#${ids.wave})`} opacity=\"0\">\n <animate\n attributeName=\"r\"\n values=\"560;560;830\"\n keyTimes=\"0;.35;1\"\n dur={BREATH_DUR}\n repeatCount=\"indefinite\"\n calcMode=\"spline\"\n keySplines={`0 0 1 1;${SETTLE}`}\n />\n <animate\n attributeName=\"opacity\"\n values=\"0;1;0\"\n keyTimes=\"0;.35;1\"\n dur={BREATH_DUR}\n repeatCount=\"indefinite\"\n calcMode=\"spline\"\n keySplines={`0 0 1 1;${SETTLE}`}\n />\n </circle>\n </g>\n )}\n <g transform=\"translate(627 627)\">\n <g>\n <animateTransform\n attributeName=\"transform\"\n type=\"scale\"\n values=\"1;1.07;1\"\n keyTimes=\"0;.35;1\"\n dur={BREATH_DUR}\n repeatCount=\"indefinite\"\n calcMode=\"spline\"\n keySplines={`${SWELL};${SETTLE}`}\n />\n <g transform=\"translate(-627 -627)\">\n {body}\n <InhaleOverlay morph={false} dur={BREATH_DUR} keyTimes=\"0;.35;1\" />\n </g>\n </g>\n </g>\n </>\n )\n } else {\n content = body\n }\n\n return (\n <svg\n ref={ref}\n width={size}\n height={size}\n viewBox=\"0 0 1254 1254\"\n className={cn('shrink-0', className)}\n // 招喚波以透明度收尾,溢出視窗屬設計(波暈散出標誌框外)。\n style={{ overflow: isAttract && ripple ? 'visible' : undefined, ...style }}\n role={label ? 'img' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n data-state={effectiveState}\n {...props}\n >\n {defs}\n {content}\n </svg>\n )\n },\n)\nAgentLogo.displayName = 'AgentLogo'\n\nexport { AgentLogo }\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
3
  import { cva } from "class-variance-authority";
4
- import { cn, lineClampClass } from "../../lib/utils.js";
4
+ import { lineClampClass, cn } from "../../lib/utils.js";
5
5
  import { Avatar } from "../../components/Avatar/avatar.js";
6
6
  import { Tooltip, TooltipTrigger, TooltipContent } from "../../components/Tooltip/tooltip.js";
7
7
  import { useTruncated } from "../../hooks/use-truncated.js";
@@ -3,8 +3,8 @@
3
3
  "schemaVersion": 1,
4
4
  "role": "template-consumer",
5
5
  "release": {
6
- "designSystem": "0.1.0-beta.128",
7
- "storybookConfig": "0.1.0-beta.128"
6
+ "designSystem": "0.1.0-beta.129",
7
+ "storybookConfig": "0.1.0-beta.129"
8
8
  },
9
9
  "upgradeTrust": {
10
10
  "schemaVersion": 1,
@@ -42,10 +42,10 @@
42
42
  "implementationSha256": "98b74118fb5b410b77ad2994aa9105fa7609c7353822f8c5213cce54d94f0af4"
43
43
  },
44
44
  "payload": {
45
- "forkCorpusLockSha256": "02031a3674be6ea3e23788f50e46e34d153835b6629c465e9a703d9551164a56",
45
+ "forkCorpusLockSha256": "2ca4ea485571f545510862fe390ee07dba5a4663ccd947ab2cedbb361fcfa4d8",
46
46
  "discoveryPolicySha256": "fba289aeeb5a3f11139b9589f7ab08b5e8c8799c7bdf8f0ea57ebfeb8e7c9da6",
47
47
  "providerMaterializersSha256": "732e85b01a12e7dd19469e26e4427f0e0cfe5117a78fc9f69c2f0f89702f463a",
48
- "providerLifecycleSha256": "12cf4177f299738d6e506831cf1cf308ff45dbdf5fd9a378b6d4909279e6062a",
48
+ "providerLifecycleSha256": "22e4a16134551fc7f776ff9fa4a6caf4abcd2db9edf931dab3cc61141de58211",
49
49
  "providerInventorySha256": "00adf1c4f6b3367055a9cc3fdfe658660771b4c9931f696e12761a95076ad92c",
50
50
  "executionRuntimeSha256": "d9377cc45308731f287d7b1711b7c38fc4e02ff8f84729bcbbf01bb52d136904",
51
51
  "commonInstructionSha256": "a72c51a412d6cdb3961d691744013c8362e826626a330cecf4a296a6f4d93a5c",
@@ -919,7 +919,7 @@
919
919
  {
920
920
  "schemaVersion": 1,
921
921
  "file": "manifest.json",
922
- "sha256": "308b3f0de26939f530cbacbe201c4def0e6876801bfe89e6418da23dd182dc3f",
922
+ "sha256": "a0c30644b02234c55c614a8f7113c4ddba6563f14e15d790cdab63f2c4c06a09",
923
923
  "source": null,
924
924
  "classification": null,
925
925
  "destination": null
@@ -104,20 +104,20 @@
104
104
  },
105
105
  "providerLifecycle": {
106
106
  "schemaVersion": 4,
107
- "releaseVersion": "0.1.0-beta.128",
107
+ "releaseVersion": "0.1.0-beta.129",
108
108
  "immutableHead": {
109
109
  "providerInventorySha256": "86e9d0668cb54ad1bf05c36e78b4aa80417d5f468c929dd3ddcf69c1afbf32e4",
110
- "releaseVersion": "0.1.0-beta.127",
111
- "snapshotSha256": "db090bbade9053d293f0847b8861e2187ea1b1c321ad0e4ca7e59a68aa897095"
110
+ "releaseVersion": "0.1.0-beta.128",
111
+ "snapshotSha256": "99b83561efad3673d4136863b20f82cf7144deaba082f4d32cc05910471c1ef1"
112
112
  },
113
- "ledgerSha256": "6f397513724e58d8c9b16144f5d967793dfcbfe73f1eaba878e50a42a5feffb2",
114
- "previousSnapshotSha256": "db090bbade9053d293f0847b8861e2187ea1b1c321ad0e4ca7e59a68aa897095",
115
- "currentSnapshotSha256": "99b83561efad3673d4136863b20f82cf7144deaba082f4d32cc05910471c1ef1",
113
+ "ledgerSha256": "47a08ae48e9f496a7de4beb1bd023d8bbe6c53c1300013be3c829b0462422a57",
114
+ "previousSnapshotSha256": "99b83561efad3673d4136863b20f82cf7144deaba082f4d32cc05910471c1ef1",
115
+ "currentSnapshotSha256": "b0e2a74eae5a7723a0c62c52de8a7de412b79ddc28c9ef4655c7090db6c52466",
116
116
  "currentProviderInventorySha256": "86e9d0668cb54ad1bf05c36e78b4aa80417d5f468c929dd3ddcf69c1afbf32e4",
117
117
  "retiredProviders": [],
118
118
  "currentSnapshot": {
119
- "releaseVersion": "0.1.0-beta.128",
120
- "previousSnapshotSha256": "db090bbade9053d293f0847b8861e2187ea1b1c321ad0e4ca7e59a68aa897095",
119
+ "releaseVersion": "0.1.0-beta.129",
120
+ "previousSnapshotSha256": "99b83561efad3673d4136863b20f82cf7144deaba082f4d32cc05910471c1ef1",
121
121
  "providers": [
122
122
  {
123
123
  "id": "claude",
@@ -193,8 +193,8 @@
193
193
  "retiredProviders": []
194
194
  },
195
195
  "immutableHeadSnapshot": {
196
- "releaseVersion": "0.1.0-beta.127",
197
- "previousSnapshotSha256": "d6733118fa2660394b5c74e6457893a3b13bb662d07b5e6058d8e1ce2e36cf8a",
196
+ "releaseVersion": "0.1.0-beta.128",
197
+ "previousSnapshotSha256": "db090bbade9053d293f0847b8861e2187ea1b1c321ad0e4ca7e59a68aa897095",
198
198
  "providers": [
199
199
  {
200
200
  "id": "claude",
@@ -7,7 +7,7 @@
7
7
  "scripts/composition-fidelity-visual-diff.mjs",
8
8
  "product-workspace apps/template/src/AllDsComponents.stories.tsx (ImportSmoke portal → DS Storybook link)"
9
9
  ],
10
- "generatedAt": "2026-09-01T20:12:47.868Z"
10
+ "generatedAt": "2026-09-02T00:54:47.634Z"
11
11
  },
12
12
  "components": {
13
13
  "accordion": {
@@ -72,7 +72,9 @@
72
72
  ],
73
73
  "設計規格": [
74
74
  "design-system-components-agentpanel-設計規格--overview",
75
- "design-system-components-agentpanel-設計規格--logo-size-ladder"
75
+ "design-system-components-agentpanel-設計規格--logo-size-ladder",
76
+ "design-system-components-agentpanel-設計規格--state-behavior",
77
+ "design-system-components-agentpanel-設計規格--accessibility"
76
78
  ],
77
79
  "設計原則": [
78
80
  "design-system-components-agentpanel-設計原則--usage-guidance"
@@ -1780,5 +1782,5 @@
1780
1782
  }
1781
1783
  },
1782
1784
  "totalComponents": 66,
1783
- "totalStories": 957
1785
+ "totalStories": 959
1784
1786
  }
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "type": "git",
5
5
  "url": "git+https://github.com/ajenchen/design-system.git"
6
6
  },
7
- "version": "0.1.0-beta.128",
7
+ "version": "0.1.0-beta.129",
8
8
  "private": false,
9
9
  "description": "World-class design system — components, patterns, tokens, hooks (single source of truth for team distribution).",
10
10
  "type": "module",
@@ -9,10 +9,10 @@
9
9
  * 同 AgentLogo 漸層停駐;2026-09-02 對定稿標誌覆核:兩極各落於藍 252-268 /
10
10
  * 青 190-210 家族內 ✓)。
11
11
  * - 內置 24 標誌(AgentLogo 簡化檔自動生效)。
12
- * - 動畫:待機=靜止(常駐邊角鈕,持續呼吸干擾周邊視野);有新訊=招喚態
12
+ * - 動畫:待機=靜止(=標誌 still 態,2026-09-02 全家族統一);有新訊=招喚態
13
13
  * (標誌本體蓄勢,漣漪由邊框光圈代位:35% 拍點自邊框射出 r 21→27、寬 2.5、.35→0);
14
14
  * 懸停=陰影升一級+微放大;皆 --motion-duration-overlay 過場。
15
- * - 減動作:光圈屬常駐位移 loop → prefers-reduced-motion 全停(標誌內部自落待機呼吸)。
15
+ * - 減動作:光圈屬常駐位移 loop → prefers-reduced-motion 全停(標誌內部自回靜止)。
16
16
  */
17
17
  import * as React from 'react'
18
18
  import { cn } from '@/lib/utils'
@@ -5,11 +5,12 @@
5
5
  * - 造型:user 提供之黃金比例莫比烏斯 SVG 定稿(內橢圓長短軸比 φ=1.618、軸角 121.717°;
6
6
  * agent-panel.spec.md「AgentLogo」節)。漸層停駐色=品牌資產常數(色相落於 DS 藍 252-268 /
7
7
  * 土耳其藍 190-210 家族;資產內嵌 oklch,非 semantic token — 詳 spec 同節)。
8
- * - 狀態動畫:agent-panel.spec.md「AgentLogo」節(靜止/待機/招喚/思考;一息 3s 家族)。
8
+ * - 狀態動畫:agent-panel.spec.md「AgentLogo」節(靜止/招喚/思考;一息 3s 家族;
9
+ * 2026-09-02 拍板:待機一律靜止,併入 still,無獨立呼吸態)。
9
10
  * - 緩動:--motion-easing-swell / --motion-easing-settle(tokens/motion/motion.css)。
10
11
  * SMIL keySplines 不能吃 CSS var,以下常數為 token 值的逐字鏡像,改 token 必同步此處。
11
- * - 減動作:互動觸發必可停(WCAG 2.3.3);常駐 loop 全停,以待機純透明度呼吸為 fallback
12
- * (非位移動態;agent-panel.spec.md「轉場與減動作」)。
12
+ * - 減動作:互動觸發必可停(WCAG 2.3.3);常駐 loop 全停 → 一律回靜止
13
+ * (agent-panel.spec.md「轉場與減動作」)。
13
14
  */
14
15
  import * as React from 'react'
15
16
  import { cn } from '@/lib/utils'
@@ -75,8 +76,8 @@ const WAVE_STOPS: readonly Stop[] = [
75
76
  [1, 'oklch(.66 .12 196)', 0],
76
77
  ]
77
78
 
78
- /** 狀態:still 靜止 / idle 待機 / attract 招喚 / think 思考(=回覆中)。 */
79
- export type AgentLogoState = 'still' | 'idle' | 'attract' | 'think'
79
+ /** 狀態:still 靜止(=待機)/ attract 招喚 / think 思考(=回覆中)。 */
80
+ export type AgentLogoState = 'still' | 'attract' | 'think'
80
81
 
81
82
  export interface AgentLogoProps extends React.SVGAttributes<SVGSVGElement> {
82
83
  /** 動態狀態;預設 still(靜止)。 */
@@ -229,9 +230,8 @@ const AgentLogo = React.forwardRef<SVGSVGElement, AgentLogoProps>(
229
230
  const uid = React.useId().replace(/[^a-zA-Z0-9]/g, '')
230
231
  const reduced = usePrefersReducedMotion()
231
232
  const simplified = detail === 'simplified' || (detail === 'auto' && size <= 24)
232
- /** 減動作:常駐 loop 全停,fallback = 待機純透明度呼吸(非位移)。 */
233
- const effectiveState: AgentLogoState =
234
- reduced && state !== 'still' ? 'idle' : state
233
+ /** 減動作:常駐 loop 全停,一律回靜止。 */
234
+ const effectiveState: AgentLogoState = reduced ? 'still' : state
235
235
  const ids = {
236
236
  blue: `${uid}bs`,
237
237
  turq: `${uid}ts`,
@@ -242,8 +242,6 @@ const AgentLogo = React.forwardRef<SVGSVGElement, AgentLogoProps>(
242
242
  }
243
243
  const isThink = effectiveState === 'think'
244
244
  const isAttract = effectiveState === 'attract'
245
- const isIdle = effectiveState === 'idle'
246
- const reducedIdle = reduced && state !== 'still'
247
245
 
248
246
  const defs = (
249
247
  <defs>
@@ -389,22 +387,6 @@ const AgentLogo = React.forwardRef<SVGSVGElement, AgentLogoProps>(
389
387
  </g>
390
388
  </>
391
389
  )
392
- } else if (isIdle) {
393
- // 待機:純透明度呼吸 3s、最低 75%(非位移=減動作安全;亦為減動作 fallback)。
394
- content = (
395
- <g>
396
- <animate
397
- attributeName="opacity"
398
- values="1;.75;1"
399
- keyTimes="0;.5;1"
400
- dur={BREATH_DUR}
401
- repeatCount="indefinite"
402
- calcMode="spline"
403
- keySplines={`${SWELL};${SETTLE}`}
404
- />
405
- {body}
406
- </g>
407
- )
408
390
  } else {
409
391
  content = body
410
392
  }
@@ -422,7 +404,6 @@ const AgentLogo = React.forwardRef<SVGSVGElement, AgentLogoProps>(
422
404
  aria-label={label}
423
405
  aria-hidden={label ? undefined : true}
424
406
  data-state={effectiveState}
425
- data-reduced-motion={reducedIdle ? '' : undefined}
426
407
  {...props}
427
408
  >
428
409
  {defs}
@@ -1,3 +1,4 @@
1
+ // @anatomy-rationale: Inspector + ColorMatrix + SizeMatrix N/A — 家族無視覺 variant/size 軸(全由消費的 primitive/token 決定;spec「邊界案例 scope」hasVariants=false/hasSizes=false),幾何規格由 Overview 標註;StateBehavior 與 Accessibility 見下。
1
2
  // 設計規格層:結構解剖 + 幾何規格(輪距/內距/尺寸);動態行為見展示層。
2
3
  import type { Meta, StoryObj } from '@storybook/react'
3
4
  import {
@@ -9,6 +10,7 @@ import {
9
10
  AgentPromptInput,
10
11
  } from './agent-panel'
11
12
  import { AgentLogo } from './agent-logo'
13
+ import { AgentThinking } from './agent-panel'
12
14
 
13
15
  const meta: Meta<typeof AgentPanel> = {
14
16
  title: 'Design System/Components/AgentPanel/設計規格',
@@ -20,6 +22,7 @@ type Story = StoryObj<typeof AgentPanel>
20
22
 
21
23
  /** Overview:三段 anatomy(Header / Conversation flex-1 / PromptInput)+ 左緣分隔線。 */
22
24
  export const Overview: Story = {
25
+ name: '元件總覽',
23
26
  render: () => (
24
27
  <div className="flex h-dvh justify-end bg-surface-sunken">
25
28
  <AgentPanel>
@@ -45,6 +48,7 @@ export const Overview: Story = {
45
48
 
46
49
  /** 標誌尺寸階:16/24(簡化)vs 32/48(完整)— 光學校正分檔。 */
47
50
  export const LogoSizeLadder: Story = {
51
+ name: '標誌尺寸階',
48
52
  render: () => (
49
53
  <div className="flex items-end gap-8 p-12">
50
54
  {[16, 24, 32, 48].map((size) => (
@@ -59,3 +63,62 @@ export const LogoSizeLadder: Story = {
59
63
  </div>
60
64
  ),
61
65
  }
66
+
67
+ /** StateBehavior:思考塊進行中/完成、工具列常駐/懸停、送出↔停止——家族互動狀態一覽。 */
68
+ export const StateBehavior: Story = {
69
+ name: '狀態行為',
70
+ render: () => (
71
+ <div className="flex flex-col gap-8 p-8 text-body">
72
+ <div className="flex gap-12">
73
+ <div className="w-72">
74
+ <div className="mb-2 text-caption text-fg-muted">思考塊:進行中(標題+最新行微光、自動展開)</div>
75
+ <AgentThinking thinking steps={[<span key="1">已讀取 48 筆待辦</span>]} currentStep={<span>正在標記衝突項目…</span>} />
76
+ </div>
77
+ <div className="w-72">
78
+ <div className="mb-2 text-caption text-fg-muted">思考塊:完成(靜態、自動收合、標題換字)</div>
79
+ <AgentThinking steps={[<span key="1">已讀取 48 筆待辦</span>, <span key="2">比對排程規則 12 條</span>]} />
80
+ </div>
81
+ </div>
82
+ <div className="flex gap-12">
83
+ <div className="relative w-72 pb-10">
84
+ <div className="mb-2 text-caption text-fg-muted">工具列:代理最後一則=常駐</div>
85
+ <AgentMessage role="agent" toolbar={<AgentToolbar pinned onCopy={() => {}} onLike={() => {}} onDislike={() => {}} />}>最後一則回覆。</AgentMessage>
86
+ </div>
87
+ <div className="relative w-72 pb-10">
88
+ <div className="mb-2 text-caption text-fg-muted">工具列:其他訊息=懸停淡入(移入看)</div>
89
+ <AgentMessage role="agent" toolbar={<AgentToolbar onCopy={() => {}} onLike={() => {}} onDislike={() => {}} />}>較早的回覆。</AgentMessage>
90
+ </div>
91
+ </div>
92
+ <div className="flex gap-12">
93
+ <div className="w-80">
94
+ <div className="mb-2 text-caption text-fg-muted">送出(有內容可按)</div>
95
+ <AgentPromptInput value="幫我整理" onValueChange={() => {}} />
96
+ </div>
97
+ <div className="w-80">
98
+ <div className="mb-2 text-caption text-fg-muted">停止(代理進行中同位換實心正方)</div>
99
+ <AgentPromptInput value="" onValueChange={() => {}} busy onStop={() => {}} />
100
+ </div>
101
+ </div>
102
+ </div>
103
+ ),
104
+ }
105
+
106
+ /** Accessibility:家族 ARIA 角色與鍵盤約定一覽(規格 spec「Loading / 無障礙預設」節)。 */
107
+ export const Accessibility: Story = {
108
+ name: '無障礙與鍵盤',
109
+ render: () => (
110
+ <table className="text-body [&_td]:px-3 [&_td]:py-1 [&_th]:px-3 [&_th]:py-1 [&_th]:text-left [&_th]:font-medium">
111
+ <thead><tr><th>元件</th><th>角色 / 屬性</th><th>鍵盤</th></tr></thead>
112
+ <tbody>
113
+ <tr><td>AgentPanel</td><td>role=complementary + aria-label</td><td>開啟時焦點入 header</td></tr>
114
+ <tr><td>AgentPanelHeader chevron</td><td>aria-haspopup=menu + aria-expanded</td><td>Enter/Space 開歷史浮層;方向鍵走列</td></tr>
115
+ <tr><td>AgentConversation</td><td>role=log + aria-live=polite</td><td>—</td></tr>
116
+ <tr><td>AgentThinking</td><td>button + aria-expanded(內文不另設 aria-live)</td><td>Enter/Space 開合</td></tr>
117
+ <tr><td>AgentToolbar</td><td>各鈕 aria-label</td><td>Tab 逐鈕;focus-within 常駐顯示</td></tr>
118
+ <tr><td>AgentPromptInput</td><td>textarea aria-label=訊息;停止態 aria-label=停止生成</td><td>Enter 送出、Shift+Enter 換行</td></tr>
119
+ <tr><td>AgentDecisionCard</td><td>role=group + aria-labelledby;radiogroup 原生</td><td>方向鍵選項;無 Esc(阻擋語意)</td></tr>
120
+ <tr><td>AgentLogo / AgentFab</td><td>label 有→role=img;無→aria-hidden;FAB aria-label=開啟智慧代理</td><td>減動作:常駐 loop 全停回靜止</td></tr>
121
+ </tbody>
122
+ </table>
123
+ ),
124
+ }
@@ -8,6 +8,7 @@ const meta: Meta = {
8
8
  export default meta
9
9
 
10
10
  export const UsageGuidance: StoryObj = {
11
+ name: '使用指引',
11
12
  render: () => (
12
13
  <article className="max-w-2xl space-y-6 text-body text-foreground">
13
14
  <section>
@@ -30,8 +31,8 @@ export const UsageGuidance: StoryObj = {
30
31
  <section>
31
32
  <h3 className="text-body-lg font-medium">動態紀律</h3>
32
33
  <ul className="mt-2 list-disc space-y-1 pl-5 text-fg-secondary">
33
- <li>標誌四態(靜止/待機/招喚/思考)定義唯一住所=agent-panel.spec.md AgentLogo 節;禁另立本體語言。</li>
34
- <li>常駐 loop 遵 prefers-reduced-motion 全停;fallback=待機純透明度呼吸。</li>
34
+ <li>標誌三態(靜止=待機/招喚/思考)定義唯一住所=agent-panel.spec.md AgentLogo 節;禁另立本體語言。</li>
35
+ <li>常駐 loop 遵 prefers-reduced-motion 全停,一律回靜止。</li>
35
36
  </ul>
36
37
  </section>
37
38
  </article>
@@ -80,7 +80,7 @@ SMIL keySplines 無法消費 CSS var,`agent-logo.tsx` 內常數為 swell/settle
80
80
 
81
81
  ### 3. AgentConversation(訊息卷軸區)
82
82
 
83
- - `flex-1 overflow-y-auto`;內距 16(--layout-space-loose);**輪距 40**(我方↔代理)=
83
+ - ScrollArea(跨 OS 一致捲軸;Dialog body 同法)包 `flex-1`;內距 16(--layout-space-loose);**輪距 40**(我方↔代理)=
84
84
  8+24(工具列 xs 高)+8,工具列絕對定位於輪距內,出現不推擠。
85
85
  - A11y:`role="log"` + `aria-live="polite"`。
86
86
 
@@ -157,8 +157,7 @@ SMIL keySplines 無法消費 CSS var,`agent-logo.tsx` 內常數為 swell/settle
157
157
  `detail` 可強制);>96 hero 用全細節。
158
158
  - 一息 3 秒家族(文字微光 2s 另計);緩動=swell/settle token 值。
159
159
  - 狀態(prop `state`;「招喚/漣漪」為本家族新造狀態名,定義唯一住所=本節):
160
- - **still 靜止**:完全不動;出現/收起 0.15s 淡入淡出。
161
- - **idle 待機**:純透明度呼吸 3s、最低 75%(非位移=減動作安全)。
160
+ - **still 靜止(=待機)**:完全不動;出現/收起 0.15s 淡入淡出。2026-09-02 拍板:待機一律靜止,不另立呼吸態,狀態分類收斂為三態。
162
161
  - **attract 招喚**(空狀態/FAB 有新訊):脹 1.07+吸氣微亮(白疊層 0→14%→0)+遮罩單波
163
162
  (雙色放射盤內藍 .5→過渡 .44→青 .34→邊緣 0;行程 560→830;遮罩護負空間、無模糊;
164
163
  35% 拍點波離體與本體回落同拍)。`ripple={false}` 供 FAB 光圈代位。
@@ -166,7 +165,7 @@ SMIL keySplines 無法消費 CSS var,`agent-logo.tsx` 內常數為 swell/settle
166
165
  0.6s(state-exit ease-out;由 0.15s 狀態切換淡出承接);+負空間呼吸(洞橢圓↔正圓 6s)
167
166
  +吸氣微亮(與圓化同拍,峰值 14% 與招喚統一)+色流動(色場定錨畫布=漸層同構逆轉)。
168
167
  - 轉場:狀態間 100-500ms 平滑接續、禁跳切;**減動作**:互動觸發必可停(WCAG 2.3.3);
169
- 常駐 loop 全停(嚴於條文),fallback=待機純透明度呼吸。
168
+ 常駐 loop 全停(嚴於條文),一律回靜止。
170
169
  - 多實例安全:漸層/遮罩 id 以 useId 唯一化。
171
170
 
172
171
  ## AgentFab(浮動開關鈕;附屬資產)
@@ -176,10 +175,10 @@ SMIL keySplines 無法消費 CSS var,`agent-logo.tsx` 內常數為 swell/settle
176
175
  - 外框=AI 觸發鈕特調:錐形(環向)漸層描邊 2px(整數寬+環向漸層=正圓對稱);
177
176
  兩極=藍 258 / 土耳其藍 196(品牌資產常數;2026-09-02 對定稿標誌覆核:各落於兩緞帶
178
177
  色相家族內 ✓——原「終覆核」未決項關閉)。
179
- - 動畫:待機=靜止(常駐邊角鈕,持續呼吸干擾周邊視野;面板標誌待機呼吸是另一明文檔);
178
+ - 動畫:待機=靜止(=標誌 still 態;2026-09-02 拍板全家族待機一律靜止);
180
179
  有新訊=招喚態(標誌蓄勢;漣漪由邊框光圈代位:35% 拍點自邊框射出 r 21→27、寬 2.5、
181
180
  .35→0,光圈漸層=環同兩極同方位);懸停=陰影升一級+微放大;點擊=開面板。
182
- - 減動作:光圈屬位移 loop → 全停(標誌內部自落待機呼吸)。
181
+ - 減動作:光圈屬位移 loop → 全停(標誌內部自回靜止)。
183
182
  - A11y:`aria-label="開啟智慧代理"`。
184
183
 
185
184
  ## 動畫總表
@@ -44,6 +44,7 @@ const CONVERSATIONS: AgentConversationSummary[] = [
44
44
 
45
45
  /** 任務助理完整對話:附件氣泡 + 思考塊 + 工具列 + 輸入盒(真實 Jira 型場景)。 */
46
46
  export const TaskAssistant: Story = {
47
+ name: '任務助理完整對話',
47
48
  render: function TaskAssistantStory() {
48
49
  const [value, setValue] = React.useState('')
49
50
  return (
@@ -101,10 +102,11 @@ export const TaskAssistant: Story = {
101
102
 
102
103
  /** 決策卡覆蓋輸入區(OpenSnapshot):代理被阻擋、需人拍板。 */
103
104
  export const DecisionCardOpen: Story = {
105
+ name: '決策卡覆蓋輸入區',
104
106
  render: () => (
105
107
  <PanelFrame>
106
108
  <AgentPanel>
107
- <AgentPanelHeader title="發布公告草稿" logoState="idle" />
109
+ <AgentPanelHeader title="發布公告草稿" />
108
110
  <AgentConversation>
109
111
  <AgentMessage role="agent">
110
112
  公告已寫好兩個版本,語氣不同,需要你選一個再繼續排程。
@@ -136,6 +138,7 @@ export const DecisionCardOpen: Story = {
136
138
 
137
139
  /** 決策回執:拍板後在對話流中的靜態紀錄。 */
138
140
  export const DecisionSummaryInFlow: Story = {
141
+ name: '決策回執',
139
142
  render: () => (
140
143
  <PanelFrame>
141
144
  <AgentPanel>
@@ -157,6 +160,7 @@ export const DecisionSummaryInFlow: Story = {
157
160
 
158
161
  /** 空狀態:問候區=標誌招喚態(邀請開始對話)。 */
159
162
  export const EmptyConversation: Story = {
163
+ name: '空狀態',
160
164
  render: () => (
161
165
  <PanelFrame>
162
166
  <AgentPanel>
@@ -174,11 +178,12 @@ export const EmptyConversation: Story = {
174
178
  ),
175
179
  }
176
180
 
177
- /** 標誌四態:靜止/待機/招喚/思考(動態資產矩陣;減動作時自動降級待機呼吸)。 */
181
+ /** 標誌三態:靜止(=待機)/招喚/思考(動態資產矩陣;減動作時一律回靜止)。 */
178
182
  export const LogoStates: Story = {
183
+ name: '標誌三態',
179
184
  render: () => (
180
185
  <div className="flex items-end gap-12 p-12">
181
- {(['still', 'idle', 'attract', 'think'] as const).map((state) => (
186
+ {(['still', 'attract', 'think'] as const).map((state) => (
182
187
  <div key={state} className="flex flex-col items-center gap-3">
183
188
  <AgentLogo state={state} size={72} detail="full" label={state} />
184
189
  <span className="text-caption text-fg-muted">{state}</span>
@@ -194,6 +199,7 @@ export const LogoStates: Story = {
194
199
 
195
200
  /** FAB:待機(靜止)與有新訊(招喚=標誌蓄勢+邊框光圈代位)。 */
196
201
  export const FabStates: Story = {
202
+ name: 'FAB 兩態',
197
203
  render: () => (
198
204
  <div className="flex items-center gap-16 p-16">
199
205
  <div className="flex flex-col items-center gap-3">