@mastra/playground-ui 53.0.0-alpha.8 → 53.0.0

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 (224) hide show
  1. package/dist/{code-DRGJVroV.js → code-D4Vw_fYq.js} +22 -16
  2. package/dist/code-D4Vw_fYq.js.map +1 -0
  3. package/dist/{code-BJMC6T9D.cjs → code-DhrdtZce.cjs} +22 -15
  4. package/dist/code-DhrdtZce.cjs.map +1 -0
  5. package/dist/{code-block-CBJhDEeB.js → code-block-DeksY23p.js} +2 -2
  6. package/dist/{code-block-CBJhDEeB.js.map → code-block-DeksY23p.js.map} +1 -1
  7. package/dist/{code-block-fmv8bHoT.cjs → code-block-DgHrBuR8.cjs} +2 -2
  8. package/dist/{code-block-fmv8bHoT.cjs.map → code-block-DgHrBuR8.cjs.map} +1 -1
  9. package/dist/{code-diff-C-EHXZyK.cjs → code-diff-CHZ3P1ky.cjs} +51 -43
  10. package/dist/code-diff-CHZ3P1ky.cjs.map +1 -0
  11. package/dist/{code-diff-BB4sqHpq.js → code-diff-CIRbnIfl.js} +52 -44
  12. package/dist/code-diff-CIRbnIfl.js.map +1 -0
  13. package/dist/{combobox-BQrlN0eB.cjs → combobox-JNWmgC13.cjs} +8 -3
  14. package/dist/combobox-JNWmgC13.cjs.map +1 -0
  15. package/dist/{combobox-DeeAlYti.js → combobox-nxjXzRWu.js} +8 -3
  16. package/dist/combobox-nxjXzRWu.js.map +1 -0
  17. package/dist/{command-DWFd0d4c.js → command-Be-KrIAX.js} +2 -2
  18. package/dist/{command-DWFd0d4c.js.map → command-Be-KrIAX.js.map} +1 -1
  19. package/dist/{command-CUev1UxH.cjs → command-DsTBCmQq.cjs} +2 -2
  20. package/dist/{command-CUev1UxH.cjs.map → command-DsTBCmQq.cjs.map} +1 -1
  21. package/dist/components/ChatShell.cjs.js +20 -1
  22. package/dist/components/ChatShell.cjs.js.map +1 -1
  23. package/dist/components/ChatShell.es.js +20 -1
  24. package/dist/components/ChatShell.es.js.map +1 -1
  25. package/dist/components/Code.cjs.js +3 -1
  26. package/dist/components/Code.cjs.js.map +1 -1
  27. package/dist/components/Code.es.js +1 -1
  28. package/dist/components/CodeBlock.cjs.js +1 -1
  29. package/dist/components/CodeBlock.es.js +1 -1
  30. package/dist/components/CodeDiff.cjs.js +1 -1
  31. package/dist/components/CodeDiff.es.js +1 -1
  32. package/dist/components/CodeEditor.cjs.js +2 -1
  33. package/dist/components/CodeEditor.cjs.js.map +1 -1
  34. package/dist/components/CodeEditor.es.js +1 -1
  35. package/dist/components/Combobox.cjs.js +1 -1
  36. package/dist/components/Combobox.es.js +1 -1
  37. package/dist/components/Command.cjs.js +1 -1
  38. package/dist/components/Command.es.js +1 -1
  39. package/dist/components/CommandPalette.cjs.js +1 -1
  40. package/dist/components/CommandPalette.es.js +1 -1
  41. package/dist/components/Comment.cjs.js +2 -2
  42. package/dist/components/Comment.cjs.js.map +1 -1
  43. package/dist/components/Comment.es.js +2 -2
  44. package/dist/components/Comment.es.js.map +1 -1
  45. package/dist/components/DataCodeSection.cjs.js +1 -1
  46. package/dist/components/DataCodeSection.es.js +1 -1
  47. package/dist/components/DataPanel.cjs.js +1 -1
  48. package/dist/components/DataPanel.es.js +1 -1
  49. package/dist/components/Dialog.cjs.js +181 -2
  50. package/dist/components/Dialog.cjs.js.map +1 -1
  51. package/dist/components/Dialog.es.js +183 -1
  52. package/dist/components/Dialog.es.js.map +1 -1
  53. package/dist/components/HorizontalBars.cjs.js +1 -1
  54. package/dist/components/HorizontalBars.es.js +1 -1
  55. package/dist/components/IntegrationDialog.cjs.js +105 -0
  56. package/dist/components/IntegrationDialog.cjs.js.map +1 -0
  57. package/dist/components/IntegrationDialog.d.ts +2 -0
  58. package/dist/components/IntegrationDialog.es.js +101 -0
  59. package/dist/components/IntegrationDialog.es.js.map +1 -0
  60. package/dist/components/LogsDataList.cjs.js +0 -1
  61. package/dist/components/LogsDataList.cjs.js.map +1 -1
  62. package/dist/components/LogsDataList.es.js +0 -1
  63. package/dist/components/LogsDataList.es.js.map +1 -1
  64. package/dist/components/MainHeader.cjs.js +1 -1
  65. package/dist/components/MainHeader.cjs.js.map +1 -1
  66. package/dist/components/MainHeader.es.js +1 -1
  67. package/dist/components/MainHeader.es.js.map +1 -1
  68. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  69. package/dist/components/MarkdownRenderer.es.js +1 -1
  70. package/dist/components/PropertyFilter.cjs.js +1 -1
  71. package/dist/components/PropertyFilter.es.js +1 -1
  72. package/dist/components/ThreadRail.cjs.js +19 -0
  73. package/dist/components/ThreadRail.cjs.js.map +1 -1
  74. package/dist/components/ThreadRail.es.js +19 -1
  75. package/dist/components/ThreadRail.es.js.map +1 -1
  76. package/dist/components/ai/plan.cjs.js +1 -1
  77. package/dist/components/ai/plan.es.js +1 -1
  78. package/dist/components/ai/tool-call.cjs.js +165 -0
  79. package/dist/components/ai/tool-call.cjs.js.map +1 -1
  80. package/dist/components/ai/tool-call.es.js +159 -3
  81. package/dist/components/ai/tool-call.es.js.map +1 -1
  82. package/dist/{data-code-section-Dn9smaz4.cjs → data-code-section-B_lg_J_0.cjs} +34 -5
  83. package/dist/data-code-section-B_lg_J_0.cjs.map +1 -0
  84. package/dist/{data-code-section-DN2yPgEz.js → data-code-section-Cm_W_XhO.js} +36 -7
  85. package/dist/data-code-section-Cm_W_XhO.js.map +1 -0
  86. package/dist/{data-panel-DEatwExN.cjs → data-panel-Cv9j_IGQ.cjs} +2 -2
  87. package/dist/{data-panel-DEatwExN.cjs.map → data-panel-Cv9j_IGQ.cjs.map} +1 -1
  88. package/dist/{data-panel-2Da0Utgy.js → data-panel-DXxeSnL1.js} +2 -2
  89. package/dist/{data-panel-2Da0Utgy.js.map → data-panel-DXxeSnL1.js.map} +1 -1
  90. package/dist/dialog-CZMPDVUj.js +259 -0
  91. package/dist/dialog-CZMPDVUj.js.map +1 -0
  92. package/dist/dialog-D-7Hkb3j.cjs +293 -0
  93. package/dist/dialog-D-7Hkb3j.cjs.map +1 -0
  94. package/dist/domains/memory/components/observation-detail-view.cjs.js +1 -1
  95. package/dist/domains/memory/components/observation-detail-view.es.js +1 -1
  96. package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +1 -1
  97. package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +1 -1
  98. package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +1 -1
  99. package/dist/domains/metrics/components/traces-volume-card-view.es.js +1 -1
  100. package/dist/domains/traces/components/span-data-panel-view.cjs.js +61 -105
  101. package/dist/domains/traces/components/span-data-panel-view.cjs.js.map +1 -1
  102. package/dist/domains/traces/components/span-data-panel-view.es.js +62 -106
  103. package/dist/domains/traces/components/span-data-panel-view.es.js.map +1 -1
  104. package/dist/domains/traces/components/span-summary-description.cjs.js +62 -0
  105. package/dist/domains/traces/components/span-summary-description.cjs.js.map +1 -0
  106. package/dist/domains/traces/components/span-summary-description.d.ts +2 -0
  107. package/dist/domains/traces/components/span-summary-description.es.js +58 -0
  108. package/dist/domains/traces/components/span-summary-description.es.js.map +1 -0
  109. package/dist/domains/traces/components/timeline-expand-col.cjs.js +1 -1
  110. package/dist/domains/traces/components/timeline-expand-col.cjs.js.map +1 -1
  111. package/dist/domains/traces/components/timeline-expand-col.es.js +1 -1
  112. package/dist/domains/traces/components/timeline-expand-col.es.js.map +1 -1
  113. package/dist/domains/traces/components/timeline-name-col.cjs.js +1 -1
  114. package/dist/domains/traces/components/timeline-name-col.cjs.js.map +1 -1
  115. package/dist/domains/traces/components/timeline-name-col.es.js +1 -1
  116. package/dist/domains/traces/components/timeline-name-col.es.js.map +1 -1
  117. package/dist/domains/traces/components/timeline-timing-col.cjs.js +1 -1
  118. package/dist/domains/traces/components/timeline-timing-col.cjs.js.map +1 -1
  119. package/dist/domains/traces/components/timeline-timing-col.es.js +1 -1
  120. package/dist/domains/traces/components/timeline-timing-col.es.js.map +1 -1
  121. package/dist/domains/traces/components/trace-columns-menu.cjs.js +1 -1
  122. package/dist/domains/traces/components/trace-columns-menu.es.js +1 -1
  123. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +2 -2
  124. package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
  125. package/dist/domains/traces/components/trace-data-panel-view.es.js +2 -2
  126. package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
  127. package/dist/domains/traces/components/traces-toolbar.cjs.js +1 -5
  128. package/dist/domains/traces/components/traces-toolbar.cjs.js.map +1 -1
  129. package/dist/domains/traces/components/traces-toolbar.es.js +1 -5
  130. package/dist/domains/traces/components/traces-toolbar.es.js.map +1 -1
  131. package/dist/domains/traces/hooks/use-branch.cjs.js +2 -6
  132. package/dist/domains/traces/hooks/use-branch.cjs.js.map +1 -1
  133. package/dist/domains/traces/hooks/use-branch.es.js +2 -6
  134. package/dist/domains/traces/hooks/use-branch.es.js.map +1 -1
  135. package/dist/domains/traces/hooks/use-download-trace-json.cjs.js +4 -1
  136. package/dist/domains/traces/hooks/use-download-trace-json.cjs.js.map +1 -1
  137. package/dist/domains/traces/hooks/use-download-trace-json.es.js +4 -1
  138. package/dist/domains/traces/hooks/use-download-trace-json.es.js.map +1 -1
  139. package/dist/domains/traces/hooks/use-trace-filter-persistence.cjs.js +11 -18
  140. package/dist/domains/traces/hooks/use-trace-filter-persistence.cjs.js.map +1 -1
  141. package/dist/domains/traces/hooks/use-trace-filter-persistence.es.js +13 -20
  142. package/dist/domains/traces/hooks/use-trace-filter-persistence.es.js.map +1 -1
  143. package/dist/domains/traces/hooks/use-trace-spans.cjs.js +10 -7
  144. package/dist/domains/traces/hooks/use-trace-spans.cjs.js.map +1 -1
  145. package/dist/domains/traces/hooks/use-trace-spans.es.js +10 -7
  146. package/dist/domains/traces/hooks/use-trace-spans.es.js.map +1 -1
  147. package/dist/domains/traces/trace-filters.cjs.js +5 -5
  148. package/dist/domains/traces/trace-filters.cjs.js.map +1 -1
  149. package/dist/domains/traces/trace-filters.es.js +5 -5
  150. package/dist/domains/traces/trace-filters.es.js.map +1 -1
  151. package/dist/domains/traces/utils/span-utils.cjs.js +6 -0
  152. package/dist/domains/traces/utils/span-utils.cjs.js.map +1 -1
  153. package/dist/domains/traces/utils/span-utils.es.js +6 -1
  154. package/dist/domains/traces/utils/span-utils.es.js.map +1 -1
  155. package/dist/ee/signals/components/entity-index-list.cjs.js +0 -1
  156. package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
  157. package/dist/ee/signals/components/entity-index-list.es.js +0 -1
  158. package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
  159. package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +1 -1
  160. package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +1 -1
  161. package/dist/{highlight-CSJjjoqh.js → highlight-BmpoELR4.js} +6 -2
  162. package/dist/{highlight-CSJjjoqh.js.map → highlight-BmpoELR4.js.map} +1 -1
  163. package/dist/{highlight-CEt2vhD8.cjs → highlight-DK1dn-Fh.cjs} +6 -1
  164. package/dist/{highlight-CEt2vhD8.cjs.map → highlight-DK1dn-Fh.cjs.map} +1 -1
  165. package/dist/{horizontal-bars-DZ5J4TKv.js → horizontal-bars-CyP-B-BX.js} +37 -4
  166. package/dist/horizontal-bars-CyP-B-BX.js.map +1 -0
  167. package/dist/{horizontal-bars-CE1O-Y6G.cjs → horizontal-bars-Dgq3PYsg.cjs} +37 -4
  168. package/dist/horizontal-bars-Dgq3PYsg.cjs.map +1 -0
  169. package/dist/{markdown-renderer-DiJBbnYG.js → markdown-renderer-CaFpZTFS.js} +2 -2
  170. package/dist/{markdown-renderer-DiJBbnYG.js.map → markdown-renderer-CaFpZTFS.js.map} +1 -1
  171. package/dist/{markdown-renderer-DGIzNAQY.cjs → markdown-renderer-GVtZLunG.cjs} +2 -2
  172. package/dist/{markdown-renderer-DGIzNAQY.cjs.map → markdown-renderer-GVtZLunG.cjs.map} +1 -1
  173. package/dist/src/domains/traces/components/span-summary-description.d.ts +10 -0
  174. package/dist/src/domains/traces/components/traces-toolbar.d.ts +1 -5
  175. package/dist/src/domains/traces/hooks/index.d.ts +1 -1
  176. package/dist/src/domains/traces/hooks/use-trace-filter-persistence.d.ts +5 -18
  177. package/dist/src/domains/traces/hooks/use-trace-spans.d.ts +3 -1
  178. package/dist/src/domains/traces/trace-filters.d.ts +4 -3
  179. package/dist/src/domains/traces/utils/span-utils.d.ts +2 -0
  180. package/dist/src/ds/components/ChatShell/chat-shell.d.ts +19 -2
  181. package/dist/src/ds/components/ChatShell/index.d.ts +3 -2
  182. package/dist/src/ds/components/Code/index.d.ts +1 -0
  183. package/dist/src/ds/components/Code/use-highlight.d.ts +10 -0
  184. package/dist/src/ds/components/CodeDiff/code-diff.stories.d.ts +2 -0
  185. package/dist/src/ds/components/CodeEditor/highlight.d.ts +1 -0
  186. package/dist/src/ds/components/CodeEditor/index.d.ts +1 -1
  187. package/dist/src/ds/components/Combobox/combobox.d.ts +3 -1
  188. package/dist/src/ds/components/DataCodeSection/data-code-section.d.ts +9 -1
  189. package/dist/src/ds/components/DataCodeSection/index.d.ts +1 -1
  190. package/dist/src/ds/components/Dialog/dialog-action.d.ts +9 -0
  191. package/dist/src/ds/components/Dialog/dialog-context.d.ts +16 -0
  192. package/dist/src/ds/components/Dialog/dialog-new-variant.stories.d.ts +64 -0
  193. package/dist/src/ds/components/Dialog/dialog.d.ts +15 -6
  194. package/dist/src/ds/components/Dialog/index.d.ts +2 -0
  195. package/dist/src/ds/components/HorizontalBars/horizontal-bars.stories.d.ts +2 -0
  196. package/dist/src/ds/components/IntegrationDialog/__fixtures__/integrations-catalog.d.ts +2 -0
  197. package/dist/src/ds/components/IntegrationDialog/index.d.ts +2 -0
  198. package/dist/src/ds/components/IntegrationDialog/integration-dialog.d.ts +28 -0
  199. package/dist/src/ds/components/IntegrationDialog/integration-dialog.stories.d.ts +24 -0
  200. package/dist/src/ds/components/ThreadRail/index.d.ts +1 -0
  201. package/dist/src/ds/components/ThreadRail/turn-groups.d.ts +19 -0
  202. package/dist/src/ds/components/ai/tool-call/ansi.d.ts +2 -0
  203. package/dist/src/ds/components/ai/tool-call/group-consecutive.d.ts +17 -0
  204. package/dist/src/ds/components/ai/tool-call/index.d.ts +4 -0
  205. package/dist/src/ds/components/ai/tool-call/tool-call-edit.d.ts +4 -0
  206. package/dist/src/ds/components/ai/tool-call/tool-call-group.d.ts +14 -0
  207. package/dist/src/ds/components/ai/tool-call/tool-call.d.ts +4 -0
  208. package/dist/src/ds/components/ai/tool-call/tool-presentation.d.ts +10 -0
  209. package/dist/style.css +149 -3
  210. package/package.json +8 -8
  211. package/dist/code-BJMC6T9D.cjs.map +0 -1
  212. package/dist/code-DRGJVroV.js.map +0 -1
  213. package/dist/code-diff-BB4sqHpq.js.map +0 -1
  214. package/dist/code-diff-C-EHXZyK.cjs.map +0 -1
  215. package/dist/combobox-BQrlN0eB.cjs.map +0 -1
  216. package/dist/combobox-DeeAlYti.js.map +0 -1
  217. package/dist/data-code-section-DN2yPgEz.js.map +0 -1
  218. package/dist/data-code-section-Dn9smaz4.cjs.map +0 -1
  219. package/dist/dialog-CESxLg8S.js +0 -76
  220. package/dist/dialog-CESxLg8S.js.map +0 -1
  221. package/dist/dialog-K0q0KOOW.cjs +0 -107
  222. package/dist/dialog-K0q0KOOW.cjs.map +0 -1
  223. package/dist/horizontal-bars-CE1O-Y6G.cjs.map +0 -1
  224. package/dist/horizontal-bars-DZ5J4TKv.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CodeEditor.cjs.js","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 */\nfunction 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 // Check if }} already follows the cursor\n const afterCursor = view.state.sliceDoc(to, to + 2);\n const hasClosingBraces = afterCursor === '}}';\n\n const insertText = hasClosingBraces ? completion.label : `${completion.label}}}`;\n\n view.dispatch({\n changes: { from, to, 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 { HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { EditorState, Prec } from '@codemirror/state';\nimport type { Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { tags as t } from '@lezer/highlight';\nimport { draculaInit } from '@uiw/codemirror-theme-dracula';\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 { createVariableAutocomplete } from './variable-autocomplete-extension';\nimport { variableHighlight } from './variable-highlight-extension';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { useTheme } from '@/ds/components/ThemeProvider';\nimport type { JsonSchema } from '@/lib/json-schema';\nimport { cn } from '@/lib/utils';\n\nexport type CodeEditorLanguage = 'json' | 'markdown';\n\n/** Original dark theme — draculaInit + custom overrides. Unchanged from before light mode work. */\nfunction buildDarkTheme(): Extension {\n const baseTheme = draculaInit({\n settings: {\n fontFamily: 'var(--font-mono)',\n fontSize: '0.8rem',\n lineHighlight: 'transparent',\n gutterBackground: 'transparent',\n gutterForeground: 'var(--neutral2)',\n background: 'transparent',\n foreground: 'var(--neutral6)',\n caret: 'var(--neutral6)',\n },\n styles: [\n { tag: [t.className, t.propertyName], color: 'var(--neutral6)' },\n { tag: t.heading, color: 'var(--accent3)', fontWeight: 'bold' },\n {\n tag: [t.heading1, t.heading2, t.heading3, t.heading4, t.heading5, t.heading6],\n color: 'var(--accent3)',\n fontWeight: 'bold',\n },\n { tag: t.emphasis, fontStyle: 'italic', color: 'var(--neutral6)' },\n { tag: t.strong, fontWeight: 'bold', color: 'var(--neutral6)' },\n { tag: t.link, color: 'var(--accent3)', textDecoration: 'underline' },\n { tag: t.url, color: 'var(--accent3)' },\n { tag: t.monospace, color: 'var(--neutral6)' },\n { tag: t.strikethrough, textDecoration: 'line-through' },\n { tag: t.quote, fontStyle: 'italic', color: 'var(--neutral2)' },\n ],\n });\n\n const customLineNumberTheme = EditorView.theme({\n '.cm-editor': {\n backgroundColor: 'transparent',\n },\n '.cm-content': {\n color: 'var(--neutral6)',\n caretColor: 'var(--neutral6)',\n },\n '.cm-lineNumbers .cm-gutterElement': {\n color: 'var(--neutral2)',\n },\n '.cm-activeLineGutter': {\n color: 'var(--neutral3)',\n },\n '.cm-cursor': {\n borderLeftColor: 'var(--neutral6)',\n },\n '.cm-selectionBackground, .cm-content ::selection': {\n backgroundColor: 'color-mix(in srgb, var(--accent3) 22%, transparent)',\n },\n '.cm-tooltip-autocomplete': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n borderRadius: '6px',\n boxShadow: '0 8px 16px rgba(0, 0, 0, 0.2)',\n },\n '.cm-tooltip-autocomplete > ul': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-completionLabel': {\n color: 'var(--neutral6)',\n },\n '.cm-completionDetail': {\n color: 'var(--neutral3)',\n fontSize: '0.7rem',\n marginLeft: 'auto',\n paddingLeft: '12px',\n },\n '.cm-completionInfo': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n color: 'var(--neutral3)',\n padding: '8px 12px',\n },\n '.cm-completionIcon': {\n display: 'none',\n },\n 'ul.cm-completionList li[aria-selected]': {\n backgroundColor: 'var(--surface4)',\n color: 'var(--neutral6)',\n },\n '.cm-line .cm-variable-highlight': {\n color: 'var(--accent6) !important',\n fontWeight: '500',\n },\n });\n\n return [baseTheme, customLineNumberTheme];\n}\n\nfunction buildLightTheme(): Extension {\n const editorTheme = EditorView.theme({\n '&': {\n backgroundColor: 'transparent',\n color: 'var(--neutral6)',\n fontSize: '0.8rem',\n },\n '&.cm-editor .cm-scroller': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-gutters': {\n backgroundColor: 'transparent',\n color: 'var(--neutral2)',\n borderRight: 'none',\n },\n '.cm-content': {\n color: 'var(--neutral6)',\n caretColor: 'var(--neutral6)',\n },\n '.cm-activeLine': {\n backgroundColor: 'transparent',\n },\n '.cm-lineNumbers .cm-gutterElement': {\n color: 'var(--neutral2)',\n },\n '.cm-activeLineGutter': {\n backgroundColor: 'transparent',\n color: 'var(--neutral3)',\n },\n '.cm-cursor, .cm-dropCursor': {\n borderLeftColor: 'var(--neutral6)',\n },\n '&.cm-focused .cm-selectionBackground, & .cm-line::selection, & .cm-selectionLayer .cm-selectionBackground, .cm-content ::selection':\n {\n background: 'color-mix(in srgb, var(--accent3) 22%, transparent) !important',\n },\n '.cm-tooltip-autocomplete': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n borderRadius: '6px',\n boxShadow: '0 8px 16px rgba(0, 0, 0, 0.2)',\n },\n '.cm-tooltip-autocomplete > ul': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-completionLabel': {\n color: 'var(--neutral6)',\n },\n '.cm-completionDetail': {\n color: 'var(--neutral3)',\n fontSize: '0.7rem',\n marginLeft: 'auto',\n paddingLeft: '12px',\n },\n '.cm-completionInfo': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n color: 'var(--neutral3)',\n padding: '8px 12px',\n },\n '.cm-completionIcon': {\n display: 'none',\n },\n 'ul.cm-completionList li[aria-selected]': {\n backgroundColor: 'var(--surface4)',\n color: 'var(--neutral6)',\n },\n '.cm-line .cm-variable-highlight': {\n color: 'var(--accent6) !important',\n fontWeight: '500',\n },\n });\n\n const highlightStyle = HighlightStyle.define([\n { tag: [t.comment, t.bracket], color: 'var(--neutral2)' },\n { tag: [t.string, t.meta, t.regexp], color: 'var(--accent1)' },\n { tag: [t.atom, t.bool, t.special(t.variableName)], color: 'var(--accent6)' },\n { tag: [t.keyword, t.operator, t.tagName], color: 'var(--accent2)' },\n { tag: [t.function(t.propertyName), t.propertyName], color: 'var(--accent5)' },\n {\n tag: [t.definition(t.variableName), t.function(t.variableName), t.className, t.attributeName],\n color: 'var(--accent3)',\n },\n { tag: [t.variableName, t.number], color: 'var(--accent5)' },\n { tag: [t.name, t.quote], color: 'var(--accent1)' },\n { tag: t.heading, color: 'var(--accent3)', fontWeight: 'bold' },\n {\n tag: [t.heading1, t.heading2, t.heading3, t.heading4, t.heading5, t.heading6],\n color: 'var(--accent3)',\n fontWeight: 'bold',\n },\n { tag: [t.emphasis], fontStyle: 'italic', color: 'var(--neutral6)' },\n { tag: [t.strong], fontWeight: 'bold', color: 'var(--neutral6)' },\n { tag: t.link, color: 'var(--accent3)', textDecoration: 'underline' },\n { tag: t.url, color: 'var(--accent3)' },\n { tag: t.monospace, color: 'var(--neutral6)' },\n { tag: t.strikethrough, textDecoration: 'line-through' },\n { tag: [t.deleted], color: 'var(--accent2)' },\n { tag: t.invalid, color: 'var(--error)' },\n { tag: [t.standard(t.tagName)], color: 'var(--accent1)' },\n ]);\n\n return [editorTheme, syntaxHighlighting(highlightStyle)];\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 = (): Extension => {\n const isDark = useTheme().resolvedTheme === 'dark';\n return useMemo(() => (isDark ? buildDarkTheme() : buildLightTheme()), [isDark]);\n};\n\nconst codeEditorVariants = cva(\n cn(\n 'relative overflow-hidden font-mono outline-hidden focus-within:outline-hidden focus:outline-hidden',\n 'duration-normal transition-colors ease-out-custom',\n ),\n {\n variants: {\n variant: {\n default: 'rounded-md border border-border1 bg-surface3 p-1 focus-within:border-neutral6/20',\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\nexport type CodeEditorProps = {\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 highlightVariables = false,\n placeholder,\n schema,\n autoFocus,\n lineNumbers = true,\n lineWrapping = true,\n editable,\n variant,\n ...props\n },\n ref,\n ) => {\n const theme = useCodemirrorTheme();\n const formattedCode = data ? JSON.stringify(data, null, 2) : (value ?? '');\n\n const extensions = useMemo(() => {\n const exts: Extension[] = [...editorFocusExtensions];\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 }, [language, highlightVariables, schema, editable, lineWrapping]);\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=\"Code editor\"\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","draculaInit","t","EditorView","HighlightStyle","syntaxHighlighting","useTheme","useMemo","cva","cn","Prec","forwardRef","jsonLanguage","markdown","markdownLanguage","EditorState","jsxs","jsx","CopyButton","CodeMirror"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAEA,SAAS,OAAO,MAAA,EAAqD;AACnE,EAAA,OAAO,IAAIA,wBAAA,CAAgBC,uBAAA,CAAe,MAAA,CAAO,MAAM,CAAC,CAAA;AAC1D;AAQO,MAAM,aAAA,GAAgB;AAAA,EAC3BC,6BAAoB,EAAA,CAAG;AAAA,IACrB,IAAA,EAAM,YAAA;AAAA,IACN,KAAA,EAAO,CAAC,YAAA,EAAc,IAAA,EAAM,MAAM,CAAA;AAAA,IAClC,UAAA,EAAY,CAAC,IAAA,EAAM,KAAA,EAAO,KAAK,CAAA;AAAA,IAC/B,IAAA,GAAO;AACL,MAAA,OAAO,OAAO,6BAA6B,CAAA,CAAE,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,CAAA;AAAA,IACvE;AAAA,GACD,CAAA;AAAA,EACDA,6BAAoB,EAAA,CAAG;AAAA,IACrB,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,CAAC,OAAO,CAAA;AAAA,IACf,UAAA,EAAY,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IAC1B,IAAA,GAAO;AACL,MAAA,OAAO,OAAO,uBAAuB,CAAA,CAAE,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAA;AAAA,IAC3D;AAAA,GACD,CAAA;AAAA,EACDA,6BAAoB,EAAA,CAAG;AAAA,IACrB,IAAA,EAAM,KAAA;AAAA,IACN,UAAA,EAAY,CAAC,KAAK,CAAA;AAAA,IAClB,IAAA,GAAO;AACL,MAAA,OAAO,OAAO,6BAA6B,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,UAAA,CAAW,EAAE,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA;AAAA,IACpF;AAAA,GACD,CAAA;AAAA,EACDA,6BAAoB,EAAA,CAAG;AAAA,IACrB,IAAA,EAAM,UAAA;AAAA,IACN,UAAA,EAAY,CAAC,IAAA,EAAM,UAAA,EAAY,KAAK,CAAA;AAAA,IACpC,IAAA,GAAO;AACL,MAAA,OAAO,OAAO,2BAA2B,CAAA,CAAE,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU,CAAA;AAAA,IACnE;AAAA,GACD,CAAA;AAAA,EACDA,6BAAoB,EAAA,CAAG;AAAA,IACrB,IAAA,EAAM,KAAA;AAAA,IACN,UAAA,EAAY,CAAC,KAAK,CAAA;AAAA,IAClB,IAAA,GAAO;AACL,MAAA,OAAO,OAAO,6BAA6B,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,UAAA,CAAW,EAAE,GAAA,EAAK,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,CAAC,CAAA;AAAA,IACtG;AAAA,GACD,CAAA;AAAA,EACDA,6BAAoB,EAAA,CAAG;AAAA,IACrB,IAAA,EAAM,YAAA;AAAA,IACN,KAAA,EAAO,CAAC,IAAI,CAAA;AAAA,IACZ,UAAA,EAAY,CAAC,IAAA,EAAM,KAAA,EAAO,KAAK,CAAA;AAAA,IAC/B,IAAA,GAAO;AACL,MAAA,OAAO,OAAO,6BAA6B,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,UAAA,CAAW,EAAE,UAAA,EAAY,IAAA,EAAM,CAAC,CAAA;AAAA,IAC3F;AAAA,GACD,CAAA;AAAA,EACDA,6BAAoB,EAAA,CAAG;AAAA,IACrB,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,CAAC,MAAA,EAAQ,IAAA,EAAM,KAAK,CAAA;AAAA,IAC3B,UAAA,EAAY,CAAC,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,IAChC,QAAA,EAAU,YAAA;AAAA,IACV,IAAA,GAAO;AACL,MAAA,OAAO,OAAO,qCAAqC,CAAA,CAAE,IAAA,CAAK,OAAK,MAAA,CAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IAChF;AAAA,GACD;AACH;;ACnBO,SAAS,wBAAA,CAAyB,MAAA,EAAgC,QAAA,GAAW,CAAA,EAAyB;AAC3G,EAAA,IAAI,CAAC,QAAQ,UAAA,EAAY;AACvB,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,UAAgC,EAAC;AAEvC,EAAA,SAAS,eAAA,CAAgB,QAAA,EAA8B,IAAA,EAAc,KAAA,EAAqB;AACxF,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,GAAI,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,GAAI,QAAA,CAAS,IAAA;AAEjF,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,IAAA;AAAA,MACA,KAAA,EAAO,IAAA;AAAA,MACP,WAAA,EAAa,QAAA,CAAS,WAAA,IAAe,QAAA,CAAS,KAAA;AAAA,MAC9C;AAAA,KACD,CAAA;AAGD,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,KAAA,MAAW,CAAC,KAAK,cAAc,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,EAAG;AACvE,QAAA,eAAA,CAAgB,gBAAgB,CAAA,EAAG,IAAI,IAAI,GAAG,CAAA,CAAA,EAAI,QAAQ,CAAC,CAAA;AAAA,MAC7D;AAAA,IACF;AAGA,IAAA,IAAI,QAAA,CAAS,OAAO,UAAA,EAAY;AAE9B,MAAA,KAAA,MAAW,CAAC,KAAK,YAAY,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,UAAU,CAAA,EAAG;AAC3E,QAAA,eAAA,CAAgB,cAAc,CAAA,EAAG,IAAI,MAAM,GAAG,CAAA,CAAA,EAAI,QAAQ,CAAC,CAAA;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,KAAK,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AAC/D,IAAA,eAAA,CAAgB,QAAA,EAAU,KAAK,CAAC,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,OAAA;AACT;;AC/DO,SAAS,2BAA2B,MAAA,EAA2C;AACpF,EAAA,MAAM,SAAA,GAAY,yBAAyB,MAAM,CAAA;AAEjD,EAAA,OAAOC,2BAAA,CAAe;AAAA,IACpB,QAAA,EAAU,CAAC,8BAAA,CAA+B,SAAS,CAAC,CAAA;AAAA,IACpD,aAAA,EAAe,IAAA;AAAA,IACf,WAAA,EAAa,IAAA;AAAA,IACb,KAAA,EAAO;AAAA,GACR,CAAA;AACH;AAKA,SAAS,+BACP,SAAA,EACyD;AACzD,EAAA,OAAO,CAAC,OAAA,KAAwD;AAE9D,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,GAAA,GAAM,EAAE,CAAA,EAAG,OAAA,CAAQ,GAAG,CAAA;AACtF,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,KAAA,CAAM,4BAA4B,CAAA;AAE7D,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAC3B,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,GAAM,MAAA,CAAO,MAAA;AAGtC,IAAA,MAAM,iBAAA,GAAoB,MAAA,GACtB,SAAA,CAAU,MAAA,CAAO,OAAK,CAAA,CAAE,IAAA,CAAK,WAAA,EAAY,CAAE,UAAA,CAAW,MAAA,CAAO,WAAA,EAAa,CAAC,CAAA,GAC3E,SAAA;AAEJ,IAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AAClC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAA,GAA4B,iBAAA,CAAkB,GAAA,CAAI,CAAA,QAAA,MAAa;AAAA,MACnE,OAAO,QAAA,CAAS,IAAA;AAAA,MAChB,cAAc,QAAA,CAAS,IAAA;AAAA,MACvB,QAAQ,QAAA,CAAS,IAAA;AAAA,MACjB,MAAM,QAAA,CAAS,WAAA;AAAA,MACf,KAAA,EAAO,CAAC,IAAA,EAAM,UAAA,EAAY,MAAM,EAAA,KAAO;AAErC,QAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,EAAA,EAAI,KAAK,CAAC,CAAA;AAClD,QAAA,MAAM,mBAAmB,WAAA,KAAgB,IAAA;AAEzC,QAAA,MAAM,aAAa,gBAAA,GAAmB,UAAA,CAAW,KAAA,GAAQ,CAAA,EAAG,WAAW,KAAK,CAAA,EAAA,CAAA;AAE5E,QAAA,IAAA,CAAK,QAAA,CAAS;AAAA,UACZ,OAAA,EAAS,EAAE,IAAA,EAAM,EAAA,EAAI,QAAQ,UAAA,EAAW;AAAA,UACxC,SAAA,EAAW,EAAE,MAAA,EAAQ,IAAA,GAAO,WAAW,MAAA;AAAO,SAC/C,CAAA;AAAA,MACH;AAAA,KACF,CAAE,CAAA;AAEF,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,WAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACZ;AAAA,EACF,CAAA;AACF;;ACpFO,MAAM,gBAAA,GAAmB;AAEhC,MAAM,kBAAA,GAAqBC,gBAAW,IAAA,CAAK;AAAA,EACzC,KAAA,EAAO;AACT,CAAC,CAAA;AAED,MAAM,eAAA,GAAkB,IAAIC,mBAAA,CAAe;AAAA,EACzC,MAAA,EAAQ,gBAAA;AAAA,EACR,YAAY,MAAM;AACpB,CAAC,CAAA;AAED,MAAM,0BAA0BC,eAAA,CAAW,SAAA;AAAA,EACzC,MAAM;AAAA,IACJ,WAAA;AAAA,IAEA,YAAY,IAAA,EAAkB;AAC5B,MAAA,IAAA,CAAK,WAAA,GAAc,eAAA,CAAgB,UAAA,CAAW,IAAI,CAAA;AAAA,IACpD;AAAA,IAEA,OAAO,MAAA,EAAoB;AACzB,MAAA,IAAA,CAAK,WAAA,GAAc,eAAA,CAAgB,UAAA,CAAW,MAAA,EAAQ,KAAK,WAAW,CAAA;AAAA,IACxE;AAAA,GACF;AAAA,EACA;AAAA,IACE,WAAA,EAAa,OAAK,CAAA,CAAE;AAAA;AAExB,CAAA;AAMO,MAAM,iBAAA,GAAoB;;ACdjC,SAAS,cAAA,GAA4B;AACnC,EAAA,MAAM,YAAYC,kCAAA,CAAY;AAAA,IAC5B,QAAA,EAAU;AAAA,MACR,UAAA,EAAY,kBAAA;AAAA,MACZ,QAAA,EAAU,QAAA;AAAA,MACV,aAAA,EAAe,aAAA;AAAA,MACf,gBAAA,EAAkB,aAAA;AAAA,MAClB,gBAAA,EAAkB,iBAAA;AAAA,MAClB,UAAA,EAAY,aAAA;AAAA,MACZ,UAAA,EAAY,iBAAA;AAAA,MACZ,KAAA,EAAO;AAAA,KACT;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,EAAE,KAAK,CAACC,gBAAA,CAAE,WAAWA,gBAAA,CAAE,YAAY,CAAA,EAAG,KAAA,EAAO,iBAAA,EAAkB;AAAA,MAC/D,EAAE,GAAA,EAAKA,gBAAA,CAAE,SAAS,KAAA,EAAO,gBAAA,EAAkB,YAAY,MAAA,EAAO;AAAA,MAC9D;AAAA,QACE,GAAA,EAAK,CAACA,gBAAA,CAAE,QAAA,EAAUA,gBAAA,CAAE,QAAA,EAAUA,gBAAA,CAAE,QAAA,EAAUA,gBAAA,CAAE,QAAA,EAAUA,gBAAA,CAAE,QAAA,EAAUA,iBAAE,QAAQ,CAAA;AAAA,QAC5E,KAAA,EAAO,gBAAA;AAAA,QACP,UAAA,EAAY;AAAA,OACd;AAAA,MACA,EAAE,GAAA,EAAKA,gBAAA,CAAE,UAAU,SAAA,EAAW,QAAA,EAAU,OAAO,iBAAA,EAAkB;AAAA,MACjE,EAAE,GAAA,EAAKA,gBAAA,CAAE,QAAQ,UAAA,EAAY,MAAA,EAAQ,OAAO,iBAAA,EAAkB;AAAA,MAC9D,EAAE,GAAA,EAAKA,gBAAA,CAAE,MAAM,KAAA,EAAO,gBAAA,EAAkB,gBAAgB,WAAA,EAAY;AAAA,MACpE,EAAE,GAAA,EAAKA,gBAAA,CAAE,GAAA,EAAK,OAAO,gBAAA,EAAiB;AAAA,MACtC,EAAE,GAAA,EAAKA,gBAAA,CAAE,SAAA,EAAW,OAAO,iBAAA,EAAkB;AAAA,MAC7C,EAAE,GAAA,EAAKA,gBAAA,CAAE,aAAA,EAAe,gBAAgB,cAAA,EAAe;AAAA,MACvD,EAAE,GAAA,EAAKA,gBAAA,CAAE,OAAO,SAAA,EAAW,QAAA,EAAU,OAAO,iBAAA;AAAkB;AAChE,GACD,CAAA;AAED,EAAA,MAAM,qBAAA,GAAwBC,gBAAW,KAAA,CAAM;AAAA,IAC7C,YAAA,EAAc;AAAA,MACZ,eAAA,EAAiB;AAAA,KACnB;AAAA,IACA,aAAA,EAAe;AAAA,MACb,KAAA,EAAO,iBAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,IACA,mCAAA,EAAqC;AAAA,MACnC,KAAA,EAAO;AAAA,KACT;AAAA,IACA,sBAAA,EAAwB;AAAA,MACtB,KAAA,EAAO;AAAA,KACT;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,eAAA,EAAiB;AAAA,KACnB;AAAA,IACA,kDAAA,EAAoD;AAAA,MAClD,eAAA,EAAiB;AAAA,KACnB;AAAA,IACA,0BAAA,EAA4B;AAAA,MAC1B,eAAA,EAAiB,iBAAA;AAAA,MACjB,MAAA,EAAQ,0BAAA;AAAA,MACR,YAAA,EAAc,KAAA;AAAA,MACd,SAAA,EAAW;AAAA,KACb;AAAA,IACA,+BAAA,EAAiC;AAAA,MAC/B,UAAA,EAAY;AAAA,KACd;AAAA,IACA,qBAAA,EAAuB;AAAA,MACrB,KAAA,EAAO;AAAA,KACT;AAAA,IACA,sBAAA,EAAwB;AAAA,MACtB,KAAA,EAAO,iBAAA;AAAA,MACP,QAAA,EAAU,QAAA;AAAA,MACV,UAAA,EAAY,MAAA;AAAA,MACZ,WAAA,EAAa;AAAA,KACf;AAAA,IACA,oBAAA,EAAsB;AAAA,MACpB,eAAA,EAAiB,iBAAA;AAAA,MACjB,MAAA,EAAQ,0BAAA;AAAA,MACR,KAAA,EAAO,iBAAA;AAAA,MACP,OAAA,EAAS;AAAA,KACX;AAAA,IACA,oBAAA,EAAsB;AAAA,MACpB,OAAA,EAAS;AAAA,KACX;AAAA,IACA,wCAAA,EAA0C;AAAA,MACxC,eAAA,EAAiB,iBAAA;AAAA,MACjB,KAAA,EAAO;AAAA,KACT;AAAA,IACA,iCAAA,EAAmC;AAAA,MACjC,KAAA,EAAO,2BAAA;AAAA,MACP,UAAA,EAAY;AAAA;AACd,GACD,CAAA;AAED,EAAA,OAAO,CAAC,WAAW,qBAAqB,CAAA;AAC1C;AAEA,SAAS,eAAA,GAA6B;AACpC,EAAA,MAAM,WAAA,GAAcA,gBAAW,KAAA,CAAM;AAAA,IACnC,GAAA,EAAK;AAAA,MACH,eAAA,EAAiB,aAAA;AAAA,MACjB,KAAA,EAAO,iBAAA;AAAA,MACP,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,0BAAA,EAA4B;AAAA,MAC1B,UAAA,EAAY;AAAA,KACd;AAAA,IACA,aAAA,EAAe;AAAA,MACb,eAAA,EAAiB,aAAA;AAAA,MACjB,KAAA,EAAO,iBAAA;AAAA,MACP,WAAA,EAAa;AAAA,KACf;AAAA,IACA,aAAA,EAAe;AAAA,MACb,KAAA,EAAO,iBAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,eAAA,EAAiB;AAAA,KACnB;AAAA,IACA,mCAAA,EAAqC;AAAA,MACnC,KAAA,EAAO;AAAA,KACT;AAAA,IACA,sBAAA,EAAwB;AAAA,MACtB,eAAA,EAAiB,aAAA;AAAA,MACjB,KAAA,EAAO;AAAA,KACT;AAAA,IACA,4BAAA,EAA8B;AAAA,MAC5B,eAAA,EAAiB;AAAA,KACnB;AAAA,IACA,oIAAA,EACE;AAAA,MACE,UAAA,EAAY;AAAA,KACd;AAAA,IACF,0BAAA,EAA4B;AAAA,MAC1B,eAAA,EAAiB,iBAAA;AAAA,MACjB,MAAA,EAAQ,0BAAA;AAAA,MACR,YAAA,EAAc,KAAA;AAAA,MACd,SAAA,EAAW;AAAA,KACb;AAAA,IACA,+BAAA,EAAiC;AAAA,MAC/B,UAAA,EAAY;AAAA,KACd;AAAA,IACA,qBAAA,EAAuB;AAAA,MACrB,KAAA,EAAO;AAAA,KACT;AAAA,IACA,sBAAA,EAAwB;AAAA,MACtB,KAAA,EAAO,iBAAA;AAAA,MACP,QAAA,EAAU,QAAA;AAAA,MACV,UAAA,EAAY,MAAA;AAAA,MACZ,WAAA,EAAa;AAAA,KACf;AAAA,IACA,oBAAA,EAAsB;AAAA,MACpB,eAAA,EAAiB,iBAAA;AAAA,MACjB,MAAA,EAAQ,0BAAA;AAAA,MACR,KAAA,EAAO,iBAAA;AAAA,MACP,OAAA,EAAS;AAAA,KACX;AAAA,IACA,oBAAA,EAAsB;AAAA,MACpB,OAAA,EAAS;AAAA,KACX;AAAA,IACA,wCAAA,EAA0C;AAAA,MACxC,eAAA,EAAiB,iBAAA;AAAA,MACjB,KAAA,EAAO;AAAA,KACT;AAAA,IACA,iCAAA,EAAmC;AAAA,MACjC,KAAA,EAAO,2BAAA;AAAA,MACP,UAAA,EAAY;AAAA;AACd,GACD,CAAA;AAED,EAAA,MAAM,cAAA,GAAiBC,wBAAe,MAAA,CAAO;AAAA,IAC3C,EAAE,KAAK,CAACF,gBAAA,CAAE,SAASA,gBAAA,CAAE,OAAO,CAAA,EAAG,KAAA,EAAO,iBAAA,EAAkB;AAAA,IACxD,EAAE,GAAA,EAAK,CAACA,gBAAA,CAAE,MAAA,EAAQA,gBAAA,CAAE,IAAA,EAAMA,gBAAA,CAAE,MAAM,CAAA,EAAG,KAAA,EAAO,gBAAA,EAAiB;AAAA,IAC7D,EAAE,GAAA,EAAK,CAACA,gBAAA,CAAE,MAAMA,gBAAA,CAAE,IAAA,EAAMA,gBAAA,CAAE,OAAA,CAAQA,gBAAA,CAAE,YAAY,CAAC,CAAA,EAAG,OAAO,gBAAA,EAAiB;AAAA,IAC5E,EAAE,GAAA,EAAK,CAACA,gBAAA,CAAE,OAAA,EAASA,gBAAA,CAAE,QAAA,EAAUA,gBAAA,CAAE,OAAO,CAAA,EAAG,KAAA,EAAO,gBAAA,EAAiB;AAAA,IACnE,EAAE,GAAA,EAAK,CAACA,gBAAA,CAAE,QAAA,CAASA,gBAAA,CAAE,YAAY,CAAA,EAAGA,gBAAA,CAAE,YAAY,CAAA,EAAG,KAAA,EAAO,gBAAA,EAAiB;AAAA,IAC7E;AAAA,MACE,GAAA,EAAK,CAACA,gBAAA,CAAE,UAAA,CAAWA,iBAAE,YAAY,CAAA,EAAGA,gBAAA,CAAE,QAAA,CAASA,iBAAE,YAAY,CAAA,EAAGA,gBAAA,CAAE,SAAA,EAAWA,iBAAE,aAAa,CAAA;AAAA,MAC5F,KAAA,EAAO;AAAA,KACT;AAAA,IACA,EAAE,KAAK,CAACA,gBAAA,CAAE,cAAcA,gBAAA,CAAE,MAAM,CAAA,EAAG,KAAA,EAAO,gBAAA,EAAiB;AAAA,IAC3D,EAAE,KAAK,CAACA,gBAAA,CAAE,MAAMA,gBAAA,CAAE,KAAK,CAAA,EAAG,KAAA,EAAO,gBAAA,EAAiB;AAAA,IAClD,EAAE,GAAA,EAAKA,gBAAA,CAAE,SAAS,KAAA,EAAO,gBAAA,EAAkB,YAAY,MAAA,EAAO;AAAA,IAC9D;AAAA,MACE,GAAA,EAAK,CAACA,gBAAA,CAAE,QAAA,EAAUA,gBAAA,CAAE,QAAA,EAAUA,gBAAA,CAAE,QAAA,EAAUA,gBAAA,CAAE,QAAA,EAAUA,gBAAA,CAAE,QAAA,EAAUA,iBAAE,QAAQ,CAAA;AAAA,MAC5E,KAAA,EAAO,gBAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,IACA,EAAE,KAAK,CAACA,gBAAA,CAAE,QAAQ,CAAA,EAAG,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,iBAAA,EAAkB;AAAA,IACnE,EAAE,KAAK,CAACA,gBAAA,CAAE,MAAM,CAAA,EAAG,UAAA,EAAY,MAAA,EAAQ,KAAA,EAAO,iBAAA,EAAkB;AAAA,IAChE,EAAE,GAAA,EAAKA,gBAAA,CAAE,MAAM,KAAA,EAAO,gBAAA,EAAkB,gBAAgB,WAAA,EAAY;AAAA,IACpE,EAAE,GAAA,EAAKA,gBAAA,CAAE,GAAA,EAAK,OAAO,gBAAA,EAAiB;AAAA,IACtC,EAAE,GAAA,EAAKA,gBAAA,CAAE,SAAA,EAAW,OAAO,iBAAA,EAAkB;AAAA,IAC7C,EAAE,GAAA,EAAKA,gBAAA,CAAE,aAAA,EAAe,gBAAgB,cAAA,EAAe;AAAA,IACvD,EAAE,GAAA,EAAK,CAACA,iBAAE,OAAO,CAAA,EAAG,OAAO,gBAAA,EAAiB;AAAA,IAC5C,EAAE,GAAA,EAAKA,gBAAA,CAAE,OAAA,EAAS,OAAO,cAAA,EAAe;AAAA,IACxC,EAAE,GAAA,EAAK,CAACA,gBAAA,CAAE,QAAA,CAASA,iBAAE,OAAO,CAAC,CAAA,EAAG,KAAA,EAAO,gBAAA;AAAiB,GACzD,CAAA;AAED,EAAA,OAAO,CAAC,WAAA,EAAaG,2BAAA,CAAmB,cAAc,CAAC,CAAA;AACzD;AAGO,MAAM,qBAAqB,MAAiB;AACjD,EAAA,MAAM,MAAA,GAASC,sBAAA,EAAS,CAAE,aAAA,KAAkB,MAAA;AAC5C,EAAA,OAAOC,aAAA,CAAQ,MAAO,MAAA,GAAS,cAAA,KAAmB,eAAA,EAAgB,EAAI,CAAC,MAAM,CAAC,CAAA;AAChF;AAEA,MAAM,kBAAA,GAAqBC,SAAA;AAAA,EACzBC,WAAA;AAAA,IACE,oGAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,kFAAA;AAAA,QACT,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS;AAAA;AACX;AAEJ,CAAA;AAEA,MAAM,wBAAwBC,UAAA,CAAK,OAAA;AAAA,EACjCP,eAAA,CAAW,iBAAiB,EAAA,CAAG;AAAA,IAC7B,KAAA,EAAO;AAAA,GACR;AACH,CAAA;AAEA,MAAM,mBAAmBO,UAAA,CAAK,OAAA;AAAA,EAC5BP,gBAAW,KAAA,CAAM;AAAA,IACf,GAAA,EAAK;AAAA,MACH,OAAA,EAAS;AAAA,KACX;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,OAAA,EAAS;AAAA,KACX;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,OAAA,EAAS;AAAA,KACX;AAAA,IACA,aAAA,EAAe;AAAA,MACb,OAAA,EAAS;AAAA,KACX;AAAA,IACA,mBAAA,EAAqB;AAAA,MACnB,OAAA,EAAS;AAAA;AACX,GACD;AACH,CAAA;AAEA,MAAM,qBAAA,GAAqC,CAAC,qBAAA,EAAuB,gBAAgB,CAAA;AAuB5E,MAAM,UAAA,GAAaQ,gBAAA;AAAA,EACxB,CACE;AAAA,IACE,IAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA,GAAiB,IAAA;AAAA,IACjB,SAAA;AAAA,IACA,QAAA,GAAW,MAAA;AAAA,IACX,kBAAA,GAAqB,KAAA;AAAA,IACrB,WAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA,GAAc,IAAA;AAAA,IACd,YAAA,GAAe,IAAA;AAAA,IACf,QAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,QAAQ,kBAAA,EAAmB;AACjC,IAAA,MAAM,aAAA,GAAgB,OAAO,IAAA,CAAK,SAAA,CAAU,MAAM,IAAA,EAAM,CAAC,IAAK,KAAA,IAAS,EAAA;AAEvE,IAAA,MAAM,UAAA,GAAaJ,cAAQ,MAAM;AAC/B,MAAA,MAAM,IAAA,GAAoB,CAAC,GAAG,qBAAqB,CAAA;AAEnD,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,IAAA,CAAK,IAAA,CAAKJ,gBAAW,YAAY,CAAA;AAAA,MACnC;AAEA,MAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,QAAA,IAAA,CAAK,KAAKS,qBAAY,CAAA;AAAA,MACxB,CAAA,MAAA,IAAW,aAAa,UAAA,EAAY;AAClC,QAAA,IAAA,CAAK,KAAKC,qBAAA,CAAS,EAAE,MAAMC,6BAAA,EAAkB,aAAA,EAAe,CAAC,CAAA;AAAA,MAC/D;AAEA,MAAA,IAAI,kBAAA,IAAsB,aAAa,UAAA,EAAY;AACjD,QAAA,IAAA,CAAK,KAAK,iBAAiB,CAAA;AAAA,MAC7B;AAEA,MAAA,IAAI,MAAA,IAAU,aAAa,UAAA,EAAY;AACrC,QAAA,IAAA,CAAK,IAAA,CAAK,0BAAA,CAA2B,MAAM,CAAC,CAAA;AAAA,MAC9C;AAEA,MAAA,IAAI,aAAa,KAAA,EAAO;AACtB,QAAA,IAAA,CAAK,IAAA,CAAKC,iBAAA,CAAY,QAAA,CAAS,EAAA,CAAG,IAAI,CAAC,CAAA;AAAA,MACzC;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,GAAG,CAAC,QAAA,EAAU,oBAAoB,MAAA,EAAQ,QAAA,EAAU,YAAY,CAAC,CAAA;AAEjE,IAAA,uBACEC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWP,WAAA,CAAG,kBAAA,CAAmB,EAAE,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,EAAI,GAAG,KAAA,EACjE,QAAA,EAAA;AAAA,MAAA,cAAA,oBAAkBQ,cAAA,CAACC,qBAAA,EAAA,EAAW,OAAA,EAAS,aAAA,EAAe,WAAU,6BAAA,EAA8B,CAAA;AAAA,sBAC/FD,cAAA;AAAA,QAACE,eAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,KAAA,EAAO,aAAA;AAAA,UACP,KAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAA,EAAW,aAAA;AAAA,UACX,WAAA;AAAA,UACA,MAAA,EAAO,MAAA;AAAA,UACP,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,EAAO;AAAA,UACxB,SAAA;AAAA,UACA,UAAA,EAAY,EAAE,WAAA;AAAY;AAAA;AAC5B,KAAA,EACF,CAAA;AAAA,EAEJ;AACF;;;;;;;;;;;"}
