@metricinsights/pp-dev 1.5.0-beta.3 → 1.5.0-beta.31
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/README.md +200 -145
- package/dist/cjs/auth.provider-fI0tFsf5.js +2 -0
- package/dist/cjs/auth.provider-fI0tFsf5.js.map +1 -0
- package/dist/cjs/cli.js +1 -1
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/index-Ty1d2YCg.js +2 -0
- package/dist/cjs/index-Ty1d2YCg.js.map +1 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/migrate-Gi9k9cLw.js +2 -0
- package/dist/cjs/migrate-Gi9k9cLw.js.map +1 -0
- package/dist/cjs/package.json +2 -135
- package/dist/cjs/plugin.js +1 -1
- package/dist/cjs/plugin.js.map +1 -1
- package/dist/cjs/request-capture.middleware-6DhFLyIz.js +2 -0
- package/dist/cjs/request-capture.middleware-6DhFLyIz.js.map +1 -0
- package/dist/cjs/version-manifest-CVBuIKBS.js +2 -0
- package/dist/cjs/version-manifest-CVBuIKBS.js.map +1 -0
- package/dist/cjs/version-plugin-DBdqn2Rn.js +2 -0
- package/dist/cjs/version-plugin-DBdqn2Rn.js.map +1 -0
- package/dist/client/client.js +278 -126
- package/dist/client/client.js.map +1 -1
- package/dist/client/request-inspector.css +3 -0
- package/dist/client/request-inspector.css.map +1 -0
- package/dist/client/request-inspector.html +87 -0
- package/dist/client/request-inspector.js +549 -0
- package/dist/client/request-inspector.js.map +1 -0
- package/dist/client/variables-editor.css +3 -0
- package/dist/client/variables-editor.css.map +1 -0
- package/dist/client/variables-editor.html +44 -0
- package/dist/client/variables-editor.js +3474 -0
- package/dist/client/variables-editor.js.map +1 -0
- package/dist/esm/auth.provider-DDUsu1H1.js +2 -0
- package/dist/esm/auth.provider-DDUsu1H1.js.map +1 -0
- package/dist/esm/cli.js +1 -1
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/index-tD-QICGk.js +2 -0
- package/dist/esm/index-tD-QICGk.js.map +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/migrate-CCBRuVfj.js +2 -0
- package/dist/esm/{migrate-B2gJ62fm.js.map → migrate-CCBRuVfj.js.map} +1 -1
- package/dist/esm/package.json +2 -135
- package/dist/esm/plugin.js +1 -1
- package/dist/esm/plugin.js.map +1 -1
- package/dist/esm/request-capture.middleware-VElwjU1W.js +2 -0
- package/dist/esm/request-capture.middleware-VElwjU1W.js.map +1 -0
- package/dist/esm/version-manifest-CyzmnFOe.js +2 -0
- package/dist/esm/version-manifest-CyzmnFOe.js.map +1 -0
- package/dist/esm/version-plugin-6rxIgQ-I.js +2 -0
- package/dist/esm/version-plugin-6rxIgQ-I.js.map +1 -0
- package/dist/types/helpers.d.ts +29 -0
- package/dist/types/index.d.ts +15 -156
- package/dist/types/plugin.d.ts +8 -0
- package/dist/types/pp-dev-config-D889A-PO.d.ts +189 -0
- package/docs/features.md +2 -1
- package/package.json +26 -35
- package/dist/CHANGELOG.md +0 -442
- package/dist/README.md +0 -724
- package/dist/cjs/index-CCUrjlJE.js +0 -2
- package/dist/cjs/index-CCUrjlJE.js.map +0 -1
- package/dist/cjs/migrate-BYno__sx.js +0 -2
- package/dist/cjs/migrate-BYno__sx.js.map +0 -1
- package/dist/cjs/plugin-D_RXI7ru.js +0 -2
- package/dist/cjs/plugin-D_RXI7ru.js.map +0 -1
- package/dist/cjs/version-plugin-Bf4jLh17.js +0 -2
- package/dist/cjs/version-plugin-Bf4jLh17.js.map +0 -1
- package/dist/esm/index-BazQY12s.js +0 -2
- package/dist/esm/index-BazQY12s.js.map +0 -1
- package/dist/esm/migrate-B2gJ62fm.js +0 -2
- package/dist/esm/plugin-NIWxLreC.js +0 -2
- package/dist/esm/plugin-NIWxLreC.js.map +0 -1
- package/dist/esm/version-plugin-DwuZCHob.js +0 -2
- package/dist/esm/version-plugin-DwuZCHob.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variables-editor.js","sources":["../../../src/client/storage.ts","../../../src/client/theme.ts","../../../src/client/variables-editor/html.ts","../../../src/client/variables-editor/import-modal.ts","../../../src/client/variables-editor/line-diff.ts","../../../src/client/variables-editor/modals.ts","../../../src/client/variables-editor/schema-tab.ts","../../../src/client/variables-editor/markdown.ts","../../../src/client/variables-editor/values-tab.ts","../../../src/client/variables-editor/editor.ts","../../../src/client/variables-editor/main.ts"],"sourcesContent":["// localStorage helpers guarded against environments where storage is unavailable\n// (e.g. sandboxed iframes). Keys follow the original `pp-dev-info-closed` naming.\n\nexport const STORAGE_KEYS = {\n closed: 'pp-dev-info-closed',\n position: 'pp-dev-info-position',\n autoHide: 'pp-dev-info-auto-hide',\n hidden: 'pp-dev-info-hidden',\n /** Shared with the standalone Inspector/Variables Editor pages — same key, same values. */\n theme: 'pp-dev-info-theme',\n} as const;\n\nexport function checkLocalStorage() {\n try {\n localStorage.setItem('test', 'test');\n localStorage.removeItem('test');\n\n return true;\n } catch (e) {\n return false;\n }\n}\n\nexport function setStorageItem(key: string, value: string) {\n if (checkLocalStorage()) {\n localStorage.setItem(key, value);\n }\n}\n\nexport function getStorageItem(key: string) {\n if (checkLocalStorage()) {\n return localStorage.getItem(key);\n }\n\n return null;\n}\n\nexport function removeStorageItem(key: string) {\n if (checkLocalStorage()) {\n localStorage.removeItem(key);\n }\n}\n","// Theme override (Auto/Dark/Light), shared across the dev panel and the standalone\n// Inspector/Variables Editor pages via the same localStorage key (see STORAGE_KEYS.theme) and\n// the same `data-pp-dev-theme` attribute convention (prefixed to avoid colliding with a host\n// Portal Page's own theme attribute, since the panel is injected into pages pp-dev doesn't own).\nimport { STORAGE_KEYS, getStorageItem, setStorageItem } from './storage.js';\n\nexport type ThemeChoice = 'auto' | 'dark' | 'light';\n\nconst THEME_ATTR = 'data-pp-dev-theme';\n\nexport function getStoredTheme(): ThemeChoice {\n const value = getStorageItem(STORAGE_KEYS.theme);\n\n return value === 'dark' || value === 'light' ? value : 'auto';\n}\n\nexport function applyTheme(theme: ThemeChoice): void {\n if (theme === 'dark' || theme === 'light') {\n document.documentElement.setAttribute(THEME_ATTR, theme);\n } else {\n document.documentElement.removeAttribute(THEME_ATTR);\n }\n}\n\nexport function setTheme(theme: ThemeChoice): void {\n setStorageItem(STORAGE_KEYS.theme, theme);\n applyTheme(theme);\n}\n\n/** Call once on page load to apply whatever was last chosen (defaults to 'auto', a no-op). */\nexport function initTheme(): void {\n applyTheme(getStoredTheme());\n}\n","// Small helpers the Variables Editor's HTML builders share.\nimport type { NormalizedOption, OptionEntry } from './types.js';\n\nexport function escapeHtml(s: unknown): string {\n return String(s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n}\n\n/**\n * ` data-action=\"…\"` and the other `data-*` attributes the editor's delegated listeners read\n * (camelCase keys become kebab-case; `null`/`undefined` ones are left out), escaped.\n */\nexport function actionAttrs(action: string, data: Record<string, string | number | null | undefined> = {}): string {\n let attrs = ' data-action=\"' + escapeHtml(action) + '\"';\n\n for (const [key, value] of Object.entries(data)) {\n if (value != null) {\n attrs += ' data-' + key.replace(/[A-Z]/g, (c) => '-' + c.toLowerCase()) + '=\"' + escapeHtml(value) + '\"';\n }\n }\n\n return attrs;\n}\n\n/** What a caught error says. */\nexport function errorMessage(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n\n// Shown in place of a tab's content while it's never been loaded yet (first visit, or right\n// after a hard refresh of the page) — as opposed to ve-loading-indicator, which is for a\n// background reload of a tab that already has cached content on screen.\nexport function renderSkeleton(): string {\n let rows = '';\n\n for (let i = 0; i < 5; i++) {\n rows += '<div class=\"ve-skeleton-row\"></div>';\n }\n\n return '<div class=\"ve-skeleton\">' + rows + '</div>';\n}\n\n// A plain string entry uses itself as both id and text; an object entry may carry either/both —\n// shared by the tag-level static option list and each list-column's own \"options\" (see\n// listItemFieldsHtml()), since both follow the same { id, text } | string shape.\nexport function normalizeOptionEntry(o: OptionEntry): NormalizedOption {\n return typeof o === 'string'\n ? { id: o, text: o }\n : { id: String(o.id), text: String(o.text != null ? o.text : o.id) };\n}\n\nexport function sourceBadgeHtml(source: string | null | undefined): string {\n if (!source) {\n return '';\n }\n\n const kind = String(source).toLowerCase();\n const extra = kind === 'dataset' ? ' badge-source-dataset' : kind === 'static' ? ' badge-source-static' : '';\n\n return '<span class=\"badge' + extra + '\">' + escapeHtml(source) + '</span>';\n}\n\nexport function typeBadgeHtml(type: string | null | undefined): string {\n if (!type) {\n return '';\n }\n\n return '<span class=\"badge\">' + escapeHtml(type) + '</span>';\n}\n","// The HTML of the Values tab's \"Import from page…\" dialog: a page picker, then the review of what\n// that page's values would change. editor.ts loads the data and handles the `data-action`s.\nimport { actionAttrs, escapeHtml, typeBadgeHtml } from './html.js';\nimport type { ImportCandidate, ImportPage, ImportPlan } from './types.js';\n\nconst closeButtonHtml =\n '<button type=\"button\" class=\"btn btn-sm ve-modal-close\" title=\"Close\" aria-label=\"Close\"' +\n actionAttrs('close-import-modal') +\n '>✕</button>';\n\n/** The picker step, its body loading. */\nexport function importPickerStepHtml(): string {\n return (\n '<div class=\"ve-modal ve-modal-wide\" role=\"dialog\" aria-modal=\"true\">' +\n '<div class=\"ve-modal-title-row\">' +\n '<div class=\"ve-modal-title\">Import values from another page</div>' +\n closeButtonHtml +\n '</div>' +\n '<div class=\"ve-modal-body\"><span class=\"ve-loading-indicator\"><span class=\"ve-loading-dot\"></span>Loading pages…</span></div>' +\n '</div>'\n );\n}\n\n/** The review step of a page, its body loading. */\nexport function importReviewStepHtml(pageName: string): string {\n return (\n '<div class=\"ve-modal ve-modal-wide\" role=\"dialog\" aria-modal=\"true\">' +\n '<div class=\"ve-modal-title-row\">' +\n '<div style=\"flex:1;min-width:0\">' +\n '<button type=\"button\" class=\"ve-modal-back\"' +\n actionAttrs('back-to-import-picker') +\n '>← Back</button>' +\n '<div class=\"ve-modal-title\" style=\"margin-bottom:0\">Import values from \"' +\n escapeHtml(pageName) +\n '\"</div>' +\n '</div>' +\n closeButtonHtml +\n '</div>' +\n '<div class=\"ve-modal-body\"><span class=\"ve-loading-indicator\"><span class=\"ve-loading-dot\"></span>Loading values…</span></div>' +\n '<div class=\"ve-modal-actions\" id=\"ve-import-actions\"></div>' +\n '</div>'\n );\n}\n\nexport function importErrorHtml(message: string): string {\n return '<div class=\"hint\" style=\"color:var(--red)\">' + escapeHtml(message) + '</div>';\n}\n\nexport function importPickerBodyHtml(pages: ImportPage[]): string {\n if (!pages.length) {\n return '<div class=\"ve-import-empty\">No other pages found on this instance.</div>';\n }\n\n const sameTemplate = pages.filter((p) => p.sameTemplate);\n const other = pages.filter((p) => !p.sameTemplate);\n\n return (\n '<div class=\"ve-import-search\"><input type=\"text\" id=\"ve-import-filter\" placeholder=\"Filter pages…\"' +\n actionAttrs('filter-import-pages') +\n ' autocomplete=\"off\" /></div>' +\n importPageGroupHtml('Pages using this template', sameTemplate) +\n importPageGroupHtml('Other pages', other) +\n '<div class=\"ve-import-empty\" id=\"ve-import-page-empty\" style=\"display:none\">No pages match your filter.</div>'\n );\n}\n\nfunction importPageGroupHtml(title: string, pages: ImportPage[]): string {\n if (!pages.length) {\n return '';\n }\n\n const rows = pages\n .map((p) => {\n // A page without a name on MI goes by its internal name (as an attribute, `null` was\n // dropped, and the review step named the page \"undefined\").\n const name = p.name || p.internal_name;\n\n return (\n '<button type=\"button\" class=\"ve-import-page-row\" data-search=\"' +\n escapeHtml((name + ' ' + p.internal_name).toLowerCase()) +\n '\"' +\n actionAttrs('select-import-page', { pageId: p.id, pageName: name }) +\n '>' +\n '<span class=\"ve-import-page-name\">' +\n escapeHtml(name) +\n '</span>' +\n '<span class=\"ve-import-page-slug\">' +\n escapeHtml(p.internal_name) +\n '</span>' +\n '</button>'\n );\n })\n .join('');\n\n return (\n '<div class=\"ve-import-page-group\">' +\n '<div class=\"ve-import-section-title\">' +\n escapeHtml(title) +\n '</div>' +\n '<div class=\"ve-import-page-list\">' +\n rows +\n '</div>' +\n '</div>'\n );\n}\n\nexport function importReviewBodyHtml(plan: ImportPlan): string {\n const importable = plan.importable || [];\n const skipped = plan.skipped || [];\n\n if (!importable.length && !skipped.length) {\n return '<div class=\"ve-import-empty\">This page has no live variable values to import.</div>';\n }\n\n let html = '';\n\n if (importable.length) {\n html +=\n '<div class=\"ve-import-list-head\">' +\n '<span class=\"badge\">Importable (' +\n importable.length +\n ')</span>' +\n '<label class=\"ve-import-select-all\"><input type=\"checkbox\" id=\"ve-import-select-all\" checked' +\n actionAttrs('toggle-import-all') +\n ' /> select all</label>' +\n '</div>' +\n '<div class=\"ve-import-list\">' +\n importable.map((c, i) => importRowHtml(c, i)).join('') +\n '</div>';\n } else {\n html += '<div class=\"hint\">Nothing on this page matches a variable name in the current schema.</div>';\n }\n\n if (skipped.length) {\n html +=\n '<div class=\"ve-import-section-title\">Skipped (' +\n skipped.length +\n ')</div>' +\n '<div class=\"ve-import-list\">' +\n skipped\n .map(\n (s) =>\n '<div class=\"ve-import-skip-row\">' +\n '<span class=\"ve-import-row-name\">' +\n escapeHtml(s.name) +\n '</span>' +\n '<span class=\"ve-import-skip-reason\">' +\n escapeHtml(s.reason) +\n '</span>' +\n '</div>',\n )\n .join('') +\n '</div>';\n }\n\n return html;\n}\n\nfunction importRowHtml(candidate: ImportCandidate, i: number): string {\n return (\n '<label class=\"ve-import-row\">' +\n '<input type=\"checkbox\" class=\"ve-import-check\" data-index=\"' +\n i +\n '\" checked' +\n actionAttrs('update-import-count') +\n ' />' +\n '<span class=\"ve-import-row-main\">' +\n '<span class=\"ve-import-row-top\"><span class=\"ve-import-row-name\">' +\n escapeHtml(candidate.name) +\n '</span>' +\n typeBadgeHtml(candidate.tagType) +\n '</span>' +\n '<span class=\"ve-import-row-value\">' +\n importValuePreviewHtml(candidate) +\n '</span>' +\n '</span>' +\n '</label>'\n );\n}\n\nfunction importValuePreviewHtml(candidate: ImportCandidate): string {\n const raw = candidate.sourceValue || '';\n\n if (candidate.tagType === 'color' && /^#[0-9a-fA-F]{3,8}$/.test(raw)) {\n return '<span class=\"ve-import-swatch\" style=\"background:' + raw + '\"></span>' + escapeHtml(raw);\n }\n\n const preview = raw.length > 80 ? raw.slice(0, 80) + '…' : raw;\n\n return escapeHtml(preview || '(empty)');\n}\n\nexport function importReviewActionsHtml(plan: ImportPlan): string {\n const count = (plan.importable || []).length;\n const close = actionAttrs('close-import-modal');\n\n if (!count) {\n return '<button type=\"button\" class=\"btn btn-sm\"' + close + '>Close</button>';\n }\n\n return (\n '<span class=\"hint\" id=\"ve-import-count\" style=\"margin-right:auto\">' +\n count +\n ' of ' +\n count +\n ' selected</span>' +\n '<button type=\"button\" class=\"btn btn-sm\"' +\n close +\n '>Cancel</button>' +\n '<button type=\"button\" class=\"btn btn-sm btn-primary\" id=\"ve-import-apply-btn\"' +\n actionAttrs('apply-import-plan') +\n '>Apply ' +\n count +\n ' selected</button>'\n );\n}\n","// Line diff of the JSON the Variables Editor is about to save, for its confirmation dialog.\n\nexport interface DiffLine {\n type: 'equal' | 'remove' | 'add';\n text: string;\n /** For a removed line followed by an added one: the other line, highlighted inline. */\n pair?: string;\n}\n\nfunction lcsLineMatrix(a: string[], b: string[]): number[][] {\n const m = a.length;\n const n = b.length;\n const dp = Array.from({ length: m + 1 }, () => new Array<number>(n + 1).fill(0));\n\n for (let i = m - 1; i >= 0; i--) {\n for (let j = n - 1; j >= 0; j--) {\n dp[i][j] = a[i] === b[j] ? dp[i + 1][j + 1] + 1 : Math.max(dp[i + 1][j], dp[i][j + 1]);\n }\n }\n\n return dp;\n}\n\nexport function computeLineDiff(\n beforeText: string | null | undefined,\n afterText: string | null | undefined,\n): DiffLine[] {\n const before = String(beforeText || '').split('\\n');\n const after = String(afterText || '').split('\\n');\n // The lines both sides start and end with are equal: only what lies between goes through the\n // O(m·n) LCS table, which for two whole files (a few thousand lines each) took seconds before\n // the modal showed, for a change of a line or two.\n let start = 0;\n let endBefore = before.length;\n let endAfter = after.length;\n\n while (start < endBefore && start < endAfter && before[start] === after[start]) {\n start++;\n }\n\n while (endBefore > start && endAfter > start && before[endBefore - 1] === after[endAfter - 1]) {\n endBefore--;\n endAfter--;\n }\n\n const a = before.slice(start, endBefore);\n const b = after.slice(start, endAfter);\n const dp = lcsLineMatrix(a, b);\n const lines: DiffLine[] = before.slice(0, start).map((text) => ({ type: 'equal', text }));\n let i = 0;\n let j = 0;\n\n while (i < a.length && j < b.length) {\n if (a[i] === b[j]) {\n lines.push({ type: 'equal', text: a[i] });\n i++;\n j++;\n } else if (dp[i + 1][j] >= dp[i][j + 1]) {\n lines.push({ type: 'remove', text: a[i] });\n i++;\n } else {\n lines.push({ type: 'add', text: b[j] });\n j++;\n }\n }\n\n while (i < a.length) {\n lines.push({ type: 'remove', text: a[i++] });\n }\n\n while (j < b.length) {\n lines.push({ type: 'add', text: b[j++] });\n }\n\n for (const text of before.slice(endBefore)) {\n lines.push({ type: 'equal', text });\n }\n\n // Pair adjacent remove+add as inline-highlighted changes.\n const paired: DiffLine[] = [];\n\n for (let k = 0; k < lines.length; k++) {\n const cur = lines[k];\n const next = lines[k + 1];\n\n if (cur.type === 'remove' && next && next.type === 'add') {\n paired.push({ type: 'remove', text: cur.text, pair: next.text });\n paired.push({ type: 'add', text: next.text, pair: cur.text });\n k++;\n } else {\n paired.push(cur);\n }\n }\n\n return paired;\n}\n","// The Variables Editor's dialogs: custom HTML modals instead of window.prompt()/confirm() — some\n// embedded webviews (e.g. Cursor's built-in browser) don't implement those native dialogs at all,\n// so they just return null immediately with no dialog ever shown. These work identically everywhere.\nimport { escapeHtml } from './html.js';\nimport { computeLineDiff } from './line-diff.js';\n\n/** Appends a `.ve-modal-overlay` with `html` inside to the page. */\nfunction openOverlay(html: string): HTMLDivElement {\n const overlay = document.createElement('div');\n\n overlay.className = 've-modal-overlay';\n overlay.innerHTML = html;\n document.body.appendChild(overlay);\n\n return overlay;\n}\n\nconst find = <T extends HTMLElement = HTMLButtonElement>(root: ParentNode, selector: string) =>\n root.querySelector(selector) as T;\n\n// Enter on a focused button is that button's own click (Cancel, ✕, the diff's ←/→), not the\n// dialog's confirmation: as the latter, it saved or discarded on a Cancel reached by Shift+Tab.\nconst isButton = (target: EventTarget | null) => target instanceof HTMLButtonElement;\n\n// Asks for a value (in place of window.prompt()); `onDone` gets `null` when the user cancels.\nexport function showCustomValueModal(title: string, initialValue: string, onDone: (value: string | null) => void) {\n const overlay = openOverlay(\n '<div class=\"ve-modal\">' +\n '<div class=\"ve-modal-title\">' +\n escapeHtml(title) +\n '</div>' +\n '<input type=\"text\" class=\"ve-modal-input\" value=\"' +\n escapeHtml(initialValue) +\n '\" />' +\n '<div class=\"ve-modal-actions\">' +\n '<button type=\"button\" class=\"btn btn-sm ve-modal-cancel\">Cancel</button>' +\n '<button type=\"button\" class=\"btn btn-sm btn-primary ve-modal-ok\">OK</button>' +\n '</div>' +\n '</div>',\n );\n const inputEl = find<HTMLInputElement>(overlay, '.ve-modal-input');\n\n inputEl.focus();\n inputEl.select();\n\n function close(value: string | null) {\n overlay.remove();\n onDone(value);\n }\n\n find(overlay, '.ve-modal-ok').addEventListener('click', () => close(inputEl.value));\n find(overlay, '.ve-modal-cancel').addEventListener('click', () => close(null));\n overlay.addEventListener('click', (ev) => {\n if (ev.target === overlay) {\n close(null);\n }\n });\n inputEl.addEventListener('keydown', (ev) => {\n if (ev.key === 'Enter') {\n ev.preventDefault();\n close(inputEl.value);\n } else if (ev.key === 'Escape') {\n ev.preventDefault();\n close(null);\n }\n });\n}\n\n// Same rationale as showCustomValueModal() — window.confirm() is unreliable in some embedded\n// webviews, so any \"discard unsaved changes?\" gate needs to go through this instead.\nexport function showConfirmModal(message: string, onConfirm: () => void) {\n const overlay = openOverlay(\n '<div class=\"ve-modal\">' +\n '<div class=\"ve-modal-title\">' +\n escapeHtml(message) +\n '</div>' +\n '<div class=\"ve-modal-actions\">' +\n '<button type=\"button\" class=\"btn btn-sm ve-modal-cancel\">Cancel</button>' +\n '<button type=\"button\" class=\"btn btn-sm btn-primary ve-modal-ok\">OK</button>' +\n '</div>' +\n '</div>',\n );\n\n find(overlay, '.ve-modal-ok').focus();\n\n function close(confirmed: boolean) {\n overlay.remove();\n\n if (confirmed) {\n onConfirm();\n }\n }\n\n find(overlay, '.ve-modal-ok').addEventListener('click', () => close(true));\n find(overlay, '.ve-modal-cancel').addEventListener('click', () => close(false));\n overlay.addEventListener('click', (ev) => {\n if (ev.target === overlay) {\n close(false);\n }\n });\n overlay.addEventListener('keydown', (ev) => {\n if (ev.key === 'Enter' && !isButton(ev.target)) {\n ev.preventDefault();\n close(true);\n } else if (ev.key === 'Escape') {\n ev.preventDefault();\n close(false);\n }\n });\n}\n\n// A plain info modal (no input, single \"Close\" action) — used to keep long explanations\n// (e.g. additional_options' full per-tag_source breakdown) out of the inline hint text.\nexport function showInfoModal(title: string, bodyHtml: string) {\n const overlay = openOverlay(\n '<div class=\"ve-modal ve-modal-wide\">' +\n '<div class=\"ve-modal-title\">' +\n escapeHtml(title) +\n '</div>' +\n '<div class=\"ve-modal-body\">' +\n bodyHtml +\n '</div>' +\n '<div class=\"ve-modal-actions\">' +\n '<button type=\"button\" class=\"btn btn-sm btn-primary ve-modal-ok\">Close</button>' +\n '</div>' +\n '</div>',\n );\n\n find(overlay, '.ve-modal-ok').focus();\n\n function close() {\n overlay.remove();\n }\n\n find(overlay, '.ve-modal-ok').addEventListener('click', close);\n overlay.addEventListener('click', (ev) => {\n if (ev.target === overlay) {\n close();\n }\n });\n overlay.addEventListener('keydown', (ev) => {\n if (ev.key === 'Enter' || ev.key === 'Escape') {\n ev.preventDefault();\n close();\n }\n });\n}\n\n/** `text` as JSON with 2-space indentation, or as it is when it isn't JSON. */\nexport function normalizeJsonText(text: string | null | undefined): string {\n try {\n return JSON.stringify(JSON.parse(text as string), null, 2);\n } catch {\n return String(text || '');\n }\n}\n\n// A changed line with the part that differs from its pair (the line it replaced) highlighted.\nfunction inlineDiffHtml(text: string, pair: string | undefined, mode: 'add' | 'remove'): string {\n if (pair == null || pair === text) {\n return escapeHtml(text);\n }\n\n let start = 0;\n const minLen = Math.min(text.length, pair.length);\n\n while (start < minLen && text.charAt(start) === pair.charAt(start)) {\n start++;\n }\n\n let endOld = text.length;\n let endNew = pair.length;\n\n while (endOld > start && endNew > start && text.charAt(endOld - 1) === pair.charAt(endNew - 1)) {\n endOld--;\n endNew--;\n }\n\n const before = escapeHtml(text.slice(0, start));\n const mid = escapeHtml(text.slice(start, endOld));\n const after = escapeHtml(text.slice(endOld));\n const cls = mode === 'add' ? 've-diff-inline-add' : 've-diff-inline-remove';\n\n return before + (mid ? '<span class=\"' + cls + '\">' + mid + '</span>' : '') + after;\n}\n\nfunction renderJsonDiffHtml(beforeText: string, afterText: string): { html: string; changeCount: number } {\n const before = normalizeJsonText(beforeText);\n const after = normalizeJsonText(afterText);\n\n if (before === after) {\n return { html: '<div class=\"ve-diff-empty\">No differences in the JSON file.</div>', changeCount: 0 };\n }\n\n const lines = computeLineDiff(before, after);\n let changeCount = 0;\n let inHunk = false;\n\n const html =\n '<div class=\"ve-diff\">' +\n lines\n .map((line) => {\n if (line.type === 'equal') {\n inHunk = false;\n\n return (\n '<div class=\"ve-diff-line\"><span class=\"ve-diff-prefix\"> </span><span>' +\n escapeHtml(line.text) +\n '</span></div>'\n );\n }\n\n const attrs = !inHunk ? ' data-change-index=\"' + changeCount + '\"' : '';\n\n if (!inHunk) {\n changeCount++;\n inHunk = true;\n }\n\n if (line.type === 'remove') {\n return (\n '<div class=\"ve-diff-line is-remove\"' +\n attrs +\n '><span class=\"ve-diff-prefix\">-</span><span>' +\n inlineDiffHtml(line.text, line.pair, 'remove') +\n '</span></div>'\n );\n }\n\n return (\n '<div class=\"ve-diff-line is-add\"' +\n attrs +\n '><span class=\"ve-diff-prefix\">+</span><span>' +\n inlineDiffHtml(line.text, line.pair, 'add') +\n '</span></div>'\n );\n })\n .join('') +\n '</div>';\n\n return { html: html, changeCount: changeCount };\n}\n\n// The save confirmation: the JSON file's changes, GitHub-style, with ←/→ to step through them.\nexport function showJsonDiffModal(beforeText: string, afterText: string, onConfirm: () => void) {\n const diff = renderJsonDiffHtml(beforeText, afterText);\n const hasChanges = diff.changeCount > 0;\n const overlay = openOverlay(\n '<div class=\"ve-modal ve-modal-diff\" role=\"dialog\" aria-modal=\"true\">' +\n '<div class=\"ve-modal-title-row\">' +\n '<div class=\"ve-modal-title\">JSON changes</div>' +\n '<button type=\"button\" class=\"btn btn-sm ve-modal-close\" title=\"Close\" aria-label=\"Close\">✕</button>' +\n '</div>' +\n '<div class=\"ve-modal-body\">' +\n (hasChanges\n ? '<div class=\"ve-diff-nav\">' +\n '<button type=\"button\" class=\"btn btn-sm ve-diff-prev\" title=\"Previous change\" aria-label=\"Previous change\">←</button>' +\n '<button type=\"button\" class=\"btn btn-sm ve-diff-next\" title=\"Next change\" aria-label=\"Next change\">→</button>' +\n '<span class=\"ve-diff-nav-count\">1 / ' +\n diff.changeCount +\n '</span>' +\n '</div>'\n : '') +\n diff.html +\n '</div>' +\n '<div class=\"ve-modal-actions\">' +\n '<div class=\"hint\">Review added (+) and removed (−) lines, including inline highlights for changed segments.</div>' +\n '<button type=\"button\" class=\"btn btn-sm ve-modal-cancel\">Cancel</button>' +\n '<button type=\"button\" class=\"btn btn-sm btn-primary ve-modal-ok\">Save Changes</button>' +\n '</div>' +\n '</div>',\n );\n\n find(overlay, '.ve-modal-ok').focus();\n\n let currentChange = 0;\n\n function updateChangeNav() {\n const countEl = overlay.querySelector('.ve-diff-nav-count');\n const prevBtn = overlay.querySelector<HTMLButtonElement>('.ve-diff-prev');\n const nextBtn = overlay.querySelector<HTMLButtonElement>('.ve-diff-next');\n const diffEl = overlay.querySelector('.ve-diff');\n\n if (!hasChanges || !diffEl) {\n return;\n }\n\n diffEl.querySelectorAll('.ve-diff-line.is-current-change').forEach((el) => {\n el.classList.remove('is-current-change');\n });\n\n const target = diffEl.querySelector('.ve-diff-line[data-change-index=\"' + currentChange + '\"]');\n\n if (target) {\n target.classList.add('is-current-change');\n target.scrollIntoView({ block: 'center', behavior: 'smooth' });\n }\n\n if (countEl) {\n countEl.textContent = currentChange + 1 + ' / ' + diff.changeCount;\n }\n\n if (prevBtn) {\n prevBtn.disabled = currentChange <= 0;\n }\n\n if (nextBtn) {\n nextBtn.disabled = currentChange >= diff.changeCount - 1;\n }\n }\n\n if (hasChanges) {\n find(overlay, '.ve-diff-prev').addEventListener('click', function () {\n if (currentChange > 0) {\n currentChange--;\n updateChangeNav();\n }\n });\n find(overlay, '.ve-diff-next').addEventListener('click', function () {\n if (currentChange < diff.changeCount - 1) {\n currentChange++;\n updateChangeNav();\n }\n });\n\n // Wait a frame so the modal layout is ready before scrolling.\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(function () {\n updateChangeNav();\n });\n }\n }\n\n function close(confirmed: boolean) {\n overlay.remove();\n\n if (confirmed && typeof onConfirm === 'function') {\n onConfirm();\n }\n }\n\n find(overlay, '.ve-modal-ok').addEventListener('click', () => close(true));\n find(overlay, '.ve-modal-cancel').addEventListener('click', () => close(false));\n find(overlay, '.ve-modal-close').addEventListener('click', () => close(false));\n overlay.addEventListener('click', (ev) => {\n if (ev.target === overlay) {\n close(false);\n }\n });\n overlay.addEventListener('keydown', (ev) => {\n if (ev.key === 'ArrowLeft' && hasChanges) {\n ev.preventDefault();\n\n if (currentChange > 0) {\n currentChange--;\n updateChangeNav();\n }\n\n return;\n }\n\n if (ev.key === 'ArrowRight' && hasChanges) {\n ev.preventDefault();\n\n if (currentChange < diff.changeCount - 1) {\n currentChange++;\n updateChangeNav();\n }\n\n return;\n }\n\n if (ev.key === 'Enter' && !isButton(ev.target)) {\n ev.preventDefault();\n close(true);\n } else if (ev.key === 'Escape') {\n ev.preventDefault();\n close(false);\n }\n });\n}\n","// The Schema tab's HTML (the `__template_variables.json` tags as a table) and the rules it shows\n// fields by. Controls say what they do in `data-action` (with `data-index`, `data-field`, …);\n// editor.ts handles their events in one place.\nimport { actionAttrs, escapeHtml, normalizeOptionEntry, renderSkeleton } from './html.js';\nimport type {\n EditorFlagField,\n FieldVisibility,\n ListColumn,\n SchemaChoiceField,\n SchemaState,\n SchemaTag,\n} from './types.js';\n\nexport const KNOWN_TYPES = ['text', 'select', 'multiselect', 'file', 'list', 'color', 'boolean'];\n\nconst KNOWN_TAG_SOURCES = [\n 'static',\n 'page',\n 'element',\n 'folder',\n 'segment',\n 'dataset',\n 'dataset_data',\n 'announcement',\n 'group',\n 'category',\n 'custom_attribute',\n 'page_entity',\n];\n// select/multiselect sources whose options are hand-entered via additional_options rather than\n// loaded live from MI (the rest — dataset/announcement/group/category/custom_attribute/page/\n// page_entity — populate their own option list, so additional_options doesn't apply there).\nconst HAND_ENTERED_OPTION_SOURCES = ['static', 'segment', 'element', 'dataset_data'];\n// list-tag column editor: field types + sources allowed on a select/multi-select column.\nconst LIST_COLUMN_TYPES = ['textarea', 'select', 'multi-select', 'color', 'file'];\nconst LIST_COLUMN_SOURCES = ['static', 'dataset', 'group', 'category', 'custom_attribute'];\n// Matches MI's own \"Create/Edit Variable\" form: letters, digits, underscore, whitespace, hyphen.\nconst NAME_FORMAT_REGEX = /^[A-Za-z0-9_\\s-]+$/;\n\n// A styled <select> (not a native <datalist>, whose popup/selected-state styling browsers\n// won't let us theme) with an escape hatch: picking \"Custom…\" prompts for any string, so a\n// tag_type/tag_source MI adds in the future can be configured here without a pp-dev code change.\nexport const CUSTOM_TYPE_SENTINEL = '__custom__';\n\nfunction customSelectCell(\n field: SchemaChoiceField,\n knownValues: string[],\n fallback: string,\n tag: SchemaTag,\n i: number,\n): string {\n const currentValue = tag[field] || fallback;\n const isKnown = knownValues.includes(currentValue);\n const knownOptions = knownValues\n .map((v) => '<option value=\"' + v + '\"' + (currentValue === v ? ' selected' : '') + '>' + v + '</option>')\n .join('');\n const customOption =\n !currentValue || isKnown\n ? ''\n : '<option value=\"' + escapeHtml(currentValue) + '\" selected>' + escapeHtml(currentValue) + ' (custom)</option>';\n\n return (\n '<select' +\n actionAttrs('custom-select', { index: i, field }) +\n '>' +\n knownOptions +\n customOption +\n '<option value=\"' +\n CUSTOM_TYPE_SENTINEL +\n '\">Custom…</option>' +\n '</select>'\n );\n}\n\nfunction typeSelectCell(tag: SchemaTag, i: number): string {\n return customSelectCell('tag_type', KNOWN_TYPES, 'text', tag, i);\n}\n\nfunction tagSourceSelectCell(tag: SchemaTag, i: number): string {\n return customSelectCell('tag_source', KNOWN_TAG_SOURCES, '', tag, i);\n}\n\n// Short, one-line version for inline display next to the field — click \"?\" for the full\n// per-tag_source breakdown (additionalOptionsDetails()) with examples, shown in a modal.\nfunction additionalOptionsHint(tag: SchemaTag): string {\n const tagType = tag.tag_type;\n\n if (tagType === 'select' || tagType === 'multiselect') {\n const source = tag.tag_source || 'static';\n\n if (source === 'static') {\n return 'The option list itself.';\n }\n\n if (source === 'dataset_data') {\n return 'Which dataset + columns to pull options from.';\n }\n\n if (source === 'element') {\n return 'Optional filter by element type.';\n }\n\n if (source === 'segment') {\n return \"Accepted by MI's form, but not read for this source.\";\n }\n\n return 'Not used for tag_source \"' + escapeHtml(source) + '\" — MI loads its options live.';\n }\n\n if (tagType === 'list') {\n return 'Column definitions for list-of-objects items, or \"\" for a flat list of strings.';\n }\n\n if (tagType === 'boolean') {\n return 'Not used for tag_type \"boolean\".';\n }\n\n return 'No confirmed runtime use for tag_type \"' + escapeHtml(tagType || 'text') + '\".';\n}\n\n// Full breakdown with examples, reverse-engineered from MI's own options-loading logic —\n// shown in a modal (the \"?\" next to the field) so the inline hint above can stay short.\nexport function additionalOptionsDetails(tag: SchemaTag): string {\n const tagType = tag.tag_type;\n\n if (tagType === 'select' || tagType === 'multiselect') {\n const source = tag.tag_source || 'static';\n\n if (source === 'static') {\n return (\n '<p>The option list itself. Each entry is a plain string, or an object with <code>id</code>/<code>text</code>:</p>' +\n '<pre>[{\"id\":\"1\",\"text\":\"One\"},\"Two\"]</pre>' +\n '<p>A plain string entry uses itself as both the stored value and the label.</p>'\n );\n }\n\n if (source === 'dataset_data') {\n return (\n '<p>Pulls options live from a dataset, by column name:</p>' +\n '<pre>{\"dataset_id\":123,\"key_column\":\"id_col\",\"text_column\":\"name_col\"}</pre>' +\n '<p><code>key_column</code> supplies the option value, <code>text_column</code> the label.</p>'\n );\n }\n\n if (source === 'element') {\n return (\n '<p>Optional — restricts the dashboard-element list to one type:</p>' +\n '<pre>{\"type\":\"metric\"}</pre>' +\n '<p>Accepted values: <code>metric</code>, <code>multi-metric chart</code>, <code>internal report</code>, <code>external report</code>, <code>other external content</code>. Leave empty to list all elements.</p>'\n );\n }\n\n if (source === 'segment') {\n return '<p>MI\\'s own \"Create/Edit Variable\" form shows this field for tag_source \"segment\", but its options-loading endpoint never actually reads it — the segment list always comes back unfiltered. Best left empty.</p>';\n }\n\n return (\n '<p>Not used — for tag_source \"' +\n escapeHtml(source) +\n '\", MI loads options live from its own data (e.g. the dataset/announcement/group/category/page list) and never consults this field.</p>'\n );\n }\n\n if (tagType === 'list') {\n return (\n '<p>An array of column definitions — each list item becomes an object keyed by these names:</p>' +\n '<pre>[{\"name\":\"id\",\"type\":\"textarea\"},{\"name\":\"color\",\"type\":\"color\"}]</pre>' +\n '<p>A bare string entry is shorthand for <code>{\"name\": <that string>, \"type\": \"textarea\"}</code>. Leave as <code>\"\"</code> (empty string) instead for a flat list of plain strings.</p>' +\n '<p>Supported field <code>type</code>s: <code>textarea</code>, <code>color</code>, <code>select</code>, <code>multi-select</code>, <code>file</code>.</p>' +\n '<p>For a <code>select</code>/<code>multi-select</code> column, add <code>source</code> (defaults to <code>\"static\"</code>) and <code>options</code> — same per-source rules as the tag-level <code>tag_source</code>/<code>additional_options</code> above, just scoped to this one column and fed by <code>options</code> instead:</p>' +\n '<pre>{\"name\":\"country\",\"type\":\"select\",\"options\":[\"USA\",\"Canada\"]}</pre>' +\n \"<p>MI's own list-item editor never reads this column's own <code>additional_options</code> — only <code>options</code> — so leave it out.</p>\"\n );\n }\n\n if (tagType === 'boolean') {\n return \"<p>MI's own editor doesn't show this field for tag_type \\\"boolean\\\", and there's no known runtime use for it — leave empty.</p>\";\n }\n\n return (\n '<p>MI\\'s own editor lets you fill this in for tag_type \"' +\n escapeHtml(tagType || 'text') +\n '\", but there\\'s no confirmed runtime consumer for it — treat it as unused/reserved.</p>'\n );\n}\n\nexport const LIST_COLUMNS_HELP_HTML =\n '<p>An array of column definitions — each list item becomes an object keyed by these names. Supported field <code>types</code>: <code>textarea</code>, <code>color</code>, <code>select</code>, <code>multi-select</code>, <code>file</code>.</p>' +\n '<p>Edited below as a column editor — reordering/adding/removing there is the same thing as hand-editing this JSON array, just without needing to write JSON.</p>';\n\n// Mirrors MI's own \"Create/Edit Variable\" form: which fields it shows/hides depends on\n// tag_type (and, for the tag_source picker and additional_options, tag_source too). For a\n// tag_type MI hasn't defined yet (i.e. a custom one entered via typeSelectCell's escape hatch),\n// there's no such logic to mirror, so give full access to everything instead of guessing.\nfunction fieldVisibility(tag: SchemaTag): FieldVisibility {\n const type = tag.tag_type;\n\n if (!KNOWN_TYPES.includes(type as string)) {\n return {\n tagSource: true,\n useHtml: true,\n rawHtml: true,\n useJson: true,\n defaultValue: true,\n additionalOptions: true,\n };\n }\n\n const isTextOrList = type === 'text' || type === 'list';\n const isSelectLike = type === 'select' || type === 'multiselect';\n const useHtmlOn = tag.use_hmtl_editor_ind === 'Y';\n const source = tag.tag_source || 'static';\n\n return {\n tagSource: isSelectLike,\n useHtml: type === 'text',\n rawHtml: isTextOrList && !useHtmlOn,\n useJson: (type === 'text' && !useHtmlOn) || type === 'list',\n defaultValue: isTextOrList,\n additionalOptions:\n type === 'text' ||\n type === 'file' ||\n type === 'list' ||\n type === 'color' ||\n (isSelectLike && HAND_ENTERED_OPTION_SOURCES.indexOf(source) !== -1),\n };\n}\n\nfunction checkboxField(label: string, checked: boolean, attrs: string): string {\n return (\n '<label class=\"checkbox-label\"><input type=\"checkbox\" ' +\n (checked ? 'checked' : '') +\n ' ' +\n attrs +\n ' />' +\n escapeHtml(label) +\n '</label>'\n );\n}\n\nfunction editorFlagsRow(tag: SchemaTag, i: number, vis: FieldVisibility): string {\n if (!vis.useHtml && !vis.rawHtml && !vis.useJson) {\n return '';\n }\n\n const parts: string[] = [];\n const flag = (label: string, field: EditorFlagField) =>\n checkboxField(label, tag[field] === 'Y', actionAttrs('editor-flag', { index: i, field }).trim());\n\n if (vis.useHtml) {\n parts.push(flag('Use WYSIWYG Editor', 'use_hmtl_editor_ind'));\n }\n\n if (vis.rawHtml) {\n parts.push(flag('Raw HTML', 'use_raw_html_ind'));\n }\n\n if (vis.useJson) {\n parts.push(flag('Use JSON Editor', 'use_json_editor_ind'));\n }\n\n return '<div style=\"grid-column:1/-1\" class=\"checkbox-row\">' + parts.join('') + '</div>';\n}\n\nfunction nameWarningHint(name: string | undefined): string {\n if (!name) {\n return '<div class=\"hint\" style=\"color:var(--red)\">Name is required.</div>';\n }\n\n if (!NAME_FORMAT_REGEX.test(name)) {\n return '<div class=\"hint\" style=\"color:var(--red)\">Contains a character MI\\'s own editor doesn\\'t allow — only letters, digits, underscore, hyphen, and whitespace.</div>';\n }\n\n return '';\n}\n\n// Normalize list-tag additional_options into editable column objects. Non-array values\n// (flat-list \"\" / invalid raw text) become an empty column list — editing via the UI replaces them.\nexport function listColumnsFor(tag: SchemaTag | undefined): ListColumn[] {\n const opts = tag && tag.additional_options;\n\n if (!Array.isArray(opts)) {\n return [];\n }\n\n return (opts as (string | ListColumn)[]).map((c) =>\n typeof c === 'string' ? { name: c, type: 'textarea' } : Object.assign({}, c),\n );\n}\n\n// Persist select/multi-select columns without a redundant source when options are present —\n// source is only kept when there is no options list (non-static / empty options).\nexport function normalizeListColumn(col: ListColumn): ListColumn {\n const out: ListColumn = Object.assign({ name: '', type: 'textarea' }, col);\n const type = out.type || 'textarea';\n const isSelect = type === 'select' || type === 'multi-select';\n\n if (!isSelect) {\n delete out.source;\n delete out.options;\n\n return out;\n }\n\n if (Array.isArray(out.options) && out.options.length) {\n delete out.source;\n } else {\n delete out.options;\n\n if (!out.source) {\n out.source = 'static';\n }\n }\n\n return out;\n}\n\nfunction listColumnSelectOptions(values: string[], selected: string): string {\n return values\n .map(\n (v) =>\n '<option value=\"' +\n escapeHtml(v) +\n '\"' +\n (v === selected ? ' selected' : '') +\n '>' +\n escapeHtml(v) +\n '</option>',\n )\n .join('');\n}\n\nfunction listColumnItemHtml(col: ListColumn, i: number, colIndex: number): string {\n const name = col.name != null ? String(col.name) : '';\n const type = col.type || 'textarea';\n const isSelect = type === 'select' || type === 'multi-select';\n const source = col.source || 'static';\n // Same { id, text } | string shape as the Values tab's select widget (see listItemFieldsHtml())\n // — show the readable text, not \"[object Object]\", for a column with object-shaped options.\n // Editing this comma-separated field still only ever writes back plain strings (id === text) —\n // this UI has never round-tripped distinct id/text pairs, only raw JSON editing does.\n const optionsText = Array.isArray(col.options) ? col.options.map((o) => normalizeOptionEntry(o).text).join(', ') : '';\n const at = { index: i, col: colIndex };\n\n const typeOptions = listColumnSelectOptions(\n LIST_COLUMN_TYPES.indexOf(type) !== -1 ? LIST_COLUMN_TYPES : LIST_COLUMN_TYPES.concat([type]),\n type,\n );\n\n let bottom =\n '<div class=\"ve-ao-column-field\">' +\n '<label>type</label>' +\n '<select' +\n actionAttrs('list-column-field', { ...at, field: 'type' }) +\n '>' +\n typeOptions +\n '</select>' +\n '</div>';\n\n if (isSelect) {\n const sourceOptions = listColumnSelectOptions(\n LIST_COLUMN_SOURCES.indexOf(source) !== -1 ? LIST_COLUMN_SOURCES : LIST_COLUMN_SOURCES.concat([source]),\n source,\n );\n\n bottom +=\n '<div class=\"ve-ao-column-field\">' +\n '<label>source</label>' +\n '<select' +\n actionAttrs('list-column-field', { ...at, field: 'source' }) +\n '>' +\n sourceOptions +\n '</select>' +\n '</div>';\n\n if (source === 'static') {\n bottom +=\n '<div class=\"ve-ao-column-field\">' +\n '<label>options</label>' +\n '<input type=\"text\" value=\"' +\n escapeHtml(optionsText) +\n '\" placeholder=\"Options (comma-separated)\"' +\n actionAttrs('list-column-options', at) +\n ' />' +\n '</div>';\n }\n }\n\n return (\n '<div class=\"ve-ao-column\" data-row=\"' +\n i +\n '\" data-col-index=\"' +\n colIndex +\n '\" data-drop=\"list-column\">' +\n '<span class=\"ve-ao-column-handle\" draggable=\"true\" data-drag=\"list-column\" title=\"Drag to reorder\" aria-label=\"Drag to reorder\" role=\"button\" tabindex=\"0\">⠿</span>' +\n '<div class=\"ve-ao-column-fields\">' +\n '<div class=\"ve-ao-column-top\">' +\n '<div class=\"ve-ao-column-field\">' +\n '<label>name</label>' +\n '<div class=\"ve-ao-column-name\">' +\n '<input type=\"text\" value=\"' +\n escapeHtml(name) +\n '\"' +\n actionAttrs('list-column-name', at) +\n ' placeholder=\"Column name\" />' +\n '<button type=\"button\" class=\"btn btn-sm ve-ao-column-remove\"' +\n actionAttrs('remove-list-column', at) +\n ' title=\"Remove column\">✕</button>' +\n '</div>' +\n '</div>' +\n '</div>' +\n '<div class=\"ve-ao-column-bottom\">' +\n bottom +\n '</div>' +\n '</div>' +\n '</div>'\n );\n}\n\nfunction listColumnsEditorHtml(tag: SchemaTag, i: number): string {\n const cols = listColumnsFor(tag);\n const itemsHtml = cols.map((col, colIndex) => listColumnItemHtml(col, i, colIndex)).join('');\n\n return (\n '<div class=\"box-style\" style=\"grid-column:1/-1\">' +\n '<label>additional_options (UI version)<button type=\"button\" class=\"btn btn-sm\" style=\"padding:0 6px;margin-left:4px\"' +\n actionAttrs('show-list-columns-help') +\n ' title=\"What is additional_options for list?\">?</button></label>' +\n '<div class=\"ve-ao-columns\">' +\n itemsHtml +\n '</div>' +\n '<button type=\"button\" class=\"btn btn-sm\" style=\"margin-top:8px\"' +\n actionAttrs('add-list-column', { index: i }) +\n '>+ Add column</button>' +\n '</div>'\n );\n}\n\nfunction schemaRowHtml(tag: SchemaTag, i: number): string {\n const vis = fieldVisibility(tag);\n // An empty string means \"not set\" (the flat-list/no-options convention) — show it as an\n // empty field instead of the literal two-character JSON string '\"\"'.\n const additionalOptionsRaw =\n tag.additional_options !== undefined && tag.additional_options !== '' ? JSON.stringify(tag.additional_options) : '';\n const field = (name: string) => actionAttrs('schema-field', { index: i, field: name });\n\n const defaultValueCell = vis.defaultValue\n ? '<textarea class=\"cell-textarea\"' +\n field('default_value') +\n ' data-autosize>' +\n escapeHtml(tag.default_value || '') +\n '</textarea>'\n : '<textarea class=\"cell-textarea\" disabled title=\"MI\\'s own editor has no Default Value field for this tag_type.\">' +\n escapeHtml(tag.default_value || '') +\n '</textarea>';\n\n const tagSourceCell = vis.tagSource\n ? tagSourceSelectCell(tag, i)\n : '<span class=\"badge\">' +\n escapeHtml(tag.tag_source || 'static') +\n '</span> <div class=\"hint\">Only configurable for select/multiselect in MI\\'s own editor.</div>';\n\n const additionalOptionsCell = vis.additionalOptions\n ? '<textarea id=\"ao-raw-' +\n i +\n '\"' +\n actionAttrs('schema-additional-options', { index: i }) +\n '>' +\n escapeHtml(additionalOptionsRaw) +\n '</textarea>'\n : '<textarea id=\"ao-raw-' +\n i +\n '\" disabled title=\"Not used for this tag_type/tag_source combination in MI\\'s own editor.\">' +\n escapeHtml(additionalOptionsRaw) +\n '</textarea>';\n\n const listColumnsEditor = tag.tag_type === 'list' ? listColumnsEditorHtml(tag, i) : '';\n\n return `\n <tr class=\"schema-row\" data-row-index=\"${i}\" data-drop=\"schema-row\">\n <td class=\"col-expand\">\n <div class=\"ve-expand-cell\">\n <span class=\"ve-schema-row-handle\" draggable=\"true\" data-drag=\"schema-row\" title=\"Drag to reorder\" aria-label=\"Drag to reorder\" role=\"button\" tabindex=\"0\">⠿</span>\n <button class=\"btn btn-sm ve-expand-btn\" id=\"expand-btn-${i}\"${actionAttrs('toggle-schema-advanced', { index: i })} aria-expanded=\"false\" title=\"Advanced fields (uid, tag_source, additional_options, editor flags)\">▸</button>\n </div>\n </td>\n <td class=\"col-name\">\n <input type=\"text\" value=\"${escapeHtml(tag.name || '')}\"${field('name')} />\n ${nameWarningHint(tag.name)}\n </td>\n <td class=\"col-type\">${typeSelectCell(tag, i)}</td>\n <td>${defaultValueCell}</td>\n <td><textarea class=\"cell-textarea\"${field('description')} data-autosize>${escapeHtml(tag.description || '')}</textarea></td>\n <td class=\"col-actions\">\n <button class=\"btn btn-sm\"${actionAttrs('remove-schema-row', { index: i })}>✕</button>\n </td>\n </tr>\n <tr class=\"details-row\" id=\"advanced-${i}\" data-row-index=\"${i}\" style=\"display:none;\" data-drop=\"schema-row\">\n <td colspan=\"6\" style=\"border:none;\">\n <div class=\"details-grid\">\n <div class=\"details-grid-item-wrapper\">\n <div class=\"box-style\"><label>uid</label><input type=\"text\" value=\"${escapeHtml(tag.uid || '')}\"${field('uid')} /></div>\n <div class=\"box-style\"><label>tag_source</label>${tagSourceCell}</div>\n <div class=\"box-style\" style=\"height:fit-content;\">${editorFlagsRow(tag, i, vis)}</div>\n </div>\n <div class=\"box-style\" style=\"grid-column:1/-1\">\n <label>additional_options (raw JSON) <button type=\"button\" class=\"btn btn-sm\" style=\"padding:0 6px;margin-left:4px\"${actionAttrs('show-additional-options-help', { index: i })} title=\"What goes here for this type/source?\">?</button></label>\n ${additionalOptionsCell}\n <div class=\"hint\">${additionalOptionsHint(tag)}</div>\n\n </div>\n ${listColumnsEditor}\n </div>\n </td>\n </tr>\n `;\n}\n\nexport function renderSchemaTabHtml(\n schemaState: SchemaState | null,\n rawMode: boolean,\n schemaRows: SchemaTag[],\n): string {\n if (!schemaState) {\n return renderSkeleton();\n }\n\n if (rawMode) {\n return `\n <div class=\"raw-toggle\"><button class=\"btn btn-sm\"${actionAttrs('toggle-raw-mode')}>Switch to table view</button></div>\n ${schemaState.parseError ? '<div class=\"banner banner-error\">The file is not a valid schema: ' + escapeHtml(schemaState.parseError) + '</div>' : ''}\n <textarea class=\"raw-editor\" id=\"raw-editor\"${actionAttrs('set-dirty')}>${escapeHtml(schemaState.raw || '')}</textarea>\n <div class=\"hint\">Editing the raw file text directly. Must be valid JSON with a top-level \"tags\" array.</div>\n `;\n }\n\n if (!schemaState.exists) {\n return `<div class=\"empty-state\">No local __template_variables.json found.<br><button class=\"btn btn-sm\" style=\"margin-top:10px\"${actionAttrs('add-schema-row')}>Create one — add first variable</button></div>`;\n }\n\n const rows = schemaRows.map(schemaRowHtml).join('');\n\n return `\n <div class=\"raw-toggle\"><button class=\"btn btn-sm\"${actionAttrs('toggle-raw-mode')}>View/edit raw JSON</button></div>\n <table>\n <thead><tr><th class=\"col-expand\"></th><th class=\"col-name\">Name</th><th class=\"col-type\">Type</th><th>Default value</th><th>Description</th><th class=\"col-actions\"></th></tr></thead>\n <tbody>${rows || '<tr><td colspan=\"6\" class=\"empty-state\">No variables yet.</td></tr>'}</tbody>\n </table>\n <button class=\"btn btn-sm\" style=\"margin-top:10px\"${actionAttrs('add-schema-row')}>+ Add variable</button>\n <div class=\"hint\">Pick a known type, or choose \"Custom…\" to enter any value if MI adds a new tag_type.</div>\n `;\n}\n\n// A new variable's uid: 32 hex digits, the shape of the MD5-based uids MI gives its own.\nexport function newUid(): string {\n const bytes = new Uint8Array(16);\n\n crypto.getRandomValues(bytes);\n\n return Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n}\n","/**\n * Markdown for page variable descriptions in the Variables Editor's Values tab. MI renders them\n * with showdown's default options (see MI's `PageVariable.tsx`); this is the subset that matters\n * there, rendered the same way:\n *\n * - `**bold**` and `__bold__`, `*italic*` and `_italic_` (not inside words, like `snake_case`);\n * - inline code with one or more backticks (``` `` a `b` `` ```), and fenced ```` ``` ```` blocks;\n * - `-`, `*`, `+` and `1.` lists;\n * - underline and strikethrough the way showdown lets them through: as `<u>`, `<s>`, `<del>` and\n * `<strike>` tags. (Showdown's defaults don't turn `~~text~~` into strikethrough.)\n *\n * Everything else is escaped, so a description can't inject markup. Line breaks are kept, as the\n * plain-text hint did before.\n */\nexport function renderDescriptionMarkdown(text: string): string {\n const escape = (s: string) =>\n s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n\n const inline = (line: string) => {\n const codes: string[] = [];\n // Code spans first, so nothing inside them is formatted: a whole run of backticks up to the\n // same run. Mismatched runs stay as they are.\n let out = line.replace(/(?<!\\x60)(\\x60+)([^\\x60]|[^\\x60][\\s\\S]*?[^\\x60])\\1(?!\\x60)/g, (_, ticks, code) => {\n codes.push('<code>' + escape(code.replace(/\\n/g, ' ').trim()) + '</code>');\n\n return '\\u0000' + (codes.length - 1) + '\\u0000';\n });\n\n out = escape(out)\n .replace(/<(\\/?)(u|s|del|strike)>/gi, '<$1$2>')\n .replace(/\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*/g, '<strong>$1</strong>')\n .replace(/(^|[^\\w])__(?=\\S)([\\s\\S]*?\\S)__(?=[^\\w]|$)/g, '$1<strong>$2</strong>')\n .replace(/\\*(?=\\S)([\\s\\S]*?\\S)\\*/g, '<em>$1</em>')\n .replace(/(^|[^\\w])_(?=\\S)([\\s\\S]*?\\S)_(?=[^\\w]|$)/g, '$1<em>$2</em>');\n\n return out.replace(/\\u0000(\\d+)\\u0000/g, (_, i) => codes[Number(i)]);\n };\n\n const lines = String(text).replace(/\\r\\n?/g, '\\n').split('\\n');\n const blocks: string[] = [];\n let paragraph: string[] = [];\n let list: { tag: string; items: string[]; start: number | undefined } | null = null;\n\n const flushParagraph = () => {\n if (paragraph.length) {\n // One paragraph at a time, so code and emphasis can span its line breaks, which stay.\n blocks.push('<p>' + inline(paragraph.join('\\n')).replace(/\\n/g, '<br>') + '</p>');\n paragraph = [];\n }\n };\n const flushList = () => {\n if (list) {\n // A numbered list goes on from the number its first item has: \"2.\" after a blank line is 2.\n const start = list.start && list.start !== 1 ? ' start=\"' + list.start + '\"' : '';\n\n blocks.push(\n '<' +\n list.tag +\n start +\n '>' +\n list.items.map((item) => '<li>' + inline(item) + '</li>').join('') +\n '</' +\n list.tag +\n '>',\n );\n list = null;\n }\n };\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // An opening fence: three or more backticks and an info string without any (a line with three\n // backticks, \"a\", three backticks again is inline code instead).\n const fence = /^\\s*(\\x60{3,})[^\\x60]*$/.exec(line);\n\n if (fence) {\n flushParagraph();\n flushList();\n\n const code: string[] = [];\n\n // Closed by a line of only backticks, at least as many as opened it.\n const close = new RegExp('^\\\\s*\\\\x60{' + fence[1].length + ',}\\\\s*$');\n\n for (i++; i < lines.length && !close.test(lines[i]); i++) {\n code.push(lines[i]);\n }\n\n blocks.push('<pre><code>' + escape(code.join('\\n')) + '</code></pre>');\n continue;\n }\n\n const item = /^\\s*(?:([-*+])|(\\d+)[.)])\\s+(.*)$/.exec(line);\n\n if (item) {\n const tag = item[1] ? 'ul' : 'ol';\n\n flushParagraph();\n\n if (list && list.tag !== tag) {\n flushList();\n }\n\n list = list || { tag, items: [], start: item[2] ? Number(item[2]) : undefined };\n list.items.push(item[3]);\n continue;\n }\n\n if (!line.trim()) {\n flushParagraph();\n flushList();\n continue;\n }\n\n // A line right after a list item, indented, continues it.\n if (list && /^\\s+\\S/.test(line)) {\n list.items[list.items.length - 1] += ' ' + line.trim();\n continue;\n }\n\n flushList();\n paragraph.push(line);\n }\n\n flushParagraph();\n flushList();\n\n return blocks.join('');\n}\n","// The Values tab's HTML (a widget per variable, by its schema type) and its JSON mode's\n// conversions. Controls say what they do in `data-action` (with `data-index`, `data-item`,\n// `data-column`, …); editor.ts handles their events in one place.\nimport {\n actionAttrs,\n escapeHtml,\n normalizeOptionEntry,\n renderSkeleton,\n sourceBadgeHtml,\n typeBadgeHtml,\n} from './html.js';\nimport { renderDescriptionMarkdown } from './markdown.js';\nimport type {\n ExportableValueRow,\n JsonIssue,\n ListColumn,\n NormalizedOption,\n OptionEntry,\n SchemaTag,\n ValueRow,\n ValuesState,\n} from './types.js';\n\nexport function schemaTagFor(state: ValuesState | null, name: string): SchemaTag | undefined {\n const tags = (state?.schema && state.schema.tags) || [];\n\n return tags.find((t) => t.name === name);\n}\n\n// MI renders descriptions as markdown; the part of it that matters there (see\n// markdown.ts), with everything else escaped.\nfunction descriptionHint(tag: SchemaTag | undefined): string {\n if (!tag || !tag.description) {\n return '';\n }\n\n return '<div class=\"hint ve-md\" style=\"margin-bottom: 8px;\">' + renderDescriptionMarkdown(tag.description) + '</div>';\n}\n\n// The plain-text default already matches MI's own fallback (a multiline input); on top of\n// that, mirror the three editor-flag checkboxes from the Schema tab's Advanced panel — MI's\n// own value editor swaps in a rich/code editor for the first two (we use a plain textarea for\n// both, since embedding a real WYSIWYG editor is out of scope for this lightweight tool). The\n// third (use_json_editor_ind) is accepted by MI's create form but never actually acted upon by\n// its value editor either — shown here only as an FYI, no widget change.\nfunction textValueCell(tag: SchemaTag, row: ValueRow, i: number): string {\n const widget =\n '<textarea class=\"cell-textarea\"' +\n actionAttrs('value', { index: i }) +\n ' data-autosize>' +\n escapeHtml(row.value) +\n '</textarea>';\n let note = '';\n\n if (tag.use_hmtl_editor_ind === 'Y') {\n note = 'WYSIWYG HTML in MI — edited as raw HTML here.';\n } else if (tag.use_raw_html_ind === 'Y') {\n note = 'Raw HTML — MI skips XSS-encoding this value on save.';\n } else if (tag.use_json_editor_ind === 'Y') {\n note = \"JSON Editor flag is set, though MI's value editor doesn't actually act on it.\";\n }\n\n return note ? widget + '<div class=\"hint\">' + note + '</div>' : widget;\n}\n\nexport function normalizeStaticOptions(tag: SchemaTag | undefined): NormalizedOption[] {\n const opts = tag && tag.additional_options;\n\n if (!Array.isArray(opts)) {\n return [];\n }\n\n return (opts as OptionEntry[]).map(normalizeOptionEntry);\n}\n\nfunction labelForOption(options: NormalizedOption[], id: string): string {\n const found = options.find((o) => o.id === id);\n\n return found ? found.text : id;\n}\n\n// The options of a combobox: picked on mousedown (see editor.ts), before the input loses focus.\nfunction comboOptionsHtml(options: NormalizedOption[]): string {\n return options\n .map(\n (o) =>\n '<div class=\"ve-combo-option\" data-id=\"' +\n escapeHtml(o.id) +\n '\" data-text=\"' +\n escapeHtml(o.text) +\n '\"' +\n actionAttrs('pick-combo-option') +\n '>' +\n (o.text !== o.id\n ? escapeHtml(o.text) + ' <span class=\"hint\">(' + escapeHtml(o.id) + ')</span>'\n : escapeHtml(o.id)) +\n '</div>',\n )\n .join('');\n}\n\nexport function chipHtml(id: string, text: string): string {\n return (\n '<span class=\"ve-chip\" data-id=\"' +\n escapeHtml(id) +\n '\">' +\n escapeHtml(text) +\n '<button type=\"button\"' +\n actionAttrs('remove-chip') +\n '>✕</button></span>'\n );\n}\n\n// A search-as-you-type combobox — not a native <select>/<datalist> (see the Schema tab's\n// tag_type picker for why: unstylable popups, broken selected-state colors). Only viable for\n// tag_source \"static\", since that's the only source whose options live in additional_options\n// itself; every other source needs MI's own internal editor-only options endpoint, which we\n// deliberately don't call (no public API for it — see TEMPLATE_VARIABLES.md).\nfunction selectValueWidget(tag: SchemaTag, row: ValueRow, i: number): string {\n const options = normalizeStaticOptions(tag);\n const isMulti = tag.tag_type === 'multiselect';\n\n if (isMulti) {\n const ids = row.value ? row.value.split(',').filter(Boolean) : [];\n const chips = ids.map((id) => chipHtml(id, labelForOption(options, id))).join('');\n\n return (\n '<div class=\"ve-combo ve-combo-multi\">' +\n '<div class=\"ve-combo-chips\" data-row=\"' +\n i +\n '\" id=\"combo-chips-' +\n i +\n '\">' +\n chips +\n '</div>' +\n '<input type=\"text\" class=\"ve-combo-input\" placeholder=\"Search by id or value…\"' +\n actionAttrs('combo-filter', { index: i }) +\n ' />' +\n '<div class=\"ve-combo-list\" id=\"combo-list-' +\n i +\n '\" style=\"display:none\">' +\n comboOptionsHtml(options) +\n '</div>' +\n '</div>'\n );\n }\n\n return (\n '<div class=\"ve-combo\">' +\n '<input type=\"text\" class=\"ve-combo-input\" value=\"' +\n escapeHtml(row.value || '') +\n '\" placeholder=\"Search by id or value…\"' +\n actionAttrs('single-combo', { index: i }) +\n ' />' +\n '<div class=\"ve-combo-list\" id=\"combo-list-' +\n i +\n '\" style=\"display:none\">' +\n comboOptionsHtml(options) +\n '</div>' +\n '</div>'\n );\n}\n\n// Non-empty additional_options (array) means column-defined objects; empty/absent means a flat\n// list of strings. A bare string entry is shorthand for { name: <string>, type: 'textarea' }.\nexport function listConfigFor(tag: SchemaTag | undefined): ListColumn[] | null {\n const opts = tag && tag.additional_options;\n\n return Array.isArray(opts) && opts.length\n ? (opts as (string | ListColumn)[]).map((c) => (typeof c === 'string' ? { name: c, type: 'textarea' } : c))\n : null;\n}\n\nexport function parseListItems(row: ValueRow): unknown[] | null {\n try {\n const parsed: unknown = row.value ? JSON.parse(row.value) : [];\n\n // A stored \"null\" (MI's own encoding for \"no value yet\") means an empty list, not invalid\n // JSON — only reject genuinely non-array, non-null JSON (e.g. an object or a number).\n if (parsed === null) {\n return [];\n }\n\n return Array.isArray(parsed) ? (parsed as unknown[]) : null;\n } catch {\n return null;\n }\n}\n\nfunction listFieldLabelHtml(colName: string, source: string): string {\n return (\n '<div class=\"ve-values-field-label\"><span>' + escapeHtml(colName) + '</span>' + sourceBadgeHtml(source) + '</div>'\n );\n}\n\nfunction listValueWidget(tag: SchemaTag | undefined, row: ValueRow, i: number): string {\n const items = parseListItems(row);\n\n if (items === null) {\n return (\n '<div class=\"ve-values-field is-wide\"><div class=\"ve-values-field-label\"><span>value</span></div>' +\n '<textarea class=\"cell-textarea\"' +\n actionAttrs('value', { index: i }) +\n ' data-autosize>' +\n escapeHtml(row.value) +\n '</textarea>' +\n '<div class=\"hint\" style=\"color:var(--red)\">Not a valid JSON array — edit as raw text above, or fix it via \"View/edit raw JSON\".</div></div>'\n );\n }\n\n const config = listConfigFor(tag);\n const itemsHtml = items\n .map((item, itemIndex) => {\n return (\n '<div class=\"ve-values-list-item\" data-value-index=\"' +\n i +\n '\" data-item-index=\"' +\n itemIndex +\n '\" data-drop=\"list-item\">' +\n '<span class=\"ve-values-list-item-handle\" draggable=\"true\" data-drag=\"list-item\" title=\"Drag to reorder\" aria-label=\"Drag to reorder\" role=\"button\" tabindex=\"0\">⠿</span>' +\n listItemFieldsHtml(config, item, i, itemIndex) +\n '<button type=\"button\" class=\"btn btn-sm ve-values-list-item-remove\" title=\"Remove item\" aria-label=\"Remove item\"' +\n actionAttrs('remove-list-item', { index: i, item: itemIndex }) +\n '>✕</button>' +\n '</div>'\n );\n })\n .join('');\n\n return (\n '<div class=\"ve-values-list-items\">' +\n (itemsHtml || '<div class=\"ve-values-empty\">No items yet.</div>') +\n '</div>' +\n '<button type=\"button\" class=\"ve-values-nav-item ve-values-nav-add\" style=\"margin-top:12px;width:auto\"' +\n actionAttrs('add-list-item', { index: i }) +\n '>+ Add item</button>'\n );\n}\n\nfunction listItemFieldsHtml(config: ListColumn[] | null, item: unknown, i: number, itemIndex: number): string {\n if (!config) {\n const val = typeof item === 'string' ? item : String(item != null ? item : '');\n\n return (\n '<div class=\"ve-values-fields\"><div class=\"ve-values-field is-wide\">' +\n '<textarea class=\"cell-textarea\"' +\n actionAttrs('list-item-field', { index: i, item: itemIndex }) +\n ' data-autosize>' +\n escapeHtml(val) +\n '</textarea>' +\n '</div></div>'\n );\n }\n\n const fieldsHtml = config\n .map((col) => {\n const colName = String(col.name);\n const field = (action: string) => actionAttrs(action, { index: i, item: itemIndex, column: colName });\n const colType = col.type || 'textarea';\n const colSource = col.source ? col.source : colType === 'select' || colType === 'multi-select' ? 'static' : '';\n const rawVal = typeof item === 'object' && item !== null ? (item as Record<string, unknown>)[colName] : '';\n const val = rawVal != null ? String(rawVal) : '';\n const wide = colType === 'textarea' || colType === 'file' || val.length > 48 ? ' is-wide' : '';\n\n if (colType === 'color') {\n const safe = /^#[0-9a-fA-F]{3,8}$/.test(val) ? val : '#000000';\n\n return (\n '<div class=\"ve-values-field\">' +\n listFieldLabelHtml(colName, colSource) +\n '<input type=\"color\" value=\"' +\n safe +\n '\"' +\n field('list-item-field') +\n ' /></div>'\n );\n }\n\n if (colType === 'select' || colType === 'multi-select') {\n const isMulti = colType === 'multi-select';\n\n // Only \"static\" ships its option list locally (col.options); every other source is\n // populated live by MI's own editor (see additionalOptionsDetails()) and pp-dev has no\n // API to fetch it here — fall back to free text, same as the tag-level select does.\n if (colSource !== 'static') {\n return (\n '<div class=\"ve-values-field\">' +\n listFieldLabelHtml(colName, colSource) +\n '<input type=\"text\" value=\"' +\n escapeHtml(val) +\n '\"' +\n field('list-item-field') +\n ' placeholder=\"source: ' +\n escapeHtml(colSource) +\n ' — no local option list\" /></div>'\n );\n }\n\n // Each entry may be a plain string or a { id, text } object (e.g. {\"text\":\"Yes\",\"id\":\"Y\"}) —\n // normalize before use, or an object entry stringifies to \"[object Object]\" for both the\n // <option> value and its label.\n const opts = (Array.isArray(col.options) ? col.options : []).map(normalizeOptionEntry);\n const selected = isMulti ? val.split(',').filter(Boolean) : [val];\n const optionsHtml = opts\n .map(\n (o) =>\n '<option value=\"' +\n escapeHtml(o.id) +\n '\"' +\n (selected.indexOf(o.id) !== -1 ? ' selected' : '') +\n '>' +\n escapeHtml(o.text) +\n '</option>',\n )\n .join('');\n\n return (\n '<div class=\"ve-values-field\">' +\n listFieldLabelHtml(colName, colSource) +\n '<select ' +\n (isMulti ? 'multiple ' : '') +\n field('list-item-select').trim() +\n ' data-autosize>' +\n optionsHtml +\n '</select></div>'\n );\n }\n\n return (\n '<div class=\"ve-values-field' +\n wide +\n '\">' +\n listFieldLabelHtml(colName, colSource) +\n '<textarea class=\"cell-textarea\"' +\n field('list-item-field') +\n ' data-autosize>' +\n escapeHtml(val) +\n '</textarea></div>'\n );\n })\n .join('');\n\n return '<div class=\"ve-values-fields\">' + fieldsHtml + '</div>';\n}\n\nfunction valueEditorCell(tag: SchemaTag | undefined, row: ValueRow, i: number): string {\n const type = tag ? tag.tag_type : null;\n const value = actionAttrs('value', { index: i });\n\n if (type === 'boolean') {\n // MI's own page-variable UI writes literal 'true'/'false' strings, not 'Y'/'N' — the\n // extra accepted values below are just legacy/lenient reads, not something we write.\n const checked = ['true', 'Y', '1'].includes(row.value);\n\n return (\n '<input type=\"checkbox\" ' +\n (checked ? 'checked' : '') +\n ' ' +\n actionAttrs('value-boolean', { index: i }).trim() +\n ' />'\n );\n }\n\n if (type === 'color') {\n const safe = /^#[0-9a-fA-F]{3,8}$/.test(row.value) ? row.value : '#000000';\n\n return '<input type=\"color\" value=\"' + safe + '\"' + value + ' />';\n }\n\n if ((type === 'select' || type === 'multiselect') && tag) {\n const source = tag.tag_source || 'static';\n\n if (source === 'static') {\n return selectValueWidget(tag, row, i);\n }\n\n return (\n '<input type=\"text\" value=\"' +\n escapeHtml(row.value) +\n '\"' +\n value +\n ' placeholder=\"tag_source: ' +\n escapeHtml(source) +\n ' — no local option list\" />'\n );\n }\n\n if (type === 'file') {\n // No public MI API exists for listing/uploading a page's individual file assets (only\n // whole-bundle zip download/upload, which doesn't fit a single value) — manual path only.\n // MI's own upload control restricts these to images: jpg/jpeg/png/gif/svg.\n return (\n '<input type=\"text\" value=\"' +\n escapeHtml(row.value) +\n '\"' +\n value +\n ' placeholder=\"Existing image filename (jpg/jpeg/png/gif/svg)\" />'\n );\n }\n\n if (type === 'list') {\n return listValueWidget(tag, row, i);\n }\n\n if (type === 'text' && tag) {\n return textValueCell(tag, row, i);\n }\n\n return '<input type=\"text\" value=\"' + escapeHtml(row.value) + '\"' + value + ' />';\n}\n\n// Same convention as the old \"Export variables…\"/\"Setup variables…\" flow (now retired in\n// favor of this JSON mode): a list-type value is shown/accepted as a native JSON array\n// instead of a JSON-string-in-a-string, converting only at this display/parse boundary —\n// the PUT /@api/variables/values endpoint itself always sees plain strings.\nexport function toExportableValueRows(rows: ValueRow[], state: ValuesState | null): ExportableValueRow[] {\n return rows.map((row) => {\n const tag = schemaTagFor(state, row.name);\n\n if (tag && tag.tag_type === 'list') {\n try {\n const parsed: unknown = JSON.parse(row.value);\n\n if (Array.isArray(parsed)) {\n return { name: row.name, value: parsed };\n }\n } catch {\n // not valid JSON — keep the raw string below\n }\n }\n\n return { name: row.name, value: row.value };\n });\n}\n\nexport function fromExportableValueRows(entries: ExportableValueRow[]): ValueRow[] {\n return entries.map(({ name, value }) => ({\n name,\n value: typeof value === 'string' ? value : JSON.stringify(value),\n }));\n}\n\n// Cheap, best-effort lint pass over the JSON textarea's current text — no textarea-internal\n// highlighting (native hover tooltips can't reach through an editable textarea sitting on top\n// of an overlay), just a small badge per flagged entry with a native title attribute explanation.\nfunction computeJsonIssues(text: string, state: ValuesState | null): JsonIssue[] {\n let entries: unknown;\n\n try {\n entries = JSON.parse(text);\n } catch {\n return [];\n }\n\n if (!Array.isArray(entries)) {\n return [];\n }\n\n const baseline = new Map(\n toExportableValueRows(state && state.combined ? state.combined : [], state).map((e) => [\n e.name,\n JSON.stringify(e.value),\n ]),\n );\n\n const issues: JsonIssue[] = [];\n\n (entries as (Partial<ExportableValueRow> | null)[]).forEach((entry) => {\n if (!entry || typeof entry.name !== 'string') {\n return;\n }\n\n const messages: string[] = [];\n const tag = schemaTagFor(state, entry.name);\n\n if (!tag) {\n messages.push('Not found in the current schema (__template_variables.json) — MI has no matching variable.');\n }\n\n if (\n tag &&\n (tag.tag_type === 'select' || tag.tag_type === 'multiselect') &&\n (tag.tag_source || 'static') === 'static'\n ) {\n const options = normalizeStaticOptions(tag);\n\n if (options.length && typeof entry.value === 'string') {\n const tokens =\n tag.tag_type === 'multiselect'\n ? entry.value\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean)\n : [entry.value].filter(Boolean);\n const unmatched = tokens.filter((t) => !options.some((o) => o.id === t || o.text === t));\n\n if (unmatched.length) {\n messages.push(\n 'Value \"' + unmatched.join(', ') + \"\\\" doesn't match any option in this variable's static list.\",\n );\n }\n }\n }\n\n const canonicalValue = JSON.stringify(entry.value);\n\n if (baseline.has(entry.name)) {\n if (baseline.get(entry.name) !== canonicalValue) {\n messages.push('Changed since this tab was last loaded/refreshed.');\n }\n } else if (tag) {\n messages.push('New — this variable had no value when this tab was last loaded/refreshed.');\n }\n\n if (messages.length) {\n issues.push({ name: entry.name, message: messages.join(' ') });\n }\n });\n\n return issues;\n}\n\nexport function renderJsonIssuesBar(text: string, state: ValuesState | null): string {\n const issues = computeJsonIssues(text, state);\n\n if (!issues.length) {\n return '';\n }\n\n return (\n '<div class=\"ve-json-issues\">' +\n issues\n .map(\n (issue) =>\n '<span class=\"ve-json-issue-badge\" title=\"' +\n escapeHtml(issue.message) +\n '\">⚠ ' +\n escapeHtml(issue.name) +\n '</span>',\n )\n .join('') +\n '</div>'\n );\n}\n\nfunction valuesNavItemHtml(tag: SchemaTag | undefined, row: ValueRow, i: number, isActive: boolean): string {\n const type = tag ? tag.tag_type || 'text' : 'unknown';\n const showsSource = tag && (tag.tag_type === 'select' || tag.tag_type === 'multiselect' || tag.tag_type === 'list');\n const source = showsSource ? tag.tag_source || 'static' : '';\n\n return (\n '<button type=\"button\" class=\"ve-values-nav-item' +\n (isActive ? ' is-active' : '') +\n '\" data-value-index=\"' +\n i +\n '\"' +\n actionAttrs('select-value-row') +\n '>' +\n '<span class=\"ve-values-nav-dot\"></span>' +\n '<span class=\"ve-values-nav-label\">' +\n escapeHtml(row.name || '(unnamed)') +\n '</span>' +\n '<span class=\"ve-values-nav-badges\">' +\n typeBadgeHtml(type) +\n sourceBadgeHtml(source) +\n '</span>' +\n '</button>'\n );\n}\n\nfunction valuesDetailHtml(tag: SchemaTag | undefined, row: ValueRow, i: number): string {\n const type = tag ? tag.tag_type || 'text' : '';\n const source = tag && tag.tag_source ? tag.tag_source : '';\n const isList = type === 'list';\n\n const header =\n '<div class=\"ve-values-detail-header\">' +\n '<div class=\"ve-values-detail-title\">' +\n escapeHtml(row.name || '(unnamed)') +\n '</div>' +\n listFieldLabelHtml(type || 'value', source) +\n '<button type=\"button\" class=\"btn btn-sm\"' +\n actionAttrs('remove-value-row', { index: i }) +\n ' title=\"Delete variable\">✕</button>' +\n '</div>';\n\n if (isList) {\n return header + descriptionHint(tag) + listValueWidget(tag, row, i);\n }\n\n return (\n header +\n descriptionHint(tag) +\n '<div class=\"ve-values-fields\"><div class=\"ve-values-field is-wide\">' +\n valueEditorCell(tag, row, i) +\n '</div></div>'\n );\n}\n\n/** The Values tab; `selectedIndex` must be a row of `rows` when there are any. */\nexport function renderValuesTabHtml(\n state: ValuesState | null,\n rows: ValueRow[],\n rawMode: boolean,\n selectedIndex: number,\n): string {\n if (!state) {\n return renderSkeleton();\n }\n\n if (rawMode) {\n return `\n <div class=\"raw-toggle\">\n <button class=\"btn btn-sm\"${actionAttrs('toggle-values-raw-mode')}>Switch to table view</button>\n <button class=\"btn btn-sm\"${actionAttrs('download-values-json')}>Save to JSON file…</button>\n <button class=\"btn btn-sm\"${actionAttrs('import-values-json')}>Import from JSON file…</button>\n <input type=\"file\" id=\"import-values-file\" accept=\"application/json,.json\" style=\"display:none\"${actionAttrs('import-values-file')} />\n </div>\n <textarea class=\"raw-editor\" id=\"values-raw-editor\" spellcheck=\"false\"${actionAttrs('values-raw-input')}>${escapeHtml(JSON.stringify(toExportableValueRows(rows, state), null, 2))}</textarea>\n <div id=\"values-raw-issues\"></div>\n <div class=\"hint\">Editing the raw JSON directly. Must be an array of { name, value } entries — value may be a native JSON array for list-type variables (converted to MI's plain-string form on save).</div>\n `;\n }\n\n if (!rows.length) {\n return `\n <div class=\"raw-toggle\">\n <button class=\"btn btn-sm\"${actionAttrs('toggle-values-raw-mode')}>View/edit raw JSON</button>\n <button class=\"btn btn-sm\"${actionAttrs('open-import-modal')}>⇄ Import from page…</button>\n </div>\n <div class=\"ve-values-layout\">\n <div class=\"ve-values-nav\">\n <div class=\"ve-values-nav-list\"></div>\n <button type=\"button\" class=\"ve-values-nav-item ve-values-nav-add\"${actionAttrs('add-value-row')}>+ Add item</button>\n </div>\n <div class=\"ve-values-detail box-style\"><div class=\"ve-values-empty\">No variables yet.</div></div>\n </div>\n `;\n }\n\n const tags = rows.map((row) => schemaTagFor(state, row.name));\n const navHtml = rows.map((row, i) => valuesNavItemHtml(tags[i], row, i, i === selectedIndex)).join('');\n const detailHtml = rows\n .map(\n (row, i) =>\n '<div class=\"ve-values-anchor box-style' +\n (i === selectedIndex ? ' is-active' : '') +\n '\" id=\"value-item-' +\n i +\n '\" data-value-index=\"' +\n i +\n '\">' +\n valuesDetailHtml(tags[i], row, i) +\n '</div>',\n )\n .join('');\n\n return `\n <div class=\"raw-toggle\">\n <button class=\"btn btn-sm\"${actionAttrs('toggle-values-raw-mode')}>View/edit raw JSON</button>\n <button class=\"btn btn-sm\"${actionAttrs('open-import-modal')}>⇄ Import from page…</button>\n </div>\n <div class=\"ve-values-layout\">\n <div class=\"ve-values-nav\">\n <div class=\"ve-values-nav-list\">${navHtml}</div>\n <button type=\"button\" class=\"ve-values-nav-item ve-values-nav-add\"${actionAttrs('add-value-row')}>+ Add item</button>\n </div>\n <div class=\"ve-values-detail\">${detailHtml}</div>\n </div>\n `;\n}\n","// The Variables Editor page (`/@pp-dev/variables-editor`): the page's template variables\n// (Schema tab, `__template_variables.json`) and their live values in MI (Values tab). main.ts\n// starts it on variables-editor.html. The HTML comes from schema-tab.ts, values-tab.ts and\n// import-modal.ts; its controls say what they do in `data-action`, handled here in one place.\nimport { applyTheme, getStoredTheme, setTheme, type ThemeChoice } from '../theme.js';\nimport { errorMessage, escapeHtml } from './html.js';\nimport {\n importErrorHtml,\n importPickerBodyHtml,\n importPickerStepHtml,\n importReviewActionsHtml,\n importReviewBodyHtml,\n importReviewStepHtml,\n} from './import-modal.js';\nimport {\n normalizeJsonText,\n showConfirmModal,\n showCustomValueModal,\n showInfoModal,\n showJsonDiffModal,\n} from './modals.js';\nimport {\n CUSTOM_TYPE_SENTINEL,\n LIST_COLUMNS_HELP_HTML,\n additionalOptionsDetails,\n listColumnsFor,\n newUid,\n normalizeListColumn,\n renderSchemaTabHtml,\n} from './schema-tab.js';\nimport type {\n EditorFlagField,\n ErrorBody,\n ExportableValueRow,\n ImportCandidate,\n ImportPlan,\n ListColumn,\n LocalValuesResponse,\n PagesResponse,\n SchemaChoiceField,\n SchemaSaveResponse,\n SchemaState,\n SchemaTag,\n SchemaTextField,\n ValueRow,\n ValuesSaveResponse,\n ValuesState,\n} from './types.js';\nimport {\n chipHtml,\n fromExportableValueRows,\n listConfigFor,\n parseListItems,\n renderJsonIssuesBar,\n renderValuesTabHtml,\n schemaTagFor,\n toExportableValueRows,\n} from './values-tab.js';\n\ntype Tab = 'schema' | 'values';\ntype BannerType = 'error' | 'success' | 'warning';\n/** A control whose `value` the editor reads. */\ntype FieldElement = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\nconst TEMPLATE_LESS_MESSAGE =\n '<div class=\"empty-state\">This page has no associated template — there\\'s no <code>__template_variables.json</code> and no page variables to edit here.</div>';\nconst AUTO_LOAD_DEBOUNCE_MS = 200;\n\n// Lets a link like /@pp-dev/variables-editor?tab=values open directly on that tab.\nfunction tabFromUrl(): Tab {\n return new URLSearchParams(window.location.search).get('tab') === 'values' ? 'values' : 'schema';\n}\n\n// Values tab's raw/JSON mode is also linkable — /@pp-dev/variables-editor?tab=values&mode=json.\nfunction valuesJsonModeFromUrl(): boolean {\n return new URLSearchParams(window.location.search).get('mode') === 'json';\n}\n\nfunction setUrlState(tab: Tab, valuesJsonMode: boolean) {\n const url = new URL(window.location.href);\n\n url.searchParams.set('tab', tab);\n\n if (tab === 'values' && valuesJsonMode) {\n url.searchParams.set('mode', 'json');\n } else {\n url.searchParams.delete('mode');\n }\n\n history.replaceState(null, '', url);\n}\n\nfunction autosizeCellTextarea(el: HTMLElement) {\n const type = (el as HTMLInputElement).type;\n\n if (type === 'color' || type === 'checkbox') {\n return;\n }\n\n el.style.height = '0';\n el.style.height = Math.max(30, el.scrollHeight) + 'px';\n}\n\nfunction autosizeAllCellTextareas() {\n document\n .querySelectorAll<HTMLElement>(\n '.cell-textarea, .ve-list-field textarea, .ve-list-field input[type=text], .ve-list-field select, .ve-values-field textarea, .ve-values-field input[type=text], .ve-values-field select',\n )\n .forEach((el) => autosizeCellTextarea(el));\n}\n\n/** Starts the editor on the current document; returns a function that stops it (its listeners). */\nexport function startVariablesEditor({ templateLess }: { templateLess: boolean }): () => void {\n const byId = <T extends HTMLElement = HTMLElement>(id: string) => document.getElementById(id) as T | null;\n\n // ── Theme (Auto/Dark/Light) ────────────────────────────────────────────────\n // Runs unconditionally — before the templateLess early-return below — so the switcher works\n // even on the info-only page. The <head> inline script already set data-pp-dev-theme before\n // first paint; this keeps the toolbar buttons in step. Shared with the dev panel and the Request\n // Inspector (see ../theme.ts), so picking a theme in any of them carries over to the others.\n const showTheme = (theme: ThemeChoice) => {\n applyTheme(theme);\n\n for (const button of Array.from(byId('theme-switch')?.children ?? []) as HTMLElement[]) {\n const isActive = button.dataset.themeChoice === theme;\n\n button.classList.toggle('active', isActive);\n button.setAttribute('aria-pressed', String(isActive));\n }\n };\n\n const onThemeClick = (event: MouseEvent) => {\n const button = event.target instanceof Element ? event.target.closest<HTMLElement>('[data-theme-choice]') : null;\n\n if (button) {\n const theme = button.dataset.themeChoice as ThemeChoice;\n\n setTheme(theme);\n showTheme(theme);\n }\n };\n\n showTheme(getStoredTheme());\n document.addEventListener('click', onThemeClick);\n\n const contentEl = byId<HTMLDivElement>('content')!;\n\n // No template: no tabs, no Refresh/Save (hidden by the page's CSS), just the message.\n if (templateLess) {\n contentEl.innerHTML = TEMPLATE_LESS_MESSAGE;\n\n return () => document.removeEventListener('click', onThemeClick);\n }\n\n let activeTab = tabFromUrl();\n let schemaState: SchemaState | null = null;\n let valuesState: ValuesState | null = null;\n let schemaRows: SchemaTag[] = []; // working copy of tags, edited in place\n const invalidAdditionalOptionsRows = new WeakSet<SchemaTag>();\n let valueRows: ValueRow[] = []; // working copy of {name, value}\n let selectedValueIndex = 0;\n let importReviewCandidates: ImportCandidate[] = []; // last-fetched import-plan's \"importable\" list, for applyImportPlan()\n let importReviewPageName = ''; // source page name, for the post-apply banner\n let valuesRawMode = activeTab === 'values' && valuesJsonModeFromUrl();\n let rawMode = false;\n let dirty = false;\n let editSeq = 0;\n let banner: { type: BannerType; html: string } | null = null;\n // Last-known saved JSON for each tab — used to build the post-save GitHub-style diff.\n const jsonBaseline = { schema: '', values: '' };\n\n // Background-refresh bookkeeping, one pair of (loading flag, sequence counter) per tab: a\n // stale response (superseded by a newer load for the SAME tab before it resolved) is dropped\n // rather than clobbering fresher data — see loadTabData().\n let schemaLoading = false;\n let valuesLoading = false;\n let schemaSeq = 0;\n let valuesSeq = 0;\n let autoLoadTimer: ReturnType<typeof setTimeout> | null = null;\n // Set by stop(): a load, save or timer that completes afterwards must not paint over the markup,\n // which a new instance may have taken over meanwhile.\n let stopped = false;\n\n const onBeforeUnload = (e: BeforeUnloadEvent) => {\n if (dirty) {\n e.preventDefault();\n e.returnValue = '';\n }\n };\n\n window.addEventListener('beforeunload', onBeforeUnload);\n\n function setDirty(v: boolean) {\n dirty = v;\n\n if (v) {\n editSeq += 1;\n }\n }\n\n function showBanner(type: BannerType, html: string, preserveContent?: boolean) {\n if (stopped) {\n return;\n }\n\n banner = { type, html };\n\n if (preserveContent) {\n const existingBanner = contentEl.querySelector(':scope > .banner');\n const bannerEl = document.createElement('div');\n\n if (existingBanner) {\n existingBanner.remove();\n }\n\n bannerEl.className = 'banner banner-' + type;\n bannerEl.innerHTML = html;\n contentEl.prepend(bannerEl);\n\n return;\n }\n\n render();\n }\n\n function clearBanner() {\n banner = null;\n }\n\n // ── Data loading ─────────────────────────────────────────────────────────────\n // Both loaders resolve to whether the tab took the data. Edits made while a load ran (the tab\n // paints what it has first, see scheduleAutoLoad) stay as they are: only what counts as saved\n // takes the current content, and the caller leaves the tab unpainted, since a repaint would\n // move the caret.\n async function loadSchema(seq: number, editSeqAtStart: number): Promise<boolean> {\n let r: Response;\n let data: SchemaState & ErrorBody;\n\n try {\n r = await fetch('/@api/variables/schema');\n data = (await r.json()) as SchemaState & ErrorBody;\n } catch (e) {\n if (seq !== schemaSeq) {\n return false;\n }\n\n showBanner('error', 'Failed to load the schema: ' + escapeHtml(errorMessage(e)));\n\n return false;\n }\n\n if (seq !== schemaSeq) {\n return false;\n }\n\n // An error answer (e.g. 503 with no dist service) is not a schema: kept as one, it rendered as\n // \"No local __template_variables.json found\" and offered to create a file over the real one.\n if (!r.ok) {\n schemaState = null;\n schemaRows = [];\n showBanner('error', 'Failed to load the schema: ' + escapeHtml((data && data.error) || 'HTTP ' + r.status));\n\n return false;\n }\n\n const freshRows: SchemaTag[] =\n data.schema && Array.isArray(data.schema.tags) ? data.schema.tags.map((t) => Object.assign({}, t)) : [];\n const freshRawMode = data.exists && !data.schema;\n const edited = editSeq !== editSeqAtStart;\n\n schemaState = data;\n\n if (!edited) {\n schemaRows = freshRows;\n rawMode = freshRawMode;\n }\n\n // In raw mode the file's text, not the textarea's (which may hold edits): the diff shown\n // before a save compares with it.\n jsonBaseline.schema = freshRawMode ? data.raw || '' : schemaJsonOf(data, freshRows);\n\n return !edited;\n }\n\n async function loadValues(seq: number, editSeqAtStart: number): Promise<boolean> {\n let r: Response;\n\n try {\n r = await fetch('/@api/variables/values');\n } catch (e) {\n if (seq !== valuesSeq) {\n return false;\n }\n\n valuesState = null;\n valueRows = [];\n showBanner('error', 'Failed to load values: ' + escapeHtml(errorMessage(e)));\n\n return false;\n }\n\n if (!r.ok) {\n const err = (await r.json().catch(() => ({}))) as ErrorBody;\n\n if (seq !== valuesSeq) {\n return false;\n }\n\n // A save is a full replacement. Keep the state explicitly unavailable after a failed\n // read so the user cannot accidentally submit an empty replacement set.\n valuesState = null;\n valueRows = [];\n showBanner('error', escapeHtml(err.error || 'Failed to load values.'));\n\n return false;\n }\n\n let data: ValuesState;\n\n try {\n data = (await r.json()) as ValuesState;\n } catch (e) {\n if (seq !== valuesSeq) {\n return false;\n }\n\n valuesState = null;\n valueRows = [];\n showBanner('error', 'Failed to parse the values response: ' + escapeHtml(errorMessage(e)));\n\n return false;\n }\n\n if (seq !== valuesSeq) {\n return false;\n }\n\n const freshRows = (data.combined || []).map((e) => Object.assign({}, e));\n const edited = editSeq !== editSeqAtStart;\n\n valuesState = data;\n\n if (!edited) {\n valueRows = freshRows;\n }\n\n jsonBaseline.values = snapshotValuesJson(freshRows);\n\n return !edited;\n }\n\n /** The schema as the file's JSON text would be with `rows` as its tags. */\n function schemaJsonOf(state: SchemaState, rows: SchemaTag[]): string {\n if (state.raw && !state.schema) {\n return state.raw;\n }\n\n try {\n return JSON.stringify(Object.assign({}, state.schema || {}, { tags: rows }), null, 2);\n } catch {\n return state.raw || '';\n }\n }\n\n function snapshotValuesJson(rows?: ValueRow[]): string {\n try {\n return JSON.stringify(toExportableValueRows(rows || valueRows, valuesState), null, 2);\n } catch {\n return '[]';\n }\n }\n\n // Fetches fresh data for one tab, tracking a per-tab \"loading\" flag and sequence number so a\n // response that's superseded by a newer load for the SAME tab (started before this one\n // resolved) gets dropped instead of clobbering fresher data. Toggles the tab's own loading\n // flag but deliberately doesn't call render() itself — callers decide when to repaint, which\n // they do only when the tab took the data (see loadSchema).\n function loadTabData(tab: Tab): Promise<boolean> {\n const editSeqAtStart = editSeq;\n\n if (tab === 'schema') {\n const seq = ++schemaSeq;\n\n schemaLoading = true;\n\n return loadSchema(seq, editSeqAtStart).then((taken) => {\n if (seq === schemaSeq) {\n schemaLoading = false;\n }\n\n return taken;\n });\n }\n\n const seq = ++valuesSeq;\n\n valuesLoading = true;\n\n return loadValues(seq, editSeqAtStart).then((taken) => {\n if (seq === valuesSeq) {\n valuesLoading = false;\n }\n\n return taken;\n });\n }\n\n /** Repaints the tab once a load is over, or, with edits made meanwhile kept, only the \"Refreshing…\" dot. */\n function paintLoaded(taken: boolean) {\n if (taken) {\n render();\n } else {\n updateLoadingIndicator();\n }\n }\n\n // The manual \"↻ Refresh\" button — deliberately NOT debounced, so it's always the fast path\n // for \"I just changed something in MI and want it now\" (see scheduleAutoLoad for the\n // debounced, tab-switch-driven path).\n async function doRefresh() {\n clearBanner();\n setDirty(false);\n\n // loadTabData() flips the tab's loading flag synchronously before its fetch resolves, so\n // render() has to run AFTER that call starts (not before) for the indicator to reflect it.\n const pending = loadTabData(activeTab);\n\n render();\n paintLoaded(await pending);\n }\n\n function refresh() {\n if (dirty) {\n showConfirmModal('Discard unsaved changes?', () => void doRefresh());\n\n return;\n }\n\n void doRefresh();\n }\n\n // Debounces the network round-trip that automatically follows a tab switch: rapidly flipping\n // between tabs (or landing on one only to immediately leave it) only fires the load that's\n // still pending once things settle, rather than one request per click.\n function scheduleAutoLoad(tab: Tab) {\n if (autoLoadTimer) {\n clearTimeout(autoLoadTimer);\n }\n\n autoLoadTimer = setTimeout(() => {\n autoLoadTimer = null;\n\n // loadTabData() flips the tab's loading flag synchronously before its fetch resolves, so\n // render() has to run AFTER this call starts (not before) for the indicator to reflect it.\n const pending = loadTabData(tab);\n\n if (activeTab === tab) {\n render();\n }\n\n void pending.then((taken) => {\n if (activeTab === tab) {\n paintLoaded(taken);\n }\n });\n }, AUTO_LOAD_DEBOUNCE_MS);\n }\n\n function doSwitchTab(tab: Tab) {\n activeTab = tab;\n setDirty(false);\n clearBanner();\n\n // Switching tabs by hand always starts the Values tab in table view — only a direct link\n // (?tab=values&mode=json, handled at bootstrap) opens straight into raw/JSON mode.\n if (tab === 'values') {\n valuesRawMode = false;\n }\n\n setUrlState(tab, valuesRawMode);\n\n byId('tab-schema')!.classList.toggle('active', tab === 'schema');\n byId('tab-values')!.classList.toggle('active', tab === 'values');\n\n // Paint immediately with whatever's already cached for this tab (or a skeleton, if it's\n // never been loaded) instead of leaving the previous tab's content on screen until the\n // debounced fetch below resolves.\n render();\n scheduleAutoLoad(tab);\n }\n\n function switchTab(tab: Tab) {\n if (dirty) {\n showConfirmModal('Discard unsaved changes and switch tabs?', () => doSwitchTab(tab));\n\n return;\n }\n\n doSwitchTab(tab);\n }\n\n // ── Schema tab ───────────────────────────────────────────────────────────────\n function showAdditionalOptionsHelp(i: number) {\n const tag = schemaRows[i];\n\n // showInfoModal() escapes the title itself.\n showInfoModal(\n 'additional_options — ' + (tag.tag_type || 'text') + (tag.tag_source ? ' / ' + tag.tag_source : ''),\n additionalOptionsDetails(tag),\n );\n }\n\n // Re-renders the whole schema table (needed because changing tag_type/tag_source/an editor\n // flag can change which OTHER fields this same row should show), then restores row i's\n // advanced panel to whatever open/closed state it was in — render() always starts it closed.\n function rerenderKeepingAdvancedOpen(i: number) {\n const before = byId('advanced-' + i);\n const wasOpen = !!before && before.style.display !== 'none';\n\n render();\n\n if (wasOpen) {\n const after = byId('advanced-' + i);\n const btn = byId('expand-btn-' + i);\n\n if (after) {\n after.style.display = '';\n }\n\n if (btn) {\n btn.textContent = '▾';\n btn.setAttribute('aria-expanded', 'true');\n }\n }\n }\n\n function updateEditorFlag(i: number, field: EditorFlagField, checked: boolean) {\n schemaRows[i][field] = checked ? 'Y' : 'N';\n\n // Matches MI's own form: turning WYSIWYG on is exclusive with Raw HTML / JSON Editor.\n if (field === 'use_hmtl_editor_ind' && checked) {\n schemaRows[i].use_raw_html_ind = 'N';\n schemaRows[i].use_json_editor_ind = 'N';\n }\n\n setDirty(true);\n rerenderKeepingAdvancedOpen(i);\n }\n\n function onCustomSelectChange(i: number, selectEl: HTMLSelectElement, field: SchemaChoiceField) {\n if (selectEl.value !== CUSTOM_TYPE_SENTINEL) {\n updateSchemaField(i, field, selectEl.value);\n\n // tag_type/tag_source changes can change which other fields this row should show.\n rerenderKeepingAdvancedOpen(i);\n\n return;\n }\n\n showCustomValueModal('Custom ' + field + ' value', schemaRows[i][field] || '', (custom) => {\n if (custom) {\n updateSchemaField(i, field, custom);\n }\n\n // Re-render either way: on success, so the select shows the new custom option instead of\n // \"Custom…\"; on cancel, so it reverts to the row's actual (unchanged) value.\n rerenderKeepingAdvancedOpen(i);\n });\n }\n\n function toggleRawMode() {\n if (!schemaState) {\n return;\n }\n\n if (!rawMode) {\n // Entering raw mode: serialize the current table state so edits aren't lost.\n schemaState.raw = JSON.stringify(Object.assign({}, schemaState.schema, { tags: schemaRows }), null, 2);\n } else {\n // Leaving raw mode: try to parse back into the table; keep raw mode on failure.\n const editorEl = byId<HTMLTextAreaElement>('raw-editor');\n const editorText = editorEl ? editorEl.value : (schemaState.raw as string);\n\n try {\n const parsed = JSON.parse(editorText) as SchemaState['schema'];\n\n if (!parsed || !Array.isArray(parsed.tags)) {\n throw new Error('Missing \"tags\" array');\n }\n\n schemaState.schema = parsed;\n schemaRows = parsed.tags.map((t) => Object.assign({}, t));\n schemaState.exists = true;\n delete schemaState.parseError;\n } catch (e) {\n // showBanner() re-renders, which would otherwise regenerate this textarea from the last\n // known-good schemaState.raw — put the user's (still-broken) text back afterward so their\n // in-progress edit isn't silently discarded.\n showBanner('error', 'Cannot switch to table view: ' + escapeHtml(errorMessage(e)));\n\n const freshEditorEl = byId<HTMLTextAreaElement>('raw-editor');\n\n if (freshEditorEl) {\n freshEditorEl.value = editorText;\n }\n\n return;\n }\n }\n\n rawMode = !rawMode;\n render();\n }\n\n function updateSchemaField(i: number, field: SchemaTextField | SchemaChoiceField, value: string) {\n schemaRows[i][field] = value;\n setDirty(true);\n }\n\n function updateSchemaAdditionalOptions(i: number, text: string) {\n try {\n schemaRows[i].additional_options = text.trim() ? JSON.parse(text) : '';\n invalidAdditionalOptionsRows.delete(schemaRows[i]);\n } catch {\n schemaRows[i].additional_options = text;\n invalidAdditionalOptionsRows.add(schemaRows[i]);\n }\n\n setDirty(true);\n }\n\n function syncAdditionalOptionsRaw(i: number) {\n const ta = byId<HTMLTextAreaElement>('ao-raw-' + i);\n\n if (!ta || ta.disabled) {\n return;\n }\n\n const value = schemaRows[i].additional_options;\n\n ta.value = value !== undefined && value !== '' ? JSON.stringify(value) : '';\n }\n\n function commitListColumns(i: number, columns: ListColumn[], rerender: boolean) {\n const normalized = columns.map(normalizeListColumn);\n\n schemaRows[i].additional_options = normalized.length ? normalized : '';\n invalidAdditionalOptionsRows.delete(schemaRows[i]);\n setDirty(true);\n\n if (rerender) {\n rerenderKeepingAdvancedOpen(i);\n } else {\n syncAdditionalOptionsRaw(i);\n }\n }\n\n function addListColumn(i: number) {\n const cols = listColumnsFor(schemaRows[i]);\n\n cols.push({ name: '', type: 'textarea' });\n commitListColumns(i, cols, true);\n }\n\n function removeListColumn(i: number, colIndex: number) {\n const cols = listColumnsFor(schemaRows[i]);\n\n cols.splice(colIndex, 1);\n commitListColumns(i, cols, true);\n }\n\n let listColumnDrag: { row: number; fromIndex: number } | null = null;\n\n function onListColumnDragStart(ev: DragEvent) {\n const col = (ev.target as Element).closest<HTMLElement>('.ve-ao-column');\n\n if (!col) {\n return;\n }\n\n listColumnDrag = {\n row: Number(col.dataset.row),\n fromIndex: Number(col.dataset.colIndex),\n };\n col.classList.add('is-dragging');\n ev.dataTransfer!.effectAllowed = 'move';\n // Firefox requires setData for the drag to start.\n ev.dataTransfer!.setData('text/plain', String(listColumnDrag.fromIndex));\n }\n\n function onListColumnDragOver(ev: DragEvent, col: HTMLElement) {\n // Schema-row reordering can pass over list-column cards inside an open advanced panel —\n // accept the drag here so the drop isn't blocked by nested handlers.\n if (schemaRowDrag) {\n ev.preventDefault();\n ev.dataTransfer!.dropEffect = 'move';\n\n const details = col.closest('tr.details-row');\n\n if (details) {\n details.classList.add('is-drop-target');\n }\n\n return;\n }\n\n if (!listColumnDrag) {\n return;\n }\n\n if (Number(col.dataset.row) !== listColumnDrag.row) {\n return;\n }\n\n ev.preventDefault();\n ev.dataTransfer!.dropEffect = 'move';\n col.classList.add('is-drop-target');\n }\n\n function onListColumnDragLeave(ev: DragEvent, col: HTMLElement) {\n const related = ev.relatedTarget as Node | null;\n\n // Ignore leave events that stay inside the same column card (child elements).\n if (col.contains(related)) {\n return;\n }\n\n col.classList.remove('is-drop-target');\n\n if (schemaRowDrag) {\n const details = col.closest('tr.details-row');\n\n if (details && !details.contains(related)) {\n details.classList.remove('is-drop-target');\n }\n }\n }\n\n function onListColumnDrop(ev: DragEvent, col: HTMLElement) {\n ev.preventDefault();\n\n col.classList.remove('is-drop-target');\n\n if (schemaRowDrag) {\n const details = col.closest<HTMLElement>('tr.details-row');\n\n if (!details) {\n return;\n }\n\n details.classList.remove('is-drop-target');\n\n const toIndex = Number(details.dataset.rowIndex);\n const fromIndex = schemaRowDrag.fromIndex;\n\n schemaRowDrag = null;\n\n if (fromIndex !== toIndex) {\n reorderSchemaRow(fromIndex, toIndex);\n }\n\n return;\n }\n\n if (!listColumnDrag || Number(col.dataset.row) !== listColumnDrag.row) {\n return;\n }\n\n const toIndex = Number(col.dataset.colIndex);\n const fromIndex = listColumnDrag.fromIndex;\n\n listColumnDrag = null;\n\n if (fromIndex === toIndex) {\n return;\n }\n\n reorderListColumn(Number(col.dataset.row), fromIndex, toIndex);\n }\n\n function onListColumnDragEnd() {\n listColumnDrag = null;\n document.querySelectorAll('.ve-ao-column.is-dragging, .ve-ao-column.is-drop-target').forEach((el) => {\n el.classList.remove('is-dragging', 'is-drop-target');\n });\n }\n\n function reorderListColumn(i: number, fromIndex: number, toIndex: number) {\n const cols = listColumnsFor(schemaRows[i]);\n\n if (fromIndex < 0 || fromIndex >= cols.length || toIndex < 0 || toIndex >= cols.length) {\n return;\n }\n\n const moved = cols.splice(fromIndex, 1)[0];\n\n cols.splice(toIndex, 0, moved);\n commitListColumns(i, cols, true);\n }\n\n function updateListColumnField(i: number, colIndex: number, field: 'name' | 'type' | 'source', value: string) {\n const cols = listColumnsFor(schemaRows[i]);\n const col: ListColumn = Object.assign({ name: '', type: 'textarea' }, cols[colIndex]);\n\n if (field === 'name') {\n col.name = value;\n } else if (field === 'type') {\n col.type = value;\n\n if (value !== 'select' && value !== 'multi-select') {\n delete col.source;\n delete col.options;\n } else if (Array.isArray(col.options) && col.options.length) {\n delete col.source;\n } else if (!col.source) {\n col.source = 'static';\n }\n } else if (field === 'source') {\n col.source = value;\n\n if (value !== 'static') {\n delete col.options;\n }\n }\n\n cols[colIndex] = col;\n commitListColumns(i, cols, field === 'type' || field === 'source');\n }\n\n function updateListColumnOptions(i: number, colIndex: number, text: string) {\n const cols = listColumnsFor(schemaRows[i]);\n const col: ListColumn = Object.assign({ name: '', type: 'textarea' }, cols[colIndex]);\n const options = text\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n\n if (options.length) {\n col.options = options;\n delete col.source;\n } else {\n delete col.options;\n\n if (!col.source) {\n col.source = 'static';\n }\n }\n\n cols[colIndex] = col;\n commitListColumns(i, cols, false);\n }\n\n function toggleSchemaAdvanced(i: number) {\n const row = byId('advanced-' + i)!;\n const btn = byId('expand-btn-' + i);\n const nowOpen = row.style.display === 'none';\n\n row.style.display = nowOpen ? '' : 'none';\n\n if (btn) {\n btn.textContent = nowOpen ? '▾' : '▸';\n btn.setAttribute('aria-expanded', String(nowOpen));\n }\n }\n\n function addSchemaRow() {\n const uid = newUid();\n\n schemaState!.exists = true;\n schemaRows.push({\n name: 'new_variable_' + (schemaRows.length + 1),\n uid: uid,\n tag_type: 'text',\n tag_source: 'static',\n default_value: '',\n additional_options: '',\n description: '',\n });\n setDirty(true);\n render();\n }\n\n function removeSchemaRow(i: number) {\n const name = (schemaRows[i] && schemaRows[i].name) || '(unnamed)';\n\n showConfirmModal('Delete variable \"' + name + '\"? This only takes effect once you Save.', () => {\n schemaRows.splice(i, 1);\n setDirty(true);\n render();\n });\n }\n\n function schemaRowOpenKey(tag: SchemaTag, i: number): string {\n return tag && tag.uid ? String(tag.uid) : tag && tag.name ? 'name:' + tag.name : 'idx:' + i;\n }\n\n function collectOpenAdvancedKeys(): string[] {\n const open: string[] = [];\n\n schemaRows.forEach((tag, i) => {\n const el = byId('advanced-' + i);\n\n if (el && el.style.display !== 'none') {\n open.push(schemaRowOpenKey(tag, i));\n }\n });\n\n return open;\n }\n\n function restoreOpenAdvancedKeys(openKeys: string[]) {\n if (!openKeys || !openKeys.length) {\n return;\n }\n\n schemaRows.forEach((tag, i) => {\n if (openKeys.indexOf(schemaRowOpenKey(tag, i)) === -1) {\n return;\n }\n\n const after = byId('advanced-' + i);\n const btn = byId('expand-btn-' + i);\n\n if (after) {\n after.style.display = '';\n }\n\n if (btn) {\n btn.textContent = '▾';\n btn.setAttribute('aria-expanded', 'true');\n }\n });\n }\n\n let schemaRowDrag: { fromIndex: number } | null = null;\n\n function onSchemaRowDragStart(ev: DragEvent) {\n const row = (ev.target as Element).closest<HTMLElement>('tr.schema-row');\n\n if (!row) {\n return;\n }\n\n const fromIndex = Number(row.dataset.rowIndex);\n\n schemaRowDrag = { fromIndex: fromIndex };\n row.classList.add('is-dragging');\n\n const details = byId('advanced-' + fromIndex);\n\n if (details) {\n details.classList.add('is-dragging');\n }\n\n ev.dataTransfer!.effectAllowed = 'move';\n // Firefox requires setData for the drag to start.\n ev.dataTransfer!.setData('text/plain', String(fromIndex));\n }\n\n function onSchemaRowDragOver(ev: DragEvent, row: HTMLElement) {\n if (!schemaRowDrag) {\n return;\n }\n\n ev.preventDefault();\n ev.dataTransfer!.dropEffect = 'move';\n row.classList.add('is-drop-target');\n }\n\n function onSchemaRowDragLeave(ev: DragEvent, row: HTMLElement) {\n if (row.contains(ev.relatedTarget as Node | null)) {\n return;\n }\n\n row.classList.remove('is-drop-target');\n }\n\n function onSchemaRowDrop(ev: DragEvent, row: HTMLElement) {\n ev.preventDefault();\n\n row.classList.remove('is-drop-target');\n\n if (!schemaRowDrag) {\n return;\n }\n\n const toIndex = Number(row.dataset.rowIndex);\n const fromIndex = schemaRowDrag.fromIndex;\n\n schemaRowDrag = null;\n\n if (fromIndex === toIndex) {\n return;\n }\n\n reorderSchemaRow(fromIndex, toIndex);\n }\n\n function onSchemaRowDragEnd() {\n schemaRowDrag = null;\n document\n .querySelectorAll(\n 'tr.schema-row.is-dragging, tr.schema-row.is-drop-target, tr.details-row.is-dragging, tr.details-row.is-drop-target',\n )\n .forEach((el) => {\n el.classList.remove('is-dragging', 'is-drop-target');\n });\n }\n\n function reorderSchemaRow(fromIndex: number, toIndex: number) {\n if (fromIndex < 0 || fromIndex >= schemaRows.length || toIndex < 0 || toIndex >= schemaRows.length) {\n return;\n }\n\n const openKeys = collectOpenAdvancedKeys();\n const moved = schemaRows.splice(fromIndex, 1)[0];\n\n schemaRows.splice(toIndex, 0, moved);\n setDirty(true);\n render();\n restoreOpenAdvancedKeys(openKeys);\n }\n\n async function saveSchema() {\n if (!schemaState) {\n showBanner('error', 'Cannot save the schema until it has loaded successfully.');\n\n return;\n }\n\n let raw: string;\n const beforeText = jsonBaseline.schema;\n\n if (rawMode) {\n raw = byId<HTMLTextAreaElement>('raw-editor')!.value;\n } else {\n const invalidAdditionalOptionsIndex = schemaRows.findIndex((row) => invalidAdditionalOptionsRows.has(row));\n\n if (invalidAdditionalOptionsIndex !== -1) {\n const tagName = schemaRows[invalidAdditionalOptionsIndex].name || 'row ' + (invalidAdditionalOptionsIndex + 1);\n\n showBanner('error', 'additional_options must be valid JSON for \"' + escapeHtml(tagName) + '\".');\n\n return;\n }\n\n raw = JSON.stringify(Object.assign({}, schemaState.schema, { tags: schemaRows }), null, 2);\n }\n\n if (normalizeJsonText(beforeText) === normalizeJsonText(raw)) {\n setDirty(false);\n showBanner('success', 'No JSON changes to save.');\n\n return;\n }\n\n showJsonDiffModal(beforeText, raw, () => void commitSchemaSave(raw).catch(showSaveError));\n }\n\n // Every way a save can fail ends in a visible error: a lost save must never look like a pending\n // one. The banner leaves the tab as it is (preserveContent), so the unsaved edits, raw JSON drafts\n // included, stay on screen and the tab stays dirty.\n function showSaveError(e: unknown) {\n showBanner('error', 'Save failed: ' + escapeHtml((e instanceof Error && e.message) || String(e)), true);\n }\n\n // PUTs a save and resolves to the server's JSON answer, or shows why the save failed and resolves\n // to null. A response that isn't JSON (Express' HTML error page, a proxy in between) counts as a\n // failure too, also with a 2xx status.\n async function putSave<T extends object>(url: string, body: unknown): Promise<T | null> {\n let r: Response;\n\n try {\n r = await fetch(url, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n } catch (e) {\n showSaveError(e);\n\n return null;\n }\n\n const data = (await r.json().catch(() => null)) as (T & ErrorBody) | null;\n\n if (r.ok && data && typeof data === 'object') {\n return data;\n }\n\n let message =\n (data && data.error) ||\n (r.ok\n ? 'the dev server sent an answer that is not JSON'\n : 'the dev server answered HTTP ' + r.status + (r.statusText ? ' ' + r.statusText : ''));\n\n if (data && data.details) {\n message += ' ' + data.details;\n }\n\n showSaveError(new Error(message));\n\n return null;\n }\n\n // The tab's reload after a save, which the save's own banner outlives: a reload that fails is\n // not a failed save, and says so next to it.\n async function reloadAfterSave(tab: Tab) {\n const saved = banner;\n\n await loadTabData(tab);\n\n if (saved && banner !== saved && banner?.type === 'error') {\n banner = {\n type: 'warning',\n html:\n saved.html +\n '<div>The save went through, but reloading afterwards did not: ' +\n banner.html +\n ' Use ↻ Refresh.</div>',\n };\n }\n\n render();\n }\n\n async function commitSchemaSave(raw: string) {\n const saveEditSeq = editSeq;\n const data = await putSave<SchemaSaveResponse>('/@api/variables/schema', { raw });\n\n if (!data) {\n return;\n }\n\n const warnings = data.warnings || [];\n const hasNewerEdits = editSeq !== saveEditSeq;\n const message = warnings.length\n ? 'Saved, with warning(s):<ul>' + warnings.map((w) => '<li>' + escapeHtml(w) + '</li>').join('') + '</ul>'\n : 'Schema saved.';\n\n if (hasNewerEdits) {\n showBanner('warning', message + '<div>Newer edits remain unsaved.</div>', true);\n\n return;\n }\n\n setDirty(false);\n showBanner(warnings.length ? 'warning' : 'success', message);\n jsonBaseline.schema = raw;\n\n await reloadAfterSave('schema');\n }\n\n // ── Values tab ───────────────────────────────────────────────────────────────\n function onComboFocus(i: number) {\n const list = byId('combo-list-' + i);\n\n if (list) {\n list.style.display = '';\n }\n }\n\n function onComboBlur(i: number) {\n // mousedown+preventDefault() on options already stops most blurs from firing before a pick\n // registers; this is just a safety net for focus leaving for any other reason (e.g. Tab).\n setTimeout(() => {\n const list = byId('combo-list-' + i);\n\n if (list && !stopped) {\n list.style.display = 'none';\n }\n }, 150);\n }\n\n function onComboFilter(i: number, text: string) {\n const list = byId('combo-list-' + i);\n\n if (!list) {\n return;\n }\n\n const needle = text.toLowerCase();\n\n (Array.from(list.children) as HTMLElement[]).forEach((opt) => {\n const hay = (opt.dataset.id + ' ' + opt.dataset.text).toLowerCase();\n\n opt.style.display = hay.indexOf(needle) === -1 ? 'none' : '';\n });\n }\n\n function onSingleComboInput(i: number, text: string) {\n onComboFilter(i, text);\n updateValueField(i, text);\n }\n\n function onComboOptionPick(optEl: HTMLElement) {\n const list = optEl.closest<HTMLElement>('.ve-combo-list')!;\n const i = Number(list.id.replace('combo-list-', ''));\n const id = optEl.dataset.id as string;\n const text = optEl.dataset.text || id;\n const combo = optEl.closest('.ve-combo')!;\n const chipsEl = combo.querySelector<HTMLElement>('.ve-combo-chips');\n const inputEl = combo.querySelector<HTMLInputElement>('.ve-combo-input')!;\n\n if (chipsEl) {\n const already = (Array.from(chipsEl.children) as HTMLElement[]).some((c) => c.dataset.id === id);\n\n if (!already) {\n chipsEl.insertAdjacentHTML('beforeend', chipHtml(id, text));\n }\n\n inputEl.value = '';\n onComboFilter(i, '');\n commitMultiValue(i, chipsEl);\n } else {\n inputEl.value = id;\n updateValueField(i, id);\n list.style.display = 'none';\n }\n }\n\n function onChipRemove(btn: HTMLElement) {\n const chip = btn.closest('.ve-chip')!;\n const chipsEl = chip.parentElement!;\n const i = Number(chipsEl.dataset.row);\n\n chip.remove();\n commitMultiValue(i, chipsEl);\n }\n\n function commitMultiValue(i: number, chipsEl: HTMLElement) {\n const ids = (Array.from(chipsEl.children) as HTMLElement[]).map((c) => c.dataset.id);\n\n updateValueField(i, ids.join(','));\n }\n\n function onListItemSelectChange(i: number, itemIndex: number, fieldName: string, selectEl: HTMLSelectElement) {\n const value = selectEl.multiple\n ? Array.from(selectEl.selectedOptions)\n .map((o) => o.value)\n .join(',')\n : selectEl.value;\n\n updateListItemField(i, itemIndex, fieldName, value);\n }\n\n // `fieldName` is the item's column, `null` for an item of a flat list of strings.\n function updateListItemField(i: number, itemIndex: number, fieldName: string | null, value: string) {\n const items = parseListItems(valueRows[i]) || [];\n\n if (fieldName === null) {\n items[itemIndex] = value;\n } else {\n if (typeof items[itemIndex] !== 'object' || items[itemIndex] === null || Array.isArray(items[itemIndex])) {\n items[itemIndex] = {};\n }\n\n (items[itemIndex] as Record<string, unknown>)[fieldName] = value;\n }\n\n valueRows[i].value = JSON.stringify(items);\n setDirty(true);\n }\n\n function addListItem(i: number) {\n const items = parseListItems(valueRows[i]) || [];\n const config = listConfigFor(schemaTagFor(valuesState, valueRows[i].name));\n\n if (config) {\n const newItem: Record<string, string> = {};\n\n config.forEach((col) => {\n newItem[String(col.name)] = '';\n });\n items.push(newItem);\n } else {\n items.push('');\n }\n\n valueRows[i].value = JSON.stringify(items);\n selectedValueIndex = i;\n setDirty(true);\n render();\n }\n\n function removeListItem(i: number, itemIndex: number) {\n const items = parseListItems(valueRows[i]) || [];\n\n items.splice(itemIndex, 1);\n valueRows[i].value = JSON.stringify(items);\n selectedValueIndex = i;\n setDirty(true);\n render();\n }\n\n let listItemDrag: { valueIndex: number; fromIndex: number } | null = null;\n\n function onListItemDragStart(ev: DragEvent) {\n const item = (ev.target as Element).closest<HTMLElement>('.ve-values-list-item');\n\n if (!item) {\n return;\n }\n\n listItemDrag = {\n valueIndex: Number(item.dataset.valueIndex),\n fromIndex: Number(item.dataset.itemIndex),\n };\n item.classList.add('is-dragging');\n ev.dataTransfer!.effectAllowed = 'move';\n // Firefox requires setData for the drag to start.\n ev.dataTransfer!.setData('text/plain', String(listItemDrag.fromIndex));\n }\n\n function onListItemDragOver(ev: DragEvent, item: HTMLElement) {\n if (!listItemDrag) {\n return;\n }\n\n if (Number(item.dataset.valueIndex) !== listItemDrag.valueIndex) {\n return;\n }\n\n ev.preventDefault();\n ev.dataTransfer!.dropEffect = 'move';\n item.classList.add('is-drop-target');\n }\n\n function onListItemDragLeave(ev: DragEvent, item: HTMLElement) {\n // Ignore leave events that stay inside the same item card (child elements).\n if (item.contains(ev.relatedTarget as Node | null)) {\n return;\n }\n\n item.classList.remove('is-drop-target');\n }\n\n function onListItemDrop(ev: DragEvent, item: HTMLElement) {\n ev.preventDefault();\n\n item.classList.remove('is-drop-target');\n\n if (!listItemDrag || Number(item.dataset.valueIndex) !== listItemDrag.valueIndex) {\n return;\n }\n\n const toIndex = Number(item.dataset.itemIndex);\n const fromIndex = listItemDrag.fromIndex;\n\n listItemDrag = null;\n\n if (fromIndex === toIndex) {\n return;\n }\n\n reorderListItem(Number(item.dataset.valueIndex), fromIndex, toIndex);\n }\n\n function onListItemDragEnd() {\n listItemDrag = null;\n document.querySelectorAll('.ve-values-list-item.is-dragging, .ve-values-list-item.is-drop-target').forEach((el) => {\n el.classList.remove('is-dragging', 'is-drop-target');\n });\n }\n\n function reorderListItem(i: number, fromIndex: number, toIndex: number) {\n const items = parseListItems(valueRows[i]) || [];\n\n if (fromIndex < 0 || fromIndex >= items.length || toIndex < 0 || toIndex >= items.length) {\n return;\n }\n\n const moved = items.splice(fromIndex, 1)[0];\n\n items.splice(toIndex, 0, moved);\n valueRows[i].value = JSON.stringify(items);\n selectedValueIndex = i;\n setDirty(true);\n render();\n }\n\n function refreshValuesJsonIssues() {\n const editorEl = byId<HTMLTextAreaElement>('values-raw-editor');\n const issuesEl = byId('values-raw-issues');\n\n if (!editorEl || !issuesEl) {\n return;\n }\n\n issuesEl.innerHTML = renderJsonIssuesBar(editorEl.value, valuesState);\n }\n\n let valuesRawIssuesTimer: ReturnType<typeof setTimeout> | null = null;\n\n function onValuesRawInput() {\n setDirty(true);\n\n if (valuesRawIssuesTimer) {\n clearTimeout(valuesRawIssuesTimer);\n }\n\n valuesRawIssuesTimer = setTimeout(refreshValuesJsonIssues, 300);\n }\n\n function downloadValuesJson() {\n const editorEl = byId<HTMLTextAreaElement>('values-raw-editor');\n const text = editorEl ? editorEl.value : JSON.stringify(toExportableValueRows(valueRows, valuesState), null, 2);\n const blob = new Blob([text], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n\n a.href = url;\n a.download = 'page-variables.json';\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n }\n\n function triggerImportValuesJson() {\n byId('import-values-file')!.click();\n }\n\n function onImportValuesFile(inputEl: HTMLInputElement) {\n const file = inputEl.files?.[0];\n\n if (!file) {\n return;\n }\n\n const reader = new FileReader();\n\n reader.onload = () => {\n const editorEl = byId<HTMLTextAreaElement>('values-raw-editor');\n\n if (editorEl) {\n editorEl.value = String(reader.result || '');\n setDirty(true);\n refreshValuesJsonIssues();\n }\n };\n\n reader.readAsText(file);\n inputEl.value = '';\n }\n\n function updateValueNavActive(i: number) {\n document\n .querySelectorAll<HTMLElement>('.ve-values-nav-list .ve-values-nav-item[data-value-index]')\n .forEach((el) => {\n const active = Number(el.dataset.valueIndex) === i;\n\n el.classList.toggle('is-active', active);\n\n if (active) {\n el.scrollIntoView({ block: 'nearest' });\n }\n });\n document.querySelectorAll<HTMLElement>('.ve-values-anchor[data-value-index]').forEach((el) => {\n el.classList.toggle('is-active', Number(el.dataset.valueIndex) === i);\n });\n }\n\n function scrollToValueRow(i: number, smooth: boolean) {\n const detail = document.querySelector<HTMLElement>('.ve-values-detail');\n const target = byId('value-item-' + i);\n\n if (!detail || !target || typeof detail.scrollTo !== 'function') {\n return;\n }\n\n const top = target.getBoundingClientRect().top - detail.getBoundingClientRect().top + detail.scrollTop;\n\n detail.scrollTo({ top: Math.max(0, top - 8), behavior: smooth ? 'smooth' : 'auto' });\n }\n\n let valueNavScrollLock = false;\n let valueNavScrollLockTimer: ReturnType<typeof setTimeout> | null = null;\n\n function selectValueRow(i: number) {\n selectedValueIndex = i;\n updateValueNavActive(i);\n valueNavScrollLock = true;\n\n if (valueNavScrollLockTimer) {\n clearTimeout(valueNavScrollLockTimer);\n }\n\n scrollToValueRow(i, true);\n valueNavScrollLockTimer = setTimeout(function () {\n valueNavScrollLock = false;\n valueNavScrollLockTimer = null;\n }, 500);\n }\n\n function syncValueNavFromScroll() {\n if (valueNavScrollLock) {\n return;\n }\n\n const detail = document.querySelector<HTMLElement>('.ve-values-detail');\n\n if (!detail) {\n return;\n }\n\n const anchors = detail.querySelectorAll<HTMLElement>('.ve-values-anchor[data-value-index]');\n\n if (!anchors.length) {\n return;\n }\n\n const nearBottom = detail.scrollTop + detail.clientHeight >= detail.scrollHeight - 4;\n let current: number;\n\n if (nearBottom) {\n current = Number(anchors[anchors.length - 1].dataset.valueIndex);\n } else {\n const threshold = detail.getBoundingClientRect().top + 24;\n\n current = Number(anchors[0].dataset.valueIndex) || 0;\n anchors.forEach(function (el) {\n if (el.getBoundingClientRect().top <= threshold) {\n current = Number(el.dataset.valueIndex);\n }\n });\n }\n\n if (current !== selectedValueIndex) {\n selectedValueIndex = current;\n updateValueNavActive(current);\n }\n }\n\n function bindValuesDetailScroll() {\n const detail = document.querySelector<HTMLElement>('.ve-values-detail');\n\n if (!detail || detail.dataset.scrollBound === '1') {\n return;\n }\n\n detail.dataset.scrollBound = '1';\n detail.addEventListener('scroll', syncValueNavFromScroll, { passive: true });\n }\n\n function renderValuesTab(): string {\n if (valuesState && !valuesRawMode && valueRows.length) {\n if (selectedValueIndex < 0 || selectedValueIndex >= valueRows.length) {\n selectedValueIndex = 0;\n }\n }\n\n return renderValuesTabHtml(valuesState, valueRows, valuesRawMode, selectedValueIndex);\n }\n\n function toggleValuesRawMode() {\n if (valuesRawMode) {\n // Leaving raw mode: try to parse back into rows; keep raw mode on failure. The value field\n // may be a native JSON array (list-type) as well as a plain string — see toExportableValueRows().\n const editorEl = byId<HTMLTextAreaElement>('values-raw-editor');\n const editorText = editorEl ? editorEl.value : JSON.stringify(toExportableValueRows(valueRows, valuesState));\n\n try {\n const parsed: unknown = JSON.parse(editorText);\n\n if (\n !Array.isArray(parsed) ||\n (parsed as unknown[]).some((e) => {\n const entry = e as Partial<ExportableValueRow> | null;\n\n return (\n typeof entry !== 'object' ||\n entry === null ||\n typeof entry.name !== 'string' ||\n entry.value === undefined ||\n entry.value === null\n );\n })\n ) {\n throw new Error('Must be an array of { name, value } entries with non-empty names and a defined value.');\n }\n\n valueRows = fromExportableValueRows(parsed as ExportableValueRow[]);\n } catch (e) {\n // showBanner() re-renders, which would otherwise regenerate this textarea from the last\n // known-good valueRows — put the user's (still-broken) text back afterward so their\n // in-progress edit isn't silently discarded.\n showBanner('error', 'Cannot switch to table view: ' + escapeHtml(errorMessage(e)));\n\n const freshEditorEl = byId<HTMLTextAreaElement>('values-raw-editor');\n\n if (freshEditorEl) {\n freshEditorEl.value = editorText;\n }\n\n return;\n }\n }\n\n valuesRawMode = !valuesRawMode;\n setUrlState(activeTab, valuesRawMode);\n render();\n }\n\n function updateValueField(i: number, value: string) {\n valueRows[i].value = value;\n setDirty(true);\n }\n\n // ── Values tab: \"Import from page…\" ─────────────────────────────────────────\n // Two-step flow, both steps rendered into the same overlay element (only its innerHTML swaps)\n // so the outer overlay's click-outside/Escape handlers, bound once here, keep working through\n // \"← Back\". Nothing is written to MI until the user then hits the regular Save button.\n function openImportValuesModal() {\n closeImportModal();\n\n const overlay = document.createElement('div');\n\n overlay.className = 've-modal-overlay';\n overlay.id = 've-import-overlay';\n\n overlay.addEventListener('click', (ev) => {\n if (ev.target === overlay) {\n closeImportModal();\n }\n });\n overlay.addEventListener('keydown', (ev) => {\n if (ev.key === 'Escape') {\n ev.preventDefault();\n closeImportModal();\n }\n });\n\n document.body.appendChild(overlay);\n void renderImportPickerStep(overlay);\n }\n\n function closeImportModal() {\n const overlay = byId('ve-import-overlay');\n\n if (overlay) {\n overlay.remove();\n }\n }\n\n function backToImportPicker() {\n const overlay = byId('ve-import-overlay');\n\n if (overlay) {\n void renderImportPickerStep(overlay);\n }\n }\n\n async function renderImportPickerStep(overlay: HTMLElement) {\n overlay.innerHTML = importPickerStepHtml();\n\n let r: Response;\n\n try {\n r = await fetch('/@api/variables/pages');\n } catch (e) {\n setImportBodyError(overlay, errorMessage(e));\n\n return;\n }\n\n const data = (await r.json().catch(() => ({}))) as PagesResponse;\n\n if (stopped || !overlay.isConnected) {\n return;\n }\n\n if (!r.ok) {\n setImportBodyError(overlay, data.error || 'Failed to load the page list.');\n\n return;\n }\n\n const bodyEl = overlay.querySelector('.ve-modal-body');\n\n if (!bodyEl) {\n return;\n }\n\n bodyEl.innerHTML = importPickerBodyHtml(data.pages || []);\n\n const filterEl = byId('ve-import-filter');\n\n if (filterEl) {\n filterEl.focus();\n }\n }\n\n function setImportBodyError(overlay: HTMLElement, message: string) {\n if (stopped || !overlay.isConnected) {\n return;\n }\n\n const bodyEl = overlay.querySelector('.ve-modal-body');\n\n if (bodyEl) {\n bodyEl.innerHTML = importErrorHtml(message);\n }\n }\n\n function filterImportPages(text: string) {\n const needle = text.trim().toLowerCase();\n let visible = 0;\n\n document.querySelectorAll<HTMLElement>('.ve-import-page-row').forEach(function (row) {\n const match = !needle || (row.dataset.search as string).indexOf(needle) !== -1;\n\n row.style.display = match ? '' : 'none';\n\n if (match) {\n visible++;\n }\n });\n\n document.querySelectorAll<HTMLElement>('.ve-import-page-group').forEach(function (group) {\n const anyVisible = Array.from(group.querySelectorAll<HTMLElement>('.ve-import-page-row')).some(function (row) {\n return row.style.display !== 'none';\n });\n\n group.style.display = anyVisible ? '' : 'none';\n });\n\n const emptyEl = byId('ve-import-page-empty');\n\n if (emptyEl) {\n emptyEl.style.display = visible === 0 ? '' : 'none';\n }\n }\n\n async function selectImportSourcePage(pageId: string, pageName: string) {\n const overlay = byId('ve-import-overlay');\n\n if (!overlay) {\n return;\n }\n\n overlay.dataset.sourcePageId = String(pageId);\n overlay.innerHTML = importReviewStepHtml(pageName);\n\n let r: Response;\n\n try {\n r = await fetch('/@api/variables/import-plan/' + pageId);\n } catch (e) {\n setImportBodyError(overlay, errorMessage(e));\n\n return;\n }\n\n const data = (await r.json().catch(() => ({}))) as ImportPlan;\n\n // A newer pick (or Back) landed before this one resolved — drop the stale response.\n if (stopped || !overlay.isConnected || overlay.dataset.sourcePageId !== String(pageId)) {\n return;\n }\n\n if (!r.ok) {\n setImportBodyError(overlay, data.error || 'Failed to load values from this page.');\n\n return;\n }\n\n const bodyEl = overlay.querySelector('.ve-modal-body');\n const actionsEl = overlay.querySelector('#ve-import-actions');\n\n if (!bodyEl || !actionsEl) {\n return;\n }\n\n importReviewCandidates = data.importable || [];\n importReviewPageName = pageName;\n\n bodyEl.innerHTML = importReviewBodyHtml(data);\n actionsEl.innerHTML = importReviewActionsHtml(data);\n\n const applyBtn = byId('ve-import-apply-btn');\n\n if (applyBtn) {\n applyBtn.focus();\n }\n }\n\n function toggleImportAll(checked: boolean) {\n document.querySelectorAll<HTMLInputElement>('.ve-import-check').forEach(function (c) {\n c.checked = checked;\n });\n updateImportCount();\n }\n\n function updateImportCount() {\n const checks = document.querySelectorAll('.ve-import-check');\n const checkedCount = document.querySelectorAll('.ve-import-check:checked').length;\n const countEl = byId('ve-import-count');\n const selectAllEl = byId<HTMLInputElement>('ve-import-select-all');\n const applyBtn = byId<HTMLButtonElement>('ve-import-apply-btn');\n\n if (countEl) {\n countEl.textContent = checkedCount + ' of ' + checks.length + ' selected';\n }\n\n if (selectAllEl) {\n selectAllEl.checked = checkedCount === checks.length;\n }\n\n if (applyBtn) {\n applyBtn.textContent = 'Apply ' + checkedCount + ' selected';\n applyBtn.disabled = checkedCount === 0;\n }\n }\n\n function applyImportPlan() {\n const checkedIndexes = Array.from(document.querySelectorAll<HTMLInputElement>('.ve-import-check:checked')).map(\n function (c) {\n return Number(c.dataset.index);\n },\n );\n\n let applied = 0;\n\n checkedIndexes.forEach((idx) => {\n const candidate = importReviewCandidates[idx];\n\n if (!candidate) {\n return;\n }\n\n const row = valueRows.find((r) => r.name === candidate.name);\n\n if (!row) {\n return;\n }\n\n row.value = candidate.sourceValue;\n applied++;\n });\n\n const total = importReviewCandidates.length;\n const pageName = importReviewPageName;\n\n closeImportModal();\n\n if (!applied) {\n return;\n }\n\n setDirty(true);\n showBanner(\n 'success',\n 'Imported ' + applied + ' of ' + total + ' variable(s) from \"' + escapeHtml(pageName) + '\". Save to apply.',\n );\n }\n\n function addValueRow() {\n showCustomValueModal('Variable name', '', (entered) => {\n const name = (entered || '').trim();\n\n if (!name) {\n return;\n }\n\n // MI keeps one value per name: a second row of that name would lose one of the two on save.\n if (valueRows.some((row) => row.name === name)) {\n showBanner('error', 'A variable named \"' + escapeHtml(name) + '\" is in the list already.');\n\n return;\n }\n\n valueRows.push({ name, value: '' });\n selectedValueIndex = valueRows.length - 1;\n setDirty(true);\n render();\n });\n }\n\n function removeValueRow(i: number) {\n const name = (valueRows[i] && valueRows[i].name) || '(unnamed)';\n\n showConfirmModal('Delete variable \"' + name + '\"? This only takes effect once you Save.', () => {\n valueRows.splice(i, 1);\n selectedValueIndex = Math.min(i, Math.max(0, valueRows.length - 1));\n setDirty(true);\n render();\n });\n }\n\n async function saveValues() {\n if (!valuesState) {\n showBanner('error', 'Cannot save values until live variables have loaded successfully.');\n\n return;\n }\n\n let tags = valueRows;\n const beforeText = jsonBaseline.values;\n\n if (valuesRawMode) {\n try {\n // The textarea may contain native JSON arrays for list-type values (see\n // toExportableValueRows()) — convert back to MI's plain-string form before sending.\n tags = fromExportableValueRows(\n JSON.parse(byId<HTMLTextAreaElement>('values-raw-editor')!.value) as ExportableValueRow[],\n );\n } catch (e) {\n showBanner('error', 'Raw JSON is not valid: ' + escapeHtml(errorMessage(e)));\n\n return;\n }\n }\n\n const afterText = snapshotValuesJson(tags);\n\n if (normalizeJsonText(beforeText) === normalizeJsonText(afterText)) {\n setDirty(false);\n showBanner('success', 'No JSON changes to save.');\n\n return;\n }\n\n showJsonDiffModal(beforeText, afterText, () => void commitValuesSave(tags, afterText).catch(showSaveError));\n }\n\n async function commitValuesSave(tags: ValueRow[], afterText: string) {\n const saveEditSeq = editSeq;\n const data = await putSave<ValuesSaveResponse>('/@api/variables/values', { tags });\n\n if (!data) {\n return;\n }\n\n const warnings = data.warnings || [];\n const hasNewerEdits = editSeq !== saveEditSeq;\n // The local pages are updated with the save; if that failed, the floating button offers it again.\n const localNote = data.localError\n ? '<div>The local pages still show the old values: ' +\n escapeHtml(data.localError) +\n '. Use <b>Update local pages</b>.</div>'\n : '';\n const message =\n (warnings.length\n ? 'Saved, with warning(s):<ul>' +\n warnings.map((w) => '<li>' + escapeHtml(w.message) + '</li>').join('') +\n '</ul>'\n : 'Values saved.') + localNote;\n\n // MI holds the saved values now, and the local pages what the save updated them to: compare\n // those, also when newer edits keep the tab from reloading below.\n if (valuesState) {\n valuesState.live = tags.map((t) => ({ name: t.name, value: t.value }));\n\n if (data.local !== undefined) {\n valuesState.local = data.local;\n }\n }\n\n renderLocalUpdateButton();\n\n if (hasNewerEdits) {\n showBanner('warning', message + '<div>Newer edits remain unsaved.</div>', true);\n\n return;\n }\n\n setDirty(false);\n showBanner(warnings.length ? 'warning' : 'success', message);\n jsonBaseline.values = afterText;\n\n await reloadAfterSave('values');\n }\n\n function save() {\n (activeTab === 'schema' ? saveSchema() : saveValues()).catch(showSaveError);\n }\n\n // ── Local pages ──────────────────────────────────────────────────────────────\n // The dev server substitutes page variables into the pages it serves (to every user) from its own\n // copy, loaded from MI with the page data. A save updates it; a change made in MI itself doesn't,\n // so the Values tab compares that copy with MI and offers to update it.\n function localDifferences(): { name: string; local: string | undefined; live: string | undefined }[] {\n if (!valuesState || !Array.isArray(valuesState.local) || !Array.isArray(valuesState.live)) {\n return [];\n }\n\n // A missing variable differs from an empty one: the page keeps a missing one's [VarName] as is,\n // and drops an empty one's.\n const local = new Map(valuesState.local.map((e) => [e.name, String(e.value ?? '')]));\n const live = new Map(valuesState.live.map((e) => [e.name, String(e.value ?? '')]));\n const names = Array.from(new Set([...local.keys(), ...live.keys()]));\n\n return names\n .filter((name) => local.get(name) !== live.get(name))\n .map((name) => ({ name, local: local.get(name), live: live.get(name) }));\n }\n\n function shortValue(value: string | undefined): string {\n if (value === undefined) {\n return '(missing)';\n }\n\n if (!value) {\n return '(empty)';\n }\n\n return value.length > 40 ? value.slice(0, 40) + '…' : value;\n }\n\n function renderLocalUpdateButton() {\n const btn = byId<HTMLButtonElement>('local-update-btn');\n\n if (!btn || stopped) {\n return;\n }\n\n const diffs = activeTab === 'values' ? localDifferences() : [];\n\n btn.hidden = diffs.length === 0;\n\n if (!diffs.length) {\n return;\n }\n\n const lineBreak = String.fromCharCode(10);\n\n btn.textContent = 'Update local pages · ' + diffs.length;\n btn.title = ['The local dev server still shows older values (local → MI):']\n .concat(diffs.map((d) => d.name + ': ' + shortValue(d.local) + ' → ' + shortValue(d.live)))\n .join(lineBreak);\n }\n\n async function updateLocalValues() {\n const btn = byId<HTMLButtonElement>('local-update-btn')!;\n\n btn.disabled = true;\n\n try {\n const r = await fetch('/@api/variables/values/local', { method: 'POST' });\n const data = (await r.json().catch(() => ({}))) as LocalValuesResponse;\n\n // The banners leave the tab as it is (preserveContent): an unsaved draft, raw JSON included,\n // must survive updating the local pages.\n if (!r.ok) {\n showBanner(\n 'error',\n escapeHtml(data.error || 'Failed to update the local values.') +\n (data.details ? ' ' + escapeHtml(data.details) : ''),\n true,\n );\n\n return;\n }\n\n if (valuesState) {\n // Just reloaded from MI: they are MI's latest values too, as far as the comparison goes.\n valuesState.local = data.local;\n valuesState.live = data.local as ValuesState['live'];\n }\n\n showBanner('success', 'Local pages updated: every tab shows the new values once reloaded.', true);\n } catch (e) {\n showBanner('error', 'Failed to update the local values: ' + escapeHtml(errorMessage(e)), true);\n } finally {\n if (!stopped) {\n btn.disabled = false;\n }\n\n renderLocalUpdateButton();\n }\n }\n\n // ── Render ───────────────────────────────────────────────────────────────────\n function render() {\n if (stopped) {\n return;\n }\n\n const bannerHtml = banner ? '<div class=\"banner banner-' + banner.type + '\">' + banner.html + '</div>' : '';\n\n contentEl.innerHTML =\n bannerHtml + (activeTab === 'schema' ? renderSchemaTabHtml(schemaState, rawMode, schemaRows) : renderValuesTab());\n autosizeAllCellTextareas();\n renderLocalUpdateButton();\n\n if (activeTab === 'values' && !valuesRawMode) {\n bindValuesDetailScroll();\n scrollToValueRow(selectedValueIndex, false);\n }\n\n if (activeTab === 'values' && valuesRawMode) {\n refreshValuesJsonIssues();\n }\n\n updateLoadingIndicator();\n }\n\n // The \"Refreshing…\" dot, shown only over cached content already on screen underneath it —\n // when there is none (state is still null), renderSkeleton() is the loading signal.\n function updateLoadingIndicator() {\n const loadingEl = byId('loading-indicator');\n\n if (!loadingEl) {\n return;\n }\n\n const stateForTab = activeTab === 'schema' ? schemaState : valuesState;\n const isLoading = activeTab === 'schema' ? schemaLoading : valuesLoading;\n\n loadingEl.style.display = isLoading && stateForTab ? '' : 'none';\n }\n\n // ── Events ───────────────────────────────────────────────────────────────────\n // One listener per event type for the whole page — the toolbar, the tab's content and the\n // import dialog. Controls carry `data-action` and what it acts on: `data-index` (the variable's\n // row), `data-col` (a list column), `data-item` (a list item), `data-column` (a list item's\n // field, none for a flat list), `data-field`; `data-autosize` on a textarea/select also resizes\n // it to its content. Drag handles carry `data-drag`, drop targets `data-drop`.\n const actionTarget = (event: Event) =>\n event.target instanceof Element ? event.target.closest<HTMLElement>('[data-action]') : null;\n const index = (el: HTMLElement) => Number(el.dataset.index);\n const col = (el: HTMLElement) => Number(el.dataset.col);\n const item = (el: HTMLElement) => Number(el.dataset.item);\n const field = <T extends string>(el: HTMLElement) => el.dataset.field as T;\n const checked = (el: HTMLElement) => (el as HTMLInputElement).checked;\n\n const clickActions: Record<string, (el: HTMLElement) => void> = {\n 'switch-tab': (el) => switchTab(el.dataset.tab as Tab),\n refresh: () => refresh(),\n save: () => save(),\n 'update-local-values': () => void updateLocalValues(),\n 'toggle-raw-mode': () => toggleRawMode(),\n 'add-schema-row': () => addSchemaRow(),\n 'toggle-schema-advanced': (el) => toggleSchemaAdvanced(index(el)),\n 'remove-schema-row': (el) => removeSchemaRow(index(el)),\n 'show-additional-options-help': (el) => showAdditionalOptionsHelp(index(el)),\n 'show-list-columns-help': () => showInfoModal('additional_options — list', LIST_COLUMNS_HELP_HTML),\n 'add-list-column': (el) => addListColumn(index(el)),\n 'remove-list-column': (el) => removeListColumn(index(el), col(el)),\n 'toggle-values-raw-mode': () => toggleValuesRawMode(),\n 'download-values-json': () => downloadValuesJson(),\n 'import-values-json': () => triggerImportValuesJson(),\n 'open-import-modal': () => openImportValuesModal(),\n 'add-value-row': () => addValueRow(),\n 'select-value-row': (el) => selectValueRow(Number(el.dataset.valueIndex)),\n 'remove-value-row': (el) => removeValueRow(index(el)),\n 'remove-chip': (el) => onChipRemove(el),\n 'add-list-item': (el) => addListItem(index(el)),\n 'remove-list-item': (el) => removeListItem(index(el), item(el)),\n 'close-import-modal': () => closeImportModal(),\n 'back-to-import-picker': () => backToImportPicker(),\n 'select-import-page': (el) => void selectImportSourcePage(el.dataset.pageId!, el.dataset.pageName!),\n 'apply-import-plan': () => applyImportPlan(),\n };\n\n const inputActions: Record<string, (el: FieldElement) => void> = {\n 'set-dirty': () => setDirty(true),\n 'schema-field': (el) => updateSchemaField(index(el), field<SchemaTextField>(el), el.value),\n 'schema-additional-options': (el) => updateSchemaAdditionalOptions(index(el), el.value),\n 'list-column-name': (el) => updateListColumnField(index(el), col(el), 'name', el.value),\n 'list-column-options': (el) => updateListColumnOptions(index(el), col(el), el.value),\n value: (el) => updateValueField(index(el), el.value),\n 'values-raw-input': () => onValuesRawInput(),\n 'combo-filter': (el) => onComboFilter(index(el), el.value),\n 'single-combo': (el) => onSingleComboInput(index(el), el.value),\n 'list-item-field': (el) => updateListItemField(index(el), item(el), el.dataset.column ?? null, el.value),\n 'filter-import-pages': (el) => filterImportPages(el.value),\n };\n\n const changeActions: Record<string, (el: FieldElement) => void> = {\n 'custom-select': (el) => onCustomSelectChange(index(el), el as HTMLSelectElement, field<SchemaChoiceField>(el)),\n 'editor-flag': (el) => updateEditorFlag(index(el), field<EditorFlagField>(el), checked(el)),\n 'list-column-field': (el) => updateListColumnField(index(el), col(el), field<'type' | 'source'>(el), el.value),\n 'value-boolean': (el) => updateValueField(index(el), checked(el) ? 'true' : 'false'),\n 'list-item-select': (el) =>\n onListItemSelectChange(index(el), item(el), el.dataset.column!, el as HTMLSelectElement),\n 'import-values-file': (el) => onImportValuesFile(el as HTMLInputElement),\n 'toggle-import-all': (el) => toggleImportAll(checked(el)),\n 'update-import-count': () => updateImportCount(),\n };\n\n const onClick = (event: MouseEvent) => {\n const el = actionTarget(event);\n\n if (el) {\n clickActions[el.dataset.action!]?.(el);\n }\n };\n\n // Input and change each run only their own actions: a select also fires `input`, a textarea\n // `change` on blur, and those aren't what their handlers listen to.\n const onFieldEvent = (actions: Record<string, (el: FieldElement) => void>) => (event: Event) => {\n const el = actionTarget(event) as FieldElement | null;\n const handler = el && actions[el.dataset.action!];\n\n if (!el || !handler) {\n return;\n }\n\n if (el.dataset.autosize !== undefined) {\n autosizeCellTextarea(el);\n }\n\n handler(el);\n };\n\n // A combobox option is picked, and a chip's ✕ pressed, on mousedown with its default prevented:\n // the combobox's input keeps the focus, so its list doesn't close (blur) before the pick lands.\n const onMouseDown = (event: MouseEvent) => {\n const el = actionTarget(event);\n\n if (el?.dataset.action === 'pick-combo-option') {\n event.preventDefault();\n onComboOptionPick(el);\n } else if (el?.dataset.action === 'remove-chip') {\n event.preventDefault();\n }\n };\n\n // A combobox's option list shows while its input has the focus.\n const comboIndex = (event: FocusEvent) =>\n event.target instanceof HTMLElement && event.target.classList.contains('ve-combo-input')\n ? Number(event.target.dataset.index)\n : null;\n\n const onFocusIn = (event: FocusEvent) => {\n const i = comboIndex(event);\n\n if (i !== null) {\n onComboFocus(i);\n }\n };\n\n const onFocusOut = (event: FocusEvent) => {\n const i = comboIndex(event);\n\n if (i !== null) {\n onComboBlur(i);\n }\n };\n\n const dragHandlers: Record<string, { start: (ev: DragEvent) => void; end: () => void }> = {\n 'schema-row': { start: onSchemaRowDragStart, end: onSchemaRowDragEnd },\n 'list-column': { start: onListColumnDragStart, end: onListColumnDragEnd },\n 'list-item': { start: onListItemDragStart, end: onListItemDragEnd },\n };\n\n type DropHandler = (ev: DragEvent, zone: HTMLElement) => void;\n\n const dropHandlers: Record<string, { over: DropHandler; leave: DropHandler; drop: DropHandler }> = {\n 'schema-row': { over: onSchemaRowDragOver, leave: onSchemaRowDragLeave, drop: onSchemaRowDrop },\n 'list-column': { over: onListColumnDragOver, leave: onListColumnDragLeave, drop: onListColumnDrop },\n 'list-item': { over: onListItemDragOver, leave: onListItemDragLeave, drop: onListItemDrop },\n };\n\n const dragHandle = (event: DragEvent) =>\n event.target instanceof Element ? event.target.closest<HTMLElement>('[data-drag]') : null;\n\n const onDragStart = (event: DragEvent) => {\n const handle = dragHandle(event);\n\n if (handle) {\n dragHandlers[handle.dataset.drag!]?.start(event);\n }\n };\n\n const onDragEnd = (event: DragEvent) => {\n const handle = dragHandle(event);\n\n if (handle) {\n dragHandlers[handle.dataset.drag!]?.end();\n }\n };\n\n // Drop targets nest (a list column's card sits in a schema row's details row), and each has its\n // own handler: they all run, innermost first, as the event bubbles through them. The targets are\n // collected first — a drop re-renders the tab, as when each element had its own listener.\n const onDropZoneEvent = (kind: 'over' | 'leave' | 'drop') => (event: DragEvent) => {\n const zones: HTMLElement[] = [];\n let zone = event.target instanceof Element ? event.target.closest<HTMLElement>('[data-drop]') : null;\n\n while (zone) {\n zones.push(zone);\n zone = zone.parentElement?.closest<HTMLElement>('[data-drop]') ?? null;\n }\n\n for (const target of zones) {\n dropHandlers[target.dataset.drop!]?.[kind](event, target);\n }\n };\n\n const listeners: { [K in keyof DocumentEventMap]?: (event: DocumentEventMap[K]) => void } = {\n click: onClick,\n input: onFieldEvent(inputActions),\n change: onFieldEvent(changeActions),\n mousedown: onMouseDown,\n focusin: onFocusIn,\n focusout: onFocusOut,\n dragstart: onDragStart,\n dragend: onDragEnd,\n dragover: onDropZoneEvent('over'),\n dragleave: onDropZoneEvent('leave'),\n drop: onDropZoneEvent('drop'),\n };\n\n for (const [type, listener] of Object.entries(listeners)) {\n document.addEventListener(type, listener as EventListener);\n }\n\n byId('tab-schema')!.classList.toggle('active', activeTab === 'schema');\n byId('tab-values')!.classList.toggle('active', activeTab === 'values');\n setUrlState(activeTab, valuesRawMode);\n\n // Skeleton first (nothing's cached yet on a fresh page load), then swap in the real content.\n render();\n void loadTabData(activeTab).then(render);\n\n return () => {\n stopped = true;\n window.removeEventListener('beforeunload', onBeforeUnload);\n document.removeEventListener('click', onThemeClick);\n\n for (const [type, listener] of Object.entries(listeners)) {\n document.removeEventListener(type, listener as EventListener);\n }\n\n if (autoLoadTimer) {\n clearTimeout(autoLoadTimer);\n }\n\n if (valuesRawIssuesTimer) {\n clearTimeout(valuesRawIssuesTimer);\n }\n };\n}\n","// Entry of the Variables Editor bundle: its styles and page, built next to it in dist/client.\nimport './variables-editor.scss';\nimport './variables-editor.html';\nimport { startVariablesEditor } from './editor.js';\n\nstartVariablesEditor({ templateLess: document.body.dataset.templateLess === 'true' });\n"],"names":[],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10]}
|