@mastra/playground-ui 66.0.1-alpha.0 → 66.1.0-alpha.1

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 (1023) hide show
  1. package/dist/{CodeEditor-DaJm0o69.cjs → CodeEditor-CJ9jC9lu.cjs} +2 -2
  2. package/dist/{CodeEditor-DaJm0o69.cjs.map → CodeEditor-CJ9jC9lu.cjs.map} +1 -1
  3. package/dist/{CodeEditor-CZC9DMKA.js → CodeEditor-CPVxj7WS.js} +2 -2
  4. package/dist/{CodeEditor-CZC9DMKA.js.map → CodeEditor-CPVxj7WS.js.map} +1 -1
  5. package/dist/{Composer-CFkNhdTm.cjs → Composer-BcueJvdX.cjs} +2 -2
  6. package/dist/{Composer-CFkNhdTm.cjs.map → Composer-BcueJvdX.cjs.map} +1 -1
  7. package/dist/{Composer-CLTgWusX.js → Composer-D1gF-0jZ.js} +2 -2
  8. package/dist/{Composer-CLTgWusX.js.map → Composer-D1gF-0jZ.js.map} +1 -1
  9. package/dist/{DataCodeSection-DbmVZNM5.cjs → DataCodeSection-CZRPsStI.cjs} +4 -4
  10. package/dist/{DataCodeSection-DbmVZNM5.cjs.map → DataCodeSection-CZRPsStI.cjs.map} +1 -1
  11. package/dist/{DataCodeSection-Bztq-SaU.js → DataCodeSection-Ckd47p_S.js} +4 -4
  12. package/dist/{DataCodeSection-Bztq-SaU.js.map → DataCodeSection-Ckd47p_S.js.map} +1 -1
  13. package/dist/{DataDetailsPanel-Dg_iUJ6L.cjs → DataDetailsPanel-DFhM9H5D.cjs} +3 -3
  14. package/dist/{DataDetailsPanel-Dg_iUJ6L.cjs.map → DataDetailsPanel-DFhM9H5D.cjs.map} +1 -1
  15. package/dist/{DataDetailsPanel-CvAIsV60.js → DataDetailsPanel-_CK0Huk6.js} +3 -3
  16. package/dist/{DataDetailsPanel-CvAIsV60.js.map → DataDetailsPanel-_CK0Huk6.js.map} +1 -1
  17. package/dist/{DataKeysAndValues-CHQcnHzv.cjs → DataKeysAndValues-DsH6AbAo.cjs} +6 -3
  18. package/dist/{DataKeysAndValues-CHQcnHzv.cjs.map → DataKeysAndValues-DsH6AbAo.cjs.map} +1 -1
  19. package/dist/{DataKeysAndValues-B2jquIjh.js → DataKeysAndValues-PwOmGxyp.js} +6 -3
  20. package/dist/{DataKeysAndValues-B2jquIjh.js.map → DataKeysAndValues-PwOmGxyp.js.map} +1 -1
  21. package/dist/{DataList-DlmchFgW.cjs → DataList-Cmk08jUV.cjs} +2 -2
  22. package/dist/{DataList-DlmchFgW.cjs.map → DataList-Cmk08jUV.cjs.map} +1 -1
  23. package/dist/{DataList-Bg533xtT.js → DataList-Ve3omCXT.js} +2 -2
  24. package/dist/{DataList-Bg533xtT.js.map → DataList-Ve3omCXT.js.map} +1 -1
  25. package/dist/{DataPanel-Ded_OhrA.cjs → DataPanel-C0Ll76Ne.cjs} +3 -3
  26. package/dist/{DataPanel-Ded_OhrA.cjs.map → DataPanel-C0Ll76Ne.cjs.map} +1 -1
  27. package/dist/{DataPanel-CfLkwH2X.js → DataPanel-CY1W5LHJ.js} +3 -3
  28. package/dist/{DataPanel-CfLkwH2X.js.map → DataPanel-CY1W5LHJ.js.map} +1 -1
  29. package/dist/{DateTimeRangePicker-BdnZI6g9.js → DateTimeRangePicker-ByMbLdom.js} +2 -2
  30. package/dist/{DateTimeRangePicker-BdnZI6g9.js.map → DateTimeRangePicker-ByMbLdom.js.map} +1 -1
  31. package/dist/{DateTimeRangePicker-BZrHuA3p.cjs → DateTimeRangePicker-DGbH5WOn.cjs} +2 -2
  32. package/dist/{DateTimeRangePicker-BZrHuA3p.cjs.map → DateTimeRangePicker-DGbH5WOn.cjs.map} +1 -1
  33. package/dist/{Dialog-CsKvRy5F.js → Dialog-CKtTR8h3.js} +2 -2
  34. package/dist/{Dialog-CsKvRy5F.js.map → Dialog-CKtTR8h3.js.map} +1 -1
  35. package/dist/{Dialog-CcdHS0vM.cjs → Dialog-CjaiCrkv.cjs} +2 -2
  36. package/dist/{Dialog-CcdHS0vM.cjs.map → Dialog-CjaiCrkv.cjs.map} +1 -1
  37. package/dist/{FilterBar-DELb-BMY.js → FilterBar-Dk3QEuT6.js} +3 -3
  38. package/dist/{FilterBar-DELb-BMY.js.map → FilterBar-Dk3QEuT6.js.map} +1 -1
  39. package/dist/{FilterBar-DGAF8V_g.cjs → FilterBar-gEvoWDXA.cjs} +3 -3
  40. package/dist/{FilterBar-DGAF8V_g.cjs.map → FilterBar-gEvoWDXA.cjs.map} +1 -1
  41. package/dist/{LogsDataList-DyVM83Rx.js → LogsDataList-Cslabh8K.js} +2 -2
  42. package/dist/{LogsDataList-DyVM83Rx.js.map → LogsDataList-Cslabh8K.js.map} +1 -1
  43. package/dist/{LogsDataList-DQ-3y06q.cjs → LogsDataList-DMmxAt_t.cjs} +2 -2
  44. package/dist/{LogsDataList-DQ-3y06q.cjs.map → LogsDataList-DMmxAt_t.cjs.map} +1 -1
  45. package/dist/{MarkdownRenderer-CMLH1J0C.cjs → MarkdownRenderer-BgqKfmRm.cjs} +4 -4
  46. package/dist/{MarkdownRenderer-CMLH1J0C.cjs.map → MarkdownRenderer-BgqKfmRm.cjs.map} +1 -1
  47. package/dist/{MarkdownRenderer-CRvDuEFW.js → MarkdownRenderer-DKCDXaLy.js} +4 -4
  48. package/dist/{MarkdownRenderer-CRvDuEFW.js.map → MarkdownRenderer-DKCDXaLy.js.map} +1 -1
  49. package/dist/{Message-HHJCqNIW.cjs → Message-BF9cpYaw.cjs} +2 -2
  50. package/dist/{Message-HHJCqNIW.cjs.map → Message-BF9cpYaw.cjs.map} +1 -1
  51. package/dist/{Message-Cl4sAJLl.js → Message-Bkf6Ro9H.js} +2 -2
  52. package/dist/{Message-Cl4sAJLl.js.map → Message-Bkf6Ro9H.js.map} +1 -1
  53. package/dist/{MetricsCard-eh9P4d2i.js → MetricsCard-C9GWgT58.js} +3 -3
  54. package/dist/{MetricsCard-eh9P4d2i.js.map → MetricsCard-C9GWgT58.js.map} +1 -1
  55. package/dist/{MetricsCard-B7A4Daun.cjs → MetricsCard-Dly_H3oX.cjs} +3 -3
  56. package/dist/{MetricsCard-B7A4Daun.cjs.map → MetricsCard-Dly_H3oX.cjs.map} +1 -1
  57. package/dist/{MetricsLineChart-CkuPY5an.cjs → MetricsLineChart-2m4LVL1N.cjs} +48 -43
  58. package/dist/MetricsLineChart-2m4LVL1N.cjs.map +1 -0
  59. package/dist/{MetricsLineChart-B9nzVOUV.js → MetricsLineChart-DKzuRU2q.js} +49 -44
  60. package/dist/MetricsLineChart-DKzuRU2q.js.map +1 -0
  61. package/dist/{MetricsStackedBarChart-D-o5Ocsv.js → MetricsStackedBarChart-DJB4aByt.js} +48 -26
  62. package/dist/MetricsStackedBarChart-DJB4aByt.js.map +1 -0
  63. package/dist/{MetricsStackedBarChart-EsJMtxYG.cjs → MetricsStackedBarChart-NATtwA_W.cjs} +47 -25
  64. package/dist/MetricsStackedBarChart-NATtwA_W.cjs.map +1 -0
  65. package/dist/MetricsTable-CRPeLHe1.js +292 -0
  66. package/dist/MetricsTable-CRPeLHe1.js.map +1 -0
  67. package/dist/MetricsTable-D-aZf3dk.cjs +297 -0
  68. package/dist/MetricsTable-D-aZf3dk.cjs.map +1 -0
  69. package/dist/{PageLayout-DSHnu66K.js → PageLayout-CyM_Op3c.js} +2 -2
  70. package/dist/{PageLayout-DSHnu66K.js.map → PageLayout-CyM_Op3c.js.map} +1 -1
  71. package/dist/{PageLayout-UfRYZurn.cjs → PageLayout-DFRzcnkf.cjs} +2 -2
  72. package/dist/{PageLayout-UfRYZurn.cjs.map → PageLayout-DFRzcnkf.cjs.map} +1 -1
  73. package/dist/ShareBar-3Z5np-NY.cjs +456 -0
  74. package/dist/ShareBar-3Z5np-NY.cjs.map +1 -0
  75. package/dist/ShareBar-D6dWWl4C.js +451 -0
  76. package/dist/ShareBar-D6dWWl4C.js.map +1 -0
  77. package/dist/{Workflow-BTl4BP2P.js → Workflow-BVWvgDmI.js} +6 -6
  78. package/dist/{Workflow-BTl4BP2P.js.map → Workflow-BVWvgDmI.js.map} +1 -1
  79. package/dist/{Workflow-C2-hqh4S.cjs → Workflow-BeF6pIO9.cjs} +6 -6
  80. package/dist/{Workflow-C2-hqh4S.cjs.map → Workflow-BeF6pIO9.cjs.map} +1 -1
  81. package/dist/{activity-B4CnOYnh.cjs → activity-QyLJcBKc.cjs} +82 -40
  82. package/dist/activity-QyLJcBKc.cjs.map +1 -0
  83. package/dist/{activity-Dc-NsOSz.js → activity-ihrl0JtH.js} +71 -41
  84. package/dist/activity-ihrl0JtH.js.map +1 -0
  85. package/dist/chart-plot.css +32 -0
  86. package/dist/{combobox-Bi1vnOZt.cjs → combobox-C-E7_q4j.cjs} +9 -18
  87. package/dist/combobox-C-E7_q4j.cjs.map +1 -0
  88. package/dist/{combobox-BgQrNpCO.js → combobox-CDS2pBqz.js} +9 -18
  89. package/dist/combobox-CDS2pBqz.js.map +1 -0
  90. package/dist/components/AlertDialog.cjs.js +1 -1
  91. package/dist/components/AlertDialog.es.js +1 -1
  92. package/dist/components/CodeBlock.cjs.js +3 -3
  93. package/dist/components/CodeBlock.es.js +3 -3
  94. package/dist/components/CodeEditor.cjs.js +1 -1
  95. package/dist/components/CodeEditor.es.js +1 -1
  96. package/dist/components/Combobox.cjs.js +1 -1
  97. package/dist/components/Combobox.es.js +1 -1
  98. package/dist/components/Command.cjs.js +8 -14
  99. package/dist/components/Command.cjs.js.map +1 -1
  100. package/dist/components/Command.es.js +8 -14
  101. package/dist/components/Command.es.js.map +1 -1
  102. package/dist/components/CommandPalette.cjs.js +2 -4
  103. package/dist/components/CommandPalette.cjs.js.map +1 -1
  104. package/dist/components/CommandPalette.es.js +2 -4
  105. package/dist/components/CommandPalette.es.js.map +1 -1
  106. package/dist/components/Composer.cjs.js +1 -1
  107. package/dist/components/Composer.es.js +1 -1
  108. package/dist/components/ContextMenu.cjs.js +1 -1
  109. package/dist/components/ContextMenu.es.js +1 -1
  110. package/dist/components/DataCodeSection.cjs.js +1 -1
  111. package/dist/components/DataCodeSection.es.js +1 -1
  112. package/dist/components/DataDetailsPanel.cjs.js +1 -1
  113. package/dist/components/DataDetailsPanel.es.js +1 -1
  114. package/dist/components/DataKeysAndValues.cjs.js +1 -1
  115. package/dist/components/DataKeysAndValues.es.js +1 -1
  116. package/dist/components/DataList.cjs.js +3 -3
  117. package/dist/components/DataList.es.js +3 -3
  118. package/dist/components/DataPanel.cjs.js +1 -1
  119. package/dist/components/DataPanel.es.js +1 -1
  120. package/dist/components/DateTimePicker.cjs.js +1 -1
  121. package/dist/components/DateTimePicker.es.js +1 -1
  122. package/dist/components/DateTimeRangePicker.cjs.js +1 -1
  123. package/dist/components/DateTimeRangePicker.es.js +1 -1
  124. package/dist/components/Dialog.cjs.js +1 -1
  125. package/dist/components/Dialog.es.js +1 -1
  126. package/dist/components/DropdownMenu.cjs.js +1 -1
  127. package/dist/components/DropdownMenu.es.js +1 -1
  128. package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
  129. package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
  130. package/dist/components/FilterBar.cjs.js +2 -2
  131. package/dist/components/FilterBar.es.js +2 -2
  132. package/dist/components/FormFieldBlocks.cjs.js +1 -1
  133. package/dist/components/FormFieldBlocks.es.js +1 -1
  134. package/dist/components/JSONSchemaForm.cjs.js +1 -1
  135. package/dist/components/JSONSchemaForm.es.js +1 -1
  136. package/dist/components/LogsDataList.cjs.js +2 -2
  137. package/dist/components/LogsDataList.es.js +2 -2
  138. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  139. package/dist/components/MarkdownRenderer.es.js +1 -1
  140. package/dist/components/Message.cjs.js +1 -1
  141. package/dist/components/Message.es.js +1 -1
  142. package/dist/components/MetricsCard.cjs.js +1 -1
  143. package/dist/components/MetricsCard.es.js +1 -1
  144. package/dist/components/MetricsLineChart.cjs.js +1 -1
  145. package/dist/components/MetricsLineChart.es.js +1 -1
  146. package/dist/components/MetricsStackedBarChart.cjs.js +1 -1
  147. package/dist/components/MetricsStackedBarChart.es.js +1 -1
  148. package/dist/components/MetricsTable.cjs.js +2 -142
  149. package/dist/components/MetricsTable.es.js +1 -142
  150. package/dist/components/PageLayout.cjs.js +1 -1
  151. package/dist/components/PageLayout.es.js +1 -1
  152. package/dist/components/Pagination.cjs.js +1 -1
  153. package/dist/components/Pagination.es.js +1 -1
  154. package/dist/components/PropertyFilter.cjs.js +47 -54
  155. package/dist/components/PropertyFilter.cjs.js.map +1 -1
  156. package/dist/components/PropertyFilter.es.js +49 -56
  157. package/dist/components/PropertyFilter.es.js.map +1 -1
  158. package/dist/components/RuleBuilder.cjs.js +1 -1
  159. package/dist/components/RuleBuilder.es.js +1 -1
  160. package/dist/components/SavedViews.cjs.js +3 -3
  161. package/dist/components/SavedViews.es.js +3 -3
  162. package/dist/components/ScrollArea.cjs.js +1 -1
  163. package/dist/components/ScrollArea.es.js +1 -1
  164. package/dist/components/SegmentedName.cjs.js +19 -0
  165. package/dist/components/SegmentedName.cjs.js.map +1 -0
  166. package/dist/components/SegmentedName.d.ts +1 -0
  167. package/dist/components/SegmentedName.es.js +18 -0
  168. package/dist/components/SegmentedName.es.js.map +1 -0
  169. package/dist/components/Select.cjs.js +1 -1
  170. package/dist/components/Select.es.js +1 -1
  171. package/dist/components/SeriesMark.cjs.js +16 -8
  172. package/dist/components/SeriesMark.cjs.js.map +1 -1
  173. package/dist/components/SeriesMark.es.js +16 -8
  174. package/dist/components/SeriesMark.es.js.map +1 -1
  175. package/dist/components/ShareBar.cjs.js +3 -0
  176. package/dist/components/ShareBar.d.ts +1 -0
  177. package/dist/components/ShareBar.es.js +1 -0
  178. package/dist/components/SideDialog.cjs.js +3 -3
  179. package/dist/components/SideDialog.es.js +3 -3
  180. package/dist/components/Sidebar.cjs.js +6 -6
  181. package/dist/components/Sidebar.es.js +6 -6
  182. package/dist/components/Table.cjs.js +3 -28
  183. package/dist/components/Table.cjs.js.map +1 -1
  184. package/dist/components/Table.es.js +1 -26
  185. package/dist/components/Table.es.js.map +1 -1
  186. package/dist/components/Tabs.cjs.js +2 -2
  187. package/dist/components/Tabs.es.js +2 -2
  188. package/dist/components/ThreadRail.cjs.js +1 -1
  189. package/dist/components/ThreadRail.es.js +1 -1
  190. package/dist/components/Workflow.cjs.js +1 -1
  191. package/dist/components/Workflow.es.js +1 -1
  192. package/dist/components/ai/activity.cjs.js +3 -1
  193. package/dist/components/ai/activity.es.js +1 -1
  194. package/dist/components/ai/plan.cjs.js +2 -2
  195. package/dist/components/ai/plan.es.js +2 -2
  196. package/dist/components/ai/task-list.cjs.js +1 -1
  197. package/dist/components/ai/task-list.es.js +1 -1
  198. package/dist/components/ai/tool-approval.cjs.js +1 -1
  199. package/dist/components/ai/tool-approval.es.js +1 -1
  200. package/dist/components/ai/tool-call.cjs.js +2 -1
  201. package/dist/components/ai/tool-call.es.js +2 -2
  202. package/dist/{context-menu-BHhHokFj.cjs → context-menu-DTFPCyae.cjs} +7 -16
  203. package/dist/context-menu-DTFPCyae.cjs.map +1 -0
  204. package/dist/{context-menu-DuBHimPI.js → context-menu-Dv0NU0oM.js} +7 -16
  205. package/dist/context-menu-Dv0NU0oM.js.map +1 -0
  206. package/dist/{data-list-v93EXSHc.cjs → data-list-BkimqE_P.cjs} +14 -24
  207. package/dist/data-list-BkimqE_P.cjs.map +1 -0
  208. package/dist/{data-list-DjSo5V1C.js → data-list-evmf5xWI.js} +14 -24
  209. package/dist/data-list-evmf5xWI.js.map +1 -0
  210. package/dist/domains/chat/activity/activity-disclosure-provider.cjs.js +17 -0
  211. package/dist/domains/chat/activity/activity-disclosure-provider.cjs.js.map +1 -0
  212. package/dist/domains/chat/activity/activity-disclosure-provider.d.ts +1 -0
  213. package/dist/domains/chat/activity/activity-disclosure-provider.es.js +16 -0
  214. package/dist/domains/chat/activity/activity-disclosure-provider.es.js.map +1 -0
  215. package/dist/domains/chat/activity/activity-stretch-line.cjs.js +60 -0
  216. package/dist/domains/chat/activity/activity-stretch-line.cjs.js.map +1 -0
  217. package/dist/domains/chat/activity/activity-stretch-line.d.ts +1 -0
  218. package/dist/domains/chat/activity/activity-stretch-line.es.js +59 -0
  219. package/dist/domains/chat/activity/activity-stretch-line.es.js.map +1 -0
  220. package/dist/domains/chat/activity/components/activity-fold.cjs.js +65 -0
  221. package/dist/domains/chat/activity/components/activity-fold.cjs.js.map +1 -0
  222. package/dist/domains/chat/activity/components/activity-fold.d.ts +1 -0
  223. package/dist/domains/chat/activity/components/activity-fold.es.js +64 -0
  224. package/dist/domains/chat/activity/components/activity-fold.es.js.map +1 -0
  225. package/dist/domains/chat/activity/components/activity-timed-trigger.cjs.js +29 -0
  226. package/dist/domains/chat/activity/components/activity-timed-trigger.cjs.js.map +1 -0
  227. package/dist/domains/chat/activity/components/activity-timed-trigger.d.ts +1 -0
  228. package/dist/domains/chat/activity/components/activity-timed-trigger.es.js +28 -0
  229. package/dist/domains/chat/activity/components/activity-timed-trigger.es.js.map +1 -0
  230. package/dist/domains/chat/activity/components/calls-group.cjs.js +30 -0
  231. package/dist/domains/chat/activity/components/calls-group.cjs.js.map +1 -0
  232. package/dist/domains/chat/activity/components/calls-group.d.ts +1 -0
  233. package/dist/domains/chat/activity/components/calls-group.es.js +29 -0
  234. package/dist/domains/chat/activity/components/calls-group.es.js.map +1 -0
  235. package/dist/domains/chat/activity/components/calls-panel.cjs.js +36 -0
  236. package/dist/domains/chat/activity/components/calls-panel.cjs.js.map +1 -0
  237. package/dist/domains/chat/activity/components/calls-panel.d.ts +1 -0
  238. package/dist/domains/chat/activity/components/calls-panel.es.js +35 -0
  239. package/dist/domains/chat/activity/components/calls-panel.es.js.map +1 -0
  240. package/dist/domains/chat/activity/components/reading-row.cjs.js +50 -0
  241. package/dist/domains/chat/activity/components/reading-row.cjs.js.map +1 -0
  242. package/dist/domains/chat/activity/components/reading-row.d.ts +1 -0
  243. package/dist/domains/chat/activity/components/reading-row.es.js +47 -0
  244. package/dist/domains/chat/activity/components/reading-row.es.js.map +1 -0
  245. package/dist/domains/chat/activity/components/stretch-content.cjs.js +37 -0
  246. package/dist/domains/chat/activity/components/stretch-content.cjs.js.map +1 -0
  247. package/dist/domains/chat/activity/components/stretch-content.d.ts +1 -0
  248. package/dist/domains/chat/activity/components/stretch-content.es.js +36 -0
  249. package/dist/domains/chat/activity/components/stretch-content.es.js.map +1 -0
  250. package/dist/domains/chat/activity/components/stretch-segment.cjs.js +20 -0
  251. package/dist/domains/chat/activity/components/stretch-segment.cjs.js.map +1 -0
  252. package/dist/domains/chat/activity/components/stretch-segment.d.ts +1 -0
  253. package/dist/domains/chat/activity/components/stretch-segment.es.js +19 -0
  254. package/dist/domains/chat/activity/components/stretch-segment.es.js.map +1 -0
  255. package/dist/domains/chat/activity/components/stretch-thought.cjs.js +14 -0
  256. package/dist/domains/chat/activity/components/stretch-thought.cjs.js.map +1 -0
  257. package/dist/domains/chat/activity/components/stretch-thought.d.ts +1 -0
  258. package/dist/domains/chat/activity/components/stretch-thought.es.js +13 -0
  259. package/dist/domains/chat/activity/components/stretch-thought.es.js.map +1 -0
  260. package/dist/domains/chat/activity/model/activity-members.cjs.js +0 -0
  261. package/dist/domains/chat/activity/model/activity-members.d.ts +1 -0
  262. package/dist/domains/chat/activity/model/activity-members.es.js +0 -0
  263. package/dist/domains/chat/activity/model/activity-segments.cjs.js +22 -0
  264. package/dist/domains/chat/activity/model/activity-segments.cjs.js.map +1 -0
  265. package/dist/domains/chat/activity/model/activity-segments.d.ts +1 -0
  266. package/dist/domains/chat/activity/model/activity-segments.es.js +21 -0
  267. package/dist/domains/chat/activity/model/activity-segments.es.js.map +1 -0
  268. package/dist/domains/chat/activity/model/activity-words.cjs.js +94 -0
  269. package/dist/domains/chat/activity/model/activity-words.cjs.js.map +1 -0
  270. package/dist/domains/chat/activity/model/activity-words.d.ts +1 -0
  271. package/dist/domains/chat/activity/model/activity-words.es.js +89 -0
  272. package/dist/domains/chat/activity/model/activity-words.es.js.map +1 -0
  273. package/dist/domains/chat/activity/model/disclosure-store.cjs.js +54 -0
  274. package/dist/domains/chat/activity/model/disclosure-store.cjs.js.map +1 -0
  275. package/dist/domains/chat/activity/model/disclosure-store.d.ts +1 -0
  276. package/dist/domains/chat/activity/model/disclosure-store.es.js +53 -0
  277. package/dist/domains/chat/activity/model/disclosure-store.es.js.map +1 -0
  278. package/dist/domains/chat/activity/use-activity-disclosure.cjs.js +32 -0
  279. package/dist/domains/chat/activity/use-activity-disclosure.cjs.js.map +1 -0
  280. package/dist/domains/chat/activity/use-activity-disclosure.d.ts +1 -0
  281. package/dist/domains/chat/activity/use-activity-disclosure.es.js +28 -0
  282. package/dist/domains/chat/activity/use-activity-disclosure.es.js.map +1 -0
  283. package/dist/domains/chat/activity.cjs.js +9 -0
  284. package/dist/domains/chat/activity.d.ts +1 -0
  285. package/dist/domains/chat/activity.es.js +5 -0
  286. package/dist/domains/chat/attachments/attachment-preview-dialog.cjs.js +1 -1
  287. package/dist/domains/chat/attachments/attachment-preview-dialog.es.js +1 -1
  288. package/dist/domains/chat/attachments/composer-attachment-list.cjs.js +2 -2
  289. package/dist/domains/chat/attachments/composer-attachment-list.es.js +2 -2
  290. package/dist/domains/chat/attachments/composer-attachment.cjs.js +1 -1
  291. package/dist/domains/chat/attachments/composer-attachment.es.js +1 -1
  292. package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
  293. package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
  294. package/dist/domains/chat/components/network-choice-metadata-dialog.cjs.js +2 -2
  295. package/dist/domains/chat/components/network-choice-metadata-dialog.es.js +2 -2
  296. package/dist/domains/chat/messages/assistant-message-actions.cjs.js +1 -1
  297. package/dist/domains/chat/messages/assistant-message-actions.es.js +1 -1
  298. package/dist/domains/chat/messages/dataset-save-action.cjs.js +3 -3
  299. package/dist/domains/chat/messages/dataset-save-action.es.js +3 -3
  300. package/dist/domains/chat/messages/message-row.cjs.js +4 -4
  301. package/dist/domains/chat/messages/message-row.es.js +4 -4
  302. package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
  303. package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
  304. package/dist/domains/chat/messages/reasoning-content.cjs.js +1 -1
  305. package/dist/domains/chat/messages/reasoning-content.es.js +1 -1
  306. package/dist/domains/chat/messages/renderers/message-text.cjs.js +1 -1
  307. package/dist/domains/chat/messages/renderers/message-text.es.js +1 -1
  308. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js +1 -1
  309. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js +1 -1
  310. package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
  311. package/dist/domains/chat/messages/signal-badge.es.js +1 -1
  312. package/dist/domains/chat/messages/skill-message.cjs.js +3 -3
  313. package/dist/domains/chat/messages/skill-message.es.js +3 -3
  314. package/dist/domains/chat/messages/system-reminder-badge.cjs.js +1 -1
  315. package/dist/domains/chat/messages/system-reminder-badge.es.js +1 -1
  316. package/dist/domains/chat/messages/tripwire-notice.cjs.js +1 -1
  317. package/dist/domains/chat/messages/tripwire-notice.es.js +1 -1
  318. package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
  319. package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
  320. package/dist/domains/chat/tools/badges/agent-badge.cjs.js +1 -1
  321. package/dist/domains/chat/tools/badges/agent-badge.es.js +1 -1
  322. package/dist/domains/chat/tools/badges/background-task-metadata-dialog.cjs.js +2 -2
  323. package/dist/domains/chat/tools/badges/background-task-metadata-dialog.es.js +2 -2
  324. package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js +1 -1
  325. package/dist/domains/chat/tools/badges/code-mode-badge.es.js +1 -1
  326. package/dist/domains/chat/tools/badges/file-tree-badge.cjs.js +1 -1
  327. package/dist/domains/chat/tools/badges/file-tree-badge.es.js +1 -1
  328. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +2 -2
  329. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +2 -2
  330. package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js +2 -2
  331. package/dist/domains/chat/tools/badges/observation-marker-details.es.js +2 -2
  332. package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
  333. package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
  334. package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +1 -1
  335. package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +1 -1
  336. package/dist/domains/chat/tools/badges/tool-approval-badge.cjs.js +1 -1
  337. package/dist/domains/chat/tools/badges/tool-approval-badge.es.js +1 -1
  338. package/dist/domains/chat/tools/badges/tool-badge.cjs.js +3 -3
  339. package/dist/domains/chat/tools/badges/tool-badge.es.js +3 -3
  340. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +2 -2
  341. package/dist/domains/chat/tools/badges/workflow-badge.es.js +2 -2
  342. package/dist/domains/chat/tools/connect-prompt-tool.cjs.js +1 -1
  343. package/dist/domains/chat/tools/connect-prompt-tool.es.js +1 -1
  344. package/dist/domains/chat/tools/tool-card-kind.cjs.js +1 -1
  345. package/dist/domains/chat/tools/tool-card-kind.es.js +1 -1
  346. package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
  347. package/dist/domains/chat/tools/tool-card.es.js +1 -1
  348. package/dist/domains/chat/tools/tool-groups.cjs.js +1 -1
  349. package/dist/domains/chat/tools/tool-groups.es.js +1 -1
  350. package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.cjs.js +2 -2
  351. package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.es.js +2 -2
  352. package/dist/domains/datasets/components/add-dataset-item-dialog/dataset-picker.cjs.js +1 -1
  353. package/dist/domains/datasets/components/add-dataset-item-dialog/dataset-picker.es.js +1 -1
  354. package/dist/domains/datasets/components/add-dataset-item-dialog/trajectory-editor.cjs.js +2 -2
  355. package/dist/domains/datasets/components/add-dataset-item-dialog/trajectory-editor.es.js +2 -2
  356. package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +3 -3
  357. package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +3 -3
  358. package/dist/domains/llm/model-name-parts.cjs.js +17 -0
  359. package/dist/domains/llm/model-name-parts.cjs.js.map +1 -0
  360. package/dist/domains/llm/model-name-parts.d.ts +1 -0
  361. package/dist/domains/llm/model-name-parts.es.js +16 -0
  362. package/dist/domains/llm/model-name-parts.es.js.map +1 -0
  363. package/dist/domains/llm/provider-mark.cjs.js +21 -0
  364. package/dist/domains/llm/provider-mark.cjs.js.map +1 -0
  365. package/dist/domains/llm/provider-mark.d.ts +1 -0
  366. package/dist/domains/llm/provider-mark.es.js +20 -0
  367. package/dist/domains/llm/provider-mark.es.js.map +1 -0
  368. package/dist/domains/llm.cjs.js +4 -0
  369. package/dist/domains/llm.es.js +3 -1
  370. package/dist/domains/logs/components/log-data-panel.cjs.js +3 -3
  371. package/dist/domains/logs/components/log-data-panel.es.js +3 -3
  372. package/dist/domains/logs/components/logs-list-view.cjs.js +2 -2
  373. package/dist/domains/logs/components/logs-list-view.es.js +2 -2
  374. package/dist/domains/logs/components/logs-toolbar.cjs.js +1 -1
  375. package/dist/domains/logs/components/logs-toolbar.es.js +1 -1
  376. package/dist/domains/metrics/components/agent-runs-card.cjs.js +3 -3
  377. package/dist/domains/metrics/components/agent-runs-card.es.js +3 -3
  378. package/dist/domains/metrics/components/breakdown/breakdown-figure.cjs.js +17 -0
  379. package/dist/domains/metrics/components/breakdown/breakdown-figure.cjs.js.map +1 -0
  380. package/dist/domains/metrics/components/breakdown/breakdown-figure.d.ts +1 -0
  381. package/dist/domains/metrics/components/breakdown/breakdown-figure.es.js +16 -0
  382. package/dist/domains/metrics/components/breakdown/breakdown-figure.es.js.map +1 -0
  383. package/dist/domains/metrics/components/breakdown/breakdown-frame.cjs.js +1 -1
  384. package/dist/domains/metrics/components/breakdown/breakdown-frame.es.js +1 -1
  385. package/dist/domains/metrics/components/breakdown/breakdown-row-mark.cjs.js +29 -0
  386. package/dist/domains/metrics/components/breakdown/breakdown-row-mark.cjs.js.map +1 -0
  387. package/dist/domains/metrics/components/breakdown/breakdown-row-mark.d.ts +1 -0
  388. package/dist/domains/metrics/components/breakdown/breakdown-row-mark.es.js +28 -0
  389. package/dist/domains/metrics/components/breakdown/breakdown-row-mark.es.js.map +1 -0
  390. package/dist/domains/metrics/components/breakdown/breakdown-row-name.cjs.js +28 -0
  391. package/dist/domains/metrics/components/breakdown/breakdown-row-name.cjs.js.map +1 -0
  392. package/dist/domains/metrics/components/breakdown/breakdown-row-name.d.ts +1 -0
  393. package/dist/domains/metrics/components/breakdown/breakdown-row-name.es.js +27 -0
  394. package/dist/domains/metrics/components/breakdown/breakdown-row-name.es.js.map +1 -0
  395. package/dist/domains/metrics/components/breakdown/breakdown-tab-body.cjs.js +1 -1
  396. package/dist/domains/metrics/components/breakdown/breakdown-tab-body.es.js +1 -1
  397. package/dist/domains/metrics/components/breakdown/breakdown-table.cjs.js +129 -104
  398. package/dist/domains/metrics/components/breakdown/breakdown-table.cjs.js.map +1 -1
  399. package/dist/domains/metrics/components/breakdown/breakdown-table.es.js +130 -105
  400. package/dist/domains/metrics/components/breakdown/breakdown-table.es.js.map +1 -1
  401. package/dist/domains/metrics/components/breakdown/breakdown-text.cjs.js +18 -0
  402. package/dist/domains/metrics/components/breakdown/breakdown-text.cjs.js.map +1 -0
  403. package/dist/domains/metrics/components/breakdown/breakdown-text.d.ts +1 -0
  404. package/dist/domains/metrics/components/breakdown/breakdown-text.es.js +17 -0
  405. package/dist/domains/metrics/components/breakdown/breakdown-text.es.js.map +1 -0
  406. package/dist/domains/metrics/components/breakdown-card.cjs.js +1 -1
  407. package/dist/domains/metrics/components/breakdown-card.es.js +1 -1
  408. package/dist/domains/metrics/components/chart-area.cjs.js +1 -1
  409. package/dist/domains/metrics/components/chart-area.es.js +1 -1
  410. package/dist/domains/metrics/components/chart-card-error.cjs.js +1 -1
  411. package/dist/domains/metrics/components/chart-card-error.es.js +1 -1
  412. package/dist/domains/metrics/components/chart-card.cjs.js +1 -1
  413. package/dist/domains/metrics/components/chart-card.es.js +1 -1
  414. package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
  415. package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
  416. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js +2 -2
  417. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js +2 -2
  418. package/dist/domains/metrics/components/failure-rate-card.cjs.js +2 -2
  419. package/dist/domains/metrics/components/failure-rate-card.es.js +2 -2
  420. package/dist/domains/metrics/components/latency-card.cjs.js +2 -2
  421. package/dist/domains/metrics/components/latency-card.es.js +2 -2
  422. package/dist/domains/metrics/components/scores-card.cjs.js +2 -2
  423. package/dist/domains/metrics/components/scores-card.es.js +2 -2
  424. package/dist/domains/metrics/components/token-usage-card.cjs.js +3 -3
  425. package/dist/domains/metrics/components/token-usage-card.es.js +3 -3
  426. package/dist/domains/metrics/components/trace-aggregate-card.cjs.js +1 -1
  427. package/dist/domains/metrics/components/trace-aggregate-card.es.js +1 -1
  428. package/dist/domains/metrics/components/trace-volume-card.cjs.js +5 -9
  429. package/dist/domains/metrics/components/trace-volume-card.cjs.js.map +1 -1
  430. package/dist/domains/metrics/components/trace-volume-card.es.js +5 -9
  431. package/dist/domains/metrics/components/trace-volume-card.es.js.map +1 -1
  432. package/dist/domains/metrics/components/usage-card.cjs.js +5 -9
  433. package/dist/domains/metrics/components/usage-card.cjs.js.map +1 -1
  434. package/dist/domains/metrics/components/usage-card.es.js +5 -9
  435. package/dist/domains/metrics/components/usage-card.es.js.map +1 -1
  436. package/dist/domains/metrics/lib/breakdown-table.cjs.js +0 -10
  437. package/dist/domains/metrics/lib/breakdown-table.cjs.js.map +1 -1
  438. package/dist/domains/metrics/lib/breakdown-table.es.js +1 -10
  439. package/dist/domains/metrics/lib/breakdown-table.es.js.map +1 -1
  440. package/dist/domains/metrics/lib/breakdown.cjs.js +6 -2
  441. package/dist/domains/metrics/lib/breakdown.cjs.js.map +1 -1
  442. package/dist/domains/metrics/lib/breakdown.es.js +6 -2
  443. package/dist/domains/metrics/lib/breakdown.es.js.map +1 -1
  444. package/dist/domains/observability/components/observability-histogram.cjs.js +79 -0
  445. package/dist/domains/observability/components/observability-histogram.cjs.js.map +1 -0
  446. package/dist/domains/observability/components/observability-histogram.d.ts +1 -0
  447. package/dist/domains/observability/components/observability-histogram.es.js +78 -0
  448. package/dist/domains/observability/components/observability-histogram.es.js.map +1 -0
  449. package/dist/domains/observability/components/observability-list-body.cjs.js +12 -7
  450. package/dist/domains/observability/components/observability-list-body.cjs.js.map +1 -1
  451. package/dist/domains/observability/components/observability-list-body.es.js +12 -7
  452. package/dist/domains/observability/components/observability-list-body.es.js.map +1 -1
  453. package/dist/domains/observability/components/observability-page-layout.cjs.js +1 -1
  454. package/dist/domains/observability/components/observability-page-layout.es.js +1 -1
  455. package/dist/domains/observability/lib/histogram-buckets.cjs.js +174 -0
  456. package/dist/domains/observability/lib/histogram-buckets.cjs.js.map +1 -0
  457. package/dist/domains/observability/lib/histogram-buckets.d.ts +1 -0
  458. package/dist/domains/observability/lib/histogram-buckets.es.js +168 -0
  459. package/dist/domains/observability/lib/histogram-buckets.es.js.map +1 -0
  460. package/dist/domains/scores/components/score-data-panel.cjs.js +2 -2
  461. package/dist/domains/scores/components/score-data-panel.es.js +2 -2
  462. package/dist/domains/scores/components/span-scoring.cjs.js +2 -2
  463. package/dist/domains/scores/components/span-scoring.es.js +2 -2
  464. package/dist/domains/scores/components/trace-scores-list.cjs.js +2 -2
  465. package/dist/domains/scores/components/trace-scores-list.es.js +2 -2
  466. package/dist/domains/scores/components/trace-scores-tab.cjs.js +1 -1
  467. package/dist/domains/scores/components/trace-scores-tab.es.js +1 -1
  468. package/dist/domains/skills/skill-simple-form.cjs.js +58 -0
  469. package/dist/domains/skills/skill-simple-form.cjs.js.map +1 -0
  470. package/dist/domains/skills/skill-simple-form.d.ts +1 -0
  471. package/dist/domains/skills/skill-simple-form.es.js +57 -0
  472. package/dist/domains/skills/skill-simple-form.es.js.map +1 -0
  473. package/dist/domains/spans/components/spans-explorer-body.cjs.js +28 -19
  474. package/dist/domains/spans/components/spans-explorer-body.cjs.js.map +1 -1
  475. package/dist/domains/spans/components/spans-explorer-body.es.js +28 -19
  476. package/dist/domains/spans/components/spans-explorer-body.es.js.map +1 -1
  477. package/dist/domains/spans/components/spans-explorer-histogram.cjs.js +43 -0
  478. package/dist/domains/spans/components/spans-explorer-histogram.cjs.js.map +1 -0
  479. package/dist/domains/spans/components/spans-explorer-histogram.d.ts +1 -0
  480. package/dist/domains/spans/components/spans-explorer-histogram.es.js +42 -0
  481. package/dist/domains/spans/components/spans-explorer-histogram.es.js.map +1 -0
  482. package/dist/domains/spans/components/spans-filter-bar.cjs.js +4 -2
  483. package/dist/domains/spans/components/spans-filter-bar.cjs.js.map +1 -1
  484. package/dist/domains/spans/components/spans-filter-bar.es.js +4 -2
  485. package/dist/domains/spans/components/spans-filter-bar.es.js.map +1 -1
  486. package/dist/domains/threads/components/threads-filter-bar.cjs.js +4 -2
  487. package/dist/domains/threads/components/threads-filter-bar.cjs.js.map +1 -1
  488. package/dist/domains/threads/components/threads-filter-bar.es.js +4 -2
  489. package/dist/domains/threads/components/threads-filter-bar.es.js.map +1 -1
  490. package/dist/domains/traces/components/feedback-thread.cjs.js +1 -1
  491. package/dist/domains/traces/components/feedback-thread.es.js +1 -1
  492. package/dist/domains/traces/components/span-data-panel-view.cjs.js +512 -221
  493. package/dist/domains/traces/components/span-data-panel-view.cjs.js.map +1 -1
  494. package/dist/domains/traces/components/span-data-panel-view.es.js +520 -229
  495. package/dist/domains/traces/components/span-data-panel-view.es.js.map +1 -1
  496. package/dist/domains/traces/components/span-details-view.cjs.js +1 -1
  497. package/dist/domains/traces/components/span-details-view.es.js +1 -1
  498. package/dist/domains/traces/components/span-outcome.cjs.js +7 -36
  499. package/dist/domains/traces/components/span-outcome.cjs.js.map +1 -1
  500. package/dist/domains/traces/components/span-outcome.es.js +8 -37
  501. package/dist/domains/traces/components/span-outcome.es.js.map +1 -1
  502. package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +2 -2
  503. package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +2 -2
  504. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +2 -2
  505. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +2 -2
  506. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +3 -3
  507. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +3 -3
  508. package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js +56 -20
  509. package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js.map +1 -1
  510. package/dist/domains/traces/components/span-payload/span-payload-json.es.js +57 -21
  511. package/dist/domains/traces/components/span-payload/span-payload-json.es.js.map +1 -1
  512. package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +3 -3
  513. package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +3 -3
  514. package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
  515. package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
  516. package/dist/domains/traces/components/span-payload/span-payload-processor-fields.cjs.js +135 -0
  517. package/dist/domains/traces/components/span-payload/span-payload-processor-fields.cjs.js.map +1 -0
  518. package/dist/domains/traces/components/span-payload/span-payload-processor-fields.d.ts +1 -0
  519. package/dist/domains/traces/components/span-payload/span-payload-processor-fields.es.js +129 -0
  520. package/dist/domains/traces/components/span-payload/span-payload-processor-fields.es.js.map +1 -0
  521. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +16 -111
  522. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js.map +1 -1
  523. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +15 -110
  524. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js.map +1 -1
  525. package/dist/domains/traces/components/span-payload/span-payload-registry.cjs.js +12 -3
  526. package/dist/domains/traces/components/span-payload/span-payload-registry.cjs.js.map +1 -1
  527. package/dist/domains/traces/components/span-payload/span-payload-registry.es.js +12 -3
  528. package/dist/domains/traces/components/span-payload/span-payload-registry.es.js.map +1 -1
  529. package/dist/domains/traces/components/span-payload/span-payload-section.cjs.js +1 -1
  530. package/dist/domains/traces/components/span-payload/span-payload-section.es.js +1 -1
  531. package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +1 -1
  532. package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +1 -1
  533. package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js +1 -1
  534. package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js +1 -1
  535. package/dist/domains/traces/components/span-payload/span-processor-mutations.cjs.js +1 -1
  536. package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js +1 -1
  537. package/dist/domains/traces/components/span-payload/span-signal-details.cjs.js +1 -1
  538. package/dist/domains/traces/components/span-payload/span-signal-details.es.js +1 -1
  539. package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js +20 -17
  540. package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js.map +1 -1
  541. package/dist/domains/traces/components/span-payload/span-tools-section.es.js +20 -19
  542. package/dist/domains/traces/components/span-payload/span-tools-section.es.js.map +1 -1
  543. package/dist/domains/traces/components/span-payload/use-span-tool-calls.cjs.js +15 -0
  544. package/dist/domains/traces/components/span-payload/use-span-tool-calls.cjs.js.map +1 -0
  545. package/dist/domains/traces/components/span-payload/use-span-tool-calls.d.ts +1 -0
  546. package/dist/domains/traces/components/span-payload/use-span-tool-calls.es.js +14 -0
  547. package/dist/domains/traces/components/span-payload/use-span-tool-calls.es.js.map +1 -0
  548. package/dist/domains/traces/components/span-prompt-changes.cjs.js +267 -0
  549. package/dist/domains/traces/components/span-prompt-changes.cjs.js.map +1 -0
  550. package/dist/domains/traces/components/span-prompt-changes.d.ts +1 -0
  551. package/dist/domains/traces/components/span-prompt-changes.es.js +266 -0
  552. package/dist/domains/traces/components/span-prompt-changes.es.js.map +1 -0
  553. package/dist/domains/traces/components/span-prompt-impact.cjs.js +32 -0
  554. package/dist/domains/traces/components/span-prompt-impact.cjs.js.map +1 -0
  555. package/dist/domains/traces/components/span-prompt-impact.d.ts +1 -0
  556. package/dist/domains/traces/components/span-prompt-impact.es.js +29 -0
  557. package/dist/domains/traces/components/span-prompt-impact.es.js.map +1 -0
  558. package/dist/domains/traces/components/span-rows.cjs.js +1 -1
  559. package/dist/domains/traces/components/span-rows.es.js +1 -1
  560. package/dist/domains/traces/components/span-summary-description.cjs.js +1 -1
  561. package/dist/domains/traces/components/span-summary-description.es.js +1 -1
  562. package/dist/domains/traces/components/span-timing-hover-card.cjs.js +1 -1
  563. package/dist/domains/traces/components/span-timing-hover-card.es.js +1 -1
  564. package/dist/domains/traces/components/span-token-usage.cjs.js +1 -41
  565. package/dist/domains/traces/components/span-token-usage.cjs.js.map +1 -1
  566. package/dist/domains/traces/components/span-token-usage.es.js +3 -42
  567. package/dist/domains/traces/components/span-token-usage.es.js.map +1 -1
  568. package/dist/domains/traces/components/thread-trace/thread-trace-details.cjs.js +1 -1
  569. package/dist/domains/traces/components/thread-trace/thread-trace-details.es.js +1 -1
  570. package/dist/domains/traces/components/thread-trace/thread-trace-messages.cjs.js +2 -2
  571. package/dist/domains/traces/components/thread-trace/thread-trace-messages.es.js +2 -2
  572. package/dist/domains/traces/components/thread-trace/thread-trace-row.cjs.js +1 -1
  573. package/dist/domains/traces/components/thread-trace/thread-trace-row.es.js +1 -1
  574. package/dist/domains/traces/components/timeline-name-col.cjs.js +3 -10
  575. package/dist/domains/traces/components/timeline-name-col.cjs.js.map +1 -1
  576. package/dist/domains/traces/components/timeline-name-col.es.js +4 -11
  577. package/dist/domains/traces/components/timeline-name-col.es.js.map +1 -1
  578. package/dist/domains/traces/components/trace-columns-menu.cjs.js +8 -11
  579. package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -1
  580. package/dist/domains/traces/components/trace-columns-menu.es.js +8 -11
  581. package/dist/domains/traces/components/trace-columns-menu.es.js.map +1 -1
  582. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +2 -2
  583. package/dist/domains/traces/components/trace-data-panel-view.es.js +2 -2
  584. package/dist/domains/traces/components/trace-data-panel.cjs.js +1 -1
  585. package/dist/domains/traces/components/trace-data-panel.es.js +1 -1
  586. package/dist/domains/traces/components/trace-details-view.cjs.js +2 -2
  587. package/dist/domains/traces/components/trace-details-view.es.js +2 -2
  588. package/dist/domains/traces/components/trace-error-cell.cjs.js +1 -1
  589. package/dist/domains/traces/components/trace-error-cell.es.js +1 -1
  590. package/dist/domains/traces/components/trace-id-button.cjs.js +1 -1
  591. package/dist/domains/traces/components/trace-id-button.es.js +1 -1
  592. package/dist/domains/traces/components/trace-span-panel.cjs.js +0 -1
  593. package/dist/domains/traces/components/trace-span-panel.cjs.js.map +1 -1
  594. package/dist/domains/traces/components/trace-span-panel.es.js +0 -1
  595. package/dist/domains/traces/components/trace-span-panel.es.js.map +1 -1
  596. package/dist/domains/traces/components/trace-summary-description.cjs.js +1 -1
  597. package/dist/domains/traces/components/trace-summary-description.es.js +1 -1
  598. package/dist/domains/traces/components/trace-thread-panel.cjs.js +1 -1
  599. package/dist/domains/traces/components/trace-thread-panel.es.js +1 -1
  600. package/dist/domains/traces/components/trace-time-range-chip.cjs.js +44 -27
  601. package/dist/domains/traces/components/trace-time-range-chip.cjs.js.map +1 -1
  602. package/dist/domains/traces/components/trace-time-range-chip.es.js +44 -27
  603. package/dist/domains/traces/components/trace-time-range-chip.es.js.map +1 -1
  604. package/dist/domains/traces/components/traces-explorer/traces-explorer-actions.cjs.js +12 -2
  605. package/dist/domains/traces/components/traces-explorer/traces-explorer-actions.cjs.js.map +1 -1
  606. package/dist/domains/traces/components/traces-explorer/traces-explorer-actions.es.js +12 -3
  607. package/dist/domains/traces/components/traces-explorer/traces-explorer-actions.es.js.map +1 -1
  608. package/dist/domains/traces/components/traces-explorer/traces-explorer-body.cjs.js +2 -1
  609. package/dist/domains/traces/components/traces-explorer/traces-explorer-body.cjs.js.map +1 -1
  610. package/dist/domains/traces/components/traces-explorer/traces-explorer-body.es.js +2 -1
  611. package/dist/domains/traces/components/traces-explorer/traces-explorer-body.es.js.map +1 -1
  612. package/dist/domains/traces/components/traces-explorer/traces-explorer-context.cjs.js.map +1 -1
  613. package/dist/domains/traces/components/traces-explorer/traces-explorer-context.es.js.map +1 -1
  614. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +3 -1
  615. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js.map +1 -1
  616. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +3 -1
  617. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js.map +1 -1
  618. package/dist/domains/traces/components/traces-explorer/traces-explorer-histogram.cjs.js +78 -0
  619. package/dist/domains/traces/components/traces-explorer/traces-explorer-histogram.cjs.js.map +1 -0
  620. package/dist/domains/traces/components/traces-explorer/traces-explorer-histogram.d.ts +1 -0
  621. package/dist/domains/traces/components/traces-explorer/traces-explorer-histogram.es.js +77 -0
  622. package/dist/domains/traces/components/traces-explorer/traces-explorer-histogram.es.js.map +1 -0
  623. package/dist/domains/traces/components/traces-explorer/traces-explorer-layout.cjs.js +3 -2
  624. package/dist/domains/traces/components/traces-explorer/traces-explorer-layout.cjs.js.map +1 -1
  625. package/dist/domains/traces/components/traces-explorer/traces-explorer-layout.es.js +3 -2
  626. package/dist/domains/traces/components/traces-explorer/traces-explorer-layout.es.js.map +1 -1
  627. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.cjs.js +1 -1
  628. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.cjs.js.map +1 -1
  629. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.es.js +1 -1
  630. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.es.js.map +1 -1
  631. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.cjs.js +5 -2
  632. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.cjs.js.map +1 -1
  633. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.es.js +6 -3
  634. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.es.js.map +1 -1
  635. package/dist/domains/traces/components/traces-explorer.cjs.js +2 -0
  636. package/dist/domains/traces/components/traces-explorer.cjs.js.map +1 -1
  637. package/dist/domains/traces/components/traces-explorer.es.js +2 -0
  638. package/dist/domains/traces/components/traces-explorer.es.js.map +1 -1
  639. package/dist/domains/traces/components/traces-list-mode-toggle.cjs.js +1 -1
  640. package/dist/domains/traces/components/traces-list-mode-toggle.es.js +1 -1
  641. package/dist/domains/traces/components/traces-list-view.cjs.js +3 -3
  642. package/dist/domains/traces/components/traces-list-view.es.js +3 -3
  643. package/dist/domains/traces/components/traces-page-skeleton.cjs.js +1 -1
  644. package/dist/domains/traces/components/traces-page-skeleton.es.js +1 -1
  645. package/dist/domains/traces/components/traces-spans-switch.cjs.js +1 -1
  646. package/dist/domains/traces/components/traces-spans-switch.es.js +1 -1
  647. package/dist/domains/traces/components.cjs.js +1 -1
  648. package/dist/domains/traces/components.es.js +1 -1
  649. package/dist/domains/traces/types.cjs.js +10 -0
  650. package/dist/domains/traces/types.cjs.js.map +1 -1
  651. package/dist/domains/traces/types.es.js +9 -1
  652. package/dist/domains/traces/types.es.js.map +1 -1
  653. package/dist/domains/traces.cjs.js +3 -1
  654. package/dist/domains/traces.es.js +3 -3
  655. package/dist/domains/workflows/components/workflow-combobox.cjs.js +1 -1
  656. package/dist/domains/workflows/components/workflow-combobox.es.js +1 -1
  657. package/dist/domains/workflows/components/workflow-entity-header.cjs.js +1 -1
  658. package/dist/domains/workflows/components/workflow-entity-header.es.js +1 -1
  659. package/dist/domains/workflows/components/workflow-information.cjs.js +1 -1
  660. package/dist/domains/workflows/components/workflow-information.es.js +1 -1
  661. package/dist/domains/workflows/components/workflow-layout.cjs.js +1 -1
  662. package/dist/domains/workflows/components/workflow-layout.es.js +1 -1
  663. package/dist/domains/workflows/components/workflow-step-detail.cjs.js +2 -2
  664. package/dist/domains/workflows/components/workflow-step-detail.es.js +2 -2
  665. package/dist/domains/workflows/components/workflows-list/workflows-list.cjs.js +2 -2
  666. package/dist/domains/workflows/components/workflows-list/workflows-list.es.js +2 -2
  667. package/dist/domains/workflows/runs/workflow-run-list.cjs.js +1 -1
  668. package/dist/domains/workflows/runs/workflow-run-list.es.js +1 -1
  669. package/dist/domains/workflows/workflow/data/workflow-data-button.cjs.js +1 -1
  670. package/dist/domains/workflows/workflow/data/workflow-data-button.es.js +1 -1
  671. package/dist/domains/workflows/workflow/data/workflow-data-inspector.cjs.js +1 -1
  672. package/dist/domains/workflows/workflow/data/workflow-data-inspector.es.js +1 -1
  673. package/dist/domains/workflows/workflow/input/workflow-json-input.cjs.js +1 -1
  674. package/dist/domains/workflows/workflow/input/workflow-json-input.es.js +1 -1
  675. package/dist/domains/workflows/workflow/input/workflow-processor-input.cjs.js +1 -1
  676. package/dist/domains/workflows/workflow/input/workflow-processor-input.es.js +1 -1
  677. package/dist/domains/workflows/workflow/use-workflow-graph-runtime.cjs.js +1 -1
  678. package/dist/domains/workflows/workflow/use-workflow-graph-runtime.es.js +1 -1
  679. package/dist/domains/workflows/workflow/utils.cjs.js +1 -1
  680. package/dist/domains/workflows/workflow/utils.es.js +1 -1
  681. package/dist/domains/workflows/workflow/workflow-body-graph.cjs.js +1 -1
  682. package/dist/domains/workflows/workflow/workflow-body-graph.es.js +1 -1
  683. package/dist/domains/workflows/workflow/workflow-data-edge.cjs.js +1 -1
  684. package/dist/domains/workflows/workflow/workflow-data-edge.es.js +1 -1
  685. package/dist/domains/workflows/workflow/workflow-debug-step-controls.cjs.js +1 -1
  686. package/dist/domains/workflows/workflow/workflow-debug-step-controls.es.js +1 -1
  687. package/dist/domains/workflows/workflow/workflow-graph-boundary.cjs.js +1 -1
  688. package/dist/domains/workflows/workflow/workflow-graph-boundary.es.js +1 -1
  689. package/dist/domains/workflows/workflow/workflow-graph-inner.cjs.js +2 -2
  690. package/dist/domains/workflows/workflow/workflow-graph-inner.es.js +2 -2
  691. package/dist/domains/workflows/workflow/workflow-graph-layout.cjs.js +1 -1
  692. package/dist/domains/workflows/workflow/workflow-graph-layout.es.js +1 -1
  693. package/dist/domains/workflows/workflow/workflow-graph-node.cjs.js +1 -1
  694. package/dist/domains/workflows/workflow/workflow-graph-node.es.js +1 -1
  695. package/dist/domains/workflows/workflow/workflow-graph.cjs.js +1 -1
  696. package/dist/domains/workflows/workflow/workflow-graph.es.js +1 -1
  697. package/dist/domains/workflows/workflow/workflow-map-config-dialog.cjs.js +2 -2
  698. package/dist/domains/workflows/workflow/workflow-map-config-dialog.es.js +2 -2
  699. package/dist/domains/workflows/workflow/workflow-nested-graph.cjs.js +1 -1
  700. package/dist/domains/workflows/workflow/workflow-nested-graph.es.js +1 -1
  701. package/dist/domains/workflows/workflow/workflow-run-data.cjs.js +3 -3
  702. package/dist/domains/workflows/workflow/workflow-run-data.es.js +3 -3
  703. package/dist/domains/workflows/workflow/workflow-run-header.cjs.js +1 -1
  704. package/dist/domains/workflows/workflow/workflow-run-header.es.js +1 -1
  705. package/dist/domains/workflows/workflow/workflow-status.cjs.js +1 -1
  706. package/dist/domains/workflows/workflow/workflow-status.es.js +1 -1
  707. package/dist/domains/workflows/workflow/workflow-step-action-bar.cjs.js +2 -2
  708. package/dist/domains/workflows/workflow/workflow-step-action-bar.es.js +2 -2
  709. package/dist/domains/workflows/workflow/workflow-step-node-utils.cjs.js +1 -1
  710. package/dist/domains/workflows/workflow/workflow-step-node-utils.es.js +1 -1
  711. package/dist/domains/workflows/workflow/workflow-suspended-steps.cjs.js +1 -1
  712. package/dist/domains/workflows/workflow/workflow-suspended-steps.es.js +1 -1
  713. package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +2 -2
  714. package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +2 -2
  715. package/dist/domains/workflows/workflow/workflow-trigger-header.cjs.js +1 -1
  716. package/dist/domains/workflows/workflow/workflow-trigger-header.es.js +1 -1
  717. package/dist/domains/workflows/workflow/workflow-trigger.cjs.js +1 -1
  718. package/dist/domains/workflows/workflow/workflow-trigger.es.js +1 -1
  719. package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +4 -4
  720. package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +4 -4
  721. package/dist/domains/workspace/components/workspace-create-directory.cjs.js +1 -1
  722. package/dist/domains/workspace/components/workspace-create-directory.es.js +1 -1
  723. package/dist/domains/workspace/components/workspace-markdown-preview.cjs.js +1 -1
  724. package/dist/domains/workspace/components/workspace-markdown-preview.es.js +1 -1
  725. package/dist/domains/workspace/components/workspace-parts.cjs.js +1 -1
  726. package/dist/domains/workspace/components/workspace-parts.es.js +1 -1
  727. package/dist/{dropdown-menu-Caic-zHy.js → dropdown-menu-B4jY3J9e.js} +6 -13
  728. package/dist/dropdown-menu-B4jY3J9e.js.map +1 -0
  729. package/dist/{dropdown-menu-C-3jXKWx.cjs → dropdown-menu-BETTTPBB.cjs} +6 -13
  730. package/dist/dropdown-menu-BETTTPBB.cjs.map +1 -0
  731. package/dist/ee/signals/components/entity-index-compact-grid.cjs.js +1 -1
  732. package/dist/ee/signals/components/entity-index-compact-grid.es.js +1 -1
  733. package/dist/ee/signals/components/entity-index-list.cjs.js +1 -1
  734. package/dist/ee/signals/components/entity-index-list.es.js +1 -1
  735. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +2 -2
  736. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +2 -2
  737. package/dist/ee/signals/sankey-signals.cjs.js +1 -1
  738. package/dist/ee/signals/sankey-signals.es.js +1 -1
  739. package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +1 -1
  740. package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +1 -1
  741. package/dist/ee/signals/settings/trace-signal-settings.cjs.js +1 -1
  742. package/dist/ee/signals/settings/trace-signal-settings.es.js +1 -1
  743. package/dist/ee/signals/view-mode-tab.cjs.js +1 -1
  744. package/dist/ee/signals/view-mode-tab.es.js +1 -1
  745. package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
  746. package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
  747. package/dist/{filter-bar-chip-B8YhZSsE.js → filter-bar-chip-B3pgpngW.js} +32 -42
  748. package/dist/filter-bar-chip-B3pgpngW.js.map +1 -0
  749. package/dist/{filter-bar-chip-BDIsuGcB.cjs → filter-bar-chip-CyTAmjt6.cjs} +36 -40
  750. package/dist/filter-bar-chip-CyTAmjt6.cjs.map +1 -0
  751. package/dist/hooks/use-autoscroll.cjs.js +15 -6
  752. package/dist/hooks/use-autoscroll.cjs.js.map +1 -1
  753. package/dist/hooks/use-autoscroll.es.js +15 -6
  754. package/dist/hooks/use-autoscroll.es.js.map +1 -1
  755. package/dist/layout/tabbed-container.cjs.js +1 -1
  756. package/dist/layout/tabbed-container.es.js +1 -1
  757. package/dist/lib/form/components/select-field.cjs.js +1 -1
  758. package/dist/lib/form/components/select-field.es.js +1 -1
  759. package/dist/{pagination-range-BG8eIaxA.js → pagination-range-BCcIngy8.js} +14 -99
  760. package/dist/pagination-range-BCcIngy8.js.map +1 -0
  761. package/dist/{pagination-range-DFqtQ-3z.cjs → pagination-range-BvsZH7e4.cjs} +12 -97
  762. package/dist/pagination-range-BvsZH7e4.cjs.map +1 -0
  763. package/dist/primitives/chart-axes.cjs.js +27 -5
  764. package/dist/primitives/chart-axes.cjs.js.map +1 -1
  765. package/dist/primitives/chart-axes.es.js +27 -6
  766. package/dist/primitives/chart-axes.es.js.map +1 -1
  767. package/dist/primitives/chart-frame.cjs.js +28 -1
  768. package/dist/primitives/chart-frame.cjs.js.map +1 -1
  769. package/dist/primitives/chart-frame.es.js +28 -1
  770. package/dist/primitives/chart-frame.es.js.map +1 -1
  771. package/dist/primitives/chart-plot.cjs.js +78 -12
  772. package/dist/primitives/chart-plot.cjs.js.map +1 -1
  773. package/dist/primitives/chart-plot.es.js +78 -12
  774. package/dist/primitives/chart-plot.es.js.map +1 -1
  775. package/dist/primitives/chart-tooltip-position.cjs.js +57 -0
  776. package/dist/primitives/chart-tooltip-position.cjs.js.map +1 -0
  777. package/dist/primitives/chart-tooltip-position.d.ts +1 -0
  778. package/dist/primitives/chart-tooltip-position.es.js +56 -0
  779. package/dist/primitives/chart-tooltip-position.es.js.map +1 -0
  780. package/dist/primitives/charts/drag-selection/drag-selection-band.cjs.js +36 -0
  781. package/dist/primitives/charts/drag-selection/drag-selection-band.cjs.js.map +1 -0
  782. package/dist/primitives/charts/drag-selection/drag-selection-band.d.ts +1 -0
  783. package/dist/primitives/charts/drag-selection/drag-selection-band.es.js +35 -0
  784. package/dist/primitives/charts/drag-selection/drag-selection-band.es.js.map +1 -0
  785. package/dist/primitives/charts/drag-selection/drag-selection-range.cjs.js +44 -0
  786. package/dist/primitives/charts/drag-selection/drag-selection-range.cjs.js.map +1 -0
  787. package/dist/primitives/charts/drag-selection/drag-selection-range.d.ts +1 -0
  788. package/dist/primitives/charts/drag-selection/drag-selection-range.es.js +41 -0
  789. package/dist/primitives/charts/drag-selection/drag-selection-range.es.js.map +1 -0
  790. package/dist/primitives/charts/drag-selection/use-drag-selection.cjs.js +80 -0
  791. package/dist/primitives/charts/drag-selection/use-drag-selection.cjs.js.map +1 -0
  792. package/dist/primitives/charts/drag-selection/use-drag-selection.d.ts +1 -0
  793. package/dist/primitives/charts/drag-selection/use-drag-selection.es.js +78 -0
  794. package/dist/primitives/charts/drag-selection/use-drag-selection.es.js.map +1 -0
  795. package/dist/primitives/charts/drag-selection.cjs.js +10 -0
  796. package/dist/primitives/charts/drag-selection.d.ts +1 -0
  797. package/dist/primitives/charts/drag-selection.es.js +4 -0
  798. package/dist/primitives/form-element.cjs.js +1 -1
  799. package/dist/primitives/form-element.cjs.js.map +1 -1
  800. package/dist/primitives/form-element.es.js +1 -1
  801. package/dist/primitives/form-element.es.js.map +1 -1
  802. package/dist/primitives/menu-item.cjs.js +6 -5
  803. package/dist/primitives/menu-item.cjs.js.map +1 -1
  804. package/dist/primitives/menu-item.es.js +6 -6
  805. package/dist/primitives/menu-item.es.js.map +1 -1
  806. package/dist/primitives/menu-scroll-area.cjs.js +4 -10
  807. package/dist/primitives/menu-scroll-area.cjs.js.map +1 -1
  808. package/dist/primitives/menu-scroll-area.es.js +4 -10
  809. package/dist/primitives/menu-scroll-area.es.js.map +1 -1
  810. package/dist/{property-filter-applied-CC8wQtPa.js → property-filter-applied-DRglaEj-.js} +27 -39
  811. package/dist/property-filter-applied-DRglaEj-.js.map +1 -0
  812. package/dist/{property-filter-applied-I8Iz2j9O.cjs → property-filter-applied-DqsPFbYM.cjs} +26 -38
  813. package/dist/property-filter-applied-DqsPFbYM.cjs.map +1 -0
  814. package/dist/{scroll-area-CpCAy8S0.cjs → scroll-area-BP4gPZ4G.cjs} +13 -7
  815. package/dist/scroll-area-BP4gPZ4G.cjs.map +1 -0
  816. package/dist/{scroll-area-Dh9UQ7HP.js → scroll-area-C226l0v0.js} +13 -7
  817. package/dist/scroll-area-C226l0v0.js.map +1 -0
  818. package/dist/{select-D7PoE2w6.js → select-BbFpEBAY.js} +2 -5
  819. package/dist/select-BbFpEBAY.js.map +1 -0
  820. package/dist/{select-Dtc73TLB.cjs → select-NySY9Men.cjs} +2 -5
  821. package/dist/select-NySY9Men.cjs.map +1 -0
  822. package/dist/{span-payload-primitives-DNhjpAtm.cjs → span-payload-primitives-D3OO0u6u.cjs} +32 -20
  823. package/dist/span-payload-primitives-D3OO0u6u.cjs.map +1 -0
  824. package/dist/{span-payload-primitives-CNDSzk1Q.js → span-payload-primitives-DTV7eUY-.js} +32 -20
  825. package/dist/span-payload-primitives-DTV7eUY-.js.map +1 -0
  826. package/dist/src/domains/chat/activity/activity-disclosure-provider.d.ts +5 -0
  827. package/dist/src/domains/chat/activity/activity-stretch-line.d.ts +10 -0
  828. package/dist/src/domains/chat/activity/components/activity-fold.d.ts +16 -0
  829. package/dist/src/domains/chat/activity/components/activity-timed-trigger.d.ts +9 -0
  830. package/dist/src/domains/chat/activity/components/calls-group.d.ts +6 -0
  831. package/dist/src/domains/chat/activity/components/calls-panel.d.ts +6 -0
  832. package/dist/src/domains/chat/activity/components/reading-row.d.ts +10 -0
  833. package/dist/src/domains/chat/activity/components/stretch-content.d.ts +9 -0
  834. package/dist/src/domains/chat/activity/components/stretch-segment.d.ts +6 -0
  835. package/dist/src/domains/chat/activity/components/stretch-thought.d.ts +5 -0
  836. package/dist/src/domains/chat/activity/index.d.ts +7 -0
  837. package/dist/src/domains/chat/activity/model/activity-members.d.ts +22 -0
  838. package/dist/src/domains/chat/activity/model/activity-segments.d.ts +9 -0
  839. package/dist/src/domains/chat/activity/model/activity-words.d.ts +24 -0
  840. package/dist/src/domains/chat/activity/model/disclosure-store.d.ts +22 -0
  841. package/dist/src/domains/chat/activity/use-activity-disclosure.d.ts +10 -0
  842. package/dist/src/domains/llm/index.d.ts +3 -0
  843. package/dist/src/domains/llm/model-name-parts.d.ts +6 -0
  844. package/dist/src/domains/llm/provider-mark.d.ts +11 -0
  845. package/dist/src/domains/metrics/components/breakdown/breakdown-figure.d.ts +6 -0
  846. package/dist/src/domains/metrics/components/breakdown/breakdown-row-mark.d.ts +9 -0
  847. package/dist/src/domains/metrics/components/breakdown/breakdown-row-name.d.ts +6 -0
  848. package/dist/src/domains/metrics/components/breakdown/breakdown-text.d.ts +4 -0
  849. package/dist/src/domains/metrics/lib/breakdown-table.d.ts +0 -5
  850. package/dist/src/domains/metrics/lib/breakdown.d.ts +2 -0
  851. package/dist/src/domains/observability/components/observability-histogram.d.ts +20 -0
  852. package/dist/src/domains/observability/components/observability-list-body.d.ts +4 -2
  853. package/dist/src/domains/observability/lib/histogram-buckets.d.ts +43 -0
  854. package/dist/src/domains/skills/skill-simple-form.d.ts +10 -0
  855. package/dist/src/domains/spans/components/spans-explorer-histogram.d.ts +18 -0
  856. package/dist/src/domains/spans/hooks/use-spans-list-source.d.ts +1 -0
  857. package/dist/src/domains/threads/hooks/use-threads-list-source.d.ts +1 -0
  858. package/dist/src/domains/traces/components/span-data-panel-view.d.ts +10 -10
  859. package/dist/src/domains/traces/components/span-outcome.d.ts +1 -7
  860. package/dist/src/domains/traces/components/span-payload/span-payload-json.d.ts +3 -1
  861. package/dist/src/domains/traces/components/span-payload/span-payload-primitives.d.ts +7 -2
  862. package/dist/src/domains/traces/components/span-payload/span-payload-processor-fields.d.ts +106 -0
  863. package/dist/src/domains/traces/components/span-payload/span-payload-registry.d.ts +5 -2
  864. package/dist/src/domains/traces/components/span-payload/span-tools-section.d.ts +11 -6
  865. package/dist/src/domains/traces/components/span-payload/use-span-tool-calls.d.ts +3 -0
  866. package/dist/src/domains/traces/components/span-prompt-changes.d.ts +10 -0
  867. package/dist/src/domains/traces/components/span-prompt-impact.d.ts +13 -0
  868. package/dist/src/domains/traces/components/span-token-usage.d.ts +0 -7
  869. package/dist/src/domains/traces/components/trace-span-panel.d.ts +2 -2
  870. package/dist/src/domains/traces/components/trace-time-range-chip.d.ts +7 -4
  871. package/dist/src/domains/traces/components/traces-explorer/index.d.ts +2 -0
  872. package/dist/src/domains/traces/components/traces-explorer/traces-explorer-actions.d.ts +6 -1
  873. package/dist/src/domains/traces/components/traces-explorer/traces-explorer-body.d.ts +3 -1
  874. package/dist/src/domains/traces/components/traces-explorer/traces-explorer-context.d.ts +2 -0
  875. package/dist/src/domains/traces/components/traces-explorer/traces-explorer-histogram.d.ts +7 -0
  876. package/dist/src/domains/traces/components/traces-explorer/traces-explorer-layout.d.ts +1 -1
  877. package/dist/src/domains/traces/hooks/use-traces-list-source.d.ts +1 -0
  878. package/dist/src/domains/traces/index.d.ts +1 -1
  879. package/dist/src/domains/traces/types.d.ts +4 -1
  880. package/dist/src/ds/components/Combobox/combobox-parts.d.ts +1 -1
  881. package/dist/src/ds/components/Combobox/combobox-styles.d.ts +1 -1
  882. package/dist/src/ds/components/DataList/data-list-group.d.ts +1 -1
  883. package/dist/src/ds/components/DataList/shared.d.ts +5 -5
  884. package/dist/src/ds/components/FilterBar/filter-bar-chip.d.ts +2 -0
  885. package/dist/src/ds/components/FilterBar/filter-bar-option-list.d.ts +1 -1
  886. package/dist/src/ds/components/MetricsStackedBarChart/metrics-stacked-bar-chart.d.ts +8 -0
  887. package/dist/src/ds/components/MetricsTable/metrics-table-header.d.ts +15 -0
  888. package/dist/src/ds/components/MetricsTable/metrics-table-rows.d.ts +15 -0
  889. package/dist/src/ds/components/MetricsTable/metrics-table-types.d.ts +23 -5
  890. package/dist/src/ds/components/MetricsTable/metrics-table.d.ts +2 -1
  891. package/dist/src/ds/components/ScrollArea/scroll-area.d.ts +12 -2
  892. package/dist/src/ds/components/SegmentedName/index.d.ts +1 -0
  893. package/dist/src/ds/components/SegmentedName/segmented-name.d.ts +10 -0
  894. package/dist/src/ds/components/SeriesMark/series-mark.d.ts +12 -7
  895. package/dist/src/ds/components/ShareBar/index.d.ts +2 -0
  896. package/dist/src/ds/components/ShareBar/share-bar-classes.d.ts +2 -0
  897. package/dist/src/ds/components/ShareBar/share-bar-row.d.ts +16 -0
  898. package/dist/src/ds/components/ShareBar/share-bar-rows.d.ts +71 -0
  899. package/dist/src/ds/components/ShareBar/share-bar-skeleton.d.ts +9 -0
  900. package/dist/src/ds/components/ShareBar/share-bar-types.d.ts +62 -0
  901. package/dist/src/ds/components/ShareBar/share-bar.d.ts +8 -0
  902. package/dist/src/ds/components/ai/activity/activity.d.ts +10 -3
  903. package/dist/src/ds/components/ai/activity/index.d.ts +1 -0
  904. package/dist/src/ds/components/ai/activity/presets/reasoning-text.d.ts +6 -0
  905. package/dist/src/ds/components/ai/activity/presets/reasoning-visibility.d.ts +2 -0
  906. package/dist/src/ds/components/ai/tool-call/index.d.ts +1 -0
  907. package/dist/src/ds/components/ai/tool-call/tool-phrases.d.ts +115 -0
  908. package/dist/src/ds/primitives/chart-axes.d.ts +23 -3
  909. package/dist/src/ds/primitives/chart-tooltip-position.d.ts +18 -0
  910. package/dist/src/ds/primitives/charts/drag-selection/drag-selection-band.d.ts +15 -0
  911. package/dist/src/ds/primitives/charts/drag-selection/drag-selection-range.d.ts +26 -0
  912. package/dist/src/ds/primitives/charts/drag-selection/index.d.ts +25 -0
  913. package/dist/src/ds/primitives/charts/drag-selection/use-drag-selection.d.ts +42 -0
  914. package/dist/src/ds/primitives/menu-item.d.ts +1 -0
  915. package/dist/src/ds/primitives/menu-scroll-area.d.ts +2 -4
  916. package/dist/src/hooks/use-autoscroll.d.ts +5 -1
  917. package/dist/src/utils/date-format.d.ts +2 -0
  918. package/dist/style.css +157 -105
  919. package/dist/{tabbed-container-Dt9F_Lb5.cjs → tabbed-container-CBTb0LgE.cjs} +5 -5
  920. package/dist/{tabbed-container-Dt9F_Lb5.cjs.map → tabbed-container-CBTb0LgE.cjs.map} +1 -1
  921. package/dist/{tabbed-container-DHmygeKi.js → tabbed-container-x2mfK07d.js} +5 -5
  922. package/dist/{tabbed-container-DHmygeKi.js.map → tabbed-container-x2mfK07d.js.map} +1 -1
  923. package/dist/table-pagination-S7ksCNCo.js +30 -0
  924. package/dist/table-pagination-S7ksCNCo.js.map +1 -0
  925. package/dist/table-pagination-lBp5luHp.cjs +35 -0
  926. package/dist/table-pagination-lBp5luHp.cjs.map +1 -0
  927. package/dist/{tabs-content-DJ-d-ICe.cjs → tabs-content-DgR3Hik1.cjs} +2 -2
  928. package/dist/{tabs-content-DJ-d-ICe.cjs.map → tabs-content-DgR3Hik1.cjs.map} +1 -1
  929. package/dist/{tabs-content-CDCk47md.js → tabs-content-cpV6A9c3.js} +2 -2
  930. package/dist/{tabs-content-CDCk47md.js.map → tabs-content-cpV6A9c3.js.map} +1 -1
  931. package/dist/{tabs-tab-BjqT5Xf6.cjs → tabs-tab-Qp3RJ17z.cjs} +2 -2
  932. package/dist/{tabs-tab-BjqT5Xf6.cjs.map → tabs-tab-Qp3RJ17z.cjs.map} +1 -1
  933. package/dist/{tabs-tab-BGD5YdnH.js → tabs-tab-UT1JliwK.js} +2 -2
  934. package/dist/{tabs-tab-BGD5YdnH.js.map → tabs-tab-UT1JliwK.js.map} +1 -1
  935. package/dist/{tool-approval-BKV0gUqO.cjs → tool-approval-6E73C0r6.cjs} +4 -4
  936. package/dist/{tool-approval-BKV0gUqO.cjs.map → tool-approval-6E73C0r6.cjs.map} +1 -1
  937. package/dist/{tool-approval-CveZata3.js → tool-approval-BXlro6fV.js} +4 -4
  938. package/dist/{tool-approval-CveZata3.js.map → tool-approval-BXlro6fV.js.map} +1 -1
  939. package/dist/{tool-call-vlw4UndQ.js → tool-call-CItJ8KLA.js} +122 -5
  940. package/dist/tool-call-CItJ8KLA.js.map +1 -0
  941. package/dist/{tool-call-B7XLocND.cjs → tool-call-Dq9xF3WD.cjs} +127 -4
  942. package/dist/tool-call-Dq9xF3WD.cjs.map +1 -0
  943. package/dist/{tool-card-DYBulq2F.js → tool-card-Bd8weXze.js} +3 -3
  944. package/dist/{tool-card-DYBulq2F.js.map → tool-card-Bd8weXze.js.map} +1 -1
  945. package/dist/{tool-card-DjZAuYpR.cjs → tool-card-o5u4YCR0.cjs} +3 -3
  946. package/dist/{tool-card-DjZAuYpR.cjs.map → tool-card-o5u4YCR0.cjs.map} +1 -1
  947. package/dist/tool-presentation-D2uUj1AB.cjs.map +1 -1
  948. package/dist/tool-presentation-DKfIKLQy.js.map +1 -1
  949. package/dist/{use-workflow-graph-runtime-CBfWZ5Jw.cjs → use-workflow-graph-runtime-DkwQjMEV.cjs} +3 -3
  950. package/dist/{use-workflow-graph-runtime-CBfWZ5Jw.cjs.map → use-workflow-graph-runtime-DkwQjMEV.cjs.map} +1 -1
  951. package/dist/{use-workflow-graph-runtime-BTolLtAq.js → use-workflow-graph-runtime-deTN_q_G.js} +3 -3
  952. package/dist/{use-workflow-graph-runtime-BTolLtAq.js.map → use-workflow-graph-runtime-deTN_q_G.js.map} +1 -1
  953. package/dist/utils/date-format.cjs.js +15 -0
  954. package/dist/utils/date-format.cjs.js.map +1 -1
  955. package/dist/utils/date-format.es.js +15 -1
  956. package/dist/utils/date-format.es.js.map +1 -1
  957. package/package.json +9 -9
  958. package/dist/MetricsLineChart-B9nzVOUV.js.map +0 -1
  959. package/dist/MetricsLineChart-CkuPY5an.cjs.map +0 -1
  960. package/dist/MetricsShareList-BY-4i5ng.js +0 -605
  961. package/dist/MetricsShareList-BY-4i5ng.js.map +0 -1
  962. package/dist/MetricsShareList-BoXqQZRh.cjs +0 -616
  963. package/dist/MetricsShareList-BoXqQZRh.cjs.map +0 -1
  964. package/dist/MetricsStackedBarChart-D-o5Ocsv.js.map +0 -1
  965. package/dist/MetricsStackedBarChart-EsJMtxYG.cjs.map +0 -1
  966. package/dist/activity-B4CnOYnh.cjs.map +0 -1
  967. package/dist/activity-Dc-NsOSz.js.map +0 -1
  968. package/dist/combobox-BgQrNpCO.js.map +0 -1
  969. package/dist/combobox-Bi1vnOZt.cjs.map +0 -1
  970. package/dist/components/MetricsShareList.cjs.js +0 -4
  971. package/dist/components/MetricsShareList.d.ts +0 -1
  972. package/dist/components/MetricsShareList.es.js +0 -1
  973. package/dist/components/MetricsTable.cjs.js.map +0 -1
  974. package/dist/components/MetricsTable.es.js.map +0 -1
  975. package/dist/components/fluid-hover-highlight.cjs.js +0 -24
  976. package/dist/components/fluid-hover-highlight.cjs.js.map +0 -1
  977. package/dist/components/fluid-hover-highlight.d.ts +0 -1
  978. package/dist/components/fluid-hover-highlight.es.js +0 -23
  979. package/dist/components/fluid-hover-highlight.es.js.map +0 -1
  980. package/dist/context-menu-BHhHokFj.cjs.map +0 -1
  981. package/dist/context-menu-DuBHimPI.js.map +0 -1
  982. package/dist/data-list-DjSo5V1C.js.map +0 -1
  983. package/dist/data-list-v93EXSHc.cjs.map +0 -1
  984. package/dist/dropdown-menu-C-3jXKWx.cjs.map +0 -1
  985. package/dist/dropdown-menu-Caic-zHy.js.map +0 -1
  986. package/dist/filter-bar-chip-B8YhZSsE.js.map +0 -1
  987. package/dist/filter-bar-chip-BDIsuGcB.cjs.map +0 -1
  988. package/dist/hooks/use-fluid-hover.cjs.js +0 -351
  989. package/dist/hooks/use-fluid-hover.cjs.js.map +0 -1
  990. package/dist/hooks/use-fluid-hover.d.ts +0 -1
  991. package/dist/hooks/use-fluid-hover.es.js +0 -345
  992. package/dist/hooks/use-fluid-hover.es.js.map +0 -1
  993. package/dist/pagination-range-BG8eIaxA.js.map +0 -1
  994. package/dist/pagination-range-DFqtQ-3z.cjs.map +0 -1
  995. package/dist/primitives/fluid-menu.cjs.js +0 -136
  996. package/dist/primitives/fluid-menu.cjs.js.map +0 -1
  997. package/dist/primitives/fluid-menu.d.ts +0 -1
  998. package/dist/primitives/fluid-menu.es.js +0 -131
  999. package/dist/primitives/fluid-menu.es.js.map +0 -1
  1000. package/dist/property-filter-applied-CC8wQtPa.js.map +0 -1
  1001. package/dist/property-filter-applied-I8Iz2j9O.cjs.map +0 -1
  1002. package/dist/scroll-area-CpCAy8S0.cjs.map +0 -1
  1003. package/dist/scroll-area-Dh9UQ7HP.js.map +0 -1
  1004. package/dist/select-D7PoE2w6.js.map +0 -1
  1005. package/dist/select-Dtc73TLB.cjs.map +0 -1
  1006. package/dist/span-payload-primitives-CNDSzk1Q.js.map +0 -1
  1007. package/dist/span-payload-primitives-DNhjpAtm.cjs.map +0 -1
  1008. package/dist/src/components/fluid-hover-highlight.d.ts +0 -6
  1009. package/dist/src/ds/components/MetricsLineChart/clickable-dot.d.ts +0 -8
  1010. package/dist/src/ds/components/MetricsShareList/index.d.ts +0 -3
  1011. package/dist/src/ds/components/MetricsShareList/metrics-share-list-classes.d.ts +0 -8
  1012. package/dist/src/ds/components/MetricsShareList/metrics-share-list-header.d.ts +0 -3
  1013. package/dist/src/ds/components/MetricsShareList/metrics-share-list-row.d.ts +0 -18
  1014. package/dist/src/ds/components/MetricsShareList/metrics-share-list-rows.d.ts +0 -66
  1015. package/dist/src/ds/components/MetricsShareList/metrics-share-list-skeleton.d.ts +0 -12
  1016. package/dist/src/ds/components/MetricsShareList/metrics-share-list-types.d.ts +0 -109
  1017. package/dist/src/ds/components/MetricsShareList/metrics-share-list.d.ts +0 -11
  1018. package/dist/src/ds/components/Pagination/pagination-context.d.ts +0 -10
  1019. package/dist/src/ds/primitives/fluid-menu.d.ts +0 -69
  1020. package/dist/src/hooks/use-fluid-hover.d.ts +0 -145
  1021. package/dist/tool-call-B7XLocND.cjs.map +0 -1
  1022. package/dist/tool-call-vlw4UndQ.js.map +0 -1
  1023. /package/dist/src/ds/components/{MetricsShareList/metrics-share-list-show-more.d.ts → ShareBar/share-bar-show-more.d.ts} +0 -0
