@jxsuite/studio 6.1.0 → 6.1.2
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/dist/chunks/2020-f2gkpy8d.js +4 -0
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-4912g339.js +4 -0
- package/dist/chunks/cf-account-picker-wccaenh6.js +4 -0
- package/dist/chunks/cf-settings-br6105tr.js +4 -0
- package/dist/chunks/color-28ksk2qm.js +4 -0
- package/dist/chunks/color-area-0fj8a4ga.js +4 -0
- package/dist/chunks/color-field-xch8kx2g.js +4 -0
- package/dist/chunks/color-slider-jxd8v350.js +4 -0
- package/dist/chunks/combobox-p0efwjke.js +4 -0
- package/dist/chunks/components-db68vsn7.js +4 -0
- package/dist/chunks/content-source-1449qesq.js +4 -0
- package/dist/chunks/convert-to-repeater-5h457egj.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-x9jn86a7.js +4 -0
- package/dist/chunks/entry-commands-may24cpt.js +4 -0
- package/dist/chunks/extension-sections-pvr14vxr.js +4 -0
- package/dist/chunks/file-ops-x9v54pcj.js +4 -0
- package/dist/chunks/files-j3knqf0s.js +4 -0
- package/dist/chunks/format-host-tyre2trb.js +4 -0
- package/dist/chunks/fs-events-64ma9htc.js +4 -0
- package/dist/chunks/git-panel-84ps5dex.js +4 -0
- package/dist/chunks/grid-view-d2wq9ezg.js +51 -0
- package/dist/chunks/icons-pnfz478q.js +4 -0
- package/dist/chunks/iframe-entry-fvbk89gm.js +5 -0
- package/dist/chunks/iframe-entry-jdcktez8.js +5 -0
- package/dist/chunks/iframe-entry-x0ygf2yr.js +5 -0
- package/dist/chunks/iframe-entry-zap785cw.js +5 -0
- package/dist/chunks/iframe-host-ck6vejt5.js +4 -0
- package/dist/chunks/index-b8xw3vy9.js +4 -0
- package/dist/chunks/{index-gybvv7a6.js → index-zpjmzqfk.js} +3 -3
- package/dist/chunks/{javascript-rnvdp3k4.js → javascript-m54mnwp6.js} +3 -3
- package/dist/chunks/jsonMode-w15cmrcm.js +13 -0
- package/dist/chunks/jx-validate-at3zn8wa.js +4 -0
- package/dist/chunks/layers-h4xp1pss.js +4 -0
- package/dist/chunks/layers-panel-m5hw1d7g.js +4 -0
- package/dist/chunks/listbox-e74qjyq6.js +4 -0
- package/dist/chunks/lit-html-8t8t3dnr.js +4 -0
- package/dist/chunks/media-picker-2cweexc5.js +4 -0
- package/dist/chunks/menu-n6yzswmy.js +4 -0
- package/dist/chunks/menu-ynw13y0s.js +4 -0
- package/dist/chunks/monaco-binding-7gx83x3r.js +4 -0
- package/dist/chunks/monaco-buffer-qzxn567r.js +4 -0
- package/dist/chunks/monaco-setup-gxf6656g.js +4 -0
- package/dist/chunks/notify-cj5zbrs2.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-b7ddhr8m.js +4 -0
- package/dist/chunks/platform-3dfws9js.js +4 -0
- package/dist/chunks/popover-jt2gxmzs.js +4 -0
- package/dist/chunks/publish-panel-1gvxbj21.js +4 -0
- package/dist/chunks/quick-search-0dajrwqg.js +4 -0
- package/dist/chunks/references-49qgt404.js +4 -0
- package/dist/chunks/right-panel-jm1bwe53.js +4 -0
- package/dist/chunks/section-registry-6kwc4fky.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/split-n2gfpm5m.js +4 -0
- package/dist/chunks/{studio-5g0ag7c0.js → studio-0q988f9w.js} +3 -3
- package/dist/chunks/studio-0rt52vpq.js +5 -0
- package/dist/chunks/studio-18vgbhs5.js +5 -0
- package/dist/chunks/{studio-pxg4ap1e.js → studio-1fxkaaea.js} +4 -4
- package/dist/chunks/studio-24mccdrj.js +5 -0
- package/dist/chunks/studio-2eh507zk.js +9 -0
- package/dist/chunks/studio-2hcbccfv.js +5 -0
- package/dist/chunks/studio-2j1cb95x.js +5 -0
- package/dist/chunks/studio-2jbs3rxv.js +5 -0
- package/dist/chunks/{studio-qbj760tx.js → studio-485046te.js} +7 -7
- package/dist/chunks/studio-4h8k4dw9.js +5 -0
- package/dist/chunks/studio-5f6n18kx.js +5 -0
- package/dist/chunks/studio-5gthpky6.js +5 -0
- package/dist/chunks/studio-5ve6bbep.js +5 -0
- package/dist/chunks/studio-6ep3js6b.js +9 -0
- package/dist/chunks/studio-6wkmf3wz.js +9 -0
- package/dist/chunks/studio-841rf3cg.js +5 -0
- package/dist/chunks/studio-8gmwgheg.js +5 -0
- package/dist/chunks/studio-8qm0ep50.js +5 -0
- package/dist/chunks/{studio-anyrgzvb.js → studio-90pq9km1.js} +4 -4
- package/dist/chunks/studio-924p1tm1.js +6 -0
- package/dist/chunks/{studio-v2bvmbjj.js → studio-a3g98wjr.js} +4 -4
- package/dist/chunks/studio-a3shpz9y.js +5 -0
- package/dist/chunks/studio-amsbaaar.js +6 -0
- package/dist/chunks/studio-at5spjbc.js +7 -0
- package/dist/chunks/studio-b2xv945e.js +5 -0
- package/dist/chunks/studio-bn5nkafw.js +5 -0
- package/dist/chunks/studio-bw6q5xjf.js +9 -0
- package/dist/chunks/studio-c7q0t9x1.js +5 -0
- package/dist/chunks/studio-camnhc96.js +6 -0
- package/dist/chunks/studio-cffqvnzd.js +5 -0
- package/dist/chunks/studio-d81xfh1g.js +5 -0
- package/dist/chunks/studio-dgz8d0c1.js +5 -0
- package/dist/chunks/studio-efvfrsf8.js +5 -0
- package/dist/chunks/studio-er30bpcx.js +5 -0
- package/dist/chunks/studio-ezscgr64.js +5 -0
- package/dist/chunks/studio-ffrrncvz.js +5 -0
- package/dist/chunks/studio-fpphgn8y.js +10 -0
- package/dist/chunks/studio-j1kvhdjk.js +4 -0
- package/dist/chunks/{studio-txjjzrsm.js → studio-j430n16g.js} +5 -5
- package/dist/chunks/studio-jjkg84nj.js +5 -0
- package/dist/chunks/studio-m0q32ars.js +4 -0
- package/dist/chunks/studio-m6bdst11.js +5 -0
- package/dist/chunks/studio-nv2cptd4.js +64 -0
- package/dist/chunks/studio-nwfrc98n.js +5 -0
- package/dist/chunks/studio-p1wgvp7r.js +5 -0
- package/dist/chunks/studio-pag2wncm.js +5 -0
- package/dist/chunks/studio-qvanvzfd.js +5 -0
- package/dist/chunks/studio-qwa64kt7.js +5 -0
- package/dist/chunks/studio-rk1zc4x3.js +928 -0
- package/dist/chunks/studio-se2r3ptc.js +5 -0
- package/dist/chunks/studio-sg2a0dh0.js +5 -0
- package/dist/chunks/studio-tjzjhe68.js +5 -0
- package/dist/chunks/{studio-0x3jyb8r.js → studio-tq0rtfwj.js} +4 -4
- package/dist/chunks/{studio-cpxkgjrj.js → studio-v0jzqdjm.js} +4 -4
- package/dist/chunks/studio-v2w7q8r1.js +7 -0
- package/dist/chunks/studio-v5vjq1h0.js +4 -0
- package/dist/chunks/studio-v8aga3vp.js +14 -0
- package/dist/chunks/studio-vfcdrfmv.js +5 -0
- package/dist/chunks/studio-vmfkgdjf.js +5 -0
- package/dist/chunks/studio-wt1816jj.js +5 -0
- package/dist/chunks/studio-wz73q5kq.js +4 -0
- package/dist/chunks/studio-y04qtxvp.js +7 -0
- package/dist/chunks/studio-y21g8zzg.js +5 -0
- package/dist/chunks/studio-y64hrt8p.js +12 -0
- package/dist/chunks/studio-ynn90f58.js +16 -0
- package/dist/chunks/studio-yxz682sx.js +5 -0
- package/dist/chunks/studio-zp7snvkq.js +5 -0
- package/dist/chunks/studio-zq4z6tm6.js +5 -0
- package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
- package/dist/chunks/tabs-f5cw3tgp.js +4 -0
- package/dist/chunks/textfield-wewc8rq2.js +4 -0
- package/dist/chunks/toast-c9fn075p.js +4 -0
- package/dist/chunks/toast-host-ke5z4ng7.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-5v8ngwj2.js +4 -0
- package/dist/chunks/tree-mdq3v5cw.js +4 -0
- package/dist/chunks/tsMode-sf49ee9x.js +14 -0
- package/dist/chunks/workspace-jtfahpee.js +4 -0
- package/dist/chunks/ws-client-nze0k6mv.js +4 -0
- package/dist/iframe-entry.js +16 -16
- package/dist/manifest.json +63 -63
- package/dist/studio.js +98 -98
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +11 -11
- package/src/about/about-modal.ts +4 -3
- package/src/account/action-flow.ts +45 -38
- package/src/account-status.ts +7 -2
- package/src/browse/library-layouts.ts +8 -5
- package/src/browse/library-model.ts +18 -6
- package/src/browse/library-pane.ts +37 -21
- package/src/browse/library-preview.ts +14 -9
- package/src/browse/library-source.ts +1 -1
- package/src/canvas/asset-refs.ts +24 -9
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +44 -53
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +66 -42
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +163 -64
- package/src/canvas/dialog-path.ts +9 -4
- package/src/canvas/dialog-state.ts +1 -2
- package/src/canvas/diff-marks.ts +9 -16
- package/src/canvas/diff-toolbar.ts +8 -7
- package/src/canvas/edit-width-drag.ts +4 -1
- package/src/canvas/edit-width.ts +1 -3
- package/src/canvas/iframe-channel.ts +27 -13
- package/src/canvas/iframe-drop.ts +13 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +80 -63
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +203 -118
- package/src/canvas/iframe-inline-edit.ts +69 -32
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +37 -26
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +18 -15
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +15 -16
- package/src/canvas/iframe-render.ts +41 -36
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +6 -2
- package/src/canvas/path-mapping.ts +19 -12
- package/src/canvas/popover-path.ts +7 -3
- package/src/canvas/popover-state.ts +1 -2
- package/src/canvas/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +2 -1
- package/src/canvas/surface-registry.ts +21 -3
- package/src/collab/collab-commands.ts +7 -2
- package/src/collab/collab-session.ts +84 -45
- package/src/collab/collab-state.ts +4 -3
- package/src/collab/monaco-binding.ts +16 -13
- package/src/collab/monaco-cursors.ts +5 -2
- package/src/commands/budget.ts +3 -3
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +22 -20
- package/src/commands/defaults.ts +4 -1
- package/src/commands/keymap.ts +47 -43
- package/src/commands/levels.ts +3 -3
- package/src/commands/live-context.ts +10 -8
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +12 -10
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +5 -4
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +3 -2
- package/src/content/entry-editor.ts +29 -17
- package/src/content/entry-fields.ts +12 -7
- package/src/content/entry-model.ts +21 -12
- package/src/editor/canvas-context-menu.ts +1 -2
- package/src/editor/canvas-slash-bridge.ts +3 -6
- package/src/editor/content-slice.ts +16 -14
- package/src/editor/context-menu.ts +35 -22
- package/src/editor/convert-targets.ts +30 -35
- package/src/editor/convert-to-component.ts +11 -5
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +21 -22
- package/src/editor/inline-edit-apply.ts +35 -17
- package/src/editor/inline-edit.ts +66 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-zone-action.ts +1 -1
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +87 -47
- package/src/editor/slash-menu.ts +1 -6
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +15 -10
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +77 -36
- package/src/files/files.ts +90 -95
- package/src/files/media-meta.ts +2 -1
- package/src/files/media-paths.ts +6 -1
- package/src/files/serialize-document.ts +2 -2
- package/src/format/constraints.ts +1 -1
- package/src/format/convert-file.ts +27 -13
- package/src/format/format-choices.ts +2 -1
- package/src/format/format-host.ts +76 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +19 -9
- package/src/github/github-publish.ts +24 -20
- package/src/grid/cell-editors.ts +46 -31
- package/src/grid/cell-popovers.ts +5 -3
- package/src/grid/edit-buffer.ts +10 -9
- package/src/grid/grid-controller.ts +20 -22
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -6
- package/src/grid/grid-panel.ts +11 -4
- package/src/grid/grid-source.ts +8 -8
- package/src/grid/grid-view.ts +14 -17
- package/src/grid/redirects-grid.ts +14 -5
- package/src/grid/redirects.ts +16 -14
- package/src/grid/schema-columns.ts +25 -19
- package/src/grid/sources/connector-source.ts +47 -20
- package/src/grid/sources/content-source.ts +25 -24
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +55 -34
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +1 -2
- package/src/media/media-pane.ts +4 -1
- package/src/new-project/add-repo-modal.ts +20 -19
- package/src/new-project/import-tab.ts +10 -14
- package/src/new-project/location-fields.ts +2 -1
- package/src/new-project/new-project-modal.ts +12 -9
- package/src/packages/jxsuite-update.ts +4 -3
- package/src/packages/pull-package-sync.ts +26 -25
- package/src/page-params.ts +97 -68
- package/src/panels/activity-panel.ts +17 -9
- package/src/panels/ai-chat/attached-context.ts +13 -7
- package/src/panels/ai-chat/chat-view.ts +80 -73
- package/src/panels/ai-chat/composer.ts +30 -33
- package/src/panels/ai-chat/sessions-view.ts +1 -2
- package/src/panels/ai-panel.ts +23 -20
- package/src/panels/block-action-bar.ts +46 -35
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +31 -24
- package/src/panels/data-explorer.ts +62 -25
- package/src/panels/data-grid.ts +14 -11
- package/src/panels/dnd.ts +108 -118
- package/src/panels/editors.ts +55 -22
- package/src/panels/elements-panel.ts +10 -3
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +76 -51
- package/src/panels/frontmatter-fields.ts +24 -19
- package/src/panels/frontmatter-panel.ts +44 -34
- package/src/panels/git-diff-open.ts +4 -4
- package/src/panels/git-panel.ts +49 -61
- package/src/panels/head-panel.ts +131 -111
- package/src/panels/i18n-panel.ts +10 -3
- package/src/panels/imports-panel.ts +23 -47
- package/src/panels/jump-bar.ts +48 -29
- package/src/panels/layers-panel.ts +97 -74
- package/src/panels/left-panel.ts +3 -3
- package/src/panels/pane-context.ts +31 -22
- package/src/panels/pane-grid.ts +49 -20
- package/src/panels/panel-registry.ts +22 -37
- package/src/panels/properties-panel.ts +175 -121
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +3 -3
- package/src/panels/seo-modal.ts +13 -17
- package/src/panels/settings-menu.ts +15 -15
- package/src/panels/signals-panel.ts +153 -131
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +254 -216
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +57 -54
- package/src/panels/stylebook-layers-panel.ts +9 -9
- package/src/panels/stylebook-panel.ts +13 -17
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +36 -26
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +58 -30
- package/src/platforms/cloud.ts +345 -175
- package/src/platforms/default-platform.ts +10 -4
- package/src/platforms/devserver.ts +174 -127
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +8 -2
- package/src/publish/pages-service.ts +28 -13
- package/src/publish/publish-commands.ts +5 -4
- package/src/publish/publish-panel.ts +10 -6
- package/src/recent-projects.ts +15 -8
- package/src/resize-edges.ts +26 -36
- package/src/services/a11y-report.ts +26 -19
- package/src/services/agent-seed.ts +23 -11
- package/src/services/ai-ask.ts +9 -12
- package/src/services/ai-command-tools.ts +68 -62
- package/src/services/ai-import-tools.ts +80 -67
- package/src/services/ai-models.ts +17 -13
- package/src/services/ai-project-tools.ts +68 -32
- package/src/services/ai-session-store.ts +19 -10
- package/src/services/ai-system-prompt.ts +46 -20
- package/src/services/ai-tools.ts +71 -27
- package/src/services/ai-write-report.ts +20 -12
- package/src/services/ai-writes.ts +4 -4
- package/src/services/automation.ts +58 -31
- package/src/services/cem-export.ts +149 -58
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- package/src/services/context-manager.ts +14 -10
- package/src/services/context-resolver.ts +20 -8
- package/src/services/data-service.ts +19 -15
- package/src/services/directory-picker.ts +18 -12
- package/src/services/document-assistant.ts +39 -19
- package/src/services/gated-registry.ts +10 -6
- package/src/services/harness/chat-reducer.ts +23 -1
- package/src/services/import-client.ts +91 -38
- package/src/services/import-seed.ts +8 -2
- package/src/services/jx-validate.ts +28 -31
- package/src/services/live-preview.ts +0 -0
- package/src/services/live-surfaces.ts +6 -3
- package/src/services/model-uri.ts +10 -2
- package/src/services/module-preloads.ts +12 -8
- package/src/services/monaco-buffer.ts +43 -24
- package/src/services/monaco-lazy.ts +7 -8
- package/src/services/monaco-setup.ts +23 -16
- package/src/services/notify.ts +44 -17
- package/src/services/popover-report.ts +25 -10
- package/src/services/preview-eval.ts +20 -8
- package/src/services/profile.ts +13 -6
- package/src/services/project-path.ts +13 -10
- package/src/services/references.ts +0 -0
- package/src/services/render-critic.ts +8 -7
- package/src/services/settings/kernel.ts +13 -4
- package/src/services/settings/write-queue.ts +9 -9
- package/src/services/token-lint.ts +12 -10
- package/src/services/tool-executor.ts +17 -5
- package/src/services/tool-outcomes.ts +44 -24
- package/src/services/trusted-types.ts +24 -7
- package/src/settings/contexts-section.ts +11 -8
- package/src/settings/contributed-section.ts +79 -60
- package/src/settings/css-vars-editor.ts +37 -16
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +23 -13
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +11 -8
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +9 -6
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +1 -1
- package/src/settings/schema-field-ui.ts +9 -0
- package/src/settings/settings-document.ts +5 -5
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +104 -81
- package/src/site-context.ts +37 -22
- package/src/state.ts +41 -49
- package/src/store.ts +54 -34
- package/src/studio.ts +39 -77
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +6 -7
- package/src/style/token-ref.ts +5 -4
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +31 -36
- package/src/surfaces/ai-credentials-form.ts +6 -16
- package/src/surfaces/ai-managed-connect.ts +3 -4
- package/src/surfaces/ai-model-picker.ts +3 -5
- package/src/surfaces/block-action-bar.ts +22 -11
- package/src/surfaces/boot-failure.ts +4 -5
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.ts +12 -11
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/commandbar.ts +14 -9
- package/src/surfaces/convert-repeater.ts +17 -19
- package/src/surfaces/data-actions.ts +9 -7
- package/src/surfaces/dialog.ts +26 -28
- package/src/surfaces/diff-toolbar.ts +9 -7
- package/src/surfaces/doc-header.ts +10 -19
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.ts +14 -11
- package/src/surfaces/expression-editor.ts +11 -25
- package/src/surfaces/files-panel.ts +27 -14
- package/src/surfaces/formula-palette.ts +4 -5
- package/src/surfaces/git-panel.ts +7 -15
- package/src/surfaces/github-auth.ts +16 -20
- package/src/surfaces/github-publish.ts +17 -22
- package/src/surfaces/grid-cell.ts +30 -31
- package/src/surfaces/grid-open.ts +10 -14
- package/src/surfaces/grid-panel.ts +13 -9
- package/src/surfaces/grid-replace.ts +13 -13
- package/src/surfaces/grid-views.ts +15 -18
- package/src/surfaces/inspector-dock.ts +13 -12
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.ts +25 -20
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.ts +11 -10
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/menu.ts +29 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.ts +20 -25
- package/src/surfaces/pane-grid.ts +15 -10
- package/src/surfaces/panel-activity.ts +5 -6
- package/src/surfaces/panel-data.ts +3 -4
- package/src/surfaces/panel-deploy-checklist.ts +5 -6
- package/src/surfaces/panel-elements.ts +5 -7
- package/src/surfaces/panel-i18n.ts +5 -7
- package/src/surfaces/panel-imports.ts +6 -13
- package/src/surfaces/panel-outline.ts +25 -19
- package/src/surfaces/panel-page.ts +11 -18
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.ts +20 -34
- package/src/surfaces/panel-stylebook-layers.ts +5 -8
- package/src/surfaces/preferences.ts +21 -11
- package/src/surfaces/progress-modal.ts +15 -9
- package/src/surfaces/properties-panel.json +1 -1
- package/src/surfaces/properties-panel.ts +20 -42
- package/src/surfaces/publish.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.json +126 -73
- package/src/surfaces/rail.ts +38 -12
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.ts +15 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.ts +14 -10
- package/src/surfaces/settings-css-vars.ts +5 -12
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.ts +8 -15
- package/src/surfaces/settings-extensions.ts +5 -6
- package/src/surfaces/settings-head.ts +33 -39
- package/src/surfaces/settings-locales.ts +8 -20
- package/src/surfaces/settings-overview.ts +5 -6
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.ts +9 -18
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/slash-menu.ts +19 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +17 -14
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +5 -7
- package/src/tabs/patch-ops.ts +4 -3
- package/src/tabs/project-config.ts +32 -21
- package/src/tabs/selection.ts +36 -8
- package/src/tabs/tab.ts +52 -41
- package/src/tabs/transact.ts +98 -53
- package/src/tabs/typing.ts +31 -0
- package/src/types.ts +32 -17
- package/src/ui/ai-credentials-form.ts +10 -13
- package/src/ui/ai-model-picker.ts +3 -3
- package/src/ui/cf-account-picker.ts +7 -9
- package/src/ui/color-selector.ts +9 -5
- package/src/ui/dynamic-slot.ts +7 -8
- package/src/ui/expression-editor.ts +112 -105
- package/src/ui/form-controls.ts +57 -48
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +44 -31
- package/src/ui/media-picker.ts +18 -9
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +7 -6
- package/src/ui/schema-form.ts +113 -70
- package/src/ui/surface.ts +71 -8
- package/src/ui/timing.ts +9 -0
- package/src/ui/value-source.ts +44 -31
- package/src/ui/virtual-window.ts +3 -2
- package/src/utils/base64.ts +3 -1
- package/src/utils/edit-display.ts +103 -74
- package/src/utils/element-selectors.ts +3 -2
- package/src/utils/google-fonts.ts +15 -14
- package/src/utils/inherited-style.ts +18 -20
- package/src/utils/link-target.ts +1 -1
- package/src/utils/preview-format.ts +25 -3
- package/src/utils/strip-events.ts +49 -22
- package/src/utils/studio-utils.ts +29 -14
- package/src/view.ts +2 -3
- package/src/workspace/pane-derive.ts +10 -12
- package/src/workspace/session.ts +53 -43
- package/src/workspace/workspace.ts +47 -36
- package/dist/chunks/2020-nkxms0ay.js +0 -4
- package/dist/chunks/adapter-m948ab5f.js +0 -4
- package/dist/chunks/cf-account-picker-n8hr38v7.js +0 -4
- package/dist/chunks/cf-settings-356xdtne.js +0 -4
- package/dist/chunks/color-area-jqhna8zy.js +0 -4
- package/dist/chunks/color-field-embq5ctg.js +0 -4
- package/dist/chunks/color-fpezvnkt.js +0 -4
- package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
- package/dist/chunks/combobox-773hdzyj.js +0 -4
- package/dist/chunks/components-yk3t844e.js +0 -4
- package/dist/chunks/content-source-bawmyc09.js +0 -4
- package/dist/chunks/convert-to-repeater-7wns8kf1.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-6sc8nacq.js +0 -4
- package/dist/chunks/entry-commands-8ay9fh81.js +0 -4
- package/dist/chunks/extension-sections-na7rj3nr.js +0 -4
- package/dist/chunks/file-ops-gye0qw56.js +0 -4
- package/dist/chunks/files-dmc2xvcq.js +0 -4
- package/dist/chunks/format-host-t76b53f8.js +0 -4
- package/dist/chunks/fs-events-cg4tpz06.js +0 -4
- package/dist/chunks/git-panel-yef7bshy.js +0 -4
- package/dist/chunks/grid-view-7tt4bxw1.js +0 -51
- package/dist/chunks/icons-qbh8akb1.js +0 -4
- package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
- package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
- package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
- package/dist/chunks/iframe-host-tmz30gfp.js +0 -4
- package/dist/chunks/index-nag78a9h.js +0 -4
- package/dist/chunks/jsonMode-zhwsprqk.js +0 -13
- package/dist/chunks/jx-validate-3gbp5nkn.js +0 -4
- package/dist/chunks/layers-fvz99859.js +0 -4
- package/dist/chunks/layers-panel-gchmbf9p.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-9agdspkt.js +0 -4
- package/dist/chunks/media-picker-rhjvyy00.js +0 -4
- package/dist/chunks/menu-2e4y9j7b.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/monaco-binding-2jnhjjvr.js +0 -4
- package/dist/chunks/monaco-buffer-rp21359g.js +0 -4
- package/dist/chunks/monaco-setup-vhh7gayr.js +0 -4
- package/dist/chunks/notify-h3www560.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-hz34wcd7.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-exsmjzyj.js +0 -4
- package/dist/chunks/quick-search-pgaqeh0m.js +0 -4
- package/dist/chunks/references-2cgdxnb8.js +0 -4
- package/dist/chunks/right-panel-jf856w5w.js +0 -4
- package/dist/chunks/section-registry-jnf8r5gy.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0f55h9ye.js +0 -5
- package/dist/chunks/studio-0sqdhnew.js +0 -12
- package/dist/chunks/studio-19x1c75w.js +0 -5
- package/dist/chunks/studio-2sqcndak.js +0 -5
- package/dist/chunks/studio-3aey7dd3.js +0 -5
- package/dist/chunks/studio-3bpdkq2s.js +0 -5
- package/dist/chunks/studio-47y6fbpf.js +0 -5
- package/dist/chunks/studio-4m3826v2.js +0 -5
- package/dist/chunks/studio-4nx2dj1g.js +0 -4
- package/dist/chunks/studio-4xv5s47r.js +0 -9
- package/dist/chunks/studio-5g4t8v6w.js +0 -5
- package/dist/chunks/studio-5py436sf.js +0 -5
- package/dist/chunks/studio-77kt594t.js +0 -5
- package/dist/chunks/studio-8f87n763.js +0 -10
- package/dist/chunks/studio-8mb00b84.js +0 -5
- package/dist/chunks/studio-8p51gq2h.js +0 -6
- package/dist/chunks/studio-954ds834.js +0 -5
- package/dist/chunks/studio-9ft45c83.js +0 -9
- package/dist/chunks/studio-a2138x5k.js +0 -7
- package/dist/chunks/studio-a9yzstqj.js +0 -5
- package/dist/chunks/studio-acdksxx6.js +0 -5
- package/dist/chunks/studio-ar8jcf2y.js +0 -5
- package/dist/chunks/studio-bmn4mn9j.js +0 -7
- package/dist/chunks/studio-e7xxa0sj.js +0 -5
- package/dist/chunks/studio-ecaz25vk.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-fzdywr6p.js +0 -9
- package/dist/chunks/studio-g5fmf0c1.js +0 -5
- package/dist/chunks/studio-g7nse7zb.js +0 -5
- package/dist/chunks/studio-geq1ea6k.js +0 -14
- package/dist/chunks/studio-ghkb32r8.js +0 -5
- package/dist/chunks/studio-ghrhy2y7.js +0 -5
- package/dist/chunks/studio-grawhey1.js +0 -5
- package/dist/chunks/studio-h0xgswew.js +0 -5
- package/dist/chunks/studio-h9c4p2tx.js +0 -5
- package/dist/chunks/studio-jyzj5cxs.js +0 -5
- package/dist/chunks/studio-mgx8yhnz.js +0 -64
- package/dist/chunks/studio-mpb04y1d.js +0 -6
- package/dist/chunks/studio-n17mty64.js +0 -5
- package/dist/chunks/studio-nwh2eqsk.js +0 -6
- package/dist/chunks/studio-q1h883bt.js +0 -16
- package/dist/chunks/studio-q4tv82h7.js +0 -9
- package/dist/chunks/studio-qpqa7vk3.js +0 -5
- package/dist/chunks/studio-qqz8e5gk.js +0 -5
- package/dist/chunks/studio-qvasen3f.js +0 -5
- package/dist/chunks/studio-rggdb3hm.js +0 -5
- package/dist/chunks/studio-sghy936h.js +0 -4
- package/dist/chunks/studio-skprc6ef.js +0 -5
- package/dist/chunks/studio-tt2nactf.js +0 -5
- package/dist/chunks/studio-tyasmc39.js +0 -5
- package/dist/chunks/studio-vk9ezads.js +0 -5
- package/dist/chunks/studio-vzacdfsc.js +0 -4
- package/dist/chunks/studio-w4c0xmrw.js +0 -5
- package/dist/chunks/studio-wfjqhhbk.js +0 -5
- package/dist/chunks/studio-wgh5kxpj.js +0 -5
- package/dist/chunks/studio-xasj0796.js +0 -5
- package/dist/chunks/studio-y78s8r2n.js +0 -5
- package/dist/chunks/studio-z8w183sh.js +0 -5
- package/dist/chunks/studio-zscd9ty4.js +0 -928
- package/dist/chunks/studio-zxp13sss.js +0 -7
- package/dist/chunks/studio-zygnmm01.js +0 -5
- package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
- package/dist/chunks/tabs-jwthg40w.js +0 -4
- package/dist/chunks/textfield-spy3hc77.js +0 -4
- package/dist/chunks/toast-4d35zd64.js +0 -4
- package/dist/chunks/toast-host-8sjmfed3.js +0 -4
- package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
- package/dist/chunks/tree-h19v1jfz.js +0 -4
- package/dist/chunks/tsMode-gr0m4dzr.js +0 -14
- package/dist/chunks/workspace-m15qtcqp.js +0 -4
- package/dist/chunks/ws-client-nf61frr1.js +0 -4
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
function i(n){return typeof n==="string"}function ee(n){return typeof n==="number"}function at(n){return typeof n==="boolean"}function yR(n){return typeof n==="bigint"}function _g(n){return typeof n==="symbol"}function te(n){return typeof n==="function"}function T(n){return typeof n==="object"&&n!==null}function $h(n){return n===null||i(n)||ee(n)||at(n)}function w(n){return typeof n==="object"&&n!==null&&!Array.isArray(n)}function He(n){return w(n)&&typeof n.$ref==="string"}function ca(n){return w(n)&&n.$prototype==="Function"}function wl(n){return w(n)&&w(n.$expression)}function xv(n){return wl(n)&&Array.isArray(n.parameters)&&n.parameters.length>0}function fk(n){return ca(n)&&Array.isArray(n.body)}function Sg(n){return w(n)&&typeof n.$prototype==="string"&&n.$prototype!=="Function"}function mk(n){return w(n)&&n.timing==="server"&&typeof n.$src==="string"&&typeof n.$export==="string"&&!n.$prototype}function Ro(n){return w(n)&&n.$prototype==="Array"}function Qn(n){return w(n)}function da(n){return typeof n==="string"&&n.includes("${")}function gk(n){return/\breturn\b[^\S\n]*(?![;}\s]|$)/.test(n)}function Pa(n){return typeof n==="object"&&n!==null&&!Array.isArray(n)}function Xi(n,e){let t=n?.[e];return Pa(t)?t:void 0}function dc(n,e){let t=n[e];if(Pa(t))return t;let r={};return n[e]=r,r}function Rh(n){return He(n)||ca(n)||wl(n)}function ff(n,e){let t=n[e];return Rh(t)?t:void 0}function _v(n){if(!n)return[];return n.map((e)=>i(e)?e:e.name)}function o(n){return typeof n==="string"}function cu(n){if(typeof n!=="object"||n===null||Array.isArray(n)||!w(n.$expression))return!1;let e=n.$expression;if(e.operator==="?:")return typeof e.value==="string"&&typeof e.initial==="string";if(e.operator==="switch")return w(e.cases)&&Object.values(e.cases).every((t)=>i(t))&&typeof e.default==="string";return!1}function bk(n){if(o(n))return[n];if(!cu(n))return[];let e=n.$expression;if(e.operator==="?:")return[...new Set([e.value,e.initial])];return[...new Set([...Object.values(e.cases),e.default])]}function Ze(n){return o(n)?n:bk(n).join("|")}function mf(n){return n.startsWith("#")}
|
|
2
|
+
export{i,ee,at,yR,_g,te,T,$h,w,He,ca,wl,xv,fk,Sg,mk,Ro,Qn,da,gk,Pa,Xi,dc,Rh,ff,_v,cu,bk,Ze,mf};
|
|
3
|
+
|
|
4
|
+
//# debugId=D9DA7408CE9720F064756E2164756E21
|
|
5
|
+
//# sourceMappingURL=studio-cffqvnzd.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
var dk="content",S_=/^[\w.~-]+$/,cc="{locale}";function u(t){let n=t.replaceAll("\\","/");return n.length>1&&n.endsWith("/")?n.slice(0,-1):n}function p(t){let n=u(t);return n.startsWith("/")?n:`/${n}`}function f(t,n){return[...t].toSorted((e,s)=>s[n].length-e[n].length)}function g(t,n){return t===n||t.startsWith(`${n}/`)}function lR(t,n){let e=u(n);for(let s of f(t,"dir")){let r=u(s.dir);if(!g(e,r)||e===r)continue;let o=e.slice(r.length+1),{filter:i}=s;if(i&&!i(o))return null;let l=o.split("/").map((c)=>encodeURIComponent(c)).join("/");return`${p(s.urlPrefix)}/${l}`}return null}function h(t,n){let e=n.split("#")[0].split("?")[0];if(!e.startsWith("/"))return null;let s;try{s=decodeURIComponent(e)}catch{return null}if(/%2e|%2f/i.test(s))return null;for(let r of f(t,"urlPrefix")){let o=p(r.urlPrefix);if(!s.startsWith(`${o}/`))continue;let l=s.slice(o.length+1).split("/");if(l.some((a)=>a===""||a==="."||a===".."))return null;let{filter:c}=r;if(c&&!c(l.join("/")))return null;return`${u(r.dir)}/${l.join("/")}`}return null}var m=String.raw`"'\s<>()\\`;var pf="public";var cR=["mounts","public"];function mv(t){let n=t.search(/[#?]/);return n===-1?{path:t,suffix:""}:{path:t.slice(0,n),suffix:t.slice(n)}}function uk(t){return t===""||t.startsWith("/")||t.startsWith("#")||t.includes("${")||/^[a-z][\w+.-]*:/i.test(t)}function yi(t){return t.replaceAll("\\","/").replace(/^\.\//,"").replace(/^\/+/,"").replace(/\/+$/,"")}function dR(t){let n=yi(t),e=n.lastIndexOf("/");return e===-1?"":n.slice(0,e)}function hk(t,n){let s=(t===""||t==="."?[]:yi(t).split("/")).filter((r)=>r!==""&&r!==".");for(let r of n.replaceAll("\\","/").split("/")){if(r===""||r===".")continue;if(r===".."){if(s.length===0)return null;s.pop();continue}s.push(r)}return s.join("/")}function d(t,n,e){let{path:s}=mv(t);if(!s.startsWith("/"))return[];let r;try{r=decodeURIComponent(s)}catch{return[]}if(/%2e|%2f/i.test(r))return[];let o=r.replace(/^\/+/,"");if(o===""||o.split("/").some((l)=>l==="."||l===".."))return[];let i=[];for(let l of e){if(l==="mounts"){let c=h(n,s);if(c!==null&&!c.startsWith("/")&&!/^[A-Za-z]:/.test(c))i.push(yi(c));continue}i.push(l==="root"?o:`${pf}/${o}`)}return[...new Set(i)]}function uR(t,n,e,s){let{path:r}=mv(t);if(r==="")return null;if(uk(t))return r.startsWith("/")?d(r,e,s)[0]??null:null;if(r.endsWith("/"))return null;let o;try{o=decodeURIComponent(r)}catch{return null}let i=hk(n,o);if(i===null||i===""||i===yi(n))return null;return i}function yg(t){return t.split("/").map((n)=>encodeURIComponent(n)).join("/")}function hR(t){let n=[],e=0;while(e<t.length){while(e<t.length&&(/\s/.test(t[e])||t[e]===","))e+=1;if(e>=t.length)break;let s=e;while(e<t.length&&!/\s/.test(t[e]))e+=1;let r=t.slice(s,e);if(r.endsWith(",")){n.push({descriptor:"",url:r.replace(/,+$/,"")});continue}while(e<t.length&&/\s/.test(t[e]))e+=1;let o=e;while(e<t.length&&t[e]!==",")e+=1;let i=t.slice(o,e).trim();if(e+=1,r=r.replace(/,+$/,""),r!=="")n.push({descriptor:i,url:r})}return n}function pR(t){return t.map(({url:n,descriptor:e})=>e?`${n} ${e}`:n).join(", ")}
|
|
2
|
+
export{dk,S_,cc,lR,pf,cR,mv,uk,yi,dR,hk,uR,yg,hR,pR};
|
|
3
|
+
|
|
4
|
+
//# debugId=095AF82E97C7BA8964756E2164756E21
|
|
5
|
+
//# sourceMappingURL=studio-d81xfh1g.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
var s=new Set(["project.schema.json","document.schema.json"]);function pk(e){return s.has(e)?`file:///.jx/generated/${e}`:`file:///${e}`}function mR(e,r){return{head:`file:///.jx/diff/${e}/head/${r}`,work:`file:///.jx/diff/${e}/work/${r}`}}function gR(e){switch(e.slice(e.lastIndexOf(".")+1).toLowerCase()){case"cjs":case"js":case"mjs":return"javascript";case"css":return"css";case"htm":case"html":return"html";case"json":return"json";case"md":return"markdown";case"cts":case"mts":case"ts":return"typescript";case"yaml":case"yml":return"yaml";default:return"plaintext"}}
|
|
2
|
+
export{pk,mR,gR};
|
|
3
|
+
|
|
4
|
+
//# debugId=0860FC577CF211B664756E2164756E21
|
|
5
|
+
//# sourceMappingURL=studio-dgz8d0c1.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{Oe,qp,Y,Ye,zc,w$,Zy,x$,Xy,_$,na,k$,E$,T$,ct,iv,h_,Zd,Qm,rv,h}from"./studio-24mccdrj.js";import{xe,oe,v}from"./studio-wz73q5kq.js";import{la,ae}from"./studio-v8aga3vp.js";import{zl,um,zu,Fw,vp,jw,jE,wp,hm,Ul,Uu,Ib,kd,Hw,Bw,Vw,CS,xp,kS,nl,Db,ES,Ww,$S}from"./studio-amsbaaar.js";import{Y$,X$,I,A,Hn}from"./studio-2jbs3rxv.js";import{Lr,mx,$d,rC,Nc,qu,Ku,Rd,Id,Oc}from"./studio-zq4z6tm6.js";import{ki,ih,ko,Hx}from"./studio-se2r3ptc.js";import{Bt}from"./studio-1fxkaaea.js";import{Hi,ro,Ly,Zx,x}from"./studio-ynn90f58.js";import{jc,ea,Nm}from"./studio-zp7snvkq.js";import{Bu,Nw}from"./studio-6ep3js6b.js";import{lo,W1,nf,q1,av,lv,W$,Bi,ls}from"./studio-c7q0t9x1.js";import{Te,ne}from"./studio-y21g8zzg.js";import{i,ee,T,w,He,ca,wl,Qn,Pa,Xi,ff,Ze}from"./studio-cffqvnzd.js";var Ge={$schema:"https://jxsuite.com/schema/v1",$id:"StudioLogicPanel",$description:"The Inspector's **Logic** tab — everything about how the selected element BEHAVES, as a Jx document over the kit. The Inspector is split by task rather than by data type (§6): wiring a `$switch`, wiring a repeater to a collection and wiring a click handler are one job, and they were three, split across two tabs because a `$switch` is stored as a property and a click handler as a property-shaped function. So there are four sections here — Repeating list, Condition, Events, and a custom element's outward contract (Observed Attributes · CSS Properties · CSS Parts) — and each of them is a projection. The adapter (`panels/events-panel.ts`) keeps every decision: what the selection is, which rungs a position permits, what a handler currently holds, which elements of a multi-selection disagree about a key, and what a commit writes. Nothing here reads the document, asks the schema a question or knows what a Value Source is. Two islands, both through `onNodeCreated` (studio-ui-guidelines.md §9.4): `[part=\"control-host\"]` receives the expression editor, which is a lit surface of its own, and `[part=\"statements-host\"]` receives the `statements` surface, which is a mounted document of its own. Every bindable row carries `data-prop`, which is what `inspector/field:<prop>` addresses.",tagName:"div",attributes:{part:"logic"},style:{$description:"The tab's own layout, and nothing else. `.style-sidebar` and `.style-section-body` are NOT transcribed: the first was a scroll container the dock already provides, and the second existed to put padding inside a Spectrum accordion item, which `jx-accordion-item` does itself. What is left is the two vocabularies this tab has that no other surface does — a declared event, and an event binding — plus the one empty state a document cannot borrow from `panels/empty-state.ts`.",display:"block",minWidth:"0",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",color:"var(--fg)",'& [part="empty"]':{$description:"The one empty-state pattern (studio-ui-guidelines.md §11.2), drawn here because a document cannot render a lit helper. It is a copy rather than a move — every panel still lit renders through that helper — and it goes when the last of them converts.",display:"flex",flexDirection:"column",alignItems:"center",gap:"var(--jx-space-3)",padding:"var(--jx-space-6)",textAlign:"center",fontSize:"var(--jx-text-md)",color:"var(--fg-dim)"},'& [part="empty-message"]':{margin:"0",maxWidth:"34ch",lineHeight:"1.5"},'& [part="section-body"]':{display:"flex",flexDirection:"column",gap:"var(--jx-space-2)",minWidth:"0"},'& [part="field"]':{minWidth:"0"},'& [part="field"] > [part="label"]:empty':{$description:"A row whose control names itself — an expression editor draws its own Operator / Target / Value rows — has no second label to draw. `jx-field` takes the empty label out of the accessible name by leaving it empty; this takes it out of the layout.",display:"none"},'& [part="value"]':{display:"flex",alignItems:"center",gap:"var(--jx-space-2)",minWidth:"0"},'& [part="widget"]':{flex:"1 1 auto",minWidth:"0"},'& [part="control-host"]':{display:"block",minWidth:"0"},'& [part="subhead"]':{margin:"var(--jx-space-2) 0 0",fontSize:"var(--jx-text-sm)",fontWeight:"600",color:"var(--fg-dim)"},'& [part="case"]':{display:"flex",alignItems:"center",gap:"var(--jx-space-2)",minWidth:"0"},'& [part="case-name"]':{flex:"1 1 auto",minWidth:"0"},'& [part="declared"]':{display:"flex",flexDirection:"column",gap:"var(--jx-space-1)",minWidth:"0"},'& [part="declared-row"]':{display:"flex",alignItems:"baseline",gap:"var(--jx-space-2)",minWidth:"0",fontSize:"var(--jx-text-sm)"},'& [part="event-code"]':{fontFamily:"var(--font-mono, monospace)",color:"var(--accent)"},'& [part="declared-from"]':{color:"var(--fg-dim)"},'& [part="event-type"]':{marginInlineStart:"auto",color:"var(--fg-dim)",fontFamily:"var(--font-mono, monospace)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},'& [part="binding"]':{$description:"One `on*` key and whatever produces it. A box, for the reason a statement card is one: a handler CONTAINS a body, and the border is what says where one binding stops and the next begins.",boxSizing:"border-box",display:"flex",flexDirection:"column",gap:"var(--jx-space-2)",minWidth:"0",padding:"var(--jx-space-2)",border:"1px solid var(--jx-border)",borderRadius:"var(--jx-radius-sm)"},'& [part="binding-head"]':{display:"flex",alignItems:"center",gap:"var(--jx-space-2)",minWidth:"0"},'& [part="event-name"]':{flex:"1 1 auto",minWidth:"0"},'& [part="binding-body"]':{display:"flex",flexDirection:"column",gap:"var(--jx-space-2)",minWidth:"0"},'& [part="body-toggle"]':{display:"flex",justifyContent:"flex-end",minWidth:"0"},'& [part="body-row"]':{display:"flex",alignItems:"flex-start",gap:"var(--jx-space-2)",minWidth:"0"},'& [part="body-field"], & [part="expression-host"], & [part="statements-host"]':{flex:"1 1 auto",minWidth:"0"},'& [part="kv"]':{display:"flex",alignItems:"baseline",gap:"var(--jx-space-2)",minWidth:"0",fontSize:"var(--jx-text-sm)"},'& [part="kv-name"]':{fontFamily:"var(--font-mono, monospace)",color:"var(--fg)"},'& [part="kv-detail"], & [part="kv-value"], & [part="kv-tags"]':{color:"var(--fg-dim)"},'& [part="kv-value"]':{marginInlineStart:"auto",fontFamily:"var(--font-mono, monospace)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},'& [part="empty-actions"]':{display:"flex",flexWrap:"wrap",justifyContent:"center",gap:"var(--jx-space-2)"}},children:[{tagName:"div",attributes:{part:"body-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/state"},cases:{empty:{tagName:"div",attributes:{part:"empty"},children:[{tagName:"p",attributes:{part:"empty-message"},textContent:"${state.emptyMessage}"},{tagName:"div",attributes:{part:"empty-actions-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/hasEmptyActions"},cases:{true:{tagName:"div",attributes:{part:"empty-actions"},children:[{$prototype:"Array",items:{$ref:"#/state/emptyActions"},key:{$ref:"$map/item/id"},map:{tagName:"jx-button",attributes:{part:"empty-action"},$props:{size:"sm"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/runEmptyAction"},value:[{$ref:"$map/item/id"}]}]},children:[{tagName:"span",textContent:"${$map.item.label}"}]}}]}}}]},ready:{tagName:"jx-accordion",attributes:{part:"sections"},$props:{multiple:!0},children:[{$description:'Repeating list. Filter and Sort are always drawn: they used to hide behind `+ Add filter`, which seeded `{ $ref: "#/state/" }` — a binding to the empty pointer, which is not a signal — so the row opened already bound to nothing and the only way to type a literal was to cycle the mode ring twice (§6.6). A repeater has exactly three inputs, and an empty row states that better than a button does.',tagName:"div",attributes:{part:"repeater-slot",role:"none",hidden:"${state.hasRepeater ? null : ''}"},style:{display:"contents"},$switch:{$ref:"#/state/hasRepeater"},cases:{true:{tagName:"jx-accordion-item",attributes:{"data-section":"repeater"},$props:{label:"Repeating list",open:{$ref:"#/state/repeaterOpen"}},ontoggle:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setSection"},value:["repeater",{$ref:"event#/detail"}]}]},children:[{tagName:"div",attributes:{part:"section-body"},children:[{$prototype:"Array",items:{$ref:"#/state/repeaterFields"},key:{$ref:"$map/item/key"},map:{$description:"A bindable value as a first-class field row. Every position it serves is a single-line expression — a collection, a filter, a sort key, a `$switch` — so it draws one widget rather than dispatching over a widget type: the textarea and checkbox arms the lit version carried had no caller in either tab. The set dot clears the position outright and is disabled where the position is mandatory; the source chip opens the rung picker rather than cycling, so any rung the position permits is one action away (§6.6).",tagName:"jx-field",attributes:{part:"field","data-prop":"${$map.item.prop}"},$props:{label:{$ref:"$map/item/label"},span:!0},children:[{tagName:"div",attributes:{part:"value"},children:[{tagName:"jx-action-button",attributes:{part:"source","data-source":"${$map.item.source}"},$props:{size:"sm",quiet:!0,haspopup:"menu",label:"${$map.item.sourceHint}",disabled:{$ref:"$map/item/sourceLocked"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/pickSource"},value:[{$ref:"$map/item/key"},{$ref:"event#/currentTarget"}]}]},children:[{tagName:"span",textContent:"${$map.item.sourceLabel}"}]},{tagName:"div",attributes:{part:"widget",role:"none"},$switch:{$ref:"$map/item/kind"},cases:{control:{tagName:"div",attributes:{part:"control-host","data-field":"${$map.item.key}"}},text:{tagName:"jx-textfield",attributes:{part:"text"},$props:{size:"sm",label:{$ref:"$map/item/label"},value:{$ref:"$map/item/value"},placeholder:{$ref:"$map/item/placeholder"},mono:{$ref:"$map/item/mono"}},oninput:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setField"},value:[{$ref:"$map/item/key"},{$ref:"event#/target/value"}]}]}},select:{tagName:"jx-select",attributes:{part:"select"},$props:{size:"sm",label:{$ref:"$map/item/label"},value:{$ref:"$map/item/value"},options:{$ref:"$map/item/options"}},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setField"},value:[{$ref:"$map/item/key"},{$ref:"event#/target/value"}]}]}}}},{tagName:"jx-action-button",attributes:{part:"set"},$props:{size:"sm",quiet:!0,label:"${$map.item.clearTitle}",disabled:{$ref:"$map/item/clearLocked"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/clearField"},value:[{$ref:"$map/item/key"}]}]},children:[{tagName:"jx-dot",attributes:{part:"dot","data-state":"${$map.item.dotState}"},$props:{tone:{$ref:"$map/item/tone"}}}]}]}]}},{tagName:"div",attributes:{part:"template-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/hasTemplate"},cases:{true:{tagName:"jx-action-button",attributes:{part:"edit-template"},$props:{size:"sm",label:"Edit template"},onclick:{$ref:"#/state/editTemplate"},children:[{tagName:"span",textContent:"Edit template →"}]}}}]}]}}},{$description:"Condition. A `$switch` discriminant is a `$ref` and nothing else, so From data… is its only rung — de-escalating it would delete the key and demote the node — and the adapter says so by locking the row's source chip rather than by this document knowing what a `SwitchDef` is.",tagName:"div",attributes:{part:"condition-slot",role:"none",hidden:"${state.hasCondition ? null : ''}"},style:{display:"contents"},$switch:{$ref:"#/state/hasCondition"},cases:{true:{tagName:"jx-accordion-item",attributes:{"data-section":"condition"},$props:{label:"Condition",open:{$ref:"#/state/conditionOpen"}},ontoggle:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setSection"},value:["condition",{$ref:"event#/detail"}]}]},children:[{tagName:"div",attributes:{part:"section-body"},children:[{$prototype:"Array",items:{$ref:"#/state/conditionFields"},key:{$ref:"$map/item/key"},map:{$description:"A bindable value as a first-class field row. Every position it serves is a single-line expression — a collection, a filter, a sort key, a `$switch` — so it draws one widget rather than dispatching over a widget type: the textarea and checkbox arms the lit version carried had no caller in either tab. The set dot clears the position outright and is disabled where the position is mandatory; the source chip opens the rung picker rather than cycling, so any rung the position permits is one action away (§6.6).",tagName:"jx-field",attributes:{part:"field","data-prop":"${$map.item.prop}"},$props:{label:{$ref:"$map/item/label"},span:!0},children:[{tagName:"div",attributes:{part:"value"},children:[{tagName:"jx-action-button",attributes:{part:"source","data-source":"${$map.item.source}"},$props:{size:"sm",quiet:!0,haspopup:"menu",label:"${$map.item.sourceHint}",disabled:{$ref:"$map/item/sourceLocked"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/pickSource"},value:[{$ref:"$map/item/key"},{$ref:"event#/currentTarget"}]}]},children:[{tagName:"span",textContent:"${$map.item.sourceLabel}"}]},{tagName:"div",attributes:{part:"widget",role:"none"},$switch:{$ref:"$map/item/kind"},cases:{control:{tagName:"div",attributes:{part:"control-host","data-field":"${$map.item.key}"}},text:{tagName:"jx-textfield",attributes:{part:"text"},$props:{size:"sm",label:{$ref:"$map/item/label"},value:{$ref:"$map/item/value"},placeholder:{$ref:"$map/item/placeholder"},mono:{$ref:"$map/item/mono"}},oninput:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setField"},value:[{$ref:"$map/item/key"},{$ref:"event#/target/value"}]}]}},select:{tagName:"jx-select",attributes:{part:"select"},$props:{size:"sm",label:{$ref:"$map/item/label"},value:{$ref:"$map/item/value"},options:{$ref:"$map/item/options"}},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setField"},value:[{$ref:"$map/item/key"},{$ref:"event#/target/value"}]}]}}}},{tagName:"jx-action-button",attributes:{part:"set"},$props:{size:"sm",quiet:!0,label:"${$map.item.clearTitle}",disabled:{$ref:"$map/item/clearLocked"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/clearField"},value:[{$ref:"$map/item/key"}]}]},children:[{tagName:"jx-dot",attributes:{part:"dot","data-state":"${$map.item.dotState}"},$props:{tone:{$ref:"$map/item/tone"}}}]}]}]}},{tagName:"p",attributes:{part:"subhead"},textContent:"Cases"},{$prototype:"Array",items:{$ref:"#/state/cases"},key:{$ref:"$map/item/key"},map:{tagName:"jx-field",attributes:{part:"field","data-prop":"${$map.item.prop}"},$props:{label:"Case",span:!0},children:[{tagName:"div",attributes:{part:"case"},children:[{tagName:"jx-textfield",attributes:{part:"case-name"},$props:{size:"sm",label:"Case value",value:{$ref:"$map/item/name"}},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/renameCase"},value:[{$ref:"$map/item/key"},{$ref:"event#/target/value"}]}]}},{tagName:"jx-action-button",attributes:{part:"case-open"},$props:{size:"sm",quiet:!0,icon:"arrow-right",label:"${$map.item.openTitle}"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/openCase"},value:[{$ref:"$map/item/key"}]}]}},{tagName:"jx-action-button",attributes:{part:"case-remove"},$props:{size:"sm",quiet:!0,icon:"trash",label:"${$map.item.removeTitle}"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/removeCase"},value:[{$ref:"$map/item/key"}]}]}}]}]}},{tagName:"jx-action-button",attributes:{part:"add-case"},$props:{size:"sm",quiet:!0,icon:"plus",label:"Add case"},onclick:{$ref:"#/state/addCase"},children:[{tagName:"span",textContent:"Add case"}]}]}]}}},{$description:"Events. A repeater is not an element — it has no `on*` position to bind, and offering Add Event on one writes a handler onto a node the renderer never mounts — so the adapter withholds the whole section rather than this document asking what a repeater is.",tagName:"div",attributes:{part:"events-slot",role:"none",hidden:"${state.hasEvents ? null : ''}"},style:{display:"contents"},$switch:{$ref:"#/state/hasEvents"},cases:{true:{tagName:"jx-accordion-item",attributes:{"data-section":"events"},$props:{label:"Events",open:{$ref:"#/state/eventsOpen"}},ontoggle:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setSection"},value:["events",{$ref:"event#/detail"}]}]},children:[{tagName:"div",attributes:{part:"section-body"},children:[{tagName:"div",attributes:{part:"declared-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/hasDeclared"},cases:{true:{tagName:"div",attributes:{part:"declared"},children:[{tagName:"p",attributes:{part:"subhead"},textContent:"Declared Events"},{$prototype:"Array",items:{$ref:"#/state/declared"},key:{$ref:"$map/item/key"},map:{tagName:"div",attributes:{part:"declared-row",title:"${$map.item.title}"},children:[{tagName:"code",attributes:{part:"event-code"},textContent:"${$map.item.name}"},{tagName:"span",attributes:{part:"declared-from"},textContent:"${$map.item.source}"},{tagName:"span",attributes:{part:"event-type",hidden:"${$map.item.type ? null : ''}"},textContent:"${$map.item.type}"}]}},{tagName:"jx-divider"}]}}},{tagName:"div",attributes:{part:"bindings-head-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/hasBindings"},cases:{true:{tagName:"p",attributes:{part:"subhead"},textContent:"Event Bindings"}}},{$prototype:"Array",items:{$ref:"#/state/bindings"},key:{$ref:"$map/item/key"},map:{$description:"One `on*` key. The Mixed contract (§6.7) splits in two and this row shows both halves: which events exist, how each is produced, and its removal are properties of the BATCH — binding one handler to six buttons is a single decision, so those three controls write to every selected element in one transaction — while what a handler CONTAINS is the PRIMARY's, because six elements do not share one body and broadcasting a keystroke into six of them would destroy five. The dot says `mixed` when the selected elements disagree; the body below it stays the primary's.",tagName:"div",attributes:{part:"binding","data-event":"${$map.item.key}"},children:[{tagName:"div",attributes:{part:"binding-head"},children:[{$description:"The event NAME, and it is free-form rather than a list of ten. The menu offers what this element already binds plus the ten worth suggesting, and its last row asks for any other name through the one prompt dialog Studio has — so `ondragover`, `onpointerdown` and every custom event a component emits are bindable, which is exactly what §6.1 asks for and what the closed picker refused.",tagName:"jx-action-button",attributes:{part:"event-name"},$props:{size:"sm",haspopup:"menu",label:"${$map.item.nameTitle}"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/pickEventName"},value:[{$ref:"$map/item/key"},{$ref:"event#/currentTarget"}]}]},children:[{tagName:"span",textContent:"${$map.item.name}"}]},{$description:'The same ladder every other bindable position in Studio offers, in the same four words. It used to read Inline code / Expression / Existing function — a fourth private dialect for the one ladder §6.6 collapses, so a user who learned "Formula" on a property row met "Expression" here and had no reason to think they were the same thing.',tagName:"jx-action-button",attributes:{part:"event-source","data-source":"${$map.item.source}"},$props:{size:"sm",quiet:!0,haspopup:"menu",label:"${$map.item.sourceHint}"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/pickHandler"},value:[{$ref:"$map/item/key"},{$ref:"event#/currentTarget"}]}]},children:[{tagName:"span",textContent:"${$map.item.sourceLabel}"}]},{tagName:"jx-action-button",attributes:{part:"event-clear"},$props:{size:"sm",quiet:!0,icon:"trash",label:"${$map.item.clearTitle}"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/clearEvent"},value:[{$ref:"$map/item/key"}]}]},children:[{tagName:"jx-dot",attributes:{part:"dot","data-state":"${$map.item.dotState}"},$props:{tone:{$ref:"$map/item/tone"}}}]}]},{tagName:"div",attributes:{part:"binding-body"},children:[{$description:"Statements or Code, for an inline function only. A structured body is a `JxStatement[]` and a code body is a string, so the toggle is a change of REPRESENTATION rather than of view — which is why it is drawn beside the body it rewrites rather than in the source ladder above it.",tagName:"div",attributes:{part:"toggle-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"$map/item/showToggle"},cases:{true:{tagName:"div",attributes:{part:"body-toggle"},children:[{tagName:"jx-action-group",$props:{compact:!0,selects:"single",label:"Handler body"},children:[{tagName:"jx-action-button",attributes:{part:"body-statements"},$props:{size:"sm",label:"Statements",checked:{$ref:"$map/item/statementsChecked"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setBodyMode"},value:[{$ref:"$map/item/key"},"statements"]}]},children:[{tagName:"span",textContent:"Statements"}]},{tagName:"jx-action-button",attributes:{part:"body-code"},$props:{size:"sm",label:"Code",checked:{$ref:"$map/item/codeChecked"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setBodyMode"},value:[{$ref:"$map/item/key"},"code"]}]},children:[{tagName:"span",textContent:"Code"}]}]}]}}},{tagName:"div",attributes:{part:"body-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"$map/item/body"},cases:{statements:{$description:"An island: `surfaces/statements.ts` mounts its own document in here, named by the handler it edits (`inspector/statements:<key>`), because a node with two structured handlers stamped one id on two elements and `resolveRegion` took the second.",tagName:"div",attributes:{part:"statements-host","data-event":"${$map.item.key}"}},code:{tagName:"div",attributes:{part:"body-row"},children:[{tagName:"jx-textfield",attributes:{part:"body-field"},$props:{size:"sm",multiline:!0,grows:!0,mono:!0,label:"Handler body",placeholder:"// handler body",value:{$ref:"$map/item/code"}},oninput:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setCode"},value:[{$ref:"$map/item/key"},{$ref:"event#/target/value"}]}]}},{tagName:"jx-action-button",attributes:{part:"open-editor"},$props:{size:"sm",quiet:!0,icon:"code",label:"${$map.item.openTitle}"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/openEditor"},value:[{$ref:"$map/item/key"}]}]}}]},expression:{tagName:"div",attributes:{part:"body-row"},children:[{tagName:"div",attributes:{part:"expression-host","data-event":"${$map.item.key}"}},{tagName:"jx-action-button",attributes:{part:"open-editor"},$props:{size:"sm",quiet:!0,icon:"align-bottom",label:"${$map.item.openTitle}"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/openEditor"},value:[{$ref:"$map/item/key"}]}]}}]},ref:{tagName:"jx-select",attributes:{part:"event-handler"},$props:{size:"sm",label:"Handler",value:{$ref:"$map/item/refValue"},options:{$ref:"$map/item/refOptions"}},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setHandlerRef"},value:[{$ref:"$map/item/key"},{$ref:"event#/target/value"}]}]}}}}]}]}},{tagName:"jx-action-button",attributes:{part:"add-event"},$props:{size:"sm",quiet:!0,icon:"plus",label:"Add Event"},onclick:{$ref:"#/state/addEvent"},children:[{tagName:"span",textContent:"Add Event"}]}]}]}}},{$description:"The custom element's outward contract: what a page may set from markup, what it may override, and what it may reach into. Three read-only lists — this is a report, not a form — drawn only on a component's root.",tagName:"div",attributes:{part:"observed-slot",role:"none",hidden:"${state.hasObserved ? null : ''}"},style:{display:"contents"},$switch:{$ref:"#/state/hasObserved"},cases:{true:{tagName:"jx-accordion-item",attributes:{"data-section":"observed"},$props:{label:"Observed Attributes",open:{$ref:"#/state/observedOpen"}},ontoggle:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setSection"},value:["observed",{$ref:"event#/detail"}]}]},children:[{tagName:"div",attributes:{part:"section-body"},children:[{tagName:"div",attributes:{part:"observed-empty-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/observedEmpty"},cases:{true:{tagName:"div",attributes:{part:"empty"},children:[{tagName:"p",attributes:{part:"empty-message"},textContent:'Attributes let a page set this component from markup. Name an "attribute" on a data entry to expose it here.'}]}}},{$prototype:"Array",items:{$ref:"#/state/observed"},key:{$ref:"$map/item/key"},map:{$description:"A read-only name and what it maps to. The Content tab had three near-identical hand-written flex rows for these; they are one shape now, and this is it.",tagName:"div",attributes:{part:"kv","data-prop":"${$map.item.prop}"},children:[{tagName:"span",attributes:{part:"kv-name"},textContent:"${$map.item.name}"},{tagName:"span",attributes:{part:"kv-detail",hidden:"${$map.item.detail ? null : ''}"},textContent:"${$map.item.detail}"},{tagName:"span",attributes:{part:"kv-tags",hidden:"${$map.item.tags ? null : ''}"},textContent:"${$map.item.tags}"},{tagName:"span",attributes:{part:"kv-value",hidden:"${$map.item.value ? null : ''}"},textContent:"${$map.item.value}"}]}}]}]}}},{tagName:"div",attributes:{part:"cssprops-slot",role:"none",hidden:"${state.hasCssProps ? null : ''}"},style:{display:"contents"},$switch:{$ref:"#/state/hasCssProps"},cases:{true:{tagName:"jx-accordion-item",attributes:{"data-section":"cssprops"},$props:{label:"CSS Properties",open:{$ref:"#/state/cssPropsOpen"}},ontoggle:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setSection"},value:["cssprops",{$ref:"event#/detail"}]}]},children:[{tagName:"div",attributes:{part:"section-body"},children:[{$prototype:"Array",items:{$ref:"#/state/cssProps"},key:{$ref:"$map/item/key"},map:{$description:"A read-only name and what it maps to. The Content tab had three near-identical hand-written flex rows for these; they are one shape now, and this is it.",tagName:"div",attributes:{part:"kv","data-prop":"${$map.item.prop}"},children:[{tagName:"span",attributes:{part:"kv-name"},textContent:"${$map.item.name}"},{tagName:"span",attributes:{part:"kv-detail",hidden:"${$map.item.detail ? null : ''}"},textContent:"${$map.item.detail}"},{tagName:"span",attributes:{part:"kv-tags",hidden:"${$map.item.tags ? null : ''}"},textContent:"${$map.item.tags}"},{tagName:"span",attributes:{part:"kv-value",hidden:"${$map.item.value ? null : ''}"},textContent:"${$map.item.value}"}]}}]}]}}},{tagName:"div",attributes:{part:"cssparts-slot",role:"none",hidden:"${state.hasCssParts ? null : ''}"},style:{display:"contents"},$switch:{$ref:"#/state/hasCssParts"},cases:{true:{tagName:"jx-accordion-item",attributes:{"data-section":"cssparts"},$props:{label:"CSS Parts",open:{$ref:"#/state/cssPartsOpen"}},ontoggle:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setSection"},value:["cssparts",{$ref:"event#/detail"}]}]},children:[{tagName:"div",attributes:{part:"section-body"},children:[{$prototype:"Array",items:{$ref:"#/state/cssParts"},key:{$ref:"$map/item/key"},map:{$description:"A read-only name and what it maps to. The Content tab had three near-identical hand-written flex rows for these; they are one shape now, and this is it.",tagName:"div",attributes:{part:"kv","data-prop":"${$map.item.prop}"},children:[{tagName:"span",attributes:{part:"kv-name"},textContent:"${$map.item.name}"},{tagName:"span",attributes:{part:"kv-detail",hidden:"${$map.item.detail ? null : ''}"},textContent:"${$map.item.detail}"},{tagName:"span",attributes:{part:"kv-tags",hidden:"${$map.item.tags ? null : ''}"},textContent:"${$map.item.tags}"},{tagName:"span",attributes:{part:"kv-value",hidden:"${$map.item.value ? null : ''}"},textContent:"${$map.item.value}"}]}}]}]}}}]}}}]};I("logic-panel",Ge);function ve(){return{bindings:[],cases:[],conditionFields:[],conditionOpen:!0,cssParts:[],cssPartsOpen:!1,cssProps:[],cssPropsOpen:!1,declared:[],emptyActions:[],emptyMessage:"",eventsOpen:!0,hasBindings:!1,hasCondition:!1,hasCssParts:!1,hasCssProps:!1,hasDeclared:!1,hasEmptyActions:!1,hasEvents:!1,hasObserved:!1,hasRepeater:!1,hasTemplate:!1,observed:[],observedEmpty:!1,observedOpen:!1,repeaterFields:[],repeaterOpen:!0,state:"empty"}}function Ke(e,t){Object.assign(e,t)}function Gt(e){let t=i(e)?void 0:e.attributes?.part;return i(t)?t:""}function Kt(e){let t=e?.$map,o=w(t)?t.item:void 0,n=w(o)?o.key:"";return i(n)?n:""}function Xe(e,t,o,n){let r=v({...ve(),...o});Ke(r,t);let a=null,s=!1;return e.replaceChildren(),A("logic-panel",r,e,{onNodeCreated:(l,d,c,C)=>{if(!(l instanceof HTMLElement))return;let f=Gt(c);if(f!=="control-host"&&f!=="expression-host"&&f!=="statements-host")return;let p=Kt(C);if(f==="control-host")n.controlSlot(p,l);else if(f==="expression-host")n.expressionSlot(p,l);else n.statementsSlot(p,l)}}).then((l)=>{if(s){l.dispose();return}a=l}),{connected:()=>{let l=a?.root;return l instanceof HTMLElement?l.isConnected:!s},dispose(){s=!0,a?.dispose(),a=null},update(l){Ke(r,l)}}}var et=["onclick","oninput","onchange","onsubmit","onkeydown","onkeyup","onfocus","onblur","onmouseenter","onmouseleave"],tt=/^on[a-z][\da-z-]*$/i,ke=rC("eventHandler");function Yt(e,t){if(e==="function")return{$prototype:"Function",body:"",parameters:[]};if(e==="expression")return{$expression:{operator:"=",target:null}};let[o]=t;return o?{$ref:`#/state/${o[0]}`}:{$ref:""}}function ot(e,t,o){Y(h.value,(n)=>{for(let r of e)Ye(n,r,t,o)})}function Xt(e,t,o){if(t.length<2)return 0;let n=t.map((r)=>{let a=ne(e,r);return a?ff(a,o)??null:null});return qp(n).mixed?t.length:0}var j={bindings:new Map,cases:new Set,fields:new Map,functionDefs:[],selection:null,targets:[]};function Ce(e,t){return t.some((o)=>o!==e)}function nt(e,t){let o=Lr[e];return Ce(e,t)?`Value source: ${o} — click to change`:`Value source: ${o} (no other source available here)`}function Qt(e){return[...e.stateDefs.map((t)=>({label:t,value:`#/state/${t}`})),...e.extraSignals??[]]}function Zt(e,t,o){let n=o.value!==void 0&&o.value!=="",r=o.mode==="literal"||o.mode==="function";return{clearLocked:!o.onClear,clearTitle:o.onClear?`Clear ${o.label}`:`${o.label} cannot be cleared`,dotState:n?"set":"unset",key:e,kind:o.mode==="expression"?"control":o.mode==="ref"?"select":"text",label:o.label,mono:o.mode==="template",options:o.mode==="ref"?Qt(o):[],placeholder:o.mode==="template"?"${state.…}":"",prop:t,source:o.mode,sourceHint:nt(o.mode,o.offered),sourceLabel:Lr[o.mode],sourceLocked:!Ce(o.mode,o.offered),tone:"",value:r?String(o.value??""):o.mode==="ref"?He(o.value)?o.value.$ref:"":String(o.value??"")}}function we(e,t,o,n){let r=Nc(n.caps),a=Rd(t,n.value),s={...n,mode:a,offered:r};if(a==="expression"){let l=w(n.value)?n.value.$expression:void 0;s.paint=(d)=>zl(d,l,(c)=>n.onChange({$expression:c}),{allowEventRef:!1,stateDefs:[...n.stateDefs],stateEntries:null})}return e.set(t,s),Zt(t,o,s)}function rt(){let e=new Map,t=new Map,o=new Set,n=ve(),r=h.value,a=Oe(r?.session.selection),s=r?.doc.document,l=(m,k=[])=>(j={bindings:t,cases:o,fields:e,functionDefs:[],selection:null,targets:[]},n.emptyActions=k,n.emptyMessage=m,n.hasEmptyActions=k.length>0,n);if(!r||!s)return l("Open a page to inspect and wire what you click.",[{id:"open-page",label:"Open a page…"}]);if(!a)return l(wp("wire it up"));let d=ne(s,a);if(!d)return l(hm());n.state="ready";let c=s.state||{},C=Object.entries(c).filter(([,m])=>w(m)&&(m.$prototype==="Function"||Boolean(m.$handler))),f=r.session.selection.length>0?r.session.selection:[a];j={bindings:t,cases:o,fields:e,functionDefs:C,selection:a,targets:f};let p=d.$prototype==="Array",u=Boolean(d.$switch),N=a.length===0,b=Ww({document:s,mode:r.doc.mode,selection:r.session.selection,ui:r.session.ui}),M=xp(s),E=a.join("/"),L=(m)=>{let k=He(m)?m.$ref:null;if(!k)return;return kS(c[k.startsWith("#/state/")?k.slice(8):k])||void 0};if(p){n.hasRepeater=!0,n.repeaterOpen=nl("__repeater",!0);let m=(g)=>(y)=>Y(h.value,(P)=>Ye(P,a,g,y||void 0)),k=(g,y)=>we(e,`prop|${E}|${g}`,g,{caps:g==="filter"?"repeaterFilter":"repeaterSort",extraSignals:null,label:y,literalDefault:L(d[g]),onChange:m(g),onClear:()=>Y(h.value,(P)=>Ye(P,a,g)),stateDefs:M,value:d[g]});n.repeaterFields=[we(e,`prop|${E}|items`,"items",{caps:"repeaterItems",extraSignals:null,label:"Items",literalDefault:L(d.items),onChange:(g)=>Y(h.value,(y)=>Ye(y,a,"items",g)),stateDefs:M,value:d.items}),k("filter","Filter"),k("sort","Sort")],n.hasTemplate=Boolean(d.map)}if(u)n.hasCondition=!0,n.conditionOpen=nl("__condition",!0),n.conditionFields=[we(e,`prop|${E}|$switch`,"$switch",{caps:"switchDiscriminant",extraSignals:CS(a),label:"Expression",literalDefault:L(d.$switch),onChange:(m)=>Y(h.value,(k)=>Ye(k,a,"$switch",m)),stateDefs:M,value:d.$switch})],n.cases=Object.keys(d.cases||{}).map((m)=>(o.add(m),{key:m,name:m,openTitle:`Edit case "${m}"`,prop:`case:${m}`,removeTitle:`Remove case "${m}"`}));if(!p){if(n.hasEvents=!0,n.eventsOpen=nl("__events",!0),b){let k=[];for(let[g,y]of Object.entries(c))if(ca(y)&&Array.isArray(y.emits))for(let[P,F]of y.emits.entries())k.push({key:`${g}:${F.name||P}`,name:F.name||"(unnamed)",source:`← ${g}`,title:F.description||"",type:w(F.type)&&i(F.type.text)?F.type.text:""});n.declared=k,n.hasDeclared=k.length>0}let m=Object.keys(d).filter((k)=>k.startsWith("on")).map((k)=>[k,ff(d,k)]).filter((k)=>k[1]!==void 0);n.bindings=m.map(([k,g])=>eo(t,k,g,c)),n.hasBindings=m.length>0}if(b&&N){let m=[];for(let[y,P]of Object.entries(c)){if(!w(P)||!P.attribute)continue;m.push({detail:`→ ${y}`,key:y,name:String(P.attribute),prop:`attribute:${y}`,tags:P.reflects?"reflects":"",value:P.type?String(P.type):""})}n.hasObserved=!0,n.observedOpen=nl("__observed",!1),n.observedEmpty=m.length===0,n.observed=m;let k=Object.entries(d.style||{}).filter(([y])=>y.startsWith("--"));n.hasCssProps=k.length>0,n.cssPropsOpen=nl("__cssprops",!1),n.cssProps=k.map(([y,P])=>({detail:"",key:y,name:y,prop:`cssprop:${y}`,tags:"",value:String(P)}));let g=$S(s);n.hasCssParts=g.length>0,n.cssPartsOpen=nl("__cssparts",!1),n.cssParts=g.map((y)=>({detail:`<${y.tag}>`,key:`${y.tag}:${y.name}`,name:y.name,prop:`csspart:${y.name}`,tags:"",value:""}))}return n}function eo(e,t,o,n){let{functionDefs:r,selection:a,targets:s}=j,l=h.value,d=ca(o)?o:null,c=wl(o)?o.$expression:null,C=$d(o),f=d&&Array.isArray(d.body)?d.body:null,p=f!==null,u=d?p?"statements":"code":c?"expression":"ref",N=Xt(l.doc.document,s,t)>0,b={body:u,fn:d,key:t,mode:C,value:o};if(d&&f&&a)b.mountStatements=(M)=>Vw(M,f,(E)=>Y(h.value,(L)=>Ye(L,a,t,{...d,body:E})),{allowEventRef:!0,emits:d.emits??[],region:X$(t),stateDefs:Object.keys(n),stateEntries:n});if(c&&a){let M=um(l,`event:${JSON.stringify(a)}:${t}`,c,a,()=>Bi("rightPanel")),E=(m)=>Y(h.value,(k)=>Ye(k,a,t,{$expression:m})),L=(m,k)=>Y(h.value,(g)=>na(g,m,k));b.paint=(m)=>zl(m,c,E,{allowEventRef:!0,onInsertDef:L,preview:M,stateDefs:Object.keys(n),stateEntries:n})}return e.set(t,b),{body:u,clearTitle:N?`${s.length} selected elements bind ${t} differently — clearing removes it from all of them`:`Clear ${t}`,code:d&&!p&&i(d.body)?d.body:"",codeChecked:u==="code"?"true":"false",dotState:N?"mixed":"set",key:t,name:t,nameTitle:`Event: ${t} — click to change`,openTitle:u==="expression"?"Open in formula workspace":"Open in editor",refOptions:[{label:"— none —",value:""},...r.map(([M])=>({label:M,value:`#/state/${M}`}))],refValue:He(o)?o.$ref:"",showToggle:Boolean(d),source:C,sourceHint:nt(C,ke),sourceLabel:Lr[C],statementsChecked:u==="statements"?"true":"false",tone:N?"warning":""}}var z=null,q=null,Z=new Map,te=new Map,re=new Map,to=new Map([["condition","__condition"],["cssparts","__cssparts"],["cssprops","__cssprops"],["events","__events"],["observed","__observed"],["repeater","__repeater"]]);function Ne(e){if(q?.stop(),q=null,z?.dispose(),z=null,Z.clear(),te.clear(),re.clear(),!e)return;z=Xe(e,rt(),{addCase:()=>{let{selection:t}=j;if(t)Y(h.value,(o)=>k$(o,t,`case${j.cases.size+1}`))},addEvent:uo,clearEvent:(t)=>ot(j.targets,t),clearField:(t)=>j.fields.get(t)?.onClear?.(),editTemplate:()=>{let{selection:t}=j;if(t&&h.value)h.value.session.selection=[[...t,"map"]]},openCase:(t)=>{let{selection:o}=j;if(o&&h.value)h.value.session.selection=[[...o,"cases",t]]},openEditor:(t)=>{let{selection:o}=j,n=j.bindings.get(t);if(o&&n)zu({editing:{eventKey:t,path:o,type:"event"},surface:n.body==="expression"?"formula":"function"})},pickEventName:co,pickHandler:so,pickSource:io,runEmptyAction:(t)=>{if(t==="open-page")Ul().run()},removeCase:(t)=>{let{selection:o}=j;if(o)Y(h.value,(n)=>E$(n,o,t))},renameCase:(t,o)=>{let{selection:n}=j;if(n&&o&&o!==t)Y(h.value,(r)=>T$(r,n,t,o))},setBodyMode:po,setCode:(t,o)=>{let{selection:n}=j,r=j.bindings.get(t);if(n&&r?.fn)Y(h.value,(a)=>Ye(a,n,t,{$prototype:"Function",body:o,parameters:r.fn?.parameters||[]}))},setField:(t,o)=>{let n=j.fields.get(t);if(!n)return;if(n.mode==="ref"){n.onChange(o?{$ref:o}:void 0);return}n.onChange(o)},setHandlerRef:(t,o)=>{let{selection:n}=j;if(!n)return;Y(h.value,(r)=>Ye(r,n,t,o?{$ref:o}:void 0))},setSection:(t,o)=>{let n=to.get(t);if(n)Db(n,o)}},{controlSlot:(t,o)=>{Z.set(t,o),j.fields.get(t)?.paint?.(o)},expressionSlot:(t,o)=>{te.set(t,o),j.bindings.get(t)?.paint?.(o)},statementsSlot:(t,o)=>{re.set(t,o),j.bindings.get(t)?.mountStatements?.(o)}}),ao()}var Se=!1;function oo(){if(Se||!z)return;Se=!0,queueMicrotask(()=>{if(Se=!1,!z)return;z.update(rt()),queueMicrotask(no)})}function no(){for(let[e,t]of Z){let o=j.fields.get(e);if(!o||!t.isConnected){Z.delete(e);continue}o.paint?.(t)}for(let[e,t]of te){let o=j.bindings.get(e);if(!o||!t.isConnected){te.delete(e);continue}o.paint?.(t)}for(let[e,t]of re){let o=j.bindings.get(e);if(!o||!t.isConnected){re.delete(e);continue}o.mountStatements?.(t)}}function ao(){q?.stop(),q=xe(),q.run(()=>{oe(()=>{let e=h.value;if(e)e.doc.document,e.doc.mode,e.session.selection.map((t)=>t.join("/")).join("|"),e.session.ui.inspectorSections;oo()})})}function io(e,t){let o=j.fields.get(e);if(!o||!Ce(o.mode,o.offered))return;Bt({label:"Value source",opener:t,region:"value-source",rows:o.offered.map((n)=>({checked:n===o.mode?"true":"false",destructive:!1,disabled:!1,dividerAbove:!1,id:n,title:Lr[n]})),run:(n)=>{let r=o.offered.find((a)=>a===n);if(r===void 0||r===o.mode)return;if(o.mode==="ref"&&o.literalDefault!==void 0&&!Ku(e,"literal"))qu(e,"literal",o.literalDefault);o.onChange(Oc(e,o.mode,r,Te(o.value),Id(r,{extraSignals:o.extraSignals,literalDefault:o.literalDefault,stateDefs:o.stateDefs})))}})}function so(e,t){let o=j.bindings.get(e);if(!o)return;Bt({label:"Value source",opener:t,region:"value-source",rows:ke.map((n)=>({checked:n===o.mode?"true":"false",destructive:!1,disabled:!1,dividerAbove:!1,id:n,title:Lr[n]})),run:(n)=>{let r=ke.find((s)=>s===n);if(r===void 0||r===o.mode)return;let a=Yt(r,j.functionDefs);ot(j.targets,e,Oc(`event|${j.selection?.join("/")??""}|${e}`,o.mode,r,o.value,a)??a)}})}function co(e,t){let o=[...j.bindings.keys()],n=[...new Set([...o,...et])];Bt({label:"Event name",opener:t,region:"event-name",rows:[...n.map((r)=>({checked:r===e?"true":"false",destructive:!1,disabled:!1,dividerAbove:!1,id:r,title:r})),{destructive:!1,disabled:!1,dividerAbove:!0,id:"__custom__",run:()=>{Hn("Event name",{message:"Any DOM or custom event this element emits — onpointerdown, ondragover.",placeholder:"onpointerdown",validate:(r)=>tt.test(r.trim())?"":"An event key starts with “on” and continues in letters, digits or hyphens.",value:e}).then((r)=>{if(r)Qe(e,r.trim())})},title:"Other name…"}],run:(r)=>Qe(e,r)})}function Qe(e,t){if(!t||t===e||!tt.test(t))return;Y(h.value,(o)=>{for(let n of j.targets){let r=ne(o.doc.document,n),a=r?ff(r,e):void 0;if(a===void 0)continue;Ye(o,n,e),Ye(o,n,t,a)}})}function po(e,t){let{selection:o}=j,r=j.bindings.get(e)?.fn;if(!o||!r)return;let a=Array.isArray(r.body);if(t==="statements"===a)return;Y(h.value,(s)=>Ye(s,o,e,{...r,body:t==="statements"?[]:""}))}function uo(){let{functionDefs:e,selection:t}=j,o=h.value;if(!t||!o)return;let n=ne(o.doc.document,t),r="onclick";for(let a of et)if(!n?.[a]){r=a;break}Y(h.value,(a)=>Ye(a,t,r,e.length>0?{$ref:`#/state/${e[0][0]}`}:{$prototype:"Function",body:"",parameters:[]}))}var mo=new Set(["input","select","textarea"]);function fo(e){let t=Ze(e.tagName).toLowerCase(),o=[];if(la(e))o.push(":popover-open","::backdrop",":popover-open::backdrop");if(t==="dialog")o.push("[open]",":modal","::backdrop");if(t==="details")o.push("[open]");if(mo.has(t))o.push(":checked",":invalid",":required",":user-invalid");if(t==="a")o.push(":visited",":target");return o}function je(e){if(!T(e))return[...q1];return[...new Set([...q1,...fo(e)])]}function at(e,t,o,n=null){if(o===null||t.length===0)return{};let r=new Map,a=(s,l)=>{for(let[d,c]of Object.entries(s??{}))if(c===void 0||i(c)||ee(c))r.set(d,{donor:l,value:c??""})};if(n){a(Xi(e,n),null);for(let s of t){if(s===o)break;a(Xi(Xi(e,`@${s}`),n),s)}return Object.fromEntries(r)}a(e,null);for(let s of t){if(s===o)break;a(Xi(e,`@${s}`),s)}return Object.fromEntries(r)}var it={$schema:"https://jxsuite.com/schema/v1",$id:"StudioTargetLine",$description:"The Style tab's edit target, as one sentence (§6.2): element · breakpoint · scheme variant · selector, then the chip that states how wide the blast radius is. Every word of the sentence is a control, because a sentence you cannot act on is a caption and the panel already had one of those. The breakpoint and scheme segments ROUTE to where those axes are defined rather than offering a third list to pick from — the Style tab owns the selector axis and nothing else — so the selector is the one segment with a menu, and that menu is the kit's. The project-scope warning band is not decoration: entering Stylebook converts every edit from `this element` to `every element of this tag`, and the band states that before the first keystroke.",tagName:"div",attributes:{part:"target"},style:{$description:"The `.target-line` / `.tl-*` rules the line used to take from `styles/inspector.css`, brought here and re-valued onto the kit's own layer. Every segment is a button with the chrome taken off: the row must read as a sentence, not as a toolbar, which is exactly what the three widgets it replaced failed to do.",display:"block",fontSize:"var(--jx-text-xs)",'& [part="line"]':{display:"flex",alignItems:"center",gap:"var(--jx-space-2)",padding:"5px var(--jx-space-3)",borderBottom:"1px solid var(--jx-border)",lineHeight:"1.4"},'& [part="glyph"]':{flexShrink:"0",color:"var(--jx-accent)"},'& [part="segments"]':{display:"flex",flexWrap:"wrap",alignItems:"center",gap:"1px",minWidth:"0",flex:"1"},'& [part="separator"]':{color:"var(--jx-fg-dim)",opacity:"0.6"},'& [part="segment"]':{padding:"1px 3px",border:"none",borderRadius:"var(--jx-radius-sm)",background:"none",color:"var(--jx-fg)",font:"inherit",fontFamily:"var(--jx-font-mono)"},'& button[part="segment"]':{cursor:"pointer",":hover":{background:"var(--jx-hover-bg)",color:"var(--jx-accent)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-1px"}},'& [data-seg="element"]':{color:"var(--jx-tag)"},'& [data-seg="media"], & [data-seg="scheme"]':{color:"var(--jx-fg-dim)"},'& [data-seg="selector"]':{color:"var(--jx-signal)"},'& [part="scope"]':{$description:"Element scope is ambient and reads as ambient; the two tag-wide scopes are the ones a reader has to notice BEFORE typing, so they carry weight.",flexShrink:"0",padding:"1px var(--jx-space-3)",border:"1px solid var(--jx-border)",borderRadius:"999px",color:"var(--jx-fg-dim)",whiteSpace:"nowrap"},'& [part="scope"][data-scope="document"]':{borderColor:"var(--jx-accent-50)",color:"var(--jx-accent)"},'& [part="scope"][data-scope="project"]':{borderColor:"var(--jx-warning)",color:"var(--jx-warning)"},'& [part="warning"]':{padding:"var(--jx-space-3)",borderBottom:"1px solid var(--jx-border)",borderLeft:"2px solid var(--jx-warning)",background:"var(--jx-bg-panel)"},'& [part="warning-text"]':{margin:"0",color:"var(--jx-warning)"},'& [part="warning-action"]':{marginTop:"var(--jx-space-2)",padding:"0",border:"none",background:"none",color:"var(--jx-accent)",font:"inherit",cursor:"pointer",textDecoration:"underline",":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"1px"}},'& [part="affected"]':{margin:"var(--jx-space-2) 0 0",padding:"0",maxHeight:"140px",overflowY:"auto",listStyle:"none"},'& [part="affected-row"]':{display:"flex",justifyContent:"space-between",gap:"var(--jx-space-4)",padding:"1px 0",color:"var(--jx-fg-dim)"},'& [part="affected-path"]':{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",fontFamily:"var(--jx-font-mono)"},'& [part="affected-count"]':{flexShrink:"0",fontFamily:"var(--jx-font-mono)"},'& [part="affected-empty"]':{margin:"var(--jx-space-2) 0 0",color:"var(--jx-fg-dim)"}},children:[{tagName:"div",attributes:{part:"line","data-jx-region":"${state.region}"},children:[{tagName:"span",attributes:{part:"glyph","aria-hidden":"true"},textContent:"⌖"},{tagName:"div",attributes:{part:"segments"},children:[{$prototype:"Array",items:{$ref:"#/state/segments"},key:{$ref:"$map/item/key"},map:{tagName:"span",attributes:{part:"segment-slot",role:"none"},style:{display:"contents"},children:[{tagName:"span",attributes:{part:"separator-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"$map/item/leading"},cases:{false:{tagName:"span",attributes:{part:"separator","aria-hidden":"true"},textContent:"·"}}},{tagName:"span",attributes:{part:"control-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"$map/item/control"},cases:{button:{tagName:"button",attributes:{part:"segment",type:"button","data-seg":"${$map.item.key}",title:"${$map.item.title}"},textContent:"${$map.item.label}",onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/activate"},value:[{$ref:"$map/item/key"}]}]}},readout:{tagName:"span",attributes:{part:"segment","data-seg":"${$map.item.key}",title:"${$map.item.title}"},textContent:"${$map.item.label}"}}}]}},{tagName:"span",attributes:{part:"separator","aria-hidden":"true"},textContent:"·"},{tagName:"button",attributes:{part:"segment",type:"button","data-seg":"selector","aria-haspopup":"menu",title:"The state or nested rule these edits land in — click to choose another"},textContent:"${state.selectorLabel} ⌄",onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/openSelector"},value:[]}]}}]},{tagName:"span",attributes:{part:"scope","data-scope":"${state.scopeKind}",title:"${state.scopeTitle}"},textContent:"${state.scopeLabel}"}]},{tagName:"div",attributes:{part:"warning-slot",role:"none"},$switch:{$ref:"#/state/warn"},cases:{true:{tagName:"div",attributes:{part:"warning",role:"status"},children:[{tagName:"p",attributes:{part:"warning-text"},textContent:"${state.warningText}"},{tagName:"span",attributes:{part:"warning-action-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/hasToggle"},cases:{true:{tagName:"button",attributes:{part:"warning-action",type:"button","aria-expanded":"${state.showAffected ? 'true' : 'false'}"},textContent:"${state.toggleLabel}",onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/toggleAffected"},value:[]}]}}}},{tagName:"div",attributes:{part:"affected-slot",role:"none"},$switch:{$ref:"#/state/affectedState"},cases:{list:{tagName:"ul",attributes:{part:"affected"},children:[{$prototype:"Array",items:{$ref:"#/state/affectedFiles"},key:{$ref:"$map/item/path"},map:{tagName:"li",attributes:{part:"affected-row"},children:[{tagName:"span",attributes:{part:"affected-path"},textContent:"${$map.item.path}"},{tagName:"span",attributes:{part:"affected-count"},textContent:"${$map.item.count}"}]}}]},empty:{tagName:"p",attributes:{part:"affected-empty"},textContent:"No file list — the project could not be searched."}}}]}}}]};I("target-line",it);var ho="inspector/target",$o="style-selector",Le="base rule",st=null,se=null,Ee=null,lt=null,G=null;function ie(){let e=G;G=null,e?.close()}function dt(){return st??=v({activate:(e)=>{se?.segments.find((t)=>t.key===e)?.onActivate?.()},affectedFiles:[],affectedState:"hidden",hasToggle:!1,openSelector:()=>{Ae()},region:ho,scopeKind:"element",scopeLabel:"",scopeTitle:"",segments:[],selectorLabel:Le,showAffected:!1,toggleAffected:()=>{se?.scope.onToggleAffected?.()},toggleLabel:"Show affected",warn:!1,warningText:""}),st}function pt(e){let t=e instanceof HTMLElement?e:null;if(t===Ee)return;ie();let o=lt;if(Ee=t,lt=t?A("target-line",dt(),t):null,o)o.then((n)=>{n.dispose()})}function ut(e){se=e;let t=dt(),o=[...e.scope.affectedFiles??[]],n=e.scope.showAffected===!0;t.segments=e.segments.map((r,a)=>({control:r.onActivate?"button":"readout",key:r.key,label:r.label,leading:a===0,title:r.title})),t.selectorLabel=e.selector.value??Le,t.scopeKind=e.scope.kind,t.scopeLabel=e.scope.label,t.scopeTitle=e.scope.kind==="element"?"These edits apply to the selected element only":`These edits apply to ${e.scope.label}`,t.warn=e.scope.kind==="project",t.warningText=`Every edit here restyles ${e.scope.label} — ${e.scope.affected??"unknown"}.`,t.hasToggle=Boolean(e.scope.onToggleAffected),t.toggleLabel=n?"Hide affected":"Show affected",t.showAffected=n,t.affectedFiles=o,t.affectedState=n?o.length>0?"list":"empty":"hidden"}var yo="__base__",bo="__add_custom__";function Ae(){let e=Ee?.querySelector('[data-seg="selector"]')??null;if(!e?.isConnected)throw RangeError(`command "style.openSelectorMenu" needs the Inspector's Style tab rendered; its selector menu is not in the document`);let t=se?.selector;if(!t)return;ie();let o=(r)=>{ie(),t.onSelect(r)},n=[{destructive:!1,disabled:!1,dividerAbove:!1,id:yo,run:()=>{o(null)},title:Le},...t.options.map((r,a)=>({checked:t.declared.has(r)?"true":"false",destructive:!1,disabled:!1,dividerAbove:a===0,id:r,run:()=>{o(r)},title:r})),{destructive:!1,disabled:!1,dividerAbove:!0,id:bo,run:()=>{ie(),t.onAddCustom()},title:"+ Add custom…"}];G=Bt({label:"Edit target",onClosed:(r)=>{if(G===r)G=null},opener:e,region:$o,rows:n})}var D={$schema:"../../packages/schema/schema.json",$id:"css-meta",title:"CSS Property Metadata",description:"Section assignment, order, and input inference metadata for the style sidebar.",$sections:[{key:"layout",label:"Layout"},{key:"size",label:"Size",$layout:"grid"},{key:"spacing",label:"Spacing"},{key:"positioning",label:"Positioning"},{key:"typography",label:"Typography"},{key:"background",label:"Background"},{key:"border",label:"Border"},{key:"effects",label:"Effects"},{key:"other",label:"Other"}],$defs:{display:{$section:"layout",$order:10,type:"string",$input:"button-group",$buttonValues:["flex","grid","block","inline","none"],$icons:{flex:"columns",grid:"grid-four",block:"rectangle",inline:"text-t",none:"eye-slash"},enum:["block","inline","inline-block","flex","inline-flex","grid","inline-grid","contents","none","flow-root","table","list-item"]},height:{$section:"size",$order:10,type:"string",$units:["px","rem","em","%","vh","svh","dvh"],$keywords:["auto","min-content","max-content","fit-content"]},width:{$section:"size",$order:11,type:"string",$units:["px","rem","em","%","vw","svw"],$keywords:["auto","min-content","max-content","fit-content"]},minHeight:{$section:"size",$order:20,type:"string",$units:["px","rem","em","%","vh"],$keywords:["auto","min-content","max-content","fit-content"]},minWidth:{$section:"size",$order:21,type:"string",$units:["px","rem","em","%","vw"],$keywords:["auto","min-content","max-content","fit-content"]},maxHeight:{$section:"size",$order:30,type:"string",$units:["px","rem","em","%","vh"],$keywords:["none","min-content","max-content","fit-content"]},maxWidth:{$section:"size",$order:31,type:"string",$units:["px","rem","em","%","vw"],$keywords:["none","min-content","max-content","fit-content"]},aspectRatio:{$section:"size",$order:40,type:"string",examples:["auto","1/1","4/3","16/9","2/1"]},objectFit:{$section:"size",$order:41,type:"string",enum:["fill","contain","cover","none","scale-down"]},overflow:{$section:"size",$order:50,$span:2,type:"string",enum:["visible","hidden","scroll","auto","clip"]},overflowX:{$section:"size",$order:51,type:"string",enum:["visible","hidden","scroll","auto","clip"]},overflowY:{$section:"size",$order:52,type:"string",enum:["visible","hidden","scroll","auto","clip"]},boxSizing:{$section:"size",$order:60,$span:2,type:"string",enum:["content-box","border-box"]},flexDirection:{$section:"layout",$order:70,type:"string",$input:"button-group",$icons:{row:"arrow-right","row-reverse":"arrow-left",column:"arrow-down","column-reverse":"arrow-up"},enum:["row","row-reverse","column","column-reverse"],$show:[{prop:"display",values:["flex","inline-flex"]}]},flexWrap:{$section:"layout",$order:71,type:"string",$input:"button-group",$buttonValues:["nowrap","wrap"],$icons:{wrap:"arrow-u-down-left"},enum:["nowrap","wrap","wrap-reverse"],$show:[{prop:"display",values:["flex","inline-flex"]}]},justifyContent:{$section:"layout",$order:72,type:"string",$input:"button-group",$buttonValues:["flex-start","flex-end","center","space-between","space-around","space-evenly"],$icons:{"flex-start":"align-left","flex-end":"align-right",center:"align-center-horizontal","space-between":"arrows-out-line-horizontal","space-around":"arrows-in-line-horizontal","space-evenly":"arrows-horizontal"},enum:["flex-start","flex-end","center","space-between","space-around","space-evenly","start","end","normal"],$show:[{prop:"display",values:["flex","inline-flex","grid","inline-grid"]}]},alignItems:{$section:"layout",$order:73,type:"string",$input:"button-group",$buttonValues:["stretch","flex-start","flex-end","center","baseline"],$icons:{stretch:"arrows-out-line-vertical","flex-start":"align-top","flex-end":"align-bottom",center:"align-center-vertical",baseline:"text-a-underline"},enum:["stretch","flex-start","flex-end","center","baseline","start","end","normal"],$show:[{prop:"display",values:["flex","inline-flex","grid","inline-grid"]}]},alignContent:{$section:"layout",$order:74,type:"string",$input:"button-group",$buttonValues:["normal","flex-start","flex-end","center","space-between","stretch"],$icons:{"flex-start":"align-top","flex-end":"align-bottom",center:"align-center-vertical","space-between":"arrows-vertical",stretch:"arrows-out-line-vertical"},enum:["normal","flex-start","flex-end","center","space-between","space-around","stretch","start","end"],$show:[{prop:"display",values:["flex","inline-flex","grid","inline-grid"]}]},gap:{$section:"layout",$order:75,type:"string",$units:["px","rem","em","%"],$show:[{prop:"display",values:["flex","inline-flex","grid","inline-grid"]}]},rowGap:{$section:"layout",$order:76,type:"string",$units:["px","rem","em","%"],$show:[{prop:"display",values:["flex","inline-flex","grid","inline-grid"]}]},columnGap:{$section:"layout",$order:77,type:"string",$units:["px","rem","em","%"],$show:[{prop:"display",values:["flex","inline-flex","grid","inline-grid"]}]},flexGrow:{$section:"layout",$order:80,type:"string",$units:[],$show:[{prop:"display",values:["flex","inline-flex"]}]},flexShrink:{$section:"layout",$order:81,type:"string",$units:[],$show:[{prop:"display",values:["flex","inline-flex"]}]},flexBasis:{$section:"layout",$order:82,type:"string",$units:["px","rem","em","%"],$keywords:["auto","content"],$show:[{prop:"display",values:["flex","inline-flex"]}]},alignSelf:{$section:"layout",$order:83,type:"string",$input:"button-group",$buttonValues:["auto","flex-start","flex-end","center","baseline","stretch"],$icons:{stretch:"arrows-out-line-vertical","flex-start":"align-top","flex-end":"align-bottom",center:"align-center-vertical",baseline:"text-a-underline"},enum:["auto","flex-start","flex-end","center","baseline","stretch","start","end"],$show:[{prop:"display",values:["flex","inline-flex","grid","inline-grid"]}]},order:{$section:"layout",$order:84,type:"string",$units:[],$show:[{prop:"display",values:["flex","inline-flex","grid","inline-grid"]}]},gridTemplateColumns:{$section:"layout",$order:70,type:"string",examples:["repeat(2,1fr)","repeat(3,1fr)","repeat(4,1fr)","1fr 1fr","auto 1fr","auto"],$show:[{prop:"display",values:["grid","inline-grid"]}]},gridTemplateRows:{$section:"layout",$order:71,type:"string",examples:["repeat(2,1fr)","repeat(3,1fr)","auto 1fr","1fr 1fr"],$show:[{prop:"display",values:["grid","inline-grid"]}]},gridTemplateAreas:{$section:"layout",$order:72,type:"string",$show:[{prop:"display",values:["grid","inline-grid"]}]},justifyItems:{$section:"layout",$order:76,type:"string",enum:["start","end","center","stretch","normal"],$show:[{prop:"display",values:["grid","inline-grid"]}]},gridColumn:{$section:"layout",$order:80,type:"string",$show:[{prop:"display",values:["grid","inline-grid"]}]},gridRow:{$section:"layout",$order:81,type:"string",$show:[{prop:"display",values:["grid","inline-grid"]}]},justifySelf:{$section:"layout",$order:82,type:"string",enum:["auto","start","end","center","stretch","normal"],$show:[{prop:"display",values:["grid","inline-grid"]}]},padding:{$section:"spacing",$order:10,type:"string",$shorthand:!0},paddingTop:{$section:"spacing",$order:11,type:"string",$units:["px","rem","em","%"],$shorthand:"padding"},paddingRight:{$section:"spacing",$order:12,type:"string",$units:["px","rem","em","%"],$shorthand:"padding"},paddingBottom:{$section:"spacing",$order:13,type:"string",$units:["px","rem","em","%"],$shorthand:"padding"},paddingLeft:{$section:"spacing",$order:14,type:"string",$units:["px","rem","em","%"],$shorthand:"padding"},margin:{$section:"spacing",$order:20,type:"string",$shorthand:!0},marginTop:{$section:"spacing",$order:21,type:"string",$units:["px","rem","em","%"],$keywords:["auto"],$shorthand:"margin"},marginRight:{$section:"spacing",$order:22,type:"string",$units:["px","rem","em","%"],$keywords:["auto"],$shorthand:"margin"},marginBottom:{$section:"spacing",$order:23,type:"string",$units:["px","rem","em","%"],$keywords:["auto"],$shorthand:"margin"},marginLeft:{$section:"spacing",$order:24,type:"string",$units:["px","rem","em","%"],$keywords:["auto"],$shorthand:"margin"},position:{$section:"positioning",$order:10,type:"string",enum:["static","relative","absolute","fixed","sticky"]},top:{$section:"positioning",$order:20,type:"string",$units:["px","rem","em","%","vw","vh"],$keywords:["auto"],$show:[{prop:"position",values:["relative","absolute","fixed","sticky"]}]},right:{$section:"positioning",$order:21,type:"string",$units:["px","rem","em","%","vw","vh"],$keywords:["auto"],$show:[{prop:"position",values:["relative","absolute","fixed","sticky"]}]},bottom:{$section:"positioning",$order:22,type:"string",$units:["px","rem","em","%","vw","vh"],$keywords:["auto"],$show:[{prop:"position",values:["relative","absolute","fixed","sticky"]}]},left:{$section:"positioning",$order:23,type:"string",$units:["px","rem","em","%","vw","vh"],$keywords:["auto"],$show:[{prop:"position",values:["relative","absolute","fixed","sticky"]}]},zIndex:{$section:"positioning",$order:30,type:"string",$units:[],$keywords:["auto"],$show:[{prop:"position",values:["relative","absolute","fixed","sticky"]}]},float:{$section:"positioning",$order:40,type:"string",enum:["none","left","right","inline-start","inline-end"]},clear:{$section:"positioning",$order:41,type:"string",enum:["none","left","right","both","inline-start","inline-end"]},fontFamily:{$section:"typography",$order:10,type:"string",presets:[{title:"System UI",value:"system-ui, sans-serif"},{title:"Transitional",value:"Charter, 'Bitstream Charter', 'Sitka Text', Cambria, serif"},{title:"Old Style",value:"'Iowan Old Style', 'Palatino Linotype', 'URW Palladio L', P052, serif"},{title:"Humanist",value:"Seravek, 'Gill Sans Nova', Ubuntu, Calibri, 'DejaVu Sans', source-sans-pro, sans-serif"},{title:"Geometric Humanist",value:"Avenir, Montserrat, Corbel, 'URW Gothic', source-sans-pro, sans-serif"},{title:"Classical Humanist",value:"Optima, Candara, 'Noto Sans', source-sans-pro, sans-serif"},{title:"Neo-Grotesque",value:"Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Nimbus Sans', Arial, sans-serif"},{title:"Monospace Slab Serif",value:"'Nimbus Mono PS', 'Courier New', monospace"},{title:"Monospace Code",value:"ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono', monospace"},{title:"Industrial",value:"Bahnschrift, 'DIN Alternate', 'Franklin Gothic Medium', 'Nimbus Sans Narrow', sans-serif-condensed, sans-serif"},{title:"Rounded Sans",value:"ui-rounded, 'Hiragino Maru Gothic ProN', Quicksand, Comfortaa, Manjari, 'Arial Rounded MT', 'Arial Rounded MT Bold', Calibri, source-sans-pro, sans-serif"},{title:"Slab Serif",value:"Rockwell, 'Rockwell Nova', 'Roboto Slab', 'DejaVu Serif', 'Sitka Small', serif"},{title:"Antique",value:"Superclarendon, 'Bookman Old Style', 'URW Bookman', 'URW Bookman L', 'Georgia Pro', Georgia, serif"},{title:"Didone",value:"Didot, 'Bodoni MT', 'Noto Serif Display', 'URW Palladio L', P052, Sylfaen, serif"},{title:"Handwritten",value:"'Segoe Print', 'Bradley Hand', Chilanka, TSCu_Comic, casual, cursive"}]},fontSize:{$section:"typography",$order:20,type:"string",$units:["px","rem","em","%"],$keywords:["small","medium","large","x-large","xx-large","smaller","larger"]},fontWeight:{$section:"typography",$order:21,type:"string",examples:["100","200","300","400","500","600","700","800","900","normal","bold","lighter","bolder"]},fontStyle:{$section:"typography",$order:22,type:"string",enum:["normal","italic","oblique"]},fontVariant:{$section:"typography",$order:23,type:"string",enum:["normal","small-caps"]},lineHeight:{$section:"typography",$order:30,type:"string",$units:["px","rem","em","%"],$keywords:["normal"]},letterSpacing:{$section:"typography",$order:31,type:"string",$units:["px","rem","em"],$keywords:["normal"]},wordSpacing:{$section:"typography",$order:32,type:"string",$units:["px","rem","em"],$keywords:["normal"]},color:{$section:"typography",$order:40,type:"string",format:"color"},textAlign:{$section:"typography",$order:50,type:"string",$input:"button-group",$buttonValues:["left","center","right","justify"],$icons:{left:"text-align-left",center:"text-align-center",right:"text-align-right",justify:"text-align-justify"},enum:["left","right","center","justify","start","end"]},textTransform:{$section:"typography",$order:51,type:"string",enum:["none","uppercase","lowercase","capitalize"]},textDecoration:{$section:"typography",$order:52,type:"string",examples:["none","underline","overline","line-through","underline wavy"]},textOverflow:{$section:"typography",$order:53,type:"string",enum:["clip","ellipsis"],$show:[{prop:"overflow",values:["hidden","clip","auto","scroll"]}]},whiteSpace:{$section:"typography",$order:54,type:"string",enum:["normal","nowrap","pre","pre-wrap","pre-line","break-spaces"]},wordBreak:{$section:"typography",$order:55,type:"string",enum:["normal","break-all","keep-all","break-word"]},verticalAlign:{$section:"typography",$order:56,type:"string",examples:["baseline","top","middle","bottom","text-top","text-bottom","sub","super"]},textShadow:{$section:"typography",$order:60,type:"string"},listStyleType:{$section:"typography",$order:70,type:"string",enum:["none","disc","decimal","circle","square","lower-alpha","upper-alpha","lower-roman","upper-roman"]},backgroundColor:{$section:"background",$order:10,type:"string",format:"color"},backgroundImage:{$section:"background",$order:20,type:"string",examples:["none","linear-gradient(to bottom, #fff, #000)","radial-gradient(circle, #fff, #000)"]},backgroundSize:{$section:"background",$order:21,type:"string",examples:["auto","cover","contain","100% 100%"]},backgroundPosition:{$section:"background",$order:22,type:"string",examples:["center","top","bottom","left","right","center center","top left","bottom right"]},backgroundRepeat:{$section:"background",$order:23,type:"string",enum:["repeat","no-repeat","repeat-x","repeat-y","space","round"]},backgroundAttachment:{$section:"background",$order:24,type:"string",enum:["scroll","fixed","local"]},backgroundClip:{$section:"background",$order:25,type:"string",enum:["border-box","padding-box","content-box","text"]},backgroundOrigin:{$section:"background",$order:26,type:"string",enum:["border-box","padding-box","content-box"]},opacity:{$section:"background",$order:40,type:"number",minimum:0,maximum:1},border:{$section:"border",$order:10,type:"string",$shorthand:!0,$shorthandType:"border-side",$longhands:["borderWidth","borderStyle","borderColor"]},borderWidth:{$section:"border",$order:11,type:"string",$shorthand:!0},borderStyle:{$section:"border",$order:12,type:"string",enum:["none","solid","dashed","dotted","double","groove","ridge","inset","outset","hidden"]},borderColor:{$section:"border",$order:13,type:"string",format:"color"},borderTop:{$section:"border",$order:13.1,type:"string",$shorthand:!0,$shorthandType:"border-side",$longhands:["borderTopWidth","borderTopStyle","borderTopColor"]},borderRight:{$section:"border",$order:13.2,type:"string",$shorthand:!0,$shorthandType:"border-side",$longhands:["borderRightWidth","borderRightStyle","borderRightColor"]},borderBottom:{$section:"border",$order:13.3,type:"string",$shorthand:!0,$shorthandType:"border-side",$longhands:["borderBottomWidth","borderBottomStyle","borderBottomColor"]},borderLeft:{$section:"border",$order:13.4,type:"string",$shorthand:!0,$shorthandType:"border-side",$longhands:["borderLeftWidth","borderLeftStyle","borderLeftColor"]},borderBlockStart:{$section:"border",$order:13.5,type:"string",$shorthand:!0,$shorthandType:"border-side",$longhands:["borderBlockStartWidth","borderBlockStartStyle","borderBlockStartColor"]},borderBlockEnd:{$section:"border",$order:13.6,type:"string",$shorthand:!0,$shorthandType:"border-side",$longhands:["borderBlockEndWidth","borderBlockEndStyle","borderBlockEndColor"]},borderInlineStart:{$section:"border",$order:13.7,type:"string",$shorthand:!0,$shorthandType:"border-side",$longhands:["borderInlineStartWidth","borderInlineStartStyle","borderInlineStartColor"]},borderInlineEnd:{$section:"border",$order:13.8,type:"string",$shorthand:!0,$shorthandType:"border-side",$longhands:["borderInlineEndWidth","borderInlineEndStyle","borderInlineEndColor"]},borderTopWidth:{$section:"border",$order:14,type:"string",$units:["px","rem","em"],$shorthand:"borderWidth"},borderTopStyle:{$section:"border",$order:15,$shorthand:"borderTop",type:"string",enum:["none","solid","dashed","dotted","double","groove","ridge","inset","outset","hidden"]},borderTopColor:{$section:"border",$order:16,$shorthand:"borderTop",type:"string",format:"color"},borderRightWidth:{$section:"border",$order:17,type:"string",$units:["px","rem","em"],$shorthand:"borderWidth"},borderRightStyle:{$section:"border",$order:18,$shorthand:"borderRight",type:"string",enum:["none","solid","dashed","dotted","double","groove","ridge","inset","outset","hidden"]},borderRightColor:{$section:"border",$order:19,$shorthand:"borderRight",type:"string",format:"color"},borderBottomWidth:{$section:"border",$order:20,type:"string",$units:["px","rem","em"],$shorthand:"borderWidth"},borderBottomStyle:{$section:"border",$order:21,$shorthand:"borderBottom",type:"string",enum:["none","solid","dashed","dotted","double","groove","ridge","inset","outset","hidden"]},borderBottomColor:{$section:"border",$order:22,$shorthand:"borderBottom",type:"string",format:"color"},borderLeftWidth:{$section:"border",$order:23,type:"string",$units:["px","rem","em"],$shorthand:"borderWidth"},borderLeftStyle:{$section:"border",$order:24,$shorthand:"borderLeft",type:"string",enum:["none","solid","dashed","dotted","double","groove","ridge","inset","outset","hidden"]},borderLeftColor:{$section:"border",$order:25,$shorthand:"borderLeft",type:"string",format:"color"},borderRadius:{$section:"border",$order:30,type:"string",$shorthand:!0},borderTopLeftRadius:{$section:"border",$order:31,type:"string",$units:["px","rem","em","%"],$shorthand:"borderRadius"},borderTopRightRadius:{$section:"border",$order:32,type:"string",$units:["px","rem","em","%"],$shorthand:"borderRadius"},borderBottomRightRadius:{$section:"border",$order:33,type:"string",$units:["px","rem","em","%"],$shorthand:"borderRadius"},borderBottomLeftRadius:{$section:"border",$order:34,type:"string",$units:["px","rem","em","%"],$shorthand:"borderRadius"},outline:{$section:"border",$order:40,type:"string"},outlineOffset:{$section:"border",$order:41,type:"string",$units:["px","rem","em"]},borderBlockStartWidth:{$section:"border",$order:50,type:"string",$units:["px","rem","em"],$shorthand:"borderBlockStart"},borderBlockStartStyle:{$section:"border",$order:51,type:"string",enum:["none","solid","dashed","dotted","double","groove","ridge","inset","outset","hidden"],$shorthand:"borderBlockStart"},borderBlockStartColor:{$section:"border",$order:52,type:"string",format:"color",$shorthand:"borderBlockStart"},borderBlockEndWidth:{$section:"border",$order:53,type:"string",$units:["px","rem","em"],$shorthand:"borderBlockEnd"},borderBlockEndStyle:{$section:"border",$order:54,type:"string",enum:["none","solid","dashed","dotted","double","groove","ridge","inset","outset","hidden"],$shorthand:"borderBlockEnd"},borderBlockEndColor:{$section:"border",$order:55,type:"string",format:"color",$shorthand:"borderBlockEnd"},borderInlineStartWidth:{$section:"border",$order:56,type:"string",$units:["px","rem","em"],$shorthand:"borderInlineStart"},borderInlineStartStyle:{$section:"border",$order:57,type:"string",enum:["none","solid","dashed","dotted","double","groove","ridge","inset","outset","hidden"],$shorthand:"borderInlineStart"},borderInlineStartColor:{$section:"border",$order:58,type:"string",format:"color",$shorthand:"borderInlineStart"},borderInlineEndWidth:{$section:"border",$order:59,type:"string",$units:["px","rem","em"],$shorthand:"borderInlineEnd"},borderInlineEndStyle:{$section:"border",$order:60,type:"string",enum:["none","solid","dashed","dotted","double","groove","ridge","inset","outset","hidden"],$shorthand:"borderInlineEnd"},borderInlineEndColor:{$section:"border",$order:61,type:"string",format:"color",$shorthand:"borderInlineEnd"},boxShadow:{$section:"effects",$order:10,type:"string",examples:["none","0 1px 3px rgba(0,0,0,0.12)","0 4px 6px rgba(0,0,0,0.1)","inset 0 1px 2px rgba(0,0,0,0.1)"]},filter:{$section:"effects",$order:20,type:"string",examples:["none","blur(4px)","brightness(1.2)","contrast(0.8)","grayscale(100%)","saturate(1.5)"]},backdropFilter:{$section:"effects",$order:21,type:"string",examples:["none","blur(4px)","brightness(1.2)","contrast(0.8)","grayscale(100%)","saturate(1.5)"]},transform:{$section:"effects",$order:30,type:"string",examples:["none","translateX(0)","translateY(0)","rotate(0deg)","scale(1)","skewX(0deg)"]},transformOrigin:{$section:"effects",$order:31,type:"string",examples:["center","top","bottom","left","right","top left","top right","bottom left","bottom right","center center"]},transition:{$section:"effects",$order:40,type:"string",examples:["none","all 0.2s ease","opacity 0.2s ease","transform 0.2s ease","background-color 0.2s ease"]},animationName:{$section:"effects",$order:41,type:"string"},animationDuration:{$section:"effects",$order:42,type:"string",$units:["s","ms"],$show:[{prop:"animationName",values:[]}]},animationTimingFunction:{$section:"effects",$order:43,type:"string",enum:["ease","linear","ease-in","ease-out","ease-in-out","step-start","step-end"],$show:[{prop:"animationName",values:[]}]},animationFillMode:{$section:"effects",$order:44,type:"string",enum:["none","forwards","backwards","both"],$show:[{prop:"animationName",values:[]}]},animationIterationCount:{$section:"effects",$order:45,type:"string",examples:["1","2","3","infinite"],$show:[{prop:"animationName",values:[]}]},cursor:{$section:"effects",$order:50,type:"string",enum:["auto","default","pointer","text","move","not-allowed","grab","grabbing","crosshair","help","wait","zoom-in","zoom-out","none"]},pointerEvents:{$section:"effects",$order:51,type:"string",enum:["auto","none"]},userSelect:{$section:"effects",$order:52,type:"string",enum:["auto","none","text","all","contain"]},visibility:{$section:"effects",$order:53,type:"string",enum:["visible","hidden","collapse"]},resize:{$section:"effects",$order:54,type:"string",enum:["none","both","horizontal","vertical"]},appearance:{$section:"effects",$order:55,type:"string",enum:["auto","none"]}}};var H=D.$defs,Me=new Map;function EE(e){Me=new Map;for(let[t,o]of e.cssProps)if(t!==void 0&&o!==void 0)Me.set(t,o)}function Pe(){return Me}function le(e){return typeof e!=="object"}function xo(e,t){let o=t[e.prop]??"";if(e.values.length===0)return o!==""&&o!=="initial";return i(o)&&e.values.includes(o)}function mt(e,t){return(e.$show??[]).every((o)=>xo(o,t))}function ft(e,t){let o=e.style||{},n={...t};for(let r of Object.keys(o)){if(!le(o[r]))continue;let a=H[r]?.$section??"other";if(n[a]===void 0)n[a]=!0}return n}function _(e){let t=H[e]?.$longhands;if(t)return t.map((n)=>({entry:H[n]||{$order:0},name:n})).toSorted((n,r)=>n.entry.$order-r.entry.$order);let o=[];for(let[n,r]of Object.entries(H))if(r.$shorthand===e)o.push({entry:r,name:n});return o.sort((n,r)=>n.entry.$order-r.entry.$order),o}function gt(e,t){if(!e)return Array.from({length:t},()=>"");let o=e.trim().split(/\s+/);if(t!==4||o.length===0)return Array.from({length:t},()=>"");if(o.length===1)return[o[0],o[0],o[0],o[0]];if(o.length===2)return[o[0],o[1],o[0],o[1]];if(o.length===3)return[o[0],o[1],o[2],o[1]];return[o[0],o[1],o[2],o[3]]}function ht(e){let[t,o,n,r]=e;if(t===o&&o===n&&n===r)return t;if(t===n&&o===r)return`${t} ${o}`;if(o===r)return`${t} ${o} ${n}`;return`${t} ${o} ${n} ${r}`}var wo=new Set(["none","solid","dashed","dotted","double","groove","ridge","inset","outset","hidden"]);function $t(e){if(!e)return["","",""];let t=[],o="",n=0;for(let l of e.trim()){if(l==="(")n+=1;if(l===")")n-=1;if(l===" "&&n===0){if(o)t.push(o);o=""}else o+=l}if(o)t.push(o);let r="",a="",s="";for(let l of t)if(!a&&wo.has(l))a=l;else if(!r&&/^[\d.]/.test(l))r=l;else s=s?`${s} ${l}`:l;return[r,a,s]}function yt(e){return e.filter((t)=>t&&t.trim()).join(" ")}function bt(){let e=ro(h.value?.doc.document?.style),t=[];for(let[o,n]of Object.entries(e))if(o.startsWith("--font")&&(i(n)||ee(n)))t.push({name:o,value:String(n)});return t}var vt=new Map([["fontStyle","slant"],["fontVariant","variant"],["fontWeight","weight"],["textDecoration","decoration"],["textTransform","transform"]]);var de=/^(-?[\d.]+)(px|rem|em|%|vw|vh|svw|svh|dvh|ms|s|fr|ch|ex|deg)?$/;var xt={$schema:"https://jxsuite.com/schema/v1",$id:"StudioStylePanel",$description:"The Inspector's Style tab: the Target Line's host, one filter, then the CSS property accordion — every row saying where its value came from (§6.7), every section heading tallying what is set inside it. Nothing here knows what CSS is. `panels/style-panel.ts` resolves the compound coordinate (selection, breakpoint, scheme layer, nested selector), reads css-meta, decides which of seven controls a property gets, works out its provenance and what a commit writes; this document draws the answer and decides nothing. That split is what lets the tab stop going through `panels/panel-scheduler.ts`: the focus guard existed because a lit repaint of the whole panel could take the field a reader was typing into, and a document is one runtime effect per bound property with an equal write skipped.",tagName:"div",attributes:{part:"panel"},style:{$description:"What `.style-sidebar`, `.style-filter-bar`, `.style-row`, `.style-row-label`, `.style-row--child`, `.style-row--warning`, `.style-shorthand-header`, `.style-section-body--grid`, `.kv-row`, `.kv-key`, `.kv-val`, `.input-group`, `.style-input-number-unit`, `.button-group-combo`, `.provenance-chip*`, `.set-dot` and `.provenance-dots` said across `styles/inspector.css` and `styles/overlays.css`, keyed on `part` and re-pointed at the kit's token layer. The rules those parts replace are DEAD in the stylesheets now rather than shared: `ui/field-row.ts` drew the same row for the Signals panel and the expression editor, and it is gone with them, so `.style-row*`, `.provenance-chip*` and `.set-dot` no longer have an emitter. Every `--spectrum-*` reference is gone rather than renamed — those names resolve only inside `<sp-theme>`, and this document is mounted in the Inspector's tab body, outside it, so each would silently have taken its hard-coded px fallback. The one deliberate change is the provenance chip: it is a `button` wherever it acts, drawn at the same 6px, because a 6px circle that clears a property was reachable by mouse alone.",display:"flex",flexDirection:"column",minHeight:"0",fontFamily:"var(--jx-font-sans)",color:"var(--jx-fg)",'& [part="empty"]':{$description:"The one empty-state pattern (`panels/empty-state.ts`), drawn here because a document cannot render a lit helper. Its rules are what is kept (studio-ui-guidelines.md §11): one sentence saying what the region is FOR, then the action that fills it.",display:"flex",flexDirection:"column",alignItems:"center",gap:"var(--jx-space-3)",padding:"var(--jx-space-6)",textAlign:"center",fontSize:"var(--jx-text-md)",color:"var(--jx-fg-dim)"},'& [part="empty-message"]':{margin:"0",maxWidth:"34ch",lineHeight:"1.5"},'& [part="filter"]':{padding:"var(--jx-space-2) var(--jx-space-3)",borderBottom:"1px solid var(--jx-border)"},'& [part="rows"]':{display:"flex",flexDirection:"column",minWidth:"0"},'& [part="rows"][data-layout="grid"]':{$description:"The Size section only. Two equal columns that may both shrink to nothing, so a long value scrolls inside its own control instead of pushing the pane wider.",display:"grid",gridTemplateColumns:"minmax(0, 1fr) minmax(0, 1fr)",gap:"var(--jx-space-2) var(--jx-space-3)"},'& [part="rows"] > [part="row"]':{$description:'Scoped to the panel\'s OWN rows rather than to every `part="row"` beneath it, and that is load-bearing now that a colour row draws a `jx-color-field`. The kit is light DOM and one cascade, so `[part="row"]` as a bare descendant also matches the field\'s internal row — and at equal specificity with the kit\'s own `& > [part="row"]` the winner is whichever sheet was interned later, which is not a thing a stylesheet may depend on. The same reasoning moved `[part="chip"]` under `[part="chip-slot"]`, where `background: none` would otherwise have erased a swatch\'s colour, and `[part="control"]` under its row, where `> *` would have stretched a swatch\'s chip.',display:"flex",flexDirection:"column",alignItems:"stretch",gap:"2px",padding:"2px 0",minWidth:"0"},'& [part="rows"] > [part="row"][data-span="2"]':{gridColumn:"1 / -1"},'& [part="rows"] > [part="row"][data-child="true"]':{paddingLeft:"var(--jx-space-5)"},'& [part="row-label"]':{display:"flex",alignItems:"center",gap:"var(--jx-space-2)",fontSize:"var(--jx-text-xs)",color:"var(--jx-fg-dim)"},'& [part="rows"] > [part="row"][data-warning="true"] > [part="row-label"]':{color:"var(--jx-warning)","::before":{content:'"⚠ "'}},'& [part="label"]':{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},'& [part="rows"] > [part="row"] > [part="control"]':{display:"flex",alignItems:"center",gap:"var(--jx-space-1)",minWidth:"0"},'& [part="rows"] > [part="row"] > [part="control"] > *':{flex:"1",minWidth:"0"},'& [part="color"]':{display:"flex",minWidth:"0"},'& [part="color"] > [part="color-field"]':{flex:"1",minWidth:"0"},'& [part="color-field"] > [part="row"]':{$description:"The field is `inline-flex` around a row sized to its own contents, which is right where it stands in a sentence and wrong where it IS the width of a dock. Two declarations, not a restatement of the kit's layout: the field still lays itself out.",flex:"1",minWidth:"0"},'& [part="color-field"] [part="text"]':{flex:"1",inlineSize:"auto",minInlineSize:"0"},'& [part="chip-slot"] > [part="chip"]':{$description:"One vocabulary, five states (§6.7). `default` draws nothing at all — absence IS the ghost — which is why there is no rule for it: the document never makes the node. `set` is the 6px accent disc `.set-dot` has always been; the two that carry information wear their donor's name in a bordered pill, and `mixed` is neutral on purpose because it says nothing about WHERE a value came from, only that the selection disagrees.",display:"inline-flex",alignItems:"center",flexShrink:"0",margin:"0",padding:"0",border:"none",background:"none",color:"inherit",font:"inherit",fontSize:"var(--jx-text-xs)"},'& [part="chip-slot"] > button[part="chip"]':{cursor:"pointer",":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"1px"}},'& [part="chip-slot"] > [part="chip"][data-state="set"]':{width:"6px",height:"6px",borderRadius:"50%",background:"var(--jx-accent)"},'& [part="chip-slot"] > button[part="chip"][data-state="set"]:hover':{background:"var(--jx-danger)"},'& [part="chip-slot"] > [part="chip"][data-state="inherited"], & [part="chip-slot"] > [part="chip"][data-state="bound"], & [part="chip-slot"] > [part="chip"][data-state="mixed"]':{maxWidth:"16ch",overflow:"hidden",padding:"0 var(--jx-space-2)",border:"1px solid currentcolor",borderRadius:"var(--jx-radius-sm)",lineHeight:"14px",whiteSpace:"nowrap",textOverflow:"ellipsis"},'& [part="chip-slot"] > [part="chip"][data-state="inherited"]':{color:"var(--jx-warning)"},'& [part="chip-slot"] > [part="chip"][data-state="bound"]':{color:"var(--jx-handler)"},'& [part="chip-slot"] > [part="chip"][data-state="mixed"]':{color:"var(--jx-fg-muted)"},'& [part="dots"]':{display:"inline-flex",alignItems:"center",gap:"3px"},'& [part="dot"]':{$description:"A collapsed heading has room for a tally, not for three labelled chips, so the two states that normally carry text collapse to coloured discs beside the accent one. That tally is what retired the tab's Active filter toggle: the toggle existed only because a closed section could not say whether anything inside it was set.",display:"inline-block",flex:"none",width:"7px",height:"7px",margin:"0",padding:"0",border:"none",borderRadius:"50%",background:"var(--jx-fg-muted)"},'& button[part="dot"]':{cursor:"pointer",":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"1px"}},'& [part="dot"][data-state="set"]':{background:"var(--jx-accent)"},'& button[part="dot"][data-state="set"]:hover':{background:"var(--jx-danger)"},'& [part="dot"][data-state="inherited"]':{background:"var(--jx-warning)"},'& [part="dot"][data-state="bound"]':{background:"var(--jx-handler)"},'& [part="source"]':{$description:"The Value Source chip (§6.6): quiet while the value is a literal, accent-tinted the moment it is produced from something else. A CSS declaration has exactly two rungs — `JxStyle` admits no `$ref` — so the picker it opens is two rows, and that is derived from the schema rather than written here.",flex:"none",color:"var(--jx-fg-dim)"},'& [part="source"][data-source="template"]':{color:"var(--jx-accent)"},'& [part="group"]':{$description:"The composite the kit draws as two elements on purpose: a field the reader may type anything into, beside a button that opens the kit MENU. It is the unit row, and it is not a combobox, because its list runs a VERB rather than committing a value — a unit re-attaches to the number the field holds (ui.md §5.5, jx-dimension-field). The keyword rows and the font row, whose list IS the value, are `jx-combobox` (the `keywords` case).",display:"flex",flex:"1",alignItems:"stretch",gap:"0",minWidth:"0"},'& [part="group"] > jx-textfield':{flex:"1 1 auto",minWidth:"0"},'& [part="group-open"]':{flex:"0 0 auto",marginInlineStart:"calc(-1 * 1px)"},'& [part="buttons"]':{display:"flex",flex:"1",alignItems:"stretch",minWidth:"0"},'& [part="buttons"] jx-action-group':{minWidth:"0"},'& [part="shorthand"]':{display:"flex",alignItems:"center",gap:"var(--jx-space-1)",minWidth:"0"},'& [part="shorthand"] > jx-textfield':{flex:"1",minWidth:"0"},'& [part="kv"]':{display:"flex",gap:"var(--jx-space-1)",marginBottom:"3px",minWidth:"0"},'& [part="kv-key"]':{width:"90px",flexShrink:"0"},'& [part="kv-value"]':{flex:"1",minWidth:"0"},'& [part="nested"]':{display:"flex",alignItems:"center",gap:"var(--jx-space-1)",padding:"2px 0",minWidth:"0"},'& [part="nested-open"]':{flex:"1",overflow:"hidden",padding:"var(--jx-space-2) var(--jx-space-3)",border:"none",borderRadius:"var(--jx-radius-sm)",background:"var(--jx-bg-panel)",color:"var(--jx-fg)",font:"inherit",fontSize:"var(--jx-text-sm)",fontFamily:"var(--jx-font-mono)",textAlign:"left",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:"pointer",":hover":{background:"var(--jx-hover-bg)",color:"var(--jx-accent)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-1px"}},'& [part="nested-add"]':{width:"100%",padding:"var(--jx-space-2) var(--jx-space-3)",border:"1px dashed var(--jx-border-strong)",borderRadius:"var(--jx-radius-sm)",background:"none",color:"var(--jx-fg-dim)",font:"inherit",fontSize:"var(--jx-text-sm)",cursor:"pointer",":hover":{color:"var(--jx-accent)",borderColor:"var(--jx-accent-50)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"1px"}}},children:[{tagName:"div",attributes:{part:"view-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/view"},cases:{empty:{tagName:"div",attributes:{part:"empty"},children:[{tagName:"p",attributes:{part:"empty-message"},textContent:"${state.emptyMessage}"},{tagName:"span",attributes:{part:"empty-action-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/hasEmptyAction"},cases:{true:{tagName:"jx-button",attributes:{part:"empty-action"},$props:{size:"sm"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/runEmptyAction"},value:[]}]},children:[{tagName:"span",textContent:"${state.emptyActionLabel}"}]}}}]},editor:{tagName:"div",attributes:{part:"editor",role:"none"},style:{display:"contents"},children:[{$description:"The Target Line's own host. It is EMPTY on purpose and stays empty: `surfaces/target-line.ts` mounts a second document into it, announced through `onNodeCreated` rather than found by selector (studio-ui-guidelines.md §9.4), so the line survives every repaint of the tab around it.",tagName:"div",attributes:{part:"target-host"}},{tagName:"div",attributes:{part:"filter"},children:[{tagName:"jx-textfield",attributes:{part:"filter-input"},$props:{size:"sm",type:"search",clearable:!0,label:"Filter properties",placeholder:"Filter properties…",value:{$ref:"#/state/filter"}},oninput:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setFilter"},value:[{$ref:"event#/target/value"}]}]}}]},{tagName:"jx-accordion",attributes:{part:"sections"},$props:{multiple:!0},children:[{$prototype:"Array",items:{$ref:"#/state/sections"},key:{$ref:"$map/item/key"},map:{tagName:"jx-accordion-item",attributes:{part:"section","data-section":"${$map.item.key}"},$props:{label:{$ref:"$map/item/label"},open:{$ref:"$map/item/open"}},ontoggle:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/toggleSection"},value:[{$ref:"$map/item/key"},{$ref:"event#/detail"}]}]},children:[{$description:"The inert half of the tally goes in the heading slot and the one control in the actions slot, which is the element's own division: a click on the actions row cancels the summary's toggle, and a click on an inert mark slotted there would cancel it for nothing.",tagName:"span",attributes:{part:"dots",slot:"heading",hidden:"${$map.item.hasMarks ? null : ''}",title:"${$map.item.tally}","aria-label":"${$map.item.tally}"},children:[{$prototype:"Array",items:{$ref:"$map/item/marks"},key:{$ref:"$map/item/state"},map:{tagName:"span",attributes:{part:"dot","data-state":"${$map.item.state}"}}}]},{tagName:"span",attributes:{part:"actions-slot",slot:"actions",role:"none"},style:{display:"contents"},$switch:{$ref:"$map/item/canClear"},cases:{true:{tagName:"button",attributes:{part:"dot",type:"button","data-state":"set","data-clear":"${$map.item.key}",title:"${$map.item.clearTitle}","aria-label":"${$map.item.clearTitle}"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/clearSection"},value:[{$ref:"$map/item/key"}]}]}}}},{tagName:"div",attributes:{part:"rows","data-layout":"${$map.item.layout}"},children:[{$prototype:"Array",items:{$ref:"$map/item/rows"},key:{$ref:"$map/item/key"},map:{tagName:"div",attributes:{part:"row","data-prop":"${$map.item.prop}","data-kind":"${$map.item.kind}","data-child":"${$map.item.child ? 'true' : null}","data-warning":"${$map.item.warning ? 'true' : null}","data-span":"${$map.item.span ? '2' : null}"},children:[{tagName:"div",attributes:{part:"row-label",hidden:"${$map.item.hasLabel ? null : ''}"},children:[{tagName:"span",attributes:{part:"chip-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"$map/item/chip"},cases:{button:{tagName:"button",attributes:{part:"chip",type:"button","data-state":"${$map.item.chipState}",title:"${$map.item.chipTitle}","aria-label":"${$map.item.chipTitle}"},textContent:"${$map.item.chipText}",onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/chipClick"},value:[{$ref:"$map/item/key"}]}]}},text:{tagName:"span",attributes:{part:"chip","data-state":"${$map.item.chipState}",title:"${$map.item.chipTitle}"},textContent:"${$map.item.chipText}"}}},{tagName:"span",attributes:{part:"label",title:"${$map.item.prop}"},textContent:"${$map.item.label}"},{tagName:"span",attributes:{part:"source-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"$map/item/hasSource"},cases:{true:{tagName:"jx-action-button",attributes:{part:"source","data-source":"${$map.item.sourceState}"},$props:{size:"sm",quiet:!0,haspopup:"menu",label:{$ref:"$map/item/sourceHint"},hint:{$ref:"$map/item/sourceHint"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/pickSource"},value:[{$ref:"$map/item/key"},{$ref:"event#/currentTarget"}]}]},children:[{tagName:"span",textContent:"${$map.item.sourceLabel}"}]}}}]},{tagName:"div",attributes:{part:"control",role:"none"},style:{display:"contents"},$switch:{$ref:"$map/item/widget"},cases:{text:{tagName:"jx-textfield",attributes:{part:"text"},$props:{size:"sm",label:{$ref:"$map/item/label"},value:{$ref:"$map/item/value"},placeholder:{$ref:"$map/item/placeholder"},mono:{$ref:"$map/item/mono"}},oninput:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/editText"},value:[{$ref:"$map/item/key"},{$ref:"event#/target/value"}]}]},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/commitText"},value:[{$ref:"$map/item/key"},{$ref:"event#/target/value"}]}]}},number:{tagName:"jx-number-field",attributes:{part:"number"},$props:{size:"sm",label:{$ref:"$map/item/label"},value:{$ref:"$map/item/value"},placeholder:{$ref:"$map/item/placeholder"},min:{$ref:"$map/item/min"},max:{$ref:"$map/item/max"},step:{$ref:"$map/item/step"},stepper:!1},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/commitText"},value:[{$ref:"$map/item/key"},{$ref:"event#/target/value"}]}]}},keywords:{$description:"A keyword row, and the font row: one `jx-combobox` with `allows-custom-value` over the values worth offering (ui.md §5.3). The field IS the value and the rows under it are suggestions, which is the whole of what an enum means on a style property — `text-transform: full-width` is a value whether or not the catalogue lists it, so the list never refuses. A typography row's options carry the kit's drawing channels, so `700` is set in 700 and `Italic` leans, each in the element's own face; the font row's carry `face`, so every font is its own specimen, which is what a menu row could never be (ui.md §5.1: a picker you choose by LOOKING is not a menu). Both handlers read the ELEMENT's value, because a pick announces from the element while typing lets the control's own event bubble, and `currentTarget` is the one node both name. What a font pick WRITES is the adapter's, not the row's: the field holds a token's name, and the commit points the property at it, minting the token first when the name is a preset's.",tagName:"jx-combobox",attributes:{part:"text"},$props:{size:"sm",label:{$ref:"$map/item/label"},value:{$ref:"$map/item/value"},placeholder:{$ref:"$map/item/placeholder"},allowsCustomValue:!0,options:{$ref:"$map/item/options"}},oninput:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/editText"},value:[{$ref:"$map/item/key"},{$ref:"event#/currentTarget/value"}]}]},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/commitText"},value:[{$ref:"$map/item/key"},{$ref:"event#/currentTarget/value"}]}]}},group:{$description:"The dual-mode control: a number beside its unit. Type what you mean, or take a unit from the list — and the list is the kit MENU rather than a second popup of this document's own (studio-ui-guidelines.md §12.5), because every row of it is a verb: a unit re-attaches to the number the field holds. A keyword row, whose list commits a value, is the `keywords` case instead — and so is the font row now, because a font is chosen by looking and a menu row cannot draw itself in its own face.",tagName:"div",attributes:{part:"group"},children:[{tagName:"jx-textfield",attributes:{part:"text"},$props:{size:"sm",label:{$ref:"$map/item/label"},value:{$ref:"$map/item/value"},placeholder:{$ref:"$map/item/placeholder"},mono:{$ref:"$map/item/mono"}},oninput:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/editText"},value:[{$ref:"$map/item/key"},{$ref:"event#/target/value"}]}]},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/commitText"},value:[{$ref:"$map/item/key"},{$ref:"event#/target/value"}]}]}},{tagName:"span",attributes:{part:"group-open-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"$map/item/hasChoices"},cases:{true:{tagName:"jx-action-button",attributes:{part:"group-open"},$props:{size:"sm",haspopup:"menu",label:{$ref:"$map/item/choicesHint"},hint:{$ref:"$map/item/choicesHint"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/pickChoice"},value:[{$ref:"$map/item/key"},{$ref:"event#/currentTarget"}]}]},children:[{tagName:"span",textContent:"${$map.item.choicesLabel}"}]}}}]},buttons:{tagName:"div",attributes:{part:"buttons"},children:[{tagName:"jx-action-group",$props:{selects:"single",compact:!0,label:{$ref:"$map/item/label"}},children:[{$prototype:"Array",items:{$ref:"$map/item/buttons"},key:{$ref:"$map/item/value"},map:{tagName:"jx-action-button",attributes:{part:"button","data-value":"${$map.item.value}"},$props:{size:"sm",icon:{$ref:"$map/item/icon"},label:{$ref:"$map/item/title"},hint:{$ref:"$map/item/title"},checked:{$ref:"$map/item/checked"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/pressButton"},value:[{$ref:"$map/item/row"},{$ref:"$map/item/value"}]}]},children:[{$description:"The abbreviation, for a value with no glyph, and HIDDEN rather than empty on a button that has one. The kit's `[part=\"label\"]` is `display: contents`, so an empty span is still a flex item in the control, and the control's 4px gap sits between the glyph and nothing: every icon button in the tab drew 26px wide with its glyph pushed 2px off centre, instead of 22px and centred. Hidden, it takes no box, and the button's name and tooltip are the value either way.",tagName:"span",attributes:{hidden:"${$map.item.text ? null : ''}"},textContent:"${$map.item.text}"}]}}]},{tagName:"span",attributes:{part:"overflow-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"$map/item/hasChoices"},cases:{true:{tagName:"jx-action-button",attributes:{part:"group-open"},$props:{size:"sm",icon:"dots-three",haspopup:"menu",selected:{$ref:"$map/item/overflowSelected"},label:{$ref:"$map/item/choicesHint"},hint:{$ref:"$map/item/choicesHint"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/pickChoice"},value:[{$ref:"$map/item/key"},{$ref:"event#/currentTarget"}]}]}}}}]},color:{$description:"The colour row, and the whole of it: `ui.md` §5.6 landed, so the swatch, the value, the saturation square, the hue track and the project's own palette are ONE element rather than an announced `[part=\"control-host\"]` a lit island filled. The listener is on the WRAPPER and not on the field, and that is the field's own contract rather than a preference. `jx-color-field` stops its five inner controls' native events at its root and re-says the platform's two names FROM the host, so an ancestor hears exactly one `input` and one `change` per gesture with `e.target` being the field — while a listener on the field itself hears BOTH, including the raw `change` of a text box holding a half-typed word the field has just refused. Bound there, `not a colour` would have been committed as a colour.",tagName:"div",attributes:{part:"color",role:"none"},oninput:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/editText"},value:[{$ref:"$map/item/key"},{$ref:"event#/target/value"}]}]},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/commitText"},value:[{$ref:"$map/item/key"},{$ref:"event#/target/value"}]}]},children:[{tagName:"jx-color-field",attributes:{part:"color-field"},$props:{size:"sm",label:{$ref:"$map/item/label"},value:{$ref:"$map/item/value"},resolved:{$ref:"$map/item/resolved"},alpha:!0},children:[{tagName:"span",attributes:{part:"palette-slot",slot:"tokens",role:"none"},style:{display:"contents"},$switch:{$ref:"$map/item/hasTokens"},cases:{true:{$description:"The palette's `change` is caught HERE, on the group, because it never gets out: the field routes it as its `palette` channel, stops it, and then declines it — a swatch that stands for `var(--color-accent)` is not a string the field can parse as a colour, which is exactly why the reference survives the click. A row that let the field answer instead would have committed the literal behind the token and quietly opted one declaration out of the palette for ever.",tagName:"jx-swatch-group",attributes:{part:"palette"},$props:{label:"Colour tokens",value:{$ref:"$map/item/value"}},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/commitText"},value:[{$ref:"$map/item/key"},{$ref:"event#/target/value"}]}]},children:[{$prototype:"Array",items:{$ref:"$map/item/tokens"},key:{$ref:"$map/item/value"},map:{tagName:"jx-swatch",attributes:{part:"token","data-token":"${$map.item.value}"},$props:{size:"sm",color:{$ref:"$map/item/color"},value:{$ref:"$map/item/value"},label:{$ref:"$map/item/label"}}}}]}}}]}]},shorthand:{tagName:"div",attributes:{part:"shorthand"},children:[{tagName:"jx-textfield",attributes:{part:"text"},$props:{size:"sm",label:{$ref:"$map/item/label"},value:{$ref:"$map/item/value"},placeholder:{$ref:"$map/item/placeholder"}},oninput:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/editText"},value:[{$ref:"$map/item/key"},{$ref:"event#/target/value"}]}]},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/commitText"},value:[{$ref:"$map/item/key"},{$ref:"event#/target/value"}]}]}},{tagName:"jx-action-button",attributes:{part:"expand"},$props:{size:"sm",quiet:!0,icon:{$ref:"$map/item/expandIcon"},expanded:{$ref:"$map/item/expanded"},label:{$ref:"$map/item/expandLabel"},hint:{$ref:"$map/item/expandLabel"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/toggleShorthand"},value:[{$ref:"$map/item/key"}]}]}}]},kv:{tagName:"div",attributes:{part:"kv"},children:[{tagName:"jx-textfield",attributes:{part:"kv-key"},$props:{size:"sm",mono:!0,label:"Property name",value:{$ref:"$map/item/name"}},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/renameCustom"},value:[{$ref:"$map/item/key"},{$ref:"event#/target/value"}]}]}},{tagName:"jx-textfield",attributes:{part:"kv-value"},$props:{size:"sm",label:"Value",value:{$ref:"$map/item/value"},placeholder:{$ref:"$map/item/placeholder"}},oninput:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/editText"},value:[{$ref:"$map/item/key"},{$ref:"event#/target/value"}]}]}},{tagName:"jx-action-button",attributes:{part:"kv-remove"},$props:{size:"sm",quiet:!0,icon:"x",label:{$ref:"$map/item/removeLabel"},hint:{$ref:"$map/item/removeLabel"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/chipClick"},value:[{$ref:"$map/item/key"}]}]}}]},kvadd:{tagName:"jx-textfield",attributes:{part:"kv-add"},$props:{size:"sm",mono:!0,label:"Add a CSS property",placeholder:"Property name…"},onkeydown:{$prototype:"Function",body:[{if:{operator:"===",target:{$ref:"event#/key"},value:"Enter"},then:[{preventDefault:!0},{operator:"call",target:{$ref:"#/state/addCustom"},value:[{$ref:"$map/item/key"},{$ref:"event#/target"}]}]}]}},nested:{tagName:"div",attributes:{part:"nested"},children:[{tagName:"button",attributes:{part:"nested-open",type:"button",title:"${$map.item.openTitle}"},textContent:"${$map.item.name}",onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/openNested"},value:[{$ref:"$map/item/key"}]}]}},{tagName:"jx-action-button",attributes:{part:"nested-remove"},$props:{size:"sm",quiet:!0,icon:"trash",label:{$ref:"$map/item/removeLabel"},hint:{$ref:"$map/item/removeLabel"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/chipClick"},value:[{$ref:"$map/item/key"}]}]}}]},nestedadd:{tagName:"button",attributes:{part:"nested-add",type:"button"},textContent:"+ Add",onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/addNested"},value:[]}]}}}}]}}]}]}}]}]}}}]};I("style-panel",xt);function Co(e){let t=i(e)?void 0:e.attributes?.part;return i(t)?t:""}function wt(e,t){e.view=t.view,e.emptyMessage=t.emptyMessage,e.hasEmptyAction=t.hasEmptyAction,e.emptyActionLabel=t.emptyActionLabel,e.filter=t.filter,e.sections=t.sections}function St(e,t,o,n){let r=v({...o,emptyActionLabel:"",emptyMessage:"",filter:"",hasEmptyAction:!1,sections:[],view:"empty"});wt(r,t),e.replaceChildren();let a=null,s=!1;return A("style-panel",r,e,{onNodeCreated:(l,d,c)=>{if(l instanceof HTMLElement&&Co(c)==="target-host")n.target(l)}}).then((l)=>{if(s){l.dispose();return}a=l}),{connected:()=>!s&&(a===null?e.childNodes.length===0:a.root.parentNode===e),dispose(){s=!0,n.target(null),a?.dispose(),a=null},update:(l)=>wt(r,l)}}var To={state:"default"};function me(e){return/^[a-z]/.test(e)}function At(e,t){let o=e;for(let n of t.split(" "))if(o=Xi(o,n),!o)return{};return o}function ue(e,t,o){let n=o?Xi(e,`@${o}`)??{}:e;if(t)return me(t)?At(n,t):Xi(n,t)??{};let r={};for(let[a,s]of Object.entries(n))if(le(s))r[a]=s;return r}function Mt(e,t,o){let n;if(t&&me(t)){let r=t.split(" ");n=o?(a,s,l)=>_$(a,e,o,r,s,l):(a,s,l)=>Xy(a,e,r,s,l)}else if(t)n=o?(r,a,s)=>x$(r,e,o,t,a,s):(r,a,s)=>Zy(r,e,t,a,s);else n=o?(r,a,s)=>w$(r,e,o,a,s):(r,a,s)=>zc(r,e,a,s);return(r,a,s)=>n(r,a,s)}function No(e,t,o,n){let r=new Set;if(t.length<2)return r;let a=t.map((l)=>{let d=ne(e.doc.document,l);return ue(d?.style??{},o,n)}),s=new Set;for(let l of a)for(let d of Object.keys(l))s.add(d);for(let l of s)if(qp(a.map((d)=>d[l]??null)).mixed)r.add(l);return r}var K=v({showAffected:!1,usageRevision:0});function B(e,t){ae()?.run(e,t)}function jo(e){return e&&me(e)?e.split(" ")[0]??null:null}function Eo(e){return/(?:^|\/)project\.json$/.test(e)}function Lo(e,t){let o=e.documentPath??"",n=Eo(o);if(!t)return n?kt("every page in this project",null):{kind:"element",label:"this element"};let r=n||/^\.?\/?layouts\//.test(o),a=`all <${t}> in this ${r?"project":"document"}`;return r?kt(a,t):{kind:"document",label:a}}function kt(e,t){if(t===null)return{affected:"how many pages that is, is unknown",kind:"project",label:e};let o={tagName:t};K.usageRevision;let n=jc(o);if(n===null)ea(o).then(()=>{if(jc(o)!==null)K.usageRevision+=1});return{kind:"project",label:e,affected:Ao(n),affectedFiles:n?.status==="ready"?Nm(n.result):[],showAffected:K.showAffected,onToggleAffected:()=>{K.showAffected=!K.showAffected}}}function Ao(e){if(e===null||e.status==="pending")return"counting the elements it affects…";if(e.status!=="ready")return"how many elements that is, is unknown";let{files:t,refsTotal:o}=e.result;if(o===0)return"no element in the project uses it yet";return`${o} element${o===1?"":"s"} in ${t.length} file${t.length===1?"":"s"}`}function Mo(e,t,o,n){let r=[{key:"element",label:e,title:"What these edits are pointed at — click to find it in the Outline",onActivate:()=>B("view.setActivity",{tab:"layers"})},{key:"media",label:o&&t?`@${ki(t)}`:"Base",title:"The breakpoint these edits land in. Choose it on the pane's Context control; click to manage breakpoints.",onActivate:()=>B("settings.open",{section:"contexts"})}];if(n)r.push({key:"scheme",label:`${ki(n)} variant`,title:"Edits land in this colour-scheme variant. Set the pane's Context control back to Auto to edit base styles; click to manage schemes.",onActivate:()=>B("settings.open",{section:"contexts"})});return r}function Po(e){if(!i(e))return null;return/\$\{\s*(?:state\.)?([A-Za-z_$][\w$]*)/.exec(e)?.[1]??null}function Fo(e){return i(e)&&e.includes("${")}function fe(e,t){if(t.mixed?.props.has(e))return{state:"mixed",donor:String(t.mixed.count),onClick:()=>t.clear(e)};let o=t.active[e];if(o!==void 0&&t.own[e]===void 0)return{state:"inherited",donor:"site tokens",title:`Inherited from the project's site tokens — ${e} is not set on this document`};if(o!==void 0){if(Fo(o)){let r=Po(o),a={state:"bound"};if(r){if(a.donor=r,t.signals.includes(r))a.onClick=()=>{B("view.setActivity",{tab:"data"}),B("data.expandRow",{name:r})}}return a}return{state:"set",onClick:()=>t.clear(e)}}let n=t.inherited[e];if(n){let r={state:"inherited",donor:n.donor};if(n.jump)r.onClick=n.jump;return r}return{state:"default"}}function Pt(e,t,o){let n=[e,..._(e).map((a)=>a.name)],{mixed:r}=t;if(r&&n.some((a)=>r.props.has(a))){let a={state:"mixed",donor:String(r.count)};if(o)a.onClick=o;return a}for(let a of n){let s=fe(a,t);if(s.state==="default")continue;return s.state==="set"&&o?{...s,onClick:o}:s}return To}function Io(e,t,o,n,r){let{mixed:a}=n;if(a&&(a.props.has(e)||o&&a.props.has(t)))return{state:"mixed",donor:String(a.count),onClick:r};let s=fe(e,n);if(s.state==="set"||s.state==="default"&&o)return{state:"set",onClick:r};return s}function Oo(e,t){return e.map(({prop:o,entry:n})=>Zd(n)==="shorthand"?Pt(o,t).state:fe(o,t).state)}var V=new Map,Re=new Map,Ve=null,Ie=new Map;function R(e){return V.get(e)}function Ro(e){return/^-?\d*\.?\d*$/.test(e)}function Vo(e,t,o){let n=e.$buttonValues||e.enum||[],r=e.$icons||{},{$buttonValues:a,enum:s}=e,l=a&&s&&s.length>a.length?s.filter((c)=>!a.includes(c)):[];return{buttons:n.map((c)=>{let C=r[c]??"";return{icon:C,row:t,checked:c===o?"true":"false",text:C===""?c:"",title:c,value:c}}),extra:l}}function Ft(e){return e.includes("-")?iv(e):e.replace(/^./,(t)=>t.toUpperCase())}function Do(e,t){return e.map((o)=>({checked:o===t,label:Ft(o),value:o}))}function Ho(e,t,o){let n=vt.get(t);return e.map((r)=>{let a={label:Ft(r),value:r};if(n)a[n]=r,a.face=o;return a})}function Bo(e){let t=e.activeStyle.fontFamily??e.inheritedStyle.fontFamily;if(!i(t)&&!ee(t))return"";let o=kd(ro(e.tab.doc.document.style),t);return o===void 0?"":String(o)}function It(e){return Array.isArray(e.presets)?e.presets:[]}function Jo(e){let t=bt(),o=ro(h.value?.doc.document?.style),n=t.map((r)=>({description:r.name,face:String(kd(o,r.value)??r.value),label:rv(r.name,"--font-"),value:r.name}));for(let r of It(e)){let a=Qm(r.title,"--font-");if(!t.some((s)=>s.name===a))n.push({face:r.value,label:r.title,value:a})}return n}function Ct(e,t,o,n){let r=t.trim();if(!r.startsWith("--")){n(t);return}if(o&&ro(h.value?.doc.document?.style)[r]===void 0){let a=It(e).find((s)=>Qm(s.title,"--font-")===r);if(a)Y(h.value,(s)=>zc(s,[],r,a.value))}n(Ib(r))}function U(e,t,o){return{buttons:[],child:!1,chip:"none",chipState:"default",chipText:"",chipTitle:"",choicesHint:"",choicesLabel:"",expandIcon:"caret-right",expandLabel:"",expanded:!1,hasChoices:!1,hasLabel:!1,hasSource:!1,hasTokens:!1,key:e,kind:o,label:"",max:"",min:"",mono:!1,name:"",openTitle:"",options:[],overflowSelected:!1,placeholder:"",prop:t,removeLabel:"",resolved:"",sourceHint:"",sourceLabel:"",sourceState:"literal",span:!1,step:"",tokens:[],value:"",warning:!1,widget:"text"}}function Ot(e,t,o){if(o.state==="default"){e.chip="none";return}if(e.chipState=o.state,e.chipText=Fw(o),e.chipTitle=vp(e.prop,o),o.onClick)e.chip="button",t.chip=o.onClick;else e.chip="text"}function Wo(){return Nc("styleProperty").filter((e)=>e!=="ref")}function Rt(e,t,o,n,r){let a=`${e.coord}|${o}${r.child?"|child":""}`,s=U(a,o,"field"),l={},d=Zd(t),c=Pe().get(o)??"",C=r.placeholder||c,f=(p)=>r.onCommit(p===""?void 0:p);if(s.label=h_(t,o),s.hasLabel=!0,s.child=r.child===!0,s.warning=r.warning===!0,s.span=r.span===!0,s.value=n,s.placeholder=C,Ot(s,l,r.provenance),!r.child){let p=Wo(),u=`${e.coord}|${o}`,N=Rd(u,n===""?void 0:n);if(s.hasSource=!0,s.sourceState=N,s.sourceLabel=Lr[N],s.sourceHint=`Value source: ${Lr[N]} — click to change`,l.source={caps:p,fieldKey:u,mode:N,onChange:(b)=>r.onCommit(b===void 0||b===""?void 0:String(b)),stateDefs:e.templateSignals,value:n===""?void 0:n},N==="template")return s.widget="text",s.mono=!0,s.placeholder="${state.…}",l.commit=(b)=>r.onCommit(b===""?void 0:b),{actions:l,row:s}}switch(d){case"color":{s.widget="color",s.tokens=Hw(),s.hasTokens=s.tokens.length>0,s.resolved=Bw(n),l.edit=f,l.commit=f,l.debounceId=`color:${a}`;break}case"button-group":{let{buttons:p,extra:u}=Vo(t,a,n);s.widget="buttons",s.buttons=p,s.hasChoices=u.length>0,s.overflowSelected=u.includes(n),s.choicesLabel="",s.choicesHint=`More ${s.label.toLowerCase()} values`,l.choices=Do(u,n),l.choose=f;break}case"number-unit":{let p=t.$units??[],u=t.$keywords??[],N=de.exec(n),b=!N&&n!==""&&u.includes(n),M=b?p[0]??"":N?.[2]??p[0]??"";s.widget="group",s.value=zo(n,N,b),s.placeholder=_o(C),s.hasChoices=p.length>0||u.length>0,s.choicesLabel=M||p[0]||"",s.choicesHint=`Unit for ${s.label.toLowerCase()}`,l.choices=[...p.map((E)=>({checked:E===M,label:E,value:E})),...u.map((E,L)=>{let m={checked:E===n,label:E,value:E};if(L===0&&p.length>0)m.divider=!0;return m})],l.choose=(E)=>{if(u.includes(E)){r.onCommit(E);return}let L=de.exec(n)?.[1];if(L)r.onCommit(L+E)};{let E=(L)=>{let m=L.trim();if(m===""){r.onCommit("");return}r.onCommit(Ro(m)&&p.length>0?m+M:m)};l.edit=E,l.commit=E,l.debounceId=`nui:${a}`}break}case"number":{s.widget="number",s.min=t.minimum===void 0?"":String(t.minimum),s.max=t.maximum===void 0?"":String(t.maximum),s.step=t.maximum!==void 0&&t.maximum<=1?"0.1":"",l.commit=f;break}case"select":case"combobox":{let p=Array.isArray(t.enum)?t.enum:Array.isArray(t.examples)?t.examples:[];if(s.widget="keywords",o==="fontFamily")s.value=Uu(n)??n,s.options=Jo(t),l.edit=(u)=>Ct(t,u,!1,f),l.commit=(u)=>Ct(t,u,!0,f);else s.options=Ho(p,o,Bo(e)),l.edit=f,l.commit=f;l.debounceId=`kw:${a}`;break}default:{s.widget="text",l.edit=f,l.commit=f,l.debounceId=`text:${a}`;break}}return{actions:l,row:s}}function zo(e,t,o){if(o)return e;if(t)return t[1]??"";if(e==="")return"";let n=Number.parseFloat(e);return Number.isNaN(n)?e:String(n)}function _o(e){return de.exec(e)?.[1]??e}function Uo(e,t,o){let n=_(o),r=e.activeStyle,a=r[o],s=n.some((g)=>r[g.name]!==void 0),l=e.tab.session.ui.styleShorthands[o]??s,d=a!==void 0||s,c=e.inheritedStyle,C=(g)=>Y(h.value,(y)=>{for(let P of n)e.mutate(y,P.name);e.mutate(y,o,g)}),f=()=>Y(h.value,(g)=>{e.mutate(g,o);for(let y of n)e.mutate(g,y.name)}),p=`${e.coord}|${o}`,u=U(p,o,"shorthand"),N={};u.widget="shorthand",u.hasLabel=!0,u.label=h_(t,o),u.value=i(a)?a:"",u.placeholder=qo(a,n,r,c,o),u.expanded=l,u.expandIcon=l?"caret-down":"caret-right",u.expandLabel=`${l?"Collapse":"Expand"} ${u.label.toLowerCase()}`,Ot(u,N,Pt(o,e.provCtx,d?f:void 0)),N.edit=(g)=>C(g||void 0),N.commit=(g)=>C(g||void 0),N.debounceId=`short:${p}`,N.toggle=()=>{let g=h.value;if(g)g.session.ui.styleShorthands={...g.session.ui.styleShorthands,[o]:!l}};let b=[{actions:N,row:u}];if(!l)return b;let M=t.$shorthandType==="border-side",E=i(a)&&a?M?$t(a):gt(a,n.length):null,L=M?yt:ht,m=M?"":"0",k=(g,y)=>C(L(n.map((P,F)=>String(F===g?y:r[P.name]??(E?E[F]:m)))));for(let[g,{name:y,entry:P}]of n.entries()){let F=r[y]??(E?E[g]:""),ye=F!==void 0&&F!=="";b.push(Rt(e,P,y,String(F??""),{child:!0,onCommit:(J)=>k(g,J||m),placeholder:!F&&c[y]!==void 0?String(c[y]):"",provenance:Io(y,o,ye,e.provCtx,()=>k(g,m))}))}return b}function qo(e,t,o,n,r){if(e)return"";if(t.some((a)=>o[a.name]!==void 0))return t.map((a)=>o[a.name]||"0").join(" ");if(n[r]!==void 0)return String(n[r]);if(t.some((a)=>n[a.name]!==void 0))return t.map((a)=>n[a.name]||"0").join(" ");return""}function ce(e,t){return{emptyActionLabel:t?Ul().label:"",emptyMessage:e,filter:"",hasEmptyAction:t,sections:[],view:"empty"}}function Tt(e){V=new Map;let t=h.value;if(!t)return ce("Open a page to style what you click.",!0);if(e()==="stylebook"&&x.stylebook.selection){let r=t.doc.document;if(!Qn(r))return ce("Open a page to style what you click.",!0);return Nt(t,r,{effectiveStyle:ro(r.style),stylebookSelector:x.stylebook.selection})}let o=Oe(t.session.selection);if(!o)return ce(wp("style it"),!1);let n=ne(t.doc.document,o);if(!n)return ce(hm(),!1);return Nt(t,n,{})}function Nt(e,t,o){let{effectiveStyle:n,stylebookSelector:r=null}=o,a=Oe(e.session.selection),s=t.style||{},l=n??s,d=Object.entries(e.doc.document.state||{}).filter(([,S])=>!(w(S)&&S.$handler)&&!ca(S)).map(([S])=>S),{sizeBreakpoints:c}=ko(Hi(e.doc.document.$media)),C=c.map((S)=>S.name),f=e.session.ui.activeMedia||null,{activeSelector:p}=e.session.ui,u=e.session.ui.previewColorScheme,N=f===null&&(u==="light"||u==="dark")?Object.entries(Hi(e.doc.document.$media)).find(([,S])=>ih(String(S))===u)?.[0]??null:null,b=f&&C.length>0?f:N,M=b?Xi(l,`@${b}`)??{}:l,E=new Set(Object.keys(M).filter((S)=>av(S))),L=r&&me(r)?r:null,m=L?.split(" ").at(-1)??null,k=L?Object.keys(At(l,L)).filter((S)=>av(S)):[],g=L?[...new Set([...[...je({tagName:m??"div"}),...k].map((S)=>`${L} ${S}`),...p&&p!==L?[p]:[]])]:[...new Set([...je(t),...E,...p?[p]:[]])],y=jo(r),P=y??(i(t.tagName)?t.tagName:"element");ut({segments:Mo(P,f,C.length>0,N),selector:{value:L&&p===L?null:p,options:g,declared:L?new Set(k.map((S)=>`${L} ${S}`)):E,onSelect:(S)=>{let O=h.value;if(!O)return;if(O.session.ui.activeSelector=S??L,S?.startsWith(":popover-open"))B("canvas.setPopoverOpen",{open:!0});if((S?.startsWith("[open]")||S?.startsWith(":modal"))&&Hx(O)!==null)B("canvas.setDialogOpen",{open:!0})},onAddCustom:()=>{Hn("Add Selector",{confirmLabel:"Use",message:"A state or nested rule to edit under this element.",placeholder:":hover, .child, &.active, [attr]",validate:(S)=>av(S.trim())?"":'A selector must start with ":", ".", "&" or "[".'}).then((S)=>{if(S&&h.value)h.value.session.ui.activeSelector=L?`${L} ${S.trim()}`:S.trim()})}},scope:Lo(e,y)});let F=ue(l,p,b),ye=l===s?F:ue(s,p,b),J=e.session.selection.length>0?e.session.selection:[a],Je=(S,O,W)=>{for(let Ut of J)Mt(Ut,p,b)(S,O,W)},We=(S,O)=>Y(h.value,(W)=>Je(W,S,O)),Q={};if(N){let S=p?Xi(l,p)??{}:l;for(let[O,W]of Object.entries(S))if(le(W))Q[O]={value:W??"",donor:"Base",jump:()=>ls(h.value,"previewColorScheme","auto")}}else for(let[S,O]of Object.entries(at(l,C,f,p)))Q[S]={value:O.value,donor:O.donor===null?"Base":ki(O.donor),jump:()=>ls(h.value,"activeMedia",O.donor)};let ze={};for(let[S,O]of Object.entries(Q))ze[S]=O.value;let _e=No(e,J,p,b),Ue={own:ye,active:F,inherited:Q,signals:d,clear:(S)=>We(S)};if(_e.size>0)Ue.mixed={count:J.length,props:_e};let qe=ft({style:F},e.session.ui.styleSections);if(JSON.stringify(qe)!==JSON.stringify(e.session.ui.styleSections))e.session.ui.styleSections=qe;let zt=(e.session.ui.styleFilter||"").toLowerCase(),be={activeSelector:p,activeStyle:F,commit:We,coord:`style|${a.join("/")}|${b??""}|${p??""}`,editMedia:b,filter:zt,inheritedStyle:ze,mutate:Je,provCtx:Ue,tab:e,targets:J,templateSignals:d},_t=[...Go(be),...Yo(be),...Xo(be)];return{emptyActionLabel:"",emptyMessage:"",filter:e.session.ui.styleFilter||"",hasEmptyAction:!1,sections:_t,view:"editor"}}function jt(e){return V.set(e.row.key,e.actions),e.row}function Go(e){let{activeStyle:t,tab:o}=e,n=e.filter.length>0,r={};for(let s of D.$sections)r[s.key]=[];for(let[s,l]of Object.entries(H)){if(i(l.$shorthand))continue;r[l.$section||"other"].push({entry:l,prop:s})}for(let s of D.$sections)r[s.key].sort((l,d)=>l.entry.$order-d.entry.$order);let a=[];for(let s of D.$sections){if(s.key==="other")continue;let l=r[s.key],d=l.filter(({prop:u,entry:N})=>{if(t[u]!==void 0)return!0;return Zd(N)==="shorthand"&&_(u).some((b)=>t[b.name]!==void 0)}),c=()=>{Y(h.value,(u)=>{for(let{prop:N,entry:b}of d){if(t[N]!==void 0)e.mutate(u,N);if(Zd(b)==="shorthand")for(let M of _(N))e.mutate(u,M.name)}})},C=jw(Oo(l,e.provCtx)),f=n?!0:o.session.ui.styleSections[s.key]??!1,p=De(s.key,s.label,f,C,{canClear:d.length>0,clearTitle:`Clear all ${s.label.toLowerCase()} properties`,layout:s.$layout==="grid"?"grid":"",onClear:c});if(f)p.rows=Ko(e,l,s.$layout==="grid");if(n&&p.rows.length===0)continue;a.push(p)}return a}function Ko(e,t,o){let{activeStyle:n}=e,r=[];for(let{prop:a,entry:s}of t){let l=n[a],d=l!==void 0,c=mt(s,n),C=Zd(s);if(!d&&!c)continue;if(e.filter){let u=h_(s,a).toLowerCase();if(!a.includes(e.filter)&&!u.includes(e.filter))continue}if(C==="shorthand"){let u=_(a);if(!(d||u.some((b)=>n[b.name]!==void 0))&&!c)continue;for(let b of Uo(e,s,a))r.push(jt(b));continue}let f=e.inheritedStyle[a],p=Rt(e,s,a,String(l??""),{onCommit:(u)=>e.commit(a,u||void 0),placeholder:!d&&f!==void 0?String(f):"",provenance:fe(a,e.provCtx),span:o&&s.$span===2,warning:d&&!c});r.push(jt(p))}return r}function De(e,t,o,n,r){let a=[];if(n.inherited>0)a.push({state:"inherited"});if(n.bound>0)a.push({state:"bound"});if(n.mixed>0)a.push({state:"mixed"});let s=n.set>0&&r.canClear;if(s)Re.set(e,r.onClear);return{canClear:s,clearTitle:r.clearTitle,hasMarks:a.length>0,key:e,label:t,layout:r.layout,marks:a,open:o,rows:[],tally:jE(n)}}function Yo(e){let t=[];for(let[s,l]of Object.entries(e.activeStyle))if(Pa(l)&&!s.startsWith("@"))t.push(s);if(t.length===0)return[];let o=e.tab.session.ui.styleSections.nested??!0,n=De("nested","Relative Styling",o,jw([]),{canClear:!1,clearTitle:"",layout:"",onClear:()=>{}});if(!o)return[n];for(let s of t){let l=`${e.coord}|nested|${s}`,d=U(l,s,"nested");d.widget="nested",d.name=s,d.openTitle=`Edit ${s} under this rule`,d.removeLabel=`Remove ${s}`,V.set(l,{chip:()=>e.commit(s),open:()=>{let c=e.activeSelector?`${e.activeSelector} ${s}`:s;Bu(c,void 0,{panCanvas:!0})}}),n.rows.push(d)}let r=`${e.coord}|nested|+add`,a=U(r,"+add","nested-add");return a.widget="nestedadd",V.set(r,{}),n.rows.push(a),Ve=()=>{Hn("Add Nested Selector",{confirmLabel:"Add",message:"Enter a selector to nest under the current rule.",placeholder:"th, :hover, .active",validate:(s)=>s.trim()?"":"Enter a selector."}).then((s)=>{if(s)e.commit(s,{})})},[n]}function Xo(e){let t=[];for(let d of Object.keys(e.activeStyle))if(!H[d]){if(T(e.activeStyle[d]))continue;t.push(d)}let o=e.tab.session.ui.styleSections.other??t.length>0,n=De("other","Custom",o,jw([]),{canClear:!1,clearTitle:"",layout:"",onClear:()=>{}});if(!o)return[n];let r=Pe(),a=(d,c)=>{let C=ne(d.doc.document,c);return ue(C?.style??{},e.activeSelector,e.editMedia)};for(let d of t){let c=`${e.coord}|custom|${d}`,C=U(c,d,"custom");C.widget="kv",C.name=d,C.value=String(e.activeStyle[d]),C.placeholder=r.get(d)??"",C.removeLabel=`Remove ${d}`,V.set(c,{chip:()=>e.commit(d),debounceId:`custom:${c}`,edit:(f)=>e.commit(d,f),rename:(f)=>{let p=f.trim();if(!p||p===d)return;Y(h.value,(u)=>{for(let N of e.targets){let b=a(u,N)[d];if(b===void 0)continue;let M=Mt(N,e.activeSelector,e.editMedia);M(u,d),M(u,p,String(b))}})}}),n.rows.push(C)}let s=`${e.coord}|custom|+add`,l=U(s,"+add","custom-add");return l.widget="kvadd",V.set(s,{add:(d)=>{let c=d.trim();if(!c)return!1;return e.commit(c,r.get(c)||""),!0}}),n.rows.push(l),[n]}var Qo="style-value",X=null;function Vt(){let e=X;X=null,e?.close()}function Et(e,t,o,n){if(Vt(),!e||o.length===0)return;X=Bt({label:t,onClosed:(r)=>{if(X===r)X=null},opener:e,region:Qo,rows:o.map((r)=>{let a={destructive:!1,disabled:!1,dividerAbove:r.divider===!0,id:r.value,title:r.label};if(r.checked!==void 0)a.checked=r.checked?"true":"false";return a}),run:(r)=>n(r)})}var Zo={addCustom:(e,t)=>{let o=R(e)?.add;if(!o||!(t instanceof HTMLInputElement))return;if(o(t.value))t.value=""},addNested:()=>Ve?.(),chipClick:(e)=>R(e)?.chip?.(),clearSection:(e)=>Re.get(e)?.(),commitText:(e,t)=>{let o=R(e);if(!o)return;if(o.debounceId)W$(o.debounceId);o.commit?.(t)},editText:(e,t)=>{let o=R(e);if(!o?.edit)return;if(o.debounceId){lv(o.debounceId,400,o.edit)(t);return}o.edit(t)},openNested:(e)=>R(e)?.open?.(),pickChoice:(e,t)=>{let o=R(e);if(!o?.choose||!o.choices)return;let{choose:n}=o;Et(t instanceof HTMLElement?t:null,"Values",o.choices,(r)=>n(r))},pickSource:(e,t)=>{let o=R(e)?.source;if(!o)return;Et(t instanceof HTMLElement?t:null,"Value source",o.caps.map((n)=>({checked:n===o.mode,label:`${Lr[n]} — ${mx[n]}`,value:n})),(n)=>{let r=o.caps.find((a)=>a===n);if(r===void 0||r===o.mode)return;o.onChange(Oc(o.fieldKey,o.mode,r,Te(o.value),Id(r,{stateDefs:o.stateDefs})))})},pressButton:(e,t)=>{R(e)?.choose?.(t===en(e)?"":t)},renameCustom:(e,t)=>R(e)?.rename?.(t),runEmptyAction:()=>Ul().run(),setFilter:(e)=>{let t=h.value;if(t)t.session.ui.styleFilter=e},toggleSection:(e,t)=>{let o=h.value;if(!o)return;o.session.ui.styleSections={...o.session.ui.styleSections,[e]:t}},toggleShorthand:(e)=>R(e)?.toggle?.()};function en(e){return Ie.get(e)??""}var pe=null,Dt=()=>"edit",Fe=Dt;function Lt(e){Ie=new Map;for(let t of e.sections)for(let o of t.rows)if(o.widget==="buttons")Ie.set(o.key,o.buttons.find((n)=>n.checked==="true")?.value??"")}function Be(e,t){if(Vt(),pe?.scope.stop(),pe?.handle.dispose(),pe=null,V=new Map,Re=new Map,Ve=null,!e)return;Fe=t?.getCanvasMode??Dt;let o=Tt(Fe);Lt(o);let n=St(e,o,Zo,{target:(a)=>pt(a??void 0)}),r=xe();r.run(()=>{oe(()=>{let a=Tt(Fe);Lt(a),n.update(a)})}),pe={handle:n,host:e,scope:r}}function tn(){let e=(t)=>t.document.open&&t.selection.count>0;return[{category:"View",id:"style.openSelectorMenu",level:"selection",menus:["palette"],group:"8_style",requires:"the Style tab showing a selected element",when:e,run:()=>Ae(),title:"Open Selector Menu"},{args:{additionalProperties:!1,properties:{selector:nn()},required:["selector"],type:"object"},category:"View",id:"style.setSelector",level:"selection",menus:["palette"],group:"8_style",requires:"an element selection",when:e,run:(t,o)=>on(o),title:"Set Style Selector"}]}function on(e){if(e.selector===null){let n=h.value;if(n)n.session.ui.activeSelector=null;return}let t=ct("style.setSelector",e,"selector");if(!av(t))throw RangeError(`command "style.setSelector" argument "selector": "${t}" is not a nested `+'selector — it must start with ":", ".", "&" or "["');let o=h.value;if(!o)throw RangeError('command "style.setSelector" needs an open document');o.session.ui.activeSelector=t}function nn(){return{description:'A nested selector such as ":hover", ".child" or "[open]". null edits the base context.',oneOf:[{type:"string"},{type:"null"}]}}function TE(e){e.registerAll(tn())}var Ht={$schema:"https://jxsuite.com/schema/v1",$id:"StudioInspectorDock",$description:"The Inspector dock's own chrome, as a Jx document over the kit: a header naming what the dock is pointed at, a real `tablist` of four tabs, and four `tabpanel`s. It draws no tab BODY — all four are mounted documents of their own (`surfaces/properties-panel.json`, `surfaces/style-panel.json`, `surfaces/logic-panel.json`, and the assistant's) — so each panel carries one empty `[part=\"panel-body\"]` island the adapter announces through `onNodeCreated` (studio-ui-guidelines.md §9.4). The four panels are keyed on the tab id and the id list never changes, so a body host is created ONCE and lives as long as the dock: that is what the old module's hand-built permanent containers were for, and it is now a property of a keyed `$map` rather than a rule someone has to keep. `panels/right-panel.ts` keeps every decision — which tab is selected, per document or detached; what the target's name is; and which of the four seams a host is handed to.",tagName:"div",attributes:{part:"inspector-dock"},style:{$description:"`styles/inspector.css`'s dock rules, carried in. Three of them were `#right-panel > .panel-*` — a direct-child selector that only held while this module rendered flat into the shell cell — and they are `[part]` rules on the document's own children now, which is the same statement without depending on how deep the dock is mounted. The header's typography is `panels.css`'s `.panel-header*`, at the same values: `--spectrum-font-size-50` resolved only inside `<sp-theme>` and a document mounts outside it, so it is `--jx-text-sm` (11px) here.",display:"flex",flexDirection:"column",height:"100%",minHeight:"0",fontFamily:"var(--jx-font-sans)",color:"var(--fg)",'& [part="header"]':{display:"flex",flex:"0 0 auto",alignItems:"baseline",gap:"var(--jx-space-2)",padding:"6px var(--jx-space-3)",borderBottom:"1px solid var(--border)"},'& [part="header-title"]':{fontSize:"var(--jx-text-sm)",fontWeight:"700",letterSpacing:"0.06em",textTransform:"uppercase",color:"var(--fg)"},'& [part="header-target"]':{overflow:"hidden",fontSize:"var(--jx-text-sm)",color:"var(--fg-dim)",textOverflow:"ellipsis",whiteSpace:"nowrap","::before":{$description:"The separator between the tab's name and its target, drawn rather than written into the string — `panels/right-panel.ts` states what the dock is pointed at and nothing about punctuation.",content:'"·"',marginRight:"var(--jx-space-2)"}},'& [part="tabs"]':{$description:"Four words in a 280px dock, allowed to compress rather than to become anonymous — which is why the tabs are not icons (§6). The kit tab's own 220px cap would let one tab push the last off the strip, so each takes an equal quarter.",flex:"0 0 auto",gap:"0",fontSize:"var(--jx-text-sm)"},'& [part="tab"]':{flex:"1 1 0",justifyContent:"center",minWidth:"0",maxWidth:"none",padding:"var(--jx-space-1) var(--jx-space-2)"},'& [part="panel"]':{$description:"`#right-panel > .panel-body { flex: 1; min-height: 0; overflow-y: auto }`. The kit's tab panel pads itself for a dialog; a dock's tab is the whole column and each body pads its own content.",flex:"1",minHeight:"0",padding:"0",overflowY:"auto"},'& [part="panel"][data-tab="assistant"]':{$description:"The chat owns its own scrolling, so its panel is a nested flex column that does not scroll.",display:"flex",flexDirection:"column",overflow:"hidden"},'& [part="panel"][hidden]':{display:"none"},'& [part="panel-body"]':{display:"flex",flex:"1",flexDirection:"column",minHeight:"0"}},children:[{tagName:"header",attributes:{part:"header"},children:[{tagName:"span",attributes:{part:"header-title"},textContent:"${state.title}"},{tagName:"span",attributes:{part:"header-target"},textContent:"${state.target}"}]},{tagName:"jx-tabs",attributes:{part:"tabs",selected:"${state.tab}"},$props:{label:"Inspector"},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/selectTab"},value:[{$ref:"event#/detail"}]}]},children:[{$prototype:"Array",items:{$ref:"#/state/tabs"},key:{$ref:"$map/item/key"},map:{tagName:"jx-tab",attributes:{part:"tab",id:"${$map.item.tabId}","data-tab":"${$map.item.key}",value:"${$map.item.key}",label:"${$map.item.title}",panel:"${$map.item.panelId}"}}}]},{$prototype:"Array",items:{$ref:"#/state/tabs"},key:{$ref:"$map/item/key"},map:{tagName:"jx-tab-panel",attributes:{part:"panel",id:"${$map.item.panelId}","data-tab":"${$map.item.key}"},$props:{active:{$ref:"$map/item/active"},labelledby:{$ref:"$map/item/tabId"}},children:[{$description:"The island. Every one of the four tabs is a mounted document of its own, so this stays EMPTY for the life of the dock — `panels/right-panel.ts` is handed it through `onNodeCreated` and passes it to that tab's binder exactly once. It is a slotted child rather than the panel element itself because `jx-tab-panel` distributes its own slot, and a second owner of that child list would fight it.",tagName:"div",attributes:{part:"panel-body","data-jx-region":"${$map.item.region}"}}]}}]};I("inspector-dock",Ht);function an(e,t){e.title=t.title,e.target=t.target,e.tab=t.tab,e.tabs=t.tabs}function sn(e){let t=i(e)?void 0:e.attributes?.part;return i(t)?t:""}function ln(e){let t=e?.$map,o=w(t)?t.item:void 0;return w(o)?o:null}function Jt(e,t,o,n){let r=v({...t,selectTab:o.selectTab});e.textContent="",delete e._$litPart$;let a=null,s=!1;return A("inspector-dock",r,e,{onNodeCreated:(l,d,c,C)=>{if(!(l instanceof HTMLElement)||sn(c)!=="panel-body")return;let f=ln(C)?.key;if(i(f)&&f!=="")n.onBody(f,l)}}).then((l)=>{if(s){l.dispose();return}a=l}),{dispose(){s=!0,a?.dispose(),a=null},update:(l)=>{an(r,l)}}}var ge=null,he=null,$e=v({tab:Ly});function dn(e,t,o){try{cn(e,t,o)}catch(n){console.error(`right-panel: the ${t} tab could not take its body:`,n)}}function cn(e,t,o){switch(t){case"assistant":{e.mountAssistant(o);break}case"events":{Ne(o);break}case"properties":{ES(o,{navigateToComponent:e.navigateToComponent});break}case"style":{Be(o,{getCanvasMode:e.getCanvasMode});break}default:break}}function pn(e){return Nw.map((t)=>({active:t.id===e,key:t.id,panelId:`inspector-panel-${t.id}`,region:Y$(t.id),tabId:`inspector-tab-${t.id}`,title:t.title}))}function yS(e){he=Jt(nf(W1,"right-panel"),Wt(),{selectTab:(t)=>un(t)},{onBody:(t,o)=>dn(e,t,o)}),ge=xe(),ge.run(()=>{oe(()=>{let t=h.value;if(x.layoutSelection,t)t.doc.document,t.session.selection.map((o)=>o.join("/")).join("|"),t.session.ui.rightTab;$e.tab,lm()})})}function ZI(){ge?.stop(),ge=null,he?.dispose(),he=null,Ne(null),ES(null),Be(null),$e.tab=Ly}function Wt(){let e=Cd();return{tab:e,tabs:pn(e),target:mn(),title:Nw.find((t)=>t.id===e)?.title??e}}function lm(){he?.update(Wt())}function Cd(){let e=h.value;if(!e)return $e.tab;let t=e.session.ui.rightTab;return Zx(t)?t:Ly}function cm(e){let t=h.value;if(t)t.session.ui.rightTab=e;else $e.tab=e;lm()}function un(e){if(e!==""&&e!==Cd()&&Zx(e))cm(e)}function mn(){let e=h.value;if(!e)return"no document";let t=x.layoutSelection;if(t)return`<${t.tagName||"element"}> in ${t.layoutFile||"the layout"}`;let o=e.session.selection,n=Oe(o);if(n)return o.length>1?`${o.length} elements`:lo(ne(e.doc.document,n));let r=e.documentPath;return r?r.split("/").at(-1)??"document":"document"}
|
|
2
|
+
export{EE,TE,yS,ZI,lm,Cd,cm};
|
|
3
|
+
|
|
4
|
+
//# debugId=897BB05E2810FB6A64756E2164756E21
|
|
5
|
+
//# sourceMappingURL=studio-efvfrsf8.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{f,Qe}from"./studio-ffrrncvz.js";import{re}from"./studio-j1kvhdjk.js";import{ea,EC}from"./studio-zp7snvkq.js";import{xe,bl,oe,v,he,E,vl,Lh}from"./studio-wz73q5kq.js";import{Y,Jm,zc,so,Zy,Xy,Oa,eg,I1,b,h}from"./studio-24mccdrj.js";import{Xt,Li,af,rn,Go,G1,sa,J1}from"./studio-nwfrc98n.js";import{Wm}from"./studio-qvanvzfd.js";import{ck,rR,oR,ru,bg}from"./studio-v8aga3vp.js";import{co}from"./studio-2jbs3rxv.js";import{iL,BC}from"./studio-se2r3ptc.js";import{Pc}from"./studio-pag2wncm.js";import{Ts,io}from"./studio-ynn90f58.js";import{La,oy}from"./studio-6wkmf3wz.js";import{ny}from"./studio-b2xv945e.js";import{ne}from"./studio-y21g8zzg.js";import{i,ee,at,T,w}from"./studio-cffqvnzd.js";var ie={invokerTags:bg,popoverTags:ru},A="Popover",be={display:"document.repairPopoverDisplay","open-display":"document.repairPopoverDisplay",invoker:"document.repairPopoverInvoker",mode:"document.repairPopoverMode"};function se(e,r,l,a){let n=`${r}.${l}.${a.join("/")}`,d=e.get(n)??0;return e.set(n,d+1),d===0?n:`${n}#${d}`}function W(e,r){vl((d)=>d.source===A);let l=new Map,a=rR(e,ie);for(let d of a){let c=d.fix===void 0?void 0:be[d.fix],y={detail:d.detail,key:se(l,"popover",d.rule,d.path),source:A,tier:"problem"};if(c!==void 0)y.action=c,y.actionArgs={path:d.path};if(r!==void 0)y.path=r;E(d.severity,d.message,y)}let n=iL(e,ie);for(let d of n){let c={detail:d.detail,key:se(l,"dialog",d.rule,d.path),source:A,tier:"problem"};if(r!==void 0)c.path=r;E(d.severity,d.message,c)}return a.length+n.length}function J(e,r){let l=r?.path;if(!Array.isArray(l))throw RangeError(`command "${e}" needs a "path" argument naming the popover`);return l}function q(e){let r=h.value;if(!r)throw RangeError(`command "${e}" needs an open document`);return r}function ke(){return[{category:"Document",group:"2_document",id:"document.checkPopovers",level:"document",menus:["palette"],requires:"an open document",run:()=>{let e=q("document.checkPopovers"),r=W(e.doc.document,e.documentPath??void 0);E.success(r===0?"No popover problems found in this document.":`${r} popover problem(s) filed.`,{key:"popover.run",source:A})},title:"Check Popovers",when:(e)=>e.document.open,aiTool:{description:"Check the open document for popover defects an author can fix — a base-rule `display` "+"that defeats the browser's own hiding of a closed popover, `popovertarget` on an "+"element that cannot invoke, a target naming no popover, a cut exit animation — and "+"file each as a Problem. The findings come back as data.",name:"check_popovers",report:()=>{let e=Lh(A),r=e.length;return{data:e,summary:r===0?"No popover problems found in this document.":`Filed ${r} popover problem${r===1?"":"s"} in Problems.`}}}},{args:{additionalProperties:!1,properties:{path:{items:{type:["string","number"]},type:"array"}},required:["path"],type:"object"},category:"Document",group:"2_document",id:"document.repairPopoverDisplay",level:"document",menus:[],requires:"a popover whose base rule sets display",run:(e,r)=>{let a=q("document.repairPopoverDisplay"),n=J("document.repairPopoverDisplay",r),d=ne(a.doc.document,n),c=oR(d?.style);if(!c)throw RangeError(`command "${"document.repairPopoverDisplay"}": nothing to move — this popover sets no display`);Y(a,(y)=>{for(let g of c.base)zc(y,n,g,"");for(let g of c.breakpoints)Xy(y,n,[g],"display","");if(c.openDisplay!==null)Zy(y,n,":popover-open","display",c.openDisplay)}),E.success("Moved `display` into `:popover-open`.",{key:"popover.repaired.display",source:A})},title:"Move display into :popover-open",when:(e)=>e.document.open},{args:{additionalProperties:!1,properties:{path:{items:{type:["string","number"]},type:"array"}},required:["path"],type:"object"},category:"Document",group:"2_document",id:"document.repairPopoverInvoker",level:"document",menus:[],requires:"an element carrying popovertarget that cannot invoke",run:(e,r)=>{let a=q("document.repairPopoverInvoker"),n=J("document.repairPopoverInvoker",r);Y(a,(d)=>{so(d,n,"popovertarget"),so(d,n,"popovertargetaction")}),E.success("Removed the attributes, which did nothing on this element.",{key:"popover.repaired.invoker",source:A})},title:"Remove the inert popover attributes",when:(e)=>e.document.open},{args:{additionalProperties:!1,properties:{path:{items:{type:["string","number"]},type:"array"}},required:["path"],type:"object"},category:"Document",group:"2_document",id:"document.repairPopoverMode",level:"document",menus:[],requires:"a popover whose mode is not one of the three keywords",run:(e,r)=>{let a=q("document.repairPopoverMode"),n=J("document.repairPopoverMode",r);Y(a,(d)=>{so(d,n,"popover",ck)}),E.success(`Set \`popover\` to "${ck}".`,{key:"popover.repaired.mode",source:A})},title:"Set popover to auto",when:(e)=>e.document.open}]}function CT(e){e.registerAll(ke())}function Qb(e,r){if(e===r)return!0;if(Array.isArray(e)&&Array.isArray(r))return e.length===r.length&&e.every((l,a)=>l===r[a]);if(T(e)&&T(r)&&!Array.isArray(e)&&!Array.isArray(r))return e.$ref===r.$ref;return!1}var B="grid://",Tp={children:[],tagName:"div"};function ks(e){switch(e.kind){case"pages":return`${B}pages`;case"library":return`${B}library`;case"collection":return`${B}collection/${encodeURIComponent(e.name)}`;default:return`${B}data/${encodeURIComponent(e.connection)}/${encodeURIComponent(e.table)}`}}function Se(e){return e.startsWith(B)}function km(e){if(!Se(e))return null;let r=e.slice(B.length).split("/");if(r[0]==="pages"&&r.length===1)return{kind:"pages"};if(r[0]==="library"&&r.length===1)return{kind:"library"};if(r[0]==="collection"&&r.length===2&&r[1])return{kind:"collection",name:decodeURIComponent(r[1])};if(r[0]==="data"&&r.length===3&&r[1]&&r[2])return{connection:decodeURIComponent(r[1]),kind:"data",table:decodeURIComponent(r[2])};return null}function yx(e){let r=km(e);if(!r)return null;switch(r.kind){case"pages":return"Pages · grid";case"library":return"Library";case"collection":return`${r.name} · grid`;default:return`${r.table} @ ${r.connection} · grid`}}var le=0;function ae(e){let r=e.coalesceMs??800,l=e.now??(()=>Date.now()),n=v({deletes:new Set,errors:new Map,inserts:new Map,pending:new Map,redoStack:[],stale:new Set,undoStack:[]}),d=null,c=(t,o,s)=>{let u=n.errors.get(t);if(u)u.set(o,s);else n.errors.set(t,new Map([[o,s]]))},y=(t,o)=>{let s=n.errors.get(t);if(s?.delete(o),s?.size===0)n.errors.delete(t)},g=(t)=>{if(n.redoStack.length=0,d){d.push(t);return}let o=n.undoStack.at(-1);if(t.kind==="cell"&&o?.kind==="cell"&&o.rowKey===t.rowKey&&o.field===t.field&&t.at-o.at<=r){o.after=t.after,o.at=t.at;return}n.undoStack.push(t)},k=(t,o,s)=>{let u=n.inserts.get(t);if(u){if(s===null)delete u[o];else u[o]=s;return}if(Qb(s,e.resolveBaseline(t,o))){let p=n.pending.get(t);if(p?.delete(o),p?.size===0)n.pending.delete(t);return}let m=n.pending.get(t);if(m)m.set(o,{value:s});else n.pending.set(t,new Map([[o,{value:s}]]))},P=(t,o)=>{let s=n.inserts.get(t);if(s)return s[o]??null;let u=n.pending.get(t)?.get(o);return u?u.value:e.resolveBaseline(t,o)},F=(t,o)=>{let s=n.errors.get(t);return s?.get(o)??s?.get("*")??null},M=(t,o)=>{switch(t.kind){case"cell":{k(t.rowKey,t.field,o==="undo"?t.before:t.after);break}case"insert":{if(o==="undo")n.inserts.delete(t.tempKey);else n.inserts.set(t.tempKey,{...t.cells});break}case"drop-insert":{if(o==="undo")n.inserts.set(t.tempKey,{...t.cells});else n.inserts.delete(t.tempKey);break}case"delete":{if(o==="undo")n.deletes.delete(t.rowKey);else n.deletes.add(t.rowKey);break}default:{let s=o==="undo"?t.ops.toReversed():t.ops;for(let u of s)M(u,o);break}}},D=()=>{if(d)throw Error("edit-buffer: groups may not nest");d=[]},C=()=>{let t=d;if(d=null,!t)return;if(t.length===1)n.undoStack.push(t[0]);else if(t.length>1)n.undoStack.push({kind:"group",ops:t})},R=(t)=>{let o=(s)=>{switch(s.kind){case"cell":return t(s.rowKey)?null:s;case"insert":case"drop-insert":return t(s.tempKey)?null:s;case"delete":return t(s.rowKey)?null:s;default:{let u=s.ops.map((m)=>o(m)).filter((m)=>m!==null);return u.length>0?{kind:"group",ops:u}:null}}};n.undoStack=n.undoStack.map(o).filter((s)=>s!==null),n.redoStack=n.redoStack.map(o).filter((s)=>s!==null)};return{applyCommitResult(t){let o=new Set;for(let s of t.cells)if(s.ok){let u=n.pending.get(s.rowKey);if(u?.delete(s.field),u?.size===0)n.pending.delete(s.rowKey);y(s.rowKey,s.field)}else if(c(s.rowKey,s.field,s.error??"Save failed"),s.stale)n.stale.add(s.rowKey);for(let s of t.inserts)if(s.ok)n.inserts.delete(s.tempKey),n.errors.delete(s.tempKey),o.add(s.tempKey);else c(s.tempKey,"*",s.error??"Insert failed");for(let s of t.deletes)if(s.ok)n.deletes.delete(s.rowKey),n.pending.delete(s.rowKey),n.errors.delete(s.rowKey),o.add(s.rowKey);else if(c(s.rowKey,"*",s.error??"Delete failed"),s.stale)n.stale.add(s.rowKey);for(let s of o)n.stale.delete(s);if(o.size>0)R((s)=>o.has(s))},buildBatch(){let t=[];for(let[o,s]of n.pending){if(n.deletes.has(o))continue;for(let[u,m]of s)t.push({baseline:e.resolveBaseline(o,u),field:u,rowKey:o,value:m.value})}return{cells:t,deletes:[...n.deletes].map((o)=>({rowKey:o})),inserts:[...n.inserts].map(([o,s])=>({cells:{...s},tempKey:o}))}},canRedo:()=>n.redoStack.length>0,canUndo:()=>n.undoStack.length>0,cellError:F,cellState(t,o){if(F(t,o)!==null)return"error";if(n.stale.has(t))return"stale";if(n.inserts.has(t)||n.pending.get(t)?.has(o))return"dirty";return"clean"},deleteRow(t){if(n.deletes.has(t))return;let o=n.inserts.get(t);if(o){let s={...o};n.inserts.delete(t),n.errors.delete(t),n.stale.delete(t),g({cells:s,kind:"drop-insert",tempKey:t});return}n.deletes.add(t),g({kind:"delete",rowKey:t})},dirtyCount(){let t=n.inserts.size+n.deletes.size;for(let[o,s]of n.pending)if(!n.deletes.has(o))t+=s.size;return t},discardRow(t){n.pending.delete(t),n.deletes.delete(t),n.inserts.delete(t),n.errors.delete(t),n.stale.delete(t),R((o)=>o===t)},effectiveValue:P,beginGroup:D,endGroup:C,group(t){D();try{t()}finally{C()}},insertRow(t={}){le+=1;let o=`__new-${le}`;return n.inserts.set(o,{...t}),g({cells:{...t},kind:"insert",tempKey:o}),o},isDirty:()=>n.pending.size>0||n.inserts.size>0||n.deletes.size>0,isInsertKey:(t)=>n.inserts.has(t),markStale(t){for(let o of t)n.stale.add(o)},redo(){let t=n.redoStack.pop();if(!t)return!1;return M(t,"redo"),n.undoStack.push(t),!0},reset(){n.pending.clear(),n.inserts.clear(),n.deletes.clear(),n.errors.clear(),n.stale.clear(),n.undoStack.length=0,n.redoStack.length=0},rowState(t){if(n.deletes.has(t))return"pending-delete";if(n.inserts.has(t))return"pending-insert";if(n.stale.has(t))return"stale";if(n.pending.has(t)||n.errors.has(t))return"dirty";return"clean"},setCell(t,o,s){let u=P(t,o);if(Qb(u,s))return;k(t,o,s),g({after:s,at:l(),before:u,field:o,kind:"cell",rowKey:t})},state:n,undo(){let t=n.undoStack.pop();if(!t)return!1;return M(t,"undo"),n.redoStack.push(t),!0}}}var ce={array:220,boolean:70,date:130,enum:140,image:180,number:110,readonly:200,reference:200,string:180,text:340};function de(e){return Math.min(340,Math.max(90,Math.round(e*7.5)))}function Ce(e){if(e.$ref)return"reference";if(e.enum!==void 0&&Array.isArray(e.enum))return"enum";let r=e.type==="array"?void 0:e.format;if(Oa(r))return"image";if(r==="date"||r==="date-time")return"date";switch(e.type){case"number":case"integer":return"number";case"boolean":return"boolean";case"array":return"array";case"object":return"readonly";default:return(e.maxLength??0)>200||e.format==="markdown"?"text":"string"}}function ue(e){let r=e.replaceAll(/([a-z0-9])([A-Z])/g,"$1 $2").replaceAll(/[_-]+/g," ").trim();return r.charAt(0).toUpperCase()+r.slice(1)}function ey(e,r={}){let l=Object.entries(e?.properties??{}),a=new Set(e?.required),n=new Set(r.readonlyFields),d=l.map(([c,y])=>{let g=n.has(c)?"readonly":Ce(y),k=Array.isArray(y.enum)?Math.max(...y.enum.map((P)=>String(P).length),4):0;return{editable:g!=="readonly",field:c,kind:g,pk:c===r.idField,required:a.has(c),schema:y,title:ue(c),widthHint:g==="enum"?de(k+3):ce[g]}});return d.sort((c,y)=>{let g=(P)=>P.pk?0:P.required?1:2,k=g(c)-g(y);return k===0?0:k}),d}function ty(e,r=50){let l=e.slice(0,r),a=[];for(let n of l)for(let d of Object.keys(n))if(!a.includes(d))a.push(d);return a.map((n)=>{let d=l.flatMap((g)=>{let k=g[n];return k===null||k===void 0||k===""?[]:[k]}),c=Pe(d),y=Math.max(...d.map((g)=>jr(g).length),n.length,4);return{editable:!0,field:n,kind:c,title:ue(n),widthHint:c==="string"||c==="text"?de(y):ce[c]}})}function Pe(e){if(e.length===0)return"string";if(e.some((l)=>Array.isArray(l)))return"array";let r=e.map(String);if(e.every((l)=>at(l))||r.every((l)=>/^(true|false)$/i.test(l)))return"boolean";if(e.every((l)=>ee(l))||r.every((l)=>l.trim()!==""&&!Number.isNaN(Number(l.replaceAll(/[$€£¥,\s]/g,"")))))return"number";if(r.every((l)=>/^\d{4}-\d{2}-\d{2}([T ].*)?$/.test(l)))return"date";if(r.some((l)=>l.length>200))return"text";return"string"}function Zu(e,r){if(e===null||e===void 0)return null;switch(r.kind){case"number":{if(ee(e))return Number.isNaN(e)?null:e;let l=String(e).trim().replaceAll(/[$€£¥,\s]/g,"");if(l==="")return null;let a=Number(l);return Number.isNaN(a)?null:a}case"boolean":{if(at(e))return e;return String(e).trim().toLowerCase()==="true"}case"array":{if(Array.isArray(e))return e.map(String);let l=String(e).trim();return l===""?[]:l.split(",").map((a)=>a.trim()).filter(Boolean)}case"reference":{if(w(e)&&"$ref"in e){let a=e.$ref;return i(a)&&a!==""?a:null}let l=String(e).trim();return l===""?null:l}default:{let l=String(e);return l===""?null:l}}}function jr(e){if(e===null||e===void 0)return"";if(Array.isArray(e))return e.join(", ");if(T(e))return e.$ref;return String(e)}var vx="__key",H=new WeakMap;function ol(e){return e?H.get(he(e))??null:null}function Xu(e,r){let a=v({columns:[],error:null,grouping:null,loading:!1,query:{},rows:[],saving:!1,total:0}),n=new Map,d=(t)=>{n=new Map(t.map((o)=>[o.key,o]))},c=ae({resolveBaseline:(t,o)=>n.get(t)?.cells[o]??null}),y=async()=>{let t=await r.rows(a.query);a.rows=t.rows,a.total=t.total,d(t.rows)},g=(t)=>{let o=a.columns.filter((m)=>m.required&&m.editable);if(o.length===0)return null;let s=t.cells.filter((m)=>m.value===null&&o.some((p)=>p.field===m.field)).map((m)=>({error:"Required",field:m.field,ok:!1,rowKey:m.rowKey})),u=t.inserts.filter((m)=>o.some((p)=>m.cells[p.field]===null||m.cells[p.field]===void 0)).map((m)=>({error:`Missing required: ${o.filter((x)=>m.cells[x.field]===null||m.cells[x.field]===void 0).map((x)=>x.field).join(", ")}`,ok:!1,tempKey:m.tempKey}));if(s.length===0&&u.length===0)return null;return{cells:s,deletes:[],inserts:u}},k=(t)=>t===null||t===""||Array.isArray(t)&&t.length===0,P=(t,o,s)=>{if(s==="number")return(ee(t)?t:0)-(ee(o)?o:0);if(s==="boolean")return(t===!0?1:0)-(o===!0?1:0);return jr(t).localeCompare(jr(o))},F=()=>{let t=a.rows.map((u)=>u.key),{dir:o,orderBy:s}=a.query;if(s&&!r.capabilities.remoteSort){let u=a.columns.find((p)=>p.field===s)?.kind,m=o==="desc"?-1:1;t=t.toSorted((p,x)=>{let G=c.effectiveValue(p,s),z=c.effectiveValue(x,s);if(k(G)!==k(z))return k(G)?1:-1;return m*P(G,z,u)})}return a.grouping?[...M(t).values()].flat():t},M=(t)=>{let o=new Map;for(let s of t){let u=jr(c.effectiveValue(s,a.grouping)),m=o.get(u);if(m)m.push(s);else o.set(u,[s])}return o},D=null,C=()=>D?.refreshData(),R={addRow(t={}){let o=c.insertRow(t);return C(),o},bindView(t){D=t},buffer:c,deleteRows(t){if(t.length===0)return;c.group(()=>{for(let o of t)c.deleteRow(o)}),C()},discardRow(t){c.discardRow(t),C()},replaceAll(t,o){if(t==="")return 0;let s=a.columns.filter((p)=>p.editable&&(p.kind==="string"||p.kind==="text")),u=[...a.rows.map((p)=>p.key),...c.state.inserts.keys()],m=0;if(c.group(()=>{for(let p of u){if(c.rowState(p)==="pending-delete")continue;for(let x of s){let G=c.effectiveValue(p,x.field);if(i(G)&&G.includes(t))c.setCell(p,x.field,G.replaceAll(t,o)),m+=1}}}),m>0)C();return m},effectiveRows(){let t=(u)=>Array.isArray(u)?[...u]:T(u)?{$ref:u.$ref}:u,o=(u)=>{let m=[[vx,u]];for(let p of a.columns)m.push([p.field,t(c.effectiveValue(u,p.field))]);return Object.fromEntries(m)},s=F().map((u)=>o(u));for(let[u]of c.state.inserts)s.push(o(u));return s},groups(){if(!a.grouping)return[];return[...M(F())].map(([t,o])=>({count:o.length,value:t}))},async load(){a.loading=!0,a.error=null;try{a.columns=await r.columns(),await y()}catch(t){a.error=re(t)}finally{a.loading=!1}C()},async refresh(){if(c.isDirty()){if(!await co("Refresh Grid",`Discard ${c.dirtyCount()} pending change(s) and reload?`,{confirmLabel:"Discard & Reload",destructive:!0}))return}c.reset(),await r.refresh?.(),await this.load()},async save(){if(a.saving)return;let t=c.buildBatch(),o=t.cells.length+t.inserts.length+t.deletes.length;if(o===0){E.info("No grid changes to save.",{key:"grid.save"});return}let s=g(t);if(s){c.applyCommitResult(s),E.warn("Required cells are empty — fix the marked rows, then save again.",{key:"grid.save",source:"Data",tier:"problem"});return}if(t.deletes.length>0){if(!await co("Delete Rows",`Save will permanently delete ${t.deletes.length} row(s). Continue?`,{confirmLabel:"Delete & Save",destructive:!0}))return}let m=new Set(t.cells.map((p)=>p.rowKey)).size+t.inserts.length+t.deletes.length>5?La({title:"Saving grid"}):null;a.saving=!0;try{let p=await r.commit(t),x=(S,I)=>`${S}\x00${I}`,G=new Map(t.cells.map((S)=>[x(S.rowKey,S.field),S]));for(let S of p.cells){let I=G.get(x(S.rowKey,S.field));if(S.ok&&I){let te=n.get(S.rowKey);if(te)te.cells[S.field]=I.value}}if(c.applyCommitResult(p),p.inserts.some((S)=>S.ok)||p.deletes.some((S)=>S.ok))await y();let L=p.cells.filter((S)=>S.ok).length+p.inserts.filter((S)=>S.ok).length+p.deletes.filter((S)=>S.ok).length,X=o-L,Z=p.cells.filter((S)=>S.stale).length+p.deletes.filter((S)=>S.stale).length;if(X===0)E.success(`Saved ${L} change(s).`,{key:"grid.save"});else E.error(`Saved ${L} · ${X} failed${Z?` (${Z} stale)`:""} — kept pending.`,{action:"file.save",key:"grid.save",source:"Data"})}catch(p){E.error("Could not save the grid.",{action:"file.save",detail:re(p),key:"grid.save",source:"Data"})}finally{a.saving=!1,m?.done(),C()}},serializeForSource(){if(!r.serializeForSource)return null;return r.serializeForSource(c.buildBatch())},async setQuery(t){a.query=t,a.loading=!0;try{await y()}catch(o){a.error=re(o)}finally{a.loading=!1}C()},setGrouping(t){a.grouping=t,C()},async setSort(t){let o={...a.query};if(t)o.orderBy=t.field,o.dir=t.dir;else delete o.orderBy,delete o.dir;if(!r.capabilities.remoteSort){a.query=o,C();return}await this.setQuery(o)},source:r,state:a,tab:e};return e.scope.run(()=>{oe(()=>{e.doc.dirty=c.isDirty()}),Jm(e,{canRedo:()=>c.canRedo(),canUndo:()=>c.canUndo(),redo:()=>{c.redo(),C()},undo:()=>{c.undo(),C()}});let t=f();if(t.subscribeFileEvents&&r.backingPaths){let o=t.subscribeFileEvents((s)=>{let u=r.backingPaths(),m=new Set;for(let p of s){if(p.isDir)continue;let x=p.path.replaceAll("\\","/"),G=u.get(x);if(G!==void 0&&!Pc(x))m.add(G)}if(m.size===0)return;if(c.isDirty()){let p=m.has("*")?a.rows.map((x)=>x.key):[...m];c.markStale(p),E.warn("Grid rows changed on disk — marked stale; refresh to reload.",{key:"grid.stale",source:"Data"}),C()}else R.refresh()});bl(o)}bl(()=>{Jm(e,null),H.delete(he(e)),r.dispose?.()})}),H.set(he(e),R),R}async function Nd(e){let l=ol(e)?.serializeForSource();if(l)return l;await Xt();let a=Li(e.doc.sourceFormat);if(a?.capabilities.serialize){let n=e.doc.content.frontmatter,d=e.doc.document,c={...n,...d,children:d.children??[]};return sa(a.name,c,{mode:"roundtrip"})}if(e.doc.mode==="content"){let n=Go();if(n){let d=e.doc.content.frontmatter,c=Object.keys(d).length>0,y={...d,...e.doc.document};return sa(n.name,y,{frontmatter:c,mode:"roundtrip"})}}return io(e.doc.document,e.doc.layout??null)}var Ge=200,Re=500,Ee=2097152,V=new Map,N=!1,j=null,O=null,K=null,Q=null;function Te(){let e=[];for(let r of b.tabs.values())if(r.doc.dirty&&r.documentPath)e.push(r);return e}async function fe(){if(!Qe())return;let e=f();if(!e.setPreviewOverlay||!e.clearPreviewOverlay)return;let r=new Set;for(let l of Te()){let a=l.documentPath.replace(/^\.\//,""),n;try{n=await Nd(l)}catch{continue}if(n.length>Ee)continue;if(r.add(a),V.get(a)===n)continue;V.set(a,n),await e.setPreviewOverlay(a,n)}for(let l of V.keys())if(!r.has(l))V.delete(l),await e.clearPreviewOverlay(l)}function pe(){if(!N)return;let e=Date.now();if(K??=e,O)clearTimeout(O);let r=e-K,l=Math.max(0,Math.min(Ge,Re-r));O=setTimeout(()=>{O=null,K=null,Q=fe().finally(()=>{Q=null})},l)}function kT(){pe()}function ET(){if(N)return;N=!0,j=xe(),j.run(()=>{oe(()=>{for(let e of b.tabs.values())e.doc.dirty,e.doc.document;pe()})})}function TT(){if(N=!1,O)clearTimeout(O),O=null;K=null,j?.stop(),j=null,V.clear()}async function wx(){if(!N)return;if(O)clearTimeout(O),O=null,K=null;await Q,await fe()}var me=/^[A-Za-z0-9][A-Za-z0-9!#$&^_.+-]{0,126}$/,$e=new Set(["vnd","prs","x"]);function Oe(e){if(!i(e))return null;let[r,...l]=e.split(";"),a=(r??"").indexOf("/");if(a===-1)return null;let n=(r??"").slice(0,a).trim().toLowerCase(),d=(r??"").slice(a+1).trim().toLowerCase();if(!me.test(n)||!me.test(d))return null;let c=d.lastIndexOf("+"),y=c===-1?null:d.slice(c+1),g=c===-1?d:d.slice(0,c);if(y==="")return null;let k=g.indexOf("."),P=k===-1?null:g.slice(0,k),F=P!==null&&$e.has(P)?P:null,M=F===null?g:g.slice(F.length+1);if(M==="")return null;let D={};for(let C of l){let R=C.indexOf("=");if(R===-1)return null;let t=C.slice(0,R).trim().toLowerCase(),o=C.slice(R+1).trim();if(t==="")return null;if(o.startsWith('"')&&o.endsWith('"')&&o.length>=2)o=o.slice(1,-1);D[t]=o}return{parameters:D,subtype:M,suffix:y,tree:F,type:n}}function xx(e){let r=Oe(e);if(r===null)return null;let l=r.tree===null?"":`${r.tree}.`,a=r.suffix===null?"":`+${r.suffix}`;return`${r.type}/${l}${r.subtype}${a}`}var ge="text/markdown; variant=GFM",ye="application/yaml",St={".markdown":`${ge}; charset=utf-8`,".md":`${ge}; charset=utf-8`,".yaml":`${ye}; charset=utf-8`,".yml":`${ye}; charset=utf-8`};async function Fe(e,r){let l=await G1(e.name,r);return J1(e,l)}async function Vo(e,r){await Xt();let l=rn(e);if(!l||!l.capabilities.parse)throw af(e);return{...await Fe(l,r),format:l}}var cC=async(e,r)=>{if(e.documentPath&&rn(e.documentPath)){let a=await Vo(e.documentPath,r);return{document:a.document,frontmatter:a.frontmatter}}let l=Ts(r);return e.doc.layout=l.layout,{document:l.document}};function Me(e){return"showSaveFilePicker"in e}function U(e,r){if(e.documentPath!==null)r.path=e.documentPath;return r}var we=()=>{};function dC(e){we=e}function _(e){let r=e.doc.document;we(e.documentPath,r);let l=i(r.tagName)&&r.tagName.includes("-")?ny(r):null;if(l)E.warn(l,U(e,{key:`slots:${e.documentPath??e.id}`,source:"Components",tier:"problem"}));W(r,e.documentPath??void 0)}function De(e){return!Wm(e.documentPath??"")}async function Lp(e=h.value){if(!e)return!1;if(await BC(e.id),eg(e))return E.warn(`You have read access to this session — changes to ${e.documentPath??"this document"} stay in your browser and cannot be saved.`,U(e,{action:"file.save",key:`save.readOnly:${e.documentPath??e.id}`,source:"Collaboration"})),!1;if(!De(e))return E.warn(`${e.documentPath??"This file"} is a media file, so there is no document for Save to write.`,U(e,{key:`save.notADocument:${e.documentPath??e.id}`,source:"Save"})),!1;let r=ol(e);if(r)return await r.save(),!e.doc.dirty;try{if(await I1(e))return _(e),!0;let l=await Nd(e);if(e.documentPath)return await f().writeFile(e.documentPath,l),e.doc.dirty=!1,wx(),_(e),!0;if(e.fileHandle&&"createWritable"in e.fileHandle){let a=await e.fileHandle.createWritable();return await a.write(l),await a.close(),e.doc.dirty=!1,_(e),!0}E.warn("This document has no save target — use Export.",{key:"save.noTarget"})}catch(l){if(!(l instanceof Error&&l.name==="AbortError"))E.error(`Could not save ${e.documentPath??e.id}.`,U(e,{action:"file.save",detail:re(l),key:`save:${e.documentPath??e.id}`,source:"Save"}))}return!1}function Ae(e){return Li(e.doc.sourceFormat)??(e.doc.mode==="content"?Go():void 0)}async function uC(){let e=h.value;if(!e)return;try{await Xt();let r=Ae(e),l=await Nd(e),a=r?xx(r.mediaType)??"text/plain":"application/json",n=r?r.extensions[0]:".json",d=r?r.name:"Jx Component",c=r?`content${n}`:"component.json";if(Me(window)){let y=e.documentPath?e.documentPath.split("/").pop():c,g=await window.showSaveFilePicker({suggestedName:y,types:[{accept:{[a]:[n]},description:d}]}),k=await g.createWritable();await k.write(l),await k.close(),e.doc.dirty=!1,_(e),E.success(`Exported as ${g.name}.`)}else{let y=new Blob([l],{type:a}),g=URL.createObjectURL(y),k=document.createElement("a");k.href=g,k.download=c,k.click(),URL.revokeObjectURL(g),e.doc.dirty=!1,_(e),E.success(`Downloaded ${c}.`)}}catch(r){if(!(r instanceof Error&&r.name==="AbortError"))E.error("Could not export the document.",{detail:re(r),source:"Export"})}}async function ve(e,r){let l=Wm(e)?await oy(e):await ea({path:e});return EC(l,r)??""}async function Em(e){let r=await ve(e.path,"delete"),l=`Delete ${e.name}? This cannot be undone.`;return Boolean(await co("Delete File",r===""?l:`${l} ${r}`,{confirmLabel:"Delete",destructive:!0}))}async function Tm(e,r="rename"){let l=await ve(e,r);return l===""?void 0:l}
|
|
2
|
+
export{Qb,Tp,ks,km,yx,ey,ty,Zu,jr,vx,ol,Xu,CT,Nd,kT,ET,TT,wx,xx,Vo,cC,dC,Lp,uC,Em,Tm};
|
|
3
|
+
|
|
4
|
+
//# debugId=0C8A3D75A83AA16B64756E2164756E21
|
|
5
|
+
//# sourceMappingURL=studio-er30bpcx.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{Tt,zo,as,ah}from"./studio-vfcdrfmv.js";function sm(){return zo(Tt.cfToken)}function uS(t){as(Tt.cfToken,t||"")}function hS(){return zo(Tt.cfAccountId)}function YI(t){as(Tt.cfAccountId,t||"")}function pS(){ah([Tt.cfToken,Tt.cfAccountId])}
|
|
2
|
+
export{sm,uS,hS,YI,pS};
|
|
3
|
+
|
|
4
|
+
//# debugId=B4B22D58DE9B7CCA64756E2164756E21
|
|
5
|
+
//# sourceMappingURL=studio-ezscgr64.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{i,te,T}from"./studio-cffqvnzd.js";function Y1(n){globalThis.__jxPlatform=n}function dg(){return globalThis.__jxLauncher}var u=new Map;function Z1(){let n=[];for(let[e,o]of u)for(let r=0;r<o;r++)n.push(e);return n}function c(n){u.set(n,(u.get(n)??0)+1)}function g(n){let e=(u.get(n)??1)-1;if(e>0)u.set(n,e);else u.delete(n)}function d(n){return(T(n)||te(n))&&"then"in n&&te(n.then)}function m(n,e,o){return(...r)=>{let t=e.apply(o,r);if(!d(t))return t;c(n);let a=()=>{g(n)};return t.then(a,a),t}}function p(n){let e=new Map;return new Proxy(n,{get(o,r){let t=o[r];if(!te(t)||!i(r))return t;let a=e.get(r);if(a&&a.raw===t)return a.wrapper;let s=m(r,t,o);return e.set(r,{raw:t,wrapper:s}),s}})}var l=null;function f(){let n=globalThis.__jxPlatform;if(!n)throw Error("No platform registered. Call registerPlatform() before starting Studio.");if(l?.raw!==n)l={raw:n,wrapped:p(n)};return l.wrapped}function Qe(){return globalThis.__jxPlatform!=null}
|
|
2
|
+
export{Y1,dg,Z1,f,Qe};
|
|
3
|
+
|
|
4
|
+
//# debugId=93B2AA8DB9F6D4C764756E2164756E21
|
|
5
|
+
//# sourceMappingURL=studio-ffrrncvz.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import{f}from"./studio-ffrrncvz.js";import{Xt,rn}from"./studio-nwfrc98n.js";import{re}from"./studio-j1kvhdjk.js";import{Uo}from"./studio-jjkg84nj.js";import{Br,t$,ct,Dr,Ie,qe,ph,b,zr,bi}from"./studio-24mccdrj.js";import{v}from"./studio-wz73q5kq.js";import{Xs,Pc}from"./studio-pag2wncm.js";import{I,A,Ds,Lt}from"./studio-2jbs3rxv.js";import{bx,aC,lC}from"./studio-2hcbccfv.js";import{Ud,ir}from"./studio-qvanvzfd.js";import{Tp,ks,km,ey,ty,Zu,jr,Xu}from"./studio-er30bpcx.js";import{O}from"./studio-c7q0t9x1.js";import{i,ee,te,$h}from"./studio-cffqvnzd.js";function U(e){let r=[],t=[],o="",n=!1,s=!1,a=()=>{t.push(o),o="",s=!1},d=()=>{if(a(),t.length===1&&t[0]===""){t=[];return}r.push(t),t=[]};for(let l=0;l<e.length;l++){let c=e[l];if(n){if(c==='"')if(e[l+1]==='"')o+='"',l+=1;else n=!1;else o+=c;continue}if(c==='"'&&!s)n=!0,s=!0;else if(c==='"')o+=c;else if(c===",")a();else if(c===`
|
|
2
|
+
`)d();else if(c==="\r"){if(e[l+1]===`
|
|
3
|
+
`)l+=1;d()}else o+=c,s=!0}if(o!==""||t.length>0)d();return r}function dx(e){let r=(e.match(/\r\n/g)??[]).length,t=(e.match(/(?<!\r)\n/g)??[]).length,o=r>t?`\r
|
|
4
|
+
`:`
|
|
5
|
+
`,n=e.endsWith(`
|
|
6
|
+
`),s=U(e),a=s[0]??[],d=s.slice(1),l=Math.max(a.length,...d.map((c)=>c.length),0);while(a.length<l)a.push("");for(let c of d)while(c.length<l)c.push("");return{eol:o,headers:a,rows:d,trailingNewline:n}}function Y(e){if(/[",\n\r]/.test(e))return`"${e.replaceAll('"','""')}"`;return e}function R(e){return[e.headers,...e.rows].map((t)=>t.map((o)=>Y(o)).join(",")).join(e.eol)+(e.trailingNewline?e.eol:"")}var W=["id","sku","slug","Slug"];function Q(e){let r=new Set;return e.map((t,o)=>{let n=t.trim()===""?`column${o+1}`:t;if(r.has(n))n=`${n}__${o+1}`;return r.add(n),n})}function J(e,r){for(let t of W){let o=e.indexOf(t);if(o===-1)continue;let n=r.rows.map((s)=>s[o]??"");if(n.every((s)=>s!=="")&&new Set(n).size===n.length)return t}return null}function P(e,r){let t=dx(e),o=Q(t.headers),n=J(o,t),s=n?o.indexOf(n):-1,a=t.rows.map((u,p)=>s===-1?String(p):u[s]),d=new Map(a.map((u,p)=>[u,p])),l=ph(r,O?.projectConfig),c=l?.schema.properties??{},h=t.rows.slice(0,50).map((u)=>{let p={};for(let[w,S]of o.entries())p[S]=u[w]??"";return p}),m=new Map(ty(h).map((u)=>[u.field,u])),y=new Map(ey(l?.schema,{idField:n??void 0}).map((u)=>[u.field,u]));return{columns:o.map((u,p)=>{let S=(u in c?y.get(u):void 0)??m.get(u)??{editable:!0,field:u,kind:"string",title:t.headers[p]||u};return{...S,pk:u===n,title:t.headers[p]?.trim()||S.title}}),doc:t,fields:o,keys:a,keyToIndex:d,loadText:e}}function q(e,r){let t={},o=e.doc.rows[r]??[];for(let[n,s]of e.fields.entries()){let a=e.columns[n],d=o[n]??"";t[s]=a.kind==="string"||a.kind==="text"||a.kind==="readonly"?d:Zu(d,a)}return t}function T(e,r){let t=e.doc.rows.map((s)=>[...s]),o=(s)=>e.fields.indexOf(s);for(let s of r.cells){let a=e.keyToIndex.get(s.rowKey),d=o(s.field);if(a===void 0||d===-1)continue;t[a][d]=jr(s.value)}for(let s of r.inserts){let a=e.fields.map((d)=>jr(s.cells[d]??null));t.push(a)}let n=r.deletes.map((s)=>e.keyToIndex.get(s.rowKey)).filter((s)=>s!==void 0).toSorted((s,a)=>a-s);for(let s of n)t.splice(s,1);return{...e.doc,rows:t}}function F(e,r){return{cells:e.cells.map((t)=>({field:t.field,rowKey:t.rowKey,...r})),deletes:e.deletes.map((t)=>({rowKey:t.rowKey,...r})),inserts:e.inserts.map((t)=>({error:r.error,ok:r.ok,tempKey:t.tempKey}))}}function ux(e){let r=null,t=(o=!1)=>{if(!o&&r)return r;return r=f().readFile(e).then((n)=>P(n,e)),r};return{backingPaths:()=>new Map([[e,"*"]]),capabilities:{delete:!0,insert:!0,remotePaging:!1,remoteSort:!1},async columns(){return(await t()).columns},async commit(o){let n=await t(),s=f(),a=null;try{a=await s.readFile(e)}catch{a=null}if(a!==n.loadText&&!Pc(e))return F(o,{error:"File changed on disk — refresh to reload",ok:!1,stale:!0});let d=T(n,o),l=R(d);return Xs(e),await s.writeFile(e,l),r=Promise.resolve(P(l,e)),F(o,{ok:!0})},id:e,label:e.split("/").pop()??e,async refresh(){await t(!0)},async rows(){let o=await t(),n=o.doc.rows.map((s,a)=>({cells:q(o,a),key:o.keys[a]}));return{rows:n,total:n.length}},async serializeForSource(o){let n=await t();return R(T(n,o))}}}var j={$schema:"https://jxsuite.com/schema/v1",$id:"StudioGridOpen",$description:"Every grid-able source a project has, grouped by where it comes from: the project's own pages and content collections first, then each connection's tables. It is the ISLAND of a confirm dialog rather than a dialog of its own — `ui/layers.ts`'s dialog owns the headline, the cancel button, modality and focus, and this document is only the list — because a second answer to \"what is a dialog\" is a defect (studio-ui-guidelines.md §12.5). Group headings are why it is not the kit menu: a menu row can carry a divider above it and cannot carry a name for the run it opens.",tagName:"div",attributes:{part:"sources"},style:{display:"flex",flexDirection:"column",gap:"var(--jx-space-3)",minWidth:"280px",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",color:"var(--fg)",'& [part="group-title"]':{margin:"0",fontSize:"var(--jx-text-xs)",fontWeight:"600",textTransform:"uppercase",letterSpacing:"0.04em",color:"var(--fg-dim)"},'& [part="rows"]':{display:"flex",flexDirection:"column",gap:"1px",marginTop:"var(--jx-space-1)"},'& [part="source"]':{textAlign:"left",background:"none",border:"none",color:"var(--fg)",font:"inherit",padding:"var(--jx-space-2) var(--jx-space-2)",borderRadius:"var(--jx-radius-sm)",cursor:"pointer"},'& [part="source"]:hover':{background:"var(--bg-hover)"},'& [part="source"]:focus-visible':{outline:"var(--jx-focus-ring)",outlineOffset:"-2px"},'& [part="group-empty"]':{margin:"0",padding:"var(--jx-space-2)",color:"var(--fg-dim)",fontSize:"var(--jx-text-sm)"}},children:[{$prototype:"Array",items:{$ref:"#/state/groups"},key:{$ref:"$map/item/key"},map:{$description:"One origin of grid-able sources. A connection with no tables says why it has none instead of drawing an empty box — an author who has not pushed a schema yet is exactly the reader who needs the sentence.",tagName:"section",attributes:{part:"group","data-group":"${$map.item.key}"},children:[{tagName:"h3",attributes:{part:"group-title"},textContent:"${$map.item.title}"},{tagName:"div",attributes:{part:"rows"},$switch:{$ref:"$map/item/state"},cases:{listed:{tagName:"div",attributes:{part:"rows-list",role:"none"},style:{display:"contents"},children:[{$prototype:"Array",items:{$ref:"$map/item/rows"},key:{$ref:"$map/item/id"},map:{tagName:"button",attributes:{part:"source",type:"button","data-source":"${$map.item.id}"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/open"},value:[{$ref:"$map/item/id"}]}]},textContent:"${$map.item.label}"}}]},empty:{tagName:"p",attributes:{part:"group-empty"},textContent:"${$map.item.emptyMessage}"}}}]}}]};I("grid-open",j);function E(e,r,t){let o=v({groups:r,open:t}),n=null,s=!1,a=A("grid-open",o,e).then((d)=>{let l=d.root;if(s)return d.dispose(),l;return n=d,l});return{dispose(){s=!0,n?.dispose(),n=null},ready:a}}function C(){try{return f()}catch{return null}}function cx(){return te(C()?.dataRows)}async function M(){let e=C();if(!te(e?.dataConnections))return null;return e.dataConnections()}async function dT(e){let r=C();if(!te(r?.dataConnectionTest))return{error:"Connection tests are not supported by this backend",ok:!1};try{return await r.dataConnectionTest(e)}catch(t){return{error:t instanceof Error?t.message:String(t),ok:!1}}}async function QS(e){let r=C();if(!te(r?.dataPush))return{applied:!1,errors:["Schema push is not supported by this backend"],plan:[]};try{return await r.dataPush(e)}catch(t){return{applied:!1,errors:[t instanceof Error?t.message:String(t)],plan:[]}}}function x(e){let t=C()?.[e];if(t===void 0)throw Error(`The ${String(e)} surface is not supported by this backend`);return t}function k(e){return x("dataRows")(e)}function K(e){return x("dataInsertRow")(e)}function _(e){return x("dataUpdateRow")(e)}function N(e){return x("dataDeleteRow")(e)}function uT(e,r,t){let o=(a)=>a.replaceAll(/([a-z0-9])([A-Z])/g,"$1_$2").replaceAll(/[^A-Za-z0-9]+/g,"_").replaceAll(/^_+|_+$/g,"").toUpperCase(),s=[r??e,t.replace(/Env$/,"")].flatMap((a)=>{let d=o(a);return d?[d]:[]}).join("_")||"SECRET";return/^\d/.test(s)?`JX_${s}`:s}var Z=50;function oe(e){let r=e.toLowerCase();if(/(int|real|floa|doub|num|dec)/.test(r))return"number";if(r.includes("bool"))return"boolean";if(/(timestamp|datetime|date)/.test(r))return"date";return"string"}function ne(e){return!e.pk&&e.name!=="created_at"&&e.name!=="updated_at"}function ie(e){if(e===void 0)return null;if($h(e))return e;return JSON.stringify(e)}function B(e,r){let t=[],o="id",n=new Map,s=(l)=>{if(l.length>0)t=l,o=l.find((c)=>c.pk)?.name??"id"},a=(l)=>{let c={table:r};if(e)c.connection=e;if(c.limit=l?.limit??Z,c.offset=l?.offset??0,l?.orderBy)c.dir=l.dir??"asc",c.orderBy=l.orderBy;return c},d=(l,c)=>{let h=l[o];if(i(h)||ee(h))return n.set(String(h),h),String(h);return`row-${c}`};return{capabilities:{delete:!0,insert:!0,remotePaging:!0,remoteSort:!0},async columns(){if(t.length===0){let l=await k(a({limit:1,offset:0}));s(l.columns)}return t.map((l)=>{let c=ne(l)?oe(l.type):"readonly";return{editable:c!=="readonly",field:l.name,kind:c,pk:l.pk===!0,title:l.name,widthHint:l.pk?80:void 0}})},async commit(l){let c={cells:[],deletes:[],inserts:[]},h=new Map;for(let m of l.cells){let y=h.get(m.rowKey)??[];y.push({field:m.field,value:m.value}),h.set(m.rowKey,y)}for(let[m,y]of h){let g=n.get(m),u=(p,w)=>{for(let S of y)c.cells.push({error:w,field:S.field,ok:p,rowKey:m})};if(g===void 0){u(!1,"Row has no primary key — refresh the grid");continue}try{let p={};for(let S of y)p[S.field]=S.value;let w={pk:g,set:p,table:r};if(e)w.connection=e;await _(w),u(!0)}catch(p){u(!1,p instanceof Error?p.message:String(p))}}for(let m of l.inserts)try{let y={};for(let[S,D]of Object.entries(m.cells))if(D!==null)y[S]=D;let g={table:r,values:y};if(e)g.connection=e;let{row:u}=await K(g),p=u[o],w;if(i(p)||ee(p))w=String(p),n.set(w,p);c.inserts.push({newKey:w,ok:!0,tempKey:m.tempKey})}catch(y){c.inserts.push({error:y instanceof Error?y.message:String(y),ok:!1,tempKey:m.tempKey})}for(let m of l.deletes){let y=n.get(m.rowKey);if(y===void 0){c.deletes.push({error:"Row has no primary key — refresh the grid",ok:!1,rowKey:m.rowKey});continue}try{let g={pk:y,table:r};if(e)g.connection=e;await N(g),c.deletes.push({ok:!0,rowKey:m.rowKey})}catch(g){c.deletes.push({error:g instanceof Error?g.message:String(g),ok:!1,rowKey:m.rowKey})}}return c},id:ks({connection:e??"default",kind:"data",table:r}),label:r,async refresh(){t=[],n.clear()},async rows(l){let c=await k(a(l));return s(c.columns),{rows:c.rows.map((m,y)=>{let g=d(m,y),u={};for(let p of t)u[p.name]=ie(m[p.name]);return{cells:u,key:g}}),total:c.total}}}}var Gb=[{key:"all",label:"All"},{dir:"pages",key:"pages",label:"Pages"},{dir:"layouts",key:"layouts",label:"Layouts"},{dir:"components",key:"components",label:"Components"},{dir:"content",key:"content",label:"Content"},{dir:"public",key:"media",label:"Media"}],eC=Gb.map((e)=>e.key);function hx(e){return Gb.find((r)=>r.key===e)}function tC(e){return hx(e)?.dir}function se(e,r){if(r&&Ud.has(r))return"Media";if(e.startsWith("pages"))return"Pages";if(e.startsWith("layouts"))return"Layouts";if(e.startsWith("components"))return"Components";if(e.startsWith("content"))return"Content";if(e.startsWith("public"))return"Media";if(e.startsWith("data"))return"Content";if(e.startsWith("styles"))return"Components";return"Other"}function ae(e){let r=O?.projectConfig?.content??{};for(let[t,o]of Object.entries(r)){if(!o.source)continue;let n=o.source.replace(/^\.\//,"").replace(/\/$/,"");if(e.startsWith(`${n}/`)||e===n)return t.charAt(0).toUpperCase()+t.slice(1)}return null}var le=new Set(["node_modules",".git",".jx","dist","build",".cache"]);async function H(e,r,t,o,n){let s;try{s=await Uo(()=>r.listDirectory(e))}catch(d){o.push({dir:e,error:re(d)});return}let a=[];for(let d of s){if(d.type==="directory"){if(!le.has(d.name))a.push(d.path);continue}let l=ir(d.name),c=se(d.path,l);t.push({category:c,ext:l,locale:t$(d.path,n)??void 0,modified:d.modified,name:d.name,path:d.path,size:d.size,type:c==="Content"?ae(d.path)??l:l||"file"})}await Promise.all(a.map((d)=>H(d,r,t,o,n)))}async function _m(e,r){let t=[],o=[],{i18n:n}=Br(O?.projectConfig??{});return await Promise.all(e.map((s)=>H(s,r,t,o,n))),t.sort((s,a)=>s.path.localeCompare(a.path)),{failures:o,files:t}}function hT(e,r){let t=e,o=hx(r.category);if(o&&o.key!=="all")t=t.filter((a)=>a.category===o.label);let n=r.query.trim().toLowerCase();if(n)t=t.filter((a)=>a.name.toLowerCase().includes(n)||a.path.toLowerCase().includes(n));let s=r.locale?.trim();if(s)t=t.filter((a)=>a.locale===s);return t}var Sm=["table","cards","media","calendar","board"],px={board:"Board",calendar:"Calendar",cards:"Cards",media:"Media",table:"Table"};var pT=new Set(["cards","media"]),ce=/^(\d{4}-\d{2}-\d{2})/;function de(e){let r=ce.exec(e.name);if(r)return r[1];if(e.modified){let t=new Date(e.modified);if(!Number.isNaN(t.getTime()))return t.toISOString().slice(0,10)}return null}function nC(){return Br(O?.projectConfig??{}).i18n?.locales??[]}function fT(e){let r=new Set;for(let t of e)if(t.locale)r.add(t.locale);return nC().filter((t)=>r.has(t))}function mT(e){let r=new Map,t=[];for(let n of e){let s=de(n);if(s===null){t.push(n);continue}let a=r.get(s);if(a)a.push(n);else r.set(s,[n])}return{days:[...r.entries()].map(([n,s])=>({date:n,files:s})).toSorted((n,s)=>s.date.localeCompare(n.date)),undated:t}}function gT(e){let r=new Map;for(let o of e){let n=r.get(o.category);if(n)n.push(o);else r.set(o.category,[o])}let t=Gb.map((o)=>o.label);return[...r.entries()].map(([o,n])=>({files:n,group:o})).toSorted((o,n)=>{let s=t.indexOf(o.group),a=t.indexOf(n.group);if(s===a)return o.group.localeCompare(n.group);return(s===-1?t.length:s)-(a===-1?t.length:a)})}var G="The Library lists files; it does not edit them. Rename, duplicate or delete from the file's context menu, or open the file to edit it.";function fx(){return[{editable:!1,field:"name",kind:"string",pk:!0,title:"Name",widthHint:260},{editable:!1,field:"category",kind:"string",title:"Category",widthHint:120},{editable:!1,field:"locale",kind:"string",title:"Locale",widthHint:90},{editable:!1,field:"type",kind:"string",title:"Type",widthHint:120},{editable:!1,field:"size",kind:"number",title:"Size",widthHint:90},{editable:!1,field:"modified",kind:"date",title:"Modified",widthHint:160},{editable:!1,field:"path",kind:"readonly",title:"Path",widthHint:320}]}function ue(e){return{cells:{category:e.category,locale:e.locale??null,modified:e.modified??null,name:e.name,path:e.path,size:e.size??null,type:e.type},key:e.path}}function Jb(){return ks({kind:"library"})}function bT(e){let r=null,t=null,o=e??(()=>O?.projectDirs??[]);async function n(){if(r)return r;return t??=_m(o(),f()).then((s)=>(r=s,t=null,s)),t}return{capabilities:{delete:!1,insert:!1,remotePaging:!1,remoteSort:!1},columns:()=>Promise.resolve(fx()),commit(s){return Promise.resolve({cells:s.cells.map((a)=>({error:G,field:a.field,ok:!1,rowKey:a.rowKey})),deletes:s.deletes.map((a)=>({error:G,ok:!1,rowKey:a.rowKey})),inserts:s.inserts.map((a)=>({error:G,ok:!1,tempKey:a.tempKey}))})},failures:()=>r?.failures??[],files:()=>r?.files??[],id:Jb(),label:"Library",async refresh(){r=null,t=null,await n()},async rows(){let s=await n();return{rows:s.files.map((a)=>ue(a)),total:s.files.length}},scanned:()=>r!==null}}async function yT(e,r={}){let t=b.tabs.get(e);if(t)return bi(e,{focus:r.focus!==!1}),t;try{await Xt()}catch{}let o=ux(e),n=zr({capabilities:{modes:["grid","source"]},document:structuredClone(Tp),documentPath:e,id:e,sourceFormat:rn(e)?.name??null,...r.paneId!==void 0&&{paneId:r.paneId},...r.preview===!0&&{preview:!0},...r.focus===!1&&{focus:!1}});return Xu(n,o).load(),n}function L(e){let r=zr({capabilities:{modes:["grid"]},document:structuredClone(Tp),documentPath:null,id:e.id});return Xu(r,e).load(),r}function z(e){let r=ks({kind:"collection",name:e}),t=b.tabs.get(r);if(t)return bi(r),t;return L(aC(e))}function vT(){let e=Jb(),r=b.tabs.get(e);if(r)return bi(e),r;return zr({capabilities:{modes:["manage"]},document:structuredClone(Tp),documentPath:null,id:e})}function iC(){let e=ks({kind:"pages"}),r=b.tabs.get(e);if(r)return bi(e),r;return L(lC())}function V(e,r){let t=ks({connection:e??"default",kind:"data",table:r}),o=b.tabs.get(t);if(o)return bi(t),o;return L(B(e,r))}function pe(e){let r=km(e);if(r?.kind==="pages")iC();else if(r?.kind==="collection")z(r.name);else if(r?.kind==="data")V(r.connection,r.table)}function me(e,r){return[{emptyMessage:"",key:"project",rows:[{id:ks({kind:"pages"}),label:"Pages"},...e.map(({name:t})=>({id:ks({kind:"collection",name:t}),label:`Collection: ${t}`}))],state:"listed",title:"Project"},...r.map((t)=>({emptyMessage:"No tables — push a schema first.",key:`data:${t.name}`,rows:t.tables.map((o)=>({id:ks({connection:t.name,kind:"data",table:o}),label:o})),state:t.tables.length===0?"empty":"listed",title:`Data · ${t.name}`}))]}async function wT(){let e=bx(),r=[];if(cx())r=(await M().catch(()=>null))?.connections??[];let t=null,o=Ds({cancelLabel:"Cancel",confirmLabel:"",headline:"Open Grid",island:(n)=>{t=E(n,me(e,r),(s)=>{o.close(),pe(s)})},layer:Lt("dialog"),onCancel:()=>o.close(),onClosed:()=>{t?.dispose(),t=null},onConfirm:()=>{},region:"grid/open"});o.ready}function fe(){return[{args:Ie({name:qe("The content collection's name, as project.json declares it.")}),category:"Project",id:"collection.editInGrid",level:"project",menus:["context/file","palette"],group:"5_data",requires:"a project that declares content collections",when:(e)=>e.project.open,run:(e,r)=>{let t=ct("collection.editInGrid",r,"name"),o=bx().map((n)=>n.name);if(!o.includes(t))throw RangeError(`command "collection.editInGrid" argument "name": "${t}" is not a content `+"collection this project declares — it declares: "+`${o.length>0?o.join(", "):"none"}`);z(t)},title:"Edit Collection in Grid"},{args:{additionalProperties:!1,properties:{connection:qe('The connection name from project.json. Defaults to "default".'),table:qe("The table to open.")},required:["table"],type:"object"},category:"Project",id:"data.openGrid",level:"project",menus:["palette"],group:"5_data",requires:"a platform that serves the data routes",when:(e)=>e.project.open,enablement:(e)=>e.capability.dataRows,run:(e,r)=>{let t=ct("data.openGrid",r,"table");V(Dr("data.openGrid",r,"connection"),t)},title:"Open Data Grid"}]}function xT(e){e.registerAll(fe())}
|
|
7
|
+
export{cx,dT,QS,uT,dx,ux,Gb,eC,hx,tC,_m,hT,Sm,px,pT,nC,fT,mT,gT,fx,Jb,bT,yT,vT,iC,wT,xT};
|
|
8
|
+
|
|
9
|
+
//# debugId=F237B833B1C3E43564756E2164756E21
|
|
10
|
+
//# sourceMappingURL=studio-fpphgn8y.js.map
|