@qijenchen/design-system 0.1.0-beta.83 → 0.1.0-beta.85

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 (622) hide show
  1. package/CLAUDE.md +8 -8
  2. package/README.md +3 -2
  3. package/dist/components/Alert/alert.js.map +1 -1
  4. package/dist/components/AppShell/_demo-helpers.d.ts.map +1 -1
  5. package/dist/components/AppShell/app-shell.d.ts +1 -1
  6. package/dist/components/AppShell/app-shell.d.ts.map +1 -1
  7. package/dist/components/AppShell/app-shell.js +22 -2
  8. package/dist/components/AppShell/app-shell.js.map +1 -1
  9. package/dist/components/Avatar/avatar.d.ts.map +1 -1
  10. package/dist/components/Avatar/avatar.js +4 -4
  11. package/dist/components/Avatar/avatar.js.map +1 -1
  12. package/dist/components/Breadcrumb/breadcrumb.d.ts.map +1 -1
  13. package/dist/components/Breadcrumb/breadcrumb.js +1 -1
  14. package/dist/components/Breadcrumb/breadcrumb.js.map +1 -1
  15. package/dist/components/Button/button.d.ts +2 -2
  16. package/dist/components/Button/button.d.ts.map +1 -1
  17. package/dist/components/Button/button.js +12 -3
  18. package/dist/components/Button/button.js.map +1 -1
  19. package/dist/components/Calendar/calendar.d.ts +13 -5
  20. package/dist/components/Calendar/calendar.d.ts.map +1 -1
  21. package/dist/components/Calendar/calendar.js +7 -1
  22. package/dist/components/Calendar/calendar.js.map +1 -1
  23. package/dist/components/Carousel/carousel.d.ts.map +1 -1
  24. package/dist/components/Carousel/carousel.js +8 -3
  25. package/dist/components/Carousel/carousel.js.map +1 -1
  26. package/dist/components/Chart/chart.d.ts.map +1 -1
  27. package/dist/components/Chart/chart.js +1 -0
  28. package/dist/components/Chart/chart.js.map +1 -1
  29. package/dist/components/Checkbox/checkbox.d.ts +1 -1
  30. package/dist/components/Checkbox/checkbox.d.ts.map +1 -1
  31. package/dist/components/Checkbox/checkbox.js +8 -4
  32. package/dist/components/Checkbox/checkbox.js.map +1 -1
  33. package/dist/components/Chip/chip.d.ts +1 -1
  34. package/dist/components/Chip/chip.d.ts.map +1 -1
  35. package/dist/components/Chip/chip.js.map +1 -1
  36. package/dist/components/Coachmark/coachmark.d.ts +10 -3
  37. package/dist/components/Coachmark/coachmark.d.ts.map +1 -1
  38. package/dist/components/Coachmark/coachmark.js.map +1 -1
  39. package/dist/components/Combobox/combobox.d.ts +5 -1
  40. package/dist/components/Combobox/combobox.d.ts.map +1 -1
  41. package/dist/components/Combobox/combobox.js +30 -13
  42. package/dist/components/Combobox/combobox.js.map +1 -1
  43. package/dist/components/DataTable/cell-registry.d.ts.map +1 -1
  44. package/dist/components/DataTable/cell-registry.js +53 -62
  45. package/dist/components/DataTable/cell-registry.js.map +1 -1
  46. package/dist/components/DataTable/column-types.d.ts +10 -4
  47. package/dist/components/DataTable/column-types.d.ts.map +1 -1
  48. package/dist/components/DataTable/column-types.js.map +1 -1
  49. package/dist/components/DataTable/data-table-column-visibility-panel.d.ts +1 -1
  50. package/dist/components/DataTable/data-table-column-visibility-panel.js +183 -0
  51. package/dist/components/DataTable/data-table-column-visibility-panel.js.map +1 -0
  52. package/dist/components/DataTable/data-table-filter-group.d.ts +47 -0
  53. package/dist/components/DataTable/data-table-filter-group.d.ts.map +1 -0
  54. package/dist/components/DataTable/data-table-filter-group.js +154 -0
  55. package/dist/components/DataTable/data-table-filter-group.js.map +1 -0
  56. package/dist/components/DataTable/data-table-filter-panel.d.ts.map +1 -1
  57. package/dist/components/DataTable/data-table-filter-panel.js +285 -0
  58. package/dist/components/DataTable/data-table-filter-panel.js.map +1 -0
  59. package/dist/components/DataTable/data-table-filter-value-picker.d.ts +29 -0
  60. package/dist/components/DataTable/data-table-filter-value-picker.d.ts.map +1 -0
  61. package/dist/components/DataTable/data-table-filter-value-picker.js +187 -0
  62. package/dist/components/DataTable/data-table-filter-value-picker.js.map +1 -0
  63. package/dist/components/DataTable/data-table-interaction-layer.d.ts +11 -15
  64. package/dist/components/DataTable/data-table-interaction-layer.d.ts.map +1 -1
  65. package/dist/components/DataTable/data-table-interaction-layer.js +1 -3
  66. package/dist/components/DataTable/data-table-interaction-layer.js.map +1 -1
  67. package/dist/components/DataTable/data-table-sort-manager.js +140 -0
  68. package/dist/components/DataTable/data-table-sort-manager.js.map +1 -0
  69. package/dist/components/DataTable/data-table.d.ts +5 -6
  70. package/dist/components/DataTable/data-table.d.ts.map +1 -1
  71. package/dist/components/DataTable/data-table.js +36 -15
  72. package/dist/components/DataTable/data-table.js.map +1 -1
  73. package/dist/components/DataTable/filter-operators.js +140 -0
  74. package/dist/components/DataTable/filter-operators.js.map +1 -0
  75. package/dist/components/DataTable/filter-tree.js +312 -0
  76. package/dist/components/DataTable/filter-tree.js.map +1 -0
  77. package/dist/components/DataTable/index.d.ts +3 -0
  78. package/dist/components/DataTable/index.d.ts.map +1 -1
  79. package/dist/components/DataTable/index.js +12 -1
  80. package/dist/components/DataTable/index.js.map +1 -1
  81. package/dist/components/DataTable/lib/column-meta.js +25 -0
  82. package/dist/components/DataTable/lib/column-meta.js.map +1 -0
  83. package/dist/components/DateGrid/date-grid.d.ts.map +1 -1
  84. package/dist/components/DateGrid/date-grid.js +3 -1
  85. package/dist/components/DateGrid/date-grid.js.map +1 -1
  86. package/dist/components/DatePicker/date-picker.d.ts +7 -1
  87. package/dist/components/DatePicker/date-picker.d.ts.map +1 -1
  88. package/dist/components/DatePicker/date-picker.js +105 -74
  89. package/dist/components/DatePicker/date-picker.js.map +1 -1
  90. package/dist/components/Dialog/dialog.d.ts +20 -3
  91. package/dist/components/Dialog/dialog.d.ts.map +1 -1
  92. package/dist/components/Dialog/dialog.js +38 -20
  93. package/dist/components/Dialog/dialog.js.map +1 -1
  94. package/dist/components/DropdownMenu/dropdown-menu.d.ts.map +1 -1
  95. package/dist/components/DropdownMenu/dropdown-menu.js +3 -1
  96. package/dist/components/DropdownMenu/dropdown-menu.js.map +1 -1
  97. package/dist/components/Field/field-context.d.ts +45 -5
  98. package/dist/components/Field/field-context.d.ts.map +1 -1
  99. package/dist/components/Field/field-context.js +19 -0
  100. package/dist/components/Field/field-context.js.map +1 -1
  101. package/dist/components/Field/field-edit-keys.d.ts +21 -0
  102. package/dist/components/Field/field-edit-keys.d.ts.map +1 -0
  103. package/dist/components/Field/field-edit-keys.js +19 -0
  104. package/dist/components/Field/field-edit-keys.js.map +1 -0
  105. package/dist/components/Field/field-types.d.ts +20 -1
  106. package/dist/components/Field/field-types.d.ts.map +1 -1
  107. package/dist/components/Field/field-types.js.map +1 -1
  108. package/dist/components/Field/field-wrapper.d.ts +3 -2
  109. package/dist/components/Field/field-wrapper.d.ts.map +1 -1
  110. package/dist/components/Field/field-wrapper.js +38 -39
  111. package/dist/components/Field/field-wrapper.js.map +1 -1
  112. package/dist/components/Field/field.d.ts +2 -1
  113. package/dist/components/Field/field.d.ts.map +1 -1
  114. package/dist/components/Field/field.js.map +1 -1
  115. package/dist/components/Field/index.d.ts +1 -0
  116. package/dist/components/Field/index.d.ts.map +1 -1
  117. package/dist/components/Field/index.js +2 -0
  118. package/dist/components/Field/index.js.map +1 -1
  119. package/dist/components/FieldControlGroup/field-control-group.d.ts +1 -1
  120. package/dist/components/FieldControlGroup/field-control-group.js.map +1 -1
  121. package/dist/components/FileItem/file-item.d.ts.map +1 -1
  122. package/dist/components/FileItem/file-item.js +1 -1
  123. package/dist/components/FileItem/file-item.js.map +1 -1
  124. package/dist/components/FileUpload/file-upload.d.ts +1 -1
  125. package/dist/components/FileUpload/file-upload.js.map +1 -1
  126. package/dist/components/FileViewer/file-viewer.d.ts.map +1 -1
  127. package/dist/components/FileViewer/file-viewer.js +7 -2
  128. package/dist/components/FileViewer/file-viewer.js.map +1 -1
  129. package/dist/components/FileViewer/image-renderer.d.ts.map +1 -1
  130. package/dist/components/FileViewer/image-renderer.js +22 -1
  131. package/dist/components/FileViewer/image-renderer.js.map +1 -1
  132. package/dist/components/HoverCard/hover-card.d.ts.map +1 -1
  133. package/dist/components/HoverCard/hover-card.js +5 -3
  134. package/dist/components/HoverCard/hover-card.js.map +1 -1
  135. package/dist/components/InlineEdit/index.d.ts +2 -0
  136. package/dist/components/InlineEdit/index.d.ts.map +1 -0
  137. package/dist/components/InlineEdit/index.js +5 -0
  138. package/dist/components/InlineEdit/index.js.map +1 -0
  139. package/dist/components/InlineEdit/inline-edit.d.ts +59 -0
  140. package/dist/components/InlineEdit/inline-edit.d.ts.map +1 -0
  141. package/dist/components/InlineEdit/inline-edit.js +164 -0
  142. package/dist/components/InlineEdit/inline-edit.js.map +1 -0
  143. package/dist/components/Input/input.d.ts +6 -11
  144. package/dist/components/Input/input.d.ts.map +1 -1
  145. package/dist/components/Input/input.js +43 -13
  146. package/dist/components/Input/input.js.map +1 -1
  147. package/dist/components/LinkInput/link-input.d.ts +2 -2
  148. package/dist/components/LinkInput/link-input.d.ts.map +1 -1
  149. package/dist/components/LinkInput/link-input.js +6 -5
  150. package/dist/components/LinkInput/link-input.js.map +1 -1
  151. package/dist/components/Menu/menu-item.d.ts +14 -2
  152. package/dist/components/Menu/menu-item.d.ts.map +1 -1
  153. package/dist/components/Menu/menu-item.js +25 -3
  154. package/dist/components/Menu/menu-item.js.map +1 -1
  155. package/dist/components/NumberInput/number-input.d.ts +3 -3
  156. package/dist/components/NumberInput/number-input.d.ts.map +1 -1
  157. package/dist/components/NumberInput/number-input.js +6 -5
  158. package/dist/components/NumberInput/number-input.js.map +1 -1
  159. package/dist/components/OverflowIndicator/overflow-indicator.d.ts.map +1 -1
  160. package/dist/components/OverflowIndicator/overflow-indicator.js +2 -6
  161. package/dist/components/OverflowIndicator/overflow-indicator.js.map +1 -1
  162. package/dist/components/Pagination/pagination.js +1 -1
  163. package/dist/components/Pagination/pagination.js.map +1 -1
  164. package/dist/components/PeoplePicker/index.js +7 -1
  165. package/dist/components/PeoplePicker/index.js.map +1 -1
  166. package/dist/components/PeoplePicker/people-picker.d.ts +9 -2
  167. package/dist/components/PeoplePicker/people-picker.d.ts.map +1 -1
  168. package/dist/components/PeoplePicker/people-picker.js +23 -10
  169. package/dist/components/PeoplePicker/people-picker.js.map +1 -1
  170. package/dist/components/PeoplePicker/person-display.d.ts +6 -3
  171. package/dist/components/PeoplePicker/person-display.d.ts.map +1 -1
  172. package/dist/components/PeoplePicker/person-display.js +19 -14
  173. package/dist/components/PeoplePicker/person-display.js.map +1 -1
  174. package/dist/components/Popover/popover.d.ts.map +1 -1
  175. package/dist/components/Popover/popover.js +3 -1
  176. package/dist/components/Popover/popover.js.map +1 -1
  177. package/dist/components/ProfileCard/profile-card.d.ts +2 -2
  178. package/dist/components/ProfileCard/profile-card.js +3 -3
  179. package/dist/components/ProfileCard/profile-card.js.map +1 -1
  180. package/dist/components/RadioGroup/radio-group.d.ts.map +1 -1
  181. package/dist/components/RadioGroup/radio-group.js +15 -9
  182. package/dist/components/RadioGroup/radio-group.js.map +1 -1
  183. package/dist/components/ScrollArea/scroll-area.d.ts +11 -1
  184. package/dist/components/ScrollArea/scroll-area.d.ts.map +1 -1
  185. package/dist/components/ScrollArea/scroll-area.js +6 -3
  186. package/dist/components/ScrollArea/scroll-area.js.map +1 -1
  187. package/dist/components/Select/select.d.ts +46 -5
  188. package/dist/components/Select/select.d.ts.map +1 -1
  189. package/dist/components/Select/select.js +109 -28
  190. package/dist/components/Select/select.js.map +1 -1
  191. package/dist/components/SelectMenu/select-menu.d.ts +3 -1
  192. package/dist/components/SelectMenu/select-menu.d.ts.map +1 -1
  193. package/dist/components/SelectMenu/select-menu.js +8 -1
  194. package/dist/components/SelectMenu/select-menu.js.map +1 -1
  195. package/dist/components/SelectionControl/boolean-value.d.ts +11 -0
  196. package/dist/components/SelectionControl/boolean-value.d.ts.map +1 -0
  197. package/dist/components/SelectionControl/boolean-value.js +23 -0
  198. package/dist/components/SelectionControl/boolean-value.js.map +1 -0
  199. package/dist/components/SelectionControl/index.d.ts +1 -0
  200. package/dist/components/SelectionControl/index.d.ts.map +1 -1
  201. package/dist/components/SelectionControl/index.js +2 -0
  202. package/dist/components/SelectionControl/index.js.map +1 -1
  203. package/dist/components/Sheet/index.js +2 -1
  204. package/dist/components/Sheet/sheet.d.ts +7 -1
  205. package/dist/components/Sheet/sheet.d.ts.map +1 -1
  206. package/dist/components/Sheet/sheet.js +5 -2
  207. package/dist/components/Sheet/sheet.js.map +1 -1
  208. package/dist/components/Sidebar/sidebar.d.ts +9 -4
  209. package/dist/components/Sidebar/sidebar.d.ts.map +1 -1
  210. package/dist/components/Sidebar/sidebar.js +8 -10
  211. package/dist/components/Sidebar/sidebar.js.map +1 -1
  212. package/dist/components/Slider/slider.d.ts.map +1 -1
  213. package/dist/components/Slider/slider.js.map +1 -1
  214. package/dist/components/Switch/switch.d.ts +6 -6
  215. package/dist/components/Switch/switch.d.ts.map +1 -1
  216. package/dist/components/Switch/switch.js +3 -2
  217. package/dist/components/Switch/switch.js.map +1 -1
  218. package/dist/components/Tabs/tabs.d.ts.map +1 -1
  219. package/dist/components/Tabs/tabs.js +15 -1
  220. package/dist/components/Tabs/tabs.js.map +1 -1
  221. package/dist/components/Textarea/textarea.d.ts +2 -2
  222. package/dist/components/Textarea/textarea.d.ts.map +1 -1
  223. package/dist/components/Textarea/textarea.js +50 -42
  224. package/dist/components/Textarea/textarea.js.map +1 -1
  225. package/dist/components/TimePicker/time-columns.d.ts.map +1 -1
  226. package/dist/components/TimePicker/time-columns.js +42 -38
  227. package/dist/components/TimePicker/time-columns.js.map +1 -1
  228. package/dist/components/TimePicker/time-picker.d.ts.map +1 -1
  229. package/dist/components/TimePicker/time-picker.js +8 -6
  230. package/dist/components/TimePicker/time-picker.js.map +1 -1
  231. package/dist/components/Tooltip/tooltip.d.ts.map +1 -1
  232. package/dist/components/Tooltip/tooltip.js +7 -5
  233. package/dist/components/Tooltip/tooltip.js.map +1 -1
  234. package/dist/components/TreeView/tree-view.d.ts +56 -1
  235. package/dist/components/TreeView/tree-view.d.ts.map +1 -1
  236. package/dist/components/TreeView/tree-view.js +211 -12
  237. package/dist/components/TreeView/tree-view.js.map +1 -1
  238. package/dist/index.d.ts +115 -58
  239. package/dist/index.d.ts.map +1 -1
  240. package/dist/index.js +95 -108
  241. package/dist/index.js.map +1 -1
  242. package/dist/patterns/element-anatomy/item-anatomy.d.ts +7 -6
  243. package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -1
  244. package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -1
  245. package/dist/tokens/categorical-color.js +15 -0
  246. package/dist/tokens/categorical-color.js.map +1 -1
  247. package/dist/tokens/motion/motion.d.ts +7 -6
  248. package/dist/tokens/motion/motion.d.ts.map +1 -1
  249. package/dist/tokens/motion/motion.js +6 -6
  250. package/dist/tokens/motion/motion.js.map +1 -1
  251. package/dist/tokens/motion/overlay-motion.d.ts +19 -0
  252. package/dist/tokens/motion/overlay-motion.d.ts.map +1 -0
  253. package/dist/tokens/motion/overlay-motion.js +9 -0
  254. package/dist/tokens/motion/overlay-motion.js.map +1 -0
  255. package/dist/tokens/uiSize/icon-size.js +5 -0
  256. package/dist/tokens/uiSize/icon-size.js.map +1 -0
  257. package/ds-canonical/fork/governance.lock +31 -19
  258. package/ds-canonical/fork/hooks/_log-fire.sh +46 -0
  259. package/ds-canonical/fork/hooks/block_prototype_imports.py +15 -4
  260. package/ds-canonical/fork/hooks/check_consumer_app_invariants.sh +145 -13
  261. package/ds-canonical/fork/hooks/check_ds_anchor_preflight.sh +2 -1
  262. package/ds-canonical/fork/hooks/check_dynamic_tailwind_class.sh +47 -0
  263. package/ds-canonical/fork/hooks/check_escape_marker_abuse.sh +27 -0
  264. package/ds-canonical/fork/hooks/check_field_family_invariants.sh +61 -1
  265. package/ds-canonical/fork/hooks/check_layout_space_magic_numbers.sh +28 -4
  266. package/ds-canonical/fork/hooks/check_opacity_token_usage.sh +28 -0
  267. package/ds-canonical/fork/hooks/check_story_determinism.sh +2 -0
  268. package/ds-canonical/fork/hooks/check_story_invariants.sh +119 -0
  269. package/ds-canonical/fork/hooks/check_tabs_content_chrome_body_double_gap.sh +29 -0
  270. package/ds-canonical/fork/manifest.json +15 -0
  271. package/ds-canonical/fork/preamble.md +20 -18
  272. package/ds-canonical/fork/skills/bug-fix-rhythm/SKILL.md +3 -3
  273. package/ds-canonical/fork/skills/code-quality-audit/SKILL.md +3 -3
  274. package/ds-canonical/fork/skills/delivery-handoff/SKILL.md +1 -1
  275. package/ds-canonical/fork/skills/product-ui-audit/SKILL.md +3 -3
  276. package/ds-canonical/fork/skills/propose-options/SKILL.md +3 -3
  277. package/ds-canonical/fork/skills/prototype/SKILL.md +1 -1
  278. package/ds-canonical/fork/skills/scan-similar-bugs/SKILL.md +2 -2
  279. package/ds-canonical/fork/skills/visual-audit/SKILL.md +2 -2
  280. package/ds-canonical/hooks/README.md +1 -1
  281. package/ds-canonical/hooks/block_prototype_imports.py +15 -4
  282. package/ds-canonical/hooks/check_audit_post_report_validator.sh +65 -7
  283. package/ds-canonical/hooks/check_codex_brief_invariants.sh +28 -1
  284. package/ds-canonical/hooks/check_consumer_app_invariants.sh +145 -13
  285. package/ds-canonical/hooks/check_datatable_invariants.sh +6 -3
  286. package/ds-canonical/hooks/check_ds_anchor_preflight.sh +2 -1
  287. package/ds-canonical/hooks/check_dynamic_tailwind_class.sh +47 -0
  288. package/ds-canonical/hooks/check_escape_marker_abuse.sh +27 -0
  289. package/ds-canonical/hooks/check_field_family_invariants.sh +61 -1
  290. package/ds-canonical/hooks/check_layout_space_magic_numbers.sh +28 -4
  291. package/ds-canonical/hooks/check_naming_and_abstraction.sh +1 -1
  292. package/ds-canonical/hooks/check_opacity_token_usage.sh +28 -0
  293. package/ds-canonical/hooks/check_pixel_quantified_audit.sh +3 -2
  294. package/ds-canonical/hooks/check_post_main_ssot_propagate.sh +6 -1
  295. package/ds-canonical/hooks/check_ssot_header_declaration.sh +3 -1
  296. package/ds-canonical/hooks/check_story_determinism.sh +2 -0
  297. package/ds-canonical/hooks/check_substantive_edit_approval_preflight.sh +8 -7
  298. package/ds-canonical/hooks/check_tabs_content_chrome_body_double_gap.sh +29 -0
  299. package/ds-canonical/hooks/lib/_story_compile_drift.sh +1 -1
  300. package/ds-canonical/hooks/lib/_token_hygiene.sh +10 -1
  301. package/ds-canonical/hooks/stop_self_audit.sh +31 -0
  302. package/ds-canonical/hooks/tests/test_block_prototype_imports.sh +24 -0
  303. package/ds-canonical/hooks/tests/test_check_audit_post_report_validator.sh +44 -0
  304. package/ds-canonical/hooks/tests/test_check_codex_brief_invariants.sh +43 -2
  305. package/ds-canonical/hooks/tests/test_check_consumer_ds_primitive_misuse.sh +112 -0
  306. package/ds-canonical/hooks/tests/test_check_consumer_story_baseline.sh +9 -2
  307. package/ds-canonical/hooks/tests/test_check_dynamic_tailwind_class.sh +76 -0
  308. package/ds-canonical/hooks/tests/test_check_escape_marker_abuse.sh +24 -0
  309. package/ds-canonical/hooks/tests/test_check_field_family_invariants.sh +27 -2
  310. package/ds-canonical/hooks/tests/test_check_opacity_token_usage.sh +39 -0
  311. package/ds-canonical/hooks/tests/test_check_tabs_content_chrome_body_double_gap.sh +76 -0
  312. package/ds-canonical/references/audit-coverage-vs-24-checklist.md +1 -1
  313. package/ds-canonical/references/build-ui-canonicals.md +2 -1
  314. package/ds-canonical/references/failure-class-registry.json +145 -0
  315. package/ds-canonical/references/governance-audit-coverage.md +33 -0
  316. package/ds-canonical/references/item-anatomy-recipe.md +2 -2
  317. package/ds-canonical/references/scenario-definition.md +6 -9
  318. package/ds-canonical/references/ssot-consultation.md +2 -2
  319. package/ds-canonical/references/ssot-index.md +5 -4
  320. package/ds-canonical/references/story-baseline-registry.json +8 -2
  321. package/ds-canonical/references/structural-token-retention.md +6 -9
  322. package/ds-canonical/rules/meta-patterns.md +8 -8
  323. package/ds-canonical/rules/self-verify.md +4 -3
  324. package/ds-canonical/rules/story-rules.md +2 -2
  325. package/ds-canonical/rules/ui-development.md +2 -2
  326. package/ds-canonical/skills/bug-fix-rhythm/SKILL.md +3 -3
  327. package/ds-canonical/skills/code-quality-audit/SKILL.md +3 -3
  328. package/ds-canonical/skills/codex-collab/SKILL.md +9 -7
  329. package/ds-canonical/skills/codex-collab/references/brief-template.md +1 -1
  330. package/ds-canonical/skills/codify-principle/SKILL.md +2 -2
  331. package/ds-canonical/skills/component-quality-gate/SKILL.md +1 -1
  332. package/ds-canonical/skills/component-quality-gate/references/checklist.md +2 -2
  333. package/ds-canonical/skills/deep-audit-cross-codex/SKILL.md +51 -58
  334. package/ds-canonical/skills/deep-audit-cross-codex/references/phase-a-workflow.md +29 -0
  335. package/ds-canonical/skills/deep-audit-cross-codex/references/phase-b-codex-brief.md +29 -10
  336. package/ds-canonical/skills/deep-audit-cross-codex/references/triage-rubric.md +21 -0
  337. package/ds-canonical/skills/delivery-handoff/SKILL.md +1 -1
  338. package/ds-canonical/skills/design-system-audit/SKILL.md +26 -25
  339. package/ds-canonical/skills/design-system-audit/references/audit-prompts.md +13 -1
  340. package/ds-canonical/skills/design-system-audit/references/rule-placement.md +1 -1
  341. package/ds-canonical/skills/governance-health/SKILL.md +1 -1
  342. package/ds-canonical/skills/knowledge-prune/SKILL.md +3 -0
  343. package/ds-canonical/skills/knowledge-prune/references/prune-dimensions-d5-d10.md +1 -0
  344. package/ds-canonical/skills/new-component/SKILL.md +5 -5
  345. package/ds-canonical/skills/new-component/references/new-component-checklist.md +1 -1
  346. package/ds-canonical/skills/product-ui-audit/SKILL.md +3 -3
  347. package/ds-canonical/skills/propose-options/SKILL.md +3 -3
  348. package/ds-canonical/skills/prototype/SKILL.md +1 -1
  349. package/ds-canonical/skills/scan-similar-bugs/SKILL.md +2 -2
  350. package/ds-canonical/skills/story-auto-compile-migrate/SKILL.md +3 -3
  351. package/ds-canonical/skills/story-writing/SKILL.md +3 -3
  352. package/ds-canonical/skills/visual-audit/SKILL.md +2 -2
  353. package/ds-story-manifest.json +29 -20
  354. package/llms-full.txt +22 -1
  355. package/llms.txt +5 -4
  356. package/package.json +7 -3
  357. package/src/components/Accordion/accordion.principles.stories.tsx +1 -1
  358. package/src/components/Accordion/accordion.stories.tsx +16 -1
  359. package/src/components/Alert/alert.principles.stories.tsx +1 -1
  360. package/src/components/Alert/alert.spec.md +8 -10
  361. package/src/components/Alert/alert.stories.tsx +28 -28
  362. package/src/components/Alert/alert.tsx +1 -1
  363. package/src/components/AppShell/_demo-helpers.tsx +6 -3
  364. package/src/components/AppShell/app-shell.spec.md +4 -4
  365. package/src/components/AppShell/app-shell.tsx +28 -2
  366. package/src/components/AspectRatio/aspect-ratio.spec.md +1 -1
  367. package/src/components/AspectRatio/aspect-ratio.stories.tsx +7 -89
  368. package/src/components/Avatar/avatar.anatomy.stories.tsx +7 -3
  369. package/src/components/Avatar/avatar.principles.stories.tsx +19 -15
  370. package/src/components/Avatar/avatar.spec.md +2 -2
  371. package/src/components/Avatar/avatar.stories.tsx +8 -6
  372. package/src/components/Avatar/avatar.tsx +13 -5
  373. package/src/components/Badge/badge.principles.stories.tsx +1 -1
  374. package/src/components/Badge/badge.spec.md +2 -0
  375. package/src/components/Badge/badge.stories.tsx +4 -2
  376. package/src/components/Breadcrumb/breadcrumb.principles.stories.tsx +6 -4
  377. package/src/components/Breadcrumb/breadcrumb.stories.tsx +6 -5
  378. package/src/components/Breadcrumb/breadcrumb.tsx +3 -2
  379. package/src/components/BulkActionBar/bulk-action-bar.spec.md +4 -2
  380. package/src/components/Button/button.principles.stories.tsx +1 -1
  381. package/src/components/Button/button.spec.md +2 -2
  382. package/src/components/Button/button.tsx +18 -3
  383. package/src/components/Calendar/calendar.anatomy.stories.tsx +12 -10
  384. package/src/components/Calendar/calendar.principles.stories.tsx +14 -6
  385. package/src/components/Calendar/calendar.spec.md +5 -4
  386. package/src/components/Calendar/calendar.stories.tsx +7 -4
  387. package/src/components/Calendar/calendar.tsx +26 -7
  388. package/src/components/Carousel/carousel.anatomy.stories.tsx +5 -4
  389. package/src/components/Carousel/carousel.spec.md +2 -2
  390. package/src/components/Carousel/carousel.tsx +11 -3
  391. package/src/components/Chart/chart.anatomy.stories.tsx +7 -4
  392. package/src/components/Chart/chart.principles.stories.tsx +1 -1
  393. package/src/components/Chart/chart.stories.tsx +2 -8
  394. package/src/components/Chart/chart.tsx +3 -0
  395. package/src/components/Checkbox/checkbox.anatomy.stories.tsx +28 -49
  396. package/src/components/Checkbox/checkbox.principles.stories.tsx +1 -1
  397. package/src/components/Checkbox/checkbox.spec.md +13 -26
  398. package/src/components/Checkbox/checkbox.stories.tsx +11 -8
  399. package/src/components/Checkbox/checkbox.tsx +18 -13
  400. package/src/components/Chip/chip.anatomy.stories.tsx +44 -24
  401. package/src/components/Chip/chip.principles.stories.tsx +1 -1
  402. package/src/components/Chip/chip.spec.md +5 -4
  403. package/src/components/Chip/chip.tsx +5 -1
  404. package/src/components/CircularProgress/circular-progress.principles.stories.tsx +7 -4
  405. package/src/components/CircularProgress/circular-progress.spec.md +3 -3
  406. package/src/components/CircularProgress/circular-progress.stories.tsx +2 -2
  407. package/src/components/Coachmark/coachmark.anatomy.stories.tsx +2 -2
  408. package/src/components/Coachmark/coachmark.principles.stories.tsx +2 -1
  409. package/src/components/Coachmark/coachmark.spec.md +5 -5
  410. package/src/components/Coachmark/coachmark.stories.tsx +3 -1
  411. package/src/components/Coachmark/coachmark.tsx +10 -3
  412. package/src/components/Combobox/combobox.anatomy.stories.tsx +2 -2
  413. package/src/components/Combobox/combobox.tsx +53 -19
  414. package/src/components/Command/command.anatomy.stories.tsx +2 -2
  415. package/src/components/Command/command.principles.stories.tsx +1 -1
  416. package/src/components/Command/command.stories.tsx +42 -10
  417. package/src/components/DataTable/cell-registry.tsx +86 -63
  418. package/src/components/DataTable/column-types.ts +10 -1
  419. package/src/components/DataTable/data-table-column-visibility-panel.tsx +1 -1
  420. package/src/components/DataTable/data-table-filter-group.tsx +231 -0
  421. package/src/components/DataTable/data-table-filter-panel.tsx +16 -430
  422. package/src/components/DataTable/data-table-filter-value-picker.tsx +237 -0
  423. package/src/components/DataTable/data-table-interaction-layer.tsx +15 -19
  424. package/src/components/DataTable/data-table.anatomy.stories.tsx +15 -13
  425. package/src/components/DataTable/data-table.principles.stories.tsx +9 -9
  426. package/src/components/DataTable/data-table.spec.md +33 -13
  427. package/src/components/DataTable/data-table.stories.tsx +16 -17
  428. package/src/components/DataTable/data-table.tsx +107 -61
  429. package/src/components/DataTable/filter-operators.spec.md +3 -3
  430. package/src/components/DataTable/index.ts +3 -0
  431. package/src/components/DateGrid/date-grid.anatomy.stories.tsx +4 -4
  432. package/src/components/DateGrid/date-grid.principles.stories.tsx +1 -1
  433. package/src/components/DateGrid/date-grid.spec.md +1 -1
  434. package/src/components/DateGrid/date-grid.tsx +3 -1
  435. package/src/components/DatePicker/date-picker.anatomy.stories.tsx +8 -8
  436. package/src/components/DatePicker/date-picker.principles.stories.tsx +3 -3
  437. package/src/components/DatePicker/date-picker.spec.md +3 -3
  438. package/src/components/DatePicker/date-picker.stories.tsx +4 -5
  439. package/src/components/DatePicker/date-picker.tsx +99 -45
  440. package/src/components/DescriptionList/description-list.anatomy.stories.tsx +12 -10
  441. package/src/components/DescriptionList/description-list.principles.stories.tsx +2 -2
  442. package/src/components/DescriptionList/description-list.spec.md +3 -3
  443. package/src/components/DescriptionList/description-list.stories.tsx +7 -6
  444. package/src/components/Dialog/dialog.anatomy.stories.tsx +1 -0
  445. package/src/components/Dialog/dialog.spec.md +9 -0
  446. package/src/components/Dialog/dialog.stories.tsx +66 -5
  447. package/src/components/Dialog/dialog.tsx +60 -25
  448. package/src/components/DropdownMenu/dropdown-menu.anatomy.stories.tsx +1 -1
  449. package/src/components/DropdownMenu/dropdown-menu.principles.stories.tsx +8 -6
  450. package/src/components/DropdownMenu/dropdown-menu.spec.md +5 -5
  451. package/src/components/DropdownMenu/dropdown-menu.tsx +18 -9
  452. package/src/components/Empty/empty.anatomy.stories.tsx +1 -1
  453. package/src/components/Empty/empty.spec.md +2 -2
  454. package/src/components/Field/field-context.ts +69 -5
  455. package/src/components/Field/field-controls.spec.md +62 -8
  456. package/src/components/Field/field-edit-keys.ts +66 -0
  457. package/src/components/Field/field-types.ts +58 -9
  458. package/src/components/Field/field-wrapper.tsx +50 -42
  459. package/src/components/Field/field.anatomy.stories.tsx +9 -6
  460. package/src/components/Field/field.spec.md +1 -1
  461. package/src/components/Field/field.stories.tsx +1 -1
  462. package/src/components/Field/field.tsx +2 -1
  463. package/src/components/Field/form-validation.spec.md +3 -3
  464. package/src/components/Field/index.ts +1 -0
  465. package/src/components/FieldControlGroup/field-control-group.principles.stories.tsx +6 -6
  466. package/src/components/FieldControlGroup/field-control-group.spec.md +9 -4
  467. package/src/components/FieldControlGroup/field-control-group.tsx +1 -1
  468. package/src/components/FileItem/file-item.anatomy.stories.tsx +1 -1
  469. package/src/components/FileItem/file-item.spec.md +5 -8
  470. package/src/components/FileItem/file-item.stories.tsx +36 -25
  471. package/src/components/FileItem/file-item.tsx +8 -6
  472. package/src/components/FileUpload/file-upload.anatomy.stories.tsx +6 -6
  473. package/src/components/FileUpload/file-upload.principles.stories.tsx +5 -5
  474. package/src/components/FileUpload/file-upload.spec.md +1 -1
  475. package/src/components/FileUpload/file-upload.tsx +1 -1
  476. package/src/components/FileViewer/file-viewer.anatomy.stories.tsx +4 -3
  477. package/src/components/FileViewer/file-viewer.principles.stories.tsx +3 -3
  478. package/src/components/FileViewer/file-viewer.spec.md +30 -12
  479. package/src/components/FileViewer/file-viewer.stories.tsx +1 -2
  480. package/src/components/FileViewer/file-viewer.tsx +12 -4
  481. package/src/components/FileViewer/image-renderer.tsx +35 -7
  482. package/src/components/HoverCard/hover-card.anatomy.stories.tsx +6 -2
  483. package/src/components/HoverCard/hover-card.principles.stories.tsx +6 -3
  484. package/src/components/HoverCard/hover-card.spec.md +5 -5
  485. package/src/components/HoverCard/hover-card.stories.tsx +16 -16
  486. package/src/components/HoverCard/hover-card.tsx +5 -3
  487. package/src/components/InlineEdit/index.ts +5 -0
  488. package/src/components/InlineEdit/inline-edit.spec.md +149 -0
  489. package/src/components/InlineEdit/inline-edit.stories.tsx +246 -0
  490. package/src/components/InlineEdit/inline-edit.tsx +287 -0
  491. package/src/components/Input/input.anatomy.stories.tsx +8 -7
  492. package/src/components/Input/input.principles.stories.tsx +2 -12
  493. package/src/components/Input/input.spec.md +13 -18
  494. package/src/components/Input/input.tsx +69 -22
  495. package/src/components/LinkInput/link-input.anatomy.stories.tsx +1 -1
  496. package/src/components/LinkInput/link-input.principles.stories.tsx +2 -2
  497. package/src/components/LinkInput/link-input.tsx +11 -10
  498. package/src/components/Menu/menu-item.anatomy.stories.tsx +3 -3
  499. package/src/components/Menu/menu-item.principles.stories.tsx +1 -1
  500. package/src/components/Menu/menu-item.spec.md +22 -15
  501. package/src/components/Menu/menu-item.stories.tsx +39 -11
  502. package/src/components/Menu/menu-item.tsx +38 -4
  503. package/src/components/Notice/notice.principles.stories.tsx +1 -1
  504. package/src/components/Notice/notice.spec.md +16 -3
  505. package/src/components/NumberInput/number-input.anatomy.stories.tsx +3 -3
  506. package/src/components/NumberInput/number-input.principles.stories.tsx +1 -1
  507. package/src/components/NumberInput/number-input.spec.md +4 -4
  508. package/src/components/NumberInput/number-input.tsx +19 -12
  509. package/src/components/OverflowIndicator/overflow-indicator.anatomy.stories.tsx +10 -8
  510. package/src/components/OverflowIndicator/overflow-indicator.principles.stories.tsx +3 -3
  511. package/src/components/OverflowIndicator/overflow-indicator.spec.md +4 -2
  512. package/src/components/OverflowIndicator/overflow-indicator.stories.tsx +71 -63
  513. package/src/components/OverflowIndicator/overflow-indicator.tsx +9 -8
  514. package/src/components/Pagination/pagination.spec.md +1 -1
  515. package/src/components/Pagination/pagination.stories.tsx +2 -6
  516. package/src/components/Pagination/pagination.tsx +1 -1
  517. package/src/components/PeoplePicker/people-picker.anatomy.stories.tsx +4 -4
  518. package/src/components/PeoplePicker/people-picker.principles.stories.tsx +2 -2
  519. package/src/components/PeoplePicker/people-picker.spec.md +6 -6
  520. package/src/components/PeoplePicker/people-picker.tsx +56 -16
  521. package/src/components/PeoplePicker/person-display.tsx +32 -16
  522. package/src/components/Popover/popover.anatomy.stories.tsx +2 -2
  523. package/src/components/Popover/popover.tsx +3 -1
  524. package/src/components/ProfileCard/profile-card.anatomy.stories.tsx +12 -23
  525. package/src/components/ProfileCard/profile-card.spec.md +3 -3
  526. package/src/components/ProfileCard/profile-card.tsx +6 -6
  527. package/src/components/ProgressBar/progress-bar.anatomy.stories.tsx +3 -1
  528. package/src/components/ProgressBar/progress-bar.principles.stories.tsx +1 -1
  529. package/src/components/ProgressBar/progress-bar.stories.tsx +50 -42
  530. package/src/components/RadioGroup/radio-group.anatomy.stories.tsx +10 -28
  531. package/src/components/RadioGroup/radio-group.stories.tsx +29 -32
  532. package/src/components/RadioGroup/radio-group.tsx +41 -15
  533. package/src/components/Rating/rating.spec.md +11 -3
  534. package/src/components/ScrollArea/scroll-area.anatomy.stories.tsx +1 -1
  535. package/src/components/ScrollArea/scroll-area.principles.stories.tsx +1 -1
  536. package/src/components/ScrollArea/scroll-area.spec.md +7 -3
  537. package/src/components/ScrollArea/scroll-area.stories.tsx +1 -1
  538. package/src/components/ScrollArea/scroll-area.tsx +17 -4
  539. package/src/components/Select/select.anatomy.stories.tsx +3 -3
  540. package/src/components/Select/select.spec.md +29 -17
  541. package/src/components/Select/select.stories.tsx +33 -0
  542. package/src/components/Select/select.tsx +190 -36
  543. package/src/components/SelectMenu/select-menu.anatomy.stories.tsx +4 -4
  544. package/src/components/SelectMenu/select-menu.spec.md +15 -7
  545. package/src/components/SelectMenu/select-menu.tsx +16 -3
  546. package/src/components/SelectionControl/boolean-value.tsx +39 -0
  547. package/src/components/SelectionControl/index.ts +1 -0
  548. package/src/components/SelectionControl/selection-item.anatomy.stories.tsx +2 -2
  549. package/src/components/SelectionControl/selection-item.principles.stories.tsx +2 -2
  550. package/src/components/SelectionControl/selection-item.spec.md +3 -3
  551. package/src/components/SelectionControl/selection-item.stories.tsx +3 -3
  552. package/src/components/Separator/separator.spec.md +2 -2
  553. package/src/components/Separator/separator.stories.tsx +6 -27
  554. package/src/components/Sheet/sheet.anatomy.stories.tsx +1 -1
  555. package/src/components/Sheet/sheet.principles.stories.tsx +1 -1
  556. package/src/components/Sheet/sheet.spec.md +2 -2
  557. package/src/components/Sheet/sheet.tsx +9 -5
  558. package/src/components/Sidebar/sidebar.anatomy.stories.tsx +16 -12
  559. package/src/components/Sidebar/sidebar.principles.stories.tsx +10 -8
  560. package/src/components/Sidebar/sidebar.spec.md +13 -15
  561. package/src/components/Sidebar/sidebar.stories.tsx +8 -7
  562. package/src/components/Sidebar/sidebar.tsx +37 -25
  563. package/src/components/Skeleton/skeleton.stories.tsx +4 -11
  564. package/src/components/Slider/slider.anatomy.stories.tsx +3 -3
  565. package/src/components/Slider/slider.principles.stories.tsx +2 -2
  566. package/src/components/Slider/slider.spec.md +5 -5
  567. package/src/components/Slider/slider.tsx +3 -1
  568. package/src/components/Steps/steps.anatomy.stories.tsx +4 -4
  569. package/src/components/Steps/steps.principles.stories.tsx +1 -1
  570. package/src/components/Steps/steps.spec.md +1 -1
  571. package/src/components/Switch/switch.anatomy.stories.tsx +7 -7
  572. package/src/components/Switch/switch.principles.stories.tsx +4 -4
  573. package/src/components/Switch/switch.spec.md +8 -8
  574. package/src/components/Switch/switch.stories.tsx +9 -24
  575. package/src/components/Switch/switch.tsx +17 -13
  576. package/src/components/Tabs/tabs.anatomy.stories.tsx +10 -7
  577. package/src/components/Tabs/tabs.spec.md +1 -1
  578. package/src/components/Tabs/tabs.tsx +21 -1
  579. package/src/components/Textarea/textarea.anatomy.stories.tsx +1 -1
  580. package/src/components/Textarea/textarea.principles.stories.tsx +1 -1
  581. package/src/components/Textarea/textarea.spec.md +4 -4
  582. package/src/components/Textarea/textarea.tsx +72 -46
  583. package/src/components/TimePicker/time-columns.tsx +6 -2
  584. package/src/components/TimePicker/time-picker.principles.stories.tsx +1 -1
  585. package/src/components/TimePicker/time-picker.spec.md +3 -3
  586. package/src/components/TimePicker/time-picker.tsx +16 -10
  587. package/src/components/Toast/toast.stories.tsx +7 -4
  588. package/src/components/Tooltip/tooltip.anatomy.stories.tsx +4 -4
  589. package/src/components/Tooltip/tooltip.principles.stories.tsx +3 -3
  590. package/src/components/Tooltip/tooltip.spec.md +1 -1
  591. package/src/components/Tooltip/tooltip.stories.tsx +4 -39
  592. package/src/components/Tooltip/tooltip.tsx +8 -6
  593. package/src/components/TreeView/tree-view.anatomy.stories.tsx +6 -3
  594. package/src/components/TreeView/tree-view.spec.md +42 -11
  595. package/src/components/TreeView/tree-view.stories.tsx +1 -0
  596. package/src/components/TreeView/tree-view.tsx +322 -17
  597. package/src/index.ts +588 -60
  598. package/src/patterns/action-bar/action-bar.spec.md +9 -0
  599. package/src/patterns/action-bar/action-bar.stories.tsx +6 -3
  600. package/src/patterns/element-anatomy/inline-action.spec.md +2 -0
  601. package/src/patterns/element-anatomy/item-anatomy.spec.md +14 -5
  602. package/src/patterns/element-anatomy/item-anatomy.stories.tsx +6 -4
  603. package/src/patterns/element-anatomy/item-anatomy.tsx +7 -6
  604. package/src/patterns/header-canonical/header-canonical.spec.md +5 -4
  605. package/src/patterns/overlay-surface/overlay-surface.spec.md +22 -1
  606. package/src/styles/tokens.css +3 -0
  607. package/src/tokens/README.md +1 -1
  608. package/src/tokens/color/color.spec.md +4 -4
  609. package/src/tokens/color/color.stories.tsx +3 -3
  610. package/src/tokens/density/density.stories.tsx +16 -3
  611. package/src/tokens/layoutSpace/layoutSpace.spec.md +3 -1
  612. package/src/tokens/motion/motion.css +33 -21
  613. package/src/tokens/motion/motion.spec.md +32 -15
  614. package/src/tokens/motion/motion.stories.tsx +58 -5
  615. package/src/tokens/motion/motion.ts +7 -6
  616. package/src/tokens/motion/overlay-motion.ts +26 -0
  617. package/src/tokens/orphan-tokens.spec.md +4 -4
  618. package/src/tokens/token-system.spec.md +1 -0
  619. package/src/tokens/uiSize/uiSize.css +1 -1
  620. package/src/tokens/uiSize/uiSize.spec.md +1 -1
  621. package/src/tokens/uiSize/uiSize.stories.tsx +4 -2
  622. package/src/tokens/utility-registry.json +160 -23