@@ -6,8 +6,8 @@ const require_primitives_form_element = require("./primitives/form-element.cjs.j
6
6
  const require_Button = require("./Button-YQRflC47.cjs");
7
7
  const require_field_control_aria = require("./field-control-aria-Dw0_ObOU.cjs");
8
8
  const require_toast_api = require("./toast-api-Bv87KHu_.cjs");
9
- const require_highlight = require("./highlight-D0VoR2qO.cjs");
10
9
  const require_copy_button = require("./copy-button-BYEFKNpo.cjs");
10
+ const require_highlight = require("./highlight-D0VoR2qO.cjs");
11
11
  let react = require("react");
12
12
  let react_jsx_runtime = require("react/jsx-runtime");
13
13
  let lucide_react = require("lucide-react");
@@ -512,4 +512,4 @@ Object.defineProperty(exports, "variableHighlight", {
512
512
  }
513
513
  });
514
514
 
515
- //# sourceMappingURL=CodeEditor-DaJm0o69.cjs.map
515
+ //# sourceMappingURL=CodeEditor-CJ9jC9lu.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"CodeEditor-DaJm0o69.cjs","names":["LanguageSupport","StreamLanguage","LanguageDescription","EditorView","foldGutter","autocompletion","Decoration","MatchDecorator","ViewPlugin","EditorView","syntaxHighlighting","syntaxHighlighter","useMemo","cva","cn","inputSurfaceAndFocusWithinStyle","fieldErrorRimWithin","Prec","forwardRef","useFieldControlAria","formatJSON","jsonLanguage","markdown","markdownLanguage","EditorState","Button","Braces","CopyButton","CodeMirror"],"sources":["../src/ds/components/CodeEditor/code-languages.ts","../src/ds/components/CodeEditor/fold-gutter-extension.ts","../src/ds/components/CodeEditor/schema-to-variables.ts","../src/ds/components/CodeEditor/variable-autocomplete-extension.ts","../src/ds/components/CodeEditor/variable-highlight-extension.ts","../src/ds/components/CodeEditor/code-editor.tsx"],"sourcesContent":["import { LanguageDescription, LanguageSupport, StreamLanguage } from '@codemirror/language';\n\nfunction legacy(parser: Parameters<typeof StreamLanguage.define>[0]) {\n return new LanguageSupport(StreamLanguage.define(parser));\n}\n\n/**\n * A minimal subset of CodeMirror language descriptions used for fenced code\n * blocks inside markdown. Mirrors the relevant entries from\n * `@codemirror/language-data` but only the languages we actually support, so\n * bundlers don't have to emit a chunk for every known language.\n */\nexport const codeLanguages = [\n LanguageDescription.of({\n name: 'JavaScript',\n alias: ['ecmascript', 'js', 'node'],\n extensions: ['js', 'mjs', 'cjs'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript());\n },\n }),\n LanguageDescription.of({\n name: 'JSON',\n alias: ['json5'],\n extensions: ['json', 'map'],\n load() {\n return import('@codemirror/lang-json').then(m => m.json());\n },\n }),\n LanguageDescription.of({\n name: 'JSX',\n extensions: ['jsx'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ jsx: true }));\n },\n }),\n LanguageDescription.of({\n name: 'Markdown',\n extensions: ['md', 'markdown', 'mkd'],\n load() {\n return import('@codemirror/lang-markdown').then(m => m.markdown());\n },\n }),\n LanguageDescription.of({\n name: 'TSX',\n extensions: ['tsx'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ jsx: true, typescript: true }));\n },\n }),\n LanguageDescription.of({\n name: 'TypeScript',\n alias: ['ts'],\n extensions: ['ts', 'mts', 'cts'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ typescript: true }));\n },\n }),\n LanguageDescription.of({\n name: 'Shell',\n alias: ['bash', 'sh', 'zsh'],\n extensions: ['sh', 'ksh', 'bash'],\n filename: /^PKGBUILD$/,\n load() {\n return import('@codemirror/legacy-modes/mode/shell').then(m => legacy(m.shell));\n },\n }),\n];\n","import { foldGutter } from '@codemirror/language';\nimport type { Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\n\nconst foldTheme = EditorView.theme({\n '.cm-foldGutter .cm-gutterElement': {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0 4px',\n },\n '.cm-fold-marker': {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '12px',\n height: '12px',\n boxSizing: 'border-box',\n border: '1px solid var(--border)',\n borderRadius: '2px',\n color: 'var(--muted-foreground)',\n fontSize: 'var(--text-caption)',\n lineHeight: '1',\n cursor: 'pointer',\n userSelect: 'none',\n },\n '.cm-fold-marker:hover': {\n background: 'var(--fill-hover)',\n color: 'var(--foreground)',\n },\n '.cm-foldPlaceholder': {\n background: 'var(--fill-hover)',\n border: '1px solid var(--border)',\n color: 'var(--muted-foreground)',\n borderRadius: '2px',\n padding: '0 4px',\n margin: '0 2px',\n },\n});\n\n/** Fold gutter with a square −/+ toggle next to each foldable line, styled with design tokens. */\nexport const codeFoldGutter: Extension = [\n foldGutter({\n markerDOM: open => {\n const marker = document.createElement('span');\n marker.className = 'cm-fold-marker';\n marker.dataset.state = open ? 'open' : 'closed';\n marker.title = open ? 'Fold' : 'Unfold';\n marker.textContent = open ? '−' : '+';\n return marker;\n },\n }),\n foldTheme,\n];\n","import type { JsonSchema, JsonSchemaProperty } from '@/lib/json-schema';\n\n/**\n * Represents a variable completion option derived from a schema\n */\nexport interface VariableCompletion {\n /** The dot-notation path (e.g., \"user.name\") */\n path: string;\n /** Display label for the autocomplete */\n label: string;\n /** Description from the schema, if available */\n description?: string;\n /** The type of the property */\n type?: string;\n}\n\n/**\n * Flattens a JSON Schema into a list of variable completions for autocomplete.\n * Recursively extracts property paths using dot-notation.\n *\n * @param schema - The JSON Schema to flatten\n * @param maxDepth - Maximum recursion depth (default: 5)\n * @returns Array of variable completions\n *\n * @example\n * ```ts\n * const schema = {\n * type: 'object',\n * properties: {\n * user: {\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * email: { type: 'string' }\n * }\n * }\n * }\n * };\n *\n * flattenSchemaToVariables(schema);\n * // Returns:\n * // [\n * // { path: 'user', label: 'user', type: 'object' },\n * // { path: 'user.name', label: 'user.name', type: 'string' },\n * // { path: 'user.email', label: 'user.email', type: 'string' }\n * // ]\n * ```\n */\nexport function flattenSchemaToVariables(schema: JsonSchema | undefined, maxDepth = 5): VariableCompletion[] {\n if (!schema?.properties) {\n return [];\n }\n\n const results: VariableCompletion[] = [];\n\n function processProperty(property: JsonSchemaProperty, path: string, depth: number): void {\n if (depth > maxDepth) {\n return;\n }\n\n const type = Array.isArray(property.type) ? property.type.join(' | ') : property.type;\n\n results.push({\n path,\n label: path,\n description: property.description ?? property.title,\n type,\n });\n\n // Recurse into nested object properties\n if (property.properties) {\n for (const [key, nestedProperty] of Object.entries(property.properties)) {\n processProperty(nestedProperty, `${path}.${key}`, depth + 1);\n }\n }\n\n // Handle array items if they have properties (array of objects)\n if (property.items?.properties) {\n // Add a placeholder for array item access (e.g., items[0].name)\n for (const [key, itemProperty] of Object.entries(property.items.properties)) {\n processProperty(itemProperty, `${path}[].${key}`, depth + 1);\n }\n }\n }\n\n for (const [key, property] of Object.entries(schema.properties)) {\n processProperty(property, key, 1);\n }\n\n return results;\n}\n","import { autocompletion } from '@codemirror/autocomplete';\nimport type { Completion, CompletionContext, CompletionResult } from '@codemirror/autocomplete';\nimport type { Extension } from '@codemirror/state';\nimport { flattenSchemaToVariables } from './schema-to-variables';\nimport type { VariableCompletion } from './schema-to-variables';\nimport type { JsonSchema } from '@/lib/json-schema';\n\n/**\n * Creates a CodeMirror autocomplete extension for {{variable}} placeholders.\n * Triggers when the user types `{{` and shows suggestions derived from the schema.\n *\n * @param schema - JSON Schema to derive variable suggestions from\n * @returns CodeMirror Extension that provides variable autocomplete\n *\n * @example\n * ```tsx\n * const schema = {\n * type: 'object',\n * properties: {\n * user: { type: 'object', properties: { name: { type: 'string' } } }\n * }\n * };\n *\n * <CodeMirror extensions={[createVariableAutocomplete(schema)]} />\n * // Typing \"{{\" will show: user, user.name\n * ```\n */\nexport function createVariableAutocomplete(schema: JsonSchema | undefined): Extension {\n const variables = flattenSchemaToVariables(schema);\n\n return autocompletion({\n override: [createVariableCompletionSource(variables)],\n defaultKeymap: true,\n closeOnBlur: true,\n icons: false,\n });\n}\n\n/**\n * Creates a completion source function for CodeMirror's autocompletion.\n */\nexport function createVariableCompletionSource(\n variables: VariableCompletion[],\n): (context: CompletionContext) => CompletionResult | null {\n return (context: CompletionContext): CompletionResult | null => {\n // Look for {{ pattern before cursor\n const beforeCursor = context.state.sliceDoc(Math.max(0, context.pos - 50), context.pos);\n const match = beforeCursor.match(/\\{\\{([a-zA-Z0-9_.\\[\\]]*)?$/);\n\n if (!match) {\n return null;\n }\n\n // The text after {{ that we're matching against\n const prefix = match[1] ?? '';\n const startPos = context.pos - prefix.length;\n\n // Filter variables based on what the user has typed\n const filteredVariables = prefix\n ? variables.filter(v => v.path.toLowerCase().startsWith(prefix.toLowerCase()))\n : variables;\n\n if (filteredVariables.length === 0) {\n return null;\n }\n\n const completions: Completion[] = filteredVariables.map(variable => ({\n label: variable.path,\n displayLabel: variable.path,\n detail: variable.type,\n info: variable.description,\n apply: (view, completion, from, to) => {\n // Inside an existing placeholder, replace the rest of the identifier and reuse its closing }}\n const rest = view.state.sliceDoc(to);\n const identifierEnd = to + (rest.match(/^[a-zA-Z0-9_.\\[\\]]*/)?.[0].length ?? 0);\n const hasClosingBraces = view.state.sliceDoc(identifierEnd, identifierEnd + 2) === '}}';\n const end = hasClosingBraces ? identifierEnd : to;\n\n const insertText = hasClosingBraces ? completion.label : `${completion.label}}}`;\n\n view.dispatch({\n changes: { from, to: end, insert: insertText },\n selection: { anchor: from + insertText.length },\n });\n },\n }));\n\n return {\n from: startPos,\n options: completions,\n validFor: /^[a-zA-Z0-9_.\\[\\]]*$/,\n };\n };\n}\n","import type { DecorationSet, EditorView, ViewUpdate } from '@codemirror/view';\nimport { Decoration, MatchDecorator, ViewPlugin } from '@codemirror/view';\n\n/**\n * Regex pattern to match variable placeholders like {{variableName}} or {{user.name}}\n * Matches: {{ followed by a valid identifier path (with optional dot notation), then }}\n */\nexport const VARIABLE_PATTERN = /\\{\\{([a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*)\\}\\}/g;\n\nconst variableDecoration = Decoration.mark({\n class: 'cm-variable-highlight',\n});\n\nconst variableMatcher = new MatchDecorator({\n regexp: VARIABLE_PATTERN,\n decoration: () => variableDecoration,\n});\n\nconst variableHighlightPlugin = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = variableMatcher.createDeco(view);\n }\n\n update(update: ViewUpdate) {\n this.decorations = variableMatcher.updateDeco(update, this.decorations);\n }\n },\n {\n decorations: v => v.decorations,\n },\n);\n\n/**\n * CodeMirror extension that highlights {{variableName}} patterns\n * with orange color and semibold weight\n */\nexport const variableHighlight = variableHighlightPlugin;\n","import { jsonLanguage } from '@codemirror/lang-json';\nimport { markdown, markdownLanguage } from '@codemirror/lang-markdown';\nimport { syntaxHighlighting } from '@codemirror/language';\nimport { EditorState, Prec } from '@codemirror/state';\nimport type { Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport CodeMirror from '@uiw/react-codemirror';\nimport type { ReactCodeMirrorRef } from '@uiw/react-codemirror';\nimport { cva } from 'class-variance-authority';\nimport type { VariantProps } from 'class-variance-authority';\nimport { Braces } from 'lucide-react';\nimport { forwardRef, useMemo } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { codeLanguages } from './code-languages';\nimport { codeFoldGutter } from './fold-gutter-extension';\nimport { syntaxHighlighter } from './highlight';\nimport { createVariableAutocomplete } from './variable-autocomplete-extension';\nimport { variableHighlight } from './variable-highlight-extension';\nimport { Button } from '@/ds/components/Button';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { useFieldControlAria } from '@/ds/components/Field/field-control-aria';\nimport { fieldErrorRimWithin, inputSurfaceAndFocusWithinStyle } from '@/ds/primitives/form-element';\nimport { formatJSON } from '@/lib/formatting';\nimport type { JsonSchema } from '@/lib/json-schema';\nimport { toast } from '@/lib/toast';\nimport { cn } from '@/lib/utils';\n\nexport type CodeEditorLanguage = 'json' | 'markdown';\ntype CodeEditorFont = 'body' | 'mono';\n\n/**\n * The single CodeMirror theme for every editor. Chrome and syntax colors come\n * from CSS variables that flip under `.dark`, and syntax roles use the same\n * `syntaxHighlighter` as the read-only `<Code>` viewer, so editors and viewers\n * look identical in both modes.\n */\nfunction buildCodemirrorTheme(font: CodeEditorFont): Extension {\n const editorTheme = EditorView.theme({\n '&': {\n backgroundColor: 'transparent',\n color: 'var(--foreground)',\n fontSize: 'var(--text-body-sm)',\n },\n '&.cm-editor .cm-scroller': {\n fontFamily: `var(--font-${font})`,\n },\n '.cm-gutters': {\n backgroundColor: 'transparent',\n color: 'var(--placeholder)',\n borderRight: 'none',\n },\n '.cm-content': {\n color: 'var(--foreground)',\n caretColor: 'var(--foreground)',\n },\n '.cm-activeLine': {\n backgroundColor: 'transparent',\n },\n '.cm-lineNumbers .cm-gutterElement': {\n color: 'var(--placeholder)',\n },\n '.cm-activeLineGutter': {\n backgroundColor: 'transparent',\n color: 'var(--muted-foreground)',\n },\n '.cm-cursor, .cm-dropCursor': {\n borderLeftColor: 'var(--foreground)',\n },\n '&.cm-focused .cm-selectionBackground, & .cm-line::selection, & .cm-selectionLayer .cm-selectionBackground, .cm-content ::selection':\n {\n background: 'var(--info-edge) !important',\n },\n '.cm-tooltip-autocomplete': {\n backgroundColor: 'var(--background)',\n border: '1px solid var(--border)',\n borderRadius: '6px',\n boxShadow: 'var(--elevation-overlay)',\n },\n '.cm-tooltip-autocomplete > ul': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-completionLabel': {\n color: 'var(--foreground)',\n },\n '.cm-completionDetail': {\n color: 'var(--muted-foreground)',\n fontSize: 'var(--text-caption)',\n marginLeft: 'auto',\n paddingLeft: '12px',\n },\n '.cm-completionInfo': {\n backgroundColor: 'var(--background)',\n border: '1px solid var(--border)',\n color: 'var(--muted-foreground)',\n padding: '8px 12px',\n },\n '.cm-completionIcon': {\n display: 'none',\n },\n 'ul.cm-completionList li[aria-selected]': {\n backgroundColor: 'var(--fill-hover)',\n color: 'var(--foreground)',\n },\n '.cm-line .cm-variable-highlight': {\n color: 'var(--warning-foreground) !important',\n fontWeight: '500',\n },\n });\n\n return [editorTheme, syntaxHighlighting(syntaxHighlighter)];\n}\n\n// eslint-disable-next-line react-refresh/only-export-components -- shared hook intentionally co-located with the editor it themes\nexport const useCodemirrorTheme = (font: CodeEditorFont = 'mono'): Extension => {\n return useMemo(() => buildCodemirrorTheme(font), [font]);\n};\n\nconst codeEditorVariants = cva(\n cn(\n 'relative overflow-hidden font-mono outline-hidden focus-within:outline-hidden focus:outline-hidden',\n 'transition-colors duration-normal ease-out-custom',\n ),\n {\n variants: {\n variant: {\n default: cn(inputSurfaceAndFocusWithinStyle, 'rounded-md p-1', fieldErrorRimWithin),\n embedded: 'rounded-none border-none bg-transparent p-0',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nconst editorFocusAttributes = Prec.highest(\n EditorView.editorAttributes.of({\n style: 'outline: none',\n }),\n);\n\nconst editorFocusTheme = Prec.highest(\n EditorView.theme({\n '&': {\n outline: 'none',\n },\n '&.cm-focused': {\n outline: 'none',\n },\n '.cm-scroller': {\n outline: 'none',\n },\n '.cm-content': {\n outline: 'none',\n },\n '.cm-content:focus': {\n outline: 'none',\n },\n }),\n);\n\nconst editorFocusExtensions: Extension[] = [editorFocusAttributes, editorFocusTheme];\n\ntype CodeEditorContentAttributes = {\n 'aria-label': string;\n id?: string;\n 'aria-labelledby'?: string;\n 'aria-describedby'?: string;\n 'aria-invalid'?: string;\n};\n\nexport type CodeEditorProps = {\n /** Prose editors can opt into the body face; code stays monospace by default. */\n font?: CodeEditorFont;\n data?: Record<string, unknown> | Array<Record<string, unknown>>;\n value?: string;\n onChange?: (value: string) => void;\n showCopyButton?: boolean;\n /** Offers a button that rewrites the JSON with Prettier. Needs `onChange`; ignored for markdown or read-only editors. */\n showFormatButton?: boolean;\n className?: string;\n highlightVariables?: boolean;\n language?: CodeEditorLanguage;\n placeholder?: string;\n /** JSON Schema to enable variable autocomplete for {{variable}} placeholders (markdown only) */\n schema?: JsonSchema;\n autoFocus?: boolean;\n /** Show line numbers in the gutter (default: true) */\n lineNumbers?: boolean;\n /** Wrap long lines within the editor viewport (default: true) */\n lineWrapping?: boolean;\n /** When false, makes the editor read-only */\n editable?: boolean;\n /** Extra CodeMirror extensions, added after the built-in ones. Memoize them to avoid reconfiguring on every render. */\n extensions?: Extension[];\n} & VariantProps<typeof codeEditorVariants> &\n Omit<HTMLAttributes<HTMLDivElement>, 'onChange'>;\n\nexport const CodeEditor = forwardRef<ReactCodeMirrorRef, CodeEditorProps>(\n (\n {\n data,\n value,\n onChange,\n showCopyButton = true,\n showFormatButton = false,\n className,\n language = 'json',\n font = 'mono',\n highlightVariables = false,\n placeholder,\n schema,\n autoFocus,\n lineNumbers = true,\n lineWrapping = true,\n editable,\n extensions: extraExtensions,\n variant,\n id,\n 'aria-label': ariaLabelProp,\n 'aria-labelledby': ariaLabelledByProp,\n 'aria-describedby': ariaDescribedByProp,\n 'aria-invalid': ariaInvalidProp,\n ...props\n },\n ref,\n ) => {\n const fieldAria = useFieldControlAria({ 'aria-label': ariaLabelProp });\n const ariaLabel = ariaLabelProp ?? 'Code editor';\n const controlId = id ?? fieldAria.id;\n const ariaLabelledBy = ariaLabelledByProp ?? fieldAria['aria-labelledby'];\n const ariaDescribedBy = ariaDescribedByProp ?? fieldAria['aria-describedby'];\n const ariaInvalid = ariaInvalidProp ?? fieldAria['aria-invalid'];\n const theme = useCodemirrorTheme(font);\n const formattedCode = data ? JSON.stringify(data, null, 2) : (value ?? '');\n const canFormat = showFormatButton && language === 'json' && editable !== false && Boolean(onChange);\n\n const handleFormat = async () => {\n try {\n onChange?.((await formatJSON(formattedCode)).trimEnd());\n } catch {\n toast.error('Can’t format: the JSON is invalid');\n }\n };\n\n const extensions = useMemo(() => {\n const contentAttributes: CodeEditorContentAttributes = { 'aria-label': ariaLabel };\n if (controlId) contentAttributes.id = controlId;\n if (ariaLabelledBy) contentAttributes['aria-labelledby'] = ariaLabelledBy;\n if (ariaDescribedBy) contentAttributes['aria-describedby'] = ariaDescribedBy;\n if (ariaInvalid !== undefined) contentAttributes['aria-invalid'] = String(ariaInvalid);\n\n const exts: Extension[] = [\n ...editorFocusExtensions,\n EditorView.contentAttributes.of(contentAttributes),\n codeFoldGutter,\n ];\n\n if (lineWrapping) {\n exts.push(EditorView.lineWrapping);\n }\n\n if (language === 'json') {\n exts.push(jsonLanguage);\n } else if (language === 'markdown') {\n exts.push(markdown({ base: markdownLanguage, codeLanguages }));\n }\n\n if (highlightVariables && language === 'markdown') {\n exts.push(variableHighlight);\n }\n\n if (schema && language === 'markdown') {\n exts.push(createVariableAutocomplete(schema));\n }\n\n if (editable === false) {\n exts.push(EditorState.readOnly.of(true));\n }\n\n if (extraExtensions) {\n exts.push(...extraExtensions);\n }\n\n return exts;\n }, [\n extraExtensions,\n language,\n highlightVariables,\n schema,\n editable,\n lineWrapping,\n controlId,\n ariaLabel,\n ariaLabelledBy,\n ariaDescribedBy,\n ariaInvalid,\n ]);\n\n return (\n <div className={cn(codeEditorVariants({ variant }), className)} {...props}>\n {(showCopyButton || canFormat) && (\n <div className=\"absolute top-2 right-2 z-20 flex gap-1\">\n {canFormat && (\n <Button\n type=\"button\"\n size=\"icon-sm\"\n tooltip=\"Format JSON\"\n aria-label=\"Format JSON\"\n onClick={handleFormat}\n >\n <Braces />\n </Button>\n )}\n {showCopyButton && <CopyButton content={formattedCode} />}\n </div>\n )}\n <CodeMirror\n ref={ref}\n value={formattedCode}\n theme={theme}\n extensions={extensions}\n onChange={onChange}\n editable={editable}\n aria-label={ariaLabel}\n placeholder={placeholder}\n height=\"100%\"\n style={{ height: '100%' }}\n autoFocus={autoFocus}\n basicSetup={{ lineNumbers, foldGutter: false }}\n />\n </div>\n );\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"CodeEditor-CJ9jC9lu.cjs","names":["LanguageSupport","StreamLanguage","LanguageDescription","EditorView","foldGutter","autocompletion","Decoration","MatchDecorator","ViewPlugin","EditorView","syntaxHighlighting","syntaxHighlighter","useMemo","cva","cn","inputSurfaceAndFocusWithinStyle","fieldErrorRimWithin","Prec","forwardRef","useFieldControlAria","formatJSON","jsonLanguage","markdown","markdownLanguage","EditorState","Button","Braces","CopyButton","CodeMirror"],"sources":["../src/ds/components/CodeEditor/code-languages.ts","../src/ds/components/CodeEditor/fold-gutter-extension.ts","../src/ds/components/CodeEditor/schema-to-variables.ts","../src/ds/components/CodeEditor/variable-autocomplete-extension.ts","../src/ds/components/CodeEditor/variable-highlight-extension.ts","../src/ds/components/CodeEditor/code-editor.tsx"],"sourcesContent":["import { LanguageDescription, LanguageSupport, StreamLanguage } from '@codemirror/language';\n\nfunction legacy(parser: Parameters<typeof StreamLanguage.define>[0]) {\n return new LanguageSupport(StreamLanguage.define(parser));\n}\n\n/**\n * A minimal subset of CodeMirror language descriptions used for fenced code\n * blocks inside markdown. Mirrors the relevant entries from\n * `@codemirror/language-data` but only the languages we actually support, so\n * bundlers don't have to emit a chunk for every known language.\n */\nexport const codeLanguages = [\n LanguageDescription.of({\n name: 'JavaScript',\n alias: ['ecmascript', 'js', 'node'],\n extensions: ['js', 'mjs', 'cjs'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript());\n },\n }),\n LanguageDescription.of({\n name: 'JSON',\n alias: ['json5'],\n extensions: ['json', 'map'],\n load() {\n return import('@codemirror/lang-json').then(m => m.json());\n },\n }),\n LanguageDescription.of({\n name: 'JSX',\n extensions: ['jsx'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ jsx: true }));\n },\n }),\n LanguageDescription.of({\n name: 'Markdown',\n extensions: ['md', 'markdown', 'mkd'],\n load() {\n return import('@codemirror/lang-markdown').then(m => m.markdown());\n },\n }),\n LanguageDescription.of({\n name: 'TSX',\n extensions: ['tsx'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ jsx: true, typescript: true }));\n },\n }),\n LanguageDescription.of({\n name: 'TypeScript',\n alias: ['ts'],\n extensions: ['ts', 'mts', 'cts'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ typescript: true }));\n },\n }),\n LanguageDescription.of({\n name: 'Shell',\n alias: ['bash', 'sh', 'zsh'],\n extensions: ['sh', 'ksh', 'bash'],\n filename: /^PKGBUILD$/,\n load() {\n return import('@codemirror/legacy-modes/mode/shell').then(m => legacy(m.shell));\n },\n }),\n];\n","import { foldGutter } from '@codemirror/language';\nimport type { Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\n\nconst foldTheme = EditorView.theme({\n '.cm-foldGutter .cm-gutterElement': {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0 4px',\n },\n '.cm-fold-marker': {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '12px',\n height: '12px',\n boxSizing: 'border-box',\n border: '1px solid var(--border)',\n borderRadius: '2px',\n color: 'var(--muted-foreground)',\n fontSize: 'var(--text-caption)',\n lineHeight: '1',\n cursor: 'pointer',\n userSelect: 'none',\n },\n '.cm-fold-marker:hover': {\n background: 'var(--fill-hover)',\n color: 'var(--foreground)',\n },\n '.cm-foldPlaceholder': {\n background: 'var(--fill-hover)',\n border: '1px solid var(--border)',\n color: 'var(--muted-foreground)',\n borderRadius: '2px',\n padding: '0 4px',\n margin: '0 2px',\n },\n});\n\n/** Fold gutter with a square −/+ toggle next to each foldable line, styled with design tokens. */\nexport const codeFoldGutter: Extension = [\n foldGutter({\n markerDOM: open => {\n const marker = document.createElement('span');\n marker.className = 'cm-fold-marker';\n marker.dataset.state = open ? 'open' : 'closed';\n marker.title = open ? 'Fold' : 'Unfold';\n marker.textContent = open ? '−' : '+';\n return marker;\n },\n }),\n foldTheme,\n];\n","import type { JsonSchema, JsonSchemaProperty } from '@/lib/json-schema';\n\n/**\n * Represents a variable completion option derived from a schema\n */\nexport interface VariableCompletion {\n /** The dot-notation path (e.g., \"user.name\") */\n path: string;\n /** Display label for the autocomplete */\n label: string;\n /** Description from the schema, if available */\n description?: string;\n /** The type of the property */\n type?: string;\n}\n\n/**\n * Flattens a JSON Schema into a list of variable completions for autocomplete.\n * Recursively extracts property paths using dot-notation.\n *\n * @param schema - The JSON Schema to flatten\n * @param maxDepth - Maximum recursion depth (default: 5)\n * @returns Array of variable completions\n *\n * @example\n * ```ts\n * const schema = {\n * type: 'object',\n * properties: {\n * user: {\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * email: { type: 'string' }\n * }\n * }\n * }\n * };\n *\n * flattenSchemaToVariables(schema);\n * // Returns:\n * // [\n * // { path: 'user', label: 'user', type: 'object' },\n * // { path: 'user.name', label: 'user.name', type: 'string' },\n * // { path: 'user.email', label: 'user.email', type: 'string' }\n * // ]\n * ```\n */\nexport function flattenSchemaToVariables(schema: JsonSchema | undefined, maxDepth = 5): VariableCompletion[] {\n if (!schema?.properties) {\n return [];\n }\n\n const results: VariableCompletion[] = [];\n\n function processProperty(property: JsonSchemaProperty, path: string, depth: number): void {\n if (depth > maxDepth) {\n return;\n }\n\n const type = Array.isArray(property.type) ? property.type.join(' | ') : property.type;\n\n results.push({\n path,\n label: path,\n description: property.description ?? property.title,\n type,\n });\n\n // Recurse into nested object properties\n if (property.properties) {\n for (const [key, nestedProperty] of Object.entries(property.properties)) {\n processProperty(nestedProperty, `${path}.${key}`, depth + 1);\n }\n }\n\n // Handle array items if they have properties (array of objects)\n if (property.items?.properties) {\n // Add a placeholder for array item access (e.g., items[0].name)\n for (const [key, itemProperty] of Object.entries(property.items.properties)) {\n processProperty(itemProperty, `${path}[].${key}`, depth + 1);\n }\n }\n }\n\n for (const [key, property] of Object.entries(schema.properties)) {\n processProperty(property, key, 1);\n }\n\n return results;\n}\n","import { autocompletion } from '@codemirror/autocomplete';\nimport type { Completion, CompletionContext, CompletionResult } from '@codemirror/autocomplete';\nimport type { Extension } from '@codemirror/state';\nimport { flattenSchemaToVariables } from './schema-to-variables';\nimport type { VariableCompletion } from './schema-to-variables';\nimport type { JsonSchema } from '@/lib/json-schema';\n\n/**\n * Creates a CodeMirror autocomplete extension for {{variable}} placeholders.\n * Triggers when the user types `{{` and shows suggestions derived from the schema.\n *\n * @param schema - JSON Schema to derive variable suggestions from\n * @returns CodeMirror Extension that provides variable autocomplete\n *\n * @example\n * ```tsx\n * const schema = {\n * type: 'object',\n * properties: {\n * user: { type: 'object', properties: { name: { type: 'string' } } }\n * }\n * };\n *\n * <CodeMirror extensions={[createVariableAutocomplete(schema)]} />\n * // Typing \"{{\" will show: user, user.name\n * ```\n */\nexport function createVariableAutocomplete(schema: JsonSchema | undefined): Extension {\n const variables = flattenSchemaToVariables(schema);\n\n return autocompletion({\n override: [createVariableCompletionSource(variables)],\n defaultKeymap: true,\n closeOnBlur: true,\n icons: false,\n });\n}\n\n/**\n * Creates a completion source function for CodeMirror's autocompletion.\n */\nexport function createVariableCompletionSource(\n variables: VariableCompletion[],\n): (context: CompletionContext) => CompletionResult | null {\n return (context: CompletionContext): CompletionResult | null => {\n // Look for {{ pattern before cursor\n const beforeCursor = context.state.sliceDoc(Math.max(0, context.pos - 50), context.pos);\n const match = beforeCursor.match(/\\{\\{([a-zA-Z0-9_.\\[\\]]*)?$/);\n\n if (!match) {\n return null;\n }\n\n // The text after {{ that we're matching against\n const prefix = match[1] ?? '';\n const startPos = context.pos - prefix.length;\n\n // Filter variables based on what the user has typed\n const filteredVariables = prefix\n ? variables.filter(v => v.path.toLowerCase().startsWith(prefix.toLowerCase()))\n : variables;\n\n if (filteredVariables.length === 0) {\n return null;\n }\n\n const completions: Completion[] = filteredVariables.map(variable => ({\n label: variable.path,\n displayLabel: variable.path,\n detail: variable.type,\n info: variable.description,\n apply: (view, completion, from, to) => {\n // Inside an existing placeholder, replace the rest of the identifier and reuse its closing }}\n const rest = view.state.sliceDoc(to);\n const identifierEnd = to + (rest.match(/^[a-zA-Z0-9_.\\[\\]]*/)?.[0].length ?? 0);\n const hasClosingBraces = view.state.sliceDoc(identifierEnd, identifierEnd + 2) === '}}';\n const end = hasClosingBraces ? identifierEnd : to;\n\n const insertText = hasClosingBraces ? completion.label : `${completion.label}}}`;\n\n view.dispatch({\n changes: { from, to: end, insert: insertText },\n selection: { anchor: from + insertText.length },\n });\n },\n }));\n\n return {\n from: startPos,\n options: completions,\n validFor: /^[a-zA-Z0-9_.\\[\\]]*$/,\n };\n };\n}\n","import type { DecorationSet, EditorView, ViewUpdate } from '@codemirror/view';\nimport { Decoration, MatchDecorator, ViewPlugin } from '@codemirror/view';\n\n/**\n * Regex pattern to match variable placeholders like {{variableName}} or {{user.name}}\n * Matches: {{ followed by a valid identifier path (with optional dot notation), then }}\n */\nexport const VARIABLE_PATTERN = /\\{\\{([a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*)\\}\\}/g;\n\nconst variableDecoration = Decoration.mark({\n class: 'cm-variable-highlight',\n});\n\nconst variableMatcher = new MatchDecorator({\n regexp: VARIABLE_PATTERN,\n decoration: () => variableDecoration,\n});\n\nconst variableHighlightPlugin = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = variableMatcher.createDeco(view);\n }\n\n update(update: ViewUpdate) {\n this.decorations = variableMatcher.updateDeco(update, this.decorations);\n }\n },\n {\n decorations: v => v.decorations,\n },\n);\n\n/**\n * CodeMirror extension that highlights {{variableName}} patterns\n * with orange color and semibold weight\n */\nexport const variableHighlight = variableHighlightPlugin;\n","import { jsonLanguage } from '@codemirror/lang-json';\nimport { markdown, markdownLanguage } from '@codemirror/lang-markdown';\nimport { syntaxHighlighting } from '@codemirror/language';\nimport { EditorState, Prec } from '@codemirror/state';\nimport type { Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport CodeMirror from '@uiw/react-codemirror';\nimport type { ReactCodeMirrorRef } from '@uiw/react-codemirror';\nimport { cva } from 'class-variance-authority';\nimport type { VariantProps } from 'class-variance-authority';\nimport { Braces } from 'lucide-react';\nimport { forwardRef, useMemo } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { codeLanguages } from './code-languages';\nimport { codeFoldGutter } from './fold-gutter-extension';\nimport { syntaxHighlighter } from './highlight';\nimport { createVariableAutocomplete } from './variable-autocomplete-extension';\nimport { variableHighlight } from './variable-highlight-extension';\nimport { Button } from '@/ds/components/Button';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { useFieldControlAria } from '@/ds/components/Field/field-control-aria';\nimport { fieldErrorRimWithin, inputSurfaceAndFocusWithinStyle } from '@/ds/primitives/form-element';\nimport { formatJSON } from '@/lib/formatting';\nimport type { JsonSchema } from '@/lib/json-schema';\nimport { toast } from '@/lib/toast';\nimport { cn } from '@/lib/utils';\n\nexport type CodeEditorLanguage = 'json' | 'markdown';\ntype CodeEditorFont = 'body' | 'mono';\n\n/**\n * The single CodeMirror theme for every editor. Chrome and syntax colors come\n * from CSS variables that flip under `.dark`, and syntax roles use the same\n * `syntaxHighlighter` as the read-only `<Code>` viewer, so editors and viewers\n * look identical in both modes.\n */\nfunction buildCodemirrorTheme(font: CodeEditorFont): Extension {\n const editorTheme = EditorView.theme({\n '&': {\n backgroundColor: 'transparent',\n color: 'var(--foreground)',\n fontSize: 'var(--text-body-sm)',\n },\n '&.cm-editor .cm-scroller': {\n fontFamily: `var(--font-${font})`,\n },\n '.cm-gutters': {\n backgroundColor: 'transparent',\n color: 'var(--placeholder)',\n borderRight: 'none',\n },\n '.cm-content': {\n color: 'var(--foreground)',\n caretColor: 'var(--foreground)',\n },\n '.cm-activeLine': {\n backgroundColor: 'transparent',\n },\n '.cm-lineNumbers .cm-gutterElement': {\n color: 'var(--placeholder)',\n },\n '.cm-activeLineGutter': {\n backgroundColor: 'transparent',\n color: 'var(--muted-foreground)',\n },\n '.cm-cursor, .cm-dropCursor': {\n borderLeftColor: 'var(--foreground)',\n },\n '&.cm-focused .cm-selectionBackground, & .cm-line::selection, & .cm-selectionLayer .cm-selectionBackground, .cm-content ::selection':\n {\n background: 'var(--info-edge) !important',\n },\n '.cm-tooltip-autocomplete': {\n backgroundColor: 'var(--background)',\n border: '1px solid var(--border)',\n borderRadius: '6px',\n boxShadow: 'var(--elevation-overlay)',\n },\n '.cm-tooltip-autocomplete > ul': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-completionLabel': {\n color: 'var(--foreground)',\n },\n '.cm-completionDetail': {\n color: 'var(--muted-foreground)',\n fontSize: 'var(--text-caption)',\n marginLeft: 'auto',\n paddingLeft: '12px',\n },\n '.cm-completionInfo': {\n backgroundColor: 'var(--background)',\n border: '1px solid var(--border)',\n color: 'var(--muted-foreground)',\n padding: '8px 12px',\n },\n '.cm-completionIcon': {\n display: 'none',\n },\n 'ul.cm-completionList li[aria-selected]': {\n backgroundColor: 'var(--fill-hover)',\n color: 'var(--foreground)',\n },\n '.cm-line .cm-variable-highlight': {\n color: 'var(--warning-foreground) !important',\n fontWeight: '500',\n },\n });\n\n return [editorTheme, syntaxHighlighting(syntaxHighlighter)];\n}\n\n// eslint-disable-next-line react-refresh/only-export-components -- shared hook intentionally co-located with the editor it themes\nexport const useCodemirrorTheme = (font: CodeEditorFont = 'mono'): Extension => {\n return useMemo(() => buildCodemirrorTheme(font), [font]);\n};\n\nconst codeEditorVariants = cva(\n cn(\n 'relative overflow-hidden font-mono outline-hidden focus-within:outline-hidden focus:outline-hidden',\n 'transition-colors duration-normal ease-out-custom',\n ),\n {\n variants: {\n variant: {\n default: cn(inputSurfaceAndFocusWithinStyle, 'rounded-md p-1', fieldErrorRimWithin),\n embedded: 'rounded-none border-none bg-transparent p-0',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nconst editorFocusAttributes = Prec.highest(\n EditorView.editorAttributes.of({\n style: 'outline: none',\n }),\n);\n\nconst editorFocusTheme = Prec.highest(\n EditorView.theme({\n '&': {\n outline: 'none',\n },\n '&.cm-focused': {\n outline: 'none',\n },\n '.cm-scroller': {\n outline: 'none',\n },\n '.cm-content': {\n outline: 'none',\n },\n '.cm-content:focus': {\n outline: 'none',\n },\n }),\n);\n\nconst editorFocusExtensions: Extension[] = [editorFocusAttributes, editorFocusTheme];\n\ntype CodeEditorContentAttributes = {\n 'aria-label': string;\n id?: string;\n 'aria-labelledby'?: string;\n 'aria-describedby'?: string;\n 'aria-invalid'?: string;\n};\n\nexport type CodeEditorProps = {\n /** Prose editors can opt into the body face; code stays monospace by default. */\n font?: CodeEditorFont;\n data?: Record<string, unknown> | Array<Record<string, unknown>>;\n value?: string;\n onChange?: (value: string) => void;\n showCopyButton?: boolean;\n /** Offers a button that rewrites the JSON with Prettier. Needs `onChange`; ignored for markdown or read-only editors. */\n showFormatButton?: boolean;\n className?: string;\n highlightVariables?: boolean;\n language?: CodeEditorLanguage;\n placeholder?: string;\n /** JSON Schema to enable variable autocomplete for {{variable}} placeholders (markdown only) */\n schema?: JsonSchema;\n autoFocus?: boolean;\n /** Show line numbers in the gutter (default: true) */\n lineNumbers?: boolean;\n /** Wrap long lines within the editor viewport (default: true) */\n lineWrapping?: boolean;\n /** When false, makes the editor read-only */\n editable?: boolean;\n /** Extra CodeMirror extensions, added after the built-in ones. Memoize them to avoid reconfiguring on every render. */\n extensions?: Extension[];\n} & VariantProps<typeof codeEditorVariants> &\n Omit<HTMLAttributes<HTMLDivElement>, 'onChange'>;\n\nexport const CodeEditor = forwardRef<ReactCodeMirrorRef, CodeEditorProps>(\n (\n {\n data,\n value,\n onChange,\n showCopyButton = true,\n showFormatButton = false,\n className,\n language = 'json',\n font = 'mono',\n highlightVariables = false,\n placeholder,\n schema,\n autoFocus,\n lineNumbers = true,\n lineWrapping = true,\n editable,\n extensions: extraExtensions,\n variant,\n id,\n 'aria-label': ariaLabelProp,\n 'aria-labelledby': ariaLabelledByProp,\n 'aria-describedby': ariaDescribedByProp,\n 'aria-invalid': ariaInvalidProp,\n ...props\n },\n ref,\n ) => {\n const fieldAria = useFieldControlAria({ 'aria-label': ariaLabelProp });\n const ariaLabel = ariaLabelProp ?? 'Code editor';\n const controlId = id ?? fieldAria.id;\n const ariaLabelledBy = ariaLabelledByProp ?? fieldAria['aria-labelledby'];\n const ariaDescribedBy = ariaDescribedByProp ?? fieldAria['aria-describedby'];\n const ariaInvalid = ariaInvalidProp ?? fieldAria['aria-invalid'];\n const theme = useCodemirrorTheme(font);\n const formattedCode = data ? JSON.stringify(data, null, 2) : (value ?? '');\n const canFormat = showFormatButton && language === 'json' && editable !== false && Boolean(onChange);\n\n const handleFormat = async () => {\n try {\n onChange?.((await formatJSON(formattedCode)).trimEnd());\n } catch {\n toast.error('Can’t format: the JSON is invalid');\n }\n };\n\n const extensions = useMemo(() => {\n const contentAttributes: CodeEditorContentAttributes = { 'aria-label': ariaLabel };\n if (controlId) contentAttributes.id = controlId;\n if (ariaLabelledBy) contentAttributes['aria-labelledby'] = ariaLabelledBy;\n if (ariaDescribedBy) contentAttributes['aria-describedby'] = ariaDescribedBy;\n if (ariaInvalid !== undefined) contentAttributes['aria-invalid'] = String(ariaInvalid);\n\n const exts: Extension[] = [\n ...editorFocusExtensions,\n EditorView.contentAttributes.of(contentAttributes),\n codeFoldGutter,\n ];\n\n if (lineWrapping) {\n exts.push(EditorView.lineWrapping);\n }\n\n if (language === 'json') {\n exts.push(jsonLanguage);\n } else if (language === 'markdown') {\n exts.push(markdown({ base: markdownLanguage, codeLanguages }));\n }\n\n if (highlightVariables && language === 'markdown') {\n exts.push(variableHighlight);\n }\n\n if (schema && language === 'markdown') {\n exts.push(createVariableAutocomplete(schema));\n }\n\n if (editable === false) {\n exts.push(EditorState.readOnly.of(true));\n }\n\n if (extraExtensions) {\n exts.push(...extraExtensions);\n }\n\n return exts;\n }, [\n extraExtensions,\n language,\n highlightVariables,\n schema,\n editable,\n lineWrapping,\n controlId,\n ariaLabel,\n ariaLabelledBy,\n ariaDescribedBy,\n ariaInvalid,\n ]);\n\n return (\n <div className={cn(codeEditorVariants({ variant }), className)} {...props}>\n {(showCopyButton || canFormat) && (\n <div className=\"absolute top-2 right-2 z-20 flex gap-1\">\n {canFormat && (\n <Button\n type=\"button\"\n size=\"icon-sm\"\n tooltip=\"Format JSON\"\n aria-label=\"Format JSON\"\n onClick={handleFormat}\n >\n <Braces />\n </Button>\n )}\n {showCopyButton && <CopyButton content={formattedCode} />}\n </div>\n )}\n <CodeMirror\n ref={ref}\n value={formattedCode}\n theme={theme}\n extensions={extensions}\n onChange={onChange}\n editable={editable}\n aria-label={ariaLabel}\n placeholder={placeholder}\n height=\"100%\"\n style={{ height: '100%' }}\n autoFocus={autoFocus}\n basicSetup={{ lineNumbers, foldGutter: false }}\n />\n </div>\n );\n },\n);\n"],"mappings":"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"}
@@ -5,8 +5,8 @@ import { fieldErrorRimWithin, inputSurfaceAndFocusWithinStyle } from "./primitiv
5
5
  import { t as Button } from "./Button-Bw1e3ONi.js";
