themelia-react-ui 1.0.0 → 1.0.2

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 (507) hide show
  1. package/CHANGELOG.md +190 -1
  2. package/README.md +92 -13
  3. package/dist/{accordion-BRWh3BM1.js → accordion-BRTcsp8J.js} +8 -8
  4. package/dist/accordion-BRTcsp8J.js.map +1 -0
  5. package/dist/{action-menu-Cx3SdfbN.js → action-menu-Drxw_vJk.js} +36 -36
  6. package/dist/action-menu-Drxw_vJk.js.map +1 -0
  7. package/dist/affordance-geometry.generated-CL84ZN9A.js +63 -0
  8. package/dist/affordance-geometry.generated-CL84ZN9A.js.map +1 -0
  9. package/dist/{ai-artifact-DkOArd3-.js → ai-artifact-DLVdK0Py.js} +151 -155
  10. package/dist/ai-artifact-DLVdK0Py.js.map +1 -0
  11. package/dist/{app-shell-BH_bGcE2.js → app-shell-C_fKpljx.js} +11 -10
  12. package/dist/app-shell-C_fKpljx.js.map +1 -0
  13. package/dist/{attachment-DsLgNHXt.js → attachment-DbjUWsP0.js} +12 -12
  14. package/dist/{attachment-DsLgNHXt.js.map → attachment-DbjUWsP0.js.map} +1 -1
  15. package/dist/auth-CAQcasMV.js +723 -0
  16. package/dist/auth-CAQcasMV.js.map +1 -0
  17. package/dist/{avatar-CsnWaYmt.js → avatar-Bu2HhitA.js} +76 -71
  18. package/dist/avatar-Bu2HhitA.js.map +1 -0
  19. package/dist/{badge-BZXZT9wd.js → badge-CzId1Wlm.js} +4 -4
  20. package/dist/{badge-BZXZT9wd.js.map → badge-CzId1Wlm.js.map} +1 -1
  21. package/dist/base/accordion.js +1 -1
  22. package/dist/base/action-menu.js +1 -1
  23. package/dist/base/attachment.js +1 -1
  24. package/dist/base/avatar.js +1 -1
  25. package/dist/base/badge.js +1 -1
  26. package/dist/base/buttons.js +3 -2
  27. package/dist/base/cards.js +3 -3
  28. package/dist/base/carousel.js +25 -27
  29. package/dist/base/carousel.js.map +1 -1
  30. package/dist/base/cascader.js +150 -148
  31. package/dist/base/cascader.js.map +1 -1
  32. package/dist/base/chart.js +1 -1
  33. package/dist/base/choice-inputs.js +3 -2
  34. package/dist/base/code-block.js +1 -1
  35. package/dist/base/combobox.js +1 -1
  36. package/dist/base/command.js +1 -1
  37. package/dist/base/copyable.js +1 -1
  38. package/dist/base/date-pickers.js +3 -3
  39. package/dist/base/display.js +7 -7
  40. package/dist/base/feedback.js +4 -3
  41. package/dist/base/forms-numeric.js +1 -1
  42. package/dist/base/forms.js +2 -2
  43. package/dist/base/inline-edit.js +233 -0
  44. package/dist/base/inline-edit.js.map +1 -0
  45. package/dist/base/item.js +1 -1
  46. package/dist/base/media-gallery.js +1 -1
  47. package/dist/base/navigation.js +6 -6
  48. package/dist/base/popover-menu.js +1 -1
  49. package/dist/base/popover.js +1 -1
  50. package/dist/base/qr-code.js +1 -1
  51. package/dist/base/repeaters.js +33 -33
  52. package/dist/base/repeaters.js.map +1 -1
  53. package/dist/base/sheet.js +1 -1
  54. package/dist/base/sidebar.js +1 -1
  55. package/dist/base/signature-pad.js +83 -81
  56. package/dist/base/signature-pad.js.map +1 -1
  57. package/dist/base/skeleton.js +1 -1
  58. package/dist/base/spinner.js +1 -1
  59. package/dist/base/structure.js +1 -1
  60. package/dist/base/table.js +1 -1
  61. package/dist/base/text-inputs.js +2 -2
  62. package/dist/base/toaster.js +6 -6
  63. package/dist/base/toaster.js.map +1 -1
  64. package/dist/base/tree.js +1 -1
  65. package/dist/base/upload-queue.js +1 -1
  66. package/dist/base/upload.js +3 -3
  67. package/dist/base/value-inputs.js +1 -1
  68. package/dist/blocks/admin.js +134 -134
  69. package/dist/blocks/admin.js.map +1 -1
  70. package/dist/blocks/ai.js +120 -117
  71. package/dist/blocks/ai.js.map +1 -1
  72. package/dist/blocks/analytics/usage-card.js +3 -0
  73. package/dist/blocks/analytics.js +530 -491
  74. package/dist/blocks/analytics.js.map +1 -1
  75. package/dist/blocks/collaboration.js +2 -2
  76. package/dist/blocks/commerce/receipt.js +1 -1
  77. package/dist/blocks/commerce.js +395 -383
  78. package/dist/blocks/commerce.js.map +1 -1
  79. package/dist/blocks/data-display.js +1 -1
  80. package/dist/blocks/onboarding.js +6 -6
  81. package/dist/blocks/onboarding.js.map +1 -1
  82. package/dist/blocks/planning.js +311 -0
  83. package/dist/blocks/planning.js.map +1 -0
  84. package/dist/blocks/timelines.js +1 -1
  85. package/dist/{breadcrumbs-DdQ_I5ra.js → breadcrumbs-BuYz5SDU.js} +9 -8
  86. package/dist/breadcrumbs-BuYz5SDU.js.map +1 -0
  87. package/dist/button-BZDasD04.js +651 -0
  88. package/dist/button-BZDasD04.js.map +1 -0
  89. package/dist/{button-BS6l5JUw.js → button-BZyfTvwm.js} +3 -3
  90. package/dist/button-BZyfTvwm.js.map +1 -0
  91. package/dist/buttons-D_6KJvEE.js +99 -0
  92. package/dist/buttons-D_6KJvEE.js.map +1 -0
  93. package/dist/{cards-BMB0laLG.js → cards-qGSErLw_.js} +12 -12
  94. package/dist/{cards-BMB0laLG.js.map → cards-qGSErLw_.js.map} +1 -1
  95. package/dist/chart-Bsc5BICK.js +150 -0
  96. package/dist/chart-Bsc5BICK.js.map +1 -0
  97. package/dist/checkbox-BQNDjUCh.js +34 -0
  98. package/dist/checkbox-BQNDjUCh.js.map +1 -0
  99. package/dist/choice-inputs-Mk3iWbhr.js +725 -0
  100. package/dist/choice-inputs-Mk3iWbhr.js.map +1 -0
  101. package/dist/{code-block-DIlqzoiD.js → code-block-DzHKRybS.js} +23 -23
  102. package/dist/code-block-DzHKRybS.js.map +1 -0
  103. package/dist/{collapsible-DsnktFNv.js → collapsible-ClvC7Bj3.js} +3 -3
  104. package/dist/{collapsible-DsnktFNv.js.map → collapsible-ClvC7Bj3.js.map} +1 -1
  105. package/dist/{collection-content-C4fthJV_.js → collection-content-D6S8cv_n.js} +3 -3
  106. package/dist/{collection-content-C4fthJV_.js.map → collection-content-D6S8cv_n.js.map} +1 -1
  107. package/dist/{combobox-HDftpzxt.js → combobox-BFnbJJp3.js} +18 -18
  108. package/dist/combobox-BFnbJJp3.js.map +1 -0
  109. package/dist/{combobox-CHD750do.js → combobox-hozNwUcc.js} +313 -316
  110. package/dist/combobox-hozNwUcc.js.map +1 -0
  111. package/dist/{command-D0kWBZfd.js → command-BnmSchli.js} +9 -9
  112. package/dist/command-BnmSchli.js.map +1 -0
  113. package/dist/comments-u5L0OGip.js +1156 -0
  114. package/dist/comments-u5L0OGip.js.map +1 -0
  115. package/dist/components/base/buttons/button-group.recipes.d.ts +1 -1
  116. package/dist/components/base/buttons/button.recipes.d.ts +10 -19
  117. package/dist/components/base/buttons/use-pending-button-focus.d.ts +3 -0
  118. package/dist/components/base/cards/card.recipes.d.ts +13 -5
  119. package/dist/components/base/cards/partials/card-primitives.d.ts +9 -4
  120. package/dist/components/base/cards/smart-card.types.d.ts +3 -1
  121. package/dist/components/base/date-pickers/date-picker.recipes.d.ts +5 -18
  122. package/dist/components/base/date-pickers/datepicker.types.d.ts +3 -0
  123. package/dist/components/base/forms/form-field.d.ts +1 -0
  124. package/dist/components/base/forms/form-sizing.d.ts +3 -3
  125. package/dist/components/base/inline-edit/index.d.ts +2 -0
  126. package/dist/components/base/inline-edit/inline-edit.d.ts +81 -0
  127. package/dist/components/base/inline-edit/inline-edit.recipes.d.ts +6 -0
  128. package/dist/components/base/navigation/tabs.d.ts +3 -5
  129. package/dist/components/base/popover/popover.recipes.d.ts +3 -3
  130. package/dist/components/base/structure/structure.recipes.d.ts +6 -0
  131. package/dist/components/base/table/index.d.ts +1 -1
  132. package/dist/components/base/text-inputs/clear-native-field.d.ts +2 -0
  133. package/dist/components/base/text-inputs/input-trailing-action.d.ts +3 -0
  134. package/dist/components/blocks/analytics/index.d.ts +1 -0
  135. package/dist/components/blocks/analytics/types.d.ts +1 -1
  136. package/dist/components/blocks/analytics/usage-card/index.d.ts +3 -0
  137. package/dist/components/blocks/analytics/usage-card/types.d.ts +52 -0
  138. package/dist/components/blocks/analytics/usage-card/usage-card.d.ts +6 -0
  139. package/dist/components/blocks/analytics/usage-card/usage-card.data.d.ts +19 -0
  140. package/dist/components/blocks/analytics/usage-card/usage-card.strings.d.ts +22 -0
  141. package/dist/components/blocks/collaboration/message/message.recipes.d.ts +12 -0
  142. package/dist/components/blocks/data-display/empty-state/partials/illustrations/document-stack.d.ts +1 -4
  143. package/dist/components/blocks/data-display/empty-state/partials/illustrations/inbox-clean.d.ts +1 -4
  144. package/dist/components/blocks/data-display/empty-state/partials/illustrations/index.d.ts +3 -3
  145. package/dist/components/blocks/data-display/empty-state/partials/illustrations/stacked-cards.d.ts +1 -6
  146. package/dist/components/blocks/planning/index.d.ts +3 -0
  147. package/dist/components/blocks/planning/task-card.d.ts +3 -0
  148. package/dist/components/blocks/planning/task-card.strings.d.ts +15 -0
  149. package/dist/components/blocks/planning/task-card.types.d.ts +66 -0
  150. package/dist/components/features/combobox/components/error-message.d.ts +1 -1
  151. package/dist/components/features/comments/hooks/use-attachment-upload.d.ts +5 -0
  152. package/dist/components/features/filters/facets/search-facet.d.ts +0 -12
  153. package/dist/components/features/filters/facets/tags-facet.d.ts +1 -1
  154. package/dist/components/features/media-library/media-library.d.ts +1 -1
  155. package/dist/components/features/media-library/media-library.types.d.ts +9 -1
  156. package/dist/components/features/media-library/partials/media-library-partials.d.ts +1 -1
  157. package/dist/components/features/overlays/hooks/use-pending-overlay-focus.d.ts +2 -0
  158. package/dist/components/features/overlays/overlays.types.d.ts +5 -4
  159. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +2 -1
  160. package/dist/components/features/table/data-table.d.ts +1 -1
  161. package/dist/components/features/table/table.types.d.ts +1 -1
  162. package/dist/components/features/theme-tweaker/theme-provider-settings.d.ts +3 -1
  163. package/dist/components/layout/auth/auth.types.d.ts +1 -0
  164. package/dist/components/layout/page/page.d.ts +0 -1
  165. package/dist/components/layout/page/page.types.d.ts +9 -3
  166. package/dist/components/layout/sidebar/sidebar.context.d.ts +1 -1
  167. package/dist/components/layout/sidebar/sidebar.types.d.ts +4 -0
  168. package/dist/components/layout/workspace/workspace.types.d.ts +3 -0
  169. package/dist/components/typography/heading.d.ts +5 -2
  170. package/dist/components/typography/index.d.ts +1 -1
  171. package/dist/components/typography/text.styles.d.ts +10 -0
  172. package/dist/components/ui/popover.d.ts +1 -1
  173. package/dist/components/ui/sidebar.d.ts +1 -1
  174. package/dist/components/ui/table.d.ts +2 -1
  175. package/dist/container.recipes-D9t8MHR3.js +27 -0
  176. package/dist/container.recipes-D9t8MHR3.js.map +1 -0
  177. package/dist/{containers-CPNyNo1_.js → containers-DqB-bSYE.js} +34 -56
  178. package/dist/containers-DqB-bSYE.js.map +1 -0
  179. package/dist/control-group-recipes-DBXmfh2E.js +21 -0
  180. package/dist/control-group-recipes-DBXmfh2E.js.map +1 -0
  181. package/dist/{copyable-B7SBXJMr.js → copyable-BTSByfmq.js} +6 -6
  182. package/dist/{copyable-B7SBXJMr.js.map → copyable-BTSByfmq.js.map} +1 -1
  183. package/dist/{data-display-b3d1TfL4.js → data-display-Bihs9Ven.js} +542 -329
  184. package/dist/data-display-Bihs9Ven.js.map +1 -0
  185. package/dist/{date-BFNMnrS5.js → date-DOKhJPu7.js} +4 -4
  186. package/dist/{date-BFNMnrS5.js.map → date-DOKhJPu7.js.map} +1 -1
  187. package/dist/{date-picker-DI6kPNof.js → date-picker-DzP5HQq7.js} +492 -472
  188. package/dist/date-picker-DzP5HQq7.js.map +1 -0
  189. package/dist/date-pickers-BpgGz7S-.js +196 -0
  190. package/dist/date-pickers-BpgGz7S-.js.map +1 -0
  191. package/dist/{display-ByI5tkqy.js → display-CS6Hbk18.js} +8 -8
  192. package/dist/{display-ByI5tkqy.js.map → display-CS6Hbk18.js.map} +1 -1
  193. package/dist/{dropdown-menu-BlnyHr-9.js → dropdown-menu-D-boNgGO.js} +7 -7
  194. package/dist/{dropdown-menu-BlnyHr-9.js.map → dropdown-menu-D-boNgGO.js.map} +1 -1
  195. package/dist/features/activities.js +152 -141
  196. package/dist/features/activities.js.map +1 -1
  197. package/dist/features/ai-chat.js +182 -179
  198. package/dist/features/ai-chat.js.map +1 -1
  199. package/dist/features/async-preview.js +9 -9
  200. package/dist/features/async-preview.js.map +1 -1
  201. package/dist/features/combobox.js +1 -1
  202. package/dist/features/comments.js +1 -1
  203. package/dist/features/data-view.js +25 -23
  204. package/dist/features/data-view.js.map +1 -1
  205. package/dist/features/email-composer/engine.js +1 -1
  206. package/dist/features/email-composer.js +103 -104
  207. package/dist/features/email-composer.js.map +1 -1
  208. package/dist/features/event-calendar.js +375 -373
  209. package/dist/features/event-calendar.js.map +1 -1
  210. package/dist/features/filters.js +1 -1
  211. package/dist/features/global-search.js +222 -224
  212. package/dist/features/global-search.js.map +1 -1
  213. package/dist/features/kanban.js +29 -29
  214. package/dist/features/kanban.js.map +1 -1
  215. package/dist/features/map.js +59 -58
  216. package/dist/features/map.js.map +1 -1
  217. package/dist/features/media-library.js +856 -855
  218. package/dist/features/media-library.js.map +1 -1
  219. package/dist/features/mentions.js +1 -1
  220. package/dist/features/overlays.js +1 -1
  221. package/dist/features/products.js +1210 -1209
  222. package/dist/features/products.js.map +1 -1
  223. package/dist/features/questionnaire.js +133 -132
  224. package/dist/features/questionnaire.js.map +1 -1
  225. package/dist/features/resource-assignment.js +29 -31
  226. package/dist/features/resource-assignment.js.map +1 -1
  227. package/dist/features/resource.js +13 -13
  228. package/dist/features/resource.js.map +1 -1
  229. package/dist/features/rich-text-editor.js +2 -2
  230. package/dist/features/schema-form.js +82 -82
  231. package/dist/features/schema-form.js.map +1 -1
  232. package/dist/features/suggestions.js +3 -3
  233. package/dist/features/sync.js +4 -4
  234. package/dist/features/sync.js.map +1 -1
  235. package/dist/features/table.js +1 -1
  236. package/dist/features/theme-tweaker.js +456 -450
  237. package/dist/features/theme-tweaker.js.map +1 -1
  238. package/dist/feedback-CJkUAapr.js +233 -0
  239. package/dist/feedback-CJkUAapr.js.map +1 -0
  240. package/dist/field-affordance-recipes-uKY4MsZ_.js +25 -0
  241. package/dist/field-affordance-recipes-uKY4MsZ_.js.map +1 -0
  242. package/dist/{field-state-recipes-CBTRt9Bt.js → field-state-recipes-DQQpiLWC.js} +3 -3
  243. package/dist/field-state-recipes-DQQpiLWC.js.map +1 -0
  244. package/dist/{filters-qtrcv1hf.js → filters-D6FF8L6s.js} +715 -720
  245. package/dist/filters-D6FF8L6s.js.map +1 -0
  246. package/dist/{form-field-C6W-y2hR.js → form-field-CZwrkP7m.js} +17 -9
  247. package/dist/form-field-CZwrkP7m.js.map +1 -0
  248. package/dist/{form-sizing-39NohSqn.js → form-sizing-QP8aIRaW.js} +10 -6
  249. package/dist/form-sizing-QP8aIRaW.js.map +1 -0
  250. package/dist/{forms-BF-HSbff.js → forms-B5NCbkSC.js} +35 -35
  251. package/dist/{forms-BF-HSbff.js.map → forms-B5NCbkSC.js.map} +1 -1
  252. package/dist/forms-numeric-Crrm80Lm.js +867 -0
  253. package/dist/forms-numeric-Crrm80Lm.js.map +1 -0
  254. package/dist/{header-B8ex54cY.js → header-kxruN3RM.js} +53 -49
  255. package/dist/header-kxruN3RM.js.map +1 -0
  256. package/dist/{hooks-D6UBVzf2.js → hooks-BrlnCwQd.js} +2 -2
  257. package/dist/{hooks-D6UBVzf2.js.map → hooks-BrlnCwQd.js.map} +1 -1
  258. package/dist/{http-CLTVJc5I.js → http-CdEIHyQf.js} +2 -2
  259. package/dist/http-CdEIHyQf.js.map +1 -0
  260. package/dist/{icon-badge-Dv0RYQwj.js → icon-badge-Btc6pQrp.js} +4 -4
  261. package/dist/{icon-badge-Dv0RYQwj.js.map → icon-badge-Btc6pQrp.js.map} +1 -1
  262. package/dist/index.js +2 -2
  263. package/dist/input-SX9V0AL3.js +255 -0
  264. package/dist/input-SX9V0AL3.js.map +1 -0
  265. package/dist/input-vxcaNCYC.js +20 -0
  266. package/dist/input-vxcaNCYC.js.map +1 -0
  267. package/dist/{item-pJ0GsOiJ.js → item-DE4YnuJx.js} +18 -17
  268. package/dist/item-DE4YnuJx.js.map +1 -0
  269. package/dist/layout/app-shell.js +1 -1
  270. package/dist/layout/auth.js +1 -1
  271. package/dist/layout/containers.js +1 -1
  272. package/dist/layout/header.js +1 -1
  273. package/dist/layout/hooks.js +1 -1
  274. package/dist/layout/navigation.js +1 -1
  275. package/dist/layout/page.js +1 -1
  276. package/dist/layout/settings.js +1 -1
  277. package/dist/layout/sidebar.js +2 -2
  278. package/dist/layout/workspace.js +1 -1
  279. package/dist/layout.js +10 -10
  280. package/dist/lib/affordance-geometry.generated.d.ts +44 -4
  281. package/dist/lib/control-group-recipes.d.ts +22 -0
  282. package/dist/lib/field-affordance-recipes.d.ts +35 -2
  283. package/dist/lib/field-state-recipes.d.ts +2 -2
  284. package/dist/lib/navigation-row-recipes.d.ts +3 -2
  285. package/dist/lib/overlay-anatomy-recipes.d.ts +1 -1
  286. package/dist/lib/surface-recipes.d.ts +5 -2
  287. package/dist/lib/token-merge.generated.d.ts +144 -2
  288. package/dist/lib/ui-provider/types.d.ts +4 -2
  289. package/dist/lib/use-prefers-reduced-motion.d.ts +2 -0
  290. package/dist/lib/utils.js +1 -1
  291. package/dist/{media-gallery-Ca4YmvBi.js → media-gallery-DLp3HAz0.js} +75 -74
  292. package/dist/media-gallery-DLp3HAz0.js.map +1 -0
  293. package/dist/{mentions-CRio8mTm.js → mentions-Cl0Kt_Pd.js} +52 -50
  294. package/dist/{mentions-CRio8mTm.js.map → mentions-Cl0Kt_Pd.js.map} +1 -1
  295. package/dist/message-SZUNB1eX.js +127 -0
  296. package/dist/message-SZUNB1eX.js.map +1 -0
  297. package/dist/{navigation-BTrEb5u4.js → navigation-DnQSNMT0.js} +64 -55
  298. package/dist/navigation-DnQSNMT0.js.map +1 -0
  299. package/dist/{navigation-DqEITuD2.js → navigation-DyytsLRB.js} +37 -37
  300. package/dist/navigation-DyytsLRB.js.map +1 -0
  301. package/dist/{navigation-row-recipes-BFpvGPGE.js → navigation-row-recipes-DQEXQcqY.js} +3 -3
  302. package/dist/navigation-row-recipes-DQEXQcqY.js.map +1 -0
  303. package/dist/{number-BNT_BIzJ.js → number-DasMFWEG.js} +4 -4
  304. package/dist/{number-BNT_BIzJ.js.map → number-DasMFWEG.js.map} +1 -1
  305. package/dist/overlays-DUbs1KEi.js +1011 -0
  306. package/dist/overlays-DUbs1KEi.js.map +1 -0
  307. package/dist/{page-BMBGjJY8.js → page-hGmT4nWK.js} +75 -64
  308. package/dist/page-hGmT4nWK.js.map +1 -0
  309. package/dist/{page-header-BH41wCyY.js → page-header-D8nERkn5.js} +9 -9
  310. package/dist/page-header-D8nERkn5.js.map +1 -0
  311. package/dist/{pagination-C29vvt3I.js → pagination-NLGqRirf.js} +20 -20
  312. package/dist/pagination-NLGqRirf.js.map +1 -0
  313. package/dist/{popover-TInGXsjg.js → popover-CghIYdQf.js} +23 -22
  314. package/dist/popover-CghIYdQf.js.map +1 -0
  315. package/dist/{popover-menu-BzqXqE72.js → popover-menu-B4PoWhRl.js} +6 -6
  316. package/dist/{popover-menu-BzqXqE72.js.map → popover-menu-B4PoWhRl.js.map} +1 -1
  317. package/dist/{popover.recipes-zgBhMlUu.js → popover.recipes-QlD4JenO.js} +5 -5
  318. package/dist/popover.recipes-QlD4JenO.js.map +1 -0
  319. package/dist/{primitives-DKPOGVpj.js → primitives-C7ff0QaI.js} +120 -113
  320. package/dist/primitives-C7ff0QaI.js.map +1 -0
  321. package/dist/primitives.js +3 -3
  322. package/dist/progress-BroqrAyV.js +169 -0
  323. package/dist/progress-BroqrAyV.js.map +1 -0
  324. package/dist/{receipt-DYWTQGEc.js → receipt-BuJynLgf.js} +8 -8
  325. package/dist/{receipt-DYWTQGEc.js.map → receipt-BuJynLgf.js.map} +1 -1
  326. package/dist/{rich-text-B7sBAdDG.js → rich-text-DlxDOtf4.js} +4 -4
  327. package/dist/{rich-text-B7sBAdDG.js.map → rich-text-DlxDOtf4.js.map} +1 -1
  328. package/dist/rich-text-editor-BKyG7rWz.js +574 -0
  329. package/dist/rich-text-editor-BKyG7rWz.js.map +1 -0
  330. package/dist/{rich-text-editor.recipes-DxvOE0Lp.js → rich-text-editor.recipes-B72Nfuze.js} +35 -26
  331. package/dist/rich-text-editor.recipes-B72Nfuze.js.map +1 -0
  332. package/dist/{scroll-area-BheMQ270.js → scroll-area-D-pIhEKl.js} +3 -3
  333. package/dist/scroll-area-D-pIhEKl.js.map +1 -0
  334. package/dist/{separator-Gk_WXH-l.js → separator-BNIgG3au.js} +3 -3
  335. package/dist/{separator-Gk_WXH-l.js.map → separator-BNIgG3au.js.map} +1 -1
  336. package/dist/{separator-DO0EbCEm.js → separator-BhtFyo4x.js} +2 -2
  337. package/dist/{separator-DO0EbCEm.js.map → separator-BhtFyo4x.js.map} +1 -1
  338. package/dist/services/actions.js +1 -1
  339. package/dist/{settings-D9f_wdIC.js → settings-DOTOzeZ2.js} +10 -9
  340. package/dist/{settings-D9f_wdIC.js.map → settings-DOTOzeZ2.js.map} +1 -1
  341. package/dist/{sheet-vOUloJ4O.js → sheet-BFhrNehm.js} +11 -11
  342. package/dist/sheet-BFhrNehm.js.map +1 -0
  343. package/dist/{sidebar-CNBKFDRW.js → sidebar-CyR4XKwR.js} +219 -200
  344. package/dist/sidebar-CyR4XKwR.js.map +1 -0
  345. package/dist/{sidebar-C3UKkbC5.js → sidebar-SvGJ0Zwi.js} +63 -58
  346. package/dist/sidebar-SvGJ0Zwi.js.map +1 -0
  347. package/dist/{skeleton-BvRhK8y-.js → skeleton-3F0uhYn3.js} +4 -4
  348. package/dist/{skeleton-BvRhK8y-.js.map → skeleton-3F0uhYn3.js.map} +1 -1
  349. package/dist/{smart-card-B5FcKODh.js → smart-card-DjGVV2xr.js} +206 -199
  350. package/dist/smart-card-DjGVV2xr.js.map +1 -0
  351. package/dist/{spinner-JtlFJ7Nc.js → spinner-Cpf7oRkF.js} +5 -5
  352. package/dist/{spinner-JtlFJ7Nc.js.map → spinner-Cpf7oRkF.js.map} +1 -1
  353. package/dist/{structure-BvW4vG4H.js → structure-CRdqVawd.js} +14 -14
  354. package/dist/{structure-BvW4vG4H.js.map → structure-CRdqVawd.js.map} +1 -1
  355. package/dist/{structure.recipes-DjqnBpwz.js → structure.recipes-Bqhf9oIh.js} +2 -2
  356. package/dist/structure.recipes-Bqhf9oIh.js.map +1 -0
  357. package/dist/style.css +1 -1
  358. package/dist/{surface-recipes-CQfRr-VL.js → surface-recipes-Dd__PD-w.js} +4 -3
  359. package/dist/surface-recipes-Dd__PD-w.js.map +1 -0
  360. package/dist/{table-DnlAJ-xR.js → table-CLtJTxoR.js} +17 -16
  361. package/dist/table-CLtJTxoR.js.map +1 -0
  362. package/dist/table-CcRDZiLP.js +1444 -0
  363. package/dist/table-CcRDZiLP.js.map +1 -0
  364. package/dist/tabs-BNgu7g0u.js +188 -0
  365. package/dist/tabs-BNgu7g0u.js.map +1 -0
  366. package/dist/text-inputs-DsR56TR-.js +330 -0
  367. package/dist/text-inputs-DsR56TR-.js.map +1 -0
  368. package/dist/{text.styles-BwB7vAF2.js → text.styles-Q4sGAIgA.js} +18 -10
  369. package/dist/text.styles-Q4sGAIgA.js.map +1 -0
  370. package/dist/theme.css +77 -115
  371. package/dist/{timelines-CnZ2S_Gr.js → timelines-D1pkt3se.js} +84 -78
  372. package/dist/timelines-D1pkt3se.js.map +1 -0
  373. package/dist/{tree-COD9BGdU.js → tree-BtmYyMZV.js} +8 -8
  374. package/dist/{tree-COD9BGdU.js.map → tree-BtmYyMZV.js.map} +1 -1
  375. package/dist/typography/rich-text.js +1 -1
  376. package/dist/typography-BxQgiZyw.js +96 -0
  377. package/dist/typography-BxQgiZyw.js.map +1 -0
  378. package/dist/typography.js +1 -1
  379. package/dist/{ui-provider-CftIB6TY.js → ui-provider-DRPn3qNl.js} +3 -2
  380. package/dist/ui-provider-DRPn3qNl.js.map +1 -0
  381. package/dist/ui-provider.js +1 -1
  382. package/dist/{upload-DIzw1dx1.js → upload-CDbYw1WN.js} +326 -323
  383. package/dist/upload-CDbYw1WN.js.map +1 -0
  384. package/dist/{upload-queue-xRJ3qDmd.js → upload-queue-CNd_hH_a.js} +25 -25
  385. package/dist/upload-queue-CNd_hH_a.js.map +1 -0
  386. package/dist/usage-card-VyJLUwRr.js +457 -0
  387. package/dist/usage-card-VyJLUwRr.js.map +1 -0
  388. package/dist/utils-BvH9PSmq.js +4275 -0
  389. package/dist/utils-BvH9PSmq.js.map +1 -0
  390. package/dist/value-inputs-D0KCrfVC.js +840 -0
  391. package/dist/value-inputs-D0KCrfVC.js.map +1 -0
  392. package/dist/{workspace-Cbqz4FzN.js → workspace-CcR8r-Nt.js} +115 -122
  393. package/dist/workspace-CcR8r-Nt.js.map +1 -0
  394. package/docs/consumer-skill/SKILL.md +112 -18
  395. package/docs/consumer-skill/examples/analytics.tsx +34 -0
  396. package/docs/consumer-skill/examples/app-layout.tsx +42 -12
  397. package/docs/consumer-skill/examples/detail.tsx +24 -9
  398. package/docs/consumer-skill/examples/manifest.json +27 -1
  399. package/docs/consumer-skill/examples/planning-usage-edit.tsx +29 -0
  400. package/docs/consumer-skill/examples/scoped-directory.tsx +77 -0
  401. package/docs/consumer-skill/examples/website.tsx +56 -0
  402. package/docs/consumer-skill/references/analytics.md +70 -0
  403. package/docs/consumer-skill/references/composition.md +219 -2
  404. package/docs/consumer-skill/references/design-contract.md +37 -10
  405. package/docs/consumer-skill/references/discovery.md +93 -5
  406. package/docs/consumer-skill/references/installation.md +20 -3
  407. package/docs/consumer-skill/references/integration.md +26 -0
  408. package/docs/consumer-skill/references/public-api.json +2416 -388
  409. package/docs/consumer-skill/references/review.md +126 -0
  410. package/docs/consumer-skill/references/theming.md +52 -7
  411. package/docs/consumer-skill/references/tokens.json +177 -9
  412. package/docs/consumer-skill/references/workflows.md +129 -1
  413. package/docs/consumer-skill/scripts/check-composition.mjs +31 -0
  414. package/docs/consumer-skill/scripts/composition-policy.mjs +317 -0
  415. package/docs/consumer-skill/scripts/discovery.mjs +65 -8
  416. package/docs/consumer-skill/scripts/surface-policy.mjs +66 -0
  417. package/package.json +30 -6
  418. package/dist/accordion-BRWh3BM1.js.map +0 -1
  419. package/dist/action-menu-Cx3SdfbN.js.map +0 -1
  420. package/dist/affordance-geometry.generated-DXl-Zb3Z.js +0 -23
  421. package/dist/affordance-geometry.generated-DXl-Zb3Z.js.map +0 -1
  422. package/dist/ai-artifact-DkOArd3-.js.map +0 -1
  423. package/dist/app-shell-BH_bGcE2.js.map +0 -1
  424. package/dist/auth-BDB1V_2q.js +0 -704
  425. package/dist/auth-BDB1V_2q.js.map +0 -1
  426. package/dist/avatar-CsnWaYmt.js.map +0 -1
  427. package/dist/breadcrumbs-DdQ_I5ra.js.map +0 -1
  428. package/dist/button-BS6l5JUw.js.map +0 -1
  429. package/dist/buttons-Co6GavvM.js +0 -674
  430. package/dist/buttons-Co6GavvM.js.map +0 -1
  431. package/dist/chart-DVfcwQu6.js +0 -149
  432. package/dist/chart-DVfcwQu6.js.map +0 -1
  433. package/dist/choice-inputs-CavA-SGV.js +0 -644
  434. package/dist/choice-inputs-CavA-SGV.js.map +0 -1
  435. package/dist/code-block-DIlqzoiD.js.map +0 -1
  436. package/dist/combobox-CHD750do.js.map +0 -1
  437. package/dist/combobox-HDftpzxt.js.map +0 -1
  438. package/dist/command-D0kWBZfd.js.map +0 -1
  439. package/dist/comments-CvYeglMS.js +0 -1132
  440. package/dist/comments-CvYeglMS.js.map +0 -1
  441. package/dist/containers-CPNyNo1_.js.map +0 -1
  442. package/dist/data-display-b3d1TfL4.js.map +0 -1
  443. package/dist/date-picker-DI6kPNof.js.map +0 -1
  444. package/dist/date-pickers-ByP6Cv2z.js +0 -224
  445. package/dist/date-pickers-ByP6Cv2z.js.map +0 -1
  446. package/dist/feedback-a9j9J-9A.js +0 -391
  447. package/dist/feedback-a9j9J-9A.js.map +0 -1
  448. package/dist/field-affordance-recipes-CHdUtn2Z.js +0 -17
  449. package/dist/field-affordance-recipes-CHdUtn2Z.js.map +0 -1
  450. package/dist/field-state-recipes-CBTRt9Bt.js.map +0 -1
  451. package/dist/filters-qtrcv1hf.js.map +0 -1
  452. package/dist/form-field-C6W-y2hR.js.map +0 -1
  453. package/dist/form-sizing-39NohSqn.js.map +0 -1
  454. package/dist/forms-numeric-Y15Bg5Nr.js +0 -867
  455. package/dist/forms-numeric-Y15Bg5Nr.js.map +0 -1
  456. package/dist/header-B8ex54cY.js.map +0 -1
  457. package/dist/http-CLTVJc5I.js.map +0 -1
  458. package/dist/input-DMorJiTI.js +0 -202
  459. package/dist/input-DMorJiTI.js.map +0 -1
  460. package/dist/input-ci9fIgFH.js +0 -20
  461. package/dist/input-ci9fIgFH.js.map +0 -1
  462. package/dist/item-pJ0GsOiJ.js.map +0 -1
  463. package/dist/media-gallery-Ca4YmvBi.js.map +0 -1
  464. package/dist/message-B5-6LeYl.js +0 -108
  465. package/dist/message-B5-6LeYl.js.map +0 -1
  466. package/dist/navigation-BTrEb5u4.js.map +0 -1
  467. package/dist/navigation-DqEITuD2.js.map +0 -1
  468. package/dist/navigation-row-recipes-BFpvGPGE.js.map +0 -1
  469. package/dist/overlays-DBqV0J_V.js +0 -982
  470. package/dist/overlays-DBqV0J_V.js.map +0 -1
  471. package/dist/page-BMBGjJY8.js.map +0 -1
  472. package/dist/page-header-BH41wCyY.js.map +0 -1
  473. package/dist/pagination-C29vvt3I.js.map +0 -1
  474. package/dist/popover-TInGXsjg.js.map +0 -1
  475. package/dist/popover.recipes-zgBhMlUu.js.map +0 -1
  476. package/dist/primitives-DKPOGVpj.js.map +0 -1
  477. package/dist/rich-text-editor-BZSJchAF.js +0 -575
  478. package/dist/rich-text-editor-BZSJchAF.js.map +0 -1
  479. package/dist/rich-text-editor.recipes-DxvOE0Lp.js.map +0 -1
  480. package/dist/scroll-area-BheMQ270.js.map +0 -1
  481. package/dist/select-B2mb-qN2.js +0 -108
  482. package/dist/select-B2mb-qN2.js.map +0 -1
  483. package/dist/sheet-vOUloJ4O.js.map +0 -1
  484. package/dist/sidebar-C3UKkbC5.js.map +0 -1
  485. package/dist/sidebar-CNBKFDRW.js.map +0 -1
  486. package/dist/smart-card-B5FcKODh.js.map +0 -1
  487. package/dist/structure.recipes-DjqnBpwz.js.map +0 -1
  488. package/dist/surface-recipes-CQfRr-VL.js.map +0 -1
  489. package/dist/table-DnlAJ-xR.js.map +0 -1
  490. package/dist/table-ghtAQ-JJ.js +0 -1424
  491. package/dist/table-ghtAQ-JJ.js.map +0 -1
  492. package/dist/tabs-DY09eoZg.js +0 -187
  493. package/dist/tabs-DY09eoZg.js.map +0 -1
  494. package/dist/text-inputs-BhOcedTo.js +0 -331
  495. package/dist/text-inputs-BhOcedTo.js.map +0 -1
  496. package/dist/text.styles-BwB7vAF2.js.map +0 -1
  497. package/dist/timelines-CnZ2S_Gr.js.map +0 -1
  498. package/dist/typography-Cv8MT-82.js +0 -96
  499. package/dist/typography-Cv8MT-82.js.map +0 -1
  500. package/dist/ui-provider-CftIB6TY.js.map +0 -1
  501. package/dist/upload-DIzw1dx1.js.map +0 -1
  502. package/dist/upload-queue-xRJ3qDmd.js.map +0 -1
  503. package/dist/utils-C2EKeIw3.js +0 -72
  504. package/dist/utils-C2EKeIw3.js.map +0 -1
  505. package/dist/value-inputs-Co1fu-xv.js +0 -824
  506. package/dist/value-inputs-Co1fu-xv.js.map +0 -1
  507. package/dist/workspace-Cbqz4FzN.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ai.js","names":["_Fragment","NumberValue","NumberValue","_Fragment","cn","Button","Text","DisplayLabel","TextLink","AdaptiveGrid","Stack","Progress","SecondaryValue","MonoValue","Percent","Number","IconBadge","Badge","Separator","Textarea","ItemFooter","ItemMedia","ItemDescription","ItemActions","ItemGroup","ItemContent","Item","ItemTitle","InlineStat","defaultAiMessageBubbleStrings","AiMessageBubble","AiCodeBlock","AiChainOfThought","AiToolCall","defaultAiReasoningStrings","AiConfirmation","defaultAiConfirmationStrings","defaultAiAttachmentStrings","AiAttachment","defaultAiTaskStrings","AiSources","defaultAiAgentStrings","defaultAiArtifactStrings","defaultAiChainOfThoughtStrings","AiAgent","AiTask","AiReasoning","AiArtifact","defaultAiSourcesStrings","defaultAiCodeBlockStrings","defaultAiToolCallStrings","AiShimmer","Tree","Fragment$1","defaultAiSummaryStrings","defaultAiClassificationStrings","confidenceBars","ConfidenceBars","filled","level","i","label","AiSummaryBlock","stringsProp","strings","useStrings","defaultMetadata","data","defaultActions","RefreshCw","resolvedMetadata","metadata","resolvedActions","actions","footerContent","footer","className","entity","children","AiClassificationPanel","confidenceLabel","flag","defaultAiConfidenceStrings","levelVariant","score","AiConfidence","pct","variant","c","dash","model","factors","f","defaultAiPromptSuggestionsStrings","AiPromptSuggestions","suggestions","Icon","s","onPick","defaultAiTokenUsageStrings","AiTokenUsage","total","inputTokens","outputTokens","maxTokens","cell","cost","defaultAiFeedbackStrings","AiFeedback","internalVote","setInternalVote","useState","comment","setComment","vote","value","cast","resolved","next","onVote","submitted","ThumbsUp","ThumbsDown","allowComment","onSubmitComment","defaultAiCitationStrings","n","AiCitation","expandedProp","mergeStrings","internalExpanded","setInternalExpanded","defaultExpanded","expanded","setExpanded","onExpandedChange","visible","sources","maxCollapsedRows","hidden","Quote","jsx","ChevronDown","ChevronRight","CitationRow","relevancePct","source","TitleEl","titleProps","index","ExternalLink","defaultAiInlineCitationStrings","interpolate","template","v","params","k","m","AiInlineCitation","ariaLabel","title","tooltip","baseCls","url","onSelect","defaultAiPackageInfoStrings","AiPackageInfo","bodyContent","Package","name","version","description","license","publishedAt","weeklyDownloads","MetaItem","keywords","keyword","bodyClassName","homepage","repository","Globe","Code2","defaultAiFileTreeStrings","statusTones","statusIconClasses","pickFileIcon","ext","FileCode","FileText","File","initialExpansion","nodes","node","depth","AiFileTree","props","localExpanded","setLocalExpanded","defaultExpandedIds","expandedIds","items","useMemo","map","directory","FolderOpen","Folder","hideStatusLabels","selectedId","values","onExpandedIdsChange"],"sources":["../../src/components/blocks/ai/ai.strings.ts","../../src/components/blocks/ai/ai-summary/ai-summary.tsx","../../src/components/blocks/ai/ai-classification/ai-classification.tsx","../../src/components/blocks/ai/ai-confidence/types.ts","../../src/components/blocks/ai/ai-confidence/ai-confidence.tsx","../../src/components/blocks/ai/ai-prompt-suggestions/types.ts","../../src/components/blocks/ai/ai-prompt-suggestions/ai-prompt-suggestions.tsx","../../src/components/blocks/ai/ai-token-usage/types.ts","../../src/components/blocks/ai/ai-token-usage/ai-token-usage.tsx","../../src/components/blocks/ai/ai-feedback/types.ts","../../src/components/blocks/ai/ai-feedback/ai-feedback.tsx","../../src/components/blocks/ai/ai-citation/types.ts","../../src/components/blocks/ai/ai-citation/ai-citation.tsx","../../src/components/blocks/ai/ai-inline-citation/types.ts","../../src/components/blocks/ai/ai-inline-citation/ai-inline-citation.tsx","../../src/components/blocks/ai/ai-package-info/types.ts","../../src/components/blocks/ai/ai-package-info/ai-package-info.tsx","../../src/components/blocks/ai/ai-file-tree/types.ts","../../src/components/blocks/ai/ai-file-tree/ai-file-tree.tsx"],"sourcesContent":["/**\n * Shared default strings for `blocks/ai` components.\n *\n * Each component accepts a `strings` prop deep-merged over the default subset\n * it reads. Consumers wire backend i18n at the call site:\n *\n * <AiSummaryBlock strings={{ regenerate: t('ai.summary.regenerate') }} … />\n */\n\nexport interface AiSummaryStrings {\n\t/** Regenerate button label. */\n\tregenerate: string;\n\t/** Confidence-bar level labels. */\n\tconfidenceLevels: { low: string; medium: string; high: string };\n}\n\nexport const defaultAiSummaryStrings: AiSummaryStrings = {\n\tregenerate: 'Regenerate',\n\tconfidenceLevels: { low: 'low', medium: 'medium', high: 'high' },\n};\n\nexport interface AiClassificationStrings {\n\t/** Card title rendered in the header. */\n\ttitle: string;\n\t/** Inline-stat row labels. */\n\tcomplexityLabel: string;\n\tflagsLabel: string;\n\tnextStepLabel: string;\n\t/** Confidence pill prefix (e.g. \"Confidence: High\"). */\n\tconfidencePrefix: string;\n\t/** Confidence band labels. */\n\tconfidenceBands: { low: string; medium: string; high: string };\n}\n\nexport const defaultAiClassificationStrings: AiClassificationStrings = {\n\ttitle: 'Classification',\n\tcomplexityLabel: 'Complexity',\n\tflagsLabel: 'Flags',\n\tnextStepLabel: 'Next Step',\n\tconfidencePrefix: 'Confidence',\n\tconfidenceBands: { low: 'Low', medium: 'Medium', high: 'High' },\n};\n","import { RefreshCw } from 'lucide-react';\n\nimport { Badge } from '../../../base/badge';\nimport { Button } from '../../../base/buttons';\nimport { Stack } from '../../../base/structure';\nimport { SecondaryValue } from '../../../primitives';\nimport { Text } from '../../../typography/text';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultAiSummaryStrings } from '../ai.strings';\nimport type { AiSummaryBlockProps, ConfidenceLevel } from './types';\n\nconst confidenceBars: Record<ConfidenceLevel, number> = {\n\tlow: 1,\n\tmedium: 2,\n\thigh: 3,\n};\n\nfunction ConfidenceBars({ level, label }: { level: ConfidenceLevel; label: string }) {\n\tconst filled = confidenceBars[level];\n\n\treturn (\n\t\t<div className=\"ai-summary--confidence flex items-center gap-space-sm\">\n\t\t\t<div className=\"flex items-center gap-space-2xs\" aria-hidden=\"true\">\n\t\t\t\t{Array.from({ length: 3 }, (_, i) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={`bar-${String(i)}`}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'h-2.5 w-1 rounded-radius-sm',\n\t\t\t\t\t\t\ti < filled ? 'bg-foreground/60' : 'bg-muted-foreground/20',\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t\t<Text size=\"xs\" type=\"secondary\" tag=\"span\" className=\"capitalize\">\n\t\t\t\t{label}\n\t\t\t</Text>\n\t\t</div>\n\t);\n}\n\nexport function AiSummaryBlock({\n\tdata,\n\tchildren,\n\tmetadata,\n\tactions,\n\tfooter,\n\tclassName,\n\tstrings: stringsProp,\n}: AiSummaryBlockProps) {\n\tconst strings = useStrings(defaultAiSummaryStrings, stringsProp);\n\tconst defaultMetadata = (\n\t\t<div className=\"ai-summary--metadata flex min-w-0 flex-wrap items-center gap-x-space-md gap-y-space-xs\">\n\t\t\t{!!data.generatedAt && (\n\t\t\t\t<SecondaryValue size=\"xs\" className=\"min-w-0\">\n\t\t\t\t\t{data.generatedAt}\n\t\t\t\t</SecondaryValue>\n\t\t\t)}\n\t\t\t{!!data.model && (\n\t\t\t\t<SecondaryValue size=\"xs\" className=\"min-w-0 truncate\">\n\t\t\t\t\t{data.model}\n\t\t\t\t</SecondaryValue>\n\t\t\t)}\n\t\t</div>\n\t);\n\tconst defaultActions = data.onRegenerate ? (\n\t\t<Button tone=\"secondary\" buttonStyle=\"ghost\" onClick={data.onRegenerate}>\n\t\t\t<RefreshCw className=\"mr-1 h-3 w-3\" />\n\t\t\t{strings.regenerate}\n\t\t</Button>\n\t) : null;\n\tconst resolvedMetadata = metadata === undefined ? defaultMetadata : metadata;\n\tconst resolvedActions = actions === undefined ? defaultActions : actions;\n\tconst footerContent = footer !== undefined\n\t\t? footer\n\t\t: (resolvedMetadata || resolvedActions) && (\n\t\t\t<>\n\t\t\t\t{resolvedMetadata}\n\t\t\t\t{resolvedActions}\n\t\t\t</>\n\t\t);\n\n\treturn (\n\t\t<Stack\n\t\t\tdata-component=\"ai-summary\"\n\t\t\tdata-slot=\"ai-summary\"\n\t\t\tclassName={cn('ai-summary--component', className)}\n\t\t>\n\t\t\t<Text lineHeight=\"relaxed\">\n\t\t\t\t{data.summary}\n\t\t\t</Text>\n\n\t\t\t{data.entities.length > 0 && (\n\t\t\t\t<Stack direction=\"horizontal\" wrap gap=\"sm\" className=\"ai-summary--entities min-w-0\">\n\t\t\t\t\t{data.entities.map((entity) => (\n\t\t\t\t\t\t<Badge key={entity} tone=\"secondary\">\n\t\t\t\t\t\t\t{entity}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t))}\n\t\t\t\t</Stack>\n\t\t\t)}\n\n\t\t\t<ConfidenceBars level={data.confidence} label={strings.confidenceLevels[data.confidence]} />\n\n\t\t\t{children}\n\n\t\t\t{!!footerContent && (\n\t\t\t\t<Stack\n\t\t\t\t\tdirection={{ base: 'vertical', sm: 'horizontal' }}\n\t\t\t\t\tgap=\"md\"\n\t\t\t\t\tjustify={{ sm: 'between' }}\n\t\t\t\t\tclassName=\"ai-summary--footer pt-space-xs\"\n\t\t\t\t>\n\t\t\t\t\t{footerContent}\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t</Stack>\n\t);\n}\n","import { Badge } from '../../../base/badge';\nimport { Stack } from '../../../base/structure';\nimport { InlineStat } from '../../data-display';\nimport { Separator } from '../../../base/display/separator';\nimport { Text } from '../../../typography/text';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultAiClassificationStrings } from '../ai.strings';\nimport type { AiClassificationPanelProps } from './types';\n\nexport function AiClassificationPanel({ data, children, className, strings: stringsProp }: AiClassificationPanelProps) {\n\tconst strings = useStrings(defaultAiClassificationStrings, stringsProp);\n\tconst confidenceLabel =\n\t\tdata.confidence >= 0.9\n\t\t\t? strings.confidenceBands.high\n\t\t\t: data.confidence >= 0.7\n\t\t\t\t? strings.confidenceBands.medium\n\t\t\t\t: strings.confidenceBands.low;\n\n\treturn (\n\t\t<Stack\n\t\t\tdata-component=\"ai-classification\"\n\t\t\tdata-slot=\"ai-classification\"\n\t\t\tclassName={cn('ai-classification--component', className)}\n\t\t>\n\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\">\n\t\t\t\t<Badge tone=\"primary\">\n\t\t\t\t\t{data.requestType}\n\t\t\t\t</Badge>\n\t\t\t\t<Badge tone={data.urgencyTone}>\n\t\t\t\t\t{data.urgency}\n\t\t\t\t</Badge>\n\t\t\t\t<Badge tone={data.sentimentTone} dot>\n\t\t\t\t\t{data.tone}\n\t\t\t\t</Badge>\n\t\t\t</Stack>\n\n\t\t\t<InlineStat\n\t\t\t\tlabel={strings.complexityLabel}\n\t\t\t\tlabelClassName=\"text-sm font-medium text-foreground\"\n\t\t\t\tvalue={\n\t\t\t\t\t<span className=\"flex items-center gap-space-xs\">\n\t\t\t\t\t\t{Array.from({ length: 5 }, (_, i) => (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tkey={`cx-${String(i)}`}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'h-1.5 w-3 rounded-radius-sm',\n\t\t\t\t\t\t\t\t\ti < data.complexityScore ? 'bg-foreground/60' : 'bg-muted',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"ml-1\">\n\t\t\t\t\t\t\t{String(data.complexityScore)}/5\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</span>\n\t\t\t\t}\n\t\t\t/>\n\n\t\t\t{data.flags.length > 0 && (\n\t\t\t\t<InlineStat\n\t\t\t\t\tlabel={strings.flagsLabel}\n\t\t\t\t\tlabelClassName=\"text-sm font-medium text-foreground\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<span className=\"flex gap-space-xs\">\n\t\t\t\t\t\t\t{data.flags.map((flag) => (\n\t\t\t\t\t\t\t\t<Badge key={flag} tone=\"warning\">\n\t\t\t\t\t\t\t\t\t{flag}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t<InlineStat\n\t\t\t\tlabel={strings.nextStepLabel}\n\t\t\t\tlabelClassName=\"text-sm font-medium text-foreground\"\n\t\t\t\tvalue={<Badge tone=\"info\">{data.suggestedAction}</Badge>}\n\t\t\t/>\n\n\t\t\t<Text lineHeight=\"relaxed\" type=\"secondary\">\n\t\t\t\t{data.summary}\n\t\t\t</Text>\n\n\t\t\t<Separator />\n\n\t\t\t<div className=\"flex items-center gap-space-md\">\n\t\t\t\t<Badge tone=\"secondary\">\n\t\t\t\t\t{strings.confidencePrefix}: {confidenceLabel}\n\t\t\t\t</Badge>\n\t\t\t\t<Text size=\"xs\" type=\"discrete\" tag=\"span\">\n\t\t\t\t\t{data.model}\n\t\t\t\t</Text>\n\t\t\t</div>\n\n\t\t\t{children}\n\t\t</Stack>\n\t);\n}\n","import type { StringsProp } from '../../../../lib/strings';\n\nexport interface AiConfidenceFactor {\n\t/** Display label. */\n\tlabel: string;\n\tscore: number; // 0–1\n}\n\nexport interface AiConfidenceStrings {\n\t/** Surface title. */\n\ttitle: string;\n\tconfidenceLabel: string;\n\tfactorsLabel: string;\n\tlevelHigh: string;\n\tlevelMedium: string;\n\tlevelLow: string;\n}\n\nexport const defaultAiConfidenceStrings: AiConfidenceStrings = {\n\ttitle: 'AI Confidence',\n\tconfidenceLabel: 'Overall',\n\tfactorsLabel: 'Contributing factors',\n\tlevelHigh: 'High',\n\tlevelMedium: 'Medium',\n\tlevelLow: 'Low',\n};\n\nexport interface AiConfidenceProps {\n\tscore: number; // 0–1\n\tmodel?: string;\n\tfactors?: AiConfidenceFactor[];\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiConfidenceStrings>;\n}\n","import { Progress } from '../../../base/feedback';\n/**\n * AiConfidence — visualises an AI model's overall confidence with a circular\n * progress dial and a list of weighted contributing factors. Strings are overridable.\n */\nimport { Percent } from '../../../primitives';\nimport { DisplayLabel, Text } from '../../../typography';\nimport { Badge } from '../../../base/badge';\nimport { InlineStat } from '../../data-display';\nimport { Stack } from '../../../base/structure';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultAiConfidenceStrings, type AiConfidenceProps } from './types';\n\nfunction levelVariant(score: number) {\n\tif (score >= 0.85) return 'success' as const;\n\tif (score >= 0.6) return 'warning' as const;\n\treturn 'destructive' as const;\n}\n\nexport function AiConfidence({ score, model, factors, className, strings: stringsProp }: AiConfidenceProps) {\n\tconst strings = useStrings(defaultAiConfidenceStrings, stringsProp);\n\tconst pct = Math.round(score * 100);\n\tconst variant = levelVariant(score);\n\tconst label = variant === 'success' ? strings.levelHigh : variant === 'warning' ? strings.levelMedium : strings.levelLow;\n\tconst c = 2 * Math.PI * 24;\n\tconst dash = c - (pct / 100) * c;\n\n\treturn (\n\t\t<Stack\n\t\t\tdata-component=\"ai-confidence\"\n\t\t\tdata-slot=\"ai-confidence\"\n\t\t\tgap=\"xl\"\n\t\t\tclassName={cn('ai-confidence--component @container/ai-confidence', className)}\n\t\t\taria-label={strings.title}\n\t\t>\n\t\t\t<div className=\"grid gap-space-xl @md/ai-confidence:grid-cols-[auto_minmax(0,1fr)] @md/ai-confidence:items-center\">\n\t\t\t\t<div className=\"relative shrink-0\">\n\t\t\t\t\t<svg width=\"56\" height=\"56\" viewBox=\"0 0 64 64\" aria-hidden=\"true\">\n\t\t\t\t\t\t<circle cx=\"32\" cy=\"32\" r=\"24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"5\" className=\"text-muted/60\" />\n\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\tcx=\"32\"\n\t\t\t\t\t\t\tcy=\"32\"\n\t\t\t\t\t\t\tr=\"24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstrokeWidth=\"5\"\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeDasharray={c}\n\t\t\t\t\t\t\tstrokeDashoffset={dash}\n\t\t\t\t\t\t\ttransform=\"rotate(-90 32 32)\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\tvariant === 'success' && 'text-success',\n\t\t\t\t\t\t\t\tvariant === 'warning' && 'text-warning',\n\t\t\t\t\t\t\t\tvariant === 'destructive' && 'text-destructive',\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</svg>\n\t\t\t\t\t<div className=\"absolute inset-0 flex flex-col items-center justify-center\">\n\t\t\t\t\t\t<Percent value={pct} scaled weight=\"semibold\" className=\"leading-none\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<Stack gap=\"sm\">\n\t\t\t\t\t<DisplayLabel>\n\t\t\t\t\t\t{strings.confidenceLabel}\n\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"sm\">\n\t\t\t\t\t\t<Badge tone={variant}>{label}</Badge>\n\t\t\t\t\t\t{!!model && (\n\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"truncate\">\n\t\t\t\t\t\t\t\t{model}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t</Stack>\n\t\t\t</div>\n\n\t\t\t{!!factors && factors.length > 0 && (\n\t\t\t\t<Stack gap=\"md\" className=\"mt-space-xl\">\n\t\t\t\t\t<DisplayLabel>\n\t\t\t\t\t\t{strings.factorsLabel}\n\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t{factors.map((f) => (\n\t\t\t\t\t\t<Stack key={f.label} gap=\"sm\">\n\t\t\t\t\t\t\t<InlineStat\n\t\t\t\t\t\t\t\tlabel={f.label}\n\t\t\t\t\t\t\t\tvalue={<Percent value={f.score} size=\"xs\" weight=\"semibold\" />}\n\t\t\t\t\t\t\t\tmono\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Progress value={Math.round(f.score * 100)} aria-label={f.label} />\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t))}\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t</Stack>\n\t);\n}\n\nAiConfidence.displayName = 'AiConfidence';\n","import type { LucideIcon } from 'lucide-react';\nimport type { StringsProp } from '../../../../lib/strings';\n\nexport interface AiPromptSuggestion {\n\t/** Stable identity for this entry. */\n\tid: string;\n\t/** Display label. */\n\tlabel: string;\n\t/** Supporting copy shown under the label. */\n\tdescription?: string;\n\t/** Leading glyph. */\n\ticon?: LucideIcon;\n}\n\nexport interface AiPromptSuggestionsStrings {\n\t/** Surface title. */\n\ttitle: string;\n\thint: string;\n}\n\nexport const defaultAiPromptSuggestionsStrings: AiPromptSuggestionsStrings = {\n\ttitle: 'Try asking',\n\thint: 'Tap a prompt to start',\n};\n\nexport interface AiPromptSuggestionsProps {\n\tsuggestions: AiPromptSuggestion[];\n\tonPick?: (suggestion: AiPromptSuggestion) => void;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiPromptSuggestionsStrings>;\n}\n","/**\n * AiPromptSuggestions — grid of clickable prompt rows.\n * Use to seed a chat or assistant input with curated starting prompts.\n */\nimport { IconBadge } from '../../../base/display';\nimport { Stack } from '../../../base/structure';\nimport {\n\tItem,\n\tItemContent,\n\tItemDescription,\n\tItemMedia,\n\tItemTitle,\n} from '../../../base/item';\nimport { cn } from '../../../../lib/utils';\nimport { useStrings } from '../../../../lib/strings';\n\nimport {\n\tdefaultAiPromptSuggestionsStrings,\n\ttype AiPromptSuggestionsProps,\n} from './types';\n\nexport function AiPromptSuggestions({ suggestions, onPick, className, strings: stringsProp }: AiPromptSuggestionsProps) {\n\tconst strings = useStrings(defaultAiPromptSuggestionsStrings, stringsProp);\n\n\treturn (\n\t\t<Stack\n\t\t\tdata-component=\"ai-prompt-suggestions\"\n\t\t\tdata-slot=\"ai-prompt-suggestions\"\n\t\t\tclassName={cn('ai-prompt-suggestions--component', className)}\n\t\t>\n\t\t\t<Stack gap=\"normal\" className=\"ai-prompt-suggestions--intro\">\n\t\t\t\t<ItemTitle>{strings.title}</ItemTitle>\n\t\t\t\t<ItemDescription>{strings.hint}</ItemDescription>\n\t\t\t</Stack>\n\t\t\t<div className=\"grid grid-cols-[repeat(auto-fit,minmax(min(15rem,100%),1fr))] gap-space-xl\">\n\t\t\t\t{suggestions.map((s) => {\n\t\t\t\t\tconst Icon = s.icon;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Item\n\t\t\t\t\t\t\tkey={s.id}\n\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\trender={<button type=\"button\" onClick={() => onPick?.(s)} />}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'ai-prompt-suggestions--item h-full items-start gap-space-lg p-surface transition-[border-color,background] duration-150',\n\t\t\t\t\t\t\t\t'hover:border-foreground/20 hover:bg-muted/40',\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{!!Icon && (\n\t\t\t\t\t\t\t\t<ItemMedia>\n\t\t\t\t\t\t\t\t\t<IconBadge icon={Icon} tone=\"primary\" size=\"md\" shape=\"square\" />\n\t\t\t\t\t\t\t\t</ItemMedia>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<ItemContent className=\"min-w-0 gap-space-sm\">\n\t\t\t\t\t\t\t\t<ItemTitle>{s.label}</ItemTitle>\n\t\t\t\t\t\t\t\t{!!s.description && (\n\t\t\t\t\t\t\t\t\t<ItemDescription>{s.description}</ItemDescription>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</ItemContent>\n\t\t\t\t\t\t</Item>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</Stack>\n\t);\n}\n\nAiPromptSuggestions.displayName = 'AiPromptSuggestions';\n","import type { StringsProp } from '../../../../lib/strings';\n\nexport interface AiTokenUsageStrings {\n\t/** Surface title. */\n\ttitle: string;\n\tinput: string;\n\toutput: string;\n\t/** Total number of records across all pages. */\n\ttotal: string;\n\tcost: string;\n}\n\nexport const defaultAiTokenUsageStrings: AiTokenUsageStrings = {\n\ttitle: 'Token usage',\n\tinput: 'Input',\n\toutput: 'Output',\n\ttotal: 'Total',\n\tcost: 'Estimated cost',\n};\n\nexport interface AiTokenUsageProps {\n\tmodel?: string;\n\tinputTokens: number;\n\toutputTokens: number;\n\tcost?: string;\n\tmaxTokens?: number;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiTokenUsageStrings>;\n}\n","/**\n * AiTokenUsage — input + output token counts with a usage bar\n * relative to a max context window, plus optional cost estimate.\n */\nimport { useStrings } from '../../../../lib/strings';\nimport { Badge } from '../../../base/badge';\nimport { DisplayLabel, Text } from '../../../typography';\nimport { InlineStat } from '../../data-display';\nimport { AdaptiveGrid, Stack } from '../../../base/structure';\nimport { Number as NumberValue, Percent } from '../../../primitives';\n\nimport { defaultAiTokenUsageStrings, type AiTokenUsageProps } from './types';\n\nimport { cn } from '../../../../lib/utils';\nexport function AiTokenUsage({\n\tmodel,\n\tinputTokens,\n\toutputTokens,\n\tcost,\n\tmaxTokens,\n\tclassName,\n\tstrings: stringsProp,\n}: AiTokenUsageProps) {\n\tconst strings = useStrings(defaultAiTokenUsageStrings, stringsProp);\n\tconst total = inputTokens + outputTokens;\n\tconst pct = maxTokens ? Math.min(100, Math.round((total / maxTokens) * 100)) : 0;\n\n\treturn (\n\t\t<Stack\n\t\t\tdata-component=\"ai-token-usage\"\n\t\t\tdata-slot=\"ai-token-usage\"\n\t\t\tclassName={cn('ai-token-usage--component', className)}\n\t\t>\n\t\t\t{!!model && (\n\t\t\t\t<div className=\"ai-token-usage--metadata flex min-w-0 justify-start\">\n\t\t\t\t\t<Badge tone=\"secondary\">{model}</Badge>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<AdaptiveGrid minColumnWidth=\"sm\" gap=\"md\">\n\t\t\t\t{[\n\t\t\t\t\t{ label: strings.input, value: inputTokens },\n\t\t\t\t\t{ label: strings.output, value: outputTokens },\n\t\t\t\t\t{ label: strings.total, value: total },\n\t\t\t\t].map((cell) => (\n\t\t\t\t\t// `DisplayLabel` and `NumberValue` are both inline, and JSX drops\n\t\t\t\t\t// the newline between them, so bare siblings rendered as\n\t\t\t\t\t// \"Input3,240\". Stack them so the tile reads label-over-value.\n\t\t\t\t\t<div key={cell.label} className=\"rounded-radius-md bg-muted/40 p-surface-xs\">\n\t\t\t\t\t\t<Stack gap=\"2xs\">\n\t\t\t\t\t\t\t<DisplayLabel>{cell.label}</DisplayLabel>\n\t\t\t\t\t\t\t<NumberValue value={cell.value} weight=\"semibold\" align=\"left\" />\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</AdaptiveGrid>\n\t\t\t{!!maxTokens && (\n\t\t\t\t<div className=\"mt-space-lg\">\n\t\t\t\t\t<InlineStat\n\t\t\t\t\t\tlabel={(\n\t\t\t\t\t\t\t<span className=\"inline-flex items-center gap-space-xs\">\n\t\t\t\t\t\t\t\t<NumberValue value={total} size=\"xs\" align=\"left\" />\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" aria-hidden>/</Text>\n\t\t\t\t\t\t\t\t<NumberValue value={maxTokens} size=\"xs\" align=\"left\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tvalue={<Percent value={pct} scaled size=\"xs\" weight=\"semibold\" align=\"right\" />}\n\t\t\t\t\t\tmono\n\t\t\t\t\t\tvalueClassName=\"text-xs font-semibold\"\n\t\t\t\t\t/>\n\t\t\t\t\t<div className=\"mt-1 h-1.5 w-full overflow-hidden rounded-full bg-muted\">\n\t\t\t\t\t\t<div className=\"h-full rounded-full bg-primary\" style={{ width: `${pct}%` }} />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{!!cost && (\n\t\t\t\t<InlineStat\n\t\t\t\t\tclassName=\"mt-space-lg rounded-radius-md bg-primary/5 p-surface-xs\"\n\t\t\t\t\tlabel={<Text tag=\"span\" size=\"xs\" weight=\"medium\" lineHeight=\"tight\">{strings.cost}</Text>}\n\t\t\t\t\tvalue={cost}\n\t\t\t\t\tmono\n\t\t\t\t\tvalueClassName=\"text-sm font-bold\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t</Stack>\n\t);\n}\n\nAiTokenUsage.displayName = 'AiTokenUsage';\n","import type { StringsProp } from '../../../../lib/strings';\n\nexport type AiFeedbackVote = 'up' | 'down' | null;\n\nexport interface AiFeedbackStrings {\n\tprompt: string;\n\tthumbsUpAria: string;\n\tthumbsDownAria: string;\n\tcommentPlaceholder: string;\n\tsubmit: string;\n\tthanks: string;\n}\n\nexport const defaultAiFeedbackStrings: AiFeedbackStrings = {\n\tprompt: 'Was this helpful?',\n\tthumbsUpAria: 'Mark as helpful',\n\tthumbsDownAria: 'Mark as not helpful',\n\tcommentPlaceholder: 'Tell us more (optional)',\n\tsubmit: 'Send feedback',\n\tthanks: 'Thanks for your feedback.',\n};\n\nexport interface AiFeedbackProps {\n\t/** Current value. Controlled. */\n\tvalue?: AiFeedbackVote;\n\tonVote?: (vote: AiFeedbackVote) => void;\n\t/** Fired when a comment is submitted. */\n\tonSubmitComment?: (comment: string, vote: AiFeedbackVote) => void;\n\tallowComment?: boolean;\n\tsubmitted?: boolean;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiFeedbackStrings>;\n}\n","/**\n * AiFeedback — thumbs-up / thumbs-down voter with an optional follow-up\n * comment field. Wires into model-improvement loops: emits the vote via\n * `onVote` immediately and a comment via `onSubmitComment` when the user\n * submits the textarea. After `submitted=true` the surface is replaced with\n * a thank-you confirmation. Strings overridable for i18n.\n */\nimport { useState } from 'react';\nimport { ThumbsDown, ThumbsUp } from 'lucide-react';\nimport { Button } from '../../../base/buttons';\nimport { Textarea } from '../../../base/text-inputs';\nimport { Stack } from '../../../base/structure';\nimport { Text } from '../../../typography';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport {\n\tdefaultAiFeedbackStrings,\n\ttype AiFeedbackProps,\n\ttype AiFeedbackVote,\n} from './types';\n\nexport function AiFeedback({\n\tvalue,\n\tonVote,\n\tonSubmitComment,\n\tallowComment = true,\n\tsubmitted = false,\n\tclassName,\n\tstrings: stringsProp,\n}: AiFeedbackProps) {\n\tconst strings = useStrings(defaultAiFeedbackStrings, stringsProp);\n\tconst [internalVote, setInternalVote] = useState<AiFeedbackVote>(null);\n\tconst [comment, setComment] = useState('');\n\tconst vote = value ?? internalVote;\n\n\tconst cast = (next: AiFeedbackVote) => {\n\t\tconst resolved = vote === next ? null : next;\n\t\tif (value === undefined) setInternalVote(resolved);\n\t\tonVote?.(resolved);\n\t};\n\n\tif (submitted) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn('ai-feedback--component', \n\t\t\t\t\t'inline-flex items-center gap-space-md rounded-full bg-success/10 px-space-lg py-space-sm',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<ThumbsUp className=\"size-icon-md text-success\" />\n\t\t\t\t<Text size=\"xs\" type=\"success\" weight=\"medium\">\n\t\t\t\t\t{strings.thanks}\n\t\t\t\t</Text>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={cn('ai-feedback--component inline-flex flex-col gap-space-md', className)}>\n\t\t\t<div className=\"flex items-center gap-space-md\">\n\t\t\t\t<Text size=\"xs\" type=\"secondary\">{strings.prompt}</Text>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\tbuttonStyle={vote === 'up' ? 'solid' : 'ghost'}\n\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\taria-label={strings.thumbsUpAria}\n\t\t\t\t\taria-pressed={vote === 'up'}\n\t\t\t\t\tonClick={() => cast('up')}\n\t\t\t\t\tclassName={cn(vote === 'up' && 'text-success bg-success/15 hover:bg-success/20')}\n\t\t\t\t>\n\t\t\t\t\t<ThumbsUp className=\"size-icon-md\" />\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\tbuttonStyle={vote === 'down' ? 'solid' : 'ghost'}\n\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\taria-label={strings.thumbsDownAria}\n\t\t\t\t\taria-pressed={vote === 'down'}\n\t\t\t\t\tonClick={() => cast('down')}\n\t\t\t\t\tclassName={cn(vote === 'down' && 'text-destructive bg-destructive/15 hover:bg-destructive/20')}\n\t\t\t\t>\n\t\t\t\t\t<ThumbsDown className=\"size-icon-md\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\n\t\t\t{!!allowComment && !!vote && (\n\t\t\t\t<Stack gap=\"md\">\n\t\t\t\t\t<Textarea\n\t\t\t\t\t\tvalue={comment}\n\t\t\t\t\t\tonChange={(e) => setComment((e.target as HTMLTextAreaElement).value)}\n\t\t\t\t\t\tplaceholder={strings.commentPlaceholder}\n\t\t\t\t\t\tminRows={2}\n\t\t\t\t\t/>\n\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"none\" justify=\"end\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tonSubmitComment?.(comment, vote);\n\t\t\t\t\t\t\t\tsetComment('');\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tdisabled={!comment.trim()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{strings.submit}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</Stack>\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nAiFeedback.displayName = 'AiFeedback';\n","import type { ReactNode } from 'react';\nimport type { StringsProp } from '../../../../lib/strings';\n\nexport interface AiCitationSource {\n\t/** Stable identity for this entry. */\n\tid: string;\n\t/** Surface title. */\n\ttitle: ReactNode;\n\turl?: string;\n\tsnippet?: ReactNode;\n\tpublisher?: string;\n\tpublishedAt?: string;\n\trelevance?: number; // 0–1\n}\n\nexport interface AiCitationStrings {\n\t/** Surface title. */\n\ttitle: string;\n\tsourceCount: (n: number) => string;\n\thiddenCount: (n: number) => string;\n\texpand: string;\n\tcollapse: string;\n\tvisit: string;\n\trelevance: string;\n}\n\nexport const defaultAiCitationStrings: AiCitationStrings = {\n\ttitle: 'Sources',\n\tsourceCount: (n: number) => (n === 1 ? '1 source' : `${n} sources`),\n\thiddenCount: (n: number) => (n === 1 ? '+1 more' : `+${n} more`),\n\texpand: 'Show sources',\n\tcollapse: 'Hide sources',\n\tvisit: 'Visit',\n\trelevance: 'Relevance',\n};\n\nexport interface AiCitationProps {\n\tsources: AiCitationSource[];\n\t/** Expanded state, for controlled use. */\n\texpanded?: boolean;\n\t/** Initial expanded state, for uncontrolled use. */\n\tdefaultExpanded?: boolean;\n\t/** Fired whenever the disclosure state changes. */\n\tonExpandedChange?: (expanded: boolean) => void;\n\tmaxCollapsedRows?: number;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiCitationStrings>;\n}\n","/**\n * AiCitation — expandable source list for AI-grounded responses. Renders an\n * inline footnote-style header (e.g. \"3 sources\") that toggles a list of\n * source rows: title link, snippet, publisher / date, and a relevance bar.\n * Use under `AiSummaryBlock` and `AiMessageBubble` to make AI claims\n * traceable. Strings overridable for i18n.\n *\n * Note: `strings.sourceCount` is a function (single / plural form) — pass an\n * override if your locale needs more complex pluralisation.\n */\nimport { useState } from 'react';\nimport { ChevronDown, ChevronRight, ExternalLink, Quote } from 'lucide-react';\nimport { Button } from '../../../base/buttons';\nimport { Stack } from '../../../base/structure';\nimport { Number as NumberValue, Percent, SecondaryValue } from '../../../primitives';\nimport { Text } from '../../../typography';\nimport {\n\tItem,\n\tItemActions,\n\tItemContent,\n\tItemDescription,\n\tItemFooter,\n\tItemGroup,\n\tItemMedia,\n\tItemTitle,\n} from '../../../base/item';\nimport { mergeStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultAiCitationStrings, type AiCitationProps, type AiCitationSource } from './types';\n\nexport function AiCitation({\n\tsources,\n\texpanded: expandedProp,\n\tdefaultExpanded = false,\n\tonExpandedChange,\n\tmaxCollapsedRows = 0,\n\tclassName,\n\tstrings: stringsProp,\n}: AiCitationProps) {\n\t// `sourceCount` is a function so we cannot use `useStrings` deep-merge\n\t// (the merger replaces functions wholesale, which is what we want).\n\tconst strings = mergeStrings(defaultAiCitationStrings, stringsProp);\n\tconst [internalExpanded, setInternalExpanded] = useState(defaultExpanded);\n\tconst expanded = expandedProp ?? internalExpanded;\n\tconst setExpanded = (next: boolean) => {\n\t\tif (expandedProp === undefined) setInternalExpanded(next);\n\t\tonExpandedChange?.(next);\n\t};\n\tconst visible = expanded ? sources : sources.slice(0, Math.max(0, maxCollapsedRows));\n\tconst hidden = sources.length - visible.length;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'ai-citation--component',\n\t\t\t\t'rounded-radius border border-border bg-card px-surface-xs py-surface-xs shadow-xs',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Stack gap=\"lg\">\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tonClick={() => setExpanded(!expanded)}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'ai-citation--trigger h-auto justify-start gap-space-sm rounded-radius-md px-control py-row-y',\n\t\t\t\t\t\t'text-muted-foreground hover:text-foreground hover:bg-muted/40',\n\t\t\t\t\t)}\n\t\t\t\t\taria-expanded={expanded}\n\t\t\t\t\taria-label={expanded ? strings.collapse : strings.expand}\n\t\t\t\t>\n\t\t\t\t\t<Quote className=\"size-icon-md\" />\n\t\t\t\t\t<Text weight=\"medium\">\n\t\t\t\t\t\t{strings.title} · {strings.sourceCount(sources.length)}\n\t\t\t\t\t</Text>\n\t\t\t\t\t{expanded ? <ChevronDown className=\"size-icon-md\" /> : <ChevronRight className=\"size-icon-md\" />}\n\t\t\t\t</Button>\n\n\t\t\t\t{(expanded || maxCollapsedRows > 0) && (\n\t\t\t\t\t<ItemGroup>\n\t\t\t\t\t\t{visible.map((s, i) => (\n\t\t\t\t\t\t\t<CitationRow key={s.id} source={s} index={i + 1} strings={strings} />\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t{!expanded && hidden > 0 && (\n\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t\t{strings.hiddenCount(hidden)}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</ItemGroup>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</div>\n\t);\n}\n\nAiCitation.displayName = 'AiCitation';\n\nfunction CitationRow({\n\tsource,\n\tindex,\n\tstrings,\n}: {\n\tsource: AiCitationSource;\n\tindex: number;\n\tstrings: ReturnType<typeof mergeStrings<typeof defaultAiCitationStrings>>;\n}) {\n\tconst relevancePct =\n\t\ttypeof source.relevance === 'number' ? Math.round(Math.max(0, Math.min(1, source.relevance)) * 100) : null;\n\n\tconst TitleEl = source.url ? 'a' : 'span';\n\tconst titleProps = source.url\n\t\t? {\n\t\t\t\thref: source.url,\n\t\t\t\ttarget: '_blank' as const,\n\t\t\t\trel: 'noopener noreferrer',\n\t\t\t}\n\t\t: {};\n\n\treturn (\n\t\t<Item variant=\"outline\" size=\"sm\" className=\"items-start px-surface-xs py-surface-xs\">\n\t\t\t<ItemMedia>\n\t\t\t\t<NumberValue\n\t\t\t\t\tvalue={index}\n\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\tweight=\"semibold\"\n\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\talign=\"center\"\n\t\t\t\t\tclassName=\"inline-flex size-icon-lg shrink-0 items-center justify-center rounded-full bg-muted\"\n\t\t\t\t/>\n\t\t\t</ItemMedia>\n\t\t\t<ItemContent>\n\t\t\t\t<ItemTitle className=\"truncate\">\n\t\t\t\t\t<TitleEl\n\t\t\t\t\t\t{...titleProps}\n\t\t\t\t\t\tclassName={cn('truncate', source.url && 'hover:text-primary-accent hover:underline')}\n\t\t\t\t\t>\n\t\t\t\t\t\t{source.title}\n\t\t\t\t\t\t{!!source.url && <ExternalLink className=\"ml-1 inline size-icon-sm align-baseline\" />}\n\t\t\t\t\t</TitleEl>\n\t\t\t\t</ItemTitle>\n\t\t\t\t{!!source.snippet && <ItemDescription clamp={2}>{source.snippet}</ItemDescription>}\n\t\t\t\t{(source.publisher || source.publishedAt) && (\n\t\t\t\t\t<ItemFooter className=\"mt-1 justify-start gap-space-sm\">\n\t\t\t\t\t\t{!!source.publisher && (\n\t\t\t\t\t\t\t<Text size=\"xs\" type=\"discrete\">\n\t\t\t\t\t\t\t\t{source.publisher}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!!source.publisher && !!source.publishedAt && (\n\t\t\t\t\t\t\t<Text size=\"xs\" type=\"discrete\">\n\t\t\t\t\t\t\t\t·\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!!source.publishedAt && (\n\t\t\t\t\t\t\t<SecondaryValue size=\"xs\" className=\"tabular-nums opacity-80\">\n\t\t\t\t\t\t\t\t{source.publishedAt}\n\t\t\t\t\t\t\t</SecondaryValue>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</ItemFooter>\n\t\t\t\t)}\n\t\t\t</ItemContent>\n\t\t\t{relevancePct !== null && (\n\t\t\t\t<ItemActions className=\"w-16 flex-col items-end gap-space-2xs\">\n\t\t\t\t\t<Percent value={relevancePct} scaled size=\"xs\" type=\"secondary\" weight=\"medium\" />\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"h-1 w-full overflow-hidden rounded-full bg-muted\"\n\t\t\t\t\t\trole=\"progressbar\"\n\t\t\t\t\t\taria-label={strings.relevance}\n\t\t\t\t\t\taria-valuemin={0}\n\t\t\t\t\t\taria-valuemax={100}\n\t\t\t\t\t\taria-valuenow={relevancePct}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"h-full rounded-full bg-primary\" style={{ width: `${relevancePct}%` }} />\n\t\t\t\t\t</div>\n\t\t\t\t</ItemActions>\n\t\t\t)}\n\t\t</Item>\n\t);\n}\n","import type { StringsProp } from '../../../../lib/strings';\n\nexport interface AiInlineCitationStrings {\n\t/** Tooltip prefix when only a number is rendered. */\n\tsourcePrefix: string;\n\t/** Aria label template — supports `{{n}}` and `{{title}}` placeholders. */\n\topenAria: string;\n}\n\nexport const defaultAiInlineCitationStrings: AiInlineCitationStrings = {\n\tsourcePrefix: 'Source',\n\topenAria: 'Open source {{n}}: {{title}}',\n};\n\nexport interface AiInlineCitationProps {\n\t/** 1-indexed citation number rendered inside the pill. */\n\tindex: number;\n\t/** Title of the cited source — used in the tooltip / aria-label. */\n\ttitle?: string;\n\t/** Optional URL — when provided, the pill renders as a link. */\n\turl?: string;\n\t/** Click handler — preferred over `url` for SPA / virtual link routing. */\n\tonSelect?: () => void;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiInlineCitationStrings>;\n}\n","/**\n * AiInlineCitation — small footnote-style pill rendered inline inside AI\n * response prose. The number references a position in the parent\n * sources/AiCitation list. Hover to see the source title; click to jump.\n */\nimport { Text, TextLink } from '../../../typography';\nimport { Button } from '../../../base/buttons';\nimport { mergeStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport {\n\tdefaultAiInlineCitationStrings,\n\ttype AiInlineCitationProps,\n} from './types';\n\nfunction interpolate(template: string, params: Record<string, string | number>): string {\n\treturn template.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (m, k) => {\n\t\tconst v = params[k];\n\t\treturn v === undefined ? m : String(v);\n\t});\n}\n\nexport function AiInlineCitation({\n\tindex,\n\ttitle,\n\turl,\n\tonSelect,\n\tclassName,\n\tstrings: stringsProp,\n}: AiInlineCitationProps) {\n\tconst strings = mergeStrings(defaultAiInlineCitationStrings, stringsProp);\n\tconst ariaLabel = interpolate(strings.openAria, {\n\t\tn: index,\n\t\ttitle: title ?? '',\n\t});\n\tconst tooltip = title ? `${strings.sourcePrefix} ${index}: ${title}` : `${strings.sourcePrefix} ${index}`;\n\n\t// The Text child owns the compact numeric citation role.\n\t// The active variant restates the resting `-translate-y-px` on the same line,\n\t// the way the carousel controls restate their centring: the shared button\n\t// base ships `active:…:translate-y-px`, and cancelling to 0 instead would\n\t// drop this marker off its optical baseline for the duration of a press.\n\tconst baseCls = cn(\n\t\t'inline-flex h-5 min-w-5 -translate-y-px active:not-aria-[haspopup]:-translate-y-px items-center justify-center rounded px-space-xs',\n\t\t'align-middle tabular-nums',\n\t\t'bg-muted text-muted-foreground',\n\t\t'hover:bg-primary/10 hover:text-primary-accent',\n\t\t'transition-colors duration-150',\n\t\t'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40',\n\t\tclassName,\n\t);\n\n\tif (url) {\n\t\treturn (\n\t\t\t<TextLink\n\t\t\t\thref={url}\n\t\t\t\tsize=\"inherit\"\n\t\t\t\tunderline={false}\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\ttitle={tooltip}\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\tclassName={cn('ai-inline-citation--component', baseCls)}\n\t\t\t>\n\t\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" className=\"leading-none\">\n\t\t\t\t\t{index}\n\t\t\t\t</Text>\n\t\t\t</TextLink>\n\t\t);\n\t}\n\n\tif (onSelect) {\n\t\treturn (\n\t\t\t<Button\n\t\t\t\ttype=\"button\"\n\t\t\t\ttone=\"secondary\"\n\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\tsize=\"sm\"\n\t\t\t\tonClick={onSelect}\n\t\t\t\ttitle={tooltip}\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\tclassName={cn('ai-inline-citation--component', baseCls)}\n\t\t\t>\n\t\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" className=\"leading-none\">\n\t\t\t\t\t{index}\n\t\t\t\t</Text>\n\t\t\t</Button>\n\t\t);\n\t}\n\n\treturn (\n\t\t<span\n\t\t\ttitle={tooltip}\n\t\t\taria-label={ariaLabel}\n\t\t\tclassName={cn('ai-inline-citation--component', baseCls)}\n\t\t>\n\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" className=\"leading-none\">\n\t\t\t\t{index}\n\t\t\t</Text>\n\t\t</span>\n\t);\n}\n\nAiInlineCitation.displayName = 'AiInlineCitation';\n","import type { ReactNode } from 'react';\nimport type { StringsProp } from '../../../../lib/strings';\n\nexport interface AiPackageInfoStrings {\n\tversionLabel: string;\n\tlicenseLabel: string;\n\tpublishedLabel: string;\n\thomepageAria: string;\n\thomepageLabel: string;\n\trepositoryAria: string;\n\trepositoryLabel: string;\n\tweeklyDownloadsLabel: string;\n}\n\nexport const defaultAiPackageInfoStrings: AiPackageInfoStrings = {\n\tversionLabel: 'Version',\n\tlicenseLabel: 'License',\n\tpublishedLabel: 'Published',\n\thomepageAria: 'Open homepage',\n\thomepageLabel: 'Homepage',\n\trepositoryAria: 'Open repository',\n\trepositoryLabel: 'Repository',\n\tweeklyDownloadsLabel: 'Weekly downloads',\n};\n\nexport interface AiPackageInfoProps {\n\t/** Package name (npm-style: optional `@scope/`). */\n\tname: string;\n\t/** Latest / pinned version. */\n\tversion?: string;\n\t/** Short description from the package manifest. */\n\tdescription?: ReactNode;\n\t/** SPDX-style license identifier (e.g. \"MIT\"). */\n\tlicense?: string;\n\t/** ISO date or human label of last publish. */\n\tpublishedAt?: string;\n\t/** Package homepage URL. */\n\thomepage?: string;\n\t/** Repository URL (typically GitHub). */\n\trepository?: string;\n\t/** Weekly downloads — formatted by the consumer. */\n\tweeklyDownloads?: string | number;\n\t/** Comma-separated tag list rendered as small chips. */\n\tkeywords?: ReadonlyArray<string>;\n\t/** Click handler for the whole card. */\n\tonSelect?: () => void;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiPackageInfoStrings>;\n}\n","/**\n * AiPackageInfo — compact card describing an npm / library package referenced\n * by the model. Header: name + version chip; body: description + optional\n * meta (license, published date, weekly downloads) and keyword chips. Footer\n * exposes homepage / repository links when provided.\n */\nimport { Code2, ExternalLink, Globe, Package } from 'lucide-react';\nimport { Badge } from '../../../base/badge';\nimport { Button } from '../../../base/buttons';\nimport { MonoValue, SecondaryValue } from '../../../primitives';\nimport { Text, TextLink } from '../../../typography';\nimport { useStrings } from '../../../../lib/strings';\nimport { Stack } from '../../../base/structure';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultAiPackageInfoStrings, type AiPackageInfoProps } from './types';\n\nexport function AiPackageInfo({\n\tname,\n\tversion,\n\tdescription,\n\tlicense,\n\tpublishedAt,\n\thomepage,\n\trepository,\n\tweeklyDownloads,\n\tkeywords,\n\tonSelect,\n\tclassName,\n\tstrings: stringsProp,\n}: AiPackageInfoProps) {\n\tconst strings = useStrings(defaultAiPackageInfoStrings, stringsProp);\n\tconst bodyContent = (\n\t\t<>\n\t\t\t<span\n\t\t\t\taria-hidden\n\t\t\t\tclassName=\"inline-flex size-9 shrink-0 items-center justify-center rounded-radius-md bg-muted text-muted-foreground\"\n\t\t\t>\n\t\t\t\t<Package className=\"size-icon\" />\n\t\t\t</span>\n\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t<div className=\"flex items-center gap-space-md\">\n\t\t\t\t\t<MonoValue weight=\"semibold\" className=\"truncate\">\n\t\t\t\t\t\t{name}\n\t\t\t\t\t</MonoValue>\n\t\t\t\t\t{!!version && (\n\t\t\t\t\t\t<Badge tone=\"secondary\">\n\t\t\t\t\t\t\t<MonoValue size=\"xs\" className=\"text-inherit\">v{version.replace(/^v/, '')}</MonoValue>\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t{!!description && (\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"mt-1 line-clamp-2\">\n\t\t\t\t\t\t{description}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\n\t\t\t\t{(license || publishedAt || weeklyDownloads !== undefined) && (\n\t\t\t\t\t<div className=\"mt-space-md flex flex-wrap items-center gap-x-space-lg gap-y-space-xs\">\n\t\t\t\t\t\t{!!license && <MetaItem label={strings.licenseLabel} value={license} />}\n\t\t\t\t\t\t{!!publishedAt && <MetaItem label={strings.publishedLabel} value={publishedAt} />}\n\t\t\t\t\t\t{weeklyDownloads !== undefined && (\n\t\t\t\t\t\t\t<MetaItem label={strings.weeklyDownloadsLabel} value={String(weeklyDownloads)} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{!!keywords?.length && (\n\t\t\t\t\t<div className=\"mt-space-md flex flex-wrap gap-space-xs\">\n\t\t\t\t\t\t{keywords.slice(0, 6).map((keyword) => (\n\t\t\t\t\t\t\t<Badge key={keyword} tone=\"secondary\">\n\t\t\t\t\t\t\t\t{keyword}\n\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n\tconst bodyClassName = 'ai-package-info--body flex w-full items-start gap-space-lg p-surface-xs text-left';\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'ai-package-info--component block w-full overflow-hidden rounded-radius border border-border/60 bg-card',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{onSelect ? (\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\tonClick={onSelect}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tbodyClassName,\n\t\t\t\t\t\t'h-auto justify-start rounded-none whitespace-normal transition-colors hover:bg-muted/40',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{bodyContent}\n\t\t\t\t</Button>\n\t\t\t) : (\n\t\t\t\t<div className={bodyClassName}>{bodyContent}</div>\n\t\t\t)}\n\n\t\t\t{(homepage || repository) && (\n\t\t\t\t<div className=\"ai-package-info--footer border-t border-border/60 bg-muted/20 px-surface-xs py-row-y\">\n\t\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"md\">\n\t\t\t\t\t\t{!!homepage && (\n\t\t\t\t\t\t\t<TextLink\n\t\t\t\t\t\t\t\thref={homepage}\n\t\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\t\tunderline={false}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t\t\t\t\t\taria-label={strings.homepageAria}\n\t\t\t\t\t\t\t\tclassName=\"inline-flex items-center gap-space-xs rounded text-muted-foreground hover:text-foreground\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Globe className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t\t<Text tag=\"span\" weight=\"medium\">\n\t\t\t\t\t\t\t\t\t{strings.homepageLabel}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t<ExternalLink className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t</TextLink>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!!homepage && !!repository && (\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"opacity-40\" aria-hidden>\n\t\t\t\t\t\t\t\t·\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!!repository && (\n\t\t\t\t\t\t\t<TextLink\n\t\t\t\t\t\t\t\thref={repository}\n\t\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\t\tunderline={false}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t\t\t\t\t\taria-label={strings.repositoryAria}\n\t\t\t\t\t\t\t\tclassName=\"inline-flex items-center gap-space-xs rounded text-muted-foreground hover:text-foreground\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Code2 className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t\t<Text tag=\"span\" weight=\"medium\">\n\t\t\t\t\t\t\t\t\t{strings.repositoryLabel}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t<ExternalLink className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t</TextLink>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nAiPackageInfo.displayName = 'AiPackageInfo';\n\nfunction MetaItem({ label, value }: { label: string; value: string }) {\n\treturn (\n\t\t<div className=\"inline-flex items-baseline gap-space-xs\">\n\t\t\t<Text size=\"xs\" type=\"discrete\">\n\t\t\t\t{label}\n\t\t\t</Text>\n\t\t\t<SecondaryValue size=\"xs\" weight=\"medium\" className=\"tabular-nums\">\n\t\t\t\t{value}\n\t\t\t</SecondaryValue>\n\t\t</div>\n\t);\n}\n","import type { LucideIcon } from 'lucide-react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport type { RowDensity } from '../../../../lib/row-recipes';\nimport type { StringsProp } from '../../../../lib/strings';\n\nexport type AiFileTreeNodeKind = 'directory' | 'file';\n\nexport type AiFileTreeChangeStatus = 'added' | 'modified' | 'removed' | 'renamed';\n\nexport interface AiFileTreeNode {\n\t/** Stable identity, unique throughout the hierarchy. */\n\tid: string;\n\t/** Display name. */\n\tname: string;\n\tkind: AiFileTreeNodeKind;\n\t/** Children — only meaningful for directories. */\n\tchildren?: ReadonlyArray<AiFileTreeNode>;\n\t/** Custom icon override (file kinds, etc.). */\n\ticon?: LucideIcon;\n\t/** Diff status — drives the semantic icon color and trailing Badge. */\n\tstatus?: AiFileTreeChangeStatus;\n\t/** Trailing slot — badge, line count, etc. */\n\ttrailing?: ReactNode;\n\t/** Default-expanded state for directories. */\n\tdefaultExpanded?: boolean;\n /** Disables this entry and all descendants. */\n disabled?: boolean;\n}\n\nexport interface AiFileTreeStrings {\n /** Accessible hierarchy name; aria-label/aria-labelledby can override it. */\n treeAria?: string;\n\texpandAria: string;\n\tcollapseAria: string;\n\tstatusLabels: Record<AiFileTreeChangeStatus, string>;\n}\n\nexport const defaultAiFileTreeStrings: AiFileTreeStrings = {\n treeAria: 'Files',\n\texpandAria: 'Expand directory',\n\tcollapseAria: 'Collapse directory',\n\tstatusLabels: {\n\t\tadded: 'A',\n\t\tmodified: 'M',\n\t\tremoved: 'D',\n\t\trenamed: 'R',\n\t},\n};\n\nexport interface AiFileTreeProps extends Omit<ComponentProps<'div'>, 'children' | 'onSelect'> {\n\t/** Root nodes — typically one entry but the API accepts multiple. */\n\tnodes: ReadonlyArray<AiFileTreeNode>;\n\t/** Selected file id — drives the active row state. Controlled. */\n\tselectedId?: string;\n\t/** Click handler — fires for files only by default. */\n\tonSelect?: (node: AiFileTreeNode) => void;\n\t/** Hide diff status badges; semantic icon colors remain visible. */\n\thideStatusLabels?: boolean;\n\t/** Indent width per nesting level (px). Omit for the shared token-backed hierarchy inset. */\n\tindent?: number;\n /** Vertical rhythm; compact by default. */\n density?: RowDensity;\n /** Disables the entire hierarchy. */\n disabled?: boolean;\n /** Controlled directory expansion. */\n expandedIds?: readonly string[];\n /** Initial expansion; otherwise each directory's defaultExpanded is respected. */\n defaultExpandedIds?: readonly string[];\n /** Expansion request, independent of file selection. */\n onExpandedIdsChange?: (ids: string[], node: AiFileTreeNode) => void;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiFileTreeStrings>;\n}\n","/** File-change presentation on the public keyboard hierarchy; framing belongs to the caller. */\nimport { useMemo, useState } from 'react';\nimport { File, FileCode, FileText, Folder, FolderOpen, type LucideIcon } from 'lucide-react';\nimport { Tree, type TreeNode } from '../../../base/tree';\nimport { Badge } from '../../../base/badge';\nimport { Stack } from '../../../base/structure';\nimport { MonoValue, SecondaryValue } from '../../../primitives';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\nimport { defaultAiFileTreeStrings, type AiFileTreeChangeStatus, type AiFileTreeNode, type AiFileTreeProps } from './types';\n\nconst statusTones = { added: 'success', modified: 'warning', removed: 'destructive', renamed: 'info' } as const;\nconst statusIconClasses: Record<AiFileTreeChangeStatus, string> = {\n added: 'text-success', modified: 'text-warning-accent', removed: 'text-destructive', renamed: 'text-info',\n};\nfunction pickFileIcon(name: string): LucideIcon {\n const ext = name.split('.').pop()?.toLowerCase() ?? '';\n if (['ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'json', 'css', 'scss', 'html', 'sh', 'py', 'rs', 'go'].includes(ext)) return FileCode;\n if (['md', 'mdx', 'txt'].includes(ext)) return FileText;\n return File;\n}\nfunction initialExpansion(nodes: readonly AiFileTreeNode[], depth = 0): string[] {\n return nodes.flatMap(node => [\n ...(node.kind === 'directory' && (node.defaultExpanded ?? depth < 1) ? [node.id] : []),\n ...initialExpansion(node.children ?? [], depth + 1),\n ]);\n}\nexport function AiFileTree({\n nodes, selectedId, onSelect, hideStatusLabels = false, indent, density = 'compact', disabled,\n expandedIds, defaultExpandedIds, onExpandedIdsChange, className, strings: stringsProp, ...props\n}: AiFileTreeProps) {\n const strings = useStrings(defaultAiFileTreeStrings, stringsProp);\n const [localExpanded, setLocalExpanded] = useState(() => defaultExpandedIds ?? initialExpansion(nodes));\n const expanded = expandedIds ?? localExpanded;\n const items = useMemo(() => {\n function map(nodes: readonly AiFileTreeNode[]): TreeNode<AiFileTreeNode>[] {\n return nodes.map(node => {\n const directory = node.kind === 'directory';\n const Icon = node.icon ?? (directory ? expanded.includes(node.id) ? FolderOpen : Folder : pickFileIcon(node.name));\n return {\n value: node.id, label: node.name, data: node, disabled: node.disabled,\n hasChildren: directory, children: directory ? map(node.children ?? []) : undefined,\n icon: <Icon aria-hidden=\"true\" className={cn('size-icon', node.status && statusIconClasses[node.status])} />,\n trailing: <Stack direction=\"horizontal\" gap=\"xs\" align=\"center\" className=\"shrink-0\">\n {node.status && !hideStatusLabels && <Badge tone={statusTones[node.status]} size=\"sm\" title={node.status}>{strings.statusLabels[node.status]}</Badge>}\n {node.trailing != null && <SecondaryValue size=\"xs\" className=\"tabular-nums\">{node.trailing}</SecondaryValue>}\n </Stack>,\n };\n });\n }\n return map(nodes);\n }, [nodes, expanded, hideStatusLabels, strings.statusLabels]);\n return <Tree {...props} aria-label={props['aria-label'] ?? strings.treeAria} items={items} selectedValues={selectedId === undefined ? [] : [selectedId]}\n expandedValues={expanded} branchActivation=\"toggle\" density={density} disabled={disabled} indent={indent}\n strings={{ expand: label => `${strings.expandAria}: ${label}`, collapse: label => `${strings.collapseAria}: ${label}` }}\n onExpandedValuesChange={(values, node) => {\n if (expandedIds === undefined) setLocalExpanded(values);\n onExpandedIdsChange?.(values, node.data!);\n }}\n onSelectedValuesChange={(_values, node) => { if (node.data?.kind === 'file') onSelect?.(node.data); }}\n renderLabel={node => <MonoValue size=\"inherit\" weight=\"regular\" className={cn('ai-file-tree--name text-inherit wrap-anywhere', node.data?.status === 'removed' && 'line-through')}>{node.label}</MonoValue>}\n className={cn('ai-file-tree--component', className)} />;\n}\nAiFileTree.displayName = 'AiFileTree';\n"],"mappings":"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"}