@@ -18,8 +18,11 @@ export default meta
18
18
 
19
19
  type Story = StoryObj<typeof Calendar>
20
20
 
21
- // 釘固定日期(2026-07-07 修 VR flake):真實 new Date() today 標記隨換日移格 → ubuntu
22
- // baseline 每隔幾天假 breach(0.07–0.5%)。釘死 = deterministic 渲染;月中讓事件分布自然。
21
+ // 釘固定日期(2026-07-07 修 VR flake;2026-07-13 補傳 defaultReferenceDate 使 pin 真正生效):
22
+ // 只把 now 用來組事件日期字串「不會」pin 顯示月 —— Calendar 顯示月預設取即時 new Date()(tsx),
23
+ // 故必須把 now 傳給 defaultReferenceDate 才真正釘住顯示月(下方各 instance 已補),否則當前月非
24
+ // 7 月時 7 月事件根本不顯示。註:today 標記仍取真實日期(tsx 內 new Date(),無 today override prop)
25
+ // → 落在被釘的 7 月內時仍隨換日移格,屬已知殘留(需新增 today prop 才能完全釘死,SSOT 待拍板)。
23
26
  const now = new Date(2026, 6, 15)
24
27
  const thisMonth = now.getFullYear() + '-' + String(now.getMonth() + 1).padStart(2, '0')