1
+ {"version":3,"file":"CodeEditor.cjs.js","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 */\nfunction 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 // Check if }} already follows the cursor\n const afterCursor = view.state.sliceDoc(to, to + 2);\n const hasClosingBraces = afterCursor === '}}';\n\n const insertText = hasClosingBraces ? completion.label : `${completion.label}}}`;\n\n view.dispatch({\n changes: { from, to, 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 { HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { EditorState, Prec } from '@codemirror/state';\nimport type { Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { tags as t } from '@lezer/highlight';\nimport { draculaInit } from '@uiw/codemirror-theme-dracula';\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 { createVariableAutocomplete } from './variable-autocomplete-extension';\nimport { variableHighlight } from './variable-highlight-extension';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { useTheme } from '@/ds/components/ThemeProvider';\nimport type { JsonSchema } from '@/lib/json-schema';\nimport { cn } from '@/lib/utils';\n\nexport type CodeEditorLanguage = 'json' | 'markdown';\n\n/** Original dark theme — draculaInit + custom overrides. Unchanged from before light mode work. */\nfunction buildDarkTheme(): Extension {\n const baseTheme = draculaInit({\n settings: {\n fontFamily: 'var(--font-mono)',\n fontSize: '0.8rem',\n lineHighlight: 'transparent',\n gutterBackground: 'transparent',\n gutterForeground: 'var(--neutral2)',\n background: 'transparent',\n foreground: 'var(--neutral6)',\n caret: 'var(--neutral6)',\n },\n styles: [\n { tag: [t.className, t.propertyName], color: 'var(--neutral6)' },\n { tag: t.heading, color: 'var(--accent3)', fontWeight: 'bold' },\n {\n tag: [t.heading1, t.heading2, t.heading3, t.heading4, t.heading5, t.heading6],\n color: 'var(--accent3)',\n fontWeight: 'bold',\n },\n { tag: t.emphasis, fontStyle: 'italic', color: 'var(--neutral6)' },\n { tag: t.strong, fontWeight: 'bold', color: 'var(--neutral6)' },\n { tag: t.link, color: 'var(--accent3)', textDecoration: 'underline' },\n { tag: t.url, color: 'var(--accent3)' },\n { tag: t.monospace, color: 'var(--neutral6)' },\n { tag: t.strikethrough, textDecoration: 'line-through' },\n { tag: t.quote, fontStyle: 'italic', color: 'var(--neutral2)' },\n ],\n });\n\n const customLineNumberTheme = EditorView.theme({\n '.cm-editor': {\n backgroundColor: 'transparent',\n },\n '.cm-content': {\n color: 'var(--neutral6)',\n caretColor: 'var(--neutral6)',\n },\n '.cm-lineNumbers .cm-gutterElement': {\n color: 'var(--neutral2)',\n },\n '.cm-activeLineGutter': {\n color: 'var(--neutral3)',\n },\n '.cm-cursor': {\n borderLeftColor: 'var(--neutral6)',\n },\n '.cm-selectionBackground, .cm-content ::selection': {\n backgroundColor: 'color-mix(in srgb, var(--accent3) 22%, transparent)',\n },\n '.cm-tooltip-autocomplete': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n borderRadius: '6px',\n boxShadow: '0 8px 16px rgba(0, 0, 0, 0.2)',\n },\n '.cm-tooltip-autocomplete > ul': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-completionLabel': {\n color: 'var(--neutral6)',\n },\n '.cm-completionDetail': {\n color: 'var(--neutral3)',\n fontSize: '0.7rem',\n marginLeft: 'auto',\n paddingLeft: '12px',\n },\n '.cm-completionInfo': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n color: 'var(--neutral3)',\n padding: '8px 12px',\n },\n '.cm-completionIcon': {\n display: 'none',\n },\n 'ul.cm-completionList li[aria-selected]': {\n backgroundColor: 'var(--surface4)',\n color: 'var(--neutral6)',\n },\n '.cm-line .cm-variable-highlight': {\n color: 'var(--accent6) !important',\n fontWeight: '500',\n },\n });\n\n return [baseTheme, customLineNumberTheme];\n}\n\nfunction buildLightTheme(): Extension {\n const editorTheme = EditorView.theme({\n '&': {\n backgroundColor: 'transparent',\n color: 'var(--neutral6)',\n fontSize: '0.8rem',\n },\n '&.cm-editor .cm-scroller': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-gutters': {\n backgroundColor: 'transparent',\n color: 'var(--neutral2)',\n borderRight: 'none',\n },\n '.cm-content': {\n color: 'var(--neutral6)',\n caretColor: 'var(--neutral6)',\n },\n '.cm-activeLine': {\n backgroundColor: 'transparent',\n },\n '.cm-lineNumbers .cm-gutterElement': {\n color: 'var(--neutral2)',\n },\n '.cm-activeLineGutter': {\n backgroundColor: 'transparent',\n color: 'var(--neutral3)',\n },\n '.cm-cursor, .cm-dropCursor': {\n borderLeftColor: 'var(--neutral6)',\n },\n '&.cm-focused .cm-selectionBackground, & .cm-line::selection, & .cm-selectionLayer .cm-selectionBackground, .cm-content ::selection':\n {\n background: 'color-mix(in srgb, var(--accent3) 22%, transparent) !important',\n },\n '.cm-tooltip-autocomplete': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n borderRadius: '6px',\n boxShadow: '0 8px 16px rgba(0, 0, 0, 0.2)',\n },\n '.cm-tooltip-autocomplete > ul': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-completionLabel': {\n color: 'var(--neutral6)',\n },\n '.cm-completionDetail': {\n color: 'var(--neutral3)',\n fontSize: '0.7rem',\n marginLeft: 'auto',\n paddingLeft: '12px',\n },\n '.cm-completionInfo': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n color: 'var(--neutral3)',\n padding: '8px 12px',\n },\n '.cm-completionIcon': {\n display: 'none',\n },\n 'ul.cm-completionList li[aria-selected]': {\n backgroundColor: 'var(--surface4)',\n color: 'var(--neutral6)',\n },\n '.cm-line .cm-variable-highlight': {\n color: 'var(--accent6) !important',\n fontWeight: '500',\n },\n });\n\n const highlightStyle = HighlightStyle.define([\n { tag: [t.comment, t.bracket], color: 'var(--neutral2)' },\n { tag: [t.string, t.meta, t.regexp], color: 'var(--accent1)' },\n { tag: [t.atom, t.bool, t.special(t.variableName)], color: 'var(--accent6)' },\n { tag: [t.keyword, t.operator, t.tagName], color: 'var(--accent2)' },\n { tag: [t.function(t.propertyName), t.propertyName], color: 'var(--accent5)' },\n {\n tag: [t.definition(t.variableName), t.function(t.variableName), t.className, t.attributeName],\n color: 'var(--accent3)',\n },\n { tag: [t.variableName, t.number], color: 'var(--accent5)' },\n { tag: [t.name, t.quote], color: 'var(--accent1)' },\n { tag: t.heading, color: 'var(--accent3)', fontWeight: 'bold' },\n {\n tag: [t.heading1, t.heading2, t.heading3, t.heading4, t.heading5, t.heading6],\n color: 'var(--accent3)',\n fontWeight: 'bold',\n },\n { tag: [t.emphasis], fontStyle: 'italic', color: 'var(--neutral6)' },\n { tag: [t.strong], fontWeight: 'bold', color: 'var(--neutral6)' },\n { tag: t.link, color: 'var(--accent3)', textDecoration: 'underline' },\n { tag: t.url, color: 'var(--accent3)' },\n { tag: t.monospace, color: 'var(--neutral6)' },\n { tag: t.strikethrough, textDecoration: 'line-through' },\n { tag: [t.deleted], color: 'var(--accent2)' },\n { tag: t.invalid, color: 'var(--error)' },\n { tag: [t.standard(t.tagName)], color: 'var(--accent1)' },\n ]);\n\n return [editorTheme, syntaxHighlighting(highlightStyle)];\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 = (): Extension => {\n const isDark = useTheme().resolvedTheme === 'dark';\n return useMemo(() => (isDark ? buildDarkTheme() : buildLightTheme()), [isDark]);\n};\n\nconst codeEditorVariants = cva(\n cn(\n 'relative overflow-hidden font-mono outline-hidden focus-within:outline-hidden focus:outline-hidden',\n 'duration-normal transition-colors ease-out-custom',\n ),\n {\n variants: {\n variant: {\n default: 'rounded-md border border-border1 bg-surface3 p-1 focus-within:border-neutral6/20',\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\nexport type CodeEditorProps = {\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 highlightVariables = false,\n placeholder,\n schema,\n autoFocus,\n lineNumbers = true,\n lineWrapping = true,\n editable,\n variant,\n ...props\n },\n ref,\n ) => {\n const theme = useCodemirrorTheme();\n const formattedCode = data ? JSON.stringify(data, null, 2) : (value ?? '');\n\n const extensions = useMemo(() => {\n const exts: Extension[] = [...editorFocusExtensions];\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 }, [language, highlightVariables, schema, editable, lineWrapping]);\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=\"Code editor\"\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","draculaInit","t","EditorView","HighlightStyle","syntaxHighlighting","useTheme","useMemo","cva","cn","Prec","forwardRef","jsonLanguage","markdown","markdownLanguage","EditorState","jsxs","jsx","CopyButton","CodeMirror"],"mappings":"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"}
@@ -13,7 +13,7 @@ import { autocompletion } from '@codemirror/autocomplete';
13
13
  import { C as CopyButton } from '../copy-button-BHmcGzIz.js';
