@mastra/playground-ui 65.0.0-alpha.6 → 65.0.0-alpha.7

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 (408) hide show
  1. package/components.css +49 -6
  2. package/dist/{code-DJReJPSX.cjs → code-CUOlhM4J.cjs} +9 -12
  3. package/dist/code-CUOlhM4J.cjs.map +1 -0
  4. package/dist/{code-DLuATvYu.js → code-CsHrVTpJ.js} +11 -13
  5. package/dist/code-CsHrVTpJ.js.map +1 -0
  6. package/dist/{code-block-D6A1DMv-.js → code-block-BB-5HSl3.js} +2 -2
  7. package/dist/{code-block-D6A1DMv-.js.map → code-block-BB-5HSl3.js.map} +1 -1
  8. package/dist/{code-block-C79fiykv.cjs → code-block-CAV4Flrx.cjs} +2 -2
  9. package/dist/{code-block-C79fiykv.cjs.map → code-block-CAV4Flrx.cjs.map} +1 -1
  10. package/dist/{code-editor-Bd-Cldem.cjs → code-editor-CbyCb7CW.cjs} +5 -123
  11. package/dist/code-editor-CbyCb7CW.cjs.map +1 -0
  12. package/dist/{code-editor-8Fpinga4.js → code-editor-DOv4jc-0.js} +6 -124
  13. package/dist/code-editor-DOv4jc-0.js.map +1 -0
  14. package/dist/components/Code.cjs.js +1 -2
  15. package/dist/components/Code.cjs.js.map +1 -1
  16. package/dist/components/Code.es.js +1 -1
  17. package/dist/components/CodeBlock.cjs.js +1 -1
  18. package/dist/components/CodeBlock.es.js +1 -1
  19. package/dist/components/CodeEditor.cjs.js +3 -2
  20. package/dist/components/CodeEditor.cjs.js.map +1 -1
  21. package/dist/components/CodeEditor.es.js +2 -2
  22. package/dist/components/DataCodeSection.cjs.js +1 -1
  23. package/dist/components/DataCodeSection.es.js +1 -1
  24. package/dist/components/DataDetailsPanel.cjs.js +1 -1
  25. package/dist/components/DataDetailsPanel.es.js +1 -1
  26. package/dist/components/DataList.cjs.js +17 -15
  27. package/dist/components/DataList.cjs.js.map +1 -1
  28. package/dist/components/DataList.es.js +5 -4
  29. package/dist/components/DataList.es.js.map +1 -1
  30. package/dist/components/DataPanel.cjs.js +1 -1
  31. package/dist/components/DataPanel.es.js +1 -1
  32. package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
  33. package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
  34. package/dist/components/LogsDataList.cjs.js +2 -5
  35. package/dist/components/LogsDataList.cjs.js.map +1 -1
  36. package/dist/components/LogsDataList.es.js +2 -5
  37. package/dist/components/LogsDataList.es.js.map +1 -1
  38. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  39. package/dist/components/MarkdownRenderer.es.js +1 -1
  40. package/dist/components/SideDialog.cjs.js +1 -1
  41. package/dist/components/SideDialog.es.js +1 -1
  42. package/dist/components/Workflow.cjs.js +4 -4
  43. package/dist/components/Workflow.es.js +4 -4
  44. package/dist/components/ai/activity.cjs.js +1 -1
  45. package/dist/components/ai/activity.es.js +1 -1
  46. package/dist/components/ai/plan.cjs.js +1 -1
  47. package/dist/components/ai/plan.es.js +1 -1
  48. package/dist/components/ai/tool-approval.cjs.js +1 -1
  49. package/dist/components/ai/tool-approval.es.js +1 -1
  50. package/dist/components/ai/tool-call.cjs.js +1 -1
  51. package/dist/components/ai/tool-call.es.js +1 -1
  52. package/dist/{data-code-section-Cjs-piiY.js → data-code-section-BWzfg-1n.js} +2 -2
  53. package/dist/{data-code-section-Cjs-piiY.js.map → data-code-section-BWzfg-1n.js.map} +1 -1
  54. package/dist/{data-code-section-BJa6NDgN.cjs → data-code-section-BjyHoHEB.cjs} +2 -2
  55. package/dist/{data-code-section-BJa6NDgN.cjs.map → data-code-section-BjyHoHEB.cjs.map} +1 -1
  56. package/dist/data-list-CGD9hzcp.cjs +142 -0
  57. package/dist/data-list-CGD9hzcp.cjs.map +1 -0
  58. package/dist/data-list-aFlt9Du-.js +138 -0
  59. package/dist/data-list-aFlt9Du-.js.map +1 -0
  60. package/dist/{data-list-skeleton-CXUB-u3p.js → data-list-skeleton-bNfITSHs.js} +2 -2
  61. package/dist/{data-list-skeleton-CXUB-u3p.js.map → data-list-skeleton-bNfITSHs.js.map} +1 -1
  62. package/dist/{data-list-skeleton-DY0F40WQ.cjs → data-list-skeleton-sdcaabdX.cjs} +6 -6
  63. package/dist/{data-list-skeleton-DY0F40WQ.cjs.map → data-list-skeleton-sdcaabdX.cjs.map} +1 -1
  64. package/dist/data-list-spacer-BFAQT_lQ.js +209 -0
  65. package/dist/data-list-spacer-BFAQT_lQ.js.map +1 -0
  66. package/dist/data-list-spacer-Dpoj55mv.cjs +218 -0
  67. package/dist/data-list-spacer-Dpoj55mv.cjs.map +1 -0
  68. package/dist/{data-list-DlXU1PLQ.cjs → data-list-top-DJh08vFA.cjs} +13 -339
  69. package/dist/data-list-top-DJh08vFA.cjs.map +1 -0
  70. package/dist/{data-list-Tor18oy5.js → data-list-top-T-mtdIUp.js} +5 -332
  71. package/dist/data-list-top-T-mtdIUp.js.map +1 -0
  72. package/dist/{data-panel-DGNV14pm.cjs → data-panel-CGRPVnEe.cjs} +2 -2
  73. package/dist/{data-panel-DGNV14pm.cjs.map → data-panel-CGRPVnEe.cjs.map} +1 -1
  74. package/dist/{data-panel-DjtnX70w.js → data-panel-CUqcB4Vn.js} +2 -2
  75. package/dist/{data-panel-DjtnX70w.js.map → data-panel-CUqcB4Vn.js.map} +1 -1
  76. package/dist/domains/chat/components/network-choice-metadata-dialog.cjs.js +2 -1
  77. package/dist/domains/chat/components/network-choice-metadata-dialog.cjs.js.map +1 -1
  78. package/dist/domains/chat/components/network-choice-metadata-dialog.es.js +2 -1
  79. package/dist/domains/chat/components/network-choice-metadata-dialog.es.js.map +1 -1
  80. package/dist/domains/chat/messages/dataset-save-action.cjs.js +2 -1
  81. package/dist/domains/chat/messages/dataset-save-action.cjs.js.map +1 -1
  82. package/dist/domains/chat/messages/dataset-save-action.es.js +2 -1
  83. package/dist/domains/chat/messages/dataset-save-action.es.js.map +1 -1
  84. package/dist/domains/chat/messages/message-row.cjs.js +2 -1
  85. package/dist/domains/chat/messages/message-row.cjs.js.map +1 -1
  86. package/dist/domains/chat/messages/message-row.es.js +2 -1
  87. package/dist/domains/chat/messages/message-row.es.js.map +1 -1
  88. package/dist/domains/chat/messages/renderers/message-text.cjs.js +1 -1
  89. package/dist/domains/chat/messages/renderers/message-text.es.js +1 -1
  90. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js +1 -1
  91. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js +1 -1
  92. package/dist/domains/chat/messages/skill-message.cjs.js +1 -1
  93. package/dist/domains/chat/messages/skill-message.es.js +1 -1
  94. package/dist/domains/chat/messages/tripwire-notice.cjs.js +1 -1
  95. package/dist/domains/chat/messages/tripwire-notice.es.js +1 -1
  96. package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
  97. package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
  98. package/dist/domains/chat/tools/badges/agent-badge.cjs.js +3 -2
  99. package/dist/domains/chat/tools/badges/agent-badge.cjs.js.map +1 -1
  100. package/dist/domains/chat/tools/badges/agent-badge.es.js +3 -2
  101. package/dist/domains/chat/tools/badges/agent-badge.es.js.map +1 -1
  102. package/dist/domains/chat/tools/badges/background-task-metadata-dialog.cjs.js +2 -1
  103. package/dist/domains/chat/tools/badges/background-task-metadata-dialog.cjs.js.map +1 -1
  104. package/dist/domains/chat/tools/badges/background-task-metadata-dialog.es.js +2 -1
  105. package/dist/domains/chat/tools/badges/background-task-metadata-dialog.es.js.map +1 -1
  106. package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js +4 -3
  107. package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js.map +1 -1
  108. package/dist/domains/chat/tools/badges/code-mode-badge.es.js +4 -3
  109. package/dist/domains/chat/tools/badges/code-mode-badge.es.js.map +1 -1
  110. package/dist/domains/chat/tools/badges/file-tree-badge.cjs.js +1 -1
  111. package/dist/domains/chat/tools/badges/file-tree-badge.es.js +1 -1
  112. package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js +2 -2
  113. package/dist/domains/chat/tools/badges/observation-marker-details.es.js +2 -2
  114. package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
  115. package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
  116. package/dist/domains/chat/tools/badges/tool-approval-badge.cjs.js +1 -1
  117. package/dist/domains/chat/tools/badges/tool-approval-badge.es.js +1 -1
  118. package/dist/domains/chat/tools/badges/tool-badge.cjs.js +3 -2
  119. package/dist/domains/chat/tools/badges/tool-badge.cjs.js.map +1 -1
  120. package/dist/domains/chat/tools/badges/tool-badge.es.js +3 -2
  121. package/dist/domains/chat/tools/badges/tool-badge.es.js.map +1 -1
  122. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +2 -3
  123. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js.map +1 -1
  124. package/dist/domains/chat/tools/badges/workflow-badge.es.js +2 -3
  125. package/dist/domains/chat/tools/badges/workflow-badge.es.js.map +1 -1
  126. package/dist/domains/chat/tools/submit-plan-tool.cjs.js +1 -1
  127. package/dist/domains/chat/tools/submit-plan-tool.es.js +1 -1
  128. package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
  129. package/dist/domains/chat/tools/tool-card.es.js +1 -1
  130. package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +3 -2
  131. package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js.map +1 -1
  132. package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +3 -2
  133. package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js.map +1 -1
  134. package/dist/domains/logs/components/log-data-panel.cjs.js +1 -1
  135. package/dist/domains/logs/components/log-data-panel.es.js +1 -1
  136. package/dist/domains/logs/components/logs-list-view.cjs.js +2 -3
  137. package/dist/domains/logs/components/logs-list-view.cjs.js.map +1 -1
  138. package/dist/domains/logs/components/logs-list-view.es.js +2 -3
  139. package/dist/domains/logs/components/logs-list-view.es.js.map +1 -1
  140. package/dist/domains/logs/log-filters.cjs.js +4 -2
  141. package/dist/domains/logs/log-filters.cjs.js.map +1 -1
  142. package/dist/domains/logs/log-filters.es.js +4 -2
  143. package/dist/domains/logs/log-filters.es.js.map +1 -1
  144. package/dist/domains/metrics/drilldown.cjs.js +1 -1
  145. package/dist/domains/metrics/drilldown.es.js +1 -1
  146. package/dist/domains/metrics/metrics-filters.cjs.js +3 -2
  147. package/dist/domains/metrics/metrics-filters.cjs.js.map +1 -1
  148. package/dist/domains/metrics/metrics-filters.es.js +3 -2
  149. package/dist/domains/metrics/metrics-filters.es.js.map +1 -1
  150. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.cjs.js +3 -2
  151. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.cjs.js.map +1 -1
  152. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.es.js +3 -2
  153. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.es.js.map +1 -1
  154. package/dist/domains/scores/components/score-data-panel.cjs.js +1 -1
  155. package/dist/domains/scores/components/score-data-panel.es.js +1 -1
  156. package/dist/domains/scores/components/trace-scores-tab.cjs.js +1 -2
  157. package/dist/domains/scores/components/trace-scores-tab.cjs.js.map +1 -1
  158. package/dist/domains/scores/components/trace-scores-tab.es.js +1 -2
  159. package/dist/domains/scores/components/trace-scores-tab.es.js.map +1 -1
  160. package/dist/domains/traces/components/span-data-panel-view.cjs.js +3 -3
  161. package/dist/domains/traces/components/span-data-panel-view.cjs.js.map +1 -1
  162. package/dist/domains/traces/components/span-data-panel-view.es.js +3 -3
  163. package/dist/domains/traces/components/span-data-panel-view.es.js.map +1 -1
  164. package/dist/domains/traces/components/span-details-view.cjs.js +2 -2
  165. package/dist/domains/traces/components/span-details-view.cjs.js.map +1 -1
  166. package/dist/domains/traces/components/span-details-view.es.js +2 -2
  167. package/dist/domains/traces/components/span-details-view.es.js.map +1 -1
  168. package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
  169. package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
  170. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +2 -3
  171. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js.map +1 -1
  172. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +2 -3
  173. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js.map +1 -1
  174. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +3 -4
  175. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js.map +1 -1
  176. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +3 -4
  177. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js.map +1 -1
  178. package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js +4 -4
  179. package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js.map +1 -1
  180. package/dist/domains/traces/components/span-payload/span-payload-json.es.js +4 -4
  181. package/dist/domains/traces/components/span-payload/span-payload-json.es.js.map +1 -1
  182. package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +2 -2
  183. package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +2 -2
  184. package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +2 -2
  185. package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +2 -2
  186. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
  187. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
  188. package/dist/domains/traces/components/span-payload/span-payload-section.cjs.js +7 -11
  189. package/dist/domains/traces/components/span-payload/span-payload-section.cjs.js.map +1 -1
  190. package/dist/domains/traces/components/span-payload/span-payload-section.es.js +8 -12
  191. package/dist/domains/traces/components/span-payload/span-payload-section.es.js.map +1 -1
  192. package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +1 -1
  193. package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +1 -1
  194. package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js +3 -4
  195. package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js.map +1 -1
  196. package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js +4 -5
  197. package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js.map +1 -1
  198. package/dist/domains/traces/components/span-summary-description.cjs.js +1 -1
  199. package/dist/domains/traces/components/span-summary-description.es.js +1 -1
  200. package/dist/domains/traces/components/thread-trace/thread-trace-details.cjs.js +1 -1
  201. package/dist/domains/traces/components/thread-trace/thread-trace-details.es.js +1 -1
  202. package/dist/domains/traces/components/thread-view-by-trace.cjs.js +1 -0
  203. package/dist/domains/traces/components/thread-view-by-trace.cjs.js.map +1 -1
  204. package/dist/domains/traces/components/thread-view-by-trace.es.js +1 -0
  205. package/dist/domains/traces/components/thread-view-by-trace.es.js.map +1 -1
  206. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +4 -4
  207. package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
  208. package/dist/domains/traces/components/trace-data-panel-view.es.js +4 -4
  209. package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
  210. package/dist/domains/traces/components/trace-data-panel.cjs.js +1 -2
  211. package/dist/domains/traces/components/trace-data-panel.cjs.js.map +1 -1
  212. package/dist/domains/traces/components/trace-data-panel.es.js +1 -2
  213. package/dist/domains/traces/components/trace-data-panel.es.js.map +1 -1
  214. package/dist/domains/traces/components/trace-error-cell.cjs.js +1 -3
  215. package/dist/domains/traces/components/trace-error-cell.cjs.js.map +1 -1
  216. package/dist/domains/traces/components/trace-error-cell.es.js +1 -3
  217. package/dist/domains/traces/components/trace-error-cell.es.js.map +1 -1
  218. package/dist/domains/traces/components/trace-id-button.cjs.js +1 -1
  219. package/dist/domains/traces/components/trace-id-button.es.js +1 -1
  220. package/dist/domains/traces/components/trace-summary-description.cjs.js +1 -1
  221. package/dist/domains/traces/components/trace-summary-description.es.js +1 -1
  222. package/dist/domains/traces/components/trace-thread-panel.cjs.js +1 -1
  223. package/dist/domains/traces/components/trace-thread-panel.es.js +1 -1
  224. package/dist/domains/traces/components/trace-time-range-chip.cjs.js +1 -1
  225. package/dist/domains/traces/components/trace-time-range-chip.es.js +1 -1
  226. package/dist/domains/traces/components/traces-list-view.cjs.js +5 -4
  227. package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
  228. package/dist/domains/traces/components/traces-list-view.es.js +4 -3
  229. package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
  230. package/dist/domains/traces/components/traces-page-skeleton.cjs.js +1 -4
  231. package/dist/domains/traces/components/traces-page-skeleton.cjs.js.map +1 -1
  232. package/dist/domains/traces/components/traces-page-skeleton.es.js +1 -4
  233. package/dist/domains/traces/components/traces-page-skeleton.es.js.map +1 -1
  234. package/dist/domains/traces/hooks/use-trace-filter-persistence.cjs.js +1 -1
  235. package/dist/domains/traces/hooks/use-trace-filter-persistence.es.js +1 -1
  236. package/dist/domains/traces/hooks/use-trace-url-state.cjs.js +1 -1
  237. package/dist/domains/traces/hooks/use-trace-url-state.es.js +1 -1
  238. package/dist/domains/traces/trace-filters.cjs.js +1 -1
  239. package/dist/domains/traces/trace-filters.es.js +1 -1
  240. package/dist/domains/traces/trace-query-filters.cjs.js +1 -1
  241. package/dist/domains/traces/trace-query-filters.es.js +1 -1
  242. package/dist/domains/traces.cjs.js +1 -1
  243. package/dist/domains/traces.es.js +1 -1
  244. package/dist/domains/workflows/components/workflow-step-detail.cjs.js +3 -3
  245. package/dist/domains/workflows/components/workflow-step-detail.es.js +3 -3
  246. package/dist/domains/workflows/components/workflows-list/workflows-list.cjs.js +2 -2
  247. package/dist/domains/workflows/components/workflows-list/workflows-list.es.js +2 -2
  248. package/dist/domains/workflows/workflow/data/workflow-data-button.cjs.js +1 -1
  249. package/dist/domains/workflows/workflow/data/workflow-data-button.es.js +1 -1
  250. package/dist/domains/workflows/workflow/data/workflow-data-inspector.cjs.js +2 -1
  251. package/dist/domains/workflows/workflow/data/workflow-data-inspector.cjs.js.map +1 -1
  252. package/dist/domains/workflows/workflow/data/workflow-data-inspector.es.js +2 -1
  253. package/dist/domains/workflows/workflow/data/workflow-data-inspector.es.js.map +1 -1
  254. package/dist/domains/workflows/workflow/input/workflow-json-input.cjs.js +2 -1
  255. package/dist/domains/workflows/workflow/input/workflow-json-input.cjs.js.map +1 -1
  256. package/dist/domains/workflows/workflow/input/workflow-json-input.es.js +2 -1
  257. package/dist/domains/workflows/workflow/input/workflow-json-input.es.js.map +1 -1
  258. package/dist/domains/workflows/workflow/use-workflow-graph-runtime.cjs.js +2 -2
  259. package/dist/domains/workflows/workflow/use-workflow-graph-runtime.es.js +2 -2
  260. package/dist/domains/workflows/workflow/workflow-body-graph.cjs.js +1 -1
  261. package/dist/domains/workflows/workflow/workflow-body-graph.es.js +1 -1
  262. package/dist/domains/workflows/workflow/workflow-data-edge.cjs.js +1 -1
  263. package/dist/domains/workflows/workflow/workflow-data-edge.es.js +1 -1
  264. package/dist/domains/workflows/workflow/workflow-graph-boundary.cjs.js +1 -1
  265. package/dist/domains/workflows/workflow/workflow-graph-boundary.es.js +1 -1
  266. package/dist/domains/workflows/workflow/workflow-graph-inner.cjs.js +2 -2
  267. package/dist/domains/workflows/workflow/workflow-graph-inner.es.js +2 -2
  268. package/dist/domains/workflows/workflow/workflow-graph-node.cjs.js +2 -2
  269. package/dist/domains/workflows/workflow/workflow-graph-node.es.js +2 -2
  270. package/dist/domains/workflows/workflow/workflow-map-config-dialog.cjs.js +1 -1
  271. package/dist/domains/workflows/workflow/workflow-map-config-dialog.es.js +1 -1
  272. package/dist/domains/workflows/workflow/workflow-nested-graph.cjs.js +2 -2
  273. package/dist/domains/workflows/workflow/workflow-nested-graph.es.js +2 -2
  274. package/dist/domains/workflows/workflow/workflow-run-data.cjs.js +2 -1
  275. package/dist/domains/workflows/workflow/workflow-run-data.cjs.js.map +1 -1
  276. package/dist/domains/workflows/workflow/workflow-run-data.es.js +2 -1
  277. package/dist/domains/workflows/workflow/workflow-run-data.es.js.map +1 -1
  278. package/dist/domains/workflows/workflow/workflow-status.cjs.js +2 -1
  279. package/dist/domains/workflows/workflow/workflow-status.cjs.js.map +1 -1
  280. package/dist/domains/workflows/workflow/workflow-status.es.js +2 -1
  281. package/dist/domains/workflows/workflow/workflow-status.es.js.map +1 -1
  282. package/dist/domains/workflows/workflow/workflow-step-action-bar.cjs.js +1 -1
  283. package/dist/domains/workflows/workflow/workflow-step-action-bar.es.js +1 -1
  284. package/dist/domains/workflows/workflow/workflow-suspended-steps.cjs.js +2 -1
  285. package/dist/domains/workflows/workflow/workflow-suspended-steps.cjs.js.map +1 -1
  286. package/dist/domains/workflows/workflow/workflow-suspended-steps.es.js +2 -1
  287. package/dist/domains/workflows/workflow/workflow-suspended-steps.es.js.map +1 -1
  288. package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +2 -1
  289. package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js.map +1 -1
  290. package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +2 -1
  291. package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js.map +1 -1
  292. package/dist/domains/workspace/components/workspace-active-file.cjs.js +2 -2
  293. package/dist/domains/workspace/components/workspace-active-file.es.js +2 -2
  294. package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +1 -1
  295. package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +1 -1
  296. package/dist/domains/workspace/components/workspace-markdown-preview.cjs.js +2 -2
  297. package/dist/domains/workspace/components/workspace-markdown-preview.es.js +2 -2
  298. package/dist/ee/signals/components/entity-index-list.cjs.js +1 -3
  299. package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
  300. package/dist/ee/signals/components/entity-index-list.es.js +1 -3
  301. package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
  302. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +1 -3
  303. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js.map +1 -1
  304. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +1 -3
  305. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js.map +1 -1
  306. package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
  307. package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
  308. package/dist/highlight-CXDme3FZ.js +124 -0
  309. package/dist/highlight-CXDme3FZ.js.map +1 -0
  310. package/dist/highlight-DfnRU-Am.cjs +128 -0
  311. package/dist/highlight-DfnRU-Am.cjs.map +1 -0
  312. package/dist/layout/tabbed-container.cjs.js +1 -1
  313. package/dist/layout/tabbed-container.es.js +1 -1
  314. package/dist/{logs-data-list-DEZuSjqt.cjs → logs-data-list-DCj8Pj77.cjs} +22 -21
  315. package/dist/{logs-data-list-DEZuSjqt.cjs.map → logs-data-list-DCj8Pj77.cjs.map} +1 -1
  316. package/dist/{logs-data-list-CGerYgSd.js → logs-data-list-Db5dBRmc.js} +3 -2
  317. package/dist/{logs-data-list-CGerYgSd.js.map → logs-data-list-Db5dBRmc.js.map} +1 -1
  318. package/dist/{markdown-renderer-BcpwvSl9.cjs → markdown-renderer-CQ_pSSO7.cjs} +2 -2
  319. package/dist/{markdown-renderer-BcpwvSl9.cjs.map → markdown-renderer-CQ_pSSO7.cjs.map} +1 -1
  320. package/dist/{markdown-renderer-CHLpv5n5.js → markdown-renderer-DEoJ5aBR.js} +2 -2
  321. package/dist/{markdown-renderer-CHLpv5n5.js.map → markdown-renderer-DEoJ5aBR.js.map} +1 -1
  322. package/dist/{plan-TtrepVnQ.js → plan-B6td0b8h.js} +2 -2
  323. package/dist/{plan-TtrepVnQ.js.map → plan-B6td0b8h.js.map} +1 -1
  324. package/dist/{plan-Cm3yHvs3.cjs → plan-TYss51JK.cjs} +2 -2
  325. package/dist/{plan-Cm3yHvs3.cjs.map → plan-TYss51JK.cjs.map} +1 -1
  326. package/dist/{reasoning-activity-C-sJt2A9.js → reasoning-activity-Dz2hk9pU.js} +2 -2
  327. package/dist/{reasoning-activity-C-sJt2A9.js.map → reasoning-activity-Dz2hk9pU.js.map} +1 -1
  328. package/dist/{reasoning-activity-DpYFjxuL.cjs → reasoning-activity-I5-HcGou.cjs} +2 -2
  329. package/dist/{reasoning-activity-DpYFjxuL.cjs.map → reasoning-activity-I5-HcGou.cjs.map} +1 -1
  330. package/dist/{side-dialog-SJCWBnbw.cjs → side-dialog-C-XvsAm_.cjs} +4 -67
  331. package/dist/side-dialog-C-XvsAm_.cjs.map +1 -0
  332. package/dist/{side-dialog-DSvj8H6x.js → side-dialog-cUpWIkKq.js} +3 -66
  333. package/dist/side-dialog-cUpWIkKq.js.map +1 -0
  334. package/dist/{span-payload-primitives-D_N9LeLk.js → span-payload-primitives-CaT3DT8h.js} +2 -2
  335. package/dist/{span-payload-primitives-D_N9LeLk.js.map → span-payload-primitives-CaT3DT8h.js.map} +1 -1
  336. package/dist/{span-payload-primitives-C0KYtmtV.cjs → span-payload-primitives-n5uf4hOk.cjs} +2 -2
  337. package/dist/{span-payload-primitives-C0KYtmtV.cjs.map → span-payload-primitives-n5uf4hOk.cjs.map} +1 -1
  338. package/dist/src/domains/logs/log-filters.d.ts +4 -0
  339. package/dist/src/domains/memory/components/flame-graph-data.d.ts +1 -1
  340. package/dist/src/domains/metrics/metrics-filters.d.ts +3 -0
  341. package/dist/src/domains/traces/components/span-payload/span-payload-json.d.ts +3 -1
  342. package/dist/src/domains/traces/components/span-payload/span-payload-section.d.ts +8 -2
  343. package/dist/src/domains/traces/trace-filters.d.ts +3 -0
  344. package/dist/src/ds/components/Code/code.d.ts +4 -4
  345. package/dist/src/ds/components/Code/use-highlight.d.ts +2 -6
  346. package/dist/src/ds/components/CodeEditor/highlight.d.ts +23 -2
  347. package/dist/src/ds/components/CodeEditor/index.d.ts +1 -1
  348. package/dist/style.css +48 -10
  349. package/dist/toast.css +79 -0
  350. package/dist/{tool-approval-P8rUFAYp.js → tool-approval-meJYp8az.js} +2 -2
  351. package/dist/{tool-approval-P8rUFAYp.js.map → tool-approval-meJYp8az.js.map} +1 -1
  352. package/dist/{tool-approval-zhWdp8i6.cjs → tool-approval-tRkskd9l.cjs} +2 -2
  353. package/dist/{tool-approval-zhWdp8i6.cjs.map → tool-approval-tRkskd9l.cjs.map} +1 -1
  354. package/dist/{tool-call-arguments-goEdIs4f.js → tool-call-arguments-CyKLhuQC.js} +5 -5
  355. package/dist/tool-call-arguments-CyKLhuQC.js.map +1 -0
  356. package/dist/{tool-call-arguments-DzpFckIm.cjs → tool-call-arguments-D4D9tT7-.cjs} +5 -5
  357. package/dist/tool-call-arguments-D4D9tT7-.cjs.map +1 -0
  358. package/dist/{tool-card-aclA3iVz.js → tool-card-B7s_wQuV.js} +3 -2
  359. package/dist/{tool-card-aclA3iVz.js.map → tool-card-B7s_wQuV.js.map} +1 -1
  360. package/dist/{tool-card-yii3vGHu.cjs → tool-card-D9jh-XXM.cjs} +3 -2
  361. package/dist/{tool-card-yii3vGHu.cjs.map → tool-card-D9jh-XXM.cjs.map} +1 -1
  362. package/dist/{trace-filters-C91h9X86.js → trace-filters-D1Cs5f24.js} +3 -2
  363. package/dist/trace-filters-D1Cs5f24.js.map +1 -0
  364. package/dist/{trace-filters-Dz4oj8yV.cjs → trace-filters-tC2TkI42.cjs} +3 -2
  365. package/dist/trace-filters-tC2TkI42.cjs.map +1 -0
  366. package/dist/{traces-data-list-Co9k5J4f.cjs → traces-data-list-CF_LFvnf.cjs} +21 -18
  367. package/dist/traces-data-list-CF_LFvnf.cjs.map +1 -0
  368. package/dist/{traces-data-list-TCKjOldO.js → traces-data-list-SpVFLEy8.js} +6 -3
  369. package/dist/traces-data-list-SpVFLEy8.js.map +1 -0
  370. package/dist/{use-workflow-graph-runtime-DcQD5eA6.cjs → use-workflow-graph-runtime-B0k2hrMc.cjs} +2 -2
  371. package/dist/{use-workflow-graph-runtime-DcQD5eA6.cjs.map → use-workflow-graph-runtime-B0k2hrMc.cjs.map} +1 -1
  372. package/dist/{use-workflow-graph-runtime-xq_aSXPh.js → use-workflow-graph-runtime-DiiAs2oN.js} +2 -2
  373. package/dist/{use-workflow-graph-runtime-xq_aSXPh.js.map → use-workflow-graph-runtime-DiiAs2oN.js.map} +1 -1
  374. package/dist/{workflow-code-dialog-content-CFEaeYUX.js → workflow-code-dialog-content-lRHRkDdW.js} +3 -2
  375. package/dist/{workflow-code-dialog-content-CFEaeYUX.js.map → workflow-code-dialog-content-lRHRkDdW.js.map} +1 -1
  376. package/dist/{workflow-code-dialog-content-B_BQCuFW.cjs → workflow-code-dialog-content-yV6Lecry.cjs} +3 -2
  377. package/dist/{workflow-code-dialog-content-B_BQCuFW.cjs.map → workflow-code-dialog-content-yV6Lecry.cjs.map} +1 -1
  378. package/dist/{workflow-condition-card-CbQ4fCxY.js → workflow-condition-card-99g8uCE3.js} +2 -2
  379. package/dist/{workflow-condition-card-CbQ4fCxY.js.map → workflow-condition-card-99g8uCE3.js.map} +1 -1
  380. package/dist/{workflow-condition-card-CMzoK307.cjs → workflow-condition-card-BFaA8u-a.cjs} +2 -2
  381. package/dist/{workflow-condition-card-CMzoK307.cjs.map → workflow-condition-card-BFaA8u-a.cjs.map} +1 -1
  382. package/dist/{workflow-data-edge-view-gwwJEvXz.js → workflow-data-edge-view-BcLEbr1i.js} +2 -2
  383. package/dist/{workflow-data-edge-view-gwwJEvXz.js.map → workflow-data-edge-view-BcLEbr1i.js.map} +1 -1
  384. package/dist/{workflow-data-edge-view-0utEB4Yb.cjs → workflow-data-edge-view-DadIXKjI.cjs} +2 -2
  385. package/dist/{workflow-data-edge-view-0utEB4Yb.cjs.map → workflow-data-edge-view-DadIXKjI.cjs.map} +1 -1
  386. package/dist/{workflow-edge-data-button-YWjfx-W0.js → workflow-edge-data-button-AwaLTE7H.js} +2 -2
  387. package/dist/{workflow-edge-data-button-YWjfx-W0.js.map → workflow-edge-data-button-AwaLTE7H.js.map} +1 -1
  388. package/dist/{workflow-edge-data-button-tDvziS5v.cjs → workflow-edge-data-button-B4_tt1pL.cjs} +2 -2
  389. package/dist/{workflow-edge-data-button-tDvziS5v.cjs.map → workflow-edge-data-button-B4_tt1pL.cjs.map} +1 -1
  390. package/package.json +9 -10
  391. package/dist/code-DJReJPSX.cjs.map +0 -1
  392. package/dist/code-DLuATvYu.js.map +0 -1
  393. package/dist/code-editor-8Fpinga4.js.map +0 -1
  394. package/dist/code-editor-Bd-Cldem.cjs.map +0 -1
  395. package/dist/data-list-DlXU1PLQ.cjs.map +0 -1
  396. package/dist/data-list-Tor18oy5.js.map +0 -1
  397. package/dist/highlight-BmpoELR4.js +0 -87
  398. package/dist/highlight-BmpoELR4.js.map +0 -1
  399. package/dist/highlight-DK1dn-Fh.cjs +0 -90
  400. package/dist/highlight-DK1dn-Fh.cjs.map +0 -1
  401. package/dist/side-dialog-DSvj8H6x.js.map +0 -1
  402. package/dist/side-dialog-SJCWBnbw.cjs.map +0 -1
  403. package/dist/tool-call-arguments-DzpFckIm.cjs.map +0 -1
  404. package/dist/tool-call-arguments-goEdIs4f.js.map +0 -1
  405. package/dist/trace-filters-C91h9X86.js.map +0 -1
  406. package/dist/trace-filters-Dz4oj8yV.cjs.map +0 -1
  407. package/dist/traces-data-list-Co9k5J4f.cjs.map +0 -1
  408. package/dist/traces-data-list-TCKjOldO.js.map +0 -1
