@flanksource/clicky-ui 0.3.44 → 0.3.45

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 (471) hide show
  1. package/README.md +2 -0
  2. package/dist/ai.cjs +4 -2
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +3 -1
  5. package/dist/components/MdxEditorField.cjs +40 -22
  6. package/dist/components/MdxEditorField.cjs.map +1 -1
  7. package/dist/components/MdxEditorField.d.ts.map +1 -1
  8. package/dist/components/MdxEditorField.js +41 -23
  9. package/dist/components/MdxEditorField.js.map +1 -1
  10. package/dist/components/json-schema-form-item-summary.cjs +6 -1
  11. package/dist/components/json-schema-form-item-summary.cjs.map +1 -1
  12. package/dist/components/json-schema-form-item-summary.d.ts.map +1 -1
  13. package/dist/components/json-schema-form-item-summary.js +6 -1
  14. package/dist/components/json-schema-form-item-summary.js.map +1 -1
  15. package/dist/data/CodeBlock.cjs +3 -2
  16. package/dist/data/CodeBlock.cjs.map +1 -1
  17. package/dist/data/CodeBlock.d.ts +3 -1
  18. package/dist/data/CodeBlock.d.ts.map +1 -1
  19. package/dist/data/CodeBlock.js +3 -2
  20. package/dist/data/CodeBlock.js.map +1 -1
  21. package/dist/data/GraphDiagram.cjs +18 -6
  22. package/dist/data/GraphDiagram.cjs.map +1 -1
  23. package/dist/data/GraphDiagram.d.ts +9 -1
  24. package/dist/data/GraphDiagram.d.ts.map +1 -1
  25. package/dist/data/GraphDiagram.js +18 -6
  26. package/dist/data/GraphDiagram.js.map +1 -1
  27. package/dist/data/GraphDiagramNodes.cjs +38 -29
  28. package/dist/data/GraphDiagramNodes.cjs.map +1 -1
  29. package/dist/data/GraphDiagramNodes.d.ts +8 -2
  30. package/dist/data/GraphDiagramNodes.d.ts.map +1 -1
  31. package/dist/data/GraphDiagramNodes.js +38 -29
  32. package/dist/data/GraphDiagramNodes.js.map +1 -1
  33. package/dist/data/JsonView.cjs +118 -49
  34. package/dist/data/JsonView.cjs.map +1 -1
  35. package/dist/data/JsonView.d.ts +13 -10
  36. package/dist/data/JsonView.d.ts.map +1 -1
  37. package/dist/data/JsonView.js +118 -49
  38. package/dist/data/JsonView.js.map +1 -1
  39. package/dist/data/MarkdownEditor.cjs +2 -2
  40. package/dist/data/MarkdownEditor.cjs.map +1 -1
  41. package/dist/data/MarkdownEditor.js +2 -2
  42. package/dist/data/MarkdownEditor.js.map +1 -1
  43. package/dist/data/ai/AdvancedChatConfig.cjs +90 -249
  44. package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -1
  45. package/dist/data/ai/AdvancedChatConfig.d.ts +2 -5
  46. package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -1
  47. package/dist/data/ai/AdvancedChatConfig.js +91 -250
  48. package/dist/data/ai/AdvancedChatConfig.js.map +1 -1
  49. package/dist/data/ai/ChatButton.cjs +2 -0
  50. package/dist/data/ai/ChatButton.cjs.map +1 -1
  51. package/dist/data/ai/ChatButton.d.ts +1 -1
  52. package/dist/data/ai/ChatButton.d.ts.map +1 -1
  53. package/dist/data/ai/ChatButton.js +2 -0
  54. package/dist/data/ai/ChatButton.js.map +1 -1
  55. package/dist/data/ai/ChatFab.cjs +5 -1
  56. package/dist/data/ai/ChatFab.cjs.map +1 -1
  57. package/dist/data/ai/ChatFab.d.ts +5 -1
  58. package/dist/data/ai/ChatFab.d.ts.map +1 -1
  59. package/dist/data/ai/ChatFab.js +5 -1
  60. package/dist/data/ai/ChatFab.js.map +1 -1
  61. package/dist/data/ai/ChatWindow.cjs +2 -8
  62. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  63. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  64. package/dist/data/ai/ChatWindow.js +2 -8
  65. package/dist/data/ai/ChatWindow.js.map +1 -1
  66. package/dist/data/ai/ChatWindow.runtime.cjs +0 -5
  67. package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
  68. package/dist/data/ai/ChatWindow.runtime.d.ts +0 -2
  69. package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
  70. package/dist/data/ai/ChatWindow.runtime.js +0 -5
  71. package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
  72. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +2 -2
  73. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
  74. package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
  75. package/dist/data/ai/PromptRunEditor/runtimeActions.js +2 -2
  76. package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
  77. package/dist/data/ai/SessionInspector.approvals.cjs +3 -6
  78. package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
  79. package/dist/data/ai/SessionInspector.approvals.js +3 -6
  80. package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
  81. package/dist/data/ai/SessionViewer.cjs +13 -4
  82. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  83. package/dist/data/ai/SessionViewer.d.ts +5 -1
  84. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  85. package/dist/data/ai/SessionViewer.header.cjs +1 -1
  86. package/dist/data/ai/SessionViewer.header.cjs.map +1 -1
  87. package/dist/data/ai/SessionViewer.header.js +1 -1
  88. package/dist/data/ai/SessionViewer.header.js.map +1 -1
  89. package/dist/data/ai/SessionViewer.js +13 -4
  90. package/dist/data/ai/SessionViewer.js.map +1 -1
  91. package/dist/data/ai/SessionViewer.model.cjs +2 -0
  92. package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
  93. package/dist/data/ai/SessionViewer.model.d.ts +1 -0
  94. package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
  95. package/dist/data/ai/SessionViewer.model.js +2 -0
  96. package/dist/data/ai/SessionViewer.model.js.map +1 -1
  97. package/dist/data/ai/SessionViewer.rows.cjs +41 -27
  98. package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
  99. package/dist/data/ai/SessionViewer.rows.d.ts +4 -2
  100. package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
  101. package/dist/data/ai/SessionViewer.rows.js +41 -27
  102. package/dist/data/ai/SessionViewer.rows.js.map +1 -1
  103. package/dist/data/ai/SessionViewer.tokens.cjs +35 -0
  104. package/dist/data/ai/SessionViewer.tokens.cjs.map +1 -0
  105. package/dist/data/ai/SessionViewer.tokens.d.ts +5 -0
  106. package/dist/data/ai/SessionViewer.tokens.d.ts.map +1 -0
  107. package/dist/data/ai/SessionViewer.tokens.js +35 -0
  108. package/dist/data/ai/SessionViewer.tokens.js.map +1 -0
  109. package/dist/data/ai/SessionViewer.tool-cost.cjs +128 -0
  110. package/dist/data/ai/SessionViewer.tool-cost.cjs.map +1 -0
  111. package/dist/data/ai/SessionViewer.tool-cost.d.ts +6 -0
  112. package/dist/data/ai/SessionViewer.tool-cost.d.ts.map +1 -0
  113. package/dist/data/ai/SessionViewer.tool-cost.js +128 -0
  114. package/dist/data/ai/SessionViewer.tool-cost.js.map +1 -0
  115. package/dist/data/ai/SessionViewer.tool-details.cjs +3 -1
  116. package/dist/data/ai/SessionViewer.tool-details.cjs.map +1 -1
  117. package/dist/data/ai/SessionViewer.tool-details.d.ts.map +1 -1
  118. package/dist/data/ai/SessionViewer.tool-details.js +3 -1
  119. package/dist/data/ai/SessionViewer.tool-details.js.map +1 -1
  120. package/dist/data/ai/SessionViewer.tool-row.cjs +55 -35
  121. package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
  122. package/dist/data/ai/SessionViewer.tool-row.d.ts +2 -1
  123. package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
  124. package/dist/data/ai/SessionViewer.tool-row.js +55 -35
  125. package/dist/data/ai/SessionViewer.tool-row.js.map +1 -1
  126. package/dist/data/ai/SessionViewer.unified.d.ts +4 -0
  127. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  128. package/dist/data/ai/SessionViewerMenu.cjs +18 -1
  129. package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
  130. package/dist/data/ai/SessionViewerMenu.d.ts +6 -1
  131. package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
  132. package/dist/data/ai/SessionViewerMenu.js +18 -1
  133. package/dist/data/ai/SessionViewerMenu.js.map +1 -1
  134. package/dist/data/ai/ToolPreferences.cjs +149 -143
  135. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  136. package/dist/data/ai/ToolPreferences.d.ts +20 -6
  137. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  138. package/dist/data/ai/ToolPreferences.js +151 -146
  139. package/dist/data/ai/ToolPreferences.js.map +1 -1
  140. package/dist/data/ai/ToolPreferences.model.cjs +14 -10
  141. package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
  142. package/dist/data/ai/ToolPreferences.model.d.ts +1 -0
  143. package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
  144. package/dist/data/ai/ToolPreferences.model.js +15 -11
  145. package/dist/data/ai/ToolPreferences.model.js.map +1 -1
  146. package/dist/data/ai/ToolPreferencesList.cjs +1 -0
  147. package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
  148. package/dist/data/ai/ToolPreferencesList.d.ts +4 -1
  149. package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
  150. package/dist/data/ai/ToolPreferencesList.js +2 -1
  151. package/dist/data/ai/ToolPreferencesList.js.map +1 -1
  152. package/dist/data/ai/ToolSchemaBrowser.cjs +52 -53
  153. package/dist/data/ai/ToolSchemaBrowser.cjs.map +1 -1
  154. package/dist/data/ai/ToolSchemaBrowser.d.ts +6 -3
  155. package/dist/data/ai/ToolSchemaBrowser.d.ts.map +1 -1
  156. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs +9 -13
  157. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs.map +1 -1
  158. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts +5 -2
  159. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts.map +1 -1
  160. package/dist/data/ai/ToolSchemaBrowser.directory-header.js +9 -13
  161. package/dist/data/ai/ToolSchemaBrowser.directory-header.js.map +1 -1
  162. package/dist/data/ai/ToolSchemaBrowser.js +53 -54
  163. package/dist/data/ai/ToolSchemaBrowser.js.map +1 -1
  164. package/dist/data/ai/ToolSchemaBrowser.model.cjs +19 -27
  165. package/dist/data/ai/ToolSchemaBrowser.model.cjs.map +1 -1
  166. package/dist/data/ai/ToolSchemaBrowser.model.d.ts +9 -6
  167. package/dist/data/ai/ToolSchemaBrowser.model.d.ts.map +1 -1
  168. package/dist/data/ai/ToolSchemaBrowser.model.js +20 -28
  169. package/dist/data/ai/ToolSchemaBrowser.model.js.map +1 -1
  170. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs +12 -213
  171. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs.map +1 -1
  172. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts +1 -3
  173. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts.map +1 -1
  174. package/dist/data/ai/ToolSchemaBrowser.sidebar.js +13 -214
  175. package/dist/data/ai/ToolSchemaBrowser.sidebar.js.map +1 -1
  176. package/dist/data/ai/ToolSchemaBrowser.strategies.cjs +54 -0
  177. package/dist/data/ai/ToolSchemaBrowser.strategies.cjs.map +1 -0
  178. package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts +9 -0
  179. package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts.map +1 -0
  180. package/dist/data/ai/ToolSchemaBrowser.strategies.js +54 -0
  181. package/dist/data/ai/ToolSchemaBrowser.strategies.js.map +1 -0
  182. package/dist/data/ai/ToolSchemaBrowser.tree.cjs +179 -0
  183. package/dist/data/ai/ToolSchemaBrowser.tree.cjs.map +1 -0
  184. package/dist/data/ai/ToolSchemaBrowser.tree.d.ts +20 -0
  185. package/dist/data/ai/ToolSchemaBrowser.tree.d.ts.map +1 -0
  186. package/dist/data/ai/ToolSchemaBrowser.tree.js +179 -0
  187. package/dist/data/ai/ToolSchemaBrowser.tree.js.map +1 -0
  188. package/dist/data/ai/index.d.ts +2 -2
  189. package/dist/data/ai/index.d.ts.map +1 -1
  190. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs +8 -28
  191. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs.map +1 -1
  192. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts.map +1 -1
  193. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js +9 -29
  194. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js.map +1 -1
  195. package/dist/data/ai/session-token-sizing.d.ts +32 -0
  196. package/dist/data/ai/session-token-sizing.d.ts.map +1 -0
  197. package/dist/data/ai/use-session-token-sizing.cjs +73 -0
  198. package/dist/data/ai/use-session-token-sizing.cjs.map +1 -0
  199. package/dist/data/ai/use-session-token-sizing.d.ts +21 -0
  200. package/dist/data/ai/use-session-token-sizing.d.ts.map +1 -0
  201. package/dist/data/ai/use-session-token-sizing.js +73 -0
  202. package/dist/data/ai/use-session-token-sizing.js.map +1 -0
  203. package/dist/data/call-graph/CallGraph.cjs +250 -0
  204. package/dist/data/call-graph/CallGraph.cjs.map +1 -0
  205. package/dist/data/call-graph/CallGraph.d.ts +69 -0
  206. package/dist/data/call-graph/CallGraph.d.ts.map +1 -0
  207. package/dist/data/call-graph/CallGraph.js +250 -0
  208. package/dist/data/call-graph/CallGraph.js.map +1 -0
  209. package/dist/data/call-graph/CallGraphGlyphs.cjs +39 -0
  210. package/dist/data/call-graph/CallGraphGlyphs.cjs.map +1 -0
  211. package/dist/data/call-graph/CallGraphGlyphs.d.ts +19 -0
  212. package/dist/data/call-graph/CallGraphGlyphs.d.ts.map +1 -0
  213. package/dist/data/call-graph/CallGraphGlyphs.js +39 -0
  214. package/dist/data/call-graph/CallGraphGlyphs.js.map +1 -0
  215. package/dist/data/call-graph/CallGraphMembers.cjs +50 -0
  216. package/dist/data/call-graph/CallGraphMembers.cjs.map +1 -0
  217. package/dist/data/call-graph/CallGraphMembers.d.ts +22 -0
  218. package/dist/data/call-graph/CallGraphMembers.d.ts.map +1 -0
  219. package/dist/data/call-graph/CallGraphMembers.js +50 -0
  220. package/dist/data/call-graph/CallGraphMembers.js.map +1 -0
  221. package/dist/data/call-graph/CallGraphParts.cjs +204 -0
  222. package/dist/data/call-graph/CallGraphParts.cjs.map +1 -0
  223. package/dist/data/call-graph/CallGraphParts.d.ts +44 -0
  224. package/dist/data/call-graph/CallGraphParts.d.ts.map +1 -0
  225. package/dist/data/call-graph/CallGraphParts.js +204 -0
  226. package/dist/data/call-graph/CallGraphParts.js.map +1 -0
  227. package/dist/data/call-graph/CallGraphToolbar.cjs +186 -0
  228. package/dist/data/call-graph/CallGraphToolbar.cjs.map +1 -0
  229. package/dist/data/call-graph/CallGraphToolbar.d.ts +45 -0
  230. package/dist/data/call-graph/CallGraphToolbar.d.ts.map +1 -0
  231. package/dist/data/call-graph/CallGraphToolbar.js +186 -0
  232. package/dist/data/call-graph/CallGraphToolbar.js.map +1 -0
  233. package/dist/data/call-graph/call-graph-exclude.cjs +75 -0
  234. package/dist/data/call-graph/call-graph-exclude.cjs.map +1 -0
  235. package/dist/data/call-graph/call-graph-exclude.d.ts +31 -0
  236. package/dist/data/call-graph/call-graph-exclude.d.ts.map +1 -0
  237. package/dist/data/call-graph/call-graph-exclude.js +75 -0
  238. package/dist/data/call-graph/call-graph-exclude.js.map +1 -0
  239. package/dist/data/call-graph/call-graph-labels.cjs +96 -0
  240. package/dist/data/call-graph/call-graph-labels.cjs.map +1 -0
  241. package/dist/data/call-graph/call-graph-labels.d.ts +53 -0
  242. package/dist/data/call-graph/call-graph-labels.d.ts.map +1 -0
  243. package/dist/data/call-graph/call-graph-labels.js +96 -0
  244. package/dist/data/call-graph/call-graph-labels.js.map +1 -0
  245. package/dist/data/call-graph/call-graph-model.cjs +161 -0
  246. package/dist/data/call-graph/call-graph-model.cjs.map +1 -0
  247. package/dist/data/call-graph/call-graph-model.d.ts +102 -0
  248. package/dist/data/call-graph/call-graph-model.d.ts.map +1 -0
  249. package/dist/data/call-graph/call-graph-model.js +161 -0
  250. package/dist/data/call-graph/call-graph-model.js.map +1 -0
  251. package/dist/data/call-graph/call-graph-vocabulary.cjs +177 -0
  252. package/dist/data/call-graph/call-graph-vocabulary.cjs.map +1 -0
  253. package/dist/data/call-graph/call-graph-vocabulary.d.ts +72 -0
  254. package/dist/data/call-graph/call-graph-vocabulary.d.ts.map +1 -0
  255. package/dist/data/call-graph/call-graph-vocabulary.js +177 -0
  256. package/dist/data/call-graph/call-graph-vocabulary.js.map +1 -0
  257. package/dist/data/call-graph/call-graph.fixtures.d.ts +63 -0
  258. package/dist/data/call-graph/call-graph.fixtures.d.ts.map +1 -0
  259. package/dist/data/call-graph/index.d.ts +7 -0
  260. package/dist/data/call-graph/index.d.ts.map +1 -0
  261. package/dist/data/call-graph/types.cjs +5 -0
  262. package/dist/data/call-graph/types.cjs.map +1 -0
  263. package/dist/data/call-graph/types.d.ts +135 -0
  264. package/dist/data/call-graph/types.d.ts.map +1 -0
  265. package/dist/data/call-graph/types.js +5 -0
  266. package/dist/data/call-graph/types.js.map +1 -0
  267. package/dist/data/call-graph/use-call-graph.cjs +93 -0
  268. package/dist/data/call-graph/use-call-graph.cjs.map +1 -0
  269. package/dist/data/call-graph/use-call-graph.d.ts +24 -0
  270. package/dist/data/call-graph/use-call-graph.d.ts.map +1 -0
  271. package/dist/data/call-graph/use-call-graph.js +93 -0
  272. package/dist/data/call-graph/use-call-graph.js.map +1 -0
  273. package/dist/data/chat/Chat.cjs +39 -15
  274. package/dist/data/chat/Chat.cjs.map +1 -1
  275. package/dist/data/chat/Chat.d.ts.map +1 -1
  276. package/dist/data/chat/Chat.fixtures.cjs +2 -2
  277. package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
  278. package/dist/data/chat/Chat.fixtures.js +2 -2
  279. package/dist/data/chat/Chat.fixtures.js.map +1 -1
  280. package/dist/data/chat/Chat.js +40 -16
  281. package/dist/data/chat/Chat.js.map +1 -1
  282. package/dist/data/chat/ChatRuntimeToolbar.cjs +3 -6
  283. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  284. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  285. package/dist/data/chat/ChatRuntimeToolbar.js +3 -6
  286. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  287. package/dist/data/chat/ContextMeter.bar.cjs +5 -8
  288. package/dist/data/chat/ContextMeter.bar.cjs.map +1 -1
  289. package/dist/data/chat/ContextMeter.bar.d.ts +1 -1
  290. package/dist/data/chat/ContextMeter.bar.d.ts.map +1 -1
  291. package/dist/data/chat/ContextMeter.bar.js +5 -8
  292. package/dist/data/chat/ContextMeter.bar.js.map +1 -1
  293. package/dist/data/chat/ContextMeter.cjs +18 -19
  294. package/dist/data/chat/ContextMeter.cjs.map +1 -1
  295. package/dist/data/chat/ContextMeter.d.ts +1 -1
  296. package/dist/data/chat/ContextMeter.d.ts.map +1 -1
  297. package/dist/data/chat/ContextMeter.js +18 -19
  298. package/dist/data/chat/ContextMeter.js.map +1 -1
  299. package/dist/data/chat/Conversation.cjs +2 -1
  300. package/dist/data/chat/Conversation.cjs.map +1 -1
  301. package/dist/data/chat/Conversation.d.ts +4 -1
  302. package/dist/data/chat/Conversation.d.ts.map +1 -1
  303. package/dist/data/chat/Conversation.js +2 -1
  304. package/dist/data/chat/Conversation.js.map +1 -1
  305. package/dist/data/chat/Message.cjs +39 -12
  306. package/dist/data/chat/Message.cjs.map +1 -1
  307. package/dist/data/chat/Message.d.ts +1 -1
  308. package/dist/data/chat/Message.d.ts.map +1 -1
  309. package/dist/data/chat/Message.js +40 -13
  310. package/dist/data/chat/Message.js.map +1 -1
  311. package/dist/data/chat/ToolCall.cjs +60 -5
  312. package/dist/data/chat/ToolCall.cjs.map +1 -1
  313. package/dist/data/chat/ToolCall.d.ts +7 -2
  314. package/dist/data/chat/ToolCall.d.ts.map +1 -1
  315. package/dist/data/chat/ToolCall.js +60 -5
  316. package/dist/data/chat/ToolCall.js.map +1 -1
  317. package/dist/data/chat/approval.cjs.map +1 -1
  318. package/dist/data/chat/approval.d.ts +2 -2
  319. package/dist/data/chat/approval.d.ts.map +1 -1
  320. package/dist/data/chat/approval.js.map +1 -1
  321. package/dist/data/chat/tool-policy.cjs +59 -2
  322. package/dist/data/chat/tool-policy.cjs.map +1 -1
  323. package/dist/data/chat/tool-policy.d.ts +9 -0
  324. package/dist/data/chat/tool-policy.d.ts.map +1 -1
  325. package/dist/data/chat/tool-policy.js +59 -2
  326. package/dist/data/chat/tool-policy.js.map +1 -1
  327. package/dist/data/chat/types.cjs +6 -0
  328. package/dist/data/chat/types.cjs.map +1 -1
  329. package/dist/data/chat/types.d.ts +13 -4
  330. package/dist/data/chat/types.d.ts.map +1 -1
  331. package/dist/data/chat/types.js +7 -1
  332. package/dist/data/chat/types.js.map +1 -1
  333. package/dist/data/chat/usage-snapshot.cjs +11 -6
  334. package/dist/data/chat/usage-snapshot.cjs.map +1 -1
  335. package/dist/data/chat/usage-snapshot.d.ts +0 -1
  336. package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
  337. package/dist/data/chat/usage-snapshot.js +11 -6
  338. package/dist/data/chat/usage-snapshot.js.map +1 -1
  339. package/dist/data/diagnostics/StackFrameRow.cjs +3 -3
  340. package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -1
  341. package/dist/data/diagnostics/StackFrameRow.js +3 -3
  342. package/dist/data/diagnostics/StackFrameRow.js.map +1 -1
  343. package/dist/data/graph-columns-layout.cjs +26 -10
  344. package/dist/data/graph-columns-layout.cjs.map +1 -1
  345. package/dist/data/graph-columns-layout.d.ts +8 -0
  346. package/dist/data/graph-columns-layout.d.ts.map +1 -1
  347. package/dist/data/graph-columns-layout.js +26 -10
  348. package/dist/data/graph-columns-layout.js.map +1 -1
  349. package/dist/data/graph-diagram-model.cjs.map +1 -1
  350. package/dist/data/graph-diagram-model.d.ts +5 -0
  351. package/dist/data/graph-diagram-model.d.ts.map +1 -1
  352. package/dist/data/graph-diagram-model.js.map +1 -1
  353. package/dist/data/graph-edge-routing.cjs +9 -3
  354. package/dist/data/graph-edge-routing.cjs.map +1 -1
  355. package/dist/data/graph-edge-routing.d.ts +2 -0
  356. package/dist/data/graph-edge-routing.d.ts.map +1 -1
  357. package/dist/data/graph-edge-routing.js +9 -3
  358. package/dist/data/graph-edge-routing.js.map +1 -1
  359. package/dist/data/json-view/JsonSource.cjs +84 -0
  360. package/dist/data/json-view/JsonSource.cjs.map +1 -0
  361. package/dist/data/json-view/JsonSource.d.ts +7 -0
  362. package/dist/data/json-view/JsonSource.d.ts.map +1 -0
  363. package/dist/data/json-view/JsonSource.js +84 -0
  364. package/dist/data/json-view/JsonSource.js.map +1 -0
  365. package/dist/data/json-view/parse-prefix.cjs +132 -0
  366. package/dist/data/json-view/parse-prefix.cjs.map +1 -0
  367. package/dist/data/json-view/parse-prefix.d.ts +11 -0
  368. package/dist/data/json-view/parse-prefix.d.ts.map +1 -0
  369. package/dist/data/json-view/parse-prefix.js +132 -0
  370. package/dist/data/json-view/parse-prefix.js.map +1 -0
  371. package/dist/data/json-view/parse-source.cjs +62 -0
  372. package/dist/data/json-view/parse-source.cjs.map +1 -0
  373. package/dist/data/json-view/parse-source.d.ts +16 -0
  374. package/dist/data/json-view/parse-source.d.ts.map +1 -0
  375. package/dist/data/json-view/parse-source.js +62 -0
  376. package/dist/data/json-view/parse-source.js.map +1 -0
  377. package/dist/data/json-view/story-fixtures.d.ts +6 -0
  378. package/dist/data/json-view/story-fixtures.d.ts.map +1 -0
  379. package/dist/data/json-view/types.d.ts +14 -0
  380. package/dist/data/json-view/types.d.ts.map +1 -0
  381. package/dist/data/runtime/RuntimeBar.cjs +2 -5
  382. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  383. package/dist/data/runtime/RuntimeBar.d.ts +2 -4
  384. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  385. package/dist/data/runtime/RuntimeBar.fields.cjs +2 -2
  386. package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -1
  387. package/dist/data/runtime/RuntimeBar.fields.js +2 -2
  388. package/dist/data/runtime/RuntimeBar.fields.js.map +1 -1
  389. package/dist/data/runtime/RuntimeBar.js +2 -5
  390. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  391. package/dist/data/runtime/RuntimeBar.selection.cjs +4 -1
  392. package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -1
  393. package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -1
  394. package/dist/data/runtime/RuntimeBar.selection.js +5 -2
  395. package/dist/data/runtime/RuntimeBar.selection.js.map +1 -1
  396. package/dist/data/runtime/RuntimeBarActions.cjs +1 -5
  397. package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
  398. package/dist/data/runtime/RuntimeBarActions.d.ts +1 -1
  399. package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
  400. package/dist/data/runtime/RuntimeBarActions.js +1 -5
  401. package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
  402. package/dist/data/runtime/RuntimeBarIdentity.cjs +6 -14
  403. package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -1
  404. package/dist/data/runtime/RuntimeBarIdentity.d.ts +0 -1
  405. package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -1
  406. package/dist/data/runtime/RuntimeBarIdentity.js +6 -14
  407. package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -1
  408. package/dist/data/runtime/RuntimeBarLayout.cjs +8 -27
  409. package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -1
  410. package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -1
  411. package/dist/data/runtime/RuntimeBarLayout.js +8 -27
  412. package/dist/data/runtime/RuntimeBarLayout.js.map +1 -1
  413. package/dist/data/runtime/RuntimeBarSegment.cjs +1 -5
  414. package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
  415. package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
  416. package/dist/data/runtime/RuntimeBarSegment.js +1 -5
  417. package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
  418. package/dist/data/runtime/use-runtime-bar-overflow.cjs +4 -10
  419. package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -1
  420. package/dist/data/runtime/use-runtime-bar-overflow.d.ts +1 -2
  421. package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -1
  422. package/dist/data/runtime/use-runtime-bar-overflow.js +4 -10
  423. package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -1
  424. package/dist/data/test-runner/TestRunner.fixtures.d.ts +0 -20
  425. package/dist/data/test-runner/TestRunner.fixtures.d.ts.map +1 -1
  426. package/dist/data/test-runner/TestRunner.large-fixtures.d.ts +22 -0
  427. package/dist/data/test-runner/TestRunner.large-fixtures.d.ts.map +1 -0
  428. package/dist/data/use-pan-zoom.cjs +23 -10
  429. package/dist/data/use-pan-zoom.cjs.map +1 -1
  430. package/dist/data/use-pan-zoom.d.ts +16 -2
  431. package/dist/data/use-pan-zoom.d.ts.map +1 -1
  432. package/dist/data/use-pan-zoom.js +23 -10
  433. package/dist/data/use-pan-zoom.js.map +1 -1
  434. package/dist/data/version-info.cjs +3 -3
  435. package/dist/data/version-info.js +3 -3
  436. package/dist/data.cjs +26 -2
  437. package/dist/data.cjs.map +1 -1
  438. package/dist/data.d.ts +1 -0
  439. package/dist/data.d.ts.map +1 -1
  440. package/dist/data.js +24 -0
  441. package/dist/data.js.map +1 -1
  442. package/dist/index.cjs +28 -4
  443. package/dist/index.cjs.map +1 -1
  444. package/dist/index.js +24 -0
  445. package/dist/index.js.map +1 -1
  446. package/dist/layout/Workspace.cjs +13 -4
  447. package/dist/layout/Workspace.cjs.map +1 -1
  448. package/dist/layout/Workspace.d.ts +7 -2
  449. package/dist/layout/Workspace.d.ts.map +1 -1
  450. package/dist/layout/Workspace.js +13 -4
  451. package/dist/layout/Workspace.js.map +1 -1
  452. package/dist/lib/permission-strategies.cjs +71 -11
  453. package/dist/lib/permission-strategies.cjs.map +1 -1
  454. package/dist/lib/permission-strategies.d.ts +3 -0
  455. package/dist/lib/permission-strategies.d.ts.map +1 -1
  456. package/dist/lib/permission-strategies.js +71 -11
  457. package/dist/lib/permission-strategies.js.map +1 -1
  458. package/dist/styles.css +1 -1
  459. package/package.json +5 -3
  460. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs +0 -57
  461. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs.map +0 -1
  462. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts +0 -7
  463. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts.map +0 -1
  464. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js +0 -57
  465. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js.map +0 -1
  466. package/dist/data/runtime/RuntimeBar.context.cjs +0 -8
  467. package/dist/data/runtime/RuntimeBar.context.cjs.map +0 -1
  468. package/dist/data/runtime/RuntimeBar.context.d.ts +0 -2
  469. package/dist/data/runtime/RuntimeBar.context.d.ts.map +0 -1
  470. package/dist/data/runtime/RuntimeBar.context.js +0 -8
  471. package/dist/data/runtime/RuntimeBar.context.js.map +0 -1
