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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1356) hide show
  1. package/CLAUDE.md +200 -0
  2. package/README.md +10 -9
  3. package/cli-init.mjs +90 -0
  4. package/dist/components/Accordion/accordion.d.ts +1 -1
  5. package/dist/components/Accordion/accordion.d.ts.map +1 -1
  6. package/dist/components/Accordion/accordion.js +4 -1
  7. package/dist/components/Accordion/accordion.js.map +1 -1
  8. package/dist/components/Accordion/index.d.ts +2 -0
  9. package/dist/components/Accordion/index.d.ts.map +1 -0
  10. package/dist/components/Accordion/index.js +9 -0
  11. package/dist/components/Accordion/index.js.map +1 -0
  12. package/dist/components/Alert/alert.d.ts +2 -2
  13. package/dist/components/Alert/alert.d.ts.map +1 -1
  14. package/dist/components/Alert/alert.js +8 -7
  15. package/dist/components/Alert/alert.js.map +1 -1
  16. package/dist/components/Alert/index.d.ts +2 -0
  17. package/dist/components/Alert/index.d.ts.map +1 -0
  18. package/dist/components/Alert/index.js +7 -0
  19. package/dist/components/Alert/index.js.map +1 -0
  20. package/dist/components/AppShell/_demo-helpers.d.ts +3 -1
  21. package/dist/components/AppShell/_demo-helpers.d.ts.map +1 -1
  22. package/dist/components/AppShell/app-shell.d.ts +2 -2
  23. package/dist/components/AppShell/app-shell.d.ts.map +1 -1
  24. package/dist/components/AppShell/app-shell.js +9 -8
  25. package/dist/components/AppShell/app-shell.js.map +1 -1
  26. package/dist/components/AppShell/index.d.ts +2 -0
  27. package/dist/components/AppShell/index.d.ts.map +1 -0
  28. package/dist/components/AppShell/index.js +7 -0
  29. package/dist/components/AppShell/index.js.map +1 -0
  30. package/dist/components/AspectRatio/aspect-ratio.d.ts +1 -1
  31. package/dist/components/AspectRatio/aspect-ratio.d.ts.map +1 -1
  32. package/dist/components/AspectRatio/aspect-ratio.js +4 -2
  33. package/dist/components/AspectRatio/aspect-ratio.js.map +1 -1
  34. package/dist/components/AspectRatio/index.d.ts +2 -0
  35. package/dist/components/AspectRatio/index.d.ts.map +1 -0
  36. package/dist/components/AspectRatio/index.js +6 -0
  37. package/dist/components/AspectRatio/index.js.map +1 -0
  38. package/dist/components/Avatar/avatar.d.ts +12 -6
  39. package/dist/components/Avatar/avatar.d.ts.map +1 -1
  40. package/dist/components/Avatar/avatar.js +12 -23
  41. package/dist/components/Avatar/avatar.js.map +1 -1
  42. package/dist/components/Avatar/index.d.ts +2 -0
  43. package/dist/components/Avatar/index.d.ts.map +1 -0
  44. package/dist/components/Avatar/index.js +6 -0
  45. package/dist/components/Avatar/index.js.map +1 -0
  46. package/dist/components/Badge/badge.d.ts +20 -8
  47. package/dist/components/Badge/badge.d.ts.map +1 -1
  48. package/dist/components/Badge/badge.js +7 -5
  49. package/dist/components/Badge/badge.js.map +1 -1
  50. package/dist/components/Badge/index.d.ts +2 -0
  51. package/dist/components/Badge/index.d.ts.map +1 -0
  52. package/dist/components/Badge/index.js +7 -0
  53. package/dist/components/Badge/index.js.map +1 -0
  54. package/dist/components/Breadcrumb/breadcrumb.d.ts +1 -1
  55. package/dist/components/Breadcrumb/breadcrumb.js.map +1 -1
  56. package/dist/components/Breadcrumb/index.d.ts +2 -0
  57. package/dist/components/Breadcrumb/index.d.ts.map +1 -0
  58. package/dist/components/Breadcrumb/index.js +12 -0
  59. package/dist/components/Breadcrumb/index.js.map +1 -0
  60. package/dist/components/BulkActionBar/bulk-action-bar.d.ts +2 -2
  61. package/dist/components/BulkActionBar/bulk-action-bar.d.ts.map +1 -1
  62. package/dist/components/BulkActionBar/bulk-action-bar.js +3 -3
  63. package/dist/components/BulkActionBar/bulk-action-bar.js.map +1 -1
  64. package/dist/components/BulkActionBar/index.d.ts +2 -0
  65. package/dist/components/BulkActionBar/index.d.ts.map +1 -0
  66. package/dist/components/BulkActionBar/index.js +7 -0
  67. package/dist/components/BulkActionBar/index.js.map +1 -0
  68. package/dist/components/Button/button.d.ts +7 -7
  69. package/dist/components/Button/button.d.ts.map +1 -1
  70. package/dist/components/Button/button.js +13 -10
  71. package/dist/components/Button/button.js.map +1 -1
  72. package/dist/components/Button/index.d.ts +2 -0
  73. package/dist/components/Button/index.d.ts.map +1 -0
  74. package/dist/components/Button/index.js +8 -0
  75. package/dist/components/Button/index.js.map +1 -0
  76. package/dist/components/Calendar/calendar.d.ts +9 -5
  77. package/dist/components/Calendar/calendar.d.ts.map +1 -1
  78. package/dist/components/Calendar/calendar.js +88 -76
  79. package/dist/components/Calendar/calendar.js.map +1 -1
  80. package/dist/components/Calendar/index.d.ts +2 -0
  81. package/dist/components/Calendar/index.d.ts.map +1 -0
  82. package/dist/components/Calendar/index.js +6 -0
  83. package/dist/components/Calendar/index.js.map +1 -0
  84. package/dist/components/Carousel/carousel.d.ts.map +1 -1
  85. package/dist/components/Carousel/carousel.js +11 -6
  86. package/dist/components/Carousel/carousel.js.map +1 -1
  87. package/dist/components/Carousel/index.d.ts +2 -0
  88. package/dist/components/Carousel/index.d.ts.map +1 -0
  89. package/dist/components/Carousel/index.js +11 -0
  90. package/dist/components/Carousel/index.js.map +1 -0
  91. package/dist/components/Chart/chart.d.ts +2 -2
  92. package/dist/components/Chart/chart.d.ts.map +1 -1
  93. package/dist/components/Chart/chart.js +3 -1
  94. package/dist/components/Chart/chart.js.map +1 -1
  95. package/dist/components/Chart/index.d.ts +2 -0
  96. package/dist/components/Chart/index.d.ts.map +1 -0
  97. package/dist/components/Chart/index.js +11 -0
  98. package/dist/components/Chart/index.js.map +1 -0
  99. package/dist/components/Checkbox/checkbox-group.d.ts +2 -1
  100. package/dist/components/Checkbox/checkbox-group.d.ts.map +1 -1
  101. package/dist/components/Checkbox/checkbox-group.js.map +1 -1
  102. package/dist/components/Checkbox/checkbox.d.ts +13 -7
  103. package/dist/components/Checkbox/checkbox.d.ts.map +1 -1
  104. package/dist/components/Checkbox/checkbox.js +49 -15
  105. package/dist/components/Checkbox/checkbox.js.map +1 -1
  106. package/dist/components/Checkbox/index.d.ts +2 -0
  107. package/dist/components/Checkbox/index.d.ts.map +1 -0
  108. package/dist/components/Checkbox/index.js +7 -0
  109. package/dist/components/Checkbox/index.js.map +1 -0
  110. package/dist/components/Chip/chip.d.ts +6 -6
  111. package/dist/components/Chip/chip.js +4 -3
  112. package/dist/components/Chip/chip.js.map +1 -1
  113. package/dist/components/Chip/index.d.ts +2 -0
  114. package/dist/components/Chip/index.d.ts.map +1 -0
  115. package/dist/components/Chip/index.js +8 -0
  116. package/dist/components/Chip/index.js.map +1 -0
  117. package/dist/components/CircularProgress/circular-progress.d.ts +2 -3
  118. package/dist/components/CircularProgress/circular-progress.d.ts.map +1 -1
  119. package/dist/components/CircularProgress/circular-progress.js +4 -3
  120. package/dist/components/CircularProgress/circular-progress.js.map +1 -1
  121. package/dist/components/CircularProgress/index.d.ts +2 -0
  122. package/dist/components/CircularProgress/index.d.ts.map +1 -0
  123. package/dist/components/CircularProgress/index.js +6 -0
  124. package/dist/components/CircularProgress/index.js.map +1 -0
  125. package/dist/components/Coachmark/coachmark-story-helpers.d.ts +22 -0
  126. package/dist/components/Coachmark/coachmark-story-helpers.d.ts.map +1 -0
  127. package/dist/components/Coachmark/coachmark.d.ts +4 -4
  128. package/dist/components/Coachmark/coachmark.d.ts.map +1 -1
  129. package/dist/components/Coachmark/coachmark.js +9 -4
  130. package/dist/components/Coachmark/coachmark.js.map +1 -1
  131. package/dist/components/Coachmark/index.d.ts +2 -0
  132. package/dist/components/Coachmark/index.d.ts.map +1 -0
  133. package/dist/components/Coachmark/index.js +6 -0
  134. package/dist/components/Coachmark/index.js.map +1 -0
  135. package/dist/components/Combobox/combobox.d.ts +16 -7
  136. package/dist/components/Combobox/combobox.d.ts.map +1 -1
  137. package/dist/components/Combobox/combobox.js +74 -39
  138. package/dist/components/Combobox/combobox.js.map +1 -1
  139. package/dist/components/Combobox/index.d.ts +2 -0
  140. package/dist/components/Combobox/index.d.ts.map +1 -0
  141. package/dist/components/Combobox/index.js +6 -0
  142. package/dist/components/Combobox/index.js.map +1 -0
  143. package/dist/components/Command/command.d.ts +5 -1
  144. package/dist/components/Command/command.d.ts.map +1 -1
  145. package/dist/components/Command/command.js +6 -6
  146. package/dist/components/Command/command.js.map +1 -1
  147. package/dist/components/Command/index.d.ts +2 -0
  148. package/dist/components/Command/index.d.ts.map +1 -0
  149. package/dist/components/Command/index.js +14 -0
  150. package/dist/components/Command/index.js.map +1 -0
  151. package/dist/components/DataTable/cell-registry.d.ts.map +1 -1
  152. package/dist/components/DataTable/cell-registry.js +6 -5
  153. package/dist/components/DataTable/cell-registry.js.map +1 -1
  154. package/dist/components/DataTable/data-table.d.ts +29 -8
  155. package/dist/components/DataTable/data-table.d.ts.map +1 -1
  156. package/dist/components/DataTable/data-table.js +69 -39
  157. package/dist/components/DataTable/data-table.js.map +1 -1
  158. package/dist/components/DataTable/filter-operators.d.ts +1 -1
  159. package/dist/components/DataTable/filter-tree.d.ts +1 -1
  160. package/dist/components/DataTable/index.d.ts +2 -0
  161. package/dist/components/DataTable/index.d.ts.map +1 -0
  162. package/dist/components/DataTable/index.js +8 -0
  163. package/dist/components/DataTable/index.js.map +1 -0
  164. package/dist/components/DateGrid/date-grid.d.ts +21 -17
  165. package/dist/components/DateGrid/date-grid.d.ts.map +1 -1
  166. package/dist/components/DateGrid/date-grid.js +2 -2
  167. package/dist/components/DateGrid/date-grid.js.map +1 -1
  168. package/dist/components/DateGrid/index.d.ts +2 -0
  169. package/dist/components/DateGrid/index.d.ts.map +1 -0
  170. package/dist/components/DateGrid/index.js +6 -0
  171. package/dist/components/DateGrid/index.js.map +1 -0
  172. package/dist/components/DatePicker/date-picker.d.ts.map +1 -1
  173. package/dist/components/DatePicker/date-picker.js +29 -18
  174. package/dist/components/DatePicker/date-picker.js.map +1 -1
  175. package/dist/components/DatePicker/index.d.ts +2 -0
  176. package/dist/components/DatePicker/index.d.ts.map +1 -0
  177. package/dist/components/DatePicker/index.js +8 -0
  178. package/dist/components/DatePicker/index.js.map +1 -0
  179. package/dist/components/DescriptionList/description-list.d.ts +3 -3
  180. package/dist/components/DescriptionList/description-list.js +4 -3
  181. package/dist/components/DescriptionList/description-list.js.map +1 -1
  182. package/dist/components/DescriptionList/index.d.ts +2 -0
  183. package/dist/components/DescriptionList/index.d.ts.map +1 -0
  184. package/dist/components/DescriptionList/index.js +7 -0
  185. package/dist/components/DescriptionList/index.js.map +1 -0
  186. package/dist/components/Dialog/dialog.d.ts.map +1 -1
  187. package/dist/components/Dialog/dialog.js.map +1 -1
  188. package/dist/components/Dialog/index.d.ts +2 -0
  189. package/dist/components/Dialog/index.d.ts.map +1 -0
  190. package/dist/components/Dialog/index.js +16 -0
  191. package/dist/components/Dialog/index.js.map +1 -0
  192. package/dist/components/DropdownMenu/dropdown-menu.d.ts +3 -2
  193. package/dist/components/DropdownMenu/dropdown-menu.d.ts.map +1 -1
  194. package/dist/components/DropdownMenu/dropdown-menu.js +3 -4
  195. package/dist/components/DropdownMenu/dropdown-menu.js.map +1 -1
  196. package/dist/components/DropdownMenu/index.d.ts +2 -0
  197. package/dist/components/DropdownMenu/index.d.ts.map +1 -0
  198. package/dist/components/DropdownMenu/index.js +21 -0
  199. package/dist/components/DropdownMenu/index.js.map +1 -0
  200. package/dist/components/Empty/empty.d.ts +11 -3
  201. package/dist/components/Empty/empty.d.ts.map +1 -1
  202. package/dist/components/Empty/empty.js +6 -6
  203. package/dist/components/Empty/empty.js.map +1 -1
  204. package/dist/components/Empty/index.d.ts +2 -0
  205. package/dist/components/Empty/index.d.ts.map +1 -0
  206. package/dist/components/Empty/index.js +6 -0
  207. package/dist/components/Empty/index.js.map +1 -0
  208. package/dist/components/Field/field-context.d.ts +49 -0
  209. package/dist/components/Field/field-context.d.ts.map +1 -1
  210. package/dist/components/Field/field-context.js +42 -0
  211. package/dist/components/Field/field-context.js.map +1 -1
  212. package/dist/components/Field/field-types.js.map +1 -1
  213. package/dist/components/Field/field-wrapper.js +5 -5
  214. package/dist/components/Field/field-wrapper.js.map +1 -1
  215. package/dist/components/Field/field.d.ts +4 -2
  216. package/dist/components/Field/field.d.ts.map +1 -1
  217. package/dist/components/Field/field.js +1 -0
  218. package/dist/components/Field/field.js.map +1 -1
  219. package/dist/components/Field/index.d.ts +2 -0
  220. package/dist/components/Field/index.d.ts.map +1 -0
  221. package/dist/components/Field/index.js +12 -0
  222. package/dist/components/Field/index.js.map +1 -0
  223. package/dist/components/Field/use-form-validation.d.ts +88 -0
  224. package/dist/components/Field/use-form-validation.d.ts.map +1 -0
  225. package/dist/components/Field/use-form-validation.js +127 -0
  226. package/dist/components/Field/use-form-validation.js.map +1 -0
  227. package/dist/components/FieldControlGroup/field-control-group.d.ts +5 -5
  228. package/dist/components/FieldControlGroup/field-control-group.d.ts.map +1 -1
  229. package/dist/components/FieldControlGroup/field-control-group.js +1 -1
  230. package/dist/components/FieldControlGroup/field-control-group.js.map +1 -1
  231. package/dist/components/FieldControlGroup/index.d.ts +2 -0
  232. package/dist/components/FieldControlGroup/index.d.ts.map +1 -0
  233. package/dist/components/FieldControlGroup/index.js +6 -0
  234. package/dist/components/FieldControlGroup/index.js.map +1 -0
  235. package/dist/components/FileItem/file-item.d.ts +12 -2
  236. package/dist/components/FileItem/file-item.d.ts.map +1 -1
  237. package/dist/components/FileItem/file-item.js +20 -6
  238. package/dist/components/FileItem/file-item.js.map +1 -1
  239. package/dist/components/FileItem/index.d.ts +2 -0
  240. package/dist/components/FileItem/index.d.ts.map +1 -0
  241. package/dist/components/FileItem/index.js +6 -0
  242. package/dist/components/FileItem/index.js.map +1 -0
  243. package/dist/components/FileUpload/file-upload.d.ts +32 -13
  244. package/dist/components/FileUpload/file-upload.d.ts.map +1 -1
  245. package/dist/components/FileUpload/file-upload.js +62 -18
  246. package/dist/components/FileUpload/file-upload.js.map +1 -1
  247. package/dist/components/FileUpload/index.d.ts +2 -0
  248. package/dist/components/FileUpload/index.d.ts.map +1 -0
  249. package/dist/components/FileUpload/index.js +6 -0
  250. package/dist/components/FileUpload/index.js.map +1 -0
  251. package/dist/components/FileViewer/file-viewer.d.ts +2 -2
  252. package/dist/components/FileViewer/file-viewer.d.ts.map +1 -1
  253. package/dist/components/FileViewer/file-viewer.js +28 -19
  254. package/dist/components/FileViewer/file-viewer.js.map +1 -1
  255. package/dist/components/FileViewer/index.d.ts +2 -0
  256. package/dist/components/FileViewer/index.d.ts.map +1 -0
  257. package/dist/components/FileViewer/index.js +7 -0
  258. package/dist/components/FileViewer/index.js.map +1 -0
  259. package/dist/components/HoverCard/hover-card.d.ts +7 -3
  260. package/dist/components/HoverCard/hover-card.d.ts.map +1 -1
  261. package/dist/components/HoverCard/hover-card.js +4 -3
  262. package/dist/components/HoverCard/hover-card.js.map +1 -1
  263. package/dist/components/HoverCard/index.d.ts +2 -0
  264. package/dist/components/HoverCard/index.d.ts.map +1 -0
  265. package/dist/components/HoverCard/index.js +8 -0
  266. package/dist/components/HoverCard/index.js.map +1 -0
  267. package/dist/components/Input/index.d.ts +2 -0
  268. package/dist/components/Input/index.d.ts.map +1 -0
  269. package/dist/components/Input/index.js +6 -0
  270. package/dist/components/Input/index.js.map +1 -0
  271. package/dist/components/Input/input.d.ts +5 -2
  272. package/dist/components/Input/input.d.ts.map +1 -1
  273. package/dist/components/Input/input.js +10 -8
  274. package/dist/components/Input/input.js.map +1 -1
  275. package/dist/components/LinkInput/index.d.ts +2 -0
  276. package/dist/components/LinkInput/index.d.ts.map +1 -0
  277. package/dist/components/LinkInput/index.js +6 -0
  278. package/dist/components/LinkInput/index.js.map +1 -0
  279. package/dist/components/LinkInput/link-input.d.ts.map +1 -1
  280. package/dist/components/LinkInput/link-input.js +8 -8
  281. package/dist/components/LinkInput/link-input.js.map +1 -1
  282. package/dist/components/Menu/index.d.ts +2 -0
  283. package/dist/components/Menu/index.d.ts.map +1 -0
  284. package/dist/components/Menu/index.js +9 -0
  285. package/dist/components/Menu/index.js.map +1 -0
  286. package/dist/components/Menu/menu-item.d.ts +6 -2
  287. package/dist/components/Menu/menu-item.d.ts.map +1 -1
  288. package/dist/components/Menu/menu-item.js +2 -1
  289. package/dist/components/Menu/menu-item.js.map +1 -1
  290. package/dist/components/Notice/index.d.ts +2 -0
  291. package/dist/components/Notice/index.d.ts.map +1 -0
  292. package/dist/components/Notice/index.js +8 -0
  293. package/dist/components/Notice/index.js.map +1 -0
  294. package/dist/components/Notice/notice.d.ts +13 -6
  295. package/dist/components/Notice/notice.d.ts.map +1 -1
  296. package/dist/components/Notice/notice.js +16 -6
  297. package/dist/components/Notice/notice.js.map +1 -1
  298. package/dist/components/NumberInput/index.d.ts +2 -0
  299. package/dist/components/NumberInput/index.d.ts.map +1 -0
  300. package/dist/components/NumberInput/index.js +7 -0
  301. package/dist/components/NumberInput/index.js.map +1 -0
  302. package/dist/components/NumberInput/number-input.d.ts.map +1 -1
  303. package/dist/components/NumberInput/number-input.js +8 -7
  304. package/dist/components/NumberInput/number-input.js.map +1 -1
  305. package/dist/components/OverflowIndicator/index.d.ts +2 -0
  306. package/dist/components/OverflowIndicator/index.d.ts.map +1 -0
  307. package/dist/components/OverflowIndicator/index.js +6 -0
  308. package/dist/components/OverflowIndicator/index.js.map +1 -0
  309. package/dist/components/OverflowIndicator/overflow-indicator.d.ts +5 -1
  310. package/dist/components/OverflowIndicator/overflow-indicator.d.ts.map +1 -1
  311. package/dist/components/OverflowIndicator/overflow-indicator.js +13 -6
  312. package/dist/components/OverflowIndicator/overflow-indicator.js.map +1 -1
  313. package/dist/components/PeoplePicker/index.d.ts +2 -0
  314. package/dist/components/PeoplePicker/index.d.ts.map +1 -0
  315. package/dist/components/PeoplePicker/index.js +9 -0
  316. package/dist/components/PeoplePicker/index.js.map +1 -0
  317. package/dist/components/PeoplePicker/people-picker-helpers.d.ts.map +1 -1
  318. package/dist/components/PeoplePicker/people-picker-helpers.js +2 -2
  319. package/dist/components/PeoplePicker/people-picker-helpers.js.map +1 -1
  320. package/dist/components/PeoplePicker/people-picker.d.ts.map +1 -1
  321. package/dist/components/PeoplePicker/people-picker.js +21 -17
  322. package/dist/components/PeoplePicker/people-picker.js.map +1 -1
  323. package/dist/components/PeoplePicker/person-display.d.ts +7 -7
  324. package/dist/components/PeoplePicker/person-display.d.ts.map +1 -1
  325. package/dist/components/PeoplePicker/person-display.js +9 -9
  326. package/dist/components/PeoplePicker/person-display.js.map +1 -1
  327. package/dist/components/Popover/index.d.ts +2 -0
  328. package/dist/components/Popover/index.d.ts.map +1 -0
  329. package/dist/components/Popover/index.js +14 -0
  330. package/dist/components/Popover/index.js.map +1 -0
  331. package/dist/components/Popover/popover.d.ts +2 -2
  332. package/dist/components/Popover/popover.d.ts.map +1 -1
  333. package/dist/components/Popover/popover.js +12 -12
  334. package/dist/components/Popover/popover.js.map +1 -1
  335. package/dist/components/ProfileCard/index.d.ts +2 -0
  336. package/dist/components/ProfileCard/index.d.ts.map +1 -0
  337. package/dist/components/ProfileCard/index.js +8 -0
  338. package/dist/components/ProfileCard/index.js.map +1 -0
  339. package/dist/components/{NameCard/name-card.d.ts → ProfileCard/profile-card.d.ts} +26 -20
  340. package/dist/components/ProfileCard/profile-card.d.ts.map +1 -0
  341. package/dist/components/{NameCard/name-card.js → ProfileCard/profile-card.js} +11 -10
  342. package/dist/components/ProfileCard/profile-card.js.map +1 -0
  343. package/dist/components/ProgressBar/index.d.ts +2 -0
  344. package/dist/components/ProgressBar/index.d.ts.map +1 -0
  345. package/dist/components/ProgressBar/index.js +6 -0
  346. package/dist/components/ProgressBar/index.js.map +1 -0
  347. package/dist/components/ProgressBar/progress-bar.d.ts +2 -2
  348. package/dist/components/ProgressBar/progress-bar.js +3 -3
  349. package/dist/components/ProgressBar/progress-bar.js.map +1 -1
  350. package/dist/components/RadioGroup/index.d.ts +2 -0
  351. package/dist/components/RadioGroup/index.d.ts.map +1 -0
  352. package/dist/components/RadioGroup/index.js +8 -0
  353. package/dist/components/RadioGroup/index.js.map +1 -0
  354. package/dist/components/RadioGroup/radio-group.d.ts +15 -9
  355. package/dist/components/RadioGroup/radio-group.d.ts.map +1 -1
  356. package/dist/components/RadioGroup/radio-group.js +71 -33
  357. package/dist/components/RadioGroup/radio-group.js.map +1 -1
  358. package/dist/components/Rating/index.d.ts +2 -0
  359. package/dist/components/Rating/index.d.ts.map +1 -0
  360. package/dist/components/Rating/index.js +6 -0
  361. package/dist/components/Rating/index.js.map +1 -0
  362. package/dist/components/Rating/rating.d.ts +6 -2
  363. package/dist/components/Rating/rating.d.ts.map +1 -1
  364. package/dist/components/Rating/rating.js +10 -7
  365. package/dist/components/Rating/rating.js.map +1 -1
  366. package/dist/components/ScrollArea/index.d.ts +2 -0
  367. package/dist/components/ScrollArea/index.d.ts.map +1 -0
  368. package/dist/components/ScrollArea/index.js +7 -0
  369. package/dist/components/ScrollArea/index.js.map +1 -0
  370. package/dist/components/ScrollArea/scroll-area.d.ts +1 -1
  371. package/dist/components/ScrollArea/scroll-area.js +2 -2
  372. package/dist/components/ScrollArea/scroll-area.js.map +1 -1
  373. package/dist/components/SegmentedControl/index.d.ts +2 -0
  374. package/dist/components/SegmentedControl/index.d.ts.map +1 -0
  375. package/dist/components/SegmentedControl/index.js +9 -0
  376. package/dist/components/SegmentedControl/index.js.map +1 -0
  377. package/dist/components/SegmentedControl/segmented-control.d.ts +2 -2
  378. package/dist/components/SegmentedControl/segmented-control.d.ts.map +1 -1
  379. package/dist/components/SegmentedControl/segmented-control.js +8 -10
  380. package/dist/components/SegmentedControl/segmented-control.js.map +1 -1
  381. package/dist/components/Select/index.d.ts +2 -0
  382. package/dist/components/Select/index.d.ts.map +1 -0
  383. package/dist/components/Select/index.js +6 -0
  384. package/dist/components/Select/index.js.map +1 -0
  385. package/dist/components/Select/select.d.ts.map +1 -1
  386. package/dist/components/Select/select.js +30 -18
  387. package/dist/components/Select/select.js.map +1 -1
  388. package/dist/components/SelectMenu/index.d.ts +2 -0
  389. package/dist/components/SelectMenu/index.d.ts.map +1 -0
  390. package/dist/components/SelectMenu/index.js +6 -0
  391. package/dist/components/SelectMenu/index.js.map +1 -0
  392. package/dist/components/SelectMenu/select-menu.d.ts +10 -5
  393. package/dist/components/SelectMenu/select-menu.d.ts.map +1 -1
  394. package/dist/components/SelectMenu/select-menu.js +12 -4
  395. package/dist/components/SelectMenu/select-menu.js.map +1 -1
  396. package/dist/components/SelectionControl/index.d.ts +2 -0
  397. package/dist/components/SelectionControl/index.d.ts.map +1 -0
  398. package/dist/components/SelectionControl/index.js +7 -0
  399. package/dist/components/SelectionControl/index.js.map +1 -0
  400. package/dist/components/SelectionControl/selection-item.d.ts +5 -1
  401. package/dist/components/SelectionControl/selection-item.d.ts.map +1 -1
  402. package/dist/components/SelectionControl/selection-item.js +3 -1
  403. package/dist/components/SelectionControl/selection-item.js.map +1 -1
  404. package/dist/components/Separator/index.d.ts +2 -0
  405. package/dist/components/Separator/index.d.ts.map +1 -0
  406. package/dist/components/Separator/index.js +6 -0
  407. package/dist/components/Separator/index.js.map +1 -0
  408. package/dist/components/Separator/separator.d.ts +2 -2
  409. package/dist/components/Separator/separator.js +4 -3
  410. package/dist/components/Separator/separator.js.map +1 -1
  411. package/dist/components/Sheet/index.d.ts +2 -0
  412. package/dist/components/Sheet/index.d.ts.map +1 -0
  413. package/dist/components/Sheet/index.js +17 -0
  414. package/dist/components/Sheet/index.js.map +1 -0
  415. package/dist/components/Sheet/sheet.d.ts +6 -5
  416. package/dist/components/Sheet/sheet.d.ts.map +1 -1
  417. package/dist/components/Sheet/sheet.js +1 -1
  418. package/dist/components/Sheet/sheet.js.map +1 -1
  419. package/dist/components/Sidebar/index.d.ts +2 -0
  420. package/dist/components/Sidebar/index.d.ts.map +1 -0
  421. package/dist/components/Sidebar/index.js +24 -0
  422. package/dist/components/Sidebar/index.js.map +1 -0
  423. package/dist/components/Sidebar/sidebar.d.ts +2 -2
  424. package/dist/components/Sidebar/sidebar.d.ts.map +1 -1
  425. package/dist/components/Sidebar/sidebar.js +9 -5
  426. package/dist/components/Sidebar/sidebar.js.map +1 -1
  427. package/dist/components/Skeleton/index.d.ts +2 -0
  428. package/dist/components/Skeleton/index.d.ts.map +1 -0
  429. package/dist/components/Skeleton/index.js +6 -0
  430. package/dist/components/Skeleton/index.js.map +1 -0
  431. package/dist/components/Skeleton/skeleton.d.ts +1 -1
  432. package/dist/components/Skeleton/skeleton.js +2 -1
  433. package/dist/components/Skeleton/skeleton.js.map +1 -1
  434. package/dist/components/Slider/index.d.ts +2 -0
  435. package/dist/components/Slider/index.d.ts.map +1 -0
  436. package/dist/components/Slider/index.js +7 -0
  437. package/dist/components/Slider/index.js.map +1 -0
  438. package/dist/components/Slider/slider.d.ts +6 -6
  439. package/dist/components/Slider/slider.d.ts.map +1 -1
  440. package/dist/components/Slider/slider.js +25 -10
  441. package/dist/components/Slider/slider.js.map +1 -1
  442. package/dist/components/Steps/index.d.ts +2 -0
  443. package/dist/components/Steps/index.d.ts.map +1 -0
  444. package/dist/components/Steps/index.js +12 -0
  445. package/dist/components/Steps/index.js.map +1 -0
  446. package/dist/components/Steps/steps.d.ts +2 -2
  447. package/dist/components/Steps/steps.d.ts.map +1 -1
  448. package/dist/components/Steps/steps.js +48 -23
  449. package/dist/components/Steps/steps.js.map +1 -1
  450. package/dist/components/Switch/index.d.ts +2 -0
  451. package/dist/components/Switch/index.d.ts.map +1 -0
  452. package/dist/components/Switch/index.js +7 -0
  453. package/dist/components/Switch/index.js.map +1 -0
  454. package/dist/components/Switch/switch.d.ts +16 -14
  455. package/dist/components/Switch/switch.d.ts.map +1 -1
  456. package/dist/components/Switch/switch.js +46 -17
  457. package/dist/components/Switch/switch.js.map +1 -1
  458. package/dist/components/Tabs/index.d.ts +2 -0
  459. package/dist/components/Tabs/index.d.ts.map +1 -0
  460. package/dist/components/Tabs/index.js +10 -0
  461. package/dist/components/Tabs/index.js.map +1 -0
  462. package/dist/components/Tabs/tabs.d.ts +5 -5
  463. package/dist/components/Tabs/tabs.d.ts.map +1 -1
  464. package/dist/components/Tabs/tabs.js +14 -7
  465. package/dist/components/Tabs/tabs.js.map +1 -1
  466. package/dist/components/Tag/index.d.ts +2 -0
  467. package/dist/components/Tag/index.d.ts.map +1 -0
  468. package/dist/components/Tag/index.js +7 -0
  469. package/dist/components/Tag/index.js.map +1 -0
  470. package/dist/components/Tag/tag.d.ts +37 -23
  471. package/dist/components/Tag/tag.d.ts.map +1 -1
  472. package/dist/components/Tag/tag.js +39 -44
  473. package/dist/components/Tag/tag.js.map +1 -1
  474. package/dist/components/Textarea/index.d.ts +2 -0
  475. package/dist/components/Textarea/index.d.ts.map +1 -0
  476. package/dist/components/Textarea/index.js +7 -0
  477. package/dist/components/Textarea/index.js.map +1 -0
  478. package/dist/components/Textarea/textarea.d.ts +5 -10
  479. package/dist/components/Textarea/textarea.d.ts.map +1 -1
  480. package/dist/components/Textarea/textarea.js +14 -12
  481. package/dist/components/Textarea/textarea.js.map +1 -1
  482. package/dist/components/TimePicker/index.d.ts +2 -0
  483. package/dist/components/TimePicker/index.d.ts.map +1 -0
  484. package/dist/components/TimePicker/index.js +6 -0
  485. package/dist/components/TimePicker/index.js.map +1 -0
  486. package/dist/components/TimePicker/time-columns.d.ts.map +1 -1
  487. package/dist/components/TimePicker/time-columns.js +4 -1
  488. package/dist/components/TimePicker/time-columns.js.map +1 -1
  489. package/dist/components/TimePicker/time-picker.d.ts +2 -1
  490. package/dist/components/TimePicker/time-picker.d.ts.map +1 -1
  491. package/dist/components/TimePicker/time-picker.js +33 -32
  492. package/dist/components/TimePicker/time-picker.js.map +1 -1
  493. package/dist/components/Toast/index.d.ts +2 -0
  494. package/dist/components/Toast/index.d.ts.map +1 -0
  495. package/dist/components/Toast/index.js +7 -0
  496. package/dist/components/Toast/index.js.map +1 -0
  497. package/dist/components/Toast/toast.d.ts +1 -1
  498. package/dist/components/Toast/toast.js +2 -2
  499. package/dist/components/Toast/toast.js.map +1 -1
  500. package/dist/components/Tooltip/index.d.ts +2 -0
  501. package/dist/components/Tooltip/index.d.ts.map +1 -0
  502. package/dist/components/Tooltip/index.js +9 -0
  503. package/dist/components/Tooltip/index.js.map +1 -0
  504. package/dist/components/Tooltip/tooltip.d.ts +1 -1
  505. package/dist/components/Tooltip/tooltip.d.ts.map +1 -1
  506. package/dist/components/Tooltip/tooltip.js +2 -1
  507. package/dist/components/Tooltip/tooltip.js.map +1 -1
  508. package/dist/components/TreeView/index.d.ts +2 -0
  509. package/dist/components/TreeView/index.d.ts.map +1 -0
  510. package/dist/components/TreeView/index.js +8 -0
  511. package/dist/components/TreeView/index.js.map +1 -0
  512. package/dist/components/TreeView/tree-view.d.ts +11 -11
  513. package/dist/components/TreeView/tree-view.d.ts.map +1 -1
  514. package/dist/components/TreeView/tree-view.js +36 -9
  515. package/dist/components/TreeView/tree-view.js.map +1 -1
  516. package/dist/hooks/use-overflow-items.d.ts +10 -6
  517. package/dist/hooks/use-overflow-items.d.ts.map +1 -1
  518. package/dist/hooks/use-overflow-items.js.map +1 -1
  519. package/dist/index.d.ts +57 -67
  520. package/dist/index.d.ts.map +1 -1
  521. package/dist/index.js +29 -59
  522. package/dist/index.js.map +1 -1
  523. package/dist/lib/utils.d.ts.map +1 -1
  524. package/dist/lib/utils.js +3 -1
  525. package/dist/lib/utils.js.map +1 -1
  526. package/dist/node_modules/react-hook-form/dist/index.esm.js +1950 -0
  527. package/dist/node_modules/react-hook-form/dist/index.esm.js.map +1 -0
  528. package/dist/patterns/element-anatomy/index.d.ts +2 -0
  529. package/dist/patterns/element-anatomy/index.d.ts.map +1 -0
  530. package/dist/patterns/element-anatomy/index.js +20 -0
  531. package/dist/patterns/element-anatomy/index.js.map +1 -0
  532. package/dist/patterns/element-anatomy/item-anatomy.d.ts +9 -5
  533. package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -1
  534. package/dist/patterns/element-anatomy/item-anatomy.js +1 -1
  535. package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -1
  536. package/dist/patterns/header-canonical/chrome-header.d.ts +13 -4
  537. package/dist/patterns/header-canonical/chrome-header.d.ts.map +1 -1
  538. package/dist/patterns/header-canonical/chrome-header.js +4 -2
  539. package/dist/patterns/header-canonical/chrome-header.js.map +1 -1
  540. package/dist/patterns/header-canonical/index.d.ts +2 -0
  541. package/dist/patterns/header-canonical/index.d.ts.map +1 -0
  542. package/dist/patterns/header-canonical/index.js +6 -0
  543. package/dist/patterns/header-canonical/index.js.map +1 -0
  544. package/dist/patterns/horizontal-overflow/index.d.ts +2 -0
  545. package/dist/patterns/horizontal-overflow/index.d.ts.map +1 -0
  546. package/dist/patterns/horizontal-overflow/index.js +14 -0
  547. package/dist/patterns/horizontal-overflow/index.js.map +1 -0
  548. package/dist/patterns/overlay-surface/index.d.ts +2 -0
  549. package/dist/patterns/overlay-surface/index.d.ts.map +1 -0
  550. package/dist/patterns/overlay-surface/index.js +8 -0
  551. package/dist/patterns/overlay-surface/index.js.map +1 -0
  552. package/dist/patterns/overlay-surface/overlay-surface.d.ts +11 -2
  553. package/dist/patterns/overlay-surface/overlay-surface.d.ts.map +1 -1
  554. package/dist/patterns/overlay-surface/overlay-surface.js +5 -2
  555. package/dist/patterns/overlay-surface/overlay-surface.js.map +1 -1
  556. package/dist/patterns/resize-handle/index.d.ts +2 -0
  557. package/dist/patterns/resize-handle/index.d.ts.map +1 -0
  558. package/dist/patterns/resize-handle/index.js +5 -0
  559. package/dist/patterns/resize-handle/index.js.map +1 -0
  560. package/dist/story-governance/category-matrix.d.ts +35 -0
  561. package/dist/story-governance/category-matrix.d.ts.map +1 -0
  562. package/dist/tokens/categorical-color.d.ts +60 -0
  563. package/dist/tokens/categorical-color.d.ts.map +1 -0
  564. package/dist/tokens/categorical-color.js +110 -0
  565. package/dist/tokens/categorical-color.js.map +1 -0
  566. package/dist/tokens/motion/motion.d.ts +1 -1
  567. package/dist/tokens/motion/motion.d.ts.map +1 -1
  568. package/dist/tokens/motion/motion.js.map +1 -1
  569. package/dist/tokens/uiSize/icon-size.d.ts +1 -2
  570. package/dist/tokens/uiSize/icon-size.d.ts.map +1 -1
  571. package/ds-canonical/commands/README.md +26 -0
  572. package/ds-canonical/commands/gov-status.md +79 -0
  573. package/ds-canonical/fork/governance.lock +222 -0
  574. package/ds-canonical/fork/hooks/block_prototype_imports.py +111 -0
  575. package/ds-canonical/fork/hooks/check_chrome_header_avatar_canonical.sh +95 -0
  576. package/ds-canonical/fork/hooks/check_consumer_app_invariants.sh +349 -0
  577. package/ds-canonical/fork/hooks/check_ds_anchor_preflight.sh +132 -0
  578. package/ds-canonical/fork/hooks/check_escape_marker_abuse.sh +140 -0
  579. package/ds-canonical/fork/hooks/check_field_family_invariants.sh +250 -0
  580. package/ds-canonical/fork/hooks/check_fork_product_quality.sh +36 -0
  581. package/ds-canonical/fork/hooks/check_item_list_gap.sh +54 -0
  582. package/ds-canonical/fork/hooks/check_layout_space_magic_numbers.sh +96 -0
  583. package/ds-canonical/fork/hooks/check_opacity_token_usage.sh +149 -0
  584. package/ds-canonical/fork/hooks/check_pattern_invariants.sh +196 -0
  585. package/ds-canonical/fork/hooks/check_sidebar_menu_button_implicit_wrap.sh +86 -0
  586. package/ds-canonical/fork/hooks/check_tabs_content_chrome_body_double_gap.sh +183 -0
  587. package/ds-canonical/fork/hooks/check_tailwind_wildcard_in_docs.sh +79 -0
  588. package/ds-canonical/fork/hooks/inject_deploy_url_after_push.sh +238 -0
  589. package/ds-canonical/fork/launchers/fork-governance-dispatcher.sh +44 -0
  590. package/ds-canonical/fork/launchers/inject_fork_governance_preamble.sh +54 -0
  591. package/ds-canonical/fork/launchers/settings-hooks.json +58 -0
  592. package/ds-canonical/fork/manifest.json +98 -0
  593. package/ds-canonical/fork/preamble.md +495 -0
  594. package/ds-canonical/fork/skills/bug-fix-rhythm/SKILL.md +183 -0
  595. package/ds-canonical/fork/skills/code-quality-audit/SKILL.md +65 -0
  596. package/ds-canonical/fork/skills/delivery-handoff/SKILL.md +229 -0
  597. package/ds-canonical/fork/skills/delivery-handoff/references/flow-diagram.md +180 -0
  598. package/ds-canonical/fork/skills/delivery-handoff/references/handoff-template.md +177 -0
  599. package/ds-canonical/fork/skills/delivery-handoff/references/inventory-checklist.md +196 -0
  600. package/ds-canonical/fork/skills/performance-audit/SKILL.md +107 -0
  601. package/ds-canonical/fork/skills/product-ui-audit/SKILL.md +232 -0
  602. package/ds-canonical/fork/skills/product-ui-audit/references/audit-checks.md +246 -0
  603. package/ds-canonical/fork/skills/product-ui-audit/references/common-misuses.md +329 -0
  604. package/ds-canonical/fork/skills/product-ui-audit/references/report-template.md +159 -0
  605. package/ds-canonical/fork/skills/propose-options/SKILL.md +177 -0
  606. package/ds-canonical/fork/skills/prototype/SKILL.md +244 -0
  607. package/ds-canonical/fork/skills/prototype/references/audit-checks.md +38 -0
  608. package/ds-canonical/fork/skills/prototype/references/benchmark-sources.md +94 -0
  609. package/ds-canonical/fork/skills/prototype/references/checkpoints.md +191 -0
  610. package/ds-canonical/fork/skills/prototype/references/evaluation-matrix.md +141 -0
  611. package/ds-canonical/fork/skills/prototype/references/ooux-template.md +198 -0
  612. package/ds-canonical/fork/skills/prototype/references/proposal-template.md +229 -0
  613. package/ds-canonical/fork/skills/scan-similar-bugs/SKILL.md +200 -0
  614. package/ds-canonical/fork/skills/ux-audit/SKILL.md +130 -0
  615. package/ds-canonical/fork/skills/visual-audit/SKILL.md +247 -0
  616. package/ds-canonical/fork/skills/visual-audit/output/.gitkeep +0 -0
  617. package/ds-canonical/fork/skills/visual-audit/references/audit-architecture.md +101 -0
  618. package/ds-canonical/fork/skills/visual-audit/references/visual-checklist.md +297 -0
  619. package/ds-canonical/fork/skills/visual-audit/references/world-class-benchmarks.md +198 -0
  620. package/ds-canonical/hooks/README.md +145 -0
  621. package/ds-canonical/hooks/_log-fire.sh +46 -0
  622. package/ds-canonical/hooks/auto_regen_ds_barrel.sh +58 -0
  623. package/ds-canonical/hooks/block_prototype_imports.py +111 -0
  624. package/ds-canonical/hooks/check_audit_post_report_validator.sh +156 -0
  625. package/ds-canonical/hooks/check_audit_sample_escape.sh +76 -0
  626. package/ds-canonical/hooks/check_benchmark_citation.sh +106 -0
  627. package/ds-canonical/hooks/check_canonical_propagation.sh +189 -0
  628. package/ds-canonical/hooks/check_chrome_header_avatar_canonical.sh +95 -0
  629. package/ds-canonical/hooks/check_codex_brief_invariants.sh +115 -0
  630. package/ds-canonical/hooks/check_codex_collab_5step.sh +108 -0
  631. package/ds-canonical/hooks/check_consumer_app_invariants.sh +349 -0
  632. package/ds-canonical/hooks/check_datatable_invariants.sh +180 -0
  633. package/ds-canonical/hooks/check_dim_count_drift.sh +72 -0
  634. package/ds-canonical/hooks/check_ds_anchor_preflight.sh +132 -0
  635. package/ds-canonical/hooks/check_escape_marker_abuse.sh +140 -0
  636. package/ds-canonical/hooks/check_field_controls_contracts.sh +137 -0
  637. package/ds-canonical/hooks/check_field_family_invariants.sh +250 -0
  638. package/ds-canonical/hooks/check_file_size_budget.sh +60 -0
  639. package/ds-canonical/hooks/check_full_story_visual_interaction_sweep.sh +71 -0
  640. package/ds-canonical/hooks/check_item_list_gap.sh +54 -0
  641. package/ds-canonical/hooks/check_layout_space_magic_numbers.sh +96 -0
  642. package/ds-canonical/hooks/check_main_branch_workbench.sh +93 -0
  643. package/ds-canonical/hooks/check_naming_and_abstraction.sh +165 -0
  644. package/ds-canonical/hooks/check_opacity_token_usage.sh +149 -0
  645. package/ds-canonical/hooks/check_orphan_ds_css.sh +66 -0
  646. package/ds-canonical/hooks/check_overlay_open_focus_escape_probe.sh +75 -0
  647. package/ds-canonical/hooks/check_pattern_invariants.sh +196 -0
  648. package/ds-canonical/hooks/check_peoplepicker_ssot_drift.sh +56 -0
  649. package/ds-canonical/hooks/check_pixel_quantified_audit.sh +53 -0
  650. package/ds-canonical/hooks/check_plugin_fork_health.sh +137 -0
  651. package/ds-canonical/hooks/check_post_main_ssot_propagate.sh +90 -0
  652. package/ds-canonical/hooks/check_propose_discipline.sh +147 -0
  653. package/ds-canonical/hooks/check_propose_pre_grep_verify.sh +70 -0
  654. package/ds-canonical/hooks/check_propose_without_benchmark.sh +63 -0
  655. package/ds-canonical/hooks/check_select_all_canonical.sh +58 -0
  656. package/ds-canonical/hooks/check_sidebar_menu_button_implicit_wrap.sh +86 -0
  657. package/ds-canonical/hooks/check_solo_workflow.sh +317 -0
  658. package/ds-canonical/hooks/check_spec_class_drift.sh +88 -0
  659. package/ds-canonical/hooks/check_story_invariants.sh +748 -0
  660. package/ds-canonical/hooks/check_storybook_addon_packaging.sh +151 -0
  661. package/ds-canonical/hooks/check_substantive_edit_approval_preflight.sh +110 -0
  662. package/ds-canonical/hooks/check_tabs_content_chrome_body_double_gap.sh +183 -0
  663. package/ds-canonical/hooks/check_tailwind_wildcard_in_docs.sh +79 -0
  664. package/ds-canonical/hooks/check_wrapper_primitive_schema_drift.sh +104 -0
  665. package/ds-canonical/hooks/chrome_header_dispatcher.sh +56 -0
  666. package/ds-canonical/hooks/enforce_home_charter.sh +44 -0
  667. package/ds-canonical/hooks/inject_deploy_url_after_push.sh +238 -0
  668. package/ds-canonical/hooks/inject_pending_self_audit.sh +248 -0
  669. package/ds-canonical/hooks/lib/_app_shell_primary_header_consistency.sh +100 -0
  670. package/ds-canonical/hooks/lib/_approval_re.sh +33 -0
  671. package/ds-canonical/hooks/lib/_chrome_header_handcraft.sh +75 -0
  672. package/ds-canonical/hooks/lib/_code_quality.sh +73 -0
  673. package/ds-canonical/hooks/lib/_cva_default_sync.sh +69 -0
  674. package/ds-canonical/hooks/lib/_governance_coverage_check.sh +49 -0
  675. package/ds-canonical/hooks/lib/_hardcoded_strings.sh +163 -0
  676. package/ds-canonical/hooks/lib/_header_with_tabs_border.sh +87 -0
  677. package/ds-canonical/hooks/lib/_layout_space_canonical.sh +56 -0
  678. package/ds-canonical/hooks/lib/_overlay_handcraft.sh +162 -0
  679. package/ds-canonical/hooks/lib/_person_data_richness.sh +42 -0
  680. package/ds-canonical/hooks/lib/_story_compile_drift.sh +48 -0
  681. package/ds-canonical/hooks/lib/_tab_lg_chrome_header_equal.sh +70 -0
  682. package/ds-canonical/hooks/lib/_token_hygiene.sh +104 -0
  683. package/ds-canonical/hooks/log_governance_fires.sh +50 -0
  684. package/ds-canonical/hooks/log_skill_invokes.sh +41 -0
  685. package/ds-canonical/hooks/post_edit_dispatcher.sh +62 -0
  686. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_addon_subdir_ship.sh +76 -0
  687. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_consumer_app_story_title.sh +81 -0
  688. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_consumer_ds_primitive_misuse.sh +120 -0
  689. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_consumer_no_ds_catalog.sh +101 -0
  690. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_consumer_story_baseline.sh +76 -0
  691. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_data_table_size_num_to_meta_width.sh +68 -0
  692. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_fork_user_plugin_install.sh +79 -0
  693. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_plugin_freshness.sh +68 -0
  694. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_propose_cite_required.sh +88 -0
  695. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_propose_plain_chinese.sh +74 -0
  696. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_storybook_addon_preset_cjs.sh +87 -0
  697. package/ds-canonical/hooks/retired/check_anatomy_section_numbering.sh +106 -0
  698. package/ds-canonical/hooks/retired/check_avatar_hovercard.sh +90 -0
  699. package/ds-canonical/hooks/retired/check_button_icon_literal.sh.retired-2026-04-28 +38 -0
  700. package/ds-canonical/hooks/retired/check_container_breathing.sh +142 -0
  701. package/ds-canonical/hooks/retired/check_governance_compliance.sh +61 -0
  702. package/ds-canonical/hooks/retired/check_icon_only_padding_formula.sh +104 -0
  703. package/ds-canonical/hooks/retired/check_item_content_primitive.sh +150 -0
  704. package/ds-canonical/hooks/retired/check_item_list_gap.sh +153 -0
  705. package/ds-canonical/hooks/retired/check_sideoffset_canonical.sh +65 -0
  706. package/ds-canonical/hooks/retired/check_spec_iteration_tag.sh +87 -0
  707. package/ds-canonical/hooks/retired/check_ssot_consultation.sh +88 -0
  708. package/ds-canonical/hooks/retired/check_sync_update.sh +20 -0
  709. package/ds-canonical/hooks/retired/check_third_party_dom_verified.sh +95 -0
  710. package/ds-canonical/hooks/retired/enforce_home_charter.sh +125 -0
  711. package/ds-canonical/hooks/retired/post_edit_canonical_interrogate.sh +109 -0
  712. package/ds-canonical/hooks/retired/pre_edit_spec_check.sh +68 -0
  713. package/ds-canonical/hooks/retired/pre_new_component_spec.sh +39 -0
  714. package/ds-canonical/hooks/retired/pre_write_subsumption_check.sh +112 -0
  715. package/ds-canonical/hooks/retired/stop_meta_self_audit.sh.retired-2026-05-13 +76 -0
  716. package/ds-canonical/hooks/retired/tests/test_check_anatomy_section_numbering.sh +14 -0
  717. package/ds-canonical/hooks/retired/tests/test_check_avatar_hovercard.sh +15 -0
  718. package/ds-canonical/hooks/retired/tests/test_check_container_breathing.sh +15 -0
  719. package/ds-canonical/hooks/retired/tests/test_check_governance_compliance.sh +15 -0
  720. package/ds-canonical/hooks/retired/tests/test_check_icon_only_padding_formula.sh +79 -0
  721. package/ds-canonical/hooks/retired/tests/test_check_item_content_primitive.sh +15 -0
  722. package/ds-canonical/hooks/retired/tests/test_check_item_list_gap.sh +163 -0
  723. package/ds-canonical/hooks/retired/tests/test_check_sideoffset_canonical.sh +15 -0
  724. package/ds-canonical/hooks/retired/tests/test_check_spec_iteration_tag.sh +15 -0
  725. package/ds-canonical/hooks/retired/tests/test_check_ssot_consultation.sh +15 -0
  726. package/ds-canonical/hooks/retired/tests/test_check_sync_update.sh +14 -0
  727. package/ds-canonical/hooks/retired/tests/test_check_third_party_dom_verified.sh +15 -0
  728. package/ds-canonical/hooks/retired/tests/test_enforce_home_charter.sh +15 -0
  729. package/ds-canonical/hooks/retired/tests/test_pre_edit_spec_check.sh +15 -0
  730. package/ds-canonical/hooks/retired/tests/test_pre_new_component_spec.sh +15 -0
  731. package/ds-canonical/hooks/retired/tests/test_pre_write_subsumption_check.sh +63 -0
  732. package/ds-canonical/hooks/session_start_governance_check.sh +310 -0
  733. package/ds-canonical/hooks/stop_passive_logging.sh +322 -0
  734. package/ds-canonical/hooks/stop_self_audit.sh +516 -0
  735. package/ds-canonical/hooks/tests/KNOWN-BROKEN.md +15 -0
  736. package/ds-canonical/hooks/tests/run-all.sh +76 -0
  737. package/ds-canonical/hooks/tests/test_auto_regen_ds_barrel.sh +180 -0
  738. package/ds-canonical/hooks/tests/test_block_prototype_imports.sh +143 -0
  739. package/ds-canonical/hooks/tests/test_check_addon_subdir_ship.sh +171 -0
  740. package/ds-canonical/hooks/tests/test_check_app_shell_primary_header_consistency.sh +196 -0
  741. package/ds-canonical/hooks/tests/test_check_audit_post_report_validator.sh +127 -0
  742. package/ds-canonical/hooks/tests/test_check_audit_sample_escape.sh +93 -0
  743. package/ds-canonical/hooks/tests/test_check_benchmark_citation.sh +115 -0
  744. package/ds-canonical/hooks/tests/test_check_canonical_propagation.sh +133 -0
  745. package/ds-canonical/hooks/tests/test_check_chrome_header_avatar_canonical.sh +198 -0
  746. package/ds-canonical/hooks/tests/test_check_chrome_header_handcraft.sh +146 -0
  747. package/ds-canonical/hooks/tests/test_check_code_quality.sh +15 -0
  748. package/ds-canonical/hooks/tests/test_check_codex_brief_invariants.sh +208 -0
  749. package/ds-canonical/hooks/tests/test_check_codex_collab_5step.sh +96 -0
  750. package/ds-canonical/hooks/tests/test_check_consumer_app_invariants.sh +12 -0
  751. package/ds-canonical/hooks/tests/test_check_consumer_app_story_title.sh +164 -0
  752. package/ds-canonical/hooks/tests/test_check_consumer_ds_primitive_misuse.sh +240 -0
  753. package/ds-canonical/hooks/tests/test_check_consumer_no_ds_catalog.sh +214 -0
  754. package/ds-canonical/hooks/tests/test_check_consumer_story_baseline.sh +202 -0
  755. package/ds-canonical/hooks/tests/test_check_cva_default_sync.sh +15 -0
  756. package/ds-canonical/hooks/tests/test_check_data_table_size_num_to_meta_width.sh +53 -0
  757. package/ds-canonical/hooks/tests/test_check_datatable_invariants.sh +122 -0
  758. package/ds-canonical/hooks/tests/test_check_dim_count_drift.sh +98 -0
  759. package/ds-canonical/hooks/tests/test_check_ds_anchor_preflight.sh +104 -0
  760. package/ds-canonical/hooks/tests/test_check_escape_marker_abuse.sh +192 -0
  761. package/ds-canonical/hooks/tests/test_check_field_controls_contracts.sh +126 -0
  762. package/ds-canonical/hooks/tests/test_check_field_family_invariants.sh +203 -0
  763. package/ds-canonical/hooks/tests/test_check_file_size_budget.sh +32 -0
  764. package/ds-canonical/hooks/tests/test_check_fork_user_plugin_install.sh +46 -0
  765. package/ds-canonical/hooks/tests/test_check_full_story_visual_interaction_sweep.sh +190 -0
  766. package/ds-canonical/hooks/tests/test_check_hardcoded_strings.sh +14 -0
  767. package/ds-canonical/hooks/tests/test_check_header_with_tabs_border.sh +110 -0
  768. package/ds-canonical/hooks/tests/test_check_item_list_gap.sh +44 -0
  769. package/ds-canonical/hooks/tests/test_check_layout_space_canonical.sh +73 -0
  770. package/ds-canonical/hooks/tests/test_check_layout_space_magic_numbers.sh +206 -0
  771. package/ds-canonical/hooks/tests/test_check_main_branch_workbench.sh +147 -0
  772. package/ds-canonical/hooks/tests/test_check_naming_and_abstraction.sh +136 -0
  773. package/ds-canonical/hooks/tests/test_check_opacity_token_usage.sh +110 -0
  774. package/ds-canonical/hooks/tests/test_check_orphan_ds_css.sh +212 -0
  775. package/ds-canonical/hooks/tests/test_check_overlay_handcraft.sh +126 -0
  776. package/ds-canonical/hooks/tests/test_check_overlay_open_focus_escape_probe.sh +191 -0
  777. package/ds-canonical/hooks/tests/test_check_pattern_invariants.sh +148 -0
  778. package/ds-canonical/hooks/tests/test_check_peoplepicker_ssot_drift.sh +108 -0
  779. package/ds-canonical/hooks/tests/test_check_person_data_richness.sh +58 -0
  780. package/ds-canonical/hooks/tests/test_check_pixel_quantified_audit.sh +142 -0
  781. package/ds-canonical/hooks/tests/test_check_plugin_fork_health.sh +9 -0
  782. package/ds-canonical/hooks/tests/test_check_propose_cite_required.sh +181 -0
  783. package/ds-canonical/hooks/tests/test_check_propose_discipline.sh +10 -0
  784. package/ds-canonical/hooks/tests/test_check_propose_plain_chinese.sh +127 -0
  785. package/ds-canonical/hooks/tests/test_check_propose_pre_grep_verify.sh +117 -0
  786. package/ds-canonical/hooks/tests/test_check_propose_without_benchmark.sh +55 -0
  787. package/ds-canonical/hooks/tests/test_check_select_all_canonical.sh +125 -0
  788. package/ds-canonical/hooks/tests/test_check_sidebar_menu_button_implicit_wrap.sh +224 -0
  789. package/ds-canonical/hooks/tests/test_check_solo_workflow.sh +201 -0
  790. package/ds-canonical/hooks/tests/test_check_spec_class_drift.sh +135 -0
  791. package/ds-canonical/hooks/tests/test_check_story_anatomy.sh.broken +197 -0
  792. package/ds-canonical/hooks/tests/test_check_story_category.sh.broken +187 -0
  793. package/ds-canonical/hooks/tests/test_check_story_compile_drift.sh +15 -0
  794. package/ds-canonical/hooks/tests/test_check_story_invariants.sh +384 -0
  795. package/ds-canonical/hooks/tests/test_check_story_name_jargon.sh.broken +53 -0
  796. package/ds-canonical/hooks/tests/test_check_story_slot_split.sh +156 -0
  797. package/ds-canonical/hooks/tests/test_check_storybook_addon_packaging.sh +10 -0
  798. package/ds-canonical/hooks/tests/test_check_storybook_addon_preset_cjs.sh +200 -0
  799. package/ds-canonical/hooks/tests/test_check_substantive_edit_approval_preflight.sh +176 -0
  800. package/ds-canonical/hooks/tests/test_check_tab_lg_chrome_header_equal.sh +141 -0
  801. package/ds-canonical/hooks/tests/test_check_tailwind_wildcard_in_docs.sh +182 -0
  802. package/ds-canonical/hooks/tests/test_check_token_hygiene.sh +21 -0
  803. package/ds-canonical/hooks/tests/test_check_wrapper_primitive_schema_drift.sh +169 -0
  804. package/ds-canonical/hooks/tests/test_enforce_home_charter.sh +77 -0
  805. package/ds-canonical/hooks/tests/test_inject_deploy_url_after_push.sh +193 -0
  806. package/ds-canonical/hooks/tests/test_inject_pending_self_audit.sh +125 -0
  807. package/ds-canonical/hooks/tests/test_log_governance_fires.sh +10 -0
  808. package/ds-canonical/hooks/tests/test_log_skill_invokes.sh +7 -0
  809. package/ds-canonical/hooks/tests/test_post_edit_dispatcher.sh +108 -0
  810. package/ds-canonical/hooks/tests/test_session_start_governance_check.sh +154 -0
  811. package/ds-canonical/hooks/tests/test_stop_capture_metrics.sh +95 -0
  812. package/ds-canonical/hooks/tests/test_stop_governance_drift_check.sh.broken +125 -0
  813. package/ds-canonical/hooks/tests/test_stop_harvest_corrections.sh +10 -0
  814. package/ds-canonical/hooks/tests/test_stop_passive_logging.sh +100 -0
  815. package/ds-canonical/hooks/tests/test_stop_self_audit.sh +98 -0
  816. package/ds-canonical/hooks/tests/test_stop_tsc_sanity.sh +10 -0
  817. package/ds-canonical/references/README.md +46 -0
  818. package/ds-canonical/references/audit-coverage-vs-24-checklist.md +74 -0
  819. package/ds-canonical/references/build-ui-canonicals.md +72 -0
  820. package/ds-canonical/references/composition-fidelity.md +47 -0
  821. package/ds-canonical/references/cva-patterns.md +41 -0
  822. package/ds-canonical/references/drag-canonical.md +331 -0
  823. package/ds-canonical/references/item-anatomy-recipe.md +225 -0
  824. package/ds-canonical/references/naming-conventions.md +57 -0
  825. package/ds-canonical/references/principle-dim-map.json +513 -0
  826. package/ds-canonical/references/props-naming.md +59 -0
  827. package/ds-canonical/references/scenario-definition.md +146 -0
  828. package/ds-canonical/references/spec-rules.md +58 -0
  829. package/ds-canonical/references/ssot-consultation.md +63 -0
  830. package/ds-canonical/references/ssot-index.md +40 -0
  831. package/ds-canonical/references/story-baseline-registry.json +107 -0
  832. package/ds-canonical/references/structural-token-retention.md +42 -0
  833. package/ds-canonical/references/tailwind-gotchas.md +87 -0
  834. package/ds-canonical/references/ui-dev-rules.md +81 -0
  835. package/ds-canonical/rules/README.md +34 -0
  836. package/ds-canonical/rules/meta-patterns.md +87 -0
  837. package/ds-canonical/rules/self-verify.md +56 -0
  838. package/ds-canonical/rules/spec-rules.md +25 -0
  839. package/ds-canonical/rules/story-rules.md +67 -0
  840. package/ds-canonical/rules/ui-development.md +92 -0
  841. package/ds-canonical/skills/README.md +88 -0
  842. package/ds-canonical/skills/bug-fix-rhythm/SKILL.md +181 -0
  843. package/ds-canonical/skills/code-quality-audit/SKILL.md +63 -0
  844. package/ds-canonical/skills/codex-collab/SKILL.md +249 -0
  845. package/ds-canonical/skills/codex-collab/references/brief-template.md +48 -0
  846. package/ds-canonical/skills/codex-collab/references/transport.md +58 -0
  847. package/ds-canonical/skills/codify-corrections/SKILL.md +184 -0
  848. package/ds-canonical/skills/codify-principle/SKILL.md +151 -0
  849. package/ds-canonical/skills/component-quality-gate/SKILL.md +102 -0
  850. package/ds-canonical/skills/component-quality-gate/references/checklist.md +79 -0
  851. package/ds-canonical/skills/deep-audit-cross-codex/SKILL.md +254 -0
  852. package/ds-canonical/skills/deep-audit-cross-codex/references/phase-a-workflow.md +123 -0
  853. package/ds-canonical/skills/deep-audit-cross-codex/references/phase-b-codex-brief.md +186 -0
  854. package/ds-canonical/skills/deep-audit-cross-codex/references/skill-relationships-antipatterns-benchmarks.md +30 -0
  855. package/ds-canonical/skills/deep-audit-cross-codex/references/triage-rubric.md +69 -0
  856. package/ds-canonical/skills/deep-audit-cross-codex/references/upstream-directives-r-mapping.md +33 -0
  857. package/ds-canonical/skills/delivery-handoff/SKILL.md +229 -0
  858. package/ds-canonical/skills/delivery-handoff/references/flow-diagram.md +180 -0
  859. package/ds-canonical/skills/delivery-handoff/references/handoff-template.md +177 -0
  860. package/ds-canonical/skills/delivery-handoff/references/inventory-checklist.md +196 -0
  861. package/ds-canonical/skills/design-system-audit/SKILL.md +386 -0
  862. package/ds-canonical/skills/design-system-audit/references/audit-prompts.md +1325 -0
  863. package/ds-canonical/skills/design-system-audit/references/checkpoints.md +240 -0
  864. package/ds-canonical/skills/design-system-audit/references/historical-bugs.md +240 -0
  865. package/ds-canonical/skills/design-system-audit/references/principle-audit-protocol.md +378 -0
  866. package/ds-canonical/skills/design-system-audit/references/rule-placement.md +175 -0
  867. package/ds-canonical/skills/ensure-canonical/SKILL.md +196 -0
  868. package/ds-canonical/skills/governance-health/SKILL.md +147 -0
  869. package/ds-canonical/skills/knowledge-prune/SKILL.md +250 -0
  870. package/ds-canonical/skills/knowledge-prune/references/phase-z-cross-repo-ssot-propagation.md +11 -0
  871. package/ds-canonical/skills/knowledge-prune/references/prune-dimensions-d5-d10.md +55 -0
  872. package/ds-canonical/skills/knowledge-prune/references/world-class-prune-alignment.md +7 -0
  873. package/ds-canonical/skills/new-component/SKILL.md +170 -0
  874. package/ds-canonical/skills/new-component/references/new-component-checklist.md +85 -0
  875. package/ds-canonical/skills/performance-audit/SKILL.md +107 -0
  876. package/ds-canonical/skills/product-ui-audit/SKILL.md +230 -0
  877. package/ds-canonical/skills/product-ui-audit/references/audit-checks.md +246 -0
  878. package/ds-canonical/skills/product-ui-audit/references/common-misuses.md +329 -0
  879. package/ds-canonical/skills/product-ui-audit/references/report-template.md +159 -0
  880. package/ds-canonical/skills/propose-options/SKILL.md +177 -0
  881. package/ds-canonical/skills/prototype/SKILL.md +244 -0
  882. package/ds-canonical/skills/prototype/references/audit-checks.md +37 -0
  883. package/ds-canonical/skills/prototype/references/benchmark-sources.md +94 -0
  884. package/ds-canonical/skills/prototype/references/checkpoints.md +191 -0
  885. package/ds-canonical/skills/prototype/references/evaluation-matrix.md +141 -0
  886. package/ds-canonical/skills/prototype/references/ooux-template.md +198 -0
  887. package/ds-canonical/skills/prototype/references/proposal-template.md +229 -0
  888. package/ds-canonical/skills/scan-similar-bugs/SKILL.md +198 -0
  889. package/ds-canonical/skills/story-auto-compile-migrate/SKILL.md +159 -0
  890. package/ds-canonical/skills/story-writing/SKILL.md +122 -0
  891. package/ds-canonical/skills/story-writing/references/anatomy-standard.md +217 -0
  892. package/ds-canonical/skills/story-writing/references/category-templates.md +174 -0
  893. package/ds-canonical/skills/story-writing/references/example-selection.md +70 -0
  894. package/ds-canonical/skills/story-writing/references/self-check.md +20 -0
  895. package/ds-canonical/skills/ux-audit/SKILL.md +130 -0
  896. package/ds-canonical/skills/visual-audit/SKILL.md +245 -0
  897. package/ds-canonical/skills/visual-audit/output/.gitkeep +0 -0
  898. package/ds-canonical/skills/visual-audit/references/audit-architecture.md +100 -0
  899. package/ds-canonical/skills/visual-audit/references/visual-checklist.md +297 -0
  900. package/ds-canonical/skills/visual-audit/references/world-class-benchmarks.md +198 -0
  901. package/ds-canonical/templates/_README.md +23 -0
  902. package/ds-canonical/templates/dashboard-app.tsx +161 -0
  903. package/ds-story-manifest.json +1684 -0
  904. package/llms-full.txt +414 -0
  905. package/llms.txt +70 -0
  906. package/package.json +31 -8
  907. package/src/components/Accordion/accordion.anatomy.stories.tsx +496 -0
  908. package/src/components/Accordion/accordion.principles.stories.tsx +360 -0
  909. package/src/components/Accordion/accordion.spec.md +131 -0
  910. package/src/components/Accordion/accordion.stories.tsx +190 -0
  911. package/src/components/Accordion/accordion.tsx +4 -1
  912. package/src/components/Accordion/index.ts +5 -0
  913. package/src/components/Alert/alert.anatomy.stories.tsx +238 -0
  914. package/src/components/Alert/alert.principles.stories.tsx +220 -0
  915. package/src/components/Alert/alert.spec.md +202 -0
  916. package/src/components/Alert/alert.stories.tsx +139 -0
  917. package/src/components/Alert/alert.tsx +9 -6
  918. package/src/components/Alert/index.ts +5 -0
  919. package/src/components/AppShell/_demo-helpers.tsx +87 -11
  920. package/src/components/AppShell/app-shell.anatomy.stories.tsx +176 -0
  921. package/src/components/AppShell/app-shell.principles.stories.tsx +140 -0
  922. package/src/components/AppShell/app-shell.spec.md +357 -0
  923. package/src/components/AppShell/app-shell.stories.tsx +442 -0
  924. package/src/components/AppShell/app-shell.tsx +15 -9
  925. package/src/components/AppShell/index.ts +5 -0
  926. package/src/components/AspectRatio/aspect-ratio.anatomy.stories.tsx +208 -0
  927. package/src/components/AspectRatio/aspect-ratio.principles.stories.tsx +303 -0
  928. package/src/components/AspectRatio/aspect-ratio.spec.md +148 -0
  929. package/src/components/AspectRatio/aspect-ratio.stories.tsx +170 -0
  930. package/src/components/AspectRatio/aspect-ratio.tsx +4 -2
  931. package/src/components/AspectRatio/index.ts +5 -0
  932. package/src/components/Avatar/avatar.anatomy.stories.tsx +701 -0
  933. package/src/components/Avatar/avatar.principles.stories.tsx +245 -0
  934. package/src/components/Avatar/avatar.spec.md +312 -0
  935. package/src/components/Avatar/avatar.stories.tsx +135 -0
  936. package/src/components/Avatar/avatar.tsx +45 -46
  937. package/src/components/Avatar/index.ts +5 -0
  938. package/src/components/Badge/badge.anatomy.stories.tsx +591 -0
  939. package/src/components/Badge/badge.principles.stories.tsx +391 -0
  940. package/src/components/Badge/badge.spec.md +398 -0
  941. package/src/components/Badge/badge.stories.tsx +80 -0
  942. package/src/components/Badge/badge.tsx +34 -13
  943. package/src/components/Badge/index.ts +5 -0
  944. package/src/components/Breadcrumb/breadcrumb.anatomy.stories.tsx +458 -0
  945. package/src/components/Breadcrumb/breadcrumb.principles.stories.tsx +343 -0
  946. package/src/components/Breadcrumb/breadcrumb.spec.md +268 -0
  947. package/src/components/Breadcrumb/breadcrumb.stories.tsx +307 -0
  948. package/src/components/Breadcrumb/breadcrumb.tsx +2 -2
  949. package/src/components/Breadcrumb/index.ts +5 -0
  950. package/src/components/BulkActionBar/bulk-action-bar.anatomy.stories.tsx +224 -0
  951. package/src/components/BulkActionBar/bulk-action-bar.principles.stories.tsx +242 -0
  952. package/src/components/BulkActionBar/bulk-action-bar.spec.md +226 -0
  953. package/src/components/BulkActionBar/bulk-action-bar.stories.tsx +136 -0
  954. package/src/components/BulkActionBar/bulk-action-bar.tsx +13 -11
  955. package/src/components/BulkActionBar/index.ts +5 -0
  956. package/src/components/Button/button.anatomy.stories.tsx +710 -0
  957. package/src/components/Button/button.principles.stories.tsx +370 -0
  958. package/src/components/Button/button.spec.md +463 -0
  959. package/src/components/Button/button.stories.tsx +362 -0
  960. package/src/components/Button/button.tsx +25 -28
  961. package/src/components/Button/index.ts +5 -0
  962. package/src/components/Calendar/calendar.anatomy.stories.tsx +218 -0
  963. package/src/components/Calendar/calendar.principles.stories.tsx +143 -0
  964. package/src/components/Calendar/calendar.spec.md +264 -0
  965. package/src/components/Calendar/calendar.stories.tsx +88 -0
  966. package/src/components/Calendar/calendar.tsx +54 -40
  967. package/src/components/Calendar/index.ts +5 -0
  968. package/src/components/Carousel/carousel.anatomy.stories.tsx +516 -0
  969. package/src/components/Carousel/carousel.principles.stories.tsx +330 -0
  970. package/src/components/Carousel/carousel.spec.md +273 -0
  971. package/src/components/Carousel/carousel.stories.tsx +121 -0
  972. package/src/components/Carousel/carousel.tsx +26 -7
  973. package/src/components/Carousel/index.ts +5 -0
  974. package/src/components/Chart/chart.anatomy.stories.tsx +307 -0
  975. package/src/components/Chart/chart.principles.stories.tsx +436 -0
  976. package/src/components/Chart/chart.spec.md +174 -0
  977. package/src/components/Chart/chart.stories.tsx +268 -0
  978. package/src/components/Chart/chart.tsx +5 -2
  979. package/src/components/Chart/index.ts +5 -0
  980. package/src/components/Checkbox/checkbox-group.tsx +2 -1
  981. package/src/components/Checkbox/checkbox.anatomy.stories.tsx +626 -0
  982. package/src/components/Checkbox/checkbox.principles.stories.tsx +216 -0
  983. package/src/components/Checkbox/checkbox.spec.md +372 -0
  984. package/src/components/Checkbox/checkbox.stories.tsx +114 -0
  985. package/src/components/Checkbox/checkbox.tsx +80 -22
  986. package/src/components/Checkbox/index.ts +5 -0
  987. package/src/components/Chip/chip.anatomy.stories.tsx +422 -0
  988. package/src/components/Chip/chip.principles.stories.tsx +228 -0
  989. package/src/components/Chip/chip.spec.md +237 -0
  990. package/src/components/Chip/chip.stories.tsx +88 -0
  991. package/src/components/Chip/chip.tsx +6 -6
  992. package/src/components/Chip/index.ts +5 -0
  993. package/src/components/CircularProgress/circular-progress.anatomy.stories.tsx +176 -0
  994. package/src/components/CircularProgress/circular-progress.principles.stories.tsx +258 -0
  995. package/src/components/CircularProgress/circular-progress.spec.md +267 -0
  996. package/src/components/CircularProgress/circular-progress.stories.tsx +153 -0
  997. package/src/components/CircularProgress/circular-progress.tsx +4 -5
  998. package/src/components/CircularProgress/index.ts +5 -0
  999. package/src/components/Coachmark/coachmark-story-helpers.tsx +39 -0
  1000. package/src/components/Coachmark/coachmark.anatomy.stories.tsx +356 -0
  1001. package/src/components/Coachmark/coachmark.principles.stories.tsx +355 -0
  1002. package/src/components/Coachmark/coachmark.spec.md +238 -0
  1003. package/src/components/Coachmark/coachmark.stories.tsx +214 -0
  1004. package/src/components/Coachmark/coachmark.tsx +16 -7
  1005. package/src/components/Coachmark/index.ts +5 -0
  1006. package/src/components/Combobox/combobox.anatomy.stories.tsx +919 -0
  1007. package/src/components/Combobox/combobox.principles.stories.tsx +239 -0
  1008. package/src/components/Combobox/combobox.spec.md +202 -0
  1009. package/src/components/Combobox/combobox.stories.tsx +184 -0
  1010. package/src/components/Combobox/combobox.tsx +86 -39
  1011. package/src/components/Combobox/index.ts +5 -0
  1012. package/src/components/Command/command.anatomy.stories.tsx +107 -0
  1013. package/src/components/Command/command.principles.stories.tsx +88 -0
  1014. package/src/components/Command/command.spec.md +181 -0
  1015. package/src/components/Command/command.stories.tsx +280 -0
  1016. package/src/components/Command/command.tsx +13 -8
  1017. package/src/components/Command/index.ts +5 -0
  1018. package/src/components/DataTable/cell-registry.tsx +19 -6
  1019. package/src/components/DataTable/data-table-filter-panel.tsx +8 -8
  1020. package/src/components/DataTable/data-table-sort-manager.tsx +4 -4
  1021. package/src/components/DataTable/data-table.anatomy.stories.tsx +519 -0
  1022. package/src/components/DataTable/data-table.css +1 -1
  1023. package/src/components/DataTable/data-table.principles.stories.tsx +265 -0
  1024. package/src/components/DataTable/data-table.spec.md +540 -0
  1025. package/src/components/DataTable/data-table.stories.tsx +1941 -0
  1026. package/src/components/DataTable/data-table.tsx +121 -53
  1027. package/src/components/DataTable/filter-operators.spec.md +267 -0
  1028. package/src/components/DataTable/filter-operators.ts +1 -1
  1029. package/src/components/DataTable/filter-tree.ts +2 -2
  1030. package/src/components/DataTable/index.ts +5 -0
  1031. package/src/components/DateGrid/date-grid.anatomy.stories.tsx +583 -0
  1032. package/src/components/DateGrid/date-grid.principles.stories.tsx +338 -0
  1033. package/src/components/DateGrid/date-grid.spec.md +218 -0
  1034. package/src/components/DateGrid/date-grid.stories.tsx +195 -0
  1035. package/src/components/DateGrid/date-grid.tsx +22 -18
  1036. package/src/components/DateGrid/index.ts +5 -0
  1037. package/src/components/DatePicker/date-picker.anatomy.stories.tsx +952 -0
  1038. package/src/components/DatePicker/date-picker.principles.stories.tsx +205 -0
  1039. package/src/components/DatePicker/date-picker.spec.md +337 -0
  1040. package/src/components/DatePicker/date-picker.stories.tsx +323 -0
  1041. package/src/components/DatePicker/date-picker.tsx +46 -22
  1042. package/src/components/DatePicker/index.ts +5 -0
  1043. package/src/components/DescriptionList/description-list.anatomy.stories.tsx +252 -0
  1044. package/src/components/DescriptionList/description-list.principles.stories.tsx +309 -0
  1045. package/src/components/DescriptionList/description-list.spec.md +220 -0
  1046. package/src/components/DescriptionList/description-list.stories.tsx +112 -0
  1047. package/src/components/DescriptionList/description-list.tsx +3 -3
  1048. package/src/components/DescriptionList/index.ts +5 -0
  1049. package/src/components/Dialog/dialog.anatomy.stories.tsx +484 -0
  1050. package/src/components/Dialog/dialog.principles.stories.tsx +313 -0
  1051. package/src/components/Dialog/dialog.spec.md +216 -0
  1052. package/src/components/Dialog/dialog.stories.tsx +483 -0
  1053. package/src/components/Dialog/dialog.tsx +9 -9
  1054. package/src/components/Dialog/index.ts +5 -0
  1055. package/src/components/DropdownMenu/dropdown-menu.anatomy.stories.tsx +969 -0
  1056. package/src/components/DropdownMenu/dropdown-menu.principles.stories.tsx +339 -0
  1057. package/src/components/DropdownMenu/dropdown-menu.spec.md +260 -0
  1058. package/src/components/DropdownMenu/dropdown-menu.stories.tsx +286 -0
  1059. package/src/components/DropdownMenu/dropdown-menu.tsx +29 -7
  1060. package/src/components/DropdownMenu/index.ts +5 -0
  1061. package/src/components/Empty/empty.anatomy.stories.tsx +275 -0
  1062. package/src/components/Empty/empty.principles.stories.tsx +314 -0
  1063. package/src/components/Empty/empty.spec.md +216 -0
  1064. package/src/components/Empty/empty.stories.tsx +80 -0
  1065. package/src/components/Empty/empty.tsx +16 -7
  1066. package/src/components/Empty/index.ts +5 -0
  1067. package/src/components/Field/field-context.ts +98 -0
  1068. package/src/components/Field/field-controls.spec.md +382 -0
  1069. package/src/components/Field/field-types.ts +1 -1
  1070. package/src/components/Field/field-wrapper.tsx +6 -6
  1071. package/src/components/Field/field.anatomy.stories.tsx +544 -0
  1072. package/src/components/Field/field.principles.stories.tsx +278 -0
  1073. package/src/components/Field/field.spec.md +460 -0
  1074. package/src/components/Field/field.stories.tsx +716 -0
  1075. package/src/components/Field/field.tsx +12 -5
  1076. package/src/components/Field/form-validation.spec.md +172 -0
  1077. package/src/components/Field/index.ts +5 -0
  1078. package/src/components/Field/use-form-validation.ts +242 -0
  1079. package/src/components/FieldControlGroup/field-control-group.anatomy.stories.tsx +118 -0
  1080. package/src/components/FieldControlGroup/field-control-group.principles.stories.tsx +121 -0
  1081. package/src/components/FieldControlGroup/field-control-group.spec.md +195 -0
  1082. package/src/components/FieldControlGroup/field-control-group.stories.tsx +161 -0
  1083. package/src/components/FieldControlGroup/field-control-group.tsx +9 -8
  1084. package/src/components/FieldControlGroup/index.ts +5 -0
  1085. package/src/components/FileItem/file-item.anatomy.stories.tsx +344 -0
  1086. package/src/components/FileItem/file-item.principles.stories.tsx +276 -0
  1087. package/src/components/FileItem/file-item.spec.md +491 -0
  1088. package/src/components/FileItem/file-item.stories.tsx +265 -0
  1089. package/src/components/FileItem/file-item.tsx +37 -13
  1090. package/src/components/FileItem/index.ts +5 -0
  1091. package/src/components/FileUpload/file-upload.anatomy.stories.tsx +446 -0
  1092. package/src/components/FileUpload/file-upload.principles.stories.tsx +312 -0
  1093. package/src/components/FileUpload/file-upload.spec.md +163 -0
  1094. package/src/components/FileUpload/file-upload.stories.tsx +167 -0
  1095. package/src/components/FileUpload/file-upload.tsx +78 -27
  1096. package/src/components/FileUpload/index.ts +5 -0
  1097. package/src/components/FileViewer/file-viewer.anatomy.stories.tsx +1127 -0
  1098. package/src/components/FileViewer/file-viewer.principles.stories.tsx +636 -0
  1099. package/src/components/FileViewer/file-viewer.spec.md +368 -0
  1100. package/src/components/FileViewer/file-viewer.stories.tsx +407 -0
  1101. package/src/components/FileViewer/file-viewer.tsx +58 -28
  1102. package/src/components/FileViewer/index.ts +5 -0
  1103. package/src/components/HoverCard/hover-card.anatomy.stories.tsx +145 -0
  1104. package/src/components/HoverCard/hover-card.principles.stories.tsx +222 -0
  1105. package/src/components/HoverCard/hover-card.spec.md +167 -0
  1106. package/src/components/HoverCard/hover-card.stories.tsx +304 -0
  1107. package/src/components/HoverCard/hover-card.tsx +15 -4
  1108. package/src/components/HoverCard/index.ts +5 -0
  1109. package/src/components/Input/index.ts +5 -0
  1110. package/src/components/Input/input.anatomy.stories.tsx +763 -0
  1111. package/src/components/Input/input.principles.stories.tsx +265 -0
  1112. package/src/components/Input/input.spec.md +207 -0
  1113. package/src/components/Input/input.stories.tsx +133 -0
  1114. package/src/components/Input/input.tsx +17 -14
  1115. package/src/components/LinkInput/index.ts +5 -0
  1116. package/src/components/LinkInput/link-input.anatomy.stories.tsx +746 -0
  1117. package/src/components/LinkInput/link-input.principles.stories.tsx +182 -0
  1118. package/src/components/LinkInput/link-input.spec.md +144 -0
  1119. package/src/components/LinkInput/link-input.stories.tsx +132 -0
  1120. package/src/components/LinkInput/link-input.tsx +9 -8
  1121. package/src/components/Menu/index.ts +5 -0
  1122. package/src/components/Menu/menu-item.anatomy.stories.tsx +780 -0
  1123. package/src/components/Menu/menu-item.principles.stories.tsx +81 -0
  1124. package/src/components/Menu/menu-item.spec.md +304 -0
  1125. package/src/components/Menu/menu-item.stories.tsx +214 -0
  1126. package/src/components/Menu/menu-item.tsx +8 -3
  1127. package/src/components/Notice/index.ts +5 -0
  1128. package/src/components/Notice/notice.anatomy.stories.tsx +610 -0
  1129. package/src/components/Notice/notice.principles.stories.tsx +102 -0
  1130. package/src/components/Notice/notice.spec.md +158 -0
  1131. package/src/components/Notice/notice.stories.tsx +257 -0
  1132. package/src/components/Notice/notice.tsx +26 -10
  1133. package/src/components/NumberInput/index.ts +5 -0
  1134. package/src/components/NumberInput/number-input.anatomy.stories.tsx +787 -0
  1135. package/src/components/NumberInput/number-input.principles.stories.tsx +199 -0
  1136. package/src/components/NumberInput/number-input.spec.md +144 -0
  1137. package/src/components/NumberInput/number-input.stories.tsx +142 -0
  1138. package/src/components/NumberInput/number-input.tsx +9 -10
  1139. package/src/components/OverflowIndicator/index.ts +5 -0
  1140. package/src/components/OverflowIndicator/overflow-indicator.anatomy.stories.tsx +549 -0
  1141. package/src/components/OverflowIndicator/overflow-indicator.principles.stories.tsx +77 -0
  1142. package/src/components/OverflowIndicator/overflow-indicator.spec.md +127 -0
  1143. package/src/components/OverflowIndicator/overflow-indicator.stories.tsx +238 -0
  1144. package/src/components/OverflowIndicator/overflow-indicator.tsx +19 -6
  1145. package/src/components/PeoplePicker/index.ts +5 -0
  1146. package/src/components/PeoplePicker/people-picker-helpers.ts +5 -5
  1147. package/src/components/PeoplePicker/people-picker.anatomy.stories.tsx +427 -0
  1148. package/src/components/PeoplePicker/people-picker.principles.stories.tsx +192 -0
  1149. package/src/components/PeoplePicker/people-picker.spec.md +292 -0
  1150. package/src/components/PeoplePicker/people-picker.stories.tsx +162 -0
  1151. package/src/components/PeoplePicker/people-picker.tsx +31 -22
  1152. package/src/components/PeoplePicker/person-display.tsx +30 -29
  1153. package/src/components/Popover/index.ts +5 -0
  1154. package/src/components/Popover/popover.anatomy.stories.tsx +279 -0
  1155. package/src/components/Popover/popover.principles.stories.tsx +295 -0
  1156. package/src/components/Popover/popover.spec.md +209 -0
  1157. package/src/components/Popover/popover.stories.tsx +116 -0
  1158. package/src/components/Popover/popover.tsx +17 -14
  1159. package/src/components/ProfileCard/index.ts +5 -0
  1160. package/src/components/ProfileCard/profile-card.anatomy.stories.tsx +504 -0
  1161. package/src/components/ProfileCard/profile-card.principles.stories.tsx +225 -0
  1162. package/src/components/ProfileCard/profile-card.spec.md +191 -0
  1163. package/src/components/ProfileCard/profile-card.stories.tsx +53 -0
  1164. package/src/components/{NameCard/name-card.tsx → ProfileCard/profile-card.tsx} +36 -30
  1165. package/src/components/ProgressBar/index.ts +5 -0
  1166. package/src/components/ProgressBar/progress-bar.anatomy.stories.tsx +438 -0
  1167. package/src/components/ProgressBar/progress-bar.principles.stories.tsx +339 -0
  1168. package/src/components/ProgressBar/progress-bar.spec.md +240 -0
  1169. package/src/components/ProgressBar/progress-bar.stories.tsx +119 -0
  1170. package/src/components/ProgressBar/progress-bar.tsx +4 -4
  1171. package/src/components/RadioGroup/index.ts +5 -0
  1172. package/src/components/RadioGroup/radio-group.anatomy.stories.tsx +681 -0
  1173. package/src/components/RadioGroup/radio-group.principles.stories.tsx +163 -0
  1174. package/src/components/RadioGroup/radio-group.spec.md +149 -0
  1175. package/src/components/RadioGroup/radio-group.stories.tsx +101 -0
  1176. package/src/components/RadioGroup/radio-group.tsx +114 -57
  1177. package/src/components/Rating/index.ts +5 -0
  1178. package/src/components/Rating/rating.anatomy.stories.tsx +495 -0
  1179. package/src/components/Rating/rating.principles.stories.tsx +296 -0
  1180. package/src/components/Rating/rating.spec.md +214 -0
  1181. package/src/components/Rating/rating.stories.tsx +133 -0
  1182. package/src/components/Rating/rating.tsx +29 -14
  1183. package/src/components/ScrollArea/index.ts +5 -0
  1184. package/src/components/ScrollArea/scroll-area.anatomy.stories.tsx +451 -0
  1185. package/src/components/ScrollArea/scroll-area.principles.stories.tsx +331 -0
  1186. package/src/components/ScrollArea/scroll-area.spec.md +143 -0
  1187. package/src/components/ScrollArea/scroll-area.stories.tsx +243 -0
  1188. package/src/components/ScrollArea/scroll-area.tsx +2 -2
  1189. package/src/components/SegmentedControl/index.ts +5 -0
  1190. package/src/components/SegmentedControl/segmented-control.anatomy.stories.tsx +295 -0
  1191. package/src/components/SegmentedControl/segmented-control.principles.stories.tsx +281 -0
  1192. package/src/components/SegmentedControl/segmented-control.spec.md +297 -0
  1193. package/src/components/SegmentedControl/segmented-control.stories.tsx +33 -0
  1194. package/src/components/SegmentedControl/segmented-control.tsx +9 -10
  1195. package/src/components/Select/index.ts +5 -0
  1196. package/src/components/Select/select.anatomy.stories.tsx +828 -0
  1197. package/src/components/Select/select.principles.stories.tsx +311 -0
  1198. package/src/components/Select/select.spec.md +337 -0
  1199. package/src/components/Select/select.stories.tsx +198 -0
  1200. package/src/components/Select/select.tsx +37 -16
  1201. package/src/components/SelectMenu/index.ts +5 -0
  1202. package/src/components/SelectMenu/select-menu.anatomy.stories.tsx +812 -0
  1203. package/src/components/SelectMenu/select-menu.principles.stories.tsx +107 -0
  1204. package/src/components/SelectMenu/select-menu.spec.md +229 -0
  1205. package/src/components/SelectMenu/select-menu.stories.tsx +155 -0
  1206. package/src/components/SelectMenu/select-menu.tsx +34 -9
  1207. package/src/components/SelectionControl/index.ts +5 -0
  1208. package/src/components/SelectionControl/selection-item.anatomy.stories.tsx +571 -0
  1209. package/src/components/SelectionControl/selection-item.principles.stories.tsx +77 -0
  1210. package/src/components/SelectionControl/selection-item.spec.md +141 -0
  1211. package/src/components/SelectionControl/selection-item.stories.tsx +137 -0
  1212. package/src/components/SelectionControl/selection-item.tsx +8 -2
  1213. package/src/components/Separator/index.ts +5 -0
  1214. package/src/components/Separator/separator.anatomy.stories.tsx +125 -0
  1215. package/src/components/Separator/separator.principles.stories.tsx +141 -0
  1216. package/src/components/Separator/separator.spec.md +115 -0
  1217. package/src/components/Separator/separator.stories.tsx +127 -0
  1218. package/src/components/Separator/separator.tsx +2 -2
  1219. package/src/components/Sheet/index.ts +5 -0
  1220. package/src/components/Sheet/sheet.anatomy.stories.tsx +269 -0
  1221. package/src/components/Sheet/sheet.principles.stories.tsx +351 -0
  1222. package/src/components/Sheet/sheet.spec.md +146 -0
  1223. package/src/components/Sheet/sheet.stories.tsx +168 -0
  1224. package/src/components/Sheet/sheet.tsx +7 -6
  1225. package/src/components/Sidebar/index.ts +5 -0
  1226. package/src/components/Sidebar/sidebar.anatomy.stories.tsx +772 -0
  1227. package/src/components/Sidebar/sidebar.principles.stories.tsx +505 -0
  1228. package/src/components/Sidebar/sidebar.spec.md +724 -0
  1229. package/src/components/Sidebar/sidebar.stories.tsx +498 -0
  1230. package/src/components/Sidebar/sidebar.tsx +20 -9
  1231. package/src/components/Skeleton/index.ts +5 -0
  1232. package/src/components/Skeleton/skeleton.anatomy.stories.tsx +145 -0
  1233. package/src/components/Skeleton/skeleton.principles.stories.tsx +234 -0
  1234. package/src/components/Skeleton/skeleton.spec.md +106 -0
  1235. package/src/components/Skeleton/skeleton.stories.tsx +137 -0
  1236. package/src/components/Skeleton/skeleton.tsx +1 -1
  1237. package/src/components/Slider/index.ts +5 -0
  1238. package/src/components/Slider/slider.anatomy.stories.tsx +236 -0
  1239. package/src/components/Slider/slider.principles.stories.tsx +250 -0
  1240. package/src/components/Slider/slider.spec.md +358 -0
  1241. package/src/components/Slider/slider.stories.tsx +99 -0
  1242. package/src/components/Slider/slider.tsx +54 -16
  1243. package/src/components/Steps/index.ts +5 -0
  1244. package/src/components/Steps/steps.anatomy.stories.tsx +448 -0
  1245. package/src/components/Steps/steps.principles.stories.tsx +300 -0
  1246. package/src/components/Steps/steps.spec.md +479 -0
  1247. package/src/components/Steps/steps.stories.tsx +335 -0
  1248. package/src/components/Steps/steps.tsx +56 -26
  1249. package/src/components/Switch/index.ts +5 -0
  1250. package/src/components/Switch/switch.anatomy.stories.tsx +227 -0
  1251. package/src/components/Switch/switch.principles.stories.tsx +174 -0
  1252. package/src/components/Switch/switch.spec.md +238 -0
  1253. package/src/components/Switch/switch.stories.tsx +107 -0
  1254. package/src/components/Switch/switch.tsx +69 -32
  1255. package/src/components/Tabs/index.ts +5 -0
  1256. package/src/components/Tabs/tabs.anatomy.stories.tsx +414 -0
  1257. package/src/components/Tabs/tabs.principles.stories.tsx +257 -0
  1258. package/src/components/Tabs/tabs.spec.md +331 -0
  1259. package/src/components/Tabs/tabs.stories.tsx +155 -0
  1260. package/src/components/Tabs/tabs.tsx +17 -10
  1261. package/src/components/Tag/index.ts +5 -0
  1262. package/src/components/Tag/tag.anatomy.stories.tsx +664 -0
  1263. package/src/components/Tag/tag.principles.stories.tsx +270 -0
  1264. package/src/components/Tag/tag.spec.md +324 -0
  1265. package/src/components/Tag/tag.stories.tsx +69 -0
  1266. package/src/components/Tag/tag.tsx +55 -57
  1267. package/src/components/Textarea/index.ts +5 -0
  1268. package/src/components/Textarea/textarea.anatomy.stories.tsx +304 -0
  1269. package/src/components/Textarea/textarea.principles.stories.tsx +175 -0
  1270. package/src/components/Textarea/textarea.spec.md +162 -0
  1271. package/src/components/Textarea/textarea.stories.tsx +53 -0
  1272. package/src/components/Textarea/textarea.tsx +20 -18
  1273. package/src/components/TimePicker/index.ts +5 -0
  1274. package/src/components/TimePicker/time-columns.tsx +8 -1
  1275. package/src/components/TimePicker/time-picker.anatomy.stories.tsx +281 -0
  1276. package/src/components/TimePicker/time-picker.principles.stories.tsx +140 -0
  1277. package/src/components/TimePicker/time-picker.spec.md +290 -0
  1278. package/src/components/TimePicker/time-picker.stories.tsx +193 -0
  1279. package/src/components/TimePicker/time-picker.tsx +41 -23
  1280. package/src/components/Toast/index.ts +5 -0
  1281. package/src/components/Toast/toast.anatomy.stories.tsx +324 -0
  1282. package/src/components/Toast/toast.principles.stories.tsx +217 -0
  1283. package/src/components/Toast/toast.spec.md +181 -0
  1284. package/src/components/Toast/toast.stories.tsx +125 -0
  1285. package/src/components/Toast/toast.tsx +2 -2
  1286. package/src/components/Tooltip/index.ts +5 -0
  1287. package/src/components/Tooltip/tooltip.anatomy.stories.tsx +413 -0
  1288. package/src/components/Tooltip/tooltip.principles.stories.tsx +204 -0
  1289. package/src/components/Tooltip/tooltip.spec.md +142 -0
  1290. package/src/components/Tooltip/tooltip.stories.tsx +116 -0
  1291. package/src/components/Tooltip/tooltip.tsx +4 -1
  1292. package/src/components/TreeView/index.ts +5 -0
  1293. package/src/components/TreeView/tree-view.anatomy.stories.tsx +426 -0
  1294. package/src/components/TreeView/tree-view.principles.stories.tsx +190 -0
  1295. package/src/components/TreeView/tree-view.spec.md +390 -0
  1296. package/src/components/TreeView/tree-view.stories.tsx +299 -0
  1297. package/src/components/TreeView/tree-view.tsx +63 -26
  1298. package/src/hooks/use-overflow-items.ts +10 -6
  1299. package/src/index.ts +73 -69
  1300. package/src/lib/utils.ts +2 -1
  1301. package/src/patterns/README.md +15 -11
  1302. package/src/patterns/action-bar/action-bar.spec.md +465 -0
  1303. package/src/patterns/action-bar/action-bar.stories.tsx +612 -0
  1304. package/src/patterns/element-anatomy/element-anatomy.spec.md +217 -0
  1305. package/src/patterns/element-anatomy/index.ts +5 -0
  1306. package/src/patterns/element-anatomy/inline-action.spec.md +320 -0
  1307. package/src/patterns/element-anatomy/item-anatomy.spec.md +1051 -0
  1308. package/src/patterns/element-anatomy/item-anatomy.stories.tsx +1622 -0
  1309. package/src/patterns/element-anatomy/item-anatomy.tsx +9 -5
  1310. package/src/patterns/header-canonical/chrome-header.tsx +16 -5
  1311. package/src/patterns/header-canonical/header-canonical.css +2 -2
  1312. package/src/patterns/header-canonical/header-canonical.spec.md +326 -0
  1313. package/src/patterns/header-canonical/header-canonical.stories.tsx +150 -0
  1314. package/src/patterns/header-canonical/index.ts +5 -0
  1315. package/src/patterns/horizontal-overflow/horizontal-overflow.spec.md +211 -0
  1316. package/src/patterns/horizontal-overflow/index.ts +5 -0
  1317. package/src/patterns/overlay-surface/index.ts +5 -0
  1318. package/src/patterns/overlay-surface/overlay-surface.spec.md +442 -0
  1319. package/src/patterns/overlay-surface/overlay-surface.tsx +26 -11
  1320. package/src/patterns/resize-handle/index.ts +5 -0
  1321. package/src/patterns/resize-handle/resize-handle.spec.md +120 -0
  1322. package/src/patterns/resize-handle/resize-handle.stories.tsx +71 -0
  1323. package/src/story-governance/category-matrix.json +132 -0
  1324. package/src/story-governance/category-matrix.ts +55 -0
  1325. package/src/styles/base.css +92 -0
  1326. package/src/styles/tokens.css +11 -0
  1327. package/src/tokens/README.md +7 -2
  1328. package/src/tokens/categorical-color.ts +164 -0
  1329. package/src/tokens/color/color.spec.md +801 -0
  1330. package/src/tokens/color/color.stories.tsx +363 -0
  1331. package/src/tokens/color/primitives.css +7 -0
  1332. package/src/tokens/color/semantic.css +28 -13
  1333. package/src/tokens/density/density.spec.md +128 -0
  1334. package/src/tokens/density/density.stories.tsx +240 -0
  1335. package/src/tokens/elevation/elevation.spec.md +78 -0
  1336. package/src/tokens/elevation/elevation.stories.tsx +98 -0
  1337. package/src/tokens/layoutSpace/layoutSpace.css +1 -1
  1338. package/src/tokens/layoutSpace/layoutSpace.spec.md +324 -0
  1339. package/src/tokens/layoutSpace/layoutSpace.stories.tsx +75 -0
  1340. package/src/tokens/motion/motion.css +2 -2
  1341. package/src/tokens/motion/motion.spec.md +105 -0
  1342. package/src/tokens/motion/motion.ts +1 -1
  1343. package/src/tokens/opacity/opacity.spec.md +73 -0
  1344. package/src/tokens/opacity/opacity.stories.tsx +69 -0
  1345. package/src/tokens/orphan-tokens.spec.md +128 -0
  1346. package/src/tokens/radius/radius.spec.md +126 -0
  1347. package/src/tokens/radius/radius.stories.tsx +86 -0
  1348. package/src/tokens/token-system.spec.md +240 -0
  1349. package/src/tokens/typography/typography.spec.md +204 -0
  1350. package/src/tokens/typography/typography.stories.tsx +133 -0
  1351. package/src/tokens/uiSize/icon-size.ts +1 -2
  1352. package/src/tokens/uiSize/uiSize.css +21 -0
  1353. package/src/tokens/uiSize/uiSize.spec.md +465 -0
  1354. package/src/tokens/utility-registry.json +124 -0
  1355. package/dist/components/NameCard/name-card.d.ts.map +0 -1
  1356. package/dist/components/NameCard/name-card.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"people-picker-helpers.js","sources":["../../../src/components/PeoplePicker/people-picker-helpers.ts"],"sourcesContent":["// PeoplePicker — pure helpers extracted from `people-picker.tsx`(2026-05-18 file-size refactor)\n//\n// 抽出原因:`people-picker.tsx` 達 P1 file-size budget (500 lines)。本檔收 **不消費 component\n// closure** 的純 helper(constant / pure function),讓主檔 ≤ 480。視覺 / behavior /\n// user-facing API 完全未動 — 只是 module-level 邊界搬家。\n//\n// SSOT-bearing render logic(tagRenderer / selectedItemRenderer / 多人 stack 視覺等)仍留在\n// `people-picker.tsx`,因為消費 Combobox / Select / state 等 closure。\n//\n// Hook `check_peoplepicker_ssot_drift.sh` 不檢查本檔 literal — 因規則 cite spec.md row 的義務\n// 在主檔 SSOT-bearing API 邊界處,本檔屬機械搬移。\nimport { nakedCellRowModeAlign } from '@/design-system/components/Field/field-wrapper'\nimport type { SelectOption } from '@/design-system/components/Select/select'\nimport { buildPersonNameCard, resolvePerson, type PersonValue } from './person-display'\n\n// ── Tag wrapper className SSOT ──────────────────────────────────────────────\n//\n// **2026-05-15 Bug 1 fix(Claude+Codex Step 5 比稿 consensus)**:length=1 走 PersonDisplay\n// (avatar+人名+ellipsis,per spec.md §C row 1)需要 width constraint chain;length>=2 走\n// PersonAvatarTag stack overlap(per spec.md §D row 1)需要 negative margin overlap visual。\n// 一個 static wrapper class 涵蓋兩 contract 不可能 — Combobox `OverflowTagList` 把 result 包\n// `shrink-0`,如果 wrapper 還疊 `inline-flex` 就 intrinsic content-width → PersonDisplay\n// truncate 無效(Bug 1 user 抓「越界蓋 indicator」)。\n//\n// **Why centralize**:M14 mechanical guard against future drift。任何人未來改 stack mode 邏輯,\n// 必經此 helper(hook `check_peoplepicker_ssot_drift.sh` 攔接 wrapper class literal in tsx)。\n//\n// **2026-05-15 SSOT alignment**(user verbatim「單選 people picker 沒壞,難道沒有 SSOT?」):\n// 單選 picker wrapper(`select.tsx:229`)= `flex-1 min-w-0 inline-flex items-center +\n// nakedCellRowModeAlign` — proven working,canonical SSOT。本 helper 對齊 single SSOT,\n// **不**自定一套(spec.md §C row 1 +「length=1 視覺 = 跟單人 closed 一致」+ §E「PersonDisplay\n// 共享 renderer」)。\n//\n// `inline-flex items-center` 提供:wrapper 對 PersonDisplay flex container 適當 vertical centering,\n// 不靠外層 tagArea items-center cascade(避免 wrapper 高度 collapse 不可控)。\n// `nakedCellRowModeAlign` 提供:autoRow cell 內 first-line align(對齊既有 row geometry SSOT)。\n//\n// **禁加 overflow-hidden**:inner `<span truncate>` 自帶 overflow-hidden + text-overflow:ellipsis,\n// wrapper overflow-hidden 反而 clip 24px avatar(ItemPrefix h-[1lh]~20px slot 容不下)+ break inner\n// ellipsis trigger(圖一 + 圖二 root cause)。\n\n// code-quality-allow: dead-export — SSOT primitive 公開供 future cross-file 消費 + hook\n// `check_peoplepicker_ssot_drift.sh` enforce wrapper class literal pattern\nexport const PEOPLE_PICKER_LENGTH1_WRAPPER_CLASS = `flex-1 min-w-0 inline-flex items-center ${nakedCellRowModeAlign}`\n\n// code-quality-allow: dead-export — paired helper for SSOT primitive(同上 hook + future use rationale)\nexport function getPeoplePickerTagWrapperClass(selectedCount: number): string {\n return selectedCount === 1\n ? PEOPLE_PICKER_LENGTH1_WRAPPER_CLASS // SSOT aligned to single picker wrapper(select.tsx:229)\n // length>=2 stack 視覺(spec.md §D row 1):圓形 avatar overlap + group/avatar selector for dismiss overlay\n : '-ml-0.5 first:ml-0 relative inline-flex group/avatar'\n}\n\n// ── Person → SelectOption mapping ───────────────────────────────────────────\n//\n// Issue 4(2026-05-10):forward person 的 description + avatar 給 Select(SelectOption schema\n// 已 unified with SelectMenuOption per Issue 4)。先前 PeoplePicker single mode 透過 Select 開\n// menu 時 dropdown row 只顯純文字 name(資訊弱)— 現透過 wrapper schema unify 直接帶 avatar /\n// description 給 SelectMenu primitive 渲。\n//\n// 2026-05-18 fix(per user directive「所有 avatar hover 都要 NameCard」+ avatar.spec.md\n// DS-wide canonical):dropdown menu items Avatar 必帶 hoverCard,跟 PersonDisplay / Tag\n// avatar 對齊。漏掉 = user 抓「PeoplePicker 選單內 avatar 沒有 namecard」。\nexport function personToSelectOption(person: PersonValue): SelectOption {\n const p = resolvePerson(person)\n return {\n value: p.name,\n label: p.name,\n avatar: { src: p.avatarUrl, alt: p.name, hoverCard: buildPersonNameCard(p) },\n description: p.description,\n }\n}\n\nexport function findPerson(people: PersonValue[], name: string): PersonValue {\n return people.find(p => resolvePerson(p).name === name) ?? name\n}\n"],"names":[],"mappings":";;AA2CO,MAAM,sCAAsC,2CAA2C,qBAAqB;AAG5G,SAAS,+BAA+B,eAA+B;AAC5E,SAAO,kBAAkB,IACrB,sCAEA;AACN;AAYO,SAAS,qBAAqB,QAAmC;AACtE,QAAM,IAAI,cAAc,MAAM;AAC9B,SAAO;AAAA,IACL,OAAO,EAAE;AAAA,IACT,OAAO,EAAE;AAAA,IACT,QAAQ,EAAE,KAAK,EAAE,WAAW,KAAK,EAAE,MAAM,WAAW,oBAAoB,CAAC,EAAA;AAAA,IACzE,aAAa,EAAE;AAAA,EAAA;AAEnB;AAEO,SAAS,WAAW,QAAuB,MAA2B;AAC3E,SAAO,OAAO,KAAK,CAAA,MAAK,cAAc,CAAC,EAAE,SAAS,IAAI,KAAK;AAC7D;"}
