// GENERATED from dc-runtime/src/*.ts — do not edit. Rebuild with `cd dc-runtime && bun run build`.
'use strict';
(() => {
var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) =>
key in obj
? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value })
: (obj[key] = value);
var __publicField = (obj, key, value) =>
__defNormalProp(obj, typeof key !== 'symbol' ? key + '' : key, value);
// src/react.ts
function getReact() {
const R = window.React;
if (!R) throw new Error('dc-runtime: window.React is not available yet');
return R;
}
function getReactDOM() {
const RD = window.ReactDOM;
if (!RD) throw new Error('dc-runtime: window.ReactDOM is not available yet');
return RD;
}
var h = (...args) => getReact().createElement(...args);
// src/parse.ts
function parseDcDocument(doc) {
const dc = doc.querySelector('x-dc');
if (!dc) return null;
const scriptEl = doc.querySelector('script[data-dc-script]');
const { props, preview } = parseDataProps(scriptEl?.getAttribute('data-props') ?? null);
return {
template: dc.innerHTML,
js: scriptEl ? scriptEl.textContent || '' : '',
props,
preview
};
}
function parseDcText(src) {
const openMatch = /]*)?>/.exec(src);
if (!openMatch) return null;
const close = src.lastIndexOf('');
if (close === -1 || close < openMatch.index) return null;
const template = src.slice(openMatch.index + openMatch[0].length, close);
const doc = new DOMParser().parseFromString(src, 'text/html');
const scriptEl = doc.querySelector('script[data-dc-script]');
const { props, preview } = parseDataProps(scriptEl?.getAttribute('data-props') ?? null);
return {
template,
js: scriptEl ? scriptEl.textContent || '' : '',
props,
preview
};
}
function parseDataProps(raw) {
if (!raw) return { props: null, preview: null };
let parsed;
try {
parsed = JSON.parse(raw);
} catch {
return { props: null, preview: null };
}
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
return { props: null, preview: null };
}
const obj = parsed;
const preview = obj.$preview && typeof obj.$preview === 'object' ? obj.$preview : null;
const rest = {};
for (const k of Object.keys(obj)) {
if (k[0] !== '$') rest[k] = obj[k];
}
return { props: Object.keys(rest).length ? rest : null, preview };
}
function dcNameFromPath(pathname) {
let p = pathname || '';
try {
p = decodeURIComponent(p);
} catch {}
const base = p.split('/').pop() || 'Root';
return base.replace(/\.dc\.html$/, '').replace(/\.html?$/, '') || 'Root';
}
// src/boot.ts
var BASE_CSS = `
.sc-placeholder{background:color-mix(in srgb,currentColor 8%,transparent);
border:1px solid color-mix(in srgb,currentColor 50%,transparent);
border-radius:2px;box-sizing:border-box;overflow:hidden}
@keyframes sc-shine{0%{background-position:100% 50%}100%{background-position:0% 50%}}
html.sc-dc-streaming .sc-placeholder,
html.sc-dc-streaming .sc-interp.sc-missing{position:relative;
background:color-mix(in srgb,currentColor 5%,transparent);
border-color:transparent}
html.sc-dc-streaming .sc-placeholder::before,
html.sc-dc-streaming .sc-interp.sc-missing::before{content:'';
position:absolute;inset:0;pointer-events:none;
background:linear-gradient(90deg,rgba(217,119,87,0) 25%,rgba(247,225,211,.95) 37%,rgba(217,119,87,0) 63%);
background-size:400% 100%;animation:sc-shine 1.4s ease infinite}
html.sc-dc-streaming .sc-placeholder:nth-child(n+9 of .sc-placeholder)::before,
html.sc-dc-streaming .sc-interp.sc-missing:nth-child(n+9 of .sc-interp.sc-missing)::before{animation:none;
background:color-mix(in srgb,currentColor 8%,transparent)}
.sc-placeholder-error{padding:4px 8px;font:11px/1.4 ui-monospace,monospace;
color:color-mix(in srgb,currentColor 70%,transparent);word-break:break-word}
.sc-interp.sc-missing{display:inline-block;width:2em;height:1em;overflow:hidden;
vertical-align:text-bottom;background:rgba(255,255,255,.3);border:1px solid rgba(0,0,0,.5);
border-radius:2px;box-sizing:border-box;color:transparent;
user-select:none}
.sc-interp.sc-unresolved{font-family:ui-monospace,monospace;font-size:.85em;
color:color-mix(in srgb,currentColor 50%,transparent);
background:color-mix(in srgb,currentColor 10%,transparent);border-radius:3px;
padding:0 3px}
.sc-host.sc-has-error{position:relative}
.sc-logic-error{position:absolute;top:8px;left:8px;z-index:2147483647;max-width:60ch;
padding:6px 10px;background:#b00020;color:#fff;font:12px/1.4 ui-monospace,monospace;
border-radius:4px;white-space:pre-wrap;pointer-events:none}
/* Mirrors PRINT_BASELINE_CSS in apps/web deck-stage-export.ts \u2014 keep both
in sync until dc-runtime regains a build step. */
@media print {
@page { margin: 0.5cm; }
figure, table { break-inside: avoid; }
#dc-root, #dc-root > .sc-host { height: auto; }
*, *::before, *::after {
print-color-adjust: exact; -webkit-print-color-adjust: exact;
backdrop-filter: none !important; -webkit-backdrop-filter: none !important;
animation-delay: -99s !important; animation-duration: .001s !important;
animation-iteration-count: 1 !important; animation-fill-mode: both !important;
animation-play-state: running !important; transition-duration: 0s !important;
}
}
`;
var FULL_PAGE_CSS = 'html,body{height:100%;margin:0}#dc-root,#dc-root>.sc-host{height:100%}';
function rootNameForDocument(doc, loc) {
let bootPath = loc.pathname || '';
if (!/\.dc\.html?$/i.test(safeDecode(bootPath))) {
try {
bootPath = new URL(doc.baseURI || '/').pathname;
} catch {}
}
return dcNameFromPath(bootPath);
}
function safeDecode(s) {
try {
return decodeURIComponent(s);
} catch {
return s;
}
}
function boot(runtime, doc = document) {
const parsed = parseDcDocument(doc);
if (!parsed) return null;
const React = getReact();
const rootName = rootNameForDocument(doc, location);
runtime.markFetched(rootName);
runtime.setRootName(rootName);
runtime.adoptParsed(rootName, parsed);
if (!window.__resources) {
fetch(location.href)
.then((res) => (res.ok ? res.text() : ''))
.then((t) => {
const raw = t ? parseDcText(t) : null;
if (raw?.template) runtime.updateHtml(rootName, raw.template);
})
.catch(() => {});
}
const dc = doc.querySelector('x-dc');
const hostEl = doc.createElement('div');
hostEl.id = 'dc-root';
dc.replaceWith(hostEl);
if (!parsed.preview) {
const s = doc.createElement('style');
s.textContent = FULL_PAGE_CSS;
doc.head.appendChild(s);
}
const Root = runtime.getDC(rootName);
const entry = runtime.registry.get(rootName);
function StandaloneRoot() {
const [, setTick] = React.useState(0);
React.useEffect(() => {
const sub = () => setTick((n) => n + 1);
entry.subs.add(sub);
return () => {
entry.subs.delete(sub);
};
}, []);
const defaults = React.useMemo(() => {
const d = {};
for (const k in entry.propsMeta || {}) {
const v = entry.propsMeta?.[k]?.default;
if (v !== void 0) d[k] = v;
}
return d;
}, [entry.propsMeta]);
return h(Root, { ...defaults, ...(entry.propOverrides || {}) });
}
const ReactDOM = getReactDOM();
if (ReactDOM.createRoot) ReactDOM.createRoot(hostEl).render(h(StandaloneRoot));
else ReactDOM.render(h(StandaloneRoot), hostEl);
return rootName;
}
// src/expr.ts
var IDENT_RE = /^[A-Za-z_$][A-Za-z0-9_$]*/;
var NUMBER_RE = /^-?\d+(\.\d+)?$/;
function resolve(vals, src) {
const expr = String(src).trim();
if (!expr) return void 0;
if (expr[0] === '(' && expr[expr.length - 1] === ')' && parensWrapWhole(expr)) {
return resolve(vals, expr.slice(1, -1));
}
const eq = findTopLevelEquality(expr);
if (eq) {
const lv = resolve(vals, expr.slice(0, eq.index));
const rv = resolve(vals, expr.slice(eq.index + eq.op.length));
switch (eq.op) {
case '===':
return lv === rv;
case '!==':
return lv !== rv;
case '==':
return lv == rv;
default:
return lv != rv;
}
}
if (expr[0] === '!') return !resolve(vals, expr.slice(1));
if (expr === 'true') return true;
if (expr === 'false') return false;
if (expr === 'null') return null;
if (expr === 'undefined') return void 0;
if (NUMBER_RE.test(expr)) return Number(expr);
if (
expr.length >= 2 &&
(expr[0] === '"' || expr[0] === "'") &&
expr[expr.length - 1] === expr[0]
) {
return expr.slice(1, -1);
}
return resolvePath(vals, expr);
}
function parensWrapWhole(expr) {
let depth = 0;
for (let i = 0; i < expr.length - 1; i++) {
if (expr[i] === '(') depth++;
else if (expr[i] === ')') {
depth--;
if (depth === 0) return false;
}
}
return true;
}
function findTopLevelEquality(expr) {
let depth = 0;
for (let i = 0; i < expr.length; i++) {
const c = expr[i];
if (c === '[' || c === '(') depth++;
else if (c === ']' || c === ')') depth--;
else if (depth === 0 && (c === '=' || c === '!') && expr[i + 1] === '=') {
if (i > 0 && (expr[i - 1] === '=' || expr[i - 1] === '!')) continue;
if (!expr.slice(0, i).trim()) continue;
const op = expr[i + 2] === '=' ? c + '==' : c + '=';
return { index: i, op };
}
}
return null;
}
function resolvePath(vals, expr) {
const head = expr.match(IDENT_RE);
if (!head) return void 0;
let cur = vals == null ? void 0 : vals[head[0]];
let i = head[0].length;
while (i < expr.length) {
if (expr[i] === '.') {
const m = expr.slice(i + 1).match(IDENT_RE) || expr.slice(i + 1).match(/^\d+/);
if (!m) return void 0;
cur = cur == null ? void 0 : cur[m[0]];
i += 1 + m[0].length;
} else if (expr[i] === '[') {
let depth = 1;
let j = i + 1;
while (j < expr.length && depth > 0) {
if (expr[j] === '[') depth++;
else if (expr[j] === ']') {
depth--;
if (depth === 0) break;
}
j++;
}
if (depth !== 0) return void 0;
const key = resolve(vals, expr.slice(i + 1, j));
cur = cur == null ? void 0 : cur[key];
i = j + 1;
} else {
return void 0;
}
}
return cur;
}
// src/encode.ts
var CAMEL_ATTR = 'sc-camel-';
var INLINE_TEXT_TAGS = new Set(
'a abbr b bdi bdo br cite code del dfn em i ins kbd mark q s samp small span strike strong sub sup u var wbr'.split(
' '
)
);
var RAW_WRAP = {
select: 'sc-raw-select',
table: 'sc-raw-table',
tbody: 'sc-raw-tbody',
thead: 'sc-raw-thead',
tfoot: 'sc-raw-tfoot',
tr: 'sc-raw-tr',
td: 'sc-raw-td',
th: 'sc-raw-th',
caption: 'sc-raw-caption'
};
var RAW_UNWRAP = Object.fromEntries(Object.entries(RAW_WRAP).map(([k, v]) => [v, k]));
var EVENT_MAP = {
onclick: 'onClick',
onchange: 'onChange',
oninput: 'onInput',
onsubmit: 'onSubmit',
onkeydown: 'onKeyDown',
onkeyup: 'onKeyUp',
onkeypress: 'onKeyPress',
onmousedown: 'onMouseDown',
onmouseup: 'onMouseUp',
onmouseenter: 'onMouseEnter',
onmouseleave: 'onMouseLeave',
onfocus: 'onFocus',
onblur: 'onBlur',
ondoubleclick: 'onDoubleClick',
oncontextmenu: 'onContextMenu',
onmousemove: 'onMouseMove',
onmouseover: 'onMouseOver',
onmouseout: 'onMouseOut',
onpointerdown: 'onPointerDown',
onpointerup: 'onPointerUp',
onpointermove: 'onPointerMove',
onpointerenter: 'onPointerEnter',
onpointerleave: 'onPointerLeave',
onpointercancel: 'onPointerCancel',
onpointerover: 'onPointerOver',
onpointerout: 'onPointerOut',
ongotpointercapture: 'onGotPointerCapture',
onlostpointercapture: 'onLostPointerCapture',
ontouchstart: 'onTouchStart',
ontouchend: 'onTouchEnd',
ontouchmove: 'onTouchMove',
ontouchcancel: 'onTouchCancel',
ondragstart: 'onDragStart',
ondragend: 'onDragEnd',
ondragenter: 'onDragEnter',
ondragleave: 'onDragLeave',
ondragover: 'onDragOver',
onanimationstart: 'onAnimationStart',
onanimationend: 'onAnimationEnd',
onanimationiteration: 'onAnimationIteration',
ontransitionend: 'onTransitionEnd'
};
var ATTRS = `(?:[^>"']|"[^"]*"|'[^']*')*`;
var IMPORT_SELF_CLOSE_RE = new RegExp('<(x-import|dc-import)(' + ATTRS + ')/>', 'gi');
var CAMEL_ATTR_RE = /(\s)([a-z]+[A-Z][A-Za-z0-9]*)(\s*=)/g;
function encodeCamelAttrs(html) {
return html.replace(
CAMEL_ATTR_RE,
(_, sp, name, eq) =>
sp + CAMEL_ATTR + name.replace(/[A-Z]/g, (c) => '-' + c.toLowerCase()) + eq
);
}
function encodeCase(html) {
html = html.replace(IMPORT_SELF_CLOSE_RE, (_, t, a) => '<' + t + a + '>' + t + '>');
html = html.replace(/)/gi, '/gi, '');
html = encodeCamelAttrs(html);
for (const [real, alias] of Object.entries(RAW_WRAP)) {
html = html.replace(new RegExp('(?)' + real + '(?=[\\s>])', 'gi'), '$1' + alias);
}
return html;
}
function kebabToCamel(s) {
return s.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
}
function cssToObj(css) {
const o = {};
for (const decl of css.split(';')) {
const i = decl.indexOf(':');
if (i < 0) continue;
const prop = decl.slice(0, i).trim();
o[prop.startsWith('--') ? prop : kebabToCamel(prop)] = decl.slice(i + 1).trim();
}
return o;
}
function compileAttr(raw) {
const whole = raw.match(/^\s*\{\{([\s\S]+?)\}\}\s*$/);
if (whole) {
const path = whole[1];
return (vals) => resolve(vals, path);
}
if (raw.includes('{{')) {
const parts = raw.split(/\{\{([\s\S]+?)\}\}/g);
return (vals) => parts.map((s, i) => (i & 1 ? (resolve(vals, s) ?? '') : s)).join('');
}
return () => raw;
}
// src/compile.ts
function collectProps(node, kind, host) {
const propGetters = [];
const pseudoClasses = [];
let hintSize = null;
for (const { name, value } of [...node.attributes]) {
if (name === 'sc-name' || name === 'data-dc-tpl') continue;
let key = name;
if (key.startsWith(CAMEL_ATTR)) key = kebabToCamel(key.slice(CAMEL_ATTR.length));
if (key === 'hint-size') {
hintSize = value;
continue;
}
if (key.startsWith('style-')) {
pseudoClasses.push(host.pseudoClass(key.slice(6), value));
continue;
}
if (kind !== 'dom') {
if (
key.includes('-') &&
!(kind === 'x-import' && (key.startsWith('aria-') || key.startsWith('data-')))
)
key = kebabToCamel(key);
} else {
if (key === 'class') key = 'className';
else if (key === 'for') key = 'htmlFor';
else if (key.startsWith('on'))
key = EVENT_MAP[key] || 'on' + key[2].toUpperCase() + key.slice(3);
}
propGetters.push([key, compileAttr(value)]);
}
return { propGetters, pseudoClasses, hintSize };
}
var HOST_STYLE_PROPS = /* @__PURE__ */ new Set([
'position',
'left',
'right',
'top',
'bottom',
'inset',
'width',
'height',
'z-index',
'transform'
]);
function hostPositionStyle(style) {
const all =
typeof style === 'string'
? cssToObj(style)
: style != null && typeof style === 'object'
? style
: null;
if (!all) return void 0;
const out = {};
for (const [k, v] of Object.entries(all)) {
const kebab = k.replace(/[A-Z]/g, (c) => '-' + c.toLowerCase());
if (HOST_STYLE_PROPS.has(kebab)) out[k] = v;
}
return Object.keys(out).length ? out : void 0;
}
function compileTemplate(html, host) {
const tpl = document.createElement('template');
//! nosemgrep: direct-inner-html-assignment
tpl.innerHTML = encodeCase(html);
let tplN = 0;
(function stamp(node) {
if (node.nodeType === Node.ELEMENT_NODE) {
node.setAttribute('data-dc-tpl', String(tplN++));
}
for (const c of node.childNodes) stamp(c);
})(tpl.content);
const builders = walkChildren(tpl.content, host);
const render = (vals, ctx) => builders.map((b, i) => b(vals || {}, ctx, i));
render.__annotated = tpl.innerHTML;
return render;
}
function walkChildren(node, host) {
return [...node.childNodes].map((c) => walk(c, host)).filter((b) => b != null);
}
var SLIDE_ID_VALUE_RE = /^[0-9a-f]{8}$/;
var DECK_CONTROL_FLOW_RE = /^(sc-if|sc-for|sc-else|dc-import|x-import)$/;
var DECK_AUX_RE = /^(template|script|style|sc-helmet|helmet)$/;
function isDeckMountTag(el) {
if (el.localName === 'deck-stage') return true;
return (
el.localName === 'x-import' &&
(el.getAttribute('component-from-global-scope') || '') === 'deck-stage'
);
}
function walkDeckChildren(el, host) {
const pairs = [...el.childNodes]
.map((c) => ({ c, b: walk(c, host) }))
.filter((p) => p.b !== null);
const kids = pairs.map((p) => p.b);
const seen = /* @__PURE__ */ new Set();
const wsSeen = /* @__PURE__ */ new Map();
const keys = [];
const nextSlideId = new Array(pairs.length);
{
let upcoming = null;
for (let j = pairs.length - 1; j >= 0; j--) {
const n = pairs[j].c;
if (n.nodeType === Node.ELEMENT_NODE) {
const t = n.localName;
upcoming =
!DECK_AUX_RE.test(t) && !DECK_CONTROL_FLOW_RE.test(t)
? n.getAttribute('data-om-slide-id')
: null;
}
nextSlideId[j] = upcoming;
}
}
for (let j = 0; j < pairs.length; j++) {
const { c } = pairs[j];
if (c.nodeType === Node.TEXT_NODE) {
if ((c.nodeValue ?? '').trim() === '') {
const base = nextSlideId[j] ? 'omid-ws:' + nextSlideId[j] : 'omid-ws:aux';
const n = wsSeen.get(base) ?? 0;
wsSeen.set(base, n + 1);
keys.push(n === 0 ? base : base + ':' + n);
continue;
}
return { kids, keys: null };
}
if (c.nodeType !== Node.ELEMENT_NODE) {
keys.push(j);
continue;
}
const child = c;
const tag = child.localName;
if (DECK_AUX_RE.test(tag)) {
keys.push(j);
continue;
}
if (DECK_CONTROL_FLOW_RE.test(tag)) return { kids, keys: null };
const v = child.getAttribute('data-om-slide-id');
if (!v || !SLIDE_ID_VALUE_RE.test(v) || seen.has(v)) {
return { kids, keys: null };
}
seen.add(v);
keys.push('omid:' + v);
}
return { kids, keys };
}
function renderDeckKids(kids, kidKeys, vals, ctx) {
return kids.map((b, j) => {
const k = kidKeys ? kidKeys[j] : j;
const out = b(vals, ctx, k);
return kidKeys != null && typeof out === 'string'
? h(getReact().Fragment, { key: k }, out)
: out;
});
}
function walk(node, host) {
if (node.nodeType === Node.TEXT_NODE) return walkText(node);
if (node.nodeType !== Node.ELEMENT_NODE) return null;
const el = node;
const tag = el.tagName.toLowerCase();
if (tag === 'sc-for') return walkFor(el, host);
if (tag === 'sc-if') return walkIf(el, host);
if (tag === 'x-import') return walkXImport(el, host);
if (tag === 'sc-helmet') return host.helmet(el);
if (tag === 'dc-import') return walkComponent(el, host);
return walkElement(el, host);
}
var warnedHoles = /* @__PURE__ */ new Set();
function warnUnresolved(ctx, what) {
const key = (ctx?.__name || '?') + '\0' + what;
if (warnedHoles.has(key)) return;
warnedHoles.add(key);
console.warn('[dc-runtime] ' + (ctx?.__name || 'template') + ': ' + what);
}
function walkText(node) {
const txt = node.nodeValue ?? '';
if (!txt.includes('{{')) {
if (!txt.trim() && !txt.includes(' ')) return null;
return () => txt;
}
const parts = txt.split(/\{\{([\s\S]+?)\}\}/g);
return (vals, ctx, key) =>
h(
getReact().Fragment,
{ key },
...parts.map((p, i) => {
if (!(i & 1)) return p;
const v = resolve(vals, p);
if (v === void 0) {
if (!ctx?.__streamingNow) {
if (document.body?.hasAttribute('data-dc-editor-on')) {
return h(
'span',
{ key: i, className: 'sc-interp sc-unresolved' },
'{{ ' + p.trim() + ' }}'
);
}
warnUnresolved(ctx, '{{ ' + p.trim() + ' }} never resolved \u2014 rendered as empty');
return null;
}
return h('span', { key: i, className: 'sc-interp sc-missing' }, p.trim());
}
if (getReact().isValidElement(v) || Array.isArray(v)) {
return h(getReact().Fragment, { key: i }, v);
}
if (v === null || typeof v === 'boolean') return null;
return h('span', { key: i, className: 'sc-interp' }, String(v));
})
);
}
function walkFor(el, host) {
const listGet = compileAttr(el.getAttribute('list') || '');
const asName = el.getAttribute('as') || 'item';
const hintN = parseInt(el.getAttribute('hint-placeholder-count') || '0', 10);
const kids = walkChildren(el, host);
const listSrc = el.getAttribute('list') || '';
return (vals, ctx, key) => {
let list = listGet(vals);
if (!Array.isArray(list)) {
if (!ctx?.__streamingNow) {
if (list !== void 0 && list !== null) {
warnUnresolved(
ctx,
'sc-for list="' + listSrc + '" is not an array (' + typeof list + ')'
);
}
list = [];
} else {
list = hintN > 0 ? Array(hintN).fill(void 0) : [];
}
}
return h(
getReact().Fragment,
{ key },
list.map((item, i) => {
const sub = { ...vals, [asName]: item, $index: i };
return h(
getReact().Fragment,
{ key: i },
kids.map((b, j) => b(sub, ctx, j))
);
})
);
};
}
function walkIf(el, host) {
const valGet = compileAttr(el.getAttribute('value') || '');
const hintRaw = el.getAttribute('hint-placeholder-val');
const hintGet = hintRaw != null ? compileAttr(hintRaw) : null;
const kids = walkChildren(el, host);
return (vals, ctx, key) => {
let v = valGet(vals);
if (v === void 0 && hintGet && ctx?.__streamingNow) v = hintGet(vals);
return v
? h(
getReact().Fragment,
{ key },
kids.map((b, j) => b(vals, ctx, j))
)
: null;
};
}
function walkComponent(el, host) {
const name = el.getAttribute('name') || el.getAttribute('component') || '';
el.removeAttribute('name');
el.removeAttribute('component');
const tplId = el.getAttribute('data-dc-tpl');
const styleRaw = el.getAttribute('style');
el.removeAttribute('style');
const styleGet = styleRaw != null ? compileAttr(styleRaw) : null;
const { propGetters, hintSize } = collectProps(el, 'dc-import', host);
const kids = walkChildren(el, host);
return (vals, ctx, key) => {
const props = {
key,
__hintSize: hintSize,
__tplId: tplId,
__hostStyle: styleGet ? hostPositionStyle(styleGet(vals)) : void 0
};
for (const [k, g] of propGetters) {
const v = g(vals);
if (k === 'dcProps') {
if (v && typeof v === 'object') Object.assign(props, v);
continue;
}
props[k] = v;
}
if (kids.length) props.children = kids.map((b, j) => b(vals, ctx, j));
return h(host.component(name), props);
};
}
function walkXImport(el, host) {
const globalNameGet = compileAttr(el.getAttribute('component-from-global-scope') || '');
const exportNameGet = compileAttr(
el.getAttribute('component') || el.getAttribute('name') || ''
);
const fromRaw =
el.getAttribute('from') ||
(el.getAttribute('component-from-global-scope')
? ''
: el.getAttribute('src') || el.getAttribute('import') || '');
const urls = fromRaw.trim() ? fromRaw.trim().split(/\s+/) : [];
const url = urls.length ? urls[urls.length - 1] : '';
const kindOf = (u) => (/\.(jsx|tsx)(\?|#|$)/i.test(u) ? 'jsx' : 'js');
const tplId = el.getAttribute('data-dc-tpl');
const styleRaw = el.getAttribute('style');
el.removeAttribute('style');
const styleGet = styleRaw != null ? compileAttr(styleRaw) : null;
const wrap = tplId != null || styleGet != null;
const { propGetters, hintSize } = collectProps(el, 'x-import', host);
const hasContent = el.children.length > 0 || !!(el.textContent || '').trim();
const deckKeyed = hasContent && isDeckMountTag(el) ? walkDeckChildren(el, host) : null;
const kids = deckKeyed ? deckKeyed.kids : hasContent ? walkChildren(el, host) : [];
const kidKeys = deckKeyed?.keys ?? null;
const urlBindable = fromRaw.includes('{{');
if (urls.length && !urlBindable) {
let prev;
for (const u of urls) prev = host.loadExternal(kindOf(u), u, prev);
}
const evalName = (g, vals) => {
const v = g(vals);
const s = v == null ? '' : String(v);
return s.includes('{{') ? '' : s;
};
return (vals, ctx, key) => {
const globalName = evalName(globalNameGet, vals);
const name = globalName || evalName(exportNameGet, vals);
const C =
!name || urlBindable
? null
: globalName
? host.resolveExternalGlobal(url, globalName)
: host.resolveExternal(url, name);
const hostStyle = styleGet ? hostPositionStyle(styleGet(vals)) : void 0;
const wrapper = wrap
? {
key,
className: 'sc-host-x',
'data-dc-tpl': tplId,
style: hostStyle || { display: 'contents' }
}
: null;
if (!C) {
const error = urlBindable
? 'x-import `from` cannot contain {{ \u2026 }} \u2014 module URLs are resolved at parse time; use a literal URL'
: host.resolveExternalError(url, name);
const ph = host.placeholder({
key: wrapper ? void 0 : key,
name,
hintSize,
error
});
return wrapper ? h('div', wrapper, ph) : ph;
}
const props = wrapper ? {} : { key };
let unresolvedHole = false;
for (const [k, g] of propGetters) {
if (k === 'component' || k === 'componentFromGlobalScope' || k === 'from') {
continue;
}
const v = g(vals);
if (v === void 0) unresolvedHole = true;
if (k === 'dcProps') {
if (v && typeof v === 'object') Object.assign(props, v);
continue;
}
props[k] = v;
}
if (unresolvedHole && ctx?.__htmlStreamingNow) {
const ph = host.placeholder({
key: wrapper ? void 0 : key,
name,
hintSize,
error: null
});
return wrapper ? h('div', wrapper, ph) : ph;
}
if (kids.length) {
props.children = renderDeckKids(kids, kidKeys, vals, ctx);
}
return wrapper ? h('div', wrapper, h(C, props)) : h(C, props);
};
}
function contentKey(el) {
const clone = el.cloneNode(true);
for (const d of clone.querySelectorAll('*')) {
while (d.attributes.length) d.removeAttribute(d.attributes[0].name);
}
const s = clone.innerHTML;
let h2 = 5381;
for (let i = 0; i < s.length; i++) h2 = ((h2 << 5) + h2 + s.charCodeAt(i)) | 0;
return s.length + '.' + (h2 >>> 0).toString(36);
}
var NEVER_CONTENT_KEYED = new Set(
'script style textarea option title select canvas iframe video audio'.split(' ')
);
var NOT_INLINE_SELECTOR = ':not(' + [...INLINE_TEXT_TAGS].join(',') + ')';
function walkElement(el, host) {
const realTag = RAW_UNWRAP[el.localName] || el.localName;
const tplId = el.getAttribute('data-dc-tpl');
const inlineOnly =
el.childNodes.length > 0 &&
!NEVER_CONTENT_KEYED.has(realTag) &&
el.querySelector(NOT_INLINE_SELECTOR) === null;
const keySuffix = inlineOnly ? '|' + contentKey(el) : '';
const { propGetters, pseudoClasses } = collectProps(el, 'dom', host);
const deckKeyed = isDeckMountTag(el) ? walkDeckChildren(el, host) : null;
const kids = deckKeyed ? deckKeyed.kids : walkChildren(el, host);
const kidKeys = deckKeyed?.keys ?? null;
return (vals, ctx, key) => {
const props = {
key: key + keySuffix,
'data-dc-tpl': tplId
};
for (const [k, g] of propGetters) {
let v = g(vals);
if (k === 'style' && typeof v === 'string') v = cssToObj(v);
if ((k === 'value' || k === 'checked') && v === void 0) {
v = k === 'checked' ? false : '';
}
props[k] = v;
}
if (pseudoClasses.length) {
props.className = [props.className, ...pseudoClasses].filter(Boolean).join(' ');
}
return h(realTag, props, ...renderDeckKids(kids, kidKeys, vals, ctx));
};
}
// src/logic.ts
var StreamableLogic = class {
constructor(props) {
__publicField(this, 'props');
__publicField(this, 'state', {});
/** Back-pointer to the wrapper component, installed after construction. */
__publicField(this, '__host');
this.props = props || {};
}
setState(update, cb) {
this.__host && this.__host.__setLogicState(update, cb);
}
forceUpdate() {
this.__host && this.__host.forceUpdate();
}
componentDidMount() {}
componentDidUpdate(_prevProps) {}
componentWillUnmount() {}
/** The flat object the template renders against (merged over props). */
renderVals() {
return {};
}
};
function evalDcLogic(src) {
//! nosemgrep: eval-and-function-constructor
const fn = new Function(
'DCLogic',
'StreamableLogic',
'React',
src + '\n;return (typeof Component!=="undefined"&&Component)||undefined;'
);
return fn(StreamableLogic, StreamableLogic, getReact());
}
// src/component.ts
function shallowEqual(a, b) {
if (!b) return false;
const ak = Object.keys(a).filter((k) => k !== 'children');
const bk = Object.keys(b).filter((k) => k !== 'children');
if (ak.length !== bk.length) return false;
for (const k of ak) if (a[k] !== b[k]) return false;
return true;
}
function Placeholder({ name, hintSize, streaming, error }) {
const [w, hgt] = (hintSize || '100%,60px').split(',');
return h(
'div',
{
className: 'sc-placeholder' + (streaming ? ' sc-streaming' : ''),
style: { width: w.trim(), height: hgt && hgt.trim() },
title: name
},
error
? h('div', { className: 'sc-placeholder-error' }, (name ? name + ': ' : '') + error)
: null
);
}
function hintToMin(hint) {
if (!hint) return void 0;
const [w, hgt] = hint.split(',');
return { minWidth: w.trim(), minHeight: hgt && hgt.trim() };
}
function createComponentFactory(registry, ensureFetched) {
const React = getReact();
const AncestorContext = React.createContext([]);
class StreamableComponent extends React.Component {
constructor(props) {
super(props);
__publicField(this, '__name');
__publicField(this, '__sub');
__publicField(this, '__needsDidMount', false);
/** Snapshot of the registry's streaming flags taken at render time —
* builders read it off the RenderCtx (this) to pick placeholder vs
* render-nothing for unresolved values. */
__publicField(this, '__streamingNow', false);
__publicField(this, '__htmlStreamingNow', false);
/** When a construct throws, remember the (class, registry.ver, props)
* triple so render-time reconcile doesn't re-attempt it on every parent
* re-render. A registry bump (new class, template, external module
* resolving via bumpAll) changes `ver` and breaks the memo so an
* env-dependent constructor can self-heal. */
__publicField(this, '__failedLogic', null);
__publicField(this, '__failedUserProps', null);
__publicField(this, '__failedVer', -1);
/** Per-instance constructor error — kept here (not on the registry entry)
* so one instance's successful construct can't hide a sibling's failure,
* and a construct can never wipe an eval error `updateJs` recorded on
* `r.logicError`. */
__publicField(this, '__ctorError', null);
__publicField(this, 'logic');
this.__name = props.__name;
this.state = { __v: 0, __err: null };
this.__sub = () => {
if (this.state.__err) this.setState({ __err: null });
this.forceUpdate();
};
this.__makeLogic(registry.get(this.__name).Logic, null);
ensureFetched(this.__name);
}
/** Error-boundary hook: a render crash anywhere in this DC's subtree
* (its own template, an x-import'd component, a child DC without its
* own deeper boundary) lands here instead of unmounting the page. */
static getDerivedStateFromError(e) {
return { __err: e instanceof Error && e.message ? e.message : String(e) };
}
componentDidCatch(e, info) {
console.error(
'[dc-runtime] render error in <' + this.__name + '>:',
e,
info?.componentStack || ''
);
}
/** Instantiate the logic class (or the no-op base) and adopt `prevState`
* over its initial state — used both at mount and on hot-swap. */
__makeLogic(Logic, prevState) {
const L = Logic || StreamableLogic;
try {
this.logic = new L(this.__userProps());
this.__failedLogic = null;
this.__failedUserProps = null;
this.__ctorError = null;
} catch (e) {
console.error(e);
this.__failedLogic = Logic;
this.__failedUserProps = this.__userProps();
this.__failedVer = registry.get(this.__name).ver;
this.__ctorError =
this.__name + ': ' + (e instanceof Error && e.message ? e.message : String(e));
this.logic = new StreamableLogic(this.__userProps());
}
this.logic.__host = this;
if (prevState) this.logic.state = { ...(this.logic.state || {}), ...prevState };
}
/** The props the author's logic + template see — internal __-prefixed
* wiring stripped. */
__userProps() {
const { __name, __hintSize, __tplId, __hostStyle, ...rest } = this.props;
return rest;
}
__setLogicState(update, cb) {
const prev = this.logic.state;
const patch = typeof update === 'function' ? update(prev) : update;
this.logic.state = { ...prev, ...patch };
this.setState((s) => ({ __v: s.__v + 1 }), cb);
}
/** Swap the logic instance when the registry's Logic class changed
* (streaming completion, hot reload). State carries over; didMount
* re-fires after the swap commits so refs exist. */
__reconcileLogic() {
const r = registry.get(this.__name);
const Next = r.Logic;
const Cur = this.logic.constructor;
if (
Next === Cur ||
(!Next && Cur === StreamableLogic) ||
(Next === this.__failedLogic &&
r.ver === this.__failedVer &&
shallowEqual(this.__userProps(), this.__failedUserProps))
) {
return;
}
if (!this.__needsDidMount) {
try {
this.logic.componentWillUnmount();
} catch (e) {
console.error(e);
}
}
this.__makeLogic(Next, this.logic.state);
this.__needsDidMount = true;
}
componentDidMount() {
registry.get(this.__name).subs.add(this.__sub);
try {
this.logic.componentDidMount();
} catch (e) {
console.error(e);
}
}
componentDidUpdate(prevProps) {
this.logic.props = this.__userProps();
if (this.__needsDidMount) {
if (this.state.__err || !registry.get(this.__name).tpl) return;
this.__needsDidMount = false;
try {
this.logic.componentDidMount();
} catch (e) {
console.error(e);
}
} else {
try {
this.logic.componentDidUpdate(prevProps);
} catch (e) {
console.error(e);
}
}
}
componentWillUnmount() {
registry.get(this.__name).subs.delete(this.__sub);
if (!this.__needsDidMount) {
try {
this.logic.componentWillUnmount();
} catch (e) {
console.error(e);
}
}
}
render() {
const r = registry.get(this.__name);
const cls =
'sc-host' +
(r.htmlStreaming ? ' sc-streaming-html' : '') +
(r.jsStreaming ? ' sc-streaming-js' : '');
const hintStyle = r.htmlStreaming ? hintToMin(this.props.__hintSize) : void 0;
const hostStyle =
this.props.__hostStyle || hintStyle
? { ...(hintStyle || {}), ...(this.props.__hostStyle || {}) }
: void 0;
const hostBase = {
className: cls,
style: hostStyle,
'data-sc-name': this.__name,
'data-dc-tpl': this.props.__tplId
};
const chain = Array.isArray(this.context) ? this.context : [];
if (chain.includes(this.__name)) {
const cycle = [...chain.slice(chain.indexOf(this.__name)), this.__name].join(' \u2192 ');
return h(
'div',
{ ...hostBase, className: cls + ' sc-has-error' },
h(Placeholder, {
name: this.__name,
hintSize: this.props.__hintSize,
error: 'circular import: ' + cycle
})
);
}
if (this.state.__err) {
return h(
'div',
{ ...hostBase, className: cls + ' sc-has-error' },
h(
'div',
{ className: 'sc-logic-error', 'data-omelette-chrome': '' },
this.__name + ': ' + this.state.__err
),
h(Placeholder, {
name: this.__name,
hintSize: this.props.__hintSize,
error: this.state.__err
})
);
}
this.__reconcileLogic();
if (!r.tpl) {
return h(
'div',
hostBase,
h(Placeholder, { name: this.__name, hintSize: this.props.__hintSize })
);
}
const userProps = this.__userProps();
this.logic.props = userProps;
let vals = userProps;
let renderErr = r.logicError || this.__ctorError;
try {
vals = { ...userProps, ...(this.logic.renderVals() || {}) };
} catch (e) {
console.error(e);
renderErr =
this.__name +
'.renderVals(): ' +
(e instanceof Error && e.message ? e.message : String(e));
}
this.__streamingNow = !!(r.htmlStreaming || r.jsStreaming);
this.__htmlStreamingNow = !!r.htmlStreaming;
return h(
'div',
{ ...hostBase, className: cls + (renderErr ? ' sc-has-error' : '') },
renderErr &&
h('div', { className: 'sc-logic-error', 'data-omelette-chrome': '' }, renderErr),
h(AncestorContext.Provider, { value: [...chain, this.__name] }, r.tpl(vals, this))
);
}
}
__publicField(StreamableComponent, 'contextType', AncestorContext);
const named = /* @__PURE__ */ new Map();
function getDC(name) {
const hit = named.get(name);
if (hit) return hit;
function Dispatcher(p) {
const [, setTick] = React.useState(0);
React.useEffect(() => {
const sub = () => setTick((n) => n + 1);
registry.get(name).subs.add(sub);
return () => {
registry.get(name).subs.delete(sub);
};
}, []);
ensureFetched(name);
return h(StreamableComponent, { ...p, __name: name });
}
Dispatcher.displayName = name;
named.set(name, Dispatcher);
return Dispatcher;
}
return {
getDC,
StreamableComponent
};
}
// src/bundled.ts
function bundledBlob(url) {
const blobs = window.__resourceBlobs;
const b = blobs ? blobs[url.split('#')[0]] : void 0;
return b instanceof Blob ? b : null;
}
// src/cdn.ts
var REACT_URL = 'https://unpkg.com/react@18.3.1/umd/react.production.min.js';
var REACT_SRI = 'sha384-DGyLxAyjq0f9SPpVevD6IgztCFlnMF6oW/XQGmfe+IsZ8TqEiDrcHkMLKI6fiB/Z';
var REACT_DOM_URL = 'https://unpkg.com/react-dom@18.3.1/umd/react-dom.production.min.js';
var REACT_DOM_SRI = 'sha384-gTGxhz21lVGYNMcdJOyq01Edg0jhn/c22nsx0kyqP0TxaV5WVdsSH1fSDUf5YJj1';
var BABEL_URL = 'https://unpkg.com/@babel/standalone@7.29.0/babel.min.js';
var BABEL_SRI = 'sha384-m08KidiNqLdpJqLq95G/LEi8Qvjl/xUYll3QILypMoQ65QorJ9Lvtp2RXYGBFj1y';
function cdnScriptFor(url, sri) {
const res = window.__resources;
const v = res ? res[url] : void 0;
return typeof v === 'string' && v ? { src: v } : { src: url, integrity: sri };
}
// src/external.ts
var isCustomElementName = (n) => !n.includes('.') && n.includes('-');
function isRenderableType(g) {
if (typeof g === 'function') return !isElementClass(g);
return typeof g === 'object' && g !== null && typeof g.$$typeof === 'symbol';
}
function resolveDottedPath(root, name) {
let cur = root;
for (const seg of name.split('.')) {
if (cur == null) return void 0;
cur = cur[seg];
}
return cur;
}
var GLOBAL_POLL_INTERVAL_MS = 50;
var GLOBAL_POLL_TIMEOUT_MS = 3e4;
function createExternalModules(onResolved) {
const cache = /* @__PURE__ */ new Map();
let babelLoading = null;
const reportedMissing = /* @__PURE__ */ new Map();
const polling = /* @__PURE__ */ new Set();
function ensureBabel() {
if (window.Babel) return Promise.resolve();
if (babelLoading) return babelLoading;
const babel = cdnScriptFor(BABEL_URL, BABEL_SRI);
babelLoading = new Promise((res, rej) => {
const s = document.createElement('script');
s.src = babel.src;
if (babel.integrity) {
s.integrity = babel.integrity;
s.crossOrigin = 'anonymous';
}
s.onload = () => res();
s.onerror = rej;
document.head.appendChild(s);
});
return babelLoading;
}
const pending = /* @__PURE__ */ new Map();
function load(kind, url, after) {
const existing = pending.get(url);
if (existing) return existing;
cache.set(url, null);
console.info('[dc-runtime] x-import: loading', url, '(' + kind + ')');
const ready = Promise.all([
kind === 'jsx' ? ensureBabel() : Promise.resolve(),
after ?? Promise.resolve()
]);
const p = ready
.then(() => {
const pre = bundledBlob(url);
if (pre) return pre.text();
return fetch(url).then((r) => {
if (!r.ok) throw new Error('HTTP ' + r.status);
return r.text();
});
})
.then((src) => {
const code =
kind === 'jsx'
? window.Babel.transform(src, {
filename: url,
presets: ['react', 'typescript']
}).code
: src;
const module = { exports: {} };
const before = new Set(Object.keys(window));
//! nosemgrep: eval-and-function-constructor
new Function('React', 'module', 'exports', 'require', code)(
getReact(),
module,
module.exports,
() => ({})
);
const globals = {};
for (const k of Object.keys(window)) {
if (!before.has(k) && typeof window[k] === 'function') {
globals[k] = window[k];
}
}
cache.set(url, { mod: module.exports, globals });
console.info(
'[dc-runtime] x-import: loaded',
url,
'\u2014 exports:',
Object.keys(module.exports),
'window globals:',
Object.keys(globals)
);
onResolved();
})
.catch((e) => {
cache.set(url, {
mod: {},
globals: {},
error: 'failed to load: ' + (e instanceof Error && e.message ? e.message : String(e))
});
console.error('[dc-runtime] x-import: FAILED to load', url, '(' + kind + ')', e);
onResolved();
});
pending.set(url, p);
return p;
}
function resolve2(url, name) {
const entry = cache.get(url);
if (!entry) return null;
const { mod, globals } = entry;
const C =
(mod && mod[name]) ||
(globals && globals[name]) ||
(typeof window !== 'undefined' && window[name]) ||
(mod && mod.default);
if (typeof C === 'function') return C;
const key = url + '\0' + name;
if (!reportedMissing.has(key)) {
reportedMissing.set(
key,
entry.error || 'no export named "' + name + '" (has: ' + Object.keys(mod).join(', ') + ')'
);
console.error(
'[dc-runtime] x-import: module',
url,
'loaded but has no component named',
JSON.stringify(name),
'\u2014 available exports:',
Object.keys(mod),
'window globals:',
Object.keys(globals),
'. The module must `module.exports = {' + name + '}` or set `window.' + name + '`.'
);
}
return null;
}
function waitForGlobal(name) {
if (polling.has(name)) return;
polling.add(name);
const started = Date.now();
const isCE = isCustomElementName(name);
const tick = () => {
const found = isCE
? customElements.get(name)
: isRenderableType(resolveDottedPath(window, name));
if (found) {
polling.delete(name);
onResolved();
return;
}
if (Date.now() - started >= GLOBAL_POLL_TIMEOUT_MS) {
console.warn(
'[dc-runtime] x-import: global',
JSON.stringify(name),
'never appeared on window after ' + GLOBAL_POLL_TIMEOUT_MS + 'ms'
);
return;
}
setTimeout(tick, GLOBAL_POLL_INTERVAL_MS);
};
setTimeout(tick, GLOBAL_POLL_INTERVAL_MS);
}
function resolveGlobal(url, name) {
const isCE = isCustomElementName(name);
if (!url) {
if (isCE) {
if (customElements.get(name)) return name;
waitForGlobal(name);
return null;
}
const g2 = resolveDottedPath(window, name);
if (isRenderableType(g2)) return g2;
waitForGlobal(name);
return null;
}
const entry = cache.get(url);
if (!entry) return null;
if (isCE && customElements.get(name)) return name;
const g = entry.globals[name] ?? resolveDottedPath(window, name);
if (isRenderableType(g)) return g;
if (name.includes('.')) return null;
const key = url + '\0global\0' + name;
if (!reportedMissing.has(key)) {
reportedMissing.set(key, null);
if (isCE && !customElements.get(name)) {
console.warn(
'[dc-runtime] x-import:',
url,
'loaded but no custom element',
JSON.stringify(name),
'is registered and window.' +
name +
' is not a function \u2014 rendering <' +
name +
'> as an unknown element.'
);
}
}
return name;
}
function getError(url, name) {
const entry = cache.get(url);
if (entry?.error) return entry.error;
return reportedMissing.get(url + '\0' + name) || null;
}
return { load, resolve: resolve2, resolveGlobal, getError };
}
function isElementClass(g) {
try {
return (
typeof g === 'function' &&
typeof HTMLElement !== 'undefined' &&
g.prototype instanceof HTMLElement
);
} catch {
return false;
}
}
// src/atomics.ts
var ATOMIC_CSS =
// layout
'.fx{display:flex}.col{display:flex;flex-direction:column}.grid{display:grid}.ac{align-items:center}.jc{justify-content:center}.jb{justify-content:space-between}.f1{flex:1}.noshrink{flex-shrink:0}.wrap{flex-wrap:wrap}.fw5{font-weight:500}.fw6{font-weight:600}.fw7{font-weight:700}.fw8{font-weight:800}.fs11{font-size:11px}.fs12{font-size:12px}.fs13{font-size:13px}.fs14{font-size:14px}.fs15{font-size:15px}.fs16{font-size:16px}.fs20{font-size:20px}.fs22{font-size:22px}.upper{text-transform:uppercase}.tc{text-align:center}.nowrap{white-space:nowrap}.gap8{gap:8px}.gap10{gap:10px}.gap12{gap:12px}.gap16{gap:16px}.gap24{gap:24px}.m0{margin:0}.mt8{margin-top:8px}.mt12{margin-top:12px}.mt16{margin-top:16px}.mb8{margin-bottom:8px}.mb12{margin-bottom:12px}.mb16{margin-bottom:16px}.posrel{position:relative}.posabs{position:absolute}.round{border-radius:50%}.ohide{overflow:hidden}.bbox{box-sizing:border-box}.pointer{cursor:pointer}.w100{width:100%}.b0{border:none}';
// src/helmet.ts
var DESIGN_DOC_MODE_RE =
/]*\bname\s*=\s*["']design_doc_mode["'][^>]*\b(?:content|value)\s*=\s*["'](\w+)["']/i;
var CANVAS_BG_LIGHT = '#f0eee6';
var CANVAS_BG_DARK = '#2e2c26';
function createHelmetManager(doc, isStreaming) {
const mounted = /* @__PURE__ */ new Set();
const live = /* @__PURE__ */ new Map();
let designDocMode = null;
let canvasStyleEl = null;
let appTheme = 'light';
try {
const ds = doc.documentElement.dataset.theme;
appTheme =
ds === 'dark' || ds === 'light'
? ds
: new URLSearchParams(doc.defaultView?.location.search ?? '').get('theme') === 'dark'
? 'dark'
: 'light';
} catch {}
function applyCanvasBg() {
if (!canvasStyleEl) return;
const bg = appTheme === 'dark' ? CANVAS_BG_DARK : CANVAS_BG_LIGHT;
canvasStyleEl.textContent = `html,body{background:${bg}}#dc-root>.sc-host{position:relative}`;
}
function postDesignMode(mode) {
if (window.parent === window) return;
try {
window.parent.postMessage({ type: '__dc_design_mode', mode }, '*');
} catch {}
}
function setDesignDocMode(mode) {
if (mode === designDocMode) return;
designDocMode = mode;
postDesignMode(mode);
if (mode === 'canvas') {
doc.documentElement.setAttribute('data-dc-canvas', '');
canvasStyleEl = doc.createElement('style');
canvasStyleEl.setAttribute('data-dc-canvas', '');
applyCanvasBg();
doc.head.appendChild(canvasStyleEl);
} else {
doc.documentElement.removeAttribute('data-dc-canvas');
canvasStyleEl?.remove();
canvasStyleEl = null;
}
}
window.addEventListener('message', (e) => {
const type = e.data && e.data.type;
if (type === '__dc_theme') {
const t = e.data.theme;
if (t === 'light' || t === 'dark') {
appTheme = t;
applyCanvasBg();
}
return;
}
if (!designDocMode || type !== '__dc_probe') return;
postDesignMode(designDocMode);
});
function compile(node) {
const raw = [...node.children];
const helmetClosed = node.nextSibling != null || node.parentNode?.nextSibling != null;
if (node.hasAttribute('data-dc-atomics') && !mounted.has('__dc-atomics')) {
mounted.add('__dc-atomics');
const el = doc.createElement('style');
el.id = '__dc-atomics';
el.textContent = ATOMIC_CSS;
doc.head.appendChild(el);
}
return (_vals, ctx) => {
const name = (ctx && ctx.__name) || '';
const streaming = !!(name && isStreaming(name));
for (let i = 0; i < raw.length; i++) {
const child = raw[i];
const tag = child.tagName;
const mayBePartial = streaming && !helmetClosed && i === raw.length - 1;
if (tag === 'SCRIPT') {
if (mayBePartial) continue;
const key = 'SCRIPT|' + (child.getAttribute('src') || child.textContent || '');
if (mounted.has(key)) continue;
mounted.add(key);
const el = doc.createElement('script');
for (const { name: an, value } of [...child.attributes]) el.setAttribute(an, value);
if (child.textContent) el.textContent = child.textContent;
doc.head.appendChild(el);
} else if (tag === 'LINK' || tag === 'META') {
if (mayBePartial) continue;
const key =
tag +
'|' +
(child.getAttribute('href') || child.getAttribute('src') || child.outerHTML);
if (mounted.has(key)) continue;
mounted.add(key);
if (tag === 'LINK') {
const rel = (child.getAttribute('rel') || '').toLowerCase().split(/\s+/);
const href = (child.getAttribute('href') || '').trim();
const res = window.__resources;
const pre =
res && rel.includes('stylesheet') && !rel.includes('alternate')
? res[href]
: void 0;
const blob = typeof pre === 'string' && pre ? bundledBlob(pre) : null;
if (blob) {
const el = doc.createElement('style');
if (child.hasAttribute('disabled')) {
el.setAttribute('media', 'not all');
} else if (child.getAttribute('media')) {
el.setAttribute('media', child.getAttribute('media'));
}
if (child.getAttribute('title'))
el.setAttribute('title', child.getAttribute('title'));
void blob.text().then((css) => {
el.textContent = css;
});
doc.head.appendChild(el);
continue;
}
}
doc.head.appendChild(child.cloneNode(true));
} else {
const key = name + '|' + i;
let el = live.get(key);
if (!el || el.tagName !== tag) {
if (el) el.remove();
el = doc.createElement(tag.toLowerCase());
live.set(key, el);
doc.head.appendChild(el);
}
for (const { name: an, value } of [...child.attributes]) {
if (el.getAttribute(an) !== value) el.setAttribute(an, value);
}
if (el.textContent !== child.textContent) el.textContent = child.textContent;
}
}
return null;
};
}
return { compile, setDesignDocMode };
}
// src/pseudo.ts
function scanUnquotedUrl(css, i) {
if (
(css[i] !== 'u' && css[i] !== 'U') ||
css.slice(i, i + 4).toLowerCase() !== 'url(' ||
/[a-z0-9_-]/i.test(css[i - 1] ?? '')
) {
return -1;
}
let j = i + 4;
while (j < css.length && /\s/.test(css[j])) j++;
if (css[j] === '"' || css[j] === "'") return -1;
while (j < css.length && css[j] !== ')') {
if (css[j] === '\\') j++;
j++;
}
return j < css.length ? j + 1 : css.length;
}
function stripComments(css) {
let out = '';
let quote = '';
for (let i = 0; i < css.length; i++) {
const c = css[i];
if (quote) {
if (c === '\\') {
out += c + (css[i + 1] ?? '');
i++;
continue;
}
if (c === quote) quote = '';
out += c;
} else if (c === "'" || c === '"') {
quote = c;
out += c;
} else if (c === '/' && css[i + 1] === '*') {
const end = css.indexOf('*/', i + 2);
i = end === -1 ? css.length : end + 1;
out += ' ';
} else {
const end = scanUnquotedUrl(css, i);
if (end === -1) out += c;
else {
out += css.slice(i, end);
i = end - 1;
}
}
}
return out;
}
function importantify(css) {
css = stripComments(css);
const decls = [];
let start = 0;
let depth = 0;
let quote = '';
for (let i = 0; i < css.length; i++) {
const c = css[i];
if (quote) {
if (c === '\\') i++;
else if (c === quote) quote = '';
} else if (c === "'" || c === '"') quote = c;
else if (c === '(') depth++;
else if (c === ')') depth = Math.max(0, depth - 1);
else if (c === ';' && depth === 0) {
decls.push(css.slice(start, i));
start = i + 1;
} else {
const end = scanUnquotedUrl(css, i);
if (end !== -1) i = end - 1;
}
}
decls.push(css.slice(start));
return decls
.map((d) => d.trim())
.filter(Boolean)
.map((d) => (/!\s*important$/i.test(d) ? d : d + ' !important'))
.join(';');
}
function createPseudoSheet(doc) {
let el = null;
const cache = /* @__PURE__ */ new Map();
let n = 0;
return (pseudo, css) => {
const k = pseudo + '|' + css;
const hit = cache.get(k);
if (hit) return hit;
if (!el) {
el = doc.createElement('style');
doc.head.appendChild(el);
}
const cls = 'scp' + (n++).toString(36);
const isPseudoElement = pseudo === 'before' || pseudo === 'after';
const sel = isPseudoElement ? '.' + cls + '::' + pseudo : '.' + cls + ':' + pseudo;
el.sheet.insertRule(
sel + '{' + (isPseudoElement ? css : importantify(css)) + '}',
el.sheet.cssRules.length
);
cache.set(k, cls);
return cls;
};
}
// src/registry.ts
function createRegistry() {
const entries = /* @__PURE__ */ Object.create(null);
function get(name) {
return (
entries[name] ||
(entries[name] = {
html: '',
tpl: null,
Logic: null,
jsStreaming: false,
htmlStreaming: false,
ver: 0,
subs: /* @__PURE__ */ new Set(),
fetched: false
})
);
}
function bump(name) {
const r = get(name);
r.ver++;
for (const fn of r.subs) fn();
}
return {
entries,
get,
bump,
bumpAll() {
for (const n in entries) bump(n);
}
};
}
// src/runtime.ts
var COMPONENT_DIR = '.';
function createRuntime(doc = document) {
const registry = createRegistry();
const pseudoClass = createPseudoSheet(doc);
const helmet = createHelmetManager(doc, (name) => registry.get(name).htmlStreaming);
const external = createExternalModules(() => registry.bumpAll());
const factory = createComponentFactory(registry, ensureFetched);
const host = {
component: (name) => factory.getDC(name),
placeholder: (props) => h(Placeholder, props),
helmet: (node) => helmet.compile(node),
loadExternal: (kind, url, after) => external.load(kind, url, after),
resolveExternal: (url, name) => external.resolve(url, name),
resolveExternalGlobal: (url, name) => external.resolveGlobal(url, name),
resolveExternalError: (url, name) => external.getError(url, name),
pseudoClass
};
function ensureFetched(name) {
const r = registry.get(name);
if (r.fetched) return;
r.fetched = true;
const url = COMPONENT_DIR + '/' + encodeURIComponent(name) + '.dc.html';
const res = window.__resources;
const pre = res ? res[url] : void 0;
const target = typeof pre === 'string' && pre ? pre : url;
const blob = bundledBlob(target);
(blob
? blob.text()
: fetch(target).then((res2) => {
if (!res2.ok) {
console.error(
'[dc-runtime] sibling fetch for "' + name + '" failed:',
url,
'returned',
res2.status,
'\u2014 the reference renders as an empty placeholder.'
);
return '';
}
return res2.text();
})
)
.then((t) => {
if (!t) return;
const parsed = parseDcText(t);
if (!parsed) {
console.error(
'[dc-runtime] sibling fetch for "' + name + '":',
url,
'has no block \u2014 not a Design Component.'
);
return;
}
if (parsed.props) r.propsMeta = parsed.props;
if (parsed.preview) r.preview = parsed.preview;
if (parsed.template && !r.html) updateHtml(name, parsed.template);
if (parsed.js && !r.Logic) updateJs(name, parsed.js);
})
.catch((e) =>
console.error('[dc-runtime] sibling fetch for "' + name + '" threw:', url, e)
);
}
let rootName = null;
function updateHtml(name, html) {
const r = registry.get(name);
r.html = html;
if (name === rootName) {
const mode = DESIGN_DOC_MODE_RE.exec(html)?.[1] ?? null;
if (mode || !r.htmlStreaming) helmet.setDesignDocMode(mode);
}
try {
r.tpl = compileTemplate(html, host);
} catch (e) {
console.error('[dc-runtime] template compile FAILED for', name, e);
}
registry.bump(name);
}
function updateJs(name, src) {
const r = registry.get(name);
const seq = (r.jsSeq = (r.jsSeq || 0) + 1);
try {
const Cls = evalDcLogic(src);
if (r.jsSeq !== seq) return;
if (typeof Cls !== 'function') {
r.logicError =
name +
'.dc.html: