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

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 (1375) hide show
  1. package/CLAUDE.md +201 -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 +7 -2
  13. package/dist/components/Alert/alert.d.ts.map +1 -1
  14. package/dist/components/Alert/alert.js +12 -8
  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 +3 -3
  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 +3 -2
  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 +14 -7
  39. package/dist/components/Avatar/avatar.d.ts.map +1 -1
  40. package/dist/components/Avatar/avatar.js +19 -24
  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 +9 -6
  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 +15 -2
  55. package/dist/components/Breadcrumb/breadcrumb.d.ts.map +1 -1
  56. package/dist/components/Breadcrumb/breadcrumb.js +9 -3
  57. package/dist/components/Breadcrumb/breadcrumb.js.map +1 -1
  58. package/dist/components/Breadcrumb/index.d.ts +2 -0
  59. package/dist/components/Breadcrumb/index.d.ts.map +1 -0
  60. package/dist/components/Breadcrumb/index.js +12 -0
  61. package/dist/components/Breadcrumb/index.js.map +1 -0
  62. package/dist/components/BulkActionBar/bulk-action-bar.d.ts +3 -3
  63. package/dist/components/BulkActionBar/bulk-action-bar.d.ts.map +1 -1
  64. package/dist/components/BulkActionBar/bulk-action-bar.js +3 -3
  65. package/dist/components/BulkActionBar/bulk-action-bar.js.map +1 -1
  66. package/dist/components/BulkActionBar/index.d.ts +2 -0
  67. package/dist/components/BulkActionBar/index.d.ts.map +1 -0
  68. package/dist/components/BulkActionBar/index.js +7 -0
  69. package/dist/components/BulkActionBar/index.js.map +1 -0
  70. package/dist/components/Button/button.d.ts +10 -10
  71. package/dist/components/Button/button.d.ts.map +1 -1
  72. package/dist/components/Button/button.js +79 -50
  73. package/dist/components/Button/button.js.map +1 -1
  74. package/dist/components/Button/index.d.ts +3 -0
  75. package/dist/components/Button/index.d.ts.map +1 -0
  76. package/dist/components/Button/index.js +11 -0
  77. package/dist/components/Button/index.js.map +1 -0
  78. package/dist/components/Calendar/calendar.d.ts +9 -5
  79. package/dist/components/Calendar/calendar.d.ts.map +1 -1
  80. package/dist/components/Calendar/calendar.js +88 -76
  81. package/dist/components/Calendar/calendar.js.map +1 -1
  82. package/dist/components/Calendar/index.d.ts +2 -0
  83. package/dist/components/Calendar/index.d.ts.map +1 -0
  84. package/dist/components/Calendar/index.js +6 -0
  85. package/dist/components/Calendar/index.js.map +1 -0
  86. package/dist/components/Carousel/carousel.d.ts.map +1 -1
  87. package/dist/components/Carousel/carousel.js +11 -6
  88. package/dist/components/Carousel/carousel.js.map +1 -1
  89. package/dist/components/Carousel/index.d.ts +2 -0
  90. package/dist/components/Carousel/index.d.ts.map +1 -0
  91. package/dist/components/Carousel/index.js +11 -0
  92. package/dist/components/Carousel/index.js.map +1 -0
  93. package/dist/components/Chart/chart.d.ts +2 -2
  94. package/dist/components/Chart/chart.d.ts.map +1 -1
  95. package/dist/components/Chart/chart.js +4 -2
  96. package/dist/components/Chart/chart.js.map +1 -1
  97. package/dist/components/Chart/index.d.ts +2 -0
  98. package/dist/components/Chart/index.d.ts.map +1 -0
  99. package/dist/components/Chart/index.js +11 -0
  100. package/dist/components/Chart/index.js.map +1 -0
  101. package/dist/components/Checkbox/checkbox-group.d.ts +2 -1
  102. package/dist/components/Checkbox/checkbox-group.d.ts.map +1 -1
  103. package/dist/components/Checkbox/checkbox-group.js.map +1 -1
  104. package/dist/components/Checkbox/checkbox.d.ts +18 -9
  105. package/dist/components/Checkbox/checkbox.d.ts.map +1 -1
  106. package/dist/components/Checkbox/checkbox.js +70 -15
  107. package/dist/components/Checkbox/checkbox.js.map +1 -1
  108. package/dist/components/Checkbox/index.d.ts +3 -0
  109. package/dist/components/Checkbox/index.d.ts.map +1 -0
  110. package/dist/components/Checkbox/index.js +10 -0
  111. package/dist/components/Checkbox/index.js.map +1 -0
  112. package/dist/components/Chip/chip.d.ts +13 -7
  113. package/dist/components/Chip/chip.d.ts.map +1 -1
  114. package/dist/components/Chip/chip.js +9 -4
  115. package/dist/components/Chip/chip.js.map +1 -1
  116. package/dist/components/Chip/index.d.ts +2 -0
  117. package/dist/components/Chip/index.d.ts.map +1 -0
  118. package/dist/components/Chip/index.js +8 -0
  119. package/dist/components/Chip/index.js.map +1 -0
  120. package/dist/components/CircularProgress/circular-progress.d.ts +2 -3
  121. package/dist/components/CircularProgress/circular-progress.d.ts.map +1 -1
  122. package/dist/components/CircularProgress/circular-progress.js +4 -3
  123. package/dist/components/CircularProgress/circular-progress.js.map +1 -1
  124. package/dist/components/CircularProgress/index.d.ts +2 -0
  125. package/dist/components/CircularProgress/index.d.ts.map +1 -0
  126. package/dist/components/CircularProgress/index.js +6 -0
  127. package/dist/components/CircularProgress/index.js.map +1 -0
  128. package/dist/components/Coachmark/coachmark-story-helpers.d.ts +22 -0
  129. package/dist/components/Coachmark/coachmark-story-helpers.d.ts.map +1 -0
  130. package/dist/components/Coachmark/coachmark.d.ts +6 -4
  131. package/dist/components/Coachmark/coachmark.d.ts.map +1 -1
  132. package/dist/components/Coachmark/coachmark.js +13 -5
  133. package/dist/components/Coachmark/coachmark.js.map +1 -1
  134. package/dist/components/Coachmark/index.d.ts +2 -0
  135. package/dist/components/Coachmark/index.d.ts.map +1 -0
  136. package/dist/components/Coachmark/index.js +6 -0
  137. package/dist/components/Coachmark/index.js.map +1 -0
  138. package/dist/components/Combobox/combobox.d.ts +18 -7
  139. package/dist/components/Combobox/combobox.d.ts.map +1 -1
  140. package/dist/components/Combobox/combobox.js +81 -45
  141. package/dist/components/Combobox/combobox.js.map +1 -1
  142. package/dist/components/Combobox/index.d.ts +2 -0
  143. package/dist/components/Combobox/index.d.ts.map +1 -0
  144. package/dist/components/Combobox/index.js +6 -0
  145. package/dist/components/Combobox/index.js.map +1 -0
  146. package/dist/components/Command/command.d.ts +6 -2
  147. package/dist/components/Command/command.d.ts.map +1 -1
  148. package/dist/components/Command/command.js +8 -7
  149. package/dist/components/Command/command.js.map +1 -1
  150. package/dist/components/Command/index.d.ts +2 -0
  151. package/dist/components/Command/index.d.ts.map +1 -0
  152. package/dist/components/Command/index.js +14 -0
  153. package/dist/components/Command/index.js.map +1 -0
  154. package/dist/components/DataTable/active-editor-controller.d.ts +4 -3
  155. package/dist/components/DataTable/active-editor-controller.d.ts.map +1 -1
  156. package/dist/components/DataTable/cell-registry.d.ts.map +1 -1
  157. package/dist/components/DataTable/cell-registry.js +9 -5
  158. package/dist/components/DataTable/cell-registry.js.map +1 -1
  159. package/dist/components/DataTable/data-table-filter-panel.d.ts.map +1 -1
  160. package/dist/components/DataTable/data-table-interaction-layer.d.ts +4 -3
  161. package/dist/components/DataTable/data-table-interaction-layer.d.ts.map +1 -1
  162. package/dist/components/DataTable/data-table-interaction-layer.js.map +1 -1
  163. package/dist/components/DataTable/data-table.d.ts +37 -13
  164. package/dist/components/DataTable/data-table.d.ts.map +1 -1
  165. package/dist/components/DataTable/data-table.js +211 -89
  166. package/dist/components/DataTable/data-table.js.map +1 -1
  167. package/dist/components/DataTable/filter-operators.d.ts +1 -1
  168. package/dist/components/DataTable/filter-tree.d.ts +6 -1
  169. package/dist/components/DataTable/filter-tree.d.ts.map +1 -1
  170. package/dist/components/DataTable/index.d.ts +2 -0
  171. package/dist/components/DataTable/index.d.ts.map +1 -0
  172. package/dist/components/DataTable/index.js +8 -0
  173. package/dist/components/DataTable/index.js.map +1 -0
  174. package/dist/components/DateGrid/date-grid.d.ts +22 -18
  175. package/dist/components/DateGrid/date-grid.d.ts.map +1 -1
  176. package/dist/components/DateGrid/date-grid.js +8 -6
  177. package/dist/components/DateGrid/date-grid.js.map +1 -1
  178. package/dist/components/DateGrid/index.d.ts +2 -0
  179. package/dist/components/DateGrid/index.d.ts.map +1 -0
  180. package/dist/components/DateGrid/index.js +6 -0
  181. package/dist/components/DateGrid/index.js.map +1 -0
  182. package/dist/components/DatePicker/date-picker.d.ts.map +1 -1
  183. package/dist/components/DatePicker/date-picker.js +153 -124
  184. package/dist/components/DatePicker/date-picker.js.map +1 -1
  185. package/dist/components/DatePicker/index.d.ts +2 -0
  186. package/dist/components/DatePicker/index.d.ts.map +1 -0
  187. package/dist/components/DatePicker/index.js +8 -0
  188. package/dist/components/DatePicker/index.js.map +1 -0
  189. package/dist/components/DescriptionList/description-list.d.ts +3 -3
  190. package/dist/components/DescriptionList/description-list.js +4 -3
  191. package/dist/components/DescriptionList/description-list.js.map +1 -1
  192. package/dist/components/DescriptionList/index.d.ts +2 -0
  193. package/dist/components/DescriptionList/index.d.ts.map +1 -0
  194. package/dist/components/DescriptionList/index.js +7 -0
  195. package/dist/components/DescriptionList/index.js.map +1 -0
  196. package/dist/components/Dialog/dialog.d.ts +1 -1
  197. package/dist/components/Dialog/dialog.d.ts.map +1 -1
  198. package/dist/components/Dialog/dialog.js +2 -1
  199. package/dist/components/Dialog/dialog.js.map +1 -1
  200. package/dist/components/Dialog/index.d.ts +2 -0
  201. package/dist/components/Dialog/index.d.ts.map +1 -0
  202. package/dist/components/Dialog/index.js +16 -0
  203. package/dist/components/Dialog/index.js.map +1 -0
  204. package/dist/components/DropdownMenu/dropdown-menu.d.ts +4 -3
  205. package/dist/components/DropdownMenu/dropdown-menu.d.ts.map +1 -1
  206. package/dist/components/DropdownMenu/dropdown-menu.js +13 -7
  207. package/dist/components/DropdownMenu/dropdown-menu.js.map +1 -1
  208. package/dist/components/DropdownMenu/index.d.ts +2 -0
  209. package/dist/components/DropdownMenu/index.d.ts.map +1 -0
  210. package/dist/components/DropdownMenu/index.js +21 -0
  211. package/dist/components/DropdownMenu/index.js.map +1 -0
  212. package/dist/components/Empty/empty.d.ts +11 -3
  213. package/dist/components/Empty/empty.d.ts.map +1 -1
  214. package/dist/components/Empty/empty.js +6 -6
  215. package/dist/components/Empty/empty.js.map +1 -1
  216. package/dist/components/Empty/index.d.ts +2 -0
  217. package/dist/components/Empty/index.d.ts.map +1 -0
  218. package/dist/components/Empty/index.js +6 -0
  219. package/dist/components/Empty/index.js.map +1 -0
  220. package/dist/components/Field/field-context.d.ts +49 -0
  221. package/dist/components/Field/field-context.d.ts.map +1 -1
  222. package/dist/components/Field/field-context.js +42 -0
  223. package/dist/components/Field/field-context.js.map +1 -1
  224. package/dist/components/Field/field-types.js.map +1 -1
  225. package/dist/components/Field/field-wrapper.d.ts +1 -0
  226. package/dist/components/Field/field-wrapper.d.ts.map +1 -1
  227. package/dist/components/Field/field-wrapper.js +32 -12
  228. package/dist/components/Field/field-wrapper.js.map +1 -1
  229. package/dist/components/Field/field.d.ts +4 -2
  230. package/dist/components/Field/field.d.ts.map +1 -1
  231. package/dist/components/Field/field.js +1 -0
  232. package/dist/components/Field/field.js.map +1 -1
  233. package/dist/components/Field/index.d.ts +2 -0
  234. package/dist/components/Field/index.d.ts.map +1 -0
  235. package/dist/components/Field/index.js +12 -0
  236. package/dist/components/Field/index.js.map +1 -0
  237. package/dist/components/Field/use-form-validation.d.ts +92 -0
  238. package/dist/components/Field/use-form-validation.d.ts.map +1 -0
  239. package/dist/components/Field/use-form-validation.js +139 -0
  240. package/dist/components/Field/use-form-validation.js.map +1 -0
  241. package/dist/components/FieldControlGroup/field-control-group.d.ts +8 -8
  242. package/dist/components/FieldControlGroup/field-control-group.d.ts.map +1 -1
  243. package/dist/components/FieldControlGroup/field-control-group.js +1 -1
  244. package/dist/components/FieldControlGroup/field-control-group.js.map +1 -1
  245. package/dist/components/FieldControlGroup/index.d.ts +2 -0
  246. package/dist/components/FieldControlGroup/index.d.ts.map +1 -0
  247. package/dist/components/FieldControlGroup/index.js +6 -0
  248. package/dist/components/FieldControlGroup/index.js.map +1 -0
  249. package/dist/components/FileItem/file-item.d.ts +12 -2
  250. package/dist/components/FileItem/file-item.d.ts.map +1 -1
  251. package/dist/components/FileItem/file-item.js +23 -8
  252. package/dist/components/FileItem/file-item.js.map +1 -1
  253. package/dist/components/FileItem/index.d.ts +2 -0
  254. package/dist/components/FileItem/index.d.ts.map +1 -0
  255. package/dist/components/FileItem/index.js +6 -0
  256. package/dist/components/FileItem/index.js.map +1 -0
  257. package/dist/components/FileUpload/file-upload.d.ts +32 -13
  258. package/dist/components/FileUpload/file-upload.d.ts.map +1 -1
  259. package/dist/components/FileUpload/file-upload.js +72 -22
  260. package/dist/components/FileUpload/file-upload.js.map +1 -1
  261. package/dist/components/FileUpload/index.d.ts +2 -0
  262. package/dist/components/FileUpload/index.d.ts.map +1 -0
  263. package/dist/components/FileUpload/index.js +6 -0
  264. package/dist/components/FileUpload/index.js.map +1 -0
  265. package/dist/components/FileViewer/file-viewer.d.ts +2 -2
  266. package/dist/components/FileViewer/file-viewer.d.ts.map +1 -1
  267. package/dist/components/FileViewer/file-viewer.js +32 -22
  268. package/dist/components/FileViewer/file-viewer.js.map +1 -1
  269. package/dist/components/FileViewer/index.d.ts +2 -0
  270. package/dist/components/FileViewer/index.d.ts.map +1 -0
  271. package/dist/components/FileViewer/index.js +7 -0
  272. package/dist/components/FileViewer/index.js.map +1 -0
  273. package/dist/components/HoverCard/hover-card.d.ts +7 -3
  274. package/dist/components/HoverCard/hover-card.d.ts.map +1 -1
  275. package/dist/components/HoverCard/hover-card.js +4 -3
  276. package/dist/components/HoverCard/hover-card.js.map +1 -1
  277. package/dist/components/HoverCard/index.d.ts +2 -0
  278. package/dist/components/HoverCard/index.d.ts.map +1 -0
  279. package/dist/components/HoverCard/index.js +8 -0
  280. package/dist/components/HoverCard/index.js.map +1 -0
  281. package/dist/components/Input/index.d.ts +2 -0
  282. package/dist/components/Input/index.d.ts.map +1 -0
  283. package/dist/components/Input/index.js +6 -0
  284. package/dist/components/Input/index.js.map +1 -0
  285. package/dist/components/Input/input.d.ts +5 -2
  286. package/dist/components/Input/input.d.ts.map +1 -1
  287. package/dist/components/Input/input.js +11 -13
  288. package/dist/components/Input/input.js.map +1 -1
  289. package/dist/components/LinkInput/index.d.ts +2 -0
  290. package/dist/components/LinkInput/index.d.ts.map +1 -0
  291. package/dist/components/LinkInput/index.js +6 -0
  292. package/dist/components/LinkInput/index.js.map +1 -0
  293. package/dist/components/LinkInput/link-input.d.ts +2 -2
  294. package/dist/components/LinkInput/link-input.d.ts.map +1 -1
  295. package/dist/components/LinkInput/link-input.js +36 -35
  296. package/dist/components/LinkInput/link-input.js.map +1 -1
  297. package/dist/components/Menu/index.d.ts +2 -0
  298. package/dist/components/Menu/index.d.ts.map +1 -0
  299. package/dist/components/Menu/index.js +9 -0
  300. package/dist/components/Menu/index.js.map +1 -0
  301. package/dist/components/Menu/menu-item.d.ts +6 -2
  302. package/dist/components/Menu/menu-item.d.ts.map +1 -1
  303. package/dist/components/Menu/menu-item.js +3 -2
  304. package/dist/components/Menu/menu-item.js.map +1 -1
  305. package/dist/components/Notice/index.d.ts +2 -0
  306. package/dist/components/Notice/index.d.ts.map +1 -0
  307. package/dist/components/Notice/index.js +8 -0
  308. package/dist/components/Notice/index.js.map +1 -0
  309. package/dist/components/Notice/notice.d.ts +18 -6
  310. package/dist/components/Notice/notice.d.ts.map +1 -1
  311. package/dist/components/Notice/notice.js +25 -9
  312. package/dist/components/Notice/notice.js.map +1 -1
  313. package/dist/components/NumberInput/index.d.ts +2 -0
  314. package/dist/components/NumberInput/index.d.ts.map +1 -0
  315. package/dist/components/NumberInput/index.js +7 -0
  316. package/dist/components/NumberInput/index.js.map +1 -0
  317. package/dist/components/NumberInput/number-input.d.ts.map +1 -1
  318. package/dist/components/NumberInput/number-input.js +23 -14
  319. package/dist/components/NumberInput/number-input.js.map +1 -1
  320. package/dist/components/OverflowIndicator/index.d.ts +2 -0
  321. package/dist/components/OverflowIndicator/index.d.ts.map +1 -0
  322. package/dist/components/OverflowIndicator/index.js +6 -0
  323. package/dist/components/OverflowIndicator/index.js.map +1 -0
  324. package/dist/components/OverflowIndicator/overflow-indicator.d.ts +6 -2
  325. package/dist/components/OverflowIndicator/overflow-indicator.d.ts.map +1 -1
  326. package/dist/components/OverflowIndicator/overflow-indicator.js +15 -7
  327. package/dist/components/OverflowIndicator/overflow-indicator.js.map +1 -1
  328. package/dist/components/PeoplePicker/index.d.ts +2 -0
  329. package/dist/components/PeoplePicker/index.d.ts.map +1 -0
  330. package/dist/components/PeoplePicker/index.js +9 -0
  331. package/dist/components/PeoplePicker/index.js.map +1 -0
  332. package/dist/components/PeoplePicker/people-picker-helpers.d.ts.map +1 -1
  333. package/dist/components/PeoplePicker/people-picker-helpers.js +2 -2
  334. package/dist/components/PeoplePicker/people-picker-helpers.js.map +1 -1
  335. package/dist/components/PeoplePicker/people-picker.d.ts +2 -2
  336. package/dist/components/PeoplePicker/people-picker.d.ts.map +1 -1
  337. package/dist/components/PeoplePicker/people-picker.js +56 -51
  338. package/dist/components/PeoplePicker/people-picker.js.map +1 -1
  339. package/dist/components/PeoplePicker/person-display.d.ts +7 -7
  340. package/dist/components/PeoplePicker/person-display.d.ts.map +1 -1
  341. package/dist/components/PeoplePicker/person-display.js +11 -11
  342. package/dist/components/PeoplePicker/person-display.js.map +1 -1
  343. package/dist/components/Popover/index.d.ts +2 -0
  344. package/dist/components/Popover/index.d.ts.map +1 -0
  345. package/dist/components/Popover/index.js +14 -0
  346. package/dist/components/Popover/index.js.map +1 -0
  347. package/dist/components/Popover/popover.d.ts +2 -2
  348. package/dist/components/Popover/popover.d.ts.map +1 -1
  349. package/dist/components/Popover/popover.js +12 -12
  350. package/dist/components/Popover/popover.js.map +1 -1
  351. package/dist/components/ProfileCard/index.d.ts +2 -0
  352. package/dist/components/ProfileCard/index.d.ts.map +1 -0
  353. package/dist/components/ProfileCard/index.js +8 -0
  354. package/dist/components/ProfileCard/index.js.map +1 -0
  355. package/dist/components/{NameCard/name-card.d.ts → ProfileCard/profile-card.d.ts} +29 -20
  356. package/dist/components/ProfileCard/profile-card.d.ts.map +1 -0
  357. package/dist/components/{NameCard/name-card.js → ProfileCard/profile-card.js} +11 -10
  358. package/dist/components/ProfileCard/profile-card.js.map +1 -0
  359. package/dist/components/ProgressBar/index.d.ts +2 -0
  360. package/dist/components/ProgressBar/index.d.ts.map +1 -0
  361. package/dist/components/ProgressBar/index.js +6 -0
  362. package/dist/components/ProgressBar/index.js.map +1 -0
  363. package/dist/components/ProgressBar/progress-bar.d.ts +2 -2
  364. package/dist/components/ProgressBar/progress-bar.js +3 -3
  365. package/dist/components/ProgressBar/progress-bar.js.map +1 -1
  366. package/dist/components/RadioGroup/index.d.ts +2 -0
  367. package/dist/components/RadioGroup/index.d.ts.map +1 -0
  368. package/dist/components/RadioGroup/index.js +8 -0
  369. package/dist/components/RadioGroup/index.js.map +1 -0
  370. package/dist/components/RadioGroup/radio-group.d.ts +16 -10
  371. package/dist/components/RadioGroup/radio-group.d.ts.map +1 -1
  372. package/dist/components/RadioGroup/radio-group.js +97 -35
  373. package/dist/components/RadioGroup/radio-group.js.map +1 -1
  374. package/dist/components/Rating/index.d.ts +2 -0
  375. package/dist/components/Rating/index.d.ts.map +1 -0
  376. package/dist/components/Rating/index.js +6 -0
  377. package/dist/components/Rating/index.js.map +1 -0
  378. package/dist/components/Rating/rating.d.ts +6 -2
  379. package/dist/components/Rating/rating.d.ts.map +1 -1
  380. package/dist/components/Rating/rating.js +13 -10
  381. package/dist/components/Rating/rating.js.map +1 -1
  382. package/dist/components/ScrollArea/index.d.ts +2 -0
  383. package/dist/components/ScrollArea/index.d.ts.map +1 -0
  384. package/dist/components/ScrollArea/index.js +7 -0
  385. package/dist/components/ScrollArea/index.js.map +1 -0
  386. package/dist/components/ScrollArea/scroll-area.d.ts +2 -2
  387. package/dist/components/ScrollArea/scroll-area.js +4 -4
  388. package/dist/components/ScrollArea/scroll-area.js.map +1 -1
  389. package/dist/components/SegmentedControl/index.d.ts +2 -0
  390. package/dist/components/SegmentedControl/index.d.ts.map +1 -0
  391. package/dist/components/SegmentedControl/index.js +9 -0
  392. package/dist/components/SegmentedControl/index.js.map +1 -0
  393. package/dist/components/SegmentedControl/segmented-control.d.ts +4 -4
  394. package/dist/components/SegmentedControl/segmented-control.d.ts.map +1 -1
  395. package/dist/components/SegmentedControl/segmented-control.js +18 -15
  396. package/dist/components/SegmentedControl/segmented-control.js.map +1 -1
  397. package/dist/components/Select/index.d.ts +2 -0
  398. package/dist/components/Select/index.d.ts.map +1 -0
  399. package/dist/components/Select/index.js +6 -0
  400. package/dist/components/Select/index.js.map +1 -0
  401. package/dist/components/Select/select.d.ts +9 -3
  402. package/dist/components/Select/select.d.ts.map +1 -1
  403. package/dist/components/Select/select.js +73 -29
  404. package/dist/components/Select/select.js.map +1 -1
  405. package/dist/components/SelectMenu/index.d.ts +2 -0
  406. package/dist/components/SelectMenu/index.d.ts.map +1 -0
  407. package/dist/components/SelectMenu/index.js +7 -0
  408. package/dist/components/SelectMenu/index.js.map +1 -0
  409. package/dist/components/SelectMenu/select-menu.d.ts +24 -6
  410. package/dist/components/SelectMenu/select-menu.d.ts.map +1 -1
  411. package/dist/components/SelectMenu/select-menu.js +51 -10
  412. package/dist/components/SelectMenu/select-menu.js.map +1 -1
  413. package/dist/components/SelectionControl/index.d.ts +2 -0
  414. package/dist/components/SelectionControl/index.d.ts.map +1 -0
  415. package/dist/components/SelectionControl/index.js +7 -0
  416. package/dist/components/SelectionControl/index.js.map +1 -0
  417. package/dist/components/SelectionControl/selection-item.d.ts +5 -1
  418. package/dist/components/SelectionControl/selection-item.d.ts.map +1 -1
  419. package/dist/components/SelectionControl/selection-item.js +3 -1
  420. package/dist/components/SelectionControl/selection-item.js.map +1 -1
  421. package/dist/components/Separator/index.d.ts +2 -0
  422. package/dist/components/Separator/index.d.ts.map +1 -0
  423. package/dist/components/Separator/index.js +6 -0
  424. package/dist/components/Separator/index.js.map +1 -0
  425. package/dist/components/Separator/separator.d.ts +2 -2
  426. package/dist/components/Separator/separator.js +4 -3
  427. package/dist/components/Separator/separator.js.map +1 -1
  428. package/dist/components/Sheet/index.d.ts +2 -0
  429. package/dist/components/Sheet/index.d.ts.map +1 -0
  430. package/dist/components/Sheet/index.js +17 -0
  431. package/dist/components/Sheet/index.js.map +1 -0
  432. package/dist/components/Sheet/sheet.d.ts +7 -6
  433. package/dist/components/Sheet/sheet.d.ts.map +1 -1
  434. package/dist/components/Sheet/sheet.js +3 -2
  435. package/dist/components/Sheet/sheet.js.map +1 -1
  436. package/dist/components/Sidebar/index.d.ts +2 -0
  437. package/dist/components/Sidebar/index.d.ts.map +1 -0
  438. package/dist/components/Sidebar/index.js +24 -0
  439. package/dist/components/Sidebar/index.js.map +1 -0
  440. package/dist/components/Sidebar/sidebar.d.ts +2 -2
  441. package/dist/components/Sidebar/sidebar.d.ts.map +1 -1
  442. package/dist/components/Sidebar/sidebar.js +32 -13
  443. package/dist/components/Sidebar/sidebar.js.map +1 -1
  444. package/dist/components/Skeleton/index.d.ts +2 -0
  445. package/dist/components/Skeleton/index.d.ts.map +1 -0
  446. package/dist/components/Skeleton/index.js +6 -0
  447. package/dist/components/Skeleton/index.js.map +1 -0
  448. package/dist/components/Skeleton/skeleton.d.ts +2 -2
  449. package/dist/components/Skeleton/skeleton.js +4 -3
  450. package/dist/components/Skeleton/skeleton.js.map +1 -1
  451. package/dist/components/Slider/index.d.ts +2 -0
  452. package/dist/components/Slider/index.d.ts.map +1 -0
  453. package/dist/components/Slider/index.js +7 -0
  454. package/dist/components/Slider/index.js.map +1 -0
  455. package/dist/components/Slider/slider.d.ts +6 -6
  456. package/dist/components/Slider/slider.d.ts.map +1 -1
  457. package/dist/components/Slider/slider.js +25 -10
  458. package/dist/components/Slider/slider.js.map +1 -1
  459. package/dist/components/Steps/index.d.ts +2 -0
  460. package/dist/components/Steps/index.d.ts.map +1 -0
  461. package/dist/components/Steps/index.js +12 -0
  462. package/dist/components/Steps/index.js.map +1 -0
  463. package/dist/components/Steps/steps.d.ts +2 -2
  464. package/dist/components/Steps/steps.d.ts.map +1 -1
  465. package/dist/components/Steps/steps.js +54 -26
  466. package/dist/components/Steps/steps.js.map +1 -1
  467. package/dist/components/Switch/index.d.ts +2 -0
  468. package/dist/components/Switch/index.d.ts.map +1 -0
  469. package/dist/components/Switch/index.js +7 -0
  470. package/dist/components/Switch/index.js.map +1 -0
  471. package/dist/components/Switch/switch.d.ts +18 -16
  472. package/dist/components/Switch/switch.d.ts.map +1 -1
  473. package/dist/components/Switch/switch.js +81 -22
  474. package/dist/components/Switch/switch.js.map +1 -1
  475. package/dist/components/Tabs/index.d.ts +2 -0
  476. package/dist/components/Tabs/index.d.ts.map +1 -0
  477. package/dist/components/Tabs/index.js +10 -0
  478. package/dist/components/Tabs/index.js.map +1 -0
  479. package/dist/components/Tabs/tabs.d.ts +10 -7
  480. package/dist/components/Tabs/tabs.d.ts.map +1 -1
  481. package/dist/components/Tabs/tabs.js +30 -31
  482. package/dist/components/Tabs/tabs.js.map +1 -1
  483. package/dist/components/Tag/index.d.ts +2 -0
  484. package/dist/components/Tag/index.d.ts.map +1 -0
  485. package/dist/components/Tag/index.js +7 -0
  486. package/dist/components/Tag/index.js.map +1 -0
  487. package/dist/components/Tag/tag.d.ts +37 -23
  488. package/dist/components/Tag/tag.d.ts.map +1 -1
  489. package/dist/components/Tag/tag.js +43 -44
  490. package/dist/components/Tag/tag.js.map +1 -1
  491. package/dist/components/Textarea/index.d.ts +2 -0
  492. package/dist/components/Textarea/index.d.ts.map +1 -0
  493. package/dist/components/Textarea/index.js +7 -0
  494. package/dist/components/Textarea/index.js.map +1 -0
  495. package/dist/components/Textarea/textarea.d.ts +7 -11
  496. package/dist/components/Textarea/textarea.d.ts.map +1 -1
  497. package/dist/components/Textarea/textarea.js +34 -24
  498. package/dist/components/Textarea/textarea.js.map +1 -1
  499. package/dist/components/TimePicker/index.d.ts +2 -0
  500. package/dist/components/TimePicker/index.d.ts.map +1 -0
  501. package/dist/components/TimePicker/index.js +6 -0
  502. package/dist/components/TimePicker/index.js.map +1 -0
  503. package/dist/components/TimePicker/time-columns.d.ts.map +1 -1
  504. package/dist/components/TimePicker/time-columns.js +4 -1
  505. package/dist/components/TimePicker/time-columns.js.map +1 -1
  506. package/dist/components/TimePicker/time-picker.d.ts +4 -3
  507. package/dist/components/TimePicker/time-picker.d.ts.map +1 -1
  508. package/dist/components/TimePicker/time-picker.js +38 -39
  509. package/dist/components/TimePicker/time-picker.js.map +1 -1
  510. package/dist/components/Toast/index.d.ts +2 -0
  511. package/dist/components/Toast/index.d.ts.map +1 -0
  512. package/dist/components/Toast/index.js +7 -0
  513. package/dist/components/Toast/index.js.map +1 -0
  514. package/dist/components/Toast/toast.d.ts +2 -2
  515. package/dist/components/Toast/toast.d.ts.map +1 -1
  516. package/dist/components/Toast/toast.js +5 -4
  517. package/dist/components/Toast/toast.js.map +1 -1
  518. package/dist/components/Tooltip/index.d.ts +2 -0
  519. package/dist/components/Tooltip/index.d.ts.map +1 -0
  520. package/dist/components/Tooltip/index.js +9 -0
  521. package/dist/components/Tooltip/index.js.map +1 -0
  522. package/dist/components/Tooltip/tooltip.d.ts +1 -1
  523. package/dist/components/Tooltip/tooltip.d.ts.map +1 -1
  524. package/dist/components/Tooltip/tooltip.js +3 -2
  525. package/dist/components/Tooltip/tooltip.js.map +1 -1
  526. package/dist/components/TreeView/index.d.ts +2 -0
  527. package/dist/components/TreeView/index.d.ts.map +1 -0
  528. package/dist/components/TreeView/index.js +8 -0
  529. package/dist/components/TreeView/index.js.map +1 -0
  530. package/dist/components/TreeView/tree-view.d.ts +11 -11
  531. package/dist/components/TreeView/tree-view.d.ts.map +1 -1
  532. package/dist/components/TreeView/tree-view.js +38 -10
  533. package/dist/components/TreeView/tree-view.js.map +1 -1
  534. package/dist/hooks/use-overflow-items.d.ts +10 -6
  535. package/dist/hooks/use-overflow-items.d.ts.map +1 -1
  536. package/dist/hooks/use-overflow-items.js.map +1 -1
  537. package/dist/index.d.ts +58 -67
  538. package/dist/index.d.ts.map +1 -1
  539. package/dist/index.js +38 -57
  540. package/dist/index.js.map +1 -1
  541. package/dist/lib/utils.d.ts.map +1 -1
  542. package/dist/lib/utils.js +3 -1
  543. package/dist/lib/utils.js.map +1 -1
  544. package/dist/patterns/element-anatomy/index.d.ts +2 -0
  545. package/dist/patterns/element-anatomy/index.d.ts.map +1 -0
  546. package/dist/patterns/element-anatomy/index.js +20 -0
  547. package/dist/patterns/element-anatomy/index.js.map +1 -0
  548. package/dist/patterns/element-anatomy/item-anatomy.d.ts +10 -6
  549. package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -1
  550. package/dist/patterns/element-anatomy/item-anatomy.js +1 -1
  551. package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -1
  552. package/dist/patterns/header-canonical/chrome-header.d.ts +13 -4
  553. package/dist/patterns/header-canonical/chrome-header.d.ts.map +1 -1
  554. package/dist/patterns/header-canonical/chrome-header.js +4 -2
  555. package/dist/patterns/header-canonical/chrome-header.js.map +1 -1
  556. package/dist/patterns/header-canonical/index.d.ts +2 -0
  557. package/dist/patterns/header-canonical/index.d.ts.map +1 -0
  558. package/dist/patterns/header-canonical/index.js +6 -0
  559. package/dist/patterns/header-canonical/index.js.map +1 -0
  560. package/dist/patterns/horizontal-overflow/index.d.ts +2 -0
  561. package/dist/patterns/horizontal-overflow/index.d.ts.map +1 -0
  562. package/dist/patterns/horizontal-overflow/index.js +14 -0
  563. package/dist/patterns/horizontal-overflow/index.js.map +1 -0
  564. package/dist/patterns/overlay-surface/index.d.ts +2 -0
  565. package/dist/patterns/overlay-surface/index.d.ts.map +1 -0
  566. package/dist/patterns/overlay-surface/index.js +8 -0
  567. package/dist/patterns/overlay-surface/index.js.map +1 -0
  568. package/dist/patterns/overlay-surface/overlay-surface.d.ts +11 -2
  569. package/dist/patterns/overlay-surface/overlay-surface.d.ts.map +1 -1
  570. package/dist/patterns/overlay-surface/overlay-surface.js +5 -2
  571. package/dist/patterns/overlay-surface/overlay-surface.js.map +1 -1
  572. package/dist/patterns/resize-handle/index.d.ts +2 -0
  573. package/dist/patterns/resize-handle/index.d.ts.map +1 -0
  574. package/dist/patterns/resize-handle/index.js +5 -0
  575. package/dist/patterns/resize-handle/index.js.map +1 -0
  576. package/dist/story-governance/category-matrix.d.ts +35 -0
  577. package/dist/story-governance/category-matrix.d.ts.map +1 -0
  578. package/dist/tokens/categorical-color.d.ts +60 -0
  579. package/dist/tokens/categorical-color.d.ts.map +1 -0
  580. package/dist/tokens/categorical-color.js +110 -0
  581. package/dist/tokens/categorical-color.js.map +1 -0
  582. package/dist/tokens/motion/motion.d.ts +1 -1
  583. package/dist/tokens/motion/motion.d.ts.map +1 -1
  584. package/dist/tokens/motion/motion.js.map +1 -1
  585. package/dist/tokens/uiSize/icon-size.d.ts +3 -4
  586. package/dist/tokens/uiSize/icon-size.d.ts.map +1 -1
  587. package/ds-canonical/commands/README.md +26 -0
  588. package/ds-canonical/commands/gov-status.md +79 -0
  589. package/ds-canonical/fork/governance.lock +222 -0
  590. package/ds-canonical/fork/hooks/block_prototype_imports.py +111 -0
  591. package/ds-canonical/fork/hooks/check_chrome_header_avatar_canonical.sh +95 -0
  592. package/ds-canonical/fork/hooks/check_consumer_app_invariants.sh +349 -0
  593. package/ds-canonical/fork/hooks/check_ds_anchor_preflight.sh +132 -0
  594. package/ds-canonical/fork/hooks/check_escape_marker_abuse.sh +140 -0
  595. package/ds-canonical/fork/hooks/check_field_family_invariants.sh +250 -0
  596. package/ds-canonical/fork/hooks/check_fork_product_quality.sh +36 -0
  597. package/ds-canonical/fork/hooks/check_item_list_gap.sh +54 -0
  598. package/ds-canonical/fork/hooks/check_layout_space_magic_numbers.sh +96 -0
  599. package/ds-canonical/fork/hooks/check_opacity_token_usage.sh +158 -0
  600. package/ds-canonical/fork/hooks/check_pattern_invariants.sh +196 -0
  601. package/ds-canonical/fork/hooks/check_sidebar_menu_button_implicit_wrap.sh +86 -0
  602. package/ds-canonical/fork/hooks/check_tabs_content_chrome_body_double_gap.sh +183 -0
  603. package/ds-canonical/fork/hooks/check_tailwind_wildcard_in_docs.sh +79 -0
  604. package/ds-canonical/fork/hooks/inject_deploy_url_after_push.sh +238 -0
  605. package/ds-canonical/fork/launchers/fork-governance-dispatcher.sh +44 -0
  606. package/ds-canonical/fork/launchers/inject_fork_governance_preamble.sh +54 -0
  607. package/ds-canonical/fork/launchers/settings-hooks.json +58 -0
  608. package/ds-canonical/fork/manifest.json +98 -0
  609. package/ds-canonical/fork/preamble.md +495 -0
  610. package/ds-canonical/fork/skills/bug-fix-rhythm/SKILL.md +183 -0
  611. package/ds-canonical/fork/skills/code-quality-audit/SKILL.md +65 -0
  612. package/ds-canonical/fork/skills/delivery-handoff/SKILL.md +229 -0
  613. package/ds-canonical/fork/skills/delivery-handoff/references/flow-diagram.md +180 -0
  614. package/ds-canonical/fork/skills/delivery-handoff/references/handoff-template.md +177 -0
  615. package/ds-canonical/fork/skills/delivery-handoff/references/inventory-checklist.md +196 -0
  616. package/ds-canonical/fork/skills/performance-audit/SKILL.md +107 -0
  617. package/ds-canonical/fork/skills/product-ui-audit/SKILL.md +232 -0
  618. package/ds-canonical/fork/skills/product-ui-audit/references/audit-checks.md +246 -0
  619. package/ds-canonical/fork/skills/product-ui-audit/references/common-misuses.md +329 -0
  620. package/ds-canonical/fork/skills/product-ui-audit/references/report-template.md +159 -0
  621. package/ds-canonical/fork/skills/propose-options/SKILL.md +177 -0
  622. package/ds-canonical/fork/skills/prototype/SKILL.md +244 -0
  623. package/ds-canonical/fork/skills/prototype/references/audit-checks.md +38 -0
  624. package/ds-canonical/fork/skills/prototype/references/benchmark-sources.md +94 -0
  625. package/ds-canonical/fork/skills/prototype/references/checkpoints.md +191 -0
  626. package/ds-canonical/fork/skills/prototype/references/evaluation-matrix.md +141 -0
  627. package/ds-canonical/fork/skills/prototype/references/ooux-template.md +198 -0
  628. package/ds-canonical/fork/skills/prototype/references/proposal-template.md +229 -0
  629. package/ds-canonical/fork/skills/scan-similar-bugs/SKILL.md +200 -0
  630. package/ds-canonical/fork/skills/ux-audit/SKILL.md +130 -0
  631. package/ds-canonical/fork/skills/visual-audit/SKILL.md +247 -0
  632. package/ds-canonical/fork/skills/visual-audit/output/.gitkeep +0 -0
  633. package/ds-canonical/fork/skills/visual-audit/references/audit-architecture.md +101 -0
  634. package/ds-canonical/fork/skills/visual-audit/references/visual-checklist.md +297 -0
  635. package/ds-canonical/fork/skills/visual-audit/references/world-class-benchmarks.md +198 -0
  636. package/ds-canonical/hooks/README.md +145 -0
  637. package/ds-canonical/hooks/_log-fire.sh +46 -0
  638. package/ds-canonical/hooks/auto_regen_ds_barrel.sh +58 -0
  639. package/ds-canonical/hooks/block_prototype_imports.py +111 -0
  640. package/ds-canonical/hooks/check_audit_post_report_validator.sh +169 -0
  641. package/ds-canonical/hooks/check_audit_sample_escape.sh +76 -0
  642. package/ds-canonical/hooks/check_benchmark_citation.sh +106 -0
  643. package/ds-canonical/hooks/check_canonical_propagation.sh +189 -0
  644. package/ds-canonical/hooks/check_chrome_header_avatar_canonical.sh +95 -0
  645. package/ds-canonical/hooks/check_codex_brief_invariants.sh +115 -0
  646. package/ds-canonical/hooks/check_codex_collab_5step.sh +108 -0
  647. package/ds-canonical/hooks/check_consumer_app_invariants.sh +349 -0
  648. package/ds-canonical/hooks/check_datatable_invariants.sh +180 -0
  649. package/ds-canonical/hooks/check_dim_count_drift.sh +72 -0
  650. package/ds-canonical/hooks/check_ds_anchor_preflight.sh +132 -0
  651. package/ds-canonical/hooks/check_escape_marker_abuse.sh +140 -0
  652. package/ds-canonical/hooks/check_field_controls_contracts.sh +137 -0
  653. package/ds-canonical/hooks/check_field_family_invariants.sh +250 -0
  654. package/ds-canonical/hooks/check_file_size_budget.sh +60 -0
  655. package/ds-canonical/hooks/check_full_story_visual_interaction_sweep.sh +72 -0
  656. package/ds-canonical/hooks/check_item_list_gap.sh +54 -0
  657. package/ds-canonical/hooks/check_layout_space_magic_numbers.sh +96 -0
  658. package/ds-canonical/hooks/check_main_branch_workbench.sh +93 -0
  659. package/ds-canonical/hooks/check_naming_and_abstraction.sh +165 -0
  660. package/ds-canonical/hooks/check_opacity_token_usage.sh +158 -0
  661. package/ds-canonical/hooks/check_orphan_ds_css.sh +66 -0
  662. package/ds-canonical/hooks/check_overlay_open_focus_escape_probe.sh +75 -0
  663. package/ds-canonical/hooks/check_pattern_invariants.sh +196 -0
  664. package/ds-canonical/hooks/check_peoplepicker_ssot_drift.sh +56 -0
  665. package/ds-canonical/hooks/check_pixel_quantified_audit.sh +53 -0
  666. package/ds-canonical/hooks/check_plugin_fork_health.sh +145 -0
  667. package/ds-canonical/hooks/check_post_main_ssot_propagate.sh +90 -0
  668. package/ds-canonical/hooks/check_propose_discipline.sh +147 -0
  669. package/ds-canonical/hooks/check_propose_pre_grep_verify.sh +70 -0
  670. package/ds-canonical/hooks/check_propose_without_benchmark.sh +63 -0
  671. package/ds-canonical/hooks/check_select_all_canonical.sh +58 -0
  672. package/ds-canonical/hooks/check_sidebar_menu_button_implicit_wrap.sh +86 -0
  673. package/ds-canonical/hooks/check_solo_workflow.sh +317 -0
  674. package/ds-canonical/hooks/check_spec_class_drift.sh +88 -0
  675. package/ds-canonical/hooks/check_story_invariants.sh +760 -0
  676. package/ds-canonical/hooks/check_storybook_addon_packaging.sh +151 -0
  677. package/ds-canonical/hooks/check_substantive_edit_approval_preflight.sh +113 -0
  678. package/ds-canonical/hooks/check_tabs_content_chrome_body_double_gap.sh +183 -0
  679. package/ds-canonical/hooks/check_tailwind_wildcard_in_docs.sh +79 -0
  680. package/ds-canonical/hooks/check_wrapper_primitive_schema_drift.sh +104 -0
  681. package/ds-canonical/hooks/chrome_header_dispatcher.sh +56 -0
  682. package/ds-canonical/hooks/enforce_home_charter.sh +44 -0
  683. package/ds-canonical/hooks/inject_deploy_url_after_push.sh +238 -0
  684. package/ds-canonical/hooks/inject_pending_self_audit.sh +248 -0
  685. package/ds-canonical/hooks/lib/_app_shell_primary_header_consistency.sh +100 -0
  686. package/ds-canonical/hooks/lib/_approval_re.sh +33 -0
  687. package/ds-canonical/hooks/lib/_chrome_header_handcraft.sh +75 -0
  688. package/ds-canonical/hooks/lib/_code_quality.sh +73 -0
  689. package/ds-canonical/hooks/lib/_cva_default_sync.sh +69 -0
  690. package/ds-canonical/hooks/lib/_governance_coverage_check.sh +49 -0
  691. package/ds-canonical/hooks/lib/_hardcoded_strings.sh +163 -0
  692. package/ds-canonical/hooks/lib/_header_with_tabs_border.sh +87 -0
  693. package/ds-canonical/hooks/lib/_layout_space_canonical.sh +56 -0
  694. package/ds-canonical/hooks/lib/_overlay_handcraft.sh +162 -0
  695. package/ds-canonical/hooks/lib/_person_data_richness.sh +42 -0
  696. package/ds-canonical/hooks/lib/_story_compile_drift.sh +48 -0
  697. package/ds-canonical/hooks/lib/_tab_lg_chrome_header_equal.sh +70 -0
  698. package/ds-canonical/hooks/lib/_token_hygiene.sh +104 -0
  699. package/ds-canonical/hooks/log_governance_fires.sh +50 -0
  700. package/ds-canonical/hooks/log_skill_invokes.sh +41 -0
  701. package/ds-canonical/hooks/post_edit_dispatcher.sh +62 -0
  702. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_addon_subdir_ship.sh +76 -0
  703. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_consumer_app_story_title.sh +81 -0
  704. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_consumer_ds_primitive_misuse.sh +120 -0
  705. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_consumer_no_ds_catalog.sh +101 -0
  706. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_consumer_story_baseline.sh +76 -0
  707. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_data_table_size_num_to_meta_width.sh +68 -0
  708. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_fork_user_plugin_install.sh +79 -0
  709. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_plugin_freshness.sh +68 -0
  710. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_propose_cite_required.sh +88 -0
  711. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_propose_plain_chinese.sh +74 -0
  712. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_storybook_addon_preset_cjs.sh +87 -0
  713. package/ds-canonical/hooks/retired/check_anatomy_section_numbering.sh +106 -0
  714. package/ds-canonical/hooks/retired/check_avatar_hovercard.sh +90 -0
  715. package/ds-canonical/hooks/retired/check_button_icon_literal.sh.retired-2026-04-28 +38 -0
  716. package/ds-canonical/hooks/retired/check_container_breathing.sh +142 -0
  717. package/ds-canonical/hooks/retired/check_governance_compliance.sh +61 -0
  718. package/ds-canonical/hooks/retired/check_icon_only_padding_formula.sh +104 -0
  719. package/ds-canonical/hooks/retired/check_item_content_primitive.sh +150 -0
  720. package/ds-canonical/hooks/retired/check_item_list_gap.sh +153 -0
  721. package/ds-canonical/hooks/retired/check_sideoffset_canonical.sh +65 -0
  722. package/ds-canonical/hooks/retired/check_spec_iteration_tag.sh +87 -0
  723. package/ds-canonical/hooks/retired/check_ssot_consultation.sh +88 -0
  724. package/ds-canonical/hooks/retired/check_sync_update.sh +20 -0
  725. package/ds-canonical/hooks/retired/check_third_party_dom_verified.sh +95 -0
  726. package/ds-canonical/hooks/retired/enforce_home_charter.sh +125 -0
  727. package/ds-canonical/hooks/retired/post_edit_canonical_interrogate.sh +109 -0
  728. package/ds-canonical/hooks/retired/pre_edit_spec_check.sh +68 -0
  729. package/ds-canonical/hooks/retired/pre_new_component_spec.sh +39 -0
  730. package/ds-canonical/hooks/retired/pre_write_subsumption_check.sh +112 -0
  731. package/ds-canonical/hooks/retired/stop_meta_self_audit.sh.retired-2026-05-13 +76 -0
  732. package/ds-canonical/hooks/retired/tests/test_check_anatomy_section_numbering.sh +14 -0
  733. package/ds-canonical/hooks/retired/tests/test_check_avatar_hovercard.sh +15 -0
  734. package/ds-canonical/hooks/retired/tests/test_check_container_breathing.sh +15 -0
  735. package/ds-canonical/hooks/retired/tests/test_check_governance_compliance.sh +15 -0
  736. package/ds-canonical/hooks/retired/tests/test_check_icon_only_padding_formula.sh +79 -0
  737. package/ds-canonical/hooks/retired/tests/test_check_item_content_primitive.sh +15 -0
  738. package/ds-canonical/hooks/retired/tests/test_check_item_list_gap.sh +163 -0
  739. package/ds-canonical/hooks/retired/tests/test_check_sideoffset_canonical.sh +15 -0
  740. package/ds-canonical/hooks/retired/tests/test_check_spec_iteration_tag.sh +15 -0
  741. package/ds-canonical/hooks/retired/tests/test_check_ssot_consultation.sh +15 -0
  742. package/ds-canonical/hooks/retired/tests/test_check_sync_update.sh +14 -0
  743. package/ds-canonical/hooks/retired/tests/test_check_third_party_dom_verified.sh +15 -0
  744. package/ds-canonical/hooks/retired/tests/test_enforce_home_charter.sh +15 -0
  745. package/ds-canonical/hooks/retired/tests/test_pre_edit_spec_check.sh +15 -0
  746. package/ds-canonical/hooks/retired/tests/test_pre_new_component_spec.sh +15 -0
  747. package/ds-canonical/hooks/retired/tests/test_pre_write_subsumption_check.sh +63 -0
  748. package/ds-canonical/hooks/session_start_governance_check.sh +310 -0
  749. package/ds-canonical/hooks/stop_passive_logging.sh +322 -0
  750. package/ds-canonical/hooks/stop_self_audit.sh +516 -0
  751. package/ds-canonical/hooks/tests/KNOWN-BROKEN.md +15 -0
  752. package/ds-canonical/hooks/tests/run-all.sh +76 -0
  753. package/ds-canonical/hooks/tests/test_auto_regen_ds_barrel.sh +180 -0
  754. package/ds-canonical/hooks/tests/test_block_prototype_imports.sh +143 -0
  755. package/ds-canonical/hooks/tests/test_check_addon_subdir_ship.sh +171 -0
  756. package/ds-canonical/hooks/tests/test_check_app_shell_primary_header_consistency.sh +196 -0
  757. package/ds-canonical/hooks/tests/test_check_audit_post_report_validator.sh +127 -0
  758. package/ds-canonical/hooks/tests/test_check_audit_sample_escape.sh +93 -0
  759. package/ds-canonical/hooks/tests/test_check_benchmark_citation.sh +115 -0
  760. package/ds-canonical/hooks/tests/test_check_canonical_propagation.sh +133 -0
  761. package/ds-canonical/hooks/tests/test_check_chrome_header_avatar_canonical.sh +198 -0
  762. package/ds-canonical/hooks/tests/test_check_chrome_header_handcraft.sh +146 -0
  763. package/ds-canonical/hooks/tests/test_check_code_quality.sh +15 -0
  764. package/ds-canonical/hooks/tests/test_check_codex_brief_invariants.sh +208 -0
  765. package/ds-canonical/hooks/tests/test_check_codex_collab_5step.sh +96 -0
  766. package/ds-canonical/hooks/tests/test_check_consumer_app_invariants.sh +12 -0
  767. package/ds-canonical/hooks/tests/test_check_consumer_app_story_title.sh +164 -0
  768. package/ds-canonical/hooks/tests/test_check_consumer_ds_primitive_misuse.sh +240 -0
  769. package/ds-canonical/hooks/tests/test_check_consumer_no_ds_catalog.sh +214 -0
  770. package/ds-canonical/hooks/tests/test_check_consumer_story_baseline.sh +202 -0
  771. package/ds-canonical/hooks/tests/test_check_cva_default_sync.sh +15 -0
  772. package/ds-canonical/hooks/tests/test_check_data_table_size_num_to_meta_width.sh +53 -0
  773. package/ds-canonical/hooks/tests/test_check_datatable_invariants.sh +122 -0
  774. package/ds-canonical/hooks/tests/test_check_dim_count_drift.sh +98 -0
  775. package/ds-canonical/hooks/tests/test_check_ds_anchor_preflight.sh +104 -0
  776. package/ds-canonical/hooks/tests/test_check_escape_marker_abuse.sh +192 -0
  777. package/ds-canonical/hooks/tests/test_check_field_controls_contracts.sh +126 -0
  778. package/ds-canonical/hooks/tests/test_check_field_family_invariants.sh +203 -0
  779. package/ds-canonical/hooks/tests/test_check_file_size_budget.sh +32 -0
  780. package/ds-canonical/hooks/tests/test_check_fork_user_plugin_install.sh +46 -0
  781. package/ds-canonical/hooks/tests/test_check_full_story_visual_interaction_sweep.sh +190 -0
  782. package/ds-canonical/hooks/tests/test_check_hardcoded_strings.sh +14 -0
  783. package/ds-canonical/hooks/tests/test_check_header_with_tabs_border.sh +110 -0
  784. package/ds-canonical/hooks/tests/test_check_item_list_gap.sh +44 -0
  785. package/ds-canonical/hooks/tests/test_check_layout_space_canonical.sh +73 -0
  786. package/ds-canonical/hooks/tests/test_check_layout_space_magic_numbers.sh +206 -0
  787. package/ds-canonical/hooks/tests/test_check_main_branch_workbench.sh +147 -0
  788. package/ds-canonical/hooks/tests/test_check_naming_and_abstraction.sh +136 -0
  789. package/ds-canonical/hooks/tests/test_check_opacity_token_usage.sh +110 -0
  790. package/ds-canonical/hooks/tests/test_check_orphan_ds_css.sh +212 -0
  791. package/ds-canonical/hooks/tests/test_check_overlay_handcraft.sh +126 -0
  792. package/ds-canonical/hooks/tests/test_check_overlay_open_focus_escape_probe.sh +191 -0
  793. package/ds-canonical/hooks/tests/test_check_pattern_invariants.sh +148 -0
  794. package/ds-canonical/hooks/tests/test_check_peoplepicker_ssot_drift.sh +108 -0
  795. package/ds-canonical/hooks/tests/test_check_person_data_richness.sh +58 -0
  796. package/ds-canonical/hooks/tests/test_check_pixel_quantified_audit.sh +142 -0
  797. package/ds-canonical/hooks/tests/test_check_plugin_fork_health.sh +9 -0
  798. package/ds-canonical/hooks/tests/test_check_propose_cite_required.sh +181 -0
  799. package/ds-canonical/hooks/tests/test_check_propose_discipline.sh +10 -0
  800. package/ds-canonical/hooks/tests/test_check_propose_plain_chinese.sh +127 -0
  801. package/ds-canonical/hooks/tests/test_check_propose_pre_grep_verify.sh +117 -0
  802. package/ds-canonical/hooks/tests/test_check_propose_without_benchmark.sh +55 -0
  803. package/ds-canonical/hooks/tests/test_check_select_all_canonical.sh +125 -0
  804. package/ds-canonical/hooks/tests/test_check_sidebar_menu_button_implicit_wrap.sh +224 -0
  805. package/ds-canonical/hooks/tests/test_check_solo_workflow.sh +201 -0
  806. package/ds-canonical/hooks/tests/test_check_spec_class_drift.sh +135 -0
  807. package/ds-canonical/hooks/tests/test_check_story_anatomy.sh.broken +197 -0
  808. package/ds-canonical/hooks/tests/test_check_story_category.sh.broken +187 -0
  809. package/ds-canonical/hooks/tests/test_check_story_compile_drift.sh +15 -0
  810. package/ds-canonical/hooks/tests/test_check_story_invariants.sh +384 -0
  811. package/ds-canonical/hooks/tests/test_check_story_name_jargon.sh.broken +53 -0
  812. package/ds-canonical/hooks/tests/test_check_story_slot_split.sh +156 -0
  813. package/ds-canonical/hooks/tests/test_check_storybook_addon_packaging.sh +10 -0
  814. package/ds-canonical/hooks/tests/test_check_storybook_addon_preset_cjs.sh +200 -0
  815. package/ds-canonical/hooks/tests/test_check_substantive_edit_approval_preflight.sh +176 -0
  816. package/ds-canonical/hooks/tests/test_check_tab_lg_chrome_header_equal.sh +141 -0
  817. package/ds-canonical/hooks/tests/test_check_tailwind_wildcard_in_docs.sh +182 -0
  818. package/ds-canonical/hooks/tests/test_check_token_hygiene.sh +21 -0
  819. package/ds-canonical/hooks/tests/test_check_wrapper_primitive_schema_drift.sh +169 -0
  820. package/ds-canonical/hooks/tests/test_enforce_home_charter.sh +77 -0
  821. package/ds-canonical/hooks/tests/test_inject_deploy_url_after_push.sh +193 -0
  822. package/ds-canonical/hooks/tests/test_inject_pending_self_audit.sh +125 -0
  823. package/ds-canonical/hooks/tests/test_log_governance_fires.sh +10 -0
  824. package/ds-canonical/hooks/tests/test_log_skill_invokes.sh +7 -0
  825. package/ds-canonical/hooks/tests/test_post_edit_dispatcher.sh +108 -0
  826. package/ds-canonical/hooks/tests/test_session_start_governance_check.sh +154 -0
  827. package/ds-canonical/hooks/tests/test_stop_capture_metrics.sh +95 -0
  828. package/ds-canonical/hooks/tests/test_stop_governance_drift_check.sh.broken +125 -0
  829. package/ds-canonical/hooks/tests/test_stop_harvest_corrections.sh +10 -0
  830. package/ds-canonical/hooks/tests/test_stop_passive_logging.sh +100 -0
  831. package/ds-canonical/hooks/tests/test_stop_self_audit.sh +98 -0
  832. package/ds-canonical/hooks/tests/test_stop_tsc_sanity.sh +10 -0
  833. package/ds-canonical/references/README.md +46 -0
  834. package/ds-canonical/references/audit-coverage-vs-24-checklist.md +74 -0
  835. package/ds-canonical/references/build-ui-canonicals.md +72 -0
  836. package/ds-canonical/references/composition-fidelity.md +47 -0
  837. package/ds-canonical/references/cva-patterns.md +41 -0
  838. package/ds-canonical/references/drag-canonical.md +331 -0
  839. package/ds-canonical/references/item-anatomy-recipe.md +225 -0
  840. package/ds-canonical/references/naming-conventions.md +57 -0
  841. package/ds-canonical/references/principle-dim-map.json +613 -0
  842. package/ds-canonical/references/props-naming.md +59 -0
  843. package/ds-canonical/references/scenario-definition.md +146 -0
  844. package/ds-canonical/references/spec-rules.md +58 -0
  845. package/ds-canonical/references/ssot-consultation.md +63 -0
  846. package/ds-canonical/references/ssot-index.md +40 -0
  847. package/ds-canonical/references/story-baseline-registry.json +108 -0
  848. package/ds-canonical/references/structural-token-retention.md +42 -0
  849. package/ds-canonical/references/tailwind-gotchas.md +87 -0
  850. package/ds-canonical/references/ui-dev-rules.md +81 -0
  851. package/ds-canonical/rules/README.md +34 -0
  852. package/ds-canonical/rules/meta-patterns.md +87 -0
  853. package/ds-canonical/rules/self-verify.md +56 -0
  854. package/ds-canonical/rules/spec-rules.md +25 -0
  855. package/ds-canonical/rules/story-rules.md +67 -0
  856. package/ds-canonical/rules/ui-development.md +92 -0
  857. package/ds-canonical/skills/README.md +88 -0
  858. package/ds-canonical/skills/bug-fix-rhythm/SKILL.md +181 -0
  859. package/ds-canonical/skills/code-quality-audit/SKILL.md +63 -0
  860. package/ds-canonical/skills/codex-collab/SKILL.md +249 -0
  861. package/ds-canonical/skills/codex-collab/references/brief-template.md +48 -0
  862. package/ds-canonical/skills/codex-collab/references/transport.md +58 -0
  863. package/ds-canonical/skills/codify-corrections/SKILL.md +184 -0
  864. package/ds-canonical/skills/codify-principle/SKILL.md +151 -0
  865. package/ds-canonical/skills/component-quality-gate/SKILL.md +102 -0
  866. package/ds-canonical/skills/component-quality-gate/references/checklist.md +79 -0
  867. package/ds-canonical/skills/deep-audit-cross-codex/SKILL.md +254 -0
  868. package/ds-canonical/skills/deep-audit-cross-codex/references/phase-a-workflow.md +123 -0
  869. package/ds-canonical/skills/deep-audit-cross-codex/references/phase-b-codex-brief.md +186 -0
  870. package/ds-canonical/skills/deep-audit-cross-codex/references/skill-relationships-antipatterns-benchmarks.md +30 -0
  871. package/ds-canonical/skills/deep-audit-cross-codex/references/triage-rubric.md +69 -0
  872. package/ds-canonical/skills/deep-audit-cross-codex/references/upstream-directives-r-mapping.md +33 -0
  873. package/ds-canonical/skills/delivery-handoff/SKILL.md +229 -0
  874. package/ds-canonical/skills/delivery-handoff/references/flow-diagram.md +180 -0
  875. package/ds-canonical/skills/delivery-handoff/references/handoff-template.md +177 -0
  876. package/ds-canonical/skills/delivery-handoff/references/inventory-checklist.md +196 -0
  877. package/ds-canonical/skills/design-system-audit/SKILL.md +386 -0
  878. package/ds-canonical/skills/design-system-audit/references/audit-prompts.md +1325 -0
  879. package/ds-canonical/skills/design-system-audit/references/checkpoints.md +240 -0
  880. package/ds-canonical/skills/design-system-audit/references/historical-bugs.md +240 -0
  881. package/ds-canonical/skills/design-system-audit/references/principle-audit-protocol.md +378 -0
  882. package/ds-canonical/skills/design-system-audit/references/rule-placement.md +175 -0
  883. package/ds-canonical/skills/ensure-canonical/SKILL.md +196 -0
  884. package/ds-canonical/skills/governance-health/SKILL.md +147 -0
  885. package/ds-canonical/skills/knowledge-prune/SKILL.md +250 -0
  886. package/ds-canonical/skills/knowledge-prune/references/phase-z-cross-repo-ssot-propagation.md +11 -0
  887. package/ds-canonical/skills/knowledge-prune/references/prune-dimensions-d5-d10.md +55 -0
  888. package/ds-canonical/skills/knowledge-prune/references/world-class-prune-alignment.md +7 -0
  889. package/ds-canonical/skills/new-component/SKILL.md +170 -0
  890. package/ds-canonical/skills/new-component/references/new-component-checklist.md +85 -0
  891. package/ds-canonical/skills/performance-audit/SKILL.md +107 -0
  892. package/ds-canonical/skills/product-ui-audit/SKILL.md +230 -0
  893. package/ds-canonical/skills/product-ui-audit/references/audit-checks.md +246 -0
  894. package/ds-canonical/skills/product-ui-audit/references/common-misuses.md +329 -0
  895. package/ds-canonical/skills/product-ui-audit/references/report-template.md +159 -0
  896. package/ds-canonical/skills/propose-options/SKILL.md +177 -0
  897. package/ds-canonical/skills/prototype/SKILL.md +244 -0
  898. package/ds-canonical/skills/prototype/references/audit-checks.md +37 -0
  899. package/ds-canonical/skills/prototype/references/benchmark-sources.md +94 -0
  900. package/ds-canonical/skills/prototype/references/checkpoints.md +191 -0
  901. package/ds-canonical/skills/prototype/references/evaluation-matrix.md +141 -0
  902. package/ds-canonical/skills/prototype/references/ooux-template.md +198 -0
  903. package/ds-canonical/skills/prototype/references/proposal-template.md +229 -0
  904. package/ds-canonical/skills/scan-similar-bugs/SKILL.md +198 -0
  905. package/ds-canonical/skills/story-auto-compile-migrate/SKILL.md +159 -0
  906. package/ds-canonical/skills/story-writing/SKILL.md +122 -0
  907. package/ds-canonical/skills/story-writing/references/anatomy-standard.md +217 -0
  908. package/ds-canonical/skills/story-writing/references/category-templates.md +174 -0
  909. package/ds-canonical/skills/story-writing/references/example-selection.md +70 -0
  910. package/ds-canonical/skills/story-writing/references/self-check.md +20 -0
  911. package/ds-canonical/skills/ux-audit/SKILL.md +130 -0
  912. package/ds-canonical/skills/visual-audit/SKILL.md +245 -0
  913. package/ds-canonical/skills/visual-audit/output/.gitkeep +0 -0
  914. package/ds-canonical/skills/visual-audit/references/audit-architecture.md +100 -0
  915. package/ds-canonical/skills/visual-audit/references/visual-checklist.md +297 -0
  916. package/ds-canonical/skills/visual-audit/references/world-class-benchmarks.md +198 -0
  917. package/ds-canonical/templates/_README.md +23 -0
  918. package/ds-canonical/templates/dashboard-app.tsx +161 -0
  919. package/ds-story-manifest.json +1684 -0
  920. package/llms-full.txt +419 -0
  921. package/llms.txt +71 -0
  922. package/package.json +31 -8
  923. package/src/components/Accordion/accordion.anatomy.stories.tsx +496 -0
  924. package/src/components/Accordion/accordion.principles.stories.tsx +360 -0
  925. package/src/components/Accordion/accordion.spec.md +131 -0
  926. package/src/components/Accordion/accordion.stories.tsx +190 -0
  927. package/src/components/Accordion/accordion.tsx +4 -1
  928. package/src/components/Accordion/index.ts +5 -0
  929. package/src/components/Alert/alert.anatomy.stories.tsx +241 -0
  930. package/src/components/Alert/alert.principles.stories.tsx +220 -0
  931. package/src/components/Alert/alert.spec.md +202 -0
  932. package/src/components/Alert/alert.stories.tsx +139 -0
  933. package/src/components/Alert/alert.tsx +18 -7
  934. package/src/components/Alert/index.ts +5 -0
  935. package/src/components/AppShell/_demo-helpers.tsx +87 -11
  936. package/src/components/AppShell/app-shell.anatomy.stories.tsx +179 -0
  937. package/src/components/AppShell/app-shell.principles.stories.tsx +140 -0
  938. package/src/components/AppShell/app-shell.spec.md +358 -0
  939. package/src/components/AppShell/app-shell.stories.tsx +442 -0
  940. package/src/components/AppShell/app-shell.tsx +16 -10
  941. package/src/components/AppShell/index.ts +5 -0
  942. package/src/components/AspectRatio/aspect-ratio.anatomy.stories.tsx +208 -0
  943. package/src/components/AspectRatio/aspect-ratio.principles.stories.tsx +303 -0
  944. package/src/components/AspectRatio/aspect-ratio.spec.md +147 -0
  945. package/src/components/AspectRatio/aspect-ratio.stories.tsx +170 -0
  946. package/src/components/AspectRatio/aspect-ratio.tsx +6 -3
  947. package/src/components/AspectRatio/index.ts +5 -0
  948. package/src/components/Avatar/avatar.anatomy.stories.tsx +701 -0
  949. package/src/components/Avatar/avatar.principles.stories.tsx +245 -0
  950. package/src/components/Avatar/avatar.spec.md +312 -0
  951. package/src/components/Avatar/avatar.stories.tsx +135 -0
  952. package/src/components/Avatar/avatar.tsx +61 -54
  953. package/src/components/Avatar/index.ts +5 -0
  954. package/src/components/Badge/badge.anatomy.stories.tsx +591 -0
  955. package/src/components/Badge/badge.principles.stories.tsx +391 -0
  956. package/src/components/Badge/badge.spec.md +398 -0
  957. package/src/components/Badge/badge.stories.tsx +80 -0
  958. package/src/components/Badge/badge.tsx +38 -14
  959. package/src/components/Badge/index.ts +5 -0
  960. package/src/components/Breadcrumb/breadcrumb.anatomy.stories.tsx +458 -0
  961. package/src/components/Breadcrumb/breadcrumb.principles.stories.tsx +348 -0
  962. package/src/components/Breadcrumb/breadcrumb.spec.md +270 -0
  963. package/src/components/Breadcrumb/breadcrumb.stories.tsx +307 -0
  964. package/src/components/Breadcrumb/breadcrumb.tsx +12 -6
  965. package/src/components/Breadcrumb/index.ts +5 -0
  966. package/src/components/BulkActionBar/bulk-action-bar.anatomy.stories.tsx +225 -0
  967. package/src/components/BulkActionBar/bulk-action-bar.principles.stories.tsx +242 -0
  968. package/src/components/BulkActionBar/bulk-action-bar.spec.md +227 -0
  969. package/src/components/BulkActionBar/bulk-action-bar.stories.tsx +136 -0
  970. package/src/components/BulkActionBar/bulk-action-bar.tsx +14 -12
  971. package/src/components/BulkActionBar/index.ts +5 -0
  972. package/src/components/Button/button.anatomy.stories.tsx +710 -0
  973. package/src/components/Button/button.principles.stories.tsx +370 -0
  974. package/src/components/Button/button.spec.md +463 -0
  975. package/src/components/Button/button.stories.tsx +362 -0
  976. package/src/components/Button/button.tsx +86 -52
  977. package/src/components/Button/index.ts +6 -0
  978. package/src/components/Calendar/calendar.anatomy.stories.tsx +218 -0
  979. package/src/components/Calendar/calendar.principles.stories.tsx +143 -0
  980. package/src/components/Calendar/calendar.spec.md +270 -0
  981. package/src/components/Calendar/calendar.stories.tsx +88 -0
  982. package/src/components/Calendar/calendar.tsx +54 -40
  983. package/src/components/Calendar/index.ts +5 -0
  984. package/src/components/Carousel/carousel.anatomy.stories.tsx +516 -0
  985. package/src/components/Carousel/carousel.principles.stories.tsx +330 -0
  986. package/src/components/Carousel/carousel.spec.md +273 -0
  987. package/src/components/Carousel/carousel.stories.tsx +121 -0
  988. package/src/components/Carousel/carousel.tsx +27 -7
  989. package/src/components/Carousel/index.ts +5 -0
  990. package/src/components/Chart/chart.anatomy.stories.tsx +307 -0
  991. package/src/components/Chart/chart.principles.stories.tsx +436 -0
  992. package/src/components/Chart/chart.spec.md +174 -0
  993. package/src/components/Chart/chart.stories.tsx +268 -0
  994. package/src/components/Chart/chart.tsx +7 -3
  995. package/src/components/Chart/index.ts +5 -0
  996. package/src/components/Checkbox/checkbox-group.tsx +2 -1
  997. package/src/components/Checkbox/checkbox.anatomy.stories.tsx +626 -0
  998. package/src/components/Checkbox/checkbox.principles.stories.tsx +216 -0
  999. package/src/components/Checkbox/checkbox.spec.md +372 -0
  1000. package/src/components/Checkbox/checkbox.stories.tsx +114 -0
  1001. package/src/components/Checkbox/checkbox.tsx +115 -24
  1002. package/src/components/Checkbox/index.ts +6 -0
  1003. package/src/components/Chip/chip.anatomy.stories.tsx +422 -0
  1004. package/src/components/Chip/chip.principles.stories.tsx +228 -0
  1005. package/src/components/Chip/chip.spec.md +237 -0
  1006. package/src/components/Chip/chip.stories.tsx +88 -0
  1007. package/src/components/Chip/chip.tsx +10 -10
  1008. package/src/components/Chip/index.ts +5 -0
  1009. package/src/components/CircularProgress/circular-progress.anatomy.stories.tsx +176 -0
  1010. package/src/components/CircularProgress/circular-progress.principles.stories.tsx +260 -0
  1011. package/src/components/CircularProgress/circular-progress.spec.md +269 -0
  1012. package/src/components/CircularProgress/circular-progress.stories.tsx +145 -0
  1013. package/src/components/CircularProgress/circular-progress.tsx +4 -5
  1014. package/src/components/CircularProgress/index.ts +5 -0
  1015. package/src/components/Coachmark/coachmark-story-helpers.tsx +39 -0
  1016. package/src/components/Coachmark/coachmark.anatomy.stories.tsx +356 -0
  1017. package/src/components/Coachmark/coachmark.principles.stories.tsx +355 -0
  1018. package/src/components/Coachmark/coachmark.spec.md +238 -0
  1019. package/src/components/Coachmark/coachmark.stories.tsx +214 -0
  1020. package/src/components/Coachmark/coachmark.tsx +26 -9
  1021. package/src/components/Coachmark/index.ts +5 -0
  1022. package/src/components/Combobox/combobox.anatomy.stories.tsx +919 -0
  1023. package/src/components/Combobox/combobox.principles.stories.tsx +239 -0
  1024. package/src/components/Combobox/combobox.spec.md +202 -0
  1025. package/src/components/Combobox/combobox.stories.tsx +184 -0
  1026. package/src/components/Combobox/combobox.tsx +109 -55
  1027. package/src/components/Combobox/index.ts +5 -0
  1028. package/src/components/Command/command.anatomy.stories.tsx +107 -0
  1029. package/src/components/Command/command.principles.stories.tsx +86 -0
  1030. package/src/components/Command/command.spec.md +181 -0
  1031. package/src/components/Command/command.stories.tsx +280 -0
  1032. package/src/components/Command/command.tsx +14 -9
  1033. package/src/components/Command/index.ts +5 -0
  1034. package/src/components/DataTable/active-editor-controller.ts +4 -3
  1035. package/src/components/DataTable/cell-registry.tsx +27 -6
  1036. package/src/components/DataTable/data-table-filter-panel.tsx +16 -10
  1037. package/src/components/DataTable/data-table-interaction-layer.tsx +8 -7
  1038. package/src/components/DataTable/data-table-sort-manager.tsx +4 -4
  1039. package/src/components/DataTable/data-table.anatomy.stories.tsx +519 -0
  1040. package/src/components/DataTable/data-table.css +3 -3
  1041. package/src/components/DataTable/data-table.principles.stories.tsx +265 -0
  1042. package/src/components/DataTable/data-table.spec.md +540 -0
  1043. package/src/components/DataTable/data-table.stories.tsx +1942 -0
  1044. package/src/components/DataTable/data-table.tsx +323 -104
  1045. package/src/components/DataTable/filter-operators.spec.md +267 -0
  1046. package/src/components/DataTable/filter-operators.ts +1 -1
  1047. package/src/components/DataTable/filter-tree.ts +34 -11
  1048. package/src/components/DataTable/index.ts +5 -0
  1049. package/src/components/DateGrid/date-grid.anatomy.stories.tsx +583 -0
  1050. package/src/components/DateGrid/date-grid.principles.stories.tsx +338 -0
  1051. package/src/components/DateGrid/date-grid.spec.md +220 -0
  1052. package/src/components/DateGrid/date-grid.stories.tsx +195 -0
  1053. package/src/components/DateGrid/date-grid.tsx +29 -23
  1054. package/src/components/DateGrid/index.ts +5 -0
  1055. package/src/components/DatePicker/date-picker.anatomy.stories.tsx +952 -0
  1056. package/src/components/DatePicker/date-picker.principles.stories.tsx +205 -0
  1057. package/src/components/DatePicker/date-picker.spec.md +338 -0
  1058. package/src/components/DatePicker/date-picker.stories.tsx +342 -0
  1059. package/src/components/DatePicker/date-picker.tsx +79 -34
  1060. package/src/components/DatePicker/index.ts +5 -0
  1061. package/src/components/DescriptionList/description-list.anatomy.stories.tsx +252 -0
  1062. package/src/components/DescriptionList/description-list.principles.stories.tsx +309 -0
  1063. package/src/components/DescriptionList/description-list.spec.md +220 -0
  1064. package/src/components/DescriptionList/description-list.stories.tsx +112 -0
  1065. package/src/components/DescriptionList/description-list.tsx +3 -3
  1066. package/src/components/DescriptionList/index.ts +5 -0
  1067. package/src/components/Dialog/dialog.anatomy.stories.tsx +484 -0
  1068. package/src/components/Dialog/dialog.principles.stories.tsx +313 -0
  1069. package/src/components/Dialog/dialog.spec.md +216 -0
  1070. package/src/components/Dialog/dialog.stories.tsx +483 -0
  1071. package/src/components/Dialog/dialog.tsx +11 -10
  1072. package/src/components/Dialog/index.ts +5 -0
  1073. package/src/components/DropdownMenu/dropdown-menu.anatomy.stories.tsx +971 -0
  1074. package/src/components/DropdownMenu/dropdown-menu.principles.stories.tsx +339 -0
  1075. package/src/components/DropdownMenu/dropdown-menu.spec.md +262 -0
  1076. package/src/components/DropdownMenu/dropdown-menu.stories.tsx +286 -0
  1077. package/src/components/DropdownMenu/dropdown-menu.tsx +39 -9
  1078. package/src/components/DropdownMenu/index.ts +5 -0
  1079. package/src/components/Empty/empty.anatomy.stories.tsx +275 -0
  1080. package/src/components/Empty/empty.principles.stories.tsx +314 -0
  1081. package/src/components/Empty/empty.spec.md +217 -0
  1082. package/src/components/Empty/empty.stories.tsx +69 -0
  1083. package/src/components/Empty/empty.tsx +16 -7
  1084. package/src/components/Empty/index.ts +5 -0
  1085. package/src/components/Field/field-context.ts +98 -0
  1086. package/src/components/Field/field-controls.spec.md +383 -0
  1087. package/src/components/Field/field-types.ts +1 -1
  1088. package/src/components/Field/field-wrapper.tsx +34 -14
  1089. package/src/components/Field/field.anatomy.stories.tsx +544 -0
  1090. package/src/components/Field/field.principles.stories.tsx +278 -0
  1091. package/src/components/Field/field.spec.md +462 -0
  1092. package/src/components/Field/field.stories.tsx +716 -0
  1093. package/src/components/Field/field.tsx +12 -5
  1094. package/src/components/Field/form-validation.spec.md +175 -0
  1095. package/src/components/Field/index.ts +5 -0
  1096. package/src/components/Field/use-form-validation.ts +266 -0
  1097. package/src/components/FieldControlGroup/field-control-group.anatomy.stories.tsx +119 -0
  1098. package/src/components/FieldControlGroup/field-control-group.principles.stories.tsx +121 -0
  1099. package/src/components/FieldControlGroup/field-control-group.spec.md +195 -0
  1100. package/src/components/FieldControlGroup/field-control-group.stories.tsx +161 -0
  1101. package/src/components/FieldControlGroup/field-control-group.tsx +12 -11
  1102. package/src/components/FieldControlGroup/index.ts +5 -0
  1103. package/src/components/FileItem/file-item.anatomy.stories.tsx +346 -0
  1104. package/src/components/FileItem/file-item.principles.stories.tsx +276 -0
  1105. package/src/components/FileItem/file-item.spec.md +491 -0
  1106. package/src/components/FileItem/file-item.stories.tsx +265 -0
  1107. package/src/components/FileItem/file-item.tsx +40 -15
  1108. package/src/components/FileItem/index.ts +5 -0
  1109. package/src/components/FileUpload/file-upload.anatomy.stories.tsx +446 -0
  1110. package/src/components/FileUpload/file-upload.principles.stories.tsx +312 -0
  1111. package/src/components/FileUpload/file-upload.spec.md +166 -0
  1112. package/src/components/FileUpload/file-upload.stories.tsx +167 -0
  1113. package/src/components/FileUpload/file-upload.tsx +97 -31
  1114. package/src/components/FileUpload/index.ts +5 -0
  1115. package/src/components/FileViewer/file-viewer.anatomy.stories.tsx +1129 -0
  1116. package/src/components/FileViewer/file-viewer.principles.stories.tsx +636 -0
  1117. package/src/components/FileViewer/file-viewer.spec.md +368 -0
  1118. package/src/components/FileViewer/file-viewer.stories.tsx +407 -0
  1119. package/src/components/FileViewer/file-viewer.tsx +62 -31
  1120. package/src/components/FileViewer/index.ts +5 -0
  1121. package/src/components/HoverCard/hover-card.anatomy.stories.tsx +145 -0
  1122. package/src/components/HoverCard/hover-card.principles.stories.tsx +222 -0
  1123. package/src/components/HoverCard/hover-card.spec.md +167 -0
  1124. package/src/components/HoverCard/hover-card.stories.tsx +304 -0
  1125. package/src/components/HoverCard/hover-card.tsx +15 -4
  1126. package/src/components/HoverCard/index.ts +5 -0
  1127. package/src/components/Input/index.ts +5 -0
  1128. package/src/components/Input/input.anatomy.stories.tsx +763 -0
  1129. package/src/components/Input/input.principles.stories.tsx +265 -0
  1130. package/src/components/Input/input.spec.md +207 -0
  1131. package/src/components/Input/input.stories.tsx +139 -0
  1132. package/src/components/Input/input.tsx +18 -19
  1133. package/src/components/LinkInput/index.ts +5 -0
  1134. package/src/components/LinkInput/link-input.anatomy.stories.tsx +748 -0
  1135. package/src/components/LinkInput/link-input.principles.stories.tsx +182 -0
  1136. package/src/components/LinkInput/link-input.spec.md +144 -0
  1137. package/src/components/LinkInput/link-input.stories.tsx +132 -0
  1138. package/src/components/LinkInput/link-input.tsx +53 -40
  1139. package/src/components/Menu/index.ts +5 -0
  1140. package/src/components/Menu/menu-item.anatomy.stories.tsx +780 -0
  1141. package/src/components/Menu/menu-item.principles.stories.tsx +81 -0
  1142. package/src/components/Menu/menu-item.spec.md +305 -0
  1143. package/src/components/Menu/menu-item.stories.tsx +214 -0
  1144. package/src/components/Menu/menu-item.tsx +11 -4
  1145. package/src/components/Notice/index.ts +5 -0
  1146. package/src/components/Notice/notice.anatomy.stories.tsx +615 -0
  1147. package/src/components/Notice/notice.principles.stories.tsx +102 -0
  1148. package/src/components/Notice/notice.spec.md +159 -0
  1149. package/src/components/Notice/notice.stories.tsx +257 -0
  1150. package/src/components/Notice/notice.tsx +47 -14
  1151. package/src/components/NumberInput/index.ts +5 -0
  1152. package/src/components/NumberInput/number-input.anatomy.stories.tsx +788 -0
  1153. package/src/components/NumberInput/number-input.principles.stories.tsx +200 -0
  1154. package/src/components/NumberInput/number-input.spec.md +145 -0
  1155. package/src/components/NumberInput/number-input.stories.tsx +142 -0
  1156. package/src/components/NumberInput/number-input.tsx +32 -18
  1157. package/src/components/OverflowIndicator/index.ts +5 -0
  1158. package/src/components/OverflowIndicator/overflow-indicator.anatomy.stories.tsx +549 -0
  1159. package/src/components/OverflowIndicator/overflow-indicator.principles.stories.tsx +77 -0
  1160. package/src/components/OverflowIndicator/overflow-indicator.spec.md +127 -0
  1161. package/src/components/OverflowIndicator/overflow-indicator.stories.tsx +238 -0
  1162. package/src/components/OverflowIndicator/overflow-indicator.tsx +21 -7
  1163. package/src/components/PeoplePicker/index.ts +5 -0
  1164. package/src/components/PeoplePicker/people-picker-helpers.ts +5 -5
  1165. package/src/components/PeoplePicker/people-picker.anatomy.stories.tsx +427 -0
  1166. package/src/components/PeoplePicker/people-picker.principles.stories.tsx +192 -0
  1167. package/src/components/PeoplePicker/people-picker.spec.md +292 -0
  1168. package/src/components/PeoplePicker/people-picker.stories.tsx +162 -0
  1169. package/src/components/PeoplePicker/people-picker.tsx +92 -74
  1170. package/src/components/PeoplePicker/person-display.tsx +35 -32
  1171. package/src/components/Popover/index.ts +5 -0
  1172. package/src/components/Popover/popover.anatomy.stories.tsx +279 -0
  1173. package/src/components/Popover/popover.principles.stories.tsx +295 -0
  1174. package/src/components/Popover/popover.spec.md +207 -0
  1175. package/src/components/Popover/popover.stories.tsx +116 -0
  1176. package/src/components/Popover/popover.tsx +19 -16
  1177. package/src/components/ProfileCard/index.ts +5 -0
  1178. package/src/components/ProfileCard/profile-card.anatomy.stories.tsx +504 -0
  1179. package/src/components/ProfileCard/profile-card.principles.stories.tsx +225 -0
  1180. package/src/components/ProfileCard/profile-card.spec.md +190 -0
  1181. package/src/components/ProfileCard/profile-card.stories.tsx +53 -0
  1182. package/src/components/{NameCard/name-card.tsx → ProfileCard/profile-card.tsx} +39 -30
  1183. package/src/components/ProgressBar/index.ts +5 -0
  1184. package/src/components/ProgressBar/progress-bar.anatomy.stories.tsx +438 -0
  1185. package/src/components/ProgressBar/progress-bar.principles.stories.tsx +339 -0
  1186. package/src/components/ProgressBar/progress-bar.spec.md +240 -0
  1187. package/src/components/ProgressBar/progress-bar.stories.tsx +119 -0
  1188. package/src/components/ProgressBar/progress-bar.tsx +4 -4
  1189. package/src/components/RadioGroup/index.ts +5 -0
  1190. package/src/components/RadioGroup/radio-group.anatomy.stories.tsx +681 -0
  1191. package/src/components/RadioGroup/radio-group.principles.stories.tsx +163 -0
  1192. package/src/components/RadioGroup/radio-group.spec.md +149 -0
  1193. package/src/components/RadioGroup/radio-group.stories.tsx +103 -0
  1194. package/src/components/RadioGroup/radio-group.tsx +150 -60
  1195. package/src/components/Rating/index.ts +5 -0
  1196. package/src/components/Rating/rating.anatomy.stories.tsx +498 -0
  1197. package/src/components/Rating/rating.principles.stories.tsx +296 -0
  1198. package/src/components/Rating/rating.spec.md +214 -0
  1199. package/src/components/Rating/rating.stories.tsx +133 -0
  1200. package/src/components/Rating/rating.tsx +32 -17
  1201. package/src/components/ScrollArea/index.ts +5 -0
  1202. package/src/components/ScrollArea/scroll-area.anatomy.stories.tsx +451 -0
  1203. package/src/components/ScrollArea/scroll-area.principles.stories.tsx +331 -0
  1204. package/src/components/ScrollArea/scroll-area.spec.md +144 -0
  1205. package/src/components/ScrollArea/scroll-area.stories.tsx +243 -0
  1206. package/src/components/ScrollArea/scroll-area.tsx +3 -3
  1207. package/src/components/SegmentedControl/index.ts +5 -0
  1208. package/src/components/SegmentedControl/segmented-control.anatomy.stories.tsx +295 -0
  1209. package/src/components/SegmentedControl/segmented-control.principles.stories.tsx +281 -0
  1210. package/src/components/SegmentedControl/segmented-control.spec.md +297 -0
  1211. package/src/components/SegmentedControl/segmented-control.stories.tsx +33 -0
  1212. package/src/components/SegmentedControl/segmented-control.tsx +25 -16
  1213. package/src/components/Select/index.ts +5 -0
  1214. package/src/components/Select/select.anatomy.stories.tsx +828 -0
  1215. package/src/components/Select/select.principles.stories.tsx +311 -0
  1216. package/src/components/Select/select.spec.md +338 -0
  1217. package/src/components/Select/select.stories.tsx +198 -0
  1218. package/src/components/Select/select.tsx +72 -30
  1219. package/src/components/SelectMenu/index.ts +5 -0
  1220. package/src/components/SelectMenu/select-menu.anatomy.stories.tsx +812 -0
  1221. package/src/components/SelectMenu/select-menu.principles.stories.tsx +107 -0
  1222. package/src/components/SelectMenu/select-menu.spec.md +232 -0
  1223. package/src/components/SelectMenu/select-menu.stories.tsx +155 -0
  1224. package/src/components/SelectMenu/select-menu.tsx +123 -16
  1225. package/src/components/SelectionControl/index.ts +5 -0
  1226. package/src/components/SelectionControl/selection-item.anatomy.stories.tsx +571 -0
  1227. package/src/components/SelectionControl/selection-item.principles.stories.tsx +77 -0
  1228. package/src/components/SelectionControl/selection-item.spec.md +142 -0
  1229. package/src/components/SelectionControl/selection-item.stories.tsx +137 -0
  1230. package/src/components/SelectionControl/selection-item.tsx +8 -2
  1231. package/src/components/Separator/index.ts +5 -0
  1232. package/src/components/Separator/separator.anatomy.stories.tsx +125 -0
  1233. package/src/components/Separator/separator.principles.stories.tsx +141 -0
  1234. package/src/components/Separator/separator.spec.md +115 -0
  1235. package/src/components/Separator/separator.stories.tsx +127 -0
  1236. package/src/components/Separator/separator.tsx +2 -2
  1237. package/src/components/Sheet/index.ts +5 -0
  1238. package/src/components/Sheet/sheet.anatomy.stories.tsx +269 -0
  1239. package/src/components/Sheet/sheet.principles.stories.tsx +351 -0
  1240. package/src/components/Sheet/sheet.spec.md +146 -0
  1241. package/src/components/Sheet/sheet.stories.tsx +168 -0
  1242. package/src/components/Sheet/sheet.tsx +9 -7
  1243. package/src/components/Sidebar/index.ts +5 -0
  1244. package/src/components/Sidebar/sidebar.anatomy.stories.tsx +772 -0
  1245. package/src/components/Sidebar/sidebar.principles.stories.tsx +505 -0
  1246. package/src/components/Sidebar/sidebar.spec.md +725 -0
  1247. package/src/components/Sidebar/sidebar.stories.tsx +500 -0
  1248. package/src/components/Sidebar/sidebar.tsx +56 -20
  1249. package/src/components/Skeleton/index.ts +5 -0
  1250. package/src/components/Skeleton/skeleton.anatomy.stories.tsx +145 -0
  1251. package/src/components/Skeleton/skeleton.principles.stories.tsx +234 -0
  1252. package/src/components/Skeleton/skeleton.spec.md +105 -0
  1253. package/src/components/Skeleton/skeleton.stories.tsx +137 -0
  1254. package/src/components/Skeleton/skeleton.tsx +2 -2
  1255. package/src/components/Slider/index.ts +5 -0
  1256. package/src/components/Slider/slider.anatomy.stories.tsx +236 -0
  1257. package/src/components/Slider/slider.principles.stories.tsx +250 -0
  1258. package/src/components/Slider/slider.spec.md +358 -0
  1259. package/src/components/Slider/slider.stories.tsx +99 -0
  1260. package/src/components/Slider/slider.tsx +54 -16
  1261. package/src/components/Steps/index.ts +5 -0
  1262. package/src/components/Steps/steps.anatomy.stories.tsx +448 -0
  1263. package/src/components/Steps/steps.principles.stories.tsx +300 -0
  1264. package/src/components/Steps/steps.spec.md +480 -0
  1265. package/src/components/Steps/steps.stories.tsx +335 -0
  1266. package/src/components/Steps/steps.tsx +67 -29
  1267. package/src/components/Switch/index.ts +5 -0
  1268. package/src/components/Switch/switch.anatomy.stories.tsx +227 -0
  1269. package/src/components/Switch/switch.principles.stories.tsx +174 -0
  1270. package/src/components/Switch/switch.spec.md +238 -0
  1271. package/src/components/Switch/switch.stories.tsx +107 -0
  1272. package/src/components/Switch/switch.tsx +116 -38
  1273. package/src/components/Tabs/index.ts +5 -0
  1274. package/src/components/Tabs/tabs.anatomy.stories.tsx +415 -0
  1275. package/src/components/Tabs/tabs.principles.stories.tsx +259 -0
  1276. package/src/components/Tabs/tabs.spec.md +332 -0
  1277. package/src/components/Tabs/tabs.stories.tsx +155 -0
  1278. package/src/components/Tabs/tabs.tsx +49 -35
  1279. package/src/components/Tag/index.ts +5 -0
  1280. package/src/components/Tag/tag.anatomy.stories.tsx +664 -0
  1281. package/src/components/Tag/tag.principles.stories.tsx +270 -0
  1282. package/src/components/Tag/tag.spec.md +324 -0
  1283. package/src/components/Tag/tag.stories.tsx +69 -0
  1284. package/src/components/Tag/tag.tsx +59 -57
  1285. package/src/components/Textarea/index.ts +5 -0
  1286. package/src/components/Textarea/textarea.anatomy.stories.tsx +304 -0
  1287. package/src/components/Textarea/textarea.principles.stories.tsx +175 -0
  1288. package/src/components/Textarea/textarea.spec.md +163 -0
  1289. package/src/components/Textarea/textarea.stories.tsx +53 -0
  1290. package/src/components/Textarea/textarea.tsx +36 -27
  1291. package/src/components/TimePicker/index.ts +5 -0
  1292. package/src/components/TimePicker/time-columns.tsx +8 -1
  1293. package/src/components/TimePicker/time-picker.anatomy.stories.tsx +282 -0
  1294. package/src/components/TimePicker/time-picker.principles.stories.tsx +140 -0
  1295. package/src/components/TimePicker/time-picker.spec.md +290 -0
  1296. package/src/components/TimePicker/time-picker.stories.tsx +193 -0
  1297. package/src/components/TimePicker/time-picker.tsx +46 -30
  1298. package/src/components/Toast/index.ts +5 -0
  1299. package/src/components/Toast/toast.anatomy.stories.tsx +323 -0
  1300. package/src/components/Toast/toast.principles.stories.tsx +216 -0
  1301. package/src/components/Toast/toast.spec.md +181 -0
  1302. package/src/components/Toast/toast.stories.tsx +129 -0
  1303. package/src/components/Toast/toast.tsx +11 -8
  1304. package/src/components/Tooltip/index.ts +5 -0
  1305. package/src/components/Tooltip/tooltip.anatomy.stories.tsx +413 -0
  1306. package/src/components/Tooltip/tooltip.principles.stories.tsx +204 -0
  1307. package/src/components/Tooltip/tooltip.spec.md +142 -0
  1308. package/src/components/Tooltip/tooltip.stories.tsx +116 -0
  1309. package/src/components/Tooltip/tooltip.tsx +5 -2
  1310. package/src/components/TreeView/index.ts +5 -0
  1311. package/src/components/TreeView/tree-view.anatomy.stories.tsx +431 -0
  1312. package/src/components/TreeView/tree-view.principles.stories.tsx +190 -0
  1313. package/src/components/TreeView/tree-view.spec.md +390 -0
  1314. package/src/components/TreeView/tree-view.stories.tsx +299 -0
  1315. package/src/components/TreeView/tree-view.tsx +79 -27
  1316. package/src/hooks/use-overflow-items.ts +10 -6
  1317. package/src/index.ts +73 -69
  1318. package/src/lib/utils.ts +2 -1
  1319. package/src/patterns/README.md +15 -11
  1320. package/src/patterns/action-bar/action-bar.spec.md +465 -0
  1321. package/src/patterns/action-bar/action-bar.stories.tsx +612 -0
  1322. package/src/patterns/element-anatomy/element-anatomy.spec.md +217 -0
  1323. package/src/patterns/element-anatomy/index.ts +5 -0
  1324. package/src/patterns/element-anatomy/inline-action.spec.md +320 -0
  1325. package/src/patterns/element-anatomy/item-anatomy.spec.md +1043 -0
  1326. package/src/patterns/element-anatomy/item-anatomy.stories.tsx +1623 -0
  1327. package/src/patterns/element-anatomy/item-anatomy.tsx +10 -6
  1328. package/src/patterns/header-canonical/chrome-header.tsx +16 -5
  1329. package/src/patterns/header-canonical/header-canonical.css +3 -4
  1330. package/src/patterns/header-canonical/header-canonical.spec.md +326 -0
  1331. package/src/patterns/header-canonical/header-canonical.stories.tsx +150 -0
  1332. package/src/patterns/header-canonical/index.ts +5 -0
  1333. package/src/patterns/horizontal-overflow/horizontal-overflow.spec.md +212 -0
  1334. package/src/patterns/horizontal-overflow/index.ts +5 -0
  1335. package/src/patterns/overlay-surface/index.ts +5 -0
  1336. package/src/patterns/overlay-surface/overlay-surface.spec.md +443 -0
  1337. package/src/patterns/overlay-surface/overlay-surface.tsx +31 -16
  1338. package/src/patterns/resize-handle/index.ts +5 -0
  1339. package/src/patterns/resize-handle/resize-handle.spec.md +120 -0
  1340. package/src/patterns/resize-handle/resize-handle.stories.tsx +71 -0
  1341. package/src/story-governance/category-matrix.json +132 -0
  1342. package/src/story-governance/category-matrix.ts +55 -0
  1343. package/src/styles/base.css +92 -0
  1344. package/src/styles/tokens.css +11 -0
  1345. package/src/tokens/README.md +7 -2
  1346. package/src/tokens/categorical-color.ts +164 -0
  1347. package/src/tokens/color/color.spec.md +801 -0
  1348. package/src/tokens/color/color.stories.tsx +363 -0
  1349. package/src/tokens/color/primitives.css +14 -5
  1350. package/src/tokens/color/semantic.css +28 -13
  1351. package/src/tokens/density/density.spec.md +130 -0
  1352. package/src/tokens/density/density.stories.tsx +240 -0
  1353. package/src/tokens/elevation/elevation.spec.md +78 -0
  1354. package/src/tokens/elevation/elevation.stories.tsx +98 -0
  1355. package/src/tokens/layoutSpace/layoutSpace.css +1 -1
  1356. package/src/tokens/layoutSpace/layoutSpace.spec.md +324 -0
  1357. package/src/tokens/layoutSpace/layoutSpace.stories.tsx +75 -0
  1358. package/src/tokens/motion/motion.css +2 -2
  1359. package/src/tokens/motion/motion.spec.md +105 -0
  1360. package/src/tokens/motion/motion.ts +1 -1
  1361. package/src/tokens/opacity/opacity.spec.md +73 -0
  1362. package/src/tokens/opacity/opacity.stories.tsx +65 -0
  1363. package/src/tokens/orphan-tokens.spec.md +128 -0
  1364. package/src/tokens/radius/radius.spec.md +126 -0
  1365. package/src/tokens/radius/radius.stories.tsx +86 -0
  1366. package/src/tokens/token-system.spec.md +240 -0
  1367. package/src/tokens/typography/typography.css +1 -1
  1368. package/src/tokens/typography/typography.spec.md +204 -0
  1369. package/src/tokens/typography/typography.stories.tsx +133 -0
  1370. package/src/tokens/uiSize/icon-size.ts +3 -4
  1371. package/src/tokens/uiSize/uiSize.css +21 -0
  1372. package/src/tokens/uiSize/uiSize.spec.md +466 -0
  1373. package/src/tokens/utility-registry.json +125 -0
  1374. package/dist/components/NameCard/name-card.d.ts.map +0 -1
  1375. package/dist/components/NameCard/name-card.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"_demo-helpers.d.ts","sourceRoot":"","sources":["../../../src/components/AppShell/_demo-helpers.tsx"],"names":[],"mappings":"AAuCA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;EAOX,CAAA;AAqBV,eAAO,MAAM,cAAc,+CAM1B,CAAA;AAID,eAAO,MAAM,UAAU,+CAuBtB,CAAA;AAMD,wBAAgB,WAAW,CAAC,EAC1B,gBAAgB,EAChB,qBAA4B,GAC7B,GAAE;IACD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAC3B,2CAgCL;AAQD,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,GAAE;IAAE,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAAO,2CAY/E;AASD,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,qBAA4B,GAC7B,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb;;;OAGG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC,2CAOA"}
