@qijenchen/design-system 0.1.0-beta.130 → 0.1.0-beta.131

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 (35) hide show
  1. package/dist/components/AgentPanel/agent-fab.d.ts +5 -5
  2. package/dist/components/AgentPanel/agent-fab.d.ts.map +1 -1
  3. package/dist/components/AgentPanel/agent-logo.d.ts +40 -5
  4. package/dist/components/AgentPanel/agent-logo.d.ts.map +1 -1
  5. package/dist/components/AgentPanel/agent-logo.js +123 -96
  6. package/dist/components/AgentPanel/agent-logo.js.map +1 -1
  7. package/dist/components/AgentPanel/agent-panel.d.ts +66 -31
  8. package/dist/components/AgentPanel/agent-panel.d.ts.map +1 -1
  9. package/dist/components/AgentPanel/agent-panel.js +444 -214
  10. package/dist/components/AgentPanel/agent-panel.js.map +1 -1
  11. package/dist/components/AgentPanel/index.js +4 -1
  12. package/dist/index.css +16 -0
  13. package/dist/index.d.ts +1 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +4 -1
  16. package/dist/patterns/element-anatomy/item-anatomy.js +1 -1
  17. package/ds-canonical/fork/consumer/lock.json +4 -4
  18. package/ds-canonical/fork/governance.lock +2 -2
  19. package/ds-canonical/fork/launchers/approval-evidence.mjs +39 -4
  20. package/ds-canonical/fork/manifest.json +10 -10
  21. package/ds-canonical/hooks/lib/approval-evidence.mjs +39 -4
  22. package/ds-canonical/hooks/tests/test_check_substantive_edit_approval_preflight.sh +46 -0
  23. package/ds-canonical/rules/meta-patterns.md +1 -1
  24. package/ds-story-manifest.json +8 -3
  25. package/package.json +1 -1
  26. package/src/components/AgentPanel/agent-fab.tsx +36 -21
  27. package/src/components/AgentPanel/agent-logo.tsx +199 -125
  28. package/src/components/AgentPanel/agent-panel.anatomy.stories.tsx +5 -2
  29. package/src/components/AgentPanel/agent-panel.css +16 -0
  30. package/src/components/AgentPanel/agent-panel.principles.stories.tsx +17 -0
  31. package/src/components/AgentPanel/agent-panel.spec.md +128 -35
  32. package/src/components/AgentPanel/agent-panel.stories.tsx +212 -67
  33. package/src/components/AgentPanel/agent-panel.tsx +0 -0
  34. package/src/index.ts +3 -0
  35. package/src/tokens/uiSize/uiSize.css +3 -1
@@ -5,13 +5,13 @@
5
5
  * - 40 圓 = --field-height-lg 於 lg 密度(uiSize.spec.md「lg 密度」表);圓形 iconOnly。
6
6
  * - 面 = bg-surface-raised + --elevation-200(elevation.spec.md 配對規則;不寫死白色)。
7
7
  * - 外框 = AI 觸發鈕特調:錐形(環向)漸層描邊 2px(整數寬+環向漸層=正圓對稱;
8
- * spec「FAB」節)。配色兩極取標誌兩緞帶家族(藍 258 / 土耳其藍 196 — 品牌資產常數,
9
- * AgentLogo 漸層停駐;2026-09-02 對定稿標誌覆核:兩極各落於藍 252-268 /
10
- * 青 190-210 家族內 ✓)。
8
+ * spec「FAB」節)。配色兩極 = AgentLogo 兩緞帶家族代表色 AGENT_BRAND(藍 254 / 300;
9
+ * 單一數值來源在 agent-logo.tsx,本檔只 import — 2026-09-02 藍→紫改色時收斂)。
11
10
  * - 內置 24 標誌(AgentLogo 簡化檔自動生效)。
12
11
  * - 動畫:待機=靜止(=標誌 still 態,2026-09-02 全家族統一);有新訊=招喚態
13
- * (標誌本體蓄勢,漣漪由邊框光圈代位:35% 拍點自邊框射出 r 21→27、寬 2.5、.35→0);
14
- * 懸停=陰影升一級+微放大;皆 --motion-duration-overlay 過場。
12
+ * (標誌本體蓄勢,漣漪由邊框光圈代位:0–35% 貼邊聚亮 → 35% 呼氣起點自邊框射出 r 21→27
13
+ * 2.5、.35→0 → 90% 散盡 → 靜止空拍;與標誌同 dur / 同 keyTimes / 同 swell→settle,
14
+ * 同一 commit 掛載 → 同相);懸停=陰影升一級+微放大;皆 --motion-duration-overlay 過場。
15
15
  * - 減動作:光圈屬常駐位移 loop → prefers-reduced-motion 全停(標誌內部自回靜止)。
16
16
  */
17
17
  import * as React from 'react';
@@ -1 +1 @@
1
- {"version":3,"file":"agent-fab.d.ts","sourceRoot":"","sources":["../../../src/components/AgentPanel/agent-fab.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAQ9B,MAAM,WAAW,aACf,SAAQ,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC;IACvE,8BAA8B;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,QAAA,MAAM,QAAQ,yFA6Eb,CAAA;AAGD,OAAO,EAAE,QAAQ,EAAE,CAAA"}
1
+ {"version":3,"file":"agent-fab.d.ts","sourceRoot":"","sources":["../../../src/components/AgentPanel/agent-fab.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAgB9B,MAAM,WAAW,aACf,SAAQ,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC;IACvE,8BAA8B;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,QAAA,MAAM,QAAQ,yFAoFb,CAAA;AAGD,OAAO,EAAE,QAAQ,EAAE,CAAA"}
@@ -3,16 +3,43 @@
3
3
  *
4
4
  * ── 消費的 SSOT ──
5
5
  * - 造型:user 提供之黃金比例莫比烏斯 SVG 定稿(內橢圓長短軸比 φ=1.618、軸角 121.717°;
6
- * agent-panel.spec.md「AgentLogo」節)。漸層停駐色=品牌資產常數(色相落於 DS 藍 252-268 /
7
- * 土耳其藍 190-210 家族;資產內嵌 oklch,非 semantic token spec 同節)。
6
+ * agent-panel.spec.md「AgentLogo」節)。漸層停駐色=品牌資產常數(色相落於 DS 藍 252-266 /
7
+ * 294-304 家族,對應 primitives blue-6 258 / purple-6 294;資產內嵌 oklch,非 semantic
8
+ * token — 詳 spec 同節;2026-09-02 user 拍板由藍→土耳其藍改為藍→紫)。
8
9
  * - 狀態動畫:agent-panel.spec.md「AgentLogo」節(靜止/招喚/思考;一息 3s 家族;
9
- * 2026-09-02 拍板:待機一律靜止,併入 still,無獨立呼吸態)
10
- * - 緩動:--motion-easing-swell / --motion-easing-settle(tokens/motion/motion.css)。
11
- * SMIL keySplines 不能吃 CSS var,以下常數為 token 值的逐字鏡像,改 token 必同步此處。
10
+ * 2026-09-02 拍板:待機一律靜止,併入 still,無獨立呼吸態)。呼吸包絡=吸 35% / 呼至 85% /
11
+ * 85–100% 靜止空拍(靜息 I:E 1:2 + 呼氣末停頓;spec「AgentLogo」節引用來源)。
12
+ * - 緩動:--motion-easing-swell / --motion-easing-settle / --motion-easing-exit
13
+ * (tokens/motion/motion.css)。SMIL keySplines 不能吃 CSS var,以下常數為 token 值的逐字鏡像,
14
+ * 改 token 必同步此處。
15
+ * - 狀態切換:新狀態 0.15s 淡入(--motion-duration-overlay;agent-panel.css `.agent-logo-enter`)。
12
16
  * - 減動作:互動觸發必可停(WCAG 2.3.3);常駐 loop 全停 → 一律回靜止
13
17
  * (agent-panel.spec.md「轉場與減動作」)。
14
18
  */
15
19
  import * as React from 'react';
20
+ import './agent-panel.css';
21
+ /** 一息 3 秒(標誌狀態動畫家族共用節拍;文字微光 2s 另計 — spec「動畫總表」)。 @internal */
22
+ export declare const BREATH_DUR = "3s";
23
+ /** = var(--motion-easing-swell) 的 SMIL 鏡像(吸氣 / 所有「起」)。 @internal */
24
+ export declare const SWELL = "0.4 0.14 0.3 1";
25
+ /** = var(--motion-easing-settle) 的 SMIL 鏡像(呼氣 / 所有「收」)。 @internal */
26
+ export declare const SETTLE = "0.2 0 0.38 0.9";
27
+ /** 呼吸包絡:0 靜 → 35% 吸頂 → 85% 回落到底 → 100% 靜止空拍(本體 / 疊層 / 洞形變共用)。 @internal */
28
+ export declare const BREATH_KEYTIMES = "0;.35;.85;1";
29
+ /** @internal */
30
+ export declare const BREATH_SPLINES = "0.4 0.14 0.3 1;0.2 0 0.38 0.9;0 0 1 1";
31
+ /** 呼出去的波:0–35% 貼邊聚亮(吸)→ 35–90% 離體擴散(呼,比本體多 0.15s 餘韻)→ 90–100% 靜。 @internal */
32
+ export declare const RIPPLE_KEYTIMES = "0;.35;.9;1";
33
+ /** @internal */
34
+ export declare const RIPPLE_SPLINES = "0.4 0.14 0.3 1;0.2 0 0.38 0.9;0 0 1 1";
35
+ /**
36
+ * 品牌資產代表色(兩緞帶家族;FAB 環與光圈消費同一組 → repo 內唯一數值來源)。
37
+ * @internal AgentPanel 家族內部共用。
38
+ */
39
+ export declare const AGENT_BRAND: {
40
+ readonly blue: "oklch(.72 .16 254)";
41
+ readonly purple: "oklch(.70 .17 300)";
42
+ };
16
43
  /** 狀態:still 靜止(=待機)/ attract 招喚 / think 思考(=回覆中)。 */
17
44
  export type AgentLogoState = 'still' | 'attract' | 'think';
