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

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 (438) hide show
  1. package/dist/components/Accordion/accordion.d.ts.map +1 -1
  2. package/dist/components/Accordion/accordion.js +2 -1
  3. package/dist/components/Accordion/accordion.js.map +1 -1
  4. package/dist/components/AccountMenu/account-menu.js +1 -1
  5. package/dist/components/AccountMenu/account-menu.js.map +1 -1
  6. package/dist/components/AgentPanel/agent-panel-fab.d.ts +157 -0
  7. package/dist/components/AgentPanel/agent-panel-fab.d.ts.map +1 -0
  8. package/dist/components/AgentPanel/agent-panel-fab.js +552 -0
  9. package/dist/components/AgentPanel/agent-panel-fab.js.map +1 -0
  10. package/dist/components/AgentPanel/{agent-logo.d.ts → agent-panel-logo.d.ts} +57 -16
  11. package/dist/components/AgentPanel/agent-panel-logo.d.ts.map +1 -0
  12. package/dist/components/AgentPanel/agent-panel-logo.js +539 -0
  13. package/dist/components/AgentPanel/agent-panel-logo.js.map +1 -0
  14. package/dist/components/AgentPanel/agent-panel.d.ts +39 -9
  15. package/dist/components/AgentPanel/agent-panel.d.ts.map +1 -1
  16. package/dist/components/AgentPanel/agent-panel.js +428 -222
  17. package/dist/components/AgentPanel/agent-panel.js.map +1 -1
  18. package/dist/components/AgentPanel/index.d.ts +2 -0
  19. package/dist/components/AgentPanel/index.d.ts.map +1 -1
  20. package/dist/components/AgentPanel/index.js +21 -2
  21. package/dist/components/AgentPanel/index.js.map +1 -1
  22. package/dist/components/AppShell/app-shell.d.ts.map +1 -1
  23. package/dist/components/AppShell/app-shell.js +5 -4
  24. package/dist/components/AppShell/app-shell.js.map +1 -1
  25. package/dist/components/Avatar/avatar.js +1 -1
  26. package/dist/components/Avatar/avatar.js.map +1 -1
  27. package/dist/components/Breadcrumb/breadcrumb.d.ts.map +1 -1
  28. package/dist/components/Breadcrumb/breadcrumb.js +0 -1
  29. package/dist/components/Breadcrumb/breadcrumb.js.map +1 -1
  30. package/dist/components/Button/button.d.ts.map +1 -1
  31. package/dist/components/Button/button.js +1 -2
  32. package/dist/components/Button/button.js.map +1 -1
  33. package/dist/components/Calendar/calendar.d.ts.map +1 -1
  34. package/dist/components/Calendar/calendar.js +8 -5
  35. package/dist/components/Calendar/calendar.js.map +1 -1
  36. package/dist/components/Carousel/carousel.js +2 -2
  37. package/dist/components/Carousel/carousel.js.map +1 -1
  38. package/dist/components/Chart/chart.d.ts.map +1 -1
  39. package/dist/components/Chart/chart.js +7 -1
  40. package/dist/components/Chart/chart.js.map +1 -1
  41. package/dist/components/Checkbox/checkbox.d.ts.map +1 -1
  42. package/dist/components/Checkbox/checkbox.js +2 -2
  43. package/dist/components/Checkbox/checkbox.js.map +1 -1
  44. package/dist/components/Chip/chip.d.ts.map +1 -1
  45. package/dist/components/Chip/chip.js +0 -1
  46. package/dist/components/Chip/chip.js.map +1 -1
  47. package/dist/components/Combobox/combobox.d.ts +20 -5
  48. package/dist/components/Combobox/combobox.d.ts.map +1 -1
  49. package/dist/components/Combobox/combobox.js +92 -37
  50. package/dist/components/Combobox/combobox.js.map +1 -1
  51. package/dist/components/Command/command.d.ts +91 -7
  52. package/dist/components/Command/command.d.ts.map +1 -1
  53. package/dist/components/Command/command.js +161 -58
  54. package/dist/components/Command/command.js.map +1 -1
  55. package/dist/components/Command/index.js +3 -1
  56. package/dist/components/DataTable/cell-registry.js +1 -1
  57. package/dist/components/DataTable/cell-registry.js.map +1 -1
  58. package/dist/components/DataTable/column-widths.d.ts +28 -0
  59. package/dist/components/DataTable/column-widths.d.ts.map +1 -0
  60. package/dist/components/DataTable/column-widths.js +45 -0
  61. package/dist/components/DataTable/column-widths.js.map +1 -0
  62. package/dist/components/DataTable/data-table-column-visibility-panel.d.ts.map +1 -1
  63. package/dist/components/DataTable/data-table-column-visibility-panel.js +16 -4
  64. package/dist/components/DataTable/data-table-column-visibility-panel.js.map +1 -1
  65. package/dist/components/DataTable/data-table-filter-group.d.ts.map +1 -1
  66. package/dist/components/DataTable/data-table-filter-group.js +0 -1
  67. package/dist/components/DataTable/data-table-filter-group.js.map +1 -1
  68. package/dist/components/DataTable/data-table-interaction-layer.d.ts.map +1 -1
  69. package/dist/components/DataTable/data-table-interaction-layer.js +12 -1
  70. package/dist/components/DataTable/data-table-interaction-layer.js.map +1 -1
  71. package/dist/components/DataTable/data-table-sort-manager.d.ts.map +1 -1
  72. package/dist/components/DataTable/data-table-sort-manager.js +17 -5
  73. package/dist/components/DataTable/data-table-sort-manager.js.map +1 -1
  74. package/dist/components/DataTable/data-table.d.ts +2 -0
  75. package/dist/components/DataTable/data-table.d.ts.map +1 -1
  76. package/dist/components/DataTable/data-table.js +1273 -285
  77. package/dist/components/DataTable/data-table.js.map +1 -1
  78. package/dist/components/DataTable/index.js +2 -0
  79. package/dist/components/DataTable/index.js.map +1 -1
  80. package/dist/components/DataTable/perf-debug-overlay.d.ts +2 -0
  81. package/dist/components/DataTable/perf-debug-overlay.d.ts.map +1 -0
  82. package/dist/components/DateGrid/date-grid.d.ts +1 -1
  83. package/dist/components/DateGrid/date-grid.d.ts.map +1 -1
  84. package/dist/components/DateGrid/date-grid.js +11 -4
  85. package/dist/components/DateGrid/date-grid.js.map +1 -1
  86. package/dist/components/DatePicker/date-picker.d.ts +5 -1
  87. package/dist/components/DatePicker/date-picker.d.ts.map +1 -1
  88. package/dist/components/DatePicker/date-picker.js +35 -5
  89. package/dist/components/DatePicker/date-picker.js.map +1 -1
  90. package/dist/components/Dialog/dialog.d.ts +54 -20
  91. package/dist/components/Dialog/dialog.d.ts.map +1 -1
  92. package/dist/components/Dialog/dialog.js +67 -13
  93. package/dist/components/Dialog/dialog.js.map +1 -1
  94. package/dist/components/DropdownMenu/dropdown-menu.d.ts +5 -4
  95. package/dist/components/DropdownMenu/dropdown-menu.d.ts.map +1 -1
  96. package/dist/components/DropdownMenu/dropdown-menu.js +49 -18
  97. package/dist/components/DropdownMenu/dropdown-menu.js.map +1 -1
  98. package/dist/components/Field/field-types.d.ts +0 -2
  99. package/dist/components/Field/field-types.d.ts.map +1 -1
  100. package/dist/components/Field/field-wrapper.d.ts +104 -0
  101. package/dist/components/Field/field-wrapper.d.ts.map +1 -1
  102. package/dist/components/Field/field-wrapper.js +59 -76
  103. package/dist/components/Field/field-wrapper.js.map +1 -1
  104. package/dist/components/Field/field.d.ts +0 -2
  105. package/dist/components/Field/field.d.ts.map +1 -1
  106. package/dist/components/Field/field.js +3 -16
  107. package/dist/components/Field/field.js.map +1 -1
  108. package/dist/components/Field/index.js +0 -2
  109. package/dist/components/Field/index.js.map +1 -1
  110. package/dist/components/FieldControlGroup/field-control-group.d.ts.map +1 -1
  111. package/dist/components/FieldControlGroup/field-control-group.js +3 -1
  112. package/dist/components/FieldControlGroup/field-control-group.js.map +1 -1
  113. package/dist/components/FileItem/file-item.d.ts.map +1 -1
  114. package/dist/components/FileItem/file-item.js +12 -4
  115. package/dist/components/FileItem/file-item.js.map +1 -1
  116. package/dist/components/FileUpload/file-upload.d.ts.map +1 -1
  117. package/dist/components/FileUpload/file-upload.js +3 -2
  118. package/dist/components/FileUpload/file-upload.js.map +1 -1
  119. package/dist/components/FileViewer/file-viewer.d.ts +13 -0
  120. package/dist/components/FileViewer/file-viewer.d.ts.map +1 -1
  121. package/dist/components/FileViewer/file-viewer.js +43 -2
  122. package/dist/components/FileViewer/file-viewer.js.map +1 -1
  123. package/dist/components/HoverCard/hover-card.d.ts.map +1 -1
  124. package/dist/components/HoverCard/hover-card.js +1 -0
  125. package/dist/components/HoverCard/hover-card.js.map +1 -1
  126. package/dist/components/InlineEdit/inline-edit.d.ts.map +1 -1
  127. package/dist/components/InlineEdit/inline-edit.js +2 -1
  128. package/dist/components/InlineEdit/inline-edit.js.map +1 -1
  129. package/dist/components/Menu/menu-item.d.ts +7 -0
  130. package/dist/components/Menu/menu-item.d.ts.map +1 -1
  131. package/dist/components/Menu/menu-item.js +33 -6
  132. package/dist/components/Menu/menu-item.js.map +1 -1
  133. package/dist/components/OverflowIndicator/overflow-indicator.d.ts.map +1 -1
  134. package/dist/components/OverflowIndicator/overflow-indicator.js +1 -2
  135. package/dist/components/OverflowIndicator/overflow-indicator.js.map +1 -1
  136. package/dist/components/Pagination/pagination.d.ts.map +1 -1
  137. package/dist/components/Pagination/pagination.js +69 -16
  138. package/dist/components/Pagination/pagination.js.map +1 -1
  139. package/dist/components/PeoplePicker/people-picker.d.ts +19 -0
  140. package/dist/components/PeoplePicker/people-picker.d.ts.map +1 -1
  141. package/dist/components/PeoplePicker/people-picker.js +51 -12
  142. package/dist/components/PeoplePicker/people-picker.js.map +1 -1
  143. package/dist/components/PeoplePicker/person-display.d.ts.map +1 -1
  144. package/dist/components/PeoplePicker/person-display.js +28 -8
  145. package/dist/components/PeoplePicker/person-display.js.map +1 -1
  146. package/dist/components/Popover/popover.d.ts.map +1 -1
  147. package/dist/components/Popover/popover.js +1 -0
  148. package/dist/components/Popover/popover.js.map +1 -1
  149. package/dist/components/RadioGroup/radio-group.d.ts.map +1 -1
  150. package/dist/components/RadioGroup/radio-group.js +7 -5
  151. package/dist/components/RadioGroup/radio-group.js.map +1 -1
  152. package/dist/components/Rating/rating.js +1 -1
  153. package/dist/components/Rating/rating.js.map +1 -1
  154. package/dist/components/ScrollArea/scroll-area.js +2 -2
  155. package/dist/components/ScrollArea/scroll-area.js.map +1 -1
  156. package/dist/components/SegmentedControl/segmented-control.js +1 -1
  157. package/dist/components/SegmentedControl/segmented-control.js.map +1 -1
  158. package/dist/components/Select/select.d.ts +19 -6
  159. package/dist/components/Select/select.d.ts.map +1 -1
  160. package/dist/components/Select/select.js +57 -26
  161. package/dist/components/Select/select.js.map +1 -1
  162. package/dist/components/SelectMenu/select-menu.d.ts +39 -12
  163. package/dist/components/SelectMenu/select-menu.d.ts.map +1 -1
  164. package/dist/components/SelectMenu/select-menu.js +83 -126
  165. package/dist/components/SelectMenu/select-menu.js.map +1 -1
  166. package/dist/components/Sheet/sheet.d.ts.map +1 -1
  167. package/dist/components/Sheet/sheet.js +2 -1
  168. package/dist/components/Sheet/sheet.js.map +1 -1
  169. package/dist/components/Sidebar/sidebar.d.ts.map +1 -1
  170. package/dist/components/Sidebar/sidebar.js +12 -8
  171. package/dist/components/Sidebar/sidebar.js.map +1 -1
  172. package/dist/components/Slider/slider.d.ts.map +1 -1
  173. package/dist/components/Slider/slider.js +14 -3
  174. package/dist/components/Slider/slider.js.map +1 -1
  175. package/dist/components/Steps/steps.d.ts.map +1 -1
  176. package/dist/components/Steps/steps.js +10 -2
  177. package/dist/components/Steps/steps.js.map +1 -1
  178. package/dist/components/Switch/switch.d.ts.map +1 -1
  179. package/dist/components/Switch/switch.js +19 -7
  180. package/dist/components/Switch/switch.js.map +1 -1
  181. package/dist/components/Tabs/tabs-inline-action-geometry.d.ts.map +1 -1
  182. package/dist/components/Tabs/tabs-inline-action-geometry.js +1 -1
  183. package/dist/components/Tabs/tabs-inline-action-geometry.js.map +1 -1
  184. package/dist/components/Tabs/tabs.d.ts.map +1 -1
  185. package/dist/components/Tabs/tabs.js +7 -2
  186. package/dist/components/Tabs/tabs.js.map +1 -1
  187. package/dist/components/Tag/index.js +2 -1
  188. package/dist/components/Tag/tag.d.ts +9 -0
  189. package/dist/components/Tag/tag.d.ts.map +1 -1
  190. package/dist/components/Tag/tag.js +13 -9
  191. package/dist/components/Tag/tag.js.map +1 -1
  192. package/dist/components/Textarea/textarea.d.ts.map +1 -1
  193. package/dist/components/Textarea/textarea.js +10 -39
  194. package/dist/components/Textarea/textarea.js.map +1 -1
  195. package/dist/components/TimePicker/time-columns.d.ts.map +1 -1
  196. package/dist/components/TimePicker/time-columns.js +16 -5
  197. package/dist/components/TimePicker/time-columns.js.map +1 -1
  198. package/dist/components/TimePicker/time-picker.d.ts.map +1 -1
  199. package/dist/components/TimePicker/time-picker.js +41 -26
  200. package/dist/components/TimePicker/time-picker.js.map +1 -1
  201. package/dist/components/Tooltip/tooltip.d.ts.map +1 -1
  202. package/dist/components/Tooltip/tooltip.js +21 -0
  203. package/dist/components/Tooltip/tooltip.js.map +1 -1
  204. package/dist/components/TreeView/tree-view.d.ts.map +1 -1
  205. package/dist/components/TreeView/tree-view.js +54 -12
  206. package/dist/components/TreeView/tree-view.js.map +1 -1
  207. package/dist/hooks/use-input-modality.d.ts +58 -0
  208. package/dist/hooks/use-input-modality.d.ts.map +1 -0
  209. package/dist/hooks/use-input-modality.js +98 -0
  210. package/dist/hooks/use-input-modality.js.map +1 -0
  211. package/dist/hooks/use-known-options.d.ts +14 -0
  212. package/dist/hooks/use-known-options.d.ts.map +1 -0
  213. package/dist/hooks/use-known-options.js +14 -0
  214. package/dist/hooks/use-known-options.js.map +1 -0
  215. package/dist/index.d.ts +8 -4
  216. package/dist/index.d.ts.map +1 -1
  217. package/dist/index.js +29 -3
  218. package/dist/index.js.map +1 -1
  219. package/dist/lib/drag-announcements.d.ts +59 -0
  220. package/dist/lib/drag-announcements.d.ts.map +1 -0
  221. package/dist/lib/drag-announcements.js +17 -0
  222. package/dist/lib/drag-announcements.js.map +1 -0
  223. package/dist/lib/drag-visual.d.ts +105 -3
  224. package/dist/lib/drag-visual.d.ts.map +1 -1
  225. package/dist/lib/drag-visual.js +40 -1
  226. package/dist/lib/drag-visual.js.map +1 -1
  227. package/dist/lib/overlay-coexistence.d.ts +59 -0
  228. package/dist/lib/overlay-coexistence.d.ts.map +1 -0
  229. package/dist/lib/overlay-coexistence.js +156 -0
  230. package/dist/lib/overlay-coexistence.js.map +1 -0
  231. package/dist/node_modules/aria-hidden/dist/es2015/index.js +147 -0
  232. package/dist/node_modules/aria-hidden/dist/es2015/index.js.map +1 -0
  233. package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -1
  234. package/dist/patterns/element-anatomy/item-anatomy.js +14 -5
  235. package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -1
  236. package/dist/patterns/overlay-surface/overlay-surface.js +1 -1
  237. package/dist/patterns/overlay-surface/overlay-surface.js.map +1 -1
  238. package/dist/patterns/resize-handle/resize-handle.d.ts +40 -78
  239. package/dist/patterns/resize-handle/resize-handle.d.ts.map +1 -1
  240. package/dist/patterns/resize-handle/resize-handle.js +109 -22
  241. package/dist/patterns/resize-handle/resize-handle.js.map +1 -1
  242. package/dist/tokens/motion/overlay-motion.d.ts +2 -1
  243. package/dist/tokens/motion/overlay-motion.d.ts.map +1 -1
  244. package/dist/tokens/motion/overlay-motion.js.map +1 -1
  245. package/ds-canonical/fork/consumer/lock.json +5 -5
  246. package/ds-canonical/fork/consumer/managed-files/46f10bc55cdfdf834d0749eebff42ea0bb8576f361b36d2b6ba1851354c50150.blob +25 -1
  247. package/ds-canonical/fork/governance.lock +4 -4
  248. package/ds-canonical/fork/hooks/check_pattern_invariants.sh +37 -1
  249. package/ds-canonical/fork/launchers/approval-evidence.mjs +364 -28
  250. package/ds-canonical/fork/manifest.json +10 -10
  251. package/ds-canonical/hooks/check_pattern_invariants.sh +37 -1
  252. package/ds-canonical/hooks/check_story_invariants.sh +14 -1
  253. package/ds-canonical/hooks/check_substantive_edit_approval_preflight.sh +4 -1
  254. package/ds-canonical/hooks/lib/approval-evidence.mjs +364 -28
  255. package/ds-canonical/hooks/record_release_consent.sh +36 -0
  256. package/ds-canonical/hooks/registrations.json +7 -0
  257. package/ds-canonical/hooks/stop_audit_content_quality.sh +4 -1
  258. package/ds-canonical/hooks/stop_extract_canonical_rules.sh +2 -1
  259. package/ds-canonical/hooks/stop_self_audit.sh +109 -14
  260. package/ds-canonical/hooks/tests/test_check_story_invariants.sh +17 -0
  261. package/ds-canonical/hooks/tests/test_check_substantive_edit_approval_preflight.sh +331 -7
  262. package/ds-canonical/hooks/tests/test_record_release_consent.sh +19 -0
  263. package/ds-canonical/hooks/tests/test_stop_self_audit_push_gate.sh +82 -0
  264. package/ds-canonical/references/README.md +1 -0
  265. package/ds-canonical/references/build-ui-canonicals.md +1 -1
  266. package/ds-canonical/references/drag-canonical.md +33 -1
  267. package/ds-canonical/references/focus-canonical.md +681 -0
  268. package/ds-canonical/rules/meta-patterns.md +1 -1
  269. package/ds-canonical/rules/story-rules.md +17 -0
  270. package/ds-canonical/skills/design-system-audit/SKILL.md +1 -1
  271. package/ds-story-manifest.json +50 -19
  272. package/llms-full.txt +6 -1
  273. package/llms.txt +2 -1
  274. package/package.json +1 -1
  275. package/src/components/Accordion/accordion.principles.stories.tsx +1 -1
  276. package/src/components/Accordion/accordion.tsx +2 -1
  277. package/src/components/AccountMenu/account-menu.tsx +1 -1
  278. package/src/components/AgentPanel/agent-panel-fab.tsx +920 -0
  279. package/src/components/AgentPanel/agent-panel-logo.tsx +748 -0
  280. package/src/components/AgentPanel/agent-panel.anatomy.stories.tsx +271 -34
  281. package/src/components/AgentPanel/agent-panel.principles.stories.tsx +6 -3
  282. package/src/components/AgentPanel/agent-panel.spec.md +375 -52
  283. package/src/components/AgentPanel/agent-panel.stories.tsx +837 -91
  284. package/src/components/AgentPanel/agent-panel.tsx +533 -163
  285. package/src/components/AgentPanel/index.ts +2 -0
  286. package/src/components/AppShell/app-shell.stories.tsx +51 -50
  287. package/src/components/AppShell/app-shell.tsx +4 -3
  288. package/src/components/Avatar/avatar.tsx +1 -1
  289. package/src/components/Breadcrumb/breadcrumb.tsx +0 -1
  290. package/src/components/Button/button.spec.md +1 -1
  291. package/src/components/Button/button.tsx +1 -2
  292. package/src/components/Calendar/calendar.tsx +19 -5
  293. package/src/components/Carousel/carousel.tsx +2 -2
  294. package/src/components/Chart/chart.tsx +7 -1
  295. package/src/components/Checkbox/checkbox.tsx +2 -2
  296. package/src/components/Chip/chip.tsx +0 -1
  297. package/src/components/CircularProgress/circular-progress.spec.md +7 -5
  298. package/src/components/Combobox/combobox.anatomy.stories.tsx +16 -11
  299. package/src/components/Combobox/combobox.spec.md +20 -4
  300. package/src/components/Combobox/combobox.stories.tsx +112 -3
  301. package/src/components/Combobox/combobox.tsx +143 -44
  302. package/src/components/Command/command.anatomy.stories.tsx +6 -20
  303. package/src/components/Command/command.spec.md +16 -15
  304. package/src/components/Command/command.stories.tsx +85 -184
  305. package/src/components/Command/command.tsx +275 -54
  306. package/src/components/DataTable/cell-registry.tsx +1 -1
  307. package/src/components/DataTable/column-widths.ts +77 -0
  308. package/src/components/DataTable/data-table-column-visibility-panel.tsx +23 -4
  309. package/src/components/DataTable/data-table-filter-group.tsx +0 -2
  310. package/src/components/DataTable/data-table-interaction-layer.tsx +12 -1
  311. package/src/components/DataTable/data-table-sort-manager.tsx +24 -6
  312. package/src/components/DataTable/data-table.css +194 -77
  313. package/src/components/DataTable/data-table.spec.md +417 -11
  314. package/src/components/DataTable/data-table.stories.tsx +254 -220
  315. package/src/components/DataTable/data-table.tsx +2185 -301
  316. package/src/components/DataTable/perf-debug-overlay.tsx +199 -0
  317. package/src/components/DateGrid/date-grid.spec.md +1 -1
  318. package/src/components/DateGrid/date-grid.tsx +11 -4
  319. package/src/components/DatePicker/date-picker.spec.md +19 -0
  320. package/src/components/DatePicker/date-picker.tsx +51 -7
  321. package/src/components/Dialog/dialog.anatomy.stories.tsx +10 -61
  322. package/src/components/Dialog/dialog.spec.md +102 -8
  323. package/src/components/Dialog/dialog.stories.tsx +158 -29
  324. package/src/components/Dialog/dialog.tsx +165 -19
  325. package/src/components/DropdownMenu/dropdown-menu.spec.md +2 -2
  326. package/src/components/DropdownMenu/dropdown-menu.tsx +67 -24
  327. package/src/components/Empty/empty.spec.md +7 -7
  328. package/src/components/Field/field-controls.spec.md +17 -11
  329. package/src/components/Field/field-types.ts +3 -15
  330. package/src/components/Field/field-wrapper.tsx +96 -76
  331. package/src/components/Field/field.anatomy.stories.tsx +2 -2
  332. package/src/components/Field/field.spec.md +18 -9
  333. package/src/components/Field/field.tsx +19 -20
  334. package/src/components/FieldControlGroup/field-control-group.tsx +3 -1
  335. package/src/components/FileItem/file-item.tsx +14 -4
  336. package/src/components/FileUpload/file-upload.spec.md +3 -1
  337. package/src/components/FileUpload/file-upload.tsx +3 -2
  338. package/src/components/FileViewer/file-viewer.stories.tsx +56 -0
  339. package/src/components/FileViewer/file-viewer.tsx +78 -4
  340. package/src/components/HoverCard/hover-card.spec.md +1 -1
  341. package/src/components/HoverCard/hover-card.tsx +1 -0
  342. package/src/components/InlineEdit/inline-edit.tsx +3 -1
  343. package/src/components/Input/input.anatomy.stories.tsx +2 -2
  344. package/src/components/Input/input.spec.md +2 -2
  345. package/src/components/Menu/menu-item.spec.md +15 -3
  346. package/src/components/Menu/menu-item.stories.tsx +24 -3
  347. package/src/components/Menu/menu-item.tsx +42 -6
  348. package/src/components/OverflowIndicator/overflow-indicator.tsx +1 -2
  349. package/src/components/Pagination/pagination.anatomy.stories.tsx +1 -1
  350. package/src/components/Pagination/pagination.spec.md +59 -1
  351. package/src/components/Pagination/pagination.stories.tsx +31 -0
  352. package/src/components/Pagination/pagination.tsx +130 -19
  353. package/src/components/PeoplePicker/people-picker.anatomy.stories.tsx +15 -4
  354. package/src/components/PeoplePicker/people-picker.spec.md +19 -4
  355. package/src/components/PeoplePicker/people-picker.stories.tsx +89 -7
  356. package/src/components/PeoplePicker/people-picker.tsx +82 -14
  357. package/src/components/PeoplePicker/person-display.tsx +66 -7
  358. package/src/components/Popover/popover.tsx +1 -0
  359. package/src/components/RadioGroup/radio-group.spec.md +2 -0
  360. package/src/components/RadioGroup/radio-group.tsx +10 -5
  361. package/src/components/Rating/rating.tsx +1 -1
  362. package/src/components/ScrollArea/scroll-area.spec.md +13 -4
  363. package/src/components/ScrollArea/scroll-area.tsx +2 -2
  364. package/src/components/SegmentedControl/segmented-control.tsx +1 -1
  365. package/src/components/Select/select.anatomy.stories.tsx +13 -6
  366. package/src/components/Select/select.spec.md +13 -4
  367. package/src/components/Select/select.stories.tsx +115 -0
  368. package/src/components/Select/select.tsx +69 -31
  369. package/src/components/SelectMenu/select-menu.anatomy.stories.tsx +39 -15
  370. package/src/components/SelectMenu/select-menu.spec.md +104 -21
  371. package/src/components/SelectMenu/select-menu.tsx +131 -152
  372. package/src/components/Sheet/sheet.spec.md +1 -1
  373. package/src/components/Sheet/sheet.tsx +2 -1
  374. package/src/components/Sidebar/sidebar.spec.md +1 -1
  375. package/src/components/Sidebar/sidebar.tsx +12 -8
  376. package/src/components/Skeleton/skeleton.spec.md +1 -1
  377. package/src/components/Slider/slider.spec.md +7 -5
  378. package/src/components/Slider/slider.tsx +21 -3
  379. package/src/components/Steps/steps.tsx +13 -3
  380. package/src/components/Switch/switch.spec.md +24 -3
  381. package/src/components/Switch/switch.tsx +19 -7
  382. package/src/components/Tabs/tabs-inline-action-geometry.ts +6 -1
  383. package/src/components/Tabs/tabs.anatomy.stories.tsx +1 -1
  384. package/src/components/Tabs/tabs.spec.md +12 -2
  385. package/src/components/Tabs/tabs.tsx +14 -2
  386. package/src/components/Tag/tag.spec.md +13 -1
  387. package/src/components/Tag/tag.tsx +29 -11
  388. package/src/components/Textarea/textarea.spec.md +2 -2
  389. package/src/components/Textarea/textarea.tsx +10 -39
  390. package/src/components/TimePicker/time-columns.tsx +18 -5
  391. package/src/components/TimePicker/time-picker.spec.md +3 -1
  392. package/src/components/TimePicker/time-picker.tsx +16 -1
  393. package/src/components/Tooltip/tooltip.tsx +21 -0
  394. package/src/components/TreeView/tree-view.spec.md +3 -3
  395. package/src/components/TreeView/tree-view.tsx +77 -15
  396. package/src/hooks/use-input-modality.ts +164 -0
  397. package/src/hooks/use-known-options.ts +25 -0
  398. package/src/index.ts +32 -1
  399. package/src/lib/drag-announcements.ts +87 -0
  400. package/src/lib/drag-visual.ts +133 -3
  401. package/src/lib/overlay-coexistence.ts +232 -0
  402. package/src/patterns/action-bar/action-bar.spec.md +16 -0
  403. package/src/patterns/element-anatomy/inline-action.spec.md +4 -4
  404. package/src/patterns/element-anatomy/item-anatomy.spec.md +11 -6
  405. package/src/patterns/element-anatomy/item-anatomy.tsx +13 -4
  406. package/src/patterns/horizontal-overflow/horizontal-overflow.spec.md +1 -0
  407. package/src/patterns/overlay-surface/overlay-surface.spec.md +2 -1
  408. package/src/patterns/overlay-surface/overlay-surface.tsx +1 -1
  409. package/src/patterns/resize-handle/resize-handle.spec.md +37 -27
  410. package/src/patterns/resize-handle/resize-handle.stories.tsx +42 -30
  411. package/src/patterns/resize-handle/resize-handle.tsx +172 -101
  412. package/src/stories-helpers/overlay/open-overlay-docs.ts +34 -0
  413. package/src/stories-helpers/scene/data-toolbar.tsx +52 -0
  414. package/src/stories-helpers/scene/simulated-browser.tsx +71 -0
  415. package/src/styles/base.css +35 -0
  416. package/src/tokens/README.md +2 -0
  417. package/src/tokens/color/color.spec.md +62 -4
  418. package/src/tokens/color/color.stories.tsx +1 -2
  419. package/src/tokens/color/semantic.css +54 -13
  420. package/src/tokens/layoutSpace/layoutSpace.css +11 -0
  421. package/src/tokens/layoutSpace/layoutSpace.spec.md +16 -1
  422. package/src/tokens/motion/motion.css +1 -1
  423. package/src/tokens/motion/motion.spec.md +25 -1
  424. package/src/tokens/motion/overlay-motion.ts +2 -1
  425. package/src/tokens/token-system.spec.md +1 -1
  426. package/src/tokens/uiSize/uiSize.css +15 -1
  427. package/src/tokens/uiSize/uiSize.spec.md +15 -4
  428. package/dist/components/AgentPanel/agent-fab.d.ts +0 -24
  429. package/dist/components/AgentPanel/agent-fab.d.ts.map +0 -1
  430. package/dist/components/AgentPanel/agent-logo.d.ts.map +0 -1
  431. package/dist/components/AgentPanel/agent-logo.js +0 -371
  432. package/dist/components/AgentPanel/agent-logo.js.map +0 -1
  433. package/dist/components/Field/field-types.js +0 -13
  434. package/dist/components/Field/field-types.js.map +0 -1
  435. package/dist/stories-helpers/anatomy/anatomy-utils.d.ts +0 -40
  436. package/dist/stories-helpers/anatomy/anatomy-utils.d.ts.map +0 -1
  437. package/src/components/AgentPanel/agent-fab.tsx +0 -126
  438. package/src/components/AgentPanel/agent-logo.tsx +0 -491
@@ -1 +1 @@
1
- {"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../../src/components/Accordion/accordion.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,kBAAkB,MAAM,2BAA2B,CAAA;AAI/D;;;;;;;;;;;;;;;;GAgBG;AAEH,QAAA,MAAM,SAAS,8JAA0B,CAAA;AAEzC,QAAA,MAAM,aAAa,iKASjB,CAAA;AAGF,QAAA,MAAM,gBAAgB,2LAiCpB,CAAA;AAGF,QAAA,MAAM,gBAAgB,qLAgBpB,CAAA;AAKF,eAAO,MAAM,aAAa;;;;;;;;;;;CAehB,CAAA;AAEV,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAA"}
1
+ {"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../../src/components/Accordion/accordion.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,kBAAkB,MAAM,2BAA2B,CAAA;AAI/D;;;;;;;;;;;;;;;;GAgBG;AAEH,QAAA,MAAM,SAAS,8JAA0B,CAAA;AAEzC,QAAA,MAAM,aAAa,iKASjB,CAAA;AAGF,QAAA,MAAM,gBAAgB,2LAkCpB,CAAA;AAGF,QAAA,MAAM,gBAAgB,qLAgBpB,CAAA;AAKF,eAAO,MAAM,aAAa;;;;;;;;;;;CAehB,CAAA;AAEV,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAA"}
@@ -21,7 +21,8 @@ const AccordionTrigger = React.forwardRef(({ className, children, ...props }, re
21
21
  "flex flex-1 items-center justify-between gap-2",
22
22
  "py-4 text-body font-medium text-foreground text-left",
23
23
  "transition-colors hover:text-fg-secondary",
24
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
24
+ // 內描邊:trigger 撐滿標題列高,往外 +2px 實測會壓到下方的內容區(2026-09-07 量測)
25
+ "focus-visible:focus-ring-inset",
25
26
  // AccordionTrigger 單一 text-style 列 → semantic `text-fg-disabled`(非 opacity);Button canonical 對齊
26
27
  "disabled:text-fg-disabled disabled:pointer-events-none",
27
28
  // 2026-05-31 M24:disabled 時 chevron(icon 載體)亦降 text-fg-disabled,不停留 text-fg-muted
@@ -1 +1 @@
1
- {"version":3,"file":"accordion.js","sources":["../../../src/components/Accordion/accordion.tsx"],"sourcesContent":["import * as React from 'react'\nimport * as AccordionPrimitive from '@radix-ui/react-accordion'\nimport { ChevronDown } from 'lucide-react'\nimport { cn } from '@/lib/utils'\n\n/**\n * Accordion — Radix Accordion + 本 DS token\n *\n * 結構對齊 shadcn/ui accordion(Accordion / AccordionItem / AccordionTrigger /\n * AccordionContent),但視覺全改本 DS token。\n *\n * ── 視覺差異 vs shadcn 預設 ──\n * Shadcn 預設 hover 加底線(web 早期 link style),本 DS 改為文字色 tint\n * (`hover:text-fg-secondary`)——維持現代 SaaS 質感(Notion / Linear / Stripe 皆不用\n * 底線),但保留 hover 顏色變化作為可點擊提示(user 決策 2026-04-20)。\n * Chevron 用 Lucide + 本 DS icon size(16px),rotate 動畫 200ms。\n *\n * ── 使用情境 ──\n * FAQ / settings section 收合 / 多區塊表單分組 / 進階選項可隱藏。\n * 不用於「單純顯示 / 隱藏單一區塊」(那是 Collapsible,本 DS 尚未建立;用 details 或\n * 自組 toggle),Accordion 是「多個 item 可互斥或獨立收合」的 pattern。\n */\n\nconst Accordion = AccordionPrimitive.Root\n\nconst AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <AccordionPrimitive.Item\n ref={ref}\n className={cn('border-b border-divider', className)}\n {...props}\n />\n))\nAccordionItem.displayName = 'AccordionItem'\n\nconst AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n // asChild 不對外開放:Trigger 固定渲染 children + ChevronDown 兩個子節點,傳 asChild\n // 會讓 Radix Slot 觸發 React.Children.only runtime 錯(見 CLAUDE.md 失敗記憶索引\n // 「asChild 分支內部仍渲染多 children」)。固定 anatomy 見 accordion.spec.md「邊界狀態」。\n Omit<React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>, 'asChild'>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex flex-1 items-center justify-between gap-2',\n 'py-4 text-body font-medium text-foreground text-left',\n 'transition-colors hover:text-fg-secondary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n // AccordionTrigger 單一 text-style 列 → semantic `text-fg-disabled`(非 opacity);Button canonical 對齊\n 'disabled:text-fg-disabled disabled:pointer-events-none',\n // 2026-05-31 M24:disabled 時 chevron(icon 載體)亦降 text-fg-disabled,不停留 text-fg-muted\n //(muted=neutral-7 比 disabled=neutral-6 深 → 層級顛倒)。覆寫 chevron 自身 text-fg-muted。\n 'disabled:[&>svg]:text-fg-disabled',\n \"[&[data-state=open]>svg]:rotate-180\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDown\n size={16}\n className=\"shrink-0 text-fg-muted transition-transform duration-200 motion-reduce:duration-0\"\n aria-hidden\n />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n))\nAccordionTrigger.displayName = 'AccordionTrigger'\n\nconst AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n // asChild 不對外開放:Content 固定以內層 <div className=\"pb-4\"> 包住 children,傳 asChild\n // 只會讓 Slot clone 該內層 div,consumer 元素無法成為 Content host(等同無效 API)。\n Omit<React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>, 'asChild'>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Content\n ref={ref}\n className={cn(\n 'overflow-hidden text-body text-fg-secondary',\n 'data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down motion-reduce:animate-none',\n )}\n {...props}\n >\n <div className={cn('pb-4', className)}>{children}</div>\n </AccordionPrimitive.Content>\n))\nAccordionContent.displayName = 'AccordionContent'\n\n// Story auto-compile metadata — Phase 1 mechanical migration(2026-04-24)\n// Phase 2 fill needed: purpose descriptions + when rationale + world-class refs\nexport const accordionMeta = {\n component: 'Accordion',\n family: null, // non-family composite / overlay / layout\n variants: {\n\n },\n sizes: {\n\n },\n states: ['default', 'hover', 'focus-visible', 'disabled'],\n tokens: {\n bg: [],\n fg: ['text-fg-disabled', 'text-fg-muted', 'text-fg-secondary', 'text-foreground'],\n ring: ['ring-ring'],\n },\n} as const\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n"],"names":[],"mappings":";;;;;AAuBA,MAAM,YAAY,mBAAmB;AAErC,MAAM,gBAAgB,MAAM,WAG1B,CAAC,EAAE,WAAW,GAAG,MAAA,GAAS,QAC1B;AAAA,EAAC,mBAAmB;AAAA,EAAnB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,2BAA2B,SAAS;AAAA,IACjD,GAAG;AAAA,EAAA;AACN,CACD;AACD,cAAc,cAAc;AAE5B,MAAM,mBAAmB,MAAM,WAM7B,CAAC,EAAE,WAAW,UAAU,GAAG,MAAA,GAAS,QACpC,oBAAC,mBAAmB,QAAnB,EAA0B,WAAU,QACnC,UAAA;AAAA,EAAC,mBAAmB;AAAA,EAAnB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAED,GAAG;AAAA,IAEH,UAAA;AAAA,MAAA;AAAA,MACD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAM;AAAA,UACN,WAAU;AAAA,UACV,eAAW;AAAA,QAAA;AAAA,MAAA;AAAA,IACb;AAAA,EAAA;AACF,GACF,CACD;AACD,iBAAiB,cAAc;AAE/B,MAAM,mBAAmB,MAAM,WAK7B,CAAC,EAAE,WAAW,UAAU,GAAG,SAAS,QACpC;AAAA,EAAC,mBAAmB;AAAA,EAAnB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IAAA;AAAA,IAED,GAAG;AAAA,IAEJ,8BAAC,OAAA,EAAI,WAAW,GAAG,QAAQ,SAAS,GAAI,SAAA,CAAS;AAAA,EAAA;AACnD,CACD;AACD,iBAAiB,cAAc;AAIxB,MAAM,gBAAgB;AAAA,EAC3B,WAAW;AAAA,EACX,QAAQ;AAAA;AAAA,EACR,UAAU,CAAA;AAAA,EAGV,OAAO,CAAA;AAAA,EAGP,QAAQ,CAAC,WAAW,SAAS,iBAAiB,UAAU;AAAA,EACxD,QAAQ;AAAA,IACN,IAAI,CAAA;AAAA,IACJ,IAAI,CAAC,oBAAoB,iBAAiB,qBAAqB,iBAAiB;AAAA,IAChF,MAAM,CAAC,WAAW;AAAA,EAAA;AAEtB;"}
1
+ {"version":3,"file":"accordion.js","sources":["../../../src/components/Accordion/accordion.tsx"],"sourcesContent":["import * as React from 'react'\nimport * as AccordionPrimitive from '@radix-ui/react-accordion'\nimport { ChevronDown } from 'lucide-react'\nimport { cn } from '@/lib/utils'\n\n/**\n * Accordion — Radix Accordion + 本 DS token\n *\n * 結構對齊 shadcn/ui accordion(Accordion / AccordionItem / AccordionTrigger /\n * AccordionContent),但視覺全改本 DS token。\n *\n * ── 視覺差異 vs shadcn 預設 ──\n * Shadcn 預設 hover 加底線(web 早期 link style),本 DS 改為文字色 tint\n * (`hover:text-fg-secondary`)——維持現代 SaaS 質感(Notion / Linear / Stripe 皆不用\n * 底線),但保留 hover 顏色變化作為可點擊提示(user 決策 2026-04-20)。\n * Chevron 用 Lucide + 本 DS icon size(16px),rotate 動畫 200ms。\n *\n * ── 使用情境 ──\n * FAQ / settings section 收合 / 多區塊表單分組 / 進階選項可隱藏。\n * 不用於「單純顯示 / 隱藏單一區塊」(那是 Collapsible,本 DS 尚未建立;用 details 或\n * 自組 toggle),Accordion 是「多個 item 可互斥或獨立收合」的 pattern。\n */\n\nconst Accordion = AccordionPrimitive.Root\n\nconst AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <AccordionPrimitive.Item\n ref={ref}\n className={cn('border-b border-divider', className)}\n {...props}\n />\n))\nAccordionItem.displayName = 'AccordionItem'\n\nconst AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n // asChild 不對外開放:Trigger 固定渲染 children + ChevronDown 兩個子節點,傳 asChild\n // 會讓 Radix Slot 觸發 React.Children.only runtime 錯(見 CLAUDE.md 失敗記憶索引\n // 「asChild 分支內部仍渲染多 children」)。固定 anatomy 見 accordion.spec.md「邊界狀態」。\n Omit<React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>, 'asChild'>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex flex-1 items-center justify-between gap-2',\n 'py-4 text-body font-medium text-foreground text-left',\n 'transition-colors hover:text-fg-secondary',\n // 內描邊:trigger 撐滿標題列高,往外 +2px 實測會壓到下方的內容區(2026-09-07 量測)\n 'focus-visible:focus-ring-inset',\n // AccordionTrigger 單一 text-style 列 → semantic `text-fg-disabled`(非 opacity);Button canonical 對齊\n 'disabled:text-fg-disabled disabled:pointer-events-none',\n // 2026-05-31 M24:disabled 時 chevron(icon 載體)亦降 text-fg-disabled,不停留 text-fg-muted\n //(muted=neutral-7 比 disabled=neutral-6 深 → 層級顛倒)。覆寫 chevron 自身 text-fg-muted。\n 'disabled:[&>svg]:text-fg-disabled',\n \"[&[data-state=open]>svg]:rotate-180\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDown\n size={16}\n className=\"shrink-0 text-fg-muted transition-transform duration-200 motion-reduce:duration-0\"\n aria-hidden\n />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n))\nAccordionTrigger.displayName = 'AccordionTrigger'\n\nconst AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n // asChild 不對外開放:Content 固定以內層 <div className=\"pb-4\"> 包住 children,傳 asChild\n // 只會讓 Slot clone 該內層 div,consumer 元素無法成為 Content host(等同無效 API)。\n Omit<React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>, 'asChild'>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Content\n ref={ref}\n className={cn(\n 'overflow-hidden text-body text-fg-secondary',\n 'data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down motion-reduce:animate-none',\n )}\n {...props}\n >\n <div className={cn('pb-4', className)}>{children}</div>\n </AccordionPrimitive.Content>\n))\nAccordionContent.displayName = 'AccordionContent'\n\n// Story auto-compile metadata — Phase 1 mechanical migration(2026-04-24)\n// Phase 2 fill needed: purpose descriptions + when rationale + world-class refs\nexport const accordionMeta = {\n component: 'Accordion',\n family: null, // non-family composite / overlay / layout\n variants: {\n\n },\n sizes: {\n\n },\n states: ['default', 'hover', 'focus-visible', 'disabled'],\n tokens: {\n bg: [],\n fg: ['text-fg-disabled', 'text-fg-muted', 'text-fg-secondary', 'text-foreground'],\n ring: ['ring-ring'],\n },\n} as const\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n"],"names":[],"mappings":";;;;;AAuBA,MAAM,YAAY,mBAAmB;AAErC,MAAM,gBAAgB,MAAM,WAG1B,CAAC,EAAE,WAAW,GAAG,MAAA,GAAS,QAC1B;AAAA,EAAC,mBAAmB;AAAA,EAAnB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,2BAA2B,SAAS;AAAA,IACjD,GAAG;AAAA,EAAA;AACN,CACD;AACD,cAAc,cAAc;AAE5B,MAAM,mBAAmB,MAAM,WAM7B,CAAC,EAAE,WAAW,UAAU,GAAG,MAAA,GAAS,QACpC,oBAAC,mBAAmB,QAAnB,EAA0B,WAAU,QACnC,UAAA;AAAA,EAAC,mBAAmB;AAAA,EAAnB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA;AAAA,MAEA;AAAA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAED,GAAG;AAAA,IAEH,UAAA;AAAA,MAAA;AAAA,MACD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAM;AAAA,UACN,WAAU;AAAA,UACV,eAAW;AAAA,QAAA;AAAA,MAAA;AAAA,IACb;AAAA,EAAA;AACF,GACF,CACD;AACD,iBAAiB,cAAc;AAE/B,MAAM,mBAAmB,MAAM,WAK7B,CAAC,EAAE,WAAW,UAAU,GAAG,SAAS,QACpC;AAAA,EAAC,mBAAmB;AAAA,EAAnB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IAAA;AAAA,IAED,GAAG;AAAA,IAEJ,8BAAC,OAAA,EAAI,WAAW,GAAG,QAAQ,SAAS,GAAI,SAAA,CAAS;AAAA,EAAA;AACnD,CACD;AACD,iBAAiB,cAAc;AAIxB,MAAM,gBAAgB;AAAA,EAC3B,WAAW;AAAA,EACX,QAAQ;AAAA;AAAA,EACR,UAAU,CAAA;AAAA,EAGV,OAAO,CAAA;AAAA,EAGP,QAAQ,CAAC,WAAW,SAAS,iBAAiB,UAAU;AAAA,EACxD,QAAQ;AAAA,IACN,IAAI,CAAA;AAAA,IACJ,IAAI,CAAC,oBAAoB,iBAAiB,qBAAqB,iBAAiB;AAAA,IAChF,MAAM,CAAC,WAAW;AAAA,EAAA;AAEtB;"}
@@ -32,7 +32,7 @@ const AccountMenu = React.forwardRef(
32
32
  ref,
33
33
  type: "button",
34
34
  "aria-label": triggerAriaLabel,
35
- className: "flex size-6 shrink-0 items-center justify-center self-center rounded-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1",
35
+ className: "flex size-6 shrink-0 items-center justify-center self-center rounded-full /* 2026-09-07 刪:與 DropdownMenuTrigger 自帶的 dropdown-menu.tsx:122 逐字相同, 經 Radix Slot(asChild,:128)併到同一顆按鈕上 = 同一份宣告掛兩次 */",
36
36
  children: /* @__PURE__ */ jsx(Avatar, { size: 24, ...avatar, alt: avatar.alt ?? user.name })
37
37
  }
38
38
  ) }),
