import type { CrowdyStudioAgentStateV1 } from '../crowdy-agent/controller.js'; import type { PlayerControlGate } from './control-gate.js'; export interface AgentControlBannerController { getState(): CrowdyStudioAgentStateV1; subscribe(listener: (state: CrowdyStudioAgentStateV1) => void): () => void; } /** * Always-visible-on-control safety surface outside the Studio dock. Text, * status, Pause, and Stop remain keyboard/screen-reader accessible over the * game canvas; Stop clears locally before any transport promise is attempted. */ export declare class AgentControlBanner { private readonly gate; readonly root: HTMLElement; private readonly summary; private readonly expiry; private readonly pauseButton; private readonly stopButton; private controller; private agentState; private gateState; private unsubscribeAgent; private unsubscribeGate; private readonly countdown; constructor(parent: HTMLElement, gate: PlayerControlGate); bind(controller: AgentControlBannerController): () => void; showUnavailable(message: string): void; unbind(): void; destroy(): void; private render; } export declare function ensureAgentControlBannerStyles(doc?: Document | null): void; /** * Injected presentation for the visible lease safety surface. Games that * dock a studio can set `--ck-game-right-inset` on `document.body` so the * banner keeps clear of the dock (the Crowdy Studio embed kit does this * automatically). */ export declare const AGENT_CONTROL_BANNER_STYLES = "\n.ck-agent-control-banner {\n position: fixed;\n top: 12px;\n right: calc(12px + var(--ck-game-right-inset, 0px));\n z-index: 65;\n display: grid;\n grid-template-columns: auto minmax(180px, 1fr) auto auto;\n align-items: center;\n gap: 10px;\n max-width: min(760px, calc(100vw - var(--ck-game-right-inset, 0px) - 24px));\n padding: 9px 10px;\n border: 1px solid rgba(110, 231, 183, 0.65);\n border-radius: 10px;\n color: #ecfdf5;\n background: rgba(2, 44, 34, 0.94);\n box-shadow: 0 12px 30px rgba(2, 6, 23, 0.45);\n pointer-events: auto;\n}\n\n.ck-agent-control-banner[hidden] {\n display: none;\n}\n\n.ck-agent-control-banner[data-state=\"unavailable\"] {\n border-color: rgba(251, 191, 36, 0.65);\n background: rgba(69, 26, 3, 0.94);\n}\n\n.ck-agent-control-summary,\n.ck-agent-control-expiry {\n overflow: hidden;\n color: #d1fae5;\n font-size: 12px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.ck-agent-control-expiry {\n color: #a7f3d0;\n}\n\n.ck-agent-control-actions {\n display: flex;\n gap: 6px;\n}\n\n.ck-agent-control-actions button {\n padding: 6px 9px;\n border: 1px solid rgba(167, 243, 208, 0.5);\n border-radius: 7px;\n color: #ecfdf5;\n background: rgba(6, 78, 59, 0.85);\n cursor: pointer;\n}\n\n.ck-agent-control-actions .ck-agent-control-stop {\n border-color: rgba(254, 202, 202, 0.75);\n background: rgba(153, 27, 27, 0.9);\n}\n\n.ck-agent-control-actions button:focus-visible {\n outline: 2px solid #fef3c7;\n outline-offset: 2px;\n}\n\n@media (max-width: 900px) {\n .ck-agent-control-banner {\n right: 8px;\n left: 8px;\n grid-template-columns: auto minmax(0, 1fr) auto;\n max-width: none;\n }\n\n .ck-agent-control-expiry {\n display: none;\n }\n}\n\n@media (max-width: 620px) {\n .ck-agent-control-banner {\n grid-template-columns: minmax(0, 1fr) auto;\n }\n\n .ck-agent-control-banner > strong {\n display: none;\n }\n}\n"; //# sourceMappingURL=control-banner.d.ts.map