@seliseblocks/mailcraft 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DOCS.md +557 -0
- package/LICENSE +21 -0
- package/README.md +126 -0
- package/dist/mailcraft-editor.bundle.js +519 -0
- package/dist/mailcraft-editor.bundle.js.map +7 -0
- package/examples/templates/activate-your-account.html +54 -0
- package/examples/templates/back-in-stock.html +63 -0
- package/examples/templates/cart-left-behind.html +74 -0
- package/examples/templates/community-giveaway.html +81 -0
- package/examples/templates/frontend-futures-invite.html +69 -0
- package/examples/templates/give-25-get-25.html +69 -0
- package/examples/templates/invoice-paid.html +77 -0
- package/examples/templates/meet-nova-launch.html +69 -0
- package/examples/templates/mega-weekend-sale.html +57 -0
- package/examples/templates/order-confirmed.html +80 -0
- package/examples/templates/rate-your-headphones.html +71 -0
- package/examples/templates/reset-your-password.html +54 -0
- package/examples/templates/thankyou-promo-code.html +68 -0
- package/examples/templates/the-sunday-brief.html +47 -0
- package/examples/templates/welcome-to-your-workspace.html +62 -0
- package/examples/templates/your-order-shipped.html +74 -0
- package/examples/templates/your-password-was-changed.html +58 -0
- package/examples/templates/your-signin-code.html +58 -0
- package/examples/vanilla.html +1574 -0
- package/package.json +66 -0
- package/src/core/accent.js +194 -0
- package/src/core/assets.js +15 -0
- package/src/core/binder.js +119 -0
- package/src/core/blocks.js +256 -0
- package/src/core/css-cascade.js +117 -0
- package/src/core/editor-core.js +1492 -0
- package/src/core/export.js +58 -0
- package/src/core/footer.js +73 -0
- package/src/core/i18n/ar.js +177 -0
- package/src/core/i18n/bg.js +152 -0
- package/src/core/i18n/bn.js +176 -0
- package/src/core/i18n/ca.js +152 -0
- package/src/core/i18n/cs.js +152 -0
- package/src/core/i18n/da.js +152 -0
- package/src/core/i18n/de-CH.js +152 -0
- package/src/core/i18n/de.js +152 -0
- package/src/core/i18n/dz.js +179 -0
- package/src/core/i18n/el.js +152 -0
- package/src/core/i18n/en.js +269 -0
- package/src/core/i18n/es.js +152 -0
- package/src/core/i18n/et.js +152 -0
- package/src/core/i18n/fi.js +152 -0
- package/src/core/i18n/fr.js +152 -0
- package/src/core/i18n/hr.js +152 -0
- package/src/core/i18n/hu.js +152 -0
- package/src/core/i18n/index.js +83 -0
- package/src/core/i18n/it.js +152 -0
- package/src/core/i18n/lt.js +152 -0
- package/src/core/i18n/lv.js +152 -0
- package/src/core/i18n/nb.js +152 -0
- package/src/core/i18n/nl.js +152 -0
- package/src/core/i18n/pl.js +152 -0
- package/src/core/i18n/pt.js +152 -0
- package/src/core/i18n/ro.js +152 -0
- package/src/core/i18n/ru.js +152 -0
- package/src/core/i18n/sk.js +152 -0
- package/src/core/i18n/sl.js +152 -0
- package/src/core/i18n/sv.js +152 -0
- package/src/core/i18n/tables.js +50 -0
- package/src/core/i18n/tr.js +152 -0
- package/src/core/i18n/uk.js +152 -0
- package/src/core/icons.js +235 -0
- package/src/core/ids.js +1 -0
- package/src/core/import-html.js +959 -0
- package/src/core/layout-style.js +115 -0
- package/src/core/parse.js +10 -0
- package/src/core/placeholder.js +15 -0
- package/src/core/sanitize.js +141 -0
- package/src/core/storage-limits.js +184 -0
- package/src/core/storage.js +85 -0
- package/src/core/theme.js +1 -0
- package/src/core/toolbar.js +67 -0
- package/src/core/variables.js +11 -0
- package/src/create-editor.js +109 -0
- package/src/index.js +9 -0
- package/src/mailcraft-editor.js +1862 -0
- package/src/render/block-body.js +295 -0
- package/src/render/canvas.js +284 -0
- package/src/render/fields.js +609 -0
- package/src/render/focus-preserve.js +158 -0
- package/src/render/rte.js +212 -0
- package/src/render/screenshot.js +132 -0
- package/src/render/story.js +415 -0
- package/src/render/style.js +452 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["mailcraft-editor.bundle.js"],
|
|
4
|
+
"sourcesContent": ["// GENERATED by build.js -- do not edit by hand. Re-run `node build.js`.\n(function () {\n var __modules = {};\n var __cache = {};\n function __require(key) {\n if (__cache[key]) return __cache[key].exports;\n var module = { exports: {} };\n __cache[key] = module;\n __modules[key](module, module.exports, __require);\n return module.exports;\n }\n__modules[\"core/accent.js\"] = function(module, exports, __require) {\n/**\n * Host brand color -> the editor's four accent tokens.\n *\n * A host that passes `accent=\"#e11d48\"` means \"make the chrome my brand\",\n * not \"set one variable\": `--ed-accent` alone would leave hover states on the\n * old blue, white text sitting on a pale brand color, and the selection wash\n * tinted the wrong hue. So one input color derives the whole set --\n * `--ed-accent`, `--ed-accent-strong` (hover/active), `--ed-accent-ink` (what\n * is legible *on* the accent) and `--ed-soft` (the tinted wash behind\n * selected rows and active tabs).\n *\n * Two rules do the work, both contrast-driven rather than taste-driven,\n * because the brand color arrives at runtime and nobody gets to eyeball it:\n *\n * 1. The accent has to stay readable against the chrome it sits on -- it is\n * used for text and 1px icon strokes, not just fills. A brand yellow on\n * the light panels, or a brand navy on the dark ones, is darkened or\n * lightened just far enough to clear WCAG AA (4.5:1) and no further, so a\n * brand that already passes is used exactly as given.\n * 2. `--ed-accent-ink` picks white or near-black by whichever wins contrast\n * against the resolved accent, so a label on a filled accent button is\n * never the wrong one for a mid-tone brand.\n *\n * Deliberately DOM-free and pure: the element resolves the attribute down to\n * a color string, this module does the color math -- which keeps the math\n * testable without a document.\n */\n\n/** The chrome the accent has to survive against: `--ed-panel` in each palette (render/style.js). */\nconst LIGHT_BG = { r: 255, g: 255, b: 255 };\nconst DARK_BG = { r: 17, g: 24, b: 39 };\nconst WHITE = { r: 255, g: 255, b: 255 };\n/** Not pure black: near `--ed-text`, so accent buttons don't read harsher than the rest of the UI. */\nconst NEAR_BLACK = { r: 11, g: 17, b: 32 };\n\n/** WCAG AA for normal text. The accent renders as 11-12px labels and hairline icon strokes, so AA is the floor, not a nicety. */\nconst MIN_CONTRAST = 4.5;\n\nconst clamp255 = (n) => Math.max(0, Math.min(255, Math.round(n)));\n\n/** sRGB channel -> linear light, per WCAG's relative-luminance definition. */\nfunction toLinear(channel) {\n const c = channel / 255;\n return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n}\n\nfunction luminance(c) {\n return 0.2126 * toLinear(c.r) + 0.7152 * toLinear(c.g) + 0.0722 * toLinear(c.b);\n}\n\n/** WCAG contrast ratio, 1 (identical) to 21 (black on white). */\nfunction contrast(a, b) {\n const l1 = luminance(a);\n const l2 = luminance(b);\n return (Math.max(l1, l2) + 0.05) / (Math.min(l1, l2) + 0.05);\n}\n\n/** Linear blend, `t` = how far from `a` toward `b`. */\nfunction mix(a, b, t) {\n return {\n r: clamp255(a.r + (b.r - a.r) * t),\n g: clamp255(a.g + (b.g - a.g) * t),\n b: clamp255(a.b + (b.b - a.b) * t),\n };\n}\n\nconst toHex = (c) => '#' + [c.r, c.g, c.b].map((n) => clamp255(n).toString(16).padStart(2, '0')).join('');\n\nconst rgba = (c, alpha) => `rgba(${clamp255(c.r)},${clamp255(c.g)},${clamp255(c.b)},${alpha})`;\n\n/** `hue` in degrees, `s`/`l` as 0..1. Mirrors the CSS hsl() definition so `hsl(340 82% 52%)` lands where a browser would put it. */\nfunction hslToRgb(hue, s, l) {\n const h = (((hue % 360) + 360) % 360) / 60;\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs((h % 2) - 1));\n const m = l - c / 2;\n const [r, g, b] = h < 1 ? [c, x, 0] : h < 2 ? [x, c, 0] : h < 3 ? [0, c, x]\n : h < 4 ? [0, x, c] : h < 5 ? [x, 0, c] : [c, 0, x];\n return { r: clamp255((r + m) * 255), g: clamp255((g + m) * 255), b: clamp255((b + m) * 255) };\n}\n\n/**\n * Parses the color notations a host actually types into an attribute --\n * `#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa`, `rgb()/rgba()` and `hsl()/hsla()`,\n * comma- or space-separated, with or without `%`. Alpha parses but is\n * dropped: the accent is a solid color, and `--ed-soft` owns the translucent\n * tint. Named CSS colors are not resolved here (that needs a browser); the\n * element falls back to a DOM probe for those.\n *\n * @returns {{r:number,g:number,b:number}|null} null when it isn't a color.\n */\nfunction parseColor(value) {\n const raw = String(value == null ? '' : value).trim().toLowerCase();\n if (!raw) return null;\n\n const hex = /^#([0-9a-f]{3,8})$/.exec(raw);\n if (hex) {\n const h = hex[1];\n if (h.length === 3 || h.length === 4) {\n return { r: parseInt(h[0] + h[0], 16), g: parseInt(h[1] + h[1], 16), b: parseInt(h[2] + h[2], 16) };\n }\n if (h.length === 6 || h.length === 8) {\n return { r: parseInt(h.slice(0, 2), 16), g: parseInt(h.slice(2, 4), 16), b: parseInt(h.slice(4, 6), 16) };\n }\n return null;\n }\n\n const fn = /^(rgba?|hsla?)\\(([^)]*)\\)$/.exec(raw);\n if (!fn) return null;\n const parts = fn[2].replace(/\\//g, ' ').split(/[\\s,]+/).filter(Boolean);\n if (parts.length < 3) return null;\n const num = (s) => parseFloat(s);\n let out;\n if (fn[1].startsWith('rgb')) {\n const chan = (s) => (s.endsWith('%') ? (num(s) / 100) * 255 : num(s));\n out = { r: clamp255(chan(parts[0])), g: clamp255(chan(parts[1])), b: clamp255(chan(parts[2])) };\n } else {\n const pct = (v) => (v.endsWith('%') ? num(v) / 100 : num(v));\n const unit = (v) => Math.max(0, Math.min(1, pct(v)));\n out = hslToRgb(num(parts[0]), unit(parts[1]), unit(parts[2]));\n }\n return Number.isNaN(out.r + out.g + out.b) ? null : out;\n}\n\n/**\n * Walks the color toward black (light chrome) or white (dark chrome) until it\n * clears `MIN_CONTRAST` against the panel behind it. Steps are small and it\n * stops at the first passing one, so a brand color that already has enough\n * contrast comes back untouched -- the goal is legibility, not repainting\n * someone's brand.\n */\nfunction fitContrast(color, bg) {\n const toward = luminance(bg) > 0.5 ? NEAR_BLACK : WHITE;\n let out = color;\n for (let step = 1; step <= 20 && contrast(out, bg) < MIN_CONTRAST; step += 1) {\n out = mix(color, toward, step / 20);\n }\n return out;\n}\n\n/** White or near-black, whichever is legible on `bg`. */\nconst inkFor = (bg) => (contrast(bg, WHITE) >= contrast(bg, NEAR_BLACK) ? WHITE : NEAR_BLACK);\n\n/**\n * Every accent token, for one brand color in one chrome.\n *\n * Two families, because the editor paints on two surfaces:\n *\n * --ed-accent* panel chrome (header, inspector, tabs, sliders), which\n * follows the light/dark theme.\n * --ed-accent-sheet* everything drawn *on the email sheet* -- the row grip,\n * the block toolbars, the drop outlines. The sheet is a white\n * page in both themes, so these are always fitted against\n * white; a dark-theme accent light enough to read on the dark\n * panels would disappear on the page.\n *\n * `strong` moves *away* from the surface (darker on light, lighter on dark) so\n * hover always reads as \"more\", the way both built-in palettes behave.\n *\n * @param {{r:number,g:number,b:number}} color parsed brand color\n * @param {string} chrome 'light' | 'dark'\n * @returns {Object} token name -> CSS value\n */\nfunction accentTokens(color, chrome) {\n const dark = chrome === 'dark';\n const base = fitContrast(color, dark ? DARK_BG : LIGHT_BG);\n const strong = dark ? mix(base, WHITE, 0.22) : mix(base, NEAR_BLACK, 0.2);\n // In light chrome the panel *is* white, so the two families coincide and\n // this costs nothing.\n const sheet = dark ? fitContrast(color, LIGHT_BG) : base;\n return {\n '--ed-accent': toHex(base),\n '--ed-accent-strong': toHex(strong),\n '--ed-accent-ink': toHex(inkFor(base)),\n // The lighter stop of the brand mark's gradient -- a highlight, so it\n // moves toward white regardless of chrome.\n '--ed-accent-tint': toHex(mix(base, WHITE, 0.34)),\n // The same alphas the built-in palettes use -- a wash has to stay a hint\n // of color over its surface, not a second surface.\n '--ed-soft': rgba(base, dark ? 0.13 : 0.09),\n '--ed-glow': rgba(base, 0.28),\n // Text selection: heavier than a wash (it has to be visible under type)\n // and heavier still on dark, where the same alpha reads fainter.\n '--ed-select': rgba(base, dark ? 0.3 : 0.22),\n '--ed-accent-sheet': toHex(sheet),\n '--ed-accent-sheet-strong': toHex(mix(sheet, NEAR_BLACK, 0.22)),\n '--ed-accent-sheet-ink': toHex(inkFor(sheet)),\n // Drop-target dashes and hairlines on the page.\n '--ed-accent-sheet-line': rgba(sheet, 0.5),\n };\n}\n\n/** The tokens this module owns, so the element can clear exactly what it set when `accent` goes away. */\nconst ACCENT_VARS = Object.keys(accentTokens({ r: 0, g: 0, b: 0 }, 'light'));\n\nObject.assign(exports, { contrast, toHex, parseColor, accentTokens, ACCENT_VARS });\n\n};\n__modules[\"core/assets.js\"] = function(module, exports, __require) {\nconst {uid} = __require(\"core/ids.js\");\r\nconst {PH} = __require(\"core/placeholder.js\");\r\n\r\nconst FOLDERS = ['All files', 'Brand', 'Product', 'Photography', 'Uploads'];\r\n\r\nconst seedAssets = () => [\r\n { id: uid(), name: 'logo-lockup.png', url: PH('logo lockup', 480, 180), folder: 'Brand', w: 480, ht: 180, size: 18400 },\r\n { id: uid(), name: 'hero-workshop.jpg', url: PH('workshop hero', 600, 340), folder: 'Photography', w: 600, ht: 340, size: 142000 },\r\n { id: uid(), name: 'jacket-03-front.jpg', url: PH('jacket 03 front', 520, 360), folder: 'Product', w: 520, ht: 360, size: 98000 },\r\n { id: uid(), name: 'jacket-03-detail.jpg', url: PH('jacket 03 detail', 520, 360), folder: 'Product', w: 520, ht: 360, size: 91000 },\r\n { id: uid(), name: 'boots-pair.jpg', url: PH('boots pair', 520, 360), folder: 'Product', w: 520, ht: 360, size: 88000 },\r\n { id: uid(), name: 'texture-waxed.jpg', url: PH('waxed texture', 600, 240), folder: 'Photography', w: 600, ht: 240, size: 64000 },\r\n];\r\n\r\nconst KB = (n) => (n > 1048576 ? (n / 1048576).toFixed(1) + ' MB' : Math.round(n / 1024) + ' KB');\r\n\nObject.assign(exports, { FOLDERS, seedAssets, KB });\n\n};\n__modules[\"core/binder.js\"] = function(module, exports, __require) {\n/** Ported verbatim from the original `binder(getProps, set)` and `decorate(list)`. Pure field-descriptor logic, no DOM. */\r\nfunction binder(getProps, set, core) {\r\n return {\r\n head: (label) => ({ kind: 'head', label }),\r\n text: (label, key, ph) => ({ kind: 'text', label, value: getProps()[key] ?? '', placeholder: ph || '', onChange: (v) => set(key, v) }),\r\n area: (label, key, ph) => ({ kind: 'area', label, value: getProps()[key] ?? '', placeholder: ph || '', onChange: (v) => set(key, v) }),\r\n // Live typing only commits parseable numbers -- `Number('')` is 0, and\r\n // committing that the instant a field was cleared to retype (e.g. the\r\n // theme's content width collapsing to 0px mid-edit) was one of the\r\n // \"inputs behave weird\" symptoms. Blur settles the final value, clamped.\r\n num: (label, key, min, max) => ({\r\n kind: 'num', label, value: getProps()[key] ?? 0, min, max,\r\n onChange: (v) => { const n = parseFloat(v); if (Number.isFinite(n)) set(key, n); },\r\n onBlur: (v) => {\r\n if (core && core.rendering) return;\r\n const n = parseFloat(v);\r\n set(key, Math.min(max, Math.max(min, Number.isFinite(n) ? n : (getProps()[key] ?? min))));\r\n },\r\n }),\r\n color: (label, key) => ({ kind: 'color', label, value: getProps()[key] ?? '', swatch: /^#/.test(getProps()[key] || '') ? getProps()[key] : '#ffffff', onChange: (v) => set(key, v) }),\r\n // A native range slider commits on every drag tick -- dozens a second --\r\n // and each one used to trigger a full doc clone + re-render (see\r\n // `commit`), which is what made dragging feel like stutter instead of a\r\n // smooth slide. A stepper sidesteps that class of bug entirely: +/- is a\r\n // single discrete commit per click, and typing a value only commits once\r\n // you're done (on blur), not per keystroke.\r\n range: (label, key, min, max, step, unit) => {\r\n const cur = getProps()[key] ?? min;\r\n const s = step || 1;\r\n const decimals = (String(s).split('.')[1] || '').length;\r\n const clamp = (v) => Math.min(max, Math.max(min, v));\r\n const round = (v) => Number(v.toFixed(decimals));\r\n const commit = (v) => set(key, round(clamp(v)));\r\n return {\r\n kind: 'range', label, value: cur, min, max, step: s, unit: unit || '', display: cur + (unit || ''),\r\n onDec: () => commit(cur - s),\r\n onInc: () => commit(cur + s),\r\n // Live-typed digits aren't clamped (typing \"1\" toward \"12\" with a min\r\n // of 10 would otherwise get snapped back to 10 mid-keystroke, making\r\n // the second digit impossible to enter) -- only guarded against a\r\n // non-numeric intermediate state (e.g. a bare \"-\").\r\n onInput: (v) => { const n = parseFloat(v); if (!Number.isNaN(n)) set(key, n); },\r\n // A render tears down and rebuilds the whole panel subtree (no\r\n // diffing); removing this still-focused input as part of that forces\r\n // a synchronous, spurious `blur` before the rebuilt replacement can\r\n // be refocused. Committing on that blur re-renders again, which\r\n // tears down and blurs again -- an infinite loop. `core.rendering`\r\n // (set for the render()'s duration) tells a real blur apart from\r\n // that artifact -- same guard as canvas.js's RTE `onBlur`.\r\n onBlur: (v) => { if (core && core.rendering) return; const n = parseFloat(v); commit(Number.isNaN(n) ? cur : n); },\r\n };\r\n },\r\n // A real drag slider, for coarse visual sizing (content width). The\r\n // per-tick commit problem that ruled sliders out for ordinary fields\r\n // (see `range` above) is sidestepped by contract: the renderer moves the\r\n // value bubble live during the drag but only calls `onCommit` on release\r\n // ('change'), so a whole drag costs one re-render.\r\n slider: (label, key, min, max, step, unit) => ({\r\n kind: 'slider', label, value: getProps()[key] ?? min, min, max, step: step || 1, unit: unit || '',\r\n onCommit: (v) => { const n = parseFloat(v); if (Number.isFinite(n)) set(key, Math.min(max, Math.max(min, n))); },\r\n }),\r\n sel: (label, key, opts) => {\r\n const options = opts.map((o) => (typeof o === 'string' ? { value: o, label: o } : o));\r\n const current = getProps()[key];\r\n return {\r\n kind: 'select', label,\r\n // New controls must not render as an unexplained blank on documents\r\n // saved before that property existed. The renderer already uses the\r\n // first option as its semantic fallback; show that same choice here.\r\n value: current == null ? (options[0]?.value ?? '') : current,\r\n options,\r\n onChange: (v) => set(key, v),\r\n };\r\n },\r\n seg: (label, key, opts) => ({\r\n kind: 'seg', label, options: opts.map((o) => {\r\n const v = typeof o === 'string' ? o : o.value; const l = typeof o === 'string' ? o : o.label;\r\n const on = getProps()[key] === v;\r\n return { label: l, bg: on ? 'var(--ed-accent)' : 'transparent', fg: on ? 'var(--ed-accent-ink)' : 'var(--ed-muted)', onClick: () => set(key, v) };\r\n }),\r\n }),\r\n tog: (label, key, defaultOn) => {\r\n const raw = getProps()[key];\r\n const on = raw === undefined ? !!defaultOn : !!raw;\r\n return { kind: 'toggle', label, on, onChange: () => set(key, !on) };\r\n },\r\n btn: (label, onClick) => ({ kind: 'btn', label, onClick }),\r\n };\r\n}\r\n\r\n/**\r\n * A grid of linked steppers for props that come in sides/corners (\"Space\r\n * inside\" top/bottom/left/right). `toggle` ({on, onChange}), when present,\r\n * renders as the header's \"More options\" switch that swaps the linked pair\r\n * for per-side fields; `label: null` drops the header row entirely (the\r\n * section head above already names the group).\r\n */\r\nfunction group(label, items, toggle) {\r\n return { kind: 'rangeGroup', label, items, toggle: toggle || null };\r\n}\r\n\r\nfunction decorate(list) {\r\n return list.filter(Boolean).map((f, i) => {\r\n const d = Object.assign({}, f, {\r\n key: i,\r\n isHead: f.kind === 'head', isArea: f.kind === 'area', isBtn: f.kind === 'btn', isSeg: f.kind === 'seg',\r\n isRange: f.kind === 'range', isToggle: f.kind === 'toggle', isSocial: f.kind === 'social', isTableGrid: f.kind === 'tablegrid', isRichLinks: f.kind === 'richLinks',\n isRangeGroup: f.kind === 'rangeGroup', isSlider: f.kind === 'slider',\r\n isRow: ['text', 'num', 'color', 'select'].indexOf(f.kind) > -1,\r\n isField: ['text', 'num', 'color', 'select'].indexOf(f.kind) > -1,\r\n isText: f.kind === 'text', isNum: f.kind === 'num', isColor: f.kind === 'color', isSelect: f.kind === 'select',\r\n });\r\n // Group items are ranges rendered as grid cells: they need decorated\r\n // flags and focus keys of their own, namespaced under the group's index\r\n // so they stay unique against the flat list.\r\n if (d.isRangeGroup) d.items = f.items.map((it, j) => Object.assign({}, it, { key: i + 'g' + j, isRange: true }));\r\n return d;\r\n });\r\n}\r\n\nObject.assign(exports, { binder, group, decorate });\n\n};\n__modules[\"core/blocks.js\"] = function(module, exports, __require) {\nconst {uid} = __require(\"core/ids.js\");\nconst {PH} = __require(\"core/placeholder.js\");\nconst {THEME} = __require(\"core/theme.js\");\n\nconst BLOCKS = [\n { type: 'text', code: 'TXT', label: 'Text', hint: 'Rich text — edit inline', make: () => ({ html: 'Hi {{ first_name }} — we cut three things from the fall line and kept the two that mattered. Here they are.', size: 16, lh: 1.6, color: '', align: 'left', weight: '400', py: 10, px: 0 }) },\n { type: 'image', code: 'IMG', label: 'Image', hint: 'Image from the library', make: () => ({ src: PH('hero image 600 × 320', 600, 320), alt: 'Hero image', width: 100, align: 'center', href: '', radius: 10, py: 0, px: 0 }) },\n { type: 'button', code: 'BTN', label: 'Button', hint: 'Call to action', make: () => ({ label: 'Shop the drop', href: 'https://example.com', bg: '#0065b3', color: '#ffffff', radius: 8, py: 13, px: 26, align: 'left', size: 15, full: false, borderW: 0, borderStyle: 'solid', borderColor: '' }) },\n { type: 'divider', code: 'DIV', label: 'Divider', hint: 'Horizontal rule', make: () => ({ thickness: 1, lineStyle: 'solid', color: '#e2e8f0', width: 100, py: 14 }) },\n { type: 'spacer', code: 'SPC', label: 'Spacer', hint: 'Vertical space', make: () => ({ height: 32 }) },\n { type: 'social', code: 'SOC', label: 'Social', hint: 'Social icon row', make: () => ({ items: 'Instagram|https://instagram.com\\nX|https://x.com\\nLinkedIn|https://linkedin.com\\nYouTube|https://youtube.com', align: 'center', size: 20, gap: 12, color: '#0065b3', palette: 'custom', shape: 'outline', showLabel: false }) },\n { type: 'video', code: 'VID', label: 'Video', hint: 'Thumbnail + play badge', make: () => ({ src: PH('video thumbnail 600 × 330', 600, 330), href: 'https://example.com/watch', caption: 'Two minutes inside the workshop', badge: '#172033' }) },\n { type: 'html', code: 'HTM', label: 'HTML', hint: 'Raw HTML block', make: () => ({ code: '<p style=\"font:13px/1.6 ui-monospace,monospace;margin:0\"><!-- raw HTML passes through untouched --></p>' }) },\n { type: 'countdown', code: 'CDN', label: 'Countdown', hint: 'Live countdown', make: () => ({ target: new Date(Date.now() + 2.4 * 86400000).toISOString().slice(0, 16), label: 'Subscriber pricing ends in', color: '#172033' }) },\n { type: 'menu', code: 'NAV', label: 'Menu', hint: 'Navigation row', make: () => ({ items: 'New in|https://example.com/new\\nOuterwear|https://example.com/outerwear\\nArchive|https://example.com/archive', align: 'center', size: 12, gap: 20, color: '#172033' }) },\n];\nBLOCKS.push(\n { type: 'heading', code: 'HED', label: 'Heading', hint: 'Display heading', make: () => ({ text: 'What we kept', level: 'h2', size: 34, lh: 1.12, align: 'left', color: '', weight: '600', font: 'body', py: 8, px: 0 }) },\n { type: 'list', code: 'LST', label: 'List', hint: 'Bulleted or numbered list', make: () => ({ items: 'Import your list\\nPick a template\\nSend the first one', ordered: false, size: 15, lh: 1.7, color: '', gap: 4, py: 8, px: 0 }) },\n { type: 'table', code: 'TBL', label: 'Table', hint: 'Data table — edit cells inline', make: () => ({ data: 'Plan|Price|Seats\\nStarter|$19|3\\nTeam|$49|10\\nStudio|$99|25', header: true, borders: true, borderWidth: 1, borderStyle: 'solid', striped: true, pad: 10, size: 14, headBg: '#f8fafc', lineColor: '#e2e8f0', align: 'left', width: 100 }) },\n { type: 'embed', code: 'EMB', label: 'Embed', hint: 'Iframe embed — map, form, player', make: () => ({ src: 'https://example.com/embed', height: 320, label: 'Embedded content', py: 8 }) },\n { type: 'css', code: 'CSS', label: 'Raw CSS', hint: 'Inject a style block', make: () => ({ code: '.mc-note { font: 13px/1.6 \"Helvetica Neue\", Helvetica, Arial, sans-serif; color: #0065b3; letter-spacing: 0.04em; }', note: 'Styles apply to raw HTML blocks below.' }) },\n { type: 'codeblock', code: 'PRE', label: 'Code', hint: 'Preformatted code sample', make: () => ({ code: 'curl -X POST https://api.example.com/v1/sends \\\\\\n -H \"Authorization: Bearer $KEY\" \\\\\\n -d campaign=mc-4471', bg: '#172033', color: '#e8e9ea', size: 12.5, pad: 14 }) },\n);\nBLOCKS.push(\n { type: 'box', code: 'BOX', label: 'Section box', hint: 'Styled container with free content', make: () => ({ html: '<strong style=\"font-size:19px;display:block;margin-bottom:6px\">Section title</strong>Drop copy here, or paste markup. The box takes background, padding, border and radius.', bg: '#f8fafc', bgImage: '', border: 1, borderStyle: 'solid', lineColor: '#e2e8f0', topBorder: true, rightBorder: true, bottomBorder: true, leftBorder: true, radius: 12, pad: 22, align: 'left', minH: 0, maxW: 100, shadow: false }) },\n { type: 'svg', code: 'SVG', label: 'Inline SVG', hint: 'Paste SVG markup', make: () => ({ code: '<svg viewBox=\"0 0 120 40\" width=\"120\" height=\"40\" fill=\"none\" stroke=\"#0065b3\" stroke-width=\"1.5\"><rect x=\"0.75\" y=\"0.75\" width=\"118.5\" height=\"38.5\"/><path d=\"M12 28l14-16 12 10 10-8 18 14\"/></svg>', align: 'left', width: 100, py: 10 }) },\n);\n\nconst DEF = (t) => BLOCKS.find((b) => b.type === t);\nconst mk = (t) => ({ id: uid(), type: t, props: DEF(t).make() });\nconst blk = (type, over) => { const b = mk(type); Object.assign(b.props, over || {}); return b; };\n\nconst LAYOUTS = [\n { spans: [100], label: '1 col' },\n { spans: [50, 50], label: '50 / 50' },\n { spans: [33, 67], label: '33 / 67' },\n { spans: [67, 33], label: '67 / 33' },\n { spans: [33, 34, 33], label: '3 col' },\n { spans: [25, 25, 25, 25], label: '4 col' },\n];\n\nconst mkRow = (spans, blocks) => ({\n id: uid(),\n props: {\n bg: '', bgImage: '', bgSize: 'cover', bgPos: 'center', bgRepeat: 'no-repeat', overlay: 0,\n border: 0, borderStyle: 'solid', lineColor: '#e2e2e5', bTop: true, bRight: true, bBottom: true, bLeft: true, radius: 0, shadow: '', maxW: 100,\n mt: 0, mr: 0, mb: 0, ml: 0,\n layout: 'columns', flexDir: 'row', justify: 'flex-start', alignItems: 'stretch', wrap: true, gridCols: 2,\n py: 20, px: 24, padSplit: false, gap: 20, valign: 'top', stackMobile: true,\n },\n cols: spans.map((s, i) => ({ id: uid(), span: s, blocks: i === 0 && blocks ? blocks : [] })),\n});\n\nconst groupRows = (id) => (GROUPS[id] ? GROUPS[id].build() : []);\n\n/** Compound presets: `build()` returns full row(s) built from ordinary blocks -- once inserted, a group is indistinguishable from any other row/blocks (no groupId persists), so every part stays individually selectable and editable. */\nconst GROUPS = {\n hero: {\n label: 'Hero', icon: 'hero',\n build: () => {\n const row = mkRow([100]);\n Object.assign(row.props, { py: 56, px: 36, bgImage: PH('hero background 1200 × 560', 1200, 560), overlay: 46, gap: 0 });\n row.cols[0].blocks = [\n blk('text', { html: 'AUTUMN 2026', size: 11, align: 'center', color: '#ffffff', py: 0 }),\n blk('heading', { text: 'Built for the long haul', size: 44, align: 'center', color: '#ffffff', py: 10 }),\n blk('text', { html: 'Waxed cotton, storm cuffs, and a repair promise that outlives the season.', size: 15, align: 'center', color: '#ffffff', py: 4 }),\n blk('button', { label: 'Shop the drop', align: 'center', bg: '#ffffff', color: '#172033', radius: 8 }),\n ];\n return [row];\n },\n },\n card: {\n label: 'Card', icon: 'card',\n build: () => {\n const row = mkRow([100]);\n Object.assign(row.props, { bg: '#f8fafc', border: 1, lineColor: '#e2e8f0', radius: 12, py: 0, px: 0, gap: 0 });\n row.cols[0].blocks = [\n blk('image', { src: PH('card image 520 × 300', 520, 300), alt: 'Inside the workshop', py: 0, px: 0 }),\n blk('heading', { text: 'Inside the workshop', size: 22, py: 16, px: 20 }),\n blk('text', { html: 'Three benches, two machines, and a rule about finishing what you start.', size: 13.5, py: 0, px: 20 }),\n blk('button', { label: 'Read the story', bg: '#0065b3', color: '#ffffff', size: 13, py: 10, px: 18, align: 'left' }),\n ];\n return [row];\n },\n },\n product: {\n label: 'Product', icon: 'product',\n build: () => {\n const row = mkRow([45, 55]);\n Object.assign(row.props, { valign: 'middle', py: 16 });\n row.cols[0].blocks = [blk('image', { src: PH('product shot 520 × 520', 520, 520), alt: 'Field Jacket 03', py: 0, px: 0 })];\n row.cols[1].blocks = [\n blk('heading', { text: 'Field Jacket 03', size: 26, py: 0 }),\n blk('text', { html: '<strong>$248</strong> — waxed cotton, storm cuffs, cut and sewn in Portugal.', size: 14, py: 8 }),\n blk('button', { label: 'View product' }),\n ];\n return [row];\n },\n },\n stats: {\n label: 'Stats', icon: 'stats',\n build: () => {\n const row = mkRow([33, 34, 33]);\n Object.assign(row.props, { py: 22, gap: 8 });\n [['12k', 'Subscribers'], ['41%', 'Open rate'], ['8.2%', 'Click rate']].forEach((pair, i) => {\n row.cols[i].blocks = [\n blk('heading', { text: pair[0], size: 32, align: 'center', color: '#0065b3', py: 0 }),\n blk('text', { html: pair[1].toUpperCase(), size: 11, align: 'center', py: 4 }),\n ];\n });\n return [row];\n },\n },\n quote: {\n label: 'Quote', icon: 'quote',\n build: () => {\n const row = mkRow([100]);\n Object.assign(row.props, { py: 18, gap: 0 });\n row.cols[0].blocks = [\n blk('text', { html: '<em>“It shipped in a week and nobody asked me for a spec.”</em>', size: 19, lh: 1.45, py: 0 }),\n blk('text', { html: 'RAE OKONKWO, FOUNDRY SUPPLY', size: 11, py: 6 }),\n ];\n return [row];\n },\n },\n gallery: {\n label: 'Gallery', icon: 'gallery',\n build: () => {\n const row = mkRow([50, 50]);\n Object.assign(row.props, { py: 10, gap: 10 });\n row.cols[0].blocks = [\n blk('image', { src: PH('image 01', 400, 300), alt: '', py: 0, px: 0 }),\n blk('image', { src: PH('image 03', 400, 300), alt: '', py: 10, px: 0 }),\n ];\n row.cols[1].blocks = [\n blk('image', { src: PH('image 02', 400, 300), alt: '', py: 0, px: 0 }),\n blk('image', { src: PH('image 04', 400, 300), alt: '', py: 10, px: 0 }),\n ];\n return [row];\n },\n },\n footer: {\n label: 'Footer', icon: 'footer',\n build: () => {\n const row = mkRow([100]);\n Object.assign(row.props, { py: 22, gap: 0 });\n row.cols[0].blocks = [\n blk('divider', { py: 0 }),\n blk('social', { align: 'center', size: 18, shape: 'bare' }),\n blk('text', { html: '<strong>MailCraft, Inc.</strong><br />220 Foundry Street, Suite 4, Portland OR 97209<br />You are receiving this because you signed up at mailcraft.co.', size: 11.5, align: 'center', py: 6 }),\n blk('text', { html: '<a href=\"{{ unsubscribe_url }}\">Unsubscribe</a> · <a href=\"#\">Update preferences</a>', size: 11.5, align: 'center', py: 0 }),\n ];\n return [row];\n },\n },\n};\n\nconst PALETTE = [\n { t: 'heading' }, { t: 'text' }, { t: 'list' }, { g: 'quote' }, { t: 'image' }, { g: 'gallery' },\n { t: 'button' }, { t: 'table' }, { g: 'card' }, { g: 'product' }, { g: 'hero' }, { g: 'stats' },\n { t: 'box' }, { t: 'divider' }, { t: 'spacer' }, { t: 'social' }, { t: 'video' },\n { t: 'embed' }, { t: 'menu' }, { g: 'footer' }, { t: 'html' }, { t: 'css' }, { t: 'svg' },\n { t: 'codeblock' }, { t: 'countdown' },\n];\n\n/**\n * The document a fresh editor opens on: one empty row, default theme.\n *\n * Deliberately not a sample template. Template galleries belong to the host's\n * own UI (pushed in via `editor.loadTemplate`), so booting into a built-in\n * marketing layout would both pull a template catalogue into every bundle and\n * put content in a host's editor that they never chose.\n */\nconst blankDoc = () => ({ theme: THEME(), rows: [mkRow([100])] });\n\nfunction migrateDoc(doc) {\n const defaults = mkRow([100]).props;\n const emptied = [];\n (doc.rows || []).forEach((r) => {\n const hadBlocks = r.cols.some((c) => c.blocks.length);\n // Outside spacing used to be one vertical `my` value. Seed the complete\n // four-side model before defaults are applied so old documents keep their\n // top/bottom spacing and gain neutral left/right values.\n const legacyMarginY = r.props.my ?? 0;\n if (r.props.mt === undefined) r.props.mt = legacyMarginY;\n if (r.props.mr === undefined) r.props.mr = 0;\n if (r.props.mb === undefined) r.props.mb = legacyMarginY;\n if (r.props.ml === undefined) r.props.ml = 0;\n r.cols.forEach((c) => {\n // A block whose type this build no longer knows is dropped rather than\n // rendered as an unrecognized shape; a row emptied that way goes with it.\n c.blocks = c.blocks.filter((b) => DEF(b.type));\n // `social.shape` used to have a 'solid' value meaning \"filled badge, no\n // particular shape\" -- now that shape is split into 'circle'/'square'\n // badges, an old 'solid' document reads as the (arbitrary but stable)\n // 'square' choice rather than silently becoming an unrecognized value.\n c.blocks.forEach((b) => { if (b.type === 'social' && b.props.shape === 'solid') b.props.shape = 'square'; });\n });\n Object.keys(defaults).forEach((k) => { if (r.props[k] === undefined) r.props[k] = defaults[k]; });\n if (hadBlocks && !r.cols.some((c) => c.blocks.length)) emptied.push(r.id);\n });\n doc.rows = (doc.rows || []).filter((r) => emptied.indexOf(r.id) < 0);\n return doc;\n}\n\n/**\n * Any plausible document -> a complete, renderable one.\n *\n * The HTML path already works this way: `parseHtmlSource` classifies what it\n * can and wraps the rest in a raw-html row rather than dropping it, so no\n * source is ever rejected outright. JSON now gets the same contract. A partial\n * document -- hand-written, generated by a backend, or saved by an older\n * version -- is filled in rather than handed to the renderer with a hole in it.\n *\n * Everything the renderer indexes into is seeded: the six theme keys (an empty\n * `theme` used to throw on `theme.font.replace` at export time), every row\n * prop, at least one column per row, per-type block props from\n * `DEF(type).make()`, and ids -- a document written by hand has none, and rows\n * and blocks are addressed by id everywhere in the editor.\n *\n * Blocks of a type this build no longer knows are kept here and left to\n * `migrateDoc`, which converts the legacy ones and drops the rest; filtering\n * them out first would lose the conversions.\n *\n * Returns null when there is nothing usable, so a caller can no-op instead of\n * replacing the user's document with an empty one.\n */\nfunction normalizeDoc(input) {\n if (!input || typeof input !== 'object' || Array.isArray(input)) return null;\n const rowDefaults = mkRow([100]).props;\n const rows = (Array.isArray(input.rows) ? input.rows : []).filter((r) => r && typeof r === 'object');\n const doc = {\n theme: Object.assign(THEME(), input.theme || {}),\n rows: rows.map((r) => {\n const raw = Array.isArray(r.cols) && r.cols.length ? r.cols.filter((c) => c && typeof c === 'object') : [{}];\n const cols = raw.length ? raw : [{}];\n const evenSpan = Math.round(100 / cols.length);\n return {\n id: r.id || uid(),\n props: Object.assign({}, rowDefaults, r.props || {}),\n cols: cols.map((c) => ({\n id: c.id || uid(),\n span: Number(c.span) > 0 ? Number(c.span) : evenSpan,\n blocks: (Array.isArray(c.blocks) ? c.blocks : []).filter((b) => b && typeof b === 'object' && b.type).map((b) => (\n DEF(b.type)\n ? { id: b.id || uid(), type: b.type, props: Object.assign(DEF(b.type).make(), b.props || {}) }\n : { id: b.id || uid(), type: b.type, props: b.props || {} }\n )),\n })),\n };\n }),\n };\n if (!doc.rows.length) return null;\n return migrateDoc(doc);\n}\n\nObject.assign(exports, { BLOCKS, DEF, mk, blk, LAYOUTS, mkRow, groupRows, GROUPS, PALETTE, blankDoc, migrateDoc, normalizeDoc });\n\n};\n__modules[\"core/css-cascade.js\"] = function(module, exports, __require) {\n/**\r\n * Import-time CSS cascade: folds a parsed document's `<style>` rules into the\r\n * elements' inline styles, so the importer's classifiers (which read inline\r\n * styles only) see class-styled templates -- Mailchimp exports, hand-written\r\n * emails, framework output that was never inlined -- the same way a mail\r\n * client would.\r\n *\r\n * Deliberately a subset of a real cascade, matched to what email CSS uses:\r\n * - `@media` blocks (and every other at-rule) are dropped whole: responsive\r\n * overrides can't be represented in the imported model, desktop values win.\r\n * A side benefit: base-rule `.desktop_hide { display:none }` still applies,\r\n * so mobile-only duplicate content is correctly dropped by the importer's\r\n * hidden-element skip.\r\n * - Selectors containing `:` are skipped -- pseudo-classes/-elements are\r\n * interactive or generated state with no place in a static import.\r\n * - Specificity is the classic ids/classes/tags count; equal specificity\r\n * resolves by source order; `!important` wins over everything including\r\n * inline styles, which otherwise always win (matching browser behavior for\r\n * the combinations that matter here).\r\n */\r\n\r\nfunction stripComments(css) {\r\n return String(css || '').replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\r\n}\r\n\r\n/** Removes every at-rule: block-less ones (`@import ...;`) to the semicolon, block ones (`@media { ... }`) across balanced braces. */\r\nfunction stripAtRules(css) {\r\n let out = '';\r\n let i = 0;\r\n while (i < css.length) {\r\n if (css[i] === '@') {\r\n const semi = css.indexOf(';', i);\r\n const brace = css.indexOf('{', i);\r\n if (brace === -1 || (semi !== -1 && semi < brace)) {\r\n i = semi === -1 ? css.length : semi + 1;\r\n continue;\r\n }\r\n let depth = 0;\r\n let j = brace;\r\n for (; j < css.length; j++) {\r\n if (css[j] === '{') depth++;\r\n else if (css[j] === '}') { depth--; if (!depth) break; }\r\n }\r\n i = j + 1;\r\n continue;\r\n }\r\n out += css[i];\r\n i++;\r\n }\r\n return out;\r\n}\r\n\r\nfunction specificity(sel) {\r\n const ids = (sel.match(/#[\\w-]+/g) || []).length;\r\n const classes = (sel.match(/\\.[\\w-]+|\\[[^\\]]*\\]/g) || []).length;\r\n const tags = (sel.match(/(^|[\\s>+~])[a-zA-Z][\\w-]*/g) || []).length;\r\n return ids * 100 + classes * 10 + tags;\r\n}\r\n\r\nfunction inlineStylesheets(doc) {\r\n const sheets = Array.from(doc.querySelectorAll('style'));\r\n if (!sheets.length) return;\r\n const css = stripAtRules(stripComments(sheets.map((s) => s.textContent || '').join('\\n')));\r\n\r\n const rules = [];\r\n const ruleRe = /([^{}]+)\\{([^{}]*)\\}/g;\r\n let m;\r\n let order = 0;\r\n while ((m = ruleRe.exec(css))) {\r\n const decls = [];\r\n m[2].split(';').forEach((d) => {\r\n const at = d.indexOf(':');\r\n if (at < 0) return;\r\n const prop = d.slice(0, at).trim().toLowerCase();\r\n let value = d.slice(at + 1).trim();\r\n if (!prop || !value || prop.indexOf('--') === 0 || prop.indexOf('mso-') === 0) return;\r\n const important = /!important\\s*$/i.test(value);\r\n if (important) value = value.replace(/!important\\s*$/i, '').trim();\r\n if (value) decls.push({ prop, value, important });\r\n });\r\n if (!decls.length) continue;\r\n m[1].split(',').forEach((raw) => {\r\n const sel = raw.trim();\r\n if (!sel || sel === '*' || sel.indexOf(':') > -1) return;\r\n rules.push({ sel, decls, spec: specificity(sel), order: order++ });\r\n });\r\n }\r\n if (!rules.length) return;\r\n\r\n // Ascending: later (more specific / later-in-source) rules overwrite\r\n // earlier winners per property below.\r\n rules.sort((a, b) => a.spec - b.spec || a.order - b.order);\r\n\r\n const winners = new Map(); // element -> Map(prop -> {value, important})\r\n rules.forEach((rule) => {\r\n let matched;\r\n try { matched = doc.querySelectorAll(rule.sel); } catch { return; }\r\n matched.forEach((el) => {\r\n if (el !== doc.body && !doc.body.contains(el)) return;\r\n let bucket = winners.get(el);\r\n if (!bucket) { bucket = new Map(); winners.set(el, bucket); }\r\n rule.decls.forEach((d) => {\r\n const cur = bucket.get(d.prop);\r\n if (cur && cur.important && !d.important) return;\r\n bucket.set(d.prop, d);\r\n });\r\n });\r\n });\r\n\r\n winners.forEach((bucket, el) => {\r\n if (!el.style) return;\r\n bucket.forEach((d, prop) => {\r\n if (!d.important && el.style.getPropertyValue(prop)) return; // inline wins\r\n try { el.style.setProperty(prop, d.value); } catch { /* unparseable value -- skip */ }\r\n });\r\n });\r\n}\r\n\nObject.assign(exports, { inlineStylesheets });\n\n};\n__modules[\"core/editor-core.js\"] = function(module, exports, __require) {\nconst {uid} = __require(\"core/ids.js\");\r\nconst {mk, mkRow, GROUPS, LAYOUTS, migrateDoc, normalizeDoc, blankDoc} = __require(\"core/blocks.js\");\r\nconst {binder, decorate, group} = __require(\"core/binder.js\");\r\nconst {seedAssets, KB, FOLDERS} = __require(\"core/assets.js\");\r\nconst {ALL_FOLDER_ID, normalizeAsset, resolveLimits, providerProblems} = __require(\"core/storage.js\");\r\nconst {validateFiles, limitsProblem} = __require(\"core/storage-limits.js\");\r\nconst {migrateTokens, cleanHtml, escHtml} = __require(\"core/sanitize.js\");\r\nconst {buildHtml: buildHtmlFn} = __require(\"core/export.js\");\r\nconst {htmlToDoc} = __require(\"core/import-html.js\");\r\nconst {boxCss} = __require(\"core/layout-style.js\");\r\nconst {vars: varsFn, TOKEN, INSERT_KEYS} = __require(\"core/variables.js\");\r\nconst {createTranslator} = __require(\"core/i18n/index.js\");\r\n\r\nconst clone = (o) => JSON.parse(JSON.stringify(o));\r\nconst STORAGE_KEY = 'mailcraft.v3';\r\nconst TAB_KEY_PREFIX = STORAGE_KEY + '.tab.';\r\nconst TAB_ID_KEY = 'mailcraft.tab';\r\n/** How long another tab's draft slot survives without a save before `sweepDrafts` reclaims it. */\r\nconst DRAFT_TTL = 7 * 24 * 60 * 60 * 1000;\r\n/**\r\n * How many uploads run at once. Not unbounded: a presign plus a PUT per file,\r\n * fanned out across a twenty-file drop, is the kind of burst a gateway\r\n * rate-limits. Not one at a time either -- that made a large drop as slow as\r\n * the sum of its round trips.\r\n */\r\nconst UPLOAD_CONCURRENCY = 3;\r\nconst BORDER_STYLES = [\r\n { value: 'solid', label: 'Solid' },\r\n { value: 'dashed', label: 'Dashed' },\r\n { value: 'dotted', label: 'Dotted' },\r\n { value: 'double', label: 'Double' },\r\n];\r\n\r\n/** Character offset of (node, offset) counting only text within `root` -- mirrors `textOffset` in render/focus-preserve.js (kept local: core/ doesn't otherwise depend on render/). */\r\nfunction charOffset(root, node, offset) {\r\n if (node.nodeType !== Node.TEXT_NODE) {\r\n let n = 0;\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\r\n let cur; const target = node.childNodes[offset];\r\n if (!target) { while (walker.nextNode()) n += walker.currentNode.nodeValue.length; return n; }\r\n while ((cur = walker.nextNode())) { if (cur === target || target.contains(cur)) return n; n += cur.nodeValue.length; }\r\n return n;\r\n }\r\n let n = 0;\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\r\n let cur;\r\n while ((cur = walker.nextNode())) {\r\n if (cur === node) return n + offset;\r\n n += cur.nodeValue.length;\r\n }\r\n return n;\r\n}\r\n\r\n/**\r\n * Ported from the original prototype's `class Component extends DCLogic` --\r\n * same state shape, same method names and logic, with `this.setState(patch, cb)`\r\n * replaced by direct mutation + `emit()` (there is no React underneath this\r\n * package). Rendering lives entirely in render/ -- this class only ever\r\n * touches `this.state`, never the DOM.\r\n */\r\n/**\r\n * HTML -> { rows, theme } with a never-drop-content fallback: anything the\r\n * importer cannot classify into rows survives as a single raw-html row rather\r\n * than vanishing. Shared by `importHtml` (Code modal / host API) and\r\n * html-sourced templates so both paths degrade identically.\r\n */\r\nfunction parseHtmlSource(src) {\r\n const parsed = htmlToDoc(src);\r\n let rows = parsed.rows;\r\n if (!rows.length) {\r\n const row = mkRow([100], [mk('html')]);\r\n row.props.py = 0; row.props.px = 0;\r\n let body = src;\r\n try { body = new DOMParser().parseFromString(String(src || ''), 'text/html').body.innerHTML || src; } catch { /* keep raw src */ }\r\n row.cols[0].blocks[0].props.code = String(body || '').trim();\r\n rows = [row];\r\n }\r\n return { rows, theme: parsed.theme || {} };\r\n}\r\n\r\n/** Full document from an HTML string: imported rows plus whatever theme keys the source declared, over blank-doc defaults for the rest. */\r\nfunction docFromHtml(src) {\r\n const doc = blankDoc();\r\n const { rows, theme } = parseHtmlSource(src);\r\n doc.rows = rows;\r\n Object.assign(doc.theme, theme);\r\n return doc;\r\n}\r\n\r\n/**\r\n * AI draft goals and tones.\r\n *\r\n * These are prompt text, not UI chrome: `runAi` splices the selected strings\r\n * straight into the sentence it sends the provider, so they stay English here\r\n * and are deliberately NOT routed through `t()` -- a translated goal would\r\n * change what the model is asked for, not just what the operator reads. The\r\n * goal list tracks the email jobs the shipped example templates already cover\r\n * (welcome, receipt, cart, restock, referral, review, newsletter, ...) so the\r\n * dropdown offers work an operator recognises rather than five generic verbs.\r\n *\r\n * Goals carry a `group` for the `<optgroup>` label; the first entry is the\r\n * default in `state.aiGoal`.\r\n */\r\nconst AI_GOALS = [\r\n { group: 'Draft a new email', items: [\r\n 'Full email draft',\r\n 'Welcome or onboarding',\r\n 'Product announcement',\r\n 'Promotion or sale',\r\n 'Event or webinar invite',\r\n 'Newsletter intro',\r\n 'Abandoned cart reminder',\r\n 'Back in stock alert',\r\n 'Re-engagement nudge',\r\n 'Referral or reward invite',\r\n 'Feedback or review request',\r\n 'Thank you or post-purchase',\r\n 'Transactional notice',\r\n ] },\r\n { group: 'Rework existing copy', items: [\r\n 'Headline options',\r\n 'Shorten existing copy',\r\n 'Rewrite for clarity',\r\n ] },\r\n];\r\n\r\n/** Flat list -- tone has no natural grouping, and twelve entries still scan in one pass. */\r\nconst AI_TONES = [\r\n 'Confident, plain',\r\n 'Warm and personal',\r\n 'Friendly and casual',\r\n 'Direct and minimal',\r\n 'Playful',\r\n 'Enthusiastic and bold',\r\n 'Urgent and time-sensitive',\r\n 'Premium and understated',\r\n 'Reassuring and calm',\r\n 'Apologetic and accountable',\r\n 'Formal',\r\n 'Technical and precise',\r\n];\r\n\r\n/** Every goal string, flattened -- the order the `<select>` presents them in. */\r\nconst AI_GOAL_VALUES = AI_GOALS.flatMap((g) => g.items);\r\n\r\nclass EditorCore {\r\n constructor({ variables, aiProvider, iconProvider, messages, storageProvider, storageLimits } = {}) {\r\n this.variablesRaw = variables ?? null;\r\n this.aiProvider = aiProvider ?? null;\r\n this.iconProvider = iconProvider ?? null;\r\n this.storageProvider = storageProvider ?? null;\r\n this.storageLimits = storageLimits ?? null;\r\n this.messages = messages ?? null;\r\n this.t = createTranslator(this.messages);\r\n this.listeners = new Set();\r\n this.drag = null;\r\n this.editEl = null;\r\n this.savedRange = null;\r\n this.rteActive = false;\r\n this.fileEl = null;\r\n // `mount()` restores the persisted draft, but `connectedCallback` runs it\r\n // *after* the host may already have pushed a document in -- the\r\n // `createElement()` -> `loadTemplate()` -> `append()` pattern the element's\r\n // constructor comment advertises. Without these two flags that restore\r\n // silently threw the host's template away and showed the previous draft\r\n // instead, and re-connecting the element (a framework remount, or a move in\r\n // the DOM) did the same to a document already on screen.\r\n this.docSetByHost = false;\r\n this.mounted = false;\r\n\r\n this.state = {\r\n doc: blankDoc(),\r\n // Empty, not a sample name: this ends up in the exported <title> and the\r\n // download filename, so a placeholder here ships in a host's real email.\r\n sel: null, hover: null, tab: 'design', chrome: 'light', device: 'desktop', mode: 'rows', zoom: 1, advancedOpen: false,\r\n assets: seedAssets(), assetFolder: 'All files', assetQuery: '', libraryOpen: false, assetTarget: null,\r\n folders: null, assetCursor: null, assetsLoading: false, assetsError: null, assetsLoaded: false, uploading: 0,\r\n exportOpen: false, exportCode: '', copied: false, aiOpen: false, aiGoal: AI_GOAL_VALUES[0], aiTone: AI_TONES[0],\r\n aiBrief: '', aiBusy: false, aiResults: [], previewOpen: false, toast: null, drop: null, rowDrop: null,\r\n editing: null, linkDraft: null, codeOpen: false, codeSrc: '', codeLive: '', codeDirty: false, codeDevice: 'desktop',\r\n history: [], future: [], now: Date.now(), savedStatus: 'idle', savedAt: null, libHot: false,\r\n };\r\n }\r\n\r\n subscribe(fn) { this.listeners.add(fn); return () => this.listeners.delete(fn); }\r\n\r\n /**\r\n * `window.getSelection()`/`document.getSelection()` reports `anchorNode`\r\n * as `<body>` (not the real, deep node) once the actual selection lives\r\n * inside an open shadow root -- which it always does here, since the\r\n * editor is a shadow-DOM web component. `ShadowRoot.getSelection()`\r\n * (Chromium-only; no standard equivalent yet) reports the real node/offset\r\n * and is what every selection-reading method below needs, or they silently\r\n * read garbage instead of erroring. `this.exportRoot` is the element's\r\n * shadow root (set by `mount()`); the `window.getSelection()` fallback\r\n * only matters for a browser without `ShadowRoot.getSelection`.\r\n */\r\n getSelection() {\r\n return this.exportRoot && typeof this.exportRoot.getSelection === 'function' ? this.exportRoot.getSelection() : window.getSelection();\r\n }\r\n\r\n /**\r\n * Batched like React's `setState`, via a microtask instead of a reconciler:\r\n * `render()` tears down and rebuilds the whole canvas (no diffing), which\r\n * removes whatever DOM node currently has focus. A *synchronous* render\r\n * mid-gesture -- e.g. from `onBlur`'s own `setState` while the browser is\r\n * still in the middle of moving focus from one block to another on a\r\n * single click -- yanks out the node the browser is about to focus next,\r\n * so that native focus-transition silently fails: the click's `blur`\r\n * fires, but its `focus` on the new block never does. Deferring the\r\n * render to a microtask lets a whole synchronous gesture (blur -> focus,\r\n * or several `setState` calls in a row) finish first -- exactly what\r\n * React's batching gives you for free -- and coalesces it into one render\r\n * reflecting the final state, instead of one destructive render per call.\r\n */\r\n emit() {\r\n if (this._emitScheduled) return;\r\n this._emitScheduled = true;\r\n const schedule = typeof requestAnimationFrame === 'function'\r\n ? requestAnimationFrame\r\n : (fn) => setTimeout(fn, 16);\r\n this._emitHandle = schedule(() => {\r\n this._emitScheduled = false;\r\n this._emitHandle = null;\r\n for (const fn of this.listeners) fn();\r\n });\r\n }\r\n\r\n /** `this.setState(patch, cb)` from the original, minus React. */\r\n setState(patch, cb) {\r\n Object.assign(this.state, typeof patch === 'function' ? patch(this.state) : patch);\r\n this.emit();\r\n if (cb) cb();\r\n }\r\n\r\n // ---- lifecycle ---------------------------------------------------------\r\n\r\n /** `componentDidMount`. `exportRoot` is the DOM root `buildHtml()`'s DOM-read-back (`grab`) searches -- the element's shadow root. */\r\n mount(exportRoot) {\r\n this.exportRoot = exportRoot;\r\n // Per-tab persistence: every tab autosaving to one shared key made\r\n // concurrent tabs clobber (and, briefly, mirror) each other -- loading a\r\n // template in one tab replaced the document in all of them. Each tab\r\n // instead owns a private draft slot named by an id kept in sessionStorage\r\n // (survives a reload of *this* tab, never shared with other tabs), so\r\n // every tab is an independent document. The shared STORAGE_KEY lives on\r\n // as the \"most recent work\" seed: still written by every persist, and a\r\n // brand-new tab (no draft of its own yet) starts from it -- the same\r\n // reopen-where-I-left-off behavior as before.\r\n try {\r\n let tabId = sessionStorage.getItem(TAB_ID_KEY);\r\n if (!tabId) { tabId = uid(); sessionStorage.setItem(TAB_ID_KEY, tabId); }\r\n this.tabKey = TAB_KEY_PREFIX + tabId;\r\n } catch { this.tabKey = null; }\r\n const firstMount = !this.mounted;\r\n this.mounted = true;\r\n // First mount only, and never over a document the host already supplied.\r\n try {\r\n const raw = firstMount && !this.docSetByHost\r\n && ((this.tabKey && localStorage.getItem(this.tabKey)) || localStorage.getItem(STORAGE_KEY));\r\n if (raw) {\r\n const s = JSON.parse(migrateTokens(raw));\r\n // A draft blob is as untrusted as any other input -- it may have been\r\n // written by an older build, or edited by hand in devtools.\r\n if (s && s.doc) s.doc = normalizeDoc(s.doc);\r\n // `device` was never actually written by `persist()` below, but a\r\n // stale/foreign blob could still carry the retired 'dark' inbox-preview\r\n // value -- normalize anything that isn't 'mobile' to 'desktop' rather\r\n // than trust it verbatim.\r\n if (s && s.doc) this.setState({ doc: s.doc, assets: s.assets || this.state.assets, chrome: s.chrome || 'light', device: s.device === 'mobile' ? 'mobile' : 'desktop' });\r\n }\r\n } catch { /* ignore */ }\r\n this.sweepDrafts();\r\n this.tick = setInterval(() => {\r\n if (!this.hasCountdown()) return;\r\n // Surgical: with a countdown block in the document this ticked a full\r\n // re-render every second -- open dropdowns died within a second and the\r\n // editor never idled. The element repaints just the countdown digits.\r\n this.state.now = Date.now();\r\n if (this.onTick) this.onTick(); else this.setState({ now: this.state.now });\r\n }, 1000);\r\n }\r\n\r\n /**\r\n * Reclaims other tabs' draft slots that haven't been saved to in DRAFT_TTL.\r\n * Without this, every browser tab ever opened would leave a full document\r\n * blob in localStorage forever and eventually hit the origin quota. This\r\n * tab's own slot and the shared STORAGE_KEY seed are never touched, and an\r\n * unreadable blob counts as stale.\r\n */\r\n sweepDrafts() {\r\n try {\r\n for (let i = localStorage.length - 1; i >= 0; i--) {\r\n const k = localStorage.key(i);\r\n if (!k || !k.startsWith(TAB_KEY_PREFIX) || k === this.tabKey) continue;\r\n let stale = true;\r\n try {\r\n const b = JSON.parse(localStorage.getItem(k));\r\n stale = !b || !b.t || Date.now() - b.t > DRAFT_TTL;\r\n } catch { /* unreadable -> stale */ }\r\n if (stale) localStorage.removeItem(k);\r\n }\r\n } catch { /* ignore */ }\r\n }\r\n\r\n /** Wires the window-level keydown shortcuts and the selectionchange listener the RTE toolbar needs to preserve the selection across a toolbar click. `isTyping(target)` and `shadowActiveElement()` are supplied by the element since only it knows its shadow root. */\r\n mountKeyboard(isTyping) {\r\n this.onKey = (e) => {\r\n // Shadow DOM retargets events for listeners outside the root: on this\r\n // window-level listener, `e.target` is always the <mailcraft-editor>\r\n // host, never the inner input -- which made `isTyping` always false, so\r\n // Backspace while editing an inspector field deleted the selected\r\n // block. `composedPath()[0]` is the true, pre-retargeting target.\r\n const target = e.composedPath ? e.composedPath()[0] : e.target;\r\n const typing = isTyping(target);\r\n if (e.key === 'Escape') {\r\n // Escape inside a field means \"leave the field\", not \"drop the\r\n // selection and close every modal\" -- blur it; a second Escape then\r\n // does the usual deselect/close.\r\n if (typing && target && typeof target.blur === 'function') { target.blur(); return; }\r\n this.setState({ sel: null, libraryOpen: false, exportOpen: false, aiOpen: false, codeOpen: false, previewOpen: false });\r\n return;\r\n }\r\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'z') {\r\n // Inside a real form field the browser's own field undo is what the\r\n // user means; hijacking it for document undo while mid-edit was part\r\n // of the \"inputs behave weird\" report. Contenteditable blocks keep\r\n // document undo -- their edits only commit on blur.\r\n if (typing && !(target && target.isContentEditable)) return;\r\n e.preventDefault(); e.shiftKey ? this.redo() : this.undo(); return;\r\n }\r\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'e') { e.preventDefault(); this.openExport(); return; }\r\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'k' && this.state.editing) { e.preventDefault(); this.openLink(); return; }\r\n if (typing) return;\r\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'd') { e.preventDefault(); this.dupSel(); return; }\r\n if ((e.key === 'Backspace' || e.key === 'Delete') && this.state.sel) { e.preventDefault(); this.delSel(); }\r\n };\r\n window.addEventListener('keydown', this.onKey);\r\n /**\r\n * Restoring the caret after a render (focus-preserve.js) sets a Range,\r\n * which fires `selectionchange` exactly like a real user selection would\r\n * -- so without checking whether the caret *actually* moved, this handler\r\n * would request another toolbar refresh in reaction to its own restoration,\r\n * restore (and fire `selectionchange`) again, forever. Comparing the\r\n * resolved character offsets (stable across a rebuild, unlike DOM node\r\n * identity) instead of reacting to every notification is what makes this\r\n * immune to that -- and to needing to know or guess the exact timing of\r\n * how many `selectionchange` events a browser coalesces per mutation.\r\n */\r\n this._lastSelBlock = null; this._lastSelStart = null; this._lastSelEnd = null;\r\n this.onSelect = () => {\r\n if (!this.state.editing) return;\r\n const sel = this.getSelection();\r\n if (!(sel && sel.rangeCount && this.editEl && this.editEl.contains(sel.anchorNode))) return;\r\n const range = sel.getRangeAt(0);\r\n const start = charOffset(this.editEl, range.startContainer, range.startOffset);\r\n const end = charOffset(this.editEl, range.endContainer, range.endOffset);\r\n if (this._lastSelBlock === this.state.editing && this._lastSelStart === start && this._lastSelEnd === end) return;\r\n this._lastSelBlock = this.state.editing; this._lastSelStart = start; this._lastSelEnd = end;\r\n this.savedRange = range.cloneRange();\r\n // Formatting-state changes only affect the small floating RTE toolbar.\r\n // Rebuilding the entire editor here made every caret movement tear down\r\n // the canvas, inspector and modal DOM, which was the largest source of\r\n // typing/selection jitter. The element supplies a surgical toolbar\r\n // refresh callback instead.\r\n if (this.onFormatChange) this.onFormatChange();\r\n };\r\n document.addEventListener('selectionchange', this.onSelect);\r\n }\r\n\r\n unmountKeyboard() {\r\n window.removeEventListener('keydown', this.onKey);\r\n document.removeEventListener('selectionchange', this.onSelect);\r\n }\r\n\r\n unmount() {\r\n clearTimeout(this._searchTimer);\r\n clearTimeout(this._limitsWarnTimer);\r\n this.abortAssets('list');\r\n this.abortAssets('upload');\r\n clearInterval(this.tick);\r\n clearTimeout(this.tt);\r\n clearTimeout(this.codeTimer);\r\n clearTimeout(this._persistTimer);\r\n if (this._emitHandle != null) {\r\n if (typeof cancelAnimationFrame === 'function') cancelAnimationFrame(this._emitHandle);\r\n else clearTimeout(this._emitHandle);\r\n }\r\n this._emitHandle = null;\r\n this._emitScheduled = false;\r\n this.unmountKeyboard();\r\n }\r\n\r\n // ---- rich text editing ----------------------------------------------\r\n\r\n exec(cmd, arg) {\r\n this.rteActive = true;\r\n try {\r\n if (this.editEl) {\r\n // `preventScroll`: `editEl` is already the block being actively\r\n // edited (on-screen, wherever the user has scrolled to) -- this just\r\n // restores focus after a toolbar-button click stole it, not a fresh\r\n // navigation, so it shouldn't yank a long template's scroll position.\r\n this.editEl.focus({ preventScroll: true });\r\n const sel = this.getSelection();\r\n // Only fall back to the cached `savedRange` when the live selection\r\n // isn't currently inside the block being edited (e.g. it was lost\r\n // while a dropdown or the link popover had focus) -- toolbar buttons\r\n // preventDefault their mousedown specifically so the real selection\r\n // survives the click, and unconditionally overwriting it here with\r\n // `savedRange` fought that: a render tearing down and rebuilding the\r\n // edited block's DOM (no diffing -- see `dropLine`, render/canvas.js)\r\n // collapses the live selection as a side effect and can still leave\r\n // `savedRange` reflecting that instead of the real, current one.\r\n const liveSelectionValid = sel && sel.rangeCount && this.editEl.contains(sel.anchorNode) && this.editEl.contains(sel.focusNode);\r\n if (!liveSelectionValid && this.savedRange && sel) { sel.removeAllRanges(); sel.addRange(this.savedRange); }\r\n }\r\n document.execCommand(cmd, false, arg);\r\n const sel2 = this.getSelection();\r\n if (sel2 && sel2.rangeCount && this.editEl && this.editEl.contains(sel2.anchorNode)) this.savedRange = sel2.getRangeAt(0).cloneRange();\r\n } catch { /* ignore */ }\r\n setTimeout(() => { this.rteActive = false; }, 0);\r\n }\r\n\r\n pasteClean(plainOnly) {\r\n return (e) => {\r\n const dt = e.clipboardData; if (!dt) return;\r\n e.preventDefault();\r\n const html = dt.getData('text/html');\r\n const text = dt.getData('text/plain') || '';\r\n const out = (!plainOnly && html) ? cleanHtml(html) : escHtml(text).replace(/\\r?\\n/g, '<br />');\r\n this.exec('insertHTML', out);\r\n };\r\n }\r\n\r\n syncEdit(b) {\r\n const elNode = this.editEl; if (!elNode) return;\r\n const key = b.type === 'heading' ? 'text' : (b.type === 'html' ? 'code' : 'html');\r\n const val = b.type === 'heading' ? elNode.textContent : elNode.innerHTML;\r\n if (b.props[key] !== val) this.setProp(b.id, key, val);\r\n }\r\n\r\n anchorAt() {\r\n const sel = this.getSelection();\r\n const node = sel && sel.anchorNode ? (sel.anchorNode.nodeType === 1 ? sel.anchorNode : sel.anchorNode.parentElement) : null;\r\n return node && node.closest ? node.closest('a') : null;\r\n }\r\n\r\n currentTag() {\r\n const sel = this.getSelection();\r\n const node = sel && sel.anchorNode ? (sel.anchorNode.nodeType === 1 ? sel.anchorNode : sel.anchorNode.parentElement) : null;\r\n const elNode = node && node.closest ? node.closest('h1,h2,h3,h4,h5,h6,blockquote,p') : null;\r\n return elNode ? elNode.tagName.toLowerCase() : '';\r\n }\r\n\r\n /**\r\n * Everything the RTE toolbar displays about the current selection, as one\r\n * comparable string. `selectionchange` fires for every pixel of a drag\r\n * selection; rebuilding the ~25-control toolbar each time made selecting\r\n * text visibly stutter. Comparing this fingerprint lets the refresh skip\r\n * every tick where nothing the toolbar shows has actually changed --\r\n * dragging through uniformly-formatted text rebuilds nothing at all.\r\n */\r\n formatFingerprint(b) {\r\n let s = b.id + '|' + this.currentTag() + '|' + (b.props.size || 16) + '|' + (this.state.linkDraft ? 1 : 0) + '|';\r\n for (const cmd of ['bold', 'italic', 'underline', 'strikeThrough', 'superscript', 'subscript', 'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull', 'insertUnorderedList', 'insertOrderedList']) {\r\n let on = false;\r\n try { on = document.queryCommandState(cmd); } catch { /* ignore */ }\r\n s += on ? '1' : '0';\r\n }\r\n return s;\r\n }\r\n\r\n openLink = () => {\r\n const a = this.anchorAt();\r\n this.rteActive = true;\r\n this.setState({ linkDraft: { href: a ? (a.getAttribute('href') || '') : 'https://', blank: a ? a.target === '_blank' : true, editing: !!a } });\r\n };\r\n\r\n applyLink = (b) => {\r\n const d = this.state.linkDraft; if (!d) return;\r\n this.exec('createLink', d.href);\r\n const elNode = this.editEl;\r\n if (elNode) {\r\n elNode.querySelectorAll('a').forEach((a) => {\r\n if (a.getAttribute('href') !== d.href) return;\r\n if (d.blank) { a.setAttribute('target', '_blank'); a.setAttribute('rel', 'noopener'); }\r\n else { a.removeAttribute('target'); a.removeAttribute('rel'); }\r\n });\r\n }\r\n this.syncEdit(b);\r\n this.setState({ linkDraft: null });\r\n };\r\n\r\n removeLink = (b) => {\r\n this.exec('unlink');\r\n this.syncEdit(b);\r\n this.setState({ linkDraft: null });\r\n };\r\n\r\n size(b, delta) {\r\n // fold any uncommitted inline formatting into state first, or the re-render\r\n // from the size change would rewrite innerHTML from stale props\r\n const elNode = this.editEl;\r\n if (elNode) {\r\n const key = b.type === 'heading' ? 'text' : (b.type === 'html' ? 'code' : 'html');\r\n const val = b.type === 'heading' ? elNode.textContent : elNode.innerHTML;\r\n if (b.props[key] !== val) this.setProp(b.id, key, val);\r\n }\r\n const cur = Number(b.props.size) || 16;\r\n this.setProp(b.id, 'size', Math.max(10, Math.min(64, cur + delta)));\r\n }\r\n\r\n hasCountdown() { return this.state.doc.rows.some((r) => r.cols.some((c) => c.blocks.some((b) => b.type === 'countdown'))); }\r\n\r\n persist(doc, assets, chrome) {\r\n try {\r\n const blob = JSON.stringify({\r\n doc: doc || this.state.doc,\r\n // With a provider the library belongs to the backend, not to this\r\n // draft: the files are already durable there, and writing them here\r\n // only risks reviving tiles for files since deleted. Without one it\r\n // is base64 in localStorage, which is what fills the origin quota.\r\n assets: this.storageProvider ? [] : (assets || this.state.assets), chrome: chrome || this.state.chrome,\r\n // `t` is what sweepDrafts ages slots by; mount's reader ignores it.\r\n t: Date.now(),\r\n });\r\n // The tab's own slot is this tab's document; the shared key is only the\r\n // seed a future fresh tab starts from (most recent work wins there).\r\n if (this.tabKey) localStorage.setItem(this.tabKey, blob);\r\n localStorage.setItem(STORAGE_KEY, blob);\r\n // Direct mutation + surgical label refresh, NOT setState: autosave runs\r\n // 400ms after every commit, so a setState here re-rendered the entire\r\n // editor just to change the header's \"Saved\" label -- which, half a\r\n // second after any edit, silently destroyed whatever the user had since\r\n // opened (a native <select>'s option list, most visibly) and doubled\r\n // the render cost of every single interaction.\r\n this.state.savedStatus = 'saved';\r\n this.state.savedAt = new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\r\n if (this.onSavedChange) this.onSavedChange();\r\n } catch {\r\n this.state.savedStatus = 'error';\r\n if (this.onSavedChange) this.onSavedChange();\r\n }\r\n }\r\n\r\n commit(fn) {\r\n const prev = JSON.stringify(this.state.doc);\r\n const doc = JSON.parse(prev);\r\n fn(doc);\r\n this.setState({ doc, history: this.state.history.slice(-40).concat(prev), future: [] });\r\n // A drag on any continuous control (a range slider especially) fires\r\n // `commit` dozens of times a second. `persist` does a full JSON.stringify\r\n // of the doc plus a *synchronous* localStorage.setItem -- both real costs\r\n // -- and was running on every single one of those commits, right in the\r\n // middle of the drag. That's enough main-thread work per tick to visibly\r\n // stutter the slider. Debouncing to fire once after things settle keeps\r\n // autosave working (nothing is lost -- the last doc always wins) without\r\n // paying that cost on every intermediate value.\r\n clearTimeout(this._persistTimer);\r\n this._persistTimer = setTimeout(() => this.persist(doc), 400);\r\n }\r\n\r\n undo() {\r\n const hist = this.state.history.slice(); const prev = hist.pop(); if (!prev) return;\r\n const doc = JSON.parse(prev);\r\n this.setState({ doc, history: hist, future: this.state.future.concat(JSON.stringify(this.state.doc)), sel: null }, () => this.persist(doc));\r\n }\r\n\r\n redo() {\r\n const fut = this.state.future.slice(); const next = fut.pop(); if (!next) return;\r\n const doc = JSON.parse(next);\r\n this.setState({ doc, future: fut, history: this.state.history.concat(JSON.stringify(this.state.doc)), sel: null }, () => this.persist(doc));\r\n }\r\n\r\n flash(msg) {\r\n // Direct mutation + surgical refresh (same reason as persist above): the\r\n // toast's auto-dismissal 1.9s later was a spontaneous full re-render --\r\n // it destroyed any dropdown the user had opened since, to hide a label.\r\n this.state.toast = msg;\r\n if (this.onToast) this.onToast(); else this.setState({ toast: msg });\r\n clearTimeout(this.tt);\r\n this.tt = setTimeout(() => {\r\n this.state.toast = null;\r\n if (this.onToast) this.onToast(); else this.setState({ toast: null });\r\n }, 1900);\r\n }\r\n select(type, id) { this.setState({ sel: { type, id }, tab: 'design' }); }\r\n\r\n find(doc, id) {\r\n for (const r of doc.rows) {\r\n if (r.id === id) return { row: r };\r\n for (let ci = 0; ci < r.cols.length; ci++) {\r\n const bi = r.cols[ci].blocks.findIndex((b) => b.id === id);\r\n if (bi > -1) return { row: r, col: r.cols[ci], ci, bi, block: r.cols[ci].blocks[bi] };\r\n }\r\n }\r\n return {};\r\n }\r\n\r\n selObj() { return this.state.sel ? this.find(this.state.doc, this.state.sel.id) : {}; }\r\n\r\n setProp(id, key, val) {\r\n this.commit((doc) => {\r\n const f = this.find(doc, id);\r\n const target = f.block ? f.block.props : (f.row ? f.row.props : null);\r\n if (target) target[key] = val;\r\n });\r\n }\r\n\r\n setTheme(key, val) { this.commit((doc) => { doc.theme[key] = val; }); }\r\n\r\n /** Column-level styling (`bg`, `radius`, `padY`, `padX` on a col object -- all optional, absent means unstyled). What lets one section hold differently-colored card columns, which row-level props can't express. */\r\n setColProp(rowId, ci, key, val) {\r\n this.commit((doc) => {\r\n const row = this.find(doc, rowId).row;\r\n if (row && row.cols[ci]) row.cols[ci][key] = val;\r\n });\r\n }\r\n\r\n /**\r\n * Sections store padding as a linked pair (`py` top+bottom, `px`\r\n * left+right). Splitting copies the pair onto the four side props so\r\n * nothing moves visually at the moment of the toggle; re-linking folds the\r\n * sides back to their averages and deletes the overrides -- rendering\r\n * falls back to the pair wherever a side prop is absent (layout-style.js\r\n * `rowPad`), which is also what keeps pre-split documents rendering\r\n * unchanged.\r\n */\r\n togglePadSplit(id) {\r\n this.commit((doc) => {\r\n const f = this.find(doc, id);\r\n const row = f.row; if (!row) return;\r\n const p = row.props;\r\n const on = !p.padSplit;\r\n if (on) {\r\n if (p.pt === undefined) { p.pt = p.py; p.pb = p.py; p.pl = p.px; p.pr = p.px; }\r\n } else {\r\n p.py = Math.round(((p.pt ?? p.py) + (p.pb ?? p.py)) / 2);\r\n p.px = Math.round(((p.pl ?? p.px) + (p.pr ?? p.px)) / 2);\r\n delete p.pt; delete p.pb; delete p.pl; delete p.pr;\r\n }\r\n p.padSplit = on;\r\n });\r\n }\r\n\r\n // ---- tree mutations -----------------------------------------------------\r\n\r\n insertBlock(type, rowId, ci, index) {\r\n const block = mk(type);\r\n this.commit((doc) => {\r\n if (this.state.mode === 'stack' || !rowId) {\r\n doc.rows.splice(typeof index === 'number' ? index : doc.rows.length, 0, mkRow([100], [block]));\r\n } else {\r\n const f = this.find(doc, rowId);\r\n const col = f.row.cols[ci] || f.row.cols[0];\r\n col.blocks.splice(typeof index === 'number' ? index : col.blocks.length, 0, block);\r\n }\r\n });\r\n this.setState({ sel: { type: 'block', id: block.id }, tab: 'design', drop: null, rowDrop: null });\r\n }\r\n\r\n insertGroup(id, rowId, ci, index) {\r\n const gr = GROUPS[id]; if (!gr) return;\r\n const rows = gr.build();\r\n if (rowId) {\r\n const blocks = rows.reduce((acc, r) => acc.concat(r.cols.reduce((a, c) => a.concat(c.blocks), [])), []);\r\n this.commit((doc) => {\r\n const f = this.find(doc, rowId);\r\n const col = f.row.cols[ci] || f.row.cols[0];\r\n col.blocks.splice(typeof index === 'number' ? index : col.blocks.length, 0, ...blocks);\r\n });\r\n this.setState({ sel: blocks[0] ? { type: 'block', id: blocks[0].id } : null, tab: 'design', drop: null, rowDrop: null });\r\n return;\r\n }\r\n this.commit((doc) => { doc.rows.splice(typeof index === 'number' ? index : doc.rows.length, 0, ...rows); });\r\n this.setState({ sel: { type: 'row', id: rows[0].id }, tab: 'design', drop: null, rowDrop: null });\r\n }\r\n\r\n insertRow(spans, index, withHtml) {\r\n const row = withHtml ? mkRow([100], [mk('html')]) : mkRow(spans);\r\n if (withHtml) { row.props.py = 0; row.props.px = 0; }\r\n this.commit((doc) => { doc.rows.splice(typeof index === 'number' ? index : doc.rows.length, 0, row); });\r\n this.setState({ sel: { type: withHtml ? 'block' : 'row', id: withHtml ? row.cols[0].blocks[0].id : row.id }, tab: 'design', drop: null, rowDrop: null });\r\n }\r\n\r\n moveBlock(blockId, rowId, ci, index) {\r\n this.commit((doc) => {\r\n const from = this.find(doc, blockId); if (!from.block) return;\r\n const [b] = from.col.blocks.splice(from.bi, 1);\r\n const to = this.find(doc, rowId);\r\n if (!to.row) { doc.rows.push(mkRow([100], [b])); return; }\r\n const col = to.row.cols[ci] || to.row.cols[0];\r\n let at = typeof index === 'number' ? index : col.blocks.length;\r\n if (col === from.col && from.bi < at) at--;\r\n col.blocks.splice(at, 0, b);\r\n });\r\n this.setState({ drop: null, rowDrop: null });\r\n }\r\n\r\n moveRow(rowId, index) {\r\n this.commit((doc) => {\r\n const i = doc.rows.findIndex((r) => r.id === rowId); if (i < 0) return;\r\n const [r] = doc.rows.splice(i, 1);\r\n let at = index; if (i < at) at--;\r\n doc.rows.splice(Math.max(0, Math.min(at, doc.rows.length)), 0, r);\r\n });\r\n this.setState({ drop: null, rowDrop: null });\r\n }\r\n\r\n moveBlockToNewRow(blockId, index) {\r\n this.commit((doc) => {\r\n const f = this.find(doc, blockId); if (!f.block) return;\r\n const [b] = f.col.blocks.splice(f.bi, 1);\r\n doc.rows.splice(index, 0, mkRow([100], [b]));\r\n });\r\n this.setState({ drop: null, rowDrop: null });\r\n }\r\n\r\n dupSel() {\r\n const sel = this.state.sel; if (!sel) return;\r\n this.commit((doc) => {\r\n const f = this.find(doc, sel.id);\r\n if (f.block) { const c = clone(f.block); c.id = uid(); f.col.blocks.splice(f.bi + 1, 0, c); }\r\n else if (f.row) {\r\n const c = clone(f.row); c.id = uid();\r\n c.cols.forEach((col) => { col.id = uid(); col.blocks.forEach((b) => { b.id = uid(); }); });\r\n doc.rows.splice(doc.rows.indexOf(f.row) + 1, 0, c);\r\n }\r\n });\r\n this.flash(this.t('toast.duplicated'));\r\n }\r\n\r\n delSel() {\r\n const sel = this.state.sel; if (!sel) return;\r\n this.commit((doc) => {\r\n const f = this.find(doc, sel.id);\r\n if (f.block) f.col.blocks.splice(f.bi, 1);\r\n else if (f.row) doc.rows.splice(doc.rows.indexOf(f.row), 1);\r\n });\r\n this.setState({ sel: null });\r\n }\r\n\r\n nudge(id, dir) {\r\n this.commit((doc) => {\r\n const f = this.find(doc, id);\r\n if (f.block) {\r\n const at = f.bi + dir; if (at < 0 || at >= f.col.blocks.length) return;\r\n const [b] = f.col.blocks.splice(f.bi, 1); f.col.blocks.splice(at, 0, b);\r\n } else if (f.row) {\r\n const i = doc.rows.indexOf(f.row); const at = i + dir;\r\n if (at < 0 || at >= doc.rows.length) return;\r\n const [r] = doc.rows.splice(i, 1); doc.rows.splice(at, 0, r);\r\n }\r\n });\r\n }\r\n\r\n // ---- drag & drop --------------------------------------------------------\r\n\r\n startDrag(payload) {\r\n return (e) => {\r\n this.drag = payload;\r\n try { e.dataTransfer.setData('text/plain', JSON.stringify(payload)); e.dataTransfer.effectAllowed = 'copyMove'; } catch { /* ignore */ }\r\n };\r\n }\r\n\r\n indexFromPoint(el, y) {\r\n if (!el || !el.children) return 0;\r\n const kids = Array.from(el.children).filter((c) => c.getAttribute && c.getAttribute('data-mc-slot') === '1');\r\n let idx = kids.length;\r\n for (let i = 0; i < kids.length; i++) {\r\n const r = kids[i].getBoundingClientRect();\r\n if (r.height === 0) continue;\r\n if (y < r.top + r.height / 2) { idx = i; break; }\r\n }\r\n return idx;\r\n }\r\n\r\n colDragOver(rowId, ci) {\r\n return (e) => {\r\n const d = this.drag; if (!d) return;\r\n e.preventDefault(); e.stopPropagation();\r\n if (d.kind === 'row' || d.kind === 'move-row') return;\r\n const index = this.indexFromPoint(e.currentTarget, e.clientY);\r\n const cur = this.state.drop;\r\n if (!cur || cur.rowId !== rowId || cur.ci !== ci || cur.index !== index) this.setState({ drop: { rowId, ci, index }, rowDrop: null });\r\n };\r\n }\r\n\r\n colDrop(rowId, ci) {\r\n return (e) => {\r\n const d = this.drag; if (!d) return;\r\n e.preventDefault(); e.stopPropagation();\r\n const index = this.indexFromPoint(e.currentTarget, e.clientY);\r\n if (d.kind === 'block') this.insertBlock(d.type, rowId, ci, index);\r\n else if (d.kind === 'move-block') this.moveBlock(d.id, rowId, ci, index);\r\n else if (d.kind === 'group') this.insertGroup(d.id, rowId, ci, index);\r\n else if (d.kind === 'asset') this.dropAsset(d.assetId, rowId, ci, index);\r\n this.drag = null;\r\n };\r\n }\r\n\r\n canvasDragOver = (e) => {\r\n const d = this.drag; if (!d) return;\r\n e.preventDefault();\r\n const index = this.indexFromPoint(e.currentTarget, e.clientY);\r\n if (this.state.rowDrop !== index) this.setState({ rowDrop: index, drop: null });\r\n };\r\n\r\n canvasDrop = (e) => {\r\n const d = this.drag; if (!d) return;\r\n e.preventDefault();\r\n const index = this.indexFromPoint(e.currentTarget, e.clientY);\r\n if (d.kind === 'row') this.insertRow(d.spans, index, d.html);\r\n else if (d.kind === 'move-row') this.moveRow(d.id, index);\r\n else if (d.kind === 'block') this.insertBlock(d.type, null, 0, index);\r\n else if (d.kind === 'move-block') this.moveBlockToNewRow(d.id, index);\r\n else if (d.kind === 'group') this.insertGroup(d.id, null, 0, index);\r\n else if (d.kind === 'asset') this.dropAsset(d.assetId, null, 0, index);\r\n this.drag = null;\r\n };\r\n\r\n dropAsset(assetId, rowId, ci, index) {\r\n const a = this.state.assets.find((x) => x.id === assetId); if (!a) return;\r\n const block = mk('image');\r\n block.props.src = a.url; block.props.alt = a.name.replace(/\\.[a-z]+$/i, '').replace(/[-_]/g, ' ');\r\n this.commit((doc) => {\r\n if (!rowId || this.state.mode === 'stack') doc.rows.splice(typeof index === 'number' ? index : doc.rows.length, 0, mkRow([100], [block]));\r\n else {\r\n const f = this.find(doc, rowId); const col = f.row.cols[ci] || f.row.cols[0];\r\n col.blocks.splice(typeof index === 'number' ? index : col.blocks.length, 0, block);\r\n }\r\n });\r\n this.setState({ sel: { type: 'block', id: block.id }, tab: 'design', drop: null, rowDrop: null });\r\n }\r\n\r\n // ---- assets --------------------------------------------------------------\r\n\r\n /**\r\n * Host-supplied storage. Assigning one takes the library over completely:\r\n * the seeded demo files go away, folders and pages come from the backend,\r\n * and every upload and delete round-trips through the provider. Assigning\r\n * `null` restores the built-in behaviour.\r\n */\r\n setStorageProvider(provider) {\r\n const problems = provider ? providerProblems(provider) : [];\r\n if (problems.length) { console.warn('[mailcraft] ' + problems.join('; ')); return; }\r\n this.storageProvider = provider || null;\r\n this.abortAssets('list');\r\n this.abortAssets('upload');\r\n if (!provider) {\r\n this.setState({ assets: seedAssets(), folders: null, assetFolder: FOLDERS[0], assetCursor: null, assetsError: null });\r\n return;\r\n }\r\n this.setState({ assets: [], folders: null, assetFolder: ALL_FOLDER_ID, assetCursor: null, assetsError: null, assetsLoaded: false });\r\n // Surface a missing upload policy while the integrator is looking at the\r\n // console, not later when a user drops a file and gets a refusal. Deferred\r\n // a turn because `storageProvider` and `storageLimits` are normally set on\r\n // consecutive lines, in either order.\r\n clearTimeout(this._limitsWarnTimer);\r\n this._limitsWarnTimer = setTimeout(() => {\r\n if (this.storageProvider && limitsProblem(this.limits())) {\r\n console.warn('[mailcraft] storageProvider is set but storageLimits is not -- every upload will be refused. See core/storage-limits.js.');\r\n }\r\n }, 0);\r\n this.refreshAssets();\r\n }\r\n\r\n /**\r\n * Applies a host-supplied template as an undoable edit. Template galleries\r\n * are host UI, not editor UI -- there is no tab and no catalogue in the\r\n * package -- so this method is the whole seam. Accepts `doc` (a document\r\n * object), `build()` (one made per use), or raw `html` (run through the\r\n * importer). The other direction is `getContent()`, which is how a host\r\n * captures the current document to store as a template of its own.\r\n */\r\n loadTemplate(tpl) {\r\n if (!tpl) return;\r\n const built = typeof tpl.build === 'function' ? tpl.build()\r\n : tpl.doc ? tpl.doc\r\n : (typeof tpl.html === 'string' && tpl.html.trim()) ? docFromHtml(tpl.html)\r\n : null;\r\n if (!built) return;\r\n const doc = normalizeDoc(JSON.parse(JSON.stringify(built)));\r\n if (!doc) return;\r\n this.docSetByHost = true;\r\n this.setState({\r\n doc,\r\n sel: null,\r\n history: this.state.history.concat(JSON.stringify(this.state.doc)),\r\n future: [],\r\n }, () => this.persist(doc));\r\n this.flash(this.t('toast.templateLoaded', { name: tpl.name || '' }));\r\n }\r\n\r\n setStorageLimits(limits) { this.storageLimits = limits || null; this.emit(); }\r\n\r\n /**\r\n * Listings and uploads get separate abort scopes on purpose. Changing folder\r\n * should cancel the listing it supersedes, but must not kill uploads already\r\n * in flight -- a user who drops files and then browses elsewhere still wants\r\n * those files. Both are cancelled when the provider changes or the editor\r\n * unmounts.\r\n *\r\n * A provider that ignores `signal` simply runs to completion; `refreshAssets`\r\n * still discards the superseded result by token, so cancellation is an\r\n * optimisation on top of correctness, not the thing that provides it.\r\n */\r\n abortAssets(scope) {\r\n const key = scope === 'upload' ? '_uploadAbort' : '_listAbort';\r\n if (this[key]) this[key].abort();\r\n this[key] = typeof AbortController === 'function' ? new AbortController() : null;\r\n return this[key] ? this[key].signal : undefined;\r\n }\r\n\r\n /** `editor.storageLimits` over `provider.limits`, per key. */\r\n limits() { return resolveLimits(this.storageLimits, this.storageProvider && this.storageProvider.limits); }\r\n\r\n /** Sidebar entries. Counts appear only where they are actually known -- a cursor-paged backend cannot say how many files a folder holds without walking all of it, and a wrong count is worse than none. */\r\n folderOptions() {\r\n const s = this.state;\r\n if (!this.storageProvider) {\r\n return FOLDERS.map((name) => ({\r\n id: name,\r\n name,\r\n count: name === FOLDERS[0] ? s.assets.length : s.assets.filter((a) => a.folder === name).length,\r\n }));\r\n }\r\n return [{ id: ALL_FOLDER_ID, name: this.t('library.allFiles'), count: null }]\r\n .concat((s.folders || []).map((f) => ({ id: f.id, name: f.name, count: null })));\r\n }\r\n\r\n /** With a provider, folder and search are the backend's job -- re-filtering the current page here would hide matches that live on the next one. */\r\n visibleAssets() {\r\n const s = this.state;\r\n if (this.storageProvider) return s.assets;\r\n const q = (s.assetQuery || '').trim().toLowerCase();\r\n return s.assets.filter((a) => (s.assetFolder === FOLDERS[0] || a.folder === s.assetFolder) && (!q || a.name.toLowerCase().includes(q)));\r\n }\r\n\r\n openLibrary(assetTarget) {\r\n this.setState({ libraryOpen: true, assetTarget: assetTarget || null });\r\n if (this.storageProvider && !this.state.assetsLoaded && !this.state.assetsLoading) this.refreshAssets();\r\n }\r\n\r\n setAssetFolder(id) {\r\n this.setState({ assetFolder: id });\r\n if (this.storageProvider) this.refreshAssets();\r\n }\r\n\r\n setAssetQuery(q) {\r\n this.setState({ assetQuery: q });\r\n if (!this.storageProvider) return;\r\n clearTimeout(this._searchTimer);\r\n this._searchTimer = setTimeout(() => this.refreshAssets(), 320);\r\n }\r\n\r\n /**\r\n * Loads a page from the provider; `append` continues from the cursor the last\r\n * page returned. Each run takes a token and drops its own result if another\r\n * run started meanwhile, so a slow query for a folder the user has already\r\n * navigated away from cannot overwrite the list they are now looking at.\r\n */\r\n async refreshAssets({ append = false } = {}) {\r\n const provider = this.storageProvider;\r\n if (!provider) return;\r\n const token = (this._assetToken = (this._assetToken || 0) + 1);\r\n const signal = this.abortAssets('list');\r\n this.setState({ assetsLoading: true, assetsError: null });\r\n try {\r\n if (!this.state.folders && provider.folders) {\r\n // A folder list is optional chrome; failing to get one must not take\r\n // the file list down with it.\r\n try {\r\n const folders = await provider.folders({ signal });\r\n if (token === this._assetToken) this.setState({ folders });\r\n } catch { /* ignore */ }\r\n }\r\n const page = await provider.list({\r\n folderId: this.folderId(),\r\n cursor: append ? this.state.assetCursor : null,\r\n query: (this.state.assetQuery || '').trim(),\r\n signal,\r\n });\r\n if (token !== this._assetToken) return;\r\n const items = ((page && page.items) || []).map((a) => normalizeAsset(a));\r\n this.setState({\r\n assets: append ? this.state.assets.concat(items) : items,\r\n assetCursor: (page && page.cursor) || null,\r\n assetsLoading: false,\r\n assetsLoaded: true,\r\n });\r\n } catch (e) {\r\n // An abort is this class superseding its own request -- not a failure to\r\n // report, and the run that replaced it owns the UI now.\r\n if (token !== this._assetToken || (e && e.name === 'AbortError')) return;\r\n this.setState({ assetsLoading: false, assetsError: (e && e.message) || String(e) });\r\n }\r\n }\r\n\r\n loadMoreAssets() { if (this.state.assetCursor && !this.state.assetsLoading) this.refreshAssets({ append: true }); }\r\n\r\n /** The selected folder as the provider sees it; the built-in \"all files\" entry is not a real folder. */\r\n folderId() { return this.state.assetFolder === FOLDERS[0] ? ALL_FOLDER_ID : this.state.assetFolder; }\r\n\r\n /**\r\n * Validate, then upload. Both halves are the host's policy: what may be\r\n * uploaded comes from `storageLimits`, where it goes comes from the provider.\r\n *\r\n * With neither configured this is the original prototype behaviour. With a\r\n * provider but no limits it refuses -- that combination is a misconfiguration\r\n * rather than a mode, and quietly accepting anything is the exact thing the\r\n * limits exist to prevent.\r\n */\r\n async addFiles(list) {\r\n const files = Array.from(list || []);\r\n if (!files.length) return;\r\n const provider = this.storageProvider;\r\n const limits = this.limits();\r\n\r\n if (!provider && !limits) { this.addFilesAsDataUrls(files); return; }\r\n\r\n const { accepted, rejected } = await validateFiles(files, limits);\r\n // The first reason shows immediately; the rest queue behind it, spaced a\r\n // little longer than a toast lives. A ten-file drop where nothing passes\r\n // would otherwise show only whichever rejection happened to land last.\r\n rejected.forEach((r, i) => {\r\n if (i === 0) this.flash(this.t(r.key, r.params));\r\n else setTimeout(() => this.flash(this.t(r.key, r.params)), i * 2100);\r\n });\r\n if (!accepted.length) return;\r\n if (!provider) { this.addFilesAsDataUrls(accepted.map((a) => a.file)); return; }\r\n\r\n const folderId = this.folderId();\r\n const signal = this.abortAssets('upload');\r\n // Results are written by index rather than pushed, so the library shows the\r\n // files in the order they were dropped however the pool happens to finish.\r\n const results = new Array(accepted.length);\r\n let next = 0;\r\n this.setState({ uploading: accepted.length });\r\n\r\n const worker = async () => {\r\n for (let i = next++; i < accepted.length; i = next++) {\r\n const item = accepted[i];\r\n try {\r\n const asset = await provider.upload(item.file, { folderId, width: item.w, height: item.ht, signal });\r\n results[i] = normalizeAsset(asset, item);\r\n } catch (e) {\r\n if (!(e && e.name === 'AbortError')) {\r\n this.flash(this.t('storage.errUploadFailed', { name: item.name, reason: (e && e.message) || '' }));\r\n }\r\n }\r\n this.setState({ uploading: Math.max(0, this.state.uploading - 1) });\r\n }\r\n };\r\n await Promise.all(Array.from({ length: Math.min(UPLOAD_CONCURRENCY, accepted.length) }, worker));\r\n\r\n this.setState({ uploading: 0 });\r\n const added = results.filter(Boolean);\r\n if (added.length) this.finishUpload(added);\r\n }\r\n\r\n /**\r\n * The no-provider path, unchanged from the prototype and kept so the package\r\n * still runs with nothing wired. Worth knowing before shipping on it: Gmail\r\n * and Outlook both strip `data:` images, so this is a demo mode, not a way to\r\n * send mail.\r\n */\r\n addFilesAsDataUrls(list) {\r\n const files = Array.from(list || []).filter((f) => /^image\\//.test(f.type));\r\n if (!files.length) return;\r\n let pending = files.length; const added = [];\r\n const done = () => { if (--pending === 0 && added.length) this.finishUpload(added); };\r\n files.forEach((f) => {\r\n const fr = new FileReader();\r\n fr.onload = () => {\r\n const img = new Image();\r\n img.onload = () => { added.push({ id: uid(), name: f.name, url: fr.result, folder: 'Uploads', w: img.width, ht: img.height, size: f.size }); done(); };\r\n img.onerror = () => { added.push({ id: uid(), name: f.name, url: fr.result, folder: 'Uploads', w: 0, ht: 0, size: f.size }); done(); };\r\n img.src = fr.result;\r\n };\r\n fr.onerror = done;\r\n fr.readAsDataURL(f);\r\n });\r\n }\r\n\r\n finishUpload(added) {\r\n const assets = added.concat(this.state.assets);\r\n const patch = { assets, libHot: false };\r\n // \"Uploads\" is a real folder only in the built-in seed set; with a provider\r\n // the file already sits in whichever folder the user was looking at.\r\n if (!this.storageProvider) patch.assetFolder = 'Uploads';\r\n this.setState(patch, () => { if (!this.storageProvider) this.persist(null, assets); });\r\n this.flash(added.length === 1 ? this.t('toast.fileUploadedOne') : this.t('toast.fileUploadedMany', { count: added.length }));\r\n }\r\n\r\n /** DEL on a library tile. Where the provider owns the file, a failed delete leaves the tile alone rather than showing a removal that did not happen. */\r\n async removeAsset(a) {\r\n const provider = this.storageProvider;\r\n if (provider && provider.remove) {\r\n try { await provider.remove(a); }\r\n catch (e) { this.flash(this.t('storage.errDeleteFailed', { name: a.name, reason: (e && e.message) || '' })); return; }\r\n }\r\n const assets = this.state.assets.filter((x) => x.id !== a.id);\r\n this.setState({ assets }, () => { if (!provider) this.persist(null, assets); });\r\n this.flash(this.t('toast.assetDeleted', { name: a.name }));\r\n }\r\n\r\n useAsset(a) {\r\n const t = this.state.assetTarget;\r\n if (t) {\r\n this.setProp(t.id || t, t.key || 'src', a.url);\r\n this.setState({ libraryOpen: false, assetTarget: null });\r\n this.flash(this.t('toast.imageReplaced'));\r\n } else {\r\n const block = mk('image');\r\n block.props.src = a.url; block.props.alt = a.name.replace(/\\.[a-z]+$/i, '').replace(/[-_]/g, ' ');\r\n const sel = this.selObj();\r\n this.commit((doc) => {\r\n if (sel.row && this.state.mode === 'rows') this.find(doc, sel.row.id).row.cols[sel.ci || 0].blocks.push(block);\r\n else doc.rows.push(mkRow([100], [block]));\r\n });\r\n this.setState({ libraryOpen: false, sel: { type: 'block', id: block.id }, tab: 'design' });\r\n this.flash(this.t('toast.imageAdded'));\r\n }\r\n }\r\n\r\n // ---- export / code view --------------------------------------------------\r\n\r\n buildHtml() { return buildHtmlFn(this.state, this.exportRoot, boxCss); }\r\n\r\n openExport = () => {\r\n this.setState({ exportOpen: true, exportCode: this.buildHtml(), copied: false, libraryOpen: false, aiOpen: false, codeOpen: false });\r\n };\r\n\r\n copyExport = () => {\r\n if (navigator.clipboard) navigator.clipboard.writeText(this.state.exportCode).then(() => this.setState({ copied: true }), () => this.setState({ copied: true }));\r\n else this.setState({ copied: true });\r\n this.flash(this.t('toast.htmlCopied'));\r\n };\r\n\r\n downloadExport = () => {\r\n const blob = new Blob([this.state.exportCode], { type: 'text/html' });\r\n const a = document.createElement('a');\r\n a.href = URL.createObjectURL(blob);\r\n a.download = 'email.html';\r\n a.click();\r\n setTimeout(() => URL.revokeObjectURL(a.href), 1500);\r\n };\r\n\r\n openCode = () => {\r\n const src = this.buildHtml();\r\n this.setState({ codeOpen: true, codeSrc: src, codeLive: src, codeDirty: false, libraryOpen: false, exportOpen: false, aiOpen: false });\r\n };\r\n\r\n setCodeSrc = (value) => {\r\n // Source typing only changes the code editor surface. Updating the state\r\n // directly and asking that surface to repaint avoids rebuilding the full\r\n // canvas and inspector on every keystroke.\r\n this.state.codeSrc = value;\r\n this.state.codeDirty = true;\r\n if (this.onCodeSourceChange) this.onCodeSourceChange();\r\n clearTimeout(this.codeTimer);\r\n this.codeTimer = setTimeout(() => this.setState({ codeLive: this.state.codeSrc }), 350);\r\n };\r\n\r\n /** Shared HTML -> doc entry point for both the Code modal's \"Apply\" action and the host-facing `importHtml` API. Recognizable shapes (image/button/heading/text/divider/list/table, per `core/import-html.js`) become native blocks; anything structural that can't be classified falls back to one raw `html` block per row, and a totally unparseable/empty result falls back to a single row wrapping the whole body -- content is never dropped. Returns the number of rows produced. */\r\n importHtml(src) {\r\n const { rows, theme } = parseHtmlSource(src);\r\n this.docSetByHost = true;\r\n // The theme patch carries only keys the source actually declared (page\r\n // background, content width, font stack) -- merged, not replaced, so an\r\n // import that says nothing about e.g. link color leaves it alone.\r\n this.commit((doc) => { doc.rows = rows; Object.assign(doc.theme, theme); });\r\n return rows.length;\r\n }\r\n\r\n applyCode = () => {\r\n try {\r\n const n = this.importHtml(this.state.codeSrc);\r\n this.setState({ codeOpen: false, codeDirty: false, sel: null });\r\n this.flash(n === 1 ? this.t('toast.sourceAppliedOne') : this.t('toast.sourceAppliedMany', { rows: n }));\r\n } catch {\r\n this.flash(this.t('toast.parseError'));\r\n }\r\n };\r\n\r\n // ---- AI copy ---------------------------------------------------------\r\n\r\n runAi = async () => {\r\n const { aiGoal, aiTone, aiBrief } = this.state;\r\n this.setState({ aiBusy: true, aiResults: [] });\r\n const prompt = 'You write marketing email copy. Goal: ' + aiGoal + '. Tone: ' + aiTone + '. Brief: ' + aiBrief +\r\n '. Return ONLY JSON: {\"headline\":\"...\",\"body\":\"...\",\"cta\":\"...\"} — body max 55 words, plain sentences, no emoji, may use {{ first_name }}.';\r\n let out = null;\r\n try {\r\n if (this.aiProvider) {\r\n const raw = await this.aiProvider(prompt);\r\n const m = String(raw).match(/\\{[\\s\\S]*\\}/);\r\n if (m) out = JSON.parse(m[0]);\r\n }\r\n } catch { out = null; }\r\n if (!out) {\r\n const s = (aiBrief || 'the new drop').replace(/\\.$/, '');\r\n out = {\r\n headline: s.split(/[,.]/)[0].slice(0, 58),\r\n body: 'Hi {{ first_name }} — ' + s + '. We kept it short: one link, one decision, no pressure.',\r\n cta: 'See it',\r\n };\r\n }\r\n const addText = (html, size, msg) => { const b = mk('text'); b.props.html = html; if (size) b.props.size = size; this.commit((doc) => { doc.rows.push(mkRow([100], [b])); }); this.setState({ aiOpen: false, sel: { type: 'block', id: b.id }, tab: 'design' }); this.flash(msg); };\r\n this.setState({\r\n aiBusy: false,\r\n aiResults: [\r\n { kind: this.t('ai.kindHeadline'), text: out.headline, action: this.t('ai.actionInsertHeading'), onUse: () => addText('<strong style=\"font-size:27px;line-height:1.15;display:block\">' + out.headline + '</strong>', 16, this.t('toast.headingAdded')) },\r\n { kind: this.t('ai.kindBody'), text: out.body, action: this.t('ai.actionInsertText'), onUse: () => addText(out.body, 16, this.t('toast.textBlockAdded')) },\r\n { kind: this.t('ai.kindButton'), text: out.cta, action: this.t('ai.actionInsertButton'), onUse: () => { const b = mk('button'); b.props.label = out.cta; this.commit((doc) => { doc.rows.push(mkRow([100], [b])); }); this.setState({ aiOpen: false, sel: { type: 'block', id: b.id }, tab: 'design' }); this.flash(this.t('toast.buttonAdded')); } },\r\n ],\r\n });\r\n };\r\n\r\n // ---- variables -----------------------------------------------------------\r\n\r\n // ---- inspector field descriptors (ported from fields()/boxFields()/themeFields()) --\r\n\r\n boxFields() {\r\n const f = this.selObj();\r\n if (!f.block) return [];\r\n const b = f.block;\r\n const B = binder(() => this.find(this.state.doc, b.id).block.props, (k, v) => this.setProp(b.id, k, v), this);\r\n return decorate([\r\n B.head('Box & border'),\r\n B.color('Background color', 'bBg'),\r\n B.range('Border thickness', 'bBorder', 0, 20, 1, 'px'),\r\n ...(b.props.bBorder ? [\r\n B.sel('Border style', 'bStyle', BORDER_STYLES), B.color('Border color', 'bLine'),\r\n B.tog('Top border', 'bTop', true), B.tog('Right border', 'bRight', true),\r\n B.tog('Bottom border', 'bBottom', true), B.tog('Left border', 'bLeft', true),\r\n ] : []),\r\n B.range('Rounded corners', 'bRadius', 0, 100, 1, 'px'),\r\n B.range('Space inside', 'bPad', 0, 100, 2, 'px'),\r\n ]);\r\n }\r\n\r\n fields() {\r\n const sel = this.state.sel; if (!sel) return [];\r\n const f = this.selObj();\r\n const ALIGN = [{ value: 'left', label: 'Left' }, { value: 'center', label: 'Center' }, { value: 'right', label: 'Right' }];\r\n if (f.block) {\r\n const b = f.block;\r\n const B = binder(() => this.find(this.state.doc, b.id).block.props, (k, v) => this.setProp(b.id, k, v), this);\r\n // No leading \"Block — X\" head: the sticky panel header directly above\r\n // already reads \"Block properties / X\", so it only added a duplicate\r\n // line and a dead divider strip under the title.\r\n const base = [];\r\n const padF = [B.head('Spacing'), group(null, [B.range('Above & below', 'py', 0, 160, 2, 'px'), B.range('Left & right', 'px', 0, 120, 2, 'px')])];\r\n switch (b.type) {\r\n case 'text': return decorate(base.concat(\r\n /<a(?:\\s|>)/i.test(String(b.props.html || ''))\r\n ? [{ kind: 'richLinks', label: 'Links', html: b.props.html || '', onChange: (v) => this.setProp(b.id, 'html', v) }]\r\n : [],\r\n [B.area('Text', 'html'), B.sel('Font', 'fontFamily', this.fontOptions(true)), B.range('Text size', 'size', 8, 96, 1, 'px'), B.range('Line spacing', 'lh', 0.8, 3, 0.05, ''), B.seg('Align', 'align', ALIGN), B.sel('Text weight', 'weight', [{ value: '400', label: 'Regular' }, { value: '500', label: 'Medium' }, { value: '700', label: 'Bold' }]), B.color('Text color', 'color')], padF));\r\n case 'image': return decorate(base.concat([B.btn('Choose from library', () => this.openLibrary({ id: b.id, key: 'src' })), B.text('Alt text', 'alt', 'Describe the image'), B.text('Link URL', 'href', 'https://'), B.range('Width', 'width', 5, 100, 1, '%'), B.seg('Align', 'align', ALIGN), B.range('Rounded corners', 'radius', 0, 200, 1, 'px')], padF));\r\n case 'button': return decorate(base.concat([B.text('Label', 'label'), B.text('Link URL', 'href', 'https://'), B.color('Button color', 'bg'), B.color('Text color', 'color'), B.sel('Font', 'fontFamily', this.fontOptions(true)), B.range('Text size', 'size', 8, 48, 1, 'px'), B.range('Rounded corners', 'radius', 0, 60, 1, 'px'), B.range('Outline thickness', 'borderW', 0, 6, 1, 'px')].concat(b.props.borderW ? [B.sel('Outline style', 'borderStyle', BORDER_STYLES), B.color('Outline color', 'borderColor')] : []).concat([B.range('Button height', 'py', 0, 60, 1, 'px'), B.range('Button width', 'px', 0, 120, 2, 'px'), B.seg('Align', 'align', ALIGN), B.tog('Full width', 'full')])));\r\n case 'divider': return decorate(base.concat([B.range('Thickness', 'thickness', 1, 20, 1, 'px'), B.sel('Line style', 'lineStyle', BORDER_STYLES), B.range('Width', 'width', 5, 100, 5, '%'), B.color('Color', 'color'), B.range('Space above & below', 'py', 0, 160, 2, 'px')]));\r\n case 'spacer': return decorate(base.concat([B.range('Height', 'height', 0, 400, 2, 'px')]));\r\n case 'social': return decorate(base.concat([\r\n // Custom kind (render/fields.js `renderSocialItems`): a per-network\r\n // card list with an add-dropdown, replacing the raw Name|URL\r\n // textarea. Same `items` string underneath.\r\n { kind: 'social', label: 'Networks', value: b.props.items || '', onChange: (v) => this.setProp(b.id, 'items', v) },\r\n B.seg('Icon palette', 'palette', [{ value: 'custom', label: 'Custom' }, { value: 'brand', label: 'Brand' }]),\r\n B.seg('Icon shape', 'shape', [{ value: 'outline', label: 'Outline' }, { value: 'bare', label: 'Bare' }, { value: 'circle', label: 'Circle' }, { value: 'square', label: 'Square' }]),\r\n B.tog('Show network names', 'showLabel'),\r\n B.sel('Font', 'fontFamily', this.fontOptions(true)),\r\n B.seg('Align', 'align', ALIGN), B.range('Icon size', 'size', 10, 64, 1, 'px'), B.range('Space between icons', 'gap', 0, 80, 2, 'px'), B.color('Icon color', 'color'),\r\n ]));\r\n case 'video': return decorate(base.concat([B.btn('Choose thumbnail', () => this.openLibrary({ id: b.id, key: 'src' })), B.text('Video URL', 'href', 'https://'), B.text('Caption', 'caption'), B.color('Badge color', 'badge')]));\r\n case 'html': return decorate(base.concat([B.area('Raw HTML', 'code')]));\r\n case 'countdown': return decorate(base.concat([B.text('Ends at (YYYY-MM-DDTHH:MM)', 'target'), B.text('Label', 'label'), B.sel('Font', 'fontFamily', this.fontOptions(true)), B.color('Color', 'color')]));\r\n case 'menu': return decorate(base.concat([B.area('Items — one per line as Label|URL', 'items'), B.seg('Align', 'align', ALIGN), B.sel('Font', 'fontFamily', this.fontOptions(true)), B.range('Text size', 'size', 8, 32, 1, 'px'), B.range('Space between items', 'gap', 0, 80, 2, 'px'), B.color('Text color', 'color')]));\r\n case 'heading': return decorate(base.concat([B.area('Text', 'text'), B.sel('Heading level', 'level', [{ value: 'h1', label: 'H1 — largest' }, { value: 'h2', label: 'H2' }, { value: 'h3', label: 'H3' }, { value: 'h4', label: 'H4 — smallest' }]), B.seg('Font style', 'font', [{ value: 'condensed', label: 'Condensed' }, { value: 'body', label: 'Body' }]), B.sel('Font', 'fontFamily', this.fontOptions(true)), B.range('Text size', 'size', 12, 120, 1, 'px'), B.range('Line spacing', 'lh', 0.8, 2.2, 0.02, ''), B.seg('Align', 'align', ALIGN), B.sel('Text weight', 'weight', [{ value: '400', label: 'Regular' }, { value: '600', label: 'Semibold' }, { value: '700', label: 'Bold' }]), B.color('Text color', 'color')], padF));\r\n case 'list': return decorate(base.concat([B.area('Items — one per line', 'items'), B.tog('Numbered', 'ordered'), B.sel('Font', 'fontFamily', this.fontOptions(true)), B.range('Text size', 'size', 8, 48, 1, 'px'), B.range('Line spacing', 'lh', 0.8, 3, 0.05, ''), B.range('Space between items', 'gap', 0, 60, 1, 'px'), B.color('Text color', 'color')], padF));\r\n case 'table': return decorate(base.concat([\r\n // Custom kind (render/fields.js `renderTableGrid`): a real grid of\r\n // cell inputs with add/remove row+column controls, replacing the\r\n // raw pipe-separated textarea (and its separate add buttons). Same\r\n // `data` string underneath.\r\n { kind: 'tablegrid', label: 'Cells', value: b.props.data || '', header: !!b.props.header, onChange: (v) => this.setProp(b.id, 'data', v) },\r\n B.tog('Header row', 'header'), B.tog('Cell borders', 'borders'), ...(b.props.borders ? [B.range('Border thickness', 'borderWidth', 1, 10, 1, 'px'), B.sel('Border style', 'borderStyle', BORDER_STYLES)] : []), B.tog('Zebra stripes', 'striped'),\r\n B.sel('Font', 'fontFamily', this.fontOptions(true)),\r\n B.range('Space in cells', 'pad', 0, 50, 1, 'px'), B.range('Text size', 'size', 8, 32, 1, 'px'), B.range('Width', 'width', 10, 100, 5, '%'),\r\n B.color('Header color', 'headBg'), B.color('Line color', 'lineColor'), B.seg('Align', 'align', ALIGN),\r\n ]));\r\n case 'embed': return decorate(base.concat([B.text('Embed URL', 'src', 'https://'), B.range('Height', 'height', 40, 1200, 10, 'px'), B.text('Accessible label', 'label'), B.range('Padding', 'py', 0, 120, 2, 'px')]));\r\n case 'css': return decorate(base.concat([B.area('CSS', 'code'), B.text('Note to yourself', 'note')]));\r\n case 'box': return decorate(base.concat([B.area('Content (HTML allowed)', 'html'), B.color('Background color', 'bg'), B.btn('Choose background image', () => this.openLibrary({ id: b.id, key: 'bgImage' })), B.text('Background image URL', 'bgImage', 'https://'), B.range('Space inside', 'pad', 0, 160, 2, 'px'), B.range('Border thickness', 'border', 0, 20, 1, 'px')].concat(b.props.border ? [\r\n B.sel('Border style', 'borderStyle', BORDER_STYLES), B.color('Border color', 'lineColor'),\r\n B.tog('Top border', 'topBorder', true), B.tog('Right border', 'rightBorder', true),\r\n B.tog('Bottom border', 'bottomBorder', true), B.tog('Left border', 'leftBorder', true),\r\n ] : []).concat([B.range('Rounded corners', 'radius', 0, 200, 1, 'px'), B.range('Min height', 'minH', 0, 1200, 10, 'px'), B.range('Max width', 'maxW', 10, 100, 5, '%'), B.seg('Align', 'align', ALIGN), B.tog('Drop shadow', 'shadow')])));\r\n case 'svg': return decorate(base.concat([B.area('SVG markup', 'code'), B.seg('Align', 'align', ALIGN), B.range('Width', 'width', 5, 100, 5, '%'), B.range('Padding', 'py', 0, 120, 2, 'px')]));\r\n case 'codeblock': return decorate(base.concat([B.area('Code', 'code'), B.color('Background', 'bg'), B.color('Text color', 'color'), B.range('Size', 'size', 8, 32, 0.5, 'px'), B.range('Padding', 'pad', 0, 80, 2, 'px')]));\r\n default: return [];\r\n }\r\n }\r\n if (f.row) {\r\n const r = f.row;\r\n const p = r.props;\r\n const B = binder(() => this.find(this.state.doc, r.id).row.props, (k, v) => this.setProp(r.id, k, v), this);\r\n const curIdx = LAYOUTS.findIndex((l) => l.spans.length === r.cols.length && l.spans.join() === r.cols.map((c) => c.span).join());\r\n const adv = !!this.state.advancedOpen;\r\n const uiToggle = (label, on, onChange) => ({ kind: 'toggle', label, on: !!on, onChange });\r\n // Grouped and progressive rather than one flat wall of every control:\r\n // plain-language groups first; anything conditional (border sides,\r\n // image fit) appears only once it applies; the CSS-flavored layout\r\n // machinery (flex/grid, max-width, vertical align, raw image URL)\r\n // lives behind the \"Advanced options\" switch, an editor-UI flag\r\n // (this.state, never the doc) so it doesn't dirty or save with the\r\n // document.\r\n return decorate([\r\n // No leading \"Section — N columns\" head: the panel header already\r\n // says \"Section properties / Section\", and the Columns select right\r\n // here shows the layout.\r\n {\r\n kind: 'select', label: 'Columns', value: String(curIdx > -1 ? curIdx : 0),\r\n options: LAYOUTS.map((l, i) => ({ value: String(i), label: l.label })),\r\n onChange: (v) => {\r\n const spans = LAYOUTS[Number(v)].spans;\r\n this.commit((doc) => {\r\n const row = this.find(doc, r.id).row;\r\n const kept = row.cols.slice();\r\n // Spread keeps per-column styling (bg/radius/padY/padX) on\r\n // columns that survive the structure change.\r\n row.cols = spans.map((s, i) => Object.assign({}, kept[i] || {}, { id: (kept[i] && kept[i].id) || uid(), span: s, blocks: (kept[i] && kept[i].blocks) || [] }));\r\n const orphan = kept.slice(spans.length).reduce((a, c) => a.concat(c.blocks), []);\r\n if (orphan.length) row.cols[row.cols.length - 1].blocks = row.cols[row.cols.length - 1].blocks.concat(orphan);\r\n });\r\n },\r\n },\r\n ...(r.cols.length > 1 ? [\r\n B.range('Space between columns', 'gap', 0, 120, 2, 'px'),\r\n B.tog('Stack columns on mobile', 'stackMobile'),\r\n ] : []),\r\n // Per-column styling, only for multi-column sections (a single\r\n // column's background is just the section background).\r\n ...(r.cols.length > 1 ? r.cols.reduce((acc, c, ci) => {\r\n const CB = binder(() => this.find(this.state.doc, r.id).row.cols[ci], (k, v) => this.setColProp(r.id, ci, k, v), this);\r\n return acc.concat([\r\n B.head('Column ' + (ci + 1)),\r\n CB.color('Background color', 'bg'),\r\n CB.range('Border thickness', 'border', 0, 20, 1, 'px'),\r\n ...(c.border ? [CB.sel('Border style', 'borderStyle', BORDER_STYLES), CB.color('Border color', 'lineColor')] : []),\r\n CB.range('Rounded corners', 'radius', 0, 100, 1, 'px'),\r\n group('Space inside', [CB.range('Top & bottom', 'padY', 0, 100, 2, 'px'), CB.range('Left & right', 'padX', 0, 100, 2, 'px')]),\r\n ]);\r\n }, []) : []),\r\n\r\n B.head('Background'),\r\n B.color('Background color', 'bg'),\r\n B.btn(p.bgImage ? 'Change background image' : 'Add background image', () => this.openLibrary({ id: r.id, key: 'bgImage' })),\r\n ...(p.bgImage ? [\r\n B.btn('Remove background image', () => this.setProp(r.id, 'bgImage', '')),\r\n B.sel('Image fit', 'bgSize', [{ value: 'cover', label: 'Fill the section' }, { value: 'contain', label: 'Fit inside' }, { value: 'auto', label: 'Actual size' }]),\r\n B.sel('Image position', 'bgPos', [{ value: 'center', label: 'Center' }, { value: 'top', label: 'Top' }, { value: 'bottom', label: 'Bottom' }, { value: 'left', label: 'Left' }, { value: 'right', label: 'Right' }]),\r\n B.range('Darken image', 'overlay', 0, 100, 1, '%'),\r\n ] : []),\r\n\r\n B.head('Border & corners'),\r\n B.range('Border thickness', 'border', 0, 20, 1, 'px'),\r\n B.sel('Border style', 'borderStyle', BORDER_STYLES),\r\n ...(p.border ? [\r\n B.color('Border color', 'lineColor'),\r\n B.tog('Top border', 'bTop', true),\r\n B.tog('Right border', 'bRight', true),\r\n B.tog('Bottom border', 'bBottom', true),\r\n B.tog('Left border', 'bLeft', true),\r\n ] : []),\r\n B.range('Rounded corners', 'radius', 0, 200, 1, 'px'),\r\n // Stored as the raw CSS string so an imported template's exact shadow\r\n // survives; the toggle writes/clears a standard soft card shadow.\r\n // (Note: many email clients ignore box-shadow -- it's progressive.)\r\n uiToggle('Drop shadow', !!p.shadow, () => this.setProp(r.id, 'shadow', p.shadow ? '' : '0 1px 2px rgba(15,23,42,0.06), 0 8px 24px rgba(15,23,42,0.10)')),\r\n\r\n B.head('Spacing'),\r\n // The group's \"More options\" switch is not a B.tog: the split/merge\r\n // needs to seed or fold the side props in the same commit -- see\r\n // togglePadSplit.\r\n group('Space inside', p.padSplit ? [\r\n B.range('Top', 'pt', 0, 200, 2, 'px'),\r\n B.range('Right', 'pr', 0, 160, 2, 'px'),\r\n B.range('Bottom', 'pb', 0, 200, 2, 'px'),\r\n B.range('Left', 'pl', 0, 160, 2, 'px'),\r\n ] : [\r\n B.range('Top & bottom', 'py', 0, 200, 2, 'px'),\r\n B.range('Left & right', 'px', 0, 160, 2, 'px'),\r\n ], { on: !!p.padSplit, onChange: () => this.togglePadSplit(r.id) }),\r\n group('Space outside', [\r\n B.range('Top', 'mt', 0, 160, 2, 'px'),\r\n B.range('Right', 'mr', 0, 160, 2, 'px'),\r\n B.range('Bottom', 'mb', 0, 160, 2, 'px'),\r\n B.range('Left', 'ml', 0, 160, 2, 'px'),\r\n ]),\r\n\r\n uiToggle('Advanced options', adv, () => this.setState({ advancedOpen: !this.state.advancedOpen })),\r\n ...(adv ? [\r\n B.head('Advanced'),\r\n B.seg('Layout engine', 'layout', [{ value: 'columns', label: 'Columns' }, { value: 'flex', label: 'Flex' }, { value: 'grid', label: 'Grid' }]),\r\n ...(p.layout === 'flex' ? [\r\n B.sel('Flex direction', 'flexDir', [{ value: 'row', label: 'Row' }, { value: 'row-reverse', label: 'Row reverse' }, { value: 'column', label: 'Column' }, { value: 'column-reverse', label: 'Column reverse' }]),\r\n B.sel('Justify content', 'justify', [{ value: 'flex-start', label: 'Start' }, { value: 'center', label: 'Center' }, { value: 'flex-end', label: 'End' }, { value: 'space-between', label: 'Space between' }, { value: 'space-around', label: 'Space around' }]),\r\n B.sel('Align items', 'alignItems', [{ value: 'stretch', label: 'Stretch' }, { value: 'flex-start', label: 'Start' }, { value: 'center', label: 'Center' }, { value: 'flex-end', label: 'End' }]),\r\n B.tog('Wrap flex items', 'wrap'),\r\n ] : []),\r\n ...(p.layout === 'grid' ? [B.range('Grid columns', 'gridCols', 1, 12, 1, '')] : []),\r\n B.text('Background image URL', 'bgImage', 'https://'),\r\n B.sel('Image repeat', 'bgRepeat', [{ value: 'no-repeat', label: 'No repeat' }, { value: 'repeat', label: 'Tile' }, { value: 'repeat-x', label: 'Tile across' }]),\r\n B.range('Max width', 'maxW', 10, 100, 5, '%'),\r\n B.seg('Vertical align', 'valign', [{ value: 'top', label: 'Top' }, { value: 'middle', label: 'Middle' }, { value: 'bottom', label: 'Bottom' }]),\r\n ] : []),\r\n ]);\r\n }\r\n return [];\r\n }\r\n\r\n /**\r\n * Email-safe font stacks, shared by the theme's global select and every\r\n * block's own Font select. `inherit: true` prepends the blocks' default --\r\n * an empty value meaning \"use the theme font\" (renderers read\r\n * `p.fontFamily || theme.font`, so old documents need no migration).\r\n */\r\n fontOptions(inherit) {\r\n const stacks = [\r\n { value: '\"Helvetica Neue\", Helvetica, Arial, sans-serif', label: 'Helvetica Neue' },\r\n { value: 'Helvetica, Arial, sans-serif', label: 'Helvetica / Arial' },\r\n { value: '-apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif', label: 'System UI' },\r\n { value: 'Verdana, Geneva, sans-serif', label: 'Verdana' },\r\n { value: 'Tahoma, Geneva, sans-serif', label: 'Tahoma' },\r\n { value: '\"Trebuchet MS\", Helvetica, sans-serif', label: 'Trebuchet MS' },\r\n { value: 'Georgia, \"Times New Roman\", serif', label: 'Georgia' },\r\n { value: '\"Times New Roman\", Times, serif', label: 'Times New Roman' },\r\n { value: '\"Palatino Linotype\", Palatino, Georgia, serif', label: 'Palatino' },\r\n { value: 'ui-monospace, \"Courier New\", monospace', label: 'Monospace' },\r\n ];\r\n return inherit ? [{ value: '', label: 'Inherit — theme font' }].concat(stacks) : stacks;\r\n }\r\n\r\n themeFields() {\r\n const B = binder(() => this.state.doc.theme, (k, v) => this.setTheme(k, v), this);\r\n return decorate([\r\n B.head('Canvas'),\r\n B.slider('Content area width', 'width', 280, 900, 5, 'px'),\r\n B.color('Background color', 'bg'),\r\n B.color('Content area background color', 'contentBg'),\r\n B.head('Type & color'),\r\n B.sel('Default font', 'font', this.fontOptions(false)),\r\n B.color('Text color', 'text'),\r\n B.color('Link color', 'link'),\r\n ]);\r\n }\r\n\r\n vars() { return varsFn(this.variablesRaw); }\r\n\r\n insertSnippet(code, label) {\r\n const sel = this.selObj();\r\n const key = sel.block ? INSERT_KEYS[sel.block.type] : null;\r\n if (key) {\r\n this.setProp(sel.block.id, key, (sel.block.props[key] || '') + (key === 'items' || key === 'data' ? '\\n' : ' ') + code);\r\n this.flash(this.t('toast.snippetInserted', { name: label || this.t('toast.snippetDefaultLabel') }));\r\n } else {\r\n if (navigator.clipboard) navigator.clipboard.writeText(code);\r\n this.flash(this.t('toast.snippetCopied', { name: label || this.t('toast.snippetDefaultLabel') }));\r\n }\r\n }\r\n\r\n insertTag(token) { this.insertSnippet(TOKEN(token), TOKEN(token)); }\r\n\r\n // ---- host-facing API (setContent/getContent/etc. live on the element) ----\r\n\r\n /**\r\n * `setContent`. Normalized on the way in for the same reason the HTML path\r\n * is: a host's stored JSON may predate this build or have been assembled by\r\n * a backend that only wrote the fields it cared about. Sparse input used to\r\n * reach the renderer intact and fail later at export time.\r\n */\r\n loadDoc(input) {\r\n const doc = normalizeDoc(input);\r\n if (!doc) return;\r\n this.docSetByHost = true;\r\n this.setState({ doc, sel: null, history: this.state.history.concat(JSON.stringify(this.state.doc)), future: [] }, () => this.persist(doc));\r\n }\r\n}\r\n\nObject.assign(exports, { AI_GOALS, AI_TONES, AI_GOAL_VALUES, EditorCore });\n\n};\n__modules[\"core/export.js\"] = function(module, exports, __require) {\n/**\r\n * Ported verbatim from the original `buildHtml()`, including its defining\r\n * trait: it does not re-template each block from `props` a second time, it\r\n * reads back the already-rendered live DOM node for each block (`grab`) and\r\n * strips editor-only attributes. The one adaptation: the original queried\r\n * plain `document` (the whole prototype ran outside any shadow tree); this\r\n * package renders inside a Shadow DOM, so `grab` is parameterized on the root\r\n * to search (the element's `shadowRoot`) instead of hardcoding `document`.\r\n */\r\n\r\nconst {cssUrl} = __require(\"core/sanitize.js\");\r\nconst {rowBorderCss, rowMargin, rowPad} = __require(\"core/layout-style.js\");\n\r\nfunction buildHtml(state, root, boxCss) {\r\n const d = state.doc; const t = d.theme;\r\n const grab = (id) => {\r\n const el = root.querySelector('[data-mc-content=\"' + id + '\"]');\r\n if (!el) return '';\r\n return el.outerHTML\r\n .replace(/\\scontenteditable=\"[^\"]*\"/g, '')\r\n .replace(/\\sdata-mc-[a-z-]+=\"[^\"]*\"/g, '')\r\n .replace(/\\sspellcheck=\"[^\"]*\"/g, '')\r\n .replace(/\\sdraggable=\"[^\"]*\"/g, '');\r\n };\r\n const rows = d.rows.map((r) => {\r\n const rp = r.props;\r\n const colInner = (c) => c.blocks.map((b) => {\r\n if (b.type === 'css') return '<style>' + (b.props.code || '') + '</style>';\r\n if (b.type === 'html') return b.props.code || '';\r\n if (b.type === 'svg') return '<div style=\"text-align:' + b.props.align + ';padding:' + b.props.py + 'px 0\">' + (b.props.code || '') + '</div>';\r\n return '<div style=\"' + boxCss(b.props) + '\">' + grab(b.id) + '</div>';\r\n }).join('\\n ') || ' ';\r\n const cells = r.cols.map((c) => {\r\n // Column-level styling (bg/radius/inner padding) renders as a wrapper\r\n // <div> inside the cell so the gutter padding stays unpainted --\r\n // mirrors render/canvas.js's `host` wrapper.\r\n const inner = (c.bg || c.border || c.radius || c.padY || c.padX)\r\n ? '<div style=\"background:' + (c.bg || 'transparent') + ';' + (c.border ? 'border:' + c.border + 'px ' + (c.borderStyle || 'solid') + ' ' + (c.lineColor || '#e2e2e5') + ';' : '') + 'border-radius:' + (c.radius || 0) + 'px;padding:' + (c.padY || 0) + 'px ' + (c.padX || 0) + 'px\">\\n ' + colInner(c) + '\\n </div>'\r\n : colInner(c);\r\n return '<td width=\"' + c.span + '%\" valign=\"' + rp.valign + '\" style=\"padding:0 ' + Math.round(rp.gap / 2) + 'px;\">\\n ' + inner + '\\n </td>';\r\n }).join('\\n ');\r\n const cssBody = rp.layout === 'grid'\r\n ? '<div style=\"display:grid;grid-template-columns:repeat(' + (rp.gridCols || 2) + ',minmax(0,1fr));gap:' + rp.gap + 'px\">\\n ' + r.cols.map((c) => '<div>' + colInner(c) + '</div>').join('\\n ') + '\\n </div>'\r\n : '<div style=\"display:flex;flex-direction:' + (rp.flexDir || 'row') + ';justify-content:' + (rp.justify || 'flex-start') + ';align-items:' + (rp.alignItems || 'stretch') + ';flex-wrap:' + (rp.wrap ? 'wrap' : 'nowrap') + ';gap:' + rp.gap + 'px\">\\n ' + r.cols.map((c) => '<div style=\"flex:' + c.span + ' 1 auto;min-width:0\">' + colInner(c) + '</div>').join('\\n ') + '\\n </div>';\r\n const body = rp.layout && rp.layout !== 'columns'\r\n ? cssBody\r\n : '<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr>\\n ' + cells + '\\n </tr></table>';\r\n const tdBg = rp.bgImage\r\n ? 'background-color:' + (rp.bg || t.contentBg) + ';background-image:' + (rp.overlay ? 'linear-gradient(rgba(20,22,24,' + (rp.overlay / 100) + '),rgba(20,22,24,' + (rp.overlay / 100) + ')),' : '') + 'url("' + cssUrl(rp.bgImage) + '");background-size:' + (rp.bgSize || 'cover') + ';background-position:' + (rp.bgPos || 'center') + ';background-repeat:' + (rp.bgRepeat || 'no-repeat') + ';'\r\n : 'background:' + (rp.bg || t.contentBg) + ';';\r\n const tdBorder = rowBorderCss(rp)\r\n + (rp.radius ? 'border-radius:' + rp.radius + 'px;' : '')\r\n + (rp.shadow ? 'box-shadow:' + rp.shadow + ';' : '')\n + ((rp.mt || rp.mr || rp.mb || rp.ml || rp.my) ? 'margin:' + rowMargin(rp) + ';' : '');\n return ' <tr>\\n <td style=\"padding:' + rowPad(rp) + ';' + tdBg + tdBorder + '\">\\n ' + body + '\\n </td>\\n </tr>';\r\n }).join('\\n');\r\n return '<!doctype html>\\n<html lang=\"en\">\\n<head>\\n<meta charset=\"utf-8\">\\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\\n<meta name=\"color-scheme\" content=\"light dark\">\\n<title>' + 'Email' + '</title>\\n</head>\\n<body style=\"margin:0;padding:0;background:' + t.bg + ';font-family:' + t.font.replace(/\"/g, \"'\") + ';color:' + t.text + ';-webkit-font-smoothing:antialiased;\">\\n<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background:' + t.bg + ';\">\\n <tr><td align=\"center\" style=\"padding:24px 12px;\">\\n <table role=\"presentation\" width=\"' + t.width + '\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:' + t.width + 'px;max-width:100%;background:' + t.contentBg + ';\">\\n' + rows + '\\n </table>\\n </td></tr>\\n</table>\\n</body>\\n</html>';\r\n}\r\n\nObject.assign(exports, { buildHtml });\n\n};\n__modules[\"core/footer.js\"] = function(module, exports, __require) {\n/**\n * The attribution strip along the bottom of the shell -- by default\n * \"Powered by SELISE Blocks (c) 2026\".\n *\n * It is configurable for the same reason the top bar is (core/toolbar.js): the\n * editor is embedded inside chrome the host already owns, and a host with its\n * own footer, its own attribution, or a white-label agreement should not have\n * to fight a bar it cannot address. So the strip can carry the host's own\n * line, point at the host's own link, or be removed outright.\n *\n * The default text lives in the message table (`footer.poweredBy`), not here,\n * so it translates with `locale` and can be overridden per-string through\n * `.messages` like every other label.\n */\n\n/** The same \"off\" spellings the toolbar accepts -- markup only has strings, and one convention beats two. */\nconst HIDDEN = ['none', 'hidden', 'off', 'false'];\n\n/**\n * A footer link is host-authored, but it is rendered inside the editor's own\n * DOM, so the scheme is allowlisted the way `cssUrl` allowlists image sources:\n * a relative path has no scheme and is fine, `javascript:` resolves to nothing\n * rather than becoming a click target in someone else's UI.\n */\nfunction safeHref(value) {\n const raw = String(value == null ? '' : value).trim();\n if (!raw) return '';\n const scheme = raw.match(/^([a-z][a-z0-9+.-]*):/i);\n if (scheme && !/^(https?|mailto)$/i.test(scheme[1])) return '';\n return raw;\n}\n\n/**\n * Normalizes whatever the host set into `{ text, href, target }`, or `null`\n * for \"no footer at all\".\n *\n * Accepts, in the shapes a Web Component gets configured through:\n *\n * - unset (`null`/`undefined`) the built-in attribution\n * - `false` or `\"none\"` no strip at all\n * - a string replaces the text (`footer=\"© 2026 Acme\"`)\n * - an object `{ text, href, target, show }` -- text plus a\n * link, for a host that wants its own mark to\n * lead somewhere\n *\n * `text: null` in the result means \"use the translated default\": the string is\n * resolved through the translator at render time, so it follows `locale` and\n * `.messages` instead of being frozen here. An explicit empty string is\n * honored as empty, for a host that wants a link and nothing else.\n */\nfunction resolveFooter(value) {\n if (value === false) return null;\n if (value == null) return { text: null, href: '', target: '' };\n\n if (typeof value === 'string') {\n const raw = value.trim();\n if (HIDDEN.indexOf(raw.toLowerCase()) >= 0) return null;\n return { text: raw || null, href: '', target: '' };\n }\n\n if (typeof value === 'object') {\n if (value.show === false) return null;\n return {\n text: value.text == null ? null : String(value.text),\n href: safeHref(value.href),\n // Only meaningful alongside an href; the default is applied at render,\n // so this stays a plain description of what the host asked for.\n target: value.target ? String(value.target) : '',\n };\n }\n\n return { text: null, href: '', target: '' };\n}\n\nObject.assign(exports, { resolveFooter });\n\n};\n__modules[\"core/i18n/ar.js\"] = function(module, exports, __require) {\n/**\r\n * Arabic (العربية) — `ar`. Right-to-left -- pair with `dir=\"rtl\"` (the\r\n * editor defaults `dir` from `isRtl(locale)` automatically unless the host\r\n * sets `dir` explicitly).\r\n *\r\n * AI-drafted, not reviewed by a native speaker. Correctable one key at a\r\n * time via `.messages` overrides.\r\n */\r\nconst AR = {\r\n 'action.undoHint': 'تراجع — ⌘Z',\r\n 'action.redoHint': 'إعادة — ⌘⇧Z',\r\n 'action.chromeToDark': 'داكن',\r\n 'action.chromeToLight': 'فاتح',\r\n 'action.chromeHint': 'وضع المحرر فاتح / داكن',\r\n 'action.aiCopy': 'نص',\r\n 'action.aiCopyHint': 'صياغة نص بالذكاء الاصطناعي',\r\n 'action.code': 'الكود',\r\n 'action.codeHint': 'تحرير HTML الخام مع معاينة مباشرة',\r\n 'action.preview': 'معاينة',\r\n 'action.export': 'تصدير',\r\n\r\n 'device.desktop': 'سطح المكتب',\r\n 'device.desktopHint': 'عرض سطح المكتب',\r\n 'device.mobile': 'الجوال',\r\n 'device.mobileHint': 'عرض الجوال',\r\n 'device.dark': 'داكن',\r\n 'device.darkHint': 'وضع الوارد الداكن',\r\n\r\n 'status.autosaveOn': 'الحفظ التلقائي مفعّل',\r\n 'status.saved': 'تم الحفظ {time}',\r\n 'status.saveFailed': 'لم يتم الحفظ — التخزين ممتلئ',\r\n\r\n 'canvas.meta': '{rows} صفوف · {blocks} كتل · {width}px',\r\n\r\n 'tab.design': 'النمط',\r\n 'tab.designHint': 'تنسيق العنصر المحدد',\r\n 'tab.blocks': 'الكتل',\r\n 'tab.blocksHint': 'كتل المحتوى والمتغيرات',\r\n 'tab.rows': 'الأقسام',\r\n 'tab.rowsHint': 'تخطيطات الأقسام ونموذج اللوحة',\r\n 'tab.files': 'الملفات',\r\n 'tab.filesHint': 'مكتبة الأصول',\r\n 'tab.layers': 'البنية',\r\n 'tab.layersHint': 'بنية المستند',\r\n 'tab.theme': 'السمة',\r\n 'tab.themeHint': 'الأنماط العامة',\r\n 'tab.data': 'المتغيرات',\r\n 'tab.dataHint': 'المتغيرات المقدَّمة من برنامجك',\r\n\r\n 'inspector.blockProperties': 'خصائص الكتلة',\r\n 'inspector.sectionProperties': 'خصائص القسم',\r\n 'inspector.title': 'المفتش',\r\n 'inspector.sectionLabel': 'قسم',\r\n 'inspector.nothingSelected': 'لا يوجد تحديد',\r\n 'action.duplicateHint': 'مضاعفة — ⌘D',\r\n 'action.deleteHint': 'حذف — ⌫',\r\n 'inspector.emptyBody':\r\n 'اختر صفًا أو كتلة على اللوحة لتنسيقه هنا. اسحب الكتل من تبويب <strong style=\"color: var(--ed-text); font-weight: 600;\">الكتل</strong>؛ انقر نقرًا مزدوجًا على أي نص لتحريره في مكانه.',\r\n 'inspector.shortcuts': 'الاختصارات',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — تراجع، إعادة',\r\n 'shortcut.duplicate': '⌘D — مضاعفة التحديد',\r\n 'shortcut.delete': '⌫ — حذف التحديد',\r\n 'shortcut.export': '⌘E — تصدير HTML',\r\n 'shortcut.escape': 'ESC — إلغاء التحديد، إغلاق',\r\n\r\n 'blocks.dragHint': 'اسحب إلى اللوحة',\r\n 'blocks.count': '{count} كتلة',\r\n\r\n 'rows.sectionLayouts': 'تخطيطات الأقسام',\r\n 'rows.customMarkup': 'ترميز مخصص',\r\n 'rows.htmlRowHint': 'اسحب لإدراجه، أو انقر للإضافة — صف بعرض كامل تملأه بـ HTML خام',\r\n 'rows.rawHtmlSection': 'قسم HTML خام',\r\n 'rows.rawHtmlDesc': 'قسم بعرض كامل، ترميزك الخاص، وقابل للسحب أيضًا',\r\n 'rows.canvasModel': 'نموذج اللوحة',\r\n 'rows.modeRowBased': 'قائم على الصفوف',\r\n 'rows.modeFreeStack': 'تكديس حر',\r\n 'rows.hintRows':\r\n 'قائم على الأقسام: أسقط تخطيطًا أولًا، ثم أسقط الكتل داخل أعمدته — كل قسم يحمل خلفيته وحدوده وإعدادات flex أو grid الخاصة به.',\r\n 'rows.hintStack': 'تكديس حر: بدون تخطيطات — كل كتلة تسحبها تصبح قسمًا مستقلًا بعرض كامل، مرتبة بالتسلسل.',\r\n\r\n\r\n 'files.libraryCount': 'المكتبة — {count} ملفات',\r\n 'files.openManager': 'فتح مدير الملفات',\r\n 'files.dragToCanvas': 'اسحب أي ملف مباشرة إلى اللوحة لوضعه كصورة.',\r\n\r\n 'layers.structure': 'البنية',\r\n 'layers.sectionSingle': 'قسم',\r\n 'layers.sectionMulti': 'قسم · {count} أعمدة',\r\n 'layers.blockCount': '{count} كتلة',\r\n\r\n 'theme.globalStyles': 'الأنماط العامة',\r\n\r\n 'vars.title': 'المتغيرات',\r\n 'vars.fromCode': '{count} من برنامجك',\r\n 'vars.declaredNote': 'مُعرَّفة من قِبل تطبيقك — تعرض اللوحة دائمًا الرمز، وليس القيمة أبدًا.',\r\n 'vars.filterPlaceholder': 'تصفية المتغيرات…',\r\n 'vars.insertHint': 'انقر للإدراج في النص أو العنوان أو الزر المحدد',\r\n 'vars.insert': 'إدراج',\r\n 'vars.noMatch': 'لا يوجد متغير يطابق هذا الفلتر.',\r\n 'vars.noneDeclared': 'لم يُعرِّف تطبيقك أي متغيرات بعد.',\r\n 'vars.rteHint': 'أثناء تحرير النص يمكنك أيضًا اختيار متغير من القائمة المنسدلة في شريط الأدوات المضمّن.',\r\n\r\n 'modal.fileManager': 'مدير الملفات',\r\n 'modal.assetsTitle': 'الأصول',\r\n 'modal.replaceImage': 'استبدال الصورة',\r\n 'library.searchPlaceholder': 'بحث في الملفات…',\r\n 'action.upload': 'رفع',\r\n 'library.clickToPlace': 'انقر على ملف لوضعه · أو اسحب ملفًا إلى اللوحة',\r\n 'library.clickToReplace': 'انقر على ملف لاستبدال الصورة المحددة',\r\n 'library.storageLabel': '{count} ملفات · {size}',\r\n 'library.folders': 'المجلدات',\r\n 'library.dropHint': 'أسقط ملفات الصور هنا للرفع — أو استخدم زر الرفع.',\r\n 'library.deleteFileHint': 'حذف الملف',\r\n 'library.del': 'حذف',\r\n 'toast.assetDeleted': 'تم حذف {name}',\r\n\r\n 'modal.export': 'تصدير',\r\n 'modal.exportTitle': 'HTML بريد إلكتروني قائم على الجداول',\r\n 'export.copy': 'نسخ',\r\n 'export.copied': 'تم النسخ',\r\n 'action.download': 'تنزيل',\r\n 'export.meta': '{kb} كيلوبايت · جداول + أنماط مضمّنة · عروض آمنة لـ Outlook',\r\n\r\n 'modal.rawHtmlTitle': 'HTML خام، معاينة مباشرة',\r\n 'code.statusEdited': 'عرض الكود — مُعدَّل — المعاينة مباشرة، لم يُطبَّق بعد',\r\n 'code.statusSynced': 'عرض الكود — متزامن مع اللوحة',\r\n 'action.reload': 'إعادة تحميل',\r\n 'action.reloadHint': 'إعادة تحميل المصدر من اللوحة',\r\n 'action.applyToCanvas': 'تطبيق على اللوحة',\r\n 'action.applyToCanvasHint': 'تحليل المصدر مرة أخرى إلى صفوف قابلة للتحرير',\r\n 'action.closeWithoutApplyingHint': 'إغلاق دون تطبيق',\r\n 'code.source': 'المصدر',\r\n 'code.livePreview': 'معاينة مباشرة',\r\n 'code.liveHtmlPreviewTitle': 'معاينة HTML مباشرة',\r\n 'code.applyNote':\r\n 'يحلّل زر التطبيق كل صف جدول من المستوى الأعلى إلى صف لوحة يمكنك تحديده وإعادة ترتيبه وحذفه — الترميز المكتوب يدويًا يبقى سليمًا.',\r\n 'code.meta': '{kb} كيلوبايت · {lines} أسطر',\r\n 'toast.sourceReloaded': 'تمت إعادة تحميل المصدر من اللوحة',\r\n 'toast.sourceAppliedOne': 'تم تطبيق المصدر — صف واحد على اللوحة',\r\n 'toast.sourceAppliedMany': 'تم تطبيق المصدر — {rows} صفوف على اللوحة',\r\n 'toast.parseError': 'تعذّر تحليل ذلك الـ HTML',\r\n\r\n 'modal.copyAssist': 'مساعد الصياغة',\r\n 'modal.draftCopyTitle': 'صياغة نص لهذه الحملة',\r\n 'ai.goal': 'الهدف',\r\n 'ai.tone': 'الأسلوب',\r\n 'ai.briefLabel': 'ما موضوع هذا البريد الإلكتروني؟',\r\n 'ai.briefPlaceholder': 'مثال: إطلاق ملابس الخريف، خصم 15% للمشتركين، شحن مجاني فوق 150$',\r\n 'ai.generate': 'إنشاء النص',\r\n 'ai.writing': 'جارٍ الكتابة…',\r\n 'ai.kindHeadline': 'عنوان رئيسي',\r\n 'ai.kindBody': 'نص أساسي',\r\n 'ai.kindButton': 'نص الزر',\r\n 'ai.actionInsertHeading': 'إدراج كعنوان',\r\n 'ai.actionInsertText': 'إدراج ككتلة نصية',\r\n 'ai.actionInsertButton': 'إدراج كزر',\r\n 'toast.headingAdded': 'تمت إضافة العنوان',\r\n 'toast.textBlockAdded': 'تمت إضافة الكتلة النصية',\r\n 'toast.buttonAdded': 'تمت إضافة الزر',\r\n\r\n 'preview.kickerMobile': 'معاينة — جوال 375px',\r\n 'preview.kickerDark': 'معاينة — وارد داكن',\r\n 'preview.kickerDesktop': 'معاينة — سطح مكتب {width}px',\r\n 'action.close': 'إغلاق',\r\n\r\n 'toast.duplicated': 'تمت المضاعفة',\r\n 'toast.fileUploadedOne': 'تم رفع ملف واحد',\r\n 'toast.fileUploadedMany': 'تم رفع {count} ملفات',\r\n 'toast.imageReplaced': 'تم استبدال الصورة',\r\n 'toast.imageAdded': 'تمت إضافة الصورة إلى اللوحة',\r\n 'toast.htmlCopied': 'تم نسخ HTML إلى الحافظة',\r\n 'toast.templateLoaded': 'تم تحميل {name}',\r\n 'toast.snippetDefaultLabel': 'مقتطف',\r\n 'toast.snippetInserted': 'تم إدراج {name}',\r\n 'toast.snippetCopied': 'تم نسخ {name} — حدد كتلة نصية لإدراجه',\r\n};\r\n\r\n\nObject.assign(exports, { AR });\n\n};\n__modules[\"core/i18n/bg.js\"] = function(module, exports, __require) {\n/** Bulgarian (Български) — `bg`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst BG = {\r\n 'action.undoHint': 'Отмяна — ⌘Z',\r\n 'action.redoHint': 'Повторение — ⌘⇧Z',\r\n 'action.chromeToDark': 'Тъмна',\r\n 'action.chromeToLight': 'Светла',\r\n 'action.chromeHint': 'Тема на редактора светла / тъмна',\r\n 'action.aiCopy': 'Текст',\r\n 'action.aiCopyHint': 'Написване на текст с изкуствен интелект',\r\n 'action.code': 'Код',\r\n 'action.codeHint': 'Редактиране на суров HTML с преглед на живо',\r\n 'action.preview': 'Преглед',\r\n 'action.export': 'Изнасяне',\r\n 'device.desktop': 'Компютър',\r\n 'device.desktopHint': 'Ширина за компютър',\r\n 'device.mobile': 'Телефон',\r\n 'device.mobileHint': 'Ширина за телефон',\r\n 'device.dark': 'Тъмна',\r\n 'device.darkHint': 'Тъмен режим на пощата',\r\n 'status.autosaveOn': 'автоматичното запазване е включено',\r\n 'status.saved': 'запазено {time}',\r\n 'status.saveFailed': 'не е запазено — хранилището е пълно',\r\n 'canvas.meta': '{rows} реда · {blocks} блока · {width}px',\r\n 'tab.design': 'Стил',\r\n 'tab.designHint': 'Стилизиране на избраното',\r\n 'tab.blocks': 'Блокове',\r\n 'tab.blocksHint': 'Блокове съдържание и променливи',\r\n 'tab.rows': 'Секции',\r\n 'tab.rowsHint': 'Оформления на секции и модел на платното',\r\n 'tab.files': 'Файлове',\r\n 'tab.filesHint': 'Библиотека с ресурси',\r\n 'tab.layers': 'Структура',\r\n 'tab.layersHint': 'Структура на документа',\r\n 'tab.theme': 'Тема',\r\n 'tab.themeHint': 'Глобални стилове',\r\n 'tab.data': 'Промен.',\r\n 'tab.dataHint': 'Променливи, предоставени от вашия код',\r\n 'inspector.blockProperties': 'Свойства на блока',\r\n 'inspector.sectionProperties': 'Свойства на секцията',\r\n 'inspector.title': 'Инспектор',\r\n 'inspector.sectionLabel': 'Секция',\r\n 'inspector.nothingSelected': 'Нищо не е избрано',\r\n 'action.duplicateHint': 'Дублиране — ⌘D',\r\n 'action.deleteHint': 'Изтриване — ⌫',\r\n 'inspector.emptyBody':\r\n 'Изберете ред или блок на платното, за да го стилизирате тук. Плъзнете блокове от раздела <strong style=\"color: var(--ed-text); font-weight: 600;\">Блокове</strong>; кликнете два пъти върху текст, за да го редактирате на място.',\r\n 'inspector.shortcuts': 'Клавишни комбинации',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — отмяна, повторение',\r\n 'shortcut.duplicate': '⌘D — дублиране на избора',\r\n 'shortcut.delete': '⌫ — изтриване на избора',\r\n 'shortcut.export': '⌘E — изнасяне на HTML',\r\n 'shortcut.escape': 'ESC — премахване на избора, затваряне',\r\n 'blocks.dragHint': 'Плъзнете върху платното',\r\n 'blocks.count': '{count} блока',\r\n 'rows.sectionLayouts': 'Оформления на секции',\r\n 'rows.customMarkup': 'Персонализирана маркировка',\r\n 'rows.htmlRowHint': 'Плъзнете, за да вмъкнете, или кликнете, за да добавите — ред на цялата ширина, който запълвате със суров HTML',\r\n 'rows.rawHtmlSection': 'Секция със суров HTML',\r\n 'rows.rawHtmlDesc': 'Секция на цялата ширина, ваша собствена маркировка, все още може да се плъзга',\r\n 'rows.canvasModel': 'Модел на платното',\r\n 'rows.modeRowBased': 'Базирано на редове',\r\n 'rows.modeFreeStack': 'Свободно подреждане',\r\n 'rows.hintRows':\r\n 'Базирано на секции: първо пуснете оформление, после блокове в неговите колони — всяка секция има собствен фон, рамка, flex или grid настройки.',\r\n 'rows.hintStack': 'Свободно подреждане: без оформления — всеки пуснат блок става собствена секция на цялата ширина, подредена по ред.',\r\n 'files.libraryCount': 'Библиотека — {count} файла',\r\n 'files.openManager': 'Отваряне на файловия мениджър',\r\n 'files.dragToCanvas': 'Плъзнете произволен файл директно върху платното, за да го поставите като блок с изображение.',\r\n 'layers.structure': 'Структура',\r\n 'layers.sectionSingle': 'Секция',\r\n 'layers.sectionMulti': 'Секция · {count} колони',\r\n 'layers.blockCount': '{count} бл.',\r\n 'theme.globalStyles': 'Глобални стилове',\r\n 'vars.title': 'Променливи',\r\n 'vars.fromCode': '{count} от вашия код',\r\n 'vars.declaredNote': 'Декларирани от вашето приложение — платното винаги показва токена, никога стойност.',\r\n 'vars.filterPlaceholder': 'Филтриране на променливи…',\r\n 'vars.insertHint': 'Кликнете, за да вмъкнете в избрания текст, заглавие или бутон',\r\n 'vars.insert': 'вмъкване',\r\n 'vars.noMatch': 'Няма променлива, отговаряща на този филтър.',\r\n 'vars.noneDeclared': 'Вашето приложение все още не е декларирало променливи.',\r\n 'vars.rteHint': 'При редактиране на текст можете да изберете променлива и директно от падащото меню на вградената лента с инструменти.',\r\n 'modal.fileManager': 'Файлов мениджър',\r\n 'modal.assetsTitle': 'Ресурси',\r\n 'modal.replaceImage': 'Замяна на изображение',\r\n 'library.searchPlaceholder': 'Търсене на файлове…',\r\n 'action.upload': 'Качване',\r\n 'library.clickToPlace': 'Кликнете върху файл, за да го поставите · или плъзнете файл върху платното',\r\n 'library.clickToReplace': 'Кликнете върху файл, за да замените избраното изображение',\r\n 'library.storageLabel': '{count} файла · {size}',\r\n 'library.folders': 'Папки',\r\n 'library.dropHint': 'Пуснете файлове с изображения тук за качване — или използвайте бутона Качване.',\r\n 'library.deleteFileHint': 'Изтриване на файл',\r\n 'library.del': 'ИЗТР',\r\n 'toast.assetDeleted': '{name} изтрит',\r\n 'modal.export': 'Изнасяне',\r\n 'modal.exportTitle': 'HTML на имейл, базиран на таблици',\r\n 'export.copy': 'Копиране',\r\n 'export.copied': 'Копирано',\r\n 'action.download': 'Изтегляне',\r\n 'export.meta': '{kb} KB · таблици + вградени стилове · ширини, безопасни за Outlook',\r\n 'modal.rawHtmlTitle': 'Суров HTML, преглед на живо',\r\n 'code.statusEdited': 'Изглед на кода — редактиран — преглед на живо, все още не е приложен',\r\n 'code.statusSynced': 'Изглед на кода — синхронизиран с платното',\r\n 'action.reload': 'Презареждане',\r\n 'action.reloadHint': 'Презареждане на изходния код от платното',\r\n 'action.applyToCanvas': 'Приложи върху платното',\r\n 'action.applyToCanvasHint': 'Анализиране на изходния код обратно в редактируеми редове',\r\n 'action.closeWithoutApplyingHint': 'Затваряне без прилагане',\r\n 'code.source': 'Изходен код',\r\n 'code.livePreview': 'Преглед на живо',\r\n 'code.liveHtmlPreviewTitle': 'Преглед на HTML на живо',\r\n 'code.applyNote':\r\n 'Прилагането анализира всеки ред на таблица от най-високо ниво в ред на платното, който все още можете да избирате, преподреждате и изтривате — ръчно написаната маркировка преминава непроменена.',\r\n 'code.meta': '{kb} KB · {lines} реда',\r\n 'toast.sourceReloaded': 'Изходният код е презареден от платното',\r\n 'toast.sourceAppliedOne': 'Изходният код е приложен — 1 ред на платното',\r\n 'toast.sourceAppliedMany': 'Изходният код е приложен — {rows} реда на платното',\r\n 'toast.parseError': 'Този HTML не можа да бъде анализиран',\r\n 'modal.copyAssist': 'Помощник за текст',\r\n 'modal.draftCopyTitle': 'Напишете текст за тази кампания',\r\n 'ai.goal': 'Цел',\r\n 'ai.tone': 'Тон',\r\n 'ai.briefLabel': 'За какво е този имейл?',\r\n 'ai.briefPlaceholder': 'напр. Есенна колекция, 15% за абонати, безплатна доставка над 150 лв',\r\n 'ai.generate': 'Генериране на текст',\r\n 'ai.writing': 'Пишем…',\r\n 'ai.kindHeadline': 'Заглавие',\r\n 'ai.kindBody': 'Основен текст',\r\n 'ai.kindButton': 'Текст на бутона',\r\n 'ai.actionInsertHeading': 'Вмъкни като заглавие',\r\n 'ai.actionInsertText': 'Вмъкни като текстов блок',\r\n 'ai.actionInsertButton': 'Вмъкни като бутон',\r\n 'toast.headingAdded': 'Заглавието е добавено',\r\n 'toast.textBlockAdded': 'Текстовият блок е добавен',\r\n 'toast.buttonAdded': 'Бутонът е добавен',\r\n 'preview.kickerMobile': 'Преглед — телефон 375px',\r\n 'preview.kickerDark': 'Преглед — тъмна пощенска кутия',\r\n 'preview.kickerDesktop': 'Преглед — компютър {width}px',\r\n 'action.close': 'Затваряне',\r\n 'toast.duplicated': 'Дублирано',\r\n 'toast.fileUploadedOne': 'Качен е 1 файл',\r\n 'toast.fileUploadedMany': 'Качени са {count} файла',\r\n 'toast.imageReplaced': 'Изображението е заменено',\r\n 'toast.imageAdded': 'Изображението е добавено към платното',\r\n 'toast.htmlCopied': 'HTML е копиран в клипборда',\r\n 'toast.templateLoaded': '{name} е зареден',\r\n 'toast.snippetDefaultLabel': 'Откъс',\r\n 'toast.snippetInserted': '{name} е вмъкнат',\r\n 'toast.snippetCopied': '{name} е копиран — изберете текстов блок, за да го вмъкнете',\r\n};\r\n\r\n\nObject.assign(exports, { BG });\n\n};\n__modules[\"core/i18n/bn.js\"] = function(module, exports, __require) {\n/**\r\n * Bangla (বাংলা) — `bn`.\r\n *\r\n * AI-drafted, not reviewed by a native speaker. Correctable one key at a\r\n * time via `.messages` overrides -- `createTranslator` falls back to\r\n * English per-key, so a partial fix is safe to ship incrementally.\r\n */\r\nconst BN = {\r\n 'action.undoHint': 'পূর্বাবস্থায় ফেরান — ⌘Z',\r\n 'action.redoHint': 'পুনরায় করুন — ⌘⇧Z',\r\n 'action.chromeToDark': 'ডার্ক',\r\n 'action.chromeToLight': 'লাইট',\r\n 'action.chromeHint': 'সম্পাদক থিম লাইট/ডার্ক',\r\n 'action.aiCopy': 'কপি',\r\n 'action.aiCopyHint': 'AI দিয়ে কপি লিখুন',\r\n 'action.code': 'কোড',\r\n 'action.codeHint': 'লাইভ প্রিভিউসহ HTML সম্পাদনা করুন',\r\n 'action.preview': 'প্রিভিউ',\r\n 'action.export': 'রপ্তানি',\r\n\r\n 'device.desktop': 'ডেস্কটপ',\r\n 'device.desktopHint': 'ডেস্কটপ প্রস্থ',\r\n 'device.mobile': 'মোবাইল',\r\n 'device.mobileHint': 'মোবাইল প্রস্থ',\r\n 'device.dark': 'ডার্ক',\r\n 'device.darkHint': 'ডার্ক-মোড ইনবক্স',\r\n\r\n 'status.autosaveOn': 'অটোসেভ চালু',\r\n 'status.saved': 'সংরক্ষিত হয়েছে {time}',\r\n 'status.saveFailed': 'সংরক্ষণ হয়নি — স্টোরেজ পূর্ণ',\r\n\r\n 'canvas.meta': '{rows}টি সারি · {blocks}টি ব্লক · {width}px',\r\n\r\n 'tab.design': 'স্টাইল',\r\n 'tab.designHint': 'নির্বাচিত অংশ স্টাইল করুন',\r\n 'tab.blocks': 'ব্লক',\r\n 'tab.blocksHint': 'কন্টেন্ট ব্লক ও ভেরিয়েবল',\r\n 'tab.rows': 'সেকশন',\r\n 'tab.rowsHint': 'সেকশন লেআউট ও ক্যানভাস মডেল',\r\n 'tab.files': 'ফাইল',\r\n 'tab.filesHint': 'অ্যাসেট লাইব্রেরি',\r\n 'tab.layers': 'কাঠামো',\r\n 'tab.layersHint': 'ডকুমেন্ট কাঠামো',\r\n 'tab.theme': 'থিম',\r\n 'tab.themeHint': 'গ্লোবাল স্টাইল',\r\n 'tab.data': 'ভেরিয়েবল',\r\n 'tab.dataHint': 'আপনার কোড থেকে দেওয়া ভেরিয়েবল',\r\n\r\n 'inspector.blockProperties': 'ব্লকের বৈশিষ্ট্য',\r\n 'inspector.sectionProperties': 'সেকশনের বৈশিষ্ট্য',\r\n 'inspector.title': 'ইন্সপেক্টর',\r\n 'inspector.sectionLabel': 'সেকশন',\r\n 'inspector.nothingSelected': 'কিছু নির্বাচিত নয়',\r\n 'action.duplicateHint': 'নকল করুন — ⌘D',\r\n 'action.deleteHint': 'মুছুন — ⌫',\r\n 'inspector.emptyBody':\r\n 'ক্যানভাসে একটি সারি বা ব্লক নির্বাচন করে এখানে স্টাইল করুন। <strong style=\"color: var(--ed-text); font-weight: 600;\">ব্লক</strong> ট্যাব থেকে ব্লক টেনে আনুন; সরাসরি সম্পাদনার জন্য যেকোনো লেখায় ডাবল-ক্লিক করুন।',\r\n 'inspector.shortcuts': 'শর্টকাট',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — পূর্বাবস্থা, পুনরায়',\r\n 'shortcut.duplicate': '⌘D — নির্বাচন নকল করুন',\r\n 'shortcut.delete': '⌫ — নির্বাচন মুছুন',\r\n 'shortcut.export': '⌘E — HTML রপ্তানি করুন',\r\n 'shortcut.escape': 'ESC — নির্বাচন বাতিল, বন্ধ করুন',\r\n\r\n 'blocks.dragHint': 'ক্যানভাসে টেনে আনুন',\r\n 'blocks.count': '{count}টি ব্লক',\r\n\r\n 'rows.sectionLayouts': 'সেকশন লেআউট',\r\n 'rows.customMarkup': 'কাস্টম মার্কআপ',\r\n 'rows.htmlRowHint': 'টেনে আনুন, বা যোগ করতে ক্লিক করুন — একটি ফুল-ব্লিড সারি যা আপনি raw HTML দিয়ে পূরণ করেন',\r\n 'rows.rawHtmlSection': 'Raw HTML সেকশন',\r\n 'rows.rawHtmlDesc': 'ফুল-ব্লিড সেকশন, আপনার নিজস্ব মার্কআপ, তবুও টানা যায়',\r\n 'rows.canvasModel': 'ক্যানভাস মডেল',\r\n 'rows.modeRowBased': 'সারি-ভিত্তিক',\r\n 'rows.modeFreeStack': 'ফ্রি স্ট্যাক',\r\n 'rows.hintRows':\r\n 'সেকশন-ভিত্তিক: প্রথমে একটি লেআউট রাখুন, তারপর এর কলামে ব্লক রাখুন — প্রতিটি সেকশনের নিজস্ব ব্যাকগ্রাউন্ড, বর্ডার, ফ্লেক্স বা গ্রিড সেটিংস থাকে।',\r\n 'rows.hintStack': 'ফ্রি স্ট্যাক: লেআউট ছাড়াই — আপনি যে ব্লকই রাখুন না কেন তা নিজেই একটি পূর্ণ-প্রস্থ সেকশন হয়ে ক্রমানুসারে সাজে।',\r\n\r\n\r\n 'files.libraryCount': 'লাইব্রেরি — {count}টি ফাইল',\r\n 'files.openManager': 'ফাইল ম্যানেজার খুলুন',\r\n 'files.dragToCanvas': 'একটি ইমেজ ব্লক হিসেবে বসাতে যেকোনো ফাইল সরাসরি ক্যানভাসে টেনে আনুন।',\r\n\r\n 'layers.structure': 'কাঠামো',\r\n 'layers.sectionSingle': 'সেকশন',\r\n 'layers.sectionMulti': 'সেকশন · {count}টি কলাম',\r\n 'layers.blockCount': '{count}টি ব্লক',\r\n\r\n 'theme.globalStyles': 'গ্লোবাল স্টাইল',\r\n\r\n 'vars.title': 'ভেরিয়েবল',\r\n 'vars.fromCode': 'আপনার কোড থেকে {count}টি',\r\n 'vars.declaredNote': 'আপনার অ্যাপ্লিকেশন দ্বারা ঘোষিত — ক্যানভাস সবসময় টোকেন দেখায়, কখনো মান নয়।',\r\n 'vars.filterPlaceholder': 'ভেরিয়েবল ফিল্টার করুন…',\r\n 'vars.insertHint': 'নির্বাচিত টেক্সট, হেডিং বা বাটনে বসাতে ক্লিক করুন',\r\n 'vars.insert': 'বসান',\r\n 'vars.noMatch': 'সেই ফিল্টারের সাথে কোনো ভেরিয়েবল মেলেনি।',\r\n 'vars.noneDeclared': 'আপনার অ্যাপ্লিকেশন এখনো কোনো ভেরিয়েবল ঘোষণা করেনি।',\r\n 'vars.rteHint': 'টেক্সট সম্পাদনার সময় আপনি ইনলাইন টুলবারের ড্রপডাউন থেকেও ভেরিয়েবল বেছে নিতে পারেন।',\r\n\r\n 'modal.fileManager': 'ফাইল ম্যানেজার',\r\n 'modal.assetsTitle': 'অ্যাসেট',\r\n 'modal.replaceImage': 'ইমেজ প্রতিস্থাপন করুন',\r\n 'library.searchPlaceholder': 'ফাইল খুঁজুন…',\r\n 'action.upload': 'আপলোড',\r\n 'library.clickToPlace': 'বসাতে একটি ফাইলে ক্লিক করুন · অথবা ক্যানভাসে ফাইল টেনে আনুন',\r\n 'library.clickToReplace': 'নির্বাচিত ইমেজ প্রতিস্থাপন করতে একটি ফাইলে ক্লিক করুন',\r\n 'library.storageLabel': '{count}টি ফাইল · {size}',\r\n 'library.folders': 'ফোল্ডার',\r\n 'library.dropHint': 'আপলোড করতে এখানে ইমেজ ফাইল ড্রপ করুন — অথবা আপলোড বোতাম ব্যবহার করুন।',\r\n 'library.deleteFileHint': 'ফাইল মুছুন',\r\n 'library.del': 'মুছুন',\r\n 'toast.assetDeleted': '{name} মুছে ফেলা হয়েছে',\r\n\r\n 'modal.export': 'রপ্তানি',\r\n 'modal.exportTitle': 'টেবিল-ভিত্তিক ইমেইল HTML',\r\n 'export.copy': 'কপি',\r\n 'export.copied': 'কপি হয়েছে',\r\n 'action.download': 'ডাউনলোড',\r\n 'export.meta': '{kb} KB · টেবিল + ইনলাইন স্টাইল · Outlook-নিরাপদ প্রস্থ',\r\n\r\n 'modal.rawHtmlTitle': 'Raw HTML, লাইভ প্রিভিউ',\r\n 'code.statusEdited': 'কোড ভিউ — সম্পাদিত — প্রিভিউ লাইভ, এখনো প্রয়োগ হয়নি',\r\n 'code.statusSynced': 'কোড ভিউ — ক্যানভাসের সাথে সিঙ্ক করা আছে',\r\n 'action.reload': 'রিলোড',\r\n 'action.reloadHint': 'ক্যানভাস থেকে সোর্স পুনরায় লোড করুন',\r\n 'action.applyToCanvas': 'ক্যানভাসে প্রয়োগ করুন',\r\n 'action.applyToCanvasHint': 'সোর্সটি সম্পাদনাযোগ্য সারিতে পার্স করুন',\r\n 'action.closeWithoutApplyingHint': 'প্রয়োগ না করে বন্ধ করুন',\r\n 'code.source': 'সোর্স',\r\n 'code.livePreview': 'লাইভ প্রিভিউ',\r\n 'code.liveHtmlPreviewTitle': 'লাইভ HTML প্রিভিউ',\r\n 'code.applyNote':\r\n 'প্রয়োগ করলে প্রতিটি টেবিল সারি একটি ক্যানভাস সারিতে পার্স হয় যা আপনি এখনও নির্বাচন, পুনর্বিন্যাস ও মুছতে পারবেন — হাতে-লেখা মার্কআপ অক্ষত থাকে।',\r\n 'code.meta': '{kb} KB · {lines}টি লাইন',\r\n 'toast.sourceReloaded': 'ক্যানভাস থেকে সোর্স পুনরায় লোড হয়েছে',\r\n 'toast.sourceAppliedOne': 'সোর্স প্রয়োগ হয়েছে — ক্যানভাসে ১টি সারি',\r\n 'toast.sourceAppliedMany': 'সোর্স প্রয়োগ হয়েছে — ক্যানভাসে {rows}টি সারি',\r\n 'toast.parseError': 'সেই HTML পার্স করা যায়নি',\r\n\r\n 'modal.copyAssist': 'কপি সহায়ক',\r\n 'modal.draftCopyTitle': 'এই ক্যাম্পেইনের জন্য কপি লিখুন',\r\n 'ai.goal': 'লক্ষ্য',\r\n 'ai.tone': 'সুর',\r\n 'ai.briefLabel': 'এই ইমেইলটি কী সম্পর্কে?',\r\n 'ai.briefPlaceholder': 'যেমন: শরৎকালীন আউটারওয়্যার, সাবস্ক্রাইবারদের জন্য ১৫% ছাড়, $১৫০-এর উপরে ফ্রি শিপিং',\r\n 'ai.generate': 'কপি তৈরি করুন',\r\n 'ai.writing': 'লেখা হচ্ছে…',\r\n 'ai.kindHeadline': 'হেডলাইন',\r\n 'ai.kindBody': 'মূল লেখা',\r\n 'ai.kindButton': 'বাটন লেবেল',\r\n 'ai.actionInsertHeading': 'হেডিং হিসেবে বসান',\r\n 'ai.actionInsertText': 'টেক্সট ব্লক হিসেবে বসান',\r\n 'ai.actionInsertButton': 'বাটন হিসেবে বসান',\r\n 'toast.headingAdded': 'হেডিং যোগ হয়েছে',\r\n 'toast.textBlockAdded': 'টেক্সট ব্লক যোগ হয়েছে',\r\n 'toast.buttonAdded': 'বাটন যোগ হয়েছে',\r\n\r\n 'preview.kickerMobile': 'প্রিভিউ — মোবাইল ৩৭৫px',\r\n 'preview.kickerDark': 'প্রিভিউ — ডার্ক ইনবক্স',\r\n 'preview.kickerDesktop': 'প্রিভিউ — ডেস্কটপ {width}px',\r\n 'action.close': 'বন্ধ করুন',\r\n\r\n 'toast.duplicated': 'নকল করা হয়েছে',\r\n 'toast.fileUploadedOne': '১টি ফাইল আপলোড হয়েছে',\r\n 'toast.fileUploadedMany': '{count}টি ফাইল আপলোড হয়েছে',\r\n 'toast.imageReplaced': 'ইমেজ প্রতিস্থাপিত হয়েছে',\r\n 'toast.imageAdded': 'ক্যানভাসে ইমেজ যোগ হয়েছে',\r\n 'toast.htmlCopied': 'HTML ক্লিপবোর্ডে কপি হয়েছে',\r\n 'toast.templateLoaded': '{name} লোড হয়েছে',\r\n 'toast.snippetDefaultLabel': 'স্নিপেট',\r\n 'toast.snippetInserted': '{name} বসানো হয়েছে',\r\n 'toast.snippetCopied': '{name} কপি হয়েছে — বসাতে একটি টেক্সট ব্লক নির্বাচন করুন',\r\n};\r\n\r\n\nObject.assign(exports, { BN });\n\n};\n__modules[\"core/i18n/ca.js\"] = function(module, exports, __require) {\n/** Catalan (Català) — `ca`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst CA = {\r\n 'action.undoHint': 'Desfés — ⌘Z',\r\n 'action.redoHint': 'Refés — ⌘⇧Z',\r\n 'action.chromeToDark': 'Fosc',\r\n 'action.chromeToLight': 'Clar',\r\n 'action.chromeHint': 'Tema de l’editor clar / fosc',\r\n 'action.aiCopy': 'Text',\r\n 'action.aiCopyHint': 'Redactar text amb IA',\r\n 'action.code': 'Codi',\r\n 'action.codeHint': 'Editar l’HTML en brut amb previsualització en directe',\r\n 'action.preview': 'Previsualització',\r\n 'action.export': 'Exporta',\r\n 'device.desktop': 'Escriptori',\r\n 'device.desktopHint': 'Amplada d’escriptori',\r\n 'device.mobile': 'Mòbil',\r\n 'device.mobileHint': 'Amplada mòbil',\r\n 'device.dark': 'Fosc',\r\n 'device.darkHint': 'Bústia en mode fosc',\r\n 'status.autosaveOn': 'desament automàtic activat',\r\n 'status.saved': 'desat {time}',\r\n 'status.saveFailed': 'no desat — emmagatzematge ple',\r\n 'canvas.meta': '{rows} files · {blocks} blocs · {width}px',\r\n 'tab.design': 'Estil',\r\n 'tab.designHint': 'Aplica estil a la selecció',\r\n 'tab.blocks': 'Blocs',\r\n 'tab.blocksHint': 'Blocs de contingut i variables',\r\n 'tab.rows': 'Seccions',\r\n 'tab.rowsHint': 'Dissenys de secció i model de llenç',\r\n 'tab.files': 'Fitxers',\r\n 'tab.filesHint': 'Biblioteca de recursos',\r\n 'tab.layers': 'Estruct.',\r\n 'tab.layersHint': 'Estructura del document',\r\n 'tab.theme': 'Tema',\r\n 'tab.themeHint': 'Estils globals',\r\n 'tab.data': 'Var.',\r\n 'tab.dataHint': 'Variables proporcionades pel vostre codi',\r\n 'inspector.blockProperties': 'Propietats del bloc',\r\n 'inspector.sectionProperties': 'Propietats de la secció',\r\n 'inspector.title': 'Inspector',\r\n 'inspector.sectionLabel': 'Secció',\r\n 'inspector.nothingSelected': 'Res seleccionat',\r\n 'action.duplicateHint': 'Duplica — ⌘D',\r\n 'action.deleteHint': 'Elimina — ⌫',\r\n 'inspector.emptyBody':\r\n 'Seleccioneu una fila o un bloc al llenç per donar-li estil aquí. Arrossegueu blocs des de la pestanya <strong style=\"color: var(--ed-text); font-weight: 600;\">Blocs</strong>; feu doble clic a qualsevol text per editar-lo directament.',\r\n 'inspector.shortcuts': 'Dreceres',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — desfés, refés',\r\n 'shortcut.duplicate': '⌘D — duplica la selecció',\r\n 'shortcut.delete': '⌫ — elimina la selecció',\r\n 'shortcut.export': '⌘E — exporta HTML',\r\n 'shortcut.escape': 'ESC — desselecciona, tanca',\r\n 'blocks.dragHint': 'Arrossegueu al llenç',\r\n 'blocks.count': '{count} blocs',\r\n 'rows.sectionLayouts': 'Dissenys de secció',\r\n 'rows.customMarkup': 'Marcat personalitzat',\r\n 'rows.htmlRowHint': 'Arrossegueu per inserir, o feu clic per afegir — una fila d’amplada completa que ompliu amb HTML en brut',\r\n 'rows.rawHtmlSection': 'Secció d’HTML en brut',\r\n 'rows.rawHtmlDesc': 'Secció d’amplada completa, el vostre propi marcat, encara es pot arrossegar',\r\n 'rows.canvasModel': 'Model de llenç',\r\n 'rows.modeRowBased': 'Basat en files',\r\n 'rows.modeFreeStack': 'Pila lliure',\r\n 'rows.hintRows':\r\n 'Basat en seccions: primer deixeu anar un disseny, després blocs a les seves columnes — cada secció té el seu propi fons, vora, configuració flex o de graella.',\r\n 'rows.hintStack': 'Pila lliure: sense dissenys — cada bloc que deixeu anar esdevé la seva pròpia secció d’amplada completa, apilada en ordre.',\r\n 'files.libraryCount': 'Biblioteca — {count} fitxers',\r\n 'files.openManager': 'Obre el gestor de fitxers',\r\n 'files.dragToCanvas': 'Arrossegueu qualsevol fitxer directament al llenç per col·locar-lo com a bloc d’imatge.',\r\n 'layers.structure': 'Estructura',\r\n 'layers.sectionSingle': 'Secció',\r\n 'layers.sectionMulti': 'Secció · {count} col.',\r\n 'layers.blockCount': '{count} bl.',\r\n 'theme.globalStyles': 'Estils globals',\r\n 'vars.title': 'Variables',\r\n 'vars.fromCode': '{count} del vostre codi',\r\n 'vars.declaredNote': 'Declarades per la vostra aplicació — el llenç sempre mostra el testimoni, mai un valor.',\r\n 'vars.filterPlaceholder': 'Filtra variables…',\r\n 'vars.insertHint': 'Feu clic per inserir al text, títol o botó seleccionat',\r\n 'vars.insert': 'insereix',\r\n 'vars.noMatch': 'Cap variable coincideix amb aquest filtre.',\r\n 'vars.noneDeclared': 'La vostra aplicació encara no ha declarat cap variable.',\r\n 'vars.rteHint': 'Mentre editeu text, també podeu triar una variable directament des del menú desplegable de la barra d’eines en línia.',\r\n 'modal.fileManager': 'Gestor de fitxers',\r\n 'modal.assetsTitle': 'Recursos',\r\n 'modal.replaceImage': 'Substitueix la imatge',\r\n 'library.searchPlaceholder': 'Cerca fitxers…',\r\n 'action.upload': 'Puja',\r\n 'library.clickToPlace': 'Feu clic a un fitxer per col·locar-lo · o arrossegueu un fitxer al llenç',\r\n 'library.clickToReplace': 'Feu clic a un fitxer per substituir la imatge seleccionada',\r\n 'library.storageLabel': '{count} fitxers · {size}',\r\n 'library.folders': 'Carpetes',\r\n 'library.dropHint': 'Deixeu anar fitxers d’imatge aquí per pujar-los — o utilitzeu el botó Puja.',\r\n 'library.deleteFileHint': 'Elimina el fitxer',\r\n 'library.del': 'ELIM',\r\n 'toast.assetDeleted': '{name} eliminat',\r\n 'modal.export': 'Exporta',\r\n 'modal.exportTitle': 'HTML de correu basat en taules',\r\n 'export.copy': 'Copia',\r\n 'export.copied': 'Copiat',\r\n 'action.download': 'Descarrega',\r\n 'export.meta': '{kb} KB · taules + estils en línia · amplades segures per a Outlook',\r\n 'modal.rawHtmlTitle': 'HTML en brut, previsualització en directe',\r\n 'code.statusEdited': 'Vista de codi — editat — previsualització en directe, encara no aplicat',\r\n 'code.statusSynced': 'Vista de codi — sincronitzat amb el llenç',\r\n 'action.reload': 'Recarrega',\r\n 'action.reloadHint': 'Recarrega la font des del llenç',\r\n 'action.applyToCanvas': 'Aplica al llenç',\r\n 'action.applyToCanvasHint': 'Torna a analitzar la font en files editables',\r\n 'action.closeWithoutApplyingHint': 'Tanca sense aplicar',\r\n 'code.source': 'Font',\r\n 'code.livePreview': 'Previsualització en directe',\r\n 'code.liveHtmlPreviewTitle': 'Previsualització d’HTML en directe',\r\n 'code.applyNote':\r\n 'Aplicar analitza cada fila de taula de nivell superior en una fila de llenç que encara podeu seleccionar, reordenar i eliminar — el marcatge escrit a mà sobreviu al procés.',\r\n 'code.meta': '{kb} KB · {lines} línies',\r\n 'toast.sourceReloaded': 'Font recarregada des del llenç',\r\n 'toast.sourceAppliedOne': 'Font aplicada — 1 fila al llenç',\r\n 'toast.sourceAppliedMany': 'Font aplicada — {rows} files al llenç',\r\n 'toast.parseError': 'No s’ha pogut analitzar aquest HTML',\r\n 'modal.copyAssist': 'Assistent de redacció',\r\n 'modal.draftCopyTitle': 'Redacta text per a aquesta campanya',\r\n 'ai.goal': 'Objectiu',\r\n 'ai.tone': 'To',\r\n 'ai.briefLabel': 'De què tracta aquest correu?',\r\n 'ai.briefPlaceholder': 'p. ex. Col·lecció de tardor, 15% per a subscriptors, enviament gratuït a partir de 150 €',\r\n 'ai.generate': 'Genera text',\r\n 'ai.writing': 'S’està escrivint…',\r\n 'ai.kindHeadline': 'Titular',\r\n 'ai.kindBody': 'Cos del text',\r\n 'ai.kindButton': 'Text del botó',\r\n 'ai.actionInsertHeading': 'Insereix com a capçalera',\r\n 'ai.actionInsertText': 'Insereix com a bloc de text',\r\n 'ai.actionInsertButton': 'Insereix com a botó',\r\n 'toast.headingAdded': 'Capçalera afegida',\r\n 'toast.textBlockAdded': 'Bloc de text afegit',\r\n 'toast.buttonAdded': 'Botó afegit',\r\n 'preview.kickerMobile': 'Previsualització — mòbil 375px',\r\n 'preview.kickerDark': 'Previsualització — bústia fosca',\r\n 'preview.kickerDesktop': 'Previsualització — escriptori {width}px',\r\n 'action.close': 'Tanca',\r\n 'toast.duplicated': 'Duplicat',\r\n 'toast.fileUploadedOne': '1 fitxer pujat',\r\n 'toast.fileUploadedMany': '{count} fitxers pujats',\r\n 'toast.imageReplaced': 'Imatge substituïda',\r\n 'toast.imageAdded': 'Imatge afegida al llenç',\r\n 'toast.htmlCopied': 'HTML copiat al porta-retalls',\r\n 'toast.templateLoaded': '{name} carregat',\r\n 'toast.snippetDefaultLabel': 'Fragment',\r\n 'toast.snippetInserted': '{name} inserit',\r\n 'toast.snippetCopied': '{name} copiat — seleccioneu un bloc de text per inserir-lo',\r\n};\r\n\r\n\nObject.assign(exports, { CA });\n\n};\n__modules[\"core/i18n/cs.js\"] = function(module, exports, __require) {\n/** Czech (Čeština) — `cs`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst CS = {\r\n 'action.undoHint': 'Zpět — ⌘Z',\r\n 'action.redoHint': 'Znovu — ⌘⇧Z',\r\n 'action.chromeToDark': 'Tmavý',\r\n 'action.chromeToLight': 'Světlý',\r\n 'action.chromeHint': 'Motiv editoru světlý / tmavý',\r\n 'action.aiCopy': 'Text',\r\n 'action.aiCopyHint': 'Napsat text pomocí AI',\r\n 'action.code': 'Kód',\r\n 'action.codeHint': 'Upravit surové HTML s živým náhledem',\r\n 'action.preview': 'Náhled',\r\n 'action.export': 'Exportovat',\r\n 'device.desktop': 'Počítač',\r\n 'device.desktopHint': 'Šířka pro počítač',\r\n 'device.mobile': 'Mobil',\r\n 'device.mobileHint': 'Šířka pro mobil',\r\n 'device.dark': 'Tmavý',\r\n 'device.darkHint': 'Tmavý režim schránky',\r\n 'status.autosaveOn': 'automatické ukládání zapnuto',\r\n 'status.saved': 'uloženo {time}',\r\n 'status.saveFailed': 'neuloženo — úložiště je plné',\r\n 'canvas.meta': '{rows} řádků · {blocks} bloků · {width}px',\r\n 'tab.design': 'Styl',\r\n 'tab.designHint': 'Stylovat výběr',\r\n 'tab.blocks': 'Bloky',\r\n 'tab.blocksHint': 'Bloky obsahu a proměnné',\r\n 'tab.rows': 'Sekce',\r\n 'tab.rowsHint': 'Rozvržení sekcí a model plátna',\r\n 'tab.files': 'Soubory',\r\n 'tab.filesHint': 'Knihovna souborů',\r\n 'tab.layers': 'Struktura',\r\n 'tab.layersHint': 'Struktura dokumentu',\r\n 'tab.theme': 'Motiv',\r\n 'tab.themeHint': 'Globální styly',\r\n 'tab.data': 'Prom.',\r\n 'tab.dataHint': 'Proměnné poskytnuté vaším kódem',\r\n 'inspector.blockProperties': 'Vlastnosti bloku',\r\n 'inspector.sectionProperties': 'Vlastnosti sekce',\r\n 'inspector.title': 'Inspektor',\r\n 'inspector.sectionLabel': 'Sekce',\r\n 'inspector.nothingSelected': 'Nic není vybráno',\r\n 'action.duplicateHint': 'Duplikovat — ⌘D',\r\n 'action.deleteHint': 'Smazat — ⌫',\r\n 'inspector.emptyBody':\r\n 'Vyberte řádek nebo blok na plátně a stylujte jej zde. Přetáhněte bloky z karty <strong style=\"color: var(--ed-text); font-weight: 600;\">Bloky</strong>; dvojklikem na text jej upravíte přímo na místě.',\r\n 'inspector.shortcuts': 'Zkratky',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — zpět, znovu',\r\n 'shortcut.duplicate': '⌘D — duplikovat výběr',\r\n 'shortcut.delete': '⌫ — smazat výběr',\r\n 'shortcut.export': '⌘E — exportovat HTML',\r\n 'shortcut.escape': 'ESC — zrušit výběr, zavřít',\r\n 'blocks.dragHint': 'Přetáhněte na plátno',\r\n 'blocks.count': '{count} bloků',\r\n 'rows.sectionLayouts': 'Rozvržení sekcí',\r\n 'rows.customMarkup': 'Vlastní kód',\r\n 'rows.htmlRowHint': 'Přetáhněte pro vložení nebo klikněte pro přidání — řádek na celou šířku, který vyplníte surovým HTML',\r\n 'rows.rawHtmlSection': 'Sekce se surovým HTML',\r\n 'rows.rawHtmlDesc': 'Sekce na celou šířku, váš vlastní kód, stále přetažitelná',\r\n 'rows.canvasModel': 'Model plátna',\r\n 'rows.modeRowBased': 'Založeno na řádcích',\r\n 'rows.modeFreeStack': 'Volný zásobník',\r\n 'rows.hintRows':\r\n 'Založeno na sekcích: nejprve umístěte rozvržení, poté bloky do jeho sloupců — každá sekce má vlastní pozadí, ohraničení, nastavení flex nebo mřížky.',\r\n 'rows.hintStack': 'Volný zásobník: bez rozvržení — každý umístěný blok se stane vlastní sekcí na celou šířku, seřazenou postupně.',\r\n 'files.libraryCount': 'Knihovna — {count} souborů',\r\n 'files.openManager': 'Otevřít správce souborů',\r\n 'files.dragToCanvas': 'Přetáhněte libovolný soubor přímo na plátno a umístěte jej jako obrazový blok.',\r\n 'layers.structure': 'Struktura',\r\n 'layers.sectionSingle': 'Sekce',\r\n 'layers.sectionMulti': 'Sekce · {count} sloupců',\r\n 'layers.blockCount': '{count} bl.',\r\n 'theme.globalStyles': 'Globální styly',\r\n 'vars.title': 'Proměnné',\r\n 'vars.fromCode': '{count} z vašeho kódu',\r\n 'vars.declaredNote': 'Deklarované vaší aplikací — plátno vždy zobrazuje token, nikdy hodnotu.',\r\n 'vars.filterPlaceholder': 'Filtrovat proměnné…',\r\n 'vars.insertHint': 'Klikněte pro vložení do vybraného textu, nadpisu nebo tlačítka',\r\n 'vars.insert': 'vložit',\r\n 'vars.noMatch': 'Žádná proměnná neodpovídá tomuto filtru.',\r\n 'vars.noneDeclared': 'Vaše aplikace zatím nedeklarovala žádné proměnné.',\r\n 'vars.rteHint': 'Při úpravě textu můžete proměnnou vybrat i přímo z rozbalovací nabídky vloženého panelu nástrojů.',\r\n 'modal.fileManager': 'Správce souborů',\r\n 'modal.assetsTitle': 'Zdroje',\r\n 'modal.replaceImage': 'Nahradit obrázek',\r\n 'library.searchPlaceholder': 'Hledat soubory…',\r\n 'action.upload': 'Nahrát',\r\n 'library.clickToPlace': 'Klikněte na soubor pro umístění · nebo přetáhněte soubor na plátno',\r\n 'library.clickToReplace': 'Klikněte na soubor pro nahrazení vybraného obrázku',\r\n 'library.storageLabel': '{count} souborů · {size}',\r\n 'library.folders': 'Složky',\r\n 'library.dropHint': 'Sem přetáhněte obrázkové soubory pro nahrání — nebo použijte tlačítko Nahrát.',\r\n 'library.deleteFileHint': 'Smazat soubor',\r\n 'library.del': 'SMAZ',\r\n 'toast.assetDeleted': '{name} smazán',\r\n 'modal.export': 'Exportovat',\r\n 'modal.exportTitle': 'HTML e-mailu založené na tabulkách',\r\n 'export.copy': 'Kopírovat',\r\n 'export.copied': 'Zkopírováno',\r\n 'action.download': 'Stáhnout',\r\n 'export.meta': '{kb} KB · tabulky + vložené styly · šířky bezpečné pro Outlook',\r\n 'modal.rawHtmlTitle': 'Surové HTML, živý náhled',\r\n 'code.statusEdited': 'Zobrazení kódu — upraveno — náhled živě, zatím neaplikováno',\r\n 'code.statusSynced': 'Zobrazení kódu — synchronizováno s plátnem',\r\n 'action.reload': 'Znovu načíst',\r\n 'action.reloadHint': 'Znovu načíst zdroj z plátna',\r\n 'action.applyToCanvas': 'Použít na plátno',\r\n 'action.applyToCanvasHint': 'Znovu rozebrat zdroj na editovatelné řádky',\r\n 'action.closeWithoutApplyingHint': 'Zavřít bez použití',\r\n 'code.source': 'Zdroj',\r\n 'code.livePreview': 'Živý náhled',\r\n 'code.liveHtmlPreviewTitle': 'Živý náhled HTML',\r\n 'code.applyNote':\r\n 'Použití rozebere každý řádek tabulky nejvyšší úrovně do řádku plátna, který lze stále vybírat, přeuspořádávat a mazat — ručně psaný kód proces přežije beze změny.',\r\n 'code.meta': '{kb} KB · {lines} řádků',\r\n 'toast.sourceReloaded': 'Zdroj znovu načten z plátna',\r\n 'toast.sourceAppliedOne': 'Zdroj použit — 1 řádek na plátně',\r\n 'toast.sourceAppliedMany': 'Zdroj použit — {rows} řádků na plátně',\r\n 'toast.parseError': 'Toto HTML se nepodařilo rozebrat',\r\n 'modal.copyAssist': 'Asistent pro text',\r\n 'modal.draftCopyTitle': 'Napsat text pro tuto kampaň',\r\n 'ai.goal': 'Cíl',\r\n 'ai.tone': 'Tón',\r\n 'ai.briefLabel': 'O čem tento e-mail je?',\r\n 'ai.briefPlaceholder': 'např. Podzimní kolekce, 15 % pro odběratele, doprava zdarma nad 150 €',\r\n 'ai.generate': 'Vygenerovat text',\r\n 'ai.writing': 'Píše se…',\r\n 'ai.kindHeadline': 'Nadpis',\r\n 'ai.kindBody': 'Hlavní text',\r\n 'ai.kindButton': 'Text tlačítka',\r\n 'ai.actionInsertHeading': 'Vložit jako nadpis',\r\n 'ai.actionInsertText': 'Vložit jako textový blok',\r\n 'ai.actionInsertButton': 'Vložit jako tlačítko',\r\n 'toast.headingAdded': 'Nadpis přidán',\r\n 'toast.textBlockAdded': 'Textový blok přidán',\r\n 'toast.buttonAdded': 'Tlačítko přidáno',\r\n 'preview.kickerMobile': 'Náhled — mobil 375px',\r\n 'preview.kickerDark': 'Náhled — tmavá schránka',\r\n 'preview.kickerDesktop': 'Náhled — počítač {width}px',\r\n 'action.close': 'Zavřít',\r\n 'toast.duplicated': 'Duplikováno',\r\n 'toast.fileUploadedOne': 'Nahrán 1 soubor',\r\n 'toast.fileUploadedMany': 'Nahráno souborů: {count}',\r\n 'toast.imageReplaced': 'Obrázek nahrazen',\r\n 'toast.imageAdded': 'Obrázek přidán na plátno',\r\n 'toast.htmlCopied': 'HTML zkopírováno do schránky',\r\n 'toast.templateLoaded': '{name} načteno',\r\n 'toast.snippetDefaultLabel': 'Úryvek',\r\n 'toast.snippetInserted': '{name} vloženo',\r\n 'toast.snippetCopied': '{name} zkopírováno — vyberte textový blok pro vložení',\r\n};\r\n\r\n\nObject.assign(exports, { CS });\n\n};\n__modules[\"core/i18n/da.js\"] = function(module, exports, __require) {\n/** Danish (Dansk) — `da`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst DA = {\r\n 'action.undoHint': 'Fortryd — ⌘Z',\r\n 'action.redoHint': 'Gentag — ⌘⇧Z',\r\n 'action.chromeToDark': 'Mørk',\r\n 'action.chromeToLight': 'Lys',\r\n 'action.chromeHint': 'Redigeringstema lys / mørk',\r\n 'action.aiCopy': 'Tekst',\r\n 'action.aiCopyHint': 'Skriv tekst med AI',\r\n 'action.code': 'Kode',\r\n 'action.codeHint': 'Rediger rå HTML med direkte forhåndsvisning',\r\n 'action.preview': 'Forhåndsvisning',\r\n 'action.export': 'Eksportér',\r\n 'device.desktop': 'Computer',\r\n 'device.desktopHint': 'Bredde til computer',\r\n 'device.mobile': 'Mobil',\r\n 'device.mobileHint': 'Bredde til mobil',\r\n 'device.dark': 'Mørk',\r\n 'device.darkHint': 'Mørk tilstand for indbakke',\r\n 'status.autosaveOn': 'automatisk gemning slået til',\r\n 'status.saved': 'gemt {time}',\r\n 'status.saveFailed': 'ikke gemt — lagerplads fuld',\r\n 'canvas.meta': '{rows} rækker · {blocks} blokke · {width}px',\r\n 'tab.design': 'Stil',\r\n 'tab.designHint': 'Formatér markeringen',\r\n 'tab.blocks': 'Blokke',\r\n 'tab.blocksHint': 'Indholdsblokke og variabler',\r\n 'tab.rows': 'Sektioner',\r\n 'tab.rowsHint': 'Sektionslayouts og lærredsmodel',\r\n 'tab.files': 'Filer',\r\n 'tab.filesHint': 'Ressourcebibliotek',\r\n 'tab.layers': 'Struktur',\r\n 'tab.layersHint': 'Dokumentstruktur',\r\n 'tab.theme': 'Tema',\r\n 'tab.themeHint': 'Globale stilarter',\r\n 'tab.data': 'Var.',\r\n 'tab.dataHint': 'Variabler leveret af din kode',\r\n 'inspector.blockProperties': 'Blokegenskaber',\r\n 'inspector.sectionProperties': 'Sektionsegenskaber',\r\n 'inspector.title': 'Inspektør',\r\n 'inspector.sectionLabel': 'Sektion',\r\n 'inspector.nothingSelected': 'Intet valgt',\r\n 'action.duplicateHint': 'Dupliker — ⌘D',\r\n 'action.deleteHint': 'Slet — ⌫',\r\n 'inspector.emptyBody':\r\n 'Vælg en række eller en blok på lærredet for at formatere den her. Træk blokke fra fanen <strong style=\"color: var(--ed-text); font-weight: 600;\">Blokke</strong>; dobbeltklik på tekst for at redigere direkte.',\r\n 'inspector.shortcuts': 'Genveje',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — fortryd, gentag',\r\n 'shortcut.duplicate': '⌘D — dupliker markering',\r\n 'shortcut.delete': '⌫ — slet markering',\r\n 'shortcut.export': '⌘E — eksportér HTML',\r\n 'shortcut.escape': 'ESC — fjern markering, luk',\r\n 'blocks.dragHint': 'Træk til lærredet',\r\n 'blocks.count': '{count} blokke',\r\n 'rows.sectionLayouts': 'Sektionslayouts',\r\n 'rows.customMarkup': 'Tilpasset kode',\r\n 'rows.htmlRowHint': 'Træk for at indsætte, eller klik for at tilføje — en fuldbredde-række, du fylder med rå HTML',\r\n 'rows.rawHtmlSection': 'Rå HTML-sektion',\r\n 'rows.rawHtmlDesc': 'Fuldbredde-sektion, din egen kode, stadig trækbar',\r\n 'rows.canvasModel': 'Lærredsmodel',\r\n 'rows.modeRowBased': 'Rækkebaseret',\r\n 'rows.modeFreeStack': 'Fri stak',\r\n 'rows.hintRows':\r\n 'Sektionsbaseret: slip et layout først, derefter blokke i dets kolonner — hver sektion har sin egen baggrund, kant, flex- eller gitterindstillinger.',\r\n 'rows.hintStack': 'Fri stak: uden layouts — hver blok, du slipper, bliver sin egen fuldbredde-sektion, stablet i rækkefølge.',\r\n 'files.libraryCount': 'Bibliotek — {count} filer',\r\n 'files.openManager': 'Åbn filhåndtering',\r\n 'files.dragToCanvas': 'Træk en vilkårlig fil direkte til lærredet for at placere den som en billedblok.',\r\n 'layers.structure': 'Struktur',\r\n 'layers.sectionSingle': 'Sektion',\r\n 'layers.sectionMulti': 'Sektion · {count} kol.',\r\n 'layers.blockCount': '{count} bl.',\r\n 'theme.globalStyles': 'Globale stilarter',\r\n 'vars.title': 'Variabler',\r\n 'vars.fromCode': '{count} fra din kode',\r\n 'vars.declaredNote': 'Erklæret af din applikation — lærredet viser altid tokenet, aldrig en værdi.',\r\n 'vars.filterPlaceholder': 'Filtrér variabler…',\r\n 'vars.insertHint': 'Klik for at indsætte i markeret tekst, overskrift eller knap',\r\n 'vars.insert': 'indsæt',\r\n 'vars.noMatch': 'Ingen variabel matcher det filter.',\r\n 'vars.noneDeclared': 'Din applikation har endnu ikke erklæret nogen variabler.',\r\n 'vars.rteHint': 'Når du redigerer tekst, kan du også vælge en variabel direkte fra rullemenuen i den indlejrede værktøjslinje.',\r\n 'modal.fileManager': 'Filhåndtering',\r\n 'modal.assetsTitle': 'Ressourcer',\r\n 'modal.replaceImage': 'Erstat billede',\r\n 'library.searchPlaceholder': 'Søg i filer…',\r\n 'action.upload': 'Upload',\r\n 'library.clickToPlace': 'Klik på en fil for at placere den · eller træk en fil til lærredet',\r\n 'library.clickToReplace': 'Klik på en fil for at erstatte det markerede billede',\r\n 'library.storageLabel': '{count} filer · {size}',\r\n 'library.folders': 'Mapper',\r\n 'library.dropHint': 'Slip billedfiler her for at uploade — eller brug knappen Upload.',\r\n 'library.deleteFileHint': 'Slet fil',\r\n 'library.del': 'SLET',\r\n 'toast.assetDeleted': '{name} slettet',\r\n 'modal.export': 'Eksportér',\r\n 'modal.exportTitle': 'Tabelbaseret e-mail-HTML',\r\n 'export.copy': 'Kopiér',\r\n 'export.copied': 'Kopieret',\r\n 'action.download': 'Download',\r\n 'export.meta': '{kb} KB · tabeller + inline-stilarter · Outlook-sikre bredder',\r\n 'modal.rawHtmlTitle': 'Rå HTML, direkte forhåndsvisning',\r\n 'code.statusEdited': 'Kodevisning — redigeret — forhåndsvisning live, endnu ikke anvendt',\r\n 'code.statusSynced': 'Kodevisning — synkroniseret med lærredet',\r\n 'action.reload': 'Genindlæs',\r\n 'action.reloadHint': 'Genindlæs kilde fra lærredet',\r\n 'action.applyToCanvas': 'Anvend på lærred',\r\n 'action.applyToCanvasHint': 'Fortolk kilden tilbage til redigerbare rækker',\r\n 'action.closeWithoutApplyingHint': 'Luk uden at anvende',\r\n 'code.source': 'Kilde',\r\n 'code.livePreview': 'Direkte forhåndsvisning',\r\n 'code.liveHtmlPreviewTitle': 'Direkte HTML-forhåndsvisning',\r\n 'code.applyNote':\r\n 'Anvend fortolker hver tabelrække på øverste niveau til en lærredsrække, du stadig kan markere, omarrangere og slette — håndskrevet kode overlever processen uændret.',\r\n 'code.meta': '{kb} KB · {lines} linjer',\r\n 'toast.sourceReloaded': 'Kilde genindlæst fra lærredet',\r\n 'toast.sourceAppliedOne': 'Kilde anvendt — 1 række på lærredet',\r\n 'toast.sourceAppliedMany': 'Kilde anvendt — {rows} rækker på lærredet',\r\n 'toast.parseError': 'Kunne ikke fortolke den HTML',\r\n 'modal.copyAssist': 'Tekstassistent',\r\n 'modal.draftCopyTitle': 'Skriv tekst til denne kampagne',\r\n 'ai.goal': 'Mål',\r\n 'ai.tone': 'Tone',\r\n 'ai.briefLabel': 'Hvad handler denne e-mail om?',\r\n 'ai.briefPlaceholder': 'f.eks. Efterårskollektion, 15% til abonnenter, fragtfrit over 150 kr',\r\n 'ai.generate': 'Generér tekst',\r\n 'ai.writing': 'Skriver…',\r\n 'ai.kindHeadline': 'Overskrift',\r\n 'ai.kindBody': 'Brødtekst',\r\n 'ai.kindButton': 'Knaptekst',\r\n 'ai.actionInsertHeading': 'Indsæt som overskrift',\r\n 'ai.actionInsertText': 'Indsæt som tekstblok',\r\n 'ai.actionInsertButton': 'Indsæt som knap',\r\n 'toast.headingAdded': 'Overskrift tilføjet',\r\n 'toast.textBlockAdded': 'Tekstblok tilføjet',\r\n 'toast.buttonAdded': 'Knap tilføjet',\r\n 'preview.kickerMobile': 'Forhåndsvisning — mobil 375px',\r\n 'preview.kickerDark': 'Forhåndsvisning — mørk indbakke',\r\n 'preview.kickerDesktop': 'Forhåndsvisning — computer {width}px',\r\n 'action.close': 'Luk',\r\n 'toast.duplicated': 'Duplikeret',\r\n 'toast.fileUploadedOne': '1 fil uploadet',\r\n 'toast.fileUploadedMany': '{count} filer uploadet',\r\n 'toast.imageReplaced': 'Billede erstattet',\r\n 'toast.imageAdded': 'Billede tilføjet til lærredet',\r\n 'toast.htmlCopied': 'HTML kopieret til udklipsholder',\r\n 'toast.templateLoaded': '{name} indlæst',\r\n 'toast.snippetDefaultLabel': 'Uddrag',\r\n 'toast.snippetInserted': '{name} indsat',\r\n 'toast.snippetCopied': '{name} kopieret — vælg en tekstblok for at indsætte den',\r\n};\r\n\r\n\nObject.assign(exports, { DA });\n\n};\n__modules[\"core/i18n/de-CH.js\"] = function(module, exports, __require) {\n/** Swiss High German (Schweizer Hochdeutsch) — `de-CH`. Same table as `de.js` with the Swiss orthography rule applied (ß → ss); Swiss keyboards and style guides don't use ß at all. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst DE_CH = {\r\n 'action.undoHint': 'Rückgängig — ⌘Z',\r\n 'action.redoHint': 'Wiederholen — ⌘⇧Z',\r\n 'action.chromeToDark': 'Dunkel',\r\n 'action.chromeToLight': 'Hell',\r\n 'action.chromeHint': 'Editor-Design hell / dunkel',\r\n 'action.aiCopy': 'Text',\r\n 'action.aiCopyHint': 'Text mit KI entwerfen',\r\n 'action.code': 'Code',\r\n 'action.codeHint': 'Rohes HTML mit Live-Vorschau bearbeiten',\r\n 'action.preview': 'Vorschau',\r\n 'action.export': 'Exportieren',\r\n 'device.desktop': 'Desktop',\r\n 'device.desktopHint': 'Desktop-Breite',\r\n 'device.mobile': 'Mobil',\r\n 'device.mobileHint': 'Mobile Breite',\r\n 'device.dark': 'Dunkel',\r\n 'device.darkHint': 'Dunkler Posteingang',\r\n 'status.autosaveOn': 'Autospeichern aktiv',\r\n 'status.saved': 'gespeichert {time}',\r\n 'status.saveFailed': 'nicht gespeichert — Speicher voll',\r\n 'canvas.meta': '{rows} Zeilen · {blocks} Blöcke · {width}px',\r\n 'tab.design': 'Stil',\r\n 'tab.designHint': 'Auswahl gestalten',\r\n 'tab.blocks': 'Blöcke',\r\n 'tab.blocksHint': 'Inhaltsblöcke und Variablen',\r\n 'tab.rows': 'Abschn.',\r\n 'tab.rowsHint': 'Abschnittslayouts und Canvas-Modell',\r\n 'tab.files': 'Dateien',\r\n 'tab.filesHint': 'Asset-Bibliothek',\r\n 'tab.layers': 'Struktur',\r\n 'tab.layersHint': 'Dokumentstruktur',\r\n 'tab.theme': 'Thema',\r\n 'tab.themeHint': 'Globale Stile',\r\n 'tab.data': 'Var.',\r\n 'tab.dataHint': 'Von deinem Code bereitgestellte Variablen',\r\n 'inspector.blockProperties': 'Blockeigenschaften',\r\n 'inspector.sectionProperties': 'Abschnittseigenschaften',\r\n 'inspector.title': 'Inspektor',\r\n 'inspector.sectionLabel': 'Abschnitt',\r\n 'inspector.nothingSelected': 'Nichts ausgewählt',\r\n 'action.duplicateHint': 'Duplizieren — ⌘D',\r\n 'action.deleteHint': 'Löschen — ⌫',\r\n 'inspector.emptyBody':\r\n 'Wähle eine Zeile oder einen Block auf der Canvas aus, um ihn hier zu gestalten. Ziehe Blöcke aus dem Tab <strong style=\"color: var(--ed-text); font-weight: 600;\">Blöcke</strong>; Doppelklick auf beliebigen Text, um ihn direkt zu bearbeiten.',\r\n 'inspector.shortcuts': 'Kurzbefehle',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — Rückgängig, Wiederholen',\r\n 'shortcut.duplicate': '⌘D — Auswahl duplizieren',\r\n 'shortcut.delete': '⌫ — Auswahl löschen',\r\n 'shortcut.export': '⌘E — HTML exportieren',\r\n 'shortcut.escape': 'ESC — Auswahl aufheben, schliessen',\r\n 'blocks.dragHint': 'Auf die Canvas ziehen',\r\n 'blocks.count': '{count} Blöcke',\r\n 'rows.sectionLayouts': 'Abschnittslayouts',\r\n 'rows.customMarkup': 'Eigenes Markup',\r\n 'rows.htmlRowHint': 'Zum Einfügen ziehen oder klicken — eine randlose Zeile, die du mit rohem HTML füllst',\r\n 'rows.rawHtmlSection': 'Roher HTML-Abschnitt',\r\n 'rows.rawHtmlDesc': 'Randloser Abschnitt, dein eigenes Markup, weiterhin ziehbar',\r\n 'rows.canvasModel': 'Canvas-Modell',\r\n 'rows.modeRowBased': 'Zeilenbasiert',\r\n 'rows.modeFreeStack': 'Freier Stapel',\r\n 'rows.hintRows':\r\n 'Abschnittsbasiert: Zuerst ein Layout ablegen, dann Blöcke in seine Spalten ziehen — jeder Abschnitt hat eigene Hintergrund-, Rahmen-, Flex- oder Grid-Einstellungen.',\r\n 'rows.hintStack': 'Freier Stapel: Ohne Layouts — jeder abgelegte Block wird zu einem eigenen, vollbreiten Abschnitt, der Reihe nach gestapelt.',\r\n 'files.libraryCount': 'Bibliothek — {count} Dateien',\r\n 'files.openManager': 'Dateimanager öffnen',\r\n 'files.dragToCanvas': 'Ziehe eine beliebige Datei direkt auf die Canvas, um sie als Bildblock einzufügen.',\r\n 'layers.structure': 'Struktur',\r\n 'layers.sectionSingle': 'Abschnitt',\r\n 'layers.sectionMulti': 'Abschnitt · {count} Spalten',\r\n 'layers.blockCount': '{count} Blk.',\r\n 'theme.globalStyles': 'Globale Stile',\r\n 'vars.title': 'Variablen',\r\n 'vars.fromCode': '{count} aus deinem Code',\r\n 'vars.declaredNote': 'Von deiner Anwendung deklariert — die Canvas zeigt immer das Token, nie einen Wert.',\r\n 'vars.filterPlaceholder': 'Variablen filtern…',\r\n 'vars.insertHint': 'Klicken, um in ausgewählten Text, Überschrift oder Button einzufügen',\r\n 'vars.insert': 'einfügen',\r\n 'vars.noMatch': 'Keine Variable entspricht diesem Filter.',\r\n 'vars.noneDeclared': 'Deine Anwendung hat noch keine Variablen deklariert.',\r\n 'vars.rteHint': 'Beim Bearbeiten von Text kannst du eine Variable auch direkt aus dem Dropdown der Inline-Symbolleiste auswählen.',\r\n 'modal.fileManager': 'Dateimanager',\r\n 'modal.assetsTitle': 'Assets',\r\n 'modal.replaceImage': 'Bild ersetzen',\r\n 'library.searchPlaceholder': 'Dateien suchen…',\r\n 'action.upload': 'Hochladen',\r\n 'library.clickToPlace': 'Datei anklicken zum Platzieren · oder Datei auf die Canvas ziehen',\r\n 'library.clickToReplace': 'Datei anklicken, um das ausgewählte Bild zu ersetzen',\r\n 'library.storageLabel': '{count} Dateien · {size}',\r\n 'library.folders': 'Ordner',\r\n 'library.dropHint': 'Bilddateien hier zum Hochladen ablegen — oder den Hochladen-Button nutzen.',\r\n 'library.deleteFileHint': 'Datei löschen',\r\n 'library.del': 'LÖSCH',\r\n 'toast.assetDeleted': '{name} gelöscht',\r\n 'modal.export': 'Exportieren',\r\n 'modal.exportTitle': 'Tabellenbasiertes E-Mail-HTML',\r\n 'export.copy': 'Kopieren',\r\n 'export.copied': 'Kopiert',\r\n 'action.download': 'Herunterladen',\r\n 'export.meta': '{kb} KB · Tabellen + Inline-Stile · Outlook-sichere Breiten',\r\n 'modal.rawHtmlTitle': 'Rohes HTML, Live-Vorschau',\r\n 'code.statusEdited': 'Code-Ansicht — bearbeitet — Vorschau live, noch nicht übernommen',\r\n 'code.statusSynced': 'Code-Ansicht — synchron mit der Canvas',\r\n 'action.reload': 'Neu laden',\r\n 'action.reloadHint': 'Quelltext aus der Canvas neu laden',\r\n 'action.applyToCanvas': 'Auf Canvas anwenden',\r\n 'action.applyToCanvasHint': 'Quelltext zurück in bearbeitbare Zeilen umwandeln',\r\n 'action.closeWithoutApplyingHint': 'Ohne Anwenden schliessen',\r\n 'code.source': 'Quelltext',\r\n 'code.livePreview': 'Live-Vorschau',\r\n 'code.liveHtmlPreviewTitle': 'Live-HTML-Vorschau',\r\n 'code.applyNote':\r\n 'Beim Anwenden wird jede oberste Tabellenzeile in eine Canvas-Zeile umgewandelt, die du weiterhin auswählen, neu anordnen und löschen kannst — handgeschriebenes Markup übersteht den Vorgang unverändert.',\r\n 'code.meta': '{kb} KB · {lines} Zeilen',\r\n 'toast.sourceReloaded': 'Quelltext aus der Canvas neu geladen',\r\n 'toast.sourceAppliedOne': 'Quelltext angewendet — 1 Zeile auf der Canvas',\r\n 'toast.sourceAppliedMany': 'Quelltext angewendet — {rows} Zeilen auf der Canvas',\r\n 'toast.parseError': 'Dieses HTML konnte nicht verarbeitet werden',\r\n 'modal.copyAssist': 'Textassistent',\r\n 'modal.draftCopyTitle': 'Text für diese Kampagne entwerfen',\r\n 'ai.goal': 'Ziel',\r\n 'ai.tone': 'Ton',\r\n 'ai.briefLabel': 'Worum geht es in dieser E-Mail?',\r\n 'ai.briefPlaceholder': 'z. B. Herbstkollektion, 15 % für Abonnenten, kostenloser Versand ab 150 €',\r\n 'ai.generate': 'Text generieren',\r\n 'ai.writing': 'Wird geschrieben…',\r\n 'ai.kindHeadline': 'Überschrift',\r\n 'ai.kindBody': 'Fliesstext',\r\n 'ai.kindButton': 'Button-Text',\r\n 'ai.actionInsertHeading': 'Als Überschrift einfügen',\r\n 'ai.actionInsertText': 'Als Textblock einfügen',\r\n 'ai.actionInsertButton': 'Als Button einfügen',\r\n 'toast.headingAdded': 'Überschrift hinzugefügt',\r\n 'toast.textBlockAdded': 'Textblock hinzugefügt',\r\n 'toast.buttonAdded': 'Button hinzugefügt',\r\n 'preview.kickerMobile': 'Vorschau — Mobil 375px',\r\n 'preview.kickerDark': 'Vorschau — Dunkler Posteingang',\r\n 'preview.kickerDesktop': 'Vorschau — Desktop {width}px',\r\n 'action.close': 'Schliessen',\r\n 'toast.duplicated': 'Dupliziert',\r\n 'toast.fileUploadedOne': '1 Datei hochgeladen',\r\n 'toast.fileUploadedMany': '{count} Dateien hochgeladen',\r\n 'toast.imageReplaced': 'Bild ersetzt',\r\n 'toast.imageAdded': 'Bild zur Canvas hinzugefügt',\r\n 'toast.htmlCopied': 'HTML in die Zwischenablage kopiert',\r\n 'toast.templateLoaded': '{name} geladen',\r\n 'toast.snippetDefaultLabel': 'Snippet',\r\n 'toast.snippetInserted': '{name} eingefügt',\r\n 'toast.snippetCopied': '{name} kopiert — wähle einen Textblock zum Einfügen aus',\r\n};\r\n\r\n\nObject.assign(exports, { DE_CH });\n\n};\n__modules[\"core/i18n/de.js\"] = function(module, exports, __require) {\n/** German (Deutsch) — `de`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst DE = {\r\n 'action.undoHint': 'Rückgängig — ⌘Z',\r\n 'action.redoHint': 'Wiederholen — ⌘⇧Z',\r\n 'action.chromeToDark': 'Dunkel',\r\n 'action.chromeToLight': 'Hell',\r\n 'action.chromeHint': 'Editor-Design hell / dunkel',\r\n 'action.aiCopy': 'Text',\r\n 'action.aiCopyHint': 'Text mit KI entwerfen',\r\n 'action.code': 'Code',\r\n 'action.codeHint': 'Rohes HTML mit Live-Vorschau bearbeiten',\r\n 'action.preview': 'Vorschau',\r\n 'action.export': 'Exportieren',\r\n 'device.desktop': 'Desktop',\r\n 'device.desktopHint': 'Desktop-Breite',\r\n 'device.mobile': 'Mobil',\r\n 'device.mobileHint': 'Mobile Breite',\r\n 'device.dark': 'Dunkel',\r\n 'device.darkHint': 'Dunkler Posteingang',\r\n 'status.autosaveOn': 'Autospeichern aktiv',\r\n 'status.saved': 'gespeichert {time}',\r\n 'status.saveFailed': 'nicht gespeichert — Speicher voll',\r\n 'canvas.meta': '{rows} Zeilen · {blocks} Blöcke · {width}px',\r\n 'tab.design': 'Stil',\r\n 'tab.designHint': 'Auswahl gestalten',\r\n 'tab.blocks': 'Blöcke',\r\n 'tab.blocksHint': 'Inhaltsblöcke und Variablen',\r\n 'tab.rows': 'Abschn.',\r\n 'tab.rowsHint': 'Abschnittslayouts und Canvas-Modell',\r\n 'tab.files': 'Dateien',\r\n 'tab.filesHint': 'Asset-Bibliothek',\r\n 'tab.layers': 'Struktur',\r\n 'tab.layersHint': 'Dokumentstruktur',\r\n 'tab.theme': 'Thema',\r\n 'tab.themeHint': 'Globale Stile',\r\n 'tab.data': 'Var.',\r\n 'tab.dataHint': 'Von deinem Code bereitgestellte Variablen',\r\n 'inspector.blockProperties': 'Blockeigenschaften',\r\n 'inspector.sectionProperties': 'Abschnittseigenschaften',\r\n 'inspector.title': 'Inspektor',\r\n 'inspector.sectionLabel': 'Abschnitt',\r\n 'inspector.nothingSelected': 'Nichts ausgewählt',\r\n 'action.duplicateHint': 'Duplizieren — ⌘D',\r\n 'action.deleteHint': 'Löschen — ⌫',\r\n 'inspector.emptyBody':\r\n 'Wähle eine Zeile oder einen Block auf der Canvas aus, um ihn hier zu gestalten. Ziehe Blöcke aus dem Tab <strong style=\"color: var(--ed-text); font-weight: 600;\">Blöcke</strong>; Doppelklick auf beliebigen Text, um ihn direkt zu bearbeiten.',\r\n 'inspector.shortcuts': 'Kurzbefehle',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — Rückgängig, Wiederholen',\r\n 'shortcut.duplicate': '⌘D — Auswahl duplizieren',\r\n 'shortcut.delete': '⌫ — Auswahl löschen',\r\n 'shortcut.export': '⌘E — HTML exportieren',\r\n 'shortcut.escape': 'ESC — Auswahl aufheben, schließen',\r\n 'blocks.dragHint': 'Auf die Canvas ziehen',\r\n 'blocks.count': '{count} Blöcke',\r\n 'rows.sectionLayouts': 'Abschnittslayouts',\r\n 'rows.customMarkup': 'Eigenes Markup',\r\n 'rows.htmlRowHint': 'Zum Einfügen ziehen oder klicken — eine randlose Zeile, die du mit rohem HTML füllst',\r\n 'rows.rawHtmlSection': 'Roher HTML-Abschnitt',\r\n 'rows.rawHtmlDesc': 'Randloser Abschnitt, dein eigenes Markup, weiterhin ziehbar',\r\n 'rows.canvasModel': 'Canvas-Modell',\r\n 'rows.modeRowBased': 'Zeilenbasiert',\r\n 'rows.modeFreeStack': 'Freier Stapel',\r\n 'rows.hintRows':\r\n 'Abschnittsbasiert: Zuerst ein Layout ablegen, dann Blöcke in seine Spalten ziehen — jeder Abschnitt hat eigene Hintergrund-, Rahmen-, Flex- oder Grid-Einstellungen.',\r\n 'rows.hintStack': 'Freier Stapel: Ohne Layouts — jeder abgelegte Block wird zu einem eigenen, vollbreiten Abschnitt, der Reihe nach gestapelt.',\r\n 'files.libraryCount': 'Bibliothek — {count} Dateien',\r\n 'files.openManager': 'Dateimanager öffnen',\r\n 'files.dragToCanvas': 'Ziehe eine beliebige Datei direkt auf die Canvas, um sie als Bildblock einzufügen.',\r\n 'layers.structure': 'Struktur',\r\n 'layers.sectionSingle': 'Abschnitt',\r\n 'layers.sectionMulti': 'Abschnitt · {count} Spalten',\r\n 'layers.blockCount': '{count} Blk.',\r\n 'theme.globalStyles': 'Globale Stile',\r\n 'vars.title': 'Variablen',\r\n 'vars.fromCode': '{count} aus deinem Code',\r\n 'vars.declaredNote': 'Von deiner Anwendung deklariert — die Canvas zeigt immer das Token, nie einen Wert.',\r\n 'vars.filterPlaceholder': 'Variablen filtern…',\r\n 'vars.insertHint': 'Klicken, um in ausgewählten Text, Überschrift oder Button einzufügen',\r\n 'vars.insert': 'einfügen',\r\n 'vars.noMatch': 'Keine Variable entspricht diesem Filter.',\r\n 'vars.noneDeclared': 'Deine Anwendung hat noch keine Variablen deklariert.',\r\n 'vars.rteHint': 'Beim Bearbeiten von Text kannst du eine Variable auch direkt aus dem Dropdown der Inline-Symbolleiste auswählen.',\r\n 'modal.fileManager': 'Dateimanager',\r\n 'modal.assetsTitle': 'Assets',\r\n 'modal.replaceImage': 'Bild ersetzen',\r\n 'library.searchPlaceholder': 'Dateien suchen…',\r\n 'action.upload': 'Hochladen',\r\n 'library.clickToPlace': 'Datei anklicken zum Platzieren · oder Datei auf die Canvas ziehen',\r\n 'library.clickToReplace': 'Datei anklicken, um das ausgewählte Bild zu ersetzen',\r\n 'library.storageLabel': '{count} Dateien · {size}',\r\n 'library.folders': 'Ordner',\r\n 'library.dropHint': 'Bilddateien hier zum Hochladen ablegen — oder den Hochladen-Button nutzen.',\r\n 'library.deleteFileHint': 'Datei löschen',\r\n 'library.del': 'LÖSCH',\r\n 'toast.assetDeleted': '{name} gelöscht',\r\n 'modal.export': 'Exportieren',\r\n 'modal.exportTitle': 'Tabellenbasiertes E-Mail-HTML',\r\n 'export.copy': 'Kopieren',\r\n 'export.copied': 'Kopiert',\r\n 'action.download': 'Herunterladen',\r\n 'export.meta': '{kb} KB · Tabellen + Inline-Stile · Outlook-sichere Breiten',\r\n 'modal.rawHtmlTitle': 'Rohes HTML, Live-Vorschau',\r\n 'code.statusEdited': 'Code-Ansicht — bearbeitet — Vorschau live, noch nicht übernommen',\r\n 'code.statusSynced': 'Code-Ansicht — synchron mit der Canvas',\r\n 'action.reload': 'Neu laden',\r\n 'action.reloadHint': 'Quelltext aus der Canvas neu laden',\r\n 'action.applyToCanvas': 'Auf Canvas anwenden',\r\n 'action.applyToCanvasHint': 'Quelltext zurück in bearbeitbare Zeilen umwandeln',\r\n 'action.closeWithoutApplyingHint': 'Ohne Anwenden schließen',\r\n 'code.source': 'Quelltext',\r\n 'code.livePreview': 'Live-Vorschau',\r\n 'code.liveHtmlPreviewTitle': 'Live-HTML-Vorschau',\r\n 'code.applyNote':\r\n 'Beim Anwenden wird jede oberste Tabellenzeile in eine Canvas-Zeile umgewandelt, die du weiterhin auswählen, neu anordnen und löschen kannst — handgeschriebenes Markup übersteht den Vorgang unverändert.',\r\n 'code.meta': '{kb} KB · {lines} Zeilen',\r\n 'toast.sourceReloaded': 'Quelltext aus der Canvas neu geladen',\r\n 'toast.sourceAppliedOne': 'Quelltext angewendet — 1 Zeile auf der Canvas',\r\n 'toast.sourceAppliedMany': 'Quelltext angewendet — {rows} Zeilen auf der Canvas',\r\n 'toast.parseError': 'Dieses HTML konnte nicht verarbeitet werden',\r\n 'modal.copyAssist': 'Textassistent',\r\n 'modal.draftCopyTitle': 'Text für diese Kampagne entwerfen',\r\n 'ai.goal': 'Ziel',\r\n 'ai.tone': 'Ton',\r\n 'ai.briefLabel': 'Worum geht es in dieser E-Mail?',\r\n 'ai.briefPlaceholder': 'z. B. Herbstkollektion, 15 % für Abonnenten, kostenloser Versand ab 150 €',\r\n 'ai.generate': 'Text generieren',\r\n 'ai.writing': 'Wird geschrieben…',\r\n 'ai.kindHeadline': 'Überschrift',\r\n 'ai.kindBody': 'Fließtext',\r\n 'ai.kindButton': 'Button-Text',\r\n 'ai.actionInsertHeading': 'Als Überschrift einfügen',\r\n 'ai.actionInsertText': 'Als Textblock einfügen',\r\n 'ai.actionInsertButton': 'Als Button einfügen',\r\n 'toast.headingAdded': 'Überschrift hinzugefügt',\r\n 'toast.textBlockAdded': 'Textblock hinzugefügt',\r\n 'toast.buttonAdded': 'Button hinzugefügt',\r\n 'preview.kickerMobile': 'Vorschau — Mobil 375px',\r\n 'preview.kickerDark': 'Vorschau — Dunkler Posteingang',\r\n 'preview.kickerDesktop': 'Vorschau — Desktop {width}px',\r\n 'action.close': 'Schließen',\r\n 'toast.duplicated': 'Dupliziert',\r\n 'toast.fileUploadedOne': '1 Datei hochgeladen',\r\n 'toast.fileUploadedMany': '{count} Dateien hochgeladen',\r\n 'toast.imageReplaced': 'Bild ersetzt',\r\n 'toast.imageAdded': 'Bild zur Canvas hinzugefügt',\r\n 'toast.htmlCopied': 'HTML in die Zwischenablage kopiert',\r\n 'toast.templateLoaded': '{name} geladen',\r\n 'toast.snippetDefaultLabel': 'Snippet',\r\n 'toast.snippetInserted': '{name} eingefügt',\r\n 'toast.snippetCopied': '{name} kopiert — wähle einen Textblock zum Einfügen aus',\r\n};\r\n\r\n\nObject.assign(exports, { DE });\n\n};\n__modules[\"core/i18n/dz.js\"] = function(module, exports, __require) {\n/**\r\n * Dzongkha (རྫོང་ཁ) — `dz`, the national language of Bhutan.\r\n *\r\n * AI-drafted, not reviewed by a native speaker -- and Dzongkha is a\r\n * particularly low-resource language for machine translation, more so than\r\n * the other locales in this folder, so treat this table as an even rougher\r\n * starting draft than usual. Correctable one key at a time via `.messages`\r\n * overrides; `createTranslator` falls back to English per-key, so a partial\r\n * or wrong entry never blanks the UI -- it just shows English until fixed.\r\n */\r\nconst DZ = {\r\n 'action.undoHint': 'ལོག་སྟེ་བཟོ — ⌘Z',\r\n 'action.redoHint': 'སླར་བསྐྱར — ⌘⇧Z',\r\n 'action.chromeToDark': 'ནག་ཅན',\r\n 'action.chromeToLight': 'དཀར་ཅན',\r\n 'action.chromeHint': 'སྣུམ་འཕྲུལ་གྱི་མདོག་དཀར་ནག',\r\n 'action.aiCopy': 'ཡི་གུ',\r\n 'action.aiCopyHint': 'AI གིས་ཡི་གུ་བྲིས',\r\n 'action.code': 'ཀོཌ',\r\n 'action.codeHint': 'HTML རྩ་བ་ལས་བཟོ་བཅོས་དང་མཐོང་སྣང་',\r\n 'action.preview': 'སྔོན་མཐོང',\r\n 'action.export': 'ཕྱིར་འདྲེན',\r\n\r\n 'device.desktop': 'ཌེསིཀ་ཊོཔ',\r\n 'device.desktopHint': 'ཌེསིཀ་ཊོཔ་གི་རྒྱ་ཚད',\r\n 'device.mobile': 'མོ་བའིལ',\r\n 'device.mobileHint': 'མོ་བའིལ་གྱི་རྒྱ་ཚད',\r\n 'device.dark': 'ནག་ཅན',\r\n 'device.darkHint': 'ནང་འདྲེན་ནག་ཅན',\r\n\r\n 'status.autosaveOn': 'རང་བཞིན་ཉར་ཚགས་ཁ་ཕྱེ་ཡོད',\r\n 'status.saved': 'ཉར་ཚགས་བྱུང་ {time}',\r\n 'status.saveFailed': 'ཉར་ཚགས་མ་བྱུང — གནས་ཁོངས་གང་སོང',\r\n\r\n 'canvas.meta': 'ཐིག་ཁྲམ་ {rows} · སྡེབ་ཚན་ {blocks} · {width}px',\r\n\r\n 'tab.design': 'བཟོ་རྣམ',\r\n 'tab.designHint': 'སེལ་འཐུ་བྱུང་བའི་ཆ་ཤས་བཟོ་རྣམ་སྒྱུར',\r\n 'tab.blocks': 'སྡེབ་ཚན',\r\n 'tab.blocksHint': 'ནང་དོན་སྡེབ་ཚན་དང་འགྱུར་ཚད',\r\n 'tab.rows': 'དབྱེ་ཚན',\r\n 'tab.rowsHint': 'དབྱེ་ཚན་གྱི་བཀོད་པ་དང་ཐིག་ཁྲམ',\r\n 'tab.files': 'ཡིག་སྣོད',\r\n 'tab.filesHint': 'དཔེ་མཛོད',\r\n 'tab.layers': 'བཀོད་པ',\r\n 'tab.layersHint': 'ཡིག་ཆའི་བཀོད་པ',\r\n 'tab.theme': 'བརྗོད་དོན',\r\n 'tab.themeHint': 'སྤྱིར་བཏང་བཟོ་རྣམ',\r\n 'tab.data': 'འགྱུར་ཚད',\r\n 'tab.dataHint': 'ཁྱོད་ཀྱི་ཀོཌ་ནང་ལས་ཐོན་པའི་འགྱུར་ཚད',\r\n\r\n 'inspector.blockProperties': 'སྡེབ་ཚན་གྱི་ཁྱད་ཆོས',\r\n 'inspector.sectionProperties': 'དབྱེ་ཚན་གྱི་ཁྱད་ཆོས',\r\n 'inspector.title': 'བརྟག་ཞིབ',\r\n 'inspector.sectionLabel': 'དབྱེ་ཚན',\r\n 'inspector.nothingSelected': 'ག་ནི་ཡང་སེལ་འཐུ་མ་བྱུང',\r\n 'action.duplicateHint': 'འདྲ་བཤུས — ⌘D',\r\n 'action.deleteHint': 'བསུབ — ⌫',\r\n 'inspector.emptyBody':\r\n 'ཐིག་ཁྲམ་ནང་གི་དབྱེ་ཚན་ཡང་ན་སྡེབ་ཚན་ཅིག་སེལ་འཐུ་འབད་དེ་འདི་ནང་བཟོ་རྣམ་སྒྱུར། <strong style=\"color: var(--ed-text); font-weight: 600;\">སྡེབ་ཚན</strong> ཟེར་བའི་ཁ་ཆའི་ནང་ལས་སྡེབ་ཚན་འདྲུད་དེ་བཙུགས། ཡི་གུ་ག་ནི་འབད་རུང་ཁར་གཉིས་མཐེབ་བརྡབས་ཏེ་བཟོ་བཅོས་འབད།',\r\n 'inspector.shortcuts': 'མགྱོགས་ལམ',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — ལོག་སྟེ་བཟོ, སླར་བསྐྱར',\r\n 'shortcut.duplicate': '⌘D — སེལ་འཐུ་འདྲ་བཤུས',\r\n 'shortcut.delete': '⌫ — སེལ་འཐུ་བསུབ',\r\n 'shortcut.export': '⌘E — HTML ཕྱིར་འདྲེན',\r\n 'shortcut.escape': 'ESC — སེལ་འཐུ་བཏོན, ཁ་བསྡམས',\r\n\r\n 'blocks.dragHint': 'ཐིག་ཁྲམ་ལུ་འདྲུད་དེ་བཙུགས',\r\n 'blocks.count': 'སྡེབ་ཚན་ {count}',\r\n\r\n 'rows.sectionLayouts': 'དབྱེ་ཚན་གྱི་བཀོད་པ',\r\n 'rows.customMarkup': 'རང་སྒྲིག་མཱརཀ་པ',\r\n 'rows.htmlRowHint': 'འདྲུད་དེ་བཙུགས, ཡང་ན་ཁ་སྣོན་འབད་ནི་ལུ་མཐེབ་རྐྱབས — raw HTML གིས་བཀང་ནིའི་དབྱེ་ཚན་རྒྱ་ཚད་ཧྲིལ་བུ',\r\n 'rows.rawHtmlSection': 'Raw HTML དབྱེ་ཚན',\r\n 'rows.rawHtmlDesc': 'རྒྱ་ཚད་ཧྲིལ་བུའི་དབྱེ་ཚན, ཁྱོད་རང་གི་མཱརཀ་པ, ད་རུང་འདྲུད་བཏུབ',\r\n 'rows.canvasModel': 'ཐིག་ཁྲམ་གྱི་དཔེ་གཞི',\r\n 'rows.modeRowBased': 'ཐིག་ཁྲམ་གྱི་གཞི་བཞག',\r\n 'rows.modeFreeStack': 'རང་མོས་སྤུང་ཚུལ',\r\n 'rows.hintRows':\r\n 'དབྱེ་ཚན་གྱི་གཞི་བཞག: དང་པོ་བཀོད་པ་ཅིག་བཙུགས, དེ་ལས་སྡེབ་ཚན་ཚུ་ཀེར་ཐིག་ནང་བཙུགས — དབྱེ་ཚན་རེ་རེ་ལུ་རང་སོའི་རྒྱབ་མདོག, མཐའ་མཚམས, flex ཡང་ན་ grid སྒྲིག་སྟངས་ཡོད།',\r\n 'rows.hintStack': 'རང་མོས་སྤུང་ཚུལ: བཀོད་པ་མེད་པར — ཁྱོད་ཀྱིས་འདྲུད་དེ་བཙུགས་པའི་སྡེབ་ཚན་རེ་རེ་རང་སོའི་རྒྱ་ཚད་ཧྲིལ་བུའི་དབྱེ་ཚན་ཅིག་ལུ་གྱུར་ཏེ་གོ་རིམ་བཞིན་སྤུངས།',\r\n\r\n\r\n 'files.libraryCount': 'དཔེ་མཛོད — ཡིག་སྣོད་ {count}',\r\n 'files.openManager': 'ཡིག་སྣོད་དོ་དམ་པ་ཁ་ཕྱེ',\r\n 'files.dragToCanvas': 'གཟུགས་བརྙན་སྡེབ་ཚན་ཅིག་སྦེ་བཙུགས་ནིའི་དོན་ལུ་ཡིག་སྣོད་ག་ནི་འབད་རུང་ཐིག་ཁྲམ་ལུ་ཐད་ཀར་འདྲུད།',\r\n\r\n 'layers.structure': 'བཀོད་པ',\r\n 'layers.sectionSingle': 'དབྱེ་ཚན',\r\n 'layers.sectionMulti': 'དབྱེ་ཚན · ཀེར་ཐིག་ {count}',\r\n 'layers.blockCount': 'སྡེབ་ཚན་ {count}',\r\n\r\n 'theme.globalStyles': 'སྤྱིར་བཏང་བཟོ་རྣམ',\r\n\r\n 'vars.title': 'འགྱུར་ཚད',\r\n 'vars.fromCode': 'ཁྱོད་ཀྱི་ཀོཌ་ནང་ལས་ {count}',\r\n 'vars.declaredNote': 'ཁྱོད་ཀྱི་ལག་ཆས་ཀྱིས་གསལ་བཀོད་འབད་ཡོད — ཐིག་ཁྲམ་གྱིས་རྟག་པར་ཊོ་ཀེན་སྟོན, གནས་གོང་ནམ་ཡང་མི་སྟོན།',\r\n 'vars.filterPlaceholder': 'འགྱུར་ཚད་འཚོལ…',\r\n 'vars.insertHint': 'སེལ་འཐུ་བྱུང་བའི་ཡི་གུ, མགོ་མིང་ཡང་ན་མཐེབ་ནང་བཙུགས་ནིའི་དོན་ལུ་མཐེབ་རྐྱབས',\r\n 'vars.insert': 'བཙུགས',\r\n 'vars.noMatch': 'འཚོལ་ཞིབ་དེ་དང་མཐུན་པའི་འགྱུར་ཚད་མིན་འདུག',\r\n 'vars.noneDeclared': 'ཁྱོད་ཀྱི་ལག་ཆས་ཀྱིས་ད་ལྟོ་ཚུན་འགྱུར་ཚད་ག་ནི་ཡང་གསལ་བཀོད་མ་འབད',\r\n 'vars.rteHint': 'ཡི་གུ་བཟོ་བཅོས་སྐབས་ལག་ཆས་ཕྲ་མོའི་ཐོ་ཡིག་ནང་ལས་ཡང་འགྱུར་ཚད་ཅིག་འཐུ་བཏུབ།',\r\n\r\n 'modal.fileManager': 'ཡིག་སྣོད་དོ་དམ་པ',\r\n 'modal.assetsTitle': 'དངོས་རིགས',\r\n 'modal.replaceImage': 'གཟུགས་བརྙན་ཚབ་བཙུགས',\r\n 'library.searchPlaceholder': 'ཡིག་སྣོད་འཚོལ…',\r\n 'action.upload': 'བསྐྱེད་འདྲེན',\r\n 'library.clickToPlace': 'བཙུགས་ནིའི་དོན་ལུ་ཡིག་སྣོད་ཅིག་ལུ་མཐེབ་རྐྱབས · ཡང་ན་ཐིག་ཁྲམ་ལུ་ཡིག་སྣོད་འདྲུད',\r\n 'library.clickToReplace': 'སེལ་འཐུ་བྱུང་བའི་གཟུགས་བརྙན་ཚབ་བཙུགས་ནིའི་དོན་ལུ་ཡིག་སྣོད་ལུ་མཐེབ་རྐྱབས',\r\n 'library.storageLabel': 'ཡིག་སྣོད་ {count} · {size}',\r\n 'library.folders': 'ཡིག་སྣོད་ཁུག',\r\n 'library.dropHint': 'བསྐྱེད་འདྲེན་འབད་ནིའི་དོན་ལུ་གཟུགས་བརྙན་ཡིག་སྣོད་འདི་ཁར་བཞག — ཡང་ན་བསྐྱེད་འདྲེན་མཐེབ་ལག་ལེན།',\r\n 'library.deleteFileHint': 'ཡིག་སྣོད་བསུབ',\r\n 'library.del': 'བསུབ',\r\n 'toast.assetDeleted': '{name} བསུབ་ཡོདཔ',\r\n\r\n 'modal.export': 'ཕྱིར་འདྲེན',\r\n 'modal.exportTitle': 'ཐིག་ཁྲམ་གཞི་བཞག HTML',\r\n 'export.copy': 'འདྲ་བཤུས',\r\n 'export.copied': 'འདྲ་བཤུས་བྱུང',\r\n 'action.download': 'ཕབ་ལེན',\r\n 'export.meta': '{kb} KB · ཐིག་ཁྲམ + ནང་འཁོད་བཟོ་རྣམ · Outlook ལུ་ཉེན་སྲུང་ཡོད་པའི་རྒྱ་ཚད',\r\n\r\n 'modal.rawHtmlTitle': 'Raw HTML, མཐོང་སྣང་',\r\n 'code.statusEdited': 'ཀོཌ་མཐོང་སྣང — བཟོ་བཅོས་བྱུང — མཐོང་སྣང་མཐོང་སྣང་ཡིན་རུང་ད་ལྟོ་ཚུན་ལག་ལེན་མ་འཐབ',\r\n 'code.statusSynced': 'ཀོཌ་མཐོང་སྣང — ཐིག་ཁྲམ་དང་མཉམ་འབྲེལ་ཡོད',\r\n 'action.reload': 'སླར་འདྲེན',\r\n 'action.reloadHint': 'ཐིག་ཁྲམ་ནང་ལས་རྩ་འཛིན་སླར་འདྲེན',\r\n 'action.applyToCanvas': 'ཐིག་ཁྲམ་ལུ་ལག་ལེན་འཐབ',\r\n 'action.applyToCanvasHint': 'རྩ་འཛིན་བཟོ་བཅོས་བཏུབ་པའི་ཐིག་ཁྲམ་ལུ་བཤད་བཤག',\r\n 'action.closeWithoutApplyingHint': 'ལག་ལེན་མ་འཐབ་པར་ཁ་བསྡམས',\r\n 'code.source': 'རྩ་འཛིན',\r\n 'code.livePreview': 'མཐོང་སྣང',\r\n 'code.liveHtmlPreviewTitle': 'HTML མཐོང་སྣང',\r\n 'code.applyNote':\r\n 'ལག་ལེན་འཐབ་པའི་སྐབས་ཐིག་ཁྲམ་ཐིག་ཁྲམ་རེ་རེ་སེལ་འཐུ, གོ་རིམ་བསྒྱུར, ད་རུང་བསུབ་བཏུབ་པའི་ཐིག་ཁྲམ་ཅིག་ལུ་བཤད་བཤག — ལག་གིས་བྲིས་པའི་མཱརཀ་པ་ཧེ་མ་བཟུམ་ལུས་འོང༌།',\r\n 'code.meta': '{kb} KB · ཐིག་ {lines}',\r\n 'toast.sourceReloaded': 'ཐིག་ཁྲམ་ནང་ལས་རྩ་འཛིན་སླར་འདྲེན་བྱུང',\r\n 'toast.sourceAppliedOne': 'རྩ་འཛིན་ལག་ལེན་འཐབ་ཡོད — ཐིག་ཁྲམ་ནང་ཐིག་ ༡',\r\n 'toast.sourceAppliedMany': 'རྩ་འཛིན་ལག་ལེན་འཐབ་ཡོད — ཐིག་ཁྲམ་ནང་ཐིག་ {rows}',\r\n 'toast.parseError': 'HTML དེ་བཤད་བཤག་མ་ཚུགས',\r\n\r\n 'modal.copyAssist': 'ཡི་གུའི་གྲོགས་རམ',\r\n 'modal.draftCopyTitle': 'ཚོང་སྒྱུར་འདི་གི་དོན་ལུ་ཡི་གུ་བྲིས',\r\n 'ai.goal': 'དམིགས་དོན',\r\n 'ai.tone': 'སྒྲ་གདངས',\r\n 'ai.briefLabel': 'ཡིག་འཕྲིན་འདི་ག་ཅི་གི་སྐོར་ལས་ཨིན་ན?',\r\n 'ai.briefPlaceholder': 'དཔེར་ན: སྟོན་ཀའི་གོས་གྱོན, འོང་ལེན་པ་ལུ་བརྒྱ་ཆ་ ༡༥ ཞབས་ཏོག, སོར་ ༡༥༠ ལས་ལྷག་ན་འཁྱེར་ཁ་རིན་མེད',\r\n 'ai.generate': 'ཡི་གུ་བཟོ',\r\n 'ai.writing': 'བྲིས་བཞིན་འདུག…',\r\n 'ai.kindHeadline': 'མགོ་མིང',\r\n 'ai.kindBody': 'ཡིག་ཐོག་གནད་དོན',\r\n 'ai.kindButton': 'མཐེབ་ཀྱི་ཡིག་རྟགས',\r\n 'ai.actionInsertHeading': 'མགོ་མིང་སྦེ་བཙུགས',\r\n 'ai.actionInsertText': 'ཡི་གུའི་སྡེབ་ཚན་སྦེ་བཙུགས',\r\n 'ai.actionInsertButton': 'མཐེབ་སྦེ་བཙུགས',\r\n 'toast.headingAdded': 'མགོ་མིང་ཁ་སྣོན་བྱུང',\r\n 'toast.textBlockAdded': 'ཡི་གུའི་སྡེབ་ཚན་ཁ་སྣོན་བྱུང',\r\n 'toast.buttonAdded': 'མཐེབ་ཁ་སྣོན་བྱུང',\r\n\r\n 'preview.kickerMobile': 'སྔོན་མཐོང — མོ་བའིལ 375px',\r\n 'preview.kickerDark': 'སྔོན་མཐོང — ནང་འདྲེན་ནག་ཅན',\r\n 'preview.kickerDesktop': 'སྔོན་མཐོང — ཌེསིཀ་ཊོཔ {width}px',\r\n 'action.close': 'ཁ་བསྡམས',\r\n\r\n 'toast.duplicated': 'འདྲ་བཤུས་བྱུང',\r\n 'toast.fileUploadedOne': 'ཡིག་སྣོད་ ༡ བསྐྱེད་འདྲེན་བྱུང',\r\n 'toast.fileUploadedMany': 'ཡིག་སྣོད་ {count} བསྐྱེད་འདྲེན་བྱུང',\r\n 'toast.imageReplaced': 'གཟུགས་བརྙན་ཚབ་བཙུགས་བྱུང',\r\n 'toast.imageAdded': 'ཐིག་ཁྲམ་ལུ་གཟུགས་བརྙན་ཁ་སྣོན་བྱུང',\r\n 'toast.htmlCopied': 'HTML ཀ་ལིཔ་བོརཌ་ལུ་འདྲ་བཤུས་བྱུང',\r\n 'toast.templateLoaded': '{name} འདྲེན་སྤྱོད་བྱུང',\r\n 'toast.snippetDefaultLabel': 'ཡིག་ཐིག',\r\n 'toast.snippetInserted': '{name} བཙུགས་བྱུང',\r\n 'toast.snippetCopied': '{name} འདྲ་བཤུས་བྱུང — བཙུགས་ནིའི་དོན་ལུ་ཡི་གུའི་སྡེབ་ཚན་ཅིག་སེལ་འཐུ་འབད',\r\n};\r\n\r\n\nObject.assign(exports, { DZ });\n\n};\n__modules[\"core/i18n/el.js\"] = function(module, exports, __require) {\n/** Greek (Ελληνικά) — `el`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst EL = {\r\n 'action.undoHint': 'Αναίρεση — ⌘Z',\r\n 'action.redoHint': 'Επανάληψη — ⌘⇧Z',\r\n 'action.chromeToDark': 'Σκούρο',\r\n 'action.chromeToLight': 'Ανοιχτόχρωμο',\r\n 'action.chromeHint': 'Θέμα επεξεργαστή ανοιχτό / σκούρο',\r\n 'action.aiCopy': 'Κείμενο',\r\n 'action.aiCopyHint': 'Σύνταξη κειμένου με AI',\r\n 'action.code': 'Κώδικας',\r\n 'action.codeHint': 'Επεξεργασία ακατέργαστου HTML με ζωντανή προεπισκόπηση',\r\n 'action.preview': 'Προεπισκόπηση',\r\n 'action.export': 'Εξαγωγή',\r\n 'device.desktop': 'Υπολογιστής',\r\n 'device.desktopHint': 'Πλάτος υπολογιστή',\r\n 'device.mobile': 'Κινητό',\r\n 'device.mobileHint': 'Πλάτος κινητού',\r\n 'device.dark': 'Σκούρο',\r\n 'device.darkHint': 'Σκούρα λειτουργία εισερχομένων',\r\n 'status.autosaveOn': 'η αυτόματη αποθήκευση είναι ενεργή',\r\n 'status.saved': 'αποθηκεύτηκε {time}',\r\n 'status.saveFailed': 'δεν αποθηκεύτηκε — ο χώρος αποθήκευσης γέμισε',\r\n 'canvas.meta': '{rows} γραμμές · {blocks} μπλοκ · {width}px',\r\n 'tab.design': 'Στυλ',\r\n 'tab.designHint': 'Μορφοποίηση επιλογής',\r\n 'tab.blocks': 'Μπλοκ',\r\n 'tab.blocksHint': 'Μπλοκ περιεχομένου και μεταβλητές',\r\n 'tab.rows': 'Ενότητες',\r\n 'tab.rowsHint': 'Διατάξεις ενοτήτων και μοντέλο καμβά',\r\n 'tab.files': 'Αρχεία',\r\n 'tab.filesHint': 'Βιβλιοθήκη πόρων',\r\n 'tab.layers': 'Δομή',\r\n 'tab.layersHint': 'Δομή εγγράφου',\r\n 'tab.theme': 'Θέμα',\r\n 'tab.themeHint': 'Καθολικά στυλ',\r\n 'tab.data': 'Μετ.',\r\n 'tab.dataHint': 'Μεταβλητές που παρέχονται από τον κώδικά σας',\r\n 'inspector.blockProperties': 'Ιδιότητες μπλοκ',\r\n 'inspector.sectionProperties': 'Ιδιότητες ενότητας',\r\n 'inspector.title': 'Επόπτης',\r\n 'inspector.sectionLabel': 'Ενότητα',\r\n 'inspector.nothingSelected': 'Καμία επιλογή',\r\n 'action.duplicateHint': 'Διπλασιασμός — ⌘D',\r\n 'action.deleteHint': 'Διαγραφή — ⌫',\r\n 'inspector.emptyBody':\r\n 'Επιλέξτε μια γραμμή ή ένα μπλοκ στον καμβά για να το μορφοποιήσετε εδώ. Σύρετε μπλοκ από την καρτέλα <strong style=\"color: var(--ed-text); font-weight: 600;\">Μπλοκ</strong>· κάντε διπλό κλικ σε οποιοδήποτε κείμενο για να το επεξεργαστείτε απευθείας.',\r\n 'inspector.shortcuts': 'Συντομεύσεις',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — αναίρεση, επανάληψη',\r\n 'shortcut.duplicate': '⌘D — διπλασιασμός επιλογής',\r\n 'shortcut.delete': '⌫ — διαγραφή επιλογής',\r\n 'shortcut.export': '⌘E — εξαγωγή HTML',\r\n 'shortcut.escape': 'ESC — κατάργηση επιλογής, κλείσιμο',\r\n 'blocks.dragHint': 'Σύρετε στον καμβά',\r\n 'blocks.count': '{count} μπλοκ',\r\n 'rows.sectionLayouts': 'Διατάξεις ενοτήτων',\r\n 'rows.customMarkup': 'Προσαρμοσμένη σήμανση',\r\n 'rows.htmlRowHint': 'Σύρετε για εισαγωγή ή κάντε κλικ για προσθήκη — μια γραμμή πλήρους πλάτους που γεμίζετε με ακατέργαστο HTML',\r\n 'rows.rawHtmlSection': 'Ενότητα ακατέργαστου HTML',\r\n 'rows.rawHtmlDesc': 'Ενότητα πλήρους πλάτους, δική σας σήμανση, εξακολουθεί να είναι μεταφέρσιμη',\r\n 'rows.canvasModel': 'Μοντέλο καμβά',\r\n 'rows.modeRowBased': 'Βάσει γραμμών',\r\n 'rows.modeFreeStack': 'Ελεύθερη στοίβα',\r\n 'rows.hintRows':\r\n 'Βάσει ενοτήτων: αποθέστε πρώτα μια διάταξη, μετά μπλοκ στις στήλες της — κάθε ενότητα έχει το δικό της φόντο, περίγραμμα, ρυθμίσεις flex ή πλέγματος.',\r\n 'rows.hintStack': 'Ελεύθερη στοίβα: χωρίς διατάξεις — κάθε μπλοκ που αποθέτετε γίνεται δική του ενότητα πλήρους πλάτους, στοιβαγμένη με τη σειρά.',\r\n 'files.libraryCount': 'Βιβλιοθήκη — {count} αρχεία',\r\n 'files.openManager': 'Άνοιγμα διαχείρισης αρχείων',\r\n 'files.dragToCanvas': 'Σύρετε οποιοδήποτε αρχείο απευθείας στον καμβά για να το τοποθετήσετε ως μπλοκ εικόνας.',\r\n 'layers.structure': 'Δομή',\r\n 'layers.sectionSingle': 'Ενότητα',\r\n 'layers.sectionMulti': 'Ενότητα · {count} στήλες',\r\n 'layers.blockCount': '{count} μπλ.',\r\n 'theme.globalStyles': 'Καθολικά στυλ',\r\n 'vars.title': 'Μεταβλητές',\r\n 'vars.fromCode': '{count} από τον κώδικά σας',\r\n 'vars.declaredNote': 'Δηλωμένες από την εφαρμογή σας — ο καμβάς εμφανίζει πάντα το token, ποτέ μια τιμή.',\r\n 'vars.filterPlaceholder': 'Φιλτράρισμα μεταβλητών…',\r\n 'vars.insertHint': 'Κάντε κλικ για εισαγωγή στο επιλεγμένο κείμενο, τίτλο ή κουμπί',\r\n 'vars.insert': 'εισαγωγή',\r\n 'vars.noMatch': 'Καμία μεταβλητή δεν ταιριάζει με αυτό το φίλτρο.',\r\n 'vars.noneDeclared': 'Η εφαρμογή σας δεν έχει δηλώσει ακόμη μεταβλητές.',\r\n 'vars.rteHint': 'Κατά την επεξεργασία κειμένου, μπορείτε επίσης να επιλέξετε μια μεταβλητή απευθείας από το αναπτυσσόμενο μενού της ενσωματωμένης γραμμής εργαλείων.',\r\n 'modal.fileManager': 'Διαχείριση αρχείων',\r\n 'modal.assetsTitle': 'Πόροι',\r\n 'modal.replaceImage': 'Αντικατάσταση εικόνας',\r\n 'library.searchPlaceholder': 'Αναζήτηση αρχείων…',\r\n 'action.upload': 'Μεταφόρτωση',\r\n 'library.clickToPlace': 'Κάντε κλικ σε ένα αρχείο για να το τοποθετήσετε · ή σύρετε ένα αρχείο στον καμβά',\r\n 'library.clickToReplace': 'Κάντε κλικ σε ένα αρχείο για να αντικαταστήσετε την επιλεγμένη εικόνα',\r\n 'library.storageLabel': '{count} αρχεία · {size}',\r\n 'library.folders': 'Φάκελοι',\r\n 'library.dropHint': 'Αποθέστε εδώ αρχεία εικόνας για μεταφόρτωση — ή χρησιμοποιήστε το κουμπί Μεταφόρτωση.',\r\n 'library.deleteFileHint': 'Διαγραφή αρχείου',\r\n 'library.del': 'ΔΙΑΓΡ',\r\n 'toast.assetDeleted': 'Το {name} διαγράφηκε',\r\n 'modal.export': 'Εξαγωγή',\r\n 'modal.exportTitle': 'HTML email βασισμένο σε πίνακες',\r\n 'export.copy': 'Αντιγραφή',\r\n 'export.copied': 'Αντιγράφηκε',\r\n 'action.download': 'Λήψη',\r\n 'export.meta': '{kb} KB · πίνακες + ενσωματωμένα στυλ · πλάτη ασφαλή για Outlook',\r\n 'modal.rawHtmlTitle': 'Ακατέργαστο HTML, ζωντανή προεπισκόπηση',\r\n 'code.statusEdited': 'Προβολή κώδικα — επεξεργάστηκε — ζωντανή προεπισκόπηση, δεν έχει εφαρμοστεί ακόμη',\r\n 'code.statusSynced': 'Προβολή κώδικα — συγχρονισμένη με τον καμβά',\r\n 'action.reload': 'Επαναφόρτωση',\r\n 'action.reloadHint': 'Επαναφόρτωση πηγής από τον καμβά',\r\n 'action.applyToCanvas': 'Εφαρμογή στον καμβά',\r\n 'action.applyToCanvasHint': 'Ανάλυση της πηγής ξανά σε επεξεργάσιμες γραμμές',\r\n 'action.closeWithoutApplyingHint': 'Κλείσιμο χωρίς εφαρμογή',\r\n 'code.source': 'Πηγή',\r\n 'code.livePreview': 'Ζωντανή προεπισκόπηση',\r\n 'code.liveHtmlPreviewTitle': 'Ζωντανή προεπισκόπηση HTML',\r\n 'code.applyNote':\r\n 'Η εφαρμογή αναλύει κάθε γραμμή πίνακα ανώτατου επιπέδου σε γραμμή καμβά που μπορείτε ακόμη να επιλέξετε, να αναδιατάξετε και να διαγράψετε — ο χειρόγραφος κώδικας επιβιώνει αναλλοίωτος.',\r\n 'code.meta': '{kb} KB · {lines} γραμμές',\r\n 'toast.sourceReloaded': 'Η πηγή επαναφορτώθηκε από τον καμβά',\r\n 'toast.sourceAppliedOne': 'Η πηγή εφαρμόστηκε — 1 γραμμή στον καμβά',\r\n 'toast.sourceAppliedMany': 'Η πηγή εφαρμόστηκε — {rows} γραμμές στον καμβά',\r\n 'toast.parseError': 'Δεν ήταν δυνατή η ανάλυση αυτού του HTML',\r\n 'modal.copyAssist': 'Βοηθός κειμένου',\r\n 'modal.draftCopyTitle': 'Σύνταξη κειμένου για αυτήν την καμπάνια',\r\n 'ai.goal': 'Στόχος',\r\n 'ai.tone': 'Τόνος',\r\n 'ai.briefLabel': 'Για τι αφορά αυτό το email;',\r\n 'ai.briefPlaceholder': 'π.χ. Φθινοπωρινή συλλογή, 15% για συνδρομητές, δωρεάν αποστολή άνω των 150€',\r\n 'ai.generate': 'Δημιουργία κειμένου',\r\n 'ai.writing': 'Γίνεται συγγραφή…',\r\n 'ai.kindHeadline': 'Τίτλος',\r\n 'ai.kindBody': 'Κύριο κείμενο',\r\n 'ai.kindButton': 'Κείμενο κουμπιού',\r\n 'ai.actionInsertHeading': 'Εισαγωγή ως τίτλος',\r\n 'ai.actionInsertText': 'Εισαγωγή ως μπλοκ κειμένου',\r\n 'ai.actionInsertButton': 'Εισαγωγή ως κουμπί',\r\n 'toast.headingAdded': 'Ο τίτλος προστέθηκε',\r\n 'toast.textBlockAdded': 'Το μπλοκ κειμένου προστέθηκε',\r\n 'toast.buttonAdded': 'Το κουμπί προστέθηκε',\r\n 'preview.kickerMobile': 'Προεπισκόπηση — κινητό 375px',\r\n 'preview.kickerDark': 'Προεπισκόπηση — σκούρα εισερχόμενα',\r\n 'preview.kickerDesktop': 'Προεπισκόπηση — υπολογιστής {width}px',\r\n 'action.close': 'Κλείσιμο',\r\n 'toast.duplicated': 'Διπλασιάστηκε',\r\n 'toast.fileUploadedOne': '1 αρχείο μεταφορτώθηκε',\r\n 'toast.fileUploadedMany': '{count} αρχεία μεταφορτώθηκαν',\r\n 'toast.imageReplaced': 'Η εικόνα αντικαταστάθηκε',\r\n 'toast.imageAdded': 'Η εικόνα προστέθηκε στον καμβά',\r\n 'toast.htmlCopied': 'Το HTML αντιγράφηκε στο πρόχειρο',\r\n 'toast.templateLoaded': 'Το {name} φορτώθηκε',\r\n 'toast.snippetDefaultLabel': 'Απόσπασμα',\r\n 'toast.snippetInserted': 'Το {name} εισήχθη',\r\n 'toast.snippetCopied': 'Το {name} αντιγράφηκε — επιλέξτε ένα μπλοκ κειμένου για να το εισαγάγετε',\r\n};\r\n\r\n\nObject.assign(exports, { EL });\n\n};\n__modules[\"core/i18n/en.js\"] = function(module, exports, __require) {\n/**\n * The English message table -- the only locale that ships inside the core\n * bundle. Every other language is a separate module under this same folder\n * that a host app imports and hands to the editor as `.messages` (see\n * `index.js`'s `createTranslator`).\n *\n * Flat, not nested: keys are `<area>.<thing>` and nothing deeper, so the\n * dotted prefix gives the grouping without a path-resolver. Scope is editor\n * chrome only -- panel names, toolbar actions, empty states, modals, status\n * and toast text. Block-type names, per-field inspector labels (\"Padding\n * top / bottom\", etc.) and default email content are not translated here;\n * those are either data (`core/blocks.js`) or a\n * deliberately separate follow-up pass.\n */\nconst EN = {\n // Header\n 'action.undoHint': 'Undo — ⌘Z',\n 'action.redoHint': 'Redo — ⌘⇧Z',\n 'action.chromeToDark': 'Dark',\n 'action.chromeToLight': 'Light',\n 'action.chromeHint': 'Light / dark editor chrome',\n 'action.chromeHintToDark': 'Dark mode',\n 'action.chromeHintToLight': 'Light mode',\n 'action.aiCopy': 'Draft',\n 'action.aiCopyHint': 'Draft email content with AI',\n 'action.aiDraft': 'Draft',\n 'action.aiDraftHint': 'Draft email content with AI',\n 'action.code': 'Code',\n 'action.codeHint': 'Edit the raw HTML with a live preview',\n 'action.preview': 'Preview',\n 'action.previewHint': 'Preview the email',\n 'action.export': 'Export',\n 'action.exportHint': 'Export your email',\n\n // Device segment (header, preview modal, code modal)\n 'device.desktop': 'Desktop',\n 'device.desktopHint': 'Desktop width',\n 'device.mobile': 'Mobile',\n 'device.mobileHint': 'Mobile width',\n\n // Autosave status (header)\n 'status.autosaveOn': 'autosave on',\n 'status.saved': 'saved {time}',\n 'status.saveFailed': 'not saved — storage full',\n\n // Main canvas dock pill\n 'canvas.meta': '{rows} rows · {blocks} blocks · {width}px',\n\n // Tab bar\n 'tab.design': 'Design',\n 'tab.designHint': 'Style the selection',\n 'tab.blocks': 'Content blocks',\n 'tab.blocksHint': 'Content blocks and variables',\n 'tab.rows': 'Sections',\n 'tab.rowsHint': 'Section layouts and canvas model',\n 'tab.files': 'Assets',\n 'tab.filesHint': 'Asset library',\n 'tab.layers': 'Layers',\n 'tab.layersHint': 'Document structure',\n // Renamed keys (were tab.theme/tab.themeHint \"Theme / Global styles\"): new\n // key names on purpose, so locales that still carry the old translation\n // fall back to this English name instead of showing the stale \"Theme\".\n 'tab.settings': 'Settings',\n 'tab.settingsHint': 'Email settings',\n 'tab.data': 'Variables',\n 'tab.dataHint': 'Variables provided by your code',\n\n // Design tab\n 'inspector.blockProperties': 'Block properties',\n 'inspector.sectionProperties': 'Section properties',\n 'inspector.title': 'Inspector',\n 'inspector.sectionLabel': 'Section',\n 'inspector.nothingSelected': 'Nothing selected',\n 'action.duplicateHint': 'Duplicate — ⌘D',\n 'action.deleteHint': 'Delete — ⌫',\n 'inspector.emptyBody':\n 'Pick a row or block on the canvas to style it here. Drag blocks in from the <strong style=\"color: var(--ed-text); font-weight: 600;\">Content blocks</strong> tab; double-click any text to edit it in place.',\n 'inspector.shortcuts': 'Shortcuts',\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — undo, redo',\n 'shortcut.duplicate': '⌘D — duplicate selection',\n 'shortcut.delete': '⌫ — delete selection',\n 'shortcut.export': '⌘E — export email',\n 'shortcut.escape': 'ESC — deselect, close',\n\n // Blocks tab\n 'blocks.dragHint': 'Drag a block onto the canvas',\n 'blocks.count': '{count} blocks',\n\n // Rows (Sections) tab\n 'rows.sectionLayouts': 'Section layouts',\n 'rows.customMarkup': 'Custom markup',\n 'rows.htmlRowHint': 'Drag in, or click to append — a full-bleed row you fill with raw HTML',\n 'rows.rawHtmlSection': 'Raw HTML section',\n 'rows.rawHtmlDesc': 'Full-bleed section, your markup, still draggable',\n 'rows.canvasModel': 'Canvas model',\n 'rows.modeRowBased': 'Row based',\n 'rows.modeFreeStack': 'Free stack',\n 'rows.hintRows':\n 'Section based: drop a layout first, then drop blocks into its columns — every section carries its own background, border, flex or grid settings.',\n 'rows.hintStack': 'Free stack: skip layouts — every block you drop becomes its own full-width section, stacked in order.',\n\n\n // Files tab (sidebar)\n 'files.libraryCount': 'Library — {count} files',\n 'files.openManager': 'Open file manager',\n 'files.dragToCanvas': 'Drag any file straight onto the canvas to place it as an image block.',\n\n // Layers (Tree) tab\n 'layers.structure': 'Structure',\n 'layers.sectionSingle': 'Section',\n 'layers.sectionMulti': 'Section · {count} columns',\n 'layers.column': 'Column {index}',\n 'layers.blockCount': '{count} blocks',\n\n // Theme tab\n 'theme.globalStyles': 'Global styles',\n\n // Data (Vars) tab\n 'vars.title': 'Variables',\n 'vars.fromCode': '{count} from your code',\n 'vars.declaredNote': 'Declared by your application — the canvas always shows the token, never a value.',\n 'vars.filterPlaceholder': 'Filter variables…',\n 'vars.insertHint': 'Click to insert into the selected text, heading or button',\n 'vars.insert': 'insert',\n 'vars.noMatch': 'No variable matches that filter.',\n 'vars.noneDeclared': 'Your application has not declared any variables yet.',\n 'vars.rteHint': 'While editing text you can also pick a variable straight from the inline toolbar’s dropdown.',\n\n // Library modal\n 'modal.fileManager': 'File manager',\n 'modal.assetsTitle': 'Assets',\n 'modal.replaceImage': 'Replace image',\n 'library.searchPlaceholder': 'Search files…',\n 'action.upload': 'Upload',\n 'library.clickToPlace': 'Click a file to place it · drag a file onto the canvas',\n 'library.clickToReplace': 'Click a file to replace the selected image',\n 'library.storageLabel': '{count} files · {size}',\n 'library.folders': 'Folders',\n 'library.dropHint': 'Drop image files here to upload — or use the Upload button.',\n 'library.deleteFileHint': 'Delete file',\n 'library.del': 'DEL',\n 'toast.assetDeleted': '{name} deleted',\n 'library.allFiles': 'All files',\n 'library.loadMore': 'Load more',\n 'library.empty': 'No files here yet.',\n\n // Host-supplied storage (core/storage-limits.js, core/storage.js). The\n // limits are the host app's to set -- these strings only report them.\n 'storage.loading': 'Loading files…',\n 'storage.uploading': 'Uploading {count}…',\n 'storage.errLoadFailed': 'The file library could not be loaded — {reason}',\n 'storage.errNoLimits': 'Uploads are switched off: this app has not set any upload limits.',\n 'storage.errNoAccept': 'Uploads are switched off: no file formats have been allowed.',\n 'storage.errNoMaxBytes': 'Uploads are switched off: no maximum file size has been set.',\n 'storage.errTooLarge': '{name} is {size} — the limit is {max}.',\n 'storage.errFormat': '{name} is a {type} file, which is not allowed here.',\n 'storage.errSvg': '{name} is an SVG, which this app does not accept.',\n 'storage.errDimensions': '{name} is {w}×{ht}px — the limit is {maxW}×{maxH}px.',\n 'storage.errTooMany': 'Only {max} files can be uploaded at once.',\n 'storage.errUnreadable': '{name} is not a readable image.',\n 'storage.errUploadFailed': '{name} could not be uploaded — {reason}',\n 'storage.errDeleteFailed': '{name} could not be deleted — {reason}',\n\n // Export modal\n 'modal.export': 'Export',\n 'modal.exportTitle': 'Your email is ready',\n 'export.copy': 'Copy email',\n 'export.copied': 'Copied',\n 'action.download': 'Download',\n 'export.meta': '{kb} KB · ready to copy or download',\n\n // Code modal\n 'modal.rawHtmlTitle': 'Raw HTML, live preview',\n 'code.statusEdited': 'Code view — edited — preview live, not yet applied',\n 'code.statusSynced': 'Code view — in sync with the canvas',\n 'action.reload': 'Reload',\n 'action.reloadHint': 'Reload the source from the canvas',\n 'action.applyToCanvas': 'Apply to canvas',\n 'action.applyToCanvasHint': 'Parse the source back into editable rows',\n 'action.closeWithoutApplyingHint': 'Close without applying',\n 'code.source': 'Source',\n 'code.livePreview': 'Live preview',\n 'code.liveHtmlPreviewTitle': 'Live HTML preview',\n 'code.applyNote':\n 'Apply parses each top-level table row back into a canvas row you can still select, reorder and delete — hand-written markup survives the round trip.',\n 'code.meta': '{kb} KB · {lines} lines',\n 'toast.sourceReloaded': 'Source reloaded from canvas',\n 'toast.sourceAppliedOne': 'Source applied — 1 row back on the canvas',\n 'toast.sourceAppliedMany': 'Source applied — {rows} rows back on the canvas',\n 'toast.parseError': 'Could not parse that HTML',\n\n // AI copy modal\n 'modal.copyAssist': 'AI writing assistant',\n 'modal.draftCopyTitle': 'Draft your email with AI',\n 'modal.aiDraft': 'AI writing assistant',\n 'modal.aiDraftTitle': 'Draft your email with AI',\n 'ai.disclosure': 'AI creates suggestions from your brief. Review and edit the result before sending.',\n 'ai.goal': 'Goal',\n 'ai.tone': 'Tone',\n 'ai.briefLabel': 'What is this email about?',\n 'ai.briefPlaceholder': 'e.g. Autumn outerwear drop, 15% for subscribers, free shipping over $150',\n 'ai.generate': 'Generate draft with AI',\n 'ai.writing': 'Writing…',\n 'ai.kindHeadline': 'Headline',\n 'ai.kindBody': 'Body copy',\n 'ai.kindButton': 'Button label',\n 'ai.actionInsertHeading': 'Insert as heading',\n 'ai.actionInsertText': 'Insert as text block',\n 'ai.actionInsertButton': 'Insert as button',\n 'toast.headingAdded': 'Heading added',\n 'toast.textBlockAdded': 'Text block added',\n 'toast.buttonAdded': 'Button added',\n\n // Preview modal\n 'preview.kickerMobile': 'Preview — mobile 375px',\n 'preview.kickerDesktop': 'Preview — desktop {width}px',\n 'action.close': 'Close',\n\n // General toasts (editor-core.js)\n 'toast.duplicated': 'Duplicated',\n 'toast.fileUploadedOne': '1 file uploaded',\n 'toast.fileUploadedMany': '{count} files uploaded',\n 'toast.imageReplaced': 'Image replaced',\n 'toast.imageAdded': 'Image added to canvas',\n 'toast.htmlCopied': 'HTML copied to clipboard',\n 'toast.templateLoaded': '{name} loaded',\n 'toast.snippetDefaultLabel': 'Snippet',\n 'toast.snippetInserted': '{name} inserted',\n 'toast.snippetCopied': '{name} copied — select a text block to insert it',\n\n // Inline rich text toolbar (render/rte.js)\n 'rte.textStyle': 'Text style',\n 'rte.mergeTags': 'Merge Tags',\n 'rte.noMergeTags': 'No merge tags available',\n 'rte.textColor': 'Text color',\n 'rte.highlightColor': 'Highlight color',\n 'rte.removeHighlight': 'Remove highlight',\n 'rte.clearFormatting': 'Clear formatting',\n\n // Screenshot export (export modal / element `screenshotPng()`)\n 'action.downloadPng': 'Download PNG',\n 'action.screenshot': 'Screenshot',\n 'action.screenshotHint': 'Preview the full template as an image, then download it',\n 'toast.pngSaved': 'Screenshot downloaded',\n 'toast.pngFailed': 'Screenshot failed — an external image could not be loaded',\n 'toast.pngCopied': 'Screenshot copied to clipboard',\n 'toast.pngCopyFailed': 'This browser would not accept an image on the clipboard',\n\n // Story-style screenshot viewer (render/story.js)\n 'story.kicker': 'Screenshot',\n 'story.rendering': 'Rendering the screenshot',\n 'story.renderingHint': 'Painting every block at 2× — this takes a moment on a long template.',\n 'story.failed': 'Screenshot failed',\n 'story.failedHint': 'An image in the template could not be loaded for capture.',\n 'story.retry': 'Try again',\n 'story.play': 'Play',\n 'story.pause': 'Pause',\n 'story.replay': 'Replay',\n 'story.copy': 'Copy',\n 'story.meta': '{w}×{h} · screen {i} of {n}',\n\n // Footer strip (core/footer.js). One string, so a translator localizes\n // \"Powered by\" while the product name and year travel with it; a host that\n // wants different wording sets `footer` rather than translating this.\n 'footer.poweredBy': 'Powered by SELISE Blocks © 2026',\n};\n\n/** Every key the editor asks for. Exported so a translator can diff a custom table against it. */\nconst MESSAGE_KEYS = Object.keys(EN).sort();\n\nObject.assign(exports, { EN, MESSAGE_KEYS });\n\n};\n__modules[\"core/i18n/es.js\"] = function(module, exports, __require) {\n/** Spanish (Español) — `es`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst ES = {\r\n 'action.undoHint': 'Deshacer — ⌘Z',\r\n 'action.redoHint': 'Rehacer — ⌘⇧Z',\r\n 'action.chromeToDark': 'Oscuro',\r\n 'action.chromeToLight': 'Claro',\r\n 'action.chromeHint': 'Tema del editor claro / oscuro',\r\n 'action.aiCopy': 'Texto',\r\n 'action.aiCopyHint': 'Redactar texto con IA',\r\n 'action.code': 'Código',\r\n 'action.codeHint': 'Editar el HTML sin procesar con vista previa en vivo',\r\n 'action.preview': 'Vista previa',\r\n 'action.export': 'Exportar',\r\n 'device.desktop': 'Escritorio',\r\n 'device.desktopHint': 'Ancho de escritorio',\r\n 'device.mobile': 'Móvil',\r\n 'device.mobileHint': 'Ancho móvil',\r\n 'device.dark': 'Oscuro',\r\n 'device.darkHint': 'Bandeja de entrada oscura',\r\n 'status.autosaveOn': 'guardado automático activado',\r\n 'status.saved': 'guardado {time}',\r\n 'status.saveFailed': 'no guardado — almacenamiento lleno',\r\n 'canvas.meta': '{rows} filas · {blocks} bloques · {width}px',\r\n 'tab.design': 'Estilo',\r\n 'tab.designHint': 'Aplicar estilo a la selección',\r\n 'tab.blocks': 'Bloques',\r\n 'tab.blocksHint': 'Bloques de contenido y variables',\r\n 'tab.rows': 'Secc.',\r\n 'tab.rowsHint': 'Diseños de sección y modelo de lienzo',\r\n 'tab.files': 'Archivos',\r\n 'tab.filesHint': 'Biblioteca de recursos',\r\n 'tab.layers': 'Estruct.',\r\n 'tab.layersHint': 'Estructura del documento',\r\n 'tab.theme': 'Tema',\r\n 'tab.themeHint': 'Estilos globales',\r\n 'tab.data': 'Var.',\r\n 'tab.dataHint': 'Variables proporcionadas por tu código',\r\n 'inspector.blockProperties': 'Propiedades del bloque',\r\n 'inspector.sectionProperties': 'Propiedades de la sección',\r\n 'inspector.title': 'Inspector',\r\n 'inspector.sectionLabel': 'Sección',\r\n 'inspector.nothingSelected': 'Nada seleccionado',\r\n 'action.duplicateHint': 'Duplicar — ⌘D',\r\n 'action.deleteHint': 'Eliminar — ⌫',\r\n 'inspector.emptyBody':\r\n 'Selecciona una fila o un bloque en el lienzo para darle estilo aquí. Arrastra bloques desde la pestaña <strong style=\"color: var(--ed-text); font-weight: 600;\">Bloques</strong>; haz doble clic en cualquier texto para editarlo directamente.',\r\n 'inspector.shortcuts': 'Atajos',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — deshacer, rehacer',\r\n 'shortcut.duplicate': '⌘D — duplicar selección',\r\n 'shortcut.delete': '⌫ — eliminar selección',\r\n 'shortcut.export': '⌘E — exportar HTML',\r\n 'shortcut.escape': 'ESC — deseleccionar, cerrar',\r\n 'blocks.dragHint': 'Arrastra al lienzo',\r\n 'blocks.count': '{count} bloques',\r\n 'rows.sectionLayouts': 'Diseños de sección',\r\n 'rows.customMarkup': 'Marcado personalizado',\r\n 'rows.htmlRowHint': 'Arrastra para insertar, o haz clic para añadir — una fila a sangre completa que rellenas con HTML sin procesar',\r\n 'rows.rawHtmlSection': 'Sección de HTML sin procesar',\r\n 'rows.rawHtmlDesc': 'Sección a sangre completa, tu propio marcado, sigue siendo arrastrable',\r\n 'rows.canvasModel': 'Modelo de lienzo',\r\n 'rows.modeRowBased': 'Basado en filas',\r\n 'rows.modeFreeStack': 'Pila libre',\r\n 'rows.hintRows':\r\n 'Basado en secciones: primero suelta un diseño, luego suelta bloques en sus columnas — cada sección tiene su propio fondo, borde, ajustes flex o de cuadrícula.',\r\n 'rows.hintStack': 'Pila libre: sin diseños — cada bloque que sueltas se convierte en su propia sección de ancho completo, apilada en orden.',\r\n 'files.libraryCount': 'Biblioteca — {count} archivos',\r\n 'files.openManager': 'Abrir gestor de archivos',\r\n 'files.dragToCanvas': 'Arrastra cualquier archivo directamente al lienzo para colocarlo como bloque de imagen.',\r\n 'layers.structure': 'Estructura',\r\n 'layers.sectionSingle': 'Sección',\r\n 'layers.sectionMulti': 'Sección · {count} col.',\r\n 'layers.blockCount': '{count} bloq.',\r\n 'theme.globalStyles': 'Estilos globales',\r\n 'vars.title': 'Variables',\r\n 'vars.fromCode': '{count} de tu código',\r\n 'vars.declaredNote': 'Declaradas por tu aplicación — el lienzo siempre muestra el token, nunca un valor.',\r\n 'vars.filterPlaceholder': 'Filtrar variables…',\r\n 'vars.insertHint': 'Haz clic para insertar en el texto, título o botón seleccionado',\r\n 'vars.insert': 'insertar',\r\n 'vars.noMatch': 'Ninguna variable coincide con ese filtro.',\r\n 'vars.noneDeclared': 'Tu aplicación aún no ha declarado ninguna variable.',\r\n 'vars.rteHint': 'Al editar texto también puedes elegir una variable directamente desde el menú de la barra de herramientas en línea.',\r\n 'modal.fileManager': 'Gestor de archivos',\r\n 'modal.assetsTitle': 'Recursos',\r\n 'modal.replaceImage': 'Reemplazar imagen',\r\n 'library.searchPlaceholder': 'Buscar archivos…',\r\n 'action.upload': 'Subir',\r\n 'library.clickToPlace': 'Haz clic en un archivo para colocarlo · o arrastra un archivo al lienzo',\r\n 'library.clickToReplace': 'Haz clic en un archivo para reemplazar la imagen seleccionada',\r\n 'library.storageLabel': '{count} archivos · {size}',\r\n 'library.folders': 'Carpetas',\r\n 'library.dropHint': 'Suelta archivos de imagen aquí para subirlos — o usa el botón Subir.',\r\n 'library.deleteFileHint': 'Eliminar archivo',\r\n 'library.del': 'BORR',\r\n 'toast.assetDeleted': '{name} eliminado',\r\n 'modal.export': 'Exportar',\r\n 'modal.exportTitle': 'HTML de correo basado en tablas',\r\n 'export.copy': 'Copiar',\r\n 'export.copied': 'Copiado',\r\n 'action.download': 'Descargar',\r\n 'export.meta': '{kb} KB · tablas + estilos en línea · anchos seguros para Outlook',\r\n 'modal.rawHtmlTitle': 'HTML sin procesar, vista previa en vivo',\r\n 'code.statusEdited': 'Vista de código — editado — vista previa en vivo, aún no aplicado',\r\n 'code.statusSynced': 'Vista de código — sincronizado con el lienzo',\r\n 'action.reload': 'Recargar',\r\n 'action.reloadHint': 'Recargar el origen desde el lienzo',\r\n 'action.applyToCanvas': 'Aplicar al lienzo',\r\n 'action.applyToCanvasHint': 'Analizar el origen de nuevo en filas editables',\r\n 'action.closeWithoutApplyingHint': 'Cerrar sin aplicar',\r\n 'code.source': 'Origen',\r\n 'code.livePreview': 'Vista previa en vivo',\r\n 'code.liveHtmlPreviewTitle': 'Vista previa de HTML en vivo',\r\n 'code.applyNote':\r\n 'Aplicar analiza cada fila de tabla de nivel superior en una fila de lienzo que aún puedes seleccionar, reordenar y eliminar — el marcado escrito a mano sobrevive el proceso.',\r\n 'code.meta': '{kb} KB · {lines} líneas',\r\n 'toast.sourceReloaded': 'Origen recargado desde el lienzo',\r\n 'toast.sourceAppliedOne': 'Origen aplicado — 1 fila en el lienzo',\r\n 'toast.sourceAppliedMany': 'Origen aplicado — {rows} filas en el lienzo',\r\n 'toast.parseError': 'No se pudo analizar ese HTML',\r\n 'modal.copyAssist': 'Asistente de redacción',\r\n 'modal.draftCopyTitle': 'Redactar texto para esta campaña',\r\n 'ai.goal': 'Objetivo',\r\n 'ai.tone': 'Tono',\r\n 'ai.briefLabel': '¿De qué trata este correo?',\r\n 'ai.briefPlaceholder': 'p. ej. Colección de otoño, 15% para suscriptores, envío gratis desde $150',\r\n 'ai.generate': 'Generar texto',\r\n 'ai.writing': 'Escribiendo…',\r\n 'ai.kindHeadline': 'Titular',\r\n 'ai.kindBody': 'Cuerpo del texto',\r\n 'ai.kindButton': 'Texto del botón',\r\n 'ai.actionInsertHeading': 'Insertar como encabezado',\r\n 'ai.actionInsertText': 'Insertar como bloque de texto',\r\n 'ai.actionInsertButton': 'Insertar como botón',\r\n 'toast.headingAdded': 'Encabezado añadido',\r\n 'toast.textBlockAdded': 'Bloque de texto añadido',\r\n 'toast.buttonAdded': 'Botón añadido',\r\n 'preview.kickerMobile': 'Vista previa — móvil 375px',\r\n 'preview.kickerDark': 'Vista previa — bandeja oscura',\r\n 'preview.kickerDesktop': 'Vista previa — escritorio {width}px',\r\n 'action.close': 'Cerrar',\r\n 'toast.duplicated': 'Duplicado',\r\n 'toast.fileUploadedOne': '1 archivo subido',\r\n 'toast.fileUploadedMany': '{count} archivos subidos',\r\n 'toast.imageReplaced': 'Imagen reemplazada',\r\n 'toast.imageAdded': 'Imagen añadida al lienzo',\r\n 'toast.htmlCopied': 'HTML copiado al portapapeles',\r\n 'toast.templateLoaded': '{name} cargado',\r\n 'toast.snippetDefaultLabel': 'Fragmento',\r\n 'toast.snippetInserted': '{name} insertado',\r\n 'toast.snippetCopied': '{name} copiado — selecciona un bloque de texto para insertarlo',\r\n};\r\n\r\n\nObject.assign(exports, { ES });\n\n};\n__modules[\"core/i18n/et.js\"] = function(module, exports, __require) {\n/** Estonian (Eesti) — `et`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst ET = {\r\n 'action.undoHint': 'Võta tagasi — ⌘Z',\r\n 'action.redoHint': 'Tee uuesti — ⌘⇧Z',\r\n 'action.chromeToDark': 'Tume',\r\n 'action.chromeToLight': 'Hele',\r\n 'action.chromeHint': 'Redaktori teema hele / tume',\r\n 'action.aiCopy': 'Tekst',\r\n 'action.aiCopyHint': 'Koosta tekst tehisintellektiga',\r\n 'action.code': 'Kood',\r\n 'action.codeHint': 'Muuda töötlemata HTML-i otseeelvaatega',\r\n 'action.preview': 'Eelvaade',\r\n 'action.export': 'Ekspordi',\r\n 'device.desktop': 'Arvuti',\r\n 'device.desktopHint': 'Arvuti laius',\r\n 'device.mobile': 'Mobiil',\r\n 'device.mobileHint': 'Mobiili laius',\r\n 'device.dark': 'Tume',\r\n 'device.darkHint': 'Postkasti tume režiim',\r\n 'status.autosaveOn': 'automaatne salvestamine sees',\r\n 'status.saved': 'salvestatud {time}',\r\n 'status.saveFailed': 'ei salvestatud — talletusruum täis',\r\n 'canvas.meta': '{rows} rida · {blocks} plokki · {width}px',\r\n 'tab.design': 'Stiil',\r\n 'tab.designHint': 'Vali stiil valikule',\r\n 'tab.blocks': 'Plokid',\r\n 'tab.blocksHint': 'Sisuplokid ja muutujad',\r\n 'tab.rows': 'Sektsioonid',\r\n 'tab.rowsHint': 'Sektsioonide paigutused ja lõuendi mudel',\r\n 'tab.files': 'Failid',\r\n 'tab.filesHint': 'Ressursside teek',\r\n 'tab.layers': 'Struktuur',\r\n 'tab.layersHint': 'Dokumendi struktuur',\r\n 'tab.theme': 'Teema',\r\n 'tab.themeHint': 'Globaalsed stiilid',\r\n 'tab.data': 'Muut.',\r\n 'tab.dataHint': 'Sinu koodi pakutavad muutujad',\r\n 'inspector.blockProperties': 'Ploki omadused',\r\n 'inspector.sectionProperties': 'Sektsiooni omadused',\r\n 'inspector.title': 'Inspektor',\r\n 'inspector.sectionLabel': 'Sektsioon',\r\n 'inspector.nothingSelected': 'Midagi pole valitud',\r\n 'action.duplicateHint': 'Paljunda — ⌘D',\r\n 'action.deleteHint': 'Kustuta — ⌫',\r\n 'inspector.emptyBody':\r\n 'Vali lõuendil rida või plokk, et seda siin kujundada. Lohista plokke vahekaardilt <strong style=\"color: var(--ed-text); font-weight: 600;\">Plokid</strong>; topeltklõpsa mistahes tekstil, et seda otse muuta.',\r\n 'inspector.shortcuts': 'Kiirklahvid',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — võta tagasi, tee uuesti',\r\n 'shortcut.duplicate': '⌘D — paljunda valik',\r\n 'shortcut.delete': '⌫ — kustuta valik',\r\n 'shortcut.export': '⌘E — ekspordi HTML',\r\n 'shortcut.escape': 'ESC — tühista valik, sulge',\r\n 'blocks.dragHint': 'Lohista lõuendile',\r\n 'blocks.count': '{count} plokki',\r\n 'rows.sectionLayouts': 'Sektsioonide paigutused',\r\n 'rows.customMarkup': 'Kohandatud kood',\r\n 'rows.htmlRowHint': 'Lohista lisamiseks või klõpsa lisamiseks — täislaiuses rida, mille täidad töötlemata HTML-iga',\r\n 'rows.rawHtmlSection': 'Töötlemata HTML-i sektsioon',\r\n 'rows.rawHtmlDesc': 'Täislaiuses sektsioon, sinu enda kood, endiselt lohistatav',\r\n 'rows.canvasModel': 'Lõuendi mudel',\r\n 'rows.modeRowBased': 'Ridadel põhinev',\r\n 'rows.modeFreeStack': 'Vaba virn',\r\n 'rows.hintRows':\r\n 'Sektsioonidel põhinev: aseta esmalt paigutus, seejärel plokid selle veergudesse — igal sektsioonil on oma taust, äär, flex- või ruudustiku seaded.',\r\n 'rows.hintStack': 'Vaba virn: ilma paigutusteta — iga asetatud plokk saab oma täislaiuses sektsiooniks, virnastatuna järjekorras.',\r\n 'files.libraryCount': 'Teek — {count} faili',\r\n 'files.openManager': 'Ava failihaldur',\r\n 'files.dragToCanvas': 'Lohista mistahes fail otse lõuendile, et paigutada see pildiplokina.',\r\n 'layers.structure': 'Struktuur',\r\n 'layers.sectionSingle': 'Sektsioon',\r\n 'layers.sectionMulti': 'Sektsioon · {count} veergu',\r\n 'layers.blockCount': '{count} plokki',\r\n 'theme.globalStyles': 'Globaalsed stiilid',\r\n 'vars.title': 'Muutujad',\r\n 'vars.fromCode': '{count} sinu koodist',\r\n 'vars.declaredNote': 'Sinu rakenduse deklareeritud — lõuend näitab alati tokenit, mitte kunagi väärtust.',\r\n 'vars.filterPlaceholder': 'Filtreeri muutujaid…',\r\n 'vars.insertHint': 'Klõpsa, et lisada valitud teksti, pealkirja või nupu sisse',\r\n 'vars.insert': 'lisa',\r\n 'vars.noMatch': 'Ükski muutuja ei vasta sellele filtrile.',\r\n 'vars.noneDeclared': 'Sinu rakendus pole veel muutujaid deklareerinud.',\r\n 'vars.rteHint': 'Teksti muutmisel saad valida muutuja ka otse sisseehitatud tööriistariba rippmenüüst.',\r\n 'modal.fileManager': 'Failihaldur',\r\n 'modal.assetsTitle': 'Ressursid',\r\n 'modal.replaceImage': 'Asenda pilt',\r\n 'library.searchPlaceholder': 'Otsi faile…',\r\n 'action.upload': 'Laadi üles',\r\n 'library.clickToPlace': 'Klõpsa failil, et see paigutada · või lohista fail lõuendile',\r\n 'library.clickToReplace': 'Klõpsa failil, et asendada valitud pilt',\r\n 'library.storageLabel': '{count} faili · {size}',\r\n 'library.folders': 'Kaustad',\r\n 'library.dropHint': 'Lohista pildifailid siia üleslaadimiseks — või kasuta nuppu Laadi üles.',\r\n 'library.deleteFileHint': 'Kustuta fail',\r\n 'library.del': 'KUSTUTA',\r\n 'toast.assetDeleted': '{name} kustutatud',\r\n 'modal.export': 'Ekspordi',\r\n 'modal.exportTitle': 'Tabelipõhine e-kirja HTML',\r\n 'export.copy': 'Kopeeri',\r\n 'export.copied': 'Kopeeritud',\r\n 'action.download': 'Laadi alla',\r\n 'export.meta': '{kb} KB · tabelid + sisestiilid · Outlooki jaoks turvalised laiused',\r\n 'modal.rawHtmlTitle': 'Töötlemata HTML, otseeelvaade',\r\n 'code.statusEdited': 'Koodivaade — muudetud — eelvaade otse, veel rakendamata',\r\n 'code.statusSynced': 'Koodivaade — lõuendiga sünkroonis',\r\n 'action.reload': 'Laadi uuesti',\r\n 'action.reloadHint': 'Laadi allikas lõuendilt uuesti',\r\n 'action.applyToCanvas': 'Rakenda lõuendile',\r\n 'action.applyToCanvasHint': 'Analüüsi allikas tagasi muudetavateks ridadeks',\r\n 'action.closeWithoutApplyingHint': 'Sulge ilma rakendamata',\r\n 'code.source': 'Allikas',\r\n 'code.livePreview': 'Otseeelvaade',\r\n 'code.liveHtmlPreviewTitle': 'HTML-i otseeelvaade',\r\n 'code.applyNote':\r\n 'Rakendamine analüüsib iga ülataseme tabelirea lõuendireaks, mida saad endiselt valida, ümber korraldada ja kustutada — käsitsi kirjutatud kood jääb protsessis muutumatuks.',\r\n 'code.meta': '{kb} KB · {lines} rida',\r\n 'toast.sourceReloaded': 'Allikas laaditi lõuendilt uuesti',\r\n 'toast.sourceAppliedOne': 'Allikas rakendatud — 1 rida lõuendil',\r\n 'toast.sourceAppliedMany': 'Allikas rakendatud — {rows} rida lõuendil',\r\n 'toast.parseError': 'Seda HTML-i ei õnnestunud analüüsida',\r\n 'modal.copyAssist': 'Tekstiabiline',\r\n 'modal.draftCopyTitle': 'Koosta tekst sellele kampaaniale',\r\n 'ai.goal': 'Eesmärk',\r\n 'ai.tone': 'Toon',\r\n 'ai.briefLabel': 'Millest see e-kiri räägib?',\r\n 'ai.briefPlaceholder': 'nt sügiskollektsioon, 15% tellijatele, tasuta tarne üle 150 €',\r\n 'ai.generate': 'Genereeri tekst',\r\n 'ai.writing': 'Kirjutamine…',\r\n 'ai.kindHeadline': 'Pealkiri',\r\n 'ai.kindBody': 'Põhitekst',\r\n 'ai.kindButton': 'Nupu tekst',\r\n 'ai.actionInsertHeading': 'Lisa pealkirjana',\r\n 'ai.actionInsertText': 'Lisa tekstiplokina',\r\n 'ai.actionInsertButton': 'Lisa nupuna',\r\n 'toast.headingAdded': 'Pealkiri lisatud',\r\n 'toast.textBlockAdded': 'Tekstiplokk lisatud',\r\n 'toast.buttonAdded': 'Nupp lisatud',\r\n 'preview.kickerMobile': 'Eelvaade — mobiil 375px',\r\n 'preview.kickerDark': 'Eelvaade — tume postkast',\r\n 'preview.kickerDesktop': 'Eelvaade — arvuti {width}px',\r\n 'action.close': 'Sulge',\r\n 'toast.duplicated': 'Paljundatud',\r\n 'toast.fileUploadedOne': '1 fail üles laaditud',\r\n 'toast.fileUploadedMany': '{count} faili üles laaditud',\r\n 'toast.imageReplaced': 'Pilt asendatud',\r\n 'toast.imageAdded': 'Pilt lisatud lõuendile',\r\n 'toast.htmlCopied': 'HTML kopeeritud lõikelauale',\r\n 'toast.templateLoaded': '{name} laaditud',\r\n 'toast.snippetDefaultLabel': 'Katke',\r\n 'toast.snippetInserted': '{name} lisatud',\r\n 'toast.snippetCopied': '{name} kopeeritud — vali tekstiplokk selle lisamiseks',\r\n};\r\n\r\n\nObject.assign(exports, { ET });\n\n};\n__modules[\"core/i18n/fi.js\"] = function(module, exports, __require) {\n/** Finnish (Suomi) — `fi`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst FI = {\r\n 'action.undoHint': 'Kumoa — ⌘Z',\r\n 'action.redoHint': 'Tee uudelleen — ⌘⇧Z',\r\n 'action.chromeToDark': 'Tumma',\r\n 'action.chromeToLight': 'Vaalea',\r\n 'action.chromeHint': 'Editorin teema vaalea / tumma',\r\n 'action.aiCopy': 'Teksti',\r\n 'action.aiCopyHint': 'Kirjoita teksti tekoälyllä',\r\n 'action.code': 'Koodi',\r\n 'action.codeHint': 'Muokkaa raakaa HTML:ää suoralla esikatselulla',\r\n 'action.preview': 'Esikatselu',\r\n 'action.export': 'Vie',\r\n 'device.desktop': 'Työpöytä',\r\n 'device.desktopHint': 'Työpöydän leveys',\r\n 'device.mobile': 'Mobiili',\r\n 'device.mobileHint': 'Mobiilin leveys',\r\n 'device.dark': 'Tumma',\r\n 'device.darkHint': 'Saapuneet-tumma tila',\r\n 'status.autosaveOn': 'automaattitallennus päällä',\r\n 'status.saved': 'tallennettu {time}',\r\n 'status.saveFailed': 'ei tallennettu — tallennustila täynnä',\r\n 'canvas.meta': '{rows} riviä · {blocks} lohkoa · {width}px',\r\n 'tab.design': 'Tyyli',\r\n 'tab.designHint': 'Muotoile valinta',\r\n 'tab.blocks': 'Lohkot',\r\n 'tab.blocksHint': 'Sisältölohkot ja muuttujat',\r\n 'tab.rows': 'Osiot',\r\n 'tab.rowsHint': 'Osioiden asettelut ja kangasmalli',\r\n 'tab.files': 'Tiedostot',\r\n 'tab.filesHint': 'Resurssikirjasto',\r\n 'tab.layers': 'Rakenne',\r\n 'tab.layersHint': 'Asiakirjan rakenne',\r\n 'tab.theme': 'Teema',\r\n 'tab.themeHint': 'Yleiset tyylit',\r\n 'tab.data': 'Muutt.',\r\n 'tab.dataHint': 'Koodisi tarjoamat muuttujat',\r\n 'inspector.blockProperties': 'Lohkon ominaisuudet',\r\n 'inspector.sectionProperties': 'Osion ominaisuudet',\r\n 'inspector.title': 'Tarkastaja',\r\n 'inspector.sectionLabel': 'Osio',\r\n 'inspector.nothingSelected': 'Ei valintaa',\r\n 'action.duplicateHint': 'Monista — ⌘D',\r\n 'action.deleteHint': 'Poista — ⌫',\r\n 'inspector.emptyBody':\r\n 'Valitse rivi tai lohko kankaalta muotoillaksesi sen tässä. Vedä lohkoja välilehdeltä <strong style=\"color: var(--ed-text); font-weight: 600;\">Lohkot</strong>; kaksoisnapsauta tekstiä muokataksesi sitä suoraan.',\r\n 'inspector.shortcuts': 'Pikanäppäimet',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — kumoa, tee uudelleen',\r\n 'shortcut.duplicate': '⌘D — monista valinta',\r\n 'shortcut.delete': '⌫ — poista valinta',\r\n 'shortcut.export': '⌘E — vie HTML',\r\n 'shortcut.escape': 'ESC — poista valinta, sulje',\r\n 'blocks.dragHint': 'Vedä kankaalle',\r\n 'blocks.count': '{count} lohkoa',\r\n 'rows.sectionLayouts': 'Osioiden asettelut',\r\n 'rows.customMarkup': 'Mukautettu koodi',\r\n 'rows.htmlRowHint': 'Vedä lisätäksesi, tai napsauta lisätäksesi — täysleveä rivi, jonka täytät raa’alla HTML:llä',\r\n 'rows.rawHtmlSection': 'Raaka HTML-osio',\r\n 'rows.rawHtmlDesc': 'Täysleveä osio, oma koodisi, edelleen vedettävissä',\r\n 'rows.canvasModel': 'Kangasmalli',\r\n 'rows.modeRowBased': 'Riveihin perustuva',\r\n 'rows.modeFreeStack': 'Vapaa pino',\r\n 'rows.hintRows':\r\n 'Osioihin perustuva: pudota ensin asettelu, sitten lohkoja sen sarakkeisiin — jokaisella osiolla on oma tausta, reunus, flex- tai ruudukkoasetukset.',\r\n 'rows.hintStack': 'Vapaa pino: ilman asetteluja — jokaisesta pudottamastasi lohkosta tulee oma täysleveä osio, pinottuna järjestyksessä.',\r\n 'files.libraryCount': 'Kirjasto — {count} tiedostoa',\r\n 'files.openManager': 'Avaa tiedostonhallinta',\r\n 'files.dragToCanvas': 'Vedä mikä tahansa tiedosto suoraan kankaalle asettaaksesi sen kuvalohkona.',\r\n 'layers.structure': 'Rakenne',\r\n 'layers.sectionSingle': 'Osio',\r\n 'layers.sectionMulti': 'Osio · {count} saraketta',\r\n 'layers.blockCount': '{count} lohkoa',\r\n 'theme.globalStyles': 'Yleiset tyylit',\r\n 'vars.title': 'Muuttujat',\r\n 'vars.fromCode': '{count} koodistasi',\r\n 'vars.declaredNote': 'Sovelluksesi määrittelemiä — kangas näyttää aina tokenin, ei koskaan arvoa.',\r\n 'vars.filterPlaceholder': 'Suodata muuttujia…',\r\n 'vars.insertHint': 'Napsauta lisätäksesi valittuun tekstiin, otsikkoon tai painikkeeseen',\r\n 'vars.insert': 'lisää',\r\n 'vars.noMatch': 'Yksikään muuttuja ei vastaa tätä suodatinta.',\r\n 'vars.noneDeclared': 'Sovelluksesi ei ole vielä määritellyt muuttujia.',\r\n 'vars.rteHint': 'Tekstiä muokatessasi voit myös valita muuttujan suoraan sisäisen työkalurivin pudotusvalikosta.',\r\n 'modal.fileManager': 'Tiedostonhallinta',\r\n 'modal.assetsTitle': 'Resurssit',\r\n 'modal.replaceImage': 'Korvaa kuva',\r\n 'library.searchPlaceholder': 'Etsi tiedostoja…',\r\n 'action.upload': 'Lataa',\r\n 'library.clickToPlace': 'Napsauta tiedostoa asettaaksesi sen · tai vedä tiedosto kankaalle',\r\n 'library.clickToReplace': 'Napsauta tiedostoa korvataksesi valitun kuvan',\r\n 'library.storageLabel': '{count} tiedostoa · {size}',\r\n 'library.folders': 'Kansiot',\r\n 'library.dropHint': 'Pudota kuvatiedostoja tähän ladataksesi ne — tai käytä Lataa-painiketta.',\r\n 'library.deleteFileHint': 'Poista tiedosto',\r\n 'library.del': 'POISTA',\r\n 'toast.assetDeleted': '{name} poistettu',\r\n 'modal.export': 'Vie',\r\n 'modal.exportTitle': 'Taulukkopohjainen sähköposti-HTML',\r\n 'export.copy': 'Kopioi',\r\n 'export.copied': 'Kopioitu',\r\n 'action.download': 'Lataa',\r\n 'export.meta': '{kb} kt · taulukot + inline-tyylit · Outlook-turvalliset leveydet',\r\n 'modal.rawHtmlTitle': 'Raaka HTML, suora esikatselu',\r\n 'code.statusEdited': 'Koodinäkymä — muokattu — esikatselu suorana, ei vielä käytössä',\r\n 'code.statusSynced': 'Koodinäkymä — synkronoitu kankaan kanssa',\r\n 'action.reload': 'Lataa uudelleen',\r\n 'action.reloadHint': 'Lataa lähde uudelleen kankaalta',\r\n 'action.applyToCanvas': 'Käytä kankaalla',\r\n 'action.applyToCanvasHint': 'Jäsennä lähde takaisin muokattaviksi riveiksi',\r\n 'action.closeWithoutApplyingHint': 'Sulje käyttämättä',\r\n 'code.source': 'Lähde',\r\n 'code.livePreview': 'Suora esikatselu',\r\n 'code.liveHtmlPreviewTitle': 'Suora HTML-esikatselu',\r\n 'code.applyNote':\r\n 'Käytä jäsentää jokaisen ylimmän tason taulukkorivin kangasriviksi, jonka voit yhä valita, järjestää uudelleen ja poistaa — käsin kirjoitettu koodi säilyy prosessin läpi muuttumattomana.',\r\n 'code.meta': '{kb} kt · {lines} riviä',\r\n 'toast.sourceReloaded': 'Lähde ladattu uudelleen kankaalta',\r\n 'toast.sourceAppliedOne': 'Lähde käytössä — 1 rivi kankaalla',\r\n 'toast.sourceAppliedMany': 'Lähde käytössä — {rows} riviä kankaalla',\r\n 'toast.parseError': 'Tätä HTML:ää ei voitu jäsentää',\r\n 'modal.copyAssist': 'Tekstiavustaja',\r\n 'modal.draftCopyTitle': 'Kirjoita teksti tälle kampanjalle',\r\n 'ai.goal': 'Tavoite',\r\n 'ai.tone': 'Sävy',\r\n 'ai.briefLabel': 'Mistä tämä sähköposti kertoo?',\r\n 'ai.briefPlaceholder': 'esim. Syyskokoelma, 15 % tilaajille, ilmainen toimitus yli 150 €',\r\n 'ai.generate': 'Luo teksti',\r\n 'ai.writing': 'Kirjoitetaan…',\r\n 'ai.kindHeadline': 'Otsikko',\r\n 'ai.kindBody': 'Leipäteksti',\r\n 'ai.kindButton': 'Painikkeen teksti',\r\n 'ai.actionInsertHeading': 'Lisää otsikkona',\r\n 'ai.actionInsertText': 'Lisää tekstilohkona',\r\n 'ai.actionInsertButton': 'Lisää painikkeena',\r\n 'toast.headingAdded': 'Otsikko lisätty',\r\n 'toast.textBlockAdded': 'Tekstilohko lisätty',\r\n 'toast.buttonAdded': 'Painike lisätty',\r\n 'preview.kickerMobile': 'Esikatselu — mobiili 375px',\r\n 'preview.kickerDark': 'Esikatselu — tumma saapuneet',\r\n 'preview.kickerDesktop': 'Esikatselu — työpöytä {width}px',\r\n 'action.close': 'Sulje',\r\n 'toast.duplicated': 'Monistettu',\r\n 'toast.fileUploadedOne': '1 tiedosto ladattu',\r\n 'toast.fileUploadedMany': '{count} tiedostoa ladattu',\r\n 'toast.imageReplaced': 'Kuva korvattu',\r\n 'toast.imageAdded': 'Kuva lisätty kankaalle',\r\n 'toast.htmlCopied': 'HTML kopioitu leikepöydälle',\r\n 'toast.templateLoaded': '{name} ladattu',\r\n 'toast.snippetDefaultLabel': 'Katkelma',\r\n 'toast.snippetInserted': '{name} lisätty',\r\n 'toast.snippetCopied': '{name} kopioitu — valitse tekstilohko lisätäksesi sen',\r\n};\r\n\r\n\nObject.assign(exports, { FI });\n\n};\n__modules[\"core/i18n/fr.js\"] = function(module, exports, __require) {\n/** French (Français) — `fr`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst FR = {\r\n 'action.undoHint': 'Annuler — ⌘Z',\r\n 'action.redoHint': 'Rétablir — ⌘⇧Z',\r\n 'action.chromeToDark': 'Sombre',\r\n 'action.chromeToLight': 'Clair',\r\n 'action.chromeHint': 'Thème de l’éditeur clair / sombre',\r\n 'action.aiCopy': 'Texte',\r\n 'action.aiCopyHint': 'Rédiger un texte avec l’IA',\r\n 'action.code': 'Code',\r\n 'action.codeHint': 'Modifier le HTML brut avec aperçu en direct',\r\n 'action.preview': 'Aperçu',\r\n 'action.export': 'Exporter',\r\n 'device.desktop': 'Bureau',\r\n 'device.desktopHint': 'Largeur bureau',\r\n 'device.mobile': 'Mobile',\r\n 'device.mobileHint': 'Largeur mobile',\r\n 'device.dark': 'Sombre',\r\n 'device.darkHint': 'Boîte de réception sombre',\r\n 'status.autosaveOn': 'sauvegarde automatique activée',\r\n 'status.saved': 'enregistré {time}',\r\n 'status.saveFailed': 'non enregistré — stockage plein',\r\n 'canvas.meta': '{rows} lignes · {blocks} blocs · {width}px',\r\n 'tab.design': 'Style',\r\n 'tab.designHint': 'Styliser la sélection',\r\n 'tab.blocks': 'Blocs',\r\n 'tab.blocksHint': 'Blocs de contenu et variables',\r\n 'tab.rows': 'Sect.',\r\n 'tab.rowsHint': 'Mises en page de section et modèle de canevas',\r\n 'tab.files': 'Fichiers',\r\n 'tab.filesHint': 'Bibliothèque de ressources',\r\n 'tab.layers': 'Structure',\r\n 'tab.layersHint': 'Structure du document',\r\n 'tab.theme': 'Thème',\r\n 'tab.themeHint': 'Styles globaux',\r\n 'tab.data': 'Var.',\r\n 'tab.dataHint': 'Variables fournies par votre code',\r\n 'inspector.blockProperties': 'Propriétés du bloc',\r\n 'inspector.sectionProperties': 'Propriétés de la section',\r\n 'inspector.title': 'Inspecteur',\r\n 'inspector.sectionLabel': 'Section',\r\n 'inspector.nothingSelected': 'Rien n’est sélectionné',\r\n 'action.duplicateHint': 'Dupliquer — ⌘D',\r\n 'action.deleteHint': 'Supprimer — ⌫',\r\n 'inspector.emptyBody':\r\n 'Sélectionnez une ligne ou un bloc sur le canevas pour le styliser ici. Glissez des blocs depuis l’onglet <strong style=\"color: var(--ed-text); font-weight: 600;\">Blocs</strong> ; double-cliquez sur un texte pour le modifier directement.',\r\n 'inspector.shortcuts': 'Raccourcis',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — annuler, rétablir',\r\n 'shortcut.duplicate': '⌘D — dupliquer la sélection',\r\n 'shortcut.delete': '⌫ — supprimer la sélection',\r\n 'shortcut.export': '⌘E — exporter le HTML',\r\n 'shortcut.escape': 'ESC — désélectionner, fermer',\r\n 'blocks.dragHint': 'Glisser sur le canevas',\r\n 'blocks.count': '{count} blocs',\r\n 'rows.sectionLayouts': 'Mises en page de section',\r\n 'rows.customMarkup': 'Balisage personnalisé',\r\n 'rows.htmlRowHint': 'Glissez pour insérer, ou cliquez pour ajouter — une ligne pleine largeur que vous remplissez de HTML brut',\r\n 'rows.rawHtmlSection': 'Section HTML brut',\r\n 'rows.rawHtmlDesc': 'Section pleine largeur, votre propre balisage, toujours déplaçable',\r\n 'rows.canvasModel': 'Modèle de canevas',\r\n 'rows.modeRowBased': 'Basé sur les lignes',\r\n 'rows.modeFreeStack': 'Pile libre',\r\n 'rows.hintRows':\r\n 'Basé sur les sections : déposez d’abord une mise en page, puis des blocs dans ses colonnes — chaque section a son propre arrière-plan, sa bordure, ses réglages flex ou grille.',\r\n 'rows.hintStack': 'Pile libre : sans mise en page — chaque bloc déposé devient sa propre section pleine largeur, empilée dans l’ordre.',\r\n 'files.libraryCount': 'Bibliothèque — {count} fichiers',\r\n 'files.openManager': 'Ouvrir le gestionnaire de fichiers',\r\n 'files.dragToCanvas': 'Glissez un fichier directement sur le canevas pour le placer comme bloc image.',\r\n 'layers.structure': 'Structure',\r\n 'layers.sectionSingle': 'Section',\r\n 'layers.sectionMulti': 'Section · {count} col.',\r\n 'layers.blockCount': '{count} blocs',\r\n 'theme.globalStyles': 'Styles globaux',\r\n 'vars.title': 'Variables',\r\n 'vars.fromCode': '{count} provenant de votre code',\r\n 'vars.declaredNote': 'Déclarées par votre application — le canevas affiche toujours le jeton, jamais une valeur.',\r\n 'vars.filterPlaceholder': 'Filtrer les variables…',\r\n 'vars.insertHint': 'Cliquer pour insérer dans le texte, le titre ou le bouton sélectionné',\r\n 'vars.insert': 'insérer',\r\n 'vars.noMatch': 'Aucune variable ne correspond à ce filtre.',\r\n 'vars.noneDeclared': 'Votre application n’a encore déclaré aucune variable.',\r\n 'vars.rteHint': 'En modifiant du texte, vous pouvez aussi choisir une variable directement dans le menu de la barre d’outils.',\r\n 'modal.fileManager': 'Gestionnaire de fichiers',\r\n 'modal.assetsTitle': 'Ressources',\r\n 'modal.replaceImage': 'Remplacer l’image',\r\n 'library.searchPlaceholder': 'Rechercher des fichiers…',\r\n 'action.upload': 'Téléverser',\r\n 'library.clickToPlace': 'Cliquez sur un fichier pour le placer · ou glissez un fichier sur le canevas',\r\n 'library.clickToReplace': 'Cliquez sur un fichier pour remplacer l’image sélectionnée',\r\n 'library.storageLabel': '{count} fichiers · {size}',\r\n 'library.folders': 'Dossiers',\r\n 'library.dropHint': 'Déposez des fichiers image ici pour les téléverser — ou utilisez le bouton Téléverser.',\r\n 'library.deleteFileHint': 'Supprimer le fichier',\r\n 'library.del': 'SUPPR',\r\n 'toast.assetDeleted': '{name} supprimé',\r\n 'modal.export': 'Exporter',\r\n 'modal.exportTitle': 'HTML d’e-mail basé sur des tableaux',\r\n 'export.copy': 'Copier',\r\n 'export.copied': 'Copié',\r\n 'action.download': 'Télécharger',\r\n 'export.meta': '{kb} Ko · tableaux + styles en ligne · largeurs sûres pour Outlook',\r\n 'modal.rawHtmlTitle': 'HTML brut, aperçu en direct',\r\n 'code.statusEdited': 'Vue du code — modifié — aperçu en direct, pas encore appliqué',\r\n 'code.statusSynced': 'Vue du code — synchronisé avec le canevas',\r\n 'action.reload': 'Recharger',\r\n 'action.reloadHint': 'Recharger la source depuis le canevas',\r\n 'action.applyToCanvas': 'Appliquer au canevas',\r\n 'action.applyToCanvasHint': 'Analyser la source pour la reconvertir en lignes modifiables',\r\n 'action.closeWithoutApplyingHint': 'Fermer sans appliquer',\r\n 'code.source': 'Source',\r\n 'code.livePreview': 'Aperçu en direct',\r\n 'code.liveHtmlPreviewTitle': 'Aperçu HTML en direct',\r\n 'code.applyNote':\r\n 'Appliquer analyse chaque ligne de tableau de premier niveau en une ligne de canevas que vous pouvez toujours sélectionner, réorganiser et supprimer — le balisage écrit à la main survit à l’aller-retour.',\r\n 'code.meta': '{kb} Ko · {lines} lignes',\r\n 'toast.sourceReloaded': 'Source rechargée depuis le canevas',\r\n 'toast.sourceAppliedOne': 'Source appliquée — 1 ligne sur le canevas',\r\n 'toast.sourceAppliedMany': 'Source appliquée — {rows} lignes sur le canevas',\r\n 'toast.parseError': 'Impossible d’analyser ce HTML',\r\n 'modal.copyAssist': 'Assistant de rédaction',\r\n 'modal.draftCopyTitle': 'Rédiger le texte de cette campagne',\r\n 'ai.goal': 'Objectif',\r\n 'ai.tone': 'Ton',\r\n 'ai.briefLabel': 'De quoi parle cet e-mail ?',\r\n 'ai.briefPlaceholder': 'ex. Collection automne, 15 % pour les abonnés, livraison gratuite dès 150 €',\r\n 'ai.generate': 'Générer le texte',\r\n 'ai.writing': 'Rédaction en cours…',\r\n 'ai.kindHeadline': 'Titre',\r\n 'ai.kindBody': 'Corps du texte',\r\n 'ai.kindButton': 'Texte du bouton',\r\n 'ai.actionInsertHeading': 'Insérer comme titre',\r\n 'ai.actionInsertText': 'Insérer comme bloc de texte',\r\n 'ai.actionInsertButton': 'Insérer comme bouton',\r\n 'toast.headingAdded': 'Titre ajouté',\r\n 'toast.textBlockAdded': 'Bloc de texte ajouté',\r\n 'toast.buttonAdded': 'Bouton ajouté',\r\n 'preview.kickerMobile': 'Aperçu — mobile 375px',\r\n 'preview.kickerDark': 'Aperçu — boîte de réception sombre',\r\n 'preview.kickerDesktop': 'Aperçu — bureau {width}px',\r\n 'action.close': 'Fermer',\r\n 'toast.duplicated': 'Dupliqué',\r\n 'toast.fileUploadedOne': '1 fichier téléversé',\r\n 'toast.fileUploadedMany': '{count} fichiers téléversés',\r\n 'toast.imageReplaced': 'Image remplacée',\r\n 'toast.imageAdded': 'Image ajoutée au canevas',\r\n 'toast.htmlCopied': 'HTML copié dans le presse-papiers',\r\n 'toast.templateLoaded': '{name} chargé',\r\n 'toast.snippetDefaultLabel': 'Extrait',\r\n 'toast.snippetInserted': '{name} inséré',\r\n 'toast.snippetCopied': '{name} copié — sélectionnez un bloc de texte pour l’insérer',\r\n};\r\n\r\n\nObject.assign(exports, { FR });\n\n};\n__modules[\"core/i18n/hr.js\"] = function(module, exports, __require) {\n/** Croatian (Hrvatski) — `hr`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst HR = {\r\n 'action.undoHint': 'Poništi — ⌘Z',\r\n 'action.redoHint': 'Ponovi — ⌘⇧Z',\r\n 'action.chromeToDark': 'Tamno',\r\n 'action.chromeToLight': 'Svijetlo',\r\n 'action.chromeHint': 'Tema uređivača svijetla / tamna',\r\n 'action.aiCopy': 'Tekst',\r\n 'action.aiCopyHint': 'Napiši tekst uz pomoć AI',\r\n 'action.code': 'Kôd',\r\n 'action.codeHint': 'Uredi izvorni HTML uz prikaz uživo',\r\n 'action.preview': 'Pregled',\r\n 'action.export': 'Izvezi',\r\n 'device.desktop': 'Računalo',\r\n 'device.desktopHint': 'Širina za računalo',\r\n 'device.mobile': 'Mobitel',\r\n 'device.mobileHint': 'Širina za mobitel',\r\n 'device.dark': 'Tamno',\r\n 'device.darkHint': 'Tamni način sandučića',\r\n 'status.autosaveOn': 'automatsko spremanje uključeno',\r\n 'status.saved': 'spremljeno {time}',\r\n 'status.saveFailed': 'nije spremljeno — spremište je puno',\r\n 'canvas.meta': '{rows} redaka · {blocks} blokova · {width}px',\r\n 'tab.design': 'Stil',\r\n 'tab.designHint': 'Oblikuj odabir',\r\n 'tab.blocks': 'Blokovi',\r\n 'tab.blocksHint': 'Blokovi sadržaja i varijable',\r\n 'tab.rows': 'Odjeljci',\r\n 'tab.rowsHint': 'Rasporedi odjeljaka i model platna',\r\n 'tab.files': 'Datoteke',\r\n 'tab.filesHint': 'Knjižnica resursa',\r\n 'tab.layers': 'Struktura',\r\n 'tab.layersHint': 'Struktura dokumenta',\r\n 'tab.theme': 'Tema',\r\n 'tab.themeHint': 'Globalni stilovi',\r\n 'tab.data': 'Var.',\r\n 'tab.dataHint': 'Varijable koje pruža vaš kod',\r\n 'inspector.blockProperties': 'Svojstva bloka',\r\n 'inspector.sectionProperties': 'Svojstva odjeljka',\r\n 'inspector.title': 'Inspektor',\r\n 'inspector.sectionLabel': 'Odjeljak',\r\n 'inspector.nothingSelected': 'Ništa nije odabrano',\r\n 'action.duplicateHint': 'Dupliciraj — ⌘D',\r\n 'action.deleteHint': 'Izbriši — ⌫',\r\n 'inspector.emptyBody':\r\n 'Odaberite redak ili blok na platnu za oblikovanje ovdje. Povucite blokove s kartice <strong style=\"color: var(--ed-text); font-weight: 600;\">Blokovi</strong>; dvaput kliknite tekst za izravno uređivanje.',\r\n 'inspector.shortcuts': 'Prečaci',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — poništi, ponovi',\r\n 'shortcut.duplicate': '⌘D — dupliciraj odabir',\r\n 'shortcut.delete': '⌫ — izbriši odabir',\r\n 'shortcut.export': '⌘E — izvezi HTML',\r\n 'shortcut.escape': 'ESC — poništi odabir, zatvori',\r\n 'blocks.dragHint': 'Povucite na platno',\r\n 'blocks.count': '{count} blokova',\r\n 'rows.sectionLayouts': 'Rasporedi odjeljaka',\r\n 'rows.customMarkup': 'Prilagođeni kôd',\r\n 'rows.htmlRowHint': 'Povucite za umetanje ili kliknite za dodavanje — redak preko cijele širine koji ispunjavate izvornim HTML-om',\r\n 'rows.rawHtmlSection': 'Odjeljak s izvornim HTML-om',\r\n 'rows.rawHtmlDesc': 'Odjeljak preko cijele širine, vaš vlastiti kôd, i dalje se može povlačiti',\r\n 'rows.canvasModel': 'Model platna',\r\n 'rows.modeRowBased': 'Temeljeno na recima',\r\n 'rows.modeFreeStack': 'Slobodni stog',\r\n 'rows.hintRows':\r\n 'Temeljeno na odjeljcima: prvo ispustite raspored, zatim blokove u njegove stupce — svaki odjeljak ima vlastitu pozadinu, obrub, flex ili grid postavke.',\r\n 'rows.hintStack': 'Slobodni stog: bez rasporeda — svaki ispušteni blok postaje vlastiti odjeljak preko cijele širine, poslagan redom.',\r\n 'files.libraryCount': 'Knjižnica — {count} datoteka',\r\n 'files.openManager': 'Otvori upravitelja datoteka',\r\n 'files.dragToCanvas': 'Povucite bilo koju datoteku izravno na platno da je postavite kao slikovni blok.',\r\n 'layers.structure': 'Struktura',\r\n 'layers.sectionSingle': 'Odjeljak',\r\n 'layers.sectionMulti': 'Odjeljak · {count} stupaca',\r\n 'layers.blockCount': '{count} bl.',\r\n 'theme.globalStyles': 'Globalni stilovi',\r\n 'vars.title': 'Varijable',\r\n 'vars.fromCode': '{count} iz vašeg koda',\r\n 'vars.declaredNote': 'Deklarirane od strane vaše aplikacije — platno uvijek prikazuje token, nikad vrijednost.',\r\n 'vars.filterPlaceholder': 'Filtriraj varijable…',\r\n 'vars.insertHint': 'Kliknite za umetanje u odabrani tekst, naslov ili gumb',\r\n 'vars.insert': 'umetni',\r\n 'vars.noMatch': 'Nijedna varijabla ne odgovara ovom filtru.',\r\n 'vars.noneDeclared': 'Vaša aplikacija još nije deklarirala nijednu varijablu.',\r\n 'vars.rteHint': 'Tijekom uređivanja teksta varijablu možete odabrati i izravno iz padajućeg izbornika ugrađene alatne trake.',\r\n 'modal.fileManager': 'Upravitelj datoteka',\r\n 'modal.assetsTitle': 'Resursi',\r\n 'modal.replaceImage': 'Zamijeni sliku',\r\n 'library.searchPlaceholder': 'Pretraži datoteke…',\r\n 'action.upload': 'Prenesi',\r\n 'library.clickToPlace': 'Kliknite datoteku za postavljanje · ili povucite datoteku na platno',\r\n 'library.clickToReplace': 'Kliknite datoteku za zamjenu odabrane slike',\r\n 'library.storageLabel': '{count} datoteka · {size}',\r\n 'library.folders': 'Mape',\r\n 'library.dropHint': 'Ispustite slikovne datoteke ovdje za prijenos — ili upotrijebite gumb Prenesi.',\r\n 'library.deleteFileHint': 'Izbriši datoteku',\r\n 'library.del': 'IZBR',\r\n 'toast.assetDeleted': '{name} izbrisano',\r\n 'modal.export': 'Izvezi',\r\n 'modal.exportTitle': 'HTML e-pošte temeljen na tablicama',\r\n 'export.copy': 'Kopiraj',\r\n 'export.copied': 'Kopirano',\r\n 'action.download': 'Preuzmi',\r\n 'export.meta': '{kb} KB · tablice + ugrađeni stilovi · širine sigurne za Outlook',\r\n 'modal.rawHtmlTitle': 'Izvorni HTML, prikaz uživo',\r\n 'code.statusEdited': 'Prikaz koda — uređeno — prikaz uživo, još nije primijenjeno',\r\n 'code.statusSynced': 'Prikaz koda — usklađeno s platnom',\r\n 'action.reload': 'Ponovno učitaj',\r\n 'action.reloadHint': 'Ponovno učitaj izvor s platna',\r\n 'action.applyToCanvas': 'Primijeni na platno',\r\n 'action.applyToCanvasHint': 'Ponovno raščlani izvor u uredive retke',\r\n 'action.closeWithoutApplyingHint': 'Zatvori bez primjene',\r\n 'code.source': 'Izvor',\r\n 'code.livePreview': 'Prikaz uživo',\r\n 'code.liveHtmlPreviewTitle': 'Prikaz HTML-a uživo',\r\n 'code.applyNote':\r\n 'Primjena raščlanjuje svaki redak tablice najviše razine u redak platna koji i dalje možete odabrati, preurediti i izbrisati — ručno napisani kôd preživi postupak nepromijenjen.',\r\n 'code.meta': '{kb} KB · {lines} redaka',\r\n 'toast.sourceReloaded': 'Izvor ponovno učitan s platna',\r\n 'toast.sourceAppliedOne': 'Izvor primijenjen — 1 redak na platnu',\r\n 'toast.sourceAppliedMany': 'Izvor primijenjen — {rows} redaka na platnu',\r\n 'toast.parseError': 'Taj HTML nije bilo moguće raščlaniti',\r\n 'modal.copyAssist': 'Pomoćnik za tekst',\r\n 'modal.draftCopyTitle': 'Napiši tekst za ovu kampanju',\r\n 'ai.goal': 'Cilj',\r\n 'ai.tone': 'Ton',\r\n 'ai.briefLabel': 'O čemu je ova e-pošta?',\r\n 'ai.briefPlaceholder': 'npr. jesenska kolekcija, 15% za pretplatnike, besplatna dostava iznad 150 €',\r\n 'ai.generate': 'Generiraj tekst',\r\n 'ai.writing': 'Pisanje…',\r\n 'ai.kindHeadline': 'Naslov',\r\n 'ai.kindBody': 'Glavni tekst',\r\n 'ai.kindButton': 'Tekst gumba',\r\n 'ai.actionInsertHeading': 'Umetni kao naslov',\r\n 'ai.actionInsertText': 'Umetni kao tekstualni blok',\r\n 'ai.actionInsertButton': 'Umetni kao gumb',\r\n 'toast.headingAdded': 'Naslov dodan',\r\n 'toast.textBlockAdded': 'Tekstualni blok dodan',\r\n 'toast.buttonAdded': 'Gumb dodan',\r\n 'preview.kickerMobile': 'Pregled — mobitel 375px',\r\n 'preview.kickerDark': 'Pregled — tamni sandučić',\r\n 'preview.kickerDesktop': 'Pregled — računalo {width}px',\r\n 'action.close': 'Zatvori',\r\n 'toast.duplicated': 'Duplicirano',\r\n 'toast.fileUploadedOne': 'Prenesena 1 datoteka',\r\n 'toast.fileUploadedMany': 'Preneseno {count} datoteka',\r\n 'toast.imageReplaced': 'Slika zamijenjena',\r\n 'toast.imageAdded': 'Slika dodana na platno',\r\n 'toast.htmlCopied': 'HTML kopiran u međuspremnik',\r\n 'toast.templateLoaded': '{name} učitano',\r\n 'toast.snippetDefaultLabel': 'Isječak',\r\n 'toast.snippetInserted': '{name} umetnuto',\r\n 'toast.snippetCopied': '{name} kopirano — odaberite tekstualni blok za umetanje',\r\n};\r\n\r\n\nObject.assign(exports, { HR });\n\n};\n__modules[\"core/i18n/hu.js\"] = function(module, exports, __require) {\n/** Hungarian (Magyar) — `hu`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst HU = {\r\n 'action.undoHint': 'Visszavonás — ⌘Z',\r\n 'action.redoHint': 'Ismétlés — ⌘⇧Z',\r\n 'action.chromeToDark': 'Sötét',\r\n 'action.chromeToLight': 'Világos',\r\n 'action.chromeHint': 'Szerkesztő téma világos / sötét',\r\n 'action.aiCopy': 'Szöveg',\r\n 'action.aiCopyHint': 'Szöveg írása MI-vel',\r\n 'action.code': 'Kód',\r\n 'action.codeHint': 'Nyers HTML szerkesztése élő előnézettel',\r\n 'action.preview': 'Előnézet',\r\n 'action.export': 'Exportálás',\r\n 'device.desktop': 'Asztali',\r\n 'device.desktopHint': 'Asztali szélesség',\r\n 'device.mobile': 'Mobil',\r\n 'device.mobileHint': 'Mobil szélesség',\r\n 'device.dark': 'Sötét',\r\n 'device.darkHint': 'Sötét beérkezőlevelek mód',\r\n 'status.autosaveOn': 'automatikus mentés bekapcsolva',\r\n 'status.saved': 'mentve {time}',\r\n 'status.saveFailed': 'nem mentve — a tárhely megtelt',\r\n 'canvas.meta': '{rows} sor · {blocks} blokk · {width}px',\r\n 'tab.design': 'Stílus',\r\n 'tab.designHint': 'Kijelölés stílusa',\r\n 'tab.blocks': 'Blokkok',\r\n 'tab.blocksHint': 'Tartalomblokkok és változók',\r\n 'tab.rows': 'Szakaszok',\r\n 'tab.rowsHint': 'Szakaszelrendezések és a rajzvászon modellje',\r\n 'tab.files': 'Fájlok',\r\n 'tab.filesHint': 'Erőforrás-könyvtár',\r\n 'tab.layers': 'Struktúra',\r\n 'tab.layersHint': 'A dokumentum szerkezete',\r\n 'tab.theme': 'Téma',\r\n 'tab.themeHint': 'Globális stílusok',\r\n 'tab.data': 'Vált.',\r\n 'tab.dataHint': 'A kódod által biztosított változók',\r\n 'inspector.blockProperties': 'A blokk tulajdonságai',\r\n 'inspector.sectionProperties': 'A szakasz tulajdonságai',\r\n 'inspector.title': 'Vizsgáló',\r\n 'inspector.sectionLabel': 'Szakasz',\r\n 'inspector.nothingSelected': 'Nincs kijelölés',\r\n 'action.duplicateHint': 'Kettőzés — ⌘D',\r\n 'action.deleteHint': 'Törlés — ⌫',\r\n 'inspector.emptyBody':\r\n 'Válassz ki egy sort vagy blokkot a rajzvásznon, hogy itt formázhasd. Húzz blokkokat a <strong style=\"color: var(--ed-text); font-weight: 600;\">Blokkok</strong> fülről; kattints duplán bármely szövegre a helyben szerkesztéshez.',\r\n 'inspector.shortcuts': 'Billentyűparancsok',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — visszavonás, ismétlés',\r\n 'shortcut.duplicate': '⌘D — kijelölés kettőzése',\r\n 'shortcut.delete': '⌫ — kijelölés törlése',\r\n 'shortcut.export': '⌘E — HTML exportálása',\r\n 'shortcut.escape': 'ESC — kijelölés megszüntetése, bezárás',\r\n 'blocks.dragHint': 'Húzd a rajzvászonra',\r\n 'blocks.count': '{count} blokk',\r\n 'rows.sectionLayouts': 'Szakaszelrendezések',\r\n 'rows.customMarkup': 'Egyéni kód',\r\n 'rows.htmlRowHint': 'Húzd be, vagy kattints a hozzáadáshoz — egy teljes szélességű sor, amelyet nyers HTML-lel töltesz meg',\r\n 'rows.rawHtmlSection': 'Nyers HTML szakasz',\r\n 'rows.rawHtmlDesc': 'Teljes szélességű szakasz, saját kódod, továbbra is húzható',\r\n 'rows.canvasModel': 'Rajzvászon modellje',\r\n 'rows.modeRowBased': 'Soralapú',\r\n 'rows.modeFreeStack': 'Szabad halmozás',\r\n 'rows.hintRows':\r\n 'Szakaszalapú: először helyezz el egy elrendezést, majd blokkokat az oszlopaiba — minden szakasznak saját háttere, kerete, flex vagy rács beállításai vannak.',\r\n 'rows.hintStack': 'Szabad halmozás: elrendezések nélkül — minden elhelyezett blokk saját teljes szélességű szakasszá válik, sorrendben egymásra halmozva.',\r\n 'files.libraryCount': 'Könyvtár — {count} fájl',\r\n 'files.openManager': 'Fájlkezelő megnyitása',\r\n 'files.dragToCanvas': 'Húzz bármely fájlt közvetlenül a rajzvászonra, hogy képblokként helyezd el.',\r\n 'layers.structure': 'Struktúra',\r\n 'layers.sectionSingle': 'Szakasz',\r\n 'layers.sectionMulti': 'Szakasz · {count} oszlop',\r\n 'layers.blockCount': '{count} blokk',\r\n 'theme.globalStyles': 'Globális stílusok',\r\n 'vars.title': 'Változók',\r\n 'vars.fromCode': '{count} a kódodból',\r\n 'vars.declaredNote': 'Az alkalmazásod deklarálta — a rajzvászon mindig a tokent mutatja, sosem az értéket.',\r\n 'vars.filterPlaceholder': 'Változók szűrése…',\r\n 'vars.insertHint': 'Kattints a kijelölt szövegbe, címsorba vagy gombba való beszúráshoz',\r\n 'vars.insert': 'beszúrás',\r\n 'vars.noMatch': 'Egyetlen változó sem felel meg ennek a szűrőnek.',\r\n 'vars.noneDeclared': 'Az alkalmazásod még nem deklarált változókat.',\r\n 'vars.rteHint': 'Szöveg szerkesztése közben egy változót közvetlenül a beágyazott eszköztár legördülő menüjéből is kiválaszthatsz.',\r\n 'modal.fileManager': 'Fájlkezelő',\r\n 'modal.assetsTitle': 'Erőforrások',\r\n 'modal.replaceImage': 'Kép cseréje',\r\n 'library.searchPlaceholder': 'Fájlok keresése…',\r\n 'action.upload': 'Feltöltés',\r\n 'library.clickToPlace': 'Kattints egy fájlra az elhelyezéshez · vagy húzz egy fájlt a rajzvászonra',\r\n 'library.clickToReplace': 'Kattints egy fájlra a kijelölt kép cseréjéhez',\r\n 'library.storageLabel': '{count} fájl · {size}',\r\n 'library.folders': 'Mappák',\r\n 'library.dropHint': 'Húzz ide képfájlokat a feltöltéshez — vagy használd a Feltöltés gombot.',\r\n 'library.deleteFileHint': 'Fájl törlése',\r\n 'library.del': 'TÖRL',\r\n 'toast.assetDeleted': '{name} törölve',\r\n 'modal.export': 'Exportálás',\r\n 'modal.exportTitle': 'Táblázat alapú e-mail HTML',\r\n 'export.copy': 'Másolás',\r\n 'export.copied': 'Másolva',\r\n 'action.download': 'Letöltés',\r\n 'export.meta': '{kb} KB · táblázatok + soron belüli stílusok · Outlook-biztos szélességek',\r\n 'modal.rawHtmlTitle': 'Nyers HTML, élő előnézet',\r\n 'code.statusEdited': 'Kódnézet — szerkesztve — élő előnézet, még nincs alkalmazva',\r\n 'code.statusSynced': 'Kódnézet — szinkronban a rajzvászonnal',\r\n 'action.reload': 'Újratöltés',\r\n 'action.reloadHint': 'Forrás újratöltése a rajzvászonról',\r\n 'action.applyToCanvas': 'Alkalmazás a rajzvászonra',\r\n 'action.applyToCanvasHint': 'A forrás visszaalakítása szerkeszthető sorokká',\r\n 'action.closeWithoutApplyingHint': 'Bezárás alkalmazás nélkül',\r\n 'code.source': 'Forrás',\r\n 'code.livePreview': 'Élő előnézet',\r\n 'code.liveHtmlPreviewTitle': 'Élő HTML előnézet',\r\n 'code.applyNote':\r\n 'Az alkalmazás minden legfelső szintű táblázatsort egy rajzvászon-sorrá alakít, amelyet továbbra is kijelölhetsz, átrendezhetsz és törölhetsz — a kézzel írt kód sértetlenül éli túl a folyamatot.',\r\n 'code.meta': '{kb} KB · {lines} sor',\r\n 'toast.sourceReloaded': 'A forrás újratöltve a rajzvászonról',\r\n 'toast.sourceAppliedOne': 'Forrás alkalmazva — 1 sor a rajzvásznon',\r\n 'toast.sourceAppliedMany': 'Forrás alkalmazva — {rows} sor a rajzvásznon',\r\n 'toast.parseError': 'Nem sikerült elemezni ezt a HTML-t',\r\n 'modal.copyAssist': 'Szövegíró segéd',\r\n 'modal.draftCopyTitle': 'Szöveg írása ehhez a kampányhoz',\r\n 'ai.goal': 'Cél',\r\n 'ai.tone': 'Hangnem',\r\n 'ai.briefLabel': 'Miről szól ez az e-mail?',\r\n 'ai.briefPlaceholder': 'pl. Őszi kollekció, 15% kedvezmény feliratkozóknak, ingyenes szállítás 150 000 Ft felett',\r\n 'ai.generate': 'Szöveg generálása',\r\n 'ai.writing': 'Írás…',\r\n 'ai.kindHeadline': 'Címsor',\r\n 'ai.kindBody': 'Törzsszöveg',\r\n 'ai.kindButton': 'Gomb szövege',\r\n 'ai.actionInsertHeading': 'Beszúrás címsorként',\r\n 'ai.actionInsertText': 'Beszúrás szövegblokként',\r\n 'ai.actionInsertButton': 'Beszúrás gombként',\r\n 'toast.headingAdded': 'Címsor hozzáadva',\r\n 'toast.textBlockAdded': 'Szövegblokk hozzáadva',\r\n 'toast.buttonAdded': 'Gomb hozzáadva',\r\n 'preview.kickerMobile': 'Előnézet — mobil 375px',\r\n 'preview.kickerDark': 'Előnézet — sötét beérkezőlevelek',\r\n 'preview.kickerDesktop': 'Előnézet — asztali {width}px',\r\n 'action.close': 'Bezárás',\r\n 'toast.duplicated': 'Kettőzve',\r\n 'toast.fileUploadedOne': '1 fájl feltöltve',\r\n 'toast.fileUploadedMany': '{count} fájl feltöltve',\r\n 'toast.imageReplaced': 'Kép kicserélve',\r\n 'toast.imageAdded': 'Kép hozzáadva a rajzvászonhoz',\r\n 'toast.htmlCopied': 'HTML a vágólapra másolva',\r\n 'toast.templateLoaded': '{name} betöltve',\r\n 'toast.snippetDefaultLabel': 'Részlet',\r\n 'toast.snippetInserted': '{name} beszúrva',\r\n 'toast.snippetCopied': '{name} másolva — jelölj ki egy szövegblokkot a beszúráshoz',\r\n};\r\n\r\n\nObject.assign(exports, { HU });\n\n};\n__modules[\"core/i18n/index.js\"] = function(module, exports, __require) {\nconst {EN: ENBase} = __require(\"core/i18n/en.js\");\r\n\r\n/**\r\n * Builds a translator. `overrides` is whatever a host passes as `.messages`\r\n * on the element -- a host's own table, an imported locale, or both merged\r\n * via `defineMessages` below.\r\n *\r\n * Three deliberate properties:\r\n * 1. English always resolves. A locale is an overlay, never a replacement,\r\n * so a partial or missing translation shows English rather than a gap.\r\n * 2. Params interpolate `{name}`.\r\n * 3. A truly missing key (not in `overrides`, not in `EN`) renders as the\r\n * key itself, not an empty string -- a visible `toast.deleted` in the UI\r\n * is obviously wrong and names the exact key to add, where blank text\r\n * just looks like a broken build.\r\n */\r\nfunction createTranslator(overrides) {\r\n const table = overrides || {};\r\n return function t(key, params) {\r\n const template = table[key] ?? ENBase[key] ?? key;\r\n if (!params) return template;\r\n return template.replace(/\\{(\\w+)\\}/g, (whole, name) => (name in params ? String(params[name]) : whole));\r\n };\r\n}\r\n\r\n/** Merges a locale over a base, for a host assembling its own table -- the documented way to combine a shipped locale with a few product-specific overrides. */\r\nfunction defineMessages(base, overrides) {\r\n return Object.assign({}, base, overrides);\r\n}\r\n\r\n/** Keys in `base` that `locale` does not translate. What a translator has left to do. */\r\nfunction missingKeys(locale, base) {\r\n const source = base || ENBase;\r\n return Object.keys(source).filter((key) => locale[key] === undefined).sort();\r\n}\r\n\r\n/**\r\n * Every locale that ships, for a host building a language switcher.\r\n * Metadata only -- no message tables -- so listing the locales never pulls\r\n * every translation file into a consumer's bundle; a host deep-imports the\r\n * one it wants, e.g. `mailcraft-editor/src/core/i18n/bn.js`.\r\n */\r\nconst LOCALES = [\r\n { tag: 'en', name: 'English' },\r\n { tag: 'ar', name: 'Arabic', rtl: true },\r\n { tag: 'bn', name: 'Bangla' },\r\n { tag: 'dz', name: 'Dzongkha' },\r\n { tag: 'bg', name: 'Bulgarian' },\r\n { tag: 'ca', name: 'Catalan' },\r\n { tag: 'cs', name: 'Czech' },\r\n { tag: 'da', name: 'Danish' },\r\n { tag: 'de', name: 'German' },\r\n { tag: 'de-CH', name: 'Swiss German' },\r\n { tag: 'el', name: 'Greek' },\r\n { tag: 'es', name: 'Spanish' },\r\n { tag: 'et', name: 'Estonian' },\r\n { tag: 'fi', name: 'Finnish' },\r\n { tag: 'fr', name: 'French' },\r\n { tag: 'hr', name: 'Croatian' },\r\n { tag: 'hu', name: 'Hungarian' },\r\n { tag: 'it', name: 'Italian' },\r\n { tag: 'lt', name: 'Lithuanian' },\r\n { tag: 'lv', name: 'Latvian' },\r\n { tag: 'nb', name: 'Norwegian Bokmål' },\r\n { tag: 'nl', name: 'Dutch' },\r\n { tag: 'pl', name: 'Polish' },\r\n { tag: 'pt', name: 'Portuguese' },\r\n { tag: 'ro', name: 'Romanian' },\r\n { tag: 'ru', name: 'Russian' },\r\n { tag: 'sk', name: 'Slovak' },\r\n { tag: 'sl', name: 'Slovenian' },\r\n { tag: 'sv', name: 'Swedish' },\r\n { tag: 'tr', name: 'Turkish' },\r\n { tag: 'uk', name: 'Ukrainian' },\r\n];\r\n\r\n/** `true` when the tag is written right to left. Metadata only -- `dir` is still what actually flips the layout. */\r\nfunction isRtl(tag) {\r\n const entry = LOCALES.find((l) => l.tag === tag);\r\n return entry ? entry.rtl === true : false;\r\n}\r\n\r\nconst {EN, MESSAGE_KEYS} = __require(\"core/i18n/en.js\");\r\n\nObject.assign(exports, { EN, MESSAGE_KEYS, createTranslator, defineMessages, missingKeys, LOCALES, isRtl });\n\n};\n__modules[\"core/i18n/it.js\"] = function(module, exports, __require) {\n/** Italian (Italiano) — `it`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst IT = {\r\n 'action.undoHint': 'Annulla — ⌘Z',\r\n 'action.redoHint': 'Ripeti — ⌘⇧Z',\r\n 'action.chromeToDark': 'Scuro',\r\n 'action.chromeToLight': 'Chiaro',\r\n 'action.chromeHint': 'Tema dell’editor chiaro / scuro',\r\n 'action.aiCopy': 'Testo',\r\n 'action.aiCopyHint': 'Scrivi il testo con l’IA',\r\n 'action.code': 'Codice',\r\n 'action.codeHint': 'Modifica l’HTML grezzo con anteprima dal vivo',\r\n 'action.preview': 'Anteprima',\r\n 'action.export': 'Esporta',\r\n 'device.desktop': 'Desktop',\r\n 'device.desktopHint': 'Larghezza desktop',\r\n 'device.mobile': 'Mobile',\r\n 'device.mobileHint': 'Larghezza mobile',\r\n 'device.dark': 'Scuro',\r\n 'device.darkHint': 'Posta in arrivo scura',\r\n 'status.autosaveOn': 'salvataggio automatico attivo',\r\n 'status.saved': 'salvato {time}',\r\n 'status.saveFailed': 'non salvato — spazio esaurito',\r\n 'canvas.meta': '{rows} righe · {blocks} blocchi · {width}px',\r\n 'tab.design': 'Stile',\r\n 'tab.designHint': 'Applica stile alla selezione',\r\n 'tab.blocks': 'Blocchi',\r\n 'tab.blocksHint': 'Blocchi di contenuto e variabili',\r\n 'tab.rows': 'Sez.',\r\n 'tab.rowsHint': 'Layout delle sezioni e modello del canvas',\r\n 'tab.files': 'File',\r\n 'tab.filesHint': 'Libreria risorse',\r\n 'tab.layers': 'Struttura',\r\n 'tab.layersHint': 'Struttura del documento',\r\n 'tab.theme': 'Tema',\r\n 'tab.themeHint': 'Stili globali',\r\n 'tab.data': 'Var.',\r\n 'tab.dataHint': 'Variabili fornite dal tuo codice',\r\n 'inspector.blockProperties': 'Proprietà del blocco',\r\n 'inspector.sectionProperties': 'Proprietà della sezione',\r\n 'inspector.title': 'Ispettore',\r\n 'inspector.sectionLabel': 'Sezione',\r\n 'inspector.nothingSelected': 'Nessuna selezione',\r\n 'action.duplicateHint': 'Duplica — ⌘D',\r\n 'action.deleteHint': 'Elimina — ⌫',\r\n 'inspector.emptyBody':\r\n 'Seleziona una riga o un blocco sul canvas per applicarne lo stile qui. Trascina i blocchi dalla scheda <strong style=\"color: var(--ed-text); font-weight: 600;\">Blocchi</strong>; fai doppio clic su un testo per modificarlo direttamente.',\r\n 'inspector.shortcuts': 'Scorciatoie',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — annulla, ripeti',\r\n 'shortcut.duplicate': '⌘D — duplica selezione',\r\n 'shortcut.delete': '⌫ — elimina selezione',\r\n 'shortcut.export': '⌘E — esporta HTML',\r\n 'shortcut.escape': 'ESC — deseleziona, chiudi',\r\n 'blocks.dragHint': 'Trascina sul canvas',\r\n 'blocks.count': '{count} blocchi',\r\n 'rows.sectionLayouts': 'Layout delle sezioni',\r\n 'rows.customMarkup': 'Markup personalizzato',\r\n 'rows.htmlRowHint': 'Trascina per inserire, o clicca per aggiungere — una riga a piena larghezza da riempire con HTML grezzo',\r\n 'rows.rawHtmlSection': 'Sezione HTML grezzo',\r\n 'rows.rawHtmlDesc': 'Sezione a piena larghezza, il tuo markup, ancora trascinabile',\r\n 'rows.canvasModel': 'Modello del canvas',\r\n 'rows.modeRowBased': 'Basato su righe',\r\n 'rows.modeFreeStack': 'Pila libera',\r\n 'rows.hintRows':\r\n 'Basato su sezioni: rilascia prima un layout, poi i blocchi nelle sue colonne — ogni sezione ha proprio sfondo, bordo, impostazioni flex o griglia.',\r\n 'rows.hintStack': 'Pila libera: senza layout — ogni blocco rilasciato diventa una propria sezione a piena larghezza, impilata in ordine.',\r\n 'files.libraryCount': 'Libreria — {count} file',\r\n 'files.openManager': 'Apri gestione file',\r\n 'files.dragToCanvas': 'Trascina un qualsiasi file direttamente sul canvas per inserirlo come blocco immagine.',\r\n 'layers.structure': 'Struttura',\r\n 'layers.sectionSingle': 'Sezione',\r\n 'layers.sectionMulti': 'Sezione · {count} col.',\r\n 'layers.blockCount': '{count} bl.',\r\n 'theme.globalStyles': 'Stili globali',\r\n 'vars.title': 'Variabili',\r\n 'vars.fromCode': '{count} dal tuo codice',\r\n 'vars.declaredNote': 'Dichiarate dalla tua applicazione — il canvas mostra sempre il token, mai un valore.',\r\n 'vars.filterPlaceholder': 'Filtra variabili…',\r\n 'vars.insertHint': 'Clicca per inserire nel testo, titolo o pulsante selezionato',\r\n 'vars.insert': 'inserisci',\r\n 'vars.noMatch': 'Nessuna variabile corrisponde a questo filtro.',\r\n 'vars.noneDeclared': 'La tua applicazione non ha ancora dichiarato variabili.',\r\n 'vars.rteHint': 'Durante la modifica del testo puoi anche scegliere una variabile direttamente dal menu della barra degli strumenti in linea.',\r\n 'modal.fileManager': 'Gestione file',\r\n 'modal.assetsTitle': 'Risorse',\r\n 'modal.replaceImage': 'Sostituisci immagine',\r\n 'library.searchPlaceholder': 'Cerca file…',\r\n 'action.upload': 'Carica',\r\n 'library.clickToPlace': 'Clicca su un file per posizionarlo · o trascina un file sul canvas',\r\n 'library.clickToReplace': 'Clicca su un file per sostituire l’immagine selezionata',\r\n 'library.storageLabel': '{count} file · {size}',\r\n 'library.folders': 'Cartelle',\r\n 'library.dropHint': 'Rilascia qui i file immagine per caricarli — oppure usa il pulsante Carica.',\r\n 'library.deleteFileHint': 'Elimina file',\r\n 'library.del': 'ELIM',\r\n 'toast.assetDeleted': '{name} eliminato',\r\n 'modal.export': 'Esporta',\r\n 'modal.exportTitle': 'HTML email basato su tabelle',\r\n 'export.copy': 'Copia',\r\n 'export.copied': 'Copiato',\r\n 'action.download': 'Scarica',\r\n 'export.meta': '{kb} KB · tabelle + stili inline · larghezze sicure per Outlook',\r\n 'modal.rawHtmlTitle': 'HTML grezzo, anteprima dal vivo',\r\n 'code.statusEdited': 'Vista codice — modificato — anteprima dal vivo, non ancora applicato',\r\n 'code.statusSynced': 'Vista codice — sincronizzato con il canvas',\r\n 'action.reload': 'Ricarica',\r\n 'action.reloadHint': 'Ricarica il sorgente dal canvas',\r\n 'action.applyToCanvas': 'Applica al canvas',\r\n 'action.applyToCanvasHint': 'Analizza il sorgente riconvertendolo in righe modificabili',\r\n 'action.closeWithoutApplyingHint': 'Chiudi senza applicare',\r\n 'code.source': 'Sorgente',\r\n 'code.livePreview': 'Anteprima dal vivo',\r\n 'code.liveHtmlPreviewTitle': 'Anteprima HTML dal vivo',\r\n 'code.applyNote':\r\n 'Applica converte ogni riga di tabella di primo livello in una riga del canvas ancora selezionabile, riordinabile ed eliminabile — il markup scritto a mano resta intatto.',\r\n 'code.meta': '{kb} KB · {lines} righe',\r\n 'toast.sourceReloaded': 'Sorgente ricaricato dal canvas',\r\n 'toast.sourceAppliedOne': 'Sorgente applicato — 1 riga sul canvas',\r\n 'toast.sourceAppliedMany': 'Sorgente applicato — {rows} righe sul canvas',\r\n 'toast.parseError': 'Impossibile analizzare questo HTML',\r\n 'modal.copyAssist': 'Assistente di scrittura',\r\n 'modal.draftCopyTitle': 'Scrivi il testo per questa campagna',\r\n 'ai.goal': 'Obiettivo',\r\n 'ai.tone': 'Tono',\r\n 'ai.briefLabel': 'Di cosa parla questa email?',\r\n 'ai.briefPlaceholder': 'es. Collezione autunno, 15% per gli iscritti, spedizione gratuita oltre 150€',\r\n 'ai.generate': 'Genera testo',\r\n 'ai.writing': 'Scrittura in corso…',\r\n 'ai.kindHeadline': 'Titolo',\r\n 'ai.kindBody': 'Corpo del testo',\r\n 'ai.kindButton': 'Testo del pulsante',\r\n 'ai.actionInsertHeading': 'Inserisci come titolo',\r\n 'ai.actionInsertText': 'Inserisci come blocco di testo',\r\n 'ai.actionInsertButton': 'Inserisci come pulsante',\r\n 'toast.headingAdded': 'Titolo aggiunto',\r\n 'toast.textBlockAdded': 'Blocco di testo aggiunto',\r\n 'toast.buttonAdded': 'Pulsante aggiunto',\r\n 'preview.kickerMobile': 'Anteprima — mobile 375px',\r\n 'preview.kickerDark': 'Anteprima — posta scura',\r\n 'preview.kickerDesktop': 'Anteprima — desktop {width}px',\r\n 'action.close': 'Chiudi',\r\n 'toast.duplicated': 'Duplicato',\r\n 'toast.fileUploadedOne': '1 file caricato',\r\n 'toast.fileUploadedMany': '{count} file caricati',\r\n 'toast.imageReplaced': 'Immagine sostituita',\r\n 'toast.imageAdded': 'Immagine aggiunta al canvas',\r\n 'toast.htmlCopied': 'HTML copiato negli appunti',\r\n 'toast.templateLoaded': '{name} caricato',\r\n 'toast.snippetDefaultLabel': 'Snippet',\r\n 'toast.snippetInserted': '{name} inserito',\r\n 'toast.snippetCopied': '{name} copiato — seleziona un blocco di testo per inserirlo',\r\n};\r\n\r\n\nObject.assign(exports, { IT });\n\n};\n__modules[\"core/i18n/lt.js\"] = function(module, exports, __require) {\n/** Lithuanian (Lietuvių) — `lt`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst LT = {\r\n 'action.undoHint': 'Anuliuoti — ⌘Z',\r\n 'action.redoHint': 'Grąžinti — ⌘⇧Z',\r\n 'action.chromeToDark': 'Tamsi',\r\n 'action.chromeToLight': 'Šviesi',\r\n 'action.chromeHint': 'Redaktoriaus tema šviesi / tamsi',\r\n 'action.aiCopy': 'Tekstas',\r\n 'action.aiCopyHint': 'Parašyti tekstą su DI',\r\n 'action.code': 'Kodas',\r\n 'action.codeHint': 'Redaguoti neapdorotą HTML su tiesioginiu peržiūra',\r\n 'action.preview': 'Peržiūra',\r\n 'action.export': 'Eksportuoti',\r\n 'device.desktop': 'Kompiuteris',\r\n 'device.desktopHint': 'Kompiuterio plotis',\r\n 'device.mobile': 'Mobilusis',\r\n 'device.mobileHint': 'Mobiliojo plotis',\r\n 'device.dark': 'Tamsi',\r\n 'device.darkHint': 'Tamsus pašto dėžutės režimas',\r\n 'status.autosaveOn': 'automatinis išsaugojimas įjungtas',\r\n 'status.saved': 'išsaugota {time}',\r\n 'status.saveFailed': 'neišsaugota — saugykla pilna',\r\n 'canvas.meta': '{rows} eilučių · {blocks} blokų · {width}px',\r\n 'tab.design': 'Stilius',\r\n 'tab.designHint': 'Stilizuoti pasirinkimą',\r\n 'tab.blocks': 'Blokai',\r\n 'tab.blocksHint': 'Turinio blokai ir kintamieji',\r\n 'tab.rows': 'Sekcijos',\r\n 'tab.rowsHint': 'Sekcijų išdėstymai ir drobės modelis',\r\n 'tab.files': 'Failai',\r\n 'tab.filesHint': 'Išteklių biblioteka',\r\n 'tab.layers': 'Struktūra',\r\n 'tab.layersHint': 'Dokumento struktūra',\r\n 'tab.theme': 'Tema',\r\n 'tab.themeHint': 'Globalūs stiliai',\r\n 'tab.data': 'Kint.',\r\n 'tab.dataHint': 'Jūsų kodo pateikti kintamieji',\r\n 'inspector.blockProperties': 'Bloko savybės',\r\n 'inspector.sectionProperties': 'Sekcijos savybės',\r\n 'inspector.title': 'Inspektorius',\r\n 'inspector.sectionLabel': 'Sekcija',\r\n 'inspector.nothingSelected': 'Nieko nepasirinkta',\r\n 'action.duplicateHint': 'Dubliuoti — ⌘D',\r\n 'action.deleteHint': 'Ištrinti — ⌫',\r\n 'inspector.emptyBody':\r\n 'Pasirinkite eilutę arba bloką drobėje, kad čia jį stilizuotumėte. Vilkite blokus iš skirtuko <strong style=\"color: var(--ed-text); font-weight: 600;\">Blokai</strong>; dukart spustelėkite bet kurį tekstą, kad redaguotumėte jį tiesiogiai.',\r\n 'inspector.shortcuts': 'Sparčieji klavišai',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — anuliuoti, grąžinti',\r\n 'shortcut.duplicate': '⌘D — dubliuoti pasirinkimą',\r\n 'shortcut.delete': '⌫ — ištrinti pasirinkimą',\r\n 'shortcut.export': '⌘E — eksportuoti HTML',\r\n 'shortcut.escape': 'ESC — panaikinti pasirinkimą, uždaryti',\r\n 'blocks.dragHint': 'Vilkite į drobę',\r\n 'blocks.count': '{count} blokų',\r\n 'rows.sectionLayouts': 'Sekcijų išdėstymai',\r\n 'rows.customMarkup': 'Pasirinktinis kodas',\r\n 'rows.htmlRowHint': 'Vilkite, kad įterptumėte, arba spustelėkite, kad pridėtumėte — pilno pločio eilutę, kurią užpildote neapdorotu HTML',\r\n 'rows.rawHtmlSection': 'Neapdoroto HTML sekcija',\r\n 'rows.rawHtmlDesc': 'Pilno pločio sekcija, jūsų pačių kodas, vis dar vilkiama',\r\n 'rows.canvasModel': 'Drobės modelis',\r\n 'rows.modeRowBased': 'Pagrįsta eilutėmis',\r\n 'rows.modeFreeStack': 'Laisvas krūvinys',\r\n 'rows.hintRows':\r\n 'Pagrįsta sekcijomis: pirmiausia numeskite išdėstymą, tada blokus į jo stulpelius — kiekviena sekcija turi savo foną, kraštinę, flex arba tinklelio nustatymus.',\r\n 'rows.hintStack': 'Laisvas krūvinys: be išdėstymų — kiekvienas numestas blokas tampa savo pilno pločio sekcija, sudėta iš eilės.',\r\n 'files.libraryCount': 'Biblioteka — {count} failų',\r\n 'files.openManager': 'Atidaryti failų tvarkyklę',\r\n 'files.dragToCanvas': 'Vilkite bet kurį failą tiesiai į drobę, kad jį padėtumėte kaip vaizdo bloką.',\r\n 'layers.structure': 'Struktūra',\r\n 'layers.sectionSingle': 'Sekcija',\r\n 'layers.sectionMulti': 'Sekcija · {count} stulpelių',\r\n 'layers.blockCount': '{count} bl.',\r\n 'theme.globalStyles': 'Globalūs stiliai',\r\n 'vars.title': 'Kintamieji',\r\n 'vars.fromCode': '{count} iš jūsų kodo',\r\n 'vars.declaredNote': 'Deklaruoti jūsų programos — drobė visada rodo žymą, o ne reikšmę.',\r\n 'vars.filterPlaceholder': 'Filtruoti kintamuosius…',\r\n 'vars.insertHint': 'Spustelėkite, kad įterptumėte į pasirinktą tekstą, antraštę ar mygtuką',\r\n 'vars.insert': 'įterpti',\r\n 'vars.noMatch': 'Nė vienas kintamasis neatitinka šio filtro.',\r\n 'vars.noneDeclared': 'Jūsų programa dar nedeklaravo jokių kintamųjų.',\r\n 'vars.rteHint': 'Redaguodami tekstą taip pat galite pasirinkti kintamąjį tiesiai iš įterptos įrankių juostos išskleidžiamojo meniu.',\r\n 'modal.fileManager': 'Failų tvarkyklė',\r\n 'modal.assetsTitle': 'Ištekliai',\r\n 'modal.replaceImage': 'Pakeisti vaizdą',\r\n 'library.searchPlaceholder': 'Ieškoti failų…',\r\n 'action.upload': 'Įkelti',\r\n 'library.clickToPlace': 'Spustelėkite failą, kad jį padėtumėte · arba vilkite failą į drobę',\r\n 'library.clickToReplace': 'Spustelėkite failą, kad pakeistumėte pasirinktą vaizdą',\r\n 'library.storageLabel': '{count} failų · {size}',\r\n 'library.folders': 'Aplankai',\r\n 'library.dropHint': 'Numeskite vaizdo failus čia, kad juos įkeltumėte — arba naudokite mygtuką Įkelti.',\r\n 'library.deleteFileHint': 'Ištrinti failą',\r\n 'library.del': 'TRINT',\r\n 'toast.assetDeleted': '{name} ištrintas',\r\n 'modal.export': 'Eksportuoti',\r\n 'modal.exportTitle': 'Lentelėmis pagrįstas el. laiško HTML',\r\n 'export.copy': 'Kopijuoti',\r\n 'export.copied': 'Nukopijuota',\r\n 'action.download': 'Atsisiųsti',\r\n 'export.meta': '{kb} KB · lentelės + įterpti stiliai · Outlook saugūs pločiai',\r\n 'modal.rawHtmlTitle': 'Neapdorotas HTML, tiesioginė peržiūra',\r\n 'code.statusEdited': 'Kodo rodinys — redaguota — peržiūra tiesiogiai, dar netaikyta',\r\n 'code.statusSynced': 'Kodo rodinys — sinchronizuota su drobe',\r\n 'action.reload': 'Įkelti iš naujo',\r\n 'action.reloadHint': 'Įkelti šaltinį iš naujo iš drobės',\r\n 'action.applyToCanvas': 'Taikyti drobei',\r\n 'action.applyToCanvasHint': 'Analizuoti šaltinį atgal į redaguojamas eilutes',\r\n 'action.closeWithoutApplyingHint': 'Uždaryti netaikant',\r\n 'code.source': 'Šaltinis',\r\n 'code.livePreview': 'Tiesioginė peržiūra',\r\n 'code.liveHtmlPreviewTitle': 'Tiesioginė HTML peržiūra',\r\n 'code.applyNote':\r\n 'Taikymas analizuoja kiekvieną aukščiausio lygio lentelės eilutę į drobės eilutę, kurią vis dar galite pasirinkti, pertvarkyti ir ištrinti — ranka parašytas kodas išlieka nepakitęs.',\r\n 'code.meta': '{kb} KB · {lines} eilučių',\r\n 'toast.sourceReloaded': 'Šaltinis įkeltas iš naujo iš drobės',\r\n 'toast.sourceAppliedOne': 'Šaltinis pritaikytas — 1 eilutė drobėje',\r\n 'toast.sourceAppliedMany': 'Šaltinis pritaikytas — {rows} eilučių drobėje',\r\n 'toast.parseError': 'Nepavyko išanalizuoti šio HTML',\r\n 'modal.copyAssist': 'Teksto asistentas',\r\n 'modal.draftCopyTitle': 'Parašyti tekstą šiai kampanijai',\r\n 'ai.goal': 'Tikslas',\r\n 'ai.tone': 'Tonas',\r\n 'ai.briefLabel': 'Apie ką šis el. laiškas?',\r\n 'ai.briefPlaceholder': 'pvz., Rudens kolekcija, 15 % prenumeratoriams, nemokamas pristatymas nuo 150 €',\r\n 'ai.generate': 'Generuoti tekstą',\r\n 'ai.writing': 'Rašoma…',\r\n 'ai.kindHeadline': 'Antraštė',\r\n 'ai.kindBody': 'Pagrindinis tekstas',\r\n 'ai.kindButton': 'Mygtuko tekstas',\r\n 'ai.actionInsertHeading': 'Įterpti kaip antraštę',\r\n 'ai.actionInsertText': 'Įterpti kaip teksto bloką',\r\n 'ai.actionInsertButton': 'Įterpti kaip mygtuką',\r\n 'toast.headingAdded': 'Antraštė pridėta',\r\n 'toast.textBlockAdded': 'Teksto blokas pridėtas',\r\n 'toast.buttonAdded': 'Mygtukas pridėtas',\r\n 'preview.kickerMobile': 'Peržiūra — mobilusis 375px',\r\n 'preview.kickerDark': 'Peržiūra — tamsi pašto dėžutė',\r\n 'preview.kickerDesktop': 'Peržiūra — kompiuteris {width}px',\r\n 'action.close': 'Uždaryti',\r\n 'toast.duplicated': 'Sudubliuota',\r\n 'toast.fileUploadedOne': 'Įkeltas 1 failas',\r\n 'toast.fileUploadedMany': 'Įkelta failų: {count}',\r\n 'toast.imageReplaced': 'Vaizdas pakeistas',\r\n 'toast.imageAdded': 'Vaizdas pridėtas į drobę',\r\n 'toast.htmlCopied': 'HTML nukopijuotas į iškarpinę',\r\n 'toast.templateLoaded': '{name} įkeltas',\r\n 'toast.snippetDefaultLabel': 'Iškarpa',\r\n 'toast.snippetInserted': '{name} įterptas',\r\n 'toast.snippetCopied': '{name} nukopijuotas — pasirinkite teksto bloką, kad jį įterptumėte',\r\n};\r\n\r\n\nObject.assign(exports, { LT });\n\n};\n__modules[\"core/i18n/lv.js\"] = function(module, exports, __require) {\n/** Latvian (Latviešu) — `lv`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst LV = {\r\n 'action.undoHint': 'Atsaukt — ⌘Z',\r\n 'action.redoHint': 'Atkārtot — ⌘⇧Z',\r\n 'action.chromeToDark': 'Tumšs',\r\n 'action.chromeToLight': 'Gaišs',\r\n 'action.chromeHint': 'Redaktora tēma gaiša / tumša',\r\n 'action.aiCopy': 'Teksts',\r\n 'action.aiCopyHint': 'Sastādīt tekstu ar MI',\r\n 'action.code': 'Kods',\r\n 'action.codeHint': 'Rediģēt neapstrādātu HTML ar tiešraides priekšskatījumu',\r\n 'action.preview': 'Priekšskatījums',\r\n 'action.export': 'Eksportēt',\r\n 'device.desktop': 'Dators',\r\n 'device.desktopHint': 'Datora platums',\r\n 'device.mobile': 'Mobilā ierīce',\r\n 'device.mobileHint': 'Mobilās ierīces platums',\r\n 'device.dark': 'Tumšs',\r\n 'device.darkHint': 'Tumšais iesūtnes režīms',\r\n 'status.autosaveOn': 'automātiskā saglabāšana ieslēgta',\r\n 'status.saved': 'saglabāts {time}',\r\n 'status.saveFailed': 'nav saglabāts — krātuve pilna',\r\n 'canvas.meta': '{rows} rindas · {blocks} bloki · {width}px',\r\n 'tab.design': 'Stils',\r\n 'tab.designHint': 'Noformēt atlasi',\r\n 'tab.blocks': 'Bloki',\r\n 'tab.blocksHint': 'Satura bloki un mainīgie',\r\n 'tab.rows': 'Sadaļas',\r\n 'tab.rowsHint': 'Sadaļu izkārtojumi un audekla modelis',\r\n 'tab.files': 'Faili',\r\n 'tab.filesHint': 'Resursu bibliotēka',\r\n 'tab.layers': 'Struktūra',\r\n 'tab.layersHint': 'Dokumenta struktūra',\r\n 'tab.theme': 'Tēma',\r\n 'tab.themeHint': 'Globālie stili',\r\n 'tab.data': 'Main.',\r\n 'tab.dataHint': 'Jūsu koda nodrošinātie mainīgie',\r\n 'inspector.blockProperties': 'Bloka īpašības',\r\n 'inspector.sectionProperties': 'Sadaļas īpašības',\r\n 'inspector.title': 'Inspektors',\r\n 'inspector.sectionLabel': 'Sadaļa',\r\n 'inspector.nothingSelected': 'Nekas nav atlasīts',\r\n 'action.duplicateHint': 'Dublēt — ⌘D',\r\n 'action.deleteHint': 'Dzēst — ⌫',\r\n 'inspector.emptyBody':\r\n 'Atlasiet rindu vai bloku uz audekla, lai to šeit noformētu. Velciet blokus no cilnes <strong style=\"color: var(--ed-text); font-weight: 600;\">Bloki</strong>; veiciet dubultklikšķi uz jebkura teksta, lai to rediģētu tieši uz vietas.',\r\n 'inspector.shortcuts': 'Īsinājumtaustiņi',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — atsaukt, atkārtot',\r\n 'shortcut.duplicate': '⌘D — dublēt atlasi',\r\n 'shortcut.delete': '⌫ — dzēst atlasi',\r\n 'shortcut.export': '⌘E — eksportēt HTML',\r\n 'shortcut.escape': 'ESC — atcelt atlasi, aizvērt',\r\n 'blocks.dragHint': 'Velciet uz audeklu',\r\n 'blocks.count': '{count} bloki',\r\n 'rows.sectionLayouts': 'Sadaļu izkārtojumi',\r\n 'rows.customMarkup': 'Pielāgots kods',\r\n 'rows.htmlRowHint': 'Velciet, lai ievietotu, vai noklikšķiniet, lai pievienotu — pilna platuma rindu, ko aizpildāt ar neapstrādātu HTML',\r\n 'rows.rawHtmlSection': 'Neapstrādāta HTML sadaļa',\r\n 'rows.rawHtmlDesc': 'Pilna platuma sadaļa, jūsu pašu kods, joprojām velkama',\r\n 'rows.canvasModel': 'Audekla modelis',\r\n 'rows.modeRowBased': 'Balstīts uz rindām',\r\n 'rows.modeFreeStack': 'Brīva kaudze',\r\n 'rows.hintRows':\r\n 'Balstīts uz sadaļām: vispirms nometiet izkārtojumu, tad blokus tā kolonnās — katrai sadaļai ir sava fona, apmales, flex vai režģa iestatījumi.',\r\n 'rows.hintStack': 'Brīva kaudze: bez izkārtojumiem — katrs nomestais bloks kļūst par savu pilna platuma sadaļu, sakrautu secībā.',\r\n 'files.libraryCount': 'Bibliotēka — {count} faili',\r\n 'files.openManager': 'Atvērt failu pārvaldnieku',\r\n 'files.dragToCanvas': 'Velciet jebkuru failu tieši uz audekla, lai novietotu to kā attēla bloku.',\r\n 'layers.structure': 'Struktūra',\r\n 'layers.sectionSingle': 'Sadaļa',\r\n 'layers.sectionMulti': 'Sadaļa · {count} kolonnas',\r\n 'layers.blockCount': '{count} bl.',\r\n 'theme.globalStyles': 'Globālie stili',\r\n 'vars.title': 'Mainīgie',\r\n 'vars.fromCode': '{count} no jūsu koda',\r\n 'vars.declaredNote': 'Jūsu lietotnes deklarēti — audekls vienmēr rāda marķieri, nekad vērtību.',\r\n 'vars.filterPlaceholder': 'Filtrēt mainīgos…',\r\n 'vars.insertHint': 'Noklikšķiniet, lai ievietotu atlasītajā tekstā, virsrakstā vai pogā',\r\n 'vars.insert': 'ievietot',\r\n 'vars.noMatch': 'Neviens mainīgais neatbilst šim filtram.',\r\n 'vars.noneDeclared': 'Jūsu lietotne vēl nav deklarējusi nevienu mainīgo.',\r\n 'vars.rteHint': 'Rediģējot tekstu, jūs varat arī izvēlēties mainīgo tieši no iegultās rīkjoslas nolaižamās izvēlnes.',\r\n 'modal.fileManager': 'Failu pārvaldnieks',\r\n 'modal.assetsTitle': 'Resursi',\r\n 'modal.replaceImage': 'Aizstāt attēlu',\r\n 'library.searchPlaceholder': 'Meklēt failus…',\r\n 'action.upload': 'Augšupielādēt',\r\n 'library.clickToPlace': 'Noklikšķiniet uz faila, lai to novietotu · vai velciet failu uz audeklu',\r\n 'library.clickToReplace': 'Noklikšķiniet uz faila, lai aizstātu atlasīto attēlu',\r\n 'library.storageLabel': '{count} faili · {size}',\r\n 'library.folders': 'Mapes',\r\n 'library.dropHint': 'Nometiet attēlu failus šeit, lai tos augšupielādētu — vai izmantojiet pogu Augšupielādēt.',\r\n 'library.deleteFileHint': 'Dzēst failu',\r\n 'library.del': 'DZĒST',\r\n 'toast.assetDeleted': '{name} dzēsts',\r\n 'modal.export': 'Eksportēt',\r\n 'modal.exportTitle': 'Uz tabulām balstīts e-pasta HTML',\r\n 'export.copy': 'Kopēt',\r\n 'export.copied': 'Nokopēts',\r\n 'action.download': 'Lejupielādēt',\r\n 'export.meta': '{kb} KB · tabulas + iegultie stili · Outlook drošie platumi',\r\n 'modal.rawHtmlTitle': 'Neapstrādāts HTML, tiešraides priekšskatījums',\r\n 'code.statusEdited': 'Koda skats — rediģēts — priekšskatījums tiešraidē, vēl nav lietots',\r\n 'code.statusSynced': 'Koda skats — sinhronizēts ar audeklu',\r\n 'action.reload': 'Ielādēt no jauna',\r\n 'action.reloadHint': 'Ielādēt avotu no jauna no audekla',\r\n 'action.applyToCanvas': 'Lietot audeklam',\r\n 'action.applyToCanvasHint': 'Analizēt avotu atpakaļ rediģējamās rindās',\r\n 'action.closeWithoutApplyingHint': 'Aizvērt bez lietošanas',\r\n 'code.source': 'Avots',\r\n 'code.livePreview': 'Tiešraides priekšskatījums',\r\n 'code.liveHtmlPreviewTitle': 'HTML tiešraides priekšskatījums',\r\n 'code.applyNote':\r\n 'Lietošana analizē katru augšējā līmeņa tabulas rindu audekla rindā, ko joprojām varat atlasīt, pārkārtot un dzēst — ar roku rakstīts kods pāri notikumam paliek nemainīgs.',\r\n 'code.meta': '{kb} KB · {lines} rindas',\r\n 'toast.sourceReloaded': 'Avots ielādēts no jauna no audekla',\r\n 'toast.sourceAppliedOne': 'Avots lietots — 1 rinda uz audekla',\r\n 'toast.sourceAppliedMany': 'Avots lietots — {rows} rindas uz audekla',\r\n 'toast.parseError': 'Šo HTML neizdevās analizēt',\r\n 'modal.copyAssist': 'Teksta palīgs',\r\n 'modal.draftCopyTitle': 'Sastādīt tekstu šai kampaņai',\r\n 'ai.goal': 'Mērķis',\r\n 'ai.tone': 'Tonis',\r\n 'ai.briefLabel': 'Par ko ir šis e-pasts?',\r\n 'ai.briefPlaceholder': 'piem., rudens kolekcija, 15% abonentiem, bezmaksas piegāde virs 150 €',\r\n 'ai.generate': 'Ģenerēt tekstu',\r\n 'ai.writing': 'Notiek rakstīšana…',\r\n 'ai.kindHeadline': 'Virsraksts',\r\n 'ai.kindBody': 'Pamatteksts',\r\n 'ai.kindButton': 'Pogas teksts',\r\n 'ai.actionInsertHeading': 'Ievietot kā virsrakstu',\r\n 'ai.actionInsertText': 'Ievietot kā teksta bloku',\r\n 'ai.actionInsertButton': 'Ievietot kā pogu',\r\n 'toast.headingAdded': 'Virsraksts pievienots',\r\n 'toast.textBlockAdded': 'Teksta bloks pievienots',\r\n 'toast.buttonAdded': 'Poga pievienota',\r\n 'preview.kickerMobile': 'Priekšskatījums — mobilā ierīce 375px',\r\n 'preview.kickerDark': 'Priekšskatījums — tumšā iesūtne',\r\n 'preview.kickerDesktop': 'Priekšskatījums — dators {width}px',\r\n 'action.close': 'Aizvērt',\r\n 'toast.duplicated': 'Dublēts',\r\n 'toast.fileUploadedOne': 'Augšupielādēts 1 fails',\r\n 'toast.fileUploadedMany': 'Augšupielādēti {count} faili',\r\n 'toast.imageReplaced': 'Attēls aizstāts',\r\n 'toast.imageAdded': 'Attēls pievienots audeklam',\r\n 'toast.htmlCopied': 'HTML nokopēts starpliktuvē',\r\n 'toast.templateLoaded': '{name} ielādēts',\r\n 'toast.snippetDefaultLabel': 'Fragments',\r\n 'toast.snippetInserted': '{name} ievietots',\r\n 'toast.snippetCopied': '{name} nokopēts — atlasiet teksta bloku, lai to ievietotu',\r\n};\r\n\r\n\nObject.assign(exports, { LV });\n\n};\n__modules[\"core/i18n/nb.js\"] = function(module, exports, __require) {\n/** Norwegian Bokmål (Norsk bokmål) — `nb`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst NB = {\r\n 'action.undoHint': 'Angre — ⌘Z',\r\n 'action.redoHint': 'Gjør om — ⌘⇧Z',\r\n 'action.chromeToDark': 'Mørk',\r\n 'action.chromeToLight': 'Lys',\r\n 'action.chromeHint': 'Redigeringstema lys / mørk',\r\n 'action.aiCopy': 'Tekst',\r\n 'action.aiCopyHint': 'Skriv tekst med AI',\r\n 'action.code': 'Kode',\r\n 'action.codeHint': 'Rediger rå HTML med direkte forhåndsvisning',\r\n 'action.preview': 'Forhåndsvisning',\r\n 'action.export': 'Eksporter',\r\n 'device.desktop': 'Datamaskin',\r\n 'device.desktopHint': 'Bredde for datamaskin',\r\n 'device.mobile': 'Mobil',\r\n 'device.mobileHint': 'Bredde for mobil',\r\n 'device.dark': 'Mørk',\r\n 'device.darkHint': 'Mørk modus for innboks',\r\n 'status.autosaveOn': 'automatisk lagring på',\r\n 'status.saved': 'lagret {time}',\r\n 'status.saveFailed': 'ikke lagret — lagringsplassen er full',\r\n 'canvas.meta': '{rows} rader · {blocks} blokker · {width}px',\r\n 'tab.design': 'Stil',\r\n 'tab.designHint': 'Formater utvalget',\r\n 'tab.blocks': 'Blokker',\r\n 'tab.blocksHint': 'Innholdsblokker og variabler',\r\n 'tab.rows': 'Seksjoner',\r\n 'tab.rowsHint': 'Seksjonslayouter og lerretsmodell',\r\n 'tab.files': 'Filer',\r\n 'tab.filesHint': 'Ressursbibliotek',\r\n 'tab.layers': 'Struktur',\r\n 'tab.layersHint': 'Dokumentstruktur',\r\n 'tab.theme': 'Tema',\r\n 'tab.themeHint': 'Globale stiler',\r\n 'tab.data': 'Var.',\r\n 'tab.dataHint': 'Variabler levert av koden din',\r\n 'inspector.blockProperties': 'Blokkegenskaper',\r\n 'inspector.sectionProperties': 'Seksjonsegenskaper',\r\n 'inspector.title': 'Inspektør',\r\n 'inspector.sectionLabel': 'Seksjon',\r\n 'inspector.nothingSelected': 'Ingenting valgt',\r\n 'action.duplicateHint': 'Dupliser — ⌘D',\r\n 'action.deleteHint': 'Slett — ⌫',\r\n 'inspector.emptyBody':\r\n 'Velg en rad eller en blokk på lerretet for å formatere den her. Dra blokker fra fanen <strong style=\"color: var(--ed-text); font-weight: 600;\">Blokker</strong>; dobbeltklikk på tekst for å redigere direkte.',\r\n 'inspector.shortcuts': 'Snarveier',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — angre, gjør om',\r\n 'shortcut.duplicate': '⌘D — dupliser utvalg',\r\n 'shortcut.delete': '⌫ — slett utvalg',\r\n 'shortcut.export': '⌘E — eksporter HTML',\r\n 'shortcut.escape': 'ESC — fjern utvalg, lukk',\r\n 'blocks.dragHint': 'Dra til lerretet',\r\n 'blocks.count': '{count} blokker',\r\n 'rows.sectionLayouts': 'Seksjonslayouter',\r\n 'rows.customMarkup': 'Egendefinert kode',\r\n 'rows.htmlRowHint': 'Dra for å sette inn, eller klikk for å legge til — en fullbredde-rad du fyller med rå HTML',\r\n 'rows.rawHtmlSection': 'Rå HTML-seksjon',\r\n 'rows.rawHtmlDesc': 'Fullbredde-seksjon, din egen kode, fortsatt drabar',\r\n 'rows.canvasModel': 'Lerretsmodell',\r\n 'rows.modeRowBased': 'Radbasert',\r\n 'rows.modeFreeStack': 'Fri stabel',\r\n 'rows.hintRows':\r\n 'Seksjonsbasert: slipp en layout først, deretter blokker i kolonnene — hver seksjon har egen bakgrunn, kant, flex- eller rutenettinnstillinger.',\r\n 'rows.hintStack': 'Fri stabel: uten layouter — hver blokk du slipper blir sin egen fullbredde-seksjon, stablet i rekkefølge.',\r\n 'files.libraryCount': 'Bibliotek — {count} filer',\r\n 'files.openManager': 'Åpne filbehandling',\r\n 'files.dragToCanvas': 'Dra en hvilken som helst fil direkte til lerretet for å plassere den som en bildeblokk.',\r\n 'layers.structure': 'Struktur',\r\n 'layers.sectionSingle': 'Seksjon',\r\n 'layers.sectionMulti': 'Seksjon · {count} kol.',\r\n 'layers.blockCount': '{count} bl.',\r\n 'theme.globalStyles': 'Globale stiler',\r\n 'vars.title': 'Variabler',\r\n 'vars.fromCode': '{count} fra koden din',\r\n 'vars.declaredNote': 'Erklært av applikasjonen din — lerretet viser alltid tokenet, aldri en verdi.',\r\n 'vars.filterPlaceholder': 'Filtrer variabler…',\r\n 'vars.insertHint': 'Klikk for å sette inn i valgt tekst, overskrift eller knapp',\r\n 'vars.insert': 'sett inn',\r\n 'vars.noMatch': 'Ingen variabel samsvarer med dette filteret.',\r\n 'vars.noneDeclared': 'Applikasjonen din har ennå ikke erklært noen variabler.',\r\n 'vars.rteHint': 'Når du redigerer tekst kan du også velge en variabel direkte fra rullegardinmenyen i den innebygde verktøylinjen.',\r\n 'modal.fileManager': 'Filbehandling',\r\n 'modal.assetsTitle': 'Ressurser',\r\n 'modal.replaceImage': 'Erstatt bilde',\r\n 'library.searchPlaceholder': 'Søk i filer…',\r\n 'action.upload': 'Last opp',\r\n 'library.clickToPlace': 'Klikk på en fil for å plassere den · eller dra en fil til lerretet',\r\n 'library.clickToReplace': 'Klikk på en fil for å erstatte det valgte bildet',\r\n 'library.storageLabel': '{count} filer · {size}',\r\n 'library.folders': 'Mapper',\r\n 'library.dropHint': 'Slipp bildefiler her for å laste opp — eller bruk Last opp-knappen.',\r\n 'library.deleteFileHint': 'Slett fil',\r\n 'library.del': 'SLETT',\r\n 'toast.assetDeleted': '{name} slettet',\r\n 'modal.export': 'Eksporter',\r\n 'modal.exportTitle': 'Tabellbasert e-post-HTML',\r\n 'export.copy': 'Kopier',\r\n 'export.copied': 'Kopiert',\r\n 'action.download': 'Last ned',\r\n 'export.meta': '{kb} KB · tabeller + inline-stiler · Outlook-sikre bredder',\r\n 'modal.rawHtmlTitle': 'Rå HTML, direkte forhåndsvisning',\r\n 'code.statusEdited': 'Kodevisning — redigert — forhåndsvisning live, ikke brukt ennå',\r\n 'code.statusSynced': 'Kodevisning — synkronisert med lerretet',\r\n 'action.reload': 'Last inn på nytt',\r\n 'action.reloadHint': 'Last inn kilden på nytt fra lerretet',\r\n 'action.applyToCanvas': 'Bruk på lerretet',\r\n 'action.applyToCanvasHint': 'Tolk kilden på nytt til redigerbare rader',\r\n 'action.closeWithoutApplyingHint': 'Lukk uten å bruke',\r\n 'code.source': 'Kilde',\r\n 'code.livePreview': 'Direkte forhåndsvisning',\r\n 'code.liveHtmlPreviewTitle': 'Direkte HTML-forhåndsvisning',\r\n 'code.applyNote':\r\n 'Bruk tolker hver tabellrad på øverste nivå til en lerretsrad du fortsatt kan velge, omorganisere og slette — håndskrevet kode overlever prosessen uendret.',\r\n 'code.meta': '{kb} KB · {lines} linjer',\r\n 'toast.sourceReloaded': 'Kilden lastet inn på nytt fra lerretet',\r\n 'toast.sourceAppliedOne': 'Kilde brukt — 1 rad på lerretet',\r\n 'toast.sourceAppliedMany': 'Kilde brukt — {rows} rader på lerretet',\r\n 'toast.parseError': 'Kunne ikke tolke den HTML-en',\r\n 'modal.copyAssist': 'Tekstassistent',\r\n 'modal.draftCopyTitle': 'Skriv tekst for denne kampanjen',\r\n 'ai.goal': 'Mål',\r\n 'ai.tone': 'Tone',\r\n 'ai.briefLabel': 'Hva handler denne e-posten om?',\r\n 'ai.briefPlaceholder': 'f.eks. Høstkolleksjon, 15% for abonnenter, fri frakt over 1500 kr',\r\n 'ai.generate': 'Generer tekst',\r\n 'ai.writing': 'Skriver…',\r\n 'ai.kindHeadline': 'Overskrift',\r\n 'ai.kindBody': 'Brødtekst',\r\n 'ai.kindButton': 'Knappetekst',\r\n 'ai.actionInsertHeading': 'Sett inn som overskrift',\r\n 'ai.actionInsertText': 'Sett inn som tekstblokk',\r\n 'ai.actionInsertButton': 'Sett inn som knapp',\r\n 'toast.headingAdded': 'Overskrift lagt til',\r\n 'toast.textBlockAdded': 'Tekstblokk lagt til',\r\n 'toast.buttonAdded': 'Knapp lagt til',\r\n 'preview.kickerMobile': 'Forhåndsvisning — mobil 375px',\r\n 'preview.kickerDark': 'Forhåndsvisning — mørk innboks',\r\n 'preview.kickerDesktop': 'Forhåndsvisning — datamaskin {width}px',\r\n 'action.close': 'Lukk',\r\n 'toast.duplicated': 'Duplisert',\r\n 'toast.fileUploadedOne': '1 fil lastet opp',\r\n 'toast.fileUploadedMany': '{count} filer lastet opp',\r\n 'toast.imageReplaced': 'Bilde erstattet',\r\n 'toast.imageAdded': 'Bilde lagt til på lerretet',\r\n 'toast.htmlCopied': 'HTML kopiert til utklippstavlen',\r\n 'toast.templateLoaded': '{name} lastet inn',\r\n 'toast.snippetDefaultLabel': 'Utdrag',\r\n 'toast.snippetInserted': '{name} satt inn',\r\n 'toast.snippetCopied': '{name} kopiert — velg en tekstblokk for å sette den inn',\r\n};\r\n\r\n\nObject.assign(exports, { NB });\n\n};\n__modules[\"core/i18n/nl.js\"] = function(module, exports, __require) {\n/** Dutch (Nederlands) — `nl`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst NL = {\r\n 'action.undoHint': 'Ongedaan maken — ⌘Z',\r\n 'action.redoHint': 'Opnieuw — ⌘⇧Z',\r\n 'action.chromeToDark': 'Donker',\r\n 'action.chromeToLight': 'Licht',\r\n 'action.chromeHint': 'Editorthema licht / donker',\r\n 'action.aiCopy': 'Tekst',\r\n 'action.aiCopyHint': 'Tekst opstellen met AI',\r\n 'action.code': 'Code',\r\n 'action.codeHint': 'Ruwe HTML bewerken met live voorbeeld',\r\n 'action.preview': 'Voorbeeld',\r\n 'action.export': 'Exporteren',\r\n 'device.desktop': 'Desktop',\r\n 'device.desktopHint': 'Desktopbreedte',\r\n 'device.mobile': 'Mobiel',\r\n 'device.mobileHint': 'Mobiele breedte',\r\n 'device.dark': 'Donker',\r\n 'device.darkHint': 'Donkere inbox',\r\n 'status.autosaveOn': 'automatisch opslaan aan',\r\n 'status.saved': 'opgeslagen {time}',\r\n 'status.saveFailed': 'niet opgeslagen — opslag vol',\r\n 'canvas.meta': '{rows} rijen · {blocks} blokken · {width}px',\r\n 'tab.design': 'Stijl',\r\n 'tab.designHint': 'Selectie stylen',\r\n 'tab.blocks': 'Blokken',\r\n 'tab.blocksHint': 'Inhoudsblokken en variabelen',\r\n 'tab.rows': 'Secties',\r\n 'tab.rowsHint': 'Sectielay-outs en canvasmodel',\r\n 'tab.files': 'Bestanden',\r\n 'tab.filesHint': 'Bibliotheek met bestanden',\r\n 'tab.layers': 'Structuur',\r\n 'tab.layersHint': 'Documentstructuur',\r\n 'tab.theme': 'Thema',\r\n 'tab.themeHint': 'Globale stijlen',\r\n 'tab.data': 'Var.',\r\n 'tab.dataHint': 'Variabelen aangeleverd door jouw code',\r\n 'inspector.blockProperties': 'Blokeigenschappen',\r\n 'inspector.sectionProperties': 'Sectie-eigenschappen',\r\n 'inspector.title': 'Inspecteur',\r\n 'inspector.sectionLabel': 'Sectie',\r\n 'inspector.nothingSelected': 'Niets geselecteerd',\r\n 'action.duplicateHint': 'Dupliceren — ⌘D',\r\n 'action.deleteHint': 'Verwijderen — ⌫',\r\n 'inspector.emptyBody':\r\n 'Kies een rij of blok op het canvas om het hier te stylen. Sleep blokken vanuit het tabblad <strong style=\"color: var(--ed-text); font-weight: 600;\">Blokken</strong>; dubbelklik op tekst om deze direct te bewerken.',\r\n 'inspector.shortcuts': 'Sneltoetsen',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — ongedaan maken, opnieuw',\r\n 'shortcut.duplicate': '⌘D — selectie dupliceren',\r\n 'shortcut.delete': '⌫ — selectie verwijderen',\r\n 'shortcut.export': '⌘E — HTML exporteren',\r\n 'shortcut.escape': 'ESC — selectie opheffen, sluiten',\r\n 'blocks.dragHint': 'Sleep naar het canvas',\r\n 'blocks.count': '{count} blokken',\r\n 'rows.sectionLayouts': 'Sectielay-outs',\r\n 'rows.customMarkup': 'Aangepaste opmaak',\r\n 'rows.htmlRowHint': 'Sleep om in te voegen, of klik om toe te voegen — een volledige rij die je vult met ruwe HTML',\r\n 'rows.rawHtmlSection': 'Ruwe HTML-sectie',\r\n 'rows.rawHtmlDesc': 'Volledige sectie, jouw eigen opmaak, nog steeds versleepbaar',\r\n 'rows.canvasModel': 'Canvasmodel',\r\n 'rows.modeRowBased': 'Op rijen gebaseerd',\r\n 'rows.modeFreeStack': 'Vrije stapel',\r\n 'rows.hintRows':\r\n 'Op secties gebaseerd: plaats eerst een lay-out, sleep dan blokken in de kolommen — elke sectie heeft zijn eigen achtergrond, rand, flex- of gridinstellingen.',\r\n 'rows.hintStack': 'Vrije stapel: zonder lay-outs — elk blok dat je plaatst wordt een eigen sectie over de volle breedte, op volgorde gestapeld.',\r\n 'files.libraryCount': 'Bibliotheek — {count} bestanden',\r\n 'files.openManager': 'Bestandsbeheer openen',\r\n 'files.dragToCanvas': 'Sleep elk bestand direct naar het canvas om het als afbeeldingsblok te plaatsen.',\r\n 'layers.structure': 'Structuur',\r\n 'layers.sectionSingle': 'Sectie',\r\n 'layers.sectionMulti': 'Sectie · {count} kol.',\r\n 'layers.blockCount': '{count} bl.',\r\n 'theme.globalStyles': 'Globale stijlen',\r\n 'vars.title': 'Variabelen',\r\n 'vars.fromCode': '{count} uit jouw code',\r\n 'vars.declaredNote': 'Gedeclareerd door jouw applicatie — het canvas toont altijd het token, nooit een waarde.',\r\n 'vars.filterPlaceholder': 'Variabelen filteren…',\r\n 'vars.insertHint': 'Klik om in te voegen in geselecteerde tekst, kop of knop',\r\n 'vars.insert': 'invoegen',\r\n 'vars.noMatch': 'Geen variabele komt overeen met dit filter.',\r\n 'vars.noneDeclared': 'Jouw applicatie heeft nog geen variabelen gedeclareerd.',\r\n 'vars.rteHint': 'Tijdens het bewerken van tekst kun je ook een variabele kiezen via het dropdownmenu van de inline werkbalk.',\r\n 'modal.fileManager': 'Bestandsbeheer',\r\n 'modal.assetsTitle': 'Bestanden',\r\n 'modal.replaceImage': 'Afbeelding vervangen',\r\n 'library.searchPlaceholder': 'Bestanden zoeken…',\r\n 'action.upload': 'Uploaden',\r\n 'library.clickToPlace': 'Klik op een bestand om te plaatsen · of sleep een bestand naar het canvas',\r\n 'library.clickToReplace': 'Klik op een bestand om de geselecteerde afbeelding te vervangen',\r\n 'library.storageLabel': '{count} bestanden · {size}',\r\n 'library.folders': 'Mappen',\r\n 'library.dropHint': 'Zet afbeeldingsbestanden hier neer om te uploaden — of gebruik de knop Uploaden.',\r\n 'library.deleteFileHint': 'Bestand verwijderen',\r\n 'library.del': 'VERW',\r\n 'toast.assetDeleted': '{name} verwijderd',\r\n 'modal.export': 'Exporteren',\r\n 'modal.exportTitle': 'Op tabellen gebaseerde e-mail-HTML',\r\n 'export.copy': 'Kopiëren',\r\n 'export.copied': 'Gekopieerd',\r\n 'action.download': 'Downloaden',\r\n 'export.meta': '{kb} KB · tabellen + inline stijlen · Outlook-veilige breedtes',\r\n 'modal.rawHtmlTitle': 'Ruwe HTML, live voorbeeld',\r\n 'code.statusEdited': 'Codeweergave — bewerkt — voorbeeld live, nog niet toegepast',\r\n 'code.statusSynced': 'Codeweergave — gesynchroniseerd met het canvas',\r\n 'action.reload': 'Herladen',\r\n 'action.reloadHint': 'Bron herladen vanuit het canvas',\r\n 'action.applyToCanvas': 'Toepassen op canvas',\r\n 'action.applyToCanvasHint': 'Bron opnieuw ontleden tot bewerkbare rijen',\r\n 'action.closeWithoutApplyingHint': 'Sluiten zonder toe te passen',\r\n 'code.source': 'Bron',\r\n 'code.livePreview': 'Live voorbeeld',\r\n 'code.liveHtmlPreviewTitle': 'Live HTML-voorbeeld',\r\n 'code.applyNote':\r\n 'Toepassen ontleedt elke tabelrij op het hoogste niveau tot een canvasrij die je nog kunt selecteren, herschikken en verwijderen — handgeschreven opmaak overleeft de omzetting.',\r\n 'code.meta': '{kb} KB · {lines} regels',\r\n 'toast.sourceReloaded': 'Bron herladen vanuit het canvas',\r\n 'toast.sourceAppliedOne': 'Bron toegepast — 1 rij op het canvas',\r\n 'toast.sourceAppliedMany': 'Bron toegepast — {rows} rijen op het canvas',\r\n 'toast.parseError': 'Kan die HTML niet ontleden',\r\n 'modal.copyAssist': 'Tekstassistent',\r\n 'modal.draftCopyTitle': 'Tekst opstellen voor deze campagne',\r\n 'ai.goal': 'Doel',\r\n 'ai.tone': 'Toon',\r\n 'ai.briefLabel': 'Waar gaat deze e-mail over?',\r\n 'ai.briefPlaceholder': 'bijv. Herfstcollectie, 15% voor abonnees, gratis verzending vanaf €150',\r\n 'ai.generate': 'Tekst genereren',\r\n 'ai.writing': 'Bezig met schrijven…',\r\n 'ai.kindHeadline': 'Kop',\r\n 'ai.kindBody': 'Hoofdtekst',\r\n 'ai.kindButton': 'Knoptekst',\r\n 'ai.actionInsertHeading': 'Invoegen als kop',\r\n 'ai.actionInsertText': 'Invoegen als tekstblok',\r\n 'ai.actionInsertButton': 'Invoegen als knop',\r\n 'toast.headingAdded': 'Kop toegevoegd',\r\n 'toast.textBlockAdded': 'Tekstblok toegevoegd',\r\n 'toast.buttonAdded': 'Knop toegevoegd',\r\n 'preview.kickerMobile': 'Voorbeeld — mobiel 375px',\r\n 'preview.kickerDark': 'Voorbeeld — donkere inbox',\r\n 'preview.kickerDesktop': 'Voorbeeld — desktop {width}px',\r\n 'action.close': 'Sluiten',\r\n 'toast.duplicated': 'Gedupliceerd',\r\n 'toast.fileUploadedOne': '1 bestand geüpload',\r\n 'toast.fileUploadedMany': '{count} bestanden geüpload',\r\n 'toast.imageReplaced': 'Afbeelding vervangen',\r\n 'toast.imageAdded': 'Afbeelding toegevoegd aan canvas',\r\n 'toast.htmlCopied': 'HTML gekopieerd naar klembord',\r\n 'toast.templateLoaded': '{name} geladen',\r\n 'toast.snippetDefaultLabel': 'Fragment',\r\n 'toast.snippetInserted': '{name} ingevoegd',\r\n 'toast.snippetCopied': '{name} gekopieerd — selecteer een tekstblok om in te voegen',\r\n};\r\n\r\n\nObject.assign(exports, { NL });\n\n};\n__modules[\"core/i18n/pl.js\"] = function(module, exports, __require) {\n/** Polish (Polski) — `pl`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst PL = {\r\n 'action.undoHint': 'Cofnij — ⌘Z',\r\n 'action.redoHint': 'Ponów — ⌘⇧Z',\r\n 'action.chromeToDark': 'Ciemny',\r\n 'action.chromeToLight': 'Jasny',\r\n 'action.chromeHint': 'Motyw edytora jasny / ciemny',\r\n 'action.aiCopy': 'Tekst',\r\n 'action.aiCopyHint': 'Napisz tekst przy pomocy AI',\r\n 'action.code': 'Kod',\r\n 'action.codeHint': 'Edytuj surowy HTML z podglądem na żywo',\r\n 'action.preview': 'Podgląd',\r\n 'action.export': 'Eksportuj',\r\n 'device.desktop': 'Komputer',\r\n 'device.desktopHint': 'Szerokość na komputerze',\r\n 'device.mobile': 'Telefon',\r\n 'device.mobileHint': 'Szerokość na telefonie',\r\n 'device.dark': 'Ciemny',\r\n 'device.darkHint': 'Ciemny tryb skrzynki',\r\n 'status.autosaveOn': 'automatyczny zapis włączony',\r\n 'status.saved': 'zapisano {time}',\r\n 'status.saveFailed': 'nie zapisano — brak miejsca',\r\n 'canvas.meta': '{rows} wierszy · {blocks} bloków · {width}px',\r\n 'tab.design': 'Styl',\r\n 'tab.designHint': 'Stylizuj zaznaczenie',\r\n 'tab.blocks': 'Bloki',\r\n 'tab.blocksHint': 'Bloki treści i zmienne',\r\n 'tab.rows': 'Sekcje',\r\n 'tab.rowsHint': 'Układy sekcji i model płótna',\r\n 'tab.files': 'Pliki',\r\n 'tab.filesHint': 'Biblioteka zasobów',\r\n 'tab.layers': 'Struktura',\r\n 'tab.layersHint': 'Struktura dokumentu',\r\n 'tab.theme': 'Motyw',\r\n 'tab.themeHint': 'Style globalne',\r\n 'tab.data': 'Zmien.',\r\n 'tab.dataHint': 'Zmienne dostarczone przez Twój kod',\r\n 'inspector.blockProperties': 'Właściwości bloku',\r\n 'inspector.sectionProperties': 'Właściwości sekcji',\r\n 'inspector.title': 'Inspektor',\r\n 'inspector.sectionLabel': 'Sekcja',\r\n 'inspector.nothingSelected': 'Nic nie zaznaczono',\r\n 'action.duplicateHint': 'Duplikuj — ⌘D',\r\n 'action.deleteHint': 'Usuń — ⌫',\r\n 'inspector.emptyBody':\r\n 'Wybierz wiersz lub blok na płótnie, aby go tutaj stylizować. Przeciągnij bloki z zakładki <strong style=\"color: var(--ed-text); font-weight: 600;\">Bloki</strong>; kliknij dwukrotnie dowolny tekst, aby edytować go w miejscu.',\r\n 'inspector.shortcuts': 'Skróty',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — cofnij, ponów',\r\n 'shortcut.duplicate': '⌘D — duplikuj zaznaczenie',\r\n 'shortcut.delete': '⌫ — usuń zaznaczenie',\r\n 'shortcut.export': '⌘E — eksportuj HTML',\r\n 'shortcut.escape': 'ESC — odznacz, zamknij',\r\n 'blocks.dragHint': 'Przeciągnij na płótno',\r\n 'blocks.count': '{count} bloków',\r\n 'rows.sectionLayouts': 'Układy sekcji',\r\n 'rows.customMarkup': 'Własny znacznik',\r\n 'rows.htmlRowHint': 'Przeciągnij, aby wstawić, lub kliknij, aby dodać — pełnowymiarowy wiersz, który wypełniasz surowym HTML',\r\n 'rows.rawHtmlSection': 'Sekcja surowego HTML',\r\n 'rows.rawHtmlDesc': 'Pełnowymiarowa sekcja, Twój własny kod, wciąż przeciągalna',\r\n 'rows.canvasModel': 'Model płótna',\r\n 'rows.modeRowBased': 'Oparty na wierszach',\r\n 'rows.modeFreeStack': 'Wolny stos',\r\n 'rows.hintRows':\r\n 'Oparty na sekcjach: najpierw upuść układ, potem bloki w jego kolumnach — każda sekcja ma własne tło, obramowanie, ustawienia flex lub siatki.',\r\n 'rows.hintStack': 'Wolny stos: bez układów — każdy upuszczony blok staje się osobną, pełnowymiarową sekcją, ułożoną w kolejności.',\r\n 'files.libraryCount': 'Biblioteka — {count} plików',\r\n 'files.openManager': 'Otwórz menedżera plików',\r\n 'files.dragToCanvas': 'Przeciągnij dowolny plik bezpośrednio na płótno, aby umieścić go jako blok obrazu.',\r\n 'layers.structure': 'Struktura',\r\n 'layers.sectionSingle': 'Sekcja',\r\n 'layers.sectionMulti': 'Sekcja · {count} kol.',\r\n 'layers.blockCount': '{count} bl.',\r\n 'theme.globalStyles': 'Style globalne',\r\n 'vars.title': 'Zmienne',\r\n 'vars.fromCode': '{count} z Twojego kodu',\r\n 'vars.declaredNote': 'Zadeklarowane przez Twoją aplikację — płótno zawsze pokazuje token, nigdy wartość.',\r\n 'vars.filterPlaceholder': 'Filtruj zmienne…',\r\n 'vars.insertHint': 'Kliknij, aby wstawić do zaznaczonego tekstu, nagłówka lub przycisku',\r\n 'vars.insert': 'wstaw',\r\n 'vars.noMatch': 'Żadna zmienna nie pasuje do tego filtra.',\r\n 'vars.noneDeclared': 'Twoja aplikacja nie zadeklarowała jeszcze żadnych zmiennych.',\r\n 'vars.rteHint': 'Podczas edycji tekstu możesz też wybrać zmienną bezpośrednio z rozwijanego menu paska narzędzi.',\r\n 'modal.fileManager': 'Menedżer plików',\r\n 'modal.assetsTitle': 'Zasoby',\r\n 'modal.replaceImage': 'Zastąp obraz',\r\n 'library.searchPlaceholder': 'Szukaj plików…',\r\n 'action.upload': 'Prześlij',\r\n 'library.clickToPlace': 'Kliknij plik, aby go umieścić · lub przeciągnij plik na płótno',\r\n 'library.clickToReplace': 'Kliknij plik, aby zastąpić zaznaczony obraz',\r\n 'library.storageLabel': '{count} plików · {size}',\r\n 'library.folders': 'Foldery',\r\n 'library.dropHint': 'Upuść tutaj pliki obrazów, aby je przesłać — lub użyj przycisku Prześlij.',\r\n 'library.deleteFileHint': 'Usuń plik',\r\n 'library.del': 'USUŃ',\r\n 'toast.assetDeleted': 'Usunięto {name}',\r\n 'modal.export': 'Eksportuj',\r\n 'modal.exportTitle': 'HTML e-maila oparty na tabelach',\r\n 'export.copy': 'Kopiuj',\r\n 'export.copied': 'Skopiowano',\r\n 'action.download': 'Pobierz',\r\n 'export.meta': '{kb} KB · tabele + style inline · szerokości bezpieczne dla Outlooka',\r\n 'modal.rawHtmlTitle': 'Surowy HTML, podgląd na żywo',\r\n 'code.statusEdited': 'Widok kodu — edytowany — podgląd na żywo, jeszcze nie zastosowano',\r\n 'code.statusSynced': 'Widok kodu — zsynchronizowany z płótnem',\r\n 'action.reload': 'Odśwież',\r\n 'action.reloadHint': 'Odśwież źródło z płótna',\r\n 'action.applyToCanvas': 'Zastosuj do płótna',\r\n 'action.applyToCanvasHint': 'Przeanalizuj źródło z powrotem na edytowalne wiersze',\r\n 'action.closeWithoutApplyingHint': 'Zamknij bez zastosowania',\r\n 'code.source': 'Źródło',\r\n 'code.livePreview': 'Podgląd na żywo',\r\n 'code.liveHtmlPreviewTitle': 'Podgląd HTML na żywo',\r\n 'code.applyNote':\r\n 'Zastosowanie analizuje każdy wiersz tabeli najwyższego poziomu na wiersz płótna, który nadal można zaznaczać, zmieniać kolejność i usuwać — ręcznie napisany kod przetrwa ten proces.',\r\n 'code.meta': '{kb} KB · {lines} wierszy',\r\n 'toast.sourceReloaded': 'Odświeżono źródło z płótna',\r\n 'toast.sourceAppliedOne': 'Zastosowano źródło — 1 wiersz na płótnie',\r\n 'toast.sourceAppliedMany': 'Zastosowano źródło — {rows} wierszy na płótnie',\r\n 'toast.parseError': 'Nie udało się przeanalizować tego HTML',\r\n 'modal.copyAssist': 'Asystent tekstu',\r\n 'modal.draftCopyTitle': 'Napisz tekst dla tej kampanii',\r\n 'ai.goal': 'Cel',\r\n 'ai.tone': 'Ton',\r\n 'ai.briefLabel': 'Czego dotyczy ten e-mail?',\r\n 'ai.briefPlaceholder': 'np. Kolekcja jesienna, 15% dla subskrybentów, darmowa dostawa od 150 zł',\r\n 'ai.generate': 'Generuj tekst',\r\n 'ai.writing': 'Piszę…',\r\n 'ai.kindHeadline': 'Nagłówek',\r\n 'ai.kindBody': 'Treść główna',\r\n 'ai.kindButton': 'Tekst przycisku',\r\n 'ai.actionInsertHeading': 'Wstaw jako nagłówek',\r\n 'ai.actionInsertText': 'Wstaw jako blok tekstu',\r\n 'ai.actionInsertButton': 'Wstaw jako przycisk',\r\n 'toast.headingAdded': 'Dodano nagłówek',\r\n 'toast.textBlockAdded': 'Dodano blok tekstu',\r\n 'toast.buttonAdded': 'Dodano przycisk',\r\n 'preview.kickerMobile': 'Podgląd — telefon 375px',\r\n 'preview.kickerDark': 'Podgląd — ciemna skrzynka',\r\n 'preview.kickerDesktop': 'Podgląd — komputer {width}px',\r\n 'action.close': 'Zamknij',\r\n 'toast.duplicated': 'Zduplikowano',\r\n 'toast.fileUploadedOne': 'Przesłano 1 plik',\r\n 'toast.fileUploadedMany': 'Przesłano {count} plików',\r\n 'toast.imageReplaced': 'Zastąpiono obraz',\r\n 'toast.imageAdded': 'Dodano obraz do płótna',\r\n 'toast.htmlCopied': 'Skopiowano HTML do schowka',\r\n 'toast.templateLoaded': 'Wczytano {name}',\r\n 'toast.snippetDefaultLabel': 'Fragment',\r\n 'toast.snippetInserted': 'Wstawiono {name}',\r\n 'toast.snippetCopied': 'Skopiowano {name} — zaznacz blok tekstu, aby go wstawić',\r\n};\r\n\r\n\nObject.assign(exports, { PL });\n\n};\n__modules[\"core/i18n/pt.js\"] = function(module, exports, __require) {\n/** Portuguese (Português) — `pt`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst PT = {\r\n 'action.undoHint': 'Desfazer — ⌘Z',\r\n 'action.redoHint': 'Refazer — ⌘⇧Z',\r\n 'action.chromeToDark': 'Escuro',\r\n 'action.chromeToLight': 'Claro',\r\n 'action.chromeHint': 'Tema do editor claro / escuro',\r\n 'action.aiCopy': 'Texto',\r\n 'action.aiCopyHint': 'Redigir texto com IA',\r\n 'action.code': 'Código',\r\n 'action.codeHint': 'Editar o HTML bruto com pré-visualização ao vivo',\r\n 'action.preview': 'Pré-visualizar',\r\n 'action.export': 'Exportar',\r\n 'device.desktop': 'Desktop',\r\n 'device.desktopHint': 'Largura desktop',\r\n 'device.mobile': 'Móvel',\r\n 'device.mobileHint': 'Largura móvel',\r\n 'device.dark': 'Escuro',\r\n 'device.darkHint': 'Caixa de entrada escura',\r\n 'status.autosaveOn': 'salvamento automático ativado',\r\n 'status.saved': 'salvo {time}',\r\n 'status.saveFailed': 'não salvo — armazenamento cheio',\r\n 'canvas.meta': '{rows} linhas · {blocks} blocos · {width}px',\r\n 'tab.design': 'Estilo',\r\n 'tab.designHint': 'Estilizar a seleção',\r\n 'tab.blocks': 'Blocos',\r\n 'tab.blocksHint': 'Blocos de conteúdo e variáveis',\r\n 'tab.rows': 'Seções',\r\n 'tab.rowsHint': 'Layouts de seção e modelo de tela',\r\n 'tab.files': 'Arquivos',\r\n 'tab.filesHint': 'Biblioteca de recursos',\r\n 'tab.layers': 'Estrutura',\r\n 'tab.layersHint': 'Estrutura do documento',\r\n 'tab.theme': 'Tema',\r\n 'tab.themeHint': 'Estilos globais',\r\n 'tab.data': 'Var.',\r\n 'tab.dataHint': 'Variáveis fornecidas pelo seu código',\r\n 'inspector.blockProperties': 'Propriedades do bloco',\r\n 'inspector.sectionProperties': 'Propriedades da seção',\r\n 'inspector.title': 'Inspetor',\r\n 'inspector.sectionLabel': 'Seção',\r\n 'inspector.nothingSelected': 'Nada selecionado',\r\n 'action.duplicateHint': 'Duplicar — ⌘D',\r\n 'action.deleteHint': 'Excluir — ⌫',\r\n 'inspector.emptyBody':\r\n 'Selecione uma linha ou um bloco na tela para estilizá-lo aqui. Arraste blocos da aba <strong style=\"color: var(--ed-text); font-weight: 600;\">Blocos</strong>; clique duas vezes em qualquer texto para editá-lo diretamente.',\r\n 'inspector.shortcuts': 'Atalhos',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — desfazer, refazer',\r\n 'shortcut.duplicate': '⌘D — duplicar seleção',\r\n 'shortcut.delete': '⌫ — excluir seleção',\r\n 'shortcut.export': '⌘E — exportar HTML',\r\n 'shortcut.escape': 'ESC — desmarcar, fechar',\r\n 'blocks.dragHint': 'Arraste para a tela',\r\n 'blocks.count': '{count} blocos',\r\n 'rows.sectionLayouts': 'Layouts de seção',\r\n 'rows.customMarkup': 'Marcação personalizada',\r\n 'rows.htmlRowHint': 'Arraste para inserir, ou clique para adicionar — uma linha de sangria total que você preenche com HTML bruto',\r\n 'rows.rawHtmlSection': 'Seção de HTML bruto',\r\n 'rows.rawHtmlDesc': 'Seção de sangria total, sua própria marcação, ainda arrastável',\r\n 'rows.canvasModel': 'Modelo de tela',\r\n 'rows.modeRowBased': 'Baseado em linhas',\r\n 'rows.modeFreeStack': 'Pilha livre',\r\n 'rows.hintRows':\r\n 'Baseado em seções: solte um layout primeiro, depois blocos em suas colunas — cada seção tem seu próprio fundo, borda, configurações flex ou grade.',\r\n 'rows.hintStack': 'Pilha livre: sem layouts — cada bloco que você solta se torna sua própria seção de largura total, empilhada em ordem.',\r\n 'files.libraryCount': 'Biblioteca — {count} arquivos',\r\n 'files.openManager': 'Abrir gerenciador de arquivos',\r\n 'files.dragToCanvas': 'Arraste qualquer arquivo diretamente para a tela para colocá-lo como bloco de imagem.',\r\n 'layers.structure': 'Estrutura',\r\n 'layers.sectionSingle': 'Seção',\r\n 'layers.sectionMulti': 'Seção · {count} col.',\r\n 'layers.blockCount': '{count} bl.',\r\n 'theme.globalStyles': 'Estilos globais',\r\n 'vars.title': 'Variáveis',\r\n 'vars.fromCode': '{count} do seu código',\r\n 'vars.declaredNote': 'Declaradas pela sua aplicação — a tela sempre mostra o token, nunca um valor.',\r\n 'vars.filterPlaceholder': 'Filtrar variáveis…',\r\n 'vars.insertHint': 'Clique para inserir no texto, título ou botão selecionado',\r\n 'vars.insert': 'inserir',\r\n 'vars.noMatch': 'Nenhuma variável corresponde a esse filtro.',\r\n 'vars.noneDeclared': 'Sua aplicação ainda não declarou nenhuma variável.',\r\n 'vars.rteHint': 'Ao editar texto, você também pode escolher uma variável diretamente no menu da barra de ferramentas em linha.',\r\n 'modal.fileManager': 'Gerenciador de arquivos',\r\n 'modal.assetsTitle': 'Recursos',\r\n 'modal.replaceImage': 'Substituir imagem',\r\n 'library.searchPlaceholder': 'Pesquisar arquivos…',\r\n 'action.upload': 'Enviar',\r\n 'library.clickToPlace': 'Clique em um arquivo para posicioná-lo · ou arraste um arquivo para a tela',\r\n 'library.clickToReplace': 'Clique em um arquivo para substituir a imagem selecionada',\r\n 'library.storageLabel': '{count} arquivos · {size}',\r\n 'library.folders': 'Pastas',\r\n 'library.dropHint': 'Solte arquivos de imagem aqui para enviá-los — ou use o botão Enviar.',\r\n 'library.deleteFileHint': 'Excluir arquivo',\r\n 'library.del': 'EXCL',\r\n 'toast.assetDeleted': '{name} excluído',\r\n 'modal.export': 'Exportar',\r\n 'modal.exportTitle': 'HTML de e-mail baseado em tabelas',\r\n 'export.copy': 'Copiar',\r\n 'export.copied': 'Copiado',\r\n 'action.download': 'Baixar',\r\n 'export.meta': '{kb} KB · tabelas + estilos inline · larguras seguras para o Outlook',\r\n 'modal.rawHtmlTitle': 'HTML bruto, pré-visualização ao vivo',\r\n 'code.statusEdited': 'Visualização de código — editado — pré-visualização ao vivo, ainda não aplicado',\r\n 'code.statusSynced': 'Visualização de código — sincronizado com a tela',\r\n 'action.reload': 'Recarregar',\r\n 'action.reloadHint': 'Recarregar a origem a partir da tela',\r\n 'action.applyToCanvas': 'Aplicar à tela',\r\n 'action.applyToCanvasHint': 'Analisar a origem novamente em linhas editáveis',\r\n 'action.closeWithoutApplyingHint': 'Fechar sem aplicar',\r\n 'code.source': 'Origem',\r\n 'code.livePreview': 'Pré-visualização ao vivo',\r\n 'code.liveHtmlPreviewTitle': 'Pré-visualização de HTML ao vivo',\r\n 'code.applyNote':\r\n 'Aplicar analisa cada linha de tabela de nível superior em uma linha de tela que você ainda pode selecionar, reordenar e excluir — a marcação escrita à mão sobrevive ao processo.',\r\n 'code.meta': '{kb} KB · {lines} linhas',\r\n 'toast.sourceReloaded': 'Origem recarregada a partir da tela',\r\n 'toast.sourceAppliedOne': 'Origem aplicada — 1 linha na tela',\r\n 'toast.sourceAppliedMany': 'Origem aplicada — {rows} linhas na tela',\r\n 'toast.parseError': 'Não foi possível analisar esse HTML',\r\n 'modal.copyAssist': 'Assistente de redação',\r\n 'modal.draftCopyTitle': 'Redigir texto para esta campanha',\r\n 'ai.goal': 'Objetivo',\r\n 'ai.tone': 'Tom',\r\n 'ai.briefLabel': 'Sobre o que é este e-mail?',\r\n 'ai.briefPlaceholder': 'ex. Coleção de outono, 15% para assinantes, frete grátis acima de R$150',\r\n 'ai.generate': 'Gerar texto',\r\n 'ai.writing': 'Escrevendo…',\r\n 'ai.kindHeadline': 'Título',\r\n 'ai.kindBody': 'Corpo do texto',\r\n 'ai.kindButton': 'Texto do botão',\r\n 'ai.actionInsertHeading': 'Inserir como título',\r\n 'ai.actionInsertText': 'Inserir como bloco de texto',\r\n 'ai.actionInsertButton': 'Inserir como botão',\r\n 'toast.headingAdded': 'Título adicionado',\r\n 'toast.textBlockAdded': 'Bloco de texto adicionado',\r\n 'toast.buttonAdded': 'Botão adicionado',\r\n 'preview.kickerMobile': 'Pré-visualização — móvel 375px',\r\n 'preview.kickerDark': 'Pré-visualização — caixa escura',\r\n 'preview.kickerDesktop': 'Pré-visualização — desktop {width}px',\r\n 'action.close': 'Fechar',\r\n 'toast.duplicated': 'Duplicado',\r\n 'toast.fileUploadedOne': '1 arquivo enviado',\r\n 'toast.fileUploadedMany': '{count} arquivos enviados',\r\n 'toast.imageReplaced': 'Imagem substituída',\r\n 'toast.imageAdded': 'Imagem adicionada à tela',\r\n 'toast.htmlCopied': 'HTML copiado para a área de transferência',\r\n 'toast.templateLoaded': '{name} carregado',\r\n 'toast.snippetDefaultLabel': 'Trecho',\r\n 'toast.snippetInserted': '{name} inserido',\r\n 'toast.snippetCopied': '{name} copiado — selecione um bloco de texto para inseri-lo',\r\n};\r\n\r\n\nObject.assign(exports, { PT });\n\n};\n__modules[\"core/i18n/ro.js\"] = function(module, exports, __require) {\n/** Romanian (Română) — `ro`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst RO = {\r\n 'action.undoHint': 'Anulează — ⌘Z',\r\n 'action.redoHint': 'Refă — ⌘⇧Z',\r\n 'action.chromeToDark': 'Întunecat',\r\n 'action.chromeToLight': 'Luminos',\r\n 'action.chromeHint': 'Temă editor luminoasă / întunecată',\r\n 'action.aiCopy': 'Text',\r\n 'action.aiCopyHint': 'Redactează text cu AI',\r\n 'action.code': 'Cod',\r\n 'action.codeHint': 'Editează HTML brut cu previzualizare live',\r\n 'action.preview': 'Previzualizare',\r\n 'action.export': 'Exportă',\r\n 'device.desktop': 'Desktop',\r\n 'device.desktopHint': 'Lățime desktop',\r\n 'device.mobile': 'Mobil',\r\n 'device.mobileHint': 'Lățime mobil',\r\n 'device.dark': 'Întunecat',\r\n 'device.darkHint': 'Mod întunecat pentru inbox',\r\n 'status.autosaveOn': 'salvare automată activă',\r\n 'status.saved': 'salvat {time}',\r\n 'status.saveFailed': 'nu s-a salvat — stocare plină',\r\n 'canvas.meta': '{rows} rânduri · {blocks} blocuri · {width}px',\r\n 'tab.design': 'Stil',\r\n 'tab.designHint': 'Stilizează selecția',\r\n 'tab.blocks': 'Blocuri',\r\n 'tab.blocksHint': 'Blocuri de conținut și variabile',\r\n 'tab.rows': 'Secțiuni',\r\n 'tab.rowsHint': 'Aspecte de secțiuni și model de canvas',\r\n 'tab.files': 'Fișiere',\r\n 'tab.filesHint': 'Bibliotecă de resurse',\r\n 'tab.layers': 'Structură',\r\n 'tab.layersHint': 'Structura documentului',\r\n 'tab.theme': 'Temă',\r\n 'tab.themeHint': 'Stiluri globale',\r\n 'tab.data': 'Var.',\r\n 'tab.dataHint': 'Variabile furnizate de codul dvs.',\r\n 'inspector.blockProperties': 'Proprietățile blocului',\r\n 'inspector.sectionProperties': 'Proprietățile secțiunii',\r\n 'inspector.title': 'Inspector',\r\n 'inspector.sectionLabel': 'Secțiune',\r\n 'inspector.nothingSelected': 'Nimic selectat',\r\n 'action.duplicateHint': 'Duplică — ⌘D',\r\n 'action.deleteHint': 'Șterge — ⌫',\r\n 'inspector.emptyBody':\r\n 'Selectați un rând sau un bloc pe canvas pentru a-l stiliza aici. Trageți blocuri din fila <strong style=\"color: var(--ed-text); font-weight: 600;\">Blocuri</strong>; dați dublu clic pe orice text pentru a-l edita direct.',\r\n 'inspector.shortcuts': 'Comenzi rapide',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — anulează, refă',\r\n 'shortcut.duplicate': '⌘D — duplică selecția',\r\n 'shortcut.delete': '⌫ — șterge selecția',\r\n 'shortcut.export': '⌘E — exportă HTML',\r\n 'shortcut.escape': 'ESC — deselectează, închide',\r\n 'blocks.dragHint': 'Trageți pe canvas',\r\n 'blocks.count': '{count} blocuri',\r\n 'rows.sectionLayouts': 'Aspecte de secțiuni',\r\n 'rows.customMarkup': 'Cod personalizat',\r\n 'rows.htmlRowHint': 'Trageți pentru a insera, sau dați clic pentru a adăuga — un rând pe toată lățimea pe care îl completați cu HTML brut',\r\n 'rows.rawHtmlSection': 'Secțiune HTML brut',\r\n 'rows.rawHtmlDesc': 'Secțiune pe toată lățimea, codul dvs. propriu, în continuare se poate trage',\r\n 'rows.canvasModel': 'Model canvas',\r\n 'rows.modeRowBased': 'Bazat pe rânduri',\r\n 'rows.modeFreeStack': 'Stivă liberă',\r\n 'rows.hintRows':\r\n 'Bazat pe secțiuni: plasați mai întâi un aspect, apoi blocuri în coloanele sale — fiecare secțiune are propriul fundal, bordură, setări flex sau grilă.',\r\n 'rows.hintStack': 'Stivă liberă: fără aspecte — fiecare bloc plasat devine propria secțiune pe toată lățimea, stivuită în ordine.',\r\n 'files.libraryCount': 'Bibliotecă — {count} fișiere',\r\n 'files.openManager': 'Deschide managerul de fișiere',\r\n 'files.dragToCanvas': 'Trageți orice fișier direct pe canvas pentru a-l plasa ca bloc de imagine.',\r\n 'layers.structure': 'Structură',\r\n 'layers.sectionSingle': 'Secțiune',\r\n 'layers.sectionMulti': 'Secțiune · {count} coloane',\r\n 'layers.blockCount': '{count} bl.',\r\n 'theme.globalStyles': 'Stiluri globale',\r\n 'vars.title': 'Variabile',\r\n 'vars.fromCode': '{count} din codul dvs.',\r\n 'vars.declaredNote': 'Declarate de aplicația dvs. — canvasul afișează întotdeauna tokenul, niciodată o valoare.',\r\n 'vars.filterPlaceholder': 'Filtrează variabilele…',\r\n 'vars.insertHint': 'Dați clic pentru a insera în textul, titlul sau butonul selectat',\r\n 'vars.insert': 'inserează',\r\n 'vars.noMatch': 'Nicio variabilă nu corespunde acestui filtru.',\r\n 'vars.noneDeclared': 'Aplicația dvs. nu a declarat încă nicio variabilă.',\r\n 'vars.rteHint': 'În timp ce editați text, puteți alege o variabilă și direct din meniul derulant al barei de instrumente în linie.',\r\n 'modal.fileManager': 'Manager de fișiere',\r\n 'modal.assetsTitle': 'Resurse',\r\n 'modal.replaceImage': 'Înlocuiește imaginea',\r\n 'library.searchPlaceholder': 'Căutare fișiere…',\r\n 'action.upload': 'Încarcă',\r\n 'library.clickToPlace': 'Dați clic pe un fișier pentru a-l plasa · sau trageți un fișier pe canvas',\r\n 'library.clickToReplace': 'Dați clic pe un fișier pentru a înlocui imaginea selectată',\r\n 'library.storageLabel': '{count} fișiere · {size}',\r\n 'library.folders': 'Foldere',\r\n 'library.dropHint': 'Plasați fișiere imagine aici pentru încărcare — sau folosiți butonul Încarcă.',\r\n 'library.deleteFileHint': 'Șterge fișierul',\r\n 'library.del': 'ȘTERG',\r\n 'toast.assetDeleted': '{name} șters',\r\n 'modal.export': 'Exportă',\r\n 'modal.exportTitle': 'HTML de e-mail bazat pe tabele',\r\n 'export.copy': 'Copiază',\r\n 'export.copied': 'Copiat',\r\n 'action.download': 'Descarcă',\r\n 'export.meta': '{kb} KB · tabele + stiluri inline · lățimi sigure pentru Outlook',\r\n 'modal.rawHtmlTitle': 'HTML brut, previzualizare live',\r\n 'code.statusEdited': 'Vizualizare cod — editat — previzualizare live, încă neaplicat',\r\n 'code.statusSynced': 'Vizualizare cod — sincronizat cu canvasul',\r\n 'action.reload': 'Reîncarcă',\r\n 'action.reloadHint': 'Reîncarcă sursa din canvas',\r\n 'action.applyToCanvas': 'Aplică pe canvas',\r\n 'action.applyToCanvasHint': 'Reanalizează sursa în rânduri editabile',\r\n 'action.closeWithoutApplyingHint': 'Închide fără a aplica',\r\n 'code.source': 'Sursă',\r\n 'code.livePreview': 'Previzualizare live',\r\n 'code.liveHtmlPreviewTitle': 'Previzualizare HTML live',\r\n 'code.applyNote':\r\n 'Aplicarea analizează fiecare rând de tabel de nivel superior într-un rând de canvas pe care îl puteți încă selecta, reordona și șterge — codul scris manual supraviețuiește procesului nemodificat.',\r\n 'code.meta': '{kb} KB · {lines} rânduri',\r\n 'toast.sourceReloaded': 'Sursă reîncărcată din canvas',\r\n 'toast.sourceAppliedOne': 'Sursă aplicată — 1 rând pe canvas',\r\n 'toast.sourceAppliedMany': 'Sursă aplicată — {rows} rânduri pe canvas',\r\n 'toast.parseError': 'Acest HTML nu a putut fi analizat',\r\n 'modal.copyAssist': 'Asistent de redactare',\r\n 'modal.draftCopyTitle': 'Redactează text pentru această campanie',\r\n 'ai.goal': 'Obiectiv',\r\n 'ai.tone': 'Ton',\r\n 'ai.briefLabel': 'Despre ce este acest e-mail?',\r\n 'ai.briefPlaceholder': 'de ex. Colecție de toamnă, 15% pentru abonați, livrare gratuită peste 150 lei',\r\n 'ai.generate': 'Generează text',\r\n 'ai.writing': 'Se scrie…',\r\n 'ai.kindHeadline': 'Titlu',\r\n 'ai.kindBody': 'Text principal',\r\n 'ai.kindButton': 'Text buton',\r\n 'ai.actionInsertHeading': 'Inserează ca titlu',\r\n 'ai.actionInsertText': 'Inserează ca bloc de text',\r\n 'ai.actionInsertButton': 'Inserează ca buton',\r\n 'toast.headingAdded': 'Titlu adăugat',\r\n 'toast.textBlockAdded': 'Bloc de text adăugat',\r\n 'toast.buttonAdded': 'Buton adăugat',\r\n 'preview.kickerMobile': 'Previzualizare — mobil 375px',\r\n 'preview.kickerDark': 'Previzualizare — inbox întunecat',\r\n 'preview.kickerDesktop': 'Previzualizare — desktop {width}px',\r\n 'action.close': 'Închide',\r\n 'toast.duplicated': 'Duplicat',\r\n 'toast.fileUploadedOne': '1 fișier încărcat',\r\n 'toast.fileUploadedMany': '{count} fișiere încărcate',\r\n 'toast.imageReplaced': 'Imagine înlocuită',\r\n 'toast.imageAdded': 'Imagine adăugată pe canvas',\r\n 'toast.htmlCopied': 'HTML copiat în clipboard',\r\n 'toast.templateLoaded': '{name} încărcat',\r\n 'toast.snippetDefaultLabel': 'Fragment',\r\n 'toast.snippetInserted': '{name} inserat',\r\n 'toast.snippetCopied': '{name} copiat — selectați un bloc de text pentru a-l insera',\r\n};\r\n\r\n\nObject.assign(exports, { RO });\n\n};\n__modules[\"core/i18n/ru.js\"] = function(module, exports, __require) {\n/** Russian (Русский) — `ru`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst RU = {\r\n 'action.undoHint': 'Отменить — ⌘Z',\r\n 'action.redoHint': 'Повторить — ⌘⇧Z',\r\n 'action.chromeToDark': 'Тёмная',\r\n 'action.chromeToLight': 'Светлая',\r\n 'action.chromeHint': 'Тема редактора светлая / тёмная',\r\n 'action.aiCopy': 'Текст',\r\n 'action.aiCopyHint': 'Составить текст с помощью ИИ',\r\n 'action.code': 'Код',\r\n 'action.codeHint': 'Редактировать исходный HTML с живым просмотром',\r\n 'action.preview': 'Просмотр',\r\n 'action.export': 'Экспорт',\r\n 'device.desktop': 'Компьютер',\r\n 'device.desktopHint': 'Ширина для компьютера',\r\n 'device.mobile': 'Телефон',\r\n 'device.mobileHint': 'Ширина для телефона',\r\n 'device.dark': 'Тёмная',\r\n 'device.darkHint': 'Тёмный режим входящих',\r\n 'status.autosaveOn': 'автосохранение включено',\r\n 'status.saved': 'сохранено {time}',\r\n 'status.saveFailed': 'не сохранено — хранилище заполнено',\r\n 'canvas.meta': '{rows} строк · {blocks} блоков · {width}px',\r\n 'tab.design': 'Стиль',\r\n 'tab.designHint': 'Оформить выделенное',\r\n 'tab.blocks': 'Блоки',\r\n 'tab.blocksHint': 'Блоки контента и переменные',\r\n 'tab.rows': 'Секции',\r\n 'tab.rowsHint': 'Макеты секций и модель холста',\r\n 'tab.files': 'Файлы',\r\n 'tab.filesHint': 'Библиотека файлов',\r\n 'tab.layers': 'Структура',\r\n 'tab.layersHint': 'Структура документа',\r\n 'tab.theme': 'Тема',\r\n 'tab.themeHint': 'Глобальные стили',\r\n 'tab.data': 'Перем.',\r\n 'tab.dataHint': 'Переменные, предоставленные вашим кодом',\r\n 'inspector.blockProperties': 'Свойства блока',\r\n 'inspector.sectionProperties': 'Свойства секции',\r\n 'inspector.title': 'Инспектор',\r\n 'inspector.sectionLabel': 'Секция',\r\n 'inspector.nothingSelected': 'Ничего не выбрано',\r\n 'action.duplicateHint': 'Дублировать — ⌘D',\r\n 'action.deleteHint': 'Удалить — ⌫',\r\n 'inspector.emptyBody':\r\n 'Выберите строку или блок на холсте, чтобы оформить его здесь. Перетащите блоки со вкладки <strong style=\"color: var(--ed-text); font-weight: 600;\">Блоки</strong>; дважды щёлкните по тексту, чтобы редактировать его на месте.',\r\n 'inspector.shortcuts': 'Горячие клавиши',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — отменить, повторить',\r\n 'shortcut.duplicate': '⌘D — дублировать выделение',\r\n 'shortcut.delete': '⌫ — удалить выделение',\r\n 'shortcut.export': '⌘E — экспортировать HTML',\r\n 'shortcut.escape': 'ESC — снять выделение, закрыть',\r\n 'blocks.dragHint': 'Перетащите на холст',\r\n 'blocks.count': '{count} блоков',\r\n 'rows.sectionLayouts': 'Макеты секций',\r\n 'rows.customMarkup': 'Свой код',\r\n 'rows.htmlRowHint': 'Перетащите, чтобы вставить, или щёлкните, чтобы добавить — строка на всю ширину, которую вы заполняете исходным HTML',\r\n 'rows.rawHtmlSection': 'Секция с исходным HTML',\r\n 'rows.rawHtmlDesc': 'Секция на всю ширину, ваш собственный код, всё ещё перетаскивается',\r\n 'rows.canvasModel': 'Модель холста',\r\n 'rows.modeRowBased': 'На основе строк',\r\n 'rows.modeFreeStack': 'Свободный стек',\r\n 'rows.hintRows':\r\n 'На основе секций: сначала поместите макет, затем блоки в его колонки — у каждой секции свой фон, граница, настройки flex или сетки.',\r\n 'rows.hintStack': 'Свободный стек: без макетов — каждый добавленный блок становится собственной секцией на всю ширину, уложенной по порядку.',\r\n 'files.libraryCount': 'Библиотека — {count} файлов',\r\n 'files.openManager': 'Открыть файловый менеджер',\r\n 'files.dragToCanvas': 'Перетащите любой файл прямо на холст, чтобы разместить его как блок изображения.',\r\n 'layers.structure': 'Структура',\r\n 'layers.sectionSingle': 'Секция',\r\n 'layers.sectionMulti': 'Секция · {count} кол.',\r\n 'layers.blockCount': '{count} бл.',\r\n 'theme.globalStyles': 'Глобальные стили',\r\n 'vars.title': 'Переменные',\r\n 'vars.fromCode': '{count} из вашего кода',\r\n 'vars.declaredNote': 'Объявлены вашим приложением — холст всегда показывает токен, никогда значение.',\r\n 'vars.filterPlaceholder': 'Фильтр переменных…',\r\n 'vars.insertHint': 'Нажмите, чтобы вставить в выбранный текст, заголовок или кнопку',\r\n 'vars.insert': 'вставить',\r\n 'vars.noMatch': 'Нет переменных, соответствующих этому фильтру.',\r\n 'vars.noneDeclared': 'Ваше приложение ещё не объявило переменные.',\r\n 'vars.rteHint': 'При редактировании текста вы также можете выбрать переменную прямо из выпадающего списка встроенной панели инструментов.',\r\n 'modal.fileManager': 'Файловый менеджер',\r\n 'modal.assetsTitle': 'Файлы',\r\n 'modal.replaceImage': 'Заменить изображение',\r\n 'library.searchPlaceholder': 'Поиск файлов…',\r\n 'action.upload': 'Загрузить',\r\n 'library.clickToPlace': 'Нажмите на файл, чтобы разместить · или перетащите файл на холст',\r\n 'library.clickToReplace': 'Нажмите на файл, чтобы заменить выбранное изображение',\r\n 'library.storageLabel': '{count} файлов · {size}',\r\n 'library.folders': 'Папки',\r\n 'library.dropHint': 'Перетащите файлы изображений сюда для загрузки — или используйте кнопку «Загрузить».',\r\n 'library.deleteFileHint': 'Удалить файл',\r\n 'library.del': 'УДАЛ',\r\n 'toast.assetDeleted': '{name} удалён',\r\n 'modal.export': 'Экспорт',\r\n 'modal.exportTitle': 'HTML письма на основе таблиц',\r\n 'export.copy': 'Копировать',\r\n 'export.copied': 'Скопировано',\r\n 'action.download': 'Скачать',\r\n 'export.meta': '{kb} КБ · таблицы + встроенные стили · ширины, безопасные для Outlook',\r\n 'modal.rawHtmlTitle': 'Исходный HTML, живой просмотр',\r\n 'code.statusEdited': 'Просмотр кода — изменён — просмотр в реальном времени, ещё не применено',\r\n 'code.statusSynced': 'Просмотр кода — синхронизирован с холстом',\r\n 'action.reload': 'Обновить',\r\n 'action.reloadHint': 'Обновить исходник из холста',\r\n 'action.applyToCanvas': 'Применить к холсту',\r\n 'action.applyToCanvasHint': 'Разобрать исходник обратно в редактируемые строки',\r\n 'action.closeWithoutApplyingHint': 'Закрыть без применения',\r\n 'code.source': 'Исходник',\r\n 'code.livePreview': 'Живой просмотр',\r\n 'code.liveHtmlPreviewTitle': 'Живой просмотр HTML',\r\n 'code.applyNote':\r\n 'Применение разбирает каждую строку таблицы верхнего уровня в строку холста, которую вы всё ещё можете выбирать, переупорядочивать и удалять — написанный вручную код переживает этот процесс.',\r\n 'code.meta': '{kb} КБ · {lines} строк',\r\n 'toast.sourceReloaded': 'Исходник обновлён из холста',\r\n 'toast.sourceAppliedOne': 'Исходник применён — 1 строка на холсте',\r\n 'toast.sourceAppliedMany': 'Исходник применён — {rows} строк на холсте',\r\n 'toast.parseError': 'Не удалось разобрать этот HTML',\r\n 'modal.copyAssist': 'Помощник по тексту',\r\n 'modal.draftCopyTitle': 'Составить текст для этой кампании',\r\n 'ai.goal': 'Цель',\r\n 'ai.tone': 'Тон',\r\n 'ai.briefLabel': 'О чём это письмо?',\r\n 'ai.briefPlaceholder': 'напр. Осенняя коллекция, 15% для подписчиков, бесплатная доставка от 150$',\r\n 'ai.generate': 'Сгенерировать текст',\r\n 'ai.writing': 'Пишем…',\r\n 'ai.kindHeadline': 'Заголовок',\r\n 'ai.kindBody': 'Основной текст',\r\n 'ai.kindButton': 'Текст кнопки',\r\n 'ai.actionInsertHeading': 'Вставить как заголовок',\r\n 'ai.actionInsertText': 'Вставить как текстовый блок',\r\n 'ai.actionInsertButton': 'Вставить как кнопку',\r\n 'toast.headingAdded': 'Заголовок добавлен',\r\n 'toast.textBlockAdded': 'Текстовый блок добавлен',\r\n 'toast.buttonAdded': 'Кнопка добавлена',\r\n 'preview.kickerMobile': 'Просмотр — телефон 375px',\r\n 'preview.kickerDark': 'Просмотр — тёмные входящие',\r\n 'preview.kickerDesktop': 'Просмотр — компьютер {width}px',\r\n 'action.close': 'Закрыть',\r\n 'toast.duplicated': 'Продублировано',\r\n 'toast.fileUploadedOne': 'Загружен 1 файл',\r\n 'toast.fileUploadedMany': 'Загружено файлов: {count}',\r\n 'toast.imageReplaced': 'Изображение заменено',\r\n 'toast.imageAdded': 'Изображение добавлено на холст',\r\n 'toast.htmlCopied': 'HTML скопирован в буфер обмена',\r\n 'toast.templateLoaded': '{name} загружен',\r\n 'toast.snippetDefaultLabel': 'Фрагмент',\r\n 'toast.snippetInserted': '{name} вставлен',\r\n 'toast.snippetCopied': '{name} скопирован — выберите текстовый блок, чтобы вставить',\r\n};\r\n\r\n\nObject.assign(exports, { RU });\n\n};\n__modules[\"core/i18n/sk.js\"] = function(module, exports, __require) {\n/** Slovak (Slovenčina) — `sk`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst SK = {\r\n 'action.undoHint': 'Späť — ⌘Z',\r\n 'action.redoHint': 'Znova — ⌘⇧Z',\r\n 'action.chromeToDark': 'Tmavý',\r\n 'action.chromeToLight': 'Svetlý',\r\n 'action.chromeHint': 'Motív editora svetlý / tmavý',\r\n 'action.aiCopy': 'Text',\r\n 'action.aiCopyHint': 'Napísať text pomocou AI',\r\n 'action.code': 'Kód',\r\n 'action.codeHint': 'Upraviť surové HTML so živým náhľadom',\r\n 'action.preview': 'Náhľad',\r\n 'action.export': 'Exportovať',\r\n 'device.desktop': 'Počítač',\r\n 'device.desktopHint': 'Šírka pre počítač',\r\n 'device.mobile': 'Mobil',\r\n 'device.mobileHint': 'Šírka pre mobil',\r\n 'device.dark': 'Tmavý',\r\n 'device.darkHint': 'Tmavý režim schránky',\r\n 'status.autosaveOn': 'automatické ukladanie zapnuté',\r\n 'status.saved': 'uložené {time}',\r\n 'status.saveFailed': 'neuložené — úložisko je plné',\r\n 'canvas.meta': '{rows} riadkov · {blocks} blokov · {width}px',\r\n 'tab.design': 'Štýl',\r\n 'tab.designHint': 'Štylizovať výber',\r\n 'tab.blocks': 'Bloky',\r\n 'tab.blocksHint': 'Bloky obsahu a premenné',\r\n 'tab.rows': 'Sekcie',\r\n 'tab.rowsHint': 'Rozloženia sekcií a model plátna',\r\n 'tab.files': 'Súbory',\r\n 'tab.filesHint': 'Knižnica súborov',\r\n 'tab.layers': 'Štruktúra',\r\n 'tab.layersHint': 'Štruktúra dokumentu',\r\n 'tab.theme': 'Motív',\r\n 'tab.themeHint': 'Globálne štýly',\r\n 'tab.data': 'Prem.',\r\n 'tab.dataHint': 'Premenné poskytnuté vaším kódom',\r\n 'inspector.blockProperties': 'Vlastnosti bloku',\r\n 'inspector.sectionProperties': 'Vlastnosti sekcie',\r\n 'inspector.title': 'Inšpektor',\r\n 'inspector.sectionLabel': 'Sekcia',\r\n 'inspector.nothingSelected': 'Nič nie je vybraté',\r\n 'action.duplicateHint': 'Duplikovať — ⌘D',\r\n 'action.deleteHint': 'Odstrániť — ⌫',\r\n 'inspector.emptyBody':\r\n 'Vyberte riadok alebo blok na plátne a štylizujte ho tu. Presuňte bloky z karty <strong style=\"color: var(--ed-text); font-weight: 600;\">Bloky</strong>; dvojklikom na text ho upravíte priamo na mieste.',\r\n 'inspector.shortcuts': 'Skratky',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — späť, znova',\r\n 'shortcut.duplicate': '⌘D — duplikovať výber',\r\n 'shortcut.delete': '⌫ — odstrániť výber',\r\n 'shortcut.export': '⌘E — exportovať HTML',\r\n 'shortcut.escape': 'ESC — zrušiť výber, zavrieť',\r\n 'blocks.dragHint': 'Presuňte na plátno',\r\n 'blocks.count': '{count} blokov',\r\n 'rows.sectionLayouts': 'Rozloženia sekcií',\r\n 'rows.customMarkup': 'Vlastný kód',\r\n 'rows.htmlRowHint': 'Presuňte pre vloženie alebo kliknite pre pridanie — riadok na celú šírku, ktorý vyplníte surovým HTML',\r\n 'rows.rawHtmlSection': 'Sekcia so surovým HTML',\r\n 'rows.rawHtmlDesc': 'Sekcia na celú šírku, váš vlastný kód, stále presúvateľná',\r\n 'rows.canvasModel': 'Model plátna',\r\n 'rows.modeRowBased': 'Založené na riadkoch',\r\n 'rows.modeFreeStack': 'Voľný zásobník',\r\n 'rows.hintRows':\r\n 'Založené na sekciách: najprv umiestnite rozloženie, potom bloky do jeho stĺpcov — každá sekcia má vlastné pozadie, ohraničenie, nastavenia flex alebo mriežky.',\r\n 'rows.hintStack': 'Voľný zásobník: bez rozložení — každý umiestnený blok sa stane vlastnou sekciou na celú šírku, zoradenou postupne.',\r\n 'files.libraryCount': 'Knižnica — {count} súborov',\r\n 'files.openManager': 'Otvoriť správcu súborov',\r\n 'files.dragToCanvas': 'Presuňte ľubovoľný súbor priamo na plátno a umiestnite ho ako obrazový blok.',\r\n 'layers.structure': 'Štruktúra',\r\n 'layers.sectionSingle': 'Sekcia',\r\n 'layers.sectionMulti': 'Sekcia · {count} stĺpcov',\r\n 'layers.blockCount': '{count} bl.',\r\n 'theme.globalStyles': 'Globálne štýly',\r\n 'vars.title': 'Premenné',\r\n 'vars.fromCode': '{count} z vášho kódu',\r\n 'vars.declaredNote': 'Deklarované vašou aplikáciou — plátno vždy zobrazuje token, nikdy hodnotu.',\r\n 'vars.filterPlaceholder': 'Filtrovať premenné…',\r\n 'vars.insertHint': 'Kliknite pre vloženie do vybraného textu, nadpisu alebo tlačidla',\r\n 'vars.insert': 'vložiť',\r\n 'vars.noMatch': 'Žiadna premenná nezodpovedá tomuto filtru.',\r\n 'vars.noneDeclared': 'Vaša aplikácia zatiaľ nedeklarovala žiadne premenné.',\r\n 'vars.rteHint': 'Pri úprave textu môžete premennú vybrať aj priamo z rozbaľovacej ponuky vloženého panela nástrojov.',\r\n 'modal.fileManager': 'Správca súborov',\r\n 'modal.assetsTitle': 'Zdroje',\r\n 'modal.replaceImage': 'Nahradiť obrázok',\r\n 'library.searchPlaceholder': 'Hľadať súbory…',\r\n 'action.upload': 'Nahrať',\r\n 'library.clickToPlace': 'Kliknite na súbor pre umiestnenie · alebo presuňte súbor na plátno',\r\n 'library.clickToReplace': 'Kliknite na súbor pre nahradenie vybraného obrázka',\r\n 'library.storageLabel': '{count} súborov · {size}',\r\n 'library.folders': 'Priečinky',\r\n 'library.dropHint': 'Sem presuňte obrázkové súbory na nahranie — alebo použite tlačidlo Nahrať.',\r\n 'library.deleteFileHint': 'Odstrániť súbor',\r\n 'library.del': 'ZMAZ',\r\n 'toast.assetDeleted': '{name} odstránený',\r\n 'modal.export': 'Exportovať',\r\n 'modal.exportTitle': 'HTML e-mailu založené na tabuľkách',\r\n 'export.copy': 'Kopírovať',\r\n 'export.copied': 'Skopírované',\r\n 'action.download': 'Stiahnuť',\r\n 'export.meta': '{kb} KB · tabuľky + vložené štýly · šírky bezpečné pre Outlook',\r\n 'modal.rawHtmlTitle': 'Surové HTML, živý náhľad',\r\n 'code.statusEdited': 'Zobrazenie kódu — upravené — náhľad naživo, zatiaľ neaplikované',\r\n 'code.statusSynced': 'Zobrazenie kódu — synchronizované s plátnom',\r\n 'action.reload': 'Znova načítať',\r\n 'action.reloadHint': 'Znova načítať zdroj z plátna',\r\n 'action.applyToCanvas': 'Použiť na plátno',\r\n 'action.applyToCanvasHint': 'Znova rozobrať zdroj na upraviteľné riadky',\r\n 'action.closeWithoutApplyingHint': 'Zavrieť bez použitia',\r\n 'code.source': 'Zdroj',\r\n 'code.livePreview': 'Živý náhľad',\r\n 'code.liveHtmlPreviewTitle': 'Živý náhľad HTML',\r\n 'code.applyNote':\r\n 'Použitie rozoberie každý riadok tabuľky najvyššej úrovne na riadok plátna, ktorý možno stále vybrať, preusporiadať a odstrániť — ručne písaný kód proces prežije bez zmeny.',\r\n 'code.meta': '{kb} KB · {lines} riadkov',\r\n 'toast.sourceReloaded': 'Zdroj znova načítaný z plátna',\r\n 'toast.sourceAppliedOne': 'Zdroj použitý — 1 riadok na plátne',\r\n 'toast.sourceAppliedMany': 'Zdroj použitý — {rows} riadkov na plátne',\r\n 'toast.parseError': 'Toto HTML sa nepodarilo spracovať',\r\n 'modal.copyAssist': 'Asistent pre text',\r\n 'modal.draftCopyTitle': 'Napísať text pre túto kampaň',\r\n 'ai.goal': 'Cieľ',\r\n 'ai.tone': 'Tón',\r\n 'ai.briefLabel': 'O čom je tento e-mail?',\r\n 'ai.briefPlaceholder': 'napr. Jesenná kolekcia, 15 % pre odberateľov, doprava zdarma nad 150 €',\r\n 'ai.generate': 'Vygenerovať text',\r\n 'ai.writing': 'Píše sa…',\r\n 'ai.kindHeadline': 'Nadpis',\r\n 'ai.kindBody': 'Hlavný text',\r\n 'ai.kindButton': 'Text tlačidla',\r\n 'ai.actionInsertHeading': 'Vložiť ako nadpis',\r\n 'ai.actionInsertText': 'Vložiť ako textový blok',\r\n 'ai.actionInsertButton': 'Vložiť ako tlačidlo',\r\n 'toast.headingAdded': 'Nadpis pridaný',\r\n 'toast.textBlockAdded': 'Textový blok pridaný',\r\n 'toast.buttonAdded': 'Tlačidlo pridané',\r\n 'preview.kickerMobile': 'Náhľad — mobil 375px',\r\n 'preview.kickerDark': 'Náhľad — tmavá schránka',\r\n 'preview.kickerDesktop': 'Náhľad — počítač {width}px',\r\n 'action.close': 'Zavrieť',\r\n 'toast.duplicated': 'Duplikované',\r\n 'toast.fileUploadedOne': 'Nahraný 1 súbor',\r\n 'toast.fileUploadedMany': 'Nahratých súborov: {count}',\r\n 'toast.imageReplaced': 'Obrázok nahradený',\r\n 'toast.imageAdded': 'Obrázok pridaný na plátno',\r\n 'toast.htmlCopied': 'HTML skopírované do schránky',\r\n 'toast.templateLoaded': '{name} načítané',\r\n 'toast.snippetDefaultLabel': 'Úryvok',\r\n 'toast.snippetInserted': '{name} vložené',\r\n 'toast.snippetCopied': '{name} skopírované — vyberte textový blok na vloženie',\r\n};\r\n\r\n\nObject.assign(exports, { SK });\n\n};\n__modules[\"core/i18n/sl.js\"] = function(module, exports, __require) {\n/** Slovenian (Slovenščina) — `sl`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst SL = {\r\n 'action.undoHint': 'Razveljavi — ⌘Z',\r\n 'action.redoHint': 'Ponovi — ⌘⇧Z',\r\n 'action.chromeToDark': 'Temno',\r\n 'action.chromeToLight': 'Svetlo',\r\n 'action.chromeHint': 'Tema urejevalnika svetla / temna',\r\n 'action.aiCopy': 'Besedilo',\r\n 'action.aiCopyHint': 'Napiši besedilo z UI',\r\n 'action.code': 'Koda',\r\n 'action.codeHint': 'Uredi surovi HTML z ogledom v živo',\r\n 'action.preview': 'Predogled',\r\n 'action.export': 'Izvozi',\r\n 'device.desktop': 'Namizje',\r\n 'device.desktopHint': 'Širina za namizje',\r\n 'device.mobile': 'Mobilna naprava',\r\n 'device.mobileHint': 'Širina za mobilno napravo',\r\n 'device.dark': 'Temno',\r\n 'device.darkHint': 'Temen način nabiralnika',\r\n 'status.autosaveOn': 'samodejno shranjevanje vklopljeno',\r\n 'status.saved': 'shranjeno {time}',\r\n 'status.saveFailed': 'ni shranjeno — pomnilnik je poln',\r\n 'canvas.meta': '{rows} vrstic · {blocks} blokov · {width}px',\r\n 'tab.design': 'Slog',\r\n 'tab.designHint': 'Oblikuj izbor',\r\n 'tab.blocks': 'Bloki',\r\n 'tab.blocksHint': 'Vsebinski bloki in spremenljivke',\r\n 'tab.rows': 'Odseki',\r\n 'tab.rowsHint': 'Postavitve odsekov in model platna',\r\n 'tab.files': 'Datoteke',\r\n 'tab.filesHint': 'Knjižnica virov',\r\n 'tab.layers': 'Struktura',\r\n 'tab.layersHint': 'Struktura dokumenta',\r\n 'tab.theme': 'Tema',\r\n 'tab.themeHint': 'Globalni slogi',\r\n 'tab.data': 'Spr.',\r\n 'tab.dataHint': 'Spremenljivke, ki jih zagotavlja vaša koda',\r\n 'inspector.blockProperties': 'Lastnosti bloka',\r\n 'inspector.sectionProperties': 'Lastnosti odseka',\r\n 'inspector.title': 'Inšpektor',\r\n 'inspector.sectionLabel': 'Odsek',\r\n 'inspector.nothingSelected': 'Nič ni izbrano',\r\n 'action.duplicateHint': 'Podvoji — ⌘D',\r\n 'action.deleteHint': 'Izbriši — ⌫',\r\n 'inspector.emptyBody':\r\n 'Izberite vrstico ali blok na platnu, da ga oblikujete tukaj. Povlecite bloke iz zavihka <strong style=\"color: var(--ed-text); font-weight: 600;\">Bloki</strong>; dvokliknite besedilo za urejanje na mestu.',\r\n 'inspector.shortcuts': 'Bližnjice',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — razveljavi, ponovi',\r\n 'shortcut.duplicate': '⌘D — podvoji izbor',\r\n 'shortcut.delete': '⌫ — izbriši izbor',\r\n 'shortcut.export': '⌘E — izvozi HTML',\r\n 'shortcut.escape': 'ESC — prekliči izbor, zapri',\r\n 'blocks.dragHint': 'Povlecite na platno',\r\n 'blocks.count': '{count} blokov',\r\n 'rows.sectionLayouts': 'Postavitve odsekov',\r\n 'rows.customMarkup': 'Lastna koda',\r\n 'rows.htmlRowHint': 'Povlecite za vstavitev ali kliknite za dodajanje — vrstica čez celo širino, ki jo zapolnite s surovim HTML-jem',\r\n 'rows.rawHtmlSection': 'Odsek s surovim HTML-jem',\r\n 'rows.rawHtmlDesc': 'Odsek čez celo širino, vaša lastna koda, še vedno vlečljiv',\r\n 'rows.canvasModel': 'Model platna',\r\n 'rows.modeRowBased': 'Temelji na vrsticah',\r\n 'rows.modeFreeStack': 'Prosti sklad',\r\n 'rows.hintRows':\r\n 'Temelji na odsekih: najprej spustite postavitev, nato bloke v njene stolpce — vsak odsek ima lastno ozadje, rob, nastavitve flex ali mreže.',\r\n 'rows.hintStack': 'Prosti sklad: brez postavitev — vsak spuščen blok postane lasten odsek čez celo širino, zložen po vrsti.',\r\n 'files.libraryCount': 'Knjižnica — {count} datotek',\r\n 'files.openManager': 'Odpri upravitelja datotek',\r\n 'files.dragToCanvas': 'Povlecite katero koli datoteko neposredno na platno, da jo postavite kot slikovni blok.',\r\n 'layers.structure': 'Struktura',\r\n 'layers.sectionSingle': 'Odsek',\r\n 'layers.sectionMulti': 'Odsek · {count} stolpcev',\r\n 'layers.blockCount': '{count} bl.',\r\n 'theme.globalStyles': 'Globalni slogi',\r\n 'vars.title': 'Spremenljivke',\r\n 'vars.fromCode': '{count} iz vaše kode',\r\n 'vars.declaredNote': 'Deklarirane s strani vaše aplikacije — platno vedno prikaže žeton, nikoli vrednosti.',\r\n 'vars.filterPlaceholder': 'Filtriraj spremenljivke…',\r\n 'vars.insertHint': 'Kliknite za vstavitev v izbrano besedilo, naslov ali gumb',\r\n 'vars.insert': 'vstavi',\r\n 'vars.noMatch': 'Nobena spremenljivka ne ustreza temu filtru.',\r\n 'vars.noneDeclared': 'Vaša aplikacija še ni deklarirala nobenih spremenljivk.',\r\n 'vars.rteHint': 'Med urejanjem besedila lahko spremenljivko izberete tudi neposredno iz spustnega menija vgrajene orodne vrstice.',\r\n 'modal.fileManager': 'Upravitelj datotek',\r\n 'modal.assetsTitle': 'Viri',\r\n 'modal.replaceImage': 'Zamenjaj sliko',\r\n 'library.searchPlaceholder': 'Iskanje datotek…',\r\n 'action.upload': 'Naloži',\r\n 'library.clickToPlace': 'Kliknite datoteko za postavitev · ali povlecite datoteko na platno',\r\n 'library.clickToReplace': 'Kliknite datoteko za zamenjavo izbrane slike',\r\n 'library.storageLabel': '{count} datotek · {size}',\r\n 'library.folders': 'Mape',\r\n 'library.dropHint': 'Sem spustite slikovne datoteke za nalaganje — ali uporabite gumb Naloži.',\r\n 'library.deleteFileHint': 'Izbriši datoteko',\r\n 'library.del': 'IZBR',\r\n 'toast.assetDeleted': '{name} izbrisano',\r\n 'modal.export': 'Izvozi',\r\n 'modal.exportTitle': 'HTML e-pošte na osnovi tabel',\r\n 'export.copy': 'Kopiraj',\r\n 'export.copied': 'Kopirano',\r\n 'action.download': 'Prenesi',\r\n 'export.meta': '{kb} KB · tabele + vgrajeni slogi · širine, varne za Outlook',\r\n 'modal.rawHtmlTitle': 'Surovi HTML, ogled v živo',\r\n 'code.statusEdited': 'Pogled kode — urejeno — ogled v živo, še ni uporabljeno',\r\n 'code.statusSynced': 'Pogled kode — usklajeno s platnom',\r\n 'action.reload': 'Znova naloži',\r\n 'action.reloadHint': 'Znova naloži vir s platna',\r\n 'action.applyToCanvas': 'Uporabi na platnu',\r\n 'action.applyToCanvasHint': 'Znova razčleni vir v uredljive vrstice',\r\n 'action.closeWithoutApplyingHint': 'Zapri brez uporabe',\r\n 'code.source': 'Vir',\r\n 'code.livePreview': 'Ogled v živo',\r\n 'code.liveHtmlPreviewTitle': 'Ogled HTML v živo',\r\n 'code.applyNote':\r\n 'Uporabi razčleni vsako vrstico tabele najvišje ravni v vrstico platna, ki jo lahko še vedno izberete, prerazporedite in izbrišete — ročno napisana koda postopek preživi nespremenjena.',\r\n 'code.meta': '{kb} KB · {lines} vrstic',\r\n 'toast.sourceReloaded': 'Vir znova naložen s platna',\r\n 'toast.sourceAppliedOne': 'Vir uporabljen — 1 vrstica na platnu',\r\n 'toast.sourceAppliedMany': 'Vir uporabljen — {rows} vrstic na platnu',\r\n 'toast.parseError': 'Tega HTML-ja ni bilo mogoče razčleniti',\r\n 'modal.copyAssist': 'Pomočnik za besedilo',\r\n 'modal.draftCopyTitle': 'Napiši besedilo za to kampanjo',\r\n 'ai.goal': 'Cilj',\r\n 'ai.tone': 'Ton',\r\n 'ai.briefLabel': 'O čem govori ta e-pošta?',\r\n 'ai.briefPlaceholder': 'npr. jesenska kolekcija, 15 % za naročnike, brezplačna dostava nad 150 €',\r\n 'ai.generate': 'Ustvari besedilo',\r\n 'ai.writing': 'Pisanje…',\r\n 'ai.kindHeadline': 'Naslov',\r\n 'ai.kindBody': 'Glavno besedilo',\r\n 'ai.kindButton': 'Besedilo gumba',\r\n 'ai.actionInsertHeading': 'Vstavi kot naslov',\r\n 'ai.actionInsertText': 'Vstavi kot besedilni blok',\r\n 'ai.actionInsertButton': 'Vstavi kot gumb',\r\n 'toast.headingAdded': 'Naslov dodan',\r\n 'toast.textBlockAdded': 'Besedilni blok dodan',\r\n 'toast.buttonAdded': 'Gumb dodan',\r\n 'preview.kickerMobile': 'Predogled — mobilna naprava 375px',\r\n 'preview.kickerDark': 'Predogled — temen nabiralnik',\r\n 'preview.kickerDesktop': 'Predogled — namizje {width}px',\r\n 'action.close': 'Zapri',\r\n 'toast.duplicated': 'Podvojeno',\r\n 'toast.fileUploadedOne': 'Naložena 1 datoteka',\r\n 'toast.fileUploadedMany': 'Naloženih {count} datotek',\r\n 'toast.imageReplaced': 'Slika zamenjana',\r\n 'toast.imageAdded': 'Slika dodana na platno',\r\n 'toast.htmlCopied': 'HTML kopiran v odložišče',\r\n 'toast.templateLoaded': '{name} naloženo',\r\n 'toast.snippetDefaultLabel': 'Odlomek',\r\n 'toast.snippetInserted': '{name} vstavljeno',\r\n 'toast.snippetCopied': '{name} kopirano — izberite besedilni blok za vstavitev',\r\n};\r\n\r\n\nObject.assign(exports, { SL });\n\n};\n__modules[\"core/i18n/sv.js\"] = function(module, exports, __require) {\n/** Swedish (Svenska) — `sv`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst SV = {\r\n 'action.undoHint': 'Ångra — ⌘Z',\r\n 'action.redoHint': 'Gör om — ⌘⇧Z',\r\n 'action.chromeToDark': 'Mörkt',\r\n 'action.chromeToLight': 'Ljust',\r\n 'action.chromeHint': 'Redigerartema ljust / mörkt',\r\n 'action.aiCopy': 'Text',\r\n 'action.aiCopyHint': 'Skriv text med AI',\r\n 'action.code': 'Kod',\r\n 'action.codeHint': 'Redigera rå HTML med direktförhandsgranskning',\r\n 'action.preview': 'Förhandsgranskning',\r\n 'action.export': 'Exportera',\r\n 'device.desktop': 'Dator',\r\n 'device.desktopHint': 'Datorbredd',\r\n 'device.mobile': 'Mobil',\r\n 'device.mobileHint': 'Mobilbredd',\r\n 'device.dark': 'Mörkt',\r\n 'device.darkHint': 'Mörkt läge för inkorgen',\r\n 'status.autosaveOn': 'automatisk sparning på',\r\n 'status.saved': 'sparat {time}',\r\n 'status.saveFailed': 'sparades inte — lagringen är full',\r\n 'canvas.meta': '{rows} rader · {blocks} block · {width}px',\r\n 'tab.design': 'Stil',\r\n 'tab.designHint': 'Stila markeringen',\r\n 'tab.blocks': 'Block',\r\n 'tab.blocksHint': 'Innehållsblock och variabler',\r\n 'tab.rows': 'Sektioner',\r\n 'tab.rowsHint': 'Sektionslayouter och canvasmodell',\r\n 'tab.files': 'Filer',\r\n 'tab.filesHint': 'Resursbibliotek',\r\n 'tab.layers': 'Struktur',\r\n 'tab.layersHint': 'Dokumentstruktur',\r\n 'tab.theme': 'Tema',\r\n 'tab.themeHint': 'Globala stilar',\r\n 'tab.data': 'Var.',\r\n 'tab.dataHint': 'Variabler som tillhandahålls av din kod',\r\n 'inspector.blockProperties': 'Blockegenskaper',\r\n 'inspector.sectionProperties': 'Sektionsegenskaper',\r\n 'inspector.title': 'Inspektör',\r\n 'inspector.sectionLabel': 'Sektion',\r\n 'inspector.nothingSelected': 'Inget markerat',\r\n 'action.duplicateHint': 'Duplicera — ⌘D',\r\n 'action.deleteHint': 'Ta bort — ⌫',\r\n 'inspector.emptyBody':\r\n 'Välj en rad eller ett block på canvasen för att stila det här. Dra block från fliken <strong style=\"color: var(--ed-text); font-weight: 600;\">Block</strong>; dubbelklicka på valfri text för att redigera direkt.',\r\n 'inspector.shortcuts': 'Genvägar',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — ångra, gör om',\r\n 'shortcut.duplicate': '⌘D — duplicera markering',\r\n 'shortcut.delete': '⌫ — ta bort markering',\r\n 'shortcut.export': '⌘E — exportera HTML',\r\n 'shortcut.escape': 'ESC — avmarkera, stäng',\r\n 'blocks.dragHint': 'Dra till canvasen',\r\n 'blocks.count': '{count} block',\r\n 'rows.sectionLayouts': 'Sektionslayouter',\r\n 'rows.customMarkup': 'Anpassad kod',\r\n 'rows.htmlRowHint': 'Dra för att infoga, eller klicka för att lägga till — en rad i full bredd som du fyller med rå HTML',\r\n 'rows.rawHtmlSection': 'Rå HTML-sektion',\r\n 'rows.rawHtmlDesc': 'Sektion i full bredd, din egen kod, fortfarande dragbar',\r\n 'rows.canvasModel': 'Canvasmodell',\r\n 'rows.modeRowBased': 'Radbaserad',\r\n 'rows.modeFreeStack': 'Fri stapel',\r\n 'rows.hintRows':\r\n 'Sektionsbaserad: släpp en layout först, sedan block i dess kolumner — varje sektion har egen bakgrund, kant, flex- eller rutnätsinställningar.',\r\n 'rows.hintStack': 'Fri stapel: utan layouter — varje block du släpper blir sin egen sektion i full bredd, staplad i ordning.',\r\n 'files.libraryCount': 'Bibliotek — {count} filer',\r\n 'files.openManager': 'Öppna filhanteraren',\r\n 'files.dragToCanvas': 'Dra valfri fil direkt till canvasen för att placera den som ett bildblock.',\r\n 'layers.structure': 'Struktur',\r\n 'layers.sectionSingle': 'Sektion',\r\n 'layers.sectionMulti': 'Sektion · {count} kol.',\r\n 'layers.blockCount': '{count} block',\r\n 'theme.globalStyles': 'Globala stilar',\r\n 'vars.title': 'Variabler',\r\n 'vars.fromCode': '{count} från din kod',\r\n 'vars.declaredNote': 'Deklarerade av din applikation — canvasen visar alltid token, aldrig ett värde.',\r\n 'vars.filterPlaceholder': 'Filtrera variabler…',\r\n 'vars.insertHint': 'Klicka för att infoga i markerad text, rubrik eller knapp',\r\n 'vars.insert': 'infoga',\r\n 'vars.noMatch': 'Ingen variabel matchar det filtret.',\r\n 'vars.noneDeclared': 'Din applikation har ännu inte deklarerat några variabler.',\r\n 'vars.rteHint': 'När du redigerar text kan du också välja en variabel direkt från rullgardinsmenyn i den inbäddade verktygsfältet.',\r\n 'modal.fileManager': 'Filhanterare',\r\n 'modal.assetsTitle': 'Resurser',\r\n 'modal.replaceImage': 'Ersätt bild',\r\n 'library.searchPlaceholder': 'Sök filer…',\r\n 'action.upload': 'Ladda upp',\r\n 'library.clickToPlace': 'Klicka på en fil för att placera den · eller dra en fil till canvasen',\r\n 'library.clickToReplace': 'Klicka på en fil för att ersätta den markerade bilden',\r\n 'library.storageLabel': '{count} filer · {size}',\r\n 'library.folders': 'Mappar',\r\n 'library.dropHint': 'Släpp bildfiler här för att ladda upp — eller använd knappen Ladda upp.',\r\n 'library.deleteFileHint': 'Ta bort fil',\r\n 'library.del': 'RADERA',\r\n 'toast.assetDeleted': '{name} borttagen',\r\n 'modal.export': 'Exportera',\r\n 'modal.exportTitle': 'Tabellbaserad e-post-HTML',\r\n 'export.copy': 'Kopiera',\r\n 'export.copied': 'Kopierat',\r\n 'action.download': 'Ladda ner',\r\n 'export.meta': '{kb} KB · tabeller + inline-stilar · Outlook-säkra bredder',\r\n 'modal.rawHtmlTitle': 'Rå HTML, direktförhandsgranskning',\r\n 'code.statusEdited': 'Kodvy — redigerad — förhandsgranskning live, inte tillämpad ännu',\r\n 'code.statusSynced': 'Kodvy — synkroniserad med canvasen',\r\n 'action.reload': 'Läs om',\r\n 'action.reloadHint': 'Läs om källan från canvasen',\r\n 'action.applyToCanvas': 'Tillämpa på canvas',\r\n 'action.applyToCanvasHint': 'Tolka källan tillbaka till redigerbara rader',\r\n 'action.closeWithoutApplyingHint': 'Stäng utan att tillämpa',\r\n 'code.source': 'Källa',\r\n 'code.livePreview': 'Direktförhandsgranskning',\r\n 'code.liveHtmlPreviewTitle': 'Direkt HTML-förhandsgranskning',\r\n 'code.applyNote':\r\n 'Tillämpa tolkar varje tabellrad på toppnivå till en canvasrad som du fortfarande kan markera, ordna om och ta bort — handskriven kod överlever processen oförändrad.',\r\n 'code.meta': '{kb} KB · {lines} rader',\r\n 'toast.sourceReloaded': 'Källan omladdad från canvasen',\r\n 'toast.sourceAppliedOne': 'Källa tillämpad — 1 rad på canvasen',\r\n 'toast.sourceAppliedMany': 'Källa tillämpad — {rows} rader på canvasen',\r\n 'toast.parseError': 'Kunde inte tolka den HTML-koden',\r\n 'modal.copyAssist': 'Textassistent',\r\n 'modal.draftCopyTitle': 'Skriv text för denna kampanj',\r\n 'ai.goal': 'Mål',\r\n 'ai.tone': 'Ton',\r\n 'ai.briefLabel': 'Vad handlar det här mejlet om?',\r\n 'ai.briefPlaceholder': 't.ex. Höstkollektion, 15% för prenumeranter, fri frakt över 1500 kr',\r\n 'ai.generate': 'Generera text',\r\n 'ai.writing': 'Skriver…',\r\n 'ai.kindHeadline': 'Rubrik',\r\n 'ai.kindBody': 'Brödtext',\r\n 'ai.kindButton': 'Knapptext',\r\n 'ai.actionInsertHeading': 'Infoga som rubrik',\r\n 'ai.actionInsertText': 'Infoga som textblock',\r\n 'ai.actionInsertButton': 'Infoga som knapp',\r\n 'toast.headingAdded': 'Rubrik tillagd',\r\n 'toast.textBlockAdded': 'Textblock tillagt',\r\n 'toast.buttonAdded': 'Knapp tillagd',\r\n 'preview.kickerMobile': 'Förhandsgranskning — mobil 375px',\r\n 'preview.kickerDark': 'Förhandsgranskning — mörk inkorg',\r\n 'preview.kickerDesktop': 'Förhandsgranskning — dator {width}px',\r\n 'action.close': 'Stäng',\r\n 'toast.duplicated': 'Duplicerad',\r\n 'toast.fileUploadedOne': '1 fil uppladdad',\r\n 'toast.fileUploadedMany': '{count} filer uppladdade',\r\n 'toast.imageReplaced': 'Bild ersatt',\r\n 'toast.imageAdded': 'Bild tillagd på canvasen',\r\n 'toast.htmlCopied': 'HTML kopierad till urklipp',\r\n 'toast.templateLoaded': '{name} inläst',\r\n 'toast.snippetDefaultLabel': 'Snutt',\r\n 'toast.snippetInserted': '{name} infogad',\r\n 'toast.snippetCopied': '{name} kopierad — markera ett textblock för att infoga den',\r\n};\r\n\r\n\nObject.assign(exports, { SV });\n\n};\n__modules[\"core/i18n/tables.js\"] = function(module, exports, __require) {\nconst {EN} = __require(\"core/i18n/en.js\");\r\nconst {AR} = __require(\"core/i18n/ar.js\");\r\nconst {BG} = __require(\"core/i18n/bg.js\");\r\nconst {BN} = __require(\"core/i18n/bn.js\");\r\nconst {CA} = __require(\"core/i18n/ca.js\");\r\nconst {CS} = __require(\"core/i18n/cs.js\");\r\nconst {DA} = __require(\"core/i18n/da.js\");\r\nconst {DE} = __require(\"core/i18n/de.js\");\r\nconst {DE_CH} = __require(\"core/i18n/de-CH.js\");\r\nconst {DZ} = __require(\"core/i18n/dz.js\");\r\nconst {EL} = __require(\"core/i18n/el.js\");\r\nconst {ES} = __require(\"core/i18n/es.js\");\r\nconst {ET} = __require(\"core/i18n/et.js\");\r\nconst {FI} = __require(\"core/i18n/fi.js\");\r\nconst {FR} = __require(\"core/i18n/fr.js\");\r\nconst {HR} = __require(\"core/i18n/hr.js\");\r\nconst {HU} = __require(\"core/i18n/hu.js\");\r\nconst {IT} = __require(\"core/i18n/it.js\");\r\nconst {LT} = __require(\"core/i18n/lt.js\");\r\nconst {LV} = __require(\"core/i18n/lv.js\");\r\nconst {NB} = __require(\"core/i18n/nb.js\");\r\nconst {NL} = __require(\"core/i18n/nl.js\");\r\nconst {PL} = __require(\"core/i18n/pl.js\");\r\nconst {PT} = __require(\"core/i18n/pt.js\");\r\nconst {RO} = __require(\"core/i18n/ro.js\");\r\nconst {RU} = __require(\"core/i18n/ru.js\");\r\nconst {SK} = __require(\"core/i18n/sk.js\");\r\nconst {SL} = __require(\"core/i18n/sl.js\");\r\nconst {SV} = __require(\"core/i18n/sv.js\");\r\nconst {TR} = __require(\"core/i18n/tr.js\");\r\nconst {UK} = __require(\"core/i18n/uk.js\");\r\n\r\n/**\r\n * Every shipped message table, keyed by the same tag `LOCALES` (index.js)\r\n * lists -- what lets the element resolve its `locale` attribute to a table on\r\n * its own, so a host switches language by setting one attribute instead of\r\n * importing and assigning a table by hand.\r\n *\r\n * Deliberately a separate module from index.js's metadata-only `LOCALES`:\r\n * importing this one pulls all translations in. The element accepts that\r\n * (host-driven language is worth it, and the demo bundle carries every module\r\n * anyway); a size-sensitive host that bypasses the attribute can still\r\n * deep-import a single `core/i18n/<tag>.js` and assign `.messages` itself.\r\n */\r\nconst LOCALE_TABLES = {\r\n en: EN, ar: AR, bg: BG, bn: BN, ca: CA, cs: CS, da: DA, de: DE, 'de-CH': DE_CH,\r\n dz: DZ, el: EL, es: ES, et: ET, fi: FI, fr: FR, hr: HR, hu: HU, it: IT,\r\n lt: LT, lv: LV, nb: NB, nl: NL, pl: PL, pt: PT, ro: RO, ru: RU, sk: SK,\r\n sl: SL, sv: SV, tr: TR, uk: UK,\r\n};\r\n\nObject.assign(exports, { LOCALE_TABLES });\n\n};\n__modules[\"core/i18n/tr.js\"] = function(module, exports, __require) {\n/** Turkish (Türkçe) — `tr`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst TR = {\r\n 'action.undoHint': 'Geri al — ⌘Z',\r\n 'action.redoHint': 'Yinele — ⌘⇧Z',\r\n 'action.chromeToDark': 'Koyu',\r\n 'action.chromeToLight': 'Açık',\r\n 'action.chromeHint': 'Düzenleyici teması açık / koyu',\r\n 'action.aiCopy': 'Metin',\r\n 'action.aiCopyHint': 'Yapay zeka ile metin yaz',\r\n 'action.code': 'Kod',\r\n 'action.codeHint': 'Ham HTML’yi canlı önizlemeyle düzenle',\r\n 'action.preview': 'Önizleme',\r\n 'action.export': 'Dışa aktar',\r\n 'device.desktop': 'Masaüstü',\r\n 'device.desktopHint': 'Masaüstü genişliği',\r\n 'device.mobile': 'Mobil',\r\n 'device.mobileHint': 'Mobil genişliği',\r\n 'device.dark': 'Koyu',\r\n 'device.darkHint': 'Koyu gelen kutusu modu',\r\n 'status.autosaveOn': 'otomatik kayıt açık',\r\n 'status.saved': 'kaydedildi {time}',\r\n 'status.saveFailed': 'kaydedilmedi — depolama alanı dolu',\r\n 'canvas.meta': '{rows} satır · {blocks} blok · {width}px',\r\n 'tab.design': 'Stil',\r\n 'tab.designHint': 'Seçimi biçimlendir',\r\n 'tab.blocks': 'Bloklar',\r\n 'tab.blocksHint': 'İçerik blokları ve değişkenler',\r\n 'tab.rows': 'Bölümler',\r\n 'tab.rowsHint': 'Bölüm düzenleri ve tuval modeli',\r\n 'tab.files': 'Dosyalar',\r\n 'tab.filesHint': 'Varlık kitaplığı',\r\n 'tab.layers': 'Yapı',\r\n 'tab.layersHint': 'Belge yapısı',\r\n 'tab.theme': 'Tema',\r\n 'tab.themeHint': 'Genel stiller',\r\n 'tab.data': 'Değ.',\r\n 'tab.dataHint': 'Kodunuz tarafından sağlanan değişkenler',\r\n 'inspector.blockProperties': 'Blok özellikleri',\r\n 'inspector.sectionProperties': 'Bölüm özellikleri',\r\n 'inspector.title': 'Denetçi',\r\n 'inspector.sectionLabel': 'Bölüm',\r\n 'inspector.nothingSelected': 'Hiçbir şey seçilmedi',\r\n 'action.duplicateHint': 'Çoğalt — ⌘D',\r\n 'action.deleteHint': 'Sil — ⌫',\r\n 'inspector.emptyBody':\r\n 'Burada biçimlendirmek için tuval üzerinde bir satır veya blok seçin. Blokları <strong style=\"color: var(--ed-text); font-weight: 600;\">Bloklar</strong> sekmesinden sürükleyin; herhangi bir metni doğrudan düzenlemek için üzerine çift tıklayın.',\r\n 'inspector.shortcuts': 'Kısayollar',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — geri al, yinele',\r\n 'shortcut.duplicate': '⌘D — seçimi çoğalt',\r\n 'shortcut.delete': '⌫ — seçimi sil',\r\n 'shortcut.export': '⌘E — HTML dışa aktar',\r\n 'shortcut.escape': 'ESC — seçimi kaldır, kapat',\r\n 'blocks.dragHint': 'Tuvale sürükleyin',\r\n 'blocks.count': '{count} blok',\r\n 'rows.sectionLayouts': 'Bölüm düzenleri',\r\n 'rows.customMarkup': 'Özel işaretleme',\r\n 'rows.htmlRowHint': 'Eklemek için sürükleyin veya eklemek için tıklayın — ham HTML ile doldurduğunuz tam genişlikte bir satır',\r\n 'rows.rawHtmlSection': 'Ham HTML bölümü',\r\n 'rows.rawHtmlDesc': 'Tam genişlikte bölüm, kendi işaretlemeniz, hâlâ sürüklenebilir',\r\n 'rows.canvasModel': 'Tuval modeli',\r\n 'rows.modeRowBased': 'Satır tabanlı',\r\n 'rows.modeFreeStack': 'Serbest yığın',\r\n 'rows.hintRows':\r\n 'Bölüm tabanlı: önce bir düzen bırakın, ardından sütunlarına bloklar bırakın — her bölümün kendi arka planı, kenarlığı, flex veya ızgara ayarları vardır.',\r\n 'rows.hintStack': 'Serbest yığın: düzen olmadan — bıraktığınız her blok, sırayla istiflenen kendi tam genişlikteki bölümü haline gelir.',\r\n 'files.libraryCount': 'Kitaplık — {count} dosya',\r\n 'files.openManager': 'Dosya yöneticisini aç',\r\n 'files.dragToCanvas': 'Görsel blok olarak yerleştirmek için herhangi bir dosyayı doğrudan tuvale sürükleyin.',\r\n 'layers.structure': 'Yapı',\r\n 'layers.sectionSingle': 'Bölüm',\r\n 'layers.sectionMulti': 'Bölüm · {count} sütun',\r\n 'layers.blockCount': '{count} blok',\r\n 'theme.globalStyles': 'Genel stiller',\r\n 'vars.title': 'Değişkenler',\r\n 'vars.fromCode': 'Kodunuzdan {count}',\r\n 'vars.declaredNote': 'Uygulamanız tarafından tanımlandı — tuval her zaman değeri değil, jetonu gösterir.',\r\n 'vars.filterPlaceholder': 'Değişkenleri filtrele…',\r\n 'vars.insertHint': 'Seçili metne, başlığa veya düğmeye eklemek için tıklayın',\r\n 'vars.insert': 'ekle',\r\n 'vars.noMatch': 'Bu filtreyle eşleşen değişken yok.',\r\n 'vars.noneDeclared': 'Uygulamanız henüz herhangi bir değişken tanımlamadı.',\r\n 'vars.rteHint': 'Metni düzenlerken, satır içi araç çubuğunun açılır menüsünden doğrudan bir değişken de seçebilirsiniz.',\r\n 'modal.fileManager': 'Dosya yöneticisi',\r\n 'modal.assetsTitle': 'Varlıklar',\r\n 'modal.replaceImage': 'Görseli değiştir',\r\n 'library.searchPlaceholder': 'Dosyaları ara…',\r\n 'action.upload': 'Yükle',\r\n 'library.clickToPlace': 'Yerleştirmek için bir dosyaya tıklayın · veya bir dosyayı tuvale sürükleyin',\r\n 'library.clickToReplace': 'Seçili görseli değiştirmek için bir dosyaya tıklayın',\r\n 'library.storageLabel': '{count} dosya · {size}',\r\n 'library.folders': 'Klasörler',\r\n 'library.dropHint': 'Yüklemek için görsel dosyalarını buraya bırakın — veya Yükle düğmesini kullanın.',\r\n 'library.deleteFileHint': 'Dosyayı sil',\r\n 'library.del': 'SİL',\r\n 'toast.assetDeleted': '{name} silindi',\r\n 'modal.export': 'Dışa aktar',\r\n 'modal.exportTitle': 'Tabloya dayalı e-posta HTML’si',\r\n 'export.copy': 'Kopyala',\r\n 'export.copied': 'Kopyalandı',\r\n 'action.download': 'İndir',\r\n 'export.meta': '{kb} KB · tablolar + satır içi stiller · Outlook için güvenli genişlikler',\r\n 'modal.rawHtmlTitle': 'Ham HTML, canlı önizleme',\r\n 'code.statusEdited': 'Kod görünümü — düzenlendi — önizleme canlı, henüz uygulanmadı',\r\n 'code.statusSynced': 'Kod görünümü — tuvalle senkronize',\r\n 'action.reload': 'Yeniden yükle',\r\n 'action.reloadHint': 'Kaynağı tuvalden yeniden yükle',\r\n 'action.applyToCanvas': 'Tuvale uygula',\r\n 'action.applyToCanvasHint': 'Kaynağı tekrar düzenlenebilir satırlara ayrıştır',\r\n 'action.closeWithoutApplyingHint': 'Uygulamadan kapat',\r\n 'code.source': 'Kaynak',\r\n 'code.livePreview': 'Canlı önizleme',\r\n 'code.liveHtmlPreviewTitle': 'Canlı HTML önizlemesi',\r\n 'code.applyNote':\r\n 'Uygulama, en üst düzey her tablo satırını, hâlâ seçebileceğiniz, yeniden sıralayabileceğiniz ve silebileceğiniz bir tuval satırına ayrıştırır — elle yazılmış kod bu süreçten değişmeden çıkar.',\r\n 'code.meta': '{kb} KB · {lines} satır',\r\n 'toast.sourceReloaded': 'Kaynak tuvalden yeniden yüklendi',\r\n 'toast.sourceAppliedOne': 'Kaynak uygulandı — tuvalde 1 satır',\r\n 'toast.sourceAppliedMany': 'Kaynak uygulandı — tuvalde {rows} satır',\r\n 'toast.parseError': 'Bu HTML ayrıştırılamadı',\r\n 'modal.copyAssist': 'Metin asistanı',\r\n 'modal.draftCopyTitle': 'Bu kampanya için metin yazın',\r\n 'ai.goal': 'Hedef',\r\n 'ai.tone': 'Ton',\r\n 'ai.briefLabel': 'Bu e-posta ne hakkında?',\r\n 'ai.briefPlaceholder': 'örn. Sonbahar koleksiyonu, aboneler için %15, 150₺ üzeri ücretsiz kargo',\r\n 'ai.generate': 'Metin oluştur',\r\n 'ai.writing': 'Yazılıyor…',\r\n 'ai.kindHeadline': 'Başlık',\r\n 'ai.kindBody': 'Gövde metni',\r\n 'ai.kindButton': 'Düğme metni',\r\n 'ai.actionInsertHeading': 'Başlık olarak ekle',\r\n 'ai.actionInsertText': 'Metin bloğu olarak ekle',\r\n 'ai.actionInsertButton': 'Düğme olarak ekle',\r\n 'toast.headingAdded': 'Başlık eklendi',\r\n 'toast.textBlockAdded': 'Metin bloğu eklendi',\r\n 'toast.buttonAdded': 'Düğme eklendi',\r\n 'preview.kickerMobile': 'Önizleme — mobil 375px',\r\n 'preview.kickerDark': 'Önizleme — koyu gelen kutusu',\r\n 'preview.kickerDesktop': 'Önizleme — masaüstü {width}px',\r\n 'action.close': 'Kapat',\r\n 'toast.duplicated': 'Çoğaltıldı',\r\n 'toast.fileUploadedOne': '1 dosya yüklendi',\r\n 'toast.fileUploadedMany': '{count} dosya yüklendi',\r\n 'toast.imageReplaced': 'Görsel değiştirildi',\r\n 'toast.imageAdded': 'Görsel tuvale eklendi',\r\n 'toast.htmlCopied': 'HTML panoya kopyalandı',\r\n 'toast.templateLoaded': '{name} yüklendi',\r\n 'toast.snippetDefaultLabel': 'Snippet',\r\n 'toast.snippetInserted': '{name} eklendi',\r\n 'toast.snippetCopied': '{name} kopyalandı — eklemek için bir metin bloğu seçin',\r\n};\r\n\r\n\nObject.assign(exports, { TR });\n\n};\n__modules[\"core/i18n/uk.js\"] = function(module, exports, __require) {\n/** Ukrainian (Українська) — `uk`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */\r\nconst UK = {\r\n 'action.undoHint': 'Скасувати — ⌘Z',\r\n 'action.redoHint': 'Повторити — ⌘⇧Z',\r\n 'action.chromeToDark': 'Темна',\r\n 'action.chromeToLight': 'Світла',\r\n 'action.chromeHint': 'Тема редактора світла / темна',\r\n 'action.aiCopy': 'Текст',\r\n 'action.aiCopyHint': 'Скласти текст за допомогою ШІ',\r\n 'action.code': 'Код',\r\n 'action.codeHint': 'Редагувати вихідний HTML із живим переглядом',\r\n 'action.preview': 'Перегляд',\r\n 'action.export': 'Експорт',\r\n 'device.desktop': 'Комп’ютер',\r\n 'device.desktopHint': 'Ширина для комп’ютера',\r\n 'device.mobile': 'Телефон',\r\n 'device.mobileHint': 'Ширина для телефона',\r\n 'device.dark': 'Темна',\r\n 'device.darkHint': 'Темний режим вхідних',\r\n 'status.autosaveOn': 'автозбереження увімкнено',\r\n 'status.saved': 'збережено {time}',\r\n 'status.saveFailed': 'не збережено — сховище заповнено',\r\n 'canvas.meta': '{rows} рядків · {blocks} блоків · {width}px',\r\n 'tab.design': 'Стиль',\r\n 'tab.designHint': 'Оформити виділене',\r\n 'tab.blocks': 'Блоки',\r\n 'tab.blocksHint': 'Блоки вмісту та змінні',\r\n 'tab.rows': 'Секції',\r\n 'tab.rowsHint': 'Макети секцій і модель полотна',\r\n 'tab.files': 'Файли',\r\n 'tab.filesHint': 'Бібліотека файлів',\r\n 'tab.layers': 'Структура',\r\n 'tab.layersHint': 'Структура документа',\r\n 'tab.theme': 'Тема',\r\n 'tab.themeHint': 'Глобальні стилі',\r\n 'tab.data': 'Змін.',\r\n 'tab.dataHint': 'Змінні, надані вашим кодом',\r\n 'inspector.blockProperties': 'Властивості блока',\r\n 'inspector.sectionProperties': 'Властивості секції',\r\n 'inspector.title': 'Інспектор',\r\n 'inspector.sectionLabel': 'Секція',\r\n 'inspector.nothingSelected': 'Нічого не вибрано',\r\n 'action.duplicateHint': 'Дублювати — ⌘D',\r\n 'action.deleteHint': 'Видалити — ⌫',\r\n 'inspector.emptyBody':\r\n 'Виберіть рядок або блок на полотні, щоб оформити його тут. Перетягніть блоки з вкладки <strong style=\"color: var(--ed-text); font-weight: 600;\">Блоки</strong>; двічі клацніть текст, щоб редагувати його на місці.',\r\n 'inspector.shortcuts': 'Гарячі клавіші',\r\n 'shortcut.undoRedo': '⌘Z / ⌘⇧Z — скасувати, повторити',\r\n 'shortcut.duplicate': '⌘D — дублювати виділене',\r\n 'shortcut.delete': '⌫ — видалити виділене',\r\n 'shortcut.export': '⌘E — експортувати HTML',\r\n 'shortcut.escape': 'ESC — зняти виділення, закрити',\r\n 'blocks.dragHint': 'Перетягніть на полотно',\r\n 'blocks.count': '{count} блоків',\r\n 'rows.sectionLayouts': 'Макети секцій',\r\n 'rows.customMarkup': 'Власна розмітка',\r\n 'rows.htmlRowHint': 'Перетягніть, щоб вставити, або клацніть, щоб додати — рядок на всю ширину, який ви заповнюєте вихідним HTML',\r\n 'rows.rawHtmlSection': 'Секція з вихідним HTML',\r\n 'rows.rawHtmlDesc': 'Секція на всю ширину, ваша власна розмітка, все ще перетягується',\r\n 'rows.canvasModel': 'Модель полотна',\r\n 'rows.modeRowBased': 'На основі рядків',\r\n 'rows.modeFreeStack': 'Вільний стек',\r\n 'rows.hintRows':\r\n 'На основі секцій: спочатку розмістіть макет, потім блоки в його колонках — кожна секція має власний фон, межу, налаштування flex або сітки.',\r\n 'rows.hintStack': 'Вільний стек: без макетів — кожен доданий блок стає власною секцією на всю ширину, укладеною по порядку.',\r\n 'files.libraryCount': 'Бібліотека — {count} файлів',\r\n 'files.openManager': 'Відкрити файловий менеджер',\r\n 'files.dragToCanvas': 'Перетягніть будь-який файл прямо на полотно, щоб розмістити його як блок зображення.',\r\n 'layers.structure': 'Структура',\r\n 'layers.sectionSingle': 'Секція',\r\n 'layers.sectionMulti': 'Секція · {count} кол.',\r\n 'layers.blockCount': '{count} бл.',\r\n 'theme.globalStyles': 'Глобальні стилі',\r\n 'vars.title': 'Змінні',\r\n 'vars.fromCode': '{count} з вашого коду',\r\n 'vars.declaredNote': 'Оголошені вашим застосунком — полотно завжди показує токен, ніколи значення.',\r\n 'vars.filterPlaceholder': 'Фільтр змінних…',\r\n 'vars.insertHint': 'Натисніть, щоб вставити у вибраний текст, заголовок або кнопку',\r\n 'vars.insert': 'вставити',\r\n 'vars.noMatch': 'Немає змінних, що відповідають цьому фільтру.',\r\n 'vars.noneDeclared': 'Ваш застосунок ще не оголосив жодних змінних.',\r\n 'vars.rteHint': 'Під час редагування тексту ви також можете вибрати змінну прямо з випадного списку вбудованої панелі інструментів.',\r\n 'modal.fileManager': 'Файловий менеджер',\r\n 'modal.assetsTitle': 'Файли',\r\n 'modal.replaceImage': 'Замінити зображення',\r\n 'library.searchPlaceholder': 'Пошук файлів…',\r\n 'action.upload': 'Завантажити',\r\n 'library.clickToPlace': 'Натисніть на файл, щоб розмістити · або перетягніть файл на полотно',\r\n 'library.clickToReplace': 'Натисніть на файл, щоб замінити вибране зображення',\r\n 'library.storageLabel': '{count} файлів · {size}',\r\n 'library.folders': 'Папки',\r\n 'library.dropHint': 'Перетягніть файли зображень сюди для завантаження — або скористайтеся кнопкою «Завантажити».',\r\n 'library.deleteFileHint': 'Видалити файл',\r\n 'library.del': 'ВИДАЛ',\r\n 'toast.assetDeleted': '{name} видалено',\r\n 'modal.export': 'Експорт',\r\n 'modal.exportTitle': 'HTML листа на основі таблиць',\r\n 'export.copy': 'Копіювати',\r\n 'export.copied': 'Скопійовано',\r\n 'action.download': 'Завантажити',\r\n 'export.meta': '{kb} КБ · таблиці + вбудовані стилі · ширини, безпечні для Outlook',\r\n 'modal.rawHtmlTitle': 'Вихідний HTML, живий перегляд',\r\n 'code.statusEdited': 'Перегляд коду — змінено — перегляд наживо, ще не застосовано',\r\n 'code.statusSynced': 'Перегляд коду — синхронізовано з полотном',\r\n 'action.reload': 'Оновити',\r\n 'action.reloadHint': 'Оновити джерело з полотна',\r\n 'action.applyToCanvas': 'Застосувати до полотна',\r\n 'action.applyToCanvasHint': 'Розібрати джерело назад у редаговані рядки',\r\n 'action.closeWithoutApplyingHint': 'Закрити без застосування',\r\n 'code.source': 'Джерело',\r\n 'code.livePreview': 'Живий перегляд',\r\n 'code.liveHtmlPreviewTitle': 'Живий перегляд HTML',\r\n 'code.applyNote':\r\n 'Застосування розбирає кожен рядок таблиці верхнього рівня в рядок полотна, який ви все ще можете вибирати, переупорядковувати та видаляти — розмітка, написана вручну, переживає цей процес.',\r\n 'code.meta': '{kb} КБ · {lines} рядків',\r\n 'toast.sourceReloaded': 'Джерело оновлено з полотна',\r\n 'toast.sourceAppliedOne': 'Джерело застосовано — 1 рядок на полотні',\r\n 'toast.sourceAppliedMany': 'Джерело застосовано — {rows} рядків на полотні',\r\n 'toast.parseError': 'Не вдалося розібрати цей HTML',\r\n 'modal.copyAssist': 'Помічник із текстом',\r\n 'modal.draftCopyTitle': 'Скласти текст для цієї кампанії',\r\n 'ai.goal': 'Мета',\r\n 'ai.tone': 'Тон',\r\n 'ai.briefLabel': 'Про що цей лист?',\r\n 'ai.briefPlaceholder': 'напр. Осіння колекція, 15% для підписників, безкоштовна доставка від 150$',\r\n 'ai.generate': 'Згенерувати текст',\r\n 'ai.writing': 'Пишемо…',\r\n 'ai.kindHeadline': 'Заголовок',\r\n 'ai.kindBody': 'Основний текст',\r\n 'ai.kindButton': 'Текст кнопки',\r\n 'ai.actionInsertHeading': 'Вставити як заголовок',\r\n 'ai.actionInsertText': 'Вставити як текстовий блок',\r\n 'ai.actionInsertButton': 'Вставити як кнопку',\r\n 'toast.headingAdded': 'Заголовок додано',\r\n 'toast.textBlockAdded': 'Текстовий блок додано',\r\n 'toast.buttonAdded': 'Кнопку додано',\r\n 'preview.kickerMobile': 'Перегляд — телефон 375px',\r\n 'preview.kickerDark': 'Перегляд — темні вхідні',\r\n 'preview.kickerDesktop': 'Перегляд — комп’ютер {width}px',\r\n 'action.close': 'Закрити',\r\n 'toast.duplicated': 'Продубльовано',\r\n 'toast.fileUploadedOne': 'Завантажено 1 файл',\r\n 'toast.fileUploadedMany': 'Завантажено файлів: {count}',\r\n 'toast.imageReplaced': 'Зображення замінено',\r\n 'toast.imageAdded': 'Зображення додано на полотно',\r\n 'toast.htmlCopied': 'HTML скопійовано в буфер обміну',\r\n 'toast.templateLoaded': '{name} завантажено',\r\n 'toast.snippetDefaultLabel': 'Фрагмент',\r\n 'toast.snippetInserted': '{name} вставлено',\r\n 'toast.snippetCopied': '{name} скопійовано — виберіть текстовий блок, щоб вставити',\r\n};\r\n\r\n\nObject.assign(exports, { UK });\n\n};\n__modules[\"core/icons.js\"] = function(module, exports, __require) {\n/** Thin-stroke icon set (Lucide grammar, stroke 1.5), ported path-for-path from the original prototype. */\r\nconst ICONS = {\r\n text: ['M4 6h16', 'M4 12h12', 'M4 18h9'],\r\n image: [['rect', 3, 4, 18, 16], ['circle', 8.5, 9.5, 1.5], 'M3 17l5-5 4 4 3-3 6 6'],\r\n folder: ['M3 7h7l2 2h9v10H3z', 'M3 7V5h7l2 2'],\r\n button: [['rect', 3, 8, 18, 8], 'M8 12h8'],\r\n divider: ['M3 12h18', 'M6 7h12', 'M6 17h12'],\r\n spacer: ['M3 5h18', 'M3 19h18', 'M12 9v6', 'M9.5 11.5L12 9l2.5 2.5', 'M9.5 12.5L12 15l2.5-2.5'],\r\n social: [['rect', 3, 9, 5, 6], ['rect', 9.5, 9, 5, 6], ['rect', 16, 9, 5, 6]],\r\n video: [['rect', 3, 5, 18, 14], 'M10 9.5l5 2.5-5 2.5z'],\r\n html: ['M9 8l-4 4 4 4', 'M15 8l4 4-4 4'],\r\n product: [['rect', 3, 6, 18, 14], 'M3 11h18', 'M9 6v5'],\r\n countdown: [['circle', 12, 13, 8], 'M12 9.5V13l2.5 1.5', 'M9 3h6'],\r\n menu: [['rect', 3, 4, 18, 5], 'M6 14h5', 'M13 14h5', 'M6 18h12'],\r\n grip: [['circle', 9, 7, 1], ['circle', 15, 7, 1], ['circle', 9, 12, 1], ['circle', 15, 12, 1], ['circle', 9, 17, 1], ['circle', 15, 17, 1]],\r\n move: ['M12 3v18', 'M3 12h18', 'M9.5 5.5L12 3l2.5 2.5', 'M9.5 18.5L12 21l2.5-2.5', 'M5.5 9.5L3 12l2.5 2.5', 'M18.5 9.5L21 12l-2.5 2.5'],\r\n sliders: ['M4 7h9', 'M19 7h1', ['circle', 16, 7, 2.2], 'M4 17h3', 'M13 17h7', ['circle', 10, 17, 2.2]],\r\n footer: [['rect', 3, 4, 18, 16], 'M3 15h18', 'M7 19h6'],\r\n up: ['M12 19V5', 'M6 11l6-6 6 6'],\r\n down: ['M12 5v14', 'M6 13l6 6 6-6'],\r\n copy: [['rect', 9, 9, 12, 12], 'M15 5H5a2 2 0 0 0-2 2v10'],\r\n trash: ['M4 7h16', 'M9 7V5h6v2', 'M6 7l1 12h10l1-12'],\r\n undo: ['M3 8h11a5 5 0 0 1 0 10H8', 'M7 4L3 8l4 4'],\r\n redo: ['M21 8H10a5 5 0 0 0 0 10h6', 'M17 4l4 4-4 4'],\r\n eye: ['M2 12s3.6-6 10-6 10 6 10 6-3.6 6-10 6-10-6-10-6z', ['circle', 12, 12, 3]],\r\n monitor: [['rect', 3, 4, 18, 13], 'M8 21h8', 'M12 17v4'],\r\n phone: [['rect', 7, 2, 10, 20], 'M10.5 5h3', 'M11.5 19h1'],\r\n download: ['M12 4v11', 'M7.5 11L12 15.5 16.5 11', 'M4 20h16'],\r\n upload: ['M12 20V9', 'M7.5 13.5L12 9l4.5 4.5', 'M4 4h16'],\r\n moon: ['M20 14.5A8.5 8.5 0 1 1 9.5 4a7 7 0 0 0 10.5 10.5z'],\r\n sun: [['circle', 12, 12, 4.2], 'M12 3v2', 'M12 19v2', 'M3 12h2', 'M19 12h2', 'M5.6 5.6l1.4 1.4', 'M17 17l1.4 1.4', 'M18.4 5.6L17 7', 'M7 17l-1.4 1.4'],\r\n spark: ['M12 4l1.7 4.8L18.5 10.5l-4.8 1.7L12 17l-1.7-4.8L5.5 10.5l4.8-1.7z', 'M18 17l.8 2.2L21 20l-2.2.8L18 23l-.8-2.2L15 20l2.2-.8z'],\r\n code: ['M8 7l-5 5 5 5', 'M16 7l5 5-5 5', 'M13 5l-2 14'],\r\n bold: ['M7 5h6a3.5 3.5 0 0 1 0 7H7z', 'M7 12h7a3.5 3.5 0 0 1 0 7H7z'],\r\n italic: ['M15 5h-4', 'M13 19H9', 'M14 5l-3 14'],\r\n underline: ['M7 4v7a5 5 0 0 0 10 0V4', 'M6 20h12'],\r\n strike: ['M4 12h16', 'M8 7a4 3 0 0 1 8 0', 'M8 16a4 3 0 0 0 8 0'],\r\n link: ['M10 13a4 4 0 0 0 6 .5l2-2a4 4 0 0 0-5.5-5.5l-1 1', 'M14 11a4 4 0 0 0-6-.5l-2 2A4 4 0 0 0 11.5 18l1-1'],\r\n list: ['M9 6h11', 'M9 12h11', 'M9 18h11', 'M4.5 6h.6', 'M4.5 12h.6', 'M4.5 18h.6'],\r\n clear: ['M6 6l12 12', 'M18 6L6 18'],\r\n tag: ['M4 8h4', 'M4 16h4', 'M20 8h-4', 'M20 16h-4', 'M10 5l4 14'],\r\n play: ['M8 5.5l10 6.5-10 6.5z'],\r\n pause: ['M9.5 5v14', 'M14.5 5v14'],\r\n refresh: ['M20 11a8 8 0 1 0-2.3 6.3', 'M20 5v6h-6'],\r\n check: ['M4 12.5l5 5L20 7'],\r\n plus: ['M12 5v14', 'M5 12h14'],\r\n minus: ['M5 12h14'],\r\n superscript: ['M4 18 9 6l5 12', 'M6 14h6', 'M16 5h4l-4 5h4'],\r\n subscript: ['M4 16 9 4l5 12', 'M6 12h6', 'M16 15h4l-4 5h4'],\r\n typeColor: ['M5 18 11 5h2l6 13', 'M7.5 13h9', 'M4 21h16'],\r\n highlighter: ['M7 15 16 6l3 3-9 9z', 'M5 17l2 2', 'M4 21h16'],\r\n eraser: ['M4 16 13 7l5 5-8 8H6z', 'M12 20h8'],\r\n formatClear: ['M5 18 11 5h2l4 9', 'M7.5 13h7', 'M16 17l5 5', 'M21 17l-5 5'],\r\n chevronDown: ['M7 9l5 5 5-5'],\r\n x: ['M4 4l16 16', 'M20 4L4 20'],\r\n instagram: [['rect', 3, 3, 18, 18], ['circle', 12, 12, 4], ['circle', 17, 7, 0.9]],\r\n linkedin: [['rect', 3, 3, 18, 18], 'M8 10v7', ['circle', 8, 7.2, 0.9], 'M12 17v-4a2.5 2.5 0 0 1 5 0v4'],\r\n facebook: [['rect', 3, 3, 18, 18], 'M15 8h-1.5A2.5 2.5 0 0 0 11 10.5V21', 'M8.5 13h5'],\r\n youtube: [['rect', 2.5, 6, 19, 12], 'M11 10l4 2-4 2z'],\r\n mail: [['rect', 3, 5, 18, 14], 'M3 7l9 6 9-6'],\r\n mailSpark: [['rect', 3, 6, 16, 12], 'M4 8l7 5 7-5', 'M21 3v4', 'M19 5h4'],\r\n globe: [['circle', 12, 12, 9], 'M3 12h18', 'M12 3a15 15 0 0 1 0 18', 'M12 3a15 15 0 0 0 0 18'],\r\n heading: ['M6 5v14', 'M18 5v14', 'M6 12h12'],\r\n quote: [['rect', 4, 6, 5, 5], ['rect', 15, 6, 5, 5], 'M9 11c0 4-1.7 5.7-5 6.4', 'M20 11c0 4-1.7 5.7-5 6.4'],\r\n table: [['rect', 3, 4, 18, 16], 'M3 9h18', 'M3 14.5h18', 'M9 9v11', 'M15 9v11'],\r\n card: [['rect', 3, 4, 18, 16], 'M3 12h18', 'M7 16h8'],\r\n hero: [['rect', 3, 4, 18, 16], 'M6 11h12', 'M6 15h6', ['rect', 14.5, 13.5, 4, 3]],\r\n stats: ['M5 19v-7', 'M12 19V5', 'M19 19v-4', 'M3 19h18'],\r\n gallery: [['rect', 3, 4, 7.5, 7.5], ['rect', 13.5, 4, 7.5, 7.5], ['rect', 3, 12.5, 7.5, 7.5], ['rect', 13.5, 12.5, 7.5, 7.5]],\r\n embed: [['rect', 2.5, 5, 19, 14], 'M2.5 9h19', 'M10.5 11.5l3.5 2-3.5 2z'],\r\n css: ['M5 4h14l-1.5 15L12 21l-5.5-2z', 'M8.5 9h7', 'M9 13h5'],\r\n codeblock: [['rect', 3, 4, 18, 16], 'M9.5 10l-2 2 2 2', 'M14.5 10l2 2-2 2'],\r\n data: ['M4 6c0-1.7 3.6-3 8-3s8 1.3 8 3-3.6 3-8 3-8-1.3-8-3z', 'M4 6v12c0 1.7 3.6 3 8 3s8-1.3 8-3V6', 'M4 12c0 1.7 3.6 3 8 3s8-1.3 8-3'],\r\n box: [['rect', 3, 4, 18, 16], ['rect', 7, 8, 10, 8]],\r\n grid: [['rect', 3, 5, 8, 14], ['rect', 13, 5, 8, 14]],\r\n svg: ['M4 19L10 5l4 9 2-3 4 8z', ['circle', 7.5, 7.5, 2]],\r\n form: [['rect', 3, 5, 18, 5], ['rect', 3, 13, 11, 5], 'M17 15.5h4'],\r\n script: ['M9 5H6a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h3', 'M15 5h3a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1h-3', 'M13 8l-2 8'],\r\n anchor: [['circle', 12, 6, 2.5], 'M12 8.5V20', 'M5 14a7 7 0 0 0 14 0'],\r\n paint: ['M5 11V6a1 1 0 0 1 1-1h11a1 1 0 0 1 1 1v5H5z', 'M5 11h13', 'M11 11v4', 'M9 15h4v5H9z'],\r\n alignLeft: ['M4 6h16', 'M4 12h10', 'M4 18h13'],\r\n alignCenter: ['M4 6h16', 'M7 12h10', 'M6 18h12'],\r\n alignRight: ['M4 6h16', 'M10 12h10', 'M7 18h13'],\r\n alignJustify: ['M4 6h16', 'M4 12h16', 'M4 18h16'],\r\n listOrdered: ['M9 6h11', 'M9 12h11', 'M9 18h11', 'M4 5.5h1.5V9', 'M4 15h2v3H4'],\r\n indent: ['M11 6h9', 'M11 12h9', 'M11 18h9', 'M4 9l3 3-3 3'],\r\n outdent: ['M11 6h9', 'M11 12h9', 'M11 18h9', 'M7 9l-3 3 3 3'],\r\n unlink: ['M10 13a4 4 0 0 0 4.6 1.4', 'M14 11a4 4 0 0 0-4.6-1.4', 'M4 4l16 16'],\r\n inlineCode: ['M8.5 9l-3 3 3 3', 'M15.5 9l3 3-3 3'],\r\n tiktok: [['circle', 9, 16, 3], 'M12 16V4', 'M12 6c1.5 1.5 3 2 5 2v2'],\r\n pinterest: [['circle', 12, 12, 9], 'M9 16c1-2 1.5-4 2-7a2.2 2.2 0 1 1 4.4 0.3c-0.2 2-1.4 3.7-3.4 3.7'],\r\n snapchat: ['M12 4c3 0 5 2.2 5 5.2 0 1 0.2 2 0.8 2.6 0.6 0.6 1.2 0.8 1.2 1.4 0 0.8-1 1-1.8 1.2-0.2 1 0.4 1.6 1.4 1.8-0.2 0.8-1.4 1-2.2 1-0.6 1.6-2 2.6-4.4 2.6s-3.8-1-4.4-2.6c-0.8 0-2-0.2-2.2-1 1-0.2 1.6-0.8 1.4-1.8-0.8-0.2-1.8-0.4-1.8-1.2 0-0.6 0.6-0.8 1.2-1.4 0.6-0.6 0.8-1.6 0.8-2.6C7 6.2 9 4 12 4z'],\r\n whatsapp: [['circle', 12, 12, 9], 'M8.5 15.5l0.8-2.8a5 5 0 1 1 2.9 2.6z'],\r\n threads: ['M8 8c-2 1-3 3-3 5.5 0 3.5 2.5 5.5 6 5.5 3 0 5-1.5 5-4 0-1.8-1.2-3-3-3.3 1.3-0.3 2.2-1.2 2.2-2.5 0-1.8-1.7-3-4-3-2 0-3.3 0.8-4 2'],\r\n discord: ['M7 8c3-1.3 7-1.3 10 0', 'M6 9c-1.5 3-2 6-1.5 8.5 1.8 1.3 3.5 2 3.5 2l1-1.7c-0.6-0.2-1.2-0.5-1.7-0.8', 'M18 9c1.5 3 2 6 1.5 8.5-1.8 1.3-3.5 2-3.5 2l-1-1.7c0.6-0.2 1.2-0.5 1.7-0.8', ['circle', 9, 13, 1.1], ['circle', 15, 13, 1.1]],\r\n telegram: [['circle', 12, 12, 9], 'M7.5 12.3l9-4.3-3 9-2.3-3.2-2 1.7-0.2-2.7z'],\r\n reddit: [['circle', 12, 14, 6], 'M12 8V5', ['circle', 12, 4.3, 0.9], ['circle', 9.5, 14, 1], ['circle', 14.5, 14, 1], 'M9 17c1 1 5 1 6 0'],\r\n spotify: [['circle', 12, 12, 9], 'M7.5 10c3-1 6-1 9 0', 'M7.8 13c2.5-0.8 5-0.8 7.5 0', 'M8.2 16c2-0.6 4-0.6 6 0'],\r\n behance: ['M4 7h6a2.5 2.5 0 0 1 0 5H4z', 'M4 12h6.5a2.7 2.7 0 0 1 0 5.4H4z', 'M14 12a4 4 0 0 1 8 0', 'M14 14h8', 'M15.5 9h5'],\r\n dribbble: [['circle', 12, 12, 9], 'M4 10c4 1.2 12 1.2 16.5 0', 'M8.5 4.5c2.5 3 5 8.5 5 14.5', 'M9 20c2-4 7-6 11.5-5'],\r\n};\r\n\r\n/**\r\n * Official brand glyphs (Simple Icons, CC0), rendered as filled paths --\r\n * the hand-drawn stroke approximations they replace read as amateur at\r\n * social-strip sizes. Kept separate from ICONS because these render\r\n * fill-based (icon() is a stroke builder) and because the key 'x' must not\r\n * shadow the ✕ close icon; resolve through brandIcon(), never icon().\r\n */\r\nconst BRAND_GLYPHS = {\r\n behance: 'M16.969 16.927a2.561 2.561 0 0 0 1.901.677 2.501 2.501 0 0 0 1.531-.475c.362-.235.636-.584.779-.99h2.585a5.091 5.091 0 0 1-1.9 2.896 5.292 5.292 0 0 1-3.091.88 5.839 5.839 0 0 1-2.284-.433 4.871 4.871 0 0 1-1.723-1.211 5.657 5.657 0 0 1-1.08-1.874 7.057 7.057 0 0 1-.383-2.393c-.005-.8.129-1.595.396-2.349a5.313 5.313 0 0 1 5.088-3.604 4.87 4.87 0 0 1 2.376.563c.661.362 1.231.87 1.668 1.485a6.2 6.2 0 0 1 .943 2.133c.194.821.263 1.666.205 2.508h-7.699c-.063.79.184 1.574.688 2.187ZM6.947 4.084a8.065 8.065 0 0 1 1.928.198 4.29 4.29 0 0 1 1.49.638c.418.303.748.711.958 1.182.241.579.357 1.203.341 1.83a3.506 3.506 0 0 1-.506 1.961 3.726 3.726 0 0 1-1.503 1.287 3.588 3.588 0 0 1 2.027 1.437c.464.747.697 1.615.67 2.494a4.593 4.593 0 0 1-.423 2.032 3.945 3.945 0 0 1-1.163 1.413 5.114 5.114 0 0 1-1.683.807 7.135 7.135 0 0 1-1.928.259H0V4.084h6.947Zm-.235 12.9c.308.004.616-.029.916-.099a2.18 2.18 0 0 0 .766-.332c.228-.158.411-.371.534-.619.142-.317.208-.663.191-1.009a2.08 2.08 0 0 0-.642-1.715 2.618 2.618 0 0 0-1.696-.505h-3.54v4.279h3.471Zm13.635-5.967a2.13 2.13 0 0 0-1.654-.619 2.336 2.336 0 0 0-1.163.259 2.474 2.474 0 0 0-.738.62 2.359 2.359 0 0 0-.396.792c-.074.239-.12.485-.137.734h4.769a3.239 3.239 0 0 0-.679-1.785l-.002-.001Zm-13.813-.648a2.254 2.254 0 0 0 1.423-.433c.399-.355.607-.88.56-1.413a1.916 1.916 0 0 0-.178-.891 1.298 1.298 0 0 0-.495-.533 1.851 1.851 0 0 0-.711-.274 3.966 3.966 0 0 0-.835-.073H3.241v3.631h3.293v-.014ZM21.62 5.122h-5.976v1.527h5.976V5.122Z',\r\n discord: 'M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z',\r\n dribbble: 'M12 24C5.385 24 0 18.615 0 12S5.385 0 12 0s12 5.385 12 12-5.385 12-12 12zm10.12-10.358c-.35-.11-3.17-.953-6.384-.438 1.34 3.684 1.887 6.684 1.992 7.308 2.3-1.555 3.936-4.02 4.395-6.87zm-6.115 7.808c-.153-.9-.75-4.032-2.19-7.77l-.066.02c-5.79 2.015-7.86 6.025-8.04 6.4 1.73 1.358 3.92 2.166 6.29 2.166 1.42 0 2.77-.29 4-.814zm-11.62-2.58c.232-.4 3.045-5.055 8.332-6.765.135-.045.27-.084.405-.12-.26-.585-.54-1.167-.832-1.74C7.17 11.775 2.206 11.71 1.756 11.7l-.004.312c0 2.633.998 5.037 2.634 6.855zm-2.42-8.955c.46.008 4.683.026 9.477-1.248-1.698-3.018-3.53-5.558-3.8-5.928-2.868 1.35-5.01 3.99-5.676 7.17zM9.6 2.052c.282.38 2.145 2.914 3.822 6 3.645-1.365 5.19-3.44 5.373-3.702-1.81-1.61-4.19-2.586-6.795-2.586-.825 0-1.63.1-2.4.285zm10.335 3.483c-.218.29-1.935 2.493-5.724 4.04.24.49.47.985.68 1.486.08.18.15.36.22.53 3.41-.43 6.8.26 7.14.33-.02-2.42-.88-4.64-2.31-6.38z',\r\n facebook: 'M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z',\r\n instagram: 'M7.0301.084c-1.2768.0602-2.1487.264-2.911.5634-.7888.3075-1.4575.72-2.1228 1.3877-.6652.6677-1.075 1.3368-1.3802 2.127-.2954.7638-.4956 1.6365-.552 2.914-.0564 1.2775-.0689 1.6882-.0626 4.947.0062 3.2586.0206 3.6671.0825 4.9473.061 1.2765.264 2.1482.5635 2.9107.308.7889.72 1.4573 1.388 2.1228.6679.6655 1.3365 1.0743 2.1285 1.38.7632.295 1.6361.4961 2.9134.552 1.2773.056 1.6884.069 4.9462.0627 3.2578-.0062 3.668-.0207 4.9478-.0814 1.28-.0607 2.147-.2652 2.9098-.5633.7889-.3086 1.4578-.72 2.1228-1.3881.665-.6682 1.0745-1.3378 1.3795-2.1284.2957-.7632.4966-1.636.552-2.9124.056-1.2809.0692-1.6898.063-4.948-.0063-3.2583-.021-3.6668-.0817-4.9465-.0607-1.2797-.264-2.1487-.5633-2.9117-.3084-.7889-.72-1.4568-1.3876-2.1228C21.2982 1.33 20.628.9208 19.8378.6165 19.074.321 18.2017.1197 16.9244.0645 15.6471.0093 15.236-.005 11.977.0014 8.718.0076 8.31.0215 7.0301.0839m.1402 21.6932c-1.17-.0509-1.8053-.2453-2.2287-.408-.5606-.216-.96-.4771-1.3819-.895-.422-.4178-.6811-.8186-.9-1.378-.1644-.4234-.3624-1.058-.4171-2.228-.0595-1.2645-.072-1.6442-.079-4.848-.007-3.2037.0053-3.583.0607-4.848.05-1.169.2456-1.805.408-2.2282.216-.5613.4762-.96.895-1.3816.4188-.4217.8184-.6814 1.3783-.9003.423-.1651 1.0575-.3614 2.227-.4171 1.2655-.06 1.6447-.072 4.848-.079 3.2033-.007 3.5835.005 4.8495.0608 1.169.0508 1.8053.2445 2.228.408.5608.216.96.4754 1.3816.895.4217.4194.6816.8176.9005 1.3787.1653.4217.3617 1.056.4169 2.2263.0602 1.2655.0739 1.645.0796 4.848.0058 3.203-.0055 3.5834-.061 4.848-.051 1.17-.245 1.8055-.408 2.2294-.216.5604-.4763.96-.8954 1.3814-.419.4215-.8181.6811-1.3783.9-.4224.1649-1.0577.3617-2.2262.4174-1.2656.0595-1.6448.072-4.8493.079-3.2045.007-3.5825-.006-4.848-.0608M16.953 5.5864A1.44 1.44 0 1 0 18.39 4.144a1.44 1.44 0 0 0-1.437 1.4424M5.8385 12.012c.0067 3.4032 2.7706 6.1557 6.173 6.1493 3.4026-.0065 6.157-2.7701 6.1506-6.1733-.0065-3.4032-2.771-6.1565-6.174-6.1498-3.403.0067-6.156 2.771-6.1496 6.1738M8 12.0077a4 4 0 1 1 4.008 3.9921A3.9996 3.9996 0 0 1 8 12.0077',\r\n linkedin: 'M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z',\r\n pinterest: 'M12.017 0C5.396 0 .029 5.367.029 11.987c0 5.079 3.158 9.417 7.618 11.162-.105-.949-.199-2.403.041-3.439.219-.937 1.406-5.957 1.406-5.957s-.359-.72-.359-1.781c0-1.663.967-2.911 2.168-2.911 1.024 0 1.518.769 1.518 1.688 0 1.029-.653 2.567-.992 3.992-.285 1.193.6 2.165 1.775 2.165 2.128 0 3.768-2.245 3.768-5.487 0-2.861-2.063-4.869-5.008-4.869-3.41 0-5.409 2.562-5.409 5.199 0 1.033.394 2.143.889 2.741.099.12.112.225.085.345-.09.375-.293 1.199-.334 1.363-.053.225-.172.271-.401.165-1.495-.69-2.433-2.878-2.433-4.646 0-3.776 2.748-7.252 7.92-7.252 4.158 0 7.392 2.967 7.392 6.923 0 4.135-2.607 7.462-6.233 7.462-1.214 0-2.354-.629-2.758-1.379l-.749 2.848c-.269 1.045-1.004 2.352-1.498 3.146 1.123.345 2.306.535 3.55.535 6.607 0 11.985-5.365 11.985-11.987C23.97 5.39 18.592.026 11.985.026L12.017 0z',\r\n reddit: 'M12 0C5.373 0 0 5.373 0 12c0 3.314 1.343 6.314 3.515 8.485l-2.286 2.286C.775 23.225 1.097 24 1.738 24H12c6.627 0 12-5.373 12-12S18.627 0 12 0Zm4.388 3.199c1.104 0 1.999.895 1.999 1.999 0 1.105-.895 2-1.999 2-.946 0-1.739-.657-1.947-1.539v.002c-1.147.162-2.032 1.15-2.032 2.341v.007c1.776.067 3.4.567 4.686 1.363.473-.363 1.064-.58 1.707-.58 1.547 0 2.802 1.254 2.802 2.802 0 1.117-.655 2.081-1.601 2.531-.088 3.256-3.637 5.876-7.997 5.876-4.361 0-7.905-2.617-7.998-5.87-.954-.447-1.614-1.415-1.614-2.538 0-1.548 1.255-2.802 2.803-2.802.645 0 1.239.218 1.712.585 1.275-.79 2.881-1.291 4.64-1.365v-.01c0-1.663 1.263-3.034 2.88-3.207.188-.911.993-1.595 1.959-1.595Zm-8.085 8.376c-.784 0-1.459.78-1.506 1.797-.047 1.016.64 1.429 1.426 1.429.786 0 1.371-.369 1.418-1.385.047-1.017-.553-1.841-1.338-1.841Zm7.406 0c-.786 0-1.385.824-1.338 1.841.047 1.017.634 1.385 1.418 1.385.785 0 1.473-.413 1.426-1.429-.046-1.017-.721-1.797-1.506-1.797Zm-3.703 4.013c-.974 0-1.907.048-2.77.135-.147.015-.241.168-.183.305.483 1.154 1.622 1.964 2.953 1.964 1.33 0 2.47-.81 2.953-1.964.057-.137-.037-.29-.184-.305-.863-.087-1.795-.135-2.769-.135Z',\r\n snapchat: 'M12.206.793c.99 0 4.347.276 5.93 3.821.529 1.193.403 3.219.299 4.847l-.003.06c-.012.18-.022.345-.03.51.075.045.203.09.401.09.3-.016.659-.12 1.033-.301.165-.088.344-.104.464-.104.182 0 .359.029.509.09.45.149.734.479.734.838.015.449-.39.839-1.213 1.168-.089.029-.209.075-.344.119-.45.135-1.139.36-1.333.81-.09.224-.061.524.12.868l.015.015c.06.136 1.526 3.475 4.791 4.014.255.044.435.27.42.509 0 .075-.015.149-.045.225-.24.569-1.273.988-3.146 1.271-.059.091-.12.375-.164.57-.029.179-.074.36-.134.553-.076.271-.27.405-.555.405h-.03c-.135 0-.313-.031-.538-.074-.36-.075-.765-.135-1.273-.135-.3 0-.599.015-.913.074-.6.104-1.123.464-1.723.884-.853.599-1.826 1.288-3.294 1.288-.06 0-.119-.015-.18-.015h-.149c-1.468 0-2.427-.675-3.279-1.288-.599-.42-1.107-.779-1.707-.884-.314-.045-.629-.074-.928-.074-.54 0-.958.089-1.272.149-.211.043-.391.074-.54.074-.374 0-.523-.224-.583-.42-.061-.192-.09-.389-.135-.567-.046-.181-.105-.494-.166-.57-1.918-.222-2.95-.642-3.189-1.226-.031-.063-.052-.15-.055-.225-.015-.243.165-.465.42-.509 3.264-.54 4.73-3.879 4.791-4.02l.016-.029c.18-.345.224-.645.119-.869-.195-.434-.884-.658-1.332-.809-.121-.029-.24-.074-.346-.119-1.107-.435-1.257-.93-1.197-1.273.09-.479.674-.793 1.168-.793.146 0 .27.029.383.074.42.194.789.3 1.104.3.234 0 .384-.06.465-.105l-.046-.569c-.098-1.626-.225-3.651.307-4.837C7.392 1.077 10.739.807 11.727.807l.419-.015h.06z',\r\n spotify: 'M12 0C5.4 0 0 5.4 0 12s5.4 12 12 12 12-5.4 12-12S18.66 0 12 0zm5.521 17.34c-.24.359-.66.48-1.021.24-2.82-1.74-6.36-2.101-10.561-1.141-.418.122-.779-.179-.899-.539-.12-.421.18-.78.54-.9 4.56-1.021 8.52-.6 11.64 1.32.42.18.479.659.301 1.02zm1.44-3.3c-.301.42-.841.6-1.262.3-3.239-1.98-8.159-2.58-11.939-1.38-.479.12-1.02-.12-1.14-.6-.12-.48.12-1.021.6-1.141C9.6 9.9 15 10.561 18.72 12.84c.361.181.54.78.241 1.2zm.12-3.36C15.24 8.4 8.82 8.16 5.16 9.301c-.6.179-1.2-.181-1.38-.721-.18-.601.18-1.2.72-1.381 4.26-1.26 11.28-1.02 15.721 1.621.539.3.719 1.02.419 1.56-.299.421-1.02.599-1.559.3z',\r\n telegram: 'M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z',\r\n threads: 'M12.186 24h-.007c-3.581-.024-6.334-1.205-8.184-3.509C2.35 18.44 1.5 15.586 1.472 12.01v-.017c.03-3.579.879-6.43 2.525-8.482C5.845 1.205 8.6.024 12.18 0h.014c2.746.02 5.043.725 6.826 2.098 1.677 1.29 2.858 3.13 3.509 5.467l-2.04.569c-1.104-3.96-3.898-5.984-8.304-6.015-2.91.022-5.11.936-6.54 2.717C4.307 6.504 3.616 8.914 3.589 12c.027 3.086.718 5.496 2.057 7.164 1.43 1.783 3.631 2.698 6.54 2.717 2.623-.02 4.358-.631 5.8-2.045 1.647-1.613 1.618-3.593 1.09-4.798-.31-.71-.873-1.3-1.634-1.75-.192 1.352-.622 2.446-1.284 3.272-.886 1.102-2.14 1.704-3.73 1.79-1.202.065-2.361-.218-3.259-.801-1.063-.689-1.685-1.74-1.752-2.964-.065-1.19.408-2.285 1.33-3.082.88-.76 2.119-1.207 3.583-1.291a13.853 13.853 0 0 1 3.02.142c-.126-.742-.375-1.332-.75-1.757-.513-.586-1.308-.883-2.359-.89h-.029c-.844 0-1.992.232-2.721 1.32L7.734 7.847c.98-1.454 2.568-2.256 4.478-2.256h.044c3.194.02 5.097 1.975 5.287 5.388.108.046.216.094.321.142 1.49.7 2.58 1.761 3.154 3.07.797 1.82.871 4.79-1.548 7.158-1.85 1.81-4.094 2.628-7.277 2.65Zm1.003-11.69c-.242 0-.487.007-.739.021-1.836.103-2.98.946-2.916 2.143.067 1.256 1.452 1.839 2.784 1.767 1.224-.065 2.818-.543 3.086-3.71a10.5 10.5 0 0 0-2.215-.221z',\r\n tiktok: 'M12.525.02c1.31-.02 2.61-.01 3.91-.02.08 1.53.63 3.09 1.75 4.17 1.12 1.11 2.7 1.62 4.24 1.79v4.03c-1.44-.05-2.89-.35-4.2-.97-.57-.26-1.1-.59-1.62-.93-.01 2.92.01 5.84-.02 8.75-.08 1.4-.54 2.79-1.35 3.94-1.31 1.92-3.58 3.17-5.91 3.21-1.43.08-2.86-.31-4.08-1.03-2.02-1.19-3.44-3.37-3.65-5.71-.02-.5-.03-1-.01-1.49.18-1.9 1.12-3.72 2.58-4.96 1.66-1.44 3.98-2.13 6.15-1.72.02 1.48-.04 2.96-.04 4.44-.99-.32-2.15-.23-3.02.37-.63.41-1.11 1.04-1.36 1.75-.21.51-.15 1.07-.14 1.61.24 1.64 1.82 3.02 3.5 2.87 1.12-.01 2.19-.66 2.77-1.61.19-.33.4-.67.41-1.06.1-1.79.06-3.57.07-5.36.01-4.03-.01-8.05.02-12.07z',\r\n whatsapp: 'M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z',\r\n x: 'M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z',\r\n youtube: 'M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z',\r\n};\r\n\r\n/** One representative brand hex per platform, for the social block's \"Brand\" palette mode. Flat approximations, not exact brand-guideline swatches. */\r\nconst SOCIAL_BRAND = {\r\n instagram: '#E1306C', facebook: '#1877F2', linkedin: '#0A66C2', youtube: '#FF0000',\r\n x: '#0F1419', mail: '#6B6F73', globe: '#6B6F73',\r\n tiktok: '#111111', pinterest: '#E60023', snapchat: '#FFFC00', whatsapp: '#25D366',\r\n threads: '#101010', discord: '#5865F2', telegram: '#26A5E4', reddit: '#FF4500',\r\n spotify: '#1DB954', behance: '#1769FF', dribbble: '#EA4C89',\r\n};\r\n\r\n/** Perceived-luminance black/white pick for text or an icon drawn on top of a `hex` fill -- keeps brand-colored badges (some of which are very light, e.g. Snapchat yellow) legible without a per-platform ink override table. */\r\nfunction contrastInk(hex) {\r\n const h = String(hex || '').replace('#', '');\r\n const n = h.length === 3 ? h.split('').map((c) => c + c).join('') : h.padEnd(6, '0');\r\n const r = parseInt(n.slice(0, 2), 16) || 0;\r\n const g = parseInt(n.slice(2, 4), 16) || 0;\r\n const b = parseInt(n.slice(4, 6), 16) || 0;\r\n const luma = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\r\n return luma > 0.6 ? '#14171a' : '#ffffff';\r\n}\r\n\r\nconst SVG_NS = 'http://www.w3.org/2000/svg';\r\n\r\n/** Builds an SVG element for `name` at `size` (default 18), matching the original's stroke-1.5 style. */\r\nfunction icon(name, size) {\r\n const shapes = ICONS[name] || ICONS.globe;\r\n const svg = document.createElementNS(SVG_NS, 'svg');\r\n svg.setAttribute('width', String(size || 18));\r\n svg.setAttribute('height', String(size || 18));\r\n svg.setAttribute('viewBox', '0 0 24 24');\r\n svg.setAttribute('fill', 'none');\r\n svg.setAttribute('stroke', 'currentColor');\r\n svg.setAttribute('stroke-width', '1.5');\r\n svg.setAttribute('stroke-linecap', 'round');\r\n svg.setAttribute('stroke-linejoin', 'round');\r\n svg.style.display = 'block';\r\n svg.style.flex = 'none';\r\n shapes.forEach((shape) => svg.appendChild(shapeNode(shape)));\r\n return svg;\r\n}\r\n\r\n/**\r\n * Social-platform icon: the official filled brand glyph when we have one,\r\n * falling back to the stroke set (mail, globe, link, unknown labels).\r\n * Fill inherits currentColor exactly like the stroke icons, so the social\r\n * block's palette/contrast logic and the export round-trip are unchanged.\r\n */\r\nfunction brandIcon(name, size) {\r\n const d = BRAND_GLYPHS[name];\r\n if (!d) return icon(name, size);\r\n const svg = document.createElementNS(SVG_NS, 'svg');\r\n svg.setAttribute('width', String(size || 18));\r\n svg.setAttribute('height', String(size || 18));\r\n svg.setAttribute('viewBox', '0 0 24 24');\r\n svg.setAttribute('fill', 'currentColor');\r\n svg.style.display = 'block';\r\n svg.style.flex = 'none';\r\n const p = document.createElementNS(SVG_NS, 'path');\r\n p.setAttribute('d', d);\r\n svg.appendChild(p);\r\n return svg;\r\n}\r\n\r\nfunction shapeNode(shape) {\r\n if (typeof shape === 'string') {\r\n const p = document.createElementNS(SVG_NS, 'path');\r\n p.setAttribute('d', shape);\r\n return p;\r\n }\r\n const [kind, ...args] = shape;\r\n if (kind === 'rect') {\r\n const [x, y, w, h] = args;\r\n const r = document.createElementNS(SVG_NS, 'rect');\r\n r.setAttribute('x', String(x));\r\n r.setAttribute('y', String(y));\r\n r.setAttribute('width', String(w));\r\n r.setAttribute('height', String(h));\r\n return r;\r\n }\r\n const [cx, cy, cr] = args;\r\n const c = document.createElementNS(SVG_NS, 'circle');\r\n c.setAttribute('cx', String(cx));\r\n c.setAttribute('cy', String(cy));\r\n c.setAttribute('r', String(cr));\r\n return c;\r\n}\r\n\r\nfunction socialKey(label) {\r\n const l = String(label || '').toLowerCase();\r\n if (l.includes('insta')) return 'instagram';\r\n if (l.includes('linked')) return 'linkedin';\r\n if (l.includes('face')) return 'facebook';\r\n if (l.includes('you') || l.includes('tube')) return 'youtube';\r\n if (l === 'x' || l.includes('twitter')) return 'x';\r\n if (l.includes('tiktok') || l.includes('tik tok')) return 'tiktok';\r\n if (l.includes('pinterest')) return 'pinterest';\r\n if (l.includes('snap')) return 'snapchat';\r\n if (l.includes('whatsapp')) return 'whatsapp';\r\n if (l.includes('thread')) return 'threads';\r\n if (l.includes('discord')) return 'discord';\r\n if (l.includes('telegram')) return 'telegram';\r\n if (l.includes('reddit')) return 'reddit';\r\n if (l.includes('spotify')) return 'spotify';\r\n if (l.includes('behance')) return 'behance';\r\n if (l.includes('dribbble') || l.includes('dribble')) return 'dribbble';\r\n if (l.includes('mail') || l.includes('email')) return 'mail';\r\n return 'globe';\r\n}\r\n\nObject.assign(exports, { SOCIAL_BRAND, contrastInk, icon, brandIcon, socialKey });\n\n};\n__modules[\"core/ids.js\"] = function(module, exports, __require) {\nconst uid = () => Math.random().toString(36).slice(2, 9);\r\n\nObject.assign(exports, { uid });\n\n};\n__modules[\"core/import-html.js\"] = function(module, exports, __require) {\nconst {mkRow, blk} = __require(\"core/blocks.js\");\r\nconst {cleanImportHtml} = __require(\"core/sanitize.js\");\r\nconst {inlineStylesheets} = __require(\"core/css-cascade.js\");\r\n\r\n/**\r\n * HTML -> doc importer. Mirrors the canonical shapes `render/block-body.js`\r\n * renders (a table-based layout, one wrapping `<div>` per non-typographic\r\n * block) so that MailCraft's own exported HTML round-trips back into the\r\n * same block types it started as, while arbitrary/foreign email HTML\r\n * degrades gracefully: anything recognizable becomes a native block,\r\n * everything else becomes plain `text` (inline content) or a raw `html`\r\n * block (structural content) rather than being dropped.\r\n */\r\n\r\nfunction PX(v) {\r\n const n = parseFloat(v);\r\n return Number.isFinite(n) ? n : 0;\r\n}\r\n\r\n/** Font size only when absolute (px/pt/bare number). With the CSS cascade folding stylesheet rules inline, relative sizes reach the classifiers -- the classic `sub,sup{font-size:75%}` must not read as 75 pixels. */\r\nfunction fontPx(v) {\r\n const s = String(v || '').trim();\r\n if (!s || s.endsWith('%') || s.endsWith('em')) return 0;\r\n if (s.endsWith('pt')) return Math.round(PX(s) * 4 / 3);\r\n return PX(s);\r\n}\r\n\r\nfunction onlyChild(el, tag) {\r\n return el.children.length === 1 && el.firstElementChild.tagName === tag ? el.firstElementChild : null;\r\n}\r\n\r\nfunction textAlignOf(el) {\r\n let n = el;\r\n while (n && n.nodeType === 1) {\r\n // `align` on a TABLE floats the table itself (the classic\r\n // `align=\"center\"` content wrapper) and says nothing about text\r\n // alignment inside it -- honoring it centered every left-aligned\r\n // paragraph in a centered-layout email.\r\n const a = (n.style && n.style.textAlign) || (n.tagName === 'TABLE' ? '' : n.getAttribute('align'));\r\n if (a) return a;\r\n n = n.parentElement;\r\n }\r\n return 'left';\r\n}\r\n\r\n/** First value of a style property found walking from `el` up through its ancestors -- table emails set typography on the `<td>` and let cells inherit, so a block's base style usually lives above the content itself. */\r\nfunction inheritedStyle(el, prop) {\r\n let n = el;\r\n while (n && n.nodeType === 1) {\r\n const v = n.style && n.style[prop];\r\n if (v) return v;\r\n n = n.parentElement;\r\n }\r\n return '';\r\n}\r\n\r\n/** Innermost fixed-pixel width among the element's table/td ancestors -- the closest thing source HTML offers to \"how wide is this column\", for converting a px-sized image into MailCraft's %-of-column width. A percent-width `<td>` on the way up (a 50% column between the image and the 680px content table) scales the eventual pixel answer, so an icon in a half-width column resolves against ~340px, not 680. A percent width on a `<table>` (the ubiquitous width=\"100%\" block wrapper) says nothing and is skipped. */\r\nfunction ancestorPxWidth(el) {\r\n let n = el.parentElement;\r\n let factor = 1;\r\n while (n) {\r\n if (n.tagName === 'TABLE' || n.tagName === 'TD') {\r\n const w = n.getAttribute('width') || (n.style && n.style.width) || '';\r\n if (w && String(w).endsWith('%')) {\r\n const pct = PX(w);\r\n if (n.tagName === 'TD' && pct > 0 && pct < 100) factor *= pct / 100;\r\n } else if (w) {\r\n const px = PX(w);\r\n if (px >= 100) return Math.round(px * factor);\r\n }\r\n }\r\n n = n.parentElement;\r\n }\r\n return 0;\r\n}\r\n\r\n/** Legacy `cellpadding` on a block-wrapper table -- the padding source when the inner td carries no style padding at all. */\r\nfunction cellPadOf(tb) {\r\n const cp = tb && tb.getAttribute ? PX(tb.getAttribute('cellpadding')) : 0;\r\n return cp ? { t: cp, b: cp, l: cp, r: cp, py: cp, px: cp } : null;\r\n}\r\n\r\n/**\r\n * Content invisible in a desktop mail render must not import as text:\r\n * `display:none` (hidden preheaders, hamburger machinery, mobile-only\r\n * mirrors), `visibility:hidden`, `opacity:0`, and the other preheader idiom\r\n * -- collapsed to nothing via `max-height:0` with `overflow:hidden` or a\r\n * zero font. A zero font-size ALONE is not hidden: emails set it on\r\n * whitespace-collapsing wrappers around buttons and menus.\r\n */\r\nfunction isHidden(el) {\r\n const st = el.style;\r\n if (!st) return false;\r\n if (st.display === 'none' || st.visibility === 'hidden') return true;\r\n if (st.opacity === '0') return true;\r\n const collapsed = st.maxHeight === '0' || st.maxHeight === '0px';\r\n const invisible = st.overflow === 'hidden' || st.fontSize === '0' || st.fontSize === '0px';\r\n return collapsed && invisible;\r\n}\r\n\r\n/** The url() of a background image declared on the element (style shorthand or longhand, or the legacy `background` attribute). A gradient-only background yields nothing. */\r\nfunction bgImageOf(el) {\r\n if (!el) return '';\r\n const st = el.style;\r\n if (st) {\r\n const m = ((st.backgroundImage || '') + ' ' + (st.background || '')).match(/url\\([\"']?([^\"')]+)[\"']?\\)/);\r\n if (m) return m[1];\r\n }\r\n return (el.getAttribute && el.getAttribute('background')) || '';\r\n}\r\n\r\n/** Carries a wrapper's background image (hero photo sections) onto the rows it produced, mirroring applyBg -- fit/position/repeat come along when declared. */\r\nfunction applyBgImage(rows, el) {\r\n const url = bgImageOf(el);\r\n if (!url) return rows;\r\n const st = el.style || {};\r\n rows.forEach((r) => {\r\n if (r.props.bgImage) return;\r\n r.props.bgImage = url;\r\n if (st.backgroundSize) r.props.bgSize = st.backgroundSize;\r\n if (st.backgroundPosition) r.props.bgPos = st.backgroundPosition;\r\n if (st.backgroundRepeat) r.props.bgRepeat = st.backgroundRepeat;\r\n });\r\n return rows;\r\n}\r\n\r\n/** Padding read from the longhands, which are populated by the `padding` shorthand too -- but not vice versa: builders that write `padding-top/-left/...` individually (Beefree et al.) read back an empty `style.padding`, which is how every one of their cells imported with zero padding. Carries the exact per-side values plus the averaged py/px pair for consumers that only have a pair to store. */\r\nfunction paddingOf(st) {\r\n if (!st) return null;\r\n const t = PX(st.paddingTop); const b = PX(st.paddingBottom);\r\n const l = PX(st.paddingLeft); const r = PX(st.paddingRight);\r\n if (!t && !b && !l && !r) return null;\r\n return { t, b, l, r, py: Math.round((t + b) / 2), px: Math.round((l + r) / 2) };\r\n}\r\n\r\n/** Rows can hold padding exactly: the linked py/px pair when the source is symmetric, plus per-side overrides (and the split flag, so the inspector opens showing four sliders) when it isn't. */\r\nfunction setRowPad(row, pad) {\r\n row.props.py = pad.py; row.props.px = pad.px;\r\n if (pad.t !== pad.b || pad.l !== pad.r) {\r\n row.props.pt = pad.t; row.props.pb = pad.b; row.props.pl = pad.l; row.props.pr = pad.r;\r\n row.props.padSplit = true;\r\n }\r\n}\r\n\r\n/** MailCraft's `text` block treats `lh` as a bare multiplier of the block's own font size (e.g. `1.6`), same as CSS's unitless `line-height`. Source HTML overwhelmingly writes `line-height` in `px` (or `%`) instead, which is a different scale entirely -- reading `parseFloat('24px')` as `24` would hand the block a line height of 24x its font size. Converts to the multiplier MailCraft expects, and refuses anything that still doesn't look like one (a typo, a unitless value some tool emitted by mistake) rather than risk a blown-up line box. */\r\nfunction lineHeightRatio(raw, fontPx) {\r\n if (!raw) return null;\r\n const size = fontPx || 16;\r\n let ratio;\r\n if (raw.endsWith('%')) ratio = PX(raw) / 100;\r\n else if (raw.endsWith('em')) ratio = PX(raw); // already a multiplier of the font size, by definition\r\n else if (raw.endsWith('pt')) ratio = (PX(raw) * 4 / 3) / size;\r\n else if (raw.endsWith('px')) ratio = PX(raw) / size;\r\n else ratio = parseFloat(raw);\r\n return Number.isFinite(ratio) && ratio > 0 && ratio <= 4 ? ratio : null;\r\n}\r\n\r\nfunction escapeText(s) {\r\n const d = document.createElement('div');\r\n d.textContent = s;\r\n return d.innerHTML;\r\n}\r\n\r\n// ---- per-shape classifiers (each returns a block, or null if it doesn't match) ----\r\n\r\nfunction classifyImage(el) {\r\n let img = null; let href = '';\r\n if (el.tagName === 'IMG') img = el;\r\n else if (el.tagName === 'A') {\r\n img = onlyChild(el, 'IMG');\r\n if (img) href = el.getAttribute('href') || '';\r\n } else if (el.tagName === 'DIV' || el.tagName === 'TD') {\r\n img = onlyChild(el, 'IMG');\r\n if (!img) {\r\n const a = onlyChild(el, 'A');\r\n if (a) { img = onlyChild(a, 'IMG'); if (img) href = a.getAttribute('href') || ''; }\r\n }\r\n }\r\n if (!img) return null;\r\n // A pixel size wins over a percent one wherever either appears: builders\r\n // routinely write `width:100%` on the img and put the real constraint on a\r\n // `width` attribute or a wrapper's `max-width` (`<div style=\"max-width:88px\">\r\n // <img style=\"width:100%\" width=\"88\">`), and trusting the percent first is\r\n // exactly what blew an 88px logo up to the full content width.\r\n const isPct = (v) => String(v || '').endsWith('%');\r\n const pxCandidates = [\r\n img.style.width, img.getAttribute('width'), img.style.maxWidth,\r\n el !== img && el.style ? el.style.width : '', el !== img && el.style ? el.style.maxWidth : '',\r\n ];\r\n const pxHint = pxCandidates.find((v) => v && !isPct(v) && PX(v));\r\n let width = 100;\r\n if (pxHint) {\r\n // Convert to % of the nearest fixed-width ancestor.\r\n const colPx = ancestorPxWidth(img) || 600;\r\n width = Math.max(2, Math.min(100, Math.round((PX(pxHint) / colPx) * 100)));\r\n } else if (isPct(img.style.width) && PX(img.style.width)) {\r\n width = PX(img.style.width);\r\n }\r\n return blk('image', {\r\n src: img.getAttribute('src') || '',\r\n alt: img.getAttribute('alt') || '',\r\n href,\r\n width,\r\n align: textAlignOf(el),\r\n // Always explicit: the block *default* is 10px, which quietly rounded\r\n // the corners of every imported image that had none.\r\n radius: PX(img.style.borderRadius) || 0,\r\n });\r\n}\r\n\r\nfunction classifyButton(el) {\r\n let a = null; let outerAlign = '';\r\n if (el.tagName === 'A') a = el;\r\n else if (el.tagName === 'DIV' || el.tagName === 'TD') {\r\n a = onlyChild(el, 'A');\r\n if (a) outerAlign = el.style.textAlign || el.getAttribute('align') || '';\r\n }\r\n if (!a) return null;\r\n if (a.querySelector('img,table,div')) return null;\r\n // The visual pill isn't always the anchor itself: bulletproof-button\r\n // generators (Beefree et al.) leave the `<a>` bare and hang the background,\r\n // radius and padding on nested `<span>`s inside it. Whichever element\r\n // carries the background is the pill; padding may sit a level deeper still.\r\n const hasBg = (e) => !!(e.style && (e.style.backgroundColor || e.style.background));\r\n const pill = hasBg(a) ? a : Array.from(a.querySelectorAll('span')).find(hasBg);\r\n if (!pill) return null;\r\n const st = pill.style;\r\n let pad = paddingOf(a.style) || paddingOf(st);\r\n if (!pad) {\r\n const padded = Array.from(pill.querySelectorAll('span')).find((s) => paddingOf(s.style));\r\n if (padded) pad = paddingOf(padded.style);\r\n }\r\n const display = st.display || a.style.display || '';\r\n if (!pad && display.indexOf('inline-block') < 0 && display !== 'block') return null;\r\n const over = {\r\n label: (a.textContent || '').trim() || 'Button',\r\n href: a.getAttribute('href') || '#',\r\n bg: st.backgroundColor || st.background,\r\n color: st.color || a.style.color || '#ffffff',\r\n radius: radiusOf(st),\r\n py: (pad && pad.py) || 13,\r\n px: (pad && pad.px) || 26,\r\n // The anchor's own `text-align` centers the *label inside the pill*\r\n // (boilerplate on almost every bulletproof button) and says nothing\r\n // about where the pill sits in the row -- that's the container's call,\r\n // so alignment is read starting at the parent, never at the anchor.\r\n align: outerAlign || textAlignOf(a.parentElement || a),\r\n full: a.style.display === 'block',\r\n };\r\n const size = fontPx(st.fontSize) || fontPx(a.style.fontSize);\r\n if (size) over.size = size;\r\n // Outline buttons: transparent fill, the pill drawn by its border.\r\n const bw = borderSidesOf(st).width;\r\n if (bw) { over.borderW = bw; over.borderStyle = borderStyleOf(st); over.borderColor = borderColorOf(st) || over.color; }\r\n return blk('button', over);\r\n}\r\n\r\nconst SOCIAL_HOSTS = /facebook|twitter|x\\.com|instagram|linkedin|youtube|tiktok|pinterest|threads|whatsapp|telegram|github|discord|snapchat|medium|dribbble|behance|mastodon|bluesky|bsky/i;\r\n\r\n/** A run of small image-links, mostly pointing at social networks (every footer's icon strip), becomes a native social block -- MailCraft draws its own icon art from the network name (alt text, or the link's hostname). Imported as loose images they'd neither line up nor be editable as a set. */\r\nfunction classifySocial(el) {\r\n if (!/^(DIV|TD|TABLE)$/.test(el.tagName)) return null;\r\n if ((el.textContent || '').trim()) return null;\r\n const anchors = Array.from(el.querySelectorAll('a'));\r\n if (anchors.length < 2) return null;\r\n // `svg` alongside `img`: MailCraft's own social block renders inline-SVG\r\n // icons, so accepting both is what lets an exported strip round-trip back\r\n // into a social block instead of dissolving.\r\n const imgs = anchors.map((a) => a.querySelector('img,svg'));\r\n if (imgs.some((im) => !im)) return null;\r\n const sizes = imgs.map((im) => PX(im.getAttribute('width') || (im.style && im.style.width)) || 32);\r\n if (sizes.some((s) => s > 64)) return null;\r\n const names = anchors.map((a, i) => {\r\n const named = (imgs[i].getAttribute('alt') || a.getAttribute('title') || a.getAttribute('aria-label') || '').trim();\r\n if (named) return named;\r\n const host = ((a.getAttribute('href') || '').match(/\\/\\/(?:www\\.)?([^/?#]+)/) || [])[1] || '';\r\n return host.split('.')[0] || 'link';\r\n });\r\n const social = anchors.filter((a, i) => SOCIAL_HOSTS.test((a.getAttribute('href') || '') + ' ' + names[i]));\r\n if (social.length < Math.ceil(anchors.length / 2)) return null;\r\n const a0 = anchors[0];\r\n const over = {\r\n items: anchors.map((a, i) => names[i] + '|' + (a.getAttribute('href') || '#')).join('\\n'),\r\n // From the first anchor's ancestry, not `el`: the alignment usually sits\r\n // on an inner td between the icons and the table this classifier sees.\r\n align: textAlignOf(a0),\r\n size: Math.round(sizes.reduce((x, y) => x + y, 0) / sizes.length),\r\n };\r\n // Presentation from the strip's own styling where it exists (MailCraft's\r\n // exported strips carry shape/color on the anchors). A foreign image-icon\r\n // strip has none of it -- render those as bare, brand-colored glyphs, the\r\n // closest match to how such strips actually look. The block *default*\r\n // (outlined boxes at 1.9x the icon size) both looked wrong and wrapped in\r\n // narrow footer columns.\r\n const aBg = a0.style && (a0.style.backgroundColor || a0.style.background);\r\n const aBorder = a0.style ? PX(a0.style.borderWidth) || PX(a0.style.borderTopWidth) : 0;\r\n over.shape = aBg ? (String(a0.style.borderRadius || '').indexOf('50%') > -1 ? 'circle' : 'square') : (aBorder ? 'outline' : 'bare');\r\n const aColor = a0.style && a0.style.color;\r\n if (aColor) over.color = aColor; else over.palette = 'brand';\r\n // Icon spacing: inter-cell padding on image strips, anchor margins on\r\n // exported ones.\r\n const cell = a0.closest ? a0.closest('td') : null;\r\n const cellGap = cell && cell !== el && el.contains(cell) ? PX(cell.style.paddingRight) + PX(cell.style.paddingLeft) : 0;\r\n const marginGap = a0.style ? PX(a0.style.marginRight) + PX(a0.style.marginLeft) : 0;\r\n const gap = cellGap || marginGap;\r\n if (gap) over.gap = gap;\r\n return blk('social', over);\r\n}\r\n\r\n/** A run of two or more sibling links with nothing else in the container (Beefree/MJML nav bars) is a menu block, not a text run -- as text, each link imports mid-paragraph with the wrapper's junk around it. */\r\nfunction classifyMenu(el) {\r\n if (el.tagName !== 'DIV' && el.tagName !== 'TD') return null;\r\n if (el.querySelector('img,table,div,p,input,h1,h2,h3,h4,h5,h6')) return null;\r\n const anchors = Array.from(el.children).filter((c) => c.tagName === 'A');\r\n if (anchors.length < 2) return null;\r\n const linkText = anchors.map((a) => (a.textContent || '')).join('').replace(/\\s+/g, '');\r\n if (linkText !== (el.textContent || '').replace(/\\s+/g, '')) return null;\r\n const over = {\r\n items: anchors.map((a) => ((a.textContent || '').trim() + '|' + (a.getAttribute('href') || '#'))).join('\\n'),\r\n align: textAlignOf(el),\r\n };\r\n const size = fontPx(inheritedStyle(anchors[0], 'fontSize'));\r\n if (size) over.size = size;\r\n const color = inheritedStyle(anchors[0], 'color');\r\n if (color) over.color = color;\r\n return blk('menu', over);\r\n}\r\n\r\nfunction classifyDivider(el) {\r\n if (el.tagName === 'HR') {\r\n const sw = el.style.width || '';\r\n return blk('divider', {\r\n thickness: PX(el.style.height) || PX(el.style.borderTopWidth) || 1,\r\n lineStyle: borderStyleOf(el.style),\r\n color: el.style.backgroundColor || el.style.borderTopColor || el.style.borderColor || '#d9dade',\r\n width: sw.endsWith('%') ? PX(sw) : 100,\r\n });\r\n }\r\n if (el.tagName !== 'DIV' && el.tagName !== 'TD') return null;\r\n const bar = el.children.length === 1 ? el.firstElementChild : (!el.children.length ? el : null);\r\n if (!bar || bar.tagName !== 'DIV' || bar.children.length || String(bar.textContent || '').trim()) return null;\r\n const h = PX(bar.style.height) || PX(bar.style.borderTopWidth);\r\n const bg = bar.style.backgroundColor || bar.style.background || bar.style.borderTopColor;\r\n if (!(h > 0 && h <= 10 && bg)) return null;\r\n const sw = bar.style.width || '';\r\n return blk('divider', { thickness: h, lineStyle: borderStyleOf(bar.style), color: bg, width: sw.endsWith('%') ? PX(sw) : 100 });\r\n}\r\n\r\nfunction classifySpacer(el) {\r\n if (el.tagName !== 'DIV' || el.children.length || String(el.textContent || '').trim()) return null;\r\n const h = PX(el.style.height);\r\n if (!h) return null;\r\n if (el.style.backgroundColor || el.style.background) return null;\r\n return blk('spacer', { height: h });\r\n}\r\n\r\nfunction classifyHeading(el) {\r\n if (!/^H[1-6]$/.test(el.tagName)) return null;\r\n const st = el.style;\r\n const over = { text: (el.textContent || '').trim(), level: el.tagName.toLowerCase() };\r\n const size = fontPx(st.fontSize); if (size) over.size = size;\r\n if (st.textAlign) over.align = st.textAlign;\r\n if (st.color) over.color = st.color;\r\n if (st.fontWeight) over.weight = st.fontWeight;\r\n return blk('heading', over);\r\n}\r\n\r\nfunction classifyList(el) {\r\n if (el.tagName !== 'UL' && el.tagName !== 'OL') return null;\r\n const items = Array.from(el.children).filter((c) => c.tagName === 'LI').map((li) => li.innerHTML.trim());\r\n if (!items.length) return null;\r\n return blk('list', { items: items.join('\\n'), ordered: el.tagName === 'OL' });\r\n}\r\n\r\nfunction classifyTable(el) {\r\n if (el.tagName !== 'TABLE') return null;\r\n const rows = Array.from(el.querySelectorAll(':scope > tbody > tr, :scope > tr'));\r\n if (!rows.length) return null;\r\n if (el.querySelector('img, table')) return null;\r\n const counts = rows.map((r) => r.children.length);\r\n if (Math.min(...counts) < 2) return null;\r\n const header = !!el.querySelector('th');\r\n const data = rows.map((r) => Array.from(r.children).map((c) => (c.textContent || '').trim().replace(/\\|/g, '/')).join('|')).join('\\n');\r\n const firstCell = rows[0] && rows[0].children[0];\r\n const cellStyle = firstCell && firstCell.style;\r\n const borderWidth = cellStyle ? borderSidesOf(cellStyle).width : 0;\r\n const borders = !!borderWidth;\r\n return blk('table', {\r\n data, header, borders, borderWidth: borderWidth || 1,\r\n borderStyle: cellStyle ? borderStyleOf(cellStyle) : 'solid',\r\n lineColor: cellStyle ? (borderColorOf(cellStyle) || '#e2e8f0') : '#e2e8f0',\r\n });\r\n}\r\n\r\nconst CLASSIFIERS = [classifyImage, classifyButton, classifySocial, classifyMenu, classifyDivider, classifySpacer, classifyHeading, classifyList, classifyTable];\r\n\r\nfunction classifyNode(el) {\r\n for (const fn of CLASSIFIERS) {\r\n const b = fn(el);\r\n if (b) return b;\r\n }\r\n return null;\r\n}\r\n\r\nfunction isStructural(el) {\r\n return /^(TABLE|FORM|IFRAME|SCRIPT|STYLE|VIDEO|OBJECT|EMBED)$/.test(el.tagName) || !!el.querySelector('table,form,iframe,script,video,object,embed');\r\n}\r\n\r\n/** `core/export.js` wraps every block in a column with `<div style=\"{boxCss(b.props)}\">`, which for every block type shipped today (none define the `bBg/bBorder/bLine/bRadius/bPad` props `boxCss` reads) always resolves to a bare `<div style=\"margin:0\">` -- a see-through spacing wrapper, not real content. Unwraps that one level so the classifiers see the block's own signature div directly; leaves any div that carries other styling (an intentionally-styled container someone pasted in) alone, since that's real content, not framework wrapper. */\r\nfunction unwrapBoxDiv(el) {\r\n if (el.tagName !== 'DIV' || el.children.length !== 1) return el;\r\n const extra = Array.from(el.style).filter((prop) => prop.indexOf('margin') !== 0);\r\n if (extra.length) return el;\r\n const child = el.firstElementChild;\r\n if ((el.textContent || '') !== (child.textContent || '')) return el;\r\n return unwrapBoxDiv(child);\r\n}\r\n\r\n/** Walks a column's (or the body's) child nodes and turns them into blocks -- recognized shapes become native blocks, runs of unrecognized inline content are buffered and flushed as a single sanitized `text` block, and structural content that can't be classified falls back to a raw `html` block. Never throws, never drops content. */\r\n/** Tags whose inline styles describe a local run of characters, not the block around them -- a bold lead-in `<span>`'s weight must not become the whole block's weight. */\r\nconst INLINE_TAGS = /^(SPAN|A|B|STRONG|I|EM|U|S|STRIKE|CODE|SUP|SUB|FONT)$/;\r\n\r\nfunction blocksFromNodes(nodes) {\r\n const out = [];\r\n let buf = [];\r\n let bufFirstEl = null;\r\n const flush = () => {\r\n const html = cleanImportHtml(buf.join(''));\r\n if (html) {\r\n const over = { html };\r\n if (bufFirstEl) {\r\n // The block's *base* style: the first buffered element when it's a\r\n // block-level thing (a styled <p>/<div> speaks for the run), else its\r\n // ancestors -- table emails hang typography on the containing <td>\r\n // (`font-size:12px` on a footer cell), which the old\r\n // first-element-only read never saw. Per-element differences inside\r\n // the run survive as the inline styles `cleanImportHtml` now keeps.\r\n let baseEl = INLINE_TAGS.test(bufFirstEl.tagName) ? (bufFirstEl.parentElement || bufFirstEl) : bufFirstEl;\r\n // Then descend through transparent single-child wrappers: builders\r\n // nest a `font-family:sans-serif` shim div around the div that\r\n // carries the real typography, and `inheritedStyle` below walks *up*\r\n // from wherever this lands -- so start at the deepest element that\r\n // still spans the whole run.\r\n while (\r\n baseEl.children.length === 1\r\n && !INLINE_TAGS.test(baseEl.firstElementChild.tagName)\r\n && (baseEl.textContent || '') === (baseEl.firstElementChild.textContent || '')\r\n ) baseEl = baseEl.firstElementChild;\r\n const size = fontPx(inheritedStyle(baseEl, 'fontSize')); if (size) over.size = size;\r\n const color = inheritedStyle(baseEl, 'color'); if (color) over.color = color;\r\n over.align = textAlignOf(baseEl);\r\n const weight = inheritedStyle(baseEl, 'fontWeight'); if (weight) over.weight = weight;\r\n const lh = lineHeightRatio(inheritedStyle(baseEl, 'lineHeight'), size);\r\n if (lh) over.lh = lh;\r\n }\r\n out.push(blk('text', over));\r\n }\r\n buf = []; bufFirstEl = null;\r\n };\r\n nodes.forEach((n) => {\r\n if (n.nodeType === 3) {\r\n if (n.textContent && n.textContent.trim()) buf.push(escapeText(n.textContent));\r\n return;\r\n }\r\n if (n.nodeType !== 1) return;\r\n if (isHidden(n)) return;\r\n const target = unwrapBoxDiv(n);\r\n const b = classifyNode(target);\r\n if (b) { flush(); out.push(b); return; }\r\n // A one-cell scaffolding table inside a column (Beefree's per-block\r\n // `table.text_block` / `image_block` wrappers) is transparent here just\r\n // as it is at row level -- without this it fell through to `isStructural`\r\n // and the whole cell imported as one opaque raw-html block. The wrapping\r\n // `td.pad`'s padding is the block's spacing, so it lands on the produced\r\n // blocks' own py/px -- except buttons, where py/px mean the pill's inner\r\n // padding, not outer spacing.\r\n if (target.tagName === 'TABLE' && isPassthroughTable(target)) {\r\n flush();\r\n const tr = target.querySelector(':scope > tbody > tr, :scope > tr');\r\n const td = Array.from(tr.children).find((c) => c.tagName === 'TD' || c.tagName === 'TH');\r\n const pad = paddingOf(td.style) || cellPadOf(target);\r\n const inner = blocksFromNodes(Array.from(td.childNodes));\r\n if (pad) inner.forEach((ib) => {\r\n if (ib.type === 'button') return;\r\n if ('py' in ib.props) ib.props.py = pad.py;\r\n if ('px' in ib.props) ib.props.px = pad.px;\r\n });\r\n out.push(...inner);\r\n return;\r\n }\r\n if (isStructural(target)) { flush(); out.push(blk('html', { code: n.outerHTML })); return; }\r\n if (!bufFirstEl) bufFirstEl = target;\r\n buf.push(n.outerHTML);\r\n });\r\n flush();\r\n return out;\r\n}\r\n\r\nfunction normalizeSpans(spans) {\r\n const total = spans.reduce((a, v) => a + v, 0) || 1;\r\n const scaled = spans.map((v) => Math.round((v / total) * 100));\r\n scaled[scaled.length - 1] += 100 - scaled.reduce((a, v) => a + v, 0);\r\n return scaled;\r\n}\r\n\r\nfunction spansFromCells(cells, tableWidthPx) {\r\n const parsed = cells.map((td) => {\r\n const sw = td.style.width || '';\r\n if (sw.endsWith('%')) return { pct: PX(sw) };\r\n const aw = td.getAttribute('width') || '';\r\n if (aw.endsWith('%')) return { pct: PX(aw) };\r\n const px = PX(sw) || PX(aw);\r\n return px ? { px } : null;\r\n });\r\n if (parsed.every((p) => p && p.pct != null)) {\r\n const total = parsed.reduce((a, p) => a + p.pct, 0);\r\n if (total >= 90 && total <= 110) return normalizeSpans(parsed.map((p) => p.pct));\r\n }\r\n if (tableWidthPx && parsed.every((p) => p && p.px)) return normalizeSpans(parsed.map((p) => Math.round((p.px / tableWidthPx) * 100)));\r\n const even = Math.floor(100 / cells.length);\r\n const spans = cells.map(() => even);\r\n spans[spans.length - 1] += 100 - even * cells.length;\r\n return spans;\r\n}\r\n\r\n/** Detects MailCraft's own two-table row shape -- an outer `<td>` (row padding/bg/border) wrapping a single-row `role=\"presentation\"` table that holds the actual column(s), per `core/export.js` -- and widens to its cells (one or many) so rows round-trip back into real columns instead of one opaque `html` block. */\r\nfunction unwrapNestedLayout(td) {\r\n const only = onlyChild(td, 'TABLE');\r\n if (!only) return null;\r\n const trs = only.querySelectorAll(':scope > tbody > tr, :scope > tr');\r\n if (trs.length !== 1) return null;\r\n if (only.querySelector('th')) return null;\r\n const cells = Array.from(trs[0].children).filter((c) => c.tagName === 'TD' || c.tagName === 'TH');\r\n return cells.length ? cells : null;\r\n}\r\n\r\n/** A table with exactly one `<tr>` and one cell is pure scaffolding (a per-section wrapper, an Outlook-only shim, a bulletproof-button frame) -- it carries no row/column intent of its own, so it should be seen through rather than turned into a one-cell row. Real email builders (MJML, most ESPs) nest several layers of these around every actual section. */\r\nfunction isPassthroughTable(tb) {\r\n const trs = tb.querySelectorAll(':scope > tbody > tr, :scope > tr');\r\n if (trs.length !== 1) return false;\r\n const cells = Array.from(trs[0].children).filter((c) => c.tagName === 'TD' || c.tagName === 'TH');\r\n return cells.length === 1;\r\n}\r\n\r\nfunction bgOf(el) {\r\n const st = el.style;\r\n if (st && st.backgroundColor) return st.backgroundColor;\r\n // The `background` shorthand is only a usable *color* when it holds no\r\n // image/gradient -- browsers populate `backgroundColor` from a shorthand\r\n // that includes a color, so reaching here with a url() means there is no\r\n // color to take (and taking the raw string set broken values).\r\n const short = (st && st.background) || '';\r\n if (short && short.indexOf('url(') < 0 && short.indexOf('gradient(') < 0) return short;\r\n return (el.getAttribute && el.getAttribute('bgcolor')) || '';\r\n}\r\n\r\nfunction padOf(el) {\r\n return el.style ? paddingOf(el.style) : null;\r\n}\r\n\r\n/** A div/center that itself nests a div/table/center is acting as a structural container (a section wrapper, an outer page wrapper holding several sections) rather than as one piece of content -- its children need to be walked in their own right, not folded into one block. A div holding only inline content (text, spans, an image not otherwise recognized) is real content and is left to `blocksFromNodes`. */\r\nfunction looksLikeContainer(el) {\r\n return Array.from(el.children).some((c) => c.tagName === 'TABLE' || c.tagName === 'DIV' || c.tagName === 'CENTER');\r\n}\r\n\r\nfunction applyBg(rows, bg) {\r\n if (bg) rows.forEach((r) => { if (!r.props.bg) r.props.bg = bg; });\r\n return rows;\r\n}\r\n\r\n/** Rows built from a genuine content table (`rowsFromContentTable`) already carry real, per-line padding read off their own `<td>`; rows built from a plain buffered run of content (`collectRows`'s `flushBuf`) start at a neutral zero, since there's no source padding to point to at that level. Once one of those zeroed rows bubbles up through a passthrough table or container div that DOES carry padding (the common shape for a single-line MJML/ESP section), that's the closest real signal available, and gets applied -- but only to rows still at zero, so it never overwrites a more specific value a deeper table already set. */\r\nfunction applyPad(rows, pad) {\r\n if (pad) rows.forEach((r) => { if (!r.props.py && !r.props.px && r.props.pt === undefined) setRowPad(r, pad); });\r\n return rows;\r\n}\r\n\r\n/** Longhand side colors are always a single value; the `borderColor` shorthand reads back as a per-side list when the sides differ (`rgb(...) rgb(...) currentcolor`), which is not a usable color. */\r\nfunction borderColorOf(st) {\r\n const ok = (v) => (v && v !== 'currentcolor' ? v : '');\r\n return ok(st.borderTopColor) || ok(st.borderLeftColor) || ok(st.borderRightColor) || ok(st.borderBottomColor) || '';\r\n}\r\n\r\n/** One usable CSS border style for models that expose a single style across\r\n * all enabled edges. Old/imported documents fall back to solid. */\r\nfunction borderStyleOf(st) {\r\n const allowed = new Set(['solid', 'dashed', 'dotted', 'double']);\r\n const values = [st.borderTopStyle, st.borderRightStyle, st.borderBottomStyle, st.borderLeftStyle, st.borderStyle];\r\n return values.find((v) => allowed.has(v)) || 'solid';\r\n}\r\n\r\n/** MailCraft rows have one radius for all corners; a per-corner source value (`16px 16px 0 0` on a stacked card) resolves to the largest corner rather than whatever corner happened to be listed first. */\r\nfunction radiusOf(st) {\r\n const parts = String(st.borderRadius || '').split(/\\s+/).map(PX);\r\n return parts.length ? Math.max(0, ...parts) : 0;\r\n}\r\n\r\n/** Per-side border widths (the longhands are populated by the `border` shorthand too) plus the overall width -- the largest side, since MailCraft rows have one width shared by every enabled side. */\r\nfunction borderSidesOf(st) {\r\n const sides = {\r\n top: PX(st.borderTopWidth), right: PX(st.borderRightWidth),\r\n bottom: PX(st.borderBottomWidth), left: PX(st.borderLeftWidth),\r\n };\r\n const width = Math.max(sides.top, sides.right, sides.bottom, sides.left) || PX(st.borderWidth);\r\n return { width, sides };\r\n}\r\n\r\nfunction setRowBorder(row, width, sides, color, style) {\r\n row.props.border = width;\r\n row.props.borderStyle = style || 'solid';\r\n row.props.lineColor = color || '#e2e2e5';\r\n row.props.bTop = sides.top > 0;\r\n row.props.bRight = sides.right > 0;\r\n row.props.bBottom = sides.bottom > 0;\r\n row.props.bLeft = sides.left > 0;\r\n}\r\n\r\n/**\r\n * Border/radius on a passthrough wrapper describe one visual card. With\r\n * per-side borders the card decomposes faithfully even across several rows:\r\n * every row keeps the card's left/right edges, the first row alone keeps the\r\n * top edge, the last alone keeps the bottom -- stacked, they redraw the\r\n * source's single box with no horizontal lines through the middle. Radius\r\n * still transfers only to a lone row (MailCraft rounds all four corners, so\r\n * splitting it across rows would notch the card's sides).\r\n */\r\nfunction applyFrame(rows, el) {\r\n if (!rows.length || !el || !el.style) return rows;\r\n const st = el.style;\r\n const { width, sides } = borderSidesOf(st);\r\n if (width) {\r\n const color = borderColorOf(st);\r\n rows.forEach((row, i) => {\r\n if (row.props.border) return;\r\n setRowBorder(row, width, {\r\n top: i === 0 ? sides.top : 0,\r\n bottom: i === rows.length - 1 ? sides.bottom : 0,\r\n left: sides.left,\r\n right: sides.right,\r\n }, color, borderStyleOf(st));\r\n });\r\n }\r\n if (rows.length === 1) {\r\n const radius = radiusOf(st);\r\n if (radius && !rows[0].props.radius) rows[0].props.radius = radius;\r\n // Shadow follows the radius rule -- one visual card, one shadow; split\r\n // across rows it would draw shadows through the card's middle.\r\n if (st.boxShadow && st.boxShadow !== 'none' && !rows[0].props.shadow) rows[0].props.shadow = st.boxShadow;\r\n }\r\n return rows;\r\n}\r\n\r\nfunction rowsFromContentTable(table) {\r\n const tableWidthPx = PX(table.getAttribute('width') || table.style.width || '0') || null;\r\n const trs = Array.from(table.querySelectorAll(':scope > tbody > tr, :scope > tr'));\r\n return trs.map((tr) => {\r\n const outerCells = Array.from(tr.children).filter((c) => c.tagName === 'TD' || c.tagName === 'TH');\r\n if (!outerCells.length) return null;\r\n const bgSource = outerCells[0];\r\n let cells = outerCells;\r\n if (outerCells.length === 1) {\r\n const nested = unwrapNestedLayout(outerCells[0]);\r\n if (nested) cells = nested;\r\n }\r\n // Spacer columns: a content-free `<td>` (often `class=\"column gap\"`,\r\n // holding only an empty fixed-width table) between real columns exists\r\n // purely to space them apart. Counted as a column it wrecks the spans\r\n // (50/50 + gap became thirds); recognized, it becomes the row's `gap`.\r\n let gapPx = 0;\r\n if (cells.length > 2) {\r\n const isGapCell = (td) => {\r\n if ((td.textContent || '').trim()) return false;\r\n if (td.querySelector('img,a,input,p,h1,h2,h3,h4,h5,h6,ul,ol')) return false;\r\n const w = PX(td.getAttribute('width') || (td.style && td.style.width) || '');\r\n return !w || w <= 30;\r\n };\r\n const kept = cells.filter((c) => !isGapCell(c));\r\n if (kept.length >= 2 && kept.length < cells.length) {\r\n cells.filter(isGapCell).forEach((g) => {\r\n const inner = g.querySelector('table');\r\n const w = PX((inner && (inner.getAttribute('width') || inner.style.width)) || g.getAttribute('width') || '');\r\n gapPx = Math.max(gapPx, w || 10);\r\n });\r\n cells = kept;\r\n }\r\n }\r\n // Gutter-as-padding: cells that all carry the identical pure-horizontal\r\n // padding (`0 Xpx` -- exactly what MailCraft's own export writes for a\r\n // column gap) describe a gap, not row padding. Recognizing it keeps\r\n // gap -> export -> import a fixed point instead of drifting into padding.\r\n let gutter = false;\r\n if (!gapPx && cells.length > 1) {\r\n const pads = cells.map((c) => paddingOf(c.style));\r\n const p0 = pads[0];\r\n gutter = !!(p0 && !p0.t && !p0.b && p0.l > 0 && p0.l === p0.r && p0.l <= 60\r\n && pads.every((pp) => pp && !pp.t && !pp.b && pp.l === p0.l && pp.r === p0.r));\r\n if (gutter) gapPx = p0.l * 2;\r\n }\r\n const spans = cells.length === 1 ? [100] : spansFromCells(cells, tableWidthPx);\r\n const row = mkRow(spans);\r\n row.props.py = 0; row.props.px = 0; row.props.gap = gapPx;\r\n // Background and frame can live on the first cell OR on the table itself\r\n // (builders style `table.row-content`, not its tds) -- read the cell\r\n // first, the table as fallback. Cell-derived values only count when every\r\n // cell agrees: a row of differently-colored card columns (pastel feature\r\n // grids) must not paint the whole row in the first card's color --\r\n // MailCraft has no per-column background, so those columns' colors are a\r\n // known loss rather than a wrong repaint.\r\n // Uniformity is judged among the cells THEMSELVES: after a nested-layout\r\n // unwrap, `bgSource` is the outer td (whose background legitimately wraps\r\n // the whole row) while `cells` are the inner columns -- comparing the two\r\n // wrongly read \"non-uniform\" and threw the row's own bg/padding away.\r\n const cellBg = bgOf(cells[0]);\r\n const cellsUniform = cells.every((c) => bgOf(c) === cellBg);\r\n // The bgSource fallback is for the nested-unwrap case only, where it's an\r\n // outer wrapper around all columns. When bgSource IS cells[0] (flat rows),\r\n // falling back to it would re-promote the first card's color to the row.\r\n const outerBg = cells.indexOf(bgSource) > -1 ? '' : bgOf(bgSource);\r\n const bg = (cellsUniform && cellBg) || outerBg || bgOf(table);\r\n if (bg) row.props.bg = bg;\r\n // Differently-styled cells become per-column styling: each column keeps\r\n // its own background/radius/padding (the pastel-cards pattern).\r\n if (!cellsUniform) {\r\n cells.forEach((cell, i) => {\r\n const col = row.cols[i]; if (!col) return;\r\n const cbg = bgOf(cell); if (cbg) col.bg = cbg;\r\n const crad = radiusOf(cell.style); if (crad) col.radius = crad;\r\n const cframe = borderSidesOf(cell.style);\r\n if (cframe.width) {\r\n col.border = cframe.width;\r\n col.borderStyle = borderStyleOf(cell.style);\r\n col.lineColor = borderColorOf(cell.style) || '#e2e2e5';\r\n }\r\n const cpd = paddingOf(cell.style);\r\n if (cpd) { col.padY = cpd.py; col.padX = cpd.px; }\r\n });\r\n }\r\n // Read the border per side (the card idiom `border: 1px solid X;\r\n // border-bottom: none` keeps its exact shape now that rows support\r\n // per-side toggles), from the cell first, the table as fallback.\r\n const cellFrame = borderSidesOf(bgSource.style);\r\n const frameSrc = cellFrame.width ? bgSource.style : table.style;\r\n const frame = cellFrame.width ? cellFrame : borderSidesOf(table.style);\r\n if (frame.width) setRowBorder(row, frame.width, frame.sides, borderColorOf(frameSrc), borderStyleOf(frameSrc));\r\n const radius = (cellsUniform ? radiusOf(bgSource.style) : 0) || radiusOf(table.style);\r\n if (radius) row.props.radius = radius;\r\n const shadow = (cellsUniform ? bgSource.style.boxShadow : '') || table.style.boxShadow || '';\r\n if (shadow && shadow !== 'none') row.props.shadow = shadow;\r\n const bgiEl = (cellsUniform && bgImageOf(bgSource)) ? bgSource : (bgImageOf(table) ? table : null);\r\n if (bgiEl) applyBgImage([row], bgiEl);\r\n // The table itself can carry section padding (Beefree writes\r\n // `padding-top: 60px` on `.row-content`) on top of the cell's own -- the\r\n // two nest in the source, so they sum here.\r\n const tPad = paddingOf(table.style);\r\n // When cells differ, the first cell's padding just moved onto its own\r\n // column above -- counting it at row level too would double it up. A\r\n // detected gutter already became the row gap, so it must not double as\r\n // padding either -- but only when the gutter actually lives on bgSource\r\n // (the flat case); after a nested unwrap, bgSource is the outer td whose\r\n // padding is genuine row padding.\r\n const gutterOnBgSource = gutter && cells.indexOf(bgSource) > -1;\r\n const cPad = cellsUniform && !gutterOnBgSource ? paddingOf(bgSource.style) : null;\r\n if (tPad || cPad) {\r\n const z = { t: 0, b: 0, l: 0, r: 0 };\r\n const sum = ['t', 'b', 'l', 'r'].reduce((acc, k) => { acc[k] = ((tPad || z)[k] || 0) + ((cPad || z)[k] || 0); return acc; }, {});\r\n sum.py = Math.round((sum.t + sum.b) / 2);\r\n sum.px = Math.round((sum.l + sum.r) / 2);\r\n setRowPad(row, sum);\r\n }\r\n cells.forEach((cell, i) => {\r\n // A cell whose lone child is a background/radius-carrying div is the\r\n // \"styled column\" shape (MailCraft's own export writes it; other\r\n // builders use it too) -- hoist its styling onto the column and walk\r\n // its children, or the whole card collapses into one opaque text blob.\r\n let contentEl = cell;\r\n const lone = onlyChild(cell, 'DIV');\r\n if (lone && (bgOf(lone) || radiusOf(lone.style)) && !classifyNode(lone)) {\r\n const col = row.cols[i];\r\n if (col) {\r\n const cbg = bgOf(lone); if (cbg && !col.bg) col.bg = cbg;\r\n const crad = radiusOf(lone.style); if (crad && !col.radius) col.radius = crad;\r\n const cpd = paddingOf(lone.style);\r\n if (cpd && col.padY === undefined) { col.padY = cpd.py; col.padX = cpd.px; }\r\n }\r\n contentEl = lone;\r\n }\r\n row.cols[i].blocks = blocksFromNodes(Array.from(contentEl.childNodes));\r\n });\r\n return row;\r\n }).filter((r) => r && r.cols.some((c) => c.blocks.length));\r\n}\r\n\r\n/**\r\n * Walks a list of sibling nodes and returns the ordered rows they represent.\r\n * Rather than picking one \"best\" table for the whole document (which breaks\r\n * the moment more than one section exists -- everything outside that table\r\n * silently vanished), this recurses through every layer of transparent\r\n * scaffolding -- a passthrough table, or a single-child `<div>`/`<center>`\r\n * wrapper that isn't itself a recognizable block -- to find each genuinely\r\n * content-bearing table, and expands each one into rows in document order.\r\n * \"Transparent scaffolding\" here means a passthrough table (see\r\n * `isPassthroughTable`) or a `<div>`/`<center>` that nests further\r\n * divs/tables and isn't itself a recognizable block (see\r\n * `looksLikeContainer`) -- not just a single-child wrapper, since real\r\n * builders often nest several section wrappers side by side under one\r\n * outer page wrapper. Runs of non-table content between/around them become\r\n * their own single-column rows via `blocksFromNodes`. A wrapper's own\r\n * background color and padding (common on a per-section `<div>`/table pair)\r\n * carry onto the rows it produces -- but only where a row doesn't already\r\n * have a more specific value of its own -- so a colored, padded banner\r\n * section survives even when it decomposes into several stacked rows,\r\n * without a deeper row's own real per-line padding getting overwritten by\r\n * its ancestor's.\r\n */\r\nfunction collectRows(nodes) {\r\n const rows = [];\r\n let buf = [];\r\n const flushBuf = () => {\r\n const blocks = blocksFromNodes(buf);\r\n if (blocks.length) {\r\n const row = mkRow([100]);\r\n row.props.py = 0; row.props.px = 0; row.props.gap = 0;\r\n row.cols[0].blocks = blocks;\r\n rows.push(row);\r\n }\r\n buf = [];\r\n };\r\n nodes.forEach((n) => {\r\n if (n.nodeType === 8) return; // HTML comments (Outlook/MSO conditionals) -- inert\r\n if (n.nodeType === 1 && /^(SCRIPT|STYLE)$/.test(n.tagName)) return;\r\n if (n.nodeType === 1 && isHidden(n)) return;\r\n if (n.nodeType === 1 && (n.tagName === 'DIV' || n.tagName === 'CENTER') && looksLikeContainer(n) && !classifyNode(unwrapBoxDiv(n))) {\r\n flushBuf();\r\n const inner = collectRows(Array.from(n.childNodes));\r\n rows.push(...applyBgImage(applyFrame(applyPad(applyBg(inner, bgOf(n)), padOf(n)), n), n));\r\n return;\r\n }\r\n if (n.nodeType === 1 && n.tagName === 'TABLE') {\r\n if (n.closest('form,svg')) { buf.push(n); return; } // a form/svg's own table, not page layout -- leave for the html fallback\r\n // A social-icon table at row level must classify as one block BEFORE\r\n // the layout machinery sees it -- rowsFromContentTable would otherwise\r\n // shred it into one column per icon. Only the social classifier runs\r\n // here: the others (classifyTable especially) would misread genuine\r\n // layout tables that this walker exists to decompose.\r\n const social = classifySocial(n);\r\n if (social) {\r\n flushBuf();\r\n const row = mkRow([100]);\r\n row.props.py = 0; row.props.px = 0; row.props.gap = 0;\r\n // The strip's spacing lives on the td holding the icons; the social\r\n // block itself has no padding props, so it becomes the row's.\r\n const anchor = n.querySelector('a');\r\n const holder = anchor && anchor.closest ? anchor.closest('td') : null;\r\n const pd = holder ? paddingOf(holder.style) : null;\r\n if (pd) setRowPad(row, pd);\r\n row.cols[0].blocks = [social];\r\n rows.push(row);\r\n return;\r\n }\r\n if (isPassthroughTable(n)) {\r\n const tr = n.querySelector(':scope > tbody > tr, :scope > tr');\r\n const td = Array.from(tr.children).find((c) => c.tagName === 'TD' || c.tagName === 'TH');\r\n flushBuf();\r\n // The `height`-styled empty cell (a ` ` and nothing else) is the\r\n // table-email idiom for vertical space -- keep it as a spacer block\r\n // rather than letting the empty text run evaporate.\r\n const spacerH = PX(td.style.height);\r\n if (spacerH && !td.children.length && !(td.textContent || '').replace(/ /g, '').trim()) {\r\n const row = mkRow([100]);\r\n row.props.py = 0; row.props.px = 0; row.props.gap = 0;\r\n row.cols[0].blocks = [blk('spacer', { height: spacerH })];\r\n rows.push(row);\r\n return;\r\n }\r\n const inner = collectRows(Array.from(td.childNodes));\r\n // Frame styles live on the td for some builders and on the table\r\n // itself for others (`table.row-content` carries the card border) --\r\n // applyFrame fills only what's still unset, so trying both is safe.\r\n rows.push(...applyBgImage(applyBgImage(applyFrame(applyFrame(applyPad(applyBg(inner, bgOf(n) || bgOf(td)), padOf(td) || padOf(n) || cellPadOf(n)), td), n), td), n));\r\n return;\r\n }\r\n flushBuf();\r\n rows.push(...rowsFromContentTable(n));\r\n return;\r\n }\r\n buf.push(n);\r\n });\r\n flushBuf();\r\n return rows;\r\n}\r\n\r\n/**\r\n * Best-effort document theme, read off the source's own signals: the page\r\n * background from the body (or the outermost full-width wrapper, where email\r\n * builders usually put it), the content width as the most common fixed pixel\r\n * width among layout tables, and the font stack from the first styled element\r\n * that actually holds text. Without this, every import kept the previous\r\n * document's theme -- a DM Sans email on #F1F5F9 came back in the default\r\n * Georgia on the default parchment, which read as \"the import broke\".\r\n */\r\nfunction themeFromParsedDoc(doc) {\r\n const theme = {};\r\n const body = doc.body;\r\n let bg = (body.style && (body.style.backgroundColor || body.style.background)) || body.getAttribute('bgcolor') || '';\r\n if (!bg) {\r\n const outer = body.querySelector('table');\r\n if (outer) bg = bgOf(outer) || (outer.querySelector('td') ? bgOf(outer.querySelector('td')) : '');\r\n }\r\n if (bg) theme.bg = bg;\r\n const widthCounts = {};\r\n body.querySelectorAll('table').forEach((tb) => {\r\n const w = tb.getAttribute('width') || (tb.style && tb.style.width) || '';\r\n if (!w || String(w).endsWith('%')) return;\r\n const px = PX(w);\r\n if (px >= 320 && px <= 900) widthCounts[px] = (widthCounts[px] || 0) + 1;\r\n });\r\n const bestWidth = Object.keys(widthCounts).sort((a, b) => widthCounts[b] - widthCounts[a])[0];\r\n if (bestWidth) theme.width = Number(bestWidth);\r\n // Prefer the first *real* stack (has a comma or quotes) over a lone generic\r\n // keyword: builders wrap everything in a `font-family:sans-serif` shim div\r\n // with the actual `'DM Sans', Arial, ...` declared a level deeper.\r\n const fonts = Array.from(body.querySelectorAll('[style*=\"font-family\"]'))\r\n .filter((el) => (el.textContent || '').trim())\r\n .map((el) => el.style.fontFamily)\r\n .filter(Boolean);\r\n const font = fonts.find((v) => /[,\"']/.test(v)) || fonts[0];\r\n if (font) theme.font = font;\r\n // Link color: the most common inline anchor color -- skipping button\r\n // pills, whose (usually white) label color would otherwise dominate a\r\n // CTA-heavy email.\r\n const isPill = (a) => !!((a.style && (a.style.backgroundColor || a.style.background))\r\n || Array.from(a.querySelectorAll('span')).some((s) => s.style && (s.style.backgroundColor || s.style.background)));\r\n const linkCounts = {};\r\n body.querySelectorAll('a[style*=\"color\"]').forEach((a) => {\r\n const c = a.style.color;\r\n // Only text links vote -- icon links (social strips) carry an icon\r\n // color, not the document's link color.\r\n if (!c || c === 'inherit' || !(a.textContent || '').trim() || isPill(a)) return;\r\n linkCounts[c] = (linkCounts[c] || 0) + 1;\r\n });\r\n const link = Object.keys(linkCounts).sort((a, b) => linkCounts[b] - linkCounts[a])[0];\r\n if (link) theme.link = link;\r\n if (body.style && body.style.color) theme.text = body.style.color;\r\n return theme;\r\n}\r\n\r\n/** Full import entry point: the rows plus the theme patch read from the same source. `theme` only carries keys the source actually declared -- the caller merges it over the current theme so unspecified fields keep their values. */\r\nfunction htmlToDoc(src) {\r\n let doc;\r\n try { doc = new DOMParser().parseFromString(String(src || ''), 'text/html'); } catch { return { rows: [], theme: {} }; }\r\n // Fold <style> rules into inline styles first, so class-styled templates\r\n // (never-inlined exports, hand-written emails) classify like inlined ones.\r\n // Best-effort: a pathological stylesheet must never block the import.\r\n try { inlineStylesheets(doc); } catch { /* proceed with inline styles only */ }\r\n return { rows: collectRows(Array.from(doc.body.childNodes)), theme: themeFromParsedDoc(doc) };\r\n}\r\n\r\nfunction htmlToRows(src) {\r\n return htmlToDoc(src).rows;\r\n}\r\n\nObject.assign(exports, { htmlToDoc, htmlToRows });\n\n};\n__modules[\"core/layout-style.js\"] = function(module, exports, __require) {\n/**\r\n * Pure style-computation functions shared by the live renderer and the export\r\n * builder, ported verbatim. Objects use camelCase keys so they can be applied\r\n * directly via `Object.assign(el.style, obj)`.\r\n */\r\n\r\nconst {cssUrl} = __require(\"core/sanitize.js\");\r\nfunction pad(p) {\r\n return (p.py || 0) + 'px ' + (p.px || 0) + 'px';\r\n}\r\n\r\nfunction boxStyle(p) {\r\n const on = (key) => p[key] !== false;\r\n const side = (key) => (p.bBorder && on(key) ? p.bBorder + 'px ' + (p.bStyle || 'solid') + ' ' + (p.bLine || '#e2e2e5') : '0');\r\n return {\r\n background: p.bBg || 'transparent',\r\n borderTop: side('bTop'), borderRight: side('bRight'), borderBottom: side('bBottom'), borderLeft: side('bLeft'),\r\n borderRadius: (p.bRadius || 0) + 'px',\r\n padding: (p.bPad || 0) + 'px',\r\n };\r\n}\r\n\r\nfunction boxCss(p) {\r\n const bits = [];\r\n if (p.bBg) bits.push('background:' + p.bBg);\r\n if (p.bBorder) {\r\n const value = p.bBorder + 'px ' + (p.bStyle || 'solid') + ' ' + (p.bLine || '#e2e2e5');\r\n const sides = { top: p.bTop !== false, right: p.bRight !== false, bottom: p.bBottom !== false, left: p.bLeft !== false };\r\n if (sides.top && sides.right && sides.bottom && sides.left) bits.push('border:' + value);\r\n else Object.keys(sides).filter((key) => sides[key]).forEach((key) => bits.push('border-' + key + ':' + value));\r\n }\r\n if (p.bRadius) bits.push('border-radius:' + p.bRadius + 'px');\r\n if (p.bPad) bits.push('padding:' + p.bPad + 'px');\r\n return bits.length ? bits.join(';') + ';' : 'margin:0';\r\n}\r\n\r\n/** A row's effective padding as a four-value CSS shorthand. `pt/pb/pl/pr` are optional per-side overrides (set by the inspector's \"Per-side padding\" split, or by the importer for asymmetric source padding); wherever a side is absent it follows the linked `py`/`px` pair, so documents that never split keep behaving exactly as before. */\r\nfunction rowPad(p) {\n const t = p.pt ?? p.py ?? 0;\r\n const b = p.pb ?? p.py ?? 0;\r\n const l = p.pl ?? p.px ?? 0;\r\n const r = p.pr ?? p.px ?? 0;\r\n return t + 'px ' + r + 'px ' + b + 'px ' + l + 'px';\r\n}\n\n/** A row's outside spacing in CSS clockwise order, with the old vertical `my` value as a saved-document fallback. Empty horizontal margins can remain `auto` in the live canvas so the advanced max-width control stays centered. */\nfunction rowMargin(p, centerEmpty) {\n const t = p.mt ?? p.my ?? 0;\n const r = p.mr ?? 0;\n const b = p.mb ?? p.my ?? 0;\n const l = p.ml ?? 0;\n const emptyHorizontal = centerEmpty && !r && !l;\n return t + 'px ' + (emptyHorizontal ? 'auto' : r + 'px') + ' ' + b + 'px ' + (emptyHorizontal ? 'auto' : l + 'px');\n}\n\r\n/** Which sides a row's border draws on. Sides default ON (`!== false`) so documents saved before per-side toggles existed keep their full border. */\r\nfunction rowBorderSides(p) {\r\n return { top: p.bTop !== false, right: p.bRight !== false, bottom: p.bBottom !== false, left: p.bLeft !== false };\r\n}\r\n\r\n/** The row border as an inline-CSS string (export path). Empty when the width is 0 or every side is toggled off. */\r\nfunction rowBorderCss(p) {\r\n if (!p.border) return '';\r\n const s = rowBorderSides(p);\r\n const value = p.border + 'px ' + (p.borderStyle || 'solid') + ' ' + (p.lineColor || '#e2e2e5');\r\n if (s.top && s.right && s.bottom && s.left) return 'border:' + value + ';';\r\n return ['top', 'right', 'bottom', 'left'].filter((k) => s[k]).map((k) => 'border-' + k + ':' + value + ';').join('');\r\n}\r\n\r\nfunction rowBg(p) {\r\n const ov = (p.overlay || 0) / 100;\r\n const layers = [];\r\n if (p.bgImage && ov) layers.push('linear-gradient(rgba(20,22,24,' + ov + '),rgba(20,22,24,' + ov + '))');\r\n if (p.bgImage) layers.push('url(\"' + cssUrl(p.bgImage) + '\")');\r\n const s = rowBorderSides(p);\r\n const side = (on) => (p.border && on ? p.border + 'px ' + (p.borderStyle || 'solid') + ' ' + (p.lineColor || '#e2e2e5') : '0');\r\n return {\r\n backgroundColor: p.bg || 'transparent',\r\n backgroundImage: layers.length ? layers.join(',') : 'none',\r\n backgroundSize: p.bgSize || 'cover',\r\n backgroundPosition: p.bgPos || 'center',\r\n backgroundRepeat: p.bgRepeat || 'no-repeat',\r\n borderTop: side(s.top),\r\n borderRight: side(s.right),\r\n borderBottom: side(s.bottom),\r\n borderLeft: side(s.left),\r\n borderRadius: (p.radius || 0) + 'px',\r\n // A raw CSS string, not a boolean: imports keep the source's exact\r\n // shadow; the inspector toggle writes/clears a standard one.\r\n boxShadow: p.shadow || 'none',\r\n maxWidth: (p.maxW || 100) + '%',\r\n margin: rowMargin(p, true),\n };\n}\n\r\nfunction colsWrap(p) {\r\n const gap = p.gap || 0;\r\n if (p.layout === 'grid') return { display: 'grid', gridTemplateColumns: 'repeat(' + (p.gridCols || 2) + ', minmax(0, 1fr))', gap: gap + 'px' };\r\n if (p.layout === 'flex') {\r\n return {\r\n display: 'flex', flexDirection: p.flexDir || 'row', justifyContent: p.justify || 'flex-start',\r\n alignItems: p.alignItems || 'stretch', flexWrap: p.wrap ? 'wrap' : 'nowrap', gap: gap + 'px',\r\n };\r\n }\r\n return { display: 'flex', alignItems: 'stretch', margin: '0 ' + (-gap / 2) + 'px' };\r\n}\r\n\r\nfunction colStyle(p, c) {\r\n if (p.layout === 'grid') return { minWidth: 0 };\r\n if (p.layout === 'flex') return { flex: (p.flexDir || 'row').indexOf('column') === 0 ? '0 0 auto' : c.span + ' 1 auto', minWidth: 0 };\r\n return {\r\n flex: c.span + ' 1 0%', minWidth: 0, padding: '0 ' + (p.gap || 0) / 2 + 'px',\r\n alignSelf: p.valign === 'middle' ? 'center' : (p.valign === 'bottom' ? 'flex-end' : 'flex-start'),\r\n };\r\n}\r\n\nObject.assign(exports, { pad, boxStyle, boxCss, rowPad, rowMargin, rowBorderSides, rowBorderCss, rowBg, colsWrap, colStyle });\n\n};\n__modules[\"core/parse.js\"] = function(module, exports, __require) {\nfunction parseItems(s) {\r\n return String(s || '').split('\\n').map((l) => l.trim()).filter(Boolean).map((l) => {\r\n const i = l.indexOf('|');\r\n return i < 0 ? { label: l, href: '#' } : { label: l.slice(0, i).trim(), href: l.slice(i + 1).trim() };\r\n });\r\n}\r\n\r\nfunction cellsOf(p) {\r\n return String(p.data || '').split('\\n').filter((l) => l.trim()).map((l) => l.split('|').map((c) => c.trim()));\r\n}\r\n\nObject.assign(exports, { parseItems, cellsOf });\n\n};\n__modules[\"core/placeholder.js\"] = function(module, exports, __require) {\n/** Data-URI placeholder image generator, ported verbatim from the original. */\r\nfunction enc(s) {\r\n return encodeURIComponent(s).replace(/\\(/g, '%28').replace(/\\)/g, '%29');\r\n}\r\n\r\nfunction PH(label, w, ht) {\r\n return 'data:image/svg+xml;utf8,' + enc(\r\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"' + w + '\" height=\"' + ht + '\">' +\r\n '<defs><pattern id=\"s\" width=\"9\" height=\"9\" patternTransform=\"rotate(45)\" patternUnits=\"userSpaceOnUse\">' +\r\n '<rect width=\"9\" height=\"9\" fill=\"#ececed\"/><line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"9\" stroke=\"#cfd3d8\" stroke-width=\"3\"/></pattern></defs>' +\r\n '<rect width=\"100%\" height=\"100%\" fill=\"url(#s)\"/>' +\r\n '<rect x=\"0.5\" y=\"0.5\" width=\"' + (w - 1) + '\" height=\"' + (ht - 1) + '\" fill=\"none\" stroke=\"#9aa2ab\"/>' +\r\n '<text x=\"50%\" y=\"50%\" dy=\"4\" text-anchor=\"middle\" font-family=\"ui-monospace,monospace\" font-size=\"' + Math.max(11, Math.round(w / 40)) + '\" fill=\"#5b6672\">' + label + '</text></svg>',\r\n );\r\n}\r\n\nObject.assign(exports, { PH });\n\n};\n__modules[\"core/sanitize.js\"] = function(module, exports, __require) {\n/** Scopes authored CSS to the email sheet so a raw block can never restyle the editor chrome. Ported verbatim: manual brace-matching, not the CSSOM, so arbitrary/partial CSS still scopes instead of failing to parse. */\r\nconst scopeCss = (css, root) => {\r\n const src = String(css || '');\r\n let out = ''; let i = 0;\r\n const prefix = (sel) => sel.split(',').map((s) => {\r\n const t = s.trim();\r\n if (!t) return '';\r\n if (/^(from|to|\\d+%)$/i.test(t)) return t;\r\n if (t.startsWith('@')) return t;\r\n if (/^(html|body|:root)\\b/i.test(t)) return root + t.replace(/^(html|body|:root)/i, '');\r\n return root + ' ' + t;\r\n }).filter(Boolean).join(', ');\r\n while (i < src.length) {\r\n const brace = src.indexOf('{', i);\r\n if (brace < 0) { out += src.slice(i); break; }\r\n const head = src.slice(i, brace).trim();\r\n let depth = 1; let j = brace + 1;\r\n while (j < src.length && depth > 0) { if (src[j] === '{') depth++; else if (src[j] === '}') depth--; j++; }\r\n const body = src.slice(brace + 1, j - 1);\r\n if (head.startsWith('@')) {\r\n out += head + '{' + (/^@(media|supports|layer|container)/i.test(head) ? scopeCss(body, root) : body) + '}';\r\n } else {\r\n out += prefix(head) + '{' + body + '}';\r\n }\r\n i = j;\r\n }\r\n return out;\r\n};\r\n\r\nconst migrateTokens = (json) => String(json).replace(/\\[\\[\\s*([\\w.]+)\\s*\\]\\]/g, '{' + '{ $1 }' + '}');\r\n\r\n/** Paste sanitizer -- Word/Docs/Notion drop class soup, mso- properties and nested spans into the document; keep a small tag whitelist and drop attributes (href/target/rel on links survive). */\r\nconst PASTE_OK = { A: 1, B: 1, STRONG: 1, I: 1, EM: 1, U: 1, S: 1, STRIKE: 1, BR: 1, P: 1, UL: 1, OL: 1, LI: 1, H1: 1, H2: 1, H3: 1, H4: 1, H5: 1, H6: 1, BLOCKQUOTE: 1, CODE: 1, SUP: 1, SUB: 1 };\r\n\r\nconst cleanHtml = (html) => {\r\n const doc = new DOMParser().parseFromString(String(html || ''), 'text/html');\r\n doc.querySelectorAll('style,script,meta,link,title,head').forEach((n) => n.remove());\r\n const walk = (node) => {\r\n Array.from(node.children).forEach((el) => {\r\n walk(el);\r\n if (!PASTE_OK[el.tagName]) {\r\n const parent = el.parentNode;\r\n while (el.firstChild) parent.insertBefore(el.firstChild, el);\r\n parent.removeChild(el);\r\n return;\r\n }\r\n Array.from(el.attributes).forEach((at) => {\r\n const keep = el.tagName === 'A' && ['href', 'target', 'rel'].indexOf(at.name) > -1;\r\n if (!keep) el.removeAttribute(at.name);\r\n });\r\n });\r\n };\r\n walk(doc.body);\r\n return doc.body.innerHTML.replace(/<!--[\\s\\S]*?-->/g, '').replace(/\\s{2,}/g, ' ').trim();\r\n};\r\n\r\n/**\r\n * Import sanitizer. Pasting wants `cleanHtml`'s scorched-earth policy (Word/\r\n * Docs class soup adds nothing), but an HTML *import* is the opposite case:\r\n * a hand-built email's inline styles ARE the design. Running imports through\r\n * the paste path collapsed every distinctly-styled paragraph -- a 26px/800\r\n * headline, an italic footnote, a 12px footer -- into one uniform block in\r\n * the theme's default face. This variant keeps the same structural whitelist\r\n * (plus `SPAN`/`IMG`, which carry real content in emails) and preserves a\r\n * whitelist of typographic/spacing style properties per element; everything\r\n * else (mso-*, classes, ids, event handlers) is still stripped.\r\n */\r\nconst IMPORT_OK = Object.assign({ SPAN: 1, IMG: 1 }, PASTE_OK);\r\nconst IMPORT_STYLES = [\r\n 'font-size', 'font-weight', 'font-style', 'font-family', 'color', 'line-height',\r\n 'letter-spacing', 'text-align', 'text-decoration', 'text-transform',\r\n 'background-color', 'border-radius', 'padding', 'margin', 'word-break',\r\n 'width', 'max-width', 'height',\r\n];\r\n\r\nconst cleanImportHtml = (html) => {\r\n const doc = new DOMParser().parseFromString(String(html || ''), 'text/html');\r\n doc.querySelectorAll('style,script,meta,link,title,head').forEach((n) => n.remove());\r\n const walk = (node) => {\r\n Array.from(node.children).forEach((el) => {\r\n walk(el);\r\n if (!IMPORT_OK[el.tagName]) {\r\n const parent = el.parentNode;\r\n while (el.firstChild) parent.insertBefore(el.firstChild, el);\r\n parent.removeChild(el);\r\n return;\r\n }\r\n const kept = [];\r\n IMPORT_STYLES.forEach((p) => {\r\n const v = el.style.getPropertyValue(p);\r\n if (v) kept.push(p + ':' + v);\r\n });\r\n Array.from(el.attributes).forEach((at) => {\r\n const keep = (el.tagName === 'A' && ['href', 'target', 'rel'].indexOf(at.name) > -1)\r\n || (el.tagName === 'IMG' && ['src', 'alt', 'width', 'height'].indexOf(at.name) > -1);\r\n if (!keep) el.removeAttribute(at.name);\r\n });\r\n if (kept.length) el.setAttribute('style', kept.join(';'));\r\n });\r\n };\r\n walk(doc.body);\r\n return doc.body.innerHTML.replace(/<!--[\\s\\S]*?-->/g, '').replace(/\\s{2,}/g, ' ').trim();\r\n};\r\n\r\n/**\r\n * Makes an image URL safe to drop inside `url(\"...\")`.\r\n *\r\n * These URLs are not ours: they come from a storage provider's backend, or from\r\n * a user typing into the \"Background image URL\" field. They are then\r\n * interpolated into CSS -- in the library tiles, in the canvas, and (worst) into\r\n * a `style=\"...\"` attribute in the exported email, where an unescaped quote ends\r\n * the attribute and everything after it becomes markup in someone's campaign.\r\n *\r\n * Percent-encoding rather than backslash-escaping, because the same value has to\r\n * survive two different contexts: `\\\"` is correct in CSS but is still a literal\r\n * quote to an HTML attribute parser. `%22` is safe in both, and resolves\r\n * identically when the browser fetches it.\r\n *\r\n * Schemes are allowlisted as well. A relative path has no scheme and is fine;\r\n * anything exotic resolves to nothing rather than being handed to the parser.\r\n */\r\nconst CSS_URL_ESCAPE = { '\"': '%22', \"'\": '%27', '(': '%28', ')': '%29', '\\\\': '%5C' };\r\n\r\nconst cssUrl = (u) => {\r\n const raw = String(u == null ? '' : u).trim();\r\n if (!raw) return '';\r\n const scheme = raw.match(/^([a-z][a-z0-9+.-]*):/i);\r\n if (scheme && !/^(https?|blob)$/i.test(scheme[1]) && !/^data:image\\//i.test(raw)) return '';\r\n // An explicit table, not encodeURIComponent: that leaves ( ) ' untouched,\r\n // and an unescaped paren closes url(...) just as surely as a quote does.\r\n return raw.replace(/[\"'()\\\\]|\\s/g, (c) => CSS_URL_ESCAPE[c] || '%20');\r\n};\r\n\r\nconst escHtml = (s) => String(s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\r\n\r\n/** Minimal HTML syntax highlighter for the code view. */\r\nconst hl = (src) => escHtml(src)\r\n .replace(/([\\w-]+)="([^&]*)"/g, '<span style=\"color:#a8763e\">$1</span>=<span style=\"color:#4a8a6a\">"$2"</span>')\r\n .replace(/([\\w-]+)=\"([^\"]*)\"/g, '<span style=\"color:#a8763e\">$1</span>=<span style=\"color:#4a8a6a\">\"$2\"</span>')\r\n .replace(/(<\\/?)([a-zA-Z][\\w-]*)/g, '$1<span style=\"color:#5980a6;font-weight:600\">$2</span>')\r\n .replace(/(\\{\\{[^{}]*\\}\\})/g, '<span style=\"background:rgba(89,128,166,0.18);color:#2c455d;border-radius:2px\">$1</span>');\r\n\nObject.assign(exports, { scopeCss, migrateTokens, cleanHtml, cleanImportHtml, cssUrl, escHtml, hl });\n\n};\n__modules[\"core/storage-limits.js\"] = function(module, exports, __require) {\n/**\r\n * Upload validation -- mechanism only, no policy.\r\n *\r\n * Deliberately ships no default ceilings. What an email template may carry\r\n * depends on the sending platform (ESP attachment caps), the audience's\r\n * clients (Outlook's Word engine won't render WebP; nothing renders AVIF) and\r\n * the host's own product rules, so the numbers are the host's to set:\r\n * `editor.storageLimits`, or `limits` on the provider. With a provider wired\r\n * and no limits declared, uploads are refused rather than waved through.\r\n *\r\n * Checks run *before* the provider is called, so a rejected file never reaches\r\n * the backend. That matters for any store where minting an upload URL also\r\n * creates the file record: validating afterwards would leave an orphan behind\r\n * for every rejection.\r\n *\r\n * Types are decided by sniffing the leading bytes, not by trusting `file.type`:\r\n * the browser fills that in from the file extension, so renaming `payload.svg`\r\n * to `photo.png` is enough to walk a script-bearing document past a MIME check\r\n * and into the editor's own DOM, where the library preview renders it.\r\n */\r\n\r\nconst {KB} = __require(\"core/assets.js\");\r\n\r\nconst ascii = (b, at, s) => s.split('').every((c, i) => b[at + i] === c.charCodeAt(0));\r\n\r\n/**\r\n * The leading bytes of every raster format a mail client might plausibly be\r\n * asked to show, plus the ones it can't -- knowing a file is AVIF is what lets\r\n * the rejection say \"AVIF\" instead of \"unsupported\".\r\n */\r\nfunction sniff(b) {\r\n if (b.length < 12) return null;\r\n if (b[0] === 0xff && b[1] === 0xd8 && b[2] === 0xff) return 'image/jpeg';\r\n if (b[0] === 0x89 && ascii(b, 1, 'PNG')) return 'image/png';\r\n if (ascii(b, 0, 'GIF8')) return 'image/gif';\r\n if (ascii(b, 0, 'RIFF') && ascii(b, 8, 'WEBP')) return 'image/webp';\r\n if (ascii(b, 0, 'BM')) return 'image/bmp';\r\n if ((ascii(b, 0, 'II') && b[2] === 0x2a && b[3] === 0) || (ascii(b, 0, 'MM') && b[2] === 0 && b[3] === 0x2a)) return 'image/tiff';\r\n if (b[0] === 0 && b[1] === 0 && b[2] === 1 && b[3] === 0) return 'image/x-icon';\r\n if (ascii(b, 4, 'ftyp')) {\r\n const brand = String.fromCharCode(b[8], b[9], b[10], b[11]);\r\n if (brand === 'avif' || brand === 'avis') return 'image/avif';\r\n return 'image/heic';\r\n }\r\n // Markup: an SVG may open with a BOM, an XML declaration, a doctype or a\r\n // comment before the root element, so the reliable tell is \"text that starts\r\n // with '<'\", not a literal \"<svg\" at offset zero.\r\n let i = 0;\r\n if (b[0] === 0xef && b[1] === 0xbb && b[2] === 0xbf) i = 3;\r\n while (i < b.length && (b[i] === 0x20 || b[i] === 0x09 || b[i] === 0x0a || b[i] === 0x0d)) i++;\r\n if (b[i] === 0x3c) return 'image/svg+xml';\r\n return null;\r\n}\r\n\r\n/** First bytes of a file. `Blob.arrayBuffer` where it exists, FileReader where it doesn't. */\r\nfunction head(file) {\r\n const slice = file.slice(0, 32);\r\n if (typeof slice.arrayBuffer === 'function') {\r\n return slice.arrayBuffer().then((buf) => new Uint8Array(buf)).catch(() => null);\r\n }\r\n return new Promise((resolve) => {\r\n const fr = new FileReader();\r\n fr.onload = () => resolve(new Uint8Array(fr.result));\r\n fr.onerror = () => resolve(null);\r\n fr.readAsArrayBuffer(slice);\r\n });\r\n}\r\n\r\n/** Decoded pixel dimensions, or `null` when the browser can't decode it -- which is itself a reason to refuse the file. */\r\nfunction probe(file) {\r\n return new Promise((resolve) => {\r\n const url = URL.createObjectURL(file);\r\n const img = new Image();\r\n const done = (v) => { URL.revokeObjectURL(url); resolve(v); };\r\n img.onload = () => done({ w: img.naturalWidth || img.width, ht: img.naturalHeight || img.height });\r\n img.onerror = () => done(null);\r\n img.src = url;\r\n });\r\n}\r\n\r\n/**\r\n * Strips directory separators, control characters and anything a storage\r\n * backend is likely to treat as path syntax, and caps the length. A name\r\n * arrives from the user's disk and ends up in a URL.\r\n */\r\nfunction sanitizeName(name) {\r\n const clean = String(name || 'file')\r\n .replace(/[\\\\/]/g, '-')\r\n .replace(/[<>:\"|?*]/g, '')\r\n .split('').filter((c) => c.charCodeAt(0) > 31).join('')\r\n .trim()\r\n .replace(/^\\.+/, '') || 'file';\r\n if (clean.length <= 120) return clean;\r\n const dot = clean.lastIndexOf('.');\r\n const ext = dot > 0 && clean.length - dot <= 8 ? clean.slice(dot) : '';\r\n return clean.slice(0, 120 - ext.length) + ext;\r\n}\r\n\r\n/** The host has to have said what's allowed. Format and size are the two that matter; the rest are optional tightenings. */\r\nfunction limitsProblem(limits) {\r\n if (!limits) return 'storage.errNoLimits';\r\n if (!Array.isArray(limits.accept) || !limits.accept.length) return 'storage.errNoAccept';\r\n if (!(Number(limits.maxBytes) > 0)) return 'storage.errNoMaxBytes';\r\n return null;\r\n}\r\n\r\n/**\r\n * Splits a FileList into what may be uploaded and what may not.\r\n *\r\n * Rejections carry an i18n key and its params rather than a sentence, so the\r\n * reason is translated by the same table as the rest of the chrome.\r\n *\r\n * @returns {Promise<{accepted: Array<{file: File, name: string, w: number, ht: number, size: number, type: string}>, rejected: Array<{name: string, key: string, params: Object}>}>}\r\n */\r\nasync function validateFiles(list, limits) {\r\n const files = Array.from(list || []);\r\n const accepted = [];\r\n const rejected = [];\r\n if (!files.length) return { accepted, rejected };\r\n\r\n const problem = limitsProblem(limits);\r\n if (problem) return { accepted, rejected: files.map((f) => ({ name: f.name, key: problem, params: {} })) };\r\n\r\n const accept = limits.accept.map((m) => String(m).toLowerCase());\r\n const max = Number(limits.maxBytes);\r\n const maxW = Number(limits.maxWidth) || 0;\r\n const maxH = Number(limits.maxHeight) || 0;\r\n const perDrop = Number(limits.maxFilesPerDrop) || 0;\r\n\r\n const queue = perDrop && files.length > perDrop ? files.slice(0, perDrop) : files;\r\n if (queue.length < files.length) {\r\n files.slice(queue.length).forEach((f) => rejected.push({ name: f.name, key: 'storage.errTooMany', params: { max: perDrop } }));\r\n }\r\n\r\n for (const file of queue) {\r\n const name = sanitizeName(file.name);\r\n\r\n if (file.size > max) {\r\n rejected.push({ name, key: 'storage.errTooLarge', params: { name, size: KB(file.size), max: KB(max) } });\r\n continue;\r\n }\r\n\r\n const bytes = await head(file);\r\n const type = bytes && sniff(bytes);\r\n if (!type) {\r\n rejected.push({ name, key: 'storage.errUnreadable', params: { name } });\r\n continue;\r\n }\r\n if (!accept.includes(type)) {\r\n rejected.push({ name, key: 'storage.errFormat', params: { name, type: type.replace(/^image\\//, '').toUpperCase() } });\r\n continue;\r\n }\r\n // Listing SVG in `accept` is not on its own enough. It is the one image\r\n // type that is also a script host, and it renders inside the editor's own\r\n // shadow root the moment it appears as a library tile -- so a host that\r\n // genuinely wants it has to say so twice, and can never enable it by\r\n // pasting a permissive MIME list.\r\n if (type === 'image/svg+xml' && !limits.allowSvg) {\r\n rejected.push({ name, key: 'storage.errSvg', params: { name } });\r\n continue;\r\n }\r\n\r\n let dims = { w: 0, ht: 0 };\r\n if (type !== 'image/svg+xml') {\r\n const measured = await probe(file);\r\n if (!measured) { rejected.push({ name, key: 'storage.errUnreadable', params: { name } }); continue; }\r\n dims = measured;\r\n if ((maxW && dims.w > maxW) || (maxH && dims.ht > maxH)) {\r\n rejected.push({ name, key: 'storage.errDimensions', params: { name, w: dims.w, ht: dims.ht, maxW: maxW || dims.w, maxH: maxH || dims.ht } });\r\n continue;\r\n }\r\n }\r\n\r\n accepted.push({ file, name, type, size: file.size, w: dims.w, ht: dims.ht });\r\n }\r\n\r\n return { accepted, rejected };\r\n}\r\n\r\n/** An `accept` attribute for the file picker, so the OS dialog greys out what validation would refuse anyway. */\r\nfunction acceptAttribute(limits) {\r\n if (!limits || !Array.isArray(limits.accept) || !limits.accept.length) return 'image/*';\r\n return limits.accept.join(',');\r\n}\r\n\nObject.assign(exports, { sanitizeName, limitsProblem, validateFiles, acceptAttribute });\n\n};\n__modules[\"core/storage.js\"] = function(module, exports, __require) {\n/**\r\n * The storage contract.\r\n *\r\n * This file is deliberately transport-free: no `fetch`, no auth, no origin, no\r\n * backend of any kind. The editor talks to a plain object supplied by the host\r\n * (`editor.storageProvider = …`) in exactly the way it talks to `aiProvider` --\r\n * so a host can back the file library with S3, a DMS, a CDN or its own proxy\r\n * without this package knowing which.\r\n *\r\n * No adapter ships here, deliberately. An adapter is a mapping onto somebody\r\n * else's API surface, so vendoring one would mean republishing this package\r\n * every time that surface moves. The host writes its own, next to the auth and\r\n * base URL it already owns.\r\n *\r\n * @typedef {Object} Asset\r\n * @property {string} id Stable id. With a provider this is the backend's file id -- `remove()` gets it back verbatim.\r\n * @property {string} name Display/file name.\r\n * @property {string} url Resolvable image URL. Must outlive the send: an email renders it long after the editor closed.\r\n * @property {string} folder Folder display name.\r\n * @property {string} [folderId] Backend folder id, when the provider has one.\r\n * @property {number} w Pixel width (0 when unknown).\r\n * @property {number} ht Pixel height (0 when unknown).\r\n * @property {number} size Bytes.\r\n *\r\n * @typedef {Object} StorageProvider\r\n * @property {() => Promise<Array<{id: string, name: string}>>} [folders]\r\n * Selectable folders. Omit for a flat library.\r\n * @property {(q: {folderId: string, cursor: ?string, query: string}) => Promise<{items: Asset[], cursor: ?string}>} list\r\n * One page of assets. `cursor` is opaque -- whatever the provider returned last, handed back to fetch the next page.\r\n * @property {(file: File, o: {folderId: string, width: number, height: number, signal: ?AbortSignal}) => Promise<Asset>} upload\r\n * Stores one already-validated file and resolves to the asset that represents it.\r\n * @property {(asset: Asset) => Promise<void>} [remove]\r\n * Deletes. Without it the library's DEL only drops the tile from view.\r\n * @property {StorageLimits} [limits]\r\n * Provider-declared ceilings. `editor.storageLimits` wins over these.\r\n *\r\n * @typedef {Object} StorageLimits\r\n * @property {string[]} accept Allowed MIME types, e.g. `['image/jpeg','image/png','image/gif']`. Required.\r\n * @property {number} maxBytes Per-file byte ceiling. Required.\r\n * @property {number} [maxWidth]\r\n * @property {number} [maxHeight]\r\n * @property {number} [maxFilesPerDrop]\r\n * @property {boolean} [allowSvg] SVG is refused even when listed in `accept` unless this is also true -- see `storage-limits.js`.\r\n */\r\n\r\n/** The synthetic \"everything\" folder. Its id is empty so a provider reading `folderId` sees \"no folder filter\", not a magic name. */\r\nconst ALL_FOLDER_ID = '';\r\n\r\n/**\r\n * Coerces whatever a provider returned into the shape the renderer indexes\r\n * into. A provider that forgets `w`/`ht` should degrade to a tile without\r\n * dimensions, not to `undefined×undefined` printed in the UI -- and `probe`\r\n * (what the limits check already measured client-side) fills those in for\r\n * backends that don't store image dimensions at all.\r\n */\r\nfunction normalizeAsset(raw, probe) {\r\n const a = raw || {};\r\n return {\r\n id: String(a.id ?? a.itemId ?? ''),\r\n name: String(a.name ?? (probe && probe.name) ?? 'file'),\r\n url: String(a.url ?? ''),\r\n folder: String(a.folder ?? ''),\r\n folderId: a.folderId != null ? String(a.folderId) : undefined,\r\n w: Number(a.w ?? (probe && probe.w) ?? 0) || 0,\r\n ht: Number(a.ht ?? (probe && probe.ht) ?? 0) || 0,\r\n size: Number(a.size ?? (probe && probe.size) ?? 0) || 0,\r\n };\r\n}\r\n\r\n/**\r\n * `editor.storageLimits` over `provider.limits`, per key rather than\r\n * wholesale: a host that only wants to tighten `maxBytes` shouldn't have to\r\n * restate the provider's `accept` list to do it.\r\n */\r\nfunction resolveLimits(hostLimits, providerLimits) {\r\n if (!hostLimits && !providerLimits) return null;\r\n return Object.assign({}, providerLimits || {}, hostLimits || {});\r\n}\r\n\r\n/** Names the methods a provider is missing, for a loud failure at assignment rather than a quiet one on first upload. */\r\nfunction providerProblems(p) {\r\n if (!p || typeof p !== 'object') return ['storageProvider must be an object'];\r\n const missing = ['list', 'upload'].filter((k) => typeof p[k] !== 'function');\r\n return missing.length ? [`storageProvider is missing ${missing.join(' and ')}`] : [];\r\n}\r\n\nObject.assign(exports, { ALL_FOLDER_ID, normalizeAsset, resolveLimits, providerProblems });\n\n};\n__modules[\"core/theme.js\"] = function(module, exports, __require) {\nconst THEME = () => ({ bg: '#eef2f7', contentBg: '#ffffff', width: 620, font: '\"Helvetica Neue\", Helvetica, Arial, sans-serif', text: '#172033', link: '#0065b3' });\r\n\nObject.assign(exports, { THEME });\n\n};\n__modules[\"core/toolbar.js\"] = function(module, exports, __require) {\n/**\n * Which parts of the editor's own top bar are shown.\n *\n * Hosts embed the editor inside chrome they already own -- a page header, a\n * breadcrumb, their own Save/Send buttons -- where a second bar with a second\n * logo reads as two applications stacked on top of each other. The bar is\n * therefore configurable down to the individual control, and can be removed\n * entirely.\n *\n * What that costs: `undo`, `redo` and `export` have element-level equivalents\n * (`undo()`, `redo()`, `exportHtml()`), so hiding those is only declining to\n * render the button. `preview`, `code` and `ai` open panels that nothing in\n * the public API opens -- a host that hides them is giving the panel up, not\n * just the button. DOCS.md carries the same table for integrators.\n *\n * Keyboard shortcuts are unaffected by any of this -- they are bound on the\n * document, not on the bar -- so Ctrl/Cmd+Z, Shift+Ctrl/Cmd+Z and Ctrl/Cmd+E\n * (the export dialog, and the Screenshot button inside it) work with no bar\n * at all.\n */\n\n/** Every switchable part, in the order it appears in the bar. */\nconst TOOLBAR_ITEMS = ['logo', 'status', 'device', 'undo', 'redo', 'theme', 'ai', 'code', 'preview', 'export'];\n\nconst HIDDEN = ['none', 'hidden', 'off', 'false'];\n\n/**\n * Normalizes whatever the host set into `{ item: boolean }`, or `null` for\n * \"no bar at all\".\n *\n * Accepts, in the two shapes a Web Component gets configured through:\n *\n * - property: `false` (no bar), or an object of overrides where only the\n * keys set to `false` are turned off -- so `{ logo: false }` keeps every\n * control and drops just the brand, without restating the other nine.\n * - attribute: `\"none\"` (no bar), or a comma list naming the items to keep\n * (`toolbar=\"undo,redo,export\"`). Markup has only strings to work with,\n * and an allow-list is the readable half of the two: the alternative is\n * spelling out the seven things you did not want.\n *\n * Unset means everything is shown -- the editor is fully usable standalone,\n * and configuring the bar is opt-in.\n *\n * An empty result (every item switched off) collapses to `null`: an empty\n * 54px bar is not what anyone meant by turning off the last control.\n */\nfunction resolveToolbar(value) {\n if (value === false) return null;\n if (typeof value === 'string' && HIDDEN.indexOf(value.trim().toLowerCase()) >= 0) return null;\n\n const on = {};\n TOOLBAR_ITEMS.forEach((k) => { on[k] = true; });\n\n if (value && typeof value === 'object') {\n TOOLBAR_ITEMS.forEach((k) => { if (value[k] === false) on[k] = false; });\n } else if (typeof value === 'string' && value.trim() && value.trim().toLowerCase() !== 'all') {\n const keep = value.split(',').map((s) => s.trim()).filter(Boolean);\n TOOLBAR_ITEMS.forEach((k) => { on[k] = keep.indexOf(k) >= 0; });\n }\n\n return TOOLBAR_ITEMS.some((k) => on[k]) ? on : null;\n}\n\n/** Stable string for a resolved config, so a re-set that changes nothing does not cost a shell rebuild. */\nfunction toolbarKey(on) {\n return on ? TOOLBAR_ITEMS.map((k) => (on[k] ? '1' : '0')).join('') : 'none';\n}\n\nObject.assign(exports, { TOOLBAR_ITEMS, resolveToolbar, toolbarKey });\n\n};\n__modules[\"core/variables.js\"] = function(module, exports, __require) {\nconst DEFAULT_VARS = 'first_name\\nlast_name\\nemail\\ncompany\\ncity\\norder_id\\nplan\\ndiscount\\nunsubscribe_url';\r\nconst TOKEN = (t) => '{' + '{ ' + t + ' }' + '}';\r\n\r\n/** Variables are supplied by the host application -- the editor only ever shows the tokens, never a substituted value. */\r\nfunction vars(raw) {\r\n const list = Array.isArray(raw) ? raw : String(raw == null ? DEFAULT_VARS : raw).split(/[\\n,]/);\r\n return list.map((v) => String(v).trim().replace(/^\\{\\{\\s*|\\s*\\}\\}$/g, '')).filter(Boolean);\r\n}\r\n\r\n/** Which prop field a merge tag lands in when inserted from the Data tab, keyed by the selected block's type. */\r\nconst INSERT_KEYS = { text: 'html', heading: 'text', button: 'label', html: 'code', codeblock: 'code', quote: 'text', list: 'items', table: 'data' };\r\n\nObject.assign(exports, { DEFAULT_VARS, TOKEN, vars, INSERT_KEYS });\n\n};\n__modules[\"create-editor.js\"] = function(module, exports, __require) {\n/**\n * Mount-into-a-container API, for hosts that would rather call a function than\n * write a tag -- the shape a JS widget usually ships with (`new Map(el, opts)`).\n *\n * const editor = createEditor('#mail', { html, toolbar: false });\n * const out = editor.exportHtml();\n * editor.destroy();\n *\n * This is a thin wrapper, not a second implementation: it creates the same\n * `<mailcraft-editor>`, applies the options to it, and returns a handle whose\n * methods forward to it. `editor.element` is the escape hatch to everything\n * the wrapper does not surface, and markup usage stays exactly as it was.\n *\n * Options that are attributes on the element (`locale`, `theme`, ...) are set\n * as attributes; the ones that carry objects or functions (`storageProvider`,\n * `messages`, ...) are set as properties, because attributes hold strings.\n * Callers do not have to know which is which.\n */\n\nconst {MailCraftEditor} = __require(\"mailcraft-editor.js\");\n\n/** Options that map 1:1 onto an attribute. `uiFont` is spelled `ui-font` in markup. */\nconst ATTRS = { variables: 'variables', locale: 'locale', dir: 'dir', theme: 'theme', uiFont: 'ui-font', accent: 'accent' };\n\n/** Options that must be assigned as properties -- objects and functions cannot travel through an attribute. */\nconst PROPS = ['storageProvider', 'storageLimits', 'aiProvider', 'iconProvider', 'messages', 'footer'];\n\n/** Methods forwarded verbatim onto the returned handle. */\nconst METHODS = ['exportHtml', 'importHtml', 'loadTemplate', 'undo', 'redo', 'screenshotPng', 'previewScreenshot', 'downloadScreenshot', 'copyScreenshot'];\n\nfunction resolveTarget(target) {\n const el = typeof target === 'string' ? document.querySelector(target) : target;\n if (!el || el.nodeType !== 1) {\n throw new Error('[mailcraft] createEditor: no element matched ' + JSON.stringify(target));\n }\n return el;\n}\n\nconst px = (v) => (typeof v === 'number' ? v + 'px' : v);\n\n/**\n * Creates an editor inside `container`.\n *\n * @param {string|Element} target CSS selector or element to mount into.\n * @param {Object} [options]\n * @param {string} [options.html] initial email HTML, applied through the importer\n * @param {string|string[]} [options.variables]\n * @param {string} [options.locale] @param {string} [options.dir] @param {string} [options.theme] @param {string} [options.uiFont]\n * @param {string} [options.accent] brand color for the editor chrome -- a CSS color, `var(--token)`, or `inherit`\n * @param {boolean|Object} [options.toolbar] which parts of the top bar to show -- see core/toolbar.js\n * @param {boolean|string|Object} [options.footer] the attribution strip: false to remove, a string to replace it, or { text, href } -- see core/footer.js\n * @param {Object} [options.storageProvider] @param {Object} [options.storageLimits]\n * @param {Function} [options.aiProvider] @param {Function} [options.iconProvider] @param {Object} [options.messages]\n * @param {string|number} [options.height] sets the container's height; otherwise your CSS decides\n * @param {boolean} [options.replace] empty the container first (default: append)\n * @param {Function} [options.onChange] (doc) => void\n * @param {Function} [options.onExport] (html) => void\n * @returns {Object} handle with the editor's methods, `element`, and `destroy()`\n */\nfunction createEditor(target, options) {\n const o = options || {};\n const container = resolveTarget(target);\n const el = document.createElement('mailcraft-editor');\n\n Object.keys(ATTRS).forEach((key) => {\n if (o[key] == null) return;\n el.setAttribute(ATTRS[key], Array.isArray(o[key]) ? o[key].join(',') : String(o[key]));\n });\n\n // Before insertion: `toolbar` decides whether the header row is built at all,\n // and the providers are wanted by the first render, not one frame after it.\n if (o.toolbar !== undefined) el.toolbar = o.toolbar;\n PROPS.forEach((key) => { if (o[key] !== undefined) el[key] = o[key]; });\n\n const onChange = o.onChange ? (e) => o.onChange(e.detail) : null;\n const onExport = o.onExport ? (e) => o.onExport(e.detail) : null;\n if (onChange) el.addEventListener('change', onChange);\n if (onExport) el.addEventListener('export', onExport);\n\n // The element is `display: block; height: 100%`, so the container's height is\n // the editor's height. Left to the host's CSS unless `height` says otherwise --\n // guessing one here would silently override a layout that was already correct.\n if (o.replace) container.textContent = '';\n if (o.height) container.style.height = px(o.height);\n container.appendChild(el);\n\n // Applied last: this is an undoable edit, and it should land on an editor\n // that is already mounted and configured.\n if (typeof o.html === 'string' && o.html.trim()) el.loadTemplate({ name: o.name || '', html: o.html });\n\n const handle = {\n /** The underlying custom element -- everything the wrapper does not forward. */\n element: el,\n /** Removes the editor and detaches the listeners this call attached. Leaves anything else in the container alone. */\n destroy() {\n if (onChange) el.removeEventListener('change', onChange);\n if (onExport) el.removeEventListener('export', onExport);\n if (el.parentNode) el.parentNode.removeChild(el);\n },\n };\n METHODS.forEach((name) => { handle[name] = (...args) => el[name](...args); });\n\n return handle;\n}\n\n/** True once the element is registered -- the import above is what registers it, so this is a sanity check for hosts loading scripts out of order. */\nfunction isReady() {\n return typeof customElements !== 'undefined' && customElements.get('mailcraft-editor') === MailCraftEditor;\n}\n\nObject.assign(exports, { createEditor, isReady });\n\n};\n__modules[\"index.js\"] = function(module, exports, __require) {\nconst {MailCraftEditor} = __require(\"mailcraft-editor.js\");\r\nconst {createEditor, isReady} = __require(\"create-editor.js\");\r\nconst {EditorCore} = __require(\"core/editor-core.js\");\r\nconst {renderDoc} = __require(\"render/canvas.js\");\r\nconst {BLOCKS, GROUPS, LAYOUTS, PALETTE} = __require(\"core/blocks.js\");\r\nconst {createTranslator, defineMessages, missingKeys, LOCALES, isRtl, EN, MESSAGE_KEYS} = __require(\"core/i18n/index.js\");\r\nconst {LOCALE_TABLES} = __require(\"core/i18n/tables.js\");\r\nconst {ALL_FOLDER_ID, normalizeAsset, resolveLimits} = __require(\"core/storage.js\");\r\nconst {validateFiles, sanitizeName, acceptAttribute, limitsProblem} = __require(\"core/storage-limits.js\");\r\n\nObject.assign(exports, { MailCraftEditor, createEditor, isReady, EditorCore, renderDoc, BLOCKS, GROUPS, LAYOUTS, PALETTE, createTranslator, defineMessages, missingKeys, LOCALES, isRtl, EN, MESSAGE_KEYS, LOCALE_TABLES, ALL_FOLDER_ID, normalizeAsset, resolveLimits, validateFiles, sanitizeName, acceptAttribute, limitsProblem });\n\n};\n__modules[\"mailcraft-editor.js\"] = function(module, exports, __require) {\nconst {EditorCore, AI_GOALS, AI_TONES} = __require(\"core/editor-core.js\");\nconst {GROUPS, LAYOUTS, DEF, PALETTE} = __require(\"core/blocks.js\");\nconst {KB} = __require(\"core/assets.js\");\nconst {acceptAttribute} = __require(\"core/storage-limits.js\");\nconst {renderDoc} = __require(\"render/canvas.js\");\nconst {renderRte} = __require(\"render/rte.js\");\nconst {renderField, renderFieldCards, typeCommit} = __require(\"render/fields.js\");\nconst {icon} = __require(\"core/icons.js\");\nconst {TOKEN} = __require(\"core/variables.js\");\nconst {hl, cssUrl} = __require(\"core/sanitize.js\");\nconst {withFocusPreserved} = __require(\"render/focus-preserve.js\");\nconst {captureTemplatePng} = __require(\"render/screenshot.js\");\nconst {resolveToolbar, toolbarKey} = __require(\"core/toolbar.js\");\nconst {resolveFooter} = __require(\"core/footer.js\");\nconst {createStoryViewer} = __require(\"render/story.js\");\nconst {STYLE} = __require(\"render/style.js\");\nconst {createTranslator, isRtl} = __require(\"core/i18n/index.js\");\nconst {ACCENT_VARS, accentTokens, parseColor} = __require(\"core/accent.js\");\nconst {LOCALE_TABLES} = __require(\"core/i18n/tables.js\");\n\n/** `elS` mirrors the template's literal `style=\"...\"` attribute strings verbatim -- copied, not re-derived, to keep the port pixel-exact. */\nfunction elS(tag, styleStr, attrs = {}, ...children) {\n const node = document.createElement(tag);\n if (styleStr) node.style.cssText = styleStr;\n for (const [k, v] of Object.entries(attrs)) {\n if (v === undefined) continue;\n if (k === 'text') node.textContent = v;\n else if (k === 'html') node.innerHTML = v;\n else if (k === 'on') for (const [ev, fn] of Object.entries(v)) node.addEventListener(ev, fn);\n else node.setAttribute(k, v);\n }\n children.flat().forEach((c) => { if (c != null && c !== false) node.appendChild(typeof c === 'string' ? document.createTextNode(c) : c); });\n return node;\n}\n\n/** Built from `t` at render time (not a module-level const) since the active translator can change at runtime via `.messages`/`.locale`. Icon-only tabs: `label` carries the full name for aria-label/tooltip, `title` is the native-title fallback/hint. */\nfunction tabsFor(t) {\n return [\n { key: 'design', label: t('tab.design'), title: t('tab.designHint'), iconName: 'paint' },\n { key: 'blocks', label: t('tab.blocks'), title: t('tab.blocksHint'), iconName: 'grid' },\n { key: 'rows', label: t('tab.rows'), title: t('tab.rowsHint'), iconName: 'table' },\n { key: 'files', label: t('tab.files'), title: t('tab.filesHint'), iconName: 'image' },\n { key: 'layers', label: t('tab.layers'), title: t('tab.layersHint'), iconName: 'list' },\n { key: 'theme', label: t('tab.settings'), title: t('tab.settingsHint'), iconName: 'sliders' },\n { key: 'data', label: t('tab.data'), title: t('tab.dataHint'), iconName: 'data' },\n ];\n}\n\n/**\n * Appends a shared CSS-only tooltip bubble (`.mc-tooltip`, render/style.js) to\n * `node` and marks it `data-tip` so `:hover`/`:focus-visible`\n * on the node itself reveals it -- no JS show/hide logic. `dir` picks which\n * side it renders on ('down' for tabs/segments, 'up' for anything hugging the\n * bottom of the header). Also sets `aria-label` (icon-only controls have no\n * visible text) and keeps `title` as the native-tooltip fallback.\n */\nfunction tip(node, label, dir, align) {\n node.style.position = node.style.position || 'relative';\n node.setAttribute('data-tip', '1');\n if (!node.hasAttribute('aria-label')) node.setAttribute('aria-label', label);\n // The bubble replaces the native tooltip -- with `title` left on the node\n // both would pop on hover.\n node.removeAttribute('title');\n // align 'end' pins the bubble to the control's right edge instead of\n // centering it -- for controls hugging a right edge, where a centered\n // bubble would overflow its scroll container (see .mc-tooltip-end).\n const direction = dir || 'down';\n node.tipNode = elS('span', '', { class: `mc-tooltip mc-tooltip-${direction}${direction === 'down' ? ' mc-tab-tooltip' : ''}${align === 'end' ? ' mc-tooltip-end' : ''}`, text: label });\n node.appendChild(node.tipNode);\n return node;\n}\n\n/**\n * `<mailcraft-editor>` -- a pixel-faithful port of the MailCraft prototype to\n * a zero-dependency Web Component. Shadow DOM for isolation; no bundled\n * framework -- `core/editor-core.js` owns all state and logic (ported\n * near-verbatim from the original `Component` class), this file only builds\n * and re-builds DOM from it.\n *\n * Attributes: `variables`, `locale` (picks the shipped UI language\n * and, via `dir` defaulting, RTL), `dir`, `theme` (\"light\"/\"dark\" -- host-owned),\n * `ui-font` (a CSS font-family value; use \"inherit\" for the host app's font),\n * `accent` (the host's brand color -- a CSS color, `var(--your-token)`, or\n * \"inherit\" to read the host's `accent-color`; the whole accent token set is\n * derived from it, contrast-corrected per chrome),\n * chrome; while present the built-in toggle is hidden), `footer` (\"none\" to\n * remove the attribution strip, or any string to replace its text).\n * Properties: `.variables`, `.toolbar` (which parts of the top bar are shown),\n * `.aiProvider` (optional async fn, replaces the original's `window.claude.complete`),\n * `.iconProvider` (optional social-icon override), `.storageProvider` (host-supplied\n * file storage -- see `core/storage.js`), `.storageLimits` (host-set upload ceilings,\n * required whenever a provider is set), `.messages` (UI string overrides --\n * a host's own table, an imported locale from `core/i18n/`, or both merged via\n * `defineMessages`; see `core/i18n/index.js`).\n * Methods: `getContent()`, `setContent(doc)`, `importHtml(html)`, `exportHtml()`,\n * `loadTemplate(tpl)`, `screenshotPng()`\n * (full-template PNG as a Blob), `previewScreenshot()` (story-style viewer),\n * `downloadScreenshot()`, `copyScreenshot()`, `undo()`, `redo()`.\n * Events: `change` (detail: doc), `export` (detail: html string).\n */\n// `extends HTMLElement` is evaluated at module scope, so a bare\n// `import 'mailcraft-editor'` threw ReferenceError anywhere there is no DOM --\n// an SSR render pass, or a Node test runner reaching for a named export. The\n// stand-in keeps the module importable there; the element is only ever\n// constructed by the browser, which always has the real base class.\nconst ElementBase = typeof HTMLElement !== 'undefined' ? HTMLElement : class {};\n\nclass MailCraftEditor extends ElementBase {\n static get observedAttributes() { return ['variables', 'locale', 'dir', 'theme', 'ui-font', 'accent', 'toolbar', 'footer']; }\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n // Created here (not connectedCallback) so `.variables` and the document\n // work even before the element is inserted into the document -- a common pattern\n // (`document.createElement(...)`, configure, then append).\n this.core = new EditorCore({\n variables: this.hasAttribute('variables') ? this.getAttribute('variables') : undefined,\n });\n }\n\n connectedCallback() {\n this.buildShell();\n this.applyUiFont();\n this.applyAccent();\n this.applyDir();\n this._toolbarKey = toolbarKey(this.toolbarConfig());\n this.core.mount(this.shadowRoot);\n // After mount() on purpose: mount restores the persisted chrome/doc, and\n // a host-supplied `theme`/`locale` must win over what was persisted.\n this.applyTheme();\n this.refreshTranslator();\n this.core.mountKeyboard((target) => {\n const tag = (target && target.tagName || '').toLowerCase();\n return tag === 'input' || tag === 'textarea' || (target && target.isContentEditable);\n });\n this.core.onFormatChange = () => this.scheduleRteRefresh();\n this.core.onCodeSourceChange = () => this.refreshCodeSource();\n this.core.onSavedChange = () => this.refreshSavedLabel();\n this.core.onToast = () => this.refreshToast();\n this.core.onTick = () => this.refreshCountdowns();\n this.unsubscribe = this.core.subscribe(() => {\n withFocusPreserved(this.shadowRoot, () => this.render());\n this.dispatchEvent(new CustomEvent('change', { detail: this.core.state.doc }));\n });\n this.render();\n }\n\n disconnectedCallback() {\n this.unsubscribe?.();\n this.core.onFormatChange = null;\n this.core.onCodeSourceChange = null;\n this.core.onSavedChange = null;\n this.core.onToast = null;\n this.core.onTick = null;\n if (this._rteFrame != null) cancelAnimationFrame(this._rteFrame);\n this._rteFrame = null;\n this.core.unmount();\n }\n\n attributeChangedCallback(name, _old, value) {\n if (!this.core) return;\n if (name === 'variables') { this.core.variablesRaw = value; this.core.emit(); }\n if (name === 'locale' || name === 'dir') this.applyDir();\n if (name === 'locale') this.refreshTranslator();\n if (name === 'theme') this.applyTheme();\n if (name === 'ui-font') this.applyUiFont();\n // Forced: setting the attribute is also how a host asks for a re-derive\n // after its own `--token` changed -- see applyAccent.\n if (name === 'accent') this.applyAccent(true);\n if (name === 'toolbar') this.applyToolbar();\n if (name === 'footer') this.applyFooter();\n }\n\n /**\n * Editor-chrome typography only. The default lives in `--ed-font`; a host\n * may pass any valid CSS font-family string, or `inherit` to snapshot the\n * host element's computed family. Email-document typography remains owned\n * by the document theme and is deliberately unaffected.\n */\n applyUiFont() {\n if (!this.mc) return;\n const requested = (this.getAttribute('ui-font') || '').trim();\n if (!requested) {\n this.mc.style.removeProperty('--ed-font');\n return;\n }\n const resolved = requested.toLowerCase() === 'inherit'\n ? getComputedStyle(this).fontFamily\n : requested;\n this.mc.style.setProperty('--ed-font', resolved || 'inherit');\n }\n\n /**\n * Resolves the `accent` attribute to a plain color string. Three spellings,\n * because a host's brand color lives in a different place in each app:\n *\n * accent=\"#e11d48\" a literal color\n * accent=\"var(--brand)\" a design-system token, read off the host\n * element (custom properties inherit through\n * the shadow boundary, so the host's value is\n * the one that resolves), with the optional\n * `var(--brand, #fallback)` fallback honored\n * accent=\"inherit\" the host's computed `accent-color` -- the\n * standard CSS property for exactly this, so a\n * host that already sets it gets the editor for\n * free\n *\n * Returns '' when there is nothing usable, which leaves the built-in accent\n * in place rather than guessing.\n */\n resolveAccentValue(requested) {\n if (typeof getComputedStyle !== 'function') return requested;\n const hostStyle = getComputedStyle(this);\n if (requested.toLowerCase() === 'inherit') {\n const declared = (hostStyle.accentColor || '').trim();\n return !declared || declared === 'auto' ? '' : declared;\n }\n const ref = /^var\\(\\s*(--[\\w-]+)\\s*(?:,\\s*([^)]+))?\\)$/.exec(requested);\n if (!ref) return requested;\n return (hostStyle.getPropertyValue(ref[1]) || '').trim() || (ref[2] || '').trim();\n }\n\n /**\n * Host brand color for the editor chrome. One attribute drives all four\n * accent tokens (`core/accent.js` does the derivation) instead of asking a\n * host to hand-pick a hover shade, a legible ink color and a wash alpha --\n * and it re-derives per chrome, since the shade that reads on white panels\n * is not the one that reads on the dark ones.\n *\n * Applied as inline custom properties on `#mc`: the stylesheet declares the\n * defaults on that same element, so only an inline value can outrank them.\n * Email-document colors are untouched -- those belong to the template, not\n * to the app hosting the editor.\n *\n * `force` skips the memo. Nothing notifies an element that a CSS custom\n * property it reads has changed, so a host whose own `--brand` moved (a\n * brand switcher, a tenant theme) re-sets the attribute to the same string\n * to ask for a re-derive -- and the memo would otherwise swallow that.\n */\n applyAccent(force) {\n if (!this.mc) return;\n const requested = (this.getAttribute('accent') || '').trim();\n const chrome = this.core.state?.chrome || 'light';\n // Both halves matter: the same brand color resolves to different tokens in\n // light and dark chrome, so a toggle has to re-derive.\n const key = requested + '|' + chrome;\n if (!force && key === this._accentKey) return;\n this._accentKey = key;\n const clear = () => ACCENT_VARS.forEach((name) => this.mc.style.removeProperty(name));\n if (!requested) { clear(); return; }\n\n const value = this.resolveAccentValue(requested);\n // Named colors (\"rebeccapurple\") and anything else only a browser can\n // resolve go through a throwaway probe: set it as a color, read back what\n // the engine computed. Parsing first keeps the common case DOM-free.\n const color = parseColor(value) || parseColor(this.probeColor(value));\n if (!color) {\n clear();\n console.warn('[mailcraft] accent=\"' + requested + '\" is not a usable color -- keeping the built-in accent.');\n return;\n }\n const tokens = accentTokens(color, chrome);\n for (const [name, v] of Object.entries(tokens)) this.mc.style.setProperty(name, v);\n }\n\n /** Asks the engine what a color string computes to. Returns '' when there is no layout to ask (SSR, a test DOM) or the value was rejected. */\n probeColor(value) {\n if (!value || typeof getComputedStyle !== 'function' || typeof document === 'undefined') return '';\n const probe = document.createElement('span');\n probe.style.display = 'none';\n probe.style.color = value;\n // CSSOM drops a value it cannot parse, leaving `color` empty -- and a\n // probe with no color of its own computes to the *inherited* one, which\n // would sail through parseColor and repaint the chrome in --ed-text.\n if (!probe.style.color) return '';\n // A detached node computes to nothing in some engines -- park it inside\n // the shadow root, where it can neither be seen nor affect layout.\n this.mc.appendChild(probe);\n const computed = (getComputedStyle(probe).color || '').trim();\n probe.remove();\n return computed;\n }\n\n /**\n * Host-controlled chrome: a `theme` attribute (\"light\"/\"dark\") wins over\n * whatever chrome was persisted, and while it's present the built-in\n * light/dark toggle is hidden (see renderInner) -- the host owns the\n * control, so the two can never fight. Removing the attribute hands\n * control back to the built-in toggle.\n */\n applyTheme() {\n const v = this.getAttribute('theme');\n if (v) this.core.setState({ chrome: v === 'dark' ? 'dark' : 'light' });\n else if (this.core.state) this.core.emit();\n }\n\n /**\n * Resolves the `locale` attribute to its shipped message table\n * (core/i18n/tables.js) and overlays any host-set `.messages` on top --\n * attribute picks the language, `.messages` stays the documented way to\n * override individual strings. With no locale attribute this degrades to\n * the old behavior: `.messages` alone over built-in English.\n */\n refreshTranslator() {\n const table = LOCALE_TABLES[this.getAttribute('locale')] || null;\n const overrides = this.core.messages;\n this.core.t = createTranslator(table ? Object.assign({}, table, overrides || {}) : overrides);\n this.story?.retranslate();\n this.core.emit();\n }\n\n /** `dir` wins when the host sets it explicitly; otherwise it defaults from `isRtl(locale)` so `locale=\"ar\"` gets RTL for free. Applied directly to `#mc` (not full state, since it never affects rendered content, only the CSS `dir`). */\n applyDir() {\n if (!this.mc) return;\n const explicit = this.getAttribute('dir');\n this.mc.setAttribute('dir', explicit || (isRtl(this.getAttribute('locale')) ? 'rtl' : 'ltr'));\n }\n\n // ---- public API ----------------------------------------------------\n\n /**\n * Internal, and deliberately undocumented for hosts: the document object is\n * this package's own representation, not a format anyone else should have to\n * store, version or migrate. The host-facing contract is HTML in, HTML out\n * (`loadTemplate({ html })` / `exportHtml()`), and exported HTML is valid\n * input to the importer, so round-tripping through it is how a draft is\n * saved and restored.\n *\n * These stay because the editor needs them internally (undo, autosave, the\n * tests) and because a host that has genuinely outgrown HTML has somewhere\n * to go -- but nothing in README.md points here, and the shape is free to\n * change between versions.\n */\n getContent() { return JSON.parse(JSON.stringify(this.core.state.doc)); }\n setContent(doc) { this.core.loadDoc(doc); }\n /** Parses arbitrary HTML (a full email, a fragment, MailCraft's own exported output) into native blocks wherever the shape is recognizable, replacing the current document. See `core/import-html.js` for the per-shape rules. */\n importHtml(html) { return this.core.importHtml(html); }\n get variables() { return this.core.vars(); }\n set variables(value) { this.core.variablesRaw = value; this.core.emit(); }\n\n /**\n * Which parts of the editor's own top bar are shown -- `false` for no bar at\n * all, or an object switching individual parts off:\n *\n * editor.toolbar = false; // no bar\n * editor.toolbar = { logo: false, ai: false }; // keep the rest\n * <mailcraft-editor toolbar=\"none\"> // markup, no bar\n * <mailcraft-editor toolbar=\"undo,redo,export\"> // markup, only these\n *\n * Switchable parts: logo, status, device, undo, redo, theme, ai, code,\n * preview, export. Hiding a control does not remove the capability -- every\n * one of them is also a method here, so a host that renders its own bar\n * keeps all of it. Keyboard shortcuts are unaffected either way.\n *\n * The property wins over the attribute once set, the same way `.messages`\n * wins over `locale`.\n */\n get toolbar() { return this._toolbar !== undefined ? this._toolbar : (this.getAttribute('toolbar') || ''); }\n set toolbar(value) { this._toolbar = value; this.applyToolbar(); }\n\n /** The resolved `{ item: boolean }` map, or null when there is to be no bar. */\n toolbarConfig() { return resolveToolbar(this._toolbar !== undefined ? this._toolbar : this.getAttribute('toolbar')); }\n\n /**\n * Rebuilds the shell when, and only when, the resolved config actually\n * changed. The header is built once (it is not part of the per-state render\n * path), so switching a part on or off has to go through buildShell -- and\n * that also re-creates every modal and the story viewer, which is not\n * something to do on a set that changes nothing.\n */\n applyToolbar() {\n if (!this.core || !this.shadowRoot.firstChild) return;\n const key = toolbarKey(this.toolbarConfig());\n if (key === this._toolbarKey) return;\n this._toolbarKey = key;\n this.buildShell();\n this.applyUiFont();\n this.applyAccent();\n this.applyDir();\n this.applyTheme();\n this.render();\n }\n\n /**\n * The attribution strip: `false`/`\"none\"` removes it, a string replaces the\n * line, `{ text, href, target }` gives it a link. Unset shows the built-in\n * \"Powered by SELISE Blocks\" line, which follows `locale` and `.messages`\n * (key `footer.poweredBy`) like every other label. See core/footer.js.\n */\n get footer() { return this._footer !== undefined ? this._footer : (this.getAttribute('footer') || ''); }\n set footer(value) { this._footer = value; this.applyFooter(); }\n\n get uiFont() { return this.getAttribute('ui-font') || ''; }\n set uiFont(value) {\n if (value == null || String(value).trim() === '') this.removeAttribute('ui-font');\n else this.setAttribute('ui-font', String(value));\n }\n\n /** The host's brand color for the editor chrome -- a CSS color, `var(--your-token)`, or `inherit` (the host's `accent-color`). Setting '' or null hands the chrome back to the built-in accent. */\n get accent() { return this.getAttribute('accent') || ''; }\n set accent(value) {\n if (value == null || String(value).trim() === '') this.removeAttribute('accent');\n else this.setAttribute('accent', String(value));\n }\n\n get aiProvider() { return this.core.aiProvider; }\n set aiProvider(fn) { this.core.aiProvider = fn; }\n\n /** UI string overrides -- an overlay on the built-in English table (or whichever locale table the host also passed in), never a replacement, so a partial translation shows English where it's incomplete rather than a gap. Import a locale from `core/i18n/<tag>.js`, or merge one with your own overrides via `defineMessages` (`core/i18n/index.js`). */\n get messages() { return this.core.messages; }\n set messages(value) { this.core.messages = value; this.refreshTranslator(); }\n\n /** Optional `(platformKey, {label, size, color}) => Node` -- lets a host app supply its own social-icon art (e.g. brand SVGs) instead of the built-in set. Falls back to the built-in icon whenever it's unset, throws, or returns something that isn't a DOM node. */\n get iconProvider() { return this.core.iconProvider; }\n set iconProvider(fn) { this.core.iconProvider = fn; this.core.emit(); }\n\n /**\n * Host-supplied file storage -- see `core/storage.js` for the contract, and\n * README.md for a worked example. Setting one replaces the seeded demo\n * library with the backend's own: folders, paging,\n * upload and delete all go through it, and nothing is written to\n * localStorage. Set `null` to go back to the built-in behaviour.\n */\n get storageProvider() { return this.core.storageProvider; }\n set storageProvider(provider) { this.core.setStorageProvider(provider); }\n\n /**\n * What may be uploaded: `{ accept, maxBytes, maxWidth, maxHeight, maxFilesPerDrop, allowSvg }`.\n * Required alongside a provider and deliberately undefaulted -- the ceilings\n * that suit an email template depend on the sending platform, the audience's\n * mail clients and the host's own rules, none of which this package can know.\n * See `core/storage-limits.js`.\n */\n get storageLimits() { return this.core.storageLimits; }\n set storageLimits(limits) { this.core.setStorageLimits(limits); }\n\n /**\n * Applies one host-supplied template as an undoable edit. Template galleries\n * are host UI -- the editor has no tab for them and ships no catalogue --\n * so this is the whole seam: the host renders its own picker and pushes the\n * chosen template in. `tpl` carries one of three sources: `doc` (a document\n * object), `build()` (one made per use), or `html` (a raw email string, run\n * through the importer). `examples/templates/` holds ready-made HTML ones.\n * The other direction is `getContent()`, to capture the current document\n * back out as a template of the host's own.\n */\n loadTemplate(tpl) { this.core.loadTemplate(tpl); }\n\n exportHtml() {\n const html = this.core.buildHtml();\n this.dispatchEvent(new CustomEvent('export', { detail: html }));\n return html;\n }\n\n /** Full-template screenshot as a PNG Blob (2x resolution, desktop width, independent of the current device/zoom view). See render/screenshot.js for the technique and its limits. */\n screenshotPng() { return captureTemplatePng(this.core, this.mc); }\n\n /** Opens the story-style viewer over the editor and captures into it -- what the Screenshot button does. Nothing touches the filesystem until the user picks Download inside it. */\n previewScreenshot() { this.story.open(); }\n\n /** `screenshotPng()` plus the same save-a-file flow as the HTML export download, with success/failure toasts. Pass an already-captured blob (the story viewer does) to save that one instead of rendering a second time. */\n async downloadScreenshot(blob) {\n const t = this.core.t;\n try {\n const png = blob || await this.screenshotPng();\n const a = document.createElement('a');\n a.href = URL.createObjectURL(png);\n a.download = 'email.png';\n a.click();\n setTimeout(() => URL.revokeObjectURL(a.href), 1500);\n this.core.flash(t('toast.pngSaved'));\n } catch {\n this.core.flash(t('toast.pngFailed'));\n }\n }\n\n /** The screenshot onto the system clipboard as an image. Needs a secure context and `ClipboardItem`; where either is missing this reports the failure rather than appearing to succeed. */\n async copyScreenshot(blob) {\n const t = this.core.t;\n try {\n const png = blob || await this.screenshotPng();\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': png })]);\n this.core.flash(t('toast.pngCopied'));\n } catch {\n this.core.flash(t('toast.pngCopyFailed'));\n }\n }\n\n undo() { this.core.undo(); }\n redo() { this.core.redo(); }\n\n // ---- shell (built once) ---------------------------------------------\n\n buildShell() {\n const root = this.shadowRoot;\n root.innerHTML = '';\n root.appendChild(elS('style', '', { text: STYLE }));\n\n // A rebuild throws away the `#mc` that carried the inline accent tokens,\n // so the memo of what was last applied has to go with it.\n this._accentKey = null;\n this.mc = elS('div', 'height: 100%; padding: 16px; box-sizing: border-box; background: radial-gradient(circle at 8% 0%, var(--ed-soft), transparent 28%), var(--ed-bg); color: var(--ed-text); font-family: var(--ed-font); font-size: 14px; overflow-x: auto; overflow-y: hidden;', { id: 'mc' });\n root.appendChild(this.mc);\n\n const outer = elS('div', 'position: relative; height: 100%; min-width: 1180px;');\n this.mc.appendChild(outer);\n\n // Header nodes are re-created below (or not at all). Clearing them first\n // means a rebuild that drops the bar cannot leave the refreshers pointing\n // at detached nodes they would then keep writing to.\n this.savedLabel = this.savedDot = this.deviceSeg = null;\n this.undoBtn = this.redoBtn = this.chromeBtn = null;\n this.aiBtn = this.codeBtn = this.previewBtn = this.exportBtn = null;\n\n const bar = this.toolbarConfig();\n this.frame = elS('div', 'position: relative; height: 100%; border: 1px solid var(--ed-line-2); border-radius: var(--ed-radius); background: var(--ed-panel); display: grid; grid-template-rows: ' + (bar ? '54px minmax(0, 1fr)' : 'minmax(0, 1fr)') + '; overflow: hidden; box-shadow: var(--ed-shadow-sm), var(--ed-shadow-md);', { class: 'mc-shell' + (bar ? '' : ' mc-no-header') });\n outer.appendChild(this.frame);\n\n if (bar) this.frame.appendChild(this.buildHeader(bar));\n\n this.footerBar = this.footerText = this.footerLink = null;\n\n this.body = elS('div', 'display: grid; grid-template-columns: minmax(0, 1fr) 340px; grid-template-rows: minmax(0, 1fr) auto; min-height: 0;', { class: 'mc-layout' });\n this.frame.appendChild(this.body);\n this.body.appendChild(this.buildMain());\n this.body.appendChild(this.buildAside());\n this.body.appendChild(this.buildFooter());\n\n this.libraryModal = this.buildLibraryModal();\n this.exportModal = this.buildExportModal();\n this.codeModal = this.buildCodeModal();\n this.aiModal = this.buildAiModal();\n this.previewModal = this.buildPreviewModal();\n // Not a state-driven modal like the others: the story viewer is opened\n // imperatively and runs its own timers, so an editor re-render behind it\n // (an autosave, a toast) can never interrupt playback mid-screen.\n this.story = createStoryViewer(this.core, {\n capture: () => this.screenshotPng(),\n download: (blob) => this.downloadScreenshot(blob),\n copy: (blob) => this.copyScreenshot(blob),\n });\n this.toastEl = elS('div', \"position: absolute; bottom: 74px; left: 50%; transform: translateX(-50%); z-index: 80; background: var(--ed-text); color: var(--ed-bg); padding: 9px 16px; border-radius: var(--ed-radius-sm); font-family: ui-monospace, monospace; font-size: 10.5px; letter-spacing: 0.08em; box-shadow: var(--ed-shadow-md); animation: mcIn 0.18s ease; display: none;\", { class: 'mc-toast' });\n outer.append(this.libraryModal, this.exportModal, this.codeModal, this.aiModal, this.previewModal, this.story.node, this.toastEl);\n\n this.fileInput = elS('input', 'display: none;', { type: 'file', accept: 'image/*', multiple: 'true' });\n this.fileInput.addEventListener('change', (e) => { this.core.addFiles(e.target.files); e.target.value = ''; });\n outer.appendChild(this.fileInput);\n }\n\n // ---- header -----------------------------------------------------------\n\n buildHeader(on) {\n const t = this.core.t;\n const header = elS('header', \"display: flex; align-items: center; gap: 14px; padding: 0 16px; border-bottom: 1px solid var(--ed-line); background: linear-gradient(to bottom, var(--ed-panel), var(--ed-panel-2)); position: relative; z-index: 30;\", { class: 'mc-header' });\n\n const brandMark = elS('span', '', { class: 'mc-brand-mark' });\n const markSvg = icon('mailSpark', 20);\n markSvg.setAttribute('stroke-width', '1.8');\n brandMark.appendChild(markSvg);\n const brand = elS('div', 'display: flex; align-items: center; gap: 9px;');\n brand.append(\n brandMark,\n elS('span', 'font-family: var(--ed-font); font-weight: 600; font-size: 15px; letter-spacing: -0.01em; line-height: 1;', { text: 'MailCraft', class: 'mc-brand-name' }),\n );\n if (on.logo) header.append(brand, elS('div', 'width: 1px; height: 22px; background: var(--ed-line);'));\n\n this.savedLabel = elS('span', 'display: flex; align-items: center; gap: 6px; font-family: ui-monospace, monospace; font-size: 9.5px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ed-faint); white-space: nowrap;');\n // No infinite pulse: a forever-running animation keeps the compositor\n // producing frames while the editor is idle -- constant CPU on low-end\n // hardware for a decorative effect. A solid dot still reads \"autosave on\".\n this.savedDot = elS('span', 'width: 5px; height: 5px; border-radius: 50%; background: var(--ed-accent);');\n this.savedLabel.appendChild(this.savedDot);\n this.savedLabel.appendChild(document.createTextNode(''));\n if (on.status) header.appendChild(this.savedLabel);\n else this.savedLabel = this.savedDot = null;\n\n header.appendChild(elS('div', 'flex: 1;'));\n\n if (on.device) {\n this.deviceSeg = elS('div', '', { class: 'mc-segment mc-device-segment' });\n header.appendChild(this.deviceSeg);\n }\n\n const iconButtons = elS('div', 'display: flex; align-items: center; gap: 3px;');\n if (on.undo) this.undoBtn = this.iconBtn('undo', t('action.undoHint'), () => this.core.undo(), 'action.undoHint');\n if (on.redo) this.redoBtn = this.iconBtn('redo', t('action.redoHint'), () => this.core.redo(), 'action.redoHint');\n if (on.theme) this.chromeBtn = this.labelIconBtn('moon', t('action.chromeToDark'), t('action.chromeHint'), () => {\n const chrome = this.core.state.chrome === 'light' ? 'dark' : 'light';\n this.core.setState({ chrome }, () => this.core.persist(null, null, chrome));\n }, 'action.chromeHint');\n if (this.chromeBtn) {\n this.chromeBtn.i18nTipKey = this.core.state.chrome === 'light' ? 'action.chromeHintToDark' : 'action.chromeHintToLight';\n this.chromeBtn.tipNode.textContent = t(this.chromeBtn.i18nTipKey);\n }\n if (on.ai) this.aiBtn = this.labelIconBtn('spark', t('action.aiDraft'), t('action.aiDraftHint'), () => this.core.setState({ aiOpen: true }), 'action.aiDraftHint', 'action.aiDraft');\n if (on.code) this.codeBtn = this.labelIconBtn('code', t('action.code'), t('action.codeHint'), () => this.core.openCode(), 'action.codeHint', 'action.code');\n if (on.preview) this.previewBtn = this.labelIconBtn('eye', t('action.preview'), t('action.previewHint') || '', () => this.core.setState({ previewOpen: true }), 'action.previewHint', 'action.preview');\n if (on.export) this.exportBtn = this.labelIconBtn('download', t('action.export'), t('action.exportHint'), () => this.core.openExport(), 'action.exportHint', 'action.export');\n\n const actions = [this.undoBtn, this.redoBtn, this.chromeBtn, this.aiBtn, this.codeBtn, this.previewBtn, this.exportBtn].filter(Boolean);\n if (actions.length) {\n iconButtons.append(...actions);\n header.appendChild(iconButtons);\n }\n return header;\n }\n\n /** `titleKey` (when given) is written as `data-i18n-title` so `refreshStrings()` keeps the tooltip in sync with the active translator after `.messages` changes post-mount -- `title` itself only sets the initial value. */\n iconBtn(name, title, onClick, titleKey) {\n const btn = elS('button', 'border: 1px solid var(--ed-line); background: var(--ed-panel); color: var(--ed-text); cursor: pointer; width: 30px; height: 30px; display: flex; align-items: center; justify-content: center; transition: border-color 0.16s, background 0.16s;', { type: 'button', title, 'data-i18n-title': titleKey || undefined, class: 'mc-icon-button' });\n btn.appendChild(icon(name, 15));\n btn.addEventListener('mouseenter', () => { if (!btn.disabled) { btn.style.borderColor = 'var(--ed-accent)'; btn.style.background = 'var(--ed-soft)'; } });\n btn.addEventListener('mouseleave', () => { btn.style.borderColor = 'var(--ed-line)'; btn.style.background = 'var(--ed-panel)'; });\n btn.addEventListener('click', onClick);\n tip(btn, title, 'down');\n return btn;\n }\n\n /**\n * Always creates a real text node for the label (even if empty) and exposes it as `btn.labelNode`, so a caller that updates the label later never has to guess at `lastChild` -- guessing wrong there once already corrupted the chrome-toggle icon (its `lastChild` was the `<svg>`, and `.textContent = ...` on it wiped out the icon's paths).\n * `labelKey`/`titleKey` (when given) are stashed on the button itself (not as `data-i18n`, since a generic textContent sweep would wipe the icon the same way `lastChild` guessing used to) so `refreshStrings()` can target `labelNode`/`title` directly.\n */\n labelIconBtn(iconName, label, title, onClick, titleKey, labelKey) {\n const btn = elS('button', 'border: 1px solid var(--ed-line); background: var(--ed-panel); color: var(--ed-text); cursor: pointer; height: 30px; padding: 0 10px; display: flex; align-items: center; gap: 6px; font-family: ui-monospace, monospace; font-size: 9.5px; letter-spacing: 0.12em; text-transform: uppercase; transition: border-color 0.16s, background 0.16s;', { type: 'button', title, class: 'mc-icon-label' });\n btn.i18nTitleKey = titleKey || null;\n btn.i18nLabelKey = labelKey || null;\n if (iconName) {\n btn.iconNode = icon(iconName, 14);\n btn.iconName = iconName;\n btn.appendChild(btn.iconNode);\n }\n btn.labelNode = document.createTextNode(label || '');\n btn.appendChild(btn.labelNode);\n btn.addEventListener('mouseenter', () => { btn.style.borderColor = 'var(--ed-accent)'; btn.style.background = 'var(--ed-soft)'; });\n btn.addEventListener('mouseleave', () => { btn.style.borderColor = 'var(--ed-line)'; btn.style.background = 'var(--ed-panel)'; });\n btn.addEventListener('click', onClick);\n return tip(btn, title, 'down');\n }\n\n // ---- shared panel-design helpers (flat-accordion system) ----------------\n\n /**\n * Flat-accordion section chrome, identical to the Design/Settings tabs'\n * (render/fields.js renderFieldCards): a full-width uppercase bar and a\n * body directly on the panel surface. This replaced the floating white\n * cards on a gray gutter -- three panel languages across the tabs read as\n * three different products, and the card-in-card nesting was exactly the\n * boxes-in-boxes the inspector redesign removed. `right` (element or\n * string) sits flush right for counts/meta. The mc-section-* classes keep\n * these restylable panel-wide (render/style.js).\n */\n sectionBar(label, right) {\n const bar = elS('div', 'display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 11px 14px; background: var(--ed-panel-2); border-top: 1px solid var(--ed-line); border-bottom: 1px solid var(--ed-line); user-select: none;', { class: 'mc-section-bar' });\n bar.appendChild(elS('span', 'font-family: var(--ed-font); font-size: 10.5px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ed-muted);', { text: label, class: 'mc-section-label' }));\n if (right) bar.appendChild(typeof right === 'string' ? elS('span', 'font-size: 10px; font-weight: 600; color: var(--ed-faint); flex: none;', { text: right }) : right);\n return bar;\n }\n\n /** The section's content surface, matching renderFieldCards' body. */\n sectionBody(extraStyle) {\n return elS('div', 'padding: 12px 14px 16px; background: var(--ed-panel);' + (extraStyle || ''), { class: 'mc-section-body' });\n }\n\n /** Every non-field tab shares this shell: white panel to the bottom, sections stacked flush. */\n tabSurface() {\n return elS('div', 'background: var(--ed-panel); min-height: 100%; padding-bottom: 28px;', { class: 'mc-tab-surface' });\n }\n\n /** The soft accent action chip -- the panel's secondary button (field `btn` fields share the recipe in render/fields.js). */\n softBtn(label, iconName, onClick) {\n const btn = elS('button', 'width: 100%; border: 0; border-radius: 8px; background: var(--ed-soft); color: var(--ed-accent); cursor: pointer; padding: 8px 10px; display: flex; align-items: center; justify-content: center; gap: 6px; font-family: var(--ed-font); font-size: 11.5px; font-weight: 600; transition: background 0.16s, color 0.16s;', { type: 'button' });\n if (iconName) btn.appendChild(icon(iconName, 13));\n btn.appendChild(elS('span', '', { text: label }));\n btn.addEventListener('mouseenter', () => { btn.style.background = 'var(--ed-accent)'; btn.style.color = 'var(--ed-accent-ink)'; });\n btn.addEventListener('mouseleave', () => { btn.style.background = 'var(--ed-soft)'; btn.style.color = 'var(--ed-accent)'; });\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n /** Show/hide the toast -- driven surgically by core.onToast so its 1.9s\n * auto-dismissal never costs (or interrupts anything with) a full render. */\n refreshToast() {\n const s = this.core.state;\n this.toastEl.style.display = s.toast ? 'block' : 'none';\n this.toastEl.textContent = s.toast || '';\n }\n\n /** Repaint just the countdown digits on the canvas -- driven by the core's\n * 1s tick (core.onTick), which used to re-render the whole editor. */\n refreshCountdowns() {\n const now = this.core.state.now;\n this.canvasSlot.querySelectorAll('[data-mc-countdown]').forEach((wrap) => {\n const ms = Math.max(0, new Date(wrap.getAttribute('data-mc-countdown')).getTime() - now);\n const vals = { days: Math.floor(ms / 86400000), hrs: Math.floor(ms / 3600000) % 24, min: Math.floor(ms / 60000) % 60, sec: Math.floor(ms / 1000) % 60 };\n wrap.querySelectorAll('[data-mc-count]').forEach((n) => {\n n.textContent = String(vals[n.getAttribute('data-mc-count')] ?? 0).padStart(2, '0');\n });\n });\n }\n\n /** The header's \"Saved HH:MM\" label -- autosave updates it through\n * core.onSavedChange, surgically: it is the only thing autosave changes\n * on screen, and a full render for it destroyed open dropdowns. */\n refreshSavedLabel() {\n if (!this.savedLabel) return;\n const s = this.core.state; const t = this.core.t;\n this.savedLabel.lastChild.textContent = s.savedStatus === 'error' ? t('status.saveFailed')\n : s.savedStatus === 'saved' ? t('status.saved', { time: s.savedAt }) : t('status.autosaveOn');\n this.savedDot.style.background = s.savedStatus === 'error' ? 'var(--ed-danger)' : s.savedStatus === 'saved' ? 'var(--ed-success)' : 'var(--ed-accent)';\n this.savedLabel.style.color = s.savedStatus === 'error' ? 'var(--ed-danger)' : 'var(--ed-faint)';\n }\n\n /** Refresh only the floating rich-text toolbar after a caret/format change.\n * The editable block itself remains mounted, so native selection, IME,\n * pointer capture and scroll position stay untouched. */\n scheduleRteRefresh() {\n if (this._rteFrame != null) return;\n this._rteFrame = requestAnimationFrame(() => {\n this._rteFrame = null;\n if (this.core.rendering || !this.core.state.editing) return;\n const current = this.canvasSlot?.querySelector('[data-mc-rte=\"1\"]');\n const found = this.core.find(this.core.state.doc, this.core.state.editing);\n if (!current || !found.block) return;\n // Skip the rebuild when nothing the toolbar displays changed -- see\n // formatFingerprint (editor-core.js). A drag selection fires this every\n // frame, and rebuilding the toolbar each frame stuttered the selection.\n const print = this.core.formatFingerprint(found.block);\n if (print === this._rtePrint) return;\n this._rtePrint = print;\n current.replaceWith(renderRte(this.core, found.block));\n });\n }\n\n // ---- footer (attribution strip) -----------------------------------------\n\n /**\n * Built once with the rest of the shell, then only refreshed -- like the\n * header, it is not part of the state-driven render tree. Both a plain\n * `<span>` and an `<a>` are created up front and toggled in `refreshFooter`:\n * a host can add or drop a link at runtime, and swapping tag names mid-flight\n * would strand whichever node the previous render had left in place.\n */\n buildFooter() {\n this.footerBar = elS('div', 'display: flex; grid-column: 1; grid-row: 2; justify-self: center; align-items: center; justify-content: center; gap: 4px; max-width: calc(100% - 32px); padding: 6px 14px; border-top: 1px solid var(--ed-line); background: var(--ed-panel-2); color: var(--ed-panel-meta); font-family: var(--ed-font); font-size: var(--ed-panel-meta-size); letter-spacing: 0.06em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;', { class: 'mc-footer' });\n this.footerText = elS('span', '', { class: 'mc-footer-text' });\n this.footerLink = elS('a', 'color: inherit; text-decoration: none;', { class: 'mc-footer-link' });\n this.footerBar.appendChild(this.footerText);\n this.footerBar.appendChild(this.footerLink);\n return this.footerBar;\n }\n\n /** The resolved `{ text, href, target }`, or null when there is to be no strip. */\n footerConfig() { return resolveFooter(this._footer !== undefined ? this._footer : this.getAttribute('footer')); }\n\n /**\n * Text, link and visibility in one pass, run every render: it is three\n * property writes, and memoizing it would have to account for the\n * translator too -- the default line follows `locale`/`.messages`, so a\n * config-shaped memo would freeze the wrong string.\n */\n refreshFooter() {\n if (!this.footerBar) return;\n const cfg = this.footerConfig();\n if (!cfg) { this.footerBar.style.display = 'none'; return; }\n this.footerBar.style.display = 'flex';\n this.footerBar.style.width = (this.core.state.device === 'mobile' ? 375 : this.core.state.doc.theme.width) + 'px';\n\n const text = cfg.text == null ? this.core.t('footer.poweredBy') : cfg.text;\n const linked = !!cfg.href;\n this.footerText.style.display = linked ? 'none' : 'inline';\n this.footerLink.style.display = linked ? 'inline' : 'none';\n // The idle node is emptied, not just hidden: display:none still counts\n // toward textContent, and a stale line there would reach anything reading\n // the strip -- a screen reader's text pass included.\n this.footerText.textContent = linked ? '' : text;\n this.footerLink.textContent = linked ? text : '';\n if (linked) {\n this.footerLink.setAttribute('href', cfg.href);\n // A footer link leaves the editor, and the editor is embedded in the\n // host's page -- opening in place would take the user's unsaved work\n // with it. `rel` goes with the new tab, not as an afterthought.\n this.footerLink.setAttribute('target', cfg.target || '_blank');\n this.footerLink.setAttribute('rel', 'noopener noreferrer');\n }\n }\n\n /** Re-reads the config after an attribute or property change. Never rebuilds: the strip is one node whose contents are cheap to rewrite. */\n applyFooter() { this.refreshFooter(); }\n\n // ---- main (canvas) ------------------------------------------------------\n\n buildMain() {\n const main = elS('main', '', { class: 'mc-workspace' });\n this.mainEl = main;\n main.style.cssText = 'grid-column: 1; grid-row: 1; position: relative; overflow-y: auto; min-height: 0;';\n main.addEventListener('click', () => { if (this.core.state.sel) this.core.setState({ sel: null }); });\n\n const pad = elS('div', 'padding: 28px 40px 150px; display: flex; justify-content: center;', { class: 'mc-canvas-stage' });\n this.zoomFrame = elS('div', 'position: relative; transform-origin: top center; transition: transform 0.22s cubic-bezier(0.22,0.61,0.36,1);');\n this.canvasSlot = elS('div', '', { class: 'mc-sheet-wrap' });\n this.zoomFrame.appendChild(this.canvasSlot);\n pad.appendChild(this.zoomFrame);\n main.appendChild(pad);\n\n const dock = elS('div', 'position: sticky; bottom: 0; display: flex; justify-content: center; pointer-events: none; padding-bottom: 16px;');\n const pill = elS('div', 'pointer-events: auto; display: flex; align-items: center; gap: 12px; border: 1px solid var(--ed-line-2); border-radius: var(--ed-radius); background: var(--ed-panel); padding: 6px 8px 6px 12px; box-shadow: var(--ed-shadow-md);', { class: 'mc-zoom' });\n this.canvasMetaEl = elS('span', 'font-family: ui-monospace, monospace; font-size: 9.5px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ed-faint); white-space: nowrap;');\n this.zoomSeg = elS('div', 'display: flex; gap: 1px;');\n pill.append(this.canvasMetaEl, elS('span', 'width: 1px; height: 18px; background: var(--ed-line);'), this.zoomSeg);\n dock.appendChild(pill);\n main.appendChild(dock);\n return main;\n }\n\n // ---- aside (tabbed inspector) -------------------------------------------\n\n buildAside() {\n const aside = elS('aside', 'grid-column: 2; grid-row: 1 / span 2; border-left: 1px solid var(--ed-line); background: var(--ed-panel); display: grid; grid-template-rows: auto 1fr; min-height: 0;', { class: 'mc-inspector' });\n this.tabBar = elS('div', 'display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr);', { class: 'mc-tabbar', role: 'tablist' });\n aside.appendChild(this.tabBar);\n // overflow-x hidden: `overflow-y: auto` alone computes overflow-x to\n // auto, so anything a pixel too wide (a tooltip's hidden box, a long\n // unbreakable value) grew a horizontal scrollbar under the panel.\n this.tabBody = elS('div', 'overflow-y: auto; overflow-x: hidden; min-height: 0;');\n aside.appendChild(this.tabBody);\n return aside;\n }\n\n // ---- per-state render ---------------------------------------------------\n\n render() {\n // The RTE-edited block's own props (e.g. `props.html`) only update on\n // blur (see `blockCtx.onBlur`, canvas.js) -- that's what lets typing stay\n // fast (no per-keystroke commit/undo-history entry). But a render still\n // rebuilds that block's DOM node from `props.html` regardless, and\n // renders can happen while an edit is active (for example when another\n // editor control changes) -- so without syncing first, the next\n // keystroke's re-render would blow away whatever was just typed, reverting\n // it to the last-committed (pre-edit) value. Sync copies the live,\n // uncommitted DOM content into the model right before the rebuild reads\n // it -- a plain mutation, not `setProp`, so it doesn't push an undo entry.\n this.syncLiveEdit();\n // Marks the canvas rebuild below so `blockCtx.onBlur` (canvas.js) can tell\n // a real blur apart from the spurious one fired when this method removes\n // the still-focused block node while tearing down `canvasSlot`.\n this.core.rendering = true;\n // The full render below rebuilds the RTE toolbar on its own path, so the\n // fingerprint that lets scheduleRteRefresh skip no-op rebuilds is stale.\n this._rtePrint = null;\n // The workspace <main> and the inspector tab body are the two scroll\n // containers that survive a render (built once in buildShell) -- but the\n // rebuild below can still zero them: if anything forces synchronous\n // layout while a slot sits momentarily empty, the container's\n // scrollHeight collapses and the browser clamps its scrollTop to 0, and\n // re-appending the new tree never scrolls back. On a long template that\n // read as \"click a text block (or touch the RTE at all) and the canvas\n // yanks to the top\". Snapshot both here and put them back once the new\n // tree is in place -- focus restoration (focus-preserve.js) already uses\n // `preventScroll`, so nothing later in the same render fights this.\n const mainTop = this.mainEl ? this.mainEl.scrollTop : 0;\n const mainLeft = this.mainEl ? this.mainEl.scrollLeft : 0;\n const tabBefore = this._renderedTab;\n const tabTop = this.tabBody ? this.tabBody.scrollTop : 0;\n try {\n this.renderInner();\n } finally {\n this.core.rendering = false;\n }\n if (this.mainEl) {\n if (this.mainEl.scrollTop !== mainTop) this.mainEl.scrollTop = mainTop;\n if (this.mainEl.scrollLeft !== mainLeft) this.mainEl.scrollLeft = mainLeft;\n }\n // A genuine tab switch should start at the top -- only same-tab rebuilds\n // (e.g. per-keystroke commits from a Design-tab field) restore.\n if (this.tabBody && this.core.state.tab === tabBefore && this.tabBody.scrollTop !== tabTop) this.tabBody.scrollTop = tabTop;\n this._renderedTab = this.core.state.tab;\n }\n\n syncLiveEdit() {\n const c = this.core;\n if (!c.state.editing || !c.editEl || !c.editEl.isConnected || !c.editKey) return;\n const found = c.find(c.state.doc, c.state.editing);\n if (!found.block) return;\n const val = c.editPlain ? c.editEl.textContent : c.editEl.innerHTML;\n if (val !== found.block.props[c.editKey]) found.block.props[c.editKey] = val;\n }\n\n /** Refreshes every static header/modal string tagged `data-i18n*` at build time, plus the handful of labelIconBtn buttons whose label lives in a `labelNode` text node (a generic textContent sweep would wipe their icon -- see `labelIconBtn`'s doc comment). Runs every render (cheap: property assignments only, no rebuild) so a `.messages`/`.locale` change after mount relabels chrome that was only ever built once. */\n refreshStrings() {\n const t = this.core.t;\n const root = this.shadowRoot;\n root.querySelectorAll('[data-i18n]').forEach((el) => { el.textContent = t(el.getAttribute('data-i18n')); });\n root.querySelectorAll('[data-i18n-title]').forEach((el) => { el.title = t(el.getAttribute('data-i18n-title')); });\n root.querySelectorAll('[data-i18n-placeholder]').forEach((el) => { el.placeholder = t(el.getAttribute('data-i18n-placeholder')); });\n [this.aiBtn, this.codeBtn, this.previewBtn, this.exportBtn].forEach((btn) => {\n if (!btn) return;\n if (btn.i18nTitleKey) btn.title = t(btn.i18nTitleKey);\n if (btn.i18nLabelKey) btn.labelNode.textContent = t(btn.i18nLabelKey);\n if (btn.i18nTitleKey && btn.tipNode) btn.tipNode.textContent = t(btn.i18nTitleKey);\n });\n if (this.chromeBtn?.i18nTitleKey) this.chromeBtn.title = t(this.chromeBtn.i18nTitleKey);\n }\n\n renderInner() {\n const s = this.core.state;\n const t = this.core.t;\n this.refreshStrings();\n\n this.mc.dataset.chrome = s.chrome;\n // Re-derives only when the brand color or the chrome actually changed --\n // the accent that clears contrast on white panels is not the one that\n // clears it on the dark palette.\n this.applyAccent();\n this.refreshFooter();\n this.refreshSavedLabel();\n\n if (this.undoBtn) this.undoBtn.disabled = !s.history.length;\n if (this.redoBtn) this.redoBtn.disabled = !s.future.length;\n // A host-supplied `theme` attribute owns light/dark (see applyTheme) --\n // hide the built-in toggle rather than let it fight the host's control.\n if (this.chromeBtn) {\n this.chromeBtn.style.display = this.hasAttribute('theme') ? 'none' : 'flex';\n this.chromeBtn.labelNode.textContent = s.chrome === 'light' ? t('action.chromeToDark') : t('action.chromeToLight');\n this.chromeBtn.i18nTipKey = s.chrome === 'light' ? 'action.chromeHintToDark' : 'action.chromeHintToLight';\n this.chromeBtn.tipNode.textContent = t(this.chromeBtn.i18nTipKey);\n this.chromeBtn.setAttribute('aria-label', t(this.chromeBtn.i18nTipKey));\n this.chromeBtn.title = t(this.chromeBtn.i18nTipKey);\n const chromeIcon = s.chrome === 'light' ? 'moon' : 'sun';\n if (this.chromeBtn.iconName !== chromeIcon) {\n const nextIcon = icon(chromeIcon, 14);\n this.chromeBtn.iconNode.replaceWith(nextIcon);\n this.chromeBtn.iconNode = nextIcon;\n this.chromeBtn.iconName = chromeIcon;\n }\n }\n\n this.renderDeviceSeg();\n this.renderZoomSeg();\n\n this.zoomFrame.style.transform = `scale(${s.zoom})`;\n // Build the new canvas tree *before* detaching the old one, and swap the\n // two atomically (`replaceChildren` evaluates its argument first): while\n // a block is being edited, `renderDoc` builds the RTE toolbar mid-tree,\n // and its `document.queryCommandState` calls force a synchronous layout.\n // With the previous `innerHTML = ''`-then-append order, that layout ran\n // while the slot was empty -- the workspace's scrollHeight collapsed for\n // an instant and the browser clamped its scrollTop to 0, which is what\n // scrolled a long template to the top on every RTE interaction.\n this.canvasSlot.replaceChildren(renderDoc(this.core, true));\n\n const blockCount = s.doc.rows.reduce((n, r) => n + r.cols.reduce((m, c) => m + c.blocks.length, 0), 0);\n this.canvasMetaEl.textContent = t('canvas.meta', { rows: s.doc.rows.length, blocks: blockCount, width: s.device === 'mobile' ? 375 : s.doc.theme.width });\n\n this.renderTabs();\n this.renderTabBody();\n\n this.renderLibraryModal();\n this.renderExportModal();\n this.renderCodeModal();\n this.renderAiModal();\n this.renderPreviewModal(false);\n\n this.refreshToast();\n }\n\n segBg(on) { return on ? 'var(--ed-accent)' : 'transparent'; }\n segFg(on) { return on ? 'var(--ed-accent-ink)' : 'var(--ed-muted)'; }\n\n renderDeviceSeg() {\n if (!this.deviceSeg) return;\n const s = this.core.state;\n const t = this.core.t;\n this.deviceSeg.innerHTML = '';\n [\n { label: t('device.desktop'), title: t('device.desktopHint'), v: 'desktop', iconName: 'monitor' },\n { label: t('device.mobile'), title: t('device.mobileHint'), v: 'mobile', iconName: 'phone' },\n ].forEach((d) => {\n const on = s.device === d.v;\n const btn = elS('button', `width: 32px; height: 26px; display: flex; align-items: center; justify-content: center; background: ${this.segBg(on)}; color: ${this.segFg(on)}; transition: background 0.16s, color 0.16s;`, { type: 'button', title: d.title, 'aria-pressed': String(on) });\n btn.appendChild(icon(d.iconName, 15));\n btn.addEventListener('mouseenter', () => { if (!on) { btn.style.background = 'var(--ed-soft)'; btn.style.color = 'var(--ed-accent)'; } else { btn.style.background = 'var(--ed-accent-strong)'; } });\n btn.addEventListener('mouseleave', () => { btn.style.background = this.segBg(on); btn.style.color = this.segFg(on); });\n btn.addEventListener('click', () => this.core.setState({ device: d.v }));\n tip(btn, d.label, 'down');\n this.deviceSeg.appendChild(btn);\n });\n }\n\n renderZoomSeg() {\n const s = this.core.state;\n this.zoomSeg.innerHTML = '';\n [0.75, 1, 1.25].forEach((z) => {\n const on = s.zoom === z;\n const btn = elS('button', `border: 0; border-radius: 7px; cursor: pointer; background: ${this.segBg(on)}; color: ${this.segFg(on)}; font-family: var(--ed-font); font-size: 10px; font-weight: 600; padding: 5px 9px; transition: background 0.16s, color 0.16s;`, { type: 'button', text: `${Math.round(z * 100)}%`, 'aria-pressed': String(on) });\n btn.addEventListener('click', () => this.core.setState({ zoom: z }));\n this.zoomSeg.appendChild(btn);\n });\n }\n\n renderTabs() {\n const s = this.core.state;\n this.tabBar.innerHTML = '';\n tabsFor(this.core.t).forEach((tabDef) => {\n const on = s.tab === tabDef.key;\n const btn = elS('button', `border: 0; border-radius: 8px 8px 0 0; border-bottom: 2px solid ${on ? 'var(--ed-accent)' : 'transparent'}; background: ${on ? 'var(--ed-panel)' : 'transparent'}; color: ${on ? 'var(--ed-accent)' : 'var(--ed-muted)'}; cursor: pointer; height: 39px; display: flex; align-items: center; justify-content: center; transition: color 0.16s, background 0.16s;`, { type: 'button', title: tabDef.title, role: 'tab', 'aria-selected': String(on) });\n btn.appendChild(icon(tabDef.iconName, 16));\n btn.addEventListener('mouseenter', () => { if (!on) { btn.style.color = 'var(--ed-accent)'; btn.style.background = 'var(--ed-soft)'; } });\n btn.addEventListener('mouseleave', () => { btn.style.color = on ? 'var(--ed-accent)' : 'var(--ed-muted)'; btn.style.background = on ? 'var(--ed-panel)' : 'transparent'; });\n btn.addEventListener('click', () => this.core.setState({ tab: tabDef.key }));\n tip(btn, tabDef.label, 'down');\n this.tabBar.appendChild(btn);\n });\n }\n\n renderTabBody() {\n this.tabBody.innerHTML = '';\n const tab = this.core.state.tab;\n if (tab === 'design') this.tabBody.appendChild(this.renderDesignTab());\n else if (tab === 'blocks') this.tabBody.appendChild(this.renderBlocksTab());\n else if (tab === 'rows') this.tabBody.appendChild(this.renderRowsTab());\n else if (tab === 'files') this.tabBody.appendChild(this.renderFilesTab());\n else if (tab === 'layers') this.tabBody.appendChild(this.renderLayersTab());\n else if (tab === 'theme') this.tabBody.appendChild(this.renderThemeTab());\n else if (tab === 'data') this.tabBody.appendChild(this.renderDataTab());\n }\n\n // ---- Design tab ----------------------------------------------------------\n\n renderDesignTab() {\n const s = this.core.state;\n const t = this.core.t;\n const selO = this.core.selObj();\n // min-height so the workspace-toned body paints to the bottom of the\n // panel even when the field list is short (tabBody gives the 100%).\n const wrap = elS('div', 'min-height: 100%; display: flex; flex-direction: column;', { class: 'mc-tab-surface mc-design-panel' });\n // \"Card groups\" inspector (the design direction the user picked): the\n // sticky header carries a block-type icon chip; the body sits on the\n // workspace tone with each property group rendered as a white card\n // (renderFieldCards, render/fields.js).\n const head = elS('div', 'padding: 12px 14px; border-bottom: 1px solid var(--ed-line); display: flex; align-items: center; gap: 10px; position: sticky; top: 0; background: var(--ed-panel); z-index: 5;', { class: 'mc-inspector-head' });\n if (s.sel) {\n const chip = elS('div', 'width: 36px; height: 36px; flex: none; border-radius: 10px; background: var(--ed-soft); color: var(--ed-accent); display: flex; align-items: center; justify-content: center;');\n chip.appendChild(icon(selO.block ? selO.block.type : 'product', 18));\n head.appendChild(chip);\n }\n const headText = elS('div', 'flex: 1; min-width: 0;');\n headText.append(\n elS('div', 'font-family: var(--ed-font); font-weight: 600; font-size: 15px; line-height: 1.2;', { text: selO.block ? DEF(selO.block.type).label : (selO.row ? t('inspector.sectionLabel') : t('inspector.nothingSelected')) }),\n elS('div', 'font-size: 11px; color: var(--ed-muted); margin-top: 1px;', { text: selO.block ? t('inspector.blockProperties') : (selO.row ? t('inspector.sectionProperties') : t('inspector.title')) }),\n );\n head.appendChild(headText);\n if (s.sel) {\n const actions = elS('div', 'display: flex; gap: 4px;');\n const dup = elS('button', 'border: 0; border-radius: 8px; background: var(--ed-panel-2); color: var(--ed-muted); cursor: pointer; width: 30px; height: 30px; display: flex; align-items: center; justify-content: center; transition: background 0.16s, color 0.16s;', { type: 'button', title: t('action.duplicateHint'), class: 'mc-icon-button' });\n dup.appendChild(icon('copy', 14));\n dup.addEventListener('mouseenter', () => { dup.style.background = 'var(--ed-soft)'; dup.style.color = 'var(--ed-accent)'; });\n dup.addEventListener('mouseleave', () => { dup.style.background = 'var(--ed-panel-2)'; dup.style.color = 'var(--ed-muted)'; });\n dup.addEventListener('click', () => this.core.dupSel());\n tip(dup, t('action.duplicateHint'), 'down', 'end');\n const del = elS('button', 'border: 0; border-radius: 8px; background: var(--ed-danger-soft); color: var(--ed-danger); cursor: pointer; width: 30px; height: 30px; display: flex; align-items: center; justify-content: center; transition: filter 0.16s;', { type: 'button', title: t('action.deleteHint'), class: 'mc-icon-button' });\n del.appendChild(icon('trash', 14));\n del.addEventListener('mouseenter', () => { del.style.filter = 'brightness(0.94)'; });\n del.addEventListener('mouseleave', () => { del.style.filter = ''; });\n del.addEventListener('click', () => this.core.delSel());\n tip(del, t('action.deleteHint'), 'down', 'end');\n actions.append(dup, del);\n head.appendChild(actions);\n }\n wrap.appendChild(head);\n\n // Flat accordion surface (Beefree-style): the fields render straight on\n // the panel with full-width section bars -- no workspace-toned gutter,\n // no floating cards.\n const body = elS('div', 'background: var(--ed-panel); flex: 1; padding-bottom: 28px;', { class: 'mc-panel-content' });\n if (!s.sel) {\n const empty = elS('div', 'margin: 12px 14px; background: var(--ed-panel); border: 1px solid var(--ed-line); border-radius: 12px; padding: 14px; font-size: 12.5px; color: var(--ed-muted); line-height: 1.6;');\n const p = elS('p', 'margin: 0 0 14px;');\n p.innerHTML = t('inspector.emptyBody');\n empty.appendChild(p);\n const box = elS('div', 'position: relative; border: 1px solid var(--ed-line); border-radius: 10px; padding: 12px;', { class: 'mc-shortcuts' });\n box.appendChild(elS('div', 'font-family: var(--ed-font); font-size: 10px; font-weight: 700; letter-spacing: 0.09em; text-transform: uppercase; color: var(--ed-muted); margin-bottom: 8px;', { text: t('inspector.shortcuts') }));\n const grid = elS('div', 'display: grid; gap: 5px; font-family: ui-monospace, monospace; font-size: 10.5px; color: var(--ed-muted);');\n [t('shortcut.undoRedo'), t('shortcut.duplicate'), t('shortcut.delete'), t('shortcut.export'), t('shortcut.escape')].forEach((txt) => grid.appendChild(elS('div', '', { text: txt })));\n box.appendChild(grid);\n empty.appendChild(box);\n body.appendChild(empty);\n }\n const fields = this.core.fields().concat(this.core.boxFields());\n renderFieldCards(body, fields);\n wrap.appendChild(body);\n return wrap;\n }\n\n // ---- Blocks tab ------------------------------------------------------\n\n renderBlocksTab() {\n const t = this.core.t;\n const wrap = this.tabSurface();\n wrap.appendChild(this.sectionBar(t('blocks.dragHint'), t('blocks.count', { count: PALETTE.length })));\n const body = this.sectionBody();\n\n const grid = elS('div', 'display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px;');\n paletteTiles(this.core).forEach((tile) => {\n const cell = elS('div', 'border: 1px solid var(--ed-line); border-radius: 10px; background: var(--ed-panel-2); cursor: grab; padding: 11px 4px 8px; display: flex; flex-direction: column; align-items: center; gap: 7px; user-select: none; transition: border-color 0.16s, transform 0.16s, background 0.16s, box-shadow 0.16s;', { draggable: 'true', title: tile.hint });\n const applyHover = () => { cell.style.borderColor = 'var(--ed-accent)'; cell.style.background = 'var(--ed-soft)'; cell.style.transform = 'translateY(-2px)'; cell.style.boxShadow = 'var(--ed-shadow-sm)'; };\n cell.addEventListener('mouseenter', applyHover);\n cell.addEventListener('mouseleave', () => { cell.style.borderColor = 'var(--ed-line)'; cell.style.background = 'var(--ed-panel-2)'; cell.style.transform = ''; cell.style.boxShadow = ''; });\n cell.addEventListener('mousedown', () => { cell.style.cursor = 'grabbing'; cell.style.transform = ''; });\n cell.addEventListener('mouseup', () => { cell.style.cursor = 'grab'; applyHover(); });\n cell.addEventListener('dragstart', tile.onDragStart);\n cell.addEventListener('dragend', () => { this.core.drag = null; this.core.setState({ drop: null, rowDrop: null }); });\n cell.addEventListener('dblclick', tile.onAdd);\n const iconSpan = elS('span', 'color: var(--ed-accent); display: block;');\n iconSpan.appendChild(tile.icon());\n cell.appendChild(iconSpan);\n cell.appendChild(elS('span', 'font-size: 10.5px; color: var(--ed-muted); text-align: center; line-height: 1.2;', { text: tile.label }));\n grid.appendChild(cell);\n });\n body.appendChild(grid);\n wrap.appendChild(body);\n return wrap;\n }\n\n // ---- Rows tab --------------------------------------------------------\n\n renderRowsTab() {\n const s = this.core.state;\n const t = this.core.t;\n const wrap = this.tabSurface();\n wrap.appendChild(this.sectionBar(t('rows.sectionLayouts')));\n const layoutBody = this.sectionBody();\n\n const grid = elS('div', 'display: grid; gap: 6px;');\n LAYOUTS.forEach((l) => {\n const cell = elS('div', 'border: 1px solid var(--ed-line); border-radius: 9px; background: var(--ed-panel-2); cursor: grab; padding: 10px; display: flex; align-items: center; gap: 12px; user-select: none; transition: border-color 0.16s, background 0.16s;', { draggable: 'true' });\n cell.addEventListener('mouseenter', () => { cell.style.borderColor = 'var(--ed-accent)'; cell.style.background = 'var(--ed-soft)'; });\n cell.addEventListener('mouseleave', () => { cell.style.borderColor = 'var(--ed-line)'; cell.style.background = 'var(--ed-panel-2)'; });\n cell.addEventListener('dragstart', this.core.startDrag({ kind: 'row', spans: l.spans }));\n cell.addEventListener('dragend', () => { this.core.drag = null; this.core.setState({ drop: null, rowDrop: null }); });\n cell.addEventListener('dblclick', () => this.core.insertRow(l.spans, s.doc.rows.length));\n const cellsWrap = elS('div', 'display: flex; gap: 3px; flex: 1; height: 26px;');\n l.spans.forEach((sp) => cellsWrap.appendChild(elS('div', `flex: ${sp}; border: 1px solid var(--ed-line-2); background: repeating-linear-gradient(45deg, transparent, transparent 4px, var(--ed-line) 4px, var(--ed-line) 5px);`)));\n cell.append(cellsWrap, elS('span', 'font-family: ui-monospace, monospace; font-size: 10px; color: var(--ed-muted); white-space: nowrap;', { text: l.label }));\n grid.appendChild(cell);\n });\n layoutBody.appendChild(grid);\n wrap.appendChild(layoutBody);\n\n wrap.appendChild(this.sectionBar(t('rows.customMarkup')));\n const markupBody = this.sectionBody();\n const htmlRow = elS('div', 'border: 1px solid var(--ed-line); border-radius: 9px; background: var(--ed-panel-2); cursor: grab; padding: 11px 12px; display: flex; align-items: center; gap: 11px; user-select: none; transition: border-color 0.16s, background 0.16s;', { draggable: 'true', title: t('rows.htmlRowHint') });\n htmlRow.addEventListener('mouseenter', () => { htmlRow.style.borderColor = 'var(--ed-accent)'; htmlRow.style.background = 'var(--ed-soft)'; });\n htmlRow.addEventListener('mouseleave', () => { htmlRow.style.borderColor = 'var(--ed-line)'; htmlRow.style.background = 'var(--ed-panel-2)'; });\n htmlRow.addEventListener('dragstart', this.core.startDrag({ kind: 'row', spans: [100], html: true }));\n htmlRow.addEventListener('dragend', () => { this.core.drag = null; this.core.setState({ drop: null, rowDrop: null }); });\n htmlRow.addEventListener('click', () => this.core.insertRow([100], s.doc.rows.length, true));\n const htmlIcon = elS('span', 'color: var(--ed-accent); display: block;');\n htmlIcon.appendChild(icon('code', 20));\n const htmlText = elS('span', 'flex: 1;');\n htmlText.append(\n elS('span', 'display: block; font-family: var(--ed-font); font-weight: 600; font-size: 13px; line-height: 1.2;', { text: t('rows.rawHtmlSection') }),\n elS('span', 'display: block; font-size: 11px; color: var(--ed-muted); line-height: 1.4;', { text: t('rows.rawHtmlDesc') }),\n );\n htmlRow.append(htmlIcon, htmlText);\n markupBody.appendChild(htmlRow);\n wrap.appendChild(markupBody);\n\n wrap.appendChild(this.sectionBar(t('rows.canvasModel')));\n const modelBody = this.sectionBody();\n const modeSeg = elS('div', '', { class: 'mc-segment' });\n [{ label: t('rows.modeRowBased'), v: 'rows' }, { label: t('rows.modeFreeStack'), v: 'stack' }].forEach((m) => {\n const on = s.mode === m.v;\n const btn = elS('button', `flex: 1; background: ${this.segBg(on)}; color: ${this.segFg(on)}; font-family: var(--ed-font); font-size: 10px; font-weight: 600; padding: 8px 4px; transition: background 0.16s, color 0.16s;`, { type: 'button', text: m.label, 'aria-pressed': String(on) });\n btn.addEventListener('click', () => this.core.setState({ mode: m.v }));\n modeSeg.appendChild(btn);\n });\n modelBody.appendChild(modeSeg);\n const hint = s.mode === 'rows' ? t('rows.hintRows') : t('rows.hintStack');\n modelBody.appendChild(elS('p', 'margin: 10px 0 0; font-size: 11.5px; color: var(--ed-muted); line-height: 1.55;', { text: hint }));\n wrap.appendChild(modelBody);\n return wrap;\n }\n\n // ---- Files tab -------------------------------------------------------\n\n renderFilesTab() {\n const s = this.core.state;\n const t = this.core.t;\n const wrap = this.tabSurface();\n wrap.appendChild(this.sectionBar(t('files.libraryCount', { count: s.assets.length })));\n const body = this.sectionBody();\n const openBtn = elS('button', 'width: 100%; border: 0; border-radius: 8px; background: var(--ed-accent); color: var(--ed-accent-ink); cursor: pointer; padding: 9px 12px; display: flex; align-items: center; justify-content: center; gap: 7px; font-family: var(--ed-font); font-weight: 600; font-size: 12px; transition: filter 0.16s;', { type: 'button', class: 'mc-icon-label' });\n openBtn.append(icon('folder', 14), elS('span', '', { text: t('files.openManager') }));\n openBtn.addEventListener('mouseenter', () => { openBtn.style.filter = 'brightness(1.1)'; });\n openBtn.addEventListener('mouseleave', () => { openBtn.style.filter = ''; });\n openBtn.addEventListener('click', () => this.core.openLibrary());\n body.appendChild(openBtn);\n\n const grid = elS('div', 'display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-top: 12px;');\n s.assets.slice(0, 6).forEach((a) => {\n const tile = elS('div', 'border: 1px solid var(--ed-line); border-radius: 9px; overflow: hidden; cursor: grab; background: var(--ed-panel-2); transition: border-color 0.16s;', { draggable: 'true', title: a.name });\n tile.addEventListener('mouseenter', () => { tile.style.borderColor = 'var(--ed-accent)'; });\n tile.addEventListener('mouseleave', () => { tile.style.borderColor = 'var(--ed-line)'; });\n tile.addEventListener('dragstart', this.core.startDrag({ kind: 'asset', assetId: a.id }));\n tile.addEventListener('dragend', () => { this.core.drag = null; this.core.setState({ drop: null, rowDrop: null }); });\n tile.appendChild(elS('div', `width: 100%; height: 64px; background-image: url(\"${a.url}\"); background-size: cover; background-position: center; background-color: var(--ed-work);`, { role: 'img', 'aria-label': a.name }));\n tile.appendChild(elS('div', 'font-family: ui-monospace, monospace; font-size: 9px; color: var(--ed-muted); padding: 4px 5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;', { text: a.name }));\n grid.appendChild(tile);\n });\n body.appendChild(grid);\n body.appendChild(elS('p', 'margin: 12px 0 0; font-size: 11.5px; color: var(--ed-muted); line-height: 1.55;', { text: t('files.dragToCanvas') }));\n wrap.appendChild(body);\n return wrap;\n }\n\n // ---- Layers tab --------------------------------------------------------\n\n renderLayersTab() {\n const s = this.core.state;\n const t = this.core.t;\n const wrap = this.tabSurface();\n wrap.appendChild(this.sectionBar(t('layers.structure')));\n const body = this.sectionBody('display: grid; gap: 0;');\n body.classList.add('mc-layer-tree');\n // Mirror the document model as a real tree: section -> column -> block.\n // Keeping columns visible matters for multi-column rows; flattening every\n // block beneath the section made the structure ambiguous.\n s.doc.rows.forEach((r, i) => {\n const rSel = s.sel && s.sel.id === r.id;\n const card = elS('div', 'background: transparent; padding: 0 0 8px;', { class: `mc-tree-section${rSel ? ' is-selected' : ''}` });\n const blockN = r.cols.reduce((n, c) => n + c.blocks.length, 0);\n const head = elS('div', `display: flex; align-items: center; gap: 8px; cursor: pointer; padding: 6px 7px; border-radius: 7px; background: ${rSel ? 'var(--ed-soft)' : 'transparent'}; transition: background 0.16s;`, { class: 'mc-tree-node mc-tree-section-node' });\n head.addEventListener('mouseenter', () => { head.style.background = 'var(--ed-soft)'; });\n head.addEventListener('mouseleave', () => { head.style.background = rSel ? 'var(--ed-soft)' : 'transparent'; });\n head.addEventListener('click', () => this.core.select('row', r.id));\n head.append(\n elS('span', `width: 22px; height: 22px; flex: none; border-radius: 6px; display: flex; align-items: center; justify-content: center; font-family: ui-monospace, monospace; font-size: 10px; font-weight: 600; background: ${rSel ? 'var(--ed-accent)' : 'var(--ed-panel-2)'}; color: ${rSel ? 'var(--ed-accent-ink)' : 'var(--ed-muted)'};`, { text: String(i + 1).padStart(2, '0'), class: 'mc-tree-index' }),\n elS('span', 'font-family: var(--ed-font); font-weight: 600; font-size: 12.5px; color: var(--ed-text);', { text: r.cols.length === 1 ? t('layers.sectionSingle') : t('layers.sectionMulti', { count: r.cols.length }), class: 'mc-tree-title' }),\n elS('span', 'flex: 1;'),\n elS('span', 'font-family: var(--ed-font); font-size: 10px; font-weight: 500; color: var(--ed-muted);', { text: t('layers.blockCount', { count: blockN }), class: 'mc-tree-count' }),\n );\n card.appendChild(head);\n const columns = elS('div', '', { class: 'mc-tree-children mc-tree-columns' });\n r.cols.forEach((c, colIndex) => {\n const branch = elS('div', '', { class: 'mc-tree-branch' });\n const colHead = elS('div', 'display: flex; align-items: center; gap: 7px; min-height: 28px; padding: 3px 7px; color: var(--ed-muted);', { class: 'mc-tree-node mc-tree-column-node' });\n const colChip = elS('span', 'width: 20px; height: 20px; flex: none; border-radius: 5px; display: flex; align-items: center; justify-content: center; background: var(--ed-panel-2); color: var(--ed-faint);');\n colChip.appendChild(icon('table', 11));\n colHead.append(\n colChip,\n elS('span', 'font-family: var(--ed-font); font-size: 11.5px; font-weight: 600;', { text: t('layers.column', { index: colIndex + 1 }), class: 'mc-tree-title' }),\n elS('span', 'flex: 1;'),\n elS('span', 'font-family: var(--ed-font); font-size: 10px; font-weight: 500; color: var(--ed-muted);', { text: t('layers.blockCount', { count: c.blocks.length }), class: 'mc-tree-count' }),\n );\n branch.appendChild(colHead);\n if (c.blocks.length) {\n const list = elS('div', '', { class: 'mc-tree-children mc-tree-blocks' });\n c.blocks.forEach((b) => {\n const bSel = s.sel && s.sel.id === b.id;\n const typeName = DEF(b.type).label;\n const text = b.type === 'text' ? String(b.props.html || '').replace(/<[^>]+>/g, '').trim().slice(0, 34) : (b.props.label || b.props.title || b.props.caption || '');\n const line = elS('div', `display: flex; align-items: center; gap: 8px; cursor: pointer; padding: 4px 7px; border-radius: 8px; background: ${bSel ? 'var(--ed-soft)' : 'transparent'}; box-shadow: ${bSel ? 'inset 0 0 0 1px var(--ed-accent)' : 'none'}; transition: background 0.16s;`, { class: 'mc-tree-node mc-tree-block-node' });\n line.addEventListener('mouseenter', () => { if (!(s.sel && s.sel.id === b.id)) line.style.background = 'var(--ed-panel)'; });\n line.addEventListener('mouseleave', () => { line.style.background = bSel ? 'var(--ed-soft)' : 'transparent'; });\n line.addEventListener('click', () => this.core.select('block', b.id));\n const chip = elS('span', `width: 22px; height: 22px; flex: none; border-radius: 6px; display: flex; align-items: center; justify-content: center; background: ${bSel ? 'var(--ed-accent)' : 'var(--ed-soft)'}; color: ${bSel ? 'var(--ed-accent-ink)' : 'var(--ed-accent)'};`);\n chip.appendChild(icon(b.type, 12));\n line.append(chip, elS('span', 'font-family: var(--ed-font); font-size: 12px; font-weight: 500; color: var(--ed-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap;', { text: text || typeName, class: 'mc-tree-title' }));\n if (text) {\n line.append(\n elS('span', 'flex: 1; min-width: 8px;'),\n elS('span', 'flex: none; font-family: var(--ed-font); font-size: 9.5px; font-weight: 600; letter-spacing: 0.035em; text-transform: uppercase; color: var(--ed-muted);', { text: typeName, class: 'mc-tree-type' }),\n );\n }\n list.appendChild(line);\n });\n branch.appendChild(list);\n }\n columns.appendChild(branch);\n });\n card.appendChild(columns);\n body.appendChild(card);\n });\n wrap.appendChild(body);\n return wrap;\n }\n\n // ---- Theme tab -------------------------------------------------------\n\n renderThemeTab() {\n // Same flat-accordion treatment as the Design tab, so the two style\n // surfaces read as one system; the section bars carry the structure.\n const wrap = this.tabSurface();\n renderFieldCards(wrap, this.core.themeFields());\n return wrap;\n }\n\n // ---- Data (variables) tab ----------------------------------------------\n\n renderDataTab() {\n const s = this.core.state;\n const t = this.core.t;\n const wrap = this.tabSurface();\n wrap.appendChild(this.sectionBar(t('vars.title'), t('vars.fromCode', { count: this.core.vars().length })));\n const card = this.sectionBody();\n card.appendChild(elS('p', 'margin: 0 0 12px; font-size: 11.5px; color: var(--ed-muted); line-height: 1.55;', { text: t('vars.declaredNote') }));\n const search = elS('input', 'width: 100%; box-sizing: border-box; background: var(--ed-panel-2); border: 1px solid var(--ed-line); border-radius: 8px; color: var(--ed-text); font: inherit; font-size: 12.5px; padding: 7px 9px; margin-bottom: 8px;', { placeholder: t('vars.filterPlaceholder'), 'data-focus-key': 'var-query' });\n search.value = s.varQuery || '';\n search.addEventListener('focus', () => { search.style.borderColor = 'var(--ed-accent)'; search.style.outline = 'none'; });\n search.addEventListener('blur', () => { search.style.borderColor = 'var(--ed-line)'; });\n // Debounced: each setState is a full re-render (see typeCommit, fields.js).\n const varSearchCommit = typeCommit((v) => this.core.setState({ varQuery: v }));\n search.addEventListener('input', (e) => varSearchCommit.call(e.target.value));\n card.appendChild(search);\n\n const all = this.core.vars();\n const filtered = all.filter((v) => !s.varQuery || v.toLowerCase().includes(String(s.varQuery).toLowerCase()));\n const grid = elS('div', 'display: grid; gap: 3px;');\n filtered.forEach((v) => {\n const name = v.replace(/[_.]/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n const btn = elS('button', 'display: flex; align-items: center; gap: 9px; text-align: left; border: 1px solid var(--ed-line); border-radius: 8px; background: var(--ed-panel-2); color: var(--ed-text); cursor: pointer; padding: 8px 10px; transition: border-color 0.16s, background 0.16s;', { type: 'button', title: t('vars.insertHint') });\n btn.addEventListener('mouseenter', () => { btn.style.borderColor = 'var(--ed-accent)'; btn.style.background = 'var(--ed-soft)'; });\n btn.addEventListener('mouseleave', () => { btn.style.borderColor = 'var(--ed-line)'; btn.style.background = 'var(--ed-panel-2)'; });\n btn.addEventListener('click', () => this.core.insertTag(v));\n const textSpan = elS('span', 'flex: 1; min-width: 0;');\n textSpan.append(\n elS('span', 'display: block; font-family: var(--ed-font); font-weight: 600; font-size: 12.5px; line-height: 1.2;', { text: name }),\n elS('span', 'display: block; font-family: ui-monospace, monospace; font-size: 10px; color: var(--ed-accent); margin-top: 2px;', { text: TOKEN(v) }),\n );\n btn.append(textSpan, elS('span', 'font-family: var(--ed-font); font-size: 9.5px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ed-faint);', { text: t('vars.insert') }));\n grid.appendChild(btn);\n });\n card.appendChild(grid);\n if (!filtered.length) {\n card.appendChild(elS('p', 'margin: 10px 0 0; font-size: 11.5px; color: var(--ed-muted); line-height: 1.55;', { text: all.length ? t('vars.noMatch') : t('vars.noneDeclared') }));\n }\n card.appendChild(elS('p', 'margin: 14px 0 0; padding-top: 12px; border-top: 1px solid var(--ed-line); font-size: 11.5px; color: var(--ed-muted); line-height: 1.55;', { text: t('vars.rteHint') }));\n wrap.appendChild(card);\n return wrap;\n }\n\n // ---- modals: library ----------------------------------------------------\n\n buildLibraryModal() {\n const t = this.core.t;\n const overlay = elS('div', 'position: absolute; inset: 0; background: rgba(10,12,14,0.6); z-index: 50; display: flex; align-items: center; justify-content: center; padding: 34px; animation: mcFade 0.16s ease; display: none;', { class: 'mc-modal-backdrop' });\n overlay.addEventListener('click', (e) => { if (e.target === overlay) this.core.setState({ libraryOpen: false, exportOpen: false, aiOpen: false, codeOpen: false, assetTarget: null, libHot: false }); });\n const modal = elS('div', 'width: 100%; height: 100%; max-width: 1000px; background: var(--ed-panel); border: 1px solid var(--ed-line-2); border-radius: var(--ed-radius); overflow: hidden; display: grid; grid-template-rows: auto 1fr auto; box-shadow: var(--ed-shadow-lg); animation: mcIn 0.2s cubic-bezier(0.22,0.61,0.36,1);', { class: 'mc-modal' });\n modal.addEventListener('click', (e) => e.stopPropagation());\n overlay.appendChild(modal);\n\n const head = elS('div', 'display: flex; align-items: center; gap: 12px; padding: 14px 20px; border-bottom: 1px solid var(--ed-line);');\n this.libraryTitleEl = elS('div', 'flex: 1;');\n this.libraryTitleEl.append(\n elS('div', 'font-family: var(--ed-font); font-size: 10px; font-weight: 700; letter-spacing: 0.09em; text-transform: uppercase; color: var(--ed-muted);', { text: t('modal.fileManager'), 'data-i18n': 'modal.fileManager' }),\n (this.libraryTitleText = elS('div', 'font-family: var(--ed-font); font-weight: 600; font-size: 16px; line-height: 1.25;')),\n );\n this.assetSearch = elS('input', 'width: 210px; box-sizing: border-box; background: var(--ed-panel-2); border: 1px solid var(--ed-line); color: var(--ed-text); font: inherit; font-size: 13px; padding: 7px 9px;', { placeholder: t('library.searchPlaceholder'), 'data-i18n-placeholder': 'library.searchPlaceholder', 'data-focus-key': 'asset-query' });\n this.assetSearch.addEventListener('focus', () => { this.assetSearch.style.borderColor = 'var(--ed-accent)'; this.assetSearch.style.outline = 'none'; });\n this.assetSearch.addEventListener('blur', () => { this.assetSearch.style.borderColor = 'var(--ed-line)'; });\n // Debounced re-render; setAssetQuery separately debounces the backend call.\n const assetSearchCommit = typeCommit((v) => this.core.setAssetQuery(v));\n this.assetSearch.addEventListener('input', (e) => assetSearchCommit.call(e.target.value));\n const uploadBtn = elS('button', 'border: 0; background: var(--ed-accent); color: var(--ed-accent-ink); cursor: pointer; height: 32px; padding: 0 12px; display: flex; align-items: center; gap: 7px; font-family: var(--ed-font); font-weight: 600; font-size: 12px; transition: filter 0.16s;', { type: 'button', class: 'mc-icon-label' });\n uploadBtn.append(icon('upload', 14), elS('span', '', { text: t('action.upload'), 'data-i18n': 'action.upload' }));\n uploadBtn.addEventListener('mouseenter', () => { uploadBtn.style.filter = 'brightness(1.1)'; });\n uploadBtn.addEventListener('mouseleave', () => { uploadBtn.style.filter = ''; });\n uploadBtn.addEventListener('click', () => this.fileInput.click());\n const closeBtn = elS('button', 'border: 1px solid var(--ed-line); background: transparent; color: var(--ed-text); cursor: pointer; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; transition: border-color 0.16s, background 0.16s;', { type: 'button', title: t('action.close'), class: 'mc-icon-button' });\n closeBtn.appendChild(icon('x', 14));\n closeBtn.addEventListener('mouseenter', () => { closeBtn.style.borderColor = 'var(--ed-accent)'; });\n closeBtn.addEventListener('mouseleave', () => { closeBtn.style.borderColor = 'var(--ed-line)'; });\n closeBtn.addEventListener('click', () => this.core.setState({ libraryOpen: false, exportOpen: false, aiOpen: false, codeOpen: false, assetTarget: null, libHot: false }));\n tip(closeBtn, t('action.close'), 'down', 'end');\n head.append(this.libraryTitleEl, this.assetSearch, uploadBtn, closeBtn);\n modal.appendChild(head);\n\n const body = elS('div', 'display: grid; grid-template-columns: 186px 1fr; min-height: 0;');\n this.folderList = elS('div', 'border-right: 1px solid var(--ed-line); padding: 14px; overflow-y: auto;');\n const foldersHead = elS('div', 'font-family: var(--ed-font); font-size: 10px; font-weight: 700; letter-spacing: 0.09em; text-transform: uppercase; color: var(--ed-muted); margin-bottom: 10px;', { text: t('library.folders'), 'data-i18n': 'library.folders' });\n this.folderGrid = elS('div', 'display: grid; gap: 2px;');\n this.folderList.append(foldersHead, this.folderGrid);\n this.assetGridWrap = elS('div', 'overflow-y: auto; padding: 16px; transition: background 0.16s;');\n this.assetGridWrap.addEventListener('dragover', (e) => { if (this.core.drag) return; e.preventDefault(); if (!this.core.state.libHot) this.core.setState({ libHot: true }); });\n this.assetGridWrap.addEventListener('drop', (e) => { e.preventDefault(); this.core.setState({ libHot: false }); if (e.dataTransfer?.files?.length) this.core.addFiles(e.dataTransfer.files); });\n this.assetStatus = elS('div', 'font-size: 12.5px; color: var(--ed-muted); padding: 0 2px 12px;');\n this.assetGrid = elS('div', 'display: grid; grid-template-columns: repeat(auto-fill, minmax(178px, 1fr)); gap: 14px;');\n this.assetEmpty = elS('div', 'padding: 28px 2px; color: var(--ed-muted); font-size: 12.5px;', { text: t('library.empty'), 'data-i18n': 'library.empty' });\n this.assetMore = elS('button', 'margin-top: 16px; border: 0; border-radius: 8px; background: var(--ed-soft); color: var(--ed-accent); cursor: pointer; height: 30px; padding: 0 14px; font-family: var(--ed-font); font-size: 11.5px; font-weight: 600; transition: background 0.16s, color 0.16s;', { type: 'button', text: t('library.loadMore'), 'data-i18n': 'library.loadMore' });\n this.assetMore.addEventListener('mouseenter', () => { this.assetMore.style.background = 'var(--ed-accent)'; this.assetMore.style.color = 'var(--ed-accent-ink)'; });\n this.assetMore.addEventListener('mouseleave', () => { this.assetMore.style.background = 'var(--ed-soft)'; this.assetMore.style.color = 'var(--ed-accent)'; });\n this.assetMore.addEventListener('click', () => this.core.loadMoreAssets());\n this.assetGridWrap.append(this.assetStatus, this.assetGrid, this.assetEmpty, this.assetMore);\n this.assetGridWrap.appendChild(elS('div', 'margin-top: 20px; border: 1px dashed var(--ed-line-2); padding: 22px; text-align: center; color: var(--ed-muted); font-size: 12.5px;', { text: t('library.dropHint'), 'data-i18n': 'library.dropHint' }));\n body.append(this.folderList, this.assetGridWrap);\n modal.appendChild(body);\n\n const foot = elS('div', 'padding: 10px 20px; border-top: 1px solid var(--ed-line); display: flex; justify-content: space-between; font-family: ui-monospace, monospace; font-size: 9.5px; letter-spacing: 0.06em; color: var(--ed-faint);');\n this.libraryHintEl = elS('span');\n this.storageLabelEl = elS('span');\n foot.append(this.libraryHintEl, this.storageLabelEl);\n modal.appendChild(foot);\n return overlay;\n }\n\n renderLibraryModal() {\n const s = this.core.state;\n const t = this.core.t;\n this.libraryModal.style.display = s.libraryOpen ? 'flex' : 'none';\n if (!s.libraryOpen) return;\n this.libraryTitleText.textContent = s.assetTarget ? t('modal.replaceImage') : t('modal.assetsTitle');\n this.libraryHintEl.textContent = s.assetTarget ? t('library.clickToReplace') : t('library.clickToPlace');\n this.storageLabelEl.textContent = t('library.storageLabel', { count: s.assets.length, size: KB(s.assets.reduce((n, a) => n + (a.size || 0), 0)) });\n if (this.assetSearch.value !== (s.assetQuery || '')) this.assetSearch.value = s.assetQuery || '';\n // The OS file dialog greys out what validation would refuse anyway, so the\n // accept list tracks whatever limits the host has set.\n this.fileInput.accept = acceptAttribute(this.core.limits());\n\n this.folderGrid.innerHTML = '';\n this.core.folderOptions().forEach((f) => {\n const on = s.assetFolder === f.id;\n const btn = elS('button', `text-align: left; border: 0; border-left: 2px solid ${on ? 'var(--ed-accent)' : 'transparent'}; background: ${on ? 'var(--ed-soft)' : 'transparent'}; color: ${on ? 'var(--ed-accent)' : 'var(--ed-text)'}; cursor: pointer; padding: 8px 10px; font-size: 12.5px; display: flex; justify-content: space-between; gap: 8px; transition: background 0.16s;`, { type: 'button' });\n btn.addEventListener('mouseenter', () => { btn.style.background = 'var(--ed-soft)'; });\n btn.addEventListener('mouseleave', () => { btn.style.background = on ? 'var(--ed-soft)' : 'transparent'; });\n btn.addEventListener('click', () => this.core.setAssetFolder(f.id));\n btn.append(\n elS('span', '', { text: f.name }),\n elS('span', 'font-family: ui-monospace, monospace; font-size: 9.5px; color: var(--ed-faint);', { text: f.count == null ? '' : String(f.count) }),\n );\n this.folderGrid.appendChild(btn);\n });\n\n // One line carries all three transient states -- they can't co-occur, and a\n // separate row for each would push the grid down every time one appeared.\n const status = s.uploading ? t('storage.uploading', { count: s.uploading })\n : s.assetsError ? t('storage.errLoadFailed', { reason: s.assetsError })\n : s.assetsLoading ? t('storage.loading') : '';\n this.assetStatus.textContent = status;\n this.assetStatus.style.display = status ? 'block' : 'none';\n this.assetStatus.style.color = s.assetsError ? 'var(--ed-danger)' : 'var(--ed-muted)';\n\n this.assetGridWrap.style.background = s.libHot ? 'var(--ed-soft)' : 'transparent';\n const visible = this.core.visibleAssets();\n this.assetGrid.innerHTML = '';\n visible.forEach((a) => {\n const tile = elS('div', 'border: 1px solid var(--ed-line); border-radius: var(--ed-radius-sm); overflow: hidden; background: var(--ed-panel-2); cursor: pointer; transition: border-color 0.16s, transform 0.16s, box-shadow 0.16s;', { draggable: 'true' });\n tile.addEventListener('mouseenter', () => { tile.style.borderColor = 'var(--ed-accent)'; tile.style.transform = 'translateY(-1px)'; tile.style.boxShadow = 'var(--ed-shadow-md)'; });\n tile.addEventListener('mouseleave', () => { tile.style.borderColor = 'var(--ed-line)'; tile.style.transform = ''; tile.style.boxShadow = ''; });\n tile.addEventListener('dragstart', this.core.startDrag({ kind: 'asset', assetId: a.id }));\n tile.addEventListener('click', () => this.core.useAsset(a));\n tile.appendChild(elS('div', `width: 100%; height: 120px; background-image: url(\"${a.url}\"); background-size: cover; background-position: center; background-color: var(--ed-work); border-bottom: 1px solid var(--ed-line);`, { role: 'img', 'aria-label': a.name }));\n const meta = elS('div', 'padding: 8px 9px;');\n meta.appendChild(elS('div', 'font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;', { text: a.name }));\n const metaRow = elS('div', 'display: flex; justify-content: space-between; gap: 6px; margin-top: 3px;');\n metaRow.appendChild(elS('span', 'font-family: ui-monospace, monospace; font-size: 9.5px; color: var(--ed-faint);', { text: `${a.w ? a.w + '×' + a.ht + ' · ' : ''}${KB(a.size || 0)}` }));\n const del = elS('span', 'font-family: ui-monospace, monospace; font-size: 9.5px; color: var(--ed-faint); cursor: pointer;', { title: t('library.deleteFileHint'), text: t('library.del') });\n del.addEventListener('mouseenter', () => { del.style.color = 'var(--ed-danger)'; });\n del.addEventListener('mouseleave', () => { del.style.color = 'var(--ed-faint)'; });\n del.addEventListener('click', (e) => { e.stopPropagation(); this.core.removeAsset(a); });\n metaRow.appendChild(del);\n meta.appendChild(metaRow);\n tile.appendChild(meta);\n this.assetGrid.appendChild(tile);\n });\n\n // \"Nothing here\" only once there is an answer -- during the first load, and\n // after a failure, an empty grid means \"not known yet\", not \"no files\".\n this.assetEmpty.style.display = (!visible.length && !s.assetsLoading && !s.assetsError) ? 'block' : 'none';\n this.assetMore.style.display = s.assetCursor ? 'block' : 'none';\n this.assetMore.disabled = !!s.assetsLoading;\n }\n\n // ---- modals: export ----------------------------------------------------\n\n buildExportModal() {\n const t = this.core.t;\n const overlay = elS('div', 'position: absolute; inset: 0; background: rgba(10,12,14,0.6); z-index: 50; display: flex; align-items: center; justify-content: center; padding: 34px; animation: mcFade 0.16s ease; display: none;', { class: 'mc-modal-backdrop' });\n overlay.addEventListener('click', (e) => { if (e.target === overlay) this.core.setState({ libraryOpen: false, exportOpen: false, aiOpen: false, codeOpen: false, assetTarget: null, libHot: false }); });\n const modal = elS('div', 'width: 100%; height: 100%; max-width: 900px; background: var(--ed-panel); border: 1px solid var(--ed-line-2); border-radius: var(--ed-radius); overflow: hidden; display: grid; grid-template-rows: auto 1fr auto; box-shadow: var(--ed-shadow-lg); animation: mcIn 0.2s cubic-bezier(0.22,0.61,0.36,1);', { class: 'mc-modal' });\n modal.addEventListener('click', (e) => e.stopPropagation());\n overlay.appendChild(modal);\n\n const head = elS('div', 'display: flex; align-items: center; gap: 10px; padding: 14px 20px; border-bottom: 1px solid var(--ed-line);');\n const headText = elS('div', 'flex: 1;');\n headText.append(\n elS('div', 'font-family: var(--ed-font); font-size: 10px; font-weight: 700; letter-spacing: 0.09em; text-transform: uppercase; color: var(--ed-muted);', { text: t('modal.export'), 'data-i18n': 'modal.export' }),\n elS('div', 'font-family: var(--ed-font); font-weight: 600; font-size: 16px; line-height: 1.25;', { text: t('modal.exportTitle'), 'data-i18n': 'modal.exportTitle' }),\n );\n this.copyBtn = elS('button', 'border: 1px solid var(--ed-line); background: transparent; color: var(--ed-text); cursor: pointer; height: 32px; padding: 0 11px; display: flex; align-items: center; gap: 7px; font-family: var(--ed-font); font-size: 12px; font-weight: 600; transition: border-color 0.16s, background 0.16s;', { type: 'button', class: 'mc-icon-label' });\n this.copyBtn.iconNode = icon('copy', 14);\n this.copyBtn.labelNode = elS('span');\n this.copyBtn.append(this.copyBtn.iconNode, this.copyBtn.labelNode);\n this.copyBtn.addEventListener('mouseenter', () => { this.copyBtn.style.borderColor = 'var(--ed-accent)'; this.copyBtn.style.background = 'var(--ed-soft)'; });\n this.copyBtn.addEventListener('mouseleave', () => { this.copyBtn.style.borderColor = 'var(--ed-line)'; this.copyBtn.style.background = 'transparent'; });\n this.copyBtn.addEventListener('click', () => this.core.copyExport());\n this.shotBtn = elS('button', 'border: 1px solid var(--ed-line); background: transparent; color: var(--ed-text); cursor: pointer; height: 32px; padding: 0 11px; display: flex; align-items: center; gap: 7px; font-family: var(--ed-font); font-size: 12px; font-weight: 600; transition: border-color 0.16s, background 0.16s;', { type: 'button', title: t('action.screenshotHint'), 'data-i18n-title': 'action.screenshotHint', class: 'mc-icon-label' });\n this.shotBtn.append(icon('image', 14), elS('span', '', { text: t('action.screenshot'), 'data-i18n': 'action.screenshot' }));\n this.shotBtn.addEventListener('mouseenter', () => { this.shotBtn.style.borderColor = 'var(--ed-accent)'; this.shotBtn.style.background = 'var(--ed-soft)'; });\n this.shotBtn.addEventListener('mouseleave', () => { this.shotBtn.style.borderColor = 'var(--ed-line)'; this.shotBtn.style.background = 'transparent'; });\n // Opens the viewer first and renders into it: the capture takes a beat on\n // a long template, and a modal that is already up with a skeleton reads as\n // progress, where a button that just sits there reads as a dead click.\n this.shotBtn.addEventListener('click', () => this.previewScreenshot());\n const downloadBtn = elS('button', 'border: 0; background: var(--ed-accent); color: var(--ed-accent-ink); cursor: pointer; height: 32px; padding: 0 12px; display: flex; align-items: center; gap: 7px; font-family: var(--ed-font); font-weight: 600; font-size: 12px; transition: filter 0.16s;', { type: 'button', class: 'mc-icon-label' });\n downloadBtn.append(icon('download', 14), elS('span', '', { text: t('action.download'), 'data-i18n': 'action.download' }));\n downloadBtn.addEventListener('mouseenter', () => { downloadBtn.style.filter = 'brightness(1.1)'; });\n downloadBtn.addEventListener('mouseleave', () => { downloadBtn.style.filter = ''; });\n downloadBtn.addEventListener('click', () => this.core.downloadExport());\n const closeBtn = elS('button', 'border: 1px solid var(--ed-line); background: transparent; color: var(--ed-text); cursor: pointer; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; transition: border-color 0.16s, background 0.16s;', { type: 'button', title: t('action.close'), class: 'mc-icon-button' });\n closeBtn.appendChild(icon('x', 14));\n closeBtn.addEventListener('mouseenter', () => { closeBtn.style.borderColor = 'var(--ed-accent)'; });\n closeBtn.addEventListener('mouseleave', () => { closeBtn.style.borderColor = 'var(--ed-line)'; });\n closeBtn.addEventListener('click', () => this.core.setState({ libraryOpen: false, exportOpen: false, aiOpen: false, codeOpen: false, assetTarget: null, libHot: false }));\n tip(closeBtn, t('action.close'), 'down', 'end');\n head.append(headText, this.copyBtn, this.shotBtn, downloadBtn, closeBtn);\n modal.appendChild(head);\n\n this.exportTextarea = elS('textarea', 'width: 100%; height: 100%; box-sizing: border-box; border: 0; background: var(--ed-work); color: var(--ed-text); font-family: ui-monospace, monospace; font-size: 11.5px; line-height: 1.55; padding: 18px 20px; resize: none;', { readonly: 'true' });\n modal.appendChild(this.exportTextarea);\n this.exportMetaEl = elS('div', 'padding: 10px 20px; border-top: 1px solid var(--ed-line); font-family: ui-monospace, monospace; font-size: 9.5px; letter-spacing: 0.06em; color: var(--ed-faint);');\n modal.appendChild(this.exportMetaEl);\n return overlay;\n }\n\n renderExportModal() {\n const s = this.core.state;\n const t = this.core.t;\n this.exportModal.style.display = s.exportOpen ? 'flex' : 'none';\n if (!s.exportOpen) return;\n if (this.exportTextarea.value !== s.exportCode) this.exportTextarea.value = s.exportCode;\n this.copyBtn.labelNode.textContent = s.copied ? t('export.copied') : t('export.copy');\n this.exportMetaEl.textContent = t('export.meta', { kb: (s.exportCode.length / 1024).toFixed(1) });\n }\n\n // ---- modals: code view --------------------------------------------------\n\n buildCodeModal() {\n const t = this.core.t;\n const overlay = elS('div', 'position: absolute; inset: 0; background: var(--ed-panel); z-index: 55; display: grid; grid-template-rows: 58px minmax(0, 1fr) auto; animation: mcFade 0.16s ease; display: none;', { class: 'mc-fullscreen-panel mc-code-panel' });\n const head = elS('div', 'display: flex; align-items: center; gap: 10px; padding: 0 18px; border-bottom: 1px solid var(--ed-line); background: linear-gradient(to bottom, var(--ed-panel), var(--ed-panel-2));', { class: 'mc-code-toolbar' });\n const headIcon = elS('span', 'width: 32px; height: 32px; border-radius: 9px; background: var(--ed-soft); color: var(--ed-accent); display: flex; align-items: center; justify-content: center; flex: none;', { class: 'mc-code-badge' });\n headIcon.appendChild(icon('code', 17));\n const headText = elS('div', 'flex: 1; min-width: 0;');\n this.codeStatusEl = elS('div', 'font-family: var(--ed-font); font-size: 10px; font-weight: 700; letter-spacing: 0.09em; text-transform: uppercase; color: var(--ed-muted);', { class: 'mc-code-kicker' });\n headText.append(this.codeStatusEl, elS('div', 'font-family: var(--ed-font); font-weight: 600; font-size: 15px; line-height: 1.2;', { text: t('modal.rawHtmlTitle'), 'data-i18n': 'modal.rawHtmlTitle', class: 'mc-code-heading' }));\n this.codeWidthSeg = elS('div', '', { class: 'mc-segment' });\n const reloadBtn = elS('button', 'border: 1px solid var(--ed-line); background: transparent; color: var(--ed-text); cursor: pointer; height: 30px; padding: 0 11px; display: flex; align-items: center; gap: 6px; font-family: var(--ed-font); font-size: 11px; font-weight: 600; transition: border-color 0.16s, background 0.16s;', { type: 'button', title: t('action.reloadHint'), 'data-i18n-title': 'action.reloadHint' });\n reloadBtn.appendChild(icon('refresh', 14));\n reloadBtn.appendChild(elS('span', '', { text: t('action.reload'), 'data-i18n': 'action.reload' }));\n reloadBtn.addEventListener('mouseenter', () => { reloadBtn.style.borderColor = 'var(--ed-accent)'; reloadBtn.style.background = 'var(--ed-soft)'; });\n reloadBtn.addEventListener('mouseleave', () => { reloadBtn.style.borderColor = 'var(--ed-line)'; reloadBtn.style.background = 'transparent'; });\n reloadBtn.addEventListener('click', () => {\n const src = this.core.buildHtml();\n this.core.setState({ codeSrc: src, codeLive: src, codeDirty: false });\n this.core.flash(this.core.t('toast.sourceReloaded'));\n });\n const applyBtn = elS('button', 'border: 0; background: var(--ed-accent); color: var(--ed-accent-ink); cursor: pointer; height: 30px; padding: 0 12px; display: flex; align-items: center; gap: 7px; font-family: var(--ed-font); font-weight: 600; font-size: 11px; transition: filter 0.16s;', { type: 'button', title: t('action.applyToCanvasHint'), 'data-i18n-title': 'action.applyToCanvasHint' });\n applyBtn.appendChild(icon('check', 14));\n applyBtn.appendChild(elS('span', '', { text: t('action.applyToCanvas'), 'data-i18n': 'action.applyToCanvas' }));\n applyBtn.addEventListener('mouseenter', () => { applyBtn.style.filter = 'brightness(1.1)'; });\n applyBtn.addEventListener('mouseleave', () => { applyBtn.style.filter = ''; });\n applyBtn.addEventListener('click', () => this.core.applyCode());\n const closeBtn = elS('button', 'border: 1px solid var(--ed-line); background: transparent; color: var(--ed-text); cursor: pointer; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; transition: border-color 0.16s;', { type: 'button', title: t('action.closeWithoutApplyingHint'), 'data-i18n-title': 'action.closeWithoutApplyingHint', class: 'mc-icon-button' });\n closeBtn.appendChild(icon('x', 14));\n closeBtn.addEventListener('mouseenter', () => { closeBtn.style.borderColor = 'var(--ed-accent)'; });\n closeBtn.addEventListener('mouseleave', () => { closeBtn.style.borderColor = 'var(--ed-line)'; });\n closeBtn.addEventListener('click', () => this.core.setState({ libraryOpen: false, exportOpen: false, aiOpen: false, codeOpen: false, assetTarget: null, libHot: false }));\n tip(closeBtn, t('action.closeWithoutApplyingHint'), 'down', 'end');\n head.append(headIcon, headText, this.codeWidthSeg, reloadBtn, applyBtn, closeBtn);\n overlay.appendChild(head);\n\n const cols = elS('div', 'display: grid; grid-template-columns: 1fr 1fr; gap: 12px; padding: 12px; min-height: 0; background: var(--ed-work);', { class: 'mc-code-split' });\n const left = elS('div', 'display: grid; grid-template-rows: auto 1fr; min-height: 0; border: 1px solid var(--ed-line); border-radius: 12px; overflow: hidden; background: var(--ed-panel);', { class: 'mc-code-source' });\n const leftHead = elS('div', 'padding: 7px 16px; border-bottom: 1px solid var(--ed-line); font-family: var(--ed-font); font-size: 10px; font-weight: 700; letter-spacing: 0.09em; text-transform: uppercase; color: var(--ed-muted); display: flex; justify-content: space-between;', { class: 'mc-pane-label' });\n this.codeMetaEl = elS('span');\n leftHead.append(elS('span', '', { text: t('code.source'), 'data-i18n': 'code.source' }), this.codeMetaEl);\n left.appendChild(leftHead);\n const editorWrap = elS('div', 'position: relative; min-height: 0;');\n editorWrap.appendChild(this.buildCodeEditor());\n left.appendChild(editorWrap);\n cols.appendChild(left);\n\n const right = elS('div', 'display: grid; grid-template-rows: auto 1fr; min-height: 0; border: 1px solid var(--ed-line); border-radius: 12px; overflow: hidden; background: var(--ed-panel);', { class: 'mc-code-preview' });\n right.appendChild(elS('div', 'padding: 7px 16px; border-bottom: 1px solid var(--ed-line); background: var(--ed-panel); font-family: var(--ed-font); font-size: 10px; font-weight: 700; letter-spacing: 0.09em; text-transform: uppercase; color: var(--ed-muted);', { text: t('code.livePreview'), 'data-i18n': 'code.livePreview', class: 'mc-pane-label' }));\n const previewWrap = elS('div', 'overflow: auto; padding: 20px; display: flex; justify-content: center; background: var(--ed-work);', { class: 'mc-code-preview-body' });\n this.codeFrame = elS('iframe', \"width: 100%; height: 100%; min-height: 420px; border: 1px solid var(--ed-line-2); border-radius: 6px; background: #ffffff; box-shadow: 0 6px 18px rgba(15,23,42,0.10); transition: width 0.24s cubic-bezier(0.22,0.61,0.36,1);\", { title: t('code.liveHtmlPreviewTitle'), 'data-i18n-title': 'code.liveHtmlPreviewTitle', class: 'mc-code-frame' });\n this.codeFrame.addEventListener('load', () => this.syncCodePreviewScrollbar());\n previewWrap.appendChild(this.codeFrame);\n right.appendChild(previewWrap);\n cols.appendChild(right);\n overlay.appendChild(cols);\n\n overlay.appendChild(elS('div', 'padding: 8px 18px; border-top: 1px solid var(--ed-line); font-family: ui-monospace, monospace; font-size: 9.5px; letter-spacing: 0.06em; color: var(--ed-faint);', { text: t('code.applyNote'), 'data-i18n': 'code.applyNote', class: 'mc-code-footer' }));\n return overlay;\n }\n\n /** Ported from `codeEditorEl()`: numbered syntax-highlighted rows sit behind\n * a transparent-text/visible-caret `<textarea>`. Both layers share the same\n * fixed width and wrapping rules, so long HTML stays on screen without the\n * highlight or caret drifting away from the editable text. */\n buildCodeEditor() {\n const MONO = 'font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 12px; line-height: 20px; tab-size: 2;';\n const root = elS('div', 'position: absolute; inset: 0; overflow-y: auto; overflow-x: hidden; background: var(--ed-work);');\n const inner = elS('div', 'position: relative; min-height: 100%; width: 100%; min-width: 0;');\n this.codePre = elS('pre', `${MONO} margin: 0; padding: 14px 0 80px; width: 100%; min-width: 0; min-height: 100%; white-space: normal; color: var(--ed-text); pointer-events: none; background: linear-gradient(to right, var(--ed-panel-2) 0 52px, var(--ed-work) 52px);`, { 'aria-hidden': 'true' });\n this.codeTextarea = elS('textarea', `${MONO} position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; padding: 14px 18px 80px 70px; border: 0; background: transparent; color: transparent; caret-color: var(--ed-accent); white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word; overflow: hidden; resize: none; outline: none;`, { spellcheck: 'false', wrap: 'soft', 'data-focus-key': 'code-src' });\n this.codeTextarea.addEventListener('input', (e) => this.core.setCodeSrc(e.target.value));\n this.codeTextarea.addEventListener('keydown', (e) => {\n if (e.key !== 'Tab') return;\n e.preventDefault();\n const ta = e.target; const a = ta.selectionStart; const b = ta.selectionEnd;\n const next = ta.value.slice(0, a) + ' ' + ta.value.slice(b);\n this.core.setCodeSrc(next);\n ta.value = next;\n ta.selectionStart = ta.selectionEnd = a + 2;\n });\n inner.append(this.codePre, this.codeTextarea);\n root.appendChild(inner);\n return root;\n }\n\n /** The iframe owns a separate document, so the Shadow DOM scrollbar rules\n * cannot reach its viewport. Mirror the editor scrollbar as preview chrome\n * only; the source string and the HTML applied/exported by the host remain\n * byte-for-byte untouched. */\n syncCodePreviewScrollbar() {\n const doc = this.codeFrame?.contentDocument;\n if (!doc?.head) return;\n const view = this.ownerDocument?.defaultView;\n const thumb = view?.getComputedStyle(this.mc).getPropertyValue('--ed-line-2').trim() || 'rgba(15,23,42,0.16)';\n let style = doc.head.querySelector('[data-mc-preview-scrollbar]');\n if (!style) {\n style = doc.createElement('style');\n style.setAttribute('data-mc-preview-scrollbar', '');\n doc.head.appendChild(style);\n }\n style.textContent = `html { scrollbar-width: thin !important; scrollbar-color: ${thumb} transparent !important; } *::-webkit-scrollbar { width: 8px !important; height: 8px !important; } *::-webkit-scrollbar-thumb { background: ${thumb} !important; border-radius: 999px !important; } *::-webkit-scrollbar-track { background: transparent !important; } *::-webkit-scrollbar-button { display: none !important; width: 0 !important; height: 0 !important; }`;\n }\n\n renderCodeModal() {\n const s = this.core.state;\n const t = this.core.t;\n this.codeModal.style.display = s.codeOpen ? 'grid' : 'none';\n if (!s.codeOpen) return;\n this.refreshCodeSource();\n if (this._codeFrameSrc !== s.codeLive) {\n this.codeFrame.srcdoc = s.codeLive;\n this._codeFrameSrc = s.codeLive;\n }\n this.syncCodePreviewScrollbar();\n this.codeWidthSeg.innerHTML = '';\n [{ label: t('device.desktop'), v: 'desktop', iconName: 'monitor' }, { label: t('device.mobile'), v: 'mobile', iconName: 'phone' }].forEach((w) => {\n const on = s.codeDevice === w.v;\n const btn = elS('button', `width: 32px; height: 26px; display: flex; align-items: center; justify-content: center; background: ${this.segBg(on)}; color: ${this.segFg(on)};`, { type: 'button', title: w.label, 'aria-pressed': String(on) });\n btn.appendChild(icon(w.iconName, 15));\n btn.addEventListener('click', () => this.core.setState({ codeDevice: w.v }));\n tip(btn, w.label, 'down');\n this.codeWidthSeg.appendChild(btn);\n });\n this.codeFrame.style.width = s.codeDevice === 'mobile' ? '390px' : '100%';\n }\n\n /** Repaint the syntax layer, gutter and metadata without touching the\n * canvas, inspector, iframe, or focused textarea node. */\n refreshCodeSource() {\n if (!this.core.state.codeOpen || !this.codeTextarea) return;\n const s = this.core.state;\n const t = this.core.t;\n this.codeStatusEl.textContent = s.codeDirty ? t('code.statusEdited') : t('code.statusSynced');\n if (this.codeTextarea.value !== s.codeSrc) this.codeTextarea.value = s.codeSrc;\n const lines = s.codeSrc.split('\\n');\n this.codePre.innerHTML = lines.map((line, index) => `<span style=\"display:grid;grid-template-columns:52px minmax(0,1fr);min-height:20px\"><span style=\"padding-right:10px;text-align:right;color:var(--ed-faint);border-right:1px solid var(--ed-line);user-select:none\">${index + 1}</span><span style=\"min-width:0;padding:0 18px;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word\">${hl(line) || '​'}</span></span>`).join('');\n const lineCount = lines.length;\n this.codeMetaEl.textContent = t('code.meta', { kb: (s.codeSrc.length / 1024).toFixed(1), lines: lineCount });\n }\n\n // ---- modals: AI copy --------------------------------------------------\n\n buildAiModal() {\n const t = this.core.t;\n const overlay = elS('div', 'position: absolute; inset: 0; background: rgba(10,12,14,0.6); z-index: 50; display: flex; align-items: flex-start; justify-content: center; padding: 34px; overflow-y: auto; animation: mcFade 0.16s ease; display: none;', { class: 'mc-modal-backdrop' });\n overlay.addEventListener('click', (e) => { if (e.target === overlay) this.core.setState({ libraryOpen: false, exportOpen: false, aiOpen: false, codeOpen: false, assetTarget: null, libHot: false }); });\n const modal = elS('div', 'width: 100%; max-width: 660px; background: var(--ed-panel); border: 1px solid var(--ed-line-2); border-radius: var(--ed-radius); overflow: hidden; box-shadow: var(--ed-shadow-lg); animation: mcIn 0.2s cubic-bezier(0.22,0.61,0.36,1);', { class: 'mc-modal' });\n modal.addEventListener('click', (e) => e.stopPropagation());\n overlay.appendChild(modal);\n\n const head = elS('div', 'display: flex; align-items: center; padding: 14px 20px; border-bottom: 1px solid var(--ed-line);');\n const headText = elS('div', 'flex: 1;');\n headText.append(\n elS('div', 'font-family: var(--ed-font); font-size: 10px; font-weight: 700; letter-spacing: 0.09em; text-transform: uppercase; color: var(--ed-muted);', { text: t('modal.aiDraft'), 'data-i18n': 'modal.aiDraft' }),\n elS('div', 'font-family: var(--ed-font); font-weight: 600; font-size: 16px; line-height: 1.25;', { text: t('modal.aiDraftTitle'), 'data-i18n': 'modal.aiDraftTitle' }),\n );\n const closeBtn = elS('button', 'border: 1px solid var(--ed-line); background: transparent; color: var(--ed-text); cursor: pointer; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; transition: border-color 0.16s, background 0.16s;', { type: 'button', title: t('action.close'), class: 'mc-icon-button' });\n closeBtn.appendChild(icon('x', 14));\n closeBtn.addEventListener('mouseenter', () => { closeBtn.style.borderColor = 'var(--ed-accent)'; });\n closeBtn.addEventListener('mouseleave', () => { closeBtn.style.borderColor = 'var(--ed-line)'; });\n closeBtn.addEventListener('click', () => this.core.setState({ libraryOpen: false, exportOpen: false, aiOpen: false, codeOpen: false, assetTarget: null, libHot: false }));\n tip(closeBtn, t('action.close'), 'down', 'end');\n head.append(headText, closeBtn);\n modal.appendChild(head);\n\n const body = elS('div', 'padding: 20px; display: grid; gap: 14px;');\n body.appendChild(elS('p', 'margin: 0; padding: 10px 12px; border: 1px solid var(--ed-line); border-radius: 8px; background: var(--ed-panel-2); color: var(--ed-muted); font-size: 12px; line-height: 1.5;', { text: t('ai.disclosure'), 'data-i18n': 'ai.disclosure' }));\n const row = elS('div', 'display: grid; grid-template-columns: 1fr 1fr; gap: 14px;');\n\n const goalWrap = elS('div');\n goalWrap.appendChild(elS('label', 'display: block; font-size: 11.5px; color: var(--ed-muted); margin-bottom: 4px;', { text: t('ai.goal'), 'data-i18n': 'ai.goal' }));\n this.aiGoalSelect = elS('select', 'width: 100%; box-sizing: border-box; background: var(--ed-panel-2); border: 1px solid var(--ed-line); color: var(--ed-text); font: inherit; font-size: 13px; padding: 8px;');\n this.aiGoalSelect.addEventListener('change', (e) => this.core.setState({ aiGoal: e.target.value }));\n // Filled once here rather than on every render: the lists are static, and\n // sixteen goals under two <optgroup> headings stay scannable where one flat\n // run of sixteen would not.\n AI_GOALS.forEach((g) => {\n const grp = document.createElement('optgroup');\n grp.label = g.group;\n g.items.forEach((name) => { const o = document.createElement('option'); o.value = name; o.textContent = name; grp.appendChild(o); });\n this.aiGoalSelect.appendChild(grp);\n });\n goalWrap.appendChild(this.aiGoalSelect);\n\n const toneWrap = elS('div');\n toneWrap.appendChild(elS('label', 'display: block; font-size: 11.5px; color: var(--ed-muted); margin-bottom: 4px;', { text: t('ai.tone'), 'data-i18n': 'ai.tone' }));\n this.aiToneSelect = elS('select', 'width: 100%; box-sizing: border-box; background: var(--ed-panel-2); border: 1px solid var(--ed-line); color: var(--ed-text); font: inherit; font-size: 13px; padding: 8px;');\n this.aiToneSelect.addEventListener('change', (e) => this.core.setState({ aiTone: e.target.value }));\n AI_TONES.forEach((tone) => { const o = document.createElement('option'); o.value = tone; o.textContent = tone; this.aiToneSelect.appendChild(o); });\n toneWrap.appendChild(this.aiToneSelect);\n row.append(goalWrap, toneWrap);\n body.appendChild(row);\n\n const briefWrap = elS('div');\n briefWrap.appendChild(elS('label', 'display: block; font-size: 11.5px; color: var(--ed-muted); margin-bottom: 4px;', { text: t('ai.briefLabel'), 'data-i18n': 'ai.briefLabel' }));\n this.aiBriefInput = elS('textarea', 'width: 100%; min-height: 78px; box-sizing: border-box; background: var(--ed-panel-2); border: 1px solid var(--ed-line); color: var(--ed-text); font: inherit; font-size: 13px; padding: 9px; resize: vertical;', { placeholder: t('ai.briefPlaceholder'), 'data-i18n-placeholder': 'ai.briefPlaceholder', 'data-focus-key': 'ai-brief' });\n this.aiBriefInput.addEventListener('focus', () => { this.aiBriefInput.style.borderColor = 'var(--ed-accent)'; this.aiBriefInput.style.outline = 'none'; });\n // Debounced with a blur flush: runAi reads state.aiBrief, and clicking\n // Generate blurs this field first -- the flush lands the last keystrokes\n // before the read.\n const briefCommit = typeCommit((v) => this.core.setState({ aiBrief: v }));\n this.aiBriefInput.addEventListener('blur', () => { this.aiBriefInput.style.borderColor = 'var(--ed-line)'; briefCommit.flush(); });\n this.aiBriefInput.addEventListener('input', (e) => briefCommit.call(e.target.value));\n briefWrap.appendChild(this.aiBriefInput);\n body.appendChild(briefWrap);\n\n this.aiRunBtn = elS('button', 'border: 0; background: var(--ed-accent); color: var(--ed-accent-ink); cursor: pointer; min-height: 36px; padding: 9px 12px; display: flex; align-items: center; justify-content: center; gap: 8px; font-family: var(--ed-font); font-weight: 600; font-size: 12px; transition: filter 0.16s;', { type: 'button', class: 'mc-icon-label' });\n this.aiRunBtn.iconNode = icon('spark', 14);\n this.aiRunBtn.labelNode = elS('span');\n this.aiRunBtn.append(this.aiRunBtn.iconNode, this.aiRunBtn.labelNode);\n this.aiRunBtn.addEventListener('mouseenter', () => { this.aiRunBtn.style.filter = 'brightness(1.1)'; });\n this.aiRunBtn.addEventListener('mouseleave', () => { this.aiRunBtn.style.filter = ''; });\n this.aiRunBtn.addEventListener('click', () => this.core.runAi());\n body.appendChild(this.aiRunBtn);\n\n this.aiResultsEl = elS('div');\n body.appendChild(this.aiResultsEl);\n modal.appendChild(body);\n return overlay;\n }\n\n renderAiModal() {\n const s = this.core.state;\n const t = this.core.t;\n this.aiModal.style.display = s.aiOpen ? 'flex' : 'none';\n if (!s.aiOpen) return;\n // Options are built once in buildAiModal; render only reflects state.\n this.aiGoalSelect.value = s.aiGoal;\n this.aiToneSelect.value = s.aiTone;\n if (this.aiBriefInput.value !== s.aiBrief) this.aiBriefInput.value = s.aiBrief;\n this.aiRunBtn.disabled = s.aiBusy;\n this.aiRunBtn.labelNode.textContent = s.aiBusy ? t('ai.writing') : t('ai.generate');\n\n this.aiResultsEl.innerHTML = '';\n s.aiResults.forEach((r) => {\n const card = elS('div', 'position: relative; border: 1px solid var(--ed-line); border-radius: var(--ed-radius-sm); padding: 15px;');\n card.appendChild(elS('div', 'font-family: var(--ed-font); font-size: 10px; font-weight: 700; letter-spacing: 0.09em; text-transform: uppercase; color: var(--ed-accent); margin-bottom: 7px;', { text: r.kind }));\n card.appendChild(elS('div', 'font-size: 14px; line-height: 1.55; white-space: pre-wrap;', { text: r.text }));\n const useBtn = elS('button', 'margin-top: 12px; border: 1px solid var(--ed-line); background: transparent; color: var(--ed-text); cursor: pointer; padding: 6px 11px; font-family: ui-monospace, monospace; font-size: 9.5px; letter-spacing: 0.12em; text-transform: uppercase; transition: background 0.16s, color 0.16s, border-color 0.16s;', { type: 'button', text: r.action });\n useBtn.addEventListener('mouseenter', () => { useBtn.style.background = 'var(--ed-accent)'; useBtn.style.color = 'var(--ed-accent-ink)'; useBtn.style.borderColor = 'var(--ed-accent)'; });\n useBtn.addEventListener('mouseleave', () => { useBtn.style.background = 'transparent'; useBtn.style.color = 'var(--ed-text)'; useBtn.style.borderColor = 'var(--ed-line)'; });\n useBtn.addEventListener('click', r.onUse);\n card.appendChild(useBtn);\n this.aiResultsEl.appendChild(card);\n });\n }\n\n // ---- modals: preview ----------------------------------------------------\n\n buildPreviewModal() {\n const t = this.core.t;\n const overlay = elS('div', '', { class: 'mc-fullscreen-panel mc-preview-panel' });\n overlay.style.cssText = 'position: absolute; inset: 0; z-index: 60; display: grid; grid-template-rows: 58px minmax(0, 1fr); animation: mcFade 0.16s ease; display: none;';\n const head = elS('div', 'display: flex; align-items: center; gap: 12px; padding: 0 20px; border-bottom: 1px solid var(--ed-line); background: var(--ed-panel);', { class: 'mc-preview-toolbar' });\n const headText = elS('div', 'flex: 1; min-width: 0;');\n this.previewKickerEl = elS('div', 'font-family: var(--ed-font); font-size: 10px; font-weight: 700; letter-spacing: 0.09em; text-transform: uppercase; color: var(--ed-muted);', { class: 'mc-preview-kicker' });\n headText.append(this.previewKickerEl);\n this.previewDeviceSeg = elS('div', '', { class: 'mc-segment' });\n const closeBtn = elS('button', 'border: 1px solid var(--ed-line); background: transparent; color: var(--ed-text); cursor: pointer; height: 30px; padding: 0 13px; display: flex; align-items: center; gap: 6px; font-family: var(--ed-font); font-size: 11px; font-weight: 600; transition: border-color 0.16s, background 0.16s;', { type: 'button' });\n closeBtn.appendChild(icon('x', 14));\n closeBtn.appendChild(elS('span', '', { text: t('action.close'), 'data-i18n': 'action.close' }));\n closeBtn.addEventListener('mouseenter', () => { closeBtn.style.borderColor = 'var(--ed-accent)'; closeBtn.style.background = 'var(--ed-soft)'; });\n closeBtn.addEventListener('mouseleave', () => { closeBtn.style.borderColor = 'var(--ed-line)'; closeBtn.style.background = 'transparent'; });\n closeBtn.addEventListener('click', () => this.core.setState({ previewOpen: false }));\n head.append(headText, this.previewDeviceSeg, closeBtn);\n overlay.appendChild(head);\n const body = elS('div', 'overflow-y: auto; padding: 32px 24px;', { class: 'mc-preview-body' });\n this.previewSlot = elS('div', '', { class: 'mc-sheet-wrap' });\n this.previewSlot.style.cssText = 'display: flex; justify-content: center;';\n body.appendChild(this.previewSlot);\n overlay.appendChild(body);\n return overlay;\n }\n\n renderPreviewModal() {\n const s = this.core.state;\n const t = this.core.t;\n this.previewModal.style.display = s.previewOpen ? 'grid' : 'none';\n if (!s.previewOpen) return;\n this.previewKickerEl.textContent = s.device === 'mobile' ? t('preview.kickerMobile') : t('preview.kickerDesktop', { width: s.doc.theme.width });\n this.previewDeviceSeg.innerHTML = '';\n [\n { label: t('device.desktop'), v: 'desktop', iconName: 'monitor' }, { label: t('device.mobile'), v: 'mobile', iconName: 'phone' },\n ].forEach((d) => {\n const on = s.device === d.v;\n const btn = elS('button', `width: 32px; height: 26px; display: flex; align-items: center; justify-content: center; background: ${this.segBg(on)}; color: ${this.segFg(on)};`, { type: 'button', title: d.label, 'aria-pressed': String(on) });\n btn.appendChild(icon(d.iconName, 15));\n btn.addEventListener('click', () => this.core.setState({ device: d.v }));\n tip(btn, d.label, 'down');\n this.previewDeviceSeg.appendChild(btn);\n });\n this.previewSlot.innerHTML = '';\n this.previewSlot.appendChild(renderDoc(this.core, false));\n }\n}\n\n/** Ported from `blockTiles` inside `renderVals()` -- `icon` is a factory (not a built node) since a DOM node can only ever be attached in one place. */\nfunction paletteTiles(core) {\n const rowCount = () => core.state.doc.rows.length;\n return PALETTE.map((e) => {\n if (e.g) {\n const gr = GROUPS[e.g];\n return {\n label: gr.label, icon: () => icon(gr.icon, 20),\n hint: gr.label + ' — drops a row of ordinary blocks you can edit and rearrange one by one',\n onDragStart: core.startDrag({ kind: 'group', id: e.g }),\n onAdd: () => core.insertGroup(e.g, null, 0, rowCount()),\n };\n }\n const b = DEF(e.t); if (!b) return null;\n return {\n label: b.label, icon: () => icon(b.type, 20), hint: b.hint + ' — drag onto the canvas, or double-click to append',\n onDragStart: core.startDrag({ kind: 'block', type: b.type }),\n onAdd: () => core.insertBlock(b.type, null, 0, rowCount()),\n };\n }).filter(Boolean);\n}\n\n// Guarded on both sides. `customElements` is absent under SSR (Next.js, Nuxt,\n// Angular Universal) and in any Node-based test runner, where importing the\n// package must not throw; and `define` throws NotSupportedError if the module\n// is evaluated twice -- HMR, or a bundled and an ESM copy loaded side by side.\nif (typeof customElements !== 'undefined' && !customElements.get('mailcraft-editor')) {\n customElements.define('mailcraft-editor', MailCraftEditor);\n}\n\nObject.assign(exports, { MailCraftEditor });\n\n};\n__modules[\"render/block-body.js\"] = function(module, exports, __require) {\nconst {icon, brandIcon, socialKey, SOCIAL_BRAND, contrastInk} = __require(\"core/icons.js\");\nconst {pad} = __require(\"core/layout-style.js\");\nconst {parseItems, cellsOf} = __require(\"core/parse.js\");\n\nfunction el(tag, style, attrs) {\n const node = document.createElement(tag);\n if (style) Object.assign(node.style, style);\n if (attrs) for (const [k, v] of Object.entries(attrs)) {\n if (k === 'html') node.innerHTML = v;\n else if (k === 'text') node.textContent = v;\n else if (v !== undefined) node.setAttribute(k, v);\n }\n return node;\n}\n\nfunction m(v) { return String(v == null ? '' : v); }\n\n/** An explicit block font owns every rich descendant; an empty value deliberately leaves imported inline typography untouched. */\nfunction overrideRichFont(root, fontFamily) {\n if (!fontFamily) return;\n root.querySelectorAll('[style]').forEach((node) => node.style.removeProperty('font-family'));\n}\n\n/**\n * Ported from the original `blockBody(b, theme, live)`. `ctx` supplies the\n * editing wiring that in the original lived on `this` (Component instance):\n * `ctx.editingId`, `ctx.onFocus(block, el, key)`, `ctx.onBlur(block, key, value)`,\n * `ctx.onPaste(block, plainOnly)`, `ctx.renderRte(block)` (returns the floating\n * toolbar node or null), `ctx.onTableCellBlur(block, ri, ci, value)`, `ctx.now`\n * (for the countdown), `ctx.vars` and `ctx.onInsertVariable` for the code-view escape hatch.\n */\nfunction blockBody(b, theme, live, ctx) {\n const p = b.props; const t = theme;\n const attr = live ? { 'data-mc-content': b.id } : {};\n\n switch (b.type) {\n case 'text': {\n const edit = live;\n const content = el('div', {\n padding: pad(p), fontSize: p.size + 'px', lineHeight: p.lh, textAlign: p.align, fontWeight: p.weight, color: p.color || t.text, outline: 'none', fontFamily: p.fontFamily || t.font,\n }, { ...attr, contenteditable: edit ? 'true' : undefined, spellcheck: 'false', html: m(p.html), 'data-focus-key': edit ? 'block:' + b.id : undefined });\n // Imported email HTML keeps inline font-family declarations so an\n // untouched block retains its source typography. Once the user chooses\n // a block font, however, those nested declarations outrank inheritance\n // from this wrapper and made the Font control appear broken. Remove only\n // that imported property from descendants; their size, color, spacing\n // and other inline formatting remain intact, while the selected family\n // now applies consistently in the canvas and exported read-back DOM.\n overrideRichFont(content, p.fontFamily);\n if (edit) wireEditable(content, b, 'html', ctx, false);\n if (!live) return content;\n return wrapWithRte(b, ctx, edit && ctx.editingId === b.id, content);\n }\n case 'image': {\n const wrap = el('div', { padding: pad(p), textAlign: p.align, fontSize: '0' }, attr);\n if (p.href) {\n // The % width must live on the anchor, not the img: a percentage on a\n // child of a shrink-to-fit inline-block resolves against the image's\n // own intrinsic size (i.e. not at all), which rendered every linked\n // logo/icon at full intrinsic width no matter what `width` said.\n const a = el('a', { display: 'inline-block', width: p.width + '%' }, { href: p.href });\n a.appendChild(el('img', { width: '100%', borderRadius: p.radius + 'px', display: 'block', border: '0' }, { src: p.src, alt: p.alt }));\n wrap.appendChild(a);\n } else {\n wrap.appendChild(el('img', { width: p.width + '%', maxWidth: '100%', borderRadius: p.radius + 'px', display: 'inline-block', border: '0' }, { src: p.src, alt: p.alt }));\n }\n return wrap;\n }\n case 'button': {\n const wrap = el('div', { textAlign: p.align, padding: '4px 0' }, attr);\n const a = el('a', {\n display: p.full ? 'block' : 'inline-block', background: p.bg, color: p.color, textDecoration: 'none',\n padding: p.py + 'px ' + p.px + 'px', borderRadius: p.radius + 'px', fontFamily: p.fontFamily || t.font, fontSize: p.size + 'px',\n fontWeight: '600', letterSpacing: '0.02em', outline: 'none',\n // Outline-style buttons (transparent fill + border) are a standard\n // email pattern; the color falls back to the label color so a bare\n // \"outline thickness\" bump looks right without a second step.\n border: p.borderW ? p.borderW + 'px ' + (p.borderStyle || 'solid') + ' ' + (p.borderColor || p.color) : '0',\n }, { href: p.href, contenteditable: live ? 'true' : undefined, spellcheck: 'false', text: p.label });\n a.addEventListener('click', (e) => e.preventDefault());\n // Button editing is deliberately plain: no focus-tracked `editing` state, no\n // paste handling, no floating RTE toolbar -- only its label commits on blur.\n if (live) a.addEventListener('blur', (e) => { if (e.target.textContent !== p.label) ctx.onBlur(b, 'label', e.target.textContent); });\n wrap.appendChild(a);\n return wrap;\n }\n case 'divider': {\n const wrap = el('div', { padding: p.py + 'px 0' }, attr);\n wrap.appendChild(el('div', { height: '0', width: p.width + '%', margin: '0 auto', borderTop: p.thickness + 'px ' + (p.lineStyle || 'solid') + ' ' + p.color }));\n return wrap;\n }\n case 'spacer':\n return el('div', { height: p.height + 'px' }, attr);\n case 'social': {\n // Two independent axes cover every style the block offers without a\n // second hand-drawn icon set per platform: `palette` picks the source\n // color (the block's one `color` prop, or each platform's own brand\n // hex), `shape` picks the container -- bordered tap-target, bare icon,\n // or a filled circle/square badge (the badge's icon color auto-flips\n // black/white via `contrastInk` so light brand colors like Snapchat\n // yellow stay legible).\n const shape = p.shape || 'outline';\n const palette = p.palette || 'custom';\n const badge = shape === 'circle' || shape === 'square';\n const box = Math.round((p.size || 20) * 1.9);\n const wrap = el('div', { textAlign: p.align, padding: '8px 0' }, attr);\n parseItems(p.items).forEach((it) => {\n const key = socialKey(it.label);\n const source = palette === 'brand' ? (SOCIAL_BRAND[key] || p.color) : p.color;\n const iconColor = badge ? contrastInk(source) : source;\n const a = el('a', {\n display: 'inline-flex', flexDirection: p.showLabel ? 'column' : 'row', alignItems: 'center', justifyContent: 'center', gap: '5px',\n width: p.showLabel ? 'auto' : box + 'px', height: p.showLabel ? 'auto' : box + 'px', padding: p.showLabel ? '7px 9px' : '0',\n margin: '0 ' + (p.gap || 12) / 2 + 'px', verticalAlign: 'middle', textDecoration: 'none',\n borderRadius: shape === 'circle' ? '50%' : shape === 'square' ? Math.round(box * 0.28) + 'px' : '0',\n color: iconColor, background: badge ? source : 'transparent',\n border: shape === 'outline' ? '1px solid ' + source : '0',\n }, { href: it.href, title: it.label });\n a.addEventListener('click', (e) => e.preventDefault());\n let provided = null;\n if (ctx && ctx.iconProvider) { try { provided = ctx.iconProvider(key, { label: it.label, size: p.size, color: iconColor }); } catch { provided = null; } }\n a.appendChild(provided instanceof Node ? provided : brandIcon(key, p.size));\n if (p.showLabel) {\n const span = el('span', { fontFamily: p.fontFamily || t.font, fontSize: '10px', letterSpacing: '0.12em', textTransform: 'uppercase' }, { text: it.label });\n a.appendChild(span);\n }\n wrap.appendChild(a);\n });\n return wrap;\n }\n case 'video': {\n const wrap = el('div', { padding: '4px 0', textAlign: 'center' }, attr);\n const a = el('a', { display: 'block', position: 'relative' }, { href: p.href });\n a.addEventListener('click', (e) => e.preventDefault());\n a.appendChild(el('img', { width: '100%', display: 'block', border: '0' }, { src: p.src, alt: p.caption }));\n const badge = el('span', { position: 'absolute', inset: '0', display: 'flex', alignItems: 'center', justifyContent: 'center' });\n const circle = el('span', { width: '54px', height: '54px', borderRadius: '50%', background: p.badge, color: '#fff', display: 'flex', alignItems: 'center', justifyContent: 'center', fontSize: '18px', paddingLeft: '4px' }, { text: '▶' });\n badge.appendChild(circle);\n a.appendChild(badge);\n wrap.appendChild(a);\n wrap.appendChild(el('div', { fontFamily: t.font, fontSize: '12.5px', color: p.badge, opacity: '0.7', marginTop: '8px' }, { text: p.caption }));\n return wrap;\n }\n case 'html': {\n const raw = String(p.code || '');\n const edit = live && !/<style|<scr/i.test(raw);\n const safe = live\n ? raw.replace(/<style([^>]*)>([\\s\\S]*?)<\\/style>/gi, (mm, at, css) => '<style' + at + '>' + ctx.scopeCss(css, '[data-mc-sheet]') + '</style>')\n : raw;\n const content = el('div', { padding: '6px 0', fontFamily: t.font, color: t.text, outline: 'none' }, { ...attr, contenteditable: edit ? 'true' : undefined, spellcheck: 'false', html: m(safe), 'data-focus-key': edit ? 'block:' + b.id : undefined });\n if (edit) wireEditable(content, b, 'code', ctx, false);\n if (!live) return content;\n return wrapWithRte(b, ctx, edit && ctx.editingId === b.id, content);\n }\n case 'countdown': {\n const ms = Math.max(0, new Date(p.target).getTime() - ctx.now);\n const parts = [['days', Math.floor(ms / 86400000)], ['hrs', Math.floor(ms / 3600000) % 24], ['min', Math.floor(ms / 60000) % 60], ['sec', Math.floor(ms / 1000) % 60]];\n // The data-mc-countdown/data-mc-count hooks (live canvas only -- export\n // reads this DOM back) let the 1s tick repaint just these digits\n // instead of re-rendering the editor (see the tick in editor-core.js).\n const wrap = el('div', { padding: '10px 0', textAlign: 'center', fontFamily: p.fontFamily || t.font, color: p.color }, live ? Object.assign({ 'data-mc-countdown': p.target }, attr) : attr);\n wrap.appendChild(el('div', { fontSize: '12px', letterSpacing: '0.14em', textTransform: 'uppercase', opacity: '0.6', marginBottom: '10px' }, { text: p.label }));\n const row = el('div', { display: 'flex', justifyContent: 'center', gap: '10px' });\n parts.forEach(([lab, v]) => {\n const box = el('div', { border: '1px solid ' + p.color + '33', padding: '9px 12px', minWidth: '58px' });\n box.appendChild(el('div', { fontSize: '25px', fontFamily: p.fontFamily || t.font, fontWeight: '700', lineHeight: '1' }, live ? { text: String(v).padStart(2, '0'), 'data-mc-count': lab } : { text: String(v).padStart(2, '0') }));\n box.appendChild(el('div', { fontSize: '9.5px', letterSpacing: '0.16em', textTransform: 'uppercase', opacity: '0.55', marginTop: '4px' }, { text: lab }));\n row.appendChild(box);\n });\n wrap.appendChild(row);\n return wrap;\n }\n case 'menu': {\n const wrap = el('div', { textAlign: p.align, padding: '10px 0' }, attr);\n parseItems(p.items).forEach((it) => {\n const a = el('a', { color: p.color, fontSize: p.size + 'px', fontFamily: p.fontFamily || t.font, textDecoration: 'none', margin: '0 ' + p.gap / 2 + 'px', letterSpacing: '0.12em', textTransform: 'uppercase' }, { href: it.href, text: it.label });\n a.addEventListener('click', (e) => e.preventDefault());\n wrap.appendChild(a);\n });\n return wrap;\n }\n case 'heading': {\n const edit = live;\n const head = el(p.level || 'h2', {\n margin: '0', padding: pad(p), fontSize: p.size + 'px', lineHeight: p.lh, textAlign: p.align,\n fontWeight: p.weight, letterSpacing: p.font === 'condensed' ? '0.005em' : '-0.01em',\n color: p.color || t.text, outline: 'none',\n // An explicit per-block font beats the Condensed/Body style toggle.\n fontFamily: p.fontFamily || (p.font === 'condensed' ? \"'Arial Narrow', 'Helvetica Neue Condensed', Helvetica, Arial, sans-serif\" : t.font),\n }, { ...attr, contenteditable: edit ? 'true' : undefined, spellcheck: 'false', text: m(p.text), 'data-focus-key': edit ? 'block:' + b.id : undefined });\n if (edit) wireEditable(head, b, 'text', ctx, true);\n if (!live) return head;\n return wrapWithRte(b, ctx, ctx.editingId === b.id, head);\n }\n case 'list': {\n const items = String(p.items || '').split('\\n').filter((l) => l.trim());\n const list = el(p.ordered ? 'ol' : 'ul', { margin: '0', padding: (p.py || 0) + 'px 0 ' + (p.py || 0) + 'px 22px', fontFamily: p.fontFamily || t.font, fontSize: p.size + 'px', lineHeight: p.lh, color: p.color || t.text }, attr);\n items.forEach((it) => {\n const li = el('li', { marginBottom: p.gap + 'px' }, { html: m(it) });\n list.appendChild(li);\n });\n overrideRichFont(list, p.fontFamily);\n return list;\n }\n case 'table': {\n const rows = cellsOf(p);\n const edit = live;\n const line = p.borders ? (p.borderWidth || 1) + 'px ' + (p.borderStyle || 'solid') + ' ' + p.lineColor : '0';\n const table = el('table', { width: p.width + '%', borderCollapse: 'collapse', fontFamily: p.fontFamily || t.font, fontSize: p.size + 'px', color: t.text, border: line }, { ...attr, cellpadding: '0', cellspacing: '0' });\n const tbody = el('tbody');\n rows.forEach((row, ri) => {\n const isHead = p.header && ri === 0;\n const tr = el('tr', { background: isHead ? p.headBg : (p.striped && ri % 2 === 0 ? 'rgba(29,31,32,0.028)' : 'transparent') });\n row.forEach((cell, ci) => {\n const td = el(isHead ? 'th' : 'td', {\n border: line, padding: p.pad + 'px ' + Math.round(p.pad * 1.2) + 'px', textAlign: ci === 0 ? p.align : (isHead ? p.align : 'left'),\n fontWeight: isHead ? '600' : '400', outline: 'none',\n fontFamily: p.fontFamily || t.font,\n letterSpacing: isHead ? '0.06em' : 'normal', textTransform: isHead ? 'uppercase' : 'none', fontSize: isHead ? p.size + 1 + 'px' : p.size + 'px',\n }, { contenteditable: edit ? 'true' : undefined, spellcheck: 'false', text: m(cell), 'data-focus-key': edit ? 'block:' + b.id + ':c' + ri + '-' + ci : undefined });\n if (edit) {\n // stopPropagation is load-bearing (a bubbled click would select\n // via the block wrapper AND deselect via the workspace), but it\n // also meant clicking a cell never selected the table at all --\n // the cells cover the whole block. Selecting on *focus* instead,\n // with the focus key above letting focus-preserve restore the\n // caret across the selection re-render, gives the table the same\n // click-to-select behavior as a text block.\n td.addEventListener('click', (e) => e.stopPropagation());\n td.addEventListener('focus', () => { if (ctx.selectBlock) ctx.selectBlock(b); });\n td.addEventListener('blur', () => ctx.onTableCellBlur(b, ri, ci, td.textContent));\n }\n tr.appendChild(td);\n });\n tbody.appendChild(tr);\n });\n table.appendChild(tbody);\n return table;\n }\n case 'embed': {\n const wrap = el('div', { padding: p.py + 'px 0' }, attr);\n wrap.appendChild(el('iframe', { width: '100%', height: p.height + 'px', border: '1px solid rgba(29,31,32,0.14)', background: '#fff', display: 'block' }, { src: p.src, title: p.label }));\n return wrap;\n }\n case 'css': {\n const wrap = el('div', { fontSize: '0', lineHeight: '0' }, attr);\n wrap.appendChild(el('style', {}, { html: live ? ctx.scopeCss(p.code, '[data-mc-sheet]') : p.code }));\n if (live) {\n wrap.appendChild(el('div', { fontFamily: 'ui-monospace, monospace', fontSize: '10px', lineHeight: '1.5', letterSpacing: '0.06em', textTransform: 'uppercase', color: '#7d8791', border: '1px dashed rgba(89,128,166,0.5)', padding: '8px 10px' }, { text: 'style block — ' + (p.code || '').length + ' chars, hidden when sent' }));\n }\n return wrap;\n }\n case 'box': {\n const edit = live;\n const borderSide = (on) => (p.border && on !== false ? p.border + 'px ' + (p.borderStyle || 'solid') + ' ' + p.lineColor : '0');\n const box = el('div', {\n background: p.bgImage ? 'linear-gradient(rgba(0,0,0,0), rgba(0,0,0,0)), url(\"' + p.bgImage + '\")' : p.bg,\n backgroundSize: 'cover', backgroundPosition: 'center',\n borderTop: borderSide(p.topBorder), borderRight: borderSide(p.rightBorder),\n borderBottom: borderSide(p.bottomBorder), borderLeft: borderSide(p.leftBorder),\n borderRadius: p.radius + 'px', padding: p.pad + 'px', textAlign: p.align,\n minHeight: p.minH ? p.minH + 'px' : 'auto', maxWidth: p.maxW + '%', margin: p.align === 'center' ? '0 auto' : '0',\n boxShadow: p.shadow ? '0 10px 30px rgba(29,31,32,0.12)' : 'none',\n fontFamily: t.font, color: t.text, fontSize: '15px', lineHeight: '1.6',\n }, { ...attr, contenteditable: edit ? 'true' : undefined, spellcheck: 'false', html: m(p.html), 'data-focus-key': edit ? 'block:' + b.id : undefined });\n if (edit) wireEditable(box, b, 'html', ctx, false);\n if (!live) return box;\n return wrapWithRte(b, ctx, ctx.editingId === b.id, box);\n }\n case 'svg':\n return el('div', { padding: p.py + 'px 0', textAlign: p.align }, { ...attr, html: '<span style=\"display:inline-block;width:' + p.width + '%\">' + p.code + '</span>' });\n case 'codeblock':\n return el('pre', { margin: '0', padding: p.pad + 'px', background: p.bg, color: p.color, fontFamily: 'ui-monospace, Menlo, monospace', fontSize: p.size + 'px', lineHeight: '1.6', overflowX: 'auto', whiteSpace: 'pre' }, { ...attr, text: m(p.code) });\n default:\n return el('div');\n }\n}\n\nfunction wireEditable(node, block, key, ctx, isPlainText) {\n node.addEventListener('paste', (e) => ctx.onPaste(e, isPlainText));\n node.addEventListener('focus', (e) => ctx.onFocus(block, e.currentTarget, key, isPlainText));\n node.addEventListener('blur', (e) => {\n if (ctx.rteActiveRef && ctx.rteActiveRef.current) return;\n const val = isPlainText ? e.target.textContent : e.target.innerHTML;\n ctx.onBlur(block, key, val);\n });\n}\n\n/** `h('div',{style:{position:'relative'}}, editing===b.id ? this.rte(b) : null, content)` */\nfunction wrapWithRte(block, ctx, showRte, content) {\n const wrap = el('div', { position: 'relative' });\n if (showRte) wrap.appendChild(ctx.renderRte(block));\n wrap.appendChild(content);\n return wrap;\n}\n\nObject.assign(exports, { blockBody });\n\n};\n__modules[\"render/canvas.js\"] = function(module, exports, __require) {\nconst {DEF} = __require(\"core/blocks.js\");\nconst {boxStyle, rowBg, rowPad, colsWrap, colStyle} = __require(\"core/layout-style.js\");\nconst {scopeCss} = __require(\"core/sanitize.js\");\nconst {cellsOf} = __require(\"core/parse.js\");\nconst {icon} = __require(\"core/icons.js\");\nconst {blockBody} = __require(\"render/block-body.js\");\nconst {renderRte} = __require(\"render/rte.js\");\n\nfunction el(tag, style, attrs) {\n const node = document.createElement(tag);\n if (style) Object.assign(node.style, style);\n if (attrs) for (const [k, v] of Object.entries(attrs)) {\n if (k === 'text') node.textContent = v;\n else if (v !== undefined) node.setAttribute(k, v);\n }\n return node;\n}\n\n/**\n * Ported from `dropLine(active, key)`, but decoupled from React/state: the\n * original re-rendered the whole tree on every `dragover` (cheap for React,\n * since its reconciler patches only the one changed node); this renderer has\n * no diffing, so doing the same would rebuild the entire canvas on every\n * pixel of mouse movement while dragging -- exactly what made drag-and-drop\n * (and hover, below) feel un-smooth. Instead, drop lines are built once per\n * render and toggled directly via `showLine`/`hideActive`, with no state\n * change and no re-render involved.\n */\nfunction dropLine() {\n return el('div', { height: '0', background: 'var(--ed-accent-sheet)', margin: '0', transition: 'height 0.1s', boxShadow: 'none' });\n}\n\nfunction showLine(tracker, line) {\n if (tracker.active && tracker.active !== line) hideLine(tracker.active);\n line.style.height = '3px'; line.style.margin = '3px 0'; line.style.boxShadow = '0 0 0 1px var(--ed-accent-sheet)';\n tracker.active = line;\n}\n\nfunction hideLine(line) {\n line.style.height = '0'; line.style.margin = '0'; line.style.boxShadow = 'none';\n}\n\nfunction hideActive(tracker) {\n if (tracker.active) { hideLine(tracker.active); tracker.active = null; }\n}\n\n/** Ported from `toolbar(id, kind, code)` -- the small floating control shown on the selected row/block. */\nfunction toolbar(core, id, kind, code) {\n const btn = (name, title, fn, danger) => {\n const node = el('button', { position: 'relative', border: '0', background: 'transparent', color: danger ? '#ffdad8' : '#fff', cursor: 'pointer', width: '23px', height: '22px', display: 'flex', alignItems: 'center', justifyContent: 'center' }, { type: 'button', title, 'aria-label': title, 'data-tip': '1' });\n node.appendChild(icon(name, 13));\n node.appendChild(el('span', {}, { class: 'mc-tooltip mc-tooltip-up', text: title }));\n node.addEventListener('mousedown', (e) => e.stopPropagation());\n node.addEventListener('click', (e) => { e.stopPropagation(); fn(); });\n return node;\n };\n // --ed-accent-sheet, not --ed-accent, on purpose: this pill sits on the\n // canvas/email sheet, which stays the document's own light page regardless\n // of editor chrome dark mode. The sheet family is the brand accent fitted\n // against white (core/accent.js), so it keeps its contrast in both chrome\n // themes -- while still following a host's `accent`.\n const root = el('div', { position: 'absolute', top: '-12px', right: '6px', display: 'flex', alignItems: 'center', gap: '1px', background: kind === 'row' ? '#172033' : 'var(--ed-accent-sheet)', borderRadius: '6px', padding: '2px 3px', zIndex: '6', boxShadow: '0 3px 10px rgba(15,23,42,0.28)' });\n root.appendChild(el('span', { fontFamily: 'ui-monospace,monospace', fontSize: '8.5px', letterSpacing: '0.14em', color: kind === 'row' ? '#fff' : 'var(--ed-accent-sheet-ink)', opacity: '0.7', padding: '0 5px' }, { text: code }));\n root.appendChild(btn('up', 'Move up', () => core.nudge(id, -1)));\n root.appendChild(btn('down', 'Move down', () => core.nudge(id, 1)));\n root.appendChild(btn('copy', 'Duplicate', () => { core.setState({ sel: { type: kind, id } }, () => core.dupSel()); }));\n root.appendChild(btn('trash', 'Delete', () => { core.setState({ sel: { type: kind, id } }, () => core.delSel()); }, true));\n return root;\n}\n\n/**\n * Selected-row controls: square accent buttons pinned inside the row's\n * top-right corner (delete + duplicate; reordering is the left drag badge).\n * On --ed-accent-sheet like `toolbar` above and for the same reason: the\n * email sheet stays a light page in both chrome themes, and a dark-chrome\n * `--ed-accent` -- light enough to read on the dark panels -- would wash out\n * against it.\n */\nfunction rowActions(core, id) {\n const btn = (name, title, fn) => {\n const node = el('button', { position: 'relative', border: '0', background: 'var(--ed-accent-sheet)', color: 'var(--ed-accent-sheet-ink)', cursor: 'pointer', width: '26px', height: '26px', display: 'flex', alignItems: 'center', justifyContent: 'center', borderRadius: '4px', boxShadow: '0 2px 6px rgba(15,23,42,0.3)' }, { type: 'button', title, 'aria-label': title, 'data-tip': '1' });\n node.appendChild(icon(name, 14));\n node.appendChild(el('span', {}, { class: 'mc-tooltip mc-tooltip-up', text: title }));\n node.addEventListener('mousedown', (e) => e.stopPropagation());\n node.addEventListener('click', (e) => { e.stopPropagation(); fn(); });\n return node;\n };\n const root = el('div', { position: 'absolute', top: '6px', right: '6px', display: 'flex', gap: '4px', zIndex: '6' });\n root.appendChild(btn('trash', 'Delete', () => { core.setState({ sel: { type: 'row', id } }, () => core.delSel()); }));\n root.appendChild(btn('copy', 'Duplicate', () => { core.setState({ sel: { type: 'row', id } }, () => core.dupSel()); }));\n return root;\n}\n\nfunction blockCtx(core, editingBlockId) {\n return {\n editingId: editingBlockId,\n now: core.state.now,\n scopeCss,\n iconProvider: core.iconProvider,\n rteActiveRef: { get current() { return core.rteActive; } },\n // Also sets `sel` (not just `editing`): a real click both focuses the\n // contenteditable and fires a `click` on the wrapping block that would\n // normally call `core.select`. But focus's own setState already forces a\n // full canvas re-render (see focus-preserve.js), which replaces every\n // block's DOM node -- including the one mousedown/mouseup/click are\n // mid-gesture on -- so the browser drops that click (its target vanished\n // between mousedown and mouseup) and `core.select` never runs. Setting\n // `sel` here directly is what used to happen implicitly once the click\n // landed; without it, the block never shows selected (no border, no\n // duplicate/delete/move corner toolbar) even though the RTE toolbar,\n // which only depends on `editing`, still appears.\n // Guarded to a no-op once state already matches: restoring focus after a\n // rebuild (focus-preserve.js) calls `.focus()` on the freshly-created\n // node, which fires this same `focus` listener again. Without the guard\n // that re-fires `setState` -> re-render -> `.focus()` -> `setState` -> ...\n // forever (an infinite, stack-overflowing loop).\n onFocus: (block, node, key, isPlainText) => {\n core.editEl = node;\n core.editKey = key;\n core.editPlain = !!isPlainText;\n if (core.state.editing === block.id && core.state.sel && core.state.sel.type === 'block' && core.state.sel.id === block.id) return;\n // Snapshotted only on a genuine new focus (not the guarded no-op above,\n // which also covers every re-render-triggered refocus while typing --\n // see `syncLiveEdit`, mailcraft-editor.js). That sync keeps\n // `block.props[key]` continuously equal to the live DOM so re-renders\n // stop reverting what's mid-typing, which means by the time a real\n // blur fires, `value !== block.props[key]` is always false and the\n // edit would never commit (no undo entry, no autosave). Comparing\n // against the true pre-edit value captured here instead of the\n // continuously-synced prop is what makes onBlur's change check correct.\n core.editOriginal = block.props[key];\n core.setState({ editing: block.id, sel: { type: 'block', id: block.id }, tab: 'design' });\n },\n onBlur: (block, key, value) => {\n // A render tears down and rebuilds the whole canvas subtree (no diffing --\n // see the `dropLine` comment above); removing the still-focused node as\n // part of that forces a synchronous, spurious `blur` before the rebuilt\n // replacement can be focused. Committing on that blur (and worse, its\n // `editing: null` racing the render that's still in progress) is what\n // produced the onFocus <-> render infinite loop above -- `core.rendering`\n // (set for the render()'s duration, see mailcraft-editor.js) tells a real\n // blur apart from that artifact.\n if (core.rendering) return;\n if (core.rteActive) return;\n if (value !== core.editOriginal) core.setProp(block.id, key, value);\n if (core.state.editing === block.id) core.setState({ editing: null, linkDraft: null });\n },\n onPaste: (e, plainOnly) => core.pasteClean(plainOnly)(e),\n // Guarded to a no-op when already selected -- the selection re-render\n // refocuses the cell (focus-preserve), which fires `focus` again.\n selectBlock: (block) => {\n if (core.state.sel && core.state.sel.type === 'block' && core.state.sel.id === block.id) return;\n core.select('block', block.id);\n },\n onTableCellBlur: (block, ri, ci, val) => {\n const next = cellsOf(core.find(core.state.doc, block.id).block.props);\n if (next[ri] && next[ri][ci] !== val) { next[ri][ci] = val; core.setProp(block.id, 'data', next.map((r) => r.join('|')).join('\\n')); }\n },\n renderRte: (block) => renderRte(core, block),\n };\n}\n\n/** Ported from `renderDoc(live)`. `live=true` is the editable canvas, `live=false` is the static preview/export tree. */\nfunction renderDoc(core, live) {\n const d = core.state.doc; const theme = d.theme;\n const width = core.state.device === 'mobile' ? 375 : theme.width;\n const sel = core.state.sel;\n const ctx = blockCtx(core, core.state.editing);\n // Lives only for this render's drag gesture(s) -- no core state, no re-render.\n const rowDropTracker = { active: null };\n\n const root = el('div', {\n width: width + 'px', maxWidth: '100%', background: theme.contentBg, color: theme.text, fontFamily: theme.font,\n transition: 'width 0.28s cubic-bezier(0.22,0.61,0.36,1), background 0.2s',\n }, { 'data-mc-sheet': '1' });\n\n const rowLines = [];\n if (live) {\n root.addEventListener('dragover', (e) => {\n const dr = core.drag; if (!dr) return;\n e.preventDefault();\n const index = core.indexFromPoint(root, e.clientY);\n showLine(rowDropTracker, rowLines[index]);\n });\n root.addEventListener('dragleave', (e) => { if (e.target === root) hideActive(rowDropTracker); });\n root.addEventListener('drop', (e) => { hideActive(rowDropTracker); core.canvasDrop(e); });\n }\n\n d.rows.forEach((r, ri) => {\n if (live) { const line = dropLine(); rowLines.push(line); root.appendChild(line); }\n const isSel = live && sel && sel.id === r.id;\n\n const rowEl = el('div', Object.assign({ position: 'relative', padding: rowPad(r.props) }, rowBg(r.props)), { 'data-mc-slot': '1', class: live ? `mc-row-el${isSel ? ' is-selected' : ''}` : undefined });\n if (live) {\n rowEl.addEventListener('click', (e) => { e.stopPropagation(); core.select('row', r.id); });\n }\n if (isSel) rowEl.appendChild(rowActions(core, r.id));\n if (live) {\n // The grab target is the row's whole left edge, not just the visible\n // badge. Two reasons, both about `:hover`: the strip overlaps the row's\n // own left edge (it straddles the border so the round badge can sit\n // centered on it), because a gap there would be dead space between the\n // row's hover box and the grip's -- crossing it drops `:hover` on\n // `.mc-row-el` and hides the grip (display:none, see style.js) right as\n // the cursor arrives. And it spans the row's full height, because a\n // short handle pinned to the top has the same failure one axis over: on\n // a tall row, moving left from anywhere below the handle exits the row\n // before reaching it, so the grip blinks out and the section simply\n // cannot be picked up. The badge stays small; only the hit area grew.\n const grip = el('div', { position: 'absolute', left: '-14px', top: '0', bottom: '0', width: '28px', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', cursor: 'grab', zIndex: '6' }, { draggable: 'true', title: 'Drag to reorder section', 'aria-label': 'Drag to reorder section', class: 'mc-row-grip' });\n const gripHandle = el('div', { display: 'flex', alignItems: 'center', justifyContent: 'center', flex: 'none', width: '28px', height: '28px', borderRadius: '50%' }, { class: 'mc-row-grip-handle' });\n gripHandle.appendChild(icon('move', 15));\n grip.appendChild(gripHandle);\n grip.addEventListener('dragstart', core.startDrag({ kind: 'move-row', id: r.id }));\n grip.addEventListener('dragend', () => { core.drag = null; hideActive(rowDropTracker); });\n grip.addEventListener('click', (e) => { e.stopPropagation(); core.select('row', r.id); });\n rowEl.appendChild(grip);\n }\n\n const colsEl = el('div', colsWrap(r.props));\n r.cols.forEach((c, ci) => {\n const colLines = [];\n const items = [];\n c.blocks.forEach((b, bi) => {\n if (live) { const line = dropLine(); colLines.push(line); items.push(line); }\n const bSel = live && sel && sel.id === b.id;\n const bWrap = el('div', Object.assign({ position: 'relative' }, boxStyle(b.props)), { 'data-mc-slot': '1', draggable: live ? 'true' : undefined, class: live ? `mc-block-el${bSel ? ' is-selected' : ''}` : undefined });\n if (live) {\n bWrap.addEventListener('dragstart', core.startDrag({ kind: 'move-block', id: b.id }));\n bWrap.addEventListener('dragend', () => { core.drag = null; hideActive(rowDropTracker); hideActive(colTracker); });\n bWrap.addEventListener('click', (e) => { e.stopPropagation(); core.select('block', b.id); });\n }\n if (bSel) bWrap.appendChild(toolbar(core, b.id, 'block', DEF(b.type).code));\n bWrap.appendChild(blockBody(b, theme, live, ctx));\n items.push(bWrap);\n });\n let colTracker;\n if (live) {\n const endLine = dropLine(); colLines.push(endLine); items.push(endLine);\n colTracker = { active: null };\n }\n if (live && !c.blocks.length) {\n items.push(el('div', { border: '1px dashed var(--ed-accent-sheet-line)', borderRadius: 'var(--ed-radius-sm)', color: 'var(--ed-faint)', fontFamily: 'ui-monospace,monospace', fontSize: '9.5px', letterSpacing: '0.14em', textTransform: 'uppercase', padding: '24px 8px', textAlign: 'center' }, { text: 'drop block' }));\n }\n const colEl = el('div', colStyle(r.props, c));\n // Column-level styling lives on an inner wrapper, not on colEl itself:\n // colEl's padding is the inter-column gutter (colStyle), and a painted\n // background must stop at the column's visual edge, not bleed across\n // the gutter. `host` is also what the drag listeners and\n // `indexFromPoint` must use -- the block slots are its children.\n const styled = c.bg || c.border || c.radius || c.padY || c.padX;\n const host = styled\n ? el('div', { background: c.bg || 'transparent', border: c.border ? c.border + 'px ' + (c.borderStyle || 'solid') + ' ' + (c.lineColor || '#e2e2e5') : '0', borderRadius: (c.radius || 0) + 'px', padding: (c.padY || 0) + 'px ' + (c.padX || 0) + 'px', height: '100%', boxSizing: 'border-box' })\n : colEl;\n if (live) {\n host.addEventListener('dragover', (e) => {\n const dr = core.drag; if (!dr) return;\n e.preventDefault(); e.stopPropagation();\n if (dr.kind === 'row' || dr.kind === 'move-row') return;\n const index = core.indexFromPoint(host, e.clientY);\n showLine(colTracker, colLines[index]);\n });\n host.addEventListener('dragleave', (e) => { if (e.target === host) hideActive(colTracker); });\n host.addEventListener('drop', (e) => {\n e.stopPropagation();\n hideActive(colTracker);\n core.colDrop(r.id, ci)(e);\n });\n }\n items.forEach((it) => host.appendChild(it));\n if (host !== colEl) colEl.appendChild(host);\n colsEl.appendChild(colEl);\n });\n rowEl.appendChild(colsEl);\n root.appendChild(rowEl);\n });\n\n if (live) { const line = dropLine(); rowLines.push(line); root.appendChild(line); }\n if (live && !d.rows.length) {\n root.appendChild(el('div', { border: '1px dashed var(--ed-accent-sheet-line)', padding: '90px 20px', textAlign: 'center', fontFamily: 'ui-monospace,monospace', fontSize: '10.5px', letterSpacing: '0.14em', textTransform: 'uppercase', color: 'var(--ed-faint)' }, { text: 'drag a row or block here' }));\n }\n\n return root;\n}\n\nObject.assign(exports, { renderDoc });\n\n};\n__modules[\"render/fields.js\"] = function(module, exports, __require) {\nconst {icon, brandIcon, socialKey, SOCIAL_BRAND, contrastInk} = __require(\"core/icons.js\");\r\nconst {parseItems} = __require(\"core/parse.js\");\r\n\r\nfunction el(tag, style, attrs) {\r\n const node = document.createElement(tag);\r\n if (style) Object.assign(node.style, style);\r\n if (attrs) for (const [k, v] of Object.entries(attrs)) {\r\n if (k === 'text') node.textContent = v;\r\n else if (v !== undefined) node.setAttribute(k, v);\r\n }\r\n return node;\r\n}\r\n\r\n/**\r\n * Trailing debounce for free-typing inputs. Every commit rebuilds the whole\r\n * canvas and panel (full re-render, no diffing) -- fine per click, but per\r\n * keystroke it floors low-end hardware. Typing therefore commits 120ms after\r\n * the last keystroke: one rebuild per pause instead of per key. `flush` runs\r\n * on blur so leaving the field (or a blur-time clamp that reads committed\r\n * state, e.g. B.num) never races a still-pending commit. Discrete controls\r\n * (toggles, selects, steppers' -/+) stay immediate.\r\n */\r\nfunction typeCommit(fn) {\r\n let t = null; let last;\r\n const fire = () => { t = null; fn(last); };\r\n return {\r\n call(v) { last = v; if (t) clearTimeout(t); t = setTimeout(fire, 120); },\r\n flush() { if (t) { clearTimeout(t); fire(); } },\r\n };\r\n}\r\n\r\n/**\r\n * Label of the switch the user just clicked, consumed by the very next render.\r\n *\r\n * Toggling a prop re-renders the whole panel, which replaces the switch with a\r\n * fresh node built already in its new state -- there is no before/after on one\r\n * element for a CSS `transition` to interpolate, so the knob used to jump. The\r\n * flag lets the rebuilt switch (and no other) start a one-shot keyframe from\r\n * where the old one stood, so a click slides while merely opening a panel full\r\n * of already-on switches still paints them in place.\r\n */\r\nlet pendingSwitchAnim = null;\r\n\r\n/**\r\n * One label style for every field kind, so the inspector reads as one system:\r\n * semibold editor UI font at 75% ink for field names (distinct from both the muted\r\n * values and the uppercase group kickers), block or inline per context.\r\n */\r\nfunction fieldLabel(text, inline) {\r\n // One label treatment across every right-panel field. Placement can differ\r\n // (above wide controls, beside compact controls), but size, weight and color\r\n // must not change with the control type.\r\n return el('label', Object.assign(\r\n { fontFamily: 'var(--ed-font)', fontSize: '12.5px', lineHeight: '1.35', fontWeight: '500', color: 'var(--ed-text)' },\r\n inline\r\n ? { flex: '1', minWidth: '0' }\r\n : { display: 'block', marginBottom: '6px' },\r\n ), { text, class: 'mc-field-label' });\r\n}\r\n\r\n/**\r\n * Which accordion sections the user has collapsed, by section label.\r\n * Editor-UI state, deliberately module-level: it must survive the full\r\n * re-render on every commit (the panel is rebuilt each time) but is never\r\n * part of the document, and collapsing/expanding itself is pure DOM --\r\n * no core state, no re-render.\r\n */\r\nconst sectionCollapsed = Object.create(null);\r\n\r\n/**\r\n * The flat accordion inspector layout: each `head` field becomes a\r\n * full-width light section bar (uppercase label, chevron, click to\r\n * collapse) and the fields under it render as roomy rows directly on the\r\n * panel surface. Fields before the first head form an untitled lead group.\r\n */\r\nfunction renderFieldCards(container, fields) {\r\n let body = null;\r\n const open = (headField) => {\r\n if (headField) {\r\n const label = headField.label;\r\n // The mc-section-* classes are theme hooks (render/style.js can restyle\r\n // the section chrome without touching this builder); the inline styles\r\n // stay the baseline look.\r\n const bar = el('div', { display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '11px 14px', background: 'var(--ed-panel-2)', borderTop: '1px solid var(--ed-line)', borderBottom: '1px solid var(--ed-line)', cursor: 'pointer', userSelect: 'none' }, { role: 'button', tabindex: '0', 'aria-expanded': String(!sectionCollapsed[label]), class: 'mc-section-bar' });\r\n bar.appendChild(el('span', { fontFamily: 'var(--ed-font)', fontSize: '10.5px', fontWeight: '700', letterSpacing: '0.08em', textTransform: 'uppercase', color: 'var(--ed-muted)' }, { text: label, class: 'mc-section-label' }));\r\n const chev = el('span', { display: 'flex', color: 'var(--ed-faint)', transition: 'transform 0.16s', transform: sectionCollapsed[label] ? 'rotate(-90deg)' : 'none' }, { class: 'mc-section-chevron' });\r\n chev.appendChild(icon('chevronDown', 13));\r\n bar.appendChild(chev);\r\n const localBody = body = el('div', { padding: '12px 14px 16px', background: 'var(--ed-panel)' }, { class: 'mc-section-body mc-field-list' });\r\n if (sectionCollapsed[label]) localBody.hidden = true;\r\n const toggle = () => {\r\n sectionCollapsed[label] = !sectionCollapsed[label];\r\n localBody.hidden = !!sectionCollapsed[label];\r\n chev.style.transform = sectionCollapsed[label] ? 'rotate(-90deg)' : 'none';\r\n bar.setAttribute('aria-expanded', String(!sectionCollapsed[label]));\r\n };\r\n bar.addEventListener('click', toggle);\r\n bar.addEventListener('keydown', (e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); toggle(); } });\r\n container.appendChild(bar);\r\n container.appendChild(localBody);\r\n return;\r\n }\r\n body = el('div', { padding: '12px 14px 16px', background: 'var(--ed-panel)' }, { class: 'mc-section-body mc-field-list' });\r\n container.appendChild(body);\r\n };\r\n fields.forEach((f) => {\r\n if (f.isHead) { open(f); return; }\r\n if (!body) open(null);\r\n const node = renderField(f);\r\n node.style.margin = '0';\r\n body.appendChild(node);\r\n });\r\n}\r\n\r\n/** Every platform the \"Add network…\" dropdown offers, with a sensible starter URL. Order roughly by how often they appear in email footers. */\r\nconst NETWORKS = [\r\n ['Instagram', 'https://instagram.com/'], ['X', 'https://x.com/'], ['Facebook', 'https://facebook.com/'],\r\n ['LinkedIn', 'https://linkedin.com/company/'], ['YouTube', 'https://youtube.com/@'], ['TikTok', 'https://tiktok.com/@'],\r\n ['Pinterest', 'https://pinterest.com/'], ['WhatsApp', 'https://wa.me/'], ['Telegram', 'https://t.me/'],\r\n ['Threads', 'https://threads.net/@'], ['Snapchat', 'https://snapchat.com/add/'], ['Discord', 'https://discord.gg/'],\r\n ['Reddit', 'https://reddit.com/r/'], ['Spotify', 'https://open.spotify.com/'], ['Behance', 'https://behance.net/'],\r\n ['Dribbble', 'https://dribbble.com/'], ['Email', 'mailto:hello@example.com'], ['Website', 'https://example.com'],\r\n];\r\n\r\n/**\r\n * The social block's network editor: one card per network (brand-colored icon\r\n * chip, editable name, URL, remove) plus an \"Add network…\" dropdown -- what\r\n * used to be a raw `Name|URL` textarea. The data stays that same string\r\n * (`f.value` in, serialized back out through `f.onChange`), so the block,\r\n * export and import are untouched; only the editing surface changed.\r\n */\r\nfunction renderSocialItems(f) {\r\n const box = el('div');\r\n box.appendChild(fieldLabel(f.label));\r\n const items = parseItems(f.value || '');\r\n // No coercion here: commits land while the user is still typing (debounced,\r\n // see typeCommit) and the panel re-renders from the committed string, so\r\n // padding an empty field with a fallback would snap \"cleared to retype\"\r\n // inputs back mid-edit.\r\n const commit = (next) => f.onChange(next.map((it) => (it.label || '') + '|' + (it.href || '')).join('\\n'));\r\n const list = el('div', { display: 'flex', flexDirection: 'column', gap: '6px' });\r\n\r\n items.forEach((it, i) => {\r\n const row = el('div', { display: 'flex', alignItems: 'center', gap: '7px', padding: '6px 7px', border: '1px solid var(--ed-line)', borderRadius: '9px', background: 'var(--ed-panel-2)' });\r\n const key = socialKey(it.label);\r\n const brand = SOCIAL_BRAND[key] || '';\r\n const chip = el('span', { display: 'flex', alignItems: 'center', justifyContent: 'center', width: '24px', height: '24px', flex: 'none', borderRadius: '7px', background: brand || 'var(--ed-soft)', color: brand ? contrastInk(brand) : 'var(--ed-accent)' });\r\n chip.appendChild(brandIcon(key, 13));\r\n const name = el('input', { width: '70px', flex: 'none', boxSizing: 'border-box', background: 'transparent', border: '1px solid transparent', borderRadius: '5px', color: 'var(--ed-text)', font: 'inherit', fontSize: '11.5px', fontWeight: '600', padding: '3px 4px' }, { 'data-focus-key': `f${f.key}-n${i}`, title: 'Network name' });\r\n name.value = it.label;\r\n const nameCommit = typeCommit((v) => { const next = items.slice(); next[i] = { label: v, href: it.href }; commit(next); });\r\n name.addEventListener('input', (e) => nameCommit.call(e.target.value));\r\n name.addEventListener('focus', () => { name.style.borderColor = 'var(--ed-accent)'; name.style.background = 'var(--ed-panel)'; name.style.outline = 'none'; });\r\n name.addEventListener('blur', () => { name.style.borderColor = 'transparent'; name.style.background = 'transparent'; nameCommit.flush(); });\r\n const url = el('input', { flex: '1', minWidth: '0', boxSizing: 'border-box', background: 'var(--ed-panel)', border: '1px solid var(--ed-line)', borderRadius: '6px', color: 'var(--ed-text)', fontFamily: 'ui-monospace, monospace', fontSize: '10.5px', padding: '4px 6px' }, { placeholder: 'https://', 'data-focus-key': `f${f.key}-u${i}`, title: it.href });\r\n url.value = it.href;\r\n const urlCommit = typeCommit((v) => { const next = items.slice(); next[i] = { label: it.label, href: v }; commit(next); });\r\n url.addEventListener('input', (e) => urlCommit.call(e.target.value));\r\n url.addEventListener('focus', () => { url.style.borderColor = 'var(--ed-accent)'; url.style.outline = 'none'; });\r\n url.addEventListener('blur', () => { url.style.borderColor = 'var(--ed-line)'; urlCommit.flush(); });\r\n const del = el('button', { width: '22px', height: '22px', flex: 'none', border: '0', borderRadius: '6px', background: 'transparent', color: 'var(--ed-faint)', cursor: 'pointer', fontSize: '13px', lineHeight: '1' }, { type: 'button', title: 'Remove ' + (it.label || 'network'), text: '✕' });\r\n del.addEventListener('mouseenter', () => { del.style.background = 'var(--ed-danger-soft)'; del.style.color = 'var(--ed-danger)'; });\r\n del.addEventListener('mouseleave', () => { del.style.background = 'transparent'; del.style.color = 'var(--ed-faint)'; });\r\n del.addEventListener('click', () => commit(items.filter((x, xi) => xi !== i)));\r\n row.append(chip, name, url, del);\r\n list.appendChild(row);\r\n });\r\n\r\n if (!items.length) {\r\n list.appendChild(el('div', { fontSize: '11px', color: 'var(--ed-faint)', padding: '8px 2px' }, { text: 'No networks yet — add one below.' }));\r\n }\r\n\r\n const used = new Set(items.map((it) => socialKey(it.label)));\r\n const add = el('select', { width: '100%', boxSizing: 'border-box', background: 'var(--ed-panel-2)', border: '1px dashed var(--ed-line-2)', borderRadius: '9px', color: 'var(--ed-muted)', font: 'inherit', fontSize: '11.5px', fontWeight: '600', padding: '7px 8px', cursor: 'pointer' }, { title: 'Add network' });\r\n const ph = document.createElement('option'); ph.value = ''; ph.textContent = '+ Add network…'; add.appendChild(ph);\r\n NETWORKS.filter(([label]) => !used.has(socialKey(label))).forEach(([label, href]) => {\r\n const o = document.createElement('option'); o.value = label + '|' + href; o.textContent = label; add.appendChild(o);\r\n });\r\n const custom = document.createElement('option'); custom.value = 'Link|https://'; custom.textContent = 'Custom link…'; add.appendChild(custom);\r\n add.addEventListener('change', (e) => {\r\n if (!e.target.value) return;\r\n const [label, href] = e.target.value.split('|');\r\n commit(items.concat([{ label, href }]));\r\n });\r\n add.addEventListener('focus', () => { add.style.borderColor = 'var(--ed-accent)'; add.style.outline = 'none'; });\r\n add.addEventListener('blur', () => { add.style.borderColor = 'var(--ed-line-2)'; });\r\n list.appendChild(add);\r\n\r\n box.appendChild(list);\r\n return box;\r\n}\r\n\r\n/**\r\n * Friendly link editing for rich-text blocks. The block still stores one HTML\r\n * string; each commit clones that markup, updates only the indexed anchor and\r\n * serializes it back, preserving all surrounding formatting and content.\r\n */\r\nfunction renderRichLinks(f) {\r\n const box = el('div');\r\n box.appendChild(fieldLabel(f.label));\r\n const source = el('div');\r\n source.innerHTML = f.html || '';\r\n const anchors = Array.from(source.querySelectorAll('a'));\r\n const list = el('div', { display: 'flex', flexDirection: 'column', gap: '7px' });\r\n const change = (index, update) => {\r\n const next = el('div');\r\n next.innerHTML = f.html || '';\r\n const anchor = next.querySelectorAll('a')[index];\r\n if (!anchor) return;\r\n update(anchor);\r\n f.onChange(next.innerHTML);\r\n };\r\n\r\n anchors.forEach((anchor, i) => {\r\n const card = el('div', { padding: '8px', border: '1px solid var(--ed-line)', borderRadius: '9px', background: 'var(--ed-panel-2)' });\r\n const head = el('div', { display: 'flex', alignItems: 'center', gap: '8px', marginBottom: '7px' });\r\n const name = el('span', { flex: '1', minWidth: '0', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', fontFamily: 'var(--ed-font)', fontSize: '11.5px', fontWeight: '600', color: 'var(--ed-text)' }, { text: (anchor.textContent || '').trim() || 'Link ' + (i + 1), title: (anchor.textContent || '').trim() });\r\n const remove = el('button', { flex: 'none', border: '0', borderRadius: '6px', background: 'transparent', color: 'var(--ed-faint)', cursor: 'pointer', padding: '3px 6px', fontFamily: 'var(--ed-font)', fontSize: '10.5px', fontWeight: '600' }, { type: 'button', text: 'Remove', title: 'Remove link', 'aria-label': 'Remove link from ' + ((anchor.textContent || '').trim() || 'text'), 'data-focus-key': `f${f.key}-link-remove-${i}` });\r\n remove.addEventListener('mouseenter', () => { remove.style.background = 'var(--ed-danger-soft)'; remove.style.color = 'var(--ed-danger)'; });\r\n remove.addEventListener('mouseleave', () => { remove.style.background = 'transparent'; remove.style.color = 'var(--ed-faint)'; });\r\n remove.addEventListener('click', () => change(i, (a) => a.replaceWith(...a.childNodes)));\r\n head.append(name, remove);\r\n\r\n const url = el('input', { width: '100%', boxSizing: 'border-box', background: 'var(--ed-panel)', border: '1px solid var(--ed-line)', borderRadius: '7px', color: 'var(--ed-text)', fontFamily: 'ui-monospace, monospace', fontSize: '11px', padding: '6px 8px' }, { placeholder: 'https://', 'aria-label': 'Link destination for ' + ((anchor.textContent || '').trim() || 'link ' + (i + 1)), 'data-focus-key': `f${f.key}-link-url-${i}` });\r\n url.value = anchor.getAttribute('href') || '';\r\n const urlCommit = typeCommit((v) => change(i, (a) => a.setAttribute('href', v)));\r\n url.addEventListener('input', (e) => urlCommit.call(e.target.value));\r\n url.addEventListener('focus', () => { url.style.borderColor = 'var(--ed-accent)'; url.style.outline = 'none'; });\r\n url.addEventListener('blur', () => { url.style.borderColor = 'var(--ed-line)'; urlCommit.flush(); });\r\n\r\n const targetLabel = el('label', { display: 'flex', alignItems: 'center', gap: '6px', marginTop: '7px', width: 'fit-content', color: 'var(--ed-muted)', cursor: 'pointer', fontFamily: 'var(--ed-font)', fontSize: '10.5px', fontWeight: '500' });\r\n const target = el('input', { accentColor: 'var(--ed-accent)', cursor: 'pointer' }, { type: 'checkbox', 'data-focus-key': `f${f.key}-link-target-${i}` });\r\n target.checked = anchor.target === '_blank';\r\n target.addEventListener('change', (e) => change(i, (a) => {\r\n if (e.target.checked) { a.setAttribute('target', '_blank'); a.setAttribute('rel', 'noopener'); }\r\n else { a.removeAttribute('target'); a.removeAttribute('rel'); }\r\n }));\r\n targetLabel.append(target, 'Open in new tab');\r\n card.append(head, url, targetLabel);\r\n list.appendChild(card);\r\n });\r\n\r\n box.appendChild(list);\r\n return box;\r\n}\r\n\r\n/**\r\n * The table block's cell editor: an actual grid of inputs mirroring the\r\n * table (bold first row when the header toggle is on), with per-row/column\r\n * remove buttons and add-row/add-column actions -- replacing the raw\r\n * \"one line per row, split by |\" textarea. Data stays that same string.\r\n */\r\nfunction renderTableGrid(f) {\r\n const box = el('div');\r\n box.appendChild(fieldLabel(f.label));\r\n const rows = String(f.value || '').split('\\n').map((r) => r.split('|'));\r\n const cols = Math.max(1, ...rows.map((r) => r.length));\r\n rows.forEach((r) => { while (r.length < cols) r.push(''); });\r\n // Pipes typed into a cell become '/' -- '|' is the column separator in the\r\n // stored string (same rule as inline cell editing on the canvas).\r\n const commit = (rs) => f.onChange(rs.map((r) => r.map((c) => String(c).replace(/\\|/g, '/')).join('|')).join('\\n'));\r\n const grid = el('div', { display: 'flex', flexDirection: 'column', gap: '4px' });\r\n const iconBtnStyle = { border: '0', borderRadius: '5px', background: 'transparent', color: 'var(--ed-faint)', cursor: 'pointer', fontSize: '11px', lineHeight: '1', padding: '2px' };\r\n const dangerHover = (btn) => {\r\n btn.addEventListener('mouseenter', () => { btn.style.background = 'var(--ed-danger-soft)'; btn.style.color = 'var(--ed-danger)'; });\r\n btn.addEventListener('mouseleave', () => { btn.style.background = 'transparent'; btn.style.color = 'var(--ed-faint)'; });\r\n };\r\n\r\n if (cols > 1) {\r\n // The right padding mirrors the per-row ✕ (18px + 4px gap) so the column\r\n // ✕s line up over their columns -- but that ✕ only exists when there is\r\n // more than one row, so pad only then or the strip drifts 22px left.\r\n const strip = el('div', { display: 'flex', gap: '4px', paddingRight: rows.length > 1 ? '22px' : '0' });\r\n for (let ci = 0; ci < cols; ci++) {\r\n const cbtn = el('button', Object.assign({ flex: '1', minWidth: '0' }, iconBtnStyle), { type: 'button', title: 'Remove column ' + (ci + 1), text: '✕' });\r\n dangerHover(cbtn);\r\n cbtn.addEventListener('click', () => commit(rows.map((r) => r.filter((x, i) => i !== ci))));\r\n strip.appendChild(cbtn);\r\n }\r\n grid.appendChild(strip);\r\n }\r\n\r\n rows.forEach((r, ri) => {\r\n const rowEl = el('div', { display: 'flex', gap: '4px', alignItems: 'center' });\r\n r.forEach((cell, ci) => {\r\n const input = el('input', {\r\n flex: '1', minWidth: '0', boxSizing: 'border-box', background: 'var(--ed-panel-2)', border: '1px solid var(--ed-line)',\r\n borderRadius: '6px', color: 'var(--ed-text)', font: 'inherit', fontSize: '11px',\r\n fontWeight: f.header && ri === 0 ? '700' : '400', padding: '5px 6px',\r\n }, { 'data-focus-key': `f${f.key}-r${ri}c${ci}` });\r\n input.value = cell;\r\n const cellCommit = typeCommit((v) => { const next = rows.map((row) => row.slice()); next[ri][ci] = v; commit(next); });\r\n input.addEventListener('input', (e) => cellCommit.call(e.target.value));\r\n input.addEventListener('focus', () => { input.style.borderColor = 'var(--ed-accent)'; input.style.outline = 'none'; });\r\n input.addEventListener('blur', () => { input.style.borderColor = 'var(--ed-line)'; cellCommit.flush(); });\r\n rowEl.appendChild(input);\r\n });\r\n if (rows.length > 1) {\r\n const del = el('button', Object.assign({ width: '18px', flex: 'none' }, iconBtnStyle), { type: 'button', title: 'Remove row ' + (ri + 1), text: '✕' });\r\n dangerHover(del);\r\n del.addEventListener('click', () => commit(rows.filter((x, i) => i !== ri)));\r\n rowEl.appendChild(del);\r\n }\r\n grid.appendChild(rowEl);\r\n });\r\n\r\n const actions = el('div', { display: 'flex', gap: '6px', marginTop: '2px' });\r\n [['+ Row', () => commit(rows.concat([new Array(cols).fill('')]))], ['+ Column', () => commit(rows.map((r) => r.concat('')))]].forEach(([label, fn]) => {\r\n const btn = el('button', { flex: '1', border: '1px dashed var(--ed-line-2)', borderRadius: '8px', background: 'transparent', color: 'var(--ed-muted)', cursor: 'pointer', fontFamily: 'var(--ed-font)', fontSize: '11px', fontWeight: '600', padding: '6px' }, { type: 'button', text: label });\r\n btn.addEventListener('mouseenter', () => { btn.style.borderColor = 'var(--ed-accent)'; btn.style.color = 'var(--ed-accent)'; btn.style.background = 'var(--ed-soft)'; });\r\n btn.addEventListener('mouseleave', () => { btn.style.borderColor = 'var(--ed-line-2)'; btn.style.color = 'var(--ed-muted)'; btn.style.background = 'transparent'; });\r\n btn.addEventListener('click', fn);\r\n actions.appendChild(btn);\r\n });\r\n grid.appendChild(actions);\r\n box.appendChild(grid);\r\n return box;\r\n}\r\n\r\n/**\r\n * The stepper: ONE bordered box holding bare -/+ hit areas flanking the\r\n * centered value + unit. The previous design nested raised, bordered buttons\r\n * inside an inset pill; the boxes-in-boxes read as visual noise, so the\r\n * inner borders, shadows and track fill are gone -- a single line now\r\n * carries the whole control. The focus ring lives on the box, not the inner\r\n * input: the global `#mc input:focus` ring drew a stray box around the bare\r\n * value in the middle of the control (`.mc-stepper-input` opts out,\r\n * render/style.js).\r\n */\r\nfunction stepper(f, width) {\r\n const ctl = el('div', { display: 'flex', alignItems: 'stretch', width: width || '100%', height: '32px', flex: 'none', boxSizing: 'border-box', border: '1px solid var(--ed-line)', borderRadius: '8px', background: 'var(--ed-panel)', overflow: 'hidden', transition: 'border-color 0.16s, box-shadow 0.16s' }, { class: 'mc-field-control mc-stepper' });\r\n const stepBtn = (name, title, onClick) => {\r\n const b = el('button', { width: '27px', flex: 'none', display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '0', border: '0', background: 'transparent', color: 'var(--ed-muted)', cursor: 'pointer', transition: 'background 0.14s, color 0.14s' }, { type: 'button', title });\r\n b.appendChild(icon(name, 11));\r\n b.addEventListener('mouseenter', () => { b.style.background = 'var(--ed-soft)'; b.style.color = 'var(--ed-accent)'; });\r\n b.addEventListener('mouseleave', () => { b.style.background = 'transparent'; b.style.color = 'var(--ed-muted)'; });\r\n b.addEventListener('click', onClick);\r\n return b;\r\n };\r\n const dec = stepBtn('minus', 'Decrease', () => f.onDec());\r\n const mid = el('div', { flex: '1', minWidth: '0', display: 'flex', alignItems: 'baseline', alignSelf: 'center', justifyContent: 'center', gap: '3px', padding: '0 2px' });\r\n // type=\"text\" + inputmode, NOT type=\"number\": browsers refuse the\r\n // selection APIs on number inputs, so the per-keystroke re-render could\r\n // never restore the caret -- typing multi-digit values scrambled them.\r\n // The -/+ buttons and blur clamp cover what the number type provided.\r\n const input = el('input', { width: '44px', minWidth: '0', flex: '0 1 auto', textAlign: 'center', boxSizing: 'border-box', background: 'transparent', border: '0', outline: 'none', color: 'var(--ed-text)', fontFamily: 'var(--ed-font)', fontSize: '12.5px', fontWeight: '600', padding: '0' }, { type: 'text', inputmode: 'decimal', class: 'mc-stepper-input', 'data-focus-key': `f${f.key}` });\r\n input.value = f.value;\r\n const rangeCommit = typeCommit(f.onInput);\r\n input.addEventListener('input', (e) => rangeCommit.call(e.target.value));\r\n // Flush before the clamp: onBlur reads/normalizes committed state, so a\r\n // still-pending keystroke commit firing after it would undo the clamp.\r\n input.addEventListener('blur', (e) => { rangeCommit.flush(); f.onBlur(e.target.value); });\r\n input.addEventListener('focus', () => { ctl.style.borderColor = 'var(--ed-accent)'; ctl.style.boxShadow = '0 0 0 3px var(--ed-soft)'; });\r\n input.addEventListener('blur', () => { ctl.style.borderColor = 'var(--ed-line)'; ctl.style.boxShadow = 'none'; });\r\n mid.appendChild(input);\r\n if (f.unit) mid.appendChild(el('span', { flex: 'none', fontSize: '12px', fontFamily: 'var(--ed-font)', fontWeight: '500', color: 'var(--ed-text)' }, { text: f.unit }));\r\n const inc = stepBtn('plus', 'Increase', () => f.onInc());\r\n ctl.append(dec, mid, inc);\r\n return ctl;\r\n}\r\n\r\n/**\r\n * A grid of linked steppers for multi-side props (core/binder.js `group`):\r\n * optional header row carrying the group label and a \"More options\" switch\r\n * (which swaps the linked pair for per-side fields), then two columns of\r\n * small-captioned flat steppers. One grid instead of a stack of full-width\r\n * label+control rows: the sides read as one unit and the panel loses a\r\n * border-to-border line per side.\r\n */\r\nfunction renderRangeGroup(f) {\r\n const box = el('div');\r\n if (f.label || f.toggle) {\r\n const head = el('div', { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: '10px', marginBottom: '9px' });\r\n head.appendChild(fieldLabel(f.label || '', true));\r\n if (f.toggle) {\r\n // Namespaced anim key so this switch's slide (see pendingSwitchAnim)\r\n // never collides with a plain toggle that shares the group's label.\r\n const animKey = (f.label || '') + '::more';\r\n const more = el('div', { display: 'flex', alignItems: 'center', gap: '7px', flex: 'none', cursor: 'pointer' }, { class: 'mc-switch-row' });\r\n more.addEventListener('click', () => { pendingSwitchAnim = animKey; f.toggle.onChange(); });\r\n more.appendChild(el('span', { fontFamily: 'var(--ed-font)', fontSize: '12.5px', lineHeight: '1.35', fontWeight: '500', color: 'var(--ed-text)' }, { text: 'More options', class: 'mc-field-label' }));\r\n const track = el('button', null, { type: 'button', class: 'mc-switch', role: 'switch', 'aria-checked': String(!!f.toggle.on), 'aria-label': (f.label ? f.label + ' — ' : '') + 'more options' });\r\n track.appendChild(el('span', null, { class: 'mc-switch-knob' }));\r\n if (pendingSwitchAnim === animKey) { track.classList.add('mc-switch-anim'); pendingSwitchAnim = null; }\r\n more.appendChild(track);\r\n head.appendChild(more);\r\n }\r\n box.appendChild(head);\r\n }\r\n const grid = el('div', { display: 'grid', gridTemplateColumns: f.items.length === 1 ? '1fr' : '1fr 1fr', gap: '10px 12px' });\r\n f.items.forEach((it) => {\r\n const cell = el('div');\r\n cell.appendChild(fieldLabel(it.label));\r\n cell.appendChild(stepper(it));\r\n grid.appendChild(cell);\r\n });\r\n box.appendChild(grid);\r\n return box;\r\n}\r\n\r\n/**\r\n * Builds one field row exactly as the template's `sc-if` cascade over\r\n * `f.isHead/isArea/isBtn/isSeg/isRange/isToggle/isRow(isText/isNum/isColor/isSelect)`\r\n * (template lines 172-236, and the theme-tab variant at 385-406 which only\r\n * has isHead/isField(isNum/isColor/isSelect) -- `renderThemeField` covers that subset).\r\n */\r\nfunction renderField(f) {\r\n const wrap = el('div', { minWidth: '0' }, { class: 'mc-field' });\r\n\r\n if (f.isSocial) {\r\n wrap.appendChild(renderSocialItems(f));\r\n return wrap;\r\n }\r\n\r\n if (f.isTableGrid) {\r\n wrap.appendChild(renderTableGrid(f));\r\n return wrap;\r\n }\r\n\r\n if (f.isRichLinks) {\r\n wrap.appendChild(renderRichLinks(f));\r\n return wrap;\r\n }\r\n\r\n // No isHead branch: heads never reach renderField -- renderFieldCards\r\n // consumes them as card kickers. A field list rendered without the card\r\n // grouper would drop its headings, which is the loud failure we want.\r\n\r\n if (f.isArea) {\r\n const box = el('div');\r\n box.appendChild(fieldLabel(f.label));\r\n const ta = el('textarea', { width: '100%', minHeight: '76px', boxSizing: 'border-box', background: 'var(--ed-panel-2)', border: '1px solid var(--ed-line)', color: 'var(--ed-text)', fontFamily: 'ui-monospace, monospace', fontSize: '11.5px', lineHeight: '1.5', padding: '7px 8px', resize: 'vertical' }, { placeholder: f.placeholder, 'data-focus-key': `f${f.key}` });\r\n ta.value = f.value;\r\n const taCommit = typeCommit(f.onChange);\r\n ta.addEventListener('input', (e) => taCommit.call(e.target.value));\r\n ta.addEventListener('focus', () => { ta.style.borderColor = 'var(--ed-accent)'; ta.style.outline = 'none'; });\r\n ta.addEventListener('blur', () => { ta.style.borderColor = 'var(--ed-line)'; taCommit.flush(); });\r\n box.appendChild(ta);\r\n wrap.appendChild(box);\r\n return wrap;\r\n }\r\n\r\n if (f.isBtn) {\r\n // Soft accent action chip -- same recipe as the panel's other secondary\r\n // actions, replacing the retired mono-uppercase ghost button that\r\n // clashed with the card system it sits in.\r\n const btn = el('button', { width: '100%', border: '0', borderRadius: '8px', background: 'var(--ed-soft)', color: 'var(--ed-accent)', cursor: 'pointer', padding: '8px 10px', fontFamily: 'var(--ed-font)', fontSize: '11.5px', fontWeight: '600', transition: 'background 0.16s, color 0.16s' }, { type: 'button', text: f.label });\r\n btn.addEventListener('mouseenter', () => { btn.style.background = 'var(--ed-accent)'; btn.style.color = 'var(--ed-accent-ink)'; });\r\n btn.addEventListener('mouseleave', () => { btn.style.background = 'var(--ed-soft)'; btn.style.color = 'var(--ed-accent)'; });\r\n btn.addEventListener('click', f.onClick);\r\n wrap.appendChild(btn);\r\n return wrap;\r\n }\r\n\r\n if (f.isSeg) {\r\n const box = el('div');\r\n box.appendChild(fieldLabel(f.label));\r\n const seg = el('div', { display: 'flex', gap: '3px', padding: '3px', border: '0', borderRadius: '10px', background: 'var(--ed-panel-2)' }, { class: 'mc-segment mc-field-segment' });\r\n f.options.forEach((o) => {\r\n const active = o.bg === 'var(--ed-accent)';\r\n const b = el('button', { flex: '1', minWidth: '0', border: '0', borderRadius: '7px', cursor: 'pointer', background: o.bg, color: o.fg, fontFamily: 'var(--ed-font)', fontSize: '10px', fontWeight: '600', padding: '0 6px', height: '28px', textTransform: 'none', letterSpacing: '0.01em', transition: 'background 0.16s, color 0.16s' }, { type: 'button', text: o.label, 'aria-pressed': String(active) });\r\n b.addEventListener('click', o.onClick);\r\n seg.appendChild(b);\r\n });\r\n box.appendChild(seg);\r\n wrap.appendChild(box);\r\n return wrap;\r\n }\r\n\r\n if (f.isRangeGroup) {\r\n wrap.appendChild(renderRangeGroup(f));\r\n return wrap;\r\n }\r\n\r\n if (f.isSlider) {\n // Drag-to-resize slider (core/binder.js `slider`): the value stays in a\n // stable header badge instead of riding over the thumb, where it collided\n // with the label/track at common widths. The fill and badge still update\n // as pure DOM writes; the document commits once, on release.\n wrap.classList.add('mc-slider-field');\n const box = el('div');\n const head = el('div', { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: '12px' });\n head.appendChild(fieldLabel(f.label, true));\n const value = el('output', { minWidth: '58px', height: '25px', padding: '0 8px', boxSizing: 'border-box', display: 'flex', alignItems: 'center', justifyContent: 'center', border: '1px solid var(--ed-line)', borderRadius: '7px', background: 'var(--ed-panel-2)', color: 'var(--ed-accent)', fontFamily: 'var(--ed-font)', fontSize: '11.5px', fontWeight: '600', whiteSpace: 'nowrap' }, { 'aria-live': 'polite' });\n head.appendChild(value);\n const holder = el('div', { padding: '11px 0 4px' });\n const input = el('input', { width: '100%', margin: '0', display: 'block', boxSizing: 'border-box' }, { type: 'range', min: f.min, max: f.max, step: f.step, class: 'mc-slider', 'aria-label': f.label, 'data-focus-key': `f${f.key}` });\n input.value = f.value;\n const place = () => {\n const pct = (input.value - f.min) / (f.max - f.min || 1);\n value.textContent = input.value + f.unit;\n input.style.background = `linear-gradient(to right, var(--ed-accent) ${pct * 100}%, var(--ed-line-2) ${pct * 100}%)`;\n };\n place();\r\n input.addEventListener('input', place);\r\n input.addEventListener('change', (e) => f.onCommit(e.target.value));\r\n holder.appendChild(input);\n box.append(head, holder);\n wrap.appendChild(box);\r\n return wrap;\r\n }\r\n\r\n if (f.isRange) {\r\n const box = el('div', { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: '10px' }, { class: 'mc-field-row' });\r\n box.appendChild(fieldLabel(f.label, true));\r\n box.appendChild(stepper(f, '132px'));\r\n wrap.appendChild(box);\r\n return wrap;\r\n }\r\n\r\n if (f.isToggle) {\r\n // The pill track and its knob live in CSS (`.mc-switch` in render/style.js)\r\n // rather than inline styles: the on/off look is driven purely off\r\n // `aria-checked`, which keeps the accessible state and the visual state\r\n // from ever drifting apart, and lets `:hover`/`:focus-visible` style it\r\n // without a JS listener per state.\r\n const row = el('div', { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: '12px', minHeight: '32px', cursor: 'pointer' }, { class: 'mc-switch-row mc-field-row' });\r\n // Only the row listens: a click on the switch bubbles up to it, so the\r\n // handler still fires exactly once (including for keyboard Enter/Space,\r\n // which the browser dispatches as a click on the button).\r\n row.addEventListener('click', () => { pendingSwitchAnim = f.label; f.onChange(); });\r\n const togLabel = fieldLabel(f.label, true);\r\n togLabel.style.cursor = 'pointer';\r\n row.appendChild(togLabel);\r\n const track = el('button', null, { type: 'button', class: 'mc-switch', role: 'switch', 'aria-checked': String(!!f.on), 'aria-label': f.label });\r\n track.appendChild(el('span', null, { class: 'mc-switch-knob' }));\r\n // See `pendingSwitchAnim`: this is the rebuilt switch for the click that\r\n // just happened, so it (and only it) plays the slide.\r\n if (pendingSwitchAnim === f.label) { track.classList.add('mc-switch-anim'); pendingSwitchAnim = null; }\r\n row.appendChild(track);\r\n wrap.appendChild(row);\r\n return wrap;\r\n }\r\n\r\n if (f.isColor) {\r\n // Flat-accordion design: label at left, one bordered pill at right\r\n // holding the swatch (which doubles as the native picker) and the hex\r\n // field -- the swatch-and-loose-hex layout read as two stray controls.\r\n const row = el('div', { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: '12px' }, { class: 'mc-field-row' });\r\n row.appendChild(fieldLabel(f.label, true));\r\n const pill = el('div', { display: 'flex', alignItems: 'center', flex: 'none', height: '32px', border: '1px solid var(--ed-line)', borderRadius: '8px', background: 'var(--ed-panel)', overflow: 'hidden', transition: 'border-color 0.16s, box-shadow 0.16s' }, { class: 'mc-field-control mc-color-control' });\r\n const swatch = el('label', { position: 'relative', width: '29px', alignSelf: 'stretch', flex: 'none', borderRight: '1px solid var(--ed-line)', background: f.swatch, cursor: 'pointer' }, { title: f.label });\r\n const picker = el('input', { position: 'absolute', inset: '0', width: '100%', height: '100%', opacity: '0', cursor: 'pointer', padding: '0', border: '0' }, { type: 'color' });\r\n picker.value = f.swatch;\r\n // The native picker fires `input` continuously while dragging the hue\r\n // wheel -- committed raw, that is a full re-render per mouse move.\r\n const pickCommit = typeCommit(f.onChange);\r\n picker.addEventListener('input', (e) => pickCommit.call(e.target.value));\r\n picker.addEventListener('change', () => pickCommit.flush());\r\n swatch.appendChild(picker);\r\n const hex = el('input', { width: '82px', boxSizing: 'border-box', background: 'transparent', border: '0', outline: 'none', color: 'var(--ed-text)', fontFamily: 'ui-monospace, monospace', fontSize: '11px', padding: '0 9px' }, { placeholder: 'inherit', class: 'mc-stepper-input', 'data-focus-key': `f${f.key}` });\r\n hex.value = f.value;\r\n const hexCommit = typeCommit(f.onChange);\r\n hex.addEventListener('input', (e) => hexCommit.call(e.target.value));\r\n hex.addEventListener('focus', () => { pill.style.borderColor = 'var(--ed-accent)'; pill.style.boxShadow = '0 0 0 3px var(--ed-soft)'; });\r\n hex.addEventListener('blur', () => { pill.style.borderColor = 'var(--ed-line)'; pill.style.boxShadow = 'none'; hexCommit.flush(); });\r\n pill.append(swatch, hex);\r\n row.appendChild(pill);\r\n wrap.appendChild(row);\r\n return wrap;\r\n }\r\n\r\n if (f.isRow) {\r\n const row = el('div', { display: 'flex', alignItems: 'center', gap: '12px', justifyContent: 'space-between' }, { class: 'mc-field-row' });\r\n row.appendChild(fieldLabel(f.label, true));\r\n if (f.isText) {\r\n const input = el('input', { width: '168px', boxSizing: 'border-box', background: 'var(--ed-panel-2)', border: '1px solid var(--ed-line)', color: 'var(--ed-text)', font: 'inherit', fontSize: '12px', padding: '6px 8px' }, { placeholder: f.placeholder, class: 'mc-field-control', 'data-focus-key': `f${f.key}` });\r\n input.value = f.value;\r\n const textInputCommit = typeCommit(f.onChange);\r\n input.addEventListener('input', (e) => textInputCommit.call(e.target.value));\r\n input.addEventListener('focus', () => { input.style.borderColor = 'var(--ed-accent)'; input.style.outline = 'none'; });\r\n input.addEventListener('blur', () => { input.style.borderColor = 'var(--ed-line)'; textInputCommit.flush(); });\r\n row.appendChild(input);\r\n } else if (f.isNum) {\r\n // text + inputmode for the same caret-restoration reason as the range\r\n // field above.\r\n const input = el('input', { width: '78px', boxSizing: 'border-box', background: 'var(--ed-panel-2)', border: '1px solid var(--ed-line)', color: 'var(--ed-text)', font: 'inherit', fontSize: '12px', padding: '6px 8px' }, { type: 'text', inputmode: 'numeric', class: 'mc-field-control', 'data-focus-key': `f${f.key}` });\r\n input.value = f.value;\r\n const numCommit = typeCommit(f.onChange);\r\n input.addEventListener('input', (e) => numCommit.call(e.target.value));\r\n // Flush before the clamp, same reason as the stepper above.\r\n input.addEventListener('blur', (e) => { input.style.borderColor = 'var(--ed-line)'; numCommit.flush(); if (f.onBlur) f.onBlur(e.target.value); });\r\n input.addEventListener('focus', () => { input.style.borderColor = 'var(--ed-accent)'; input.style.outline = 'none'; });\r\n row.appendChild(input);\r\n } else if (f.isSelect) {\r\n // Focus key so changing a value (which rebuilds the panel) hands focus\r\n // back to the rebuilt select -- without it every dropdown change threw\r\n // keyboard users back to the top of the page.\r\n const select = el('select', { width: '168px', boxSizing: 'border-box', background: 'var(--ed-panel-2)', border: '1px solid var(--ed-line)', color: 'var(--ed-text)', font: 'inherit', fontSize: '12px', padding: '6px 8px' }, { class: 'mc-field-control', 'data-focus-key': `f${f.key}` });\r\n f.options.forEach((o) => { const opt = document.createElement('option'); opt.value = o.value; opt.textContent = o.label; select.appendChild(opt); });\r\n // An unset prop arrives as undefined; assigning that to a <select>\r\n // coerces to the string \"undefined\" and selects nothing -- coerce to ''\r\n // so it lands on the empty-value option (e.g. Font's \"Inherit\").\r\n select.value = f.value == null ? '' : f.value;\r\n select.addEventListener('change', (e) => f.onChange(e.target.value));\r\n select.addEventListener('focus', () => { select.style.borderColor = 'var(--ed-accent)'; select.style.outline = 'none'; });\r\n select.addEventListener('blur', () => { select.style.borderColor = 'var(--ed-line)'; });\r\n row.appendChild(select);\r\n }\r\n wrap.appendChild(row);\r\n return wrap;\r\n }\r\n\r\n return wrap;\r\n}\r\n\r\nfunction renderFieldList(container, fields) {\r\n fields.forEach((f) => container.appendChild(renderField(f)));\r\n}\r\n\nObject.assign(exports, { typeCommit, renderFieldCards, renderField, renderFieldList });\n\n};\n__modules[\"render/focus-preserve.js\"] = function(module, exports, __require) {\n/**\r\n * The original relies on React's reconciliation to keep a focused `<input>`'s\r\n * DOM node alive across a per-keystroke re-render (Design-tab fields, the\r\n * campaign title, AI brief/goal/tone, search boxes, the code textarea all\r\n * commit on every `input` event, not just on blur). This renderer has no\r\n * VDOM -- it rebuilds DOM from scratch -- so without this, typing a single\r\n * character into any of those fields would lose focus immediately after.\r\n *\r\n * The fix: every such input (and every RTE-edited block: text, heading, box,\r\n * html) carries a stable `data-focus-key`. Before a rebuild, capture the\r\n * focused element's key + selection range; after, find the new element with\r\n * the same key and restore focus and the caret position, so the net effect\r\n * matches React's outcome even though the DOM node identity changed.\r\n *\r\n * Contenteditable blocks need this just as much as plain inputs: focusing\r\n * one sets `core.state.editing`, and `EditorCore.mountKeyboard`'s\r\n * `selectionchange` listener refreshes the toolbar's active states on every\r\n * caret move. Without\r\n * caret-position restoration here, that would blow away and recreate the\r\n * focused div each time, so the very first keystroke would silently drop\r\n * focus and the RTE toolbar would appear to do nothing.\r\n */\r\nfunction withFocusPreserved(root, rebuild) {\r\n const active = root.activeElement;\r\n const key = active && active.dataset ? active.dataset.focusKey : null;\r\n let selStart = null; let selEnd = null; let scrollTop = null; let editable = false;\r\n // A range slider mid-drag is the one focus-preservation case where\r\n // restoring focus on a rebuilt node isn't enough: dragging its thumb is a\r\n // native, implicit mouse capture tied to that exact element, and replacing\r\n // the element (as every other rebuilt input does here) silently drops that\r\n // capture -- the thumb stops tracking the mouse and the slider feels like\r\n // it's snapping/jumping instead of gliding. So this one case skips\r\n // rebuilding the node entirely: the live element is pulled out before\r\n // `rebuild()` and spliced back into the freshly-built tree afterward.\r\n const rangeNode = key && active.tagName === 'INPUT' && active.type === 'range' ? active : null;\r\n if (rangeNode) {\r\n // nothing to capture -- the node itself is preserved below, after rebuild()\r\n } else if (key && (active.tagName === 'INPUT' || active.tagName === 'TEXTAREA')) {\r\n try { selStart = active.selectionStart; selEnd = active.selectionEnd; } catch { /* some input types don't support selection */ }\r\n scrollTop = active.scrollTop;\r\n } else if (key && active.isContentEditable) {\r\n editable = true;\r\n const sel = shadowSelection(root);\r\n if (sel && sel.rangeCount && active.contains(sel.anchorNode)) {\r\n const range = sel.getRangeAt(0);\r\n selStart = textOffset(active, range.startContainer, range.startOffset);\r\n selEnd = textOffset(active, range.endContainer, range.endOffset);\r\n }\r\n scrollTop = active.scrollTop;\r\n }\r\n\r\n rebuild();\r\n\r\n if (!key) return;\r\n const next = root.querySelector(`[data-focus-key=\"${cssEscape(key)}\"]`);\r\n if (!next) return;\r\n if (rangeNode) {\r\n for (const attr of ['min', 'max', 'step']) {\r\n const v = next.getAttribute(attr);\r\n if (v === null) rangeNode.removeAttribute(attr); else rangeNode.setAttribute(attr, v);\r\n }\r\n next.replaceWith(rangeNode);\r\n return;\r\n }\r\n if (editable) {\r\n // Set the Range *before* focusing: focusing a contenteditable establishes\r\n // its own default collapsed selection as a side effect, and doing that\r\n // after we've placed the real caret fires a second, out-of-order\r\n // `selectionchange` notification for that now-stale default -- which\r\n // arrives *after* the one for our real restore, so it looks like a fresh,\r\n // later selection change and clobbers the correct caret right back to\r\n // collapsed. Setting the range first means `.focus()` adopts the\r\n // selection that's already there instead of replacing it.\r\n if (selStart != null) {\r\n try {\r\n const range = document.createRange();\r\n setPointAtOffset(range, next, selStart, true);\r\n setPointAtOffset(range, next, selEnd, false);\r\n const sel = shadowSelection(root);\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n } catch { /* ignore -- element structure changed under the caret */ }\r\n }\r\n // `preventScroll` matters a lot here: this `.focus()` fires on every\r\n // re-render of a block mid-edit (every keystroke), not just once. Without\r\n // it, the browser's default focus-scroll-into-view runs every time --\r\n // harmless on a short template, but on a long one it yanks the canvas\r\n // back toward the focused block on every keystroke, fighting whatever\r\n // scroll position the user actually had.\r\n next.focus({ preventScroll: true });\r\n } else {\r\n next.focus({ preventScroll: true });\r\n if (selStart != null) {\r\n try { next.setSelectionRange(selStart, selEnd); } catch { /* ignore */ }\r\n }\r\n }\r\n if (scrollTop != null) next.scrollTop = scrollTop;\r\n}\r\n\r\n/**\r\n * `document.getSelection()`/`window.getSelection()` is redacted to the host\r\n * document when the real selection lives inside an open shadow root -- in\r\n * Chrome its `anchorNode` reports as `<body>` rather than the actual text\r\n * node being edited, even though the visible caret and `execCommand` both\r\n * still operate on the real position. Reading through that redacted object\r\n * (as this file needs to, to compute/restore a caret offset) silently gives\r\n * back garbage -- not an error, just always \"position 0\" -- which is what\r\n * made every re-render-while-typing reset the caret to the start and type\r\n * new characters in reverse. `ShadowRoot.getSelection()` (Chromium-only; no\r\n * standard equivalent yet) reports the real node/offset.\r\n */\r\nfunction shadowSelection(root) {\r\n return typeof root.getSelection === 'function' ? root.getSelection() : window.getSelection();\r\n}\r\n\r\n/** Character offset of (node, offset) counting only text within `root`, walking in document order. */\r\nfunction textOffset(root, node, offset) {\r\n if (node.nodeType !== Node.TEXT_NODE) {\r\n // A range boundary can land on an element (e.g. offset counts child nodes) --\r\n // resolve it to the text position right before its `offset`-th child.\r\n let n = 0;\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\r\n let cur; let target = node.childNodes[offset];\r\n if (!target) { while (walker.nextNode()) n += walker.currentNode.nodeValue.length; return n; }\r\n while ((cur = walker.nextNode())) { if (cur === target || target.contains(cur)) return n; n += cur.nodeValue.length; }\r\n return n;\r\n }\r\n let n = 0;\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\r\n let cur;\r\n while ((cur = walker.nextNode())) {\r\n if (cur === node) return n + offset;\r\n n += cur.nodeValue.length;\r\n }\r\n return n;\r\n}\r\n\r\n/** Sets the start or end point of `range` to the text-offset position inside `root`. */\r\nfunction setPointAtOffset(range, root, targetOffset, isStart) {\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\r\n let n = 0; let cur; let last = null;\r\n while ((cur = walker.nextNode())) {\r\n last = cur;\r\n const len = cur.nodeValue.length;\r\n if (n + len >= targetOffset) {\r\n const point = targetOffset - n;\r\n if (isStart) range.setStart(cur, point); else range.setEnd(cur, point);\r\n return;\r\n }\r\n n += len;\r\n }\r\n if (last) { if (isStart) range.setStart(last, last.nodeValue.length); else range.setEnd(last, last.nodeValue.length); }\r\n else { if (isStart) range.setStart(root, 0); else range.setEnd(root, 0); }\r\n}\r\n\r\nfunction cssEscape(s) {\r\n return String(s).replace(/[\"\\\\]/g, '\\\\$&');\r\n}\r\n\nObject.assign(exports, { withFocusPreserved, textOffset });\n\n};\n__modules[\"render/rte.js\"] = function(module, exports, __require) {\nconst {icon} = __require(\"core/icons.js\");\r\nconst {TOKEN} = __require(\"core/variables.js\");\r\nconst {typeCommit} = __require(\"render/fields.js\");\r\n\r\nfunction el(tag, style, attrs) {\r\n const node = document.createElement(tag);\r\n if (style) Object.assign(node.style, style);\r\n if (attrs) for (const [k, v] of Object.entries(attrs)) {\r\n if (k === 'text') node.textContent = v;\r\n else if (v !== undefined) node.setAttribute(k, v);\r\n }\r\n return node;\r\n}\r\n\r\nfunction st(cmd) { try { return document.queryCommandState(cmd); } catch { return false; } }\r\n\r\n/** Local equivalent of `mailcraft-editor.js`'s `tip()` -- this module doesn't import `elS`, so it builds the same `.mc-tooltip` markup directly. Every RTE control renders its tooltip above itself (`dir: 'up'`), since the toolbar already floats above the block it's editing. */\r\nfunction tipRte(node, label) {\r\n node.style.position = 'relative';\r\n if (!node.hasAttribute('aria-label')) node.setAttribute('aria-label', label);\r\n node.appendChild(el('span', {}, { class: 'mc-rte-tooltip', text: label }));\r\n return node;\r\n}\r\n\r\n/** Humanizes a variable name for display (`first_name` -> `First name`) while the inserted/appended value always stays the exact `{{ token }}` -- display and data are kept deliberately separate. */\r\nfunction humanize(v) {\r\n const s = String(v || '').replace(/[_.]+/g, ' ').trim();\r\n return s.charAt(0).toUpperCase() + s.slice(1);\r\n}\r\n\r\n/** Ported from the original `rte(b)` -- the floating formatting toolbar shown above a focused rich-text block. */\r\nfunction renderRte(core, b) {\r\n const t = core.t;\r\n const btn = (name, title, fn, active) => {\r\n const node = el('button', {\r\n border: '0', borderRadius: '7px', background: active ? 'var(--ed-accent)' : 'transparent', color: active ? 'var(--ed-accent-ink)' : 'var(--rte-muted)',\r\n cursor: 'pointer', width: '28px', height: '28px', display: 'flex', alignItems: 'center', justifyContent: 'center', flex: 'none',\r\n }, { type: 'button', title, 'data-rte-control': '1', 'data-active': active ? 'true' : 'false' });\r\n node.appendChild(icon(name, 14));\r\n node.addEventListener('mousedown', (e) => { e.preventDefault(); e.stopPropagation(); });\r\n node.addEventListener('click', (e) => {\r\n e.preventDefault(); e.stopPropagation(); fn();\r\n if (core.onFormatChange) core.onFormatChange();\r\n });\r\n tipRte(node, title);\r\n return node;\r\n };\r\n const sep = () => el('span', { width: '1px', height: '18px', background: 'var(--rte-border)', margin: '0 4px', flex: 'none' });\r\n /** A native `<input type=\"color\">` behind an icon + a thin current-color swatch bar -- `mousedown`'s `preventDefault` keeps the live text selection from collapsing before the picker opens, the same guard every other control here uses; `core.exec()`'s `savedRange` fallback (editor-core.js) covers the rest, since opening the OS color panel unavoidably moves focus away from the block regardless. */\r\n const colorPicker = (iconName, cmd, initial, title) => {\r\n const label = el('label', {\r\n position: 'relative', width: '30px', height: '28px', borderRadius: '7px', background: 'var(--rte-input)',\r\n boxShadow: 'inset 0 0 0 1px var(--rte-border)', color: 'var(--rte-text)', cursor: 'pointer',\r\n display: 'flex', alignItems: 'center', justifyContent: 'center', flex: 'none', overflow: 'hidden',\r\n }, { 'data-rte-picker': '1', title });\r\n label.appendChild(icon(iconName, 14));\r\n const swatch = el('span', { position: 'absolute', left: '6px', right: '6px', bottom: '4px', height: '3px', borderRadius: '99px', background: initial, pointerEvents: 'none' });\r\n label.appendChild(swatch);\r\n const input = el('input', { position: 'absolute', inset: '0', width: '100%', height: '100%', opacity: '0', margin: '0', cursor: 'pointer' }, { type: 'color', value: initial.startsWith('#') ? initial : '#1d1f20' });\r\n input.addEventListener('mousedown', (e) => e.stopPropagation());\r\n input.addEventListener('click', (e) => e.stopPropagation());\r\n input.addEventListener('input', (e) => { swatch.style.background = e.target.value; core.exec(cmd, e.target.value); });\r\n label.appendChild(input);\r\n tipRte(label, title);\r\n return label;\r\n };\r\n const rowStyle = { display: 'flex', alignItems: 'center', gap: '2px', whiteSpace: 'nowrap' };\r\n const selectStyle = {\r\n background: 'var(--rte-input)', color: 'var(--rte-text)', border: '1px solid var(--rte-border)', borderRadius: '7px',\r\n fontFamily: 'var(--ed-font)', fontSize: '10.5px', fontWeight: '500', letterSpacing: '0', padding: '5px 24px 5px 27px', height: '28px', cursor: 'pointer', maxWidth: '150px', appearance: 'none', WebkitAppearance: 'none', outline: 'none',\r\n };\r\n const selectControl = (label, value, width, iconName, options, onChange) => {\r\n const wrap = el('label', { position: 'relative', display: 'inline-flex', alignItems: 'center', color: 'var(--rte-muted)' }, { 'data-rte-select': '1', 'aria-label': label });\r\n const lead = el('span', { position: 'absolute', left: '8px', zIndex: '2', pointerEvents: 'none', display: 'flex' });\r\n lead.appendChild(icon(iconName, 13));\r\n const select = el('select', Object.assign({}, selectStyle, { width }), { title: label });\r\n options.forEach(([v, l]) => { const o = document.createElement('option'); o.value = v; o.textContent = l; select.appendChild(o); });\r\n select.value = value;\r\n select.addEventListener('mousedown', (e) => e.stopPropagation());\r\n select.addEventListener('change', onChange);\r\n const tail = el('span', { position: 'absolute', right: '7px', pointerEvents: 'none', display: 'flex' });\r\n tail.appendChild(icon('chevronDown', 12));\r\n wrap.append(lead, select, tail);\r\n return wrap;\r\n };\r\n\r\n const vars = core.vars();\r\n const root = el('div', {\r\n position: 'absolute', top: '-82px', left: '0', zIndex: '9', display: 'grid', gap: '5px',\r\n background: 'var(--rte-bg)', border: '1px solid var(--rte-border)', borderRadius: '8px', padding: '7px 8px', boxShadow: 'var(--rte-shadow)',\r\n }, { class: 'mc-rte', 'data-mc-rte': '1', 'data-rte-root': '1' });\r\n root.addEventListener('pointerdown', () => { core.rteActive = true; }, true);\r\n root.addEventListener('mousedown', (e) => e.stopPropagation());\r\n root.addEventListener('click', (e) => e.stopPropagation());\r\n\r\n const r1 = el('div', rowStyle);\r\n const fmt = selectControl(t('rte.textStyle'), core.currentTag(), '118px', 'typeColor',\r\n [['', t('rte.textStyle')], ['p', 'Paragraph'], ['h1', 'Heading 1'], ['h2', 'Heading 2'], ['h3', 'Heading 3'], ['h4', 'Heading 4'], ['h5', 'Heading 5'], ['h6', 'Small heading'], ['blockquote', 'Block quote']], (e) => {\r\n if (e.target.value) {\r\n core.exec('formatBlock', e.target.value);\r\n if (core.onFormatChange) core.onFormatChange();\r\n }\r\n });\r\n r1.append(\r\n fmt, sep(),\r\n btn('bold', 'Bold', () => core.exec('bold'), st('bold')),\r\n btn('italic', 'Italic', () => core.exec('italic'), st('italic')),\r\n btn('underline', 'Underline', () => core.exec('underline'), st('underline')),\r\n btn('strike', 'Strikethrough', () => core.exec('strikeThrough'), st('strikeThrough')),\r\n btn('inlineCode', 'Inline code', () => core.exec('insertHTML', '<code style=\"font-family:ui-monospace,monospace;font-size:0.92em;background:var(--ed-soft);padding:1px 4px\">' + (core.getSelection().toString() || 'code') + '</code>')),\r\n btn('superscript', 'Superscript', () => core.exec('superscript'), st('superscript')),\r\n btn('subscript', 'Subscript', () => core.exec('subscript'), st('subscript')),\r\n sep(),\r\n btn('minus', 'Smaller text', () => core.size(b, -1)),\r\n el('span', { fontFamily: 'var(--ed-font)', fontSize: '9.5px', color: 'var(--rte-muted)', minWidth: '32px', textAlign: 'center' }, { text: (b.props.size || 16) + 'px' }),\r\n btn('plus', 'Larger text', () => core.size(b, 1)),\r\n );\r\n\r\n const r2 = el('div', rowStyle);\r\n r2.append(\r\n btn('alignLeft', 'Align left', () => core.exec('justifyLeft'), st('justifyLeft')),\r\n btn('alignCenter', 'Align center', () => core.exec('justifyCenter'), st('justifyCenter')),\r\n btn('alignRight', 'Align right', () => core.exec('justifyRight'), st('justifyRight')),\r\n btn('alignJustify', 'Justify', () => core.exec('justifyFull'), st('justifyFull')),\r\n sep(),\r\n btn('list', 'Bullet list', () => core.exec('insertUnorderedList'), st('insertUnorderedList')),\r\n btn('listOrdered', 'Numbered list', () => core.exec('insertOrderedList'), st('insertOrderedList')),\r\n btn('outdent', 'Outdent', () => core.exec('outdent')),\r\n btn('indent', 'Indent', () => core.exec('indent')),\r\n sep(),\r\n btn('link', 'Link — ⌘K', () => core.openLink(), !!core.state.linkDraft),\r\n btn('unlink', 'Remove link', () => core.removeLink(b)),\r\n btn('formatClear', t('rte.clearFormatting'), () => core.exec('removeFormat')),\r\n sep(),\r\n colorPicker('typeColor', 'foreColor', '#172033', t('rte.textColor')),\r\n colorPicker('highlighter', 'hiliteColor', '#fef08a', t('rte.highlightColor')),\r\n btn('eraser', t('rte.removeHighlight'), () => core.exec('hiliteColor', 'transparent')),\r\n sep(),\r\n );\r\n const varOptions = [['', vars.length ? t('rte.mergeTags') : t('rte.noMergeTags')]].concat(vars.map((v) => [TOKEN(v), humanize(v)]));\r\n r2.appendChild(selectControl(t('rte.mergeTags'), '', '132px', 'data', varOptions, (e) => {\r\n if (e.target.value) { core.exec('insertText', e.target.value); e.target.value = ''; }\r\n }));\r\n\r\n root.appendChild(r1);\r\n root.appendChild(r2);\r\n if (core.state.linkDraft) root.appendChild(linkPopover(core, b, vars));\r\n return root;\r\n}\r\n\r\n/** Ported from the original `linkPopover(b, vars)`. */\r\nfunction linkPopover(core, b, vars) {\r\n const t = core.t;\r\n const d = core.state.linkDraft;\r\n const set = (patch) => core.setState({ linkDraft: Object.assign({}, core.state.linkDraft, patch) });\r\n const inputStyle = {\r\n flex: '1', minWidth: '0', background: 'var(--rte-input)', color: 'var(--rte-text)', border: '1px solid var(--rte-border)', borderRadius: '5px',\r\n font: 'inherit', fontFamily: 'ui-monospace, monospace', fontSize: '11px', padding: '5px 7px',\r\n };\r\n const act = (label, primary, onClick) => {\r\n const node = el('button', {\r\n border: primary ? '0' : '1px solid var(--rte-border)', borderRadius: '5px', background: primary ? 'var(--ed-accent)' : 'transparent',\r\n color: primary ? 'var(--ed-accent-ink)' : 'var(--rte-text)', cursor: 'pointer', padding: '5px 10px',\r\n fontFamily: 'var(--ed-font)', fontSize: '10.5px', fontWeight: '600',\r\n }, { type: 'button', text: label });\r\n node.addEventListener('mousedown', (e) => e.preventDefault());\r\n node.addEventListener('click', (e) => { e.preventDefault(); onClick(); });\r\n return node;\r\n };\r\n\r\n const root = el('div', { display: 'flex', flexDirection: 'column', gap: '6px', borderTop: '1px solid var(--rte-border)', paddingTop: '6px', marginTop: '2px', minWidth: '380px' });\r\n\r\n const r = el('div', { display: 'flex', alignItems: 'center', gap: '5px' });\r\n const input = el('input', inputStyle, { placeholder: 'https://example.com' });\r\n input.value = d.href;\r\n setTimeout(() => input.focus(), 0);\r\n // Debounced (typeCommit): each draft update re-renders everything. Flushed\r\n // explicitly before applyLink -- both Enter and the Apply button (which\r\n // suppresses blur on mousedown to keep the text selection) read the draft\r\n // from state, so a pending keystroke commit must land first.\r\n const hrefCommit = typeCommit((v) => set({ href: v }));\r\n input.addEventListener('input', (e) => hrefCommit.call(e.target.value));\r\n input.addEventListener('blur', () => hrefCommit.flush());\r\n input.addEventListener('keydown', (e) => {\r\n if (e.key === 'Enter') { e.preventDefault(); hrefCommit.flush(); core.applyLink(b); }\r\n if (e.key === 'Escape') core.setState({ linkDraft: null });\r\n });\r\n r.appendChild(input);\r\n if (vars.length) {\r\n const sel = el('select', { background: 'var(--rte-input)', color: 'var(--rte-text)', border: '1px solid var(--rte-border)', borderRadius: '5px', fontFamily: 'var(--ed-font)', fontSize: '10.5px', padding: '4px', cursor: 'pointer', maxWidth: '110px' }, { title: t('rte.mergeTags') });\r\n const ph = document.createElement('option'); ph.value = ''; ph.textContent = t('rte.mergeTags'); sel.appendChild(ph);\r\n vars.forEach((v) => { const o = document.createElement('option'); o.value = TOKEN(v); o.textContent = humanize(v); sel.appendChild(o); });\r\n sel.addEventListener('change', (e) => { if (e.target.value) { set({ href: (d.href || '') + e.target.value }); e.target.value = ''; } });\r\n r.appendChild(sel);\r\n }\r\n root.appendChild(r);\r\n\r\n const r2 = el('div', { display: 'flex', alignItems: 'center', gap: '8px' });\r\n const label = el('label', { display: 'flex', alignItems: 'center', gap: '5px', color: 'var(--rte-muted)', fontFamily: 'var(--ed-font)', fontSize: '10.5px', fontWeight: '500', cursor: 'pointer' });\r\n const cb = el('input', { accentColor: 'var(--ed-accent)', cursor: 'pointer' }, { type: 'checkbox' });\r\n cb.checked = !!d.blank;\r\n cb.addEventListener('change', (e) => set({ blank: e.target.checked }));\r\n label.append(cb, 'Open in new tab');\r\n r2.appendChild(label);\r\n r2.appendChild(el('span', { flex: '1' }));\r\n if (d.editing) r2.appendChild(act('Remove', false, () => core.removeLink(b)));\r\n r2.appendChild(act('Cancel', false, () => core.setState({ linkDraft: null })));\r\n r2.appendChild(act(d.editing ? 'Update' : 'Apply', true, () => { hrefCommit.flush(); core.applyLink(b); }));\r\n root.appendChild(r2);\r\n\r\n return root;\r\n}\r\n\nObject.assign(exports, { renderRte });\n\n};\n__modules[\"render/screenshot.js\"] = function(module, exports, __require) {\nconst {renderDoc} = __require(\"render/canvas.js\");\r\n\r\n/**\r\n * Full-template screenshot, zero dependencies: render the same static tree\r\n * the preview modal uses (inline styles only), wrap it in an SVG\r\n * `<foreignObject>`, rasterize that through an `<img>` onto a canvas, and\r\n * hand back a PNG Blob.\r\n *\r\n * Two hard rules of SVG-loaded-as-image. The first is that the SVG has to\r\n * reach the `<img>` as a `data:` URI, never a `blob:` one: Chromium treats a\r\n * blob-loaded SVG that contains a `<foreignObject>` as cross-origin content,\r\n * so the canvas comes out tainted and `toBlob()` throws\r\n * (\"Tainted canvases may not be exported\") -- i.e. every capture fails, with\r\n * nothing in the console to say why. A `data:` URI of the same bytes is\r\n * origin-clean and rasterizes identically.\r\n *\r\n * The second is that it may not fetch ANY\r\n * external resource -- not \"CORS applies\", but a total network ban -- so\r\n * every image has to already be a data: URI when the SVG is built. Uploads\r\n * and the seeded placeholders are data: URIs by construction\r\n * (core/assets.js, core/placeholder.js); anything else (a hand-typed image\r\n * URL) is inlined here via a best-effort fetch, and a fetch the remote\r\n * server refuses (no CORS header) degrades to a blank pixel instead of\r\n * silently producing a tainted, unexportable canvas.\r\n *\r\n * Known limits, accepted: `<iframe>` embeds never paint inside foreignObject\r\n * (they render as their reserved box), and web fonts are unavailable, so\r\n * text falls back through the theme's system font stack -- which is what an\r\n * email client would show anyway.\r\n */\r\n\r\nconst BLANK_PIXEL = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';\r\n\r\nfunction toDataUri(url) {\r\n return fetch(url, { mode: 'cors' }).then((res) => {\r\n if (!res.ok) throw new Error('fetch failed: ' + res.status);\r\n return res.blob();\r\n }).then((blob) => new Promise((resolve, reject) => {\r\n const fr = new FileReader();\r\n fr.onload = () => resolve(fr.result);\r\n fr.onerror = reject;\r\n fr.readAsDataURL(blob);\r\n }));\r\n}\r\n\r\nasync function inlineExternalImages(root) {\r\n const jobs = [];\r\n root.querySelectorAll('img').forEach((img) => {\r\n const src = img.getAttribute('src') || '';\r\n if (!src || src.startsWith('data:')) return;\r\n jobs.push(toDataUri(src).then(\r\n (uri) => { img.setAttribute('src', uri); },\r\n () => { img.setAttribute('src', BLANK_PIXEL); },\r\n ));\r\n });\r\n root.querySelectorAll('[style]').forEach((el) => {\r\n const m = (el.style.backgroundImage || '').match(/url\\([\"']?(?!data:)([^\"')]+)[\"']?\\)/);\r\n if (!m) return;\r\n jobs.push(toDataUri(m[1]).then(\r\n (uri) => { el.style.backgroundImage = 'url(\"' + uri + '\")'; },\r\n () => { el.style.backgroundImage = 'none'; },\r\n ));\r\n });\r\n await Promise.all(jobs);\r\n}\r\n\r\n/**\r\n * Renders the current document full-length (desktop width, independent of\r\n * the device toggle and zoom) and returns a PNG Blob at `scale`x resolution.\r\n * `mountInto` is any attached container inside the editor's shadow root --\r\n * the tree must live in the live document briefly, off-screen, to lay out\r\n * and be measured before serialization.\r\n *\r\n * (`export const` + async function expression, not `export async function`:\r\n * build.js's transform only recognizes `export (const|function|class)`.)\r\n */\r\nconst captureTemplatePng = async function (core, mountInto, scale = 2) {\r\n const theme = core.state.doc.theme;\r\n const pad = 32;\r\n const wrapper = document.createElement('div');\r\n // Off-screen but attached (fixed keeps it out of any scroll container's\r\n // scrollHeight, so capturing never moves the user's canvas position).\r\n wrapper.style.cssText = `position: fixed; left: -100000px; top: 0; width: ${theme.width + pad * 2}px; background: ${theme.bg}; padding: ${pad}px; box-sizing: border-box; display: flex; justify-content: center;`;\r\n wrapper.setAttribute('aria-hidden', 'true');\r\n // renderDoc sizes the sheet from `state.device`, so with the mobile toggle\r\n // on it would return a 375px sheet floating inside this desktop-width\r\n // wrapper. Borrow the state for the length of one synchronous render --\r\n // nothing observes it in between, and no re-render is triggered.\r\n const device = core.state.device;\r\n core.state.device = 'desktop';\r\n try {\r\n wrapper.appendChild(renderDoc(core, false));\r\n } finally {\r\n core.state.device = device;\r\n }\r\n mountInto.appendChild(wrapper);\r\n try {\r\n await inlineExternalImages(wrapper);\r\n // Heights depend on images' intrinsic ratios (blocks set width, not\r\n // height) -- decode everything before measuring or tall images collapse.\r\n await Promise.all(Array.from(wrapper.querySelectorAll('img')).map(\r\n (img) => (img.decode ? img.decode().catch(() => {}) : Promise.resolve()),\r\n ));\r\n const w = wrapper.offsetWidth;\r\n const h = wrapper.offsetHeight;\r\n // Serialize a *clone* with the off-screen positioning stripped -- the\r\n // wrapper's own `fixed; left: -100000px` would carry into the SVG and\r\n // place the content outside the drawable area.\r\n const copy = wrapper.cloneNode(true);\r\n copy.style.position = 'static';\r\n copy.style.left = 'auto';\r\n const xml = new XMLSerializer().serializeToString(copy);\r\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${w}\" height=\"${h}\"><foreignObject width=\"100%\" height=\"100%\">${xml}</foreignObject></svg>`;\r\n\r\n const img = new Image();\r\n await new Promise((resolve, reject) => {\r\n img.onload = resolve;\r\n img.onerror = () => reject(new Error('SVG rasterization failed'));\r\n img.src = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(svg);\r\n });\r\n const canvas = document.createElement('canvas');\r\n canvas.width = Math.max(1, Math.round(w * scale));\r\n canvas.height = Math.max(1, Math.round(h * scale));\r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\r\n return await new Promise((resolve, reject) => {\r\n canvas.toBlob((b) => (b ? resolve(b) : reject(new Error('PNG encoding failed'))), 'image/png');\r\n });\r\n } finally {\r\n wrapper.remove();\r\n }\r\n};\r\n\nObject.assign(exports, { captureTemplatePng });\n\n};\n__modules[\"render/story.js\"] = function(module, exports, __require) {\nconst {icon} = __require(\"core/icons.js\");\r\n\r\n/**\r\n * Story-style screenshot viewer: the PNG that `render/screenshot.js` produces\r\n * is a single very tall image, which is exactly the wrong shape for a modal.\r\n * Rather than hand the user a file and hope they open it, this pages through\r\n * the capture the way a phone story does -- a segmented progress rail, one\r\n * screen at a time, auto-advancing -- so the whole template can be reviewed\r\n * in place. Downloading becomes one of the actions under the card instead of\r\n * the only thing the button does.\r\n *\r\n * Everything animates on `transform`/`opacity` alone (never a\r\n * layout-affecting property), which is what keeps the advance smooth even on\r\n * a very long template.\r\n *\r\n * The viewer owns no core state: it is opened imperatively and revokes its\r\n * own object URL, so a re-render of the editor underneath never disturbs it.\r\n */\r\n\r\n/** How long one screen holds before advancing. */\r\nconst PAGE_MS = 3600;\r\n/** Slide duration between screens -- long enough to read as a scroll, short enough not to drag. */\r\nconst SLIDE_MS = 560;\r\n/**\r\n * Each advance moves 92% of a card height, not 100%: the repeated sliver of\r\n * the previous screen is what makes the jump legible as \"further down the\r\n * same email\" rather than a cut to an unrelated image.\r\n */\r\nconst STEP = 0.92;\r\n\r\nfunction el(tag, css, attrs = {}, ...kids) {\r\n const node = document.createElement(tag);\r\n if (css) node.style.cssText = css;\r\n for (const [k, v] of Object.entries(attrs)) {\r\n if (v === undefined) continue;\r\n if (k === 'text') node.textContent = v;\r\n else node.setAttribute(k, v);\r\n }\r\n kids.flat().forEach((c) => { if (c != null && c !== false) node.appendChild(typeof c === 'string' ? document.createTextNode(c) : c); });\r\n return node;\r\n}\r\n\r\nconst GHOST = \"border: 1px solid rgba(255,255,255,0.22); background: rgba(255,255,255,0.1); color: #fff; cursor: pointer; height: 30px; border-radius: 8px; display: flex; align-items: center; justify-content: center; gap: 7px; font-family: var(--ed-font); font-size: 11.5px; font-weight: 600; transition: background 0.16s, border-color 0.16s, opacity 0.16s;\";\r\n\r\nfunction ghostBtn(css, label, iconName, onClick, withText) {\r\n const btn = el('button', GHOST + css, { type: 'button', title: label, 'aria-label': label });\r\n btn.iconSlot = icon(iconName, 14);\r\n btn.labelSlot = withText ? el('span', '', { text: label }) : null;\r\n btn.append(btn.iconSlot);\r\n if (btn.labelSlot) btn.append(btn.labelSlot);\r\n btn.addEventListener('mouseenter', () => { btn.style.background = 'rgba(255,255,255,0.16)'; btn.style.borderColor = 'rgba(255,255,255,0.4)'; });\r\n btn.addEventListener('mouseleave', () => { btn.style.background = 'rgba(255,255,255,0.07)'; btn.style.borderColor = 'rgba(255,255,255,0.22)'; });\r\n btn.addEventListener('click', onClick);\r\n return btn;\r\n}\r\n\r\n/**\r\n * `hooks.capture()` -> Promise<Blob>, called on open and on retry;\r\n * `hooks.download(blob)` and `hooks.copy(blob)` run the host's own save and\r\n * clipboard flows so the toasts stay consistent with the rest of the editor.\r\n *\r\n * (`export const` + function expression, not `export function`: build.js's\r\n * transform only recognizes `export (const|function|class)` -- either form\r\n * works, and this file follows screenshot.js.)\r\n */\r\nconst createStoryViewer = function (core, hooks) {\r\n const t = (key, params) => core.t(key, params);\r\n\r\n const s = {\r\n open: false, page: 0, pages: 1, playing: true, done: false, held: false,\r\n remaining: PAGE_MS, startedAt: 0, timer: 0, token: 0,\r\n url: '', blob: null, natW: 0, natH: 0, cardW: 0, cardH: 0, showH: 0,\r\n };\r\n\r\n // ---- chrome -----------------------------------------------------------\r\n\r\n // Dim only, no backdrop blur -- a full-screen blur is a many-frame stall on\r\n // weak GPUs each time the overlay fades in; the deeper dim carries the focus.\r\n const overlay = el('div', 'position: absolute; inset: 0; z-index: 78; display: none; flex-direction: column; align-items: center; justify-content: center; gap: 11px; padding: 22px; box-sizing: border-box; background: rgba(9,11,16,0.86); opacity: 0; transition: opacity 0.22s ease;', { class: 'mc-story' });\r\n // Clicking the dark surround closes; clicks on the card are the tap zones'\r\n // business and must not fall through to here.\r\n overlay.addEventListener('click', (e) => { if (e.target === overlay) close(); });\r\n\r\n const rail = el('div', 'display: none; gap: 4px; height: 3px; flex: none;');\r\n const headRow = el('div', 'display: flex; align-items: center; gap: 10px; flex: none;');\r\n const headText = el('div', 'flex: 1; min-width: 0;');\r\n const kickerEl = el('div', 'font-family: ui-monospace, monospace; font-size: 8.5px; letter-spacing: 0.16em; text-transform: uppercase; color: rgba(255,255,255,0.5);');\r\n headText.append(kickerEl);\r\n const closeBtn = ghostBtn('width: 30px; padding: 0;', t('action.close'), 'x', () => close());\r\n headRow.append(headText, closeBtn);\r\n\r\n const card = el('div', 'position: relative; overflow: hidden; border-radius: 16px; background: #fff; flex: none; box-shadow: 0 26px 70px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.09); transform: scale(0.965) translateY(10px); opacity: 0; transition: transform 0.34s cubic-bezier(0.22,0.61,0.36,1), opacity 0.24s ease;');\r\n const shot = el('img', 'position: absolute; left: 0; top: 0; width: 100%; display: block; opacity: 0; transform: translate3d(0,0,0); transition: opacity 0.32s ease;', { alt: '' });\r\n card.appendChild(shot);\r\n\r\n // Skeleton: shown while the capture renders and cross-faded out when the\r\n // image arrives, so the card never flashes empty or resizes under the eye.\r\n const skeleton = el('div', 'position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 11px; background: var(--ed-panel); color: var(--ed-faint); transition: opacity 0.28s ease;');\r\n const shimmer = el('div', 'position: absolute; inset: 0; background: linear-gradient(100deg, transparent 22%, var(--ed-soft) 40%, transparent 58%); background-size: 260% 100%; animation: mcStoryShimmer 1.6s linear infinite;');\r\n const skelText = el('div', 'position: relative; font-family: var(--ed-font); font-size: 12.5px; font-weight: 600; color: var(--ed-text);');\r\n const skelHint = el('div', 'position: relative; font-family: ui-monospace, monospace; font-size: 9.5px; letter-spacing: 0.07em; line-height: 1.7; color: var(--ed-faint); max-width: 76%; text-align: center;');\r\n const retryBtn = el('button', 'position: relative; display: none; border: 1px solid var(--ed-line); background: transparent; color: var(--ed-text); cursor: pointer; height: 30px; padding: 0 13px; border-radius: 8px; align-items: center; gap: 7px; font-family: var(--ed-font); font-size: 11.5px; font-weight: 600;', { type: 'button' });\r\n retryBtn.append(icon('refresh', 14), el('span', '', { text: t('story.retry') }));\r\n retryBtn.addEventListener('click', () => load());\r\n skeleton.append(shimmer, skelText, skelHint, retryBtn);\r\n card.appendChild(skeleton);\r\n\r\n // Tap zones, story grammar: the left third steps back, the rest forward.\r\n // A press-and-hold pauses and resumes on release, so `pointerdown` starts\r\n // the pause and only a short press counts as a navigating tap.\r\n const zone = (css, onTap) => {\r\n const z = el('div', 'position: absolute; top: 0; bottom: 0; ' + css + ' cursor: pointer;');\r\n let downAt = 0;\r\n z.addEventListener('pointerdown', () => { downAt = performance.now(); if (s.playing && !s.done) pause(true); });\r\n const up = () => {\r\n if (!downAt) return;\r\n const held = performance.now() - downAt;\r\n downAt = 0;\r\n if (held < 220) onTap();\r\n else if (s.held) play();\r\n };\r\n z.addEventListener('pointerup', up);\r\n z.addEventListener('pointerleave', up);\r\n return z;\r\n };\r\n card.append(\r\n zone('left: 0; width: 32%;', () => step(-1)),\r\n zone('left: 32%; right: 0;', () => step(1)),\r\n );\r\n\r\n const footer = el('div', 'display: flex; align-items: center; gap: 8px; flex: none;');\r\n const metaEl = el('div', 'flex: 1; min-width: 0; font-family: ui-monospace, monospace; font-size: 9px; letter-spacing: 0.09em; color: rgba(255,255,255,0.5); white-space: nowrap; overflow: hidden; text-overflow: ellipsis;');\r\n const playBtn = ghostBtn('width: 30px; padding: 0;', t('story.pause'), 'pause', () => (s.playing ? pause(false) : play()));\r\n const copyBtn = ghostBtn('padding: 0 11px;', t('story.copy'), 'copy', () => hooks.copy(s.blob), true);\r\n const dlBtn = ghostBtn('padding: 0 11px; border-color: rgba(255,255,255,0.4); background: rgba(255,255,255,0.16);', t('action.downloadPng'), 'download', () => hooks.download(s.blob), true);\r\n footer.append(metaEl, playBtn, copyBtn, dlBtn);\r\n\r\n overlay.append(rail, headRow, card, footer);\r\n\r\n // ---- timing -----------------------------------------------------------\r\n\r\n function fills() { return Array.from(rail.children).map((seg) => seg.firstChild); }\r\n\r\n /** Paints the rail for the current screen at `fraction`, optionally running the remainder of that screen's fill. */\r\n function paintRail(fraction, animate) {\r\n fills().forEach((fill, i) => {\r\n fill.style.transition = 'none';\r\n if (i < s.page) { fill.style.transform = 'scaleX(1)'; return; }\r\n if (i > s.page) { fill.style.transform = 'scaleX(0)'; return; }\r\n fill.style.transform = 'scaleX(' + fraction + ')';\r\n if (!animate) return;\r\n void fill.offsetWidth; // commit the start value before arming the run\r\n fill.style.transition = 'transform ' + Math.max(0, s.remaining) + 'ms linear';\r\n fill.style.transform = 'scaleX(1)';\r\n });\r\n }\r\n\r\n /**\r\n * Time is tracked as \"milliseconds still owed on this screen\" rather than\r\n * read back off the animation, so a pause and resume can hand the rail an\r\n * exact starting fraction instead of sampling a computed transform matrix.\r\n */\r\n function arm() {\r\n clearTimeout(s.timer);\r\n if (!s.playing || s.done || s.pages < 2) return;\r\n s.startedAt = performance.now();\r\n paintRail(1 - s.remaining / PAGE_MS, true);\r\n s.timer = setTimeout(() => step(1), s.remaining);\r\n }\r\n\r\n function pause(held) {\r\n if (!s.playing) return;\r\n clearTimeout(s.timer);\r\n s.remaining = Math.max(0, s.remaining - (performance.now() - s.startedAt));\r\n s.playing = false;\r\n s.held = !!held; // a hold resumes on release; the button toggle stays paused\r\n paintRail(1 - s.remaining / PAGE_MS, false);\r\n syncPlayBtn();\r\n }\r\n\r\n function play() {\r\n s.held = false;\r\n if (s.done) { goto(0); return; }\r\n s.playing = true;\r\n arm();\r\n syncPlayBtn();\r\n }\r\n\r\n function syncPlayBtn() {\r\n const label = s.done ? t('story.replay') : s.playing ? t('story.pause') : t('story.play');\r\n const name = s.done ? 'refresh' : s.playing ? 'pause' : 'play';\r\n const next = icon(name, 14);\r\n playBtn.replaceChild(next, playBtn.iconSlot);\r\n playBtn.iconSlot = next;\r\n playBtn.title = label;\r\n playBtn.setAttribute('aria-label', label);\r\n }\r\n\r\n // ---- paging -----------------------------------------------------------\r\n\r\n function offsetFor(page) {\r\n // Shorter than the card (a very short template): centered, never paged.\r\n if (s.showH <= s.cardH) return Math.round((s.cardH - s.showH) / 2);\r\n return -Math.min(Math.round(page * s.cardH * STEP), Math.round(s.showH - s.cardH));\r\n }\r\n\r\n function goto(page, animate) {\r\n const next = Math.max(0, Math.min(s.pages - 1, page));\r\n s.page = next;\r\n s.remaining = PAGE_MS;\r\n if (s.done) { s.done = false; s.playing = true; } // replaying from the end\r\n shot.style.transition = animate === false\r\n ? 'opacity 0.32s ease'\r\n : 'transform ' + SLIDE_MS + 'ms cubic-bezier(0.22,0.61,0.36,1), opacity 0.32s ease';\r\n shot.style.transform = 'translate3d(0, ' + offsetFor(next) + 'px, 0)';\r\n renderMeta();\r\n arm();\r\n syncPlayBtn();\r\n }\r\n\r\n /** One tap/arrow move. Running off the end stops on the last screen rather than looping. */\r\n function step(dir) {\r\n if (dir > 0 && s.page >= s.pages - 1) {\r\n clearTimeout(s.timer);\r\n s.done = true;\r\n s.playing = false;\r\n s.held = false;\r\n paintRail(1, false);\r\n syncPlayBtn();\r\n return;\r\n }\r\n if (dir < 0 && s.page === 0) { goto(0); return; }\r\n goto(s.page + dir);\r\n }\r\n\r\n function renderMeta() {\r\n metaEl.textContent = s.natW ? t('story.meta', { w: s.natW, h: s.natH, i: s.page + 1, n: s.pages }) : '';\r\n }\r\n\r\n // ---- layout -----------------------------------------------------------\r\n\r\n /**\r\n * Sizes the card from the space the shell actually has: as tall as the\r\n * overlay allows, and no wider than 3/4 of that (capped at 430px), which\r\n * keeps a 620px-wide email readable instead of shrinking it to a thumbnail.\r\n * Re-run on resize, and once more when the image's intrinsic size is known.\r\n */\r\n function layout() {\r\n if (!s.open) return;\r\n const availH = Math.max(280, overlay.clientHeight - 44 - 96);\r\n const availW = Math.max(240, overlay.clientWidth - 44);\r\n s.cardH = availH;\r\n s.cardW = Math.max(240, Math.min(430, availW, Math.round(availH * 0.75)));\r\n card.style.width = s.cardW + 'px';\r\n card.style.height = s.cardH + 'px';\r\n [rail, headRow, footer].forEach((n) => { n.style.width = s.cardW + 'px'; });\r\n if (!s.natW) return;\r\n s.showH = s.cardW * (s.natH / s.natW);\r\n s.pages = s.showH <= s.cardH ? 1 : Math.ceil((s.showH - s.cardH) / (s.cardH * STEP)) + 1;\r\n buildRail();\r\n goto(Math.min(s.page, s.pages - 1), false);\r\n }\r\n\r\n function buildRail() {\r\n rail.innerHTML = '';\r\n rail.style.display = s.pages > 1 ? 'flex' : 'none';\r\n for (let i = 0; i < s.pages; i++) {\r\n const fill = el('div', 'width: 100%; height: 100%; border-radius: 2px; background: #fff; transform: scaleX(0); transform-origin: left center;');\r\n rail.appendChild(el('div', 'flex: 1; height: 100%; border-radius: 2px; background: rgba(255,255,255,0.24); overflow: hidden;', {}, fill));\r\n }\r\n }\r\n\r\n // ---- load / open / close ----------------------------------------------\r\n\r\n function setActionsEnabled(on) {\r\n [copyBtn, dlBtn, playBtn].forEach((b) => {\r\n b.disabled = !on;\r\n b.style.opacity = on ? '' : '0.4';\r\n b.style.pointerEvents = on ? '' : 'none';\r\n });\r\n }\r\n\r\n function showSkeleton(failed) {\r\n skeleton.style.display = 'flex';\r\n skeleton.style.opacity = '1';\r\n shimmer.style.display = failed ? 'none' : 'block';\r\n skelText.textContent = failed ? t('story.failed') : t('story.rendering');\r\n skelHint.textContent = failed ? t('story.failedHint') : t('story.renderingHint');\r\n retryBtn.style.display = failed ? 'flex' : 'none';\r\n setActionsEnabled(false);\r\n }\r\n\r\n /**\r\n * `token` guards every async landing: closing (or retrying) bumps it, so a\r\n * capture that finishes after the user moved on can never paint into the\r\n * card or leak its object URL.\r\n */\r\n function load() {\r\n const token = ++s.token;\r\n releaseUrl();\r\n Object.assign(s, { blob: null, natW: 0, natH: 0, page: 0, pages: 1, done: false, playing: true, held: false, remaining: PAGE_MS });\r\n clearTimeout(s.timer);\r\n shot.style.opacity = '0';\r\n rail.style.display = 'none';\r\n renderMeta();\r\n showSkeleton(false);\r\n hooks.capture().then((blob) => {\r\n if (token !== s.token || !s.open) return;\r\n s.blob = blob;\r\n s.url = URL.createObjectURL(blob);\r\n shot.onload = () => {\r\n if (token !== s.token) return;\r\n s.natW = shot.naturalWidth;\r\n s.natH = shot.naturalHeight;\r\n layout();\r\n shot.style.opacity = '1';\r\n skeleton.style.opacity = '0';\r\n setTimeout(() => { if (token === s.token) skeleton.style.display = 'none'; }, 300);\r\n setActionsEnabled(true);\r\n // A template that fits on one screen has nothing to advance through:\r\n // land on \"replay\" rather than running an invisible timer.\r\n if (s.pages < 2) { s.done = true; s.playing = false; }\r\n syncPlayBtn();\r\n arm();\r\n };\r\n shot.src = s.url;\r\n }, () => {\r\n if (token !== s.token || !s.open) return;\r\n showSkeleton(true);\r\n });\r\n }\r\n\r\n function releaseUrl() {\r\n if (!s.url) return;\r\n URL.revokeObjectURL(s.url);\r\n s.url = '';\r\n }\r\n\r\n /**\r\n * Escape and the arrow keys are claimed in the capture phase: the editor's\r\n * own window-level handler (editor-core `mountKeyboard`) would otherwise\r\n * close every modal underneath on the same Escape that closes the story.\r\n */\r\n function onKey(e) {\r\n if (!s.open) return;\r\n if (e.key === 'Escape') { e.stopPropagation(); close(); return; }\r\n if (e.key === 'ArrowRight' || e.key === 'ArrowDown') { e.stopPropagation(); pause(false); step(1); return; }\r\n if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') { e.stopPropagation(); pause(false); step(-1); return; }\r\n if (e.key === ' ') { e.stopPropagation(); e.preventDefault(); if (s.playing) pause(false); else play(); }\r\n }\r\n\r\n let wheelAt = 0;\r\n card.addEventListener('wheel', (e) => {\r\n e.preventDefault();\r\n const now = performance.now();\r\n // One screen per gesture: a trackpad fires dozens of small deltas, and\r\n // acting on each would race the slide against itself.\r\n if (now - wheelAt < SLIDE_MS * 0.8 || Math.abs(e.deltaY) < 6) return;\r\n wheelAt = now;\r\n pause(false);\r\n step(e.deltaY > 0 ? 1 : -1);\r\n }, { passive: false });\r\n\r\n function open() {\r\n if (s.open) return;\r\n s.open = true;\r\n overlay.style.display = 'flex';\r\n overlay.removeAttribute('aria-hidden');\r\n kickerEl.textContent = t('story.kicker');\r\n void overlay.offsetWidth; // start the fade from 0, not from \"already shown\"\r\n overlay.style.opacity = '1';\r\n card.style.transform = 'scale(1) translateY(0)';\r\n card.style.opacity = '1';\r\n layout();\r\n load();\r\n window.addEventListener('keydown', onKey, true);\r\n window.addEventListener('resize', layout);\r\n closeBtn.focus({ preventScroll: true });\r\n }\r\n\r\n function close() {\r\n if (!s.open) return;\r\n s.open = false;\r\n s.token++;\r\n clearTimeout(s.timer);\r\n window.removeEventListener('keydown', onKey, true);\r\n window.removeEventListener('resize', layout);\r\n overlay.style.opacity = '0';\r\n card.style.transform = 'scale(0.965) translateY(10px)';\r\n card.style.opacity = '0';\r\n setTimeout(() => {\r\n if (s.open) return; // reopened during the fade -- leave it as it is\r\n overlay.style.display = 'none';\r\n overlay.setAttribute('aria-hidden', 'true');\r\n shot.removeAttribute('src');\r\n releaseUrl();\r\n s.blob = null;\r\n }, 240);\r\n }\r\n\r\n /** Re-labels the viewer in place after a `locale`/`.messages` change. */\r\n function retranslate() {\r\n closeBtn.title = t('action.close');\r\n closeBtn.setAttribute('aria-label', t('action.close'));\r\n copyBtn.labelSlot.textContent = t('story.copy');\r\n copyBtn.title = t('story.copy');\r\n dlBtn.labelSlot.textContent = t('action.downloadPng');\r\n dlBtn.title = t('action.downloadPng');\r\n retryBtn.lastChild.textContent = t('story.retry');\r\n if (s.open) { kickerEl.textContent = t('story.kicker'); renderMeta(); }\r\n syncPlayBtn();\r\n }\r\n\r\n return { node: overlay, open, close, retranslate, isOpen: () => s.open };\r\n};\r\n\nObject.assign(exports, { createStoryViewer });\n\n};\n__modules[\"render/style.js\"] = function(module, exports, __require) {\n/**\r\n * The editor's chrome stylesheet -- the only CSS that can't be expressed as\r\n * an inline `style` attribute: the two chrome palettes (light/dark), the RTE's\r\n * own token set, shared component classes (segmented controls, tooltips, the\r\n * sheet-wrap/workspace framing), keyframes, and scrollbars. Selectors kept\r\n * scoped to `#mc` / `#mc[data-chrome=\"dark\"]` since the Shadow DOM gives them\r\n * their own namespace. `#mc`'s own height is `100%` here instead of `100vh`,\r\n * since a Web Component sizes to its host element, not the viewport.\r\n */\r\nconst STYLE = `\r\n@import url('https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&display=swap');\r\n:host { display: block; height: 100%; }\r\n#mc, #mc *, #mc *::before, #mc *::after { box-sizing: border-box; }\r\n#mc {\r\n --ed-font: 'Manrope', 'Segoe UI Variable', 'Segoe UI', system-ui, -apple-system, BlinkMacSystemFont, sans-serif;\r\n --ed-bg: #f5f7fa; --ed-panel: #ffffff; --ed-panel-2: #f8fafc; --ed-work: #f1f4f8;\r\n --ed-line: rgba(15,23,42,0.09); --ed-line-2: rgba(15,23,42,0.16);\r\n --ed-text: #172033; --ed-muted: #667085; --ed-faint: #98a2b3;\r\n --ed-panel-label: #344054; --ed-panel-value: #475467; --ed-panel-meta: #7b8799;\r\n --ed-panel-label-size: 12px; --ed-panel-value-size: 11.5px; --ed-panel-meta-size: 9.5px;\r\n --ed-accent: #0065b3; --ed-accent-strong: #00538f; --ed-accent-ink: #ffffff; --ed-soft: rgba(0,101,179,0.09);\r\n --ed-accent-tint: #33a3e8; --ed-glow: rgba(0,101,179,0.28); --ed-select: rgba(0,101,179,0.22);\r\n /* The accent as it must read on the email sheet, which is a white page in\r\n both themes -- so this family does NOT flip with the chrome (see the dark\r\n palette below, where it is deliberately not overridden). */\r\n --ed-accent-sheet: #0065b3; --ed-accent-sheet-strong: #004f8c; --ed-accent-sheet-ink: #ffffff;\r\n --ed-accent-sheet-line: rgba(0,101,179,0.5);\r\n --ed-grid: rgba(71,85,105,0.10);\r\n --ed-danger: #dc4c53; --ed-danger-soft: rgba(220,76,83,0.12);\r\n --ed-success: #1a9f6b; --ed-success-soft: rgba(26,159,107,0.12);\r\n --ed-radius: 10px; --ed-radius-sm: 6px;\r\n --ed-shadow-sm: 0 1px 2px rgba(15,23,42,0.06);\r\n --ed-shadow-md: 0 8px 24px rgba(15,23,42,0.12);\r\n --ed-shadow-lg: 0 20px 48px rgba(15,23,42,0.16);\r\n --rte-bg: #ffffff; --rte-panel: #f8fafc; --rte-input: #f1f5f9;\r\n --rte-border: rgba(15,23,42,0.12); --rte-text: #172033; --rte-muted: #64748b;\r\n --rte-shadow: 0 16px 42px rgba(15,23,42,0.18); --rte-tip-bg: #172033; --rte-tip-text: #ffffff;\r\n}\r\n#mc[data-chrome=\"dark\"] {\r\n --ed-bg: #0b1120; --ed-panel: #111827; --ed-panel-2: #182235; --ed-work: #0d1524;\r\n --ed-line: rgba(226,232,240,0.10); --ed-line-2: rgba(226,232,240,0.18);\r\n --ed-text: #f1f5f9; --ed-muted: #a8b3c4; --ed-faint: #718096;\r\n --ed-panel-label: #e2e8f0; --ed-panel-value: #c0cad8; --ed-panel-meta: #8d9aae;\r\n --ed-accent: #58a8e3; --ed-accent-strong: #8fc4ec; --ed-accent-ink: #08111f; --ed-soft: rgba(88,168,227,0.13);\r\n --ed-accent-tint: #8fcdf2; --ed-glow: rgba(88,168,227,0.28); --ed-select: rgba(88,168,227,0.3);\r\n --ed-grid: rgba(148,163,184,0.08);\r\n --ed-danger: #f2777c; --ed-danger-soft: rgba(242,119,124,0.14);\r\n --ed-success: #4ade95; --ed-success-soft: rgba(74,222,149,0.14);\r\n --ed-shadow-sm: 0 1px 2px rgba(0,0,0,0.24);\r\n --ed-shadow-md: 0 8px 24px rgba(0,0,0,0.34);\r\n --ed-shadow-lg: 0 20px 48px rgba(0,0,0,0.46);\r\n --rte-bg: #111827; --rte-panel: #182235; --rte-input: #1e293b;\r\n --rte-border: rgba(226,232,240,0.14); --rte-text: #f8fafc; --rte-muted: #a8b3c4;\r\n --rte-shadow: 0 18px 46px rgba(0,0,0,0.44); --rte-tip-bg: #e2e8f0; --rte-tip-text: #111827;\r\n}\r\n#mc button, #mc input, #mc select, #mc textarea { border-radius: 8px; }\r\n#mc button { font-family: var(--ed-font); -webkit-tap-highlight-color: transparent; }\r\n#mc button:not(:disabled) { transition-duration: 150ms !important; transition-timing-function: ease !important; }\r\n#mc button:disabled { cursor: default !important; opacity: 0.45; }\r\n#mc input, #mc select, #mc textarea { transition: border-color 150ms ease, background-color 150ms ease, box-shadow 150ms ease; }\r\n/* Custom stepper buttons already cover increment/decrement -- the browser's\r\n own spinner arrows are redundant chrome-on-chrome and look inconsistent\r\n across browsers, so they're hidden everywhere a number input appears. */\r\n#mc input[type=\"number\"] { -moz-appearance: textfield; }\r\n#mc input[type=\"number\"]::-webkit-inner-spin-button,\r\n#mc input[type=\"number\"]::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }\r\n/* Native <select> chrome (system font, OS-drawn arrow) doesn't match the rest\r\n of the UI -- swap in a plain custom arrow and let everything else (font,\r\n color, border, radius) keep flowing from the same inline styles as every\r\n other field. */\r\n/* !important is load-bearing here, not decorative: every select's inline\r\n style sets background: var(--ed-panel-2) (a shorthand), and the CSS\r\n background shorthand implicitly resets background-image to none even\r\n when the declaration never mentions an image -- so without !important\r\n the inline color wins and silently erases this chevron. */\r\n#mc select {\r\n appearance: none; -webkit-appearance: none; -moz-appearance: none;\r\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E\") !important;\r\n background-repeat: no-repeat !important; background-position: right 7px center !important; background-size: 11px !important;\r\n padding-right: 26px !important;\r\n}\r\n#mc[data-chrome=\"dark\"] select {\r\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23a8b3c4' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E\") !important;\r\n}\r\n#mc input[type=\"color\"] { border-radius: var(--ed-radius-sm); overflow: hidden; }\r\n#mc input[type=\"color\"]::-webkit-color-swatch { border: 0; }\r\n#mc input[type=\"color\"]::-webkit-color-swatch-wrapper { padding: 0; }\r\n#mc ::-webkit-scrollbar { width: 9px; height: 9px; }\r\n#mc ::-webkit-scrollbar-thumb { background: var(--ed-line-2); border-radius: 999px; }\r\n#mc ::-webkit-scrollbar-track { background: transparent; }\r\n#mc :focus-visible { outline: 2px solid var(--ed-accent); outline-offset: 2px; }\r\n#mc ::selection { background: var(--ed-select); }\r\n#mc a { color: var(--ed-accent); }\r\n#mc a:hover { color: var(--ed-accent); opacity: 0.72; }\r\n@keyframes mcIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }\r\n@keyframes mcFade { from { opacity: 0; } to { opacity: 1; } }\r\n@keyframes mcPulse { 0%, 100% { opacity: 0.5; } 50% { opacity: 1; } }\r\n@keyframes mcStoryShimmer { from { background-position: 140% 0; } to { background-position: -40% 0; } }\r\n\r\n/*\r\n * Hover/selection outlines on canvas rows and blocks. Re-rendering on every\r\n * mouseover to toggle these would rebuild the whole canvas on every pixel of\r\n * mouse movement, which is what made drag/hover feel un-smooth -- these are\r\n * real CSS instead, same visual result, zero JS.\r\n */\r\n.mc-row-el { outline: 1px solid transparent; transition: outline-color 0.12s; }\r\n.mc-row-el.is-selected { outline: 2px solid var(--ed-accent-sheet); }\r\n.mc-row-el:not(.is-selected):hover { outline: 1px dashed var(--ed-faint); }\r\n.mc-block-el { outline: 1px solid transparent; outline-offset: 1px; transition: outline-color 0.12s; }\r\n.mc-block-el.is-selected { outline: 2px solid var(--ed-accent-sheet); }\r\n.mc-block-el:not(.is-selected):hover { outline: 1px dashed var(--ed-accent-sheet); }\r\n/*\r\n * The grab strip runs the row's whole left edge (see render/canvas.js); the\r\n * visible part is a round badge straddling the selection border. It takes\r\n * --ed-accent-sheet, not --ed-accent, for the same reason as the canvas\r\n * toolbars: the email sheet stays a light page in both chrome themes, so the\r\n * accent here is the one fitted against white (core/accent.js).\r\n */\r\n.mc-row-grip { display: none; }\r\n.mc-row-el:hover .mc-row-grip, .mc-row-el.is-selected .mc-row-grip { display: flex; }\r\n/* The badge's fill lives here, not inline on the element: an inline\r\n background would outrank the hover rule below and the badge would never\r\n light up under the cursor. */\r\n.mc-row-grip-handle { background: var(--ed-accent-sheet); color: var(--ed-accent-sheet-ink); box-shadow: 0 2px 6px rgba(15,23,42,0.3); transition: background 0.14s ease; }\r\n.mc-row-grip:hover .mc-row-grip-handle { background: var(--ed-accent-sheet-strong); }\r\n/* The drag slider (render/fields.js isSlider). The track's filled/empty\r\n split is painted inline as a gradient that follows the thumb; only the\r\n chrome that CSS pseudo-elements own lives here. */\r\n.mc-slider { -webkit-appearance: none; appearance: none; height: 4px; border-radius: 2px; background: var(--ed-line-2); outline: none; cursor: pointer; }\r\n.mc-slider::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 16px; height: 16px; border-radius: 50%; background: var(--ed-accent); border: 0; box-shadow: 0 1px 4px rgba(15,23,42,0.3); cursor: grab; }\r\n.mc-slider::-moz-range-thumb { width: 16px; height: 16px; border-radius: 50%; background: var(--ed-accent); border: 0; box-shadow: 0 1px 4px rgba(15,23,42,0.3); cursor: grab; }\r\n.mc-slider:focus-visible { box-shadow: 0 0 0 3px var(--ed-soft); }\r\n#mc .mc-slider-field { padding-bottom: 8px; }\r\n/* A section bar that opens a tab sits flush under the tabbar's own\r\n border-bottom -- its border-top would double that hairline. */\r\n.mc-section-bar:first-child { border-top: 0; }\r\n.mc-rte { overflow: visible; }\r\n\r\n/* Attribution strip (mailcraft-editor.js buildFooter). Sits on the panel-2\r\n surface with the panel's own hairline above it, so it reads as chrome\r\n rather than as content; the link only takes the accent on hover, since a\r\n permanently colored line would compete with the canvas. */\r\n.mc-footer-link { cursor: pointer; transition: color 0.14s ease; }\r\n.mc-footer-link:hover { color: var(--ed-accent); text-decoration: underline; }\r\n\r\n/* Brand mark -- the small gradient envelope glyph in the header. */\r\n.mc-brand-mark {\r\n display: flex; align-items: center; justify-content: center; flex: none;\r\n width: 26px; height: 26px; border-radius: 8px;\r\n background: linear-gradient(145deg, var(--ed-accent-tint), var(--ed-accent) 55%, var(--ed-accent-strong));\r\n box-shadow: 0 5px 14px var(--ed-glow);\r\n color: #ffffff;\r\n}\r\n\r\n/*\r\n * Shared segmented-control shell -- one bordered/backed track that owns the\r\n * only visible border, with borderless children floating inside it. Avoids\r\n * ever doubling a border: each button gets its own smaller inner radius, the\r\n * wrapper's outer radius is larger, and the gap/padding reveal the track\r\n * background between items instead of adjoining per-button borders.\r\n */\r\n.mc-segment { display: flex; align-items: center; gap: 3px; padding: 3px; border: 1px solid var(--ed-line); border-radius: var(--ed-radius); background: var(--ed-panel); }\r\n.mc-segment button { border: 0; border-radius: 7px; cursor: pointer; transition: background 0.16s, color 0.16s; }\r\n.mc-segment button:hover:not(:disabled):not([aria-pressed=\"true\"]) { background: var(--ed-soft) !important; color: var(--ed-accent) !important; }\r\n.mc-segment button[aria-pressed=\"true\"]:hover { background: var(--ed-accent-strong) !important; color: var(--ed-accent-ink) !important; }\r\n.mc-segment button:disabled { cursor: default; opacity: 0.42; }\r\n\r\n/*\r\n * Shared CSS-only tooltip -- a small bubble shown on hover/focus-visible of\r\n * the positioned parent that owns it, no JS involved in showing/hiding it.\r\n * dir=\"down\" (below the control, e.g. tabs/segments) or dir=\"up\" (above,\r\n * e.g. the RTE toolbar) controls which side it renders on.\r\n */\r\n.mc-tooltip {\r\n position: absolute; left: 50%; transform: translate(-50%, -2px); z-index: 100;\r\n padding: 6px 8px; border-radius: 7px; background: var(--rte-tip-bg); color: var(--rte-tip-text);\r\n font: 500 10.5px/1.2 var(--ed-font); white-space: nowrap;\r\n opacity: 0; visibility: hidden; pointer-events: none;\r\n box-shadow: 0 7px 20px rgba(15,23,42,0.22);\r\n transition: opacity 0.12s ease, transform 0.12s ease, visibility 0s linear 0.12s;\r\n}\r\n.mc-tooltip-down { top: calc(100% + 7px); }\r\n.mc-tooltip-down::before { content: ''; position: absolute; left: 50%; top: -4px; width: 8px; height: 8px; background: var(--rte-tip-bg); transform: translateX(-50%) rotate(45deg); }\r\n.mc-tooltip-up { bottom: calc(100% + 7px); }\r\n.mc-tooltip-up::before { content: ''; position: absolute; left: 50%; bottom: -4px; width: 8px; height: 8px; background: var(--rte-tip-bg); transform: translateX(-50%) rotate(45deg); }\r\n[data-tip]:hover > .mc-tooltip, [data-tip]:focus-visible > .mc-tooltip {\r\n opacity: 1; visibility: visible; transform: translate(-50%, 0); transition-delay: 0s;\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n #mc *, #mc *::before, #mc *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; }\r\n}\r\n\r\n/* Dotted-grid workspace background, shared by the canvas and the preview body. */\r\n.mc-workspace, .mc-preview-body {\r\n background-color: var(--ed-work);\r\n background-image: radial-gradient(circle, var(--ed-grid) 1px, transparent 1.2px);\r\n background-size: 22px 22px;\r\n}\r\n\r\n/*\r\n * The email sheet gets exactly one visible frame. .mc-sheet-wrap is a pure\r\n * positioning element (zero padding/border/background/box-shadow) whose only\r\n * contribution is a drop-shadow filter that hugs the sheet's own silhouette\r\n * rather than boxing it a second time; the sheet itself ([data-mc-sheet])\r\n * carries the one real border/radius/shadow, scoped per context since the\r\n * canvas and the preview modal want slightly different treatments.\r\n */\r\n/* No 'filter' here: a filter on the wrap forces the browser to re-rasterize\r\n the whole email document (and re-run the blur) on every repaint inside it --\r\n selection, hover and typing all stutter on long templates. The sheet's own\r\n box-shadow below provides the depth at per-element paint cost. */\r\n.mc-sheet-wrap { padding: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none; }\r\n.mc-workspace [data-mc-sheet=\"1\"] { border: 1px solid var(--ed-line); border-radius: 6px; box-shadow: 0 2px 5px rgba(15,23,42,0.05), 0 14px 38px rgba(15,23,42,0.10); }\r\n#mc[data-chrome=\"dark\"] .mc-workspace [data-mc-sheet=\"1\"] { border-color: rgba(148,163,184,0.4); box-shadow: 0 0 0 1px rgba(15,23,42,0.4), 0 22px 58px rgba(0,0,0,0.36); }\r\n.mc-preview-body [data-mc-sheet=\"1\"] { border: 1px solid var(--ed-line-2); border-radius: 8px; box-shadow: 0 18px 50px rgba(15,23,42,0.13); }\r\n#mc[data-chrome=\"dark\"] .mc-preview-body [data-mc-sheet=\"1\"] { border-color: rgba(148,163,184,0.4); box-shadow: 0 22px 58px rgba(0,0,0,0.4); }\r\n\r\n/* Final component polish mirrored from the approved standalone editor. */\r\n#mc { --ed-success: #20a779; --ed-danger: #e05766; }\r\n#mc ::-webkit-scrollbar { width: 8px; height: 8px; }\r\n#mc :focus-visible { outline: 3px solid var(--ed-soft); outline-offset: 1px; }\r\n#mc button, #mc input, #mc textarea, #mc select { border-radius: 8px !important; }\r\n#mc button { transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease, background .18s ease, color .18s ease, filter .18s ease !important; }\r\n#mc button:not(:disabled):active { transform: translateY(1px); }\r\n#mc button:disabled { opacity: .42; cursor: not-allowed !important; }\r\n#mc input, #mc textarea, #mc select { box-shadow: inset 0 0 0 1px transparent; transition: border-color .18s ease, box-shadow .18s ease, background .18s ease !important; }\r\n#mc input:focus, #mc textarea:focus, #mc select:focus { border-color: var(--ed-accent) !important; box-shadow: 0 0 0 3px var(--ed-soft); outline: none; }\r\n/* The stepper's value input is a bare number inside the pill -- the generic\r\n focus ring above drew a floating box around the digits mid-control; the\r\n pill itself carries the focus treatment instead (render/fields.js). */\r\n#mc .mc-stepper-input:focus { border-color: transparent !important; box-shadow: none; }\r\n#mc [data-rte-control=\"1\"] { position: relative; overflow: visible !important; border-radius: 5px !important; transition: background .14s ease, color .14s ease, transform .14s ease !important; }\r\n#mc [data-rte-control=\"1\"][data-active=\"false\"]:hover { background: var(--ed-soft) !important; color: var(--ed-accent) !important; }\r\n#mc [data-rte-control=\"1\"]:active { transform: translateY(1px); }\r\n#mc [data-rte-picker=\"1\"] { transition: box-shadow .14s ease, background .14s ease; }\r\n#mc [data-rte-picker=\"1\"]:hover { box-shadow: inset 0 0 0 1px var(--ed-accent), 0 0 0 3px var(--ed-soft) !important; }\r\n#mc .mc-rte-tooltip { position: absolute; left: 50%; bottom: calc(100% + 7px); transform: translate(-50%, 3px); z-index: 120; padding: 5px 7px; border-radius: 5px; background: var(--rte-tip-bg); color: var(--rte-tip-text); font: 500 10px/1.2 var(--ed-font); letter-spacing: 0; white-space: nowrap; opacity: 0; visibility: hidden; pointer-events: none; box-shadow: 0 7px 18px rgba(15,23,42,.20); transition: opacity .12s ease, transform .12s ease, visibility 0s linear .12s; }\r\n#mc .mc-rte-tooltip::after { content: ''; position: absolute; left: 50%; bottom: -3px; width: 7px; height: 7px; background: var(--rte-tip-bg); transform: translateX(-50%) rotate(45deg); }\r\n#mc [data-rte-control=\"1\"]:hover .mc-rte-tooltip, #mc [data-rte-control=\"1\"]:focus-visible .mc-rte-tooltip, #mc [data-rte-picker=\"1\"]:hover .mc-rte-tooltip, #mc [data-rte-picker=\"1\"]:focus-within .mc-rte-tooltip { opacity: 1; visibility: visible; transform: translate(-50%, 0); transition-delay: 0s; }\r\n#mc [data-rte-picker=\"1\"], #mc [data-rte-select=\"1\"] { border-radius: 5px !important; }\r\n#mc [data-rte-root=\"1\"] button, #mc [data-rte-root=\"1\"] input, #mc [data-rte-root=\"1\"] select { border-radius: 5px !important; }\r\n#mc [data-rte-select=\"1\"] select:hover, #mc [data-rte-select=\"1\"]:focus-within select { border-color: var(--ed-accent) !important; box-shadow: 0 0 0 3px var(--ed-soft); }\r\n#mc [data-rte-select=\"1\"] select { background-image: none !important; padding-right: 24px !important; }\r\n#mc .mc-shell { border-color: var(--ed-line) !important; border-radius: 14px; grid-template-rows: 62px 1fr !important; box-shadow: 0 1px 2px rgba(15,23,42,.04), 0 16px 44px rgba(15,23,42,.10) !important; }\r\n\r\r\n/* The header row is pinned above with !important, so a shell built without a\r\r\n header has to say so here too -- otherwise the canvas lands in a 62px track\r\r\n and the editor renders into a sliver. */\r\r\n#mc .mc-shell.mc-no-header { grid-template-rows: 1fr !important; }\r\n/* Opaque, no backdrop-filter: the header sits over the scrolling canvas, so a\r\n backdrop blur re-composites every scroll frame -- visible scroll jank. */\r\n#mc .mc-header { padding: 0 18px !important; background: var(--ed-panel) !important; }\r\n#mc .mc-brand-mark { width: 30px !important; height: 30px !important; border-radius: 9px; background: linear-gradient(145deg, var(--ed-accent-tint), var(--ed-accent) 56%, var(--ed-accent-strong)) !important; box-shadow: 0 7px 18px var(--ed-glow); }\r\n#mc .mc-brand-mark svg { width: 20px; height: 20px; display: block; color: #fff; }\r\n#mc .mc-brand-name { font-family: var(--ed-font) !important; font-size: 17px !important; letter-spacing: -.03em !important; }\r\n#mc .mc-header button { font-family: var(--ed-font) !important; font-size: 10.5px !important; font-weight: 600; letter-spacing: .015em !important; text-transform: none !important; }\r\n#mc .mc-header > div { border-radius: 10px; }\r\n#mc .mc-segment { gap: 3px !important; padding: 3px !important; border: 0 !important; border-radius: 10px; background: var(--ed-panel-2) !important; }\r\n#mc .mc-segment button { min-width: 62px; height: 26px; padding: 0 10px !important; border: 0 !important; border-radius: 7px !important; font-family: var(--ed-font) !important; font-size: 10px !important; font-weight: 600; letter-spacing: .01em !important; text-transform: none !important; }\r\n#mc .mc-field-segment { width: 100%; box-shadow: none; }\r\n#mc .mc-field-segment button { min-width: 0; flex: 1; height: 28px; }\r\n#mc .mc-device-segment { position: relative; z-index: 40; overflow: visible !important; }\r\n#mc .mc-device-segment button { position: relative; min-width: 38px; width: 38px; padding: 0 !important; display: flex; align-items: center; justify-content: center; overflow: visible !important; }\r\n#mc .mc-device-segment button:hover, #mc .mc-device-segment button:focus-visible { z-index: 50; }\r\n#mc .mc-device-segment button svg { width: 15px; height: 15px; display: block; }\r\n#mc .mc-layout { grid-template-columns: minmax(0,1fr) 360px !important; }\r\n#mc .mc-canvas-stage { padding: 28px 40px 150px !important; }\r\n#mc .mc-workspace [data-mc-sheet=\"1\"] { border: 1px solid rgba(15,23,42,.10); border-radius: 4px; background: #ffffff; box-shadow: 0 2px 5px rgba(15,23,42,.05), 0 14px 38px rgba(15,23,42,.10) !important; }\r\n#mc[data-chrome=\"dark\"] .mc-workspace [data-mc-sheet=\"1\"] { border-color: rgba(148,163,184,.46); box-shadow: 0 0 0 1px rgba(15,23,42,.48), 0 22px 58px rgba(0,0,0,.38) !important; }\r\n#mc .mc-preview-body [data-mc-sheet=\"1\"] { border: 1px solid rgba(15,23,42,.12); border-radius: 10px; background: #ffffff; box-shadow: 0 18px 50px rgba(15,23,42,.13) !important; }\r\n#mc[data-chrome=\"dark\"] .mc-preview-body [data-mc-sheet=\"1\"] { border-color: rgba(203,213,225,.42); box-shadow: 0 0 0 1px rgba(15,23,42,.65), 0 24px 65px rgba(0,0,0,.40) !important; }\r\n#mc .mc-inspector { box-shadow: -10px 0 30px rgba(42,47,77,.04); color: var(--ed-panel-label); }\r\n#mc .mc-tabbar { grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); padding: 7px 8px 0; gap: 3px; border-bottom: 0 !important; background: var(--ed-panel) !important; overflow: visible; position: relative; z-index: 12; }\r\n#mc .mc-tabbar button { position: relative; min-width: 0; height: 39px; border-radius: 8px 8px 0 0 !important; padding: 0 !important; display: flex; align-items: center; justify-content: center; font-family: var(--ed-font) !important; }\r\n#mc .mc-tabbar button svg { width: 16px; height: 16px; display: block; }\r\n#mc .mc-tab-surface { width: 100%; min-width: 0; background: var(--ed-panel); color: var(--ed-text); }\r\n#mc .mc-inspector .mc-section-label {\r\n font-size: 10px !important; line-height: 1.2 !important; font-weight: 700 !important;\r\n letter-spacing: .07em !important; color: var(--ed-muted) !important;\r\n}\r\n#mc .mc-inspector .mc-section-body { padding: 12px 14px 16px !important; }\r\n#mc .mc-inspector .mc-section-body > :first-child { margin-top: 0 !important; }\r\n#mc .mc-field-list { display: grid; align-content: start; gap: 12px; }\r\n#mc .mc-field-list .mc-field { min-width: 0; }\r\n#mc .mc-field-list .mc-field-row {\r\n display: grid !important; grid-template-columns: minmax(0, 1fr) 168px;\r\n align-items: center; column-gap: 14px; min-height: 32px;\r\n}\r\n#mc .mc-field-list .mc-field-row > .mc-field-label { min-width: 0; }\r\n#mc .mc-field-list .mc-field-row > .mc-field-control {\r\n width: 100% !important; min-width: 0; box-sizing: border-box;\r\n}\r\n#mc .mc-field-list .mc-field-row > .mc-switch { justify-self: end; }\r\n#mc .mc-field-list .mc-color-control .mc-stepper-input { width: auto !important; flex: 1; min-width: 0; }\r\n#mc .mc-field-list .mc-field-label {\r\n font-family: var(--ed-font) !important; font-size: var(--ed-panel-label-size) !important;\r\n line-height: 1.4 !important; font-weight: 500 !important; color: var(--ed-panel-label) !important;\r\n}\r\n#mc .mc-field-list input:not([type=\"range\"]):not([type=\"color\"]),\r\n#mc .mc-field-list textarea, #mc .mc-field-list select,\r\n#mc .mc-field-list .mc-field-segment button {\r\n font-size: var(--ed-panel-value-size) !important; line-height: 1.4 !important;\r\n}\r\n#mc .mc-field-list input:not([type=\"range\"]):not([type=\"color\"]),\r\n#mc .mc-field-list textarea, #mc .mc-field-list select,\r\n#mc .mc-field-list .mc-field-segment button[aria-pressed=\"false\"] {\r\n color: var(--ed-panel-value) !important;\r\n}\r\n#mc .mc-field-list .mc-stepper span {\r\n font-size: var(--ed-panel-value-size) !important; color: var(--ed-panel-value) !important;\r\n}\r\n#mc .mc-field-list input:not([type=\"range\"]):not([type=\"color\"]):not(.mc-stepper-input),\r\n#mc .mc-field-list select { min-height: 32px; }\r\n#mc .mc-layer-tree { align-content: start; padding-top: 10px !important; }\r\n#mc .mc-tree-section { min-width: 0; border-bottom: 1px solid var(--ed-line); padding-bottom: 13px !important; }\r\n#mc .mc-tree-section.is-selected { box-shadow: none; }\r\n#mc .mc-tree-section + .mc-tree-section { padding-top: 13px !important; }\r\n#mc .mc-tree-section:last-child { border-bottom: 0; padding-bottom: 0 !important; }\r\n#mc .mc-tree-section-node { min-height: 34px; padding: 5px 6px !important; }\r\n#mc .mc-tree-column-node { min-height: 32px !important; padding-block: 4px !important; }\r\n#mc .mc-tree-block-node { min-height: 32px; padding-block: 4px !important; }\r\n#mc .mc-tree-children {\r\n position: relative; display: grid; gap: 2px; margin-inline-start: 18px;\r\n padding-inline-start: 18px;\r\n}\r\n#mc .mc-tree-columns { margin-top: 5px; }\r\n#mc .mc-tree-blocks { margin-top: 2px; margin-bottom: 5px; }\r\n#mc .mc-tree-branch, #mc .mc-tree-children > .mc-tree-node { position: relative; min-width: 0; }\r\n#mc .mc-tree-branch::before, #mc .mc-tree-children > .mc-tree-node::before {\r\n content: ''; position: absolute; inset-inline-start: -18px; top: 16px;\r\n width: 17px; border-top: 1px solid var(--ed-line-2);\r\n}\r\n#mc .mc-tree-branch::after, #mc .mc-tree-children > .mc-tree-node::after {\r\n content: ''; position: absolute; inset-inline-start: -18px; top: -3px; bottom: -3px;\r\n border-inline-start: 1px solid var(--ed-line-2);\r\n}\r\n#mc .mc-tree-branch:last-child::after, #mc .mc-tree-children > .mc-tree-node:last-child::after {\r\n bottom: auto; height: 19px;\r\n}\r\n#mc .mc-tree-node { isolation: isolate; }\r\n#mc .mc-tree-block-node > span:nth-child(2) { min-width: 0; }\r\n#mc .mc-layer-tree .mc-tree-title {\r\n font-size: var(--ed-panel-label-size) !important; line-height: 1.35 !important;\r\n font-weight: 500 !important; color: var(--ed-panel-label) !important;\r\n}\r\n#mc .mc-layer-tree .mc-tree-section-node .mc-tree-title { font-weight: 600 !important; }\r\n#mc .mc-layer-tree .mc-tree-column-node .mc-tree-title {\r\n font-size: var(--ed-panel-value-size) !important; color: var(--ed-panel-value) !important;\r\n}\r\n#mc .mc-layer-tree .mc-tree-count,\r\n#mc .mc-layer-tree .mc-tree-type,\r\n#mc .mc-layer-tree .mc-tree-index {\r\n font-size: var(--ed-panel-meta-size) !important; line-height: 1.3 !important;\r\n font-weight: 600 !important; color: var(--ed-panel-meta) !important;\r\n}\r\n#mc .mc-layer-tree .mc-tree-type { letter-spacing: .035em !important; }\r\n#mc .mc-layer-tree .mc-tree-section.is-selected .mc-tree-index {\r\n color: var(--ed-accent-ink) !important;\r\n}\r\n#mc .mc-tab-tooltip { position: absolute; top: calc(100% + 7px); left: 50%; transform: translate(-50%, -2px); z-index: 100; padding: 6px 8px; border-radius: 7px; background: #172033; color: #ffffff; font: 500 10.5px/1.2 var(--ed-font); letter-spacing: 0; text-transform: none; white-space: nowrap; opacity: 0; visibility: hidden; pointer-events: none; box-shadow: 0 7px 20px rgba(15,23,42,.22); transition: opacity .12s ease, transform .12s ease, visibility 0s linear .12s; }\r\n#mc .mc-tab-tooltip::before { content: ''; position: absolute; left: 50%; top: -4px; width: 8px; height: 8px; background: #172033; transform: translateX(-50%) rotate(45deg); }\r\n#mc [data-tip]:hover .mc-tab-tooltip, #mc [data-tip]:focus-visible .mc-tab-tooltip { opacity: 1; visibility: visible; transform: translate(-50%, 0); transition-delay: 0s; }\r\n#mc[data-chrome=\"dark\"] .mc-tab-tooltip, #mc[data-chrome=\"dark\"] .mc-tab-tooltip::before { background: #e2e8f0; color: #111827; }\r\n/* End-aligned tooltip for controls hugging a right edge: hidden tooltips are\r\n still laid out (visibility, not display), so a centered bubble poking past\r\n the inspector's edge grew a horizontal scrollbar under the panel. */\r\n#mc .mc-tooltip-end { left: auto; right: 0; transform: translate(0, -2px); }\r\n#mc .mc-tooltip-end::before { left: auto; right: 11px; transform: rotate(45deg); }\r\n#mc [data-tip]:hover > .mc-tooltip-end, #mc [data-tip]:focus-visible > .mc-tooltip-end { transform: translate(0, 0); }\r\n/* No backdrop-filter: the dock floats over the scrolling canvas (every frame\r\n would re-blur) and its background is opaque anyway, so the blur never shows. */\r\n#mc .mc-zoom { border-color: var(--ed-line) !important; border-radius: 12px; box-shadow: 0 10px 30px rgba(36,41,70,.15) !important; }\r\n#mc .mc-inspector [draggable=\"true\"] { border-radius: 12px; overflow: hidden; }\r\n#mc .mc-shortcuts { border: 0 !important; border-radius: 12px; padding: 14px !important; background: var(--ed-panel-2); box-shadow: inset 0 0 0 1px var(--ed-line); }\r\n/* Dim only, no backdrop blur: blurring the whole editor behind a modal is the\r\n single most expensive paint the chrome can ask for on weak GPUs. */\r\n#mc .mc-modal-backdrop { background: rgba(14,16,27,.62) !important; }\r\n#mc .mc-modal { border-color: var(--ed-line) !important; border-radius: 18px; overflow: hidden; box-shadow: 0 28px 80px rgba(10,13,28,.30) !important; }\r\n#mc .mc-fullscreen-panel { border-radius: 14px; overflow: hidden; }\r\n#mc .mc-modal button, #mc .mc-fullscreen-panel button { font-family: var(--ed-font) !important; font-size: 10.5px !important; font-weight: 600 !important; letter-spacing: .01em !important; text-transform: none !important; }\r\n#mc .mc-icon-label { display: inline-flex !important; align-items: center; justify-content: center; gap: 6px; }\r\n#mc .mc-icon-label svg, #mc .mc-icon-button svg { width: 14px; height: 14px; display: block; flex: none; }\r\n#mc .mc-icon-button { display: inline-flex !important; align-items: center; justify-content: center; }\r\n#mc .mc-code-panel { grid-template-rows: 58px minmax(0,1fr) auto !important; background: var(--ed-work) !important; }\r\n#mc .mc-code-toolbar, #mc .mc-preview-toolbar { position: relative; z-index: 45; overflow: visible !important; padding: 0 16px !important; background: var(--ed-panel) !important; box-shadow: 0 1px 0 var(--ed-line); }\r\n#mc .mc-code-badge { width: 32px; height: 32px; border-radius: 9px; display: flex !important; align-items: center; justify-content: center; color: var(--ed-accent); background: var(--ed-soft); }\r\n#mc .mc-code-heading { font-family: var(--ed-font) !important; font-size: 14px !important; font-weight: 600 !important; letter-spacing: -.01em !important; }\r\n#mc .mc-code-kicker, #mc .mc-preview-kicker { font-family: var(--ed-font) !important; font-size: 9.5px !important; font-weight: 500; letter-spacing: .025em !important; text-transform: none !important; }\r\n#mc .mc-code-split { gap: 12px; padding: 12px; background: var(--ed-work); }\r\n#mc .mc-code-source, #mc .mc-code-preview { border: 1px solid var(--ed-line) !important; border-radius: 12px; overflow: hidden; background: var(--ed-panel) !important; }\r\n#mc .mc-pane-label { padding: 8px 13px !important; background: var(--ed-panel-2) !important; font-size: 9.5px !important; letter-spacing: .025em !important; text-transform: none !important; }\r\n#mc .mc-code-preview-body { padding: 14px !important; background: var(--ed-work); }\r\n#mc .mc-code-frame { border: 0 !important; border-radius: 9px; box-shadow: 0 5px 20px rgba(15,23,42,.10) !important; }\r\n#mc .mc-code-footer { padding: 8px 16px !important; background: var(--ed-panel); font-family: var(--ed-font) !important; font-size: 9.5px !important; letter-spacing: 0 !important; }\r\n#mc .mc-preview-panel { grid-template-rows: 58px minmax(0,1fr) !important; }\r\n#mc .mc-preview-title { font-family: var(--ed-font); font-size: 12px !important; font-weight: 600; }\r\n#mc .mc-preview-body { padding: 32px 24px !important; background-color: var(--ed-work); background-image: radial-gradient(circle, var(--ed-grid) 1px, transparent 1.2px); background-size: 22px 22px; }\r\n#mc .mc-toast { border-radius: 10px; box-shadow: 0 12px 34px rgba(16,19,36,.28) !important; }\r\n#mc[data-chrome=\"dark\"] .mc-shell { box-shadow: 0 24px 70px rgba(0,0,0,.44) !important; }\r\n#mc[data-chrome=\"dark\"] .mc-header { background: rgba(25,28,41,.88) !important; }\r\n@media (max-width: 1240px) { #mc .mc-layout { grid-template-columns: minmax(0,1fr) 330px !important; } }\r\n\r\n/*\r\n * Inspector switch -- the on/off control in the properties panel. Everything\r\n * visual hangs off the button's own aria-checked, so there is no second\r\n * source of truth for \"is it on\": a pill track that fills with the accent\r\n * color, and a knob that slides (transform, not left, so the motion stays on\r\n * the compositor). Lives at the very end of the sheet, after the polish\r\n * block, because that block's blanket \"#mc button ... border-radius: 8px\r\n * !important\" beats plain specificity -- hence the !important here too.\r\n * (No backticks anywhere in this file's CSS: the whole stylesheet is one\r\n * template literal, so a backtick inside it ends the string.)\r\n */\r\n#mc .mc-switch {\r\n position: relative; flex: none; width: 38px; height: 22px; padding: 0;\r\n border: 0; border-radius: 999px !important; cursor: pointer;\r\n background: var(--ed-line-2); box-shadow: inset 0 0 0 1px var(--ed-line);\r\n}\r\n#mc .mc-switch-knob {\r\n position: absolute; top: 3px; left: 3px; width: 16px; height: 16px;\r\n border-radius: 50%; background: #ffffff; pointer-events: none;\r\n box-shadow: 0 1px 2px rgba(15,23,42,0.30), 0 2px 5px rgba(15,23,42,0.14);\r\n transition: transform 0.18s cubic-bezier(0.22,0.61,0.36,1);\r\n}\r\n#mc .mc-switch[aria-checked=\"true\"] { background: var(--ed-accent); box-shadow: inset 0 0 0 1px var(--ed-accent); }\r\n#mc .mc-switch[aria-checked=\"true\"] .mc-switch-knob { transform: translateX(16px); }\r\n#mc .mc-switch-row:hover .mc-switch { background: color-mix(in srgb, var(--ed-faint) 52%, transparent); }\r\n#mc .mc-switch-row:hover .mc-switch[aria-checked=\"true\"] { background: var(--ed-accent-strong); box-shadow: inset 0 0 0 1px var(--ed-accent-strong); }\r\n#mc .mc-switch-row:hover label { color: var(--ed-text); }\r\n#mc[data-chrome=\"dark\"] .mc-switch-knob { background: #e2e8f0; box-shadow: 0 1px 2px rgba(0,0,0,0.44), 0 2px 5px rgba(0,0,0,0.28); }\r\n/*\r\n * One-shot slide for the switch the user just clicked. A prop change rebuilds\r\n * the panel, so the switch that comes back is a brand new node already in its\r\n * final state -- nothing for a transition to interpolate. render/fields.js tags\r\n * just that one node with .mc-switch-anim, and these keyframes replay the move\r\n * from where the old node stood. Panels that merely open keep painting their\r\n * switches in place, with no animation.\r\n */\r\n#mc .mc-switch-anim[aria-checked=\"true\"] { animation: mcSwitchOn 0.18s cubic-bezier(0.22,0.61,0.36,1); }\r\n#mc .mc-switch-anim[aria-checked=\"false\"] { animation: mcSwitchOff 0.18s cubic-bezier(0.22,0.61,0.36,1); }\r\n#mc .mc-switch-anim[aria-checked=\"true\"] .mc-switch-knob { animation: mcKnobOn 0.18s cubic-bezier(0.22,0.61,0.36,1); }\r\n#mc .mc-switch-anim[aria-checked=\"false\"] .mc-switch-knob { animation: mcKnobOff 0.18s cubic-bezier(0.22,0.61,0.36,1); }\r\n@keyframes mcSwitchOn { from { background: var(--ed-line-2); } }\r\n@keyframes mcSwitchOff { from { background: var(--ed-accent); } }\r\n@keyframes mcKnobOn { from { transform: translateX(0); } }\r\n@keyframes mcKnobOff { from { transform: translateX(16px); } }\r\n\r\n/* The inspector inherits the active chrome palette. Keeping theme ownership\r\n at #mc makes the header, menus, every panel and every field switch together\r\n when light/dark changes, instead of leaving the side panel permanently dark. */\r\n`;\r\n\nObject.assign(exports, { STYLE });\n\n};\n window.MailCraftEditorBundle = __require('index.js');\n})();\n"],
|
|
5
|
+
"mappings": "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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAgciB,CAAC,CAEhC,EACE,OAAO,sBAAwBH,GAAU,UAAU,CACrD,GAAG",
|
|
6
|
+
"names": ["__modules", "__cache", "__require", "key", "module", "exports", "LIGHT_BG", "DARK_BG", "WHITE", "NEAR_BLACK", "MIN_CONTRAST", "clamp255", "n", "toLinear", "channel", "c", "luminance", "contrast", "a", "b", "l1", "l2", "mix", "t", "toHex", "rgba", "alpha", "hslToRgb", "hue", "s", "l", "h", "x", "m", "r", "g", "parseColor", "value", "raw", "hex", "fn", "parts", "num", "out", "chan", "pct", "v", "unit", "fitContrast", "color", "bg", "toward", "step", "inkFor", "accentTokens", "chrome", "dark", "base", "strong", "sheet", "ACCENT_VARS", "uid", "PH", "binder", "getProps", "set", "core", "label", "ph", "min", "max", "cur", "decimals", "clamp", "round", "commit", "opts", "options", "o", "current", "on", "defaultOn", "onClick", "group", "items", "toggle", "decorate", "list", "f", "i", "d", "it", "j", "THEME", "BLOCKS", "DEF", "mk", "blk", "type", "over", "LAYOUTS", "mkRow", "spans", "blocks", "groupRows", "id", "GROUPS", "row", "pair", "PALETTE", "blankDoc", "migrateDoc", "doc", "defaults", "emptied", "hadBlocks", "legacyMarginY", "k", "normalizeDoc", "input", "rowDefaults", "rows", "cols", "evenSpan", "stripComments", "css", "stripAtRules", "semi", "brace", "depth", "specificity", "sel", "ids", "classes", "tags", "inlineStylesheets", "sheets", "rules", "ruleRe", "order", "decls", "at", "prop", "important", "winners", "rule", "matched", "el", "bucket", "seedAssets", "KB", "FOLDERS", "ALL_FOLDER_ID", "normalizeAsset", "resolveLimits", "providerProblems", "validateFiles", "limitsProblem", "migrateTokens", "cleanHtml", "escHtml", "buildHtmlFn", "htmlToDoc", "boxCss", "varsFn", "TOKEN", "INSERT_KEYS", "createTranslator", "clone", "STORAGE_KEY", "TAB_KEY_PREFIX", "TAB_ID_KEY", "DRAFT_TTL", "UPLOAD_CONCURRENCY", "BORDER_STYLES", "charOffset", "root", "node", "offset", "walker", "target", "parseHtmlSource", "src", "parsed", "body", "docFromHtml", "theme", "AI_GOALS", "AI_TONES", "AI_GOAL_VALUES", "EditorCore", "variables", "aiProvider", "iconProvider", "messages", "storageProvider", "storageLimits", "__publicField", "elNode", "e", "index", "blob", "aiGoal", "aiTone", "aiBrief", "prompt", "addText", "html", "size", "msg", "schedule", "patch", "cb", "exportRoot", "tabId", "firstMount", "stale", "isTyping", "typing", "range", "start", "end", "cmd", "arg", "sel2", "plainOnly", "dt", "text", "val", "delta", "assets", "prev", "hist", "fut", "next", "ci", "bi", "rowId", "p", "block", "col", "gr", "acc", "withHtml", "blockId", "from", "to", "dir", "payload", "y", "kids", "idx", "assetId", "provider", "problems", "tpl", "built", "limits", "scope", "name", "q", "assetTarget", "append", "token", "signal", "folders", "page", "files", "accepted", "rejected", "folderId", "results", "worker", "item", "asset", "added", "pending", "done", "fr", "img", "B", "ALIGN", "padF", "curIdx", "adv", "uiToggle", "onChange", "kept", "orphan", "CB", "inherit", "stacks", "code", "cssUrl", "rowBorderCss", "rowMargin", "rowPad", "buildHtml", "state", "grab", "rp", "colInner", "cells", "inner", "cssBody", "tdBg", "tdBorder", "HIDDEN", "safeHref", "scheme", "resolveFooter", "EN", "MESSAGE_KEYS", "ENBase", "overrides", "table", "params", "template", "whole", "defineMessages", "missingKeys", "locale", "LOCALES", "isRtl", "tag", "entry", "AR", "BG", "BN", "CA", "CS", "DA", "DE", "DE_CH", "DZ", "EL", "ES", "ET", "FI", "FR", "HR", "HU", "IT", "LT", "LV", "NB", "NL", "PL", "PT", "RO", "RU", "SK", "SL", "SV", "TR", "UK", "ICONS", "BRAND_GLYPHS", "SOCIAL_BRAND", "contrastInk", "SVG_NS", "icon", "shapes", "svg", "shape", "shapeNode", "brandIcon", "kind", "args", "w", "cx", "cy", "cr", "socialKey", "cleanImportHtml", "PX", "fontPx", "onlyChild", "textAlignOf", "inheritedStyle", "ancestorPxWidth", "factor", "px", "cellPadOf", "tb", "cp", "isHidden", "st", "collapsed", "invisible", "bgImageOf", "applyBgImage", "url", "paddingOf", "setRowPad", "pad", "lineHeightRatio", "ratio", "escapeText", "classifyImage", "href", "isPct", "pxHint", "width", "colPx", "classifyButton", "outerAlign", "hasBg", "pill", "padded", "display", "radiusOf", "bw", "borderSidesOf", "borderStyleOf", "borderColorOf", "SOCIAL_HOSTS", "classifySocial", "anchors", "imgs", "im", "sizes", "names", "named", "a0", "aBg", "aBorder", "aColor", "cell", "cellGap", "marginGap", "gap", "classifyMenu", "classifyDivider", "sw", "bar", "classifySpacer", "classifyHeading", "classifyList", "li", "classifyTable", "counts", "header", "data", "firstCell", "cellStyle", "borderWidth", "CLASSIFIERS", "classifyNode", "isStructural", "unwrapBoxDiv", "child", "INLINE_TAGS", "blocksFromNodes", "nodes", "buf", "bufFirstEl", "flush", "baseEl", "weight", "lh", "isPassthroughTable", "tr", "td", "ib", "normalizeSpans", "total", "scaled", "spansFromCells", "tableWidthPx", "aw", "even", "unwrapNestedLayout", "only", "trs", "bgOf", "short", "padOf", "looksLikeContainer", "applyBg", "applyPad", "ok", "allowed", "sides", "setRowBorder", "style", "applyFrame", "radius", "rowsFromContentTable", "outerCells", "bgSource", "nested", "gapPx", "isGapCell", "gutter", "pads", "p0", "pp", "cellBg", "cellsUniform", "outerBg", "cbg", "crad", "cframe", "cpd", "cellFrame", "frameSrc", "frame", "shadow", "bgiEl", "tPad", "gutterOnBgSource", "cPad", "z", "sum", "contentEl", "lone", "collectRows", "flushBuf", "social", "anchor", "holder", "pd", "spacerH", "themeFromParsedDoc", "outer", "widthCounts", "bestWidth", "fonts", "font", "isPill", "linkCounts", "link", "htmlToRows", "boxStyle", "side", "bits", "centerEmpty", "emptyHorizontal", "rowBorderSides", "rowBg", "ov", "layers", "colsWrap", "colStyle", "parseItems", "cellsOf", "enc", "ht", "scopeCss", "prefix", "head", "json", "PASTE_OK", "walk", "parent", "IMPORT_OK", "IMPORT_STYLES", "CSS_URL_ESCAPE", "u", "ascii", "sniff", "brand", "file", "slice", "resolve", "probe", "sanitizeName", "clean", "dot", "ext", "problem", "accept", "maxW", "maxH", "perDrop", "queue", "bytes", "dims", "measured", "acceptAttribute", "hostLimits", "providerLimits", "missing", "TOOLBAR_ITEMS", "resolveToolbar", "keep", "toolbarKey", "DEFAULT_VARS", "vars", "MailCraftEditor", "ATTRS", "PROPS", "METHODS", "resolveTarget", "createEditor", "container", "onExport", "handle", "isReady", "renderDoc", "LOCALE_TABLES", "renderRte", "renderField", "renderFieldCards", "typeCommit", "hl", "withFocusPreserved", "captureTemplatePng", "createStoryViewer", "STYLE", "elS", "styleStr", "attrs", "children", "ev", "tabsFor", "tip", "align", "direction", "ElementBase", "_old", "requested", "resolved", "hostStyle", "declared", "ref", "force", "clear", "tokens", "computed", "explicit", "png", "brandMark", "markSvg", "iconButtons", "actions", "title", "titleKey", "btn", "iconName", "labelKey", "right", "extraStyle", "now", "wrap", "ms", "vals", "found", "print", "cfg", "linked", "main", "dock", "aside", "mainTop", "mainLeft", "tabBefore", "tabTop", "chromeIcon", "nextIcon", "blockCount", "tabDef", "tab", "selO", "chip", "headText", "dup", "del", "empty", "box", "grid", "txt", "fields", "paletteTiles", "tile", "applyHover", "iconSpan", "layoutBody", "cellsWrap", "sp", "markupBody", "htmlRow", "htmlIcon", "htmlText", "modelBody", "modeSeg", "hint", "openBtn", "rSel", "card", "blockN", "columns", "colIndex", "branch", "colHead", "colChip", "bSel", "typeName", "line", "search", "varSearchCommit", "all", "filtered", "textSpan", "overlay", "modal", "assetSearchCommit", "uploadBtn", "closeBtn", "foldersHead", "foot", "status", "visible", "meta", "metaRow", "downloadBtn", "headIcon", "reloadBtn", "applyBtn", "left", "leftHead", "editorWrap", "previewWrap", "MONO", "ta", "thumb", "lines", "lineCount", "goalWrap", "grp", "toneWrap", "tone", "briefWrap", "briefCommit", "useBtn", "rowCount", "overrideRichFont", "fontFamily", "blockBody", "live", "ctx", "attr", "edit", "content", "wireEditable", "wrapWithRte", "palette", "badge", "source", "iconColor", "provided", "span", "circle", "safe", "mm", "lab", "tbody", "ri", "isHead", "borderSide", "isPlainText", "showRte", "dropLine", "showLine", "tracker", "hideLine", "hideActive", "toolbar", "danger", "rowActions", "blockCtx", "editingBlockId", "rowDropTracker", "rowLines", "isSel", "rowEl", "grip", "gripHandle", "colsEl", "colLines", "bWrap", "colTracker", "endLine", "colEl", "host", "dr", "last", "fire", "pendingSwitchAnim", "fieldLabel", "inline", "sectionCollapsed", "open", "headField", "chev", "localBody", "NETWORKS", "renderSocialItems", "nameCommit", "urlCommit", "xi", "used", "add", "custom", "renderRichLinks", "change", "update", "remove", "targetLabel", "renderTableGrid", "rs", "iconBtnStyle", "dangerHover", "strip", "cbtn", "cellCommit", "stepper", "ctl", "stepBtn", "dec", "mid", "rangeCommit", "inc", "renderRangeGroup", "animKey", "more", "track", "taCommit", "seg", "active", "place", "togLabel", "swatch", "picker", "pickCommit", "hexCommit", "textInputCommit", "numCommit", "select", "opt", "renderFieldList", "rebuild", "selStart", "selEnd", "scrollTop", "editable", "rangeNode", "shadowSelection", "textOffset", "cssEscape", "setPointAtOffset", "targetOffset", "isStart", "len", "point", "tipRte", "humanize", "sep", "colorPicker", "initial", "rowStyle", "selectStyle", "selectControl", "lead", "tail", "r1", "fmt", "r2", "varOptions", "linkPopover", "inputStyle", "act", "primary", "hrefCommit", "BLANK_PIXEL", "toDataUri", "res", "reject", "inlineExternalImages", "jobs", "uri", "mountInto", "scale", "wrapper", "device", "copy", "xml", "canvas", "PAGE_MS", "SLIDE_MS", "STEP", "GHOST", "ghostBtn", "withText", "hooks", "close", "rail", "headRow", "kickerEl", "shot", "skeleton", "shimmer", "skelText", "skelHint", "retryBtn", "load", "zone", "onTap", "downAt", "pause", "up", "held", "play", "footer", "metaEl", "playBtn", "copyBtn", "dlBtn", "fills", "paintRail", "fraction", "animate", "fill", "arm", "syncPlayBtn", "goto", "offsetFor", "renderMeta", "layout", "availH", "availW", "buildRail", "setActionsEnabled", "showSkeleton", "failed", "releaseUrl", "onKey", "wheelAt", "retranslate"]
|
|
7
|
+
}
|