package/components.css CHANGED
@@ -149,14 +149,57 @@
149
149
  }
150
150
 
151
151
  @layer utilities {
152
- .shiki-token {
153
- color: var(--shiki-light, var(--foreground));
154
- background-color: var(--shiki-light-bg, transparent);
152
+ /* Syntax roles from `syntaxHighlighter`, shared by the <Code> viewer and every CodeMirror editor. */
153
+ .syntax-comment {
154
+ color: var(--placeholder);
155
155
  }
156
156
 
157
- .dark .shiki-token {
158
- color: var(--shiki-dark, var(--foreground));
159
- background-color: var(--shiki-dark-bg, transparent);
157
+ .syntax-string {
158
+ color: var(--syntax-string);
159
+ }
160
+
161
+ .syntax-literal {
162
+ color: var(--syntax-literal);
163
+ }
164
+
165
+ .syntax-keyword {
166
+ color: var(--syntax-keyword);
167
+ }
168
+
169
+ .syntax-name {
170
+ color: var(--syntax-name);
171
+ }
172
+
173
+ .syntax-definition {
174
+ color: var(--syntax-link);
175
+ }
176
+
177
+ .syntax-link {
178
+ color: var(--syntax-link);
179
+ text-decoration: underline;
180
+ }
181
+
182
+ .syntax-heading {
183
+ color: var(--syntax-link);
184
+ font-weight: bold;
185
+ }
186
+
187
+ .syntax-emphasis {
188
+ color: var(--foreground);
189
+ font-style: italic;
190
+ }
191
+
192
+ .syntax-strong {
193
+ color: var(--foreground);
194
+ font-weight: bold;
195
+ }
196
+
197
+ .syntax-strike {
198
+ text-decoration: line-through;
199
+ }
200
+
201
+ .syntax-invalid {
202
+ color: var(--destructive-foreground);
160
203
  }
161
204
  }
162
205
 
@@ -3,7 +3,7 @@
3
3
  const jsxRuntime = require('react/jsx-runtime');
4
4
  const React = require('react');
5
5
  const useDebounce = require('use-debounce');
6
- const highlight = require('./highlight-DK1dn-Fh.cjs');
6
+ const highlight = require('./highlight-DfnRU-Am.cjs');
7
7
 
8
8
  function _interopNamespaceDefault(e) {
9
9
  const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
@@ -27,6 +27,7 @@ const React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
27
27
  const HIGHLIGHT_SAMPLE_INTERVAL_MS = 75;
28
28
  function useHighlight(code, lang) {
29
29
  const [highlighted, setHighlighted] = React.useState(null);
30
+ const latest = React.useRef(null);
30
31
  const [sampledCode, sampler] = useDebounce.useDebounce(code, HIGHLIGHT_SAMPLE_INTERVAL_MS, {
31
32
  leading: true,
32
33
  maxWait: HIGHLIGHT_SAMPLE_INTERVAL_MS
@@ -35,8 +36,11 @@ function useHighlight(code, lang) {
35
36
  React.useEffect(() => {
36
37
  if (!lang) return;
37
38
  let cancelled = false;
38
- void highlight.highlight(sampledCode, lang).then((tokens) => {
39
- if (!cancelled && tokens?.length) setHighlighted({ code: sampledCode, lang, tokens });
39
+ const previous = latest.current?.lang === lang ? latest.current : void 0;
40
+ void highlight.highlight(sampledCode, lang, previous).then((result) => {
41
+ if (cancelled || !result?.tokens.length) return;
42
+ latest.current = { ...result, lang };
43
+ setHighlighted(latest.current);
40
44
  }).catch(() => {
41
45
  });
42
46
  return () => {
@@ -45,12 +49,6 @@ function useHighlight(code, lang) {
45
49
  }, [sampledCode, lang]);
46
50
  return lang ? highlighted : null;
47
51
  }
48
- function tokenStyle(token) {
49
- if (token.htmlStyle && typeof token.htmlStyle === "object") {
50
- return token.htmlStyle;
51
- }
52
- return token.color ? { color: token.color } : void 0;
53
- }
54
52
 
55
53
  function usableHighlight(highlighted, code, lang) {
56
54
  if (!highlighted || highlighted.lang !== lang) return null;
@@ -76,7 +74,7 @@ const Code = React__namespace.memo(function Code2({ code, lang, lineClassName, .
76
74
  const tokenSpans = line.map((token) => {
77
75
  const key = tokenOffset;
78
76
  tokenOffset += token.content.length;
79
- return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shiki-token", style: tokenStyle(token), children: token.content }, key);
77
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className: token.className, children: token.content }, key);
80
78
  });
81
79
  codeOffset = tokenOffset + 1;
82
80
  return /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
@@ -96,6 +94,5 @@ const Code = React__namespace.memo(function Code2({ code, lang, lineClassName, .
96
94
  });
97
95
 
98
96
  exports.Code = Code;
99
- exports.tokenStyle = tokenStyle;
100
97
  exports.useHighlight = useHighlight;
101
- //# sourceMappingURL=code-DJReJPSX.cjs.map
98
+ //# sourceMappingURL=code-CUOlhM4J.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-CUOlhM4J.cjs","sources":["../src/ds/components/Code/use-highlight.ts","../src/ds/components/Code/code.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { useDebounce } from 'use-debounce';\n\nimport { highlight } from '../CodeEditor/highlight';\nimport type { HighlightResult } from '../CodeEditor/highlight';\n\nexport interface Highlighted extends HighlightResult {\n lang: string;\n}\n\nconst HIGHLIGHT_SAMPLE_INTERVAL_MS = 75;\n\n/** Tokens land a pass behind the code, so the value may still describe the previous code. */\nexport function useHighlight(code: string, lang: string | undefined): Highlighted | null {\n const [highlighted, setHighlighted] = useState<Highlighted | null>(null);\n // Read by the next pass so a streaming block re-parses only its new tail.\n const latest = useRef<Highlighted | null>(null);\n // maxWait equal to the delay turns the debounce into a throttle.\n const [sampledCode, sampler] = useDebounce(code, HIGHLIGHT_SAMPLE_INTERVAL_MS, {\n leading: true,\n maxWait: HIGHLIGHT_SAMPLE_INTERVAL_MS,\n });\n\n // With `leading`, use-debounce's pending timer still calls setState after unmount.\n useEffect(() => () => sampler.cancel(), [sampler]);\n\n useEffect(() => {\n if (!lang) return;\n\n let cancelled = false;\n const previous = latest.current?.lang === lang ? latest.current : undefined;\n\n void highlight(sampledCode, lang, previous)\n .then(result => {\n if (cancelled || !result?.tokens.length) return;\n latest.current = { ...result, lang };\n setHighlighted(latest.current);\n })\n .catch(() => {});\n\n return () => {\n cancelled = true;\n };\n }, [sampledCode, lang]);\n\n return lang ? highlighted : null;\n}\n","import * as React from 'react';\n\nimport { useHighlight } from './use-highlight';\nimport type { Highlighted } from './use-highlight';\n\nexport interface CodeProps extends React.HTMLAttributes<HTMLPreElement> {\n code: string;\n lang?: string;\n /** Per-line class, e.g. for diff or search highlighting. When set, every line is wrapped in a `[data-line]` span. */\n lineClassName?: (lineIndex: number, lineText: string) => string | undefined;\n}\n\n/** Colors from an earlier pass still hold when the new code only appends to the old. */\nfunction usableHighlight(highlighted: Highlighted | null, code: string, lang?: string): Highlighted | null {\n if (!highlighted || highlighted.lang !== lang) return null;\n return code.startsWith(highlighted.code) ? highlighted : null;\n}\n\n/**\n * Low-level syntax-highlighted renderer shared by `CodeBlock` and `MarkdownRenderer`.\n * Tokens come from the CodeMirror/Lezer grammars and carry `syntax-*` role\n * classes (components.css) backed by the `--syntax-*` variables, so colors\n * match the editors and theme switching is pure CSS — no ThemeProvider\n * required. Renders plain text while highlighting is pending or when the\n * language is missing/unknown.\n *\n * A streaming fence re-renders on every delta while highlighting stays a sample\n * behind. Dropping the previous tokens each time would strobe the whole block\n * between colored and plain, so the settled prefix keeps its colors and only\n * the newly arrived tail waits, uncolored, for the next pass.\n */\nexport const Code = React.memo(function Code({ code, lang, lineClassName, ...props }: CodeProps) {\n const highlighted = useHighlight(code, lang);\n\n const usable = usableHighlight(highlighted, code, lang);\n if (!usable) {\n if (!lineClassName) return <pre {...props}>{code}</pre>;\n const lines = code.split('\\n');\n return (\n <pre {...props}>\n {lines.map((text, i) => (\n <React.Fragment key={i}>\n <span data-line={i} className={lineClassName(i, text)}>\n {text}\n </span>\n {i !== lines.length - 1 && '\\n'}\n </React.Fragment>\n ))}\n </pre>\n );\n }\n\n const tail = code.slice(usable.code.length);\n let codeOffset = 0;\n\n return (\n <pre {...props}>\n <code className=\"font-[inherit]\">\n {usable.tokens.map((line, lineIndex) => {\n const lineOffset = codeOffset;\n let tokenOffset = lineOffset;\n const tokenSpans = line.map(token => {\n const key = tokenOffset;\n tokenOffset += token.content.length;\n\n return (\n <span key={key} className={token.className}>\n {token.content}\n </span>\n );\n });\n\n codeOffset = tokenOffset + 1;\n\n return (\n <React.Fragment key={lineOffset}>\n {lineClassName ? (\n <span\n data-line={lineIndex}\n className={lineClassName(lineIndex, line.map(token => token.content).join(''))}\n >\n {tokenSpans}\n </span>\n ) : (\n <span>{tokenSpans}</span>\n )}\n {lineIndex !== usable.tokens.length - 1 && '\\n'}\n </React.Fragment>\n );\n })}\n {tail}\n </code>\n </pre>\n );\n});\n"],"names":["useState","useRef","useDebounce","useEffect","highlight","React","Code","jsx","jsxs"],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
- import { useState, useEffect } from 'react';
3
+ import { useState, useRef, useEffect } from 'react';
4
4
  import { useDebounce } from 'use-debounce';
5
- import { h as highlight } from './highlight-BmpoELR4.js';
5
+ import { h as highlight } from './highlight-CXDme3FZ.js';
6
6
 
7
7
  const HIGHLIGHT_SAMPLE_INTERVAL_MS = 75;
8
8
  function useHighlight(code, lang) {
9
9
  const [highlighted, setHighlighted] = useState(null);
10
+ const latest = useRef(null);
10
11
  const [sampledCode, sampler] = useDebounce(code, HIGHLIGHT_SAMPLE_INTERVAL_MS, {
11
12
  leading: true,
12
13
  maxWait: HIGHLIGHT_SAMPLE_INTERVAL_MS
@@ -15,8 +16,11 @@ function useHighlight(code, lang) {
15
16
  useEffect(() => {
16
17
  if (!lang) return;
17
18
  let cancelled = false;
18
- void highlight(sampledCode, lang).then((tokens) => {
19
- if (!cancelled && tokens?.length) setHighlighted({ code: sampledCode, lang, tokens });
19
+ const previous = latest.current?.lang === lang ? latest.current : void 0;
20
+ void highlight(sampledCode, lang, previous).then((result) => {
21
+ if (cancelled || !result?.tokens.length) return;
22
+ latest.current = { ...result, lang };
23
+ setHighlighted(latest.current);
20
24
  }).catch(() => {
21
25
  });
22
26
  return () => {
@@ -25,12 +29,6 @@ function useHighlight(code, lang) {
25
29
  }, [sampledCode, lang]);
26
30
  return lang ? highlighted : null;
27
31
  }
28
- function tokenStyle(token) {
29
- if (token.htmlStyle && typeof token.htmlStyle === "object") {
30
- return token.htmlStyle;
31
- }
32
- return token.color ? { color: token.color } : void 0;
33
- }
34
32
 
35
33
  function usableHighlight(highlighted, code, lang) {
36
34
  if (!highlighted || highlighted.lang !== lang) return null;
@@ -56,7 +54,7 @@ const Code = React.memo(function Code2({ code, lang, lineClassName, ...props })
56
54
  const tokenSpans = line.map((token) => {
57
55
  const key = tokenOffset;
58
56
  tokenOffset += token.content.length;
59
- return /* @__PURE__ */ jsx("span", { className: "shiki-token", style: tokenStyle(token), children: token.content }, key);
57
+ return /* @__PURE__ */ jsx("span", { className: token.className, children: token.content }, key);
60
58
  });
61
59
  codeOffset = tokenOffset + 1;
62
60
  return /* @__PURE__ */ jsxs(React.Fragment, { children: [
@@ -75,5 +73,5 @@ const Code = React.memo(function Code2({ code, lang, lineClassName, ...props })
75
73
  ] }) });
76
74
  });
77
75
 
78
- export { Code as C, tokenStyle as t, useHighlight as u };
79
- //# sourceMappingURL=code-DLuATvYu.js.map
76
+ export { Code as C, useHighlight as u };
77
+ //# sourceMappingURL=code-CsHrVTpJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-CsHrVTpJ.js","sources":["../src/ds/components/Code/use-highlight.ts","../src/ds/components/Code/code.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { useDebounce } from 'use-debounce';\n\nimport { highlight } from '../CodeEditor/highlight';\nimport type { HighlightResult } from '../CodeEditor/highlight';\n\nexport interface Highlighted extends HighlightResult {\n lang: string;\n}\n\nconst HIGHLIGHT_SAMPLE_INTERVAL_MS = 75;\n\n/** Tokens land a pass behind the code, so the value may still describe the previous code. */\nexport function useHighlight(code: string, lang: string | undefined): Highlighted | null {\n const [highlighted, setHighlighted] = useState<Highlighted | null>(null);\n // Read by the next pass so a streaming block re-parses only its new tail.\n const latest = useRef<Highlighted | null>(null);\n // maxWait equal to the delay turns the debounce into a throttle.\n const [sampledCode, sampler] = useDebounce(code, HIGHLIGHT_SAMPLE_INTERVAL_MS, {\n leading: true,\n maxWait: HIGHLIGHT_SAMPLE_INTERVAL_MS,\n });\n\n // With `leading`, use-debounce's pending timer still calls setState after unmount.\n useEffect(() => () => sampler.cancel(), [sampler]);\n\n useEffect(() => {\n if (!lang) return;\n\n let cancelled = false;\n const previous = latest.current?.lang === lang ? latest.current : undefined;\n\n void highlight(sampledCode, lang, previous)\n .then(result => {\n if (cancelled || !result?.tokens.length) return;\n latest.current = { ...result, lang };\n setHighlighted(latest.current);\n })\n .catch(() => {});\n\n return () => {\n cancelled = true;\n };\n }, [sampledCode, lang]);\n\n return lang ? highlighted : null;\n}\n","import * as React from 'react';\n\nimport { useHighlight } from './use-highlight';\nimport type { Highlighted } from './use-highlight';\n\nexport interface CodeProps extends React.HTMLAttributes<HTMLPreElement> {\n code: string;\n lang?: string;\n /** Per-line class, e.g. for diff or search highlighting. When set, every line is wrapped in a `[data-line]` span. */\n lineClassName?: (lineIndex: number, lineText: string) => string | undefined;\n}\n\n/** Colors from an earlier pass still hold when the new code only appends to the old. */\nfunction usableHighlight(highlighted: Highlighted | null, code: string, lang?: string): Highlighted | null {\n if (!highlighted || highlighted.lang !== lang) return null;\n return code.startsWith(highlighted.code) ? highlighted : null;\n}\n\n/**\n * Low-level syntax-highlighted renderer shared by `CodeBlock` and `MarkdownRenderer`.\n * Tokens come from the CodeMirror/Lezer grammars and carry `syntax-*` role\n * classes (components.css) backed by the `--syntax-*` variables, so colors\n * match the editors and theme switching is pure CSS — no ThemeProvider\n * required. Renders plain text while highlighting is pending or when the\n * language is missing/unknown.\n *\n * A streaming fence re-renders on every delta while highlighting stays a sample\n * behind. Dropping the previous tokens each time would strobe the whole block\n * between colored and plain, so the settled prefix keeps its colors and only\n * the newly arrived tail waits, uncolored, for the next pass.\n */\nexport const Code = React.memo(function Code({ code, lang, lineClassName, ...props }: CodeProps) {\n const highlighted = useHighlight(code, lang);\n\n const usable = usableHighlight(highlighted, code, lang);\n if (!usable) {\n if (!lineClassName) return <pre {...props}>{code}</pre>;\n const lines = code.split('\\n');\n return (\n <pre {...props}>\n {lines.map((text, i) => (\n <React.Fragment key={i}>\n <span data-line={i} className={lineClassName(i, text)}>\n {text}\n </span>\n {i !== lines.length - 1 && '\\n'}\n </React.Fragment>\n ))}\n </pre>\n );\n }\n\n const tail = code.slice(usable.code.length);\n let codeOffset = 0;\n\n return (\n <pre {...props}>\n <code className=\"font-[inherit]\">\n {usable.tokens.map((line, lineIndex) => {\n const lineOffset = codeOffset;\n let tokenOffset = lineOffset;\n const tokenSpans = line.map(token => {\n const key = tokenOffset;\n tokenOffset += token.content.length;\n\n return (\n <span key={key} className={token.className}>\n {token.content}\n </span>\n );\n });\n\n codeOffset = tokenOffset + 1;\n\n return (\n <React.Fragment key={lineOffset}>\n {lineClassName ? (\n <span\n data-line={lineIndex}\n className={lineClassName(lineIndex, line.map(token => token.content).join(''))}\n >\n {tokenSpans}\n </span>\n ) : (\n <span>{tokenSpans}</span>\n )}\n {lineIndex !== usable.tokens.length - 1 && '\\n'}\n </React.Fragment>\n );\n })}\n {tail}\n </code>\n </pre>\n );\n});\n"],"names":["Code"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { C as Code } from './code-DLuATvYu.js';
2
+ import { C as Code } from './code-CsHrVTpJ.js';
3
3
  import { C as CopyButton } from './copy-button-B_i9lwFJ.js';
4
4
  import { S as Select, d as SelectTrigger, e as SelectValue, a as SelectContent, c as SelectItem } from './select-7rYaECQf.js';
5
5
  import { T as TabList } from './tabs-list-BCnrYcX1.js';
@@ -84,4 +84,4 @@ function CodeBlock({
84
84
  }
85
85
 
86
86
  export { CodeBlock as C };
87
- //# sourceMappingURL=code-block-D6A1DMv-.js.map
87
+ //# sourceMappingURL=code-block-BB-5HSl3.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"code-block-D6A1DMv-.js","sources":["../src/ds/components/CodeBlock/code-block.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { Code } from '../Code/code';\nimport { CopyButton } from '../CopyButton/copy-button';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../Select/select';\nimport { TabList } from '../Tabs/tabs-list';\nimport { Tabs } from '../Tabs/tabs-root';\nimport { Tab } from '../Tabs/tabs-tab';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type CodeBlockSelector = 'select' | 'tabs';\n\nexport type CodeBlockOverflow = 'wrap' | 'scroll';\n\nexport interface CodeBlockOption {\n label: string;\n value: string;\n}\n\nexport interface CodeBlockProps {\n code: string;\n options?: CodeBlockOption[];\n value?: string;\n onValueChange?: (value: string) => void;\n selector?: CodeBlockSelector;\n fileName?: string;\n lang?: string;\n /** `wrap` (default) breaks long lines — best for commands and snippets.\n * `scroll` preserves columns behind a horizontal scroll — best for source code. */\n overflow?: CodeBlockOverflow;\n copyMessage?: string;\n copyTooltip?: string;\n actions?: ReactNode;\n className?: string;\n}\n\nexport function CodeBlock({\n code,\n options,\n value,\n onValueChange,\n selector = 'select',\n fileName,\n lang,\n overflow = 'wrap',\n copyMessage,\n copyTooltip,\n actions,\n className,\n}: CodeBlockProps) {\n const hasOptions = options && options.length > 0;\n const useTabs = hasOptions && selector === 'tabs';\n const useSelect = hasOptions && selector === 'select';\n const firstOption = options?.[0];\n const activeValue = value ?? firstOption?.value;\n\n return (\n <figure\n // A scrolling `pre` still reports its longest line as an intrinsic width, which\n // grows every ancestor; containment keeps the block inside the width it is given.\n className={cn(\n 'group relative flex w-full flex-col overflow-hidden rounded-2xl border border-border bg-background [contain:inline-size]',\n className,\n )}\n >\n {useTabs && firstOption && (\n <Tabs defaultTab={firstOption.value} value={activeValue} onValueChange={onValueChange ?? (() => {})}>\n <div className=\"flex items-stretch\">\n <div className=\"min-w-0 flex-1\">\n <TabList>\n {options.map(opt => (\n <Tab key={opt.value} value={opt.value}>\n {opt.label}\n </Tab>\n ))}\n </TabList>\n </div>\n {actions && <div className=\"flex shrink-0 items-center border-b border-border pr-2 pl-3\">{actions}</div>}\n </div>\n </Tabs>\n )}\n\n {useSelect && options && (\n <div className=\"flex items-center border-b border-border px-2 py-1.5\">\n <Select value={activeValue} onValueChange={onValueChange}>\n <SelectTrigger size=\"sm\" variant=\"ghost\" className=\"w-auto\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options.map(opt => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {actions && <div className=\"ml-auto flex items-center\">{actions}</div>}\n </div>\n )}\n\n {!hasOptions && fileName && (\n <div className=\"flex items-center border-b border-border px-4 py-2\">\n <figcaption className=\"font-mono text-caption text-muted-foreground\">{fileName}</figcaption>\n {actions && <div className=\"ml-auto flex items-center\">{actions}</div>}\n </div>\n )}\n\n {!hasOptions && !fileName && actions && (\n <div className=\"flex items-center justify-end border-b border-border px-2 py-1.5\">{actions}</div>\n )}\n\n <div className=\"relative\">\n <Code\n code={code}\n lang={lang}\n className={cn(\n 'px-4 py-3 font-mono text-caption text-foreground',\n overflow === 'scroll' ? 'overflow-x-auto whitespace-pre' : 'break-all whitespace-pre-wrap',\n )}\n />\n <CopyButton\n content={code}\n copyMessage={copyMessage}\n tooltip={copyTooltip}\n size=\"sm\"\n className={cn(\n 'absolute top-2 right-2 opacity-100 group-focus-within:opacity-100 group-hover:opacity-100 pointer-fine:opacity-0',\n transitions.opacity,\n )}\n />\n </div>\n </figure>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AAoCO,SAAS,SAAA,CAAU;AAAA,EACxB,IAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA,GAAW,QAAA;AAAA,EACX,QAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA,GAAW,MAAA;AAAA,EACX,WAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,UAAA,GAAa,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,CAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,cAAc,QAAA,KAAa,MAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,cAAc,QAAA,KAAa,QAAA;AAC7C,EAAA,MAAM,WAAA,GAAc,UAAU,CAAC,CAAA;AAC/B,EAAA,MAAM,WAAA,GAAc,SAAS,WAAA,EAAa,KAAA;AAE1C,EAAA,uBACE,IAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MAGC,SAAA,EAAW,EAAA;AAAA,QACT,0HAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,OAAA,IAAW,WAAA,oBACV,GAAA,CAAC,IAAA,EAAA,EAAK,UAAA,EAAY,WAAA,CAAY,OAAO,KAAA,EAAO,WAAA,EAAa,aAAA,EAAe,aAAA,KAAkB,MAAM;AAAA,QAAC,CAAA,CAAA,EAC/F,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,SAAI,SAAA,EAAU,gBAAA,EACb,8BAAC,OAAA,EAAA,EACE,QAAA,EAAA,OAAA,CAAQ,IAAI,CAAA,GAAA,qBACX,GAAA,CAAC,OAAoB,KAAA,EAAO,GAAA,CAAI,OAC7B,QAAA,EAAA,GAAA,CAAI,KAAA,EAAA,EADG,IAAI,KAEd,CACD,GACH,CAAA,EACF,CAAA;AAAA,UACC,OAAA,oBAAW,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAA+D,QAAA,EAAA,OAAA,EAAQ;AAAA,SAAA,EACpG,CAAA,EACF,CAAA;AAAA,QAGD,SAAA,IAAa,OAAA,oBACZ,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sDAAA,EACb,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,MAAA,EAAA,EAAO,KAAA,EAAO,WAAA,EAAa,aAAA,EAC1B,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,aAAA,EAAA,EAAc,MAAK,IAAA,EAAK,OAAA,EAAQ,SAAQ,SAAA,EAAU,QAAA,EACjD,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,CAAA,EACf,CAAA;AAAA,4BACA,GAAA,CAAC,aAAA,EAAA,EACE,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,yBACX,GAAA,CAAC,UAAA,EAAA,EAA2B,KAAA,EAAO,GAAA,CAAI,OACpC,QAAA,EAAA,GAAA,CAAI,KAAA,EAAA,EADU,GAAA,CAAI,KAErB,CACD,CAAA,EACH;AAAA,WAAA,EACF,CAAA;AAAA,UACC,OAAA,oBAAW,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAA6B,QAAA,EAAA,OAAA,EAAQ;AAAA,SAAA,EAClE,CAAA;AAAA,QAGD,CAAC,UAAA,IAAc,QAAA,oBACd,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oDAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAW,SAAA,EAAU,8CAAA,EAAgD,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,UAC9E,OAAA,oBAAW,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAA6B,QAAA,EAAA,OAAA,EAAQ;AAAA,SAAA,EAClE,CAAA;AAAA,QAGD,CAAC,cAAc,CAAC,QAAA,IAAY,2BAC3B,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EAAoE,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,wBAG7F,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,IAAA;AAAA,cACA,IAAA;AAAA,cACA,SAAA,EAAW,EAAA;AAAA,gBACT,kDAAA;AAAA,gBACA,QAAA,KAAa,WAAW,gCAAA,GAAmC;AAAA;AAC7D;AAAA,WACF;AAAA,0BACA,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,IAAA;AAAA,cACT,WAAA;AAAA,cACA,OAAA,EAAS,WAAA;AAAA,cACT,IAAA,EAAK,IAAA;AAAA,cACL,SAAA,EAAW,EAAA;AAAA,gBACT,kHAAA;AAAA,gBACA,WAAA,CAAY;AAAA;AACd;AAAA;AACF,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
1
+ {"version":3,"file":"code-block-BB-5HSl3.js","sources":["../src/ds/components/CodeBlock/code-block.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { Code } from '../Code/code';\nimport { CopyButton } from '../CopyButton/copy-button';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../Select/select';\nimport { TabList } from '../Tabs/tabs-list';\nimport { Tabs } from '../Tabs/tabs-root';\nimport { Tab } from '../Tabs/tabs-tab';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type CodeBlockSelector = 'select' | 'tabs';\n\nexport type CodeBlockOverflow = 'wrap' | 'scroll';\n\nexport interface CodeBlockOption {\n label: string;\n value: string;\n}\n\nexport interface CodeBlockProps {\n code: string;\n options?: CodeBlockOption[];\n value?: string;\n onValueChange?: (value: string) => void;\n selector?: CodeBlockSelector;\n fileName?: string;\n lang?: string;\n /** `wrap` (default) breaks long lines — best for commands and snippets.\n * `scroll` preserves columns behind a horizontal scroll — best for source code. */\n overflow?: CodeBlockOverflow;\n copyMessage?: string;\n copyTooltip?: string;\n actions?: ReactNode;\n className?: string;\n}\n\nexport function CodeBlock({\n code,\n options,\n value,\n onValueChange,\n selector = 'select',\n fileName,\n lang,\n overflow = 'wrap',\n copyMessage,\n copyTooltip,\n actions,\n className,\n}: CodeBlockProps) {\n const hasOptions = options && options.length > 0;\n const useTabs = hasOptions && selector === 'tabs';\n const useSelect = hasOptions && selector === 'select';\n const firstOption = options?.[0];\n const activeValue = value ?? firstOption?.value;\n\n return (\n <figure\n // A scrolling `pre` still reports its longest line as an intrinsic width, which\n // grows every ancestor; containment keeps the block inside the width it is given.\n className={cn(\n 'group relative flex w-full flex-col overflow-hidden rounded-2xl border border-border bg-background [contain:inline-size]',\n className,\n )}\n >\n {useTabs && firstOption && (\n <Tabs defaultTab={firstOption.value} value={activeValue} onValueChange={onValueChange ?? (() => {})}>\n <div className=\"flex items-stretch\">\n <div className=\"min-w-0 flex-1\">\n <TabList>\n {options.map(opt => (\n <Tab key={opt.value} value={opt.value}>\n {opt.label}\n </Tab>\n ))}\n </TabList>\n </div>\n {actions && <div className=\"flex shrink-0 items-center border-b border-border pr-2 pl-3\">{actions}</div>}\n </div>\n </Tabs>\n )}\n\n {useSelect && options && (\n <div className=\"flex items-center border-b border-border px-2 py-1.5\">\n <Select value={activeValue} onValueChange={onValueChange}>\n <SelectTrigger size=\"sm\" variant=\"ghost\" className=\"w-auto\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options.map(opt => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {actions && <div className=\"ml-auto flex items-center\">{actions}</div>}\n </div>\n )}\n\n {!hasOptions && fileName && (\n <div className=\"flex items-center border-b border-border px-4 py-2\">\n <figcaption className=\"font-mono text-caption text-muted-foreground\">{fileName}</figcaption>\n {actions && <div className=\"ml-auto flex items-center\">{actions}</div>}\n </div>\n )}\n\n {!hasOptions && !fileName && actions && (\n <div className=\"flex items-center justify-end border-b border-border px-2 py-1.5\">{actions}</div>\n )}\n\n <div className=\"relative\">\n <Code\n code={code}\n lang={lang}\n className={cn(\n 'px-4 py-3 font-mono text-caption text-foreground',\n overflow === 'scroll' ? 'overflow-x-auto whitespace-pre' : 'break-all whitespace-pre-wrap',\n )}\n />\n <CopyButton\n content={code}\n copyMessage={copyMessage}\n tooltip={copyTooltip}\n size=\"sm\"\n className={cn(\n 'absolute top-2 right-2 opacity-100 group-focus-within:opacity-100 group-hover:opacity-100 pointer-fine:opacity-0',\n transitions.opacity,\n )}\n />\n </div>\n </figure>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const jsxRuntime = require('react/jsx-runtime');
4
- const code = require('./code-DJReJPSX.cjs');
4
+ const code = require('./code-CUOlhM4J.cjs');
5
5
  const copyButton = require('./copy-button-BC02oZJo.cjs');
6
6
  const select = require('./select-A3AFKLd9.cjs');
7
7
  const tabsList = require('./tabs-list-BTRYiT_o.cjs');
@@ -86,4 +86,4 @@ function CodeBlock({
86
86
  }
87
87
 
88
88
  exports.CodeBlock = CodeBlock;
89
- //# sourceMappingURL=code-block-C79fiykv.cjs.map
89
+ //# sourceMappingURL=code-block-CAV4Flrx.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"code-block-C79fiykv.cjs","sources":["../src/ds/components/CodeBlock/code-block.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { Code } from '../Code/code';\nimport { CopyButton } from '../CopyButton/copy-button';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../Select/select';\nimport { TabList } from '../Tabs/tabs-list';\nimport { Tabs } from '../Tabs/tabs-root';\nimport { Tab } from '../Tabs/tabs-tab';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type CodeBlockSelector = 'select' | 'tabs';\n\nexport type CodeBlockOverflow = 'wrap' | 'scroll';\n\nexport interface CodeBlockOption {\n label: string;\n value: string;\n}\n\nexport interface CodeBlockProps {\n code: string;\n options?: CodeBlockOption[];\n value?: string;\n onValueChange?: (value: string) => void;\n selector?: CodeBlockSelector;\n fileName?: string;\n lang?: string;\n /** `wrap` (default) breaks long lines — best for commands and snippets.\n * `scroll` preserves columns behind a horizontal scroll — best for source code. */\n overflow?: CodeBlockOverflow;\n copyMessage?: string;\n copyTooltip?: string;\n actions?: ReactNode;\n className?: string;\n}\n\nexport function CodeBlock({\n code,\n options,\n value,\n onValueChange,\n selector = 'select',\n fileName,\n lang,\n overflow = 'wrap',\n copyMessage,\n copyTooltip,\n actions,\n className,\n}: CodeBlockProps) {\n const hasOptions = options && options.length > 0;\n const useTabs = hasOptions && selector === 'tabs';\n const useSelect = hasOptions && selector === 'select';\n const firstOption = options?.[0];\n const activeValue = value ?? firstOption?.value;\n\n return (\n <figure\n // A scrolling `pre` still reports its longest line as an intrinsic width, which\n // grows every ancestor; containment keeps the block inside the width it is given.\n className={cn(\n 'group relative flex w-full flex-col overflow-hidden rounded-2xl border border-border bg-background [contain:inline-size]',\n className,\n )}\n >\n {useTabs && firstOption && (\n <Tabs defaultTab={firstOption.value} value={activeValue} onValueChange={onValueChange ?? (() => {})}>\n <div className=\"flex items-stretch\">\n <div className=\"min-w-0 flex-1\">\n <TabList>\n {options.map(opt => (\n <Tab key={opt.value} value={opt.value}>\n {opt.label}\n </Tab>\n ))}\n </TabList>\n </div>\n {actions && <div className=\"flex shrink-0 items-center border-b border-border pr-2 pl-3\">{actions}</div>}\n </div>\n </Tabs>\n )}\n\n {useSelect && options && (\n <div className=\"flex items-center border-b border-border px-2 py-1.5\">\n <Select value={activeValue} onValueChange={onValueChange}>\n <SelectTrigger size=\"sm\" variant=\"ghost\" className=\"w-auto\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options.map(opt => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {actions && <div className=\"ml-auto flex items-center\">{actions}</div>}\n </div>\n )}\n\n {!hasOptions && fileName && (\n <div className=\"flex items-center border-b border-border px-4 py-2\">\n <figcaption className=\"font-mono text-caption text-muted-foreground\">{fileName}</figcaption>\n {actions && <div className=\"ml-auto flex items-center\">{actions}</div>}\n </div>\n )}\n\n {!hasOptions && !fileName && actions && (\n <div className=\"flex items-center justify-end border-b border-border px-2 py-1.5\">{actions}</div>\n )}\n\n <div className=\"relative\">\n <Code\n code={code}\n lang={lang}\n className={cn(\n 'px-4 py-3 font-mono text-caption text-foreground',\n overflow === 'scroll' ? 'overflow-x-auto whitespace-pre' : 'break-all whitespace-pre-wrap',\n )}\n />\n <CopyButton\n content={code}\n copyMessage={copyMessage}\n tooltip={copyTooltip}\n size=\"sm\"\n className={cn(\n 'absolute top-2 right-2 opacity-100 group-focus-within:opacity-100 group-hover:opacity-100 pointer-fine:opacity-0',\n transitions.opacity,\n )}\n />\n </div>\n </figure>\n );\n}\n"],"names":["code","jsxs","cn","jsx","Tabs","TabList","Tab","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Code","CopyButton","transitions"],"mappings":"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"}
1
+ {"version":3,"file":"code-block-CAV4Flrx.cjs","sources":["../src/ds/components/CodeBlock/code-block.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { Code } from '../Code/code';\nimport { CopyButton } from '../CopyButton/copy-button';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../Select/select';\nimport { TabList } from '../Tabs/tabs-list';\nimport { Tabs } from '../Tabs/tabs-root';\nimport { Tab } from '../Tabs/tabs-tab';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type CodeBlockSelector = 'select' | 'tabs';\n\nexport type CodeBlockOverflow = 'wrap' | 'scroll';\n\nexport interface CodeBlockOption {\n label: string;\n value: string;\n}\n\nexport interface CodeBlockProps {\n code: string;\n options?: CodeBlockOption[];\n value?: string;\n onValueChange?: (value: string) => void;\n selector?: CodeBlockSelector;\n fileName?: string;\n lang?: string;\n /** `wrap` (default) breaks long lines — best for commands and snippets.\n * `scroll` preserves columns behind a horizontal scroll — best for source code. */\n overflow?: CodeBlockOverflow;\n copyMessage?: string;\n copyTooltip?: string;\n actions?: ReactNode;\n className?: string;\n}\n\nexport function CodeBlock({\n code,\n options,\n value,\n onValueChange,\n selector = 'select',\n fileName,\n lang,\n overflow = 'wrap',\n copyMessage,\n copyTooltip,\n actions,\n className,\n}: CodeBlockProps) {\n const hasOptions = options && options.length > 0;\n const useTabs = hasOptions && selector === 'tabs';\n const useSelect = hasOptions && selector === 'select';\n const firstOption = options?.[0];\n const activeValue = value ?? firstOption?.value;\n\n return (\n <figure\n // A scrolling `pre` still reports its longest line as an intrinsic width, which\n // grows every ancestor; containment keeps the block inside the width it is given.\n className={cn(\n 'group relative flex w-full flex-col overflow-hidden rounded-2xl border border-border bg-background [contain:inline-size]',\n className,\n )}\n >\n {useTabs && firstOption && (\n <Tabs defaultTab={firstOption.value} value={activeValue} onValueChange={onValueChange ?? (() => {})}>\n <div className=\"flex items-stretch\">\n <div className=\"min-w-0 flex-1\">\n <TabList>\n {options.map(opt => (\n <Tab key={opt.value} value={opt.value}>\n {opt.label}\n </Tab>\n ))}\n </TabList>\n </div>\n {actions && <div className=\"flex shrink-0 items-center border-b border-border pr-2 pl-3\">{actions}</div>}\n </div>\n </Tabs>\n )}\n\n {useSelect && options && (\n <div className=\"flex items-center border-b border-border px-2 py-1.5\">\n <Select value={activeValue} onValueChange={onValueChange}>\n <SelectTrigger size=\"sm\" variant=\"ghost\" className=\"w-auto\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options.map(opt => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {actions && <div className=\"ml-auto flex items-center\">{actions}</div>}\n </div>\n )}\n\n {!hasOptions && fileName && (\n <div className=\"flex items-center border-b border-border px-4 py-2\">\n <figcaption className=\"font-mono text-caption text-muted-foreground\">{fileName}</figcaption>\n {actions && <div className=\"ml-auto flex items-center\">{actions}</div>}\n </div>\n )}\n\n {!hasOptions && !fileName && actions && (\n <div className=\"flex items-center justify-end border-b border-border px-2 py-1.5\">{actions}</div>\n )}\n\n <div className=\"relative\">\n <Code\n code={code}\n lang={lang}\n className={cn(\n 'px-4 py-3 font-mono text-caption text-foreground',\n overflow === 'scroll' ? 'overflow-x-auto whitespace-pre' : 'break-all whitespace-pre-wrap',\n )}\n />\n <CopyButton\n content={code}\n copyMessage={copyMessage}\n tooltip={copyTooltip}\n size=\"sm\"\n className={cn(\n 'absolute top-2 right-2 opacity-100 group-focus-within:opacity-100 group-hover:opacity-100 pointer-fine:opacity-0',\n transitions.opacity,\n )}\n />\n </div>\n </figure>\n );\n}\n"],"names":["code","jsxs","cn","jsx","Tabs","TabList","Tab","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Code","CopyButton","transitions"],"mappings":"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"}
@@ -6,15 +6,13 @@ const langMarkdown = require('@codemirror/lang-markdown');
6
6
  const language = require('@codemirror/language');
7
7
  const state = require('@codemirror/state');
8
8
  const view = require('@codemirror/view');
9
- const highlight = require('@lezer/highlight');
10
- const codemirrorThemeDracula = require('@uiw/codemirror-theme-dracula');
11
9
  const CodeMirror = require('@uiw/react-codemirror');
12
10
  const index = require('./index-BM43yKX5.cjs');
13
11
  const React = require('react');
12
+ const highlight = require('./highlight-DfnRU-Am.cjs');
14
13
  const autocomplete = require('@codemirror/autocomplete');
15
14
  const copyButton = require('./copy-button-BC02oZJo.cjs');
16
15
  const fieldControlAria = require('./field-control-aria-WzMGs0A4.cjs');
17
- const themeProvider = require('./theme-provider-DDGNiyY_.cjs');
18
16
  const primitives_formElement = require('./primitives/form-element.cjs.js');
19
17
  const utils_cn = require('./cn-DlOJCxrS.cjs');
20
18
 
@@ -182,94 +180,7 @@ const variableHighlightPlugin = view.ViewPlugin.fromClass(
182
180
  );
183
181
  const variableHighlight = variableHighlightPlugin;
184
182
 
185
- function buildDarkTheme(font) {
186
- const baseTheme = codemirrorThemeDracula.draculaInit({
187
- settings: {
188
- fontFamily: `var(--font-${font})`,
189
- fontSize: "var(--text-body-sm)",
190
- lineHighlight: "transparent",
191
- gutterBackground: "transparent",
192
- gutterForeground: "var(--placeholder)",
193
- background: "transparent",
194
- foreground: "var(--foreground)",
195
- caret: "var(--foreground)"
196
- },
197
- styles: [
198
- { tag: [highlight.tags.className, highlight.tags.propertyName], color: "var(--foreground)" },
199
- { tag: highlight.tags.heading, color: "var(--info-indicator)", fontWeight: "bold" },
200
- {
201
- tag: [highlight.tags.heading1, highlight.tags.heading2, highlight.tags.heading3, highlight.tags.heading4, highlight.tags.heading5, highlight.tags.heading6],
202
- color: "var(--info-indicator)",
203
- fontWeight: "bold"
204
- },
205
- { tag: highlight.tags.emphasis, fontStyle: "italic", color: "var(--foreground)" },
206
- { tag: highlight.tags.strong, fontWeight: "bold", color: "var(--foreground)" },
207
- { tag: highlight.tags.link, color: "var(--info-indicator)", textDecoration: "underline" },
208
- { tag: highlight.tags.url, color: "var(--info-indicator)" },
209
- { tag: highlight.tags.monospace, color: "var(--foreground)" },
210
- { tag: highlight.tags.strikethrough, textDecoration: "line-through" },
211
- { tag: highlight.tags.quote, fontStyle: "italic", color: "var(--placeholder)" }
212
- ]
213
- });
214
- const customLineNumberTheme = view.EditorView.theme({
215
- ".cm-editor": {
216
- backgroundColor: "transparent"
217
- },
218
- ".cm-content": {
219
- color: "var(--foreground)",
220
- caretColor: "var(--foreground)"
221
- },
222
- ".cm-lineNumbers .cm-gutterElement": {
223
- color: "var(--placeholder)"
224
- },
225
- ".cm-activeLineGutter": {
226
- color: "var(--muted-foreground)"
227
- },
228
- ".cm-cursor": {
229
- borderLeftColor: "var(--foreground)"
230
- },
231
- ".cm-selectionBackground, .cm-content ::selection": {
232
- backgroundColor: "var(--info-subtle)"
233
- },
234
- ".cm-tooltip-autocomplete": {
235
- backgroundColor: "var(--background)",
236
- border: "1px solid var(--border)",
237
- borderRadius: "6px",
238
- boxShadow: "var(--elevation-overlay)"
239
- },
240
- ".cm-tooltip-autocomplete > ul": {
241
- fontFamily: "var(--font-mono)"
242
- },
243
- ".cm-completionLabel": {
244
- color: "var(--foreground)"
245
- },
246
- ".cm-completionDetail": {
247
- color: "var(--muted-foreground)",
248
- fontSize: "var(--text-caption)",
249
- marginLeft: "auto",
250
- paddingLeft: "12px"
251
- },
252
- ".cm-completionInfo": {
253
- backgroundColor: "var(--background)",
254
- border: "1px solid var(--border)",
255
- color: "var(--muted-foreground)",
256
- padding: "8px 12px"
257
- },
258
- ".cm-completionIcon": {
259
- display: "none"
260
- },
261
- "ul.cm-completionList li[aria-selected]": {
262
- backgroundColor: "var(--fill-hover)",
263
- color: "var(--foreground)"
264
- },
265
- ".cm-line .cm-variable-highlight": {
266
- color: "var(--warning-foreground) !important",
267
- fontWeight: "500"
268
- }
269
- });
270
- return [baseTheme, customLineNumberTheme];
271
- }
272
- function buildLightTheme(font) {
183
+ function buildCodemirrorTheme(font) {
273
184
  const editorTheme = view.EditorView.theme({
274
185
  "&": {
275
186
  backgroundColor: "transparent",
@@ -340,39 +251,10 @@ function buildLightTheme(font) {
340
251
  fontWeight: "500"
341
252
  }
342
253
  });
343
- const highlightStyle = language.HighlightStyle.define([
344
- { tag: [highlight.tags.comment, highlight.tags.bracket], color: "var(--placeholder)" },
345
- { tag: [highlight.tags.string, highlight.tags.meta, highlight.tags.regexp], color: "var(--syntax-string)" },
346
- { tag: [highlight.tags.atom, highlight.tags.bool, highlight.tags.special(highlight.tags.variableName)], color: "var(--syntax-literal)" },
347
- { tag: [highlight.tags.keyword, highlight.tags.operator, highlight.tags.tagName], color: "var(--syntax-keyword)" },
348
- { tag: [highlight.tags.function(highlight.tags.propertyName), highlight.tags.propertyName], color: "var(--syntax-name)" },
349
- {
350
- tag: [highlight.tags.definition(highlight.tags.variableName), highlight.tags.function(highlight.tags.variableName), highlight.tags.className, highlight.tags.attributeName],
351
- color: "var(--syntax-link)"
352
- },
353
- { tag: [highlight.tags.variableName, highlight.tags.number], color: "var(--syntax-name)" },
354
- { tag: [highlight.tags.name, highlight.tags.quote], color: "var(--syntax-string)" },
355
- { tag: highlight.tags.heading, color: "var(--syntax-link)", fontWeight: "bold" },
356
- {
357
- tag: [highlight.tags.heading1, highlight.tags.heading2, highlight.tags.heading3, highlight.tags.heading4, highlight.tags.heading5, highlight.tags.heading6],
358
- color: "var(--syntax-link)",
359
- fontWeight: "bold"
360
- },
361
- { tag: [highlight.tags.emphasis], fontStyle: "italic", color: "var(--foreground)" },
362
- { tag: [highlight.tags.strong], fontWeight: "bold", color: "var(--foreground)" },
363
- { tag: highlight.tags.link, color: "var(--syntax-link)", textDecoration: "underline" },
364
- { tag: highlight.tags.url, color: "var(--syntax-link)" },
365
- { tag: highlight.tags.monospace, color: "var(--foreground)" },
366
- { tag: highlight.tags.strikethrough, textDecoration: "line-through" },
367
- { tag: [highlight.tags.deleted], color: "var(--syntax-keyword)" },
368
- { tag: highlight.tags.invalid, color: "var(--destructive-foreground)" },
369
- { tag: [highlight.tags.standard(highlight.tags.tagName)], color: "var(--syntax-string)" }
370
- ]);
371
- return [editorTheme, language.syntaxHighlighting(highlightStyle)];
254
+ return [editorTheme, language.syntaxHighlighting(highlight.syntaxHighlighter)];
372
255
  }
373
256
  const useCodemirrorTheme = (font = "mono") => {
374
- const isDark = themeProvider.useTheme().resolvedTheme === "dark";
375
- return React.useMemo(() => isDark ? buildDarkTheme(font) : buildLightTheme(font), [isDark, font]);
257
+ return React.useMemo(() => buildCodemirrorTheme(font), [font]);
376
258
  };
377
259
  const codeEditorVariants = index.cva(
378
260
  utils_cn.cn(
@@ -515,4 +397,4 @@ exports.createVariableAutocomplete = createVariableAutocomplete;
515
397
  exports.flattenSchemaToVariables = flattenSchemaToVariables;
516
398
  exports.useCodemirrorTheme = useCodemirrorTheme;
517
399
  exports.variableHighlight = variableHighlight;
518
- //# sourceMappingURL=code-editor-Bd-Cldem.cjs.map
400
+ //# sourceMappingURL=code-editor-CbyCb7CW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-editor-CbyCb7CW.cjs","sources":["../src/ds/components/CodeEditor/code-languages.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 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 { forwardRef, useMemo } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { codeLanguages } from './code-languages';\nimport { syntaxHighlighter } from './highlight';\nimport { createVariableAutocomplete } from './variable-autocomplete-extension';\nimport { variableHighlight } from './variable-highlight-extension';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { useFieldControlAria } from '@/ds/components/Field/field-control-aria';\nimport { fieldErrorRimWithin, inputSurfaceAndFocusWithinStyle } from '@/ds/primitives/form-element';\nimport type { JsonSchema } from '@/lib/json-schema';\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 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} & 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 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 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\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[] = [...editorFocusExtensions, EditorView.contentAttributes.of(contentAttributes)];\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 return exts;\n }, [\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 && <CopyButton content={formattedCode} className=\"absolute top-2 right-2 z-20\" />}\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 }}\n />\n </div>\n );\n },\n);\n"],"names":["LanguageSupport","StreamLanguage","LanguageDescription","autocompletion","Decoration","MatchDecorator","ViewPlugin","EditorView","syntaxHighlighting","syntaxHighlighter","useMemo","cva","cn","inputSurfaceAndFocusWithinStyle","fieldErrorRimWithin","Prec","forwardRef","useFieldControlAria","jsonLanguage","markdown","markdownLanguage","EditorState","jsxs","jsx","CopyButton"],"mappings":"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"}