admin-ui-starter-kit 0.6.4 → 0.6.6

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 (1176) hide show
  1. package/.agents/skills/component-library-rules/references/components/base__cards.md +3 -4
  2. package/.agents/skills/component-library-rules/references/components/base__table.md +32 -11
  3. package/.agents/skills/component-library-rules/references/components/layout__layout-containers.md +2 -2
  4. package/dist/_shared/accordion-BRj4TDQx.js +135 -0
  5. package/dist/_shared/accordion-BRj4TDQx.js.map +1 -0
  6. package/dist/_shared/accordion-DvlDjk29.cjs +2 -0
  7. package/dist/_shared/accordion-DvlDjk29.cjs.map +1 -0
  8. package/dist/_shared/action-menu-BrHF4nss.cjs +2 -0
  9. package/dist/_shared/action-menu-BrHF4nss.cjs.map +1 -0
  10. package/dist/_shared/action-menu-Crn22LKo.js +96 -0
  11. package/dist/_shared/action-menu-Crn22LKo.js.map +1 -0
  12. package/dist/_shared/ai-artifact-BHgd3agA.js +1099 -0
  13. package/dist/_shared/ai-artifact-BHgd3agA.js.map +1 -0
  14. package/dist/_shared/ai-artifact-BRM5cvGv.cjs +3 -0
  15. package/dist/_shared/ai-artifact-BRM5cvGv.cjs.map +1 -0
  16. package/dist/_shared/alert-CMVVt2Br.js +81 -0
  17. package/dist/_shared/alert-CMVVt2Br.js.map +1 -0
  18. package/dist/_shared/alert-Dmhtbmpg.cjs +2 -0
  19. package/dist/_shared/alert-Dmhtbmpg.cjs.map +1 -0
  20. package/dist/_shared/app-shell-BZQJfTkf.cjs +2 -0
  21. package/dist/_shared/app-shell-BZQJfTkf.cjs.map +1 -0
  22. package/dist/_shared/app-shell-Da6GHxTZ.js +69 -0
  23. package/dist/_shared/app-shell-Da6GHxTZ.js.map +1 -0
  24. package/dist/_shared/auth-DZW6NkJx.cjs +2 -0
  25. package/dist/_shared/auth-DZW6NkJx.cjs.map +1 -0
  26. package/dist/_shared/auth-Dh790NI_.js +643 -0
  27. package/dist/_shared/auth-Dh790NI_.js.map +1 -0
  28. package/dist/_shared/badge-B8xGFpfM.cjs +2 -0
  29. package/dist/_shared/badge-B8xGFpfM.cjs.map +1 -0
  30. package/dist/_shared/badge-BYNwSWh5.js +110 -0
  31. package/dist/_shared/badge-BYNwSWh5.js.map +1 -0
  32. package/dist/_shared/breadcrumbs-CuT0YIfo.js +105 -0
  33. package/dist/_shared/breadcrumbs-CuT0YIfo.js.map +1 -0
  34. package/dist/_shared/breadcrumbs-jNzlYqS9.cjs +2 -0
  35. package/dist/_shared/breadcrumbs-jNzlYqS9.cjs.map +1 -0
  36. package/dist/_shared/button-BMiPFJIb.cjs +2 -0
  37. package/dist/_shared/button-BMiPFJIb.cjs.map +1 -0
  38. package/dist/_shared/button-vv59_uS_.js +189 -0
  39. package/dist/_shared/button-vv59_uS_.js.map +1 -0
  40. package/dist/_shared/buttons-CvqIMv3I.js +137 -0
  41. package/dist/_shared/buttons-CvqIMv3I.js.map +1 -0
  42. package/dist/_shared/buttons-tCkWktN3.cjs +2 -0
  43. package/dist/_shared/buttons-tCkWktN3.cjs.map +1 -0
  44. package/dist/_shared/card-radio-group-Bhe8gAbH.js +150 -0
  45. package/dist/_shared/card-radio-group-Bhe8gAbH.js.map +1 -0
  46. package/dist/_shared/card-radio-group-CdG1zr8M.cjs +2 -0
  47. package/dist/_shared/card-radio-group-CdG1zr8M.cjs.map +1 -0
  48. package/dist/_shared/cards-Cu6p1Brd.cjs +2 -0
  49. package/dist/_shared/cards-Cu6p1Brd.cjs.map +1 -0
  50. package/dist/_shared/cards-cQ9lL6zy.js +354 -0
  51. package/dist/_shared/cards-cQ9lL6zy.js.map +1 -0
  52. package/dist/_shared/combobox-BGYjyXeN.cjs +2 -0
  53. package/dist/_shared/combobox-BGYjyXeN.cjs.map +1 -0
  54. package/dist/_shared/combobox-DTwomOBt.js +954 -0
  55. package/dist/_shared/combobox-DTwomOBt.js.map +1 -0
  56. package/dist/_shared/comments-C97vL5km.js +952 -0
  57. package/dist/_shared/comments-C97vL5km.js.map +1 -0
  58. package/dist/_shared/comments-DBe6dP-d.cjs +2 -0
  59. package/dist/_shared/comments-DBe6dP-d.cjs.map +1 -0
  60. package/dist/_shared/containers-CB7zaAvN.cjs +2 -0
  61. package/dist/_shared/containers-CB7zaAvN.cjs.map +1 -0
  62. package/dist/_shared/containers-CLBmhGfs.js +48 -0
  63. package/dist/_shared/containers-CLBmhGfs.js.map +1 -0
  64. package/dist/_shared/copyable-BgFdERqs.js +38 -0
  65. package/dist/_shared/copyable-BgFdERqs.js.map +1 -0
  66. package/dist/_shared/copyable-Ce8rmE-V.cjs +2 -0
  67. package/dist/_shared/copyable-Ce8rmE-V.cjs.map +1 -0
  68. package/dist/_shared/data-display-DUWxoDKq.js +1873 -0
  69. package/dist/_shared/data-display-DUWxoDKq.js.map +1 -0
  70. package/dist/_shared/data-display-o-rbMuIA.cjs +2 -0
  71. package/dist/_shared/data-display-o-rbMuIA.cjs.map +1 -0
  72. package/dist/_shared/date-picker-Cxx9jllA.js +1361 -0
  73. package/dist/_shared/date-picker-Cxx9jllA.js.map +1 -0
  74. package/dist/_shared/date-picker-DE5A8yqN.cjs +2 -0
  75. package/dist/_shared/date-picker-DE5A8yqN.cjs.map +1 -0
  76. package/dist/_shared/date-pickers-Dex1Mfye.cjs +2 -0
  77. package/dist/_shared/date-pickers-Dex1Mfye.cjs.map +1 -0
  78. package/dist/_shared/date-pickers-m0dpDcqH.js +329 -0
  79. package/dist/_shared/date-pickers-m0dpDcqH.js.map +1 -0
  80. package/dist/_shared/display-Bro3Kufg.js +986 -0
  81. package/dist/_shared/display-Bro3Kufg.js.map +1 -0
  82. package/dist/_shared/display-CRQjSjgB.cjs +2 -0
  83. package/dist/_shared/display-CRQjSjgB.cjs.map +1 -0
  84. package/dist/_shared/form-sizing-DJus3nK3.cjs +2 -0
  85. package/dist/_shared/form-sizing-DJus3nK3.cjs.map +1 -0
  86. package/dist/_shared/form-sizing-DWjJsQSR.js +42 -0
  87. package/dist/_shared/form-sizing-DWjJsQSR.js.map +1 -0
  88. package/dist/_shared/forms-D-SNQmtB.cjs +2 -0
  89. package/dist/_shared/forms-D-SNQmtB.cjs.map +1 -0
  90. package/dist/_shared/forms-p7cfzJwf.js +3533 -0
  91. package/dist/_shared/forms-p7cfzJwf.js.map +1 -0
  92. package/dist/_shared/header-8C71wVRp.js +447 -0
  93. package/dist/_shared/header-8C71wVRp.js.map +1 -0
  94. package/dist/_shared/header-CYgFCnjZ.cjs +2 -0
  95. package/dist/_shared/header-CYgFCnjZ.cjs.map +1 -0
  96. package/dist/_shared/hooks-Ci1LFWRG.js +95 -0
  97. package/dist/_shared/hooks-Ci1LFWRG.js.map +1 -0
  98. package/dist/_shared/hooks-Cjl7LJpn.cjs +2 -0
  99. package/dist/_shared/hooks-Cjl7LJpn.cjs.map +1 -0
  100. package/dist/_shared/input-BgcP6x4C.js +182 -0
  101. package/dist/_shared/input-BgcP6x4C.js.map +1 -0
  102. package/dist/_shared/input-DV3g7Fm5.cjs +2 -0
  103. package/dist/_shared/input-DV3g7Fm5.cjs.map +1 -0
  104. package/dist/_shared/item-D7GTzvhf.js +226 -0
  105. package/dist/_shared/item-D7GTzvhf.js.map +1 -0
  106. package/dist/_shared/item-DTrnHpfm.cjs +2 -0
  107. package/dist/_shared/item-DTrnHpfm.cjs.map +1 -0
  108. package/dist/_shared/layout-BExg7Vlx.js +261 -0
  109. package/dist/_shared/layout-BExg7Vlx.js.map +1 -0
  110. package/dist/_shared/layout-CKRD_goE.cjs +2 -0
  111. package/dist/_shared/layout-CKRD_goE.cjs.map +1 -0
  112. package/dist/_shared/layout.types-CXFAjJCj.cjs +2 -0
  113. package/dist/_shared/layout.types-CXFAjJCj.cjs.map +1 -0
  114. package/dist/_shared/layout.types-ip8BYRa7.js +28 -0
  115. package/dist/_shared/layout.types-ip8BYRa7.js.map +1 -0
  116. package/dist/_shared/mentions-BtGhYisA.js +506 -0
  117. package/dist/_shared/mentions-BtGhYisA.js.map +1 -0
  118. package/dist/_shared/mentions-CnVOuQJU.cjs +2 -0
  119. package/dist/_shared/mentions-CnVOuQJU.cjs.map +1 -0
  120. package/dist/_shared/money-display-BvVpRUs5.cjs +2 -0
  121. package/dist/_shared/money-display-BvVpRUs5.cjs.map +1 -0
  122. package/dist/_shared/money-display-D6Qtvyyv.js +198 -0
  123. package/dist/_shared/money-display-D6Qtvyyv.js.map +1 -0
  124. package/dist/_shared/navigation-C4dO1I82.cjs +2 -0
  125. package/dist/_shared/navigation-C4dO1I82.cjs.map +1 -0
  126. package/dist/_shared/navigation-Ct-LFlpY.js +436 -0
  127. package/dist/_shared/navigation-Ct-LFlpY.js.map +1 -0
  128. package/dist/_shared/overlays-ChyqXn0n.js +735 -0
  129. package/dist/_shared/overlays-ChyqXn0n.js.map +1 -0
  130. package/dist/_shared/overlays-Dn2bt3CL.cjs +2 -0
  131. package/dist/_shared/overlays-Dn2bt3CL.cjs.map +1 -0
  132. package/dist/_shared/popover-menu-17Dxn25O.js +93 -0
  133. package/dist/_shared/popover-menu-17Dxn25O.js.map +1 -0
  134. package/dist/_shared/popover-menu-DXVN0bvj.cjs +2 -0
  135. package/dist/_shared/popover-menu-DXVN0bvj.cjs.map +1 -0
  136. package/dist/_shared/rich-text-editor-BRpcNkj1.js +620 -0
  137. package/dist/_shared/rich-text-editor-BRpcNkj1.js.map +1 -0
  138. package/dist/_shared/rich-text-editor-BXxGNbmI.cjs +2 -0
  139. package/dist/_shared/rich-text-editor-BXxGNbmI.cjs.map +1 -0
  140. package/dist/_shared/settings-CW9yzfQM.js +143 -0
  141. package/dist/_shared/settings-CW9yzfQM.js.map +1 -0
  142. package/dist/_shared/settings-cCPrw7si.cjs +2 -0
  143. package/dist/_shared/settings-cCPrw7si.cjs.map +1 -0
  144. package/dist/_shared/sidebar-Cq6J_I4l.cjs +2 -0
  145. package/dist/_shared/sidebar-Cq6J_I4l.cjs.map +1 -0
  146. package/dist/_shared/sidebar-DtF_ihE3.js +548 -0
  147. package/dist/_shared/sidebar-DtF_ihE3.js.map +1 -0
  148. package/dist/_shared/spinner-DY2de3Wt.cjs +2 -0
  149. package/dist/_shared/spinner-DY2de3Wt.cjs.map +1 -0
  150. package/dist/_shared/spinner-ZmIq_zsx.js +67 -0
  151. package/dist/_shared/spinner-ZmIq_zsx.js.map +1 -0
  152. package/dist/_shared/table-BBWc-wIw.js +1377 -0
  153. package/dist/_shared/table-BBWc-wIw.js.map +1 -0
  154. package/dist/_shared/table-DMDkdLzV.cjs +2 -0
  155. package/dist/_shared/table-DMDkdLzV.cjs.map +1 -0
  156. package/dist/_shared/textarea-C1TeJ7Vt.cjs +2 -0
  157. package/dist/_shared/textarea-C1TeJ7Vt.cjs.map +1 -0
  158. package/dist/_shared/textarea-CGRkgH5z.js +118 -0
  159. package/dist/_shared/textarea-CGRkgH5z.js.map +1 -0
  160. package/dist/_shared/typography-CzFVA1w1.js +201 -0
  161. package/dist/_shared/typography-CzFVA1w1.js.map +1 -0
  162. package/dist/_shared/typography-GtkgK9QX.cjs +2 -0
  163. package/dist/_shared/typography-GtkgK9QX.cjs.map +1 -0
  164. package/dist/_shared/workspace-BF5BtDhD.cjs +2 -0
  165. package/dist/_shared/workspace-BF5BtDhD.cjs.map +1 -0
  166. package/dist/_shared/workspace-IvsczduM.js +357 -0
  167. package/dist/_shared/workspace-IvsczduM.js.map +1 -0
  168. package/dist/components/base/accordion/index.cjs +1 -1
  169. package/dist/components/base/accordion/index.js +1 -1
  170. package/dist/components/base/badge/badge.d.ts.map +1 -1
  171. package/dist/components/base/badge/index.cjs +1 -1
  172. package/dist/components/base/badge/index.js +1 -1
  173. package/dist/components/base/buttons/index.cjs +1 -1
  174. package/dist/components/base/buttons/index.js +2 -2
  175. package/dist/components/base/cards/index.cjs +1 -1
  176. package/dist/components/base/cards/index.js +1 -1
  177. package/dist/components/base/cards/partials/card-primitives.d.ts.map +1 -1
  178. package/dist/components/base/cards/smart-card.types.d.ts +3 -3
  179. package/dist/components/base/carousel/index.cjs +1 -1
  180. package/dist/components/base/carousel/index.js +1 -1
  181. package/dist/components/base/combobox/index.cjs +1 -1
  182. package/dist/components/base/combobox/index.js +1 -1
  183. package/dist/components/base/copyable/index.cjs +1 -1
  184. package/dist/components/base/copyable/index.js +1 -1
  185. package/dist/components/base/currency/index.cjs +1 -1
  186. package/dist/components/base/currency/index.js +1 -1
  187. package/dist/components/base/date-pickers/index.cjs +1 -1
  188. package/dist/components/base/date-pickers/index.js +2 -2
  189. package/dist/components/base/display/chart.cjs +1 -1
  190. package/dist/components/base/display/chart.js +1 -1
  191. package/dist/components/base/display/index.cjs +1 -1
  192. package/dist/components/base/display/index.js +3 -3
  193. package/dist/components/base/event-calendar/index.cjs +1 -1
  194. package/dist/components/base/event-calendar/index.js +3 -3
  195. package/dist/components/base/forms/index.cjs +1 -1
  196. package/dist/components/base/forms/index.js +5 -5
  197. package/dist/components/base/item/index.cjs +1 -1
  198. package/dist/components/base/item/index.js +1 -1
  199. package/dist/components/base/map/index.cjs +1 -1
  200. package/dist/components/base/map/index.js +2 -2
  201. package/dist/components/base/navigation/index.cjs +1 -1
  202. package/dist/components/base/navigation/index.js +3 -3
  203. package/dist/components/base/popover-menu/index.cjs +1 -1
  204. package/dist/components/base/popover-menu/index.js +1 -1
  205. package/dist/components/base/spinner/index.cjs +1 -1
  206. package/dist/components/base/spinner/index.js +1 -1
  207. package/dist/components/base/table/data-table.d.ts.map +1 -1
  208. package/dist/components/base/table/index.cjs +1 -1
  209. package/dist/components/base/table/index.js +1 -1
  210. package/dist/components/composed/admin/index.cjs +1 -1
  211. package/dist/components/composed/admin/index.js +11 -11
  212. package/dist/components/composed/ai/index.cjs +1 -1
  213. package/dist/components/composed/ai/index.js +8 -8
  214. package/dist/components/composed/analytics/index.cjs +1 -1
  215. package/dist/components/composed/analytics/index.js +3 -3
  216. package/dist/components/composed/cards/index.cjs +1 -1
  217. package/dist/components/composed/cards/index.js +7 -7
  218. package/dist/components/composed/commerce/index.cjs +1 -1
  219. package/dist/components/composed/commerce/index.js +8 -8
  220. package/dist/components/composed/dark-surfaces/index.cjs +1 -1
  221. package/dist/components/composed/dark-surfaces/index.js +4 -4
  222. package/dist/components/composed/data-display/index.cjs +1 -1
  223. package/dist/components/composed/data-display/index.js +1 -1
  224. package/dist/components/composed/data-display/metadata/metadata-list.d.ts.map +1 -1
  225. package/dist/components/composed/navigation/index.cjs +1 -1
  226. package/dist/components/composed/navigation/index.js +5 -5
  227. package/dist/components/composed/onboarding/index.cjs +1 -1
  228. package/dist/components/composed/onboarding/index.js +3 -3
  229. package/dist/components/composed/timelines/index.cjs +1 -1
  230. package/dist/components/composed/timelines/index.js +3 -3
  231. package/dist/components/features/activities/index.cjs +1 -1
  232. package/dist/components/features/activities/index.js +4 -4
  233. package/dist/components/features/ai-chat/index.cjs +1 -1
  234. package/dist/components/features/ai-chat/index.js +5 -5
  235. package/dist/components/features/card/index.cjs +1 -1
  236. package/dist/components/features/card/index.js +4 -4
  237. package/dist/components/features/comments/index.cjs +1 -1
  238. package/dist/components/features/comments/index.js +2 -2
  239. package/dist/components/features/data-view/index.cjs +1 -1
  240. package/dist/components/features/data-view/index.js +2 -2
  241. package/dist/components/features/event-log/index.cjs +1 -1
  242. package/dist/components/features/event-log/index.js +4 -4
  243. package/dist/components/features/filters/index.cjs +1 -1
  244. package/dist/components/features/filters/index.js +6 -6
  245. package/dist/components/features/global-search/index.cjs +1 -1
  246. package/dist/components/features/global-search/index.js +4 -4
  247. package/dist/components/features/kanban/index.cjs +1 -1
  248. package/dist/components/features/kanban/index.js +3 -3
  249. package/dist/components/features/media-library/index.cjs +1 -1
  250. package/dist/components/features/media-library/index.js +8 -8
  251. package/dist/components/features/mentions/index.cjs +1 -1
  252. package/dist/components/features/mentions/index.js +1 -1
  253. package/dist/components/features/overlays/index.cjs +1 -1
  254. package/dist/components/features/overlays/index.js +1 -1
  255. package/dist/components/features/products/index.cjs +1 -1
  256. package/dist/components/features/products/index.js +11 -11
  257. package/dist/components/features/resource/index.cjs +1 -1
  258. package/dist/components/features/resource/index.js +4 -4
  259. package/dist/components/features/rich-text-editor/index.cjs +1 -1
  260. package/dist/components/features/rich-text-editor/index.js +1 -1
  261. package/dist/components/features/schema-form/index.cjs +1 -1
  262. package/dist/components/features/schema-form/index.js +8 -8
  263. package/dist/components/features/suggestions/index.cjs +1 -1
  264. package/dist/components/features/suggestions/index.js +1 -1
  265. package/dist/components/features/sync/index.cjs +1 -1
  266. package/dist/components/features/sync/index.js +2 -2
  267. package/dist/components/layout/app-shell/index.cjs +1 -1
  268. package/dist/components/layout/app-shell/index.js +1 -1
  269. package/dist/components/layout/auth/index.cjs +1 -1
  270. package/dist/components/layout/auth/index.js +1 -1
  271. package/dist/components/layout/containers/containers.types.d.ts +2 -2
  272. package/dist/components/layout/containers/containers.types.d.ts.map +1 -1
  273. package/dist/components/layout/containers/content-container.d.ts.map +1 -1
  274. package/dist/components/layout/containers/index.cjs +1 -1
  275. package/dist/components/layout/containers/index.js +1 -2
  276. package/dist/components/layout/header/index.cjs +1 -1
  277. package/dist/components/layout/header/index.js +1 -1
  278. package/dist/components/layout/hooks/index.cjs +1 -1
  279. package/dist/components/layout/hooks/index.js +1 -1
  280. package/dist/components/layout/index.cjs +1 -1
  281. package/dist/components/layout/index.js +11 -12
  282. package/dist/components/layout/layout.types.d.ts.map +1 -1
  283. package/dist/components/layout/page/index.cjs +1 -1
  284. package/dist/components/layout/page/index.js +2 -2
  285. package/dist/components/layout/settings/index.cjs +1 -1
  286. package/dist/components/layout/settings/index.js +1 -1
  287. package/dist/components/layout/sidebar/components/sidebar-grouped-navigation.d.ts.map +1 -1
  288. package/dist/components/layout/sidebar/index.cjs +1 -1
  289. package/dist/components/layout/sidebar/index.js +2 -2
  290. package/dist/components/layout/workspace/index.cjs +1 -1
  291. package/dist/components/layout/workspace/index.js +1 -1
  292. package/dist/components/typography/index.cjs +1 -1
  293. package/dist/components/typography/index.js +1 -1
  294. package/dist/services/actions/index.cjs +1 -1
  295. package/dist/services/actions/index.js +1 -1
  296. package/dist/showcase/assets/AreaChart-CsIm9z7Y.js +6 -0
  297. package/dist/showcase/assets/CompositeItem-D9zznn01.js +1 -0
  298. package/dist/showcase/assets/CompositeRoot-CvxtZ81W.js +1 -0
  299. package/dist/showcase/assets/DialogTrigger-C-osQGHu.js +1 -0
  300. package/dist/showcase/assets/LabelableContext-_EE-HBND.js +1 -0
  301. package/dist/showcase/assets/PreviewLayout-KdEsSl3b.js +1 -0
  302. package/dist/showcase/assets/RadioGroup-4jOeNTc1.js +1 -0
  303. package/dist/showcase/assets/ScrollAreaCorner-CXTdUcaE.js +1 -0
  304. package/dist/showcase/assets/Separator-CHVXO6nj.js +1 -0
  305. package/dist/showcase/assets/ToolbarRootContext-CM5tQGGX.js +1 -0
  306. package/dist/showcase/assets/accordion-CA84bxb2.js +171 -0
  307. package/dist/showcase/assets/accordion-variants-DqWzAOO3.js +1 -0
  308. package/dist/showcase/assets/action-menu-D0q5z-Kq.js +1 -0
  309. package/dist/showcase/assets/actions-DnqxABJU.js +310 -0
  310. package/dist/showcase/assets/activities-BC9hoMy9.js +500 -0
  311. package/dist/showcase/assets/activities-feed-card-D6wGLpbH.js +1 -0
  312. package/dist/showcase/assets/admin-CMnMsugJ.js +140 -0
  313. package/dist/showcase/assets/ai-B6_sE9Zg.js +207 -0
  314. package/dist/showcase/assets/ai-artifact-BVvbsSJB.js +2 -0
  315. package/dist/showcase/assets/ai-chat-lcXeqJrA.js +568 -0
  316. package/dist/showcase/assets/ai-elements-B32o_UjE.js +387 -0
  317. package/dist/showcase/assets/ai-tool-call-BLrAioKz.js +1 -0
  318. package/dist/showcase/assets/alert-B1p1Grce.js +62 -0
  319. package/dist/showcase/assets/alert-BBiffYsY.js +93 -0
  320. package/dist/showcase/assets/alert-vH0nJ8J9.js +1 -0
  321. package/dist/showcase/assets/api-key-list-BrSc6V1y.js +1 -0
  322. package/dist/showcase/assets/api-key-list-CoKe_PaL.js +73 -0
  323. package/dist/showcase/assets/app-sidebar-R93lRPB4.js +1 -0
  324. package/dist/showcase/assets/arrow-down-xxVIADbv.js +1 -0
  325. package/dist/showcase/assets/arrow-left-DxnlnN8R.js +1 -0
  326. package/dist/showcase/assets/arrow-right-S5k93UPM.js +1 -0
  327. package/dist/showcase/assets/arrow-up-OlEVG7a-.js +1 -0
  328. package/dist/showcase/assets/arrow-up-right-j55bbl4b.js +1 -0
  329. package/dist/showcase/assets/avatar-BbiXvZq7.js +67 -0
  330. package/dist/showcase/assets/avatar-Bwpw-hQo.js +57 -0
  331. package/dist/showcase/assets/avatar-D0DKQ1lK.js +1 -0
  332. package/dist/showcase/assets/avatar-WyjSBov9.js +1 -0
  333. package/dist/showcase/assets/badge-BzLZQO3L.js +31 -0
  334. package/dist/showcase/assets/badge-check-TFWm1m3F.js +1 -0
  335. package/dist/showcase/assets/bell-CmuQlO_k.js +1 -0
  336. package/dist/showcase/assets/bot-Bu518AJB.js +1 -0
  337. package/dist/showcase/assets/box-D-wrSdOJ.js +1 -0
  338. package/dist/showcase/assets/braces-CgCdmdAl.js +1 -0
  339. package/dist/showcase/assets/brain-DkHdwgHO.js +1 -0
  340. package/dist/showcase/assets/brand-CpovnVoG.js +36 -0
  341. package/dist/showcase/assets/breadcrumb-BUc0WC5d.js +1 -0
  342. package/dist/showcase/assets/breadcrumb-Do_Dazt1.js +52 -0
  343. package/dist/showcase/assets/breadcrumbs-Bj21o2zm.js +1 -0
  344. package/dist/showcase/assets/briefcase-CQBh2kok.js +1 -0
  345. package/dist/showcase/assets/building-2-D07Ej6iR.js +1 -0
  346. package/dist/showcase/assets/button-CCZ4KEGQ.js +44 -0
  347. package/dist/showcase/assets/button-group-BTjeHOvz.js +1 -0
  348. package/dist/showcase/assets/buttons-D45Wwiwn.js +272 -0
  349. package/dist/showcase/assets/calendar-BsEWULmZ.js +16 -0
  350. package/dist/showcase/assets/calendar-CkPefzIO.js +1 -0
  351. package/dist/showcase/assets/calendar-DZlT3qTq.js +1 -0
  352. package/dist/showcase/assets/calendar-days-C9awTMru.js +1 -0
  353. package/dist/showcase/assets/camera-CQhMw-RD.js +1 -0
  354. package/dist/showcase/assets/card-CKrz_UHt.js +1 -0
  355. package/dist/showcase/assets/card-DZgZgjXO.js +188 -0
  356. package/dist/showcase/assets/card-primitives-CpkDLK3Y.js +1 -0
  357. package/dist/showcase/assets/card-radio-group-BjXwMI4v.js +1 -0
  358. package/dist/showcase/assets/cards-Cd24XZ9l.js +353 -0
  359. package/dist/showcase/assets/carousel-Doon04yO.js +449 -0
  360. package/dist/showcase/assets/cell-renderers-CTay3duH.js +1 -0
  361. package/dist/showcase/assets/chart-CkvbdpWw.js +358 -0
  362. package/dist/showcase/assets/chart-column-Dz57kUMl.js +1 -0
  363. package/dist/showcase/assets/checkbox-L-L4-wvA.js +1 -0
  364. package/dist/showcase/assets/checkbox-sP254E7e.js +1 -0
  365. package/dist/showcase/assets/chevron-down-CLc_a2Ua.js +1 -0
  366. package/dist/showcase/assets/chevron-left-CMRIGOJt.js +1 -0
  367. package/dist/showcase/assets/chevron-up-BDw6LdDZ.js +1 -0
  368. package/dist/showcase/assets/chevrons-up-down-C519RKki.js +1 -0
  369. package/dist/showcase/assets/circle-B_tOHWTY.js +1 -0
  370. package/dist/showcase/assets/circle-alert-B56AFULT.js +1 -0
  371. package/dist/showcase/assets/circle-check-B4XZj4Ty.js +1 -0
  372. package/dist/showcase/assets/circle-check-big-C0iEkwPB.js +1 -0
  373. package/dist/showcase/assets/circle-dot-DPdJZkc6.js +1 -0
  374. package/dist/showcase/assets/circle-question-mark-LTetdrq6.js +1 -0
  375. package/dist/showcase/assets/circle-x-B4FwM-sI.js +1 -0
  376. package/dist/showcase/assets/clock-3-DZhjBuw8.js +1 -0
  377. package/dist/showcase/assets/clock-B9Fna2Q3.js +1 -0
  378. package/dist/showcase/assets/code-xml-B6Xb_vIg.js +1 -0
  379. package/dist/showcase/assets/collapsible-Bf7Oo37i.js +27 -0
  380. package/dist/showcase/assets/collapsible-BfLeooy8.js +1 -0
  381. package/dist/showcase/assets/combobox-4NYfJznY.js +685 -0
  382. package/dist/showcase/assets/command-7jRRucHf.js +1 -0
  383. package/dist/showcase/assets/command-D56CjgNc.js +1 -0
  384. package/dist/showcase/assets/comment-composer-BWeXIZfK.js +1 -0
  385. package/dist/showcase/assets/comment-item-ChkiK-ut.js +1 -0
  386. package/dist/showcase/assets/comments-YnEop7v3.js +357 -0
  387. package/dist/showcase/assets/commerce-7XxWJChs.js +267 -0
  388. package/dist/showcase/assets/composite-CHcyYCsk.js +1 -0
  389. package/dist/showcase/assets/contact-card-BXw-VuBm.js +65 -0
  390. package/dist/showcase/assets/content-container-C4uopCBg.js +1 -0
  391. package/dist/showcase/assets/copyable-CjVYEJ0P.js +1 -0
  392. package/dist/showcase/assets/copyable-Cz2jW7yL.js +96 -0
  393. package/dist/showcase/assets/course-card-CvK3dw9W.js +77 -0
  394. package/dist/showcase/assets/cpu-Vk5WgcC1.js +1 -0
  395. package/dist/showcase/assets/credit-card-CaigqZGk.js +1 -0
  396. package/dist/showcase/assets/css-variables-hLaBmeMt.js +1190 -0
  397. package/dist/showcase/assets/currency-yO1giHp1.js +149 -0
  398. package/dist/showcase/assets/dark-surfaces-BPQnyk9a.js +90 -0
  399. package/dist/showcase/assets/data-view-CjjXn5VT.js +124 -0
  400. package/dist/showcase/assets/data-view-DF0n8uva.js +4 -0
  401. package/dist/showcase/assets/database-ChUBDe8E.js +1 -0
  402. package/dist/showcase/assets/date-block-DUg1Oyn4.js +1 -0
  403. package/dist/showcase/assets/date-picker-CoQPZa34.js +1 -0
  404. package/dist/showcase/assets/date-pickers-B-IUbyXw.js +73 -0
  405. package/dist/showcase/assets/dense-info-zVQSWqOU.js +106 -0
  406. package/dist/showcase/assets/design-system-consistency-Bnz_h3-6.js +264 -0
  407. package/dist/showcase/assets/dialog-BtilpgxJ.js +1 -0
  408. package/dist/showcase/assets/dialog-kf9WwmTC.js +1 -0
  409. package/dist/showcase/assets/display-utilities-BBzG5EPX.js +267 -0
  410. package/dist/showcase/assets/dist-9gFIhkw-.js +45 -0
  411. package/dist/showcase/assets/dist-CGpz_7Mu.js +1 -0
  412. package/dist/showcase/assets/dollar-sign-CWbYI3Pd.js +1 -0
  413. package/dist/showcase/assets/download-Bt_z-poH.js +1 -0
  414. package/dist/showcase/assets/dropdown-menu-C1_SYTHm.js +1 -0
  415. package/dist/showcase/assets/dropzone-D5BGVTnl.js +1 -0
  416. package/dist/showcase/assets/earth-sP5mIgG3.js +1 -0
  417. package/dist/showcase/assets/ellipsis-vertical-BD7kMOzj.js +1 -0
  418. package/dist/showcase/assets/ellipsis-yqIF49C8.js +1 -0
  419. package/dist/showcase/assets/empty-DIrJgtrh.js +1 -0
  420. package/dist/showcase/assets/empty-item-GgnZk2yf.js +49 -0
  421. package/dist/showcase/assets/empty-state-ZGKkJ6sf.js +190 -0
  422. package/dist/showcase/assets/empty-state-n_Fspzt-.js +1 -0
  423. package/dist/showcase/assets/enhanced-activities-CCw_hZnZ.js +357 -0
  424. package/dist/showcase/assets/enhanced-combobox-bBF-ADDs.js +1 -0
  425. package/dist/showcase/assets/esm-CyFPn936.js +2 -0
  426. package/dist/showcase/assets/event-calendar-Czo7yBDx.js +138 -0
  427. package/dist/showcase/assets/event-log-DJ3B3nMV.js +330 -0
  428. package/dist/showcase/assets/example-eGsLGIcp.js +1 -0
  429. package/dist/showcase/assets/external-link-DPOQEVWH.js +1 -0
  430. package/dist/showcase/assets/eye-CN92NVL0.js +1 -0
  431. package/dist/showcase/assets/feature-announcement-BXkSW17e.js +34 -0
  432. package/dist/showcase/assets/file-CFHePlKG.js +1 -0
  433. package/dist/showcase/assets/file-text--WYCYQMw.js +1 -0
  434. package/dist/showcase/assets/filter-layout-B35gGmcO.js +1 -0
  435. package/dist/showcase/assets/filters-GDW_oiT3.js +139 -0
  436. package/dist/showcase/assets/flag-XsT9XFPr.js +1 -0
  437. package/dist/showcase/assets/folder-open-RtsQ8vxf.js +1 -0
  438. package/dist/showcase/assets/form-field-Bijd1Gex.js +1 -0
  439. package/dist/showcase/assets/form-sizing-Dltt6Fj-.js +1 -0
  440. package/dist/showcase/assets/format-Ckw4OM66.js +1 -0
  441. package/dist/showcase/assets/forms-00bU7LN8.js +915 -0
  442. package/dist/showcase/assets/funnel-qu25WlXD.js +1 -0
  443. package/dist/showcase/assets/generic-Bf82Wiol.js +1 -0
  444. package/dist/showcase/assets/getPseudoElementBounds-BR4_m2HH.js +1 -0
  445. package/dist/showcase/assets/gift-D4GQoqzV.js +1 -0
  446. package/dist/showcase/assets/giftcard-cards-CMutwaAY.js +85 -0
  447. package/dist/showcase/assets/git-branch-B2QG2zRg.js +1 -0
  448. package/dist/showcase/assets/global-search-CRAB9TSF.js +1 -0
  449. package/dist/showcase/assets/global-search-DY0cKfhY.js +215 -0
  450. package/dist/showcase/assets/globe-BxZW28rG.js +1 -0
  451. package/dist/showcase/assets/gradient-card-CQGnXG8r.js +58 -0
  452. package/dist/showcase/assets/hash-CsRtIoKK.js +1 -0
  453. package/dist/showcase/assets/header-DzYOgZLP.js +1 -0
  454. package/dist/showcase/assets/header-notifications-D_CJPbvs.js +1 -0
  455. package/dist/showcase/assets/heart-B2YsYprq.js +1 -0
  456. package/dist/showcase/assets/hooks-BhUMA4Tb.js +220 -0
  457. package/dist/showcase/assets/house-HeRFNhI0.js +1 -0
  458. package/dist/showcase/assets/icon-badge-CpDkc-S0.js +37 -0
  459. package/dist/showcase/assets/icon-badge-eNEGgpAV.js +1 -0
  460. package/dist/showcase/assets/image-T88JyDag.js +1 -0
  461. package/dist/showcase/assets/inbox-DLrLLnTR.js +1 -0
  462. package/dist/showcase/assets/index-DDZl6kOS.js +10 -0
  463. package/dist/showcase/assets/index-nOkXemgw.css +2 -0
  464. package/dist/showcase/assets/inertValue-BajuuRy4.js +1 -0
  465. package/dist/showcase/assets/info-CNYfw2Yz.js +1 -0
  466. package/dist/showcase/assets/inline-stat-BN6yhDR5.js +15 -0
  467. package/dist/showcase/assets/inline-stat-Bqw3lVfk.js +1 -0
  468. package/dist/showcase/assets/input-C-9K6F0N.js +1 -0
  469. package/dist/showcase/assets/input-DaZzfkZV.js +1 -0
  470. package/dist/showcase/assets/input-group-DE-Xdhv4.js +1 -0
  471. package/dist/showcase/assets/input-group-DIQZnytn.js +47 -0
  472. package/dist/showcase/assets/inputs-Cl_JgSR4.js +155 -0
  473. package/dist/showcase/assets/installation-DdhD4Dkq.js +134 -0
  474. package/dist/showcase/assets/invoice-header-DOs2ACqQ.js +36 -0
  475. package/dist/showcase/assets/invoice-items-1EuA62mF.js +36 -0
  476. package/dist/showcase/assets/invoice-mini-vCrYEtWp.js +14 -0
  477. package/dist/showcase/assets/invoice-table--mDTs1Iz.js +30 -0
  478. package/dist/showcase/assets/isSameDay-BNB1yam4.js +1 -0
  479. package/dist/showcase/assets/isToday-BugOpGJC.js +1 -0
  480. package/dist/showcase/assets/italic-Ck4UD2ZT.js +1 -0
  481. package/dist/showcase/assets/item-BcesxqFS.js +139 -0
  482. package/dist/showcase/assets/item-BgPlwUMv.js +1 -0
  483. package/dist/showcase/assets/item-CB9k_rmo.js +1 -0
  484. package/dist/showcase/assets/kanban-cPuSVqWY.js +188 -0
  485. package/dist/showcase/assets/key-round-BmYjd5dk.js +1 -0
  486. package/dist/showcase/assets/label-BTIBJBqN.js +1 -0
  487. package/dist/showcase/assets/languages-he6FNXRs.js +1 -0
  488. package/dist/showcase/assets/layers-B_48DtOz.js +1 -0
  489. package/dist/showcase/assets/layout-app-shell-zwLv6jTP.js +608 -0
  490. package/dist/showcase/assets/layout-auth-2Zv5lr52.js +790 -0
  491. package/dist/showcase/assets/layout-containers-Dzw3xlKn.js +101 -0
  492. package/dist/showcase/assets/layout-header-TJ-WVmG3.js +203 -0
  493. package/dist/showcase/assets/layout-page-CIVQCKXK.js +314 -0
  494. package/dist/showcase/assets/layout-primitives-i_O81fzT.js +34 -0
  495. package/dist/showcase/assets/layout-sidebar-eH_pwBq_.js +224 -0
  496. package/dist/showcase/assets/layout-users-CWSaFBLj.js +117 -0
  497. package/dist/showcase/assets/layout-workspace-w3oe32GE.js +191 -0
  498. package/dist/showcase/assets/lib-CoS0xjP8.js +1 -0
  499. package/dist/showcase/assets/list-checks-DecRPpK3.js +1 -0
  500. package/dist/showcase/assets/lock-D9f8uXol.js +1 -0
  501. package/dist/showcase/assets/lock-keyhole-C20eixH6.js +1 -0
  502. package/dist/showcase/assets/mail-CVgP8Qlo.js +1 -0
  503. package/dist/showcase/assets/mail-check-mplTKcSH.js +1 -0
  504. package/dist/showcase/assets/map-B6OGeOup.js +124 -0
  505. package/dist/showcase/assets/map-pin-BZXSwrzT.js +1 -0
  506. package/dist/showcase/assets/media-library-DSlVIM1Q.js +699 -0
  507. package/dist/showcase/assets/mention-inline-suggestions-CNAEeXgy.js +1 -0
  508. package/dist/showcase/assets/mentions-Cb3g4hDN.js +138 -0
  509. package/dist/showcase/assets/menus-CE0Hlj8N.js +171 -0
  510. package/dist/showcase/assets/message-square-HliU8vbW.js +1 -0
  511. package/dist/showcase/assets/metadata-list-CJ5v5Bvc.js +286 -0
  512. package/dist/showcase/assets/metadata-list-DY92-pw2.js +1 -0
  513. package/dist/showcase/assets/metric-DxMTjIvU.js +1 -0
  514. package/dist/showcase/assets/metric-bar-cW9nWCRl.js +1 -0
  515. package/dist/showcase/assets/metric-grid-CvfO52X1.js +1 -0
  516. package/dist/showcase/assets/metric-trend-chip-BmjQdRus.js +1 -0
  517. package/dist/showcase/assets/metrics-analytics-bar-BZqB5d1y.js +44 -0
  518. package/dist/showcase/assets/metrics-analytics-cards-jAhlrQCI.js +50 -0
  519. package/dist/showcase/assets/metrics-comparison-DURZ6qEL.js +76 -0
  520. package/dist/showcase/assets/metrics-heatmap-HhJDBguh.js +27 -0
  521. package/dist/showcase/assets/metrics-inline-badge-Dq5k-P6F.js +17 -0
  522. package/dist/showcase/assets/metrics-kpi-row-DXzhwa6z.js +31 -0
  523. package/dist/showcase/assets/metrics-micro-grid-C6O5b0wP.js +42 -0
  524. package/dist/showcase/assets/metrics-overview-Hv2mseb3.js +192 -0
  525. package/dist/showcase/assets/metrics-stat-cards-CW42vBCS.js +54 -0
  526. package/dist/showcase/assets/minus-BW62vCxf.js +1 -0
  527. package/dist/showcase/assets/money-display-CAdGk5Lr.js +1 -0
  528. package/dist/showcase/assets/month-year-picker-dHuvgz1E.js +1 -0
  529. package/dist/showcase/assets/navigation-C4uSLvbZ.js +90 -0
  530. package/dist/showcase/assets/navigation-SjsZrtIc.js +231 -0
  531. package/dist/showcase/assets/navigation-extras-CMVNVskk.js +43 -0
  532. package/dist/showcase/assets/onboarding-checklist-C1jwRdMU.js +119 -0
  533. package/dist/showcase/assets/overflow-tab-bar-BYFLpl5w.js +1 -0
  534. package/dist/showcase/assets/overlays-0Y8MAz39.js +159 -0
  535. package/dist/showcase/assets/overlays-ClOnjahL.js +408 -0
  536. package/dist/showcase/assets/overview-B5ztGmTp.js +184 -0
  537. package/dist/showcase/assets/package-check-MeSw6bS4.js +1 -0
  538. package/dist/showcase/assets/package-vYJ0q0QM.js +1 -0
  539. package/dist/showcase/assets/page-4lMKtBQ7.js +1 -0
  540. package/dist/showcase/assets/page-action-button-C5-TGSzy.js +1 -0
  541. package/dist/showcase/assets/page-header-C_-KYryO.js +1 -0
  542. package/dist/showcase/assets/pagination-D3L3Iwus.js +1 -0
  543. package/dist/showcase/assets/pagination-dZXPxwHx.js +42 -0
  544. package/dist/showcase/assets/paperclip-BZhdPOw8.js +1 -0
  545. package/dist/showcase/assets/password-input-CDSMtGxt.js +1 -0
  546. package/dist/showcase/assets/pencil-DiYr3CZ9.js +1 -0
  547. package/dist/showcase/assets/phone-Dm5qzlG8.js +1 -0
  548. package/dist/showcase/assets/plus-pfGaA3St.js +1 -0
  549. package/dist/showcase/assets/popover-CjVWDO7C.js +1 -0
  550. package/dist/showcase/assets/popover-menu-JcZyGV3Y.js +1 -0
  551. package/dist/showcase/assets/popover-pZ4Jbp0s.js +1 -0
  552. package/dist/showcase/assets/products-C62MKtAR.js +423 -0
  553. package/dist/showcase/assets/progress-Btw-ZUaU.js +18 -0
  554. package/dist/showcase/assets/progress-DpB5LL6R.js +1 -0
  555. package/dist/showcase/assets/props-table-Bjc9IHmp.js +1 -0
  556. package/dist/showcase/assets/quote-DcxVd1fj.js +1 -0
  557. package/dist/showcase/assets/receipt-BHns-S5Q.js +1 -0
  558. package/dist/showcase/assets/receipt-text-L0aYasyt.js +1 -0
  559. package/dist/showcase/assets/refinement-guide-BBOGBJ4I.js +189 -0
  560. package/dist/showcase/assets/refresh-cw-z6mlm0HI.js +1 -0
  561. package/dist/showcase/assets/resolveValueLabel-hsarzg5A.js +1 -0
  562. package/dist/showcase/assets/resource-CIn_zKZ4.js +139 -0
  563. package/dist/showcase/assets/resource-DxktLgEK.js +1 -0
  564. package/dist/showcase/assets/resource-selector-card-dkcEQ6bl.js +43 -0
  565. package/dist/showcase/assets/rich-text-editor-Dd-rWisw.js +124 -0
  566. package/dist/showcase/assets/rich-text-editor-DvJMFj48.js +143 -0
  567. package/dist/showcase/assets/rotate-ccw-DEz6nb5P.js +1 -0
  568. package/dist/showcase/assets/route-BeXaXTk8.js +1 -0
  569. package/dist/showcase/assets/save-EE7Tc5OT.js +1 -0
  570. package/dist/showcase/assets/schema-form-RK9Zpz1E.js +327 -0
  571. package/dist/showcase/assets/scroll-area-BejQJ0Q1.js +32 -0
  572. package/dist/showcase/assets/scroll-area-DS8LJ7LG.js +1 -0
  573. package/dist/showcase/assets/section-Cv8i4DIx.js +1 -0
  574. package/dist/showcase/assets/select-Cuy3YKW9.js +1 -0
  575. package/dist/showcase/assets/select-qFy1jm91.js +1 -0
  576. package/dist/showcase/assets/send-CXv0ST9u.js +1 -0
  577. package/dist/showcase/assets/separator-CecGyBaV.js +1 -0
  578. package/dist/showcase/assets/separator-CqtFQXrk.js +28 -0
  579. package/dist/showcase/assets/settings-2-CCeMwMOj.js +1 -0
  580. package/dist/showcase/assets/settings-CXjN6wTC.js +1 -0
  581. package/dist/showcase/assets/sheet-Csyrmkqp.js +1 -0
  582. package/dist/showcase/assets/shield-DR0ZfAFA.js +1 -0
  583. package/dist/showcase/assets/shield-alert-Bp1iFJ2q.js +1 -0
  584. package/dist/showcase/assets/shield-check-ClL4B_Cd.js +1 -0
  585. package/dist/showcase/assets/shopping-bag-DnSmbPUX.js +1 -0
  586. package/dist/showcase/assets/showcase-CQKt5VGi.js +132 -0
  587. package/dist/showcase/assets/sidebar-CXy94md1.js +1 -0
  588. package/dist/showcase/assets/sidebar.context-C8gkOwJ5.js +1 -0
  589. package/dist/showcase/assets/skeleton-B8wC5P66.js +29 -0
  590. package/dist/showcase/assets/skeleton-DBlCLlBC.js +1 -0
  591. package/dist/showcase/assets/slider-BcjkNx6W.js +1 -0
  592. package/dist/showcase/assets/smart-card-Cg6rtWH9.js +1 -0
  593. package/dist/showcase/assets/sonner-ZGBQ13wS.js +22 -0
  594. package/dist/showcase/assets/sortable.esm-CGFWc-Cn.js +5 -0
  595. package/dist/showcase/assets/sparkles-q1-9JZqa.js +1 -0
  596. package/dist/showcase/assets/spinner-CKg8QLHu.js +1 -0
  597. package/dist/showcase/assets/spinner-D1Ao9j9T.js +49 -0
  598. package/dist/showcase/assets/spinner-oahLIkgb.js +30 -0
  599. package/dist/showcase/assets/square-pen-DZ3bQJia.js +1 -0
  600. package/dist/showcase/assets/stacked-avatars-CKPtb3Hj.js +1 -0
  601. package/dist/showcase/assets/star-suetD-KI.js +1 -0
  602. package/dist/showcase/assets/startOfDay-OjIsUeiv.js +1 -0
  603. package/dist/showcase/assets/styles-1mYOoC2k.js +1 -0
  604. package/dist/showcase/assets/suggestions-DLYaI-In.js +126 -0
  605. package/dist/showcase/assets/switch-CTTrJNwo.js +1 -0
  606. package/dist/showcase/assets/switch-ChJWWmxN.js +1 -0
  607. package/dist/showcase/assets/sync-DsHYydvo.js +124 -0
  608. package/dist/showcase/assets/table-Ck2ptin2.js +686 -0
  609. package/dist/showcase/assets/table-DyJ9oADQ.js +1 -0
  610. package/dist/showcase/assets/table-actions-COU4zHfh.js +1 -0
  611. package/dist/showcase/assets/tabs-Bl_RHGIw.js +1 -0
  612. package/dist/showcase/assets/tabs-DS-4VSkb.js +19 -0
  613. package/dist/showcase/assets/tags-input-BlYzb5fF.js +1 -0
  614. package/dist/showcase/assets/text-button-OPdNs3fb.js +1 -0
  615. package/dist/showcase/assets/text-link-D27gqGeg.js +1 -0
  616. package/dist/showcase/assets/textarea-DpC7J5F-.js +1 -0
  617. package/dist/showcase/assets/textarea-JtXUjxvc.js +1 -0
  618. package/dist/showcase/assets/timelines-DQM-B4Xo.js +200 -0
  619. package/dist/showcase/assets/toggle-group-CMneKREH.js +1 -0
  620. package/dist/showcase/assets/toggles-CAXXgjO_.js +71 -0
  621. package/dist/showcase/assets/toggles-group-CHRqrpoM.js +32 -0
  622. package/dist/showcase/assets/tooltip-CwGZAioX.js +31 -0
  623. package/dist/showcase/assets/trash-2-BpMb9Zbb.js +1 -0
  624. package/dist/showcase/assets/trending-up-B1BzitCg.js +1 -0
  625. package/dist/showcase/assets/truck-CDSE5-HZ.js +1 -0
  626. package/dist/showcase/assets/typography-BoNJ1hRZ.js +223 -0
  627. package/dist/showcase/assets/ui-badge-Djh6NiB2.js +28 -0
  628. package/dist/showcase/assets/ui-card-QC_rl_H2.js +30 -0
  629. package/dist/showcase/assets/ui-table-qAGsc3qN.js +42 -0
  630. package/dist/showcase/assets/upload-tray-DKCJgW5u.js +138 -0
  631. package/dist/showcase/assets/use-layout-link-BPlsZ8Ys.js +1 -0
  632. package/dist/showcase/assets/useAnchoredPopupScrollLock-526MebAC.js +1 -0
  633. package/dist/showcase/assets/useAriaLabelledBy-CqySZiH9.js +1 -0
  634. package/dist/showcase/assets/useCollapsiblePanel-DWX7LbGX.js +1 -0
  635. package/dist/showcase/assets/useCompositeItem-DGEBUXgE.js +1 -0
  636. package/dist/showcase/assets/useCompositeListItem-B2nuNlc2.js +1 -0
  637. package/dist/showcase/assets/useLabelableId-DY4O1lpt.js +1 -0
  638. package/dist/showcase/assets/useOpenInteractionType-DxwujDvt.js +1 -0
  639. package/dist/showcase/assets/useRender-BPoNv-Lm.js +1 -0
  640. package/dist/showcase/assets/useTriggerFocusGuards-BnOSAjfy.js +1 -0
  641. package/dist/showcase/assets/useValueChanged-CXmDOWxx.js +1 -0
  642. package/dist/showcase/assets/user-BGchdtV_.js +1 -0
  643. package/dist/showcase/assets/user-plus-BifI_xVA.js +1 -0
  644. package/dist/showcase/assets/users-Cl5yYqdg.js +1 -0
  645. package/dist/showcase/assets/vendor-profile-BNW4FYna.js +37 -0
  646. package/dist/showcase/assets/video-BtQPixYN.js +1 -0
  647. package/dist/showcase/assets/wrench-CRalc5fG.js +1 -0
  648. package/dist/showcase/assets/x-D6hUY89S.js +1 -0
  649. package/dist/showcase/assets/zap-v_qbqeI5.js +1 -0
  650. package/dist/showcase/index.html +2 -2
  651. package/dist/style.css +1 -1
  652. package/package.json +1 -1
  653. package/src/css/themes/shadcn.default.css +6 -6
  654. package/src/css/tokens/foundation.css +6 -6
  655. package/dist/_shared/accordion-B9EjlZLY.js +0 -135
  656. package/dist/_shared/accordion-B9EjlZLY.js.map +0 -1
  657. package/dist/_shared/accordion-IFDIc0E7.cjs +0 -2
  658. package/dist/_shared/accordion-IFDIc0E7.cjs.map +0 -1
  659. package/dist/_shared/action-menu-B6yFRDz1.cjs +0 -2
  660. package/dist/_shared/action-menu-B6yFRDz1.cjs.map +0 -1
  661. package/dist/_shared/action-menu-CNS-fwQr.js +0 -96
  662. package/dist/_shared/action-menu-CNS-fwQr.js.map +0 -1
  663. package/dist/_shared/ai-artifact-B3qhuiKC.js +0 -1099
  664. package/dist/_shared/ai-artifact-B3qhuiKC.js.map +0 -1
  665. package/dist/_shared/ai-artifact-Dtr0bnVq.cjs +0 -3
  666. package/dist/_shared/ai-artifact-Dtr0bnVq.cjs.map +0 -1
  667. package/dist/_shared/alert-V0V36Sny.cjs +0 -2
  668. package/dist/_shared/alert-V0V36Sny.cjs.map +0 -1
  669. package/dist/_shared/alert-m-4s0Hqq.js +0 -81
  670. package/dist/_shared/alert-m-4s0Hqq.js.map +0 -1
  671. package/dist/_shared/app-shell-D3eGUtL-.js +0 -69
  672. package/dist/_shared/app-shell-D3eGUtL-.js.map +0 -1
  673. package/dist/_shared/app-shell-QJHARDMB.cjs +0 -2
  674. package/dist/_shared/app-shell-QJHARDMB.cjs.map +0 -1
  675. package/dist/_shared/auth-DdezEtKK.cjs +0 -2
  676. package/dist/_shared/auth-DdezEtKK.cjs.map +0 -1
  677. package/dist/_shared/auth-e7yab9pK.js +0 -643
  678. package/dist/_shared/auth-e7yab9pK.js.map +0 -1
  679. package/dist/_shared/badge-BeSKxX1u.cjs +0 -2
  680. package/dist/_shared/badge-BeSKxX1u.cjs.map +0 -1
  681. package/dist/_shared/badge-a2Z3K5aQ.js +0 -110
  682. package/dist/_shared/badge-a2Z3K5aQ.js.map +0 -1
  683. package/dist/_shared/breadcrumbs-AyLzxCJZ.cjs +0 -2
  684. package/dist/_shared/breadcrumbs-AyLzxCJZ.cjs.map +0 -1
  685. package/dist/_shared/breadcrumbs-B57Unsoe.js +0 -105
  686. package/dist/_shared/breadcrumbs-B57Unsoe.js.map +0 -1
  687. package/dist/_shared/button-Bd5bEIiB.cjs +0 -2
  688. package/dist/_shared/button-Bd5bEIiB.cjs.map +0 -1
  689. package/dist/_shared/button-DHksjMvc.js +0 -189
  690. package/dist/_shared/button-DHksjMvc.js.map +0 -1
  691. package/dist/_shared/buttons-Bek9F7qK.cjs +0 -2
  692. package/dist/_shared/buttons-Bek9F7qK.cjs.map +0 -1
  693. package/dist/_shared/buttons-DcynMPnE.js +0 -137
  694. package/dist/_shared/buttons-DcynMPnE.js.map +0 -1
  695. package/dist/_shared/card-radio-group-C2p_iBal.cjs +0 -2
  696. package/dist/_shared/card-radio-group-C2p_iBal.cjs.map +0 -1
  697. package/dist/_shared/card-radio-group-Fdi1Cz1j.js +0 -150
  698. package/dist/_shared/card-radio-group-Fdi1Cz1j.js.map +0 -1
  699. package/dist/_shared/cards-CbbHly7W.cjs +0 -2
  700. package/dist/_shared/cards-CbbHly7W.cjs.map +0 -1
  701. package/dist/_shared/cards-RZxRLx3f.js +0 -355
  702. package/dist/_shared/cards-RZxRLx3f.js.map +0 -1
  703. package/dist/_shared/combobox-BIe72dV3.js +0 -954
  704. package/dist/_shared/combobox-BIe72dV3.js.map +0 -1
  705. package/dist/_shared/combobox-CJiFDoTi.cjs +0 -2
  706. package/dist/_shared/combobox-CJiFDoTi.cjs.map +0 -1
  707. package/dist/_shared/comments-BJqgvSFY.js +0 -952
  708. package/dist/_shared/comments-BJqgvSFY.js.map +0 -1
  709. package/dist/_shared/comments-BjPciQfo.cjs +0 -2
  710. package/dist/_shared/comments-BjPciQfo.cjs.map +0 -1
  711. package/dist/_shared/containers-D7oZE4XI.cjs +0 -2
  712. package/dist/_shared/containers-D7oZE4XI.cjs.map +0 -1
  713. package/dist/_shared/containers-anBivbL9.js +0 -19
  714. package/dist/_shared/containers-anBivbL9.js.map +0 -1
  715. package/dist/_shared/content-container-CVUJCLhn.cjs +0 -2
  716. package/dist/_shared/content-container-CVUJCLhn.cjs.map +0 -1
  717. package/dist/_shared/content-container-Dv8XsAw4.js +0 -33
  718. package/dist/_shared/content-container-Dv8XsAw4.js.map +0 -1
  719. package/dist/_shared/copyable-Dopk9pEJ.js +0 -38
  720. package/dist/_shared/copyable-Dopk9pEJ.js.map +0 -1
  721. package/dist/_shared/copyable-rQwxsTJ3.cjs +0 -2
  722. package/dist/_shared/copyable-rQwxsTJ3.cjs.map +0 -1
  723. package/dist/_shared/data-display-C21skrV4.cjs +0 -2
  724. package/dist/_shared/data-display-C21skrV4.cjs.map +0 -1
  725. package/dist/_shared/data-display-C5-1dZua.js +0 -1873
  726. package/dist/_shared/data-display-C5-1dZua.js.map +0 -1
  727. package/dist/_shared/date-picker-BiUgIkjP.cjs +0 -2
  728. package/dist/_shared/date-picker-BiUgIkjP.cjs.map +0 -1
  729. package/dist/_shared/date-picker-DFkLiveH.js +0 -1361
  730. package/dist/_shared/date-picker-DFkLiveH.js.map +0 -1
  731. package/dist/_shared/date-pickers-C86tVD8e.cjs +0 -2
  732. package/dist/_shared/date-pickers-C86tVD8e.cjs.map +0 -1
  733. package/dist/_shared/date-pickers-D4oxOOHE.js +0 -329
  734. package/dist/_shared/date-pickers-D4oxOOHE.js.map +0 -1
  735. package/dist/_shared/display-B0wLVN8t.js +0 -986
  736. package/dist/_shared/display-B0wLVN8t.js.map +0 -1
  737. package/dist/_shared/display-Bin2vVex.cjs +0 -2
  738. package/dist/_shared/display-Bin2vVex.cjs.map +0 -1
  739. package/dist/_shared/form-sizing-C51oI3Di.js +0 -42
  740. package/dist/_shared/form-sizing-C51oI3Di.js.map +0 -1
  741. package/dist/_shared/form-sizing-Co53Drri.cjs +0 -2
  742. package/dist/_shared/form-sizing-Co53Drri.cjs.map +0 -1
  743. package/dist/_shared/forms-BoquZE2Y.js +0 -3533
  744. package/dist/_shared/forms-BoquZE2Y.js.map +0 -1
  745. package/dist/_shared/forms-CzrEYejY.cjs +0 -2
  746. package/dist/_shared/forms-CzrEYejY.cjs.map +0 -1
  747. package/dist/_shared/header-CxhEtk9M.cjs +0 -2
  748. package/dist/_shared/header-CxhEtk9M.cjs.map +0 -1
  749. package/dist/_shared/header-h3f14vQx.js +0 -447
  750. package/dist/_shared/header-h3f14vQx.js.map +0 -1
  751. package/dist/_shared/hooks-CS55-w3h.js +0 -95
  752. package/dist/_shared/hooks-CS55-w3h.js.map +0 -1
  753. package/dist/_shared/hooks-sfHAyDgD.cjs +0 -2
  754. package/dist/_shared/hooks-sfHAyDgD.cjs.map +0 -1
  755. package/dist/_shared/input-CB6hxh-5.cjs +0 -2
  756. package/dist/_shared/input-CB6hxh-5.cjs.map +0 -1
  757. package/dist/_shared/input-CfnHBT--.js +0 -182
  758. package/dist/_shared/input-CfnHBT--.js.map +0 -1
  759. package/dist/_shared/item-Xs-fgzaT.js +0 -226
  760. package/dist/_shared/item-Xs-fgzaT.js.map +0 -1
  761. package/dist/_shared/item-eUP9Rtmg.cjs +0 -2
  762. package/dist/_shared/item-eUP9Rtmg.cjs.map +0 -1
  763. package/dist/_shared/layout.types-CYuDZ_4h.cjs +0 -2
  764. package/dist/_shared/layout.types-CYuDZ_4h.cjs.map +0 -1
  765. package/dist/_shared/layout.types-j7zZAPtg.js +0 -28
  766. package/dist/_shared/layout.types-j7zZAPtg.js.map +0 -1
  767. package/dist/_shared/mentions-BahbwDwU.js +0 -506
  768. package/dist/_shared/mentions-BahbwDwU.js.map +0 -1
  769. package/dist/_shared/mentions-aHalksbt.cjs +0 -2
  770. package/dist/_shared/mentions-aHalksbt.cjs.map +0 -1
  771. package/dist/_shared/money-display-BLPNMmiT.cjs +0 -2
  772. package/dist/_shared/money-display-BLPNMmiT.cjs.map +0 -1
  773. package/dist/_shared/money-display-D_-Cb8-9.js +0 -198
  774. package/dist/_shared/money-display-D_-Cb8-9.js.map +0 -1
  775. package/dist/_shared/navigation-BcYAwgzo.js +0 -436
  776. package/dist/_shared/navigation-BcYAwgzo.js.map +0 -1
  777. package/dist/_shared/navigation-DAB7uuBj.cjs +0 -2
  778. package/dist/_shared/navigation-DAB7uuBj.cjs.map +0 -1
  779. package/dist/_shared/overlays-DW8OIK5R.js +0 -735
  780. package/dist/_shared/overlays-DW8OIK5R.js.map +0 -1
  781. package/dist/_shared/overlays-Du65iCkx.cjs +0 -2
  782. package/dist/_shared/overlays-Du65iCkx.cjs.map +0 -1
  783. package/dist/_shared/page-D8UMXREv.cjs +0 -2
  784. package/dist/_shared/page-D8UMXREv.cjs.map +0 -1
  785. package/dist/_shared/page-D9LNsHMN.js +0 -262
  786. package/dist/_shared/page-D9LNsHMN.js.map +0 -1
  787. package/dist/_shared/popover-menu-qxBZlTck.js +0 -93
  788. package/dist/_shared/popover-menu-qxBZlTck.js.map +0 -1
  789. package/dist/_shared/popover-menu-z9QTjl4o.cjs +0 -2
  790. package/dist/_shared/popover-menu-z9QTjl4o.cjs.map +0 -1
  791. package/dist/_shared/rich-text-editor-DeIiIDn7.cjs +0 -2
  792. package/dist/_shared/rich-text-editor-DeIiIDn7.cjs.map +0 -1
  793. package/dist/_shared/rich-text-editor-VIBlL0x3.js +0 -620
  794. package/dist/_shared/rich-text-editor-VIBlL0x3.js.map +0 -1
  795. package/dist/_shared/settings-BeZOIEJB.js +0 -143
  796. package/dist/_shared/settings-BeZOIEJB.js.map +0 -1
  797. package/dist/_shared/settings-DI-K34bW.cjs +0 -2
  798. package/dist/_shared/settings-DI-K34bW.cjs.map +0 -1
  799. package/dist/_shared/sidebar-DfToCaiC.cjs +0 -2
  800. package/dist/_shared/sidebar-DfToCaiC.cjs.map +0 -1
  801. package/dist/_shared/sidebar-DhpRdTZH.js +0 -541
  802. package/dist/_shared/sidebar-DhpRdTZH.js.map +0 -1
  803. package/dist/_shared/spinner-D35zNriU.cjs +0 -2
  804. package/dist/_shared/spinner-D35zNriU.cjs.map +0 -1
  805. package/dist/_shared/spinner-DMC2IIml.js +0 -67
  806. package/dist/_shared/spinner-DMC2IIml.js.map +0 -1
  807. package/dist/_shared/table-B_pqCQxC.js +0 -1377
  808. package/dist/_shared/table-B_pqCQxC.js.map +0 -1
  809. package/dist/_shared/table-CGVOXtdv.cjs +0 -2
  810. package/dist/_shared/table-CGVOXtdv.cjs.map +0 -1
  811. package/dist/_shared/textarea-B24qgdmd.cjs +0 -2
  812. package/dist/_shared/textarea-B24qgdmd.cjs.map +0 -1
  813. package/dist/_shared/textarea-ChLRmmVU.js +0 -118
  814. package/dist/_shared/textarea-ChLRmmVU.js.map +0 -1
  815. package/dist/_shared/typography-CO9uwZhF.cjs +0 -2
  816. package/dist/_shared/typography-CO9uwZhF.cjs.map +0 -1
  817. package/dist/_shared/typography-DE0NGEIE.js +0 -201
  818. package/dist/_shared/typography-DE0NGEIE.js.map +0 -1
  819. package/dist/_shared/workspace-BgtWS9fA.cjs +0 -2
  820. package/dist/_shared/workspace-BgtWS9fA.cjs.map +0 -1
  821. package/dist/_shared/workspace-D2jJ0PlS.js +0 -357
  822. package/dist/_shared/workspace-D2jJ0PlS.js.map +0 -1
  823. package/dist/showcase/assets/AreaChart-Y0ZwblHU.js +0 -6
  824. package/dist/showcase/assets/CompositeItem-BIY_Cp7P.js +0 -1
  825. package/dist/showcase/assets/CompositeRoot-DSPvBRQr.js +0 -1
  826. package/dist/showcase/assets/DialogTrigger-DHUp8vXe.js +0 -1
  827. package/dist/showcase/assets/LabelableContext-CasUI4hR.js +0 -1
  828. package/dist/showcase/assets/PreviewLayout-B_l930k0.js +0 -1
  829. package/dist/showcase/assets/RadioGroup-BgZ-UH79.js +0 -1
  830. package/dist/showcase/assets/ScrollAreaCorner-BbwFElLA.js +0 -1
  831. package/dist/showcase/assets/Separator-dQuencsA.js +0 -1
  832. package/dist/showcase/assets/ToolbarRootContext-BE0hbejq.js +0 -1
  833. package/dist/showcase/assets/accordion-D93ZNsLn.js +0 -171
  834. package/dist/showcase/assets/accordion-variants-Bl4bIQH4.js +0 -1
  835. package/dist/showcase/assets/action-menu--rEgMzDi.js +0 -1
  836. package/dist/showcase/assets/actions-3iedOWD9.js +0 -310
  837. package/dist/showcase/assets/activities-CyrAWFlu.js +0 -500
  838. package/dist/showcase/assets/activities-feed-card-bhIATc2O.js +0 -1
  839. package/dist/showcase/assets/admin-CZzNsj2q.js +0 -140
  840. package/dist/showcase/assets/ai-CasHwkW4.js +0 -207
  841. package/dist/showcase/assets/ai-artifact-BgWvrLAb.js +0 -2
  842. package/dist/showcase/assets/ai-chat-seS9aW-1.js +0 -568
  843. package/dist/showcase/assets/ai-elements-Tku5_ous.js +0 -387
  844. package/dist/showcase/assets/ai-tool-call-BU6xbmXG.js +0 -1
  845. package/dist/showcase/assets/alert-6Emt6KX2.js +0 -1
  846. package/dist/showcase/assets/alert-B6aLWiRW.js +0 -62
  847. package/dist/showcase/assets/alert-CtoTQ0vN.js +0 -93
  848. package/dist/showcase/assets/api-key-list-C0glWR3z.js +0 -1
  849. package/dist/showcase/assets/api-key-list-DcWSbY3u.js +0 -73
  850. package/dist/showcase/assets/app-sidebar-D_eNP_jh.js +0 -1
  851. package/dist/showcase/assets/arrow-down-qyKZ1H5j.js +0 -1
  852. package/dist/showcase/assets/arrow-left-C9I0h_su.js +0 -1
  853. package/dist/showcase/assets/arrow-right-DswaRsr6.js +0 -1
  854. package/dist/showcase/assets/arrow-up-5BijPOxK.js +0 -1
  855. package/dist/showcase/assets/arrow-up-right-CbVVNT6g.js +0 -1
  856. package/dist/showcase/assets/avatar-BYHVCvVW.js +0 -67
  857. package/dist/showcase/assets/avatar-BlLAVC87.js +0 -1
  858. package/dist/showcase/assets/avatar-DQTXjcS4.js +0 -1
  859. package/dist/showcase/assets/avatar-DveZy09C.js +0 -57
  860. package/dist/showcase/assets/badge-Bth3mRTh.js +0 -31
  861. package/dist/showcase/assets/badge-check-DocF8Ho3.js +0 -1
  862. package/dist/showcase/assets/bell-DXBoeAzi.js +0 -1
  863. package/dist/showcase/assets/bot-Ch-Y1HK8.js +0 -1
  864. package/dist/showcase/assets/box-72m9QSDa.js +0 -1
  865. package/dist/showcase/assets/braces-CC17X3TE.js +0 -1
  866. package/dist/showcase/assets/brain-Dvbla_5x.js +0 -1
  867. package/dist/showcase/assets/brand-D5ciAq8v.js +0 -36
  868. package/dist/showcase/assets/breadcrumb-BBCaOVyz.js +0 -52
  869. package/dist/showcase/assets/breadcrumb-Bt8yVTCj.js +0 -1
  870. package/dist/showcase/assets/breadcrumbs-CkVWfcAN.js +0 -1
  871. package/dist/showcase/assets/briefcase-8rQTJwpE.js +0 -1
  872. package/dist/showcase/assets/building-2-CV7gTtXz.js +0 -1
  873. package/dist/showcase/assets/button-HGjoBio3.js +0 -44
  874. package/dist/showcase/assets/button-group-LWToSCrp.js +0 -1
  875. package/dist/showcase/assets/buttons-Bn_dX6Kk.js +0 -272
  876. package/dist/showcase/assets/calendar-BTsffmY8.js +0 -1
  877. package/dist/showcase/assets/calendar-Bhpyn4u0.js +0 -1
  878. package/dist/showcase/assets/calendar-DjrUTKcD.js +0 -16
  879. package/dist/showcase/assets/calendar-days-BKCkzWjV.js +0 -1
  880. package/dist/showcase/assets/camera-EjpDG3mc.js +0 -1
  881. package/dist/showcase/assets/card-Bp6iGuOF.js +0 -188
  882. package/dist/showcase/assets/card-CHc6AVFt.js +0 -1
  883. package/dist/showcase/assets/card-primitives-Bv6XGPJd.js +0 -1
  884. package/dist/showcase/assets/card-radio-group-Ce9FsiSv.js +0 -1
  885. package/dist/showcase/assets/cards-_CGG9zir.js +0 -354
  886. package/dist/showcase/assets/carousel-BVbsKH2W.js +0 -449
  887. package/dist/showcase/assets/cell-renderers-CosD6Gby.js +0 -1
  888. package/dist/showcase/assets/chart-CwOp8Sf8.js +0 -358
  889. package/dist/showcase/assets/chart-column-sz871NdJ.js +0 -1
  890. package/dist/showcase/assets/checkbox-BO38TYqr.js +0 -1
  891. package/dist/showcase/assets/checkbox-W4MhlPlJ.js +0 -1
  892. package/dist/showcase/assets/chevron-down-BFh1Fz2P.js +0 -1
  893. package/dist/showcase/assets/chevron-left-C5_X5glO.js +0 -1
  894. package/dist/showcase/assets/chevron-up-DPH3boVS.js +0 -1
  895. package/dist/showcase/assets/chevrons-up-down-CM5mIDaw.js +0 -1
  896. package/dist/showcase/assets/circle-BFDzL1iF.js +0 -1
  897. package/dist/showcase/assets/circle-alert-C6MbOB0m.js +0 -1
  898. package/dist/showcase/assets/circle-check-C0X85t4j.js +0 -1
  899. package/dist/showcase/assets/circle-check-big-CBaodck_.js +0 -1
  900. package/dist/showcase/assets/circle-dot-DdRpIhnL.js +0 -1
  901. package/dist/showcase/assets/circle-question-mark-CKlcead7.js +0 -1
  902. package/dist/showcase/assets/circle-x-MO44aKHe.js +0 -1
  903. package/dist/showcase/assets/clock-3-CXQJFcbh.js +0 -1
  904. package/dist/showcase/assets/clock-GhBJJ6n1.js +0 -1
  905. package/dist/showcase/assets/code-xml-BSX7Qyi5.js +0 -1
  906. package/dist/showcase/assets/collapsible-CZLTO5EH.js +0 -1
  907. package/dist/showcase/assets/collapsible-LrDO_sSQ.js +0 -27
  908. package/dist/showcase/assets/combobox-TmDBXkM-.js +0 -685
  909. package/dist/showcase/assets/command-9-r1qrJt.js +0 -1
  910. package/dist/showcase/assets/command-DGne3l9s.js +0 -1
  911. package/dist/showcase/assets/comment-composer-BI0qnvuY.js +0 -1
  912. package/dist/showcase/assets/comment-item-Cedds6Lm.js +0 -1
  913. package/dist/showcase/assets/comments-De02NOns.js +0 -357
  914. package/dist/showcase/assets/commerce-DldtS83o.js +0 -267
  915. package/dist/showcase/assets/composite-BjZZlzzb.js +0 -1
  916. package/dist/showcase/assets/contact-card-muCZ3uXV.js +0 -65
  917. package/dist/showcase/assets/content-container-BxSLICeL.js +0 -1
  918. package/dist/showcase/assets/copyable-DYhhmTqM.js +0 -1
  919. package/dist/showcase/assets/copyable-MNU75-J9.js +0 -96
  920. package/dist/showcase/assets/course-card-Dl1wsuJx.js +0 -77
  921. package/dist/showcase/assets/cpu-CsWq4fcX.js +0 -1
  922. package/dist/showcase/assets/credit-card-B0AUZiWw.js +0 -1
  923. package/dist/showcase/assets/css-variables-Be7DzahT.js +0 -1190
  924. package/dist/showcase/assets/currency-BtPM_Xtw.js +0 -149
  925. package/dist/showcase/assets/dark-surfaces-DRFERSEv.js +0 -90
  926. package/dist/showcase/assets/data-view-DmWd0h7G.js +0 -4
  927. package/dist/showcase/assets/data-view-DnLH2o0i.js +0 -124
  928. package/dist/showcase/assets/database-C0YqGaQ_.js +0 -1
  929. package/dist/showcase/assets/date-block-BQH25FLS.js +0 -1
  930. package/dist/showcase/assets/date-picker-BF-jevhh.js +0 -1
  931. package/dist/showcase/assets/date-pickers-q2v3ajJm.js +0 -73
  932. package/dist/showcase/assets/dense-info-Cb-roqDU.js +0 -106
  933. package/dist/showcase/assets/design-system-consistency-DMSJknaM.js +0 -264
  934. package/dist/showcase/assets/dialog-C0ALRmbP.js +0 -1
  935. package/dist/showcase/assets/dialog-CbXon08k.js +0 -1
  936. package/dist/showcase/assets/display-utilities-kBUVw7o3.js +0 -267
  937. package/dist/showcase/assets/dist-CTSkWj_M.js +0 -45
  938. package/dist/showcase/assets/dist-W8bxVfew.js +0 -1
  939. package/dist/showcase/assets/dollar-sign-VNxVZleW.js +0 -1
  940. package/dist/showcase/assets/download-Ds_6eIpx.js +0 -1
  941. package/dist/showcase/assets/dropdown-menu-C1G_y9dv.js +0 -1
  942. package/dist/showcase/assets/dropzone-CxOLmdkt.js +0 -1
  943. package/dist/showcase/assets/earth-HLyEI1oq.js +0 -1
  944. package/dist/showcase/assets/ellipsis-BLyAd9A-.js +0 -1
  945. package/dist/showcase/assets/ellipsis-vertical-TG4mYU2J.js +0 -1
  946. package/dist/showcase/assets/empty-B54k9xAG.js +0 -1
  947. package/dist/showcase/assets/empty-item-BmA4rmq7.js +0 -49
  948. package/dist/showcase/assets/empty-state-CH7gjjg7.js +0 -190
  949. package/dist/showcase/assets/empty-state-hUKvmKa-.js +0 -1
  950. package/dist/showcase/assets/enhanced-activities-BRDVL9RR.js +0 -357
  951. package/dist/showcase/assets/enhanced-combobox-2wbQJS6R.js +0 -1
  952. package/dist/showcase/assets/esm-CUTefMLr.js +0 -2
  953. package/dist/showcase/assets/event-calendar-Bf9xFZlt.js +0 -138
  954. package/dist/showcase/assets/event-log-CeRDSL-h.js +0 -330
  955. package/dist/showcase/assets/example-CJMJcnb4.js +0 -1
  956. package/dist/showcase/assets/external-link-CvXhYrnd.js +0 -1
  957. package/dist/showcase/assets/eye-Cl_GfUKH.js +0 -1
  958. package/dist/showcase/assets/feature-announcement-Dw0SokLo.js +0 -34
  959. package/dist/showcase/assets/file-CJFWrwy1.js +0 -1
  960. package/dist/showcase/assets/file-text-BTTFP8Jo.js +0 -1
  961. package/dist/showcase/assets/filter-layout-DUVqG5Ql.js +0 -1
  962. package/dist/showcase/assets/filters-BLcCaplV.js +0 -139
  963. package/dist/showcase/assets/flag-BxI3EGPG.js +0 -1
  964. package/dist/showcase/assets/folder-open-4d8qsiAj.js +0 -1
  965. package/dist/showcase/assets/form-field-Dhy0eM5B.js +0 -1
  966. package/dist/showcase/assets/form-sizing-C3UG5WKC.js +0 -1
  967. package/dist/showcase/assets/format-zGqa9Olc.js +0 -1
  968. package/dist/showcase/assets/forms-D99qG5Gb.js +0 -915
  969. package/dist/showcase/assets/funnel-Cg7SOShf.js +0 -1
  970. package/dist/showcase/assets/generic-CfrG943t.js +0 -1
  971. package/dist/showcase/assets/getPseudoElementBounds-lw5shsdM.js +0 -1
  972. package/dist/showcase/assets/gift-BXtKbzvA.js +0 -1
  973. package/dist/showcase/assets/giftcard-cards-CqYaN0jC.js +0 -85
  974. package/dist/showcase/assets/git-branch-BWAuIMOQ.js +0 -1
  975. package/dist/showcase/assets/global-search-CHUva8pR.js +0 -1
  976. package/dist/showcase/assets/global-search-Df7JovOG.js +0 -215
  977. package/dist/showcase/assets/globe-CvIW_foU.js +0 -1
  978. package/dist/showcase/assets/gradient-card-CdM2J1Hv.js +0 -58
  979. package/dist/showcase/assets/hash-wBs5gyr_.js +0 -1
  980. package/dist/showcase/assets/header-DXPFmpUT.js +0 -1
  981. package/dist/showcase/assets/header-notifications-FsnCJLpe.js +0 -1
  982. package/dist/showcase/assets/heart-B4fOMIr6.js +0 -1
  983. package/dist/showcase/assets/hooks-DtMOMalj.js +0 -220
  984. package/dist/showcase/assets/house-hebmAxEE.js +0 -1
  985. package/dist/showcase/assets/icon-badge-DrZ5qGpa.js +0 -1
  986. package/dist/showcase/assets/icon-badge-JEug_P_U.js +0 -37
  987. package/dist/showcase/assets/image-CxNywgkb.js +0 -1
  988. package/dist/showcase/assets/inbox-DqAmGdDd.js +0 -1
  989. package/dist/showcase/assets/index-DujM0kEF.css +0 -2
  990. package/dist/showcase/assets/index-jD-KSiHu.js +0 -10
  991. package/dist/showcase/assets/inertValue-Dg9TwvOb.js +0 -1
  992. package/dist/showcase/assets/info-B5fZn_ZC.js +0 -1
  993. package/dist/showcase/assets/inline-stat-CklKufoA.js +0 -1
  994. package/dist/showcase/assets/inline-stat-Dep7oHIi.js +0 -15
  995. package/dist/showcase/assets/input-CkNgwwCs.js +0 -1
  996. package/dist/showcase/assets/input-DAPMRlKO.js +0 -1
  997. package/dist/showcase/assets/input-group-06D68uB6.js +0 -47
  998. package/dist/showcase/assets/input-group-Bq9aXQPG.js +0 -1
  999. package/dist/showcase/assets/inputs-C8G3y-zR.js +0 -155
  1000. package/dist/showcase/assets/installation-BV5xOvoE.js +0 -134
  1001. package/dist/showcase/assets/invoice-header-BcUxzT68.js +0 -36
  1002. package/dist/showcase/assets/invoice-items-B42Jfxl7.js +0 -36
  1003. package/dist/showcase/assets/invoice-mini-RJGdlErg.js +0 -14
  1004. package/dist/showcase/assets/invoice-table--MdP6ysv.js +0 -30
  1005. package/dist/showcase/assets/isSameDay-srttAIjD.js +0 -1
  1006. package/dist/showcase/assets/isToday-BPub5Zvi.js +0 -1
  1007. package/dist/showcase/assets/italic-1BNA_XlU.js +0 -1
  1008. package/dist/showcase/assets/item-B9KyqUGa.js +0 -139
  1009. package/dist/showcase/assets/item-DoIlPm6J.js +0 -1
  1010. package/dist/showcase/assets/item-ffIfXEGd.js +0 -1
  1011. package/dist/showcase/assets/kanban-Cfad3edR.js +0 -188
  1012. package/dist/showcase/assets/key-round-J11Zc216.js +0 -1
  1013. package/dist/showcase/assets/label-DqaB8ZB2.js +0 -1
  1014. package/dist/showcase/assets/languages-D9UaP3QU.js +0 -1
  1015. package/dist/showcase/assets/layers-QXZ9Jfej.js +0 -1
  1016. package/dist/showcase/assets/layout-app-shell-CW1eRJmU.js +0 -608
  1017. package/dist/showcase/assets/layout-auth-j4K6lveg.js +0 -790
  1018. package/dist/showcase/assets/layout-containers-NclLtsV0.js +0 -101
  1019. package/dist/showcase/assets/layout-header-B8AOTiwL.js +0 -203
  1020. package/dist/showcase/assets/layout-page-DM79QHyW.js +0 -314
  1021. package/dist/showcase/assets/layout-primitives-Dyop-WMt.js +0 -34
  1022. package/dist/showcase/assets/layout-sidebar-uBNaHqjD.js +0 -224
  1023. package/dist/showcase/assets/layout-users-BkhDiOOz.js +0 -117
  1024. package/dist/showcase/assets/layout-workspace-C2hSimZW.js +0 -191
  1025. package/dist/showcase/assets/lib-CDssULuD.js +0 -1
  1026. package/dist/showcase/assets/list-checks-DA2jqXdm.js +0 -1
  1027. package/dist/showcase/assets/lock-BDZLNQLR.js +0 -1
  1028. package/dist/showcase/assets/lock-keyhole-CWYENd9O.js +0 -1
  1029. package/dist/showcase/assets/mail-CCdaRmft.js +0 -1
  1030. package/dist/showcase/assets/mail-check-DZF1VbCX.js +0 -1
  1031. package/dist/showcase/assets/map-CDFEmmZH.js +0 -124
  1032. package/dist/showcase/assets/map-pin-CdV-R6nt.js +0 -1
  1033. package/dist/showcase/assets/media-library-BJyn1s9d.js +0 -699
  1034. package/dist/showcase/assets/mention-inline-suggestions-DPO6FhXx.js +0 -1
  1035. package/dist/showcase/assets/mentions-DtWHbcS6.js +0 -138
  1036. package/dist/showcase/assets/menus-BmjngFE4.js +0 -171
  1037. package/dist/showcase/assets/message-square-bM29txT3.js +0 -1
  1038. package/dist/showcase/assets/metadata-list-DvYTAJri.js +0 -286
  1039. package/dist/showcase/assets/metadata-list-xVUTVyy9.js +0 -1
  1040. package/dist/showcase/assets/metric-BPNCh4eA.js +0 -1
  1041. package/dist/showcase/assets/metric-bar-BX4sCMrM.js +0 -1
  1042. package/dist/showcase/assets/metric-grid-IyHP3nmU.js +0 -1
  1043. package/dist/showcase/assets/metric-trend-chip-Dih8eR17.js +0 -1
  1044. package/dist/showcase/assets/metrics-analytics-bar-DK16RNMs.js +0 -44
  1045. package/dist/showcase/assets/metrics-analytics-cards-Byyl13YT.js +0 -50
  1046. package/dist/showcase/assets/metrics-comparison-DGHFMBL-.js +0 -76
  1047. package/dist/showcase/assets/metrics-heatmap-Bl6C7i0j.js +0 -27
  1048. package/dist/showcase/assets/metrics-inline-badge-Bz79zbNK.js +0 -17
  1049. package/dist/showcase/assets/metrics-kpi-row-DzZ9dRFY.js +0 -31
  1050. package/dist/showcase/assets/metrics-micro-grid-DyoQiuzr.js +0 -42
  1051. package/dist/showcase/assets/metrics-overview-DoyHPEZw.js +0 -192
  1052. package/dist/showcase/assets/metrics-stat-cards-B1b7NFqW.js +0 -54
  1053. package/dist/showcase/assets/minus-BE2L5hVc.js +0 -1
  1054. package/dist/showcase/assets/money-display-CXQ_8LfA.js +0 -1
  1055. package/dist/showcase/assets/month-year-picker-ra8FEN8F.js +0 -1
  1056. package/dist/showcase/assets/navigation-CFfVZQJ1.js +0 -231
  1057. package/dist/showcase/assets/navigation-Da0MVkqr.js +0 -90
  1058. package/dist/showcase/assets/navigation-extras-LpsdoXfx.js +0 -43
  1059. package/dist/showcase/assets/onboarding-checklist-DPNatNOk.js +0 -119
  1060. package/dist/showcase/assets/overflow-tab-bar-C0vTzcEY.js +0 -1
  1061. package/dist/showcase/assets/overlays-Blmbun0J.js +0 -408
  1062. package/dist/showcase/assets/overlays-t0joc10Y.js +0 -159
  1063. package/dist/showcase/assets/overview-Ckq8vbOR.js +0 -184
  1064. package/dist/showcase/assets/package-Cjod_a06.js +0 -1
  1065. package/dist/showcase/assets/package-check-JRHaNnkl.js +0 -1
  1066. package/dist/showcase/assets/page-9xr7xnuW.js +0 -1
  1067. package/dist/showcase/assets/page-action-button-BRXnfsEx.js +0 -1
  1068. package/dist/showcase/assets/page-header-Bdlxfn_9.js +0 -1
  1069. package/dist/showcase/assets/pagination-CeaYhOvv.js +0 -42
  1070. package/dist/showcase/assets/pagination-DdZZHvNF.js +0 -1
  1071. package/dist/showcase/assets/paperclip-BRM-yXTB.js +0 -1
  1072. package/dist/showcase/assets/password-input-1FVEugoO.js +0 -1
  1073. package/dist/showcase/assets/pencil-DiG2dQ8F.js +0 -1
  1074. package/dist/showcase/assets/phone-BREyNZN-.js +0 -1
  1075. package/dist/showcase/assets/plus-CQcelTNc.js +0 -1
  1076. package/dist/showcase/assets/popover-Czmwspmc.js +0 -1
  1077. package/dist/showcase/assets/popover-menu-beuCaiLt.js +0 -1
  1078. package/dist/showcase/assets/popover-uqk7myG2.js +0 -1
  1079. package/dist/showcase/assets/products-DGNqIbLs.js +0 -423
  1080. package/dist/showcase/assets/progress-D76Df908.js +0 -1
  1081. package/dist/showcase/assets/progress-DjUprSDD.js +0 -18
  1082. package/dist/showcase/assets/props-table-DoDq8Mvr.js +0 -1
  1083. package/dist/showcase/assets/quote-BvGGgyJ0.js +0 -1
  1084. package/dist/showcase/assets/receipt-rgnlMgyi.js +0 -1
  1085. package/dist/showcase/assets/receipt-text-CBQrVlnU.js +0 -1
  1086. package/dist/showcase/assets/refinement-guide-B_BpIMxm.js +0 -189
  1087. package/dist/showcase/assets/refresh-cw-C-yHy6B7.js +0 -1
  1088. package/dist/showcase/assets/resolveValueLabel-0bwEvIG-.js +0 -1
  1089. package/dist/showcase/assets/resource-8f61BZ8t.js +0 -1
  1090. package/dist/showcase/assets/resource-BEh6R0gu.js +0 -139
  1091. package/dist/showcase/assets/resource-selector-card-DJwXY_Ms.js +0 -43
  1092. package/dist/showcase/assets/rich-text-editor-D433iv0N.js +0 -143
  1093. package/dist/showcase/assets/rich-text-editor-vTRfWsOK.js +0 -124
  1094. package/dist/showcase/assets/rotate-ccw-JuE4H14F.js +0 -1
  1095. package/dist/showcase/assets/route-eSu1bFNn.js +0 -1
  1096. package/dist/showcase/assets/save-Bpjj-rBP.js +0 -1
  1097. package/dist/showcase/assets/schema-form-DmOpxd96.js +0 -327
  1098. package/dist/showcase/assets/scroll-area-B9OdCBy9.js +0 -32
  1099. package/dist/showcase/assets/scroll-area-BH80l2As.js +0 -1
  1100. package/dist/showcase/assets/section-BPNIPavy.js +0 -1
  1101. package/dist/showcase/assets/select-BauiG1a3.js +0 -1
  1102. package/dist/showcase/assets/select-CPopSr5c.js +0 -1
  1103. package/dist/showcase/assets/send-DNCcBKXs.js +0 -1
  1104. package/dist/showcase/assets/separator-BK0beCOv.js +0 -28
  1105. package/dist/showcase/assets/separator-CKM9A-mm.js +0 -1
  1106. package/dist/showcase/assets/settings-2-B8fz7JZB.js +0 -1
  1107. package/dist/showcase/assets/settings-Cy2y3sQw.js +0 -1
  1108. package/dist/showcase/assets/sheet-C7VWkXE1.js +0 -1
  1109. package/dist/showcase/assets/shield-ClPev4gS.js +0 -1
  1110. package/dist/showcase/assets/shield-alert-6XO5YZ5u.js +0 -1
  1111. package/dist/showcase/assets/shield-check-DSfGVZq0.js +0 -1
  1112. package/dist/showcase/assets/shopping-bag-DzMrGvpF.js +0 -1
  1113. package/dist/showcase/assets/showcase-DuZaO6q9.js +0 -132
  1114. package/dist/showcase/assets/sidebar-7y9EQYWf.js +0 -1
  1115. package/dist/showcase/assets/sidebar.context-DUheJD8t.js +0 -1
  1116. package/dist/showcase/assets/skeleton-Dgr8Vabr.js +0 -29
  1117. package/dist/showcase/assets/skeleton-HSpErFqw.js +0 -1
  1118. package/dist/showcase/assets/slider-B7f81APg.js +0 -1
  1119. package/dist/showcase/assets/smart-card-p97LLZCW.js +0 -1
  1120. package/dist/showcase/assets/sonner-CWazrN19.js +0 -22
  1121. package/dist/showcase/assets/sortable.esm-uufol7Mz.js +0 -5
  1122. package/dist/showcase/assets/sparkles-Z4V23xKK.js +0 -1
  1123. package/dist/showcase/assets/spinner-BUgjAjWE.js +0 -49
  1124. package/dist/showcase/assets/spinner-CXu7z8-j.js +0 -1
  1125. package/dist/showcase/assets/spinner-DCwR0mnD.js +0 -30
  1126. package/dist/showcase/assets/square-pen-jwp_OWMQ.js +0 -1
  1127. package/dist/showcase/assets/stacked-avatars-CHEpTotO.js +0 -1
  1128. package/dist/showcase/assets/star-Ck8Lg5hm.js +0 -1
  1129. package/dist/showcase/assets/startOfDay-BzULZHy4.js +0 -1
  1130. package/dist/showcase/assets/styles-CNYitflH.js +0 -1
  1131. package/dist/showcase/assets/suggestions-CSF9MlKl.js +0 -126
  1132. package/dist/showcase/assets/switch-BX9KSLIF.js +0 -1
  1133. package/dist/showcase/assets/switch-Bn0WaWa9.js +0 -1
  1134. package/dist/showcase/assets/sync-BuKBnqWW.js +0 -124
  1135. package/dist/showcase/assets/table-DNJcLaud.js +0 -686
  1136. package/dist/showcase/assets/table-NfpOWGsG.js +0 -1
  1137. package/dist/showcase/assets/table-actions-Ci9Yszp0.js +0 -1
  1138. package/dist/showcase/assets/tabs-CYNFQdIr.js +0 -19
  1139. package/dist/showcase/assets/tabs-Cm_p6znb.js +0 -1
  1140. package/dist/showcase/assets/tags-input-DE4QZqS_.js +0 -1
  1141. package/dist/showcase/assets/text-button-D9llh4pU.js +0 -1
  1142. package/dist/showcase/assets/text-link-ZT6QGJOL.js +0 -1
  1143. package/dist/showcase/assets/textarea-CgcHuGVq.js +0 -1
  1144. package/dist/showcase/assets/textarea-D2uT_GJt.js +0 -1
  1145. package/dist/showcase/assets/timelines-BEFO7tJ0.js +0 -200
  1146. package/dist/showcase/assets/toggle-group-oYpa59lN.js +0 -1
  1147. package/dist/showcase/assets/toggles-BL93YmQo.js +0 -71
  1148. package/dist/showcase/assets/toggles-group-BG-xiQCY.js +0 -32
  1149. package/dist/showcase/assets/tooltip-BMI7zHwP.js +0 -31
  1150. package/dist/showcase/assets/trash-2-CtRtVsCy.js +0 -1
  1151. package/dist/showcase/assets/trending-up-2NQ-P8vB.js +0 -1
  1152. package/dist/showcase/assets/truck-Cl0nyN_j.js +0 -1
  1153. package/dist/showcase/assets/typography-C7pCPhg7.js +0 -223
  1154. package/dist/showcase/assets/ui-badge-BvmuMzSq.js +0 -28
  1155. package/dist/showcase/assets/ui-card-B7ziOMAn.js +0 -30
  1156. package/dist/showcase/assets/ui-table-BEFHakBU.js +0 -42
  1157. package/dist/showcase/assets/upload-tray-CMKqTtEp.js +0 -138
  1158. package/dist/showcase/assets/use-layout-link-nEU6ctSs.js +0 -1
  1159. package/dist/showcase/assets/useAnchoredPopupScrollLock-B1xyKMh7.js +0 -1
  1160. package/dist/showcase/assets/useAriaLabelledBy-BMlFgz-H.js +0 -1
  1161. package/dist/showcase/assets/useCollapsiblePanel-BEzH6TC2.js +0 -1
  1162. package/dist/showcase/assets/useCompositeItem-CIuww7-p.js +0 -1
  1163. package/dist/showcase/assets/useCompositeListItem-PrMTh4tz.js +0 -1
  1164. package/dist/showcase/assets/useLabelableId-BBLkeLGr.js +0 -1
  1165. package/dist/showcase/assets/useOpenInteractionType-CW0quo3l.js +0 -1
  1166. package/dist/showcase/assets/useRender-6NNMHJJU.js +0 -1
  1167. package/dist/showcase/assets/useTriggerFocusGuards-DEza_iee.js +0 -1
  1168. package/dist/showcase/assets/useValueChanged-BmWIb3SN.js +0 -1
  1169. package/dist/showcase/assets/user-BDIP5UPS.js +0 -1
  1170. package/dist/showcase/assets/user-plus-BCqHFh2h.js +0 -1
  1171. package/dist/showcase/assets/users-Bh7xGRX2.js +0 -1
  1172. package/dist/showcase/assets/vendor-profile-BlYcRbPI.js +0 -37
  1173. package/dist/showcase/assets/video-BucshqNW.js +0 -1
  1174. package/dist/showcase/assets/wrench-DQvhyTEb.js +0 -1
  1175. package/dist/showcase/assets/x-DyuS4YRT.js +0 -1
  1176. package/dist/showcase/assets/zap-Dpn8_pnQ.js +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments-C97vL5km.js","names":[],"sources":["../../src/components/features/comments/comments.strings.ts","../../src/components/features/comments/comments-provider.tsx","../../src/components/features/comments/partials/comment-attachment-chip.tsx","../../src/components/features/comments/hooks/use-attachment-upload.ts","../../src/components/features/comments/partials/comment-composer.tsx","../../src/components/features/comments/partials/comment-empty.tsx","../../src/components/features/comments/partials/comment-content.tsx","../../src/components/features/comments/partials/comment-item.tsx","../../src/components/features/comments/partials/comment-timeline.tsx","../../src/components/features/comments/comments.tsx","../../src/components/features/comments/hooks/use-comments.ts"],"sourcesContent":["/**\n * Strings for the Comments feature. Consumers override via the `strings`\n * prop on `<Comments>` / `<CommentsCard>` / sub-components — values are\n * deep-merged over these defaults.\n */\nexport interface CommentsStrings {\n /** Card title — usually \"Comments\". Set to \"\" to hide. */\n title: string;\n /** Subtitle under the card title — optional. */\n subtitle: string;\n /** Empty-state copy for the timeline. */\n empty: string;\n /** Empty-state secondary copy. */\n emptyHint: string;\n\n // Composer ---------------------------------------------------------\n /** Composer rich-text placeholder. */\n composerPlaceholder: string;\n /** Submit label for new comments. */\n composerSubmit: string;\n /** Submit label while pending. */\n composerSubmitting: string;\n /** Submit label when editing. */\n composerSave: string;\n /** Required-content error. */\n invalidContent: string;\n /** Cancel/dismiss draft. */\n composerCancel: string;\n /** \"Edit comment\" eyebrow shown above the composer in edit mode. */\n composerEditingEyebrow: string;\n /** \"Reply to {{name}}\" eyebrow shown above the composer in reply mode. */\n composerReplyingEyebrow: string;\n\n // Toolbar buttons --------------------------------------------------\n composerAttachmentLabel: string;\n composerReferenceLabel: string;\n composerReferenceMenuTitle: string;\n composerReferenceSearchPlaceholder: string;\n composerReferenceEmpty: string;\n composerReferenceLoading: string;\n\n // Item -------------------------------------------------------------\n fallbackAuthor: string;\n pinned: string;\n edited: string;\n /** Trash button aria-label / tooltip. */\n deleteLabel: string;\n /** Edit button label. */\n editLabel: string;\n /** Reply button label. */\n replyLabel: string;\n /** Pin/unpin button label. */\n pinLabel: string;\n unpinLabel: string;\n /** \"More actions\" trigger aria-label. */\n moreActionsLabel: string;\n /** Confirm-delete button label inside the action menu. */\n confirmDeleteLabel: string;\n\n // Attachments ------------------------------------------------------\n attachmentFallback: string;\n attachmentRemoveLabel: string;\n attachmentUploadingLabel: string;\n attachmentFailedLabel: string;\n attachmentTooLargeError: string;\n attachmentTooManyError: string;\n attachmentRetryLabel: string;\n attachmentDownloadLabel: string;\n\n // Reactions --------------------------------------------------------\n addReactionLabel: string;\n\n // Misc -------------------------------------------------------------\n showRepliesLabel: string;\n hideRepliesLabel: string;\n}\n\nexport const defaultCommentsStrings: CommentsStrings = {\n title: 'Comments',\n subtitle: '',\n empty: 'No comments yet.',\n emptyHint: 'Start the conversation — your team will see it instantly.',\n\n composerPlaceholder: 'Write a comment…',\n composerSubmit: 'Post comment',\n composerSubmitting: 'Posting…',\n composerSave: 'Save changes',\n invalidContent: 'Comment cannot be empty.',\n composerCancel: 'Cancel',\n composerEditingEyebrow: 'Editing comment',\n composerReplyingEyebrow: 'Replying to {{name}}',\n\n composerAttachmentLabel: 'Attach file',\n composerReferenceLabel: 'Mention or link',\n composerReferenceMenuTitle: 'Insert reference',\n composerReferenceSearchPlaceholder: 'Search…',\n composerReferenceEmpty: 'No matches.',\n composerReferenceLoading: 'Searching…',\n\n fallbackAuthor: 'Anonymous',\n pinned: 'Pinned',\n edited: 'edited',\n deleteLabel: 'Delete',\n editLabel: 'Edit',\n replyLabel: 'Reply',\n pinLabel: 'Pin',\n unpinLabel: 'Unpin',\n moreActionsLabel: 'More actions',\n confirmDeleteLabel: 'Delete comment',\n\n attachmentFallback: 'Attachment',\n attachmentRemoveLabel: 'Remove attachment',\n attachmentUploadingLabel: 'Uploading…',\n attachmentFailedLabel: 'Upload failed',\n attachmentTooLargeError: 'File is too large.',\n attachmentTooManyError: 'Too many attachments.',\n attachmentRetryLabel: 'Retry',\n attachmentDownloadLabel: 'Download',\n\n addReactionLabel: 'Add reaction',\n\n showRepliesLabel: 'Show replies',\n hideRepliesLabel: 'Hide replies',\n};\n\n/**\n * Tiny `{{token}}` interpolator used by templated strings like\n * `composerReplyingEyebrow`. No HTML escaping — treat values as plain text.\n */\nexport function interpolateString(\n template: string,\n values: Record<string, string | number | undefined>,\n): string {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key: string) => {\n const value = values[key];\n return value === undefined || value === null ? '' : String(value);\n });\n}\n","/**\n * Comments — internal helper hooks for resolving strings and accessors.\n *\n * Rationale: the previous `<CommentsProvider>` is gone. Library-wide\n * defaults now live in `<UIProvider>` (`useMediaConfig` / `useDatesConfig`).\n * Per-mount overrides flow as direct props on `<Comments>` and its\n * partials. These helpers just centralize the merge order.\n *\n * Resolution order everywhere:\n *\n * props.strings ← deep-merged over `defaultCommentsStrings`\n * props.accessor.X ← falls back to UIProvider's media/dates resolvers,\n * then to a built-in default at the call site.\n */\nimport { useMemo } from 'react';\n\nimport { useStrings, type StringsProp } from '@/lib/strings';\nimport { useDatesConfig, useMediaConfig } from '@/lib/ui-provider';\n\nimport {\n defaultCommentsStrings,\n type CommentsStrings,\n} from './comments.strings';\nimport type { CommentAttachment, CommentsAccessors } from './comments.types';\n\n/**\n * Resolve final strings by merging defaults → component prop. Stable\n * identity when the prop reference is unchanged.\n */\nexport function useResolvedStrings(\n propStrings?: StringsProp<CommentsStrings>,\n): CommentsStrings {\n return useStrings(defaultCommentsStrings, propStrings);\n}\n\n/**\n * Resolve accessors. Order:\n * 1. explicit prop accessor\n * 2. matching UIProvider slot (`useMediaConfig().resolveUrl`, etc.)\n * 3. caller's own fallback when neither is present (handled at call site)\n */\nexport function useResolvedAccessors(\n propAccessors?: CommentsAccessors,\n): CommentsAccessors {\n const media = useMediaConfig();\n const dates = useDatesConfig();\n return useMemo<CommentsAccessors>(\n () => ({\n getMediaUrl:\n propAccessors?.getMediaUrl ??\n ((m: CommentAttachment | null | undefined) =>\n media.resolveUrl?.((m ?? {}) as { url?: string; key?: string })),\n getMediaName:\n propAccessors?.getMediaName ??\n ((m: CommentAttachment | null | undefined) =>\n media.resolveName?.((m ?? {}) as { name?: string })),\n getStatusLabel: propAccessors?.getStatusLabel,\n formatRelativeTime:\n propAccessors?.formatRelativeTime ?? dates.formatRelativeTime,\n }),\n [propAccessors, media, dates.formatRelativeTime],\n );\n}\n","/**\n * CommentAttachmentChip — small attachment pill used in the composer draft\n * and the timeline. Single inline row: icon + name · size, with progress /\n * error states overlaid on the same line. Editable mode reveals a remove\n * button; failed uploads expose a retry pill.\n */\nimport { File, FileText, Image as ImageIcon, Loader2, Paperclip, X } from 'lucide-react';\nimport type { FC } from 'react';\n\nimport { Button } from '@/components/base/buttons';\nimport { Text } from '@/components/typography';\nimport { useStrings, type StringsProp } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\n\nimport type {\n CommentAttachment,\n CommentsAccessors,\n} from '../comments.types';\nimport {\n defaultCommentsStrings,\n type CommentsStrings,\n} from '../comments.strings';\n\nexport interface CommentAttachmentChipProps {\n attachment: CommentAttachment;\n /** Editable mode shows a remove button. */\n editable?: boolean;\n onRemove?: (id: string) => void;\n onRetry?: (id: string) => void;\n accessors?: CommentsAccessors;\n strings?: StringsProp<CommentsStrings>;\n /** Compact chips have smaller text and tighter padding. */\n compact?: boolean;\n className?: string;\n}\n\nfunction formatBytes(bytes?: number): string | null {\n if (typeof bytes !== 'number' || bytes <= 0) return null;\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction pickIcon(att: CommentAttachment) {\n if (att.mimeType?.startsWith('image/')) return ImageIcon;\n if (att.mimeType === 'application/pdf') return FileText;\n if (att.mimeType?.startsWith('text/')) return FileText;\n if (att.mimeType) return File;\n return Paperclip;\n}\n\nexport const CommentAttachmentChip: FC<CommentAttachmentChipProps> = ({\n attachment,\n editable = false,\n onRemove,\n onRetry,\n accessors,\n strings: stringsProp,\n compact = false,\n className,\n}) => {\n const strings = useStrings(defaultCommentsStrings, stringsProp);\n\n const url = accessors?.getMediaUrl?.(attachment) ?? attachment.url;\n const name =\n accessors?.getMediaName?.(attachment) ??\n attachment.name ??\n strings.attachmentFallback;\n const Icon = pickIcon(attachment);\n\n const isUploading = attachment.status === 'uploading';\n const isFailed = attachment.status === 'failed';\n const sizeLabel = formatBytes(attachment.size);\n\n const meta = isUploading\n ? strings.attachmentUploadingLabel +\n (typeof attachment.progress === 'number'\n ? ` ${Math.round(attachment.progress)}%`\n : '')\n : isFailed\n ? attachment.error ?? strings.attachmentFailedLabel\n : sizeLabel;\n\n const surface = cn(\n 'relative inline-flex min-w-0 max-w-[20rem] items-center gap-1.5 rounded-md',\n 'ring-1 ring-inset transition-colors',\n compact ? 'px-2 py-1 text-xs' : 'px-2.5 py-1 text-xs',\n isFailed\n ? 'bg-destructive/[0.04] ring-destructive/30 hover:bg-destructive/[0.08]'\n : 'bg-foreground/[0.03] ring-border/60 hover:bg-foreground/[0.06]',\n className,\n );\n\n const iconNode = isUploading ? (\n <Loader2\n className={cn('shrink-0 animate-spin text-muted-foreground', 'size-3.5')}\n aria-hidden\n />\n ) : (\n <Icon\n className={cn(\n 'shrink-0',\n 'size-3.5',\n isFailed ? 'text-destructive' : 'text-muted-foreground',\n )}\n aria-hidden\n />\n );\n\n const labelRow = (\n <span className=\"inline-flex min-w-0 items-baseline gap-1.5\">\n <Text\n tag=\"span\"\n size=\"xs\"\n weight=\"medium\"\n className={cn('truncate', isFailed && 'text-destructive')}\n >\n {name}\n </Text>\n {meta ? (\n <Text\n tag=\"span\"\n size=\"xxs\"\n type=\"secondary\"\n className=\"shrink-0 tabular-nums\"\n >\n {meta}\n </Text>\n ) : null}\n </span>\n );\n\n const isInteractive = !!url && !isUploading && !isFailed;\n\n return (\n <div className={surface}>\n {iconNode}\n {isInteractive ? (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"inline-flex min-w-0 flex-1 items-baseline gap-1.5 hover:underline\"\n aria-label={strings.attachmentDownloadLabel}\n >\n {labelRow}\n </a>\n ) : (\n labelRow\n )}\n\n {isUploading && typeof attachment.progress === 'number' && (\n <div className=\"bg-primary/15 absolute bottom-0 left-2 right-2 h-px overflow-hidden rounded-full\">\n <div\n className=\"bg-primary h-full transition-[width]\"\n style={{\n width: `${Math.min(100, Math.max(0, attachment.progress))}%`,\n }}\n />\n </div>\n )}\n\n {isFailed && onRetry && (\n <Button\n type=\"button\"\n variant=\"error\"\n buttonStyle=\"ghost\"\n size=\"small\"\n onClick={() => onRetry(attachment.id)}\n className=\"h-auto shrink-0 rounded px-1.5 py-px text-xxs font-medium ring-1 ring-inset ring-destructive/30 hover:ring-destructive/60\"\n >\n {strings.attachmentRetryLabel}\n </Button>\n )}\n\n {editable && onRemove && (\n <Button\n type=\"button\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n size=\"icon-small\"\n onClick={() => onRemove(attachment.id)}\n className=\"-mr-0.5 size-4 shrink-0 rounded p-0 text-muted-foreground hover:bg-foreground/10 hover:text-foreground\"\n aria-label={strings.attachmentRemoveLabel}\n title={strings.attachmentRemoveLabel}\n >\n <X className=\"size-3\" />\n </Button>\n )}\n </div>\n );\n};\n","/**\n * useAttachmentUpload — manages a list of in-flight + uploaded\n * `CommentAttachment`s for a comment composer.\n *\n * Pass the consumer-supplied `onUpload` callback directly via the\n * `attachments` prop on `<Comments>` (or `<CommentComposer>`). Aborts\n * in-flight uploads when an attachment is removed.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport type {\n CommentAttachment,\n CommentsAttachmentsConfig,\n} from '../comments.types';\n\ninterface InFlightEntry {\n controller: AbortController;\n}\n\nexport interface UseAttachmentUploadOptions extends CommentsAttachmentsConfig {\n /** Initial attachments — useful when editing an existing comment. */\n initialAttachments?: ReadonlyArray<CommentAttachment>;\n /** Fires when the list of uploaded attachments changes. */\n onChange?: (attachments: ReadonlyArray<CommentAttachment>) => void;\n /** Fires when a validation or upload error happens. */\n onError?: (error: string) => void;\n}\n\nexport interface UseAttachmentUploadReturn {\n /** All attachments — uploading + uploaded + failed. */\n attachments: ReadonlyArray<CommentAttachment>;\n /** Subset of attachments that finished uploading. Use this in the form payload. */\n uploadedAttachments: ReadonlyArray<CommentAttachment>;\n /** True while at least one upload is in flight. */\n isUploading: boolean;\n /** Add files. Validates against `maxSize` / `maxFiles` first. */\n addFiles: (files: ReadonlyArray<File> | FileList) => void;\n /** Remove an attachment by id (aborts in-flight uploads). */\n removeAttachment: (id: string) => void;\n /** Retry a failed upload. */\n retryAttachment: (id: string) => void;\n /** Replace the list (used when editing or after submit). */\n setAttachments: (attachments: ReadonlyArray<CommentAttachment>) => void;\n /** Clear the list and abort everything in flight. */\n reset: () => void;\n}\n\nexport function useAttachmentUpload(\n options: UseAttachmentUploadOptions = {},\n): UseAttachmentUploadReturn {\n const {\n onUpload,\n maxSize,\n maxFiles,\n // `accept` is consumed by the surrounding `<input type=\"file\"\n // accept>` element, not here — destructuring is intentional\n // even though we don't reference it inside the hook.\n disabled,\n initialAttachments,\n onChange,\n onError,\n } = options;\n\n const [attachments, setAttachmentsState] = useState<CommentAttachment[]>(() =>\n initialAttachments ? [...initialAttachments] : [],\n );\n const inFlightRef = useRef<Map<string, InFlightEntry>>(new Map());\n const fileCacheRef = useRef<Map<string, File>>(new Map());\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const updateAttachment = useCallback(\n (id: string, patch: Partial<CommentAttachment>) => {\n setAttachmentsState((prev) =>\n prev.map((a) => (a.id === id ? { ...a, ...patch } : a)),\n );\n },\n [],\n );\n\n const setAttachments = useCallback(\n (next: ReadonlyArray<CommentAttachment>) => {\n setAttachmentsState([...next]);\n },\n [],\n );\n\n const beginUpload = useCallback(\n (id: string, file: File) => {\n if (!onUpload) return;\n const controller = new AbortController();\n inFlightRef.current.set(id, { controller });\n\n updateAttachment(id, {\n status: 'uploading',\n progress: 0,\n error: undefined,\n });\n\n const onProgress = (progress: number) => {\n updateAttachment(id, { progress });\n };\n\n onUpload({ file, onProgress, signal: controller.signal })\n .then((uploaded) => {\n inFlightRef.current.delete(id);\n updateAttachment(id, {\n ...uploaded,\n id,\n status: 'uploaded',\n progress: 100,\n error: undefined,\n });\n })\n .catch((err: unknown) => {\n inFlightRef.current.delete(id);\n if (controller.signal.aborted) {\n return;\n }\n const message =\n err instanceof Error ? err.message : 'Upload failed';\n updateAttachment(id, {\n status: 'failed',\n error: message,\n });\n onError?.(message);\n });\n },\n [onError, onUpload, updateAttachment],\n );\n\n const addFiles = useCallback(\n (filesInput: ReadonlyArray<File> | FileList) => {\n if (disabled || !onUpload) return;\n const files = Array.from(filesInput);\n if (files.length === 0) return;\n\n setAttachmentsState((prev) => {\n const next = [...prev];\n for (const file of files) {\n if (\n typeof maxFiles === 'number' &&\n next.length >= maxFiles\n ) {\n onError?.('Too many attachments.');\n break;\n }\n if (\n typeof maxSize === 'number' &&\n file.size > maxSize\n ) {\n onError?.('File is too large.');\n continue;\n }\n\n const id =\n typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID()\n : `att-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n fileCacheRef.current.set(id, file);\n\n next.push({\n id,\n name: file.name,\n size: file.size,\n mimeType: file.type,\n status: 'uploading',\n progress: 0,\n });\n\n queueMicrotask(() => beginUpload(id, file));\n }\n return next;\n });\n },\n [beginUpload, disabled, maxFiles, maxSize, onError, onUpload],\n );\n\n const removeAttachment = useCallback((id: string) => {\n const entry = inFlightRef.current.get(id);\n if (entry) {\n entry.controller.abort();\n inFlightRef.current.delete(id);\n }\n fileCacheRef.current.delete(id);\n setAttachmentsState((prev) => prev.filter((a) => a.id !== id));\n }, []);\n\n const retryAttachment = useCallback(\n (id: string) => {\n const file = fileCacheRef.current.get(id);\n if (!file) return;\n beginUpload(id, file);\n },\n [beginUpload],\n );\n\n const reset = useCallback(() => {\n for (const entry of inFlightRef.current.values()) {\n entry.controller.abort();\n }\n inFlightRef.current.clear();\n fileCacheRef.current.clear();\n setAttachmentsState([]);\n }, []);\n\n useEffect(() => {\n onChangeRef.current?.(attachments);\n }, [attachments]);\n\n useEffect(() => {\n const inFlight = inFlightRef.current;\n return () => {\n for (const entry of inFlight.values()) {\n entry.controller.abort();\n }\n };\n }, []);\n\n const uploadedAttachments = useMemo(\n () => attachments.filter((a) => a.status === 'uploaded' || !a.status),\n [attachments],\n );\n\n const isUploading = useMemo(\n () => attachments.some((a) => a.status === 'uploading'),\n [attachments],\n );\n\n return {\n attachments,\n uploadedAttachments,\n isUploading,\n addFiles,\n removeAttachment,\n retryAttachment,\n setAttachments,\n reset,\n };\n}\n","/**\n * CommentComposer — TipTap-backed rich text editor with inline reference\n * picker and attachment uploader. Default composer for `<Comments>`.\n *\n * Mention/reference handling is delegated to the shared\n * `features/mentions` module: `useMentions` drives picker state +\n * caret-trigger detection, `<MentionPicker>` renders the popover, and\n * `<MentionChip>` renders draft-list chips. The same primitives power\n * inline references in `features/event-log`.\n */\nimport { AtSign, Loader2, Paperclip, Send, X } from 'lucide-react';\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { ReactNode } from 'react';\n\nimport { Button } from '@/components/base/buttons';\nimport { Popover, PopoverTrigger } from '@/components/base/popover';\nimport { Text } from '@/components/typography';\nimport {\n RichTextEditor,\n type RichTextEditorHandle,\n type RichTextEditorToolbarItem,\n} from '@/components/features/rich-text-editor/rich-text-editor';\nimport {\n MentionInlineSuggestions,\n MentionPicker,\n parseMentionsFromHtml,\n useMentions,\n} from '@/components/features/mentions';\nimport { useResolvedStrings } from '../comments-provider';\nimport { interpolateString } from '../comments.strings';\nimport type {\n CommentComposerProps,\n CommentFormValues,\n} from '../comments.types';\nimport { CommentAttachmentChip } from './comment-attachment-chip';\nimport { useAttachmentUpload } from '../hooks/use-attachment-upload';\n\nexport interface CommentComposerHandle {\n focus(): void;\n clear(): void;\n /** Imperatively set the draft body. */\n setBody(html: string): void;\n}\n\nfunction hasMeaningfulContent(html: string): boolean {\n if (!html || typeof html !== 'string') return false;\n const text = html.replace(/<[^>]*>/g, '').trim();\n return text.length > 0;\n}\n\nexport const CommentComposer = forwardRef<\n CommentComposerHandle,\n CommentComposerProps\n>(function CommentComposer(\n {\n context,\n canComment = true,\n isSubmitting = false,\n errors,\n resetKey = 0,\n onSubmit,\n onCancel,\n editingComment,\n strings: stringsProp,\n resources: resourcesProp,\n onResourceSearch: onResourceSearchProp,\n attachments: attachmentsProp,\n initialValues,\n autoFocus = false,\n inlineSubmit = true,\n placeholder,\n },\n ref,\n) {\n const strings = useResolvedStrings(stringsProp);\n\n const resources = resourcesProp;\n const onResourceSearch = onResourceSearchProp;\n const attachmentsConfig = attachmentsProp;\n\n const editorRef = useRef<RichTextEditorHandle>(null);\n const [body, setBody] = useState<string>(\n () => initialValues?.content ?? editingComment?.content ?? '',\n );\n const [contentError, setContentError] = useState<string | null>(null);\n\n /**\n * Mentions state — picker + caret-trigger detection. The hook reads\n * the editor handle via the ref we pass; on suggestion select it\n * inserts the chip and replaces the trigger range automatically.\n */\n const mentions = useMentions({\n resources,\n onResourceSearch,\n editorRef,\n initialMentions:\n initialValues?.references ?? editingComment?.references,\n });\n\n const attachmentUpload = useAttachmentUpload({\n ...attachmentsConfig,\n initialAttachments: initialValues?.attachments ?? undefined,\n });\n\n useImperativeHandle(\n ref,\n () => ({\n focus: () => editorRef.current?.focus(),\n clear: () => {\n editorRef.current?.clear();\n mentions.reset();\n attachmentUpload.reset();\n setContentError(null);\n },\n setBody: (html) => {\n editorRef.current?.setHTML(html);\n },\n }),\n [attachmentUpload, mentions],\n );\n\n // Reset on context change / resetKey bump\n useEffect(() => {\n editorRef.current?.setHTML(initialValues?.content ?? '');\n mentions.setMentions(initialValues?.references ?? []);\n attachmentUpload.setAttachments(initialValues?.attachments ?? []);\n setContentError(null);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [context.id, context.type, resetKey]);\n\n // Sync editing comment payload\n useEffect(() => {\n if (!editingComment) return;\n editorRef.current?.setHTML(editingComment.content ?? '');\n mentions.setMentions(editingComment.references ?? []);\n const list = (editingComment.attachments ?? editingComment.media ?? []).filter(\n (a): a is NonNullable<typeof a> => !!a,\n );\n attachmentUpload.setAttachments(list);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editingComment?.id]);\n\n // Surface server-side errors\n useEffect(() => {\n if (errors?.content) {\n setContentError(errors.content);\n }\n }, [errors]);\n\n const handleSubmit = (event?: React.FormEvent) => {\n event?.preventDefault();\n const html = editorRef.current?.getHTML() ?? body;\n if (!hasMeaningfulContent(html)) {\n setContentError(strings.invalidContent);\n return;\n }\n setContentError(null);\n\n const values: CommentFormValues = {\n content: html,\n commentableId: context.id,\n commentableType: context.type,\n contentType: 'html',\n references: mentions.mentions,\n attachments: attachmentUpload.uploadedAttachments,\n editingId: editingComment?.id,\n };\n\n onSubmit(values);\n };\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const handleAttachmentClick = () => fileInputRef.current?.click();\n const handleFiles = (files: FileList | null) => {\n if (!files) return;\n attachmentUpload.addFiles(files);\n };\n\n const hasAttachments = attachmentUpload.attachments.length > 0;\n const isEditing = !!editingComment;\n\n const submitLabel = isSubmitting\n ? strings.composerSubmitting\n : isEditing\n ? strings.composerSave\n : strings.composerSubmit;\n\n const eyebrow: ReactNode = isEditing ? (\n <ComposerEyebrow\n label={strings.composerEditingEyebrow}\n closeLabel={strings.composerCancel}\n onClose={onCancel}\n />\n ) : null;\n\n const extraToolbarItems = useMemo<ReadonlyArray<RichTextEditorToolbarItem>>(() => {\n const items: RichTextEditorToolbarItem[] = [];\n if (resources && Object.keys(resources).length > 0) {\n items.push({\n id: 'reference',\n icon: AtSign,\n label: strings.composerReferenceLabel,\n onClick: () => mentions.setPickerOpen(true),\n });\n }\n if (attachmentsConfig?.onUpload && !attachmentsConfig.disabled) {\n items.push({\n id: 'attachment',\n icon: Paperclip,\n label: strings.composerAttachmentLabel,\n onClick: handleAttachmentClick,\n });\n }\n return items;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n resources,\n attachmentsConfig?.onUpload,\n attachmentsConfig?.disabled,\n strings.composerReferenceLabel,\n strings.composerAttachmentLabel,\n ]);\n\n if (!canComment) return null;\n\n const submitButton = (\n <Button\n type=\"button\"\n onClick={() => handleSubmit()}\n disabled={isSubmitting || attachmentUpload.isUploading}\n icon={isSubmitting ? Loader2 : Send}\n >\n {submitLabel}\n </Button>\n );\n\n const cancelButton = (isEditing || onCancel) ? (\n <Button\n type=\"button\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n onClick={onCancel}\n disabled={isSubmitting}\n >\n {strings.composerCancel}\n </Button>\n ) : null;\n\n // Mentions live as inline `<span class=\"rsc-mention\" contenteditable=\"false\">`\n // chips inside the editor body — they're visible, dismissible (single\n // backspace deletes the whole span), and the HTML→mentions sync keeps\n // `mentions.mentions` aligned automatically. Rendering them again as a\n // chip-list below the editor was redundant and confusing.\n\n const attachmentChips = hasAttachments ? (\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {attachmentUpload.attachments.map((attachment) => (\n <CommentAttachmentChip\n key={attachment.id}\n attachment={attachment}\n editable\n onRemove={attachmentUpload.removeAttachment}\n onRetry={attachmentUpload.retryAttachment}\n strings={stringsProp}\n />\n ))}\n </div>\n ) : null;\n\n const footerSlot = hasAttachments ? attachmentChips : null;\n\n const trailingSubmit = inlineSubmit !== false ? submitButton : null;\n const showFooterRow = inlineSubmit === false || isEditing;\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-2\">\n {eyebrow}\n\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n hidden\n accept={attachmentsConfig?.accept}\n onChange={(e) => {\n handleFiles(e.target.files);\n e.target.value = '';\n }}\n />\n\n {/* Manual button-click flow: regular popover anchored to the\n hidden trigger. The inline-trigger flow uses the panel\n rendered below — no focus stealing while the user types. */}\n {!mentions.triggerActive && (\n <Popover open={mentions.pickerOpen} onOpenChange={mentions.setPickerOpen}>\n <PopoverTrigger\n render={\n <button\n type=\"button\"\n className=\"sr-only\"\n tabIndex={-1}\n />\n }\n >\n {strings.composerReferenceLabel}\n </PopoverTrigger>\n <MentionPicker\n open={mentions.pickerOpen}\n activeKind={mentions.activeKind}\n setActiveKind={mentions.setActiveKind}\n kinds={mentions.kinds}\n resources={resources}\n query={mentions.query}\n setQuery={mentions.setQuery}\n suggestions={mentions.suggestions}\n isLoading={mentions.isLoading}\n onSelect={mentions.pickSuggestion}\n strings={{\n title: strings.composerReferenceMenuTitle,\n searchPlaceholder: strings.composerReferenceSearchPlaceholder,\n empty: strings.composerReferenceEmpty,\n loading: strings.composerReferenceLoading,\n }}\n />\n </Popover>\n )}\n\n <div className=\"relative\">\n <RichTextEditor\n ref={editorRef}\n value={body}\n onChange={(html) => {\n setBody(html);\n // Sync the draft's mentions list with what's\n // actually present in the HTML — when the user\n // backspaces a chip span out of the body, the\n // chip-list below shrinks too. We merge with\n // the previously-known list so consumer-supplied\n // `href` / `data` payloads survive parsing.\n const parsed = parseMentionsFromHtml<string>(html);\n const previous = mentions.mentions;\n const previousIds = previous.map((m) => m.id).join('|');\n const currentIds = parsed.map((m) => m.id).join('|');\n if (previousIds !== currentIds) {\n const byId = new Map(previous.map((m) => [m.id, m]));\n const merged = parsed.map(\n (p) => byId.get(p.id) ?? p,\n );\n mentions.setMentions(merged);\n }\n }}\n placeholder={placeholder ?? strings.composerPlaceholder}\n strings={{\n editorLabel: placeholder ?? strings.composerPlaceholder,\n }}\n minHeight=\"3rem\"\n autoFocus={autoFocus || isEditing}\n extraToolbarItems={extraToolbarItems}\n toolbarTrailing={trailingSubmit}\n footerSlot={footerSlot}\n onCaretChange={mentions.handleCaretChange}\n />\n\n <MentionInlineSuggestions\n open={mentions.triggerActive && mentions.pickerOpen}\n activeKind={mentions.activeKind}\n setActiveKind={mentions.setActiveKind}\n onManualKindChange={() => mentions.setManualKindOverride(true)}\n kinds={mentions.kinds}\n resources={resources}\n query={mentions.query}\n suggestions={mentions.suggestions}\n suggestionsByKind={mentions.suggestionsByKind}\n isLoading={mentions.isLoading}\n onSelect={mentions.pickSuggestion}\n strings={{\n title: strings.composerReferenceMenuTitle,\n empty: strings.composerReferenceEmpty,\n loading: strings.composerReferenceLoading,\n }}\n />\n </div>\n\n {contentError && (\n <Text size=\"xs\" type=\"error\">\n {contentError}\n </Text>\n )}\n\n {showFooterRow && (\n <div className=\"flex items-center justify-end gap-2\">\n {cancelButton}\n {submitButton}\n </div>\n )}\n </form>\n );\n});\n\n/* ------------------------------------------------------------------ */\n/* ComposerEyebrow */\n/* ------------------------------------------------------------------ */\n\nfunction ComposerEyebrow({\n label,\n closeLabel,\n onClose,\n}: {\n label: string;\n closeLabel: string;\n onClose?: () => void;\n}) {\n return (\n <div className=\"bg-muted/40 ring-border/60 flex items-center justify-between rounded px-2.5 py-1.5 ring-1 ring-inset\">\n <Text size=\"xxs\" type=\"secondary\" weight=\"medium\" className=\"uppercase tracking-wide\">\n {label}\n </Text>\n {onClose ? (\n <Button\n type=\"button\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n size=\"icon-small\"\n onClick={onClose}\n className=\"size-4 rounded p-0 text-muted-foreground hover:text-foreground\"\n aria-label={closeLabel}\n >\n <X className=\"size-3\" />\n </Button>\n ) : null}\n </div>\n );\n}\n\n/** Helper export for templated reply eyebrow. */\nexport function makeReplyEyebrow(template: string, name?: string): string {\n return interpolateString(template, { name: name ?? '' });\n}\n","/**\n * CommentEmpty — default empty state for the timeline. Replaceable via\n * the `emptySlot` prop on `<Comments>` / `<CommentTimeline>`.\n */\nimport { MessageCircle } from 'lucide-react';\nimport type { FC, ReactNode } from 'react';\n\nimport { Text } from '@/components/typography';\nimport type { StringsProp } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\n\nimport { useResolvedStrings } from '../comments-provider';\nimport type { CommentsStrings } from '../comments.strings';\n\nexport interface CommentEmptyProps {\n strings?: StringsProp<CommentsStrings>;\n icon?: ReactNode;\n className?: string;\n}\n\nexport const CommentEmpty: FC<CommentEmptyProps> = ({\n strings: stringsProp,\n icon,\n className,\n}) => {\n const strings = useResolvedStrings(stringsProp);\n\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center py-8 text-center',\n className,\n )}\n >\n <div className=\"bg-muted/50 mb-3 flex h-12 w-12 items-center justify-center rounded-full\">\n {icon ?? (\n <MessageCircle className=\"text-muted-foreground/60 h-5 w-5\" />\n )}\n </div>\n <Text weight=\"medium\">\n {strings.empty}\n </Text>\n {strings.emptyHint ? (\n <Text size=\"xs\" type=\"secondary\" className=\"mt-1 max-w-[28ch]\">\n {strings.emptyHint}\n </Text>\n ) : null}\n </div>\n );\n};\n","import type { ReactNode } from 'react';\nimport { Fragment, createElement } from 'react';\n\nimport { Heading, Text } from '@/components/typography';\nimport type { HeadingProps } from '@/components/typography';\nimport { MentionContent } from '@/components/features/mentions';\n\nimport type {\n CommentData,\n CommentUser,\n CommentsConfig,\n CommentsSlots,\n} from '../comments.types';\n\ninterface CommentContentProps<TResource extends string = string> {\n comment: CommentData<CommentUser, unknown, TResource>;\n /** Resource registry — passed through to `<MentionContent>`. */\n resources?: CommentsConfig<CommentUser, unknown, TResource>['resources'];\n renderReference?: CommentsSlots<\n CommentUser,\n unknown,\n TResource\n >['renderReference'];\n /** Optional sanitizer applied to HTML before rendering. */\n sanitizer?: (html: string) => string;\n}\n\n/**\n * `renderCommentContent` — backwards-compatible export that renders only\n * the comment body text (no references resolution). Use the\n * `<CommentContent>` component below for the full feature surface.\n */\nexport function renderCommentContent<TResource extends string = string>(\n comment: CommentData<CommentUser, unknown, TResource>,\n): ReactNode {\n return <CommentContent comment={comment} />;\n}\n\nexport function CommentContent<TResource extends string = string>(\n props: CommentContentProps<TResource>,\n): ReactNode {\n const { comment, resources, renderReference, sanitizer } = props;\n const contentType =\n comment.contentType ??\n (comment as Record<string, unknown>).content_type ??\n 'text';\n\n if (contentType === 'rich') {\n return renderRichContent(comment.content);\n }\n\n if (contentType === 'html') {\n return (\n <MentionContent<TResource>\n html={comment.content ?? ''}\n mentions={comment.references}\n resources={resources}\n renderMention={renderReference}\n sanitizer={sanitizer}\n />\n );\n }\n\n const plainContent = decodeQuotedString(comment.content ?? '');\n\n return (\n <Text className=\"whitespace-pre-line\">\n {plainContent}\n </Text>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Rich-block renderer (legacy \"rich\" content type) */\n/* ------------------------------------------------------------------ */\n\nfunction renderRichContent(rawContent: string | null | undefined): ReactNode {\n if (!rawContent) return null;\n\n try {\n const parsed = JSON.parse(rawContent) as {\n blocks?: Array<{ id?: string; type: string; data?: Record<string, unknown> }>;\n };\n\n if (!parsed || !Array.isArray(parsed.blocks) || parsed.blocks.length === 0) {\n return null;\n }\n\n return (\n <div className=\"prose prose-sm prose-p:my-0.5 prose-headings:my-1 prose-a:text-primary prose-a:no-underline hover:prose-a:underline max-w-none space-y-1\">\n {parsed.blocks.map((block, index) => (\n <Fragment key={block.id ?? `${block.type}-${index}`}>\n {renderRichBlock(block)}\n </Fragment>\n ))}\n </div>\n );\n } catch {\n const decoded = decodeQuotedString(rawContent);\n return (\n <Text className=\"whitespace-pre-line\">\n {decoded}\n </Text>\n );\n }\n}\n\nfunction renderRichBlock(block: { type: string; data?: Record<string, unknown> }): ReactNode {\n const data = block.data ?? {};\n\n switch (block.type) {\n case 'paragraph': {\n const raw = String(data.text ?? '').trim();\n if (!raw) return null;\n return <Text asHTML content={raw} />;\n }\n case 'header': {\n const text = stripHtml(String(data.text ?? ''));\n const level = Number(data.level ?? 3);\n if (!text) return null;\n const safeLevel = Math.min(Math.max(level, 1), 6);\n return createElement(\n Heading,\n { tag: `h${safeLevel}` as HeadingProps['tag'] },\n text,\n );\n }\n case 'list': {\n const items = Array.isArray(data.items) ? data.items : [];\n const sanitizedItems = items\n .map((item) => stripHtml(String(item ?? '')))\n .filter((item) => item.length > 0);\n\n if (sanitizedItems.length === 0) return null;\n\n if (data.style === 'ordered') {\n return (\n <ol className=\"ml-6 list-decimal space-y-1 text-sm\">\n {sanitizedItems.map((item, index) => (\n <li key={`${item}-${index}`}>{item}</li>\n ))}\n </ol>\n );\n }\n\n return (\n <ul className=\"ml-6 list-disc space-y-1 text-sm\">\n {sanitizedItems.map((item) => (\n <li key={item}>{item}</li>\n ))}\n </ul>\n );\n }\n case 'quote': {\n const text = String(data.text ?? '').trim();\n if (!text) return null;\n const caption = stripHtml(String(data.caption ?? ''));\n return (\n <blockquote className=\"border-muted text-muted-foreground border-l-2 pl-3 text-sm italic\">\n <Text asHTML content={text} />\n {caption.length > 0 && (\n <cite className=\"text-muted-foreground/80 mt-1 block text-xs not-italic\">\n — {caption}\n </cite>\n )}\n </blockquote>\n );\n }\n case 'delimiter':\n return (\n <div\n className=\"border-muted my-4 border-b border-dashed\"\n aria-hidden=\"true\"\n />\n );\n default: {\n const text = stripHtml(String(data.text ?? ''));\n if (!text) return null;\n return (\n <Text className=\"whitespace-pre-line\">\n {text}\n </Text>\n );\n }\n }\n}\n\nfunction stripHtml(value: string): string {\n return value.replace(/<[^>]*>/g, '').trim();\n}\n\nfunction decodeQuotedString(value: string | null | undefined): string {\n if (typeof value !== 'string') return '';\n const trimmed = value.trim();\n if (trimmed === '') return '';\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) return trimmed;\n try {\n const parsed = JSON.parse(trimmed);\n if (typeof parsed === 'string') return parsed;\n } catch {\n // ignore\n }\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n}\n","import { formatDistanceToNow } from 'date-fns';\nimport {\n CornerDownRight,\n Pencil,\n Pin,\n Smile,\n Trash2,\n} from 'lucide-react';\nimport type { FC } from 'react';\nimport { memo, useMemo } from 'react';\n\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from '@/components/base/display/avatar';\nimport { Badge } from '@/components/base/badge';\nimport { Button } from '@/components/base/buttons';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@/components/base/display/tooltip';\nimport { Text } from '@/components/typography';\nimport { cn } from '@/lib/utils';\n\nimport {\n useResolvedAccessors,\n useResolvedStrings,\n} from '../comments-provider';\nimport type {\n CommentAttachment,\n CommentItemProps,\n} from '../comments.types';\nimport { CommentAttachmentChip } from './comment-attachment-chip';\nimport { CommentContent } from './comment-content';\n\nconst FALLBACK_INITIAL = '?';\n\nconst defaultGetMediaUrl = (m: CommentAttachment | null | undefined) => m?.url;\nconst defaultGetMediaName = (m: CommentAttachment | null | undefined) => m?.name;\nconst defaultGetStatusLabel = (s: string) =>\n s.charAt(0).toUpperCase() + s.slice(1).replace(/_/g, ' ');\nconst defaultFormatRelativeTime = (iso: string) => {\n try {\n return formatDistanceToNow(new Date(iso), { addSuffix: true });\n } catch {\n return '—';\n }\n};\n\nexport const CommentItem = memo(function CommentItem<TResource extends string = string>({\n comment,\n canModerate,\n onDelete,\n onPinToggle,\n onReact,\n onReply,\n strings: stringsProp,\n getMediaUrl,\n getMediaName,\n getStatusLabel,\n formatRelativeTime,\n resources,\n renderAttachment,\n renderReference,\n}: CommentItemProps<import('../comments.types').CommentUser, unknown, TResource>) {\n const strings = useResolvedStrings(stringsProp);\n const accessors = useResolvedAccessors({\n getMediaUrl,\n getMediaName,\n getStatusLabel,\n formatRelativeTime,\n });\n\n const resolvedGetMediaUrl = accessors.getMediaUrl ?? defaultGetMediaUrl;\n const resolvedGetMediaName = accessors.getMediaName ?? defaultGetMediaName;\n const resolvedGetStatusLabel =\n accessors.getStatusLabel ?? defaultGetStatusLabel;\n const resolvedFormatRelativeTime =\n accessors.formatRelativeTime ?? defaultFormatRelativeTime;\n\n const authorName = comment.user?.name ?? strings.fallbackAuthor;\n const avatarUrl = comment.user?.avatar ?? undefined;\n\n const relativeTime = useMemo(() => {\n if (!comment.createdAt) return '—';\n return resolvedFormatRelativeTime(comment.createdAt);\n }, [comment.createdAt, resolvedFormatRelativeTime]);\n\n const fallbackInitial = useMemo(() => {\n if (!authorName) return FALLBACK_INITIAL;\n const trimmed = authorName.trim();\n return trimmed === ''\n ? FALLBACK_INITIAL\n : trimmed.charAt(0).toUpperCase();\n }, [authorName]);\n\n const tagList = useMemo(() => {\n if (Array.isArray(comment.tagsArray)) {\n return comment.tagsArray.filter(\n (tag): tag is string => typeof tag === 'string',\n );\n }\n if (comment.tagsArray && typeof comment.tagsArray === 'object') {\n return Object.values(comment.tagsArray).filter(\n (value): value is string => typeof value === 'string',\n );\n }\n return [];\n }, [comment.tagsArray]);\n\n const attachments = useMemo(() => {\n const list = comment.attachments ?? comment.media ?? [];\n return list.filter(\n (a): a is CommentAttachment => !!a && typeof a === 'object',\n );\n }, [comment.attachments, comment.media]);\n\n const reactions = comment.reactions ?? [];\n\n const isPinned = comment.isPinned === true;\n const isEdited = comment.isEdited === true;\n const showStatus = comment.status && comment.status !== 'active';\n const statusLabel =\n showStatus && comment.status ? resolvedGetStatusLabel(comment.status) : null;\n const canDeleteComment =\n comment.canDelete === true || canModerate === true;\n const canEditComment = comment.canEdit === true || canModerate === true;\n\n const hasAttachments = attachments.length > 0;\n\n return (\n <article\n className={cn(\n 'comment-item--component group relative overflow-hidden rounded-lg border transition-colors',\n 'border-border/60 bg-card hover:bg-muted/30 px-3 py-2.5',\n )}\n data-comment-id={comment.id}\n >\n <div className=\"flex min-w-0 items-start gap-3\">\n <Avatar className=\"mt-0.5 size-avatar shrink-0\">\n {!!avatarUrl && (\n <AvatarImage src={avatarUrl} alt={authorName} />\n )}\n <AvatarFallback className=\"bg-muted text-muted-foreground text-xs font-medium\">\n {fallbackInitial}\n </AvatarFallback>\n </Avatar>\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-baseline gap-2\">\n <Text\n tag=\"span\"\n weight=\"semibold\"\n className=\"truncate\"\n >\n {authorName}\n </Text>\n\n {!!isPinned && (\n <TooltipProvider delayDuration={0}>\n <Tooltip>\n <TooltipTrigger render={<span className=\"inline-flex shrink-0 self-center\" />}>\n <Pin className=\"text-warning size-3\" aria-hidden />\n </TooltipTrigger>\n <TooltipContent\n side=\"top\"\n className=\"text-xs\"\n >\n {strings.pinned}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n\n <Text\n tag=\"span\"\n size=\"xs\"\n type=\"secondary\"\n className=\"shrink-0 tabular-nums\"\n >\n {relativeTime}\n </Text>\n\n {!!isEdited && (\n <Text\n tag=\"span\"\n size=\"xs\"\n type=\"secondary\"\n className=\"shrink-0\"\n >\n {strings.edited}\n </Text>\n )}\n\n {!!showStatus && !!statusLabel && (\n <Badge variant=\"secondary\" className=\"self-center uppercase tracking-wide\">\n {statusLabel}\n </Badge>\n )}\n </div>\n\n <div className=\"mt-1 text-sm leading-relaxed\">\n <CommentContent\n comment={comment}\n resources={resources}\n renderReference={renderReference}\n />\n </div>\n\n {tagList.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n {tagList.map((tag) => (\n <Badge key={tag} variant=\"secondary\" className=\"uppercase tracking-wide\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n\n {hasAttachments && (\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n {attachments.map((attachment) => {\n if (renderAttachment) {\n return (\n <div key={attachment.id ?? attachment.name}>\n {renderAttachment(attachment)}\n </div>\n );\n }\n return (\n <CommentAttachmentChip\n key={attachment.id ?? attachment.name}\n attachment={attachment}\n accessors={{\n getMediaUrl: resolvedGetMediaUrl,\n getMediaName: resolvedGetMediaName,\n }}\n strings={stringsProp}\n />\n );\n })}\n </div>\n )}\n\n {reactions.length > 0 && (\n <div className=\"mt-2 flex flex-wrap items-center gap-1\">\n {reactions.map((reaction) => (\n <Button\n key={reaction.emoji}\n type=\"button\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n size=\"small\"\n onClick={() =>\n onReact && comment.id\n ? onReact(comment.id, reaction.emoji)\n : undefined\n }\n title={reaction.users?.join(', ')}\n className=\"h-auto rounded-full p-0\"\n >\n <Badge\n variant={reaction.mine ? 'primary' : 'secondary'}\n className=\"cursor-pointer transition-colors hover:opacity-90\"\n >\n <span aria-hidden className=\"leading-none\">\n {reaction.emoji}\n </span>\n <span className=\"tabular-nums\">{reaction.count}</span>\n </Badge>\n </Button>\n ))}\n </div>\n )}\n </div>\n\n {/* Trailing action cluster — single low-contrast group, hover/focus revealed. */}\n <div\n className={cn(\n 'absolute right-2 top-2 opacity-0 transition-opacity',\n 'group-hover:opacity-100 focus-within:opacity-100',\n 'inline-flex items-center gap-0.5 rounded-md bg-card/95 shadow-sm ring-1 ring-border/70',\n )}\n >\n {!!onReply && (\n <Button\n type=\"button\"\n size=\"icon-small\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n onClick={() =>\n comment.id && onReply(comment.id)\n }\n title={strings.replyLabel}\n aria-label={strings.replyLabel}\n >\n <CornerDownRight className=\"size-3.5\" />\n </Button>\n )}\n {!!onReact && (\n <Button\n type=\"button\"\n size=\"icon-small\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n onClick={() =>\n comment.id && onReact(comment.id, '👍')\n }\n title={strings.addReactionLabel}\n aria-label={strings.addReactionLabel}\n >\n <Smile className=\"size-3.5\" />\n </Button>\n )}\n {!!onPinToggle && canModerate && (\n <Button\n type=\"button\"\n size=\"icon-small\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n onClick={() => onPinToggle(comment)}\n title={isPinned ? strings.unpinLabel : strings.pinLabel}\n aria-label={isPinned ? strings.unpinLabel : strings.pinLabel}\n >\n <Pin\n className={cn(\n 'size-3.5',\n isPinned && 'text-warning',\n )}\n />\n </Button>\n )}\n {!!canEditComment && !!comment.id && (\n <Button\n type=\"button\"\n size=\"icon-small\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n title={strings.editLabel}\n aria-label={strings.editLabel}\n >\n <Pencil className=\"size-3.5\" />\n </Button>\n )}\n {!!canDeleteComment &&\n !!onDelete &&\n !!comment.id && (\n <Button\n type=\"button\"\n size=\"icon-small\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n className=\"hover:bg-destructive/10 hover:text-destructive\"\n onClick={() =>\n onDelete(comment.id as string)\n }\n title={strings.deleteLabel}\n aria-label={strings.deleteLabel}\n >\n <Trash2 className=\"size-3.5\" />\n </Button>\n )}\n </div>\n </div>\n </article>\n );\n}) as <TResource extends string = string>(\n props: CommentItemProps<import('../comments.types').CommentUser, unknown, TResource>,\n) => ReturnType<FC>;\n","import type { FC } from 'react';\n\nimport type { CommentTimelineProps, CommentUser } from '../comments.types';\nimport { CommentEmpty } from './comment-empty';\nimport { CommentItem } from './comment-item';\n\nexport const CommentTimeline = function CommentTimeline<\n TResource extends string = string,\n>({\n comments,\n canModerate,\n onDelete,\n onPinToggle,\n onReact,\n onReply,\n strings: stringsProp,\n getMediaUrl,\n getMediaName,\n getStatusLabel,\n formatRelativeTime,\n resources,\n renderItem,\n renderAttachment,\n renderReference,\n emptySlot,\n}: CommentTimelineProps<CommentUser, unknown, TResource>) {\n if (!comments.length) {\n return (\n <>\n {emptySlot ?? <CommentEmpty strings={stringsProp} />}\n </>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n {comments.map((comment, index) => {\n const defaultItem = (\n <CommentItem\n comment={comment}\n canModerate={canModerate}\n onDelete={onDelete}\n onPinToggle={onPinToggle}\n onReact={onReact}\n onReply={onReply}\n strings={stringsProp}\n getMediaUrl={getMediaUrl}\n getMediaName={getMediaName}\n getStatusLabel={getStatusLabel}\n formatRelativeTime={formatRelativeTime}\n resources={resources}\n renderAttachment={renderAttachment}\n renderReference={renderReference}\n />\n );\n\n if (renderItem) {\n return (\n <div key={comment.id ?? `comment-${index}`}>\n {renderItem({\n comment,\n canModerate: canModerate ?? false,\n onDelete,\n defaultItem,\n })}\n </div>\n );\n }\n\n return (\n <div key={comment.id ?? `comment-${index}`}>\n {defaultItem}\n </div>\n );\n })}\n </div>\n );\n} as <TResource extends string = string>(\n props: CommentTimelineProps<CommentUser, unknown, TResource>,\n) => ReturnType<FC>;\n","/**\n * Comments — top-level entry for the Comments feature.\n *\n * Composes the composer + timeline + empty state behind a single API.\n * Generic in `<TUser, TMeta, TResource>` so consumers can type their\n * domain (user shape, custom meta payload, resource-kind union).\n *\n * Per-mount wiring (callbacks, resources, accessors) flows as direct\n * props. Library-wide display defaults (composer position, etc.) come\n * from `<UIProvider>` — see `@/lib/ui-provider`. Slots, render-props,\n * and the headless `useComments()` hook cover the composability\n * spectrum.\n *\n * `CommentsCard` is exported as a back-compat alias for the previous\n * name; the API shape is identical.\n */\nimport { useCallback, useState } from 'react';\n\nimport { SmartCard } from '@/components/base/cards';\nimport { useCommentsConfig as useCommentsUIDefaults } from '@/lib/ui-provider';\n\nimport { useResolvedStrings } from './comments-provider';\nimport type {\n CommentData,\n CommentFormValues,\n CommentSubmitHelpers,\n CommentUser,\n CommentsProps,\n} from './comments.types';\nimport { CommentComposer } from './partials/comment-composer';\nimport { CommentEmpty } from './partials/comment-empty';\nimport { CommentTimeline } from './partials/comment-timeline';\n\nimport { cn } from '@/lib/utils';\nexport function Comments<\n TUser extends CommentUser = CommentUser,\n TMeta = unknown,\n TResource extends string = string,\n>(props: CommentsProps<TUser, TMeta, TResource>) {\n const ui = useCommentsUIDefaults();\n\n const composerPosition =\n props.composerPosition ?? ui.composerPosition ?? 'top';\n\n const canComment = props.canComment ?? false;\n const canModerate = props.canModerate ?? false;\n\n const onSubmit = props.onSubmit;\n const onDelete = props.onDelete;\n const onPinToggle = props.onPinToggle;\n const onReact = props.onReact;\n const onReply = props.onReply;\n\n const resources = props.resources;\n const attachments = props.attachments;\n\n const strings = useResolvedStrings(props.strings);\n const cardTitle = props.title === undefined ? strings.title : props.title;\n\n const [formErrors, setFormErrors] = useState<Record<string, string>>({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [resetKey, setResetKey] = useState(0);\n\n const submitHelpers: CommentSubmitHelpers = {\n setErrors: (errors) => setFormErrors(errors),\n reset: () => {\n setResetKey((k) => k + 1);\n setFormErrors({});\n setIsSubmitting(false);\n },\n setSubmitting: setIsSubmitting,\n };\n\n const handleSubmit = useCallback(\n (values: CommentFormValues<TResource>) => {\n if (!onSubmit) return;\n setIsSubmitting(true);\n setFormErrors({});\n onSubmit(values, submitHelpers);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onSubmit],\n );\n\n const composer = props.composerSlot ?? (\n canComment ? (\n <CommentComposer\n context={props.context}\n canComment={canComment}\n isSubmitting={isSubmitting}\n errors={formErrors}\n resetKey={resetKey}\n /*\n * Generic-erasure boundary: `<Comments<TResource>>` is\n * generic but `<CommentComposer>` types its props\n * against the default-string kind. Shapes are\n * structurally identical — only the kind union differs.\n */\n onSubmit={\n handleSubmit as (values: CommentFormValues) => void\n }\n strings={props.strings}\n resources={resources as never}\n attachments={attachments}\n />\n ) : null\n );\n\n /*\n * Same generic-erasure boundary as the composer block above:\n * `<Comments<TUser, TMeta, TResource>>` is generic, but\n * `<CommentTimeline>` types its `comments` and `onPinToggle` props\n * against `CommentData<CommentUser, unknown, TResource>` (default\n * `TUser`/`TMeta`). The shapes are structurally identical — `TUser`\n * narrows the author union and `TMeta` narrows the metadata payload,\n * neither of which the timeline reads — so the widening cast is\n * safe. Keep the cast localised here; do not propagate into the\n * timeline body.\n */\n const timeline = (\n <CommentTimeline\n comments={props.comments as ReadonlyArray<CommentData<CommentUser, unknown, TResource>>}\n canModerate={canModerate}\n onDelete={onDelete}\n onPinToggle={onPinToggle as (c: CommentData<CommentUser, unknown, TResource>) => void}\n onReact={onReact}\n onReply={onReply}\n strings={props.strings}\n getMediaUrl={props.getMediaUrl}\n getMediaName={props.getMediaName}\n getStatusLabel={props.getStatusLabel}\n formatRelativeTime={props.formatRelativeTime}\n resources={resources}\n // `renderItem` is generic over the consumer's `<TUser, TMeta,\n // TResource>` triple; `<CommentTimeline>` types it against\n // the default `CommentUser, unknown, string` triple. The\n // structural signature is the same — boundary cast only.\n renderItem={props.renderItem as never}\n renderAttachment={props.renderAttachment}\n renderReference={props.renderReference}\n emptySlot={\n props.emptySlot ?? <CommentEmpty strings={props.strings} />\n }\n />\n );\n\n const composerBlock = composer ? <div>{composer}</div> : null;\n\n const inner = (\n <div className=\"flex flex-col gap-4\">\n {props.headerSlot}\n {composerPosition === 'top' && composerBlock}\n {timeline}\n {composerPosition === 'bottom' && composerBlock}\n {props.footerSlot}\n </div>\n );\n\n if (props.bare) {\n return inner;\n }\n\n return (\n <SmartCard\n title={cardTitle === false ? undefined : cardTitle}\n description={strings.subtitle || undefined}\n padding=\"default\"\n className={cn('comments--component', props.className)}\n >\n {inner}\n </SmartCard>\n );\n}\n\n/** Back-compat alias — `CommentsCard` was the previous primary export. */\nexport const CommentsCard = Comments;\n","/**\n * useComments — headless state machine for the Comments feature.\n *\n * Tracks composer mode (idle | replying | editing), submit/delete\n * helpers, error state, and resetKey bumping. The default `<Comments>`\n * component composes this hook; consumers building a fully custom UI\n * can use it directly.\n */\nimport { useCallback, useState } from 'react';\n\nimport type {\n CommentData,\n CommentFormValues,\n CommentSubmitHelpers,\n CommentUser,\n CommentsConfig,\n} from '../comments.types';\n\nexport type ComposerMode<TResource extends string = string> =\n | { kind: 'idle' }\n | { kind: 'editing'; comment: CommentData<CommentUser, unknown, TResource> }\n | { kind: 'replying'; commentId: string; authorName?: string };\n\nexport interface UseCommentsOptions<\n TUser extends CommentUser = CommentUser,\n TMeta = unknown,\n TResource extends string = string,\n> {\n onSubmit?: CommentsConfig<TUser, TMeta, TResource>['onSubmit'];\n onUpdate?: CommentsConfig<TUser, TMeta, TResource>['onUpdate'];\n onDelete?: CommentsConfig<TUser, TMeta, TResource>['onDelete'];\n}\n\nexport interface UseCommentsReturn<\n TUser extends CommentUser = CommentUser,\n TMeta = unknown,\n TResource extends string = string,\n> {\n composerMode: ComposerMode<TResource>;\n isSubmitting: boolean;\n formErrors: Record<string, string>;\n resetKey: number;\n\n startReply: (comment: CommentData<TUser, TMeta, TResource>) => void;\n startEdit: (comment: CommentData<TUser, TMeta, TResource>) => void;\n cancelComposerMode: () => void;\n\n submit: (values: CommentFormValues<TResource>) => void;\n deleteComment: (id: string) => void;\n\n /** Imperative reset — bumps `resetKey` so the composer clears itself. */\n resetComposer: () => void;\n /** Helpers exposed to onSubmit/onUpdate. */\n helpers: CommentSubmitHelpers;\n}\n\nexport function useComments<\n TUser extends CommentUser = CommentUser,\n TMeta = unknown,\n TResource extends string = string,\n>(\n options: UseCommentsOptions<TUser, TMeta, TResource> = {},\n): UseCommentsReturn<TUser, TMeta, TResource> {\n const { onSubmit, onUpdate, onDelete } = options;\n\n const [composerMode, setComposerMode] = useState<ComposerMode<TResource>>({\n kind: 'idle',\n });\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [formErrors, setFormErrors] = useState<Record<string, string>>({});\n const [resetKey, setResetKey] = useState(0);\n\n const helpers: CommentSubmitHelpers = {\n setErrors: (errors) => setFormErrors(errors),\n reset: () => {\n setResetKey((k) => k + 1);\n setComposerMode({ kind: 'idle' });\n setFormErrors({});\n },\n setSubmitting: setIsSubmitting,\n };\n\n const startReply = useCallback(\n (comment: CommentData<TUser, TMeta, TResource>) => {\n setComposerMode({\n kind: 'replying',\n commentId: comment.id ?? '',\n authorName: comment.user?.name,\n });\n },\n [],\n );\n\n const startEdit = useCallback(\n (comment: CommentData<TUser, TMeta, TResource>) => {\n setComposerMode({ kind: 'editing', comment });\n },\n [],\n );\n\n const cancelComposerMode = useCallback(() => {\n setComposerMode({ kind: 'idle' });\n setFormErrors({});\n }, []);\n\n const submit = useCallback(\n (values: CommentFormValues<TResource>) => {\n setIsSubmitting(true);\n setFormErrors({});\n\n if (composerMode.kind === 'editing' && composerMode.comment.id) {\n if (!onUpdate) {\n setIsSubmitting(false);\n return;\n }\n onUpdate(composerMode.comment.id, values, helpers);\n return;\n }\n\n if (!onSubmit) {\n setIsSubmitting(false);\n return;\n }\n\n const payload: CommentFormValues<TResource> =\n composerMode.kind === 'replying'\n ? { ...values, replyToId: composerMode.commentId }\n : values;\n\n onSubmit(payload, helpers);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [composerMode, onSubmit, onUpdate],\n );\n\n const deleteComment = useCallback(\n (id: string) => {\n if (!onDelete || !id) return;\n onDelete(id);\n },\n [onDelete],\n );\n\n const resetComposer = useCallback(() => {\n setResetKey((k) => k + 1);\n setComposerMode({ kind: 'idle' });\n setFormErrors({});\n }, []);\n\n return {\n composerMode,\n isSubmitting,\n formErrors,\n resetKey,\n startReply,\n startEdit,\n cancelComposerMode,\n submit,\n deleteComment,\n resetComposer,\n helpers,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require("../lib/strings.cjs"),t=require("./ui-provider-DZWtUXf2.cjs"),n=require("../lib/utils.cjs"),r=require("./button-BMiPFJIb.cjs"),i=require("./tooltip-mvxZV_Lu.cjs"),a=require("./typography-GtkgK9QX.cjs"),o=require("./badge-B8xGFpfM.cjs"),s=require("./cards-Cu6p1Brd.cjs"),c=require("./popover-dWR7-MzY.cjs"),l=require("./avatar-BnKM_o2d.cjs"),u=require("./rich-text-editor-BXxGNbmI.cjs"),d=require("./mentions-CnVOuQJU.cjs");let f=require("react"),p=require("date-fns"),m=require("react/jsx-runtime"),h=require("lucide-react");var g={title:`Comments`,subtitle:``,empty:`No comments yet.`,emptyHint:`Start the conversation — your team will see it instantly.`,composerPlaceholder:`Write a comment…`,composerSubmit:`Post comment`,composerSubmitting:`Posting…`,composerSave:`Save changes`,invalidContent:`Comment cannot be empty.`,composerCancel:`Cancel`,composerEditingEyebrow:`Editing comment`,composerReplyingEyebrow:`Replying to {{name}}`,composerAttachmentLabel:`Attach file`,composerReferenceLabel:`Mention or link`,composerReferenceMenuTitle:`Insert reference`,composerReferenceSearchPlaceholder:`Search…`,composerReferenceEmpty:`No matches.`,composerReferenceLoading:`Searching…`,fallbackAuthor:`Anonymous`,pinned:`Pinned`,edited:`edited`,deleteLabel:`Delete`,editLabel:`Edit`,replyLabel:`Reply`,pinLabel:`Pin`,unpinLabel:`Unpin`,moreActionsLabel:`More actions`,confirmDeleteLabel:`Delete comment`,attachmentFallback:`Attachment`,attachmentRemoveLabel:`Remove attachment`,attachmentUploadingLabel:`Uploading…`,attachmentFailedLabel:`Upload failed`,attachmentTooLargeError:`File is too large.`,attachmentTooManyError:`Too many attachments.`,attachmentRetryLabel:`Retry`,attachmentDownloadLabel:`Download`,addReactionLabel:`Add reaction`,showRepliesLabel:`Show replies`,hideRepliesLabel:`Hide replies`};function _(e,t){return e.replace(/\{\{(\w+)\}\}/g,(e,n)=>{let r=t[n];return r==null?``:String(r)})}function v(t){return e.useStrings(g,t)}function y(e){let n=t.c(),r=t.i();return(0,f.useMemo)(()=>({getMediaUrl:e?.getMediaUrl??(e=>n.resolveUrl?.(e??{})),getMediaName:e?.getMediaName??(e=>n.resolveName?.(e??{})),getStatusLabel:e?.getStatusLabel,formatRelativeTime:e?.formatRelativeTime??r.formatRelativeTime}),[e,n,r.formatRelativeTime])}function b(e){return typeof e!=`number`||e<=0?null:e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function x(e){return e.mimeType?.startsWith(`image/`)?h.Image:e.mimeType===`application/pdf`||e.mimeType?.startsWith(`text/`)?h.FileText:e.mimeType?h.File:h.Paperclip}var S=({attachment:t,editable:i=!1,onRemove:o,onRetry:s,accessors:c,strings:l,compact:u=!1,className:d})=>{let f=e.useStrings(g,l),p=c?.getMediaUrl?.(t)??t.url,_=c?.getMediaName?.(t)??t.name??f.attachmentFallback,v=x(t),y=t.status===`uploading`,S=t.status===`failed`,C=b(t.size),w=y?f.attachmentUploadingLabel+(typeof t.progress==`number`?` ${Math.round(t.progress)}%`:``):S?t.error??f.attachmentFailedLabel:C,T=n.cn(`relative inline-flex min-w-0 max-w-[20rem] items-center gap-1.5 rounded-md`,`ring-1 ring-inset transition-colors`,u?`px-2 py-1 text-xs`:`px-2.5 py-1 text-xs`,S?`bg-destructive/[0.04] ring-destructive/30 hover:bg-destructive/[0.08]`:`bg-foreground/[0.03] ring-border/60 hover:bg-foreground/[0.06]`,d),E=y?(0,m.jsx)(h.Loader2,{className:n.cn(`shrink-0 animate-spin text-muted-foreground`,`size-3.5`),"aria-hidden":!0}):(0,m.jsx)(v,{className:n.cn(`shrink-0`,`size-3.5`,S?`text-destructive`:`text-muted-foreground`),"aria-hidden":!0}),D=(0,m.jsxs)(`span`,{className:`inline-flex min-w-0 items-baseline gap-1.5`,children:[(0,m.jsx)(a.s,{tag:`span`,size:`xs`,weight:`medium`,className:n.cn(`truncate`,S&&`text-destructive`),children:_}),w?(0,m.jsx)(a.s,{tag:`span`,size:`xxs`,type:`secondary`,className:`shrink-0 tabular-nums`,children:w}):null]});return(0,m.jsxs)(`div`,{className:T,children:[E,p&&!y&&!S?(0,m.jsx)(`a`,{href:p,target:`_blank`,rel:`noreferrer noopener`,className:`inline-flex min-w-0 flex-1 items-baseline gap-1.5 hover:underline`,"aria-label":f.attachmentDownloadLabel,children:D}):D,y&&typeof t.progress==`number`&&(0,m.jsx)(`div`,{className:`bg-primary/15 absolute bottom-0 left-2 right-2 h-px overflow-hidden rounded-full`,children:(0,m.jsx)(`div`,{className:`bg-primary h-full transition-[width]`,style:{width:`${Math.min(100,Math.max(0,t.progress))}%`}})}),S&&s&&(0,m.jsx)(r.t,{type:`button`,variant:`error`,buttonStyle:`ghost`,size:`small`,onClick:()=>s(t.id),className:`h-auto shrink-0 rounded px-1.5 py-px text-xxs font-medium ring-1 ring-inset ring-destructive/30 hover:ring-destructive/60`,children:f.attachmentRetryLabel}),i&&o&&(0,m.jsx)(r.t,{type:`button`,variant:`secondary`,buttonStyle:`ghost`,size:`icon-small`,onClick:()=>o(t.id),className:`-mr-0.5 size-4 shrink-0 rounded p-0 text-muted-foreground hover:bg-foreground/10 hover:text-foreground`,"aria-label":f.attachmentRemoveLabel,title:f.attachmentRemoveLabel,children:(0,m.jsx)(h.X,{className:`size-3`})})]})};function C(e={}){let{onUpload:t,maxSize:n,maxFiles:r,disabled:i,initialAttachments:a,onChange:o,onError:s}=e,[c,l]=(0,f.useState)(()=>a?[...a]:[]),u=(0,f.useRef)(new Map),d=(0,f.useRef)(new Map),p=(0,f.useRef)(o);p.current=o;let m=(0,f.useCallback)((e,t)=>{l(n=>n.map(n=>n.id===e?{...n,...t}:n))},[]),h=(0,f.useCallback)(e=>{l([...e])},[]),g=(0,f.useCallback)((e,n)=>{if(!t)return;let r=new AbortController;u.current.set(e,{controller:r}),m(e,{status:`uploading`,progress:0,error:void 0}),t({file:n,onProgress:t=>{m(e,{progress:t})},signal:r.signal}).then(t=>{u.current.delete(e),m(e,{...t,id:e,status:`uploaded`,progress:100,error:void 0})}).catch(t=>{if(u.current.delete(e),r.signal.aborted)return;let n=t instanceof Error?t.message:`Upload failed`;m(e,{status:`failed`,error:n}),s?.(n)})},[s,t,m]),_=(0,f.useCallback)(e=>{if(i||!t)return;let a=Array.from(e);a.length!==0&&l(e=>{let t=[...e];for(let e of a){if(typeof r==`number`&&t.length>=r){s?.(`Too many attachments.`);break}if(typeof n==`number`&&e.size>n){s?.(`File is too large.`);continue}let i=typeof crypto<`u`&&`randomUUID`in crypto?crypto.randomUUID():`att-${Date.now()}-${Math.random().toString(36).slice(2)}`;d.current.set(i,e),t.push({id:i,name:e.name,size:e.size,mimeType:e.type,status:`uploading`,progress:0}),queueMicrotask(()=>g(i,e))}return t})},[g,i,r,n,s,t]),v=(0,f.useCallback)(e=>{let t=u.current.get(e);t&&(t.controller.abort(),u.current.delete(e)),d.current.delete(e),l(t=>t.filter(t=>t.id!==e))},[]),y=(0,f.useCallback)(e=>{let t=d.current.get(e);t&&g(e,t)},[g]),b=(0,f.useCallback)(()=>{for(let e of u.current.values())e.controller.abort();u.current.clear(),d.current.clear(),l([])},[]);return(0,f.useEffect)(()=>{p.current?.(c)},[c]),(0,f.useEffect)(()=>{let e=u.current;return()=>{for(let t of e.values())t.controller.abort()}},[]),{attachments:c,uploadedAttachments:(0,f.useMemo)(()=>c.filter(e=>e.status===`uploaded`||!e.status),[c]),isUploading:(0,f.useMemo)(()=>c.some(e=>e.status===`uploading`),[c]),addFiles:_,removeAttachment:v,retryAttachment:y,setAttachments:h,reset:b}}function w(e){return!e||typeof e!=`string`?!1:e.replace(/<[^>]*>/g,``).trim().length>0}var T=(0,f.forwardRef)(function({context:e,canComment:t=!0,isSubmitting:n=!1,errors:i,resetKey:o=0,onSubmit:s,onCancel:l,editingComment:p,strings:g,resources:_,onResourceSearch:y,attachments:b,initialValues:x,autoFocus:T=!1,inlineSubmit:D=!0,placeholder:O},k){let A=v(g),j=_,M=y,N=b,P=(0,f.useRef)(null),[F,I]=(0,f.useState)(()=>x?.content??p?.content??``),[L,R]=(0,f.useState)(null),z=d.u({resources:j,onResourceSearch:M,editorRef:P,initialMentions:x?.references??p?.references}),B=C({...N,initialAttachments:x?.attachments??void 0});(0,f.useImperativeHandle)(k,()=>({focus:()=>P.current?.focus(),clear:()=>{P.current?.clear(),z.reset(),B.reset(),R(null)},setBody:e=>{P.current?.setHTML(e)}}),[B,z]),(0,f.useEffect)(()=>{P.current?.setHTML(x?.content??``),z.setMentions(x?.references??[]),B.setAttachments(x?.attachments??[]),R(null)},[e.id,e.type,o]),(0,f.useEffect)(()=>{if(!p)return;P.current?.setHTML(p.content??``),z.setMentions(p.references??[]);let e=(p.attachments??p.media??[]).filter(e=>!!e);B.setAttachments(e)},[p?.id]),(0,f.useEffect)(()=>{i?.content&&R(i.content)},[i]);let V=t=>{t?.preventDefault();let n=P.current?.getHTML()??F;if(!w(n)){R(A.invalidContent);return}R(null),s({content:n,commentableId:e.id,commentableType:e.type,contentType:`html`,references:z.mentions,attachments:B.uploadedAttachments,editingId:p?.id})},H=(0,f.useRef)(null),U=()=>H.current?.click(),W=e=>{e&&B.addFiles(e)},G=B.attachments.length>0,K=!!p,q=n?A.composerSubmitting:K?A.composerSave:A.composerSubmit,J=K?(0,m.jsx)(E,{label:A.composerEditingEyebrow,closeLabel:A.composerCancel,onClose:l}):null,Y=(0,f.useMemo)(()=>{let e=[];return j&&Object.keys(j).length>0&&e.push({id:`reference`,icon:h.AtSign,label:A.composerReferenceLabel,onClick:()=>z.setPickerOpen(!0)}),N?.onUpload&&!N.disabled&&e.push({id:`attachment`,icon:h.Paperclip,label:A.composerAttachmentLabel,onClick:U}),e},[j,N?.onUpload,N?.disabled,A.composerReferenceLabel,A.composerAttachmentLabel]);if(!t)return null;let X=(0,m.jsx)(r.t,{type:`button`,onClick:()=>V(),disabled:n||B.isUploading,icon:n?h.Loader2:h.Send,children:q}),Z=K||l?(0,m.jsx)(r.t,{type:`button`,variant:`secondary`,buttonStyle:`ghost`,onClick:l,disabled:n,children:A.composerCancel}):null,Q=G?(0,m.jsx)(`div`,{className:`flex flex-wrap items-center gap-1.5`,children:B.attachments.map(e=>(0,m.jsx)(S,{attachment:e,editable:!0,onRemove:B.removeAttachment,onRetry:B.retryAttachment,strings:g},e.id))}):null,$=G?Q:null,ee=D===!1?null:X,te=D===!1||K;return(0,m.jsxs)(`form`,{onSubmit:V,className:`space-y-2`,children:[J,(0,m.jsx)(`input`,{ref:H,type:`file`,multiple:!0,hidden:!0,accept:N?.accept,onChange:e=>{W(e.target.files),e.target.value=``}}),!z.triggerActive&&(0,m.jsxs)(c.n,{open:z.pickerOpen,onOpenChange:z.setPickerOpen,children:[(0,m.jsx)(c.s,{render:(0,m.jsx)(`button`,{type:`button`,className:`sr-only`,tabIndex:-1}),children:A.composerReferenceLabel}),(0,m.jsx)(d.r,{open:z.pickerOpen,activeKind:z.activeKind,setActiveKind:z.setActiveKind,kinds:z.kinds,resources:j,query:z.query,setQuery:z.setQuery,suggestions:z.suggestions,isLoading:z.isLoading,onSelect:z.pickSuggestion,strings:{title:A.composerReferenceMenuTitle,searchPlaceholder:A.composerReferenceSearchPlaceholder,empty:A.composerReferenceEmpty,loading:A.composerReferenceLoading}})]}),(0,m.jsxs)(`div`,{className:`relative`,children:[(0,m.jsx)(u.t,{ref:P,value:F,onChange:e=>{I(e);let t=d.t(e),n=z.mentions;if(n.map(e=>e.id).join(`|`)!==t.map(e=>e.id).join(`|`)){let e=new Map(n.map(e=>[e.id,e])),r=t.map(t=>e.get(t.id)??t);z.setMentions(r)}},placeholder:O??A.composerPlaceholder,strings:{editorLabel:O??A.composerPlaceholder},minHeight:`3rem`,autoFocus:T||K,extraToolbarItems:Y,toolbarTrailing:ee,footerSlot:$,onCaretChange:z.handleCaretChange}),(0,m.jsx)(d.n,{open:z.triggerActive&&z.pickerOpen,activeKind:z.activeKind,setActiveKind:z.setActiveKind,onManualKindChange:()=>z.setManualKindOverride(!0),kinds:z.kinds,resources:j,query:z.query,suggestions:z.suggestions,suggestionsByKind:z.suggestionsByKind,isLoading:z.isLoading,onSelect:z.pickSuggestion,strings:{title:A.composerReferenceMenuTitle,empty:A.composerReferenceEmpty,loading:A.composerReferenceLoading}})]}),L&&(0,m.jsx)(a.s,{size:`xs`,type:`error`,children:L}),te&&(0,m.jsxs)(`div`,{className:`flex items-center justify-end gap-2`,children:[Z,X]})]})});function E({label:e,closeLabel:t,onClose:n}){return(0,m.jsxs)(`div`,{className:`bg-muted/40 ring-border/60 flex items-center justify-between rounded px-2.5 py-1.5 ring-1 ring-inset`,children:[(0,m.jsx)(a.s,{size:`xxs`,type:`secondary`,weight:`medium`,className:`uppercase tracking-wide`,children:e}),n?(0,m.jsx)(r.t,{type:`button`,variant:`secondary`,buttonStyle:`ghost`,size:`icon-small`,onClick:n,className:`size-4 rounded p-0 text-muted-foreground hover:text-foreground`,"aria-label":t,children:(0,m.jsx)(h.X,{className:`size-3`})}):null]})}function D(e,t){return _(e,{name:t??``})}var O=({strings:e,icon:t,className:r})=>{let i=v(e);return(0,m.jsxs)(`div`,{className:n.cn(`flex flex-col items-center justify-center py-8 text-center`,r),children:[(0,m.jsx)(`div`,{className:`bg-muted/50 mb-3 flex h-12 w-12 items-center justify-center rounded-full`,children:t??(0,m.jsx)(h.MessageCircle,{className:`text-muted-foreground/60 h-5 w-5`})}),(0,m.jsx)(a.s,{weight:`medium`,children:i.empty}),i.emptyHint?(0,m.jsx)(a.s,{size:`xs`,type:`secondary`,className:`mt-1 max-w-[28ch]`,children:i.emptyHint}):null]})};function k(e){return(0,m.jsx)(A,{comment:e})}function A(e){let{comment:t,resources:n,renderReference:r,sanitizer:i}=e,o=t.contentType??t.content_type??`text`;return o===`rich`?j(t.content):o===`html`?(0,m.jsx)(d.o,{html:t.content??``,mentions:t.references,resources:n,renderMention:r,sanitizer:i}):(0,m.jsx)(a.s,{className:`whitespace-pre-line`,children:P(t.content??``)})}function j(e){if(!e)return null;try{let t=JSON.parse(e);return!t||!Array.isArray(t.blocks)||t.blocks.length===0?null:(0,m.jsx)(`div`,{className:`prose prose-sm prose-p:my-0.5 prose-headings:my-1 prose-a:text-primary prose-a:no-underline hover:prose-a:underline max-w-none space-y-1`,children:t.blocks.map((e,t)=>(0,m.jsx)(f.Fragment,{children:M(e)},e.id??`${e.type}-${t}`))})}catch{return(0,m.jsx)(a.s,{className:`whitespace-pre-line`,children:P(e)})}}function M(e){let t=e.data??{};switch(e.type){case`paragraph`:{let e=String(t.text??``).trim();return e?(0,m.jsx)(a.s,{asHTML:!0,content:e}):null}case`header`:{let e=N(String(t.text??``)),n=Number(t.level??3);return e?(0,f.createElement)(a.o,{tag:`h${Math.min(Math.max(n,1),6)}`},e):null}case`list`:{let e=(Array.isArray(t.items)?t.items:[]).map(e=>N(String(e??``))).filter(e=>e.length>0);return e.length===0?null:t.style===`ordered`?(0,m.jsx)(`ol`,{className:`ml-6 list-decimal space-y-1 text-sm`,children:e.map((e,t)=>(0,m.jsx)(`li`,{children:e},`${e}-${t}`))}):(0,m.jsx)(`ul`,{className:`ml-6 list-disc space-y-1 text-sm`,children:e.map(e=>(0,m.jsx)(`li`,{children:e},e))})}case`quote`:{let e=String(t.text??``).trim();if(!e)return null;let n=N(String(t.caption??``));return(0,m.jsxs)(`blockquote`,{className:`border-muted text-muted-foreground border-l-2 pl-3 text-sm italic`,children:[(0,m.jsx)(a.s,{asHTML:!0,content:e}),n.length>0&&(0,m.jsxs)(`cite`,{className:`text-muted-foreground/80 mt-1 block text-xs not-italic`,children:[`— `,n]})]})}case`delimiter`:return(0,m.jsx)(`div`,{className:`border-muted my-4 border-b border-dashed`,"aria-hidden":`true`});default:{let e=N(String(t.text??``));return e?(0,m.jsx)(a.s,{className:`whitespace-pre-line`,children:e}):null}}}function N(e){return e.replace(/<[^>]*>/g,``).trim()}function P(e){if(typeof e!=`string`)return``;let t=e.trim();if(t===``)return``;if(t.startsWith(`{`)||t.startsWith(`[`))return t;try{let e=JSON.parse(t);if(typeof e==`string`)return e}catch{}return t.startsWith(`"`)&&t.endsWith(`"`)?t.slice(1,-1):t}var F=`?`,I=e=>e?.url,L=e=>e?.name,R=e=>e.charAt(0).toUpperCase()+e.slice(1).replace(/_/g,` `),z=e=>{try{return(0,p.formatDistanceToNow)(new Date(e),{addSuffix:!0})}catch{return`—`}},B=(0,f.memo)(function({comment:e,canModerate:t,onDelete:s,onPinToggle:c,onReact:u,onReply:d,strings:p,getMediaUrl:g,getMediaName:_,getStatusLabel:b,formatRelativeTime:x,resources:C,renderAttachment:w,renderReference:T}){let E=v(p),D=y({getMediaUrl:g,getMediaName:_,getStatusLabel:b,formatRelativeTime:x}),O=D.getMediaUrl??I,k=D.getMediaName??L,j=D.getStatusLabel??R,M=D.formatRelativeTime??z,N=e.user?.name??E.fallbackAuthor,P=e.user?.avatar??void 0,B=(0,f.useMemo)(()=>e.createdAt?M(e.createdAt):`—`,[e.createdAt,M]),V=(0,f.useMemo)(()=>{if(!N)return F;let e=N.trim();return e===``?F:e.charAt(0).toUpperCase()},[N]),H=(0,f.useMemo)(()=>Array.isArray(e.tagsArray)?e.tagsArray.filter(e=>typeof e==`string`):e.tagsArray&&typeof e.tagsArray==`object`?Object.values(e.tagsArray).filter(e=>typeof e==`string`):[],[e.tagsArray]),U=(0,f.useMemo)(()=>(e.attachments??e.media??[]).filter(e=>!!e&&typeof e==`object`),[e.attachments,e.media]),W=e.reactions??[],G=e.isPinned===!0,K=e.isEdited===!0,q=e.status&&e.status!==`active`,J=q&&e.status?j(e.status):null,Y=e.canDelete===!0||t===!0,X=e.canEdit===!0||t===!0,Z=U.length>0;return(0,m.jsx)(`article`,{className:n.cn(`comment-item--component group relative overflow-hidden rounded-lg border transition-colors`,`border-border/60 bg-card hover:bg-muted/30 px-3 py-2.5`),"data-comment-id":e.id,children:(0,m.jsxs)(`div`,{className:`flex min-w-0 items-start gap-3`,children:[(0,m.jsxs)(l.t,{className:`mt-0.5 size-avatar shrink-0`,children:[!!P&&(0,m.jsx)(l.o,{src:P,alt:N}),(0,m.jsx)(l.r,{className:`bg-muted text-muted-foreground text-xs font-medium`,children:V})]}),(0,m.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,m.jsxs)(`div`,{className:`flex min-w-0 items-baseline gap-2`,children:[(0,m.jsx)(a.s,{tag:`span`,weight:`semibold`,className:`truncate`,children:N}),!!G&&(0,m.jsx)(i.r,{delayDuration:0,children:(0,m.jsxs)(i.t,{children:[(0,m.jsx)(i.i,{render:(0,m.jsx)(`span`,{className:`inline-flex shrink-0 self-center`}),children:(0,m.jsx)(h.Pin,{className:`text-warning size-3`,"aria-hidden":!0})}),(0,m.jsx)(i.n,{side:`top`,className:`text-xs`,children:E.pinned})]})}),(0,m.jsx)(a.s,{tag:`span`,size:`xs`,type:`secondary`,className:`shrink-0 tabular-nums`,children:B}),!!K&&(0,m.jsx)(a.s,{tag:`span`,size:`xs`,type:`secondary`,className:`shrink-0`,children:E.edited}),!!q&&!!J&&(0,m.jsx)(o.t,{variant:`secondary`,className:`self-center uppercase tracking-wide`,children:J})]}),(0,m.jsx)(`div`,{className:`mt-1 text-sm leading-relaxed`,children:(0,m.jsx)(A,{comment:e,resources:C,renderReference:T})}),H.length>0&&(0,m.jsx)(`div`,{className:`mt-2 flex flex-wrap gap-1.5`,children:H.map(e=>(0,m.jsx)(o.t,{variant:`secondary`,className:`uppercase tracking-wide`,children:e},e))}),Z&&(0,m.jsx)(`div`,{className:`mt-2 flex flex-wrap gap-1.5`,children:U.map(e=>w?(0,m.jsx)(`div`,{children:w(e)},e.id??e.name):(0,m.jsx)(S,{attachment:e,accessors:{getMediaUrl:O,getMediaName:k},strings:p},e.id??e.name))}),W.length>0&&(0,m.jsx)(`div`,{className:`mt-2 flex flex-wrap items-center gap-1`,children:W.map(t=>(0,m.jsx)(r.t,{type:`button`,variant:`secondary`,buttonStyle:`ghost`,size:`small`,onClick:()=>u&&e.id?u(e.id,t.emoji):void 0,title:t.users?.join(`, `),className:`h-auto rounded-full p-0`,children:(0,m.jsxs)(o.t,{variant:t.mine?`primary`:`secondary`,className:`cursor-pointer transition-colors hover:opacity-90`,children:[(0,m.jsx)(`span`,{"aria-hidden":!0,className:`leading-none`,children:t.emoji}),(0,m.jsx)(`span`,{className:`tabular-nums`,children:t.count})]})},t.emoji))})]}),(0,m.jsxs)(`div`,{className:n.cn(`absolute right-2 top-2 opacity-0 transition-opacity`,`group-hover:opacity-100 focus-within:opacity-100`,`inline-flex items-center gap-0.5 rounded-md bg-card/95 shadow-sm ring-1 ring-border/70`),children:[!!d&&(0,m.jsx)(r.t,{type:`button`,size:`icon-small`,variant:`secondary`,buttonStyle:`ghost`,onClick:()=>e.id&&d(e.id),title:E.replyLabel,"aria-label":E.replyLabel,children:(0,m.jsx)(h.CornerDownRight,{className:`size-3.5`})}),!!u&&(0,m.jsx)(r.t,{type:`button`,size:`icon-small`,variant:`secondary`,buttonStyle:`ghost`,onClick:()=>e.id&&u(e.id,`👍`),title:E.addReactionLabel,"aria-label":E.addReactionLabel,children:(0,m.jsx)(h.Smile,{className:`size-3.5`})}),!!c&&t&&(0,m.jsx)(r.t,{type:`button`,size:`icon-small`,variant:`secondary`,buttonStyle:`ghost`,onClick:()=>c(e),title:G?E.unpinLabel:E.pinLabel,"aria-label":G?E.unpinLabel:E.pinLabel,children:(0,m.jsx)(h.Pin,{className:n.cn(`size-3.5`,G&&`text-warning`)})}),!!X&&!!e.id&&(0,m.jsx)(r.t,{type:`button`,size:`icon-small`,variant:`secondary`,buttonStyle:`ghost`,title:E.editLabel,"aria-label":E.editLabel,children:(0,m.jsx)(h.Pencil,{className:`size-3.5`})}),!!Y&&!!s&&!!e.id&&(0,m.jsx)(r.t,{type:`button`,size:`icon-small`,variant:`secondary`,buttonStyle:`ghost`,className:`hover:bg-destructive/10 hover:text-destructive`,onClick:()=>s(e.id),title:E.deleteLabel,"aria-label":E.deleteLabel,children:(0,m.jsx)(h.Trash2,{className:`size-3.5`})})]})]})})}),V=function({comments:e,canModerate:t,onDelete:n,onPinToggle:r,onReact:i,onReply:a,strings:o,getMediaUrl:s,getMediaName:c,getStatusLabel:l,formatRelativeTime:u,resources:d,renderItem:f,renderAttachment:p,renderReference:h,emptySlot:g}){return e.length?(0,m.jsx)(`div`,{className:`flex flex-col gap-2`,children:e.map((e,g)=>{let _=(0,m.jsx)(B,{comment:e,canModerate:t,onDelete:n,onPinToggle:r,onReact:i,onReply:a,strings:o,getMediaUrl:s,getMediaName:c,getStatusLabel:l,formatRelativeTime:u,resources:d,renderAttachment:p,renderReference:h});return f?(0,m.jsx)(`div`,{children:f({comment:e,canModerate:t??!1,onDelete:n,defaultItem:_})},e.id??`comment-${g}`):(0,m.jsx)(`div`,{children:_},e.id??`comment-${g}`)})}):(0,m.jsx)(m.Fragment,{children:g??(0,m.jsx)(O,{strings:o})})};function H(e){let r=t.r(),i=e.composerPosition??r.composerPosition??`top`,a=e.canComment??!1,o=e.canModerate??!1,c=e.onSubmit,l=e.onDelete,u=e.onPinToggle,d=e.onReact,p=e.onReply,h=e.resources,g=e.attachments,_=v(e.strings),y=e.title===void 0?_.title:e.title,[b,x]=(0,f.useState)({}),[S,C]=(0,f.useState)(!1),[w,E]=(0,f.useState)(0),D={setErrors:e=>x(e),reset:()=>{E(e=>e+1),x({}),C(!1)},setSubmitting:C},k=(0,f.useCallback)(e=>{c&&(C(!0),x({}),c(e,D))},[c]),A=e.composerSlot??(a?(0,m.jsx)(T,{context:e.context,canComment:a,isSubmitting:S,errors:b,resetKey:w,onSubmit:k,strings:e.strings,resources:h,attachments:g}):null),j=(0,m.jsx)(V,{comments:e.comments,canModerate:o,onDelete:l,onPinToggle:u,onReact:d,onReply:p,strings:e.strings,getMediaUrl:e.getMediaUrl,getMediaName:e.getMediaName,getStatusLabel:e.getStatusLabel,formatRelativeTime:e.formatRelativeTime,resources:h,renderItem:e.renderItem,renderAttachment:e.renderAttachment,renderReference:e.renderReference,emptySlot:e.emptySlot??(0,m.jsx)(O,{strings:e.strings})}),M=A?(0,m.jsx)(`div`,{children:A}):null,N=(0,m.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[e.headerSlot,i===`top`&&M,j,i===`bottom`&&M,e.footerSlot]});return e.bare?N:(0,m.jsx)(s.t,{title:y===!1?void 0:y,description:_.subtitle||void 0,padding:`default`,className:n.cn(`comments--component`,e.className),children:N})}var U=H;function W(e={}){let{onSubmit:t,onUpdate:n,onDelete:r}=e,[i,a]=(0,f.useState)({kind:`idle`}),[o,s]=(0,f.useState)(!1),[c,l]=(0,f.useState)({}),[u,d]=(0,f.useState)(0),p={setErrors:e=>l(e),reset:()=>{d(e=>e+1),a({kind:`idle`}),l({})},setSubmitting:s};return{composerMode:i,isSubmitting:o,formErrors:c,resetKey:u,startReply:(0,f.useCallback)(e=>{a({kind:`replying`,commentId:e.id??``,authorName:e.user?.name})},[]),startEdit:(0,f.useCallback)(e=>{a({kind:`editing`,comment:e})},[]),cancelComposerMode:(0,f.useCallback)(()=>{a({kind:`idle`}),l({})},[]),submit:(0,f.useCallback)(e=>{if(s(!0),l({}),i.kind===`editing`&&i.comment.id){if(!n){s(!1);return}n(i.comment.id,e,p);return}if(!t){s(!1);return}t(i.kind===`replying`?{...e,replyToId:i.commentId}:e,p)},[i,t,n]),deleteComment:(0,f.useCallback)(e=>{!r||!e||r(e)},[r]),resetComposer:(0,f.useCallback)(()=>{d(e=>e+1),a({kind:`idle`}),l({})},[]),helpers:p}}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return D}});
2
+ //# sourceMappingURL=comments-DBe6dP-d.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments-DBe6dP-d.cjs","names":[],"sources":["../../src/components/features/comments/comments.strings.ts","../../src/components/features/comments/comments-provider.tsx","../../src/components/features/comments/partials/comment-attachment-chip.tsx","../../src/components/features/comments/hooks/use-attachment-upload.ts","../../src/components/features/comments/partials/comment-composer.tsx","../../src/components/features/comments/partials/comment-empty.tsx","../../src/components/features/comments/partials/comment-content.tsx","../../src/components/features/comments/partials/comment-item.tsx","../../src/components/features/comments/partials/comment-timeline.tsx","../../src/components/features/comments/comments.tsx","../../src/components/features/comments/hooks/use-comments.ts"],"sourcesContent":["/**\n * Strings for the Comments feature. Consumers override via the `strings`\n * prop on `<Comments>` / `<CommentsCard>` / sub-components — values are\n * deep-merged over these defaults.\n */\nexport interface CommentsStrings {\n /** Card title — usually \"Comments\". Set to \"\" to hide. */\n title: string;\n /** Subtitle under the card title — optional. */\n subtitle: string;\n /** Empty-state copy for the timeline. */\n empty: string;\n /** Empty-state secondary copy. */\n emptyHint: string;\n\n // Composer ---------------------------------------------------------\n /** Composer rich-text placeholder. */\n composerPlaceholder: string;\n /** Submit label for new comments. */\n composerSubmit: string;\n /** Submit label while pending. */\n composerSubmitting: string;\n /** Submit label when editing. */\n composerSave: string;\n /** Required-content error. */\n invalidContent: string;\n /** Cancel/dismiss draft. */\n composerCancel: string;\n /** \"Edit comment\" eyebrow shown above the composer in edit mode. */\n composerEditingEyebrow: string;\n /** \"Reply to {{name}}\" eyebrow shown above the composer in reply mode. */\n composerReplyingEyebrow: string;\n\n // Toolbar buttons --------------------------------------------------\n composerAttachmentLabel: string;\n composerReferenceLabel: string;\n composerReferenceMenuTitle: string;\n composerReferenceSearchPlaceholder: string;\n composerReferenceEmpty: string;\n composerReferenceLoading: string;\n\n // Item -------------------------------------------------------------\n fallbackAuthor: string;\n pinned: string;\n edited: string;\n /** Trash button aria-label / tooltip. */\n deleteLabel: string;\n /** Edit button label. */\n editLabel: string;\n /** Reply button label. */\n replyLabel: string;\n /** Pin/unpin button label. */\n pinLabel: string;\n unpinLabel: string;\n /** \"More actions\" trigger aria-label. */\n moreActionsLabel: string;\n /** Confirm-delete button label inside the action menu. */\n confirmDeleteLabel: string;\n\n // Attachments ------------------------------------------------------\n attachmentFallback: string;\n attachmentRemoveLabel: string;\n attachmentUploadingLabel: string;\n attachmentFailedLabel: string;\n attachmentTooLargeError: string;\n attachmentTooManyError: string;\n attachmentRetryLabel: string;\n attachmentDownloadLabel: string;\n\n // Reactions --------------------------------------------------------\n addReactionLabel: string;\n\n // Misc -------------------------------------------------------------\n showRepliesLabel: string;\n hideRepliesLabel: string;\n}\n\nexport const defaultCommentsStrings: CommentsStrings = {\n title: 'Comments',\n subtitle: '',\n empty: 'No comments yet.',\n emptyHint: 'Start the conversation — your team will see it instantly.',\n\n composerPlaceholder: 'Write a comment…',\n composerSubmit: 'Post comment',\n composerSubmitting: 'Posting…',\n composerSave: 'Save changes',\n invalidContent: 'Comment cannot be empty.',\n composerCancel: 'Cancel',\n composerEditingEyebrow: 'Editing comment',\n composerReplyingEyebrow: 'Replying to {{name}}',\n\n composerAttachmentLabel: 'Attach file',\n composerReferenceLabel: 'Mention or link',\n composerReferenceMenuTitle: 'Insert reference',\n composerReferenceSearchPlaceholder: 'Search…',\n composerReferenceEmpty: 'No matches.',\n composerReferenceLoading: 'Searching…',\n\n fallbackAuthor: 'Anonymous',\n pinned: 'Pinned',\n edited: 'edited',\n deleteLabel: 'Delete',\n editLabel: 'Edit',\n replyLabel: 'Reply',\n pinLabel: 'Pin',\n unpinLabel: 'Unpin',\n moreActionsLabel: 'More actions',\n confirmDeleteLabel: 'Delete comment',\n\n attachmentFallback: 'Attachment',\n attachmentRemoveLabel: 'Remove attachment',\n attachmentUploadingLabel: 'Uploading…',\n attachmentFailedLabel: 'Upload failed',\n attachmentTooLargeError: 'File is too large.',\n attachmentTooManyError: 'Too many attachments.',\n attachmentRetryLabel: 'Retry',\n attachmentDownloadLabel: 'Download',\n\n addReactionLabel: 'Add reaction',\n\n showRepliesLabel: 'Show replies',\n hideRepliesLabel: 'Hide replies',\n};\n\n/**\n * Tiny `{{token}}` interpolator used by templated strings like\n * `composerReplyingEyebrow`. No HTML escaping — treat values as plain text.\n */\nexport function interpolateString(\n template: string,\n values: Record<string, string | number | undefined>,\n): string {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key: string) => {\n const value = values[key];\n return value === undefined || value === null ? '' : String(value);\n });\n}\n","/**\n * Comments — internal helper hooks for resolving strings and accessors.\n *\n * Rationale: the previous `<CommentsProvider>` is gone. Library-wide\n * defaults now live in `<UIProvider>` (`useMediaConfig` / `useDatesConfig`).\n * Per-mount overrides flow as direct props on `<Comments>` and its\n * partials. These helpers just centralize the merge order.\n *\n * Resolution order everywhere:\n *\n * props.strings ← deep-merged over `defaultCommentsStrings`\n * props.accessor.X ← falls back to UIProvider's media/dates resolvers,\n * then to a built-in default at the call site.\n */\nimport { useMemo } from 'react';\n\nimport { useStrings, type StringsProp } from '@/lib/strings';\nimport { useDatesConfig, useMediaConfig } from '@/lib/ui-provider';\n\nimport {\n defaultCommentsStrings,\n type CommentsStrings,\n} from './comments.strings';\nimport type { CommentAttachment, CommentsAccessors } from './comments.types';\n\n/**\n * Resolve final strings by merging defaults → component prop. Stable\n * identity when the prop reference is unchanged.\n */\nexport function useResolvedStrings(\n propStrings?: StringsProp<CommentsStrings>,\n): CommentsStrings {\n return useStrings(defaultCommentsStrings, propStrings);\n}\n\n/**\n * Resolve accessors. Order:\n * 1. explicit prop accessor\n * 2. matching UIProvider slot (`useMediaConfig().resolveUrl`, etc.)\n * 3. caller's own fallback when neither is present (handled at call site)\n */\nexport function useResolvedAccessors(\n propAccessors?: CommentsAccessors,\n): CommentsAccessors {\n const media = useMediaConfig();\n const dates = useDatesConfig();\n return useMemo<CommentsAccessors>(\n () => ({\n getMediaUrl:\n propAccessors?.getMediaUrl ??\n ((m: CommentAttachment | null | undefined) =>\n media.resolveUrl?.((m ?? {}) as { url?: string; key?: string })),\n getMediaName:\n propAccessors?.getMediaName ??\n ((m: CommentAttachment | null | undefined) =>\n media.resolveName?.((m ?? {}) as { name?: string })),\n getStatusLabel: propAccessors?.getStatusLabel,\n formatRelativeTime:\n propAccessors?.formatRelativeTime ?? dates.formatRelativeTime,\n }),\n [propAccessors, media, dates.formatRelativeTime],\n );\n}\n","/**\n * CommentAttachmentChip — small attachment pill used in the composer draft\n * and the timeline. Single inline row: icon + name · size, with progress /\n * error states overlaid on the same line. Editable mode reveals a remove\n * button; failed uploads expose a retry pill.\n */\nimport { File, FileText, Image as ImageIcon, Loader2, Paperclip, X } from 'lucide-react';\nimport type { FC } from 'react';\n\nimport { Button } from '@/components/base/buttons';\nimport { Text } from '@/components/typography';\nimport { useStrings, type StringsProp } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\n\nimport type {\n CommentAttachment,\n CommentsAccessors,\n} from '../comments.types';\nimport {\n defaultCommentsStrings,\n type CommentsStrings,\n} from '../comments.strings';\n\nexport interface CommentAttachmentChipProps {\n attachment: CommentAttachment;\n /** Editable mode shows a remove button. */\n editable?: boolean;\n onRemove?: (id: string) => void;\n onRetry?: (id: string) => void;\n accessors?: CommentsAccessors;\n strings?: StringsProp<CommentsStrings>;\n /** Compact chips have smaller text and tighter padding. */\n compact?: boolean;\n className?: string;\n}\n\nfunction formatBytes(bytes?: number): string | null {\n if (typeof bytes !== 'number' || bytes <= 0) return null;\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction pickIcon(att: CommentAttachment) {\n if (att.mimeType?.startsWith('image/')) return ImageIcon;\n if (att.mimeType === 'application/pdf') return FileText;\n if (att.mimeType?.startsWith('text/')) return FileText;\n if (att.mimeType) return File;\n return Paperclip;\n}\n\nexport const CommentAttachmentChip: FC<CommentAttachmentChipProps> = ({\n attachment,\n editable = false,\n onRemove,\n onRetry,\n accessors,\n strings: stringsProp,\n compact = false,\n className,\n}) => {\n const strings = useStrings(defaultCommentsStrings, stringsProp);\n\n const url = accessors?.getMediaUrl?.(attachment) ?? attachment.url;\n const name =\n accessors?.getMediaName?.(attachment) ??\n attachment.name ??\n strings.attachmentFallback;\n const Icon = pickIcon(attachment);\n\n const isUploading = attachment.status === 'uploading';\n const isFailed = attachment.status === 'failed';\n const sizeLabel = formatBytes(attachment.size);\n\n const meta = isUploading\n ? strings.attachmentUploadingLabel +\n (typeof attachment.progress === 'number'\n ? ` ${Math.round(attachment.progress)}%`\n : '')\n : isFailed\n ? attachment.error ?? strings.attachmentFailedLabel\n : sizeLabel;\n\n const surface = cn(\n 'relative inline-flex min-w-0 max-w-[20rem] items-center gap-1.5 rounded-md',\n 'ring-1 ring-inset transition-colors',\n compact ? 'px-2 py-1 text-xs' : 'px-2.5 py-1 text-xs',\n isFailed\n ? 'bg-destructive/[0.04] ring-destructive/30 hover:bg-destructive/[0.08]'\n : 'bg-foreground/[0.03] ring-border/60 hover:bg-foreground/[0.06]',\n className,\n );\n\n const iconNode = isUploading ? (\n <Loader2\n className={cn('shrink-0 animate-spin text-muted-foreground', 'size-3.5')}\n aria-hidden\n />\n ) : (\n <Icon\n className={cn(\n 'shrink-0',\n 'size-3.5',\n isFailed ? 'text-destructive' : 'text-muted-foreground',\n )}\n aria-hidden\n />\n );\n\n const labelRow = (\n <span className=\"inline-flex min-w-0 items-baseline gap-1.5\">\n <Text\n tag=\"span\"\n size=\"xs\"\n weight=\"medium\"\n className={cn('truncate', isFailed && 'text-destructive')}\n >\n {name}\n </Text>\n {meta ? (\n <Text\n tag=\"span\"\n size=\"xxs\"\n type=\"secondary\"\n className=\"shrink-0 tabular-nums\"\n >\n {meta}\n </Text>\n ) : null}\n </span>\n );\n\n const isInteractive = !!url && !isUploading && !isFailed;\n\n return (\n <div className={surface}>\n {iconNode}\n {isInteractive ? (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"inline-flex min-w-0 flex-1 items-baseline gap-1.5 hover:underline\"\n aria-label={strings.attachmentDownloadLabel}\n >\n {labelRow}\n </a>\n ) : (\n labelRow\n )}\n\n {isUploading && typeof attachment.progress === 'number' && (\n <div className=\"bg-primary/15 absolute bottom-0 left-2 right-2 h-px overflow-hidden rounded-full\">\n <div\n className=\"bg-primary h-full transition-[width]\"\n style={{\n width: `${Math.min(100, Math.max(0, attachment.progress))}%`,\n }}\n />\n </div>\n )}\n\n {isFailed && onRetry && (\n <Button\n type=\"button\"\n variant=\"error\"\n buttonStyle=\"ghost\"\n size=\"small\"\n onClick={() => onRetry(attachment.id)}\n className=\"h-auto shrink-0 rounded px-1.5 py-px text-xxs font-medium ring-1 ring-inset ring-destructive/30 hover:ring-destructive/60\"\n >\n {strings.attachmentRetryLabel}\n </Button>\n )}\n\n {editable && onRemove && (\n <Button\n type=\"button\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n size=\"icon-small\"\n onClick={() => onRemove(attachment.id)}\n className=\"-mr-0.5 size-4 shrink-0 rounded p-0 text-muted-foreground hover:bg-foreground/10 hover:text-foreground\"\n aria-label={strings.attachmentRemoveLabel}\n title={strings.attachmentRemoveLabel}\n >\n <X className=\"size-3\" />\n </Button>\n )}\n </div>\n );\n};\n","/**\n * useAttachmentUpload — manages a list of in-flight + uploaded\n * `CommentAttachment`s for a comment composer.\n *\n * Pass the consumer-supplied `onUpload` callback directly via the\n * `attachments` prop on `<Comments>` (or `<CommentComposer>`). Aborts\n * in-flight uploads when an attachment is removed.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport type {\n CommentAttachment,\n CommentsAttachmentsConfig,\n} from '../comments.types';\n\ninterface InFlightEntry {\n controller: AbortController;\n}\n\nexport interface UseAttachmentUploadOptions extends CommentsAttachmentsConfig {\n /** Initial attachments — useful when editing an existing comment. */\n initialAttachments?: ReadonlyArray<CommentAttachment>;\n /** Fires when the list of uploaded attachments changes. */\n onChange?: (attachments: ReadonlyArray<CommentAttachment>) => void;\n /** Fires when a validation or upload error happens. */\n onError?: (error: string) => void;\n}\n\nexport interface UseAttachmentUploadReturn {\n /** All attachments — uploading + uploaded + failed. */\n attachments: ReadonlyArray<CommentAttachment>;\n /** Subset of attachments that finished uploading. Use this in the form payload. */\n uploadedAttachments: ReadonlyArray<CommentAttachment>;\n /** True while at least one upload is in flight. */\n isUploading: boolean;\n /** Add files. Validates against `maxSize` / `maxFiles` first. */\n addFiles: (files: ReadonlyArray<File> | FileList) => void;\n /** Remove an attachment by id (aborts in-flight uploads). */\n removeAttachment: (id: string) => void;\n /** Retry a failed upload. */\n retryAttachment: (id: string) => void;\n /** Replace the list (used when editing or after submit). */\n setAttachments: (attachments: ReadonlyArray<CommentAttachment>) => void;\n /** Clear the list and abort everything in flight. */\n reset: () => void;\n}\n\nexport function useAttachmentUpload(\n options: UseAttachmentUploadOptions = {},\n): UseAttachmentUploadReturn {\n const {\n onUpload,\n maxSize,\n maxFiles,\n // `accept` is consumed by the surrounding `<input type=\"file\"\n // accept>` element, not here — destructuring is intentional\n // even though we don't reference it inside the hook.\n disabled,\n initialAttachments,\n onChange,\n onError,\n } = options;\n\n const [attachments, setAttachmentsState] = useState<CommentAttachment[]>(() =>\n initialAttachments ? [...initialAttachments] : [],\n );\n const inFlightRef = useRef<Map<string, InFlightEntry>>(new Map());\n const fileCacheRef = useRef<Map<string, File>>(new Map());\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const updateAttachment = useCallback(\n (id: string, patch: Partial<CommentAttachment>) => {\n setAttachmentsState((prev) =>\n prev.map((a) => (a.id === id ? { ...a, ...patch } : a)),\n );\n },\n [],\n );\n\n const setAttachments = useCallback(\n (next: ReadonlyArray<CommentAttachment>) => {\n setAttachmentsState([...next]);\n },\n [],\n );\n\n const beginUpload = useCallback(\n (id: string, file: File) => {\n if (!onUpload) return;\n const controller = new AbortController();\n inFlightRef.current.set(id, { controller });\n\n updateAttachment(id, {\n status: 'uploading',\n progress: 0,\n error: undefined,\n });\n\n const onProgress = (progress: number) => {\n updateAttachment(id, { progress });\n };\n\n onUpload({ file, onProgress, signal: controller.signal })\n .then((uploaded) => {\n inFlightRef.current.delete(id);\n updateAttachment(id, {\n ...uploaded,\n id,\n status: 'uploaded',\n progress: 100,\n error: undefined,\n });\n })\n .catch((err: unknown) => {\n inFlightRef.current.delete(id);\n if (controller.signal.aborted) {\n return;\n }\n const message =\n err instanceof Error ? err.message : 'Upload failed';\n updateAttachment(id, {\n status: 'failed',\n error: message,\n });\n onError?.(message);\n });\n },\n [onError, onUpload, updateAttachment],\n );\n\n const addFiles = useCallback(\n (filesInput: ReadonlyArray<File> | FileList) => {\n if (disabled || !onUpload) return;\n const files = Array.from(filesInput);\n if (files.length === 0) return;\n\n setAttachmentsState((prev) => {\n const next = [...prev];\n for (const file of files) {\n if (\n typeof maxFiles === 'number' &&\n next.length >= maxFiles\n ) {\n onError?.('Too many attachments.');\n break;\n }\n if (\n typeof maxSize === 'number' &&\n file.size > maxSize\n ) {\n onError?.('File is too large.');\n continue;\n }\n\n const id =\n typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID()\n : `att-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n fileCacheRef.current.set(id, file);\n\n next.push({\n id,\n name: file.name,\n size: file.size,\n mimeType: file.type,\n status: 'uploading',\n progress: 0,\n });\n\n queueMicrotask(() => beginUpload(id, file));\n }\n return next;\n });\n },\n [beginUpload, disabled, maxFiles, maxSize, onError, onUpload],\n );\n\n const removeAttachment = useCallback((id: string) => {\n const entry = inFlightRef.current.get(id);\n if (entry) {\n entry.controller.abort();\n inFlightRef.current.delete(id);\n }\n fileCacheRef.current.delete(id);\n setAttachmentsState((prev) => prev.filter((a) => a.id !== id));\n }, []);\n\n const retryAttachment = useCallback(\n (id: string) => {\n const file = fileCacheRef.current.get(id);\n if (!file) return;\n beginUpload(id, file);\n },\n [beginUpload],\n );\n\n const reset = useCallback(() => {\n for (const entry of inFlightRef.current.values()) {\n entry.controller.abort();\n }\n inFlightRef.current.clear();\n fileCacheRef.current.clear();\n setAttachmentsState([]);\n }, []);\n\n useEffect(() => {\n onChangeRef.current?.(attachments);\n }, [attachments]);\n\n useEffect(() => {\n const inFlight = inFlightRef.current;\n return () => {\n for (const entry of inFlight.values()) {\n entry.controller.abort();\n }\n };\n }, []);\n\n const uploadedAttachments = useMemo(\n () => attachments.filter((a) => a.status === 'uploaded' || !a.status),\n [attachments],\n );\n\n const isUploading = useMemo(\n () => attachments.some((a) => a.status === 'uploading'),\n [attachments],\n );\n\n return {\n attachments,\n uploadedAttachments,\n isUploading,\n addFiles,\n removeAttachment,\n retryAttachment,\n setAttachments,\n reset,\n };\n}\n","/**\n * CommentComposer — TipTap-backed rich text editor with inline reference\n * picker and attachment uploader. Default composer for `<Comments>`.\n *\n * Mention/reference handling is delegated to the shared\n * `features/mentions` module: `useMentions` drives picker state +\n * caret-trigger detection, `<MentionPicker>` renders the popover, and\n * `<MentionChip>` renders draft-list chips. The same primitives power\n * inline references in `features/event-log`.\n */\nimport { AtSign, Loader2, Paperclip, Send, X } from 'lucide-react';\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { ReactNode } from 'react';\n\nimport { Button } from '@/components/base/buttons';\nimport { Popover, PopoverTrigger } from '@/components/base/popover';\nimport { Text } from '@/components/typography';\nimport {\n RichTextEditor,\n type RichTextEditorHandle,\n type RichTextEditorToolbarItem,\n} from '@/components/features/rich-text-editor/rich-text-editor';\nimport {\n MentionInlineSuggestions,\n MentionPicker,\n parseMentionsFromHtml,\n useMentions,\n} from '@/components/features/mentions';\nimport { useResolvedStrings } from '../comments-provider';\nimport { interpolateString } from '../comments.strings';\nimport type {\n CommentComposerProps,\n CommentFormValues,\n} from '../comments.types';\nimport { CommentAttachmentChip } from './comment-attachment-chip';\nimport { useAttachmentUpload } from '../hooks/use-attachment-upload';\n\nexport interface CommentComposerHandle {\n focus(): void;\n clear(): void;\n /** Imperatively set the draft body. */\n setBody(html: string): void;\n}\n\nfunction hasMeaningfulContent(html: string): boolean {\n if (!html || typeof html !== 'string') return false;\n const text = html.replace(/<[^>]*>/g, '').trim();\n return text.length > 0;\n}\n\nexport const CommentComposer = forwardRef<\n CommentComposerHandle,\n CommentComposerProps\n>(function CommentComposer(\n {\n context,\n canComment = true,\n isSubmitting = false,\n errors,\n resetKey = 0,\n onSubmit,\n onCancel,\n editingComment,\n strings: stringsProp,\n resources: resourcesProp,\n onResourceSearch: onResourceSearchProp,\n attachments: attachmentsProp,\n initialValues,\n autoFocus = false,\n inlineSubmit = true,\n placeholder,\n },\n ref,\n) {\n const strings = useResolvedStrings(stringsProp);\n\n const resources = resourcesProp;\n const onResourceSearch = onResourceSearchProp;\n const attachmentsConfig = attachmentsProp;\n\n const editorRef = useRef<RichTextEditorHandle>(null);\n const [body, setBody] = useState<string>(\n () => initialValues?.content ?? editingComment?.content ?? '',\n );\n const [contentError, setContentError] = useState<string | null>(null);\n\n /**\n * Mentions state — picker + caret-trigger detection. The hook reads\n * the editor handle via the ref we pass; on suggestion select it\n * inserts the chip and replaces the trigger range automatically.\n */\n const mentions = useMentions({\n resources,\n onResourceSearch,\n editorRef,\n initialMentions:\n initialValues?.references ?? editingComment?.references,\n });\n\n const attachmentUpload = useAttachmentUpload({\n ...attachmentsConfig,\n initialAttachments: initialValues?.attachments ?? undefined,\n });\n\n useImperativeHandle(\n ref,\n () => ({\n focus: () => editorRef.current?.focus(),\n clear: () => {\n editorRef.current?.clear();\n mentions.reset();\n attachmentUpload.reset();\n setContentError(null);\n },\n setBody: (html) => {\n editorRef.current?.setHTML(html);\n },\n }),\n [attachmentUpload, mentions],\n );\n\n // Reset on context change / resetKey bump\n useEffect(() => {\n editorRef.current?.setHTML(initialValues?.content ?? '');\n mentions.setMentions(initialValues?.references ?? []);\n attachmentUpload.setAttachments(initialValues?.attachments ?? []);\n setContentError(null);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [context.id, context.type, resetKey]);\n\n // Sync editing comment payload\n useEffect(() => {\n if (!editingComment) return;\n editorRef.current?.setHTML(editingComment.content ?? '');\n mentions.setMentions(editingComment.references ?? []);\n const list = (editingComment.attachments ?? editingComment.media ?? []).filter(\n (a): a is NonNullable<typeof a> => !!a,\n );\n attachmentUpload.setAttachments(list);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editingComment?.id]);\n\n // Surface server-side errors\n useEffect(() => {\n if (errors?.content) {\n setContentError(errors.content);\n }\n }, [errors]);\n\n const handleSubmit = (event?: React.FormEvent) => {\n event?.preventDefault();\n const html = editorRef.current?.getHTML() ?? body;\n if (!hasMeaningfulContent(html)) {\n setContentError(strings.invalidContent);\n return;\n }\n setContentError(null);\n\n const values: CommentFormValues = {\n content: html,\n commentableId: context.id,\n commentableType: context.type,\n contentType: 'html',\n references: mentions.mentions,\n attachments: attachmentUpload.uploadedAttachments,\n editingId: editingComment?.id,\n };\n\n onSubmit(values);\n };\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const handleAttachmentClick = () => fileInputRef.current?.click();\n const handleFiles = (files: FileList | null) => {\n if (!files) return;\n attachmentUpload.addFiles(files);\n };\n\n const hasAttachments = attachmentUpload.attachments.length > 0;\n const isEditing = !!editingComment;\n\n const submitLabel = isSubmitting\n ? strings.composerSubmitting\n : isEditing\n ? strings.composerSave\n : strings.composerSubmit;\n\n const eyebrow: ReactNode = isEditing ? (\n <ComposerEyebrow\n label={strings.composerEditingEyebrow}\n closeLabel={strings.composerCancel}\n onClose={onCancel}\n />\n ) : null;\n\n const extraToolbarItems = useMemo<ReadonlyArray<RichTextEditorToolbarItem>>(() => {\n const items: RichTextEditorToolbarItem[] = [];\n if (resources && Object.keys(resources).length > 0) {\n items.push({\n id: 'reference',\n icon: AtSign,\n label: strings.composerReferenceLabel,\n onClick: () => mentions.setPickerOpen(true),\n });\n }\n if (attachmentsConfig?.onUpload && !attachmentsConfig.disabled) {\n items.push({\n id: 'attachment',\n icon: Paperclip,\n label: strings.composerAttachmentLabel,\n onClick: handleAttachmentClick,\n });\n }\n return items;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n resources,\n attachmentsConfig?.onUpload,\n attachmentsConfig?.disabled,\n strings.composerReferenceLabel,\n strings.composerAttachmentLabel,\n ]);\n\n if (!canComment) return null;\n\n const submitButton = (\n <Button\n type=\"button\"\n onClick={() => handleSubmit()}\n disabled={isSubmitting || attachmentUpload.isUploading}\n icon={isSubmitting ? Loader2 : Send}\n >\n {submitLabel}\n </Button>\n );\n\n const cancelButton = (isEditing || onCancel) ? (\n <Button\n type=\"button\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n onClick={onCancel}\n disabled={isSubmitting}\n >\n {strings.composerCancel}\n </Button>\n ) : null;\n\n // Mentions live as inline `<span class=\"rsc-mention\" contenteditable=\"false\">`\n // chips inside the editor body — they're visible, dismissible (single\n // backspace deletes the whole span), and the HTML→mentions sync keeps\n // `mentions.mentions` aligned automatically. Rendering them again as a\n // chip-list below the editor was redundant and confusing.\n\n const attachmentChips = hasAttachments ? (\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {attachmentUpload.attachments.map((attachment) => (\n <CommentAttachmentChip\n key={attachment.id}\n attachment={attachment}\n editable\n onRemove={attachmentUpload.removeAttachment}\n onRetry={attachmentUpload.retryAttachment}\n strings={stringsProp}\n />\n ))}\n </div>\n ) : null;\n\n const footerSlot = hasAttachments ? attachmentChips : null;\n\n const trailingSubmit = inlineSubmit !== false ? submitButton : null;\n const showFooterRow = inlineSubmit === false || isEditing;\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-2\">\n {eyebrow}\n\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n hidden\n accept={attachmentsConfig?.accept}\n onChange={(e) => {\n handleFiles(e.target.files);\n e.target.value = '';\n }}\n />\n\n {/* Manual button-click flow: regular popover anchored to the\n hidden trigger. The inline-trigger flow uses the panel\n rendered below — no focus stealing while the user types. */}\n {!mentions.triggerActive && (\n <Popover open={mentions.pickerOpen} onOpenChange={mentions.setPickerOpen}>\n <PopoverTrigger\n render={\n <button\n type=\"button\"\n className=\"sr-only\"\n tabIndex={-1}\n />\n }\n >\n {strings.composerReferenceLabel}\n </PopoverTrigger>\n <MentionPicker\n open={mentions.pickerOpen}\n activeKind={mentions.activeKind}\n setActiveKind={mentions.setActiveKind}\n kinds={mentions.kinds}\n resources={resources}\n query={mentions.query}\n setQuery={mentions.setQuery}\n suggestions={mentions.suggestions}\n isLoading={mentions.isLoading}\n onSelect={mentions.pickSuggestion}\n strings={{\n title: strings.composerReferenceMenuTitle,\n searchPlaceholder: strings.composerReferenceSearchPlaceholder,\n empty: strings.composerReferenceEmpty,\n loading: strings.composerReferenceLoading,\n }}\n />\n </Popover>\n )}\n\n <div className=\"relative\">\n <RichTextEditor\n ref={editorRef}\n value={body}\n onChange={(html) => {\n setBody(html);\n // Sync the draft's mentions list with what's\n // actually present in the HTML — when the user\n // backspaces a chip span out of the body, the\n // chip-list below shrinks too. We merge with\n // the previously-known list so consumer-supplied\n // `href` / `data` payloads survive parsing.\n const parsed = parseMentionsFromHtml<string>(html);\n const previous = mentions.mentions;\n const previousIds = previous.map((m) => m.id).join('|');\n const currentIds = parsed.map((m) => m.id).join('|');\n if (previousIds !== currentIds) {\n const byId = new Map(previous.map((m) => [m.id, m]));\n const merged = parsed.map(\n (p) => byId.get(p.id) ?? p,\n );\n mentions.setMentions(merged);\n }\n }}\n placeholder={placeholder ?? strings.composerPlaceholder}\n strings={{\n editorLabel: placeholder ?? strings.composerPlaceholder,\n }}\n minHeight=\"3rem\"\n autoFocus={autoFocus || isEditing}\n extraToolbarItems={extraToolbarItems}\n toolbarTrailing={trailingSubmit}\n footerSlot={footerSlot}\n onCaretChange={mentions.handleCaretChange}\n />\n\n <MentionInlineSuggestions\n open={mentions.triggerActive && mentions.pickerOpen}\n activeKind={mentions.activeKind}\n setActiveKind={mentions.setActiveKind}\n onManualKindChange={() => mentions.setManualKindOverride(true)}\n kinds={mentions.kinds}\n resources={resources}\n query={mentions.query}\n suggestions={mentions.suggestions}\n suggestionsByKind={mentions.suggestionsByKind}\n isLoading={mentions.isLoading}\n onSelect={mentions.pickSuggestion}\n strings={{\n title: strings.composerReferenceMenuTitle,\n empty: strings.composerReferenceEmpty,\n loading: strings.composerReferenceLoading,\n }}\n />\n </div>\n\n {contentError && (\n <Text size=\"xs\" type=\"error\">\n {contentError}\n </Text>\n )}\n\n {showFooterRow && (\n <div className=\"flex items-center justify-end gap-2\">\n {cancelButton}\n {submitButton}\n </div>\n )}\n </form>\n );\n});\n\n/* ------------------------------------------------------------------ */\n/* ComposerEyebrow */\n/* ------------------------------------------------------------------ */\n\nfunction ComposerEyebrow({\n label,\n closeLabel,\n onClose,\n}: {\n label: string;\n closeLabel: string;\n onClose?: () => void;\n}) {\n return (\n <div className=\"bg-muted/40 ring-border/60 flex items-center justify-between rounded px-2.5 py-1.5 ring-1 ring-inset\">\n <Text size=\"xxs\" type=\"secondary\" weight=\"medium\" className=\"uppercase tracking-wide\">\n {label}\n </Text>\n {onClose ? (\n <Button\n type=\"button\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n size=\"icon-small\"\n onClick={onClose}\n className=\"size-4 rounded p-0 text-muted-foreground hover:text-foreground\"\n aria-label={closeLabel}\n >\n <X className=\"size-3\" />\n </Button>\n ) : null}\n </div>\n );\n}\n\n/** Helper export for templated reply eyebrow. */\nexport function makeReplyEyebrow(template: string, name?: string): string {\n return interpolateString(template, { name: name ?? '' });\n}\n","/**\n * CommentEmpty — default empty state for the timeline. Replaceable via\n * the `emptySlot` prop on `<Comments>` / `<CommentTimeline>`.\n */\nimport { MessageCircle } from 'lucide-react';\nimport type { FC, ReactNode } from 'react';\n\nimport { Text } from '@/components/typography';\nimport type { StringsProp } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\n\nimport { useResolvedStrings } from '../comments-provider';\nimport type { CommentsStrings } from '../comments.strings';\n\nexport interface CommentEmptyProps {\n strings?: StringsProp<CommentsStrings>;\n icon?: ReactNode;\n className?: string;\n}\n\nexport const CommentEmpty: FC<CommentEmptyProps> = ({\n strings: stringsProp,\n icon,\n className,\n}) => {\n const strings = useResolvedStrings(stringsProp);\n\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center py-8 text-center',\n className,\n )}\n >\n <div className=\"bg-muted/50 mb-3 flex h-12 w-12 items-center justify-center rounded-full\">\n {icon ?? (\n <MessageCircle className=\"text-muted-foreground/60 h-5 w-5\" />\n )}\n </div>\n <Text weight=\"medium\">\n {strings.empty}\n </Text>\n {strings.emptyHint ? (\n <Text size=\"xs\" type=\"secondary\" className=\"mt-1 max-w-[28ch]\">\n {strings.emptyHint}\n </Text>\n ) : null}\n </div>\n );\n};\n","import type { ReactNode } from 'react';\nimport { Fragment, createElement } from 'react';\n\nimport { Heading, Text } from '@/components/typography';\nimport type { HeadingProps } from '@/components/typography';\nimport { MentionContent } from '@/components/features/mentions';\n\nimport type {\n CommentData,\n CommentUser,\n CommentsConfig,\n CommentsSlots,\n} from '../comments.types';\n\ninterface CommentContentProps<TResource extends string = string> {\n comment: CommentData<CommentUser, unknown, TResource>;\n /** Resource registry — passed through to `<MentionContent>`. */\n resources?: CommentsConfig<CommentUser, unknown, TResource>['resources'];\n renderReference?: CommentsSlots<\n CommentUser,\n unknown,\n TResource\n >['renderReference'];\n /** Optional sanitizer applied to HTML before rendering. */\n sanitizer?: (html: string) => string;\n}\n\n/**\n * `renderCommentContent` — backwards-compatible export that renders only\n * the comment body text (no references resolution). Use the\n * `<CommentContent>` component below for the full feature surface.\n */\nexport function renderCommentContent<TResource extends string = string>(\n comment: CommentData<CommentUser, unknown, TResource>,\n): ReactNode {\n return <CommentContent comment={comment} />;\n}\n\nexport function CommentContent<TResource extends string = string>(\n props: CommentContentProps<TResource>,\n): ReactNode {\n const { comment, resources, renderReference, sanitizer } = props;\n const contentType =\n comment.contentType ??\n (comment as Record<string, unknown>).content_type ??\n 'text';\n\n if (contentType === 'rich') {\n return renderRichContent(comment.content);\n }\n\n if (contentType === 'html') {\n return (\n <MentionContent<TResource>\n html={comment.content ?? ''}\n mentions={comment.references}\n resources={resources}\n renderMention={renderReference}\n sanitizer={sanitizer}\n />\n );\n }\n\n const plainContent = decodeQuotedString(comment.content ?? '');\n\n return (\n <Text className=\"whitespace-pre-line\">\n {plainContent}\n </Text>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Rich-block renderer (legacy \"rich\" content type) */\n/* ------------------------------------------------------------------ */\n\nfunction renderRichContent(rawContent: string | null | undefined): ReactNode {\n if (!rawContent) return null;\n\n try {\n const parsed = JSON.parse(rawContent) as {\n blocks?: Array<{ id?: string; type: string; data?: Record<string, unknown> }>;\n };\n\n if (!parsed || !Array.isArray(parsed.blocks) || parsed.blocks.length === 0) {\n return null;\n }\n\n return (\n <div className=\"prose prose-sm prose-p:my-0.5 prose-headings:my-1 prose-a:text-primary prose-a:no-underline hover:prose-a:underline max-w-none space-y-1\">\n {parsed.blocks.map((block, index) => (\n <Fragment key={block.id ?? `${block.type}-${index}`}>\n {renderRichBlock(block)}\n </Fragment>\n ))}\n </div>\n );\n } catch {\n const decoded = decodeQuotedString(rawContent);\n return (\n <Text className=\"whitespace-pre-line\">\n {decoded}\n </Text>\n );\n }\n}\n\nfunction renderRichBlock(block: { type: string; data?: Record<string, unknown> }): ReactNode {\n const data = block.data ?? {};\n\n switch (block.type) {\n case 'paragraph': {\n const raw = String(data.text ?? '').trim();\n if (!raw) return null;\n return <Text asHTML content={raw} />;\n }\n case 'header': {\n const text = stripHtml(String(data.text ?? ''));\n const level = Number(data.level ?? 3);\n if (!text) return null;\n const safeLevel = Math.min(Math.max(level, 1), 6);\n return createElement(\n Heading,\n { tag: `h${safeLevel}` as HeadingProps['tag'] },\n text,\n );\n }\n case 'list': {\n const items = Array.isArray(data.items) ? data.items : [];\n const sanitizedItems = items\n .map((item) => stripHtml(String(item ?? '')))\n .filter((item) => item.length > 0);\n\n if (sanitizedItems.length === 0) return null;\n\n if (data.style === 'ordered') {\n return (\n <ol className=\"ml-6 list-decimal space-y-1 text-sm\">\n {sanitizedItems.map((item, index) => (\n <li key={`${item}-${index}`}>{item}</li>\n ))}\n </ol>\n );\n }\n\n return (\n <ul className=\"ml-6 list-disc space-y-1 text-sm\">\n {sanitizedItems.map((item) => (\n <li key={item}>{item}</li>\n ))}\n </ul>\n );\n }\n case 'quote': {\n const text = String(data.text ?? '').trim();\n if (!text) return null;\n const caption = stripHtml(String(data.caption ?? ''));\n return (\n <blockquote className=\"border-muted text-muted-foreground border-l-2 pl-3 text-sm italic\">\n <Text asHTML content={text} />\n {caption.length > 0 && (\n <cite className=\"text-muted-foreground/80 mt-1 block text-xs not-italic\">\n — {caption}\n </cite>\n )}\n </blockquote>\n );\n }\n case 'delimiter':\n return (\n <div\n className=\"border-muted my-4 border-b border-dashed\"\n aria-hidden=\"true\"\n />\n );\n default: {\n const text = stripHtml(String(data.text ?? ''));\n if (!text) return null;\n return (\n <Text className=\"whitespace-pre-line\">\n {text}\n </Text>\n );\n }\n }\n}\n\nfunction stripHtml(value: string): string {\n return value.replace(/<[^>]*>/g, '').trim();\n}\n\nfunction decodeQuotedString(value: string | null | undefined): string {\n if (typeof value !== 'string') return '';\n const trimmed = value.trim();\n if (trimmed === '') return '';\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) return trimmed;\n try {\n const parsed = JSON.parse(trimmed);\n if (typeof parsed === 'string') return parsed;\n } catch {\n // ignore\n }\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n}\n","import { formatDistanceToNow } from 'date-fns';\nimport {\n CornerDownRight,\n Pencil,\n Pin,\n Smile,\n Trash2,\n} from 'lucide-react';\nimport type { FC } from 'react';\nimport { memo, useMemo } from 'react';\n\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from '@/components/base/display/avatar';\nimport { Badge } from '@/components/base/badge';\nimport { Button } from '@/components/base/buttons';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@/components/base/display/tooltip';\nimport { Text } from '@/components/typography';\nimport { cn } from '@/lib/utils';\n\nimport {\n useResolvedAccessors,\n useResolvedStrings,\n} from '../comments-provider';\nimport type {\n CommentAttachment,\n CommentItemProps,\n} from '../comments.types';\nimport { CommentAttachmentChip } from './comment-attachment-chip';\nimport { CommentContent } from './comment-content';\n\nconst FALLBACK_INITIAL = '?';\n\nconst defaultGetMediaUrl = (m: CommentAttachment | null | undefined) => m?.url;\nconst defaultGetMediaName = (m: CommentAttachment | null | undefined) => m?.name;\nconst defaultGetStatusLabel = (s: string) =>\n s.charAt(0).toUpperCase() + s.slice(1).replace(/_/g, ' ');\nconst defaultFormatRelativeTime = (iso: string) => {\n try {\n return formatDistanceToNow(new Date(iso), { addSuffix: true });\n } catch {\n return '—';\n }\n};\n\nexport const CommentItem = memo(function CommentItem<TResource extends string = string>({\n comment,\n canModerate,\n onDelete,\n onPinToggle,\n onReact,\n onReply,\n strings: stringsProp,\n getMediaUrl,\n getMediaName,\n getStatusLabel,\n formatRelativeTime,\n resources,\n renderAttachment,\n renderReference,\n}: CommentItemProps<import('../comments.types').CommentUser, unknown, TResource>) {\n const strings = useResolvedStrings(stringsProp);\n const accessors = useResolvedAccessors({\n getMediaUrl,\n getMediaName,\n getStatusLabel,\n formatRelativeTime,\n });\n\n const resolvedGetMediaUrl = accessors.getMediaUrl ?? defaultGetMediaUrl;\n const resolvedGetMediaName = accessors.getMediaName ?? defaultGetMediaName;\n const resolvedGetStatusLabel =\n accessors.getStatusLabel ?? defaultGetStatusLabel;\n const resolvedFormatRelativeTime =\n accessors.formatRelativeTime ?? defaultFormatRelativeTime;\n\n const authorName = comment.user?.name ?? strings.fallbackAuthor;\n const avatarUrl = comment.user?.avatar ?? undefined;\n\n const relativeTime = useMemo(() => {\n if (!comment.createdAt) return '—';\n return resolvedFormatRelativeTime(comment.createdAt);\n }, [comment.createdAt, resolvedFormatRelativeTime]);\n\n const fallbackInitial = useMemo(() => {\n if (!authorName) return FALLBACK_INITIAL;\n const trimmed = authorName.trim();\n return trimmed === ''\n ? FALLBACK_INITIAL\n : trimmed.charAt(0).toUpperCase();\n }, [authorName]);\n\n const tagList = useMemo(() => {\n if (Array.isArray(comment.tagsArray)) {\n return comment.tagsArray.filter(\n (tag): tag is string => typeof tag === 'string',\n );\n }\n if (comment.tagsArray && typeof comment.tagsArray === 'object') {\n return Object.values(comment.tagsArray).filter(\n (value): value is string => typeof value === 'string',\n );\n }\n return [];\n }, [comment.tagsArray]);\n\n const attachments = useMemo(() => {\n const list = comment.attachments ?? comment.media ?? [];\n return list.filter(\n (a): a is CommentAttachment => !!a && typeof a === 'object',\n );\n }, [comment.attachments, comment.media]);\n\n const reactions = comment.reactions ?? [];\n\n const isPinned = comment.isPinned === true;\n const isEdited = comment.isEdited === true;\n const showStatus = comment.status && comment.status !== 'active';\n const statusLabel =\n showStatus && comment.status ? resolvedGetStatusLabel(comment.status) : null;\n const canDeleteComment =\n comment.canDelete === true || canModerate === true;\n const canEditComment = comment.canEdit === true || canModerate === true;\n\n const hasAttachments = attachments.length > 0;\n\n return (\n <article\n className={cn(\n 'comment-item--component group relative overflow-hidden rounded-lg border transition-colors',\n 'border-border/60 bg-card hover:bg-muted/30 px-3 py-2.5',\n )}\n data-comment-id={comment.id}\n >\n <div className=\"flex min-w-0 items-start gap-3\">\n <Avatar className=\"mt-0.5 size-avatar shrink-0\">\n {!!avatarUrl && (\n <AvatarImage src={avatarUrl} alt={authorName} />\n )}\n <AvatarFallback className=\"bg-muted text-muted-foreground text-xs font-medium\">\n {fallbackInitial}\n </AvatarFallback>\n </Avatar>\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-baseline gap-2\">\n <Text\n tag=\"span\"\n weight=\"semibold\"\n className=\"truncate\"\n >\n {authorName}\n </Text>\n\n {!!isPinned && (\n <TooltipProvider delayDuration={0}>\n <Tooltip>\n <TooltipTrigger render={<span className=\"inline-flex shrink-0 self-center\" />}>\n <Pin className=\"text-warning size-3\" aria-hidden />\n </TooltipTrigger>\n <TooltipContent\n side=\"top\"\n className=\"text-xs\"\n >\n {strings.pinned}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n\n <Text\n tag=\"span\"\n size=\"xs\"\n type=\"secondary\"\n className=\"shrink-0 tabular-nums\"\n >\n {relativeTime}\n </Text>\n\n {!!isEdited && (\n <Text\n tag=\"span\"\n size=\"xs\"\n type=\"secondary\"\n className=\"shrink-0\"\n >\n {strings.edited}\n </Text>\n )}\n\n {!!showStatus && !!statusLabel && (\n <Badge variant=\"secondary\" className=\"self-center uppercase tracking-wide\">\n {statusLabel}\n </Badge>\n )}\n </div>\n\n <div className=\"mt-1 text-sm leading-relaxed\">\n <CommentContent\n comment={comment}\n resources={resources}\n renderReference={renderReference}\n />\n </div>\n\n {tagList.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n {tagList.map((tag) => (\n <Badge key={tag} variant=\"secondary\" className=\"uppercase tracking-wide\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n\n {hasAttachments && (\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n {attachments.map((attachment) => {\n if (renderAttachment) {\n return (\n <div key={attachment.id ?? attachment.name}>\n {renderAttachment(attachment)}\n </div>\n );\n }\n return (\n <CommentAttachmentChip\n key={attachment.id ?? attachment.name}\n attachment={attachment}\n accessors={{\n getMediaUrl: resolvedGetMediaUrl,\n getMediaName: resolvedGetMediaName,\n }}\n strings={stringsProp}\n />\n );\n })}\n </div>\n )}\n\n {reactions.length > 0 && (\n <div className=\"mt-2 flex flex-wrap items-center gap-1\">\n {reactions.map((reaction) => (\n <Button\n key={reaction.emoji}\n type=\"button\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n size=\"small\"\n onClick={() =>\n onReact && comment.id\n ? onReact(comment.id, reaction.emoji)\n : undefined\n }\n title={reaction.users?.join(', ')}\n className=\"h-auto rounded-full p-0\"\n >\n <Badge\n variant={reaction.mine ? 'primary' : 'secondary'}\n className=\"cursor-pointer transition-colors hover:opacity-90\"\n >\n <span aria-hidden className=\"leading-none\">\n {reaction.emoji}\n </span>\n <span className=\"tabular-nums\">{reaction.count}</span>\n </Badge>\n </Button>\n ))}\n </div>\n )}\n </div>\n\n {/* Trailing action cluster — single low-contrast group, hover/focus revealed. */}\n <div\n className={cn(\n 'absolute right-2 top-2 opacity-0 transition-opacity',\n 'group-hover:opacity-100 focus-within:opacity-100',\n 'inline-flex items-center gap-0.5 rounded-md bg-card/95 shadow-sm ring-1 ring-border/70',\n )}\n >\n {!!onReply && (\n <Button\n type=\"button\"\n size=\"icon-small\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n onClick={() =>\n comment.id && onReply(comment.id)\n }\n title={strings.replyLabel}\n aria-label={strings.replyLabel}\n >\n <CornerDownRight className=\"size-3.5\" />\n </Button>\n )}\n {!!onReact && (\n <Button\n type=\"button\"\n size=\"icon-small\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n onClick={() =>\n comment.id && onReact(comment.id, '👍')\n }\n title={strings.addReactionLabel}\n aria-label={strings.addReactionLabel}\n >\n <Smile className=\"size-3.5\" />\n </Button>\n )}\n {!!onPinToggle && canModerate && (\n <Button\n type=\"button\"\n size=\"icon-small\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n onClick={() => onPinToggle(comment)}\n title={isPinned ? strings.unpinLabel : strings.pinLabel}\n aria-label={isPinned ? strings.unpinLabel : strings.pinLabel}\n >\n <Pin\n className={cn(\n 'size-3.5',\n isPinned && 'text-warning',\n )}\n />\n </Button>\n )}\n {!!canEditComment && !!comment.id && (\n <Button\n type=\"button\"\n size=\"icon-small\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n title={strings.editLabel}\n aria-label={strings.editLabel}\n >\n <Pencil className=\"size-3.5\" />\n </Button>\n )}\n {!!canDeleteComment &&\n !!onDelete &&\n !!comment.id && (\n <Button\n type=\"button\"\n size=\"icon-small\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n className=\"hover:bg-destructive/10 hover:text-destructive\"\n onClick={() =>\n onDelete(comment.id as string)\n }\n title={strings.deleteLabel}\n aria-label={strings.deleteLabel}\n >\n <Trash2 className=\"size-3.5\" />\n </Button>\n )}\n </div>\n </div>\n </article>\n );\n}) as <TResource extends string = string>(\n props: CommentItemProps<import('../comments.types').CommentUser, unknown, TResource>,\n) => ReturnType<FC>;\n","import type { FC } from 'react';\n\nimport type { CommentTimelineProps, CommentUser } from '../comments.types';\nimport { CommentEmpty } from './comment-empty';\nimport { CommentItem } from './comment-item';\n\nexport const CommentTimeline = function CommentTimeline<\n TResource extends string = string,\n>({\n comments,\n canModerate,\n onDelete,\n onPinToggle,\n onReact,\n onReply,\n strings: stringsProp,\n getMediaUrl,\n getMediaName,\n getStatusLabel,\n formatRelativeTime,\n resources,\n renderItem,\n renderAttachment,\n renderReference,\n emptySlot,\n}: CommentTimelineProps<CommentUser, unknown, TResource>) {\n if (!comments.length) {\n return (\n <>\n {emptySlot ?? <CommentEmpty strings={stringsProp} />}\n </>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n {comments.map((comment, index) => {\n const defaultItem = (\n <CommentItem\n comment={comment}\n canModerate={canModerate}\n onDelete={onDelete}\n onPinToggle={onPinToggle}\n onReact={onReact}\n onReply={onReply}\n strings={stringsProp}\n getMediaUrl={getMediaUrl}\n getMediaName={getMediaName}\n getStatusLabel={getStatusLabel}\n formatRelativeTime={formatRelativeTime}\n resources={resources}\n renderAttachment={renderAttachment}\n renderReference={renderReference}\n />\n );\n\n if (renderItem) {\n return (\n <div key={comment.id ?? `comment-${index}`}>\n {renderItem({\n comment,\n canModerate: canModerate ?? false,\n onDelete,\n defaultItem,\n })}\n </div>\n );\n }\n\n return (\n <div key={comment.id ?? `comment-${index}`}>\n {defaultItem}\n </div>\n );\n })}\n </div>\n );\n} as <TResource extends string = string>(\n props: CommentTimelineProps<CommentUser, unknown, TResource>,\n) => ReturnType<FC>;\n","/**\n * Comments — top-level entry for the Comments feature.\n *\n * Composes the composer + timeline + empty state behind a single API.\n * Generic in `<TUser, TMeta, TResource>` so consumers can type their\n * domain (user shape, custom meta payload, resource-kind union).\n *\n * Per-mount wiring (callbacks, resources, accessors) flows as direct\n * props. Library-wide display defaults (composer position, etc.) come\n * from `<UIProvider>` — see `@/lib/ui-provider`. Slots, render-props,\n * and the headless `useComments()` hook cover the composability\n * spectrum.\n *\n * `CommentsCard` is exported as a back-compat alias for the previous\n * name; the API shape is identical.\n */\nimport { useCallback, useState } from 'react';\n\nimport { SmartCard } from '@/components/base/cards';\nimport { useCommentsConfig as useCommentsUIDefaults } from '@/lib/ui-provider';\n\nimport { useResolvedStrings } from './comments-provider';\nimport type {\n CommentData,\n CommentFormValues,\n CommentSubmitHelpers,\n CommentUser,\n CommentsProps,\n} from './comments.types';\nimport { CommentComposer } from './partials/comment-composer';\nimport { CommentEmpty } from './partials/comment-empty';\nimport { CommentTimeline } from './partials/comment-timeline';\n\nimport { cn } from '@/lib/utils';\nexport function Comments<\n TUser extends CommentUser = CommentUser,\n TMeta = unknown,\n TResource extends string = string,\n>(props: CommentsProps<TUser, TMeta, TResource>) {\n const ui = useCommentsUIDefaults();\n\n const composerPosition =\n props.composerPosition ?? ui.composerPosition ?? 'top';\n\n const canComment = props.canComment ?? false;\n const canModerate = props.canModerate ?? false;\n\n const onSubmit = props.onSubmit;\n const onDelete = props.onDelete;\n const onPinToggle = props.onPinToggle;\n const onReact = props.onReact;\n const onReply = props.onReply;\n\n const resources = props.resources;\n const attachments = props.attachments;\n\n const strings = useResolvedStrings(props.strings);\n const cardTitle = props.title === undefined ? strings.title : props.title;\n\n const [formErrors, setFormErrors] = useState<Record<string, string>>({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [resetKey, setResetKey] = useState(0);\n\n const submitHelpers: CommentSubmitHelpers = {\n setErrors: (errors) => setFormErrors(errors),\n reset: () => {\n setResetKey((k) => k + 1);\n setFormErrors({});\n setIsSubmitting(false);\n },\n setSubmitting: setIsSubmitting,\n };\n\n const handleSubmit = useCallback(\n (values: CommentFormValues<TResource>) => {\n if (!onSubmit) return;\n setIsSubmitting(true);\n setFormErrors({});\n onSubmit(values, submitHelpers);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onSubmit],\n );\n\n const composer = props.composerSlot ?? (\n canComment ? (\n <CommentComposer\n context={props.context}\n canComment={canComment}\n isSubmitting={isSubmitting}\n errors={formErrors}\n resetKey={resetKey}\n /*\n * Generic-erasure boundary: `<Comments<TResource>>` is\n * generic but `<CommentComposer>` types its props\n * against the default-string kind. Shapes are\n * structurally identical — only the kind union differs.\n */\n onSubmit={\n handleSubmit as (values: CommentFormValues) => void\n }\n strings={props.strings}\n resources={resources as never}\n attachments={attachments}\n />\n ) : null\n );\n\n /*\n * Same generic-erasure boundary as the composer block above:\n * `<Comments<TUser, TMeta, TResource>>` is generic, but\n * `<CommentTimeline>` types its `comments` and `onPinToggle` props\n * against `CommentData<CommentUser, unknown, TResource>` (default\n * `TUser`/`TMeta`). The shapes are structurally identical — `TUser`\n * narrows the author union and `TMeta` narrows the metadata payload,\n * neither of which the timeline reads — so the widening cast is\n * safe. Keep the cast localised here; do not propagate into the\n * timeline body.\n */\n const timeline = (\n <CommentTimeline\n comments={props.comments as ReadonlyArray<CommentData<CommentUser, unknown, TResource>>}\n canModerate={canModerate}\n onDelete={onDelete}\n onPinToggle={onPinToggle as (c: CommentData<CommentUser, unknown, TResource>) => void}\n onReact={onReact}\n onReply={onReply}\n strings={props.strings}\n getMediaUrl={props.getMediaUrl}\n getMediaName={props.getMediaName}\n getStatusLabel={props.getStatusLabel}\n formatRelativeTime={props.formatRelativeTime}\n resources={resources}\n // `renderItem` is generic over the consumer's `<TUser, TMeta,\n // TResource>` triple; `<CommentTimeline>` types it against\n // the default `CommentUser, unknown, string` triple. The\n // structural signature is the same — boundary cast only.\n renderItem={props.renderItem as never}\n renderAttachment={props.renderAttachment}\n renderReference={props.renderReference}\n emptySlot={\n props.emptySlot ?? <CommentEmpty strings={props.strings} />\n }\n />\n );\n\n const composerBlock = composer ? <div>{composer}</div> : null;\n\n const inner = (\n <div className=\"flex flex-col gap-4\">\n {props.headerSlot}\n {composerPosition === 'top' && composerBlock}\n {timeline}\n {composerPosition === 'bottom' && composerBlock}\n {props.footerSlot}\n </div>\n );\n\n if (props.bare) {\n return inner;\n }\n\n return (\n <SmartCard\n title={cardTitle === false ? undefined : cardTitle}\n description={strings.subtitle || undefined}\n padding=\"default\"\n className={cn('comments--component', props.className)}\n >\n {inner}\n </SmartCard>\n );\n}\n\n/** Back-compat alias — `CommentsCard` was the previous primary export. */\nexport const CommentsCard = Comments;\n","/**\n * useComments — headless state machine for the Comments feature.\n *\n * Tracks composer mode (idle | replying | editing), submit/delete\n * helpers, error state, and resetKey bumping. The default `<Comments>`\n * component composes this hook; consumers building a fully custom UI\n * can use it directly.\n */\nimport { useCallback, useState } from 'react';\n\nimport type {\n CommentData,\n CommentFormValues,\n CommentSubmitHelpers,\n CommentUser,\n CommentsConfig,\n} from '../comments.types';\n\nexport type ComposerMode<TResource extends string = string> =\n | { kind: 'idle' }\n | { kind: 'editing'; comment: CommentData<CommentUser, unknown, TResource> }\n | { kind: 'replying'; commentId: string; authorName?: string };\n\nexport interface UseCommentsOptions<\n TUser extends CommentUser = CommentUser,\n TMeta = unknown,\n TResource extends string = string,\n> {\n onSubmit?: CommentsConfig<TUser, TMeta, TResource>['onSubmit'];\n onUpdate?: CommentsConfig<TUser, TMeta, TResource>['onUpdate'];\n onDelete?: CommentsConfig<TUser, TMeta, TResource>['onDelete'];\n}\n\nexport interface UseCommentsReturn<\n TUser extends CommentUser = CommentUser,\n TMeta = unknown,\n TResource extends string = string,\n> {\n composerMode: ComposerMode<TResource>;\n isSubmitting: boolean;\n formErrors: Record<string, string>;\n resetKey: number;\n\n startReply: (comment: CommentData<TUser, TMeta, TResource>) => void;\n startEdit: (comment: CommentData<TUser, TMeta, TResource>) => void;\n cancelComposerMode: () => void;\n\n submit: (values: CommentFormValues<TResource>) => void;\n deleteComment: (id: string) => void;\n\n /** Imperative reset — bumps `resetKey` so the composer clears itself. */\n resetComposer: () => void;\n /** Helpers exposed to onSubmit/onUpdate. */\n helpers: CommentSubmitHelpers;\n}\n\nexport function useComments<\n TUser extends CommentUser = CommentUser,\n TMeta = unknown,\n TResource extends string = string,\n>(\n options: UseCommentsOptions<TUser, TMeta, TResource> = {},\n): UseCommentsReturn<TUser, TMeta, TResource> {\n const { onSubmit, onUpdate, onDelete } = options;\n\n const [composerMode, setComposerMode] = useState<ComposerMode<TResource>>({\n kind: 'idle',\n });\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [formErrors, setFormErrors] = useState<Record<string, string>>({});\n const [resetKey, setResetKey] = useState(0);\n\n const helpers: CommentSubmitHelpers = {\n setErrors: (errors) => setFormErrors(errors),\n reset: () => {\n setResetKey((k) => k + 1);\n setComposerMode({ kind: 'idle' });\n setFormErrors({});\n },\n setSubmitting: setIsSubmitting,\n };\n\n const startReply = useCallback(\n (comment: CommentData<TUser, TMeta, TResource>) => {\n setComposerMode({\n kind: 'replying',\n commentId: comment.id ?? '',\n authorName: comment.user?.name,\n });\n },\n [],\n );\n\n const startEdit = useCallback(\n (comment: CommentData<TUser, TMeta, TResource>) => {\n setComposerMode({ kind: 'editing', comment });\n },\n [],\n );\n\n const cancelComposerMode = useCallback(() => {\n setComposerMode({ kind: 'idle' });\n setFormErrors({});\n }, []);\n\n const submit = useCallback(\n (values: CommentFormValues<TResource>) => {\n setIsSubmitting(true);\n setFormErrors({});\n\n if (composerMode.kind === 'editing' && composerMode.comment.id) {\n if (!onUpdate) {\n setIsSubmitting(false);\n return;\n }\n onUpdate(composerMode.comment.id, values, helpers);\n return;\n }\n\n if (!onSubmit) {\n setIsSubmitting(false);\n return;\n }\n\n const payload: CommentFormValues<TResource> =\n composerMode.kind === 'replying'\n ? { ...values, replyToId: composerMode.commentId }\n : values;\n\n onSubmit(payload, helpers);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [composerMode, onSubmit, onUpdate],\n );\n\n const deleteComment = useCallback(\n (id: string) => {\n if (!onDelete || !id) return;\n onDelete(id);\n },\n [onDelete],\n );\n\n const resetComposer = useCallback(() => {\n setResetKey((k) => k + 1);\n setComposerMode({ kind: 'idle' });\n setFormErrors({});\n }, []);\n\n return {\n composerMode,\n isSubmitting,\n formErrors,\n resetKey,\n startReply,\n startEdit,\n cancelComposerMode,\n submit,\n deleteComment,\n resetComposer,\n helpers,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require("../lib/utils.cjs");let t=require("react/jsx-runtime");var n={narrow:`max-w-[1040px] mx-auto`,default:``,large:`max-w-screen-2xl mx-auto`,wide:`max-w-screen-2xl mx-auto`,full:``},r={none:`p-0`,sm:`p-4 md:p-5`,default:`p-5 md:p-7`,lg:`p-6 md:p-8`};function i({children:i,as:a=`div`,width:o=`default`,padding:s=`default`,bare:c=!1,className:l,innerClassName:u,...d}){let f=n[o],p=r[s];return c?(0,t.jsx)(a,{className:e.cn(`w-full flex-1 relative overflow-hidden overflow-y-auto @container/main h-full`,f,l),...d,children:i}):(0,t.jsx)(a,{className:e.cn(`w-full flex-1 relative overflow-hidden @container/main h-full`,l),...d,children:(0,t.jsx)(`div`,{className:e.cn(`flex min-h-full flex-1 flex-col gap-6 rounded-xl`,f,p,u),children:i})})}var a={tight:`space-y-3`,default:`space-y-5`,loose:`space-y-8`};function o({children:n,as:r=`section`,density:i=`default`,className:o,...s}){return(0,t.jsx)(r,{className:e.cn(a[i],o),...s,children:n})}Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return o}});
2
+ //# sourceMappingURL=containers-CB7zaAvN.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containers-CB7zaAvN.cjs","names":[],"sources":["../../src/components/layout/containers/content-container.tsx","../../src/components/layout/containers/section.tsx"],"sourcesContent":["/**\n * Container — page-level content wrapper.\n *\n * Wraps the page body in a flexbox column with consistent padding and an\n * optional max-width clamp. Use as the outer wrapper inside a `<Page>`, or\n * standalone for content panes that need a centered, padded surface.\n *\n * `bare` skips the padded inner column for edge-to-edge children, while\n * `innerClassName` customizes the clamped column without affecting the outer\n * scroll/container-query wrapper.\n */\nimport { cn } from '@/lib/utils';\n\nimport type { ContainerProps } from './containers.types';\n\nconst WIDTH_CLASS: Record<NonNullable<ContainerProps['width']>, string> = {\n\tnarrow: 'max-w-[1040px] mx-auto',\n\tdefault: '',\n\tlarge: 'max-w-screen-2xl mx-auto',\n\twide: 'max-w-screen-2xl mx-auto',\n\tfull: '',\n};\n\nconst PADDING_CLASS: Record<NonNullable<ContainerProps['padding']>, string> = {\n\tnone: 'p-0',\n\tsm: 'p-4 md:p-5',\n\tdefault: 'p-5 md:p-7',\n\tlg: 'p-6 md:p-8',\n};\n\nexport function Container({\n\tchildren,\n\tas: Component = 'div',\n\twidth = 'default',\n\tpadding = 'default',\n\tbare = false,\n\tclassName,\n\tinnerClassName,\n\t...props\n}: ContainerProps) {\n\tconst widthClass = WIDTH_CLASS[width];\n\tconst paddingClass = PADDING_CLASS[padding];\n\n\tif (bare) {\n\t\treturn (\n\t\t\t<Component\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'w-full flex-1 relative overflow-hidden overflow-y-auto @container/main h-full',\n\t\t\t\t\twidthClass,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</Component>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Component\n\t\t\tclassName={cn(\n\t\t\t\t'w-full flex-1 relative overflow-hidden @container/main h-full',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'flex min-h-full flex-1 flex-col gap-6 rounded-xl',\n\t\t\t\t\twidthClass,\n\t\t\t\t\tpaddingClass,\n\t\t\t\t\tinnerClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</Component>\n\t);\n}\n","/**\n * Section — vertical-spaced wrapper for grouping content blocks inside a page.\n *\n * Use between cards or content groups when you want a consistent vertical\n * rhythm without nesting another `Container`. Three densities scale the\n * top/bottom spacing.\n */\nimport { cn } from '@/lib/utils';\n\nimport type { SectionProps } from './containers.types';\n\nconst DENSITY_CLASS: Record<NonNullable<SectionProps['density']>, string> = {\n\ttight: 'space-y-3',\n\tdefault: 'space-y-5',\n\tloose: 'space-y-8',\n};\n\nexport function Section({\n\tchildren,\n\tas: Component = 'section',\n\tdensity = 'default',\n\tclassName,\n\t...props\n}: SectionProps) {\n\treturn (\n\t\t<Component className={cn(DENSITY_CLASS[density], className)} {...props}>\n\t\t\t{children}\n\t\t</Component>\n\t);\n}\n"],"mappings":"uEAeA,IAAM,EAAoE,CACzE,OAAQ,yBACR,QAAS,GACT,MAAO,2BACP,KAAM,2BACN,KAAM,EACP,EAEM,EAAwE,CAC7E,KAAM,MACN,GAAI,aACJ,QAAS,aACT,GAAI,YACL,EAEA,SAAgB,EAAU,CACzB,WACA,GAAI,EAAY,MAChB,QAAQ,UACR,UAAU,UACV,OAAO,GACP,YACA,iBACA,GAAG,GACe,CAClB,IAAM,EAAa,EAAY,GACzB,EAAe,EAAc,GAiBnC,OAfI,GAEF,EAAA,EAAA,KAAC,EAAD,CACC,UAAW,EAAA,GACV,gFACA,EACA,CACD,EACA,GAAI,EAEH,UACS,CAAA,GAKZ,EAAA,EAAA,KAAC,EAAD,CACC,UAAW,EAAA,GACV,gEACA,CACD,EACA,GAAI,YAEJ,EAAA,EAAA,KAAC,MAAD,CACC,UAAW,EAAA,GACV,mDACA,EACA,EACA,CACD,EAEC,UACG,CAAA,CACK,CAAA,CAEb,CCnEA,IAAM,EAAsE,CAC3E,MAAO,YACP,QAAS,YACT,MAAO,WACR,EAEA,SAAgB,EAAQ,CACvB,WACA,GAAI,EAAY,UAChB,UAAU,UACV,YACA,GAAG,GACa,CAChB,OACC,EAAA,EAAA,KAAC,EAAD,CAAW,UAAW,EAAA,GAAG,EAAc,GAAU,CAAS,EAAG,GAAI,EAC/D,UACS,CAAA,CAEb"}