14
14
  import { u as useTheme } from '../theme-provider-C9ih9jSS.js';
15
15
  import { c as cn } from '../cn-B4oPhFx9.js';
16
- export { h as highlight } from '../highlight-CSJjjoqh.js';
16
+ export { h as highlight, l as languageForPath } from '../highlight-BmpoELR4.js';
17
17
 
18
18
  function legacy(parser) {
19
19
  return new LanguageSupport(StreamLanguage.define(parser));
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
- const combobox = require('../combobox-BQrlN0eB.cjs');
5
+ const combobox = require('../combobox-JNWmgC13.cjs');
6
6
  const combobox$1 = require('@base-ui/react/combobox');
7
7
 
8
8
 
@@ -1,3 +1,3 @@
1
- export { C as Combobox, c as comboboxStyles } from '../combobox-DeeAlYti.js';
1
+ export { C as Combobox, c as comboboxStyles } from '../combobox-nxjXzRWu.js';
2
2
  export { Combobox as ComboboxPrimitive } from '@base-ui/react/combobox';
3
3
  //# sourceMappingURL=Combobox.es.js.map
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
- const command = require('../command-CUev1UxH.cjs');
5
+ const command = require('../command-DsTBCmQq.cjs');
6
6
 
7
7
 
8
8
 
@@ -1,2 +1,2 @@
1
- export { C as Command, a as CommandDialog, b as CommandEmpty, c as CommandGroup, d as CommandInput, e as CommandItem, f as CommandList, g as CommandSeparator, h as CommandShortcut } from '../command-DWFd0d4c.js';
1
+ export { C as Command, a as CommandDialog, b as CommandEmpty, c as CommandGroup, d as CommandInput, e as CommandItem, f as CommandList, g as CommandSeparator, h as CommandShortcut } from '../command-Be-KrIAX.js';
2
2
  //# sourceMappingURL=Command.es.js.map
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
5
  require('../CommandPalette.css');const jsxRuntime = require('react/jsx-runtime');
6
- const command = require('../command-CUev1UxH.cjs');
6
+ const command = require('../command-DsTBCmQq.cjs');
7
7
  const kbd = require('../kbd-BjdgMhkv.cjs');
8
8
  const scrollArea = require('../scroll-area-B1vdOFuC.cjs');
9
9
  const utils_cn = require('../cn-DCPcv4xv.cjs');
@@ -1,5 +1,5 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { a as CommandDialog, d as CommandInput, e as CommandItem, h as CommandShortcut, f as CommandList } from '../command-DWFd0d4c.js';
2
+ import { a as CommandDialog, d as CommandInput, e as CommandItem, h as CommandShortcut, f as CommandList } from '../command-Be-KrIAX.js';
3
3
  import { K as Kbd } from '../kbd-qWtehN82.js';
4
4
  import { S as ScrollArea } from '../scroll-area-BiHnOfzg.js';
5
5
  import { c as cn } from '../cn-B4oPhFx9.js';
@@ -276,7 +276,7 @@ function CommentEditor({
276
276
  readOnly: isPending,
277
277
  "aria-label": ariaLabel,
278
278
  rows: 2,
279
- className: "text-neutral6 border-border1 bg-surface2 text-ui-sm focus:border-border2 block field-sizing-content max-h-40 w-full resize-none overflow-y-auto rounded-lg border px-2 pt-1.5 pb-9 outline-none"
279
+ className: "border-border1 bg-surface2 text-ui-sm text-neutral6 focus:border-border2 block field-sizing-content max-h-40 w-full resize-none overflow-y-auto rounded-lg border px-2 pt-1.5 pb-9 outline-none"
280
280
  }
281
281
  ),
282
282
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-surface2 absolute inset-x-px bottom-px flex items-center justify-end gap-1 rounded-b-lg px-1.5 pt-1 pb-1.5", children: [
@@ -293,7 +293,7 @@ function CommentQuote({ authorName, quote, onDismiss, className }) {
293
293
  "blockquote",
294
294
  {
295
295
  "data-slot": "comment-quote",
296
- className: utils_cn.cn("text-neutral3 m-0 flex min-w-0 gap-2 border-l-2 border-border2 pl-2 text-ui-xs", className),
296
+ className: utils_cn.cn("m-0 flex min-w-0 gap-2 border-l-2 border-border2 pl-2 text-ui-xs text-neutral3", className),
297
297
  children: [
298
298
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "min-w-0 flex-1", children: [
299
299
  authorName ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-neutral4 font-medium", children: [
@@ -1 +1 @@
1
- {"version":3,"file":"Comment.cjs.js","sources":["../../src/ds/components/Comment/comment-context.ts","../../src/ds/components/Comment/comment.tsx","../../src/ds/components/Comment/comment-arrival.tsx","../../src/ds/components/Comment/comment-composer.tsx","../../src/ds/components/Comment/comment-editor.tsx","../../src/ds/components/Comment/comment-quote.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nexport type CommentVariant = 'default' | 'embed' | 'thread';\n\nexport const CommentContext = createContext<CommentVariant | null>(null);\n\nexport function useCommentVariant(): CommentVariant {\n const variant = useContext(CommentContext);\n if (!variant) throw new Error('Comment compounds must be rendered within Comment');\n return variant;\n}\n","import { cva } from 'class-variance-authority';\nimport type { ComponentPropsWithoutRef, HTMLAttributes } from 'react';\nimport { forwardRef } from 'react';\n\nimport { CommentContext, useCommentVariant } from './comment-context';\nimport type { CommentVariant } from './comment-context';\nimport { Txt } from '@/ds/components/Txt';\nimport type { TxtProps } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nconst commentVariants = cva('flex flex-col', {\n variants: {\n variant: {\n default: 'gap-2',\n embed: 'gap-1 rounded-xl border border-border1 bg-surface3 p-3',\n thread: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\nexport interface CommentProps extends ComponentPropsWithoutRef<'div'> {\n variant?: CommentVariant;\n}\n\nexport const Comment = forwardRef<HTMLDivElement, CommentProps>(({ className, variant = 'default', ...props }, ref) => (\n <CommentContext.Provider value={variant}>\n <div\n ref={ref}\n data-slot=\"comment\"\n data-variant={variant}\n className={cn(commentVariants({ variant }), className)}\n {...props}\n />\n </CommentContext.Provider>\n));\nComment.displayName = 'Comment';\n\nconst commentListGap: Record<CommentVariant, string> = {\n default: 'gap-3',\n embed: 'gap-2',\n thread: '',\n};\n\nexport type CommentListProps = ComponentPropsWithoutRef<'ul'>;\n\nexport const CommentList = forwardRef<HTMLUListElement, CommentListProps>(({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <ul\n ref={ref}\n data-slot=\"comment-list\"\n className={cn('flex flex-col', commentListGap[variant], className)}\n {...props}\n />\n );\n});\nCommentList.displayName = 'CommentList';\n\nconst commentItemLayout: Record<CommentVariant, string> = {\n default: 'flex flex-col gap-1',\n embed: 'flex flex-col gap-1',\n thread: 'relative flex gap-2 rounded-lg px-2 hover:bg-surface3/60',\n};\n\nexport interface CommentItemProps extends HTMLAttributes<HTMLElement> {\n /** Same author moments after the row above: the header is dropped and the row tightens. */\n continued?: boolean;\n /** The comment a link pointed at. */\n highlighted?: boolean;\n}\n\nexport const CommentItem = forwardRef<HTMLElement, CommentItemProps>(\n ({ className, continued = false, highlighted = false, ...props }, ref) => {\n const variant = useCommentVariant();\n // A thread row is a stream entry among runs and moves, not a list item.\n const Root = variant === 'thread' ? 'div' : 'li';\n\n return (\n <Root\n // Cast needed: `Root` is polymorphic, so TS narrows the expected ref to a single element type.\n ref={ref as never}\n data-slot=\"comment-item\"\n className={cn(\n 'group/comment-item',\n commentItemLayout[variant],\n variant === 'thread' && (continued ? 'py-0.5' : 'py-1.5'),\n highlighted && 'bg-accent1/10',\n className,\n )}\n {...props}\n />\n );\n },\n);\nCommentItem.displayName = 'CommentItem';\n\nexport type CommentItemAvatarProps = ComponentPropsWithoutRef<'div'>;\n\n/** Fixed gutter: left empty on a continuation row, it keeps the body aligned under the avatar above. */\nexport const CommentItemAvatar = forwardRef<HTMLDivElement, CommentItemAvatarProps>(({ className, ...props }, ref) => (\n <div ref={ref} data-slot=\"comment-item-avatar\" className={cn('w-6 shrink-0 pt-0.5', className)} {...props} />\n));\nCommentItemAvatar.displayName = 'CommentItemAvatar';\n\nexport type CommentItemContentProps = ComponentPropsWithoutRef<'div'>;\n\n/** Everything beside the gutter, stacked and free to shrink so long words wrap instead of widening the row. */\nexport const CommentItemContent = forwardRef<HTMLDivElement, CommentItemContentProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} data-slot=\"comment-item-content\" className={cn('min-w-0 flex-1', className)} {...props} />\n ),\n);\nCommentItemContent.displayName = 'CommentItemContent';\n\nconst commentItemHeaderLayout: Record<CommentVariant, string> = {\n default: 'flex items-center gap-2',\n embed: 'flex items-center gap-2',\n thread: 'flex items-baseline gap-1.5',\n};\n\nexport type CommentItemHeaderProps = ComponentPropsWithoutRef<'div'>;\n\nexport const CommentItemHeader = forwardRef<HTMLDivElement, CommentItemHeaderProps>(({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <div\n ref={ref}\n data-slot=\"comment-item-header\"\n className={cn(commentItemHeaderLayout[variant], className)}\n {...props}\n />\n );\n});\nCommentItemHeader.displayName = 'CommentItemHeader';\n\nconst commentItemAuthorSize: Record<CommentVariant, TxtProps['variant']> = {\n default: 'ui-md',\n embed: 'ui-md',\n thread: 'ui-sm',\n};\n\nconst commentItemAuthorTone: Record<CommentVariant, string> = {\n default: 'font-medium text-neutral6',\n embed: 'font-medium text-neutral6',\n thread: 'truncate font-medium text-neutral6',\n};\n\nexport type CommentItemAuthorProps = ComponentPropsWithoutRef<'span'>;\n\nexport const CommentItemAuthor = forwardRef<HTMLElement, CommentItemAuthorProps>(({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <Txt\n ref={ref}\n as=\"span\"\n variant={commentItemAuthorSize[variant]}\n data-slot=\"comment-item-author\"\n className={cn(commentItemAuthorTone[variant], className)}\n {...props}\n />\n );\n});\nCommentItemAuthor.displayName = 'CommentItemAuthor';\n\nconst commentItemTimestampTone: Record<CommentVariant, string> = {\n default: 'text-ui-sm leading-ui-sm text-neutral3',\n embed: 'text-ui-sm leading-ui-sm text-neutral3',\n thread: 'text-ui-xs leading-ui-xs text-neutral2 shrink-0',\n};\n\nexport type CommentItemTimestampProps = ComponentPropsWithoutRef<'time'>;\n\nexport const CommentItemTimestamp = forwardRef<HTMLTimeElement, CommentItemTimestampProps>(\n ({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <time\n ref={ref}\n data-slot=\"comment-item-timestamp\"\n className={cn(commentItemTimestampTone[variant], className)}\n {...props}\n />\n );\n },\n);\nCommentItemTimestamp.displayName = 'CommentItemTimestamp';\n\nconst commentItemBodySize: Record<CommentVariant, TxtProps['variant']> = {\n default: 'ui-md',\n embed: 'ui-md',\n thread: 'ui-sm',\n};\n\nconst commentItemBodyTone: Record<CommentVariant, string> = {\n default: 'whitespace-pre-wrap text-neutral6 border-l border-border1 pl-3',\n embed: 'whitespace-pre-wrap text-neutral6',\n thread: '',\n};\n\nexport type CommentItemBodyProps = ComponentPropsWithoutRef<'p'>;\n\nexport const CommentItemBody = forwardRef<HTMLElement, CommentItemBodyProps>(({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <Txt\n ref={ref}\n // Rendered markdown brings its own blocks, which a paragraph cannot hold.\n as={variant === 'thread' ? 'div' : 'p'}\n variant={commentItemBodySize[variant]}\n data-slot=\"comment-item-body\"\n className={cn(commentItemBodyTone[variant], className)}\n {...props}\n />\n );\n});\nCommentItemBody.displayName = 'CommentItemBody';\n\nconst commentItemActionsLayout: Record<CommentVariant, string> = {\n default:\n 'flex items-center gap-1 opacity-0 group-focus-within/comment-item:opacity-100 group-hover/comment-item:opacity-100 motion-safe:transition-opacity',\n embed: '',\n // Hung over the row's own top edge, so it never reflows the body it floats above.\n // `pointer-fine` only: a touch screen has no hover to reveal it with.\n thread:\n 'bg-surface2 border-border1 absolute -top-2 right-2 flex items-center gap-0.5 rounded-lg border px-0.5 transition-opacity duration-200 ease-out motion-reduce:transition-none pointer-fine:opacity-0 pointer-fine:group-focus-within/comment-item:opacity-100 pointer-fine:group-hover/comment-item:opacity-100',\n};\n\nexport type CommentItemActionsProps = ComponentPropsWithoutRef<'div'>;\n\n/** Hidden in the `embed` variant, which drops per-item actions. */\nexport const CommentItemActions = forwardRef<HTMLDivElement, CommentItemActionsProps>(\n ({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n if (variant === 'embed') return null;\n\n return (\n <div\n ref={ref}\n data-slot=\"comment-item-actions\"\n className={cn(commentItemActionsLayout[variant], className)}\n {...props}\n />\n );\n },\n);\nCommentItemActions.displayName = 'CommentItemActions';\n","import type { ReactNode } from 'react';\n\nimport { ArrivalScope, useWatched } from '@/ds/components/Arrival';\n\nimport './comment-arrival.css';\n\n/** A comment the reader watched land rises into place; one that was already there just appears. */\nexport function CommentArrival({ children }: { children: ReactNode }) {\n const watched = useWatched();\n\n return (\n <div data-slot=\"comment-arrival\" className={watched ? 'mastra-comment-arriving' : undefined}>\n <ArrivalScope>{children}</ArrivalScope>\n </div>\n );\n}\n","import { ArrowUp } from 'lucide-react';\nimport type { ComponentPropsWithoutRef, ReactNode } from 'react';\nimport { forwardRef } from 'react';\n\nimport { useCommentVariant } from './comment-context';\nimport type { CommentVariant } from './comment-context';\nimport { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from '@/ds/components/InputGroup';\nimport type { InputGroupButtonProps, InputGroupInputProps } from '@/ds/components/InputGroup';\nimport type { ControlSize } from '@/ds/primitives/control-size';\nimport { cn } from '@/lib/utils';\n\nexport type CommentComposerProps = ComponentPropsWithoutRef<'form'>;\n\nexport const CommentComposer = forwardRef<HTMLFormElement, CommentComposerProps>(({ className, ...props }, ref) => (\n <form ref={ref} data-slot=\"comment-composer\" className={cn('flex w-full items-center gap-2', className)} {...props} />\n));\nCommentComposer.displayName = 'CommentComposer';\n\nconst composerSize: Record<CommentVariant, ControlSize> = {\n default: 'md',\n embed: 'sm',\n thread: 'md',\n};\n\nconst composerInputVariant: Record<CommentVariant, 'default' | 'outline'> = {\n default: 'outline',\n embed: 'default',\n thread: 'outline',\n};\n\nexport interface CommentComposerInputProps extends InputGroupInputProps {\n /** Layout classes for the surrounding InputGroup. */\n groupClassName?: string;\n children?: ReactNode;\n}\n\nexport const CommentComposerInput = forwardRef<HTMLInputElement, CommentComposerInputProps>(\n ({ groupClassName, children, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <InputGroup size={composerSize[variant]} variant={composerInputVariant[variant]} className={groupClassName}>\n <InputGroupInput ref={ref} data-slot=\"comment-composer-input\" {...props} />\n {children}\n </InputGroup>\n );\n },\n);\nCommentComposerInput.displayName = 'CommentComposerInput';\n\nexport type CommentComposerSendProps = Omit<InputGroupButtonProps, 'children'>;\n\nexport const CommentComposerSend = forwardRef<HTMLButtonElement, CommentComposerSendProps>(\n ({ 'aria-label': ariaLabel = 'Send comment', type = 'submit', ...props }, ref) => (\n <InputGroupAddon align=\"inline-end\">\n <InputGroupButton ref={ref} data-slot=\"comment-composer-send\" type={type} aria-label={ariaLabel} {...props}>\n <ArrowUp />\n </InputGroupButton>\n </InputGroupAddon>\n ),\n);\nCommentComposerSend.displayName = 'CommentComposerSend';\n","import { useState } from 'react';\nimport type { KeyboardEvent } from 'react';\n\nimport { Button } from '@/ds/components/Button';\nimport { cn } from '@/lib/utils';\n\nexport interface CommentEditorProps {\n initialBody: string;\n /** Handed the trimmed draft. Closing is the caller's call, so a save that failed keeps what was typed. */\n onSave: (body: string) => void;\n onClose: () => void;\n /** The caller's save in flight: the box locks until it settles. */\n isPending?: boolean;\n /** Why the caller's last save failed. */\n error?: string;\n 'aria-label'?: string;\n className?: string;\n}\n\n/** Owns the draft only; whether a save landed is the caller's mutation to report. */\nexport function CommentEditor({\n initialBody,\n onSave,\n onClose,\n isPending = false,\n error,\n 'aria-label': ariaLabel = 'Edit comment',\n className,\n}: CommentEditorProps) {\n const [draft, setDraft] = useState(initialBody);\n const body = draft.trim();\n const canSave = body.length > 0 && !isPending;\n\n const save = () => {\n if (!canSave) return;\n if (body === initialBody) {\n onClose();\n return;\n }\n onSave(body);\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n // An IME commit fires Enter mid-composition; acting on it would save half a word.\n if (event.nativeEvent.isComposing) return;\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n save();\n }\n };\n\n return (\n <div data-slot=\"comment-editor\" className={cn('mt-1 flex flex-col gap-1.5', className)}>\n <div className=\"relative\">\n <textarea\n value={draft}\n onChange={event => setDraft(event.target.value)}\n onKeyDown={onKeyDown}\n readOnly={isPending}\n aria-label={ariaLabel}\n rows={2}\n className=\"text-neutral6 border-border1 bg-surface2 text-ui-sm focus:border-border2 block field-sizing-content max-h-40 w-full resize-none overflow-y-auto rounded-lg border px-2 pt-1.5 pb-9 outline-none\"\n />\n {/* Opaque, so a scrolled line passes behind the actions instead of under them. */}\n <div className=\"bg-surface2 absolute inset-x-px bottom-px flex items-center justify-end gap-1 rounded-b-lg px-1.5 pt-1 pb-1.5\">\n <Button type=\"button\" variant=\"ghost\" size=\"xs\" disabled={isPending} onClick={onClose}>\n Cancel\n </Button>\n <Button type=\"button\" variant=\"outline\" size=\"xs\" disabled={!canSave} onClick={save}>\n {isPending ? 'Saving…' : 'Save'}\n </Button>\n </div>\n </div>\n {error ? (\n <p role=\"alert\" className=\"text-ui-xs text-error m-0\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n","import { X } from 'lucide-react';\n\nimport { Button } from '@/ds/components/Button';\nimport { cn } from '@/lib/utils';\n\nexport interface CommentQuoteProps {\n authorName?: string;\n quote: string;\n /** Given only while the quote is a draft the writer can still drop. */\n onDismiss?: () => void;\n className?: string;\n}\n\n/** The passage a reply answers, above the reply itself or inside the composer writing it. */\nexport function CommentQuote({ authorName, quote, onDismiss, className }: CommentQuoteProps) {\n return (\n <blockquote\n data-slot=\"comment-quote\"\n className={cn('text-neutral3 m-0 flex min-w-0 gap-2 border-l-2 border-border2 pl-2 text-ui-xs', className)}\n >\n <span className=\"min-w-0 flex-1\">\n {authorName ? <span className=\"text-neutral4 font-medium\">{authorName} </span> : null}\n <span className=\"line-clamp-2 wrap-anywhere whitespace-pre-line\">{quote}</span>\n </span>\n {onDismiss ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label=\"Remove quote\"\n onClick={onDismiss}\n className=\"shrink-0\"\n >\n <X size={12} aria-hidden />\n </Button>\n ) : null}\n </blockquote>\n );\n}\n"],"names":["createContext","useContext","cva","forwardRef","jsx","cn","Txt","useWatched","ArrivalScope","jsxs","InputGroup","InputGroupInput","InputGroupAddon","InputGroupButton","ArrowUp","useState","Button","X"],"mappings":"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"}
1
+ {"version":3,"file":"Comment.cjs.js","sources":["../../src/ds/components/Comment/comment-context.ts","../../src/ds/components/Comment/comment.tsx","../../src/ds/components/Comment/comment-arrival.tsx","../../src/ds/components/Comment/comment-composer.tsx","../../src/ds/components/Comment/comment-editor.tsx","../../src/ds/components/Comment/comment-quote.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nexport type CommentVariant = 'default' | 'embed' | 'thread';\n\nexport const CommentContext = createContext<CommentVariant | null>(null);\n\nexport function useCommentVariant(): CommentVariant {\n const variant = useContext(CommentContext);\n if (!variant) throw new Error('Comment compounds must be rendered within Comment');\n return variant;\n}\n","import { cva } from 'class-variance-authority';\nimport type { ComponentPropsWithoutRef, HTMLAttributes } from 'react';\nimport { forwardRef } from 'react';\n\nimport { CommentContext, useCommentVariant } from './comment-context';\nimport type { CommentVariant } from './comment-context';\nimport { Txt } from '@/ds/components/Txt';\nimport type { TxtProps } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nconst commentVariants = cva('flex flex-col', {\n variants: {\n variant: {\n default: 'gap-2',\n embed: 'gap-1 rounded-xl border border-border1 bg-surface3 p-3',\n thread: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\nexport interface CommentProps extends ComponentPropsWithoutRef<'div'> {\n variant?: CommentVariant;\n}\n\nexport const Comment = forwardRef<HTMLDivElement, CommentProps>(({ className, variant = 'default', ...props }, ref) => (\n <CommentContext.Provider value={variant}>\n <div\n ref={ref}\n data-slot=\"comment\"\n data-variant={variant}\n className={cn(commentVariants({ variant }), className)}\n {...props}\n />\n </CommentContext.Provider>\n));\nComment.displayName = 'Comment';\n\nconst commentListGap: Record<CommentVariant, string> = {\n default: 'gap-3',\n embed: 'gap-2',\n thread: '',\n};\n\nexport type CommentListProps = ComponentPropsWithoutRef<'ul'>;\n\nexport const CommentList = forwardRef<HTMLUListElement, CommentListProps>(({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <ul\n ref={ref}\n data-slot=\"comment-list\"\n className={cn('flex flex-col', commentListGap[variant], className)}\n {...props}\n />\n );\n});\nCommentList.displayName = 'CommentList';\n\nconst commentItemLayout: Record<CommentVariant, string> = {\n default: 'flex flex-col gap-1',\n embed: 'flex flex-col gap-1',\n thread: 'relative flex gap-2 rounded-lg px-2 hover:bg-surface3/60',\n};\n\nexport interface CommentItemProps extends HTMLAttributes<HTMLElement> {\n /** Same author moments after the row above: the header is dropped and the row tightens. */\n continued?: boolean;\n /** The comment a link pointed at. */\n highlighted?: boolean;\n}\n\nexport const CommentItem = forwardRef<HTMLElement, CommentItemProps>(\n ({ className, continued = false, highlighted = false, ...props }, ref) => {\n const variant = useCommentVariant();\n // A thread row is a stream entry among runs and moves, not a list item.\n const Root = variant === 'thread' ? 'div' : 'li';\n\n return (\n <Root\n // Cast needed: `Root` is polymorphic, so TS narrows the expected ref to a single element type.\n ref={ref as never}\n data-slot=\"comment-item\"\n className={cn(\n 'group/comment-item',\n commentItemLayout[variant],\n variant === 'thread' && (continued ? 'py-0.5' : 'py-1.5'),\n highlighted && 'bg-accent1/10',\n className,\n )}\n {...props}\n />\n );\n },\n);\nCommentItem.displayName = 'CommentItem';\n\nexport type CommentItemAvatarProps = ComponentPropsWithoutRef<'div'>;\n\n/** Fixed gutter: left empty on a continuation row, it keeps the body aligned under the avatar above. */\nexport const CommentItemAvatar = forwardRef<HTMLDivElement, CommentItemAvatarProps>(({ className, ...props }, ref) => (\n <div ref={ref} data-slot=\"comment-item-avatar\" className={cn('w-6 shrink-0 pt-0.5', className)} {...props} />\n));\nCommentItemAvatar.displayName = 'CommentItemAvatar';\n\nexport type CommentItemContentProps = ComponentPropsWithoutRef<'div'>;\n\n/** Everything beside the gutter, stacked and free to shrink so long words wrap instead of widening the row. */\nexport const CommentItemContent = forwardRef<HTMLDivElement, CommentItemContentProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} data-slot=\"comment-item-content\" className={cn('min-w-0 flex-1', className)} {...props} />\n ),\n);\nCommentItemContent.displayName = 'CommentItemContent';\n\nconst commentItemHeaderLayout: Record<CommentVariant, string> = {\n default: 'flex items-center gap-2',\n embed: 'flex items-center gap-2',\n thread: 'flex items-baseline gap-1.5',\n};\n\nexport type CommentItemHeaderProps = ComponentPropsWithoutRef<'div'>;\n\nexport const CommentItemHeader = forwardRef<HTMLDivElement, CommentItemHeaderProps>(({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <div\n ref={ref}\n data-slot=\"comment-item-header\"\n className={cn(commentItemHeaderLayout[variant], className)}\n {...props}\n />\n );\n});\nCommentItemHeader.displayName = 'CommentItemHeader';\n\nconst commentItemAuthorSize: Record<CommentVariant, TxtProps['variant']> = {\n default: 'ui-md',\n embed: 'ui-md',\n thread: 'ui-sm',\n};\n\nconst commentItemAuthorTone: Record<CommentVariant, string> = {\n default: 'font-medium text-neutral6',\n embed: 'font-medium text-neutral6',\n thread: 'truncate font-medium text-neutral6',\n};\n\nexport type CommentItemAuthorProps = ComponentPropsWithoutRef<'span'>;\n\nexport const CommentItemAuthor = forwardRef<HTMLElement, CommentItemAuthorProps>(({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <Txt\n ref={ref}\n as=\"span\"\n variant={commentItemAuthorSize[variant]}\n data-slot=\"comment-item-author\"\n className={cn(commentItemAuthorTone[variant], className)}\n {...props}\n />\n );\n});\nCommentItemAuthor.displayName = 'CommentItemAuthor';\n\nconst commentItemTimestampTone: Record<CommentVariant, string> = {\n default: 'text-ui-sm leading-ui-sm text-neutral3',\n embed: 'text-ui-sm leading-ui-sm text-neutral3',\n thread: 'text-ui-xs leading-ui-xs text-neutral2 shrink-0',\n};\n\nexport type CommentItemTimestampProps = ComponentPropsWithoutRef<'time'>;\n\nexport const CommentItemTimestamp = forwardRef<HTMLTimeElement, CommentItemTimestampProps>(\n ({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <time\n ref={ref}\n data-slot=\"comment-item-timestamp\"\n className={cn(commentItemTimestampTone[variant], className)}\n {...props}\n />\n );\n },\n);\nCommentItemTimestamp.displayName = 'CommentItemTimestamp';\n\nconst commentItemBodySize: Record<CommentVariant, TxtProps['variant']> = {\n default: 'ui-md',\n embed: 'ui-md',\n thread: 'ui-sm',\n};\n\nconst commentItemBodyTone: Record<CommentVariant, string> = {\n default: 'whitespace-pre-wrap text-neutral6 border-l border-border1 pl-3',\n embed: 'whitespace-pre-wrap text-neutral6',\n thread: '',\n};\n\nexport type CommentItemBodyProps = ComponentPropsWithoutRef<'p'>;\n\nexport const CommentItemBody = forwardRef<HTMLElement, CommentItemBodyProps>(({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <Txt\n ref={ref}\n // Rendered markdown brings its own blocks, which a paragraph cannot hold.\n as={variant === 'thread' ? 'div' : 'p'}\n variant={commentItemBodySize[variant]}\n data-slot=\"comment-item-body\"\n className={cn(commentItemBodyTone[variant], className)}\n {...props}\n />\n );\n});\nCommentItemBody.displayName = 'CommentItemBody';\n\nconst commentItemActionsLayout: Record<CommentVariant, string> = {\n default:\n 'flex items-center gap-1 opacity-0 group-focus-within/comment-item:opacity-100 group-hover/comment-item:opacity-100 motion-safe:transition-opacity',\n embed: '',\n // Hung over the row's own top edge, so it never reflows the body it floats above.\n // `pointer-fine` only: a touch screen has no hover to reveal it with.\n thread:\n 'bg-surface2 border-border1 absolute -top-2 right-2 flex items-center gap-0.5 rounded-lg border px-0.5 transition-opacity duration-200 ease-out motion-reduce:transition-none pointer-fine:opacity-0 pointer-fine:group-focus-within/comment-item:opacity-100 pointer-fine:group-hover/comment-item:opacity-100',\n};\n\nexport type CommentItemActionsProps = ComponentPropsWithoutRef<'div'>;\n\n/** Hidden in the `embed` variant, which drops per-item actions. */\nexport const CommentItemActions = forwardRef<HTMLDivElement, CommentItemActionsProps>(\n ({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n if (variant === 'embed') return null;\n\n return (\n <div\n ref={ref}\n data-slot=\"comment-item-actions\"\n className={cn(commentItemActionsLayout[variant], className)}\n {...props}\n />\n );\n },\n);\nCommentItemActions.displayName = 'CommentItemActions';\n","import type { ReactNode } from 'react';\n\nimport { ArrivalScope, useWatched } from '@/ds/components/Arrival';\n\nimport './comment-arrival.css';\n\n/** A comment the reader watched land rises into place; one that was already there just appears. */\nexport function CommentArrival({ children }: { children: ReactNode }) {\n const watched = useWatched();\n\n return (\n <div data-slot=\"comment-arrival\" className={watched ? 'mastra-comment-arriving' : undefined}>\n <ArrivalScope>{children}</ArrivalScope>\n </div>\n );\n}\n","import { ArrowUp } from 'lucide-react';\nimport type { ComponentPropsWithoutRef, ReactNode } from 'react';\nimport { forwardRef } from 'react';\n\nimport { useCommentVariant } from './comment-context';\nimport type { CommentVariant } from './comment-context';\nimport { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from '@/ds/components/InputGroup';\nimport type { InputGroupButtonProps, InputGroupInputProps } from '@/ds/components/InputGroup';\nimport type { ControlSize } from '@/ds/primitives/control-size';\nimport { cn } from '@/lib/utils';\n\nexport type CommentComposerProps = ComponentPropsWithoutRef<'form'>;\n\nexport const CommentComposer = forwardRef<HTMLFormElement, CommentComposerProps>(({ className, ...props }, ref) => (\n <form ref={ref} data-slot=\"comment-composer\" className={cn('flex w-full items-center gap-2', className)} {...props} />\n));\nCommentComposer.displayName = 'CommentComposer';\n\nconst composerSize: Record<CommentVariant, ControlSize> = {\n default: 'md',\n embed: 'sm',\n thread: 'md',\n};\n\nconst composerInputVariant: Record<CommentVariant, 'default' | 'outline'> = {\n default: 'outline',\n embed: 'default',\n thread: 'outline',\n};\n\nexport interface CommentComposerInputProps extends InputGroupInputProps {\n /** Layout classes for the surrounding InputGroup. */\n groupClassName?: string;\n children?: ReactNode;\n}\n\nexport const CommentComposerInput = forwardRef<HTMLInputElement, CommentComposerInputProps>(\n ({ groupClassName, children, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <InputGroup size={composerSize[variant]} variant={composerInputVariant[variant]} className={groupClassName}>\n <InputGroupInput ref={ref} data-slot=\"comment-composer-input\" {...props} />\n {children}\n </InputGroup>\n );\n },\n);\nCommentComposerInput.displayName = 'CommentComposerInput';\n\nexport type CommentComposerSendProps = Omit<InputGroupButtonProps, 'children'>;\n\nexport const CommentComposerSend = forwardRef<HTMLButtonElement, CommentComposerSendProps>(\n ({ 'aria-label': ariaLabel = 'Send comment', type = 'submit', ...props }, ref) => (\n <InputGroupAddon align=\"inline-end\">\n <InputGroupButton ref={ref} data-slot=\"comment-composer-send\" type={type} aria-label={ariaLabel} {...props}>\n <ArrowUp />\n </InputGroupButton>\n </InputGroupAddon>\n ),\n);\nCommentComposerSend.displayName = 'CommentComposerSend';\n","import { useState } from 'react';\nimport type { KeyboardEvent } from 'react';\n\nimport { Button } from '@/ds/components/Button';\nimport { cn } from '@/lib/utils';\n\nexport interface CommentEditorProps {\n initialBody: string;\n /** Handed the trimmed draft. Closing is the caller's call, so a save that failed keeps what was typed. */\n onSave: (body: string) => void;\n onClose: () => void;\n /** The caller's save in flight: the box locks until it settles. */\n isPending?: boolean;\n /** Why the caller's last save failed. */\n error?: string;\n 'aria-label'?: string;\n className?: string;\n}\n\n/** Owns the draft only; whether a save landed is the caller's mutation to report. */\nexport function CommentEditor({\n initialBody,\n onSave,\n onClose,\n isPending = false,\n error,\n 'aria-label': ariaLabel = 'Edit comment',\n className,\n}: CommentEditorProps) {\n const [draft, setDraft] = useState(initialBody);\n const body = draft.trim();\n const canSave = body.length > 0 && !isPending;\n\n const save = () => {\n if (!canSave) return;\n if (body === initialBody) {\n onClose();\n return;\n }\n onSave(body);\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n // An IME commit fires Enter mid-composition; acting on it would save half a word.\n if (event.nativeEvent.isComposing) return;\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n save();\n }\n };\n\n return (\n <div data-slot=\"comment-editor\" className={cn('mt-1 flex flex-col gap-1.5', className)}>\n <div className=\"relative\">\n <textarea\n value={draft}\n onChange={event => setDraft(event.target.value)}\n onKeyDown={onKeyDown}\n readOnly={isPending}\n aria-label={ariaLabel}\n rows={2}\n className=\"border-border1 bg-surface2 text-ui-sm text-neutral6 focus:border-border2 block field-sizing-content max-h-40 w-full resize-none overflow-y-auto rounded-lg border px-2 pt-1.5 pb-9 outline-none\"\n />\n {/* Opaque, so a scrolled line passes behind the actions instead of under them. */}\n <div className=\"bg-surface2 absolute inset-x-px bottom-px flex items-center justify-end gap-1 rounded-b-lg px-1.5 pt-1 pb-1.5\">\n <Button type=\"button\" variant=\"ghost\" size=\"xs\" disabled={isPending} onClick={onClose}>\n Cancel\n </Button>\n <Button type=\"button\" variant=\"outline\" size=\"xs\" disabled={!canSave} onClick={save}>\n {isPending ? 'Saving…' : 'Save'}\n </Button>\n </div>\n </div>\n {error ? (\n <p role=\"alert\" className=\"text-ui-xs text-error m-0\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n","import { X } from 'lucide-react';\n\nimport { Button } from '@/ds/components/Button';\nimport { cn } from '@/lib/utils';\n\nexport interface CommentQuoteProps {\n authorName?: string;\n quote: string;\n /** Given only while the quote is a draft the writer can still drop. */\n onDismiss?: () => void;\n className?: string;\n}\n\n/** The passage a reply answers, above the reply itself or inside the composer writing it. */\nexport function CommentQuote({ authorName, quote, onDismiss, className }: CommentQuoteProps) {\n return (\n <blockquote\n data-slot=\"comment-quote\"\n className={cn('m-0 flex min-w-0 gap-2 border-l-2 border-border2 pl-2 text-ui-xs text-neutral3', className)}\n >\n <span className=\"min-w-0 flex-1\">\n {authorName ? <span className=\"text-neutral4 font-medium\">{authorName} </span> : null}\n <span className=\"line-clamp-2 wrap-anywhere whitespace-pre-line\">{quote}</span>\n </span>\n {onDismiss ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label=\"Remove quote\"\n onClick={onDismiss}\n className=\"shrink-0\"\n >\n <X size={12} aria-hidden />\n </Button>\n ) : null}\n </blockquote>\n );\n}\n"],"names":["createContext","useContext","cva","forwardRef","jsx","cn","Txt","useWatched","ArrivalScope","jsxs","InputGroup","InputGroupInput","InputGroupAddon","InputGroupButton","ArrowUp","useState","Button","X"],"mappings":"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"}
@@ -272,7 +272,7 @@ function CommentEditor({
272
272
  readOnly: isPending,
273
273
  "aria-label": ariaLabel,
274
274
  rows: 2,
275
- className: "text-neutral6 border-border1 bg-surface2 text-ui-sm focus:border-border2 block field-sizing-content max-h-40 w-full resize-none overflow-y-auto rounded-lg border px-2 pt-1.5 pb-9 outline-none"
275
+ className: "border-border1 bg-surface2 text-ui-sm text-neutral6 focus:border-border2 block field-sizing-content max-h-40 w-full resize-none overflow-y-auto rounded-lg border px-2 pt-1.5 pb-9 outline-none"
276
276
  }
277
277
  ),
278
278
  /* @__PURE__ */ jsxs("div", { className: "bg-surface2 absolute inset-x-px bottom-px flex items-center justify-end gap-1 rounded-b-lg px-1.5 pt-1 pb-1.5", children: [
@@ -289,7 +289,7 @@ function CommentQuote({ authorName, quote, onDismiss, className }) {
289
289
  "blockquote",
290
290
  {
291
291
  "data-slot": "comment-quote",
292
- className: cn("text-neutral3 m-0 flex min-w-0 gap-2 border-l-2 border-border2 pl-2 text-ui-xs", className),
292
+ className: cn("m-0 flex min-w-0 gap-2 border-l-2 border-border2 pl-2 text-ui-xs text-neutral3", className),
293
293
  children: [
294
294
  /* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
295
295
  authorName ? /* @__PURE__ */ jsxs("span", { className: "text-neutral4 font-medium", children: [
@@ -1 +1 @@
1
- {"version":3,"file":"Comment.es.js","sources":["../../src/ds/components/Comment/comment-context.ts","../../src/ds/components/Comment/comment.tsx","../../src/ds/components/Comment/comment-arrival.tsx","../../src/ds/components/Comment/comment-composer.tsx","../../src/ds/components/Comment/comment-editor.tsx","../../src/ds/components/Comment/comment-quote.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nexport type CommentVariant = 'default' | 'embed' | 'thread';\n\nexport const CommentContext = createContext<CommentVariant | null>(null);\n\nexport function useCommentVariant(): CommentVariant {\n const variant = useContext(CommentContext);\n if (!variant) throw new Error('Comment compounds must be rendered within Comment');\n return variant;\n}\n","import { cva } from 'class-variance-authority';\nimport type { ComponentPropsWithoutRef, HTMLAttributes } from 'react';\nimport { forwardRef } from 'react';\n\nimport { CommentContext, useCommentVariant } from './comment-context';\nimport type { CommentVariant } from './comment-context';\nimport { Txt } from '@/ds/components/Txt';\nimport type { TxtProps } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nconst commentVariants = cva('flex flex-col', {\n variants: {\n variant: {\n default: 'gap-2',\n embed: 'gap-1 rounded-xl border border-border1 bg-surface3 p-3',\n thread: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\nexport interface CommentProps extends ComponentPropsWithoutRef<'div'> {\n variant?: CommentVariant;\n}\n\nexport const Comment = forwardRef<HTMLDivElement, CommentProps>(({ className, variant = 'default', ...props }, ref) => (\n <CommentContext.Provider value={variant}>\n <div\n ref={ref}\n data-slot=\"comment\"\n data-variant={variant}\n className={cn(commentVariants({ variant }), className)}\n {...props}\n />\n </CommentContext.Provider>\n));\nComment.displayName = 'Comment';\n\nconst commentListGap: Record<CommentVariant, string> = {\n default: 'gap-3',\n embed: 'gap-2',\n thread: '',\n};\n\nexport type CommentListProps = ComponentPropsWithoutRef<'ul'>;\n\nexport const CommentList = forwardRef<HTMLUListElement, CommentListProps>(({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <ul\n ref={ref}\n data-slot=\"comment-list\"\n className={cn('flex flex-col', commentListGap[variant], className)}\n {...props}\n />\n );\n});\nCommentList.displayName = 'CommentList';\n\nconst commentItemLayout: Record<CommentVariant, string> = {\n default: 'flex flex-col gap-1',\n embed: 'flex flex-col gap-1',\n thread: 'relative flex gap-2 rounded-lg px-2 hover:bg-surface3/60',\n};\n\nexport interface CommentItemProps extends HTMLAttributes<HTMLElement> {\n /** Same author moments after the row above: the header is dropped and the row tightens. */\n continued?: boolean;\n /** The comment a link pointed at. */\n highlighted?: boolean;\n}\n\nexport const CommentItem = forwardRef<HTMLElement, CommentItemProps>(\n ({ className, continued = false, highlighted = false, ...props }, ref) => {\n const variant = useCommentVariant();\n // A thread row is a stream entry among runs and moves, not a list item.\n const Root = variant === 'thread' ? 'div' : 'li';\n\n return (\n <Root\n // Cast needed: `Root` is polymorphic, so TS narrows the expected ref to a single element type.\n ref={ref as never}\n data-slot=\"comment-item\"\n className={cn(\n 'group/comment-item',\n commentItemLayout[variant],\n variant === 'thread' && (continued ? 'py-0.5' : 'py-1.5'),\n highlighted && 'bg-accent1/10',\n className,\n )}\n {...props}\n />\n );\n },\n);\nCommentItem.displayName = 'CommentItem';\n\nexport type CommentItemAvatarProps = ComponentPropsWithoutRef<'div'>;\n\n/** Fixed gutter: left empty on a continuation row, it keeps the body aligned under the avatar above. */\nexport const CommentItemAvatar = forwardRef<HTMLDivElement, CommentItemAvatarProps>(({ className, ...props }, ref) => (\n <div ref={ref} data-slot=\"comment-item-avatar\" className={cn('w-6 shrink-0 pt-0.5', className)} {...props} />\n));\nCommentItemAvatar.displayName = 'CommentItemAvatar';\n\nexport type CommentItemContentProps = ComponentPropsWithoutRef<'div'>;\n\n/** Everything beside the gutter, stacked and free to shrink so long words wrap instead of widening the row. */\nexport const CommentItemContent = forwardRef<HTMLDivElement, CommentItemContentProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} data-slot=\"comment-item-content\" className={cn('min-w-0 flex-1', className)} {...props} />\n ),\n);\nCommentItemContent.displayName = 'CommentItemContent';\n\nconst commentItemHeaderLayout: Record<CommentVariant, string> = {\n default: 'flex items-center gap-2',\n embed: 'flex items-center gap-2',\n thread: 'flex items-baseline gap-1.5',\n};\n\nexport type CommentItemHeaderProps = ComponentPropsWithoutRef<'div'>;\n\nexport const CommentItemHeader = forwardRef<HTMLDivElement, CommentItemHeaderProps>(({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <div\n ref={ref}\n data-slot=\"comment-item-header\"\n className={cn(commentItemHeaderLayout[variant], className)}\n {...props}\n />\n );\n});\nCommentItemHeader.displayName = 'CommentItemHeader';\n\nconst commentItemAuthorSize: Record<CommentVariant, TxtProps['variant']> = {\n default: 'ui-md',\n embed: 'ui-md',\n thread: 'ui-sm',\n};\n\nconst commentItemAuthorTone: Record<CommentVariant, string> = {\n default: 'font-medium text-neutral6',\n embed: 'font-medium text-neutral6',\n thread: 'truncate font-medium text-neutral6',\n};\n\nexport type CommentItemAuthorProps = ComponentPropsWithoutRef<'span'>;\n\nexport const CommentItemAuthor = forwardRef<HTMLElement, CommentItemAuthorProps>(({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <Txt\n ref={ref}\n as=\"span\"\n variant={commentItemAuthorSize[variant]}\n data-slot=\"comment-item-author\"\n className={cn(commentItemAuthorTone[variant], className)}\n {...props}\n />\n );\n});\nCommentItemAuthor.displayName = 'CommentItemAuthor';\n\nconst commentItemTimestampTone: Record<CommentVariant, string> = {\n default: 'text-ui-sm leading-ui-sm text-neutral3',\n embed: 'text-ui-sm leading-ui-sm text-neutral3',\n thread: 'text-ui-xs leading-ui-xs text-neutral2 shrink-0',\n};\n\nexport type CommentItemTimestampProps = ComponentPropsWithoutRef<'time'>;\n\nexport const CommentItemTimestamp = forwardRef<HTMLTimeElement, CommentItemTimestampProps>(\n ({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <time\n ref={ref}\n data-slot=\"comment-item-timestamp\"\n className={cn(commentItemTimestampTone[variant], className)}\n {...props}\n />\n );\n },\n);\nCommentItemTimestamp.displayName = 'CommentItemTimestamp';\n\nconst commentItemBodySize: Record<CommentVariant, TxtProps['variant']> = {\n default: 'ui-md',\n embed: 'ui-md',\n thread: 'ui-sm',\n};\n\nconst commentItemBodyTone: Record<CommentVariant, string> = {\n default: 'whitespace-pre-wrap text-neutral6 border-l border-border1 pl-3',\n embed: 'whitespace-pre-wrap text-neutral6',\n thread: '',\n};\n\nexport type CommentItemBodyProps = ComponentPropsWithoutRef<'p'>;\n\nexport const CommentItemBody = forwardRef<HTMLElement, CommentItemBodyProps>(({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <Txt\n ref={ref}\n // Rendered markdown brings its own blocks, which a paragraph cannot hold.\n as={variant === 'thread' ? 'div' : 'p'}\n variant={commentItemBodySize[variant]}\n data-slot=\"comment-item-body\"\n className={cn(commentItemBodyTone[variant], className)}\n {...props}\n />\n );\n});\nCommentItemBody.displayName = 'CommentItemBody';\n\nconst commentItemActionsLayout: Record<CommentVariant, string> = {\n default:\n 'flex items-center gap-1 opacity-0 group-focus-within/comment-item:opacity-100 group-hover/comment-item:opacity-100 motion-safe:transition-opacity',\n embed: '',\n // Hung over the row's own top edge, so it never reflows the body it floats above.\n // `pointer-fine` only: a touch screen has no hover to reveal it with.\n thread:\n 'bg-surface2 border-border1 absolute -top-2 right-2 flex items-center gap-0.5 rounded-lg border px-0.5 transition-opacity duration-200 ease-out motion-reduce:transition-none pointer-fine:opacity-0 pointer-fine:group-focus-within/comment-item:opacity-100 pointer-fine:group-hover/comment-item:opacity-100',\n};\n\nexport type CommentItemActionsProps = ComponentPropsWithoutRef<'div'>;\n\n/** Hidden in the `embed` variant, which drops per-item actions. */\nexport const CommentItemActions = forwardRef<HTMLDivElement, CommentItemActionsProps>(\n ({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n if (variant === 'embed') return null;\n\n return (\n <div\n ref={ref}\n data-slot=\"comment-item-actions\"\n className={cn(commentItemActionsLayout[variant], className)}\n {...props}\n />\n );\n },\n);\nCommentItemActions.displayName = 'CommentItemActions';\n","import type { ReactNode } from 'react';\n\nimport { ArrivalScope, useWatched } from '@/ds/components/Arrival';\n\nimport './comment-arrival.css';\n\n/** A comment the reader watched land rises into place; one that was already there just appears. */\nexport function CommentArrival({ children }: { children: ReactNode }) {\n const watched = useWatched();\n\n return (\n <div data-slot=\"comment-arrival\" className={watched ? 'mastra-comment-arriving' : undefined}>\n <ArrivalScope>{children}</ArrivalScope>\n </div>\n );\n}\n","import { ArrowUp } from 'lucide-react';\nimport type { ComponentPropsWithoutRef, ReactNode } from 'react';\nimport { forwardRef } from 'react';\n\nimport { useCommentVariant } from './comment-context';\nimport type { CommentVariant } from './comment-context';\nimport { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from '@/ds/components/InputGroup';\nimport type { InputGroupButtonProps, InputGroupInputProps } from '@/ds/components/InputGroup';\nimport type { ControlSize } from '@/ds/primitives/control-size';\nimport { cn } from '@/lib/utils';\n\nexport type CommentComposerProps = ComponentPropsWithoutRef<'form'>;\n\nexport const CommentComposer = forwardRef<HTMLFormElement, CommentComposerProps>(({ className, ...props }, ref) => (\n <form ref={ref} data-slot=\"comment-composer\" className={cn('flex w-full items-center gap-2', className)} {...props} />\n));\nCommentComposer.displayName = 'CommentComposer';\n\nconst composerSize: Record<CommentVariant, ControlSize> = {\n default: 'md',\n embed: 'sm',\n thread: 'md',\n};\n\nconst composerInputVariant: Record<CommentVariant, 'default' | 'outline'> = {\n default: 'outline',\n embed: 'default',\n thread: 'outline',\n};\n\nexport interface CommentComposerInputProps extends InputGroupInputProps {\n /** Layout classes for the surrounding InputGroup. */\n groupClassName?: string;\n children?: ReactNode;\n}\n\nexport const CommentComposerInput = forwardRef<HTMLInputElement, CommentComposerInputProps>(\n ({ groupClassName, children, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <InputGroup size={composerSize[variant]} variant={composerInputVariant[variant]} className={groupClassName}>\n <InputGroupInput ref={ref} data-slot=\"comment-composer-input\" {...props} />\n {children}\n </InputGroup>\n );\n },\n);\nCommentComposerInput.displayName = 'CommentComposerInput';\n\nexport type CommentComposerSendProps = Omit<InputGroupButtonProps, 'children'>;\n\nexport const CommentComposerSend = forwardRef<HTMLButtonElement, CommentComposerSendProps>(\n ({ 'aria-label': ariaLabel = 'Send comment', type = 'submit', ...props }, ref) => (\n <InputGroupAddon align=\"inline-end\">\n <InputGroupButton ref={ref} data-slot=\"comment-composer-send\" type={type} aria-label={ariaLabel} {...props}>\n <ArrowUp />\n </InputGroupButton>\n </InputGroupAddon>\n ),\n);\nCommentComposerSend.displayName = 'CommentComposerSend';\n","import { useState } from 'react';\nimport type { KeyboardEvent } from 'react';\n\nimport { Button } from '@/ds/components/Button';\nimport { cn } from '@/lib/utils';\n\nexport interface CommentEditorProps {\n initialBody: string;\n /** Handed the trimmed draft. Closing is the caller's call, so a save that failed keeps what was typed. */\n onSave: (body: string) => void;\n onClose: () => void;\n /** The caller's save in flight: the box locks until it settles. */\n isPending?: boolean;\n /** Why the caller's last save failed. */\n error?: string;\n 'aria-label'?: string;\n className?: string;\n}\n\n/** Owns the draft only; whether a save landed is the caller's mutation to report. */\nexport function CommentEditor({\n initialBody,\n onSave,\n onClose,\n isPending = false,\n error,\n 'aria-label': ariaLabel = 'Edit comment',\n className,\n}: CommentEditorProps) {\n const [draft, setDraft] = useState(initialBody);\n const body = draft.trim();\n const canSave = body.length > 0 && !isPending;\n\n const save = () => {\n if (!canSave) return;\n if (body === initialBody) {\n onClose();\n return;\n }\n onSave(body);\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n // An IME commit fires Enter mid-composition; acting on it would save half a word.\n if (event.nativeEvent.isComposing) return;\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n save();\n }\n };\n\n return (\n <div data-slot=\"comment-editor\" className={cn('mt-1 flex flex-col gap-1.5', className)}>\n <div className=\"relative\">\n <textarea\n value={draft}\n onChange={event => setDraft(event.target.value)}\n onKeyDown={onKeyDown}\n readOnly={isPending}\n aria-label={ariaLabel}\n rows={2}\n className=\"text-neutral6 border-border1 bg-surface2 text-ui-sm focus:border-border2 block field-sizing-content max-h-40 w-full resize-none overflow-y-auto rounded-lg border px-2 pt-1.5 pb-9 outline-none\"\n />\n {/* Opaque, so a scrolled line passes behind the actions instead of under them. */}\n <div className=\"bg-surface2 absolute inset-x-px bottom-px flex items-center justify-end gap-1 rounded-b-lg px-1.5 pt-1 pb-1.5\">\n <Button type=\"button\" variant=\"ghost\" size=\"xs\" disabled={isPending} onClick={onClose}>\n Cancel\n </Button>\n <Button type=\"button\" variant=\"outline\" size=\"xs\" disabled={!canSave} onClick={save}>\n {isPending ? 'Saving…' : 'Save'}\n </Button>\n </div>\n </div>\n {error ? (\n <p role=\"alert\" className=\"text-ui-xs text-error m-0\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n","import { X } from 'lucide-react';\n\nimport { Button } from '@/ds/components/Button';\nimport { cn } from '@/lib/utils';\n\nexport interface CommentQuoteProps {\n authorName?: string;\n quote: string;\n /** Given only while the quote is a draft the writer can still drop. */\n onDismiss?: () => void;\n className?: string;\n}\n\n/** The passage a reply answers, above the reply itself or inside the composer writing it. */\nexport function CommentQuote({ authorName, quote, onDismiss, className }: CommentQuoteProps) {\n return (\n <blockquote\n data-slot=\"comment-quote\"\n className={cn('text-neutral3 m-0 flex min-w-0 gap-2 border-l-2 border-border2 pl-2 text-ui-xs', className)}\n >\n <span className=\"min-w-0 flex-1\">\n {authorName ? <span className=\"text-neutral4 font-medium\">{authorName} </span> : null}\n <span className=\"line-clamp-2 wrap-anywhere whitespace-pre-line\">{quote}</span>\n </span>\n {onDismiss ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label=\"Remove quote\"\n onClick={onDismiss}\n className=\"shrink-0\"\n >\n <X size={12} aria-hidden />\n </Button>\n ) : null}\n </blockquote>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Comment.es.js","sources":["../../src/ds/components/Comment/comment-context.ts","../../src/ds/components/Comment/comment.tsx","../../src/ds/components/Comment/comment-arrival.tsx","../../src/ds/components/Comment/comment-composer.tsx","../../src/ds/components/Comment/comment-editor.tsx","../../src/ds/components/Comment/comment-quote.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nexport type CommentVariant = 'default' | 'embed' | 'thread';\n\nexport const CommentContext = createContext<CommentVariant | null>(null);\n\nexport function useCommentVariant(): CommentVariant {\n const variant = useContext(CommentContext);\n if (!variant) throw new Error('Comment compounds must be rendered within Comment');\n return variant;\n}\n","import { cva } from 'class-variance-authority';\nimport type { ComponentPropsWithoutRef, HTMLAttributes } from 'react';\nimport { forwardRef } from 'react';\n\nimport { CommentContext, useCommentVariant } from './comment-context';\nimport type { CommentVariant } from './comment-context';\nimport { Txt } from '@/ds/components/Txt';\nimport type { TxtProps } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nconst commentVariants = cva('flex flex-col', {\n variants: {\n variant: {\n default: 'gap-2',\n embed: 'gap-1 rounded-xl border border-border1 bg-surface3 p-3',\n thread: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\nexport interface CommentProps extends ComponentPropsWithoutRef<'div'> {\n variant?: CommentVariant;\n}\n\nexport const Comment = forwardRef<HTMLDivElement, CommentProps>(({ className, variant = 'default', ...props }, ref) => (\n <CommentContext.Provider value={variant}>\n <div\n ref={ref}\n data-slot=\"comment\"\n data-variant={variant}\n className={cn(commentVariants({ variant }), className)}\n {...props}\n />\n </CommentContext.Provider>\n));\nComment.displayName = 'Comment';\n\nconst commentListGap: Record<CommentVariant, string> = {\n default: 'gap-3',\n embed: 'gap-2',\n thread: '',\n};\n\nexport type CommentListProps = ComponentPropsWithoutRef<'ul'>;\n\nexport const CommentList = forwardRef<HTMLUListElement, CommentListProps>(({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <ul\n ref={ref}\n data-slot=\"comment-list\"\n className={cn('flex flex-col', commentListGap[variant], className)}\n {...props}\n />\n );\n});\nCommentList.displayName = 'CommentList';\n\nconst commentItemLayout: Record<CommentVariant, string> = {\n default: 'flex flex-col gap-1',\n embed: 'flex flex-col gap-1',\n thread: 'relative flex gap-2 rounded-lg px-2 hover:bg-surface3/60',\n};\n\nexport interface CommentItemProps extends HTMLAttributes<HTMLElement> {\n /** Same author moments after the row above: the header is dropped and the row tightens. */\n continued?: boolean;\n /** The comment a link pointed at. */\n highlighted?: boolean;\n}\n\nexport const CommentItem = forwardRef<HTMLElement, CommentItemProps>(\n ({ className, continued = false, highlighted = false, ...props }, ref) => {\n const variant = useCommentVariant();\n // A thread row is a stream entry among runs and moves, not a list item.\n const Root = variant === 'thread' ? 'div' : 'li';\n\n return (\n <Root\n // Cast needed: `Root` is polymorphic, so TS narrows the expected ref to a single element type.\n ref={ref as never}\n data-slot=\"comment-item\"\n className={cn(\n 'group/comment-item',\n commentItemLayout[variant],\n variant === 'thread' && (continued ? 'py-0.5' : 'py-1.5'),\n highlighted && 'bg-accent1/10',\n className,\n )}\n {...props}\n />\n );\n },\n);\nCommentItem.displayName = 'CommentItem';\n\nexport type CommentItemAvatarProps = ComponentPropsWithoutRef<'div'>;\n\n/** Fixed gutter: left empty on a continuation row, it keeps the body aligned under the avatar above. */\nexport const CommentItemAvatar = forwardRef<HTMLDivElement, CommentItemAvatarProps>(({ className, ...props }, ref) => (\n <div ref={ref} data-slot=\"comment-item-avatar\" className={cn('w-6 shrink-0 pt-0.5', className)} {...props} />\n));\nCommentItemAvatar.displayName = 'CommentItemAvatar';\n\nexport type CommentItemContentProps = ComponentPropsWithoutRef<'div'>;\n\n/** Everything beside the gutter, stacked and free to shrink so long words wrap instead of widening the row. */\nexport const CommentItemContent = forwardRef<HTMLDivElement, CommentItemContentProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} data-slot=\"comment-item-content\" className={cn('min-w-0 flex-1', className)} {...props} />\n ),\n);\nCommentItemContent.displayName = 'CommentItemContent';\n\nconst commentItemHeaderLayout: Record<CommentVariant, string> = {\n default: 'flex items-center gap-2',\n embed: 'flex items-center gap-2',\n thread: 'flex items-baseline gap-1.5',\n};\n\nexport type CommentItemHeaderProps = ComponentPropsWithoutRef<'div'>;\n\nexport const CommentItemHeader = forwardRef<HTMLDivElement, CommentItemHeaderProps>(({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <div\n ref={ref}\n data-slot=\"comment-item-header\"\n className={cn(commentItemHeaderLayout[variant], className)}\n {...props}\n />\n );\n});\nCommentItemHeader.displayName = 'CommentItemHeader';\n\nconst commentItemAuthorSize: Record<CommentVariant, TxtProps['variant']> = {\n default: 'ui-md',\n embed: 'ui-md',\n thread: 'ui-sm',\n};\n\nconst commentItemAuthorTone: Record<CommentVariant, string> = {\n default: 'font-medium text-neutral6',\n embed: 'font-medium text-neutral6',\n thread: 'truncate font-medium text-neutral6',\n};\n\nexport type CommentItemAuthorProps = ComponentPropsWithoutRef<'span'>;\n\nexport const CommentItemAuthor = forwardRef<HTMLElement, CommentItemAuthorProps>(({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <Txt\n ref={ref}\n as=\"span\"\n variant={commentItemAuthorSize[variant]}\n data-slot=\"comment-item-author\"\n className={cn(commentItemAuthorTone[variant], className)}\n {...props}\n />\n );\n});\nCommentItemAuthor.displayName = 'CommentItemAuthor';\n\nconst commentItemTimestampTone: Record<CommentVariant, string> = {\n default: 'text-ui-sm leading-ui-sm text-neutral3',\n embed: 'text-ui-sm leading-ui-sm text-neutral3',\n thread: 'text-ui-xs leading-ui-xs text-neutral2 shrink-0',\n};\n\nexport type CommentItemTimestampProps = ComponentPropsWithoutRef<'time'>;\n\nexport const CommentItemTimestamp = forwardRef<HTMLTimeElement, CommentItemTimestampProps>(\n ({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <time\n ref={ref}\n data-slot=\"comment-item-timestamp\"\n className={cn(commentItemTimestampTone[variant], className)}\n {...props}\n />\n );\n },\n);\nCommentItemTimestamp.displayName = 'CommentItemTimestamp';\n\nconst commentItemBodySize: Record<CommentVariant, TxtProps['variant']> = {\n default: 'ui-md',\n embed: 'ui-md',\n thread: 'ui-sm',\n};\n\nconst commentItemBodyTone: Record<CommentVariant, string> = {\n default: 'whitespace-pre-wrap text-neutral6 border-l border-border1 pl-3',\n embed: 'whitespace-pre-wrap text-neutral6',\n thread: '',\n};\n\nexport type CommentItemBodyProps = ComponentPropsWithoutRef<'p'>;\n\nexport const CommentItemBody = forwardRef<HTMLElement, CommentItemBodyProps>(({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <Txt\n ref={ref}\n // Rendered markdown brings its own blocks, which a paragraph cannot hold.\n as={variant === 'thread' ? 'div' : 'p'}\n variant={commentItemBodySize[variant]}\n data-slot=\"comment-item-body\"\n className={cn(commentItemBodyTone[variant], className)}\n {...props}\n />\n );\n});\nCommentItemBody.displayName = 'CommentItemBody';\n\nconst commentItemActionsLayout: Record<CommentVariant, string> = {\n default:\n 'flex items-center gap-1 opacity-0 group-focus-within/comment-item:opacity-100 group-hover/comment-item:opacity-100 motion-safe:transition-opacity',\n embed: '',\n // Hung over the row's own top edge, so it never reflows the body it floats above.\n // `pointer-fine` only: a touch screen has no hover to reveal it with.\n thread:\n 'bg-surface2 border-border1 absolute -top-2 right-2 flex items-center gap-0.5 rounded-lg border px-0.5 transition-opacity duration-200 ease-out motion-reduce:transition-none pointer-fine:opacity-0 pointer-fine:group-focus-within/comment-item:opacity-100 pointer-fine:group-hover/comment-item:opacity-100',\n};\n\nexport type CommentItemActionsProps = ComponentPropsWithoutRef<'div'>;\n\n/** Hidden in the `embed` variant, which drops per-item actions. */\nexport const CommentItemActions = forwardRef<HTMLDivElement, CommentItemActionsProps>(\n ({ className, ...props }, ref) => {\n const variant = useCommentVariant();\n if (variant === 'embed') return null;\n\n return (\n <div\n ref={ref}\n data-slot=\"comment-item-actions\"\n className={cn(commentItemActionsLayout[variant], className)}\n {...props}\n />\n );\n },\n);\nCommentItemActions.displayName = 'CommentItemActions';\n","import type { ReactNode } from 'react';\n\nimport { ArrivalScope, useWatched } from '@/ds/components/Arrival';\n\nimport './comment-arrival.css';\n\n/** A comment the reader watched land rises into place; one that was already there just appears. */\nexport function CommentArrival({ children }: { children: ReactNode }) {\n const watched = useWatched();\n\n return (\n <div data-slot=\"comment-arrival\" className={watched ? 'mastra-comment-arriving' : undefined}>\n <ArrivalScope>{children}</ArrivalScope>\n </div>\n );\n}\n","import { ArrowUp } from 'lucide-react';\nimport type { ComponentPropsWithoutRef, ReactNode } from 'react';\nimport { forwardRef } from 'react';\n\nimport { useCommentVariant } from './comment-context';\nimport type { CommentVariant } from './comment-context';\nimport { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from '@/ds/components/InputGroup';\nimport type { InputGroupButtonProps, InputGroupInputProps } from '@/ds/components/InputGroup';\nimport type { ControlSize } from '@/ds/primitives/control-size';\nimport { cn } from '@/lib/utils';\n\nexport type CommentComposerProps = ComponentPropsWithoutRef<'form'>;\n\nexport const CommentComposer = forwardRef<HTMLFormElement, CommentComposerProps>(({ className, ...props }, ref) => (\n <form ref={ref} data-slot=\"comment-composer\" className={cn('flex w-full items-center gap-2', className)} {...props} />\n));\nCommentComposer.displayName = 'CommentComposer';\n\nconst composerSize: Record<CommentVariant, ControlSize> = {\n default: 'md',\n embed: 'sm',\n thread: 'md',\n};\n\nconst composerInputVariant: Record<CommentVariant, 'default' | 'outline'> = {\n default: 'outline',\n embed: 'default',\n thread: 'outline',\n};\n\nexport interface CommentComposerInputProps extends InputGroupInputProps {\n /** Layout classes for the surrounding InputGroup. */\n groupClassName?: string;\n children?: ReactNode;\n}\n\nexport const CommentComposerInput = forwardRef<HTMLInputElement, CommentComposerInputProps>(\n ({ groupClassName, children, ...props }, ref) => {\n const variant = useCommentVariant();\n\n return (\n <InputGroup size={composerSize[variant]} variant={composerInputVariant[variant]} className={groupClassName}>\n <InputGroupInput ref={ref} data-slot=\"comment-composer-input\" {...props} />\n {children}\n </InputGroup>\n );\n },\n);\nCommentComposerInput.displayName = 'CommentComposerInput';\n\nexport type CommentComposerSendProps = Omit<InputGroupButtonProps, 'children'>;\n\nexport const CommentComposerSend = forwardRef<HTMLButtonElement, CommentComposerSendProps>(\n ({ 'aria-label': ariaLabel = 'Send comment', type = 'submit', ...props }, ref) => (\n <InputGroupAddon align=\"inline-end\">\n <InputGroupButton ref={ref} data-slot=\"comment-composer-send\" type={type} aria-label={ariaLabel} {...props}>\n <ArrowUp />\n </InputGroupButton>\n </InputGroupAddon>\n ),\n);\nCommentComposerSend.displayName = 'CommentComposerSend';\n","import { useState } from 'react';\nimport type { KeyboardEvent } from 'react';\n\nimport { Button } from '@/ds/components/Button';\nimport { cn } from '@/lib/utils';\n\nexport interface CommentEditorProps {\n initialBody: string;\n /** Handed the trimmed draft. Closing is the caller's call, so a save that failed keeps what was typed. */\n onSave: (body: string) => void;\n onClose: () => void;\n /** The caller's save in flight: the box locks until it settles. */\n isPending?: boolean;\n /** Why the caller's last save failed. */\n error?: string;\n 'aria-label'?: string;\n className?: string;\n}\n\n/** Owns the draft only; whether a save landed is the caller's mutation to report. */\nexport function CommentEditor({\n initialBody,\n onSave,\n onClose,\n isPending = false,\n error,\n 'aria-label': ariaLabel = 'Edit comment',\n className,\n}: CommentEditorProps) {\n const [draft, setDraft] = useState(initialBody);\n const body = draft.trim();\n const canSave = body.length > 0 && !isPending;\n\n const save = () => {\n if (!canSave) return;\n if (body === initialBody) {\n onClose();\n return;\n }\n onSave(body);\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n // An IME commit fires Enter mid-composition; acting on it would save half a word.\n if (event.nativeEvent.isComposing) return;\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n save();\n }\n };\n\n return (\n <div data-slot=\"comment-editor\" className={cn('mt-1 flex flex-col gap-1.5', className)}>\n <div className=\"relative\">\n <textarea\n value={draft}\n onChange={event => setDraft(event.target.value)}\n onKeyDown={onKeyDown}\n readOnly={isPending}\n aria-label={ariaLabel}\n rows={2}\n className=\"border-border1 bg-surface2 text-ui-sm text-neutral6 focus:border-border2 block field-sizing-content max-h-40 w-full resize-none overflow-y-auto rounded-lg border px-2 pt-1.5 pb-9 outline-none\"\n />\n {/* Opaque, so a scrolled line passes behind the actions instead of under them. */}\n <div className=\"bg-surface2 absolute inset-x-px bottom-px flex items-center justify-end gap-1 rounded-b-lg px-1.5 pt-1 pb-1.5\">\n <Button type=\"button\" variant=\"ghost\" size=\"xs\" disabled={isPending} onClick={onClose}>\n Cancel\n </Button>\n <Button type=\"button\" variant=\"outline\" size=\"xs\" disabled={!canSave} onClick={save}>\n {isPending ? 'Saving…' : 'Save'}\n </Button>\n </div>\n </div>\n {error ? (\n <p role=\"alert\" className=\"text-ui-xs text-error m-0\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n","import { X } from 'lucide-react';\n\nimport { Button } from '@/ds/components/Button';\nimport { cn } from '@/lib/utils';\n\nexport interface CommentQuoteProps {\n authorName?: string;\n quote: string;\n /** Given only while the quote is a draft the writer can still drop. */\n onDismiss?: () => void;\n className?: string;\n}\n\n/** The passage a reply answers, above the reply itself or inside the composer writing it. */\nexport function CommentQuote({ authorName, quote, onDismiss, className }: CommentQuoteProps) {\n return (\n <blockquote\n data-slot=\"comment-quote\"\n className={cn('m-0 flex min-w-0 gap-2 border-l-2 border-border2 pl-2 text-ui-xs text-neutral3', className)}\n >\n <span className=\"min-w-0 flex-1\">\n {authorName ? <span className=\"text-neutral4 font-medium\">{authorName} </span> : null}\n <span className=\"line-clamp-2 wrap-anywhere whitespace-pre-line\">{quote}</span>\n </span>\n {onDismiss ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label=\"Remove quote\"\n onClick={onDismiss}\n className=\"shrink-0\"\n >\n <X size={12} aria-hidden />\n </Button>\n ) : null}\n </blockquote>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
- const dataCodeSection = require('../data-code-section-Dn9smaz4.cjs');
5
+ const dataCodeSection = require('../data-code-section-B_lg_J_0.cjs');
6
6
 
7
7
 
8
8
 
@@ -1,2 +1,2 @@
1
- export { D as DataCodeSection } from '../data-code-section-DN2yPgEz.js';
1
+ export { D as DataCodeSection } from '../data-code-section-Cm_W_XhO.js';
2
2
  //# sourceMappingURL=DataCodeSection.es.js.map
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
- const dataPanel = require('../data-panel-DEatwExN.cjs');
5
+ const dataPanel = require('../data-panel-Cv9j_IGQ.cjs');
6
6
 
7
7
 
8
8
 
@@ -1,2 +1,2 @@
1
- export { D as DataPanel } from '../data-panel-2Da0Utgy.js';
1
+ export { D as DataPanel } from '../data-panel-DXxeSnL1.js';
2
2
  //# sourceMappingURL=DataPanel.es.js.map