1
+ {"version":3,"file":"ai.js","names":["_Fragment","NumberValue","NumberValue","_Fragment","cn","Text","DisplayLabel","TextLink","Button","AdaptiveGrid","Stack","Progress","SecondaryValue","MonoValue","Percent","Number","IconBadge","Badge","Separator","Textarea","ItemFooter","ItemMedia","ItemDescription","ItemActions","ItemGroup","ItemContent","Item","ItemTitle","InlineStat","defaultAiMessageBubbleStrings","AiMessageBubble","AiCodeBlock","AiChainOfThought","AiToolCall","defaultAiReasoningStrings","AiConfirmation","defaultAiConfirmationStrings","defaultAiAttachmentStrings","AiAttachment","defaultAiTaskStrings","AiSources","defaultAiAgentStrings","defaultAiArtifactStrings","defaultAiChainOfThoughtStrings","AiAgent","AiTask","AiReasoning","AiArtifact","defaultAiSourcesStrings","defaultAiCodeBlockStrings","defaultAiToolCallStrings","AiShimmer","Tree","Fragment$1","defaultAiSummaryStrings","defaultAiClassificationStrings","confidenceBars","ConfidenceBars","filled","level","i","label","AiSummaryBlock","stringsProp","strings","useStrings","defaultMetadata","data","defaultActions","RefreshCw","resolvedMetadata","metadata","resolvedActions","actions","footerContent","footer","className","entity","children","AiClassificationPanel","confidenceLabel","flag","defaultAiConfidenceStrings","levelVariant","score","AiConfidence","pct","variant","c","dash","model","factors","f","defaultAiPromptSuggestionsStrings","AiPromptSuggestions","suggestions","Icon","s","onPick","defaultAiTokenUsageStrings","AiTokenUsage","total","inputTokens","outputTokens","maxTokens","cell","cost","defaultAiFeedbackStrings","AiFeedback","internalVote","setInternalVote","useState","comment","setComment","vote","value","cast","resolved","next","onVote","submitted","ThumbsUp","ThumbsDown","allowComment","onSubmitComment","defaultAiCitationStrings","n","AiCitation","expandedProp","mergeStrings","internalExpanded","setInternalExpanded","defaultExpanded","expanded","setExpanded","onExpandedChange","visible","sources","maxCollapsedRows","hidden","Quote","jsx","ChevronDown","ChevronRight","CitationRow","relevancePct","source","TitleEl","titleProps","index","ExternalLink","defaultAiInlineCitationStrings","interpolate","template","v","params","k","m","AiInlineCitation","ariaLabel","title","tooltip","baseCls","url","onSelect","defaultAiPackageInfoStrings","AiPackageInfo","bodyContent","Package","name","version","description","license","publishedAt","weeklyDownloads","MetaItem","keywords","keyword","bodyClassName","homepage","repository","Globe","Code2","defaultAiFileTreeStrings","statusTones","statusIconClasses","pickFileIcon","ext","FileCode","FileText","File","initialExpansion","nodes","node","depth","AiFileTree","props","localExpanded","setLocalExpanded","defaultExpandedIds","expandedIds","items","useMemo","map","directory","FolderOpen","Folder","hideStatusLabels","selectedId","values","onExpandedIdsChange"],"sources":["../../src/components/blocks/ai/ai.strings.ts","../../src/components/blocks/ai/ai-summary/ai-summary.tsx","../../src/components/blocks/ai/ai-classification/ai-classification.tsx","../../src/components/blocks/ai/ai-confidence/types.ts","../../src/components/blocks/ai/ai-confidence/ai-confidence.tsx","../../src/components/blocks/ai/ai-prompt-suggestions/types.ts","../../src/components/blocks/ai/ai-prompt-suggestions/ai-prompt-suggestions.tsx","../../src/components/blocks/ai/ai-token-usage/types.ts","../../src/components/blocks/ai/ai-token-usage/ai-token-usage.tsx","../../src/components/blocks/ai/ai-feedback/types.ts","../../src/components/blocks/ai/ai-feedback/ai-feedback.tsx","../../src/components/blocks/ai/ai-citation/types.ts","../../src/components/blocks/ai/ai-citation/ai-citation.tsx","../../src/components/blocks/ai/ai-inline-citation/types.ts","../../src/components/blocks/ai/ai-inline-citation/ai-inline-citation.tsx","../../src/components/blocks/ai/ai-package-info/types.ts","../../src/components/blocks/ai/ai-package-info/ai-package-info.tsx","../../src/components/blocks/ai/ai-file-tree/types.ts","../../src/components/blocks/ai/ai-file-tree/ai-file-tree.tsx"],"sourcesContent":["/**\n * Shared default strings for `blocks/ai` components.\n *\n * Each component accepts a `strings` prop deep-merged over the default subset\n * it reads. Consumers wire backend i18n at the call site:\n *\n * <AiSummaryBlock strings={{ regenerate: t('ai.summary.regenerate') }} … />\n */\n\nexport interface AiSummaryStrings {\n\t/** Regenerate button label. */\n\tregenerate: string;\n\t/** Confidence-bar level labels. */\n\tconfidenceLevels: { low: string; medium: string; high: string };\n}\n\nexport const defaultAiSummaryStrings: AiSummaryStrings = {\n\tregenerate: 'Regenerate',\n\tconfidenceLevels: { low: 'low', medium: 'medium', high: 'high' },\n};\n\nexport interface AiClassificationStrings {\n\t/** Card title rendered in the header. */\n\ttitle: string;\n\t/** Inline-stat row labels. */\n\tcomplexityLabel: string;\n\tflagsLabel: string;\n\tnextStepLabel: string;\n\t/** Confidence pill prefix (e.g. \"Confidence: High\"). */\n\tconfidencePrefix: string;\n\t/** Confidence band labels. */\n\tconfidenceBands: { low: string; medium: string; high: string };\n}\n\nexport const defaultAiClassificationStrings: AiClassificationStrings = {\n\ttitle: 'Classification',\n\tcomplexityLabel: 'Complexity',\n\tflagsLabel: 'Flags',\n\tnextStepLabel: 'Next Step',\n\tconfidencePrefix: 'Confidence',\n\tconfidenceBands: { low: 'Low', medium: 'Medium', high: 'High' },\n};\n","import { RefreshCw } from 'lucide-react';\n\nimport { Badge } from '../../../base/badge';\nimport { Button } from '../../../base/buttons';\nimport { Stack } from '../../../base/structure';\nimport { SecondaryValue } from '../../../primitives';\nimport { Text } from '../../../typography/text';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultAiSummaryStrings } from '../ai.strings';\nimport type { AiSummaryBlockProps, ConfidenceLevel } from './types';\n\nconst confidenceBars: Record<ConfidenceLevel, number> = {\n\tlow: 1,\n\tmedium: 2,\n\thigh: 3,\n};\n\nfunction ConfidenceBars({ level, label }: { level: ConfidenceLevel; label: string }) {\n\tconst filled = confidenceBars[level];\n\n\treturn (\n\t\t<div className=\"ai-summary--confidence flex items-center gap-space-sm\">\n\t\t\t<div className=\"flex items-center gap-space-2xs\" aria-hidden=\"true\">\n\t\t\t\t{Array.from({ length: 3 }, (_, i) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={`bar-${String(i)}`}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'h-2.5 w-1 rounded-radius-sm',\n\t\t\t\t\t\t\ti < filled ? 'bg-foreground/60' : 'bg-muted-foreground/20',\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t\t<Text size=\"xs\" type=\"secondary\" tag=\"span\" className=\"capitalize\">\n\t\t\t\t{label}\n\t\t\t</Text>\n\t\t</div>\n\t);\n}\n\nexport function AiSummaryBlock({\n\tdata,\n\tchildren,\n\tmetadata,\n\tactions,\n\tfooter,\n\tclassName,\n\tstrings: stringsProp,\n}: AiSummaryBlockProps) {\n\tconst strings = useStrings(defaultAiSummaryStrings, stringsProp);\n\tconst defaultMetadata = (\n\t\t<div className=\"ai-summary--metadata flex min-w-0 flex-wrap items-center gap-x-space-md gap-y-space-xs\">\n\t\t\t{!!data.generatedAt && (\n\t\t\t\t<SecondaryValue size=\"xs\" className=\"min-w-0\">\n\t\t\t\t\t{data.generatedAt}\n\t\t\t\t</SecondaryValue>\n\t\t\t)}\n\t\t\t{!!data.model && (\n\t\t\t\t<SecondaryValue size=\"xs\" className=\"min-w-0 truncate\">\n\t\t\t\t\t{data.model}\n\t\t\t\t</SecondaryValue>\n\t\t\t)}\n\t\t</div>\n\t);\n\tconst defaultActions = data.onRegenerate ? (\n\t\t<Button tone=\"secondary\" buttonStyle=\"ghost\" onClick={data.onRegenerate}>\n\t\t\t<RefreshCw className=\"mr-1 h-3 w-3\" />\n\t\t\t{strings.regenerate}\n\t\t</Button>\n\t) : null;\n\tconst resolvedMetadata = metadata === undefined ? defaultMetadata : metadata;\n\tconst resolvedActions = actions === undefined ? defaultActions : actions;\n\tconst footerContent = footer !== undefined\n\t\t? footer\n\t\t: (resolvedMetadata || resolvedActions) && (\n\t\t\t<>\n\t\t\t\t{resolvedMetadata}\n\t\t\t\t{resolvedActions}\n\t\t\t</>\n\t\t);\n\n\treturn (\n\t\t<Stack\n\t\t\tdata-component=\"ai-summary\"\n\t\t\tdata-slot=\"ai-summary\"\n\t\t\tclassName={cn('ai-summary--component', className)}\n\t\t>\n\t\t\t<Text lineHeight=\"relaxed\">\n\t\t\t\t{data.summary}\n\t\t\t</Text>\n\n\t\t\t{data.entities.length > 0 && (\n\t\t\t\t<Stack direction=\"horizontal\" wrap gap=\"sm\" className=\"ai-summary--entities min-w-0\">\n\t\t\t\t\t{data.entities.map((entity) => (\n\t\t\t\t\t\t<Badge key={entity} tone=\"secondary\">\n\t\t\t\t\t\t\t{entity}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t))}\n\t\t\t\t</Stack>\n\t\t\t)}\n\n\t\t\t<ConfidenceBars level={data.confidence} label={strings.confidenceLevels[data.confidence]} />\n\n\t\t\t{children}\n\n\t\t\t{!!footerContent && (\n\t\t\t\t<Stack\n\t\t\t\t\tdirection={{ base: 'vertical', sm: 'horizontal' }}\n\t\t\t\t\tgap=\"md\"\n\t\t\t\t\tjustify={{ sm: 'between' }}\n\t\t\t\t\tclassName=\"ai-summary--footer pt-space-xs\"\n\t\t\t\t>\n\t\t\t\t\t{footerContent}\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t</Stack>\n\t);\n}\n","import { Badge } from '../../../base/badge';\nimport { Stack } from '../../../base/structure';\nimport { InlineStat } from '../../data-display';\nimport { Separator } from '../../../base/display/separator';\nimport { Text } from '../../../typography/text';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultAiClassificationStrings } from '../ai.strings';\nimport type { AiClassificationPanelProps } from './types';\n\nexport function AiClassificationPanel({ data, children, className, strings: stringsProp }: AiClassificationPanelProps) {\n\tconst strings = useStrings(defaultAiClassificationStrings, stringsProp);\n\tconst confidenceLabel =\n\t\tdata.confidence >= 0.9\n\t\t\t? strings.confidenceBands.high\n\t\t\t: data.confidence >= 0.7\n\t\t\t\t? strings.confidenceBands.medium\n\t\t\t\t: strings.confidenceBands.low;\n\n\treturn (\n\t\t<Stack\n\t\t\tdata-component=\"ai-classification\"\n\t\t\tdata-slot=\"ai-classification\"\n\t\t\tclassName={cn('ai-classification--component', className)}\n\t\t>\n\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\">\n\t\t\t\t<Badge tone=\"primary\">\n\t\t\t\t\t{data.requestType}\n\t\t\t\t</Badge>\n\t\t\t\t<Badge tone={data.urgencyTone}>\n\t\t\t\t\t{data.urgency}\n\t\t\t\t</Badge>\n\t\t\t\t<Badge tone={data.sentimentTone} dot>\n\t\t\t\t\t{data.tone}\n\t\t\t\t</Badge>\n\t\t\t</Stack>\n\n\t\t\t<InlineStat\n\t\t\t\tlabel={strings.complexityLabel}\n\t\t\t\tlabelClassName=\"text-sm font-medium text-foreground\"\n\t\t\t\tvalue={\n\t\t\t\t\t<span className=\"flex items-center gap-space-md\">\n\t\t\t\t\t\t<span className=\"flex items-center gap-space-xs\">\n\t\t\t\t\t\t{Array.from({ length: 5 }, (_, i) => (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tkey={`cx-${String(i)}`}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'h-1.5 w-3 rounded-radius-sm',\n\t\t\t\t\t\t\t\t\ti < data.complexityScore ? 'bg-foreground/60' : 'bg-muted',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t{String(data.complexityScore)}/5\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</span>\n\t\t\t\t}\n\t\t\t/>\n\n\t\t\t{data.flags.length > 0 && (\n\t\t\t\t<InlineStat\n\t\t\t\t\tlabel={strings.flagsLabel}\n\t\t\t\t\tlabelClassName=\"text-sm font-medium text-foreground\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<span className=\"flex gap-space-xs\">\n\t\t\t\t\t\t\t{data.flags.map((flag) => (\n\t\t\t\t\t\t\t\t<Badge key={flag} tone=\"warning\">\n\t\t\t\t\t\t\t\t\t{flag}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t<InlineStat\n\t\t\t\tlabel={strings.nextStepLabel}\n\t\t\t\tlabelClassName=\"text-sm font-medium text-foreground\"\n\t\t\t\tvalue={<Badge tone=\"info\">{data.suggestedAction}</Badge>}\n\t\t\t/>\n\n\t\t\t<Text lineHeight=\"relaxed\" type=\"secondary\">\n\t\t\t\t{data.summary}\n\t\t\t</Text>\n\n\t\t\t<Separator />\n\n\t\t\t<div className=\"flex items-center gap-space-md\">\n\t\t\t\t<Badge tone=\"secondary\">\n\t\t\t\t\t{strings.confidencePrefix}: {confidenceLabel}\n\t\t\t\t</Badge>\n\t\t\t\t<Text size=\"xs\" type=\"discrete\" tag=\"span\">\n\t\t\t\t\t{data.model}\n\t\t\t\t</Text>\n\t\t\t</div>\n\n\t\t\t{children}\n\t\t</Stack>\n\t);\n}\n","import type { StringsProp } from '../../../../lib/strings';\n\nexport interface AiConfidenceFactor {\n\t/** Display label. */\n\tlabel: string;\n\tscore: number; // 0–1\n}\n\nexport interface AiConfidenceStrings {\n\t/** Surface title. */\n\ttitle: string;\n\tconfidenceLabel: string;\n\tfactorsLabel: string;\n\tlevelHigh: string;\n\tlevelMedium: string;\n\tlevelLow: string;\n}\n\nexport const defaultAiConfidenceStrings: AiConfidenceStrings = {\n\ttitle: 'AI Confidence',\n\tconfidenceLabel: 'Overall',\n\tfactorsLabel: 'Contributing factors',\n\tlevelHigh: 'High',\n\tlevelMedium: 'Medium',\n\tlevelLow: 'Low',\n};\n\nexport interface AiConfidenceProps {\n\tscore: number; // 0–1\n\tmodel?: string;\n\tfactors?: AiConfidenceFactor[];\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiConfidenceStrings>;\n}\n","import { Progress } from '../../../base/feedback';\n/**\n * AiConfidence — visualises an AI model's overall confidence with a circular\n * progress dial and a list of weighted contributing factors. Strings are overridable.\n */\nimport { Percent } from '../../../primitives';\nimport { DisplayLabel, Text } from '../../../typography';\nimport { Badge } from '../../../base/badge';\nimport { InlineStat } from '../../data-display';\nimport { Stack } from '../../../base/structure';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultAiConfidenceStrings, type AiConfidenceProps } from './types';\n\nfunction levelVariant(score: number) {\n\tif (score >= 0.85) return 'success' as const;\n\tif (score >= 0.6) return 'warning' as const;\n\treturn 'destructive' as const;\n}\n\nexport function AiConfidence({ score, model, factors, className, strings: stringsProp }: AiConfidenceProps) {\n\tconst strings = useStrings(defaultAiConfidenceStrings, stringsProp);\n\tconst pct = Math.round(score * 100);\n\tconst variant = levelVariant(score);\n\tconst label = variant === 'success' ? strings.levelHigh : variant === 'warning' ? strings.levelMedium : strings.levelLow;\n\tconst c = 2 * Math.PI * 24;\n\tconst dash = c - (pct / 100) * c;\n\n\treturn (\n\t\t<Stack\n\t\t\tdata-component=\"ai-confidence\"\n\t\t\tdata-slot=\"ai-confidence\"\n\t\t\tgap=\"xl\"\n\t\t\tclassName={cn('ai-confidence--component @container/ai-confidence', className)}\n\t\t\taria-label={strings.title}\n\t\t>\n\t\t\t<div className=\"grid gap-space-xl @md/ai-confidence:grid-cols-[auto_minmax(0,1fr)] @md/ai-confidence:items-center\">\n\t\t\t\t<div className=\"relative w-fit shrink-0\">\n\t\t\t\t\t<svg width=\"56\" height=\"56\" viewBox=\"0 0 64 64\" aria-hidden=\"true\">\n\t\t\t\t\t\t<circle cx=\"32\" cy=\"32\" r=\"24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"5\" className=\"text-muted/60\" />\n\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\tcx=\"32\"\n\t\t\t\t\t\t\tcy=\"32\"\n\t\t\t\t\t\t\tr=\"24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstrokeWidth=\"5\"\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeDasharray={c}\n\t\t\t\t\t\t\tstrokeDashoffset={dash}\n\t\t\t\t\t\t\ttransform=\"rotate(-90 32 32)\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\tvariant === 'success' && 'text-success',\n\t\t\t\t\t\t\t\tvariant === 'warning' && 'text-warning-accent',\n\t\t\t\t\t\t\t\tvariant === 'destructive' && 'text-destructive',\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</svg>\n\t\t\t\t\t<div className=\"absolute inset-0 flex flex-col items-center justify-center\">\n\t\t\t\t\t\t<Percent value={pct} scaled weight=\"semibold\" className=\"leading-none\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<Stack gap=\"sm\">\n\t\t\t\t\t<DisplayLabel>\n\t\t\t\t\t\t{strings.confidenceLabel}\n\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"sm\">\n\t\t\t\t\t\t<Badge tone={variant}>{label}</Badge>\n\t\t\t\t\t\t{!!model && (\n\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"truncate\">\n\t\t\t\t\t\t\t\t{model}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t</Stack>\n\t\t\t</div>\n\n\t\t\t{!!factors && factors.length > 0 && (\n\t\t\t\t<Stack gap=\"md\" className=\"mt-space-xl\">\n\t\t\t\t\t<DisplayLabel>\n\t\t\t\t\t\t{strings.factorsLabel}\n\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t{factors.map((f) => (\n\t\t\t\t\t\t<Stack key={f.label} gap=\"sm\">\n\t\t\t\t\t\t\t<InlineStat\n\t\t\t\t\t\t\t\tlabel={f.label}\n\t\t\t\t\t\t\t\tvalue={<Percent value={f.score} size=\"xs\" weight=\"semibold\" />}\n\t\t\t\t\t\t\t\tmono\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Progress value={Math.round(f.score * 100)} aria-label={f.label} />\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t))}\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t</Stack>\n\t);\n}\n\nAiConfidence.displayName = 'AiConfidence';\n","import type { LucideIcon } from 'lucide-react';\nimport type { StringsProp } from '../../../../lib/strings';\n\nexport interface AiPromptSuggestion {\n\t/** Stable identity for this entry. */\n\tid: string;\n\t/** Display label. */\n\tlabel: string;\n\t/** Supporting copy shown under the label. */\n\tdescription?: string;\n\t/** Leading glyph. */\n\ticon?: LucideIcon;\n}\n\nexport interface AiPromptSuggestionsStrings {\n\t/** Surface title. */\n\ttitle: string;\n\thint: string;\n}\n\nexport const defaultAiPromptSuggestionsStrings: AiPromptSuggestionsStrings = {\n\ttitle: 'Try asking',\n\thint: 'Tap a prompt to start',\n};\n\nexport interface AiPromptSuggestionsProps {\n\tsuggestions: AiPromptSuggestion[];\n\tonPick?: (suggestion: AiPromptSuggestion) => void;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiPromptSuggestionsStrings>;\n}\n","/**\n * AiPromptSuggestions — grid of clickable prompt rows.\n * Use to seed a chat or assistant input with curated starting prompts.\n */\nimport { IconBadge } from '../../../base/display';\nimport { Stack } from '../../../base/structure';\nimport {\n\tItem,\n\tItemContent,\n\tItemDescription,\n\tItemMedia,\n\tItemTitle,\n} from '../../../base/item';\nimport { cn } from '../../../../lib/utils';\nimport { useStrings } from '../../../../lib/strings';\n\nimport {\n\tdefaultAiPromptSuggestionsStrings,\n\ttype AiPromptSuggestionsProps,\n} from './types';\n\nexport function AiPromptSuggestions({ suggestions, onPick, className, strings: stringsProp }: AiPromptSuggestionsProps) {\n\tconst strings = useStrings(defaultAiPromptSuggestionsStrings, stringsProp);\n\n\treturn (\n\t\t<Stack\n\t\t\tdata-component=\"ai-prompt-suggestions\"\n\t\t\tdata-slot=\"ai-prompt-suggestions\"\n\t\t\tclassName={cn('ai-prompt-suggestions--component', className)}\n\t\t>\n\t\t\t<Stack gap=\"normal\" className=\"ai-prompt-suggestions--intro\">\n\t\t\t\t<ItemTitle>{strings.title}</ItemTitle>\n\t\t\t\t<ItemDescription>{strings.hint}</ItemDescription>\n\t\t\t</Stack>\n\t\t\t<div className=\"grid grid-cols-[repeat(auto-fit,minmax(min(15rem,100%),1fr))] gap-space-xl\">\n\t\t\t\t{suggestions.map((s) => {\n\t\t\t\t\tconst Icon = s.icon;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Item\n\t\t\t\t\t\t\tkey={s.id}\n\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\trender={<button type=\"button\" onClick={() => onPick?.(s)} />}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'ai-prompt-suggestions--item h-full items-start gap-space-lg p-surface transition-[border-color,background] duration-150',\n\t\t\t\t\t\t\t\t'hover:border-foreground/20 hover:bg-muted/40',\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{!!Icon && (\n\t\t\t\t\t\t\t\t<ItemMedia>\n\t\t\t\t\t\t\t\t\t<IconBadge icon={Icon} tone=\"primary\" size=\"md\" shape=\"square\" />\n\t\t\t\t\t\t\t\t</ItemMedia>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<ItemContent className=\"min-w-0 gap-space-sm\">\n\t\t\t\t\t\t\t\t<ItemTitle>{s.label}</ItemTitle>\n\t\t\t\t\t\t\t\t{!!s.description && (\n\t\t\t\t\t\t\t\t\t<ItemDescription>{s.description}</ItemDescription>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</ItemContent>\n\t\t\t\t\t\t</Item>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</Stack>\n\t);\n}\n\nAiPromptSuggestions.displayName = 'AiPromptSuggestions';\n","import type { StringsProp } from '../../../../lib/strings';\n\nexport interface AiTokenUsageStrings {\n\t/** Surface title. */\n\ttitle: string;\n\tinput: string;\n\toutput: string;\n\t/** Total number of records across all pages. */\n\ttotal: string;\n\tcost: string;\n}\n\nexport const defaultAiTokenUsageStrings: AiTokenUsageStrings = {\n\ttitle: 'Token usage',\n\tinput: 'Input',\n\toutput: 'Output',\n\ttotal: 'Total',\n\tcost: 'Estimated cost',\n};\n\nexport interface AiTokenUsageProps {\n\tmodel?: string;\n\tinputTokens: number;\n\toutputTokens: number;\n\tcost?: string;\n\tmaxTokens?: number;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiTokenUsageStrings>;\n}\n","/**\n * AiTokenUsage — input + output token counts with a usage bar\n * relative to a max context window, plus optional cost estimate.\n */\nimport { useStrings } from '../../../../lib/strings';\nimport { Badge } from '../../../base/badge';\nimport { DisplayLabel, Text } from '../../../typography';\nimport { InlineStat } from '../../data-display';\nimport { AdaptiveGrid, Stack } from '../../../base/structure';\nimport { Number as NumberValue, Percent } from '../../../primitives';\n\nimport { defaultAiTokenUsageStrings, type AiTokenUsageProps } from './types';\n\nimport { cn } from '../../../../lib/utils';\nexport function AiTokenUsage({\n\tmodel,\n\tinputTokens,\n\toutputTokens,\n\tcost,\n\tmaxTokens,\n\tclassName,\n\tstrings: stringsProp,\n}: AiTokenUsageProps) {\n\tconst strings = useStrings(defaultAiTokenUsageStrings, stringsProp);\n\tconst total = inputTokens + outputTokens;\n\tconst pct = maxTokens ? Math.min(100, Math.round((total / maxTokens) * 100)) : 0;\n\n\treturn (\n\t\t<Stack\n\t\t\tdata-component=\"ai-token-usage\"\n\t\t\tdata-slot=\"ai-token-usage\"\n\t\t\tclassName={cn('ai-token-usage--component', className)}\n\t\t>\n\t\t\t{!!model && (\n\t\t\t\t<div className=\"ai-token-usage--metadata flex min-w-0 justify-start\">\n\t\t\t\t\t<Badge tone=\"secondary\">{model}</Badge>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<AdaptiveGrid minColumnWidth=\"sm\" gap=\"md\">\n\t\t\t\t{[\n\t\t\t\t\t{ label: strings.input, value: inputTokens },\n\t\t\t\t\t{ label: strings.output, value: outputTokens },\n\t\t\t\t\t{ label: strings.total, value: total },\n\t\t\t\t].map((cell) => (\n\t\t\t\t\t// `DisplayLabel` and `NumberValue` are both inline, and JSX drops\n\t\t\t\t\t// the newline between them, so bare siblings rendered as\n\t\t\t\t\t// \"Input3,240\". Stack them so the tile reads label-over-value.\n\t\t\t\t\t<div key={cell.label} className=\"rounded-radius bg-muted/40 p-surface-xs\">\n\t\t\t\t\t\t<Stack gap=\"2xs\">\n\t\t\t\t\t\t\t<DisplayLabel>{cell.label}</DisplayLabel>\n\t\t\t\t\t\t\t<NumberValue value={cell.value} weight=\"semibold\" align=\"left\" />\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</AdaptiveGrid>\n\t\t\t{!!maxTokens && (\n\t\t\t\t<div className=\"mt-space-lg\">\n\t\t\t\t\t<InlineStat\n\t\t\t\t\t\tlabel={(\n\t\t\t\t\t\t\t<span className=\"inline-flex items-center gap-space-xs\">\n\t\t\t\t\t\t\t\t<NumberValue value={total} size=\"xs\" align=\"left\" />\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" aria-hidden>/</Text>\n\t\t\t\t\t\t\t\t<NumberValue value={maxTokens} size=\"xs\" align=\"left\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tvalue={<Percent value={pct} scaled size=\"xs\" weight=\"semibold\" align=\"right\" />}\n\t\t\t\t\t\tmono\n\t\t\t\t\t\tvalueClassName=\"text-xs font-semibold\"\n\t\t\t\t\t/>\n\t\t\t\t\t<div className=\"mt-1 h-1.5 w-full overflow-hidden rounded-full bg-muted\">\n\t\t\t\t\t\t<div className=\"h-full rounded-full bg-primary\" style={{ width: `${pct}%` }} />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{!!cost && (\n\t\t\t\t<InlineStat\n\t\t\t\t\tclassName=\"mt-space-lg rounded-radius bg-primary/5 p-surface-xs\"\n\t\t\t\t\tlabel={<Text tag=\"span\" size=\"xs\" weight=\"medium\" lineHeight=\"tight\">{strings.cost}</Text>}\n\t\t\t\t\tvalue={cost}\n\t\t\t\t\tmono\n\t\t\t\t\tvalueClassName=\"text-sm font-bold\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t</Stack>\n\t);\n}\n\nAiTokenUsage.displayName = 'AiTokenUsage';\n","import type { StringsProp } from '../../../../lib/strings';\n\nexport type AiFeedbackVote = 'up' | 'down' | null;\n\nexport interface AiFeedbackStrings {\n\tprompt: string;\n\tthumbsUpAria: string;\n\tthumbsDownAria: string;\n\tcommentPlaceholder: string;\n\tsubmit: string;\n\tthanks: string;\n}\n\nexport const defaultAiFeedbackStrings: AiFeedbackStrings = {\n\tprompt: 'Was this helpful?',\n\tthumbsUpAria: 'Mark as helpful',\n\tthumbsDownAria: 'Mark as not helpful',\n\tcommentPlaceholder: 'Tell us more (optional)',\n\tsubmit: 'Send feedback',\n\tthanks: 'Thanks for your feedback.',\n};\n\nexport interface AiFeedbackProps {\n\t/** Current value. Controlled. */\n\tvalue?: AiFeedbackVote;\n\tonVote?: (vote: AiFeedbackVote) => void;\n\t/** Fired when a comment is submitted. */\n\tonSubmitComment?: (comment: string, vote: AiFeedbackVote) => void;\n\tallowComment?: boolean;\n\tsubmitted?: boolean;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiFeedbackStrings>;\n}\n","/**\n * AiFeedback — thumbs-up / thumbs-down voter with an optional follow-up\n * comment field. Wires into model-improvement loops: emits the vote via\n * `onVote` immediately and a comment via `onSubmitComment` when the user\n * submits the textarea. After `submitted=true` the surface is replaced with\n * a thank-you confirmation. Strings overridable for i18n.\n */\nimport { useState } from 'react';\nimport { ThumbsDown, ThumbsUp } from 'lucide-react';\nimport { Button } from '../../../base/buttons';\nimport { Textarea } from '../../../base/text-inputs';\nimport { Stack } from '../../../base/structure';\nimport { Text } from '../../../typography';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport {\n\tdefaultAiFeedbackStrings,\n\ttype AiFeedbackProps,\n\ttype AiFeedbackVote,\n} from './types';\n\nexport function AiFeedback({\n\tvalue,\n\tonVote,\n\tonSubmitComment,\n\tallowComment = true,\n\tsubmitted = false,\n\tclassName,\n\tstrings: stringsProp,\n}: AiFeedbackProps) {\n\tconst strings = useStrings(defaultAiFeedbackStrings, stringsProp);\n\tconst [internalVote, setInternalVote] = useState<AiFeedbackVote>(null);\n\tconst [comment, setComment] = useState('');\n\tconst vote = value ?? internalVote;\n\n\tconst cast = (next: AiFeedbackVote) => {\n\t\tconst resolved = vote === next ? null : next;\n\t\tif (value === undefined) setInternalVote(resolved);\n\t\tonVote?.(resolved);\n\t};\n\n\tif (submitted) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn('ai-feedback--component', \n\t\t\t\t\t'inline-flex items-center gap-space-md rounded-radius bg-success/10 px-space-lg py-space-sm',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<ThumbsUp className=\"size-icon-md text-success\" />\n\t\t\t\t<Text size=\"xs\" type=\"success\" weight=\"medium\">\n\t\t\t\t\t{strings.thanks}\n\t\t\t\t</Text>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={cn('ai-feedback--component inline-flex flex-col gap-space-md', className)}>\n\t\t\t<div className=\"flex items-center gap-space-md\">\n\t\t\t\t<Text size=\"xs\" type=\"secondary\">{strings.prompt}</Text>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\tbuttonStyle={vote === 'up' ? 'solid' : 'ghost'}\n\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\taria-label={strings.thumbsUpAria}\n\t\t\t\t\taria-pressed={vote === 'up'}\n\t\t\t\t\tonClick={() => cast('up')}\n\t\t\t\t\tclassName={cn(vote === 'up' && 'text-success bg-success/15 hover:bg-success/20')}\n\t\t\t\t>\n\t\t\t\t\t<ThumbsUp className=\"size-icon-md\" />\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\tbuttonStyle={vote === 'down' ? 'solid' : 'ghost'}\n\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\taria-label={strings.thumbsDownAria}\n\t\t\t\t\taria-pressed={vote === 'down'}\n\t\t\t\t\tonClick={() => cast('down')}\n\t\t\t\t\tclassName={cn(vote === 'down' && 'text-destructive bg-destructive/10 hover:bg-destructive/10')}\n\t\t\t\t>\n\t\t\t\t\t<ThumbsDown className=\"size-icon-md\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\n\t\t\t{!!allowComment && !!vote && (\n\t\t\t\t<Stack gap=\"md\">\n\t\t\t\t\t<Textarea\n\t\t\t\t\t\tvalue={comment}\n\t\t\t\t\t\tonChange={(e) => setComment((e.target as HTMLTextAreaElement).value)}\n\t\t\t\t\t\tplaceholder={strings.commentPlaceholder}\n\t\t\t\t\t\tminRows={2}\n\t\t\t\t\t/>\n\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"none\" justify=\"end\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tonSubmitComment?.(comment, vote);\n\t\t\t\t\t\t\t\tsetComment('');\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tdisabled={!comment.trim()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{strings.submit}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</Stack>\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nAiFeedback.displayName = 'AiFeedback';\n","import type { ReactNode } from 'react';\nimport type { StringsProp } from '../../../../lib/strings';\n\nexport interface AiCitationSource {\n\t/** Stable identity for this entry. */\n\tid: string;\n\t/** Surface title. */\n\ttitle: ReactNode;\n\turl?: string;\n\tsnippet?: ReactNode;\n\tpublisher?: string;\n\tpublishedAt?: string;\n\trelevance?: number; // 0–1\n}\n\nexport interface AiCitationStrings {\n\t/** Surface title. */\n\ttitle: string;\n\tsourceCount: (n: number) => string;\n\thiddenCount: (n: number) => string;\n\texpand: string;\n\tcollapse: string;\n\tvisit: string;\n\trelevance: string;\n}\n\nexport const defaultAiCitationStrings: AiCitationStrings = {\n\ttitle: 'Sources',\n\tsourceCount: (n: number) => (n === 1 ? '1 source' : `${n} sources`),\n\thiddenCount: (n: number) => (n === 1 ? '+1 more' : `+${n} more`),\n\texpand: 'Show sources',\n\tcollapse: 'Hide sources',\n\tvisit: 'Visit',\n\trelevance: 'Relevance',\n};\n\nexport interface AiCitationProps {\n\tsources: AiCitationSource[];\n\t/** Expanded state, for controlled use. */\n\texpanded?: boolean;\n\t/** Initial expanded state, for uncontrolled use. */\n\tdefaultExpanded?: boolean;\n\t/** Fired whenever the disclosure state changes. */\n\tonExpandedChange?: (expanded: boolean) => void;\n\tmaxCollapsedRows?: number;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiCitationStrings>;\n}\n","/**\n * AiCitation — expandable source list for AI-grounded responses. Renders an\n * inline footnote-style header (e.g. \"3 sources\") that toggles a list of\n * source rows: title link, snippet, publisher / date, and a relevance bar.\n * Use under `AiSummaryBlock` and `AiMessageBubble` to make AI claims\n * traceable. Strings overridable for i18n.\n *\n * Note: `strings.sourceCount` is a function (single / plural form) — pass an\n * override if your locale needs more complex pluralisation.\n */\nimport { useState } from 'react';\nimport { ChevronDown, ChevronRight, ExternalLink, Quote } from 'lucide-react';\nimport { Button } from '../../../base/buttons';\nimport { Stack } from '../../../base/structure';\nimport { Number as NumberValue, Percent, SecondaryValue } from '../../../primitives';\nimport { Text } from '../../../typography';\nimport {\n\tItem,\n\tItemActions,\n\tItemContent,\n\tItemDescription,\n\tItemFooter,\n\tItemGroup,\n\tItemMedia,\n\tItemTitle,\n} from '../../../base/item';\nimport { mergeStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultAiCitationStrings, type AiCitationProps, type AiCitationSource } from './types';\n\nexport function AiCitation({\n\tsources,\n\texpanded: expandedProp,\n\tdefaultExpanded = false,\n\tonExpandedChange,\n\tmaxCollapsedRows = 0,\n\tclassName,\n\tstrings: stringsProp,\n}: AiCitationProps) {\n\t// `sourceCount` is a function so we cannot use `useStrings` deep-merge\n\t// (the merger replaces functions wholesale, which is what we want).\n\tconst strings = mergeStrings(defaultAiCitationStrings, stringsProp);\n\tconst [internalExpanded, setInternalExpanded] = useState(defaultExpanded);\n\tconst expanded = expandedProp ?? internalExpanded;\n\tconst setExpanded = (next: boolean) => {\n\t\tif (expandedProp === undefined) setInternalExpanded(next);\n\t\tonExpandedChange?.(next);\n\t};\n\tconst visible = expanded ? sources : sources.slice(0, Math.max(0, maxCollapsedRows));\n\tconst hidden = sources.length - visible.length;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'ai-citation--component',\n\t\t\t\t'rounded-radius border border-border bg-card px-surface-xs py-surface-xs shadow-xs',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Stack gap=\"lg\">\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tonClick={() => setExpanded(!expanded)}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'ai-citation--trigger h-auto justify-start gap-space-sm rounded-inner px-control py-row-y',\n\t\t\t\t\t\t'text-muted-foreground hover:text-foreground hover:bg-muted/40',\n\t\t\t\t\t)}\n\t\t\t\t\taria-expanded={expanded}\n\t\t\t\t\taria-label={expanded ? strings.collapse : strings.expand}\n\t\t\t\t>\n\t\t\t\t\t<Quote className=\"size-icon-md\" />\n\t\t\t\t\t<Text weight=\"medium\">\n\t\t\t\t\t\t{strings.title} · {strings.sourceCount(sources.length)}\n\t\t\t\t\t</Text>\n\t\t\t\t\t{expanded ? <ChevronDown className=\"size-icon-md\" /> : <ChevronRight className=\"size-icon-md\" />}\n\t\t\t\t</Button>\n\n\t\t\t\t{(expanded || maxCollapsedRows > 0) && (\n\t\t\t\t\t<ItemGroup>\n\t\t\t\t\t\t{visible.map((s, i) => (\n\t\t\t\t\t\t\t<CitationRow key={s.id} source={s} index={i + 1} strings={strings} />\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t{!expanded && hidden > 0 && (\n\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t\t{strings.hiddenCount(hidden)}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</ItemGroup>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</div>\n\t);\n}\n\nAiCitation.displayName = 'AiCitation';\n\nfunction CitationRow({\n\tsource,\n\tindex,\n\tstrings,\n}: {\n\tsource: AiCitationSource;\n\tindex: number;\n\tstrings: ReturnType<typeof mergeStrings<typeof defaultAiCitationStrings>>;\n}) {\n\tconst relevancePct =\n\t\ttypeof source.relevance === 'number' ? Math.round(Math.max(0, Math.min(1, source.relevance)) * 100) : null;\n\n\tconst TitleEl = source.url ? 'a' : 'span';\n\tconst titleProps = source.url\n\t\t? {\n\t\t\t\thref: source.url,\n\t\t\t\ttarget: '_blank' as const,\n\t\t\t\trel: 'noopener noreferrer',\n\t\t\t}\n\t\t: {};\n\n\treturn (\n\t\t<Item variant=\"outline\" size=\"sm\" className=\"items-start px-surface-xs py-surface-xs\">\n\t\t\t<ItemMedia>\n\t\t\t\t<NumberValue\n\t\t\t\t\tvalue={index}\n\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\tweight=\"semibold\"\n\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\talign=\"center\"\n\t\t\t\t\tclassName=\"inline-flex size-icon-lg shrink-0 items-center justify-center rounded-full bg-muted\"\n\t\t\t\t/>\n\t\t\t</ItemMedia>\n\t\t\t<ItemContent>\n\t\t\t\t<ItemTitle className=\"truncate\">\n\t\t\t\t\t<TitleEl\n\t\t\t\t\t\t{...titleProps}\n\t\t\t\t\t\tclassName={cn('truncate', source.url && 'hover:text-primary-accent hover:underline')}\n\t\t\t\t\t>\n\t\t\t\t\t\t{source.title}\n\t\t\t\t\t\t{!!source.url && <ExternalLink className=\"ml-1 inline size-icon-sm align-baseline\" />}\n\t\t\t\t\t</TitleEl>\n\t\t\t\t</ItemTitle>\n\t\t\t\t{!!source.snippet && <ItemDescription clamp={2}>{source.snippet}</ItemDescription>}\n\t\t\t\t{(source.publisher || source.publishedAt) && (\n\t\t\t\t\t<ItemFooter className=\"mt-1 justify-start gap-space-sm\">\n\t\t\t\t\t\t{!!source.publisher && (\n\t\t\t\t\t\t\t<Text size=\"xs\" type=\"discrete\">\n\t\t\t\t\t\t\t\t{source.publisher}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!!source.publisher && !!source.publishedAt && (\n\t\t\t\t\t\t\t<Text size=\"xs\" type=\"discrete\">\n\t\t\t\t\t\t\t\t·\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!!source.publishedAt && (\n\t\t\t\t\t\t\t<SecondaryValue size=\"xs\" className=\"tabular-nums opacity-80\">\n\t\t\t\t\t\t\t\t{source.publishedAt}\n\t\t\t\t\t\t\t</SecondaryValue>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</ItemFooter>\n\t\t\t\t)}\n\t\t\t</ItemContent>\n\t\t\t{relevancePct !== null && (\n\t\t\t\t<ItemActions className=\"w-16 flex-col items-end gap-space-2xs\">\n\t\t\t\t\t<Percent value={relevancePct} scaled size=\"xs\" type=\"secondary\" weight=\"medium\" />\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"h-1 w-full overflow-hidden rounded-full bg-muted\"\n\t\t\t\t\t\trole=\"progressbar\"\n\t\t\t\t\t\taria-label={strings.relevance}\n\t\t\t\t\t\taria-valuemin={0}\n\t\t\t\t\t\taria-valuemax={100}\n\t\t\t\t\t\taria-valuenow={relevancePct}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"h-full rounded-full bg-primary\" style={{ width: `${relevancePct}%` }} />\n\t\t\t\t\t</div>\n\t\t\t\t</ItemActions>\n\t\t\t)}\n\t\t</Item>\n\t);\n}\n","import type { StringsProp } from '../../../../lib/strings';\n\nexport interface AiInlineCitationStrings {\n\t/** Tooltip prefix when only a number is rendered. */\n\tsourcePrefix: string;\n\t/** Aria label template — supports `{{n}}` and `{{title}}` placeholders. */\n\topenAria: string;\n}\n\nexport const defaultAiInlineCitationStrings: AiInlineCitationStrings = {\n\tsourcePrefix: 'Source',\n\topenAria: 'Open source {{n}}: {{title}}',\n};\n\nexport interface AiInlineCitationProps {\n\t/** 1-indexed citation number rendered inside the pill. */\n\tindex: number;\n\t/** Title of the cited source — used in the tooltip / aria-label. */\n\ttitle?: string;\n\t/** Optional URL — when provided, the pill renders as a link. */\n\turl?: string;\n\t/** Click handler — preferred over `url` for SPA / virtual link routing. */\n\tonSelect?: () => void;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiInlineCitationStrings>;\n}\n","/**\n * AiInlineCitation — small footnote-style pill rendered inline inside AI\n * response prose. The number references a position in the parent\n * sources/AiCitation list. Hover to see the source title; click to jump.\n */\nimport { Text, TextLink } from '../../../typography';\nimport { mergeStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport {\n\tdefaultAiInlineCitationStrings,\n\ttype AiInlineCitationProps,\n} from './types';\n\nfunction interpolate(template: string, params: Record<string, string | number>): string {\n\treturn template.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (m, k) => {\n\t\tconst v = params[k];\n\t\treturn v === undefined ? m : String(v);\n\t});\n}\n\nexport function AiInlineCitation({\n\tindex,\n\ttitle,\n\turl,\n\tonSelect,\n\tclassName,\n\tstrings: stringsProp,\n}: AiInlineCitationProps) {\n\tconst strings = mergeStrings(defaultAiInlineCitationStrings, stringsProp);\n\tconst ariaLabel = interpolate(strings.openAria, {\n\t\tn: index,\n\t\ttitle: title ?? '',\n\t});\n\tconst tooltip = title ? `${strings.sourcePrefix} ${index}: ${title}` : `${strings.sourcePrefix} ${index}`;\n\n\t// Inline markers use the compact shared action geometry; the Text child\n\t// owns their numeric role independently of the surrounding prose size.\n\tconst baseCls = cn(\n\t\t'box-border inline-flex h-action-xs min-w-action-xs -translate-y-px items-center justify-center rounded-inner border-0 px-control-xs font-sans',\n\t\t'align-middle tabular-nums',\n\t\t'bg-muted text-muted-foreground',\n\t\t'hover:bg-primary/10 hover:text-primary-accent',\n\t\t'transition-colors duration-150',\n\t\t'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n\t\tclassName,\n\t);\n\n\tif (url) {\n\t\treturn (\n\t\t\t<TextLink\n\t\t\t\thref={url}\n\t\t\t\tsize=\"inherit\"\n\t\t\t\tunderline={false}\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\ttitle={tooltip}\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\tclassName={cn('ai-inline-citation--component', baseCls)}\n\t\t\t>\n\t\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" className=\"leading-none\">\n\t\t\t\t\t{index}\n\t\t\t\t</Text>\n\t\t\t</TextLink>\n\t\t);\n\t}\n\n\tif (onSelect) {\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={onSelect}\n\t\t\t\ttitle={tooltip}\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\tclassName={cn('ai-inline-citation--component', baseCls)}\n\t\t\t>\n\t\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" className=\"leading-none\">\n\t\t\t\t\t{index}\n\t\t\t\t</Text>\n\t\t\t</button>\n\t\t);\n\t}\n\n\treturn (\n\t\t<span\n\t\t\ttitle={tooltip}\n\t\t\taria-label={ariaLabel}\n\t\t\tclassName={cn('ai-inline-citation--component', baseCls)}\n\t\t>\n\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" className=\"leading-none\">\n\t\t\t\t{index}\n\t\t\t</Text>\n\t\t</span>\n\t);\n}\n\nAiInlineCitation.displayName = 'AiInlineCitation';\n","import type { ReactNode } from 'react';\nimport type { StringsProp } from '../../../../lib/strings';\n\nexport interface AiPackageInfoStrings {\n\tversionLabel: string;\n\tlicenseLabel: string;\n\tpublishedLabel: string;\n\thomepageAria: string;\n\thomepageLabel: string;\n\trepositoryAria: string;\n\trepositoryLabel: string;\n\tweeklyDownloadsLabel: string;\n}\n\nexport const defaultAiPackageInfoStrings: AiPackageInfoStrings = {\n\tversionLabel: 'Version',\n\tlicenseLabel: 'License',\n\tpublishedLabel: 'Published',\n\thomepageAria: 'Open homepage',\n\thomepageLabel: 'Homepage',\n\trepositoryAria: 'Open repository',\n\trepositoryLabel: 'Repository',\n\tweeklyDownloadsLabel: 'Weekly downloads',\n};\n\nexport interface AiPackageInfoProps {\n\t/** Package name (npm-style: optional `@scope/`). */\n\tname: string;\n\t/** Latest / pinned version. */\n\tversion?: string;\n\t/** Short description from the package manifest. */\n\tdescription?: ReactNode;\n\t/** SPDX-style license identifier (e.g. \"MIT\"). */\n\tlicense?: string;\n\t/** ISO date or human label of last publish. */\n\tpublishedAt?: string;\n\t/** Package homepage URL. */\n\thomepage?: string;\n\t/** Repository URL (typically GitHub). */\n\trepository?: string;\n\t/** Weekly downloads — formatted by the consumer. */\n\tweeklyDownloads?: string | number;\n\t/** Comma-separated tag list rendered as small chips. */\n\tkeywords?: ReadonlyArray<string>;\n\t/** Click handler for the whole card. */\n\tonSelect?: () => void;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiPackageInfoStrings>;\n}\n","/**\n * AiPackageInfo — compact card describing an npm / library package referenced\n * by the model. Header: name + version chip; body: description + optional\n * meta (license, published date, weekly downloads) and keyword chips. Footer\n * exposes homepage / repository links when provided.\n */\nimport { Code2, ExternalLink, Globe, Package } from 'lucide-react';\nimport { Badge } from '../../../base/badge';\nimport { Button } from '../../../base/buttons';\nimport { MonoValue, SecondaryValue } from '../../../primitives';\nimport { Text, TextLink } from '../../../typography';\nimport { useStrings } from '../../../../lib/strings';\nimport { Stack } from '../../../base/structure';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultAiPackageInfoStrings, type AiPackageInfoProps } from './types';\n\nexport function AiPackageInfo({\n\tname,\n\tversion,\n\tdescription,\n\tlicense,\n\tpublishedAt,\n\thomepage,\n\trepository,\n\tweeklyDownloads,\n\tkeywords,\n\tonSelect,\n\tclassName,\n\tstrings: stringsProp,\n}: AiPackageInfoProps) {\n\tconst strings = useStrings(defaultAiPackageInfoStrings, stringsProp);\n\tconst bodyContent = (\n\t\t<>\n\t\t\t<span\n\t\t\t\taria-hidden\n\t\t\t\tclassName=\"inline-flex size-9 shrink-0 items-center justify-center rounded-inner bg-muted text-muted-foreground\"\n\t\t\t>\n\t\t\t\t<Package className=\"size-icon\" />\n\t\t\t</span>\n\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t<Stack gap=\"dense\">\n\t\t\t\t<Stack direction=\"horizontal\" gap=\"md\" align=\"center\">\n\t\t\t\t\t<MonoValue weight=\"semibold\" className=\"truncate\">\n\t\t\t\t\t\t{name}\n\t\t\t\t\t</MonoValue>\n\t\t\t\t\t{!!version && (\n\t\t\t\t\t\t<Badge tone=\"secondary\">\n\t\t\t\t\t\t\t<MonoValue size=\"xs\" className=\"text-inherit\">v{version.replace(/^v/, '')}</MonoValue>\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t\t{!!description && (\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"line-clamp-2\">\n\t\t\t\t\t\t{description}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t</Stack>\n\n\t\t\t\t{(license || publishedAt || weeklyDownloads !== undefined) && (\n\t\t\t\t\t<div className=\"mt-space-md flex flex-wrap items-center gap-x-space-lg gap-y-space-xs\">\n\t\t\t\t\t\t{!!license && <MetaItem label={strings.licenseLabel} value={license} />}\n\t\t\t\t\t\t{!!publishedAt && <MetaItem label={strings.publishedLabel} value={publishedAt} />}\n\t\t\t\t\t\t{weeklyDownloads !== undefined && (\n\t\t\t\t\t\t\t<MetaItem label={strings.weeklyDownloadsLabel} value={String(weeklyDownloads)} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{!!keywords?.length && (\n\t\t\t\t\t<div className=\"mt-space-md flex flex-wrap gap-space-xs\">\n\t\t\t\t\t\t{keywords.slice(0, 6).map((keyword) => (\n\t\t\t\t\t\t\t<Badge key={keyword} tone=\"secondary\">\n\t\t\t\t\t\t\t\t{keyword}\n\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n\tconst bodyClassName = 'ai-package-info--body flex w-full items-start gap-space-lg p-surface-xs text-left';\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'ai-package-info--component block w-full overflow-hidden rounded-radius border border-border/60 bg-card',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{onSelect ? (\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\tonClick={onSelect}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tbodyClassName,\n\t\t\t\t\t\t'h-auto justify-start rounded-none whitespace-normal transition-colors hover:bg-muted/40',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{bodyContent}\n\t\t\t\t</Button>\n\t\t\t) : (\n\t\t\t\t<div className={bodyClassName}>{bodyContent}</div>\n\t\t\t)}\n\n\t\t\t{(homepage || repository) && (\n\t\t\t\t<div className=\"ai-package-info--footer border-t border-border/60 bg-muted/20 px-surface-xs py-row-y\">\n\t\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"md\">\n\t\t\t\t\t\t{!!homepage && (\n\t\t\t\t\t\t\t<TextLink\n\t\t\t\t\t\t\t\thref={homepage}\n\t\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\t\tunderline={false}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t\t\t\t\t\taria-label={strings.homepageAria}\n\t\t\t\t\t\t\t\tclassName=\"inline-flex items-center gap-space-xs rounded text-muted-foreground hover:text-foreground\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Globe className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t\t<Text tag=\"span\" weight=\"medium\">\n\t\t\t\t\t\t\t\t\t{strings.homepageLabel}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t<ExternalLink className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t</TextLink>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!!homepage && !!repository && (\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"opacity-40\" aria-hidden>\n\t\t\t\t\t\t\t\t·\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!!repository && (\n\t\t\t\t\t\t\t<TextLink\n\t\t\t\t\t\t\t\thref={repository}\n\t\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\t\tunderline={false}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t\t\t\t\t\taria-label={strings.repositoryAria}\n\t\t\t\t\t\t\t\tclassName=\"inline-flex items-center gap-space-xs rounded text-muted-foreground hover:text-foreground\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Code2 className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t\t<Text tag=\"span\" weight=\"medium\">\n\t\t\t\t\t\t\t\t\t{strings.repositoryLabel}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t<ExternalLink className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t</TextLink>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nAiPackageInfo.displayName = 'AiPackageInfo';\n\nfunction MetaItem({ label, value }: { label: string; value: string }) {\n\treturn (\n\t\t<div className=\"inline-flex items-baseline gap-space-xs\">\n\t\t\t<Text size=\"xs\" type=\"discrete\">\n\t\t\t\t{label}\n\t\t\t</Text>\n\t\t\t<SecondaryValue size=\"xs\" weight=\"medium\" className=\"tabular-nums\">\n\t\t\t\t{value}\n\t\t\t</SecondaryValue>\n\t\t</div>\n\t);\n}\n","import type { LucideIcon } from 'lucide-react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport type { RowDensity } from '../../../../lib/row-recipes';\nimport type { StringsProp } from '../../../../lib/strings';\n\nexport type AiFileTreeNodeKind = 'directory' | 'file';\n\nexport type AiFileTreeChangeStatus = 'added' | 'modified' | 'removed' | 'renamed';\n\nexport interface AiFileTreeNode {\n\t/** Stable identity, unique throughout the hierarchy. */\n\tid: string;\n\t/** Display name. */\n\tname: string;\n\tkind: AiFileTreeNodeKind;\n\t/** Children — only meaningful for directories. */\n\tchildren?: ReadonlyArray<AiFileTreeNode>;\n\t/** Custom icon override (file kinds, etc.). */\n\ticon?: LucideIcon;\n\t/** Diff status — drives the semantic icon color and trailing Badge. */\n\tstatus?: AiFileTreeChangeStatus;\n\t/** Trailing slot — badge, line count, etc. */\n\ttrailing?: ReactNode;\n\t/** Default-expanded state for directories. */\n\tdefaultExpanded?: boolean;\n /** Disables this entry and all descendants. */\n disabled?: boolean;\n}\n\nexport interface AiFileTreeStrings {\n /** Accessible hierarchy name; aria-label/aria-labelledby can override it. */\n treeAria?: string;\n\texpandAria: string;\n\tcollapseAria: string;\n\tstatusLabels: Record<AiFileTreeChangeStatus, string>;\n}\n\nexport const defaultAiFileTreeStrings: AiFileTreeStrings = {\n treeAria: 'Files',\n\texpandAria: 'Expand directory',\n\tcollapseAria: 'Collapse directory',\n\tstatusLabels: {\n\t\tadded: 'A',\n\t\tmodified: 'M',\n\t\tremoved: 'D',\n\t\trenamed: 'R',\n\t},\n};\n\nexport interface AiFileTreeProps extends Omit<ComponentProps<'div'>, 'children' | 'onSelect'> {\n\t/** Root nodes — typically one entry but the API accepts multiple. */\n\tnodes: ReadonlyArray<AiFileTreeNode>;\n\t/** Selected file id — drives the active row state. Controlled. */\n\tselectedId?: string;\n\t/** Click handler — fires for files only by default. */\n\tonSelect?: (node: AiFileTreeNode) => void;\n\t/** Hide diff status badges; semantic icon colors remain visible. */\n\thideStatusLabels?: boolean;\n\t/** Indent width per nesting level (px). Omit for the shared token-backed hierarchy inset. */\n\tindent?: number;\n /** Vertical rhythm; compact by default. */\n density?: RowDensity;\n /** Disables the entire hierarchy. */\n disabled?: boolean;\n /** Controlled directory expansion. */\n expandedIds?: readonly string[];\n /** Initial expansion; otherwise each directory's defaultExpanded is respected. */\n defaultExpandedIds?: readonly string[];\n /** Expansion request, independent of file selection. */\n onExpandedIdsChange?: (ids: string[], node: AiFileTreeNode) => void;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiFileTreeStrings>;\n}\n","/** File-change presentation on the public keyboard hierarchy; framing belongs to the caller. */\nimport { useMemo, useState } from 'react';\nimport { File, FileCode, FileText, Folder, FolderOpen, type LucideIcon } from 'lucide-react';\nimport { Tree, type TreeNode } from '../../../base/tree';\nimport { Badge } from '../../../base/badge';\nimport { Stack } from '../../../base/structure';\nimport { MonoValue, SecondaryValue } from '../../../primitives';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\nimport { defaultAiFileTreeStrings, type AiFileTreeChangeStatus, type AiFileTreeNode, type AiFileTreeProps } from './types';\n\nconst statusTones = { added: 'success', modified: 'warning', removed: 'destructive', renamed: 'info' } as const;\nconst statusIconClasses: Record<AiFileTreeChangeStatus, string> = {\n added: 'text-success', modified: 'text-warning-accent', removed: 'text-destructive', renamed: 'text-info',\n};\nfunction pickFileIcon(name: string): LucideIcon {\n const ext = name.split('.').pop()?.toLowerCase() ?? '';\n if (['ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'json', 'css', 'scss', 'html', 'sh', 'py', 'rs', 'go'].includes(ext)) return FileCode;\n if (['md', 'mdx', 'txt'].includes(ext)) return FileText;\n return File;\n}\nfunction initialExpansion(nodes: readonly AiFileTreeNode[], depth = 0): string[] {\n return nodes.flatMap(node => [\n ...(node.kind === 'directory' && (node.defaultExpanded ?? depth < 1) ? [node.id] : []),\n ...initialExpansion(node.children ?? [], depth + 1),\n ]);\n}\nexport function AiFileTree({\n nodes, selectedId, onSelect, hideStatusLabels = false, indent, density = 'compact', disabled,\n expandedIds, defaultExpandedIds, onExpandedIdsChange, className, strings: stringsProp, ...props\n}: AiFileTreeProps) {\n const strings = useStrings(defaultAiFileTreeStrings, stringsProp);\n const [localExpanded, setLocalExpanded] = useState(() => defaultExpandedIds ?? initialExpansion(nodes));\n const expanded = expandedIds ?? localExpanded;\n const items = useMemo(() => {\n function map(nodes: readonly AiFileTreeNode[]): TreeNode<AiFileTreeNode>[] {\n return nodes.map(node => {\n const directory = node.kind === 'directory';\n const Icon = node.icon ?? (directory ? expanded.includes(node.id) ? FolderOpen : Folder : pickFileIcon(node.name));\n return {\n value: node.id, label: node.name, data: node, disabled: node.disabled,\n hasChildren: directory, children: directory ? map(node.children ?? []) : undefined,\n icon: <Icon aria-hidden=\"true\" className={cn('size-icon', node.status && statusIconClasses[node.status])} />,\n trailing: <Stack direction=\"horizontal\" gap=\"xs\" align=\"center\" className=\"shrink-0\">\n {node.status && !hideStatusLabels && <Badge tone={statusTones[node.status]} size=\"sm\" title={node.status}>{strings.statusLabels[node.status]}</Badge>}\n {node.trailing != null && <SecondaryValue size=\"xs\" className=\"tabular-nums\">{node.trailing}</SecondaryValue>}\n </Stack>,\n };\n });\n }\n return map(nodes);\n }, [nodes, expanded, hideStatusLabels, strings.statusLabels]);\n return <Tree {...props} aria-label={props['aria-label'] ?? strings.treeAria} items={items} selectedValues={selectedId === undefined ? [] : [selectedId]}\n expandedValues={expanded} branchActivation=\"toggle\" density={density} disabled={disabled} indent={indent}\n strings={{ expand: label => `${strings.expandAria}: ${label}`, collapse: label => `${strings.collapseAria}: ${label}` }}\n onExpandedValuesChange={(values, node) => {\n if (expandedIds === undefined) setLocalExpanded(values);\n onExpandedIdsChange?.(values, node.data!);\n }}\n onSelectedValuesChange={(_values, node) => { if (node.data?.kind === 'file') onSelect?.(node.data); }}\n renderLabel={node => <MonoValue size=\"inherit\" weight=\"regular\" className={cn('ai-file-tree--name text-inherit wrap-anywhere', node.data?.status === 'removed' && 'line-through')}>{node.label}</MonoValue>}\n className={cn('ai-file-tree--component', className)} />;\n}\nAiFileTree.displayName = 'AiFileTree';\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import { n as e, t } from "../../usage-card-VyJLUwRr.js";
3
+ export { t as UsageCard, e as defaultUsageCardStrings };