@qijenchen/design-system 0.1.0-beta.8 → 0.1.0-beta.80

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 (1356) hide show
  1. package/CLAUDE.md +200 -0
  2. package/README.md +10 -9
  3. package/cli-init.mjs +90 -0
  4. package/dist/components/Accordion/accordion.d.ts +1 -1
  5. package/dist/components/Accordion/accordion.d.ts.map +1 -1
  6. package/dist/components/Accordion/accordion.js +4 -1
  7. package/dist/components/Accordion/accordion.js.map +1 -1
  8. package/dist/components/Accordion/index.d.ts +2 -0
  9. package/dist/components/Accordion/index.d.ts.map +1 -0
  10. package/dist/components/Accordion/index.js +9 -0
  11. package/dist/components/Accordion/index.js.map +1 -0
  12. package/dist/components/Alert/alert.d.ts +2 -2
  13. package/dist/components/Alert/alert.d.ts.map +1 -1
  14. package/dist/components/Alert/alert.js +8 -7
  15. package/dist/components/Alert/alert.js.map +1 -1
  16. package/dist/components/Alert/index.d.ts +2 -0
  17. package/dist/components/Alert/index.d.ts.map +1 -0
  18. package/dist/components/Alert/index.js +7 -0
  19. package/dist/components/Alert/index.js.map +1 -0
  20. package/dist/components/AppShell/_demo-helpers.d.ts +3 -1
  21. package/dist/components/AppShell/_demo-helpers.d.ts.map +1 -1
  22. package/dist/components/AppShell/app-shell.d.ts +2 -2
  23. package/dist/components/AppShell/app-shell.d.ts.map +1 -1
  24. package/dist/components/AppShell/app-shell.js +9 -8
  25. package/dist/components/AppShell/app-shell.js.map +1 -1
  26. package/dist/components/AppShell/index.d.ts +2 -0
  27. package/dist/components/AppShell/index.d.ts.map +1 -0
  28. package/dist/components/AppShell/index.js +7 -0
  29. package/dist/components/AppShell/index.js.map +1 -0
  30. package/dist/components/AspectRatio/aspect-ratio.d.ts +1 -1
  31. package/dist/components/AspectRatio/aspect-ratio.d.ts.map +1 -1
  32. package/dist/components/AspectRatio/aspect-ratio.js +4 -2
  33. package/dist/components/AspectRatio/aspect-ratio.js.map +1 -1
  34. package/dist/components/AspectRatio/index.d.ts +2 -0
  35. package/dist/components/AspectRatio/index.d.ts.map +1 -0
  36. package/dist/components/AspectRatio/index.js +6 -0
  37. package/dist/components/AspectRatio/index.js.map +1 -0
  38. package/dist/components/Avatar/avatar.d.ts +12 -6
  39. package/dist/components/Avatar/avatar.d.ts.map +1 -1
  40. package/dist/components/Avatar/avatar.js +12 -23
  41. package/dist/components/Avatar/avatar.js.map +1 -1
  42. package/dist/components/Avatar/index.d.ts +2 -0
  43. package/dist/components/Avatar/index.d.ts.map +1 -0
  44. package/dist/components/Avatar/index.js +6 -0
  45. package/dist/components/Avatar/index.js.map +1 -0
  46. package/dist/components/Badge/badge.d.ts +20 -8
  47. package/dist/components/Badge/badge.d.ts.map +1 -1
  48. package/dist/components/Badge/badge.js +7 -5
  49. package/dist/components/Badge/badge.js.map +1 -1
  50. package/dist/components/Badge/index.d.ts +2 -0
  51. package/dist/components/Badge/index.d.ts.map +1 -0
  52. package/dist/components/Badge/index.js +7 -0
  53. package/dist/components/Badge/index.js.map +1 -0
  54. package/dist/components/Breadcrumb/breadcrumb.d.ts +1 -1
  55. package/dist/components/Breadcrumb/breadcrumb.js.map +1 -1
  56. package/dist/components/Breadcrumb/index.d.ts +2 -0
  57. package/dist/components/Breadcrumb/index.d.ts.map +1 -0
  58. package/dist/components/Breadcrumb/index.js +12 -0
  59. package/dist/components/Breadcrumb/index.js.map +1 -0
  60. package/dist/components/BulkActionBar/bulk-action-bar.d.ts +2 -2
  61. package/dist/components/BulkActionBar/bulk-action-bar.d.ts.map +1 -1
  62. package/dist/components/BulkActionBar/bulk-action-bar.js +3 -3
  63. package/dist/components/BulkActionBar/bulk-action-bar.js.map +1 -1
  64. package/dist/components/BulkActionBar/index.d.ts +2 -0
  65. package/dist/components/BulkActionBar/index.d.ts.map +1 -0
  66. package/dist/components/BulkActionBar/index.js +7 -0
  67. package/dist/components/BulkActionBar/index.js.map +1 -0
  68. package/dist/components/Button/button.d.ts +7 -7
  69. package/dist/components/Button/button.d.ts.map +1 -1
  70. package/dist/components/Button/button.js +13 -10
  71. package/dist/components/Button/button.js.map +1 -1
  72. package/dist/components/Button/index.d.ts +2 -0
  73. package/dist/components/Button/index.d.ts.map +1 -0
  74. package/dist/components/Button/index.js +8 -0
  75. package/dist/components/Button/index.js.map +1 -0
  76. package/dist/components/Calendar/calendar.d.ts +9 -5
  77. package/dist/components/Calendar/calendar.d.ts.map +1 -1
  78. package/dist/components/Calendar/calendar.js +88 -76
  79. package/dist/components/Calendar/calendar.js.map +1 -1
  80. package/dist/components/Calendar/index.d.ts +2 -0
  81. package/dist/components/Calendar/index.d.ts.map +1 -0
  82. package/dist/components/Calendar/index.js +6 -0
  83. package/dist/components/Calendar/index.js.map +1 -0
  84. package/dist/components/Carousel/carousel.d.ts.map +1 -1
  85. package/dist/components/Carousel/carousel.js +11 -6
  86. package/dist/components/Carousel/carousel.js.map +1 -1
  87. package/dist/components/Carousel/index.d.ts +2 -0
  88. package/dist/components/Carousel/index.d.ts.map +1 -0
  89. package/dist/components/Carousel/index.js +11 -0
  90. package/dist/components/Carousel/index.js.map +1 -0
  91. package/dist/components/Chart/chart.d.ts +2 -2
  92. package/dist/components/Chart/chart.d.ts.map +1 -1
  93. package/dist/components/Chart/chart.js +3 -1
  94. package/dist/components/Chart/chart.js.map +1 -1
  95. package/dist/components/Chart/index.d.ts +2 -0
  96. package/dist/components/Chart/index.d.ts.map +1 -0
  97. package/dist/components/Chart/index.js +11 -0
  98. package/dist/components/Chart/index.js.map +1 -0
  99. package/dist/components/Checkbox/checkbox-group.d.ts +2 -1
  100. package/dist/components/Checkbox/checkbox-group.d.ts.map +1 -1
  101. package/dist/components/Checkbox/checkbox-group.js.map +1 -1
  102. package/dist/components/Checkbox/checkbox.d.ts +13 -7
  103. package/dist/components/Checkbox/checkbox.d.ts.map +1 -1
  104. package/dist/components/Checkbox/checkbox.js +49 -15
  105. package/dist/components/Checkbox/checkbox.js.map +1 -1
  106. package/dist/components/Checkbox/index.d.ts +2 -0
  107. package/dist/components/Checkbox/index.d.ts.map +1 -0
  108. package/dist/components/Checkbox/index.js +7 -0
  109. package/dist/components/Checkbox/index.js.map +1 -0
  110. package/dist/components/Chip/chip.d.ts +6 -6
  111. package/dist/components/Chip/chip.js +4 -3
  112. package/dist/components/Chip/chip.js.map +1 -1
  113. package/dist/components/Chip/index.d.ts +2 -0
  114. package/dist/components/Chip/index.d.ts.map +1 -0
  115. package/dist/components/Chip/index.js +8 -0
  116. package/dist/components/Chip/index.js.map +1 -0
  117. package/dist/components/CircularProgress/circular-progress.d.ts +2 -3
  118. package/dist/components/CircularProgress/circular-progress.d.ts.map +1 -1
  119. package/dist/components/CircularProgress/circular-progress.js +4 -3
  120. package/dist/components/CircularProgress/circular-progress.js.map +1 -1
  121. package/dist/components/CircularProgress/index.d.ts +2 -0
  122. package/dist/components/CircularProgress/index.d.ts.map +1 -0
  123. package/dist/components/CircularProgress/index.js +6 -0
  124. package/dist/components/CircularProgress/index.js.map +1 -0
  125. package/dist/components/Coachmark/coachmark-story-helpers.d.ts +22 -0
  126. package/dist/components/Coachmark/coachmark-story-helpers.d.ts.map +1 -0
  127. package/dist/components/Coachmark/coachmark.d.ts +4 -4
  128. package/dist/components/Coachmark/coachmark.d.ts.map +1 -1
  129. package/dist/components/Coachmark/coachmark.js +9 -4
  130. package/dist/components/Coachmark/coachmark.js.map +1 -1
  131. package/dist/components/Coachmark/index.d.ts +2 -0
  132. package/dist/components/Coachmark/index.d.ts.map +1 -0
  133. package/dist/components/Coachmark/index.js +6 -0
  134. package/dist/components/Coachmark/index.js.map +1 -0
  135. package/dist/components/Combobox/combobox.d.ts +16 -7
  136. package/dist/components/Combobox/combobox.d.ts.map +1 -1
  137. package/dist/components/Combobox/combobox.js +74 -39
  138. package/dist/components/Combobox/combobox.js.map +1 -1
  139. package/dist/components/Combobox/index.d.ts +2 -0
  140. package/dist/components/Combobox/index.d.ts.map +1 -0
  141. package/dist/components/Combobox/index.js +6 -0
  142. package/dist/components/Combobox/index.js.map +1 -0
  143. package/dist/components/Command/command.d.ts +5 -1
  144. package/dist/components/Command/command.d.ts.map +1 -1
  145. package/dist/components/Command/command.js +6 -6
  146. package/dist/components/Command/command.js.map +1 -1
  147. package/dist/components/Command/index.d.ts +2 -0
  148. package/dist/components/Command/index.d.ts.map +1 -0
  149. package/dist/components/Command/index.js +14 -0
  150. package/dist/components/Command/index.js.map +1 -0
  151. package/dist/components/DataTable/cell-registry.d.ts.map +1 -1
  152. package/dist/components/DataTable/cell-registry.js +6 -5
  153. package/dist/components/DataTable/cell-registry.js.map +1 -1
  154. package/dist/components/DataTable/data-table.d.ts +29 -8
  155. package/dist/components/DataTable/data-table.d.ts.map +1 -1
  156. package/dist/components/DataTable/data-table.js +69 -39
  157. package/dist/components/DataTable/data-table.js.map +1 -1
  158. package/dist/components/DataTable/filter-operators.d.ts +1 -1
  159. package/dist/components/DataTable/filter-tree.d.ts +1 -1
  160. package/dist/components/DataTable/index.d.ts +2 -0
  161. package/dist/components/DataTable/index.d.ts.map +1 -0
  162. package/dist/components/DataTable/index.js +8 -0
  163. package/dist/components/DataTable/index.js.map +1 -0
  164. package/dist/components/DateGrid/date-grid.d.ts +21 -17
  165. package/dist/components/DateGrid/date-grid.d.ts.map +1 -1
  166. package/dist/components/DateGrid/date-grid.js +2 -2
  167. package/dist/components/DateGrid/date-grid.js.map +1 -1
  168. package/dist/components/DateGrid/index.d.ts +2 -0
  169. package/dist/components/DateGrid/index.d.ts.map +1 -0
  170. package/dist/components/DateGrid/index.js +6 -0
  171. package/dist/components/DateGrid/index.js.map +1 -0
  172. package/dist/components/DatePicker/date-picker.d.ts.map +1 -1
  173. package/dist/components/DatePicker/date-picker.js +29 -18
  174. package/dist/components/DatePicker/date-picker.js.map +1 -1
  175. package/dist/components/DatePicker/index.d.ts +2 -0
  176. package/dist/components/DatePicker/index.d.ts.map +1 -0
  177. package/dist/components/DatePicker/index.js +8 -0
  178. package/dist/components/DatePicker/index.js.map +1 -0
  179. package/dist/components/DescriptionList/description-list.d.ts +3 -3
  180. package/dist/components/DescriptionList/description-list.js +4 -3
  181. package/dist/components/DescriptionList/description-list.js.map +1 -1
  182. package/dist/components/DescriptionList/index.d.ts +2 -0
  183. package/dist/components/DescriptionList/index.d.ts.map +1 -0
  184. package/dist/components/DescriptionList/index.js +7 -0
  185. package/dist/components/DescriptionList/index.js.map +1 -0
  186. package/dist/components/Dialog/dialog.d.ts.map +1 -1
  187. package/dist/components/Dialog/dialog.js.map +1 -1
  188. package/dist/components/Dialog/index.d.ts +2 -0
  189. package/dist/components/Dialog/index.d.ts.map +1 -0
  190. package/dist/components/Dialog/index.js +16 -0
  191. package/dist/components/Dialog/index.js.map +1 -0
  192. package/dist/components/DropdownMenu/dropdown-menu.d.ts +3 -2
  193. package/dist/components/DropdownMenu/dropdown-menu.d.ts.map +1 -1
  194. package/dist/components/DropdownMenu/dropdown-menu.js +3 -4
  195. package/dist/components/DropdownMenu/dropdown-menu.js.map +1 -1
  196. package/dist/components/DropdownMenu/index.d.ts +2 -0
  197. package/dist/components/DropdownMenu/index.d.ts.map +1 -0
  198. package/dist/components/DropdownMenu/index.js +21 -0
  199. package/dist/components/DropdownMenu/index.js.map +1 -0
  200. package/dist/components/Empty/empty.d.ts +11 -3
  201. package/dist/components/Empty/empty.d.ts.map +1 -1
  202. package/dist/components/Empty/empty.js +6 -6
  203. package/dist/components/Empty/empty.js.map +1 -1
  204. package/dist/components/Empty/index.d.ts +2 -0
  205. package/dist/components/Empty/index.d.ts.map +1 -0
  206. package/dist/components/Empty/index.js +6 -0
  207. package/dist/components/Empty/index.js.map +1 -0
  208. package/dist/components/Field/field-context.d.ts +49 -0
  209. package/dist/components/Field/field-context.d.ts.map +1 -1
  210. package/dist/components/Field/field-context.js +42 -0
  211. package/dist/components/Field/field-context.js.map +1 -1
  212. package/dist/components/Field/field-types.js.map +1 -1
  213. package/dist/components/Field/field-wrapper.js +5 -5
  214. package/dist/components/Field/field-wrapper.js.map +1 -1
  215. package/dist/components/Field/field.d.ts +4 -2
  216. package/dist/components/Field/field.d.ts.map +1 -1
  217. package/dist/components/Field/field.js +1 -0
  218. package/dist/components/Field/field.js.map +1 -1
  219. package/dist/components/Field/index.d.ts +2 -0
  220. package/dist/components/Field/index.d.ts.map +1 -0
  221. package/dist/components/Field/index.js +12 -0
  222. package/dist/components/Field/index.js.map +1 -0
  223. package/dist/components/Field/use-form-validation.d.ts +88 -0
  224. package/dist/components/Field/use-form-validation.d.ts.map +1 -0
  225. package/dist/components/Field/use-form-validation.js +127 -0
  226. package/dist/components/Field/use-form-validation.js.map +1 -0
  227. package/dist/components/FieldControlGroup/field-control-group.d.ts +5 -5
  228. package/dist/components/FieldControlGroup/field-control-group.d.ts.map +1 -1
  229. package/dist/components/FieldControlGroup/field-control-group.js +1 -1
  230. package/dist/components/FieldControlGroup/field-control-group.js.map +1 -1
  231. package/dist/components/FieldControlGroup/index.d.ts +2 -0
  232. package/dist/components/FieldControlGroup/index.d.ts.map +1 -0
  233. package/dist/components/FieldControlGroup/index.js +6 -0
  234. package/dist/components/FieldControlGroup/index.js.map +1 -0
  235. package/dist/components/FileItem/file-item.d.ts +12 -2
  236. package/dist/components/FileItem/file-item.d.ts.map +1 -1
  237. package/dist/components/FileItem/file-item.js +20 -6
  238. package/dist/components/FileItem/file-item.js.map +1 -1
  239. package/dist/components/FileItem/index.d.ts +2 -0
  240. package/dist/components/FileItem/index.d.ts.map +1 -0
  241. package/dist/components/FileItem/index.js +6 -0
  242. package/dist/components/FileItem/index.js.map +1 -0
  243. package/dist/components/FileUpload/file-upload.d.ts +32 -13
  244. package/dist/components/FileUpload/file-upload.d.ts.map +1 -1
  245. package/dist/components/FileUpload/file-upload.js +62 -18
  246. package/dist/components/FileUpload/file-upload.js.map +1 -1
  247. package/dist/components/FileUpload/index.d.ts +2 -0
  248. package/dist/components/FileUpload/index.d.ts.map +1 -0
  249. package/dist/components/FileUpload/index.js +6 -0
  250. package/dist/components/FileUpload/index.js.map +1 -0
  251. package/dist/components/FileViewer/file-viewer.d.ts +2 -2
  252. package/dist/components/FileViewer/file-viewer.d.ts.map +1 -1
  253. package/dist/components/FileViewer/file-viewer.js +28 -19
  254. package/dist/components/FileViewer/file-viewer.js.map +1 -1
  255. package/dist/components/FileViewer/index.d.ts +2 -0
  256. package/dist/components/FileViewer/index.d.ts.map +1 -0
  257. package/dist/components/FileViewer/index.js +7 -0
  258. package/dist/components/FileViewer/index.js.map +1 -0
  259. package/dist/components/HoverCard/hover-card.d.ts +7 -3
  260. package/dist/components/HoverCard/hover-card.d.ts.map +1 -1
  261. package/dist/components/HoverCard/hover-card.js +4 -3
  262. package/dist/components/HoverCard/hover-card.js.map +1 -1
  263. package/dist/components/HoverCard/index.d.ts +2 -0
  264. package/dist/components/HoverCard/index.d.ts.map +1 -0
  265. package/dist/components/HoverCard/index.js +8 -0
  266. package/dist/components/HoverCard/index.js.map +1 -0
  267. package/dist/components/Input/index.d.ts +2 -0
  268. package/dist/components/Input/index.d.ts.map +1 -0
  269. package/dist/components/Input/index.js +6 -0
  270. package/dist/components/Input/index.js.map +1 -0
  271. package/dist/components/Input/input.d.ts +5 -2
  272. package/dist/components/Input/input.d.ts.map +1 -1
  273. package/dist/components/Input/input.js +10 -8
  274. package/dist/components/Input/input.js.map +1 -1
  275. package/dist/components/LinkInput/index.d.ts +2 -0
  276. package/dist/components/LinkInput/index.d.ts.map +1 -0
  277. package/dist/components/LinkInput/index.js +6 -0
  278. package/dist/components/LinkInput/index.js.map +1 -0
  279. package/dist/components/LinkInput/link-input.d.ts.map +1 -1
  280. package/dist/components/LinkInput/link-input.js +8 -8
  281. package/dist/components/LinkInput/link-input.js.map +1 -1
  282. package/dist/components/Menu/index.d.ts +2 -0
  283. package/dist/components/Menu/index.d.ts.map +1 -0
  284. package/dist/components/Menu/index.js +9 -0
  285. package/dist/components/Menu/index.js.map +1 -0
  286. package/dist/components/Menu/menu-item.d.ts +6 -2
  287. package/dist/components/Menu/menu-item.d.ts.map +1 -1
  288. package/dist/components/Menu/menu-item.js +2 -1
  289. package/dist/components/Menu/menu-item.js.map +1 -1
  290. package/dist/components/Notice/index.d.ts +2 -0
  291. package/dist/components/Notice/index.d.ts.map +1 -0
  292. package/dist/components/Notice/index.js +8 -0
  293. package/dist/components/Notice/index.js.map +1 -0
  294. package/dist/components/Notice/notice.d.ts +13 -6
  295. package/dist/components/Notice/notice.d.ts.map +1 -1
  296. package/dist/components/Notice/notice.js +16 -6
  297. package/dist/components/Notice/notice.js.map +1 -1
  298. package/dist/components/NumberInput/index.d.ts +2 -0
  299. package/dist/components/NumberInput/index.d.ts.map +1 -0
  300. package/dist/components/NumberInput/index.js +7 -0
  301. package/dist/components/NumberInput/index.js.map +1 -0
  302. package/dist/components/NumberInput/number-input.d.ts.map +1 -1
  303. package/dist/components/NumberInput/number-input.js +8 -7
  304. package/dist/components/NumberInput/number-input.js.map +1 -1
  305. package/dist/components/OverflowIndicator/index.d.ts +2 -0
  306. package/dist/components/OverflowIndicator/index.d.ts.map +1 -0
  307. package/dist/components/OverflowIndicator/index.js +6 -0
  308. package/dist/components/OverflowIndicator/index.js.map +1 -0
  309. package/dist/components/OverflowIndicator/overflow-indicator.d.ts +5 -1
  310. package/dist/components/OverflowIndicator/overflow-indicator.d.ts.map +1 -1
  311. package/dist/components/OverflowIndicator/overflow-indicator.js +13 -6
  312. package/dist/components/OverflowIndicator/overflow-indicator.js.map +1 -1
  313. package/dist/components/PeoplePicker/index.d.ts +2 -0
  314. package/dist/components/PeoplePicker/index.d.ts.map +1 -0
  315. package/dist/components/PeoplePicker/index.js +9 -0
  316. package/dist/components/PeoplePicker/index.js.map +1 -0
  317. package/dist/components/PeoplePicker/people-picker-helpers.d.ts.map +1 -1
  318. package/dist/components/PeoplePicker/people-picker-helpers.js +2 -2
  319. package/dist/components/PeoplePicker/people-picker-helpers.js.map +1 -1
  320. package/dist/components/PeoplePicker/people-picker.d.ts.map +1 -1
  321. package/dist/components/PeoplePicker/people-picker.js +21 -17
  322. package/dist/components/PeoplePicker/people-picker.js.map +1 -1
  323. package/dist/components/PeoplePicker/person-display.d.ts +7 -7
  324. package/dist/components/PeoplePicker/person-display.d.ts.map +1 -1
  325. package/dist/components/PeoplePicker/person-display.js +9 -9
  326. package/dist/components/PeoplePicker/person-display.js.map +1 -1
  327. package/dist/components/Popover/index.d.ts +2 -0
  328. package/dist/components/Popover/index.d.ts.map +1 -0
  329. package/dist/components/Popover/index.js +14 -0
  330. package/dist/components/Popover/index.js.map +1 -0
  331. package/dist/components/Popover/popover.d.ts +2 -2
  332. package/dist/components/Popover/popover.d.ts.map +1 -1
  333. package/dist/components/Popover/popover.js +12 -12
  334. package/dist/components/Popover/popover.js.map +1 -1
  335. package/dist/components/ProfileCard/index.d.ts +2 -0
  336. package/dist/components/ProfileCard/index.d.ts.map +1 -0
  337. package/dist/components/ProfileCard/index.js +8 -0
  338. package/dist/components/ProfileCard/index.js.map +1 -0
  339. package/dist/components/{NameCard/name-card.d.ts → ProfileCard/profile-card.d.ts} +26 -20
  340. package/dist/components/ProfileCard/profile-card.d.ts.map +1 -0
  341. package/dist/components/{NameCard/name-card.js → ProfileCard/profile-card.js} +11 -10
  342. package/dist/components/ProfileCard/profile-card.js.map +1 -0
  343. package/dist/components/ProgressBar/index.d.ts +2 -0
  344. package/dist/components/ProgressBar/index.d.ts.map +1 -0
  345. package/dist/components/ProgressBar/index.js +6 -0
  346. package/dist/components/ProgressBar/index.js.map +1 -0
  347. package/dist/components/ProgressBar/progress-bar.d.ts +2 -2
  348. package/dist/components/ProgressBar/progress-bar.js +3 -3
  349. package/dist/components/ProgressBar/progress-bar.js.map +1 -1
  350. package/dist/components/RadioGroup/index.d.ts +2 -0
  351. package/dist/components/RadioGroup/index.d.ts.map +1 -0
  352. package/dist/components/RadioGroup/index.js +8 -0
  353. package/dist/components/RadioGroup/index.js.map +1 -0
  354. package/dist/components/RadioGroup/radio-group.d.ts +15 -9
  355. package/dist/components/RadioGroup/radio-group.d.ts.map +1 -1
  356. package/dist/components/RadioGroup/radio-group.js +71 -33
  357. package/dist/components/RadioGroup/radio-group.js.map +1 -1
  358. package/dist/components/Rating/index.d.ts +2 -0
  359. package/dist/components/Rating/index.d.ts.map +1 -0
  360. package/dist/components/Rating/index.js +6 -0
  361. package/dist/components/Rating/index.js.map +1 -0
  362. package/dist/components/Rating/rating.d.ts +6 -2
  363. package/dist/components/Rating/rating.d.ts.map +1 -1
  364. package/dist/components/Rating/rating.js +10 -7
  365. package/dist/components/Rating/rating.js.map +1 -1
  366. package/dist/components/ScrollArea/index.d.ts +2 -0
  367. package/dist/components/ScrollArea/index.d.ts.map +1 -0
  368. package/dist/components/ScrollArea/index.js +7 -0
  369. package/dist/components/ScrollArea/index.js.map +1 -0
  370. package/dist/components/ScrollArea/scroll-area.d.ts +1 -1
  371. package/dist/components/ScrollArea/scroll-area.js +2 -2
  372. package/dist/components/ScrollArea/scroll-area.js.map +1 -1
  373. package/dist/components/SegmentedControl/index.d.ts +2 -0
  374. package/dist/components/SegmentedControl/index.d.ts.map +1 -0
  375. package/dist/components/SegmentedControl/index.js +9 -0
  376. package/dist/components/SegmentedControl/index.js.map +1 -0
  377. package/dist/components/SegmentedControl/segmented-control.d.ts +2 -2
  378. package/dist/components/SegmentedControl/segmented-control.d.ts.map +1 -1
  379. package/dist/components/SegmentedControl/segmented-control.js +8 -10
  380. package/dist/components/SegmentedControl/segmented-control.js.map +1 -1
  381. package/dist/components/Select/index.d.ts +2 -0
  382. package/dist/components/Select/index.d.ts.map +1 -0
  383. package/dist/components/Select/index.js +6 -0
  384. package/dist/components/Select/index.js.map +1 -0
  385. package/dist/components/Select/select.d.ts.map +1 -1
  386. package/dist/components/Select/select.js +30 -18
  387. package/dist/components/Select/select.js.map +1 -1
  388. package/dist/components/SelectMenu/index.d.ts +2 -0
  389. package/dist/components/SelectMenu/index.d.ts.map +1 -0
  390. package/dist/components/SelectMenu/index.js +6 -0
  391. package/dist/components/SelectMenu/index.js.map +1 -0
  392. package/dist/components/SelectMenu/select-menu.d.ts +10 -5
  393. package/dist/components/SelectMenu/select-menu.d.ts.map +1 -1
  394. package/dist/components/SelectMenu/select-menu.js +12 -4
  395. package/dist/components/SelectMenu/select-menu.js.map +1 -1
  396. package/dist/components/SelectionControl/index.d.ts +2 -0
  397. package/dist/components/SelectionControl/index.d.ts.map +1 -0
  398. package/dist/components/SelectionControl/index.js +7 -0
  399. package/dist/components/SelectionControl/index.js.map +1 -0
  400. package/dist/components/SelectionControl/selection-item.d.ts +5 -1
  401. package/dist/components/SelectionControl/selection-item.d.ts.map +1 -1
  402. package/dist/components/SelectionControl/selection-item.js +3 -1
  403. package/dist/components/SelectionControl/selection-item.js.map +1 -1
  404. package/dist/components/Separator/index.d.ts +2 -0
  405. package/dist/components/Separator/index.d.ts.map +1 -0
  406. package/dist/components/Separator/index.js +6 -0
  407. package/dist/components/Separator/index.js.map +1 -0
  408. package/dist/components/Separator/separator.d.ts +2 -2
  409. package/dist/components/Separator/separator.js +4 -3
  410. package/dist/components/Separator/separator.js.map +1 -1
  411. package/dist/components/Sheet/index.d.ts +2 -0
  412. package/dist/components/Sheet/index.d.ts.map +1 -0
  413. package/dist/components/Sheet/index.js +17 -0
  414. package/dist/components/Sheet/index.js.map +1 -0
  415. package/dist/components/Sheet/sheet.d.ts +6 -5
  416. package/dist/components/Sheet/sheet.d.ts.map +1 -1
  417. package/dist/components/Sheet/sheet.js +1 -1
  418. package/dist/components/Sheet/sheet.js.map +1 -1
  419. package/dist/components/Sidebar/index.d.ts +2 -0
  420. package/dist/components/Sidebar/index.d.ts.map +1 -0
  421. package/dist/components/Sidebar/index.js +24 -0
  422. package/dist/components/Sidebar/index.js.map +1 -0
  423. package/dist/components/Sidebar/sidebar.d.ts +2 -2
  424. package/dist/components/Sidebar/sidebar.d.ts.map +1 -1
  425. package/dist/components/Sidebar/sidebar.js +9 -5
  426. package/dist/components/Sidebar/sidebar.js.map +1 -1
  427. package/dist/components/Skeleton/index.d.ts +2 -0
  428. package/dist/components/Skeleton/index.d.ts.map +1 -0
  429. package/dist/components/Skeleton/index.js +6 -0
  430. package/dist/components/Skeleton/index.js.map +1 -0
  431. package/dist/components/Skeleton/skeleton.d.ts +1 -1
  432. package/dist/components/Skeleton/skeleton.js +2 -1
  433. package/dist/components/Skeleton/skeleton.js.map +1 -1
  434. package/dist/components/Slider/index.d.ts +2 -0
  435. package/dist/components/Slider/index.d.ts.map +1 -0
  436. package/dist/components/Slider/index.js +7 -0
  437. package/dist/components/Slider/index.js.map +1 -0
  438. package/dist/components/Slider/slider.d.ts +6 -6
  439. package/dist/components/Slider/slider.d.ts.map +1 -1
  440. package/dist/components/Slider/slider.js +25 -10
  441. package/dist/components/Slider/slider.js.map +1 -1
  442. package/dist/components/Steps/index.d.ts +2 -0
  443. package/dist/components/Steps/index.d.ts.map +1 -0
  444. package/dist/components/Steps/index.js +12 -0
  445. package/dist/components/Steps/index.js.map +1 -0
  446. package/dist/components/Steps/steps.d.ts +2 -2
  447. package/dist/components/Steps/steps.d.ts.map +1 -1
  448. package/dist/components/Steps/steps.js +48 -23
  449. package/dist/components/Steps/steps.js.map +1 -1
  450. package/dist/components/Switch/index.d.ts +2 -0
  451. package/dist/components/Switch/index.d.ts.map +1 -0
  452. package/dist/components/Switch/index.js +7 -0
  453. package/dist/components/Switch/index.js.map +1 -0
  454. package/dist/components/Switch/switch.d.ts +16 -14
  455. package/dist/components/Switch/switch.d.ts.map +1 -1
  456. package/dist/components/Switch/switch.js +46 -17
  457. package/dist/components/Switch/switch.js.map +1 -1
  458. package/dist/components/Tabs/index.d.ts +2 -0
  459. package/dist/components/Tabs/index.d.ts.map +1 -0
  460. package/dist/components/Tabs/index.js +10 -0
  461. package/dist/components/Tabs/index.js.map +1 -0
  462. package/dist/components/Tabs/tabs.d.ts +5 -5
  463. package/dist/components/Tabs/tabs.d.ts.map +1 -1
  464. package/dist/components/Tabs/tabs.js +14 -7
  465. package/dist/components/Tabs/tabs.js.map +1 -1
  466. package/dist/components/Tag/index.d.ts +2 -0
  467. package/dist/components/Tag/index.d.ts.map +1 -0
  468. package/dist/components/Tag/index.js +7 -0
  469. package/dist/components/Tag/index.js.map +1 -0
  470. package/dist/components/Tag/tag.d.ts +37 -23
  471. package/dist/components/Tag/tag.d.ts.map +1 -1
  472. package/dist/components/Tag/tag.js +39 -44
  473. package/dist/components/Tag/tag.js.map +1 -1
  474. package/dist/components/Textarea/index.d.ts +2 -0
  475. package/dist/components/Textarea/index.d.ts.map +1 -0
  476. package/dist/components/Textarea/index.js +7 -0
  477. package/dist/components/Textarea/index.js.map +1 -0
  478. package/dist/components/Textarea/textarea.d.ts +5 -10
  479. package/dist/components/Textarea/textarea.d.ts.map +1 -1
  480. package/dist/components/Textarea/textarea.js +14 -12
  481. package/dist/components/Textarea/textarea.js.map +1 -1
  482. package/dist/components/TimePicker/index.d.ts +2 -0
  483. package/dist/components/TimePicker/index.d.ts.map +1 -0
  484. package/dist/components/TimePicker/index.js +6 -0
  485. package/dist/components/TimePicker/index.js.map +1 -0
  486. package/dist/components/TimePicker/time-columns.d.ts.map +1 -1
  487. package/dist/components/TimePicker/time-columns.js +4 -1
  488. package/dist/components/TimePicker/time-columns.js.map +1 -1
  489. package/dist/components/TimePicker/time-picker.d.ts +2 -1
  490. package/dist/components/TimePicker/time-picker.d.ts.map +1 -1
  491. package/dist/components/TimePicker/time-picker.js +33 -32
  492. package/dist/components/TimePicker/time-picker.js.map +1 -1
  493. package/dist/components/Toast/index.d.ts +2 -0
  494. package/dist/components/Toast/index.d.ts.map +1 -0
  495. package/dist/components/Toast/index.js +7 -0
  496. package/dist/components/Toast/index.js.map +1 -0
  497. package/dist/components/Toast/toast.d.ts +1 -1
  498. package/dist/components/Toast/toast.js +2 -2
  499. package/dist/components/Toast/toast.js.map +1 -1
  500. package/dist/components/Tooltip/index.d.ts +2 -0
  501. package/dist/components/Tooltip/index.d.ts.map +1 -0
  502. package/dist/components/Tooltip/index.js +9 -0
  503. package/dist/components/Tooltip/index.js.map +1 -0
  504. package/dist/components/Tooltip/tooltip.d.ts +1 -1
  505. package/dist/components/Tooltip/tooltip.d.ts.map +1 -1
  506. package/dist/components/Tooltip/tooltip.js +2 -1
  507. package/dist/components/Tooltip/tooltip.js.map +1 -1
  508. package/dist/components/TreeView/index.d.ts +2 -0
  509. package/dist/components/TreeView/index.d.ts.map +1 -0
  510. package/dist/components/TreeView/index.js +8 -0
  511. package/dist/components/TreeView/index.js.map +1 -0
  512. package/dist/components/TreeView/tree-view.d.ts +11 -11
  513. package/dist/components/TreeView/tree-view.d.ts.map +1 -1
  514. package/dist/components/TreeView/tree-view.js +36 -9
  515. package/dist/components/TreeView/tree-view.js.map +1 -1
  516. package/dist/hooks/use-overflow-items.d.ts +10 -6
  517. package/dist/hooks/use-overflow-items.d.ts.map +1 -1
  518. package/dist/hooks/use-overflow-items.js.map +1 -1
  519. package/dist/index.d.ts +57 -67
  520. package/dist/index.d.ts.map +1 -1
  521. package/dist/index.js +29 -59
  522. package/dist/index.js.map +1 -1
  523. package/dist/lib/utils.d.ts.map +1 -1
  524. package/dist/lib/utils.js +3 -1
  525. package/dist/lib/utils.js.map +1 -1
  526. package/dist/node_modules/react-hook-form/dist/index.esm.js +1950 -0
  527. package/dist/node_modules/react-hook-form/dist/index.esm.js.map +1 -0
  528. package/dist/patterns/element-anatomy/index.d.ts +2 -0
  529. package/dist/patterns/element-anatomy/index.d.ts.map +1 -0
  530. package/dist/patterns/element-anatomy/index.js +20 -0
  531. package/dist/patterns/element-anatomy/index.js.map +1 -0
  532. package/dist/patterns/element-anatomy/item-anatomy.d.ts +9 -5
  533. package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -1
  534. package/dist/patterns/element-anatomy/item-anatomy.js +1 -1
  535. package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -1
  536. package/dist/patterns/header-canonical/chrome-header.d.ts +13 -4
  537. package/dist/patterns/header-canonical/chrome-header.d.ts.map +1 -1
  538. package/dist/patterns/header-canonical/chrome-header.js +4 -2
  539. package/dist/patterns/header-canonical/chrome-header.js.map +1 -1
  540. package/dist/patterns/header-canonical/index.d.ts +2 -0
  541. package/dist/patterns/header-canonical/index.d.ts.map +1 -0
  542. package/dist/patterns/header-canonical/index.js +6 -0
  543. package/dist/patterns/header-canonical/index.js.map +1 -0
  544. package/dist/patterns/horizontal-overflow/index.d.ts +2 -0
  545. package/dist/patterns/horizontal-overflow/index.d.ts.map +1 -0
  546. package/dist/patterns/horizontal-overflow/index.js +14 -0
  547. package/dist/patterns/horizontal-overflow/index.js.map +1 -0
  548. package/dist/patterns/overlay-surface/index.d.ts +2 -0
  549. package/dist/patterns/overlay-surface/index.d.ts.map +1 -0
  550. package/dist/patterns/overlay-surface/index.js +8 -0
  551. package/dist/patterns/overlay-surface/index.js.map +1 -0
  552. package/dist/patterns/overlay-surface/overlay-surface.d.ts +11 -2
  553. package/dist/patterns/overlay-surface/overlay-surface.d.ts.map +1 -1
  554. package/dist/patterns/overlay-surface/overlay-surface.js +5 -2
  555. package/dist/patterns/overlay-surface/overlay-surface.js.map +1 -1
  556. package/dist/patterns/resize-handle/index.d.ts +2 -0
  557. package/dist/patterns/resize-handle/index.d.ts.map +1 -0
  558. package/dist/patterns/resize-handle/index.js +5 -0
  559. package/dist/patterns/resize-handle/index.js.map +1 -0
  560. package/dist/story-governance/category-matrix.d.ts +35 -0
  561. package/dist/story-governance/category-matrix.d.ts.map +1 -0
  562. package/dist/tokens/categorical-color.d.ts +60 -0
  563. package/dist/tokens/categorical-color.d.ts.map +1 -0
  564. package/dist/tokens/categorical-color.js +110 -0
  565. package/dist/tokens/categorical-color.js.map +1 -0
  566. package/dist/tokens/motion/motion.d.ts +1 -1
  567. package/dist/tokens/motion/motion.d.ts.map +1 -1
  568. package/dist/tokens/motion/motion.js.map +1 -1
  569. package/dist/tokens/uiSize/icon-size.d.ts +1 -2
  570. package/dist/tokens/uiSize/icon-size.d.ts.map +1 -1
  571. package/ds-canonical/commands/README.md +26 -0
  572. package/ds-canonical/commands/gov-status.md +79 -0
  573. package/ds-canonical/fork/governance.lock +222 -0
  574. package/ds-canonical/fork/hooks/block_prototype_imports.py +111 -0
  575. package/ds-canonical/fork/hooks/check_chrome_header_avatar_canonical.sh +95 -0
  576. package/ds-canonical/fork/hooks/check_consumer_app_invariants.sh +349 -0
  577. package/ds-canonical/fork/hooks/check_ds_anchor_preflight.sh +132 -0
  578. package/ds-canonical/fork/hooks/check_escape_marker_abuse.sh +140 -0
  579. package/ds-canonical/fork/hooks/check_field_family_invariants.sh +250 -0
  580. package/ds-canonical/fork/hooks/check_fork_product_quality.sh +36 -0
  581. package/ds-canonical/fork/hooks/check_item_list_gap.sh +54 -0
  582. package/ds-canonical/fork/hooks/check_layout_space_magic_numbers.sh +96 -0
  583. package/ds-canonical/fork/hooks/check_opacity_token_usage.sh +149 -0
  584. package/ds-canonical/fork/hooks/check_pattern_invariants.sh +196 -0
  585. package/ds-canonical/fork/hooks/check_sidebar_menu_button_implicit_wrap.sh +86 -0
  586. package/ds-canonical/fork/hooks/check_tabs_content_chrome_body_double_gap.sh +183 -0
  587. package/ds-canonical/fork/hooks/check_tailwind_wildcard_in_docs.sh +79 -0
  588. package/ds-canonical/fork/hooks/inject_deploy_url_after_push.sh +238 -0
  589. package/ds-canonical/fork/launchers/fork-governance-dispatcher.sh +44 -0
  590. package/ds-canonical/fork/launchers/inject_fork_governance_preamble.sh +54 -0
  591. package/ds-canonical/fork/launchers/settings-hooks.json +58 -0
  592. package/ds-canonical/fork/manifest.json +98 -0
  593. package/ds-canonical/fork/preamble.md +495 -0
  594. package/ds-canonical/fork/skills/bug-fix-rhythm/SKILL.md +183 -0
  595. package/ds-canonical/fork/skills/code-quality-audit/SKILL.md +65 -0
  596. package/ds-canonical/fork/skills/delivery-handoff/SKILL.md +229 -0
  597. package/ds-canonical/fork/skills/delivery-handoff/references/flow-diagram.md +180 -0
  598. package/ds-canonical/fork/skills/delivery-handoff/references/handoff-template.md +177 -0
  599. package/ds-canonical/fork/skills/delivery-handoff/references/inventory-checklist.md +196 -0
  600. package/ds-canonical/fork/skills/performance-audit/SKILL.md +107 -0
  601. package/ds-canonical/fork/skills/product-ui-audit/SKILL.md +232 -0
  602. package/ds-canonical/fork/skills/product-ui-audit/references/audit-checks.md +246 -0
  603. package/ds-canonical/fork/skills/product-ui-audit/references/common-misuses.md +329 -0
  604. package/ds-canonical/fork/skills/product-ui-audit/references/report-template.md +159 -0
  605. package/ds-canonical/fork/skills/propose-options/SKILL.md +177 -0
  606. package/ds-canonical/fork/skills/prototype/SKILL.md +244 -0
  607. package/ds-canonical/fork/skills/prototype/references/audit-checks.md +38 -0
  608. package/ds-canonical/fork/skills/prototype/references/benchmark-sources.md +94 -0
  609. package/ds-canonical/fork/skills/prototype/references/checkpoints.md +191 -0
  610. package/ds-canonical/fork/skills/prototype/references/evaluation-matrix.md +141 -0
  611. package/ds-canonical/fork/skills/prototype/references/ooux-template.md +198 -0
  612. package/ds-canonical/fork/skills/prototype/references/proposal-template.md +229 -0
  613. package/ds-canonical/fork/skills/scan-similar-bugs/SKILL.md +200 -0
  614. package/ds-canonical/fork/skills/ux-audit/SKILL.md +130 -0
  615. package/ds-canonical/fork/skills/visual-audit/SKILL.md +247 -0
  616. package/ds-canonical/fork/skills/visual-audit/output/.gitkeep +0 -0
  617. package/ds-canonical/fork/skills/visual-audit/references/audit-architecture.md +101 -0
  618. package/ds-canonical/fork/skills/visual-audit/references/visual-checklist.md +297 -0
  619. package/ds-canonical/fork/skills/visual-audit/references/world-class-benchmarks.md +198 -0
  620. package/ds-canonical/hooks/README.md +145 -0
  621. package/ds-canonical/hooks/_log-fire.sh +46 -0
  622. package/ds-canonical/hooks/auto_regen_ds_barrel.sh +58 -0
  623. package/ds-canonical/hooks/block_prototype_imports.py +111 -0
  624. package/ds-canonical/hooks/check_audit_post_report_validator.sh +156 -0
  625. package/ds-canonical/hooks/check_audit_sample_escape.sh +76 -0
  626. package/ds-canonical/hooks/check_benchmark_citation.sh +106 -0
  627. package/ds-canonical/hooks/check_canonical_propagation.sh +189 -0
  628. package/ds-canonical/hooks/check_chrome_header_avatar_canonical.sh +95 -0
  629. package/ds-canonical/hooks/check_codex_brief_invariants.sh +115 -0
  630. package/ds-canonical/hooks/check_codex_collab_5step.sh +108 -0
  631. package/ds-canonical/hooks/check_consumer_app_invariants.sh +349 -0
  632. package/ds-canonical/hooks/check_datatable_invariants.sh +180 -0
  633. package/ds-canonical/hooks/check_dim_count_drift.sh +72 -0
  634. package/ds-canonical/hooks/check_ds_anchor_preflight.sh +132 -0
  635. package/ds-canonical/hooks/check_escape_marker_abuse.sh +140 -0
  636. package/ds-canonical/hooks/check_field_controls_contracts.sh +137 -0
  637. package/ds-canonical/hooks/check_field_family_invariants.sh +250 -0
  638. package/ds-canonical/hooks/check_file_size_budget.sh +60 -0
  639. package/ds-canonical/hooks/check_full_story_visual_interaction_sweep.sh +71 -0
  640. package/ds-canonical/hooks/check_item_list_gap.sh +54 -0
  641. package/ds-canonical/hooks/check_layout_space_magic_numbers.sh +96 -0
  642. package/ds-canonical/hooks/check_main_branch_workbench.sh +93 -0
  643. package/ds-canonical/hooks/check_naming_and_abstraction.sh +165 -0
  644. package/ds-canonical/hooks/check_opacity_token_usage.sh +149 -0
  645. package/ds-canonical/hooks/check_orphan_ds_css.sh +66 -0
  646. package/ds-canonical/hooks/check_overlay_open_focus_escape_probe.sh +75 -0
  647. package/ds-canonical/hooks/check_pattern_invariants.sh +196 -0
  648. package/ds-canonical/hooks/check_peoplepicker_ssot_drift.sh +56 -0
  649. package/ds-canonical/hooks/check_pixel_quantified_audit.sh +53 -0
  650. package/ds-canonical/hooks/check_plugin_fork_health.sh +137 -0
  651. package/ds-canonical/hooks/check_post_main_ssot_propagate.sh +90 -0
  652. package/ds-canonical/hooks/check_propose_discipline.sh +147 -0
  653. package/ds-canonical/hooks/check_propose_pre_grep_verify.sh +70 -0
  654. package/ds-canonical/hooks/check_propose_without_benchmark.sh +63 -0
  655. package/ds-canonical/hooks/check_select_all_canonical.sh +58 -0
  656. package/ds-canonical/hooks/check_sidebar_menu_button_implicit_wrap.sh +86 -0
  657. package/ds-canonical/hooks/check_solo_workflow.sh +317 -0
  658. package/ds-canonical/hooks/check_spec_class_drift.sh +88 -0
  659. package/ds-canonical/hooks/check_story_invariants.sh +748 -0
  660. package/ds-canonical/hooks/check_storybook_addon_packaging.sh +151 -0
  661. package/ds-canonical/hooks/check_substantive_edit_approval_preflight.sh +110 -0
  662. package/ds-canonical/hooks/check_tabs_content_chrome_body_double_gap.sh +183 -0
  663. package/ds-canonical/hooks/check_tailwind_wildcard_in_docs.sh +79 -0
  664. package/ds-canonical/hooks/check_wrapper_primitive_schema_drift.sh +104 -0
  665. package/ds-canonical/hooks/chrome_header_dispatcher.sh +56 -0
  666. package/ds-canonical/hooks/enforce_home_charter.sh +44 -0
  667. package/ds-canonical/hooks/inject_deploy_url_after_push.sh +238 -0
  668. package/ds-canonical/hooks/inject_pending_self_audit.sh +248 -0
  669. package/ds-canonical/hooks/lib/_app_shell_primary_header_consistency.sh +100 -0
  670. package/ds-canonical/hooks/lib/_approval_re.sh +33 -0
  671. package/ds-canonical/hooks/lib/_chrome_header_handcraft.sh +75 -0
  672. package/ds-canonical/hooks/lib/_code_quality.sh +73 -0
  673. package/ds-canonical/hooks/lib/_cva_default_sync.sh +69 -0
  674. package/ds-canonical/hooks/lib/_governance_coverage_check.sh +49 -0
  675. package/ds-canonical/hooks/lib/_hardcoded_strings.sh +163 -0
  676. package/ds-canonical/hooks/lib/_header_with_tabs_border.sh +87 -0
  677. package/ds-canonical/hooks/lib/_layout_space_canonical.sh +56 -0
  678. package/ds-canonical/hooks/lib/_overlay_handcraft.sh +162 -0
  679. package/ds-canonical/hooks/lib/_person_data_richness.sh +42 -0
  680. package/ds-canonical/hooks/lib/_story_compile_drift.sh +48 -0
  681. package/ds-canonical/hooks/lib/_tab_lg_chrome_header_equal.sh +70 -0
  682. package/ds-canonical/hooks/lib/_token_hygiene.sh +104 -0
  683. package/ds-canonical/hooks/log_governance_fires.sh +50 -0
  684. package/ds-canonical/hooks/log_skill_invokes.sh +41 -0
  685. package/ds-canonical/hooks/post_edit_dispatcher.sh +62 -0
  686. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_addon_subdir_ship.sh +76 -0
  687. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_consumer_app_story_title.sh +81 -0
  688. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_consumer_ds_primitive_misuse.sh +120 -0
  689. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_consumer_no_ds_catalog.sh +101 -0
  690. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_consumer_story_baseline.sh +76 -0
  691. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_data_table_size_num_to_meta_width.sh +68 -0
  692. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_fork_user_plugin_install.sh +79 -0
  693. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_plugin_freshness.sh +68 -0
  694. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_propose_cite_required.sh +88 -0
  695. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_propose_plain_chinese.sh +74 -0
  696. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_storybook_addon_preset_cjs.sh +87 -0
  697. package/ds-canonical/hooks/retired/check_anatomy_section_numbering.sh +106 -0
  698. package/ds-canonical/hooks/retired/check_avatar_hovercard.sh +90 -0
  699. package/ds-canonical/hooks/retired/check_button_icon_literal.sh.retired-2026-04-28 +38 -0
  700. package/ds-canonical/hooks/retired/check_container_breathing.sh +142 -0
  701. package/ds-canonical/hooks/retired/check_governance_compliance.sh +61 -0
  702. package/ds-canonical/hooks/retired/check_icon_only_padding_formula.sh +104 -0
  703. package/ds-canonical/hooks/retired/check_item_content_primitive.sh +150 -0
  704. package/ds-canonical/hooks/retired/check_item_list_gap.sh +153 -0
  705. package/ds-canonical/hooks/retired/check_sideoffset_canonical.sh +65 -0
  706. package/ds-canonical/hooks/retired/check_spec_iteration_tag.sh +87 -0
  707. package/ds-canonical/hooks/retired/check_ssot_consultation.sh +88 -0
  708. package/ds-canonical/hooks/retired/check_sync_update.sh +20 -0
  709. package/ds-canonical/hooks/retired/check_third_party_dom_verified.sh +95 -0
  710. package/ds-canonical/hooks/retired/enforce_home_charter.sh +125 -0
  711. package/ds-canonical/hooks/retired/post_edit_canonical_interrogate.sh +109 -0
  712. package/ds-canonical/hooks/retired/pre_edit_spec_check.sh +68 -0
  713. package/ds-canonical/hooks/retired/pre_new_component_spec.sh +39 -0
  714. package/ds-canonical/hooks/retired/pre_write_subsumption_check.sh +112 -0
  715. package/ds-canonical/hooks/retired/stop_meta_self_audit.sh.retired-2026-05-13 +76 -0
  716. package/ds-canonical/hooks/retired/tests/test_check_anatomy_section_numbering.sh +14 -0
  717. package/ds-canonical/hooks/retired/tests/test_check_avatar_hovercard.sh +15 -0
  718. package/ds-canonical/hooks/retired/tests/test_check_container_breathing.sh +15 -0
  719. package/ds-canonical/hooks/retired/tests/test_check_governance_compliance.sh +15 -0
  720. package/ds-canonical/hooks/retired/tests/test_check_icon_only_padding_formula.sh +79 -0
  721. package/ds-canonical/hooks/retired/tests/test_check_item_content_primitive.sh +15 -0
  722. package/ds-canonical/hooks/retired/tests/test_check_item_list_gap.sh +163 -0
  723. package/ds-canonical/hooks/retired/tests/test_check_sideoffset_canonical.sh +15 -0
  724. package/ds-canonical/hooks/retired/tests/test_check_spec_iteration_tag.sh +15 -0
  725. package/ds-canonical/hooks/retired/tests/test_check_ssot_consultation.sh +15 -0
  726. package/ds-canonical/hooks/retired/tests/test_check_sync_update.sh +14 -0
  727. package/ds-canonical/hooks/retired/tests/test_check_third_party_dom_verified.sh +15 -0
  728. package/ds-canonical/hooks/retired/tests/test_enforce_home_charter.sh +15 -0
  729. package/ds-canonical/hooks/retired/tests/test_pre_edit_spec_check.sh +15 -0
  730. package/ds-canonical/hooks/retired/tests/test_pre_new_component_spec.sh +15 -0
  731. package/ds-canonical/hooks/retired/tests/test_pre_write_subsumption_check.sh +63 -0
  732. package/ds-canonical/hooks/session_start_governance_check.sh +310 -0
  733. package/ds-canonical/hooks/stop_passive_logging.sh +322 -0
  734. package/ds-canonical/hooks/stop_self_audit.sh +516 -0
  735. package/ds-canonical/hooks/tests/KNOWN-BROKEN.md +15 -0
  736. package/ds-canonical/hooks/tests/run-all.sh +76 -0
  737. package/ds-canonical/hooks/tests/test_auto_regen_ds_barrel.sh +180 -0
  738. package/ds-canonical/hooks/tests/test_block_prototype_imports.sh +143 -0
  739. package/ds-canonical/hooks/tests/test_check_addon_subdir_ship.sh +171 -0
  740. package/ds-canonical/hooks/tests/test_check_app_shell_primary_header_consistency.sh +196 -0
  741. package/ds-canonical/hooks/tests/test_check_audit_post_report_validator.sh +127 -0
  742. package/ds-canonical/hooks/tests/test_check_audit_sample_escape.sh +93 -0
  743. package/ds-canonical/hooks/tests/test_check_benchmark_citation.sh +115 -0
  744. package/ds-canonical/hooks/tests/test_check_canonical_propagation.sh +133 -0
  745. package/ds-canonical/hooks/tests/test_check_chrome_header_avatar_canonical.sh +198 -0
  746. package/ds-canonical/hooks/tests/test_check_chrome_header_handcraft.sh +146 -0
  747. package/ds-canonical/hooks/tests/test_check_code_quality.sh +15 -0
  748. package/ds-canonical/hooks/tests/test_check_codex_brief_invariants.sh +208 -0
  749. package/ds-canonical/hooks/tests/test_check_codex_collab_5step.sh +96 -0
  750. package/ds-canonical/hooks/tests/test_check_consumer_app_invariants.sh +12 -0
  751. package/ds-canonical/hooks/tests/test_check_consumer_app_story_title.sh +164 -0
  752. package/ds-canonical/hooks/tests/test_check_consumer_ds_primitive_misuse.sh +240 -0
  753. package/ds-canonical/hooks/tests/test_check_consumer_no_ds_catalog.sh +214 -0
  754. package/ds-canonical/hooks/tests/test_check_consumer_story_baseline.sh +202 -0
  755. package/ds-canonical/hooks/tests/test_check_cva_default_sync.sh +15 -0
  756. package/ds-canonical/hooks/tests/test_check_data_table_size_num_to_meta_width.sh +53 -0
  757. package/ds-canonical/hooks/tests/test_check_datatable_invariants.sh +122 -0
  758. package/ds-canonical/hooks/tests/test_check_dim_count_drift.sh +98 -0
  759. package/ds-canonical/hooks/tests/test_check_ds_anchor_preflight.sh +104 -0
  760. package/ds-canonical/hooks/tests/test_check_escape_marker_abuse.sh +192 -0
  761. package/ds-canonical/hooks/tests/test_check_field_controls_contracts.sh +126 -0
  762. package/ds-canonical/hooks/tests/test_check_field_family_invariants.sh +203 -0
  763. package/ds-canonical/hooks/tests/test_check_file_size_budget.sh +32 -0
  764. package/ds-canonical/hooks/tests/test_check_fork_user_plugin_install.sh +46 -0
  765. package/ds-canonical/hooks/tests/test_check_full_story_visual_interaction_sweep.sh +190 -0
  766. package/ds-canonical/hooks/tests/test_check_hardcoded_strings.sh +14 -0
  767. package/ds-canonical/hooks/tests/test_check_header_with_tabs_border.sh +110 -0
  768. package/ds-canonical/hooks/tests/test_check_item_list_gap.sh +44 -0
  769. package/ds-canonical/hooks/tests/test_check_layout_space_canonical.sh +73 -0
  770. package/ds-canonical/hooks/tests/test_check_layout_space_magic_numbers.sh +206 -0
  771. package/ds-canonical/hooks/tests/test_check_main_branch_workbench.sh +147 -0
  772. package/ds-canonical/hooks/tests/test_check_naming_and_abstraction.sh +136 -0
  773. package/ds-canonical/hooks/tests/test_check_opacity_token_usage.sh +110 -0
  774. package/ds-canonical/hooks/tests/test_check_orphan_ds_css.sh +212 -0
  775. package/ds-canonical/hooks/tests/test_check_overlay_handcraft.sh +126 -0
  776. package/ds-canonical/hooks/tests/test_check_overlay_open_focus_escape_probe.sh +191 -0
  777. package/ds-canonical/hooks/tests/test_check_pattern_invariants.sh +148 -0
  778. package/ds-canonical/hooks/tests/test_check_peoplepicker_ssot_drift.sh +108 -0
  779. package/ds-canonical/hooks/tests/test_check_person_data_richness.sh +58 -0
  780. package/ds-canonical/hooks/tests/test_check_pixel_quantified_audit.sh +142 -0
  781. package/ds-canonical/hooks/tests/test_check_plugin_fork_health.sh +9 -0
  782. package/ds-canonical/hooks/tests/test_check_propose_cite_required.sh +181 -0
  783. package/ds-canonical/hooks/tests/test_check_propose_discipline.sh +10 -0
  784. package/ds-canonical/hooks/tests/test_check_propose_plain_chinese.sh +127 -0
  785. package/ds-canonical/hooks/tests/test_check_propose_pre_grep_verify.sh +117 -0
  786. package/ds-canonical/hooks/tests/test_check_propose_without_benchmark.sh +55 -0
  787. package/ds-canonical/hooks/tests/test_check_select_all_canonical.sh +125 -0
  788. package/ds-canonical/hooks/tests/test_check_sidebar_menu_button_implicit_wrap.sh +224 -0
  789. package/ds-canonical/hooks/tests/test_check_solo_workflow.sh +201 -0
  790. package/ds-canonical/hooks/tests/test_check_spec_class_drift.sh +135 -0
  791. package/ds-canonical/hooks/tests/test_check_story_anatomy.sh.broken +197 -0
  792. package/ds-canonical/hooks/tests/test_check_story_category.sh.broken +187 -0
  793. package/ds-canonical/hooks/tests/test_check_story_compile_drift.sh +15 -0
  794. package/ds-canonical/hooks/tests/test_check_story_invariants.sh +384 -0
  795. package/ds-canonical/hooks/tests/test_check_story_name_jargon.sh.broken +53 -0
  796. package/ds-canonical/hooks/tests/test_check_story_slot_split.sh +156 -0
  797. package/ds-canonical/hooks/tests/test_check_storybook_addon_packaging.sh +10 -0
  798. package/ds-canonical/hooks/tests/test_check_storybook_addon_preset_cjs.sh +200 -0
  799. package/ds-canonical/hooks/tests/test_check_substantive_edit_approval_preflight.sh +176 -0
  800. package/ds-canonical/hooks/tests/test_check_tab_lg_chrome_header_equal.sh +141 -0
  801. package/ds-canonical/hooks/tests/test_check_tailwind_wildcard_in_docs.sh +182 -0
  802. package/ds-canonical/hooks/tests/test_check_token_hygiene.sh +21 -0
  803. package/ds-canonical/hooks/tests/test_check_wrapper_primitive_schema_drift.sh +169 -0
  804. package/ds-canonical/hooks/tests/test_enforce_home_charter.sh +77 -0
  805. package/ds-canonical/hooks/tests/test_inject_deploy_url_after_push.sh +193 -0
  806. package/ds-canonical/hooks/tests/test_inject_pending_self_audit.sh +125 -0
  807. package/ds-canonical/hooks/tests/test_log_governance_fires.sh +10 -0
  808. package/ds-canonical/hooks/tests/test_log_skill_invokes.sh +7 -0
  809. package/ds-canonical/hooks/tests/test_post_edit_dispatcher.sh +108 -0
  810. package/ds-canonical/hooks/tests/test_session_start_governance_check.sh +154 -0
  811. package/ds-canonical/hooks/tests/test_stop_capture_metrics.sh +95 -0
  812. package/ds-canonical/hooks/tests/test_stop_governance_drift_check.sh.broken +125 -0
  813. package/ds-canonical/hooks/tests/test_stop_harvest_corrections.sh +10 -0
  814. package/ds-canonical/hooks/tests/test_stop_passive_logging.sh +100 -0
  815. package/ds-canonical/hooks/tests/test_stop_self_audit.sh +98 -0
  816. package/ds-canonical/hooks/tests/test_stop_tsc_sanity.sh +10 -0
  817. package/ds-canonical/references/README.md +46 -0
  818. package/ds-canonical/references/audit-coverage-vs-24-checklist.md +74 -0
  819. package/ds-canonical/references/build-ui-canonicals.md +72 -0
  820. package/ds-canonical/references/composition-fidelity.md +47 -0
  821. package/ds-canonical/references/cva-patterns.md +41 -0
  822. package/ds-canonical/references/drag-canonical.md +331 -0
  823. package/ds-canonical/references/item-anatomy-recipe.md +225 -0
  824. package/ds-canonical/references/naming-conventions.md +57 -0
  825. package/ds-canonical/references/principle-dim-map.json +513 -0
  826. package/ds-canonical/references/props-naming.md +59 -0
  827. package/ds-canonical/references/scenario-definition.md +146 -0
  828. package/ds-canonical/references/spec-rules.md +58 -0
  829. package/ds-canonical/references/ssot-consultation.md +63 -0
  830. package/ds-canonical/references/ssot-index.md +40 -0
  831. package/ds-canonical/references/story-baseline-registry.json +107 -0
  832. package/ds-canonical/references/structural-token-retention.md +42 -0
  833. package/ds-canonical/references/tailwind-gotchas.md +87 -0
  834. package/ds-canonical/references/ui-dev-rules.md +81 -0
  835. package/ds-canonical/rules/README.md +34 -0
  836. package/ds-canonical/rules/meta-patterns.md +87 -0
  837. package/ds-canonical/rules/self-verify.md +56 -0
  838. package/ds-canonical/rules/spec-rules.md +25 -0
  839. package/ds-canonical/rules/story-rules.md +67 -0
  840. package/ds-canonical/rules/ui-development.md +92 -0
  841. package/ds-canonical/skills/README.md +88 -0
  842. package/ds-canonical/skills/bug-fix-rhythm/SKILL.md +181 -0
  843. package/ds-canonical/skills/code-quality-audit/SKILL.md +63 -0
  844. package/ds-canonical/skills/codex-collab/SKILL.md +249 -0
  845. package/ds-canonical/skills/codex-collab/references/brief-template.md +48 -0
  846. package/ds-canonical/skills/codex-collab/references/transport.md +58 -0
  847. package/ds-canonical/skills/codify-corrections/SKILL.md +184 -0
  848. package/ds-canonical/skills/codify-principle/SKILL.md +151 -0
  849. package/ds-canonical/skills/component-quality-gate/SKILL.md +102 -0
  850. package/ds-canonical/skills/component-quality-gate/references/checklist.md +79 -0
  851. package/ds-canonical/skills/deep-audit-cross-codex/SKILL.md +254 -0
  852. package/ds-canonical/skills/deep-audit-cross-codex/references/phase-a-workflow.md +123 -0
  853. package/ds-canonical/skills/deep-audit-cross-codex/references/phase-b-codex-brief.md +186 -0
  854. package/ds-canonical/skills/deep-audit-cross-codex/references/skill-relationships-antipatterns-benchmarks.md +30 -0
  855. package/ds-canonical/skills/deep-audit-cross-codex/references/triage-rubric.md +69 -0
  856. package/ds-canonical/skills/deep-audit-cross-codex/references/upstream-directives-r-mapping.md +33 -0
  857. package/ds-canonical/skills/delivery-handoff/SKILL.md +229 -0
  858. package/ds-canonical/skills/delivery-handoff/references/flow-diagram.md +180 -0
  859. package/ds-canonical/skills/delivery-handoff/references/handoff-template.md +177 -0
  860. package/ds-canonical/skills/delivery-handoff/references/inventory-checklist.md +196 -0
  861. package/ds-canonical/skills/design-system-audit/SKILL.md +386 -0
  862. package/ds-canonical/skills/design-system-audit/references/audit-prompts.md +1325 -0
  863. package/ds-canonical/skills/design-system-audit/references/checkpoints.md +240 -0
  864. package/ds-canonical/skills/design-system-audit/references/historical-bugs.md +240 -0
  865. package/ds-canonical/skills/design-system-audit/references/principle-audit-protocol.md +378 -0
  866. package/ds-canonical/skills/design-system-audit/references/rule-placement.md +175 -0
  867. package/ds-canonical/skills/ensure-canonical/SKILL.md +196 -0
  868. package/ds-canonical/skills/governance-health/SKILL.md +147 -0
  869. package/ds-canonical/skills/knowledge-prune/SKILL.md +250 -0
  870. package/ds-canonical/skills/knowledge-prune/references/phase-z-cross-repo-ssot-propagation.md +11 -0
  871. package/ds-canonical/skills/knowledge-prune/references/prune-dimensions-d5-d10.md +55 -0
  872. package/ds-canonical/skills/knowledge-prune/references/world-class-prune-alignment.md +7 -0
  873. package/ds-canonical/skills/new-component/SKILL.md +170 -0
  874. package/ds-canonical/skills/new-component/references/new-component-checklist.md +85 -0
  875. package/ds-canonical/skills/performance-audit/SKILL.md +107 -0
  876. package/ds-canonical/skills/product-ui-audit/SKILL.md +230 -0
  877. package/ds-canonical/skills/product-ui-audit/references/audit-checks.md +246 -0
  878. package/ds-canonical/skills/product-ui-audit/references/common-misuses.md +329 -0
  879. package/ds-canonical/skills/product-ui-audit/references/report-template.md +159 -0
  880. package/ds-canonical/skills/propose-options/SKILL.md +177 -0
  881. package/ds-canonical/skills/prototype/SKILL.md +244 -0
  882. package/ds-canonical/skills/prototype/references/audit-checks.md +37 -0
  883. package/ds-canonical/skills/prototype/references/benchmark-sources.md +94 -0
  884. package/ds-canonical/skills/prototype/references/checkpoints.md +191 -0
  885. package/ds-canonical/skills/prototype/references/evaluation-matrix.md +141 -0
  886. package/ds-canonical/skills/prototype/references/ooux-template.md +198 -0
  887. package/ds-canonical/skills/prototype/references/proposal-template.md +229 -0
  888. package/ds-canonical/skills/scan-similar-bugs/SKILL.md +198 -0
  889. package/ds-canonical/skills/story-auto-compile-migrate/SKILL.md +159 -0
  890. package/ds-canonical/skills/story-writing/SKILL.md +122 -0
  891. package/ds-canonical/skills/story-writing/references/anatomy-standard.md +217 -0
  892. package/ds-canonical/skills/story-writing/references/category-templates.md +174 -0
  893. package/ds-canonical/skills/story-writing/references/example-selection.md +70 -0
  894. package/ds-canonical/skills/story-writing/references/self-check.md +20 -0
  895. package/ds-canonical/skills/ux-audit/SKILL.md +130 -0
  896. package/ds-canonical/skills/visual-audit/SKILL.md +245 -0
  897. package/ds-canonical/skills/visual-audit/output/.gitkeep +0 -0
  898. package/ds-canonical/skills/visual-audit/references/audit-architecture.md +100 -0
  899. package/ds-canonical/skills/visual-audit/references/visual-checklist.md +297 -0
  900. package/ds-canonical/skills/visual-audit/references/world-class-benchmarks.md +198 -0
  901. package/ds-canonical/templates/_README.md +23 -0
  902. package/ds-canonical/templates/dashboard-app.tsx +161 -0
  903. package/ds-story-manifest.json +1684 -0
  904. package/llms-full.txt +414 -0
  905. package/llms.txt +70 -0
  906. package/package.json +31 -8
  907. package/src/components/Accordion/accordion.anatomy.stories.tsx +496 -0
  908. package/src/components/Accordion/accordion.principles.stories.tsx +360 -0
  909. package/src/components/Accordion/accordion.spec.md +131 -0
  910. package/src/components/Accordion/accordion.stories.tsx +190 -0
  911. package/src/components/Accordion/accordion.tsx +4 -1
  912. package/src/components/Accordion/index.ts +5 -0
  913. package/src/components/Alert/alert.anatomy.stories.tsx +238 -0
  914. package/src/components/Alert/alert.principles.stories.tsx +220 -0
  915. package/src/components/Alert/alert.spec.md +202 -0
  916. package/src/components/Alert/alert.stories.tsx +139 -0
  917. package/src/components/Alert/alert.tsx +9 -6
  918. package/src/components/Alert/index.ts +5 -0
  919. package/src/components/AppShell/_demo-helpers.tsx +87 -11
  920. package/src/components/AppShell/app-shell.anatomy.stories.tsx +176 -0
  921. package/src/components/AppShell/app-shell.principles.stories.tsx +140 -0
  922. package/src/components/AppShell/app-shell.spec.md +357 -0
  923. package/src/components/AppShell/app-shell.stories.tsx +442 -0
  924. package/src/components/AppShell/app-shell.tsx +15 -9
  925. package/src/components/AppShell/index.ts +5 -0
  926. package/src/components/AspectRatio/aspect-ratio.anatomy.stories.tsx +208 -0
  927. package/src/components/AspectRatio/aspect-ratio.principles.stories.tsx +303 -0
  928. package/src/components/AspectRatio/aspect-ratio.spec.md +148 -0
  929. package/src/components/AspectRatio/aspect-ratio.stories.tsx +170 -0
  930. package/src/components/AspectRatio/aspect-ratio.tsx +4 -2
  931. package/src/components/AspectRatio/index.ts +5 -0
  932. package/src/components/Avatar/avatar.anatomy.stories.tsx +701 -0
  933. package/src/components/Avatar/avatar.principles.stories.tsx +245 -0
  934. package/src/components/Avatar/avatar.spec.md +312 -0
  935. package/src/components/Avatar/avatar.stories.tsx +135 -0
  936. package/src/components/Avatar/avatar.tsx +45 -46
  937. package/src/components/Avatar/index.ts +5 -0
  938. package/src/components/Badge/badge.anatomy.stories.tsx +591 -0
  939. package/src/components/Badge/badge.principles.stories.tsx +391 -0
  940. package/src/components/Badge/badge.spec.md +398 -0
  941. package/src/components/Badge/badge.stories.tsx +80 -0
  942. package/src/components/Badge/badge.tsx +34 -13
  943. package/src/components/Badge/index.ts +5 -0
  944. package/src/components/Breadcrumb/breadcrumb.anatomy.stories.tsx +458 -0
  945. package/src/components/Breadcrumb/breadcrumb.principles.stories.tsx +343 -0
  946. package/src/components/Breadcrumb/breadcrumb.spec.md +268 -0
  947. package/src/components/Breadcrumb/breadcrumb.stories.tsx +307 -0
  948. package/src/components/Breadcrumb/breadcrumb.tsx +2 -2
  949. package/src/components/Breadcrumb/index.ts +5 -0
  950. package/src/components/BulkActionBar/bulk-action-bar.anatomy.stories.tsx +224 -0
  951. package/src/components/BulkActionBar/bulk-action-bar.principles.stories.tsx +242 -0
  952. package/src/components/BulkActionBar/bulk-action-bar.spec.md +226 -0
  953. package/src/components/BulkActionBar/bulk-action-bar.stories.tsx +136 -0
  954. package/src/components/BulkActionBar/bulk-action-bar.tsx +13 -11
  955. package/src/components/BulkActionBar/index.ts +5 -0
  956. package/src/components/Button/button.anatomy.stories.tsx +710 -0
  957. package/src/components/Button/button.principles.stories.tsx +370 -0
  958. package/src/components/Button/button.spec.md +463 -0
  959. package/src/components/Button/button.stories.tsx +362 -0
  960. package/src/components/Button/button.tsx +25 -28
  961. package/src/components/Button/index.ts +5 -0
  962. package/src/components/Calendar/calendar.anatomy.stories.tsx +218 -0
  963. package/src/components/Calendar/calendar.principles.stories.tsx +143 -0
  964. package/src/components/Calendar/calendar.spec.md +264 -0
  965. package/src/components/Calendar/calendar.stories.tsx +88 -0
  966. package/src/components/Calendar/calendar.tsx +54 -40
  967. package/src/components/Calendar/index.ts +5 -0
  968. package/src/components/Carousel/carousel.anatomy.stories.tsx +516 -0
  969. package/src/components/Carousel/carousel.principles.stories.tsx +330 -0
  970. package/src/components/Carousel/carousel.spec.md +273 -0
  971. package/src/components/Carousel/carousel.stories.tsx +121 -0
  972. package/src/components/Carousel/carousel.tsx +26 -7
  973. package/src/components/Carousel/index.ts +5 -0
  974. package/src/components/Chart/chart.anatomy.stories.tsx +307 -0
  975. package/src/components/Chart/chart.principles.stories.tsx +436 -0
  976. package/src/components/Chart/chart.spec.md +174 -0
  977. package/src/components/Chart/chart.stories.tsx +268 -0
  978. package/src/components/Chart/chart.tsx +5 -2
  979. package/src/components/Chart/index.ts +5 -0
  980. package/src/components/Checkbox/checkbox-group.tsx +2 -1
  981. package/src/components/Checkbox/checkbox.anatomy.stories.tsx +626 -0
  982. package/src/components/Checkbox/checkbox.principles.stories.tsx +216 -0
  983. package/src/components/Checkbox/checkbox.spec.md +372 -0
  984. package/src/components/Checkbox/checkbox.stories.tsx +114 -0
  985. package/src/components/Checkbox/checkbox.tsx +80 -22
  986. package/src/components/Checkbox/index.ts +5 -0
  987. package/src/components/Chip/chip.anatomy.stories.tsx +422 -0
  988. package/src/components/Chip/chip.principles.stories.tsx +228 -0
  989. package/src/components/Chip/chip.spec.md +237 -0
  990. package/src/components/Chip/chip.stories.tsx +88 -0
  991. package/src/components/Chip/chip.tsx +6 -6
  992. package/src/components/Chip/index.ts +5 -0
  993. package/src/components/CircularProgress/circular-progress.anatomy.stories.tsx +176 -0
  994. package/src/components/CircularProgress/circular-progress.principles.stories.tsx +258 -0
  995. package/src/components/CircularProgress/circular-progress.spec.md +267 -0
  996. package/src/components/CircularProgress/circular-progress.stories.tsx +153 -0
  997. package/src/components/CircularProgress/circular-progress.tsx +4 -5
  998. package/src/components/CircularProgress/index.ts +5 -0
  999. package/src/components/Coachmark/coachmark-story-helpers.tsx +39 -0
  1000. package/src/components/Coachmark/coachmark.anatomy.stories.tsx +356 -0
  1001. package/src/components/Coachmark/coachmark.principles.stories.tsx +355 -0
  1002. package/src/components/Coachmark/coachmark.spec.md +238 -0
  1003. package/src/components/Coachmark/coachmark.stories.tsx +214 -0
  1004. package/src/components/Coachmark/coachmark.tsx +16 -7
  1005. package/src/components/Coachmark/index.ts +5 -0
  1006. package/src/components/Combobox/combobox.anatomy.stories.tsx +919 -0
  1007. package/src/components/Combobox/combobox.principles.stories.tsx +239 -0
  1008. package/src/components/Combobox/combobox.spec.md +202 -0
  1009. package/src/components/Combobox/combobox.stories.tsx +184 -0
  1010. package/src/components/Combobox/combobox.tsx +86 -39
  1011. package/src/components/Combobox/index.ts +5 -0
  1012. package/src/components/Command/command.anatomy.stories.tsx +107 -0
  1013. package/src/components/Command/command.principles.stories.tsx +88 -0
  1014. package/src/components/Command/command.spec.md +181 -0
  1015. package/src/components/Command/command.stories.tsx +280 -0
  1016. package/src/components/Command/command.tsx +13 -8
  1017. package/src/components/Command/index.ts +5 -0
  1018. package/src/components/DataTable/cell-registry.tsx +19 -6
  1019. package/src/components/DataTable/data-table-filter-panel.tsx +8 -8
  1020. package/src/components/DataTable/data-table-sort-manager.tsx +4 -4
  1021. package/src/components/DataTable/data-table.anatomy.stories.tsx +519 -0
  1022. package/src/components/DataTable/data-table.css +1 -1
  1023. package/src/components/DataTable/data-table.principles.stories.tsx +265 -0
  1024. package/src/components/DataTable/data-table.spec.md +540 -0
  1025. package/src/components/DataTable/data-table.stories.tsx +1941 -0
  1026. package/src/components/DataTable/data-table.tsx +121 -53
  1027. package/src/components/DataTable/filter-operators.spec.md +267 -0
  1028. package/src/components/DataTable/filter-operators.ts +1 -1
  1029. package/src/components/DataTable/filter-tree.ts +2 -2
  1030. package/src/components/DataTable/index.ts +5 -0
  1031. package/src/components/DateGrid/date-grid.anatomy.stories.tsx +583 -0
  1032. package/src/components/DateGrid/date-grid.principles.stories.tsx +338 -0
  1033. package/src/components/DateGrid/date-grid.spec.md +218 -0
  1034. package/src/components/DateGrid/date-grid.stories.tsx +195 -0
  1035. package/src/components/DateGrid/date-grid.tsx +22 -18
  1036. package/src/components/DateGrid/index.ts +5 -0
  1037. package/src/components/DatePicker/date-picker.anatomy.stories.tsx +952 -0
  1038. package/src/components/DatePicker/date-picker.principles.stories.tsx +205 -0
  1039. package/src/components/DatePicker/date-picker.spec.md +337 -0
  1040. package/src/components/DatePicker/date-picker.stories.tsx +323 -0
  1041. package/src/components/DatePicker/date-picker.tsx +46 -22
  1042. package/src/components/DatePicker/index.ts +5 -0
  1043. package/src/components/DescriptionList/description-list.anatomy.stories.tsx +252 -0
  1044. package/src/components/DescriptionList/description-list.principles.stories.tsx +309 -0
  1045. package/src/components/DescriptionList/description-list.spec.md +220 -0
  1046. package/src/components/DescriptionList/description-list.stories.tsx +112 -0
  1047. package/src/components/DescriptionList/description-list.tsx +3 -3
  1048. package/src/components/DescriptionList/index.ts +5 -0
  1049. package/src/components/Dialog/dialog.anatomy.stories.tsx +484 -0
  1050. package/src/components/Dialog/dialog.principles.stories.tsx +313 -0
  1051. package/src/components/Dialog/dialog.spec.md +216 -0
  1052. package/src/components/Dialog/dialog.stories.tsx +483 -0
  1053. package/src/components/Dialog/dialog.tsx +9 -9
  1054. package/src/components/Dialog/index.ts +5 -0
  1055. package/src/components/DropdownMenu/dropdown-menu.anatomy.stories.tsx +969 -0
  1056. package/src/components/DropdownMenu/dropdown-menu.principles.stories.tsx +339 -0
  1057. package/src/components/DropdownMenu/dropdown-menu.spec.md +260 -0
  1058. package/src/components/DropdownMenu/dropdown-menu.stories.tsx +286 -0
  1059. package/src/components/DropdownMenu/dropdown-menu.tsx +29 -7
  1060. package/src/components/DropdownMenu/index.ts +5 -0
  1061. package/src/components/Empty/empty.anatomy.stories.tsx +275 -0
  1062. package/src/components/Empty/empty.principles.stories.tsx +314 -0
  1063. package/src/components/Empty/empty.spec.md +216 -0
  1064. package/src/components/Empty/empty.stories.tsx +80 -0
  1065. package/src/components/Empty/empty.tsx +16 -7
  1066. package/src/components/Empty/index.ts +5 -0
  1067. package/src/components/Field/field-context.ts +98 -0
  1068. package/src/components/Field/field-controls.spec.md +382 -0
  1069. package/src/components/Field/field-types.ts +1 -1
  1070. package/src/components/Field/field-wrapper.tsx +6 -6
  1071. package/src/components/Field/field.anatomy.stories.tsx +544 -0
  1072. package/src/components/Field/field.principles.stories.tsx +278 -0
  1073. package/src/components/Field/field.spec.md +460 -0
  1074. package/src/components/Field/field.stories.tsx +716 -0
  1075. package/src/components/Field/field.tsx +12 -5
  1076. package/src/components/Field/form-validation.spec.md +172 -0
  1077. package/src/components/Field/index.ts +5 -0
  1078. package/src/components/Field/use-form-validation.ts +242 -0
  1079. package/src/components/FieldControlGroup/field-control-group.anatomy.stories.tsx +118 -0
  1080. package/src/components/FieldControlGroup/field-control-group.principles.stories.tsx +121 -0
  1081. package/src/components/FieldControlGroup/field-control-group.spec.md +195 -0
  1082. package/src/components/FieldControlGroup/field-control-group.stories.tsx +161 -0
  1083. package/src/components/FieldControlGroup/field-control-group.tsx +9 -8
  1084. package/src/components/FieldControlGroup/index.ts +5 -0
  1085. package/src/components/FileItem/file-item.anatomy.stories.tsx +344 -0
  1086. package/src/components/FileItem/file-item.principles.stories.tsx +276 -0
  1087. package/src/components/FileItem/file-item.spec.md +491 -0
  1088. package/src/components/FileItem/file-item.stories.tsx +265 -0
  1089. package/src/components/FileItem/file-item.tsx +37 -13
  1090. package/src/components/FileItem/index.ts +5 -0
  1091. package/src/components/FileUpload/file-upload.anatomy.stories.tsx +446 -0
  1092. package/src/components/FileUpload/file-upload.principles.stories.tsx +312 -0
  1093. package/src/components/FileUpload/file-upload.spec.md +163 -0
  1094. package/src/components/FileUpload/file-upload.stories.tsx +167 -0
  1095. package/src/components/FileUpload/file-upload.tsx +78 -27
  1096. package/src/components/FileUpload/index.ts +5 -0
  1097. package/src/components/FileViewer/file-viewer.anatomy.stories.tsx +1127 -0
  1098. package/src/components/FileViewer/file-viewer.principles.stories.tsx +636 -0
  1099. package/src/components/FileViewer/file-viewer.spec.md +368 -0
  1100. package/src/components/FileViewer/file-viewer.stories.tsx +407 -0
  1101. package/src/components/FileViewer/file-viewer.tsx +58 -28
  1102. package/src/components/FileViewer/index.ts +5 -0
  1103. package/src/components/HoverCard/hover-card.anatomy.stories.tsx +145 -0
  1104. package/src/components/HoverCard/hover-card.principles.stories.tsx +222 -0
  1105. package/src/components/HoverCard/hover-card.spec.md +167 -0
  1106. package/src/components/HoverCard/hover-card.stories.tsx +304 -0
  1107. package/src/components/HoverCard/hover-card.tsx +15 -4
  1108. package/src/components/HoverCard/index.ts +5 -0
  1109. package/src/components/Input/index.ts +5 -0
  1110. package/src/components/Input/input.anatomy.stories.tsx +763 -0
  1111. package/src/components/Input/input.principles.stories.tsx +265 -0
  1112. package/src/components/Input/input.spec.md +207 -0
  1113. package/src/components/Input/input.stories.tsx +133 -0
  1114. package/src/components/Input/input.tsx +17 -14
  1115. package/src/components/LinkInput/index.ts +5 -0
  1116. package/src/components/LinkInput/link-input.anatomy.stories.tsx +746 -0
  1117. package/src/components/LinkInput/link-input.principles.stories.tsx +182 -0
  1118. package/src/components/LinkInput/link-input.spec.md +144 -0
  1119. package/src/components/LinkInput/link-input.stories.tsx +132 -0
  1120. package/src/components/LinkInput/link-input.tsx +9 -8
  1121. package/src/components/Menu/index.ts +5 -0
  1122. package/src/components/Menu/menu-item.anatomy.stories.tsx +780 -0
  1123. package/src/components/Menu/menu-item.principles.stories.tsx +81 -0
  1124. package/src/components/Menu/menu-item.spec.md +304 -0
  1125. package/src/components/Menu/menu-item.stories.tsx +214 -0
  1126. package/src/components/Menu/menu-item.tsx +8 -3
  1127. package/src/components/Notice/index.ts +5 -0
  1128. package/src/components/Notice/notice.anatomy.stories.tsx +610 -0
  1129. package/src/components/Notice/notice.principles.stories.tsx +102 -0
  1130. package/src/components/Notice/notice.spec.md +158 -0
  1131. package/src/components/Notice/notice.stories.tsx +257 -0
  1132. package/src/components/Notice/notice.tsx +26 -10
  1133. package/src/components/NumberInput/index.ts +5 -0
  1134. package/src/components/NumberInput/number-input.anatomy.stories.tsx +787 -0
  1135. package/src/components/NumberInput/number-input.principles.stories.tsx +199 -0
  1136. package/src/components/NumberInput/number-input.spec.md +144 -0
  1137. package/src/components/NumberInput/number-input.stories.tsx +142 -0
  1138. package/src/components/NumberInput/number-input.tsx +9 -10
  1139. package/src/components/OverflowIndicator/index.ts +5 -0
  1140. package/src/components/OverflowIndicator/overflow-indicator.anatomy.stories.tsx +549 -0
  1141. package/src/components/OverflowIndicator/overflow-indicator.principles.stories.tsx +77 -0
  1142. package/src/components/OverflowIndicator/overflow-indicator.spec.md +127 -0
  1143. package/src/components/OverflowIndicator/overflow-indicator.stories.tsx +238 -0
  1144. package/src/components/OverflowIndicator/overflow-indicator.tsx +19 -6
  1145. package/src/components/PeoplePicker/index.ts +5 -0
  1146. package/src/components/PeoplePicker/people-picker-helpers.ts +5 -5
  1147. package/src/components/PeoplePicker/people-picker.anatomy.stories.tsx +427 -0
  1148. package/src/components/PeoplePicker/people-picker.principles.stories.tsx +192 -0
  1149. package/src/components/PeoplePicker/people-picker.spec.md +292 -0
  1150. package/src/components/PeoplePicker/people-picker.stories.tsx +162 -0
  1151. package/src/components/PeoplePicker/people-picker.tsx +31 -22
  1152. package/src/components/PeoplePicker/person-display.tsx +30 -29
  1153. package/src/components/Popover/index.ts +5 -0
  1154. package/src/components/Popover/popover.anatomy.stories.tsx +279 -0
  1155. package/src/components/Popover/popover.principles.stories.tsx +295 -0
  1156. package/src/components/Popover/popover.spec.md +209 -0
  1157. package/src/components/Popover/popover.stories.tsx +116 -0
  1158. package/src/components/Popover/popover.tsx +17 -14
  1159. package/src/components/ProfileCard/index.ts +5 -0
  1160. package/src/components/ProfileCard/profile-card.anatomy.stories.tsx +504 -0
  1161. package/src/components/ProfileCard/profile-card.principles.stories.tsx +225 -0
  1162. package/src/components/ProfileCard/profile-card.spec.md +191 -0
  1163. package/src/components/ProfileCard/profile-card.stories.tsx +53 -0
  1164. package/src/components/{NameCard/name-card.tsx → ProfileCard/profile-card.tsx} +36 -30
  1165. package/src/components/ProgressBar/index.ts +5 -0
  1166. package/src/components/ProgressBar/progress-bar.anatomy.stories.tsx +438 -0
  1167. package/src/components/ProgressBar/progress-bar.principles.stories.tsx +339 -0
  1168. package/src/components/ProgressBar/progress-bar.spec.md +240 -0
  1169. package/src/components/ProgressBar/progress-bar.stories.tsx +119 -0
  1170. package/src/components/ProgressBar/progress-bar.tsx +4 -4
  1171. package/src/components/RadioGroup/index.ts +5 -0
  1172. package/src/components/RadioGroup/radio-group.anatomy.stories.tsx +681 -0
  1173. package/src/components/RadioGroup/radio-group.principles.stories.tsx +163 -0
  1174. package/src/components/RadioGroup/radio-group.spec.md +149 -0
  1175. package/src/components/RadioGroup/radio-group.stories.tsx +101 -0
  1176. package/src/components/RadioGroup/radio-group.tsx +114 -57
  1177. package/src/components/Rating/index.ts +5 -0
  1178. package/src/components/Rating/rating.anatomy.stories.tsx +495 -0
  1179. package/src/components/Rating/rating.principles.stories.tsx +296 -0
  1180. package/src/components/Rating/rating.spec.md +214 -0
  1181. package/src/components/Rating/rating.stories.tsx +133 -0
  1182. package/src/components/Rating/rating.tsx +29 -14
  1183. package/src/components/ScrollArea/index.ts +5 -0
  1184. package/src/components/ScrollArea/scroll-area.anatomy.stories.tsx +451 -0
  1185. package/src/components/ScrollArea/scroll-area.principles.stories.tsx +331 -0
  1186. package/src/components/ScrollArea/scroll-area.spec.md +143 -0
  1187. package/src/components/ScrollArea/scroll-area.stories.tsx +243 -0
  1188. package/src/components/ScrollArea/scroll-area.tsx +2 -2
  1189. package/src/components/SegmentedControl/index.ts +5 -0
  1190. package/src/components/SegmentedControl/segmented-control.anatomy.stories.tsx +295 -0
  1191. package/src/components/SegmentedControl/segmented-control.principles.stories.tsx +281 -0
  1192. package/src/components/SegmentedControl/segmented-control.spec.md +297 -0
  1193. package/src/components/SegmentedControl/segmented-control.stories.tsx +33 -0
  1194. package/src/components/SegmentedControl/segmented-control.tsx +9 -10
  1195. package/src/components/Select/index.ts +5 -0
  1196. package/src/components/Select/select.anatomy.stories.tsx +828 -0
  1197. package/src/components/Select/select.principles.stories.tsx +311 -0
  1198. package/src/components/Select/select.spec.md +337 -0
  1199. package/src/components/Select/select.stories.tsx +198 -0
  1200. package/src/components/Select/select.tsx +37 -16
  1201. package/src/components/SelectMenu/index.ts +5 -0
  1202. package/src/components/SelectMenu/select-menu.anatomy.stories.tsx +812 -0
  1203. package/src/components/SelectMenu/select-menu.principles.stories.tsx +107 -0
  1204. package/src/components/SelectMenu/select-menu.spec.md +229 -0
  1205. package/src/components/SelectMenu/select-menu.stories.tsx +155 -0
  1206. package/src/components/SelectMenu/select-menu.tsx +34 -9
  1207. package/src/components/SelectionControl/index.ts +5 -0
  1208. package/src/components/SelectionControl/selection-item.anatomy.stories.tsx +571 -0
  1209. package/src/components/SelectionControl/selection-item.principles.stories.tsx +77 -0
  1210. package/src/components/SelectionControl/selection-item.spec.md +141 -0
  1211. package/src/components/SelectionControl/selection-item.stories.tsx +137 -0
  1212. package/src/components/SelectionControl/selection-item.tsx +8 -2
  1213. package/src/components/Separator/index.ts +5 -0
  1214. package/src/components/Separator/separator.anatomy.stories.tsx +125 -0
  1215. package/src/components/Separator/separator.principles.stories.tsx +141 -0
  1216. package/src/components/Separator/separator.spec.md +115 -0
  1217. package/src/components/Separator/separator.stories.tsx +127 -0
  1218. package/src/components/Separator/separator.tsx +2 -2
  1219. package/src/components/Sheet/index.ts +5 -0
  1220. package/src/components/Sheet/sheet.anatomy.stories.tsx +269 -0
  1221. package/src/components/Sheet/sheet.principles.stories.tsx +351 -0
  1222. package/src/components/Sheet/sheet.spec.md +146 -0
  1223. package/src/components/Sheet/sheet.stories.tsx +168 -0
  1224. package/src/components/Sheet/sheet.tsx +7 -6
  1225. package/src/components/Sidebar/index.ts +5 -0
  1226. package/src/components/Sidebar/sidebar.anatomy.stories.tsx +772 -0
  1227. package/src/components/Sidebar/sidebar.principles.stories.tsx +505 -0
  1228. package/src/components/Sidebar/sidebar.spec.md +724 -0
  1229. package/src/components/Sidebar/sidebar.stories.tsx +498 -0
  1230. package/src/components/Sidebar/sidebar.tsx +20 -9
  1231. package/src/components/Skeleton/index.ts +5 -0
  1232. package/src/components/Skeleton/skeleton.anatomy.stories.tsx +145 -0
  1233. package/src/components/Skeleton/skeleton.principles.stories.tsx +234 -0
  1234. package/src/components/Skeleton/skeleton.spec.md +106 -0
  1235. package/src/components/Skeleton/skeleton.stories.tsx +137 -0
  1236. package/src/components/Skeleton/skeleton.tsx +1 -1
  1237. package/src/components/Slider/index.ts +5 -0
  1238. package/src/components/Slider/slider.anatomy.stories.tsx +236 -0
  1239. package/src/components/Slider/slider.principles.stories.tsx +250 -0
  1240. package/src/components/Slider/slider.spec.md +358 -0
  1241. package/src/components/Slider/slider.stories.tsx +99 -0
  1242. package/src/components/Slider/slider.tsx +54 -16
  1243. package/src/components/Steps/index.ts +5 -0
  1244. package/src/components/Steps/steps.anatomy.stories.tsx +448 -0
  1245. package/src/components/Steps/steps.principles.stories.tsx +300 -0
  1246. package/src/components/Steps/steps.spec.md +479 -0
  1247. package/src/components/Steps/steps.stories.tsx +335 -0
  1248. package/src/components/Steps/steps.tsx +56 -26
  1249. package/src/components/Switch/index.ts +5 -0
  1250. package/src/components/Switch/switch.anatomy.stories.tsx +227 -0
  1251. package/src/components/Switch/switch.principles.stories.tsx +174 -0
  1252. package/src/components/Switch/switch.spec.md +238 -0
  1253. package/src/components/Switch/switch.stories.tsx +107 -0
  1254. package/src/components/Switch/switch.tsx +69 -32
  1255. package/src/components/Tabs/index.ts +5 -0
  1256. package/src/components/Tabs/tabs.anatomy.stories.tsx +414 -0
  1257. package/src/components/Tabs/tabs.principles.stories.tsx +257 -0
  1258. package/src/components/Tabs/tabs.spec.md +331 -0
  1259. package/src/components/Tabs/tabs.stories.tsx +155 -0
  1260. package/src/components/Tabs/tabs.tsx +17 -10
  1261. package/src/components/Tag/index.ts +5 -0
  1262. package/src/components/Tag/tag.anatomy.stories.tsx +664 -0
  1263. package/src/components/Tag/tag.principles.stories.tsx +270 -0
  1264. package/src/components/Tag/tag.spec.md +324 -0
  1265. package/src/components/Tag/tag.stories.tsx +69 -0
  1266. package/src/components/Tag/tag.tsx +55 -57
  1267. package/src/components/Textarea/index.ts +5 -0
  1268. package/src/components/Textarea/textarea.anatomy.stories.tsx +304 -0
  1269. package/src/components/Textarea/textarea.principles.stories.tsx +175 -0
  1270. package/src/components/Textarea/textarea.spec.md +162 -0
  1271. package/src/components/Textarea/textarea.stories.tsx +53 -0
  1272. package/src/components/Textarea/textarea.tsx +20 -18
  1273. package/src/components/TimePicker/index.ts +5 -0
  1274. package/src/components/TimePicker/time-columns.tsx +8 -1
  1275. package/src/components/TimePicker/time-picker.anatomy.stories.tsx +281 -0
  1276. package/src/components/TimePicker/time-picker.principles.stories.tsx +140 -0
  1277. package/src/components/TimePicker/time-picker.spec.md +290 -0
  1278. package/src/components/TimePicker/time-picker.stories.tsx +193 -0
  1279. package/src/components/TimePicker/time-picker.tsx +41 -23
  1280. package/src/components/Toast/index.ts +5 -0
  1281. package/src/components/Toast/toast.anatomy.stories.tsx +324 -0
  1282. package/src/components/Toast/toast.principles.stories.tsx +217 -0
  1283. package/src/components/Toast/toast.spec.md +181 -0
  1284. package/src/components/Toast/toast.stories.tsx +125 -0
  1285. package/src/components/Toast/toast.tsx +2 -2
  1286. package/src/components/Tooltip/index.ts +5 -0
  1287. package/src/components/Tooltip/tooltip.anatomy.stories.tsx +413 -0
  1288. package/src/components/Tooltip/tooltip.principles.stories.tsx +204 -0
  1289. package/src/components/Tooltip/tooltip.spec.md +142 -0
  1290. package/src/components/Tooltip/tooltip.stories.tsx +116 -0
  1291. package/src/components/Tooltip/tooltip.tsx +4 -1
  1292. package/src/components/TreeView/index.ts +5 -0
  1293. package/src/components/TreeView/tree-view.anatomy.stories.tsx +426 -0
  1294. package/src/components/TreeView/tree-view.principles.stories.tsx +190 -0
  1295. package/src/components/TreeView/tree-view.spec.md +390 -0
  1296. package/src/components/TreeView/tree-view.stories.tsx +299 -0
  1297. package/src/components/TreeView/tree-view.tsx +63 -26
  1298. package/src/hooks/use-overflow-items.ts +10 -6
  1299. package/src/index.ts +73 -69
  1300. package/src/lib/utils.ts +2 -1
  1301. package/src/patterns/README.md +15 -11
  1302. package/src/patterns/action-bar/action-bar.spec.md +465 -0
  1303. package/src/patterns/action-bar/action-bar.stories.tsx +612 -0
  1304. package/src/patterns/element-anatomy/element-anatomy.spec.md +217 -0
  1305. package/src/patterns/element-anatomy/index.ts +5 -0
  1306. package/src/patterns/element-anatomy/inline-action.spec.md +320 -0
  1307. package/src/patterns/element-anatomy/item-anatomy.spec.md +1051 -0
  1308. package/src/patterns/element-anatomy/item-anatomy.stories.tsx +1622 -0
  1309. package/src/patterns/element-anatomy/item-anatomy.tsx +9 -5
  1310. package/src/patterns/header-canonical/chrome-header.tsx +16 -5
  1311. package/src/patterns/header-canonical/header-canonical.css +2 -2
  1312. package/src/patterns/header-canonical/header-canonical.spec.md +326 -0
  1313. package/src/patterns/header-canonical/header-canonical.stories.tsx +150 -0
  1314. package/src/patterns/header-canonical/index.ts +5 -0
  1315. package/src/patterns/horizontal-overflow/horizontal-overflow.spec.md +211 -0
  1316. package/src/patterns/horizontal-overflow/index.ts +5 -0
  1317. package/src/patterns/overlay-surface/index.ts +5 -0
  1318. package/src/patterns/overlay-surface/overlay-surface.spec.md +442 -0
  1319. package/src/patterns/overlay-surface/overlay-surface.tsx +26 -11
  1320. package/src/patterns/resize-handle/index.ts +5 -0
  1321. package/src/patterns/resize-handle/resize-handle.spec.md +120 -0
  1322. package/src/patterns/resize-handle/resize-handle.stories.tsx +71 -0
  1323. package/src/story-governance/category-matrix.json +132 -0
  1324. package/src/story-governance/category-matrix.ts +55 -0
  1325. package/src/styles/base.css +92 -0
  1326. package/src/styles/tokens.css +11 -0
  1327. package/src/tokens/README.md +7 -2
  1328. package/src/tokens/categorical-color.ts +164 -0
  1329. package/src/tokens/color/color.spec.md +801 -0
  1330. package/src/tokens/color/color.stories.tsx +363 -0
  1331. package/src/tokens/color/primitives.css +7 -0
  1332. package/src/tokens/color/semantic.css +28 -13
  1333. package/src/tokens/density/density.spec.md +128 -0
  1334. package/src/tokens/density/density.stories.tsx +240 -0
  1335. package/src/tokens/elevation/elevation.spec.md +78 -0
  1336. package/src/tokens/elevation/elevation.stories.tsx +98 -0
  1337. package/src/tokens/layoutSpace/layoutSpace.css +1 -1
  1338. package/src/tokens/layoutSpace/layoutSpace.spec.md +324 -0
  1339. package/src/tokens/layoutSpace/layoutSpace.stories.tsx +75 -0
  1340. package/src/tokens/motion/motion.css +2 -2
  1341. package/src/tokens/motion/motion.spec.md +105 -0
  1342. package/src/tokens/motion/motion.ts +1 -1
  1343. package/src/tokens/opacity/opacity.spec.md +73 -0
  1344. package/src/tokens/opacity/opacity.stories.tsx +69 -0
  1345. package/src/tokens/orphan-tokens.spec.md +128 -0
  1346. package/src/tokens/radius/radius.spec.md +126 -0
  1347. package/src/tokens/radius/radius.stories.tsx +86 -0
  1348. package/src/tokens/token-system.spec.md +240 -0
  1349. package/src/tokens/typography/typography.spec.md +204 -0
  1350. package/src/tokens/typography/typography.stories.tsx +133 -0
  1351. package/src/tokens/uiSize/icon-size.ts +1 -2
  1352. package/src/tokens/uiSize/uiSize.css +21 -0
  1353. package/src/tokens/uiSize/uiSize.spec.md +465 -0
  1354. package/src/tokens/utility-registry.json +124 -0
  1355. package/dist/components/NameCard/name-card.d.ts.map +0 -1
  1356. package/dist/components/NameCard/name-card.js.map +0 -1