@@ -1,12 +1,15 @@
1
- export type JsonViewProps = {
2
- /** JSON-like value to render. */
1
+ import { JsonViewOptions } from './json-view/types.js';
2
+ export type JsonViewProps = JsonViewOptions & ({
3
+ /** Parsed JSON-like value. Strings remain literal values. */
3
4
  data: unknown;
4
- /** Optional property name displayed before nested object/array values. */
5
- name?: string;
6
- /** Current nesting depth; callers usually leave this unset. */
7
- depth?: number;
8
- /** Depth that starts expanded by default. */
9
- defaultOpenDepth?: number;
10
- };
11
- export declare function JsonView({ data, name, depth, defaultOpenDepth }: JsonViewProps): import("react").JSX.Element;
5
+ source?: never;
6
+ inputFormat?: never;
7
+ } | {
8
+ /** Raw JSON or NDJSON, including input interrupted at EOF. */
9
+ source: string;
10
+ /** Source encoding. This is independent of the YAML/JSON display format. */
11
+ inputFormat?: "json" | "ndjson";
12
+ data?: never;
13
+ });
14
+ export declare function JsonView({ density, format, ...props }: JsonViewProps): import("react").JSX.Element;
12
15
  //# sourceMappingURL=JsonView.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"JsonView.d.ts","sourceRoot":"","sources":["../../src/data/JsonView.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG;IAC1B,iCAAiC;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAS,EAAE,gBAAoB,EAAE,EAAE,aAAa,+BAqFtF"}