1
+ {"version":3,"file":"_demo-helpers.d.ts","sourceRoot":"","sources":["../../../src/components/AppShell/_demo-helpers.tsx"],"names":[],"mappings":"AAmDA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;EAOX,CAAA;AAqBV,eAAO,MAAM,cAAc,+CAM1B,CAAA;AAID,eAAO,MAAM,UAAU,+CAuBtB,CAAA;AAQD,wBAAgB,WAAW,CAAC,EAC1B,gBAAgB,EAChB,qBAA4B,EAC5B,iBAAwB,GACzB,GAAE;IACD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAA;CACvB,2CAwDL;AAWD,wBAAgB,WAAW,4CAyB1B;AAQD,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,GAAE;IAAE,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAAO,2CAY/E;AASD,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,qBAA4B,GAC7B,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb;;;OAGG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC,2CAOA"}
@@ -1,14 +1,14 @@
1
1
  /**
2
2
  * AppShell — web service page-level layout primitive。
3
3
  *
4
- * 組合 Sidebar + ChromeHeader + Aside + main 成完整 page shell。SSOT 邊界:本 pattern only
4
+ * 組合 Sidebar + ChromeHeader + Aside + main 成完整 page shell。SSOT 邊界:本 composite component only
5
5
  * own slot composition + layout mode + Aside responsive mode;不 own sidebar / header /
6
6
  * sheet 視覺(各自 spec own)。
7
7
  *
8
8
  * 對齊 Mantine AppShell compound API + Ant Layout slot 模式 + Material 3 standard/modal
9
9
  * drawer canonical(per spec.md frontmatter cite)。
10
10
  *
11
- * Spec SSOT:`patterns/app-shell/app-shell.spec.md`
11
+ * Spec SSOT:`components/AppShell/app-shell.spec.md`
12
12
  */