18
45
  export interface AgentLogoProps extends React.SVGAttributes<SVGSVGElement> {
@@ -35,6 +62,14 @@ export interface AgentLogoProps extends React.SVGAttributes<SVGSVGElement> {
35
62
  * @internal AgentPanel 家族內部共用(AgentFab 光圈同一策略)。
36
63
  */
37
64
  export declare function usePrefersReducedMotion(): boolean;
65
+ /**
66
+ * SMIL `begin="0s"` 以文件時間軸為基準:狀態切換時才掛上的動畫會被視為早已開始
67
+ * (加速段直接凍在終點、呼吸從半途起跑)。改 `begin="indefinite"` + 掛載當下 beginElement():
68
+ * 每次進入狀態都從靜止起跑第一口氣;同一 commit 內掛上的多個動畫(標誌本體 / FAB 光圈)
69
+ * 拿到同一個文件時間 → 同相。
70
+ * @internal AgentPanel 家族內部共用。
71
+ */
72
+ export declare function useBeginAnimationsOnMount(ref: React.RefObject<SVGSVGElement | null>, key: string): void;
38
73
  declare const AgentLogo: React.ForwardRefExoticComponent<AgentLogoProps & React.RefAttributes<SVGSVGElement>>;
39
74
  export { AgentLogo };
40
75
  //# sourceMappingURL=agent-logo.d.ts.map
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"agent-logo.d.ts","sourceRoot":"","sources":["../../../src/components/AgentPanel/agent-logo.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,mBAAmB,CAAA;AAE1B,8DAA8D;AAC9D,eAAO,MAAM,UAAU,OAAO,CAAA;AAC9B,oEAAoE;AACpE,eAAO,MAAM,KAAK,mBAAmB,CAAA;AACrC,qEAAqE;AACrE,eAAO,MAAM,MAAM,mBAAmB,CAAA;AAKtC,2EAA2E;AAC3E,eAAO,MAAM,eAAe,gBAAgB,CAAA;AAC5C,gBAAgB;AAChB,eAAO,MAAM,cAAc,0CAA+B,CAAA;AAC1D,8EAA8E;AAC9E,eAAO,MAAM,eAAe,eAAe,CAAA;AAC3C,gBAAgB;AAChB,eAAO,MAAM,cAAc,0CAA+B,CAAA;AAE1D;;;GAGG;AACH,eAAO,MAAM,WAAW;;;CAGd,CAAA;AA0DV,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;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,QAQhG;AAwID,QAAA,MAAM,SAAS,sFAmMd,CAAA;AAGD,OAAO,EAAE,SAAS,EAAE,CAAA"}
@@ -1,50 +1,57 @@
1
- import { jsxs, Fragment, jsx } from "react/jsx-runtime";
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
3
  import { cn } from "../../lib/utils.js";
4
+ /* empty css */
4
5
  const BREATH_DUR = "3s";
5
6
  const SWELL = "0.4 0.14 0.3 1";
6
7
  const SETTLE = "0.2 0 0.38 0.9";
7
- const D_TURQ = "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";
8
+ const EXIT = "0.3 0 1 1";
9
+ const HOLD = "0 0 1 1";
10
+ const BREATH_KEYTIMES = "0;.35;.85;1";
11
+ const BREATH_SPLINES = `${SWELL};${SETTLE};${HOLD}`;
12
+ const RIPPLE_KEYTIMES = "0;.35;.9;1";
13
+ const RIPPLE_SPLINES = `${SWELL};${SETTLE};${HOLD}`;
14
+ const D_PURPLE = "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";
8
15
  const D_BLUE = "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";
9
- const D_TURQ_ROUND = "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";
16
+ const D_PURPLE_ROUND = "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";
10
17
  const D_BLUE_ROUND = "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";
11
18
  const BLUE_SURFACE = [
12
- [0, "oklch(.72 .15 252)"],
13
- [0.28, "oklch(.64 .19 255)"],
14
- [0.58, "oklch(.55 .21 260)"],
15
- [0.82, "oklch(.42 .21 265)"],
16
- [1, "oklch(.35 .19 268)"]
19
+ [0, "oklch(.76 .13 252)"],
20
+ [0.28, "oklch(.68 .17 255)"],
21
+ [0.58, "oklch(.58 .21 258)"],
22
+ [0.82, "oklch(.46 .21 262)"],
23
+ [1, "oklch(.38 .19 266)"]
17
24
  ];
18
- const TURQ_SURFACE = [
19
- [0, "oklch(.82 .12 190)"],
20
- [0.3, "oklch(.76 .12 194)"],
21
- [0.58, "oklch(.66 .13 199)"],
22
- [0.82, "oklch(.52 .12 205)"],
23
- [1, "oklch(.44 .11 210)"]
25
+ const PURPLE_SURFACE = [
26
+ [0, "oklch(.82 .09 294)"],
27
+ [0.3, "oklch(.74 .14 297)"],
28
+ [0.58, "oklch(.64 .18 300)"],
29
+ [0.82, "oklch(.52 .20 302)"],
30
+ [1, "oklch(.44 .19 304)"]
24
31
  ];
25
- const TURQ_UNDERSIDE = [
26
- [0, "oklch(.28 .08 210)", 0.82],
27
- [0.34, "oklch(.30 .08 208)", 0.47],
28
- [0.74, "oklch(.30 .08 208)", 0]
32
+ const PURPLE_UNDERSIDE = [
33
+ [0, "oklch(.28 .10 302)", 0.82],
34
+ [0.34, "oklch(.30 .10 300)", 0.47],
35
+ [0.74, "oklch(.30 .10 300)", 0]
29
36
  ];
30
37
  const BLUE_LIFT = [
31
- [0, "oklch(.85 .07 235)", 0.3],
32
- [0.48, "oklch(.85 .07 235)", 0.1],
33
- [1, "oklch(.85 .07 235)", 0]
38
+ [0, "oklch(.86 .06 252)", 0.3],
39
+ [0.48, "oklch(.86 .06 252)", 0.1],
40
+ [1, "oklch(.86 .06 252)", 0]
34
41
  ];
35
42
  const BLUE_SIMPLE = [
36
- [0, "oklch(.72 .15 252)"],
37
- [1, "oklch(.35 .19 268)"]
43
+ [0, "oklch(.76 .13 252)"],
44
+ [1, "oklch(.38 .19 266)"]
38
45
  ];
39
- const TURQ_SIMPLE = [
40
- [0, "oklch(.82 .12 190)"],
41
- [1, "oklch(.44 .11 210)"]
46
+ const PURPLE_SIMPLE = [
47
+ [0, "oklch(.82 .09 294)"],
48
+ [1, "oklch(.44 .19 304)"]
42
49
  ];
43
50
  const WAVE_STOPS = [
44
- [0, "oklch(.60 .18 250)", 0.5],
45
- [0.55, "oklch(.63 .15 220)", 0.44],
46
- [0.8, "oklch(.66 .12 196)", 0.34],
47
- [1, "oklch(.66 .12 196)", 0]
51
+ [0, "oklch(.62 .19 254)", 0.5],
52
+ [0.55, "oklch(.64 .18 278)", 0.44],
53
+ [0.8, "oklch(.66 .17 300)", 0.34],
54
+ [1, "oklch(.66 .17 300)", 0]
48
55
  ];
49
56
  function usePrefersReducedMotion() {
50
57
  const [reduced, setReduced] = React.useState(false);
@@ -57,6 +64,15 @@ function usePrefersReducedMotion() {
57
64
  }, []);
58
65
  return reduced;
59
66
  }
67
+ function useBeginAnimationsOnMount(ref, key) {
68
+ React.useLayoutEffect(() => {
69
+ const root = ref.current;
70
+ if (!root) return;
71
+ root.querySelectorAll("[data-begin-on-mount]").forEach((el) => {
72
+ if (typeof el.beginElement === "function") el.beginElement();
73
+ });
74
+ }, [ref, key]);
75
+ }
60
76
  function GradientStops({ stops }) {
61
77
  return /* @__PURE__ */ jsx(Fragment, { children: stops.map(([offset, color, opacity]) => /* @__PURE__ */ jsx(
62
78
  "stop",
@@ -68,77 +84,92 @@ function GradientStops({ stops }) {
68
84
  offset
69
85
  )) });
70
86
  }
71
- function GradientCounterSpin() {
87
+ function SpinPair({
88
+ id,
89
+ attributeName,
90
+ from,
91
+ mid,
92
+ end
93
+ }) {
72
94
  return /* @__PURE__ */ jsxs(Fragment, { children: [
73
95
  /* @__PURE__ */ jsx(
74
96
  "animateTransform",
75
97
  {
76
- attributeName: "gradientTransform",
98
+ id,
99
+ attributeName,
77
100
  type: "rotate",
78
- values: "0 627 627;-90 627 627",
101
+ values: `${from};${mid}`,
79
102
  dur: "0.3s",
80
- begin: "0s",
103
+ begin: "indefinite",
104
+ "data-begin-on-mount": "",
81
105
  fill: "freeze",
82
106
  calcMode: "spline",
83
107
  keyTimes: "0;1",
84
- keySplines: "0.6 0 1 1"
108
+ keySplines: EXIT
85
109
  }
86
110
  ),
87
111
  /* @__PURE__ */ jsx(
88
112
  "animateTransform",
89
113
  {
90
- attributeName: "gradientTransform",
114
+ attributeName,
91
115
  type: "rotate",
92
- values: "-90 627 627;-450 627 627",
116
+ values: `${mid};${end}`,
93
117
  dur: "0.6s",
94
- begin: "0.3s",
118
+ begin: `${id}.end`,
95
119
  repeatCount: "indefinite"
96
120
  }
97
121
  )
98
122
  ] });
99
123
  }
124
+ function GradientCounterSpin({ id }) {
125
+ return /* @__PURE__ */ jsx(SpinPair, { id, attributeName: "gradientTransform", from: "0 627 627", mid: "-90 627 627", end: "-450 627 627" });
126
+ }
100
127
  function HoleMorph({ from, round }) {
101
128
  return /* @__PURE__ */ jsx(
102
129
  "animate",
103
130
  {
104
131
  attributeName: "d",
105
- values: `${from};${round};${from}`,
106
- keyTimes: "0;.5;1",
132
+ values: `${from};${round};${from};${from}`,
133
+ keyTimes: BREATH_KEYTIMES,
107
134
  dur: "6s",
135
+ begin: "indefinite",
136
+ "data-begin-on-mount": "",
108
137
  repeatCount: "indefinite",
109
138
  calcMode: "spline",
110
- keySplines: `${SWELL};${SETTLE}`
139
+ keySplines: BREATH_SPLINES
111
140
  }
112
141
  );
113
142
  }
114
143
  function LogoBody({ ids, simplified, morph }) {
115
- const turqMorph = morph ? /* @__PURE__ */ jsx(HoleMorph, { from: D_TURQ, round: D_TURQ_ROUND }) : null;
144
+ const purpleMorph = morph ? /* @__PURE__ */ jsx(HoleMorph, { from: D_PURPLE, round: D_PURPLE_ROUND }) : null;
116
145
  const blueMorph = morph ? /* @__PURE__ */ jsx(HoleMorph, { from: D_BLUE, round: D_BLUE_ROUND }) : null;
117
146
  return /* @__PURE__ */ jsxs(Fragment, { children: [
118
- /* @__PURE__ */ jsx("path", { d: D_TURQ, fill: `url(#${ids.turq})`, children: turqMorph }),
119
- !simplified && /* @__PURE__ */ jsx("path", { d: D_TURQ, fill: `url(#${ids.under})`, children: turqMorph }),
147
+ /* @__PURE__ */ jsx("path", { d: D_PURPLE, fill: `url(#${ids.purple})`, children: purpleMorph }),
148
+ !simplified && /* @__PURE__ */ jsx("path", { d: D_PURPLE, fill: `url(#${ids.under})`, children: purpleMorph }),
120
149
  /* @__PURE__ */ jsx("path", { d: D_BLUE, fill: `url(#${ids.blue})`, children: blueMorph }),
121
150
  !simplified && /* @__PURE__ */ jsx("path", { d: D_BLUE, fill: `url(#${ids.lift})`, children: blueMorph })
122
151
  ] });
123
152
  }
124
- function InhaleOverlay({ morph, dur, keyTimes }) {
125
- const turqMorph = morph ? /* @__PURE__ */ jsx(HoleMorph, { from: D_TURQ, round: D_TURQ_ROUND }) : null;
153
+ function InhaleOverlay({ morph, dur }) {
154
+ const purpleMorph = morph ? /* @__PURE__ */ jsx(HoleMorph, { from: D_PURPLE, round: D_PURPLE_ROUND }) : null;
126
155
  const blueMorph = morph ? /* @__PURE__ */ jsx(HoleMorph, { from: D_BLUE, round: D_BLUE_ROUND }) : null;
127
156
  return /* @__PURE__ */ jsxs("g", { opacity: "0", pointerEvents: "none", children: [
128
157
  /* @__PURE__ */ jsx(
129
158
  "animate",
130
159
  {
131
160
  attributeName: "opacity",
132
- values: "0;.14;0",
133
- keyTimes,
161
+ values: "0;.14;0;0",
162
+ keyTimes: BREATH_KEYTIMES,
134
163
  dur,
164
+ begin: "indefinite",
165
+ "data-begin-on-mount": "",
135
166
  repeatCount: "indefinite",
136
167
  calcMode: "spline",
137
- keySplines: `${SWELL};${SETTLE}`
168
+ keySplines: BREATH_SPLINES
138
169
  }
139
170
  ),
140
171
  /* @__PURE__ */ jsx("path", { d: D_BLUE, fill: "#fff", children: blueMorph }),
141
- /* @__PURE__ */ jsx("path", { d: D_TURQ, fill: "#fff", children: turqMorph })
172
+ /* @__PURE__ */ jsx("path", { d: D_PURPLE, fill: "#fff", children: purpleMorph })
142
173
  ] });
143
174
  }
144
175
  const AgentLogo = React.forwardRef(
@@ -156,13 +187,19 @@ const AgentLogo = React.forwardRef(
156
187
  const reduced = usePrefersReducedMotion();
157
188
  const simplified = detail === "simplified" || detail === "auto" && size <= 24;
158
189
  const effectiveState = reduced ? "still" : state;
190
+ const innerRef = React.useRef(null);
191
+ React.useImperativeHandle(ref, () => innerRef.current);
192
+ useBeginAnimationsOnMount(innerRef, `${effectiveState}:${simplified}:${ripple}`);
159
193
  const ids = {
160
194
  blue: `${uid}bs`,
161
- turq: `${uid}ts`,
162
- under: `${uid}tu`,
195
+ purple: `${uid}ps`,
196
+ under: `${uid}pu`,
163
197
  lift: `${uid}bl`,
164
198
  wave: `${uid}wg`,
165
- mask: `${uid}wm`
199
+ mask: `${uid}wm`,
200
+ spinBlue: `${uid}sb`,
201
+ spinPurple: `${uid}sp`,
202
+ spinBody: `${uid}sr`
166
203
  };
167
204
  const isThink = effectiveState === "think";
168
205
  const isAttract = effectiveState === "attract";
@@ -178,22 +215,22 @@ const AgentLogo = React.forwardRef(
178
215
  y2: "110",
179
216
  children: [
180
217
  /* @__PURE__ */ jsx(GradientStops, { stops: simplified ? BLUE_SIMPLE : BLUE_SURFACE }),
181
- isThink && /* @__PURE__ */ jsx(GradientCounterSpin, {})
218
+ isThink && /* @__PURE__ */ jsx(GradientCounterSpin, { id: ids.spinBlue })
182
219
  ]
183
220
  }
184
221
  ),
185
222
  /* @__PURE__ */ jsxs(
186
223
  "linearGradient",
187
224
  {
188
- id: ids.turq,
225
+ id: ids.purple,
189
226
  gradientUnits: "userSpaceOnUse",
190
227
  x1: "990",
191
228
  y1: "145",
192
229
  x2: "650",
193
230
  y2: "1090",
194
231
  children: [
195
- /* @__PURE__ */ jsx(GradientStops, { stops: simplified ? TURQ_SIMPLE : TURQ_SURFACE }),
196
- isThink && /* @__PURE__ */ jsx(GradientCounterSpin, {})
232
+ /* @__PURE__ */ jsx(GradientStops, { stops: simplified ? PURPLE_SIMPLE : PURPLE_SURFACE }),
233
+ isThink && /* @__PURE__ */ jsx(GradientCounterSpin, { id: ids.spinPurple })
197
234
  ]
198
235
  }
199
236
  ),
@@ -206,7 +243,7 @@ const AgentLogo = React.forwardRef(
206
243
  cx: "490",
207
244
  cy: "815",
208
245
  r: "520",
209
- children: /* @__PURE__ */ jsx(GradientStops, { stops: TURQ_UNDERSIDE })
246
+ children: /* @__PURE__ */ jsx(GradientStops, { stops: PURPLE_UNDERSIDE })
210
247
  }
211
248
  ),
212
249
  /* @__PURE__ */ jsx(
@@ -233,34 +270,10 @@ const AgentLogo = React.forwardRef(
233
270
  let content;
234
271
  if (isThink) {
235
272
  content = /* @__PURE__ */ jsx("g", { transform: "translate(627 627)", children: /* @__PURE__ */ jsxs("g", { children: [
236
- /* @__PURE__ */ jsx(
237
- "animateTransform",
238
- {
239
- attributeName: "transform",
240
- type: "rotate",
241
- values: "0;90",
242
- dur: "0.3s",
243
- begin: "0s",
244
- fill: "freeze",
245
- calcMode: "spline",
246
- keyTimes: "0;1",
247
- keySplines: "0.6 0 1 1"
248
- }
249
- ),
250
- /* @__PURE__ */ jsx(
251
- "animateTransform",
252
- {
253
- attributeName: "transform",
254
- type: "rotate",
255
- values: "90;450",
256
- dur: "0.6s",
257
- begin: "0.3s",
258
- repeatCount: "indefinite"
259
- }
260
- ),
273
+ /* @__PURE__ */ jsx(SpinPair, { id: ids.spinBody, attributeName: "transform", from: "0", mid: "90", end: "450" }),
261
274
  /* @__PURE__ */ jsxs("g", { transform: "translate(-627 -627)", children: [
262
275
  body,
263
- /* @__PURE__ */ jsx(InhaleOverlay, { morph: true, dur: "6s", keyTimes: "0;.5;1" })
276
+ /* @__PURE__ */ jsx(InhaleOverlay, { morph: true, dur: "6s" })
264
277
  ] })
265
278
  ] }) });
266
279
  } else if (isAttract) {
@@ -270,24 +283,28 @@ const AgentLogo = React.forwardRef(
270
283
  "animate",
271
284
  {
272
285
  attributeName: "r",
273
- values: "560;560;830",
274
- keyTimes: "0;.35;1",
286
+ values: "560;560;830;830",
287
+ keyTimes: RIPPLE_KEYTIMES,
275
288
  dur: BREATH_DUR,
289
+ begin: "indefinite",
290
+ "data-begin-on-mount": "",
276
291
  repeatCount: "indefinite",
277
292
  calcMode: "spline",
278
- keySplines: `0 0 1 1;${SETTLE}`
293
+ keySplines: `${HOLD};${SETTLE};${HOLD}`
279
294
  }
280
295
  ),
281
296
  /* @__PURE__ */ jsx(
282
297
  "animate",
283
298
  {
284
299
  attributeName: "opacity",
285
- values: "0;1;0",
286
- keyTimes: "0;.35;1",
300
+ values: "0;1;0;0",
301
+ keyTimes: RIPPLE_KEYTIMES,
287
302
  dur: BREATH_DUR,
303
+ begin: "indefinite",
304
+ "data-begin-on-mount": "",
288
305
  repeatCount: "indefinite",
289
306
  calcMode: "spline",
290
- keySplines: `0 0 1 1;${SETTLE}`
307
+ keySplines: RIPPLE_SPLINES
291
308
  }
292
309
  )
293
310
  ] }) }),
@@ -297,17 +314,19 @@ const AgentLogo = React.forwardRef(
297
314
  {
298
315
  attributeName: "transform",
299
316
  type: "scale",
300
- values: "1;1.07;1",
301
- keyTimes: "0;.35;1",
317
+ values: "1;1.07;1;1",
318
+ keyTimes: BREATH_KEYTIMES,
302
319
  dur: BREATH_DUR,
320
+ begin: "indefinite",
321
+ "data-begin-on-mount": "",
303
322
  repeatCount: "indefinite",
304
323
  calcMode: "spline",
305
- keySplines: `${SWELL};${SETTLE}`
324
+ keySplines: BREATH_SPLINES
306
325
  }
307
326
  ),
308
327
  /* @__PURE__ */ jsxs("g", { transform: "translate(-627 -627)", children: [
309
328
  body,
310
- /* @__PURE__ */ jsx(InhaleOverlay, { morph: false, dur: BREATH_DUR, keyTimes: "0;.35;1" })
329
+ /* @__PURE__ */ jsx(InhaleOverlay, { morph: false, dur: BREATH_DUR })
311
330
  ] })
312
331
  ] }) })
