@qijenchen/design-system 0.1.0-beta.127 → 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.
Files changed (47) hide show
  1. package/dist/components/AgentPanel/agent-fab.d.ts +24 -0
  2. package/dist/components/AgentPanel/agent-fab.d.ts.map +1 -0
  3. package/dist/components/AgentPanel/agent-logo.d.ts +40 -0
  4. package/dist/components/AgentPanel/agent-logo.d.ts.map +1 -0
  5. package/dist/components/AgentPanel/agent-logo.js +344 -0
  6. package/dist/components/AgentPanel/agent-logo.js.map +1 -0
  7. package/dist/components/AgentPanel/agent-panel.d.ts +148 -0
  8. package/dist/components/AgentPanel/agent-panel.d.ts.map +1 -0
  9. package/dist/components/AgentPanel/agent-panel.js +670 -0
  10. package/dist/components/AgentPanel/agent-panel.js.map +1 -0
  11. package/dist/components/AgentPanel/index.d.ts +2 -0
  12. package/dist/components/AgentPanel/index.d.ts.map +1 -0
  13. package/dist/components/AgentPanel/index.js +13 -0
  14. package/dist/components/AgentPanel/index.js.map +1 -0
  15. package/dist/components/Chip/chip.d.ts +17 -4
  16. package/dist/components/Chip/chip.d.ts.map +1 -1
  17. package/dist/components/Chip/chip.js +35 -19
  18. package/dist/components/Chip/chip.js.map +1 -1
  19. package/dist/index.css +43 -0
  20. package/dist/index.d.ts +3 -1
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +10 -0
  23. package/dist/index.js.map +1 -1
  24. package/ds-canonical/fork/consumer/lock.json +4 -4
  25. package/ds-canonical/fork/governance.lock +2 -2
  26. package/ds-canonical/fork/launchers/approval-evidence.mjs +6 -3
  27. package/ds-canonical/fork/manifest.json +10 -10
  28. package/ds-canonical/hooks/check_benchmark_citation.sh +1 -1
  29. package/ds-canonical/hooks/lib/approval-evidence.mjs +6 -3
  30. package/ds-canonical/hooks/tests/test_check_substantive_edit_approval_preflight.sh +21 -0
  31. package/ds-story-manifest.json +30 -4
  32. package/package.json +1 -1
  33. package/src/components/AgentPanel/agent-fab.tsx +111 -0
  34. package/src/components/AgentPanel/agent-logo.tsx +417 -0
  35. package/src/components/AgentPanel/agent-panel.anatomy.stories.tsx +124 -0
  36. package/src/components/AgentPanel/agent-panel.css +43 -0
  37. package/src/components/AgentPanel/agent-panel.principles.stories.tsx +40 -0
  38. package/src/components/AgentPanel/agent-panel.spec.md +225 -0
  39. package/src/components/AgentPanel/agent-panel.stories.tsx +215 -0
  40. package/src/components/AgentPanel/agent-panel.tsx +0 -0
  41. package/src/components/AgentPanel/index.ts +5 -0
  42. package/src/components/Chip/chip.spec.md +15 -6
  43. package/src/components/Chip/chip.stories.tsx +19 -0
  44. package/src/components/Chip/chip.tsx +67 -31
  45. package/src/index.ts +29 -0
  46. package/src/tokens/motion/motion.css +18 -1
  47. package/src/tokens/uiSize/uiSize.css +4 -0
@@ -0,0 +1,24 @@
1
+ /**
2
+ * AgentFab — 智慧代理浮動開關鈕(AgentPanel 家族附屬資產)。
3
+ *
4
+ * ── 消費的 SSOT ──
5
+ * - 40 圓 = --field-height-lg 於 lg 密度(uiSize.spec.md「lg 密度」表);圓形 iconOnly。
6
+ * - 面 = bg-surface-raised + --elevation-200(elevation.spec.md 配對規則;不寫死白色)。
7
+ * - 外框 = AI 觸發鈕特調:錐形(環向)漸層描邊 2px(整數寬+環向漸層=正圓對稱;
8
+ * spec「FAB」節)。配色兩極取標誌兩緞帶家族(藍 258 / 土耳其藍 196 — 品牌資產常數,
9
+ * 同 AgentLogo 漸層停駐;2026-09-02 對定稿標誌覆核:兩極各落於藍 252-268 /
10
+ * 青 190-210 家族內 ✓)。
11
+ * - 內置 24 標誌(AgentLogo 簡化檔自動生效)。
12
+ * - 動畫:待機=靜止(=標誌 still 態,2026-09-02 全家族統一);有新訊=招喚態
13
+ * (標誌本體蓄勢,漣漪由邊框光圈代位:35% 拍點自邊框射出 r 21→27、寬 2.5、.35→0);
14
+ * 懸停=陰影升一級+微放大;皆 --motion-duration-overlay 過場。
15
+ * - 減動作:光圈屬常駐位移 loop → prefers-reduced-motion 全停(標誌內部自回靜止)。
16
+ */
17
+ import * as React from 'react';
18
+ export interface AgentFabProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {
19
+ /** 有新訊(招喚態):標誌蓄勢 + 邊框光圈呼出。 */
20
+ attention?: boolean;
21
+ }
22
+ declare const AgentFab: React.ForwardRefExoticComponent<AgentFabProps & React.RefAttributes<HTMLButtonElement>>;
23
+ export { AgentFab };
24
+ //# sourceMappingURL=agent-fab.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * AgentLogo — 智慧代理標誌與狀態動畫(AgentPanel 家族附屬資產)。
3
+ *
4
+ * ── 消費的 SSOT ──
5
+ * - 造型:user 提供之黃金比例莫比烏斯 SVG 定稿(內橢圓長短軸比 φ=1.618、軸角 121.717°;
6
+ * agent-panel.spec.md「AgentLogo」節)。漸層停駐色=品牌資產常數(色相落於 DS 藍 252-268 /
7
+ * 土耳其藍 190-210 家族;資產內嵌 oklch,非 semantic token — 詳 spec 同節)。
8
+ * - 狀態動畫: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 必同步此處。
12
+ * - 減動作:互動觸發必可停(WCAG 2.3.3);常駐 loop 全停 → 一律回靜止
13
+ * (agent-panel.spec.md「轉場與減動作」)。
14
+ */
15
+ import * as React from 'react';
16
+ /** 狀態:still 靜止(=待機)/ attract 招喚 / think 思考(=回覆中)。 */
17
+ export type AgentLogoState = 'still' | 'attract' | 'think';
18
+ export interface AgentLogoProps extends React.SVGAttributes<SVGSVGElement> {
19
+ /** 動態狀態;預設 still(靜止)。 */
20
+ state?: AgentLogoState;
21
+ /** 邊長 px;預設 24。≤24 自動切簡化造型(detail="auto")。 */
22
+ size?: number;
23
+ /** 造型細節檔;auto = size ≤ 24 用簡化版(去陰影提亮、兩停駐高對比)。 */
24
+ detail?: 'auto' | 'full' | 'simplified';
25
+ /**
26
+ * 招喚態漣漪;預設 true。AgentFab 置 false(按鈕內放不下漣漪,由邊框光圈代位 —
27
+ * spec「FAB」節),本體蓄勢(脹 1.07+吸氣微亮)不變。
28
+ */
29
+ ripple?: boolean;
30
+ /** 無障礙名稱;裝飾用途可省略(將標 aria-hidden)。 */
31
+ label?: string;
32
+ }
33
+ /**
34
+ * 常駐 loop 遵 prefers-reduced-motion 全停(嚴於 WCAG 2.3.3 條文)。
35
+ * @internal AgentPanel 家族內部共用(AgentFab 光圈同一策略)。
36
+ */
37
+ export declare function usePrefersReducedMotion(): boolean;
38
+ declare const AgentLogo: React.ForwardRefExoticComponent<AgentLogoProps & React.RefAttributes<SVGSVGElement>>;
39
+ export { AgentLogo };
40
+ //# sourceMappingURL=agent-logo.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,344 @@
1
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "../../lib/utils.js";
4
+ const BREATH_DUR = "3s";
5
+ const SWELL = "0.4 0.14 0.3 1";
6
+ 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 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";
10
+ 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
+ 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)"]
17
+ ];
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)"]
24
+ ];
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]
29
+ ];
30
+ 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]
34
+ ];
35
+ const BLUE_SIMPLE = [
36
+ [0, "oklch(.72 .15 252)"],
37
+ [1, "oklch(.35 .19 268)"]
38
+ ];
39
+ const TURQ_SIMPLE = [
40
+ [0, "oklch(.82 .12 190)"],
41
+ [1, "oklch(.44 .11 210)"]
42
+ ];
43
+ 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]
48
+ ];
49
+ function usePrefersReducedMotion() {
50
+ const [reduced, setReduced] = React.useState(false);
51
+ React.useEffect(() => {
52
+ const query = window.matchMedia("(prefers-reduced-motion: reduce)");
53
+ setReduced(query.matches);
54
+ const onChange = (event) => setReduced(event.matches);
55
+ query.addEventListener("change", onChange);
56
+ return () => query.removeEventListener("change", onChange);
57
+ }, []);
58
+ return reduced;
59
+ }
60
+ function GradientStops({ stops }) {
61
+ return /* @__PURE__ */ jsx(Fragment, { children: stops.map(([offset, color, opacity]) => /* @__PURE__ */ jsx(
62
+ "stop",
63
+ {
64
+ offset,
65
+ stopColor: color,
66
+ ...opacity !== void 0 ? { stopOpacity: opacity } : {}
67
+ },
68
+ offset
69
+ )) });
70
+ }
71
+ function GradientCounterSpin() {
72
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
73
+ /* @__PURE__ */ jsx(
74
+ "animateTransform",
75
+ {
76
+ attributeName: "gradientTransform",
77
+ type: "rotate",
78
+ values: "0 627 627;-90 627 627",
79
+ dur: "0.3s",
80
+ begin: "0s",
81
+ fill: "freeze",
82
+ calcMode: "spline",
83
+ keyTimes: "0;1",
84
+ keySplines: "0.6 0 1 1"
85
+ }
86
+ ),
87
+ /* @__PURE__ */ jsx(
88
+ "animateTransform",
89
+ {
90
+ attributeName: "gradientTransform",
91
+ type: "rotate",
92
+ values: "-90 627 627;-450 627 627",
93
+ dur: "0.6s",
94
+ begin: "0.3s",
95
+ repeatCount: "indefinite"
96
+ }
97
+ )
98
+ ] });
99
+ }
100
+ function HoleMorph({ from, round }) {
101
+ return /* @__PURE__ */ jsx(
102
+ "animate",
103
+ {
104
+ attributeName: "d",
105
+ values: `${from};${round};${from}`,
106
+ keyTimes: "0;.5;1",
107
+ dur: "6s",
108
+ repeatCount: "indefinite",
109
+ calcMode: "spline",
110
+ keySplines: `${SWELL};${SETTLE}`
111
+ }
112
+ );
113
+ }
114
+ function LogoBody({ ids, simplified, morph }) {
115
+ const turqMorph = morph ? /* @__PURE__ */ jsx(HoleMorph, { from: D_TURQ, round: D_TURQ_ROUND }) : null;
116
+ const blueMorph = morph ? /* @__PURE__ */ jsx(HoleMorph, { from: D_BLUE, round: D_BLUE_ROUND }) : null;
117
+ 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 }),
120
+ /* @__PURE__ */ jsx("path", { d: D_BLUE, fill: `url(#${ids.blue})`, children: blueMorph }),
121
+ !simplified && /* @__PURE__ */ jsx("path", { d: D_BLUE, fill: `url(#${ids.lift})`, children: blueMorph })
122
+ ] });
123
+ }
124
+ function InhaleOverlay({ morph, dur, keyTimes }) {
125
+ const turqMorph = morph ? /* @__PURE__ */ jsx(HoleMorph, { from: D_TURQ, round: D_TURQ_ROUND }) : null;
126
+ const blueMorph = morph ? /* @__PURE__ */ jsx(HoleMorph, { from: D_BLUE, round: D_BLUE_ROUND }) : null;
127
+ return /* @__PURE__ */ jsxs("g", { opacity: "0", pointerEvents: "none", children: [
128
+ /* @__PURE__ */ jsx(
129
+ "animate",
130
+ {
131
+ attributeName: "opacity",
132
+ values: "0;.14;0",
133
+ keyTimes,
134
+ dur,
135
+ repeatCount: "indefinite",
136
+ calcMode: "spline",
137
+ keySplines: `${SWELL};${SETTLE}`
138
+ }
139
+ ),
140
+ /* @__PURE__ */ jsx("path", { d: D_BLUE, fill: "#fff", children: blueMorph }),
141
+ /* @__PURE__ */ jsx("path", { d: D_TURQ, fill: "#fff", children: turqMorph })
142
+ ] });
143
+ }
144
+ const AgentLogo = React.forwardRef(
145
+ ({
146
+ state = "still",
147
+ size = 24,
148
+ detail = "auto",
149
+ ripple = true,
150
+ label,
151
+ className,
152
+ style,
153
+ ...props
154
+ }, ref) => {
155
+ const uid = React.useId().replace(/[^a-zA-Z0-9]/g, "");
156
+ const reduced = usePrefersReducedMotion();
157
+ const simplified = detail === "simplified" || detail === "auto" && size <= 24;
158
+ const effectiveState = reduced ? "still" : state;
159
+ const ids = {
160
+ blue: `${uid}bs`,
161
+ turq: `${uid}ts`,
162
+ under: `${uid}tu`,
163
+ lift: `${uid}bl`,
164
+ wave: `${uid}wg`,
165
+ mask: `${uid}wm`
166
+ };
167
+ const isThink = effectiveState === "think";
168
+ const isAttract = effectiveState === "attract";
169
+ const defs = /* @__PURE__ */ jsxs("defs", { children: [
170
+ /* @__PURE__ */ jsxs(
171
+ "linearGradient",
172
+ {
173
+ id: ids.blue,
174
+ gradientUnits: "userSpaceOnUse",
175
+ x1: "390",
176
+ y1: "1055",
177
+ x2: "770",
178
+ y2: "110",
179
+ children: [
180
+ /* @__PURE__ */ jsx(GradientStops, { stops: simplified ? BLUE_SIMPLE : BLUE_SURFACE }),
181
+ isThink && /* @__PURE__ */ jsx(GradientCounterSpin, {})
182
+ ]
183
+ }
184
+ ),
185
+ /* @__PURE__ */ jsxs(
186
+ "linearGradient",
187
+ {
188
+ id: ids.turq,
189
+ gradientUnits: "userSpaceOnUse",
190
+ x1: "990",
191
+ y1: "145",
192
+ x2: "650",
193
+ y2: "1090",
194
+ children: [
195
+ /* @__PURE__ */ jsx(GradientStops, { stops: simplified ? TURQ_SIMPLE : TURQ_SURFACE }),
196
+ isThink && /* @__PURE__ */ jsx(GradientCounterSpin, {})
197
+ ]
198
+ }
199
+ ),
200
+ !simplified && /* @__PURE__ */ jsxs(Fragment, { children: [
201
+ /* @__PURE__ */ jsx(
202
+ "radialGradient",
203
+ {
204
+ id: ids.under,
205
+ gradientUnits: "userSpaceOnUse",
206
+ cx: "490",
207
+ cy: "815",
208
+ r: "520",
209
+ children: /* @__PURE__ */ jsx(GradientStops, { stops: TURQ_UNDERSIDE })
210
+ }
211
+ ),
212
+ /* @__PURE__ */ jsx(
213
+ "radialGradient",
214
+ {
215
+ id: ids.lift,
216
+ gradientUnits: "userSpaceOnUse",
217
+ cx: "350",
218
+ cy: "930",
219
+ r: "510",
220
+ children: /* @__PURE__ */ jsx(GradientStops, { stops: BLUE_LIFT })
221
+ }
222
+ )
223
+ ] }),
224
+ isAttract && ripple && /* @__PURE__ */ jsxs(Fragment, { children: [
225
+ /* @__PURE__ */ jsx("radialGradient", { id: ids.wave, children: /* @__PURE__ */ jsx(GradientStops, { stops: WAVE_STOPS }) }),
226
+ /* @__PURE__ */ jsxs("mask", { id: ids.mask, maskUnits: "userSpaceOnUse", x: "-600", y: "-600", width: "2454", height: "2454", children: [
227
+ /* @__PURE__ */ jsx("rect", { x: "-600", y: "-600", width: "2454", height: "2454", fill: "#fff" }),
228
+ /* @__PURE__ */ jsx("circle", { cx: "627", cy: "627", r: "512", fill: "#000" })
229
+ ] })
230
+ ] })
231
+ ] });
232
+ const body = /* @__PURE__ */ jsx(LogoBody, { ids, simplified, morph: isThink });
233
+ let content;
234
+ if (isThink) {
235
+ 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
+ ),
261
+ /* @__PURE__ */ jsxs("g", { transform: "translate(-627 -627)", children: [
262
+ body,
263
+ /* @__PURE__ */ jsx(InhaleOverlay, { morph: true, dur: "6s", keyTimes: "0;.5;1" })
264
+ ] })
265
+ ] }) });
266
+ } else if (isAttract) {
267
+ content = /* @__PURE__ */ jsxs(Fragment, { children: [
268
+ ripple && /* @__PURE__ */ jsx("g", { mask: `url(#${ids.mask})`, children: /* @__PURE__ */ jsxs("circle", { cx: "627", cy: "627", r: "560", fill: `url(#${ids.wave})`, opacity: "0", children: [
269
+ /* @__PURE__ */ jsx(
270
+ "animate",
271
+ {
272
+ attributeName: "r",
273
+ values: "560;560;830",
274
+ keyTimes: "0;.35;1",
275
+ dur: BREATH_DUR,
276
+ repeatCount: "indefinite",
277
+ calcMode: "spline",
278
+ keySplines: `0 0 1 1;${SETTLE}`
279
+ }
280
+ ),
281
+ /* @__PURE__ */ jsx(
282
+ "animate",
283
+ {
284
+ attributeName: "opacity",
285
+ values: "0;1;0",
286
+ keyTimes: "0;.35;1",
287
+ dur: BREATH_DUR,
288
+ repeatCount: "indefinite",
289
+ calcMode: "spline",
290
+ keySplines: `0 0 1 1;${SETTLE}`
291
+ }
292
+ )
293
+ ] }) }),
294
+ /* @__PURE__ */ jsx("g", { transform: "translate(627 627)", children: /* @__PURE__ */ jsxs("g", { children: [
295
+ /* @__PURE__ */ jsx(
296
+ "animateTransform",
297
+ {
298
+ attributeName: "transform",
299
+ type: "scale",
300
+ values: "1;1.07;1",
301
+ keyTimes: "0;.35;1",
302
+ dur: BREATH_DUR,
303
+ repeatCount: "indefinite",
304
+ calcMode: "spline",
305
+ keySplines: `${SWELL};${SETTLE}`
306
+ }
307
+ ),
308
+ /* @__PURE__ */ jsxs("g", { transform: "translate(-627 -627)", children: [
309
+ body,
310
+ /* @__PURE__ */ jsx(InhaleOverlay, { morph: false, dur: BREATH_DUR, keyTimes: "0;.35;1" })
311
+ ] })
312
+ ] }) })
313
+ ] });
314
+ } else {
315
+ content = body;
316
+ }
317
+ return /* @__PURE__ */ jsxs(
318
+ "svg",
319
+ {
320
+ ref,
321
+ width: size,
322
+ height: size,
323
+ viewBox: "0 0 1254 1254",
324
+ className: cn("shrink-0", className),
325
+ style: { overflow: isAttract && ripple ? "visible" : void 0, ...style },
326
+ role: label ? "img" : void 0,
327
+ "aria-label": label,
328
+ "aria-hidden": label ? void 0 : true,
329
+ "data-state": effectiveState,
330
+ ...props,
331
+ children: [
332
+ defs,
333
+ content
334
+ ]
335
+ }
336
+ );
337
+ }
338
+ );
339
+ AgentLogo.displayName = "AgentLogo";
340
+ export {
341
+ AgentLogo,
342
+ usePrefersReducedMotion
343
+ };
344
+ //# sourceMappingURL=agent-logo.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * AgentPanel 家族 — 智慧代理面板(9 元件;附屬資產 AgentLogo/AgentFab 另檔)。
3
+ *
4
+ * ── 消費的 SSOT ──
5
+ * - 容器:右側欄=bg-surface + border-l border-divider(app-shell aside 前例);
6
+ * 寬 --agent-panel-width(uiSize.css);開合 --motion-duration-surface。
7
+ * - 標題列:ChromeHeader(header-canonical;chrome 內控件一律 sm);品牌區=gap-2+24 標誌;
8
+ * chevron=ItemInlineActionButton(item-anatomy);ButtonDivider 於 gap-2 cluster(action-bar 規則 3)。
9
+ * - 歷史浮層:Popover+Command+MenuItem(SelectMenu 同源 primitives;metrics 同 select-menu.tsx);
10
+ * 行內動作=ItemInlineAction(inline-action canonical);思考列=CircularProgress 16。
11
+ * - 訊息:氣泡 bg-secondary/rounded-md/8/12;附件=Chip assist 分支(chip.spec.md);
12
+ * 輪距 40=8+24(Button text xs)+8。
13
+ * - 思考塊:Radix Collapsible+animate-accordion(base.css;Sidebar 同法);
14
+ * 微光=shadcn shimmer 參數(agent-panel.css;--motion-duration-shimmer)。
15
+ * - 輸入盒:欄位家族內距(--field-control-py-md/--field-px/text-body;32 等高鐵律);
16
+ * 附件列=Tag md+OverflowIndicator;送出/停止=Button primary xs。
17
+ * - 決策卡:SurfaceHeader(compact 45)+SurfaceFooter(overlay-surface);RadioGroup md
18
+ * (Popover all-sm 律之拍板豁免;footer 鈕 sm 守律);淡入+下滑 --motion-duration-overlay。
19
+ * - 改名/刪除:Dialog(header md+X;body Field+Input;footer md 鈕;刪除=primary+danger;
20
+ * form-validation 更新類規則)。
21
+ * - 空狀態:Empty icon slot 接 AgentLogo 招喚態。
22
+ * 全表:agent-panel.spec.md。
23
+ */
24
+ import * as React from 'react';
25
+ import { type AgentLogoState } from './agent-logo';
26
+ import './agent-panel.css';
27
+ export interface AgentPanelProps extends React.HTMLAttributes<HTMLDivElement> {
28
+ /** 面板開合;false 時不渲染。 */
29
+ open?: boolean;
30
+ }
31
+ declare const AgentPanel: React.ForwardRefExoticComponent<AgentPanelProps & React.RefAttributes<HTMLDivElement>>;
32
+ export interface AgentConversationSummary {
33
+ id: string;
34
+ title: string;
35
+ /** 分組標題(如「今天」「過去 7 天」);同組相鄰排列。 */
36
+ group?: string;
37
+ /** 代理仍在回覆:列首圖示原地換 CircularProgress 16,等寬等高不動版面。 */
38
+ thinking?: boolean;
39
+ }
40
+ export interface AgentPanelHeaderProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title'> {
41
+ /** 目前對話標題。 */
42
+ title: string;
43
+ /** 歷史浮層搜尋 placeholder(i18n override)。 */
44
+ historySearchPlaceholder?: string;
45
+ /** 歷史浮層無結果文案(i18n override)。 */
46
+ historyEmptyText?: string;
47
+ /** 標誌狀態(代理思考中傳 "think")。 */
48
+ logoState?: AgentLogoState;
49
+ /** 歷史對話清單;省略=不顯示 chevron。 */
50
+ conversations?: AgentConversationSummary[];
51
+ /** 目前對話 id(歷史清單高亮)。 */
52
+ activeConversationId?: string;
53
+ onSelectConversation?: (id: string) => void;
54
+ /** 改名確認(Dialog 流程由元件內建)。 */
55
+ onRenameConversation?: (id: string, title: string) => void;
56
+ /** 刪除確認(Dialog 流程由元件內建)。 */
57
+ onDeleteConversation?: (id: string) => void;
58
+ onNewConversation?: () => void;
59
+ onClose?: () => void;
60
+ }
61
+ declare const AgentPanelHeader: React.ForwardRefExoticComponent<AgentPanelHeaderProps & React.RefAttributes<HTMLElement>>;
62
+ export type AgentConversationProps = React.HTMLAttributes<HTMLDivElement>;
63
+ declare const AgentConversation: React.ForwardRefExoticComponent<AgentConversationProps & React.RefAttributes<HTMLDivElement>>;
64
+ export interface AgentAttachment {
65
+ id: string;
66
+ label: string;
67
+ }
68
+ export interface AgentMessageProps extends React.HTMLAttributes<HTMLDivElement> {
69
+ /** 訊息角色:user=我方氣泡靠右;agent=無氣泡全寬。 */
70
+ role?: 'user' | 'agent';
71
+ /** 氣泡內文字上方的附件(送出後視覺=Chip assist 分支)。 */
72
+ attachments?: AgentAttachment[];
73
+ onAttachmentClick?: (attachment: AgentAttachment) => void;
74
+ /** 訊息工具列(AgentToolbar);絕對定位於輪距內。 */
75
+ toolbar?: React.ReactNode;
76
+ }
77
+ declare const AgentMessage: React.ForwardRefExoticComponent<AgentMessageProps & React.RefAttributes<HTMLDivElement>>;
78
+ export interface AgentThinkingProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {
79
+ /** 進行中:標題「思考中」+微光;完成:「思考過程」靜態。 */
80
+ thinking?: boolean;
81
+ /** 已完成的步驟(靜態)。 */
82
+ steps?: React.ReactNode[];
83
+ /** 正在寫入的最新一行(僅此行與標題套微光)。 */
84
+ currentStep?: React.ReactNode;
85
+ /** 開合(未受控時:回覆中自動展開、回覆完自動收合)。 */
86
+ open?: boolean;
87
+ onOpenChange?: (open: boolean) => void;
88
+ }
89
+ declare const AgentThinking: React.ForwardRefExoticComponent<AgentThinkingProps & React.RefAttributes<HTMLDivElement>>;
90
+ export interface AgentToolbarProps extends React.HTMLAttributes<HTMLDivElement> {
91
+ /** 常駐顯示(代理最後一則);其他訊息=懸停淡入。 */
92
+ pinned?: boolean;
93
+ onCopy?: () => void;
94
+ onLike?: () => void;
95
+ onDislike?: () => void;
96
+ }
97
+ declare const AgentToolbar: React.ForwardRefExoticComponent<AgentToolbarProps & React.RefAttributes<HTMLDivElement>>;
98
+ export interface AgentPromptAttachment {
99
+ id: string;
100
+ label: string;
101
+ }
102
+ export interface AgentPromptInputProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSubmit'> {
103
+ value: string;
104
+ onValueChange: (value: string) => void;
105
+ onSubmit?: () => void;
106
+ /** 代理進行中:送出鈕同位換停止(實心正方),0.15s 淡切。 */
107
+ busy?: boolean;
108
+ onStop?: () => void;
109
+ /** 輸入中附件(Tag md,可移除;送出後於訊息內轉 Chip assist 視覺)。 */
110
+ attachments?: AgentPromptAttachment[];
111
+ onRemoveAttachment?: (attachment: AgentPromptAttachment) => void;
112
+ onAddAttachment?: () => void;
113
+ placeholder?: string;
114
+ }
115
+ declare const AgentPromptInput: React.ForwardRefExoticComponent<AgentPromptInputProps & React.RefAttributes<HTMLDivElement>>;
116
+ export interface AgentDecisionOption {
117
+ value: string;
118
+ label: string;
119
+ description?: string;
120
+ }
121
+ export interface AgentDecisionQuestion {
122
+ id: string;
123
+ label: string;
124
+ /** 2-4 具名選項;Other 自由輸入由元件必備附加。 */
125
+ options: AgentDecisionOption[];
126
+ /** 預選最佳解。 */
127
+ defaultValue?: string;
128
+ }
129
+ export interface AgentDecisionCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSubmit' | 'title'> {
130
+ title: string;
131
+ /** ≤3 題;一題一問。 */
132
+ questions: AgentDecisionQuestion[];
133
+ /** 送出:answers[questionId] = 選項值或 Other 文字。 */
134
+ onSubmit?: (answers: Record<string, string>) => void;
135
+ /** 跳過(Skip 鈕與 header × 同一行為=單一語意雙入口)。 */
136
+ onSkip?: () => void;
137
+ }
138
+ declare const AgentDecisionCard: React.ForwardRefExoticComponent<AgentDecisionCardProps & React.RefAttributes<HTMLDivElement>>;
139
+ export interface AgentDecisionSummaryProps extends React.HTMLAttributes<HTMLDivElement> {
140
+ /** [問題, 答案] 配對(靜態回執)。 */
141
+ entries: Array<{
142
+ question: string;
143
+ answer: string;
144
+ }>;
145
+ }
146
+ declare const AgentDecisionSummary: React.ForwardRefExoticComponent<AgentDecisionSummaryProps & React.RefAttributes<HTMLDivElement>>;
147
+ export { AgentPanel, AgentPanelHeader, AgentConversation, AgentMessage, AgentThinking, AgentToolbar, AgentPromptInput, AgentDecisionCard, AgentDecisionSummary, };
148
+ //# sourceMappingURL=agent-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-panel.d.ts","sourceRoot":"","sources":["../../../src/components/AgentPanel/agent-panel.tsx"],"names":[],"mappings":"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"}