13
13
  import * as React from 'react';
14
14
  type AppShellLayout = 'primary-sidebar' | 'primary-header';
@@ -62,7 +62,7 @@ declare const AppShell: React.ForwardRefExoticComponent<AppShellProps & React.Re
62
62
  * AppShellAside — right panel:standard inline(desktop) vs modal overlay(mobile)。
63
63
  *
64
64
  * Desktop(viewport ≥ 768px):
65
- * - Render 直接放 layout grid 右側(asideOpen=true mount,close hide via parent)
65
+ * - Render 直接放 layout grid 右側(AppShell 恆 render {aside};AppShellAside 於 !asideOpen 自行 return null — 內部自決,非 via parent)
66
66
  * - 不蓋 mask / background 可操作 / 佔 layout 寬
67
67
  * - Vertical extent:primary-sidebar → 頂天立地 / primary-header → header 下方
68
68
  *
@@ -1 +1 @@
1
- {"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../src/components/AppShell/app-shell.tsx"],"names":[],"mappings":"AACA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAc9B,KAAK,cAAc,GAAG,iBAAiB,GAAG,gBAAgB,CAAA;AAE1D,MAAM,WAAW,aAAc,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACzE,6FAA6F;IAC7F,MAAM,CAAC,EAAE,cAAc,CAAA;IACvB,sDAAsD;IACtD,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB;;;;OAIG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACxB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC9B,mDAAmD;IACnD,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB,qCAAqC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IAC3C,iDAAiD;IACjD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAA;IACb,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7C,uBAAuB;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAID,UAAU,oBAAoB;IAC5B,MAAM,EAAE,cAAc,CAAA;IACtB,SAAS,EAAE,OAAO,CAAA;IAClB,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,QAAQ,EAAE,OAAO,CAAA;CAClB;AAID,iBAAS,WAAW,IAAI,oBAAoB,CAI3C;AA+DD,QAAA,MAAM,QAAQ,sFAgIb,CAAA;AAKD;;;;;;;;;;;;GAYG;AACH,QAAA,MAAM,aAAa,wFAgElB,CAAA;AAQD,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,CAAA"}
1
+ {"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../src/components/AppShell/app-shell.tsx"],"names":[],"mappings":"AACA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAe9B,KAAK,cAAc,GAAG,iBAAiB,GAAG,gBAAgB,CAAA;AAE1D,MAAM,WAAW,aAAc,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACzE,6FAA6F;IAC7F,MAAM,CAAC,EAAE,cAAc,CAAA;IACvB,sDAAsD;IACtD,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB;;;;OAIG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACxB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC9B,mDAAmD;IACnD,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB,qCAAqC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IAC3C,iDAAiD;IACjD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAA;IACb,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7C,uBAAuB;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAID,UAAU,oBAAoB;IAC5B,MAAM,EAAE,cAAc,CAAA;IACtB,SAAS,EAAE,OAAO,CAAA;IAClB,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,QAAQ,EAAE,OAAO,CAAA;CAClB;AAID,iBAAS,WAAW,IAAI,oBAAoB,CAI3C;AA+DD,QAAA,MAAM,QAAQ,sFAiIb,CAAA;AAKD;;;;;;;;;;;;GAYG;AACH,QAAA,MAAM,aAAa,wFAoElB,CAAA;AAQD,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
3
  import { X } from "lucide-react";
