@ox-content/code-play 3.0.0-alpha.1

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.
@@ -0,0 +1,387 @@
1
+ import { a as errorResult, i as errorMessage, n as createCodePlay, o as JS_SANDBOX_FLAGS, u as selectStream } from "./client.mjs";
2
+ import { a as escapeHtml, p as resolveLanguage, t as decodePayload } from "./payload.mjs";
3
+ //#region src/hydrate-action.ts
4
+ function readPlayPayload(encoded) {
5
+ try {
6
+ return decodePayload(encoded);
7
+ } catch {
8
+ return;
9
+ }
10
+ }
11
+ async function runPlayAction(input) {
12
+ input.setBusy(true);
13
+ try {
14
+ input.onResult(await input.action());
15
+ } catch (error) {
16
+ input.onError(error);
17
+ } finally {
18
+ input.setBusy(false);
19
+ }
20
+ }
21
+ //#endregion
22
+ //#region src/styles.ts
23
+ const CODE_PLAY_STYLES = `
24
+ .ox-code-play {
25
+ border: 1px solid var(--octc-color-border, color-mix(in srgb, currentColor 16%, transparent));
26
+ border-radius: 12px;
27
+ background: var(--octc-color-bg-alt, var(--octc-color-bg, Canvas));
28
+ color: var(--octc-color-text, CanvasText);
29
+ overflow: hidden;
30
+ margin: 1.25rem 0;
31
+ }
32
+ .ox-code-play__toolbar {
33
+ display: flex;
34
+ flex-wrap: wrap;
35
+ gap: 0.5rem;
36
+ align-items: center;
37
+ padding: 0.6rem 0.8rem;
38
+ border-bottom: 1px solid var(--octc-color-border, color-mix(in srgb, currentColor 12%, transparent));
39
+ }
40
+ .ox-code-play__lang {
41
+ font: 600 0.8rem/1.2 ui-sans-serif, system-ui, sans-serif;
42
+ margin-right: auto;
43
+ color: var(--octc-color-text, CanvasText);
44
+ }
45
+ .ox-code-play__toolbar button {
46
+ appearance: none;
47
+ border: 1px solid var(--octc-color-border, color-mix(in srgb, currentColor 20%, transparent));
48
+ background: color-mix(in srgb, var(--octc-color-text, CanvasText) 8%, transparent);
49
+ color: var(--octc-color-text, CanvasText);
50
+ border-radius: 999px;
51
+ padding: 0.25rem 0.75rem;
52
+ font: 600 0.75rem/1.4 ui-sans-serif, system-ui, sans-serif;
53
+ cursor: pointer;
54
+ }
55
+ .ox-code-play__toolbar button:disabled { opacity: 0.55; cursor: progress; }
56
+ .ox-code-play .ox-code { margin: 0; }
57
+ .ox-code-play__source pre { margin: 0; border: 0; border-radius: 0; }
58
+ .ox-code-play__tabs {
59
+ display: flex;
60
+ gap: 0.25rem;
61
+ padding: 0.4rem 0.7rem 0;
62
+ }
63
+ .ox-code-play__tabs button {
64
+ appearance: none;
65
+ border: 0;
66
+ background: transparent;
67
+ color: var(--octc-color-text, CanvasText);
68
+ padding: 0.35rem 0.55rem;
69
+ border-radius: 8px 8px 0 0;
70
+ font: 600 0.75rem/1.2 ui-sans-serif, system-ui, sans-serif;
71
+ cursor: pointer;
72
+ }
73
+ .ox-code-play__tabs button[aria-selected="true"] {
74
+ background: color-mix(in srgb, var(--octc-color-text, CanvasText) 10%, transparent);
75
+ }
76
+ .ox-code-play__panel { padding: 0.7rem 0.8rem 0.9rem; color: var(--octc-color-text, CanvasText); }
77
+ .ox-code-play__panel pre {
78
+ background: transparent !important;
79
+ color: inherit !important;
80
+ padding: 0 !important;
81
+ margin: 0 !important;
82
+ border: 0 !important;
83
+ border-radius: 0 !important;
84
+ }
85
+ .ox-code-play__empty { margin: 0; opacity: 0.7; font-size: 0.85rem; }
86
+ .ox-code-play__stdio { font: 12px/1.45 ui-monospace, SFMono-Regular, monospace; }
87
+ .ox-code-play__stdio-line { display: grid; grid-template-columns: 8.5rem 1fr; gap: 0.6rem; white-space: pre-wrap; }
88
+ .ox-code-play__stdio-line--stderr { color: var(--octc-danger, #b42318); }
89
+ .ox-code-play__stdio-line--stdin { opacity: 0.75; }
90
+ .ox-code-play__stdio-meta { opacity: 0.6; }
91
+ .ox-code-play__config { display: grid; gap: 0.55rem; }
92
+ .ox-code-play__field { display: grid; gap: 0.25rem; font-size: 0.85rem; }
93
+ .ox-code-play__field input, .ox-code-play__field select {
94
+ font: inherit;
95
+ padding: 0.3rem 0.45rem;
96
+ border-radius: 8px;
97
+ border: 1px solid var(--octc-color-border, color-mix(in srgb, currentColor 18%, transparent));
98
+ background: var(--octc-color-bg, Canvas);
99
+ color: var(--octc-color-text, CanvasText);
100
+ }
101
+ .ox-code-play__provenance { display: grid; gap: 0.6rem; margin: 0; }
102
+ .ox-code-play__provenance dt { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.04em; opacity: 0.65; }
103
+ .ox-code-play__provenance dd { margin: 0.15rem 0 0; }
104
+ .ox-code-play__phase { margin: 0.45rem 0; }
105
+ .ox-code-play__phase-meta { display: flex; justify-content: space-between; font-size: 0.8rem; }
106
+ .ox-code-play__phase-bar {
107
+ height: 0.35rem;
108
+ margin-top: 0.25rem;
109
+ border-radius: 999px;
110
+ background: var(--octc-color-primary, var(--octc-accent, #4f46e5));
111
+ }
112
+ .ox-code-play__timing-total { margin: 0 0 0.4rem; font-weight: 600; }
113
+ .ox-code-play__diags { margin: 0 0 0.6rem; padding-left: 1.1rem; }
114
+ .ox-code-play__diag--error { color: var(--octc-danger, #b42318); }
115
+ .ox-code-play__diag--warning { color: var(--octc-warning, #b54708); }
116
+ .ox-code-play--compact .ox-code-play__tabs { display: none; }
117
+ .ox-code-play--compact .ox-code-play__panel[data-panel]:not([data-panel="stdio"]):not([data-panel="stderr"]) { display: none; }
118
+ `;
119
+ //#endregion
120
+ //#region src/viewers.ts
121
+ function renderStdioHtml(events) {
122
+ if (events.length === 0) return `<p class="ox-code-play__stdio ox-code-play__empty">No stdio yet.</p>`;
123
+ return `<div class="ox-code-play__stdio" role="log">${events.map((event) => {
124
+ const time = event.timestampMs.toFixed(1);
125
+ return `<div class="ox-code-play__stdio-line ox-code-play__stdio-line--${event.stream}"><span class="ox-code-play__stdio-meta">${escapeHtml(event.stream)} +${escapeHtml(time)}ms</span><span class="ox-code-play__stdio-text">${escapeHtml(event.text)}</span></div>`;
126
+ }).join("")}</div>`;
127
+ }
128
+ /** Dedicated stderr viewer: stderr chunks plus error/warning diagnostics. */
129
+ function renderStderrHtml(result) {
130
+ const chunks = selectStream(result?.stdio ?? [], "stderr");
131
+ const diagnostics = (result?.diagnostics ?? []).filter((diagnostic) => diagnostic.severity === "error" || diagnostic.severity === "warning");
132
+ if (chunks.length === 0 && diagnostics.length === 0) return `<p class="ox-code-play__empty">No stderr.</p>`;
133
+ const stream = chunks.length === 0 ? "" : renderStdioHtml(chunks);
134
+ if (diagnostics.length === 0) return stream;
135
+ return `${stream}<ul class="ox-code-play__diags">${diagnostics.map((diagnostic) => {
136
+ const place = diagnostic.line ? `:${diagnostic.line}${diagnostic.column ? `:${diagnostic.column}` : ""}` : "";
137
+ return `<li class="ox-code-play__diag ox-code-play__diag--${diagnostic.severity}">${escapeHtml(diagnostic.severity)}${escapeHtml(place)} ${escapeHtml(diagnostic.message)}</li>`;
138
+ }).join("")}</ul>`;
139
+ }
140
+ function renderConfigHtml(schema, config) {
141
+ if (schema.length === 0) return `<p class="ox-code-play__empty">This language has no editable config.</p>`;
142
+ return `<form class="ox-code-play__config">${schema.map((field) => {
143
+ const value = config[field.key] ?? field.default ?? "";
144
+ const label = `<label class="ox-code-play__field"><span>${escapeHtml(field.label)}</span>${renderField(field, value)}</label>`;
145
+ return field.description ? `${label}<p class="ox-code-play__field-help">${escapeHtml(field.description)}</p>` : label;
146
+ }).join("")}</form>`;
147
+ }
148
+ function renderProvenanceHtml(provenance) {
149
+ if (!provenance?.compile && !provenance?.execute) return `<p class="ox-code-play__empty">No provenance yet. Run or type-check a sample.</p>`;
150
+ return `<dl class="ox-code-play__provenance">${renderLocation("Compiled", provenance.compile)}${renderLocation("Executed", provenance.execute)}</dl>`;
151
+ }
152
+ function renderTimingHtml(timing) {
153
+ if (!timing || timing.phases.length === 0) return `<p class="ox-code-play__empty">No timing yet. Run or type-check a sample.</p>`;
154
+ const rows = timing.phases.map((phase) => {
155
+ const width = timing.totalMs > 0 ? Math.max(2, phase.durationMs / timing.totalMs * 100) : 0;
156
+ return `<div class="ox-code-play__phase"><div class="ox-code-play__phase-meta"><span>${escapeHtml(phase.label)}</span><span>${phase.durationMs.toFixed(1)}ms</span></div><div class="ox-code-play__phase-bar" style="width:${width.toFixed(1)}%"></div></div>`;
157
+ }).join("");
158
+ return `<div class="ox-code-play__timing"><p class="ox-code-play__timing-total">Total ${timing.totalMs.toFixed(1)}ms</p>${rows}</div>`;
159
+ }
160
+ function renderDiagnosticsHtml(result) {
161
+ if (!result?.diagnostics.length) return "";
162
+ return `<ul class="ox-code-play__diags">${result.diagnostics.map((diagnostic) => {
163
+ const place = diagnostic.line ? `:${diagnostic.line}${diagnostic.column ? `:${diagnostic.column}` : ""}` : "";
164
+ return `<li class="ox-code-play__diag ox-code-play__diag--${diagnostic.severity}">${escapeHtml(diagnostic.severity)}${escapeHtml(place)} ${escapeHtml(diagnostic.message)}</li>`;
165
+ }).join("")}</ul>`;
166
+ }
167
+ function renderField(field, value) {
168
+ const name = escapeHtml(field.key);
169
+ if (field.type === "boolean") return `<input type="checkbox" name="${name}" ${value ? "checked" : ""}>`;
170
+ if (field.type === "select") return `<select name="${name}">${(field.options ?? []).map((option) => `<option value="${escapeHtml(option.value)}" ${String(value) === option.value ? "selected" : ""}>${escapeHtml(option.label)}</option>`).join("")}</select>`;
171
+ return `<input type="${field.type === "number" ? "number" : "text"}" name="${name}" value="${escapeHtml(String(value))}">`;
172
+ }
173
+ function renderLocation(label, location) {
174
+ if (!location) return "";
175
+ const details = [
176
+ location.runtime,
177
+ location.version,
178
+ location.sandbox,
179
+ location.target
180
+ ].filter(Boolean).join(" · ");
181
+ return `<div><dt>${escapeHtml(label)}</dt><dd><strong>${escapeHtml(location.host)}</strong>${details ? ` <span>${escapeHtml(details)}</span>` : ""}</dd></div>`;
182
+ }
183
+ //#endregion
184
+ //#region src/ui.ts
185
+ function renderPlayUi(state) {
186
+ const definition = resolveLanguage(state.payload.language);
187
+ const preset = state.payload.ui === "headless" ? "headless" : state.payload.ui;
188
+ if (preset === "headless") return "";
189
+ const panel = state.panel ?? "stdio";
190
+ const canTypecheck = state.payload.capabilities.typecheck;
191
+ const tabs = renderTabs(state, panel);
192
+ const viewers = state.payload.viewers;
193
+ return `<div class="ox-code-play ox-code-play--${preset}" data-ox-code-play-ui>
194
+ <div class="ox-code-play__toolbar">
195
+ <span class="ox-code-play__lang">${escapeHtml(definition?.name ?? state.payload.language)}</span>
196
+ <button type="button" data-ox-action="run"${actionButtonAttrs("run", Boolean(state.busy))}>Run</button>
197
+ ${canTypecheck ? `<button type="button" data-ox-action="typecheck"${actionButtonAttrs("typecheck", Boolean(state.busy))}>Typecheck</button>` : ""}
198
+ <button type="button" data-ox-action="cancel"${actionButtonAttrs("cancel", Boolean(state.busy))}>Cancel</button>
199
+ </div>
200
+ <div class="ox-code-play__source"></div>
201
+ ${tabs}
202
+ ${viewers.stdio ? `<div class="ox-code-play__panel" data-panel="stdio">${renderDiagnosticsHtml(state.result)}${renderStdioHtml(state.result?.stdio ?? [])}</div>` : ""}
203
+ ${viewers.stderr ? `<div class="ox-code-play__panel" data-panel="stderr"${hidden(panel, "stderr", preset)}>${renderStderrHtml(state.result)}</div>` : ""}
204
+ <div class="ox-code-play__panel" data-panel="config"${hidden(panel, "config", preset)}>${renderConfigHtml(definition?.configSchema ?? [], state.payload.config)}</div>
205
+ <div class="ox-code-play__panel" data-panel="provenance"${hidden(panel, "provenance", preset)}>${renderProvenanceHtml(state.result?.provenance)}</div>
206
+ <div class="ox-code-play__panel" data-panel="timing"${hidden(panel, "timing", preset)}>${renderTimingHtml(state.result?.timing)}</div>
207
+ </div>`;
208
+ }
209
+ function renderTabs(state, panel) {
210
+ if (state.payload.ui === "compact") return "";
211
+ const viewers = state.payload.viewers;
212
+ const buttons = [
213
+ viewers.stdio ? tab("stdio", "stdio", panel) : "",
214
+ viewers.stderr ? tab("stderr", "stderr", panel) : "",
215
+ viewers.config ? tab("config", "config", panel) : "",
216
+ viewers.provenance ? tab("provenance", "provenance", panel) : "",
217
+ viewers.timing ? tab("timing", "timing", panel) : ""
218
+ ].filter(Boolean).join("");
219
+ return buttons ? `<div class="ox-code-play__tabs" role="tablist">${buttons}</div>` : "";
220
+ }
221
+ function tab(id, label, selected) {
222
+ return `<button type="button" role="tab" data-ox-panel="${id}" aria-selected="${selected === id ? "true" : "false"}">${label}</button>`;
223
+ }
224
+ function actionButtonAttrs(action, busy) {
225
+ const state = actionBusyState(action, busy);
226
+ return `${state.disabled ? " disabled" : ""}${state.hidden ? " hidden" : ""}`;
227
+ }
228
+ function actionBusyState(action, busy) {
229
+ if (action === "cancel") return {
230
+ disabled: !busy,
231
+ hidden: !busy
232
+ };
233
+ return {
234
+ disabled: busy,
235
+ hidden: false
236
+ };
237
+ }
238
+ function applyActionBusy(root, busy) {
239
+ for (const button of root.querySelectorAll("button[data-ox-action]")) {
240
+ const state = actionBusyState(button.dataset.oxAction ?? "", busy);
241
+ button.disabled = state.disabled;
242
+ button.hidden = state.hidden;
243
+ }
244
+ }
245
+ function hidden(current, id, preset) {
246
+ if (preset === "compact" && (id === "stdio" || id === "stderr")) return "";
247
+ return current === id ? "" : " hidden";
248
+ }
249
+ //#endregion
250
+ //#region src/hydrate.ts
251
+ const STYLE_ID = "ox-code-play-styles";
252
+ function hydrateCodePlay(root = defaultRoot(), options = {}) {
253
+ ensureStyles();
254
+ const client = options.client ?? createCodePlayFromPayloads(root);
255
+ for (const element of queryWidgets(root)) try {
256
+ mountCodePlay(element, { client });
257
+ } catch {}
258
+ }
259
+ function mountCodePlay(element, options = {}) {
260
+ if (!(element instanceof HTMLElement) || element.dataset.oxCodePlayMounted === "true") return;
261
+ const payload = readPlayPayload(element.getAttribute("data-ox-code-play") ?? "");
262
+ if (!payload || payload.ui === "headless") return;
263
+ const client = options.client ?? createCodePlay({
264
+ languages: { [payload.language]: true },
265
+ endpoints: payload.endpoints
266
+ });
267
+ const source = element.innerHTML;
268
+ const ui = document.createElement("div");
269
+ ui.innerHTML = renderPlayUi({ payload });
270
+ const widget = ui.firstElementChild;
271
+ if (!widget) return;
272
+ const sourceSlot = widget.querySelector(".ox-code-play__source");
273
+ if (sourceSlot) sourceSlot.innerHTML = source;
274
+ element.replaceChildren(widget);
275
+ element.dataset.oxCodePlayMounted = "true";
276
+ bindWidget(element, payload, client);
277
+ }
278
+ function bindWidget(element, payload, client) {
279
+ let current = payload;
280
+ const session = client.createSession({
281
+ language: payload.language,
282
+ code: payload.code,
283
+ config: payload.config
284
+ });
285
+ const runButton = element.querySelector("[data-ox-action=\"run\"]");
286
+ const checkButton = element.querySelector("[data-ox-action=\"typecheck\"]");
287
+ const cancelButton = element.querySelector("[data-ox-action=\"cancel\"]");
288
+ runButton?.addEventListener("click", () => void run("execute"));
289
+ checkButton?.addEventListener("click", () => void run("typecheck"));
290
+ cancelButton?.addEventListener("click", () => session.cancel());
291
+ element.addEventListener("click", (event) => {
292
+ const target = event.target;
293
+ if (!(target instanceof HTMLElement)) return;
294
+ const panel = target.dataset.oxPanel;
295
+ if (panel) showPanel(element, panel);
296
+ });
297
+ element.addEventListener("change", (event) => {
298
+ const form = event.target?.closest("form");
299
+ if (!form) return;
300
+ session.setConfig(readForm(form));
301
+ current = {
302
+ ...current,
303
+ config: session.config
304
+ };
305
+ });
306
+ async function run(action) {
307
+ await runPlayAction({
308
+ action: () => action === "typecheck" ? session.typecheck() : session.run(),
309
+ setBusy: (busy) => applyActionBusy(element, busy),
310
+ onResult: (result) => paintResult(element, current, result),
311
+ onError: (error) => paintResult(element, current, errorResult(errorMessage(error)))
312
+ });
313
+ }
314
+ }
315
+ function paintResult(element, _payload, result) {
316
+ const stdio = element.querySelector("[data-panel=\"stdio\"]");
317
+ if (stdio) {
318
+ stdio.innerHTML = `${renderDiagnosticsHtml(result)}${renderStdioHtml(result.stdio)}`;
319
+ if (result.preview) {
320
+ const frame = document.createElement("iframe");
321
+ frame.setAttribute("sandbox", JS_SANDBOX_FLAGS);
322
+ frame.srcdoc = result.preview.html;
323
+ frame.title = "Code Play preview";
324
+ frame.style.width = "100%";
325
+ frame.style.minHeight = "12rem";
326
+ frame.style.border = "0";
327
+ stdio.append(frame);
328
+ }
329
+ }
330
+ const provenance = element.querySelector("[data-panel=\"provenance\"]");
331
+ if (provenance) provenance.innerHTML = renderProvenanceHtml(result.provenance);
332
+ const timing = element.querySelector("[data-panel=\"timing\"]");
333
+ if (timing) timing.innerHTML = renderTimingHtml(result.timing);
334
+ const stderr = element.querySelector("[data-panel=\"stderr\"]");
335
+ if (stderr) stderr.innerHTML = renderStderrHtml(result);
336
+ showPanel(element, Boolean(stderr) && (Boolean(result.stderr) || result.diagnostics.some((diagnostic) => diagnostic.severity === "error")) ? "stderr" : "stdio");
337
+ }
338
+ function showPanel(element, panel) {
339
+ const compact = Boolean(element.querySelector(".ox-code-play--compact"));
340
+ for (const tab of element.querySelectorAll("[data-ox-panel]")) tab.setAttribute("aria-selected", tab.getAttribute("data-ox-panel") === panel ? "true" : "false");
341
+ for (const node of element.querySelectorAll(".ox-code-play__panel")) {
342
+ const id = node.dataset.panel;
343
+ if (compact && (id === "stdio" || id === "stderr")) {
344
+ node.hidden = false;
345
+ continue;
346
+ }
347
+ node.hidden = id !== panel;
348
+ }
349
+ }
350
+ function readForm(form) {
351
+ const data = new FormData(form);
352
+ const config = {};
353
+ for (const [key, value] of data.entries()) config[key] = value === "on" ? true : value;
354
+ for (const input of form.querySelectorAll("input[type=\"checkbox\"]")) config[input.name] = input.checked;
355
+ return config;
356
+ }
357
+ function createCodePlayFromPayloads(root) {
358
+ const languages = {};
359
+ let endpoints;
360
+ for (const element of queryWidgets(root)) try {
361
+ const payload = decodePayload(element.getAttribute("data-ox-code-play") ?? "");
362
+ languages[payload.language] = true;
363
+ endpoints = payload.endpoints ?? endpoints;
364
+ } catch {}
365
+ return createCodePlay({
366
+ languages,
367
+ endpoints
368
+ });
369
+ }
370
+ function queryWidgets(root) {
371
+ return [...root.querySelectorAll("[data-ox-code-play]")];
372
+ }
373
+ function ensureStyles() {
374
+ if (typeof document === "undefined" || document.getElementById(STYLE_ID)) return;
375
+ const style = document.createElement("style");
376
+ style.id = STYLE_ID;
377
+ style.textContent = CODE_PLAY_STYLES;
378
+ document.head.append(style);
379
+ }
380
+ function defaultRoot() {
381
+ if (typeof document === "undefined") throw new Error("hydrateCodePlay() needs a DOM root.");
382
+ return document;
383
+ }
384
+ //#endregion
385
+ export { renderDiagnosticsHtml as a, renderStdioHtml as c, renderConfigHtml as i, renderTimingHtml as l, mountCodePlay as n, renderProvenanceHtml as o, renderPlayUi as r, renderStderrHtml as s, hydrateCodePlay as t, CODE_PLAY_STYLES as u };
386
+
387
+ //# sourceMappingURL=hydrate2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydrate2.mjs","names":[],"sources":["../src/hydrate-action.ts","../src/styles.ts","../src/viewers.ts","../src/ui.ts","../src/hydrate.ts"],"sourcesContent":["import { decodePayload } from \"./payload\";\nimport type { PlayPayload, RunResult } from \"./types\";\n\nexport function readPlayPayload(encoded: string): PlayPayload | undefined {\n try {\n return decodePayload(encoded);\n } catch {\n return undefined;\n }\n}\n\nexport async function runPlayAction(input: {\n action: () => Promise<RunResult>;\n setBusy: (busy: boolean) => void;\n onResult: (result: RunResult) => void;\n onError: (error: unknown) => void;\n}): Promise<void> {\n input.setBusy(true);\n try {\n input.onResult(await input.action());\n } catch (error) {\n input.onError(error);\n } finally {\n input.setBusy(false);\n }\n}\n","export const CODE_PLAY_STYLES = `\n.ox-code-play {\n border: 1px solid var(--octc-color-border, color-mix(in srgb, currentColor 16%, transparent));\n border-radius: 12px;\n background: var(--octc-color-bg-alt, var(--octc-color-bg, Canvas));\n color: var(--octc-color-text, CanvasText);\n overflow: hidden;\n margin: 1.25rem 0;\n}\n.ox-code-play__toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n align-items: center;\n padding: 0.6rem 0.8rem;\n border-bottom: 1px solid var(--octc-color-border, color-mix(in srgb, currentColor 12%, transparent));\n}\n.ox-code-play__lang {\n font: 600 0.8rem/1.2 ui-sans-serif, system-ui, sans-serif;\n margin-right: auto;\n color: var(--octc-color-text, CanvasText);\n}\n.ox-code-play__toolbar button {\n appearance: none;\n border: 1px solid var(--octc-color-border, color-mix(in srgb, currentColor 20%, transparent));\n background: color-mix(in srgb, var(--octc-color-text, CanvasText) 8%, transparent);\n color: var(--octc-color-text, CanvasText);\n border-radius: 999px;\n padding: 0.25rem 0.75rem;\n font: 600 0.75rem/1.4 ui-sans-serif, system-ui, sans-serif;\n cursor: pointer;\n}\n.ox-code-play__toolbar button:disabled { opacity: 0.55; cursor: progress; }\n.ox-code-play .ox-code { margin: 0; }\n.ox-code-play__source pre { margin: 0; border: 0; border-radius: 0; }\n.ox-code-play__tabs {\n display: flex;\n gap: 0.25rem;\n padding: 0.4rem 0.7rem 0;\n}\n.ox-code-play__tabs button {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--octc-color-text, CanvasText);\n padding: 0.35rem 0.55rem;\n border-radius: 8px 8px 0 0;\n font: 600 0.75rem/1.2 ui-sans-serif, system-ui, sans-serif;\n cursor: pointer;\n}\n.ox-code-play__tabs button[aria-selected=\"true\"] {\n background: color-mix(in srgb, var(--octc-color-text, CanvasText) 10%, transparent);\n}\n.ox-code-play__panel { padding: 0.7rem 0.8rem 0.9rem; color: var(--octc-color-text, CanvasText); }\n.ox-code-play__panel pre {\n background: transparent !important;\n color: inherit !important;\n padding: 0 !important;\n margin: 0 !important;\n border: 0 !important;\n border-radius: 0 !important;\n}\n.ox-code-play__empty { margin: 0; opacity: 0.7; font-size: 0.85rem; }\n.ox-code-play__stdio { font: 12px/1.45 ui-monospace, SFMono-Regular, monospace; }\n.ox-code-play__stdio-line { display: grid; grid-template-columns: 8.5rem 1fr; gap: 0.6rem; white-space: pre-wrap; }\n.ox-code-play__stdio-line--stderr { color: var(--octc-danger, #b42318); }\n.ox-code-play__stdio-line--stdin { opacity: 0.75; }\n.ox-code-play__stdio-meta { opacity: 0.6; }\n.ox-code-play__config { display: grid; gap: 0.55rem; }\n.ox-code-play__field { display: grid; gap: 0.25rem; font-size: 0.85rem; }\n.ox-code-play__field input, .ox-code-play__field select {\n font: inherit;\n padding: 0.3rem 0.45rem;\n border-radius: 8px;\n border: 1px solid var(--octc-color-border, color-mix(in srgb, currentColor 18%, transparent));\n background: var(--octc-color-bg, Canvas);\n color: var(--octc-color-text, CanvasText);\n}\n.ox-code-play__provenance { display: grid; gap: 0.6rem; margin: 0; }\n.ox-code-play__provenance dt { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.04em; opacity: 0.65; }\n.ox-code-play__provenance dd { margin: 0.15rem 0 0; }\n.ox-code-play__phase { margin: 0.45rem 0; }\n.ox-code-play__phase-meta { display: flex; justify-content: space-between; font-size: 0.8rem; }\n.ox-code-play__phase-bar {\n height: 0.35rem;\n margin-top: 0.25rem;\n border-radius: 999px;\n background: var(--octc-color-primary, var(--octc-accent, #4f46e5));\n}\n.ox-code-play__timing-total { margin: 0 0 0.4rem; font-weight: 600; }\n.ox-code-play__diags { margin: 0 0 0.6rem; padding-left: 1.1rem; }\n.ox-code-play__diag--error { color: var(--octc-danger, #b42318); }\n.ox-code-play__diag--warning { color: var(--octc-warning, #b54708); }\n.ox-code-play--compact .ox-code-play__tabs { display: none; }\n.ox-code-play--compact .ox-code-play__panel[data-panel]:not([data-panel=\"stdio\"]):not([data-panel=\"stderr\"]) { display: none; }\n`;\n","import { escapeHtml } from \"./escape\";\nimport { selectStream } from \"./stdio\";\nimport type { ConfigField, Provenance, RunResult, StdioEvent, TimingReport } from \"./types\";\n\nexport function renderStdioHtml(events: StdioEvent[]): string {\n if (events.length === 0) {\n return `<p class=\"ox-code-play__stdio ox-code-play__empty\">No stdio yet.</p>`;\n }\n const lines = events\n .map((event) => {\n const time = event.timestampMs.toFixed(1);\n return `<div class=\"ox-code-play__stdio-line ox-code-play__stdio-line--${event.stream}\"><span class=\"ox-code-play__stdio-meta\">${escapeHtml(event.stream)} +${escapeHtml(time)}ms</span><span class=\"ox-code-play__stdio-text\">${escapeHtml(event.text)}</span></div>`;\n })\n .join(\"\");\n return `<div class=\"ox-code-play__stdio\" role=\"log\">${lines}</div>`;\n}\n\n/** Dedicated stderr viewer: stderr chunks plus error/warning diagnostics. */\nexport function renderStderrHtml(result: RunResult | undefined): string {\n const chunks = selectStream(result?.stdio ?? [], \"stderr\");\n const diagnostics = (result?.diagnostics ?? []).filter(\n (diagnostic) => diagnostic.severity === \"error\" || diagnostic.severity === \"warning\",\n );\n if (chunks.length === 0 && diagnostics.length === 0) {\n return `<p class=\"ox-code-play__empty\">No stderr.</p>`;\n }\n const stream = chunks.length === 0 ? \"\" : renderStdioHtml(chunks);\n if (diagnostics.length === 0) {\n return stream;\n }\n const items = diagnostics\n .map((diagnostic) => {\n const place = diagnostic.line\n ? `:${diagnostic.line}${diagnostic.column ? `:${diagnostic.column}` : \"\"}`\n : \"\";\n return `<li class=\"ox-code-play__diag ox-code-play__diag--${diagnostic.severity}\">${escapeHtml(diagnostic.severity)}${escapeHtml(place)} ${escapeHtml(diagnostic.message)}</li>`;\n })\n .join(\"\");\n return `${stream}<ul class=\"ox-code-play__diags\">${items}</ul>`;\n}\n\nexport function renderConfigHtml(schema: ConfigField[], config: Record<string, unknown>): string {\n if (schema.length === 0) {\n return `<p class=\"ox-code-play__empty\">This language has no editable config.</p>`;\n }\n const fields = schema\n .map((field) => {\n const value = config[field.key] ?? field.default ?? \"\";\n const label = `<label class=\"ox-code-play__field\"><span>${escapeHtml(field.label)}</span>${renderField(field, value)}</label>`;\n return field.description\n ? `${label}<p class=\"ox-code-play__field-help\">${escapeHtml(field.description)}</p>`\n : label;\n })\n .join(\"\");\n return `<form class=\"ox-code-play__config\">${fields}</form>`;\n}\n\nexport function renderProvenanceHtml(provenance: Provenance | undefined): string {\n if (!provenance?.compile && !provenance?.execute) {\n return `<p class=\"ox-code-play__empty\">No provenance yet. Run or type-check a sample.</p>`;\n }\n return `<dl class=\"ox-code-play__provenance\">${renderLocation(\"Compiled\", provenance.compile)}${renderLocation(\"Executed\", provenance.execute)}</dl>`;\n}\n\nexport function renderTimingHtml(timing: TimingReport | undefined): string {\n if (!timing || timing.phases.length === 0) {\n return `<p class=\"ox-code-play__empty\">No timing yet. Run or type-check a sample.</p>`;\n }\n const rows = timing.phases\n .map((phase) => {\n const width = timing.totalMs > 0 ? Math.max(2, (phase.durationMs / timing.totalMs) * 100) : 0;\n return `<div class=\"ox-code-play__phase\"><div class=\"ox-code-play__phase-meta\"><span>${escapeHtml(phase.label)}</span><span>${phase.durationMs.toFixed(1)}ms</span></div><div class=\"ox-code-play__phase-bar\" style=\"width:${width.toFixed(1)}%\"></div></div>`;\n })\n .join(\"\");\n return `<div class=\"ox-code-play__timing\"><p class=\"ox-code-play__timing-total\">Total ${timing.totalMs.toFixed(1)}ms</p>${rows}</div>`;\n}\n\nexport function renderDiagnosticsHtml(result: RunResult | undefined): string {\n if (!result?.diagnostics.length) {\n return \"\";\n }\n const items = result.diagnostics\n .map((diagnostic) => {\n const place = diagnostic.line\n ? `:${diagnostic.line}${diagnostic.column ? `:${diagnostic.column}` : \"\"}`\n : \"\";\n return `<li class=\"ox-code-play__diag ox-code-play__diag--${diagnostic.severity}\">${escapeHtml(diagnostic.severity)}${escapeHtml(place)} ${escapeHtml(diagnostic.message)}</li>`;\n })\n .join(\"\");\n return `<ul class=\"ox-code-play__diags\">${items}</ul>`;\n}\n\nfunction renderField(field: ConfigField, value: unknown): string {\n const name = escapeHtml(field.key);\n if (field.type === \"boolean\") {\n return `<input type=\"checkbox\" name=\"${name}\" ${value ? \"checked\" : \"\"}>`;\n }\n if (field.type === \"select\") {\n const options = (field.options ?? [])\n .map(\n (option) =>\n `<option value=\"${escapeHtml(option.value)}\" ${String(value) === option.value ? \"selected\" : \"\"}>${escapeHtml(option.label)}</option>`,\n )\n .join(\"\");\n return `<select name=\"${name}\">${options}</select>`;\n }\n const inputType = field.type === \"number\" ? \"number\" : \"text\";\n return `<input type=\"${inputType}\" name=\"${name}\" value=\"${escapeHtml(String(value))}\">`;\n}\n\nfunction renderLocation(label: string, location: Provenance[\"compile\"]): string {\n if (!location) {\n return \"\";\n }\n const details = [location.runtime, location.version, location.sandbox, location.target]\n .filter(Boolean)\n .join(\" · \");\n return `<div><dt>${escapeHtml(label)}</dt><dd><strong>${escapeHtml(location.host)}</strong>${details ? ` <span>${escapeHtml(details)}</span>` : \"\"}</dd></div>`;\n}\n","import { resolveLanguage } from \"./catalog\";\nimport { escapeHtml } from \"./escape\";\nimport type { CodePlayPreset, PlayPayload, RunResult } from \"./types\";\nimport {\n renderConfigHtml,\n renderDiagnosticsHtml,\n renderProvenanceHtml,\n renderStderrHtml,\n renderStdioHtml,\n renderTimingHtml,\n} from \"./viewers\";\n\nexport interface UiState {\n payload: PlayPayload;\n result?: RunResult;\n busy?: boolean;\n panel?: \"stdio\" | \"stderr\" | \"config\" | \"provenance\" | \"timing\";\n}\n\nexport function renderPlayUi(state: UiState): string {\n const definition = resolveLanguage(state.payload.language);\n const preset: CodePlayPreset = state.payload.ui === \"headless\" ? \"headless\" : state.payload.ui;\n if (preset === \"headless\") {\n return \"\";\n }\n const panel = state.panel ?? \"stdio\";\n const canTypecheck = state.payload.capabilities.typecheck;\n const tabs = renderTabs(state, panel);\n const viewers = state.payload.viewers;\n return `<div class=\"ox-code-play ox-code-play--${preset}\" data-ox-code-play-ui>\n <div class=\"ox-code-play__toolbar\">\n <span class=\"ox-code-play__lang\">${escapeHtml(definition?.name ?? state.payload.language)}</span>\n <button type=\"button\" data-ox-action=\"run\"${actionButtonAttrs(\"run\", Boolean(state.busy))}>Run</button>\n ${canTypecheck ? `<button type=\"button\" data-ox-action=\"typecheck\"${actionButtonAttrs(\"typecheck\", Boolean(state.busy))}>Typecheck</button>` : \"\"}\n <button type=\"button\" data-ox-action=\"cancel\"${actionButtonAttrs(\"cancel\", Boolean(state.busy))}>Cancel</button>\n </div>\n <div class=\"ox-code-play__source\"></div>\n ${tabs}\n ${viewers.stdio ? `<div class=\"ox-code-play__panel\" data-panel=\"stdio\">${renderDiagnosticsHtml(state.result)}${renderStdioHtml(state.result?.stdio ?? [])}</div>` : \"\"}\n ${viewers.stderr ? `<div class=\"ox-code-play__panel\" data-panel=\"stderr\"${hidden(panel, \"stderr\", preset)}>${renderStderrHtml(state.result)}</div>` : \"\"}\n <div class=\"ox-code-play__panel\" data-panel=\"config\"${hidden(panel, \"config\", preset)}>${renderConfigHtml(definition?.configSchema ?? [], state.payload.config)}</div>\n <div class=\"ox-code-play__panel\" data-panel=\"provenance\"${hidden(panel, \"provenance\", preset)}>${renderProvenanceHtml(state.result?.provenance)}</div>\n <div class=\"ox-code-play__panel\" data-panel=\"timing\"${hidden(panel, \"timing\", preset)}>${renderTimingHtml(state.result?.timing)}</div>\n</div>`;\n}\n\nfunction renderTabs(state: UiState, panel: string): string {\n if (state.payload.ui === \"compact\") {\n return \"\";\n }\n const viewers = state.payload.viewers;\n const buttons = [\n viewers.stdio ? tab(\"stdio\", \"stdio\", panel) : \"\",\n viewers.stderr ? tab(\"stderr\", \"stderr\", panel) : \"\",\n viewers.config ? tab(\"config\", \"config\", panel) : \"\",\n viewers.provenance ? tab(\"provenance\", \"provenance\", panel) : \"\",\n viewers.timing ? tab(\"timing\", \"timing\", panel) : \"\",\n ]\n .filter(Boolean)\n .join(\"\");\n return buttons ? `<div class=\"ox-code-play__tabs\" role=\"tablist\">${buttons}</div>` : \"\";\n}\n\nfunction tab(id: string, label: string, selected: string): string {\n return `<button type=\"button\" role=\"tab\" data-ox-panel=\"${id}\" aria-selected=\"${selected === id ? \"true\" : \"false\"}\">${label}</button>`;\n}\n\nexport function actionButtonAttrs(action: string, busy: boolean): string {\n const state = actionBusyState(action, busy);\n return `${state.disabled ? \" disabled\" : \"\"}${state.hidden ? \" hidden\" : \"\"}`;\n}\n\nexport function actionBusyState(\n action: string,\n busy: boolean,\n): { disabled: boolean; hidden: boolean } {\n if (action === \"cancel\") {\n return { disabled: !busy, hidden: !busy };\n }\n return { disabled: busy, hidden: false };\n}\n\nexport function applyActionBusy(root: ParentNode, busy: boolean): void {\n for (const button of root.querySelectorAll<HTMLButtonElement>(\"button[data-ox-action]\")) {\n const state = actionBusyState(button.dataset.oxAction ?? \"\", busy);\n button.disabled = state.disabled;\n button.hidden = state.hidden;\n }\n}\n\nfunction hidden(current: string, id: string, preset: CodePlayPreset): string {\n if (preset === \"compact\" && (id === \"stdio\" || id === \"stderr\")) {\n return \"\";\n }\n return current === id ? \"\" : \" hidden\";\n}\n","import { createCodePlay, type CodePlayClient } from \"./client\";\nimport { readPlayPayload, runPlayAction } from \"./hydrate-action\";\nimport { decodePayload, encodePayload } from \"./payload\";\nimport { errorMessage, errorResult } from \"./result\";\nimport { CODE_PLAY_STYLES } from \"./styles\";\nimport { JS_SANDBOX_FLAGS } from \"./javascript-sandbox\";\nimport { applyActionBusy, renderPlayUi } from \"./ui\";\nimport type { PlayPayload, RunResult } from \"./types\";\nimport {\n renderDiagnosticsHtml,\n renderProvenanceHtml,\n renderStderrHtml,\n renderStdioHtml,\n renderTimingHtml,\n} from \"./viewers\";\n\nexport interface HydrateOptions {\n client?: CodePlayClient;\n root?: ParentNode;\n}\n\nconst STYLE_ID = \"ox-code-play-styles\";\n\nexport function hydrateCodePlay(\n root: ParentNode = defaultRoot(),\n options: HydrateOptions = {},\n): void {\n ensureStyles();\n const client = options.client ?? createCodePlayFromPayloads(root);\n for (const element of queryWidgets(root)) {\n try {\n mountCodePlay(element, { client });\n } catch {\n // One broken widget must not abort the rest of the page.\n }\n }\n}\n\nexport function mountCodePlay(element: Element, options: { client?: CodePlayClient } = {}): void {\n if (!(element instanceof HTMLElement) || element.dataset.oxCodePlayMounted === \"true\") {\n return;\n }\n const payload = readPlayPayload(element.getAttribute(\"data-ox-code-play\") ?? \"\");\n if (!payload || payload.ui === \"headless\") {\n return;\n }\n const client =\n options.client ??\n createCodePlay({\n languages: { [payload.language]: true },\n endpoints: payload.endpoints,\n });\n const source = element.innerHTML;\n const ui = document.createElement(\"div\");\n ui.innerHTML = renderPlayUi({ payload });\n const widget = ui.firstElementChild;\n if (!widget) {\n return;\n }\n const sourceSlot = widget.querySelector(\".ox-code-play__source\");\n if (sourceSlot) {\n sourceSlot.innerHTML = source;\n }\n element.replaceChildren(widget);\n element.dataset.oxCodePlayMounted = \"true\";\n bindWidget(element, payload, client);\n}\n\nfunction bindWidget(element: HTMLElement, payload: PlayPayload, client: CodePlayClient): void {\n let current = payload;\n const session = client.createSession({\n language: payload.language,\n code: payload.code,\n config: payload.config,\n });\n const runButton = element.querySelector<HTMLButtonElement>('[data-ox-action=\"run\"]');\n const checkButton = element.querySelector<HTMLButtonElement>('[data-ox-action=\"typecheck\"]');\n const cancelButton = element.querySelector<HTMLButtonElement>('[data-ox-action=\"cancel\"]');\n runButton?.addEventListener(\"click\", () => void run(\"execute\"));\n checkButton?.addEventListener(\"click\", () => void run(\"typecheck\"));\n cancelButton?.addEventListener(\"click\", () => session.cancel());\n element.addEventListener(\"click\", (event) => {\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n const panel = target.dataset.oxPanel;\n if (panel) {\n showPanel(element, panel);\n }\n });\n element.addEventListener(\"change\", (event) => {\n const form = (event.target as HTMLElement | null)?.closest(\"form\");\n if (!form) {\n return;\n }\n session.setConfig(readForm(form));\n current = { ...current, config: session.config };\n });\n\n async function run(action: \"execute\" | \"typecheck\"): Promise<void> {\n await runPlayAction({\n action: () => (action === \"typecheck\" ? session.typecheck() : session.run()),\n setBusy: (busy) => applyActionBusy(element, busy),\n onResult: (result) => paintResult(element, current, result),\n onError: (error) => paintResult(element, current, errorResult(errorMessage(error))),\n });\n }\n}\n\nfunction paintResult(element: HTMLElement, _payload: PlayPayload, result: RunResult): void {\n const stdio = element.querySelector('[data-panel=\"stdio\"]');\n if (stdio) {\n stdio.innerHTML = `${renderDiagnosticsHtml(result)}${renderStdioHtml(result.stdio)}`;\n if (result.preview) {\n const frame = document.createElement(\"iframe\");\n frame.setAttribute(\"sandbox\", JS_SANDBOX_FLAGS);\n frame.srcdoc = result.preview.html;\n frame.title = \"Code Play preview\";\n frame.style.width = \"100%\";\n frame.style.minHeight = \"12rem\";\n frame.style.border = \"0\";\n stdio.append(frame);\n }\n }\n const provenance = element.querySelector('[data-panel=\"provenance\"]');\n if (provenance) {\n provenance.innerHTML = renderProvenanceHtml(result.provenance);\n }\n const timing = element.querySelector('[data-panel=\"timing\"]');\n if (timing) {\n timing.innerHTML = renderTimingHtml(result.timing);\n }\n const stderr = element.querySelector('[data-panel=\"stderr\"]');\n if (stderr) {\n stderr.innerHTML = renderStderrHtml(result);\n }\n const focusStderr =\n Boolean(stderr) &&\n (Boolean(result.stderr) ||\n result.diagnostics.some((diagnostic) => diagnostic.severity === \"error\"));\n showPanel(element, focusStderr ? \"stderr\" : \"stdio\");\n}\n\nfunction showPanel(element: HTMLElement, panel: string): void {\n const compact = Boolean(element.querySelector(\".ox-code-play--compact\"));\n for (const tab of element.querySelectorAll(\"[data-ox-panel]\")) {\n tab.setAttribute(\n \"aria-selected\",\n tab.getAttribute(\"data-ox-panel\") === panel ? \"true\" : \"false\",\n );\n }\n for (const node of element.querySelectorAll<HTMLElement>(\".ox-code-play__panel\")) {\n const id = node.dataset.panel;\n if (compact && (id === \"stdio\" || id === \"stderr\")) {\n node.hidden = false;\n continue;\n }\n node.hidden = id !== panel;\n }\n}\n\nfunction readForm(form: HTMLFormElement): Record<string, unknown> {\n const data = new FormData(form);\n const config: Record<string, unknown> = {};\n for (const [key, value] of data.entries()) {\n config[key] = value === \"on\" ? true : value;\n }\n for (const input of form.querySelectorAll<HTMLInputElement>('input[type=\"checkbox\"]')) {\n config[input.name] = input.checked;\n }\n return config;\n}\n\nfunction createCodePlayFromPayloads(root: ParentNode) {\n const languages: Record<string, true> = {};\n let endpoints;\n for (const element of queryWidgets(root)) {\n try {\n const payload = decodePayload(element.getAttribute(\"data-ox-code-play\") ?? \"\");\n languages[payload.language] = true;\n endpoints = payload.endpoints ?? endpoints;\n } catch {\n // Ignore malformed widgets so one bad payload cannot block the page.\n }\n }\n return createCodePlay({ languages, endpoints });\n}\n\nfunction queryWidgets(root: ParentNode): HTMLElement[] {\n return [...root.querySelectorAll<HTMLElement>(\"[data-ox-code-play]\")];\n}\n\nfunction ensureStyles(): void {\n if (typeof document === \"undefined\" || document.getElementById(STYLE_ID)) {\n return;\n }\n const style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = CODE_PLAY_STYLES;\n document.head.append(style);\n}\n\nfunction defaultRoot(): ParentNode {\n if (typeof document === \"undefined\") {\n throw new Error(\"hydrateCodePlay() needs a DOM root.\");\n }\n return document;\n}\n\nexport { encodePayload, decodePayload };\n"],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import { t as bootCodePlay } from "./boot.mjs";
2
+ import { C as TimingReport, D as ViewerFlags, S as StdioStream, T as TransportResponse, _ as RunResult, a as resolveCodePlayOptions, b as SessionInput, c as CodePlayTransport, d as LanguageDefinition, f as LanguageEnable, h as Provenance, i as ResolvedCodePlayOptions, l as ConfigField, m as PlaygroundEndpoints, n as DEFAULT_VIEWERS, o as AdapterResult, p as PlayPayload, r as RawCodePlayOptions, s as CodePlayPreset, t as DEFAULT_ENDPOINTS, u as Diagnostic, w as TransportRequest, x as StdioEvent } from "./config.mjs";
3
+ import { a as encodePayload, c as createCodePlay, i as decodePayload, l as CodePlaySession, n as hydrateCodePlay, o as CodePlayClient, r as mountCodePlay, s as CodePlayClientOptions } from "./hydrate.mjs";
4
+ import { CodePlayOptions as CodePlayPluginOptions, codePlay } from "./plugin.mjs";
5
+ //#region src/catalog.d.ts
6
+ declare const LANGUAGE_CATALOG: LanguageDefinition[];
7
+ declare function resolveLanguage(input: string): LanguageDefinition | undefined;
8
+ declare function listLanguages(): LanguageDefinition[];
9
+ //#endregion
10
+ //#region src/stdio.d.ts
11
+ declare function joinStream(events: StdioEvent[], stream: StdioStream): string;
12
+ declare function selectStream(events: StdioEvent[], stream: StdioStream): StdioEvent[];
13
+ declare function withStdioText<T extends {
14
+ stdio: StdioEvent[];
15
+ }>(result: T): T & {
16
+ stdout: string;
17
+ stderr: string;
18
+ };
19
+ //#endregion
20
+ //#region src/transport.d.ts
21
+ declare function createFetchTransport(fetchImpl?: typeof fetch): CodePlayTransport;
22
+ declare function createMemoryTransport(handler: (input: TransportRequest) => TransportResponse | Promise<TransportResponse>): CodePlayTransport;
23
+ //#endregion
24
+ //#region src/ui.d.ts
25
+ interface UiState {
26
+ payload: PlayPayload;
27
+ result?: RunResult;
28
+ busy?: boolean;
29
+ panel?: "stdio" | "stderr" | "config" | "provenance" | "timing";
30
+ }
31
+ declare function renderPlayUi(state: UiState): string;
32
+ //#endregion
33
+ //#region src/viewers.d.ts
34
+ declare function renderStdioHtml(events: StdioEvent[]): string;
35
+ /** Dedicated stderr viewer: stderr chunks plus error/warning diagnostics. */
36
+ declare function renderStderrHtml(result: RunResult | undefined): string;
37
+ declare function renderConfigHtml(schema: ConfigField[], config: Record<string, unknown>): string;
38
+ declare function renderProvenanceHtml(provenance: Provenance | undefined): string;
39
+ declare function renderTimingHtml(timing: TimingReport | undefined): string;
40
+ declare function renderDiagnosticsHtml(result: RunResult | undefined): string;
41
+ //#endregion
42
+ //#region src/markdown.d.ts
43
+ interface PlayFence {
44
+ language: string;
45
+ meta: string;
46
+ code: string;
47
+ raw: string;
48
+ start: number;
49
+ end: number;
50
+ typecheck: boolean;
51
+ }
52
+ declare function parsePlayFences(source: string): PlayFence[];
53
+ declare function stripPlayMeta(meta: string): string;
54
+ declare function rewritePlayFences(source: string, encode: (fence: PlayFence) => string | null): string;
55
+ declare function parseCodePlayTags(source: string): PlayFence[];
56
+ //#endregion
57
+ //#region src/html.d.ts
58
+ interface HtmlEnhanceOptions {
59
+ scriptSrc?: string;
60
+ decodePayload: (value: string) => PlayPayload;
61
+ encodePayload: (payload: PlayPayload) => string;
62
+ matchFences?: Array<{
63
+ language: string;
64
+ code: string;
65
+ payload: string;
66
+ }>;
67
+ endpoints?: PlaygroundEndpoints;
68
+ }
69
+ declare function enhancePlayHtml(html: string, options: HtmlEnhanceOptions): string;
70
+ declare function enhanceGeneratedModule(source: string, options: HtmlEnhanceOptions): string;
71
+ //#endregion
72
+ //#region src/timing.d.ts
73
+ declare class PhaseTracker {
74
+ readonly startedAt: number;
75
+ private readonly phases;
76
+ private current;
77
+ constructor(now?: () => number);
78
+ private readonly now;
79
+ start(id: string, label: string): void;
80
+ stop(): void;
81
+ report(): TimingReport;
82
+ }
83
+ //#endregion
84
+ //#region src/styles.d.ts
85
+ declare const CODE_PLAY_STYLES = "\n.ox-code-play {\n border: 1px solid var(--octc-color-border, color-mix(in srgb, currentColor 16%, transparent));\n border-radius: 12px;\n background: var(--octc-color-bg-alt, var(--octc-color-bg, Canvas));\n color: var(--octc-color-text, CanvasText);\n overflow: hidden;\n margin: 1.25rem 0;\n}\n.ox-code-play__toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n align-items: center;\n padding: 0.6rem 0.8rem;\n border-bottom: 1px solid var(--octc-color-border, color-mix(in srgb, currentColor 12%, transparent));\n}\n.ox-code-play__lang {\n font: 600 0.8rem/1.2 ui-sans-serif, system-ui, sans-serif;\n margin-right: auto;\n color: var(--octc-color-text, CanvasText);\n}\n.ox-code-play__toolbar button {\n appearance: none;\n border: 1px solid var(--octc-color-border, color-mix(in srgb, currentColor 20%, transparent));\n background: color-mix(in srgb, var(--octc-color-text, CanvasText) 8%, transparent);\n color: var(--octc-color-text, CanvasText);\n border-radius: 999px;\n padding: 0.25rem 0.75rem;\n font: 600 0.75rem/1.4 ui-sans-serif, system-ui, sans-serif;\n cursor: pointer;\n}\n.ox-code-play__toolbar button:disabled { opacity: 0.55; cursor: progress; }\n.ox-code-play .ox-code { margin: 0; }\n.ox-code-play__source pre { margin: 0; border: 0; border-radius: 0; }\n.ox-code-play__tabs {\n display: flex;\n gap: 0.25rem;\n padding: 0.4rem 0.7rem 0;\n}\n.ox-code-play__tabs button {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--octc-color-text, CanvasText);\n padding: 0.35rem 0.55rem;\n border-radius: 8px 8px 0 0;\n font: 600 0.75rem/1.2 ui-sans-serif, system-ui, sans-serif;\n cursor: pointer;\n}\n.ox-code-play__tabs button[aria-selected=\"true\"] {\n background: color-mix(in srgb, var(--octc-color-text, CanvasText) 10%, transparent);\n}\n.ox-code-play__panel { padding: 0.7rem 0.8rem 0.9rem; color: var(--octc-color-text, CanvasText); }\n.ox-code-play__panel pre {\n background: transparent !important;\n color: inherit !important;\n padding: 0 !important;\n margin: 0 !important;\n border: 0 !important;\n border-radius: 0 !important;\n}\n.ox-code-play__empty { margin: 0; opacity: 0.7; font-size: 0.85rem; }\n.ox-code-play__stdio { font: 12px/1.45 ui-monospace, SFMono-Regular, monospace; }\n.ox-code-play__stdio-line { display: grid; grid-template-columns: 8.5rem 1fr; gap: 0.6rem; white-space: pre-wrap; }\n.ox-code-play__stdio-line--stderr { color: var(--octc-danger, #b42318); }\n.ox-code-play__stdio-line--stdin { opacity: 0.75; }\n.ox-code-play__stdio-meta { opacity: 0.6; }\n.ox-code-play__config { display: grid; gap: 0.55rem; }\n.ox-code-play__field { display: grid; gap: 0.25rem; font-size: 0.85rem; }\n.ox-code-play__field input, .ox-code-play__field select {\n font: inherit;\n padding: 0.3rem 0.45rem;\n border-radius: 8px;\n border: 1px solid var(--octc-color-border, color-mix(in srgb, currentColor 18%, transparent));\n background: var(--octc-color-bg, Canvas);\n color: var(--octc-color-text, CanvasText);\n}\n.ox-code-play__provenance { display: grid; gap: 0.6rem; margin: 0; }\n.ox-code-play__provenance dt { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.04em; opacity: 0.65; }\n.ox-code-play__provenance dd { margin: 0.15rem 0 0; }\n.ox-code-play__phase { margin: 0.45rem 0; }\n.ox-code-play__phase-meta { display: flex; justify-content: space-between; font-size: 0.8rem; }\n.ox-code-play__phase-bar {\n height: 0.35rem;\n margin-top: 0.25rem;\n border-radius: 999px;\n background: var(--octc-color-primary, var(--octc-accent, #4f46e5));\n}\n.ox-code-play__timing-total { margin: 0 0 0.4rem; font-weight: 600; }\n.ox-code-play__diags { margin: 0 0 0.6rem; padding-left: 1.1rem; }\n.ox-code-play__diag--error { color: var(--octc-danger, #b42318); }\n.ox-code-play__diag--warning { color: var(--octc-warning, #b54708); }\n.ox-code-play--compact .ox-code-play__tabs { display: none; }\n.ox-code-play--compact .ox-code-play__panel[data-panel]:not([data-panel=\"stdio\"]):not([data-panel=\"stderr\"]) { display: none; }\n";
86
+ //#endregion
87
+ export { type AdapterResult, CODE_PLAY_STYLES, type CodePlayClient, type CodePlayClientOptions, type CodePlayPluginOptions, type CodePlayPreset, CodePlaySession, type ConfigField, DEFAULT_ENDPOINTS, DEFAULT_VIEWERS, type Diagnostic, LANGUAGE_CATALOG, type LanguageDefinition, type LanguageEnable, PhaseTracker, type PlayPayload, type Provenance, type RawCodePlayOptions, type ResolvedCodePlayOptions, type RunResult, type SessionInput, type StdioEvent, type TimingReport, type ViewerFlags, bootCodePlay, codePlay, createCodePlay, createFetchTransport, createMemoryTransport, decodePayload, encodePayload, enhanceGeneratedModule, enhancePlayHtml, hydrateCodePlay, joinStream, listLanguages, mountCodePlay, parseCodePlayTags, parsePlayFences, renderConfigHtml, renderDiagnosticsHtml, renderPlayUi, renderProvenanceHtml, renderStderrHtml, renderStdioHtml, renderTimingHtml, resolveCodePlayOptions, resolveLanguage, rewritePlayFences, selectStream, stripPlayMeta, withStdioText };
88
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/catalog.ts","../src/stdio.ts","../src/transport.ts","../src/ui.ts","../src/viewers.ts","../src/markdown.ts","../src/html.ts","../src/timing.ts","../src/styles.ts"],"mappings":";;;;;cAgHa,kBAAkB;iBA+Ff,gBAAgB,gBAAgB;iBAIhC,iBAAiB;;;iBC9LjB,WAAW,QAAQ,cAAc,QAAQ;iBAOzC,aAAa,QAAQ,cAAc,QAAQ,cAAc;iBAIzD,cAAc;EAAY,OAAO;GAC/C,QAAQ,IACP;EAAM;EAAgB;;;;iBChCT,qBAAqB,mBAAkB,QAAgB;iBAkBvD,sBACd,UAAU,OAAO,qBAAqB,oBAAoB,QAAQ,qBACjE;;;UCVc;EACf,SAAS;EACT,SAAS;EACT;EACA;;iBAGc,aAAa,OAAO;;;iBCfpB,gBAAgB,QAAQ;;iBAcxB,iBAAiB,QAAQ;iBAuBzB,iBAAiB,QAAQ,eAAe,QAAQ;iBAgBhD,qBAAqB,YAAY;iBAOjC,iBAAiB,QAAQ;iBAazB,sBAAsB,QAAQ;;;UC7E7B;EACf;EACA;EACA;EACA;EACA;EACA;EACA;;iBAoEc,gBAAgB,iBAAiB;iBAcjC,cAAc;iBASd,kBACd,gBACA,SAAS,OAAO;iBAyBF,kBAAkB,iBAAiB;;;UCnHlC;EACf;EACA,gBAAgB,kBAAkB;EAClC,gBAAgB,SAAS;EACzB,cAAc;IAAQ;IAAkB;IAAc;;EACtD,YAAY;;iBAGE,gBAAgB,cAAc,SAAS;iBAgBvC,uBAAuB,gBAAgB,SAAS;;;cChCnD;WACF;mBACQ;UACT;EAER,YAAY;mBAKK;EAEjB,MAAM,YAAY;EAKlB;EAcA,UAAU;;;;cCjCC"}
package/dist/index.mjs ADDED
@@ -0,0 +1,6 @@
1
+ import { c as createMemoryTransport, d as withStdioText, f as PhaseTracker, l as joinStream, n as createCodePlay, r as CodePlaySession, s as createFetchTransport, u as selectStream } from "./client.mjs";
2
+ import { d as LANGUAGE_CATALOG, f as listLanguages, n as encodePayload, o as DEFAULT_ENDPOINTS, p as resolveLanguage, s as DEFAULT_VIEWERS, t as decodePayload, u as resolveCodePlayOptions } from "./payload.mjs";
3
+ import { a as stripPlayMeta, i as rewritePlayFences, n as parseCodePlayTags, o as enhanceGeneratedModule, r as parsePlayFences, s as enhancePlayHtml, t as codePlay } from "./plugin2.mjs";
4
+ import { a as renderDiagnosticsHtml, c as renderStdioHtml, i as renderConfigHtml, l as renderTimingHtml, n as mountCodePlay, o as renderProvenanceHtml, r as renderPlayUi, s as renderStderrHtml, t as hydrateCodePlay, u as CODE_PLAY_STYLES } from "./hydrate2.mjs";
5
+ import { t as bootCodePlay } from "./boot.mjs";
6
+ export { CODE_PLAY_STYLES, CodePlaySession, DEFAULT_ENDPOINTS, DEFAULT_VIEWERS, LANGUAGE_CATALOG, PhaseTracker, bootCodePlay, codePlay, createCodePlay, createFetchTransport, createMemoryTransport, decodePayload, encodePayload, enhanceGeneratedModule, enhancePlayHtml, hydrateCodePlay, joinStream, listLanguages, mountCodePlay, parseCodePlayTags, parsePlayFences, renderConfigHtml, renderDiagnosticsHtml, renderPlayUi, renderProvenanceHtml, renderStderrHtml, renderStdioHtml, renderTimingHtml, resolveCodePlayOptions, resolveLanguage, rewritePlayFences, selectStream, stripPlayMeta, withStdioText };