25
28
 
@@ -36,7 +39,7 @@ export const Overview: Story = {
36
39
  name: '元件總覽',
37
40
  render: () => (
38
41
  <div className="h-screen p-4 bg-canvas">
39
- <Calendar events={sampleEvents} />
42
+ <Calendar events={sampleEvents} defaultReferenceDate={now} />
40
43
  </div>
41
44
  ),
42
45
  }
@@ -63,13 +66,13 @@ export const Inspector: Story = {
63
66
  },
64
67
  render: (args) => (
65
68
  <div className="h-screen p-4 bg-canvas">
66
- <Calendar {...args} />
69
+ <Calendar defaultReferenceDate={now} {...args} />
67
70
  </div>
68
71
  ),
69
72
  }
70
73
 
71
74
  // ── 3. 色彩對照表(事件 color 類別 + Cell / Event tile token)─────────────────────
72
- // 跳過 4. SizeMatrix(rationale 見 calendar.spec.md「MVP vs 後續增量」,MVP md;lg 為 tech debt)
75
+ // 跳過 4. SizeMatrix(rationale 見 calendar.spec.md「MVP vs 後續增量」,roadmap:lg 尚未實作、視覺同 md)
73
76
  export const ColorMatrix: Story = {
74
77
  name: '色彩對照表',
75
78
  render: () => {
@@ -85,13 +88,12 @@ export const ColorMatrix: Story = {
85
88
  <div>
86
89
  <H3>事件類別色</H3>
87
90
  <Desc>
88
- event color = 12 categorical 色相,**消費 categorical-color SSOT**,與 Tag / Avatar 共用同一組
91
+ 事件顏色用 12 種類別色,和 Tag / Avatar 共用同一套色盤
89
92
  (blue / green / deep-orange / yellow / red / orange / amber / lime / turquoise / indigo / purple / magenta)。
90
- color 是**類別語意**( team / 同 project),非 severity。色名 1:1 對該色相的 `--color-*` primitive(零 offset);
91
- 2026-06-04 修正前 red 與 orange 都誤接 deep-orange,現各自獨立可區分。
93
+ 顏色代表「這是哪一類事件」(同一個團隊 / 同一個專案),不是嚴重程度。每個色名對應一個色相,紅與橘各自獨立、可清楚區分。
92
94
  </Desc>
93
95
  <div className="h-[560px]">
94
- <Calendar events={colorEvents} />
96
+ <Calendar events={colorEvents} defaultReferenceDate={now} />
95
97
  </div>
96
98
  </div>
97
99
 
@@ -202,7 +204,7 @@ export const StateBehavior: Story = {
202
204
  <div>• <b>event hover</b>:tile 切同色深一階 `hover:bg-{`{color}`}-2`(如 blue → `--color-blue-2`)+ `cursor-pointer`</div>
203
205
  <div>• <b>empty cell</b>:無事件保持純底色,點擊觸發 onDateClick</div>
204
206
  </div>
205
- <Calendar events={sampleEvents} />
207
+ <Calendar events={sampleEvents} defaultReferenceDate={now} />
206
208
  </div>
207
209
  ),
208
210
  }
@@ -1,6 +1,6 @@
1
1
  // @principles-rationale: Merged WhenToUse + WhenNotToUse + VsDatePicker into a single
2
2
  // `UsageGuidance` story (3 sections) per 2026-04-26 user mandate to consolidate
3
- // decision-related stories. ColorSemantic + MvpScope kept as separate principles.
3
+ // decision-related stories. ColorSemantic + MonthViewOnlyRule kept as separate principles.
4
4
  import type { Meta, StoryObj } from '@storybook/react'
5
5
  import LinkTo from '@storybook/addon-links/react'
6
6
  import { Calendar, type CalendarEvent } from './calendar'
@@ -14,8 +14,11 @@ const meta: Meta = {
14
14
  export default meta
15
15
  type Story = StoryObj
16
16
 
17
- // 釘固定日期(2026-07-07 修 VR flake):真實 new Date() today 標記隨換日移格 → ubuntu
18
- // baseline 每隔幾天假 breach(0.07–0.5%)。釘死 = deterministic 渲染;月中讓事件分布自然。
17
+ // 釘固定日期(2026-07-07 修 VR flake;2026-07-13 補傳 defaultReferenceDate 使 pin 真正生效):
18
+ // 只把 now 用來組事件日期字串「不會」pin 顯示月 —— Calendar 顯示月預設取即時 new Date()(tsx),
19
+ // 故必須把 now 傳給 defaultReferenceDate 才真正釘住顯示月(下方各 instance 已補),否則當前月非
20
+ // 7 月時 7 月事件根本不顯示。註:today 標記仍取真實日期(tsx 內 new Date(),無 today override prop)
21
+ // → 落在被釘的 7 月內時仍隨換日移格,屬已知殘留(需新增 today prop 才能完全釘死,SSOT 待拍板)。
19
22
  const now = new Date(2026, 6, 15)
20
23
  const thisMonth = now.getFullYear() + '-' + String(now.getMonth() + 1).padStart(2, '0')
21
24
 
@@ -85,6 +88,7 @@ export const UsageGuidance: Story = {
85
88
  <div className="text-body font-medium mb-2">Calendar(event canvas)</div>
86
89
  <div className="h-80 border border-divider rounded-md overflow-hidden">
87
90
  <Calendar
91
+ defaultReferenceDate={now}
88
92
  events={[
89
93
  { id: 'a', title: 'Design review', start: `${thisMonth}-05`, end: `${thisMonth}-05`, color: 'blue' },
90
94
  ] as CalendarEvent[]}
@@ -109,6 +113,7 @@ export const ColorSemantic: Story = {
109
113
  >
110
114
  <div className="h-80 border border-divider rounded-md overflow-hidden">
111
115
  <Calendar
116
+ defaultReferenceDate={now}
112
117
  events={[
113
118
  { id: '1', title: 'Design review', start: `${thisMonth}-05`, end: `${thisMonth}-05`, color: 'blue' },
114
119
  { id: '2', title: 'Sprint planning', start: `${thisMonth}-08`, end: `${thisMonth}-08`, color: 'blue' },
@@ -123,9 +128,11 @@ export const ColorSemantic: Story = {
123
128
  ),
124
129
  }
125
130
 
126
- // ── 原則 — MVP scope:月 view only ─────────────────────────────────────────
127
- export const MvpScope: Story = {
128
- name: 'MVP 範圍',
131
+ // ── 原則 — 支援範圍:月 view only(2026-07-14 rename MvpScope → MonthViewOnlyRule
132
+ // per audit Dim 14 + category-templates.md「Canonical naming」:「MVP」為開發 roadmap
133
+ // 內部用語,reader-facing name 必人話;component-specific {Topic}Rule idiom 保留)──────
134
+ export const MonthViewOnlyRule: Story = {
135
+ name: '僅支援月檢視',
129
136
  render: () => (
130
137
  <div className="space-y-6">
131
138
  <Rule
@@ -134,6 +141,7 @@ export const MvpScope: Story = {
134
141
  >
135
142
  <div className="h-80 border border-divider rounded-md overflow-hidden">
136
143
  <Calendar
144
+ defaultReferenceDate={now}
137
145
  events={[
138
146
  { id: '1', title: 'Sprint planning', start: `${thisMonth}-08`, end: `${thisMonth}-08`, color: 'blue' },
139
147
  ] as CalendarEvent[]}
@@ -80,7 +80,7 @@ Calendar 是**事件檢視 canvas**,讓 user 以**月 / 週 / 日** 三種 view
80
80
 
81
81
  ```tsx
82
82
  <Calendar
83
- view="month" | "week" | "day" // MVP 只支援 "month"
83
+ view="month" | "week" | "day" // roadmap:week / day 尚未實作,目前只渲染月檢視(誠實 API,傳入不報錯,見「狀態 > 邊界案例」)
84
84
  defaultView="month"
85
85
  referenceDate={Date} // 當前聚焦日期(月檢視的那個月)
86
86
  onViewChange={(view) => ...}
@@ -91,7 +91,7 @@ Calendar 是**事件檢視 canvas**,讓 user 以**月 / 週 / 日** 三種 view
91
91
  onCreateEvent={() => ...} // 點「新事件」CTA 回調
92
92
  weekStartsOn={0 | 1} // 0=Sun, 1=Mon
93
93
  renderEventTile={(event) => ReactNode} // 自訂 event tile 視覺
94
- size="md" | "lg" // cell 大小(MVP md;lg tech debt)
94
+ size="md" | "lg" // cell 大小(roadmap:lg 尚未實作,視覺同 md——僅設 data-size,無 CSS 消費)
95
95
  locale="en-US" // Intl 語系(月份標題 / 星期名;預設 'en-US')
96
96
  prevAriaLabel="上個月" // i18n override:prev 導覽鈕 aria-label
97
97
  nextAriaLabel="下個月" // i18n override:next 導覽鈕 aria-label
@@ -208,7 +208,7 @@ MVP 無內建 error 狀態(無 `error` / `onRetry` prop)——載入失敗由 co
208
208
  - ❌ 不硬寫 month grid 為 `<table>`——用 CSS grid(月 view 為 per-cell 模型不跨欄 span,見「Event tile 規則」;後續週 / 日 view 的 timeline / 拖拉增量需 grid 自由佈局,table 結構難擴充)
209
209
  - ❌ 不把 event 資料存在元件內部 state——event 是 consumer 責任,本元件是純 view
210
210
  - ❌ 不自動打開「新事件」表單——`onDateClick` / `onCreateEvent` 回調給 consumer 決定(避免強制開 Dialog UX)
211
- - ❌ 不重造 date math——用 `date-fns`
211
+ - ❌ 不重造 date math——月 / 週 grid 邊界運算(`startOfMonth` / `eachDayOfInterval` / `isSameMonth` 等)一律用 `date-fns`。**唯一例外(D3 perf,tsx `eventsByDate` memo 有註解)**:每 render 對 42 cells 分桶事件的 hot path 用原生 timestamp 迭代(`new Date(y, m, d).getTime()` + `setDate(+1)`)—— 避免 per-cell `isWithinInterval` 的 O(42×N) 重複掃描;此 raw-Date 迭代**限縮在** bucketing memo 內,不外溢為通則
212
212
 
213
213
  ---
214
214
 
@@ -222,9 +222,10 @@ MVP 無內建 error 狀態(無 `error` / `onRetry` prop)——載入失敗由 co
222
222
  - Outside days visual
223
223
  - Empty 為常態空白(無內建 empty/loading/error UI)
224
224
 
225
- ### 後續(tech debt)
225
+ ### 後續 roadmap(尚未實作;2026-07-14 user 拍板 props 保留——`view="week"/"day"` + `size="lg"` 傳入不報錯,目前只渲染月檢視,誠實 API 明標於 tsx JSDoc)
226
226
  - 週 view(timeline 24 小時縱軸)
227
227
  - 日 view(single-day timeline)
228
+ - `size="lg"` cell 密度(prop 已保留,目前視覺同 md)
228
229
  - 拖拉新增 event(from 月 cell → range select)
229
230
  - 拖拉移動 event(cross-day drag)
230
231
  - 「+N more」展開 popover
@@ -21,8 +21,10 @@ type Story = StoryObj<typeof Calendar>
21
21
 
22
22
  // ── 真實業務情境 ─────────────────────────────────────────────────────
23
23
 
24
- // 釘固定日期(2026-07-07 修 VR flake):真實 new Date() today 標記隨換日移格 → ubuntu
25
- // baseline 每隔幾天假 breach(0.07–0.5%)。釘死 = deterministic 渲染;月中讓事件分布自然。
24
+ // 釘固定日期(2026-07-07 修 VR flake;2026-07-13 補傳 defaultReferenceDate 使 pin 真正生效):
25
+ // 只把 now 用來組事件日期字串「不會」pin 顯示月 —— Calendar 顯示月預設取即時 new Date()(tsx),
26
+ // 故必須把 now 傳給 defaultReferenceDate 才真正釘住顯示月(下方各 instance 已補)。
27
+ // 註:today 標記仍取真實日期(tsx 內 new Date(),無 today override prop)→ 落在被釘 7 月內時仍隨換日移格,屬已知殘留。
26
28
  const now = new Date(2026, 6, 15)
27
29
  const thisMonth = now.getFullYear() + '-' + String(now.getMonth() + 1).padStart(2, '0')
28
30
 
@@ -46,6 +48,7 @@ export const TeamCalendar: Story = {
46
48
  return (
47
49
  <div className="h-screen p-4 bg-canvas">
48
50
  <Calendar
51
+ defaultReferenceDate={now}
49
52
  events={events}
50
53
  onEventClick={(e) => alert(`點了事件:${e.title}`)}
51
54
  onDateClick={(d) => console.log('點 date cell:', d)}
@@ -71,7 +74,7 @@ export const ContentPublishingSchedule: Story = {
71
74
  ]
72
75
  return (
73
76
  <div className="h-screen p-4 bg-canvas">
74
- <Calendar events={events} onCreateEvent={() => alert('排內容')} />
77
+ <Calendar events={events} defaultReferenceDate={now} onCreateEvent={() => alert('排內容')} />
75
78
  </div>
76
79
  )
77
80
  },
@@ -84,7 +87,7 @@ export const EmptyCalendar: Story = {
84
87
  name: '空行事曆',
85
88
  render: () => (
86
89
  <div className="h-screen p-4 bg-canvas">
87
- <Calendar events={[]} onCreateEvent={() => alert('加第一個事件')} />
90
+ <Calendar events={[]} defaultReferenceDate={now} onCreateEvent={() => alert('加第一個事件')} />
88
91
  </div>
89
92
  ),
90
93
  }
@@ -27,10 +27,11 @@ import { SegmentedControl, SegmentedControlItem } from '@/design-system/componen
27
27
  * ── Layout Family ──
28
28
  * 非 4-Family,屬 page-composite(多區塊 Toolbar + Grid + EventTile)。
29
29
  *
30
- * ── MVP scope(本次 session)──
30
+ * ── MVP scope ──
31
31
  * - 月 view 完整(toolbar / grid / event tile / today highlight / outside days)
32
- * - 週 / 日 view tech debt
33
- * - 拖拉增刪 event tech debt
32
+ * - 週 / 日 view + size lg = **roadmap:尚未實作,目前只渲染月檢視**(誠實 API,
33
+ * props 保留給未來增量,2026-07-14 user 拍板;行為明細見 spec「狀態 > 邊界案例」)
34
+ * - 拖拉增刪 event 是 roadmap(見 spec「MVP vs 後續增量」)
34
35
  *
35
36
  * ── 與 DatePicker 的區分 ──
36
37
  * DatePicker 是「選日期」form control;Calendar 是「看事件」page canvas。
@@ -58,7 +59,11 @@ export interface CalendarEvent {
58
59
  export type CalendarView = 'month' | 'week' | 'day'
59
60
 
60
61
  export interface CalendarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {
61
- /** 當前 view(MVP 只 'month',其餘 view tech debt) */
62
+ /**
63
+ * 當前 view。**roadmap:`'week'` / `'day'` 尚未實作,目前只渲染月檢視**——
64
+ * 傳入不報錯:grid 仍為月檢視,僅 `data-view` 同步 + SegmentedControl 週/日項 disabled
65
+ * (誠實 API;見 calendar.spec.md「狀態 > 邊界案例」+「MVP vs 後續增量」)。
66
+ */
62
67
  view?: CalendarView
63
68
  defaultView?: CalendarView
64
69
  onViewChange?: (view: CalendarView) => void
@@ -84,7 +89,10 @@ export interface CalendarProps extends Omit<React.HTMLAttributes<HTMLDivElement>
84
89
  /** 自訂 event tile 渲染 */
85
90
  renderEventTile?: (event: CalendarEvent) => React.ReactNode
86
91
 
87
- /** size(MVP 只 md;lg 為 tech debt) */
92
+ /**
93
+ * size。**roadmap:`'lg'` 尚未實作,視覺與 `'md'` 相同**——傳入不報錯,
94
+ * 僅設 `data-size` attribute,無任何 CSS 消費(誠實 API;prop 保留給未來 cell 密度增量)。
95
+ */
88
96
  size?: 'md' | 'lg'
89
97
  className?: string
90
98
 
@@ -113,7 +121,18 @@ const EVENT_ALLDAY_ACCENT = CAT_ACCENT
113
121
  // ── Helpers ────────────────────────────────────────────────────────────────
114
122
 
115
123
  function coerceDate(value: string | Date): Date {
116
- return value instanceof Date ? value : new Date(value)
124
+ if (value instanceof Date) return value
125
+ // date-only ISO("YYYY-MM-DD")用本地午夜建構,不走 new Date(str)。
126
+ // 原因:`new Date('2026-06-15')` 按 UTC 午夜解析,而 eventsByDate 分桶以本地
127
+ // getFullYear/Month/Date 讀取 → 負 UTC 時區(西半球)的 all-day 事件被移到前一天
128
+ // (真實 timezone bug)。手動 split 建本地 Date,與分桶的本地讀取一致。
129
+ // 含時間的字串(YYYY-MM-DDTHH:mm,無 offset)ES 規範本就以本地解析,走原生 new Date()。
130
+ const dateOnly = /^\d{4}-\d{2}-\d{2}$/.exec(value)
131
+ if (dateOnly) {
132
+ const [y, m, d] = value.split('-').map(Number)
133
+ return new Date(y, m - 1, d)
134
+ }
135
+ return new Date(value)
117
136
  }
118
137
 
119
138
  // eventsOnDate(per-cell 全 events 掃描)已由 eventsByDate bucketing memo 取代並移除
@@ -160,7 +179,7 @@ const Calendar = React.forwardRef<HTMLDivElement, CalendarProps>(function Calend
160
179
  [referenceDateProp, onReferenceDateChange],
161
180
  )
162
181
 
163
- // View state(MVP 只用 month,其他 tech debt)
182
+ // View state(roadmap:week/day 尚未實作,受控值照收但 grid 恆為月檢視)
164
183
  const [internalView, setInternalView] = React.useState<CalendarView>(defaultView)
165
184
  const currentView = viewProp ?? internalView
166
185
  const setView = React.useCallback(
@@ -18,9 +18,10 @@ export default meta
18
18
  type Story = StoryObj
19
19
 
20
20
  // ── Sample slides ────────────────────────────────────────────────────────────
21
- // 2026-05-16 audit Round 6:三層(展示 / 設計規格 / 設計原則)一致用真實 picsum seeded photo
21
+ // 2026-05-16 audit Round 6:展示 + 設計規格 兩層用真實 picsum seeded photo
22
22
  // 取代 gradient 色塊 — gradient 抽象 block 教不到真實裁切 / 內容裁切 / 視覺層次,
23
- // 且要與主展示頁(carousel.stories.tsx)同源,讓設計師看到的 slide 內容跨三層一致。
23
+ // 且與主展示頁(carousel.stories.tsx)同源。設計原則(principles)層刻意用輕量 gradient
24
+ // placeholder(聚焦「何時用 / 何時不用」決策規則,不搶真實照片視覺),故 media 來源與此二層不同。
24
25
  // Picsum.photos 提供 stable seeded photos(免登入 / 免 API key / 跨環境一致)。
25
26
  // 註:ColorMatrix「視覺樣本」cell 刻意保留純色 swatch(bg-foreground)——那是 token 色票
26
27
  // 非 slide 內容,用純色才能精準標 dot 的 bg-on-emphasis/60 · /80 · 全(--on-emphasis = white)token。
@@ -185,7 +186,7 @@ const InspectorInner = () => {
185
186
  </div>
186
187
  </div>
187
188
  <p className="text-[10px] text-fg-muted font-mono">
188
- Arrow:size="md"(h-field-md,default 32px / loose 36px,iconOnly 方形)· left/right-3 · top-1/2 · opacity 0 → hover/focus-within 100%<br />
189
+ Arrow:size="md"(h-field-md,default/md 32px / lg 36px,iconOnly 方形)· left/right-3 · top-1/2 · opacity 0 → hover/focus-within 100%<br />
189
190
  Dots:bottom-3 · gap-1.5 · inactive 6px × 6px / active 24px × 6px
190
191
  </p>
191
192
  </div>
@@ -374,7 +375,7 @@ export const SizeMatrix: Story = {
374
375
  <tbody>
375
376
  <tr>
376
377
  <Td mono>Arrow button</Td>
377
- <Td mono>size="md"(h-field-md,default 32px / loose 36px)</Td>
378
+ <Td mono>size="md"(h-field-md,default/md 32px / lg 36px)</Td>
378
379
  <Td>iconOnly 方形,繼承 Button md 尺寸;rounded-full 圓形於照片 overlay 上的世界級慣例(Airbnb / Instagram / Netflix)</Td>
379
380
  </tr>
380
381
  <tr>
@@ -128,9 +128,9 @@ Tabs 和 Carousel 都能「按順序切換下方內容」,但**語意與視覺
128
128
 
129
129
  ### 視覺規格
130
130
 
131
- - **基於 DS Button**:`<Button variant="tertiary" size="md" iconOnly />`——完全對齊 DS 規則,不自訂視覺
131
+ - **基於 DS Button**:`<Button variant="tertiary" size="md" iconOnly />`——對齊 DS 規則,唯 shape 覆寫 `rounded-full`(media carousel documented 例外,見下一條「形狀 documented 例外」);其餘視覺全繼承 Button tertiary,不另自訂
132
132
  - **形狀 documented 例外**:override `rounded-md` → **`rounded-full`**(圓形)。理由:media carousel 視覺取向,圓形箭頭減少方塊感、不壓迫媒體內容(對齊 **Instagram / Airbnb / Notion Gallery / Apple Photos / Google Photos lightbox 世界級慣例** — 媒體 overlay 控制器圓形)。本 DS 內 Button default 是 `rounded-md`,這裡是唯一文明 override,documented 例外記錄即為本段(同步 `carousel.tsx` Button `className="rounded-full"` 旁 inline 註解)。**不傳染**:其他元件的 Button 仍走 rounded-md <!-- @benchmark-unverified: see frontmatter benchmark list for canonical DS source URL -->
133
- - 尺寸:`size="md"` 對應 `--field-height-md`(default 32px / loose 36px),iconOnly 正方形;形狀 **`rounded-full`**(documented 例外,見上一條)
133
+ - 尺寸:`size="md"` 對應 `--field-height-md`(default/md 32px / lg 36px),iconOnly 正方形;形狀 **`rounded-full`**(documented 例外,見上一條)
134
134
  - 為什麼 tertiary:`bg-surface` + `border-border`,hover 僅改 text/border 為 `primary-hover`——無 bg-hover tint,視覺最輕,不搶 media 權重;secondary 有 neutral 邊框+hover 較重,primary 有底色更搶焦點,均不合適
135
135
  - 背景 / 邊框 / hover / focus-visible:全部繼承 Button tertiary variant 的 token,不自訂
136
136
  - 圖標:`startIcon={ChevronLeft}` / `startIcon={ChevronRight}`,尺寸由 Button 內部程式化決定
@@ -97,6 +97,14 @@ const Carousel = React.forwardRef<
97
97
  setSelectedIndex(a.selectedScrollSnap())
98
98
  }, [])
99
99
 
100
+ // reInit(動態 slide 增減 / options 變更)必刷新 scrollSnaps —— onSelect 只讀 select
101
+ // 狀態不含 scrollSnapList;若不在此補,dots 數量 stale(舊 dots 殘留 / 縮減不更新)。
102
+ const onReInit = React.useCallback((a: CarouselApi) => {
103
+ if (!a) return
104
+ setScrollSnaps(a.scrollSnapList())
105
+ onSelect(a)
106
+ }, [onSelect])
107
+
100
108
  const scrollPrev = React.useCallback(() => api?.scrollPrev(), [api])
101
109
  const scrollNext = React.useCallback(() => api?.scrollNext(), [api])
102
110
  const scrollTo = React.useCallback((i: number) => api?.scrollTo(i), [api])
@@ -110,13 +118,13 @@ const Carousel = React.forwardRef<
110
118
  if (!api) return
111
119
  setScrollSnaps(api.scrollSnapList())
112
120
  onSelect(api)
113
- api.on('reInit', onSelect)
121
+ api.on('reInit', onReInit)
114
122
  api.on('select', onSelect)
115
123
  return () => {
116
124
  api?.off('select', onSelect)
117
- api?.off('reInit', onSelect) // D3 fix: previously leaked — stale closure on remount
125
+ api?.off('reInit', onReInit) // D3 fix: previously leaked — stale closure on remount
118
126
  }
119
- }, [api, onSelect])
127
+ }, [api, onSelect, onReInit])
120
128
 
121
129
  const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {
122
130
  // 鍵盤方向對齊內容捲動方向(APG 建議):horizontal → ←/→;vertical → ↑/↓
@@ -56,10 +56,13 @@ const visitorConfig = {
56
56
 
57
57
  // 訂閱方案分布(對標 Stripe dashboard)
58
58
  const subscriptionData = [
59
- { tier: 'Free', users: 820, fill: 'var(--color-free)' },
60
- { tier: 'Pro', users: 340, fill: 'var(--color-pro)' },
61
- { tier: 'Team', users: 180, fill: 'var(--color-team)' },
62
- { tier: 'Enterprise', users: 42, fill: 'var(--color-enterprise)' },
59
+ // nameKey='tier' 的值必須等於 subscriptionConfig 的 key(小寫);顯示標籤由 config.label 提供
60
+ // (shadcn pie canonical:data nameKey 欄位 = 小寫 config key,如 { browser: 'chrome' })。
61
+ // 曾用大寫 'Free' → getPayloadConfig 以 'Free' config 落空 → 圖例標籤全空(2026-07-13 修)
62
+ { tier: 'free', users: 820, fill: 'var(--color-free)' },
63
+ { tier: 'pro', users: 340, fill: 'var(--color-pro)' },
64
+ { tier: 'team', users: 180, fill: 'var(--color-team)' },
65
+ { tier: 'enterprise', users: 42, fill: 'var(--color-enterprise)' },
63
66
  ]
64
67
 
65
68
  const subscriptionConfig = {
@@ -256,7 +256,7 @@ export const ChartTypeRule: Story = {
256
256
 
257
257
  <Rule
258
258
  title="Pie / Donut — 整體的組成比例"
259
- note="呈現『誰佔了整體的多少 %』,只適用 3-4 類。超過就改用 Bar(類別對比時比例已暗含在柱高裡)。Google Analytics 的流量來源、App Store 的 OS 分布。"
259
+ note="呈現『誰佔了整體的多少 %』,最多 5 類(類別配色上限,見「最多 5 類別」)。超過先合併「其他」;仍不夠改用 Bar(類別對比時比例已暗含在柱高裡)。Google Analytics 的流量來源、App Store 的 OS 分布。"
260
260
  >
261
261
  <div className="w-full max-w-sm">
262
262
  <ChartContainer config={osShareConfig}>
@@ -124,10 +124,7 @@ export const BarChartRevenue: Story = {
124
124
  />
125
125
  <ChartTooltip
126
126
  content={
127
- <ChartTooltipContent
128
- indicator="dashed"
129
- formatter={(value) => `$${Number(value).toLocaleString()}`}
130
- />
127
+ <ChartTooltipContent indicator="dashed" />
131
128
  }
132
129
  />
133
130
  <Bar dataKey="revenue" fill="var(--color-revenue)" radius={4} />
@@ -159,10 +156,7 @@ export const LineChartResponseTime: Story = {
159
156
  />
160
157
  <ChartTooltip
161
158
  content={
162
- <ChartTooltipContent
163
- indicator="line"
164
- formatter={(value) => `${Number(value)}ms`}
165
- />
159
+ <ChartTooltipContent indicator="line" />
166
160
  }
167
161
  />
168
162
  <ChartLegend content={<ChartLegendContent />} />
@@ -59,6 +59,9 @@ const ChartContainer = React.forwardRef<HTMLDivElement, ChartContainerProps>(
59
59
  <ChartContext.Provider value={ctxValue}>
60
60
  <div
61
61
  ref={ref}
62
+ // 2026-07-14 audit Dim 9(passthrough 完整度):id 原被 destructure 只拿去組 data-chart,
63
+ // native id attr 靜默吞掉 —— consumer 傳 id 期待 DOM id(anchor / aria 參照)必須落地。
64
+ id={id}
62
65
  data-chart={chartId}
63
66
  className={cn(
64
67
  // 整體視覺套用本 DS typography + token
@@ -1,7 +1,7 @@
1
1
  import type { Meta } from '@storybook/react'
2
2
  import { useState } from 'react'
3
3
  import { Checkbox } from './checkbox'
4
- import { SelectionItem } from '@/design-system/components/SelectionControl/selection-item'
4
+ import { CheckboxGroup } from './checkbox-group'
5
5
 
6
6
  const meta: Meta = {
7
7
  title: 'Design System/Components/Checkbox/設計規格',
@@ -159,7 +159,7 @@ export const Overview = {
159
159
  <div className="flex flex-col gap-4">
160
160
  <div className="flex flex-col gap-1">
161
161
  <H3>結構(Anatomy)</H3>
162
- <Desc>Checkbox 由兩層組成:indicator(方框 + check icon)和 label(透過 SelectionItem 組合)。Checkbox 本身不內建 label。</Desc>
162
+ <Desc>Checkbox 由兩層組成:indicator(方框 + check icon)和 label(`label` prop 提供,內部自動透過 SelectionItem 組合)。</Desc>
163
163
  </div>
164
164
  <div className="flex gap-8">
165
165
  {/* Standalone checkbox */}
@@ -173,16 +173,16 @@ export const Overview = {
173
173
  </div>
174
174
  </div>
175
175
  </div>
176
- {/* With SelectionItem */}
176
+ {/* With label prop */}
177
177
  <div className="flex flex-col gap-2 items-start">
178
- <span className="text-[11px] text-fg-muted font-medium">搭配 SelectionItem</span>
178
+ <span className="text-[11px] text-fg-muted font-medium">傳 label prop</span>
179
179
  <div className="inline-flex items-center border-2 border-dashed border-primary/30 rounded-md p-3 gap-2">
180
- {[{ name: 'control (Checkbox)', color: 'info' }, { name: 'control (Checkbox)', color: 'success' }].map((s) => (
180
+ {[{ name: 'control (Checkbox)', color: 'info' }, { name: 'label / content', color: 'success' }].map((s) => (
181
181
  <span key={s.name} className="rounded px-2 py-1 text-[11px] font-mono border border-dashed"
182
182
  style={{ borderColor: `var(--${s.color})`, backgroundColor: `var(--${s.color}-subtle)`, color: `var(--${s.color})` }}>{s.name}</span>
183
183
  ))}
184
184
  </div>
185
- <span className="text-[10px] text-fg-muted font-mono">SelectionItem 處理 label 對齊與 padding</span>
185
+ <span className="text-[10px] text-fg-muted font-mono">內部 SelectionItem 處理 label 對齊與 padding</span>
186
186
  </div>
187
187
  </div>
188
188
  </div>
@@ -272,7 +272,7 @@ const InspectorInner = () => {
272
272
  <Tab active={!withLabel} onClick={() => setWithLabel(false)}>off</Tab>
273
273
  <Tab active={withLabel} onClick={() => setWithLabel(true)}>on</Tab>
274
274
  </div>
275
- <span className="text-[11px] text-fg-muted">搭配 SelectionItem</span>
275
+ <span className="text-[11px] text-fg-muted">label prop(內部 SelectionItem 組合)</span>
276
276
  </div>
277
277
  {withLabel && (
278
278
  <div className="flex items-center gap-2">
@@ -292,20 +292,13 @@ const InspectorInner = () => {
292
292
  <div className="flex flex-col gap-5 min-w-[340px]">
293
293
  <div className="px-10 py-8 rounded-lg bg-canvas border border-divider flex items-center justify-center">
294
294
  {withLabel ? (
295
- <SelectionItem
295
+ /* 公開 API:`<Checkbox label>` 內部自動包 SelectionItem + wire id/htmlFor(selection-item.spec.md 禁裸用) */
296
+ <Checkbox
296
297
  size={size}
297
- control={
298
- <Checkbox
299
- id="inspector-cb"
300
- size={size}
301
- checked={checkedState === 'checked' ? true : checkedState === 'indeterminate' ? 'indeterminate' : false}
302
- disabled={interaction === 'disabled'}
303
- />
304
- }
298
+ checked={checkedState === 'checked' ? true : checkedState === 'indeterminate' ? 'indeterminate' : false}
299
+ disabled={interaction === 'disabled'}
305
300
  label="Label text"
306
301
  description={withDescription ? '次要說明文字,給使用者更多 context' : undefined}
307
- htmlFor="inspector-cb"
308
- disabled={interaction === 'disabled'}
309
302
  />
310
303
  ) : (
311
304
  <Checkbox
@@ -493,7 +486,7 @@ export const SizeMatrix = {
493
486
  <Th>Size</Th>
494
487
  <Th>Unchecked</Th>
495
488
  <Th>Checked</Th>
496
- <Th>搭配 SelectionItem</Th>
489
+ <Th>label prop</Th>
497
490
  </tr></thead>
498
491
  <tbody>
499
492
  {SIZES.map((sz) => (
@@ -502,12 +495,8 @@ export const SizeMatrix = {
502
495
  <Td><Checkbox size={sz} /></Td>
503
496
  <Td><Checkbox size={sz} defaultChecked /></Td>
504
497
  <Td>
505
- <SelectionItem
506
- size={sz}
507
- control={<Checkbox id={`sz-${sz}`} size={sz} defaultChecked />}
508
- label="Label text"
509
- htmlFor={`sz-${sz}`}
510
- />
498
+ {/* 公開 API:`<Checkbox label>` 內部自動包 SelectionItem + wire id/htmlFor(selection-item.spec.md 禁裸用) */}
499
+ <Checkbox size={sz} defaultChecked label="Label text" />
511
500
  </Td>
512
501
  </tr>
513
502
  ))}
@@ -561,16 +550,16 @@ export const StateBehavior = {
561
550
  {/* Vertical Group */}
562
551
  <div className="flex flex-col gap-3">
563
552
  <span className="text-caption font-medium text-fg-secondary">垂直排列 — Item 間距由 padding 處理,不加 gap</span>
564
- <Desc>每個 SelectionItem py = (field-height − 一行文字高度) / 2,單行高度剛好等於同 size 的 Input,多行時 padding 不變自然撐高。</Desc>
553
+ <Desc>每個 item(內部 SelectionItem)的 py = (field-height − 一行文字高度) / 2,單行高度剛好等於同 size 的 Input,多行時 padding 不變自然撐高。</Desc>
565
554
  <div className="flex gap-8">
566
555
  {(['md', 'lg'] as const).map((sz) => (
567
556
  <div key={sz} className="flex flex-col gap-1">
568
557
  <span className="text-[11px] text-fg-muted font-medium">size="{sz}"</span>
569
- <div className="grid border border-dashed border-divider rounded-md p-2">
570
- <SelectionItem size={sz} control={<Checkbox id={`vg-${sz}-a`} size={sz} />} label="Email 通知" htmlFor={`vg-${sz}-a`} />
571
- <SelectionItem size={sz} control={<Checkbox id={`vg-${sz}-b`} size={sz} />} label="SMS 通知" description="每則訊息可能有費用" htmlFor={`vg-${sz}-b`} />
572
- <SelectionItem size={sz} control={<Checkbox id={`vg-${sz}-c`} size={sz} />} label="Push 通知" htmlFor={`vg-${sz}-c`} />
573
- </div>
558
+ <CheckboxGroup className="border border-dashed border-divider rounded-md p-2">
559
+ <Checkbox size={sz} label="Email 通知" />
560
+ <Checkbox size={sz} label="SMS 通知" description="每則訊息可能有費用" />
561
+ <Checkbox size={sz} label="Push 通知" />
562
+ </CheckboxGroup>
574
563
  </div>
575
564
  ))}
576
565
  </div>
@@ -580,9 +569,9 @@ export const StateBehavior = {
580
569
  <div className="flex flex-col gap-3">
581
570
  <span className="text-caption font-medium text-fg-secondary">水平排列 — Item 之間 gap-4(16px)</span>
582
571
  <div className="flex gap-4 border border-dashed border-divider rounded-md p-2">
583
- <SelectionItem control={<Checkbox id="hg-a" />} label="Email" htmlFor="hg-a" />
584
- <SelectionItem control={<Checkbox id="hg-b" />} label="SMS" htmlFor="hg-b" />
585
- <SelectionItem control={<Checkbox id="hg-c" />} label="Push" htmlFor="hg-c" />
572
+ <Checkbox label="Email" />
573
+ <Checkbox label="SMS" />
574
+ <Checkbox label="Push" />
586
575
  </div>
587
576
  </div>
588
577
 
@@ -590,24 +579,14 @@ export const StateBehavior = {
590
579
  <div className="flex flex-col gap-3">
591
580
  <span className="text-caption font-medium text-fg-secondary">多行對齊 — 控件對齊第一行文字中心</span>
592
581
  <Desc>控件包在一行文字高度的容器內,外層 flex items-start 確保多行時控件對齊第一行。字體改變時高度自動重算。</Desc>
593
- <div className="max-w-sm grid border border-dashed border-divider rounded-md">
594
- <SelectionItem
595
- control={<Checkbox id="ml-a" />}
596
- label="短標籤"
597
- htmlFor="ml-a"
598
- />
599
- <SelectionItem
600
- control={<Checkbox id="ml-b" />}
601
- label="這是一個比較長的標籤文字,會自動換行到第二行,控件始終對齊第一行的垂直中心"
602
- htmlFor="ml-b"
603
- />
604
- <SelectionItem
605
- control={<Checkbox id="ml-c" />}
582
+ <CheckboxGroup className="max-w-sm border border-dashed border-divider rounded-md">
583
+ <Checkbox label="短標籤" />
584
+ <Checkbox label="這是一個比較長的標籤文字,會自動換行到第二行,控件始終對齊第一行的垂直中心" />
585
+ <Checkbox
606
586
  label="附帶說明"
607
587
  description="說明文字用 fg-secondary 色彩,排在 label 下方"
608
- htmlFor="ml-c"
609
588
  />
610
- </div>
589
+ </CheckboxGroup>
611
590
  </div>
612
591
  </div>
613
592
  ),
@@ -147,7 +147,7 @@ export const UsageGuidance: Story = {
147
147
 
148
148
  <Rule
149
149
  title="Radio — 互斥單選(必須在 RadioGroup 內)"
150
- note="N 個選項中只能選一個,其他自動變 unchecked。必須有 default value(radio 的語意不允許「都沒選」)"
150
+ note="N 個選項中只能選一個,其他自動變 unchecked。通常可預選常用項;需要使用者主動表態(如付款方式)時可從未選開始(radio-group.spec.md:value=null 為合法初始態),配 required 驗證兜底"
151
151
  >
152
152
  <RadioGroup value={selected} onValueChange={setSelected}>
153
153
  <RadioGroupItem value="credit" label="信用卡" description="手續費 2.5%,即時" />