313
332
  ] });
@@ -317,7 +336,7 @@ const AgentLogo = React.forwardRef(
317
336
  return /* @__PURE__ */ jsxs(
318
337
  "svg",
319
338
  {
320
- ref,
339
+ ref: innerRef,
321
340
  width: size,
322
341
  height: size,
323
342
  viewBox: "0 0 1254 1254",
@@ -330,7 +349,7 @@ const AgentLogo = React.forwardRef(
330
349
  ...props,
331
350
  children: [
332
351
  defs,
333
- content
352
+ /* @__PURE__ */ jsx("g", { className: "agent-logo-enter", children: content }, effectiveState)
334
353
  ]
335
354
  }
336
355
  );
@@ -339,6 +358,14 @@ const AgentLogo = React.forwardRef(
339
358
  AgentLogo.displayName = "AgentLogo";
340
359
  export {
341
360
  AgentLogo,
361
+ BREATH_DUR,
362
+ BREATH_KEYTIMES,
363
+ BREATH_SPLINES,
364
+ RIPPLE_KEYTIMES,
365
+ RIPPLE_SPLINES,
366
+ SETTLE,
367
+ SWELL,
368
+ useBeginAnimationsOnMount,
342
369
  usePrefersReducedMotion
343
370
  };
344
371
  //# sourceMappingURL=agent-logo.js.map
@@ -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 * 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
+ {"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-266 /\n * 紫 294-304 家族,對應 primitives blue-6 258 / purple-6 294;資產內嵌 oklch,非 semantic\n * token — 詳 spec 同節;2026-09-02 user 拍板由藍→土耳其藍改為藍→紫)。\n * - 狀態動畫:agent-panel.spec.md「AgentLogo」節(靜止/招喚/思考;一息 3s 家族;\n * 2026-09-02 拍板:待機一律靜止,併入 still,無獨立呼吸態)。呼吸包絡=吸 35% / 呼至 85% /\n * 85–100% 靜止空拍(靜息 I:E ≈ 1:2 + 呼氣末停頓;spec「AgentLogo」節引用來源)。\n * - 緩動:--motion-easing-swell / --motion-easing-settle / --motion-easing-exit\n * (tokens/motion/motion.css)。SMIL keySplines 不能吃 CSS var,以下常數為 token 值的逐字鏡像,\n * 改 token 必同步此處。\n * - 狀態切換:新狀態 0.15s 淡入(--motion-duration-overlay;agent-panel.css `.agent-logo-enter`)。\n * - 減動作:互動觸發必可停(WCAG 2.3.3);常駐 loop 全停 → 一律回靜止\n * (agent-panel.spec.md「轉場與減動作」)。\n */\nimport * as React from 'react'\nimport { cn } from '@/lib/utils'\nimport './agent-panel.css'\n\n/** 一息 3 秒(標誌狀態動畫家族共用節拍;文字微光 2s 另計 — spec「動畫總表」)。 @internal */\nexport const BREATH_DUR = '3s'\n/** = var(--motion-easing-swell) 的 SMIL 鏡像(吸氣 / 所有「起」)。 @internal */\nexport const SWELL = '0.4 0.14 0.3 1'\n/** = var(--motion-easing-settle) 的 SMIL 鏡像(呼氣 / 所有「收」)。 @internal */\nexport const SETTLE = '0.2 0 0.38 0.9'\n/** = var(--motion-easing-exit) 的 SMIL 鏡像(加速起步)。 */\nconst EXIT = '0.3 0 1 1'\n/** 靜止空拍(值不變,曲線無意義,填線性)。 */\nconst HOLD = '0 0 1 1'\n/** 呼吸包絡:0 靜 → 35% 吸頂 → 85% 回落到底 → 100% 靜止空拍(本體 / 疊層 / 洞形變共用)。 @internal */\nexport const BREATH_KEYTIMES = '0;.35;.85;1'\n/** @internal */\nexport const BREATH_SPLINES = `${SWELL};${SETTLE};${HOLD}`\n/** 呼出去的波:0–35% 貼邊聚亮(吸)→ 35–90% 離體擴散(呼,比本體多 0.15s 餘韻)→ 90–100% 靜。 @internal */\nexport const RIPPLE_KEYTIMES = '0;.35;.9;1'\n/** @internal */\nexport const RIPPLE_SPLINES = `${SWELL};${SETTLE};${HOLD}`\n\n/**\n * 品牌資產代表色(兩緞帶家族;FAB 環與光圈消費同一組 → repo 內唯一數值來源)。\n * @internal AgentPanel 家族內部共用。\n */\nexport const AGENT_BRAND = {\n blue: 'oklch(.72 .16 254)',\n purple: 'oklch(.70 .17 300)',\n} as const\n\n/* ── 幾何(user 定稿 SVG 逐字;viewBox 0 0 1254 1254,圓心 627) ── */\nconst D_PURPLE =\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_PURPLE_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):五停駐雙緞帶 + 底面陰影 + 提亮(原稿逐層保留)。\n * 藍緞帶 252→266、紫緞帶 294→304:明度各跨 .38、彩度中段峰值貼 sRGB 色域上限不越界;\n * 兩緞帶最近處相距 ≥38°,24px 簡化檔仍分得開(2026-09-02 配色研究候選 C)。 */\nconst BLUE_SURFACE: readonly Stop[] = [\n [0, 'oklch(.76 .13 252)'],\n [0.28, 'oklch(.68 .17 255)'],\n [0.58, 'oklch(.58 .21 258)'],\n [0.82, 'oklch(.46 .21 262)'],\n [1, 'oklch(.38 .19 266)'],\n]\nconst PURPLE_SURFACE: readonly Stop[] = [\n [0, 'oklch(.82 .09 294)'],\n [0.3, 'oklch(.74 .14 297)'],\n [0.58, 'oklch(.64 .18 300)'],\n [0.82, 'oklch(.52 .20 302)'],\n [1, 'oklch(.44 .19 304)'],\n]\nconst PURPLE_UNDERSIDE: readonly Stop[] = [\n [0, 'oklch(.28 .10 302)', 0.82],\n [0.34, 'oklch(.30 .10 300)', 0.47],\n [0.74, 'oklch(.30 .10 300)', 0],\n]\nconst BLUE_LIFT: readonly Stop[] = [\n [0, 'oklch(.86 .06 252)', 0.3],\n [0.48, 'oklch(.86 .06 252)', 0.1],\n [1, 'oklch(.86 .06 252)', 0],\n]\n/* 簡化版(≤24):去陰影提亮、兩停駐高對比(圖標光學校正慣例;取五停駐頭尾)。 */\nconst BLUE_SIMPLE: readonly Stop[] = [\n [0, 'oklch(.76 .13 252)'],\n [1, 'oklch(.38 .19 266)'],\n]\nconst PURPLE_SIMPLE: readonly Stop[] = [\n [0, 'oklch(.82 .09 294)'],\n [1, 'oklch(.44 .19 304)'],\n]\n/* 招喚漣漪:雙色放射盤(內藍→靛過渡→紫→邊緣透明;波色呼應本體兩緞帶色相家族,中段 278 為兩極中點)。 */\nconst WAVE_STOPS: readonly Stop[] = [\n [0, 'oklch(.62 .19 254)', 0.5],\n [0.55, 'oklch(.64 .18 278)', 0.44],\n [0.8, 'oklch(.66 .17 300)', 0.34],\n [1, 'oklch(.66 .17 300)', 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\n/**\n * SMIL `begin=\"0s\"` 以文件時間軸為基準:狀態切換時才掛上的動畫會被視為早已開始\n * (加速段直接凍在終點、呼吸從半途起跑)。改 `begin=\"indefinite\"` + 掛載當下 beginElement():\n * 每次進入狀態都從靜止起跑第一口氣;同一 commit 內掛上的多個動畫(標誌本體 / FAB 光圈)\n * 拿到同一個文件時間 → 同相。\n * @internal AgentPanel 家族內部共用。\n */\nexport function useBeginAnimationsOnMount(ref: React.RefObject<SVGSVGElement | null>, key: string) {\n React.useLayoutEffect(() => {\n const root = ref.current\n if (!root) return\n root.querySelectorAll<SVGAnimateElement>('[data-begin-on-mount]').forEach((el) => {\n if (typeof el.beginElement === 'function') el.beginElement()\n })\n }, [ref, key])\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/**\n * 兩段旋轉:啟動加速 0.3s(= 一息/10,exit 曲線)→ 等速 0.6s/圈(= 一息/5,linear=轉圈慣例)。\n * 加速段 begin=indefinite 由掛載觸發;等速段以 syncbase `<id>.end` 銜接,保證每次進入都從 0° 起步。\n */\nfunction SpinPair({\n id,\n attributeName,\n from,\n mid,\n end,\n}: {\n id: string\n attributeName: 'transform' | 'gradientTransform'\n from: string\n mid: string\n end: string\n}) {\n return (\n <>\n <animateTransform\n id={id}\n attributeName={attributeName}\n type=\"rotate\"\n values={`${from};${mid}`}\n dur=\"0.3s\"\n begin=\"indefinite\"\n data-begin-on-mount=\"\"\n fill=\"freeze\"\n calcMode=\"spline\"\n keyTimes=\"0;1\"\n keySplines={EXIT}\n />\n <animateTransform\n attributeName={attributeName}\n type=\"rotate\"\n values={`${mid};${end}`}\n dur=\"0.6s\"\n begin={`${id}.end`}\n repeatCount=\"indefinite\"\n />\n </>\n )\n}\n\n/** 思考態:色場定錨於畫布 — 漸層以本體旋轉的同構逆轉實現「幾何流過色場」。 */\nfunction GradientCounterSpin({ id }: { id: string }) {\n return (\n <SpinPair id={id} attributeName=\"gradientTransform\" from=\"0 627 627\" mid=\"-90 627 627\" end=\"-450 627 627\" />\n )\n}\n\n/** 思考態負空間呼吸:洞橢圓↔正圓,6s(=2 息)一輪,同一條呼吸包絡(吸 35% / 呼至 85% / 靜)。 */\nfunction HoleMorph({ from, round }: { from: string; round: string }) {\n return (\n <animate\n attributeName=\"d\"\n values={`${from};${round};${from};${from}`}\n keyTimes={BREATH_KEYTIMES}\n dur=\"6s\"\n begin=\"indefinite\"\n data-begin-on-mount=\"\"\n repeatCount=\"indefinite\"\n calcMode=\"spline\"\n keySplines={BREATH_SPLINES}\n />\n )\n}\n\ninterface BodyProps {\n ids: Record<'blue' | 'purple' | 'under' | 'lift', string>\n simplified: boolean\n morph: boolean\n}\n\n/** 本體雙緞帶(完整=4 層;簡化=2 層);morph=true 時掛負空間形變。 */\nfunction LogoBody({ ids, simplified, morph }: BodyProps) {\n const purpleMorph = morph ? <HoleMorph from={D_PURPLE} round={D_PURPLE_ROUND} /> : null\n const blueMorph = morph ? <HoleMorph from={D_BLUE} round={D_BLUE_ROUND} /> : null\n return (\n <>\n <path d={D_PURPLE} fill={`url(#${ids.purple})`}>{purpleMorph}</path>\n {!simplified && (\n <path d={D_PURPLE} fill={`url(#${ids.under})`}>{purpleMorph}</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/**\n * 吸氣微亮:白色疊層 0→14%→0(吸氣亮、呼氣暗;Apple Watch Breathe「脹=吸氣」同向)。\n * 招喚與思考同一套語言、同一條呼吸包絡(思考與 6s 圓化同拍)。亮度包絡取代透明度包絡:\n * 本體不透明度恆 1(白面上變淡=像停用;spec「禁止事項」)。\n */\nfunction InhaleOverlay({ morph, dur }: { morph: boolean; dur: string }) {\n const purpleMorph = morph ? <HoleMorph from={D_PURPLE} round={D_PURPLE_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;0\"\n keyTimes={BREATH_KEYTIMES}\n dur={dur}\n begin=\"indefinite\"\n data-begin-on-mount=\"\"\n repeatCount=\"indefinite\"\n calcMode=\"spline\"\n keySplines={BREATH_SPLINES}\n />\n <path d={D_BLUE} fill=\"#fff\">{blueMorph}</path>\n <path d={D_PURPLE} fill=\"#fff\">{purpleMorph}</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 innerRef = React.useRef<SVGSVGElement | null>(null)\n React.useImperativeHandle(ref, () => innerRef.current as SVGSVGElement)\n useBeginAnimationsOnMount(innerRef, `${effectiveState}:${simplified}:${ripple}`)\n const ids = {\n blue: `${uid}bs`,\n purple: `${uid}ps`,\n under: `${uid}pu`,\n lift: `${uid}bl`,\n wave: `${uid}wg`,\n mask: `${uid}wm`,\n spinBlue: `${uid}sb`,\n spinPurple: `${uid}sp`,\n spinBody: `${uid}sr`,\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 id={ids.spinBlue} />}\n </linearGradient>\n <linearGradient\n id={ids.purple}\n gradientUnits=\"userSpaceOnUse\"\n x1=\"990\"\n y1=\"145\"\n x2=\"650\"\n y2=\"1090\"\n >\n <GradientStops stops={simplified ? PURPLE_SIMPLE : PURPLE_SURFACE} />\n {isThink && <GradientCounterSpin id={ids.spinPurple} />}\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={PURPLE_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 // 平移座標系內旋轉不得帶圓心(帶了=轉心位移兩倍遠)。結束無減速檔:SMIL loop 無終點,\n // 由狀態切換的 0.15s 淡入承接(spec「AgentLogo」節)。\n content = (\n <g transform=\"translate(627 627)\">\n <g>\n <SpinPair id={ids.spinBody} attributeName=\"transform\" from=\"0\" mid=\"90\" end=\"450\" />\n <g transform=\"translate(-627 -627)\">\n {body}\n <InhaleOverlay morph dur=\"6s\" />\n </g>\n </g>\n </g>\n )\n } else if (isAttract) {\n // 招喚:蓄勢(本體脹 1.07 + 吸氣微亮,波貼邊聚亮)→ 35% 呼氣起點波離體 → 85% 本體到底\n // → 90% 餘暈散盡 → 靜止空拍。\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;830\"\n keyTimes={RIPPLE_KEYTIMES}\n dur={BREATH_DUR}\n begin=\"indefinite\"\n data-begin-on-mount=\"\"\n repeatCount=\"indefinite\"\n calcMode=\"spline\"\n keySplines={`${HOLD};${SETTLE};${HOLD}`}\n />\n <animate\n attributeName=\"opacity\"\n values=\"0;1;0;0\"\n keyTimes={RIPPLE_KEYTIMES}\n dur={BREATH_DUR}\n begin=\"indefinite\"\n data-begin-on-mount=\"\"\n repeatCount=\"indefinite\"\n calcMode=\"spline\"\n keySplines={RIPPLE_SPLINES}\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;1\"\n keyTimes={BREATH_KEYTIMES}\n dur={BREATH_DUR}\n begin=\"indefinite\"\n data-begin-on-mount=\"\"\n repeatCount=\"indefinite\"\n calcMode=\"spline\"\n keySplines={BREATH_SPLINES}\n />\n <g transform=\"translate(-627 -627)\">\n {body}\n <InhaleOverlay morph={false} dur={BREATH_DUR} />\n </g>\n </g>\n </g>\n </>\n )\n } else {\n content = body\n }\n\n return (\n <svg\n ref={innerRef}\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 {/* 狀態切換:key 重建 + 0.15s 淡入(僅 opacity,不碰 transform 屬性),禁跳切。 */}\n <g key={effectiveState} className=\"agent-logo-enter\">\n {content}\n </g>\n </svg>\n )\n },\n)\nAgentLogo.displayName = 'AgentLogo'\n\nexport { AgentLogo }\n"],"names":[],"mappings":"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"}