@flanksource/clicky-ui 0.3.43 → 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 (483) 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/CodeLine.cjs +22 -0
  22. package/dist/data/CodeLine.cjs.map +1 -0
  23. package/dist/data/CodeLine.d.ts +8 -0
  24. package/dist/data/CodeLine.d.ts.map +1 -0
  25. package/dist/data/CodeLine.js +22 -0
  26. package/dist/data/CodeLine.js.map +1 -0
  27. package/dist/data/GraphDiagram.cjs +18 -6
  28. package/dist/data/GraphDiagram.cjs.map +1 -1
  29. package/dist/data/GraphDiagram.d.ts +9 -1
  30. package/dist/data/GraphDiagram.d.ts.map +1 -1
  31. package/dist/data/GraphDiagram.js +18 -6
  32. package/dist/data/GraphDiagram.js.map +1 -1
  33. package/dist/data/GraphDiagramNodes.cjs +38 -29
  34. package/dist/data/GraphDiagramNodes.cjs.map +1 -1
  35. package/dist/data/GraphDiagramNodes.d.ts +8 -2
  36. package/dist/data/GraphDiagramNodes.d.ts.map +1 -1
  37. package/dist/data/GraphDiagramNodes.js +38 -29
  38. package/dist/data/GraphDiagramNodes.js.map +1 -1
  39. package/dist/data/JsonView.cjs +118 -49
  40. package/dist/data/JsonView.cjs.map +1 -1
  41. package/dist/data/JsonView.d.ts +13 -10
  42. package/dist/data/JsonView.d.ts.map +1 -1
  43. package/dist/data/JsonView.js +118 -49
  44. package/dist/data/JsonView.js.map +1 -1
  45. package/dist/data/MarkdownEditor.cjs +2 -2
  46. package/dist/data/MarkdownEditor.cjs.map +1 -1
  47. package/dist/data/MarkdownEditor.js +2 -2
  48. package/dist/data/MarkdownEditor.js.map +1 -1
  49. package/dist/data/ai/AdvancedChatConfig.cjs +90 -249
  50. package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -1
  51. package/dist/data/ai/AdvancedChatConfig.d.ts +2 -5
  52. package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -1
  53. package/dist/data/ai/AdvancedChatConfig.js +91 -250
  54. package/dist/data/ai/AdvancedChatConfig.js.map +1 -1
  55. package/dist/data/ai/ChatButton.cjs +2 -0
  56. package/dist/data/ai/ChatButton.cjs.map +1 -1
  57. package/dist/data/ai/ChatButton.d.ts +1 -1
  58. package/dist/data/ai/ChatButton.d.ts.map +1 -1
  59. package/dist/data/ai/ChatButton.js +2 -0
  60. package/dist/data/ai/ChatButton.js.map +1 -1
  61. package/dist/data/ai/ChatFab.cjs +5 -1
  62. package/dist/data/ai/ChatFab.cjs.map +1 -1
  63. package/dist/data/ai/ChatFab.d.ts +5 -1
  64. package/dist/data/ai/ChatFab.d.ts.map +1 -1
  65. package/dist/data/ai/ChatFab.js +5 -1
  66. package/dist/data/ai/ChatFab.js.map +1 -1
  67. package/dist/data/ai/ChatWindow.cjs +2 -8
  68. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  69. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  70. package/dist/data/ai/ChatWindow.js +2 -8
  71. package/dist/data/ai/ChatWindow.js.map +1 -1
  72. package/dist/data/ai/ChatWindow.runtime.cjs +0 -5
  73. package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
  74. package/dist/data/ai/ChatWindow.runtime.d.ts +0 -2
  75. package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
  76. package/dist/data/ai/ChatWindow.runtime.js +0 -5
  77. package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
  78. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +2 -2
  79. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
  80. package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
  81. package/dist/data/ai/PromptRunEditor/runtimeActions.js +2 -2
  82. package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
  83. package/dist/data/ai/SessionInspector.approvals.cjs +3 -6
  84. package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
  85. package/dist/data/ai/SessionInspector.approvals.js +3 -6
  86. package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
  87. package/dist/data/ai/SessionViewer.cjs +13 -4
  88. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  89. package/dist/data/ai/SessionViewer.d.ts +5 -1
  90. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  91. package/dist/data/ai/SessionViewer.header.cjs +1 -1
  92. package/dist/data/ai/SessionViewer.header.cjs.map +1 -1
  93. package/dist/data/ai/SessionViewer.header.js +1 -1
  94. package/dist/data/ai/SessionViewer.header.js.map +1 -1
  95. package/dist/data/ai/SessionViewer.js +13 -4
  96. package/dist/data/ai/SessionViewer.js.map +1 -1
  97. package/dist/data/ai/SessionViewer.model.cjs +2 -0
  98. package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
  99. package/dist/data/ai/SessionViewer.model.d.ts +1 -0
  100. package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
  101. package/dist/data/ai/SessionViewer.model.js +2 -0
  102. package/dist/data/ai/SessionViewer.model.js.map +1 -1
  103. package/dist/data/ai/SessionViewer.rows.cjs +41 -27
  104. package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
  105. package/dist/data/ai/SessionViewer.rows.d.ts +4 -2
  106. package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
  107. package/dist/data/ai/SessionViewer.rows.js +41 -27
  108. package/dist/data/ai/SessionViewer.rows.js.map +1 -1
  109. package/dist/data/ai/SessionViewer.tokens.cjs +35 -0
  110. package/dist/data/ai/SessionViewer.tokens.cjs.map +1 -0
  111. package/dist/data/ai/SessionViewer.tokens.d.ts +5 -0
  112. package/dist/data/ai/SessionViewer.tokens.d.ts.map +1 -0
  113. package/dist/data/ai/SessionViewer.tokens.js +35 -0
  114. package/dist/data/ai/SessionViewer.tokens.js.map +1 -0
  115. package/dist/data/ai/SessionViewer.tool-cost.cjs +128 -0
  116. package/dist/data/ai/SessionViewer.tool-cost.cjs.map +1 -0
  117. package/dist/data/ai/SessionViewer.tool-cost.d.ts +6 -0
  118. package/dist/data/ai/SessionViewer.tool-cost.d.ts.map +1 -0
  119. package/dist/data/ai/SessionViewer.tool-cost.js +128 -0
  120. package/dist/data/ai/SessionViewer.tool-cost.js.map +1 -0
  121. package/dist/data/ai/SessionViewer.tool-details.cjs +3 -1
  122. package/dist/data/ai/SessionViewer.tool-details.cjs.map +1 -1
  123. package/dist/data/ai/SessionViewer.tool-details.d.ts.map +1 -1
  124. package/dist/data/ai/SessionViewer.tool-details.js +3 -1
  125. package/dist/data/ai/SessionViewer.tool-details.js.map +1 -1
  126. package/dist/data/ai/SessionViewer.tool-row.cjs +55 -35
  127. package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
  128. package/dist/data/ai/SessionViewer.tool-row.d.ts +2 -1
  129. package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
  130. package/dist/data/ai/SessionViewer.tool-row.js +55 -35
  131. package/dist/data/ai/SessionViewer.tool-row.js.map +1 -1
  132. package/dist/data/ai/SessionViewer.unified.d.ts +4 -0
  133. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  134. package/dist/data/ai/SessionViewerMenu.cjs +18 -1
  135. package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
  136. package/dist/data/ai/SessionViewerMenu.d.ts +6 -1
  137. package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
  138. package/dist/data/ai/SessionViewerMenu.js +18 -1
  139. package/dist/data/ai/SessionViewerMenu.js.map +1 -1
  140. package/dist/data/ai/ToolPreferences.cjs +149 -143
  141. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  142. package/dist/data/ai/ToolPreferences.d.ts +20 -6
  143. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  144. package/dist/data/ai/ToolPreferences.js +151 -146
  145. package/dist/data/ai/ToolPreferences.js.map +1 -1
  146. package/dist/data/ai/ToolPreferences.model.cjs +14 -10
  147. package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
  148. package/dist/data/ai/ToolPreferences.model.d.ts +1 -0
  149. package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
  150. package/dist/data/ai/ToolPreferences.model.js +15 -11
  151. package/dist/data/ai/ToolPreferences.model.js.map +1 -1
  152. package/dist/data/ai/ToolPreferencesList.cjs +1 -0
  153. package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
  154. package/dist/data/ai/ToolPreferencesList.d.ts +4 -1
  155. package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
  156. package/dist/data/ai/ToolPreferencesList.js +2 -1
  157. package/dist/data/ai/ToolPreferencesList.js.map +1 -1
  158. package/dist/data/ai/ToolSchemaBrowser.cjs +52 -53
  159. package/dist/data/ai/ToolSchemaBrowser.cjs.map +1 -1
  160. package/dist/data/ai/ToolSchemaBrowser.d.ts +6 -3
  161. package/dist/data/ai/ToolSchemaBrowser.d.ts.map +1 -1
  162. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs +9 -13
  163. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs.map +1 -1
  164. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts +5 -2
  165. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts.map +1 -1
  166. package/dist/data/ai/ToolSchemaBrowser.directory-header.js +9 -13
  167. package/dist/data/ai/ToolSchemaBrowser.directory-header.js.map +1 -1
  168. package/dist/data/ai/ToolSchemaBrowser.js +53 -54
  169. package/dist/data/ai/ToolSchemaBrowser.js.map +1 -1
  170. package/dist/data/ai/ToolSchemaBrowser.model.cjs +19 -27
  171. package/dist/data/ai/ToolSchemaBrowser.model.cjs.map +1 -1
  172. package/dist/data/ai/ToolSchemaBrowser.model.d.ts +9 -6
  173. package/dist/data/ai/ToolSchemaBrowser.model.d.ts.map +1 -1
  174. package/dist/data/ai/ToolSchemaBrowser.model.js +20 -28
  175. package/dist/data/ai/ToolSchemaBrowser.model.js.map +1 -1
  176. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs +12 -213
  177. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs.map +1 -1
  178. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts +1 -3
  179. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts.map +1 -1
  180. package/dist/data/ai/ToolSchemaBrowser.sidebar.js +13 -214
  181. package/dist/data/ai/ToolSchemaBrowser.sidebar.js.map +1 -1
  182. package/dist/data/ai/ToolSchemaBrowser.strategies.cjs +54 -0
  183. package/dist/data/ai/ToolSchemaBrowser.strategies.cjs.map +1 -0
  184. package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts +9 -0
  185. package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts.map +1 -0
  186. package/dist/data/ai/ToolSchemaBrowser.strategies.js +54 -0
  187. package/dist/data/ai/ToolSchemaBrowser.strategies.js.map +1 -0
  188. package/dist/data/ai/ToolSchemaBrowser.tree.cjs +179 -0
  189. package/dist/data/ai/ToolSchemaBrowser.tree.cjs.map +1 -0
  190. package/dist/data/ai/ToolSchemaBrowser.tree.d.ts +20 -0
  191. package/dist/data/ai/ToolSchemaBrowser.tree.d.ts.map +1 -0
  192. package/dist/data/ai/ToolSchemaBrowser.tree.js +179 -0
  193. package/dist/data/ai/ToolSchemaBrowser.tree.js.map +1 -0
  194. package/dist/data/ai/index.d.ts +2 -2
  195. package/dist/data/ai/index.d.ts.map +1 -1
  196. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs +8 -28
  197. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs.map +1 -1
  198. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts.map +1 -1
  199. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js +9 -29
  200. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js.map +1 -1
  201. package/dist/data/ai/session-token-sizing.d.ts +32 -0
  202. package/dist/data/ai/session-token-sizing.d.ts.map +1 -0
  203. package/dist/data/ai/use-session-token-sizing.cjs +73 -0
  204. package/dist/data/ai/use-session-token-sizing.cjs.map +1 -0
  205. package/dist/data/ai/use-session-token-sizing.d.ts +21 -0
  206. package/dist/data/ai/use-session-token-sizing.d.ts.map +1 -0
  207. package/dist/data/ai/use-session-token-sizing.js +73 -0
  208. package/dist/data/ai/use-session-token-sizing.js.map +1 -0
  209. package/dist/data/call-graph/CallGraph.cjs +250 -0
  210. package/dist/data/call-graph/CallGraph.cjs.map +1 -0
  211. package/dist/data/call-graph/CallGraph.d.ts +69 -0
  212. package/dist/data/call-graph/CallGraph.d.ts.map +1 -0
  213. package/dist/data/call-graph/CallGraph.js +250 -0
  214. package/dist/data/call-graph/CallGraph.js.map +1 -0
  215. package/dist/data/call-graph/CallGraphGlyphs.cjs +39 -0
  216. package/dist/data/call-graph/CallGraphGlyphs.cjs.map +1 -0
  217. package/dist/data/call-graph/CallGraphGlyphs.d.ts +19 -0
  218. package/dist/data/call-graph/CallGraphGlyphs.d.ts.map +1 -0
  219. package/dist/data/call-graph/CallGraphGlyphs.js +39 -0
  220. package/dist/data/call-graph/CallGraphGlyphs.js.map +1 -0
  221. package/dist/data/call-graph/CallGraphMembers.cjs +50 -0
  222. package/dist/data/call-graph/CallGraphMembers.cjs.map +1 -0
  223. package/dist/data/call-graph/CallGraphMembers.d.ts +22 -0
  224. package/dist/data/call-graph/CallGraphMembers.d.ts.map +1 -0
  225. package/dist/data/call-graph/CallGraphMembers.js +50 -0
  226. package/dist/data/call-graph/CallGraphMembers.js.map +1 -0
  227. package/dist/data/call-graph/CallGraphParts.cjs +204 -0
  228. package/dist/data/call-graph/CallGraphParts.cjs.map +1 -0
  229. package/dist/data/call-graph/CallGraphParts.d.ts +44 -0
  230. package/dist/data/call-graph/CallGraphParts.d.ts.map +1 -0
  231. package/dist/data/call-graph/CallGraphParts.js +204 -0
  232. package/dist/data/call-graph/CallGraphParts.js.map +1 -0
  233. package/dist/data/call-graph/CallGraphToolbar.cjs +186 -0
  234. package/dist/data/call-graph/CallGraphToolbar.cjs.map +1 -0
  235. package/dist/data/call-graph/CallGraphToolbar.d.ts +45 -0
  236. package/dist/data/call-graph/CallGraphToolbar.d.ts.map +1 -0
  237. package/dist/data/call-graph/CallGraphToolbar.js +186 -0
  238. package/dist/data/call-graph/CallGraphToolbar.js.map +1 -0
  239. package/dist/data/call-graph/call-graph-exclude.cjs +75 -0
  240. package/dist/data/call-graph/call-graph-exclude.cjs.map +1 -0
  241. package/dist/data/call-graph/call-graph-exclude.d.ts +31 -0
  242. package/dist/data/call-graph/call-graph-exclude.d.ts.map +1 -0
  243. package/dist/data/call-graph/call-graph-exclude.js +75 -0
  244. package/dist/data/call-graph/call-graph-exclude.js.map +1 -0
  245. package/dist/data/call-graph/call-graph-labels.cjs +96 -0
  246. package/dist/data/call-graph/call-graph-labels.cjs.map +1 -0
  247. package/dist/data/call-graph/call-graph-labels.d.ts +53 -0
  248. package/dist/data/call-graph/call-graph-labels.d.ts.map +1 -0
  249. package/dist/data/call-graph/call-graph-labels.js +96 -0
  250. package/dist/data/call-graph/call-graph-labels.js.map +1 -0
  251. package/dist/data/call-graph/call-graph-model.cjs +161 -0
  252. package/dist/data/call-graph/call-graph-model.cjs.map +1 -0
  253. package/dist/data/call-graph/call-graph-model.d.ts +102 -0
  254. package/dist/data/call-graph/call-graph-model.d.ts.map +1 -0
  255. package/dist/data/call-graph/call-graph-model.js +161 -0
  256. package/dist/data/call-graph/call-graph-model.js.map +1 -0
  257. package/dist/data/call-graph/call-graph-vocabulary.cjs +177 -0
  258. package/dist/data/call-graph/call-graph-vocabulary.cjs.map +1 -0
  259. package/dist/data/call-graph/call-graph-vocabulary.d.ts +72 -0
  260. package/dist/data/call-graph/call-graph-vocabulary.d.ts.map +1 -0
  261. package/dist/data/call-graph/call-graph-vocabulary.js +177 -0
  262. package/dist/data/call-graph/call-graph-vocabulary.js.map +1 -0
  263. package/dist/data/call-graph/call-graph.fixtures.d.ts +63 -0
  264. package/dist/data/call-graph/call-graph.fixtures.d.ts.map +1 -0
  265. package/dist/data/call-graph/index.d.ts +7 -0
  266. package/dist/data/call-graph/index.d.ts.map +1 -0
  267. package/dist/data/call-graph/types.cjs +5 -0
  268. package/dist/data/call-graph/types.cjs.map +1 -0
  269. package/dist/data/call-graph/types.d.ts +135 -0
  270. package/dist/data/call-graph/types.d.ts.map +1 -0
  271. package/dist/data/call-graph/types.js +5 -0
  272. package/dist/data/call-graph/types.js.map +1 -0
  273. package/dist/data/call-graph/use-call-graph.cjs +93 -0
  274. package/dist/data/call-graph/use-call-graph.cjs.map +1 -0
  275. package/dist/data/call-graph/use-call-graph.d.ts +24 -0
  276. package/dist/data/call-graph/use-call-graph.d.ts.map +1 -0
  277. package/dist/data/call-graph/use-call-graph.js +93 -0
  278. package/dist/data/call-graph/use-call-graph.js.map +1 -0
  279. package/dist/data/chat/Chat.cjs +39 -15
  280. package/dist/data/chat/Chat.cjs.map +1 -1
  281. package/dist/data/chat/Chat.d.ts.map +1 -1
  282. package/dist/data/chat/Chat.fixtures.cjs +2 -2
  283. package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
  284. package/dist/data/chat/Chat.fixtures.js +2 -2
  285. package/dist/data/chat/Chat.fixtures.js.map +1 -1
  286. package/dist/data/chat/Chat.js +40 -16
  287. package/dist/data/chat/Chat.js.map +1 -1
  288. package/dist/data/chat/ChatRuntimeToolbar.cjs +3 -6
  289. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  290. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  291. package/dist/data/chat/ChatRuntimeToolbar.js +3 -6
  292. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  293. package/dist/data/chat/ContextMeter.bar.cjs +5 -8
  294. package/dist/data/chat/ContextMeter.bar.cjs.map +1 -1
  295. package/dist/data/chat/ContextMeter.bar.d.ts +1 -1
  296. package/dist/data/chat/ContextMeter.bar.d.ts.map +1 -1
  297. package/dist/data/chat/ContextMeter.bar.js +5 -8
  298. package/dist/data/chat/ContextMeter.bar.js.map +1 -1
  299. package/dist/data/chat/ContextMeter.cjs +18 -19
  300. package/dist/data/chat/ContextMeter.cjs.map +1 -1
  301. package/dist/data/chat/ContextMeter.d.ts +1 -1
  302. package/dist/data/chat/ContextMeter.d.ts.map +1 -1
  303. package/dist/data/chat/ContextMeter.js +18 -19
  304. package/dist/data/chat/ContextMeter.js.map +1 -1
  305. package/dist/data/chat/Conversation.cjs +2 -1
  306. package/dist/data/chat/Conversation.cjs.map +1 -1
  307. package/dist/data/chat/Conversation.d.ts +4 -1
  308. package/dist/data/chat/Conversation.d.ts.map +1 -1
  309. package/dist/data/chat/Conversation.js +2 -1
  310. package/dist/data/chat/Conversation.js.map +1 -1
  311. package/dist/data/chat/Message.cjs +39 -12
  312. package/dist/data/chat/Message.cjs.map +1 -1
  313. package/dist/data/chat/Message.d.ts +1 -1
  314. package/dist/data/chat/Message.d.ts.map +1 -1
  315. package/dist/data/chat/Message.js +40 -13
  316. package/dist/data/chat/Message.js.map +1 -1
  317. package/dist/data/chat/ToolCall.cjs +60 -5
  318. package/dist/data/chat/ToolCall.cjs.map +1 -1
  319. package/dist/data/chat/ToolCall.d.ts +7 -2
  320. package/dist/data/chat/ToolCall.d.ts.map +1 -1
  321. package/dist/data/chat/ToolCall.js +60 -5
  322. package/dist/data/chat/ToolCall.js.map +1 -1
  323. package/dist/data/chat/approval.cjs.map +1 -1
  324. package/dist/data/chat/approval.d.ts +2 -2
  325. package/dist/data/chat/approval.d.ts.map +1 -1
  326. package/dist/data/chat/approval.js.map +1 -1
  327. package/dist/data/chat/tool-policy.cjs +59 -2
  328. package/dist/data/chat/tool-policy.cjs.map +1 -1
  329. package/dist/data/chat/tool-policy.d.ts +9 -0
  330. package/dist/data/chat/tool-policy.d.ts.map +1 -1
  331. package/dist/data/chat/tool-policy.js +59 -2
  332. package/dist/data/chat/tool-policy.js.map +1 -1
  333. package/dist/data/chat/types.cjs +6 -0
  334. package/dist/data/chat/types.cjs.map +1 -1
  335. package/dist/data/chat/types.d.ts +13 -4
  336. package/dist/data/chat/types.d.ts.map +1 -1
  337. package/dist/data/chat/types.js +7 -1
  338. package/dist/data/chat/types.js.map +1 -1
  339. package/dist/data/chat/usage-snapshot.cjs +11 -6
  340. package/dist/data/chat/usage-snapshot.cjs.map +1 -1
  341. package/dist/data/chat/usage-snapshot.d.ts +0 -1
  342. package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
  343. package/dist/data/chat/usage-snapshot.js +11 -6
  344. package/dist/data/chat/usage-snapshot.js.map +1 -1
  345. package/dist/data/diagnostics/RenderedStackTrace.cjs +2 -1
  346. package/dist/data/diagnostics/RenderedStackTrace.cjs.map +1 -1
  347. package/dist/data/diagnostics/RenderedStackTrace.d.ts +3 -1
  348. package/dist/data/diagnostics/RenderedStackTrace.d.ts.map +1 -1
  349. package/dist/data/diagnostics/RenderedStackTrace.js +2 -1
  350. package/dist/data/diagnostics/RenderedStackTrace.js.map +1 -1
  351. package/dist/data/diagnostics/StackFrameRow.cjs +3 -3
  352. package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -1
  353. package/dist/data/diagnostics/StackFrameRow.js +3 -3
  354. package/dist/data/diagnostics/StackFrameRow.js.map +1 -1
  355. package/dist/data/graph-columns-layout.cjs +26 -10
  356. package/dist/data/graph-columns-layout.cjs.map +1 -1
  357. package/dist/data/graph-columns-layout.d.ts +8 -0
  358. package/dist/data/graph-columns-layout.d.ts.map +1 -1
  359. package/dist/data/graph-columns-layout.js +26 -10
  360. package/dist/data/graph-columns-layout.js.map +1 -1
  361. package/dist/data/graph-diagram-model.cjs.map +1 -1
  362. package/dist/data/graph-diagram-model.d.ts +5 -0
  363. package/dist/data/graph-diagram-model.d.ts.map +1 -1
  364. package/dist/data/graph-diagram-model.js.map +1 -1
  365. package/dist/data/graph-edge-routing.cjs +9 -3
  366. package/dist/data/graph-edge-routing.cjs.map +1 -1
  367. package/dist/data/graph-edge-routing.d.ts +2 -0
  368. package/dist/data/graph-edge-routing.d.ts.map +1 -1
  369. package/dist/data/graph-edge-routing.js +9 -3
  370. package/dist/data/graph-edge-routing.js.map +1 -1
  371. package/dist/data/json-view/JsonSource.cjs +84 -0
  372. package/dist/data/json-view/JsonSource.cjs.map +1 -0
  373. package/dist/data/json-view/JsonSource.d.ts +7 -0
  374. package/dist/data/json-view/JsonSource.d.ts.map +1 -0
  375. package/dist/data/json-view/JsonSource.js +84 -0
  376. package/dist/data/json-view/JsonSource.js.map +1 -0
  377. package/dist/data/json-view/parse-prefix.cjs +132 -0
  378. package/dist/data/json-view/parse-prefix.cjs.map +1 -0
  379. package/dist/data/json-view/parse-prefix.d.ts +11 -0
  380. package/dist/data/json-view/parse-prefix.d.ts.map +1 -0
  381. package/dist/data/json-view/parse-prefix.js +132 -0
  382. package/dist/data/json-view/parse-prefix.js.map +1 -0
  383. package/dist/data/json-view/parse-source.cjs +62 -0
  384. package/dist/data/json-view/parse-source.cjs.map +1 -0
  385. package/dist/data/json-view/parse-source.d.ts +16 -0
  386. package/dist/data/json-view/parse-source.d.ts.map +1 -0
  387. package/dist/data/json-view/parse-source.js +62 -0
  388. package/dist/data/json-view/parse-source.js.map +1 -0
  389. package/dist/data/json-view/story-fixtures.d.ts +6 -0
  390. package/dist/data/json-view/story-fixtures.d.ts.map +1 -0
  391. package/dist/data/json-view/types.d.ts +14 -0
  392. package/dist/data/json-view/types.d.ts.map +1 -0
  393. package/dist/data/runtime/RuntimeBar.cjs +2 -5
  394. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  395. package/dist/data/runtime/RuntimeBar.d.ts +2 -4
  396. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  397. package/dist/data/runtime/RuntimeBar.fields.cjs +2 -2
  398. package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -1
  399. package/dist/data/runtime/RuntimeBar.fields.js +2 -2
  400. package/dist/data/runtime/RuntimeBar.fields.js.map +1 -1
  401. package/dist/data/runtime/RuntimeBar.js +2 -5
  402. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  403. package/dist/data/runtime/RuntimeBar.selection.cjs +4 -1
  404. package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -1
  405. package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -1
  406. package/dist/data/runtime/RuntimeBar.selection.js +5 -2
  407. package/dist/data/runtime/RuntimeBar.selection.js.map +1 -1
  408. package/dist/data/runtime/RuntimeBarActions.cjs +1 -5
  409. package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
  410. package/dist/data/runtime/RuntimeBarActions.d.ts +1 -1
  411. package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
  412. package/dist/data/runtime/RuntimeBarActions.js +1 -5
  413. package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
  414. package/dist/data/runtime/RuntimeBarIdentity.cjs +6 -14
  415. package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -1
  416. package/dist/data/runtime/RuntimeBarIdentity.d.ts +0 -1
  417. package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -1
  418. package/dist/data/runtime/RuntimeBarIdentity.js +6 -14
  419. package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -1
  420. package/dist/data/runtime/RuntimeBarLayout.cjs +8 -27
  421. package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -1
  422. package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -1
  423. package/dist/data/runtime/RuntimeBarLayout.js +8 -27
  424. package/dist/data/runtime/RuntimeBarLayout.js.map +1 -1
  425. package/dist/data/runtime/RuntimeBarSegment.cjs +1 -5
  426. package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
  427. package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
  428. package/dist/data/runtime/RuntimeBarSegment.js +1 -5
  429. package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
  430. package/dist/data/runtime/use-runtime-bar-overflow.cjs +4 -10
  431. package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -1
  432. package/dist/data/runtime/use-runtime-bar-overflow.d.ts +1 -2
  433. package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -1
  434. package/dist/data/runtime/use-runtime-bar-overflow.js +4 -10
  435. package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -1
  436. package/dist/data/test-runner/TestRunner.fixtures.d.ts +0 -20
  437. package/dist/data/test-runner/TestRunner.fixtures.d.ts.map +1 -1
  438. package/dist/data/test-runner/TestRunner.large-fixtures.d.ts +22 -0
  439. package/dist/data/test-runner/TestRunner.large-fixtures.d.ts.map +1 -0
  440. package/dist/data/use-pan-zoom.cjs +23 -10
  441. package/dist/data/use-pan-zoom.cjs.map +1 -1
  442. package/dist/data/use-pan-zoom.d.ts +16 -2
  443. package/dist/data/use-pan-zoom.d.ts.map +1 -1
  444. package/dist/data/use-pan-zoom.js +23 -10
  445. package/dist/data/use-pan-zoom.js.map +1 -1
  446. package/dist/data/version-info.cjs +3 -3
  447. package/dist/data/version-info.js +3 -3
  448. package/dist/data.cjs +28 -2
  449. package/dist/data.cjs.map +1 -1
  450. package/dist/data.d.ts +2 -0
  451. package/dist/data.d.ts.map +1 -1
  452. package/dist/data.js +26 -0
  453. package/dist/data.js.map +1 -1
  454. package/dist/index.cjs +30 -4
  455. package/dist/index.cjs.map +1 -1
  456. package/dist/index.js +26 -0
  457. package/dist/index.js.map +1 -1
  458. package/dist/layout/Workspace.cjs +13 -4
  459. package/dist/layout/Workspace.cjs.map +1 -1
  460. package/dist/layout/Workspace.d.ts +7 -2
  461. package/dist/layout/Workspace.d.ts.map +1 -1
  462. package/dist/layout/Workspace.js +13 -4
  463. package/dist/layout/Workspace.js.map +1 -1
  464. package/dist/lib/permission-strategies.cjs +71 -11
  465. package/dist/lib/permission-strategies.cjs.map +1 -1
  466. package/dist/lib/permission-strategies.d.ts +3 -0
  467. package/dist/lib/permission-strategies.d.ts.map +1 -1
  468. package/dist/lib/permission-strategies.js +71 -11
  469. package/dist/lib/permission-strategies.js.map +1 -1
  470. package/dist/styles.css +1 -1
  471. package/package.json +5 -3
  472. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs +0 -57
  473. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs.map +0 -1
  474. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts +0 -7
  475. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts.map +0 -1
  476. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js +0 -57
  477. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js.map +0 -1
  478. package/dist/data/runtime/RuntimeBar.context.cjs +0 -8
  479. package/dist/data/runtime/RuntimeBar.context.cjs.map +0 -1
  480. package/dist/data/runtime/RuntimeBar.context.d.ts +0 -2
  481. package/dist/data/runtime/RuntimeBar.context.d.ts.map +0 -1
  482. package/dist/data/runtime/RuntimeBar.context.js +0 -8
  483. package/dist/data/runtime/RuntimeBar.context.js.map +0 -1
package/README.md CHANGED
@@ -125,6 +125,8 @@ import "@flanksource/clicky-ui/mdx-editor.css"; // only if you render the markdo
125
125
 
126
126
  Without this import the field renders, but its toolbar and content are unstyled.
127
127
 
128
+ If Markdown cannot be imported, the field displays the parsing error and preserves the document in a source editor. Correct the source and choose **Retry rich text** to reopen the rich-text editor. Source edits use the same `onChange` callback; read-only and disabled fields remain protected. Loading another document through `value` retries its import automatically.
129
+
128
130
  ## Bundle size guidance
129
131
 
130
132
  Prefer subpath imports in production apps:
package/dist/ai.cjs CHANGED
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const agentActionIcons = require("./data/ai/agent-action-icons.cjs");
4
4
  const AdvancedChatConfig = require("./data/ai/AdvancedChatConfig.cjs");
5
+ const ToolPreferences = require("./data/ai/ToolPreferences.cjs");
5
6
  const sessionCategories = require("./data/ai/session-categories.cjs");
6
7
  const claudeComplete = require("./data/ai/examples/sessions/claude-complete.cjs");
7
8
  const types = require("./data/chat/types.cjs");
@@ -59,7 +60,6 @@ const SessionViewer = require("./data/ai/SessionViewer.cjs");
59
60
  const index$2 = require("./data/ai/SpecRuntimeEditor/index.cjs");
60
61
  const SessionInspector_remote = require("./data/ai/SessionInspector.remote.cjs");
61
62
  const ThreadPicker = require("./data/ai/ThreadPicker.cjs");
62
- const ToolPreferences = require("./data/ai/ToolPreferences.cjs");
63
63
  const unspecified = require("./data/runtime/unspecified.cjs");
64
64
  const toolPolicy = require("./data/chat/tool-policy.cjs");
65
65
  const runtimeProfileModel = require("./lib/runtime-profile-model.cjs");
@@ -92,6 +92,9 @@ exports.PERMISSION_MODE_ICONS = agentActionIcons.PERMISSION_MODE_ICONS;
92
92
  exports.WORKFLOW_PHASES = agentActionIcons.WORKFLOW_PHASES;
93
93
  exports.effortIcon = agentActionIcons.effortIcon;
94
94
  exports.AdvancedChatConfig = AdvancedChatConfig.AdvancedChatConfig;
95
+ exports.AdvancedChatSettings = ToolPreferences.AdvancedChatSettings;
96
+ exports.ToolPreferences = ToolPreferences.ToolPreferences;
97
+ exports.ToolPreferencesMenu = ToolPreferences.ToolPreferencesMenu;
95
98
  exports.CATEGORY_ICONS = sessionCategories.CATEGORY_ICONS;
96
99
  exports.CATEGORY_LABELS = sessionCategories.CATEGORY_LABELS;
97
100
  exports.classifyCommand = sessionCategories.classifyCommand;
@@ -203,7 +206,6 @@ exports.openRemoteSession = SessionInspector_remote.openRemoteSession;
203
206
  exports.sessionFollowUrl = SessionInspector_remote.sessionFollowUrl;
204
207
  exports.useRemoteSession = SessionInspector_remote.useRemoteSession;
205
208
  exports.ThreadPicker = ThreadPicker.ThreadPicker;
206
- exports.ToolPreferences = ToolPreferences.ToolPreferences;
207
209
  exports.UNSPECIFIED_HINT = unspecified.UNSPECIFIED_HINT;
208
210
  exports.UNSPECIFIED_ID = unspecified.UNSPECIFIED_ID;
209
211
  exports.UNSPECIFIED_LABEL = unspecified.UNSPECIFIED_LABEL;
package/dist/ai.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ai.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"ai.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/ai.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { AGENT_RUNTIME_ICONS, APPROVAL_ICONS, EFFORT_ICONS, PERMISSION_MODE_ICONS, WORKFLOW_PHASES, effortIcon } from "./data/ai/agent-action-icons.js";
2
2
  import { AdvancedChatConfig } from "./data/ai/AdvancedChatConfig.js";
3
+ import { AdvancedChatSettings, ToolPreferences, ToolPreferencesMenu } from "./data/ai/ToolPreferences.js";
3
4
  import { CATEGORY_ICONS, CATEGORY_LABELS, classifyCommand, classifyToolCategory, collectSessionFilters, eventCategory, isEventVisible } from "./data/ai/session-categories.js";
4
5
  import { CLAUDE_COMPLETE_SESSION } from "./data/ai/examples/sessions/claude-complete.js";
5
6
  import { CLAUDE_PERMISSION_MODES, CLAUDE_PERMISSION_MODE_OPTIONS, normalizeToolPolicy } from "./data/chat/types.js";
@@ -57,7 +58,6 @@ import { SessionViewer } from "./data/ai/SessionViewer.js";
57
58
  import { SpecRuntimeEditor } from "./data/ai/SpecRuntimeEditor/index.js";
58
59
  import { TERMINAL_SESSION_LIFECYCLES, fetchRemoteSession, isTerminalSessionLifecycle, mergeSessionMessages, openRemoteSession, sessionFollowUrl, useRemoteSession } from "./data/ai/SessionInspector.remote.js";
59
60
  import { ThreadPicker } from "./data/ai/ThreadPicker.js";
60
- import { ToolPreferences } from "./data/ai/ToolPreferences.js";
61
61
  import { UNSPECIFIED_HINT, UNSPECIFIED_ID, UNSPECIFIED_LABEL, UNSPECIFIED_NAME, unspecifiedHint } from "./data/runtime/unspecified.js";
62
62
  import { appendToolPolicy, matchesTool, normalizeToolPolicyRules, resolveToolPolicy, toolPolicyFromPreferences } from "./data/chat/tool-policy.js";
63
63
  import { authoredRuntimeSpec, duplicateName, mergeRuntimeSpec, nextNewName, permissionTarget, presetForRef, presetsOf, referencedBy, reorderProfilePresets, uniqueName } from "./lib/runtime-profile-model.js";