@@ -0,0 +1,16 @@
1
+ import { Dialog, DialogBody, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, dialogMeta } from "./dialog.js";
2
+ export {
3
+ Dialog,
4
+ DialogBody,
5
+ DialogClose,
6
+ DialogContent,
7
+ DialogDescription,
8
+ DialogFooter,
9
+ DialogHeader,
10
+ DialogOverlay,
11
+ DialogPortal,
12
+ DialogTitle,
13
+ DialogTrigger,
14
+ dialogMeta
15
+ };
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -36,7 +36,7 @@ declare const DropdownMenuSub: React.FC<DropdownMenuPrimitive.DropdownMenuSubPro
36
36
  declare const DropdownMenuRadioGroup: React.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuRadioGroupProps & React.RefAttributes<HTMLDivElement>>;
37
37
  interface DropdownMenuContentProps extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> {
38
38
  size?: SizeKey;
39
- /** 最小寬度(px),預設跟隨觸發元件寬度 */
39
+ /** 最小寬度(px),預設 `max(180px, 觸發元件寬度)`——窄 trigger 時吃 180px 地板 */
40
40
  minWidth?: number;
41
41
  /** 最大高度(px),超過時捲動 */
42
42
  maxHeight?: number;
@@ -57,7 +57,8 @@ interface DropdownMenuItemProps extends Omit<React.ComponentPropsWithoutRef<type
57
57
  badge?: React.ReactNode;
58
58
  /** 後綴指示型 icon(LucideIcon),fg-muted */
59
59
  endIcon?: LucideIcon;
60
- /** 鍵盤快捷鍵 */
60
+ /** 鍵盤快捷鍵提示(canonical)——渲染進 MenuItem `endContent` 正規後綴 slot。
61
+ * 替代方案是 `<DropdownMenuShortcut>` child(composition escape-hatch);**同 item 勿混用**。 */
61
62
  shortcut?: string;
62
63
  /** 單選選中(bg-neutral-selected,持續選中狀態)*/
63
64
  selected?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"dropdown-menu.d.ts","sourceRoot":"","sources":["../../../src/components/DropdownMenu/dropdown-menu.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dropdown-menu.d.ts","sourceRoot":"","sources":["../../../src/components/DropdownMenu/dropdown-menu.tsx"],"names":[],"mappings":"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"}
@@ -52,7 +52,6 @@ const DropdownMenuContent = React.forwardRef(({ className, size = "md", sideOffs
52
52
  sideOffset,
53
53
  collisionPadding,
54
54
  align,
55
- onCloseAutoFocus: (e) => e.preventDefault(),
56
55
  className: cn(floatingLayerClass, !maxHeight && "py-2", className),
57
56
  style: {
58
57
  boxShadow: "var(--elevation-200)",
@@ -90,7 +89,7 @@ function buildEndContent(size, badge, endIcon, shortcut) {
90
89
  return /* @__PURE__ */ jsxs(Fragment, { children: [
91
90
  badge,
92
91
  EndIcon && /* @__PURE__ */ jsx(EndIcon, { size: iconPx, className: "text-fg-muted", "aria-hidden": true }),
93
- shortcut && /* @__PURE__ */ jsx("span", { className: "text-caption text-fg-muted", children: shortcut })
92
+ shortcut && /* @__PURE__ */ jsx("span", { className: "text-caption text-fg-muted tracking-shortcut", children: shortcut })
94
93
  ] });
95
94
  }
96
95
  const DropdownMenuItem = React.forwardRef(({ className, children, startIcon, avatar, description, tag, badge, endIcon, shortcut, selected, disabled, ...props }, ref) => {
@@ -227,7 +226,7 @@ const DropdownMenuRadioItem = React.forwardRef(({ className, children, startIcon
227
226
  ref,
228
227
  disabled,
229
228
  onSelect: (e) => e.preventDefault(),
230
- className: cn(radixItemClass, "data-[state=checked]:[&>*]:bg-neutral-selected", className),
229
+ className: cn(radixItemClass, "data-[state=checked]:bg-neutral-selected", className),
231
230
  ...props,
232
231
  children: /* @__PURE__ */ jsx(
233
232
  MenuItem,
@@ -248,7 +247,7 @@ DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
248
247
  const DropdownMenuShortcut = ({ className, ...props }) => /* @__PURE__ */ jsx(
249
248
  "span",
250
249
  {
251
- className: cn("ml-auto text-footnote text-fg-muted tracking-shortcut", className),
250
+ className: cn("ml-auto text-caption text-fg-muted tracking-shortcut", className),
252
251
  ...props
253
252
  }
254
253
  );
@@ -1 +1 @@
1
- {"version":3,"file":"dropdown-menu.js","sources":["../../../src/components/DropdownMenu/dropdown-menu.tsx"],"sourcesContent":["import * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { ChevronRight, type LucideIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport type { AvatarData } from \"@/design-system/components/Avatar/avatar\"\nimport { MenuItem } from \"@/design-system/components/Menu/menu-item\"\nimport { ScrollArea } from \"@/design-system/components/ScrollArea/scroll-area\"\nimport { OVERLAY_SIDE_OFFSET, OVERLAY_COLLISION_PADDING } from \"@/design-system/tokens/elevation/overlay-geometry\"\nimport {\n RowSizeProvider,\n useRowSize,\n ICON_SIZE as ROW_ICON_SIZE,\n type RowSize,\n} from \"@/design-system/patterns/element-anatomy/item-anatomy\"\n\n/**\n * DropdownMenu — Radix DropdownMenu + MenuItem visual layer\n *\n * 架構分工:\n * - Radix primitives:behavior(keyboard nav, focus management, aria roles)\n * - MenuItem:visual(layout, padding, icon alignment, typography)\n *\n * Radix primitive 是外層容器,控制 `data-[highlighted]:bg-neutral-hover`。\n * MenuItem 內層只負責佈局,不加互動樣式。\n *\n * ── Hover / highlight canonical(2026-04-22 修正)──\n * 用 Radix 官方的 `data-[highlighted]` attribute,**不用 `:focus-visible` / `:hover` /\n * `:focus`**:\n * - Radix 在 **mouse hover、keyboard arrow nav、focus move in** 時自動 set `data-highlighted`\n * - mouse leave / focus move out / menu close 時自動清掉\n * - 不會在 click 後留殘影(Radix 內部已處理)\n * - 跨瀏覽器一致(不依賴 `:focus-visible` 的 heuristic)\n *\n * 曾經用過 `focus-visible:bg-neutral-hover` 的理由:避免 click 後殘影。但實測:mouse hover\n * 觸發 Radix 程式化 `.focus()`,Chromium / Safari / Firefox 對 programmatic focus 是否 fire\n * `:focus-visible` 行為不一致,導致 mouse hover 有時無 bg。改用 `data-[highlighted]:` 後行為\n * 一致 —— 世界級 canonical(shadcn / Radix docs / Ariakit 皆此)。\n */\n\n// ── Floating layer 共用樣式 ──\nconst floatingLayerClass = [\n 'z-50 overflow-hidden rounded-lg border border-border bg-surface-raised',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out motion-reduce:animate-none',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n 'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2',\n 'data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n 'origin-[var(--radix-dropdown-menu-content-transform-origin)]',\n].join(' ')\n\n// ── Size:統一用 RowSizeContext(item-layout module),消除本地 SizeContext 漂移 ──\ntype SizeKey = RowSize\n// Re-export for backward compat(內部命名)\nconst ICON_SIZE = ROW_ICON_SIZE\n\n// ── Shared item classes on Radix primitive ──\n// Highlight(hover + keyboard nav): 用 Radix `data-[highlighted]` canonical(見 docblock)\nconst radixItemClass = [\n 'relative cursor-pointer select-none outline-none',\n 'transition-colors duration-150',\n 'data-[highlighted]:bg-neutral-hover',\n 'data-[disabled]:pointer-events-none data-[disabled]:text-fg-disabled data-[disabled]:cursor-default',\n].join(' ')\n\n// ── Root ──\nconst DropdownMenu = DropdownMenuPrimitive.Root\nconst DropdownMenuTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Trigger\n ref={ref}\n className={cn('outline-none', className)}\n {...props}\n />\n))\nDropdownMenuTrigger.displayName = DropdownMenuPrimitive.Trigger.displayName\n// DropdownMenuGroup — 對齊 MenuGroup 的 group separation 設計語言\n//\n// 設計語言(跨 Menu-like 元件統一,SSOT 見 item-anatomy.spec.md\n// 「Group auto-separation」):\n// 每個 group 上下各 8px padding,相鄰 group 之間用 border-divider 分隔\n// 兩個 group 之間視覺 gap = 8px(上一個 bottom)+ 8px(下一個 top)= 16px + border\n//\n// MenuGroup(menu-item.tsx)實作:`py-2 [&+&]:border-t [&+&]:border-divider`\n// (在 Command.List 下提供 Content 邊界 8px + group 間 16px gap)\n//\n// DropdownMenuGroup(本元件)實作:`[&+&]:mt-2 [&+&]:pt-2 [&+&]:border-t\n// [&+&]:border-divider`(因為 DropdownMenuContent 已有 py-2 提供 Content 邊界\n// 的 8px,只需在第二個起的 group 加 8+8 = 16px gap + border)\n//\n// **視覺結果等同**:兩種實作的 visual output 一致,只是「padding 住在哪層」\n// 不同。不強制統一 CSS 表達式——DropdownMenuContent 的 py-2 是既有 Radix\n// 期望的行為,移除會影響 trigger 鍵盤導覽的 focus offset。\nconst DropdownMenuGroup = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Group>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Group\n ref={ref}\n className={cn('[&+&]:border-t [&+&]:border-divider [&+&]:mt-2 [&+&]:pt-2', className)}\n {...props}\n />\n))\nDropdownMenuGroup.displayName = 'DropdownMenuGroup'\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\n// ── Content ──\ninterface DropdownMenuContentProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> {\n size?: SizeKey\n /** 最小寬度(px),預設跟隨觸發元件寬度 */\n minWidth?: number\n /** 最大高度(px),超過時捲動 */\n maxHeight?: number\n}\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n DropdownMenuContentProps\n>(({ className, size = 'md', sideOffset = OVERLAY_SIDE_OFFSET, collisionPadding = OVERLAY_COLLISION_PADDING, align = 'start', minWidth, maxHeight, children, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n align={align}\n onCloseAutoFocus={(e) => e.preventDefault()}\n className={cn(floatingLayerClass, !maxHeight && 'py-2', className)}\n style={{\n boxShadow: 'var(--elevation-200)',\n minWidth: minWidth ?? 'max(180px, var(--radix-dropdown-menu-trigger-width))',\n maxHeight,\n }}\n {...props}\n >\n <RowSizeProvider value={size}>\n {maxHeight ? (\n // 長選單用 ScrollArea 跨 OS 一致捲動(不吃寬度,macOS/Windows 視覺一致)\n // py-2 移到內層,ScrollArea Viewport 才能 scroll 整個 padded 區\n <ScrollArea className=\"max-h-[inherit]\">\n <div className=\"py-2\">{children}</div>\n </ScrollArea>\n ) : (\n children\n )}\n </RowSizeProvider>\n </DropdownMenuPrimitive.Content>\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\n// ── SubContent ──\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, children, ...props }, ref) => {\n const size = useRowSize()\n return (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n sideOffset={OVERLAY_SIDE_OFFSET}\n className={cn(floatingLayerClass, 'py-2', className)}\n style={{ boxShadow: 'var(--elevation-200)', minWidth: 180 }}\n {...props}\n >\n <RowSizeProvider value={size}>\n {children}\n </RowSizeProvider>\n </DropdownMenuPrimitive.SubContent>\n )\n})\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName\n\n// ── Helper: build endContent from badge + endIcon + shortcut ──\nfunction buildEndContent(\n size: SizeKey,\n badge?: React.ReactNode,\n endIcon?: LucideIcon,\n shortcut?: string,\n): React.ReactNode | undefined {\n const EndIcon = endIcon\n if (!badge && !EndIcon && !shortcut) return undefined\n const iconPx = ICON_SIZE[size]\n return (\n <>\n {badge}\n {EndIcon && <EndIcon size={iconPx} className=\"text-fg-muted\" aria-hidden />}\n {shortcut && <span className=\"text-caption text-fg-muted\">{shortcut}</span>}\n </>\n )\n}\n\n// ── Item ──\ninterface DropdownMenuItemProps\n extends Omit<React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item>, 'children'> {\n children: React.ReactNode\n /** 左側 icon */\n startIcon?: LucideIcon\n /** 左側頭像資料(AvatarData),與 startIcon 互斥 */\n avatar?: AvatarData\n /** 次要說明文字 */\n description?: React.ReactNode\n /** 後綴 Tag(ReactNode) */\n tag?: React.ReactNode\n /** 後綴 Badge(ReactNode) */\n badge?: React.ReactNode\n /** 後綴指示型 icon(LucideIcon),fg-muted */\n endIcon?: LucideIcon\n /** 鍵盤快捷鍵 */\n shortcut?: string\n /** 單選選中(bg-neutral-selected,持續選中狀態)*/\n selected?: boolean\n}\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n DropdownMenuItemProps\n>(({ className, children, startIcon, avatar, description, tag, badge, endIcon, shortcut, selected, disabled, ...props }, ref) => {\n const size = useRowSize()\n const endContent = buildEndContent(size, badge, endIcon, shortcut)\n\n return (\n <DropdownMenuPrimitive.Item\n ref={ref}\n disabled={disabled}\n className={cn(\n radixItemClass,\n selected && 'bg-neutral-selected',\n className,\n )}\n {...props}\n >\n <MenuItem\n size={size}\n startIcon={startIcon}\n avatar={avatar}\n description={description}\n tag={tag}\n endContent={endContent}\n disabled={disabled}\n // Pure visual — Radix parent handles role/aria/interaction\n role=\"presentation\"\n className=\"!bg-transparent hover:!bg-transparent pointer-events-none\"\n >\n {children}\n </MenuItem>\n </DropdownMenuPrimitive.Item>\n )\n})\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\n// ── SubTrigger(子選單觸發器,自動附加 ChevronRight)──\ninterface DropdownMenuSubTriggerProps\n extends Omit<React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger>, 'children'> {\n children: React.ReactNode\n /** 左側 icon */\n startIcon?: LucideIcon\n /** 子選單目前狀態值文字(如 \"深色\") */\n value?: string\n /** 子選單狀態 badge */\n badge?: React.ReactNode\n}\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n DropdownMenuSubTriggerProps\n>(({ className, children, startIcon, value, badge, ...props }, ref) => {\n const size = useRowSize()\n const iconPx = ICON_SIZE[size]\n\n // SubTrigger suffix: [value?] [badge?] [ChevronRight] with gap-1\n const endContent = (\n <div className=\"flex items-center gap-1\">\n {value && <span className=\"text-fg-muted\">{value}</span>}\n {badge}\n <ChevronRight size={iconPx} className=\"text-fg-muted\" />\n </div>\n )\n\n return (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n radixItemClass,\n 'data-[state=open]:bg-neutral-hover',\n className,\n )}\n {...props}\n >\n <MenuItem\n size={size}\n startIcon={startIcon}\n endContent={endContent}\n role=\"presentation\"\n className=\"!bg-transparent hover:!bg-transparent pointer-events-none\"\n >\n {children}\n </MenuItem>\n </DropdownMenuPrimitive.SubTrigger>\n )\n})\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName\n\n// ── CheckboxItem ──\ninterface DropdownMenuCheckboxItemProps\n extends Omit<React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>, 'children'> {\n children: React.ReactNode\n /** 左側 icon */\n startIcon?: LucideIcon\n /** 次要說明文字 */\n description?: React.ReactNode\n}\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n DropdownMenuCheckboxItemProps\n>(({ className, children, startIcon, description, checked, disabled, ...props }, ref) => {\n const size = useRowSize()\n\n return (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n checked={checked}\n disabled={disabled}\n onSelect={(e) => e.preventDefault()}\n className={cn(radixItemClass, className)}\n {...props}\n >\n <MenuItem\n size={size}\n checkbox\n checked={!!checked}\n startIcon={startIcon}\n description={description}\n disabled={disabled}\n role=\"presentation\"\n className=\"!bg-transparent hover:!bg-transparent pointer-events-none\"\n >\n {children}\n </MenuItem>\n </DropdownMenuPrimitive.CheckboxItem>\n )\n})\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName\n\n// ── Label(群組標題)──\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label>\n>(({ className, children, ...props }, ref) => {\n const size = useRowSize()\n return (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn('outline-none', className)}\n {...props}\n >\n <MenuItem\n size={size}\n header\n role=\"presentation\"\n className=\"pointer-events-none\"\n >\n {children}\n </MenuItem>\n </DropdownMenuPrimitive.Label>\n )\n})\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\n// ── Separator ──\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"my-2 h-px bg-divider\", className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\n// ── RadioItem(單選,排序方式等)──\n// Radix handles checked state; visual用 MenuItem 的 selected highlight。\ninterface DropdownMenuRadioItemProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem> {\n /** Prefix icon(LucideIcon) */\n startIcon?: LucideIcon\n /** 次要說明文字 */\n description?: React.ReactNode\n}\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n DropdownMenuRadioItemProps\n>(({ className, children, startIcon, description, disabled, ...props }, ref) => {\n const size = useRowSize()\n\n return (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n disabled={disabled}\n onSelect={(e) => e.preventDefault()}\n className={cn(radixItemClass, 'data-[state=checked]:[&>*]:bg-neutral-selected', className)}\n {...props}\n >\n <MenuItem\n size={size}\n startIcon={startIcon}\n description={description}\n disabled={disabled}\n role=\"presentation\"\n className=\"!bg-transparent hover:!bg-transparent pointer-events-none\"\n >\n {children}\n </MenuItem>\n </DropdownMenuPrimitive.RadioItem>\n )\n})\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\n// ── Shortcut(鍵盤快捷鍵提示,ml-auto 靠右)──\n// 作為 MenuItem children 的後綴,視覺為 fg-muted 小字。\nconst DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => (\n <span\n className={cn('ml-auto text-footnote text-fg-muted tracking-shortcut', className)}\n {...props}\n />\n)\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut'\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 dropdownMenuMeta = {\n component: 'DropdownMenu',\n family: null, // non-family composite / overlay / layout\n variants: {\n\n },\n sizes: {\n\n },\n states: ['default', 'hover', 'active', 'focus-visible', 'disabled'],\n tokens: {\n bg: ['bg-neutral-hover', 'bg-surface-raised', 'bg-transparent'],\n fg: ['text-fg-disabled', 'text-fg-muted'],\n ring: [],\n },\n} as const\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuShortcut,\n floatingLayerClass,\n}\nexport type { SizeKey, DropdownMenuItemProps }\n"],"names":["ROW_ICON_SIZE"],"mappings":"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"}
1
+ {"version":3,"file":"dropdown-menu.js","sources":["../../../src/components/DropdownMenu/dropdown-menu.tsx"],"sourcesContent":["import * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { ChevronRight, type LucideIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport type { AvatarData } from \"@/design-system/components/Avatar/avatar\"\nimport { MenuItem } from \"@/design-system/components/Menu/menu-item\"\nimport { ScrollArea } from \"@/design-system/components/ScrollArea/scroll-area\"\nimport { OVERLAY_SIDE_OFFSET, OVERLAY_COLLISION_PADDING } from \"@/design-system/tokens/elevation/overlay-geometry\"\nimport {\n RowSizeProvider,\n useRowSize,\n ICON_SIZE as ROW_ICON_SIZE,\n type RowSize,\n} from \"@/design-system/patterns/element-anatomy/item-anatomy\"\n\n/**\n * DropdownMenu — Radix DropdownMenu + MenuItem visual layer\n *\n * 架構分工:\n * - Radix primitives:behavior(keyboard nav, focus management, aria roles)\n * - MenuItem:visual(layout, padding, icon alignment, typography)\n *\n * Radix primitive 是外層容器,控制 `data-[highlighted]:bg-neutral-hover`。\n * MenuItem 內層只負責佈局,不加互動樣式。\n *\n * ── Hover / highlight canonical(2026-04-22 修正)──\n * 用 Radix 官方的 `data-[highlighted]` attribute,**不用 `:focus-visible` / `:hover` /\n * `:focus`**:\n * - Radix 在 **mouse hover、keyboard arrow nav、focus move in** 時自動 set `data-highlighted`\n * - mouse leave / focus move out / menu close 時自動清掉\n * - 不會在 click 後留殘影(Radix 內部已處理)\n * - 跨瀏覽器一致(不依賴 `:focus-visible` 的 heuristic)\n *\n * 曾經用過 `focus-visible:bg-neutral-hover` 的理由:避免 click 後殘影。但實測:mouse hover\n * 觸發 Radix 程式化 `.focus()`,Chromium / Safari / Firefox 對 programmatic focus 是否 fire\n * `:focus-visible` 行為不一致,導致 mouse hover 有時無 bg。改用 `data-[highlighted]:` 後行為\n * 一致 —— 世界級 canonical(shadcn / Radix docs / Ariakit 皆此)。\n */\n\n// ── Floating layer 共用樣式 ──\nconst floatingLayerClass = [\n 'z-50 overflow-hidden rounded-lg border border-border bg-surface-raised',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out motion-reduce:animate-none',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n 'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2',\n 'data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n 'origin-[var(--radix-dropdown-menu-content-transform-origin)]',\n].join(' ')\n\n// ── Size:統一用 RowSizeContext(item-layout module),消除本地 SizeContext 漂移 ──\ntype SizeKey = RowSize\n// Re-export for backward compat(內部命名)\nconst ICON_SIZE = ROW_ICON_SIZE\n\n// ── Shared item classes on Radix primitive ──\n// Highlight(hover + keyboard nav): 用 Radix `data-[highlighted]` canonical(見 docblock)\nconst radixItemClass = [\n 'relative cursor-pointer select-none outline-none',\n 'transition-colors duration-150',\n 'data-[highlighted]:bg-neutral-hover',\n 'data-[disabled]:pointer-events-none data-[disabled]:text-fg-disabled data-[disabled]:cursor-default',\n].join(' ')\n\n// ── Root ──\nconst DropdownMenu = DropdownMenuPrimitive.Root\nconst DropdownMenuTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Trigger\n ref={ref}\n className={cn('outline-none', className)}\n {...props}\n />\n))\nDropdownMenuTrigger.displayName = DropdownMenuPrimitive.Trigger.displayName\n// DropdownMenuGroup — 對齊 MenuGroup 的 group separation 設計語言\n//\n// 設計語言(跨 Menu-like 元件統一,SSOT 見 item-anatomy.spec.md\n// 「Group auto-separation」):\n// 每個 group 上下各 8px padding,相鄰 group 之間用 border-divider 分隔\n// 兩個 group 之間視覺 gap = 8px(上一個 bottom)+ 8px(下一個 top)= 16px + border\n//\n// MenuGroup(menu-item.tsx)實作:`py-2 [&+&]:border-t [&+&]:border-divider`\n// (在 Command.List 下提供 Content 邊界 8px + group 間 16px gap)\n//\n// DropdownMenuGroup(本元件)實作:`[&+&]:mt-2 [&+&]:pt-2 [&+&]:border-t\n// [&+&]:border-divider`(因為 DropdownMenuContent 已有 py-2 提供 Content 邊界\n// 的 8px,只需在第二個起的 group 加 8+8 = 16px gap + border)\n//\n// **視覺結果等同**:兩種實作的 visual output 一致,只是「padding 住在哪層」\n// 不同。不強制統一 CSS 表達式——DropdownMenuContent 的 py-2 是既有 Radix\n// 期望的行為,移除會影響 trigger 鍵盤導覽的 focus offset。\nconst DropdownMenuGroup = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Group>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Group\n ref={ref}\n className={cn('[&+&]:border-t [&+&]:border-divider [&+&]:mt-2 [&+&]:pt-2', className)}\n {...props}\n />\n))\nDropdownMenuGroup.displayName = 'DropdownMenuGroup'\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\n// ── Content ──\ninterface DropdownMenuContentProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> {\n size?: SizeKey\n /** 最小寬度(px),預設 `max(180px, 觸發元件寬度)`——窄 trigger 時吃 180px 地板 */\n minWidth?: number\n /** 最大高度(px),超過時捲動 */\n maxHeight?: number\n}\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n DropdownMenuContentProps\n>(({ className, size = 'md', sideOffset = OVERLAY_SIDE_OFFSET, collisionPadding = OVERLAY_COLLISION_PADDING, align = 'start', minWidth, maxHeight, children, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n align={align}\n // Density:繼承 page density(2026-06-15 canonical)。menu item 高度 = field-height-{size},而\n // field-height 隨 density 變(md 28/32/36 → lg 32/36/40)→ 鎖 data-density=\"md\" 會把選單釘在 md-scale,\n // lg page 上對不上 lg 觸發點。原 data-density 是 409b91da a11y 批次順手加(對齊 Popover),非設計\n // 決策 → 移除,item 隨 page density 與觸發點一致(tier 仍由 size prop 決定)。\n // Focus return on close:不 override `onCloseAutoFocus` — 用 Radix 內建 default\n // (close 時 focus 還 trigger;outside-interaction 例外由 Radix `hasInteractedOutsideRef` 自管)。\n // W3C APG menubar「Escape: …return focus to the element…from which the menu was opened」\n // (w3.org/WAI/ARIA/apg/patterns/menubar/);shadcn dropdown-menu 同樣不 override。\n // 2026-06-11 移除 2026-04-08 的 `(e) => e.preventDefault()` hardcode:它跑在 Radix\n // composeEventHandlers 內建 handler 之前,defaultPrevented → trigger focus 被 skip →\n // Esc 關閉後 focus 掉到 body(APG violation)。原動機「mouse close 後 trigger 殘留\n // focus ring」不構成 override 理由:實測(2026-06-12 playwright)pointer item-click\n // close 後 programmatic refocus 在 Chromium 仍可 match `:focus-visible`(UA heuristic),\n // 但與 shadcn 官方 live demo 同流程 DOM 比對 IDENTICAL — Radix 生態一致接受此\n // tradeoff:APG keyboard focus-return 優先於 cosmetic ring。\n className={cn(floatingLayerClass, !maxHeight && 'py-2', className)}\n style={{\n boxShadow: 'var(--elevation-200)',\n minWidth: minWidth ?? 'max(180px, var(--radix-dropdown-menu-trigger-width))',\n maxHeight,\n }}\n {...props}\n >\n <RowSizeProvider value={size}>\n {maxHeight ? (\n // 長選單用 ScrollArea 跨 OS 一致捲動(不吃寬度,macOS/Windows 視覺一致)\n // py-2 移到內層,ScrollArea Viewport 才能 scroll 整個 padded 區\n <ScrollArea className=\"max-h-[inherit]\">\n <div className=\"py-2\">{children}</div>\n </ScrollArea>\n ) : (\n children\n )}\n </RowSizeProvider>\n </DropdownMenuPrimitive.Content>\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\n// ── SubContent ──\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, children, ...props }, ref) => {\n const size = useRowSize()\n return (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n sideOffset={OVERLAY_SIDE_OFFSET}\n className={cn(floatingLayerClass, 'py-2', className)}\n style={{ boxShadow: 'var(--elevation-200)', minWidth: 180 }}\n {...props}\n >\n <RowSizeProvider value={size}>\n {children}\n </RowSizeProvider>\n </DropdownMenuPrimitive.SubContent>\n )\n})\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName\n\n// ── Helper: build endContent from badge + endIcon + shortcut ──\nfunction buildEndContent(\n size: SizeKey,\n badge?: React.ReactNode,\n endIcon?: LucideIcon,\n shortcut?: string,\n): React.ReactNode | undefined {\n const EndIcon = endIcon\n if (!badge && !EndIcon && !shortcut) return undefined\n const iconPx = ICON_SIZE[size]\n return (\n <>\n {badge}\n {EndIcon && <EndIcon size={iconPx} className=\"text-fg-muted\" aria-hidden />}\n {shortcut && <span className=\"text-caption text-fg-muted tracking-shortcut\">{shortcut}</span>}\n </>\n )\n}\n\n// ── Item ──\ninterface DropdownMenuItemProps\n extends Omit<React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item>, 'children'> {\n children: React.ReactNode\n /** 左側 icon */\n startIcon?: LucideIcon\n /** 左側頭像資料(AvatarData),與 startIcon 互斥 */\n avatar?: AvatarData\n /** 次要說明文字 */\n description?: React.ReactNode\n /** 後綴 Tag(ReactNode) */\n tag?: React.ReactNode\n /** 後綴 Badge(ReactNode) */\n badge?: React.ReactNode\n /** 後綴指示型 icon(LucideIcon),fg-muted */\n endIcon?: LucideIcon\n /** 鍵盤快捷鍵提示(canonical)——渲染進 MenuItem `endContent` 正規後綴 slot。\n * 替代方案是 `<DropdownMenuShortcut>` child(composition escape-hatch);**同 item 勿混用**。 */\n shortcut?: string\n /** 單選選中(bg-neutral-selected,持續選中狀態)*/\n selected?: boolean\n}\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n DropdownMenuItemProps\n>(({ className, children, startIcon, avatar, description, tag, badge, endIcon, shortcut, selected, disabled, ...props }, ref) => {\n const size = useRowSize()\n const endContent = buildEndContent(size, badge, endIcon, shortcut)\n\n return (\n <DropdownMenuPrimitive.Item\n ref={ref}\n disabled={disabled}\n className={cn(\n radixItemClass,\n selected && 'bg-neutral-selected',\n className,\n )}\n {...props}\n >\n <MenuItem\n size={size}\n startIcon={startIcon}\n avatar={avatar}\n description={description}\n tag={tag}\n endContent={endContent}\n disabled={disabled}\n // Pure visual — Radix parent handles role/aria/interaction\n role=\"presentation\"\n className=\"!bg-transparent hover:!bg-transparent pointer-events-none\"\n >\n {children}\n </MenuItem>\n </DropdownMenuPrimitive.Item>\n )\n})\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\n// ── SubTrigger(子選單觸發器,自動附加 ChevronRight)──\ninterface DropdownMenuSubTriggerProps\n extends Omit<React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger>, 'children'> {\n children: React.ReactNode\n /** 左側 icon */\n startIcon?: LucideIcon\n /** 子選單目前狀態值文字(如 \"深色\") */\n value?: string\n /** 子選單狀態 badge */\n badge?: React.ReactNode\n}\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n DropdownMenuSubTriggerProps\n>(({ className, children, startIcon, value, badge, ...props }, ref) => {\n const size = useRowSize()\n const iconPx = ICON_SIZE[size]\n\n // SubTrigger suffix: [value?] [badge?] [ChevronRight] with gap-1\n const endContent = (\n <div className=\"flex items-center gap-1\">\n {value && <span className=\"text-fg-muted\">{value}</span>}\n {badge}\n <ChevronRight size={iconPx} className=\"text-fg-muted\" />\n </div>\n )\n\n return (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n radixItemClass,\n 'data-[state=open]:bg-neutral-hover',\n className,\n )}\n {...props}\n >\n <MenuItem\n size={size}\n startIcon={startIcon}\n endContent={endContent}\n role=\"presentation\"\n className=\"!bg-transparent hover:!bg-transparent pointer-events-none\"\n >\n {children}\n </MenuItem>\n </DropdownMenuPrimitive.SubTrigger>\n )\n})\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName\n\n// ── CheckboxItem ──\ninterface DropdownMenuCheckboxItemProps\n extends Omit<React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>, 'children'> {\n children: React.ReactNode\n /** 左側 icon */\n startIcon?: LucideIcon\n /** 次要說明文字 */\n description?: React.ReactNode\n}\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n DropdownMenuCheckboxItemProps\n>(({ className, children, startIcon, description, checked, disabled, ...props }, ref) => {\n const size = useRowSize()\n\n return (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n checked={checked}\n disabled={disabled}\n onSelect={(e) => e.preventDefault()}\n className={cn(radixItemClass, className)}\n {...props}\n >\n <MenuItem\n size={size}\n checkbox\n checked={!!checked}\n startIcon={startIcon}\n description={description}\n disabled={disabled}\n role=\"presentation\"\n className=\"!bg-transparent hover:!bg-transparent pointer-events-none\"\n >\n {children}\n </MenuItem>\n </DropdownMenuPrimitive.CheckboxItem>\n )\n})\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName\n\n// ── Label(群組標題)──\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label>\n>(({ className, children, ...props }, ref) => {\n const size = useRowSize()\n return (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn('outline-none', className)}\n {...props}\n >\n <MenuItem\n size={size}\n header\n role=\"presentation\"\n className=\"pointer-events-none\"\n >\n {children}\n </MenuItem>\n </DropdownMenuPrimitive.Label>\n )\n})\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\n// ── Separator ──\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"my-2 h-px bg-divider\", className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\n// ── RadioItem(單選,排序方式等)──\n// Radix handles checked state; visual用 MenuItem 的 selected highlight。\ninterface DropdownMenuRadioItemProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem> {\n /** Prefix icon(LucideIcon) */\n startIcon?: LucideIcon\n /** 次要說明文字 */\n description?: React.ReactNode\n}\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n DropdownMenuRadioItemProps\n>(({ className, children, startIcon, description, disabled, ...props }, ref) => {\n const size = useRowSize()\n\n return (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n disabled={disabled}\n onSelect={(e) => e.preventDefault()}\n // 2026-05-31 #10:selected 底色套在外層 Radix RadioItem 本身(非 `[&>*]` 子 MenuItem),\n // 因內層 MenuItem 自帶 `!bg-transparent` 會蓋掉子層 bg → 選中底色從不顯示。\n // 改 parent-bg pattern(對齊 DropdownMenuItem selected):RadioItem 上底色,MenuItem 透明讓它透出。\n className={cn(radixItemClass, 'data-[state=checked]:bg-neutral-selected', className)}\n {...props}\n >\n <MenuItem\n size={size}\n startIcon={startIcon}\n description={description}\n disabled={disabled}\n role=\"presentation\"\n className=\"!bg-transparent hover:!bg-transparent pointer-events-none\"\n >\n {children}\n </MenuItem>\n </DropdownMenuPrimitive.RadioItem>\n )\n})\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\n// ── Shortcut(鍵盤快捷鍵提示,ml-auto 靠右)──\n// **Canonical 是 `<DropdownMenuItem shortcut=\"⌘C\">`** prop —— 走 MenuItem `endContent` 正規後綴 slot\n// (跟 badge / endIcon 同槽、gap/對齊一致)。本 child 是 **composition escape-hatch**(對齊 shadcn\n// DropdownMenuShortcut idiom),供需手動 compose children 的少數場景;它用 `ml-auto` 塞在 children\n// 內(繞過 endContent slot)。**同一 item 只用一種,勿混用**(見 spec.md 禁止事項)。\n// 視覺統一:text-caption + tracking-shortcut + fg-muted(對齊 prop 後綴 + CommandShortcut)。\nconst DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => (\n <span\n className={cn('ml-auto text-caption text-fg-muted tracking-shortcut', className)}\n {...props}\n />\n)\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut'\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 dropdownMenuMeta = {\n component: 'DropdownMenu',\n family: null, // non-family composite / overlay / layout\n variants: {\n\n },\n sizes: {\n\n },\n states: ['default', 'hover', 'active', 'focus-visible', 'disabled'],\n tokens: {\n bg: ['bg-neutral-hover', 'bg-surface-raised', 'bg-transparent'],\n fg: ['text-fg-disabled', 'text-fg-muted'],\n ring: [],\n },\n} as const\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuShortcut,\n floatingLayerClass,\n}\nexport type { SizeKey, DropdownMenuItemProps }\n"],"names":["ROW_ICON_SIZE"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './dropdown-menu';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DropdownMenu/index.ts"],"names":[],"mappings":"AAIA,cAAc,iBAAiB,CAAA"}
@@ -0,0 +1,21 @@
1
+ import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, dropdownMenuMeta, floatingLayerClass } from "./dropdown-menu.js";
2
+ export {
3
+ DropdownMenu,
4
+ DropdownMenuCheckboxItem,
5
+ DropdownMenuContent,
6
+ DropdownMenuGroup,
7
+ DropdownMenuItem,
8
+ DropdownMenuLabel,
9
+ DropdownMenuPortal,
10
+ DropdownMenuRadioGroup,
11
+ DropdownMenuRadioItem,
12
+ DropdownMenuSeparator,
13
+ DropdownMenuShortcut,
14
+ DropdownMenuSub,
15
+ DropdownMenuSubContent,
16
+ DropdownMenuSubTrigger,
17
+ DropdownMenuTrigger,
18
+ dropdownMenuMeta,
19
+ floatingLayerClass
20
+ };
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -9,7 +9,9 @@ import type { LucideIcon } from 'lucide-react';
9
9
  * 間距固定,不隨 density 變(Empty 是展示性元件,不是工作區域元件):
10
10
  * icon → text = mb-4(16px)
11
11
  * desc → action = mt-6(24px)
12
- * title → desc = `var(--item-gap-label-desc)`(token,預設 2px,item-anatomy SSOT)
12
+ * title → desc = `var(--item-gap-label-desc-reading-lg)`(reading-lg tier token,item-anatomy SSOT;bare `--item-gap-label-desc` 已 retire
13
+ *
14
+ * description 字級隨 RowSizeContext 變(sm/md → text-body 14px,lg → text-body-lg 16px)。
13
15
  *
14
16
  * Outer padding 由 consumer 容器決定(py-12 / py-6 / py-16 等)。
15
17
  */
@@ -22,6 +24,12 @@ export interface EmptyProps extends React.HTMLAttributes<HTMLDivElement> {
22
24
  description?: string;
23
25
  /** 行動按鈕(可選) */
24
26
  action?: React.ReactNode;
27
+ /**
28
+ * Disabled context(2026-06-03 加 — FileUpload disabled 等情境消費):title / description 轉
29
+ * `text-fg-disabled`(語意 disabled token,非 opacity)。icon glyph 也 → fg-disabled(icon 是文字一環);icon-circle bg 維持 muted。
30
+ * 預設 false,不影響既有 consumer。
31
+ */
32
+ disabled?: boolean;
25
33
  }
26
34
  declare const Empty: React.ForwardRefExoticComponent<EmptyProps & React.RefAttributes<HTMLDivElement>>;
27
35
  export declare const emptyMeta: {
@@ -29,10 +37,10 @@ export declare const emptyMeta: {
29
37
  readonly family: null;
30
38
  readonly variants: {};
31
39
  readonly sizes: {};
32
- readonly states: readonly ["default", "hover", "active", "focus-visible", "disabled"];
40
+ readonly states: readonly ["default", "disabled"];
33
41
  readonly tokens: {
34
42
  readonly bg: readonly [];
35
- readonly fg: readonly ["text-fg-muted", "text-fg-secondary", "text-foreground"];
43
+ readonly fg: readonly ["text-fg-muted", "text-fg-secondary", "text-foreground", "text-fg-disabled"];
36
44
  readonly ring: readonly [];
37
45
  };
38
46
  };
@@ -1 +1 @@
1
- {"version":3,"file":"empty.d.ts","sourceRoot":"","sources":["../../../src/components/Empty/empty.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAK9C;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,UAAW,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACtE,+DAA+D;IAC/D,IAAI,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC,YAAY,CAAA;IACtC,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe;IACf,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CACzB;AAED,QAAA,MAAM,KAAK,mFAsDV,CAAA;AAKD,eAAO,MAAM,SAAS;;;;;;;;;;;CAeZ,CAAA;AAEV,OAAO,EAAE,KAAK,EAAE,CAAA"}
1
+ {"version":3,"file":"empty.d.ts","sourceRoot":"","sources":["../../../src/components/Empty/empty.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAK9C;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,UAAW,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACtE,+DAA+D;IAC/D,IAAI,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC,YAAY,CAAA;IACtC,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe;IACf,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACxB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,QAAA,MAAM,KAAK,mFAuDV,CAAA;AAKD,eAAO,MAAM,SAAS;;;;;;;;;;;CAeZ,CAAA;AAEV,OAAO,EAAE,KAAK,EAAE,CAAA"}
@@ -4,7 +4,7 @@ import { cn } from "../../lib/utils.js";
4
4
  import { Avatar } from "../Avatar/avatar.js";
5
5
  import { useRowSize } from "../../patterns/element-anatomy/item-anatomy.js";
6
6
  const Empty = React.forwardRef(
7
- ({ icon, title, description, action, className, ...props }, ref) => {
7
+ ({ icon, title, description, action, disabled = false, className, ...props }, ref) => {
8
8
  const rowSize = useRowSize("md");
9
9
  const descFont = rowSize === "lg" ? "text-body-lg" : "text-body";
10
10
  let iconElement = null;
@@ -13,7 +13,7 @@ const Empty = React.forwardRef(
13
13
  iconElement = icon;
14
14
  } else {
15
15
  const Icon = icon;
16
- iconElement = /* @__PURE__ */ jsx(Avatar, { icon: Icon, size: 48, color: "neutral" });
16
+ iconElement = /* @__PURE__ */ jsx(Avatar, { icon: Icon, size: 48, color: "neutral", className: disabled ? "[&_svg]:!text-fg-disabled" : void 0 });
17
17
  }
18
18
  }
19
19
  return /* @__PURE__ */ jsxs(
@@ -24,7 +24,7 @@ const Empty = React.forwardRef(
24
24
  ...props,
25
25
  children: [
26
26
  iconElement && /* @__PURE__ */ jsx("div", { className: "mb-4", children: iconElement }),
27
- title && /* @__PURE__ */ jsx("span", { className: "text-body-lg font-medium text-foreground", children: title }),
27
+ title && /* @__PURE__ */ jsx("span", { className: cn("text-body-lg font-medium", disabled ? "text-fg-disabled" : "text-foreground"), children: title }),
28
28
  description && /* @__PURE__ */ jsx(
29
29
  "span",
30
30
  {
@@ -32,7 +32,7 @@ const Empty = React.forwardRef(
32
32
  // 字體跟 RowSizeContext 對齊:sm/md = text-body (14px),lg = text-body-lg (16px)
33
33
  // 在 menu 內自動對齊 menu items;standalone 時 fallback text-body
34
34
  descFont,
35
- title || action ? "text-fg-secondary" : "text-fg-muted",
35
+ disabled ? "text-fg-disabled" : title || action ? "text-fg-secondary" : "text-fg-muted",
36
36
  // Empty title 永遠 body-lg(16)→ 用 reading-lg token(label tier 決定)
37
37
  title && "mt-[var(--item-gap-label-desc-reading-lg)]"
38
38
  ),
@@ -52,10 +52,10 @@ const emptyMeta = {
52
52
  // non-family composite / overlay / layout
53
53
  variants: {},
54
54
  sizes: {},
55
- states: ["default", "hover", "active", "focus-visible", "disabled"],
55
+ states: ["default", "disabled"],
56
56
  tokens: {
57
57
  bg: [],
58
- fg: ["text-fg-muted", "text-fg-secondary", "text-foreground"],
58
+ fg: ["text-fg-muted", "text-fg-secondary", "text-foreground", "text-fg-disabled"],
59
59
  ring: []
60
60
  }
61
61
  };
@@ -1 +1 @@
1
- {"version":3,"file":"empty.js","sources":["../../../src/components/Empty/empty.tsx"],"sourcesContent":["import * as React from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { cn } from '@/lib/utils'\nimport { Avatar } from '@/design-system/components/Avatar/avatar'\nimport { useRowSize } from '@/design-system/patterns/element-anatomy/item-anatomy'\n\n/**\n * Empty — 空狀態視覺元件\n *\n * 居中垂直堆疊:icon(Avatar) → title → description → action。\n * 所有 slot 皆可選,預設只需 description。\n *\n * 間距固定,不隨 density 變(Empty 是展示性元件,不是工作區域元件):\n * icon → text = mb-4(16px)\n * desc → action = mt-6(24px)\n * title → desc = `var(--item-gap-label-desc)`(token,預設 2px,item-anatomy SSOT)\n *\n * Outer padding 由 consumer 容器決定(py-12 / py-6 / py-16 等)。\n */\n\nexport interface EmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n /** LucideIcon → 自動包 Avatar 48px neutral;ReactElement → 原樣渲染 */\n icon?: LucideIcon | React.ReactElement\n /** 標題(可選,font-medium,適用於首次引導) */\n title?: string\n /** 說明文字 */\n description?: string\n /** 行動按鈕(可選) */\n action?: React.ReactNode\n}\n\nconst Empty = React.forwardRef<HTMLDivElement, EmptyProps>(\n ({ icon, title, description, action, className, ...props }, ref) => {\n // 字體 tier:讀 RowSizeContext(menu 內自動對齊 menu items 的字體)\n // 沒有 context(standalone)→ fallback 'md' → text-body (14px)\n const rowSize = useRowSize('md')\n const descFont = rowSize === 'lg' ? 'text-body-lg' : 'text-body'\n\n // Icon rendering: ReactElement → as-is;LucideIcon(component,包括 forwardRef 物件)→ 包 Avatar\n // 注意:Lucide v0.577+ icons 是 forwardRef 物件(`typeof === 'object'`),不是 function。\n // 必用 React.isValidElement 判斷 element vs component(typeof 會把 forwardRef 物件誤歸 object)。\n let iconElement: React.ReactNode = null\n if (icon) {\n if (React.isValidElement(icon)) {\n iconElement = icon\n } else {\n const Icon = icon as LucideIcon\n iconElement = <Avatar icon={Icon} size={48} color=\"neutral\" />\n }\n }\n\n return (\n <div\n ref={ref}\n className={cn('flex flex-col items-center text-center', className)}\n {...props}\n >\n {iconElement && (\n <div className=\"mb-4\">{iconElement}</div>\n )}\n {title && (\n <span className=\"text-body-lg font-medium text-foreground\">\n {title}\n </span>\n )}\n {description && (\n <span\n className={cn(\n // 字體跟 RowSizeContext 對齊:sm/md = text-body (14px),lg = text-body-lg (16px)\n // 在 menu 內自動對齊 menu items;standalone 時 fallback text-body\n descFont,\n (title || action) ? 'text-fg-secondary' : 'text-fg-muted',\n // Empty title 永遠 body-lg(16)→ 用 reading-lg token(label tier 決定)\n title && 'mt-[var(--item-gap-label-desc-reading-lg)]',\n )}\n >\n {description}\n </span>\n )}\n {action && (\n <div className=\"mt-6\">{action}</div>\n )}\n </div>\n )\n },\n)\nEmpty.displayName = 'Empty'\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 emptyMeta = {\n component: 'Empty',\n family: null, // non-family composite / overlay / layout\n variants: {\n\n },\n sizes: {\n\n },\n states: ['default', 'hover', 'active', 'focus-visible', 'disabled'],\n tokens: {\n bg: [],\n fg: ['text-fg-muted', 'text-fg-secondary', 'text-foreground'],\n ring: [],\n },\n} as const\n\nexport { Empty }\n"],"names":[],"mappings":";;;;;AA+BA,MAAM,QAAQ,MAAM;AAAA,EAClB,CAAC,EAAE,MAAM,OAAO,aAAa,QAAQ,WAAW,GAAG,MAAA,GAAS,QAAQ;AAGlE,UAAM,UAAU,WAAW,IAAI;AAC/B,UAAM,WAAW,YAAY,OAAO,iBAAiB;AAKrD,QAAI,cAA+B;AACnC,QAAI,MAAM;AACR,UAAI,MAAM,eAAe,IAAI,GAAG;AAC9B,sBAAc;AAAA,MAChB,OAAO;AACL,cAAM,OAAO;AACb,0CAAe,QAAA,EAAO,MAAM,MAAM,MAAM,IAAI,OAAM,WAAU;AAAA,MAC9D;AAAA,IACF;AAEA,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,WAAW,GAAG,0CAA0C,SAAS;AAAA,QAChE,GAAG;AAAA,QAEH,UAAA;AAAA,UAAA,eACC,oBAAC,OAAA,EAAI,WAAU,QAAQ,UAAA,aAAY;AAAA,UAEpC,SACC,oBAAC,QAAA,EAAK,WAAU,4CACb,UAAA,OACH;AAAA,UAED,eACC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW;AAAA;AAAA;AAAA,gBAGT;AAAA,gBACC,SAAS,SAAU,sBAAsB;AAAA;AAAA,gBAE1C,SAAS;AAAA,cAAA;AAAA,cAGV,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGJ,UACC,oBAAC,OAAA,EAAI,WAAU,QAAQ,UAAA,OAAA,CAAO;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAItC;AACF;AACA,MAAM,cAAc;AAIb,MAAM,YAAY;AAAA,EACvB,WAAW;AAAA,EACX,QAAQ;AAAA;AAAA,EACR,UAAU,CAAA;AAAA,EAGV,OAAO,CAAA;AAAA,EAGP,QAAQ,CAAC,WAAW,SAAS,UAAU,iBAAiB,UAAU;AAAA,EAClE,QAAQ;AAAA,IACN,IAAI,CAAA;AAAA,IACJ,IAAI,CAAC,iBAAiB,qBAAqB,iBAAiB;AAAA,IAC5D,MAAM,CAAA;AAAA,EAAC;AAEX;"}
1
+ {"version":3,"file":"empty.js","sources":["../../../src/components/Empty/empty.tsx"],"sourcesContent":["import * as React from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { cn } from '@/lib/utils'\nimport { Avatar } from '@/design-system/components/Avatar/avatar'\nimport { useRowSize } from '@/design-system/patterns/element-anatomy/item-anatomy'\n\n/**\n * Empty — 空狀態視覺元件\n *\n * 居中垂直堆疊:icon(Avatar) → title → description → action。\n * 所有 slot 皆可選,預設只需 description。\n *\n * 間距固定,不隨 density 變(Empty 是展示性元件,不是工作區域元件):\n * icon → text = mb-4(16px)\n * desc → action = mt-6(24px)\n * title → desc = `var(--item-gap-label-desc-reading-lg)`(reading-lg tier token,item-anatomy SSOT;bare `--item-gap-label-desc` 已 retire)\n *\n * description 字級隨 RowSizeContext 變(sm/md → text-body 14px,lg → text-body-lg 16px)。\n *\n * Outer padding 由 consumer 容器決定(py-12 / py-6 / py-16 等)。\n */\n\nexport interface EmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n /** LucideIcon → 自動包 Avatar 48px neutral;ReactElement → 原樣渲染 */\n icon?: LucideIcon | React.ReactElement\n /** 標題(可選,font-medium,適用於首次引導) */\n title?: string\n /** 說明文字 */\n description?: string\n /** 行動按鈕(可選) */\n action?: React.ReactNode\n /**\n * Disabled context(2026-06-03 加 — FileUpload disabled 等情境消費):title / description 轉\n * `text-fg-disabled`(語意 disabled token,非 opacity)。icon glyph 也 → fg-disabled(icon 是文字一環);icon-circle bg 維持 muted。\n * 預設 false,不影響既有 consumer。\n */\n disabled?: boolean\n}\n\nconst Empty = React.forwardRef<HTMLDivElement, EmptyProps>(\n ({ icon, title, description, action, disabled = false, className, ...props }, ref) => {\n // 字體 tier:讀 RowSizeContext(menu 內自動對齊 menu items 的字體)\n // 沒有 context(standalone)→ fallback 'md' → text-body (14px)\n const rowSize = useRowSize('md')\n const descFont = rowSize === 'lg' ? 'text-body-lg' : 'text-body'\n\n // Icon rendering: ReactElement → as-is;LucideIcon(component,包括 forwardRef 物件)→ 包 Avatar\n // 注意:Lucide v0.577+ icons 是 forwardRef 物件(`typeof === 'object'`),不是 function。\n // 必用 React.isValidElement 判斷 element vs component(typeof 會把 forwardRef 物件誤歸 object)。\n let iconElement: React.ReactNode = null\n if (icon) {\n if (React.isValidElement(icon)) {\n iconElement = icon\n } else {\n const Icon = icon as LucideIcon\n // disabled:glyph → fg-disabled([&_svg]:!… 蓋過 Avatar 內聯 color;circle bg 維持 muted)。icon 是文字一環,隨 disabled 變淡。\n iconElement = <Avatar icon={Icon} size={48} color=\"neutral\" className={disabled ? '[&_svg]:!text-fg-disabled' : undefined} />\n }\n }\n\n return (\n <div\n ref={ref}\n className={cn('flex flex-col items-center text-center', className)}\n {...props}\n >\n {iconElement && (\n <div className=\"mb-4\">{iconElement}</div>\n )}\n {title && (\n <span className={cn('text-body-lg font-medium', disabled ? 'text-fg-disabled' : 'text-foreground')}>\n {title}\n </span>\n )}\n {description && (\n <span\n className={cn(\n // 字體跟 RowSizeContext 對齊:sm/md = text-body (14px),lg = text-body-lg (16px)\n // 在 menu 內自動對齊 menu items;standalone 時 fallback text-body\n descFont,\n disabled ? 'text-fg-disabled' : (title || action) ? 'text-fg-secondary' : 'text-fg-muted',\n // Empty title 永遠 body-lg(16)→ 用 reading-lg token(label tier 決定)\n title && 'mt-[var(--item-gap-label-desc-reading-lg)]',\n )}\n >\n {description}\n </span>\n )}\n {action && (\n <div className=\"mt-6\">{action}</div>\n )}\n </div>\n )\n },\n)\nEmpty.displayName = 'Empty'\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 emptyMeta = {\n component: 'Empty',\n family: null, // non-family composite / overlay / layout\n variants: {\n\n },\n sizes: {\n\n },\n states: ['default', 'disabled'],\n tokens: {\n bg: [],\n fg: ['text-fg-muted', 'text-fg-secondary', 'text-foreground', 'text-fg-disabled'],\n ring: [],\n },\n} as const\n\nexport { Empty }\n"],"names":[],"mappings":";;;;;AAuCA,MAAM,QAAQ,MAAM;AAAA,EAClB,CAAC,EAAE,MAAM,OAAO,aAAa,QAAQ,WAAW,OAAO,WAAW,GAAG,MAAA,GAAS,QAAQ;AAGpF,UAAM,UAAU,WAAW,IAAI;AAC/B,UAAM,WAAW,YAAY,OAAO,iBAAiB;AAKrD,QAAI,cAA+B;AACnC,QAAI,MAAM;AACR,UAAI,MAAM,eAAe,IAAI,GAAG;AAC9B,sBAAc;AAAA,MAChB,OAAO;AACL,cAAM,OAAO;AAEb,sBAAc,oBAAC,QAAA,EAAO,MAAM,MAAM,MAAM,IAAI,OAAM,WAAU,WAAW,WAAW,8BAA8B,OAAA,CAAW;AAAA,MAC7H;AAAA,IACF;AAEA,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,WAAW,GAAG,0CAA0C,SAAS;AAAA,QAChE,GAAG;AAAA,QAEH,UAAA;AAAA,UAAA,eACC,oBAAC,OAAA,EAAI,WAAU,QAAQ,UAAA,aAAY;AAAA,UAEpC,SACC,oBAAC,QAAA,EAAK,WAAW,GAAG,4BAA4B,WAAW,qBAAqB,iBAAiB,GAC9F,UAAA,MAAA,CACH;AAAA,UAED,eACC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW;AAAA;AAAA;AAAA,gBAGT;AAAA,gBACA,WAAW,qBAAsB,SAAS,SAAU,sBAAsB;AAAA;AAAA,gBAE1E,SAAS;AAAA,cAAA;AAAA,cAGV,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGJ,UACC,oBAAC,OAAA,EAAI,WAAU,QAAQ,UAAA,OAAA,CAAO;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAItC;AACF;AACA,MAAM,cAAc;AAIb,MAAM,YAAY;AAAA,EACvB,WAAW;AAAA,EACX,QAAQ;AAAA;AAAA,EACR,UAAU,CAAA;AAAA,EAGV,OAAO,CAAA;AAAA,EAGP,QAAQ,CAAC,WAAW,UAAU;AAAA,EAC9B,QAAQ;AAAA,IACN,IAAI,CAAA;AAAA,IACJ,IAAI,CAAC,iBAAiB,qBAAqB,mBAAmB,kBAAkB;AAAA,IAChF,MAAM,CAAA;AAAA,EAAC;AAEX;"}
@@ -0,0 +1,2 @@
1
+ export * from './empty';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Empty/index.ts"],"names":[],"mappings":"AAIA,cAAc,SAAS,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { Empty, emptyMeta } from "./empty.js";
2
+ export {
3
+ Empty,
4
+ emptyMeta
5
+ };
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -74,4 +74,53 @@ export declare function TableScrollProvider({ isScrolling, children, }: {
74
74
  isScrolling: boolean;
75
75
  children: React.ReactNode;
76
76
  }): React.ReactElement;
77
+ /**
78
+ * Resolve Field control size — 控件用此 helper 取代散落的 `sizeProp ?? fieldCtx?.size ?? 'md'`。
79
+ * 優先序:prop(caller 顯式)> FieldContext.size(真 <Field> wrapper)> surface-size(host 如 cell)> 'md'。
80
+ * 真 <Field> 永遠勝 host surface(安全序);cell 無 Field wrapper(fieldCtx=null)→ 自動接 surface-size,
81
+ * 漏傳 size 的新 cell 也字級一致。
82
+ */
83
+ export declare function useResolvedFieldSize<T extends string = FieldSize>(sizeProp?: T | null, fallback?: T): T;
84
+ /**
85
+ * Resolve Field control 的 **disabled** — 取代散落的 `disabledProp ?? fieldCtx?.disabled`(2026-06-08 SSOT)。
86
+ * 優先序:顯式 prop > FieldContext.disabled(`<Field disabled>` / `<Field mode="disabled">`)> false。
87
+ * **caller 必傳「未預設」的原始 prop**(沒傳 = undefined),否則 `disabled=false` 預設會吃掉 `??` fallback。
88
+ * DataTable cell 無 FieldContext(fieldCtx=null)→ 回 prop 或 false,行為與現況完全一致(inert)。
89
+ */
90
+ export declare function useResolvedFieldDisabled(disabledProp?: boolean | null): boolean;
91
+ /**
92
+ * Resolve Field control 的 **mode**(display / readonly / disabled / edit)— 2026-06-08 SSOT,統一兩派散落:
93
+ * 舊 Input 派 `modeProp ?? fieldCtx?.mode ?? (...)` → `<Field disabled>` 時 ctx.mode 仍 'edit',漏 disabled chrome。
94
+ * 舊 picker 派 `disabled ? 'disabled' : mode`(mode 預設 'edit')→ 完全不讀 fieldCtx.mode,`<Field mode="display">` 失效。
95
+ * 統一優先序(world-class:MUI FormControl disabled 完整 cascade + 顯式 prop 永遠最優先):
96
+ * 1. 顯式 mode prop(caller / DataTable cell 的 displayOrDisabled)→ **永遠最優先**,故表格等顯式場景 inert
97
+ * 2. 有效 disabled(prop 或 `<Field disabled>`)→ 'disabled'(完整 disabled chrome)
98
+ * 3. FieldContext.mode(`<Field mode="display"/"readonly">`)→ 讓 mode cascade 真正生效
99
+ * 4. 本地 readOnly → 'readonly'
100
+ * 5. 'edit'
101
+ * cell:mode prop 必有 → step 1 命中、fieldCtx=null → 完全 inert(Δ=0)。`disabled` 傳已 resolve 的 boolean 或未預設 prop。
102
+ */
103
+ export declare function useResolvedFieldMode({ mode, disabled, readOnly, }: {
104
+ mode?: FieldMode | null;
105
+ disabled?: boolean | null;
106
+ readOnly?: boolean;
107
+ }): FieldMode;
108
+ /**
109
+ * Resolve Field control 的 **variant**(default / bare / naked 視覺外殼)— 2026-06-08 SSOT。
110
+ * 優先序:顯式 prop > FieldContext.variant > 'default'。與既有各控件公式一字不差(Δ=0),統一以利 gate 強制。
111
+ */
112
+ export declare function useResolvedFieldVariant(variantProp?: FieldVariant | null): FieldVariant;
113
+ /**
114
+ * Resolve Field control 的 **error/invalid** — 取代散落的 `errorProp || (fieldCtx?.invalid ?? false)`(2026-06-08 SSOT)。
115
+ * 自身 error prop **或** FieldContext.invalid(`<Field invalid>`)任一為真即 error。與既有公式一致(Δ=0)。
116
+ */
117
+ export declare function useResolvedFieldInvalid(errorProp?: boolean): boolean;
118
+ /**
119
+ * Host(non-Field-wrapper,如 DataTable cell)注 surface density size 給 child Field controls。
120
+ * 僅注 size 視覺訊號,不污染 FieldContext。Usage:cell-registry buildCellWithSurface。
121
+ */
122
+ export declare function FieldSurfaceSizeProvider({ size, children, }: {
123
+ size: FieldSize;
124
+ children: React.ReactNode;
125
+ }): React.ReactElement;
77
126
  //# sourceMappingURL=field-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"field-context.d.ts","sourceRoot":"","sources":["../../../src/components/Field/field-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAG5D,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,CAAA;AACvC,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,YAAY,CAAA;AACxD,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAC1C,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,OAAO,CAAA;AAEnD;;;;;;;;;GASG;AACH,KAAK,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,YAAY,CAAA;AAGrD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV;;wEAEoE;IACpE,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,SAAS,CAAA;IACf;mFAC+E;IAC/E,OAAO,EAAE,YAAY,CAAA;IACrB,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,SAAS,CAAA;IACf,WAAW,EAAE,gBAAgB,CAAA;IAC7B,aAAa,EAAE,kBAAkB,CAAA;IACjC,eAAe,EAAE,IAAI,CAAA;IACrB;;qDAEiD;IACjD,OAAO,CAAC,EAAE,YAAY,CAAA;CACvB;AAED,eAAO,MAAM,YAAY,yCAAsD,CAAA;AAE/E,uEAAuE;AACvE,wBAAgB,eAAe,IAAI,iBAAiB,GAAG,IAAI,CAE1D;AAgBD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAK9C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,OAAO,EACP,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,YAAY,CAAA;IACrB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B,GAAG,KAAK,CAAC,YAAY,CAErB;AAkBD,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED,wBAAgB,mBAAmB,CAAC,EAClC,WAAW,EACX,QAAQ,GACT,EAAE;IACD,WAAW,EAAE,OAAO,CAAA;IACpB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B,GAAG,KAAK,CAAC,YAAY,CAErB"}
1
+ {"version":3,"file":"field-context.d.ts","sourceRoot":"","sources":["../../../src/components/Field/field-context.ts"],"names":[],"mappings":"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"}
@@ -26,12 +26,54 @@ function TableScrollProvider({
26
26
  }) {
27
27
  return React.createElement(TableScrollContext.Provider, { value: isScrolling }, children);
28
28
  }
29
+ const FieldSurfaceSizeContext = React.createContext(null);
30
+ function useResolvedFieldSize(sizeProp, fallback) {
31
+ const fieldCtx = React.useContext(FieldContext);
32
+ const surfaceSize = React.useContext(FieldSurfaceSizeContext);
33
+ return sizeProp ?? (fieldCtx == null ? void 0 : fieldCtx.size) ?? surfaceSize ?? fallback ?? "md";
34
+ }
35
+ function useResolvedFieldDisabled(disabledProp) {
36
+ const fieldCtx = React.useContext(FieldContext);
37
+ return disabledProp ?? (fieldCtx == null ? void 0 : fieldCtx.disabled) ?? false;
38
+ }
39
+ function useResolvedFieldMode({
40
+ mode,
41
+ disabled,
42
+ readOnly
43
+ }) {
44
+ const fieldCtx = React.useContext(FieldContext);
45
+ if (mode) return mode;
46
+ if ((disabled ?? (fieldCtx == null ? void 0 : fieldCtx.disabled)) === true) return "disabled";
47
+ if (fieldCtx == null ? void 0 : fieldCtx.mode) return fieldCtx.mode;
48
+ if (readOnly) return "readonly";
49
+ return "edit";
50
+ }
51
+ function useResolvedFieldVariant(variantProp) {
52
+ const fieldCtx = React.useContext(FieldContext);
53
+ return variantProp ?? (fieldCtx == null ? void 0 : fieldCtx.variant) ?? "default";
54
+ }
55
+ function useResolvedFieldInvalid(errorProp) {
56
+ const fieldCtx = React.useContext(FieldContext);
57
+ return Boolean(errorProp) || ((fieldCtx == null ? void 0 : fieldCtx.invalid) ?? false);
58
+ }
59
+ function FieldSurfaceSizeProvider({
60
+ size,
61
+ children
62
+ }) {
63
+ return React.createElement(FieldSurfaceSizeContext.Provider, { value: size }, children);
64
+ }
29
65
  export {
30
66
  FieldContext,
31
67
  FieldSurfaceProvider,
68
+ FieldSurfaceSizeProvider,
32
69
  TableScrollProvider,
33
70
  useFieldContext,
34
71
  useFieldSurface,
72
+ useResolvedFieldDisabled,
73
+ useResolvedFieldInvalid,
74
+ useResolvedFieldMode,
75
+ useResolvedFieldSize,
76
+ useResolvedFieldVariant,
35
77
  useTableIsScrolling
36
78
  };
37
79
  //# sourceMappingURL=field-context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"field-context.js","sources":["../../../src/components/Field/field-context.ts"],"sourcesContent":["import * as React from 'react'\nimport type { FieldMode, FieldVariant } from './field-types'\n\n// ── Types ──\nexport type { FieldMode, FieldVariant }\nexport type FieldOrientation = 'vertical' | 'horizontal'\nexport type FieldSize = 'sm' | 'md' | 'lg'\nexport type FieldControlLayout = 'inline' | 'block'\n\n/**\n * Field surface(2026-05-12 codex Q2 verdict — Stream C 4-issues Cluster B fix):\n * 替代散落的 `variant === 'naked'` 判 cell heuristic,讓 Field family components\n * 顯式 query「我在哪 surface」derive cell-specific padding / alignment / overflow。\n *\n * - `'form'`(default)— Standalone Field control(對齊 Polaris / Material Form idiom)\n * - `'toolbar'`— Toolbar / Action bar inline Field(future,目前無 consumer)\n * - `'table-cell'`— DataTable cell-as-input substrate(取代 variant='naked' cell-detection\n * heuristic;canonical metrics 由 surface 推導,不再 hardcode in Field consumer)\n */\ntype FieldSurface = 'form' | 'toolbar' | 'table-cell'\n\n// ── Context ──\nexport interface FieldContextValue {\n id: string\n /** a11y(2026-04-25):FieldLabel 渲染時若元素為 div-based role(combobox/slider\n * 等非 native form control),`<label for>` 無效,需 aria-labelledby 指向 labelId。\n * FieldLabel 自動設 id={labelId},下游 control 可讀此值寫入 aria-labelledby。 */\n labelId: string\n descriptionId: string\n errorId: string\n mode: FieldMode\n /** 視覺外殼透傳(2026-05-05)。default = 含 border+bg;bare = 透明 variant,hover/focus reveal。\n * child Field control 自動繼承,per-control prop override 可覆寫。詳 field-types.ts。 */\n variant: FieldVariant\n disabled: boolean\n required: boolean\n invalid: boolean\n size: FieldSize\n orientation: FieldOrientation\n controlLayout: FieldControlLayout\n hasFieldWrapper: true\n /** 2026-05-12 Stream C Cluster B fix:surface 上下文(form / toolbar / table-cell)\n * 從 host(Field wrapper / DataTable cell registry)propagate 給 child controls。\n * Optional — 未設視同 `'form'`(backward compat)。 */\n surface?: FieldSurface\n}\n\nexport const FieldContext = React.createContext<FieldContextValue | null>(null)\n\n/** 讓 primitive(Checkbox/Switch/Radio/Button/Input 等)讀 Field context */\nexport function useFieldContext(): FieldContextValue | null {\n return React.useContext(FieldContext)\n}\n\n/**\n * Surface context — **獨立於 FieldContext** 的 surface signal(2026-05-12 v2 fix)。\n *\n * 原 v1 設計(`FieldSurfaceProvider` 透過 FieldContext.Provider 注入)誤把 stub\n * `hasFieldWrapper: true` 傳給沒有真正 Field wrapper 的場景(例 DataTable cell 內 standalone\n * DatePicker),導致 cells 誤以為有 Field 父 → 視覺 regression(2026-05-12 visual-audit 抓 3\n * stories 超過 baseline budget:DatePicker range-picker / FileViewer open-snapshot /\n * DataTable pinned-columns)。\n *\n * v2 修:**完全分離** FieldSurfaceContext;FieldContext 不被污染;non-FieldWrapper hosts\n * 只能影響 surface signal,不能假冒 Field wrapper 身份。\n */\nconst FieldSurfaceContext = React.createContext<FieldSurface | null>(null)\n\n/**\n * Helper: 取當前 surface,fall back 'form'。\n *\n * Stream C Cluster B canonical entry point — Field family controls 用此 helper 替代\n * 散落的 `variant === 'naked'` cell heuristic。對齊 codex Q2 verdict「surface context」\n * canonical(替代「inCellContext per-prop」反 pattern)。\n *\n * 優先順序:FieldSurfaceContext(host-provided) → FieldContext.surface(Field-wrapper-provided)\n * → fallback 'form'。\n */\nexport function useFieldSurface(): FieldSurface {\n const surfaceCtx = React.useContext(FieldSurfaceContext)\n if (surfaceCtx) return surfaceCtx\n const fieldCtx = React.useContext(FieldContext)\n return fieldCtx?.surface ?? 'form'\n}\n\n/**\n * Standalone FieldSurface provider — 給 host(non-Field-wrapper, 如 DataTable cell)\n * **僅**設 surface signal,**不**污染 FieldContext。\n *\n * Usage(per cell-registry.tsx,2026-05-12):\n * <FieldSurfaceProvider surface=\"table-cell\"><Field control /></FieldSurfaceProvider>\n *\n * 與 FieldContext.Provider 差別:\n * - FieldContext.Provider — 完整 Field wrapper 用,provides mode/variant/disabled/...\n * - FieldSurfaceProvider — host **僅**注 surface signal,Field controls 透過\n * `useFieldSurface()` 讀;`useFieldContext()` 仍 returns null(沒被假冒)。\n */\nexport function FieldSurfaceProvider({\n surface,\n children,\n}: {\n surface: FieldSurface\n children: React.ReactNode\n}): React.ReactElement {\n return React.createElement(FieldSurfaceContext.Provider, { value: surface }, children)\n}\n\n/**\n * 2026-05-13 (c) scroll-defer perf SSOT(per codex DataTable perf brief V3 + user 拍板\n * 「Roadmap still >50ms 進 (c)」):\n * Host(DataTable)在 virtualizer.isScrolling=true 期間 wrap children with `TableScrollProvider`,\n * 重 cell 組件(Avatar HoverCard / PeoplePicker / etc.)讀此 signal 跳過昂貴 subtree(如 HoverCard\n * Portal + useDocumentTheme observer),scroll 結束 unset → 重渲染為完整 affordance。\n *\n * 對齊 codex Profile Plan step 6(Scripting vs Layout 判分):scrolling 期間 cell 渲染壓縮 →\n * 240ms/frame catastrophe → close to 50ms target。世界級對齊:AG Grid `deferRender` for slow\n * React cell components / MUI X DataGrid scroll-defer hover affordance。\n *\n * 不放在 FieldSurfaceContext 內(避免 value object identity drift on scroll → 全 cell 重渲)\n * — 用獨立 Context,value = boolean primitive(stable when unchanged)。\n */\nconst TableScrollContext = React.createContext<boolean>(false)\n\nexport function useTableIsScrolling(): boolean {\n return React.useContext(TableScrollContext)\n}\n\nexport function TableScrollProvider({\n isScrolling,\n children,\n}: {\n isScrolling: boolean\n children: React.ReactNode\n}): React.ReactElement {\n return React.createElement(TableScrollContext.Provider, { value: isScrolling }, children)\n}\n"],"names":[],"mappings":";AA+CO,MAAM,eAAe,MAAM,cAAwC,IAAI;AAGvE,SAAS,kBAA4C;AAC1D,SAAO,MAAM,WAAW,YAAY;AACtC;AAcA,MAAM,sBAAsB,MAAM,cAAmC,IAAI;AAYlE,SAAS,kBAAgC;AAC9C,QAAM,aAAa,MAAM,WAAW,mBAAmB;AACvD,MAAI,WAAY,QAAO;AACvB,QAAM,WAAW,MAAM,WAAW,YAAY;AAC9C,UAAO,qCAAU,YAAW;AAC9B;AAcO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AACF,GAGuB;AACrB,SAAO,MAAM,cAAc,oBAAoB,UAAU,EAAE,OAAO,QAAA,GAAW,QAAQ;AACvF;AAgBA,MAAM,qBAAqB,MAAM,cAAuB,KAAK;AAEtD,SAAS,sBAA+B;AAC7C,SAAO,MAAM,WAAW,kBAAkB;AAC5C;AAEO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AACF,GAGuB;AACrB,SAAO,MAAM,cAAc,mBAAmB,UAAU,EAAE,OAAO,YAAA,GAAe,QAAQ;AAC1F;"}
1
+ {"version":3,"file":"field-context.js","sources":["../../../src/components/Field/field-context.ts"],"sourcesContent":["import * as React from 'react'\nimport type { FieldMode, FieldVariant } from './field-types'\n\n// ── Types ──\nexport type { FieldMode, FieldVariant }\nexport type FieldOrientation = 'vertical' | 'horizontal'\nexport type FieldSize = 'sm' | 'md' | 'lg'\nexport type FieldControlLayout = 'inline' | 'block'\n\n/**\n * Field surface(2026-05-12 codex Q2 verdict — Stream C 4-issues Cluster B fix):\n * 替代散落的 `variant === 'naked'` 判 cell heuristic,讓 Field family components\n * 顯式 query「我在哪 surface」derive cell-specific padding / alignment / overflow。\n *\n * - `'form'`(default)— Standalone Field control(對齊 Polaris / Material Form idiom)\n * - `'toolbar'`— Toolbar / Action bar inline Field(future,目前無 consumer)\n * - `'table-cell'`— DataTable cell-as-input substrate(取代 variant='naked' cell-detection\n * heuristic;canonical metrics 由 surface 推導,不再 hardcode in Field consumer)\n */\ntype FieldSurface = 'form' | 'toolbar' | 'table-cell'\n\n// ── Context ──\nexport interface FieldContextValue {\n id: string\n /** a11y(2026-04-25):FieldLabel 渲染時若元素為 div-based role(combobox/slider\n * 等非 native form control),`<label for>` 無效,需 aria-labelledby 指向 labelId。\n * FieldLabel 自動設 id={labelId},下游 control 可讀此值寫入 aria-labelledby。 */\n labelId: string\n descriptionId: string\n errorId: string\n mode: FieldMode\n /** 視覺外殼透傳(2026-05-05)。default = 含 border+bg;bare = 透明 variant,hover/focus reveal。\n * child Field control 自動繼承,per-control prop override 可覆寫。詳 field-types.ts。 */\n variant: FieldVariant\n disabled: boolean\n required: boolean\n invalid: boolean\n size: FieldSize\n orientation: FieldOrientation\n controlLayout: FieldControlLayout\n hasFieldWrapper: true\n /** 2026-05-12 Stream C Cluster B fix:surface 上下文(form / toolbar / table-cell)\n * 從 host(Field wrapper / DataTable cell registry)propagate 給 child controls。\n * Optional — 未設視同 `'form'`(backward compat)。 */\n surface?: FieldSurface\n}\n\nexport const FieldContext = React.createContext<FieldContextValue | null>(null)\n\n/** 讓 primitive(Checkbox/Switch/Radio/Button/Input 等)讀 Field context */\nexport function useFieldContext(): FieldContextValue | null {\n return React.useContext(FieldContext)\n}\n\n/**\n * Surface context — **獨立於 FieldContext** 的 surface signal(2026-05-12 v2 fix)。\n *\n * 原 v1 設計(`FieldSurfaceProvider` 透過 FieldContext.Provider 注入)誤把 stub\n * `hasFieldWrapper: true` 傳給沒有真正 Field wrapper 的場景(例 DataTable cell 內 standalone\n * DatePicker),導致 cells 誤以為有 Field 父 → 視覺 regression(2026-05-12 visual-audit 抓 3\n * stories 超過 baseline budget:DatePicker range-picker / FileViewer open-snapshot /\n * DataTable pinned-columns)。\n *\n * v2 修:**完全分離** FieldSurfaceContext;FieldContext 不被污染;non-FieldWrapper hosts\n * 只能影響 surface signal,不能假冒 Field wrapper 身份。\n */\nconst FieldSurfaceContext = React.createContext<FieldSurface | null>(null)\n\n/**\n * Helper: 取當前 surface,fall back 'form'。\n *\n * Stream C Cluster B canonical entry point — Field family controls 用此 helper 替代\n * 散落的 `variant === 'naked'` cell heuristic。對齊 codex Q2 verdict「surface context」\n * canonical(替代「inCellContext per-prop」反 pattern)。\n *\n * 優先順序:FieldSurfaceContext(host-provided) → FieldContext.surface(Field-wrapper-provided)\n * → fallback 'form'。\n */\nexport function useFieldSurface(): FieldSurface {\n const surfaceCtx = React.useContext(FieldSurfaceContext)\n if (surfaceCtx) return surfaceCtx\n const fieldCtx = React.useContext(FieldContext)\n return fieldCtx?.surface ?? 'form'\n}\n\n/**\n * Standalone FieldSurface provider — 給 host(non-Field-wrapper, 如 DataTable cell)\n * **僅**設 surface signal,**不**污染 FieldContext。\n *\n * Usage(per cell-registry.tsx,2026-05-12):\n * <FieldSurfaceProvider surface=\"table-cell\"><Field control /></FieldSurfaceProvider>\n *\n * 與 FieldContext.Provider 差別:\n * - FieldContext.Provider — 完整 Field wrapper 用,provides mode/variant/disabled/...\n * - FieldSurfaceProvider — host **僅**注 surface signal,Field controls 透過\n * `useFieldSurface()` 讀;`useFieldContext()` 仍 returns null(沒被假冒)。\n */\nexport function FieldSurfaceProvider({\n surface,\n children,\n}: {\n surface: FieldSurface\n children: React.ReactNode\n}): React.ReactElement {\n return React.createElement(FieldSurfaceContext.Provider, { value: surface }, children)\n}\n\n/**\n * 2026-05-13 (c) scroll-defer perf SSOT(per codex DataTable perf brief V3 + user 拍板\n * 「Roadmap still >50ms 進 (c)」):\n * Host(DataTable)在 virtualizer.isScrolling=true 期間 wrap children with `TableScrollProvider`,\n * 重 cell 組件(Avatar HoverCard / PeoplePicker / etc.)讀此 signal 跳過昂貴 subtree(如 HoverCard\n * Portal + useDocumentTheme observer),scroll 結束 unset → 重渲染為完整 affordance。\n *\n * 對齊 codex Profile Plan step 6(Scripting vs Layout 判分):scrolling 期間 cell 渲染壓縮 →\n * 240ms/frame catastrophe → close to 50ms target。世界級對齊:AG Grid `deferRender` for slow\n * React cell components / MUI X DataGrid scroll-defer hover affordance。\n *\n * 不放在 FieldSurfaceContext 內(避免 value object identity drift on scroll → 全 cell 重渲)\n * — 用獨立 Context,value = boolean primitive(stable when unchanged)。\n */\nconst TableScrollContext = React.createContext<boolean>(false)\n\nexport function useTableIsScrolling(): boolean {\n return React.useContext(TableScrollContext)\n}\n\nexport function TableScrollProvider({\n isScrolling,\n children,\n}: {\n isScrolling: boolean\n children: React.ReactNode\n}): React.ReactElement {\n return React.createElement(TableScrollContext.Provider, { value: isScrolling }, children)\n}\n\n/**\n * Surface size signal — 獨立於 FieldContext + FieldSurfaceContext 的純視覺 size context(2026-06-08)。\n * 讓 host(DataTable cell substrate)把「這片 surface 的 density size」propagate 給 child Field controls,\n * 未來新 cell 漏傳 size prop 也自動繼承 → 字級一致(根治 StringCell/NumberCell 漏傳 size class)。\n *\n * 不放進 FieldSurfaceContext value(避免 string→object identity drift on scroll → 全 cell 重渲,\n * 同 TableScrollContext L119-121 canonical)— 獨立 Context,value = FieldSize primitive(stable when unchanged)。\n * 絕不污染 FieldContext:不碰 hasFieldWrapper/mode/invalid/disabled,useFieldContext() 在 cell 內仍 null。\n */\nconst FieldSurfaceSizeContext = React.createContext<FieldSize | null>(null)\n\n/**\n * Resolve Field control size — 控件用此 helper 取代散落的 `sizeProp ?? fieldCtx?.size ?? 'md'`。\n * 優先序:prop(caller 顯式)> FieldContext.size(真 <Field> wrapper)> surface-size(host 如 cell)> 'md'。\n * 真 <Field> 永遠勝 host surface(安全序);cell 無 Field wrapper(fieldCtx=null)→ 自動接 surface-size,\n * 漏傳 size 的新 cell 也字級一致。\n */\nexport function useResolvedFieldSize<T extends string = FieldSize>(sizeProp?: T | null, fallback?: T): T {\n const fieldCtx = React.useContext(FieldContext)\n const surfaceSize = React.useContext(FieldSurfaceSizeContext)\n // generic T(預設 FieldSize)讓非-input 控件(SegmentedControl/Rating 的 'xs'|'sm'|'md'|'lg' 超集、各自 fallback)\n // 也走同一 SSOT resolution。fieldCtx.size/surfaceSize 為 FieldSize(T 的子集)→ widen cast 安全。\n // fallback 未傳預設 'md'(input-class 控件向後相容);Rating 傳 'xs'、SegmentedControl 傳 'md'。\n return (sizeProp ?? (fieldCtx?.size as T | undefined) ?? (surfaceSize as T | undefined) ?? fallback ?? ('md' as T))\n}\n\n/**\n * Resolve Field control 的 **disabled** — 取代散落的 `disabledProp ?? fieldCtx?.disabled`(2026-06-08 SSOT)。\n * 優先序:顯式 prop > FieldContext.disabled(`<Field disabled>` / `<Field mode=\"disabled\">`)> false。\n * **caller 必傳「未預設」的原始 prop**(沒傳 = undefined),否則 `disabled=false` 預設會吃掉 `??` fallback。\n * DataTable cell 無 FieldContext(fieldCtx=null)→ 回 prop 或 false,行為與現況完全一致(inert)。\n */\nexport function useResolvedFieldDisabled(disabledProp?: boolean | null): boolean {\n const fieldCtx = React.useContext(FieldContext)\n return disabledProp ?? fieldCtx?.disabled ?? false\n}\n\n/**\n * Resolve Field control 的 **mode**(display / readonly / disabled / edit)— 2026-06-08 SSOT,統一兩派散落:\n * 舊 Input 派 `modeProp ?? fieldCtx?.mode ?? (...)` → `<Field disabled>` 時 ctx.mode 仍 'edit',漏 disabled chrome。\n * 舊 picker 派 `disabled ? 'disabled' : mode`(mode 預設 'edit')→ 完全不讀 fieldCtx.mode,`<Field mode=\"display\">` 失效。\n * 統一優先序(world-class:MUI FormControl disabled 完整 cascade + 顯式 prop 永遠最優先):\n * 1. 顯式 mode prop(caller / DataTable cell 的 displayOrDisabled)→ **永遠最優先**,故表格等顯式場景 inert\n * 2. 有效 disabled(prop 或 `<Field disabled>`)→ 'disabled'(完整 disabled chrome)\n * 3. FieldContext.mode(`<Field mode=\"display\"/\"readonly\">`)→ 讓 mode cascade 真正生效\n * 4. 本地 readOnly → 'readonly'\n * 5. 'edit'\n * cell:mode prop 必有 → step 1 命中、fieldCtx=null → 完全 inert(Δ=0)。`disabled` 傳已 resolve 的 boolean 或未預設 prop。\n */\nexport function useResolvedFieldMode({\n mode,\n disabled,\n readOnly,\n}: {\n mode?: FieldMode | null\n disabled?: boolean | null\n readOnly?: boolean\n}): FieldMode {\n const fieldCtx = React.useContext(FieldContext)\n if (mode) return mode\n if ((disabled ?? fieldCtx?.disabled) === true) return 'disabled'\n if (fieldCtx?.mode) return fieldCtx.mode\n if (readOnly) return 'readonly'\n return 'edit'\n}\n\n/**\n * Resolve Field control 的 **variant**(default / bare / naked 視覺外殼)— 2026-06-08 SSOT。\n * 優先序:顯式 prop > FieldContext.variant > 'default'。與既有各控件公式一字不差(Δ=0),統一以利 gate 強制。\n */\nexport function useResolvedFieldVariant(variantProp?: FieldVariant | null): FieldVariant {\n const fieldCtx = React.useContext(FieldContext)\n return variantProp ?? fieldCtx?.variant ?? 'default'\n}\n\n/**\n * Resolve Field control 的 **error/invalid** — 取代散落的 `errorProp || (fieldCtx?.invalid ?? false)`(2026-06-08 SSOT)。\n * 自身 error prop **或** FieldContext.invalid(`<Field invalid>`)任一為真即 error。與既有公式一致(Δ=0)。\n */\nexport function useResolvedFieldInvalid(errorProp?: boolean): boolean {\n const fieldCtx = React.useContext(FieldContext)\n return Boolean(errorProp) || (fieldCtx?.invalid ?? false)\n}\n\n/**\n * Host(non-Field-wrapper,如 DataTable cell)注 surface density size 給 child Field controls。\n * 僅注 size 視覺訊號,不污染 FieldContext。Usage:cell-registry buildCellWithSurface。\n */\nexport function FieldSurfaceSizeProvider({\n size,\n children,\n}: {\n size: FieldSize\n children: React.ReactNode\n}): React.ReactElement {\n return React.createElement(FieldSurfaceSizeContext.Provider, { value: size }, children)\n}\n"],"names":[],"mappings":";AA+CO,MAAM,eAAe,MAAM,cAAwC,IAAI;AAGvE,SAAS,kBAA4C;AAC1D,SAAO,MAAM,WAAW,YAAY;AACtC;AAcA,MAAM,sBAAsB,MAAM,cAAmC,IAAI;AAYlE,SAAS,kBAAgC;AAC9C,QAAM,aAAa,MAAM,WAAW,mBAAmB;AACvD,MAAI,WAAY,QAAO;AACvB,QAAM,WAAW,MAAM,WAAW,YAAY;AAC9C,UAAO,qCAAU,YAAW;AAC9B;AAcO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AACF,GAGuB;AACrB,SAAO,MAAM,cAAc,oBAAoB,UAAU,EAAE,OAAO,QAAA,GAAW,QAAQ;AACvF;AAgBA,MAAM,qBAAqB,MAAM,cAAuB,KAAK;AAEtD,SAAS,sBAA+B;AAC7C,SAAO,MAAM,WAAW,kBAAkB;AAC5C;AAEO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AACF,GAGuB;AACrB,SAAO,MAAM,cAAc,mBAAmB,UAAU,EAAE,OAAO,YAAA,GAAe,QAAQ;AAC1F;AAWA,MAAM,0BAA0B,MAAM,cAAgC,IAAI;AAQnE,SAAS,qBAAmD,UAAqB,UAAiB;AACvG,QAAM,WAAW,MAAM,WAAW,YAAY;AAC9C,QAAM,cAAc,MAAM,WAAW,uBAAuB;AAI5D,SAAQ,aAAa,qCAAU,SAA2B,eAAiC,YAAa;AAC1G;AAQO,SAAS,yBAAyB,cAAwC;AAC/E,QAAM,WAAW,MAAM,WAAW,YAAY;AAC9C,SAAO,iBAAgB,qCAAU,aAAY;AAC/C;AAcO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAIc;AACZ,QAAM,WAAW,MAAM,WAAW,YAAY;AAC9C,MAAI,KAAM,QAAO;AACjB,OAAK,aAAY,qCAAU,eAAc,KAAM,QAAO;AACtD,MAAI,qCAAU,KAAM,QAAO,SAAS;AACpC,MAAI,SAAU,QAAO;AACrB,SAAO;AACT;AAMO,SAAS,wBAAwB,aAAiD;AACvF,QAAM,WAAW,MAAM,WAAW,YAAY;AAC9C,SAAO,gBAAe,qCAAU,YAAW;AAC7C;AAMO,SAAS,wBAAwB,WAA8B;AACpE,QAAM,WAAW,MAAM,WAAW,YAAY;AAC9C,SAAO,QAAQ,SAAS,OAAM,qCAAU,YAAW;AACrD;AAMO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AACF,GAGuB;AACrB,SAAO,MAAM,cAAc,wBAAwB,UAAU,EAAE,OAAO,KAAA,GAAQ,QAAQ;AACxF;"}
@@ -1 +1 @@
1
- {"version":3,"file":"field-types.js","sources":["../../../src/components/Field/field-types.ts"],"sourcesContent":["// ── Field Mode ───────────────────────────────────────────────────────────────\n//\n// 4 模式 canonical(2026-05-05 expand to 4):\n// edit — 一般可編輯 input(預設 variant:border + bg)\n// display — **純展示**(無 input chrome / 無互動 affordance);語意「這是 read-only 內容,展示給人看」\n// 對齊 Carbon read-only / PatternFly inline-edit hidden-input / Cloudscape display-mode\n// readonly — input chrome + non-editable(保留 underline / border subtle 給 a11y signal「這是 input 但鎖了」)\n// 對齊 Carbon read-only-with-underline。差異:`display` 完全無 chrome;`readonly` 保留 input affordance signal\n// disabled — input chrome + disabled state(灰底,不可互動,語意「不適用」)\n//\n// `display` vs `readonly` 判別:\n// - 該位置語意上是「純展示資料」(如 DataTable cell read mode / NameCard meta) → `display`\n// - 該位置是「表單欄位但目前不可改」(如 form 鎖部分欄位) → `readonly`\n//\n// World-class refs(M22 verified):\n// Carbon: https://carbondesignsystem.com/patterns/read-only-states-pattern/\n// PatternFly: https://www.patternfly.org/components/inline-edit/design-guidelines/\n// Cloudscape: https://cloudscape.design/patterns/general/disabled-and-read-only-states/\nexport type FieldMode = 'edit' | 'display' | 'readonly' | 'disabled'\n\n// ── Field Variant ────────────────────────────────────────────────────────────\n//\n// 視覺外殼(對齊主流 DS canonical M22 verified 2026-05-05):\n// - Ant Design `Input variant`: 'outlined' | 'borderless' | 'filled' | 'underlined'\n// - MUI `TextField variant`: 'outlined' | 'standard' | 'filled'\n//\n// default — 含 border + bg(一般 form input,= Ant outlined / MUI outlined)\n// bare — 透明 variant,hover/focus 才 reveal inner border(VS Code/Figma toolbar inline editing idiom,\n// ≈ Ant borderless,但保留 hover/focus reveal)\n// naked — 完全無 chrome / 無 focus ring on wrapper(cell-as-input — host cell 提供 border + focus visual)\n// 對齊 Airtable / Notion / Excel cell editing — cell 本身扮演 input frame,內無 wrapper\n//\n// 透傳機制:Field 透過 FieldContext.variant 一次宣告,所有 child Field control 自動繼承。\n// per-control prop override 可覆寫 context。\nexport type FieldVariant = 'default' | 'bare' | 'naked'\n\n// ── Menu List Min Height ─────────────────────────────────────────────────────\n// SelectMenu / Select / Combobox 共用的 CommandList minHeight 計算。\n// 確保空狀態有足夠高度讓 Empty 垂直置中(有框容器 → 置中原則)。\n\nconst FIELD_HEIGHT_TOKEN: Record<string, string> = {\n sm: 'var(--field-height-sm)',\n md: 'var(--field-height-md)',\n lg: 'var(--field-height-lg)',\n}\n\n/** CommandList 最小高度 = field-height × rows + 16px(CommandGroup py-2 上下 padding) */\nexport function getMenuListMinHeight(size: string, rows: number = 3): string {\n const token = FIELD_HEIGHT_TOKEN[size] ?? FIELD_HEIGHT_TOKEN.md\n return `calc(${token} * ${rows} + 16px)`\n}\n\n"],"names":[],"mappings":"AAwCA,MAAM,qBAA6C;AAAA,EACjD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAGO,SAAS,qBAAqB,MAAc,OAAe,GAAW;AAC3E,QAAM,QAAQ,mBAAmB,IAAI,KAAK,mBAAmB;AAC7D,SAAO,QAAQ,KAAK,MAAM,IAAI;AAChC;"}
1
+ {"version":3,"file":"field-types.js","sources":["../../../src/components/Field/field-types.ts"],"sourcesContent":["// ── Field Mode ───────────────────────────────────────────────────────────────\n//\n// 4 模式 canonical(2026-05-05 expand to 4):\n// edit — 一般可編輯 input(預設 variant:border + bg)\n// display — **純展示**(無 input chrome / 無互動 affordance);語意「這是 read-only 內容,展示給人看」\n// 對齊 Carbon read-only / PatternFly inline-edit hidden-input / Cloudscape display-mode\n// readonly — input chrome + non-editable(保留 underline / border subtle 給 a11y signal「這是 input 但鎖了」)\n// 對齊 Carbon read-only-with-underline。差異:`display` 完全無 chrome;`readonly` 保留 input affordance signal\n// disabled — input chrome + disabled state(灰底,不可互動,語意「不適用」)\n//\n// `display` vs `readonly` 判別:\n// - 該位置語意上是「純展示資料」(如 DataTable cell read mode / ProfileCard meta) → `display`\n// - 該位置是「表單欄位但目前不可改」(如 form 鎖部分欄位) → `readonly`\n//\n// World-class refs(M22 verified):\n// Carbon: https://carbondesignsystem.com/patterns/read-only-states-pattern/\n// PatternFly: https://www.patternfly.org/components/inline-edit/design-guidelines/\n// Cloudscape: https://cloudscape.design/patterns/general/disabled-and-read-only-states/\nexport type FieldMode = 'edit' | 'display' | 'readonly' | 'disabled'\n\n// ── Field Variant ────────────────────────────────────────────────────────────\n//\n// 視覺外殼(對齊主流 DS canonical M22 verified 2026-05-05):\n// - Ant Design `Input variant`: 'outlined' | 'borderless' | 'filled' | 'underlined'\n// - MUI `TextField variant`: 'outlined' | 'standard' | 'filled'\n//\n// default — 含 border + bg(一般 form input,= Ant outlined / MUI outlined)\n// bare — 透明 variant,hover/focus 才 reveal inner border(VS Code/Figma toolbar inline editing idiom,\n// ≈ Ant borderless,但保留 hover/focus reveal)\n// naked — 完全無 chrome / 無 focus ring on wrapper(cell-as-input — host cell 提供 border + focus visual)\n// 對齊 Airtable / Notion / Excel cell editing — cell 本身扮演 input frame,內無 wrapper\n//\n// 透傳機制:Field 透過 FieldContext.variant 一次宣告,所有 child Field control 自動繼承。\n// per-control prop override 可覆寫 context。\nexport type FieldVariant = 'default' | 'bare' | 'naked'\n\n// ── Menu List Min Height ─────────────────────────────────────────────────────\n// SelectMenu / Select / Combobox 共用的 CommandList minHeight 計算。\n// 確保空狀態有足夠高度讓 Empty 垂直置中(有框容器 → 置中原則)。\n\nconst FIELD_HEIGHT_TOKEN: Record<string, string> = {\n sm: 'var(--field-height-sm)',\n md: 'var(--field-height-md)',\n lg: 'var(--field-height-lg)',\n}\n\n/** CommandList 最小高度 = field-height × rows + 16px(CommandGroup py-2 上下 padding) */\nexport function getMenuListMinHeight(size: string, rows: number = 3): string {\n const token = FIELD_HEIGHT_TOKEN[size] ?? FIELD_HEIGHT_TOKEN.md\n return `calc(${token} * ${rows} + 16px)`\n}\n\n"],"names":[],"mappings":"AAwCA,MAAM,qBAA6C;AAAA,EACjD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAGO,SAAS,qBAAqB,MAAc,OAAe,GAAW;AAC3E,QAAM,QAAQ,mBAAmB,IAAI,KAAK,mBAAmB;AAC7D,SAAO,QAAQ,KAAK,MAAM,IAAI;AAChC;"}