4
- import { Sheet, SheetContent } from "../Sheet/sheet.js";
4
+ import { Sheet, SheetContent, SheetTitle } from "../Sheet/sheet.js";
5
5
  import { Button } from "../Button/button.js";
6
6
  import { ScrollArea } from "../ScrollArea/scroll-area.js";
7
7
  import { ChromeHeader } from "../../patterns/header-canonical/chrome-header.js";
@@ -134,9 +134,10 @@ const AppShell = React.forwardRef(
134
134
  /* @__PURE__ */ jsx(SkipToMain, {}),
135
135
  sidebar,
136
136
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col flex-1 min-w-0 min-h-0 overflow-hidden", children: [
137
- header && // Header 在 main column 內(main col sibling,非 main descendant) 跟 W3C ARIA in HTML
138
- // banner rule 對照:`<header>` main descendant 才不是 banner,本 ChromeHeader 是 <div>
139
- // 所以本來就不會被 banner role 計算。仍包 wrap div not <header> 確保不無意觸發 banner。
137
+ header && // Header 在 main column 內(main col sibling,非 main descendant)。ChromeHeader
138
+ // 2026-05-20 render `<header>`(chrome-header.tsx);依 W3C HTML-AAM,`<div>` wrapper
139
+ // scope out banner(只有 main/article/aside/nav/section 能)→ 仍得 implicit banner
140
+ // (對齊 app-shell.spec.md「W3C ARIA in HTML banner rule」段)。
140
141
  /* @__PURE__ */ jsx("div", { className: "flex-shrink-0", children: header }),
141
142
  /* @__PURE__ */ jsx(
142
143
  "main",
@@ -160,9 +161,9 @@ const AppShellAside = React.forwardRef(
160
161
  const { asideOpen, setAsideOpen, isMobile } = useAppShell();
161
162
  const isXl = useIsXl();
162
163
  const resolvedWidth = resolveAsideWidth(width, isXl);
163
- const frame = /* @__PURE__ */ jsxs(Fragment, { children: [
164
+ const renderFrame = (titleNode) => /* @__PURE__ */ jsxs(Fragment, { children: [
164
165
  /* @__PURE__ */ jsxs(ChromeHeader, { children: [
165
- /* @__PURE__ */ jsx("h2", { className: "text-body-lg font-medium flex-1 truncate", children: title }),
166
+ titleNode,
166
167
  /* @__PURE__ */ jsx(
167
168
  Button,
168
169
  {
@@ -184,7 +185,7 @@ const AppShellAside = React.forwardRef(
184
185
  side: "right",
185
186
  className: "w-[min(90vw,var(--app-shell-aside-modal-width))] flex flex-col p-0 [&>button]:hidden",
186
187
  style: { ["--app-shell-aside-modal-width"]: `${resolvedWidth}px` },
187
- children: frame
188
+ children: renderFrame(/* @__PURE__ */ jsx(SheetTitle, { className: "flex-1", children: title }))
188
189
  }
189
190
  ) });
190
191
  }
@@ -200,7 +201,7 @@ const AppShellAside = React.forwardRef(
200
201
  className
201
202
  ),
202
203
  style: { width: resolvedWidth },
203
- children: frame
204
+ children: renderFrame(/* @__PURE__ */ jsx("h2", { className: "text-body-lg font-medium flex-1 truncate", children: title }))
204
205
  }
205
206
  );
206
207
  }
@@ -1 +1 @@
1
- {"version":3,"file":"app-shell.js","sources":["../../../src/components/AppShell/app-shell.tsx"],"sourcesContent":["// @benchmark-cited: 2026-05-19 — Mantine AppShell / Ant Layout / Material 3 Drawer / Atlassian Navigation System cite in app-shell.spec.md frontmatter.\n/**\n * AppShell — web service page-level layout primitive。\n *\n * 組合 Sidebar + ChromeHeader + Aside + main 成完整 page shell。SSOT 邊界:本 pattern only\n * own slot composition + layout mode + Aside responsive mode;不 own sidebar / header /\n * sheet 視覺(各自 spec own)。\n *\n * 對齊 Mantine AppShell compound API + Ant Layout slot 模式 + Material 3 standard/modal\n * drawer canonical(per spec.md frontmatter cite)。\n *\n * Spec SSOT:`patterns/app-shell/app-shell.spec.md`\n */\n\nimport * as React from 'react'\nimport { X as XIcon } from 'lucide-react'\nimport {\n Sheet,\n SheetContent,\n} from '@/design-system/components/Sheet/sheet'\nimport { Button } from '@/design-system/components/Button/button'\nimport { ScrollArea } from '@/design-system/components/ScrollArea/scroll-area'\nimport { ChromeHeader } from '@/design-system/patterns/header-canonical/chrome-header'\nimport { useIsNarrowViewport } from '@/design-system/hooks/use-is-narrow-viewport'\nimport { cn } from '@/lib/utils'\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\ntype AppShellLayout = 'primary-sidebar' | 'primary-header'\n\nexport interface AppShellProps extends React.HTMLAttributes<HTMLDivElement> {\n /** primary-sidebar (Linear/Notion 派) | primary-header (GitHub/Slack 派);預設 primary-sidebar */\n layout?: AppShellLayout\n /** Sidebar 元素(必傳 Sidebar primitive,per Consumer 紀律)*/\n sidebar?: React.ReactNode\n /**\n * Local page header(永遠 render 在 main column 頂部,當前頁 actions / breadcrumb / page-level filter)。\n * 兩 layout mode 都會 render 此 slot — `primary-header` mode 多了 globalHeader 在上方,\n * **不取代** local header(per 2026-05-20 user clarification「primary-header = primary-sidebar + 一條 global header」)。\n */\n header?: React.ReactNode\n /**\n * Global header(僅 `primary-header` mode render)。橫跨整 viewport 的頂部 bar:\n * account avatar / workspace switcher / global search / notifications。\n * 對齊 GitHub top nav / Slack workspace bar / Gmail logo bar 慣例。\n * `primary-sidebar` mode 傳此 prop 會被忽略。\n */\n globalHeader?: React.ReactNode\n /** Aside 元素(`<AppShellAside>` sub-component);可選 */\n aside?: React.ReactNode\n /** Aside open state(modal mode 必須)*/\n asideOpen?: boolean\n onAsideOpenChange?: (open: boolean) => void\n /** Main content;`<main>` landmark + padding=0 */\n children: React.ReactNode\n}\n\nexport interface AppShellAsideProps {\n /** Required:modal mode 走 Sheet → aria-labelledby 強制,per sheet.spec.md:98 */\n title: string\n /** Width(number 或 breakpoint-keyed object);clamp min:240 max:640 */\n width?: number | { md?: number; xl?: number }\n /** Children content */\n children: React.ReactNode\n className?: string\n}\n\n// ── Context ──────────────────────────────────────────────────────────────────\n\ninterface AppShellContextValue {\n layout: AppShellLayout\n asideOpen: boolean\n setAsideOpen: (open: boolean) => void\n isMobile: boolean\n}\n\nconst AppShellContext = React.createContext<AppShellContextValue | null>(null)\n\nfunction useAppShell(): AppShellContextValue {\n const ctx = React.useContext(AppShellContext)\n if (!ctx) throw new Error('AppShellAside must be used within <AppShell>')\n return ctx\n}\n\n// Mobile breakpoint:**消費既有 `useIsNarrowViewport`**(`hooks/use-is-narrow-viewport.ts` SSOT,\n// 768px,跟 Sidebar SSOT 同源)— 不發明 local hook,per codex Layer B D2/D4 verdict 避 drift。\n\n// xl breakpoint(對齊 Tailwind v4 xl = 1280px,DS-wide consensus)\nconst XL_BREAKPOINT_PX = 1280\n\nfunction useIsXl(): boolean {\n const [isXl, setIsXl] = React.useState<boolean>(() => {\n if (typeof window === 'undefined') return false\n return window.matchMedia(`(min-width: ${XL_BREAKPOINT_PX}px)`).matches\n })\n\n React.useEffect(() => {\n const mq = window.matchMedia(`(min-width: ${XL_BREAKPOINT_PX}px)`)\n const handler = (e: MediaQueryListEvent) => setIsXl(e.matches)\n mq.addEventListener('change', handler)\n return () => mq.removeEventListener('change', handler)\n }, [])\n\n return isXl\n}\n\n// ── Width resolve(consumer 自傳 + clamp 240-640)──────────────────────────────\n\nconst ASIDE_WIDTH_MIN = 240\nconst ASIDE_WIDTH_MAX = 640\nconst ASIDE_WIDTH_DEFAULT = 320\n\nfunction resolveAsideWidth(width: AppShellAsideProps['width'], isXl: boolean): number {\n if (typeof width === 'number') {\n return Math.max(ASIDE_WIDTH_MIN, Math.min(ASIDE_WIDTH_MAX, width))\n }\n if (width && typeof width === 'object') {\n // breakpoint-keyed:xl viewport(≥1280px)用 xl,否則 md\n const v = (isXl ? width.xl ?? width.md : width.md) ?? ASIDE_WIDTH_DEFAULT\n return Math.max(ASIDE_WIDTH_MIN, Math.min(ASIDE_WIDTH_MAX, v))\n }\n return ASIDE_WIDTH_DEFAULT\n}\n\n// ── Skip-to-main link(a11y WCAG 2.4.1)───────────────────────────────────────\n\nfunction SkipToMain() {\n return (\n <a\n href=\"#app-shell-main\"\n className={cn(\n 'sr-only focus:not-sr-only',\n 'focus:fixed focus:top-2 focus:left-2 focus:z-50',\n 'focus:px-3 focus:py-2 focus:rounded-md',\n 'focus:bg-surface focus:text-foreground focus:shadow-[var(--elevation-200)]',\n 'focus:outline-none focus:ring-2 focus:ring-primary'\n )}\n >\n Skip to main content\n </a>\n )\n}\n\n// ── AppShell root ────────────────────────────────────────────────────────────\n\nconst AppShell = React.forwardRef<HTMLDivElement, AppShellProps>(\n (\n {\n layout = 'primary-sidebar',\n sidebar,\n header,\n globalHeader,\n aside,\n asideOpen: asideOpenProp,\n onAsideOpenChange,\n children,\n className,\n ...props\n },\n ref\n ) => {\n const [asideOpenInternal, setAsideOpenInternal] = React.useState(false)\n const isControlled = asideOpenProp !== undefined\n const asideOpen = isControlled ? asideOpenProp : asideOpenInternal\n\n const setAsideOpen = React.useCallback(\n (open: boolean) => {\n if (!isControlled) setAsideOpenInternal(open)\n onAsideOpenChange?.(open)\n },\n [isControlled, onAsideOpenChange]\n )\n\n const isMobile = useIsNarrowViewport()\n\n // ── Keyboard: cmd+. toggle aside ──\n // ⌘B sidebar toggle by Sidebar SSOT(本 component 不重覆 register)\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === '.' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n setAsideOpen(!asideOpen)\n }\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [asideOpen, setAsideOpen])\n\n const ctxValue = React.useMemo<AppShellContextValue>(\n () => ({ layout, asideOpen, setAsideOpen, isMobile }),\n [layout, asideOpen, setAsideOpen, isMobile]\n )\n\n // ── Layout grid(2 mode)──\n // primary-sidebar:\n // row1: [sidebar (頂天)][main col (header + main)][aside (頂天)]\n // primary-header:\n // row1: [header (橫跨整 viewport, banner role)]\n // row2: [sidebar][main][aside]\n\n // AppShellAside 自決 inline vs modal mode(via AppShellContext.isMobile)。\n // AppShell 一律只 render `{aside}` 一次,AppShellAside 內部根據 isMobile 決定 render 形式。\n\n if (layout === 'primary-header') {\n // primary-header layout(2026-05-21 v2 — user clarification「primary-header = primary-sidebar + 一條 global header」):\n // 結構:row1 globalHeader(全寬 global bar)/ row2 [sidebar][main col: localHeader + main][aside]\n // - globalHeader = 跨頁 account / workspace switcher / notifications(對齊 GitHub top nav / Slack workspace bar)\n // - header = local page header,**仍存在**(per page actions / breadcrumb,對齊 GitHub repo header / Slack channel header / Gmail email-list toolbar 2-layer 慣例)\n // Consumer 必傳 `<Sidebar viewportInsetTop=\"var(--chrome-header-height)\">` 讓 sidebar 從 globalHeader 下方起算。\n return (\n <AppShellContext.Provider value={ctxValue}>\n <div\n ref={ref}\n className={cn('flex h-svh w-full flex-col overflow-hidden bg-canvas', className)}\n {...props}\n >\n <SkipToMain />\n {/* Row 1:Global header(account / workspace switcher / notifications,橫跨整 viewport)*/}\n {globalHeader && <div className=\"flex-shrink-0\">{globalHeader}</div>}\n {/* Row 2:[sidebar][main col][aside]horizontal row */}\n <div className=\"flex flex-1 min-h-0 w-full\">\n {sidebar}\n {/* Main column:local header + main content(per user model「primary-header = primary-sidebar + global header」)*/}\n <div className=\"flex flex-col flex-1 min-w-0 min-h-0 overflow-hidden\">\n {header && <div className=\"flex-shrink-0\">{header}</div>}\n <main\n id=\"app-shell-main\"\n tabIndex={-1}\n className=\"flex-1 min-w-0 min-h-0 overflow-y-auto focus:outline-none\"\n >\n {children}\n </main>\n </div>\n {aside}\n </div>\n </div>\n </AppShellContext.Provider>\n )\n }\n\n // primary-sidebar layout\n return (\n <AppShellContext.Provider value={ctxValue}>\n <div\n ref={ref}\n className={cn('flex h-svh w-full overflow-hidden bg-canvas', className)}\n {...props}\n >\n <SkipToMain />\n {/* Sidebar — 頂天 */}\n {sidebar}\n {/* Main column(header + main 垂直堆)*/}\n <div className=\"flex flex-col flex-1 min-w-0 min-h-0 overflow-hidden\">\n {header && (\n // Header 在 main column 內(main col sibling,非 main descendant)→ 跟 W3C ARIA in HTML\n // banner rule 對照:`<header>` 在 main descendant 才不是 banner,本 ChromeHeader 是 <div>\n // 所以本來就不會被 banner role 計算。仍包 wrap div not <header> 確保不無意觸發 banner。\n <div className=\"flex-shrink-0\">{header}</div>\n )}\n <main\n id=\"app-shell-main\"\n tabIndex={-1}\n className=\"flex-1 min-h-0 overflow-y-auto focus:outline-none\"\n >\n {children}\n </main>\n </div>\n {/* Aside slot — desktop inline OR mobile Sheet,內部自決 */}\n {aside}\n </div>\n </AppShellContext.Provider>\n )\n }\n)\nAppShell.displayName = 'AppShell'\n\n// ── AppShellAside sub-component ──────────────────────────────────────────────\n\n/**\n * AppShellAside — right panel:standard inline(desktop) vs modal overlay(mobile)。\n *\n * Desktop(viewport ≥ 768px):\n * - Render 直接放 layout grid 右側(asideOpen=true 才 mount,close hide via parent)\n * - 不蓋 mask / background 可操作 / 佔 layout 寬\n * - Vertical extent:primary-sidebar → 頂天立地 / primary-header → header 下方\n *\n * Mobile(viewport < 768px):\n * - Render 走 Sheet primitive(side=\"right\",per sheet.spec.md)\n * - Mask 蓋 / background 不可操作 / 不佔 layout 寬\n * - title 強制(aria-labelledby per sheet.spec.md:98)\n */\nconst AppShellAside = React.forwardRef<HTMLElement, AppShellAsideProps>(\n ({ title, width, children, className }, ref) => {\n const { asideOpen, setAsideOpen, isMobile } = useAppShell()\n const isXl = useIsXl()\n const resolvedWidth = resolveAsideWidth(width, isXl)\n\n // Shared frame:always-on header(title + close X)+ body(ScrollArea + layoutSpace 規則 1B 父層 padding)\n // 對齊 codex Layer B 2026-05-20「container mode 可變,panel role/content 不該變」+ Notion/Figma right\n // panel 共識(modal vs inline 結構相同,host wrapper 不同)。\n // 2026-05-20 migrate 消費 ChromeHeader primitive(撤回自刻 + 撤回 bg-surface 疊加 — 對齊\n // `header-canonical.spec.md`「6. Background ownership」段「Nested chrome header 透明繼承\n // parent」:aside container 自身已 bg-surface,內 header 不該再畫 bg 避免疊加 drift)。\n const frame = (\n <>\n <ChromeHeader>\n <h2 className=\"text-body-lg font-medium flex-1 truncate\">{title}</h2>\n <Button\n iconOnly\n dismiss\n size=\"sm\"\n startIcon={XIcon}\n aria-label=\"關閉\"\n onClick={() => setAsideOpen(false)}\n />\n </ChromeHeader>\n <ScrollArea className=\"flex-1 min-h-0\">\n {children}\n </ScrollArea>\n </>\n )\n\n // Modal mode(mobile)— Sheet from right\n if (isMobile) {\n return (\n <Sheet open={asideOpen} onOpenChange={setAsideOpen}>\n <SheetContent\n side=\"right\"\n className=\"w-[min(90vw,var(--app-shell-aside-modal-width))] flex flex-col p-0 [&>button]:hidden\"\n style={{ ['--app-shell-aside-modal-width' as string]: `${resolvedWidth}px` }}\n >\n {frame}\n </SheetContent>\n </Sheet>\n )\n }\n\n // Standard inline mode(desktop)\n if (!asideOpen) return null\n\n return (\n <aside\n ref={ref}\n aria-label={title}\n className={cn(\n 'flex flex-col h-full min-h-0 overflow-hidden',\n 'bg-surface border-l border-divider',\n className\n )}\n style={{ width: resolvedWidth }}\n >\n {frame}\n </aside>\n )\n }\n)\nAppShellAside.displayName = 'AppShellAside'\n\n// ── Exports ──────────────────────────────────────────────────────────────────\n\n// code-quality-allow: dead-export useAppShell — public compound API hook(consumer 可自拼 custom aside layout,\n// 對齊 Radix `useDialogContext` / MUI `useFormControl` 慣例)。內部 AppShellAside 已消費(L294),\n// audit script 抓「無 cross-file import」是 false positive(2026-05-21 D2 codify)。\nexport { AppShell, AppShellAside, useAppShell }\n"],"names":["XIcon"],"mappings":"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"}
1
+ {"version":3,"file":"app-shell.js","sources":["../../../src/components/AppShell/app-shell.tsx"],"sourcesContent":["// @benchmark-cited: 2026-05-19 — Mantine AppShell / Ant Layout / Material 3 Drawer / Atlassian Navigation System cite in app-shell.spec.md frontmatter.\n/**\n * AppShell — web service page-level layout primitive。\n *\n * 組合 Sidebar + ChromeHeader + Aside + main 成完整 page shell。SSOT 邊界:本 composite component only\n * own slot composition + layout mode + Aside responsive mode;不 own sidebar / header /\n * sheet 視覺(各自 spec own)。\n *\n * 對齊 Mantine AppShell compound API + Ant Layout slot 模式 + Material 3 standard/modal\n * drawer canonical(per spec.md frontmatter cite)。\n *\n * Spec SSOT:`components/AppShell/app-shell.spec.md`\n */\n\nimport * as React from 'react'\nimport { X as XIcon } from 'lucide-react'\nimport {\n Sheet,\n SheetContent,\n SheetTitle,\n} from '@/design-system/components/Sheet/sheet'\nimport { Button } from '@/design-system/components/Button/button'\nimport { ScrollArea } from '@/design-system/components/ScrollArea/scroll-area'\nimport { ChromeHeader } from '@/design-system/patterns/header-canonical/chrome-header'\nimport { useIsNarrowViewport } from '@/design-system/hooks/use-is-narrow-viewport'\nimport { cn } from '@/lib/utils'\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\ntype AppShellLayout = 'primary-sidebar' | 'primary-header'\n\nexport interface AppShellProps extends React.HTMLAttributes<HTMLDivElement> {\n /** primary-sidebar (Linear/Notion 派) | primary-header (GitHub/Slack 派);預設 primary-sidebar */\n layout?: AppShellLayout\n /** Sidebar 元素(必傳 Sidebar primitive,per Consumer 紀律)*/\n sidebar?: React.ReactNode\n /**\n * Local page header(永遠 render 在 main column 頂部,當前頁 actions / breadcrumb / page-level filter)。\n * 兩 layout mode 都會 render 此 slot — `primary-header` mode 多了 globalHeader 在上方,\n * **不取代** local header(per 2026-05-20 user clarification「primary-header = primary-sidebar + 一條 global header」)。\n */\n header?: React.ReactNode\n /**\n * Global header(僅 `primary-header` mode render)。橫跨整 viewport 的頂部 bar:\n * account avatar / workspace switcher / global search / notifications。\n * 對齊 GitHub top nav / Slack workspace bar / Gmail logo bar 慣例。\n * `primary-sidebar` mode 傳此 prop 會被忽略。\n */\n globalHeader?: React.ReactNode\n /** Aside 元素(`<AppShellAside>` sub-component);可選 */\n aside?: React.ReactNode\n /** Aside open state(modal mode 必須)*/\n asideOpen?: boolean\n onAsideOpenChange?: (open: boolean) => void\n /** Main content;`<main>` landmark + padding=0 */\n children: React.ReactNode\n}\n\nexport interface AppShellAsideProps {\n /** Required:modal mode 走 Sheet → aria-labelledby 強制,per sheet.spec.md:98 */\n title: string\n /** Width(number 或 breakpoint-keyed object);clamp min:240 max:640 */\n width?: number | { md?: number; xl?: number }\n /** Children content */\n children: React.ReactNode\n className?: string\n}\n\n// ── Context ──────────────────────────────────────────────────────────────────\n\ninterface AppShellContextValue {\n layout: AppShellLayout\n asideOpen: boolean\n setAsideOpen: (open: boolean) => void\n isMobile: boolean\n}\n\nconst AppShellContext = React.createContext<AppShellContextValue | null>(null)\n\nfunction useAppShell(): AppShellContextValue {\n const ctx = React.useContext(AppShellContext)\n if (!ctx) throw new Error('AppShellAside must be used within <AppShell>')\n return ctx\n}\n\n// Mobile breakpoint:**消費既有 `useIsNarrowViewport`**(`hooks/use-is-narrow-viewport.ts` SSOT,\n// 768px,跟 Sidebar SSOT 同源)— 不發明 local hook,per codex Layer B D2/D4 verdict 避 drift。\n\n// xl breakpoint(對齊 Tailwind v4 xl = 1280px,DS-wide consensus)\nconst XL_BREAKPOINT_PX = 1280\n\nfunction useIsXl(): boolean {\n const [isXl, setIsXl] = React.useState<boolean>(() => {\n if (typeof window === 'undefined') return false\n return window.matchMedia(`(min-width: ${XL_BREAKPOINT_PX}px)`).matches\n })\n\n React.useEffect(() => {\n const mq = window.matchMedia(`(min-width: ${XL_BREAKPOINT_PX}px)`)\n const handler = (e: MediaQueryListEvent) => setIsXl(e.matches)\n mq.addEventListener('change', handler)\n return () => mq.removeEventListener('change', handler)\n }, [])\n\n return isXl\n}\n\n// ── Width resolve(consumer 自傳 + clamp 240-640)──────────────────────────────\n\nconst ASIDE_WIDTH_MIN = 240\nconst ASIDE_WIDTH_MAX = 640\nconst ASIDE_WIDTH_DEFAULT = 320\n\nfunction resolveAsideWidth(width: AppShellAsideProps['width'], isXl: boolean): number {\n if (typeof width === 'number') {\n return Math.max(ASIDE_WIDTH_MIN, Math.min(ASIDE_WIDTH_MAX, width))\n }\n if (width && typeof width === 'object') {\n // breakpoint-keyed:xl viewport(≥1280px)用 xl,否則 md\n const v = (isXl ? width.xl ?? width.md : width.md) ?? ASIDE_WIDTH_DEFAULT\n return Math.max(ASIDE_WIDTH_MIN, Math.min(ASIDE_WIDTH_MAX, v))\n }\n return ASIDE_WIDTH_DEFAULT\n}\n\n// ── Skip-to-main link(a11y WCAG 2.4.1)───────────────────────────────────────\n\nfunction SkipToMain() {\n return (\n <a\n href=\"#app-shell-main\"\n className={cn(\n 'sr-only focus:not-sr-only',\n 'focus:fixed focus:top-2 focus:left-2 focus:z-50',\n 'focus:px-3 focus:py-2 focus:rounded-md',\n 'focus:bg-surface focus:text-foreground focus:shadow-[var(--elevation-200)]',\n 'focus:outline-none focus:ring-2 focus:ring-primary'\n )}\n >\n Skip to main content\n </a>\n )\n}\n\n// ── AppShell root ────────────────────────────────────────────────────────────\n\nconst AppShell = React.forwardRef<HTMLDivElement, AppShellProps>(\n (\n {\n layout = 'primary-sidebar',\n sidebar,\n header,\n globalHeader,\n aside,\n asideOpen: asideOpenProp,\n onAsideOpenChange,\n children,\n className,\n ...props\n },\n ref\n ) => {\n const [asideOpenInternal, setAsideOpenInternal] = React.useState(false)\n const isControlled = asideOpenProp !== undefined\n const asideOpen = isControlled ? asideOpenProp : asideOpenInternal\n\n const setAsideOpen = React.useCallback(\n (open: boolean) => {\n if (!isControlled) setAsideOpenInternal(open)\n onAsideOpenChange?.(open)\n },\n [isControlled, onAsideOpenChange]\n )\n\n const isMobile = useIsNarrowViewport()\n\n // ── Keyboard: cmd+. toggle aside ──\n // ⌘B sidebar toggle by Sidebar SSOT(本 component 不重覆 register)\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === '.' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n setAsideOpen(!asideOpen)\n }\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [asideOpen, setAsideOpen])\n\n const ctxValue = React.useMemo<AppShellContextValue>(\n () => ({ layout, asideOpen, setAsideOpen, isMobile }),\n [layout, asideOpen, setAsideOpen, isMobile]\n )\n\n // ── Layout grid(2 mode)──\n // primary-sidebar:\n // row1: [sidebar (頂天)][main col (header + main)][aside (頂天)]\n // primary-header:\n // row1: [header (橫跨整 viewport, banner role)]\n // row2: [sidebar][main][aside]\n\n // AppShellAside 自決 inline vs modal mode(via AppShellContext.isMobile)。\n // AppShell 一律只 render `{aside}` 一次,AppShellAside 內部根據 isMobile 決定 render 形式。\n\n if (layout === 'primary-header') {\n // primary-header layout(2026-05-21 v2 — user clarification「primary-header = primary-sidebar + 一條 global header」):\n // 結構:row1 globalHeader(全寬 global bar)/ row2 [sidebar][main col: localHeader + main][aside]\n // - globalHeader = 跨頁 account / workspace switcher / notifications(對齊 GitHub top nav / Slack workspace bar)\n // - header = local page header,**仍存在**(per page actions / breadcrumb,對齊 GitHub repo header / Slack channel header / Gmail email-list toolbar 2-layer 慣例)\n // Consumer 必傳 `<Sidebar viewportInsetTop=\"var(--chrome-header-height)\">` 讓 sidebar 從 globalHeader 下方起算。\n return (\n <AppShellContext.Provider value={ctxValue}>\n <div\n ref={ref}\n className={cn('flex h-svh w-full flex-col overflow-hidden bg-canvas', className)}\n {...props}\n >\n <SkipToMain />\n {/* Row 1:Global header(account / workspace switcher / notifications,橫跨整 viewport)*/}\n {globalHeader && <div className=\"flex-shrink-0\">{globalHeader}</div>}\n {/* Row 2:[sidebar][main col][aside]horizontal row */}\n <div className=\"flex flex-1 min-h-0 w-full\">\n {sidebar}\n {/* Main column:local header + main content(per user model「primary-header = primary-sidebar + global header」)*/}\n <div className=\"flex flex-col flex-1 min-w-0 min-h-0 overflow-hidden\">\n {header && <div className=\"flex-shrink-0\">{header}</div>}\n <main\n id=\"app-shell-main\"\n tabIndex={-1}\n className=\"flex-1 min-w-0 min-h-0 overflow-y-auto focus:outline-none\"\n >\n {children}\n </main>\n </div>\n {aside}\n </div>\n </div>\n </AppShellContext.Provider>\n )\n }\n\n // primary-sidebar layout\n return (\n <AppShellContext.Provider value={ctxValue}>\n <div\n ref={ref}\n className={cn('flex h-svh w-full overflow-hidden bg-canvas', className)}\n {...props}\n >\n <SkipToMain />\n {/* Sidebar — 頂天 */}\n {sidebar}\n {/* Main column(header + main 垂直堆)*/}\n <div className=\"flex flex-col flex-1 min-w-0 min-h-0 overflow-hidden\">\n {header && (\n // Header 在 main column 內(main col sibling,非 main descendant)。ChromeHeader 自\n // 2026-05-20 起 render `<header>`(chrome-header.tsx);依 W3C HTML-AAM,`<div>` wrapper\n // 不 scope out banner(只有 main/article/aside/nav/section 能)→ 仍得 implicit banner ✓\n // (對齊 app-shell.spec.md「W3C ARIA in HTML banner rule」段)。\n <div className=\"flex-shrink-0\">{header}</div>\n )}\n <main\n id=\"app-shell-main\"\n tabIndex={-1}\n className=\"flex-1 min-h-0 overflow-y-auto focus:outline-none\"\n >\n {children}\n </main>\n </div>\n {/* Aside slot — desktop inline OR mobile Sheet,內部自決 */}\n {aside}\n </div>\n </AppShellContext.Provider>\n )\n }\n)\nAppShell.displayName = 'AppShell'\n\n// ── AppShellAside sub-component ──────────────────────────────────────────────\n\n/**\n * AppShellAside — right panel:standard inline(desktop) vs modal overlay(mobile)。\n *\n * Desktop(viewport ≥ 768px):\n * - Render 直接放 layout grid 右側(AppShell 恆 render {aside};AppShellAside 於 !asideOpen 自行 return null — 內部自決,非 via parent)\n * - 不蓋 mask / background 可操作 / 佔 layout 寬\n * - Vertical extent:primary-sidebar → 頂天立地 / primary-header → header 下方\n *\n * Mobile(viewport < 768px):\n * - Render 走 Sheet primitive(side=\"right\",per sheet.spec.md)\n * - Mask 蓋 / background 不可操作 / 不佔 layout 寬\n * - title 強制(aria-labelledby per sheet.spec.md:98)\n */\nconst AppShellAside = React.forwardRef<HTMLElement, AppShellAsideProps>(\n ({ title, width, children, className }, ref) => {\n const { asideOpen, setAsideOpen, isMobile } = useAppShell()\n const isXl = useIsXl()\n const resolvedWidth = resolveAsideWidth(width, isXl)\n\n // Shared frame:always-on header(title + close X)+ body(ScrollArea + layoutSpace 規則 1B 父層 padding)\n // 對齊 codex Layer B 2026-05-20「container mode 可變,panel role/content 不該變」+ Notion/Figma right\n // panel 共識(modal vs inline 結構相同,host wrapper 不同)。\n // 2026-05-20 migrate 消費 ChromeHeader primitive(撤回自刻 + 撤回 bg-surface 疊加 — 對齊\n // `header-canonical.spec.md`「6. Background ownership」段「Nested chrome header 透明繼承\n // parent」:aside container 自身已 bg-surface,內 header 不該再畫 bg 避免疊加 drift)。\n // titleNode 依 mode 不同:modal(Sheet)用 SheetTitle 綁 Radix Dialog titleId — 否則\n // SheetContent 的 aria-labelledby 指向不存在的 id → SR 念「unnamed dialog」+ Radix\n // TitleWarning console.error(違 sheet.spec.md:98「Sheet content 必有可見 title」)。\n // inline(aside)用純 <h2>:aside 自身已 aria-label={title},且無 Dialog context 不可用 SheetTitle。\n const renderFrame = (titleNode: React.ReactNode) => (\n <>\n <ChromeHeader>\n {titleNode}\n <Button\n iconOnly\n dismiss\n size=\"sm\"\n startIcon={XIcon}\n aria-label=\"關閉\"\n onClick={() => setAsideOpen(false)}\n />\n </ChromeHeader>\n <ScrollArea className=\"flex-1 min-h-0\">\n {children}\n </ScrollArea>\n </>\n )\n\n // Modal mode(mobile)— Sheet from right\n if (isMobile) {\n return (\n <Sheet open={asideOpen} onOpenChange={setAsideOpen}>\n <SheetContent\n side=\"right\"\n className=\"w-[min(90vw,var(--app-shell-aside-modal-width))] flex flex-col p-0 [&>button]:hidden\"\n style={{ ['--app-shell-aside-modal-width' as string]: `${resolvedWidth}px` }}\n >\n {renderFrame(<SheetTitle className=\"flex-1\">{title}</SheetTitle>)}\n </SheetContent>\n </Sheet>\n )\n }\n\n // Standard inline mode(desktop)\n if (!asideOpen) return null\n\n return (\n <aside\n ref={ref}\n aria-label={title}\n className={cn(\n 'flex flex-col h-full min-h-0 overflow-hidden',\n 'bg-surface border-l border-divider',\n className\n )}\n style={{ width: resolvedWidth }}\n >\n {renderFrame(<h2 className=\"text-body-lg font-medium flex-1 truncate\">{title}</h2>)}\n </aside>\n )\n }\n)\nAppShellAside.displayName = 'AppShellAside'\n\n// ── Exports ──────────────────────────────────────────────────────────────────\n\n// code-quality-allow: dead-export useAppShell — public compound API hook(consumer 可自拼 custom aside layout,\n// 對齊 Radix `useDialogContext` / MUI `useFormControl` 慣例)。內部 AppShellAside 已消費(L294),\n// audit script 抓「無 cross-file import」是 false positive(2026-05-21 D2 codify)。\nexport { AppShell, AppShellAside, useAppShell }\n"],"names":["XIcon"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './app-shell';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/AppShell/index.ts"],"names":[],"mappings":"AAIA,cAAc,aAAa,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { AppShell, AppShellAside, useAppShell } from "./app-shell.js";
2
+ export {
3
+ AppShell,
4
+ AppShellAside,
5
+ useAppShell
6
+ };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -20,7 +20,8 @@ import * as AspectRatioPrimitive from '@radix-ui/react-aspect-ratio';
20
20
  * Consumer 傳 `ratio={n/m}` 數字計算(如 16/9 = 1.7777)。
21
21
  *
22
22
  * ── 常見消費者 ──
23
- * Coachmark media / Carousel item image / Card thumbnail(未來)/ Chart preview
23
+ * Coachmark media(coachmark.tsx)/ FileViewer 圖片預覽(file-viewer.tsx)/ Carousel item imageCard thumbnail(未來)
24
+ *(Chart 現用 raw aspect-video 非消費者 — 2026-07-04 grep 驗證)
24
25
  */
25
26
  export type AspectRatioProps = React.ComponentPropsWithoutRef<typeof AspectRatioPrimitive.Root>;
26
27
  declare const AspectRatio: React.ForwardRefExoticComponent<Omit<AspectRatioPrimitive.AspectRatioProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
@@ -29,7 +30,7 @@ export declare const aspectRatioMeta: {
29
30
  readonly family: null;
30
31
  readonly variants: {};
31
32
  readonly sizes: {};
32
- readonly states: readonly ["default", "hover", "active", "focus-visible", "disabled"];
33
+ readonly states: readonly ["default"];
33
34
  readonly tokens: {
34
35
  readonly bg: readonly [];
35
36
  readonly fg: readonly [];
@@ -1 +1 @@
1
- {"version":3,"file":"aspect-ratio.d.ts","sourceRoot":"","sources":["../../../src/components/AspectRatio/aspect-ratio.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,oBAAoB,MAAM,8BAA8B,CAAA;AAEpE;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAA;AAK/F,QAAA,MAAM,WAAW,iKAGoD,CAAA;AAKrE,eAAO,MAAM,eAAe;;;;;;;;;;;CAelB,CAAA;AAEV,OAAO,EAAE,WAAW,EAAE,CAAA"}
1
+ {"version":3,"file":"aspect-ratio.d.ts","sourceRoot":"","sources":["../../../src/components/AspectRatio/aspect-ratio.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,oBAAoB,MAAM,8BAA8B,CAAA;AAEpE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAA;AAK/F,QAAA,MAAM,WAAW,iKAGoD,CAAA;AAKrE,eAAO,MAAM,eAAe;;;;;;;;;;;CAiBlB,CAAA;AAEV,OAAO,EAAE,WAAW,EAAE,CAAA"}
@@ -6,10 +6,12 @@ AspectRatio.displayName = "AspectRatio";
6
6
  const aspectRatioMeta = {
7
7
  component: "AspectRatio",
8
8
  family: null,
9
- // non-family composite / overlay / layout
9
+ // self-contained primitive(對齊 spec frontmatter self-contained + L22;非 Family 1-4)
10
10
  variants: {},
11
11
  sizes: {},
12
- states: ["default", "hover", "active", "focus-visible", "disabled"],
12
+ // 2026-06-05 fix(deep-audit):純 structural container,無互動狀態(spec「為何無 ColorMatrix / SizeMatrix / StateBehavior」段;段名指法免行號漂移)。
13
+ // 原 ['default','hover','active','focus-visible','disabled'] 是 Phase 1 mechanical placeholder,與 spec 矛盾。
14
+ states: ["default"],
13
15
  tokens: {
14
16
  bg: [],
15
17
  fg: [],
@@ -1 +1 @@
1
- {"version":3,"file":"aspect-ratio.js","sources":["../../../src/components/AspectRatio/aspect-ratio.tsx"],"sourcesContent":["// @benchmark-unverified-blanket: file-level retraction per M22 (d) — claims herein not individually URL-cited; treat as unverified visual/usage rumor unless retrofit per-claim. Hook escape preserved.\nimport * as React from 'react'\nimport * as AspectRatioPrimitive from '@radix-ui/react-aspect-ratio'\n\n/**\n * AspectRatio — 固定長寬比容器(Radix AspectRatio primitive 薄包裝)\n *\n * 世界級對照:shadcn `AspectRatio` / Ant 無獨立元件(CSS 方案)/ Material 無\n *\n * ── 為什麼需要 ──\n * CSS `aspect-ratio` 屬性雖然現代瀏覽器都支援,但 Radix primitive 提供 SSR-safe\n * padding-bottom 方案 + consistent API,避免邊緣 bug(image 未載入時容器坍塌 /\n * content-fit 差異)。保 safe + 一致視覺。\n *\n * ── 標準 ratio(DS 慣例) ──\n * 16/9 — 寬螢幕影片、onboarding feature tour 截圖(Coachmark media 預設)\n * 4/3 — 老電視 / 照片基本 ratio、產品 thumbnail\n * 1/1 — Avatar / 方形貼文預覽 / icon preview\n * 3/4 — 直式照片(人物 portrait)\n * 21/9 — Ultra-wide banner(hero section)\n *\n * Consumer 傳 `ratio={n/m}` 數字計算(如 16/9 = 1.7777)。\n *\n * ── 常見消費者 ──\n * Coachmark media / Carousel item image / Card thumbnail(未來)/ Chart preview\n */\n\nexport type AspectRatioProps = React.ComponentPropsWithoutRef<typeof AspectRatioPrimitive.Root>\n\n// shadcn canonical:顯式 forwardRef + displayName(雖 Radix primitive 已 forwardRef,\n// 此 wrapper 確保本 DS 每個 named export 在 Inspector 顯示正確 displayName,\n// 且 props passthrough + ref 行為在 code 層面明確可見)\nconst AspectRatio = React.forwardRef<\n React.ElementRef<typeof AspectRatioPrimitive.Root>,\n AspectRatioProps\n>((props, ref) => <AspectRatioPrimitive.Root ref={ref} {...props} />)\nAspectRatio.displayName = 'AspectRatio'\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 aspectRatioMeta = {\n component: 'AspectRatio',\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: [],\n ring: [],\n },\n} as const\n\nexport { AspectRatio }\n"],"names":[],"mappings":";;;AAgCA,MAAM,cAAc,MAAM,WAGxB,CAAC,OAAO,QAAQ,oBAAC,qBAAqB,MAArB,EAA0B,KAAW,GAAG,OAAO,CAAE;AACpE,YAAY,cAAc;AAInB,MAAM,kBAAkB;AAAA,EAC7B,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,CAAA;AAAA,IACJ,MAAM,CAAA;AAAA,EAAC;AAEX;"}
1
+ {"version":3,"file":"aspect-ratio.js","sources":["../../../src/components/AspectRatio/aspect-ratio.tsx"],"sourcesContent":["// @benchmark-unverified-blanket: file-level retraction per M22 (d) — claims herein not individually URL-cited; treat as unverified visual/usage rumor unless retrofit per-claim. Hook escape preserved.\nimport * as React from 'react'\nimport * as AspectRatioPrimitive from '@radix-ui/react-aspect-ratio'\n\n/**\n * AspectRatio — 固定長寬比容器(Radix AspectRatio primitive 薄包裝)\n *\n * 世界級對照:shadcn `AspectRatio` / Ant 無獨立元件(CSS 方案)/ Material 無\n *\n * ── 為什麼需要 ──\n * CSS `aspect-ratio` 屬性雖然現代瀏覽器都支援,但 Radix primitive 提供 SSR-safe\n * padding-bottom 方案 + consistent API,避免邊緣 bug(image 未載入時容器坍塌 /\n * content-fit 差異)。保 safe + 一致視覺。\n *\n * ── 標準 ratio(DS 慣例) ──\n * 16/9 — 寬螢幕影片、onboarding feature tour 截圖(Coachmark media 預設)\n * 4/3 — 老電視 / 照片基本 ratio、產品 thumbnail\n * 1/1 — Avatar / 方形貼文預覽 / icon preview\n * 3/4 — 直式照片(人物 portrait)\n * 21/9 — Ultra-wide banner(hero section)\n *\n * Consumer 傳 `ratio={n/m}` 數字計算(如 16/9 = 1.7777)。\n *\n * ── 常見消費者 ──\n * Coachmark media(coachmark.tsx)/ FileViewer 圖片預覽(file-viewer.tsx)/ Carousel item imageCard thumbnail(未來)\n *(Chart 現用 raw aspect-video 非消費者 — 2026-07-04 grep 驗證)\n */\n\nexport type AspectRatioProps = React.ComponentPropsWithoutRef<typeof AspectRatioPrimitive.Root>\n\n// shadcn canonical:顯式 forwardRef + displayName(雖 Radix primitive 已 forwardRef,\n// 此 wrapper 確保本 DS 每個 named export 在 Inspector 顯示正確 displayName,\n// 且 props passthrough + ref 行為在 code 層面明確可見)\nconst AspectRatio = React.forwardRef<\n React.ElementRef<typeof AspectRatioPrimitive.Root>,\n AspectRatioProps\n>((props, ref) => <AspectRatioPrimitive.Root ref={ref} {...props} />)\nAspectRatio.displayName = 'AspectRatio'\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 aspectRatioMeta = {\n component: 'AspectRatio',\n family: null, // self-contained primitive(對齊 spec frontmatter self-contained + L22;非 Family 1-4)\n variants: {\n\n },\n sizes: {\n\n },\n // 2026-06-05 fix(deep-audit):純 structural container,無互動狀態(spec「為何無 ColorMatrix / SizeMatrix / StateBehavior」段;段名指法免行號漂移)。\n // 原 ['default','hover','active','focus-visible','disabled'] 是 Phase 1 mechanical placeholder,與 spec 矛盾。\n states: ['default'],\n tokens: {\n bg: [],\n fg: [],\n ring: [],\n },\n} as const\n\nexport { AspectRatio }\n"],"names":[],"mappings":";;;AAiCA,MAAM,cAAc,MAAM,WAGxB,CAAC,OAAO,QAAQ,oBAAC,qBAAqB,MAArB,EAA0B,KAAW,GAAG,OAAO,CAAE;AACpE,YAAY,cAAc;AAInB,MAAM,kBAAkB;AAAA,EAC7B,WAAW;AAAA,EACX,QAAQ;AAAA;AAAA,EACR,UAAU,CAAA;AAAA,EAGV,OAAO,CAAA;AAAA;AAAA;AAAA,EAKP,QAAQ,CAAC,SAAS;AAAA,EAClB,QAAQ;AAAA,IACN,IAAI,CAAA;AAAA,IACJ,IAAI,CAAA;AAAA,IACJ,MAAM,CAAA;AAAA,EAAC;AAEX;"}
@@ -0,0 +1,2 @@
1
+ export * from './aspect-ratio';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/AspectRatio/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { AspectRatio, aspectRatioMeta } from "./aspect-ratio.js";
2
+ export {
3
+ AspectRatio,
4
+ aspectRatioMeta
5
+ };
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import type { LucideIcon } from 'lucide-react';
3
+ import { type CategoricalColor } from '../../tokens/categorical-color';
3
4
  /**
4
5
  * Avatar — 頭像元件
5
6
  *
@@ -17,7 +18,7 @@ import type { LucideIcon } from 'lucide-react';
17
18
  * circle(預設)→ rounded-full,用於人物
18
19
  * square → rounded-md (4px),用於實體(專案、組織、App)
19
20
  */
20
- type ColorKey = 'neutral' | 'blue' | 'red' | 'green' | 'yellow' | 'turquoise' | 'purple' | 'magenta' | 'indigo';
21
+ type ColorKey = CategoricalColor;
21
22
  export interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {
22
23
  /** 尺寸:number (px) 或 'fill'(填滿父容器,由父層決定大小)。預設 32 */
23
24
  size?: number | 'fill';
@@ -31,7 +32,7 @@ export interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {
31
32
  icon?: LucideIcon;
32
33
  /** Icon / text fallback 的背景色,預設 neutral */
33
34
  color?: ColorKey;
34
- /** 深底白字模式(step-6 背景 + 白色前景,warning 例外),預設 false */
35
+ /** 深底模式(step-6 背景 + on-emphasis 配對前景;亮色 hue yellow/amber/orange/lime 用深字 --on-emphasis-dark),預設 false */
35
36
  solid?: boolean;
36
37
  /**
37
38
  * 在線狀態指示器(presence),顯示在 avatar **右下角**。
@@ -48,7 +49,12 @@ export interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {
48
49
  */
49
50
  badgeCount?: number;
50
51
  /**
51
- * 傳入 HoverCard 內容(如 NameCard),hover avatar 時自動顯示。
52
+ * badgeCount overlay aria-label override(i18n)。預設英文 `${badgeCount} unread`;
53
+ * consumer 傳此 prop 本地化(對齊 `Notice` dismissAriaLabel pattern,a11y/i18n)。
54
+ */
55
+ badgeAriaLabel?: string;
56
+ /**
57
+ * 傳入 HoverCard 內容(如 ProfileCard),hover avatar 時自動顯示。
52
58
  * 只有人員 avatar 需要傳;實體 avatar(專案、組織)不傳。
53
59
  */
54
60
  hoverCard?: React.ReactNode;
@@ -61,10 +67,11 @@ export interface AvatarData {
61
67
  /** Icon / text fallback 的背景色,預設 neutral */
62
68
  color?: ColorKey;
63
69
  /**
64
- * Person avatar hover NameCard(DS-wide canonical,person avatar 預設必有,見 avatar.spec.md)。
70
+ * Person avatar hover ProfileCard(DS-wide canonical,person avatar 預設必有,見 avatar.spec.md)。
65
71
  * Entity avatar(專案 / 組織 logo)不帶 → consumer 不傳 hoverCard 即豁免。
66
- * 所有消費 AvatarData 的 primitive(MenuItem / DropdownMenu / SelectMenu / SelectionItem / NameCard)
67
- * 需 forward 此 prop 到內部 <Avatar hoverCard={avatar.hoverCard} />。
72
+ * 消費 AvatarData 的 row primitive(MenuItem menu-item.tsx / SelectionItem selection-item.tsx,
73
+ * DropdownMenu / SelectMenu 經 MenuItem)需 forward 此 prop 到內部 <Avatar hoverCard={...} />。
74
+ * 例外:ProfileCard 內部 Avatar 不 forward(卡片本身就是 hover 目的地,nested hover-in-hover 不合理)。
68
75
  */
69
76
  hoverCard?: React.ReactNode;
70
77
  }
@@ -73,7 +80,7 @@ export declare const avatarMeta: {
73
80
  readonly family: null;
74
81
  readonly variants: {};
75
82
  readonly sizes: {};
76
- readonly states: readonly ["default", "hover", "active", "focus-visible", "disabled"];
83
+ readonly states: readonly ["default", "focus-visible", "disabled"];
77
84
  readonly tokens: {
78
85
  readonly bg: readonly ["bg-surface-raised"];
79
86
  readonly fg: readonly ["--foreground", "--on-emphasis"];
@@ -1 +1 @@
1
- {"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../src/components/Avatar/avatar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAO9C;;;;;;;;;;;;;;;;GAgBG;AAMH,KAAK,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAA;AA2E/G,MAAM,WAAW,WAAY,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACvE,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC3B,aAAa;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,+BAA+B;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,0BAA0B;IAC1B,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;OAIG;IACH,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAC/C;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC5B;AA4LD,MAAM,WAAW,UAAU;IACzB,aAAa;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,2CAA2C;IAC3C,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC5B;AAID,eAAO,MAAM,UAAU;;;;;;;;;;;CAeb,CAAA;AAGV,QAAA,MAAM,MAAM,+GAA0B,CAAA;AAEtC,OAAO,EAAE,MAAM,EAAE,CAAA"}
1
+ {"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../src/components/Avatar/avatar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAE9C,OAAO,EAAuC,KAAK,gBAAgB,EAAE,MAAM,0CAA0C,CAAA;AAMrH;;;;;;;;;;;;;;;;GAgBG;AAQH,KAAK,QAAQ,GAAG,gBAAgB,CAAA;AA6DhC,MAAM,WAAW,WAAY,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACvE,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC3B,aAAa;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,+BAA+B;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,0BAA0B;IAC1B,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,yGAAyG;IACzG,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;OAIG;IACH,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAC/C;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;OAGG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC5B;AA0MD,MAAM,WAAW,UAAU;IACzB,aAAa;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,2CAA2C;IAC3C,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC5B;AAID,eAAO,MAAM,UAAU;;;;;;;;;;;CAab,CAAA;AAGV,QAAA,MAAM,MAAM,+GAA0B,CAAA;AAEtC,OAAO,EAAE,MAAM,EAAE,CAAA"}
@@ -2,32 +2,19 @@ import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
3
  import { User } from "lucide-react";
4
4
  import { cn } from "../../lib/utils.js";
5
+ import { CAT_SOLID_TOKENS, CAT_SUBTLE_TOKENS } from "../../tokens/categorical-color.js";
5
6
  import { HoverCard, HoverCardTrigger, HoverCardContent } from "../HoverCard/hover-card.js";
6
7
  import { HOVER_DELAY_CLOSE_MS, HOVER_DELAY_RICH_MS } from "../../tokens/motion/motion.js";
7
8
  import { Badge } from "../Badge/badge.js";
8
- import { useTableIsScrolling, useFieldContext } from "../Field/field-context.js";
9
+ import { useTableIsScrolling, useResolvedFieldDisabled } from "../Field/field-context.js";
9
10
  const COLOR_MAP = {
10
11
  subtle: {
11
12
  neutral: { bg: "var(--muted)", text: "var(--foreground)" },
12
- blue: { bg: "var(--color-blue-1)", text: "var(--color-blue-7)" },
13
- red: { bg: "var(--color-deep-orange-1)", text: "var(--color-deep-orange-7)" },
14
- green: { bg: "var(--color-green-1)", text: "var(--color-green-7)" },
15
- yellow: { bg: "var(--color-yellow-1)", text: "var(--color-yellow-7)" },
16
- turquoise: { bg: "var(--color-turquoise-1)", text: "var(--color-turquoise-7)" },
17
- purple: { bg: "var(--color-purple-1)", text: "var(--color-purple-7)" },
18
- magenta: { bg: "var(--color-magenta-1)", text: "var(--color-magenta-7)" },
19
- indigo: { bg: "var(--color-indigo-1)", text: "var(--color-indigo-7)" }
13
+ ...CAT_SUBTLE_TOKENS
20
14
  },
21
15
  solid: {
22
16
  neutral: { bg: "var(--color-neutral-9)", text: "var(--inverse-fg)" },
23
- blue: { bg: "var(--color-blue-6)", text: "var(--on-emphasis)" },
24
- red: { bg: "var(--color-deep-orange-6)", text: "var(--on-emphasis)" },
25
- green: { bg: "var(--color-green-6)", text: "var(--on-emphasis)" },
26
- yellow: { bg: "var(--color-yellow-6)", text: "var(--warning-foreground)" },
27
- turquoise: { bg: "var(--color-turquoise-6)", text: "var(--on-emphasis)" },
28
- purple: { bg: "var(--color-purple-6)", text: "var(--on-emphasis)" },
29
- magenta: { bg: "var(--color-magenta-6)", text: "var(--on-emphasis)" },
30
- indigo: { bg: "var(--color-indigo-6)", text: "var(--on-emphasis)" }
17
+ ...CAT_SOLID_TOKENS
31
18
  }
32
19
  };
33
20
  function getIconSize(avatarSize) {
@@ -58,13 +45,17 @@ function useDocumentTheme() {
58
45
  return theme;
59
46
  }
60
47
  const AvatarInner = React.forwardRef(
61
- ({ size = 32, shape = "circle", src, alt, icon: Icon, color = "neutral", solid = false, status, badgeCount, hoverCard, className, style, ...props }, ref) => {
48
+ ({ size = 32, shape = "circle", src, alt, icon: Icon, color = "neutral", solid = false, status, badgeCount, badgeAriaLabel, hoverCard, className, style, ...props }, ref) => {
62
49
  var _a;
63
50
  const [imgError, setImgError] = React.useState(false);
51
+ const [prevSrc, setPrevSrc] = React.useState(src);
52
+ if (prevSrc !== src) {
53
+ setPrevSrc(src);
54
+ setImgError(false);
55
+ }
64
56
  const documentTheme = useDocumentTheme();
65
57
  const isTableScrolling = useTableIsScrolling();
66
- const fieldCtx = useFieldContext();
67
- const isDisabledInField = (fieldCtx == null ? void 0 : fieldCtx.mode) === "disabled" && (fieldCtx == null ? void 0 : fieldCtx.hasFieldWrapper) === true;
58
+ const isDisabledInField = useResolvedFieldDisabled();
68
59
  const isFill = size === "fill";
69
60
  const numSize = isFill ? 32 : size;
70
61
  const iconPx = getIconSize(numSize);
@@ -95,6 +86,8 @@ const AvatarInner = React.forwardRef(
95
86
  color: showImage ? void 0 : colors.text
96
87
  },
97
88
  "data-avatar-size": isFill ? "fill" : numSize,
89
+ role: !showImage && alt && !hoverCard ? "img" : void 0,
90
+ "aria-label": !showImage && alt && !hoverCard ? alt : void 0,
98
91
  children: [
99
92
  showImage && /* @__PURE__ */ jsx(
100
93
  "img",
@@ -125,7 +118,7 @@ const AvatarInner = React.forwardRef(
125
118
  "aria-haspopup": "dialog",
126
119
  "aria-label": alt ?? "View profile"
127
120
  } : {};
128
- const focusableClass = hoverCard ? "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 rounded-full" : "";
121
+ const focusableClass = hoverCard ? cn("focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1", shape === "circle" ? "rounded-full" : "rounded-md") : "";
129
122
  const baseEl = !hasOverlay ? /* @__PURE__ */ jsx("div", { ref, className: cn("inline-flex shrink-0", focusableClass, className), style, ...focusableProps, ...props, children: avatarEl }) : /* @__PURE__ */ jsxs("div", { ref, className: cn("relative inline-flex shrink-0", focusableClass, className), style, ...focusableProps, ...props, children: [
130
123
  avatarEl,
131
124
  status && /* @__PURE__ */ jsx(
@@ -153,7 +146,7 @@ const AvatarInner = React.forwardRef(
153
146
  style: {
154
147
  boxShadow: `0 0 0 2px var(--surface-raised, var(--canvas))`
155
148
  },
156
- "aria-label": `${badgeCount} unread`
149
+ "aria-label": badgeAriaLabel ?? `${badgeCount} unread`
157
150
  }
158
151
  )
159
152
  ] });
@@ -172,14 +165,16 @@ const AvatarInner = React.forwardRef(
172
165
  ] });
173
166
  }
174
167
  );
175
- AvatarInner.displayName = "AvatarInner";
176
168
  const avatarMeta = {
177
169
  component: "Avatar",
178
170
  family: null,
179
171
  // non-family composite / overlay / layout
172
+ // 2026-07-04 audit 標記:Avatar 無 variant 軸、size 為任意 number(px,由 consumer context 決定
173
+ // — item-anatomy AVATAR_SIZE 查表 / ProfileCard 40 等),無 discrete tier → 兩欄留空為 intentional 非漏填
180
174
  variants: {},
181
175
  sizes: {},
182
- states: ["default", "hover", "active", "focus-visible", "disabled"],
176
+ states: ["default", "focus-visible", "disabled"],
177
+ // 2026-06-11 R2:本身無自有 hover/active(spec L279;hoverCard 互動屬 HoverCard),
183
178
  tokens: {
184
179
  bg: ["bg-surface-raised"],
185
180
  fg: ["--foreground", "--on-emphasis"],
@@ -1 +1 @@
1
- {"version":3,"file":"avatar.js","sources":["../../../src/components/Avatar/avatar.tsx"],"sourcesContent":["// @benchmark-unverified-blanket: file-level retraction per M22 (d) — claims herein not individually URL-cited; treat as unverified visual/usage rumor unless retrofit per-claim. Hook escape preserved.\nimport * as React from 'react'\nimport { User } from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\nimport { cn } from '@/lib/utils'\nimport { HoverCard, HoverCardTrigger, HoverCardContent } from '@/design-system/components/HoverCard/hover-card'\nimport { HOVER_DELAY_RICH_MS, HOVER_DELAY_CLOSE_MS } from '@/design-system/tokens/motion/motion'\nimport { Badge } from '@/design-system/components/Badge/badge'\nimport { useFieldContext, useTableIsScrolling } from '@/design-system/components/Field/field-context'\n\n/**\n * Avatar — 頭像元件\n *\n * 三種內容模式(按優先順序):\n * 1. src → 圖片\n * 2. icon → icon 在底色圓/方形內\n * 3. alt → 取首字作文字 fallback\n * 4. 都沒有 → 預設 User icon\n *\n * ── 尺寸 ──\n * size 接受任意 px 值,icon 自動 = round_even(size × 0.6)\n * 文字 fallback 字體 = size × 0.5\n *\n * ── 形狀 ──\n * circle(預設)→ rounded-full,用於人物\n * square → rounded-md (4px),用於實體(專案、組織、App)\n */\n\n// ── 色彩 ──\n// 直接引用 primitive(bg=step-1, text=step-7),不經過語義層\n// solid:step-6 全色底 + 白色前景(yellow 例外用 --warning-foreground)\n// neutral solid:neutral-9 + --inverse-fg(自動反轉)\ntype ColorKey = 'neutral' | 'blue' | 'red' | 'green' | 'yellow' | 'turquoise' | 'purple' | 'magenta' | 'indigo'\ntype VariantKey = 'subtle' | 'solid'\n\nconst COLOR_MAP: Record<VariantKey, Record<ColorKey, { bg: string; text: string }>> = {\n subtle: {\n neutral: { bg: 'var(--muted)', text: 'var(--foreground)' },\n blue: { bg: 'var(--color-blue-1)', text: 'var(--color-blue-7)' },\n red: { bg: 'var(--color-deep-orange-1)', text: 'var(--color-deep-orange-7)' },\n green: { bg: 'var(--color-green-1)', text: 'var(--color-green-7)' },\n yellow: { bg: 'var(--color-yellow-1)', text: 'var(--color-yellow-7)' },\n turquoise: { bg: 'var(--color-turquoise-1)', text: 'var(--color-turquoise-7)' },\n purple: { bg: 'var(--color-purple-1)', text: 'var(--color-purple-7)' },\n magenta: { bg: 'var(--color-magenta-1)', text: 'var(--color-magenta-7)' },\n indigo: { bg: 'var(--color-indigo-1)', text: 'var(--color-indigo-7)' },\n },\n solid: {\n neutral: { bg: 'var(--color-neutral-9)', text: 'var(--inverse-fg)' },\n blue: { bg: 'var(--color-blue-6)', text: 'var(--on-emphasis)' },\n red: { bg: 'var(--color-deep-orange-6)', text: 'var(--on-emphasis)' },\n green: { bg: 'var(--color-green-6)', text: 'var(--on-emphasis)' },\n yellow: { bg: 'var(--color-yellow-6)', text: 'var(--warning-foreground)' },\n turquoise: { bg: 'var(--color-turquoise-6)', text: 'var(--on-emphasis)' },\n purple: { bg: 'var(--color-purple-6)', text: 'var(--on-emphasis)' },\n magenta: { bg: 'var(--color-magenta-6)', text: 'var(--on-emphasis)' },\n indigo: { bg: 'var(--color-indigo-6)', text: 'var(--on-emphasis)' },\n },\n}\n\n// ── Icon size: round to nearest even, ≈ 60% ──\nfunction getIconSize(avatarSize: number): number {\n return Math.round((avatarSize * 0.6) / 2) * 2\n}\n\n// ── Text fallback: first character ──\nfunction getInitial(text: string): string {\n return text.trim().charAt(0).toUpperCase()\n}\n\n// Semantic presence tokens — 見 color/semantic.css\n// Module-level constant(2026-04-22 D3 perf audit):從 render body 移到 module scope,\n// 避免每次 Avatar render 都 re-declare 此 4-entry object(Low impact 但渲染大量 avatars 時累積可觀)\nconst STATUS_DOT_COLOR: Record<string, string> = {\n online: 'var(--status-online)',\n away: 'var(--status-away)',\n busy: 'var(--status-busy)',\n offline: 'var(--status-offline)',\n}\n\n// ── useDocumentTheme(2026-04-23;M3 Portal 逃脫防線,scope verified 2026-04-25)──\n// 讀 `<html data-theme>` 並 observe mutation。用於 Avatar hoverCard NameCard:\n// Portal 後的 HoverCardContent 會繼承 trigger subtree theme(如 OverflowIndicator\n// dark tooltip 內部),造成 NameCard 被污染成 dark。顯式 bind app-level theme\n// 確保 NameCard 永遠跟 app 本身 theme 一致(light-in-light-app / dark-in-dark-app)。\n//\n// 範圍 audit 2026-04-25:觀察對象是 `document.documentElement` 自有 DOM,非 3rd-party\n// lib 內部(不屬 M2 scope);attributeFilter 限定 `data-theme` 單一 attr,re-render 成本\n// 為每次全站 theme 切換 × Avatar 數量,可接受。\nfunction useDocumentTheme(): string | null {\n const [theme, setTheme] = React.useState<string | null>(() =>\n typeof document !== 'undefined' ? document.documentElement.getAttribute('data-theme') : null,\n )\n React.useEffect(() => {\n if (typeof document === 'undefined') return\n const root = document.documentElement\n const update = () => setTheme(root.getAttribute('data-theme'))\n update()\n const obs = new MutationObserver(update)\n obs.observe(root, { attributes: true, attributeFilter: ['data-theme'] })\n return () => obs.disconnect()\n }, [])\n return theme\n}\n\n// ── Component ──\n\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 尺寸:number (px) 或 'fill'(填滿父容器,由父層決定大小)。預設 32 */\n size?: number | 'fill'\n /** 形狀:circle(人物)或 square(實體),預設 circle */\n shape?: 'circle' | 'square'\n /** 圖片 URL */\n src?: string\n /** 替代文字(圖片失敗時取首字作 fallback) */\n alt?: string\n /** Icon 模式(LucideIcon) */\n icon?: LucideIcon\n /** Icon / text fallback 的背景色,預設 neutral */\n color?: ColorKey\n /** 深底白字模式(step-6 背景 + 白色前景,warning 例外),預設 false */\n solid?: boolean\n /**\n * 在線狀態指示器(presence),顯示在 avatar **右下角**。\n * 世界級對照:Slack / Teams / Discord — `online` 是最廣泛被理解的術語。\n * 位置語義:右下 = \"此人的 presence\"(使用者聚焦於「這個人是誰 + 現在 在不在」)。\n */\n status?: 'online' | 'away' | 'busy' | 'offline'\n /**\n * 未讀 / 通知計數 badge,顯示在 avatar **右上角**。\n * 世界級對照:chat app(iMessage / Slack thread / LINE / WhatsApp)一律右上角。\n * 位置語義:右上 = \"關於此對話的新事件數量\"(使用者聚焦於「有多少未處理」);\n * 與右下的 presence 共存不衝突(不同角、不同語義)。\n * `> 99` 自動顯示 \"99+\"(交給內部 Badge 的 `max` 行為)。\n */\n badgeCount?: number\n /**\n * 傳入 HoverCard 內容(如 NameCard),hover avatar 時自動顯示。\n * 只有人員 avatar 需要傳;實體 avatar(專案、組織)不傳。\n */\n hoverCard?: React.ReactNode\n}\n\n// code-quality-allow: long-function — foundational composite main body — 拆 sub-fn 會複雜化 local state / ref / context binding\n// 2026-05-13 (a) perf fix part-2(per codex Layer C Roadmap rich-cell dominant + user 拍 Path (a)):\n// `React.memo` wrap forwardRef Avatar — Roadmap 13 columns 含 person/multiPerson,每 row 多 avatar\n// × HoverCard subtree + useDocumentTheme observer = 重渲染 hotspot。memo shallow-equal props,\n// HoverCard / themeRef stable across scroll 時 skip re-render。對齊 codex Profile Plan step 5\n// (filter Avatar/PeoplePicker/FieldSurfaceProvider remounts)。\n// code-quality-allow: long-function — size × shape × color × solid × status × badgeCount × hoverCard × img-fallback 多軸 prop 組合,拆 sub-fn 會跨 fn 傳 imgError state + isTableScrolling observer 結果\nconst AvatarInner = React.forwardRef<HTMLDivElement, AvatarProps>(\n ({ size = 32, shape = 'circle', src, alt, icon: Icon, color = 'neutral', solid = false, status, badgeCount, hoverCard, className, style, ...props }, ref) => {\n const [imgError, setImgError] = React.useState(false)\n const documentTheme = useDocumentTheme()\n const isTableScrolling = useTableIsScrolling()\n // 2026-05-13 R3.5(per codex Q3 verdict + user 拍「想盡辦法 auto-handle prereq」):\n // Avatar self-dim when in disabled Field wrapper context(取代既有 wrapper opacity-disabled blanket\n // 逃生艙 — color.spec.md:729 specific-disabled-color canonical)。\n // Scope narrowest:`fieldCtx?.mode === 'disabled' && fieldCtx?.hasFieldWrapper === true`,標準 Field\n // 家族 wrapper disabled 時才 dim;**沒包在 Field wrapper 內的 standalone Avatar**(NameCard / FileItem /\n // HoverCard / Dialog 等 display 場景)**backward compat 不變**。對齊 avatar.spec.md「Avatar 在 disabled\n // 元件內 host-controlled opacity」canonical — 升級成「Avatar self-managed via fieldCtx」。\n const fieldCtx = useFieldContext()\n const isDisabledInField = fieldCtx?.mode === 'disabled' && fieldCtx?.hasFieldWrapper === true\n const isFill = size === 'fill'\n // Fill 模式下 icon 用 60% 寬高、text 用 50cqi(container query inline-size);\n // 數字模式下用既有 px 計算\n const numSize = isFill ? 32 : (size as number)\n const iconPx = getIconSize(numSize)\n const fontSizePx = Math.round(numSize * 0.5)\n const variantKey: VariantKey = solid ? 'solid' : 'subtle'\n const colors = COLOR_MAP[variantKey]?.[color] ?? COLOR_MAP.subtle.neutral\n const radius = shape === 'circle' ? '9999px' : '4px'\n\n // 決定內容\n const showImage = src && !imgError\n const showIcon = !showImage && (Icon || (!alt))\n const showText = !showImage && !showIcon && alt\n\n const FallbackIcon = Icon ?? User\n\n // Status dot 尺寸:avatar 的 28%(Slack / Teams / Discord 世界級平均),\n // clamp [8, 16] — floor 8 保小 avatar 仍可辨識但不喧賓奪主(10 floor 會讓 24px\n // avatar 的 dot 占 42% 太大);ceiling 16 防大 avatar dot 過度放大\n const dotSize = isFill ? 10 : Math.max(8, Math.min(16, Math.round(numSize * 0.28)))\n // Border ring 在 surface 上分離 dot 與 avatar,dotSize ≥ 12 時升階到 3px 保持視覺比例\n const dotBorder = dotSize >= 12 ? 3 : 2\n\n const avatarEl = (\n <div\n className={cn(\n 'inline-flex items-center justify-center shrink-0 overflow-hidden select-none',\n isFill && 'w-full h-full',\n // 2026-05-13 R3.5 self-dim:Avatar 在 disabled Field wrapper context 內自 dim\n // (取代 field-wrapper.tsx default/bare/naked disabled blanket opacity-disabled 逃生艙)\n isDisabledInField && 'opacity-disabled',\n )}\n style={{\n ...(isFill\n ? { containerType: 'inline-size' as React.CSSProperties['containerType'] }\n : { width: numSize, height: numSize }),\n borderRadius: radius,\n backgroundColor: showImage ? undefined : colors.bg,\n color: showImage ? undefined : colors.text,\n }}\n data-avatar-size={isFill ? 'fill' : numSize}\n >\n {showImage && (\n <img\n src={src}\n alt={alt ?? ''}\n className=\"w-full h-full object-cover\"\n onError={() => setImgError(true)}\n />\n )}\n {showIcon && (\n isFill\n ? <FallbackIcon className=\"w-[60%] h-[60%]\" aria-hidden />\n : <FallbackIcon size={iconPx} aria-hidden />\n )}\n {showText && (\n <span\n className=\"font-medium leading-none\"\n style={{ fontSize: isFill ? '50cqi' : fontSizePx }}\n aria-hidden\n >\n {getInitial(alt!)}\n </span>\n )}\n </div>\n )\n\n const hasOverlay = status || typeof badgeCount === 'number'\n // Keyboard access canonical(D4 UX audit 2026-04-22 finding):Avatar with `hoverCard`\n // 需 keyboard 可達 — Radix `HoverCardTrigger asChild` 不自動加 tabIndex,non-focusable\n // `<div>` 會讓 keyboard-only user 無法 reach NameCard popover(WCAG 2.1.1 / 4.1.2 違反)。\n // 解:當 `hoverCard` 存在時,wrapper `<div>` 變 focusable(`tabIndex=0` + `role=\"button\"` +\n // `aria-haspopup=\"dialog\"` + focus-visible ring)。若無 hoverCard 則維持純展示 `<div>`。\n const focusableProps = hoverCard\n ? {\n tabIndex: 0,\n role: 'button' as const,\n 'aria-haspopup': 'dialog' as const,\n 'aria-label': alt ?? 'View profile',\n }\n : {}\n const focusableClass = hoverCard\n ? 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 rounded-full'\n : ''\n const baseEl = !hasOverlay\n ? <div ref={ref} className={cn('inline-flex shrink-0', focusableClass, className)} style={style} {...focusableProps} {...props}>{avatarEl}</div>\n : (\n <div ref={ref} className={cn('relative inline-flex shrink-0', focusableClass, className)} style={style} {...focusableProps} {...props}>\n {avatarEl}\n {/* Status dot:bottom-right(presence — 世界級對照 Slack / Teams / Discord),\n 落在 circle avatar 圓周 45° 位置 / square avatar 右下直角;\n border ring 用 surface 色讓 dot 從 avatar 邊界視覺分離。\n a11y:`aria-hidden` — presence 資訊整合到 parent avatar 的 aria-label\n (world-class Slack 做法),避免多 `role=\"status\"` 造成 screen reader 洪水 */}\n {status && (\n <span\n className=\"absolute block rounded-full\"\n style={{\n width: dotSize,\n height: dotSize,\n bottom: 0,\n right: 0,\n backgroundColor: STATUS_DOT_COLOR[status],\n boxShadow: `0 0 0 ${dotBorder}px var(--surface-raised, var(--canvas))`,\n }}\n aria-hidden\n />\n )}\n {/* Count badge:top-right(chat 未讀 / 通知計數 — 世界級對照 iMessage /\n Slack thread / LINE / WhatsApp)。消費 DS Badge(critical variant),\n 再加 ring 與 avatar 分離 */}\n {typeof badgeCount === 'number' && badgeCount > 0 && (\n <Badge\n variant=\"critical\"\n count={badgeCount}\n max={99}\n className=\"absolute -top-1 -right-1\"\n style={{\n boxShadow: `0 0 0 2px var(--surface-raised, var(--canvas))`,\n }}\n aria-label={`${badgeCount} unread`}\n />\n )}\n </div>\n )\n\n // 2026-05-13 (c) scroll-defer perf(per user 拍 Path (c) + codex Q3 verdict):\n // DataTable scrolling 期間跳 HoverCard wrapper(Portal + useDocumentTheme observer 是\n // Roadmap 重渲 hotspot,per codex Layer C 分析)。scroll 結束 → context flips false →\n // re-render 接回完整 HoverCard tree(NameCard 仍可 hover 顯示)。\n // 對齊 AG Grid `deferRender` for slow React cell components / MUI X DataGrid scroll-defer。\n if (!hoverCard || isTableScrolling) return baseEl\n\n return (\n <HoverCard openDelay={HOVER_DELAY_RICH_MS} closeDelay={HOVER_DELAY_CLOSE_MS}>\n <HoverCardTrigger asChild>\n {baseEl}\n </HoverCardTrigger>\n {/* HoverCardContent canonical(2026-04-23):\n - 無 inner padding(consumer NameCard 自帶 `px-4 py-3` chrome)\n - `overflow-hidden` + `rounded-lg` → child(NameCard)圓角裁切\n - **不設 max-height**:NameCard 自己消費 `--radix-hover-card-content-available-height`\n 自約束高度 + 內部 ScrollArea 處理捲動\n - `data-theme={documentTheme}`:NameCard 永遠跟隨 **app-level theme**(從 `<html data-theme>`\n 動態讀),不受 trigger subtree theme 污染。範例:Avatar 位於 OverflowIndicator 的 dark\n tooltip 內,其 Portal 會繼承該 subtree dark theme → NameCard 變全黑。顯式設回 app theme\n 確保 NameCard 永遠 light-in-light-app / dark-in-dark-app。 */}\n <HoverCardContent\n data-theme={documentTheme ?? undefined}\n className=\"bg-surface-raised rounded-lg border border-border overflow-hidden\"\n style={{ boxShadow: 'var(--elevation-200)' }}\n >\n {hoverCard}\n </HoverCardContent>\n </HoverCard>\n )\n }\n)\nAvatarInner.displayName = 'AvatarInner'\n\n// ── AvatarData ─────────────────────────────────────────────────────────────\n// 資料型別,讓 consumer 傳資料而非 ReactNode。\n// 接收端內部用 Avatar 元件渲染,統一控制尺寸與 fallback。\n\nexport interface AvatarData {\n /** 圖片 URL */\n src?: string\n /** 替代文字(圖片失敗時取首字作 fallback) */\n alt: string\n /** Icon / text fallback 的背景色,預設 neutral */\n color?: ColorKey\n /**\n * Person avatar hover NameCard(DS-wide canonical,person avatar 預設必有,見 avatar.spec.md)。\n * Entity avatar(專案 / 組織 logo)不帶 → consumer 不傳 hoverCard 即豁免。\n * 所有消費 AvatarData 的 primitive(MenuItem / DropdownMenu / SelectMenu / SelectionItem / NameCard)\n * 需 forward 此 prop 到內部 <Avatar hoverCard={avatar.hoverCard} />。\n */\n hoverCard?: React.ReactNode\n}\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 avatarMeta = {\n component: 'Avatar',\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-surface-raised'],\n fg: ['--foreground', '--on-emphasis'],\n ring: ['ring-ring'],\n },\n} as const\n\nAvatarInner.displayName = 'Avatar'\nconst Avatar = React.memo(AvatarInner)\n\nexport { Avatar }\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"avatar.js","sources":["../../../src/components/Avatar/avatar.tsx"],"sourcesContent":["// @benchmark-unverified-blanket: file-level retraction per M22 (d) — claims herein not individually URL-cited; treat as unverified visual/usage rumor unless retrofit per-claim. Hook escape preserved.\nimport * as React from 'react'\nimport { User } from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\nimport { cn } from '@/lib/utils'\nimport { CAT_SUBTLE_TOKENS, CAT_SOLID_TOKENS, type CategoricalColor } from '@/design-system/tokens/categorical-color'\nimport { HoverCard, HoverCardTrigger, HoverCardContent } from '@/design-system/components/HoverCard/hover-card'\nimport { HOVER_DELAY_RICH_MS, HOVER_DELAY_CLOSE_MS } from '@/design-system/tokens/motion/motion'\nimport { Badge } from '@/design-system/components/Badge/badge'\nimport { useResolvedFieldDisabled, useTableIsScrolling } from '@/design-system/components/Field/field-context'\n\n/**\n * Avatar — 頭像元件\n *\n * 三種內容模式(按優先順序):\n * 1. src → 圖片\n * 2. icon → icon 在底色圓/方形內\n * 3. alt → 取首字作文字 fallback\n * 4. 都沒有 → 預設 User icon\n *\n * ── 尺寸 ──\n * size 接受任意 px 值,icon 自動 = round_even(size × 0.6)\n * 文字 fallback 字體 = size × 0.5\n *\n * ── 形狀 ──\n * circle(預設)→ rounded-full,用於人物\n * square → rounded-md (4px),用於實體(專案、組織、App)\n */\n\n// ── 色彩 ──\n// **消費 categorical-color SSOT**(CAT_SUBTLE_TOKENS / CAT_SOLID_TOKENS,key X 一律對 `--color-X-*`,\n// 1:1 零 offset)。subtle=step-1 底 + step-7 字;solid=step-6 全色底 + on-emphasis 字\n//(亮 hue yellow/amber/orange/lime 用 --on-emphasis-dark 深字;green 白字例外)。neutral 非色相,自處理(subtle=muted、solid=neutral-9)。\n// 2026-06-04 修:原 `red` 誤接 `--color-deep-orange-*`(red=品牌紅 hue-25 ≠ deep-orange);\n// 改消費 SSOT 後 red→`--color-red-*`,並補齊全 12 色相。\ntype ColorKey = CategoricalColor\ntype VariantKey = 'subtle' | 'solid'\n\nconst COLOR_MAP: Record<VariantKey, Record<ColorKey, { bg: string; text: string }>> = {\n subtle: {\n neutral: { bg: 'var(--muted)', text: 'var(--foreground)' },\n ...CAT_SUBTLE_TOKENS,\n },\n solid: {\n neutral: { bg: 'var(--color-neutral-9)', text: 'var(--inverse-fg)' },\n ...CAT_SOLID_TOKENS,\n },\n}\n\n// ── Icon size: round to nearest even, ≈ 60% ──\nfunction getIconSize(avatarSize: number): number {\n return Math.round((avatarSize * 0.6) / 2) * 2\n}\n\n// ── Text fallback: first character ──\nfunction getInitial(text: string): string {\n return text.trim().charAt(0).toUpperCase()\n}\n\n// Semantic presence tokens — 見 color/semantic.css\n// Module-level constant(2026-04-22 D3 perf audit):從 render body 移到 module scope,\n// 避免每次 Avatar render 都 re-declare 此 4-entry object(Low impact 但渲染大量 avatars 時累積可觀)\nconst STATUS_DOT_COLOR: Record<string, string> = {\n online: 'var(--status-online)',\n away: 'var(--status-away)',\n busy: 'var(--status-busy)',\n offline: 'var(--status-offline)',\n}\n\n// ── useDocumentTheme(2026-04-23;M3 Portal 逃脫防線,scope verified 2026-04-25)──\n// 讀 `<html data-theme>` 並 observe mutation。用於 Avatar hoverCard ProfileCard:\n// Portal 後的 HoverCardContent 會繼承 trigger subtree theme(如 OverflowIndicator\n// dark tooltip 內部),造成 ProfileCard 被污染成 dark。顯式 bind app-level theme\n// 確保 ProfileCard 永遠跟 app 本身 theme 一致(light-in-light-app / dark-in-dark-app)。\n//\n// 範圍 audit 2026-04-25:觀察對象是 `document.documentElement` 自有 DOM,非 3rd-party\n// lib 內部(不屬 M2 scope);attributeFilter 限定 `data-theme` 單一 attr,re-render 成本\n// 為每次全站 theme 切換 × Avatar 數量,可接受。\nfunction useDocumentTheme(): string | null {\n const [theme, setTheme] = React.useState<string | null>(() =>\n typeof document !== 'undefined' ? document.documentElement.getAttribute('data-theme') : null,\n )\n React.useEffect(() => {\n if (typeof document === 'undefined') return\n const root = document.documentElement\n const update = () => setTheme(root.getAttribute('data-theme'))\n update()\n const obs = new MutationObserver(update)\n obs.observe(root, { attributes: true, attributeFilter: ['data-theme'] })\n return () => obs.disconnect()\n }, [])\n return theme\n}\n\n// ── Component ──\n\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 尺寸:number (px) 或 'fill'(填滿父容器,由父層決定大小)。預設 32 */\n size?: number | 'fill'\n /** 形狀:circle(人物)或 square(實體),預設 circle */\n shape?: 'circle' | 'square'\n /** 圖片 URL */\n src?: string\n /** 替代文字(圖片失敗時取首字作 fallback) */\n alt?: string\n /** Icon 模式(LucideIcon) */\n icon?: LucideIcon\n /** Icon / text fallback 的背景色,預設 neutral */\n color?: ColorKey\n /** 深底模式(step-6 背景 + on-emphasis 配對前景;亮色 hue yellow/amber/orange/lime 用深字 --on-emphasis-dark),預設 false */\n solid?: boolean\n /**\n * 在線狀態指示器(presence),顯示在 avatar **右下角**。\n * 世界級對照:Slack / Teams / Discord — `online` 是最廣泛被理解的術語。\n * 位置語義:右下 = \"此人的 presence\"(使用者聚焦於「這個人是誰 + 現在 在不在」)。\n */\n status?: 'online' | 'away' | 'busy' | 'offline'\n /**\n * 未讀 / 通知計數 badge,顯示在 avatar **右上角**。\n * 世界級對照:chat app(iMessage / Slack thread / LINE / WhatsApp)一律右上角。\n * 位置語義:右上 = \"關於此對話的新事件數量\"(使用者聚焦於「有多少未處理」);\n * 與右下的 presence 共存不衝突(不同角、不同語義)。\n * `> 99` 自動顯示 \"99+\"(交給內部 Badge 的 `max` 行為)。\n */\n badgeCount?: number\n /**\n * badgeCount overlay 的 aria-label override(i18n)。預設英文 `${badgeCount} unread`;\n * consumer 傳此 prop 本地化(對齊 `Notice` dismissAriaLabel pattern,a11y/i18n)。\n */\n badgeAriaLabel?: string\n /**\n * 傳入 HoverCard 內容(如 ProfileCard),hover avatar 時自動顯示。\n * 只有人員 avatar 需要傳;實體 avatar(專案、組織)不傳。\n */\n hoverCard?: React.ReactNode\n}\n\n// code-quality-allow: long-function — foundational composite main body — 拆 sub-fn 會複雜化 local state / ref / context binding\n// 2026-05-13 (a) perf fix part-2(per codex Layer C Roadmap rich-cell dominant + user 拍 Path (a)):\n// `React.memo` wrap forwardRef Avatar — Roadmap 13 columns 含 person/multiPerson,每 row 多 avatar\n// × HoverCard subtree + useDocumentTheme observer = 重渲染 hotspot。memo shallow-equal props,\n// HoverCard / themeRef stable across scroll 時 skip re-render。對齊 codex Profile Plan step 5\n// (filter Avatar/PeoplePicker/FieldSurfaceProvider remounts)。\n// code-quality-allow: long-function — size × shape × color × solid × status × badgeCount × hoverCard × img-fallback 多軸 prop 組合,拆 sub-fn 會跨 fn 傳 imgError state + isTableScrolling observer 結果\nconst AvatarInner = React.forwardRef<HTMLDivElement, AvatarProps>(\n ({ size = 32, shape = 'circle', src, alt, icon: Icon, color = 'neutral', solid = false, status, badgeCount, badgeAriaLabel, hoverCard, className, style, ...props }, ref) => {\n const [imgError, setImgError] = React.useState(false)\n // 2026-07-05 D4:imgError 隨 src 變更 reset — 原 state 首次 onError 後永久 true,consumer 之後\n // 換有效新 src(重傳頭像 / signed URL 刷新)時 showImage 永遠 false,<img> 不再掛載 → 新圖\n // 永不嘗試載入、終身卡 initials fallback。React 官方 adjust-state-on-prop-change 寫法\n //(render-time derived reset,較 useEffect 少一輪 render);對齊 Radix useImageLoadingStatus /\n // MUI useLoaded 皆隨 src reset 的 canonical。\n const [prevSrc, setPrevSrc] = React.useState(src)\n if (prevSrc !== src) {\n setPrevSrc(src)\n setImgError(false)\n }\n const documentTheme = useDocumentTheme()\n const isTableScrolling = useTableIsScrolling()\n // 2026-05-13 R3.5(per codex Q3 verdict + user 拍「想盡辦法 auto-handle prereq」):\n // Avatar self-dim when in disabled Field wrapper context(取代既有 wrapper opacity-disabled blanket\n // 逃生艙 — color.spec.md:729 specific-disabled-color canonical)。\n // Scope:`useResolvedFieldDisabled()`(= fieldCtx.disabled,涵蓋 <Field disabled> 與 <Field mode=\"disabled\">),標準 Field\n // 家族 wrapper disabled 時才 dim;**沒包在 Field wrapper 內的 standalone Avatar**(ProfileCard / FileItem /\n // HoverCard / Dialog 等 display 場景)**backward compat 不變**。對齊 avatar.spec.md「Avatar 在 disabled\n // 元件內 host-controlled opacity」canonical — 升級成「Avatar self-managed via fieldCtx」。\n // 2026-06-08 SSOT:欄位內 Avatar 跟隨 <Field disabled>/<Field mode=\"disabled\"> 變淡(fieldCtx-scoped,cell 無 fieldCtx → 不影響)\n const isDisabledInField = useResolvedFieldDisabled()\n const isFill = size === 'fill'\n // Fill 模式下 icon 用 60% 寬高、text 用 50cqi(container query inline-size);\n // 數字模式下用既有 px 計算\n const numSize = isFill ? 32 : (size as number)\n const iconPx = getIconSize(numSize)\n const fontSizePx = Math.round(numSize * 0.5)\n const variantKey: VariantKey = solid ? 'solid' : 'subtle'\n const colors = COLOR_MAP[variantKey]?.[color] ?? COLOR_MAP.subtle.neutral\n const radius = shape === 'circle' ? '9999px' : '4px'\n\n // 決定內容\n const showImage = src && !imgError\n const showIcon = !showImage && (Icon || (!alt))\n const showText = !showImage && !showIcon && alt\n\n const FallbackIcon = Icon ?? User\n\n // Status dot 尺寸:avatar 的 28%(Slack / Teams / Discord 世界級平均),\n // clamp [8, 16] — floor 8 保小 avatar 仍可辨識但不喧賓奪主(10 floor 會讓 24px\n // avatar 的 dot 占 42% 太大);ceiling 16 防大 avatar dot 過度放大\n const dotSize = isFill ? 10 : Math.max(8, Math.min(16, Math.round(numSize * 0.28)))\n // Border ring 在 surface 上分離 dot 與 avatar,dotSize ≥ 12 時升階到 3px 保持視覺比例\n const dotBorder = dotSize >= 12 ? 3 : 2\n\n const avatarEl = (\n <div\n className={cn(\n 'inline-flex items-center justify-center shrink-0 overflow-hidden select-none',\n isFill && 'w-full h-full',\n // 2026-05-13 R3.5 self-dim:Avatar 在 disabled Field wrapper context 內自 dim\n // (取代 field-wrapper.tsx default/bare/naked disabled blanket opacity-disabled 逃生艙)\n isDisabledInField && 'opacity-disabled',\n )}\n style={{\n ...(isFill\n ? { containerType: 'inline-size' as React.CSSProperties['containerType'] }\n : { width: numSize, height: numSize }),\n borderRadius: radius,\n backgroundColor: showImage ? undefined : colors.bg,\n color: showImage ? undefined : colors.text,\n }}\n data-avatar-size={isFill ? 'fill' : numSize}\n role={!showImage && alt && !hoverCard ? 'img' : undefined}\n aria-label={!showImage && alt && !hoverCard ? alt : undefined}\n >\n {showImage && (\n <img\n src={src}\n alt={alt ?? ''}\n className=\"w-full h-full object-cover\"\n onError={() => setImgError(true)}\n />\n )}\n {showIcon && (\n isFill\n ? <FallbackIcon className=\"w-[60%] h-[60%]\" aria-hidden />\n : <FallbackIcon size={iconPx} aria-hidden />\n )}\n {showText && (\n <span\n className=\"font-medium leading-none\"\n style={{ fontSize: isFill ? '50cqi' : fontSizePx }}\n aria-hidden\n >\n {getInitial(alt!)}\n </span>\n )}\n </div>\n )\n\n const hasOverlay = status || typeof badgeCount === 'number'\n // Keyboard access canonical(D4 UX audit 2026-04-22 finding):Avatar with `hoverCard`\n // 需 keyboard 可達 — Radix `HoverCardTrigger asChild` 不自動加 tabIndex,non-focusable\n // `<div>` 會讓 keyboard-only user 無法 reach ProfileCard popover(WCAG 2.1.1 / 4.1.2 違反)。\n // 解:當 `hoverCard` 存在時,wrapper `<div>` 變 focusable(`tabIndex=0` + `role=\"button\"` +\n // `aria-haspopup=\"dialog\"` + focus-visible ring)。若無 hoverCard 則維持純展示 `<div>`。\n const focusableProps = hoverCard\n ? {\n tabIndex: 0,\n role: 'button' as const,\n 'aria-haspopup': 'dialog' as const,\n 'aria-label': alt ?? 'View profile',\n }\n : {}\n // 2026-05-31:focus ring 圓角跟隨 shape(circle→rounded-full / square→rounded-md,對齊 body 的 `radius` 變數 '9999px'/'4px'),\n // 原寫死 rounded-full 會讓方形 avatar(實體)配 hoverCard 時出現圓形 ring。hoverCard 為通用行為(任意內容),\n // 方形 avatar 合法可配(內容非 ProfileCard 而已),故 ring 必跟形狀。\n const focusableClass = hoverCard\n ? cn('focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1', shape === 'circle' ? 'rounded-full' : 'rounded-md')\n : ''\n const baseEl = !hasOverlay\n ? <div ref={ref} className={cn('inline-flex shrink-0', focusableClass, className)} style={style} {...focusableProps} {...props}>{avatarEl}</div>\n : (\n <div ref={ref} className={cn('relative inline-flex shrink-0', focusableClass, className)} style={style} {...focusableProps} {...props}>\n {avatarEl}\n {/* Status dot:bottom-right(presence — 世界級對照 Slack / Teams / Discord),\n 落在 circle avatar 圓周 45° 位置 / square avatar 右下直角;\n border ring 用 surface 色讓 dot 從 avatar 邊界視覺分離。\n a11y:`aria-hidden` — presence 資訊整合到 parent avatar 的 aria-label\n (world-class Slack 做法),避免多 `role=\"status\"` 造成 screen reader 洪水 */}\n {status && (\n <span\n className=\"absolute block rounded-full\"\n style={{\n width: dotSize,\n height: dotSize,\n bottom: 0,\n right: 0,\n backgroundColor: STATUS_DOT_COLOR[status],\n boxShadow: `0 0 0 ${dotBorder}px var(--surface-raised, var(--canvas))`,\n }}\n aria-hidden\n />\n )}\n {/* Count badge:top-right(chat 未讀 / 通知計數 — 世界級對照 iMessage /\n Slack thread / LINE / WhatsApp)。消費 DS Badge(critical variant),\n 再加 ring 與 avatar 分離 */}\n {typeof badgeCount === 'number' && badgeCount > 0 && (\n <Badge\n variant=\"critical\"\n count={badgeCount}\n max={99}\n className=\"absolute -top-1 -right-1\"\n style={{\n boxShadow: `0 0 0 2px var(--surface-raised, var(--canvas))`,\n }}\n aria-label={badgeAriaLabel ?? `${badgeCount} unread`} // i18n-allow: DS default 英文(consumer 可傳 badgeAriaLabel i18n)\n />\n )}\n </div>\n )\n\n // 2026-05-13 (c) scroll-defer perf(per user 拍 Path (c) + codex Q3 verdict):\n // DataTable scrolling 期間跳 HoverCard wrapper(Portal + useDocumentTheme observer 是\n // Roadmap 重渲 hotspot,per codex Layer C 分析)。scroll 結束 → context flips false →\n // re-render 接回完整 HoverCard tree(ProfileCard 仍可 hover 顯示)。\n // 對齊 AG Grid `deferRender` for slow React cell components / MUI X DataGrid scroll-defer。\n if (!hoverCard || isTableScrolling) return baseEl\n\n return (\n <HoverCard openDelay={HOVER_DELAY_RICH_MS} closeDelay={HOVER_DELAY_CLOSE_MS}>\n <HoverCardTrigger asChild>\n {baseEl}\n </HoverCardTrigger>\n {/* HoverCardContent canonical(2026-04-23):\n - 無 inner padding(consumer ProfileCard 自帶 `px-4 py-3` chrome)\n - `overflow-hidden` + `rounded-lg` → child(ProfileCard)圓角裁切\n - **不設 max-height**:ProfileCard 自己消費 `--radix-hover-card-content-available-height`\n 自約束高度 + 內部 ScrollArea 處理捲動\n - `data-theme={documentTheme}`:ProfileCard 永遠跟隨 **app-level theme**(從 `<html data-theme>`\n 動態讀),不受 trigger subtree theme 污染。範例:Avatar 位於 OverflowIndicator 的 dark\n tooltip 內,其 Portal 會繼承該 subtree dark theme → ProfileCard 變全黑。顯式設回 app theme\n 確保 ProfileCard 永遠 light-in-light-app / dark-in-dark-app。 */}\n <HoverCardContent\n data-theme={documentTheme ?? undefined}\n className=\"bg-surface-raised rounded-lg border border-border overflow-hidden\"\n style={{ boxShadow: 'var(--elevation-200)' }}\n >\n {hoverCard}\n </HoverCardContent>\n </HoverCard>\n )\n }\n)\n\n// ── AvatarData ─────────────────────────────────────────────────────────────\n// 資料型別,讓 consumer 傳資料而非 ReactNode。\n// 接收端內部用 Avatar 元件渲染,統一控制尺寸與 fallback。\n\nexport interface AvatarData {\n /** 圖片 URL */\n src?: string\n /** 替代文字(圖片失敗時取首字作 fallback) */\n alt: string\n /** Icon / text fallback 的背景色,預設 neutral */\n color?: ColorKey\n /**\n * Person avatar hover ProfileCard(DS-wide canonical,person avatar 預設必有,見 avatar.spec.md)。\n * Entity avatar(專案 / 組織 logo)不帶 → consumer 不傳 hoverCard 即豁免。\n * 消費 AvatarData 的 row primitive(MenuItem menu-item.tsx / SelectionItem selection-item.tsx,\n * DropdownMenu / SelectMenu 經 MenuItem)需 forward 此 prop 到內部 <Avatar hoverCard={...} />。\n * 例外:ProfileCard 內部 Avatar 不 forward(卡片本身就是 hover 目的地,nested hover-in-hover 不合理)。\n */\n hoverCard?: React.ReactNode\n}\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 avatarMeta = {\n component: 'Avatar',\n family: null, // non-family composite / overlay / layout\n // 2026-07-04 audit 標記:Avatar 無 variant 軸、size 為任意 number(px,由 consumer context 決定\n // — item-anatomy AVATAR_SIZE 查表 / ProfileCard 40 等),無 discrete tier → 兩欄留空為 intentional 非漏填\n variants: {},\n sizes: {},\n states: ['default', 'focus-visible', 'disabled'], // 2026-06-11 R2:本身無自有 hover/active(spec L279;hoverCard 互動屬 HoverCard),\n tokens: {\n bg: ['bg-surface-raised'],\n fg: ['--foreground', '--on-emphasis'],\n ring: ['ring-ring'],\n },\n} as const\n\nAvatarInner.displayName = 'Avatar'\nconst Avatar = React.memo(AvatarInner)\n\nexport { Avatar }\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './avatar';
2
+ //# sourceMappingURL=index.d.ts.map