@@ -87,6 +87,7 @@ export {
87
87
  AGENT_RUNTIME_ICONS,
88
88
  APPROVAL_ICONS,
89
89
  AdvancedChatConfig,
90
+ AdvancedChatSettings,
90
91
  CATEGORY_ICONS,
91
92
  CATEGORY_LABELS,
92
93
  CLAUDE_COMPLETE_SESSION,
@@ -163,6 +164,7 @@ export {
163
164
  TERMINAL_SESSION_LIFECYCLES,
164
165
  ThreadPicker,
165
166
  ToolPreferences,
167
+ ToolPreferencesMenu,
166
168
  ToolSchemaBrowser2 as ToolSchemaBrowser,
167
169
  UNSPECIFIED_HINT,
168
170
  UNSPECIFIED_ID,
@@ -26,6 +26,7 @@ const jsxRuntime = require("react/jsx-runtime");
26
26
  const react = require("react");
27
27
  const utils = require("../lib/utils.cjs");
28
28
  const jsonSchemaFormUtils = require("./json-schema-form-utils.cjs");
29
+ const button = require("./button.cjs");
29
30
  const mdxEditorFieldPlugins = require("./mdx-editor-field-plugins.cjs");
30
31
  const EDITOR_MIN_HEIGHT_CLASS = {
31
32
  xs: "min-h-32",
@@ -55,6 +56,7 @@ function MdxEditorField({
55
56
  ...pluginOptions
56
57
  }) {
57
58
  const [mdx, setMdx] = react.useState(null);
59
+ const [parseError, setParseError] = react.useState(null);
58
60
  const editorRef = react.useRef(null);
59
61
  const lastValueRef = react.useRef(value);
60
62
  const readonly = readOnly || disabled;
@@ -73,6 +75,7 @@ function MdxEditorField({
73
75
  var _a;
74
76
  if (!mdx || value === lastValueRef.current) return;
75
77
  lastValueRef.current = value;
78
+ setParseError(null);
76
79
  (_a = editorRef.current) == null ? void 0 : _a.setMarkdown(value);
77
80
  }, [mdx, value]);
78
81
  const commit = react.useCallback(
@@ -87,27 +90,41 @@ function MdxEditorField({
87
90
  () => mdx ? mdxEditorFieldPlugins.createMdxEditorPlugins(mdx, pluginOptions) : [],
88
91
  [mdx, pluginOptions]
89
92
  );
90
- if (!mdx) {
91
- const fallbackAriaLabel = ariaLabel ?? (id ? void 0 : "Markdown");
92
- return /* @__PURE__ */ jsxRuntime.jsx(
93
- "textarea",
94
- {
95
- id,
96
- "data-jsf-input": true,
97
- rows: 6,
98
- "aria-label": fallbackAriaLabel,
99
- className: utils.cn(
100
- jsonSchemaFormUtils.inputClass(size),
101
- "h-auto resize-y font-mono",
102
- EDITOR_MIN_HEIGHT_CLASS[size],
103
- textareaClassName
104
- ),
105
- value,
106
- disabled: readonly,
107
- placeholder: typeof placeholder === "string" ? placeholder : void 0,
108
- onChange: (event) => commit(event.target.value)
109
- }
110
- );
93
+ const reportError = react.useCallback(
94
+ (error) => {
95
+ queueMicrotask(() => setParseError(error));
96
+ },
97
+ []
98
+ );
99
+ const currentError = parseError;
100
+ if (!mdx || currentError) {
101
+ const fallbackAriaLabel = ariaLabel ?? (currentError ? "Markdown source" : id ? void 0 : "Markdown");
102
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
103
+ currentError && /* @__PURE__ */ jsxRuntime.jsxs("div", { role: "alert", className: "mb-2 text-sm text-destructive", children: [
104
+ "Markdown could not be loaded: ",
105
+ currentError.error
106
+ ] }),
107
+ /* @__PURE__ */ jsxRuntime.jsx(
108
+ "textarea",
109
+ {
110
+ id,
111
+ "data-jsf-input": true,
112
+ rows: 6,
113
+ "aria-label": fallbackAriaLabel,
114
+ className: utils.cn(
115
+ jsonSchemaFormUtils.inputClass(size),
116
+ "h-auto resize-y font-mono",
117
+ EDITOR_MIN_HEIGHT_CLASS[size],
118
+ textareaClassName
119
+ ),
120
+ value,
121
+ disabled: readonly,
122
+ placeholder: typeof placeholder === "string" ? placeholder : void 0,
123
+ onChange: (event) => commit(event.target.value)
124
+ }
125
+ ),
126
+ currentError && !readonly && /* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", variant: "outline", size: "sm", onClick: () => setParseError(null), children: "Retry rich text" })
127
+ ] });
111
128
  }
112
129
  const { MDXEditor } = mdx;
113
130
  return /* @__PURE__ */ jsxRuntime.jsx("div", { id, "data-jsf-input": true, className: "min-w-0", children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -120,7 +137,8 @@ function MdxEditorField({
120
137
  plugins,
121
138
  className: utils.cn("clicky-mdx-editor-field", readonly && "clicky-mdx-editor-field-readonly", className),
122
139
  contentEditableClassName: utils.cn("clicky-mdx-editor-content", EDITOR_MIN_HEIGHT_CLASS[size], contentClassName),
123
- onChange: commit
140
+ onChange: commit,
141
+ onError: reportError
124
142
  }
125
143
  ) });
126
144
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MdxEditorField.cjs","sources":["../../src/components/MdxEditorField.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport type { FormSize } from \"./json-schema-form-size\";\nimport { inputClass } from \"./json-schema-form-utils\";\nimport { createMdxEditorPlugins } from \"./mdx-editor-field-plugins\";\nimport type { MdxEditorFieldProps } from \"./mdx-editor-options\";\n\ntype MdxEditorModule = typeof import(\"@mdxeditor/editor\");\n\nexport type {\n MdxEditorAdmonitionOptions,\n MdxEditorCalloutOptions,\n MdxEditorCodeBlockEditorContext,\n MdxEditorCodeBlockEditorDescriptor,\n MdxEditorCodeBlockEditorProps,\n MdxEditorCodeBlockLanguage,\n MdxEditorCodeBlockOptions,\n MdxEditorCodeMirrorOptions,\n MdxEditorDiffModeOptions,\n MdxEditorFieldProps,\n MdxEditorHeadingLevel,\n MdxEditorImageOptions,\n MdxEditorImagePreviewHandler,\n MdxEditorImageUploadHandler,\n MdxEditorInsertJsx,\n MdxEditorJsxAttribute,\n MdxEditorJsxComponentDescriptor,\n MdxEditorJsxEditorProps,\n MdxEditorJsxNode,\n MdxEditorLinkOptions,\n MdxEditorPlugin,\n MdxEditorPluginOptions,\n MdxEditorRuntime,\n MdxEditorToolbarOptions,\n MdxEditorViewMode,\n} from \"./mdx-editor-options\";\n\ninterface MdxEditorMethods {\n focus: () => void;\n getContentEditableHTML: () => string;\n getMarkdown: () => string;\n getSelectionMarkdown: () => string;\n insertMarkdown: (markdown: string) => void;\n setMarkdown: (markdown: string) => void;\n}\n\nconst EDITOR_MIN_HEIGHT_CLASS: Record<FormSize, string> = {\n xs: \"min-h-32\",\n sm: \"min-h-36\",\n md: \"min-h-40\",\n lg: \"min-h-48\",\n xl: \"min-h-56\",\n};\n\nlet mdxEditorModulePromise: Promise<MdxEditorModule> | null = null;\n\nfunction loadMdxEditorModule(): Promise<MdxEditorModule> {\n mdxEditorModulePromise ??= import(\"@mdxeditor/editor\");\n return mdxEditorModulePromise;\n}\n\nexport function MdxEditorField({\n id,\n value = \"\",\n onChange,\n readOnly = false,\n disabled = false,\n size = \"md\",\n placeholder,\n className,\n contentClassName,\n textareaClassName,\n \"aria-label\": ariaLabel,\n commitInitialMarkdownNormalize = false,\n ...pluginOptions\n}: MdxEditorFieldProps) {\n const [mdx, setMdx] = useState<MdxEditorModule | null>(null);\n const editorRef = useRef<MdxEditorMethods>(null);\n const lastValueRef = useRef(value);\n const readonly = readOnly || disabled;\n\n useEffect(() => {\n let cancelled = false;\n loadMdxEditorModule()\n .then((mod) => {\n if (!cancelled) setMdx(mod);\n })\n .catch(() => {\n if (!cancelled) setMdx(null);\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n useEffect(() => {\n if (!mdx || value === lastValueRef.current) return;\n lastValueRef.current = value;\n editorRef.current?.setMarkdown(value);\n }, [mdx, value]);\n\n const commit = useCallback(\n (next: string, initialMarkdownNormalize = false) => {\n if (initialMarkdownNormalize && !commitInitialMarkdownNormalize) return;\n lastValueRef.current = next;\n onChange?.(next);\n },\n [commitInitialMarkdownNormalize, onChange],\n );\n\n const plugins = useMemo(\n () => (mdx ? createMdxEditorPlugins(mdx, pluginOptions) : []),\n [mdx, pluginOptions],\n );\n\n if (!mdx) {\n const fallbackAriaLabel = ariaLabel ?? (id ? undefined : \"Markdown\");\n return (\n <textarea\n id={id}\n data-jsf-input\n rows={6}\n aria-label={fallbackAriaLabel}\n className={cn(\n inputClass(size),\n \"h-auto resize-y font-mono\",\n EDITOR_MIN_HEIGHT_CLASS[size],\n textareaClassName,\n )}\n value={value}\n disabled={readonly}\n placeholder={typeof placeholder === \"string\" ? placeholder : undefined}\n onChange={(event) => commit(event.target.value)}\n />\n );\n }\n\n const { MDXEditor } = mdx;\n return (\n <div id={id} data-jsf-input className=\"min-w-0\">\n <MDXEditor\n ref={editorRef}\n markdown={value}\n readOnly={readonly}\n placeholder={placeholder}\n plugins={plugins}\n className={cn(\"clicky-mdx-editor-field\", readonly && \"clicky-mdx-editor-field-readonly\", className)}\n contentEditableClassName={cn(\"clicky-mdx-editor-content\", EDITOR_MIN_HEIGHT_CLASS[size], contentClassName)}\n onChange={commit}\n />\n </div>\n );\n}\n"],"names":["useState","useRef","useEffect","useCallback","useMemo","createMdxEditorPlugins","jsx","cn","inputClass"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CA,MAAM,0BAAoD;AAAA,EACxD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAI,yBAA0D;AAE9D,SAAS,sBAAgD;AACvD,sDAA2B,OAAO,mBAAmB;AACrD,SAAO;AACT;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,iCAAiC;AAAA,EACjC,GAAG;AACL,GAAwB;AACtB,QAAM,CAAC,KAAK,MAAM,IAAIA,MAAAA,SAAiC,IAAI;AAC3D,QAAM,YAAYC,MAAAA,OAAyB,IAAI;AAC/C,QAAM,eAAeA,MAAAA,OAAO,KAAK;AACjC,QAAM,WAAW,YAAY;AAE7BC,QAAAA,UAAU,MAAM;AACd,QAAI,YAAY;AAChB,wBAAA,EACG,KAAK,CAAC,QAAQ;AACb,UAAI,CAAC,UAAW,QAAO,GAAG;AAAA,IAC5B,CAAC,EACA,MAAM,MAAM;AACX,UAAI,CAAC,UAAW,QAAO,IAAI;AAAA,IAC7B,CAAC;AACH,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAA,CAAE;AAELA,QAAAA,UAAU,MAAM;;AACd,QAAI,CAAC,OAAO,UAAU,aAAa,QAAS;AAC5C,iBAAa,UAAU;AACvB,oBAAU,YAAV,mBAAmB,YAAY;AAAA,EACjC,GAAG,CAAC,KAAK,KAAK,CAAC;AAEf,QAAM,SAASC,MAAAA;AAAAA,IACb,CAAC,MAAc,2BAA2B,UAAU;AAClD,UAAI,4BAA4B,CAAC,+BAAgC;AACjE,mBAAa,UAAU;AACvB,2CAAW;AAAA,IACb;AAAA,IACA,CAAC,gCAAgC,QAAQ;AAAA,EAAA;AAG3C,QAAM,UAAUC,MAAAA;AAAAA,IACd,MAAO,MAAMC,sBAAAA,uBAAuB,KAAK,aAAa,IAAI,CAAA;AAAA,IAC1D,CAAC,KAAK,aAAa;AAAA,EAAA;AAGrB,MAAI,CAAC,KAAK;AACR,UAAM,oBAAoB,cAAc,KAAK,SAAY;AACzD,WACEC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,kBAAc;AAAA,QACd,MAAM;AAAA,QACN,cAAY;AAAA,QACZ,WAAWC,MAAAA;AAAAA,UACTC,oBAAAA,WAAW,IAAI;AAAA,UACf;AAAA,UACA,wBAAwB,IAAI;AAAA,UAC5B;AAAA,QAAA;AAAA,QAEF;AAAA,QACA,UAAU;AAAA,QACV,aAAa,OAAO,gBAAgB,WAAW,cAAc;AAAA,QAC7D,UAAU,CAAC,UAAU,OAAO,MAAM,OAAO,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAGpD;AAEA,QAAM,EAAE,cAAc;AACtB,wCACG,OAAA,EAAI,IAAQ,kBAAc,MAAC,WAAU,WACpC,UAAAF,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,UAAU;AAAA,MACV,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,WAAWC,MAAAA,GAAG,2BAA2B,YAAY,oCAAoC,SAAS;AAAA,MAClG,0BAA0BA,MAAAA,GAAG,6BAA6B,wBAAwB,IAAI,GAAG,gBAAgB;AAAA,MACzG,UAAU;AAAA,IAAA;AAAA,EAAA,GAEd;AAEJ;;"}
1
+ {"version":3,"file":"MdxEditorField.cjs","sources":["../../src/components/MdxEditorField.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport type { FormSize } from \"./json-schema-form-size\";\nimport { inputClass } from \"./json-schema-form-utils\";\nimport { Button } from \"./button\";\nimport { createMdxEditorPlugins } from \"./mdx-editor-field-plugins\";\nimport type { MdxEditorFieldProps } from \"./mdx-editor-options\";\n\ntype MdxEditorModule = typeof import(\"@mdxeditor/editor\");\n\nexport type {\n MdxEditorAdmonitionOptions,\n MdxEditorCalloutOptions,\n MdxEditorCodeBlockEditorContext,\n MdxEditorCodeBlockEditorDescriptor,\n MdxEditorCodeBlockEditorProps,\n MdxEditorCodeBlockLanguage,\n MdxEditorCodeBlockOptions,\n MdxEditorCodeMirrorOptions,\n MdxEditorDiffModeOptions,\n MdxEditorFieldProps,\n MdxEditorHeadingLevel,\n MdxEditorImageOptions,\n MdxEditorImagePreviewHandler,\n MdxEditorImageUploadHandler,\n MdxEditorInsertJsx,\n MdxEditorJsxAttribute,\n MdxEditorJsxComponentDescriptor,\n MdxEditorJsxEditorProps,\n MdxEditorJsxNode,\n MdxEditorLinkOptions,\n MdxEditorPlugin,\n MdxEditorPluginOptions,\n MdxEditorRuntime,\n MdxEditorToolbarOptions,\n MdxEditorViewMode,\n} from \"./mdx-editor-options\";\n\ninterface MdxEditorMethods {\n focus: () => void;\n getContentEditableHTML: () => string;\n getMarkdown: () => string;\n getSelectionMarkdown: () => string;\n insertMarkdown: (markdown: string) => void;\n setMarkdown: (markdown: string) => void;\n}\n\nconst EDITOR_MIN_HEIGHT_CLASS: Record<FormSize, string> = {\n xs: \"min-h-32\",\n sm: \"min-h-36\",\n md: \"min-h-40\",\n lg: \"min-h-48\",\n xl: \"min-h-56\",\n};\n\nlet mdxEditorModulePromise: Promise<MdxEditorModule> | null = null;\n\nfunction loadMdxEditorModule(): Promise<MdxEditorModule> {\n mdxEditorModulePromise ??= import(\"@mdxeditor/editor\");\n return mdxEditorModulePromise;\n}\n\nexport function MdxEditorField({\n id,\n value = \"\",\n onChange,\n readOnly = false,\n disabled = false,\n size = \"md\",\n placeholder,\n className,\n contentClassName,\n textareaClassName,\n \"aria-label\": ariaLabel,\n commitInitialMarkdownNormalize = false,\n ...pluginOptions\n}: MdxEditorFieldProps) {\n const [mdx, setMdx] = useState<MdxEditorModule | null>(null);\n const [parseError, setParseError] = useState<{\n error: string;\n source: string;\n } | null>(null);\n const editorRef = useRef<MdxEditorMethods>(null);\n const lastValueRef = useRef(value);\n const readonly = readOnly || disabled;\n\n useEffect(() => {\n let cancelled = false;\n loadMdxEditorModule()\n .then((mod) => {\n if (!cancelled) setMdx(mod);\n })\n .catch(() => {\n if (!cancelled) setMdx(null);\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n useEffect(() => {\n if (!mdx || value === lastValueRef.current) return;\n lastValueRef.current = value;\n setParseError(null);\n editorRef.current?.setMarkdown(value);\n }, [mdx, value]);\n\n const commit = useCallback(\n (next: string, initialMarkdownNormalize = false) => {\n if (initialMarkdownNormalize && !commitInitialMarkdownNormalize) return;\n lastValueRef.current = next;\n onChange?.(next);\n },\n [commitInitialMarkdownNormalize, onChange],\n );\n\n const plugins = useMemo(\n () => (mdx ? createMdxEditorPlugins(mdx, pluginOptions) : []),\n [mdx, pluginOptions],\n );\n\n const reportError = useCallback(\n (error: { error: string; source: string }) => {\n queueMicrotask(() => setParseError(error));\n },\n [],\n );\n\n const currentError = parseError;\n if (!mdx || currentError) {\n const fallbackAriaLabel =\n ariaLabel ??\n (currentError ? \"Markdown source\" : id ? undefined : \"Markdown\");\n return (\n <div className=\"min-w-0\">\n {currentError && (\n <div role=\"alert\" className=\"mb-2 text-sm text-destructive\">\n Markdown could not be loaded: {currentError.error}\n </div>\n )}\n <textarea\n id={id}\n data-jsf-input\n rows={6}\n aria-label={fallbackAriaLabel}\n className={cn(\n inputClass(size),\n \"h-auto resize-y font-mono\",\n EDITOR_MIN_HEIGHT_CLASS[size],\n textareaClassName,\n )}\n value={value}\n disabled={readonly}\n placeholder={\n typeof placeholder === \"string\" ? placeholder : undefined\n }\n onChange={(event) => commit(event.target.value)}\n />\n {currentError && !readonly && (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => setParseError(null)}>\n Retry rich text\n </Button>\n )}\n </div>\n );\n }\n\n const { MDXEditor } = mdx;\n return (\n <div id={id} data-jsf-input className=\"min-w-0\">\n <MDXEditor\n ref={editorRef}\n markdown={value}\n readOnly={readonly}\n placeholder={placeholder}\n plugins={plugins}\n className={cn(\"clicky-mdx-editor-field\", readonly && \"clicky-mdx-editor-field-readonly\", className)}\n contentEditableClassName={cn(\"clicky-mdx-editor-content\", EDITOR_MIN_HEIGHT_CLASS[size], contentClassName)}\n onChange={commit}\n onError={reportError}\n />\n </div>\n );\n}\n"],"names":["useState","useRef","useEffect","useCallback","useMemo","createMdxEditorPlugins","jsxs","jsx","cn","inputClass","Button"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"MdxEditorField.d.ts","sourceRoot":"","sources":["../../src/components/MdxEditorField.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAIhE,YAAY,EACV,0BAA0B,EAC1B,uBAAuB,EACvB,+BAA+B,EAC/B,kCAAkC,EAClC,6BAA6B,EAC7B,0BAA0B,EAC1B,yBAAyB,EACzB,0BAA0B,EAC1B,wBAAwB,EACxB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,4BAA4B,EAC5B,2BAA2B,EAC3B,kBAAkB,EAClB,qBAAqB,EACrB,+BAA+B,EAC/B,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AA0B9B,wBAAgB,cAAc,CAAC,EAC7B,EAAE,EACF,KAAU,EACV,QAAQ,EACR,QAAgB,EAChB,QAAgB,EAChB,IAAW,EACX,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EAAE,SAAS,EACvB,8BAAsC,EACtC,GAAG,aAAa,EACjB,EAAE,mBAAmB,+BA6ErB"}
1
+ {"version":3,"file":"MdxEditorField.d.ts","sourceRoot":"","sources":["../../src/components/MdxEditorField.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAIhE,YAAY,EACV,0BAA0B,EAC1B,uBAAuB,EACvB,+BAA+B,EAC/B,kCAAkC,EAClC,6BAA6B,EAC7B,0BAA0B,EAC1B,yBAAyB,EACzB,0BAA0B,EAC1B,wBAAwB,EACxB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,4BAA4B,EAC5B,2BAA2B,EAC3B,kBAAkB,EAClB,qBAAqB,EACrB,+BAA+B,EAC/B,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AA0B9B,wBAAgB,cAAc,CAAC,EAC7B,EAAE,EACF,KAAU,EACV,QAAQ,EACR,QAAgB,EAChB,QAAgB,EAChB,IAAW,EACX,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EAAE,SAAS,EACvB,8BAAsC,EACtC,GAAG,aAAa,EACjB,EAAE,mBAAmB,+BA2GrB"}
@@ -1,7 +1,8 @@
1
- import { jsx } from "react/jsx-runtime";
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { useState, useRef, useEffect, useCallback, useMemo } from "react";
3
3
  import { cn } from "../lib/utils.js";
4
4
  import { inputClass } from "./json-schema-form-utils.js";
5
+ import { Button } from "./button.js";
5
6
  import { createMdxEditorPlugins } from "./mdx-editor-field-plugins.js";
6
7
  const EDITOR_MIN_HEIGHT_CLASS = {
7
8
  xs: "min-h-32",
@@ -31,6 +32,7 @@ function MdxEditorField({
31
32
  ...pluginOptions
32
33
  }) {
33
34
  const [mdx, setMdx] = useState(null);
35
+ const [parseError, setParseError] = useState(null);
34
36
  const editorRef = useRef(null);
35
37
  const lastValueRef = useRef(value);
36
38
  const readonly = readOnly || disabled;
@@ -49,6 +51,7 @@ function MdxEditorField({
49
51
  var _a;
50
52
  if (!mdx || value === lastValueRef.current) return;
51
53
  lastValueRef.current = value;
54
+ setParseError(null);
52
55
  (_a = editorRef.current) == null ? void 0 : _a.setMarkdown(value);
53
56
  }, [mdx, value]);
54
57
  const commit = useCallback(
@@ -63,27 +66,41 @@ function MdxEditorField({
63
66
  () => mdx ? createMdxEditorPlugins(mdx, pluginOptions) : [],
64
67
  [mdx, pluginOptions]
65
68
  );
66
- if (!mdx) {
67
- const fallbackAriaLabel = ariaLabel ?? (id ? void 0 : "Markdown");
68
- return /* @__PURE__ */ jsx(
69
- "textarea",
70
- {
71
- id,
72
- "data-jsf-input": true,
73
- rows: 6,
74
- "aria-label": fallbackAriaLabel,
75
- className: cn(
76
- inputClass(size),
77
- "h-auto resize-y font-mono",
78
- EDITOR_MIN_HEIGHT_CLASS[size],
79
- textareaClassName
80
- ),
81
- value,
82
- disabled: readonly,
83
- placeholder: typeof placeholder === "string" ? placeholder : void 0,
84
- onChange: (event) => commit(event.target.value)
85
- }
86
- );
69
+ const reportError = useCallback(
70
+ (error) => {
71
+ queueMicrotask(() => setParseError(error));
72
+ },
73
+ []
74
+ );
75
+ const currentError = parseError;
76
+ if (!mdx || currentError) {
77
+ const fallbackAriaLabel = ariaLabel ?? (currentError ? "Markdown source" : id ? void 0 : "Markdown");
78
+ return /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
79
+ currentError && /* @__PURE__ */ jsxs("div", { role: "alert", className: "mb-2 text-sm text-destructive", children: [
80
+ "Markdown could not be loaded: ",
81
+ currentError.error
82
+ ] }),
83
+ /* @__PURE__ */ jsx(
84
+ "textarea",
85
+ {
86
+ id,
87
+ "data-jsf-input": true,
88
+ rows: 6,
89
+ "aria-label": fallbackAriaLabel,
90
+ className: cn(
91
+ inputClass(size),
92
+ "h-auto resize-y font-mono",
93
+ EDITOR_MIN_HEIGHT_CLASS[size],
94
+ textareaClassName
95
+ ),
96
+ value,
97
+ disabled: readonly,
98
+ placeholder: typeof placeholder === "string" ? placeholder : void 0,
99
+ onChange: (event) => commit(event.target.value)
100
+ }
101
+ ),
102
+ currentError && !readonly && /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setParseError(null), children: "Retry rich text" })
103
+ ] });
87
104
  }
88
105
  const { MDXEditor } = mdx;
89
106
  return /* @__PURE__ */ jsx("div", { id, "data-jsf-input": true, className: "min-w-0", children: /* @__PURE__ */ jsx(
@@ -96,7 +113,8 @@ function MdxEditorField({
96
113
  plugins,
97
114
  className: cn("clicky-mdx-editor-field", readonly && "clicky-mdx-editor-field-readonly", className),
98
115
  contentEditableClassName: cn("clicky-mdx-editor-content", EDITOR_MIN_HEIGHT_CLASS[size], contentClassName),
99
- onChange: commit
116
+ onChange: commit,
117
+ onError: reportError
100
118
  }
101
119
  ) });
102
120
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MdxEditorField.js","sources":["../../src/components/MdxEditorField.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport type { FormSize } from \"./json-schema-form-size\";\nimport { inputClass } from \"./json-schema-form-utils\";\nimport { createMdxEditorPlugins } from \"./mdx-editor-field-plugins\";\nimport type { MdxEditorFieldProps } from \"./mdx-editor-options\";\n\ntype MdxEditorModule = typeof import(\"@mdxeditor/editor\");\n\nexport type {\n MdxEditorAdmonitionOptions,\n MdxEditorCalloutOptions,\n MdxEditorCodeBlockEditorContext,\n MdxEditorCodeBlockEditorDescriptor,\n MdxEditorCodeBlockEditorProps,\n MdxEditorCodeBlockLanguage,\n MdxEditorCodeBlockOptions,\n MdxEditorCodeMirrorOptions,\n MdxEditorDiffModeOptions,\n MdxEditorFieldProps,\n MdxEditorHeadingLevel,\n MdxEditorImageOptions,\n MdxEditorImagePreviewHandler,\n MdxEditorImageUploadHandler,\n MdxEditorInsertJsx,\n MdxEditorJsxAttribute,\n MdxEditorJsxComponentDescriptor,\n MdxEditorJsxEditorProps,\n MdxEditorJsxNode,\n MdxEditorLinkOptions,\n MdxEditorPlugin,\n MdxEditorPluginOptions,\n MdxEditorRuntime,\n MdxEditorToolbarOptions,\n MdxEditorViewMode,\n} from \"./mdx-editor-options\";\n\ninterface MdxEditorMethods {\n focus: () => void;\n getContentEditableHTML: () => string;\n getMarkdown: () => string;\n getSelectionMarkdown: () => string;\n insertMarkdown: (markdown: string) => void;\n setMarkdown: (markdown: string) => void;\n}\n\nconst EDITOR_MIN_HEIGHT_CLASS: Record<FormSize, string> = {\n xs: \"min-h-32\",\n sm: \"min-h-36\",\n md: \"min-h-40\",\n lg: \"min-h-48\",\n xl: \"min-h-56\",\n};\n\nlet mdxEditorModulePromise: Promise<MdxEditorModule> | null = null;\n\nfunction loadMdxEditorModule(): Promise<MdxEditorModule> {\n mdxEditorModulePromise ??= import(\"@mdxeditor/editor\");\n return mdxEditorModulePromise;\n}\n\nexport function MdxEditorField({\n id,\n value = \"\",\n onChange,\n readOnly = false,\n disabled = false,\n size = \"md\",\n placeholder,\n className,\n contentClassName,\n textareaClassName,\n \"aria-label\": ariaLabel,\n commitInitialMarkdownNormalize = false,\n ...pluginOptions\n}: MdxEditorFieldProps) {\n const [mdx, setMdx] = useState<MdxEditorModule | null>(null);\n const editorRef = useRef<MdxEditorMethods>(null);\n const lastValueRef = useRef(value);\n const readonly = readOnly || disabled;\n\n useEffect(() => {\n let cancelled = false;\n loadMdxEditorModule()\n .then((mod) => {\n if (!cancelled) setMdx(mod);\n })\n .catch(() => {\n if (!cancelled) setMdx(null);\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n useEffect(() => {\n if (!mdx || value === lastValueRef.current) return;\n lastValueRef.current = value;\n editorRef.current?.setMarkdown(value);\n }, [mdx, value]);\n\n const commit = useCallback(\n (next: string, initialMarkdownNormalize = false) => {\n if (initialMarkdownNormalize && !commitInitialMarkdownNormalize) return;\n lastValueRef.current = next;\n onChange?.(next);\n },\n [commitInitialMarkdownNormalize, onChange],\n );\n\n const plugins = useMemo(\n () => (mdx ? createMdxEditorPlugins(mdx, pluginOptions) : []),\n [mdx, pluginOptions],\n );\n\n if (!mdx) {\n const fallbackAriaLabel = ariaLabel ?? (id ? undefined : \"Markdown\");\n return (\n <textarea\n id={id}\n data-jsf-input\n rows={6}\n aria-label={fallbackAriaLabel}\n className={cn(\n inputClass(size),\n \"h-auto resize-y font-mono\",\n EDITOR_MIN_HEIGHT_CLASS[size],\n textareaClassName,\n )}\n value={value}\n disabled={readonly}\n placeholder={typeof placeholder === \"string\" ? placeholder : undefined}\n onChange={(event) => commit(event.target.value)}\n />\n );\n }\n\n const { MDXEditor } = mdx;\n return (\n <div id={id} data-jsf-input className=\"min-w-0\">\n <MDXEditor\n ref={editorRef}\n markdown={value}\n readOnly={readonly}\n placeholder={placeholder}\n plugins={plugins}\n className={cn(\"clicky-mdx-editor-field\", readonly && \"clicky-mdx-editor-field-readonly\", className)}\n contentEditableClassName={cn(\"clicky-mdx-editor-content\", EDITOR_MIN_HEIGHT_CLASS[size], contentClassName)}\n onChange={commit}\n />\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;AA8CA,MAAM,0BAAoD;AAAA,EACxD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAI,yBAA0D;AAE9D,SAAS,sBAAgD;AACvD,sDAA2B,OAAO,mBAAmB;AACrD,SAAO;AACT;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,iCAAiC;AAAA,EACjC,GAAG;AACL,GAAwB;AACtB,QAAM,CAAC,KAAK,MAAM,IAAI,SAAiC,IAAI;AAC3D,QAAM,YAAY,OAAyB,IAAI;AAC/C,QAAM,eAAe,OAAO,KAAK;AACjC,QAAM,WAAW,YAAY;AAE7B,YAAU,MAAM;AACd,QAAI,YAAY;AAChB,wBAAA,EACG,KAAK,CAAC,QAAQ;AACb,UAAI,CAAC,UAAW,QAAO,GAAG;AAAA,IAC5B,CAAC,EACA,MAAM,MAAM;AACX,UAAI,CAAC,UAAW,QAAO,IAAI;AAAA,IAC7B,CAAC;AACH,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,YAAU,MAAM;;AACd,QAAI,CAAC,OAAO,UAAU,aAAa,QAAS;AAC5C,iBAAa,UAAU;AACvB,oBAAU,YAAV,mBAAmB,YAAY;AAAA,EACjC,GAAG,CAAC,KAAK,KAAK,CAAC;AAEf,QAAM,SAAS;AAAA,IACb,CAAC,MAAc,2BAA2B,UAAU;AAClD,UAAI,4BAA4B,CAAC,+BAAgC;AACjE,mBAAa,UAAU;AACvB,2CAAW;AAAA,IACb;AAAA,IACA,CAAC,gCAAgC,QAAQ;AAAA,EAAA;AAG3C,QAAM,UAAU;AAAA,IACd,MAAO,MAAM,uBAAuB,KAAK,aAAa,IAAI,CAAA;AAAA,IAC1D,CAAC,KAAK,aAAa;AAAA,EAAA;AAGrB,MAAI,CAAC,KAAK;AACR,UAAM,oBAAoB,cAAc,KAAK,SAAY;AACzD,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,kBAAc;AAAA,QACd,MAAM;AAAA,QACN,cAAY;AAAA,QACZ,WAAW;AAAA,UACT,WAAW,IAAI;AAAA,UACf;AAAA,UACA,wBAAwB,IAAI;AAAA,UAC5B;AAAA,QAAA;AAAA,QAEF;AAAA,QACA,UAAU;AAAA,QACV,aAAa,OAAO,gBAAgB,WAAW,cAAc;AAAA,QAC7D,UAAU,CAAC,UAAU,OAAO,MAAM,OAAO,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAGpD;AAEA,QAAM,EAAE,cAAc;AACtB,6BACG,OAAA,EAAI,IAAQ,kBAAc,MAAC,WAAU,WACpC,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,UAAU;AAAA,MACV,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,WAAW,GAAG,2BAA2B,YAAY,oCAAoC,SAAS;AAAA,MAClG,0BAA0B,GAAG,6BAA6B,wBAAwB,IAAI,GAAG,gBAAgB;AAAA,MACzG,UAAU;AAAA,IAAA;AAAA,EAAA,GAEd;AAEJ;"}
1
+ {"version":3,"file":"MdxEditorField.js","sources":["../../src/components/MdxEditorField.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport type { FormSize } from \"./json-schema-form-size\";\nimport { inputClass } from \"./json-schema-form-utils\";\nimport { Button } from \"./button\";\nimport { createMdxEditorPlugins } from \"./mdx-editor-field-plugins\";\nimport type { MdxEditorFieldProps } from \"./mdx-editor-options\";\n\ntype MdxEditorModule = typeof import(\"@mdxeditor/editor\");\n\nexport type {\n MdxEditorAdmonitionOptions,\n MdxEditorCalloutOptions,\n MdxEditorCodeBlockEditorContext,\n MdxEditorCodeBlockEditorDescriptor,\n MdxEditorCodeBlockEditorProps,\n MdxEditorCodeBlockLanguage,\n MdxEditorCodeBlockOptions,\n MdxEditorCodeMirrorOptions,\n MdxEditorDiffModeOptions,\n MdxEditorFieldProps,\n MdxEditorHeadingLevel,\n MdxEditorImageOptions,\n MdxEditorImagePreviewHandler,\n MdxEditorImageUploadHandler,\n MdxEditorInsertJsx,\n MdxEditorJsxAttribute,\n MdxEditorJsxComponentDescriptor,\n MdxEditorJsxEditorProps,\n MdxEditorJsxNode,\n MdxEditorLinkOptions,\n MdxEditorPlugin,\n MdxEditorPluginOptions,\n MdxEditorRuntime,\n MdxEditorToolbarOptions,\n MdxEditorViewMode,\n} from \"./mdx-editor-options\";\n\ninterface MdxEditorMethods {\n focus: () => void;\n getContentEditableHTML: () => string;\n getMarkdown: () => string;\n getSelectionMarkdown: () => string;\n insertMarkdown: (markdown: string) => void;\n setMarkdown: (markdown: string) => void;\n}\n\nconst EDITOR_MIN_HEIGHT_CLASS: Record<FormSize, string> = {\n xs: \"min-h-32\",\n sm: \"min-h-36\",\n md: \"min-h-40\",\n lg: \"min-h-48\",\n xl: \"min-h-56\",\n};\n\nlet mdxEditorModulePromise: Promise<MdxEditorModule> | null = null;\n\nfunction loadMdxEditorModule(): Promise<MdxEditorModule> {\n mdxEditorModulePromise ??= import(\"@mdxeditor/editor\");\n return mdxEditorModulePromise;\n}\n\nexport function MdxEditorField({\n id,\n value = \"\",\n onChange,\n readOnly = false,\n disabled = false,\n size = \"md\",\n placeholder,\n className,\n contentClassName,\n textareaClassName,\n \"aria-label\": ariaLabel,\n commitInitialMarkdownNormalize = false,\n ...pluginOptions\n}: MdxEditorFieldProps) {\n const [mdx, setMdx] = useState<MdxEditorModule | null>(null);\n const [parseError, setParseError] = useState<{\n error: string;\n source: string;\n } | null>(null);\n const editorRef = useRef<MdxEditorMethods>(null);\n const lastValueRef = useRef(value);\n const readonly = readOnly || disabled;\n\n useEffect(() => {\n let cancelled = false;\n loadMdxEditorModule()\n .then((mod) => {\n if (!cancelled) setMdx(mod);\n })\n .catch(() => {\n if (!cancelled) setMdx(null);\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n useEffect(() => {\n if (!mdx || value === lastValueRef.current) return;\n lastValueRef.current = value;\n setParseError(null);\n editorRef.current?.setMarkdown(value);\n }, [mdx, value]);\n\n const commit = useCallback(\n (next: string, initialMarkdownNormalize = false) => {\n if (initialMarkdownNormalize && !commitInitialMarkdownNormalize) return;\n lastValueRef.current = next;\n onChange?.(next);\n },\n [commitInitialMarkdownNormalize, onChange],\n );\n\n const plugins = useMemo(\n () => (mdx ? createMdxEditorPlugins(mdx, pluginOptions) : []),\n [mdx, pluginOptions],\n );\n\n const reportError = useCallback(\n (error: { error: string; source: string }) => {\n queueMicrotask(() => setParseError(error));\n },\n [],\n );\n\n const currentError = parseError;\n if (!mdx || currentError) {\n const fallbackAriaLabel =\n ariaLabel ??\n (currentError ? \"Markdown source\" : id ? undefined : \"Markdown\");\n return (\n <div className=\"min-w-0\">\n {currentError && (\n <div role=\"alert\" className=\"mb-2 text-sm text-destructive\">\n Markdown could not be loaded: {currentError.error}\n </div>\n )}\n <textarea\n id={id}\n data-jsf-input\n rows={6}\n aria-label={fallbackAriaLabel}\n className={cn(\n inputClass(size),\n \"h-auto resize-y font-mono\",\n EDITOR_MIN_HEIGHT_CLASS[size],\n textareaClassName,\n )}\n value={value}\n disabled={readonly}\n placeholder={\n typeof placeholder === \"string\" ? placeholder : undefined\n }\n onChange={(event) => commit(event.target.value)}\n />\n {currentError && !readonly && (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => setParseError(null)}>\n Retry rich text\n </Button>\n )}\n </div>\n );\n }\n\n const { MDXEditor } = mdx;\n return (\n <div id={id} data-jsf-input className=\"min-w-0\">\n <MDXEditor\n ref={editorRef}\n markdown={value}\n readOnly={readonly}\n placeholder={placeholder}\n plugins={plugins}\n className={cn(\"clicky-mdx-editor-field\", readonly && \"clicky-mdx-editor-field-readonly\", className)}\n contentEditableClassName={cn(\"clicky-mdx-editor-content\", EDITOR_MIN_HEIGHT_CLASS[size], contentClassName)}\n onChange={commit}\n onError={reportError}\n />\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -55,7 +55,12 @@ function itemSummaryFor({
55
55
  var _a, _b, _c;
56
56
  const obj = collections.isPlainObject(item) ? item : {};
57
57
  const props = itemProperties(itemSchema, obj);
58
- const title = firstNonEmpty((spec.title ?? DEFAULT_TITLE_KEYS).map((key) => text(obj[key]))) ?? spec.fallback ?? `Item ${index + 1}`;
58
+ const title = firstNonEmpty(
59
+ (spec.title ?? DEFAULT_TITLE_KEYS).map((key) => {
60
+ const value = text(obj[key]);
61
+ return value && enumLabel(props[key], value);
62
+ })
63
+ ) ?? spec.fallback ?? `Item ${index + 1}`;
59
64
  const summary = (spec.summary ?? []).map((part) => summaryPart(obj, part)).filter((s) => !!s).join(SUMMARY_SEPARATOR);
60
65
  const glyphValue = spec.glyph ? text(obj[spec.glyph]) : "";
61
66
  const glyphProp = spec.glyph ? props[spec.glyph] : void 0;
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema-form-item-summary.cjs","sources":["../../src/components/json-schema-form-item-summary.ts"],"sourcesContent":["import { isPlainObject } from \"../lib/collections\";\nimport { effectiveProperties } from \"./json-schema-form-conditionals\";\nimport { normalizeTone } from \"./json-schema-form-tone\";\nimport type {\n ArrayItemAction,\n ArrayItemSpec,\n ArrayItemSummary,\n ArrayItemSummaryPart,\n JsonSchemaObject,\n JsonSchemaProperty,\n} from \"./json-schema-form-types\";\n\n// Property names worth trying for a row title when the schema does not say.\n// Ordered most-human-readable first.\nconst DEFAULT_TITLE_KEYS = [\"title\", \"name\", \"label\", \"id\", \"key\"];\n\nconst SUMMARY_SEPARATOR = \" · \";\nconst VALUE_SEPARATOR = \", \";\n\n// resolveItemSpec reads the array's `x-item` and fills in every default, so the\n// renderer never has to ask whether a key was supplied. With no `x-item` at all\n// the result reproduces today's behaviour exactly: an `Item <n>` title and an\n// \"Add item\" button.\nexport function resolveItemSpec(\n arraySchema: JsonSchemaProperty,\n itemSchema: JsonSchemaProperty | undefined,\n): ArrayItemSpec {\n const raw = isPlainObject(arraySchema[\"x-item\"])\n ? (arraySchema[\"x-item\"] as ArrayItemSpec)\n : {};\n const title = stringArray(raw.title);\n const summary = summaryParts(raw.summary);\n const glyph = typeof raw.glyph === \"string\" ? raw.glyph : autoGlyphKey(itemSchema);\n return {\n title: title.length > 0 ? title : DEFAULT_TITLE_KEYS,\n ...(typeof raw.fallback === \"string\" && raw.fallback ? { fallback: raw.fallback } : {}),\n ...(summary.length > 0 ? { summary } : {}),\n ...(glyph ? { glyph } : {}),\n ...(typeof raw.badge === \"string\" && raw.badge ? { badge: raw.badge } : {}),\n ...(typeof raw.flag === \"string\" && raw.flag ? { flag: raw.flag } : {}),\n // Only carried when the schema actually said something: an absent key means\n // every action, while an explicit empty list means none, and those two\n // cannot be told apart once the default has been filled in.\n ...(Array.isArray(raw.actions) ? { actions: itemActions(raw.actions) } : {}),\n noun: firstNonEmpty([raw.noun, itemSchema?.title]) ?? \"item\",\n nounPlural: firstNonEmpty([raw.nounPlural, arraySchema.title]) ?? \"items\",\n ...(typeof raw.empty === \"string\" && raw.empty ? { empty: raw.empty } : {}),\n };\n}\n\nconst ITEM_ACTIONS: ArrayItemAction[] = [\"reorder\", \"duplicate\", \"remove\"];\n\nfunction itemActions(value: unknown[]): ArrayItemAction[] {\n return value.filter((entry): entry is ArrayItemAction =>\n ITEM_ACTIONS.includes(entry as ArrayItemAction),\n );\n}\n\n// itemActionsAllow is the one question every array display asks of `x-item`, so\n// the accordion and the cards never disagree about what a schema permitted.\nexport function itemActionsAllow(spec: ArrayItemSpec, action: ArrayItemAction): boolean {\n return spec.actions ? spec.actions.includes(action) : true;\n}\n\n// itemProperties is the item schema's effective properties — `allOf` members\n// included, so items composed of flattened `$ref`s summarize like any other —\n// resolved against `value`.\nfunction itemProperties(\n itemSchema: JsonSchemaProperty | undefined,\n value: Record<string, unknown>,\n): Record<string, JsonSchemaProperty> {\n return itemSchema ? effectiveProperties(itemSchema as JsonSchemaObject, value).properties : {};\n}\n\n// autoGlyphKey picks the item property that can colour a row without being told:\n// the first enum carrying per-value icons. Keeps a schema that already declares\n// x-enum-icons from having to repeat itself in x-item. The spec is one per\n// array, so there is no item value to select a conditional branch: only base\n// and unconditional properties (and `else` branches, which `{}` selects) count.\nfunction autoGlyphKey(itemSchema: JsonSchemaProperty | undefined): string | undefined {\n for (const [key, prop] of Object.entries(itemProperties(itemSchema, {}))) {\n const icons = prop[\"x-enum-icons\"];\n if (Array.isArray(prop.enum) && icons && Object.keys(icons).length > 0) return key;\n }\n return undefined;\n}\n\n// itemSummaryFor derives one collapsed row from the item's raw VALUE — never\n// from its rendered fields. A consumer pre-extension may hide a property's\n// control entirely (returning null) and still have it appear in the summary.\nexport function itemSummaryFor({\n item,\n index,\n spec,\n itemSchema,\n}: {\n item: unknown;\n index: number;\n spec: ArrayItemSpec;\n itemSchema: JsonSchemaProperty | undefined;\n}): ArrayItemSummary {\n const obj = isPlainObject(item) ? item : {};\n // Resolved against this item's own value, as the item's body is rendered,\n // so a property a matching `then`/`else` branch declares labels its chip.\n const props = itemProperties(itemSchema, obj);\n\n const title =\n firstNonEmpty((spec.title ?? DEFAULT_TITLE_KEYS).map((key) => text(obj[key]))) ??\n spec.fallback ??\n `Item ${index + 1}`;\n\n const summary = (spec.summary ?? [])\n .map((part) => summaryPart(obj, part))\n .filter((s): s is string => !!s)\n .join(SUMMARY_SEPARATOR);\n\n const glyphValue = spec.glyph ? text(obj[spec.glyph]) : \"\";\n const glyphProp = spec.glyph ? props[spec.glyph] : undefined;\n const badgeValue = spec.badge ? text(obj[spec.badge]) : \"\";\n const badgeProp = spec.badge ? props[spec.badge] : undefined;\n const badgeIcon = badgeProp?.[\"x-enum-icons\"]?.[badgeValue];\n\n return {\n title,\n ...(summary ? { summary } : {}),\n ...(spec.glyph\n ? {\n glyph: {\n ...(glyphProp?.[\"x-enum-icons\"]?.[glyphValue]\n ? { icon: glyphProp[\"x-enum-icons\"][glyphValue] }\n : {}),\n tone: normalizeTone(glyphProp?.[\"x-enum-tones\"]?.[glyphValue]),\n ...(glyphValue ? { label: enumLabel(glyphProp, glyphValue) } : {}),\n },\n }\n : {}),\n ...(badgeValue\n ? {\n badge: {\n ...(badgeIcon ? { icon: badgeIcon } : {}),\n label: enumLabel(badgeProp, badgeValue),\n },\n }\n : {}),\n ...(spec.flag && obj[spec.flag] === true ? { flagged: true } : {}),\n };\n}\n\n// The add row's button text — \"Add parameter\" when the schema names its noun,\n// and the historical \"Add item\" when it does not.\nexport function addItemLabel(spec: ArrayItemSpec): string {\n return `Add ${spec.noun ?? \"item\"}`;\n}\n\nexport function itemCountLabel(spec: ArrayItemSpec, count: number): string {\n return count === 1\n ? `1 ${spec.noun ?? \"item\"}`\n : `${count} ${spec.nounPlural ?? \"items\"}`;\n}\n\n// The zero-item explanation. Falls back to the array's own description, so a\n// schema that already documents the field gets the empty state for free.\nexport function emptyItemsCopy(\n spec: ArrayItemSpec,\n arraySchema: JsonSchemaProperty,\n): string | undefined {\n if (spec.empty) return spec.empty;\n const description = typeof arraySchema.description === \"string\" ? arraySchema.description.trim() : \"\";\n return description || undefined;\n}\n\nexport function noItemsLabel(spec: ArrayItemSpec): string {\n return `No ${spec.nounPlural ?? \"items\"} yet`;\n}\n\n// summaryPart renders one part, substituting the value into a single literal\n// `{}` in the pattern. A pattern without `{}` renders as-is (it is a literal),\n// and a missing value drops the part rather than leaving a dangling separator.\nfunction summaryPart(\n obj: Record<string, unknown>,\n part: string | ArrayItemSummaryPart,\n): string | undefined {\n const { property, pattern } = typeof part === \"string\" ? { property: part, pattern: undefined } : part;\n const value = text(obj[property]);\n if (!value) return undefined;\n return pattern ? pattern.replace(\"{}\", value) : value;\n}\n\n// enumLabel prefers the human label the schema declares for a code, falling back\n// to the code itself. Unlike the combobox option list this does NOT render\n// \"Label (code)\" — a chip has room for one of the two, and the label is the one\n// worth reading.\nfunction enumLabel(prop: JsonSchemaProperty | undefined, value: string): string {\n const label = prop?.[\"x-enum-labels\"]?.[value];\n return typeof label === \"string\" && label ? label : value;\n}\n\n// text flattens a value to its display string. Arrays join, so a list-valued\n// property still reads as one line.\nfunction text(value: unknown): string {\n if (value === undefined || value === null) return \"\";\n if (Array.isArray(value)) return value.map(text).filter(Boolean).join(VALUE_SEPARATOR);\n if (typeof value === \"object\") return \"\";\n return String(value).trim();\n}\n\nfunction stringArray(value: unknown): string[] {\n if (typeof value === \"string\") return [value];\n if (!Array.isArray(value)) return [];\n return value.filter((v): v is string => typeof v === \"string\" && !!v);\n}\n\nfunction summaryParts(value: unknown): Array<string | ArrayItemSummaryPart> {\n if (!Array.isArray(value)) return [];\n return (value as unknown[]).flatMap((part): Array<string | ArrayItemSummaryPart> => {\n if (typeof part === \"string\" && part) return [part];\n if (isPlainObject(part) && typeof part.property === \"string\" && part.property) {\n return [\n {\n property: part.property,\n ...(typeof part.pattern === \"string\" && part.pattern ? { pattern: part.pattern } : {}),\n } satisfies ArrayItemSummaryPart,\n ];\n }\n return [];\n });\n}\n\nfunction firstNonEmpty(values: Array<string | undefined>): string | undefined {\n for (const value of values) {\n const trimmed = typeof value === \"string\" ? value.trim() : \"\";\n if (trimmed) return trimmed;\n }\n return undefined;\n}\n"],"names":["isPlainObject","effectiveProperties","normalizeTone"],"mappings":"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"}
1
+ {"version":3,"file":"json-schema-form-item-summary.cjs","sources":["../../src/components/json-schema-form-item-summary.ts"],"sourcesContent":["import { isPlainObject } from \"../lib/collections\";\nimport { effectiveProperties } from \"./json-schema-form-conditionals\";\nimport { normalizeTone } from \"./json-schema-form-tone\";\nimport type {\n ArrayItemAction,\n ArrayItemSpec,\n ArrayItemSummary,\n ArrayItemSummaryPart,\n JsonSchemaObject,\n JsonSchemaProperty,\n} from \"./json-schema-form-types\";\n\n// Property names worth trying for a row title when the schema does not say.\n// Ordered most-human-readable first.\nconst DEFAULT_TITLE_KEYS = [\"title\", \"name\", \"label\", \"id\", \"key\"];\n\nconst SUMMARY_SEPARATOR = \" · \";\nconst VALUE_SEPARATOR = \", \";\n\n// resolveItemSpec reads the array's `x-item` and fills in every default, so the\n// renderer never has to ask whether a key was supplied. With no `x-item` at all\n// the result reproduces today's behaviour exactly: an `Item <n>` title and an\n// \"Add item\" button.\nexport function resolveItemSpec(\n arraySchema: JsonSchemaProperty,\n itemSchema: JsonSchemaProperty | undefined,\n): ArrayItemSpec {\n const raw = isPlainObject(arraySchema[\"x-item\"])\n ? (arraySchema[\"x-item\"] as ArrayItemSpec)\n : {};\n const title = stringArray(raw.title);\n const summary = summaryParts(raw.summary);\n const glyph = typeof raw.glyph === \"string\" ? raw.glyph : autoGlyphKey(itemSchema);\n return {\n title: title.length > 0 ? title : DEFAULT_TITLE_KEYS,\n ...(typeof raw.fallback === \"string\" && raw.fallback ? { fallback: raw.fallback } : {}),\n ...(summary.length > 0 ? { summary } : {}),\n ...(glyph ? { glyph } : {}),\n ...(typeof raw.badge === \"string\" && raw.badge ? { badge: raw.badge } : {}),\n ...(typeof raw.flag === \"string\" && raw.flag ? { flag: raw.flag } : {}),\n // Only carried when the schema actually said something: an absent key means\n // every action, while an explicit empty list means none, and those two\n // cannot be told apart once the default has been filled in.\n ...(Array.isArray(raw.actions) ? { actions: itemActions(raw.actions) } : {}),\n noun: firstNonEmpty([raw.noun, itemSchema?.title]) ?? \"item\",\n nounPlural: firstNonEmpty([raw.nounPlural, arraySchema.title]) ?? \"items\",\n ...(typeof raw.empty === \"string\" && raw.empty ? { empty: raw.empty } : {}),\n };\n}\n\nconst ITEM_ACTIONS: ArrayItemAction[] = [\"reorder\", \"duplicate\", \"remove\"];\n\nfunction itemActions(value: unknown[]): ArrayItemAction[] {\n return value.filter((entry): entry is ArrayItemAction =>\n ITEM_ACTIONS.includes(entry as ArrayItemAction),\n );\n}\n\n// itemActionsAllow is the one question every array display asks of `x-item`, so\n// the accordion and the cards never disagree about what a schema permitted.\nexport function itemActionsAllow(spec: ArrayItemSpec, action: ArrayItemAction): boolean {\n return spec.actions ? spec.actions.includes(action) : true;\n}\n\n// itemProperties is the item schema's effective properties — `allOf` members\n// included, so items composed of flattened `$ref`s summarize like any other —\n// resolved against `value`.\nfunction itemProperties(\n itemSchema: JsonSchemaProperty | undefined,\n value: Record<string, unknown>,\n): Record<string, JsonSchemaProperty> {\n return itemSchema ? effectiveProperties(itemSchema as JsonSchemaObject, value).properties : {};\n}\n\n// autoGlyphKey picks the item property that can colour a row without being told:\n// the first enum carrying per-value icons. Keeps a schema that already declares\n// x-enum-icons from having to repeat itself in x-item. The spec is one per\n// array, so there is no item value to select a conditional branch: only base\n// and unconditional properties (and `else` branches, which `{}` selects) count.\nfunction autoGlyphKey(itemSchema: JsonSchemaProperty | undefined): string | undefined {\n for (const [key, prop] of Object.entries(itemProperties(itemSchema, {}))) {\n const icons = prop[\"x-enum-icons\"];\n if (Array.isArray(prop.enum) && icons && Object.keys(icons).length > 0) return key;\n }\n return undefined;\n}\n\n// itemSummaryFor derives one collapsed row from the item's raw VALUE — never\n// from its rendered fields. A consumer pre-extension may hide a property's\n// control entirely (returning null) and still have it appear in the summary.\nexport function itemSummaryFor({\n item,\n index,\n spec,\n itemSchema,\n}: {\n item: unknown;\n index: number;\n spec: ArrayItemSpec;\n itemSchema: JsonSchemaProperty | undefined;\n}): ArrayItemSummary {\n const obj = isPlainObject(item) ? item : {};\n // Resolved against this item's own value, as the item's body is rendered,\n // so a property a matching `then`/`else` branch declares labels its chip.\n const props = itemProperties(itemSchema, obj);\n\n const title =\n firstNonEmpty(\n (spec.title ?? DEFAULT_TITLE_KEYS).map((key) => {\n const value = text(obj[key]);\n return value && enumLabel(props[key], value);\n }),\n ) ??\n spec.fallback ??\n `Item ${index + 1}`;\n\n const summary = (spec.summary ?? [])\n .map((part) => summaryPart(obj, part))\n .filter((s): s is string => !!s)\n .join(SUMMARY_SEPARATOR);\n\n const glyphValue = spec.glyph ? text(obj[spec.glyph]) : \"\";\n const glyphProp = spec.glyph ? props[spec.glyph] : undefined;\n const badgeValue = spec.badge ? text(obj[spec.badge]) : \"\";\n const badgeProp = spec.badge ? props[spec.badge] : undefined;\n const badgeIcon = badgeProp?.[\"x-enum-icons\"]?.[badgeValue];\n\n return {\n title,\n ...(summary ? { summary } : {}),\n ...(spec.glyph\n ? {\n glyph: {\n ...(glyphProp?.[\"x-enum-icons\"]?.[glyphValue]\n ? { icon: glyphProp[\"x-enum-icons\"][glyphValue] }\n : {}),\n tone: normalizeTone(glyphProp?.[\"x-enum-tones\"]?.[glyphValue]),\n ...(glyphValue ? { label: enumLabel(glyphProp, glyphValue) } : {}),\n },\n }\n : {}),\n ...(badgeValue\n ? {\n badge: {\n ...(badgeIcon ? { icon: badgeIcon } : {}),\n label: enumLabel(badgeProp, badgeValue),\n },\n }\n : {}),\n ...(spec.flag && obj[spec.flag] === true ? { flagged: true } : {}),\n };\n}\n\n// The add row's button text — \"Add parameter\" when the schema names its noun,\n// and the historical \"Add item\" when it does not.\nexport function addItemLabel(spec: ArrayItemSpec): string {\n return `Add ${spec.noun ?? \"item\"}`;\n}\n\nexport function itemCountLabel(spec: ArrayItemSpec, count: number): string {\n return count === 1\n ? `1 ${spec.noun ?? \"item\"}`\n : `${count} ${spec.nounPlural ?? \"items\"}`;\n}\n\n// The zero-item explanation. Falls back to the array's own description, so a\n// schema that already documents the field gets the empty state for free.\nexport function emptyItemsCopy(\n spec: ArrayItemSpec,\n arraySchema: JsonSchemaProperty,\n): string | undefined {\n if (spec.empty) return spec.empty;\n const description = typeof arraySchema.description === \"string\" ? arraySchema.description.trim() : \"\";\n return description || undefined;\n}\n\nexport function noItemsLabel(spec: ArrayItemSpec): string {\n return `No ${spec.nounPlural ?? \"items\"} yet`;\n}\n\n// summaryPart renders one part, substituting the value into a single literal\n// `{}` in the pattern. A pattern without `{}` renders as-is (it is a literal),\n// and a missing value drops the part rather than leaving a dangling separator.\nfunction summaryPart(\n obj: Record<string, unknown>,\n part: string | ArrayItemSummaryPart,\n): string | undefined {\n const { property, pattern } = typeof part === \"string\" ? { property: part, pattern: undefined } : part;\n const value = text(obj[property]);\n if (!value) return undefined;\n return pattern ? pattern.replace(\"{}\", value) : value;\n}\n\n// enumLabel prefers the human label the schema declares for a code, falling back\n// to the code itself. Unlike the combobox option list this does NOT render\n// \"Label (code)\" — a chip has room for one of the two, and the label is the one\n// worth reading.\nfunction enumLabel(prop: JsonSchemaProperty | undefined, value: string): string {\n const label = prop?.[\"x-enum-labels\"]?.[value];\n return typeof label === \"string\" && label ? label : value;\n}\n\n// text flattens a value to its display string. Arrays join, so a list-valued\n// property still reads as one line.\nfunction text(value: unknown): string {\n if (value === undefined || value === null) return \"\";\n if (Array.isArray(value)) return value.map(text).filter(Boolean).join(VALUE_SEPARATOR);\n if (typeof value === \"object\") return \"\";\n return String(value).trim();\n}\n\nfunction stringArray(value: unknown): string[] {\n if (typeof value === \"string\") return [value];\n if (!Array.isArray(value)) return [];\n return value.filter((v): v is string => typeof v === \"string\" && !!v);\n}\n\nfunction summaryParts(value: unknown): Array<string | ArrayItemSummaryPart> {\n if (!Array.isArray(value)) return [];\n return (value as unknown[]).flatMap((part): Array<string | ArrayItemSummaryPart> => {\n if (typeof part === \"string\" && part) return [part];\n if (isPlainObject(part) && typeof part.property === \"string\" && part.property) {\n return [\n {\n property: part.property,\n ...(typeof part.pattern === \"string\" && part.pattern ? { pattern: part.pattern } : {}),\n } satisfies ArrayItemSummaryPart,\n ];\n }\n return [];\n });\n}\n\nfunction firstNonEmpty(values: Array<string | undefined>): string | undefined {\n for (const value of values) {\n const trimmed = typeof value === \"string\" ? value.trim() : \"\";\n if (trimmed) return trimmed;\n }\n return undefined;\n}\n"],"names":["isPlainObject","effectiveProperties","normalizeTone"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema-form-item-summary.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-item-summary.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,gBAAgB,EAGhB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAalC,wBAAgB,eAAe,CAC7B,WAAW,EAAE,kBAAkB,EAC/B,UAAU,EAAE,kBAAkB,GAAG,SAAS,GACzC,aAAa,CAsBf;AAYD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAEtF;AA4BD,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,UAAU,GACX,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,kBAAkB,GAAG,SAAS,CAAC;CAC5C,GAAG,gBAAgB,CA8CnB;AAID,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAExD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIzE;AAID,wBAAgB,cAAc,CAC5B,IAAI,EAAE,aAAa,EACnB,WAAW,EAAE,kBAAkB,GAC9B,MAAM,GAAG,SAAS,CAIpB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAExD"}
1
+ {"version":3,"file":"json-schema-form-item-summary.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-item-summary.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,gBAAgB,EAGhB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAalC,wBAAgB,eAAe,CAC7B,WAAW,EAAE,kBAAkB,EAC/B,UAAU,EAAE,kBAAkB,GAAG,SAAS,GACzC,aAAa,CAsBf;AAYD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAEtF;AA4BD,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,UAAU,GACX,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,kBAAkB,GAAG,SAAS,CAAC;CAC5C,GAAG,gBAAgB,CAmDnB;AAID,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAExD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIzE;AAID,wBAAgB,cAAc,CAC5B,IAAI,EAAE,aAAa,EACnB,WAAW,EAAE,kBAAkB,GAC9B,MAAM,GAAG,SAAS,CAIpB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAExD"}
@@ -53,7 +53,12 @@ function itemSummaryFor({
53
53
  var _a, _b, _c;
54
54
  const obj = isPlainObject(item) ? item : {};
55
55
  const props = itemProperties(itemSchema, obj);
56
- const title = firstNonEmpty((spec.title ?? DEFAULT_TITLE_KEYS).map((key) => text(obj[key]))) ?? spec.fallback ?? `Item ${index + 1}`;
56
+ const title = firstNonEmpty(
57
+ (spec.title ?? DEFAULT_TITLE_KEYS).map((key) => {
58
+ const value = text(obj[key]);
59
+ return value && enumLabel(props[key], value);
60
+ })
61
+ ) ?? spec.fallback ?? `Item ${index + 1}`;
57
62
  const summary = (spec.summary ?? []).map((part) => summaryPart(obj, part)).filter((s) => !!s).join(SUMMARY_SEPARATOR);
58
63
  const glyphValue = spec.glyph ? text(obj[spec.glyph]) : "";
59
64
  const glyphProp = spec.glyph ? props[spec.glyph] : void 0;
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema-form-item-summary.js","sources":["../../src/components/json-schema-form-item-summary.ts"],"sourcesContent":["import { isPlainObject } from \"../lib/collections\";\nimport { effectiveProperties } from \"./json-schema-form-conditionals\";\nimport { normalizeTone } from \"./json-schema-form-tone\";\nimport type {\n ArrayItemAction,\n ArrayItemSpec,\n ArrayItemSummary,\n ArrayItemSummaryPart,\n JsonSchemaObject,\n JsonSchemaProperty,\n} from \"./json-schema-form-types\";\n\n// Property names worth trying for a row title when the schema does not say.\n// Ordered most-human-readable first.\nconst DEFAULT_TITLE_KEYS = [\"title\", \"name\", \"label\", \"id\", \"key\"];\n\nconst SUMMARY_SEPARATOR = \" · \";\nconst VALUE_SEPARATOR = \", \";\n\n// resolveItemSpec reads the array's `x-item` and fills in every default, so the\n// renderer never has to ask whether a key was supplied. With no `x-item` at all\n// the result reproduces today's behaviour exactly: an `Item <n>` title and an\n// \"Add item\" button.\nexport function resolveItemSpec(\n arraySchema: JsonSchemaProperty,\n itemSchema: JsonSchemaProperty | undefined,\n): ArrayItemSpec {\n const raw = isPlainObject(arraySchema[\"x-item\"])\n ? (arraySchema[\"x-item\"] as ArrayItemSpec)\n : {};\n const title = stringArray(raw.title);\n const summary = summaryParts(raw.summary);\n const glyph = typeof raw.glyph === \"string\" ? raw.glyph : autoGlyphKey(itemSchema);\n return {\n title: title.length > 0 ? title : DEFAULT_TITLE_KEYS,\n ...(typeof raw.fallback === \"string\" && raw.fallback ? { fallback: raw.fallback } : {}),\n ...(summary.length > 0 ? { summary } : {}),\n ...(glyph ? { glyph } : {}),\n ...(typeof raw.badge === \"string\" && raw.badge ? { badge: raw.badge } : {}),\n ...(typeof raw.flag === \"string\" && raw.flag ? { flag: raw.flag } : {}),\n // Only carried when the schema actually said something: an absent key means\n // every action, while an explicit empty list means none, and those two\n // cannot be told apart once the default has been filled in.\n ...(Array.isArray(raw.actions) ? { actions: itemActions(raw.actions) } : {}),\n noun: firstNonEmpty([raw.noun, itemSchema?.title]) ?? \"item\",\n nounPlural: firstNonEmpty([raw.nounPlural, arraySchema.title]) ?? \"items\",\n ...(typeof raw.empty === \"string\" && raw.empty ? { empty: raw.empty } : {}),\n };\n}\n\nconst ITEM_ACTIONS: ArrayItemAction[] = [\"reorder\", \"duplicate\", \"remove\"];\n\nfunction itemActions(value: unknown[]): ArrayItemAction[] {\n return value.filter((entry): entry is ArrayItemAction =>\n ITEM_ACTIONS.includes(entry as ArrayItemAction),\n );\n}\n\n// itemActionsAllow is the one question every array display asks of `x-item`, so\n// the accordion and the cards never disagree about what a schema permitted.\nexport function itemActionsAllow(spec: ArrayItemSpec, action: ArrayItemAction): boolean {\n return spec.actions ? spec.actions.includes(action) : true;\n}\n\n// itemProperties is the item schema's effective properties — `allOf` members\n// included, so items composed of flattened `$ref`s summarize like any other —\n// resolved against `value`.\nfunction itemProperties(\n itemSchema: JsonSchemaProperty | undefined,\n value: Record<string, unknown>,\n): Record<string, JsonSchemaProperty> {\n return itemSchema ? effectiveProperties(itemSchema as JsonSchemaObject, value).properties : {};\n}\n\n// autoGlyphKey picks the item property that can colour a row without being told:\n// the first enum carrying per-value icons. Keeps a schema that already declares\n// x-enum-icons from having to repeat itself in x-item. The spec is one per\n// array, so there is no item value to select a conditional branch: only base\n// and unconditional properties (and `else` branches, which `{}` selects) count.\nfunction autoGlyphKey(itemSchema: JsonSchemaProperty | undefined): string | undefined {\n for (const [key, prop] of Object.entries(itemProperties(itemSchema, {}))) {\n const icons = prop[\"x-enum-icons\"];\n if (Array.isArray(prop.enum) && icons && Object.keys(icons).length > 0) return key;\n }\n return undefined;\n}\n\n// itemSummaryFor derives one collapsed row from the item's raw VALUE — never\n// from its rendered fields. A consumer pre-extension may hide a property's\n// control entirely (returning null) and still have it appear in the summary.\nexport function itemSummaryFor({\n item,\n index,\n spec,\n itemSchema,\n}: {\n item: unknown;\n index: number;\n spec: ArrayItemSpec;\n itemSchema: JsonSchemaProperty | undefined;\n}): ArrayItemSummary {\n const obj = isPlainObject(item) ? item : {};\n // Resolved against this item's own value, as the item's body is rendered,\n // so a property a matching `then`/`else` branch declares labels its chip.\n const props = itemProperties(itemSchema, obj);\n\n const title =\n firstNonEmpty((spec.title ?? DEFAULT_TITLE_KEYS).map((key) => text(obj[key]))) ??\n spec.fallback ??\n `Item ${index + 1}`;\n\n const summary = (spec.summary ?? [])\n .map((part) => summaryPart(obj, part))\n .filter((s): s is string => !!s)\n .join(SUMMARY_SEPARATOR);\n\n const glyphValue = spec.glyph ? text(obj[spec.glyph]) : \"\";\n const glyphProp = spec.glyph ? props[spec.glyph] : undefined;\n const badgeValue = spec.badge ? text(obj[spec.badge]) : \"\";\n const badgeProp = spec.badge ? props[spec.badge] : undefined;\n const badgeIcon = badgeProp?.[\"x-enum-icons\"]?.[badgeValue];\n\n return {\n title,\n ...(summary ? { summary } : {}),\n ...(spec.glyph\n ? {\n glyph: {\n ...(glyphProp?.[\"x-enum-icons\"]?.[glyphValue]\n ? { icon: glyphProp[\"x-enum-icons\"][glyphValue] }\n : {}),\n tone: normalizeTone(glyphProp?.[\"x-enum-tones\"]?.[glyphValue]),\n ...(glyphValue ? { label: enumLabel(glyphProp, glyphValue) } : {}),\n },\n }\n : {}),\n ...(badgeValue\n ? {\n badge: {\n ...(badgeIcon ? { icon: badgeIcon } : {}),\n label: enumLabel(badgeProp, badgeValue),\n },\n }\n : {}),\n ...(spec.flag && obj[spec.flag] === true ? { flagged: true } : {}),\n };\n}\n\n// The add row's button text — \"Add parameter\" when the schema names its noun,\n// and the historical \"Add item\" when it does not.\nexport function addItemLabel(spec: ArrayItemSpec): string {\n return `Add ${spec.noun ?? \"item\"}`;\n}\n\nexport function itemCountLabel(spec: ArrayItemSpec, count: number): string {\n return count === 1\n ? `1 ${spec.noun ?? \"item\"}`\n : `${count} ${spec.nounPlural ?? \"items\"}`;\n}\n\n// The zero-item explanation. Falls back to the array's own description, so a\n// schema that already documents the field gets the empty state for free.\nexport function emptyItemsCopy(\n spec: ArrayItemSpec,\n arraySchema: JsonSchemaProperty,\n): string | undefined {\n if (spec.empty) return spec.empty;\n const description = typeof arraySchema.description === \"string\" ? arraySchema.description.trim() : \"\";\n return description || undefined;\n}\n\nexport function noItemsLabel(spec: ArrayItemSpec): string {\n return `No ${spec.nounPlural ?? \"items\"} yet`;\n}\n\n// summaryPart renders one part, substituting the value into a single literal\n// `{}` in the pattern. A pattern without `{}` renders as-is (it is a literal),\n// and a missing value drops the part rather than leaving a dangling separator.\nfunction summaryPart(\n obj: Record<string, unknown>,\n part: string | ArrayItemSummaryPart,\n): string | undefined {\n const { property, pattern } = typeof part === \"string\" ? { property: part, pattern: undefined } : part;\n const value = text(obj[property]);\n if (!value) return undefined;\n return pattern ? pattern.replace(\"{}\", value) : value;\n}\n\n// enumLabel prefers the human label the schema declares for a code, falling back\n// to the code itself. Unlike the combobox option list this does NOT render\n// \"Label (code)\" — a chip has room for one of the two, and the label is the one\n// worth reading.\nfunction enumLabel(prop: JsonSchemaProperty | undefined, value: string): string {\n const label = prop?.[\"x-enum-labels\"]?.[value];\n return typeof label === \"string\" && label ? label : value;\n}\n\n// text flattens a value to its display string. Arrays join, so a list-valued\n// property still reads as one line.\nfunction text(value: unknown): string {\n if (value === undefined || value === null) return \"\";\n if (Array.isArray(value)) return value.map(text).filter(Boolean).join(VALUE_SEPARATOR);\n if (typeof value === \"object\") return \"\";\n return String(value).trim();\n}\n\nfunction stringArray(value: unknown): string[] {\n if (typeof value === \"string\") return [value];\n if (!Array.isArray(value)) return [];\n return value.filter((v): v is string => typeof v === \"string\" && !!v);\n}\n\nfunction summaryParts(value: unknown): Array<string | ArrayItemSummaryPart> {\n if (!Array.isArray(value)) return [];\n return (value as unknown[]).flatMap((part): Array<string | ArrayItemSummaryPart> => {\n if (typeof part === \"string\" && part) return [part];\n if (isPlainObject(part) && typeof part.property === \"string\" && part.property) {\n return [\n {\n property: part.property,\n ...(typeof part.pattern === \"string\" && part.pattern ? { pattern: part.pattern } : {}),\n } satisfies ArrayItemSummaryPart,\n ];\n }\n return [];\n });\n}\n\nfunction firstNonEmpty(values: Array<string | undefined>): string | undefined {\n for (const value of values) {\n const trimmed = typeof value === \"string\" ? value.trim() : \"\";\n if (trimmed) return trimmed;\n }\n return undefined;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"json-schema-form-item-summary.js","sources":["../../src/components/json-schema-form-item-summary.ts"],"sourcesContent":["import { isPlainObject } from \"../lib/collections\";\nimport { effectiveProperties } from \"./json-schema-form-conditionals\";\nimport { normalizeTone } from \"./json-schema-form-tone\";\nimport type {\n ArrayItemAction,\n ArrayItemSpec,\n ArrayItemSummary,\n ArrayItemSummaryPart,\n JsonSchemaObject,\n JsonSchemaProperty,\n} from \"./json-schema-form-types\";\n\n// Property names worth trying for a row title when the schema does not say.\n// Ordered most-human-readable first.\nconst DEFAULT_TITLE_KEYS = [\"title\", \"name\", \"label\", \"id\", \"key\"];\n\nconst SUMMARY_SEPARATOR = \" · \";\nconst VALUE_SEPARATOR = \", \";\n\n// resolveItemSpec reads the array's `x-item` and fills in every default, so the\n// renderer never has to ask whether a key was supplied. With no `x-item` at all\n// the result reproduces today's behaviour exactly: an `Item <n>` title and an\n// \"Add item\" button.\nexport function resolveItemSpec(\n arraySchema: JsonSchemaProperty,\n itemSchema: JsonSchemaProperty | undefined,\n): ArrayItemSpec {\n const raw = isPlainObject(arraySchema[\"x-item\"])\n ? (arraySchema[\"x-item\"] as ArrayItemSpec)\n : {};\n const title = stringArray(raw.title);\n const summary = summaryParts(raw.summary);\n const glyph = typeof raw.glyph === \"string\" ? raw.glyph : autoGlyphKey(itemSchema);\n return {\n title: title.length > 0 ? title : DEFAULT_TITLE_KEYS,\n ...(typeof raw.fallback === \"string\" && raw.fallback ? { fallback: raw.fallback } : {}),\n ...(summary.length > 0 ? { summary } : {}),\n ...(glyph ? { glyph } : {}),\n ...(typeof raw.badge === \"string\" && raw.badge ? { badge: raw.badge } : {}),\n ...(typeof raw.flag === \"string\" && raw.flag ? { flag: raw.flag } : {}),\n // Only carried when the schema actually said something: an absent key means\n // every action, while an explicit empty list means none, and those two\n // cannot be told apart once the default has been filled in.\n ...(Array.isArray(raw.actions) ? { actions: itemActions(raw.actions) } : {}),\n noun: firstNonEmpty([raw.noun, itemSchema?.title]) ?? \"item\",\n nounPlural: firstNonEmpty([raw.nounPlural, arraySchema.title]) ?? \"items\",\n ...(typeof raw.empty === \"string\" && raw.empty ? { empty: raw.empty } : {}),\n };\n}\n\nconst ITEM_ACTIONS: ArrayItemAction[] = [\"reorder\", \"duplicate\", \"remove\"];\n\nfunction itemActions(value: unknown[]): ArrayItemAction[] {\n return value.filter((entry): entry is ArrayItemAction =>\n ITEM_ACTIONS.includes(entry as ArrayItemAction),\n );\n}\n\n// itemActionsAllow is the one question every array display asks of `x-item`, so\n// the accordion and the cards never disagree about what a schema permitted.\nexport function itemActionsAllow(spec: ArrayItemSpec, action: ArrayItemAction): boolean {\n return spec.actions ? spec.actions.includes(action) : true;\n}\n\n// itemProperties is the item schema's effective properties — `allOf` members\n// included, so items composed of flattened `$ref`s summarize like any other —\n// resolved against `value`.\nfunction itemProperties(\n itemSchema: JsonSchemaProperty | undefined,\n value: Record<string, unknown>,\n): Record<string, JsonSchemaProperty> {\n return itemSchema ? effectiveProperties(itemSchema as JsonSchemaObject, value).properties : {};\n}\n\n// autoGlyphKey picks the item property that can colour a row without being told:\n// the first enum carrying per-value icons. Keeps a schema that already declares\n// x-enum-icons from having to repeat itself in x-item. The spec is one per\n// array, so there is no item value to select a conditional branch: only base\n// and unconditional properties (and `else` branches, which `{}` selects) count.\nfunction autoGlyphKey(itemSchema: JsonSchemaProperty | undefined): string | undefined {\n for (const [key, prop] of Object.entries(itemProperties(itemSchema, {}))) {\n const icons = prop[\"x-enum-icons\"];\n if (Array.isArray(prop.enum) && icons && Object.keys(icons).length > 0) return key;\n }\n return undefined;\n}\n\n// itemSummaryFor derives one collapsed row from the item's raw VALUE — never\n// from its rendered fields. A consumer pre-extension may hide a property's\n// control entirely (returning null) and still have it appear in the summary.\nexport function itemSummaryFor({\n item,\n index,\n spec,\n itemSchema,\n}: {\n item: unknown;\n index: number;\n spec: ArrayItemSpec;\n itemSchema: JsonSchemaProperty | undefined;\n}): ArrayItemSummary {\n const obj = isPlainObject(item) ? item : {};\n // Resolved against this item's own value, as the item's body is rendered,\n // so a property a matching `then`/`else` branch declares labels its chip.\n const props = itemProperties(itemSchema, obj);\n\n const title =\n firstNonEmpty(\n (spec.title ?? DEFAULT_TITLE_KEYS).map((key) => {\n const value = text(obj[key]);\n return value && enumLabel(props[key], value);\n }),\n ) ??\n spec.fallback ??\n `Item ${index + 1}`;\n\n const summary = (spec.summary ?? [])\n .map((part) => summaryPart(obj, part))\n .filter((s): s is string => !!s)\n .join(SUMMARY_SEPARATOR);\n\n const glyphValue = spec.glyph ? text(obj[spec.glyph]) : \"\";\n const glyphProp = spec.glyph ? props[spec.glyph] : undefined;\n const badgeValue = spec.badge ? text(obj[spec.badge]) : \"\";\n const badgeProp = spec.badge ? props[spec.badge] : undefined;\n const badgeIcon = badgeProp?.[\"x-enum-icons\"]?.[badgeValue];\n\n return {\n title,\n ...(summary ? { summary } : {}),\n ...(spec.glyph\n ? {\n glyph: {\n ...(glyphProp?.[\"x-enum-icons\"]?.[glyphValue]\n ? { icon: glyphProp[\"x-enum-icons\"][glyphValue] }\n : {}),\n tone: normalizeTone(glyphProp?.[\"x-enum-tones\"]?.[glyphValue]),\n ...(glyphValue ? { label: enumLabel(glyphProp, glyphValue) } : {}),\n },\n }\n : {}),\n ...(badgeValue\n ? {\n badge: {\n ...(badgeIcon ? { icon: badgeIcon } : {}),\n label: enumLabel(badgeProp, badgeValue),\n },\n }\n : {}),\n ...(spec.flag && obj[spec.flag] === true ? { flagged: true } : {}),\n };\n}\n\n// The add row's button text — \"Add parameter\" when the schema names its noun,\n// and the historical \"Add item\" when it does not.\nexport function addItemLabel(spec: ArrayItemSpec): string {\n return `Add ${spec.noun ?? \"item\"}`;\n}\n\nexport function itemCountLabel(spec: ArrayItemSpec, count: number): string {\n return count === 1\n ? `1 ${spec.noun ?? \"item\"}`\n : `${count} ${spec.nounPlural ?? \"items\"}`;\n}\n\n// The zero-item explanation. Falls back to the array's own description, so a\n// schema that already documents the field gets the empty state for free.\nexport function emptyItemsCopy(\n spec: ArrayItemSpec,\n arraySchema: JsonSchemaProperty,\n): string | undefined {\n if (spec.empty) return spec.empty;\n const description = typeof arraySchema.description === \"string\" ? arraySchema.description.trim() : \"\";\n return description || undefined;\n}\n\nexport function noItemsLabel(spec: ArrayItemSpec): string {\n return `No ${spec.nounPlural ?? \"items\"} yet`;\n}\n\n// summaryPart renders one part, substituting the value into a single literal\n// `{}` in the pattern. A pattern without `{}` renders as-is (it is a literal),\n// and a missing value drops the part rather than leaving a dangling separator.\nfunction summaryPart(\n obj: Record<string, unknown>,\n part: string | ArrayItemSummaryPart,\n): string | undefined {\n const { property, pattern } = typeof part === \"string\" ? { property: part, pattern: undefined } : part;\n const value = text(obj[property]);\n if (!value) return undefined;\n return pattern ? pattern.replace(\"{}\", value) : value;\n}\n\n// enumLabel prefers the human label the schema declares for a code, falling back\n// to the code itself. Unlike the combobox option list this does NOT render\n// \"Label (code)\" — a chip has room for one of the two, and the label is the one\n// worth reading.\nfunction enumLabel(prop: JsonSchemaProperty | undefined, value: string): string {\n const label = prop?.[\"x-enum-labels\"]?.[value];\n return typeof label === \"string\" && label ? label : value;\n}\n\n// text flattens a value to its display string. Arrays join, so a list-valued\n// property still reads as one line.\nfunction text(value: unknown): string {\n if (value === undefined || value === null) return \"\";\n if (Array.isArray(value)) return value.map(text).filter(Boolean).join(VALUE_SEPARATOR);\n if (typeof value === \"object\") return \"\";\n return String(value).trim();\n}\n\nfunction stringArray(value: unknown): string[] {\n if (typeof value === \"string\") return [value];\n if (!Array.isArray(value)) return [];\n return value.filter((v): v is string => typeof v === \"string\" && !!v);\n}\n\nfunction summaryParts(value: unknown): Array<string | ArrayItemSummaryPart> {\n if (!Array.isArray(value)) return [];\n return (value as unknown[]).flatMap((part): Array<string | ArrayItemSummaryPart> => {\n if (typeof part === \"string\" && part) return [part];\n if (isPlainObject(part) && typeof part.property === \"string\" && part.property) {\n return [\n {\n property: part.property,\n ...(typeof part.pattern === \"string\" && part.pattern ? { pattern: part.pattern } : {}),\n } satisfies ArrayItemSummaryPart,\n ];\n }\n return [];\n });\n}\n\nfunction firstNonEmpty(values: Array<string | undefined>): string | undefined {\n for (const value of values) {\n const trimmed = typeof value === \"string\" ? value.trim() : \"\";\n if (trimmed) return trimmed;\n }\n return undefined;\n}\n"],"names":[],"mappings":";;;AAcA,MAAM,qBAAqB,CAAC,SAAS,QAAQ,SAAS,MAAM,KAAK;AAEjE,MAAM,oBAAoB;AAC1B,MAAM,kBAAkB;AAMjB,SAAS,gBACd,aACA,YACe;AACf,QAAM,MAAM,cAAc,YAAY,QAAQ,CAAC,IAC1C,YAAY,QAAQ,IACrB,CAAA;AACJ,QAAM,QAAQ,YAAY,IAAI,KAAK;AACnC,QAAM,UAAU,aAAa,IAAI,OAAO;AACxC,QAAM,QAAQ,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ,aAAa,UAAU;AACjF,SAAO;AAAA,IACL,OAAO,MAAM,SAAS,IAAI,QAAQ;AAAA,IAClC,GAAI,OAAO,IAAI,aAAa,YAAY,IAAI,WAAW,EAAE,UAAU,IAAI,SAAA,IAAa,CAAA;AAAA,IACpF,GAAI,QAAQ,SAAS,IAAI,EAAE,QAAA,IAAY,CAAA;AAAA,IACvC,GAAI,QAAQ,EAAE,MAAA,IAAU,CAAA;AAAA,IACxB,GAAI,OAAO,IAAI,UAAU,YAAY,IAAI,QAAQ,EAAE,OAAO,IAAI,MAAA,IAAU,CAAA;AAAA,IACxE,GAAI,OAAO,IAAI,SAAS,YAAY,IAAI,OAAO,EAAE,MAAM,IAAI,KAAA,IAAS,CAAA;AAAA;AAAA;AAAA;AAAA,IAIpE,GAAI,MAAM,QAAQ,IAAI,OAAO,IAAI,EAAE,SAAS,YAAY,IAAI,OAAO,EAAA,IAAM,CAAA;AAAA,IACzE,MAAM,cAAc,CAAC,IAAI,MAAM,yCAAY,KAAK,CAAC,KAAK;AAAA,IACtD,YAAY,cAAc,CAAC,IAAI,YAAY,YAAY,KAAK,CAAC,KAAK;AAAA,IAClE,GAAI,OAAO,IAAI,UAAU,YAAY,IAAI,QAAQ,EAAE,OAAO,IAAI,UAAU,CAAA;AAAA,EAAC;AAE7E;AAEA,MAAM,eAAkC,CAAC,WAAW,aAAa,QAAQ;AAEzE,SAAS,YAAY,OAAqC;AACxD,SAAO,MAAM;AAAA,IAAO,CAAC,UACnB,aAAa,SAAS,KAAwB;AAAA,EAAA;AAElD;AAIO,SAAS,iBAAiB,MAAqB,QAAkC;AACtF,SAAO,KAAK,UAAU,KAAK,QAAQ,SAAS,MAAM,IAAI;AACxD;AAKA,SAAS,eACP,YACA,OACoC;AACpC,SAAO,aAAa,oBAAoB,YAAgC,KAAK,EAAE,aAAa,CAAA;AAC9F;AAOA,SAAS,aAAa,YAAgE;AACpF,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,eAAe,YAAY,CAAA,CAAE,CAAC,GAAG;AACxE,UAAM,QAAQ,KAAK,cAAc;AACjC,QAAI,MAAM,QAAQ,KAAK,IAAI,KAAK,SAAS,OAAO,KAAK,KAAK,EAAE,SAAS,EAAG,QAAO;AAAA,EACjF;AACA,SAAO;AACT;AAKO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKqB;;AACnB,QAAM,MAAM,cAAc,IAAI,IAAI,OAAO,CAAA;AAGzC,QAAM,QAAQ,eAAe,YAAY,GAAG;AAE5C,QAAM,QACJ;AAAA,KACG,KAAK,SAAS,oBAAoB,IAAI,CAAC,QAAQ;AAC9C,YAAM,QAAQ,KAAK,IAAI,GAAG,CAAC;AAC3B,aAAO,SAAS,UAAU,MAAM,GAAG,GAAG,KAAK;AAAA,IAC7C,CAAC;AAAA,EAAA,KAEH,KAAK,YACL,QAAQ,QAAQ,CAAC;AAEnB,QAAM,WAAW,KAAK,WAAW,CAAA,GAC9B,IAAI,CAAC,SAAS,YAAY,KAAK,IAAI,CAAC,EACpC,OAAO,CAAC,MAAmB,CAAC,CAAC,CAAC,EAC9B,KAAK,iBAAiB;AAEzB,QAAM,aAAa,KAAK,QAAQ,KAAK,IAAI,KAAK,KAAK,CAAC,IAAI;AACxD,QAAM,YAAY,KAAK,QAAQ,MAAM,KAAK,KAAK,IAAI;AACnD,QAAM,aAAa,KAAK,QAAQ,KAAK,IAAI,KAAK,KAAK,CAAC,IAAI;AACxD,QAAM,YAAY,KAAK,QAAQ,MAAM,KAAK,KAAK,IAAI;AACnD,QAAM,aAAY,4CAAY,oBAAZ,mBAA8B;AAEhD,SAAO;AAAA,IACL;AAAA,IACA,GAAI,UAAU,EAAE,QAAA,IAAY,CAAA;AAAA,IAC5B,GAAI,KAAK,QACL;AAAA,MACE,OAAO;AAAA,QACL,KAAI,4CAAY,oBAAZ,mBAA8B,eAC9B,EAAE,MAAM,UAAU,cAAc,EAAE,UAAU,EAAA,IAC5C,CAAA;AAAA,QACJ,MAAM,eAAc,4CAAY,oBAAZ,mBAA8B,WAAW;AAAA,QAC7D,GAAI,aAAa,EAAE,OAAO,UAAU,WAAW,UAAU,MAAM,CAAA;AAAA,MAAC;AAAA,IAClE,IAEF,CAAA;AAAA,IACJ,GAAI,aACA;AAAA,MACE,OAAO;AAAA,QACL,GAAI,YAAY,EAAE,MAAM,UAAA,IAAc,CAAA;AAAA,QACtC,OAAO,UAAU,WAAW,UAAU;AAAA,MAAA;AAAA,IACxC,IAEF,CAAA;AAAA,IACJ,GAAI,KAAK,QAAQ,IAAI,KAAK,IAAI,MAAM,OAAO,EAAE,SAAS,SAAS,CAAA;AAAA,EAAC;AAEpE;AAIO,SAAS,aAAa,MAA6B;AACxD,SAAO,OAAO,KAAK,QAAQ,MAAM;AACnC;AAEO,SAAS,eAAe,MAAqB,OAAuB;AACzE,SAAO,UAAU,IACb,KAAK,KAAK,QAAQ,MAAM,KACxB,GAAG,KAAK,IAAI,KAAK,cAAc,OAAO;AAC5C;AAIO,SAAS,eACd,MACA,aACoB;AACpB,MAAI,KAAK,MAAO,QAAO,KAAK;AAC5B,QAAM,cAAc,OAAO,YAAY,gBAAgB,WAAW,YAAY,YAAY,SAAS;AACnG,SAAO,eAAe;AACxB;AAEO,SAAS,aAAa,MAA6B;AACxD,SAAO,MAAM,KAAK,cAAc,OAAO;AACzC;AAKA,SAAS,YACP,KACA,MACoB;AACpB,QAAM,EAAE,UAAU,QAAA,IAAY,OAAO,SAAS,WAAW,EAAE,UAAU,MAAM,SAAS,OAAA,IAAc;AAClG,QAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AAChC,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,UAAU,QAAQ,QAAQ,MAAM,KAAK,IAAI;AAClD;AAMA,SAAS,UAAU,MAAsC,OAAuB;;AAC9E,QAAM,SAAQ,kCAAO,qBAAP,mBAA0B;AACxC,SAAO,OAAO,UAAU,YAAY,QAAQ,QAAQ;AACtD;AAIA,SAAS,KAAK,OAAwB;AACpC,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,eAAe;AACrF,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO,OAAO,KAAK,EAAE,KAAA;AACvB;AAEA,SAAS,YAAY,OAA0B;AAC7C,MAAI,OAAO,UAAU,SAAU,QAAO,CAAC,KAAK;AAC5C,MAAI,CAAC,MAAM,QAAQ,KAAK,UAAU,CAAA;AAClC,SAAO,MAAM,OAAO,CAAC,MAAmB,OAAO,MAAM,YAAY,CAAC,CAAC,CAAC;AACtE;AAEA,SAAS,aAAa,OAAsD;AAC1E,MAAI,CAAC,MAAM,QAAQ,KAAK,UAAU,CAAA;AAClC,SAAQ,MAAoB,QAAQ,CAAC,SAA+C;AAClF,QAAI,OAAO,SAAS,YAAY,KAAM,QAAO,CAAC,IAAI;AAClD,QAAI,cAAc,IAAI,KAAK,OAAO,KAAK,aAAa,YAAY,KAAK,UAAU;AAC7E,aAAO;AAAA,QACL;AAAA,UACE,UAAU,KAAK;AAAA,UACf,GAAI,OAAO,KAAK,YAAY,YAAY,KAAK,UAAU,EAAE,SAAS,KAAK,YAAY,CAAA;AAAA,QAAC;AAAA,MACtF;AAAA,IAEJ;AACA,WAAO,CAAA;AAAA,EACT,CAAC;AACH;AAEA,SAAS,cAAc,QAAuD;AAC5E,aAAW,SAAS,QAAQ;AAC1B,UAAM,UAAU,OAAO,UAAU,WAAW,MAAM,SAAS;AAC3D,QAAI,QAAS,QAAO;AAAA,EACtB;AACA,SAAO;AACT;"}
@@ -17,6 +17,7 @@ function CodeBlock({
17
17
  highlightedHtml,
18
18
  className,
19
19
  jsonDefaultOpenDepth = 2,
20
+ jsonFormat = "json",
20
21
  bare = false,
21
22
  copyable = false,
22
23
  downloadable = false,
@@ -98,7 +99,7 @@ function CodeBlock({
98
99
  );
99
100
  }
100
101
  if (parsedJson !== JSON_PARSE_FAILED) {
101
- const tree = /* @__PURE__ */ jsxRuntime.jsx(JsonView.JsonView, { data: parsedJson, defaultOpenDepth: jsonDefaultOpenDepth });
102
+ const tree = /* @__PURE__ */ jsxRuntime.jsx(JsonView.JsonView, { data: parsedJson, format: jsonFormat, defaultOpenDepth: jsonDefaultOpenDepth });
102
103
  if (bare) return /* @__PURE__ */ jsxRuntime.jsx("div", { className: utils.cn("overflow-auto text-xs", className), children: tree });
103
104
  return /* @__PURE__ */ jsxRuntime.jsxs(
104
105
  "div",
@@ -106,7 +107,7 @@ function CodeBlock({
106
107
  className: utils.cn("overflow-hidden rounded-md border border-border bg-muted/40", className),
107
108
  ...overrideAttrs,
108
109
  children: [
109
- /* @__PURE__ */ jsxRuntime.jsx(CodeBlockHeader, { label: "json", actions: headerActions }),
110
+ /* @__PURE__ */ jsxRuntime.jsx(CodeBlockHeader, { label: jsonFormat, actions: headerActions }),
110
111
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-auto p-3 text-xs", children: tree })
111
112
  ]
112
113
  }