diff --git a/crates/ghostlight-dungeon/src/surface.rs b/crates/ghostlight-dungeon/src/surface.rs index d4c04b1..5cc1cca 100644 --- a/crates/ghostlight-dungeon/src/surface.rs +++ b/crates/ghostlight-dungeon/src/surface.rs @@ -57,6 +57,7 @@ pub fn player_surface(campaign: &Campaign, narrations: &[NarrationProjection]) - "providerKind":"narrative.simulation", "title":campaign.name, "version":interface_version, "world_revision":campaign.revision, "player_actor_id":campaign.player_actor_id, + "player_location_id":player.location_id, "resolution":{ "policy":campaign.resolution_policy, "effective_budget":effective_budget, @@ -298,7 +299,7 @@ mod tests { } #[test] - fn player_surface_projects_the_canonical_player_actor_id() { + fn player_surface_projects_canonical_player_and_location_ids() { let mut campaign = crate::resolution::tests::campaign(1, 1); let mut player = campaign.actors.remove("player").unwrap(); player.id = "pilot-nyx".into(); @@ -308,5 +309,6 @@ mod tests { let surface = player_surface(&campaign, &[]); assert_eq!(surface["player_actor_id"], "pilot-nyx"); + assert_eq!(surface["player_location_id"], "center"); } } diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 29a092a..2b36a05 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -808,7 +808,10 @@ and its intended effect; the browser no longer duplicates one sentence into both assessment fields. The approval preview now exposes its full public decision surface in expandable sections, and a browser-local request lock prevents double-clicks from launching duplicate inference without claiming any -world-state authority. +world-state authority. Destination compilation no longer asks the player to +transcribe an internal location ID: the canonical current ID is projected by +the server and bound read-only, while destination and fission receipts expose +the topology or child leaves being approved. ## Warnings diff --git a/notes/ghostlight-current-system-map.md b/notes/ghostlight-current-system-map.md index d11854a..3de5ad6 100644 --- a/notes/ghostlight-current-system-map.md +++ b/notes/ghostlight-current-system-map.md @@ -349,6 +349,11 @@ world clocks, and exact evidence-use rationales instead of asking for approval from summary counts. A browser-local interaction lock prevents duplicate paid requests while preserving the kernel mailbox and revision checks as the only world-mutation authority. +The player surface also projects the canonical current location ID. The +destination compiler binds that value into a read-only origin field and shows +the proposed locations, containment, routes, persistent features, and material +gaps before approval. Population fission approval similarly shows each named +child leaf, partition value (including `other/unknown`), and home location. Relationship documents in the schema catalog are revision-bound projections of actor-owned relationship maps; they are not a second relationship writer. diff --git a/state/evidence.jsonl b/state/evidence.jsonl index 520b0e5..6595d0f 100644 --- a/state/evidence.jsonl +++ b/state/evidence.jsonl @@ -97,4 +97,5 @@ {"ts":"2026-08-18T19:05:00Z","type":"implementation","status":"ok","branch":"codex/ghostlight-dungeon-mvp","note":"Pre-human browser audit restored the fiction-first assessment boundary: the composer now sends distinct description and intended_effect fields, so spoken words are not conflated with persuasion or another desired consequence. The receipt panel now exclusively owns the current assessment, destination, or fission approval button; newer snapshot-bound receipts structurally replace stale controls. Vite production build succeeded."} {"ts":"2026-08-18T19:11:00Z","type":"deployment","status":"ok","branch":"codex/ghostlight-dungeon-mvp","note":"Starfire activated immutable release f9b0ffb90e6a8b3e1505d81995e81e09a9c58cd7 with executable SHA-256 66df149fbf548fc5da6658268e1bb53c62d9608ef6c2c306c6cfc9c909dabdfe and rollback 7916ab04936ba962720cfbf4af1b83f9aa8d8b24. Typed health, release manifest, active junction, PID 12212, four persisted campaigns, DeepSeek readiness, and served browser asset index-DCxXqgqF.js agree. Publication did not rotate or consume invitations."} {"ts":"2026-08-18T19:14:00Z","type":"implementation","status":"ok","branch":"codex/ghostlight-dungeon-mvp","note":"The world-seed preview now renders the full public approval surface—player capabilities/equipment/conditions/obligations, stable topology and routes, cast, institutions, populations, clocks, and exact evidence-use rationales—in compact expandable sections. A browser-local request lock disables only previously enabled controls during compilation or commands and restores those exact controls afterward, preventing accidental duplicate inference while leaving mailbox/revision authority server-side. Vite production build succeeded."} +{"ts":"2026-08-18T19:18:00Z","type":"implementation","status":"ok","branch":"codex/ghostlight-dungeon-mvp","note":"The player surface now projects the canonical current location ID beside the canonical actor ID. The destination form binds that ID read-only rather than asking the player to transcribe internal state, and its approval receipt shows proposed containment, routes, persistent features, and material gaps. Fission approval shows each child leaf, partition value including other/unknown, and home location. Focused surface regression and Vite production build passed."} {"ts":"2026-08-18T18:52:00Z","type":"verification","status":"ok","branch":"codex/ghostlight-dungeon-mvp","note":"Exact release 7916ab04936ba962720cfbf4af1b83f9aa8d8b24 made every selected named member exception a mandatory Projector perspective owner, closing the seam where aggregation could erase an actionable individual before Persona choice. The strict provider-backed budget-one golden placed 24 rivals in one arena, attributed migration to member:mira-venn, moved her between depth-two population lineages, produced nine sustained material consequences including seven typed outcomes across six other background subjects, preserved her delta and the player, and automatically promoted the same Mira on return with zero rejected pulses. Witness: F:\\GameCult\\GhostlightDungeon\\acceptance\\gestalt-dynamics-7916ab0-strict\\result.json."} diff --git a/web/dist/assets/index-Cdu4csne.js b/web/dist/assets/index-DbDnq-RC.js similarity index 60% rename from web/dist/assets/index-Cdu4csne.js rename to web/dist/assets/index-DbDnq-RC.js index 1001000..24e43fc 100644 --- a/web/dist/assets/index-Cdu4csne.js +++ b/web/dist/assets/index-DbDnq-RC.js @@ -1,4 +1,4 @@ -(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))i(o);new MutationObserver(o=>{for(const a of o)if(a.type==="childList")for(const l of a.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&i(l)}).observe(document,{childList:!0,subtree:!0});function n(o){const a={};return o.integrity&&(a.integrity=o.integrity),o.referrerPolicy&&(a.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?a.credentials="include":o.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function i(o){if(o.ep)return;o.ep=!0;const a=n(o);fetch(o.href,a)}})();const Y=new WeakMap,Te=20;function yt(e,t,n,i,o,a,l,c){const f=wt(e.canvas);if(!f)return!1;const s=f.gl;if(!St(f,a,l))return Y.set(e.canvas,null),!1;const r=bt(t,n,i,o,c);s.bindFramebuffer(s.FRAMEBUFFER,f.framebuffer),s.viewport(0,0,a,l),s.disable(s.DEPTH_TEST),s.disable(s.CULL_FACE),s.enable(s.BLEND),s.blendFunc(s.ONE,s.ONE),s.clearColor(0,0,0,1),s.clear(s.COLOR_BUFFER_BIT),r.gravity.length>0&&(s.useProgram(f.splatProgram),s.uniform4f(s.getUniformLocation(f.splatProgram,"u_viewport"),o.minX,o.minY,o.maxX,o.maxY),s.uniform1f(s.getUniformLocation(f.splatProgram,"u_time"),I(t.simulationTimeSeconds,0)),s.bindBuffer(s.ARRAY_BUFFER,f.splatBuffer),s.bufferData(s.ARRAY_BUFFER,r.gravity,s.DYNAMIC_DRAW),ze(s,f.splatProgram),s.drawArrays(s.TRIANGLES,0,r.gravity.length/Te)),s.bindFramebuffer(s.FRAMEBUFFER,f.tintFramebuffer),s.clearColor(0,0,0,0),s.clear(s.COLOR_BUFFER_BIT),r.tint.length>0&&(s.useProgram(f.splatProgram),s.uniform4f(s.getUniformLocation(f.splatProgram,"u_viewport"),o.minX,o.minY,o.maxX,o.maxY),s.uniform1f(s.getUniformLocation(f.splatProgram,"u_time"),I(t.simulationTimeSeconds,0)),s.bindBuffer(s.ARRAY_BUFFER,f.splatBuffer),s.bufferData(s.ARRAY_BUFFER,r.tint,s.DYNAMIC_DRAW),ze(s,f.splatProgram),s.drawArrays(s.TRIANGLES,0,r.tint.length/Te)),s.disable(s.BLEND),s.bindFramebuffer(s.FRAMEBUFFER,null),s.viewport(0,0,a,l),s.useProgram(f.shadeProgram),s.activeTexture(s.TEXTURE0),s.bindTexture(s.TEXTURE_2D,f.fieldTexture),s.uniform1i(s.getUniformLocation(f.shadeProgram,"u_field"),0),s.activeTexture(s.TEXTURE1),s.bindTexture(s.TEXTURE_2D,f.tintTexture),s.uniform1i(s.getUniformLocation(f.shadeProgram,"u_tint"),1),s.uniform2f(s.getUniformLocation(f.shadeProgram,"u_resolution"),a,l),s.uniform1f(s.getUniformLocation(f.shadeProgram,"u_time"),I(n.simulationTimeSeconds,I(t.simulationTimeSeconds,0))),s.uniform1f(s.getUniformLocation(f.shadeProgram,"u_lineInterval"),I(t.lineInterval,I(t.scalarFieldLineInterval,I(t.depthRange,228.79605)/20))),s.uniform1f(s.getUniformLocation(f.shadeProgram,"u_lineOffset"),I(t.lineOffset,I(t.startDepth,2.310401))),s.uniform1f(s.getUniformLocation(f.shadeProgram,"u_lineWidth"),I(t.lineWidth,.3)),s.uniform1f(s.getUniformLocation(f.shadeProgram,"u_lineFade"),I(t.lineFade,5)),s.uniform1f(s.getUniformLocation(f.shadeProgram,"u_angleWidth"),I(t.angleWidth,.05)),s.uniform1f(s.getUniformLocation(f.shadeProgram,"u_angleFade"),I(t.angleFade,1.15)),s.uniform1f(s.getUniformLocation(f.shadeProgram,"u_dangerSteepness"),I(t.dangerSteepness,1.5)),s.uniform1f(s.getUniformLocation(f.shadeProgram,"u_scale"),I(t.isolineScale,2.6924083)),re(s,f.shadeProgram,"u_baseColor",ie(t.scalarFieldBaseColor,[.002,.006,.012])),re(s,f.shadeProgram,"u_fieldGlowColor",ie(t.scalarFieldGlowColor,[.018,.05,.075])),re(s,f.shadeProgram,"u_lineLowColor",ie(t.scalarFieldLowLineColor,[0,.34,.52])),re(s,f.shadeProgram,"u_lineHighColor",ie(t.scalarFieldHighLineColor,[1.45,.3,.05])),re(s,f.shadeProgram,"u_angleLowColor",ie(t.scalarFieldLowAngleColor,[.06,.16,.24])),re(s,f.shadeProgram,"u_angleHighColor",ie(t.scalarFieldHighAngleColor,[1.1,.24,.04])),s.uniform1f(s.getUniformLocation(f.shadeProgram,"u_tintScale"),I(t.vectorFieldTintScale,.45)),s.bindBuffer(s.ARRAY_BUFFER,f.quadBuffer);const d=s.getAttribLocation(f.shadeProgram,"a_position");return s.enableVertexAttribArray(d),s.vertexAttribPointer(d,2,s.FLOAT,!1,0,0),s.drawArrays(s.TRIANGLES,0,6),e.drawImage(f.canvas,0,0,a,l),!0}function bt(e,t,n,i,o){const a=[],l=[];return vt(a,e,t,n),xt(l,e,o),{gravity:new Float32Array(a),tint:new Float32Array(l)}}function vt(e,t,n,i,o){const a=I(n.terrainRadius,I(t.terrainRadius,1200)),l=I(n.terrainDepth,I(t.terrainDepth,-8));l!==0&&ye(e,0,0,Math.max(1,a*2),Math.max(1,a*2),-l,0,0,1,Math.max(1e-4,I(n.terrainDepthExponent,I(t.terrainDepthExponent,1.2))),0,1,0,0);for(const c of i)ye(e,c.x,c.y,Math.max(1,c.radius),Math.max(1,c.radius),-c.depth,0,0,1,Math.max(1e-4,c.exponent),0,1,0,0),c.waveRadius>0&&c.waveDepth!==0&&ye(e,c.x,c.y,c.waveRadius,c.waveRadius,-c.waveDepth,0,0,1,8,4,I(n.terrainWaveFrequency,I(t.terrainWaveFrequency,.6)),c.waveSpeed,0)}function xt(e,t,n){const i=_t(n?.splats),o=Array.isArray(n?.layers)?n.layers:[],a=new Set,l=At(t.vectorFieldLayer,t.tintFieldLayer,"fog.tint");o.forEach((C,ne)=>{const ue=Et(C?.layerKey,"");I(C?.channel,-1)===4&&ue===l&&a.add(ne)});const c=Math.max(0,It(i.count,0));if(c<=0||a.size===0)return;const f=L(i.centerX),s=L(i.centerY),r=L(i.halfExtentX),d=L(i.halfExtentY),u=L(i.rotationCos),g=L(i.rotationSin),y=L(i.channel),b=L(i.falloff),x=L(i.valueR),T=L(i.valueG),A=L(i.valueB),D=L(i.valueA),Q=L(i.sourceKind),j=L(i.frequencyX),ee=L(i.animationSpeed),te=L(i.sourceFlags),G=L(i.layerIndex);for(let C=0;CNumber(i));if(n.length>=3&&n.slice(0,3).every(Number.isFinite))return[n[0],n[1],n[2]]}if(typeof e=="string"){const n=e.split(/[,\s]+/).map(i=>Number(i)).filter(Number.isFinite);if(n.length>=3)return[n[0],n[1],n[2]]}return t}function re(e,t,n,i){e.uniform3f(e.getUniformLocation(t,n),i[0],i[1],i[2])}function L(e){return Array.isArray(e)?e.map(t=>I(t,0)):[]}function _t(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function Et(e,t){return e==null?t:String(e)}function At(...e){for(const t of e){if(typeof t=="string"&&t.trim())return t;if(typeof t=="number"&&Number.isFinite(t))return String(t)}return""}function It(e,t){const n=Number(e);return Number.isFinite(n)?Math.max(0,Math.floor(n)):t}const Ct=`#version 300 es +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))i(o);new MutationObserver(o=>{for(const a of o)if(a.type==="childList")for(const l of a.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&i(l)}).observe(document,{childList:!0,subtree:!0});function n(o){const a={};return o.integrity&&(a.integrity=o.integrity),o.referrerPolicy&&(a.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?a.credentials="include":o.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function i(o){if(o.ep)return;o.ep=!0;const a=n(o);fetch(o.href,a)}})();const Y=new WeakMap,Te=20;function yt(e,t,n,i,o,a,l,s){const f=xt(e.canvas);if(!f)return!1;const c=f.gl;if(!St(f,a,l))return Y.set(e.canvas,null),!1;const r=bt(t,n,i,o,s);c.bindFramebuffer(c.FRAMEBUFFER,f.framebuffer),c.viewport(0,0,a,l),c.disable(c.DEPTH_TEST),c.disable(c.CULL_FACE),c.enable(c.BLEND),c.blendFunc(c.ONE,c.ONE),c.clearColor(0,0,0,1),c.clear(c.COLOR_BUFFER_BIT),r.gravity.length>0&&(c.useProgram(f.splatProgram),c.uniform4f(c.getUniformLocation(f.splatProgram,"u_viewport"),o.minX,o.minY,o.maxX,o.maxY),c.uniform1f(c.getUniformLocation(f.splatProgram,"u_time"),I(t.simulationTimeSeconds,0)),c.bindBuffer(c.ARRAY_BUFFER,f.splatBuffer),c.bufferData(c.ARRAY_BUFFER,r.gravity,c.DYNAMIC_DRAW),Oe(c,f.splatProgram),c.drawArrays(c.TRIANGLES,0,r.gravity.length/Te)),c.bindFramebuffer(c.FRAMEBUFFER,f.tintFramebuffer),c.clearColor(0,0,0,0),c.clear(c.COLOR_BUFFER_BIT),r.tint.length>0&&(c.useProgram(f.splatProgram),c.uniform4f(c.getUniformLocation(f.splatProgram,"u_viewport"),o.minX,o.minY,o.maxX,o.maxY),c.uniform1f(c.getUniformLocation(f.splatProgram,"u_time"),I(t.simulationTimeSeconds,0)),c.bindBuffer(c.ARRAY_BUFFER,f.splatBuffer),c.bufferData(c.ARRAY_BUFFER,r.tint,c.DYNAMIC_DRAW),Oe(c,f.splatProgram),c.drawArrays(c.TRIANGLES,0,r.tint.length/Te)),c.disable(c.BLEND),c.bindFramebuffer(c.FRAMEBUFFER,null),c.viewport(0,0,a,l),c.useProgram(f.shadeProgram),c.activeTexture(c.TEXTURE0),c.bindTexture(c.TEXTURE_2D,f.fieldTexture),c.uniform1i(c.getUniformLocation(f.shadeProgram,"u_field"),0),c.activeTexture(c.TEXTURE1),c.bindTexture(c.TEXTURE_2D,f.tintTexture),c.uniform1i(c.getUniformLocation(f.shadeProgram,"u_tint"),1),c.uniform2f(c.getUniformLocation(f.shadeProgram,"u_resolution"),a,l),c.uniform1f(c.getUniformLocation(f.shadeProgram,"u_time"),I(n.simulationTimeSeconds,I(t.simulationTimeSeconds,0))),c.uniform1f(c.getUniformLocation(f.shadeProgram,"u_lineInterval"),I(t.lineInterval,I(t.scalarFieldLineInterval,I(t.depthRange,228.79605)/20))),c.uniform1f(c.getUniformLocation(f.shadeProgram,"u_lineOffset"),I(t.lineOffset,I(t.startDepth,2.310401))),c.uniform1f(c.getUniformLocation(f.shadeProgram,"u_lineWidth"),I(t.lineWidth,.3)),c.uniform1f(c.getUniformLocation(f.shadeProgram,"u_lineFade"),I(t.lineFade,5)),c.uniform1f(c.getUniformLocation(f.shadeProgram,"u_angleWidth"),I(t.angleWidth,.05)),c.uniform1f(c.getUniformLocation(f.shadeProgram,"u_angleFade"),I(t.angleFade,1.15)),c.uniform1f(c.getUniformLocation(f.shadeProgram,"u_dangerSteepness"),I(t.dangerSteepness,1.5)),c.uniform1f(c.getUniformLocation(f.shadeProgram,"u_scale"),I(t.isolineScale,2.6924083)),re(c,f.shadeProgram,"u_baseColor",ie(t.scalarFieldBaseColor,[.002,.006,.012])),re(c,f.shadeProgram,"u_fieldGlowColor",ie(t.scalarFieldGlowColor,[.018,.05,.075])),re(c,f.shadeProgram,"u_lineLowColor",ie(t.scalarFieldLowLineColor,[0,.34,.52])),re(c,f.shadeProgram,"u_lineHighColor",ie(t.scalarFieldHighLineColor,[1.45,.3,.05])),re(c,f.shadeProgram,"u_angleLowColor",ie(t.scalarFieldLowAngleColor,[.06,.16,.24])),re(c,f.shadeProgram,"u_angleHighColor",ie(t.scalarFieldHighAngleColor,[1.1,.24,.04])),c.uniform1f(c.getUniformLocation(f.shadeProgram,"u_tintScale"),I(t.vectorFieldTintScale,.45)),c.bindBuffer(c.ARRAY_BUFFER,f.quadBuffer);const d=c.getAttribLocation(f.shadeProgram,"a_position");return c.enableVertexAttribArray(d),c.vertexAttribPointer(d,2,c.FLOAT,!1,0,0),c.drawArrays(c.TRIANGLES,0,6),e.drawImage(f.canvas,0,0,a,l),!0}function bt(e,t,n,i,o){const a=[],l=[];return vt(a,e,t,n),wt(l,e,o),{gravity:new Float32Array(a),tint:new Float32Array(l)}}function vt(e,t,n,i,o){const a=I(n.terrainRadius,I(t.terrainRadius,1200)),l=I(n.terrainDepth,I(t.terrainDepth,-8));l!==0&&ye(e,0,0,Math.max(1,a*2),Math.max(1,a*2),-l,0,0,1,Math.max(1e-4,I(n.terrainDepthExponent,I(t.terrainDepthExponent,1.2))),0,1,0,0);for(const s of i)ye(e,s.x,s.y,Math.max(1,s.radius),Math.max(1,s.radius),-s.depth,0,0,1,Math.max(1e-4,s.exponent),0,1,0,0),s.waveRadius>0&&s.waveDepth!==0&&ye(e,s.x,s.y,s.waveRadius,s.waveRadius,-s.waveDepth,0,0,1,8,4,I(n.terrainWaveFrequency,I(t.terrainWaveFrequency,.6)),s.waveSpeed,0)}function wt(e,t,n){const i=_t(n?.splats),o=Array.isArray(n?.layers)?n.layers:[],a=new Set,l=At(t.vectorFieldLayer,t.tintFieldLayer,"fog.tint");o.forEach((C,ne)=>{const ue=Et(C?.layerKey,"");I(C?.channel,-1)===4&&ue===l&&a.add(ne)});const s=Math.max(0,It(i.count,0));if(s<=0||a.size===0)return;const f=$(i.centerX),c=$(i.centerY),r=$(i.halfExtentX),d=$(i.halfExtentY),u=$(i.rotationCos),g=$(i.rotationSin),y=$(i.channel),b=$(i.falloff),w=$(i.valueR),T=$(i.valueG),A=$(i.valueB),D=$(i.valueA),Q=$(i.sourceKind),G=$(i.frequencyX),ee=$(i.animationSpeed),te=$(i.sourceFlags),K=$(i.layerIndex);for(let C=0;CNumber(i));if(n.length>=3&&n.slice(0,3).every(Number.isFinite))return[n[0],n[1],n[2]]}if(typeof e=="string"){const n=e.split(/[,\s]+/).map(i=>Number(i)).filter(Number.isFinite);if(n.length>=3)return[n[0],n[1],n[2]]}return t}function re(e,t,n,i){e.uniform3f(e.getUniformLocation(t,n),i[0],i[1],i[2])}function $(e){return Array.isArray(e)?e.map(t=>I(t,0)):[]}function _t(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function Et(e,t){return e==null?t:String(e)}function At(...e){for(const t of e){if(typeof t=="string"&&t.trim())return t;if(typeof t=="number"&&Number.isFinite(t))return String(t)}return""}function It(e,t){const n=Number(e);return Number.isFinite(n)?Math.max(0,Math.floor(n)):t}const Ct=`#version 300 es in vec2 a_corner; in vec2 a_center; in vec2 a_half; @@ -131,7 +131,7 @@ void main() { color += clamp(lines, 0.0, 1.7); outColor = vec4(color, 1.0); -}`,et=new Set(["gamecult.fields.splats.v1","gamecult.fields.gravity.v1","gamecult.fields.objects.v1"]),Ft={pluginId:"fields.surface",capabilities:["field.surface2d","gravity.surface","field.scalar","field.vector","field.objects"],componentKinds:["field.surface2d","gravity.surface"],schemas:[...et],normalizeDocument:ke,renderComponent:Pt};function Pt(e,t,n,i,o,a){const l=document.createElement("canvas");l.className="cultui-gravity-surface",e.id&&(l.id=e.id),l.setAttribute("role","img"),l.setAttribute("aria-label",nn(t.label,"gravity surface")),l.style.display="block",l.style.width="100%",l.style.height="100%",l.style.pointerEvents="none",a.applyGeneratedLayout(l,n,i);let c=!1;const f={},s=()=>Mt(l,t,f,a.resolveAssetUrl),r=()=>{!l.isConnected||c||(c=!0,requestAnimationFrame(()=>{c=!1,l.isConnected&&s()}))};l.addEventListener("cultui:asset-loaded",r);let d=0,u;const g=()=>{d&&window.clearInterval(d),u?.disconnect(),l.removeEventListener("cultui:asset-loaded",r)},y=()=>{if(!l.isConnected){g();return}Lt(e,t,o,a.providerId,f).then(x=>{x&&l.isConnected&&r()}).catch(x=>{f.lastError=x instanceof Error?x.message:String(x)})};typeof ResizeObserver<"u"&&(u=new ResizeObserver(r),u.observe(l)),r();const b=Math.max(33,Math.min(1e3,rn(t.stateRefreshMs,100)));return d=window.setInterval(y,b),queueMicrotask(y),window.setTimeout(r,300),window.setTimeout(r,1e3),l}async function Lt(e,t,n,i,o){if(o.loading)return!1;const a=[Ee(e,t,"renderSplats","renderSplatsDocumentId","renderSplatsSchemaId"),Ee(e,t,"gravity","gravityDocumentId","gravitySchemaId"),Ee(e,t,"objects","objectsDocumentId","objectsSchemaId")].filter(l=>!!l?.documentId);if(a.length===0)return!1;o.loading=!0;try{let l=!1;for(const c of a){const f=await n.documentResolver?.(c,e);let s=xe(ke(f?.schemaId||c.schemaId,f?.document));if(Object.keys(s).length===0&&(s=xe(ke(c.schemaId,await $t(c,i||n.provider?.providerId)))),Object.keys(s).length===0)continue;const r=c.slotId==="renderSplats"?"renderSplats":c.slotId==="gravity"?"gravity":"objects",d=Fe(o[r]?.frameId,-1),u=Fe(s.frameId,d);o[r]=s,l||=u!==d}return o.lastLoadedAt=Date.now(),l}finally{o.loading=!1}}async function $t(e,t){if(typeof fetch!="function"||typeof window>"u"||!t)return;const n=new URLSearchParams({documentId:e.documentId});e.schemaId&&n.set("schemaId",e.schemaId),e.slotId&&n.set("slotId",e.slotId);const i=await fetch(`/eir/document/${encodeURIComponent(t)}?${n.toString()}`,{cache:"no-store",headers:{Accept:"application/json"}});if(i.ok)return xe(await i.json()).document}function Ee(e,t,n,i,o){const a=(e.embeddedDocuments||[]).find(c=>String(c?.slotId||"")===n),l=k(t[i],a?.documentId);if(l)return{documentId:l,schemaId:k(t[o],a?.schemaId),presentationKind:k(a?.presentationKind)||"data",slotId:n}}function ke(e,t){const n=Array.isArray(t)?t:void 0,i=n?n[0]:t?.schema,o=String(e||i||"");return!n||!et.has(o)?t:o==="gamecult.fields.splats.v1"?Xt(n):o==="gamecult.fields.gravity.v1"?Yt(n):Ht(n)}function Mt(e,t,n,i){const o=e.getBoundingClientRect(),a=Math.max(1,Math.floor(o.width||e.clientWidth||1)),l=Math.max(1,Math.floor(o.height||e.clientHeight||1)),c=Math.max(1,Math.min(2,window.devicePixelRatio||1)),f=Math.max(1,Math.floor(a*c)),s=Math.max(1,Math.floor(l*c));(e.width!==f||e.height!==s)&&(e.width=f,e.height=s);const r=e.getContext("2d");if(!r)return;r.setTransform(c,0,0,c,0,0),r.clearRect(0,0,a,l);const d=Kt(Gt(t),a,l),u=it(n?.gravity),g=zt(n?.gravity)||Wt(k(t.bodies,"")),y=jt(n?.objects)||Ot(k(t.objects,""));yt(r,t,u,g,d,a,l,n?.renderSplats)||Nt(r,t,a,l,"field.surface2d requires WebGL2 float render targets"),Dt(r,g,t,d,a,l,i),Ut(r,y,t,d,a,l,i)}function Nt(e,t,n,i,o){e.save(),e.fillStyle=k(t.failureBackground,"rgba(0, 0, 0, 0.72)"),e.fillRect(0,0,n,i),e.font=k(t.failureFont,"700 13px Cascadia Mono, Consolas, monospace"),e.fillStyle=k(t.failureColor,"rgba(255, 184, 79, 0.95)"),e.fillText(o,16,28),e.restore()}function Dt(e,t,n,i,o,a,l){for(const c of t){const f=nt(i,c.x,c.y,o,a),s=Math.max(18,Math.min(190,c.radius/Math.max(1,i.maxX-i.minX)*o*.32)),r=l(c.icon),d=c.kind.toLowerCase().includes("sun")?Math.max(E(n.sunIconMinPx,34),s*E(n.sunIconScale,.72)):Math.max(E(n.bodyIconMinPx,24),s*E(n.bodyIconScale,.48)),u=c.iconSize>0?c.iconSize:d;r&&Bt(e,r,f.x,f.y,u,.92),c.key&&tt(e,n,c.key.replace(/^local\./,""),f.x+s*.44,f.y-s*.48,k(n.bodyLabelColor,"rgba(226, 244, 255, 0.82)"))}}const ve=new Map;function Bt(e,t,n,i,o,a){let l=ve.get(t);l||(l=new Image,l.decoding="async",l.onload=()=>requestAnimationFrame(()=>{e.canvas.dispatchEvent(new CustomEvent("cultui:asset-loaded"))}),l.src=t,ve.set(t,l)),!(!l.complete||l.naturalWidth===0)&&(e.save(),e.globalAlpha=a,e.drawImage(l,n-o/2,i-o/2,o,o),e.restore())}function Ut(e,t,n,i,o,a,l){for(const c of t){const f=nt(i,c.x,c.y,o,a);if(f.x<-40||f.x>o+40||f.y<-40||f.y>a+40)continue;const s=c.kind.toLowerCase().includes("station")?E(n.stationIconSizePx,34):c.controlled?E(n.shipIconSizePx,22):E(n.remoteShipIconSizePx,18),r=qt(n,c.faction,c.controlled,c.visibility),d=l(c.icon);e.save(),e.globalAlpha=Math.max(.25,Math.min(1,c.visibility)),e.translate(f.x,f.y);const u=Math.atan2(c.directionY,c.directionX)+Math.PI/2;if(c.kind.toLowerCase().includes("ship")&&e.rotate(u),d){const g=ve.get(d);if(g)g.complete&&g.naturalWidth>0&&e.drawImage(g,-s/2,-s/2,s,s);else{const y=new Image;y.decoding="async",y.onload=()=>e.canvas.dispatchEvent(new CustomEvent("cultui:asset-loaded")),y.src=d,ve.set(d,y)}}e.restore(),tt(e,n,c.label,f.x+s*.55,f.y-s*.45,r)}}function tt(e,t,n,i,o,a){n&&(e.save(),e.font=k(t.objectLabelFont,"700 12px Ubuntu, system-ui, sans-serif"),e.textBaseline="middle",e.lineWidth=E(t.objectLabelStrokeWidth,3),e.strokeStyle=k(t.objectLabelStroke,"rgba(0, 0, 0, 0.72)"),e.fillStyle=a,e.strokeText(n,i,o),e.fillText(n,i,o),e.restore())}function qt(e,t,n,i){const o=Math.max(.25,Math.min(1,i));if(n)return fe(k(e.objectControlledColor,"rgba(122, 240, 255, {alpha})"),o);const a=t.toLowerCase();return a.includes("raider")?fe(k(e.objectRaiderColor,"rgba(255, 143, 74, {alpha})"),o):a.includes("neutral")?fe(k(e.objectNeutralColor,"rgba(232, 232, 224, {alpha})"),o):fe(k(e.objectDefaultColor,"rgba(214, 244, 255, {alpha})"),o)}function fe(e,t){return e.replaceAll("{alpha}",String(t))}function Wt(e){return e.split(";").map(t=>t.trim()).filter(Boolean).map(t=>{const n=t.split("|");return{key:n[0]??"",kind:n[1]??"",x:Number(n[2])||0,y:Number(n[3])||0,radius:Math.max(1,Number(n[4])||1),depth:Number(n[5])||0,exponent:Number(n[6])||1,waveRadius:Number(n[7])||0,waveDepth:Number(n[8])||0,waveSpeed:Number(n[9])||0,icon:n[10]??"",iconSize:Number(n[12])||0,tint:n[11]??""}})}function Ot(e){return e.split(";").map(t=>t.trim()).filter(Boolean).map(t=>{const n=t.split("|");return{key:n[0]??"",kind:n[1]??"",label:n[2]??"",x:Number(n[3])||0,y:Number(n[4])||0,directionX:Number(n[5])||0,directionY:Number(n[6])||1,faction:n[7]??"",controlled:n[8]==="1"||n[8]==="true",visibility:Number(n[9])||1,icon:n[10]??""}})}function zt(e){const t=Array.isArray(e?.gravityInfluences)?e.gravityInfluences:[],n=Array.isArray(e?.bodies)?e.bodies:[];if(t.length===0&&n.length===0)return;const i=new Map;for(const o of n){const a=k(o.bodyKey,o.name,"");a&&i.set(a,o)}return(t.length>0?t:n).map(o=>{const a=k(o.bodyKey,o.name,"body"),l=i.get(a),c=k(o.kind,"Body");return{key:a,kind:c,x:E(o.x,0),y:E(o.y,0),radius:Math.max(1,E(o.radius,80)),depth:E(o.gravityDepth,0),exponent:E(o.gravityDepthExponent,1),waveRadius:E(o.waveRadius,0),waveDepth:E(o.waveDepth,0),waveSpeed:E(o.waveSpeed,0),icon:Re(o.iconAsset)||Re(l?.iconAsset),iconSize:E(l?.iconSize,E(o.iconSize,0)),tint:""}})}function jt(e){const t=Array.isArray(e?.objects)?e.objects:[];if(t.length!==0)return t.map(n=>{const i=k(n.kind,"object");return{key:k(n.entityKey,String(n.entityIndex??""),"object"),kind:i,label:k(n.displayName,n.entityKey,"object"),x:E(n.x,0),y:E(n.y,0),directionX:E(n.directionX,1),directionY:E(n.directionY,0),faction:k(n.factionKey,""),controlled:on(n.controlled),visibility:E(n.visibility,1),icon:Re(n.iconAsset)}})}function Re(e){const t=it(e);return k(t.uri,"")}function Gt(e){const t=Math.max(1,E(e.viewRadius,Math.max(1200,E(e.terrainRadius,1200))));return{minX:E(e.minX,-t),minY:E(e.minY,-t),maxX:E(e.maxX,t),maxY:E(e.maxY,t)}}function Kt(e,t,n){const i=Math.max(1e-4,e.maxX-e.minX),o=Math.max(1e-4,e.maxY-e.minY),a=Math.max(1e-4,t/Math.max(1,n)),l=i/o,c=(e.minX+e.maxX)*.5,f=(e.minY+e.maxY)*.5;if(a>l){const r=o*a;return{minX:c-r*.5,maxX:c+r*.5,minY:e.minY,maxY:e.maxY}}const s=i/a;return{minX:e.minX,maxX:e.maxX,minY:f-s*.5,maxY:f+s*.5}}function nt(e,t,n,i,o){return{x:(t-e.minX)/Math.max(1,e.maxX-e.minX)*i,y:(n-e.minY)/Math.max(1,e.maxY-e.minY)*o}}function Xt(e){const t=M(e[9]);return{schema:e[0],frameId:e[1],publishedAtUtc:e[2],simulationTimeSeconds:e[3],runId:e[4],zoneIndex:e[5],zoneName:e[6],viewport:$e(e[7]),layers:M(e[8]).map(Vt),splats:{count:t[0]??0,centerX:t[1]||[],centerY:t[2]||[],halfExtentX:t[3]||[],halfExtentY:t[4]||[],rotationCos:t[5]||[],rotationSin:t[6]||[],channel:t[7]||[],falloff:t[8]||[],valueR:t[9]||[],valueG:t[10]||[],valueB:t[11]||[],valueA:t[12]||[],sourceKey:t[13]||[],layerIndex:t[14]||[],sourceKind:t[15]||[],frequencyX:t[16]||[],frequencyY:t[17]||[],phaseX:t[18]||[],phaseY:t[19]||[],animationSpeed:t[20]||[],sourceFlags:t[21]||[]}}}function Yt(e){return{schema:e[0],frameId:e[1],publishedAtUtc:e[2],simulationTimeSeconds:e[3],runId:e[4],zoneIndex:e[5],zoneName:e[6],viewport:$e(e[7]),gravityInfluences:M(e[8]).map(Jt),bodies:M(e[9]).map(Zt),terrainRadius:e[10],terrainDepth:e[11],terrainDepthExponent:e[12],terrainWaveFrequency:e[13]}}function Ht(e){return{schema:e[0],frameId:e[1],publishedAtUtc:e[2],simulationTimeSeconds:e[3],runId:e[4],zoneIndex:e[5],zoneName:e[6],currentEntityKey:e[7],viewport:$e(e[8]),controlledEntityIndices:M(e[9]),objects:M(e[10]).map(Qt)}}function $e(e){const t=M(e);return t.length?{minX:t[0],minY:t[1],maxX:t[2],maxY:t[3]}:e}function Vt(e){const t=M(e);return t.length?{layerKey:t[0],displayName:t[1],channel:t[2],blendMode:t[3],graphicsFormat:t[4],clearBeforeDraw:t[5],clearR:t[6],clearG:t[7],clearB:t[8],clearA:t[9]}:e}function Jt(e){const t=M(e);return t.length?{bodyKey:t[0],orbitKey:t[1],kind:t[2],x:t[3],y:t[4],radius:t[5],gravityDepth:t[6],gravityDepthExponent:t[7],waveRadius:t[8],waveDepth:t[9],waveSpeed:t[10]}:e}function Zt(e){const t=M(e);return t.length?{bodyKey:t[0],orbitKey:t[1],name:t[2],kind:t[3],x:t[4],y:t[5],radius:t[6],isAsteroidBelt:t[7],body:t[8],iconAsset:Me(t[9])}:e}function Qt(e){const t=M(e);return t.length?{entityIndex:t[0],entityKey:t[1],displayName:t[2],kind:t[3],factionKey:t[4],x:t[5],y:t[6],z:t[7],directionX:t[8],directionY:t[9],velocityX:t[10],velocityY:t[11],controlled:t[12],targetEntityIndex:t[13],isActive:t[14],visibility:t[15],status:en(t[16]),inventory:M(t[17]).map(tn),iconAsset:Me(t[18])}:e}function en(e){const t=M(e);return t.length?{hull:t[0],shield:t[1],heat:t[2]}:e||{}}function tn(e){const t=M(e);return t.length?{source:t[0],itemKey:t[1],quantity:t[2],quality:t[3],durability:t[4],enabled:t[5],sourceIndex:t[6],x:t[7],y:t[8],iconAsset:Me(t[9])}:e}function Me(e){const t=M(e);return t.length?{assetKey:t[0],kind:t[1],uri:t[2],transport:t[3],contentHash:t[4],mimeType:t[5],metadata:t[6]||{}}:e||{}}function M(e){return Array.isArray(e)?e:[]}function xe(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function k(...e){for(const t of e)if(typeof t=="string"&&t.trim())return t.trim();return""}function nn(e,t){return typeof e=="string"&&e?e:t}function rn(e,t){const n=Number(e);return Number.isFinite(n)&&n>0?Math.floor(n):t}function Fe(e,t){const n=Number(e);return Number.isFinite(n)?n:t}const it=xe,E=Fe;function on(e){return typeof e=="boolean"?e:typeof e=="number"?e!==0:typeof e=="string"&&["1","true","yes","on"].includes(e.trim().toLowerCase())}const an=[Ft],sn={"--bg":"#020909","--bg-top":"#020909","--bg-mid":"#020909","--bg-bottom":"#020909","--shell-top":"#010707","--shell-bottom":"#010707","--panel":"#071918","--panel-2":"#0a2423","--line":"rgba(103, 240, 228, 0.28)","--line-deep":"rgba(103, 240, 228, 0.18)","--text":"#e7f1f1","--text-bright":"#e7f1f1","--quiet":"#8ba5a3","--accent":"#ffb84f","--accent-strong":"#ffb84f","--corner-accent":"#ffb84f","--cyan":"#8efcff","--shadow":"rgba(0, 0, 0, 0.35)","--pixel-grid":"rgba(142, 252, 255, 0.04)","--border-width":"1px","--border-bottom-width":"1px","--corner-accent-size":"0","--font-body":'"M PLUS 1", "Ubuntu Sans", Ubuntu, "Noto Sans JP", system-ui, sans-serif',"--font-title":'"Montserrat", "Zen Kaku Gothic New", "M PLUS 1", "Ubuntu Sans", system-ui, sans-serif',"--font-mono":'"Ubuntu Sans Mono", "M PLUS 1 Code", "Cascadia Mono", Consolas, monospace'};let me,rt=Ne(void 0),le,O={};const Ke=new WeakMap;function ot(e,t,n={}){if(Ke.get(t)?.dispose(),le=e,O=n,rt=Ne(e.surface?.styles),globalThis.__eveCurrentMesh=e.mesh,An(e.surface?.styles,n.body??document.body),n.body&&(n.body.dataset.provider=e.providerId||n.provider?.providerId||""),n.statusElement&&(n.statusElement.textContent=`${e.title||e.surface?.title||"surface"}${n.source?` (${n.source})`:""}`),e.surface?.root){if(t.replaceChildren(P(e.surface.root,n)),n.stateBindingResolver){const i=new ln(e,t,n);Ke.set(t,i),i.start()}}else t.replaceChildren(J("No surface root"));return t}function cn(e,t,n){const i=t.targetProp.split(".").filter(Boolean);if(i.length===0)throw new Error("Eve state binding targetProp must not be empty.");e.props||={};let o=e.props;for(const a of i.slice(0,-1)){const l=o[a];(!l||typeof l!="object"||Array.isArray(l))&&(o[a]={}),o=o[a]}o[i[i.length-1]]=n}class ln{surface;host;options;disposed=!1;unsubscribers=[];constructor(t,n,i){this.surface=t,this.host=n,this.options=i}async start(){const t=this.options.stateBindingResolver,n=this.surface.surface?.root;if(!(!t||!n))for(const i of at(n))for(const o of i.stateBindings||[]){if(this.disposed)return;const a=await t(o,i);if(!a||this.disposed)continue;const l=c=>{this.disposed||(cn(i,o,c),this.renderCanonicalProjection())};if(l(await a.latest()),this.disposed)return;this.unsubscribers.push(a.watch(l))}}dispose(){this.disposed=!0;for(const t of this.unsubscribers.splice(0))t()}renderCanonicalProjection(){const t=this.surface.surface?.root;t&&this.host.replaceChildren(P(t,this.options))}}function*at(e){yield e;for(const t of e.children||[])yield*at(t)}function P(e,t=O){const n=e.kind||"panel",i=w(e.props),o=w(e.layout),a=w(e.style),l=e.children||[],c=e.embeddedDocuments||[];if(n==="surface"||n==="cockpit"||n==="dashboard"){const r=m("section","cultui-surface-root eve-surface");S(r,e),typeof o.direction=="string"?r.dataset.direction=o.direction:typeof i.layout=="object"&&i.layout&&typeof i.layout.direction=="string"&&(r.dataset.direction=String(i.layout.direction)),n!=="surface"&&(r.dataset.surfaceKind=n),_(r,o,a);for(const d of l)r.append(P(d,t));return r}if(n==="column"||n==="row"||n==="form"||n==="rail"){const r=m("div",`cultui-partition eve-${n}`);S(r,e),r.dataset.direction=n==="row"||n==="rail"?"horizontal":"vertical",n==="rail"&&(r.dataset.overflow="x"),ge(r,{...o,...i}),_(r,o,a);for(const d of l)r.append(P(d,t));return r}if(n==="grid"){const r=m("section","cultui-grid"),d=U(i.columns,0);d>0?r.style.gridTemplateColumns=`repeat(${d}, minmax(0, 1fr))`:typeof i.columns=="string"&&(r.style.gridTemplateColumns=i.columns);const u=U(i.rows,0);u>0&&(r.style.gridTemplateRows=`repeat(${u}, minmax(0, auto))`),_(r,o,a);for(const g of l)r.append(P(g,t));return r}if(n==="partition"){const r=m("section",`cultui-partition split-${h(i.split,"none")}`);S(r,e),ge(r,i),_(r,o,a),r.style.minWidth="0",h(i.split,"none")==="x"&&!p(i.flexWrap,o.flexWrap,"")&&(r.style.flexWrap="wrap"),typeof i.role=="string"&&(r.dataset.role=i.role);for(const d of l)r.append(P(d,t));return r}if(n==="input.binding-map")return wn(e,i,t);if(n==="inventory.drag_session")return hn(e,i,o,a);if(n==="inventory.grid")return yn(e,i,o,a,t);if(n==="inventory.item")return bn(e,i,o,a);const f=(t.pluginAdapters||an).find(r=>r.componentKinds.includes(n));if(f?.renderComponent)return f.renderComponent(e,i,o,a,t,{applyGeneratedLayout:_,providerId:le?.providerId||t.provider?.providerId,resolveAssetUrl:ae});if(n==="world.scene3d"||n==="world.scene2d")return un(e,i,o,a,t);if(n==="image.background"){const r=m("div","cultui-background"),d=ae(p(i.src,i.assetUri,i.assetRef,""));return d&&(r.style.backgroundImage=`url("${d}")`),r.setAttribute("aria-label",h(i.label,"background")),r}if(n==="image.sprite"){const r=m("figure",`cultui-sprite ${h(i.slot,"center")}`);S(r,e);const d=ae(p(i.src,i.assetUri,i.assetRef,""));if(d){const u=m("img");u.src=d,u.alt=h(i.alt,h(i.actor,h(i.label,""))),r.append(u)}return r}if(n==="avatar"){const r=m("figure","cultui-avatar-card");S(r,e);const d=ae(p(i.src,i.assetUri,i.assetRef,""));if(d){const b=m("img");b.src=d,b.alt=h(i.alt,h(i.text,h(i.label,""))),r.append(b)}else r.append(m("div","cultui-avatar-fallback",Dn(p(i.text,i.label,i.actor,"?"))));const u=p(i.text,i.label,i.actor,"");u&&r.append(m("figcaption","cultui-avatar-name",u));const g=p(i.status,"");g&&r.append(m("div","cultui-avatar-status",g));const y=p(i.detail,"");return y&&r.append(m("div","cultui-avatar-detail",y)),r}if(n==="pane"||n==="panel"){const r=m("section","pane cultui-pane");S(r,e);const d=h(i.span,"");d&&(r.dataset.span=d);const u=h(i.density,"");u&&(r.dataset.density=u);const g=h(i.title,e.text||"");g&&r.append(m("h2","",g));for(const y of l)r.append(P(y,t));return r}if(n==="list"||n.endsWith(".roster")){const r=m("section","cultui-list");S(r,e),r.dataset.componentKind=n;const d=h(i.title,"");d&&r.append(m("h3","cultui-list-title",d));for(const[u,g]of Mn(i.items).entries())r.append(P({id:`${e.id||"list"}-item-${u}`,kind:"list.item",props:{...g}},t));for(const u of l)r.append(P(u,t));return r}if(n==="list.item"||n.endsWith(".item")){const r=st(e),d=m("article","cultui-list-item");S(d,e),d.dataset.componentKind=n;const u=m("div","cultui-list-item-heading");if(u.append(m("strong","cultui-list-item-label",r.label)),r.status&&u.append(m("span","cultui-list-item-status",r.status)),d.append(u),r.detail&&d.append(m("div","cultui-list-item-detail",r.detail)),r.badges.length){const g=m("div","cultui-list-item-badges");for(const y of r.badges)g.append(m("span","cultui-list-item-badge",y));d.append(g)}for(const g of l)d.append(P(g,t));return d}if(n==="bar"){const r=m("div","cultui-meter");S(r,e);const d=h(i.label,""),u=h(i.value,"");if(d||u){const b=m("div","cultui-meter-head");b.append(m("span","",d)),b.append(m("strong","",u)),r.append(b)}const g=m("div","cultui-meter-track"),y=m("span","cultui-meter-fill");return y.style.width=`${Ze(i.percent)}%`,g.append(y),r.append(g),r}if(n==="card"){const r=Ve(i,e),d=r?m("button","card cultui-card cultui-card-button"):m("article","card cultui-card");S(d,e),_(d,o,a),d instanceof HTMLButtonElement&&(d.type="button");const u=h(i.title,e.text||"");u&&d.append(m("div","card-title",u));for(const g of l)d.append(P(g,t));return r&&Je(d,e,r,i,t),d}if(n==="control.button"){const r=m("button","cultui-button eve-control-button",h(i.label,"Action"));return S(r,e),r.type="button",_(r,o,a),Je(r,e,Ve(i,e),i,t),r}if(n==="control.popup"){const r=m("button","cultui-button eve-control-popup",h(i.label,"Open"));return S(r,e),r.type="button",_(r,o,a),r.addEventListener("click",d=>{Sn(e,t,r,d.clientX,d.clientY)}),r}if(n==="text.dialogue"||n==="text"||n==="text.title"||n==="text.subtitle"||n==="label"){const r=m("div",Rn(n,i),h(i.value,h(i.text,e.text||"")));return S(r,e),ge(r,i),_(r,o,a),r}if(n==="metric"){const r=m("dl","metric cultui-reactive-metric eve-metric");return S(r,e),_(r,o,a),r.append(m("dt","",h(i.label,"Metric"))),r.append(m("dd","metric-value",h(i.value,""))),r}if(n==="progress"){const r=m("div","cultui-meter eve-progress");S(r,e),_(r,o,a);const d=h(i.label,""),u=h(i.value,""),g=Number(i.min??0),y=Number(i.max??1),b=Number(i.value??0),x=Number.isFinite(b)&&Number.isFinite(g)&&Number.isFinite(y)&&y!==g?(b-g)/(y-g)*100:Ze(i.percent);if(d||u){const D=m("div","cultui-meter-head");D.append(m("span","",d)),D.append(m("strong","",u)),r.append(D)}const T=m("div","cultui-meter-track"),A=m("span","cultui-meter-fill");return A.style.width=`${Math.max(0,Math.min(100,x))}%`,T.append(A),r.append(T),r}if(n==="modal"){const r=m("section","cultui-modal-surface");S(r,e),_(r,o,a);const d=h(i.title,"");d&&r.append(m("h2","cultui-modal-surface-title",d));for(const u of l)r.append(P(u,t));return r}if(n==="options"){const r=m("section","cultui-options");S(r,e),_(r,o,a);const d=h(i.label,"");d&&r.append(m("h3","cultui-list-title",d));for(const u of l)r.append(P(u,t));return l.length===0&&r.append(J("waiting for options")),r}if(n==="image.preview"){const r=m("figure","cultui-image-preview");S(r,e);const d=m("div","cultui-image-frame"),u=ae(p(i.src,i.assetUri,i.assetRef,""));if(u){const g=m("img");g.src=u,g.alt=h(i.label,""),g.style.imageRendering=h(i.imageRendering,"auto"),i.zoom!==void 0&&(g.style.transform=`scale(${i.zoom})`,g.style.transformOrigin=h(i.crop,"50% 50%")),d.append(g)}else d.append(m("span","",h(i.label,"image")));return r.append(d),i.label&&r.append(m("figcaption","",String(i.label))),r}if(n==="canvas.preview"||n==="canvas.editor"){const r=m("div",`cultui-canvas-placeholder ${n==="canvas.editor"?"editor":"preview"}`);return S(r,e),r.append(m("div","viz-label",h(i.label,"Canvas"))),r.append(m("div","cultui-canvas-grid",i.state==="empty"?"waiting for pixels":h(i.state,""))),r}if(n==="surface.slot"){const r=m("section","cultui-embedded-slot");S(r,e),_(r,o,a),r.dataset.slotId=h(i.slotId,h(c[0]?.slotId,"")),r.dataset.documentId=h(i.documentId,h(c[0]?.documentId,"")),r.dataset.schemaId=h(i.schemaId,h(c[0]?.schemaId,"")),r.dataset.presentationKind=h(i.presentationKind,h(c[0]?.presentationKind,""));const d=c.map(g=>w(g.surface)).find(g=>w(g.root).kind||g.root),u=i.modal===!0||r.dataset.presentationKind.includes("modal");if((d||r.dataset.documentId)&&u){const g=m("button","cultui-button cultui-modal-trigger",h(i.label,r.dataset.slotId||"Configure"));g.type="button",g.addEventListener("click",()=>dt(Pe(e,t),t)),r.append(g)}else if(d||r.dataset.documentId){const g=m("div","cultui-embedded-slot-body");g.append(m("div","detail","materializing surface")),r.append(g),Pe(e,t).then(y=>{g.replaceChildren(y?.root?P(y.root,t):J("Embedded surface unavailable"))}).catch(y=>{g.replaceChildren(J(`Embedded surface failed: ${y instanceof Error?y.message:String(y)}`))})}else r.append(m("div","detail",r.dataset.presentationKind||r.dataset.slotId||"embedded surface"));return r}if(n==="control.slider")return Cn(i,l,t);if(n==="control.toggle"){const r=m("label","toggle-row cultui-toggle");return S(r,e),r.append(m("span","field-control",i.value?"on":"off")),r.append(m("span","toggle-copy",h(i.label,"Toggle"))),r}if(n==="input.number"||n==="input.select"||n==="control.range"||n==="control.input.text"||n==="control.select"){const r=m("label","field cultui-field");return S(r,e),ge(r,i),_(r,o,a),r.append(m("span","field-label",h(i.label,""))),r.append(m("span","field-control cultui-field-value",i.value===void 0?"":String(i.value))),r}if(n==="color.swatch"){const r=m("div","paint-swatch cultui-swatch");return S(r,e),r.style.background=h(i.value,h(i.color,"currentColor")),r.title=h(i.label,"Color"),r}const s=m("section","pane");S(s,e),s.append(m("h2","",n));for(const r of l)s.append(P(r,t));return s}function st(e){const t=w(e.props);return{label:p(t.label,t.title,t.displayName,e.text,e.kind,"item"),status:p(t.status,t.state,""),detail:p(t.detail,t.phase,t.repoName,""),badges:Array.isArray(t.badges)?t.badges.map(n=>String(n).trim()).filter(Boolean):p(t.badges,"").split(",").map(n=>n.trim()).filter(Boolean)}}function _(e,t,n={}){const i=p(t.display,"");i&&(e.style.display=i);const o=p(t.direction,"");o&&(e.style.flexDirection=o==="horizontal"?"row":o==="vertical"?"column":o);const a=p(t.flexWrap,"");a&&(e.style.flexWrap=a);const l=p(t.gridTemplateColumns,"");l&&(e.style.gridTemplateColumns=l);const c=p(t.gridTemplateRows,"");c&&(e.style.gridTemplateRows=c);const f=p(t.gridTemplateAreas,"");f&&(e.style.gridTemplateAreas=f);const s=p(t.gridArea,"");s&&(e.style.gridArea=s);const r=p(t.placeItems,"");r&&(e.style.placeItems=r),$(e,"gap",p(t.gap,"")),$(e,"padding",p(t.padding,"")),$(e,"margin",p(t.margin,"")),$(e,"top",p(t.top,"")),$(e,"right",p(t.right,"")),$(e,"bottom",p(t.bottom,"")),$(e,"left",p(t.left,"")),$(e,"width",p(t.width,"")),$(e,"minWidth",p(t.minWidth,"")),$(e,"maxWidth",p(t.maxWidth,"")),$(e,"height",p(t.height,"")),$(e,"minHeight",p(t.minHeight,"")),$(e,"maxHeight",p(t.maxHeight,""));const d=p(t.alignItems,"");d&&(e.style.alignItems=d);const u=p(t.justifyContent,"");u&&(e.style.justifyContent=u);const g=p(t.alignSelf,"");g&&(e.style.alignSelf=g);const y=p(t.overflow,"");y&&(e.style.overflow=y);const b=p(t.overflowX,"");b&&(e.style.overflowX=b);const x=p(t.overflowY,"");x&&(e.style.overflowY=x);const T=p(t.position,"");T&&(e.style.position=T);const A=p(t.cursor,"");A&&(e.style.cursor=A);const D=p(n.background,"");D&&(e.style.background=be(D));const Q=p(n.color,"");Q&&(e.style.color=be(Q)),$(e,"borderWidth",p(n.borderWidth,""));const j=p(n.borderColor,"");j&&(e.style.borderColor=be(j));const ee=p(n.borderStyle,"");ee&&(e.style.borderStyle=ee),$(e,"borderRadius",p(n.borderRadius,""));const te=p(n.boxShadow,"");te&&(e.style.boxShadow=te);const G=p(n.font,"");G&&(e.style.font=G),$(e,"fontSize",p(n.fontSize,""));const C=p(n.fontWeight,"");C&&(e.style.fontWeight=C);const ne=p(n.textTransform,"");ne&&(e.style.textTransform=ne);const ue=p(n.textAlign,"");ue&&(e.style.textAlign=ue);const _e=p(n.whiteSpace,"");_e&&(e.style.whiteSpace=_e);const qe=p(n.overflow,"");qe&&(e.style.overflow=qe);const We=p(n.textOverflow,"");We&&(e.style.textOverflow=We),$(e,"lineHeight",p(n.lineHeight,""))}function $(e,t,n){n&&(e.style[t]=R(n))}function F(e,t){const n={};for(const[i,o]of Object.entries(e))i.startsWith(t)&&(n[i.slice(t.length)]=o);return n}function dn(e){const t=(e.children||[]).filter(u=>u.kind==="world.entity3d"),n=t.map(u=>gn(w(u.props).position,[0,0,0])),i=n.map(u=>u[0]),o=n.map(u=>u[2]),a=Math.min(...i,-1),l=Math.max(...i,1),c=Math.min(...o,-1),f=Math.max(...o,1),s=Math.max(1,l-a),r=Math.max(1,f-c),d=6;return t.map((u,g)=>{const y=w(u.props);return{entityId:p(y.entityId,u.id),faction:h(y.faction,"neutral"),kind:h(y.entityKind,"entity"),label:p(y.label,y.entityId,u.id,"Entity"),controlled:De(y.controllable),xPercent:d+(n[g][0]-a)/s*(100-d*2),yPercent:d+(1-(n[g][2]-c)/r)*(100-d*2),source:u}})}function un(e,t,n,i,o){const a=m("section","cultui-world-scene");S(a,e),_(a,n,i),a.tabIndex=0,a.setAttribute("aria-label",h(t.label,"Interactive world"));const l=dn(e),c=l.find(r=>r.controlled),f=m("div","cultui-world-heading");f.append(m("strong","",h(t.label,"World"))),f.append(m("span","",`${l.length} entities`)),a.append(f);const s=m("div","cultui-world-plane");for(const r of l){const d=m("button",`cultui-world-entity faction-${Xe(r.faction)} kind-${Xe(r.kind)}`);d.type="button",d.style.left=`${r.xPercent}%`,d.style.top=`${r.yPercent}%`,d.dataset.entityId=r.entityId,d.dataset.controlled=r.controlled?"true":"false",d.title=r.label,d.setAttribute("aria-label",`${r.label}, ${r.kind}, ${r.faction}`),d.append(m("span","cultui-world-entity-glyph",pn(r.kind))),d.append(m("span","cultui-world-entity-label",r.label));const u=w(r.source.props),g=p(u.targetCommand,t.targetCommand,u.focusCommand,t.focusCommand);g&&d.addEventListener("click",()=>Ae(g,{actorEntityId:c?.entityId||p(t.playerEntityId),entityId:r.entityId,targetEntityId:r.entityId,targetEntityKey:r.entityId},r.source,o)),s.append(d)}return a.append(s),a.addEventListener("keydown",r=>{const d=mn(r.key);if(d){r.preventDefault();const g=p(t.movementCommand,w(c?.source.props).moveCommand);g&&Ae(g,{actorEntityId:c?.entityId||p(t.playerEntityId),actorEntityKey:c?.entityId||p(t.playerEntityId),directionX:d[0],directionY:d[1],scalar:1},e,o);return}const u=r.key===" "?p(t.actionCommand,w(c?.source.props).actionCommand):r.key.toLowerCase()==="f"?p(t.focusCommand,w(c?.source.props).focusCommand):"";u&&(r.preventDefault(),Ae(u,{actionId:r.key===" "?"0":"focus",actorEntityId:c?.entityId||p(t.playerEntityId),actorEntityKey:c?.entityId||p(t.playerEntityId)},e,o))}),a}function Ae(e,t,n,i){i.commandSink?.(fn(e,t,i),n)}function fn(e,t,n=O){return de(e,{action:t},n)}function mn(e){switch(e.toLowerCase()){case"w":case"arrowup":return[0,1];case"s":case"arrowdown":return[0,-1];case"a":case"arrowleft":return[-1,0];case"d":case"arrowright":return[1,0];default:return}}function pn(e){return e.includes("station")?"S":e.includes("projectile")?".":e.includes("ship")?"^":"+"}function Xe(e){return e.toLowerCase().replace(/[^a-z0-9_-]+/g,"-")}function H(e,t){const n=Number(e);return Number.isFinite(n)?n:t}function gn(e,t){if(Array.isArray(e)){const n=e.map(i=>Number(i));if(n.length>=3&&n.slice(0,3).every(Number.isFinite))return[n[0],n[1],n[2]]}if(typeof e=="string"){const n=e.split(/[,\s]+/).map(i=>Number(i)).filter(Number.isFinite);if(n.length>=3)return[n[0],n[1],n[2]]}return t}function hn(e,t,n,i){const o=De(t.active),a=m("section","cultui-inventory-drag");S(a,e),_(a,n,i),a.dataset.active=o?"true":"false";const l=m("div","cultui-inventory-section-label","Drag");if(_(l,F(n,"sectionLabel."),F(i,"sectionLabel.")),a.append(l),!o){const d=m("div","cultui-inventory-empty","None");return _(d,F(n,"empty."),F(i,"empty.")),a.append(d),a}const c=p(t.itemKey,t.item,"item"),f=m("div","cultui-inventory-drag-chip",c);_(f,F(n,"dragChip."),F(i,"dragChip.")),a.append(f);const s=[t.originOffsetX,t.originOffsetY].map(d=>Number(d)).map(d=>Number.isFinite(d)?d:0),r=m("div","cultui-inventory-meta",`origin ${s[0]}, ${s[1]}`);return _(r,F(n,"meta."),F(i,"meta.")),a.append(r),a}function yn(e,t,n,i,o){const a=m("section","cultui-inventory-grid");S(a,e),_(a,n,i);const l=U(p(t.columns,t.gridColumns,t.widthCells,""),0),c=l>0?l:6,f=U(t.rows,0),s=f>0?f:Math.max(3,Math.ceil(Math.max((e.children||[]).length,1)/c));a.style.setProperty("--inventory-columns",String(c)),a.style.setProperty("--inventory-rows",String(s)),a.dataset.cellSpriteMode=h(t.cellSpriteMode,"");const r=p(t.title,t.label,"Inventory"),d=m("div","cultui-inventory-section-label",r);_(d,F(n,"sectionLabel."),F(i,"sectionLabel.")),a.append(d);const u=m("div","cultui-inventory-board");u.style.display="grid",u.style.gridTemplateColumns=`repeat(${c}, ${R(p(t.cellSize,"72"))})`,u.style.gridTemplateRows=`repeat(${s}, ${R(p(t.cellSize,"72"))})`,u.style.gap=R(p(t.cellGap,"4")),u.style.overflow=p(t.boardOverflow,"auto"),u.style.padding=R(p(t.boardPadding,"4")),_(u,F(n,"board."),F(i,"board.")),u.addEventListener("dragover",b=>{vn(t)&&(b.preventDefault(),b.dataTransfer&&(b.dataTransfer.dropEffect="move"))}),u.addEventListener("drop",b=>{const x=b.dataTransfer?.getData("application/vnd.gamecult.eve.inventory-item+json")||"";if(!x)return;let T;try{T=JSON.parse(x)}catch{return}const A=u.getBoundingClientRect(),D=Math.max(1,H(t.cellSize,72)),Q=Math.max(0,H(t.cellGap,4)),j=D+Q,ee=Math.max(0,Math.min(c-1,Math.floor((b.clientX-A.left)/j))),te=Math.max(0,Math.min(s-1,Math.floor((b.clientY-A.top)/j))),G=xn(T,t,ee,te,o);G&&(b.preventDefault(),o.commandSink?.(G,e))});const g=new Set;for(const b of e.children||[]){const x=w(b.props),T=U(x.x,0),A=U(x.y,0);g.add(`${T}:${A}`),u.append(P(b,o))}const y=Math.min(c*s,256);for(let b=0;b{!a.draggable||!y.dataTransfer||(y.dataTransfer.effectAllowed="move",y.dataTransfer.setData("application/vnd.gamecult.eve.inventory-item+json",JSON.stringify(t)))});let f=U(t.shapeWidth,1),s=U(t.shapeHeight,1);const r=p(t.rotation,"").toLowerCase();["clockwise","counterclockwise","right","left","rotate90","rotate270"].includes(r)&&([f,s]=[s,f]),a.style.gridColumn=`${l+1} / span ${f}`,a.style.gridRow=`${c+1} / span ${s}`;const d=m("span","cultui-inventory-item-icon");_(d,F(n,"icon."),F(i,"icon.")),d.textContent=Nn(p(t.iconAssetUri,t.iconAssetKey,t.itemKey,t.label,"")),a.append(d);const u=p(t.label,t.itemKey,"");if(u){const y=m("span","cultui-inventory-item-label",u);_(y,F(n,"label."),F(i,"label.")),a.append(y)}const g=Number(t.quantity);if(Number.isFinite(g)&&g>1){const y=m("span","cultui-inventory-item-quantity",String(g));_(y,F(n,"quantity."),F(i,"quantity.")),a.append(y)}return a.title=[u,p(t.source,""),p(t.quality,"")?`quality ${t.quality}`:"",p(t.durability,"")?`durability ${t.durability}`:""].filter(Boolean).join(" | "),a}function vn(e){return Object.entries(e).some(([t,n])=>(t==="dropCommand"||t.startsWith("dropCommand."))&&typeof n=="string"&&n.length>0)}function xn(e,t,n,i,o=O){const a=p(e.sourceKind,e.source,""),l=p(t[`dropCommand.${a}`],t.dropCommand,"");if(!a||!l)return;const c=H(e.sourceIndex,-1),f=H(t.targetIndex,-1),s=p(t.targetKind,""),r={sourceKind:a,originEntityKey:p(e.sourceEntityKey,e.entityKey,""),originIndex:c,originCargoIndex:a==="cargo"?c:-1,itemKey:p(e.itemKey,""),quantity:Math.max(1,H(e.quantity,1)),sourceX:H(e.x,-2147483648),sourceY:H(e.y,-2147483648),destinationKind:s,destinationEntityKey:p(t.targetEntityKey,t.entityKey,""),destinationIndex:f,destinationCargoIndex:s==="cargo"?f:-1,destinationX:Math.trunc(n),destinationY:Math.trunc(i),hasDestinationPosition:!0};return de(l,{action:r},o)}function wn(e,t,n){const i=m("section","cultui-binding-map");S(i,e);const o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.setAttribute("class","cultui-xbox-controller"),o.setAttribute("viewBox","0 0 780 420"),o.setAttribute("role","img"),o.setAttribute("aria-label",h(t.label,"Xbox controller remapping")),o.innerHTML=En(),i.append(o);const a=m("div","cultui-binding-overlay");for(const l of e.children||[]){const c=w(l.props),f=h(c.target,l.id||""),s=m("button","cultui-binding-box");S(s,l),s.type="button",s.dataset.target=f,s.dataset.kind=h(c.bindingKind,"button"),s.style.left=R(c.x??"50%"),s.style.top=R(c.y??"50%"),s.append(m("span","cultui-binding-target",h(c.label,f))),s.append(m("span","cultui-binding-source",h(c.current,"unmapped"))),s.addEventListener("click",()=>{const d=lt(l);if(ct(l)||d?.documentId)dt(Pe(l,n),n);else{const u=h(c.commandId,"");u&&n.commandSink?.(de(u,c,n),l)}}),a.append(s);const r=document.createElementNS("http://www.w3.org/2000/svg","line");r.setAttribute("class","cultui-binding-line"),r.setAttribute("x1",h(c.anchorX,"390")),r.setAttribute("y1",h(c.anchorY,"210")),r.setAttribute("x2",String(He(c.x,780))),r.setAttribute("y2",String(He(c.y,420))),o.append(r)}return i.append(a),i}function ct(e){for(const t of e.embeddedDocuments||[]){const n=w(t.surface);if(n.root)return n}}function lt(e){const t=(e.embeddedDocuments||[])[0],n=w(e.props),i=p(n.documentId,t?.documentId,"");if(i)return{documentId:i,presentationKind:p(n.presentationKind,t?.presentationKind,""),schemaId:p(n.schemaId,t?.schemaId,""),slotId:p(n.slotId,t?.slotId,"")}}async function Pe(e,t){const n=ct(e);if(n)return n;const i=lt(e);if(!i?.documentId||!t.documentResolver)return;const o=await t.documentResolver(i,e);if(o)return w(o.surface).root?o.surface:o}function dt(e,t){const n=m("div","cultui-modal-backdrop"),i=m("section","cultui-modal");i.setAttribute("role","dialog"),i.setAttribute("aria-modal","true");const o=m("header","cultui-modal-header");o.append(m("h2","","Configure Binding"));const a=m("button","cultui-modal-close","Close");a.type="button",a.addEventListener("click",()=>n.remove()),o.append(a);const l=m("div","cultui-modal-body");i.append(o,l),n.append(i),n.addEventListener("click",c=>{c.target===n&&n.remove()}),document.body.append(n),l.append(m("div","detail","materializing document")),Promise.resolve(e).then(c=>{o.querySelector("h2").textContent=c?.title||"Configure Binding",l.replaceChildren(c?.root?P(c.root,t):J("Embedded document unavailable"))}).catch(c=>{l.replaceChildren(J(`Embedded document failed: ${c instanceof Error?c.message:String(c)}`))})}function Sn(e,t,n,i,o){const a=w(e.props),l=(e.children||[])[0],c=w(l?.props),f=p(c.anchor,a.anchor,"trigger"),s=p(c.placement,a.placement,"below-start"),r=Number(p(c.offsetX,a.offsetX,"0"))||0,d=Number(p(c.offsetY,a.offsetY,"4"))||0,u=m("div","cultui-modal-backdrop");u.style.background="transparent",u.style.placeItems="start";const g=m("section","cultui-modal");g.setAttribute("role","dialog"),g.setAttribute("aria-modal","true"),g.style.position="fixed",g.style.width="min(420px, calc(100vw - 24px))",g.style.maxHeight="min(620px, calc(100vh - 24px))";const y=m("header","cultui-modal-header");y.append(m("h2","",p(c.title,a.title,a.label,"Options")));const b=m("button","cultui-modal-close","Close");b.type="button",b.addEventListener("click",()=>u.remove()),y.append(b);const x=m("div","cultui-modal-body");if(l){const A=l.children||[];A.length>0?x.replaceChildren(...A.map(D=>P(D,t))):x.append(P(l,t))}else x.append(J("Popup has no content"));g.append(y,x),u.append(g),u.addEventListener("click",A=>{A.target===u&&u.remove()}),document.body.append(u);const T=_n(f,s,n,g,i,o,r,d);g.style.left=`${T.left}px`,g.style.top=`${T.top}px`}function _n(e,t,n,i,o,a,l,c){const f=n.getBoundingClientRect(),s=i.getBoundingClientRect(),r=s.width||420,d=s.height||320,u=e==="cursor"?{left:o,right:o,top:a,bottom:a}:f;if(t==="right-down"||t==="dropdown")return pe(u,r,d,l,c,"right","down");if(t==="left-down")return pe(u,r,d,l,c,"left","down");if(t==="right-up")return pe(u,r,d,l,c,"right","up");if(t==="left-up")return pe(u,r,d,l,c,"left","up");switch(t){case"above-start":return W(u.left+l,u.top-d-c,r,d);case"above-end":return W(u.right-r+l,u.top-d-c,r,d);case"below-end":return W(u.right-r+l,u.bottom+c,r,d);case"right-start":return W(u.right+l,u.top+c,r,d);case"left-start":return W(u.left-r-l,u.top+c,r,d);case"center":return W((window.innerWidth-r)/2+l,(window.innerHeight-d)/2+c,r,d);default:return W(u.left+l,u.bottom+c,r,d)}}function pe(e,t,n,i,o,a,l){const f=window.innerWidth-e.right-i-12,s=e.left-i-12,r=window.innerHeight-e.top-o-12,d=e.bottom-o-12,u=a==="right"?f>=t||f>=s:!(s>=t||s>=f),g=l==="down"?r>=n||r>=d:!(d>=n||d>=r),y=u?e.right+i:e.left-t-i,b=g?e.top+o:e.bottom-n-o;return W(y,b,t,n)}function W(e,t,n,i){return{left:Ye(e,12,window.innerWidth-n-12),top:Ye(t,12,window.innerHeight-i-12)}}function Ye(e,t,n){return nMt(l,t,f,a.resolveAssetUrl),r=()=>{!l.isConnected||s||(s=!0,requestAnimationFrame(()=>{s=!1,l.isConnected&&c()}))};l.addEventListener("cultui:asset-loaded",r);let d=0,u;const g=()=>{d&&window.clearInterval(d),u?.disconnect(),l.removeEventListener("cultui:asset-loaded",r)},y=()=>{if(!l.isConnected){g();return}$t(e,t,o,a.providerId,f).then(w=>{w&&l.isConnected&&r()}).catch(w=>{f.lastError=w instanceof Error?w.message:String(w)})};typeof ResizeObserver<"u"&&(u=new ResizeObserver(r),u.observe(l)),r();const b=Math.max(33,Math.min(1e3,rn(t.stateRefreshMs,100)));return d=window.setInterval(y,b),queueMicrotask(y),window.setTimeout(r,300),window.setTimeout(r,1e3),l}async function $t(e,t,n,i,o){if(o.loading)return!1;const a=[Ee(e,t,"renderSplats","renderSplatsDocumentId","renderSplatsSchemaId"),Ee(e,t,"gravity","gravityDocumentId","gravitySchemaId"),Ee(e,t,"objects","objectsDocumentId","objectsSchemaId")].filter(l=>!!l?.documentId);if(a.length===0)return!1;o.loading=!0;try{let l=!1;for(const s of a){const f=await n.documentResolver?.(s,e);let c=we(ke(f?.schemaId||s.schemaId,f?.document));if(Object.keys(c).length===0&&(c=we(ke(s.schemaId,await Lt(s,i||n.provider?.providerId)))),Object.keys(c).length===0)continue;const r=s.slotId==="renderSplats"?"renderSplats":s.slotId==="gravity"?"gravity":"objects",d=Fe(o[r]?.frameId,-1),u=Fe(c.frameId,d);o[r]=c,l||=u!==d}return o.lastLoadedAt=Date.now(),l}finally{o.loading=!1}}async function Lt(e,t){if(typeof fetch!="function"||typeof window>"u"||!t)return;const n=new URLSearchParams({documentId:e.documentId});e.schemaId&&n.set("schemaId",e.schemaId),e.slotId&&n.set("slotId",e.slotId);const i=await fetch(`/eir/document/${encodeURIComponent(t)}?${n.toString()}`,{cache:"no-store",headers:{Accept:"application/json"}});if(i.ok)return we(await i.json()).document}function Ee(e,t,n,i,o){const a=(e.embeddedDocuments||[]).find(s=>String(s?.slotId||"")===n),l=k(t[i],a?.documentId);if(l)return{documentId:l,schemaId:k(t[o],a?.schemaId),presentationKind:k(a?.presentationKind)||"data",slotId:n}}function ke(e,t){const n=Array.isArray(t)?t:void 0,i=n?n[0]:t?.schema,o=String(e||i||"");return!n||!et.has(o)?t:o==="gamecult.fields.splats.v1"?Xt(n):o==="gamecult.fields.gravity.v1"?Yt(n):Ht(n)}function Mt(e,t,n,i){const o=e.getBoundingClientRect(),a=Math.max(1,Math.floor(o.width||e.clientWidth||1)),l=Math.max(1,Math.floor(o.height||e.clientHeight||1)),s=Math.max(1,Math.min(2,window.devicePixelRatio||1)),f=Math.max(1,Math.floor(a*s)),c=Math.max(1,Math.floor(l*s));(e.width!==f||e.height!==c)&&(e.width=f,e.height=c);const r=e.getContext("2d");if(!r)return;r.setTransform(s,0,0,s,0,0),r.clearRect(0,0,a,l);const d=Kt(Gt(t),a,l),u=it(n?.gravity),g=Ot(n?.gravity)||Wt(k(t.bodies,"")),y=zt(n?.objects)||jt(k(t.objects,""));yt(r,t,u,g,d,a,l,n?.renderSplats)||Nt(r,t,a,l,"field.surface2d requires WebGL2 float render targets"),Dt(r,g,t,d,a,l,i),Ut(r,y,t,d,a,l,i)}function Nt(e,t,n,i,o){e.save(),e.fillStyle=k(t.failureBackground,"rgba(0, 0, 0, 0.72)"),e.fillRect(0,0,n,i),e.font=k(t.failureFont,"700 13px Cascadia Mono, Consolas, monospace"),e.fillStyle=k(t.failureColor,"rgba(255, 184, 79, 0.95)"),e.fillText(o,16,28),e.restore()}function Dt(e,t,n,i,o,a,l){for(const s of t){const f=nt(i,s.x,s.y,o,a),c=Math.max(18,Math.min(190,s.radius/Math.max(1,i.maxX-i.minX)*o*.32)),r=l(s.icon),d=s.kind.toLowerCase().includes("sun")?Math.max(E(n.sunIconMinPx,34),c*E(n.sunIconScale,.72)):Math.max(E(n.bodyIconMinPx,24),c*E(n.bodyIconScale,.48)),u=s.iconSize>0?s.iconSize:d;r&&Bt(e,r,f.x,f.y,u,.92),s.key&&tt(e,n,s.key.replace(/^local\./,""),f.x+c*.44,f.y-c*.48,k(n.bodyLabelColor,"rgba(226, 244, 255, 0.82)"))}}const ve=new Map;function Bt(e,t,n,i,o,a){let l=ve.get(t);l||(l=new Image,l.decoding="async",l.onload=()=>requestAnimationFrame(()=>{e.canvas.dispatchEvent(new CustomEvent("cultui:asset-loaded"))}),l.src=t,ve.set(t,l)),!(!l.complete||l.naturalWidth===0)&&(e.save(),e.globalAlpha=a,e.drawImage(l,n-o/2,i-o/2,o,o),e.restore())}function Ut(e,t,n,i,o,a,l){for(const s of t){const f=nt(i,s.x,s.y,o,a);if(f.x<-40||f.x>o+40||f.y<-40||f.y>a+40)continue;const c=s.kind.toLowerCase().includes("station")?E(n.stationIconSizePx,34):s.controlled?E(n.shipIconSizePx,22):E(n.remoteShipIconSizePx,18),r=qt(n,s.faction,s.controlled,s.visibility),d=l(s.icon);e.save(),e.globalAlpha=Math.max(.25,Math.min(1,s.visibility)),e.translate(f.x,f.y);const u=Math.atan2(s.directionY,s.directionX)+Math.PI/2;if(s.kind.toLowerCase().includes("ship")&&e.rotate(u),d){const g=ve.get(d);if(g)g.complete&&g.naturalWidth>0&&e.drawImage(g,-c/2,-c/2,c,c);else{const y=new Image;y.decoding="async",y.onload=()=>e.canvas.dispatchEvent(new CustomEvent("cultui:asset-loaded")),y.src=d,ve.set(d,y)}}e.restore(),tt(e,n,s.label,f.x+c*.55,f.y-c*.45,r)}}function tt(e,t,n,i,o,a){n&&(e.save(),e.font=k(t.objectLabelFont,"700 12px Ubuntu, system-ui, sans-serif"),e.textBaseline="middle",e.lineWidth=E(t.objectLabelStrokeWidth,3),e.strokeStyle=k(t.objectLabelStroke,"rgba(0, 0, 0, 0.72)"),e.fillStyle=a,e.strokeText(n,i,o),e.fillText(n,i,o),e.restore())}function qt(e,t,n,i){const o=Math.max(.25,Math.min(1,i));if(n)return fe(k(e.objectControlledColor,"rgba(122, 240, 255, {alpha})"),o);const a=t.toLowerCase();return a.includes("raider")?fe(k(e.objectRaiderColor,"rgba(255, 143, 74, {alpha})"),o):a.includes("neutral")?fe(k(e.objectNeutralColor,"rgba(232, 232, 224, {alpha})"),o):fe(k(e.objectDefaultColor,"rgba(214, 244, 255, {alpha})"),o)}function fe(e,t){return e.replaceAll("{alpha}",String(t))}function Wt(e){return e.split(";").map(t=>t.trim()).filter(Boolean).map(t=>{const n=t.split("|");return{key:n[0]??"",kind:n[1]??"",x:Number(n[2])||0,y:Number(n[3])||0,radius:Math.max(1,Number(n[4])||1),depth:Number(n[5])||0,exponent:Number(n[6])||1,waveRadius:Number(n[7])||0,waveDepth:Number(n[8])||0,waveSpeed:Number(n[9])||0,icon:n[10]??"",iconSize:Number(n[12])||0,tint:n[11]??""}})}function jt(e){return e.split(";").map(t=>t.trim()).filter(Boolean).map(t=>{const n=t.split("|");return{key:n[0]??"",kind:n[1]??"",label:n[2]??"",x:Number(n[3])||0,y:Number(n[4])||0,directionX:Number(n[5])||0,directionY:Number(n[6])||1,faction:n[7]??"",controlled:n[8]==="1"||n[8]==="true",visibility:Number(n[9])||1,icon:n[10]??""}})}function Ot(e){const t=Array.isArray(e?.gravityInfluences)?e.gravityInfluences:[],n=Array.isArray(e?.bodies)?e.bodies:[];if(t.length===0&&n.length===0)return;const i=new Map;for(const o of n){const a=k(o.bodyKey,o.name,"");a&&i.set(a,o)}return(t.length>0?t:n).map(o=>{const a=k(o.bodyKey,o.name,"body"),l=i.get(a),s=k(o.kind,"Body");return{key:a,kind:s,x:E(o.x,0),y:E(o.y,0),radius:Math.max(1,E(o.radius,80)),depth:E(o.gravityDepth,0),exponent:E(o.gravityDepthExponent,1),waveRadius:E(o.waveRadius,0),waveDepth:E(o.waveDepth,0),waveSpeed:E(o.waveSpeed,0),icon:Re(o.iconAsset)||Re(l?.iconAsset),iconSize:E(l?.iconSize,E(o.iconSize,0)),tint:""}})}function zt(e){const t=Array.isArray(e?.objects)?e.objects:[];if(t.length!==0)return t.map(n=>{const i=k(n.kind,"object");return{key:k(n.entityKey,String(n.entityIndex??""),"object"),kind:i,label:k(n.displayName,n.entityKey,"object"),x:E(n.x,0),y:E(n.y,0),directionX:E(n.directionX,1),directionY:E(n.directionY,0),faction:k(n.factionKey,""),controlled:on(n.controlled),visibility:E(n.visibility,1),icon:Re(n.iconAsset)}})}function Re(e){const t=it(e);return k(t.uri,"")}function Gt(e){const t=Math.max(1,E(e.viewRadius,Math.max(1200,E(e.terrainRadius,1200))));return{minX:E(e.minX,-t),minY:E(e.minY,-t),maxX:E(e.maxX,t),maxY:E(e.maxY,t)}}function Kt(e,t,n){const i=Math.max(1e-4,e.maxX-e.minX),o=Math.max(1e-4,e.maxY-e.minY),a=Math.max(1e-4,t/Math.max(1,n)),l=i/o,s=(e.minX+e.maxX)*.5,f=(e.minY+e.maxY)*.5;if(a>l){const r=o*a;return{minX:s-r*.5,maxX:s+r*.5,minY:e.minY,maxY:e.maxY}}const c=i/a;return{minX:e.minX,maxX:e.maxX,minY:f-c*.5,maxY:f+c*.5}}function nt(e,t,n,i,o){return{x:(t-e.minX)/Math.max(1,e.maxX-e.minX)*i,y:(n-e.minY)/Math.max(1,e.maxY-e.minY)*o}}function Xt(e){const t=M(e[9]);return{schema:e[0],frameId:e[1],publishedAtUtc:e[2],simulationTimeSeconds:e[3],runId:e[4],zoneIndex:e[5],zoneName:e[6],viewport:Le(e[7]),layers:M(e[8]).map(Vt),splats:{count:t[0]??0,centerX:t[1]||[],centerY:t[2]||[],halfExtentX:t[3]||[],halfExtentY:t[4]||[],rotationCos:t[5]||[],rotationSin:t[6]||[],channel:t[7]||[],falloff:t[8]||[],valueR:t[9]||[],valueG:t[10]||[],valueB:t[11]||[],valueA:t[12]||[],sourceKey:t[13]||[],layerIndex:t[14]||[],sourceKind:t[15]||[],frequencyX:t[16]||[],frequencyY:t[17]||[],phaseX:t[18]||[],phaseY:t[19]||[],animationSpeed:t[20]||[],sourceFlags:t[21]||[]}}}function Yt(e){return{schema:e[0],frameId:e[1],publishedAtUtc:e[2],simulationTimeSeconds:e[3],runId:e[4],zoneIndex:e[5],zoneName:e[6],viewport:Le(e[7]),gravityInfluences:M(e[8]).map(Jt),bodies:M(e[9]).map(Zt),terrainRadius:e[10],terrainDepth:e[11],terrainDepthExponent:e[12],terrainWaveFrequency:e[13]}}function Ht(e){return{schema:e[0],frameId:e[1],publishedAtUtc:e[2],simulationTimeSeconds:e[3],runId:e[4],zoneIndex:e[5],zoneName:e[6],currentEntityKey:e[7],viewport:Le(e[8]),controlledEntityIndices:M(e[9]),objects:M(e[10]).map(Qt)}}function Le(e){const t=M(e);return t.length?{minX:t[0],minY:t[1],maxX:t[2],maxY:t[3]}:e}function Vt(e){const t=M(e);return t.length?{layerKey:t[0],displayName:t[1],channel:t[2],blendMode:t[3],graphicsFormat:t[4],clearBeforeDraw:t[5],clearR:t[6],clearG:t[7],clearB:t[8],clearA:t[9]}:e}function Jt(e){const t=M(e);return t.length?{bodyKey:t[0],orbitKey:t[1],kind:t[2],x:t[3],y:t[4],radius:t[5],gravityDepth:t[6],gravityDepthExponent:t[7],waveRadius:t[8],waveDepth:t[9],waveSpeed:t[10]}:e}function Zt(e){const t=M(e);return t.length?{bodyKey:t[0],orbitKey:t[1],name:t[2],kind:t[3],x:t[4],y:t[5],radius:t[6],isAsteroidBelt:t[7],body:t[8],iconAsset:Me(t[9])}:e}function Qt(e){const t=M(e);return t.length?{entityIndex:t[0],entityKey:t[1],displayName:t[2],kind:t[3],factionKey:t[4],x:t[5],y:t[6],z:t[7],directionX:t[8],directionY:t[9],velocityX:t[10],velocityY:t[11],controlled:t[12],targetEntityIndex:t[13],isActive:t[14],visibility:t[15],status:en(t[16]),inventory:M(t[17]).map(tn),iconAsset:Me(t[18])}:e}function en(e){const t=M(e);return t.length?{hull:t[0],shield:t[1],heat:t[2]}:e||{}}function tn(e){const t=M(e);return t.length?{source:t[0],itemKey:t[1],quantity:t[2],quality:t[3],durability:t[4],enabled:t[5],sourceIndex:t[6],x:t[7],y:t[8],iconAsset:Me(t[9])}:e}function Me(e){const t=M(e);return t.length?{assetKey:t[0],kind:t[1],uri:t[2],transport:t[3],contentHash:t[4],mimeType:t[5],metadata:t[6]||{}}:e||{}}function M(e){return Array.isArray(e)?e:[]}function we(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function k(...e){for(const t of e)if(typeof t=="string"&&t.trim())return t.trim();return""}function nn(e,t){return typeof e=="string"&&e?e:t}function rn(e,t){const n=Number(e);return Number.isFinite(n)&&n>0?Math.floor(n):t}function Fe(e,t){const n=Number(e);return Number.isFinite(n)?n:t}const it=we,E=Fe;function on(e){return typeof e=="boolean"?e:typeof e=="number"?e!==0:typeof e=="string"&&["1","true","yes","on"].includes(e.trim().toLowerCase())}const an=[Ft],sn={"--bg":"#020909","--bg-top":"#020909","--bg-mid":"#020909","--bg-bottom":"#020909","--shell-top":"#010707","--shell-bottom":"#010707","--panel":"#071918","--panel-2":"#0a2423","--line":"rgba(103, 240, 228, 0.28)","--line-deep":"rgba(103, 240, 228, 0.18)","--text":"#e7f1f1","--text-bright":"#e7f1f1","--quiet":"#8ba5a3","--accent":"#ffb84f","--accent-strong":"#ffb84f","--corner-accent":"#ffb84f","--cyan":"#8efcff","--shadow":"rgba(0, 0, 0, 0.35)","--pixel-grid":"rgba(142, 252, 255, 0.04)","--border-width":"1px","--border-bottom-width":"1px","--corner-accent-size":"0","--font-body":'"M PLUS 1", "Ubuntu Sans", Ubuntu, "Noto Sans JP", system-ui, sans-serif',"--font-title":'"Montserrat", "Zen Kaku Gothic New", "M PLUS 1", "Ubuntu Sans", system-ui, sans-serif',"--font-mono":'"Ubuntu Sans Mono", "M PLUS 1 Code", "Cascadia Mono", Consolas, monospace'};let me,rt=Ne(void 0),le,z={};const Ke=new WeakMap;function ot(e,t,n={}){if(Ke.get(t)?.dispose(),le=e,z=n,rt=Ne(e.surface?.styles),globalThis.__eveCurrentMesh=e.mesh,An(e.surface?.styles,n.body??document.body),n.body&&(n.body.dataset.provider=e.providerId||n.provider?.providerId||""),n.statusElement&&(n.statusElement.textContent=`${e.title||e.surface?.title||"surface"}${n.source?` (${n.source})`:""}`),e.surface?.root){if(t.replaceChildren(P(e.surface.root,n)),n.stateBindingResolver){const i=new ln(e,t,n);Ke.set(t,i),i.start()}}else t.replaceChildren(J("No surface root"));return t}function cn(e,t,n){const i=t.targetProp.split(".").filter(Boolean);if(i.length===0)throw new Error("Eve state binding targetProp must not be empty.");e.props||={};let o=e.props;for(const a of i.slice(0,-1)){const l=o[a];(!l||typeof l!="object"||Array.isArray(l))&&(o[a]={}),o=o[a]}o[i[i.length-1]]=n}class ln{surface;host;options;disposed=!1;unsubscribers=[];constructor(t,n,i){this.surface=t,this.host=n,this.options=i}async start(){const t=this.options.stateBindingResolver,n=this.surface.surface?.root;if(!(!t||!n))for(const i of at(n))for(const o of i.stateBindings||[]){if(this.disposed)return;const a=await t(o,i);if(!a||this.disposed)continue;const l=s=>{this.disposed||(cn(i,o,s),this.renderCanonicalProjection())};if(l(await a.latest()),this.disposed)return;this.unsubscribers.push(a.watch(l))}}dispose(){this.disposed=!0;for(const t of this.unsubscribers.splice(0))t()}renderCanonicalProjection(){const t=this.surface.surface?.root;t&&this.host.replaceChildren(P(t,this.options))}}function*at(e){yield e;for(const t of e.children||[])yield*at(t)}function P(e,t=z){const n=e.kind||"panel",i=x(e.props),o=x(e.layout),a=x(e.style),l=e.children||[],s=e.embeddedDocuments||[];if(n==="surface"||n==="cockpit"||n==="dashboard"){const r=m("section","cultui-surface-root eve-surface");S(r,e),typeof o.direction=="string"?r.dataset.direction=o.direction:typeof i.layout=="object"&&i.layout&&typeof i.layout.direction=="string"&&(r.dataset.direction=String(i.layout.direction)),n!=="surface"&&(r.dataset.surfaceKind=n),_(r,o,a);for(const d of l)r.append(P(d,t));return r}if(n==="column"||n==="row"||n==="form"||n==="rail"){const r=m("div",`cultui-partition eve-${n}`);S(r,e),r.dataset.direction=n==="row"||n==="rail"?"horizontal":"vertical",n==="rail"&&(r.dataset.overflow="x"),ge(r,{...o,...i}),_(r,o,a);for(const d of l)r.append(P(d,t));return r}if(n==="grid"){const r=m("section","cultui-grid"),d=U(i.columns,0);d>0?r.style.gridTemplateColumns=`repeat(${d}, minmax(0, 1fr))`:typeof i.columns=="string"&&(r.style.gridTemplateColumns=i.columns);const u=U(i.rows,0);u>0&&(r.style.gridTemplateRows=`repeat(${u}, minmax(0, auto))`),_(r,o,a);for(const g of l)r.append(P(g,t));return r}if(n==="partition"){const r=m("section",`cultui-partition split-${h(i.split,"none")}`);S(r,e),ge(r,i),_(r,o,a),r.style.minWidth="0",h(i.split,"none")==="x"&&!p(i.flexWrap,o.flexWrap,"")&&(r.style.flexWrap="wrap"),typeof i.role=="string"&&(r.dataset.role=i.role);for(const d of l)r.append(P(d,t));return r}if(n==="input.binding-map")return xn(e,i,t);if(n==="inventory.drag_session")return hn(e,i,o,a);if(n==="inventory.grid")return yn(e,i,o,a,t);if(n==="inventory.item")return bn(e,i,o,a);const f=(t.pluginAdapters||an).find(r=>r.componentKinds.includes(n));if(f?.renderComponent)return f.renderComponent(e,i,o,a,t,{applyGeneratedLayout:_,providerId:le?.providerId||t.provider?.providerId,resolveAssetUrl:ae});if(n==="world.scene3d"||n==="world.scene2d")return un(e,i,o,a,t);if(n==="image.background"){const r=m("div","cultui-background"),d=ae(p(i.src,i.assetUri,i.assetRef,""));return d&&(r.style.backgroundImage=`url("${d}")`),r.setAttribute("aria-label",h(i.label,"background")),r}if(n==="image.sprite"){const r=m("figure",`cultui-sprite ${h(i.slot,"center")}`);S(r,e);const d=ae(p(i.src,i.assetUri,i.assetRef,""));if(d){const u=m("img");u.src=d,u.alt=h(i.alt,h(i.actor,h(i.label,""))),r.append(u)}return r}if(n==="avatar"){const r=m("figure","cultui-avatar-card");S(r,e);const d=ae(p(i.src,i.assetUri,i.assetRef,""));if(d){const b=m("img");b.src=d,b.alt=h(i.alt,h(i.text,h(i.label,""))),r.append(b)}else r.append(m("div","cultui-avatar-fallback",Dn(p(i.text,i.label,i.actor,"?"))));const u=p(i.text,i.label,i.actor,"");u&&r.append(m("figcaption","cultui-avatar-name",u));const g=p(i.status,"");g&&r.append(m("div","cultui-avatar-status",g));const y=p(i.detail,"");return y&&r.append(m("div","cultui-avatar-detail",y)),r}if(n==="pane"||n==="panel"){const r=m("section","pane cultui-pane");S(r,e);const d=h(i.span,"");d&&(r.dataset.span=d);const u=h(i.density,"");u&&(r.dataset.density=u);const g=h(i.title,e.text||"");g&&r.append(m("h2","",g));for(const y of l)r.append(P(y,t));return r}if(n==="list"||n.endsWith(".roster")){const r=m("section","cultui-list");S(r,e),r.dataset.componentKind=n;const d=h(i.title,"");d&&r.append(m("h3","cultui-list-title",d));for(const[u,g]of Mn(i.items).entries())r.append(P({id:`${e.id||"list"}-item-${u}`,kind:"list.item",props:{...g}},t));for(const u of l)r.append(P(u,t));return r}if(n==="list.item"||n.endsWith(".item")){const r=st(e),d=m("article","cultui-list-item");S(d,e),d.dataset.componentKind=n;const u=m("div","cultui-list-item-heading");if(u.append(m("strong","cultui-list-item-label",r.label)),r.status&&u.append(m("span","cultui-list-item-status",r.status)),d.append(u),r.detail&&d.append(m("div","cultui-list-item-detail",r.detail)),r.badges.length){const g=m("div","cultui-list-item-badges");for(const y of r.badges)g.append(m("span","cultui-list-item-badge",y));d.append(g)}for(const g of l)d.append(P(g,t));return d}if(n==="bar"){const r=m("div","cultui-meter");S(r,e);const d=h(i.label,""),u=h(i.value,"");if(d||u){const b=m("div","cultui-meter-head");b.append(m("span","",d)),b.append(m("strong","",u)),r.append(b)}const g=m("div","cultui-meter-track"),y=m("span","cultui-meter-fill");return y.style.width=`${Ze(i.percent)}%`,g.append(y),r.append(g),r}if(n==="card"){const r=Ve(i,e),d=r?m("button","card cultui-card cultui-card-button"):m("article","card cultui-card");S(d,e),_(d,o,a),d instanceof HTMLButtonElement&&(d.type="button");const u=h(i.title,e.text||"");u&&d.append(m("div","card-title",u));for(const g of l)d.append(P(g,t));return r&&Je(d,e,r,i,t),d}if(n==="control.button"){const r=m("button","cultui-button eve-control-button",h(i.label,"Action"));return S(r,e),r.type="button",_(r,o,a),Je(r,e,Ve(i,e),i,t),r}if(n==="control.popup"){const r=m("button","cultui-button eve-control-popup",h(i.label,"Open"));return S(r,e),r.type="button",_(r,o,a),r.addEventListener("click",d=>{Sn(e,t,r,d.clientX,d.clientY)}),r}if(n==="text.dialogue"||n==="text"||n==="text.title"||n==="text.subtitle"||n==="label"){const r=m("div",Rn(n,i),h(i.value,h(i.text,e.text||"")));return S(r,e),ge(r,i),_(r,o,a),r}if(n==="metric"){const r=m("dl","metric cultui-reactive-metric eve-metric");return S(r,e),_(r,o,a),r.append(m("dt","",h(i.label,"Metric"))),r.append(m("dd","metric-value",h(i.value,""))),r}if(n==="progress"){const r=m("div","cultui-meter eve-progress");S(r,e),_(r,o,a);const d=h(i.label,""),u=h(i.value,""),g=Number(i.min??0),y=Number(i.max??1),b=Number(i.value??0),w=Number.isFinite(b)&&Number.isFinite(g)&&Number.isFinite(y)&&y!==g?(b-g)/(y-g)*100:Ze(i.percent);if(d||u){const D=m("div","cultui-meter-head");D.append(m("span","",d)),D.append(m("strong","",u)),r.append(D)}const T=m("div","cultui-meter-track"),A=m("span","cultui-meter-fill");return A.style.width=`${Math.max(0,Math.min(100,w))}%`,T.append(A),r.append(T),r}if(n==="modal"){const r=m("section","cultui-modal-surface");S(r,e),_(r,o,a);const d=h(i.title,"");d&&r.append(m("h2","cultui-modal-surface-title",d));for(const u of l)r.append(P(u,t));return r}if(n==="options"){const r=m("section","cultui-options");S(r,e),_(r,o,a);const d=h(i.label,"");d&&r.append(m("h3","cultui-list-title",d));for(const u of l)r.append(P(u,t));return l.length===0&&r.append(J("waiting for options")),r}if(n==="image.preview"){const r=m("figure","cultui-image-preview");S(r,e);const d=m("div","cultui-image-frame"),u=ae(p(i.src,i.assetUri,i.assetRef,""));if(u){const g=m("img");g.src=u,g.alt=h(i.label,""),g.style.imageRendering=h(i.imageRendering,"auto"),i.zoom!==void 0&&(g.style.transform=`scale(${i.zoom})`,g.style.transformOrigin=h(i.crop,"50% 50%")),d.append(g)}else d.append(m("span","",h(i.label,"image")));return r.append(d),i.label&&r.append(m("figcaption","",String(i.label))),r}if(n==="canvas.preview"||n==="canvas.editor"){const r=m("div",`cultui-canvas-placeholder ${n==="canvas.editor"?"editor":"preview"}`);return S(r,e),r.append(m("div","viz-label",h(i.label,"Canvas"))),r.append(m("div","cultui-canvas-grid",i.state==="empty"?"waiting for pixels":h(i.state,""))),r}if(n==="surface.slot"){const r=m("section","cultui-embedded-slot");S(r,e),_(r,o,a),r.dataset.slotId=h(i.slotId,h(s[0]?.slotId,"")),r.dataset.documentId=h(i.documentId,h(s[0]?.documentId,"")),r.dataset.schemaId=h(i.schemaId,h(s[0]?.schemaId,"")),r.dataset.presentationKind=h(i.presentationKind,h(s[0]?.presentationKind,""));const d=s.map(g=>x(g.surface)).find(g=>x(g.root).kind||g.root),u=i.modal===!0||r.dataset.presentationKind.includes("modal");if((d||r.dataset.documentId)&&u){const g=m("button","cultui-button cultui-modal-trigger",h(i.label,r.dataset.slotId||"Configure"));g.type="button",g.addEventListener("click",()=>dt(Pe(e,t),t)),r.append(g)}else if(d||r.dataset.documentId){const g=m("div","cultui-embedded-slot-body");g.append(m("div","detail","materializing surface")),r.append(g),Pe(e,t).then(y=>{g.replaceChildren(y?.root?P(y.root,t):J("Embedded surface unavailable"))}).catch(y=>{g.replaceChildren(J(`Embedded surface failed: ${y instanceof Error?y.message:String(y)}`))})}else r.append(m("div","detail",r.dataset.presentationKind||r.dataset.slotId||"embedded surface"));return r}if(n==="control.slider")return Cn(i,l,t);if(n==="control.toggle"){const r=m("label","toggle-row cultui-toggle");return S(r,e),r.append(m("span","field-control",i.value?"on":"off")),r.append(m("span","toggle-copy",h(i.label,"Toggle"))),r}if(n==="input.number"||n==="input.select"||n==="control.range"||n==="control.input.text"||n==="control.select"){const r=m("label","field cultui-field");return S(r,e),ge(r,i),_(r,o,a),r.append(m("span","field-label",h(i.label,""))),r.append(m("span","field-control cultui-field-value",i.value===void 0?"":String(i.value))),r}if(n==="color.swatch"){const r=m("div","paint-swatch cultui-swatch");return S(r,e),r.style.background=h(i.value,h(i.color,"currentColor")),r.title=h(i.label,"Color"),r}const c=m("section","pane");S(c,e),c.append(m("h2","",n));for(const r of l)c.append(P(r,t));return c}function st(e){const t=x(e.props);return{label:p(t.label,t.title,t.displayName,e.text,e.kind,"item"),status:p(t.status,t.state,""),detail:p(t.detail,t.phase,t.repoName,""),badges:Array.isArray(t.badges)?t.badges.map(n=>String(n).trim()).filter(Boolean):p(t.badges,"").split(",").map(n=>n.trim()).filter(Boolean)}}function _(e,t,n={}){const i=p(t.display,"");i&&(e.style.display=i);const o=p(t.direction,"");o&&(e.style.flexDirection=o==="horizontal"?"row":o==="vertical"?"column":o);const a=p(t.flexWrap,"");a&&(e.style.flexWrap=a);const l=p(t.gridTemplateColumns,"");l&&(e.style.gridTemplateColumns=l);const s=p(t.gridTemplateRows,"");s&&(e.style.gridTemplateRows=s);const f=p(t.gridTemplateAreas,"");f&&(e.style.gridTemplateAreas=f);const c=p(t.gridArea,"");c&&(e.style.gridArea=c);const r=p(t.placeItems,"");r&&(e.style.placeItems=r),L(e,"gap",p(t.gap,"")),L(e,"padding",p(t.padding,"")),L(e,"margin",p(t.margin,"")),L(e,"top",p(t.top,"")),L(e,"right",p(t.right,"")),L(e,"bottom",p(t.bottom,"")),L(e,"left",p(t.left,"")),L(e,"width",p(t.width,"")),L(e,"minWidth",p(t.minWidth,"")),L(e,"maxWidth",p(t.maxWidth,"")),L(e,"height",p(t.height,"")),L(e,"minHeight",p(t.minHeight,"")),L(e,"maxHeight",p(t.maxHeight,""));const d=p(t.alignItems,"");d&&(e.style.alignItems=d);const u=p(t.justifyContent,"");u&&(e.style.justifyContent=u);const g=p(t.alignSelf,"");g&&(e.style.alignSelf=g);const y=p(t.overflow,"");y&&(e.style.overflow=y);const b=p(t.overflowX,"");b&&(e.style.overflowX=b);const w=p(t.overflowY,"");w&&(e.style.overflowY=w);const T=p(t.position,"");T&&(e.style.position=T);const A=p(t.cursor,"");A&&(e.style.cursor=A);const D=p(n.background,"");D&&(e.style.background=be(D));const Q=p(n.color,"");Q&&(e.style.color=be(Q)),L(e,"borderWidth",p(n.borderWidth,""));const G=p(n.borderColor,"");G&&(e.style.borderColor=be(G));const ee=p(n.borderStyle,"");ee&&(e.style.borderStyle=ee),L(e,"borderRadius",p(n.borderRadius,""));const te=p(n.boxShadow,"");te&&(e.style.boxShadow=te);const K=p(n.font,"");K&&(e.style.font=K),L(e,"fontSize",p(n.fontSize,""));const C=p(n.fontWeight,"");C&&(e.style.fontWeight=C);const ne=p(n.textTransform,"");ne&&(e.style.textTransform=ne);const ue=p(n.textAlign,"");ue&&(e.style.textAlign=ue);const _e=p(n.whiteSpace,"");_e&&(e.style.whiteSpace=_e);const qe=p(n.overflow,"");qe&&(e.style.overflow=qe);const We=p(n.textOverflow,"");We&&(e.style.textOverflow=We),L(e,"lineHeight",p(n.lineHeight,""))}function L(e,t,n){n&&(e.style[t]=R(n))}function F(e,t){const n={};for(const[i,o]of Object.entries(e))i.startsWith(t)&&(n[i.slice(t.length)]=o);return n}function dn(e){const t=(e.children||[]).filter(u=>u.kind==="world.entity3d"),n=t.map(u=>gn(x(u.props).position,[0,0,0])),i=n.map(u=>u[0]),o=n.map(u=>u[2]),a=Math.min(...i,-1),l=Math.max(...i,1),s=Math.min(...o,-1),f=Math.max(...o,1),c=Math.max(1,l-a),r=Math.max(1,f-s),d=6;return t.map((u,g)=>{const y=x(u.props);return{entityId:p(y.entityId,u.id),faction:h(y.faction,"neutral"),kind:h(y.entityKind,"entity"),label:p(y.label,y.entityId,u.id,"Entity"),controlled:De(y.controllable),xPercent:d+(n[g][0]-a)/c*(100-d*2),yPercent:d+(1-(n[g][2]-s)/r)*(100-d*2),source:u}})}function un(e,t,n,i,o){const a=m("section","cultui-world-scene");S(a,e),_(a,n,i),a.tabIndex=0,a.setAttribute("aria-label",h(t.label,"Interactive world"));const l=dn(e),s=l.find(r=>r.controlled),f=m("div","cultui-world-heading");f.append(m("strong","",h(t.label,"World"))),f.append(m("span","",`${l.length} entities`)),a.append(f);const c=m("div","cultui-world-plane");for(const r of l){const d=m("button",`cultui-world-entity faction-${Xe(r.faction)} kind-${Xe(r.kind)}`);d.type="button",d.style.left=`${r.xPercent}%`,d.style.top=`${r.yPercent}%`,d.dataset.entityId=r.entityId,d.dataset.controlled=r.controlled?"true":"false",d.title=r.label,d.setAttribute("aria-label",`${r.label}, ${r.kind}, ${r.faction}`),d.append(m("span","cultui-world-entity-glyph",pn(r.kind))),d.append(m("span","cultui-world-entity-label",r.label));const u=x(r.source.props),g=p(u.targetCommand,t.targetCommand,u.focusCommand,t.focusCommand);g&&d.addEventListener("click",()=>Ae(g,{actorEntityId:s?.entityId||p(t.playerEntityId),entityId:r.entityId,targetEntityId:r.entityId,targetEntityKey:r.entityId},r.source,o)),c.append(d)}return a.append(c),a.addEventListener("keydown",r=>{const d=mn(r.key);if(d){r.preventDefault();const g=p(t.movementCommand,x(s?.source.props).moveCommand);g&&Ae(g,{actorEntityId:s?.entityId||p(t.playerEntityId),actorEntityKey:s?.entityId||p(t.playerEntityId),directionX:d[0],directionY:d[1],scalar:1},e,o);return}const u=r.key===" "?p(t.actionCommand,x(s?.source.props).actionCommand):r.key.toLowerCase()==="f"?p(t.focusCommand,x(s?.source.props).focusCommand):"";u&&(r.preventDefault(),Ae(u,{actionId:r.key===" "?"0":"focus",actorEntityId:s?.entityId||p(t.playerEntityId),actorEntityKey:s?.entityId||p(t.playerEntityId)},e,o))}),a}function Ae(e,t,n,i){i.commandSink?.(fn(e,t,i),n)}function fn(e,t,n=z){return de(e,{action:t},n)}function mn(e){switch(e.toLowerCase()){case"w":case"arrowup":return[0,1];case"s":case"arrowdown":return[0,-1];case"a":case"arrowleft":return[-1,0];case"d":case"arrowright":return[1,0];default:return}}function pn(e){return e.includes("station")?"S":e.includes("projectile")?".":e.includes("ship")?"^":"+"}function Xe(e){return e.toLowerCase().replace(/[^a-z0-9_-]+/g,"-")}function H(e,t){const n=Number(e);return Number.isFinite(n)?n:t}function gn(e,t){if(Array.isArray(e)){const n=e.map(i=>Number(i));if(n.length>=3&&n.slice(0,3).every(Number.isFinite))return[n[0],n[1],n[2]]}if(typeof e=="string"){const n=e.split(/[,\s]+/).map(i=>Number(i)).filter(Number.isFinite);if(n.length>=3)return[n[0],n[1],n[2]]}return t}function hn(e,t,n,i){const o=De(t.active),a=m("section","cultui-inventory-drag");S(a,e),_(a,n,i),a.dataset.active=o?"true":"false";const l=m("div","cultui-inventory-section-label","Drag");if(_(l,F(n,"sectionLabel."),F(i,"sectionLabel.")),a.append(l),!o){const d=m("div","cultui-inventory-empty","None");return _(d,F(n,"empty."),F(i,"empty.")),a.append(d),a}const s=p(t.itemKey,t.item,"item"),f=m("div","cultui-inventory-drag-chip",s);_(f,F(n,"dragChip."),F(i,"dragChip.")),a.append(f);const c=[t.originOffsetX,t.originOffsetY].map(d=>Number(d)).map(d=>Number.isFinite(d)?d:0),r=m("div","cultui-inventory-meta",`origin ${c[0]}, ${c[1]}`);return _(r,F(n,"meta."),F(i,"meta.")),a.append(r),a}function yn(e,t,n,i,o){const a=m("section","cultui-inventory-grid");S(a,e),_(a,n,i);const l=U(p(t.columns,t.gridColumns,t.widthCells,""),0),s=l>0?l:6,f=U(t.rows,0),c=f>0?f:Math.max(3,Math.ceil(Math.max((e.children||[]).length,1)/s));a.style.setProperty("--inventory-columns",String(s)),a.style.setProperty("--inventory-rows",String(c)),a.dataset.cellSpriteMode=h(t.cellSpriteMode,"");const r=p(t.title,t.label,"Inventory"),d=m("div","cultui-inventory-section-label",r);_(d,F(n,"sectionLabel."),F(i,"sectionLabel.")),a.append(d);const u=m("div","cultui-inventory-board");u.style.display="grid",u.style.gridTemplateColumns=`repeat(${s}, ${R(p(t.cellSize,"72"))})`,u.style.gridTemplateRows=`repeat(${c}, ${R(p(t.cellSize,"72"))})`,u.style.gap=R(p(t.cellGap,"4")),u.style.overflow=p(t.boardOverflow,"auto"),u.style.padding=R(p(t.boardPadding,"4")),_(u,F(n,"board."),F(i,"board.")),u.addEventListener("dragover",b=>{vn(t)&&(b.preventDefault(),b.dataTransfer&&(b.dataTransfer.dropEffect="move"))}),u.addEventListener("drop",b=>{const w=b.dataTransfer?.getData("application/vnd.gamecult.eve.inventory-item+json")||"";if(!w)return;let T;try{T=JSON.parse(w)}catch{return}const A=u.getBoundingClientRect(),D=Math.max(1,H(t.cellSize,72)),Q=Math.max(0,H(t.cellGap,4)),G=D+Q,ee=Math.max(0,Math.min(s-1,Math.floor((b.clientX-A.left)/G))),te=Math.max(0,Math.min(c-1,Math.floor((b.clientY-A.top)/G))),K=wn(T,t,ee,te,o);K&&(b.preventDefault(),o.commandSink?.(K,e))});const g=new Set;for(const b of e.children||[]){const w=x(b.props),T=U(w.x,0),A=U(w.y,0);g.add(`${T}:${A}`),u.append(P(b,o))}const y=Math.min(s*c,256);for(let b=0;b{!a.draggable||!y.dataTransfer||(y.dataTransfer.effectAllowed="move",y.dataTransfer.setData("application/vnd.gamecult.eve.inventory-item+json",JSON.stringify(t)))});let f=U(t.shapeWidth,1),c=U(t.shapeHeight,1);const r=p(t.rotation,"").toLowerCase();["clockwise","counterclockwise","right","left","rotate90","rotate270"].includes(r)&&([f,c]=[c,f]),a.style.gridColumn=`${l+1} / span ${f}`,a.style.gridRow=`${s+1} / span ${c}`;const d=m("span","cultui-inventory-item-icon");_(d,F(n,"icon."),F(i,"icon.")),d.textContent=Nn(p(t.iconAssetUri,t.iconAssetKey,t.itemKey,t.label,"")),a.append(d);const u=p(t.label,t.itemKey,"");if(u){const y=m("span","cultui-inventory-item-label",u);_(y,F(n,"label."),F(i,"label.")),a.append(y)}const g=Number(t.quantity);if(Number.isFinite(g)&&g>1){const y=m("span","cultui-inventory-item-quantity",String(g));_(y,F(n,"quantity."),F(i,"quantity.")),a.append(y)}return a.title=[u,p(t.source,""),p(t.quality,"")?`quality ${t.quality}`:"",p(t.durability,"")?`durability ${t.durability}`:""].filter(Boolean).join(" | "),a}function vn(e){return Object.entries(e).some(([t,n])=>(t==="dropCommand"||t.startsWith("dropCommand."))&&typeof n=="string"&&n.length>0)}function wn(e,t,n,i,o=z){const a=p(e.sourceKind,e.source,""),l=p(t[`dropCommand.${a}`],t.dropCommand,"");if(!a||!l)return;const s=H(e.sourceIndex,-1),f=H(t.targetIndex,-1),c=p(t.targetKind,""),r={sourceKind:a,originEntityKey:p(e.sourceEntityKey,e.entityKey,""),originIndex:s,originCargoIndex:a==="cargo"?s:-1,itemKey:p(e.itemKey,""),quantity:Math.max(1,H(e.quantity,1)),sourceX:H(e.x,-2147483648),sourceY:H(e.y,-2147483648),destinationKind:c,destinationEntityKey:p(t.targetEntityKey,t.entityKey,""),destinationIndex:f,destinationCargoIndex:c==="cargo"?f:-1,destinationX:Math.trunc(n),destinationY:Math.trunc(i),hasDestinationPosition:!0};return de(l,{action:r},o)}function xn(e,t,n){const i=m("section","cultui-binding-map");S(i,e);const o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.setAttribute("class","cultui-xbox-controller"),o.setAttribute("viewBox","0 0 780 420"),o.setAttribute("role","img"),o.setAttribute("aria-label",h(t.label,"Xbox controller remapping")),o.innerHTML=En(),i.append(o);const a=m("div","cultui-binding-overlay");for(const l of e.children||[]){const s=x(l.props),f=h(s.target,l.id||""),c=m("button","cultui-binding-box");S(c,l),c.type="button",c.dataset.target=f,c.dataset.kind=h(s.bindingKind,"button"),c.style.left=R(s.x??"50%"),c.style.top=R(s.y??"50%"),c.append(m("span","cultui-binding-target",h(s.label,f))),c.append(m("span","cultui-binding-source",h(s.current,"unmapped"))),c.addEventListener("click",()=>{const d=lt(l);if(ct(l)||d?.documentId)dt(Pe(l,n),n);else{const u=h(s.commandId,"");u&&n.commandSink?.(de(u,s,n),l)}}),a.append(c);const r=document.createElementNS("http://www.w3.org/2000/svg","line");r.setAttribute("class","cultui-binding-line"),r.setAttribute("x1",h(s.anchorX,"390")),r.setAttribute("y1",h(s.anchorY,"210")),r.setAttribute("x2",String(He(s.x,780))),r.setAttribute("y2",String(He(s.y,420))),o.append(r)}return i.append(a),i}function ct(e){for(const t of e.embeddedDocuments||[]){const n=x(t.surface);if(n.root)return n}}function lt(e){const t=(e.embeddedDocuments||[])[0],n=x(e.props),i=p(n.documentId,t?.documentId,"");if(i)return{documentId:i,presentationKind:p(n.presentationKind,t?.presentationKind,""),schemaId:p(n.schemaId,t?.schemaId,""),slotId:p(n.slotId,t?.slotId,"")}}async function Pe(e,t){const n=ct(e);if(n)return n;const i=lt(e);if(!i?.documentId||!t.documentResolver)return;const o=await t.documentResolver(i,e);if(o)return x(o.surface).root?o.surface:o}function dt(e,t){const n=m("div","cultui-modal-backdrop"),i=m("section","cultui-modal");i.setAttribute("role","dialog"),i.setAttribute("aria-modal","true");const o=m("header","cultui-modal-header");o.append(m("h2","","Configure Binding"));const a=m("button","cultui-modal-close","Close");a.type="button",a.addEventListener("click",()=>n.remove()),o.append(a);const l=m("div","cultui-modal-body");i.append(o,l),n.append(i),n.addEventListener("click",s=>{s.target===n&&n.remove()}),document.body.append(n),l.append(m("div","detail","materializing document")),Promise.resolve(e).then(s=>{o.querySelector("h2").textContent=s?.title||"Configure Binding",l.replaceChildren(s?.root?P(s.root,t):J("Embedded document unavailable"))}).catch(s=>{l.replaceChildren(J(`Embedded document failed: ${s instanceof Error?s.message:String(s)}`))})}function Sn(e,t,n,i,o){const a=x(e.props),l=(e.children||[])[0],s=x(l?.props),f=p(s.anchor,a.anchor,"trigger"),c=p(s.placement,a.placement,"below-start"),r=Number(p(s.offsetX,a.offsetX,"0"))||0,d=Number(p(s.offsetY,a.offsetY,"4"))||0,u=m("div","cultui-modal-backdrop");u.style.background="transparent",u.style.placeItems="start";const g=m("section","cultui-modal");g.setAttribute("role","dialog"),g.setAttribute("aria-modal","true"),g.style.position="fixed",g.style.width="min(420px, calc(100vw - 24px))",g.style.maxHeight="min(620px, calc(100vh - 24px))";const y=m("header","cultui-modal-header");y.append(m("h2","",p(s.title,a.title,a.label,"Options")));const b=m("button","cultui-modal-close","Close");b.type="button",b.addEventListener("click",()=>u.remove()),y.append(b);const w=m("div","cultui-modal-body");if(l){const A=l.children||[];A.length>0?w.replaceChildren(...A.map(D=>P(D,t))):w.append(P(l,t))}else w.append(J("Popup has no content"));g.append(y,w),u.append(g),u.addEventListener("click",A=>{A.target===u&&u.remove()}),document.body.append(u);const T=_n(f,c,n,g,i,o,r,d);g.style.left=`${T.left}px`,g.style.top=`${T.top}px`}function _n(e,t,n,i,o,a,l,s){const f=n.getBoundingClientRect(),c=i.getBoundingClientRect(),r=c.width||420,d=c.height||320,u=e==="cursor"?{left:o,right:o,top:a,bottom:a}:f;if(t==="right-down"||t==="dropdown")return pe(u,r,d,l,s,"right","down");if(t==="left-down")return pe(u,r,d,l,s,"left","down");if(t==="right-up")return pe(u,r,d,l,s,"right","up");if(t==="left-up")return pe(u,r,d,l,s,"left","up");switch(t){case"above-start":return O(u.left+l,u.top-d-s,r,d);case"above-end":return O(u.right-r+l,u.top-d-s,r,d);case"below-end":return O(u.right-r+l,u.bottom+s,r,d);case"right-start":return O(u.right+l,u.top+s,r,d);case"left-start":return O(u.left-r-l,u.top+s,r,d);case"center":return O((window.innerWidth-r)/2+l,(window.innerHeight-d)/2+s,r,d);default:return O(u.left+l,u.bottom+s,r,d)}}function pe(e,t,n,i,o,a,l){const f=window.innerWidth-e.right-i-12,c=e.left-i-12,r=window.innerHeight-e.top-o-12,d=e.bottom-o-12,u=a==="right"?f>=t||f>=c:!(c>=t||c>=f),g=l==="down"?r>=n||r>=d:!(d>=n||d>=r),y=u?e.right+i:e.left-t-i,b=g?e.top+o:e.bottom-n-o;return O(y,b,t,n)}function O(e,t,n,i){return{left:Ye(e,12,window.innerWidth-n-12),top:Ye(t,12,window.innerHeight-i-12)}}function Ye(e,t,n){return n @@ -150,4 +150,4 @@ void main() { YBXA - `}function An(e,t=document.body){const n=Ne(e),i=document.documentElement.style;kn(n.assets.fontCss);for(const[s,r]of Object.entries(sn))i.setProperty(s,r);const o={colorBackground:"--bg",colorBackgroundTop:"--bg-top",colorBackgroundMid:"--bg-mid",colorBackgroundBottom:"--bg-bottom",colorShellSurfaceTop:"--shell-top",colorShellSurfaceBottom:"--shell-bottom",colorPanel:"--panel",colorPanelAlt:"--panel-2",colorPanelBorder:"--line",colorPanelBorderDeep:"--line-deep",colorText:"--text",colorTextBright:"--text-bright",colorMuted:"--quiet",colorAccent:"--accent",colorAccentStrong:"--accent-strong",colorCornerAccent:"--corner-accent",colorLink:"--cyan",colorShadow:"--shadow",colorPixelGrid:"--pixel-grid"};for(const[s,r]of Object.entries(o)){const d=n.tokens[s];d!==void 0&&i.setProperty(r,String(d))}const a=n.tokens.fontBody,l=n.tokens.fontDisplay,c=n.tokens.fontTitle,f=n.tokens.fontMono;a&&i.setProperty("--font-body",he(String(a))),l&&i.setProperty("--font-title",he(String(l))),c&&i.setProperty("--font-title",he(String(c))),f&&i.setProperty("--font-mono",he(String(f))),n.tokens.borderWidthPx&&i.setProperty("--border-width",`${n.tokens.borderWidthPx}px`),n.tokens.borderBottomWidthPx&&i.setProperty("--border-bottom-width",`${n.tokens.borderBottomWidthPx}px`),n.tokens.cornerAccentPx&&i.setProperty("--corner-accent-size",`${n.tokens.cornerAccentPx}px`),t.dataset.pixelArt=n.tokens.pixelArt||n.tokens.imageRendering==="pixelated"?"true":"false",t.dataset.scanlines=n.tokens.scanlineOverlay?"true":"false"}function de(e,t={},n=O){const i=w(t.action),o=n.provider?.providerId||le?.providerId||"surface unknown",a=n.activeSurfaceId||le?.surface?.id||n.provider?.surfaces?.[0]?.surfaceId||o,l=In(n,a),c=p(l.commandBoundary,t.commandBoundary,i.commandBoundary,i.target),f=p(l.receiptSchema,t.receiptSchema,i.receiptSchema),s={type:"surface-command",schema:"gamecult.eve.command_invocation.v1",providerId:o,surfaceId:a,command:e||h(i.type,"invoke"),payload:{...i,transport:t.transport??null},issuedAt:new Date().toISOString(),clientId:n.clientId||"eve.browser"};return c&&(s.commandBoundary=c),f&&(s.receiptSchema=f),s}function In(e,t){const n=[...e.provider?.surfaces||[],...e.provider?.localAdvertisement?.surfaces||[]];return n.find(i=>i.surfaceId===t&&i.worldInteraction)?.worldInteraction||n.find(i=>i.worldInteraction)?.worldInteraction||{}}function Ve(e,t){const n=w(e.action);return h(e.command,h(e.commandId,h(n.command,h(n.target,h(n.type,t?.commandId||"")))))}function J(e){const t=m("section","pane");return t.append(m("h2","","No Surface")),t.append(m("div","detail",e)),t}function Je(e,t,n,i,o){e.dataset.commandId=n,e.tabIndex=e instanceof HTMLButtonElement?e.tabIndex:0;const a=()=>{const l=de(n,i,o);o.commandSink?.(l,t)};e.addEventListener("click",a),e.addEventListener("keydown",l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),a())})}function Cn(e,t,n){const i=Tn(e,t),o=w(i.find(u=>u.kind==="control.box")?.props),a=i.filter(u=>u.kind==="control.part"),l=Number(e.min??0),c=Number(e.max??1),f=m("div","cultui-slider");f.dataset.skin=h(e.skin,"default"),f.dataset.bind=h(e.bind,""),Fn(f,o);const s=m("div","cultui-slider-visual"),r=m("input","cultui-slider-input");r.type="range",r.min=String(l),r.max=String(c),r.step=String(e.step??.01),r.setAttribute("aria-label",h(e.bind,"slider"));for(const u of a){const g=w(u.props),y=m("span",`cultui-slider-part ${h(g.name,"part")}`);Pn(y,g),s.append(y)}return a.some(u=>w(u.props).name==="track")||s.append(m("span","cultui-slider-part track")),a.some(u=>w(u.props).name==="fill")||s.append(m("span","cultui-slider-part fill")),a.some(u=>w(u.props).name==="thumb")||s.append(m("span","cultui-slider-part thumb")),f.append(s,r),(u=>{const g=Number(u??l),y=Math.max(l,Math.min(c,Number.isFinite(g)?g:l)),b=c===l?0:(y-l)/(c-l)*100;r.value=String(y),f.style.setProperty("--cultui-slider-value",`${b}%`),f.dataset.value=String(y)})(e.value??l),r.addEventListener("input",()=>{const u=de(h(e.command,"control.slider.input"),{...e,action:{...w(e.action),value:Number(r.value)},value:Number(r.value)},n);n.commandSink?.(u,{kind:"control.slider",props:e})}),f}function Tn(e,t){const n=typeof e.skin=="string"?e.skin:"",o=[...n?rt.controlSkins[n]?.children||[]:[],...t];return o.length?o:[{kind:"control.box",props:{height:18,overflow:"visible"}},{kind:"control.part",props:{name:"track",anchor:"center",size:["100%",6],radius:2,fill:"color.panelInset"}},{kind:"control.part",props:{name:"fill",anchor:["left","center"],size:["value%",6],radius:2,fill:"color.accent"}},{kind:"control.part",props:{name:"thumb",anchor:["value","center"],size:[12,12],bleed:3,radius:999,fill:"color.accent"}}]}function Ne(e){if(Array.isArray(e)){const t={},n={};for(const i of e)i?.name&&(i.name==="font.web.google"&&typeof i.value=="string"?n.fontCss=i.value:t[i.name]=i.value);return{tokens:t,assets:n,controlSkins:{}}}return{tokens:w(e?.tokens),assets:w(e?.assets),controlSkins:w(e?.controlSkins)}}function ae(e){if(!e)return"";const t=O.assetUrlResolver;return t?t(e,le):/^(https?:|data:|blob:)/i.test(e)?e:O.assetBaseUrl&&e.startsWith("/")?`${O.assetBaseUrl.replace(/\/+$/,"")}${e}`:e}function kn(e){const t=typeof e=="string"?e.trim():"";if(me?.dataset.href===t||(me?.remove(),me=void 0,!t))return;const n=document.createElement("link");n.rel="preconnect",n.href="https://fonts.gstatic.com",n.crossOrigin="anonymous",document.head.append(n);const i=document.createElement("link");i.rel="stylesheet",i.href=t,i.dataset.href=t,document.head.append(i),me=i}function Rn(e,t,n){const i=[];return(e==="text.title"||t.role==="title")&&i.push("cultui-title","eve-text-title"),e==="text.subtitle"&&i.push("eve-text-subtitle"),e==="label"&&i.push("cultui-label"),t.role==="mono"&&i.push("detail","mono"),i.length===0&&i.push("detail","eve-text"),i.join(" ")}function Fn(e,t){t.height!==void 0&&(e.style.minHeight=R(t.height)),t.width!==void 0&&(e.style.width=R(t.width)),typeof t.overflow=="string"&&(e.style.overflow=t.overflow)}function Pn(e,t){const n=Array.isArray(t.size)?t.size:[t.size,void 0];n[0]!==void 0&&n[0]!=="value%"&&(e.style.width=R(n[0])),n[1]!==void 0&&(e.style.height=R(n[1])),t.radius!==void 0&&(e.style.borderRadius=R(t.radius)),t.fill!==void 0&&(e.style.background=be(String(t.fill))),t.bleed!==void 0&&e.style.setProperty("--part-bleed",R(t.bleed)),(Array.isArray(t.anchor)?t.anchor:[t.anchor]).includes("value")&&(e.dataset.anchorValue="true")}function ge(e,t){t.gap!==void 0&&(e.style.gap=R(t.gap)),t.padding!==void 0&&(e.style.padding=R(t.padding)),t.size!==void 0&&(e.style.flex=Ln(t.size)),t.min!==void 0&&(e.style.minWidth=R(t.min)),t.max!==void 0&&(e.style.maxWidth=R(t.max)),t.align!==void 0&&(e.style.alignItems=t.align==="end"?"flex-end":String(t.align)),(t.clip==="true"||t.clip===!0)&&(e.style.overflow="hidden"),t.scroll==="y"&&(e.style.overflowY="auto"),t.scroll==="x"&&(e.style.overflowX="auto")}function Ln(e){return typeof e=="string"&&e.endsWith("fr")?`${Number(e.slice(0,-2))||1} 1 0`:e==="auto"||e==="content"?"0 0 auto":`0 0 ${R(e)}`}function R(e){return Array.isArray(e)?e.map(R).join(" "):typeof e=="number"?`${e}px`:typeof e=="string"&&/^-?\d+(\.\d+)?$/.test(e)?`${e}px`:String(e??"")}function be(e){return{"color.accent":"var(--accent)","color.panelInset":"rgba(0, 0, 0, 0.34)","color.panel":"var(--panel)","color.text":"var(--text)"}[e]||e}function he(e){return e.includes("Zen Kaku Gothic New")||e.includes("M PLUS 1")?e:e.includes("Montserrat")?`${e}, "Zen Kaku Gothic New", "M PLUS 1", "Noto Sans JP", "Hiragino Sans", "Yu Gothic", sans-serif`:e.includes("Ubuntu")?`${e}, "M PLUS 1", "Noto Sans JP", "Hiragino Sans", "Yu Gothic", sans-serif`:`${e}, "Noto Sans JP", "Hiragino Sans", "Yu Gothic", sans-serif`}function S(e,t){t.id&&(e.id=t.id),t.id&&(e.dataset.eveNodeId=t.id),t.kind&&(e.dataset.eveKind=t.kind)}function w(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function $n(e){return Array.isArray(e)?e:[]}function Mn(e){return $n(e).map((t,n)=>st({kind:"list.item",props:w(t)}))}function h(e,t){return e==null?t:String(e)}function p(...e){for(const t of e){if(typeof t=="string"&&t.trim())return t;if(typeof t=="number"&&Number.isFinite(t))return String(t)}return""}function De(e){return typeof e=="boolean"?e:typeof e=="number"?e!==0:typeof e=="string"?["1","true","yes","on"].includes(e.trim().toLowerCase()):!1}function U(e,t){const n=Number(e);return Number.isFinite(n)?Math.max(0,Math.floor(n)):t}function Nn(e){const t=e.toLowerCase();return t.includes("sensor")?"S":t.includes("thermal")?"T":t.includes("fuel")?"F":t.includes("cargo")?"C":t.includes("weapon")?"W":e.trim().slice(0,1).toUpperCase()||"?"}function Dn(e){const t=e.trim().split(/\s+/).filter(Boolean);return t.length&&t.slice(0,2).map(n=>n[0]?.toUpperCase()||"").join("")||"?"}function Ze(e){const t=Number(e);return Number.isFinite(t)?Math.max(0,Math.min(100,t)):0}function m(e,t="",n=""){const i=document.createElement(e);return t&&(i.className=t),n&&(i.textContent=n),i}const we=document.querySelector("#surface"),N=document.querySelector("#status"),z=document.querySelector("#receipt"),ut=document.querySelector("#compiler"),Be=document.querySelector("#composer"),Se=document.querySelector("#destination-form"),ft=document.querySelector("#compiler-results"),mt=document.querySelector("#campaign-lab"),Bn=document.querySelector("#campaign-list");let Z=0,Le="",ce=0,pt=0,se=[],Ie=!1;const Ce=new Set;async function Ue(e){if(Ie)throw new Error("A Ghostlight request is already in progress.");Ie=!0,document.body.setAttribute("aria-busy","true");for(const t of document.querySelectorAll("button, input, textarea, select"))t.disabled||(t.disabled=!0,Ce.add(t));try{return await e()}finally{for(const t of Ce)t.disabled=!1;Ce.clear(),document.body.removeAttribute("aria-busy"),Ie=!1}}function v(e,t,n){const i=document.createElement(e);return t!==void 0&&(i.textContent=t),n&&(i.className=n),i}function V(e,t){const n=[v("h3",e)];for(const i of t.filter(Boolean))n.push(v("p",i));z.replaceChildren(...n),z.hidden=!1}function Un(e){if(e?.kind==="assessed"){const t=e.assessment,n=[v("h3",t.admissible?"Action assessment":"That attempt is not possible")];if(t.admissible){n.push(v("p",`DC ${t.dc} · modifier ${t.modifier_total>=0?"+":""}${t.modifier_total}`));const i=v("ul");for(const o of t.modifiers??[])i.append(v("li",`${o.label}: ${o.value>=0?"+":""}${o.value}`));n.push(i),n.push(v("p",`Strong/success: ${t.success_stake}`)),n.push(v("p",`Mixed: ${t.mixed_stake}`)),n.push(v("p",`Failure: ${t.failure_stake}`)),n.push(v("p",`Effect ceiling: ${t.effect_ceiling}`,"quiet"))}else{n.push(v("p",t.missing_permission??"The attempt has no admissible path from current state."));for(const i of t.bargains??[])n.push(v("p",`Possible bargain: ${i}`))}z.replaceChildren(...n),z.hidden=!1;return}if(e?.kind==="committed"){const t=e.receipt?.roll;if(t){const n=String(t.outcome).replaceAll("_"," ");V(n.charAt(0).toUpperCase()+n.slice(1),[`d20 ${t.d20} ${t.modifier_total>=0?"+":"−"} ${Math.abs(t.modifier_total)} = ${t.total} against DC ${t.dc}`])}else V("World advanced",[`Revision ${e.revision}`]);return}if(e?.kind==="resolution_updated"){V("World resolution updated",[`Resolution epoch ${e.receipt?.resolution_epoch??"advanced"}`]);return}V("Command result",[e?.error??"The world returned no player-facing detail."])}function qn(){const e="This laboratory requires an unused invite link.";N.textContent=e,ut.hidden=!0,Be.hidden=!0,Se.hidden=!0,mt.hidden=!0,z.hidden=!0,we.hidden=!1;const t=v("article",void 0,"card");t.append(v("h2","Private campaign laboratory"),v("p",e),v("p","Open one of the two single-use tester invitations on this device. The resulting session stays separate from the other player's campaigns.","quiet")),we.replaceChildren(t)}async function q(){const e=await fetch("/api/surface");if(e.status===401){qn();return}const t=await e.json(),n=t.surface_id==="ghostlight.compiler";if(ut.hidden=!n,Be.hidden=n,Se.hidden=n,we.hidden=n,mt.hidden=n,n){N.textContent="No campaign exists. Retrieve the Vault and approve a world seed.";return}if(Z=Number(t.world_revision??t.version??0),Le=String(t.player_actor_id??""),!Le)throw new Error("Campaign surface omitted its canonical player actor ID.");ce=Number(t.resolution?.policy?.resolution_epoch??0),pt=Number(t.resolution?.policy?.provider_configuration_epoch??0),se=t.resolution?.pins??[];const i=Number(t.resolution?.policy?.active_cell_budget??8),o=document.querySelector("#active-cell-budget");o.value=String(i),document.querySelector("#active-cell-budget-value").value=String(i),document.querySelector("#resolution-status").textContent=`${t.resolution?.effective_budget??i} effective cells · ${t.resolution?.mandatory_overage??0} temporary overage · epoch ${ce}`;const a=Number(t.resolution?.policy?.provider_parallelism??8);document.querySelector("#provider-parallelism").value=String(a),document.querySelector("#provider-parallelism-value").value=String(a);const l=document.querySelector("#pin-list");l.replaceChildren(),se.length===0&&l.append(v("p","No persistent pins."));for(const s of se){const r=v("p");r.append(v("code",String(s.kind)),document.createTextNode(` ${[...s.subject_ids].join(", ")} — ${s.reason} `));const d=v("button","Remove");d.type="button",d.addEventListener("click",async()=>{await oe({type:"replace_resolution_pins",expected_revision:Z,expected_resolution_epoch:ce,pins:se.filter(u=>u.id!==s.id)})}),r.append(d),l.append(r)}const c=document.querySelector("#fission-parent");c.replaceChildren(...(t.resolution?.fission_targets??[]).map(s=>{const r=v("option",`${s.name} · ${s.id}`);return r.value=s.id,r})),document.querySelector("#fission-form").hidden=c.options.length===0,ot(t,we,{body:document.body,clientId:"ghostlight.browser",statusElement:N});const f=await fetch("/api/campaigns").then(s=>s.json());Bn.replaceChildren(...f.campaigns.map(s=>{const r=v("button",`${s.selected?"●":"○"} ${s.name} · revision ${s.revision}`);return r.type="button",r.disabled=!!s.selected,s.selected||r.addEventListener("click",async()=>{await B(`/api/campaigns/select/${s.id}`,{}),await q()}),r}))}async function B(e,t){return Ue(async()=>{N.textContent="Retrieving evidence and compiling…";const n=await fetch(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(t)}),i=n.headers.get("content-type")?.includes("json")?await n.json():await n.text();if(!n.ok)throw N.textContent=typeof i=="string"?i:String(i?.error??"Compilation failed"),new Error(N.textContent);return i})}function Qe(e,t,n){const i=v("div",void 0,"cards");e.forEach((o,a)=>{const l=v("article",void 0,"card");l.append(v("h3",o.title??o.name),v("p",o.player_hook??o.premise)),o.era&&l.append(v("p",`${o.era} · ${o.place} · ${o.pressure}`));const c=v("button",t);c.type="button",c.addEventListener("click",()=>n(e[a])),l.append(c),i.append(l)}),ft.replaceChildren(i)}function X(e,t,n){const i=v("details");i.append(v("summary",t));const o=v("ul");for(const a of n)o.append(v("li",a));n.length===0&&o.append(v("li","None declared.")),i.append(o),e.append(i)}document.querySelector("#suggest-form").addEventListener("submit",async e=>{e.preventDefault();const t=await B("/api/compiler/openings",{setting:document.querySelector("#setting").value,constraints:[]});Qe(t.openings,"Choose opening",async n=>{const i=await B("/api/compiler/roles",n);Qe(i.roles,"Choose role",async o=>gt(await B("/api/compiler/selected",{campaign_name:n.title,opening:n,role:o})))})});document.querySelector("#custom-form").addEventListener("submit",async e=>{e.preventDefault(),await gt(await B("/api/compiler/custom",Object.fromEntries(new FormData(e.currentTarget))))});async function gt(e){const t=e.preview,n=Array.isArray(t.evidence_coverage)?t.evidence_coverage:[],i=n.reduce((c,f)=>{const s=String(f?.lane??"excluded");return c[s]=(c[s]??0)+1,c},{}),o=v("article",void 0,"card");o.append(v("h3",t.title),v("p",t.opening??""),v("p",`${t.locations?.length??0} locations · ${(t.cast?.length??0)+1} actors · ${t.institutions?.length??0} institutions`),v("p",t.gaps.length?`Material gaps: ${t.gaps.join("; ")}`:"No declared material gaps.","warning"),v("p",`Branch assumptions: ${t.branch_assumptions.join("; ")||"none"}`),v("p",n.length?`Evidence use: ${i.direct_seed??0} direct · ${i.setting_background??0} background · ${i.excluded??0} excluded`:"Evidence use: no retrieved sources were admitted to this seed.","quiet"));const a=t.player_role??{};X(o,`Player role · ${a.name??"unnamed"}`,[`Starts at ${a.location_id??"an unspecified location"}`,...(a.capabilities??[]).map(c=>`Capability: ${c}`),...(a.equipment??[]).map(c=>`Equipment: ${c}`),...(a.conditions??[]).map(c=>`Condition: ${c}`),...(a.obligations??[]).map(c=>`Obligation: ${c}`)]),X(o,`Initial topology · ${t.locations?.length??0} locations`,(t.locations??[]).map(c=>{const f=Object.keys(c.routes??{});return`${c.name} · ${c.id}${c.container_id?` · inside ${c.container_id}`:""}${f.length?` · routes to ${f.join(", ")}`:" · no compiled route"}`})),X(o,`Present cast · ${t.cast?.length??0}`,(t.cast??[]).map(c=>`${c.name} · ${c.id} · at ${c.location_id}`)),X(o,`Institutions · ${t.institutions?.length??0}`,(t.institutions??[]).map(c=>`${c.name} · ${c.id}`)),X(o,`Populations · ${t.populations?.length??0}`,(t.populations??[]).map(c=>`${c.name} · ${c.id} · at ${c.home_location_id}`)),X(o,`World clocks · ${t.clocks?.length??0}`,(t.clocks??[]).map(c=>`${c.name} · ${c.progress}/${c.threshold} · ${c.trigger}`)),X(o,`Evidence coverage · ${n.length}`,n.map(c=>`${c.source_id} · ${String(c.lane).replaceAll("_"," ")} · ${c.rationale}`));const l=v("button","Approve and enter");l.type="button",l.addEventListener("click",async()=>{await B(`/api/compiler/approve/${e.preview_id}`,{}),await q()}),o.append(l),ft.replaceChildren(o),N.textContent="Preview compiled. Nothing has entered world state yet."}async function oe(e){return Ue(async()=>{N.textContent="The world is considering the command…";const t=await fetch("/api/command",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)}),n=await t.json();return Un(n),t.ok?(await q(),n):(N.textContent=n.error??"The command was refused.",await q(),n)})}function ht(e){if(e?.kind!=="assessed")return;const t=document.createElement("button");t.type="button",t.textContent=e.assessment.admissible?"Confirm server roll":"Revise attempt",t.addEventListener("click",async()=>{if(!e.assessment.admissible){document.querySelector("#attempt").focus();return}const n=await oe({type:"attempt",assessment_digest:e.assessment.digest});ht(n)}),z.append(t)}Be.addEventListener("submit",async e=>{e.preventDefault();const t=document.querySelector("#attempt").value.trim(),n=document.querySelector("#intended-effect").value.trim();!t||!n||ht(await oe({type:"assess",expected_revision:Z,intent:{actor_id:Le,description:t,intended_effect:n}}))});document.querySelector("#wait").addEventListener("click",()=>{oe({type:"wait",expected_revision:Z,minutes:60})});document.querySelector("#active-cell-budget").addEventListener("input",e=>{document.querySelector("#active-cell-budget-value").value=e.currentTarget.value});document.querySelector("#resolution-form").addEventListener("submit",async e=>{e.preventDefault(),await oe({type:"set_resolution_budget",expected_revision:Z,expected_resolution_epoch:ce,active_cell_budget:Number(document.querySelector("#active-cell-budget").value)})});document.querySelector("#provider-parallelism").addEventListener("input",e=>{document.querySelector("#provider-parallelism-value").value=e.currentTarget.value});document.querySelector("#provider-parallelism-form").addEventListener("submit",async e=>{e.preventDefault(),await Ue(async()=>{N.textContent="Applying the provider concurrency limit…";const t=await fetch("/api/operator/provider-parallelism",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({expected_provider_configuration_epoch:pt,provider_parallelism:Number(document.querySelector("#provider-parallelism").value)})}),n=await t.json();V(t.ok?"Provider concurrency updated":"Provider concurrency refused",[t.ok?`Parallel requests: ${n.receipt?.provider_parallelism??n.provider_parallelism??"updated"}`:n.error??"The operator limit was refused."]),t.ok||(N.textContent=n.error??"The operator limit was refused."),await q()})});document.querySelector("#pin-form").addEventListener("submit",async e=>{e.preventDefault();const t=new FormData(e.currentTarget),n=String(t.get("subject_ids")??"").split(",").map(o=>o.trim()).filter(Boolean),i={schema:"ghostlight.resolution_pin.v1",id:`pin:${crypto.randomUUID()}`,kind:String(t.get("kind")),subject_ids:n,reason:String(t.get("reason")??"").trim(),created_world_revision:Z};await oe({type:"replace_resolution_pins",expected_revision:Z,expected_resolution_epoch:ce,pins:[...se,i]})});Se.addEventListener("submit",async e=>{e.preventDefault();const t=await B("/api/compiler/destination",Object.fromEntries(new FormData(Se))),n=t.preview;V("Destination preview",[...(n.locations??[]).map(o=>o.name),...(n.gaps??[]).map(o=>`Material gap: ${o}`)]),N.textContent="Destination preview compiled; topology is unchanged until approval.";const i=v("button","Approve destination");i.type="button",i.addEventListener("click",async()=>{await B(`/api/compiler/destination/approve/${t.preview_id}`,{}),i.remove(),await q()}),z.append(i)});document.querySelector("#fission-form").addEventListener("submit",async e=>{e.preventDefault();const t=new FormData(e.currentTarget),n=await B("/api/compiler/gestalt/fission",{parent_gestalt_id:t.get("parent_gestalt_id"),partition_axis:t.get("partition_axis"),requested_partition_values:String(t.get("requested_partition_values")??"").split(",").map(o=>o.trim()).filter(Boolean),reason:t.get("reason")});V("Population fission preview",[...(n.preview?.children??[]).map(o=>`${o.name} · ${o.id}`),...(n.preview?.gaps??[]).map(o=>`Material gap: ${o}`)]),N.textContent="Fission preview compiled. Canonical leaves are unchanged until approval.";const i=document.createElement("button");i.type="button",i.textContent="Approve population fission",i.addEventListener("click",async()=>{await B(`/api/compiler/gestalt/fission/approve/${n.preview_id}`,{}),i.remove(),await q()}),z.append(i)});document.querySelector("#fork-form").addEventListener("submit",async e=>{e.preventDefault(),await B("/api/campaigns/fork",Object.fromEntries(new FormData(e.currentTarget))),await q()});document.querySelector("#reset-form").addEventListener("submit",async e=>{e.preventDefault(),await B("/api/campaigns/reset",Object.fromEntries(new FormData(e.currentTarget))),await q()});document.querySelector("#load-operator").addEventListener("click",async()=>{const t=await(await fetch("/api/operator")).json();ot(t,document.querySelector("#operator-output"),{body:document.body,clientId:"ghostlight.operator",statusElement:N})});q(); + `}function An(e,t=document.body){const n=Ne(e),i=document.documentElement.style;kn(n.assets.fontCss);for(const[c,r]of Object.entries(sn))i.setProperty(c,r);const o={colorBackground:"--bg",colorBackgroundTop:"--bg-top",colorBackgroundMid:"--bg-mid",colorBackgroundBottom:"--bg-bottom",colorShellSurfaceTop:"--shell-top",colorShellSurfaceBottom:"--shell-bottom",colorPanel:"--panel",colorPanelAlt:"--panel-2",colorPanelBorder:"--line",colorPanelBorderDeep:"--line-deep",colorText:"--text",colorTextBright:"--text-bright",colorMuted:"--quiet",colorAccent:"--accent",colorAccentStrong:"--accent-strong",colorCornerAccent:"--corner-accent",colorLink:"--cyan",colorShadow:"--shadow",colorPixelGrid:"--pixel-grid"};for(const[c,r]of Object.entries(o)){const d=n.tokens[c];d!==void 0&&i.setProperty(r,String(d))}const a=n.tokens.fontBody,l=n.tokens.fontDisplay,s=n.tokens.fontTitle,f=n.tokens.fontMono;a&&i.setProperty("--font-body",he(String(a))),l&&i.setProperty("--font-title",he(String(l))),s&&i.setProperty("--font-title",he(String(s))),f&&i.setProperty("--font-mono",he(String(f))),n.tokens.borderWidthPx&&i.setProperty("--border-width",`${n.tokens.borderWidthPx}px`),n.tokens.borderBottomWidthPx&&i.setProperty("--border-bottom-width",`${n.tokens.borderBottomWidthPx}px`),n.tokens.cornerAccentPx&&i.setProperty("--corner-accent-size",`${n.tokens.cornerAccentPx}px`),t.dataset.pixelArt=n.tokens.pixelArt||n.tokens.imageRendering==="pixelated"?"true":"false",t.dataset.scanlines=n.tokens.scanlineOverlay?"true":"false"}function de(e,t={},n=z){const i=x(t.action),o=n.provider?.providerId||le?.providerId||"surface unknown",a=n.activeSurfaceId||le?.surface?.id||n.provider?.surfaces?.[0]?.surfaceId||o,l=In(n,a),s=p(l.commandBoundary,t.commandBoundary,i.commandBoundary,i.target),f=p(l.receiptSchema,t.receiptSchema,i.receiptSchema),c={type:"surface-command",schema:"gamecult.eve.command_invocation.v1",providerId:o,surfaceId:a,command:e||h(i.type,"invoke"),payload:{...i,transport:t.transport??null},issuedAt:new Date().toISOString(),clientId:n.clientId||"eve.browser"};return s&&(c.commandBoundary=s),f&&(c.receiptSchema=f),c}function In(e,t){const n=[...e.provider?.surfaces||[],...e.provider?.localAdvertisement?.surfaces||[]];return n.find(i=>i.surfaceId===t&&i.worldInteraction)?.worldInteraction||n.find(i=>i.worldInteraction)?.worldInteraction||{}}function Ve(e,t){const n=x(e.action);return h(e.command,h(e.commandId,h(n.command,h(n.target,h(n.type,t?.commandId||"")))))}function J(e){const t=m("section","pane");return t.append(m("h2","","No Surface")),t.append(m("div","detail",e)),t}function Je(e,t,n,i,o){e.dataset.commandId=n,e.tabIndex=e instanceof HTMLButtonElement?e.tabIndex:0;const a=()=>{const l=de(n,i,o);o.commandSink?.(l,t)};e.addEventListener("click",a),e.addEventListener("keydown",l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),a())})}function Cn(e,t,n){const i=Tn(e,t),o=x(i.find(u=>u.kind==="control.box")?.props),a=i.filter(u=>u.kind==="control.part"),l=Number(e.min??0),s=Number(e.max??1),f=m("div","cultui-slider");f.dataset.skin=h(e.skin,"default"),f.dataset.bind=h(e.bind,""),Fn(f,o);const c=m("div","cultui-slider-visual"),r=m("input","cultui-slider-input");r.type="range",r.min=String(l),r.max=String(s),r.step=String(e.step??.01),r.setAttribute("aria-label",h(e.bind,"slider"));for(const u of a){const g=x(u.props),y=m("span",`cultui-slider-part ${h(g.name,"part")}`);Pn(y,g),c.append(y)}return a.some(u=>x(u.props).name==="track")||c.append(m("span","cultui-slider-part track")),a.some(u=>x(u.props).name==="fill")||c.append(m("span","cultui-slider-part fill")),a.some(u=>x(u.props).name==="thumb")||c.append(m("span","cultui-slider-part thumb")),f.append(c,r),(u=>{const g=Number(u??l),y=Math.max(l,Math.min(s,Number.isFinite(g)?g:l)),b=s===l?0:(y-l)/(s-l)*100;r.value=String(y),f.style.setProperty("--cultui-slider-value",`${b}%`),f.dataset.value=String(y)})(e.value??l),r.addEventListener("input",()=>{const u=de(h(e.command,"control.slider.input"),{...e,action:{...x(e.action),value:Number(r.value)},value:Number(r.value)},n);n.commandSink?.(u,{kind:"control.slider",props:e})}),f}function Tn(e,t){const n=typeof e.skin=="string"?e.skin:"",o=[...n?rt.controlSkins[n]?.children||[]:[],...t];return o.length?o:[{kind:"control.box",props:{height:18,overflow:"visible"}},{kind:"control.part",props:{name:"track",anchor:"center",size:["100%",6],radius:2,fill:"color.panelInset"}},{kind:"control.part",props:{name:"fill",anchor:["left","center"],size:["value%",6],radius:2,fill:"color.accent"}},{kind:"control.part",props:{name:"thumb",anchor:["value","center"],size:[12,12],bleed:3,radius:999,fill:"color.accent"}}]}function Ne(e){if(Array.isArray(e)){const t={},n={};for(const i of e)i?.name&&(i.name==="font.web.google"&&typeof i.value=="string"?n.fontCss=i.value:t[i.name]=i.value);return{tokens:t,assets:n,controlSkins:{}}}return{tokens:x(e?.tokens),assets:x(e?.assets),controlSkins:x(e?.controlSkins)}}function ae(e){if(!e)return"";const t=z.assetUrlResolver;return t?t(e,le):/^(https?:|data:|blob:)/i.test(e)?e:z.assetBaseUrl&&e.startsWith("/")?`${z.assetBaseUrl.replace(/\/+$/,"")}${e}`:e}function kn(e){const t=typeof e=="string"?e.trim():"";if(me?.dataset.href===t||(me?.remove(),me=void 0,!t))return;const n=document.createElement("link");n.rel="preconnect",n.href="https://fonts.gstatic.com",n.crossOrigin="anonymous",document.head.append(n);const i=document.createElement("link");i.rel="stylesheet",i.href=t,i.dataset.href=t,document.head.append(i),me=i}function Rn(e,t,n){const i=[];return(e==="text.title"||t.role==="title")&&i.push("cultui-title","eve-text-title"),e==="text.subtitle"&&i.push("eve-text-subtitle"),e==="label"&&i.push("cultui-label"),t.role==="mono"&&i.push("detail","mono"),i.length===0&&i.push("detail","eve-text"),i.join(" ")}function Fn(e,t){t.height!==void 0&&(e.style.minHeight=R(t.height)),t.width!==void 0&&(e.style.width=R(t.width)),typeof t.overflow=="string"&&(e.style.overflow=t.overflow)}function Pn(e,t){const n=Array.isArray(t.size)?t.size:[t.size,void 0];n[0]!==void 0&&n[0]!=="value%"&&(e.style.width=R(n[0])),n[1]!==void 0&&(e.style.height=R(n[1])),t.radius!==void 0&&(e.style.borderRadius=R(t.radius)),t.fill!==void 0&&(e.style.background=be(String(t.fill))),t.bleed!==void 0&&e.style.setProperty("--part-bleed",R(t.bleed)),(Array.isArray(t.anchor)?t.anchor:[t.anchor]).includes("value")&&(e.dataset.anchorValue="true")}function ge(e,t){t.gap!==void 0&&(e.style.gap=R(t.gap)),t.padding!==void 0&&(e.style.padding=R(t.padding)),t.size!==void 0&&(e.style.flex=$n(t.size)),t.min!==void 0&&(e.style.minWidth=R(t.min)),t.max!==void 0&&(e.style.maxWidth=R(t.max)),t.align!==void 0&&(e.style.alignItems=t.align==="end"?"flex-end":String(t.align)),(t.clip==="true"||t.clip===!0)&&(e.style.overflow="hidden"),t.scroll==="y"&&(e.style.overflowY="auto"),t.scroll==="x"&&(e.style.overflowX="auto")}function $n(e){return typeof e=="string"&&e.endsWith("fr")?`${Number(e.slice(0,-2))||1} 1 0`:e==="auto"||e==="content"?"0 0 auto":`0 0 ${R(e)}`}function R(e){return Array.isArray(e)?e.map(R).join(" "):typeof e=="number"?`${e}px`:typeof e=="string"&&/^-?\d+(\.\d+)?$/.test(e)?`${e}px`:String(e??"")}function be(e){return{"color.accent":"var(--accent)","color.panelInset":"rgba(0, 0, 0, 0.34)","color.panel":"var(--panel)","color.text":"var(--text)"}[e]||e}function he(e){return e.includes("Zen Kaku Gothic New")||e.includes("M PLUS 1")?e:e.includes("Montserrat")?`${e}, "Zen Kaku Gothic New", "M PLUS 1", "Noto Sans JP", "Hiragino Sans", "Yu Gothic", sans-serif`:e.includes("Ubuntu")?`${e}, "M PLUS 1", "Noto Sans JP", "Hiragino Sans", "Yu Gothic", sans-serif`:`${e}, "Noto Sans JP", "Hiragino Sans", "Yu Gothic", sans-serif`}function S(e,t){t.id&&(e.id=t.id),t.id&&(e.dataset.eveNodeId=t.id),t.kind&&(e.dataset.eveKind=t.kind)}function x(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function Ln(e){return Array.isArray(e)?e:[]}function Mn(e){return Ln(e).map((t,n)=>st({kind:"list.item",props:x(t)}))}function h(e,t){return e==null?t:String(e)}function p(...e){for(const t of e){if(typeof t=="string"&&t.trim())return t;if(typeof t=="number"&&Number.isFinite(t))return String(t)}return""}function De(e){return typeof e=="boolean"?e:typeof e=="number"?e!==0:typeof e=="string"?["1","true","yes","on"].includes(e.trim().toLowerCase()):!1}function U(e,t){const n=Number(e);return Number.isFinite(n)?Math.max(0,Math.floor(n)):t}function Nn(e){const t=e.toLowerCase();return t.includes("sensor")?"S":t.includes("thermal")?"T":t.includes("fuel")?"F":t.includes("cargo")?"C":t.includes("weapon")?"W":e.trim().slice(0,1).toUpperCase()||"?"}function Dn(e){const t=e.trim().split(/\s+/).filter(Boolean);return t.length&&t.slice(0,2).map(n=>n[0]?.toUpperCase()||"").join("")||"?"}function Ze(e){const t=Number(e);return Number.isFinite(t)?Math.max(0,Math.min(100,t)):0}function m(e,t="",n=""){const i=document.createElement(e);return t&&(i.className=t),n&&(i.textContent=n),i}const xe=document.querySelector("#surface"),N=document.querySelector("#status"),q=document.querySelector("#receipt"),ut=document.querySelector("#compiler"),Be=document.querySelector("#composer"),Se=document.querySelector("#destination-form"),ft=document.querySelector("#compiler-results"),mt=document.querySelector("#campaign-lab"),Bn=document.querySelector("#campaign-list");let Z=0,$e="",ce=0,pt=0,se=[],Ie=!1;const Ce=new Set;async function Ue(e){if(Ie)throw new Error("A Ghostlight request is already in progress.");Ie=!0,document.body.setAttribute("aria-busy","true");for(const t of document.querySelectorAll("button, input, textarea, select"))t.disabled||(t.disabled=!0,Ce.add(t));try{return await e()}finally{for(const t of Ce)t.disabled=!1;Ce.clear(),document.body.removeAttribute("aria-busy"),Ie=!1}}function v(e,t,n){const i=document.createElement(e);return t!==void 0&&(i.textContent=t),n&&(i.className=n),i}function V(e,t){const n=[v("h3",e)];for(const i of t.filter(Boolean))n.push(v("p",i));q.replaceChildren(...n),q.hidden=!1}function Un(e){if(e?.kind==="assessed"){const t=e.assessment,n=[v("h3",t.admissible?"Action assessment":"That attempt is not possible")];if(t.admissible){n.push(v("p",`DC ${t.dc} · modifier ${t.modifier_total>=0?"+":""}${t.modifier_total}`));const i=v("ul");for(const o of t.modifiers??[])i.append(v("li",`${o.label}: ${o.value>=0?"+":""}${o.value}`));n.push(i),n.push(v("p",`Strong/success: ${t.success_stake}`)),n.push(v("p",`Mixed: ${t.mixed_stake}`)),n.push(v("p",`Failure: ${t.failure_stake}`)),n.push(v("p",`Effect ceiling: ${t.effect_ceiling}`,"quiet"))}else{n.push(v("p",t.missing_permission??"The attempt has no admissible path from current state."));for(const i of t.bargains??[])n.push(v("p",`Possible bargain: ${i}`))}q.replaceChildren(...n),q.hidden=!1;return}if(e?.kind==="committed"){const t=e.receipt?.roll;if(t){const n=String(t.outcome).replaceAll("_"," ");V(n.charAt(0).toUpperCase()+n.slice(1),[`d20 ${t.d20} ${t.modifier_total>=0?"+":"−"} ${Math.abs(t.modifier_total)} = ${t.total} against DC ${t.dc}`])}else V("World advanced",[`Revision ${e.revision}`]);return}if(e?.kind==="resolution_updated"){V("World resolution updated",[`Resolution epoch ${e.receipt?.resolution_epoch??"advanced"}`]);return}V("Command result",[e?.error??"The world returned no player-facing detail."])}function qn(){const e="This laboratory requires an unused invite link.";N.textContent=e,ut.hidden=!0,Be.hidden=!0,Se.hidden=!0,mt.hidden=!0,q.hidden=!0,xe.hidden=!1;const t=v("article",void 0,"card");t.append(v("h2","Private campaign laboratory"),v("p",e),v("p","Open one of the two single-use tester invitations on this device. The resulting session stays separate from the other player's campaigns.","quiet")),xe.replaceChildren(t)}async function W(){const e=await fetch("/api/surface");if(e.status===401){qn();return}const t=await e.json(),n=t.surface_id==="ghostlight.compiler";if(ut.hidden=!n,Be.hidden=n,Se.hidden=n,xe.hidden=n,mt.hidden=n,n){N.textContent="No campaign exists. Retrieve the Vault and approve a world seed.";return}if(Z=Number(t.world_revision??t.version??0),$e=String(t.player_actor_id??""),!$e)throw new Error("Campaign surface omitted its canonical player actor ID.");const i=String(t.player_location_id??"");if(!i)throw new Error("Campaign surface omitted its canonical player location ID.");document.querySelector("#destination-origin").value=i,ce=Number(t.resolution?.policy?.resolution_epoch??0),pt=Number(t.resolution?.policy?.provider_configuration_epoch??0),se=t.resolution?.pins??[];const o=Number(t.resolution?.policy?.active_cell_budget??8),a=document.querySelector("#active-cell-budget");a.value=String(o),document.querySelector("#active-cell-budget-value").value=String(o),document.querySelector("#resolution-status").textContent=`${t.resolution?.effective_budget??o} effective cells · ${t.resolution?.mandatory_overage??0} temporary overage · epoch ${ce}`;const l=Number(t.resolution?.policy?.provider_parallelism??8);document.querySelector("#provider-parallelism").value=String(l),document.querySelector("#provider-parallelism-value").value=String(l);const s=document.querySelector("#pin-list");s.replaceChildren(),se.length===0&&s.append(v("p","No persistent pins."));for(const r of se){const d=v("p");d.append(v("code",String(r.kind)),document.createTextNode(` ${[...r.subject_ids].join(", ")} — ${r.reason} `));const u=v("button","Remove");u.type="button",u.addEventListener("click",async()=>{await oe({type:"replace_resolution_pins",expected_revision:Z,expected_resolution_epoch:ce,pins:se.filter(g=>g.id!==r.id)})}),d.append(u),s.append(d)}const f=document.querySelector("#fission-parent");f.replaceChildren(...(t.resolution?.fission_targets??[]).map(r=>{const d=v("option",`${r.name} · ${r.id}`);return d.value=r.id,d})),document.querySelector("#fission-form").hidden=f.options.length===0,ot(t,xe,{body:document.body,clientId:"ghostlight.browser",statusElement:N});const c=await fetch("/api/campaigns").then(r=>r.json());Bn.replaceChildren(...c.campaigns.map(r=>{const d=v("button",`${r.selected?"●":"○"} ${r.name} · revision ${r.revision}`);return d.type="button",d.disabled=!!r.selected,r.selected||d.addEventListener("click",async()=>{await B(`/api/campaigns/select/${r.id}`,{}),await W()}),d}))}async function B(e,t){return Ue(async()=>{N.textContent="Retrieving evidence and compiling…";const n=await fetch(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(t)}),i=n.headers.get("content-type")?.includes("json")?await n.json():await n.text();if(!n.ok)throw N.textContent=typeof i=="string"?i:String(i?.error??"Compilation failed"),new Error(N.textContent);return i})}function Qe(e,t,n){const i=v("div",void 0,"cards");e.forEach((o,a)=>{const l=v("article",void 0,"card");l.append(v("h3",o.title??o.name),v("p",o.player_hook??o.premise)),o.era&&l.append(v("p",`${o.era} · ${o.place} · ${o.pressure}`));const s=v("button",t);s.type="button",s.addEventListener("click",()=>n(e[a])),l.append(s),i.append(l)}),ft.replaceChildren(i)}function j(e,t,n){const i=v("details");i.append(v("summary",t));const o=v("ul");for(const a of n)o.append(v("li",a));n.length===0&&o.append(v("li","None declared.")),i.append(o),e.append(i)}document.querySelector("#suggest-form").addEventListener("submit",async e=>{e.preventDefault();const t=await B("/api/compiler/openings",{setting:document.querySelector("#setting").value,constraints:[]});Qe(t.openings,"Choose opening",async n=>{const i=await B("/api/compiler/roles",n);Qe(i.roles,"Choose role",async o=>gt(await B("/api/compiler/selected",{campaign_name:n.title,opening:n,role:o})))})});document.querySelector("#custom-form").addEventListener("submit",async e=>{e.preventDefault(),await gt(await B("/api/compiler/custom",Object.fromEntries(new FormData(e.currentTarget))))});async function gt(e){const t=e.preview,n=Array.isArray(t.evidence_coverage)?t.evidence_coverage:[],i=n.reduce((s,f)=>{const c=String(f?.lane??"excluded");return s[c]=(s[c]??0)+1,s},{}),o=v("article",void 0,"card");o.append(v("h3",t.title),v("p",t.opening??""),v("p",`${t.locations?.length??0} locations · ${(t.cast?.length??0)+1} actors · ${t.institutions?.length??0} institutions`),v("p",t.gaps.length?`Material gaps: ${t.gaps.join("; ")}`:"No declared material gaps.","warning"),v("p",`Branch assumptions: ${t.branch_assumptions.join("; ")||"none"}`),v("p",n.length?`Evidence use: ${i.direct_seed??0} direct · ${i.setting_background??0} background · ${i.excluded??0} excluded`:"Evidence use: no retrieved sources were admitted to this seed.","quiet"));const a=t.player_role??{};j(o,`Player role · ${a.name??"unnamed"}`,[`Starts at ${a.location_id??"an unspecified location"}`,...(a.capabilities??[]).map(s=>`Capability: ${s}`),...(a.equipment??[]).map(s=>`Equipment: ${s}`),...(a.conditions??[]).map(s=>`Condition: ${s}`),...(a.obligations??[]).map(s=>`Obligation: ${s}`)]),j(o,`Initial topology · ${t.locations?.length??0} locations`,(t.locations??[]).map(s=>{const f=Object.keys(s.routes??{});return`${s.name} · ${s.id}${s.container_id?` · inside ${s.container_id}`:""}${f.length?` · routes to ${f.join(", ")}`:" · no compiled route"}`})),j(o,`Present cast · ${t.cast?.length??0}`,(t.cast??[]).map(s=>`${s.name} · ${s.id} · at ${s.location_id}`)),j(o,`Institutions · ${t.institutions?.length??0}`,(t.institutions??[]).map(s=>`${s.name} · ${s.id}`)),j(o,`Populations · ${t.populations?.length??0}`,(t.populations??[]).map(s=>`${s.name} · ${s.id} · at ${s.home_location_id}`)),j(o,`World clocks · ${t.clocks?.length??0}`,(t.clocks??[]).map(s=>`${s.name} · ${s.progress}/${s.threshold} · ${s.trigger}`)),j(o,`Evidence coverage · ${n.length}`,n.map(s=>`${s.source_id} · ${String(s.lane).replaceAll("_"," ")} · ${s.rationale}`));const l=v("button","Approve and enter");l.type="button",l.addEventListener("click",async()=>{await B(`/api/compiler/approve/${e.preview_id}`,{}),await W()}),o.append(l),ft.replaceChildren(o),N.textContent="Preview compiled. Nothing has entered world state yet."}async function oe(e){return Ue(async()=>{N.textContent="The world is considering the command…";const t=await fetch("/api/command",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)}),n=await t.json();return Un(n),t.ok?(await W(),n):(N.textContent=n.error??"The command was refused.",await W(),n)})}function ht(e){if(e?.kind!=="assessed")return;const t=document.createElement("button");t.type="button",t.textContent=e.assessment.admissible?"Confirm server roll":"Revise attempt",t.addEventListener("click",async()=>{if(!e.assessment.admissible){document.querySelector("#attempt").focus();return}const n=await oe({type:"attempt",assessment_digest:e.assessment.digest});ht(n)}),q.append(t)}Be.addEventListener("submit",async e=>{e.preventDefault();const t=document.querySelector("#attempt").value.trim(),n=document.querySelector("#intended-effect").value.trim();!t||!n||ht(await oe({type:"assess",expected_revision:Z,intent:{actor_id:$e,description:t,intended_effect:n}}))});document.querySelector("#wait").addEventListener("click",()=>{oe({type:"wait",expected_revision:Z,minutes:60})});document.querySelector("#active-cell-budget").addEventListener("input",e=>{document.querySelector("#active-cell-budget-value").value=e.currentTarget.value});document.querySelector("#resolution-form").addEventListener("submit",async e=>{e.preventDefault(),await oe({type:"set_resolution_budget",expected_revision:Z,expected_resolution_epoch:ce,active_cell_budget:Number(document.querySelector("#active-cell-budget").value)})});document.querySelector("#provider-parallelism").addEventListener("input",e=>{document.querySelector("#provider-parallelism-value").value=e.currentTarget.value});document.querySelector("#provider-parallelism-form").addEventListener("submit",async e=>{e.preventDefault(),await Ue(async()=>{N.textContent="Applying the provider concurrency limit…";const t=await fetch("/api/operator/provider-parallelism",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({expected_provider_configuration_epoch:pt,provider_parallelism:Number(document.querySelector("#provider-parallelism").value)})}),n=await t.json();V(t.ok?"Provider concurrency updated":"Provider concurrency refused",[t.ok?`Parallel requests: ${n.receipt?.provider_parallelism??n.provider_parallelism??"updated"}`:n.error??"The operator limit was refused."]),t.ok||(N.textContent=n.error??"The operator limit was refused."),await W()})});document.querySelector("#pin-form").addEventListener("submit",async e=>{e.preventDefault();const t=new FormData(e.currentTarget),n=String(t.get("subject_ids")??"").split(",").map(o=>o.trim()).filter(Boolean),i={schema:"ghostlight.resolution_pin.v1",id:`pin:${crypto.randomUUID()}`,kind:String(t.get("kind")),subject_ids:n,reason:String(t.get("reason")??"").trim(),created_world_revision:Z};await oe({type:"replace_resolution_pins",expected_revision:Z,expected_resolution_epoch:ce,pins:[...se,i]})});Se.addEventListener("submit",async e=>{e.preventDefault();const t=await B("/api/compiler/destination",Object.fromEntries(new FormData(Se))),n=t.preview;V("Destination preview",(n.gaps??[]).map(o=>`Material gap: ${o}`)),j(q,`Compiled topology · ${n.locations?.length??0} locations`,(n.locations??[]).map(o=>{const a=Object.keys(o.routes??{}),l=[...o.persistent_features??[]];return`${o.name} · ${o.id}${o.container_id?` · inside ${o.container_id}`:""}${a.length?` · routes to ${a.join(", ")}`:" · no compiled route"}${l.length?` · ${l.join(", ")}`:""}`})),N.textContent="Destination preview compiled; topology is unchanged until approval.";const i=v("button","Approve destination");i.type="button",i.addEventListener("click",async()=>{await B(`/api/compiler/destination/approve/${t.preview_id}`,{}),i.remove(),await W()}),q.append(i)});document.querySelector("#fission-form").addEventListener("submit",async e=>{e.preventDefault();const t=new FormData(e.currentTarget),n=await B("/api/compiler/gestalt/fission",{parent_gestalt_id:t.get("parent_gestalt_id"),partition_axis:t.get("partition_axis"),requested_partition_values:String(t.get("requested_partition_values")??"").split(",").map(o=>o.trim()).filter(Boolean),reason:t.get("reason")});V("Population fission preview",[...(n.preview?.gaps??[]).map(o=>`Material gap: ${o}`)]),j(q,`Canonical child leaves · ${n.preview?.children?.length??0}`,(n.preview?.children??[]).map(o=>`${o.name} · ${o.id} · ${o.partition_value??"other/unknown"} · at ${o.home_location_id}`)),N.textContent="Fission preview compiled. Canonical leaves are unchanged until approval.";const i=document.createElement("button");i.type="button",i.textContent="Approve population fission",i.addEventListener("click",async()=>{await B(`/api/compiler/gestalt/fission/approve/${n.preview_id}`,{}),i.remove(),await W()}),q.append(i)});document.querySelector("#fork-form").addEventListener("submit",async e=>{e.preventDefault(),await B("/api/campaigns/fork",Object.fromEntries(new FormData(e.currentTarget))),await W()});document.querySelector("#reset-form").addEventListener("submit",async e=>{e.preventDefault(),await B("/api/campaigns/reset",Object.fromEntries(new FormData(e.currentTarget))),await W()});document.querySelector("#load-operator").addEventListener("click",async()=>{const t=await(await fetch("/api/operator")).json();ot(t,document.querySelector("#operator-output"),{body:document.body,clientId:"ghostlight.operator",statusElement:N})});W(); diff --git a/web/dist/index.html b/web/dist/index.html index f557d9c..0a37d96 100644 --- a/web/dist/index.html +++ b/web/dist/index.html @@ -1,5 +1,5 @@ -GhostlightDungeon +GhostlightDungeon

STARFIRE / PRIVATE VERSE

GhostlightDungeon

Reading the world…

@@ -8,7 +8,7 @@

Or describe your own beginning

Speech can happen even when persuasion, deception, or intimidation fails.

-

Compile a destination without moving there

+

Compile a destination without moving there

Speech can happen even when persuasion, deception, or intimidation fails.

-

Compile a destination without moving there

+

Compile a destination without moving there