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

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.
@@ -333,7 +333,7 @@ const AgentMessage = React.forwardRef(
333
333
  ] : "w-full [&_a]:text-primary [&_a:hover]:text-primary-hover [&_a]:underline-offset-2 [&_a:hover]:underline"
334
334
  ),
335
335
  children: [
336
- attachments && attachments.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-2 flex flex-wrap gap-2", children: attachments.map((attachment) => /* @__PURE__ */ jsx(
336
+ attachments && attachments.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-2 flex flex-wrap gap-1", children: attachments.map((attachment) => /* @__PURE__ */ jsx(
337
337
  Chip,
338
338
  {
339
339
  variant: "assist",
@@ -1 +1 @@
1
- {"version":3,"file":"agent-panel.js","sources":["../../../src/components/AgentPanel/agent-panel.tsx"],"sourcesContent":["// code-quality-allow: file-size foundational composite family(9 元件一家族檔,同 Sidebar 前例)\n/**\n * AgentPanel 家族 — 智慧代理面板(9 元件;附屬資產 AgentLogo/AgentFab 另檔)。\n *\n * ── 消費的 SSOT ──\n * - 容器:右側欄=bg-surface + border-l border-divider(app-shell aside 前例);\n * 寬 --agent-panel-width(uiSize.css);開合 --motion-duration-surface。\n * - 標題列:ChromeHeader(header-canonical;chrome 內控件一律 sm);品牌區=gap-2+24 標誌;\n * chevron=ItemInlineActionButton(item-anatomy);ButtonDivider 於 gap-2 cluster(action-bar 規則 3)。\n * - 歷史浮層:Popover+Command+MenuItem(SelectMenu 同源 primitives;metrics 同 select-menu.tsx);\n * 行內動作=ItemInlineAction(inline-action canonical);思考列=CircularProgress 16。\n * - 訊息:氣泡 bg-secondary/rounded-md/8/12;附件=Chip assist 分支(chip.spec.md);\n * 輪距 40=8+24(Button text xs)+8。\n * - 思考塊:Radix Collapsible+animate-accordion(base.css;Sidebar 同法);\n * 微光=shadcn shimmer 參數(agent-panel.css;--motion-duration-shimmer)。\n * - 輸入盒:欄位家族內距(--field-control-py-md/--field-px/text-body;32 等高鐵律);\n * 附件列=Tag md+OverflowIndicator;送出/停止=Button primary xs。\n * - 決策卡:SurfaceHeader(compact 45)+SurfaceFooter(overlay-surface);RadioGroup md\n * (Popover all-sm 律之拍板豁免;footer 鈕 sm 守律);淡入+下滑 --motion-duration-overlay。\n * - 改名/刪除:Dialog(header md+X;body Field+Input;footer md 鈕;刪除=primary+danger;\n * form-validation 更新類規則)。\n * - 空狀態:Empty icon slot 接 AgentLogo 招喚態。\n * 全表:agent-panel.spec.md。\n */\nimport * as React from 'react'\nimport * as CollapsiblePrimitive from '@radix-ui/react-collapsible'\nimport {\n ArrowUp,\n ChevronDown,\n Copy,\n MessageSquare,\n Pencil,\n Plus,\n Square,\n ThumbsDown,\n ThumbsUp,\n Trash2,\n X as XIcon,\n} from 'lucide-react'\nimport { cn } from '@/lib/utils'\nimport { Button } from '@/design-system/components/Button/button'\nimport { ButtonDivider } from '@/design-system/components/Button/button-group'\nimport { ChromeHeader } from '@/design-system/patterns/header-canonical/chrome-header'\nimport {\n SurfaceHeader,\n SurfaceFooter,\n COMPACT_HEADER_SLOT,\n} from '@/design-system/patterns/overlay-surface/overlay-surface'\nimport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from '@/design-system/components/Popover/popover'\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from '@/design-system/components/Command/command'\nimport { MenuItem } from '@/design-system/components/Menu/menu-item'\nimport { ItemInlineAction } from '@/design-system/patterns/element-anatomy/item-anatomy'\nimport { CircularProgress } from '@/design-system/components/CircularProgress/circular-progress'\nimport { RadioGroup, RadioGroupItem } from '@/design-system/components/RadioGroup/radio-group'\nimport { Chip } from '@/design-system/components/Chip/chip'\nimport { Tag } from '@/design-system/components/Tag/tag'\nimport { Input } from '@/design-system/components/Input/input'\nimport { Field, FieldLabel } from '@/design-system/components/Field/field'\nimport {\n Dialog,\n DialogBody,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/design-system/components/Dialog/dialog'\nimport { ScrollArea } from '@/design-system/components/ScrollArea/scroll-area'\nimport { AgentLogo, type AgentLogoState } from './agent-logo'\nimport './agent-panel.css'\n\n/* ────────────────────────────────────────────────────────────────────────────\n * 1. AgentPanel(容器)\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface AgentPanelProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 面板開合;false 時不渲染。 */\n open?: boolean\n}\n\nconst AgentPanel = React.forwardRef<HTMLDivElement, AgentPanelProps>(\n ({ open = true, className, children, ...props }, ref) => {\n if (!open) return null\n return (\n <div\n ref={ref}\n role=\"complementary\"\n aria-label=\"智慧代理\" // i18n-allow: DS 預設,props 展開在後可覆寫\n className={cn(\n 'relative flex h-full min-h-0 w-[var(--agent-panel-width)] shrink-0 flex-col overflow-hidden',\n 'border-l border-divider bg-surface',\n 'animate-in fade-in-0 slide-in-from-right-4 duration-[var(--motion-duration-surface)] motion-reduce:animate-none',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n )\n },\n)\nAgentPanel.displayName = 'AgentPanel'\n\n/* ────────────────────────────────────────────────────────────────────────────\n * 2. AgentPanelHeader(標題列)+ 歷史浮層 / 改名 / 刪除\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface AgentConversationSummary {\n id: string\n title: string\n /** 分組標題(如「今天」「過去 7 天」);同組相鄰排列。 */\n group?: string\n /** 代理仍在回覆:列首圖示原地換 CircularProgress 16,等寬等高不動版面。 */\n thinking?: boolean\n}\n\nexport interface AgentPanelHeaderProps\n extends Omit<React.HTMLAttributes<HTMLElement>, 'title'> {\n /** 目前對話標題。 */\n title: string\n /** 歷史浮層搜尋 placeholder(i18n override)。 */\n historySearchPlaceholder?: string\n /** 歷史浮層無結果文案(i18n override)。 */\n historyEmptyText?: string\n /** 標誌狀態(代理思考中傳 \"think\")。 */\n logoState?: AgentLogoState\n /** 歷史對話清單;省略=不顯示 chevron。 */\n conversations?: AgentConversationSummary[]\n /** 目前對話 id(歷史清單高亮)。 */\n activeConversationId?: string\n onSelectConversation?: (id: string) => void\n /** 改名確認(Dialog 流程由元件內建)。 */\n onRenameConversation?: (id: string, title: string) => void\n /** 刪除確認(Dialog 流程由元件內建)。 */\n onDeleteConversation?: (id: string) => void\n onNewConversation?: () => void\n onClose?: () => void\n}\n\n/** 歷史列:MenuItem + 懸停浮出行內動作(改名/刪除);思考中列首換進度環。 */\nfunction HistoryRow({\n conversation,\n selected,\n onSelect,\n onRename,\n onDelete,\n}: {\n conversation: AgentConversationSummary\n selected: boolean\n onSelect: () => void\n onRename?: () => void\n onDelete?: () => void\n}) {\n const actions = (onRename || onDelete) && (\n <span\n className={cn(\n 'hidden items-center group-hover/agent-history:flex group-focus-within/agent-history:flex',\n 'animate-in fade-in-0 duration-[var(--motion-duration-overlay)]',\n )}\n >\n {onRename && (\n <ItemInlineAction\n action={{\n icon: Pencil,\n label: '改名', // i18n-allow: DS 預設文案(Dialog「關閉」同前例)\n onClick: (e) => {\n e?.stopPropagation()\n onRename()\n },\n }}\n />\n )}\n {onDelete && (\n <ItemInlineAction\n action={{\n icon: Trash2,\n label: '刪除', // i18n-allow: DS 預設文案(Dialog「關閉」同前例)\n onClick: (e) => {\n e?.stopPropagation()\n onDelete()\n },\n }}\n />\n )}\n </span>\n )\n return (\n <CommandItem\n value={`${conversation.title}\u0000${conversation.id}`}\n onSelect={onSelect}\n className=\"group/agent-history p-0\"\n >\n <MenuItem\n selected={selected}\n startContent={\n conversation.thinking ? (\n <CircularProgress size={16} aria-label=\"回覆中\" /> // i18n-allow: DS 預設\n ) : (\n <MessageSquare size={16} aria-hidden className=\"text-fg-muted\" />\n )\n }\n endContent={actions}\n >\n {conversation.title}\n </MenuItem>\n </CommandItem>\n )\n}\n\nconst AgentPanelHeader = React.forwardRef<HTMLElement, AgentPanelHeaderProps>(\n (\n {\n title,\n logoState = 'still',\n historySearchPlaceholder = '搜尋對話', // i18n-allow: DS 預設文案,prop 可覆寫\n historyEmptyText = '沒有符合的對話', // i18n-allow: DS 預設文案,prop 可覆寫\n conversations,\n activeConversationId,\n onSelectConversation,\n onRenameConversation,\n onDeleteConversation,\n onNewConversation,\n onClose,\n className,\n ...props\n },\n ref,\n ) => {\n const [historyOpen, setHistoryOpen] = React.useState(false)\n const [renameTarget, setRenameTarget] = React.useState<AgentConversationSummary | null>(null)\n const [deleteTarget, setDeleteTarget] = React.useState<AgentConversationSummary | null>(null)\n\n const groups = React.useMemo(() => {\n const order: string[] = []\n const byGroup = new Map<string, AgentConversationSummary[]>()\n for (const item of conversations ?? []) {\n const key = item.group ?? ''\n if (!byGroup.has(key)) {\n byGroup.set(key, [])\n order.push(key)\n }\n byGroup.get(key)!.push(item)\n }\n return order.map((key) => ({ label: key, items: byGroup.get(key)! }))\n }, [conversations])\n\n return (\n <ChromeHeader ref={ref} className={cn('bg-surface', className)} {...props}>\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <AgentLogo state={logoState} size={24} />\n <span className=\"truncate text-body-lg font-medium\">{title}</span>\n {conversations && (\n <Popover open={historyOpen} onOpenChange={setHistoryOpen}>\n <PopoverTrigger asChild>\n <ItemInlineAction\n action={{ icon: ChevronDown, label: '歷史對話', onClick: () => {} }} // i18n-allow: DS 預設文案(Dialog「關閉」同前例)\n aria-haspopup=\"menu\"\n aria-expanded={historyOpen}\n />\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n sideOffset={8}\n className=\"w-auto min-w-60 overflow-hidden rounded-lg border-border p-0\"\n style={{ boxShadow: 'var(--elevation-200)' }}\n >\n <Command>\n <CommandInput\n placeholder={historySearchPlaceholder}\n aria-label={historySearchPlaceholder}\n />\n <CommandList>\n <CommandEmpty>{historyEmptyText}</CommandEmpty>\n {groups.map(({ label, items }) => (\n <CommandGroup key={label || '(未分組)'} className=\"p-0 py-2\"> // i18n-allow: DS 預設文案(Dialog「關閉」同前例)\n {label && <MenuItem header>{label}</MenuItem>}\n {items.map((conversation) => (\n <HistoryRow\n key={conversation.id}\n conversation={conversation}\n selected={conversation.id === activeConversationId}\n onSelect={() => {\n onSelectConversation?.(conversation.id)\n setHistoryOpen(false)\n }}\n onRename={\n onRenameConversation\n ? () => setRenameTarget(conversation)\n : undefined\n }\n onDelete={\n onDeleteConversation\n ? () => setDeleteTarget(conversation)\n : undefined\n }\n />\n ))}\n </CommandGroup>\n ))}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {onNewConversation && (\n <Button\n variant=\"text\"\n size=\"sm\"\n iconOnly\n startIcon={Plus}\n aria-label=\"新對話\" // i18n-allow: DS 預設文案(Dialog「關閉」同前例)\n onClick={onNewConversation}\n />\n )}\n {onClose && (\n <>\n {onNewConversation && <ButtonDivider />}\n <Button dismiss size=\"sm\" startIcon={XIcon} aria-label=\"關閉面板\" onClick={onClose} />\n </>\n )}\n </div>\n {renameTarget && (\n <AgentRenameDialog\n conversation={renameTarget}\n onOpenChange={(next) => !next && setRenameTarget(null)}\n onConfirm={(nextTitle) => {\n onRenameConversation?.(renameTarget.id, nextTitle)\n setRenameTarget(null)\n }}\n />\n )}\n {deleteTarget && (\n <Dialog open onOpenChange={(next) => !next && setDeleteTarget(null)}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>刪除對話</DialogTitle> // i18n-allow: DS 預設文案(Dialog「關閉」同前例)\n </DialogHeader>\n <DialogBody>\n 確定刪除「{deleteTarget.title}」?此動作立即生效且不可復原。\n </DialogBody>\n <DialogFooter>\n <Button variant=\"tertiary\" onClick={() => setDeleteTarget(null)}>\n 取消\n </Button>\n <Button\n variant=\"primary\"\n danger\n onClick={() => {\n onDeleteConversation?.(deleteTarget.id)\n setDeleteTarget(null)\n }}\n >\n 刪除\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )}\n </ChromeHeader>\n )\n },\n)\nAgentPanelHeader.displayName = 'AgentPanelHeader'\n\n/** 改名 Dialog:Field+Input 預填全選;儲存=更新類 dirty 規則;Enter=blur、Esc=回復。 */\nfunction AgentRenameDialog({\n conversation,\n onOpenChange,\n onConfirm,\n}: {\n conversation: AgentConversationSummary\n onOpenChange: (open: boolean) => void\n onConfirm: (title: string) => void\n}) {\n const [value, setValue] = React.useState(conversation.title)\n const dirty = value !== conversation.title\n return (\n <Dialog open onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>改名對話</DialogTitle> // i18n-allow: DS 預設文案(Dialog「關閉」同前例)\n </DialogHeader>\n <DialogBody>\n <Field>\n <FieldLabel>名稱</FieldLabel>\n <Input\n autoFocus\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onFocus={(e) => e.currentTarget.select()}\n onKeyDown={(e) => {\n // form-validation:Enter=等同 blur;Esc=回復原值不觸發驗證。\n if (e.key === 'Enter') e.currentTarget.blur()\n if (e.key === 'Escape') {\n e.stopPropagation()\n setValue(conversation.title)\n }\n }}\n />\n </Field>\n </DialogBody>\n <DialogFooter>\n <Button variant=\"tertiary\" onClick={() => onOpenChange(false)}>\n 取消\n </Button>\n <Button variant=\"primary\" disabled={!dirty} onClick={() => onConfirm(value)}>\n 儲存\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n\n/* ────────────────────────────────────────────────────────────────────────────\n * 3. AgentConversation(訊息卷軸區)\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport type AgentConversationProps = React.HTMLAttributes<HTMLDivElement>\n\nconst AgentConversation = React.forwardRef<HTMLDivElement, AgentConversationProps>(\n ({ className, children, ...props }, ref) => (\n // 捲軸必用 ScrollArea(跨 OS 一致;Dialog body 同法)。\n <ScrollArea fillX className=\"min-h-0 flex-1\">\n <div\n ref={ref}\n role=\"log\"\n aria-live=\"polite\"\n className={cn(\n // 輪距 40 = 8 + 24(工具列)+ 8;工具列絕對定位於輪距內,出現不推擠。\n 'flex flex-col gap-10 p-[var(--layout-space-loose)]',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </ScrollArea>\n ),\n)\nAgentConversation.displayName = 'AgentConversation'\n\n/* ────────────────────────────────────────────────────────────────────────────\n * 4. AgentMessage(訊息)\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface AgentAttachment {\n id: string\n label: string\n}\n\nexport interface AgentMessageProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 訊息角色:user=我方氣泡靠右;agent=無氣泡全寬。 */\n role?: 'user' | 'agent'\n /** 氣泡內文字上方的附件(送出後視覺=Chip assist 分支)。 */\n attachments?: AgentAttachment[]\n onAttachmentClick?: (attachment: AgentAttachment) => void\n /** 訊息工具列(AgentToolbar);絕對定位於輪距內。 */\n toolbar?: React.ReactNode\n}\n\nconst AgentMessage = React.forwardRef<HTMLDivElement, AgentMessageProps>(\n (\n { role = 'agent', attachments, onAttachmentClick, toolbar, className, children, ...props },\n ref,\n ) => {\n const isUser = role === 'user'\n return (\n <div\n ref={ref}\n className={cn('group/agent-message relative', isUser && 'flex justify-end', className)}\n {...props}\n >\n <div\n className={cn(\n 'text-body text-foreground',\n isUser\n ? [\n 'max-w-[85%] rounded-md bg-secondary px-3 py-2',\n 'animate-in fade-in-0 slide-in-from-bottom-2 duration-[var(--motion-duration-overlay)] motion-reduce:animate-none',\n ]\n : 'w-full [&_a]:text-primary [&_a:hover]:text-primary-hover [&_a]:underline-offset-2 [&_a:hover]:underline',\n )}\n >\n {attachments && attachments.length > 0 && (\n <div className=\"mb-2 flex flex-wrap gap-2\">\n {attachments.map((attachment) => (\n <Chip\n key={attachment.id}\n variant=\"assist\"\n aria-label={`附件:${attachment.label}`}\n onClick={() => onAttachmentClick?.(attachment)}\n >\n {attachment.label}\n </Chip>\n ))}\n </div>\n )}\n {children}\n </div>\n {toolbar}\n </div>\n )\n },\n)\nAgentMessage.displayName = 'AgentMessage'\n\n/* ────────────────────────────────────────────────────────────────────────────\n * 5. AgentThinking(思考塊)\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface AgentThinkingProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** 進行中:標題「思考中」+微光;完成:「思考過程」靜態。 */\n thinking?: boolean\n /** 已完成的步驟(靜態)。 */\n steps?: React.ReactNode[]\n /** 正在寫入的最新一行(僅此行與標題套微光)。 */\n currentStep?: React.ReactNode\n /** 開合(未受控時:回覆中自動展開、回覆完自動收合)。 */\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\nconst AgentThinking = React.forwardRef<HTMLDivElement, AgentThinkingProps>(\n ({ thinking = false, steps, currentStep, open, onOpenChange, className, ...props }, ref) => {\n // 非受控:AI 回覆中自動展開、回覆完自動收合(拍板;三套元件庫一致慣例)。\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(thinking)\n React.useEffect(() => {\n if (open === undefined) setUncontrolledOpen(thinking)\n }, [thinking, open])\n const resolvedOpen = open ?? uncontrolledOpen\n const handleOpenChange = (next: boolean) => {\n setUncontrolledOpen(next)\n onOpenChange?.(next)\n }\n return (\n <CollapsiblePrimitive.Root\n ref={ref}\n open={resolvedOpen}\n onOpenChange={handleOpenChange}\n className={cn('text-body', className)}\n {...props}\n >\n <CollapsiblePrimitive.Trigger\n className={cn(\n 'group/agent-thinking flex cursor-pointer items-center gap-1 text-fg-secondary hover:text-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm',\n )}\n >\n <span className={cn(thinking && 'agent-shimmer')}>\n {thinking ? '思考中…' : '思考過程'}\n </span>\n <ChevronDown\n size={16}\n aria-hidden\n className=\"transition-transform duration-150 motion-reduce:duration-0 group-data-[state=open]/agent-thinking:rotate-180\"\n />\n </CollapsiblePrimitive.Trigger>\n <CollapsiblePrimitive.Content\n className=\"overflow-hidden data-[state=open]:animate-accordion-down data-[state=closed]:animate-accordion-up\"\n >\n <div className=\"mt-2 flex flex-col gap-1 border-l border-divider pl-3 text-fg-muted\">\n {steps?.map((step, index) => <div key={index}>{step}</div>)}\n {currentStep != null && (\n <div className={cn(thinking && 'agent-shimmer')}>{currentStep}</div>\n )}\n </div>\n </CollapsiblePrimitive.Content>\n </CollapsiblePrimitive.Root>\n )\n },\n)\nAgentThinking.displayName = 'AgentThinking'\n\n/* ────────────────────────────────────────────────────────────────────────────\n * 6. AgentToolbar(訊息工具列)\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface AgentToolbarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 常駐顯示(代理最後一則);其他訊息=懸停淡入。 */\n pinned?: boolean\n onCopy?: () => void\n onLike?: () => void\n onDislike?: () => void\n}\n\nconst AgentToolbar = React.forwardRef<HTMLDivElement, AgentToolbarProps>(\n ({ pinned = false, onCopy, onLike, onDislike, className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'absolute left-0 top-full mt-2 flex items-center gap-2',\n 'transition-opacity duration-[var(--motion-duration-overlay)] motion-reduce:transition-none',\n pinned\n ? 'opacity-100'\n : 'opacity-0 group-hover/agent-message:opacity-100 focus-within:opacity-100',\n className,\n )}\n {...props}\n >\n {onCopy && (\n <Button variant=\"text\" size=\"xs\" iconOnly startIcon={Copy} aria-label=\"複製\" onClick={onCopy} />\n )}\n {onCopy && (onLike || onDislike) && <ButtonDivider />}\n {onLike && (\n <Button variant=\"text\" size=\"xs\" iconOnly startIcon={ThumbsUp} aria-label=\"讚\" onClick={onLike} />\n )}\n {onDislike && (\n <Button\n variant=\"text\"\n size=\"xs\"\n iconOnly\n startIcon={ThumbsDown}\n aria-label=\"倒讚\"\n onClick={onDislike}\n />\n )}\n {children}\n </div>\n ),\n)\nAgentToolbar.displayName = 'AgentToolbar'\n\n/* ────────────────────────────────────────────────────────────────────────────\n * 7. AgentPromptInput(複合輸入盒)\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface AgentPromptAttachment {\n id: string\n label: string\n}\n\nexport interface AgentPromptInputProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSubmit'> {\n value: string\n onValueChange: (value: string) => void\n onSubmit?: () => void\n /** 代理進行中:送出鈕同位換停止(實心正方),0.15s 淡切。 */\n busy?: boolean\n onStop?: () => void\n /** 輸入中附件(Tag md,可移除;送出後於訊息內轉 Chip assist 視覺)。 */\n attachments?: AgentPromptAttachment[]\n onRemoveAttachment?: (attachment: AgentPromptAttachment) => void\n onAddAttachment?: () => void\n placeholder?: string\n}\n\nconst AgentPromptInput = React.forwardRef<HTMLDivElement, AgentPromptInputProps>(\n (\n {\n value,\n onValueChange,\n onSubmit,\n busy = false,\n onStop,\n attachments,\n onRemoveAttachment,\n onAddAttachment,\n placeholder = '輸入訊息…',\n className,\n ...props\n },\n ref,\n ) => {\n const canSubmit = value.trim().length > 0\n const submit = () => {\n if (busy || !canSubmit) return\n onSubmit?.()\n }\n return (\n <div\n ref={ref}\n className={cn(\n 'm-[var(--layout-space-loose)] mt-0 shrink-0 rounded-md border border-border bg-surface',\n 'focus-within:border-border-hover transition-colors duration-150',\n className,\n )}\n {...props}\n >\n {attachments && attachments.length > 0 && (\n // 附件列:Tag 相互間距 4、距內緣 4(28 高)。\n <div className=\"flex flex-wrap items-center gap-1 px-1 pt-1\">\n {attachments.map((attachment) => (\n <Tag\n key={attachment.id}\n size=\"md\"\n onRemove={\n onRemoveAttachment ? () => onRemoveAttachment(attachment) : undefined\n }\n >\n {attachment.label}\n </Tag>\n ))}\n </div>\n )}\n <textarea\n value={value}\n onChange={(e) => onValueChange(e.target.value)}\n onKeyDown={(e) => {\n // 按 Enter 送出、Shift+Enter 換行(拍板)。\n if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault()\n submit()\n }\n }}\n rows={1}\n placeholder={placeholder}\n aria-label=\"訊息\"\n className={cn(\n // 欄位家族內距:單行 32 等高鐵律((欄高−1lh)/2−1 + --field-px)。\n 'block w-full resize-none bg-transparent outline-none',\n 'px-[var(--field-px)] py-[var(--field-control-py-md)] text-body text-foreground',\n 'placeholder:text-fg-muted',\n 'field-sizing-content max-h-40',\n )}\n />\n <div className=\"flex h-10 items-center justify-between px-2\">\n <div className=\"flex items-center\">\n {onAddAttachment && (\n <Button\n variant=\"text\"\n size=\"xs\"\n iconOnly\n startIcon={Plus}\n aria-label=\"新增附件\"\n onClick={onAddAttachment}\n />\n )}\n </div>\n {busy ? (\n <Button\n variant=\"primary\"\n size=\"xs\"\n iconOnly\n startIcon={Square}\n aria-label=\"停止生成\"\n onClick={onStop}\n className=\"animate-in fade-in-0 duration-[var(--motion-duration-overlay)] [&_svg]:fill-current\"\n />\n ) : (\n <Button\n variant=\"primary\"\n size=\"xs\"\n iconOnly\n startIcon={ArrowUp}\n aria-label=\"送出\"\n disabled={!canSubmit}\n onClick={submit}\n className=\"animate-in fade-in-0 duration-[var(--motion-duration-overlay)]\"\n />\n )}\n </div>\n </div>\n )\n },\n)\nAgentPromptInput.displayName = 'AgentPromptInput'\n\n/* ────────────────────────────────────────────────────────────────────────────\n * 8. AgentDecisionCard(決策卡)\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface AgentDecisionOption {\n value: string\n label: string\n description?: string\n}\n\nexport interface AgentDecisionQuestion {\n id: string\n label: string\n /** 2-4 具名選項;Other 自由輸入由元件必備附加。 */\n options: AgentDecisionOption[]\n /** 預選最佳解。 */\n defaultValue?: string\n}\n\nexport interface AgentDecisionCardProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSubmit' | 'title'> {\n title: string\n /** ≤3 題;一題一問。 */\n questions: AgentDecisionQuestion[]\n /** 送出:answers[questionId] = 選項值或 Other 文字。 */\n onSubmit?: (answers: Record<string, string>) => void\n /** 跳過(Skip 鈕與 header × 同一行為=單一語意雙入口)。 */\n onSkip?: () => void\n}\n\nconst OTHER_VALUE = '__agent_decision_other__'\n\nconst AgentDecisionCard = React.forwardRef<HTMLDivElement, AgentDecisionCardProps>(\n ({ title, questions, onSubmit, onSkip, className, ...props }, ref) => {\n const titleId = React.useId()\n if (import.meta.env?.DEV && questions.length > 3) {\n console.warn('[AgentDecisionCard] 表單指引為 ≤3 題(agent-panel.spec.md)。')\n }\n const [answers, setAnswers] = React.useState<Record<string, string>>(() =>\n Object.fromEntries(\n questions\n .filter((q) => q.defaultValue !== undefined)\n .map((q) => [q.id, q.defaultValue as string]),\n ),\n )\n const [otherText, setOtherText] = React.useState<Record<string, string>>({})\n const resolvedAnswers = () =>\n Object.fromEntries(\n questions\n .map((q) => {\n const selected = answers[q.id]\n if (selected === OTHER_VALUE) return [q.id, otherText[q.id] ?? '']\n return [q.id, selected]\n })\n .filter(([, v]) => v !== undefined),\n ) as Record<string, string>\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-labelledby={titleId}\n className={cn(\n // 繼承 Popover surface:rounded-lg/border/elevation-200;改寫:無下圓角。\n 'absolute inset-x-0 bottom-0 z-10 flex flex-col overflow-hidden',\n 'rounded-t-lg rounded-b-none border border-b-0 border-border bg-surface-raised',\n 'shadow-[var(--elevation-200)]',\n 'animate-in fade-in-0 slide-in-from-bottom-2 duration-[var(--motion-duration-overlay)] motion-reduce:animate-none',\n className,\n )}\n {...props}\n >\n {/* compact header 45(COMPACT_HEADER_SLOT);改寫:header 下無分隔線。 */}\n <SurfaceHeader className={cn(COMPACT_HEADER_SLOT, 'justify-between border-b-0')}>\n <span id={titleId} className=\"truncate text-body font-medium\">\n {title}\n </span>\n <Button dismiss size=\"sm\" startIcon={XIcon} aria-label=\"跳過\" onClick={onSkip} />\n </SurfaceHeader>\n {/* 改寫:body 無內距(選項列自帶 px);捲軸必用 ScrollArea。 */}\n <ScrollArea fillX className=\"min-h-0\">\n {questions.map((question) => (\n <RadioGroup\n key={question.id}\n value={answers[question.id] ?? ''}\n onValueChange={(next) =>\n setAnswers((prev) => ({ ...prev, [question.id]: next }))\n }\n aria-label={question.label}\n className=\"px-[var(--layout-space-loose)] py-[var(--layout-space-tight)]\"\n >\n {questions.length > 1 && (\n <div className=\"text-body font-medium\">{question.label}</div>\n )}\n {question.options.map((option) => (\n <RadioGroupItem\n key={option.value}\n value={option.value}\n size=\"md\"\n label={option.label}\n description={option.description}\n />\n ))}\n <RadioGroupItem value={OTHER_VALUE} size=\"md\" label=\"其他\" />\n {answers[question.id] === OTHER_VALUE && (\n // Other 輸入:右/下各 12 對稱。\n <div className=\"pb-3 pl-6 pr-3\">\n <Input\n autoFocus\n value={otherText[question.id] ?? ''}\n onChange={(e) =>\n setOtherText((prev) => ({ ...prev, [question.id]: e.target.value }))\n }\n aria-label=\"其他(自由輸入)\"\n />\n </div>\n )}\n </RadioGroup>\n ))}\n </ScrollArea>\n {/* 改寫:footer 上無分隔線;鈕 sm 守 Popover all-sm 律。 */}\n <SurfaceFooter className=\"border-t-0\">\n <Button variant=\"tertiary\" size=\"sm\" onClick={onSkip}>\n 跳過\n </Button>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={() => onSubmit?.(resolvedAnswers())}\n >\n 送出\n </Button>\n </SurfaceFooter>\n </div>\n )\n },\n)\nAgentDecisionCard.displayName = 'AgentDecisionCard'\n\n/* ────────────────────────────────────────────────────────────────────────────\n * 9. AgentDecisionSummary(決策回執)\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface AgentDecisionSummaryProps extends React.HTMLAttributes<HTMLDivElement> {\n /** [問題, 答案] 配對(靜態回執)。 */\n entries: Array<{ question: string; answer: string }>\n}\n\nconst AgentDecisionSummary = React.forwardRef<HTMLDivElement, AgentDecisionSummaryProps>(\n ({ entries, className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'flex flex-col gap-2 rounded-md border border-border px-3 py-2 text-body',\n className,\n )}\n {...props}\n >\n {entries.map(({ question, answer }, index) => (\n <div key={index} className=\"flex flex-col\">\n <span className=\"text-fg-secondary\">{question}</span>\n <span className=\"text-foreground\">{answer}</span>\n </div>\n ))}\n </div>\n ),\n)\nAgentDecisionSummary.displayName = 'AgentDecisionSummary'\n\nexport {\n AgentPanel,\n AgentPanelHeader,\n AgentConversation,\n AgentMessage,\n AgentThinking,\n AgentToolbar,\n AgentPromptInput,\n AgentDecisionCard,\n AgentDecisionSummary,\n}\n"],"names":["XIcon"],"mappings":"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"}
1
+ {"version":3,"file":"agent-panel.js","sources":["../../../src/components/AgentPanel/agent-panel.tsx"],"sourcesContent":["// code-quality-allow: file-size foundational composite family(9 元件一家族檔,同 Sidebar 前例)\n/**\n * AgentPanel 家族 — 智慧代理面板(9 元件;附屬資產 AgentLogo/AgentFab 另檔)。\n *\n * ── 消費的 SSOT ──\n * - 容器:右側欄=bg-surface + border-l border-divider(app-shell aside 前例);\n * 寬 --agent-panel-width(uiSize.css);開合 --motion-duration-surface。\n * - 標題列:ChromeHeader(header-canonical;chrome 內控件一律 sm);品牌區=gap-2+24 標誌;\n * chevron=ItemInlineActionButton(item-anatomy);ButtonDivider 於 gap-2 cluster(action-bar 規則 3)。\n * - 歷史浮層:Popover+Command+MenuItem(SelectMenu 同源 primitives;metrics 同 select-menu.tsx);\n * 行內動作=ItemInlineAction(inline-action canonical);思考列=CircularProgress 16。\n * - 訊息:氣泡 bg-secondary/rounded-md/8/12;附件=Chip assist 分支(chip.spec.md);\n * 輪距 40=8+24(Button text xs)+8。\n * - 思考塊:Radix Collapsible+animate-accordion(base.css;Sidebar 同法);\n * 微光=shadcn shimmer 參數(agent-panel.css;--motion-duration-shimmer)。\n * - 輸入盒:欄位家族內距(--field-control-py-md/--field-px/text-body;32 等高鐵律);\n * 附件列=Tag md+OverflowIndicator;送出/停止=Button primary xs。\n * - 決策卡:SurfaceHeader(compact 45)+SurfaceFooter(overlay-surface);RadioGroup md\n * (Popover all-sm 律之拍板豁免;footer 鈕 sm 守律);淡入+下滑 --motion-duration-overlay。\n * - 改名/刪除:Dialog(header md+X;body Field+Input;footer md 鈕;刪除=primary+danger;\n * form-validation 更新類規則)。\n * - 空狀態:Empty icon slot 接 AgentLogo 招喚態。\n * 全表:agent-panel.spec.md。\n */\nimport * as React from 'react'\nimport * as CollapsiblePrimitive from '@radix-ui/react-collapsible'\nimport {\n ArrowUp,\n ChevronDown,\n Copy,\n MessageSquare,\n Pencil,\n Plus,\n Square,\n ThumbsDown,\n ThumbsUp,\n Trash2,\n X as XIcon,\n} from 'lucide-react'\nimport { cn } from '@/lib/utils'\nimport { Button } from '@/design-system/components/Button/button'\nimport { ButtonDivider } from '@/design-system/components/Button/button-group'\nimport { ChromeHeader } from '@/design-system/patterns/header-canonical/chrome-header'\nimport {\n SurfaceHeader,\n SurfaceFooter,\n COMPACT_HEADER_SLOT,\n} from '@/design-system/patterns/overlay-surface/overlay-surface'\nimport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from '@/design-system/components/Popover/popover'\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from '@/design-system/components/Command/command'\nimport { MenuItem } from '@/design-system/components/Menu/menu-item'\nimport { ItemInlineAction } from '@/design-system/patterns/element-anatomy/item-anatomy'\nimport { CircularProgress } from '@/design-system/components/CircularProgress/circular-progress'\nimport { RadioGroup, RadioGroupItem } from '@/design-system/components/RadioGroup/radio-group'\nimport { Chip } from '@/design-system/components/Chip/chip'\nimport { Tag } from '@/design-system/components/Tag/tag'\nimport { Input } from '@/design-system/components/Input/input'\nimport { Field, FieldLabel } from '@/design-system/components/Field/field'\nimport {\n Dialog,\n DialogBody,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/design-system/components/Dialog/dialog'\nimport { ScrollArea } from '@/design-system/components/ScrollArea/scroll-area'\nimport { AgentLogo, type AgentLogoState } from './agent-logo'\nimport './agent-panel.css'\n\n/* ────────────────────────────────────────────────────────────────────────────\n * 1. AgentPanel(容器)\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface AgentPanelProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 面板開合;false 時不渲染。 */\n open?: boolean\n}\n\nconst AgentPanel = React.forwardRef<HTMLDivElement, AgentPanelProps>(\n ({ open = true, className, children, ...props }, ref) => {\n if (!open) return null\n return (\n <div\n ref={ref}\n role=\"complementary\"\n aria-label=\"智慧代理\" // i18n-allow: DS 預設,props 展開在後可覆寫\n className={cn(\n 'relative flex h-full min-h-0 w-[var(--agent-panel-width)] shrink-0 flex-col overflow-hidden',\n 'border-l border-divider bg-surface',\n 'animate-in fade-in-0 slide-in-from-right-4 duration-[var(--motion-duration-surface)] motion-reduce:animate-none',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n )\n },\n)\nAgentPanel.displayName = 'AgentPanel'\n\n/* ────────────────────────────────────────────────────────────────────────────\n * 2. AgentPanelHeader(標題列)+ 歷史浮層 / 改名 / 刪除\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface AgentConversationSummary {\n id: string\n title: string\n /** 分組標題(如「今天」「過去 7 天」);同組相鄰排列。 */\n group?: string\n /** 代理仍在回覆:列首圖示原地換 CircularProgress 16,等寬等高不動版面。 */\n thinking?: boolean\n}\n\nexport interface AgentPanelHeaderProps\n extends Omit<React.HTMLAttributes<HTMLElement>, 'title'> {\n /** 目前對話標題。 */\n title: string\n /** 歷史浮層搜尋 placeholder(i18n override)。 */\n historySearchPlaceholder?: string\n /** 歷史浮層無結果文案(i18n override)。 */\n historyEmptyText?: string\n /** 標誌狀態(代理思考中傳 \"think\")。 */\n logoState?: AgentLogoState\n /** 歷史對話清單;省略=不顯示 chevron。 */\n conversations?: AgentConversationSummary[]\n /** 目前對話 id(歷史清單高亮)。 */\n activeConversationId?: string\n onSelectConversation?: (id: string) => void\n /** 改名確認(Dialog 流程由元件內建)。 */\n onRenameConversation?: (id: string, title: string) => void\n /** 刪除確認(Dialog 流程由元件內建)。 */\n onDeleteConversation?: (id: string) => void\n onNewConversation?: () => void\n onClose?: () => void\n}\n\n/** 歷史列:MenuItem + 懸停浮出行內動作(改名/刪除);思考中列首換進度環。 */\nfunction HistoryRow({\n conversation,\n selected,\n onSelect,\n onRename,\n onDelete,\n}: {\n conversation: AgentConversationSummary\n selected: boolean\n onSelect: () => void\n onRename?: () => void\n onDelete?: () => void\n}) {\n const actions = (onRename || onDelete) && (\n <span\n className={cn(\n 'hidden items-center group-hover/agent-history:flex group-focus-within/agent-history:flex',\n 'animate-in fade-in-0 duration-[var(--motion-duration-overlay)]',\n )}\n >\n {onRename && (\n <ItemInlineAction\n action={{\n icon: Pencil,\n label: '改名', // i18n-allow: DS 預設文案(Dialog「關閉」同前例)\n onClick: (e) => {\n e?.stopPropagation()\n onRename()\n },\n }}\n />\n )}\n {onDelete && (\n <ItemInlineAction\n action={{\n icon: Trash2,\n label: '刪除', // i18n-allow: DS 預設文案(Dialog「關閉」同前例)\n onClick: (e) => {\n e?.stopPropagation()\n onDelete()\n },\n }}\n />\n )}\n </span>\n )\n return (\n <CommandItem\n value={`${conversation.title}\u0000${conversation.id}`}\n onSelect={onSelect}\n className=\"group/agent-history p-0\"\n >\n <MenuItem\n selected={selected}\n startContent={\n conversation.thinking ? (\n <CircularProgress size={16} aria-label=\"回覆中\" /> // i18n-allow: DS 預設\n ) : (\n <MessageSquare size={16} aria-hidden className=\"text-fg-muted\" />\n )\n }\n endContent={actions}\n >\n {conversation.title}\n </MenuItem>\n </CommandItem>\n )\n}\n\nconst AgentPanelHeader = React.forwardRef<HTMLElement, AgentPanelHeaderProps>(\n (\n {\n title,\n logoState = 'still',\n historySearchPlaceholder = '搜尋對話', // i18n-allow: DS 預設文案,prop 可覆寫\n historyEmptyText = '沒有符合的對話', // i18n-allow: DS 預設文案,prop 可覆寫\n conversations,\n activeConversationId,\n onSelectConversation,\n onRenameConversation,\n onDeleteConversation,\n onNewConversation,\n onClose,\n className,\n ...props\n },\n ref,\n ) => {\n const [historyOpen, setHistoryOpen] = React.useState(false)\n const [renameTarget, setRenameTarget] = React.useState<AgentConversationSummary | null>(null)\n const [deleteTarget, setDeleteTarget] = React.useState<AgentConversationSummary | null>(null)\n\n const groups = React.useMemo(() => {\n const order: string[] = []\n const byGroup = new Map<string, AgentConversationSummary[]>()\n for (const item of conversations ?? []) {\n const key = item.group ?? ''\n if (!byGroup.has(key)) {\n byGroup.set(key, [])\n order.push(key)\n }\n byGroup.get(key)!.push(item)\n }\n return order.map((key) => ({ label: key, items: byGroup.get(key)! }))\n }, [conversations])\n\n return (\n <ChromeHeader ref={ref} className={cn('bg-surface', className)} {...props}>\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <AgentLogo state={logoState} size={24} />\n <span className=\"truncate text-body-lg font-medium\">{title}</span>\n {conversations && (\n <Popover open={historyOpen} onOpenChange={setHistoryOpen}>\n <PopoverTrigger asChild>\n <ItemInlineAction\n action={{ icon: ChevronDown, label: '歷史對話', onClick: () => {} }} // i18n-allow: DS 預設文案(Dialog「關閉」同前例)\n aria-haspopup=\"menu\"\n aria-expanded={historyOpen}\n />\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n sideOffset={8}\n className=\"w-auto min-w-60 overflow-hidden rounded-lg border-border p-0\"\n style={{ boxShadow: 'var(--elevation-200)' }}\n >\n <Command>\n <CommandInput\n placeholder={historySearchPlaceholder}\n aria-label={historySearchPlaceholder}\n />\n <CommandList>\n <CommandEmpty>{historyEmptyText}</CommandEmpty>\n {groups.map(({ label, items }) => (\n <CommandGroup key={label || '(未分組)'} className=\"p-0 py-2\"> // i18n-allow: DS 預設文案(Dialog「關閉」同前例)\n {label && <MenuItem header>{label}</MenuItem>}\n {items.map((conversation) => (\n <HistoryRow\n key={conversation.id}\n conversation={conversation}\n selected={conversation.id === activeConversationId}\n onSelect={() => {\n onSelectConversation?.(conversation.id)\n setHistoryOpen(false)\n }}\n onRename={\n onRenameConversation\n ? () => setRenameTarget(conversation)\n : undefined\n }\n onDelete={\n onDeleteConversation\n ? () => setDeleteTarget(conversation)\n : undefined\n }\n />\n ))}\n </CommandGroup>\n ))}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {onNewConversation && (\n <Button\n variant=\"text\"\n size=\"sm\"\n iconOnly\n startIcon={Plus}\n aria-label=\"新對話\" // i18n-allow: DS 預設文案(Dialog「關閉」同前例)\n onClick={onNewConversation}\n />\n )}\n {onClose && (\n <>\n {onNewConversation && <ButtonDivider />}\n <Button dismiss size=\"sm\" startIcon={XIcon} aria-label=\"關閉面板\" onClick={onClose} />\n </>\n )}\n </div>\n {renameTarget && (\n <AgentRenameDialog\n conversation={renameTarget}\n onOpenChange={(next) => !next && setRenameTarget(null)}\n onConfirm={(nextTitle) => {\n onRenameConversation?.(renameTarget.id, nextTitle)\n setRenameTarget(null)\n }}\n />\n )}\n {deleteTarget && (\n <Dialog open onOpenChange={(next) => !next && setDeleteTarget(null)}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>刪除對話</DialogTitle> // i18n-allow: DS 預設文案(Dialog「關閉」同前例)\n </DialogHeader>\n <DialogBody>\n 確定刪除「{deleteTarget.title}」?此動作立即生效且不可復原。\n </DialogBody>\n <DialogFooter>\n <Button variant=\"tertiary\" onClick={() => setDeleteTarget(null)}>\n 取消\n </Button>\n <Button\n variant=\"primary\"\n danger\n onClick={() => {\n onDeleteConversation?.(deleteTarget.id)\n setDeleteTarget(null)\n }}\n >\n 刪除\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )}\n </ChromeHeader>\n )\n },\n)\nAgentPanelHeader.displayName = 'AgentPanelHeader'\n\n/** 改名 Dialog:Field+Input 預填全選;儲存=更新類 dirty 規則;Enter=blur、Esc=回復。 */\nfunction AgentRenameDialog({\n conversation,\n onOpenChange,\n onConfirm,\n}: {\n conversation: AgentConversationSummary\n onOpenChange: (open: boolean) => void\n onConfirm: (title: string) => void\n}) {\n const [value, setValue] = React.useState(conversation.title)\n const dirty = value !== conversation.title\n return (\n <Dialog open onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>改名對話</DialogTitle> // i18n-allow: DS 預設文案(Dialog「關閉」同前例)\n </DialogHeader>\n <DialogBody>\n <Field>\n <FieldLabel>名稱</FieldLabel>\n <Input\n autoFocus\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onFocus={(e) => e.currentTarget.select()}\n onKeyDown={(e) => {\n // form-validation:Enter=等同 blur;Esc=回復原值不觸發驗證。\n if (e.key === 'Enter') e.currentTarget.blur()\n if (e.key === 'Escape') {\n e.stopPropagation()\n setValue(conversation.title)\n }\n }}\n />\n </Field>\n </DialogBody>\n <DialogFooter>\n <Button variant=\"tertiary\" onClick={() => onOpenChange(false)}>\n 取消\n </Button>\n <Button variant=\"primary\" disabled={!dirty} onClick={() => onConfirm(value)}>\n 儲存\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n\n/* ────────────────────────────────────────────────────────────────────────────\n * 3. AgentConversation(訊息卷軸區)\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport type AgentConversationProps = React.HTMLAttributes<HTMLDivElement>\n\nconst AgentConversation = React.forwardRef<HTMLDivElement, AgentConversationProps>(\n ({ className, children, ...props }, ref) => (\n // 捲軸必用 ScrollArea(跨 OS 一致;Dialog body 同法)。\n <ScrollArea fillX className=\"min-h-0 flex-1\">\n <div\n ref={ref}\n role=\"log\"\n aria-live=\"polite\"\n className={cn(\n // 輪距 40 = 8 + 24(工具列)+ 8;工具列絕對定位於輪距內,出現不推擠。\n 'flex flex-col gap-10 p-[var(--layout-space-loose)]',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </ScrollArea>\n ),\n)\nAgentConversation.displayName = 'AgentConversation'\n\n/* ────────────────────────────────────────────────────────────────────────────\n * 4. AgentMessage(訊息)\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface AgentAttachment {\n id: string\n label: string\n}\n\nexport interface AgentMessageProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 訊息角色:user=我方氣泡靠右;agent=無氣泡全寬。 */\n role?: 'user' | 'agent'\n /** 氣泡內文字上方的附件(送出後視覺=Chip assist 分支)。 */\n attachments?: AgentAttachment[]\n onAttachmentClick?: (attachment: AgentAttachment) => void\n /** 訊息工具列(AgentToolbar);絕對定位於輪距內。 */\n toolbar?: React.ReactNode\n}\n\nconst AgentMessage = React.forwardRef<HTMLDivElement, AgentMessageProps>(\n (\n { role = 'agent', attachments, onAttachmentClick, toolbar, className, children, ...props },\n ref,\n ) => {\n const isUser = role === 'user'\n return (\n <div\n ref={ref}\n className={cn('group/agent-message relative', isUser && 'flex justify-end', className)}\n {...props}\n >\n <div\n className={cn(\n 'text-body text-foreground',\n isUser\n ? [\n 'max-w-[85%] rounded-md bg-secondary px-3 py-2',\n 'animate-in fade-in-0 slide-in-from-bottom-2 duration-[var(--motion-duration-overlay)] motion-reduce:animate-none',\n ]\n : 'w-full [&_a]:text-primary [&_a:hover]:text-primary-hover [&_a]:underline-offset-2 [&_a:hover]:underline',\n )}\n >\n {attachments && attachments.length > 0 && (\n <div className=\"mb-2 flex flex-wrap gap-1\">\n {attachments.map((attachment) => (\n <Chip\n key={attachment.id}\n variant=\"assist\"\n aria-label={`附件:${attachment.label}`}\n onClick={() => onAttachmentClick?.(attachment)}\n >\n {attachment.label}\n </Chip>\n ))}\n </div>\n )}\n {children}\n </div>\n {toolbar}\n </div>\n )\n },\n)\nAgentMessage.displayName = 'AgentMessage'\n\n/* ────────────────────────────────────────────────────────────────────────────\n * 5. AgentThinking(思考塊)\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface AgentThinkingProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** 進行中:標題「思考中」+微光;完成:「思考過程」靜態。 */\n thinking?: boolean\n /** 已完成的步驟(靜態)。 */\n steps?: React.ReactNode[]\n /** 正在寫入的最新一行(僅此行與標題套微光)。 */\n currentStep?: React.ReactNode\n /** 開合(未受控時:回覆中自動展開、回覆完自動收合)。 */\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\nconst AgentThinking = React.forwardRef<HTMLDivElement, AgentThinkingProps>(\n ({ thinking = false, steps, currentStep, open, onOpenChange, className, ...props }, ref) => {\n // 非受控:AI 回覆中自動展開、回覆完自動收合(拍板;三套元件庫一致慣例)。\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(thinking)\n React.useEffect(() => {\n if (open === undefined) setUncontrolledOpen(thinking)\n }, [thinking, open])\n const resolvedOpen = open ?? uncontrolledOpen\n const handleOpenChange = (next: boolean) => {\n setUncontrolledOpen(next)\n onOpenChange?.(next)\n }\n return (\n <CollapsiblePrimitive.Root\n ref={ref}\n open={resolvedOpen}\n onOpenChange={handleOpenChange}\n className={cn('text-body', className)}\n {...props}\n >\n <CollapsiblePrimitive.Trigger\n className={cn(\n 'group/agent-thinking flex cursor-pointer items-center gap-1 text-fg-secondary hover:text-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm',\n )}\n >\n <span className={cn(thinking && 'agent-shimmer')}>\n {thinking ? '思考中…' : '思考過程'}\n </span>\n <ChevronDown\n size={16}\n aria-hidden\n className=\"transition-transform duration-150 motion-reduce:duration-0 group-data-[state=open]/agent-thinking:rotate-180\"\n />\n </CollapsiblePrimitive.Trigger>\n <CollapsiblePrimitive.Content\n className=\"overflow-hidden data-[state=open]:animate-accordion-down data-[state=closed]:animate-accordion-up\"\n >\n <div className=\"mt-2 flex flex-col gap-1 border-l border-divider pl-3 text-fg-muted\">\n {steps?.map((step, index) => <div key={index}>{step}</div>)}\n {currentStep != null && (\n <div className={cn(thinking && 'agent-shimmer')}>{currentStep}</div>\n )}\n </div>\n </CollapsiblePrimitive.Content>\n </CollapsiblePrimitive.Root>\n )\n },\n)\nAgentThinking.displayName = 'AgentThinking'\n\n/* ────────────────────────────────────────────────────────────────────────────\n * 6. AgentToolbar(訊息工具列)\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface AgentToolbarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 常駐顯示(代理最後一則);其他訊息=懸停淡入。 */\n pinned?: boolean\n onCopy?: () => void\n onLike?: () => void\n onDislike?: () => void\n}\n\nconst AgentToolbar = React.forwardRef<HTMLDivElement, AgentToolbarProps>(\n ({ pinned = false, onCopy, onLike, onDislike, className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'absolute left-0 top-full mt-2 flex items-center gap-2',\n 'transition-opacity duration-[var(--motion-duration-overlay)] motion-reduce:transition-none',\n pinned\n ? 'opacity-100'\n : 'opacity-0 group-hover/agent-message:opacity-100 focus-within:opacity-100',\n className,\n )}\n {...props}\n >\n {onCopy && (\n <Button variant=\"text\" size=\"xs\" iconOnly startIcon={Copy} aria-label=\"複製\" onClick={onCopy} />\n )}\n {onCopy && (onLike || onDislike) && <ButtonDivider />}\n {onLike && (\n <Button variant=\"text\" size=\"xs\" iconOnly startIcon={ThumbsUp} aria-label=\"讚\" onClick={onLike} />\n )}\n {onDislike && (\n <Button\n variant=\"text\"\n size=\"xs\"\n iconOnly\n startIcon={ThumbsDown}\n aria-label=\"倒讚\"\n onClick={onDislike}\n />\n )}\n {children}\n </div>\n ),\n)\nAgentToolbar.displayName = 'AgentToolbar'\n\n/* ────────────────────────────────────────────────────────────────────────────\n * 7. AgentPromptInput(複合輸入盒)\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface AgentPromptAttachment {\n id: string\n label: string\n}\n\nexport interface AgentPromptInputProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSubmit'> {\n value: string\n onValueChange: (value: string) => void\n onSubmit?: () => void\n /** 代理進行中:送出鈕同位換停止(實心正方),0.15s 淡切。 */\n busy?: boolean\n onStop?: () => void\n /** 輸入中附件(Tag md,可移除;送出後於訊息內轉 Chip assist 視覺)。 */\n attachments?: AgentPromptAttachment[]\n onRemoveAttachment?: (attachment: AgentPromptAttachment) => void\n onAddAttachment?: () => void\n placeholder?: string\n}\n\nconst AgentPromptInput = React.forwardRef<HTMLDivElement, AgentPromptInputProps>(\n (\n {\n value,\n onValueChange,\n onSubmit,\n busy = false,\n onStop,\n attachments,\n onRemoveAttachment,\n onAddAttachment,\n placeholder = '輸入訊息…',\n className,\n ...props\n },\n ref,\n ) => {\n const canSubmit = value.trim().length > 0\n const submit = () => {\n if (busy || !canSubmit) return\n onSubmit?.()\n }\n return (\n <div\n ref={ref}\n className={cn(\n 'm-[var(--layout-space-loose)] mt-0 shrink-0 rounded-md border border-border bg-surface',\n 'focus-within:border-border-hover transition-colors duration-150',\n className,\n )}\n {...props}\n >\n {attachments && attachments.length > 0 && (\n // 附件列:Tag 相互間距 4、距內緣 4(28 高)。\n <div className=\"flex flex-wrap items-center gap-1 px-1 pt-1\">\n {attachments.map((attachment) => (\n <Tag\n key={attachment.id}\n size=\"md\"\n onRemove={\n onRemoveAttachment ? () => onRemoveAttachment(attachment) : undefined\n }\n >\n {attachment.label}\n </Tag>\n ))}\n </div>\n )}\n <textarea\n value={value}\n onChange={(e) => onValueChange(e.target.value)}\n onKeyDown={(e) => {\n // 按 Enter 送出、Shift+Enter 換行(拍板)。\n if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault()\n submit()\n }\n }}\n rows={1}\n placeholder={placeholder}\n aria-label=\"訊息\"\n className={cn(\n // 欄位家族內距:單行 32 等高鐵律((欄高−1lh)/2−1 + --field-px)。\n 'block w-full resize-none bg-transparent outline-none',\n 'px-[var(--field-px)] py-[var(--field-control-py-md)] text-body text-foreground',\n 'placeholder:text-fg-muted',\n 'field-sizing-content max-h-40',\n )}\n />\n <div className=\"flex h-10 items-center justify-between px-2\">\n <div className=\"flex items-center\">\n {onAddAttachment && (\n <Button\n variant=\"text\"\n size=\"xs\"\n iconOnly\n startIcon={Plus}\n aria-label=\"新增附件\"\n onClick={onAddAttachment}\n />\n )}\n </div>\n {busy ? (\n <Button\n variant=\"primary\"\n size=\"xs\"\n iconOnly\n startIcon={Square}\n aria-label=\"停止生成\"\n onClick={onStop}\n className=\"animate-in fade-in-0 duration-[var(--motion-duration-overlay)] [&_svg]:fill-current\"\n />\n ) : (\n <Button\n variant=\"primary\"\n size=\"xs\"\n iconOnly\n startIcon={ArrowUp}\n aria-label=\"送出\"\n disabled={!canSubmit}\n onClick={submit}\n className=\"animate-in fade-in-0 duration-[var(--motion-duration-overlay)]\"\n />\n )}\n </div>\n </div>\n )\n },\n)\nAgentPromptInput.displayName = 'AgentPromptInput'\n\n/* ────────────────────────────────────────────────────────────────────────────\n * 8. AgentDecisionCard(決策卡)\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface AgentDecisionOption {\n value: string\n label: string\n description?: string\n}\n\nexport interface AgentDecisionQuestion {\n id: string\n label: string\n /** 2-4 具名選項;Other 自由輸入由元件必備附加。 */\n options: AgentDecisionOption[]\n /** 預選最佳解。 */\n defaultValue?: string\n}\n\nexport interface AgentDecisionCardProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSubmit' | 'title'> {\n title: string\n /** ≤3 題;一題一問。 */\n questions: AgentDecisionQuestion[]\n /** 送出:answers[questionId] = 選項值或 Other 文字。 */\n onSubmit?: (answers: Record<string, string>) => void\n /** 跳過(Skip 鈕與 header × 同一行為=單一語意雙入口)。 */\n onSkip?: () => void\n}\n\nconst OTHER_VALUE = '__agent_decision_other__'\n\nconst AgentDecisionCard = React.forwardRef<HTMLDivElement, AgentDecisionCardProps>(\n ({ title, questions, onSubmit, onSkip, className, ...props }, ref) => {\n const titleId = React.useId()\n if (import.meta.env?.DEV && questions.length > 3) {\n console.warn('[AgentDecisionCard] 表單指引為 ≤3 題(agent-panel.spec.md)。')\n }\n const [answers, setAnswers] = React.useState<Record<string, string>>(() =>\n Object.fromEntries(\n questions\n .filter((q) => q.defaultValue !== undefined)\n .map((q) => [q.id, q.defaultValue as string]),\n ),\n )\n const [otherText, setOtherText] = React.useState<Record<string, string>>({})\n const resolvedAnswers = () =>\n Object.fromEntries(\n questions\n .map((q) => {\n const selected = answers[q.id]\n if (selected === OTHER_VALUE) return [q.id, otherText[q.id] ?? '']\n return [q.id, selected]\n })\n .filter(([, v]) => v !== undefined),\n ) as Record<string, string>\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-labelledby={titleId}\n className={cn(\n // 繼承 Popover surface:rounded-lg/border/elevation-200;改寫:無下圓角。\n 'absolute inset-x-0 bottom-0 z-10 flex flex-col overflow-hidden',\n 'rounded-t-lg rounded-b-none border border-b-0 border-border bg-surface-raised',\n 'shadow-[var(--elevation-200)]',\n 'animate-in fade-in-0 slide-in-from-bottom-2 duration-[var(--motion-duration-overlay)] motion-reduce:animate-none',\n className,\n )}\n {...props}\n >\n {/* compact header 45(COMPACT_HEADER_SLOT);改寫:header 下無分隔線。 */}\n <SurfaceHeader className={cn(COMPACT_HEADER_SLOT, 'justify-between border-b-0')}>\n <span id={titleId} className=\"truncate text-body font-medium\">\n {title}\n </span>\n <Button dismiss size=\"sm\" startIcon={XIcon} aria-label=\"跳過\" onClick={onSkip} />\n </SurfaceHeader>\n {/* 改寫:body 無內距(選項列自帶 px);捲軸必用 ScrollArea。 */}\n <ScrollArea fillX className=\"min-h-0\">\n {questions.map((question) => (\n <RadioGroup\n key={question.id}\n value={answers[question.id] ?? ''}\n onValueChange={(next) =>\n setAnswers((prev) => ({ ...prev, [question.id]: next }))\n }\n aria-label={question.label}\n className=\"px-[var(--layout-space-loose)] py-[var(--layout-space-tight)]\"\n >\n {questions.length > 1 && (\n <div className=\"text-body font-medium\">{question.label}</div>\n )}\n {question.options.map((option) => (\n <RadioGroupItem\n key={option.value}\n value={option.value}\n size=\"md\"\n label={option.label}\n description={option.description}\n />\n ))}\n <RadioGroupItem value={OTHER_VALUE} size=\"md\" label=\"其他\" />\n {answers[question.id] === OTHER_VALUE && (\n // Other 輸入:右/下各 12 對稱。\n <div className=\"pb-3 pl-6 pr-3\">\n <Input\n autoFocus\n value={otherText[question.id] ?? ''}\n onChange={(e) =>\n setOtherText((prev) => ({ ...prev, [question.id]: e.target.value }))\n }\n aria-label=\"其他(自由輸入)\"\n />\n </div>\n )}\n </RadioGroup>\n ))}\n </ScrollArea>\n {/* 改寫:footer 上無分隔線;鈕 sm 守 Popover all-sm 律。 */}\n <SurfaceFooter className=\"border-t-0\">\n <Button variant=\"tertiary\" size=\"sm\" onClick={onSkip}>\n 跳過\n </Button>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={() => onSubmit?.(resolvedAnswers())}\n >\n 送出\n </Button>\n </SurfaceFooter>\n </div>\n )\n },\n)\nAgentDecisionCard.displayName = 'AgentDecisionCard'\n\n/* ────────────────────────────────────────────────────────────────────────────\n * 9. AgentDecisionSummary(決策回執)\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface AgentDecisionSummaryProps extends React.HTMLAttributes<HTMLDivElement> {\n /** [問題, 答案] 配對(靜態回執)。 */\n entries: Array<{ question: string; answer: string }>\n}\n\nconst AgentDecisionSummary = React.forwardRef<HTMLDivElement, AgentDecisionSummaryProps>(\n ({ entries, className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'flex flex-col gap-2 rounded-md border border-border px-3 py-2 text-body',\n className,\n )}\n {...props}\n >\n {entries.map(({ question, answer }, index) => (\n <div key={index} className=\"flex flex-col\">\n <span className=\"text-fg-secondary\">{question}</span>\n <span className=\"text-foreground\">{answer}</span>\n </div>\n ))}\n </div>\n ),\n)\nAgentDecisionSummary.displayName = 'AgentDecisionSummary'\n\nexport {\n AgentPanel,\n AgentPanelHeader,\n AgentConversation,\n AgentMessage,\n AgentThinking,\n AgentToolbar,\n AgentPromptInput,\n AgentDecisionCard,\n AgentDecisionSummary,\n}\n"],"names":["XIcon"],"mappings":"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"}
@@ -3,8 +3,8 @@
3
3
  "schemaVersion": 1,
4
4
  "role": "template-consumer",
5
5
  "release": {
6
- "designSystem": "0.1.0-beta.129",
7
- "storybookConfig": "0.1.0-beta.129"
6
+ "designSystem": "0.1.0-beta.130",
7
+ "storybookConfig": "0.1.0-beta.130"
8
8
  },
9
9
  "upgradeTrust": {
10
10
  "schemaVersion": 1,
@@ -42,10 +42,10 @@
42
42
  "implementationSha256": "98b74118fb5b410b77ad2994aa9105fa7609c7353822f8c5213cce54d94f0af4"
43
43
  },
44
44
  "payload": {
45
- "forkCorpusLockSha256": "2ca4ea485571f545510862fe390ee07dba5a4663ccd947ab2cedbb361fcfa4d8",
45
+ "forkCorpusLockSha256": "513c148ccebb066e3a4dd9a9d8050a8235a358a562d442ac212bc02041e3a52d",
46
46
  "discoveryPolicySha256": "fba289aeeb5a3f11139b9589f7ab08b5e8c8799c7bdf8f0ea57ebfeb8e7c9da6",
47
47
  "providerMaterializersSha256": "732e85b01a12e7dd19469e26e4427f0e0cfe5117a78fc9f69c2f0f89702f463a",
48
- "providerLifecycleSha256": "22e4a16134551fc7f776ff9fa4a6caf4abcd2db9edf931dab3cc61141de58211",
48
+ "providerLifecycleSha256": "5952fbf03689eaa701c0bba3785ba199ac20ce3478b1f963797ca75e9378b34d",
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": "a0c30644b02234c55c614a8f7113c4ddba6563f14e15d790cdab63f2c4c06a09",
922
+ "sha256": "ca2721077debd52c1b6c1729b2a2e2406fd823a2211cf2a2545608cbcfaf29af",
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.129",
107
+ "releaseVersion": "0.1.0-beta.130",
108
108
  "immutableHead": {
109
109
  "providerInventorySha256": "86e9d0668cb54ad1bf05c36e78b4aa80417d5f468c929dd3ddcf69c1afbf32e4",
110
- "releaseVersion": "0.1.0-beta.128",
111
- "snapshotSha256": "99b83561efad3673d4136863b20f82cf7144deaba082f4d32cc05910471c1ef1"
110
+ "releaseVersion": "0.1.0-beta.129",
111
+ "snapshotSha256": "b0e2a74eae5a7723a0c62c52de8a7de412b79ddc28c9ef4655c7090db6c52466"
112
112
  },
113
- "ledgerSha256": "47a08ae48e9f496a7de4beb1bd023d8bbe6c53c1300013be3c829b0462422a57",
114
- "previousSnapshotSha256": "99b83561efad3673d4136863b20f82cf7144deaba082f4d32cc05910471c1ef1",
115
- "currentSnapshotSha256": "b0e2a74eae5a7723a0c62c52de8a7de412b79ddc28c9ef4655c7090db6c52466",
113
+ "ledgerSha256": "25eb8d4fc9a26e11985685ae77fe1a79d8196c2628859feecf5ae613dd2f9003",
114
+ "previousSnapshotSha256": "b0e2a74eae5a7723a0c62c52de8a7de412b79ddc28c9ef4655c7090db6c52466",
115
+ "currentSnapshotSha256": "66456a118073d56e4caafc8ab562c480ef1c9c832f015cffbc51e2884eeeed5b",
116
116
  "currentProviderInventorySha256": "86e9d0668cb54ad1bf05c36e78b4aa80417d5f468c929dd3ddcf69c1afbf32e4",
117
117
  "retiredProviders": [],
118
118
  "currentSnapshot": {
119
- "releaseVersion": "0.1.0-beta.129",
120
- "previousSnapshotSha256": "99b83561efad3673d4136863b20f82cf7144deaba082f4d32cc05910471c1ef1",
119
+ "releaseVersion": "0.1.0-beta.130",
120
+ "previousSnapshotSha256": "b0e2a74eae5a7723a0c62c52de8a7de412b79ddc28c9ef4655c7090db6c52466",
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.128",
197
- "previousSnapshotSha256": "db090bbade9053d293f0847b8861e2187ea1b1c321ad0e4ca7e59a68aa897095",
196
+ "releaseVersion": "0.1.0-beta.129",
197
+ "previousSnapshotSha256": "99b83561efad3673d4136863b20f82cf7144deaba082f4d32cc05910471c1ef1",
198
198
  "providers": [
199
199
  {
200
200
  "id": "claude",
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.129",
7
+ "version": "0.1.0-beta.130",
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",
@@ -89,7 +89,8 @@ SMIL keySplines 無法消費 CSS var,`agent-logo.tsx` 內常數為 swell/settle
89
89
  - 我方:氣泡 `bg-secondary`、`rounded-md`、內距 8/12、max-width 85%、靠右;
90
90
  進場=淡入+下滑 8、0.15s。代理:無氣泡、全寬、text-body;內文連結=Button link variant。
91
91
  - 附件列(氣泡內文字上方):**`<Chip variant="assist">`**(按鈕語意;位置距氣泡緣左 12/
92
- 上 8、與文字距 8)。A11y:`aria-label="附件:{檔名}"`。
92
+ 上 8、與文字距 8;**chip 相互垂直/水平間距 4**=與 Combobox 內 Tag 區間距一致
93
+ (combobox.tsx Tag area gap 預設 4;2026-09-02 拍板,非 ChipGroup filter 的 gap-2))。A11y:`aria-label="附件:{檔名}"`。
93
94
 
94
95
  ### 5. AgentThinking(思考塊)
95
96
 
@@ -97,7 +97,7 @@ export const AssistAttachments: Story = {
97
97
  name: '按鈕語意附件',
98
98
  render: () => (
99
99
  <div className="max-w-xs rounded-md bg-secondary px-3 py-2">
100
- <div className="mb-2 flex flex-wrap gap-2">
100
+ <div className="mb-2 flex flex-wrap gap-1">
101
101
  <Chip variant="assist" startIcon={FileText} aria-label="附件:sprint-42-backlog.csv" onClick={() => {}}>
102
102
  sprint-42-backlog.csv
103
103
  </Chip>