1
+ {"version":3,"file":"JsonView.d.ts","sourceRoot":"","sources":["../../src/data/JsonView.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG,eAAe,GACzC,CACI;IACE,6DAA6D;IAC7D,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,WAAW,CAAC,EAAE,KAAK,CAAC;CACrB,GACD;IACE,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAChC,IAAI,CAAC,EAAE,KAAK,CAAC;CACd,CACJ,CAAC;AAWJ,wBAAgB,QAAQ,CAAC,EACvB,OAAO,EACP,MAAe,EACf,GAAG,KAAK,EACT,EAAE,aAAa,+BAiCf"}
@@ -1,73 +1,142 @@
1
1
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import { useState } from "react";
3
- function JsonView({ data, name, depth = 0, defaultOpenDepth = 2 }) {
3
+ import { stringify } from "yaml";
4
+ import { Button } from "../components/button.js";
5
+ import { useDensityValue } from "../hooks/use-density.js";
6
+ import { cn } from "../lib/utils.js";
7
+ import { JsonSource } from "./json-view/JsonSource.js";
8
+ import { UiChevronRight } from "../icons/components/UiChevronRight.js";
9
+ const DENSITY_CLASSES = {
10
+ compact: "text-xs leading-4 [--json-view-indent:0.75rem] [--json-view-row-space:0px]",
11
+ comfortable: "text-sm leading-5 [--json-view-indent:1rem] [--json-view-row-space:1px]",
12
+ spacious: "text-base leading-6 [--json-view-indent:1.25rem] [--json-view-row-space:2px]"
13
+ };
14
+ function JsonView({
15
+ density,
16
+ format = "yaml",
17
+ ...props
18
+ }) {
19
+ const inheritedDensity = useDensityValue();
20
+ const activeDensity = density ?? inheritedDensity;
21
+ const hasSource = Object.hasOwn(props, "source");
22
+ if (hasSource === Object.hasOwn(props, "data"))
23
+ throw new Error("JsonView requires exactly one of data or source");
24
+ if (!hasSource && Object.hasOwn(props, "inputFormat"))
25
+ throw new Error("JsonView inputFormat requires source");
26
+ if (hasSource && typeof props.source !== "string")
27
+ throw new Error("JsonView source must be a string");
28
+ const { data, source, inputFormat = "json", ...options } = props;
29
+ return /* @__PURE__ */ jsx(
30
+ "div",
31
+ {
32
+ "data-format": format,
33
+ "data-density": activeDensity,
34
+ className: cn(
35
+ "font-mono whitespace-pre-wrap break-words",
36
+ DENSITY_CLASSES[activeDensity]
37
+ ),
38
+ children: hasSource && source !== void 0 ? /* @__PURE__ */ jsx(
39
+ JsonSource,
40
+ {
41
+ source,
42
+ inputFormat,
43
+ renderValue: (value) => /* @__PURE__ */ jsx(JsonViewNode, { ...options, data: value, format })
44
+ }
45
+ ) : /* @__PURE__ */ jsx(JsonViewNode, { ...options, data, format })
46
+ }
47
+ );
48
+ }
49
+ function JsonViewNode({
50
+ data,
51
+ name,
52
+ depth = 0,
53
+ defaultOpenDepth = 2,
54
+ format,
55
+ sequenceItem = false
56
+ }) {
4
57
  const [open, setOpen] = useState(depth < defaultOpenDepth);
5
- if (data === null || data === void 0) {
6
- return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground italic", children: "null" });
7
- }
8
- if (typeof data === "string") {
9
- return /* @__PURE__ */ jsxs("span", { className: "text-green-700 dark:text-green-400", children: [
10
- '"',
11
- data,
12
- '"'
13
- ] });
14
- }
15
- if (typeof data === "number" || typeof data === "boolean") {
16
- return /* @__PURE__ */ jsx("span", { className: "text-blue-700 dark:text-blue-400", children: String(data) });
17
- }
18
- if (typeof data !== "object") {
19
- return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: String(data) });
20
- }
21
58
  const isArray = Array.isArray(data);
22
- const entries = isArray ? data.map((v, i) => [i, v]) : Object.entries(data);
23
- const [openB, closeB] = isArray ? ["[", "]"] : ["{", "}"];
59
+ const entries = data !== null && typeof data === "object" ? Object.entries(data) : [];
60
+ const prefix = /* @__PURE__ */ jsxs(Fragment, { children: [
61
+ sequenceItem && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "- " }),
62
+ name !== void 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
63
+ /* @__PURE__ */ jsx("span", { className: "text-purple-600 [[data-theme=dark]_&]:text-purple-400", children: format === "yaml" ? yamlString(name) : name }),
64
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: ": " })
65
+ ] })
66
+ ] });
24
67
  if (entries.length === 0) {
25
- return /* @__PURE__ */ jsxs("span", { className: "text-muted-foreground", children: [
26
- openB,
27
- closeB
68
+ return /* @__PURE__ */ jsxs("div", { className: "py-[var(--json-view-row-space)]", children: [
69
+ prefix,
70
+ /* @__PURE__ */ jsx(JsonViewScalar, { data, format })
28
71
  ] });
29
72
  }
30
- return /* @__PURE__ */ jsxs("div", { className: "text-sm font-mono", style: { paddingLeft: depth > 0 ? "12px" : "0" }, children: [
73
+ const [openB, closeB] = isArray ? ["[", "]"] : ["{", "}"];
74
+ const summary = `${entries.length} ${isArray ? entries.length === 1 ? "item" : "items" : entries.length === 1 ? "key" : "keys"}`;
75
+ return /* @__PURE__ */ jsxs("div", { children: [
31
76
  /* @__PURE__ */ jsxs(
32
- "span",
77
+ Button,
33
78
  {
34
- className: "cursor-pointer hover:bg-accent rounded px-0.5 select-none",
79
+ variant: "ghost",
80
+ type: "button",
81
+ "aria-expanded": open,
82
+ "aria-label": `${open ? "Collapse" : "Expand"} ${name ?? "value"}`,
83
+ className: "h-auto max-w-full justify-start gap-0 rounded px-0 py-[var(--json-view-row-space)] text-left font-normal text-[length:inherit] leading-[inherit] whitespace-pre-wrap [&_svg]:size-[0.75em]",
35
84
  onClick: () => setOpen(!open),
36
85
  children: [
37
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-xs mr-1", children: open ? "▼" : "▶" }),
38
- name && /* @__PURE__ */ jsx("span", { className: "text-purple-600 dark:text-purple-400", children: name }),
39
- name && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: ": " }),
40
- !open && /* @__PURE__ */ jsxs("span", { className: "text-muted-foreground", children: [
41
- openB,
42
- " ",
43
- entries.length,
44
- " ",
45
- isArray ? entries.length === 1 ? "item" : "items" : entries.length === 1 ? "key" : "keys",
46
- " ",
47
- closeB
48
- ] }),
49
- open && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: openB })
86
+ /* @__PURE__ */ jsx(
87
+ UiChevronRight,
88
+ {
89
+ "aria-hidden": "true",
90
+ className: cn(
91
+ "mr-1 shrink-0 text-muted-foreground",
92
+ open && "rotate-90"
93
+ )
94
+ }
95
+ ),
96
+ /* @__PURE__ */ jsxs("span", { children: [
97
+ prefix,
98
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: format === "json" ? open ? openB : `${openB} ${summary} ${closeB}` : !open || name === void 0 && !sequenceItem ? summary : null })
99
+ ] })
50
100
  ]
51
101
  }
52
102
  ),
53
103
  open && /* @__PURE__ */ jsxs(Fragment, { children: [
54
- entries.map(([key, val]) => /* @__PURE__ */ jsx("div", { className: "pl-3 border-l border-border ml-1", children: typeof val === "object" && val !== null ? /* @__PURE__ */ jsx(
55
- JsonView,
104
+ /* @__PURE__ */ jsx("div", { className: "border-l border-border pl-[var(--json-view-indent)]", children: entries.map(([key, val]) => /* @__PURE__ */ jsx(
105
+ JsonViewNode,
56
106
  {
57
107
  data: val,
58
- name: String(key),
108
+ ...!isArray ? { name: key } : {},
109
+ sequenceItem: isArray && format === "yaml",
59
110
  depth: depth + 1,
60
- defaultOpenDepth
61
- }
62
- ) : /* @__PURE__ */ jsxs("div", { children: [
63
- /* @__PURE__ */ jsx("span", { className: "text-purple-600 dark:text-purple-400", children: isArray ? "" : String(key) }),
64
- !isArray && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: ": " }),
65
- /* @__PURE__ */ jsx(JsonView, { data: val, depth: depth + 1, defaultOpenDepth })
66
- ] }) }, key)),
67
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: closeB })
111
+ defaultOpenDepth,
112
+ format
113
+ },
114
+ key
115
+ )) }),
116
+ format === "json" && /* @__PURE__ */ jsx("div", { className: "text-muted-foreground py-[var(--json-view-row-space)]", children: closeB })
68
117
  ] })
69
118
  ] });
70
119
  }
120
+ function JsonViewScalar({
121
+ data,
122
+ format
123
+ }) {
124
+ if (data === null || data === void 0)
125
+ return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground italic", children: "null" });
126
+ if (typeof data === "string") {
127
+ return /* @__PURE__ */ jsx("span", { className: "text-green-700 [[data-theme=dark]_&]:text-green-400", children: format === "yaml" ? yamlString(data) : JSON.stringify(data) });
128
+ }
129
+ if (typeof data === "number" || typeof data === "boolean") {
130
+ return /* @__PURE__ */ jsx("span", { className: "text-blue-700 [[data-theme=dark]_&]:text-blue-400", children: String(data) });
131
+ }
132
+ return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: typeof data === "object" ? Array.isArray(data) ? "[]" : "{}" : String(data) });
133
+ }
134
+ function yamlString(value) {
135
+ return stringify(value, {
136
+ lineWidth: 0,
137
+ defaultStringType: value.includes("\n") ? "QUOTE_DOUBLE" : "PLAIN"
138
+ }).trimEnd();
139
+ }
71
140
  export {
72
141
  JsonView
73
142
  };
@@ -1 +1 @@
1
- {"version":3,"file":"JsonView.js","sources":["../../src/data/JsonView.tsx"],"sourcesContent":["import { useState } from \"react\";\n\nexport type JsonViewProps = {\n /** JSON-like value to render. */\n data: unknown;\n /** Optional property name displayed before nested object/array values. */\n name?: string;\n /** Current nesting depth; callers usually leave this unset. */\n depth?: number;\n /** Depth that starts expanded by default. */\n defaultOpenDepth?: number;\n};\n\nexport function JsonView({ data, name, depth = 0, defaultOpenDepth = 2 }: JsonViewProps) {\n const [open, setOpen] = useState(depth < defaultOpenDepth);\n\n if (data === null || data === undefined) {\n return <span className=\"text-muted-foreground italic\">null</span>;\n }\n\n if (typeof data === \"string\") {\n return <span className=\"text-green-700 dark:text-green-400\">\"{data}\"</span>;\n }\n\n if (typeof data === \"number\" || typeof data === \"boolean\") {\n return <span className=\"text-blue-700 dark:text-blue-400\">{String(data)}</span>;\n }\n\n if (typeof data !== \"object\") {\n return <span className=\"text-muted-foreground\">{String(data)}</span>;\n }\n\n const isArray = Array.isArray(data);\n const entries: Array<[string | number, unknown]> = isArray\n ? (data as unknown[]).map((v, i) => [i, v])\n : Object.entries(data as Record<string, unknown>);\n const [openB, closeB] = isArray ? [\"[\", \"]\"] : [\"{\", \"}\"];\n\n if (entries.length === 0) {\n return (\n <span className=\"text-muted-foreground\">\n {openB}\n {closeB}\n </span>\n );\n }\n\n return (\n <div className=\"text-sm font-mono\" style={{ paddingLeft: depth > 0 ? \"12px\" : \"0\" }}>\n <span\n className=\"cursor-pointer hover:bg-accent rounded px-0.5 select-none\"\n onClick={() => setOpen(!open)}\n >\n <span className=\"text-muted-foreground text-xs mr-1\">{open ? \"▼\" : \"▶\"}</span>\n {name && <span className=\"text-purple-600 dark:text-purple-400\">{name}</span>}\n {name && <span className=\"text-muted-foreground\">: </span>}\n {!open && (\n <span className=\"text-muted-foreground\">\n {openB} {entries.length}{\" \"}\n {isArray\n ? entries.length === 1\n ? \"item\"\n : \"items\"\n : entries.length === 1\n ? \"key\"\n : \"keys\"}{\" \"}\n {closeB}\n </span>\n )}\n {open && <span className=\"text-muted-foreground\">{openB}</span>}\n </span>\n {open && (\n <>\n {entries.map(([key, val]) => (\n <div key={key} className=\"pl-3 border-l border-border ml-1\">\n {typeof val === \"object\" && val !== null ? (\n <JsonView\n data={val}\n name={String(key)}\n depth={depth + 1}\n defaultOpenDepth={defaultOpenDepth}\n />\n ) : (\n <div>\n <span className=\"text-purple-600 dark:text-purple-400\">\n {isArray ? \"\" : String(key)}\n </span>\n {!isArray && <span className=\"text-muted-foreground\">: </span>}\n <JsonView data={val} depth={depth + 1} defaultOpenDepth={defaultOpenDepth} />\n </div>\n )}\n </div>\n ))}\n <span className=\"text-muted-foreground\">{closeB}</span>\n </>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"JsonView.js","sources":["../../src/data/JsonView.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { stringify } from \"yaml\";\nimport { Button } from \"../components/button\";\nimport { useDensityValue, type Density } from \"../hooks/use-density\";\nimport { UiChevronRight } from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport { JsonSource } from \"./json-view/JsonSource\";\nimport type { JsonViewOptions } from \"./json-view/types\";\n\nexport type JsonViewProps = JsonViewOptions &\n (\n | {\n /** Parsed JSON-like value. Strings remain literal values. */\n data: unknown;\n source?: never;\n inputFormat?: never;\n }\n | {\n /** Raw JSON or NDJSON, including input interrupted at EOF. */\n source: string;\n /** Source encoding. This is independent of the YAML/JSON display format. */\n inputFormat?: \"json\" | \"ndjson\";\n data?: never;\n }\n );\n\nconst DENSITY_CLASSES: Record<Density, string> = {\n compact:\n \"text-xs leading-4 [--json-view-indent:0.75rem] [--json-view-row-space:0px]\",\n comfortable:\n \"text-sm leading-5 [--json-view-indent:1rem] [--json-view-row-space:1px]\",\n spacious:\n \"text-base leading-6 [--json-view-indent:1.25rem] [--json-view-row-space:2px]\",\n};\n\nexport function JsonView({\n density,\n format = \"yaml\",\n ...props\n}: JsonViewProps) {\n const inheritedDensity = useDensityValue();\n const activeDensity = density ?? inheritedDensity;\n const hasSource = Object.hasOwn(props, \"source\");\n if (hasSource === Object.hasOwn(props, \"data\"))\n throw new Error(\"JsonView requires exactly one of data or source\");\n if (!hasSource && Object.hasOwn(props, \"inputFormat\"))\n throw new Error(\"JsonView inputFormat requires source\");\n if (hasSource && typeof props.source !== \"string\")\n throw new Error(\"JsonView source must be a string\");\n const { data, source, inputFormat = \"json\", ...options } = props;\n return (\n <div\n data-format={format}\n data-density={activeDensity}\n className={cn(\n \"font-mono whitespace-pre-wrap break-words\",\n DENSITY_CLASSES[activeDensity],\n )}\n >\n {hasSource && source !== undefined ? (\n <JsonSource\n source={source}\n inputFormat={inputFormat}\n renderValue={(value) => (\n <JsonViewNode {...options} data={value} format={format} />\n )}\n />\n ) : (\n <JsonViewNode {...options} data={data} format={format} />\n )}\n </div>\n );\n}\n\ntype JsonViewNodeProps = Omit<JsonViewOptions, \"density\"> & {\n data: unknown;\n format: \"yaml\" | \"json\";\n sequenceItem?: boolean;\n};\n\nfunction JsonViewNode({\n data,\n name,\n depth = 0,\n defaultOpenDepth = 2,\n format,\n sequenceItem = false,\n}: JsonViewNodeProps) {\n const [open, setOpen] = useState(depth < defaultOpenDepth);\n const isArray = Array.isArray(data);\n const entries =\n data !== null && typeof data === \"object\" ? Object.entries(data) : [];\n const prefix = (\n <>\n {sequenceItem && <span className=\"text-muted-foreground\">- </span>}\n {name !== undefined && (\n <>\n <span className=\"text-purple-600 [[data-theme=dark]_&]:text-purple-400\">\n {format === \"yaml\" ? yamlString(name) : name}\n </span>\n <span className=\"text-muted-foreground\">: </span>\n </>\n )}\n </>\n );\n if (entries.length === 0) {\n return (\n <div className=\"py-[var(--json-view-row-space)]\">\n {prefix}\n <JsonViewScalar data={data} format={format} />\n </div>\n );\n }\n const [openB, closeB] = isArray ? [\"[\", \"]\"] : [\"{\", \"}\"];\n const summary = `${entries.length} ${isArray ? (entries.length === 1 ? \"item\" : \"items\") : entries.length === 1 ? \"key\" : \"keys\"}`;\n return (\n <div>\n <Button\n variant=\"ghost\"\n type=\"button\"\n aria-expanded={open}\n aria-label={`${open ? \"Collapse\" : \"Expand\"} ${name ?? \"value\"}`}\n className=\"h-auto max-w-full justify-start gap-0 rounded px-0 py-[var(--json-view-row-space)] text-left font-normal text-[length:inherit] leading-[inherit] whitespace-pre-wrap [&_svg]:size-[0.75em]\"\n onClick={() => setOpen(!open)}\n >\n <UiChevronRight\n aria-hidden=\"true\"\n className={cn(\n \"mr-1 shrink-0 text-muted-foreground\",\n open && \"rotate-90\",\n )}\n />\n <span>\n {prefix}\n <span className=\"text-muted-foreground\">\n {format === \"json\"\n ? open\n ? openB\n : `${openB} ${summary} ${closeB}`\n : !open || (name === undefined && !sequenceItem)\n ? summary\n : null}\n </span>\n </span>\n </Button>\n {open && (\n <>\n <div className=\"border-l border-border pl-[var(--json-view-indent)]\">\n {entries.map(([key, val]) => (\n <JsonViewNode\n key={key}\n data={val}\n {...(!isArray ? { name: key } : {})}\n sequenceItem={isArray && format === \"yaml\"}\n depth={depth + 1}\n defaultOpenDepth={defaultOpenDepth}\n format={format}\n />\n ))}\n </div>\n {format === \"json\" && (\n <div className=\"text-muted-foreground py-[var(--json-view-row-space)]\">\n {closeB}\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n\nfunction JsonViewScalar({\n data,\n format,\n}: Pick<JsonViewProps, \"data\" | \"format\">) {\n if (data === null || data === undefined)\n return <span className=\"text-muted-foreground italic\">null</span>;\n if (typeof data === \"string\") {\n return (\n <span className=\"text-green-700 [[data-theme=dark]_&]:text-green-400\">\n {format === \"yaml\" ? yamlString(data) : JSON.stringify(data)}\n </span>\n );\n }\n if (typeof data === \"number\" || typeof data === \"boolean\") {\n return (\n <span className=\"text-blue-700 [[data-theme=dark]_&]:text-blue-400\">\n {String(data)}\n </span>\n );\n }\n return (\n <span className=\"text-muted-foreground\">\n {typeof data === \"object\"\n ? Array.isArray(data)\n ? \"[]\"\n : \"{}\"\n : String(data)}\n </span>\n );\n}\n\nfunction yamlString(value: string): string {\n return stringify(value, {\n lineWidth: 0,\n defaultStringType: value.includes(\"\\n\") ? \"QUOTE_DOUBLE\" : \"PLAIN\",\n }).trimEnd();\n}\n"],"names":[],"mappings":"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"}
@@ -323,7 +323,7 @@ function PreviewResult({
323
323
  case "html":
324
324
  return /* @__PURE__ */ jsxRuntime.jsx(HtmlPreview, { html: result.html });
325
325
  case "json":
326
- return /* @__PURE__ */ jsxRuntime.jsx(JsonView.JsonView, { data: result.data });
326
+ return /* @__PURE__ */ jsxRuntime.jsx(JsonView.JsonView, { data: result.data, format: "json" });
327
327
  case "url":
328
328
  return /* @__PURE__ */ jsxRuntime.jsx(UrlPreview, { format, url: result.url });
329
329
  case "blob":
@@ -344,7 +344,7 @@ function TextResult({
344
344
  }
345
345
  if (format === "json" || isJsonContent(result.contentType)) {
346
346
  const parsed = parseJson(result.text);
347
- return parsed.ok ? /* @__PURE__ */ jsxRuntime.jsx(JsonView.JsonView, { data: parsed.value }) : /* @__PURE__ */ jsxRuntime.jsx(TextPreview, { label: "JSON output", text: result.text });
347
+ return parsed.ok ? /* @__PURE__ */ jsxRuntime.jsx(JsonView.JsonView, { data: parsed.value, format: "json" }) : /* @__PURE__ */ jsxRuntime.jsx(TextPreview, { label: "JSON output", text: result.text });
348
348
  }
349
349
  return /* @__PURE__ */ jsxRuntime.jsx(
350
350
  TextPreview,
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownEditor.cjs","sources":["../../src/data/MarkdownEditor.tsx"],"sourcesContent":["import {\n useEffect,\n useId,\n useMemo,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { Button } from \"../components/button\";\nimport { IconButton } from \"../components/IconButton\";\nimport {\n SegmentedControl,\n type SegmentedOption,\n} from \"../components/SegmentedControl\";\nimport { cn } from \"../lib/utils\";\nimport {\n UiCopy,\n UiEdit,\n UiEye,\n UiFileCode,\n UiFileSpreadsheet,\n UiFileText,\n UiJson,\n UiMarkdown,\n UiRefresh,\n} from \"../icons\";\nimport { Clicky, type ClickyProps } from \"./Clicky\";\nimport { Icon, type StaticIconComponent } from \"./Icon\";\nimport { JsonView } from \"./JsonView\";\nimport { Markdown } from \"./Markdown\";\nimport {\n buildMarkdownPreviewUrl,\n MARKDOWN_EDITOR_PREVIEW_FORMATS,\n type MarkdownEditorPreviewFormat,\n type MarkdownEditorPreviewHeaders,\n type MarkdownEditorPreviewRequest,\n type MarkdownEditorPreviewResult,\n} from \"./MarkdownEditor.model\";\n\nexport type MarkdownEditorProps = {\n /** Controlled markdown source. */\n value?: string;\n /** Initial markdown source for uncontrolled usage. */\n defaultValue?: string;\n /** Called whenever the editor source changes. */\n onChange?: (value: string) => void;\n /** Editor label. */\n label?: ReactNode;\n /** Textarea placeholder. */\n placeholder?: string;\n /** Preview formats to expose in the toolbar. */\n previewFormats?: readonly MarkdownEditorPreviewFormat[];\n /** Controlled active preview format. */\n previewFormat?: MarkdownEditorPreviewFormat;\n /** Initial active preview format for uncontrolled usage. */\n defaultPreviewFormat?: MarkdownEditorPreviewFormat;\n /** Called when the active preview format changes. */\n onPreviewFormatChange?: (format: MarkdownEditorPreviewFormat) => void;\n /** Clicky endpoint that accepts markdown and a `format=` query parameter. */\n previewEndpoint?: string;\n /** HTTP method for `previewEndpoint`; POST sends the markdown body. */\n previewMethod?: \"GET\" | \"POST\" | \"PUT\";\n /** Extra headers for remote previews. */\n previewHeaders?: MarkdownEditorPreviewHeaders;\n /** Build a URL for remote preview requests instead of `previewEndpoint`. */\n buildPreviewUrl?: (request: {\n markdown: string;\n format: MarkdownEditorPreviewFormat;\n }) => string | undefined;\n /**\n * Custom loader for host-specific markdown conversion. Return `undefined` for\n * a format to leave it on the local preview — Clicky's `format=` contract has\n * no `react`, so hosts commonly convert every other format remotely.\n */\n loadPreview?: (\n request: MarkdownEditorPreviewRequest,\n ) =>\n | Promise<MarkdownEditorPreviewResult | undefined>\n | MarkdownEditorPreviewResult\n | undefined;\n /** Local Clicky document for the React preview, or a mapper from markdown. */\n clickyData?: ClickyProps[\"data\"] | ((markdown: string) => ClickyProps[\"data\"] | undefined);\n /** Debounce interval for remote preview requests. */\n previewDebounceMs?: number;\n /** Minimum height for both editor and preview panes. */\n minHeight?: number | string;\n /** Disable editing and preview refresh. */\n disabled?: boolean;\n /** Render the source as read-only. */\n readOnly?: boolean;\n /** Classes applied to the component root. */\n className?: string;\n /** Classes applied to the textarea. */\n editorClassName?: string;\n /** Classes applied to the preview body. */\n previewClassName?: string;\n /** Extra toolbar content rendered after the built-in actions. */\n toolbar?: ReactNode;\n};\n\ntype PreviewState =\n | { status: \"idle\" }\n | { status: \"loading\"; result?: MarkdownEditorPreviewResult }\n | { status: \"success\"; result: MarkdownEditorPreviewResult }\n | { status: \"error\"; error: string; result?: MarkdownEditorPreviewResult };\n\ntype FormatMeta = {\n label: string;\n icon: StaticIconComponent;\n iconClassName?: string;\n};\n\nconst FORMAT_META: Record<MarkdownEditorPreviewFormat, FormatMeta> = {\n react: {\n label: \"React\",\n icon: UiEye,\n },\n html: {\n label: \"HTML\",\n icon: UiFileCode,\n },\n markdown: {\n label: \"Markdown\",\n icon: UiMarkdown,\n },\n pdf: {\n label: \"PDF\",\n icon: UiFileText,\n iconClassName: \"text-rose-600 dark:text-rose-400\",\n },\n json: {\n label: \"JSON\",\n icon: UiJson,\n },\n csv: {\n label: \"CSV\",\n icon: UiFileSpreadsheet,\n iconClassName: \"text-emerald-600 dark:text-emerald-400\",\n },\n excel: {\n label: \"Excel\",\n icon: UiFileSpreadsheet,\n iconClassName: \"text-emerald-700 dark:text-emerald-300\",\n },\n};\n\n/**\n * Split-pane markdown editor with local Markdown/React preview and optional\n * Clicky-backed format previews. Hosts can pass `previewEndpoint` for the\n * standard Clicky `format=` contract or `loadPreview` for custom conversion.\n */\nexport function MarkdownEditor({\n value,\n defaultValue = \"\",\n onChange,\n label = \"Markdown\",\n placeholder = \"Write markdown...\",\n previewFormats,\n previewFormat,\n defaultPreviewFormat,\n onPreviewFormatChange,\n previewEndpoint,\n previewMethod = \"POST\",\n previewHeaders,\n buildPreviewUrl,\n loadPreview,\n clickyData,\n previewDebounceMs = 350,\n minHeight = 420,\n disabled = false,\n readOnly = false,\n className,\n editorClassName,\n previewClassName,\n toolbar,\n}: MarkdownEditorProps) {\n const editorId = useId();\n const formats = useMemo(\n () => normalizePreviewFormats(previewFormats),\n [previewFormats],\n );\n const firstFormat = formats[0] ?? \"react\";\n const [draft, setDraft] = useState(defaultValue);\n const markdown = value ?? draft;\n const [internalFormat, setInternalFormat] = useState<MarkdownEditorPreviewFormat>(\n () =>\n normalizeInitialFormat(defaultPreviewFormat, formats) ??\n firstFormat,\n );\n const activeFormat = formats.includes(previewFormat ?? internalFormat)\n ? previewFormat ?? internalFormat\n : firstFormat;\n const [refreshKey, setRefreshKey] = useState(0);\n const [previewState, setPreviewState] = useState<PreviewState>({\n status: \"idle\",\n });\n const contentStyle = useMemo<CSSProperties>(\n () => ({ minHeight: cssSize(minHeight) }),\n [minHeight],\n );\n const remoteEnabled = Boolean(loadPreview || previewEndpoint || buildPreviewUrl);\n const currentMeta = FORMAT_META[activeFormat];\n const segmentOptions = useMemo<SegmentedOption<MarkdownEditorPreviewFormat>[]>(\n () =>\n formats.map((format) => {\n const meta = FORMAT_META[format];\n return {\n id: format,\n label: meta.label,\n icon: meta.icon,\n title: `${meta.label} preview`,\n };\n }),\n [formats],\n );\n\n useEffect(() => {\n if (formats.includes(activeFormat)) return;\n setInternalFormat(firstFormat);\n }, [activeFormat, firstFormat, formats]);\n\n useEffect(() => {\n if (!remoteEnabled) {\n setPreviewState({ status: \"idle\" });\n return;\n }\n\n const controller = new AbortController();\n const timeout = window.setTimeout(() => {\n setPreviewState((current) =>\n current.status === \"success\"\n ? { status: \"loading\", result: current.result }\n : { status: \"loading\" },\n );\n\n resolvePreview({\n markdown,\n format: activeFormat,\n signal: controller.signal,\n previewEndpoint,\n previewMethod,\n previewHeaders,\n buildPreviewUrl,\n loadPreview,\n })\n .then((result) => {\n if (controller.signal.aborted) return;\n setPreviewState(\n result ? { status: \"success\", result } : { status: \"idle\" },\n );\n })\n .catch((error: unknown) => {\n if (controller.signal.aborted) return;\n setPreviewState((current) => ({\n status: \"error\",\n error: error instanceof Error ? error.message : \"Preview failed\",\n ...(current.status === \"loading\" && current.result\n ? { result: current.result }\n : {}),\n }));\n });\n }, Math.max(0, previewDebounceMs));\n\n return () => {\n window.clearTimeout(timeout);\n controller.abort();\n };\n }, [\n activeFormat,\n buildPreviewUrl,\n loadPreview,\n markdown,\n previewDebounceMs,\n previewEndpoint,\n previewHeaders,\n previewMethod,\n refreshKey,\n remoteEnabled,\n ]);\n\n const updateMarkdown = (next: string) => {\n if (value === undefined) setDraft(next);\n onChange?.(next);\n };\n\n const updateFormat = (next: MarkdownEditorPreviewFormat) => {\n if (previewFormat === undefined) setInternalFormat(next);\n onPreviewFormatChange?.(next);\n };\n\n const copySource = () => {\n const clipboard = globalThis.navigator?.clipboard;\n if (clipboard?.writeText) {\n void clipboard.writeText(markdown).catch(() => undefined);\n }\n };\n\n return (\n <div className={cn(\"rounded-md border border-border bg-card\", className)}>\n <div className=\"flex flex-wrap items-center gap-density-2 border-b border-border px-density-3 py-density-2\">\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <Icon icon={UiEdit} className=\"text-base text-muted-foreground\" />\n <label\n htmlFor={editorId}\n className=\"truncate text-sm font-medium text-card-foreground\"\n >\n {label}\n </label>\n {previewState.status === \"loading\" && (\n <span className=\"text-xs text-muted-foreground\">Refreshing...</span>\n )}\n </div>\n <div className=\"flex min-w-0 flex-wrap items-center justify-end gap-2\">\n <SegmentedControl\n value={activeFormat}\n options={segmentOptions}\n onChange={updateFormat}\n size=\"sm\"\n aria-label=\"Markdown preview format\"\n className=\"max-w-full flex-wrap\"\n />\n {remoteEnabled && (\n <IconButton\n icon={UiRefresh}\n label=\"Refresh preview\"\n disabled={disabled}\n onClick={() => setRefreshKey((current) => current + 1)}\n />\n )}\n <IconButton icon={UiCopy} label=\"Copy markdown\" onClick={copySource} />\n {toolbar}\n </div>\n </div>\n\n <div className=\"grid gap-density-3 p-density-3 lg:grid-cols-[minmax(0,1fr)_minmax(0,1fr)]\">\n <div className=\"min-w-0 overflow-hidden rounded-md border border-border bg-background\">\n <div className=\"border-b border-border px-density-3 py-density-2 text-xs font-medium text-muted-foreground\">\n Source\n </div>\n <textarea\n id={editorId}\n value={markdown}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n spellCheck\n onChange={(event) => updateMarkdown(event.currentTarget.value)}\n className={cn(\n \"block w-full resize-y border-0 bg-transparent px-density-3 py-density-3 font-mono text-sm leading-6 text-foreground outline-none placeholder:text-placeholder disabled:cursor-not-allowed disabled:opacity-60\",\n editorClassName,\n )}\n style={contentStyle}\n />\n </div>\n\n <div className=\"min-w-0 overflow-hidden rounded-md border border-border bg-background\">\n <div className=\"flex items-center gap-2 border-b border-border px-density-3 py-density-2 text-xs font-medium text-muted-foreground\">\n <Icon\n icon={currentMeta.icon}\n className={cn(\"text-sm\", currentMeta.iconClassName)}\n />\n <span>{currentMeta.label}</span>\n </div>\n <div\n className={cn(\n \"overflow-auto px-density-3 py-density-3\",\n previewClassName,\n )}\n style={contentStyle}\n >\n <MarkdownEditorPreview\n format={activeFormat}\n markdown={markdown}\n state={previewState}\n clickyData={clickyData}\n />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction MarkdownEditorPreview({\n format,\n markdown,\n state,\n clickyData,\n}: {\n format: MarkdownEditorPreviewFormat;\n markdown: string;\n state: PreviewState;\n clickyData?: MarkdownEditorProps[\"clickyData\"];\n}) {\n const result =\n state.status === \"success\" || state.status === \"loading\" || state.status === \"error\"\n ? state.result\n : undefined;\n\n return (\n <div className=\"space-y-density-3\">\n {state.status === \"error\" && (\n <PreviewNotice title=\"Preview failed\" message={state.error} tone=\"danger\" />\n )}\n {result ? (\n <PreviewResult format={format} result={result} />\n ) : (\n <LocalPreview\n format={format}\n markdown={markdown}\n clickyData={clickyData}\n />\n )}\n </div>\n );\n}\n\nfunction LocalPreview({\n format,\n markdown,\n clickyData,\n}: {\n format: MarkdownEditorPreviewFormat;\n markdown: string;\n clickyData?: MarkdownEditorProps[\"clickyData\"];\n}) {\n if (format === \"react\") {\n const data =\n typeof clickyData === \"function\" ? clickyData(markdown) : clickyData;\n return data === undefined ? <Markdown text={markdown} /> : <Clicky data={data} />;\n }\n\n if (format === \"markdown\") {\n return <TextPreview label=\"Markdown source\" text={markdown} />;\n }\n\n return (\n <PreviewNotice\n title={`${FORMAT_META[format].label} preview not configured`}\n message=\"Pass previewEndpoint or loadPreview to render this format from Clicky.\"\n />\n );\n}\n\nfunction PreviewResult({\n format,\n result,\n}: {\n format: MarkdownEditorPreviewFormat;\n result: MarkdownEditorPreviewResult;\n}) {\n switch (result.kind) {\n case \"clicky\":\n return <Clicky data={result.data} />;\n case \"html\":\n return <HtmlPreview html={result.html} />;\n case \"json\":\n return <JsonView data={result.data} />;\n case \"url\":\n return <UrlPreview format={format} url={result.url} />;\n case \"blob\":\n return <BlobPreview format={format} result={result} />;\n case \"text\":\n return <TextResult format={format} result={result} />;\n }\n}\n\nfunction TextResult({\n format,\n result,\n}: {\n format: MarkdownEditorPreviewFormat;\n result: Extract<MarkdownEditorPreviewResult, { kind: \"text\" }>;\n}) {\n if (format === \"react\") {\n return <Clicky data={result.text} />;\n }\n\n if (format === \"html\" || isHtmlContent(result.contentType)) {\n return <HtmlPreview html={result.text} />;\n }\n\n if (format === \"json\" || isJsonContent(result.contentType)) {\n const parsed = parseJson(result.text);\n return parsed.ok ? (\n <JsonView data={parsed.value} />\n ) : (\n <TextPreview label=\"JSON output\" text={result.text} />\n );\n }\n\n return (\n <TextPreview\n label={`${FORMAT_META[format].label} output`}\n text={result.text}\n />\n );\n}\n\nfunction UrlPreview({\n format,\n url,\n}: {\n format: MarkdownEditorPreviewFormat;\n url: string;\n}) {\n if (format === \"react\") {\n return <Clicky url={url} view={[\"clicky\"]} download={{ all: false }} />;\n }\n\n if (format === \"html\") {\n return <HtmlPreview src={url} />;\n }\n\n if (format === \"pdf\") {\n return <FramePreview title=\"PDF preview\" src={url} />;\n }\n\n if (format === \"excel\") {\n return <DownloadPreview label=\"Open Excel workbook\" href={url} />;\n }\n\n return <TextPreview label={`${FORMAT_META[format].label} URL`} text={url} />;\n}\n\nfunction BlobPreview({\n format,\n result,\n}: {\n format: MarkdownEditorPreviewFormat;\n result: Extract<MarkdownEditorPreviewResult, { kind: \"blob\" }>;\n}) {\n const [url, setUrl] = useState<string>();\n\n useEffect(() => {\n const next = URL.createObjectURL(result.blob);\n setUrl(next);\n return () => URL.revokeObjectURL(next);\n }, [result.blob]);\n\n if (!url) {\n return <PreviewNotice title=\"Preparing preview\" message=\"Creating object URL.\" />;\n }\n\n if (format === \"pdf\") {\n return <FramePreview title=\"PDF preview\" src={url} />;\n }\n\n return (\n <DownloadPreview\n label={`Open ${FORMAT_META[format].label}`}\n href={url}\n {...(result.filename ? { download: result.filename } : {})}\n />\n );\n}\n\nfunction HtmlPreview({\n html,\n src,\n}: {\n html?: string;\n src?: string;\n}) {\n return (\n <FramePreview\n title=\"HTML preview\"\n {...(src ? { src } : {})}\n {...(html ? { srcDoc: html } : {})}\n sandbox=\"allow-same-origin\"\n />\n );\n}\n\nfunction FramePreview({\n title,\n src,\n srcDoc,\n sandbox,\n}: {\n title: string;\n src?: string;\n srcDoc?: string;\n sandbox?: string;\n}) {\n return (\n <div className=\"overflow-hidden rounded-md border border-border bg-background\">\n <iframe\n title={title}\n {...(src ? { src } : {})}\n {...(srcDoc ? { srcDoc } : {})}\n {...(sandbox ? { sandbox } : {})}\n className=\"h-[720px] w-full bg-background\"\n />\n </div>\n );\n}\n\nfunction DownloadPreview({\n label,\n href,\n download,\n}: {\n label: string;\n href: string;\n download?: string;\n}) {\n return (\n <PreviewNotice\n title=\"Inline preview unavailable\"\n message={\n <Button asChild variant=\"outline\" size=\"sm\">\n <a\n href={href}\n target=\"_blank\"\n rel=\"noreferrer\"\n {...(download ? { download } : {})}\n >\n {label}\n </a>\n </Button>\n }\n />\n );\n}\n\nfunction TextPreview({ label, text }: { label: string; text: string }) {\n return (\n <pre\n aria-label={label}\n className=\"overflow-auto whitespace-pre-wrap break-words rounded-md border border-border bg-muted/30 px-density-3 py-density-3 font-mono text-xs text-foreground\"\n >\n {text || \"No content\"}\n </pre>\n );\n}\n\nfunction PreviewNotice({\n title,\n message,\n tone = \"default\",\n}: {\n title: string;\n message: ReactNode;\n tone?: \"default\" | \"danger\";\n}) {\n return (\n <div\n className={cn(\n \"rounded-md border p-density-3\",\n tone === \"danger\"\n ? \"border-destructive/30 bg-destructive/5\"\n : \"border-border bg-muted/30\",\n )}\n >\n <div\n className={cn(\n \"text-sm font-medium\",\n tone === \"danger\" && \"text-destructive\",\n )}\n >\n {title}\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">{message}</div>\n </div>\n );\n}\n\nfunction normalizePreviewFormats(\n formats: readonly MarkdownEditorPreviewFormat[] | undefined,\n): MarkdownEditorPreviewFormat[] {\n const seen = new Set<MarkdownEditorPreviewFormat>();\n const source = formats && formats.length > 0 ? formats : MARKDOWN_EDITOR_PREVIEW_FORMATS;\n for (const format of source) {\n seen.add(format);\n }\n return [...seen];\n}\n\nfunction normalizeInitialFormat(\n format: MarkdownEditorPreviewFormat | undefined,\n formats: readonly MarkdownEditorPreviewFormat[],\n) {\n return format && formats.includes(format) ? format : undefined;\n}\n\nfunction cssSize(size: number | string) {\n return typeof size === \"number\" ? `${size}px` : size;\n}\n\nasync function resolvePreview({\n markdown,\n format,\n signal,\n previewEndpoint,\n previewMethod,\n previewHeaders,\n buildPreviewUrl,\n loadPreview,\n}: MarkdownEditorPreviewRequest & {\n previewEndpoint: string | undefined;\n previewMethod: \"GET\" | \"POST\" | \"PUT\";\n previewHeaders: MarkdownEditorPreviewHeaders | undefined;\n buildPreviewUrl: MarkdownEditorProps[\"buildPreviewUrl\"] | undefined;\n loadPreview: MarkdownEditorProps[\"loadPreview\"] | undefined;\n}): Promise<MarkdownEditorPreviewResult | undefined> {\n if (loadPreview) {\n return loadPreview({ markdown, format, signal });\n }\n\n const url =\n buildPreviewUrl?.({ markdown, format }) ??\n (previewEndpoint\n ? buildMarkdownPreviewUrl(previewEndpoint, format)\n : undefined);\n\n if (!url) {\n throw new Error(\"No preview endpoint configured\");\n }\n\n const headers = new Headers(\n typeof previewHeaders === \"function\"\n ? previewHeaders({ markdown, format })\n : previewHeaders,\n );\n headers.set(\"Accept\", previewAccept(format));\n\n const init: RequestInit = {\n method: previewMethod,\n headers,\n signal,\n };\n\n if (previewMethod !== \"GET\") {\n headers.set(\"Content-Type\", \"text/markdown; charset=utf-8\");\n init.body = markdown;\n }\n\n const response = await fetch(url, init);\n if (!response.ok) {\n throw new Error(\n `Preview failed with ${response.status} ${response.statusText}`.trim(),\n );\n }\n\n const contentType = response.headers.get(\"Content-Type\") ?? \"\";\n if (format === \"pdf\" || format === \"excel\" || isBinaryContent(contentType)) {\n return {\n kind: \"blob\",\n blob: await response.blob(),\n contentType,\n filename: previewFilename(format),\n };\n }\n\n const text = await response.text();\n if (format === \"react\") {\n return { kind: \"clicky\", data: text };\n }\n if (format === \"html\" || isHtmlContent(contentType)) {\n return { kind: \"html\", html: text };\n }\n if (format === \"json\" || isJsonContent(contentType)) {\n const parsed = parseJson(text);\n return parsed.ok\n ? { kind: \"json\", data: parsed.value }\n : { kind: \"text\", text, contentType };\n }\n return { kind: \"text\", text, contentType };\n}\n\nfunction previewAccept(format: MarkdownEditorPreviewFormat) {\n switch (format) {\n case \"react\":\n return \"application/json+clicky, application/clicky+json;q=0.9, application/json;q=0.8,*/*;q=0.7\";\n case \"html\":\n return \"text/html, */*;q=0.7\";\n case \"markdown\":\n return \"text/markdown, text/plain;q=0.8,*/*;q=0.7\";\n case \"pdf\":\n return \"application/pdf, */*;q=0.7\";\n case \"json\":\n return \"application/json, text/plain;q=0.8,*/*;q=0.7\";\n case \"csv\":\n return \"text/csv, text/plain;q=0.8,*/*;q=0.7\";\n case \"excel\":\n return \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, */*;q=0.7\";\n }\n}\n\nfunction previewFilename(format: MarkdownEditorPreviewFormat) {\n switch (format) {\n case \"react\":\n return \"preview.clicky.json\";\n case \"html\":\n return \"preview.html\";\n case \"markdown\":\n return \"preview.md\";\n case \"pdf\":\n return \"preview.pdf\";\n case \"json\":\n return \"preview.json\";\n case \"csv\":\n return \"preview.csv\";\n case \"excel\":\n return \"preview.xlsx\";\n }\n}\n\nfunction parseJson(text: string): { ok: true; value: unknown } | { ok: false } {\n try {\n return { ok: true, value: JSON.parse(text) as unknown };\n } catch {\n return { ok: false };\n }\n}\n\nfunction isJsonContent(contentType: string | undefined) {\n return contentType?.toLowerCase().includes(\"json\") ?? false;\n}\n\nfunction isHtmlContent(contentType: string | undefined) {\n return contentType?.toLowerCase().includes(\"html\") ?? false;\n}\n\nfunction isBinaryContent(contentType: string | undefined) {\n const normalized = contentType?.toLowerCase() ?? \"\";\n return (\n normalized.includes(\"application/pdf\") ||\n normalized.includes(\"spreadsheetml\") ||\n normalized.includes(\"application/vnd.ms-excel\")\n );\n}\n"],"names":["UiEye","UiFileCode","UiMarkdown","UiFileText","UiJson","UiFileSpreadsheet","useId","useMemo","useState","useEffect","cn","jsxs","jsx","Icon","UiEdit","SegmentedControl","IconButton","UiRefresh","UiCopy","Markdown","Clicky","JsonView","Button","MARKDOWN_EDITOR_PREVIEW_FORMATS","buildMarkdownPreviewUrl"],"mappings":"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"}
1
+ {"version":3,"file":"MarkdownEditor.cjs","sources":["../../src/data/MarkdownEditor.tsx"],"sourcesContent":["import {\n useEffect,\n useId,\n useMemo,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { Button } from \"../components/button\";\nimport { IconButton } from \"../components/IconButton\";\nimport {\n SegmentedControl,\n type SegmentedOption,\n} from \"../components/SegmentedControl\";\nimport { cn } from \"../lib/utils\";\nimport {\n UiCopy,\n UiEdit,\n UiEye,\n UiFileCode,\n UiFileSpreadsheet,\n UiFileText,\n UiJson,\n UiMarkdown,\n UiRefresh,\n} from \"../icons\";\nimport { Clicky, type ClickyProps } from \"./Clicky\";\nimport { Icon, type StaticIconComponent } from \"./Icon\";\nimport { JsonView } from \"./JsonView\";\nimport { Markdown } from \"./Markdown\";\nimport {\n buildMarkdownPreviewUrl,\n MARKDOWN_EDITOR_PREVIEW_FORMATS,\n type MarkdownEditorPreviewFormat,\n type MarkdownEditorPreviewHeaders,\n type MarkdownEditorPreviewRequest,\n type MarkdownEditorPreviewResult,\n} from \"./MarkdownEditor.model\";\n\nexport type MarkdownEditorProps = {\n /** Controlled markdown source. */\n value?: string;\n /** Initial markdown source for uncontrolled usage. */\n defaultValue?: string;\n /** Called whenever the editor source changes. */\n onChange?: (value: string) => void;\n /** Editor label. */\n label?: ReactNode;\n /** Textarea placeholder. */\n placeholder?: string;\n /** Preview formats to expose in the toolbar. */\n previewFormats?: readonly MarkdownEditorPreviewFormat[];\n /** Controlled active preview format. */\n previewFormat?: MarkdownEditorPreviewFormat;\n /** Initial active preview format for uncontrolled usage. */\n defaultPreviewFormat?: MarkdownEditorPreviewFormat;\n /** Called when the active preview format changes. */\n onPreviewFormatChange?: (format: MarkdownEditorPreviewFormat) => void;\n /** Clicky endpoint that accepts markdown and a `format=` query parameter. */\n previewEndpoint?: string;\n /** HTTP method for `previewEndpoint`; POST sends the markdown body. */\n previewMethod?: \"GET\" | \"POST\" | \"PUT\";\n /** Extra headers for remote previews. */\n previewHeaders?: MarkdownEditorPreviewHeaders;\n /** Build a URL for remote preview requests instead of `previewEndpoint`. */\n buildPreviewUrl?: (request: {\n markdown: string;\n format: MarkdownEditorPreviewFormat;\n }) => string | undefined;\n /**\n * Custom loader for host-specific markdown conversion. Return `undefined` for\n * a format to leave it on the local preview — Clicky's `format=` contract has\n * no `react`, so hosts commonly convert every other format remotely.\n */\n loadPreview?: (\n request: MarkdownEditorPreviewRequest,\n ) =>\n | Promise<MarkdownEditorPreviewResult | undefined>\n | MarkdownEditorPreviewResult\n | undefined;\n /** Local Clicky document for the React preview, or a mapper from markdown. */\n clickyData?: ClickyProps[\"data\"] | ((markdown: string) => ClickyProps[\"data\"] | undefined);\n /** Debounce interval for remote preview requests. */\n previewDebounceMs?: number;\n /** Minimum height for both editor and preview panes. */\n minHeight?: number | string;\n /** Disable editing and preview refresh. */\n disabled?: boolean;\n /** Render the source as read-only. */\n readOnly?: boolean;\n /** Classes applied to the component root. */\n className?: string;\n /** Classes applied to the textarea. */\n editorClassName?: string;\n /** Classes applied to the preview body. */\n previewClassName?: string;\n /** Extra toolbar content rendered after the built-in actions. */\n toolbar?: ReactNode;\n};\n\ntype PreviewState =\n | { status: \"idle\" }\n | { status: \"loading\"; result?: MarkdownEditorPreviewResult }\n | { status: \"success\"; result: MarkdownEditorPreviewResult }\n | { status: \"error\"; error: string; result?: MarkdownEditorPreviewResult };\n\ntype FormatMeta = {\n label: string;\n icon: StaticIconComponent;\n iconClassName?: string;\n};\n\nconst FORMAT_META: Record<MarkdownEditorPreviewFormat, FormatMeta> = {\n react: {\n label: \"React\",\n icon: UiEye,\n },\n html: {\n label: \"HTML\",\n icon: UiFileCode,\n },\n markdown: {\n label: \"Markdown\",\n icon: UiMarkdown,\n },\n pdf: {\n label: \"PDF\",\n icon: UiFileText,\n iconClassName: \"text-rose-600 dark:text-rose-400\",\n },\n json: {\n label: \"JSON\",\n icon: UiJson,\n },\n csv: {\n label: \"CSV\",\n icon: UiFileSpreadsheet,\n iconClassName: \"text-emerald-600 dark:text-emerald-400\",\n },\n excel: {\n label: \"Excel\",\n icon: UiFileSpreadsheet,\n iconClassName: \"text-emerald-700 dark:text-emerald-300\",\n },\n};\n\n/**\n * Split-pane markdown editor with local Markdown/React preview and optional\n * Clicky-backed format previews. Hosts can pass `previewEndpoint` for the\n * standard Clicky `format=` contract or `loadPreview` for custom conversion.\n */\nexport function MarkdownEditor({\n value,\n defaultValue = \"\",\n onChange,\n label = \"Markdown\",\n placeholder = \"Write markdown...\",\n previewFormats,\n previewFormat,\n defaultPreviewFormat,\n onPreviewFormatChange,\n previewEndpoint,\n previewMethod = \"POST\",\n previewHeaders,\n buildPreviewUrl,\n loadPreview,\n clickyData,\n previewDebounceMs = 350,\n minHeight = 420,\n disabled = false,\n readOnly = false,\n className,\n editorClassName,\n previewClassName,\n toolbar,\n}: MarkdownEditorProps) {\n const editorId = useId();\n const formats = useMemo(\n () => normalizePreviewFormats(previewFormats),\n [previewFormats],\n );\n const firstFormat = formats[0] ?? \"react\";\n const [draft, setDraft] = useState(defaultValue);\n const markdown = value ?? draft;\n const [internalFormat, setInternalFormat] = useState<MarkdownEditorPreviewFormat>(\n () =>\n normalizeInitialFormat(defaultPreviewFormat, formats) ??\n firstFormat,\n );\n const activeFormat = formats.includes(previewFormat ?? internalFormat)\n ? previewFormat ?? internalFormat\n : firstFormat;\n const [refreshKey, setRefreshKey] = useState(0);\n const [previewState, setPreviewState] = useState<PreviewState>({\n status: \"idle\",\n });\n const contentStyle = useMemo<CSSProperties>(\n () => ({ minHeight: cssSize(minHeight) }),\n [minHeight],\n );\n const remoteEnabled = Boolean(loadPreview || previewEndpoint || buildPreviewUrl);\n const currentMeta = FORMAT_META[activeFormat];\n const segmentOptions = useMemo<SegmentedOption<MarkdownEditorPreviewFormat>[]>(\n () =>\n formats.map((format) => {\n const meta = FORMAT_META[format];\n return {\n id: format,\n label: meta.label,\n icon: meta.icon,\n title: `${meta.label} preview`,\n };\n }),\n [formats],\n );\n\n useEffect(() => {\n if (formats.includes(activeFormat)) return;\n setInternalFormat(firstFormat);\n }, [activeFormat, firstFormat, formats]);\n\n useEffect(() => {\n if (!remoteEnabled) {\n setPreviewState({ status: \"idle\" });\n return;\n }\n\n const controller = new AbortController();\n const timeout = window.setTimeout(() => {\n setPreviewState((current) =>\n current.status === \"success\"\n ? { status: \"loading\", result: current.result }\n : { status: \"loading\" },\n );\n\n resolvePreview({\n markdown,\n format: activeFormat,\n signal: controller.signal,\n previewEndpoint,\n previewMethod,\n previewHeaders,\n buildPreviewUrl,\n loadPreview,\n })\n .then((result) => {\n if (controller.signal.aborted) return;\n setPreviewState(\n result ? { status: \"success\", result } : { status: \"idle\" },\n );\n })\n .catch((error: unknown) => {\n if (controller.signal.aborted) return;\n setPreviewState((current) => ({\n status: \"error\",\n error: error instanceof Error ? error.message : \"Preview failed\",\n ...(current.status === \"loading\" && current.result\n ? { result: current.result }\n : {}),\n }));\n });\n }, Math.max(0, previewDebounceMs));\n\n return () => {\n window.clearTimeout(timeout);\n controller.abort();\n };\n }, [\n activeFormat,\n buildPreviewUrl,\n loadPreview,\n markdown,\n previewDebounceMs,\n previewEndpoint,\n previewHeaders,\n previewMethod,\n refreshKey,\n remoteEnabled,\n ]);\n\n const updateMarkdown = (next: string) => {\n if (value === undefined) setDraft(next);\n onChange?.(next);\n };\n\n const updateFormat = (next: MarkdownEditorPreviewFormat) => {\n if (previewFormat === undefined) setInternalFormat(next);\n onPreviewFormatChange?.(next);\n };\n\n const copySource = () => {\n const clipboard = globalThis.navigator?.clipboard;\n if (clipboard?.writeText) {\n void clipboard.writeText(markdown).catch(() => undefined);\n }\n };\n\n return (\n <div className={cn(\"rounded-md border border-border bg-card\", className)}>\n <div className=\"flex flex-wrap items-center gap-density-2 border-b border-border px-density-3 py-density-2\">\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <Icon icon={UiEdit} className=\"text-base text-muted-foreground\" />\n <label\n htmlFor={editorId}\n className=\"truncate text-sm font-medium text-card-foreground\"\n >\n {label}\n </label>\n {previewState.status === \"loading\" && (\n <span className=\"text-xs text-muted-foreground\">Refreshing...</span>\n )}\n </div>\n <div className=\"flex min-w-0 flex-wrap items-center justify-end gap-2\">\n <SegmentedControl\n value={activeFormat}\n options={segmentOptions}\n onChange={updateFormat}\n size=\"sm\"\n aria-label=\"Markdown preview format\"\n className=\"max-w-full flex-wrap\"\n />\n {remoteEnabled && (\n <IconButton\n icon={UiRefresh}\n label=\"Refresh preview\"\n disabled={disabled}\n onClick={() => setRefreshKey((current) => current + 1)}\n />\n )}\n <IconButton icon={UiCopy} label=\"Copy markdown\" onClick={copySource} />\n {toolbar}\n </div>\n </div>\n\n <div className=\"grid gap-density-3 p-density-3 lg:grid-cols-[minmax(0,1fr)_minmax(0,1fr)]\">\n <div className=\"min-w-0 overflow-hidden rounded-md border border-border bg-background\">\n <div className=\"border-b border-border px-density-3 py-density-2 text-xs font-medium text-muted-foreground\">\n Source\n </div>\n <textarea\n id={editorId}\n value={markdown}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n spellCheck\n onChange={(event) => updateMarkdown(event.currentTarget.value)}\n className={cn(\n \"block w-full resize-y border-0 bg-transparent px-density-3 py-density-3 font-mono text-sm leading-6 text-foreground outline-none placeholder:text-placeholder disabled:cursor-not-allowed disabled:opacity-60\",\n editorClassName,\n )}\n style={contentStyle}\n />\n </div>\n\n <div className=\"min-w-0 overflow-hidden rounded-md border border-border bg-background\">\n <div className=\"flex items-center gap-2 border-b border-border px-density-3 py-density-2 text-xs font-medium text-muted-foreground\">\n <Icon\n icon={currentMeta.icon}\n className={cn(\"text-sm\", currentMeta.iconClassName)}\n />\n <span>{currentMeta.label}</span>\n </div>\n <div\n className={cn(\n \"overflow-auto px-density-3 py-density-3\",\n previewClassName,\n )}\n style={contentStyle}\n >\n <MarkdownEditorPreview\n format={activeFormat}\n markdown={markdown}\n state={previewState}\n clickyData={clickyData}\n />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction MarkdownEditorPreview({\n format,\n markdown,\n state,\n clickyData,\n}: {\n format: MarkdownEditorPreviewFormat;\n markdown: string;\n state: PreviewState;\n clickyData?: MarkdownEditorProps[\"clickyData\"];\n}) {\n const result =\n state.status === \"success\" || state.status === \"loading\" || state.status === \"error\"\n ? state.result\n : undefined;\n\n return (\n <div className=\"space-y-density-3\">\n {state.status === \"error\" && (\n <PreviewNotice title=\"Preview failed\" message={state.error} tone=\"danger\" />\n )}\n {result ? (\n <PreviewResult format={format} result={result} />\n ) : (\n <LocalPreview\n format={format}\n markdown={markdown}\n clickyData={clickyData}\n />\n )}\n </div>\n );\n}\n\nfunction LocalPreview({\n format,\n markdown,\n clickyData,\n}: {\n format: MarkdownEditorPreviewFormat;\n markdown: string;\n clickyData?: MarkdownEditorProps[\"clickyData\"];\n}) {\n if (format === \"react\") {\n const data =\n typeof clickyData === \"function\" ? clickyData(markdown) : clickyData;\n return data === undefined ? <Markdown text={markdown} /> : <Clicky data={data} />;\n }\n\n if (format === \"markdown\") {\n return <TextPreview label=\"Markdown source\" text={markdown} />;\n }\n\n return (\n <PreviewNotice\n title={`${FORMAT_META[format].label} preview not configured`}\n message=\"Pass previewEndpoint or loadPreview to render this format from Clicky.\"\n />\n );\n}\n\nfunction PreviewResult({\n format,\n result,\n}: {\n format: MarkdownEditorPreviewFormat;\n result: MarkdownEditorPreviewResult;\n}) {\n switch (result.kind) {\n case \"clicky\":\n return <Clicky data={result.data} />;\n case \"html\":\n return <HtmlPreview html={result.html} />;\n case \"json\":\n return <JsonView data={result.data} format=\"json\" />;\n case \"url\":\n return <UrlPreview format={format} url={result.url} />;\n case \"blob\":\n return <BlobPreview format={format} result={result} />;\n case \"text\":\n return <TextResult format={format} result={result} />;\n }\n}\n\nfunction TextResult({\n format,\n result,\n}: {\n format: MarkdownEditorPreviewFormat;\n result: Extract<MarkdownEditorPreviewResult, { kind: \"text\" }>;\n}) {\n if (format === \"react\") {\n return <Clicky data={result.text} />;\n }\n\n if (format === \"html\" || isHtmlContent(result.contentType)) {\n return <HtmlPreview html={result.text} />;\n }\n\n if (format === \"json\" || isJsonContent(result.contentType)) {\n const parsed = parseJson(result.text);\n return parsed.ok ? (\n <JsonView data={parsed.value} format=\"json\" />\n ) : (\n <TextPreview label=\"JSON output\" text={result.text} />\n );\n }\n\n return (\n <TextPreview\n label={`${FORMAT_META[format].label} output`}\n text={result.text}\n />\n );\n}\n\nfunction UrlPreview({\n format,\n url,\n}: {\n format: MarkdownEditorPreviewFormat;\n url: string;\n}) {\n if (format === \"react\") {\n return <Clicky url={url} view={[\"clicky\"]} download={{ all: false }} />;\n }\n\n if (format === \"html\") {\n return <HtmlPreview src={url} />;\n }\n\n if (format === \"pdf\") {\n return <FramePreview title=\"PDF preview\" src={url} />;\n }\n\n if (format === \"excel\") {\n return <DownloadPreview label=\"Open Excel workbook\" href={url} />;\n }\n\n return <TextPreview label={`${FORMAT_META[format].label} URL`} text={url} />;\n}\n\nfunction BlobPreview({\n format,\n result,\n}: {\n format: MarkdownEditorPreviewFormat;\n result: Extract<MarkdownEditorPreviewResult, { kind: \"blob\" }>;\n}) {\n const [url, setUrl] = useState<string>();\n\n useEffect(() => {\n const next = URL.createObjectURL(result.blob);\n setUrl(next);\n return () => URL.revokeObjectURL(next);\n }, [result.blob]);\n\n if (!url) {\n return <PreviewNotice title=\"Preparing preview\" message=\"Creating object URL.\" />;\n }\n\n if (format === \"pdf\") {\n return <FramePreview title=\"PDF preview\" src={url} />;\n }\n\n return (\n <DownloadPreview\n label={`Open ${FORMAT_META[format].label}`}\n href={url}\n {...(result.filename ? { download: result.filename } : {})}\n />\n );\n}\n\nfunction HtmlPreview({\n html,\n src,\n}: {\n html?: string;\n src?: string;\n}) {\n return (\n <FramePreview\n title=\"HTML preview\"\n {...(src ? { src } : {})}\n {...(html ? { srcDoc: html } : {})}\n sandbox=\"allow-same-origin\"\n />\n );\n}\n\nfunction FramePreview({\n title,\n src,\n srcDoc,\n sandbox,\n}: {\n title: string;\n src?: string;\n srcDoc?: string;\n sandbox?: string;\n}) {\n return (\n <div className=\"overflow-hidden rounded-md border border-border bg-background\">\n <iframe\n title={title}\n {...(src ? { src } : {})}\n {...(srcDoc ? { srcDoc } : {})}\n {...(sandbox ? { sandbox } : {})}\n className=\"h-[720px] w-full bg-background\"\n />\n </div>\n );\n}\n\nfunction DownloadPreview({\n label,\n href,\n download,\n}: {\n label: string;\n href: string;\n download?: string;\n}) {\n return (\n <PreviewNotice\n title=\"Inline preview unavailable\"\n message={\n <Button asChild variant=\"outline\" size=\"sm\">\n <a\n href={href}\n target=\"_blank\"\n rel=\"noreferrer\"\n {...(download ? { download } : {})}\n >\n {label}\n </a>\n </Button>\n }\n />\n );\n}\n\nfunction TextPreview({ label, text }: { label: string; text: string }) {\n return (\n <pre\n aria-label={label}\n className=\"overflow-auto whitespace-pre-wrap break-words rounded-md border border-border bg-muted/30 px-density-3 py-density-3 font-mono text-xs text-foreground\"\n >\n {text || \"No content\"}\n </pre>\n );\n}\n\nfunction PreviewNotice({\n title,\n message,\n tone = \"default\",\n}: {\n title: string;\n message: ReactNode;\n tone?: \"default\" | \"danger\";\n}) {\n return (\n <div\n className={cn(\n \"rounded-md border p-density-3\",\n tone === \"danger\"\n ? \"border-destructive/30 bg-destructive/5\"\n : \"border-border bg-muted/30\",\n )}\n >\n <div\n className={cn(\n \"text-sm font-medium\",\n tone === \"danger\" && \"text-destructive\",\n )}\n >\n {title}\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">{message}</div>\n </div>\n );\n}\n\nfunction normalizePreviewFormats(\n formats: readonly MarkdownEditorPreviewFormat[] | undefined,\n): MarkdownEditorPreviewFormat[] {\n const seen = new Set<MarkdownEditorPreviewFormat>();\n const source = formats && formats.length > 0 ? formats : MARKDOWN_EDITOR_PREVIEW_FORMATS;\n for (const format of source) {\n seen.add(format);\n }\n return [...seen];\n}\n\nfunction normalizeInitialFormat(\n format: MarkdownEditorPreviewFormat | undefined,\n formats: readonly MarkdownEditorPreviewFormat[],\n) {\n return format && formats.includes(format) ? format : undefined;\n}\n\nfunction cssSize(size: number | string) {\n return typeof size === \"number\" ? `${size}px` : size;\n}\n\nasync function resolvePreview({\n markdown,\n format,\n signal,\n previewEndpoint,\n previewMethod,\n previewHeaders,\n buildPreviewUrl,\n loadPreview,\n}: MarkdownEditorPreviewRequest & {\n previewEndpoint: string | undefined;\n previewMethod: \"GET\" | \"POST\" | \"PUT\";\n previewHeaders: MarkdownEditorPreviewHeaders | undefined;\n buildPreviewUrl: MarkdownEditorProps[\"buildPreviewUrl\"] | undefined;\n loadPreview: MarkdownEditorProps[\"loadPreview\"] | undefined;\n}): Promise<MarkdownEditorPreviewResult | undefined> {\n if (loadPreview) {\n return loadPreview({ markdown, format, signal });\n }\n\n const url =\n buildPreviewUrl?.({ markdown, format }) ??\n (previewEndpoint\n ? buildMarkdownPreviewUrl(previewEndpoint, format)\n : undefined);\n\n if (!url) {\n throw new Error(\"No preview endpoint configured\");\n }\n\n const headers = new Headers(\n typeof previewHeaders === \"function\"\n ? previewHeaders({ markdown, format })\n : previewHeaders,\n );\n headers.set(\"Accept\", previewAccept(format));\n\n const init: RequestInit = {\n method: previewMethod,\n headers,\n signal,\n };\n\n if (previewMethod !== \"GET\") {\n headers.set(\"Content-Type\", \"text/markdown; charset=utf-8\");\n init.body = markdown;\n }\n\n const response = await fetch(url, init);\n if (!response.ok) {\n throw new Error(\n `Preview failed with ${response.status} ${response.statusText}`.trim(),\n );\n }\n\n const contentType = response.headers.get(\"Content-Type\") ?? \"\";\n if (format === \"pdf\" || format === \"excel\" || isBinaryContent(contentType)) {\n return {\n kind: \"blob\",\n blob: await response.blob(),\n contentType,\n filename: previewFilename(format),\n };\n }\n\n const text = await response.text();\n if (format === \"react\") {\n return { kind: \"clicky\", data: text };\n }\n if (format === \"html\" || isHtmlContent(contentType)) {\n return { kind: \"html\", html: text };\n }\n if (format === \"json\" || isJsonContent(contentType)) {\n const parsed = parseJson(text);\n return parsed.ok\n ? { kind: \"json\", data: parsed.value }\n : { kind: \"text\", text, contentType };\n }\n return { kind: \"text\", text, contentType };\n}\n\nfunction previewAccept(format: MarkdownEditorPreviewFormat) {\n switch (format) {\n case \"react\":\n return \"application/json+clicky, application/clicky+json;q=0.9, application/json;q=0.8,*/*;q=0.7\";\n case \"html\":\n return \"text/html, */*;q=0.7\";\n case \"markdown\":\n return \"text/markdown, text/plain;q=0.8,*/*;q=0.7\";\n case \"pdf\":\n return \"application/pdf, */*;q=0.7\";\n case \"json\":\n return \"application/json, text/plain;q=0.8,*/*;q=0.7\";\n case \"csv\":\n return \"text/csv, text/plain;q=0.8,*/*;q=0.7\";\n case \"excel\":\n return \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, */*;q=0.7\";\n }\n}\n\nfunction previewFilename(format: MarkdownEditorPreviewFormat) {\n switch (format) {\n case \"react\":\n return \"preview.clicky.json\";\n case \"html\":\n return \"preview.html\";\n case \"markdown\":\n return \"preview.md\";\n case \"pdf\":\n return \"preview.pdf\";\n case \"json\":\n return \"preview.json\";\n case \"csv\":\n return \"preview.csv\";\n case \"excel\":\n return \"preview.xlsx\";\n }\n}\n\nfunction parseJson(text: string): { ok: true; value: unknown } | { ok: false } {\n try {\n return { ok: true, value: JSON.parse(text) as unknown };\n } catch {\n return { ok: false };\n }\n}\n\nfunction isJsonContent(contentType: string | undefined) {\n return contentType?.toLowerCase().includes(\"json\") ?? false;\n}\n\nfunction isHtmlContent(contentType: string | undefined) {\n return contentType?.toLowerCase().includes(\"html\") ?? false;\n}\n\nfunction isBinaryContent(contentType: string | undefined) {\n const normalized = contentType?.toLowerCase() ?? \"\";\n return (\n normalized.includes(\"application/pdf\") ||\n normalized.includes(\"spreadsheetml\") ||\n normalized.includes(\"application/vnd.ms-excel\")\n );\n}\n"],"names":["UiEye","UiFileCode","UiMarkdown","UiFileText","UiJson","UiFileSpreadsheet","useId","useMemo","useState","useEffect","cn","jsxs","jsx","Icon","UiEdit","SegmentedControl","IconButton","UiRefresh","UiCopy","Markdown","Clicky","JsonView","Button","MARKDOWN_EDITOR_PREVIEW_FORMATS","buildMarkdownPreviewUrl"],"mappings":"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"}
@@ -321,7 +321,7 @@ function PreviewResult({
321
321
  case "html":
322
322
  return /* @__PURE__ */ jsx(HtmlPreview, { html: result.html });
323
323
  case "json":
324
- return /* @__PURE__ */ jsx(JsonView, { data: result.data });
324
+ return /* @__PURE__ */ jsx(JsonView, { data: result.data, format: "json" });
325
325
  case "url":
326
326
  return /* @__PURE__ */ jsx(UrlPreview, { format, url: result.url });
327
327
  case "blob":
@@ -342,7 +342,7 @@ function TextResult({
342
342
  }
343
343
  if (format === "json" || isJsonContent(result.contentType)) {
344
344
  const parsed = parseJson(result.text);
345
- return parsed.ok ? /* @__PURE__ */ jsx(JsonView, { data: parsed.value }) : /* @__PURE__ */ jsx(TextPreview, { label: "JSON output", text: result.text });
345
+ return parsed.ok ? /* @__PURE__ */ jsx(JsonView, { data: parsed.value, format: "json" }) : /* @__PURE__ */ jsx(TextPreview, { label: "JSON output", text: result.text });
346
346
  }
347
347
  return /* @__PURE__ */ jsx(
348
348
  TextPreview,