1
+ {"version":3,"file":"people-picker-helpers.js","sources":["../../../src/components/PeoplePicker/people-picker-helpers.ts"],"sourcesContent":["// PeoplePicker — pure helpers extracted from `people-picker.tsx`(2026-05-18 file-size refactor)\n//\n// 抽出原因:`people-picker.tsx` 達 P1 file-size budget (500 lines)。本檔收 **不消費 component\n// closure** 的純 helper(constant / pure function),讓主檔 ≤ 480。視覺 / behavior /\n// user-facing API 完全未動 — 只是 module-level 邊界搬家。\n//\n// SSOT-bearing render logic(tagRenderer / selectedItemRenderer / 多人 stack 視覺等)仍留在\n// `people-picker.tsx`,因為消費 Combobox / Select / state 等 closure。\n//\n// Hook `check_peoplepicker_ssot_drift.sh` 不檢查本檔 literal — 因規則 cite spec.md row 的義務\n// 在主檔 SSOT-bearing API 邊界處,本檔屬機械搬移。\nimport { nakedCellRowModeAlign } from '@/design-system/components/Field/field-wrapper'\nimport type { SelectOption } from '@/design-system/components/Select/select'\nimport { buildPersonProfileCard, resolvePerson, type PersonValue } from './person-display'\n\n// ── Tag wrapper className SSOT ──────────────────────────────────────────────\n//\n// **2026-05-15 Bug 1 fix(Claude+Codex Step 5 比稿 consensus)**:length=1 走 PersonDisplay\n// (avatar+人名+ellipsis,per spec.md §C row 1)需要 width constraint chain;length>=2 走\n// PersonAvatarTag stack overlap(per spec.md §D row 1)需要 negative margin overlap visual。\n// 一個 static wrapper class 涵蓋兩 contract 不可能 — Combobox `OverflowTagList` 把 result 包\n// `shrink-0`,如果 wrapper 還疊 `inline-flex` 就 intrinsic content-width → PersonDisplay\n// truncate 無效(Bug 1 user 抓「越界蓋 indicator」)。\n//\n// **Why centralize**:M14 mechanical guard against future drift。任何人未來改 stack mode 邏輯,\n// 必經此 helper(hook `check_peoplepicker_ssot_drift.sh` 攔接 wrapper class literal in tsx)。\n//\n// **2026-05-15 SSOT alignment**(user verbatim「單選 people picker 沒壞,難道沒有 SSOT?」):\n// 單選 picker wrapper(`select.tsx:244` selectedItemRenderer wrapper)= `flex-1 min-w-0 inline-flex items-center +\n// nakedCellRowModeAlign` — proven working,canonical SSOT。本 helper 對齊 single SSOT,\n// **不**自定一套(spec.md §C row 1 +「length=1 視覺 = 跟單人 closed 一致」+ §E「PersonDisplay\n// 共享 renderer」)。\n//\n// `inline-flex items-center` 提供:wrapper 對 PersonDisplay flex container 適當 vertical centering,\n// 不靠外層 tagArea items-center cascade(避免 wrapper 高度 collapse 不可控)。\n// `nakedCellRowModeAlign` 提供:autoRow cell 內 first-line align(對齊既有 row geometry SSOT)。\n//\n// **禁加 overflow-hidden**:inner `<span truncate>` 自帶 overflow-hidden + text-overflow:ellipsis,\n// wrapper overflow-hidden 反而 clip 24px avatar(ItemPrefix h-[1lh]~20px slot 容不下)+ break inner\n// ellipsis trigger(圖一 + 圖二 root cause)。\n\n// code-quality-allow: dead-export — SSOT primitive 公開供 future cross-file 消費 + hook\n// `check_peoplepicker_ssot_drift.sh` enforce wrapper class literal pattern\nexport const PEOPLE_PICKER_LENGTH1_WRAPPER_CLASS = `flex-1 min-w-0 inline-flex items-center ${nakedCellRowModeAlign}`\n\n// code-quality-allow: dead-export — paired helper for SSOT primitive(同上 hook + future use rationale)\nexport function getPeoplePickerTagWrapperClass(selectedCount: number): string {\n return selectedCount === 1\n ? PEOPLE_PICKER_LENGTH1_WRAPPER_CLASS // SSOT aligned to single picker wrapper(select.tsx:244 selectedItemRenderer wrapper)\n // length>=2 stack 視覺(spec.md §D row 1):圓形 avatar overlap + group/avatar selector for dismiss overlay\n : '-ml-0.5 first:ml-0 relative inline-flex group/avatar'\n}\n\n// ── Person → SelectOption mapping ───────────────────────────────────────────\n//\n// Issue 4(2026-05-10):forward person 的 description + avatar 給 Select(SelectOption schema\n// 已 unified with SelectMenuOption per Issue 4)。先前 PeoplePicker single mode 透過 Select 開\n// menu 時 dropdown row 只顯純文字 name(資訊弱)— 現透過 wrapper schema unify 直接帶 avatar /\n// description 給 SelectMenu primitive 渲。\n//\n// 2026-05-18 fix(per user directive「所有 avatar hover 都要 ProfileCard」+ avatar.spec.md\n// DS-wide canonical):dropdown menu items Avatar 必帶 hoverCard,跟 PersonDisplay / Tag\n// avatar 對齊。漏掉 = user 抓「PeoplePicker 選單內 avatar 沒有 namecard」。\nexport function personToSelectOption(person: PersonValue): SelectOption {\n const p = resolvePerson(person)\n return {\n value: p.name,\n label: p.name,\n avatar: { src: p.avatarUrl, alt: p.name, hoverCard: buildPersonProfileCard(p) },\n description: p.description,\n }\n}\n\nexport function findPerson(people: PersonValue[], name: string): PersonValue {\n return people.find(p => resolvePerson(p).name === name) ?? name\n}\n"],"names":[],"mappings":";;AA2CO,MAAM,sCAAsC,2CAA2C,qBAAqB;AAG5G,SAAS,+BAA+B,eAA+B;AAC5E,SAAO,kBAAkB,IACrB,sCAEA;AACN;AAYO,SAAS,qBAAqB,QAAmC;AACtE,QAAM,IAAI,cAAc,MAAM;AAC9B,SAAO;AAAA,IACL,OAAO,EAAE;AAAA,IACT,OAAO,EAAE;AAAA,IACT,QAAQ,EAAE,KAAK,EAAE,WAAW,KAAK,EAAE,MAAM,WAAW,uBAAuB,CAAC,EAAA;AAAA,IAC5E,aAAa,EAAE;AAAA,EAAA;AAEnB;AAEO,SAAS,WAAW,QAAuB,MAA2B;AAC3E,SAAO,OAAO,KAAK,CAAA,MAAK,cAAc,CAAC,EAAE,SAAS,IAAI,KAAK;AAC7D;"}
@@ -1 +1 @@
1
- {"version":3,"file":"people-picker.d.ts","sourceRoot":"","sources":["../../../src/components/PeoplePicker/people-picker.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,8CAA8C,CAAA;AAQ3F,OAAO,EAA0F,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAU3I,OAAO,EACL,mCAAmC,EACnC,8BAA8B,EAG/B,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAE,mCAAmC,EAAE,8BAA8B,EAAE,CAAA;AAoB9E,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IAC/F,yFAAyF;IACzF,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,gDAAgD;IAChD,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;IACzB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,WAAW,GAAG,WAAW,EAAE,GAAG,IAAI,CAAA;IAC1C,oEAAoE;IACpE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,IAAI,CAAA;IACzC,4BAA4B;IAC5B,MAAM,CAAC,EAAE,WAAW,EAAE,CAAA;IACtB;oFACgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,sBAAsB;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;4EACwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,sCAAsC;IACtC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IAC/B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,iBAAiB;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,QAAA,MAAM,YAAY,0FAwUhB,CAAA;AAIF,eAAO,MAAM,gBAAgB;;;;;;;;;;;CAWnB,CAAA;AAEV,OAAO,EAAE,YAAY,EAAE,CAAA"}
1
+ {"version":3,"file":"people-picker.d.ts","sourceRoot":"","sources":["../../../src/components/PeoplePicker/people-picker.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,8CAA8C,CAAA;AAQ3F,OAAO,EAA6F,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAU9I,OAAO,EACL,mCAAmC,EACnC,8BAA8B,EAG/B,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAE,mCAAmC,EAAE,8BAA8B,EAAE,CAAA;AAqB9E,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IAC/F,yFAAyF;IACzF,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,gDAAgD;IAChD,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;IACzB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,WAAW,GAAG,WAAW,EAAE,GAAG,IAAI,CAAA;IAC1C,oEAAoE;IACpE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,IAAI,CAAA;IACzC,4BAA4B;IAC5B,MAAM,CAAC,EAAE,WAAW,EAAE,CAAA;IACtB;oFACgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,sBAAsB;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;4EACwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,sCAAsC;IACtC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IAC/B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,iBAAiB;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,QAAA,MAAM,YAAY,0FAgVhB,CAAA;AAIF,eAAO,MAAM,gBAAgB;;;;;;;;;;;CAWnB,CAAA;AAEV,OAAO,EAAE,YAAY,EAAE,CAAA"}
@@ -2,21 +2,21 @@ import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
3
  import { ChevronDown } from "lucide-react";
4
4
  import { cn } from "../../lib/utils.js";
5
- import { EMPTY_DISPLAY, fieldWrapperStyles, nakedCellRowModeAlign } from "../Field/field-wrapper.js";
6
- import { ItemSuffix, ICON_SIZE } from "../../patterns/element-anatomy/item-anatomy.js";
7
- import { useFieldContext, useFieldSurface } from "../Field/field-context.js";
5
+ import { EMPTY_DISPLAY, nakedCellRowModeAlign, fieldWrapperStyles } from "../Field/field-wrapper.js";
6
+ import { ICON_SIZE, ItemSuffix } from "../../patterns/element-anatomy/item-anatomy.js";
7
+ import { useFieldSurface, useResolvedFieldSize, useResolvedFieldDisabled, useResolvedFieldMode, useResolvedFieldVariant } from "../Field/field-context.js";
8
8
  import { Avatar } from "../Avatar/avatar.js";
9
9
  import { Tag } from "../Tag/tag.js";
10
10
  import { Select } from "../Select/select.js";
11
11
  import { Combobox } from "../Combobox/combobox.js";
12
- import { MultiPersonDisplay, PersonDisplay, resolvePerson, buildPersonNameCard, PersonAvatarTag } from "./person-display.js";
12
+ import { MultiPersonDisplay, PersonDisplay, resolvePerson, buildPersonProfileCard, PersonAvatarTag } from "./person-display.js";
13
13
  import { getAvatarStackVisibleCount, AVATAR_STACK_AVATAR_PX, AVATAR_STACK_OVERFLOW_CHIP_PX } from "./avatar-stack-overflow.js";
14
14
  import { findPerson, personToSelectOption, getPeoplePickerTagWrapperClass } from "./people-picker-helpers.js";
15
15
  import { PEOPLE_PICKER_LENGTH1_WRAPPER_CLASS } from "./people-picker-helpers.js";
16
16
  const PeoplePicker = React.forwardRef(function PeoplePicker2({
17
17
  mode: modeProp,
18
18
  variant: variantProp,
19
- size = "md",
19
+ size: sizeProp,
20
20
  value,
21
21
  onChange,
22
22
  people = [],
@@ -27,7 +27,7 @@ const PeoplePicker = React.forwardRef(function PeoplePicker2({
27
27
  emptyText = "沒有符合的人員",
28
28
  // i18n-allow: DS default — only for SelectMenu noResultsText
29
29
  className,
30
- disabled,
30
+ disabled: disabledProp,
31
31
  defaultOpen = false,
32
32
  onOpenChange,
33
33
  multiDisplay = "stack",
@@ -38,11 +38,11 @@ const PeoplePicker = React.forwardRef(function PeoplePicker2({
38
38
  "aria-label": ariaLabel,
39
39
  ...rest
40
40
  }, ref) {
41
- const fieldCtx = useFieldContext();
42
41
  const surface = useFieldSurface();
43
- const mode = modeProp ?? (fieldCtx == null ? void 0 : fieldCtx.mode) ?? "edit";
44
- const resolvedMode = disabled ? "disabled" : mode;
45
- const resolvedVariant = variantProp ?? (fieldCtx == null ? void 0 : fieldCtx.variant) ?? "default";
42
+ const size = useResolvedFieldSize(sizeProp);
43
+ const disabled = useResolvedFieldDisabled(disabledProp);
44
+ const resolvedMode = useResolvedFieldMode({ mode: modeProp, disabled });
45
+ const resolvedVariant = useResolvedFieldVariant(variantProp);
46
46
  const isMulti = Array.isArray(value);
47
47
  const isEmpty = !value || isMulti && value.length === 0;
48
48
  if (resolvedMode === "display") {
@@ -64,15 +64,19 @@ const PeoplePicker = React.forwardRef(function PeoplePicker2({
64
64
  );
65
65
  }
66
66
  if (resolvedMode !== "edit") {
67
- return /* @__PURE__ */ jsx(
67
+ return /* @__PURE__ */ jsxs(
68
68
  "div",
69
69
  {
70
70
  ref,
71
71
  className: cn(fieldWrapperStyles({ mode: resolvedMode, variant: resolvedVariant, size }), className),
72
72
  "data-field-mode": resolvedMode,
73
+ "aria-disabled": resolvedMode === "disabled" ? true : void 0,
73
74
  "aria-label": ariaLabel,
74
75
  ...rest,
75
- children: /* @__PURE__ */ jsx("span", { className: cn("flex-1 min-w-0 inline-flex items-center", nakedCellRowModeAlign, resolvedMode === "disabled" && "text-fg-disabled"), children: isEmpty ? /* @__PURE__ */ jsx("span", { className: "text-fg-muted", children: EMPTY_DISPLAY }) : isMulti ? /* @__PURE__ */ jsx(MultiPersonDisplay, { value, size, measured: true }) : /* @__PURE__ */ jsx(PersonDisplay, { value, size }) })
76
+ children: [
77
+ /* @__PURE__ */ jsx("span", { className: cn("flex-1 min-w-0 inline-flex items-center", nakedCellRowModeAlign, resolvedMode === "disabled" && "text-fg-disabled"), children: isEmpty ? /* @__PURE__ */ jsx("span", { className: "text-fg-muted", children: EMPTY_DISPLAY }) : isMulti ? /* @__PURE__ */ jsx(MultiPersonDisplay, { value, size, measured: true }) : /* @__PURE__ */ jsx(PersonDisplay, { value, size }) }),
78
+ (resolvedVariant === "naked" ? showDisplayEndIcon : resolvedMode === "disabled") && /* @__PURE__ */ jsx(ItemSuffix, { className: "pointer-events-none", children: /* @__PURE__ */ jsx(ChevronDown, { size: ICON_SIZE[size], className: cn("shrink-0", resolvedMode === "disabled" ? "text-fg-disabled" : "text-fg-muted"), "aria-hidden": true }) })
79
+ ]
76
80
  }
77
81
  );
78
82
  }
@@ -129,8 +133,8 @@ const PeoplePicker = React.forwardRef(function PeoplePicker2({
129
133
  {
130
134
  size,
131
135
  color: "neutral",
132
- avatar: pillShowAvatar ? /* @__PURE__ */ jsx(Avatar, { src: p.avatarUrl, alt: p.name, size: 16, hoverCard: buildPersonNameCard(p) }) : void 0,
133
- onDismiss: onRemove,
136
+ avatar: pillShowAvatar ? /* @__PURE__ */ jsx(Avatar, { src: p.avatarUrl, alt: p.name, size: 16, hoverCard: buildPersonProfileCard(p) }) : void 0,
137
+ onRemove,
134
138
  children: p.name
135
139
  },
136
140
  item.value
@@ -190,7 +194,7 @@ const PeoplePicker = React.forwardRef(function PeoplePicker2({
190
194
  wrap: false,
191
195
  defaultOpen,
192
196
  onOpenChange,
193
- className: cn(className, !isEmpty && surface === "form" && "!px-3"),
197
+ className: cn(className, !isEmpty && surface === "form" && "!px-[var(--field-px)]"),
194
198
  "aria-label": ariaLabel,
195
199
  tagWrapperClassName: getPeoplePickerTagWrapperClass(selectedNames.length),
196
200
  overflowWrapperClassName: "-ml-0.5 first:ml-0 relative inline-flex",
@@ -211,10 +215,10 @@ const PeoplePicker = React.forwardRef(function PeoplePicker2({
211
215
  src: p.avatarUrl,
212
216
  alt: p.name,
213
217
  size: 16,
214
- hoverCard: buildPersonNameCard(p)
218
+ hoverCard: buildPersonProfileCard(p)
215
219
  }
216
220
  ),
217
- onDismiss: () => {
221
+ onRemove: () => {
218
222
  onChange == null ? void 0 : onChange(selectedNames.filter((n) => n !== item.value).map((n) => findPerson(people, n)));
219
223
  },
220
224
  children: p.name
@@ -1 +1 @@
1
- {"version":3,"file":"people-picker.js","sources":["../../../src/components/PeoplePicker/people-picker.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.\n// @placeholder-vocabulary-allow: 1-cycle backward-compat — `placeholder` 已加(trigger empty SSOT),`emptyPlaceholder={emptyText}` forward 仍保留讓既有 consumer 不被 silent break;Combobox line 509 `placeholder ?? emptyPlaceholder` fallback → placeholder 永遠 takes precedence。Future cycle 移除 emptyPlaceholder forward(per field-controls.spec.md 共享 contract b)。\n// @cell-metric-escape-allow: comment describes RETIRED `tagAreaPaddingLeftPx={8}` magic — current code is surface-guarded (`surface === 'form'` only injects `!px-3`; table-cell context untouched, lets naked `!px-[var(--table-cell-px)]` SSOT take over). Hook regex grep'd the comment word, not the live code path. Per (a) fix 2026-05-13 user-approved Path a.\nimport * as React from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport { cn } from '@/lib/utils'\nimport type { FieldMode, FieldVariant } from '@/design-system/components/Field/field-types'\nimport { fieldWrapperStyles, EMPTY_DISPLAY, nakedCellRowModeAlign } from '@/design-system/components/Field/field-wrapper'\nimport { ItemSuffix } from '@/design-system/patterns/element-anatomy/item-anatomy'\nimport { useFieldContext, useFieldSurface } from '@/design-system/components/Field/field-context'\nimport { Avatar } from '@/design-system/components/Avatar/avatar'\nimport { Tag } from '@/design-system/components/Tag/tag'\nimport { Select } from '@/design-system/components/Select/select'\nimport { Combobox } from '@/design-system/components/Combobox/combobox'\nimport { PersonDisplay, MultiPersonDisplay, PersonAvatarTag, buildPersonNameCard, resolvePerson, type PersonValue } from './person-display'\nimport {\n getAvatarStackVisibleCount,\n AVATAR_STACK_AVATAR_PX,\n AVATAR_STACK_OVERFLOW_CHIP_PX,\n} from './avatar-stack-overflow'\n// Pure helpers extracted to sibling for file-size budget(2026-05-18,P1 ≤ 500 lines)。\n// 不消費 component closure 的純 constant / 純 mapping function 全部搬走,主檔保留 SSOT-bearing\n// render logic(消費 Combobox / Select / state 等 closure 的部分)。\n// SSOT primitive re-export(backward-compat 對外 import 路徑保持 `./people-picker`)。\nimport {\n PEOPLE_PICKER_LENGTH1_WRAPPER_CLASS,\n getPeoplePickerTagWrapperClass,\n personToSelectOption,\n findPerson,\n} from './people-picker-helpers'\nimport { ICON_SIZE } from '@/design-system/tokens/uiSize/icon-size'\nexport { PEOPLE_PICKER_LENGTH1_WRAPPER_CLASS, getPeoplePickerTagWrapperClass }\n\n// ── PeoplePicker ────────────────────────────────────────────────────────────\n// **2026-05-07 v15.6 SSOT 重構 v2**:\n//\n// - **single mode** wraps `<Select searchable selectedItemRenderer>`\n// - **multi mode** 兩種 displayMode(consumer 自選):\n// - **'stack'**(default,baseline 既有視覺)— Avatar 疊合 + `+N` overflow indicator,\n// 不可 wrap。Trigger 自組 + 直接 wrap `<SelectMenu multiple>` primitive,\n// trigger 內 render `<MultiPersonDisplay>` reuse baseline primitive(SSOT)。\n// 對齊 Notion / Linear / Atlassian / Slack 多人 quick-glance idiom。\n// - **'pill'**(opt-in)— 每人 Tag pill,可 wrap。Wrap `<Combobox tagRenderer>`,\n// tagRenderer 用 Tag 元件 `avatar` prop SSOT(不塞 children)。\n// `pillShowAvatar` 控 pill 內是否顯 avatar prefix(default true,false → 純文字 pill)。\n// 對齊 GitHub Reviewers / Combobox tag-input idiom。\n\n// **codex P2 fix(2026-05-07 v15.10)**:`extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'>`\n// 讓 consumer 可傳 `id` / `data-testid` / `onBlur` / `onFocus` / `aria-*` 等 HTML root props,\n// component 內部 `...rest` forward 到 trigger 容器(對齊 DS 既有 Combobox / Select 慣例)。\n// `onChange` 衝突走 Omit(本 component 用 PersonValue[] custom signature)。\nexport interface PeoplePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Field mode(edit / display / readonly / disabled),默認 inherit Field context 或 'edit' */\n mode?: FieldMode\n /** Field chrome variant(對齊 Select / Combobox)*/\n variant?: FieldVariant\n size?: 'sm' | 'md' | 'lg'\n /** 當前已選的人(單選 PersonValue,多選 PersonValue[])*/\n value?: PersonValue | PersonValue[] | null\n /** 值變更 callback(永遠 emit array — single mode 取 [0] 即 single value)*/\n onChange?: (value: PersonValue[]) => void\n /** 可選人員清單(edit mode 下拉顯示)*/\n people?: PersonValue[]\n /** 2026-05-12 Stream C Issue 4 fix(codex Q3 Cluster C):trigger empty placeholder。\n * Default '請選擇人員'。**禁** 將 `emptyText`(search-empty)當 trigger placeholder 傳。 */\n placeholder?: string\n /** 搜尋框 placeholder */\n searchPlaceholder?: string\n /** 搜尋無結果訊息(filtered menu empty)。**僅**用於 SelectMenu noResultsText,\n * 不再 silent 轉 trigger placeholder(2026-05-12 Issue 4 semantic fix)。 */\n emptyText?: string\n className?: string\n disabled?: boolean\n /** Initial open state(uncontrolled)*/\n defaultOpen?: boolean\n /** open state 變更 callback */\n onOpenChange?: (open: boolean) => void\n /**\n * Multi mode 顯示樣式(default 'stack')。Single mode 此 prop 忽略。\n * - 'stack' — Avatar 疊合 + `+N`(空間省、不可 wrap;default)\n * - 'pill' — 每人 Tag pill(可 wrap)\n */\n multiDisplay?: 'stack' | 'pill'\n /**\n * `multiDisplay='pill'` 模式下是否顯示 avatar prefix(default true)。\n * 設 false → 純文字 pill,進一步節省空間。對齊 Tag 元件 `avatar` prop SSOT。\n */\n pillShowAvatar?: boolean\n /** Pill 模式下是否允許 wrap(default true)— 對齊 Combobox `wrap` prop */\n pillWrap?: boolean\n /**\n * 搜尋型態(2026-05-12 規則 3 ship,3-mode SSOT 對齊 A1-A5 spec):\n * - `'menu'`(default,backward-compat)— 浮層內搜尋(panel-top search)\n * - `'trigger'`(multi 模式 opt-in)— inline 搜尋(浮層開時 name 拿掉,avatar 後接 input cursor,\n * 類 Combobox inline-trigger idiom)\n * Single mode 永遠 inline-trigger(wrap Select searchable 直接走 inline),此 prop multi 才有意義。\n */\n searchIn?: 'menu' | 'trigger'\n /**\n * Display 是否渲 ChevronDown + Field naked wrapper(D-path opt-in,2026-05-08)\n * — DataTable cell display↔edit 像素級對齊用。預設 false(裸 PersonDisplay,backward compat)。\n * 設 true 時 display 走 fieldWrapperStyles(naked variant)+ ItemSuffix ChevronDown,\n * 與 edit (Select / Combobox wrapped) 同 DOM 結構,消除 Layer-B padding mismatch。\n */\n showDisplayEndIcon?: boolean\n /** a11y label */\n 'aria-label'?: string\n}\n\nconst PeoplePicker = React.forwardRef<HTMLDivElement, PeoplePickerProps>(function PeoplePicker({\n mode: modeProp,\n variant: variantProp,\n size = 'md',\n value,\n onChange,\n people = [],\n placeholder = '請選擇人員', // i18n-allow: DS default(2026-05-12 Stream C Issue 4)\n searchPlaceholder = '搜尋人員…', // i18n-allow: DS default\n emptyText = '沒有符合的人員', // i18n-allow: DS default — only for SelectMenu noResultsText\n className,\n disabled,\n defaultOpen = false,\n onOpenChange,\n multiDisplay = 'stack',\n pillShowAvatar = true,\n pillWrap = true,\n searchIn = 'menu',\n showDisplayEndIcon = false,\n 'aria-label': ariaLabel,\n ...rest\n}, ref) {\n const fieldCtx = useFieldContext()\n const surface = useFieldSurface()\n const mode: FieldMode = modeProp ?? fieldCtx?.mode ?? 'edit'\n const resolvedMode: FieldMode = disabled ? 'disabled' : mode\n const resolvedVariant: FieldVariant = variantProp ?? fieldCtx?.variant ?? 'default'\n const isMulti = Array.isArray(value)\n const isEmpty = !value || (isMulti && value.length === 0)\n\n // ── mode='display' ────────────────────────────────────────────────────────\n // Default(showDisplayEndIcon=false):裸 PersonDisplay / MultiPersonDisplay — backward compat。\n // Opt-in(showDisplayEndIcon=true,2026-05-08 D-path):Field naked wrapper + ItemSuffix ChevronDown,\n // 與 edit (Select / Combobox wrapped) 同 DOM 結構消除 cell display↔edit 像素偏移。\n if (resolvedMode === 'display') {\n if (!showDisplayEndIcon) {\n if (isEmpty) return <span className=\"text-fg-muted\">{EMPTY_DISPLAY}</span>\n return isMulti\n ? <MultiPersonDisplay value={value as PersonValue[]} size={size} measured />\n : <PersonDisplay value={value as PersonValue} size={size} />\n }\n // 2026-05-18 改 import ICON_SIZE SSOT(per user『做完』approval,消除 M17 違反 7+ 重複 ternary)\n const iconSize = ICON_SIZE[size as 'sm' | 'md' | 'lg']\n return (\n <div\n className={cn(fieldWrapperStyles({ mode: 'display', variant: resolvedVariant, size }), className)}\n data-field-mode=\"display\"\n >\n <span className={cn('flex-1 min-w-0 inline-flex items-center', nakedCellRowModeAlign)}>\n {isEmpty\n ? <span className=\"text-fg-muted\">{EMPTY_DISPLAY}</span>\n : isMulti\n ? <MultiPersonDisplay value={value as PersonValue[]} size={size} measured />\n : <PersonDisplay value={value as PersonValue} size={size} />}\n </span>\n <ItemSuffix className=\"pointer-events-none\">\n <ChevronDown size={iconSize} className=\"shrink-0 text-fg-muted\" aria-hidden />\n </ItemSuffix>\n </div>\n )\n }\n\n // ── readonly / disabled — Field wrapper chrome,Avatar 視覺保留 ───────────\n if (resolvedMode !== 'edit') {\n return (\n <div\n ref={ref}\n className={cn(fieldWrapperStyles({ mode: resolvedMode, variant: resolvedVariant, size }), className)}\n data-field-mode={resolvedMode}\n aria-label={ariaLabel}\n {...rest}\n >\n <span className={cn('flex-1 min-w-0 inline-flex items-center', nakedCellRowModeAlign, resolvedMode === 'disabled' && 'text-fg-disabled')}>\n {isEmpty\n ? <span className=\"text-fg-muted\">{EMPTY_DISPLAY}</span>\n : isMulti\n ? <MultiPersonDisplay value={value as PersonValue[]} size={size} measured />\n : <PersonDisplay value={value as PersonValue} size={size} />}\n </span>\n </div>\n )\n }\n\n // ── edit mode ─────────────────────────────────────────────────────────────\n const selectedNames: string[] = !value\n ? []\n : Array.isArray(value)\n ? value.map(v => resolvePerson(v).name)\n : [resolvePerson(value).name]\n\n // ── single mode → wraps Select ────────────────────────────────────────────\n if (!isMulti) {\n const handleSingleChange = (name: string) => onChange?.([findPerson(people, name)])\n return (\n <Select\n ref={ref as React.Ref<HTMLDivElement>}\n size={size}\n variant={resolvedVariant}\n options={people.map(personToSelectOption)}\n value={selectedNames[0] ?? null}\n onChange={handleSingleChange}\n searchable\n placeholder={placeholder}\n // 2026-05-12 Stream C Issue 4 fix(codex Q3):傳 `placeholder` 給 Select trigger empty。\n // 不再傳 `emptyText`(search-empty semantic 跟 trigger-empty 分離,canonical SSOT)。\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n className={className}\n aria-label={ariaLabel}\n selectedItemRenderer={(opt) => <PersonDisplay value={findPerson(people, opt.value)} size={size} />}\n // **codex P2 forward**:Select extends `SelectHTMLAttributes<HTMLSelectElement>`,\n // event handler element 型別跟 PeoplePicker `HTMLAttributes<HTMLDivElement>` 不一致\n // (`onCopy` / `onChange` 等)。Runtime spread 等效 — DOM 收到 attrs 不挑剔。\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // any-allow: rest 含 `onChange: FormEventHandler` 跟 Select onChange signature 衝突 — DOM runtime spread 安全(per codex P2 forward)\n {...(rest as any)}\n />\n )\n }\n\n // ── multi 'pill' → wraps Combobox(對齊 GitHub Reviewers / Combobox idiom)────\n if (multiDisplay === 'pill') {\n const handleMultiChange = (next: string[]) => {\n onChange?.(next.map(name => findPerson(people, name)))\n }\n return (\n <Combobox\n ref={ref as React.Ref<HTMLDivElement>}\n size={size}\n variant={resolvedVariant}\n options={people.map(personToSelectOption)}\n value={selectedNames}\n onChange={handleMultiChange}\n searchable\n searchPlaceholder={searchPlaceholder}\n // 2026-05-12 Stream C Issue 4(codex Q3):placeholder = trigger empty hint('請選擇人員')\n // — semantic clean separation;emptyText 不再 silent 轉 trigger placeholder。\n // emptyPlaceholder backward-compat forward(Combobox line 509 `placeholder ?? emptyPlaceholder` fallback)\n // 1 cycle:future 移除 emptyPlaceholder forward,emptyText 改傳 SelectMenu noResultsText。\n placeholder={placeholder}\n emptyPlaceholder={emptyText}\n wrap={pillWrap}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n className={className}\n aria-label={ariaLabel}\n // codex P2 forward(see Select branch comment for type-cast rationale)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // any-allow: rest 含 `onChange: FormEventHandler` 跟 Combobox onChange signature 衝突 — DOM runtime spread 安全(per codex P2 forward)\n {...(rest as any)}\n // **Tag SSOT canonical**:用 `avatar` prop(不塞 children),Tag 內部統一\n // wrap 進 16×16 圓形 mask container(per Tag tsx line 175)。\n tagRenderer={(item, onRemove) => {\n const p = resolvePerson(findPerson(people, item.value))\n return (\n <Tag\n key={item.value}\n size={size}\n color=\"neutral\"\n // 2026-05-18 7B' fix(per user 拍板「執行」+ Codex Round 3 共識,paired with Combobox L286):\n // 拿掉 `unbounded` 對齊 Tag canonical max-w-40 cap + 內建 ellipsis。PeoplePicker pill 走\n // Combobox tagRenderer slot,SSOT = Tag primitive 視覺(per codex Round 3 verdict)。\n // 人名 99% < 25 chars 不觸發 cap;極端長名(複數姓 + middle name)觸發 ellipsis 是合理 UX。\n avatar={pillShowAvatar\n ? <Avatar src={p.avatarUrl} alt={p.name} size={16} hoverCard={buildPersonNameCard(p)} />\n : undefined}\n onDismiss={onRemove}\n >\n {p.name}\n </Tag>\n )\n }}\n />\n )\n }\n\n // ── multi 'stack' (default) → wraps Combobox 跟 pill mode 同 SSOT,差別在 tagRenderer 視覺。\n //\n // **2026-05-15 Bug 3 fix(Claude+Codex Step 5 比稿 consensus)**:visible count 走 shared\n // `avatar-stack-overflow` primitive deterministic formula(取代 Combobox DOM offsetWidth-based\n // useOverflowCount + 60px fallback 不 deterministic),pass override 給 Combobox bypass internal\n // measurement。`MultiPersonDisplay`(display path)同 primitive,display + edit 結果一致。\n // 對齊 user verbatim SSOT「同 cell width 同 overflow 判斷」+ codex Q3 consensus shared primitive。\n const handleMultiChange = (next: string[]) => {\n onChange?.(next.map(name => findPerson(people, name)))\n }\n // SSOT visible count compute via formula primitive + ResizeObserver\n const stackContainerRef = React.useRef<HTMLDivElement | null>(null)\n const [stackVisibleCount, setStackVisibleCount] = React.useState<number | undefined>(undefined)\n React.useLayoutEffect(() => {\n // 注:此 effect 只在 multi stack mode 跑(early return if not stack);length<=1 不需 override\n if (!isMulti || selectedNames.length <= 1) {\n setStackVisibleCount(undefined); return\n }\n const root = stackContainerRef.current\n if (!root) return\n // 2026-05-15 ROOT CAUSE FIX(user 抓「之前說的問題都還是存在」):\n // stackContainerRef 透過 mergedStackRef 接 Combobox forwarded ref → root **就是** [role=combobox]\n // div 自己。原 `root.querySelector('[role=combobox]')` 不找 self 永遠 null → trigger=null →\n // tagArea=null → available=0 → setStackVisibleCount(0) → 整 stack 全 overflow → fallback 到\n // Combobox DOM-based useOverflowCount(非 deterministic 那個算法)。修:用 root 自己當 trigger,\n // 從 root 內找 tagArea(flex-1 min-w-0 div)。\n const calc = () => {\n const trigger = root.matches('[role=\"combobox\"]') ? root : root.querySelector<HTMLElement>('[role=\"combobox\"]')\n const tagArea = trigger?.querySelector<HTMLElement>('div[class*=\"flex-1\"][class*=\"min-w-0\"]')\n const available = tagArea?.clientWidth ?? trigger?.clientWidth ?? 0\n const visible = getAvatarStackVisibleCount({\n availablePx: available,\n total: selectedNames.length,\n avatarPx: AVATAR_STACK_AVATAR_PX[size],\n overflowChipPx: AVATAR_STACK_OVERFLOW_CHIP_PX[size],\n })\n setStackVisibleCount(visible)\n }\n calc()\n const ro = new ResizeObserver(calc)\n ro.observe(root)\n return () => ro.disconnect()\n }, [isMulti, multiDisplay, selectedNames.length, size])\n // Merge ref:forward to parent + capture for ResizeObserver\n const mergedStackRef = React.useCallback((el: HTMLDivElement | null) => {\n stackContainerRef.current = el\n if (typeof ref === 'function') ref(el)\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = el\n }, [ref])\n\n return (\n <Combobox\n ref={mergedStackRef}\n size={size}\n variant={resolvedVariant}\n options={people.map(personToSelectOption)}\n value={selectedNames}\n onChange={handleMultiChange}\n searchable\n searchIn={searchIn}\n searchPlaceholder={searchPlaceholder}\n // 2026-05-12 Stream C Issue 4(codex Q3):placeholder = trigger empty('請選擇人員');emptyText = search-empty(僅 backward-compat forward 1 cycle)\n placeholder={placeholder}\n emptyPlaceholder={emptyText}\n wrap={false}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n // 2026-05-13 (a) fix(user 拍 Path a + Layer A density-drift root-cause):\n // 撤掉 `tagAreaPaddingLeftPx={8}` magic — Combobox `tagPadding[size]` 是 density-dependent\n // calc 公式(`(field-height - icon-size) / 2`),只在 md size + default density 才 = 4px;\n // 其他 size/density 漂 6px / 8px → 4+8=12 spec 公式不成立。\n // (a) fix:form context + 有 tag → 改 inject `!px-3`(固定 12px)直接 override `tagPadding[size]`,\n // 達成 GitHub PeoplePicker fixed 12px inset(對齊 cell context 同 13px from cell.left 含 1px border)。\n // - form + 有 tag → `!px-3`(12px 固定 inset)+ tagAreaPaddingLeftPx undefined → field.padL=12 ✓\n // - table-cell + 有 tag → naked variant `!px-[var(--table-cell-px)]` 已是 12px,不 inject ✓\n // - isEmpty → 不 inject,走 Combobox 預設文字 inset(`tagPadding[size]` 公式自然 vertical center)\n className={cn(className, !isEmpty && surface === 'form' && '!px-3')}\n aria-label={ariaLabel}\n // 2026-05-15 Bug 1 fix(Claude+Codex Step 5 比稿 consensus,user verbatim「就 A」):per-length 動態\n // wrapper class — length=1 降階單人視覺需要 width constraint chain(`flex-1 min-w-0 overflow-hidden`),\n // length>=2 stack 視覺保留 overlap(`-ml-0.5 first:ml-0 relative inline-flex group/avatar`)。對齊\n // spec.md §C row 1(length=1 = avatar+人名+ellipsis)+ §D row 1(length>=2 = stack overlap)。\n // 真根因:Combobox `OverflowTagList` 把所有 tagRenderer 結果包 `shrink-0`,加 `inline-flex` 後\n // wrapper 變 intrinsic content-width → PersonDisplay `w-full` resolves to intrinsic → truncate 無效。\n // 修法:length=1 wrapper 改 `flex-1 min-w-0 overflow-hidden` 提供 width constraint 給 PersonDisplay。\n // SSOT helper `getPeoplePickerTagWrapperClass(count)` 集中,future 改 wrapper 行為改一處。\n tagWrapperClassName={getPeoplePickerTagWrapperClass(selectedNames.length)}\n // 2026-05-16 真 root cause fix:overflow chip wrapper 套同 `-ml-0.5` 讓 chip 物理上\n // 跟 avatar 同 slot(等寬同 step,non-overlapping 多 24px 區塊不再 saw)。對齊 user\n // 「avatars 和 +N 都是同尺寸圓形,空間最多容固定數量圓形」物理模型 directive +\n // MUI AvatarGroup / Primer AvatarStack 共識(`AvatarGroup.js` L54-59 same negative margin)。\n overflowWrapperClassName=\"-ml-0.5 first:ml-0 relative inline-flex\"\n tagAreaGapPx={0}\n tagAreaPaddingLeftPx={undefined}\n // 2026-05-12 Round 7 fix(user 抓 image 2「+N tag 應該圓形不是矩形」+ 對齊 GitHub picker idiom):\n // Combobox default `overflowShape='tag'`(矩形 chip,文字 Combobox 慣例);PeoplePicker stack\n // mode pass `'circle'`(圓形 avatar-shape,跟 avatar 一樣大)。對齊 MultiPersonDisplay readonly path\n // 既有 OverflowIndicator default 'circle' SSOT。\n overflowShape=\"circle\"\n // 2026-05-15 Bug 3 fix:formula-based visible count override(避免 Combobox DOM measurement +\n // 60px fallback 不 deterministic)。SSOT in `./avatar-stack-overflow.ts`,display + edit 共用。\n visibleCountOverride={stackVisibleCount}\n // 2026-05-14 I4 fix(per codex+Layer A 共識):hidden items 在 `+N` overflow popover 顯\n // Tag with avatar(對齊 display MultiPersonDisplay popover SSOT,user 抓 display vs edit\n // overflow 視覺不一致)。\n renderHiddenTag={(item) => {\n const p = resolvePerson(findPerson(people, item.value))\n return (\n <Tag\n key={item.value}\n color=\"neutral\"\n size=\"sm\"\n avatar={\n <Avatar\n src={p.avatarUrl}\n alt={p.name}\n size={16}\n hoverCard={buildPersonNameCard(p)}\n />\n }\n onDismiss={() => {\n onChange?.(selectedNames.filter(n => n !== item.value).map(n => findPerson(people, n)))\n }}\n >\n {p.name}\n </Tag>\n )\n }}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // any-allow: rest 含 `onChange: FormEventHandler` 跟 Combobox onChange signature 衝突 — DOM runtime spread 安全(per codex P2 forward)\n {...(rest as any)}\n tagRenderer={(item, onRemove) => {\n const p = resolvePerson(findPerson(people, item.value))\n // 2026-05-12 Q2 fix(user 拍板「multi 只選 1 人時 trigger = avatar + name,跟 single mode 同」):\n // selectedNames.length === 1 → PersonDisplay(avatar + name)代替 PersonAvatarTag(avatar only)。\n // SSOT 對齊 PeoplePicker single mode line 201 selectedItemRenderer。多選 1 人時視覺等同單選,\n // 只在 length > 1 才走 stack(各 avatar 純 chip)。多選 + inline 搜尋場景拿掉 name 改 cursor\n // 是 future 工作(需 PeoplePicker 加 searchIn='trigger' opt-in,當前 wrapped Combobox 走 menu search)。\n if (selectedNames.length === 1) {\n return <PersonDisplay key={item.value} value={p} size={size} />\n }\n return (\n <PersonAvatarTag\n key={item.value}\n person={p}\n size={size}\n onRemove={onRemove}\n />\n )\n }}\n />\n )\n})\nPeoplePicker.displayName = 'PeoplePicker'\n\n// Story auto-compile metadata\nexport const peoplePickerMeta = {\n component: 'PeoplePicker',\n family: 4,\n variants: {},\n sizes: {},\n states: ['default', 'hover', 'active', 'focus-visible', 'disabled'],\n tokens: {\n bg: [],\n fg: ['text-fg-disabled', 'text-fg-muted'],\n ring: [],\n },\n} as const\n\nexport { PeoplePicker }\n"],"names":["PeoplePicker","handleMultiChange"],"mappings":"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"}
1
+ {"version":3,"file":"people-picker.js","sources":["../../../src/components/PeoplePicker/people-picker.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.\n// @placeholder-vocabulary-allow: 1-cycle backward-compat — `placeholder` 已加(trigger empty SSOT),`emptyPlaceholder={emptyText}` forward 仍保留讓既有 consumer 不被 silent break;Combobox line 760 `placeholder ?? emptyPlaceholder` fallback → placeholder 永遠 takes precedence。Future cycle 移除 emptyPlaceholder forward(per field-controls.spec.md 共享 contract b)。\n// @cell-metric-escape-allow: comment describes RETIRED `tagAreaPaddingLeftPx={8}` magic — current code is surface-guarded (`surface === 'form'` only injects `!px-[var(--field-px)]`; table-cell context untouched, lets naked `!px-[var(--table-cell-px)]` SSOT take over). Hook regex grep'd the comment word, not the live code path. Per (a) fix 2026-05-13 user-approved Path a.\nimport * as React from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport { cn } from '@/lib/utils'\nimport type { FieldMode, FieldVariant } from '@/design-system/components/Field/field-types'\nimport { fieldWrapperStyles, EMPTY_DISPLAY, nakedCellRowModeAlign } from '@/design-system/components/Field/field-wrapper'\nimport { ItemSuffix } from '@/design-system/patterns/element-anatomy/item-anatomy'\nimport { useFieldSurface, useResolvedFieldSize, useResolvedFieldDisabled, useResolvedFieldMode, useResolvedFieldVariant } from '@/design-system/components/Field/field-context'\nimport { Avatar } from '@/design-system/components/Avatar/avatar'\nimport { Tag } from '@/design-system/components/Tag/tag'\nimport { Select } from '@/design-system/components/Select/select'\nimport { Combobox } from '@/design-system/components/Combobox/combobox'\nimport { PersonDisplay, MultiPersonDisplay, PersonAvatarTag, buildPersonProfileCard, resolvePerson, type PersonValue } from './person-display'\nimport {\n getAvatarStackVisibleCount,\n AVATAR_STACK_AVATAR_PX,\n AVATAR_STACK_OVERFLOW_CHIP_PX,\n} from './avatar-stack-overflow'\n// Pure helpers extracted to sibling for file-size budget(2026-05-18,P1 ≤ 500 lines)。\n// 不消費 component closure 的純 constant / 純 mapping function 全部搬走,主檔保留 SSOT-bearing\n// render logic(消費 Combobox / Select / state 等 closure 的部分)。\n// SSOT primitive re-export(backward-compat 對外 import 路徑保持 `./people-picker`)。\nimport {\n PEOPLE_PICKER_LENGTH1_WRAPPER_CLASS,\n getPeoplePickerTagWrapperClass,\n personToSelectOption,\n findPerson,\n} from './people-picker-helpers'\nimport { ICON_SIZE } from '@/design-system/tokens/uiSize/icon-size'\nexport { PEOPLE_PICKER_LENGTH1_WRAPPER_CLASS, getPeoplePickerTagWrapperClass }\n\n// ── PeoplePicker ────────────────────────────────────────────────────────────\n// **2026-05-07 v15.6 SSOT 重構 v2**:\n//\n// - **single mode** wraps `<Select searchable selectedItemRenderer>`\n// - **multi mode** 兩種 displayMode(consumer 自選),**皆 wrap `<Combobox>`**(同 SSOT,\n// 差別在 tagRenderer 視覺):\n// - **'stack'**(default,baseline 既有視覺)— Avatar 疊合 + `+N` overflow indicator,\n// 不可 wrap。tagRenderer 渲染 avatar stack(visible count 走 shared `avatar-stack-overflow`\n// primitive deterministic formula,2026-05-15 Bug 3 fix;display 路徑 `<MultiPersonDisplay>` 同 primitive)。\n// 對齊 Notion / Linear / Atlassian / Slack 多人 quick-glance idiom。\n// - **'pill'**(opt-in)— 每人 Tag pill,可 wrap。Wrap `<Combobox tagRenderer>`,\n// tagRenderer 用 Tag 元件 `avatar` prop SSOT(不塞 children)。\n// `pillShowAvatar` 控 pill 內是否顯 avatar prefix(default true,false → 純文字 pill)。\n// 對齊 GitHub Reviewers / Combobox tag-input idiom。\n\n// **codex P2 fix(2026-05-07 v15.10)**:`extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'>`\n// 讓 consumer 可傳 `id` / `data-testid` / `onBlur` / `onFocus` / `aria-*` 等 HTML root props,\n// component 內部 `...rest` forward 到 trigger 容器(對齊 DS 既有 Combobox / Select 慣例)。\n// `onChange` 衝突走 Omit(本 component 用 PersonValue[] custom signature)。\nexport interface PeoplePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Field mode(edit / display / readonly / disabled),默認 inherit Field context 或 'edit' */\n mode?: FieldMode\n /** Field chrome variant(對齊 Select / Combobox)*/\n variant?: FieldVariant\n size?: 'sm' | 'md' | 'lg'\n /** 當前已選的人(單選 PersonValue,多選 PersonValue[])*/\n value?: PersonValue | PersonValue[] | null\n /** 值變更 callback(永遠 emit array — single mode 取 [0] 即 single value)*/\n onChange?: (value: PersonValue[]) => void\n /** 可選人員清單(edit mode 下拉顯示)*/\n people?: PersonValue[]\n /** 2026-05-12 Stream C Issue 4 fix(codex Q3 Cluster C):trigger empty placeholder。\n * Default '請選擇人員'。**禁** 將 `emptyText`(search-empty)當 trigger placeholder 傳。 */\n placeholder?: string\n /** 搜尋框 placeholder */\n searchPlaceholder?: string\n /** 搜尋無結果訊息(filtered menu empty)。**僅**用於 SelectMenu noResultsText,\n * 不再 silent 轉 trigger placeholder(2026-05-12 Issue 4 semantic fix)。 */\n emptyText?: string\n className?: string\n disabled?: boolean\n /** Initial open state(uncontrolled)*/\n defaultOpen?: boolean\n /** open state 變更 callback */\n onOpenChange?: (open: boolean) => void\n /**\n * Multi mode 顯示樣式(default 'stack')。Single mode 此 prop 忽略。\n * - 'stack' — Avatar 疊合 + `+N`(空間省、不可 wrap;default)\n * - 'pill' — 每人 Tag pill(可 wrap)\n */\n multiDisplay?: 'stack' | 'pill'\n /**\n * `multiDisplay='pill'` 模式下是否顯示 avatar prefix(default true)。\n * 設 false → 純文字 pill,進一步節省空間。對齊 Tag 元件 `avatar` prop SSOT。\n */\n pillShowAvatar?: boolean\n /** Pill 模式下是否允許 wrap(default true)— 對齊 Combobox `wrap` prop */\n pillWrap?: boolean\n /**\n * 搜尋型態(2026-05-12 規則 3 ship,3-mode SSOT 對齊 A1-A5 spec):\n * - `'menu'`(default,backward-compat)— 浮層內搜尋(panel-top search)\n * - `'trigger'`(multi 模式 opt-in)— inline 搜尋(浮層開時 name 拿掉,avatar 後接 input cursor,\n * 類 Combobox inline-trigger idiom)\n * Single mode 永遠 inline-trigger(wrap Select searchable 直接走 inline),此 prop multi 才有意義。\n */\n searchIn?: 'menu' | 'trigger'\n /**\n * Display 是否渲 ChevronDown + Field naked wrapper(D-path opt-in,2026-05-08)\n * — DataTable cell display↔edit 像素級對齊用。預設 false(裸 PersonDisplay,backward compat)。\n * 設 true 時 display 走 fieldWrapperStyles(naked variant)+ ItemSuffix ChevronDown,\n * 與 edit (Select / Combobox wrapped) 同 DOM 結構,消除 Layer-B padding mismatch。\n */\n showDisplayEndIcon?: boolean\n /** a11y label */\n 'aria-label'?: string\n}\n\nconst PeoplePicker = React.forwardRef<HTMLDivElement, PeoplePickerProps>(function PeoplePicker({\n mode: modeProp,\n variant: variantProp,\n size: sizeProp,\n value,\n onChange,\n people = [],\n placeholder = '請選擇人員', // i18n-allow: DS default(2026-05-12 Stream C Issue 4)\n searchPlaceholder = '搜尋人員…', // i18n-allow: DS default\n emptyText = '沒有符合的人員', // i18n-allow: DS default — only for SelectMenu noResultsText\n className,\n disabled: disabledProp,\n defaultOpen = false,\n onOpenChange,\n multiDisplay = 'stack',\n pillShowAvatar = true,\n pillWrap = true,\n searchIn = 'menu',\n showDisplayEndIcon = false,\n 'aria-label': ariaLabel,\n ...rest\n}, ref) {\n const surface = useFieldSurface()\n const size = useResolvedFieldSize(sizeProp) // B 組 cascade fix\n const disabled = useResolvedFieldDisabled(disabledProp)\n // 2026-06-08 SSOT:mode/disabled/variant 統一經 helper;修 <Field disabled> 漏 cascade(原只讀 fieldCtx.mode)\n const resolvedMode: FieldMode = useResolvedFieldMode({ mode: modeProp, disabled })\n const resolvedVariant: FieldVariant = useResolvedFieldVariant(variantProp)\n const isMulti = Array.isArray(value)\n const isEmpty = !value || (isMulti && value.length === 0)\n\n // ── mode='display' ────────────────────────────────────────────────────────\n // Default(showDisplayEndIcon=false):裸 PersonDisplay / MultiPersonDisplay — backward compat。\n // Opt-in(showDisplayEndIcon=true,2026-05-08 D-path):Field naked wrapper + ItemSuffix ChevronDown,\n // 與 edit (Select / Combobox wrapped) 同 DOM 結構消除 cell display↔edit 像素偏移。\n if (resolvedMode === 'display') {\n if (!showDisplayEndIcon) {\n if (isEmpty) return <span className=\"text-fg-muted\">{EMPTY_DISPLAY}</span>\n return isMulti\n ? <MultiPersonDisplay value={value as PersonValue[]} size={size} measured />\n : <PersonDisplay value={value as PersonValue} size={size} />\n }\n // 2026-05-18 改 import ICON_SIZE SSOT(per user『做完』approval,消除 M17 違反 7+ 重複 ternary)\n const iconSize = ICON_SIZE[size as 'sm' | 'md' | 'lg']\n return (\n <div\n className={cn(fieldWrapperStyles({ mode: 'display', variant: resolvedVariant, size }), className)}\n data-field-mode=\"display\"\n >\n <span className={cn('flex-1 min-w-0 inline-flex items-center', nakedCellRowModeAlign)}>\n {isEmpty\n ? <span className=\"text-fg-muted\">{EMPTY_DISPLAY}</span>\n : isMulti\n ? <MultiPersonDisplay value={value as PersonValue[]} size={size} measured />\n : <PersonDisplay value={value as PersonValue} size={size} />}\n </span>\n <ItemSuffix className=\"pointer-events-none\">\n <ChevronDown size={iconSize} className=\"shrink-0 text-fg-muted\" aria-hidden />\n </ItemSuffix>\n </div>\n )\n }\n\n // ── readonly / disabled — Field wrapper chrome,Avatar 視覺保留 ───────────\n if (resolvedMode !== 'edit') {\n return (\n <div\n ref={ref}\n className={cn(fieldWrapperStyles({ mode: resolvedMode, variant: resolvedVariant, size }), className)}\n data-field-mode={resolvedMode}\n aria-disabled={resolvedMode === 'disabled' ? true : undefined}\n aria-label={ariaLabel}\n {...rest}\n >\n <span className={cn('flex-1 min-w-0 inline-flex items-center', nakedCellRowModeAlign, resolvedMode === 'disabled' && 'text-fg-disabled')}>\n {isEmpty\n ? <span className=\"text-fg-muted\">{EMPTY_DISPLAY}</span>\n : isMulti\n ? <MultiPersonDisplay value={value as PersonValue[]} size={size} measured />\n : <PersonDisplay value={value as PersonValue} size={size} />}\n </span>\n {/* 2026-06-26 類型身份 indicator:edit 顯示 / readonly 不顯示 / disabled 保留(fg-disabled,對齊原生 <select disabled>);naked cell 依 showDisplayEndIcon */}\n {(resolvedVariant === 'naked' ? showDisplayEndIcon : resolvedMode === 'disabled') && (\n <ItemSuffix className=\"pointer-events-none\">\n <ChevronDown size={ICON_SIZE[size as 'sm' | 'md' | 'lg']} className={cn('shrink-0', resolvedMode === 'disabled' ? 'text-fg-disabled' : 'text-fg-muted')} aria-hidden />\n </ItemSuffix>\n )}\n </div>\n )\n }\n\n // ── edit mode ─────────────────────────────────────────────────────────────\n const selectedNames: string[] = !value\n ? []\n : Array.isArray(value)\n ? value.map(v => resolvePerson(v).name)\n : [resolvePerson(value).name]\n\n // ── single mode → wraps Select ────────────────────────────────────────────\n if (!isMulti) {\n const handleSingleChange = (name: string) => onChange?.([findPerson(people, name)])\n return (\n <Select\n ref={ref as React.Ref<HTMLDivElement>}\n size={size}\n variant={resolvedVariant}\n options={people.map(personToSelectOption)}\n value={selectedNames[0] ?? null}\n onChange={handleSingleChange}\n searchable\n placeholder={placeholder}\n // 2026-05-12 Stream C Issue 4 fix(codex Q3):傳 `placeholder` 給 Select trigger empty。\n // 不再傳 `emptyText`(search-empty semantic 跟 trigger-empty 分離,canonical SSOT)。\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n className={className}\n aria-label={ariaLabel}\n selectedItemRenderer={(opt) => <PersonDisplay value={findPerson(people, opt.value)} size={size} />}\n // **codex P2 forward**:Select extends `SelectHTMLAttributes<HTMLSelectElement>`,\n // event handler element 型別跟 PeoplePicker `HTMLAttributes<HTMLDivElement>` 不一致\n // (`onCopy` / `onChange` 等)。Runtime spread 等效 — DOM 收到 attrs 不挑剔。\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // any-allow: rest 含 `onChange: FormEventHandler` 跟 Select onChange signature 衝突 — DOM runtime spread 安全(per codex P2 forward)\n {...(rest as any)}\n />\n )\n }\n\n // ── multi 'pill' → wraps Combobox(對齊 GitHub Reviewers / Combobox idiom)────\n if (multiDisplay === 'pill') {\n const handleMultiChange = (next: string[]) => {\n onChange?.(next.map(name => findPerson(people, name)))\n }\n return (\n <Combobox\n ref={ref as React.Ref<HTMLDivElement>}\n size={size}\n variant={resolvedVariant}\n options={people.map(personToSelectOption)}\n value={selectedNames}\n onChange={handleMultiChange}\n searchable\n searchPlaceholder={searchPlaceholder}\n // 2026-05-12 Stream C Issue 4(codex Q3):placeholder = trigger empty hint('請選擇人員')\n // — semantic clean separation;emptyText 不再 silent 轉 trigger placeholder。\n // emptyPlaceholder backward-compat forward(Combobox line 760 `placeholder ?? emptyPlaceholder` fallback)\n // 1 cycle:future 移除 emptyPlaceholder forward,emptyText 改傳 SelectMenu noResultsText。\n placeholder={placeholder}\n emptyPlaceholder={emptyText}\n wrap={pillWrap}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n className={className}\n aria-label={ariaLabel}\n // codex P2 forward(see Select branch comment for type-cast rationale)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // any-allow: rest 含 `onChange: FormEventHandler` 跟 Combobox onChange signature 衝突 — DOM runtime spread 安全(per codex P2 forward)\n {...(rest as any)}\n // **Tag SSOT canonical**:用 `avatar` prop(不塞 children),Tag 內部統一\n // wrap 進 16×16 圓形 mask container(per Tag tsx line 175)。\n tagRenderer={(item, onRemove) => {\n const p = resolvePerson(findPerson(people, item.value))\n return (\n <Tag\n key={item.value}\n size={size}\n color=\"neutral\"\n // 2026-05-18 7B' fix(per user 拍板「執行」+ Codex Round 3 共識,paired with Combobox L286):\n // 拿掉 `unbounded` 對齊 Tag canonical max-w-40 cap + 內建 ellipsis。PeoplePicker pill 走\n // Combobox tagRenderer slot,SSOT = Tag primitive 視覺(per codex Round 3 verdict)。\n // 人名 99% < 25 chars 不觸發 cap;極端長名(複數姓 + middle name)觸發 ellipsis 是合理 UX。\n avatar={pillShowAvatar\n ? <Avatar src={p.avatarUrl} alt={p.name} size={16} hoverCard={buildPersonProfileCard(p)} />\n : undefined}\n onRemove={onRemove}\n >\n {p.name}\n </Tag>\n )\n }}\n />\n )\n }\n\n // ── multi 'stack' (default) → wraps Combobox 跟 pill mode 同 SSOT,差別在 tagRenderer 視覺。\n //\n // **2026-05-15 Bug 3 fix(Claude+Codex Step 5 比稿 consensus)**:visible count 走 shared\n // `avatar-stack-overflow` primitive deterministic formula(取代 Combobox DOM offsetWidth-based\n // useOverflowCount + 60px fallback 不 deterministic),pass override 給 Combobox bypass internal\n // measurement。`MultiPersonDisplay`(display path)同 primitive,display + edit 結果一致。\n // 對齊 user verbatim SSOT「同 cell width 同 overflow 判斷」+ codex Q3 consensus shared primitive。\n const handleMultiChange = (next: string[]) => {\n onChange?.(next.map(name => findPerson(people, name)))\n }\n // SSOT visible count compute via formula primitive + ResizeObserver\n const stackContainerRef = React.useRef<HTMLDivElement | null>(null)\n const [stackVisibleCount, setStackVisibleCount] = React.useState<number | undefined>(undefined)\n React.useLayoutEffect(() => {\n // 注:此 effect 只在 multi stack mode 跑(early return if not stack);length<=1 不需 override\n if (!isMulti || selectedNames.length <= 1) {\n setStackVisibleCount(undefined); return\n }\n const root = stackContainerRef.current\n if (!root) return\n // 2026-05-15 ROOT CAUSE FIX(user 抓「之前說的問題都還是存在」):\n // stackContainerRef 透過 mergedStackRef 接 Combobox forwarded ref → root **就是** [role=combobox]\n // div 自己。原 `root.querySelector('[role=combobox]')` 不找 self 永遠 null → trigger=null →\n // tagArea=null → available=0 → setStackVisibleCount(0) → 整 stack 全 overflow → fallback 到\n // Combobox DOM-based useOverflowCount(非 deterministic 那個算法)。修:用 root 自己當 trigger,\n // 從 root 內找 tagArea(flex-1 min-w-0 div)。\n const calc = () => {\n const trigger = root.matches('[role=\"combobox\"]') ? root : root.querySelector<HTMLElement>('[role=\"combobox\"]')\n const tagArea = trigger?.querySelector<HTMLElement>('div[class*=\"flex-1\"][class*=\"min-w-0\"]')\n const available = tagArea?.clientWidth ?? trigger?.clientWidth ?? 0\n const visible = getAvatarStackVisibleCount({\n availablePx: available,\n total: selectedNames.length,\n avatarPx: AVATAR_STACK_AVATAR_PX[size],\n overflowChipPx: AVATAR_STACK_OVERFLOW_CHIP_PX[size],\n })\n setStackVisibleCount(visible)\n }\n calc()\n const ro = new ResizeObserver(calc)\n ro.observe(root)\n return () => ro.disconnect()\n }, [isMulti, multiDisplay, selectedNames.length, size])\n // Merge ref:forward to parent + capture for ResizeObserver\n const mergedStackRef = React.useCallback((el: HTMLDivElement | null) => {\n stackContainerRef.current = el\n if (typeof ref === 'function') ref(el)\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = el\n }, [ref])\n\n return (\n <Combobox\n ref={mergedStackRef}\n size={size}\n variant={resolvedVariant}\n options={people.map(personToSelectOption)}\n value={selectedNames}\n onChange={handleMultiChange}\n searchable\n searchIn={searchIn}\n searchPlaceholder={searchPlaceholder}\n // 2026-05-12 Stream C Issue 4(codex Q3):placeholder = trigger empty('請選擇人員');emptyText = search-empty(僅 backward-compat forward 1 cycle)\n placeholder={placeholder}\n emptyPlaceholder={emptyText}\n wrap={false}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n // 2026-05-13 (a) fix(user 拍 Path a + Layer A density-drift root-cause):\n // 撤掉 `tagAreaPaddingLeftPx={8}` magic — Combobox `tagPadding[size]` 是 density-dependent\n // calc 公式(`(field-height - icon-size) / 2`),只在 md size + default density 才 = 4px;\n // 其他 size/density 漂 6px / 8px → 4+8=12 spec 公式不成立。\n // (a) fix:form context + 有 tag → 改 inject `!px-[var(--field-px)]`(固定 12px)直接 override `tagPadding[size]`,\n // 達成 GitHub PeoplePicker fixed 12px inset(對齊 cell context 同 13px from cell.left 含 1px border)。\n // - form + 有 tag → `!px-[var(--field-px)]`(12px 固定 inset)+ tagAreaPaddingLeftPx undefined → field.padL=12 ✓\n // - table-cell + 有 tag → naked variant `!px-[var(--table-cell-px)]` 已是 12px,不 inject ✓\n // - isEmpty → 不 inject,走 Combobox 預設文字 inset(`tagPadding[size]` 公式自然 vertical center)\n className={cn(className, !isEmpty && surface === 'form' && '!px-[var(--field-px)]')}\n aria-label={ariaLabel}\n // 2026-05-15 Bug 1 fix(Claude+Codex Step 5 比稿 consensus,user verbatim「就 A」):per-length 動態\n // wrapper class — length=1 降階單人視覺需要 width constraint chain(`flex-1 min-w-0 overflow-hidden`),\n // length>=2 stack 視覺保留 overlap(`-ml-0.5 first:ml-0 relative inline-flex group/avatar`)。對齊\n // spec.md §C row 1(length=1 = avatar+人名+ellipsis)+ §D row 1(length>=2 = stack overlap)。\n // 真根因:Combobox `OverflowTagList` 把所有 tagRenderer 結果包 `shrink-0`,加 `inline-flex` 後\n // wrapper 變 intrinsic content-width → PersonDisplay `w-full` resolves to intrinsic → truncate 無效。\n // 修法:length=1 wrapper 改 `flex-1 min-w-0 overflow-hidden` 提供 width constraint 給 PersonDisplay。\n // SSOT helper `getPeoplePickerTagWrapperClass(count)` 集中,future 改 wrapper 行為改一處。\n tagWrapperClassName={getPeoplePickerTagWrapperClass(selectedNames.length)}\n // 2026-05-16 真 root cause fix:overflow chip wrapper 套同 `-ml-0.5` 讓 chip 物理上\n // 跟 avatar 同 slot(等寬同 step,non-overlapping 多 24px 區塊不再 saw)。對齊 user\n // 「avatars 和 +N 都是同尺寸圓形,空間最多容固定數量圓形」物理模型 directive +\n // MUI AvatarGroup / Primer AvatarStack 共識(`AvatarGroup.js` L54-59 same negative margin)。\n overflowWrapperClassName=\"-ml-0.5 first:ml-0 relative inline-flex\"\n tagAreaGapPx={0}\n tagAreaPaddingLeftPx={undefined}\n // 2026-05-12 Round 7 fix(user 抓 image 2「+N tag 應該圓形不是矩形」+ 對齊 GitHub picker idiom):\n // Combobox default `overflowShape='tag'`(矩形 chip,文字 Combobox 慣例);PeoplePicker stack\n // mode pass `'circle'`(圓形 avatar-shape,跟 avatar 一樣大)。對齊 MultiPersonDisplay readonly path\n // 既有 OverflowIndicator default 'circle' SSOT。\n overflowShape=\"circle\"\n // 2026-05-15 Bug 3 fix:formula-based visible count override(避免 Combobox DOM measurement +\n // 60px fallback 不 deterministic)。SSOT in `./avatar-stack-overflow.ts`,display + edit 共用。\n visibleCountOverride={stackVisibleCount}\n // 2026-05-14 I4 fix(per codex+Layer A 共識):hidden items 在 `+N` overflow popover 顯\n // Tag with avatar(對齊 display MultiPersonDisplay popover SSOT,user 抓 display vs edit\n // overflow 視覺不一致)。\n renderHiddenTag={(item) => {\n const p = resolvePerson(findPerson(people, item.value))\n return (\n <Tag\n key={item.value}\n color=\"neutral\"\n size=\"sm\"\n avatar={\n <Avatar\n src={p.avatarUrl}\n alt={p.name}\n size={16}\n hoverCard={buildPersonProfileCard(p)}\n />\n }\n onRemove={() => {\n onChange?.(selectedNames.filter(n => n !== item.value).map(n => findPerson(people, n)))\n }}\n >\n {p.name}\n </Tag>\n )\n }}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // any-allow: rest 含 `onChange: FormEventHandler` 跟 Combobox onChange signature 衝突 — DOM runtime spread 安全(per codex P2 forward)\n {...(rest as any)}\n tagRenderer={(item, onRemove) => {\n const p = resolvePerson(findPerson(people, item.value))\n // 2026-05-12 Q2 fix(user 拍板「multi 只選 1 人時 trigger = avatar + name,跟 single mode 同」):\n // selectedNames.length === 1 → PersonDisplay(avatar + name)代替 PersonAvatarTag(avatar only)。\n // SSOT 對齊 PeoplePicker single mode line 201 selectedItemRenderer。多選 1 人時視覺等同單選,\n // 只在 length > 1 才走 stack(各 avatar 純 chip)。多選 + inline 搜尋場景拿掉 name 改 cursor\n // 走 `searchIn='trigger'` opt-in(2026-05-12 規則 3 ship,已轉傳 Combobox;default 'menu' 走 panel-top search)。\n if (selectedNames.length === 1) {\n return <PersonDisplay key={item.value} value={p} size={size} />\n }\n return (\n <PersonAvatarTag\n key={item.value}\n person={p}\n size={size}\n onRemove={onRemove}\n />\n )\n }}\n />\n )\n})\nPeoplePicker.displayName = 'PeoplePicker'\n\n// Story auto-compile metadata\nexport const peoplePickerMeta = {\n component: 'PeoplePicker',\n family: 4,\n variants: {},\n sizes: {},\n states: ['default', 'hover', 'active', 'focus-visible', 'disabled'],\n tokens: {\n bg: [],\n fg: ['text-fg-disabled', 'text-fg-muted'],\n ring: [],\n },\n} as const\n\nexport { PeoplePicker }\n"],"names":["PeoplePicker","handleMultiChange"],"mappings":"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"}
@@ -2,17 +2,17 @@ import * as React from 'react';
2
2
  export interface PersonData {
3
3
  name: string;
4
4
  avatarUrl?: string;
5
- /** 角色 / 部門 / ID 等 meta 單行(NameCard subtitle) */
5
+ /** 角色 / 部門 / ID 等 meta 單行(ProfileCard subtitle) */
6
6
  description?: string;
7
7
  /** Presence 狀態(對齊 Avatar presence canonical)。**2026-05-14 v12 update**(per user 拍板):
8
8
  * production 每 user 一定有 presence state,**undefined = loading transient(資料還沒讀到)**,
9
- * 不是「user 沒設定」。NameCard 在 undefined 期間隱藏整 status block,**禁** render「Status not set」
9
+ * 不是「user 沒設定」。ProfileCard 在 undefined 期間隱藏整 status block,**禁** render「Status not set」
10
10
  * placeholder 文字。 */
11
11
  status?: 'online' | 'away' | 'busy' | 'offline';
12
- /** Status 訊息(NameCard status section)。只在 status defined 時 render,缺則顯 `—` placeholder。
12
+ /** Status 訊息(ProfileCard status section)。只在 status defined 時 render,缺則顯 `—` placeholder。
13
13
  * Status undefined 整 block skip(無 statusMessage 也跟著 skip)。 */
14
14
  statusMessage?: React.ReactNode;
15
- /** **2026-05-07 v15.7 user directive**:NameCard default 只 render `id` + `employeeNumber`,
15
+ /** **2026-05-07 v15.7 user directive**:ProfileCard default 只 render `id` + `employeeNumber`,
16
16
  * 其他 description 一律 opt-in by consumer 透過 `fields` array prop。對齊
17
17
  * `NAMECARD_DEFAULT_FIELD_KEYS = ['id', 'employeeNumber']`。 */
18
18
  id?: string;
@@ -23,12 +23,12 @@ export interface PersonData {
23
23
  label: string;
24
24
  value: string;
25
25
  }[];
26
- /** 跳至完整 profile 頁的 handler(hover NameCard 必含,不傳時 fallback noop placeholder) */
26
+ /** 跳至完整 profile 頁的 handler(hover ProfileCard 必含,不傳時 fallback noop placeholder) */
27
27
  onViewProfile?: () => void;
28
28
  }
29
29
  export type PersonValue = string | PersonData;
30
30
  declare function resolvePerson(value: PersonValue): PersonData;
31
- declare function buildPersonNameCard(person: PersonData): React.ReactNode;
31
+ declare function buildPersonProfileCard(person: PersonData): React.ReactNode;
32
32
  declare function PersonDisplay({ value, size }: {
33
33
  value?: PersonValue | null;
34
34
  size?: 'sm' | 'md' | 'lg';
@@ -62,5 +62,5 @@ declare function PersonAvatarTag({ person, size, onRemove, }: {
62
62
  declare namespace PersonAvatarTag {
63
63
  var displayName: string;
64
64
  }
65
- export { PersonDisplay, MultiPersonDisplay, PersonAvatarTag, buildPersonNameCard, resolvePerson };
65
+ export { PersonDisplay, MultiPersonDisplay, PersonAvatarTag, buildPersonProfileCard, resolvePerson };
66
66
  //# sourceMappingURL=person-display.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"person-display.d.ts","sourceRoot":"","sources":["../../../src/components/PeoplePicker/person-display.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAqB9B,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;0BAGsB;IACtB,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAC/C;mEAC+D;IAC/D,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC/B;;oEAEgE;IAChE,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;6DACyD;IACzD,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC3C,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;CAC3B;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,CAAA;AAE7C,iBAAS,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,CAErD;AASD,iBAAS,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,KAAK,CAAC,SAAS,CAoBhE;AAwDD,iBAAS,aAAa,CAAC,EAAE,KAAK,EAAE,IAAW,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;CAAE,2CAgBvG;kBAhBQ,aAAa;;;AAwBtB,iBAAS,kBAAkB,CAAC,EAC1B,KAAK,EACL,IAAW,EACX,GAAG,EACH,QAAgB,EAChB,QAAQ,GACT,EAAE;IACD,KAAK,CAAC,EAAE,WAAW,EAAE,GAAG,IAAI,CAAA;IAC5B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;IACzB,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAA;CACzC,2CA+FA;kBAnHQ,kBAAkB;;;AAqL3B,iBAAS,eAAe,CAAC,EACvB,MAAM,EAAE,IAAW,EAAE,QAAQ,GAC9B,EAAE;IACD,MAAM,EAAE,UAAU,CAAA;IAClB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB,2CAOA;kBAbQ,eAAe;;;AAgBxB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,eAAe,EAAE,mBAAmB,EAAE,aAAa,EAAE,CAAA"}
1
+ {"version":3,"file":"person-display.d.ts","sourceRoot":"","sources":["../../../src/components/PeoplePicker/person-display.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAqB9B,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;0BAGsB;IACtB,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAC/C;mEAC+D;IAC/D,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC/B;;oEAEgE;IAChE,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;6DACyD;IACzD,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC3C,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;CAC3B;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,CAAA;AAE7C,iBAAS,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,CAErD;AASD,iBAAS,sBAAsB,CAAC,MAAM,EAAE,UAAU,GAAG,KAAK,CAAC,SAAS,CAoBnE;AAwDD,iBAAS,aAAa,CAAC,EAAE,KAAK,EAAE,IAAW,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;CAAE,2CAgBvG;kBAhBQ,aAAa;;;AAwBtB,iBAAS,kBAAkB,CAAC,EAC1B,KAAK,EACL,IAAW,EACX,GAAG,EACH,QAAgB,EAChB,QAAQ,GACT,EAAE;IACD,KAAK,CAAC,EAAE,WAAW,EAAE,GAAG,IAAI,CAAA;IAC5B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;IACzB,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAA;CACzC,2CA+FA;kBAnHQ,kBAAkB;;;AAsL3B,iBAAS,eAAe,CAAC,EACvB,MAAM,EAAE,IAAW,EAAE,QAAQ,GAC9B,EAAE;IACD,MAAM,EAAE,UAAU,CAAA;IAClB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB,2CAOA;kBAbQ,eAAe;;;AAgBxB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,eAAe,EAAE,sBAAsB,EAAE,aAAa,EAAE,CAAA"}
@@ -5,16 +5,16 @@ import { EMPTY_DISPLAY } from "../Field/field-wrapper.js";
5
5
  import { Tag } from "../Tag/tag.js";
6
6
  import { OverflowIndicator } from "../OverflowIndicator/overflow-indicator.js";
7
7
  import { Avatar } from "../Avatar/avatar.js";
8
- import { NameCard, NameCardDefaultActions } from "../NameCard/name-card.js";
8
+ import { ProfileCard, ProfileCardDefaultActions } from "../ProfileCard/profile-card.js";
9
9
  import { useTableIsScrolling } from "../Field/field-context.js";
10
10
  import { ItemPrefix } from "../../patterns/element-anatomy/item-anatomy.js";
11
11
  import { getAvatarStackVisibleCount, AVATAR_STACK_AVATAR_PX, AVATAR_STACK_OVERFLOW_CHIP_PX } from "./avatar-stack-overflow.js";
12
12
  function resolvePerson(value) {
13
13
  return typeof value === "string" ? { name: value } : value;
14
14
  }
15
- function buildPersonNameCard(person) {
15
+ function buildPersonProfileCard(person) {
16
16
  return /* @__PURE__ */ jsx(
17
- NameCard,
17
+ ProfileCard,
18
18
  {
19
19
  name: person.name,
20
20
  subtitle: person.description,
@@ -26,7 +26,7 @@ function buildPersonNameCard(person) {
26
26
  employeeNumber: person.employeeNumber
27
27
  },
28
28
  fields: person.fields,
29
- actions: /* @__PURE__ */ jsx(NameCardDefaultActions, {}),
29
+ actions: /* @__PURE__ */ jsx(ProfileCardDefaultActions, {}),
30
30
  onViewMore: person.onViewProfile ?? (() => {
31
31
  })
32
32
  }
@@ -41,7 +41,7 @@ function PersonAvatar({
41
41
  }) {
42
42
  const isTableScrolling = useTableIsScrolling();
43
43
  const nameCard = React.useMemo(
44
- () => isTableScrolling ? void 0 : buildPersonNameCard(person),
44
+ () => isTableScrolling ? void 0 : buildPersonProfileCard(person),
45
45
  [person, isTableScrolling]
46
46
  );
47
47
  return /* @__PURE__ */ jsx(
@@ -133,10 +133,10 @@ function MultiPersonDisplay({
133
133
  src: person.avatarUrl,
134
134
  alt: person.name,
135
135
  size: 16,
136
- hoverCard: buildPersonNameCard(person)
136
+ hoverCard: buildPersonProfileCard(person)
137
137
  }
138
138
  ),
139
- onDismiss: onRemove ? () => onRemove(value[resolvedMax + i]) : void 0,
139
+ onRemove: onRemove ? () => onRemove(value[resolvedMax + i]) : void 0,
140
140
  children: person.name
141
141
  },
142
142
  person.name + i
@@ -178,7 +178,7 @@ function AvatarDismissOverlay({ onRemove, label }) {
178
178
  "transition-opacity duration-150",
179
179
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
180
180
  ].join(" "),
181
- children: /* @__PURE__ */ jsx(X, { size: 12, strokeWidth: 3.5, "aria-hidden": true })
181
+ children: /* @__PURE__ */ jsx(X, { size: 12, strokeWidth: 3, "aria-hidden": true })
182
182
  }
183
183
  );
184
184
  }
@@ -197,7 +197,7 @@ export {
197
197
  MultiPersonDisplay,
198
198
  PersonAvatarTag,
199
199
  PersonDisplay,
200
- buildPersonNameCard,
200
+ buildPersonProfileCard,
201
201
  resolvePerson
202
202
  };
203
203
  //# sourceMappingURL=person-display.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"person-display.js","sources":["../../../src/components/PeoplePicker/person-display.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 { X } from 'lucide-react'\nimport { EMPTY_DISPLAY } from '@/design-system/components/Field/field-wrapper'\nimport { Tag } from '@/design-system/components/Tag/tag'\nimport { OverflowIndicator } from '@/design-system/components/OverflowIndicator/overflow-indicator'\nimport { Avatar } from '@/design-system/components/Avatar/avatar'\nimport { NameCard, NameCardDefaultActions } from '@/design-system/components/NameCard/name-card'\nimport { useTableIsScrolling } from '@/design-system/components/Field/field-context'\nimport { ItemPrefix } from '@/design-system/patterns/element-anatomy/item-anatomy'\nimport {\n getAvatarStackVisibleCount,\n AVATAR_STACK_AVATAR_PX,\n AVATAR_STACK_OVERFLOW_CHIP_PX,\n} from './avatar-stack-overflow'\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\n// PersonData 承載 NameCard 所需的完整資訊。DS 全域 person avatar 的 hoverCard NameCard 永遠\n// 顯示同一組 sections(name + subtitle + status + 4 default fields + 自訂 fields + actions + View more)\n// — 缺資料顯 placeholder,不會 collapse。對齊 avatar.spec.md「person avatar hover → NameCard」\n// DS-wide canonical(2026-05-06 v11 always-render schema 升級)。\nexport interface PersonData {\n name: string\n avatarUrl?: string\n /** 角色 / 部門 / ID 等 meta 單行(NameCard subtitle) */\n description?: string\n /** Presence 狀態(對齊 Avatar presence canonical)。**2026-05-14 v12 update**(per user 拍板):\n * production 每 user 一定有 presence state,**undefined = loading transient(資料還沒讀到)**,\n * 不是「user 沒設定」。NameCard 在 undefined 期間隱藏整 status block,**禁** render「Status not set」\n * placeholder 文字。 */\n status?: 'online' | 'away' | 'busy' | 'offline'\n /** Status 訊息(NameCard status section)。只在 status defined 時 render,缺則顯 `—` placeholder。\n * Status undefined 整 block skip(無 statusMessage 也跟著 skip)。 */\n statusMessage?: React.ReactNode\n /** **2026-05-07 v15.7 user directive**:NameCard default 只 render `id` + `employeeNumber`,\n * 其他 description 一律 opt-in by consumer 透過 `fields` array prop。對齊\n * `NAMECARD_DEFAULT_FIELD_KEYS = ['id', 'employeeNumber']`。 */\n id?: string\n employeeNumber?: string\n /** 自訂額外 fields(在 default fields 之後 append)。Email / Phone / Department / Location\n * / 任何其他 description 一律走這個 prop(opt-in,consumer 自選)。 */\n fields?: { label: string; value: string }[]\n /** 跳至完整 profile 頁的 handler(hover NameCard 必含,不傳時 fallback noop placeholder) */\n onViewProfile?: () => void\n}\n\nexport type PersonValue = string | PersonData\n\nfunction resolvePerson(value: PersonValue): PersonData {\n return typeof value === 'string' ? { name: value } : value\n}\n\n// buildPersonNameCard — DS 全域 person avatar hoverCard 的 canonical NameCard JSX 建構器。\n// SSOT for「avatar hover NameCard 一致視覺」— 任何 person avatar consumer 都走這個 helper,\n// 不可繞道直接 build NameCard。\n//\n// **2026-05-07 v15.7 user directive**:default field values 只 `id` + `employeeNumber`,\n// 對齊 NAMECARD_DEFAULT_FIELD_KEYS。其他 description(email/phone/department/location/etc)\n// consumer 想顯式透過 `person.fields` opt-in 傳入。\nfunction buildPersonNameCard(person: PersonData): React.ReactNode {\n return (\n <NameCard\n name={person.name}\n subtitle={person.description}\n avatar={{ src: person.avatarUrl, alt: person.name }}\n status={person.status}\n statusMessage={person.statusMessage}\n defaultFieldValues={{\n id: person.id,\n employeeNumber: person.employeeNumber,\n }}\n fields={person.fields}\n actions={<NameCardDefaultActions />}\n // onViewMore hover context 必含(avatar.spec.md canonical)。consumer 傳\n // `onViewProfile` 則用真 handler,否則 noop placeholder(UI 仍渲染 View more\n // footer,避免 preview 變死路)。\n onViewMore={person.onViewProfile ?? (() => {})}\n />\n )\n}\n\n// ── Avatar Size ─────────────────────────────────────────────────────────────\n// 與 Tag 高度對齊:sm=20px, md/lg=24px(對齊 item-anatomy AVATAR_SIZE.inline)\n\nconst AVATAR_PX: Record<'sm' | 'md' | 'lg', number> = { sm: 20, md: 24, lg: 24 }\n\n// ── PersonAvatar ────────────────────────────────────────────────────────────\n// Consume DS `Avatar` primitive(2026-04-22 refactor,M1 SSOT consumption)+ 預設 NameCard\n// hoverCard(avatar.spec.md DS-wide「person avatar hover → NameCard」canonical)。\n//\n// 之前用 local `<img>` / `<User icon />` hand-craft 繞過 DS Avatar,違反 M1。本次 refactor:\n// - 所有 person avatar 經過 DS Avatar primitive(size 對應 uiSize family,fallback / icon / badge 集中管理)\n// - 人員資訊 → NameCard(subtitle = description,actions = NameCardDefaultActions)\n\n// 2026-05-13 (a) perf fix(per codex Layer C HoverCard subtree dominant):\n// useMemo `buildPersonNameCard` per-person stable ref。原 every render call → new JSX ref →\n// Avatar.memo bails → HoverCard subtree 重建。Stable ref → memo skip → big win on scroll。\n//\n// (c) push-up scroll-defer:當 DataTable virtualizer.isScrolling=true,**完全不 build NameCard**\n// (Avatar 收 undefined → 跳 HoverCard wrapper)。原 (c) v1 在 Avatar 層 skip wrapper 但 NameCard\n// JSX subtree 仍在此處 build → 浪費 React reconciliation work。push 到此處才真省。\nfunction PersonAvatar({\n person,\n size = 'md',\n className = '',\n style,\n}: {\n person: PersonData\n size?: 'sm' | 'md' | 'lg'\n className?: string\n style?: React.CSSProperties\n}) {\n const isTableScrolling = useTableIsScrolling()\n const nameCard = React.useMemo(\n () => (isTableScrolling ? undefined : buildPersonNameCard(person)),\n [person, isTableScrolling]\n )\n return (\n <Avatar\n src={person.avatarUrl}\n alt={person.name}\n size={AVATAR_PX[size]}\n className={className}\n style={style}\n hoverCard={nameCard}\n />\n )\n}\n\n// ── Single Person Display ───────────────────────────────────────────────────\n\n// 2026-05-14 item-anatomy SSOT fix(per codex+Layer A 共識 path (a) + user 拍板「全部做完」):\n// outer 改 items-start + Avatar 外包 ItemPrefix primitive consumption。單行視覺 = items-center 等效;\n// 多行(autoRowHeight cell)避免 avatar+name center 整 row 不對齊 first-line text top。M1 消費既有\n// 對齊 TreeView / MenuItem / SelectionItem 共用 ItemPrefix wrap chevron/icon/avatar canonical。\nfunction PersonDisplay({ value, size = 'md' }: { value?: PersonValue | null; size?: 'sm' | 'md' | 'lg' }) {\n if (!value) return <span className=\"text-fg-muted\">{EMPTY_DISPLAY}</span>\n\n const person = resolvePerson(value)\n\n // 2026-05-14 I1 fix(per codex addendum verdict):outer `inline-flex` → `flex w-full`\n // 完成 truncate 寬度約束鏈。原 inline-flex content-width parent constrain 不到 name span\n // → cell overflow-hidden 硬裁 → ellipsis dots 不可見。改 flex(block-level full width)\n // + inner name span `flex-1 min-w-0 truncate` 真實 truncate-with-ellipsis 顯示。\n // 對齊 GitHub Primer ActionList / Slack users_select / Atlassian UserPicker truncation canonical。\n return (\n <span className=\"flex items-start gap-2 min-w-0 w-full\">\n <ItemPrefix><PersonAvatar person={person} size={size} /></ItemPrefix>\n <span className=\"truncate flex-1 min-w-0\">{person.name}</span>\n </span>\n )\n}\nPersonDisplay.displayName = 'PersonDisplay'\n\n// ── Multi Person Display ────────────────────────────────────────────────────\n// 多人堆疊:avatar 重疊(-2px),不顯示人名。\n// 第一個 avatar z-index 最高(在最上面),依此類推。\n// 溢出時顯示 +N 指示器,hover 出 tooltip 列出溢出的人(avatar + 人名)。\n\nfunction MultiPersonDisplay({\n value,\n size = 'md',\n max,\n measured = false,\n onRemove,\n}: {\n value?: PersonValue[] | null\n size?: 'sm' | 'md' | 'lg'\n /** 最多顯示幾個 avatar(不含 +N),預設 3。`measured=true` 時忽略此 prop(改 container width 算)*/\n max?: number\n /**\n * 2026-05-15 codex Round 5 C+ SSOT fix:`measured=true` 啟動 container-width 量測(取代 hardcode `max ?? 3`)\n * → display + edit stack 同 algorithm(同 cell width → 同 overflow 判斷),不再 display 用固定 3 vs edit\n * 用 useOverflowCount。對齊 field-controls.spec.md:286 「4-mode 共享 renderer」contract + user round 3\n * verbatim「同空間兩判斷點」SSOT directive。Default false 保 backward compat(non-cell context 仍 max ?? 3)。\n */\n measured?: boolean\n /** 傳入時啟用 dismiss(edit mode),callback 接收被移除的 person */\n onRemove?: (person: PersonValue) => void\n}) {\n if (!value || value.length === 0) return <span className=\"text-fg-muted\">{EMPTY_DISPLAY}</span>\n\n // 2026-05-15 Bug 3 fix(Claude+Codex Step 5 比稿 consensus):消費 shared `avatar-stack-overflow`\n // primitive。原 inline canvas-based formula 是 dual-implementation 違反 user SSOT「同 cell width 同\n // overflow 判斷」(edit path 用 Combobox useOverflowCount DOM offsetWidth / display path 用 inline\n // canvas)。**抽 primitive 統一**:display + edit 共用 `getAvatarStackVisibleCount` formula。\n // SSOT in `./avatar-stack-overflow.ts`,M14 mechanical guard 防 future drift。\n const containerRef = React.useRef<HTMLSpanElement>(null)\n const [measuredCount, setMeasuredCount] = React.useState<number | null>(null)\n React.useLayoutEffect(() => {\n if (!measured) return\n const el = containerRef.current\n if (!el) return\n const calc = () => {\n const visible = getAvatarStackVisibleCount({\n availablePx: el.clientWidth,\n total: value.length,\n avatarPx: AVATAR_STACK_AVATAR_PX[size],\n overflowChipPx: AVATAR_STACK_OVERFLOW_CHIP_PX[size],\n })\n setMeasuredCount(visible)\n }\n calc()\n const ro = new ResizeObserver(calc)\n ro.observe(el)\n return () => ro.disconnect()\n }, [measured, size, value])\n\n const resolvedMax = measured && measuredCount !== null ? measuredCount : (max ?? 3)\n const people = value.map(resolvePerson)\n const visible = people.slice(0, resolvedMax)\n const hidden = people.slice(resolvedMax)\n const overflow = hidden.length\n\n // 單人回退到 PersonDisplay(顯示名字)\n if (people.length === 1) {\n return <PersonDisplay value={value[0]} size={size} />\n }\n\n // 2026-05-14 item-anatomy SSOT fix(per codex+Layer A 共識):outer items-start + avatar stack\n // 鎖 first-line baseline(整 stack 是 prefix slot,h-[1lh] 對齊 first line)。\n return (\n <span ref={containerRef} className=\"inline-flex items-start min-w-0\">\n <ItemPrefix className=\"!justify-start\"><span className=\"inline-flex items-center min-w-0\">\n {visible.map((person, i) => {\n // **2026-05-07 v15.11 Bug D 升級 SSOT**:visible avatar 也支援 inline dismiss\n // (對齊 user directive「avatar = tag」)。Dismiss overlay 走 `AvatarDismissOverlay`\n // 共用 SSOT(下方 export),Combobox tagRenderer / 此處 / 任何 future avatar consumer\n // 都用同一視覺 — 紅圈 X 對齊 avatar 右上,hover/focus-visible 才顯。\n const handleDismiss = onRemove ? () => onRemove(value![i]) : undefined\n return (\n <span key={person.name + i} className={`relative inline-flex group/avatar ${i > 0 ? '-ml-0.5' : ''}`} style={{ zIndex: visible.length - i }}>\n <PersonAvatar\n person={person}\n size={size}\n className=\"ring-2 ring-[var(--surface)]\"\n />\n {handleDismiss && <AvatarDismissOverlay onRemove={handleDismiss} label={person.name} />}\n </span>\n )\n })}\n {overflow > 0 && (\n <OverflowIndicator\n count={overflow}\n size={size}\n className=\"ring-2 ring-[var(--surface)] -ml-0.5\"\n >\n {hidden.map((person, i) => (\n <Tag\n key={person.name + i}\n color=\"neutral\"\n size=\"sm\"\n // Tag.avatar 是 ReactNode(非 AvatarData object)——傳 <Avatar> 元素。\n // Tag 內部用 `w-4 h-4 rounded-full` 容器 slot,Avatar 填滿 object-cover。\n // **hoverCard 必帶**(avatar.spec.md DS-wide canonical:所有 person avatar 必 hover → NameCard)。\n // 跟 PersonAvatar 共用 `buildPersonNameCard` helper 確保顯示資訊一致。\n avatar={\n <Avatar\n src={person.avatarUrl}\n alt={person.name}\n size={16}\n hoverCard={buildPersonNameCard(person)}\n />\n }\n onDismiss={onRemove ? () => onRemove(value![resolvedMax + i]) : undefined}\n >\n {person.name}\n </Tag>\n ))}\n </OverflowIndicator>\n )}\n </span></ItemPrefix>\n </span>\n )\n}\nMultiPersonDisplay.displayName = 'MultiPersonDisplay'\n\n// ── AvatarDismissOverlay ────────────────────────────────────────────────────\n// SSOT for「person avatar overlay dismiss」(2026-05-07 v15.12,user spec confirmed)。\n//\n// **Visual canonical**(對齊 DS new token `--surface-strong`):\n// - **12×12 圓**(固定,不隨 field size 變)\n// - **bg `--surface-strong`**(neutral-6),hover → `--surface-strong-hover`\n// (light=neutral-5 / dark=neutral-7,跨 mode 對稱)\n// - **X icon size=12 strokeWidth=3.5**(icon 跟底色一樣大,對齊 checkbox checkmark\n// sm/md stroke 規格)\n// - **text-on-emphasis**(白 X,確保飽和色底對比)\n// - **位置 `absolute top-0 right-0`**(button 右上角貼齊 avatar 右上角,完全在 avatar\n// 內 — user-confirmed canonical)\n//\n// **a11y**(codex P1 fix):`opacity-0` 而非 `display:none` — element 在 DOM/tab-order,\n// keyboard tab 可達,觸控 focus-within 也顯。Hover / focus-within / focus-visible\n// 三條件之一觸發 `opacity-100`。\n//\n// **Why centralize**:Combobox tagRenderer (PeoplePicker stack mode) + MultiPersonDisplay\n// dismiss 共用 SSOT,改 1 處全 sync(M17 propagation)。\nfunction AvatarDismissOverlay({ onRemove, label }: { onRemove: () => void; label: string }) {\n return (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); onRemove() }}\n aria-label={`移除 ${label}`}\n className={[\n // **Position(2026-05-07 v15.15 user-confirmed)**:asymmetric `-top-px -right-1`\n // (top -1px / right -4px)— field padding-y(4px sm/md)緊 → top 只 -1px 安全;\n // padding-x 12px 寬鬆 → right 凸 4px 達 badge canonical visual。對齊 ClickUp\n // 世界級 idiom(asymmetric offset by avatar/field size constraint)。\n 'absolute -top-px -right-1 z-10',\n 'inline-flex items-center justify-center',\n // **12×12 + 2px white ring**(SSOT match stacked avatar,Slack/Material/iOS\n // notification badge 2px ring canonical)。改用 `[box-shadow:...]` 而非 `ring-2`\n // 避免跟下方 `focus-visible:ring-2` 在 tailwind-merge 衝突(同 ring family\n // override 互殺)。Box-shadow inset 0 不影響 layout,也不被 focus-visible ring\n // 蓋掉(focus 那邊另一條 outline ring 不同 layer)。\n 'w-3 h-3 rounded-full [box-shadow:0_0_0_2px_var(--surface)]',\n // bg-surface-strong = neutral-6-opaque / hover = neutral-7-opaque(both modes,\n // step-7 dark 公式自動 lighter → engaged 跨 mode 對稱)\n 'bg-surface-strong text-on-emphasis hover:bg-surface-strong-hover',\n // a11y(codex P1 fix):opacity 而非 display:none — element 在 DOM/tab-order,\n // keyboard 可達。Hover / focus-within / focus-visible 三條件之一觸發。\n 'opacity-0 group-hover/avatar:opacity-100 group-focus-within/avatar:opacity-100 focus-visible:opacity-100',\n 'transition-opacity duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n ].join(' ')}\n >\n <X size={12} strokeWidth={3.5} aria-hidden />\n </button>\n )\n}\n\n// ── PersonAvatarTag(Combobox tagRenderer SSOT for stack mode)─────────────\n// PeoplePicker `multiDisplay='stack'` 模式 wraps Combobox,tagRenderer 不能用 Tag pill\n// (那是 pill mode),改 render 此元件 — Avatar overlap 視覺 + AvatarDismissOverlay。\n// 對齊 user directive「avatar = tag 概念,差別只在視覺,SSOT 一致」(2026-05-07 v15.13)。\n//\n// **架構**(v15.13 重構):本元件**不自包** `group/avatar` / `-ml-0.5` overlap wrapper,\n// 因 Combobox `tagRenderer` 結果會被內部 `<div shrink-0>` 包成 measurement wrapper\n// (useOverflowCount 必要)。把 overlap + group 拉到 Combobox 的 `tagWrapperClassName`\n// 上,sibling-level overlap + group selector 才能正確 chain → AvatarDismissOverlay 的\n// `group-hover/avatar:opacity-100` 才會通。\nfunction PersonAvatarTag({\n person, size = 'md', onRemove,\n}: {\n person: PersonData\n size?: 'sm' | 'md' | 'lg'\n onRemove?: () => void\n}) {\n return (\n <>\n <PersonAvatar person={person} size={size} className=\"ring-2 ring-[var(--surface)]\" />\n {onRemove && <AvatarDismissOverlay onRemove={onRemove} label={person.name} />}\n </>\n )\n}\nPersonAvatarTag.displayName = 'PersonAvatarTag'\n\nexport { PersonDisplay, MultiPersonDisplay, PersonAvatarTag, buildPersonNameCard, resolvePerson }\n"],"names":["visible"],"mappings":"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"}
1
+ {"version":3,"file":"person-display.js","sources":["../../../src/components/PeoplePicker/person-display.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 { X } from 'lucide-react'\nimport { EMPTY_DISPLAY } from '@/design-system/components/Field/field-wrapper'\nimport { Tag } from '@/design-system/components/Tag/tag'\nimport { OverflowIndicator } from '@/design-system/components/OverflowIndicator/overflow-indicator'\nimport { Avatar } from '@/design-system/components/Avatar/avatar'\nimport { ProfileCard, ProfileCardDefaultActions } from '@/design-system/components/ProfileCard/profile-card'\nimport { useTableIsScrolling } from '@/design-system/components/Field/field-context'\nimport { ItemPrefix } from '@/design-system/patterns/element-anatomy/item-anatomy'\nimport {\n getAvatarStackVisibleCount,\n AVATAR_STACK_AVATAR_PX,\n AVATAR_STACK_OVERFLOW_CHIP_PX,\n} from './avatar-stack-overflow'\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\n// PersonData 承載 ProfileCard 所需的完整資訊。DS 全域 person avatar 的 hoverCard ProfileCard 永遠\n// 顯示同一組 sections(name + subtitle + status + 4 default fields + 自訂 fields + actions + View more)\n// — 缺資料顯 placeholder,不會 collapse。對齊 avatar.spec.md「person avatar hover → ProfileCard」\n// DS-wide canonical(2026-05-06 v11 always-render schema 升級)。\nexport interface PersonData {\n name: string\n avatarUrl?: string\n /** 角色 / 部門 / ID 等 meta 單行(ProfileCard subtitle) */\n description?: string\n /** Presence 狀態(對齊 Avatar presence canonical)。**2026-05-14 v12 update**(per user 拍板):\n * production 每 user 一定有 presence state,**undefined = loading transient(資料還沒讀到)**,\n * 不是「user 沒設定」。ProfileCard 在 undefined 期間隱藏整 status block,**禁** render「Status not set」\n * placeholder 文字。 */\n status?: 'online' | 'away' | 'busy' | 'offline'\n /** Status 訊息(ProfileCard status section)。只在 status defined 時 render,缺則顯 `—` placeholder。\n * Status undefined 整 block skip(無 statusMessage 也跟著 skip)。 */\n statusMessage?: React.ReactNode\n /** **2026-05-07 v15.7 user directive**:ProfileCard default 只 render `id` + `employeeNumber`,\n * 其他 description 一律 opt-in by consumer 透過 `fields` array prop。對齊\n * `NAMECARD_DEFAULT_FIELD_KEYS = ['id', 'employeeNumber']`。 */\n id?: string\n employeeNumber?: string\n /** 自訂額外 fields(在 default fields 之後 append)。Email / Phone / Department / Location\n * / 任何其他 description 一律走這個 prop(opt-in,consumer 自選)。 */\n fields?: { label: string; value: string }[]\n /** 跳至完整 profile 頁的 handler(hover ProfileCard 必含,不傳時 fallback noop placeholder) */\n onViewProfile?: () => void\n}\n\nexport type PersonValue = string | PersonData\n\nfunction resolvePerson(value: PersonValue): PersonData {\n return typeof value === 'string' ? { name: value } : value\n}\n\n// buildPersonProfileCard — DS 全域 person avatar hoverCard 的 canonical ProfileCard JSX 建構器。\n// SSOT for「avatar hover ProfileCard 一致視覺」— 任何 person avatar consumer 都走這個 helper,\n// 不可繞道直接 build ProfileCard。\n//\n// **2026-05-07 v15.7 user directive**:default field values 只 `id` + `employeeNumber`,\n// 對齊 NAMECARD_DEFAULT_FIELD_KEYS。其他 description(email/phone/department/location/etc)\n// consumer 想顯式透過 `person.fields` opt-in 傳入。\nfunction buildPersonProfileCard(person: PersonData): React.ReactNode {\n return (\n <ProfileCard\n name={person.name}\n subtitle={person.description}\n avatar={{ src: person.avatarUrl, alt: person.name }}\n status={person.status}\n statusMessage={person.statusMessage}\n defaultFieldValues={{\n id: person.id,\n employeeNumber: person.employeeNumber,\n }}\n fields={person.fields}\n actions={<ProfileCardDefaultActions />}\n // onViewMore hover context 必含(avatar.spec.md canonical)。consumer 傳\n // `onViewProfile` 則用真 handler,否則 noop placeholder(UI 仍渲染 View more\n // footer,避免 preview 變死路)。\n onViewMore={person.onViewProfile ?? (() => {})}\n />\n )\n}\n\n// ── Avatar Size ─────────────────────────────────────────────────────────────\n// 與 Tag 高度對齊:sm=20px, md/lg=24px(對齊 item-anatomy AVATAR_SIZE.inline)\n\nconst AVATAR_PX: Record<'sm' | 'md' | 'lg', number> = { sm: 20, md: 24, lg: 24 }\n\n// ── PersonAvatar ────────────────────────────────────────────────────────────\n// Consume DS `Avatar` primitive(2026-04-22 refactor,M1 SSOT consumption)+ 預設 ProfileCard\n// hoverCard(avatar.spec.md DS-wide「person avatar hover → ProfileCard」canonical)。\n//\n// 之前用 local `<img>` / `<User icon />` hand-craft 繞過 DS Avatar,違反 M1。本次 refactor:\n// - 所有 person avatar 經過 DS Avatar primitive(size 對應 uiSize family,fallback / icon / badge 集中管理)\n// - 人員資訊 → ProfileCard(subtitle = description,actions = ProfileCardDefaultActions)\n\n// 2026-05-13 (a) perf fix(per codex Layer C HoverCard subtree dominant):\n// useMemo `buildPersonProfileCard` per-person stable ref。原 every render call → new JSX ref →\n// Avatar.memo bails → HoverCard subtree 重建。Stable ref → memo skip → big win on scroll。\n//\n// (c) push-up scroll-defer:當 DataTable virtualizer.isScrolling=true,**完全不 build ProfileCard**\n// (Avatar 收 undefined → 跳 HoverCard wrapper)。原 (c) v1 在 Avatar 層 skip wrapper 但 ProfileCard\n// JSX subtree 仍在此處 build → 浪費 React reconciliation work。push 到此處才真省。\nfunction PersonAvatar({\n person,\n size = 'md',\n className = '',\n style,\n}: {\n person: PersonData\n size?: 'sm' | 'md' | 'lg'\n className?: string\n style?: React.CSSProperties\n}) {\n const isTableScrolling = useTableIsScrolling()\n const nameCard = React.useMemo(\n () => (isTableScrolling ? undefined : buildPersonProfileCard(person)),\n [person, isTableScrolling]\n )\n return (\n <Avatar\n src={person.avatarUrl}\n alt={person.name}\n size={AVATAR_PX[size]}\n className={className}\n style={style}\n hoverCard={nameCard}\n />\n )\n}\n\n// ── Single Person Display ───────────────────────────────────────────────────\n\n// 2026-05-14 item-anatomy SSOT fix(per codex+Layer A 共識 path (a) + user 拍板「全部做完」):\n// outer 改 items-start + Avatar 外包 ItemPrefix primitive consumption。單行視覺 = items-center 等效;\n// 多行(autoRowHeight cell)避免 avatar+name center 整 row 不對齊 first-line text top。M1 消費既有\n// 對齊 TreeView / MenuItem / SelectionItem 共用 ItemPrefix wrap chevron/icon/avatar canonical。\nfunction PersonDisplay({ value, size = 'md' }: { value?: PersonValue | null; size?: 'sm' | 'md' | 'lg' }) {\n if (!value) return <span className=\"text-fg-muted\">{EMPTY_DISPLAY}</span>\n\n const person = resolvePerson(value)\n\n // 2026-05-14 I1 fix(per codex addendum verdict):outer `inline-flex` → `flex w-full`\n // 完成 truncate 寬度約束鏈。原 inline-flex content-width parent constrain 不到 name span\n // → cell overflow-hidden 硬裁 → ellipsis dots 不可見。改 flex(block-level full width)\n // + inner name span `flex-1 min-w-0 truncate` 真實 truncate-with-ellipsis 顯示。\n // 對齊 GitHub Primer ActionList / Slack users_select / Atlassian UserPicker truncation canonical。\n return (\n <span className=\"flex items-start gap-2 min-w-0 w-full\">\n <ItemPrefix><PersonAvatar person={person} size={size} /></ItemPrefix>\n <span className=\"truncate flex-1 min-w-0\">{person.name}</span>\n </span>\n )\n}\nPersonDisplay.displayName = 'PersonDisplay'\n\n// ── Multi Person Display ────────────────────────────────────────────────────\n// 多人堆疊:avatar 重疊(-2px),不顯示人名。\n// 第一個 avatar z-index 最高(在最上面),依此類推。\n// 溢出時顯示 +N 指示器,hover 出 tooltip 列出溢出的人(avatar + 人名)。\n\nfunction MultiPersonDisplay({\n value,\n size = 'md',\n max,\n measured = false,\n onRemove,\n}: {\n value?: PersonValue[] | null\n size?: 'sm' | 'md' | 'lg'\n /** 最多顯示幾個 avatar(不含 +N),預設 3。`measured=true` 時忽略此 prop(改 container width 算)*/\n max?: number\n /**\n * 2026-05-15 codex Round 5 C+ SSOT fix:`measured=true` 啟動 container-width 量測(取代 hardcode `max ?? 3`)\n * → display + edit stack 同 algorithm(同 cell width → 同 overflow 判斷),不再 display 用固定 3 vs edit\n * 用 useOverflowCount。對齊 field-controls.spec.md:286 「4-mode 共享 renderer」contract + user round 3\n * verbatim「同空間兩判斷點」SSOT directive。Default false 保 backward compat(non-cell context 仍 max ?? 3)。\n */\n measured?: boolean\n /** 傳入時啟用 dismiss(edit mode),callback 接收被移除的 person */\n onRemove?: (person: PersonValue) => void\n}) {\n if (!value || value.length === 0) return <span className=\"text-fg-muted\">{EMPTY_DISPLAY}</span>\n\n // 2026-05-15 Bug 3 fix(Claude+Codex Step 5 比稿 consensus):消費 shared `avatar-stack-overflow`\n // primitive。原 inline canvas-based formula 是 dual-implementation 違反 user SSOT「同 cell width 同\n // overflow 判斷」(edit path 用 Combobox useOverflowCount DOM offsetWidth / display path 用 inline\n // canvas)。**抽 primitive 統一**:display + edit 共用 `getAvatarStackVisibleCount` formula。\n // SSOT in `./avatar-stack-overflow.ts`,M14 mechanical guard 防 future drift。\n const containerRef = React.useRef<HTMLSpanElement>(null)\n const [measuredCount, setMeasuredCount] = React.useState<number | null>(null)\n React.useLayoutEffect(() => {\n if (!measured) return\n const el = containerRef.current\n if (!el) return\n const calc = () => {\n const visible = getAvatarStackVisibleCount({\n availablePx: el.clientWidth,\n total: value.length,\n avatarPx: AVATAR_STACK_AVATAR_PX[size],\n overflowChipPx: AVATAR_STACK_OVERFLOW_CHIP_PX[size],\n })\n setMeasuredCount(visible)\n }\n calc()\n const ro = new ResizeObserver(calc)\n ro.observe(el)\n return () => ro.disconnect()\n }, [measured, size, value])\n\n const resolvedMax = measured && measuredCount !== null ? measuredCount : (max ?? 3)\n const people = value.map(resolvePerson)\n const visible = people.slice(0, resolvedMax)\n const hidden = people.slice(resolvedMax)\n const overflow = hidden.length\n\n // 單人回退到 PersonDisplay(顯示名字)\n if (people.length === 1) {\n return <PersonDisplay value={value[0]} size={size} />\n }\n\n // 2026-05-14 item-anatomy SSOT fix(per codex+Layer A 共識):outer items-start + avatar stack\n // 鎖 first-line baseline(整 stack 是 prefix slot,h-[1lh] 對齊 first line)。\n return (\n <span ref={containerRef} className=\"inline-flex items-start min-w-0\">\n <ItemPrefix className=\"!justify-start\"><span className=\"inline-flex items-center min-w-0\">\n {visible.map((person, i) => {\n // **2026-05-07 v15.11 Bug D 升級 SSOT**:visible avatar 也支援 inline dismiss\n // (對齊 user directive「avatar = tag」)。Dismiss overlay 走 `AvatarDismissOverlay`\n // 共用 SSOT(下方 export),Combobox tagRenderer / 此處 / 任何 future avatar consumer\n // 都用同一視覺 — 紅圈 X 對齊 avatar 右上,hover/focus-visible 才顯。\n const handleDismiss = onRemove ? () => onRemove(value![i]) : undefined\n return (\n <span key={person.name + i} className={`relative inline-flex group/avatar ${i > 0 ? '-ml-0.5' : ''}`} style={{ zIndex: visible.length - i }}>\n <PersonAvatar\n person={person}\n size={size}\n className=\"ring-2 ring-[var(--surface)]\"\n />\n {handleDismiss && <AvatarDismissOverlay onRemove={handleDismiss} label={person.name} />}\n </span>\n )\n })}\n {overflow > 0 && (\n <OverflowIndicator\n count={overflow}\n size={size}\n className=\"ring-2 ring-[var(--surface)] -ml-0.5\"\n >\n {hidden.map((person, i) => (\n <Tag\n key={person.name + i}\n color=\"neutral\"\n size=\"sm\"\n // Tag.avatar 是 ReactNode(非 AvatarData object)——傳 <Avatar> 元素。\n // Tag 內部用 `w-4 h-4 rounded-full` 容器 slot,Avatar 填滿 object-cover。\n // **hoverCard 必帶**(avatar.spec.md DS-wide canonical:所有 person avatar 必 hover → ProfileCard)。\n // 跟 PersonAvatar 共用 `buildPersonProfileCard` helper 確保顯示資訊一致。\n avatar={\n <Avatar\n src={person.avatarUrl}\n alt={person.name}\n size={16}\n hoverCard={buildPersonProfileCard(person)}\n />\n }\n onRemove={onRemove ? () => onRemove(value![resolvedMax + i]) : undefined}\n >\n {person.name}\n </Tag>\n ))}\n </OverflowIndicator>\n )}\n </span></ItemPrefix>\n </span>\n )\n}\nMultiPersonDisplay.displayName = 'MultiPersonDisplay'\n\n// ── AvatarDismissOverlay ────────────────────────────────────────────────────\n// SSOT for「person avatar overlay dismiss」(2026-05-07 v15.12,user spec confirmed)。\n//\n// **Visual canonical**(對齊 DS new token `--surface-strong`):\n// - **12×12 圓**(固定,不隨 field size 變)\n// - **bg `--surface-strong`**(neutral-6),hover → `--surface-strong-hover`\n// (light=neutral-5 / dark=neutral-7,跨 mode 對稱)\n// - **X icon size=12 strokeWidth=3**(icon 跟底色一樣大,對齊 checkbox checkmark\n// sm/md stroke 規格;2026-06-12 同步 checkbox 2026-05-18 簡化 3.5→3,SSOT →\n// .claude/references/ui-dev-rules.md「小尺寸 icon stroke 補償」)\n// - **text-on-emphasis**(白 X,確保飽和色底對比)\n// - **位置 `absolute top-0 right-0`**(button 右上角貼齊 avatar 右上角,完全在 avatar\n// 內 — user-confirmed canonical)\n//\n// **a11y**(codex P1 fix):`opacity-0` 而非 `display:none` — element 在 DOM/tab-order,\n// keyboard tab 可達,觸控 focus-within 也顯。Hover / focus-within / focus-visible\n// 三條件之一觸發 `opacity-100`。\n//\n// **Why centralize**:Combobox tagRenderer (PeoplePicker stack mode) + MultiPersonDisplay\n// dismiss 共用 SSOT,改 1 處全 sync(M17 propagation)。\nfunction AvatarDismissOverlay({ onRemove, label }: { onRemove: () => void; label: string }) {\n return (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); onRemove() }}\n aria-label={`移除 ${label}`}\n className={[\n // **Position(2026-05-07 v15.15 user-confirmed)**:asymmetric `-top-px -right-1`\n // (top -1px / right -4px)— field padding-y(4px sm/md)緊 → top 只 -1px 安全;\n // padding-x 12px 寬鬆 → right 凸 4px 達 badge canonical visual。對齊 ClickUp\n // 世界級 idiom(asymmetric offset by avatar/field size constraint)。\n 'absolute -top-px -right-1 z-10',\n 'inline-flex items-center justify-center',\n // **12×12 + 2px white ring**(SSOT match stacked avatar,Slack/Material/iOS\n // notification badge 2px ring canonical)。改用 `[box-shadow:...]` 而非 `ring-2`\n // 避免跟下方 `focus-visible:ring-2` 在 tailwind-merge 衝突(同 ring family\n // override 互殺)。Box-shadow inset 0 不影響 layout,也不被 focus-visible ring\n // 蓋掉(focus 那邊另一條 outline ring 不同 layer)。\n 'w-3 h-3 rounded-full [box-shadow:0_0_0_2px_var(--surface)]',\n // bg-surface-strong = neutral-6-opaque / hover = neutral-7-opaque(both modes,\n // step-7 dark 公式自動 lighter → engaged 跨 mode 對稱)\n 'bg-surface-strong text-on-emphasis hover:bg-surface-strong-hover',\n // a11y(codex P1 fix):opacity 而非 display:none — element 在 DOM/tab-order,\n // keyboard 可達。Hover / focus-within / focus-visible 三條件之一觸發。\n 'opacity-0 group-hover/avatar:opacity-100 group-focus-within/avatar:opacity-100 focus-visible:opacity-100',\n 'transition-opacity duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n ].join(' ')}\n >\n <X size={12} strokeWidth={3} aria-hidden />\n </button>\n )\n}\n\n// ── PersonAvatarTag(Combobox tagRenderer SSOT for stack mode)─────────────\n// PeoplePicker `multiDisplay='stack'` 模式 wraps Combobox,tagRenderer 不能用 Tag pill\n// (那是 pill mode),改 render 此元件 — Avatar overlap 視覺 + AvatarDismissOverlay。\n// 對齊 user directive「avatar = tag 概念,差別只在視覺,SSOT 一致」(2026-05-07 v15.13)。\n//\n// **架構**(v15.13 重構):本元件**不自包** `group/avatar` / `-ml-0.5` overlap wrapper,\n// 因 Combobox `tagRenderer` 結果會被內部 `<div shrink-0>` 包成 measurement wrapper\n// (useOverflowCount 必要)。把 overlap + group 拉到 Combobox 的 `tagWrapperClassName`\n// 上,sibling-level overlap + group selector 才能正確 chain → AvatarDismissOverlay 的\n// `group-hover/avatar:opacity-100` 才會通。\nfunction PersonAvatarTag({\n person, size = 'md', onRemove,\n}: {\n person: PersonData\n size?: 'sm' | 'md' | 'lg'\n onRemove?: () => void\n}) {\n return (\n <>\n <PersonAvatar person={person} size={size} className=\"ring-2 ring-[var(--surface)]\" />\n {onRemove && <AvatarDismissOverlay onRemove={onRemove} label={person.name} />}\n </>\n )\n}\nPersonAvatarTag.displayName = 'PersonAvatarTag'\n\nexport { PersonDisplay, MultiPersonDisplay, PersonAvatarTag, buildPersonProfileCard, resolvePerson }\n"],"names":["visible"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './popover';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Popover/index.ts"],"names":[],"mappings":"AAIA,cAAc,WAAW,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { Popover, PopoverAnchor, PopoverBody, PopoverClose, PopoverContent, PopoverFooter, PopoverHeader, PopoverTitle, PopoverTrigger, popoverMeta } from "./popover.js";
2
+ export {
3
+ Popover,
4
+ PopoverAnchor,
5
+ PopoverBody,
6
+ PopoverClose,
7
+ PopoverContent,
8
+ PopoverFooter,
9
+ PopoverHeader,
10
+ PopoverTitle,
11
+ PopoverTrigger,
12
+ popoverMeta
13
+ };
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -5,7 +5,7 @@ import * as PopoverPrimitive from "@radix-ui/react-popover";
5
5
  *
6
6
  * ── 視覺 ──
7
7
  * 與 Dialog 對齊:bg-surface-raised / rounded-lg / border-border / elevation-200。
8
- * density 永遠鎖 md(non-modal 輕量浮層不隨頁面 density 放大)。
8
+ * layout-space md(輕量浮層 header py-tight 保持精簡);ui-size 繼承 page(內部控件對齊觸發點,2026-06-15 改,原 data-density master switch)。
9
9
  *
10
10
  * ── 結構 ──
11
11
  * PopoverContent:外殼(bg / border / radius / shadow / density),無內距。
@@ -39,7 +39,7 @@ export declare const popoverMeta: {
39
39
  readonly family: null;
40
40
  readonly variants: {};
41
41
  readonly sizes: {};
42
- readonly states: readonly ["default", "hover", "active", "focus-visible", "disabled"];
42
+ readonly states: readonly ["default"];
43
43
  readonly tokens: {
44
44
  readonly bg: readonly ["bg-surface-raised"];
45
45
  readonly fg: readonly ["text-foreground"];
@@ -1 +1 @@
1
- {"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../../src/components/Popover/popover.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAA;AAQ3D;;;;;;;;;;;;;;;;;GAiBG;AAEH,QAAA,MAAM,OAAO,yCAAwB,CAAA;AACrC,QAAA,MAAM,cAAc,gHAA2B,CAAA;AAC/C,QAAA,MAAM,aAAa,4GAA0B,CAAA;AAC7C,QAAA,MAAM,YAAY,8GAAyB,CAAA;AAgB3C,QAAA,MAAM,cAAc,gKAyBlB,CAAA;AAKF,UAAU,kBAAmB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACvE;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,QAAA,MAAM,aAAa,2FAsBlB,CAAA;AAYD,QAAA,MAAM,WAAW,6GAEhB,CAAA;AAGD,QAAA,MAAM,aAAa,6GAElB,CAAA;AAcD,QAAA,MAAM,YAAY,qHAShB,CAAA;AAKF,eAAO,MAAM,WAAW;;;;;;;;;;;CAed,CAAA;AAEV,OAAO,EACL,OAAO,EACP,cAAc,EACd,aAAa,EACb,cAAc,EACd,YAAY,EACZ,aAAa,EACb,WAAW,EACX,aAAa,EACb,YAAY,GACb,CAAA"}
1
+ {"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../../src/components/Popover/popover.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAA;AAQ3D;;;;;;;;;;;;;;;;;GAiBG;AAEH,QAAA,MAAM,OAAO,yCAAwB,CAAA;AACrC,QAAA,MAAM,cAAc,gHAA2B,CAAA;AAC/C,QAAA,MAAM,aAAa,4GAA0B,CAAA;AAC7C,QAAA,MAAM,YAAY,8GAAyB,CAAA;AAgB3C,QAAA,MAAM,cAAc,gKA6BlB,CAAA;AAKF,UAAU,kBAAmB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACvE;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,QAAA,MAAM,aAAa,2FAqBlB,CAAA;AAYD,QAAA,MAAM,WAAW,6GAEhB,CAAA;AAGD,QAAA,MAAM,aAAa,6GAElB,CAAA;AAcD,QAAA,MAAM,YAAY,qHAShB,CAAA;AAKF,eAAO,MAAM,WAAW;;;;;;;;;;;CAed,CAAA;AAEV,OAAO,EACL,OAAO,EACP,cAAc,EACd,aAAa,EACb,cAAc,EACd,YAAY,EACZ,aAAa,EACb,WAAW,EACX,aAAa,EACb,YAAY,GACb,CAAA"}