From c490c1e77f54eb3dfdc65e991a4019fa41cf1486 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 13 Jul 2026 17:28:21 +0100 Subject: [PATCH] Reconcile controls from provider receipts --- packages/eve-browser-lowering/dist/index.js | 1 + packages/eve-browser-lowering/src/index.ts | 1 + web/surface.js | 31 ++++++++++++++++++++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/packages/eve-browser-lowering/dist/index.js b/packages/eve-browser-lowering/dist/index.js index 114989a..588735f 100644 --- a/packages/eve-browser-lowering/dist/index.js +++ b/packages/eve-browser-lowering/dist/index.js @@ -1307,6 +1307,7 @@ function renderSlider(props, children, options) { const max = Number(props.max ?? 1); const slider = el("div", "cultui-slider"); slider.dataset.skin = stringProp(props.skin, "default"); + slider.dataset.bind = stringProp(props.bind, ""); applyControlBoxProps(slider, box); const visual = el("div", "cultui-slider-visual"); const input = el("input", "cultui-slider-input"); diff --git a/packages/eve-browser-lowering/src/index.ts b/packages/eve-browser-lowering/src/index.ts index 38db31e..b7e254f 100644 --- a/packages/eve-browser-lowering/src/index.ts +++ b/packages/eve-browser-lowering/src/index.ts @@ -1540,6 +1540,7 @@ function renderSlider( const max = Number(props.max ?? 1); const slider = el("div", "cultui-slider"); slider.dataset.skin = stringProp(props.skin, "default"); + slider.dataset.bind = stringProp(props.bind, ""); applyControlBoxProps(slider, box); const visual = el("div", "cultui-slider-visual"); const input = el("input", "cultui-slider-input") as HTMLInputElement; diff --git a/web/surface.js b/web/surface.js index aa5f965..600a606 100644 --- a/web/surface.js +++ b/web/surface.js @@ -244,6 +244,35 @@ async function publishCommandIntent(intent, component) { console.error("Eve command failed", receipt); return; } - statusEl.textContent = `command accepted ${command.command}`; + if ( + receipt.schema !== "gamecult.eve.command_receipt.v1" || + !receipt.commandId || + receipt.command !== command.command || + receipt.state !== "reconciled" + ) { + statusEl.textContent = `command failed ${command.command}`; + console.error("Eve command returned no correlated provider receipt", receipt); + return; + } + applyCommandReceipt(receipt); + statusEl.textContent = `command ${receipt.state} ${command.command}`; console.info("Eve command receipt", receipt); } + +function applyCommandReceipt(receipt) { + for (const diagnostic of receipt.diagnostics || []) { + if (!diagnostic?.binding || diagnostic.value === undefined) continue; + for (const control of document.querySelectorAll(`[data-bind="${CSS.escape(diagnostic.binding)}"]`)) { + const input = control.querySelector("input[type=range]"); + if (input) { + input.value = String(diagnostic.value); + const min = Number(input.min || 0); + const max = Number(input.max || 1); + const value = Number(diagnostic.value); + const percent = max === min ? 0 : ((value - min) / (max - min)) * 100; + control.style.setProperty("--cultui-slider-value", `${Math.max(0, Math.min(100, percent))}%`); + } + control.dataset.value = String(diagnostic.value); + } + } +}