6
6
  import { i as useFieldControlAria } from "./field-control-aria-BaRSUUMR.js";
7
7
  import { t as toast } from "./toast-api-WhxnAT9F.js";
8
- import { r as syntaxHighlighter } from "./highlight-DF-vd68d.js";
9
8
  import { t as CopyButton } from "./copy-button-CF-X4iDj.js";
9
+ import { r as syntaxHighlighter } from "./highlight-DF-vd68d.js";
10
10
  import { forwardRef, useMemo } from "react";
11
11
  import { jsx, jsxs } from "react/jsx-runtime";
12
12
  import { Braces } from "lucide-react";
@@ -463,4 +463,4 @@ var CodeEditor = forwardRef(({ data, value, onChange, showCopyButton = true, sho
463
463
  });
464
464
  export { createVariableAutocomplete as a, codeLanguages as c, variableHighlight as i, useCodemirrorTheme as n, flattenSchemaToVariables as o, VARIABLE_PATTERN as r, codeFoldGutter as s, CodeEditor as t };
465
465
 
466
- //# sourceMappingURL=CodeEditor-CZC9DMKA.js.map
466
+ //# sourceMappingURL=CodeEditor-CPVxj7WS.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CodeEditor-CZC9DMKA.js","names":[],"sources":["../src/ds/components/CodeEditor/code-languages.ts","../src/ds/components/CodeEditor/fold-gutter-extension.ts","../src/ds/components/CodeEditor/schema-to-variables.ts","../src/ds/components/CodeEditor/variable-autocomplete-extension.ts","../src/ds/components/CodeEditor/variable-highlight-extension.ts","../src/ds/components/CodeEditor/code-editor.tsx"],"sourcesContent":["import { LanguageDescription, LanguageSupport, StreamLanguage } from '@codemirror/language';\n\nfunction legacy(parser: Parameters<typeof StreamLanguage.define>[0]) {\n return new LanguageSupport(StreamLanguage.define(parser));\n}\n\n/**\n * A minimal subset of CodeMirror language descriptions used for fenced code\n * blocks inside markdown. Mirrors the relevant entries from\n * `@codemirror/language-data` but only the languages we actually support, so\n * bundlers don't have to emit a chunk for every known language.\n */\nexport const codeLanguages = [\n LanguageDescription.of({\n name: 'JavaScript',\n alias: ['ecmascript', 'js', 'node'],\n extensions: ['js', 'mjs', 'cjs'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript());\n },\n }),\n LanguageDescription.of({\n name: 'JSON',\n alias: ['json5'],\n extensions: ['json', 'map'],\n load() {\n return import('@codemirror/lang-json').then(m => m.json());\n },\n }),\n LanguageDescription.of({\n name: 'JSX',\n extensions: ['jsx'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ jsx: true }));\n },\n }),\n LanguageDescription.of({\n name: 'Markdown',\n extensions: ['md', 'markdown', 'mkd'],\n load() {\n return import('@codemirror/lang-markdown').then(m => m.markdown());\n },\n }),\n LanguageDescription.of({\n name: 'TSX',\n extensions: ['tsx'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ jsx: true, typescript: true }));\n },\n }),\n LanguageDescription.of({\n name: 'TypeScript',\n alias: ['ts'],\n extensions: ['ts', 'mts', 'cts'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ typescript: true }));\n },\n }),\n LanguageDescription.of({\n name: 'Shell',\n alias: ['bash', 'sh', 'zsh'],\n extensions: ['sh', 'ksh', 'bash'],\n filename: /^PKGBUILD$/,\n load() {\n return import('@codemirror/legacy-modes/mode/shell').then(m => legacy(m.shell));\n },\n }),\n];\n","import { foldGutter } from '@codemirror/language';\nimport type { Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\n\nconst foldTheme = EditorView.theme({\n '.cm-foldGutter .cm-gutterElement': {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0 4px',\n },\n '.cm-fold-marker': {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '12px',\n height: '12px',\n boxSizing: 'border-box',\n border: '1px solid var(--border)',\n borderRadius: '2px',\n color: 'var(--muted-foreground)',\n fontSize: 'var(--text-caption)',\n lineHeight: '1',\n cursor: 'pointer',\n userSelect: 'none',\n },\n '.cm-fold-marker:hover': {\n background: 'var(--fill-hover)',\n color: 'var(--foreground)',\n },\n '.cm-foldPlaceholder': {\n background: 'var(--fill-hover)',\n border: '1px solid var(--border)',\n color: 'var(--muted-foreground)',\n borderRadius: '2px',\n padding: '0 4px',\n margin: '0 2px',\n },\n});\n\n/** Fold gutter with a square −/+ toggle next to each foldable line, styled with design tokens. */\nexport const codeFoldGutter: Extension = [\n foldGutter({\n markerDOM: open => {\n const marker = document.createElement('span');\n marker.className = 'cm-fold-marker';\n marker.dataset.state = open ? 'open' : 'closed';\n marker.title = open ? 'Fold' : 'Unfold';\n marker.textContent = open ? '−' : '+';\n return marker;\n },\n }),\n foldTheme,\n];\n","import type { JsonSchema, JsonSchemaProperty } from '@/lib/json-schema';\n\n/**\n * Represents a variable completion option derived from a schema\n */\nexport interface VariableCompletion {\n /** The dot-notation path (e.g., \"user.name\") */\n path: string;\n /** Display label for the autocomplete */\n label: string;\n /** Description from the schema, if available */\n description?: string;\n /** The type of the property */\n type?: string;\n}\n\n/**\n * Flattens a JSON Schema into a list of variable completions for autocomplete.\n * Recursively extracts property paths using dot-notation.\n *\n * @param schema - The JSON Schema to flatten\n * @param maxDepth - Maximum recursion depth (default: 5)\n * @returns Array of variable completions\n *\n * @example\n * ```ts\n * const schema = {\n * type: 'object',\n * properties: {\n * user: {\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * email: { type: 'string' }\n * }\n * }\n * }\n * };\n *\n * flattenSchemaToVariables(schema);\n * // Returns:\n * // [\n * // { path: 'user', label: 'user', type: 'object' },\n * // { path: 'user.name', label: 'user.name', type: 'string' },\n * // { path: 'user.email', label: 'user.email', type: 'string' }\n * // ]\n * ```\n */\nexport function flattenSchemaToVariables(schema: JsonSchema | undefined, maxDepth = 5): VariableCompletion[] {\n if (!schema?.properties) {\n return [];\n }\n\n const results: VariableCompletion[] = [];\n\n function processProperty(property: JsonSchemaProperty, path: string, depth: number): void {\n if (depth > maxDepth) {\n return;\n }\n\n const type = Array.isArray(property.type) ? property.type.join(' | ') : property.type;\n\n results.push({\n path,\n label: path,\n description: property.description ?? property.title,\n type,\n });\n\n // Recurse into nested object properties\n if (property.properties) {\n for (const [key, nestedProperty] of Object.entries(property.properties)) {\n processProperty(nestedProperty, `${path}.${key}`, depth + 1);\n }\n }\n\n // Handle array items if they have properties (array of objects)\n if (property.items?.properties) {\n // Add a placeholder for array item access (e.g., items[0].name)\n for (const [key, itemProperty] of Object.entries(property.items.properties)) {\n processProperty(itemProperty, `${path}[].${key}`, depth + 1);\n }\n }\n }\n\n for (const [key, property] of Object.entries(schema.properties)) {\n processProperty(property, key, 1);\n }\n\n return results;\n}\n","import { autocompletion } from '@codemirror/autocomplete';\nimport type { Completion, CompletionContext, CompletionResult } from '@codemirror/autocomplete';\nimport type { Extension } from '@codemirror/state';\nimport { flattenSchemaToVariables } from './schema-to-variables';\nimport type { VariableCompletion } from './schema-to-variables';\nimport type { JsonSchema } from '@/lib/json-schema';\n\n/**\n * Creates a CodeMirror autocomplete extension for {{variable}} placeholders.\n * Triggers when the user types `{{` and shows suggestions derived from the schema.\n *\n * @param schema - JSON Schema to derive variable suggestions from\n * @returns CodeMirror Extension that provides variable autocomplete\n *\n * @example\n * ```tsx\n * const schema = {\n * type: 'object',\n * properties: {\n * user: { type: 'object', properties: { name: { type: 'string' } } }\n * }\n * };\n *\n * <CodeMirror extensions={[createVariableAutocomplete(schema)]} />\n * // Typing \"{{\" will show: user, user.name\n * ```\n */\nexport function createVariableAutocomplete(schema: JsonSchema | undefined): Extension {\n const variables = flattenSchemaToVariables(schema);\n\n return autocompletion({\n override: [createVariableCompletionSource(variables)],\n defaultKeymap: true,\n closeOnBlur: true,\n icons: false,\n });\n}\n\n/**\n * Creates a completion source function for CodeMirror's autocompletion.\n */\nexport function createVariableCompletionSource(\n variables: VariableCompletion[],\n): (context: CompletionContext) => CompletionResult | null {\n return (context: CompletionContext): CompletionResult | null => {\n // Look for {{ pattern before cursor\n const beforeCursor = context.state.sliceDoc(Math.max(0, context.pos - 50), context.pos);\n const match = beforeCursor.match(/\\{\\{([a-zA-Z0-9_.\\[\\]]*)?$/);\n\n if (!match) {\n return null;\n }\n\n // The text after {{ that we're matching against\n const prefix = match[1] ?? '';\n const startPos = context.pos - prefix.length;\n\n // Filter variables based on what the user has typed\n const filteredVariables = prefix\n ? variables.filter(v => v.path.toLowerCase().startsWith(prefix.toLowerCase()))\n : variables;\n\n if (filteredVariables.length === 0) {\n return null;\n }\n\n const completions: Completion[] = filteredVariables.map(variable => ({\n label: variable.path,\n displayLabel: variable.path,\n detail: variable.type,\n info: variable.description,\n apply: (view, completion, from, to) => {\n // Inside an existing placeholder, replace the rest of the identifier and reuse its closing }}\n const rest = view.state.sliceDoc(to);\n const identifierEnd = to + (rest.match(/^[a-zA-Z0-9_.\\[\\]]*/)?.[0].length ?? 0);\n const hasClosingBraces = view.state.sliceDoc(identifierEnd, identifierEnd + 2) === '}}';\n const end = hasClosingBraces ? identifierEnd : to;\n\n const insertText = hasClosingBraces ? completion.label : `${completion.label}}}`;\n\n view.dispatch({\n changes: { from, to: end, insert: insertText },\n selection: { anchor: from + insertText.length },\n });\n },\n }));\n\n return {\n from: startPos,\n options: completions,\n validFor: /^[a-zA-Z0-9_.\\[\\]]*$/,\n };\n };\n}\n","import type { DecorationSet, EditorView, ViewUpdate } from '@codemirror/view';\nimport { Decoration, MatchDecorator, ViewPlugin } from '@codemirror/view';\n\n/**\n * Regex pattern to match variable placeholders like {{variableName}} or {{user.name}}\n * Matches: {{ followed by a valid identifier path (with optional dot notation), then }}\n */\nexport const VARIABLE_PATTERN = /\\{\\{([a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*)\\}\\}/g;\n\nconst variableDecoration = Decoration.mark({\n class: 'cm-variable-highlight',\n});\n\nconst variableMatcher = new MatchDecorator({\n regexp: VARIABLE_PATTERN,\n decoration: () => variableDecoration,\n});\n\nconst variableHighlightPlugin = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = variableMatcher.createDeco(view);\n }\n\n update(update: ViewUpdate) {\n this.decorations = variableMatcher.updateDeco(update, this.decorations);\n }\n },\n {\n decorations: v => v.decorations,\n },\n);\n\n/**\n * CodeMirror extension that highlights {{variableName}} patterns\n * with orange color and semibold weight\n */\nexport const variableHighlight = variableHighlightPlugin;\n","import { jsonLanguage } from '@codemirror/lang-json';\nimport { markdown, markdownLanguage } from '@codemirror/lang-markdown';\nimport { syntaxHighlighting } from '@codemirror/language';\nimport { EditorState, Prec } from '@codemirror/state';\nimport type { Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport CodeMirror from '@uiw/react-codemirror';\nimport type { ReactCodeMirrorRef } from '@uiw/react-codemirror';\nimport { cva } from 'class-variance-authority';\nimport type { VariantProps } from 'class-variance-authority';\nimport { Braces } from 'lucide-react';\nimport { forwardRef, useMemo } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { codeLanguages } from './code-languages';\nimport { codeFoldGutter } from './fold-gutter-extension';\nimport { syntaxHighlighter } from './highlight';\nimport { createVariableAutocomplete } from './variable-autocomplete-extension';\nimport { variableHighlight } from './variable-highlight-extension';\nimport { Button } from '@/ds/components/Button';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { useFieldControlAria } from '@/ds/components/Field/field-control-aria';\nimport { fieldErrorRimWithin, inputSurfaceAndFocusWithinStyle } from '@/ds/primitives/form-element';\nimport { formatJSON } from '@/lib/formatting';\nimport type { JsonSchema } from '@/lib/json-schema';\nimport { toast } from '@/lib/toast';\nimport { cn } from '@/lib/utils';\n\nexport type CodeEditorLanguage = 'json' | 'markdown';\ntype CodeEditorFont = 'body' | 'mono';\n\n/**\n * The single CodeMirror theme for every editor. Chrome and syntax colors come\n * from CSS variables that flip under `.dark`, and syntax roles use the same\n * `syntaxHighlighter` as the read-only `<Code>` viewer, so editors and viewers\n * look identical in both modes.\n */\nfunction buildCodemirrorTheme(font: CodeEditorFont): Extension {\n const editorTheme = EditorView.theme({\n '&': {\n backgroundColor: 'transparent',\n color: 'var(--foreground)',\n fontSize: 'var(--text-body-sm)',\n },\n '&.cm-editor .cm-scroller': {\n fontFamily: `var(--font-${font})`,\n },\n '.cm-gutters': {\n backgroundColor: 'transparent',\n color: 'var(--placeholder)',\n borderRight: 'none',\n },\n '.cm-content': {\n color: 'var(--foreground)',\n caretColor: 'var(--foreground)',\n },\n '.cm-activeLine': {\n backgroundColor: 'transparent',\n },\n '.cm-lineNumbers .cm-gutterElement': {\n color: 'var(--placeholder)',\n },\n '.cm-activeLineGutter': {\n backgroundColor: 'transparent',\n color: 'var(--muted-foreground)',\n },\n '.cm-cursor, .cm-dropCursor': {\n borderLeftColor: 'var(--foreground)',\n },\n '&.cm-focused .cm-selectionBackground, & .cm-line::selection, & .cm-selectionLayer .cm-selectionBackground, .cm-content ::selection':\n {\n background: 'var(--info-edge) !important',\n },\n '.cm-tooltip-autocomplete': {\n backgroundColor: 'var(--background)',\n border: '1px solid var(--border)',\n borderRadius: '6px',\n boxShadow: 'var(--elevation-overlay)',\n },\n '.cm-tooltip-autocomplete > ul': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-completionLabel': {\n color: 'var(--foreground)',\n },\n '.cm-completionDetail': {\n color: 'var(--muted-foreground)',\n fontSize: 'var(--text-caption)',\n marginLeft: 'auto',\n paddingLeft: '12px',\n },\n '.cm-completionInfo': {\n backgroundColor: 'var(--background)',\n border: '1px solid var(--border)',\n color: 'var(--muted-foreground)',\n padding: '8px 12px',\n },\n '.cm-completionIcon': {\n display: 'none',\n },\n 'ul.cm-completionList li[aria-selected]': {\n backgroundColor: 'var(--fill-hover)',\n color: 'var(--foreground)',\n },\n '.cm-line .cm-variable-highlight': {\n color: 'var(--warning-foreground) !important',\n fontWeight: '500',\n },\n });\n\n return [editorTheme, syntaxHighlighting(syntaxHighlighter)];\n}\n\n// eslint-disable-next-line react-refresh/only-export-components -- shared hook intentionally co-located with the editor it themes\nexport const useCodemirrorTheme = (font: CodeEditorFont = 'mono'): Extension => {\n return useMemo(() => buildCodemirrorTheme(font), [font]);\n};\n\nconst codeEditorVariants = cva(\n cn(\n 'relative overflow-hidden font-mono outline-hidden focus-within:outline-hidden focus:outline-hidden',\n 'transition-colors duration-normal ease-out-custom',\n ),\n {\n variants: {\n variant: {\n default: cn(inputSurfaceAndFocusWithinStyle, 'rounded-md p-1', fieldErrorRimWithin),\n embedded: 'rounded-none border-none bg-transparent p-0',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nconst editorFocusAttributes = Prec.highest(\n EditorView.editorAttributes.of({\n style: 'outline: none',\n }),\n);\n\nconst editorFocusTheme = Prec.highest(\n EditorView.theme({\n '&': {\n outline: 'none',\n },\n '&.cm-focused': {\n outline: 'none',\n },\n '.cm-scroller': {\n outline: 'none',\n },\n '.cm-content': {\n outline: 'none',\n },\n '.cm-content:focus': {\n outline: 'none',\n },\n }),\n);\n\nconst editorFocusExtensions: Extension[] = [editorFocusAttributes, editorFocusTheme];\n\ntype CodeEditorContentAttributes = {\n 'aria-label': string;\n id?: string;\n 'aria-labelledby'?: string;\n 'aria-describedby'?: string;\n 'aria-invalid'?: string;\n};\n\nexport type CodeEditorProps = {\n /** Prose editors can opt into the body face; code stays monospace by default. */\n font?: CodeEditorFont;\n data?: Record<string, unknown> | Array<Record<string, unknown>>;\n value?: string;\n onChange?: (value: string) => void;\n showCopyButton?: boolean;\n /** Offers a button that rewrites the JSON with Prettier. Needs `onChange`; ignored for markdown or read-only editors. */\n showFormatButton?: boolean;\n className?: string;\n highlightVariables?: boolean;\n language?: CodeEditorLanguage;\n placeholder?: string;\n /** JSON Schema to enable variable autocomplete for {{variable}} placeholders (markdown only) */\n schema?: JsonSchema;\n autoFocus?: boolean;\n /** Show line numbers in the gutter (default: true) */\n lineNumbers?: boolean;\n /** Wrap long lines within the editor viewport (default: true) */\n lineWrapping?: boolean;\n /** When false, makes the editor read-only */\n editable?: boolean;\n /** Extra CodeMirror extensions, added after the built-in ones. Memoize them to avoid reconfiguring on every render. */\n extensions?: Extension[];\n} & VariantProps<typeof codeEditorVariants> &\n Omit<HTMLAttributes<HTMLDivElement>, 'onChange'>;\n\nexport const CodeEditor = forwardRef<ReactCodeMirrorRef, CodeEditorProps>(\n (\n {\n data,\n value,\n onChange,\n showCopyButton = true,\n showFormatButton = false,\n className,\n language = 'json',\n font = 'mono',\n highlightVariables = false,\n placeholder,\n schema,\n autoFocus,\n lineNumbers = true,\n lineWrapping = true,\n editable,\n extensions: extraExtensions,\n variant,\n id,\n 'aria-label': ariaLabelProp,\n 'aria-labelledby': ariaLabelledByProp,\n 'aria-describedby': ariaDescribedByProp,\n 'aria-invalid': ariaInvalidProp,\n ...props\n },\n ref,\n ) => {\n const fieldAria = useFieldControlAria({ 'aria-label': ariaLabelProp });\n const ariaLabel = ariaLabelProp ?? 'Code editor';\n const controlId = id ?? fieldAria.id;\n const ariaLabelledBy = ariaLabelledByProp ?? fieldAria['aria-labelledby'];\n const ariaDescribedBy = ariaDescribedByProp ?? fieldAria['aria-describedby'];\n const ariaInvalid = ariaInvalidProp ?? fieldAria['aria-invalid'];\n const theme = useCodemirrorTheme(font);\n const formattedCode = data ? JSON.stringify(data, null, 2) : (value ?? '');\n const canFormat = showFormatButton && language === 'json' && editable !== false && Boolean(onChange);\n\n const handleFormat = async () => {\n try {\n onChange?.((await formatJSON(formattedCode)).trimEnd());\n } catch {\n toast.error('Can’t format: the JSON is invalid');\n }\n };\n\n const extensions = useMemo(() => {\n const contentAttributes: CodeEditorContentAttributes = { 'aria-label': ariaLabel };\n if (controlId) contentAttributes.id = controlId;\n if (ariaLabelledBy) contentAttributes['aria-labelledby'] = ariaLabelledBy;\n if (ariaDescribedBy) contentAttributes['aria-describedby'] = ariaDescribedBy;\n if (ariaInvalid !== undefined) contentAttributes['aria-invalid'] = String(ariaInvalid);\n\n const exts: Extension[] = [\n ...editorFocusExtensions,\n EditorView.contentAttributes.of(contentAttributes),\n codeFoldGutter,\n ];\n\n if (lineWrapping) {\n exts.push(EditorView.lineWrapping);\n }\n\n if (language === 'json') {\n exts.push(jsonLanguage);\n } else if (language === 'markdown') {\n exts.push(markdown({ base: markdownLanguage, codeLanguages }));\n }\n\n if (highlightVariables && language === 'markdown') {\n exts.push(variableHighlight);\n }\n\n if (schema && language === 'markdown') {\n exts.push(createVariableAutocomplete(schema));\n }\n\n if (editable === false) {\n exts.push(EditorState.readOnly.of(true));\n }\n\n if (extraExtensions) {\n exts.push(...extraExtensions);\n }\n\n return exts;\n }, [\n extraExtensions,\n language,\n highlightVariables,\n schema,\n editable,\n lineWrapping,\n controlId,\n ariaLabel,\n ariaLabelledBy,\n ariaDescribedBy,\n ariaInvalid,\n ]);\n\n return (\n <div className={cn(codeEditorVariants({ variant }), className)} {...props}>\n {(showCopyButton || canFormat) && (\n <div className=\"absolute top-2 right-2 z-20 flex gap-1\">\n {canFormat && (\n <Button\n type=\"button\"\n size=\"icon-sm\"\n tooltip=\"Format JSON\"\n aria-label=\"Format JSON\"\n onClick={handleFormat}\n >\n <Braces />\n </Button>\n )}\n {showCopyButton && <CopyButton content={formattedCode} />}\n </div>\n )}\n <CodeMirror\n ref={ref}\n value={formattedCode}\n theme={theme}\n extensions={extensions}\n onChange={onChange}\n editable={editable}\n aria-label={ariaLabel}\n placeholder={placeholder}\n height=\"100%\"\n style={{ height: '100%' }}\n autoFocus={autoFocus}\n basicSetup={{ lineNumbers, foldGutter: false }}\n />\n </div>\n );\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"CodeEditor-CPVxj7WS.js","names":[],"sources":["../src/ds/components/CodeEditor/code-languages.ts","../src/ds/components/CodeEditor/fold-gutter-extension.ts","../src/ds/components/CodeEditor/schema-to-variables.ts","../src/ds/components/CodeEditor/variable-autocomplete-extension.ts","../src/ds/components/CodeEditor/variable-highlight-extension.ts","../src/ds/components/CodeEditor/code-editor.tsx"],"sourcesContent":["import { LanguageDescription, LanguageSupport, StreamLanguage } from '@codemirror/language';\n\nfunction legacy(parser: Parameters<typeof StreamLanguage.define>[0]) {\n return new LanguageSupport(StreamLanguage.define(parser));\n}\n\n/**\n * A minimal subset of CodeMirror language descriptions used for fenced code\n * blocks inside markdown. Mirrors the relevant entries from\n * `@codemirror/language-data` but only the languages we actually support, so\n * bundlers don't have to emit a chunk for every known language.\n */\nexport const codeLanguages = [\n LanguageDescription.of({\n name: 'JavaScript',\n alias: ['ecmascript', 'js', 'node'],\n extensions: ['js', 'mjs', 'cjs'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript());\n },\n }),\n LanguageDescription.of({\n name: 'JSON',\n alias: ['json5'],\n extensions: ['json', 'map'],\n load() {\n return import('@codemirror/lang-json').then(m => m.json());\n },\n }),\n LanguageDescription.of({\n name: 'JSX',\n extensions: ['jsx'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ jsx: true }));\n },\n }),\n LanguageDescription.of({\n name: 'Markdown',\n extensions: ['md', 'markdown', 'mkd'],\n load() {\n return import('@codemirror/lang-markdown').then(m => m.markdown());\n },\n }),\n LanguageDescription.of({\n name: 'TSX',\n extensions: ['tsx'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ jsx: true, typescript: true }));\n },\n }),\n LanguageDescription.of({\n name: 'TypeScript',\n alias: ['ts'],\n extensions: ['ts', 'mts', 'cts'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ typescript: true }));\n },\n }),\n LanguageDescription.of({\n name: 'Shell',\n alias: ['bash', 'sh', 'zsh'],\n extensions: ['sh', 'ksh', 'bash'],\n filename: /^PKGBUILD$/,\n load() {\n return import('@codemirror/legacy-modes/mode/shell').then(m => legacy(m.shell));\n },\n }),\n];\n","import { foldGutter } from '@codemirror/language';\nimport type { Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\n\nconst foldTheme = EditorView.theme({\n '.cm-foldGutter .cm-gutterElement': {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0 4px',\n },\n '.cm-fold-marker': {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '12px',\n height: '12px',\n boxSizing: 'border-box',\n border: '1px solid var(--border)',\n borderRadius: '2px',\n color: 'var(--muted-foreground)',\n fontSize: 'var(--text-caption)',\n lineHeight: '1',\n cursor: 'pointer',\n userSelect: 'none',\n },\n '.cm-fold-marker:hover': {\n background: 'var(--fill-hover)',\n color: 'var(--foreground)',\n },\n '.cm-foldPlaceholder': {\n background: 'var(--fill-hover)',\n border: '1px solid var(--border)',\n color: 'var(--muted-foreground)',\n borderRadius: '2px',\n padding: '0 4px',\n margin: '0 2px',\n },\n});\n\n/** Fold gutter with a square −/+ toggle next to each foldable line, styled with design tokens. */\nexport const codeFoldGutter: Extension = [\n foldGutter({\n markerDOM: open => {\n const marker = document.createElement('span');\n marker.className = 'cm-fold-marker';\n marker.dataset.state = open ? 'open' : 'closed';\n marker.title = open ? 'Fold' : 'Unfold';\n marker.textContent = open ? '−' : '+';\n return marker;\n },\n }),\n foldTheme,\n];\n","import type { JsonSchema, JsonSchemaProperty } from '@/lib/json-schema';\n\n/**\n * Represents a variable completion option derived from a schema\n */\nexport interface VariableCompletion {\n /** The dot-notation path (e.g., \"user.name\") */\n path: string;\n /** Display label for the autocomplete */\n label: string;\n /** Description from the schema, if available */\n description?: string;\n /** The type of the property */\n type?: string;\n}\n\n/**\n * Flattens a JSON Schema into a list of variable completions for autocomplete.\n * Recursively extracts property paths using dot-notation.\n *\n * @param schema - The JSON Schema to flatten\n * @param maxDepth - Maximum recursion depth (default: 5)\n * @returns Array of variable completions\n *\n * @example\n * ```ts\n * const schema = {\n * type: 'object',\n * properties: {\n * user: {\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * email: { type: 'string' }\n * }\n * }\n * }\n * };\n *\n * flattenSchemaToVariables(schema);\n * // Returns:\n * // [\n * // { path: 'user', label: 'user', type: 'object' },\n * // { path: 'user.name', label: 'user.name', type: 'string' },\n * // { path: 'user.email', label: 'user.email', type: 'string' }\n * // ]\n * ```\n */\nexport function flattenSchemaToVariables(schema: JsonSchema | undefined, maxDepth = 5): VariableCompletion[] {\n if (!schema?.properties) {\n return [];\n }\n\n const results: VariableCompletion[] = [];\n\n function processProperty(property: JsonSchemaProperty, path: string, depth: number): void {\n if (depth > maxDepth) {\n return;\n }\n\n const type = Array.isArray(property.type) ? property.type.join(' | ') : property.type;\n\n results.push({\n path,\n label: path,\n description: property.description ?? property.title,\n type,\n });\n\n // Recurse into nested object properties\n if (property.properties) {\n for (const [key, nestedProperty] of Object.entries(property.properties)) {\n processProperty(nestedProperty, `${path}.${key}`, depth + 1);\n }\n }\n\n // Handle array items if they have properties (array of objects)\n if (property.items?.properties) {\n // Add a placeholder for array item access (e.g., items[0].name)\n for (const [key, itemProperty] of Object.entries(property.items.properties)) {\n processProperty(itemProperty, `${path}[].${key}`, depth + 1);\n }\n }\n }\n\n for (const [key, property] of Object.entries(schema.properties)) {\n processProperty(property, key, 1);\n }\n\n return results;\n}\n","import { autocompletion } from '@codemirror/autocomplete';\nimport type { Completion, CompletionContext, CompletionResult } from '@codemirror/autocomplete';\nimport type { Extension } from '@codemirror/state';\nimport { flattenSchemaToVariables } from './schema-to-variables';\nimport type { VariableCompletion } from './schema-to-variables';\nimport type { JsonSchema } from '@/lib/json-schema';\n\n/**\n * Creates a CodeMirror autocomplete extension for {{variable}} placeholders.\n * Triggers when the user types `{{` and shows suggestions derived from the schema.\n *\n * @param schema - JSON Schema to derive variable suggestions from\n * @returns CodeMirror Extension that provides variable autocomplete\n *\n * @example\n * ```tsx\n * const schema = {\n * type: 'object',\n * properties: {\n * user: { type: 'object', properties: { name: { type: 'string' } } }\n * }\n * };\n *\n * <CodeMirror extensions={[createVariableAutocomplete(schema)]} />\n * // Typing \"{{\" will show: user, user.name\n * ```\n */\nexport function createVariableAutocomplete(schema: JsonSchema | undefined): Extension {\n const variables = flattenSchemaToVariables(schema);\n\n return autocompletion({\n override: [createVariableCompletionSource(variables)],\n defaultKeymap: true,\n closeOnBlur: true,\n icons: false,\n });\n}\n\n/**\n * Creates a completion source function for CodeMirror's autocompletion.\n */\nexport function createVariableCompletionSource(\n variables: VariableCompletion[],\n): (context: CompletionContext) => CompletionResult | null {\n return (context: CompletionContext): CompletionResult | null => {\n // Look for {{ pattern before cursor\n const beforeCursor = context.state.sliceDoc(Math.max(0, context.pos - 50), context.pos);\n const match = beforeCursor.match(/\\{\\{([a-zA-Z0-9_.\\[\\]]*)?$/);\n\n if (!match) {\n return null;\n }\n\n // The text after {{ that we're matching against\n const prefix = match[1] ?? '';\n const startPos = context.pos - prefix.length;\n\n // Filter variables based on what the user has typed\n const filteredVariables = prefix\n ? variables.filter(v => v.path.toLowerCase().startsWith(prefix.toLowerCase()))\n : variables;\n\n if (filteredVariables.length === 0) {\n return null;\n }\n\n const completions: Completion[] = filteredVariables.map(variable => ({\n label: variable.path,\n displayLabel: variable.path,\n detail: variable.type,\n info: variable.description,\n apply: (view, completion, from, to) => {\n // Inside an existing placeholder, replace the rest of the identifier and reuse its closing }}\n const rest = view.state.sliceDoc(to);\n const identifierEnd = to + (rest.match(/^[a-zA-Z0-9_.\\[\\]]*/)?.[0].length ?? 0);\n const hasClosingBraces = view.state.sliceDoc(identifierEnd, identifierEnd + 2) === '}}';\n const end = hasClosingBraces ? identifierEnd : to;\n\n const insertText = hasClosingBraces ? completion.label : `${completion.label}}}`;\n\n view.dispatch({\n changes: { from, to: end, insert: insertText },\n selection: { anchor: from + insertText.length },\n });\n },\n }));\n\n return {\n from: startPos,\n options: completions,\n validFor: /^[a-zA-Z0-9_.\\[\\]]*$/,\n };\n };\n}\n","import type { DecorationSet, EditorView, ViewUpdate } from '@codemirror/view';\nimport { Decoration, MatchDecorator, ViewPlugin } from '@codemirror/view';\n\n/**\n * Regex pattern to match variable placeholders like {{variableName}} or {{user.name}}\n * Matches: {{ followed by a valid identifier path (with optional dot notation), then }}\n */\nexport const VARIABLE_PATTERN = /\\{\\{([a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*)\\}\\}/g;\n\nconst variableDecoration = Decoration.mark({\n class: 'cm-variable-highlight',\n});\n\nconst variableMatcher = new MatchDecorator({\n regexp: VARIABLE_PATTERN,\n decoration: () => variableDecoration,\n});\n\nconst variableHighlightPlugin = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = variableMatcher.createDeco(view);\n }\n\n update(update: ViewUpdate) {\n this.decorations = variableMatcher.updateDeco(update, this.decorations);\n }\n },\n {\n decorations: v => v.decorations,\n },\n);\n\n/**\n * CodeMirror extension that highlights {{variableName}} patterns\n * with orange color and semibold weight\n */\nexport const variableHighlight = variableHighlightPlugin;\n","import { jsonLanguage } from '@codemirror/lang-json';\nimport { markdown, markdownLanguage } from '@codemirror/lang-markdown';\nimport { syntaxHighlighting } from '@codemirror/language';\nimport { EditorState, Prec } from '@codemirror/state';\nimport type { Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport CodeMirror from '@uiw/react-codemirror';\nimport type { ReactCodeMirrorRef } from '@uiw/react-codemirror';\nimport { cva } from 'class-variance-authority';\nimport type { VariantProps } from 'class-variance-authority';\nimport { Braces } from 'lucide-react';\nimport { forwardRef, useMemo } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { codeLanguages } from './code-languages';\nimport { codeFoldGutter } from './fold-gutter-extension';\nimport { syntaxHighlighter } from './highlight';\nimport { createVariableAutocomplete } from './variable-autocomplete-extension';\nimport { variableHighlight } from './variable-highlight-extension';\nimport { Button } from '@/ds/components/Button';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { useFieldControlAria } from '@/ds/components/Field/field-control-aria';\nimport { fieldErrorRimWithin, inputSurfaceAndFocusWithinStyle } from '@/ds/primitives/form-element';\nimport { formatJSON } from '@/lib/formatting';\nimport type { JsonSchema } from '@/lib/json-schema';\nimport { toast } from '@/lib/toast';\nimport { cn } from '@/lib/utils';\n\nexport type CodeEditorLanguage = 'json' | 'markdown';\ntype CodeEditorFont = 'body' | 'mono';\n\n/**\n * The single CodeMirror theme for every editor. Chrome and syntax colors come\n * from CSS variables that flip under `.dark`, and syntax roles use the same\n * `syntaxHighlighter` as the read-only `<Code>` viewer, so editors and viewers\n * look identical in both modes.\n */\nfunction buildCodemirrorTheme(font: CodeEditorFont): Extension {\n const editorTheme = EditorView.theme({\n '&': {\n backgroundColor: 'transparent',\n color: 'var(--foreground)',\n fontSize: 'var(--text-body-sm)',\n },\n '&.cm-editor .cm-scroller': {\n fontFamily: `var(--font-${font})`,\n },\n '.cm-gutters': {\n backgroundColor: 'transparent',\n color: 'var(--placeholder)',\n borderRight: 'none',\n },\n '.cm-content': {\n color: 'var(--foreground)',\n caretColor: 'var(--foreground)',\n },\n '.cm-activeLine': {\n backgroundColor: 'transparent',\n },\n '.cm-lineNumbers .cm-gutterElement': {\n color: 'var(--placeholder)',\n },\n '.cm-activeLineGutter': {\n backgroundColor: 'transparent',\n color: 'var(--muted-foreground)',\n },\n '.cm-cursor, .cm-dropCursor': {\n borderLeftColor: 'var(--foreground)',\n },\n '&.cm-focused .cm-selectionBackground, & .cm-line::selection, & .cm-selectionLayer .cm-selectionBackground, .cm-content ::selection':\n {\n background: 'var(--info-edge) !important',\n },\n '.cm-tooltip-autocomplete': {\n backgroundColor: 'var(--background)',\n border: '1px solid var(--border)',\n borderRadius: '6px',\n boxShadow: 'var(--elevation-overlay)',\n },\n '.cm-tooltip-autocomplete > ul': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-completionLabel': {\n color: 'var(--foreground)',\n },\n '.cm-completionDetail': {\n color: 'var(--muted-foreground)',\n fontSize: 'var(--text-caption)',\n marginLeft: 'auto',\n paddingLeft: '12px',\n },\n '.cm-completionInfo': {\n backgroundColor: 'var(--background)',\n border: '1px solid var(--border)',\n color: 'var(--muted-foreground)',\n padding: '8px 12px',\n },\n '.cm-completionIcon': {\n display: 'none',\n },\n 'ul.cm-completionList li[aria-selected]': {\n backgroundColor: 'var(--fill-hover)',\n color: 'var(--foreground)',\n },\n '.cm-line .cm-variable-highlight': {\n color: 'var(--warning-foreground) !important',\n fontWeight: '500',\n },\n });\n\n return [editorTheme, syntaxHighlighting(syntaxHighlighter)];\n}\n\n// eslint-disable-next-line react-refresh/only-export-components -- shared hook intentionally co-located with the editor it themes\nexport const useCodemirrorTheme = (font: CodeEditorFont = 'mono'): Extension => {\n return useMemo(() => buildCodemirrorTheme(font), [font]);\n};\n\nconst codeEditorVariants = cva(\n cn(\n 'relative overflow-hidden font-mono outline-hidden focus-within:outline-hidden focus:outline-hidden',\n 'transition-colors duration-normal ease-out-custom',\n ),\n {\n variants: {\n variant: {\n default: cn(inputSurfaceAndFocusWithinStyle, 'rounded-md p-1', fieldErrorRimWithin),\n embedded: 'rounded-none border-none bg-transparent p-0',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nconst editorFocusAttributes = Prec.highest(\n EditorView.editorAttributes.of({\n style: 'outline: none',\n }),\n);\n\nconst editorFocusTheme = Prec.highest(\n EditorView.theme({\n '&': {\n outline: 'none',\n },\n '&.cm-focused': {\n outline: 'none',\n },\n '.cm-scroller': {\n outline: 'none',\n },\n '.cm-content': {\n outline: 'none',\n },\n '.cm-content:focus': {\n outline: 'none',\n },\n }),\n);\n\nconst editorFocusExtensions: Extension[] = [editorFocusAttributes, editorFocusTheme];\n\ntype CodeEditorContentAttributes = {\n 'aria-label': string;\n id?: string;\n 'aria-labelledby'?: string;\n 'aria-describedby'?: string;\n 'aria-invalid'?: string;\n};\n\nexport type CodeEditorProps = {\n /** Prose editors can opt into the body face; code stays monospace by default. */\n font?: CodeEditorFont;\n data?: Record<string, unknown> | Array<Record<string, unknown>>;\n value?: string;\n onChange?: (value: string) => void;\n showCopyButton?: boolean;\n /** Offers a button that rewrites the JSON with Prettier. Needs `onChange`; ignored for markdown or read-only editors. */\n showFormatButton?: boolean;\n className?: string;\n highlightVariables?: boolean;\n language?: CodeEditorLanguage;\n placeholder?: string;\n /** JSON Schema to enable variable autocomplete for {{variable}} placeholders (markdown only) */\n schema?: JsonSchema;\n autoFocus?: boolean;\n /** Show line numbers in the gutter (default: true) */\n lineNumbers?: boolean;\n /** Wrap long lines within the editor viewport (default: true) */\n lineWrapping?: boolean;\n /** When false, makes the editor read-only */\n editable?: boolean;\n /** Extra CodeMirror extensions, added after the built-in ones. Memoize them to avoid reconfiguring on every render. */\n extensions?: Extension[];\n} & VariantProps<typeof codeEditorVariants> &\n Omit<HTMLAttributes<HTMLDivElement>, 'onChange'>;\n\nexport const CodeEditor = forwardRef<ReactCodeMirrorRef, CodeEditorProps>(\n (\n {\n data,\n value,\n onChange,\n showCopyButton = true,\n showFormatButton = false,\n className,\n language = 'json',\n font = 'mono',\n highlightVariables = false,\n placeholder,\n schema,\n autoFocus,\n lineNumbers = true,\n lineWrapping = true,\n editable,\n extensions: extraExtensions,\n variant,\n id,\n 'aria-label': ariaLabelProp,\n 'aria-labelledby': ariaLabelledByProp,\n 'aria-describedby': ariaDescribedByProp,\n 'aria-invalid': ariaInvalidProp,\n ...props\n },\n ref,\n ) => {\n const fieldAria = useFieldControlAria({ 'aria-label': ariaLabelProp });\n const ariaLabel = ariaLabelProp ?? 'Code editor';\n const controlId = id ?? fieldAria.id;\n const ariaLabelledBy = ariaLabelledByProp ?? fieldAria['aria-labelledby'];\n const ariaDescribedBy = ariaDescribedByProp ?? fieldAria['aria-describedby'];\n const ariaInvalid = ariaInvalidProp ?? fieldAria['aria-invalid'];\n const theme = useCodemirrorTheme(font);\n const formattedCode = data ? JSON.stringify(data, null, 2) : (value ?? '');\n const canFormat = showFormatButton && language === 'json' && editable !== false && Boolean(onChange);\n\n const handleFormat = async () => {\n try {\n onChange?.((await formatJSON(formattedCode)).trimEnd());\n } catch {\n toast.error('Can’t format: the JSON is invalid');\n }\n };\n\n const extensions = useMemo(() => {\n const contentAttributes: CodeEditorContentAttributes = { 'aria-label': ariaLabel };\n if (controlId) contentAttributes.id = controlId;\n if (ariaLabelledBy) contentAttributes['aria-labelledby'] = ariaLabelledBy;\n if (ariaDescribedBy) contentAttributes['aria-describedby'] = ariaDescribedBy;\n if (ariaInvalid !== undefined) contentAttributes['aria-invalid'] = String(ariaInvalid);\n\n const exts: Extension[] = [\n ...editorFocusExtensions,\n EditorView.contentAttributes.of(contentAttributes),\n codeFoldGutter,\n ];\n\n if (lineWrapping) {\n exts.push(EditorView.lineWrapping);\n }\n\n if (language === 'json') {\n exts.push(jsonLanguage);\n } else if (language === 'markdown') {\n exts.push(markdown({ base: markdownLanguage, codeLanguages }));\n }\n\n if (highlightVariables && language === 'markdown') {\n exts.push(variableHighlight);\n }\n\n if (schema && language === 'markdown') {\n exts.push(createVariableAutocomplete(schema));\n }\n\n if (editable === false) {\n exts.push(EditorState.readOnly.of(true));\n }\n\n if (extraExtensions) {\n exts.push(...extraExtensions);\n }\n\n return exts;\n }, [\n extraExtensions,\n language,\n highlightVariables,\n schema,\n editable,\n lineWrapping,\n controlId,\n ariaLabel,\n ariaLabelledBy,\n ariaDescribedBy,\n ariaInvalid,\n ]);\n\n return (\n <div className={cn(codeEditorVariants({ variant }), className)} {...props}>\n {(showCopyButton || canFormat) && (\n <div className=\"absolute top-2 right-2 z-20 flex gap-1\">\n {canFormat && (\n <Button\n type=\"button\"\n size=\"icon-sm\"\n tooltip=\"Format JSON\"\n aria-label=\"Format JSON\"\n onClick={handleFormat}\n >\n <Braces />\n </Button>\n )}\n {showCopyButton && <CopyButton content={formattedCode} />}\n </div>\n )}\n <CodeMirror\n ref={ref}\n value={formattedCode}\n theme={theme}\n extensions={extensions}\n onChange={onChange}\n editable={editable}\n aria-label={ariaLabel}\n placeholder={placeholder}\n height=\"100%\"\n style={{ height: '100%' }}\n autoFocus={autoFocus}\n basicSetup={{ lineNumbers, foldGutter: false }}\n />\n </div>\n );\n },\n);\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  require('./Composer.css');const require_utils = require("./utils-uDc1ofX1.cjs");
2
- const require_scroll_area = require("./scroll-area-CpCAy8S0.cjs");
2
+ const require_scroll_area = require("./scroll-area-BP4gPZ4G.cjs");
3
3
  const require_primitives_password_manager_autofill = require("./primitives/password-manager-autofill.cjs.js");
4
4
  const require_keyboard_use_keydown = require("./keyboard/use-keydown.cjs.js");
5
5
  let react = require("react");
@@ -438,4 +438,4 @@ Object.defineProperty(exports, "useComposerCommands", {
438
438
  }
439
439
  });