@@ -1 +1 @@
1
- {"version":3,"file":"account-menu.js","sources":["../../../src/components/AccountMenu/account-menu.tsx"],"sourcesContent":["/**\n * AccountMenu — 全域 chrome「自己的帳號入口」(24px avatar 觸發 + 帳號選單)\n *\n * ── 定位 ──\n * Primary-header 派 globalHeader 右側(desktop)/ mobile Sheet SidebarHeader 右側的\n * 帳號入口成品元件:點 avatar 開「個人資料 / 設定 / 登出」navigation 選單。\n * 是「自己」的入口,不是看「別人」的 ProfileCard(後者預設動作 Chat/通話,語義是聯絡某人)。\n * **Placement-agnostic**:哪個 mode 放哪裡是 consumer 職責,放置 canonical owner =\n * `../AppShell/app-shell.spec.md`「帳號入口(Account entry)放置 SSOT」(本元件不收 mode prop,\n * 不複製該 SSOT;consumer 讀 `useAppShell().layout` + `useSidebar().isMobile` 決定放置)。\n *\n * ── 實作基礎 ──\n * 消費:Avatar(raw size=24 trigger)+ DropdownMenu(Trigger asChild / Content / Group / Label / Item)\n * 對應 pattern:patterns/header-canonical(4.5 chrome header avatar SSOT)\n *\n * ── 消費的 SSOT ──\n * - components: [Avatar, DropdownMenu(DropdownMenuTrigger/Content/Group/Label/Item)]\n * - patterns: [header-canonical 4.5(chrome header avatar = raw `<Avatar size={24}>`,非 ItemAvatar)]\n * - tokens: [--chrome-header-avatar-size(JS 端 24 literal sync), --ring(focus-visible ring canonical)]\n * - spec refs: app-shell.spec.md「帳號入口(Account entry)放置 SSOT」/ header-canonical.spec.md 4.5\n * / dropdown-menu.spec.md / profile-card.spec.md(近親分界:看別人 vs 自己)\n *\n * 升級歷程:2026-06-17 `AppShell/_demo-helpers.tsx` demo helper 誕生(user directive)→\n * 2026-07-30 F9 升 public:app-shell.spec.md + sidebar.spec.md 兩處 canonical 都 mandate\n * 消費本元件,「文件教得到、import 拿不到」= DT-EXPORT 斷鏈同款缺口(gen-component-indexes.mjs\n * 檔頭 anchor),npm consumer 被迫整包重造。世界級對照:Atlassian `@atlaskit/atlassian-navigation`\n * 出貨專門 `Profile` 元件作 top bar 帳號 trigger(ProfileProps = IconButtonProps,選單內容\n * composition;https://unpkg.com/@atlaskit/atlassian-navigation/dist/types/index.d.ts +\n * dist/types/components/Profile/types.d.ts);shadcn / Primer 走 DropdownMenu / ActionMenu\n * composition recipe(https://ui.shadcn.com/docs/components/dropdown-menu「An account switcher\n * dropdown triggered by an avatar」/ https://primer.style/components/action-menu)。本元件 =\n * Atlassian 專門元件 + shadcn canonical 內容組(Label(user)+ Groups)的收斂。\n */\nimport * as React from 'react'\nimport { User, Settings, LogOut } from 'lucide-react'\nimport { Avatar, type AvatarData } from '@/design-system/components/Avatar/avatar'\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuGroup,\n} from '@/design-system/components/DropdownMenu/dropdown-menu'\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\nexport interface AccountMenuUser {\n /** 顯示名(選單 Label 區;alt 未傳時同時作 avatar alt fallback) */\n name: string\n /**\n * Avatar 資料(消費既有 `AvatarData` type)。`hoverCard` 刻意排除:帳號入口是「自己」,\n * 不掛 ProfileCard(per app-shell.spec.md 帳號入口 SSOT「不用 ProfileCard」);\n * `alt` 可省,fallback `name`。\n */\n avatar?: Omit<AvatarData, 'hoverCard' | 'alt'> & { alt?: string }\n}\n\nexport interface AccountMenuProps {\n /** 當前登入使用者 */\n user: AccountMenuUser\n /** 「個人資料」item handler(default 選單消費;命名對齊 `PersonData.onViewProfile` 既有 canonical) */\n onViewProfile?: () => void\n /** 「設定」item handler(default 選單消費) */\n onOpenSettings?: () => void\n /** 「登出」item handler(default 選單消費) */\n onSignOut?: () => void\n /**\n * 取代 default 選單內容(自組 `DropdownMenuGroup` / `DropdownMenuItem`;i18n / 產品自訂項走這)。\n * Identity Label(user.name)恆由本元件渲染於選單頂(對齊 shadcn account 例 Label(user)慣例);\n * 傳入 children 時三個 default callback 不再消費。\n */\n children?: React.ReactNode\n /** 選單對齊(轉傳 DropdownMenuContent `align`)。預設 `'end'`:右上入口靠右展開(demo baseline) */\n align?: 'start' | 'center' | 'end'\n /** Trigger aria-label(i18n override,對齊 Avatar `badgeAriaLabel` pattern)。預設「帳號與設定」 */\n triggerAriaLabel?: string\n /** 受控展開狀態(Radix passthrough) */\n open?: boolean\n /** 預設展開(uncontrolled,Radix passthrough)。Storybook OpenSnapshot(M15 visual-audit coverable)用 */\n defaultOpen?: boolean\n /** 展開狀態變更 callback(Radix passthrough) */\n onOpenChange?: (open: boolean) => void\n /**\n * Trigger button 的非視覺 DOM attributes / event handlers。\n * `children`、`type`、`aria-label`、`className`、`disabled` 由 AccountMenu canonical contract\n * 擁有;分析與測試所需的 `data-*`、`aria-*`、事件可由此傳入。\n */\n triggerProps?: Omit<\n React.ComponentPropsWithoutRef<'button'>,\n 'children' | 'type' | 'aria-label' | 'className' | 'disabled'\n >\n}\n\n// ── AccountMenu ─────────────────────────────────────────────────────────────\n\nexport const AccountMenu = React.forwardRef<HTMLButtonElement, AccountMenuProps>(\n ({\n user,\n onViewProfile,\n onOpenSettings,\n onSignOut,\n children,\n align = 'end',\n triggerAriaLabel = '帳號與設定', // i18n-allow: spec 預設 aria-label(account-menu.spec.md),consumer 以同名 prop 覆蓋\n open,\n defaultOpen,\n onOpenChange,\n triggerProps,\n }, ref) => {\n // Dev-mode warning(對齊 ProfileCardDefaultActions dev-warn 先例):default 選單項沒接任何\n // handler = item 點了永遠沒反應;production 必接 callback 或自組 children。\n if (\n process.env.NODE_ENV !== 'production' &&\n !children &&\n !onViewProfile &&\n !onOpenSettings &&\n !onSignOut\n ) {\n // eslint-disable-next-line no-console\n console.warn(\n '[DS AccountMenu] default 選單項未接 onViewProfile/onOpenSettings/onSignOut——item 點擊無反應。請傳入 callback 或自組 children。'\n )\n }\n const avatar = user.avatar ?? {}\n return (\n <DropdownMenu open={open} defaultOpen={defaultOpen} onOpenChange={onOpenChange}>\n <DropdownMenuTrigger asChild>\n {/* 互動感由 focus-visible ring 提供(無 hover bg,chrome 輕量 entry),不放大到 field height\n — per app-shell.spec.md「Avatar 尺寸 + 邊距」+ header-canonical.spec.md 4.5 */}\n {/* size-6 = Avatar 24 的幾何鎖:trigger 是 Radix 的 anchor box,沒鎖尺寸時 flex 預設\n align-items: stretch 會把按鈕撐高(實測 min-h-32 容器 → 96px anchor → 選單視覺間距\n 44px,遠離 elevation.spec.md 的 8px canonical)。鎖死後 anchor ≡ avatar,任何容器\n 都維持 sideOffset=8 的視覺意圖;shrink-0 防壓縮對偶。user 2026-08-04 拍板。 */}\n <button\n {...triggerProps}\n ref={ref}\n type=\"button\"\n aria-label={triggerAriaLabel}\n className=\"flex size-6 shrink-0 items-center justify-center self-center rounded-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\"\n >\n {/* 24 per header-canonical.spec.md 4.5 chrome header avatar canonical(brand + account 同尺寸); sync with --chrome-header-avatar-size */}\n <Avatar size={24} {...avatar} alt={avatar.alt ?? user.name} />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align={align}>\n {children ? (\n <>\n <DropdownMenuGroup>\n <DropdownMenuLabel>{user.name}</DropdownMenuLabel>\n </DropdownMenuGroup>\n {children}\n </>\n ) : (\n <>\n {/* Default 選單集合 = app-shell.spec.md「入口開什麼」canonical(個人資料 / 設定 / 登出,\n 登出獨立 group — 破壞性動作分區,對齊 GitHub / Gmail / Slack 帳號選單慣例) */}\n <DropdownMenuGroup>\n <DropdownMenuLabel>{user.name}</DropdownMenuLabel>\n <DropdownMenuItem startIcon={User} onSelect={onViewProfile}>\n 個人資料\n </DropdownMenuItem>\n <DropdownMenuItem startIcon={Settings} onSelect={onOpenSettings}>\n 設定\n </DropdownMenuItem>\n </DropdownMenuGroup>\n <DropdownMenuGroup>\n <DropdownMenuItem startIcon={LogOut} onSelect={onSignOut}>\n 登出\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n },\n)\nAccountMenu.displayName = 'AccountMenu'\n\n// Story auto-compile metadata — F9 public 升級(2026-07-30)\n// Phase 2 fill needed: purpose descriptions + when rationale\nexport const accountMenuMeta = {\n component: 'AccountMenu',\n family: null, // composite(trigger = chrome header 24px avatar;浮層 = DropdownMenu Family 1 消費者)\n variants: {},\n sizes: {}, // trigger avatar 24px density-fixed(header-canonical.spec.md 4.5),無 size 軸 → 兩欄留空為 intentional\n states: ['default', 'focus-visible'],\n tokens: {\n bg: [],\n fg: [],\n ring: ['--ring'], // trigger focus-visible ring canonical\n },\n} as const\n"],"names":[],"mappings":";;;;;AAgGO,MAAM,cAAc,MAAM;AAAA,EAC/B,CAAC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,mBAAmB;AAAA;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GACC,QAAQ;AAGT,QACE,QAAQ,IAAI,aAAa,gBACzB,CAAC,YACD,CAAC,iBACD,CAAC,kBACD,CAAC,WACD;AAEA,cAAQ;AAAA,QACN;AAAA,MAAA;AAAA,IAEJ;AACA,UAAM,SAAS,KAAK,UAAU,CAAA;AAC9B,WACE,qBAAC,cAAA,EAAa,MAAY,aAA0B,cAClD,UAAA;AAAA,MAAA,oBAAC,qBAAA,EAAoB,SAAO,MAO1B,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACE,GAAG;AAAA,UACJ;AAAA,UACA,MAAK;AAAA,UACL,cAAY;AAAA,UACZ,WAAU;AAAA,UAGV,UAAA,oBAAC,QAAA,EAAO,MAAM,IAAK,GAAG,QAAQ,KAAK,OAAO,OAAO,KAAK,KAAA,CAAM;AAAA,QAAA;AAAA,MAAA,GAEhE;AAAA,MACA,oBAAC,qBAAA,EAAoB,OAClB,UAAA,WACC,qBAAA,UAAA,EACE,UAAA;AAAA,QAAA,oBAAC,mBAAA,EACC,UAAA,oBAAC,mBAAA,EAAmB,UAAA,KAAK,MAAK,GAChC;AAAA,QACC;AAAA,MAAA,EAAA,CACH,IAEA,qBAAA,UAAA,EAGE,UAAA;AAAA,QAAA,qBAAC,mBAAA,EACC,UAAA;AAAA,UAAA,oBAAC,mBAAA,EAAmB,eAAK,KAAA,CAAK;AAAA,8BAC7B,kBAAA,EAAiB,WAAW,MAAM,UAAU,eAAe,UAAA,QAE5D;AAAA,8BACC,kBAAA,EAAiB,WAAW,UAAU,UAAU,gBAAgB,UAAA,KAAA,CAEjE;AAAA,QAAA,GACF;AAAA,QACA,oBAAC,qBACC,UAAA,oBAAC,kBAAA,EAAiB,WAAW,QAAQ,UAAU,WAAW,UAAA,KAAA,CAE1D,EAAA,CACF;AAAA,MAAA,EAAA,CACF,EAAA,CAEJ;AAAA,IAAA,GACF;AAAA,EAEJ;AACF;AACA,YAAY,cAAc;AAInB,MAAM,kBAAkB;AAAA,EAC7B,WAAW;AAAA,EACX,QAAQ;AAAA;AAAA,EACR,UAAU,CAAA;AAAA,EACV,OAAO,CAAA;AAAA;AAAA,EACP,QAAQ,CAAC,WAAW,eAAe;AAAA,EACnC,QAAQ;AAAA,IACN,IAAI,CAAA;AAAA,IACJ,IAAI,CAAA;AAAA,IACJ,MAAM,CAAC,QAAQ;AAAA;AAAA,EAAA;AAEnB;"}
1
+ {"version":3,"file":"account-menu.js","sources":["../../../src/components/AccountMenu/account-menu.tsx"],"sourcesContent":["/**\n * AccountMenu — 全域 chrome「自己的帳號入口」(24px avatar 觸發 + 帳號選單)\n *\n * ── 定位 ──\n * Primary-header 派 globalHeader 右側(desktop)/ mobile Sheet SidebarHeader 右側的\n * 帳號入口成品元件:點 avatar 開「個人資料 / 設定 / 登出」navigation 選單。\n * 是「自己」的入口,不是看「別人」的 ProfileCard(後者預設動作 Chat/通話,語義是聯絡某人)。\n * **Placement-agnostic**:哪個 mode 放哪裡是 consumer 職責,放置 canonical owner =\n * `../AppShell/app-shell.spec.md`「帳號入口(Account entry)放置 SSOT」(本元件不收 mode prop,\n * 不複製該 SSOT;consumer 讀 `useAppShell().layout` + `useSidebar().isMobile` 決定放置)。\n *\n * ── 實作基礎 ──\n * 消費:Avatar(raw size=24 trigger)+ DropdownMenu(Trigger asChild / Content / Group / Label / Item)\n * 對應 pattern:patterns/header-canonical(4.5 chrome header avatar SSOT)\n *\n * ── 消費的 SSOT ──\n * - components: [Avatar, DropdownMenu(DropdownMenuTrigger/Content/Group/Label/Item)]\n * - patterns: [header-canonical 4.5(chrome header avatar = raw `<Avatar size={24}>`,非 ItemAvatar)]\n * - tokens: [--chrome-header-avatar-size(JS 端 24 literal sync), --ring(focus-visible ring canonical)]\n * - spec refs: app-shell.spec.md「帳號入口(Account entry)放置 SSOT」/ header-canonical.spec.md 4.5\n * / dropdown-menu.spec.md / profile-card.spec.md(近親分界:看別人 vs 自己)\n *\n * 升級歷程:2026-06-17 `AppShell/_demo-helpers.tsx` demo helper 誕生(user directive)→\n * 2026-07-30 F9 升 public:app-shell.spec.md + sidebar.spec.md 兩處 canonical 都 mandate\n * 消費本元件,「文件教得到、import 拿不到」= DT-EXPORT 斷鏈同款缺口(gen-component-indexes.mjs\n * 檔頭 anchor),npm consumer 被迫整包重造。世界級對照:Atlassian `@atlaskit/atlassian-navigation`\n * 出貨專門 `Profile` 元件作 top bar 帳號 trigger(ProfileProps = IconButtonProps,選單內容\n * composition;https://unpkg.com/@atlaskit/atlassian-navigation/dist/types/index.d.ts +\n * dist/types/components/Profile/types.d.ts);shadcn / Primer 走 DropdownMenu / ActionMenu\n * composition recipe(https://ui.shadcn.com/docs/components/dropdown-menu「An account switcher\n * dropdown triggered by an avatar」/ https://primer.style/components/action-menu)。本元件 =\n * Atlassian 專門元件 + shadcn canonical 內容組(Label(user)+ Groups)的收斂。\n */\nimport * as React from 'react'\nimport { User, Settings, LogOut } from 'lucide-react'\nimport { Avatar, type AvatarData } from '@/design-system/components/Avatar/avatar'\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuGroup,\n} from '@/design-system/components/DropdownMenu/dropdown-menu'\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\nexport interface AccountMenuUser {\n /** 顯示名(選單 Label 區;alt 未傳時同時作 avatar alt fallback) */\n name: string\n /**\n * Avatar 資料(消費既有 `AvatarData` type)。`hoverCard` 刻意排除:帳號入口是「自己」,\n * 不掛 ProfileCard(per app-shell.spec.md 帳號入口 SSOT「不用 ProfileCard」);\n * `alt` 可省,fallback `name`。\n */\n avatar?: Omit<AvatarData, 'hoverCard' | 'alt'> & { alt?: string }\n}\n\nexport interface AccountMenuProps {\n /** 當前登入使用者 */\n user: AccountMenuUser\n /** 「個人資料」item handler(default 選單消費;命名對齊 `PersonData.onViewProfile` 既有 canonical) */\n onViewProfile?: () => void\n /** 「設定」item handler(default 選單消費) */\n onOpenSettings?: () => void\n /** 「登出」item handler(default 選單消費) */\n onSignOut?: () => void\n /**\n * 取代 default 選單內容(自組 `DropdownMenuGroup` / `DropdownMenuItem`;i18n / 產品自訂項走這)。\n * Identity Label(user.name)恆由本元件渲染於選單頂(對齊 shadcn account 例 Label(user)慣例);\n * 傳入 children 時三個 default callback 不再消費。\n */\n children?: React.ReactNode\n /** 選單對齊(轉傳 DropdownMenuContent `align`)。預設 `'end'`:右上入口靠右展開(demo baseline) */\n align?: 'start' | 'center' | 'end'\n /** Trigger aria-label(i18n override,對齊 Avatar `badgeAriaLabel` pattern)。預設「帳號與設定」 */\n triggerAriaLabel?: string\n /** 受控展開狀態(Radix passthrough) */\n open?: boolean\n /** 預設展開(uncontrolled,Radix passthrough)。Storybook OpenSnapshot(M15 visual-audit coverable)用 */\n defaultOpen?: boolean\n /** 展開狀態變更 callback(Radix passthrough) */\n onOpenChange?: (open: boolean) => void\n /**\n * Trigger button 的非視覺 DOM attributes / event handlers。\n * `children`、`type`、`aria-label`、`className`、`disabled` 由 AccountMenu canonical contract\n * 擁有;分析與測試所需的 `data-*`、`aria-*`、事件可由此傳入。\n */\n triggerProps?: Omit<\n React.ComponentPropsWithoutRef<'button'>,\n 'children' | 'type' | 'aria-label' | 'className' | 'disabled'\n >\n}\n\n// ── AccountMenu ─────────────────────────────────────────────────────────────\n\nexport const AccountMenu = React.forwardRef<HTMLButtonElement, AccountMenuProps>(\n ({\n user,\n onViewProfile,\n onOpenSettings,\n onSignOut,\n children,\n align = 'end',\n triggerAriaLabel = '帳號與設定', // i18n-allow: spec 預設 aria-label(account-menu.spec.md),consumer 以同名 prop 覆蓋\n open,\n defaultOpen,\n onOpenChange,\n triggerProps,\n }, ref) => {\n // Dev-mode warning(對齊 ProfileCardDefaultActions dev-warn 先例):default 選單項沒接任何\n // handler = item 點了永遠沒反應;production 必接 callback 或自組 children。\n if (\n process.env.NODE_ENV !== 'production' &&\n !children &&\n !onViewProfile &&\n !onOpenSettings &&\n !onSignOut\n ) {\n // eslint-disable-next-line no-console\n console.warn(\n '[DS AccountMenu] default 選單項未接 onViewProfile/onOpenSettings/onSignOut——item 點擊無反應。請傳入 callback 或自組 children。'\n )\n }\n const avatar = user.avatar ?? {}\n return (\n <DropdownMenu open={open} defaultOpen={defaultOpen} onOpenChange={onOpenChange}>\n <DropdownMenuTrigger asChild>\n {/* 互動感由 focus-visible ring 提供(無 hover bg,chrome 輕量 entry),不放大到 field height\n — per app-shell.spec.md「Avatar 尺寸 + 邊距」+ header-canonical.spec.md 4.5 */}\n {/* size-6 = Avatar 24 的幾何鎖:trigger 是 Radix 的 anchor box,沒鎖尺寸時 flex 預設\n align-items: stretch 會把按鈕撐高(實測 min-h-32 容器 → 96px anchor → 選單視覺間距\n 44px,遠離 elevation.spec.md 的 8px canonical)。鎖死後 anchor ≡ avatar,任何容器\n 都維持 sideOffset=8 的視覺意圖;shrink-0 防壓縮對偶。user 2026-08-04 拍板。 */}\n <button\n {...triggerProps}\n ref={ref}\n type=\"button\"\n aria-label={triggerAriaLabel}\n className=\"flex size-6 shrink-0 items-center justify-center self-center rounded-full /* 2026-09-07 刪:與 DropdownMenuTrigger 自帶的 dropdown-menu.tsx:122 逐字相同, 經 Radix Slot(asChild,:128)併到同一顆按鈕上 = 同一份宣告掛兩次 */\"\n >\n {/* 24 per header-canonical.spec.md 4.5 chrome header avatar canonical(brand + account 同尺寸); sync with --chrome-header-avatar-size */}\n <Avatar size={24} {...avatar} alt={avatar.alt ?? user.name} />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align={align}>\n {children ? (\n <>\n <DropdownMenuGroup>\n <DropdownMenuLabel>{user.name}</DropdownMenuLabel>\n </DropdownMenuGroup>\n {children}\n </>\n ) : (\n <>\n {/* Default 選單集合 = app-shell.spec.md「入口開什麼」canonical(個人資料 / 設定 / 登出,\n 登出獨立 group — 破壞性動作分區,對齊 GitHub / Gmail / Slack 帳號選單慣例) */}\n <DropdownMenuGroup>\n <DropdownMenuLabel>{user.name}</DropdownMenuLabel>\n <DropdownMenuItem startIcon={User} onSelect={onViewProfile}>\n 個人資料\n </DropdownMenuItem>\n <DropdownMenuItem startIcon={Settings} onSelect={onOpenSettings}>\n 設定\n </DropdownMenuItem>\n </DropdownMenuGroup>\n <DropdownMenuGroup>\n <DropdownMenuItem startIcon={LogOut} onSelect={onSignOut}>\n 登出\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n },\n)\nAccountMenu.displayName = 'AccountMenu'\n\n// Story auto-compile metadata — F9 public 升級(2026-07-30)\n// Phase 2 fill needed: purpose descriptions + when rationale\nexport const accountMenuMeta = {\n component: 'AccountMenu',\n family: null, // composite(trigger = chrome header 24px avatar;浮層 = DropdownMenu Family 1 消費者)\n variants: {},\n sizes: {}, // trigger avatar 24px density-fixed(header-canonical.spec.md 4.5),無 size 軸 → 兩欄留空為 intentional\n states: ['default', 'focus-visible'],\n tokens: {\n bg: [],\n fg: [],\n ring: ['--ring'], // trigger focus-visible ring canonical\n },\n} as const\n"],"names":[],"mappings":";;;;;AAgGO,MAAM,cAAc,MAAM;AAAA,EAC/B,CAAC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,mBAAmB;AAAA;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GACC,QAAQ;AAGT,QACE,QAAQ,IAAI,aAAa,gBACzB,CAAC,YACD,CAAC,iBACD,CAAC,kBACD,CAAC,WACD;AAEA,cAAQ;AAAA,QACN;AAAA,MAAA;AAAA,IAEJ;AACA,UAAM,SAAS,KAAK,UAAU,CAAA;AAC9B,WACE,qBAAC,cAAA,EAAa,MAAY,aAA0B,cAClD,UAAA;AAAA,MAAA,oBAAC,qBAAA,EAAoB,SAAO,MAO1B,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACE,GAAG;AAAA,UACJ;AAAA,UACA,MAAK;AAAA,UACL,cAAY;AAAA,UACZ,WAAU;AAAA,UAGV,UAAA,oBAAC,QAAA,EAAO,MAAM,IAAK,GAAG,QAAQ,KAAK,OAAO,OAAO,KAAK,KAAA,CAAM;AAAA,QAAA;AAAA,MAAA,GAEhE;AAAA,MACA,oBAAC,qBAAA,EAAoB,OAClB,UAAA,WACC,qBAAA,UAAA,EACE,UAAA;AAAA,QAAA,oBAAC,mBAAA,EACC,UAAA,oBAAC,mBAAA,EAAmB,UAAA,KAAK,MAAK,GAChC;AAAA,QACC;AAAA,MAAA,EAAA,CACH,IAEA,qBAAA,UAAA,EAGE,UAAA;AAAA,QAAA,qBAAC,mBAAA,EACC,UAAA;AAAA,UAAA,oBAAC,mBAAA,EAAmB,eAAK,KAAA,CAAK;AAAA,8BAC7B,kBAAA,EAAiB,WAAW,MAAM,UAAU,eAAe,UAAA,QAE5D;AAAA,8BACC,kBAAA,EAAiB,WAAW,UAAU,UAAU,gBAAgB,UAAA,KAAA,CAEjE;AAAA,QAAA,GACF;AAAA,QACA,oBAAC,qBACC,UAAA,oBAAC,kBAAA,EAAiB,WAAW,QAAQ,UAAU,WAAW,UAAA,KAAA,CAE1D,EAAA,CACF;AAAA,MAAA,EAAA,CACF,EAAA,CAEJ;AAAA,IAAA,GACF;AAAA,EAEJ;AACF;AACA,YAAY,cAAc;AAInB,MAAM,kBAAkB;AAAA,EAC7B,WAAW;AAAA,EACX,QAAQ;AAAA;AAAA,EACR,UAAU,CAAA;AAAA,EACV,OAAO,CAAA;AAAA;AAAA,EACP,QAAQ,CAAC,WAAW,eAAe;AAAA,EACnC,QAAQ;AAAA,IACN,IAAI,CAAA;AAAA,IACJ,IAAI,CAAA;AAAA,IACJ,MAAM,CAAC,QAAQ;AAAA;AAAA,EAAA;AAEnB;"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * AgentFab — 智慧代理浮動開關鈕(AgentPanel 家族附屬資產)+ AgentFabDock(「家 ↔ 貼邊」兩態定位殼)。
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」節)。配色兩極 = AgentLogo AGENT_BRAND(= 自家色階 blue-4 / purple-4;
9
+ * 單一數值來源在 agent-panel-logo.tsx,本檔只 import)。
10
+ * - 內置 24 標誌;貼邊態內置 16 標誌(同一造型,無簡化檔)。
11
+ * - **標誌狀態跟著面板裡的代理走**(prop `logoState`,與 AgentPanelHeader 同名;2026-09-03 user 拍板):入口鈕 = 那個對話收起來的樣子,
12
+ * 所以代理在思考時、即使面板關著,入口鈕的標誌也在轉;有新訊 = 招喚態(標誌蓄勢 + 邊框光圈);閒置 = 靜止。
13
+ * 兩種形態(40 圓 / 28 貼邊)都跟。
14
+ * - 動畫:待機=靜止;有新訊=招喚態(標誌本體蓄勢,漣漪由邊框光圈代位:0–35% 貼邊聚亮 →
15
+ * 35% 呼氣起點自邊框射出 r 21→27、寬 2.5、.35→0 → 90% 散盡 → 靜止空拍;與標誌同 dur /
16
+ * 同 keyTimes / 同 swell→settle,同一 commit 掛載 → 同相);懸停=陰影升一級+微放大。
17
+ * - 兩態定位(AgentFabDock;2026-09-03 user 拍板,取代早期的自由座標與 hover 小鈕):只有兩種合法位置 ——
18
+ * 「家」= 40 圓鈕,位置唯一在右下角(離右、下各 loose);「貼邊」= 28 半圓貼右緣,只有 y 可變(右緣帶內)。
19
+ * **用語**:位置 = 家 / 貼邊,區域 = 帶,選單文案 = 縮小按鈕 / 放大按鈕(不再用「收到邊 / 收合 / 小鈕 / 藍框」)。
20
+ * 拖 40 圓鈕:鈕跟著游標;整段拖曳期間右緣帶(寬 36 = --field-height-md;上緣 = 貼邊鈕圓心落在視窗中線,
21
+ * 下緣 = 貼邊鈕底離家頂一個 loose;貼邊區在下半部、永不與家重疊)以 drop-target 底色 + 三邊虛線框標出
22
+ * (貼右緣那側不畫;見 SNAP_ZONE_CLASSES);游標一進帶內,預覽當場變成 28 半圓**貼在右緣、停在放開會落的高度**
23
+ * (帶內所見即所得),放開就落定;放開在帶外 → 飛回家。
24
+ * 拖 28 貼邊鈕:不顯示帶;帶內沿 y 移動;一出帶外當場變回 40 圓、放開飛回家(帶外沒有自由位置)。
25
+ * 兩態點一下都直接開面板;< 8px 位移視為點擊。鍵盤:家 → 貼邊(停在帶底);貼邊 ↑↓ 16px、← / Home 回家;
26
+ * Shift+F10 開選單;拖曳中 Esc 取消。右鍵選單依狀態只給一項(家:縮小按鈕 ArrowRightToLine;貼邊:放大按鈕
27
+ * ArrowLeftFromLine —— 線 = 右緣、箭頭方向 = 鍵盤 → / ← 等價路徑;lucide 官方 tags collapse / expand 鏡像對
28
+ * https://github.com/lucide-icons/lucide/blob/main/icons/arrow-right-to-line.json)。
29
+ * Tooltip 兩態不同:家「問我或推走我」(邀請拖曳)/ 貼邊「開啟智慧代理」(user 2026-09-03:小鈕只寫開啟)。
30
+ * 動作:形態切換 --motion-duration-overlay(150ms,Carbon moderate-01「小型展開、短距離」)、飛回家 / 落點修正
31
+ * --motion-duration-surface(250ms,Atlassian transitions 150–400「較長時長幫助追蹤空間變化」)+ enter 曲線、
32
+ * 帶底色淡入淡出 150ms;prefers-reduced-motion 全部直接落定(motion.spec.md a11y 段;Atlassian / Fluent 同)。
33
+ * 位置由 consumer 受控/非受控(placement / defaultPlacement / onPlacementChange),DS 不寫 storage。
34
+ * - 減動作:光圈屬常駐位移 loop → prefers-reduced-motion 全停(標誌內部自回靜止)。
35
+ */
36
+ import * as React from 'react';
37
+ import { type AgentLogoState } from './agent-panel-logo';
38
+ export interface AgentFabProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {
39
+ /**
40
+ * 標誌狀態 = **面板裡那個代理當下的狀態**(prop 名與 `AgentPanelHeader.logoState` 一致 —— 產品端同一個變數餵兩邊),面板關著也照跑(2026-09-03 user:「若開啟的 session 是思考中,
41
+ * FAB 的 logo 也應該是思考中」)—— 入口鈕是該對話收起來的樣子,不是另一個獨立的東西:
42
+ * `still` 靜止(閒置)/ `attract` 有新訊(標誌蓄勢 + 邊框光圈)/ `think` 思考中(代理正在回覆,標誌轉動)。
43
+ * 收合成 28 貼邊鈕時同樣跟著跑(尺寸變、狀態不變)。
44
+ */
45
+ logoState?: AgentLogoState;
46
+ }
47
+ declare const AgentFab: React.ForwardRefExoticComponent<AgentFabProps & React.RefAttributes<HTMLButtonElement>>;
48
+ /**
49
+ * 位置:home = 40 圓鈕在右下角(位置唯一,不記座標);dock = 28 半圓貼右緣,只記 y(鈕頂到舞台頂,px,
50
+ * 由元件夾在右緣帶內)。沒有第三種位置 —— 放開在帶外一律回家,使用者不可能把鈕拖到難用的地方。
51
+ */
52
+ export type AgentFabPlacement = {
53
+ kind: 'home';
54
+ } | {
55
+ kind: 'dock';
56
+ y: number;
57
+ };
58
+ /** 預設位置:家(右下角)。 */
59
+ export declare const AGENT_FAB_HOME: AgentFabPlacement;
60
+ interface Point {
61
+ x: number;
62
+ y: number;
63
+ }
64
+ interface Rect extends Point {
65
+ w: number;
66
+ h: number;
67
+ }
68
+ /** 舞台(offsetParent)尺寸與 loose 內距(px)。 */
69
+ interface Stage {
70
+ w: number;
71
+ h: number;
72
+ inset: number;
73
+ }
74
+ /**
75
+ * 磁吸區域表:每列 = 「區域矩形(拖 40 圓鈕時就以底色標出)+ 指標在此區時的落點」。拖曳中的預覽 = 落點本身
76
+ * (帶內所見即所得),放開就落定;指標不在任何區 → 40 圓鈕跟著游標,放開飛回家。判定用**指標**位置
77
+ * (意圖在指尖;Windows Snap 看游標碰邊、Android Bubbles 看拖到關閉區),已在區內時多 16px 遲滯才算離開。
78
+ * 要加磁吸點(鏡像左緣、四角…)只在此表加一列(必要時擴 AgentFabPlacement 的 kind),拖曳 / 預覽 / 底色流程不變
79
+ * (spec「遮擋與貼邊」節「區域 → 落點表」)。
80
+ */
81
+ interface SnapZone {
82
+ rect: (s: Stage) => Rect;
83
+ /** 指標在區內時的落點(y = 指標減去抓取偏移,夾在合法範圍)。 */
84
+ placement: (p: Point, grab: Point, s: Stage) => AgentFabPlacement;
85
+ }
86
+ /**
87
+ * @internal 拖曳磁吸的純函式與常數(無 DOM),只給 `scripts/test-agent-fab-drag-zones.mjs` 單測消費;
88
+ * 不是 consumer API(root barrel 排除,per-component subpath `export *` 仍看得到)。
89
+ */
90
+ export declare const AGENT_FAB_DRAG_INTERNALS: {
91
+ readonly BAND_PX: 36;
92
+ readonly DOCK_PX: 28;
93
+ readonly HYSTERESIS: 16;
94
+ readonly dockMinY: (s: Stage) => number;
95
+ readonly dockMaxY: (s: Stage) => number;
96
+ readonly dragPoint: (s: Stage, dx: number, dy: number) => Point;
97
+ readonly findZone: (p: Point, s: Stage, active: SnapZone | null) => SnapZone | null;
98
+ readonly SNAP_ZONES: readonly SnapZone[];
99
+ };
100
+ /**
101
+ * 本元件**自己必須擁有**、不接受 consumer 覆寫的 button prop。
102
+ * 這些 handler 是拖曳引擎與選單的一部分(門檻判定、吞掉拖曳後的 click、右鍵開選單、鍵盤移動),
103
+ * 被覆寫等於把「點了卻沒開」種回去;而 `disabled` 沒有對應的視覺(鈕長得一模一樣),
104
+ * 傳了只會讓瀏覽器靜靜不派 click —— 型別層直接擋掉,比事後 debug 便宜
105
+ * (兩條都由 2026-09-03 跨模型獨立審查點出)。
106
+ */
107
+ type FabOwnedButtonProps = 'onPointerDown' | 'onClickCapture' | 'onContextMenu' | 'onKeyDown' | 'disabled';
108
+ export interface AgentFabDockProps extends Omit<AgentFabProps, 'className' | 'onClick' | FabOwnedButtonProps> {
109
+ /** 受控位置。 */
110
+ placement?: AgentFabPlacement;
111
+ /** 非受控初始位置;預設家(右下角)。 */
112
+ defaultPlacement?: AgentFabPlacement;
113
+ /** 位置變更(拖放 / 鍵盤 / 選單);consumer 自行決定要不要持久化(DS 不寫 storage)。 */
114
+ onPlacementChange?: (placement: AgentFabPlacement) => void;
115
+ /** 點擊(開面板);兩態都一段,拖曳超過門檻的放開不觸發。 */
116
+ onClick?: React.MouseEventHandler<HTMLButtonElement>;
117
+ /** 定位殼 className(殼為 absolute,舞台需 relative)。 */
118
+ className?: string;
119
+ /** 文案(可覆寫供 i18n)。 */
120
+ labels?: {
121
+ dock?: string;
122
+ home?: string;
123
+ tooltip?: string;
124
+ tooltipDock?: string;
125
+ };
126
+ }
127
+ declare const AgentFabDock: React.ForwardRefExoticComponent<AgentFabDockProps & React.RefAttributes<HTMLDivElement>>;
128
+ export interface AgentPanelDockRenderProps {
129
+ /** 關閉面板 → 入口鈕回到上次的位置。接到 AgentPanelHeader 的 onClose。 */
130
+ close: () => void;
131
+ /** 目前的代理狀態(與入口鈕標誌同一個值);接到 AgentPanelHeader 的 logoState。 */
132
+ logoState: AgentLogoState;
133
+ }
134
+ export interface AgentPanelDockProps extends Omit<AgentFabDockProps, 'onClick' | 'children' | 'logoState'> {
135
+ /** 入口鈕位置(受控);省略 = 由本元件保管,面板開關不會忘記(見下方註解)。 */
136
+ /** 面板是否開啟(受控);省略 = 非受控。 */
137
+ open?: boolean;
138
+ /** 非受控初始開關;預設開。 */
139
+ defaultOpen?: boolean;
140
+ onOpenChange?: (open: boolean) => void;
141
+ /** 代理狀態:面板標題列與入口鈕標誌吃同一個值(關著面板也照跑)。 */
142
+ logoState?: AgentLogoState;
143
+ /**
144
+ * 面板內容。**關閉時仍然渲染,只是藏起來**(2026-09-07 G2)——
145
+ * 這樣捲動位置、輸入框草稿、展開狀態才留得住(spec E 條「閱讀位置保存」)。
146
+ * 視覺上仍與入口鈕互斥:關著時面板 `display:none`、只看得到入口鈕。
147
+ */
148
+ children: (props: AgentPanelDockRenderProps) => React.ReactNode;
149
+ }
150
+ /**
151
+ * 面板與入口鈕互斥的唯一住所:開 → 只有面板(× 關閉);關 → 只有入口鈕(點一下開回來),
152
+ * 入口鈕位置與標誌狀態都留在這裡,產品端不必各自寫一份(2026-09-03 user:「所有範例的關閉按鈕都可以加上去了」)。
153
+ * 外層容器需 `relative`(入口鈕以 absolute 定位在其中)。
154
+ */
155
+ declare const AgentPanelDock: React.ForwardRefExoticComponent<AgentPanelDockProps & React.RefAttributes<HTMLDivElement>>;
156
+ export { AgentFab, AgentFabDock, AgentPanelDock };
157
+ //# sourceMappingURL=agent-panel-fab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-panel-fab.d.ts","sourceRoot":"","sources":["../../../src/components/AgentPanel/agent-panel-fab.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAW9B,OAAO,EAGL,KAAK,cAAc,EAOpB,MAAM,oBAAoB,CAAA;AAO3B,MAAM,WAAW,aACf,SAAQ,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC;IACvE;;;;;OAKG;IACH,SAAS,CAAC,EAAE,cAAc,CAAA;CAC3B;AAiED,QAAA,MAAM,QAAQ,yFA6Bb,CAAA;AAOD;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAE9E,mBAAmB;AACnB,eAAO,MAAM,cAAc,EAAE,iBAAoC,CAAA;AAGjE,UAAU,KAAK;IACb,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AACD,UAAU,IAAK,SAAQ,KAAK;IAC1B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AACD,wCAAwC;AACxC,UAAU,KAAK;IACb,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;CACd;AAyFD;;;;;;GAMG;AACH,UAAU,QAAQ;IAChB,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;IACxB,sCAAsC;IACtC,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,KAAK,iBAAiB,CAAA;CAClE;AAiBD;;;GAGG;AACH,eAAO,MAAM,wBAAwB;;;;2BAjEhB,KAAK;2BACL,KAAK;4BA0DJ,KAAK,MAAM,MAAM,MAAM,MAAM,KAAG,KAAK;2BAPtC,KAAK,KAAK,KAAK,UAAU,QAAQ,GAAG,IAAI,KAAG,QAAQ,GAAG,IAAI;;CAauD,CAAA;AA4KtI;;;;;;GAMG;AACH,KAAK,mBAAmB,GAAG,eAAe,GAAG,gBAAgB,GAAG,eAAe,GAAG,WAAW,GAAG,UAAU,CAAA;AAE1G,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,SAAS,GAAG,mBAAmB,CAAC;IAC3G,YAAY;IACZ,SAAS,CAAC,EAAE,iBAAiB,CAAA;IAC7B,wBAAwB;IACxB,gBAAgB,CAAC,EAAE,iBAAiB,CAAA;IACpC,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,IAAI,CAAA;IAC1D,kCAAkC;IAClC,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAA;IACpD,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qBAAqB;IACrB,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAClF;AAED,QAAA,MAAM,YAAY,0FAqSjB,CAAA;AAOD,MAAM,WAAW,yBAAyB;IACxC,uDAAuD;IACvD,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,2DAA2D;IAC3D,SAAS,EAAE,cAAc,CAAA;CAC1B;AAED,MAAM,WAAW,mBACf,SAAQ,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IACrE,6CAA6C;IAC7C,2BAA2B;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,mBAAmB;IACnB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,sCAAsC;IACtC,SAAS,CAAC,EAAE,cAAc,CAAA;IAC1B;;;;OAIG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,KAAK,CAAC,SAAS,CAAA;CAChE;AAED;;;;GAIG;AACH,QAAA,MAAM,cAAc,4FAyEnB,CAAA;AAGD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,CAAA"}