// 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:rgba(255,255,255,.3);border:1px solid rgba(0,0,0,.5);
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:rgba(0,0,0,.7);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:rgba(0,0,0,.5);background:rgba(0,0,0,.05);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; }
section, article, figure, table { break-inside: avoid; }
*, *::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.adoptParsed(rootName, parsed);
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);
};
}, []);
return h(Root, entry.propOverrides || null);
}
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 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"
};
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 encodeCase(html) {
html = html.replace(
IMPORT_SELF_CLOSE_RE,
(_, t, a) => "<" + t + a + ">" + t + ">"
);
html = html.replace(/)/gi, "/gi, "");
html = html.replace(
CAMEL_ATTR_RE,
(_, sp, name, eq) => sp + CAMEL_ATTR + name.replace(/[A-Z]/g, (c) => "-" + c.toLowerCase()) + eq
);
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, isComponent, 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 (isComponent) {
if (key.includes("-")) 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);
}
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, true, 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) props[k] = g(vals);
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 url = el.getAttribute("from") || el.getAttribute("src") || el.getAttribute("import") || "";
const kind = /\.(jsx|tsx)(\?|#|$)/i.test(url) ? "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, true, host);
const hasContent = el.children.length > 0 || !!(el.textContent || "").trim();
const kids = hasContent ? walkChildren(el, host) : [];
const urlBindable = url.includes("{{");
if (url && !urlBindable) host.loadExternal(kind, url);
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 === "name" || k === "from" || k === "src" || k === "import") {
continue;
}
const v = g(vals);
if (v === void 0) unresolvedHole = true;
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 = kids.map((b, j) => b(vals, ctx, j));
return wrapper ? h("div", wrapper, h(C, props)) : h(C, props);
};
}
function walkElement(el, host) {
const realTag = RAW_UNWRAP[el.localName] || el.localName;
const tplId = el.getAttribute("data-dc-tpl");
const { propGetters, pseudoClasses } = collectProps(el, false, host);
const kids = walkChildren(el, host);
return (vals, ctx, key) => {
const props = { key, "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, ...kids.map((b, j) => b(vals, ctx, j)));
};
}
// 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" },
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" }, 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/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 BABEL_URL = "https://unpkg.com/@babel/standalone@7.26.4/babel.min.js";
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;
babelLoading = new Promise((res, rej) => {
const s = document.createElement("script");
s.src = BABEL_URL;
s.crossOrigin = "anonymous";
s.onload = () => res();
s.onerror = rej;
document.head.appendChild(s);
});
return babelLoading;
}
function load(kind, url) {
if (cache.has(url)) return;
cache.set(url, null);
console.info("[dc-runtime] x-import: loading", url, "(" + kind + ")");
const ready = kind === "jsx" ? ensureBabel() : Promise.resolve();
ready.then(() => 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();
});
}
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/helmet.ts
function createHelmetManager(doc, isStreaming) {
const mounted = /* @__PURE__ */ new Set();
const live = /* @__PURE__ */ new Map();
function compile(node) {
const raw = [...node.children];
const helmetClosed = node.nextSibling != null || node.parentNode?.nextSibling != null;
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);
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 };
}
// src/pseudo.ts
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 sel = pseudo === "before" || pseudo === "after" ? "." + cls + "::" + pseudo : "." + cls + ":" + pseudo;
el.sheet.insertRule(sel + "{" + 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) => external.load(kind, url),
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";
fetch(url).then((res) => {
if (!res.ok) {
console.error(
"[dc-runtime] sibling fetch for <" + name + "/> failed:",
url,
"returned",
res.status,
"\u2014 the reference renders as an empty placeholder."
);
return "";
}
return res.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
)
);
}
function updateHtml(name, html) {
const r = registry.get(name);
r.html = html;
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: