@lumencast/runtime 0.6.0 → 0.8.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/dist/.tsbuildinfo +1 -1
- package/dist/broadcast-Gcd-dmC7.js +12 -0
- package/dist/broadcast-Gcd-dmC7.js.map +1 -0
- package/dist/control-C5TfClga.js +17 -0
- package/dist/control-C5TfClga.js.map +1 -0
- package/dist/{index-Crkij3C4.js → index-N-VqrIxN.js} +305 -210
- package/dist/index-N-VqrIxN.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.html +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/lumencast.js +14 -9
- package/dist/modes/broadcast.d.ts.map +1 -1
- package/dist/modes/broadcast.js +6 -1
- package/dist/modes/broadcast.js.map +1 -1
- package/dist/modes/control.d.ts.map +1 -1
- package/dist/modes/control.js +6 -1
- package/dist/modes/control.js.map +1 -1
- package/dist/modes/test.d.ts.map +1 -1
- package/dist/modes/test.js +2 -1
- package/dist/modes/test.js.map +1 -1
- package/dist/render/allowed-hosts.d.ts +41 -0
- package/dist/render/allowed-hosts.d.ts.map +1 -0
- package/dist/render/allowed-hosts.js +88 -0
- package/dist/render/allowed-hosts.js.map +1 -0
- package/dist/render/asset-resolve.d.ts +27 -0
- package/dist/render/asset-resolve.d.ts.map +1 -0
- package/dist/render/asset-resolve.js +86 -0
- package/dist/render/asset-resolve.js.map +1 -0
- package/dist/render/blend-mode.d.ts +7 -0
- package/dist/render/blend-mode.d.ts.map +1 -0
- package/dist/render/blend-mode.js +49 -0
- package/dist/render/blend-mode.js.map +1 -0
- package/dist/render/bundle.d.ts +9 -1
- package/dist/render/bundle.d.ts.map +1 -1
- package/dist/render/bundle.js.map +1 -1
- package/dist/render/fill.d.ts +36 -3
- package/dist/render/fill.d.ts.map +1 -1
- package/dist/render/fill.js +222 -23
- package/dist/render/fill.js.map +1 -1
- package/dist/render/headless.d.ts +39 -0
- package/dist/render/headless.d.ts.map +1 -0
- package/dist/render/headless.js +83 -0
- package/dist/render/headless.js.map +1 -0
- package/dist/render/mask.d.ts +87 -0
- package/dist/render/mask.d.ts.map +1 -0
- package/dist/render/mask.js +243 -0
- package/dist/render/mask.js.map +1 -0
- package/dist/render/primitives/frame.d.ts.map +1 -1
- package/dist/render/primitives/frame.js +91 -5
- package/dist/render/primitives/frame.js.map +1 -1
- package/dist/render/primitives/grid.d.ts +1 -1
- package/dist/render/primitives/grid.d.ts.map +1 -1
- package/dist/render/primitives/grid.js +4 -1
- package/dist/render/primitives/grid.js.map +1 -1
- package/dist/render/primitives/image.d.ts +8 -1
- package/dist/render/primitives/image.d.ts.map +1 -1
- package/dist/render/primitives/image.js +17 -3
- package/dist/render/primitives/image.js.map +1 -1
- package/dist/render/primitives/index.d.ts +7 -0
- package/dist/render/primitives/index.d.ts.map +1 -1
- package/dist/render/primitives/index.js.map +1 -1
- package/dist/render/primitives/media.d.ts +11 -2
- package/dist/render/primitives/media.d.ts.map +1 -1
- package/dist/render/primitives/media.js +14 -3
- package/dist/render/primitives/media.js.map +1 -1
- package/dist/render/primitives/shape.d.ts.map +1 -1
- package/dist/render/primitives/shape.js +29 -26
- package/dist/render/primitives/shape.js.map +1 -1
- package/dist/render/primitives/stack.d.ts +1 -1
- package/dist/render/primitives/stack.d.ts.map +1 -1
- package/dist/render/primitives/stack.js +5 -1
- package/dist/render/primitives/stack.js.map +1 -1
- package/dist/render/primitives/text.d.ts.map +1 -1
- package/dist/render/primitives/text.js +0 -1
- package/dist/render/primitives/text.js.map +1 -1
- package/dist/render/prop-allowlist.d.ts.map +1 -1
- package/dist/render/prop-allowlist.js +25 -2
- package/dist/render/prop-allowlist.js.map +1 -1
- package/dist/render/shape-geometry.d.ts +81 -0
- package/dist/render/shape-geometry.d.ts.map +1 -0
- package/dist/render/shape-geometry.js +199 -0
- package/dist/render/shape-geometry.js.map +1 -0
- package/dist/render/shape-index.d.ts +28 -0
- package/dist/render/shape-index.d.ts.map +1 -0
- package/dist/render/shape-index.js +77 -0
- package/dist/render/shape-index.js.map +1 -0
- package/dist/render/tree.d.ts.map +1 -1
- package/dist/render/tree.js +175 -3
- package/dist/render/tree.js.map +1 -1
- package/dist/render/universal-wrapper.d.ts +27 -1
- package/dist/render/universal-wrapper.d.ts.map +1 -1
- package/dist/render/universal-wrapper.js +98 -22
- package/dist/render/universal-wrapper.js.map +1 -1
- package/dist/{status-pill-BT5b-yET.js → status-pill-BaLQoIDl.js} +2 -2
- package/dist/{status-pill-BT5b-yET.js.map → status-pill-BaLQoIDl.js.map} +1 -1
- package/dist/{test-_hh1JvAd.js → test-CA30C2By.js} +51 -51
- package/dist/{test-_hh1JvAd.js.map → test-CA30C2By.js.map} +1 -1
- package/dist/tree-1coZ32nd.js +1777 -0
- package/dist/tree-1coZ32nd.js.map +1 -0
- package/package.json +6 -5
- package/src/index.ts +24 -0
- package/src/modes/broadcast.tsx +12 -1
- package/src/modes/control.tsx +10 -1
- package/src/modes/test.tsx +4 -1
- package/src/render/allowed-hosts.tsx +100 -0
- package/src/render/asset-resolve.ts +97 -0
- package/src/render/blend-mode.ts +50 -0
- package/src/render/bundle.ts +6 -1
- package/src/render/fill.tsx +266 -24
- package/src/render/headless.tsx +129 -0
- package/src/render/mask.tsx +389 -0
- package/src/render/primitives/frame.tsx +101 -5
- package/src/render/primitives/grid.tsx +4 -1
- package/src/render/primitives/image.tsx +17 -3
- package/src/render/primitives/index.ts +7 -0
- package/src/render/primitives/media.tsx +14 -3
- package/src/render/primitives/shape.tsx +39 -75
- package/src/render/primitives/stack.tsx +5 -1
- package/src/render/primitives/text.tsx +0 -1
- package/src/render/prop-allowlist.ts +25 -2
- package/src/render/shape-geometry.tsx +315 -0
- package/src/render/shape-index.tsx +90 -0
- package/src/render/tree.tsx +214 -12
- package/src/render/universal-wrapper.tsx +128 -21
- package/dist/broadcast-DO7jEkix.js +0 -11
- package/dist/broadcast-DO7jEkix.js.map +0 -1
- package/dist/control-BSfl4_cO.js +0 -16
- package/dist/control-BSfl4_cO.js.map +0 -1
- package/dist/index-Crkij3C4.js.map +0 -1
- package/dist/tree-DBj9SJgs.js +0 -1230
- package/dist/tree-DBj9SJgs.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-pill-BT5b-yET.js","sources":["../src/overlay/control.tsx","../src/overlay/status-pill.tsx"],"sourcesContent":["import { useSignals } from \"@preact/signals-react/runtime\";\nimport type { OperatorInput } from \"../render/bundle\";\nimport { useLumencastRuntime } from \"./runtime-context\";\n\nconst PANEL_STYLE: React.CSSProperties = {\n position: \"fixed\",\n bottom: 12,\n left: 12,\n zIndex: 100_000,\n width: 320,\n maxHeight: \"70vh\",\n overflowY: \"auto\",\n padding: 12,\n fontFamily: \"system-ui, -apple-system, BlinkMacSystemFont, sans-serif\",\n fontSize: 12,\n color: \"#e5e7eb\",\n background: \"rgba(17, 24, 39, 0.92)\",\n border: \"1px solid rgba(75, 85, 99, 0.6)\",\n borderRadius: 10,\n boxShadow: \"0 8px 32px rgba(0, 0, 0, 0.45)\",\n};\n\nconst ROW_STYLE: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n padding: \"6px 0\",\n borderBottom: \"1px solid rgba(75, 85, 99, 0.35)\",\n};\n\nconst LABEL_STYLE: React.CSSProperties = {\n color: \"#9ca3af\",\n fontSize: 10.5,\n letterSpacing: \"0.02em\",\n textTransform: \"uppercase\",\n};\n\nconst INPUT_STYLE: React.CSSProperties = {\n background: \"rgba(31, 41, 55, 0.8)\",\n border: \"1px solid rgba(75, 85, 99, 0.6)\",\n borderRadius: 6,\n color: \"#f9fafb\",\n padding: \"4px 6px\",\n fontSize: 12,\n width: \"100%\",\n};\n\nexport function ControlPanel() {\n const { bundle, store, sendInput } = useLumencastRuntime();\n useSignals();\n\n const inputs = bundle.operator_inputs ?? [];\n if (inputs.length === 0) return null;\n\n // Group entries by `group` field for readability.\n const groups = new Map<string, OperatorInput[]>();\n for (const entry of inputs) {\n const g = entry.group ?? \"General\";\n const list = groups.get(g) ?? [];\n list.push(entry);\n groups.set(g, list);\n }\n\n return (\n <div style={PANEL_STYLE} data-testid=\"lumencast-control-panel\">\n <div\n style={{\n fontWeight: 600,\n fontSize: 11,\n letterSpacing: \"0.06em\",\n color: \"#9ca3af\",\n textTransform: \"uppercase\",\n marginBottom: 6,\n }}\n >\n Operator inputs\n </div>\n {[...groups.entries()].map(([group, entries]) => (\n <div key={group} style={{ marginBottom: 8 }}>\n <div\n style={{\n color: \"#6b7280\",\n fontSize: 10,\n letterSpacing: \"0.04em\",\n textTransform: \"uppercase\",\n padding: \"4px 0\",\n }}\n >\n {group}\n </div>\n {entries.map((entry) => (\n <InputRow\n key={entry.path}\n entry={entry}\n currentValue={store.signal(entry.path).value}\n onCommit={(v) =>\n // Operator-control values come from form widgets typed per\n // OperatorInput.type; coerce to LeafValue at the boundary.\n sendInput([\n {\n path: entry.path,\n value: v as Parameters<typeof sendInput>[0][number][\"value\"],\n },\n ])\n }\n />\n ))}\n </div>\n ))}\n </div>\n );\n}\n\nfunction InputRow({\n entry,\n currentValue,\n onCommit,\n}: {\n entry: OperatorInput;\n currentValue: unknown;\n onCommit: (value: unknown) => void;\n}) {\n return (\n <div style={ROW_STYLE}>\n <span style={LABEL_STYLE}>{entry.label}</span>\n <Editor entry={entry} currentValue={currentValue} onCommit={onCommit} />\n </div>\n );\n}\n\nfunction Editor({\n entry,\n currentValue,\n onCommit,\n}: {\n entry: OperatorInput;\n currentValue: unknown;\n onCommit: (value: unknown) => void;\n}) {\n switch (entry.type) {\n case \"boolean\": {\n const checked = currentValue === true;\n return (\n <label style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <input type=\"checkbox\" checked={checked} onChange={(e) => onCommit(e.target.checked)} />\n <span style={{ fontSize: 11, color: \"#d1d5db\" }}>{checked ? \"on\" : \"off\"}</span>\n </label>\n );\n }\n case \"number\": {\n const min = entry.min as number | undefined;\n const max = entry.max as number | undefined;\n const step = entry.step as number | undefined;\n return (\n <input\n type=\"number\"\n style={INPUT_STYLE}\n value={typeof currentValue === \"number\" ? currentValue : \"\"}\n min={min}\n max={max}\n step={step}\n onChange={(e) => {\n const n = Number(e.target.value);\n if (Number.isFinite(n)) onCommit(n);\n }}\n />\n );\n }\n case \"text\": {\n const max = entry.max_length as number | undefined;\n return (\n <input\n type=\"text\"\n style={INPUT_STYLE}\n value={typeof currentValue === \"string\" ? currentValue : \"\"}\n maxLength={max}\n onChange={(e) => onCommit(e.target.value)}\n />\n );\n }\n case \"colour\": {\n return (\n <input\n type=\"color\"\n style={INPUT_STYLE}\n value={typeof currentValue === \"string\" ? currentValue : \"#000000\"}\n onChange={(e) => onCommit(e.target.value)}\n />\n );\n }\n case \"duration\": {\n return (\n <input\n type=\"number\"\n style={INPUT_STYLE}\n value={typeof currentValue === \"number\" ? currentValue : \"\"}\n min={0}\n step={100}\n onChange={(e) => {\n const n = Number(e.target.value);\n if (Number.isFinite(n) && n >= 0) onCommit(n);\n }}\n />\n );\n }\n case \"select\":\n case \"enum\": {\n const options =\n (entry.enum_values as string[] | undefined) ??\n (entry.options as string[] | undefined) ??\n [];\n return (\n <select\n style={INPUT_STYLE}\n value={typeof currentValue === \"string\" ? currentValue : \"\"}\n onChange={(e) => onCommit(e.target.value)}\n >\n {options.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n );\n }\n case \"path-ref\":\n default:\n // FIXME (v2) — `path-ref` UX is deferred ; for now show a plain\n // text entry so the value is still editable.\n return (\n <input\n type=\"text\"\n style={INPUT_STYLE}\n value={typeof currentValue === \"string\" ? currentValue : \"\"}\n onChange={(e) => onCommit(e.target.value)}\n />\n );\n }\n}\n","import { useLumencastRuntime } from \"./runtime-context\";\n\nconst COLOURS: Record<string, string> = {\n live: \"rgba(34, 197, 94, 0.85)\",\n connecting: \"rgba(234, 179, 8, 0.85)\",\n disconnected: \"rgba(239, 68, 68, 0.85)\",\n};\n\nconst LABELS: Record<string, string> = {\n live: \"live\",\n connecting: \"reconnecting\",\n disconnected: \"disconnected\",\n};\n\nexport function StatusPill() {\n const { status } = useLumencastRuntime();\n return (\n <div\n data-testid=\"lumencast-status-pill\"\n style={{\n position: \"fixed\",\n top: 12,\n right: 12,\n padding: \"4px 10px\",\n fontSize: 11,\n fontFamily: \"system-ui, -apple-system, BlinkMacSystemFont, sans-serif\",\n color: \"white\",\n background: COLOURS[status] ?? \"#444\",\n borderRadius: 999,\n userSelect: \"none\",\n pointerEvents: \"none\",\n }}\n >\n {LABELS[status] ?? status}\n </div>\n );\n}\n"],"names":["PANEL_STYLE","ROW_STYLE","LABEL_STYLE","INPUT_STYLE","ControlPanel","bundle","store","sendInput","useLumencastRuntime","useSignals","inputs","groups","entry","g","list","jsxs","jsx","group","entries","InputRow","v","currentValue","onCommit","Editor","checked","min","max","step","e","n","options","opt","COLOURS","LABELS","StatusPill","status"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"status-pill-BaLQoIDl.js","sources":["../src/overlay/control.tsx","../src/overlay/status-pill.tsx"],"sourcesContent":["import { useSignals } from \"@preact/signals-react/runtime\";\nimport type { OperatorInput } from \"../render/bundle\";\nimport { useLumencastRuntime } from \"./runtime-context\";\n\nconst PANEL_STYLE: React.CSSProperties = {\n position: \"fixed\",\n bottom: 12,\n left: 12,\n zIndex: 100_000,\n width: 320,\n maxHeight: \"70vh\",\n overflowY: \"auto\",\n padding: 12,\n fontFamily: \"system-ui, -apple-system, BlinkMacSystemFont, sans-serif\",\n fontSize: 12,\n color: \"#e5e7eb\",\n background: \"rgba(17, 24, 39, 0.92)\",\n border: \"1px solid rgba(75, 85, 99, 0.6)\",\n borderRadius: 10,\n boxShadow: \"0 8px 32px rgba(0, 0, 0, 0.45)\",\n};\n\nconst ROW_STYLE: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n padding: \"6px 0\",\n borderBottom: \"1px solid rgba(75, 85, 99, 0.35)\",\n};\n\nconst LABEL_STYLE: React.CSSProperties = {\n color: \"#9ca3af\",\n fontSize: 10.5,\n letterSpacing: \"0.02em\",\n textTransform: \"uppercase\",\n};\n\nconst INPUT_STYLE: React.CSSProperties = {\n background: \"rgba(31, 41, 55, 0.8)\",\n border: \"1px solid rgba(75, 85, 99, 0.6)\",\n borderRadius: 6,\n color: \"#f9fafb\",\n padding: \"4px 6px\",\n fontSize: 12,\n width: \"100%\",\n};\n\nexport function ControlPanel() {\n const { bundle, store, sendInput } = useLumencastRuntime();\n useSignals();\n\n const inputs = bundle.operator_inputs ?? [];\n if (inputs.length === 0) return null;\n\n // Group entries by `group` field for readability.\n const groups = new Map<string, OperatorInput[]>();\n for (const entry of inputs) {\n const g = entry.group ?? \"General\";\n const list = groups.get(g) ?? [];\n list.push(entry);\n groups.set(g, list);\n }\n\n return (\n <div style={PANEL_STYLE} data-testid=\"lumencast-control-panel\">\n <div\n style={{\n fontWeight: 600,\n fontSize: 11,\n letterSpacing: \"0.06em\",\n color: \"#9ca3af\",\n textTransform: \"uppercase\",\n marginBottom: 6,\n }}\n >\n Operator inputs\n </div>\n {[...groups.entries()].map(([group, entries]) => (\n <div key={group} style={{ marginBottom: 8 }}>\n <div\n style={{\n color: \"#6b7280\",\n fontSize: 10,\n letterSpacing: \"0.04em\",\n textTransform: \"uppercase\",\n padding: \"4px 0\",\n }}\n >\n {group}\n </div>\n {entries.map((entry) => (\n <InputRow\n key={entry.path}\n entry={entry}\n currentValue={store.signal(entry.path).value}\n onCommit={(v) =>\n // Operator-control values come from form widgets typed per\n // OperatorInput.type; coerce to LeafValue at the boundary.\n sendInput([\n {\n path: entry.path,\n value: v as Parameters<typeof sendInput>[0][number][\"value\"],\n },\n ])\n }\n />\n ))}\n </div>\n ))}\n </div>\n );\n}\n\nfunction InputRow({\n entry,\n currentValue,\n onCommit,\n}: {\n entry: OperatorInput;\n currentValue: unknown;\n onCommit: (value: unknown) => void;\n}) {\n return (\n <div style={ROW_STYLE}>\n <span style={LABEL_STYLE}>{entry.label}</span>\n <Editor entry={entry} currentValue={currentValue} onCommit={onCommit} />\n </div>\n );\n}\n\nfunction Editor({\n entry,\n currentValue,\n onCommit,\n}: {\n entry: OperatorInput;\n currentValue: unknown;\n onCommit: (value: unknown) => void;\n}) {\n switch (entry.type) {\n case \"boolean\": {\n const checked = currentValue === true;\n return (\n <label style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <input type=\"checkbox\" checked={checked} onChange={(e) => onCommit(e.target.checked)} />\n <span style={{ fontSize: 11, color: \"#d1d5db\" }}>{checked ? \"on\" : \"off\"}</span>\n </label>\n );\n }\n case \"number\": {\n const min = entry.min as number | undefined;\n const max = entry.max as number | undefined;\n const step = entry.step as number | undefined;\n return (\n <input\n type=\"number\"\n style={INPUT_STYLE}\n value={typeof currentValue === \"number\" ? currentValue : \"\"}\n min={min}\n max={max}\n step={step}\n onChange={(e) => {\n const n = Number(e.target.value);\n if (Number.isFinite(n)) onCommit(n);\n }}\n />\n );\n }\n case \"text\": {\n const max = entry.max_length as number | undefined;\n return (\n <input\n type=\"text\"\n style={INPUT_STYLE}\n value={typeof currentValue === \"string\" ? currentValue : \"\"}\n maxLength={max}\n onChange={(e) => onCommit(e.target.value)}\n />\n );\n }\n case \"colour\": {\n return (\n <input\n type=\"color\"\n style={INPUT_STYLE}\n value={typeof currentValue === \"string\" ? currentValue : \"#000000\"}\n onChange={(e) => onCommit(e.target.value)}\n />\n );\n }\n case \"duration\": {\n return (\n <input\n type=\"number\"\n style={INPUT_STYLE}\n value={typeof currentValue === \"number\" ? currentValue : \"\"}\n min={0}\n step={100}\n onChange={(e) => {\n const n = Number(e.target.value);\n if (Number.isFinite(n) && n >= 0) onCommit(n);\n }}\n />\n );\n }\n case \"select\":\n case \"enum\": {\n const options =\n (entry.enum_values as string[] | undefined) ??\n (entry.options as string[] | undefined) ??\n [];\n return (\n <select\n style={INPUT_STYLE}\n value={typeof currentValue === \"string\" ? currentValue : \"\"}\n onChange={(e) => onCommit(e.target.value)}\n >\n {options.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n );\n }\n case \"path-ref\":\n default:\n // FIXME (v2) — `path-ref` UX is deferred ; for now show a plain\n // text entry so the value is still editable.\n return (\n <input\n type=\"text\"\n style={INPUT_STYLE}\n value={typeof currentValue === \"string\" ? currentValue : \"\"}\n onChange={(e) => onCommit(e.target.value)}\n />\n );\n }\n}\n","import { useLumencastRuntime } from \"./runtime-context\";\n\nconst COLOURS: Record<string, string> = {\n live: \"rgba(34, 197, 94, 0.85)\",\n connecting: \"rgba(234, 179, 8, 0.85)\",\n disconnected: \"rgba(239, 68, 68, 0.85)\",\n};\n\nconst LABELS: Record<string, string> = {\n live: \"live\",\n connecting: \"reconnecting\",\n disconnected: \"disconnected\",\n};\n\nexport function StatusPill() {\n const { status } = useLumencastRuntime();\n return (\n <div\n data-testid=\"lumencast-status-pill\"\n style={{\n position: \"fixed\",\n top: 12,\n right: 12,\n padding: \"4px 10px\",\n fontSize: 11,\n fontFamily: \"system-ui, -apple-system, BlinkMacSystemFont, sans-serif\",\n color: \"white\",\n background: COLOURS[status] ?? \"#444\",\n borderRadius: 999,\n userSelect: \"none\",\n pointerEvents: \"none\",\n }}\n >\n {LABELS[status] ?? status}\n </div>\n );\n}\n"],"names":["PANEL_STYLE","ROW_STYLE","LABEL_STYLE","INPUT_STYLE","ControlPanel","bundle","store","sendInput","useLumencastRuntime","useSignals","inputs","groups","entry","g","list","jsxs","jsx","group","entries","InputRow","v","currentValue","onCommit","Editor","checked","min","max","step","e","n","options","opt","COLOURS","LABELS","StatusPill","status"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { jsxs as i, jsx as
|
|
2
|
-
import {
|
|
3
|
-
import { S
|
|
4
|
-
import { useSignals as
|
|
1
|
+
import { jsxs as i, jsx as e, Fragment as y } from "react/jsx-runtime";
|
|
2
|
+
import { A as b, T as h, r as x } from "./tree-1coZ32nd.js";
|
|
3
|
+
import { S, C as k } from "./status-pill-BaLQoIDl.js";
|
|
4
|
+
import { useSignals as v } from "@preact/signals-react/runtime";
|
|
5
5
|
import { useState as f } from "react";
|
|
6
|
-
import { u } from "./index-
|
|
7
|
-
const
|
|
6
|
+
import { u } from "./index-N-VqrIxN.js";
|
|
7
|
+
const T = {
|
|
8
8
|
position: "fixed",
|
|
9
9
|
bottom: 12,
|
|
10
10
|
right: 12,
|
|
@@ -27,7 +27,7 @@ const k = {
|
|
|
27
27
|
color: "#7dd3fc",
|
|
28
28
|
textTransform: "uppercase",
|
|
29
29
|
marginBottom: 6
|
|
30
|
-
},
|
|
30
|
+
}, a = {
|
|
31
31
|
background: "rgba(14, 165, 233, 0.4)",
|
|
32
32
|
border: "1px solid rgba(125, 211, 252, 0.5)",
|
|
33
33
|
borderRadius: 6,
|
|
@@ -35,54 +35,54 @@ const k = {
|
|
|
35
35
|
padding: "3px 8px",
|
|
36
36
|
fontSize: 11,
|
|
37
37
|
cursor: "pointer"
|
|
38
|
-
},
|
|
38
|
+
}, _ = {
|
|
39
39
|
display: "flex",
|
|
40
40
|
flexDirection: "column",
|
|
41
41
|
gap: 4,
|
|
42
42
|
padding: "6px 0",
|
|
43
43
|
borderBottom: "1px solid rgba(56, 189, 248, 0.2)"
|
|
44
44
|
};
|
|
45
|
-
function
|
|
46
|
-
const { bundle:
|
|
47
|
-
|
|
48
|
-
const [s,
|
|
45
|
+
function C() {
|
|
46
|
+
const { bundle: t, store: n, sendInput: o } = u();
|
|
47
|
+
v();
|
|
48
|
+
const [s, l] = f(""), p = t.external_adapters ?? [], g = n.toRecord(), m = Object.entries(g).filter(
|
|
49
49
|
([r]) => s === "" || r.includes(s)
|
|
50
50
|
);
|
|
51
|
-
return /* @__PURE__ */ i("div", { style:
|
|
52
|
-
/* @__PURE__ */
|
|
51
|
+
return /* @__PURE__ */ i("div", { style: T, "data-testid": "lumencast-test-panel", children: [
|
|
52
|
+
/* @__PURE__ */ e("div", { style: c, children: "Time" }),
|
|
53
53
|
/* @__PURE__ */ i("div", { style: { display: "flex", gap: 6, marginBottom: 8 }, children: [
|
|
54
|
-
/* @__PURE__ */
|
|
54
|
+
/* @__PURE__ */ e(
|
|
55
55
|
"button",
|
|
56
56
|
{
|
|
57
57
|
type: "button",
|
|
58
|
-
style:
|
|
58
|
+
style: a,
|
|
59
59
|
onClick: () => o([{ path: "__test.tick", value: 100 }]),
|
|
60
60
|
children: "tick +100ms"
|
|
61
61
|
}
|
|
62
62
|
),
|
|
63
|
-
/* @__PURE__ */
|
|
63
|
+
/* @__PURE__ */ e(
|
|
64
64
|
"button",
|
|
65
65
|
{
|
|
66
66
|
type: "button",
|
|
67
|
-
style:
|
|
67
|
+
style: a,
|
|
68
68
|
onClick: () => o([{ path: "__test.tick", value: 1e3 }]),
|
|
69
69
|
children: "tick +1s"
|
|
70
70
|
}
|
|
71
71
|
),
|
|
72
|
-
/* @__PURE__ */
|
|
72
|
+
/* @__PURE__ */ e(
|
|
73
73
|
"button",
|
|
74
74
|
{
|
|
75
75
|
type: "button",
|
|
76
|
-
style:
|
|
76
|
+
style: a,
|
|
77
77
|
onClick: () => o([{ path: "__test.reset", value: !0 }]),
|
|
78
78
|
children: "reset"
|
|
79
79
|
}
|
|
80
80
|
)
|
|
81
81
|
] }),
|
|
82
|
-
/* @__PURE__ */
|
|
83
|
-
p.length === 0 && /* @__PURE__ */
|
|
84
|
-
p.map((r) => /* @__PURE__ */
|
|
85
|
-
|
|
82
|
+
/* @__PURE__ */ e("div", { style: c, children: "External adapters" }),
|
|
83
|
+
p.length === 0 && /* @__PURE__ */ e("div", { style: { color: "#94a3b8", fontStyle: "italic", fontSize: 11 }, children: "No external adapters declared in this scene." }),
|
|
84
|
+
p.map((r) => /* @__PURE__ */ e(
|
|
85
|
+
z,
|
|
86
86
|
{
|
|
87
87
|
adapter: r,
|
|
88
88
|
onMock: (d) => (
|
|
@@ -97,14 +97,14 @@ function T() {
|
|
|
97
97
|
},
|
|
98
98
|
r.key
|
|
99
99
|
)),
|
|
100
|
-
/* @__PURE__ */
|
|
101
|
-
/* @__PURE__ */
|
|
100
|
+
/* @__PURE__ */ e("div", { style: { ...c, marginTop: 12 }, children: "State" }),
|
|
101
|
+
/* @__PURE__ */ e(
|
|
102
102
|
"input",
|
|
103
103
|
{
|
|
104
104
|
type: "text",
|
|
105
105
|
placeholder: "filter paths…",
|
|
106
106
|
value: s,
|
|
107
|
-
onChange: (r) =>
|
|
107
|
+
onChange: (r) => l(r.target.value),
|
|
108
108
|
style: {
|
|
109
109
|
background: "rgba(8, 47, 73, 0.6)",
|
|
110
110
|
border: "1px solid rgba(125, 211, 252, 0.4)",
|
|
@@ -117,7 +117,7 @@ function T() {
|
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
),
|
|
120
|
-
/* @__PURE__ */
|
|
120
|
+
/* @__PURE__ */ e("div", { style: { fontFamily: "monospace", fontSize: 10.5 }, children: m.map(([r, d]) => /* @__PURE__ */ i(
|
|
121
121
|
"div",
|
|
122
122
|
{
|
|
123
123
|
style: {
|
|
@@ -128,20 +128,20 @@ function T() {
|
|
|
128
128
|
borderBottom: "1px dashed rgba(125, 211, 252, 0.15)"
|
|
129
129
|
},
|
|
130
130
|
children: [
|
|
131
|
-
/* @__PURE__ */
|
|
132
|
-
/* @__PURE__ */
|
|
131
|
+
/* @__PURE__ */ e("span", { style: { color: "#bae6fd" }, children: r }),
|
|
132
|
+
/* @__PURE__ */ e("span", { style: { color: "#fef3c7" }, children: R(d) })
|
|
133
133
|
]
|
|
134
134
|
},
|
|
135
135
|
r
|
|
136
136
|
)) })
|
|
137
137
|
] });
|
|
138
138
|
}
|
|
139
|
-
function
|
|
140
|
-
adapter:
|
|
139
|
+
function z({
|
|
140
|
+
adapter: t,
|
|
141
141
|
onMock: n
|
|
142
142
|
}) {
|
|
143
143
|
const [o, s] = f("{}");
|
|
144
|
-
return /* @__PURE__ */ i("div", { style:
|
|
144
|
+
return /* @__PURE__ */ i("div", { style: _, children: [
|
|
145
145
|
/* @__PURE__ */ i(
|
|
146
146
|
"div",
|
|
147
147
|
{
|
|
@@ -151,16 +151,16 @@ function _({
|
|
|
151
151
|
alignItems: "center"
|
|
152
152
|
},
|
|
153
153
|
children: [
|
|
154
|
-
/* @__PURE__ */
|
|
155
|
-
/* @__PURE__ */
|
|
154
|
+
/* @__PURE__ */ e("span", { style: { color: "#e0f2fe" }, children: t.label }),
|
|
155
|
+
/* @__PURE__ */ e("span", { style: { color: "#94a3b8", fontSize: 10 }, children: t.kind })
|
|
156
156
|
]
|
|
157
157
|
}
|
|
158
158
|
),
|
|
159
|
-
/* @__PURE__ */
|
|
159
|
+
/* @__PURE__ */ e(
|
|
160
160
|
"textarea",
|
|
161
161
|
{
|
|
162
162
|
value: o,
|
|
163
|
-
onChange: (
|
|
163
|
+
onChange: (l) => s(l.target.value),
|
|
164
164
|
rows: 2,
|
|
165
165
|
style: {
|
|
166
166
|
fontFamily: "monospace",
|
|
@@ -174,15 +174,15 @@ function _({
|
|
|
174
174
|
}
|
|
175
175
|
}
|
|
176
176
|
),
|
|
177
|
-
/* @__PURE__ */
|
|
177
|
+
/* @__PURE__ */ e(
|
|
178
178
|
"button",
|
|
179
179
|
{
|
|
180
180
|
type: "button",
|
|
181
|
-
style:
|
|
181
|
+
style: a,
|
|
182
182
|
onClick: () => {
|
|
183
183
|
try {
|
|
184
|
-
const
|
|
185
|
-
n(
|
|
184
|
+
const l = JSON.parse(o);
|
|
185
|
+
n(l);
|
|
186
186
|
} catch {
|
|
187
187
|
n(o);
|
|
188
188
|
}
|
|
@@ -192,19 +192,19 @@ function _({
|
|
|
192
192
|
)
|
|
193
193
|
] });
|
|
194
194
|
}
|
|
195
|
-
function
|
|
196
|
-
return
|
|
195
|
+
function R(t) {
|
|
196
|
+
return t === void 0 ? "—" : t === null ? "null" : typeof t == "string" || typeof t == "object" ? JSON.stringify(t) : String(t);
|
|
197
197
|
}
|
|
198
|
-
function
|
|
199
|
-
const { store:
|
|
198
|
+
function F() {
|
|
199
|
+
const { store: t, bundle: n } = u();
|
|
200
200
|
return /* @__PURE__ */ i(y, { children: [
|
|
201
|
-
/* @__PURE__ */
|
|
202
|
-
/* @__PURE__ */
|
|
203
|
-
/* @__PURE__ */
|
|
204
|
-
/* @__PURE__ */
|
|
201
|
+
/* @__PURE__ */ e(b, { hosts: x(n), children: /* @__PURE__ */ e(h, { node: n.root, store: t }) }),
|
|
202
|
+
/* @__PURE__ */ e(S, {}),
|
|
203
|
+
/* @__PURE__ */ e(k, {}),
|
|
204
|
+
/* @__PURE__ */ e(C, {})
|
|
205
205
|
] });
|
|
206
206
|
}
|
|
207
207
|
export {
|
|
208
|
-
|
|
208
|
+
F as TestMode
|
|
209
209
|
};
|
|
210
|
-
//# sourceMappingURL=test-
|
|
210
|
+
//# sourceMappingURL=test-CA30C2By.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-_hh1JvAd.js","sources":["../src/overlay/test.tsx","../src/modes/test.tsx"],"sourcesContent":["import { useSignals } from \"@preact/signals-react/runtime\";\nimport { useState } from \"react\";\nimport { useLumencastRuntime } from \"./runtime-context\";\n\nconst PANEL_STYLE: React.CSSProperties = {\n position: \"fixed\",\n bottom: 12,\n right: 12,\n zIndex: 100_001,\n width: 360,\n maxHeight: \"70vh\",\n overflowY: \"auto\",\n padding: 12,\n fontFamily: \"system-ui, -apple-system, BlinkMacSystemFont, sans-serif\",\n fontSize: 12,\n color: \"#e5e7eb\",\n background: \"rgba(8, 47, 73, 0.92)\",\n border: \"1px solid rgba(56, 189, 248, 0.4)\",\n borderRadius: 10,\n boxShadow: \"0 8px 32px rgba(0, 0, 0, 0.45)\",\n};\n\nconst SECTION_TITLE: React.CSSProperties = {\n fontWeight: 600,\n fontSize: 11,\n letterSpacing: \"0.06em\",\n color: \"#7dd3fc\",\n textTransform: \"uppercase\",\n marginBottom: 6,\n};\n\nconst BUTTON_STYLE: React.CSSProperties = {\n background: \"rgba(14, 165, 233, 0.4)\",\n border: \"1px solid rgba(125, 211, 252, 0.5)\",\n borderRadius: 6,\n color: \"#f0f9ff\",\n padding: \"3px 8px\",\n fontSize: 11,\n cursor: \"pointer\",\n};\n\nconst ADAPTER_ROW: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n padding: \"6px 0\",\n borderBottom: \"1px solid rgba(56, 189, 248, 0.2)\",\n};\n\n/** Test-mode overlay : adapter mocker + state inspector + time\n * controls. Drives the server's __test.* family via the same `sendInput`\n * channel. */\nexport function TestPanel() {\n const { bundle, store, sendInput } = useLumencastRuntime();\n useSignals();\n const [filter, setFilter] = useState(\"\");\n\n const adapters = bundle.external_adapters ?? [];\n const stateRecord = store.toRecord();\n const filteredEntries = Object.entries(stateRecord).filter(\n ([k]) => filter === \"\" || k.includes(filter),\n );\n\n return (\n <div style={PANEL_STYLE} data-testid=\"lumencast-test-panel\">\n {/* Time controls */}\n <div style={SECTION_TITLE}>Time</div>\n <div style={{ display: \"flex\", gap: 6, marginBottom: 8 }}>\n <button\n type=\"button\"\n style={BUTTON_STYLE}\n onClick={() => sendInput([{ path: \"__test.tick\", value: 100 }])}\n >\n tick +100ms\n </button>\n <button\n type=\"button\"\n style={BUTTON_STYLE}\n onClick={() => sendInput([{ path: \"__test.tick\", value: 1_000 }])}\n >\n tick +1s\n </button>\n <button\n type=\"button\"\n style={BUTTON_STYLE}\n onClick={() => sendInput([{ path: \"__test.reset\", value: true }])}\n >\n reset\n </button>\n </div>\n\n {/* Adapter mocker */}\n <div style={SECTION_TITLE}>External adapters</div>\n {adapters.length === 0 && (\n <div style={{ color: \"#94a3b8\", fontStyle: \"italic\", fontSize: 11 }}>\n No external adapters declared in this scene.\n </div>\n )}\n {adapters.map((adapter) => (\n <AdapterRow\n key={adapter.key}\n adapter={adapter}\n onMock={(payload) =>\n // LSDP/1 patch values must be leaf — JSON-encode the structured payload.\n sendInput([\n {\n path: \"__test.mock_adapter\",\n value: JSON.stringify({ key: adapter.key, payload }),\n },\n ])\n }\n />\n ))}\n\n {/* State inspector */}\n <div style={{ ...SECTION_TITLE, marginTop: 12 }}>State</div>\n <input\n type=\"text\"\n placeholder=\"filter paths…\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n style={{\n background: \"rgba(8, 47, 73, 0.6)\",\n border: \"1px solid rgba(125, 211, 252, 0.4)\",\n borderRadius: 6,\n color: \"#e0f2fe\",\n padding: \"4px 6px\",\n fontSize: 11,\n width: \"100%\",\n marginBottom: 6,\n }}\n />\n <div style={{ fontFamily: \"monospace\", fontSize: 10.5 }}>\n {filteredEntries.map(([path, value]) => (\n <div\n key={path}\n style={{\n display: \"grid\",\n gridTemplateColumns: \"1fr auto\",\n gap: 8,\n padding: \"2px 0\",\n borderBottom: \"1px dashed rgba(125, 211, 252, 0.15)\",\n }}\n >\n <span style={{ color: \"#bae6fd\" }}>{path}</span>\n <span style={{ color: \"#fef3c7\" }}>{formatValue(value)}</span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nfunction AdapterRow({\n adapter,\n onMock,\n}: {\n adapter: { key: string; label: string; kind: string };\n onMock: (payload: unknown) => void;\n}) {\n const [draft, setDraft] = useState(\"{}\");\n return (\n <div style={ADAPTER_ROW}>\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n }}\n >\n <span style={{ color: \"#e0f2fe\" }}>{adapter.label}</span>\n <span style={{ color: \"#94a3b8\", fontSize: 10 }}>{adapter.kind}</span>\n </div>\n <textarea\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n rows={2}\n style={{\n fontFamily: \"monospace\",\n fontSize: 10.5,\n background: \"rgba(8, 47, 73, 0.6)\",\n color: \"#e0f2fe\",\n border: \"1px solid rgba(125, 211, 252, 0.3)\",\n borderRadius: 4,\n padding: 4,\n resize: \"vertical\",\n }}\n />\n <button\n type=\"button\"\n style={BUTTON_STYLE}\n onClick={() => {\n try {\n const parsed = JSON.parse(draft);\n onMock(parsed);\n } catch {\n onMock(draft);\n }\n }}\n >\n fire\n </button>\n </div>\n );\n}\n\nfunction formatValue(value: unknown): string {\n if (value === undefined) return \"—\";\n if (value === null) return \"null\";\n if (typeof value === \"string\") return JSON.stringify(value);\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n}\n","import { Tree } from \"../render/tree\";\nimport { ControlPanel } from \"../overlay/control\";\nimport { TestPanel } from \"../overlay/test\";\nimport { StatusPill } from \"../overlay/status-pill\";\nimport { useLumencastRuntime } from \"../overlay/runtime-context\";\n\n/** Test mode : scene + operator overlay + test extensions (adapter\n * mocker, state inspector, time controls). */\nexport function TestMode() {\n const { store, bundle } = useLumencastRuntime();\n return (\n <>\n <Tree node={bundle.root} store={store} />\n <StatusPill />\n <ControlPanel />\n <TestPanel />\n </>\n );\n}\n"],"names":["PANEL_STYLE","SECTION_TITLE","BUTTON_STYLE","ADAPTER_ROW","TestPanel","bundle","store","sendInput","useLumencastRuntime","useSignals","filter","setFilter","useState","adapters","stateRecord","filteredEntries","k","jsxs","jsx","adapter","AdapterRow","payload","e","path","value","formatValue","onMock","draft","setDraft","parsed","TestMode","Fragment","Tree","StatusPill","ControlPanel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"test-CA30C2By.js","sources":["../src/overlay/test.tsx","../src/modes/test.tsx"],"sourcesContent":["import { useSignals } from \"@preact/signals-react/runtime\";\nimport { useState } from \"react\";\nimport { useLumencastRuntime } from \"./runtime-context\";\n\nconst PANEL_STYLE: React.CSSProperties = {\n position: \"fixed\",\n bottom: 12,\n right: 12,\n zIndex: 100_001,\n width: 360,\n maxHeight: \"70vh\",\n overflowY: \"auto\",\n padding: 12,\n fontFamily: \"system-ui, -apple-system, BlinkMacSystemFont, sans-serif\",\n fontSize: 12,\n color: \"#e5e7eb\",\n background: \"rgba(8, 47, 73, 0.92)\",\n border: \"1px solid rgba(56, 189, 248, 0.4)\",\n borderRadius: 10,\n boxShadow: \"0 8px 32px rgba(0, 0, 0, 0.45)\",\n};\n\nconst SECTION_TITLE: React.CSSProperties = {\n fontWeight: 600,\n fontSize: 11,\n letterSpacing: \"0.06em\",\n color: \"#7dd3fc\",\n textTransform: \"uppercase\",\n marginBottom: 6,\n};\n\nconst BUTTON_STYLE: React.CSSProperties = {\n background: \"rgba(14, 165, 233, 0.4)\",\n border: \"1px solid rgba(125, 211, 252, 0.5)\",\n borderRadius: 6,\n color: \"#f0f9ff\",\n padding: \"3px 8px\",\n fontSize: 11,\n cursor: \"pointer\",\n};\n\nconst ADAPTER_ROW: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n padding: \"6px 0\",\n borderBottom: \"1px solid rgba(56, 189, 248, 0.2)\",\n};\n\n/** Test-mode overlay : adapter mocker + state inspector + time\n * controls. Drives the server's __test.* family via the same `sendInput`\n * channel. */\nexport function TestPanel() {\n const { bundle, store, sendInput } = useLumencastRuntime();\n useSignals();\n const [filter, setFilter] = useState(\"\");\n\n const adapters = bundle.external_adapters ?? [];\n const stateRecord = store.toRecord();\n const filteredEntries = Object.entries(stateRecord).filter(\n ([k]) => filter === \"\" || k.includes(filter),\n );\n\n return (\n <div style={PANEL_STYLE} data-testid=\"lumencast-test-panel\">\n {/* Time controls */}\n <div style={SECTION_TITLE}>Time</div>\n <div style={{ display: \"flex\", gap: 6, marginBottom: 8 }}>\n <button\n type=\"button\"\n style={BUTTON_STYLE}\n onClick={() => sendInput([{ path: \"__test.tick\", value: 100 }])}\n >\n tick +100ms\n </button>\n <button\n type=\"button\"\n style={BUTTON_STYLE}\n onClick={() => sendInput([{ path: \"__test.tick\", value: 1_000 }])}\n >\n tick +1s\n </button>\n <button\n type=\"button\"\n style={BUTTON_STYLE}\n onClick={() => sendInput([{ path: \"__test.reset\", value: true }])}\n >\n reset\n </button>\n </div>\n\n {/* Adapter mocker */}\n <div style={SECTION_TITLE}>External adapters</div>\n {adapters.length === 0 && (\n <div style={{ color: \"#94a3b8\", fontStyle: \"italic\", fontSize: 11 }}>\n No external adapters declared in this scene.\n </div>\n )}\n {adapters.map((adapter) => (\n <AdapterRow\n key={adapter.key}\n adapter={adapter}\n onMock={(payload) =>\n // LSDP/1 patch values must be leaf — JSON-encode the structured payload.\n sendInput([\n {\n path: \"__test.mock_adapter\",\n value: JSON.stringify({ key: adapter.key, payload }),\n },\n ])\n }\n />\n ))}\n\n {/* State inspector */}\n <div style={{ ...SECTION_TITLE, marginTop: 12 }}>State</div>\n <input\n type=\"text\"\n placeholder=\"filter paths…\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n style={{\n background: \"rgba(8, 47, 73, 0.6)\",\n border: \"1px solid rgba(125, 211, 252, 0.4)\",\n borderRadius: 6,\n color: \"#e0f2fe\",\n padding: \"4px 6px\",\n fontSize: 11,\n width: \"100%\",\n marginBottom: 6,\n }}\n />\n <div style={{ fontFamily: \"monospace\", fontSize: 10.5 }}>\n {filteredEntries.map(([path, value]) => (\n <div\n key={path}\n style={{\n display: \"grid\",\n gridTemplateColumns: \"1fr auto\",\n gap: 8,\n padding: \"2px 0\",\n borderBottom: \"1px dashed rgba(125, 211, 252, 0.15)\",\n }}\n >\n <span style={{ color: \"#bae6fd\" }}>{path}</span>\n <span style={{ color: \"#fef3c7\" }}>{formatValue(value)}</span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nfunction AdapterRow({\n adapter,\n onMock,\n}: {\n adapter: { key: string; label: string; kind: string };\n onMock: (payload: unknown) => void;\n}) {\n const [draft, setDraft] = useState(\"{}\");\n return (\n <div style={ADAPTER_ROW}>\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n }}\n >\n <span style={{ color: \"#e0f2fe\" }}>{adapter.label}</span>\n <span style={{ color: \"#94a3b8\", fontSize: 10 }}>{adapter.kind}</span>\n </div>\n <textarea\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n rows={2}\n style={{\n fontFamily: \"monospace\",\n fontSize: 10.5,\n background: \"rgba(8, 47, 73, 0.6)\",\n color: \"#e0f2fe\",\n border: \"1px solid rgba(125, 211, 252, 0.3)\",\n borderRadius: 4,\n padding: 4,\n resize: \"vertical\",\n }}\n />\n <button\n type=\"button\"\n style={BUTTON_STYLE}\n onClick={() => {\n try {\n const parsed = JSON.parse(draft);\n onMock(parsed);\n } catch {\n onMock(draft);\n }\n }}\n >\n fire\n </button>\n </div>\n );\n}\n\nfunction formatValue(value: unknown): string {\n if (value === undefined) return \"—\";\n if (value === null) return \"null\";\n if (typeof value === \"string\") return JSON.stringify(value);\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n}\n","import { Tree } from \"../render/tree\";\nimport { AllowedHostsProvider, readAllowedHosts } from \"../render/allowed-hosts\";\nimport { ControlPanel } from \"../overlay/control\";\nimport { TestPanel } from \"../overlay/test\";\nimport { StatusPill } from \"../overlay/status-pill\";\nimport { useLumencastRuntime } from \"../overlay/runtime-context\";\n\n/** Test mode : scene + operator overlay + test extensions (adapter\n * mocker, state inspector, time controls). */\nexport function TestMode() {\n const { store, bundle } = useLumencastRuntime();\n return (\n <>\n <AllowedHostsProvider hosts={readAllowedHosts(bundle)}>\n <Tree node={bundle.root} store={store} />\n </AllowedHostsProvider>\n <StatusPill />\n <ControlPanel />\n <TestPanel />\n </>\n );\n}\n"],"names":["PANEL_STYLE","SECTION_TITLE","BUTTON_STYLE","ADAPTER_ROW","TestPanel","bundle","store","sendInput","useLumencastRuntime","useSignals","filter","setFilter","useState","adapters","stateRecord","filteredEntries","k","jsxs","jsx","adapter","AdapterRow","payload","e","path","value","formatValue","onMock","draft","setDraft","parsed","TestMode","Fragment","AllowedHostsProvider","readAllowedHosts","Tree","StatusPill","ControlPanel"],"mappings":"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"}
|