@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.
- package/data/locales/en/elements.json +434 -0
- package/data/webdata.json +116 -139
- package/dist/chunks/2020-rqm7qrje.js +4 -0
- package/dist/chunks/adapter-cyy8vbcx.js +4 -0
- package/dist/chunks/add-new-flow-8cgtejv2.js +4 -0
- package/dist/chunks/{cf-account-picker-xb8vvt2h.js → cf-account-picker-v3qd2dhw.js} +3 -3
- package/dist/chunks/cf-settings-1fnw874z.js +4 -0
- package/dist/chunks/{color-area-h8dbasp1.js → color-area-frd9y9q6.js} +2 -2
- package/dist/chunks/color-field-rebpbe33.js +4 -0
- package/dist/chunks/{color-slider-nz2mrzky.js → color-slider-6bzmk3s7.js} +2 -2
- package/dist/chunks/color-t2bnnj8y.js +4 -0
- package/dist/chunks/{combobox-6hs00996.js → combobox-c49x7gf1.js} +3 -3
- package/dist/chunks/components-y8yhdd7d.js +4 -0
- package/dist/chunks/content-source-9e7qvmsf.js +4 -0
- package/dist/chunks/convert-to-repeater-pd2w4z21.js +4 -0
- package/dist/chunks/editor-mb9jzdrw.js +4 -0
- package/dist/chunks/entry-commands-at0wnx3f.js +4 -0
- package/dist/chunks/extension-sections-4z9qq0gh.js +4 -0
- package/dist/chunks/file-ops-dtdvjmza.js +4 -0
- package/dist/chunks/files-8pf70854.js +4 -0
- package/dist/chunks/format-host-fd3m2y2a.js +4 -0
- package/dist/chunks/fs-events-hrk29vcv.js +4 -0
- package/dist/chunks/grid-open-bh74v82z.js +4 -0
- package/dist/chunks/{grid-view-2f03wcgw.js → grid-view-a51mgzmq.js} +17 -17
- package/dist/chunks/{icons-gb967qc8.js → icons-qp8fn1k8.js} +2 -2
- package/dist/chunks/{iframe-entry-btck0e9s.js → iframe-entry-mpwe5pwk.js} +4 -4
- package/dist/chunks/{iframe-entry-2x9bn5ng.js → iframe-entry-msd43x9h.js} +4 -4
- package/dist/chunks/iframe-entry-rt8jz5t8.js +5 -0
- package/dist/chunks/{iframe-entry-b5qgggyp.js → iframe-entry-v40cr813.js} +4 -4
- package/dist/chunks/iframe-host-q0s0wwy3.js +4 -0
- package/dist/chunks/{image-bake-4afr4y6a.js → image-bake-q9ajdjsj.js} +3 -3
- package/dist/chunks/{image-editor-x7t8jbjn.js → image-editor-ke9std9b.js} +3 -3
- package/dist/chunks/index-57ang7ma.js +4 -0
- package/dist/chunks/index-eytr7av4.js +17 -0
- package/dist/chunks/{index-yjrfeks8.js → index-x495reff.js} +3 -3
- package/dist/chunks/{javascript-hy2mws8v.js → javascript-qe34bvaz.js} +3 -3
- package/dist/chunks/jsonMode-m8rseh31.js +13 -0
- package/dist/chunks/jx-validate-bbd1mary.js +4 -0
- package/dist/chunks/layers-panel-wcjtdqsa.js +4 -0
- package/dist/chunks/layers-yscpys6q.js +4 -0
- package/dist/chunks/{listbox-7gka1h86.js → listbox-tktzq5xj.js} +2 -2
- package/dist/chunks/lit-html-qm5wbhqz.js +4 -0
- package/dist/chunks/media-library-2hfff88g.js +4 -0
- package/dist/chunks/media-open-4pb05cne.js +4 -0
- package/dist/chunks/media-picker-bzktmmwr.js +4 -0
- package/dist/chunks/menu-xc3cbgsd.js +4 -0
- package/dist/chunks/{monaco-binding-a51py33c.js → monaco-binding-7t38arh9.js} +3 -3
- package/dist/chunks/monaco-buffer-3vz94c9f.js +4 -0
- package/dist/chunks/monaco-setup-fstdew02.js +4 -0
- package/dist/chunks/notify-gbdcckrh.js +4 -0
- package/dist/chunks/parse-fpdzgk4c.js +4 -0
- package/dist/chunks/platform-9g72gdqr.js +4 -0
- package/dist/chunks/popover-cnmsav6b.js +4 -0
- package/dist/chunks/publish-panel-91x1cb5d.js +4 -0
- package/dist/chunks/publish-quick-e2dmf7eg.js +4 -0
- package/dist/chunks/publish-workspace-1x8mnzrj.js +4 -0
- package/dist/chunks/quick-search-2m4y6p1x.js +4 -0
- package/dist/chunks/references-yg1g9rwx.js +4 -0
- package/dist/chunks/right-panel-7mfyhzrk.js +4 -0
- package/dist/chunks/source-control-rrc4jgp5.js +4 -0
- package/dist/chunks/{split-m5rwn31z.js → split-d15yencd.js} +2 -2
- package/dist/chunks/studio-0jhhznxy.js +9 -0
- package/dist/chunks/studio-0nb57pjg.js +7 -0
- package/dist/chunks/{studio-s24mhq0z.js → studio-0wa4wv4s.js} +4 -4
- package/dist/chunks/studio-0z8kp4xk.js +5 -0
- package/dist/chunks/{studio-g0hxtcga.js → studio-18gc5t3v.js} +4 -4
- package/dist/chunks/{studio-4fnb5648.js → studio-1b79rpcb.js} +4 -4
- package/dist/chunks/studio-211q5j7m.js +4 -0
- package/dist/chunks/studio-213pyfxh.js +16 -0
- package/dist/chunks/studio-2b1smjvp.js +5 -0
- package/dist/chunks/{studio-nwf0c32p.js → studio-2v6tc9jp.js} +4 -4
- package/dist/chunks/studio-30j0wz99.js +5 -0
- package/dist/chunks/studio-3kmqhwtt.js +5 -0
- package/dist/chunks/studio-44drsmhw.js +5 -0
- package/dist/chunks/{studio-2pk7kc7z.js → studio-495b6f2r.js} +4 -4
- package/dist/chunks/{studio-jma2q8r9.js → studio-4gthb2fd.js} +4 -4
- package/dist/chunks/{studio-0gvvqj3h.js → studio-4xadhxj1.js} +4 -4
- package/dist/chunks/{studio-nvcn2ykc.js → studio-52mzbxqm.js} +4 -4
- package/dist/chunks/{studio-v7a7yb5w.js → studio-56mmnsw8.js} +7 -7
- package/dist/chunks/studio-59hz8f4r.js +5 -0
- package/dist/chunks/{studio-sce30r7b.js → studio-5k9mfafh.js} +3 -3
- package/dist/chunks/{studio-rr00ex23.js → studio-5qez462c.js} +6 -6
- package/dist/chunks/studio-6tnpg0vx.js +5 -0
- package/dist/chunks/studio-6w8mt734.js +6 -0
- package/dist/chunks/studio-7hm04x5z.js +5 -0
- package/dist/chunks/studio-8atmfjjm.js +7 -0
- package/dist/chunks/{studio-wmjmsw0p.js → studio-8n99z71s.js} +4 -4
- package/dist/chunks/studio-8vmad6x2.js +5 -0
- package/dist/chunks/studio-93p5k4r4.js +5 -0
- package/dist/chunks/{studio-2x972v58.js → studio-9gb0m81w.js} +4 -4
- package/dist/chunks/studio-a4ymg4vd.js +5 -0
- package/dist/chunks/studio-anc8067x.js +5 -0
- package/dist/chunks/{studio-2e4hry72.js → studio-dbdt67kr.js} +5 -5
- package/dist/chunks/studio-dbex091t.js +5 -0
- package/dist/chunks/{studio-amaz545p.js → studio-dj8ctxey.js} +4 -4
- package/dist/chunks/{studio-k2evngrj.js → studio-ed9bz68j.js} +5 -5
- package/dist/chunks/{studio-4bgvvzhv.js → studio-fe2d1fp5.js} +4 -4
- package/dist/chunks/{studio-45mj4jqe.js → studio-fgp4cyy3.js} +4 -4
- package/dist/chunks/studio-ft706q02.js +5 -0
- package/dist/chunks/studio-g79s1dyg.js +6 -0
- package/dist/chunks/{studio-pj216fmn.js → studio-gahswxp4.js} +4 -4
- package/dist/chunks/studio-gbqc12bk.js +5 -0
- package/dist/chunks/studio-gxphbetb.js +6 -0
- package/dist/chunks/studio-hdf01j7q.js +7 -0
- package/dist/chunks/studio-hf259xzd.js +48 -0
- package/dist/chunks/studio-jbva4wxw.js +5 -0
- package/dist/chunks/studio-jj9gf1qc.js +5 -0
- package/dist/chunks/studio-jsjg3mjv.js +5 -0
- package/dist/chunks/studio-jtvb8hd7.js +5 -0
- package/dist/chunks/{studio-g9brbewz.js → studio-kp4vzrct.js} +4 -4
- package/dist/chunks/studio-kpx02gaa.js +7 -0
- package/dist/chunks/{studio-3na1r48j.js → studio-kv1728ex.js} +8 -8
- package/dist/chunks/studio-m25ry0mf.js +5 -0
- package/dist/chunks/studio-mcbwmkyh.js +5 -0
- package/dist/chunks/studio-meajkr51.js +5 -0
- package/dist/chunks/studio-mkjrjpr2.js +6 -0
- package/dist/chunks/{studio-eqcddvc2.js → studio-mr084886.js} +201 -201
- package/dist/chunks/studio-mrb10hv3.js +5 -0
- package/dist/chunks/{studio-0939t1q1.js → studio-nhpg405j.js} +4 -4
- package/dist/chunks/studio-nsec0hxm.js +64 -0
- package/dist/chunks/{studio-xx3r3sb0.js → studio-nv0mh0p5.js} +4 -4
- package/dist/chunks/studio-pafmb06w.js +5 -0
- package/dist/chunks/{studio-pm17wdc4.js → studio-pgftd79b.js} +4 -4
- package/dist/chunks/{studio-4zd6an2b.js → studio-pk961xgz.js} +4 -4
- package/dist/chunks/studio-pzbr7g05.js +5 -0
- package/dist/chunks/studio-qcc5hsw2.js +10 -0
- package/dist/chunks/studio-qfq58c8n.js +5 -0
- package/dist/chunks/studio-qvb2jr83.js +5 -0
- package/dist/chunks/studio-r85zw6ay.js +5 -0
- package/dist/chunks/studio-s0kwce5w.js +9 -0
- package/dist/chunks/studio-s6ymkf3q.js +14 -0
- package/dist/chunks/{studio-0x6f3nk9.js → studio-s7p5ccxa.js} +4 -4
- package/dist/chunks/{studio-1410q5dw.js → studio-s9jjap3x.js} +4 -4
- package/dist/chunks/{studio-evq47j2z.js → studio-t5hde1ws.js} +4 -4
- package/dist/chunks/studio-vj9yv897.js +5 -0
- package/dist/chunks/studio-wmak8xjw.js +5 -0
- package/dist/chunks/{studio-bnc50f9h.js → studio-wqsmvtqj.js} +4 -4
- package/dist/chunks/studio-x3z3rhej.js +5 -0
- package/dist/chunks/{studio-bg8pzprg.js → studio-xb55kpmy.js} +4 -4
- package/dist/chunks/studio-xxtdajmv.js +12 -0
- package/dist/chunks/studio-xxttcym1.js +5 -0
- package/dist/chunks/{studio-90zkgne5.js → studio-y2zsnzye.js} +7 -7
- package/dist/chunks/{studio-3qr08sxq.js → studio-y3tjh2xb.js} +3 -3
- package/dist/chunks/studio-y4f1rdsj.js +5 -0
- package/dist/chunks/studio-ybkd5w8k.js +5 -0
- package/dist/chunks/{studio-tpxcryf2.js → studio-yetr4gg1.js} +4 -4
- package/dist/chunks/studio-z295anhs.js +6 -0
- package/dist/chunks/studio-z89e6wpg.js +9 -0
- package/dist/chunks/{studio-5tet77de.js → studio-zbwr6prc.js} +3 -3
- package/dist/chunks/{studio-daksw8kh.js → studio-zdbsv5q2.js} +4 -4
- package/dist/chunks/{studio-abh9kfdh.js → studio-zvthj8hg.js} +4 -4
- package/dist/chunks/toast-2kn2vrn4.js +4 -0
- package/dist/chunks/{toast-host-g3r2s0kn.js → toast-host-3rxeyj3d.js} +3 -3
- package/dist/chunks/{tooltip-dj1pvgz7.js → tooltip-ghkxkasp.js} +3 -3
- package/dist/chunks/{tree-j0ebwr5s.js → tree-vw4nc63s.js} +2 -2
- package/dist/chunks/tsMode-7gngmamr.js +14 -0
- package/dist/chunks/workspace-gv0hxgsm.js +4 -0
- package/dist/chunks/workspace-home-j7e0mjy5.js +4 -0
- package/dist/chunks/{ws-client-arz2qsy9.js → ws-client-vs11sxc5.js} +3 -3
- package/dist/iframe-entry.js +14 -14
- package/dist/manifest.json +84 -83
- package/dist/studio.js +99 -98
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +12 -12
- package/src/browse/library-layouts.ts +9 -12
- package/src/browse/library-pane.ts +22 -16
- package/src/browse/library-source.ts +3 -4
- package/src/browse/preview-style.ts +2 -1
- package/src/canvas/canvas-live-render.ts +2 -5
- package/src/canvas/canvas-page-context.ts +5 -0
- package/src/canvas/canvas-render.ts +6 -1
- package/src/canvas/iframe-drop.ts +84 -1
- package/src/canvas/iframe-entry.ts +9 -6
- package/src/canvas/iframe-render.ts +13 -0
- package/src/collab/collab-session.ts +2 -2
- package/src/commands/levels.ts +1 -1
- package/src/content/entry-commands.ts +32 -27
- package/src/content/entry-editor.ts +46 -44
- package/src/content/entry-inspector.ts +15 -12
- package/src/content/entry-model.ts +3 -3
- package/src/content/entry-summaries.ts +5 -5
- package/src/content/hold-state.ts +172 -0
- package/src/content/page-summaries.ts +10 -14
- package/src/create/add-new-flow.ts +2 -1
- package/src/editor/convert-targets.ts +2 -23
- package/src/editor/inline-edit.ts +6 -1
- package/src/editor/repeater-scope.ts +333 -74
- package/src/editor/slash-menu.ts +35 -17
- package/src/files/files.ts +18 -0
- package/src/format/format-choices.ts +5 -5
- package/src/format/format-host.ts +35 -3
- package/src/grid/redirects-grid.ts +4 -4
- package/src/grid/sources/content-source.ts +42 -66
- package/src/locale/element-names.ts +131 -0
- package/src/panels/block-action-bar.ts +3 -4
- package/src/panels/dnd.ts +3 -1
- package/src/panels/elements-panel.ts +93 -36
- package/src/panels/events-panel.ts +6 -2
- package/src/panels/formula-workspace.ts +9 -0
- package/src/panels/imports-panel.ts +3 -2
- package/src/panels/navigator-panels.ts +10 -10
- package/src/panels/panel-registry.ts +3 -3
- package/src/panels/properties-panel.ts +127 -35
- package/src/panels/site-panel.ts +2 -1
- package/src/panels/statement-editor.ts +4 -0
- package/src/panels/style-panel.ts +2 -1
- package/src/panels/styles-panel.ts +2 -2
- package/src/panels/tab-strip.ts +29 -26
- package/src/platforms/cloud.ts +5 -2
- package/src/services/ai-command-tools.ts +2 -1
- package/src/services/ai-project-tools.ts +21 -8
- package/src/services/ai-tools.ts +5 -5
- package/src/services/ai-write-report.ts +22 -4
- package/src/services/context-manager.ts +110 -2
- package/src/services/document-assistant.ts +2 -2
- package/src/services/harness/chat-reducer.ts +9 -4
- package/src/services/jxn-language.ts +110 -0
- package/src/services/model-uri.ts +3 -0
- package/src/services/monaco-setup.ts +6 -2
- package/src/services/render-critic.ts +234 -12
- package/src/services/tool-executor.ts +16 -8
- package/src/settings/contributed-section.ts +2 -1
- package/src/settings/extension-commands.ts +2 -1
- package/src/settings/general-settings.ts +2 -2
- package/src/settings/settings-document.ts +5 -5
- package/src/shell.ts +1 -1
- package/src/studio.ts +28 -11
- package/src/style/variables-view.ts +2 -2
- package/src/surfaces/collections-panel.json +1 -1
- package/src/surfaces/collections-panel.ts +1 -1
- package/src/surfaces/entry-editor.json +10 -10
- package/src/surfaces/entry-editor.ts +22 -19
- package/src/surfaces/entry-inspector.json +11 -11
- package/src/surfaces/entry-inspector.ts +17 -10
- package/src/surfaces/panel-elements.json +466 -206
- package/src/surfaces/panel-elements.ts +61 -25
- package/src/surfaces/tab-strip.json +5 -5
- package/src/surfaces/tab-strip.ts +2 -2
- package/src/tabs/project-config.ts +13 -13
- package/src/tabs/tab.ts +7 -2
- package/src/types.ts +13 -2
- package/src/ui/expression-editor.ts +10 -5
- package/src/ui/schema-form.ts +18 -1
- package/src/utils/edit-display.ts +27 -1
- package/src/view.ts +9 -2
- package/src/workspace/tab-workspace.ts +2 -2
- package/src/workspace/workspace-back.ts +2 -2
- package/dist/chunks/2020-906vx2dq.js +0 -4
- package/dist/chunks/adapter-hnvad61x.js +0 -4
- package/dist/chunks/add-new-flow-v0pm96mr.js +0 -4
- package/dist/chunks/cf-settings-mkbcz4z2.js +0 -4
- package/dist/chunks/color-04361ttk.js +0 -4
- package/dist/chunks/color-field-qv5r2b16.js +0 -4
- package/dist/chunks/components-w5zqwva1.js +0 -4
- package/dist/chunks/content-source-g38w0d3f.js +0 -4
- package/dist/chunks/convert-to-repeater-r8sfxjjm.js +0 -4
- package/dist/chunks/editor-wvf5e6j9.js +0 -4
- package/dist/chunks/entry-commands-t13dyw3c.js +0 -4
- package/dist/chunks/extension-sections-vjzw46xb.js +0 -4
- package/dist/chunks/file-ops-1sghzgcr.js +0 -4
- package/dist/chunks/files-zrqtgt41.js +0 -4
- package/dist/chunks/format-host-9gy76erh.js +0 -4
- package/dist/chunks/fs-events-45rhg3me.js +0 -4
- package/dist/chunks/grid-open-t4fq6bbm.js +0 -4
- package/dist/chunks/iframe-entry-42hpmwz5.js +0 -5
- package/dist/chunks/iframe-host-9aq8ze3q.js +0 -4
- package/dist/chunks/index-f9qr7kzh.js +0 -4
- package/dist/chunks/jsonMode-vj30te2h.js +0 -13
- package/dist/chunks/jx-validate-r4ax11e3.js +0 -4
- package/dist/chunks/layers-m49nmwvx.js +0 -4
- package/dist/chunks/layers-panel-zr92pwdp.js +0 -4
- package/dist/chunks/lit-html-k2mb9k0r.js +0 -4
- package/dist/chunks/media-library-j74rt0w4.js +0 -4
- package/dist/chunks/media-open-mypr0k6b.js +0 -4
- package/dist/chunks/media-picker-pemtbsjv.js +0 -4
- package/dist/chunks/menu-d2jxpgma.js +0 -4
- package/dist/chunks/monaco-buffer-pa0g6ax7.js +0 -4
- package/dist/chunks/monaco-setup-0hw9f835.js +0 -4
- package/dist/chunks/notify-bwehrp7q.js +0 -4
- package/dist/chunks/parse-hee7ne9b.js +0 -4
- package/dist/chunks/platform-kv0k65cy.js +0 -4
- package/dist/chunks/popover-9tf4cjrk.js +0 -4
- package/dist/chunks/publish-panel-vg1n880b.js +0 -4
- package/dist/chunks/publish-quick-4fwngwrw.js +0 -4
- package/dist/chunks/publish-workspace-jv4w2bx2.js +0 -4
- package/dist/chunks/quick-search-nh29rt8a.js +0 -4
- package/dist/chunks/references-vqyr5s9x.js +0 -4
- package/dist/chunks/right-panel-3ws9f2w0.js +0 -4
- package/dist/chunks/source-control-h3hcs5gy.js +0 -4
- package/dist/chunks/studio-0khd8xtx.js +0 -4
- package/dist/chunks/studio-1ctnw3xv.js +0 -5
- package/dist/chunks/studio-1ks5d9y4.js +0 -5
- package/dist/chunks/studio-1y9mab9m.js +0 -5
- package/dist/chunks/studio-2kpxm0eh.js +0 -7
- package/dist/chunks/studio-2zz4qbv9.js +0 -5
- package/dist/chunks/studio-3pz4t5a2.js +0 -5
- package/dist/chunks/studio-4f7thq0p.js +0 -5
- package/dist/chunks/studio-61rg2cz5.js +0 -5
- package/dist/chunks/studio-7rrdbvex.js +0 -5
- package/dist/chunks/studio-9c6cbq2c.js +0 -4
- package/dist/chunks/studio-9dq7rwc7.js +0 -5
- package/dist/chunks/studio-9gr7xs9r.js +0 -6
- package/dist/chunks/studio-a88ej93p.js +0 -7
- package/dist/chunks/studio-acer0g8w.js +0 -5
- package/dist/chunks/studio-az3wvyh2.js +0 -5
- package/dist/chunks/studio-brh8d2pr.js +0 -5
- package/dist/chunks/studio-c2fa783p.js +0 -9
- package/dist/chunks/studio-cfnn70h1.js +0 -5
- package/dist/chunks/studio-cqxj4fcy.js +0 -5
- package/dist/chunks/studio-cw11h078.js +0 -5
- package/dist/chunks/studio-dn56z7sn.js +0 -5
- package/dist/chunks/studio-egnjpyde.js +0 -9
- package/dist/chunks/studio-ejrypvmq.js +0 -5
- package/dist/chunks/studio-frc16j8v.js +0 -10
- package/dist/chunks/studio-gnazwtv3.js +0 -5
- package/dist/chunks/studio-hfqpfmpk.js +0 -5
- package/dist/chunks/studio-hh394phe.js +0 -5
- package/dist/chunks/studio-j0zf5x2x.js +0 -5
- package/dist/chunks/studio-j5fcp6gj.js +0 -5
- package/dist/chunks/studio-jd1qb1st.js +0 -7
- package/dist/chunks/studio-k0xzrse2.js +0 -64
- package/dist/chunks/studio-k1xqrgm5.js +0 -5
- package/dist/chunks/studio-k3we3kqb.js +0 -5
- package/dist/chunks/studio-knsjyx7n.js +0 -5
- package/dist/chunks/studio-mrjtnm62.js +0 -5
- package/dist/chunks/studio-n9qba0gx.js +0 -5
- package/dist/chunks/studio-nzemfbkk.js +0 -14
- package/dist/chunks/studio-pwctzka3.js +0 -16
- package/dist/chunks/studio-q80fg1d6.js +0 -12
- package/dist/chunks/studio-q9hx2qp0.js +0 -5
- package/dist/chunks/studio-qrzmfaf6.js +0 -5
- package/dist/chunks/studio-r6mx7vm5.js +0 -7
- package/dist/chunks/studio-swedpd82.js +0 -5
- package/dist/chunks/studio-tmfcn347.js +0 -6
- package/dist/chunks/studio-v5wktj6f.js +0 -5
- package/dist/chunks/studio-vpevkfxw.js +0 -5
- package/dist/chunks/studio-wqfaqw4m.js +0 -5
- package/dist/chunks/studio-xpx91fby.js +0 -6
- package/dist/chunks/studio-xva3hzkv.js +0 -5
- package/dist/chunks/studio-z3fztxrp.js +0 -9
- package/dist/chunks/studio-z9453ypn.js +0 -6
- package/dist/chunks/toast-w11qpkyz.js +0 -4
- package/dist/chunks/tsMode-jg1dtphj.js +0 -14
- package/dist/chunks/workspace-6ztqcrsh.js +0 -4
- package/dist/chunks/workspace-home-rse9h8a0.js +0 -4
- 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
|
|
7
|
-
* inserts where — and hands this module a projection with no decisions
|
|
8
|
-
*
|
|
9
|
-
* one of three empty states
|
|
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
|
|
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
|
|
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
|
|
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
|
|
61
|
-
* matches offers to clear the filter, and a
|
|
62
|
-
*
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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: (
|
|
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
|
-
/**
|
|
105
|
-
|
|
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.
|
|
113
|
-
scope.
|
|
114
|
-
scope.
|
|
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
|
-
|
|
135
|
-
|
|
164
|
+
componentsEmpty: "none",
|
|
165
|
+
componentsShowing: false,
|
|
166
|
+
elementsEmpty: "none",
|
|
167
|
+
elementsShowing: true,
|
|
136
168
|
filter: "",
|
|
137
|
-
|
|
169
|
+
filterLabel: "",
|
|
170
|
+
hasOtherMatches: false,
|
|
138
171
|
insertComponent: actions.insertComponent,
|
|
139
172
|
insertElement: actions.insertElement,
|
|
140
|
-
|
|
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
|
|
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
|
|
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-
|
|
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
|
|
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-
|
|
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
|
|
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
|
-
|
|
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 {
|
|
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 {
|
|
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(
|
|
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(
|
|
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:
|
|
336
|
-
id:
|
|
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(`${
|
|
412
|
+
const error = new Error(`${projectConfigPath()} has unsaved changes in its editor tab`);
|
|
413
413
|
notify.error(
|
|
414
|
-
`Could not save ${
|
|
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:${
|
|
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(
|
|
450
|
+
await getPlatform().writeFile(projectConfigPath(), output);
|
|
451
451
|
} catch (error) {
|
|
452
|
-
notify.error(`Could not save ${
|
|
453
|
-
key: `save:${
|
|
454
|
-
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
|
|
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
|
|
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?: (
|
|
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:
|
|
635
|
-
? [{ id: "
|
|
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);
|
package/src/ui/schema-form.ts
CHANGED
|
@@ -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(
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
|
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 {
|
|
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
|
|
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
|