@jxsuite/studio 10.4.0 → 10.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. package/data/locales/en/elements.json +434 -0
  2. package/data/webdata.json +116 -139
  3. package/dist/chunks/2020-rqm7qrje.js +4 -0
  4. package/dist/chunks/adapter-cyy8vbcx.js +4 -0
  5. package/dist/chunks/add-new-flow-8cgtejv2.js +4 -0
  6. package/dist/chunks/{cf-account-picker-xb8vvt2h.js → cf-account-picker-v3qd2dhw.js} +3 -3
  7. package/dist/chunks/cf-settings-1fnw874z.js +4 -0
  8. package/dist/chunks/{color-area-h8dbasp1.js → color-area-frd9y9q6.js} +2 -2
  9. package/dist/chunks/color-field-rebpbe33.js +4 -0
  10. package/dist/chunks/{color-slider-nz2mrzky.js → color-slider-6bzmk3s7.js} +2 -2
  11. package/dist/chunks/color-t2bnnj8y.js +4 -0
  12. package/dist/chunks/{combobox-6hs00996.js → combobox-c49x7gf1.js} +3 -3
  13. package/dist/chunks/components-y8yhdd7d.js +4 -0
  14. package/dist/chunks/content-source-9e7qvmsf.js +4 -0
  15. package/dist/chunks/convert-to-repeater-pd2w4z21.js +4 -0
  16. package/dist/chunks/editor-mb9jzdrw.js +4 -0
  17. package/dist/chunks/entry-commands-at0wnx3f.js +4 -0
  18. package/dist/chunks/extension-sections-4z9qq0gh.js +4 -0
  19. package/dist/chunks/file-ops-dtdvjmza.js +4 -0
  20. package/dist/chunks/files-8pf70854.js +4 -0
  21. package/dist/chunks/format-host-fd3m2y2a.js +4 -0
  22. package/dist/chunks/fs-events-hrk29vcv.js +4 -0
  23. package/dist/chunks/grid-open-bh74v82z.js +4 -0
  24. package/dist/chunks/{grid-view-2f03wcgw.js → grid-view-a51mgzmq.js} +17 -17
  25. package/dist/chunks/{icons-gb967qc8.js → icons-qp8fn1k8.js} +2 -2
  26. package/dist/chunks/{iframe-entry-btck0e9s.js → iframe-entry-mpwe5pwk.js} +4 -4
  27. package/dist/chunks/{iframe-entry-2x9bn5ng.js → iframe-entry-msd43x9h.js} +4 -4
  28. package/dist/chunks/iframe-entry-rt8jz5t8.js +5 -0
  29. package/dist/chunks/{iframe-entry-b5qgggyp.js → iframe-entry-v40cr813.js} +4 -4
  30. package/dist/chunks/iframe-host-q0s0wwy3.js +4 -0
  31. package/dist/chunks/{image-bake-4afr4y6a.js → image-bake-q9ajdjsj.js} +3 -3
  32. package/dist/chunks/{image-editor-x7t8jbjn.js → image-editor-ke9std9b.js} +3 -3
  33. package/dist/chunks/index-57ang7ma.js +4 -0
  34. package/dist/chunks/index-eytr7av4.js +17 -0
  35. package/dist/chunks/{index-yjrfeks8.js → index-x495reff.js} +3 -3
  36. package/dist/chunks/{javascript-hy2mws8v.js → javascript-qe34bvaz.js} +3 -3
  37. package/dist/chunks/jsonMode-m8rseh31.js +13 -0
  38. package/dist/chunks/jx-validate-bbd1mary.js +4 -0
  39. package/dist/chunks/layers-panel-wcjtdqsa.js +4 -0
  40. package/dist/chunks/layers-yscpys6q.js +4 -0
  41. package/dist/chunks/{listbox-7gka1h86.js → listbox-tktzq5xj.js} +2 -2
  42. package/dist/chunks/lit-html-qm5wbhqz.js +4 -0
  43. package/dist/chunks/media-library-2hfff88g.js +4 -0
  44. package/dist/chunks/media-open-4pb05cne.js +4 -0
  45. package/dist/chunks/media-picker-bzktmmwr.js +4 -0
  46. package/dist/chunks/menu-xc3cbgsd.js +4 -0
  47. package/dist/chunks/{monaco-binding-a51py33c.js → monaco-binding-7t38arh9.js} +3 -3
  48. package/dist/chunks/monaco-buffer-3vz94c9f.js +4 -0
  49. package/dist/chunks/monaco-setup-fstdew02.js +4 -0
  50. package/dist/chunks/notify-gbdcckrh.js +4 -0
  51. package/dist/chunks/parse-fpdzgk4c.js +4 -0
  52. package/dist/chunks/platform-9g72gdqr.js +4 -0
  53. package/dist/chunks/popover-cnmsav6b.js +4 -0
  54. package/dist/chunks/publish-panel-91x1cb5d.js +4 -0
  55. package/dist/chunks/publish-quick-e2dmf7eg.js +4 -0
  56. package/dist/chunks/publish-workspace-1x8mnzrj.js +4 -0
  57. package/dist/chunks/quick-search-2m4y6p1x.js +4 -0
  58. package/dist/chunks/references-yg1g9rwx.js +4 -0
  59. package/dist/chunks/right-panel-7mfyhzrk.js +4 -0
  60. package/dist/chunks/source-control-rrc4jgp5.js +4 -0
  61. package/dist/chunks/{split-m5rwn31z.js → split-d15yencd.js} +2 -2
  62. package/dist/chunks/studio-0jhhznxy.js +9 -0
  63. package/dist/chunks/studio-0nb57pjg.js +7 -0
  64. package/dist/chunks/{studio-s24mhq0z.js → studio-0wa4wv4s.js} +4 -4
  65. package/dist/chunks/studio-0z8kp4xk.js +5 -0
  66. package/dist/chunks/{studio-g0hxtcga.js → studio-18gc5t3v.js} +4 -4
  67. package/dist/chunks/{studio-4fnb5648.js → studio-1b79rpcb.js} +4 -4
  68. package/dist/chunks/studio-211q5j7m.js +4 -0
  69. package/dist/chunks/studio-213pyfxh.js +16 -0
  70. package/dist/chunks/studio-2b1smjvp.js +5 -0
  71. package/dist/chunks/{studio-nwf0c32p.js → studio-2v6tc9jp.js} +4 -4
  72. package/dist/chunks/studio-30j0wz99.js +5 -0
  73. package/dist/chunks/studio-3kmqhwtt.js +5 -0
  74. package/dist/chunks/studio-44drsmhw.js +5 -0
  75. package/dist/chunks/{studio-2pk7kc7z.js → studio-495b6f2r.js} +4 -4
  76. package/dist/chunks/{studio-jma2q8r9.js → studio-4gthb2fd.js} +4 -4
  77. package/dist/chunks/{studio-0gvvqj3h.js → studio-4xadhxj1.js} +4 -4
  78. package/dist/chunks/{studio-nvcn2ykc.js → studio-52mzbxqm.js} +4 -4
  79. package/dist/chunks/{studio-v7a7yb5w.js → studio-56mmnsw8.js} +7 -7
  80. package/dist/chunks/studio-59hz8f4r.js +5 -0
  81. package/dist/chunks/{studio-sce30r7b.js → studio-5k9mfafh.js} +3 -3
  82. package/dist/chunks/{studio-rr00ex23.js → studio-5qez462c.js} +6 -6
  83. package/dist/chunks/studio-6tnpg0vx.js +5 -0
  84. package/dist/chunks/studio-6w8mt734.js +6 -0
  85. package/dist/chunks/studio-7hm04x5z.js +5 -0
  86. package/dist/chunks/studio-8atmfjjm.js +7 -0
  87. package/dist/chunks/{studio-wmjmsw0p.js → studio-8n99z71s.js} +4 -4
  88. package/dist/chunks/studio-8vmad6x2.js +5 -0
  89. package/dist/chunks/studio-93p5k4r4.js +5 -0
  90. package/dist/chunks/{studio-2x972v58.js → studio-9gb0m81w.js} +4 -4
  91. package/dist/chunks/studio-a4ymg4vd.js +5 -0
  92. package/dist/chunks/studio-anc8067x.js +5 -0
  93. package/dist/chunks/{studio-2e4hry72.js → studio-dbdt67kr.js} +5 -5
  94. package/dist/chunks/studio-dbex091t.js +5 -0
  95. package/dist/chunks/{studio-amaz545p.js → studio-dj8ctxey.js} +4 -4
  96. package/dist/chunks/{studio-k2evngrj.js → studio-ed9bz68j.js} +5 -5
  97. package/dist/chunks/{studio-4bgvvzhv.js → studio-fe2d1fp5.js} +4 -4
  98. package/dist/chunks/{studio-45mj4jqe.js → studio-fgp4cyy3.js} +4 -4
  99. package/dist/chunks/studio-ft706q02.js +5 -0
  100. package/dist/chunks/studio-g79s1dyg.js +6 -0
  101. package/dist/chunks/{studio-pj216fmn.js → studio-gahswxp4.js} +4 -4
  102. package/dist/chunks/studio-gbqc12bk.js +5 -0
  103. package/dist/chunks/studio-gxphbetb.js +6 -0
  104. package/dist/chunks/studio-hdf01j7q.js +7 -0
  105. package/dist/chunks/studio-hf259xzd.js +48 -0
  106. package/dist/chunks/studio-jbva4wxw.js +5 -0
  107. package/dist/chunks/studio-jj9gf1qc.js +5 -0
  108. package/dist/chunks/studio-jsjg3mjv.js +5 -0
  109. package/dist/chunks/studio-jtvb8hd7.js +5 -0
  110. package/dist/chunks/{studio-g9brbewz.js → studio-kp4vzrct.js} +4 -4
  111. package/dist/chunks/studio-kpx02gaa.js +7 -0
  112. package/dist/chunks/{studio-3na1r48j.js → studio-kv1728ex.js} +8 -8
  113. package/dist/chunks/studio-m25ry0mf.js +5 -0
  114. package/dist/chunks/studio-mcbwmkyh.js +5 -0
  115. package/dist/chunks/studio-meajkr51.js +5 -0
  116. package/dist/chunks/studio-mkjrjpr2.js +6 -0
  117. package/dist/chunks/{studio-eqcddvc2.js → studio-mr084886.js} +201 -201
  118. package/dist/chunks/studio-mrb10hv3.js +5 -0
  119. package/dist/chunks/{studio-0939t1q1.js → studio-nhpg405j.js} +4 -4
  120. package/dist/chunks/studio-nsec0hxm.js +64 -0
  121. package/dist/chunks/{studio-xx3r3sb0.js → studio-nv0mh0p5.js} +4 -4
  122. package/dist/chunks/studio-pafmb06w.js +5 -0
  123. package/dist/chunks/{studio-pm17wdc4.js → studio-pgftd79b.js} +4 -4
  124. package/dist/chunks/{studio-4zd6an2b.js → studio-pk961xgz.js} +4 -4
  125. package/dist/chunks/studio-pzbr7g05.js +5 -0
  126. package/dist/chunks/studio-qcc5hsw2.js +10 -0
  127. package/dist/chunks/studio-qfq58c8n.js +5 -0
  128. package/dist/chunks/studio-qvb2jr83.js +5 -0
  129. package/dist/chunks/studio-r85zw6ay.js +5 -0
  130. package/dist/chunks/studio-s0kwce5w.js +9 -0
  131. package/dist/chunks/studio-s6ymkf3q.js +14 -0
  132. package/dist/chunks/{studio-0x6f3nk9.js → studio-s7p5ccxa.js} +4 -4
  133. package/dist/chunks/{studio-1410q5dw.js → studio-s9jjap3x.js} +4 -4
  134. package/dist/chunks/{studio-evq47j2z.js → studio-t5hde1ws.js} +4 -4
  135. package/dist/chunks/studio-vj9yv897.js +5 -0
  136. package/dist/chunks/studio-wmak8xjw.js +5 -0
  137. package/dist/chunks/{studio-bnc50f9h.js → studio-wqsmvtqj.js} +4 -4
  138. package/dist/chunks/studio-x3z3rhej.js +5 -0
  139. package/dist/chunks/{studio-bg8pzprg.js → studio-xb55kpmy.js} +4 -4
  140. package/dist/chunks/studio-xxtdajmv.js +12 -0
  141. package/dist/chunks/studio-xxttcym1.js +5 -0
  142. package/dist/chunks/{studio-90zkgne5.js → studio-y2zsnzye.js} +7 -7
  143. package/dist/chunks/{studio-3qr08sxq.js → studio-y3tjh2xb.js} +3 -3
  144. package/dist/chunks/studio-y4f1rdsj.js +5 -0
  145. package/dist/chunks/studio-ybkd5w8k.js +5 -0
  146. package/dist/chunks/{studio-tpxcryf2.js → studio-yetr4gg1.js} +4 -4
  147. package/dist/chunks/studio-z295anhs.js +6 -0
  148. package/dist/chunks/studio-z89e6wpg.js +9 -0
  149. package/dist/chunks/{studio-5tet77de.js → studio-zbwr6prc.js} +3 -3
  150. package/dist/chunks/{studio-daksw8kh.js → studio-zdbsv5q2.js} +4 -4
  151. package/dist/chunks/{studio-abh9kfdh.js → studio-zvthj8hg.js} +4 -4
  152. package/dist/chunks/toast-2kn2vrn4.js +4 -0
  153. package/dist/chunks/{toast-host-g3r2s0kn.js → toast-host-3rxeyj3d.js} +3 -3
  154. package/dist/chunks/{tooltip-dj1pvgz7.js → tooltip-ghkxkasp.js} +3 -3
  155. package/dist/chunks/{tree-j0ebwr5s.js → tree-vw4nc63s.js} +2 -2
  156. package/dist/chunks/tsMode-7gngmamr.js +14 -0
  157. package/dist/chunks/workspace-gv0hxgsm.js +4 -0
  158. package/dist/chunks/workspace-home-j7e0mjy5.js +4 -0
  159. package/dist/chunks/{ws-client-arz2qsy9.js → ws-client-vs11sxc5.js} +3 -3
  160. package/dist/iframe-entry.js +14 -14
  161. package/dist/manifest.json +84 -83
  162. package/dist/studio.js +99 -98
  163. package/dist/workers/ts.worker.js +3 -3
  164. package/package.json +12 -12
  165. package/src/browse/library-layouts.ts +9 -12
  166. package/src/browse/library-pane.ts +22 -16
  167. package/src/browse/library-source.ts +3 -4
  168. package/src/browse/preview-style.ts +2 -1
  169. package/src/canvas/canvas-live-render.ts +2 -5
  170. package/src/canvas/canvas-page-context.ts +5 -0
  171. package/src/canvas/canvas-render.ts +6 -1
  172. package/src/canvas/iframe-drop.ts +84 -1
  173. package/src/canvas/iframe-entry.ts +9 -6
  174. package/src/canvas/iframe-render.ts +13 -0
  175. package/src/collab/collab-session.ts +2 -2
  176. package/src/commands/levels.ts +1 -1
  177. package/src/content/entry-commands.ts +32 -27
  178. package/src/content/entry-editor.ts +46 -44
  179. package/src/content/entry-inspector.ts +15 -12
  180. package/src/content/entry-model.ts +3 -3
  181. package/src/content/entry-summaries.ts +5 -5
  182. package/src/content/hold-state.ts +172 -0
  183. package/src/content/page-summaries.ts +10 -14
  184. package/src/create/add-new-flow.ts +2 -1
  185. package/src/editor/convert-targets.ts +2 -23
  186. package/src/editor/inline-edit.ts +6 -1
  187. package/src/editor/repeater-scope.ts +333 -74
  188. package/src/editor/slash-menu.ts +35 -17
  189. package/src/files/files.ts +18 -0
  190. package/src/format/format-choices.ts +5 -5
  191. package/src/format/format-host.ts +35 -3
  192. package/src/grid/redirects-grid.ts +4 -4
  193. package/src/grid/sources/content-source.ts +42 -66
  194. package/src/locale/element-names.ts +131 -0
  195. package/src/panels/block-action-bar.ts +3 -4
  196. package/src/panels/dnd.ts +3 -1
  197. package/src/panels/elements-panel.ts +93 -36
  198. package/src/panels/events-panel.ts +6 -2
  199. package/src/panels/formula-workspace.ts +9 -0
  200. package/src/panels/imports-panel.ts +3 -2
  201. package/src/panels/navigator-panels.ts +10 -10
  202. package/src/panels/panel-registry.ts +3 -3
  203. package/src/panels/properties-panel.ts +127 -35
  204. package/src/panels/site-panel.ts +2 -1
  205. package/src/panels/statement-editor.ts +4 -0
  206. package/src/panels/style-panel.ts +2 -1
  207. package/src/panels/styles-panel.ts +2 -2
  208. package/src/panels/tab-strip.ts +29 -26
  209. package/src/platforms/cloud.ts +5 -2
  210. package/src/services/ai-command-tools.ts +2 -1
  211. package/src/services/ai-project-tools.ts +21 -8
  212. package/src/services/ai-tools.ts +5 -5
  213. package/src/services/ai-write-report.ts +22 -4
  214. package/src/services/context-manager.ts +110 -2
  215. package/src/services/document-assistant.ts +2 -2
  216. package/src/services/harness/chat-reducer.ts +9 -4
  217. package/src/services/jxn-language.ts +110 -0
  218. package/src/services/model-uri.ts +3 -0
  219. package/src/services/monaco-setup.ts +6 -2
  220. package/src/services/render-critic.ts +234 -12
  221. package/src/services/tool-executor.ts +16 -8
  222. package/src/settings/contributed-section.ts +2 -1
  223. package/src/settings/extension-commands.ts +2 -1
  224. package/src/settings/general-settings.ts +2 -2
  225. package/src/settings/settings-document.ts +5 -5
  226. package/src/shell.ts +1 -1
  227. package/src/studio.ts +28 -11
  228. package/src/style/variables-view.ts +2 -2
  229. package/src/surfaces/collections-panel.json +1 -1
  230. package/src/surfaces/collections-panel.ts +1 -1
  231. package/src/surfaces/entry-editor.json +10 -10
  232. package/src/surfaces/entry-editor.ts +22 -19
  233. package/src/surfaces/entry-inspector.json +11 -11
  234. package/src/surfaces/entry-inspector.ts +17 -10
  235. package/src/surfaces/panel-elements.json +466 -206
  236. package/src/surfaces/panel-elements.ts +61 -25
  237. package/src/surfaces/tab-strip.json +5 -5
  238. package/src/surfaces/tab-strip.ts +2 -2
  239. package/src/tabs/project-config.ts +13 -13
  240. package/src/tabs/tab.ts +7 -2
  241. package/src/types.ts +13 -2
  242. package/src/ui/expression-editor.ts +10 -5
  243. package/src/ui/schema-form.ts +18 -1
  244. package/src/utils/edit-display.ts +27 -1
  245. package/src/view.ts +9 -2
  246. package/src/workspace/tab-workspace.ts +2 -2
  247. package/src/workspace/workspace-back.ts +2 -2
  248. package/dist/chunks/2020-906vx2dq.js +0 -4
  249. package/dist/chunks/adapter-hnvad61x.js +0 -4
  250. package/dist/chunks/add-new-flow-v0pm96mr.js +0 -4
  251. package/dist/chunks/cf-settings-mkbcz4z2.js +0 -4
  252. package/dist/chunks/color-04361ttk.js +0 -4
  253. package/dist/chunks/color-field-qv5r2b16.js +0 -4
  254. package/dist/chunks/components-w5zqwva1.js +0 -4
  255. package/dist/chunks/content-source-g38w0d3f.js +0 -4
  256. package/dist/chunks/convert-to-repeater-r8sfxjjm.js +0 -4
  257. package/dist/chunks/editor-wvf5e6j9.js +0 -4
  258. package/dist/chunks/entry-commands-t13dyw3c.js +0 -4
  259. package/dist/chunks/extension-sections-vjzw46xb.js +0 -4
  260. package/dist/chunks/file-ops-1sghzgcr.js +0 -4
  261. package/dist/chunks/files-zrqtgt41.js +0 -4
  262. package/dist/chunks/format-host-9gy76erh.js +0 -4
  263. package/dist/chunks/fs-events-45rhg3me.js +0 -4
  264. package/dist/chunks/grid-open-t4fq6bbm.js +0 -4
  265. package/dist/chunks/iframe-entry-42hpmwz5.js +0 -5
  266. package/dist/chunks/iframe-host-9aq8ze3q.js +0 -4
  267. package/dist/chunks/index-f9qr7kzh.js +0 -4
  268. package/dist/chunks/jsonMode-vj30te2h.js +0 -13
  269. package/dist/chunks/jx-validate-r4ax11e3.js +0 -4
  270. package/dist/chunks/layers-m49nmwvx.js +0 -4
  271. package/dist/chunks/layers-panel-zr92pwdp.js +0 -4
  272. package/dist/chunks/lit-html-k2mb9k0r.js +0 -4
  273. package/dist/chunks/media-library-j74rt0w4.js +0 -4
  274. package/dist/chunks/media-open-mypr0k6b.js +0 -4
  275. package/dist/chunks/media-picker-pemtbsjv.js +0 -4
  276. package/dist/chunks/menu-d2jxpgma.js +0 -4
  277. package/dist/chunks/monaco-buffer-pa0g6ax7.js +0 -4
  278. package/dist/chunks/monaco-setup-0hw9f835.js +0 -4
  279. package/dist/chunks/notify-bwehrp7q.js +0 -4
  280. package/dist/chunks/parse-hee7ne9b.js +0 -4
  281. package/dist/chunks/platform-kv0k65cy.js +0 -4
  282. package/dist/chunks/popover-9tf4cjrk.js +0 -4
  283. package/dist/chunks/publish-panel-vg1n880b.js +0 -4
  284. package/dist/chunks/publish-quick-4fwngwrw.js +0 -4
  285. package/dist/chunks/publish-workspace-jv4w2bx2.js +0 -4
  286. package/dist/chunks/quick-search-nh29rt8a.js +0 -4
  287. package/dist/chunks/references-vqyr5s9x.js +0 -4
  288. package/dist/chunks/right-panel-3ws9f2w0.js +0 -4
  289. package/dist/chunks/source-control-h3hcs5gy.js +0 -4
  290. package/dist/chunks/studio-0khd8xtx.js +0 -4
  291. package/dist/chunks/studio-1ctnw3xv.js +0 -5
  292. package/dist/chunks/studio-1ks5d9y4.js +0 -5
  293. package/dist/chunks/studio-1y9mab9m.js +0 -5
  294. package/dist/chunks/studio-2kpxm0eh.js +0 -7
  295. package/dist/chunks/studio-2zz4qbv9.js +0 -5
  296. package/dist/chunks/studio-3pz4t5a2.js +0 -5
  297. package/dist/chunks/studio-4f7thq0p.js +0 -5
  298. package/dist/chunks/studio-61rg2cz5.js +0 -5
  299. package/dist/chunks/studio-7rrdbvex.js +0 -5
  300. package/dist/chunks/studio-9c6cbq2c.js +0 -4
  301. package/dist/chunks/studio-9dq7rwc7.js +0 -5
  302. package/dist/chunks/studio-9gr7xs9r.js +0 -6
  303. package/dist/chunks/studio-a88ej93p.js +0 -7
  304. package/dist/chunks/studio-acer0g8w.js +0 -5
  305. package/dist/chunks/studio-az3wvyh2.js +0 -5
  306. package/dist/chunks/studio-brh8d2pr.js +0 -5
  307. package/dist/chunks/studio-c2fa783p.js +0 -9
  308. package/dist/chunks/studio-cfnn70h1.js +0 -5
  309. package/dist/chunks/studio-cqxj4fcy.js +0 -5
  310. package/dist/chunks/studio-cw11h078.js +0 -5
  311. package/dist/chunks/studio-dn56z7sn.js +0 -5
  312. package/dist/chunks/studio-egnjpyde.js +0 -9
  313. package/dist/chunks/studio-ejrypvmq.js +0 -5
  314. package/dist/chunks/studio-frc16j8v.js +0 -10
  315. package/dist/chunks/studio-gnazwtv3.js +0 -5
  316. package/dist/chunks/studio-hfqpfmpk.js +0 -5
  317. package/dist/chunks/studio-hh394phe.js +0 -5
  318. package/dist/chunks/studio-j0zf5x2x.js +0 -5
  319. package/dist/chunks/studio-j5fcp6gj.js +0 -5
  320. package/dist/chunks/studio-jd1qb1st.js +0 -7
  321. package/dist/chunks/studio-k0xzrse2.js +0 -64
  322. package/dist/chunks/studio-k1xqrgm5.js +0 -5
  323. package/dist/chunks/studio-k3we3kqb.js +0 -5
  324. package/dist/chunks/studio-knsjyx7n.js +0 -5
  325. package/dist/chunks/studio-mrjtnm62.js +0 -5
  326. package/dist/chunks/studio-n9qba0gx.js +0 -5
  327. package/dist/chunks/studio-nzemfbkk.js +0 -14
  328. package/dist/chunks/studio-pwctzka3.js +0 -16
  329. package/dist/chunks/studio-q80fg1d6.js +0 -12
  330. package/dist/chunks/studio-q9hx2qp0.js +0 -5
  331. package/dist/chunks/studio-qrzmfaf6.js +0 -5
  332. package/dist/chunks/studio-r6mx7vm5.js +0 -7
  333. package/dist/chunks/studio-swedpd82.js +0 -5
  334. package/dist/chunks/studio-tmfcn347.js +0 -6
  335. package/dist/chunks/studio-v5wktj6f.js +0 -5
  336. package/dist/chunks/studio-vpevkfxw.js +0 -5
  337. package/dist/chunks/studio-wqfaqw4m.js +0 -5
  338. package/dist/chunks/studio-xpx91fby.js +0 -6
  339. package/dist/chunks/studio-xva3hzkv.js +0 -5
  340. package/dist/chunks/studio-z3fztxrp.js +0 -9
  341. package/dist/chunks/studio-z9453ypn.js +0 -6
  342. package/dist/chunks/toast-w11qpkyz.js +0 -4
  343. package/dist/chunks/tsMode-jg1dtphj.js +0 -14
  344. package/dist/chunks/workspace-6ztqcrsh.js +0 -4
  345. package/dist/chunks/workspace-home-rse9h8a0.js +0 -4
  346. package/src/content/draft-state.ts +0 -108
@@ -2,11 +2,12 @@
2
2
  /**
3
3
  * The Insert surface: the Navigator's element palette, as a Jx document over the kit.
4
4
  *
5
- * This is the adapter. `panels/elements-panel.ts` keeps the panel — what the palette contains,
6
- * which npm components the open document has enabled, what the filter matches, and what a click
7
- * inserts where — and hands this module a projection with no decisions left in it: a section per
8
- * category that already knows whether it is open, a card per thing that can be inserted, and the
9
- * one of three empty states the palette is in.
5
+ * This is the adapter. `panels/elements-panel.ts` keeps the panel — what the palette contains, what
6
+ * each element is called, which npm components the open document has enabled, what the filter
7
+ * matches, and what a click inserts where — and hands this module a projection with no decisions
8
+ * left in it: the tab that is showing, a section per category that already knows whether it is
9
+ * open, a named card per thing that can be inserted, and the one of three empty states each tab is
10
+ * in.
10
11
  *
11
12
  * The flattening is here rather than in the document for the reason `surfaces/settings-overview.ts`
12
13
  * gives: `$switch` over a value is the only conditional a document has, and "is there anything to
@@ -36,13 +37,18 @@ import type { SurfaceHandle } from "../ui/surface";
36
37
 
37
38
  registerSurface("panel-elements", elementsDoc);
38
39
 
39
- /** One insertable HTML element: the tag is its identity, its caption and what a click inserts. */
40
+ /** One insertable HTML element: the tag is its identity and what a click inserts. */
40
41
  export interface ElementCardView {
41
42
  tag: string;
43
+ /** What the card is captioned, in the reader's language. */
44
+ name: string;
45
+ /** What the element is for, in one line: the card's tooltip. */
46
+ description: string;
42
47
  }
43
48
 
44
- /** One category of the palette — an accordion section, keyed and labelled by its name. */
49
+ /** One category of the palette: an accordion section, keyed by a stable id, labelled by name. */
45
50
  export interface ElementCategoryView {
51
+ key: string;
46
52
  name: string;
47
53
  open: boolean;
48
54
  elements: ElementCardView[];
@@ -54,32 +60,44 @@ export interface ComponentCardView {
54
60
  title: string;
55
61
  }
56
62
 
63
+ /** The palette's two tabs (§5.3). */
64
+ export type InsertTab = "elements" | "components";
65
+
57
66
  /**
58
- * Which body the palette is showing under its filter.
67
+ * Which body a tab is showing under the filter.
59
68
  *
60
- * `"filtered"` and `"empty"` are different answers rather than one with a flag: a palette nothing
61
- * matches offers to clear the filter, and a palette with nothing in it teaches what the region is
62
- * for, because there is no filter to clear.
69
+ * `"filtered"` and `"empty"` are different answers rather than one with a flag: a tab nothing
70
+ * matches offers to clear the filter, and a tab with nothing in it teaches what it is for, because
71
+ * there is no filter to clear.
63
72
  */
64
73
  export type ElementsEmptyState = "none" | "filtered" | "empty";
65
74
 
66
75
  /** What the panel says the surface should be showing right now. */
67
76
  export interface ElementsValues {
77
+ /** The tab that is showing. */
78
+ tab: InsertTab;
68
79
  /** What the filter field holds — the reader's own text, never a normalised form of it. */
69
80
  filter: string;
81
+ /** The filter's accessible name and placeholder, which says what it narrows. */
82
+ filterLabel: string;
70
83
  categories: ElementCategoryView[];
71
84
  components: ComponentCardView[];
72
- componentsOpen: boolean;
73
- hasComponents: boolean;
74
- emptyState: ElementsEmptyState;
85
+ elementsEmpty: ElementsEmptyState;
86
+ componentsEmpty: ElementsEmptyState;
87
+ /**
88
+ * The other tab's offer when the filter empties this one but not that one ("Show 2 matching
89
+ * components"), or `""`.
90
+ */
91
+ otherMatches: string;
75
92
  }
76
93
 
77
94
  /** What a control can ask the panel to do. Every one of them is a decision the panel owns. */
78
95
  export interface ElementsActions {
96
+ selectTab: (tab: string) => void;
97
+ showOtherTab: () => void;
79
98
  setFilter: (value: string) => void;
80
99
  clearFilter: () => void;
81
- setSectionOpen: (name: string, open: boolean) => void;
82
- setComponentsOpen: (open: boolean) => void;
100
+ setSectionOpen: (key: string, open: boolean) => void;
83
101
  insertElement: (tag: string) => void;
84
102
  insertComponent: (tagName: string) => void;
85
103
  }
@@ -101,17 +119,29 @@ export interface ElementsSurfaceHandle {
101
119
  dispose: () => void;
102
120
  }
103
121
 
104
- /** The scope the document reads: {@link ElementsValues} plus the actions its controls call. */
105
- interface ElementsScope extends ElementsValues, ElementsActions {}
122
+ /**
123
+ * The scope the document reads: {@link ElementsValues}, the flags a `$switch` and a tab panel's
124
+ * `active` need as their own values, and the actions its controls call.
125
+ */
126
+ interface ElementsScope extends ElementsValues, ElementsActions {
127
+ elementsShowing: boolean;
128
+ componentsShowing: boolean;
129
+ hasOtherMatches: boolean;
130
+ }
106
131
 
107
132
  /** Write a projection into the scope. */
108
133
  function project(scope: ElementsScope, values: ElementsValues): void {
134
+ scope.tab = values.tab;
135
+ scope.elementsShowing = values.tab === "elements";
136
+ scope.componentsShowing = values.tab === "components";
109
137
  scope.filter = values.filter;
138
+ scope.filterLabel = values.filterLabel;
110
139
  scope.categories = values.categories;
111
140
  scope.components = values.components;
112
- scope.componentsOpen = values.componentsOpen;
113
- scope.hasComponents = values.hasComponents;
114
- scope.emptyState = values.emptyState;
141
+ scope.elementsEmpty = values.elementsEmpty;
142
+ scope.componentsEmpty = values.componentsEmpty;
143
+ scope.otherMatches = values.otherMatches;
144
+ scope.hasOtherMatches = values.otherMatches !== "";
115
145
  }
116
146
 
117
147
  /**
@@ -131,15 +161,21 @@ export function mountElementsSurface(
131
161
  categories: [],
132
162
  clearFilter: actions.clearFilter,
133
163
  components: [],
134
- componentsOpen: true,
135
- emptyState: "none",
164
+ componentsEmpty: "none",
165
+ componentsShowing: false,
166
+ elementsEmpty: "none",
167
+ elementsShowing: true,
136
168
  filter: "",
137
- hasComponents: false,
169
+ filterLabel: "",
170
+ hasOtherMatches: false,
138
171
  insertComponent: actions.insertComponent,
139
172
  insertElement: actions.insertElement,
140
- setComponentsOpen: actions.setComponentsOpen,
173
+ otherMatches: "",
174
+ selectTab: actions.selectTab,
141
175
  setFilter: actions.setFilter,
142
176
  setSectionOpen: actions.setSectionOpen,
177
+ showOtherTab: actions.showOtherTab,
178
+ tab: "elements",
143
179
  });
144
180
  project(scope, values);
145
181
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://jxsuite.com/schema/v1",
3
3
  "$id": "StudioTabStrip",
4
- "$description": "One pane's tab strip, as a Jx document over the kit: a real `tablist` of `jx-tab`s, or — for a pane that owns no document — the derivation chip naming what it is a projection of, and in both cases one trailing button. `panels/tab-strip.ts` keeps every decision: which pane a host is drawing, what each tab is called (the shortest unique suffix, and a page's ROUTE), what its tooltip says, whether closing it needs a prompt, what the overflow chevron lists and what the context menu offers. This document owns the markup, the ARIA, the keyboard and the style, and it holds THREE things the old chip drew by hand and the kit now draws: the tab's own selected state (`aria-selected`, not an `.active` class), its close button, and its dirty dot. The three that are Studio's alone go in `jx-tab`'s slots — the drill-in marker in `icon`, the draft pill in `status`, the pin toggle in `actions` (ui.md §5.4) — which is the gap that kept this strip out of the tab pattern until now. **Drag is `@atlaskit/pragmatic-drag-and-drop`, not native HTML5 DnD**: a chip carries no `draggable` attribute and no `ondrag*` handler, because `panels/tab-strip.ts` registers every chip and every strip as a pragmatic source/target through `onNodeCreated` and resolves a completed drag in `panels/tab-drop.ts`. What is left here is three SCOPE comparisons, exactly as `files-panel.json` marks a row under drag: `data-dragging` on the chip being carried, `data-drop` on the chip a drop would land beside, `data-drop-tail` on the strip when the drop is its empty tail.",
4
+ "$description": "One pane's tab strip, as a Jx document over the kit: a real `tablist` of `jx-tab`s, or — for a pane that owns no document — the derivation chip naming what it is a projection of, and in both cases one trailing button. `panels/tab-strip.ts` keeps every decision: which pane a host is drawing, what each tab is called (the shortest unique suffix, and a page's ROUTE), what its tooltip says, whether closing it needs a prompt, what the overflow chevron lists and what the context menu offers. This document owns the markup, the ARIA, the keyboard and the style, and it holds THREE things the old chip drew by hand and the kit now draws: the tab's own selected state (`aria-selected`, not an `.active` class), its close button, and its dirty dot. The three that are Studio's alone go in `jx-tab`'s slots — the drill-in marker in `icon`, the hold pill in `status`, the pin toggle in `actions` (ui.md §5.4) — which is the gap that kept this strip out of the tab pattern until now. **Drag is `@atlaskit/pragmatic-drag-and-drop`, not native HTML5 DnD**: a chip carries no `draggable` attribute and no `ondrag*` handler, because `panels/tab-strip.ts` registers every chip and every strip as a pragmatic source/target through `onNodeCreated` and resolves a completed drag in `panels/tab-drop.ts`. What is left here is three SCOPE comparisons, exactly as `files-panel.json` marks a row under drag: `data-dragging` on the chip being carried, `data-drop` on the chip a drop would land beside, `data-drop-tail` on the strip when the drop is its empty tail.",
5
5
  "tagName": "div",
6
6
  "attributes": {
7
7
  "part": "strip-row",
@@ -101,7 +101,7 @@
101
101
  "lineHeight": "1"
102
102
  },
103
103
  "& [part=\"pill\"]": {
104
- "$description": "`.entry-pill` — the draft pill (site-architecture.md §7.6), in `jx-tab`'s status slot. It is ON THE CHIP and not only inside the entry editor because the mistake it prevents, publishing something you believed was private, is made while glancing at a row of tabs. \"Published\" is deliberately as visible as \"Draft\": a state you can only see one half of is a state you cannot check. The two Spectrum colours it used to name are `--jx-signal` against `--jx-bg`, which flips with the theme where a fixed yellow and a fixed black did not.",
104
+ "$description": "`.entry-pill` — the hold pill (site-architecture.md §7.6), in `jx-tab`'s status slot. It is ON THE CHIP and not only inside the entry editor because the mistake it prevents, publishing something you believed was private, is made while glancing at a row of tabs. \"Published\" is deliberately as visible as \"Draft\": a state you can only see one half of is a state you cannot check. The two Spectrum colours it used to name are `--jx-signal` against `--jx-bg`, which flips with the theme where a fixed yellow and a fixed black did not.",
105
105
  "padding": "0 5px",
106
106
  "borderRadius": "var(--radius)",
107
107
  "background": "var(--bg)",
@@ -110,7 +110,7 @@
110
110
  "lineHeight": "15px",
111
111
  "whiteSpace": "nowrap"
112
112
  },
113
- "& [part=\"pill\"][data-draft]": {
113
+ "& [part=\"pill\"][data-held]": {
114
114
  "background": "var(--jx-signal)",
115
115
  "color": "var(--jx-bg)"
116
116
  },
@@ -322,13 +322,13 @@
322
322
  "textContent": "↳"
323
323
  },
324
324
  {
325
- "$description": "The draft pill. It is a `<span>` in the status slot rather than a mounted document of its own, which is what kept it a lit fragment inside `content/entry-editor.ts` until the strip converted: a document mounted per chip would be an async mount inside a synchronous rebuild. `entryDraftPill` states the two facts; this draws them.",
325
+ "$description": "The hold pill. It is a `<span>` in the status slot rather than a mounted document of its own, which is what kept it a lit fragment inside `content/entry-editor.ts` until the strip converted: a document mounted per chip would be an async mount inside a synchronous rebuild. `entryHoldPill` states the two facts; this draws them.",
326
326
  "tagName": "span",
327
327
  "attributes": {
328
328
  "slot": "status",
329
329
  "part": "pill",
330
330
  "title": "${$map.item.pillTitle}",
331
- "data-draft": "${$map.item.draft ? '' : null}",
331
+ "data-held": "${$map.item.held ? '' : null}",
332
332
  "hidden": "${$map.item.pill ? null : ''}"
333
333
  },
334
334
  "textContent": "${$map.item.pill}"
@@ -57,10 +57,10 @@ export interface TabChipView {
57
57
  /** "Pin" or "Unpin" — the pin button's whole accessible name. */
58
58
  pinTitle: string;
59
59
  pinGlyph: string;
60
- /** The draft pill's word, or the empty string when this document has no draft axis. */
60
+ /** The hold pill's word, or the empty string when this document's collection has no rules. */
61
61
  pill: string;
62
62
  pillTitle: string;
63
- draft: boolean;
63
+ held: boolean;
64
64
  /** "0" while this is the pane's current tab, "-1" otherwise. The pin's roving stop. */
65
65
  tabindex: string;
66
66
  /** This chip's slot in the pane's order, which is the drop target index. */
@@ -65,7 +65,7 @@ import { getPlatform } from "../platform";
65
65
  import { notify } from "../services/notify";
66
66
  import { projectState, requireProjectState, setProjectState } from "../state";
67
67
  import { setWorkspaceProject, workspace } from "../workspace/workspace";
68
- import { PROJECT_CONFIG_PATH, createTab, disposeTab } from "./tab";
68
+ import { projectConfigPath, createTab, disposeTab } from "./tab";
69
69
  import { transactDoc } from "./transact";
70
70
  import { deriveJsonLayout, parseJsonDocument, serializeJson } from "@jxsuite/schema/json-layout";
71
71
  import type { JsonLayout } from "@jxsuite/schema/json-layout";
@@ -73,7 +73,7 @@ import type { JsonLayout } from "@jxsuite/schema/json-layout";
73
73
  import type { Tab } from "./tab";
74
74
  import type { JxMutableNode, ProjectConfig } from "@jxsuite/schema/types";
75
75
 
76
- export { PROJECT_CONFIG_PATH } from "./tab";
76
+ export { isProjectConfigPath, projectConfigPath } from "./tab";
77
77
 
78
78
  /**
79
79
  * The project configuration, as a file.
@@ -146,7 +146,7 @@ let _seeding: Promise<void> | null = null;
146
146
  * structure in Studio uses (`collab-session.ts`'s `rawTab` for the same reason).
147
147
  */
148
148
  function openConfigTab(): Tab | null {
149
- const tab = workspace.tabs.get(PROJECT_CONFIG_PATH);
149
+ const tab = workspace.tabs.get(projectConfigPath());
150
150
  return tab ? toRaw(tab) : null;
151
151
  }
152
152
 
@@ -166,7 +166,7 @@ function unbind(): void {
166
166
  function seedCommitted(): Promise<void> {
167
167
  _seeding ??= (async () => {
168
168
  try {
169
- const text = await getPlatform().readFile(PROJECT_CONFIG_PATH);
169
+ const text = await getPlatform().readFile(projectConfigPath());
170
170
  const { document, layout } = parseJsonDocument(text);
171
171
  _layout = layout;
172
172
  // {@link serializeProjectConfig}'s serialisation, over the file's parse rather than a config.
@@ -332,8 +332,8 @@ export function projectConfigDocument(): Tab {
332
332
  }
333
333
  _detached = createTab({
334
334
  document: state.projectConfig ?? {},
335
- documentPath: PROJECT_CONFIG_PATH,
336
- id: PROJECT_CONFIG_PATH,
335
+ documentPath: projectConfigPath(),
336
+ id: projectConfigPath(),
337
337
  });
338
338
  return bind(_detached);
339
339
  }
@@ -409,11 +409,11 @@ export async function commitProjectConfig(
409
409
  never seen. Applying either one discards the other, so neither is applied: §16 files the
410
410
  write that cannot be applied, which is the one outcome silence is not allowed to be.
411
411
  `ai-project-tools.ts`'s `write_file` refuses a dirty tab on exactly these grounds. */
412
- const error = new Error(`${PROJECT_CONFIG_PATH} has unsaved changes in its editor tab`);
412
+ const error = new Error(`${projectConfigPath()} has unsaved changes in its editor tab`);
413
413
  notify.error(
414
- `Could not save ${PROJECT_CONFIG_PATH} — the file is open with unsaved changes. Save or ` +
414
+ `Could not save ${projectConfigPath()} — the file is open with unsaved changes. Save or ` +
415
415
  `revert that tab, then make the settings change again.`,
416
- { key: `save:${PROJECT_CONFIG_PATH}`, path: PROJECT_CONFIG_PATH, source: "Settings" },
416
+ { key: `save:${projectConfigPath()}`, path: projectConfigPath(), source: "Settings" },
417
417
  );
418
418
  return { error, ok: false };
419
419
  }
@@ -447,11 +447,11 @@ export async function commitProjectConfig(
447
447
  const config = configOf(tab.doc.document);
448
448
  const output = serializeProjectConfig(config);
449
449
  try {
450
- await getPlatform().writeFile(PROJECT_CONFIG_PATH, output);
450
+ await getPlatform().writeFile(projectConfigPath(), output);
451
451
  } catch (error) {
452
- notify.error(`Could not save ${PROJECT_CONFIG_PATH} — ${errorMessage(error)}`, {
453
- key: `save:${PROJECT_CONFIG_PATH}`,
454
- path: PROJECT_CONFIG_PATH,
452
+ notify.error(`Could not save ${projectConfigPath()} — ${errorMessage(error)}`, {
453
+ key: `save:${projectConfigPath()}`,
454
+ path: projectConfigPath(),
455
455
  source: "Settings",
456
456
  });
457
457
  return { error, ok: false };
package/src/tabs/tab.ts CHANGED
@@ -11,6 +11,7 @@ import type { EditorKind } from "../commands/context";
11
11
  import type { JsonObject, JxMutableNode } from "@jxsuite/schema/types";
12
12
  import type { JxDocOp, JxFmOp } from "./patch-ops";
13
13
  import type { JsonLayout } from "@jxsuite/schema/json-layout";
14
+ import { PROJECT_FILE_NAME, isProjectConfigPath } from "@jxsuite/schema/project-file";
14
15
 
15
16
  /**
16
17
  * The project's configuration file, project-relative.
@@ -20,7 +21,11 @@ import type { JsonLayout } from "@jxsuite/schema/json-layout";
20
21
  * Variables and Code views; editor kind `config`), and `tabs/project-config.ts` binds the tab at
21
22
  * this path as the configuration document.
22
23
  */
23
- export const PROJECT_CONFIG_PATH = "project.json";
24
+ export function projectConfigPath(): string {
25
+ return PROJECT_FILE_NAME;
26
+ }
27
+
28
+ export { isProjectConfigPath } from "@jxsuite/schema/project-file";
24
29
 
25
30
  export interface TabUi {
26
31
  /** The Inspector leaf showing (`shell.ts`'s `INSPECTOR_TAB_IDS`); Page on a fresh tab (§6). */
@@ -448,7 +453,7 @@ export function createTab({
448
453
  * @returns {string[]}
449
454
  */
450
455
  function inferModes(documentPath: string | null | undefined, sourceFormat: string | null) {
451
- if (documentPath === PROJECT_CONFIG_PATH) {
456
+ if (isProjectConfigPath(documentPath)) {
452
457
  /* Elements, Variables and Code: the Styles workspace's three views. Spelled here rather than
453
458
  imported from `style/project-styles` (`STYLES_TAB_MODES`), whose imports reach `store`,
454
459
  which imports this module; `tests/project-config.test.ts` holds the two lists equal. */
package/src/types.ts CHANGED
@@ -717,7 +717,7 @@ export interface StudioPlatform {
717
717
  * announcing the intent — "opened in a new window" is a lie when the project was already open
718
718
  * somewhere and that window merely came to the front.
719
719
  */
720
- openProjectInNewWindow?: (root: string) => Promise<{ focused: boolean }>;
720
+ openProjectInNewWindow?: (root: string) => Promise<{ declined?: true; focused: boolean }>;
721
721
  /**
722
722
  * Pick a project WITHOUT binding this window to it — the answer to "which project", separated
723
723
  * from the act of opening it here. Backs the New Window branch of Open Project: `openProject()`
@@ -733,7 +733,16 @@ export interface StudioPlatform {
733
733
  * Point THIS window's backend at a project and return its config. If the project is already open
734
734
  * in another window, that window is focused and `deduped` is true (no project is loaded here).
735
735
  */
736
- setWindowProject?: (root: string) => Promise<{ deduped: boolean; config: ProjectConfig | null }>;
736
+ setWindowProject?: (
737
+ root: string,
738
+ ) => Promise<{ declined?: true; deduped: boolean; config: ProjectConfig | null }>;
739
+ /**
740
+ * Be told when the operating system asks this window to show a document, by its project-relative
741
+ * path. Includes anything asked before this was called, so a window that was opened for a
742
+ * document shows it once it has booted. Returns the unsubscribe. A platform with no operating
743
+ * system to hand it files omits it.
744
+ */
745
+ subscribeOpenDocument?: (handler: (path: string) => void) => () => void;
737
746
  /** The project root this window's backend is currently bound to. */
738
747
  getProjectRoot?: () => Promise<{ root: string | null }>;
739
748
  // ─── Recent projects (backend-persisted; undefined on dev-server) ───────────
@@ -904,6 +913,8 @@ export interface ContentSectionEntry {
904
913
  /** The field a file-backed collection's records are identified by (the loader's `idField`). */
905
914
  idField?: string;
906
915
  $elements?: unknown[];
916
+ /** What keeps an entry back from production (site-architecture.md §7.6), read by `hold-state`. */
917
+ hold?: unknown;
907
918
  }
908
919
 
909
920
  export interface CanvasPanel {
@@ -444,6 +444,8 @@ export function expressionHint(node: ExpressionValue | undefined) {
444
444
  export interface ExpressionEditorOpts {
445
445
  stateDefs: string[];
446
446
  allowEventRef: boolean;
447
+ /** Pointers beyond the document's own signals: inside a repeater, its item and that item's fields. */
448
+ extraRefs?: readonly SurfaceOption[] | null | undefined;
447
449
  depth?: number;
448
450
  preview?: ExpressionPreview | null;
449
451
  path?: (string | number)[];
@@ -608,7 +610,7 @@ function walkOperand(
608
610
  commit: (next: ExpressionValue) => void,
609
611
  slot: OperandSlot,
610
612
  ): void {
611
- const { allowEventRef, stateDefs } = walk.opts;
613
+ const { allowEventRef, extraRefs, stateDefs } = walk.opts;
612
614
  const stateRefs = stateDefs.map((k) => `#/state/${k}`);
613
615
  // Shown as written: a malformed (non-string) pointer is coerced the way the picker would show it.
614
616
  const refValue = String(fieldsOf(operand)?.$ref ?? "");
@@ -631,9 +633,12 @@ function walkOperand(
631
633
  leadValue: slot.leadValue ?? "",
632
634
  nested: slot.depth > 0 ? "true" : "false",
633
635
  prop: slot.prop,
634
- refGroups: allowEventRef
635
- ? [{ id: "event", label: "Event", rows: EVENT_REFS.map((r) => ({ label: r, value: r })) }]
636
- : [],
636
+ refGroups: [
637
+ ...(extraRefs?.length ? [{ id: "item", label: "List item", rows: [...extraRefs] }] : []),
638
+ ...(allowEventRef
639
+ ? [{ id: "event", label: "Event", rows: EVENT_REFS.map((r) => ({ label: r, value: r })) }]
640
+ : []),
641
+ ],
637
642
  refOptions: stateRefs.map((r) => ({ label: r.replace("#/state/", ""), value: r })),
638
643
  removable: Boolean(slot.removable),
639
644
  title: slot.title ?? "",
@@ -642,7 +647,7 @@ function walkOperand(
642
647
 
643
648
  /* Nothing to pick and nothing already picked: a picker whose only entry is a disabled "No state
644
649
  defined" is a dead end. Say what a binding IS instead, in the shell's one empty-state voice. */
645
- const nothingToBind = stateRefs.length === 0 && !allowEventRef && !refValue;
650
+ const nothingToBind = stateRefs.length === 0 && !extraRefs?.length && !allowEventRef && !refValue;
646
651
 
647
652
  if (slot.mustBeRef) {
648
653
  walk.plans.set(slot.key, plan);
@@ -708,7 +708,12 @@ function createController(): FormController {
708
708
  are all serialized), where an undefined member is simply omitted. */
709
709
  rows[idx] = {
710
710
  ...target,
711
- [cell]: coerceCell(cellSchema, next, plan.refCells?.has(`${field}/${row}/${cell}`) ?? false),
711
+ [cell]: coerceCell(
712
+ cellSchema,
713
+ next,
714
+ plan.refCells?.has(`${field}/${row}/${cell}`) ?? false,
715
+ target[cell],
716
+ ),
712
717
  } as JsonObject;
713
718
  patchRows(plan, rows);
714
719
  }
@@ -718,6 +723,7 @@ function createController(): FormController {
718
723
  cellSchema: JsonSchema | undefined,
719
724
  next: JsonValue | undefined,
720
725
  isPointer: boolean,
726
+ previous: JsonValue | undefined,
721
727
  ): JsonValue | undefined {
722
728
  if (isBoolean(next)) {
723
729
  return next;
@@ -734,6 +740,17 @@ function createController(): FormController {
734
740
  if (raw === NONE || raw === "") {
735
741
  return undefined;
736
742
  }
743
+ if (cellSchema?.type === "object" || cellSchema?.type === "array") {
744
+ /* The rule a whole JSON field follows: a half-typed object is not a refusal, the last parsable
745
+ value is what the document keeps. Stored as text, it would be a string where the schema asks
746
+ for an object, and the row would be invalid however it read. */
747
+ try {
748
+ // SAFETY: `JSON.parse` with no reviver yields only JSON values, which is all a JsonValue is.
749
+ return JSON.parse(raw) as JsonValue;
750
+ } catch {
751
+ return previous;
752
+ }
753
+ }
737
754
  return raw;
738
755
  }
739
756
 
@@ -15,6 +15,7 @@ import {
15
15
  isNumber,
16
16
  isRef,
17
17
  isString,
18
+ isTemplateString,
18
19
  } from "@jxsuite/schema/guards";
19
20
  import { isDocumentContainer } from "./strip-events";
20
21
  import type { RebuiltNode } from "./strip-events";
@@ -201,6 +202,10 @@ export function computeEmptyPlaceholderClass(node: JxMutableNode): string | null
201
202
  if (Array.isArray(node.children) && node.children.length > 0) {
202
203
  return null;
203
204
  }
205
+ // Computed children: not empty, only not known until the page runs. The canvas names the binding.
206
+ if (isTemplateString(node.children)) {
207
+ return null;
208
+ }
204
209
  if (fixesItsOwnSize(node)) {
205
210
  return null;
206
211
  }
@@ -223,6 +228,16 @@ export function templateToEditDisplay(str: string) {
223
228
  return str.replaceAll(/\$\{([^}]+)\}/g, "\u276A $1 \u276B");
224
229
  }
225
230
 
231
+ /**
232
+ * The binding a node's computed children show in edit mode. An `?? []` fallback is plumbing, so it
233
+ * reads as the field it guards: `❪ item.$children ❫`.
234
+ *
235
+ * @param {string} template
236
+ */
237
+ function computedChildrenDisplay(template: string): string {
238
+ return templateToEditDisplay(template.replaceAll(/\s*\?\?\s*\[\s*\]\s*(?=\})/gu, ""));
239
+ }
240
+
226
241
  /**
227
242
  * Reverse templateToEditDisplay: walk all text nodes in `el` and replace ❪ expr ❫ back to ${expr}
228
243
  * so the user edits raw template syntax.
@@ -543,7 +558,7 @@ function prepareNode(
543
558
  } else if (isNodeObject(v) && v.$prototype === "Array") {
544
559
  // Legacy whole-children repeater → a single perimeter as the sole child.
545
560
  out.children = [prepareNode(v, row)];
546
- } else {
561
+ } else if (!isTemplateString(v)) {
547
562
  out.children = prepareNode(v, row);
548
563
  }
549
564
  } else if (k === "cases" && obj.$switch && isDocumentContainer(v)) {
@@ -631,6 +646,17 @@ function prepareNode(
631
646
  }
632
647
  }
633
648
 
649
+ /* Computed children (spec.md §8.4) are shown as their binding, like text is, but they are not
650
+ text: the words here are a label of what the page draws, and a caret placed in them would
651
+ commit that label as the element's `textContent`. So the label is closed to the caret. */
652
+ if (isTemplateString(obj.children)) {
653
+ out.textContent = computedChildrenDisplay(obj.children);
654
+ const { attributes } = out;
655
+ out.attributes = isDocumentContainer(attributes)
656
+ ? { ...attributes, contenteditable: "false" }
657
+ : { contenteditable: "false" };
658
+ }
659
+
634
660
  // Mark empty elements with placeholder classes for design-mode visibility
635
661
  const placeholderClass = computeEmptyPlaceholderClass(out);
636
662
  if (placeholderClass) {
package/src/view.ts CHANGED
@@ -97,7 +97,13 @@ interface ViewState {
97
97
  blockActionBarEl: HTMLElement | null;
98
98
  selDragCleanup: (() => void) | null;
99
99
  dndCleanups: (() => void)[];
100
- elementsCollapsed: Set<string>;
100
+ /** The Insert palette's tab (§5.3). */
101
+ insertTab: "elements" | "components";
102
+ /**
103
+ * The Insert palette's sections the reader has opened or closed, by category key. A key not here
104
+ * takes its default: open, except the categories that start closed.
105
+ */
106
+ elementsOpen: Map<string, boolean>;
101
107
  elementsFilter: string;
102
108
  _currentDropTargetRow: HTMLElement | null;
103
109
  layerDragSourceHeight: number;
@@ -119,7 +125,8 @@ export const view: ViewState = {
119
125
  dndCleanups: [],
120
126
 
121
127
  // Left panel / elements UI
122
- elementsCollapsed: new Set(),
128
+ insertTab: "elements",
129
+ elementsOpen: new Map(),
123
130
  elementsFilter: "",
124
131
 
125
132
  // Drag interaction
@@ -29,7 +29,7 @@ import { workspace } from "./workspace";
29
29
  import { homeWorkspaceOfTabId } from "./workspace-ids";
30
30
  import { parseGridTabId } from "../grid/grid-source";
31
31
  import { collectionForFile } from "../content/collection-match";
32
- import { PROJECT_CONFIG_PATH } from "../tabs/tab";
32
+ import { isProjectConfigPath } from "../tabs/tab";
33
33
  import type { Pane } from "./workspace";
34
34
  import type { WorkspaceId } from "./workspace-ids";
35
35
  import type { Tab } from "../tabs/tab";
@@ -59,7 +59,7 @@ export function workspaceOfTab(tab: Tab): WorkspaceId {
59
59
  // A data-table grid is the Data panel's, which is Design's; every other grid is content.
60
60
  return grid.kind === "data" ? "design" : "content";
61
61
  }
62
- if (tab.documentPath === PROJECT_CONFIG_PATH) {
62
+ if (isProjectConfigPath(tab.documentPath)) {
63
63
  return "styles";
64
64
  }
65
65
  /* A file-backed collection's file too: its grid is where its records are written, and the
@@ -22,7 +22,7 @@
22
22
  */
23
23
 
24
24
  import { shell, workspaceDrawsTabStrip } from "../shell";
25
- import { PROJECT_CONFIG_PATH } from "../tabs/tab";
25
+ import { isProjectConfigPath } from "../tabs/tab";
26
26
  import { tabOfPane } from "../canvas/canvas-surface";
27
27
  import { workspace } from "./workspace";
28
28
  import { workspaceOfTab } from "./tab-workspace";
@@ -72,7 +72,7 @@ export function backTargetOf(
72
72
  return null;
73
73
  }
74
74
  if (id === "styles") {
75
- if (tab.documentPath !== PROJECT_CONFIG_PATH || tab.session.ui.canvasMode !== SOURCE_MODE) {
75
+ if (!isProjectConfigPath(tab.documentPath) || tab.session.ui.canvasMode !== SOURCE_MODE) {
76
76
  return null;
77
77
  }
78
78
  const mode = shell.stylebook.view;
@@ -1,4 +0,0 @@
1
- import{Bt,yn,Rc,Yg,By,Zg,k_,Pk,Fk,jk,Hk,Bk,zk,Wk,Vk,Uk}from"./studio-q80fg1d6.js";import{pe}from"./studio-0939t1q1.js";var b=pe(function(M){Object.defineProperty(M,"__esModule",{value:!0});M.dynamicAnchor=void 0;var _=Bt(),ge=Rc(),A=k_(),_e=Fk(),be={keyword:"$dynamicAnchor",schemaType:"string",code:(e)=>O(e,e.schema)};function O(e,t){let{gen:r,it:o}=e;o.schemaEnv.root.dynamicAnchors[t]=!0;let n=_._`${ge.default.dynamicAnchors}${_.getProperty(t)}`,s=o.errSchemaPath==="#"?o.validateName:ve(e);r.if(_._`!${n}`,()=>r.assign(n,s))}M.dynamicAnchor=O;function ve(e){let{schemaEnv:t,schema:r,self:o}=e.it,{root:n,baseId:s,localRefs:m,meta:c}=t.root,{schemaId:a}=o.opts,u=new A.SchemaEnv({schema:r,schemaId:a,root:n,baseId:s,localRefs:m,meta:c});return A.compileSchema.call(o,u),_e.getValidate(e,u)}M.default=be});var v=pe(function(N){Object.defineProperty(N,"__esModule",{value:!0});N.dynamicRef=void 0;var I=Bt(),qe=Rc(),x=Fk(),Pe={keyword:"$dynamicRef",schemaType:"string",code:(e)=>w(e,e.schema)};function w(e,t){let{gen:r,keyword:o,it:n}=e;if(t[0]!=="#")throw Error(`"${o}" only supports hash fragment reference`);let s=t.slice(1);if(n.allErrors)m();else{let a=r.let("valid",!1);m(a),e.ok(a)}function m(a){if(n.schemaEnv.root.dynamicAnchors[s]){let u=r.let("_v",I._`${qe.default.dynamicAnchors}${I.getProperty(s)}`);r.if(u,c(u,a),c(n.validateName,a))}else c(n.validateName,a)()}function c(a,u){return u?()=>r.block(()=>{x.callRef(e,a),r.let(u,!0)}):()=>x.callRef(e,a)}}N.dynamicRef=w;N.default=Pe});var E=pe(function(k){Object.defineProperty(k,"__esModule",{value:!0});var Ae=b(),Oe=yn(),Me={keyword:"$recursiveAnchor",schemaType:"boolean",code(e){if(e.schema)Ae.dynamicAnchor(e,"");else Oe.checkStrictMode(e.it,"$recursiveAnchor: false is ignored")}};k.default=Me});var V=pe(function(C){Object.defineProperty(C,"__esModule",{value:!0});var xe=v(),Ie={keyword:"$recursiveRef",schemaType:"string",code:(e)=>xe.dynamicRef(e,e.schema)};C.default=Ie});var K=pe(function(D){Object.defineProperty(D,"__esModule",{value:!0});var Ne=b(),Te=v(),ke=E(),Ee=V(),Ce=[Ne.default,Te.default,ke.default,Ee.default];D.default=Ce});var L=pe(function(z){Object.defineProperty(z,"__esModule",{value:!0});var G=Bk(),De={keyword:"dependentRequired",type:"object",schemaType:"object",error:G.error,code:(e)=>G.validatePropertyDeps(e)};z.default=De});var Z=pe(function(U){Object.defineProperty(U,"__esModule",{value:!0});var Ge=Bk(),ze={keyword:"dependentSchemas",type:"object",schemaType:"object",code:(e)=>Ge.validateSchemaDeps(e)};U.default=ze});var H=pe(function(F){Object.defineProperty(F,"__esModule",{value:!0});var Ue=yn(),Ze={keyword:["maxContains","minContains"],type:"array",schemaType:"number",code({keyword:e,parentSchema:t,it:r}){if(t.contains===void 0)Ue.checkStrictMode(r,`"${e}" without "contains" is ignored`)}};F.default=Ze});var J=pe(function(B){Object.defineProperty(B,"__esModule",{value:!0});var He=L(),Be=Z(),Je=H(),Qe=[He.default,Be.default,Je.default];B.default=Qe});var X=pe(function(W){Object.defineProperty(W,"__esModule",{value:!0});var f=Bt(),Q=yn(),Xe=Rc(),Ye={message:"must NOT have unevaluated properties",params:({params:e})=>f._`{unevaluatedProperty: ${e.unevaluatedProperty}}`},et={keyword:"unevaluatedProperties",type:"object",schemaType:["boolean","object"],trackErrors:!0,error:Ye,code(e){let{gen:t,schema:r,data:o,errsCount:n,it:s}=e;if(!n)throw Error("ajv implementation error");let{allErrors:m,props:c}=s;if(c instanceof f.Name)t.if(f._`${c} !== true`,()=>t.forIn("key",o,(i)=>t.if(u(c,i),()=>a(i))));else if(c!==!0)t.forIn("key",o,(i)=>c===void 0?a(i):t.if(g(c,i),()=>a(i)));s.props=!0,e.ok(f._`${n} === ${Xe.default.errors}`);function a(i){if(r===!1){if(e.setParams({unevaluatedProperty:i}),e.error(),!m)t.break();return}if(!Q.alwaysValidSchema(s,r)){let p=t.name("valid");if(e.subschema({keyword:"unevaluatedProperties",dataProp:i,dataPropType:Q.Type.Str},p),!m)t.if(f.not(p),()=>t.break())}}function u(i,p){return f._`!${i} || !${i}[${p}]`}function g(i,p){let P=[];for(let R in i)if(i[R]===!0)P.push(f._`${p} !== ${R}`);return f.and(...P)}}};W.default=et});var te=pe(function(ee){Object.defineProperty(ee,"__esModule",{value:!0});var l=Bt(),Y=yn(),rt={message:({params:{len:e}})=>l.str`must NOT have more than ${e} items`,params:({params:{len:e}})=>l._`{limit: ${e}}`},at={keyword:"unevaluatedItems",type:"array",schemaType:["boolean","object"],error:rt,code(e){let{gen:t,schema:r,data:o,it:n}=e,s=n.items||0;if(s===!0)return;let m=t.const("len",l._`${o}.length`);if(r===!1)e.setParams({len:s}),e.fail(l._`${m} > ${s}`);else if(typeof r=="object"&&!Y.alwaysValidSchema(n,r)){let a=t.var("valid",l._`${m} <= ${s}`);t.if(l.not(a),()=>c(a,s)),e.ok(a)}n.items=!0;function c(a,u){t.forRange("i",u,m,(g)=>{if(e.subschema({keyword:"unevaluatedItems",dataProp:g,dataPropType:Y.Type.Num},a),!n.allErrors)t.if(l.not(a),()=>t.break())})}}};ee.default=at});var ae=pe(function(re){Object.defineProperty(re,"__esModule",{value:!0});var ot=X(),st=te(),it=[ot.default,st.default];re.default=it});var se=pe(function(oe){Object.defineProperty(oe,"__esModule",{value:!0});var dt=jk(),ut=Hk(),mt=zk(),ft=K(),lt=J(),pt=ae(),yt=Wk(),ne=Vk(),ht=[ft.default,dt.default,ut.default,(0,mt.default)(!0),yt.default,ne.metadataVocabulary,ne.contentVocabulary,lt.default,pt.default];oe.default=ht});var ie=pe(function(ir,gt){gt.exports={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://json-schema.org/draft/2020-12/schema",$vocabulary:{"https://json-schema.org/draft/2020-12/vocab/core":!0,"https://json-schema.org/draft/2020-12/vocab/applicator":!0,"https://json-schema.org/draft/2020-12/vocab/unevaluated":!0,"https://json-schema.org/draft/2020-12/vocab/validation":!0,"https://json-schema.org/draft/2020-12/vocab/meta-data":!0,"https://json-schema.org/draft/2020-12/vocab/format-annotation":!0,"https://json-schema.org/draft/2020-12/vocab/content":!0},$dynamicAnchor:"meta",title:"Core and Validation specifications meta-schema",allOf:[{$ref:"meta/core"},{$ref:"meta/applicator"},{$ref:"meta/unevaluated"},{$ref:"meta/validation"},{$ref:"meta/meta-data"},{$ref:"meta/format-annotation"},{$ref:"meta/content"}],type:["object","boolean"],$comment:"This meta-schema also defines keywords that have appeared in previous drafts in order to prevent incompatible extensions as they remain in common use.",properties:{definitions:{$comment:'"definitions" has been replaced by "$defs".',type:"object",additionalProperties:{$dynamicRef:"#meta"},deprecated:!0,default:{}},dependencies:{$comment:'"dependencies" has been split and replaced by "dependentSchemas" and "dependentRequired" in order to serve their differing semantics.',type:"object",additionalProperties:{anyOf:[{$dynamicRef:"#meta"},{$ref:"meta/validation#/$defs/stringArray"}]},deprecated:!0,default:{}},$recursiveAnchor:{$comment:'"$recursiveAnchor" has been replaced by "$dynamicAnchor".',$ref:"meta/core#/$defs/anchorString",deprecated:!0},$recursiveRef:{$comment:'"$recursiveRef" has been replaced by "$dynamicRef".',$ref:"meta/core#/$defs/uriReferenceString",deprecated:!0}}}});var ce=pe(function(cr,_t){_t.exports={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://json-schema.org/draft/2020-12/meta/applicator",$vocabulary:{"https://json-schema.org/draft/2020-12/vocab/applicator":!0},$dynamicAnchor:"meta",title:"Applicator vocabulary meta-schema",type:["object","boolean"],properties:{prefixItems:{$ref:"#/$defs/schemaArray"},items:{$dynamicRef:"#meta"},contains:{$dynamicRef:"#meta"},additionalProperties:{$dynamicRef:"#meta"},properties:{type:"object",additionalProperties:{$dynamicRef:"#meta"},default:{}},patternProperties:{type:"object",additionalProperties:{$dynamicRef:"#meta"},propertyNames:{format:"regex"},default:{}},dependentSchemas:{type:"object",additionalProperties:{$dynamicRef:"#meta"},default:{}},propertyNames:{$dynamicRef:"#meta"},if:{$dynamicRef:"#meta"},then:{$dynamicRef:"#meta"},else:{$dynamicRef:"#meta"},allOf:{$ref:"#/$defs/schemaArray"},anyOf:{$ref:"#/$defs/schemaArray"},oneOf:{$ref:"#/$defs/schemaArray"},not:{$dynamicRef:"#meta"}},$defs:{schemaArray:{type:"array",minItems:1,items:{$dynamicRef:"#meta"}}}}});var de=pe(function(dr,bt){bt.exports={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://json-schema.org/draft/2020-12/meta/unevaluated",$vocabulary:{"https://json-schema.org/draft/2020-12/vocab/unevaluated":!0},$dynamicAnchor:"meta",title:"Unevaluated applicator vocabulary meta-schema",type:["object","boolean"],properties:{unevaluatedItems:{$dynamicRef:"#meta"},unevaluatedProperties:{$dynamicRef:"#meta"}}}});var ue=pe(function(ur,vt){vt.exports={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://json-schema.org/draft/2020-12/meta/content",$vocabulary:{"https://json-schema.org/draft/2020-12/vocab/content":!0},$dynamicAnchor:"meta",title:"Content vocabulary meta-schema",type:["object","boolean"],properties:{contentEncoding:{type:"string"},contentMediaType:{type:"string"},contentSchema:{$dynamicRef:"#meta"}}}});var me=pe(function(mr,jt){jt.exports={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://json-schema.org/draft/2020-12/meta/core",$vocabulary:{"https://json-schema.org/draft/2020-12/vocab/core":!0},$dynamicAnchor:"meta",title:"Core vocabulary meta-schema",type:["object","boolean"],properties:{$id:{$ref:"#/$defs/uriReferenceString",$comment:"Non-empty fragments not allowed.",pattern:"^[^#]*#?$"},$schema:{$ref:"#/$defs/uriString"},$ref:{$ref:"#/$defs/uriReferenceString"},$anchor:{$ref:"#/$defs/anchorString"},$dynamicRef:{$ref:"#/$defs/uriReferenceString"},$dynamicAnchor:{$ref:"#/$defs/anchorString"},$vocabulary:{type:"object",propertyNames:{$ref:"#/$defs/uriString"},additionalProperties:{type:"boolean"}},$comment:{type:"string"},$defs:{type:"object",additionalProperties:{$dynamicRef:"#meta"}}},$defs:{anchorString:{type:"string",pattern:"^[A-Za-z_][-A-Za-z0-9._]*$"},uriString:{type:"string",format:"uri"},uriReferenceString:{type:"string",format:"uri-reference"}}}});var fe=pe(function(fr,qt){qt.exports={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://json-schema.org/draft/2020-12/meta/format-annotation",$vocabulary:{"https://json-schema.org/draft/2020-12/vocab/format-annotation":!0},$dynamicAnchor:"meta",title:"Format vocabulary meta-schema for annotation results",type:["object","boolean"],properties:{format:{type:"string"}}}});var le=pe(function(lr,Pt){Pt.exports={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://json-schema.org/draft/2020-12/meta/meta-data",$vocabulary:{"https://json-schema.org/draft/2020-12/vocab/meta-data":!0},$dynamicAnchor:"meta",title:"Meta-data vocabulary meta-schema",type:["object","boolean"],properties:{title:{type:"string"},description:{type:"string"},default:!0,deprecated:{type:"boolean",default:!1},readOnly:{type:"boolean",default:!1},writeOnly:{type:"boolean",default:!1},examples:{type:"array",items:!0}}}});var ye=pe(function(pr,Rt){Rt.exports={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://json-schema.org/draft/2020-12/meta/validation",$vocabulary:{"https://json-schema.org/draft/2020-12/vocab/validation":!0},$dynamicAnchor:"meta",title:"Validation vocabulary meta-schema",type:["object","boolean"],properties:{type:{anyOf:[{$ref:"#/$defs/simpleTypes"},{type:"array",items:{$ref:"#/$defs/simpleTypes"},minItems:1,uniqueItems:!0}]},const:!0,enum:{type:"array",items:!0},multipleOf:{type:"number",exclusiveMinimum:0},maximum:{type:"number"},exclusiveMaximum:{type:"number"},minimum:{type:"number"},exclusiveMinimum:{type:"number"},maxLength:{$ref:"#/$defs/nonNegativeInteger"},minLength:{$ref:"#/$defs/nonNegativeIntegerDefault0"},pattern:{type:"string",format:"regex"},maxItems:{$ref:"#/$defs/nonNegativeInteger"},minItems:{$ref:"#/$defs/nonNegativeIntegerDefault0"},uniqueItems:{type:"boolean",default:!1},maxContains:{$ref:"#/$defs/nonNegativeInteger"},minContains:{$ref:"#/$defs/nonNegativeInteger",default:1},maxProperties:{$ref:"#/$defs/nonNegativeInteger"},minProperties:{$ref:"#/$defs/nonNegativeIntegerDefault0"},required:{$ref:"#/$defs/stringArray"},dependentRequired:{type:"object",additionalProperties:{$ref:"#/$defs/stringArray"}}},$defs:{nonNegativeInteger:{type:"integer",minimum:0},nonNegativeIntegerDefault0:{$ref:"#/$defs/nonNegativeInteger",default:0},simpleTypes:{enum:["array","boolean","integer","null","number","object","string"]},stringArray:{type:"array",items:{type:"string"},uniqueItems:!0,default:[]}}}});var $e=pe(function(he){Object.defineProperty(he,"__esModule",{value:!0});var At=ie(),Ot=ce(),Mt=de(),St=ue(),xt=me(),It=fe(),wt=le(),Nt=ye(),Tt=["/properties"];function kt(e){return[At,Ot,Mt,St,xt,t(this,It),wt,t(this,Nt)].forEach((r)=>this.addMetaSchema(r,void 0,!1)),this;function t(r,o){return e?r.$dataMetaSchema(o,Tt):o}}he.default=kt});var Ft=pe(function(d,q){Object.defineProperty(d,"__esModule",{value:!0});d.MissingRefError=d.ValidationError=d.CodeGen=d.Name=d.nil=d.stringify=d.str=d._=d.KeywordCxt=d.Ajv2020=void 0;var Ct=Pk(),Vt=se(),Dt=Uk(),Kt=$e(),j="https://json-schema.org/draft/2020-12/schema";class h extends Ct.default{constructor(e={}){super({...e,dynamicRef:!0,next:!0,unevaluated:!0})}_addVocabularies(){if(super._addVocabularies(),Vt.default.forEach((e)=>this.addVocabulary(e)),this.opts.discriminator)this.addKeyword(Dt.default)}_addDefaultMetaSchema(){super._addDefaultMetaSchema();let{$data:e,meta:t}=this.opts;if(!t)return;Kt.default.call(this,e),this.refs["http://json-schema.org/schema"]=j}defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this.getSchema(j)?j:void 0)}}d.Ajv2020=h;q.exports=d=h;q.exports.Ajv2020=h;Object.defineProperty(d,"__esModule",{value:!0});d.default=h;var Gt=Yg();Object.defineProperty(d,"KeywordCxt",{enumerable:!0,get:function(){return Gt.KeywordCxt}});var y=Bt();Object.defineProperty(d,"_",{enumerable:!0,get:function(){return y._}});Object.defineProperty(d,"str",{enumerable:!0,get:function(){return y.str}});Object.defineProperty(d,"stringify",{enumerable:!0,get:function(){return y.stringify}});Object.defineProperty(d,"nil",{enumerable:!0,get:function(){return y.nil}});Object.defineProperty(d,"Name",{enumerable:!0,get:function(){return y.Name}});Object.defineProperty(d,"CodeGen",{enumerable:!0,get:function(){return y.CodeGen}});var zt=By();Object.defineProperty(d,"ValidationError",{enumerable:!0,get:function(){return zt.default}});var Lt=Zg();Object.defineProperty(d,"MissingRefError",{enumerable:!0,get:function(){return Lt.default}})});export default Ft();
2
-
3
- //# debugId=1694415B4E0D0BE564756E2164756E21
4
- //# sourceMappingURL=2020-906vx2dq.js.map
@@ -1,4 +0,0 @@
1
- import{Ks,Js,zr}from"./studio-90zkgne5.js";export{zr as draggable,Ks as dropTargetForElements,Js as monitorForElements};
2
-
3
- //# debugId=55377EFB712CCBE264756E2164756E21
4
- //# sourceMappingURL=adapter-hnvad61x.js.map