@jxsuite/studio 2.2.1 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/css-meta.json +1487 -0
- package/data/elements-meta.json +370 -0
- package/data/html-meta.json +366 -0
- package/data/stylebook-meta.json +200 -0
- package/data/webdata.json +1621 -0
- package/dist/chunks/{Overlay.dev-ymy3et3y.js → Overlay.dev-d2ajy6sj.js} +7 -7
- package/dist/chunks/{content-source-r2n7v682.js → content-source-56xpvx83.js} +13 -12
- package/dist/chunks/{convert-to-repeater-cnpyvj74.js → convert-to-repeater-0xh9wwek.js} +12 -11
- package/dist/chunks/{extension-sections-vpcm4jvx.js → extension-sections-g34239vm.js} +17 -16
- package/dist/chunks/{files-zeg88k2d.js → files-gkz202dp.js} +18 -19
- package/dist/chunks/{format-host-taymsw55.js → format-host-pej3srnw.js} +2 -2
- package/dist/chunks/{git-panel-qp4rrwr9.js → git-panel-4j6xbh8g.js} +12 -11
- package/dist/chunks/{layers-panel-kj93w2zg.js → layers-panel-8mvn8sgd.js} +15 -14
- package/dist/chunks/{monaco-setup-xy3bs05d.js → monaco-setup-a5wkmbgh.js} +6 -3
- package/dist/chunks/{publish-panel-6qz6kp41.js → publish-panel-ptddc3kg.js} +6 -6
- package/dist/chunks/{quick-search-9wwa09hh.js → quick-search-j88azfs2.js} +19 -18
- package/dist/chunks/right-panel-egkaxy89.js +38 -0
- package/dist/chunks/{sp-overlay.dev-h6kdx076.js → sp-overlay.dev-s18hymn9.js} +8 -8
- package/dist/chunks/sp-progress-circle.dev-0zxcyz3r.js +15 -0
- package/dist/chunks/sp-tooltip.dev-5c6d1kjz.js +15 -0
- package/dist/chunks/{studio-753znj4c.js → studio-0e4h32g6.js} +5 -5
- package/dist/chunks/{studio-yz9s88s0.js → studio-10s469da.js} +25 -9
- package/dist/chunks/{studio-6f0am8f2.js → studio-2w11grav.js} +2 -2
- package/dist/chunks/{studio-zqv3w24n.js → studio-3q65xvzv.js} +5 -5
- package/dist/chunks/{studio-qhh8r5fz.js → studio-4058pg09.js} +4 -4
- package/dist/chunks/{studio-hekaagev.js → studio-4enps87v.js} +17 -17
- package/dist/chunks/{studio-tqemhphj.js → studio-50eed4c9.js} +4 -4
- package/dist/chunks/studio-53n8bp04.js +16 -0
- package/dist/chunks/{studio-nqq8jk8f.js → studio-5amdrjm4.js} +14 -14
- package/dist/chunks/{studio-6zzbyx17.js → studio-5ne8mdx9.js} +2 -2
- package/dist/chunks/{studio-3z8jjm2p.js → studio-7ejemhej.js} +3 -3
- package/dist/chunks/{studio-1kgfcv7s.js → studio-a11d3a1b.js} +12 -11
- package/dist/chunks/{studio-rgwcpast.js → studio-ay8wcr2b.js} +2 -2
- package/dist/chunks/{studio-fys6z73y.js → studio-bak2cyjr.js} +7 -7
- package/dist/chunks/{studio-xmvbhg31.js → studio-c31yb4t6.js} +2 -2
- package/dist/chunks/{studio-8sdyjfd6.js → studio-cf4rk7kv.js} +2 -2
- package/dist/chunks/{studio-yphy4z9m.js → studio-cv606rs1.js} +5 -5
- package/dist/chunks/{studio-5kt960pk.js → studio-hk523hby.js} +133 -147
- package/dist/chunks/{studio-x0et2z9g.js → studio-hs8x23fv.js} +15 -15
- package/dist/chunks/{studio-p471gg5n.js → studio-kvfx9z2c.js} +7 -3
- package/dist/chunks/{studio-22xr4q8q.js → studio-ncnet0ba.js} +18 -29
- package/dist/chunks/{studio-ckwz4d3x.js → studio-twsafr1e.js} +2 -2
- package/dist/chunks/{studio-qrsfh1w7.js → studio-tzx3xmvx.js} +5 -5
- package/dist/chunks/{studio-g8t7g0gp.js → studio-vdpcpada.js} +3 -3
- package/dist/chunks/{studio-6a0h7sne.js → studio-vhk5fmfv.js} +2 -2
- package/dist/chunks/{studio-hrajjyt2.js → studio-wdt9y92a.js} +2 -2
- package/dist/chunks/{studio-r8vx7bkz.js → studio-x3etxs0s.js} +14 -13
- package/dist/chunks/{studio-pv8m0h4a.js → studio-yxzgjq8q.js} +28 -23
- package/dist/chunks/{studio-300zsz1k.js → studio-zdkgwhkv.js} +6 -6
- package/dist/codicon.ttf +0 -0
- package/dist/iframe-entry.js +8 -1
- package/dist/manifest.json +82 -0
- package/dist/studio.js +232 -103
- package/index.html +0 -50
- package/package.json +12 -5
- package/src/canvas/iframe-entry.ts +5 -0
- package/src/canvas/iframe-host.ts +45 -4
- package/src/content/entry-editor.ts +2 -1
- package/src/editor/context-menu.ts +13 -2
- package/src/editor/slash-menu.ts +26 -11
- package/src/files/files.ts +11 -23
- package/src/grid/grid-panel.ts +27 -6
- package/src/hosting/document.ts +109 -0
- package/src/hosting/layout.ts +211 -0
- package/src/hosting/stage.ts +166 -0
- package/src/hosting/tsconfig.json +18 -0
- package/src/panels/ai-chat/chat-view.ts +25 -14
- package/src/panels/git-panel.ts +17 -14
- package/src/panels/head-panel.ts +32 -14
- package/src/panels/imports-panel.ts +32 -13
- package/src/panels/layers-panel.ts +9 -1
- package/src/panels/panel-registry.ts +0 -1
- package/src/panels/properties-panel.ts +3 -3
- package/src/panels/settings-pane.ts +1 -1
- package/src/panels/style-panel.ts +3 -3
- package/src/panels/stylebook-panel.ts +10 -1
- package/src/panels/toolbar.ts +1 -1
- package/src/services/bundle-base.ts +69 -0
- package/src/services/monaco-setup.ts +19 -13
- package/src/shell/tree.ts +155 -0
- package/src/shell.ts +0 -2
- package/src/studio.ts +22 -2
- package/src/types.ts +15 -0
- package/src/ui/regions.ts +10 -45
- package/styles/overlays.css +35 -0
- package/dist/chunks/2020-xp8vnwma.js.map +0 -24
- package/dist/chunks/Overlay.dev-ymy3et3y.js.map +0 -9
- package/dist/chunks/adapter-jkcyhgtr.js.map +0 -9
- package/dist/chunks/cf-settings-g5fbf2zp.js.map +0 -9
- package/dist/chunks/components-z6cnkyy1.js.map +0 -9
- package/dist/chunks/content-source-r2n7v682.js.map +0 -9
- package/dist/chunks/convert-to-repeater-cnpyvj74.js.map +0 -10
- package/dist/chunks/editor-cptq5jp1.js.map +0 -9
- package/dist/chunks/extension-sections-vpcm4jvx.js.map +0 -11
- package/dist/chunks/files-zeg88k2d.js.map +0 -9
- package/dist/chunks/flow-qbfgrpeh.js.map +0 -12
- package/dist/chunks/focus-trap.esm-ggawf1hy.js.map +0 -11
- package/dist/chunks/focus-visible-6eg70z18.js.map +0 -10
- package/dist/chunks/format-host-taymsw55.js.map +0 -9
- package/dist/chunks/git-panel-qp4rrwr9.js.map +0 -9
- package/dist/chunks/index-nj44jpzj.js.map +0 -14
- package/dist/chunks/index-zqxmqxmh.js.map +0 -9
- package/dist/chunks/javascript-q8kpmfah.js.map +0 -11
- package/dist/chunks/jsonMode-dkr040ga.js.map +0 -18
- package/dist/chunks/jx-validate-jj9rnt4n.js.map +0 -9
- package/dist/chunks/layers-panel-kj93w2zg.js.map +0 -9
- package/dist/chunks/monaco-binding-rj6xpx9y.js.map +0 -10
- package/dist/chunks/monaco-setup-xy3bs05d.js.map +0 -15
- package/dist/chunks/publish-panel-6qz6kp41.js.map +0 -9
- package/dist/chunks/quick-search-9wwa09hh.js.map +0 -9
- package/dist/chunks/right-panel-faf816ch.js +0 -37
- package/dist/chunks/right-panel-faf816ch.js.map +0 -9
- package/dist/chunks/section-registry-sx1ykvkw.js.map +0 -9
- package/dist/chunks/sp-overlay.dev-h6kdx076.js.map +0 -9
- package/dist/chunks/sp-popover.dev-dj9x7e7a.js.map +0 -9
- package/dist/chunks/sp-progress-circle.dev-0fpvhm52.js +0 -15
- package/dist/chunks/sp-progress-circle.dev-0fpvhm52.js.map +0 -9
- package/dist/chunks/sp-tooltip.dev-rvepkw4r.js +0 -15
- package/dist/chunks/sp-tooltip.dev-rvepkw4r.js.map +0 -9
- package/dist/chunks/sp-tray.dev-64v4pxw8.js.map +0 -12
- package/dist/chunks/studio-0a5qrh01.js.map +0 -9
- package/dist/chunks/studio-0rqqhrdy.js.map +0 -12
- package/dist/chunks/studio-18j3bmcz.js.map +0 -10
- package/dist/chunks/studio-1kgfcv7s.js.map +0 -13
- package/dist/chunks/studio-22xr4q8q.js.map +0 -13
- package/dist/chunks/studio-300zsz1k.js.map +0 -39
- package/dist/chunks/studio-3fk1ac9z.js.map +0 -12
- package/dist/chunks/studio-3n4ndrzh.js.map +0 -41
- package/dist/chunks/studio-3z8jjm2p.js.map +0 -13
- package/dist/chunks/studio-4mqb9a0j.js.map +0 -14
- package/dist/chunks/studio-4q0wznzf.js.map +0 -73
- package/dist/chunks/studio-5ehhackm.js.map +0 -10
- package/dist/chunks/studio-5kt960pk.js.map +0 -38
- package/dist/chunks/studio-5x5774ak.js.map +0 -10
- package/dist/chunks/studio-685s0ytq.js.map +0 -76
- package/dist/chunks/studio-6a0h7sne.js.map +0 -15
- package/dist/chunks/studio-6f0am8f2.js.map +0 -10
- package/dist/chunks/studio-6kv3apa9.js.map +0 -10
- package/dist/chunks/studio-6zzbyx17.js.map +0 -12
- package/dist/chunks/studio-753znj4c.js.map +0 -16
- package/dist/chunks/studio-7afd21nw.js.map +0 -10
- package/dist/chunks/studio-8jpzqk5s.js.map +0 -10
- package/dist/chunks/studio-8q517dfr.js.map +0 -10
- package/dist/chunks/studio-8sdyjfd6.js.map +0 -10
- package/dist/chunks/studio-a0tswy0w.js.map +0 -9
- package/dist/chunks/studio-a7pzveq1.js.map +0 -11
- package/dist/chunks/studio-ahnzd9rg.js.map +0 -10
- package/dist/chunks/studio-b9b6t1dg.js.map +0 -651
- package/dist/chunks/studio-bw5dz6km.js.map +0 -21
- package/dist/chunks/studio-cjm7fdjf.js.map +0 -14
- package/dist/chunks/studio-ckwz4d3x.js.map +0 -12
- package/dist/chunks/studio-d1ks410h.js.map +0 -10
- package/dist/chunks/studio-dg7zyt5x.js.map +0 -10
- package/dist/chunks/studio-fys6z73y.js.map +0 -10
- package/dist/chunks/studio-g1wdche0.js.map +0 -56
- package/dist/chunks/studio-g8t7g0gp.js.map +0 -10
- package/dist/chunks/studio-h4rxscfc.js.map +0 -10
- package/dist/chunks/studio-hekaagev.js.map +0 -18
- package/dist/chunks/studio-hrajjyt2.js.map +0 -10
- package/dist/chunks/studio-nqq8jk8f.js.map +0 -14
- package/dist/chunks/studio-p471gg5n.js.map +0 -14
- package/dist/chunks/studio-pv8m0h4a.js.map +0 -98
- package/dist/chunks/studio-qhh8r5fz.js.map +0 -13
- package/dist/chunks/studio-qrsfh1w7.js.map +0 -41
- package/dist/chunks/studio-r8vx7bkz.js.map +0 -235
- package/dist/chunks/studio-rgwcpast.js.map +0 -12
- package/dist/chunks/studio-s519zc99.js.map +0 -10
- package/dist/chunks/studio-sas7mt3k.js.map +0 -10
- package/dist/chunks/studio-t5wqwzdh.js.map +0 -10
- package/dist/chunks/studio-tqemhphj.js.map +0 -11
- package/dist/chunks/studio-tr20m8g8.js.map +0 -9
- package/dist/chunks/studio-tvgyw9xw.js.map +0 -14
- package/dist/chunks/studio-x0et2z9g.js.map +0 -32
- package/dist/chunks/studio-xm3dbxvn.js.map +0 -19
- package/dist/chunks/studio-xmvbhg31.js.map +0 -10
- package/dist/chunks/studio-ynxwkrzd.js.map +0 -246
- package/dist/chunks/studio-yphy4z9m.js.map +0 -10
- package/dist/chunks/studio-yz9s88s0.js.map +0 -54
- package/dist/chunks/studio-z6nw2ek2.js.map +0 -10
- package/dist/chunks/studio-zqv3w24n.js.map +0 -11
- package/dist/chunks/tsMode-76kr53q0.js.map +0 -13
- package/dist/chunks/ws-client-6shc5rze.js.map +0 -12
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/settings/contributed-section.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/// <reference lib=\"dom\" />\n/**\n * Contributed settings section — the generic renderer behind `$studio.settings`\n * (specs/extensions.md §9.1). An extension's `project` class declares a settings section and this\n * module renders it over `projectConfig[key]`: layout \"form\" is one schema form over the whole\n * section value; layout \"map\" is master-detail (key list left, entry form right) for `type: object`\n * + `additionalProperties` sections. Persistence mirrors the content-types editor: mutate\n * projectState.projectConfig and rewrite project.json through the platform.\n */\n\nimport { html, nothing, render as litRender } from \"lit-html\";\nimport { errorMessage } from \"@jxsuite/schema/parse\";\nimport { getPlatform } from \"../platform\";\nimport { commitProjectConfig } from \"../tabs/project-config\";\nimport { projectState } from \"../store\";\nimport { renderForm } from \"../ui/schema-form\";\nimport { resolveContextPointer } from \"../services/context-resolver\";\nimport { deriveSecretEnvName } from \"../services/data-service\";\nimport { validateProjectConfig } from \"../services/jx-validate\";\nimport { notify } from \"../services/notify\";\nimport { paneRegion } from \"../ui/regions\";\nimport { paneOfContainer } from \"../canvas/canvas-surface\";\n\nimport type { TemplateResult } from \"lit-html\";\nimport type { JsonSchema, SchemaFormContext } from \"../ui/schema-form\";\nimport type { ProjectConfig } from \"@jxsuite/schema/types\";\n\n// ─── Contribution shape ───────────────────────────────────────────────────────\n\n/** A `$studio.settings` contribution paired with the entry schema from the project fragment. */\nexport interface SettingsContribution {\n /** The project.json top-level property the section owns. */\n key: string;\n /** Section heading; falls back to the key. */\n title?: string | undefined;\n /** The `$studio.settings` block from the class descriptor. */\n settings: {\n layout?: \"map\" | \"form\" | undefined;\n entry?:\n | {\n ui?: Record<string, { control?: string; enum?: unknown }> | undefined;\n newEntry?: Record<string, unknown> | undefined;\n }\n | undefined;\n };\n /** JSON Schema for one entry (map layout) or the whole section value (form layout). */\n entrySchema: JsonSchema;\n}\n\n/** Context handed to a host-provided section actions renderer. */\nexport interface SectionActionsContext {\n sectionKey: string;\n /** The selected entry key (map layout), or null. */\n selected: string | null;\n rerender: () => void;\n}\n\n/** Host options threaded to the schema-form context. */\nexport interface ContributedSectionOptions {\n /** Registered formats backing the `$formats` virtual root. */\n formats?: { name: string }[] | undefined;\n /**\n * Optional actions row rendered under the section title — the hook domain modules use to surface\n * section-scoped operations (e.g. the data surface's Test/Push actions) without the generic\n * renderer knowing any extension.\n */\n actions?: ((ctx: SectionActionsContext) => TemplateResult) | undefined;\n}\n\n// ─── Module state ─────────────────────────────────────────────────────────────\n\n/** Selected entry key per section (map layout). */\nconst selectedEntries = new Map<string, string | null>();\n/** Sections whose new-entry form is open (map layout). */\nconst newEntryOpen = new Set<string>();\n/** Pending new-entry names per section (map layout). */\nconst newEntryNames = new Map<string, string>();\n\n/** Reset contributed-section ephemeral UI state (test hook). */\nexport function resetContributedSectionState(): void {\n selectedEntries.clear();\n newEntryOpen.clear();\n newEntryNames.clear();\n}\n\n/**\n * Select an entry of a map-layout section by key — the addressable form of clicking an entry row.\n *\n * Five screenshot steps used to reach these rows by typing an empty string into a hand-stamped\n * region id, carrying `unstable: { reason: \"\\\"settings.selectEntry\\\" has no command record\", until:\n * \"P6.2\" }`. This is P6.2 and the record is `settings.open {section, entry}`: an entry is a KEY in\n * the section's own map, so naming it is naming state rather than reproducing a gesture.\n *\n * @param {string} sectionKey\n * @param {string} entryKey\n * @returns {string[] | null} `null` once selected; the section's actual entry keys when it has no\n * such entry, so the caller's refusal can name both sides.\n */\nexport function selectContributedEntry(sectionKey: string, entryKey: string): string[] | null {\n const section = (projectState?.projectConfig as Record<string, unknown> | null | undefined)?.[\n sectionKey\n ];\n const entries =\n section && typeof section === \"object\" && !Array.isArray(section)\n ? (section as Record<string, unknown>)\n : {};\n if (!Object.hasOwn(entries, entryKey)) {\n return Object.keys(entries);\n }\n selectedEntries.set(sectionKey, entryKey);\n return null;\n}\n\n// ─── Validation (§7.1 inline tier, §7.2 Problems) ─────────────────────────────\n\n/**\n * The last validator run's messages, keyed by the JSON-pointer base they were rendered under.\n *\n * `jx-validate` validates the WHOLE `project.json` against the project's generated entry document,\n * so its output has to be routed back to individual controls. Until now it was wired to exactly one\n * caller — the AI's `write_project_config` — which meant the model's edits to this file were\n * schema-checked and a human's edits through this very form were not.\n */\nconst diagnostics = new Map<string, Record<string, string>>();\n\n/** Drop every cached diagnostic (test hook, and the \"project closed\" path). */\nexport function resetContributedDiagnostics(): void {\n diagnostics.clear();\n}\n\n/**\n * Route `jx-validate` messages (\"/search/index: must be string\") to the field they are about.\n *\n * Only the messages one level under `base` become field errors: `/search/index` belongs to the\n * `index` control, and `/search/index/0/kind` belongs to it too — the deepest control that exists\n * on this form is the one that can be corrected. A message ABOUT the base itself has no field to\n * live at and is returned separately, for the section line.\n *\n * @param {string} base - JSON pointer of the record the form is editing, e.g. `/search`\n * @param {string[]} messages\n * @returns {{ fields: Record<string, string>; section: string[] }}\n */\nexport function routeDiagnostics(\n base: string,\n messages: string[],\n): { fields: Record<string, string>; section: string[] } {\n const fields: Record<string, string> = {};\n const section: string[] = [];\n for (const message of messages) {\n const at = message.indexOf(\": \");\n const pointer = at === -1 ? \"\" : message.slice(0, at);\n const text = at === -1 ? message : message.slice(at + 2);\n if (pointer === base) {\n section.push(text);\n continue;\n }\n if (!pointer.startsWith(`${base}/`)) {\n continue;\n }\n const [prop] = pointer.slice(base.length + 1).split(\"/\");\n if (prop && fields[prop] === undefined) {\n fields[prop] = text;\n }\n }\n return { fields, section };\n}\n\n// ─── Persistence ──────────────────────────────────────────────────────────────\n\n/**\n * Commit `project.json`, then say what is wrong with it.\n *\n * The write itself now belongs to `tabs/project-config.ts` — one serialisation, one error path, and\n * a transaction the author can undo. This module used to own a second writer, at\n * `JSON.stringify(config, null, \"\\t\")`, which re-indented the whole file on any edit; and before\n * that it was `void saveProjectConfig()` at five call sites with no validation at all. §7.2 files a\n * failed config write as a Problem, because it must be fixed and it is about a named file; the\n * chokepoint files it, so a failure here only has to stop.\n *\n * **The write comes first, and the order is the honest one.** This form mutates\n * `projectState.projectConfig` in place before calling here, so the value is already live in the\n * editor and the canvas; a validator run in front of the write could not have prevented anything,\n * it would only have delayed persisting what the user can already see. This surface REPORTS. The\n * one that gates is `contexts-section.ts`, which builds a candidate map and validates it before\n * anything is applied.\n *\n * @param {string} base - JSON pointer of the record being edited, for routing field errors\n * @param {() => void} rerender\n */\nasync function saveProjectConfig(base: string, rerender: () => void) {\n const config = (projectState as { projectConfig: ProjectConfig }).projectConfig;\n\n const commit = await commitProjectConfig();\n if (!commit.ok) {\n return;\n }\n\n let messages: string[] = [];\n try {\n messages = await validateProjectConfig(config);\n } catch (error) {\n /* A validator that will not compile must not be silent about it — but it is not the edit's\n fault, so it is a problem of its own rather than an error parked on the user's field. */\n notify.warn(`Could not validate project.json — ${errorMessage(error)}`, {\n key: \"settings:validator\",\n path: \"project.json\",\n source: \"Settings\",\n tier: \"problem\",\n });\n return;\n }\n diagnostics.set(base, routeDiagnostics(base, messages).fields);\n rerender();\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/** Apply a schema-form patch onto a record in place; `undefined` values unset the key. */\nfunction applyPatch(target: Record<string, unknown>, patch: Record<string, unknown>) {\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n delete target[key];\n } else {\n target[key] = value;\n }\n }\n}\n\n/** Slugify a user-entered entry name — same rules as new content-type names. */\nfunction slugify(name: string): string {\n return name\n .toLowerCase()\n .replaceAll(/\\s+/g, \"-\")\n .replaceAll(/[^a-z0-9-]/g, \"\");\n}\n\n/** Instantiate a newEntry template, substituting `${key}` in every string value. */\nfunction instantiateNewEntry(\n template: Record<string, unknown> | undefined,\n key: string,\n): Record<string, unknown> {\n if (!template) {\n return {};\n }\n const substitute = (value: unknown): unknown => {\n if (typeof value === \"string\") {\n return value.replaceAll(\"${key}\", key);\n }\n if (Array.isArray(value)) {\n return value.map((item) => substitute(item));\n }\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n out[k] = substitute(v);\n }\n return out;\n }\n return value;\n };\n return substitute(template) as Record<string, unknown>;\n}\n\n/**\n * Schema-form context resolving `#/$context/…` pointers over the live project config. When the\n * platform has a secrets surface, `commitSecret` backs the \"secret\" control: the VALUE goes to\n * platform.setSecrets under a derived env name; the returned NAME is what lands in project.json.\n */\nfunction buildContext(\n sectionKey: string,\n opts: ContributedSectionOptions,\n entryKey: string | null = null,\n): SchemaFormContext {\n const platform = getPlatform();\n return {\n fieldKeyPrefix: `$settings.${sectionKey}`,\n resolvePointer: (pointer, scope) =>\n resolveContextPointer(pointer, {\n projectConfig: (projectState?.projectConfig ?? {}) as Record<string, unknown>,\n ...(scope !== undefined && { scope }),\n ...(opts.formats !== undefined && { formats: opts.formats }),\n }),\n ...(typeof platform.setSecrets === \"function\"\n ? {\n commitSecret: async (key: string, value: string) => {\n const envName = deriveSecretEnvName(sectionKey, entryKey, key);\n await platform.setSecrets!({ set: { [envName]: value } });\n return envName;\n },\n }\n : {}),\n };\n}\n\n/** The section's value object in the project config, created on demand. */\nfunction sectionValue(key: string): Record<string, unknown> | null {\n const config = projectState?.projectConfig as Record<string, unknown> | null | undefined;\n if (!config) {\n return null;\n }\n const existing = config[key];\n if (existing && typeof existing === \"object\" && !Array.isArray(existing)) {\n return existing as Record<string, unknown>;\n }\n const fresh: Record<string, unknown> = {};\n config[key] = fresh;\n return fresh;\n}\n\n// ─── Render ───────────────────────────────────────────────────────────────────\n\n/* There is no `paneOfContainer` here. It moved to `canvas/canvas-surface.ts`, beside the other\n \"which pane is this about\" answers, because it is not a settings idea: any stage content handed\n only a host needs it, and `settings/general-settings.ts` and `settings/project-sections.ts` are\n two more that do — both write a canvas mode, and both used to write the FOCUSED pane's. */\n\n/**\n * Render a contributed settings section into the settings document's content area.\n *\n * @param {HTMLElement} container\n * @param {SettingsContribution} contribution\n * @param {ContributedSectionOptions} [opts]\n */\nexport function renderContributedSection(\n container: HTMLElement,\n contribution: SettingsContribution,\n opts: ContributedSectionOptions = {},\n) {\n const rerender = () => renderContributedSection(container, contribution, opts);\n const title = contribution.title ?? contribution.key;\n const layout = contribution.settings.layout ?? \"form\";\n\n const body =\n layout === \"map\"\n ? renderMapLayout(contribution, opts, rerender, paneOfContainer(container))\n : renderFormLayout(contribution, opts, rerender);\n\n const selected = layout === \"map\" ? (selectedEntries.get(contribution.key) ?? null) : null;\n const actions = opts.actions\n ? opts.actions({ rerender, sectionKey: contribution.key, selected })\n : nothing;\n\n const tpl = html`\n <div class=\"settings-section contributed-section\">\n <h3 class=\"settings-section-title\">${title}</h3>\n ${actions}${body}\n </div>\n `;\n\n litRender(tpl, container);\n}\n\n/** Layout \"form\" — one schema form over the whole section value. */\nfunction renderFormLayout(\n contribution: SettingsContribution,\n opts: ContributedSectionOptions,\n rerender: () => void,\n): TemplateResult {\n const value = sectionValue(contribution.key) ?? {};\n const ui = contribution.settings.entry?.ui;\n const base = `/${contribution.key}`;\n\n return html`\n <div class=\"settings-form-panel\">\n ${renderForm(contribution.entrySchema, value, {\n context: buildContext(contribution.key, opts, null),\n errors: diagnostics.get(base) ?? {},\n onChange: (patch) => {\n const target = sectionValue(contribution.key);\n if (!target) {\n return;\n }\n applyPatch(target, patch);\n rerender();\n void saveProjectConfig(base, rerender);\n },\n rerender,\n ...(ui !== undefined && { ui }),\n })}\n </div>\n `;\n}\n\n/** Layout \"map\" — master-detail: entry key list left, entry form right. */\nfunction renderMapLayout(\n contribution: SettingsContribution,\n opts: ContributedSectionOptions,\n rerender: () => void,\n paneId: string,\n): TemplateResult {\n const { key: sectionKey } = contribution;\n const entries = sectionValue(sectionKey) ?? {};\n const entryKeys = Object.keys(entries);\n const selected = selectedEntries.get(sectionKey) ?? null;\n const ui = contribution.settings.entry?.ui;\n\n const handleCreate = () => {\n const slug = slugify(newEntryNames.get(sectionKey) ?? \"\");\n const target = sectionValue(sectionKey);\n if (!slug || !target || target[slug]) {\n return;\n }\n target[slug] = instantiateNewEntry(contribution.settings.entry?.newEntry, slug);\n selectedEntries.set(sectionKey, slug);\n newEntryOpen.delete(sectionKey);\n newEntryNames.delete(sectionKey);\n rerender();\n void saveProjectConfig(`/${sectionKey}`, rerender);\n };\n\n const handleDelete = () => {\n const target = sectionValue(sectionKey);\n if (!selected || !target?.[selected]) {\n return;\n }\n delete target[selected];\n selectedEntries.set(sectionKey, null);\n rerender();\n void saveProjectConfig(`/${sectionKey}`, rerender);\n };\n\n const handleRename = (newName: string) => {\n const target = sectionValue(sectionKey);\n const slug = slugify(newName);\n if (!selected || !target || !slug || slug === selected || target[slug]) {\n return;\n }\n // Rebuild the map to preserve entry order under the new key\n const next: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(target)) {\n next[k === selected ? slug : k] = v;\n delete target[k];\n }\n Object.assign(target, next);\n selectedEntries.set(sectionKey, slug);\n rerender();\n void saveProjectConfig(`/${sectionKey}`, rerender);\n };\n\n // Left column — entry key list\n const listTpl = html`\n <div class=\"settings-list-panel\">\n ${entryKeys.map(\n (name) => html`\n <sp-action-button\n size=\"s\"\n data-jx-region=${paneRegion(paneId, `entry:${name}`)}\n ?selected=${selected === name}\n @click=${() => {\n selectedEntries.set(sectionKey, name);\n rerender();\n }}\n >\n ${name}\n </sp-action-button>\n `,\n )}\n ${\n newEntryOpen.has(sectionKey)\n ? html`\n <div class=\"settings-inline-form\">\n <sp-textfield\n size=\"s\"\n placeholder=\"entry-name\"\n .value=${newEntryNames.get(sectionKey) ?? \"\"}\n @input=${(e: Event) => {\n newEntryNames.set(sectionKey, (e.target as HTMLInputElement).value);\n }}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n handleCreate();\n }\n if (e.key === \"Escape\") {\n newEntryOpen.delete(sectionKey);\n rerender();\n }\n }}\n ></sp-textfield>\n <sp-action-button size=\"s\" @click=${handleCreate}>Create</sp-action-button>\n </div>\n `\n : html`\n <sp-action-button\n size=\"s\"\n quiet\n @click=${() => {\n newEntryOpen.add(sectionKey);\n rerender();\n }}\n >\n <sp-icon-add slot=\"icon\"></sp-icon-add> New Entry\n </sp-action-button>\n `\n }\n </div>\n `;\n\n // Right column — entry form\n const selectedEntry = selected ? entries[selected] : undefined;\n const editorTpl: TemplateResult =\n selected && selectedEntry && typeof selectedEntry === \"object\"\n ? html`\n <div class=\"settings-editor-panel\" data-jx-region=${paneRegion(paneId, \"editor\")}>\n <div class=\"settings-editor-header\">\n <sp-textfield\n size=\"s\"\n quiet\n class=\"entry-name-input\"\n value=${selected}\n @change=${(e: Event) => {\n const target = e.target as HTMLInputElement;\n handleRename(target.value.trim());\n target.value = selectedEntries.get(sectionKey) ?? selected;\n }}\n @keydown=${(e: KeyboardEvent) => {\n const target = e.target as HTMLInputElement;\n if (e.key === \"Enter\") {\n target.blur();\n }\n if (e.key === \"Escape\") {\n target.value = selected;\n target.blur();\n }\n }}\n ></sp-textfield>\n <sp-action-button size=\"xs\" quiet title=\"Delete entry\" @click=${handleDelete}>\n <sp-icon-delete slot=\"icon\"></sp-icon-delete>\n </sp-action-button>\n </div>\n ${renderForm(contribution.entrySchema, selectedEntry as Record<string, unknown>, {\n context: buildContext(sectionKey, opts, selected),\n errors: diagnostics.get(`/${sectionKey}/${selected}`) ?? {},\n onChange: (patch) => {\n applyPatch(selectedEntry as Record<string, unknown>, patch);\n rerender();\n void saveProjectConfig(`/${sectionKey}/${selected}`, rerender);\n },\n rerender,\n ...(ui !== undefined && { ui }),\n })}\n </div>\n `\n : html`<div class=\"settings-empty-state\">Select or create an entry</div>`;\n\n return html` <div class=\"settings-two-col\">${listTpl} ${editorTpl}</div> `;\n}\n"
|
|
6
|
-
],
|
|
7
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwEA,IAAM,kBAAkB,IAAI;AAE5B,IAAM,eAAe,IAAI;AAEzB,IAAM,gBAAgB,IAAI;AAsBnB,SAAS,sBAAsB,CAAC,YAAoB,UAAmC;AAAA,EAC5F,MAAM,UAAW,cAAc,gBAC7B;AAAA,EAEF,MAAM,UACJ,WAAW,OAAO,YAAY,YAAY,CAAC,MAAM,QAAQ,OAAO,IAC3D,UACD,CAAC;AAAA,EACP,IAAI,CAAC,OAAO,OAAO,SAAS,QAAQ,GAAG;AAAA,IACrC,OAAO,OAAO,KAAK,OAAO;AAAA,EAC5B;AAAA,EACA,gBAAgB,IAAI,YAAY,QAAQ;AAAA,EACxC,OAAO;AAAA;AAaT,IAAM,cAAc,IAAI;AAmBjB,SAAS,gBAAgB,CAC9B,MACA,UACuD;AAAA,EACvD,MAAM,SAAiC,CAAC;AAAA,EACxC,MAAM,UAAoB,CAAC;AAAA,EAC3B,WAAW,WAAW,UAAU;AAAA,IAC9B,MAAM,KAAK,QAAQ,QAAQ,IAAI;AAAA,IAC/B,MAAM,UAAU,OAAO,KAAK,KAAK,QAAQ,MAAM,GAAG,EAAE;AAAA,IACpD,MAAM,OAAO,OAAO,KAAK,UAAU,QAAQ,MAAM,KAAK,CAAC;AAAA,IACvD,IAAI,YAAY,MAAM;AAAA,MACpB,QAAQ,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,IACA,IAAI,CAAC,QAAQ,WAAW,GAAG,OAAO,GAAG;AAAA,MACnC;AAAA,IACF;AAAA,IACA,OAAO,QAAQ,QAAQ,MAAM,KAAK,SAAS,CAAC,EAAE,MAAM,GAAG;AAAA,IACvD,IAAI,QAAQ,OAAO,UAAU,WAAW;AAAA,MACtC,OAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA,EACA,OAAO,EAAE,QAAQ,QAAQ;AAAA;AAyB3B,eAAe,iBAAiB,CAAC,MAAc,UAAsB;AAAA,EACnE,MAAM,SAAU,aAAkD;AAAA,EAElE,MAAM,SAAS,MAAM,oBAAoB;AAAA,EACzC,IAAI,CAAC,OAAO,IAAI;AAAA,IACd;AAAA,EACF;AAAA,EAEA,IAAI,WAAqB,CAAC;AAAA,EAC1B,IAAI;AAAA,IACF,WAAW,MAAM,sBAAsB,MAAM;AAAA,IAC7C,OAAO,OAAO;AAAA,IAGd,OAAO,KAAK,qCAAqC,aAAa,KAAK,KAAK;AAAA,MACtE,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,CAAC;AAAA,IACD;AAAA;AAAA,EAEF,YAAY,IAAI,MAAM,iBAAiB,MAAM,QAAQ,EAAE,MAAM;AAAA,EAC7D,SAAS;AAAA;AAMX,SAAS,UAAU,CAAC,QAAiC,OAAgC;AAAA,EACnF,YAAY,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAG;AAAA,IAChD,IAAI,UAAU,WAAW;AAAA,MACvB,OAAO,OAAO;AAAA,IAChB,EAAO;AAAA,MACL,OAAO,OAAO;AAAA;AAAA,EAElB;AAAA;AAIF,SAAS,OAAO,CAAC,MAAsB;AAAA,EACrC,OAAO,KACJ,YAAY,EACZ,WAAW,QAAQ,GAAG,EACtB,WAAW,eAAe,EAAE;AAAA;AAIjC,SAAS,mBAAmB,CAC1B,UACA,KACyB;AAAA,EACzB,IAAI,CAAC,UAAU;AAAA,IACb,OAAO,CAAC;AAAA,EACV;AAAA,EACA,MAAM,aAAa,CAAC,UAA4B;AAAA,IAC9C,IAAI,OAAO,UAAU,UAAU;AAAA,MAC7B,OAAO,MAAM,WAAW,UAAU,GAAG;AAAA,IACvC;AAAA,IACA,IAAI,MAAM,QAAQ,KAAK,GAAG;AAAA,MACxB,OAAO,MAAM,IAAI,CAAC,SAAS,WAAW,IAAI,CAAC;AAAA,IAC7C;AAAA,IACA,IAAI,SAAS,OAAO,UAAU,UAAU;AAAA,MACtC,MAAM,MAA+B,CAAC;AAAA,MACtC,YAAY,GAAG,MAAM,OAAO,QAAQ,KAAK,GAAG;AAAA,QAC1C,IAAI,KAAK,WAAW,CAAC;AAAA,MACvB;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA;AAAA,EAET,OAAO,WAAW,QAAQ;AAAA;AAQ5B,SAAS,YAAY,CACnB,YACA,MACA,WAA0B,MACP;AAAA,EACnB,MAAM,WAAW,YAAY;AAAA,EAC7B,OAAO;AAAA,IACL,gBAAgB,aAAa;AAAA,IAC7B,gBAAgB,CAAC,SAAS,UACxB,sBAAsB,SAAS;AAAA,MAC7B,eAAgB,cAAc,iBAAiB,CAAC;AAAA,SAC5C,UAAU,aAAa,EAAE,MAAM;AAAA,SAC/B,KAAK,YAAY,aAAa,EAAE,SAAS,KAAK,QAAQ;AAAA,IAC5D,CAAC;AAAA,OACC,OAAO,SAAS,eAAe,aAC/B;AAAA,MACE,cAAc,OAAO,KAAa,UAAkB;AAAA,QAClD,MAAM,UAAU,oBAAoB,YAAY,UAAU,GAAG;AAAA,QAC7D,MAAM,SAAS,WAAY,EAAE,KAAK,GAAG,UAAU,MAAM,EAAE,CAAC;AAAA,QACxD,OAAO;AAAA;AAAA,IAEX,IACA,CAAC;AAAA,EACP;AAAA;AAIF,SAAS,YAAY,CAAC,KAA6C;AAAA,EACjE,MAAM,SAAS,cAAc;AAAA,EAC7B,IAAI,CAAC,QAAQ;AAAA,IACX,OAAO;AAAA,EACT;AAAA,EACA,MAAM,WAAW,OAAO;AAAA,EACxB,IAAI,YAAY,OAAO,aAAa,YAAY,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAAA,IACxE,OAAO;AAAA,EACT;AAAA,EACA,MAAM,QAAiC,CAAC;AAAA,EACxC,OAAO,OAAO;AAAA,EACd,OAAO;AAAA;AAiBF,SAAS,wBAAwB,CACtC,WACA,cACA,OAAkC,CAAC,GACnC;AAAA,EACA,MAAM,WAAW,MAAM,yBAAyB,WAAW,cAAc,IAAI;AAAA,EAC7E,MAAM,QAAQ,aAAa,SAAS,aAAa;AAAA,EACjD,MAAM,SAAS,aAAa,SAAS,UAAU;AAAA,EAE/C,MAAM,OACJ,WAAW,QACP,gBAAgB,cAAc,MAAM,UAAU,gBAAgB,SAAS,CAAC,IACxE,iBAAiB,cAAc,MAAM,QAAQ;AAAA,EAEnD,MAAM,WAAW,WAAW,QAAS,gBAAgB,IAAI,aAAa,GAAG,KAAK,OAAQ;AAAA,EACtF,MAAM,UAAU,KAAK,UACjB,KAAK,QAAQ,EAAE,UAAU,YAAY,aAAa,KAAK,SAAS,CAAC,IACjE;AAAA,EAEJ,MAAM,MAAM;AAAA;AAAA,2CAE6B;AAAA,QACnC,UAAU;AAAA;AAAA;AAAA,EAIhB,OAAU,KAAK,SAAS;AAAA;AAI1B,SAAS,gBAAgB,CACvB,cACA,MACA,UACgB;AAAA,EAChB,MAAM,QAAQ,aAAa,aAAa,GAAG,KAAK,CAAC;AAAA,EACjD,MAAM,KAAK,aAAa,SAAS,OAAO;AAAA,EACxC,MAAM,OAAO,IAAI,aAAa;AAAA,EAE9B,OAAO;AAAA;AAAA,QAED,WAAW,aAAa,aAAa,OAAO;AAAA,IAC5C,SAAS,aAAa,aAAa,KAAK,MAAM,IAAI;AAAA,IAClD,QAAQ,YAAY,IAAI,IAAI,KAAK,CAAC;AAAA,IAClC,UAAU,CAAC,UAAU;AAAA,MACnB,MAAM,SAAS,aAAa,aAAa,GAAG;AAAA,MAC5C,IAAI,CAAC,QAAQ;AAAA,QACX;AAAA,MACF;AAAA,MACA,WAAW,QAAQ,KAAK;AAAA,MACxB,SAAS;AAAA,MACJ,kBAAkB,MAAM,QAAQ;AAAA;AAAA,IAEvC;AAAA,OACI,OAAO,aAAa,EAAE,GAAG;AAAA,EAC/B,CAAC;AAAA;AAAA;AAAA;AAMP,SAAS,eAAe,CACtB,cACA,MACA,UACA,QACgB;AAAA,EAChB,QAAQ,KAAK,eAAe;AAAA,EAC5B,MAAM,UAAU,aAAa,UAAU,KAAK,CAAC;AAAA,EAC7C,MAAM,YAAY,OAAO,KAAK,OAAO;AAAA,EACrC,MAAM,WAAW,gBAAgB,IAAI,UAAU,KAAK;AAAA,EACpD,MAAM,KAAK,aAAa,SAAS,OAAO;AAAA,EAExC,MAAM,eAAe,MAAM;AAAA,IACzB,MAAM,OAAO,QAAQ,cAAc,IAAI,UAAU,KAAK,EAAE;AAAA,IACxD,MAAM,SAAS,aAAa,UAAU;AAAA,IACtC,IAAI,CAAC,QAAQ,CAAC,UAAU,OAAO,OAAO;AAAA,MACpC;AAAA,IACF;AAAA,IACA,OAAO,QAAQ,oBAAoB,aAAa,SAAS,OAAO,UAAU,IAAI;AAAA,IAC9E,gBAAgB,IAAI,YAAY,IAAI;AAAA,IACpC,aAAa,OAAO,UAAU;AAAA,IAC9B,cAAc,OAAO,UAAU;AAAA,IAC/B,SAAS;AAAA,IACJ,kBAAkB,IAAI,cAAc,QAAQ;AAAA;AAAA,EAGnD,MAAM,eAAe,MAAM;AAAA,IACzB,MAAM,SAAS,aAAa,UAAU;AAAA,IACtC,IAAI,CAAC,YAAY,CAAC,SAAS,WAAW;AAAA,MACpC;AAAA,IACF;AAAA,IACA,OAAO,OAAO;AAAA,IACd,gBAAgB,IAAI,YAAY,IAAI;AAAA,IACpC,SAAS;AAAA,IACJ,kBAAkB,IAAI,cAAc,QAAQ;AAAA;AAAA,EAGnD,MAAM,eAAe,CAAC,YAAoB;AAAA,IACxC,MAAM,SAAS,aAAa,UAAU;AAAA,IACtC,MAAM,OAAO,QAAQ,OAAO;AAAA,IAC5B,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,SAAS,YAAY,OAAO,OAAO;AAAA,MACtE;AAAA,IACF;AAAA,IAEA,MAAM,OAAgC,CAAC;AAAA,IACvC,YAAY,GAAG,MAAM,OAAO,QAAQ,MAAM,GAAG;AAAA,MAC3C,KAAK,MAAM,WAAW,OAAO,KAAK;AAAA,MAClC,OAAO,OAAO;AAAA,IAChB;AAAA,IACA,OAAO,OAAO,QAAQ,IAAI;AAAA,IAC1B,gBAAgB,IAAI,YAAY,IAAI;AAAA,IACpC,SAAS;AAAA,IACJ,kBAAkB,IAAI,cAAc,QAAQ;AAAA;AAAA,EAInD,MAAM,UAAU;AAAA;AAAA,QAEV,UAAU,IACV,CAAC,SAAS;AAAA;AAAA;AAAA,6BAGW,WAAW,QAAQ,SAAS,MAAM;AAAA,wBACvC,aAAa;AAAA,qBAChB,MAAM;AAAA,IACb,gBAAgB,IAAI,YAAY,IAAI;AAAA,IACpC,SAAS;AAAA;AAAA;AAAA,cAGT;AAAA;AAAA,SAGR;AAAA,QAEE,aAAa,IAAI,UAAU,IACvB;AAAA;AAAA;AAAA;AAAA;AAAA,2BAKe,cAAc,IAAI,UAAU,KAAK;AAAA,2BACjC,CAAC,MAAa;AAAA,IACrB,cAAc,IAAI,YAAa,EAAE,OAA4B,KAAK;AAAA;AAAA,6BAEzD,CAAC,MAAqB;AAAA,IAC/B,IAAI,EAAE,QAAQ,SAAS;AAAA,MACrB,aAAa;AAAA,IACf;AAAA,IACA,IAAI,EAAE,QAAQ,UAAU;AAAA,MACtB,aAAa,OAAO,UAAU;AAAA,MAC9B,SAAS;AAAA,IACX;AAAA;AAAA;AAAA,oDAGgC;AAAA;AAAA,gBAGxC;AAAA;AAAA;AAAA;AAAA,yBAIa,MAAM;AAAA,IACb,aAAa,IAAI,UAAU;AAAA,IAC3B,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWzB,MAAM,gBAAgB,WAAW,QAAQ,YAAY;AAAA,EACrD,MAAM,YACJ,YAAY,iBAAiB,OAAO,kBAAkB,WAClD;AAAA,8DACsD,WAAW,QAAQ,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAMjE;AAAA,0BACE,CAAC,MAAa;AAAA,IACtB,MAAM,SAAS,EAAE;AAAA,IACjB,aAAa,OAAO,MAAM,KAAK,CAAC;AAAA,IAChC,OAAO,QAAQ,gBAAgB,IAAI,UAAU,KAAK;AAAA;AAAA,2BAEzC,CAAC,MAAqB;AAAA,IAC/B,MAAM,SAAS,EAAE;AAAA,IACjB,IAAI,EAAE,QAAQ,SAAS;AAAA,MACrB,OAAO,KAAK;AAAA,IACd;AAAA,IACA,IAAI,EAAE,QAAQ,UAAU;AAAA,MACtB,OAAO,QAAQ;AAAA,MACf,OAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA,8EAG4D;AAAA;AAAA;AAAA;AAAA,cAIhE,WAAW,aAAa,aAAa,eAA0C;AAAA,IAC/E,SAAS,aAAa,YAAY,MAAM,QAAQ;AAAA,IAChD,QAAQ,YAAY,IAAI,IAAI,cAAc,UAAU,KAAK,CAAC;AAAA,IAC1D,UAAU,CAAC,UAAU;AAAA,MACnB,WAAW,eAA0C,KAAK;AAAA,MAC1D,SAAS;AAAA,MACJ,kBAAkB,IAAI,cAAc,YAAY,QAAQ;AAAA;AAAA,IAE/D;AAAA,OACI,OAAO,aAAa,EAAE,GAAG;AAAA,EAC/B,CAAC;AAAA;AAAA,YAGL;AAAA,EAEN,OAAO,sCAAsC,WAAW;AAAA;",
|
|
8
|
-
"debugId": "C8B3D1846143F4B964756E2164756E21",
|
|
9
|
-
"names": []
|
|
10
|
-
}
|