440
440
 
441
- //# sourceMappingURL=Composer-CFkNhdTm.cjs.map
441
+ //# sourceMappingURL=Composer-BcueJvdX.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Composer-CFkNhdTm.cjs","names":["useState","forwardRef","cn","ScrollArea","textFieldAutofillProps","forwardRef","Collapsible","cn","useRef","Collapsible","ArrowLeft","ScrollArea","ScrollAreaViewport","cn","Check","useId","useState"],"sources":["../src/ds/components/Composer/use-composer-pointer.ts","../src/ds/components/Composer/composer.tsx","../src/ds/components/Composer/composer-header.tsx","../src/ds/components/Composer/commands/composer-suggestions.tsx","../src/ds/components/Composer/commands/command-matches.ts","../src/ds/components/Composer/commands/use-composer-commands.ts"],"sourcesContent":["import { useState } from 'react';\nimport type { PointerEvent } from 'react';\n\nexport function useComposerPointer(enabled: boolean) {\n const [pointer, setPointer] = useState<{ x: number; y: number; angle: number }>();\n\n function trackPointer(event: PointerEvent<HTMLDivElement>) {\n if (!enabled || event.defaultPrevented) return;\n\n const bounds = event.currentTarget.getBoundingClientRect();\n const x = event.clientX - bounds.left;\n const y = event.clientY - bounds.top;\n const radians = Math.atan2(y - bounds.height / 2, x - bounds.width / 2);\n // conic-gradient starts at 12 o'clock, atan2 at 3 o'clock\n setPointer({ x, y, angle: (radians * 180) / Math.PI + 90 });\n }\n\n return {\n trackPointer,\n pointerStyle: {\n '--composer-spotlight-x': pointer && `${pointer.x}px`,\n '--composer-spotlight-y': pointer && `${pointer.y}px`,\n '--composer-ring-angle': pointer && `${pointer.angle}deg`,\n },\n };\n}\n","import type { ComponentPropsWithoutRef } from 'react';\nimport { forwardRef } from 'react';\n\nimport { ScrollArea } from '../ScrollArea';\nimport { useComposerPointer } from './use-composer-pointer';\nimport { textFieldAutofillProps } from '@/ds/primitives/password-manager-autofill';\nimport { cn } from '@/lib/utils';\n\nimport './composer.css';\nimport './composer-ring.css';\nimport './composer-sending.css';\n\nexport type ComposerProps = ComponentPropsWithoutRef<'form'>;\n\nexport interface ComposerInputProps extends ComponentPropsWithoutRef<'textarea'> {\n variant?: 'inline' | 'textarea';\n maxHeight?: string;\n}\n\nexport const Composer = forwardRef<HTMLFormElement, ComposerProps>(({ children, ...props }, ref) => (\n <form ref={ref} data-slot=\"composer\" {...props}>\n {children}\n </form>\n));\nComposer.displayName = 'Composer';\n\nexport interface ComposerBoxProps extends ComponentPropsWithoutRef<'div'> {\n sendingPulseKey?: number;\n}\n\nexport const ComposerBox = forwardRef<HTMLDivElement, ComposerBoxProps>(\n ({ children, className, sendingPulseKey = 0, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"composer-box\"\n className={cn(\n // The suggestions list and the input scroll flush with the top corners, so their scrollbars\n // take the inset for this radius.\n 'composer-box @container relative mx-auto mt-auto w-full max-w-3xl overflow-hidden rounded-[22px] border border-border transition-colors duration-normal scrollbar-inset-[22px] focus-within:border-border-strong',\n className,\n )}\n {...props}\n >\n <ComposerSendingPulse pulseKey={sendingPulseKey} />\n <div className=\"relative z-10\">{children}</div>\n </div>\n ),\n);\nComposerBox.displayName = 'ComposerBox';\n\nexport type ComposerTone = 'default' | 'green' | 'purple' | 'orange';\n\nexport interface ComposerRingProps extends ComponentPropsWithoutRef<'div'> {\n busy?: boolean;\n tone?: ComposerTone;\n}\n\nexport const ComposerRing = ({\n busy = false,\n tone = 'green',\n className,\n style,\n onPointerEnter,\n onPointerMove,\n ...props\n}: ComposerRingProps) => {\n const { trackPointer, pointerStyle } = useComposerPointer(!busy);\n\n return (\n <div\n data-slot=\"composer-ring\"\n data-composer-tone={tone}\n data-busy={busy ? 'true' : 'false'}\n className={cn('composer-ring relative mx-auto w-full max-w-3xl rounded-[23px] p-px', className)}\n style={{ ...pointerStyle, ...style }}\n onPointerEnter={event => {\n onPointerEnter?.(event);\n trackPointer(event);\n }}\n onPointerMove={event => {\n onPointerMove?.(event);\n trackPointer(event);\n }}\n {...props}\n />\n );\n};\nComposerRing.displayName = 'ComposerRing';\n\nexport const ComposerAttachments = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n role=\"region\"\n data-slot=\"composer-attachments\"\n className={cn('mx-auto w-full max-w-3xl pb-2', className)}\n {...props}\n />\n ),\n);\nComposerAttachments.displayName = 'ComposerAttachments';\n\nexport const ComposerInput = forwardRef<HTMLTextAreaElement, ComposerInputProps>(\n ({ className, variant = 'inline', maxHeight, autoComplete, ...props }, ref) => (\n <ScrollArea maxHeight={maxHeight ?? (variant === 'textarea' ? '16rem' : '13rem')}>\n <textarea\n ref={ref}\n data-slot=\"composer-input\"\n className={cn(\n 'field-sizing-content w-full resize-none overflow-hidden bg-transparent px-3 pt-2.5 pb-2 text-body text-muted-foreground outline-hidden placeholder:text-placeholder focus:outline-hidden disabled:cursor-not-allowed disabled:opacity-50',\n variant === 'textarea' ? 'min-h-28' : 'min-h-10',\n className,\n )}\n {...props}\n {...textFieldAutofillProps(autoComplete)}\n />\n </ScrollArea>\n ),\n);\nComposerInput.displayName = 'ComposerInput';\n\nexport const ComposerActions = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n role=\"region\"\n data-slot=\"composer-actions\"\n className={cn('flex w-full flex-wrap items-end justify-between gap-2 px-3 pb-3', className)}\n {...props}\n />\n ),\n);\nComposerActions.displayName = 'ComposerActions';\n\nconst ComposerGradientColumn = ({ className }: { className?: string }) => (\n <div className={cn('flex size-full flex-col -space-y-3', className)}>\n <div className=\"w-full flex-1 bg-brand-green blur-xl\" />\n <div className=\"w-full flex-1 bg-product-observability blur-xl\" />\n <div className=\"w-full flex-1 bg-brand-green blur-xl\" />\n <div className=\"w-full flex-1 bg-product-observability blur-xl\" />\n </div>\n);\n\nconst ComposerSendingPulse = ({ pulseKey }: { pulseKey: number }) => {\n if (pulseKey === 0) return null;\n\n return (\n <div\n key={pulseKey}\n aria-hidden=\"true\"\n data-slot=\"composer-sending-pulse\"\n className=\"composer-sending pointer-events-none absolute top-0 left-[-10%] z-0 flex h-10 w-[120%] transform-gpu\"\n >\n <ComposerGradientColumn />\n <ComposerGradientColumn className=\"-translate-y-2\" />\n <ComposerGradientColumn />\n </div>\n );\n};\n\nexport interface ComposerToneLabelProps extends ComponentPropsWithoutRef<'span'> {\n tone: ComposerTone;\n}\n\nexport function ComposerToneLabel({ tone, className, ...props }: ComposerToneLabelProps) {\n return <span data-composer-tone={tone} className={cn('composer-tone-label', className)} {...props} />;\n}\n","import { Collapsible } from '@base-ui/react/collapsible';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { forwardRef } from 'react';\n\nimport { cn } from '@/lib/utils';\n\nimport './composer-header.css';\n\nexport interface ComposerHeaderProps extends ComponentPropsWithoutRef<'div'> {\n /** Animate visibility while retaining content through the closing transition. */\n open?: boolean;\n}\n\n/** Optional context above ComposerRing or ComposerBox. Empty rendered content occupies no space. */\nexport const ComposerHeader = forwardRef<HTMLDivElement, ComposerHeaderProps>(\n ({ className, children, open = true, ...props }, ref) => (\n <Collapsible.Root\n ref={ref}\n open={open}\n data-slot=\"composer-header\"\n className={cn('composer-header relative isolate mx-auto w-full max-w-3xl', className)}\n {...props}\n >\n <Collapsible.Panel className=\"composer-header-panel\">\n <div\n data-slot=\"composer-header-surface\"\n className=\"flex flex-col gap-3 overflow-hidden rounded-t-[23px] border border-b-0 border-surface-rim bg-card px-3 pt-3 pb-8 text-body-sm text-muted-foreground empty:hidden\"\n >\n {children}\n </div>\n </Collapsible.Panel>\n </Collapsible.Root>\n ),\n);\nComposerHeader.displayName = 'ComposerHeader';\n\nexport interface ComposerHeaderRowProps extends ComponentPropsWithoutRef<'div'> {\n tone?: 'default' | 'destructive' | 'success';\n}\n\nexport const ComposerHeaderRow = forwardRef<HTMLDivElement, ComposerHeaderRowProps>(\n ({ className, tone = 'default', ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"composer-header-row\"\n className={cn(\n 'flex min-w-0 flex-wrap items-center gap-2 [&>svg]:size-icon-sm [&>svg]:shrink-0',\n tone === 'destructive' && 'text-destructive-foreground',\n tone === 'success' && 'text-success-indicator',\n className,\n )}\n {...props}\n />\n ),\n);\nComposerHeaderRow.displayName = 'ComposerHeaderRow';\n\nexport type ComposerHeaderContentProps = ComponentPropsWithoutRef<'div'>;\n\nexport const ComposerHeaderContent = forwardRef<HTMLDivElement, ComposerHeaderContentProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"composer-header-content\"\n className={cn('min-w-0 flex-1 wrap-anywhere', className)}\n {...props}\n />\n ),\n);\nComposerHeaderContent.displayName = 'ComposerHeaderContent';\n\nexport type ComposerHeaderActionsProps = ComponentPropsWithoutRef<'div'>;\n\nexport const ComposerHeaderActions = forwardRef<HTMLDivElement, ComposerHeaderActionsProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"composer-header-actions\"\n className={cn('ml-auto flex max-w-full shrink-0 flex-wrap items-center gap-2', className)}\n {...props}\n />\n ),\n);\nComposerHeaderActions.displayName = 'ComposerHeaderActions';\n","import { Collapsible } from '@base-ui/react/collapsible';\nimport { ArrowLeft, Check } from 'lucide-react';\nimport { useEffect, useRef } from 'react';\nimport { ScrollArea, ScrollAreaViewport } from '../../ScrollArea';\nimport { cn } from '@/lib/utils';\n\nexport interface ComposerSuggestionItem {\n id: string;\n label: string;\n description?: string;\n active?: boolean;\n}\n\nexport interface ComposerSuggestionsProps {\n id: string;\n items: readonly ComposerSuggestionItem[];\n activeIndex: number;\n contextLabel?: string;\n onBack?: () => void;\n onSelect: (index: number) => void;\n}\n\nexport function ComposerSuggestions({\n id,\n items,\n activeIndex,\n contextLabel,\n onBack,\n onSelect,\n}: ComposerSuggestionsProps) {\n const activeOption = useRef<HTMLButtonElement>(null);\n const activeItemId = items[activeIndex]?.id;\n const label = contextLabel ? `${contextLabel} options` : 'Slash commands';\n\n useEffect(() => {\n activeOption.current?.scrollIntoView({ block: 'nearest' });\n }, [activeItemId]);\n\n return (\n <Collapsible.Root open={items.length > 0}>\n <Collapsible.Panel className=\"h-[var(--collapsible-panel-height)] overflow-hidden transition-[height] duration-normal ease-out-custom data-[ending-style]:h-0 data-[starting-style]:h-0 motion-reduce:transition-none\">\n <div className=\"border-b border-border\" role=\"region\" aria-label={label}>\n {contextLabel && onBack && (\n <div className=\"border-b border-border px-1.5 py-1\">\n <button\n type=\"button\"\n className=\"flex items-center gap-1.5 rounded-xl px-2 py-1.5 text-caption text-muted-foreground transition-colors duration-normal ease-out-custom hover:bg-fill-subtle hover:text-foreground motion-reduce:transition-none\"\n aria-label=\"Back to slash commands\"\n onMouseDown={event => event.preventDefault()}\n onClick={onBack}\n >\n <ArrowLeft size={14} aria-hidden />\n <span>{contextLabel}</span>\n </button>\n </div>\n )}\n <ScrollArea maxHeight=\"min(22rem, 50dvh)\">\n <ScrollAreaViewport className=\"overscroll-y-contain\">\n <div id={id} role=\"listbox\" aria-label={label} className=\"flex flex-col gap-px p-1.5\">\n {items.map((item, index) => (\n <button\n ref={index === activeIndex ? activeOption : undefined}\n id={item.id}\n key={item.id}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={index === activeIndex}\n aria-current={item.active ? 'true' : undefined}\n className={cn(\n 'flex w-full cursor-pointer items-center justify-between gap-4 rounded-2xl px-2 py-1.5 text-left text-caption transition-colors duration-normal ease-out-custom motion-reduce:transition-none',\n index === activeIndex\n ? 'bg-fill-subtle text-foreground'\n : 'text-muted-foreground hover:bg-fill-subtle hover:text-foreground',\n )}\n onMouseDown={event => event.preventDefault()}\n onClick={() => onSelect(index)}\n >\n <span className=\"max-w-[60%] min-w-0 shrink-0 truncate\" title={item.label}>\n {item.label}\n </span>\n {(item.description || item.active) && (\n <span className=\"flex min-w-0 items-center gap-1.5 text-right\">\n {item.description && (\n <span className=\"truncate\" title={item.description}>\n {item.description}\n </span>\n )}\n {item.active && (\n <span className=\"flex shrink-0 items-center gap-1\">\n <Check size={13} aria-hidden />\n Current\n </span>\n )}\n </span>\n )}\n </button>\n ))}\n </div>\n </ScrollAreaViewport>\n </ScrollArea>\n </div>\n </Collapsible.Panel>\n </Collapsible.Root>\n );\n}\n","export interface ComposerCommandOption {\n value: string;\n label: string;\n description?: string;\n active?: boolean;\n}\n\nexport interface ComposerCommand {\n name: string;\n description: string;\n options?: readonly ComposerCommandOption[];\n}\n\nexport function matchCommands<T extends Pick<ComposerCommand, 'name'>>(commands: readonly T[], draft: string): T[] {\n if (!draft.startsWith('/')) return [];\n const query = draft.slice(1).toLowerCase();\n if (/\\s/.test(query)) return [];\n return commands.filter(command => command.name.toLowerCase().startsWith(query));\n}\n\nexport function matchCommandOptions<T extends ComposerCommand>(commands: readonly T[], draft: string) {\n if (!draft.startsWith('/')) return undefined;\n const firstWhitespace = draft.search(/\\s/);\n if (firstWhitespace === -1) return undefined;\n const command = commands.find(candidate => candidate.name === draft.slice(1, firstWhitespace));\n if (!command?.options) return undefined;\n const query = draft.slice(firstWhitespace).trim().toLowerCase();\n if (/\\s/.test(query)) return undefined;\n const options = command.options.filter(option => option.value.toLowerCase().startsWith(query));\n return options.length > 0 ? { command, options } : undefined;\n}\n","import type { ChangeEvent, ComponentPropsWithoutRef, RefObject } from 'react';\nimport { useId, useState } from 'react';\nimport type { ComposerCommand, ComposerCommandOption } from './command-matches';\nimport { matchCommandOptions, matchCommands } from './command-matches';\nimport type { ComposerSuggestionItem, ComposerSuggestionsProps } from './composer-suggestions';\nimport { useKeydown } from '@/lib/keyboard/use-keydown';\n\nfunction createSuggestionItems(\n listId: string,\n commands: readonly ComposerCommand[],\n options?: readonly ComposerCommandOption[],\n): ComposerSuggestionItem[] {\n if (options)\n return options.map(option => ({ ...option, id: `${listId}-option-${encodeURIComponent(option.value)}` }));\n return commands.map(command => ({\n id: `${listId}-command-${encodeURIComponent(command.name)}`,\n label: `/${command.name}`,\n description: command.description,\n }));\n}\n\nexport interface UseComposerCommandsProps {\n commands: readonly ComposerCommand[];\n value: string;\n onValueChange: (value: string) => void;\n onSubmit: (value: string) => void;\n inputRef: RefObject<HTMLTextAreaElement | null>;\n enabled?: boolean;\n}\n\nexport function useComposerCommands({\n commands,\n value,\n onValueChange,\n onSubmit,\n inputRef,\n enabled = true,\n}: UseComposerCommandsProps) {\n const listId = useId();\n const [navigation, setNavigation] = useState({ value: '', index: 0 });\n const optionMatch = enabled ? matchCommandOptions(commands, value) : undefined;\n const matchingCommands = enabled && !optionMatch ? matchCommands(commands, value) : [];\n const items = createSuggestionItems(listId, matchingCommands, optionMatch?.options);\n const boundedIndex = Math.min(navigation.index, Math.max(0, items.length - 1));\n const activeIndex = navigation.value === value ? boundedIndex : 0;\n\n function updateValue(nextValue: string) {\n setNavigation({ value: nextValue, index: 0 });\n onValueChange(nextValue);\n }\n\n function returnToCommands() {\n updateValue(optionMatch ? `/${optionMatch.command.name}` : '');\n inputRef.current?.focus();\n }\n\n function selectSuggestion(index: number) {\n inputRef.current?.focus();\n if (optionMatch) {\n const option = optionMatch.options[index];\n if (option) onSubmit(`/${optionMatch.command.name} ${option.value}`);\n return;\n }\n const command = matchingCommands[index];\n if (command) updateValue(`/${command.name} `);\n }\n\n function moveSelection(direction: number) {\n setNavigation({ value, index: (activeIndex + direction + items.length) % items.length });\n }\n\n function shouldHandleCommandKey(event: KeyboardEvent) {\n const command = matchingCommands[activeIndex];\n const submitExactCommand =\n matchingCommands.length === 1 && value.toLowerCase() === `/${command?.name}` && !command?.options?.length;\n return event.key !== 'Enter' || !submitExactCommand;\n }\n\n useKeydown(\n {\n ArrowDown: () => moveSelection(1),\n ArrowUp: () => moveSelection(-1),\n Escape: returnToCommands,\n Tab: () => selectSuggestion(activeIndex),\n Enter: () => selectSuggestion(activeIndex),\n },\n {\n target: inputRef,\n enabled: items.length > 0,\n shouldHandle: shouldHandleCommandKey,\n },\n );\n\n const inputProps = {\n value,\n onChange: (event: ChangeEvent<HTMLTextAreaElement>) => updateValue(event.target.value),\n 'aria-autocomplete': 'list',\n 'aria-controls': items.length > 0 ? listId : undefined,\n 'aria-activedescendant': items[activeIndex]?.id,\n } satisfies ComponentPropsWithoutRef<'textarea'>;\n\n const suggestionsProps: ComposerSuggestionsProps = {\n id: listId,\n items,\n activeIndex,\n contextLabel: optionMatch ? `/${optionMatch.command.name}` : undefined,\n onBack: optionMatch ? returnToCommands : undefined,\n onSelect: selectSuggestion,\n };\n\n return { inputProps, suggestionsProps };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Composer-BcueJvdX.cjs","names":["useState","forwardRef","cn","ScrollArea","textFieldAutofillProps","forwardRef","Collapsible","cn","useRef","Collapsible","ArrowLeft","ScrollArea","ScrollAreaViewport","cn","Check","useId","useState"],"sources":["../src/ds/components/Composer/use-composer-pointer.ts","../src/ds/components/Composer/composer.tsx","../src/ds/components/Composer/composer-header.tsx","../src/ds/components/Composer/commands/composer-suggestions.tsx","../src/ds/components/Composer/commands/command-matches.ts","../src/ds/components/Composer/commands/use-composer-commands.ts"],"sourcesContent":["import { useState } from 'react';\nimport type { PointerEvent } from 'react';\n\nexport function useComposerPointer(enabled: boolean) {\n const [pointer, setPointer] = useState<{ x: number; y: number; angle: number }>();\n\n function trackPointer(event: PointerEvent<HTMLDivElement>) {\n if (!enabled || event.defaultPrevented) return;\n\n const bounds = event.currentTarget.getBoundingClientRect();\n const x = event.clientX - bounds.left;\n const y = event.clientY - bounds.top;\n const radians = Math.atan2(y - bounds.height / 2, x - bounds.width / 2);\n // conic-gradient starts at 12 o'clock, atan2 at 3 o'clock\n setPointer({ x, y, angle: (radians * 180) / Math.PI + 90 });\n }\n\n return {\n trackPointer,\n pointerStyle: {\n '--composer-spotlight-x': pointer && `${pointer.x}px`,\n '--composer-spotlight-y': pointer && `${pointer.y}px`,\n '--composer-ring-angle': pointer && `${pointer.angle}deg`,\n },\n };\n}\n","import type { ComponentPropsWithoutRef } from 'react';\nimport { forwardRef } from 'react';\n\nimport { ScrollArea } from '../ScrollArea';\nimport { useComposerPointer } from './use-composer-pointer';\nimport { textFieldAutofillProps } from '@/ds/primitives/password-manager-autofill';\nimport { cn } from '@/lib/utils';\n\nimport './composer.css';\nimport './composer-ring.css';\nimport './composer-sending.css';\n\nexport type ComposerProps = ComponentPropsWithoutRef<'form'>;\n\nexport interface ComposerInputProps extends ComponentPropsWithoutRef<'textarea'> {\n variant?: 'inline' | 'textarea';\n maxHeight?: string;\n}\n\nexport const Composer = forwardRef<HTMLFormElement, ComposerProps>(({ children, ...props }, ref) => (\n <form ref={ref} data-slot=\"composer\" {...props}>\n {children}\n </form>\n));\nComposer.displayName = 'Composer';\n\nexport interface ComposerBoxProps extends ComponentPropsWithoutRef<'div'> {\n sendingPulseKey?: number;\n}\n\nexport const ComposerBox = forwardRef<HTMLDivElement, ComposerBoxProps>(\n ({ children, className, sendingPulseKey = 0, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"composer-box\"\n className={cn(\n // The suggestions list and the input scroll flush with the top corners, so their scrollbars\n // take the inset for this radius.\n 'composer-box @container relative mx-auto mt-auto w-full max-w-3xl overflow-hidden rounded-[22px] border border-border transition-colors duration-normal scrollbar-inset-[22px] focus-within:border-border-strong',\n className,\n )}\n {...props}\n >\n <ComposerSendingPulse pulseKey={sendingPulseKey} />\n <div className=\"relative z-10\">{children}</div>\n </div>\n ),\n);\nComposerBox.displayName = 'ComposerBox';\n\nexport type ComposerTone = 'default' | 'green' | 'purple' | 'orange';\n\nexport interface ComposerRingProps extends ComponentPropsWithoutRef<'div'> {\n busy?: boolean;\n tone?: ComposerTone;\n}\n\nexport const ComposerRing = ({\n busy = false,\n tone = 'green',\n className,\n style,\n onPointerEnter,\n onPointerMove,\n ...props\n}: ComposerRingProps) => {\n const { trackPointer, pointerStyle } = useComposerPointer(!busy);\n\n return (\n <div\n data-slot=\"composer-ring\"\n data-composer-tone={tone}\n data-busy={busy ? 'true' : 'false'}\n className={cn('composer-ring relative mx-auto w-full max-w-3xl rounded-[23px] p-px', className)}\n style={{ ...pointerStyle, ...style }}\n onPointerEnter={event => {\n onPointerEnter?.(event);\n trackPointer(event);\n }}\n onPointerMove={event => {\n onPointerMove?.(event);\n trackPointer(event);\n }}\n {...props}\n />\n );\n};\nComposerRing.displayName = 'ComposerRing';\n\nexport const ComposerAttachments = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n role=\"region\"\n data-slot=\"composer-attachments\"\n className={cn('mx-auto w-full max-w-3xl pb-2', className)}\n {...props}\n />\n ),\n);\nComposerAttachments.displayName = 'ComposerAttachments';\n\nexport const ComposerInput = forwardRef<HTMLTextAreaElement, ComposerInputProps>(\n ({ className, variant = 'inline', maxHeight, autoComplete, ...props }, ref) => (\n <ScrollArea maxHeight={maxHeight ?? (variant === 'textarea' ? '16rem' : '13rem')}>\n <textarea\n ref={ref}\n data-slot=\"composer-input\"\n className={cn(\n 'field-sizing-content w-full resize-none overflow-hidden bg-transparent px-3 pt-2.5 pb-2 text-body text-muted-foreground outline-hidden placeholder:text-placeholder focus:outline-hidden disabled:cursor-not-allowed disabled:opacity-50',\n variant === 'textarea' ? 'min-h-28' : 'min-h-10',\n className,\n )}\n {...props}\n {...textFieldAutofillProps(autoComplete)}\n />\n </ScrollArea>\n ),\n);\nComposerInput.displayName = 'ComposerInput';\n\nexport const ComposerActions = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n role=\"region\"\n data-slot=\"composer-actions\"\n className={cn('flex w-full flex-wrap items-end justify-between gap-2 px-3 pb-3', className)}\n {...props}\n />\n ),\n);\nComposerActions.displayName = 'ComposerActions';\n\nconst ComposerGradientColumn = ({ className }: { className?: string }) => (\n <div className={cn('flex size-full flex-col -space-y-3', className)}>\n <div className=\"w-full flex-1 bg-brand-green blur-xl\" />\n <div className=\"w-full flex-1 bg-product-observability blur-xl\" />\n <div className=\"w-full flex-1 bg-brand-green blur-xl\" />\n <div className=\"w-full flex-1 bg-product-observability blur-xl\" />\n </div>\n);\n\nconst ComposerSendingPulse = ({ pulseKey }: { pulseKey: number }) => {\n if (pulseKey === 0) return null;\n\n return (\n <div\n key={pulseKey}\n aria-hidden=\"true\"\n data-slot=\"composer-sending-pulse\"\n className=\"composer-sending pointer-events-none absolute top-0 left-[-10%] z-0 flex h-10 w-[120%] transform-gpu\"\n >\n <ComposerGradientColumn />\n <ComposerGradientColumn className=\"-translate-y-2\" />\n <ComposerGradientColumn />\n </div>\n );\n};\n\nexport interface ComposerToneLabelProps extends ComponentPropsWithoutRef<'span'> {\n tone: ComposerTone;\n}\n\nexport function ComposerToneLabel({ tone, className, ...props }: ComposerToneLabelProps) {\n return <span data-composer-tone={tone} className={cn('composer-tone-label', className)} {...props} />;\n}\n","import { Collapsible } from '@base-ui/react/collapsible';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { forwardRef } from 'react';\n\nimport { cn } from '@/lib/utils';\n\nimport './composer-header.css';\n\nexport interface ComposerHeaderProps extends ComponentPropsWithoutRef<'div'> {\n /** Animate visibility while retaining content through the closing transition. */\n open?: boolean;\n}\n\n/** Optional context above ComposerRing or ComposerBox. Empty rendered content occupies no space. */\nexport const ComposerHeader = forwardRef<HTMLDivElement, ComposerHeaderProps>(\n ({ className, children, open = true, ...props }, ref) => (\n <Collapsible.Root\n ref={ref}\n open={open}\n data-slot=\"composer-header\"\n className={cn('composer-header relative isolate mx-auto w-full max-w-3xl', className)}\n {...props}\n >\n <Collapsible.Panel className=\"composer-header-panel\">\n <div\n data-slot=\"composer-header-surface\"\n className=\"flex flex-col gap-3 overflow-hidden rounded-t-[23px] border border-b-0 border-surface-rim bg-card px-3 pt-3 pb-8 text-body-sm text-muted-foreground empty:hidden\"\n >\n {children}\n </div>\n </Collapsible.Panel>\n </Collapsible.Root>\n ),\n);\nComposerHeader.displayName = 'ComposerHeader';\n\nexport interface ComposerHeaderRowProps extends ComponentPropsWithoutRef<'div'> {\n tone?: 'default' | 'destructive' | 'success';\n}\n\nexport const ComposerHeaderRow = forwardRef<HTMLDivElement, ComposerHeaderRowProps>(\n ({ className, tone = 'default', ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"composer-header-row\"\n className={cn(\n 'flex min-w-0 flex-wrap items-center gap-2 [&>svg]:size-icon-sm [&>svg]:shrink-0',\n tone === 'destructive' && 'text-destructive-foreground',\n tone === 'success' && 'text-success-indicator',\n className,\n )}\n {...props}\n />\n ),\n);\nComposerHeaderRow.displayName = 'ComposerHeaderRow';\n\nexport type ComposerHeaderContentProps = ComponentPropsWithoutRef<'div'>;\n\nexport const ComposerHeaderContent = forwardRef<HTMLDivElement, ComposerHeaderContentProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"composer-header-content\"\n className={cn('min-w-0 flex-1 wrap-anywhere', className)}\n {...props}\n />\n ),\n);\nComposerHeaderContent.displayName = 'ComposerHeaderContent';\n\nexport type ComposerHeaderActionsProps = ComponentPropsWithoutRef<'div'>;\n\nexport const ComposerHeaderActions = forwardRef<HTMLDivElement, ComposerHeaderActionsProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"composer-header-actions\"\n className={cn('ml-auto flex max-w-full shrink-0 flex-wrap items-center gap-2', className)}\n {...props}\n />\n ),\n);\nComposerHeaderActions.displayName = 'ComposerHeaderActions';\n","import { Collapsible } from '@base-ui/react/collapsible';\nimport { ArrowLeft, Check } from 'lucide-react';\nimport { useEffect, useRef } from 'react';\nimport { ScrollArea, ScrollAreaViewport } from '../../ScrollArea';\nimport { cn } from '@/lib/utils';\n\nexport interface ComposerSuggestionItem {\n id: string;\n label: string;\n description?: string;\n active?: boolean;\n}\n\nexport interface ComposerSuggestionsProps {\n id: string;\n items: readonly ComposerSuggestionItem[];\n activeIndex: number;\n contextLabel?: string;\n onBack?: () => void;\n onSelect: (index: number) => void;\n}\n\nexport function ComposerSuggestions({\n id,\n items,\n activeIndex,\n contextLabel,\n onBack,\n onSelect,\n}: ComposerSuggestionsProps) {\n const activeOption = useRef<HTMLButtonElement>(null);\n const activeItemId = items[activeIndex]?.id;\n const label = contextLabel ? `${contextLabel} options` : 'Slash commands';\n\n useEffect(() => {\n activeOption.current?.scrollIntoView({ block: 'nearest' });\n }, [activeItemId]);\n\n return (\n <Collapsible.Root open={items.length > 0}>\n <Collapsible.Panel className=\"h-[var(--collapsible-panel-height)] overflow-hidden transition-[height] duration-normal ease-out-custom data-[ending-style]:h-0 data-[starting-style]:h-0 motion-reduce:transition-none\">\n <div className=\"border-b border-border\" role=\"region\" aria-label={label}>\n {contextLabel && onBack && (\n <div className=\"border-b border-border px-1.5 py-1\">\n <button\n type=\"button\"\n className=\"flex items-center gap-1.5 rounded-xl px-2 py-1.5 text-caption text-muted-foreground transition-colors duration-normal ease-out-custom hover:bg-fill-subtle hover:text-foreground motion-reduce:transition-none\"\n aria-label=\"Back to slash commands\"\n onMouseDown={event => event.preventDefault()}\n onClick={onBack}\n >\n <ArrowLeft size={14} aria-hidden />\n <span>{contextLabel}</span>\n </button>\n </div>\n )}\n <ScrollArea maxHeight=\"min(22rem, 50dvh)\">\n <ScrollAreaViewport className=\"overscroll-y-contain\">\n <div id={id} role=\"listbox\" aria-label={label} className=\"flex flex-col gap-px p-1.5\">\n {items.map((item, index) => (\n <button\n ref={index === activeIndex ? activeOption : undefined}\n id={item.id}\n key={item.id}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={index === activeIndex}\n aria-current={item.active ? 'true' : undefined}\n className={cn(\n 'flex w-full cursor-pointer items-center justify-between gap-4 rounded-2xl px-2 py-1.5 text-left text-caption transition-colors duration-normal ease-out-custom motion-reduce:transition-none',\n index === activeIndex\n ? 'bg-fill-subtle text-foreground'\n : 'text-muted-foreground hover:bg-fill-subtle hover:text-foreground',\n )}\n onMouseDown={event => event.preventDefault()}\n onClick={() => onSelect(index)}\n >\n <span className=\"max-w-[60%] min-w-0 shrink-0 truncate\" title={item.label}>\n {item.label}\n </span>\n {(item.description || item.active) && (\n <span className=\"flex min-w-0 items-center gap-1.5 text-right\">\n {item.description && (\n <span className=\"truncate\" title={item.description}>\n {item.description}\n </span>\n )}\n {item.active && (\n <span className=\"flex shrink-0 items-center gap-1\">\n <Check size={13} aria-hidden />\n Current\n </span>\n )}\n </span>\n )}\n </button>\n ))}\n </div>\n </ScrollAreaViewport>\n </ScrollArea>\n </div>\n </Collapsible.Panel>\n </Collapsible.Root>\n );\n}\n","export interface ComposerCommandOption {\n value: string;\n label: string;\n description?: string;\n active?: boolean;\n}\n\nexport interface ComposerCommand {\n name: string;\n description: string;\n options?: readonly ComposerCommandOption[];\n}\n\nexport function matchCommands<T extends Pick<ComposerCommand, 'name'>>(commands: readonly T[], draft: string): T[] {\n if (!draft.startsWith('/')) return [];\n const query = draft.slice(1).toLowerCase();\n if (/\\s/.test(query)) return [];\n return commands.filter(command => command.name.toLowerCase().startsWith(query));\n}\n\nexport function matchCommandOptions<T extends ComposerCommand>(commands: readonly T[], draft: string) {\n if (!draft.startsWith('/')) return undefined;\n const firstWhitespace = draft.search(/\\s/);\n if (firstWhitespace === -1) return undefined;\n const command = commands.find(candidate => candidate.name === draft.slice(1, firstWhitespace));\n if (!command?.options) return undefined;\n const query = draft.slice(firstWhitespace).trim().toLowerCase();\n if (/\\s/.test(query)) return undefined;\n const options = command.options.filter(option => option.value.toLowerCase().startsWith(query));\n return options.length > 0 ? { command, options } : undefined;\n}\n","import type { ChangeEvent, ComponentPropsWithoutRef, RefObject } from 'react';\nimport { useId, useState } from 'react';\nimport type { ComposerCommand, ComposerCommandOption } from './command-matches';\nimport { matchCommandOptions, matchCommands } from './command-matches';\nimport type { ComposerSuggestionItem, ComposerSuggestionsProps } from './composer-suggestions';\nimport { useKeydown } from '@/lib/keyboard/use-keydown';\n\nfunction createSuggestionItems(\n listId: string,\n commands: readonly ComposerCommand[],\n options?: readonly ComposerCommandOption[],\n): ComposerSuggestionItem[] {\n if (options)\n return options.map(option => ({ ...option, id: `${listId}-option-${encodeURIComponent(option.value)}` }));\n return commands.map(command => ({\n id: `${listId}-command-${encodeURIComponent(command.name)}`,\n label: `/${command.name}`,\n description: command.description,\n }));\n}\n\nexport interface UseComposerCommandsProps {\n commands: readonly ComposerCommand[];\n value: string;\n onValueChange: (value: string) => void;\n onSubmit: (value: string) => void;\n inputRef: RefObject<HTMLTextAreaElement | null>;\n enabled?: boolean;\n}\n\nexport function useComposerCommands({\n commands,\n value,\n onValueChange,\n onSubmit,\n inputRef,\n enabled = true,\n}: UseComposerCommandsProps) {\n const listId = useId();\n const [navigation, setNavigation] = useState({ value: '', index: 0 });\n const optionMatch = enabled ? matchCommandOptions(commands, value) : undefined;\n const matchingCommands = enabled && !optionMatch ? matchCommands(commands, value) : [];\n const items = createSuggestionItems(listId, matchingCommands, optionMatch?.options);\n const boundedIndex = Math.min(navigation.index, Math.max(0, items.length - 1));\n const activeIndex = navigation.value === value ? boundedIndex : 0;\n\n function updateValue(nextValue: string) {\n setNavigation({ value: nextValue, index: 0 });\n onValueChange(nextValue);\n }\n\n function returnToCommands() {\n updateValue(optionMatch ? `/${optionMatch.command.name}` : '');\n inputRef.current?.focus();\n }\n\n function selectSuggestion(index: number) {\n inputRef.current?.focus();\n if (optionMatch) {\n const option = optionMatch.options[index];\n if (option) onSubmit(`/${optionMatch.command.name} ${option.value}`);\n return;\n }\n const command = matchingCommands[index];\n if (command) updateValue(`/${command.name} `);\n }\n\n function moveSelection(direction: number) {\n setNavigation({ value, index: (activeIndex + direction + items.length) % items.length });\n }\n\n function shouldHandleCommandKey(event: KeyboardEvent) {\n const command = matchingCommands[activeIndex];\n const submitExactCommand =\n matchingCommands.length === 1 && value.toLowerCase() === `/${command?.name}` && !command?.options?.length;\n return event.key !== 'Enter' || !submitExactCommand;\n }\n\n useKeydown(\n {\n ArrowDown: () => moveSelection(1),\n ArrowUp: () => moveSelection(-1),\n Escape: returnToCommands,\n Tab: () => selectSuggestion(activeIndex),\n Enter: () => selectSuggestion(activeIndex),\n },\n {\n target: inputRef,\n enabled: items.length > 0,\n shouldHandle: shouldHandleCommandKey,\n },\n );\n\n const inputProps = {\n value,\n onChange: (event: ChangeEvent<HTMLTextAreaElement>) => updateValue(event.target.value),\n 'aria-autocomplete': 'list',\n 'aria-controls': items.length > 0 ? listId : undefined,\n 'aria-activedescendant': items[activeIndex]?.id,\n } satisfies ComponentPropsWithoutRef<'textarea'>;\n\n const suggestionsProps: ComposerSuggestionsProps = {\n id: listId,\n items,\n activeIndex,\n contextLabel: optionMatch ? `/${optionMatch.command.name}` : undefined,\n onBack: optionMatch ? returnToCommands : undefined,\n onSelect: selectSuggestion,\n };\n\n return { inputProps, suggestionsProps };\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { t as cn } from "./utils-DQx8TpNT.js";
2
- import { n as ScrollAreaViewport, t as ScrollArea } from "./scroll-area-Dh9UQ7HP.js";
2
+ import { n as ScrollAreaViewport, t as ScrollArea } from "./scroll-area-C226l0v0.js";
3
3
  import { textFieldAutofillProps } from "./primitives/password-manager-autofill.es.js";
4
4
  import { useKeydown } from "./keyboard/use-keydown.es.js";
5
5
  import { forwardRef, useEffect, useId, useRef, useState } from "react";
@@ -349,4 +349,4 @@ function useComposerCommands({ commands, value, onValueChange, onSubmit, inputRe
349
349
  }
350
350
  export { ComposerHeader as a, ComposerHeaderRow as c, ComposerAttachments as d, ComposerBox as f, ComposerToneLabel as h, ComposerSuggestions as i, Composer as l, ComposerRing as m, matchCommandOptions as n, ComposerHeaderActions as o, ComposerInput as p, matchCommands as r, ComposerHeaderContent as s, useComposerCommands as t, ComposerActions as u };
351
351
 
352
- //# sourceMappingURL=Composer-CLTgWusX.js.map
352
+ //# sourceMappingURL=Composer-D1gF-0jZ.js.map