@spotpatch/runtime 1.15.3 → 1.15.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/motion-controller.ts","../src/ui/execution-island.ts","../src/motion-entry.ts"],"sourcesContent":["import { gsap } from \"gsap\";\n\nimport type {\n FloatingSurfaceMotionController,\n FloatingSurfaceMotionElements,\n FloatingSurfaceProjection,\n} from \"./motion-extension-contract.js\";\n\nconst MOTION = Object.freeze({\n contentMilliseconds: 220,\n detailRevealDelaySeconds: 0.1,\n detailRevealSeconds: 0.3,\n detailRetireSeconds: 0.15,\n dispatchSeconds: 0.54,\n expandSeconds: 0.54,\n morphSeconds: 0.48,\n pressSeconds: 0.12,\n revealSeconds: 0.26,\n sceneRevealDelaySeconds: 0.06,\n sweepSeconds: 0.68,\n targetFeedbackDelaySeconds: 0.08,\n targetFeedbackSeconds: 0.22,\n});\n\nconst ISLAND_SIZE = Object.freeze({\n checkingWidth: 440,\n compactHeight: 62,\n dispatchingWidth: 448,\n expandedHeight: 164,\n expandedWidth: 520,\n failedWidth: 440,\n receivingWidth: 430,\n runningWidth: 468,\n successWidth: 356,\n});\n\ninterface PendingProjection {\n readonly projection: FloatingSurfaceProjection;\n readonly renderContent: () => void;\n}\n\ninterface SurfaceGeometry {\n readonly borderRadius: string;\n readonly rect: DOMRect;\n}\n\ninterface ElementOffset {\n readonly x: number;\n readonly y: number;\n}\n\ninterface SurfaceLayout {\n readonly geometry: SurfaceGeometry;\n readonly sharedOffsets: ReadonlyMap<HTMLElement, ElementOffset>;\n}\n\ntype DetailTransition = \"collapse\" | \"expand\" | undefined;\n\ntype SurfaceLayer = \"execution\" | \"pill\" | \"planner\";\n\nfunction surfaceLayer(scene: FloatingSurfaceProjection[\"scene\"]): SurfaceLayer {\n if (scene === \"pill\" || scene === \"capturing\") return \"pill\";\n if (scene === \"planner\") return \"planner\";\n return \"execution\";\n}\n\nfunction setSceneVisibility(\n elements: FloatingSurfaceMotionElements,\n projection: FloatingSurfaceProjection,\n): HTMLElement {\n const pillActive = projection.scene === \"pill\" || projection.scene === \"capturing\";\n const plannerActive = projection.scene === \"planner\";\n const executionActive = !pillActive && !plannerActive;\n\n elements.pill.hidden = !pillActive;\n elements.pill.inert = !pillActive;\n elements.planner.hidden = !plannerActive;\n elements.planner.inert = !plannerActive;\n elements.planner.setAttribute(\"aria-hidden\", String(!plannerActive));\n elements.execution.root.hidden = !executionActive;\n elements.execution.root.inert = !executionActive;\n elements.execution.root.setAttribute(\"aria-hidden\", String(!executionActive));\n\n return pillActive\n ? elements.pill\n : plannerActive\n ? elements.planner\n : elements.execution.root;\n}\n\nfunction supportsMotion(document: Document): boolean {\n return (\n document.defaultView?.matchMedia(\"(prefers-reduced-motion: reduce)\").matches !==\n true\n );\n}\n\nfunction finiteRect(rect: DOMRect): boolean {\n return (\n Number.isFinite(rect.left) &&\n Number.isFinite(rect.top) &&\n rect.width > 0 &&\n rect.height > 0\n );\n}\n\nfunction geometryChanged(previous: DOMRect, next: DOMRect): boolean {\n return (\n Math.abs(previous.left - next.left) > 0.5 ||\n Math.abs(previous.top - next.top) > 0.5 ||\n Math.abs(previous.width - next.width) > 0.5 ||\n Math.abs(previous.height - next.height) > 0.5\n );\n}\n\nfunction visibleBorderRadius(value: string | undefined, rect: DOMRect): string {\n if (value === undefined || value.length === 0) return \"0px\";\n const radius = Number.parseFloat(value);\n if (!Number.isFinite(radius) || !finiteRect(rect)) return value;\n return `${String(Math.min(radius, rect.width / 2, rect.height / 2))}px`;\n}\n\nfunction compactIslandWidth(projection: FloatingSurfaceProjection): number {\n if (projection.scene === \"agent-charging\") return ISLAND_SIZE.receivingWidth;\n if (projection.scene === \"handoff\") return ISLAND_SIZE.dispatchingWidth;\n if (projection.scene === \"success\") return ISLAND_SIZE.successWidth;\n if (projection.scene === \"failed\") return ISLAND_SIZE.failedWidth;\n if (projection.scene === \"running\" && projection.activity?.kind === \"check\") {\n return ISLAND_SIZE.checkingWidth;\n }\n return ISLAND_SIZE.runningWidth;\n}\n\nexport function createFloatingSurfaceMotionStyles(\n document: Document,\n): HTMLStyleElement {\n const style = document.createElement(\"style\");\n style.textContent = `\n .spotpatch-floating-surface {\n --spotpatch-island-surface: #050608;\n --spotpatch-island-primary: #f7f7fb;\n --spotpatch-island-subtle: #5f646e;\n --spotpatch-island-line: rgb(255 255 255 / 10%);\n --spotpatch-island-violet: #8b67ff;\n --spotpatch-island-cyan: #4dc8ff;\n --spotpatch-island-mint: #59dcb6;\n --spotpatch-island-error: #ef6f88;\n --spotpatch-island-compact-height: ${String(ISLAND_SIZE.compactHeight)}px;\n --spotpatch-island-compact-width: ${String(ISLAND_SIZE.runningWidth)}px;\n --spotpatch-island-expanded-height: ${String(ISLAND_SIZE.expandedHeight)}px;\n --spotpatch-island-expanded-width: ${String(ISLAND_SIZE.expandedWidth)}px;\n --spotpatch-island-ease: cubic-bezier(.22, 1, .36, 1);\n position: fixed;\n box-sizing: border-box;\n color-scheme: dark;\n -webkit-font-smoothing: antialiased;\n overflow: hidden;\n border: 1px solid var(--spotpatch-island-line);\n background:\n linear-gradient(180deg, rgb(255 255 255 / 2.8%), transparent 24%),\n rgb(5 6 8 / 98.8%);\n box-shadow:\n 0 24px 60px rgb(13 17 28 / 18%),\n 0 3px 10px rgb(13 17 28 / 10%),\n inset 0 1px rgb(255 255 255 / 6.5%),\n inset 0 0 0 1px rgb(255 255 255 / 1.2%);\n transform-origin: 100% 100%;\n }\n .spotpatch-floating-surface::before {\n position: absolute;\n z-index: 0;\n inset: 0;\n background:\n radial-gradient(180px 70px at 0% 50%, rgb(139 103 255 / 7%), transparent 72%),\n radial-gradient(180px 70px at 100% 50%, rgb(77 200 255 / 4.5%), transparent 72%);\n content: \"\";\n opacity: 0;\n pointer-events: none;\n }\n .spotpatch-floating-surface[data-scene=\"pill\"],\n .spotpatch-floating-surface[data-scene=\"capturing\"] {\n width: max-content;\n border-radius: 999px;\n }\n .spotpatch-floating-surface[data-scene=\"planner\"] { border-radius: 18px; }\n .spotpatch-floating-surface[data-scene=\"agent-charging\"],\n .spotpatch-floating-surface[data-scene=\"handoff\"],\n .spotpatch-floating-surface[data-scene=\"running\"],\n .spotpatch-floating-surface[data-scene=\"success\"],\n .spotpatch-floating-surface[data-scene=\"failed\"] {\n width: min(var(--spotpatch-island-compact-width), calc(100vw - 32px));\n height: var(--spotpatch-island-compact-height);\n max-width: calc(100vw - 32px);\n border-radius: 31px;\n }\n .spotpatch-floating-surface[data-scene=\"agent-charging\"]::before,\n .spotpatch-floating-surface[data-scene=\"handoff\"]::before,\n .spotpatch-floating-surface[data-scene=\"running\"]::before,\n .spotpatch-floating-surface[data-scene=\"success\"]::before,\n .spotpatch-floating-surface[data-scene=\"failed\"]::before { opacity: .82; }\n .spotpatch-floating-surface:has(.spotpatch-execution-island[data-expanded=\"true\"]) {\n width: min(var(--spotpatch-island-expanded-width), calc(100vw - 32px));\n height: min(var(--spotpatch-island-expanded-height), calc(100vh - 32px));\n border-radius: 30px;\n }\n .spotpatch-floating-surface > .spotpatch-trigger,\n .spotpatch-floating-surface > .spotpatch-dialog,\n .spotpatch-floating-surface > .spotpatch-execution-island {\n position: relative;\n z-index: 1;\n }\n .spotpatch-floating-surface > .spotpatch-trigger {\n display: inline-flex;\n min-height: 44px;\n align-items: center;\n gap: 10px;\n border: 0;\n border-radius: 999px;\n padding: 10px 17px;\n color: #f8fafc;\n background: transparent;\n box-shadow: none;\n cursor: pointer;\n font-size: 14px;\n font-weight: 650;\n touch-action: none;\n user-select: none;\n }\n .spotpatch-trigger::before {\n width: 9px;\n height: 9px;\n border-radius: 999px;\n background: var(--spotpatch-accent);\n box-shadow: 0 0 0 4px rgb(99 102 241 / 10%);\n content: \"\";\n }\n .spotpatch-trigger:hover { transform: translateY(-1px); }\n .spotpatch-trigger[aria-pressed=\"true\"] { background: rgb(139 123 255 / 14%); }\n .spotpatch-trigger[aria-pressed=\"true\"]::before {\n animation: spotpatch-motion-pill-pulse 1.8s ease-in-out infinite;\n }\n .spotpatch-trigger[data-dragging=\"true\"] {\n cursor: grabbing;\n transform: scale(.98);\n }\n .spotpatch-floating-surface .spotpatch-dialog { filter: none; }\n .spotpatch-floating-surface .spotpatch-shell {\n border: 0;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n }\n .spotpatch-brand-name {\n color: #fff;\n font-size: 13.5px;\n font-weight: 680;\n letter-spacing: -.01em;\n }\n .spotpatch-brand-context {\n color: #8e98aa;\n font-size: 10.5px;\n font-weight: 560;\n letter-spacing: .02em;\n }\n .spotpatch-title {\n margin: 0;\n color: #fff;\n font-size: 18px;\n font-weight: 680;\n letter-spacing: -.015em;\n }\n .spotpatch-subtitle {\n max-width: 390px;\n margin: 4px 0 0;\n color: var(--spotpatch-text-secondary);\n font-size: 12.5px;\n line-height: 1.5;\n }\n .spotpatch-execution-island {\n position: relative;\n display: grid;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n gap: 12px;\n overflow: hidden;\n border: 0;\n border-radius: inherit;\n padding: 0 18px;\n color: var(--spotpatch-island-primary);\n background: transparent;\n cursor: pointer;\n text-align: left;\n touch-action: none;\n }\n .spotpatch-execution-island[data-expanded=\"true\"] {\n min-height: var(--spotpatch-island-expanded-height);\n grid-template-columns: auto minmax(0, 1fr) auto;\n grid-template-rows: auto 1fr;\n align-items: start;\n row-gap: 16px;\n border-radius: 30px;\n padding: 18px 20px 16px;\n }\n .spotpatch-execution-mark {\n display: grid;\n width: 23px;\n height: 23px;\n flex: none;\n place-items: center;\n }\n .spotpatch-execution-logo {\n width: 22px;\n height: 22px;\n overflow: visible;\n filter: drop-shadow(0 0 7px rgb(139 103 255 / 16%));\n }\n .spotpatch-execution-content {\n display: flex;\n min-width: 0;\n align-items: baseline;\n gap: 8px;\n }\n [data-expanded=\"true\"] .spotpatch-execution-content {\n display: grid;\n gap: 4px;\n }\n .spotpatch-execution-headline-wrap,\n .spotpatch-execution-action-wrap {\n position: relative;\n display: block;\n min-width: 0;\n }\n .spotpatch-execution-headline,\n .spotpatch-execution-headline-outgoing,\n .spotpatch-execution-action,\n .spotpatch-execution-action-outgoing {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .spotpatch-execution-headline,\n .spotpatch-execution-headline-outgoing {\n color: var(--spotpatch-island-primary);\n font-size: 15px;\n font-weight: 690;\n letter-spacing: -.018em;\n line-height: 1.35;\n }\n .spotpatch-execution-action,\n .spotpatch-execution-action-outgoing {\n color: #696f79;\n font-size: 11px;\n font-weight: 400;\n line-height: 1.35;\n }\n .spotpatch-execution-headline-outgoing,\n .spotpatch-execution-action-outgoing {\n position: absolute;\n inset: 0;\n opacity: 0;\n pointer-events: none;\n }\n .spotpatch-execution-copy-changing .spotpatch-execution-headline,\n .spotpatch-execution-copy-changing .spotpatch-execution-action {\n animation: spotpatch-motion-copy-in ${String(MOTION.contentMilliseconds)}ms var(--spotpatch-island-ease) both;\n }\n .spotpatch-execution-copy-changing .spotpatch-execution-headline-outgoing,\n .spotpatch-execution-copy-changing .spotpatch-execution-action-outgoing {\n animation: spotpatch-motion-copy-out ${String(MOTION.contentMilliseconds)}ms ease-in both;\n }\n .spotpatch-execution-meta {\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n gap: 10px;\n flex: none;\n color: #989da8;\n font-size: 11px;\n font-weight: 620;\n white-space: nowrap;\n }\n .spotpatch-execution-meta-dot {\n width: 6px;\n height: 6px;\n flex: none;\n border-radius: 50%;\n background: var(--spotpatch-island-violet);\n box-shadow: 0 0 8px rgb(139 103 255 / 38%);\n }\n [data-execution-scene=\"agent-charging\"] .spotpatch-execution-meta-dot,\n [data-execution-scene=\"handoff\"] .spotpatch-execution-meta-dot,\n [data-execution-scene=\"running\"] .spotpatch-execution-meta-dot {\n animation: spotpatch-motion-status-breathe 1.8s ease-in-out infinite;\n }\n .spotpatch-execution-meta[data-tone=\"success\"] .spotpatch-execution-meta-dot {\n background: var(--spotpatch-island-mint);\n box-shadow: 0 0 8px rgb(89 220 182 / 24%);\n }\n .spotpatch-execution-meta[data-tone=\"danger\"] .spotpatch-execution-meta-dot {\n background: var(--spotpatch-island-error);\n box-shadow: 0 0 8px rgb(239 111 136 / 22%);\n }\n .spotpatch-execution-timer {\n width: 34px;\n color: #737985;\n font: 400 10px/1 ui-monospace, SFMono-Regular, Menlo, monospace;\n text-align: right;\n }\n .spotpatch-execution-more {\n display: grid;\n width: 24px;\n height: 24px;\n padding: 0;\n border: 0;\n background: transparent;\n color: #686e78;\n font-size: 15px;\n line-height: 1;\n place-items: center;\n }\n [data-expanded=\"true\"] .spotpatch-execution-meta-dot,\n [data-expanded=\"true\"] .spotpatch-execution-meta-label,\n [data-expanded=\"true\"] .spotpatch-execution-timer { display: none; }\n [data-expanded=\"true\"] .spotpatch-execution-more {\n width: 28px;\n height: 28px;\n border-radius: 50%;\n background: rgb(255 255 255 / 4.5%);\n color: #828894;\n }\n .spotpatch-execution-recent {\n position: absolute;\n top: 62px;\n right: 20px;\n left: 20px;\n display: grid;\n margin-top: 0;\n }\n .spotpatch-execution-recent[hidden] { display: none; }\n .spotpatch-execution-recent-item {\n display: grid;\n min-height: 28px;\n grid-template-columns: 52px minmax(0, 1fr) auto;\n align-items: center;\n border-top: 1px solid rgb(255 255 255 / 5.5%);\n }\n .spotpatch-execution-recent-item:first-child { border-top: 0; }\n .spotpatch-execution-recent-kind {\n color: #666c76;\n font: 600 10px/1 ui-monospace, SFMono-Regular, Menlo, monospace;\n text-transform: uppercase;\n }\n .spotpatch-execution-recent-detail {\n overflow: hidden;\n color: #b2b6bf;\n font-size: 11px;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .spotpatch-execution-recent-state {\n color: #626974;\n font: 500 10px/1 ui-monospace, SFMono-Regular, Menlo, monospace;\n }\n .spotpatch-execution-recent-item[data-state=\"active\"] .spotpatch-execution-recent-kind {\n color: var(--spotpatch-island-violet);\n }\n .spotpatch-execution-recent-item[data-state=\"active\"] .spotpatch-execution-recent-detail {\n color: #f2f3f7;\n }\n .spotpatch-execution-recent-item[data-state=\"failure\"] .spotpatch-execution-recent-kind {\n color: var(--spotpatch-island-error);\n }\n .spotpatch-island-sweep {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 44px;\n width: 20%;\n height: 1px;\n border-radius: 999px;\n background: linear-gradient(90deg, transparent, var(--spotpatch-island-violet), var(--spotpatch-island-cyan), transparent);\n box-shadow: 0 0 7px rgb(139 103 255 / 18%);\n opacity: 0;\n pointer-events: none;\n transform: translate3d(-160%, 0, 0);\n }\n @keyframes spotpatch-motion-copy-in {\n from { opacity: 0; filter: blur(2px); transform: translate3d(0, 3px, 0); }\n to { opacity: 1; filter: blur(0); transform: translate3d(0, 0, 0); }\n }\n @keyframes spotpatch-motion-copy-out {\n from { opacity: 1; filter: blur(0); transform: translate3d(0, 0, 0); }\n to { opacity: 0; filter: blur(2px); transform: translate3d(0, -3px, 0); }\n }\n @keyframes spotpatch-motion-status-breathe {\n 50% { opacity: .42; transform: scale(.82); }\n }\n @keyframes spotpatch-motion-pill-pulse {\n 50% { box-shadow: 0 0 0 6px rgb(99 102 241 / 5%); opacity: .72; }\n }\n .spotpatch-floating-surface[data-motion-paused=\"true\"] .spotpatch-execution-meta-dot,\n .spotpatch-floating-surface[data-motion-paused=\"true\"] .spotpatch-trigger::before {\n animation-play-state: paused;\n }\n @media (prefers-reduced-motion: reduce) {\n .spotpatch-trigger::before,\n .spotpatch-execution-meta-dot,\n .spotpatch-execution-headline,\n .spotpatch-execution-headline-outgoing,\n .spotpatch-execution-action,\n .spotpatch-execution-action-outgoing {\n animation: none !important;\n filter: none !important;\n transform: none !important;\n }\n .spotpatch-island-sweep { display: none; }\n }\n @media (max-width: 520px) {\n .spotpatch-execution-island {\n grid-template-columns: auto minmax(0, 1fr) auto;\n gap: 10px;\n padding-right: 14px;\n padding-left: 14px;\n }\n .spotpatch-execution-action-wrap { display: none; }\n .spotpatch-execution-recent-item { grid-template-columns: 48px minmax(0, 1fr); }\n .spotpatch-execution-recent-state { display: none; }\n }\n `;\n return style;\n}\n\nexport function createFloatingSurfaceMotionController(\n document: Document,\n elements: FloatingSurfaceMotionElements,\n reconcile: () => void,\n): FloatingSurfaceMotionController {\n let currentScene: FloatingSurfaceProjection[\"scene\"] | undefined;\n let currentActivityKey: string | undefined;\n let morphTimeline: gsap.core.Timeline | undefined;\n let dispatchTimeline: gsap.core.Timeline | undefined;\n let pendingProjection: PendingProjection | undefined;\n let dispatchSource: HTMLElement | undefined;\n let dispatchTarget: HTMLElement | undefined;\n let disposed = false;\n\n const handleVisibility = (): void => {\n elements.surface.dataset.motionPaused = String(document.hidden);\n };\n document.addEventListener(\"visibilitychange\", handleVisibility);\n handleVisibility();\n\n const morphElements = [\n elements.surface,\n elements.pill,\n elements.planner,\n elements.execution.root,\n elements.execution.mark,\n elements.execution.content,\n elements.execution.meta,\n elements.execution.recent,\n ];\n\n const sharedExecutionElements = [\n elements.execution.mark,\n elements.execution.content,\n elements.execution.meta,\n ];\n\n function captureSurfaceLayout(includeSharedOffsets = false): SurfaceLayout {\n const surfaceRect = elements.surface.getBoundingClientRect();\n const computedRadius = document.defaultView\n ?.getComputedStyle(elements.surface)\n .borderRadius.trim();\n\n const sharedOffsets = new Map<HTMLElement, ElementOffset>();\n if (includeSharedOffsets && finiteRect(surfaceRect)) {\n for (const element of sharedExecutionElements) {\n const elementRect = element.getBoundingClientRect();\n if (!finiteRect(elementRect)) continue;\n sharedOffsets.set(\n element,\n Object.freeze({\n x: elementRect.left - surfaceRect.left,\n y: elementRect.top - surfaceRect.top,\n }),\n );\n }\n }\n\n return Object.freeze({\n geometry: Object.freeze({\n borderRadius: visibleBorderRadius(computedRadius, surfaceRect),\n rect: surfaceRect,\n }),\n sharedOffsets,\n });\n }\n\n function syncRecentVisibility(): void {\n elements.execution.recent.hidden =\n elements.execution.root.dataset.expanded !== \"true\";\n }\n\n function clearMorphProperties(): void {\n gsap.set(morphElements, {\n clearProps:\n \"borderRadius,filter,height,opacity,transform,visibility,width,willChange\",\n });\n delete elements.surface.dataset.motionMorphing;\n syncRecentVisibility();\n }\n\n function clearMorph(): void {\n morphTimeline?.kill();\n morphTimeline = undefined;\n gsap.killTweensOf(morphElements);\n clearMorphProperties();\n }\n\n function interruptMorph(includeSharedOffsets = false): SurfaceLayout {\n morphTimeline?.kill();\n morphTimeline = undefined;\n gsap.killTweensOf(morphElements);\n const layout = captureSurfaceLayout(includeSharedOffsets);\n clearMorphProperties();\n return layout;\n }\n\n function clearDispatch(): void {\n dispatchTimeline?.kill();\n dispatchTimeline = undefined;\n if (dispatchSource !== undefined) {\n gsap.killTweensOf(dispatchSource);\n gsap.set(dispatchSource, { clearProps: \"filter,transform\" });\n dispatchSource = undefined;\n }\n if (dispatchTarget !== undefined) {\n gsap.killTweensOf(dispatchTarget);\n gsap.set(dispatchTarget, { clearProps: \"boxShadow\" });\n dispatchTarget = undefined;\n }\n elements.surface.dataset.agentCharging = \"false\";\n }\n\n function completeDispatch(): void {\n dispatchTimeline = undefined;\n if (dispatchSource !== undefined) {\n gsap.set(dispatchSource, { clearProps: \"filter,transform\" });\n dispatchSource = undefined;\n }\n if (dispatchTarget !== undefined) {\n gsap.set(dispatchTarget, { clearProps: \"boxShadow\" });\n dispatchTarget = undefined;\n }\n elements.surface.dataset.agentCharging = \"false\";\n }\n\n function sweepOnce(): void {\n if (!supportsMotion(document) || document.hidden) return;\n gsap.killTweensOf(elements.execution.sweep);\n gsap.fromTo(\n elements.execution.sweep,\n { autoAlpha: 0, xPercent: -160 },\n {\n autoAlpha: 0.72,\n xPercent: 620,\n duration: MOTION.sweepSeconds,\n ease: \"power2.inOut\",\n onComplete: () => {\n gsap.set(elements.execution.sweep, {\n clearProps: \"opacity,transform,visibility\",\n });\n },\n },\n );\n }\n\n function animateGeometry(\n previous: SurfaceLayout,\n next: SurfaceLayout,\n activeScene: HTMLElement,\n reveal: boolean,\n detailTransition?: DetailTransition,\n ): void {\n const geometryHasChanged =\n geometryChanged(previous.geometry.rect, next.geometry.rect) ||\n previous.geometry.borderRadius !== next.geometry.borderRadius;\n const sharedLayoutHasChanged = sharedExecutionElements.some((element) => {\n const previousOffset = previous.sharedOffsets.get(element);\n const nextOffset = next.sharedOffsets.get(element);\n return (\n previousOffset !== undefined &&\n nextOffset !== undefined &&\n (Math.abs(previousOffset.x - nextOffset.x) > 0.5 ||\n Math.abs(previousOffset.y - nextOffset.y) > 0.5)\n );\n });\n\n if (\n !supportsMotion(document) ||\n !finiteRect(previous.geometry.rect) ||\n !finiteRect(next.geometry.rect) ||\n (!geometryHasChanged && !sharedLayoutHasChanged && detailTransition === undefined)\n ) {\n clearMorphProperties();\n return;\n }\n\n const morphDuration =\n detailTransition === \"expand\" ? MOTION.expandSeconds : MOTION.morphSeconds;\n elements.surface.dataset.motionMorphing = \"true\";\n morphTimeline = gsap.timeline({\n defaults: { overwrite: \"auto\" },\n onComplete: () => {\n clearMorphProperties();\n reconcile();\n morphTimeline = undefined;\n },\n });\n\n if (geometryHasChanged) {\n morphTimeline.fromTo(\n elements.surface,\n {\n borderRadius: previous.geometry.borderRadius,\n height: previous.geometry.rect.height,\n width: previous.geometry.rect.width,\n x: previous.geometry.rect.left - next.geometry.rect.left,\n y: previous.geometry.rect.top - next.geometry.rect.top,\n willChange: \"width,height,transform\",\n },\n {\n borderRadius: next.geometry.borderRadius,\n height: next.geometry.rect.height,\n width: next.geometry.rect.width,\n x: 0,\n y: 0,\n duration: morphDuration,\n ease: \"expo.inOut\",\n },\n 0,\n );\n }\n\n for (const element of sharedExecutionElements) {\n const previousOffset = previous.sharedOffsets.get(element);\n const nextOffset = next.sharedOffsets.get(element);\n if (previousOffset === undefined || nextOffset === undefined) continue;\n const x = previousOffset.x - nextOffset.x;\n const y = previousOffset.y - nextOffset.y;\n if (Math.abs(x) <= 0.5 && Math.abs(y) <= 0.5) continue;\n morphTimeline.fromTo(\n element,\n { x, y, willChange: \"transform\" },\n {\n x: 0,\n y: 0,\n duration: morphDuration,\n ease: \"expo.inOut\",\n },\n 0,\n );\n }\n\n if (detailTransition === \"expand\") {\n morphTimeline.fromTo(\n elements.execution.recent,\n { autoAlpha: 0, filter: \"blur(4px)\", y: 6 },\n {\n autoAlpha: 1,\n filter: \"blur(0px)\",\n y: 0,\n duration: MOTION.detailRevealSeconds,\n ease: \"power3.out\",\n },\n MOTION.detailRevealDelaySeconds,\n );\n } else if (detailTransition === \"collapse\") {\n morphTimeline.fromTo(\n elements.execution.recent,\n { autoAlpha: 1, filter: \"blur(0px)\", y: 0 },\n {\n autoAlpha: 0,\n filter: \"blur(3px)\",\n y: -4,\n duration: MOTION.detailRetireSeconds,\n ease: \"power2.in\",\n },\n 0,\n );\n }\n\n if (reveal) {\n morphTimeline.fromTo(\n activeScene,\n { autoAlpha: 0, y: 4 },\n {\n autoAlpha: 1,\n y: 0,\n duration: MOTION.revealSeconds,\n ease: \"power2.out\",\n clearProps: \"transform,opacity,visibility\",\n },\n MOTION.sceneRevealDelaySeconds,\n );\n }\n }\n\n function applyProjection(\n projection: FloatingSurfaceProjection,\n renderContent: () => void,\n ): void {\n if (disposed) return;\n const previousScene = currentScene;\n const sceneChanged = previousScene !== projection.scene;\n const layerChanged =\n previousScene === undefined ||\n surfaceLayer(previousScene) !== surfaceLayer(projection.scene);\n const wasExpanded = elements.execution.root.dataset.expanded === \"true\";\n const executionRemainsActive =\n previousScene !== undefined &&\n surfaceLayer(previousScene) === \"execution\" &&\n surfaceLayer(projection.scene) === \"execution\";\n const preserveInterruptedSharedLayout =\n executionRemainsActive && (wasExpanded || morphTimeline?.isActive() === true);\n const previousGeometry = interruptMorph(preserveInterruptedSharedLayout);\n const activityChanged = currentActivityKey !== projection.activity?.key;\n\n elements.surface.dataset.scene = projection.scene;\n elements.surface.dataset.tone = projection.tone;\n elements.surface.style.setProperty(\n \"--spotpatch-island-compact-width\",\n `${String(compactIslandWidth(projection))}px`,\n );\n renderContent();\n const activeScene = setSceneVisibility(elements, projection);\n const isExpanded = elements.execution.root.dataset.expanded === \"true\";\n const detailTransition: DetailTransition =\n executionRemainsActive && wasExpanded && !isExpanded ? \"collapse\" : undefined;\n if (detailTransition === \"collapse\") {\n elements.execution.recent.hidden = false;\n }\n reconcile();\n const nextGeometry = captureSurfaceLayout(\n preserveInterruptedSharedLayout || detailTransition !== undefined,\n );\n currentScene = projection.scene;\n currentActivityKey = projection.activity?.key;\n animateGeometry(\n previousGeometry,\n nextGeometry,\n activeScene,\n layerChanged,\n detailTransition,\n );\n\n const executionActive =\n projection.scene === \"handoff\" ||\n projection.scene === \"running\" ||\n projection.scene === \"success\" ||\n projection.scene === \"failed\";\n if (executionActive && (sceneChanged || activityChanged)) sweepOnce();\n }\n\n function updateLayout(updateContent: () => void): void {\n if (disposed) return;\n const wasExpanded = elements.execution.root.dataset.expanded === \"true\";\n const previousGeometry = interruptMorph(true);\n updateContent();\n const isExpanded = elements.execution.root.dataset.expanded === \"true\";\n const detailTransition: DetailTransition = wasExpanded\n ? isExpanded\n ? undefined\n : \"collapse\"\n : isExpanded\n ? \"expand\"\n : undefined;\n if (detailTransition === \"collapse\") {\n elements.execution.recent.hidden = false;\n }\n reconcile();\n const nextGeometry = captureSurfaceLayout(true);\n const activeScene = elements.execution.root.hidden\n ? elements.planner.hidden\n ? elements.pill\n : elements.planner\n : elements.execution.root;\n animateGeometry(\n previousGeometry,\n nextGeometry,\n activeScene,\n false,\n detailTransition,\n );\n }\n\n function cancel(): void {\n pendingProjection = undefined;\n clearMorph();\n clearDispatch();\n gsap.killTweensOf(elements.execution.sweep);\n gsap.set(elements.execution.sweep, {\n clearProps: \"opacity,transform,visibility\",\n });\n }\n\n function render(\n projection: FloatingSurfaceProjection,\n renderContent: () => void,\n ): void {\n if (disposed) return;\n const dispatchActive = dispatchTimeline?.isActive() === true;\n const leavesChargingScene =\n projection.scene !== \"planner\" && projection.scene !== \"agent-charging\";\n\n if (dispatchActive && currentScene === \"agent-charging\" && leavesChargingScene) {\n pendingProjection = Object.freeze({ projection, renderContent });\n return;\n }\n\n if (dispatchActive && projection.scene !== \"agent-charging\") {\n pendingProjection = undefined;\n clearDispatch();\n }\n\n applyProjection(projection, renderContent);\n }\n\n function dispatch(source: HTMLElement, target: HTMLElement): void {\n if (disposed || dispatchTimeline?.isActive() === true) return;\n if (!supportsMotion(document)) return;\n\n clearDispatch();\n dispatchSource = source;\n dispatchTarget = target;\n elements.surface.dataset.agentCharging = \"true\";\n dispatchTimeline = gsap.timeline({\n onComplete: () => {\n const nextProjection = pendingProjection;\n pendingProjection = undefined;\n completeDispatch();\n if (nextProjection !== undefined) {\n applyProjection(nextProjection.projection, nextProjection.renderContent);\n }\n },\n });\n dispatchTimeline.fromTo(\n source,\n { filter: \"brightness(1)\", scaleX: 1, scaleY: 1 },\n {\n filter: \"brightness(1.06)\",\n scaleX: 0.995,\n scaleY: 0.97,\n duration: MOTION.pressSeconds,\n ease: \"power2.out\",\n yoyo: true,\n repeat: 1,\n clearProps: \"filter,transform\",\n },\n 0,\n );\n dispatchTimeline.fromTo(\n target,\n { boxShadow: \"0 0 0 rgb(100 120 255 / 0%)\" },\n {\n boxShadow: \"0 0 18px rgb(100 120 255 / 14%)\",\n duration: MOTION.targetFeedbackSeconds,\n yoyo: true,\n repeat: 1,\n clearProps: \"boxShadow\",\n },\n MOTION.targetFeedbackDelaySeconds,\n );\n dispatchTimeline.to({}, { duration: MOTION.dispatchSeconds }, 0);\n }\n\n return Object.freeze({\n cancel,\n dispatch,\n render,\n updateLayout,\n dispose(): void {\n if (disposed) return;\n disposed = true;\n cancel();\n document.removeEventListener(\"visibilitychange\", handleVisibility);\n },\n });\n}\n","import { createButton, createMarkedElement } from \"./dom.js\";\nimport { BRAND_MARK_CONTENT } from \"./brand-mark-content.js\";\nimport { createBrandMark } from \"./brand-mark.js\";\nimport type {\n FloatingSurfaceProjection,\n MotionExecutionIsland,\n} from \"./motion-extension-contract.js\";\n\nconst TIMER_INTERVAL_MS = 1_000;\n\nexport type { ExecutionActivityKind } from \"./motion-extension-contract.js\";\n\nfunction formatElapsed(milliseconds: number): string {\n const totalSeconds = Math.max(0, Math.floor(milliseconds / TIMER_INTERVAL_MS));\n const seconds = totalSeconds % 60;\n const totalMinutes = Math.floor(totalSeconds / 60);\n const minutes = totalMinutes % 60;\n const hours = Math.floor(totalMinutes / 60);\n const twoDigits = (value: number): string => String(value).padStart(2, \"0\");\n\n return hours > 0\n ? `${twoDigits(hours)}:${twoDigits(minutes)}:${twoDigits(seconds)}`\n : `${twoDigits(totalMinutes)}:${twoDigits(seconds)}`;\n}\n\nfunction validTimestamp(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n const timestamp = Date.parse(value);\n return Number.isFinite(timestamp) ? timestamp : undefined;\n}\n\nfunction prefersReducedMotion(window: Window): boolean {\n const matchMedia: unknown = Reflect.get(window, \"matchMedia\");\n if (typeof matchMedia !== \"function\") return false;\n const result: unknown = Reflect.apply(matchMedia, window, [\n \"(prefers-reduced-motion: reduce)\",\n ]);\n return (\n typeof result === \"object\" &&\n result !== null &&\n \"matches\" in result &&\n result.matches === true\n );\n}\n\nexport function createExecutionIsland(\n document: Document,\n now: () => number = Date.now,\n): MotionExecutionIsland {\n const window = document.defaultView;\n\n if (window === null) {\n throw new Error(\"SpotPatch Execution Island requires an associated window.\");\n }\n\n const root = createButton(document, \"\", \"spotpatch-execution-island\");\n root.hidden = true;\n root.setAttribute(\"aria-hidden\", \"true\");\n root.setAttribute(\"aria-expanded\", \"false\");\n\n const logo = createBrandMark(\n document,\n BRAND_MARK_CONTENT,\n \"spotpatch-execution-island\",\n );\n logo.classList.add(\"spotpatch-execution-logo\");\n const mark = createMarkedElement(document, \"span\");\n mark.className = \"spotpatch-execution-mark\";\n mark.append(logo);\n\n const content = createMarkedElement(document, \"span\");\n content.className = \"spotpatch-execution-content\";\n content.setAttribute(\"role\", \"status\");\n content.setAttribute(\"aria-live\", \"polite\");\n content.setAttribute(\"aria-atomic\", \"true\");\n const headlineWrap = createMarkedElement(document, \"span\");\n headlineWrap.className = \"spotpatch-execution-headline-wrap\";\n const headline = createMarkedElement(document, \"strong\");\n headline.className = \"spotpatch-execution-headline\";\n const headlineOutgoing = createMarkedElement(document, \"strong\");\n headlineOutgoing.className = \"spotpatch-execution-headline-outgoing\";\n headlineOutgoing.setAttribute(\"aria-hidden\", \"true\");\n headlineWrap.append(headlineOutgoing, headline);\n const actionWrap = createMarkedElement(document, \"span\");\n actionWrap.className = \"spotpatch-execution-action-wrap\";\n const action = createMarkedElement(document, \"span\");\n action.className = \"spotpatch-execution-action\";\n const actionOutgoing = createMarkedElement(document, \"span\");\n actionOutgoing.className = \"spotpatch-execution-action-outgoing\";\n actionOutgoing.setAttribute(\"aria-hidden\", \"true\");\n actionWrap.append(actionOutgoing, action);\n const recent = createMarkedElement(document, \"span\");\n recent.className = \"spotpatch-execution-recent\";\n content.append(headlineWrap, actionWrap);\n\n const meta = createMarkedElement(document, \"span\");\n meta.className = \"spotpatch-execution-meta\";\n const metaDot = createMarkedElement(document, \"span\");\n metaDot.className = \"spotpatch-execution-meta-dot\";\n metaDot.setAttribute(\"aria-hidden\", \"true\");\n const metaLabel = createMarkedElement(document, \"span\");\n metaLabel.className = \"spotpatch-execution-meta-label\";\n const timer = createMarkedElement(document, \"span\");\n timer.className = \"spotpatch-execution-timer\";\n timer.hidden = true;\n meta.append(metaDot, metaLabel, timer);\n\n const more = createMarkedElement(document, \"span\");\n more.className = \"spotpatch-execution-more\";\n more.textContent = \"•••\";\n more.setAttribute(\"aria-hidden\", \"true\");\n meta.append(more);\n\n const sweep = createMarkedElement(document, \"span\");\n sweep.className = \"spotpatch-island-sweep\";\n sweep.setAttribute(\"aria-hidden\", \"true\");\n root.append(mark, content, meta, recent, sweep);\n\n const elements = Object.freeze({\n action,\n actionOutgoing,\n content,\n headline,\n headlineOutgoing,\n logo,\n mark,\n meta,\n metaDot,\n metaLabel,\n more,\n recent,\n root,\n sweep,\n timer,\n });\n let currentProjection: FloatingSurfaceProjection | undefined;\n let expandable = false;\n let expanded = false;\n let timerHandle: number | undefined;\n let startedAt: number | undefined;\n let disposed = false;\n\n const updateExpandedState = (): void => {\n expanded = expandable && expanded;\n root.dataset.expandable = String(expandable);\n root.dataset.expanded = String(expanded);\n root.setAttribute(\"aria-expanded\", String(expanded));\n more.textContent = expanded ? \"×\" : \"•••\";\n recent.hidden = !expanded;\n };\n\n const animateCopyChange = (\n element: HTMLElement,\n outgoing: HTMLElement,\n value: string,\n ): void => {\n if (element.textContent === value) return;\n outgoing.textContent = element.textContent;\n element.textContent = value;\n root.classList.remove(\"spotpatch-execution-copy-changing\");\n if (!prefersReducedMotion(window)) {\n void root.offsetWidth;\n root.classList.add(\"spotpatch-execution-copy-changing\");\n }\n };\n const syncProjectionCopy = (projection: FloatingSurfaceProjection): void => {\n const visibleHeadline = expanded\n ? (projection.expandedHeadline ?? projection.headline)\n : projection.headline;\n const visibleAction = expanded\n ? (projection.expandedAction ?? projection.action)\n : projection.action;\n animateCopyChange(headline, headlineOutgoing, visibleHeadline);\n animateCopyChange(action, actionOutgoing, visibleAction);\n root.setAttribute(\n \"aria-label\",\n [visibleHeadline, visibleAction, projection.meta].filter(Boolean).join(\". \"),\n );\n };\n\n const stopTimer = (): void => {\n if (timerHandle === undefined) return;\n window.clearInterval(timerHandle);\n timerHandle = undefined;\n };\n const updateTimer = (): void => {\n if (startedAt === undefined) return;\n timer.textContent = formatElapsed(now() - startedAt);\n };\n const startTimer = (): void => {\n if (timerHandle !== undefined || startedAt === undefined || document.hidden) {\n return;\n }\n updateTimer();\n timerHandle = window.setInterval(updateTimer, TIMER_INTERVAL_MS);\n };\n const syncTimer = (projection: FloatingSurfaceProjection): void => {\n stopTimer();\n startedAt =\n projection.scene === \"running\" ? validTimestamp(projection.startedAt) : undefined;\n const timed = startedAt !== undefined;\n timer.hidden = !timed;\n metaLabel.textContent = projection.meta;\n if (timed) startTimer();\n };\n const handleVisibility = (): void => {\n if (document.hidden) {\n stopTimer();\n } else if (currentProjection !== undefined) {\n syncTimer(currentProjection);\n }\n };\n document.addEventListener(\"visibilitychange\", handleVisibility);\n\n return Object.freeze({\n canExpand: () => expandable,\n elements,\n isExpanded: () => expanded,\n root,\n setExpanded(nextExpanded: boolean): void {\n expanded = nextExpanded;\n updateExpandedState();\n if (currentProjection !== undefined) syncProjectionCopy(currentProjection);\n },\n render(projection: FloatingSurfaceProjection): void {\n if (disposed) return;\n currentProjection = projection;\n root.dataset.executionScene = projection.scene;\n meta.dataset.tone = projection.tone;\n syncTimer(projection);\n\n recent.replaceChildren(\n ...projection.recentActivities.slice(-3).map((item) => {\n const row = createMarkedElement(document, \"span\");\n row.className = \"spotpatch-execution-recent-item\";\n row.dataset.state = item.state;\n const kind = createMarkedElement(document, \"span\");\n kind.className = \"spotpatch-execution-recent-kind\";\n kind.textContent = item.kind;\n const detail = createMarkedElement(document, \"span\");\n detail.className = \"spotpatch-execution-recent-detail\";\n detail.textContent = item.detail ?? item.label;\n const state = createMarkedElement(document, \"span\");\n state.className = \"spotpatch-execution-recent-state\";\n state.textContent = item.state;\n row.append(kind, detail, state);\n return row;\n }),\n );\n expandable = projection.recentActivities.length > 0;\n if (projection.scene === \"success\" || projection.scene === \"failed\") {\n expanded = false;\n }\n updateExpandedState();\n syncProjectionCopy(projection);\n },\n dispose(): void {\n if (disposed) return;\n disposed = true;\n stopTimer();\n document.removeEventListener(\"visibilitychange\", handleVisibility);\n },\n });\n}\n","import {\n createFloatingSurfaceMotionController,\n createFloatingSurfaceMotionStyles,\n} from \"./ui/motion-controller.js\";\nimport { createExecutionIsland } from \"./ui/execution-island.js\";\nimport {\n registerFloatingSurfaceMotionExtension,\n type FloatingSurfaceMotionExtension,\n} from \"./ui/motion-extension-contract.js\";\n\nconst FLOATING_SURFACE_MOTION_EXTENSION = Object.freeze({\n createExecutionIsland,\n createController: createFloatingSurfaceMotionController,\n createStyles: createFloatingSurfaceMotionStyles,\n}) satisfies FloatingSurfaceMotionExtension;\n\nexport function installFloatingSurfaceMotionExtension(): void {\n registerFloatingSurfaceMotionExtension(FLOATING_SURFACE_MOTION_EXTENSION);\n}\n\nexport {\n createExecutionIsland,\n createFloatingSurfaceMotionController,\n createFloatingSurfaceMotionStyles,\n};\nexport {\n getFloatingSurfaceMotionExtension,\n registerFloatingSurfaceMotionExtension,\n type FloatingSurfaceMotionController,\n type FloatingSurfaceMotionElements,\n type FloatingSurfaceMotionExtension,\n type FloatingSurfaceProjection,\n type FloatingSurfaceScene,\n type FloatingSurfaceTone,\n type MotionExecutionIsland,\n} from \"./ui/motion-extension-contract.js\";\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4CA0NhC,OAAO,OAAO,mBAAmB,CAAC;AAAA;AAAA;AAAA;AAAA,6CAIjC,OAAO,OAAO,mBAAmB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":[]}
1
+ {"version":3,"sources":["../src/ui/motion-controller.ts","../src/ui/execution-island.ts","../src/motion-entry.ts"],"sourcesContent":["import { gsap } from \"gsap\";\n\nimport type {\n FloatingSurfaceMotionController,\n FloatingSurfaceMotionElements,\n FloatingSurfaceProjection,\n} from \"./motion-extension-contract.js\";\nimport { THEME_MOTION_COLORS } from \"./theme.js\";\n\nconst MOTION = Object.freeze({\n contentMilliseconds: 220,\n detailRevealDelaySeconds: 0.1,\n detailRevealSeconds: 0.3,\n detailRetireSeconds: 0.15,\n dispatchSeconds: 0.54,\n expandSeconds: 0.54,\n morphSeconds: 0.48,\n pressSeconds: 0.12,\n revealSeconds: 0.36,\n revealStaggerSeconds: 0.05,\n sceneRevealDelaySeconds: 0.12,\n sweepSeconds: 0.68,\n targetFeedbackDelaySeconds: 0.08,\n targetFeedbackSeconds: 0.22,\n});\n\n/** The planner shell's header, body and actions, revealed in that order. */\nconst PLANNER_SECTION_COUNT = 3;\n\nfunction milliseconds(seconds: number): string {\n return `${String(Math.round(seconds * 1_000))}ms`;\n}\n\nfunction sectionRevealDelay(index: number): string {\n return milliseconds(\n MOTION.sceneRevealDelaySeconds + MOTION.revealStaggerSeconds * index,\n );\n}\n\nconst ISLAND_SIZE = Object.freeze({\n checkingWidth: 440,\n compactHeight: 62,\n dispatchingWidth: 448,\n expandedHeight: 164,\n expandedWidth: 520,\n failedWidth: 440,\n receivingWidth: 430,\n runningWidth: 468,\n successWidth: 356,\n});\n\ninterface PendingProjection {\n readonly projection: FloatingSurfaceProjection;\n readonly renderContent: () => void;\n}\n\ninterface SurfaceGeometry {\n readonly borderRadius: string;\n readonly rect: DOMRect;\n}\n\ninterface ElementOffset {\n readonly x: number;\n readonly y: number;\n}\n\ninterface SurfaceLayout {\n readonly geometry: SurfaceGeometry;\n readonly sharedOffsets: ReadonlyMap<HTMLElement, ElementOffset>;\n}\n\ntype DetailTransition = \"collapse\" | \"expand\" | undefined;\n\ntype SurfaceLayer = \"execution\" | \"pill\" | \"planner\";\n\nfunction surfaceLayer(scene: FloatingSurfaceProjection[\"scene\"]): SurfaceLayer {\n if (scene === \"pill\" || scene === \"capturing\") return \"pill\";\n if (scene === \"planner\") return \"planner\";\n return \"execution\";\n}\n\nfunction setSceneVisibility(\n elements: FloatingSurfaceMotionElements,\n projection: FloatingSurfaceProjection,\n): HTMLElement {\n const pillActive = projection.scene === \"pill\" || projection.scene === \"capturing\";\n const plannerActive = projection.scene === \"planner\";\n const executionActive = !pillActive && !plannerActive;\n\n elements.pill.hidden = !pillActive;\n elements.pill.inert = !pillActive;\n elements.planner.hidden = !plannerActive;\n elements.planner.inert = !plannerActive;\n elements.planner.setAttribute(\"aria-hidden\", String(!plannerActive));\n elements.execution.root.hidden = !executionActive;\n elements.execution.root.inert = !executionActive;\n elements.execution.root.setAttribute(\"aria-hidden\", String(!executionActive));\n\n return pillActive\n ? elements.pill\n : plannerActive\n ? elements.planner\n : elements.execution.root;\n}\n\nfunction supportsMotion(document: Document): boolean {\n return (\n document.defaultView?.matchMedia(\"(prefers-reduced-motion: reduce)\").matches !==\n true\n );\n}\n\nfunction finiteRect(rect: DOMRect): boolean {\n return (\n Number.isFinite(rect.left) &&\n Number.isFinite(rect.top) &&\n rect.width > 0 &&\n rect.height > 0\n );\n}\n\nfunction geometryChanged(previous: DOMRect, next: DOMRect): boolean {\n return (\n Math.abs(previous.left - next.left) > 0.5 ||\n Math.abs(previous.top - next.top) > 0.5 ||\n Math.abs(previous.width - next.width) > 0.5 ||\n Math.abs(previous.height - next.height) > 0.5\n );\n}\n\nfunction visibleBorderRadius(value: string | undefined, rect: DOMRect): string {\n if (value === undefined || value.length === 0) return \"0px\";\n const radius = Number.parseFloat(value);\n if (!Number.isFinite(radius) || !finiteRect(rect)) return value;\n return `${String(Math.min(radius, rect.width / 2, rect.height / 2))}px`;\n}\n\nfunction compactIslandWidth(projection: FloatingSurfaceProjection): number {\n if (projection.scene === \"agent-charging\") return ISLAND_SIZE.receivingWidth;\n if (projection.scene === \"handoff\") return ISLAND_SIZE.dispatchingWidth;\n if (projection.scene === \"success\") return ISLAND_SIZE.successWidth;\n if (projection.scene === \"failed\") return ISLAND_SIZE.failedWidth;\n if (projection.scene === \"running\" && projection.activity?.kind === \"check\") {\n return ISLAND_SIZE.checkingWidth;\n }\n return ISLAND_SIZE.runningWidth;\n}\n\nexport function createFloatingSurfaceMotionStyles(\n document: Document,\n): HTMLStyleElement {\n const style = document.createElement(\"style\");\n style.textContent = `\n .spotpatch-floating-surface {\n --spotpatch-island-compact-height: ${String(ISLAND_SIZE.compactHeight)}px;\n --spotpatch-island-compact-width: ${String(ISLAND_SIZE.runningWidth)}px;\n --spotpatch-island-expanded-height: ${String(ISLAND_SIZE.expandedHeight)}px;\n --spotpatch-island-expanded-width: ${String(ISLAND_SIZE.expandedWidth)}px;\n }\n .spotpatch-floating-surface::before {\n position: absolute;\n z-index: 0;\n inset: 0;\n background:\n radial-gradient(160px 70px at 0% 50%, var(--spotpatch-accent-tint), transparent 72%),\n radial-gradient(160px 70px at 100% 50%, var(--spotpatch-cyan-tint), transparent 72%);\n content: \"\";\n opacity: 0;\n pointer-events: none;\n transition: opacity var(--spotpatch-duration-slow) ease;\n }\n .spotpatch-floating-surface[data-scene=\"agent-charging\"],\n .spotpatch-floating-surface[data-scene=\"handoff\"],\n .spotpatch-floating-surface[data-scene=\"running\"],\n .spotpatch-floating-surface[data-scene=\"success\"],\n .spotpatch-floating-surface[data-scene=\"failed\"] {\n width: min(var(--spotpatch-island-compact-width), calc(100vw - 32px));\n height: var(--spotpatch-island-compact-height);\n max-width: calc(100vw - 32px);\n border-radius: var(--spotpatch-radius-pill);\n }\n .spotpatch-floating-surface[data-scene=\"agent-charging\"]::before,\n .spotpatch-floating-surface[data-scene=\"handoff\"]::before,\n .spotpatch-floating-surface[data-scene=\"running\"]::before { opacity: 1; }\n .spotpatch-floating-surface[data-scene=\"success\"] { border-color: color-mix(in srgb, var(--spotpatch-success) 32%, transparent); }\n .spotpatch-floating-surface[data-scene=\"failed\"] { border-color: var(--spotpatch-danger-line); }\n .spotpatch-floating-surface:has(.spotpatch-execution-island[data-expanded=\"true\"]) {\n width: min(var(--spotpatch-island-expanded-width), calc(100vw - 32px));\n height: min(var(--spotpatch-island-expanded-height), calc(100vh - 32px));\n border-radius: 28px;\n }\n .spotpatch-floating-surface > .spotpatch-trigger,\n .spotpatch-floating-surface > .spotpatch-dialog,\n .spotpatch-floating-surface > .spotpatch-execution-island {\n position: relative;\n z-index: 1;\n }\n\n .spotpatch-execution-island {\n display: grid;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n gap: 12px;\n overflow: hidden;\n border: 0;\n border-radius: inherit;\n padding: 0 18px;\n color: var(--spotpatch-text);\n background: transparent;\n cursor: pointer;\n text-align: left;\n touch-action: none;\n }\n .spotpatch-execution-island[data-expanded=\"true\"] {\n min-height: var(--spotpatch-island-expanded-height);\n grid-template-rows: auto 1fr;\n align-items: start;\n row-gap: 16px;\n padding: 18px 20px 16px;\n }\n .spotpatch-execution-mark {\n display: grid;\n width: 24px;\n height: 24px;\n flex: none;\n place-items: center;\n }\n .spotpatch-execution-logo {\n width: 22px;\n height: 22px;\n overflow: visible;\n }\n [data-execution-scene=\"agent-charging\"] .spotpatch-execution-logo,\n [data-execution-scene=\"handoff\"] .spotpatch-execution-logo,\n [data-execution-scene=\"running\"] .spotpatch-execution-logo {\n animation: spotpatch-motion-logo-glow 2.4s ease-in-out infinite;\n }\n .spotpatch-execution-content {\n display: flex;\n min-width: 0;\n align-items: baseline;\n gap: 8px;\n }\n [data-expanded=\"true\"] .spotpatch-execution-content {\n display: grid;\n gap: 4px;\n }\n .spotpatch-execution-headline-wrap,\n .spotpatch-execution-action-wrap {\n position: relative;\n display: block;\n min-width: 0;\n }\n .spotpatch-execution-headline,\n .spotpatch-execution-headline-outgoing,\n .spotpatch-execution-action,\n .spotpatch-execution-action-outgoing {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .spotpatch-execution-headline,\n .spotpatch-execution-headline-outgoing {\n font-size: 14.5px;\n font-weight: 650;\n letter-spacing: -.015em;\n line-height: 1.35;\n }\n .spotpatch-execution-action,\n .spotpatch-execution-action-outgoing {\n color: var(--spotpatch-text-muted);\n font-size: 11.5px;\n line-height: 1.35;\n }\n .spotpatch-execution-headline-outgoing,\n .spotpatch-execution-action-outgoing {\n position: absolute;\n inset: 0;\n opacity: 0;\n pointer-events: none;\n }\n .spotpatch-execution-copy-changing .spotpatch-execution-headline,\n .spotpatch-execution-copy-changing .spotpatch-execution-action {\n animation: spotpatch-motion-copy-in ${String(MOTION.contentMilliseconds)}ms var(--spotpatch-ease-out) both;\n }\n .spotpatch-execution-copy-changing .spotpatch-execution-headline-outgoing,\n .spotpatch-execution-copy-changing .spotpatch-execution-action-outgoing {\n animation: spotpatch-motion-copy-out ${String(MOTION.contentMilliseconds)}ms ease-in both;\n }\n .spotpatch-execution-meta {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: flex-end;\n gap: 10px;\n color: var(--spotpatch-text-secondary);\n font-size: 11.5px;\n font-weight: 600;\n white-space: nowrap;\n }\n .spotpatch-execution-meta-dot {\n width: 6px;\n height: 6px;\n flex: none;\n border-radius: 50%;\n background: var(--spotpatch-accent);\n box-shadow: 0 0 10px var(--spotpatch-accent-line);\n }\n [data-execution-scene=\"agent-charging\"] .spotpatch-execution-meta-dot,\n [data-execution-scene=\"handoff\"] .spotpatch-execution-meta-dot,\n [data-execution-scene=\"running\"] .spotpatch-execution-meta-dot {\n animation: spotpatch-motion-status-breathe 1.8s ease-in-out infinite;\n }\n .spotpatch-execution-meta[data-tone=\"success\"] { color: var(--spotpatch-success-text); }\n .spotpatch-execution-meta[data-tone=\"success\"] .spotpatch-execution-meta-dot {\n background: var(--spotpatch-success);\n box-shadow: 0 0 10px color-mix(in srgb, var(--spotpatch-success) 45%, transparent);\n }\n .spotpatch-execution-meta[data-tone=\"danger\"] { color: var(--spotpatch-danger-text); }\n .spotpatch-execution-meta[data-tone=\"danger\"] .spotpatch-execution-meta-dot {\n background: var(--spotpatch-danger);\n box-shadow: 0 0 10px var(--spotpatch-danger-line);\n }\n .spotpatch-execution-timer {\n width: 36px;\n color: var(--spotpatch-text-muted);\n font: 500 11px/1 var(--spotpatch-font-mono);\n font-variant-numeric: tabular-nums;\n text-align: right;\n }\n .spotpatch-execution-more {\n display: grid;\n width: 24px;\n height: 24px;\n place-items: center;\n border: 0;\n border-radius: 50%;\n padding: 0;\n color: var(--spotpatch-text-muted);\n background: transparent;\n font-size: 15px;\n line-height: 1;\n transition: background var(--spotpatch-duration-fast) ease;\n }\n .spotpatch-execution-island:hover .spotpatch-execution-more { background: var(--spotpatch-hover); }\n [data-expanded=\"true\"] .spotpatch-execution-meta-dot,\n [data-expanded=\"true\"] .spotpatch-execution-meta-label,\n [data-expanded=\"true\"] .spotpatch-execution-timer { display: none; }\n [data-expanded=\"true\"] .spotpatch-execution-more {\n width: 28px;\n height: 28px;\n background: var(--spotpatch-hover);\n }\n .spotpatch-execution-recent {\n position: absolute;\n top: 62px;\n right: 20px;\n left: 20px;\n display: grid;\n }\n .spotpatch-execution-recent-item {\n display: grid;\n min-height: 28px;\n grid-template-columns: 56px minmax(0, 1fr) auto;\n align-items: center;\n border-top: 1px solid var(--spotpatch-border-subtle);\n }\n .spotpatch-execution-recent-item:first-child { border-top: 0; }\n .spotpatch-execution-recent-kind,\n .spotpatch-execution-recent-state {\n color: var(--spotpatch-text-muted);\n font: 500 10.5px/1 var(--spotpatch-font-mono);\n }\n .spotpatch-execution-recent-kind { text-transform: uppercase; }\n .spotpatch-execution-recent-detail {\n overflow: hidden;\n color: var(--spotpatch-text-secondary);\n font-size: 11.5px;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .spotpatch-execution-recent-item[data-state=\"active\"] .spotpatch-execution-recent-kind { color: var(--spotpatch-accent-soft); }\n .spotpatch-execution-recent-item[data-state=\"active\"] .spotpatch-execution-recent-detail { color: var(--spotpatch-text); }\n .spotpatch-execution-recent-item[data-state=\"failure\"] .spotpatch-execution-recent-kind { color: var(--spotpatch-danger-text); }\n .spotpatch-island-sweep {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 44px;\n width: 22%;\n height: 1px;\n border-radius: var(--spotpatch-radius-pill);\n background: linear-gradient(90deg, transparent, var(--spotpatch-accent), var(--spotpatch-accent-cyan), transparent);\n box-shadow: 0 0 8px var(--spotpatch-accent-line);\n opacity: 0;\n pointer-events: none;\n transform: translate3d(-160%, 0, 0);\n }\n [data-motion-reveal=\"true\"] .spotpatch-shell > * {\n animation: spotpatch-motion-section-in ${milliseconds(MOTION.revealSeconds)} var(--spotpatch-ease-out) both;\n animation-delay: ${sectionRevealDelay(0)};\n }\n [data-motion-reveal=\"true\"] .spotpatch-shell > :nth-child(2) { animation-delay: ${sectionRevealDelay(1)}; }\n [data-motion-reveal=\"true\"] .spotpatch-shell > :nth-child(3) { animation-delay: ${sectionRevealDelay(2)}; }\n @keyframes spotpatch-motion-section-in {\n from { opacity: 0; transform: translate3d(0, 8px, 0); }\n }\n @keyframes spotpatch-motion-copy-in {\n from { opacity: 0; filter: blur(2px); transform: translate3d(0, 4px, 0); }\n }\n @keyframes spotpatch-motion-copy-out {\n to { opacity: 0; filter: blur(2px); transform: translate3d(0, -4px, 0); }\n }\n @keyframes spotpatch-motion-status-breathe {\n 50% { opacity: .4; transform: scale(.8); }\n }\n @keyframes spotpatch-motion-logo-glow {\n 50% { filter: drop-shadow(0 0 7px var(--spotpatch-accent-line)); }\n }\n .spotpatch-floating-surface[data-motion-paused=\"true\"] *,\n .spotpatch-floating-surface[data-motion-paused=\"true\"] *::before {\n animation-play-state: paused;\n }\n @media (prefers-reduced-motion: reduce) {\n .spotpatch-execution-headline,\n .spotpatch-execution-headline-outgoing,\n .spotpatch-execution-action,\n .spotpatch-execution-action-outgoing {\n filter: none !important;\n transform: none !important;\n }\n .spotpatch-island-sweep { display: none; }\n }\n @media (max-width: 520px) {\n .spotpatch-execution-island {\n gap: 10px;\n padding-right: 14px;\n padding-left: 14px;\n }\n .spotpatch-execution-action-wrap { display: none; }\n .spotpatch-execution-recent-item { grid-template-columns: 48px minmax(0, 1fr); }\n .spotpatch-execution-recent-state { display: none; }\n }\n `;\n return style;\n}\n\nexport function createFloatingSurfaceMotionController(\n document: Document,\n elements: FloatingSurfaceMotionElements,\n reconcile: () => void,\n): FloatingSurfaceMotionController {\n let currentScene: FloatingSurfaceProjection[\"scene\"] | undefined;\n let currentActivityKey: string | undefined;\n let morphTimeline: gsap.core.Timeline | undefined;\n let dispatchTimeline: gsap.core.Timeline | undefined;\n let pendingProjection: PendingProjection | undefined;\n let dispatchSource: HTMLElement | undefined;\n let dispatchTarget: HTMLElement | undefined;\n let disposed = false;\n\n const handleVisibility = (): void => {\n elements.surface.dataset.motionPaused = String(document.hidden);\n };\n document.addEventListener(\"visibilitychange\", handleVisibility);\n handleVisibility();\n\n const morphElements = [\n elements.surface,\n elements.pill,\n elements.planner,\n elements.execution.root,\n elements.execution.mark,\n elements.execution.content,\n elements.execution.meta,\n elements.execution.recent,\n ];\n\n const sharedExecutionElements = [\n elements.execution.mark,\n elements.execution.content,\n elements.execution.meta,\n ];\n\n function captureSurfaceLayout(includeSharedOffsets = false): SurfaceLayout {\n const surfaceRect = elements.surface.getBoundingClientRect();\n const computedRadius = document.defaultView\n ?.getComputedStyle(elements.surface)\n .borderRadius.trim();\n\n const sharedOffsets = new Map<HTMLElement, ElementOffset>();\n if (includeSharedOffsets && finiteRect(surfaceRect)) {\n for (const element of sharedExecutionElements) {\n const elementRect = element.getBoundingClientRect();\n if (!finiteRect(elementRect)) continue;\n sharedOffsets.set(\n element,\n Object.freeze({\n x: elementRect.left - surfaceRect.left,\n y: elementRect.top - surfaceRect.top,\n }),\n );\n }\n }\n\n return Object.freeze({\n geometry: Object.freeze({\n borderRadius: visibleBorderRadius(computedRadius, surfaceRect),\n rect: surfaceRect,\n }),\n sharedOffsets,\n });\n }\n\n function syncRecentVisibility(): void {\n elements.execution.recent.hidden =\n elements.execution.root.dataset.expanded !== \"true\";\n }\n\n function clearMorphProperties(): void {\n gsap.set(morphElements, {\n clearProps:\n \"borderRadius,filter,height,opacity,transform,visibility,width,willChange\",\n });\n delete elements.surface.dataset.motionMorphing;\n delete elements.planner.dataset.motionReveal;\n syncRecentVisibility();\n }\n\n function clearMorph(): void {\n morphTimeline?.kill();\n morphTimeline = undefined;\n gsap.killTweensOf(morphElements);\n clearMorphProperties();\n }\n\n function interruptMorph(includeSharedOffsets = false): SurfaceLayout {\n morphTimeline?.kill();\n morphTimeline = undefined;\n gsap.killTweensOf(morphElements);\n const layout = captureSurfaceLayout(includeSharedOffsets);\n clearMorphProperties();\n return layout;\n }\n\n function clearDispatch(): void {\n dispatchTimeline?.kill();\n dispatchTimeline = undefined;\n if (dispatchSource !== undefined) {\n gsap.killTweensOf(dispatchSource);\n gsap.set(dispatchSource, { clearProps: \"filter,transform\" });\n dispatchSource = undefined;\n }\n if (dispatchTarget !== undefined) {\n gsap.killTweensOf(dispatchTarget);\n gsap.set(dispatchTarget, { clearProps: \"boxShadow\" });\n dispatchTarget = undefined;\n }\n elements.surface.dataset.agentCharging = \"false\";\n }\n\n function completeDispatch(): void {\n dispatchTimeline = undefined;\n if (dispatchSource !== undefined) {\n gsap.set(dispatchSource, { clearProps: \"filter,transform\" });\n dispatchSource = undefined;\n }\n if (dispatchTarget !== undefined) {\n gsap.set(dispatchTarget, { clearProps: \"boxShadow\" });\n dispatchTarget = undefined;\n }\n elements.surface.dataset.agentCharging = \"false\";\n }\n\n function sweepOnce(): void {\n if (!supportsMotion(document) || document.hidden) return;\n gsap.killTweensOf(elements.execution.sweep);\n gsap.fromTo(\n elements.execution.sweep,\n { autoAlpha: 0, xPercent: -160 },\n {\n autoAlpha: 0.72,\n xPercent: 620,\n duration: MOTION.sweepSeconds,\n ease: \"power2.inOut\",\n onComplete: () => {\n gsap.set(elements.execution.sweep, {\n clearProps: \"opacity,transform,visibility\",\n });\n },\n },\n );\n }\n\n function animateGeometry(\n previous: SurfaceLayout,\n next: SurfaceLayout,\n activeScene: HTMLElement,\n reveal: boolean,\n detailTransition?: DetailTransition,\n ): void {\n const geometryHasChanged =\n geometryChanged(previous.geometry.rect, next.geometry.rect) ||\n previous.geometry.borderRadius !== next.geometry.borderRadius;\n const sharedLayoutHasChanged = sharedExecutionElements.some((element) => {\n const previousOffset = previous.sharedOffsets.get(element);\n const nextOffset = next.sharedOffsets.get(element);\n return (\n previousOffset !== undefined &&\n nextOffset !== undefined &&\n (Math.abs(previousOffset.x - nextOffset.x) > 0.5 ||\n Math.abs(previousOffset.y - nextOffset.y) > 0.5)\n );\n });\n\n if (\n !supportsMotion(document) ||\n !finiteRect(previous.geometry.rect) ||\n !finiteRect(next.geometry.rect) ||\n (!geometryHasChanged && !sharedLayoutHasChanged && detailTransition === undefined)\n ) {\n clearMorphProperties();\n return;\n }\n\n const morphDuration =\n detailTransition === \"expand\" ? MOTION.expandSeconds : MOTION.morphSeconds;\n elements.surface.dataset.motionMorphing = \"true\";\n morphTimeline = gsap.timeline({\n defaults: { overwrite: \"auto\" },\n onComplete: () => {\n clearMorphProperties();\n reconcile();\n morphTimeline = undefined;\n },\n });\n\n if (geometryHasChanged) {\n morphTimeline.fromTo(\n elements.surface,\n {\n borderRadius: previous.geometry.borderRadius,\n height: previous.geometry.rect.height,\n width: previous.geometry.rect.width,\n x: previous.geometry.rect.left - next.geometry.rect.left,\n y: previous.geometry.rect.top - next.geometry.rect.top,\n willChange: \"width,height,transform\",\n },\n {\n borderRadius: next.geometry.borderRadius,\n height: next.geometry.rect.height,\n width: next.geometry.rect.width,\n x: 0,\n y: 0,\n duration: morphDuration,\n ease: \"expo.inOut\",\n },\n 0,\n );\n }\n\n for (const element of sharedExecutionElements) {\n const previousOffset = previous.sharedOffsets.get(element);\n const nextOffset = next.sharedOffsets.get(element);\n if (previousOffset === undefined || nextOffset === undefined) continue;\n const x = previousOffset.x - nextOffset.x;\n const y = previousOffset.y - nextOffset.y;\n if (Math.abs(x) <= 0.5 && Math.abs(y) <= 0.5) continue;\n morphTimeline.fromTo(\n element,\n { x, y, willChange: \"transform\" },\n {\n x: 0,\n y: 0,\n duration: morphDuration,\n ease: \"expo.inOut\",\n },\n 0,\n );\n }\n\n if (detailTransition === \"expand\") {\n morphTimeline.fromTo(\n elements.execution.recent,\n { autoAlpha: 0, filter: \"blur(4px)\", y: 6 },\n {\n autoAlpha: 1,\n filter: \"blur(0px)\",\n y: 0,\n duration: MOTION.detailRevealSeconds,\n ease: \"power3.out\",\n },\n MOTION.detailRevealDelaySeconds,\n );\n } else if (detailTransition === \"collapse\") {\n morphTimeline.fromTo(\n elements.execution.recent,\n { autoAlpha: 1, filter: \"blur(0px)\", y: 0 },\n {\n autoAlpha: 0,\n filter: \"blur(3px)\",\n y: -4,\n duration: MOTION.detailRetireSeconds,\n ease: \"power2.in\",\n },\n 0,\n );\n }\n\n if (reveal && activeScene === elements.planner) {\n // The planner rises in sections (header, body, actions) through CSS, so\n // opening it adds no computed-style reads to the click. The timeline\n // only spans the reveal so completion and interruption clear it.\n elements.planner.dataset.motionReveal = \"true\";\n morphTimeline.call(\n () => undefined,\n [],\n MOTION.sceneRevealDelaySeconds +\n MOTION.revealSeconds +\n MOTION.revealStaggerSeconds * (PLANNER_SECTION_COUNT - 1),\n );\n } else if (reveal) {\n morphTimeline.fromTo(\n activeScene,\n { autoAlpha: 0, y: 8 },\n {\n autoAlpha: 1,\n y: 0,\n duration: MOTION.revealSeconds,\n ease: \"power3.out\",\n clearProps: \"transform,opacity,visibility\",\n },\n MOTION.sceneRevealDelaySeconds,\n );\n }\n }\n\n function applyProjection(\n projection: FloatingSurfaceProjection,\n renderContent: () => void,\n ): void {\n if (disposed) return;\n const previousScene = currentScene;\n const sceneChanged = previousScene !== projection.scene;\n const layerChanged =\n previousScene === undefined ||\n surfaceLayer(previousScene) !== surfaceLayer(projection.scene);\n const wasExpanded = elements.execution.root.dataset.expanded === \"true\";\n const executionRemainsActive =\n previousScene !== undefined &&\n surfaceLayer(previousScene) === \"execution\" &&\n surfaceLayer(projection.scene) === \"execution\";\n const preserveInterruptedSharedLayout =\n executionRemainsActive && (wasExpanded || morphTimeline?.isActive() === true);\n const previousGeometry = interruptMorph(preserveInterruptedSharedLayout);\n const activityChanged = currentActivityKey !== projection.activity?.key;\n\n elements.surface.dataset.scene = projection.scene;\n elements.surface.dataset.tone = projection.tone;\n elements.surface.style.setProperty(\n \"--spotpatch-island-compact-width\",\n `${String(compactIslandWidth(projection))}px`,\n );\n renderContent();\n const activeScene = setSceneVisibility(elements, projection);\n const isExpanded = elements.execution.root.dataset.expanded === \"true\";\n const detailTransition: DetailTransition =\n executionRemainsActive && wasExpanded && !isExpanded ? \"collapse\" : undefined;\n if (detailTransition === \"collapse\") {\n elements.execution.recent.hidden = false;\n }\n reconcile();\n const nextGeometry = captureSurfaceLayout(\n preserveInterruptedSharedLayout || detailTransition !== undefined,\n );\n currentScene = projection.scene;\n currentActivityKey = projection.activity?.key;\n animateGeometry(\n previousGeometry,\n nextGeometry,\n activeScene,\n layerChanged,\n detailTransition,\n );\n\n const executionActive =\n projection.scene === \"handoff\" ||\n projection.scene === \"running\" ||\n projection.scene === \"success\" ||\n projection.scene === \"failed\";\n if (executionActive && (sceneChanged || activityChanged)) sweepOnce();\n }\n\n function updateLayout(updateContent: () => void): void {\n if (disposed) return;\n const wasExpanded = elements.execution.root.dataset.expanded === \"true\";\n const previousGeometry = interruptMorph(true);\n updateContent();\n const isExpanded = elements.execution.root.dataset.expanded === \"true\";\n const detailTransition: DetailTransition = wasExpanded\n ? isExpanded\n ? undefined\n : \"collapse\"\n : isExpanded\n ? \"expand\"\n : undefined;\n if (detailTransition === \"collapse\") {\n elements.execution.recent.hidden = false;\n }\n reconcile();\n const nextGeometry = captureSurfaceLayout(true);\n const activeScene = elements.execution.root.hidden\n ? elements.planner.hidden\n ? elements.pill\n : elements.planner\n : elements.execution.root;\n animateGeometry(\n previousGeometry,\n nextGeometry,\n activeScene,\n false,\n detailTransition,\n );\n }\n\n function cancel(): void {\n pendingProjection = undefined;\n clearMorph();\n clearDispatch();\n gsap.killTweensOf(elements.execution.sweep);\n gsap.set(elements.execution.sweep, {\n clearProps: \"opacity,transform,visibility\",\n });\n }\n\n function render(\n projection: FloatingSurfaceProjection,\n renderContent: () => void,\n ): void {\n if (disposed) return;\n const dispatchActive = dispatchTimeline?.isActive() === true;\n const leavesChargingScene =\n projection.scene !== \"planner\" && projection.scene !== \"agent-charging\";\n\n if (dispatchActive && currentScene === \"agent-charging\" && leavesChargingScene) {\n pendingProjection = Object.freeze({ projection, renderContent });\n return;\n }\n\n if (dispatchActive && projection.scene !== \"agent-charging\") {\n pendingProjection = undefined;\n clearDispatch();\n }\n\n applyProjection(projection, renderContent);\n }\n\n function dispatch(source: HTMLElement, target: HTMLElement): void {\n if (disposed || dispatchTimeline?.isActive() === true) return;\n if (!supportsMotion(document)) return;\n\n clearDispatch();\n dispatchSource = source;\n dispatchTarget = target;\n elements.surface.dataset.agentCharging = \"true\";\n dispatchTimeline = gsap.timeline({\n onComplete: () => {\n const nextProjection = pendingProjection;\n pendingProjection = undefined;\n completeDispatch();\n if (nextProjection !== undefined) {\n applyProjection(nextProjection.projection, nextProjection.renderContent);\n }\n },\n });\n dispatchTimeline.fromTo(\n source,\n { filter: \"brightness(1)\", scaleX: 1, scaleY: 1 },\n {\n filter: \"brightness(1.06)\",\n scaleX: 0.995,\n scaleY: 0.97,\n duration: MOTION.pressSeconds,\n ease: \"power2.out\",\n yoyo: true,\n repeat: 1,\n clearProps: \"filter,transform\",\n },\n 0,\n );\n dispatchTimeline.fromTo(\n target,\n { boxShadow: THEME_MOTION_COLORS.dispatchGlowRest },\n {\n boxShadow: THEME_MOTION_COLORS.dispatchGlow,\n duration: MOTION.targetFeedbackSeconds,\n yoyo: true,\n repeat: 1,\n clearProps: \"boxShadow\",\n },\n MOTION.targetFeedbackDelaySeconds,\n );\n dispatchTimeline.to({}, { duration: MOTION.dispatchSeconds }, 0);\n }\n\n return Object.freeze({\n cancel,\n dispatch,\n render,\n updateLayout,\n dispose(): void {\n if (disposed) return;\n disposed = true;\n cancel();\n document.removeEventListener(\"visibilitychange\", handleVisibility);\n },\n });\n}\n","import { createButton, createMarkedElement } from \"./dom.js\";\nimport { BRAND_MARK_CONTENT } from \"./brand-mark-content.js\";\nimport { createBrandMark } from \"./brand-mark.js\";\nimport type {\n FloatingSurfaceProjection,\n MotionExecutionIsland,\n} from \"./motion-extension-contract.js\";\n\nconst TIMER_INTERVAL_MS = 1_000;\n\nexport type { ExecutionActivityKind } from \"./motion-extension-contract.js\";\n\nfunction formatElapsed(milliseconds: number): string {\n const totalSeconds = Math.max(0, Math.floor(milliseconds / TIMER_INTERVAL_MS));\n const seconds = totalSeconds % 60;\n const totalMinutes = Math.floor(totalSeconds / 60);\n const minutes = totalMinutes % 60;\n const hours = Math.floor(totalMinutes / 60);\n const twoDigits = (value: number): string => String(value).padStart(2, \"0\");\n\n return hours > 0\n ? `${twoDigits(hours)}:${twoDigits(minutes)}:${twoDigits(seconds)}`\n : `${twoDigits(totalMinutes)}:${twoDigits(seconds)}`;\n}\n\nfunction validTimestamp(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n const timestamp = Date.parse(value);\n return Number.isFinite(timestamp) ? timestamp : undefined;\n}\n\nfunction prefersReducedMotion(window: Window): boolean {\n const matchMedia: unknown = Reflect.get(window, \"matchMedia\");\n if (typeof matchMedia !== \"function\") return false;\n const result: unknown = Reflect.apply(matchMedia, window, [\n \"(prefers-reduced-motion: reduce)\",\n ]);\n return (\n typeof result === \"object\" &&\n result !== null &&\n \"matches\" in result &&\n result.matches === true\n );\n}\n\nexport function createExecutionIsland(\n document: Document,\n now: () => number = Date.now,\n): MotionExecutionIsland {\n const window = document.defaultView;\n\n if (window === null) {\n throw new Error(\"SpotPatch Execution Island requires an associated window.\");\n }\n\n const root = createButton(document, \"\", \"spotpatch-execution-island\");\n root.hidden = true;\n root.setAttribute(\"aria-hidden\", \"true\");\n root.setAttribute(\"aria-expanded\", \"false\");\n\n const logo = createBrandMark(\n document,\n BRAND_MARK_CONTENT,\n \"spotpatch-execution-island\",\n );\n logo.classList.add(\"spotpatch-execution-logo\");\n const mark = createMarkedElement(document, \"span\");\n mark.className = \"spotpatch-execution-mark\";\n mark.append(logo);\n\n const content = createMarkedElement(document, \"span\");\n content.className = \"spotpatch-execution-content\";\n content.setAttribute(\"role\", \"status\");\n content.setAttribute(\"aria-live\", \"polite\");\n content.setAttribute(\"aria-atomic\", \"true\");\n const headlineWrap = createMarkedElement(document, \"span\");\n headlineWrap.className = \"spotpatch-execution-headline-wrap\";\n const headline = createMarkedElement(document, \"strong\");\n headline.className = \"spotpatch-execution-headline\";\n const headlineOutgoing = createMarkedElement(document, \"strong\");\n headlineOutgoing.className = \"spotpatch-execution-headline-outgoing\";\n headlineOutgoing.setAttribute(\"aria-hidden\", \"true\");\n headlineWrap.append(headlineOutgoing, headline);\n const actionWrap = createMarkedElement(document, \"span\");\n actionWrap.className = \"spotpatch-execution-action-wrap\";\n const action = createMarkedElement(document, \"span\");\n action.className = \"spotpatch-execution-action\";\n const actionOutgoing = createMarkedElement(document, \"span\");\n actionOutgoing.className = \"spotpatch-execution-action-outgoing\";\n actionOutgoing.setAttribute(\"aria-hidden\", \"true\");\n actionWrap.append(actionOutgoing, action);\n const recent = createMarkedElement(document, \"span\");\n recent.className = \"spotpatch-execution-recent\";\n content.append(headlineWrap, actionWrap);\n\n const meta = createMarkedElement(document, \"span\");\n meta.className = \"spotpatch-execution-meta\";\n const metaDot = createMarkedElement(document, \"span\");\n metaDot.className = \"spotpatch-execution-meta-dot\";\n metaDot.setAttribute(\"aria-hidden\", \"true\");\n const metaLabel = createMarkedElement(document, \"span\");\n metaLabel.className = \"spotpatch-execution-meta-label\";\n const timer = createMarkedElement(document, \"span\");\n timer.className = \"spotpatch-execution-timer\";\n timer.hidden = true;\n meta.append(metaDot, metaLabel, timer);\n\n const more = createMarkedElement(document, \"span\");\n more.className = \"spotpatch-execution-more\";\n more.textContent = \"•••\";\n more.setAttribute(\"aria-hidden\", \"true\");\n meta.append(more);\n\n const sweep = createMarkedElement(document, \"span\");\n sweep.className = \"spotpatch-island-sweep\";\n sweep.setAttribute(\"aria-hidden\", \"true\");\n root.append(mark, content, meta, recent, sweep);\n\n const elements = Object.freeze({\n action,\n actionOutgoing,\n content,\n headline,\n headlineOutgoing,\n logo,\n mark,\n meta,\n metaDot,\n metaLabel,\n more,\n recent,\n root,\n sweep,\n timer,\n });\n let currentProjection: FloatingSurfaceProjection | undefined;\n let expandable = false;\n let expanded = false;\n let timerHandle: number | undefined;\n let startedAt: number | undefined;\n let disposed = false;\n\n const updateExpandedState = (): void => {\n expanded = expandable && expanded;\n root.dataset.expandable = String(expandable);\n root.dataset.expanded = String(expanded);\n root.setAttribute(\"aria-expanded\", String(expanded));\n more.textContent = expanded ? \"×\" : \"•••\";\n recent.hidden = !expanded;\n };\n\n const animateCopyChange = (\n element: HTMLElement,\n outgoing: HTMLElement,\n value: string,\n ): void => {\n if (element.textContent === value) return;\n outgoing.textContent = element.textContent;\n element.textContent = value;\n root.classList.remove(\"spotpatch-execution-copy-changing\");\n if (!prefersReducedMotion(window)) {\n void root.offsetWidth;\n root.classList.add(\"spotpatch-execution-copy-changing\");\n }\n };\n const syncProjectionCopy = (projection: FloatingSurfaceProjection): void => {\n const visibleHeadline = expanded\n ? (projection.expandedHeadline ?? projection.headline)\n : projection.headline;\n const visibleAction = expanded\n ? (projection.expandedAction ?? projection.action)\n : projection.action;\n animateCopyChange(headline, headlineOutgoing, visibleHeadline);\n animateCopyChange(action, actionOutgoing, visibleAction);\n root.setAttribute(\n \"aria-label\",\n [visibleHeadline, visibleAction, projection.meta].filter(Boolean).join(\". \"),\n );\n };\n\n const stopTimer = (): void => {\n if (timerHandle === undefined) return;\n window.clearInterval(timerHandle);\n timerHandle = undefined;\n };\n const updateTimer = (): void => {\n if (startedAt === undefined) return;\n timer.textContent = formatElapsed(now() - startedAt);\n };\n const startTimer = (): void => {\n if (timerHandle !== undefined || startedAt === undefined || document.hidden) {\n return;\n }\n updateTimer();\n timerHandle = window.setInterval(updateTimer, TIMER_INTERVAL_MS);\n };\n const syncTimer = (projection: FloatingSurfaceProjection): void => {\n stopTimer();\n startedAt =\n projection.scene === \"running\" ? validTimestamp(projection.startedAt) : undefined;\n const timed = startedAt !== undefined;\n timer.hidden = !timed;\n metaLabel.textContent = projection.meta;\n if (timed) startTimer();\n };\n const handleVisibility = (): void => {\n if (document.hidden) {\n stopTimer();\n } else if (currentProjection !== undefined) {\n syncTimer(currentProjection);\n }\n };\n document.addEventListener(\"visibilitychange\", handleVisibility);\n\n return Object.freeze({\n canExpand: () => expandable,\n elements,\n isExpanded: () => expanded,\n root,\n setExpanded(nextExpanded: boolean): void {\n expanded = nextExpanded;\n updateExpandedState();\n if (currentProjection !== undefined) syncProjectionCopy(currentProjection);\n },\n render(projection: FloatingSurfaceProjection): void {\n if (disposed) return;\n currentProjection = projection;\n root.dataset.executionScene = projection.scene;\n meta.dataset.tone = projection.tone;\n syncTimer(projection);\n\n recent.replaceChildren(\n ...projection.recentActivities.slice(-3).map((item) => {\n const row = createMarkedElement(document, \"span\");\n row.className = \"spotpatch-execution-recent-item\";\n row.dataset.state = item.state;\n const kind = createMarkedElement(document, \"span\");\n kind.className = \"spotpatch-execution-recent-kind\";\n kind.textContent = item.kind;\n const detail = createMarkedElement(document, \"span\");\n detail.className = \"spotpatch-execution-recent-detail\";\n detail.textContent = item.detail ?? item.label;\n const state = createMarkedElement(document, \"span\");\n state.className = \"spotpatch-execution-recent-state\";\n state.textContent = item.state;\n row.append(kind, detail, state);\n return row;\n }),\n );\n expandable = projection.recentActivities.length > 0;\n if (projection.scene === \"success\" || projection.scene === \"failed\") {\n expanded = false;\n }\n updateExpandedState();\n syncProjectionCopy(projection);\n },\n dispose(): void {\n if (disposed) return;\n disposed = true;\n stopTimer();\n document.removeEventListener(\"visibilitychange\", handleVisibility);\n },\n });\n}\n","import {\n createFloatingSurfaceMotionController,\n createFloatingSurfaceMotionStyles,\n} from \"./ui/motion-controller.js\";\nimport { createExecutionIsland } from \"./ui/execution-island.js\";\nimport {\n registerFloatingSurfaceMotionExtension,\n type FloatingSurfaceMotionExtension,\n} from \"./ui/motion-extension-contract.js\";\n\nconst FLOATING_SURFACE_MOTION_EXTENSION = Object.freeze({\n createExecutionIsland,\n createController: createFloatingSurfaceMotionController,\n createStyles: createFloatingSurfaceMotionStyles,\n}) satisfies FloatingSurfaceMotionExtension;\n\nexport function installFloatingSurfaceMotionExtension(): void {\n registerFloatingSurfaceMotionExtension(FLOATING_SURFACE_MOTION_EXTENSION);\n}\n\nexport {\n createExecutionIsland,\n createFloatingSurfaceMotionController,\n createFloatingSurfaceMotionStyles,\n};\nexport {\n getFloatingSurfaceMotionExtension,\n registerFloatingSurfaceMotionExtension,\n type FloatingSurfaceMotionController,\n type FloatingSurfaceMotionElements,\n type FloatingSurfaceMotionExtension,\n type FloatingSurfaceProjection,\n type FloatingSurfaceScene,\n type FloatingSurfaceTone,\n type MotionExecutionIsland,\n} from \"./ui/motion-extension-contract.js\";\n"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4CAkIhC,OAAO,OAAO,mBAAmB,CAAC;AAAA;AAAA;AAAA;AAAA,6CAIjC,OAAO,OAAO,mBAAmB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+C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","names":["milliseconds"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spotpatch/runtime",
3
- "version": "1.15.3",
3
+ "version": "1.15.5",
4
4
  "description": "Browser runtime, collectors, and Shadow DOM UI for SpotPatch.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -113,7 +113,7 @@
113
113
  "dependencies": {
114
114
  "gsap": "3.15.0",
115
115
  "@spotpatch/react-adapter": "^1.2.0",
116
- "@spotpatch/shared": "^1.14.3"
116
+ "@spotpatch/shared": "^1.15.0"
117
117
  },
118
118
  "publishConfig": {
119
119
  "access": "public",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ui/ask-picker.ts"],"sourcesContent":["import { createButton, createMarkedElement } from \"./dom.js\";\n\nexport const SELECT_PICKER_STYLES = `\n .spotpatch-select-picker { position: relative; display: grid; gap: 5px; min-width: 0; }\n .spotpatch-select-trigger { box-sizing: border-box; display: flex; width: 100%; min-height: 38px; align-items: center; justify-content: space-between; gap: 10px; border: 1px solid var(--spotpatch-border); border-radius: 9px; padding: 0 11px; overflow: hidden; color: var(--spotpatch-text); background: var(--spotpatch-bg-input); cursor: pointer; font: inherit; outline: none; text-align: left; }\n .spotpatch-select-trigger > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .spotpatch-select-trigger[data-expandable=\"true\"]::after { width: 7px; height: 7px; flex: 0 0 auto; border-right: 1.5px solid #8f96a3; border-bottom: 1.5px solid #8f96a3; content: \"\"; transform: translateY(-2px) rotate(45deg); }\n .spotpatch-select-trigger[aria-expanded=\"true\"]::after { transform: translateY(2px) rotate(225deg); }\n .spotpatch-select-trigger:focus-visible { border-color: rgb(139 123 255 / 68%); box-shadow: 0 0 0 3px rgb(139 123 255 / 12%); }\n .spotpatch-select-trigger:disabled { color: var(--spotpatch-text); background: rgb(255 255 255 / 3%); cursor: default; opacity: 1; }\n .spotpatch-select-trigger[data-empty=\"true\"]:disabled { color: var(--spotpatch-text-muted); }\n .spotpatch-select-menu { position: relative; z-index: 1; display: grid; gap: 3px; max-height: 224px; overflow-y: auto; overscroll-behavior: contain; border: 1px solid var(--spotpatch-border); border-radius: 9px; padding: 4px; background: var(--spotpatch-bg-input); box-shadow: 0 10px 28px rgb(0 0 0 / 28%); scrollbar-width: thin; }\n .spotpatch-select-menu[hidden] { display: none; }\n .spotpatch-select-option { box-sizing: border-box; min-height: 34px; border: 0; border-radius: 6px; padding: 7px 9px; overflow-wrap: anywhere; color: var(--spotpatch-text-secondary); background: transparent; cursor: pointer; font: inherit; text-align: left; }\n .spotpatch-select-option[data-active=\"true\"], .spotpatch-select-option:hover { color: #fff; background: rgb(139 123 255 / 13%); outline: none; }\n .spotpatch-select-option[aria-selected=\"true\"] { color: #f4f1ff; background: rgb(139 123 255 / 20%); }\n .spotpatch-select-native { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; border: 0; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; }\n`;\n\n/** Shared select-only picker: native value contract, one accessible custom control. */\nexport function createSelectPicker(document: Document, onViewChange: () => void) {\n const root = createMarkedElement(document, \"div\");\n root.className = \"spotpatch-select-picker\";\n const trigger = createButton(document, \"\", \"spotpatch-select-trigger\");\n trigger.id = `spotpatch-select-picker-${Math.random().toString(36).slice(2)}`;\n trigger.setAttribute(\"role\", \"combobox\");\n trigger.setAttribute(\"aria-haspopup\", \"listbox\");\n trigger.setAttribute(\"aria-expanded\", \"false\");\n const text = createMarkedElement(document, \"span\");\n trigger.append(text);\n const menu = createMarkedElement(document, \"div\");\n menu.id = `${trigger.id}-menu`;\n menu.className = \"spotpatch-select-menu\";\n menu.setAttribute(\"role\", \"listbox\");\n menu.hidden = true;\n trigger.setAttribute(\"aria-controls\", menu.id);\n const select = createMarkedElement(document, \"select\");\n select.className = \"spotpatch-select-native\";\n select.tabIndex = -1;\n select.setAttribute(\"aria-hidden\", \"true\");\n root.append(trigger, menu, select);\n\n function close(focus = false): void {\n if (menu.hidden) return;\n menu.hidden = true;\n trigger.setAttribute(\"aria-expanded\", \"false\");\n trigger.removeAttribute(\"aria-activedescendant\");\n if (focus) trigger.focus({ preventScroll: true });\n onViewChange();\n }\n\n function activate(index: number): void {\n const options = [...menu.children] as HTMLElement[];\n const active = options[index];\n if (active === undefined) return;\n for (const option of options) option.dataset.active = String(option === active);\n trigger.setAttribute(\"aria-activedescendant\", active.id);\n const itemRect = active.getBoundingClientRect();\n const menuRect = menu.getBoundingClientRect();\n if (itemRect.top < menuRect.top) menu.scrollTop -= menuRect.top - itemRect.top;\n else if (itemRect.bottom > menuRect.bottom)\n menu.scrollTop += itemRect.bottom - menuRect.bottom;\n }\n\n function open(): void {\n if (trigger.disabled || !menu.hidden) return;\n menu.hidden = false;\n trigger.setAttribute(\"aria-expanded\", \"true\");\n activate(Math.max(0, select.selectedIndex));\n onViewChange();\n }\n\n function sync(): void {\n text.textContent = select.selectedOptions[0]?.textContent ?? \"\";\n trigger.title = text.textContent;\n trigger.dataset.empty = String(select.value.length === 0);\n for (const option of [...menu.children] as HTMLElement[]) {\n option.setAttribute(\n \"aria-selected\",\n String(option.dataset.value === select.value),\n );\n }\n }\n\n function choose(value: string): void {\n if (trigger.disabled) return;\n select.value = value;\n sync();\n close(true);\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n\n function rebuild(): void {\n const expanded = !menu.hidden;\n const nativeOptions = [...select.options];\n menu.replaceChildren();\n for (const [index, option] of nativeOptions.entries()) {\n const item = createMarkedElement(document, \"div\");\n item.id = `${menu.id}-${String(index)}`;\n item.className = \"spotpatch-select-option\";\n item.setAttribute(\"role\", \"option\");\n item.dataset.value = option.value;\n item.textContent = option.textContent;\n item.title = option.textContent;\n item.addEventListener(\"pointerdown\", (event) => {\n event.preventDefault();\n });\n item.addEventListener(\"click\", () => {\n choose(option.value);\n });\n menu.append(item);\n }\n sync();\n if (expanded) {\n activate(Math.max(0, select.selectedIndex));\n onViewChange();\n }\n }\n\n trigger.addEventListener(\"click\", () => {\n if (menu.hidden) open();\n else close();\n });\n trigger.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Escape\" && !menu.hidden) {\n event.preventDefault();\n event.stopPropagation();\n close();\n return;\n }\n if (event.key === \"Tab\") {\n close();\n return;\n }\n if ([\"Enter\", \" \"].includes(event.key) && !menu.hidden) {\n event.preventDefault();\n const active = [...menu.children].find(\n (item) => item.id === trigger.getAttribute(\"aria-activedescendant\"),\n ) as HTMLElement | undefined;\n if (active?.dataset.value !== undefined) choose(active.dataset.value);\n return;\n }\n if (![\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key)) return;\n event.preventDefault();\n if (menu.hidden) {\n open();\n return;\n }\n const options = [...menu.children];\n const index = options.findIndex(\n (item) => item.id === trigger.getAttribute(\"aria-activedescendant\"),\n );\n activate(\n event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? options.length - 1\n : (index + (event.key === \"ArrowDown\" ? 1 : -1) + options.length) %\n options.length,\n );\n });\n root.addEventListener(\"focusout\", (event) => {\n if (!(event.relatedTarget instanceof Node) || !root.contains(event.relatedTarget))\n close();\n });\n const outside = (event: PointerEvent): void => {\n if (!event.composedPath().includes(root)) close();\n };\n document.addEventListener(\"pointerdown\", outside);\n select.addEventListener(\"change\", sync);\n return {\n root,\n trigger,\n select,\n rebuild,\n close,\n setDisabled(disabled: boolean): void {\n select.disabled = disabled;\n trigger.disabled = disabled || select.options.length < 2;\n trigger.dataset.expandable = String(!trigger.disabled);\n if (trigger.disabled) close();\n },\n dispose(): void {\n document.removeEventListener(\"pointerdown\", outside);\n },\n };\n}\n"],"mappings":"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","names":[]}
@@ -1,115 +0,0 @@
1
- // src/ui/motion-extension-contract.ts
2
- var MOTION_EXTENSION_KEY = /* @__PURE__ */ Symbol.for("spotpatch.motion.v1");
3
- function registerFloatingSurfaceMotionExtension(extension) {
4
- globalThis[MOTION_EXTENSION_KEY] = extension;
5
- }
6
- function getFloatingSurfaceMotionExtension() {
7
- return globalThis[MOTION_EXTENSION_KEY];
8
- }
9
-
10
- // src/ui/brand-mark-content.ts
11
- var BRAND_MARK_CONTENT = `
12
- <defs>
13
- <linearGradient id="locator-gradient" x1="76" y1="92" x2="436" y2="374" gradientUnits="userSpaceOnUse">
14
- <stop offset="0" stop-color="#B61CFF" />
15
- <stop offset="0.38" stop-color="#6D35FF" />
16
- <stop offset="0.72" stop-color="#168EFF" />
17
- <stop offset="1" stop-color="#00D9E9" />
18
- </linearGradient>
19
- <linearGradient id="left-code-gradient" x1="165" y1="166" x2="236" y2="258" gradientUnits="userSpaceOnUse">
20
- <stop stop-color="#A51EFF" />
21
- <stop offset="1" stop-color="#653BFF" />
22
- </linearGradient>
23
- <linearGradient id="right-code-gradient" x1="276" y1="166" x2="347" y2="258" gradientUnits="userSpaceOnUse">
24
- <stop stop-color="#158DFF" />
25
- <stop offset="1" stop-color="#00D8E9" />
26
- </linearGradient>
27
- <linearGradient id="bolt-gradient" x1="270" y1="111" x2="252" y2="365" gradientUnits="userSpaceOnUse">
28
- <stop stop-color="#6840FF" />
29
- <stop offset="0.48" stop-color="#257BFF" />
30
- <stop offset="1" stop-color="#00CBEF" />
31
- </linearGradient>
32
- </defs>
33
- <path
34
- fill="url(#locator-gradient)"
35
- fill-rule="evenodd"
36
- clip-rule="evenodd"
37
- d="M256 52C345.47 52 418 124.53 418 214C418 267.55 391.98 316.24 354.04 348.02L256 468L157.96 348.02C120.02 316.24 94 267.55 94 214C94 124.53 166.53 52 256 52ZM256 88C186.41 88 130 144.41 130 214C130 258.2 152.76 297.08 187.2 319.57L256 403.8L324.8 319.57C359.24 297.08 382 258.2 382 214C382 144.41 325.59 88 256 88Z"
38
- />
39
- <rect x="238" y="20" width="36" height="84" rx="4" fill="url(#locator-gradient)" />
40
- <rect x="62" y="196" width="84" height="36" rx="4" fill="url(#locator-gradient)" />
41
- <rect x="366" y="196" width="84" height="36" rx="4" fill="url(#locator-gradient)" />
42
- <path
43
- d="M213.5 160L158 211.5L213.5 263L238 236.5L211 211.5L238 186.5L213.5 160Z"
44
- fill="url(#left-code-gradient)"
45
- />
46
- <path
47
- d="M298.5 160L354 211.5L298.5 263L274 236.5L301 211.5L274 186.5L298.5 160Z"
48
- fill="url(#right-code-gradient)"
49
- />
50
- <path
51
- d="M283 108L232 212L266 253L238 369L302 237L267 198L283 108Z"
52
- fill="url(#bolt-gradient)"
53
- />
54
- `;
55
-
56
- // src/ui/brand-mark.ts
57
- var SVG_NAMESPACE = "http://www.w3.org/2000/svg";
58
- function resolveBrandMarkContent(override) {
59
- if (override !== void 0) {
60
- return { content: override, viewBox: "0 0 512 512" };
61
- }
62
- const injected = typeof __SPOTPATCH_BRAND_MARK_CONTENT__ === "string" ? __SPOTPATCH_BRAND_MARK_CONTENT__ : void 0;
63
- if (typeof injected === "string") {
64
- return { content: injected, viewBox: "0 0 512 512" };
65
- }
66
- return true ? { content: BRAND_MARK_CONTENT, viewBox: "0 0 512 512" } : { content: FALLBACK_BRAND_MARK_CONTENT, viewBox: "0 0 1 1" };
67
- }
68
- function svgElement(document, tagName, attributes) {
69
- const element = document.createElementNS(SVG_NAMESPACE, tagName);
70
- for (const [name, value] of Object.entries(attributes)) {
71
- element.setAttribute(name, value);
72
- }
73
- return element;
74
- }
75
- function namespaceSvgIds(svg, prefix) {
76
- const safePrefix = prefix.replace(/[^a-zA-Z0-9_-]/gu, "-");
77
- const ids = /* @__PURE__ */ new Map();
78
- for (const element of svg.querySelectorAll("[id]")) {
79
- const id = element.id;
80
- const namespacedId = `${safePrefix}-${id}`;
81
- ids.set(id, namespacedId);
82
- element.id = namespacedId;
83
- }
84
- for (const element of [svg, ...svg.querySelectorAll("*")]) {
85
- for (const attribute of [...element.attributes]) {
86
- let value = attribute.value;
87
- for (const [id, namespacedId] of ids) {
88
- value = value.replaceAll(`url(#${id})`, `url(#${namespacedId})`);
89
- if (value === `#${id}`) value = `#${namespacedId}`;
90
- }
91
- if (value !== attribute.value) element.setAttribute(attribute.name, value);
92
- }
93
- }
94
- }
95
- function createBrandMark(document, content, idPrefix) {
96
- const resolved = resolveBrandMarkContent(content);
97
- const svg = svgElement(document, "svg", {
98
- xmlns: SVG_NAMESPACE,
99
- class: "spotpatch-brand-mark",
100
- viewBox: resolved.viewBox,
101
- "aria-hidden": "true",
102
- focusable: "false"
103
- });
104
- svg.innerHTML = resolved.content;
105
- if (idPrefix !== void 0) namespaceSvgIds(svg, idPrefix);
106
- return svg;
107
- }
108
-
109
- export {
110
- BRAND_MARK_CONTENT,
111
- createBrandMark,
112
- registerFloatingSurfaceMotionExtension,
113
- getFloatingSurfaceMotionExtension
114
- };
115
- //# sourceMappingURL=chunk-P7W3F4UA.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ui/motion-extension-contract.ts","../src/ui/brand-mark-content.ts","../src/ui/brand-mark.ts"],"sourcesContent":["export type FloatingSurfaceScene =\n | \"pill\"\n | \"capturing\"\n | \"planner\"\n | \"agent-charging\"\n | \"handoff\"\n | \"running\"\n | \"success\"\n | \"failed\";\n\nexport type FloatingSurfaceTone =\n \"neutral\" | \"capturing\" | \"ready\" | \"running\" | \"success\" | \"danger\";\n\nexport type ExecutionActivityKind =\n | \"prepare\"\n | \"dispatch\"\n | \"discover\"\n | \"search\"\n | \"read\"\n | \"patch\"\n | \"check\"\n | \"audit\"\n | \"apply\"\n | \"sync\"\n | \"unknown\";\n\nexport interface FloatingSurfaceActivity {\n readonly detail?: string;\n readonly key: string;\n readonly kind: ExecutionActivityKind;\n readonly label: string;\n readonly state: \"active\" | \"success\" | \"failure\" | \"info\";\n}\n\nexport interface FloatingSurfaceProjection {\n readonly action: string;\n readonly activity?: FloatingSurfaceActivity;\n readonly expandedAction?: string;\n readonly expandedHeadline?: string;\n readonly headline: string;\n readonly meta: string;\n readonly recentActivities: readonly FloatingSurfaceActivity[];\n readonly scene: FloatingSurfaceScene;\n readonly startedAt?: string;\n readonly tone: FloatingSurfaceTone;\n}\n\nexport interface ExecutionIslandElements {\n readonly action: HTMLElement;\n readonly actionOutgoing: HTMLElement;\n readonly content: HTMLElement;\n readonly headline: HTMLElement;\n readonly headlineOutgoing: HTMLElement;\n readonly logo: SVGSVGElement;\n readonly mark: HTMLElement;\n readonly meta: HTMLElement;\n readonly metaDot: HTMLElement;\n readonly metaLabel: HTMLElement;\n readonly more: HTMLElement;\n readonly recent: HTMLElement;\n readonly root: HTMLButtonElement;\n readonly sweep: HTMLElement;\n readonly timer: HTMLElement;\n}\n\nexport interface ExecutionIslandView {\n readonly canExpand: () => boolean;\n readonly dispose: () => void;\n readonly isExpanded: () => boolean;\n readonly render: (projection: FloatingSurfaceProjection) => void;\n readonly root: HTMLButtonElement;\n readonly setExpanded: (expanded: boolean) => void;\n}\n\nexport interface MotionExecutionIsland extends ExecutionIslandView {\n readonly elements: ExecutionIslandElements;\n}\n\nexport interface FloatingSurfaceMotionElements {\n readonly execution: ExecutionIslandElements;\n readonly pill: HTMLButtonElement;\n readonly planner: HTMLElement;\n readonly surface: HTMLElement;\n}\n\nexport interface FloatingSurfaceMotionController {\n readonly cancel: () => void;\n readonly dispatch: (source: HTMLElement, target: HTMLElement) => void;\n readonly dispose: () => void;\n readonly render: (\n projection: FloatingSurfaceProjection,\n renderContent: () => void,\n ) => void;\n readonly updateLayout: (updateContent: () => void) => void;\n}\n\nexport interface FloatingSurfaceMotionExtension {\n readonly createExecutionIsland: (document: Document) => MotionExecutionIsland;\n readonly createController: (\n document: Document,\n elements: FloatingSurfaceMotionElements,\n reconcile: () => void,\n ) => FloatingSurfaceMotionController;\n readonly createStyles: (document: Document) => HTMLStyleElement;\n}\n\nconst MOTION_EXTENSION_KEY = Symbol.for(\"spotpatch.motion.v1\");\ntype ExtensionStore = Partial<Record<symbol, FloatingSurfaceMotionExtension>>;\n\nexport function registerFloatingSurfaceMotionExtension(\n extension: FloatingSurfaceMotionExtension,\n): void {\n (globalThis as ExtensionStore)[MOTION_EXTENSION_KEY] = extension;\n}\n\nexport function getFloatingSurfaceMotionExtension():\n FloatingSurfaceMotionExtension | undefined {\n return (globalThis as ExtensionStore)[MOTION_EXTENSION_KEY];\n}\n","/**\n * Canonical SpotPatch mark from docs/assets/spotpatch-logo-mark.svg.\n *\n * The Vite development injector consumes this trusted asset separately from\n * the core browser bundle so the Runtime gzip budget remains enforceable.\n */\nexport const BRAND_MARK_CONTENT = `\n <defs>\n <linearGradient id=\"locator-gradient\" x1=\"76\" y1=\"92\" x2=\"436\" y2=\"374\" gradientUnits=\"userSpaceOnUse\">\n <stop offset=\"0\" stop-color=\"#B61CFF\" />\n <stop offset=\"0.38\" stop-color=\"#6D35FF\" />\n <stop offset=\"0.72\" stop-color=\"#168EFF\" />\n <stop offset=\"1\" stop-color=\"#00D9E9\" />\n </linearGradient>\n <linearGradient id=\"left-code-gradient\" x1=\"165\" y1=\"166\" x2=\"236\" y2=\"258\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#A51EFF\" />\n <stop offset=\"1\" stop-color=\"#653BFF\" />\n </linearGradient>\n <linearGradient id=\"right-code-gradient\" x1=\"276\" y1=\"166\" x2=\"347\" y2=\"258\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#158DFF\" />\n <stop offset=\"1\" stop-color=\"#00D8E9\" />\n </linearGradient>\n <linearGradient id=\"bolt-gradient\" x1=\"270\" y1=\"111\" x2=\"252\" y2=\"365\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#6840FF\" />\n <stop offset=\"0.48\" stop-color=\"#257BFF\" />\n <stop offset=\"1\" stop-color=\"#00CBEF\" />\n </linearGradient>\n </defs>\n <path\n fill=\"url(#locator-gradient)\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M256 52C345.47 52 418 124.53 418 214C418 267.55 391.98 316.24 354.04 348.02L256 468L157.96 348.02C120.02 316.24 94 267.55 94 214C94 124.53 166.53 52 256 52ZM256 88C186.41 88 130 144.41 130 214C130 258.2 152.76 297.08 187.2 319.57L256 403.8L324.8 319.57C359.24 297.08 382 258.2 382 214C382 144.41 325.59 88 256 88Z\"\n />\n <rect x=\"238\" y=\"20\" width=\"36\" height=\"84\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <rect x=\"62\" y=\"196\" width=\"84\" height=\"36\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <rect x=\"366\" y=\"196\" width=\"84\" height=\"36\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <path\n d=\"M213.5 160L158 211.5L213.5 263L238 236.5L211 211.5L238 186.5L213.5 160Z\"\n fill=\"url(#left-code-gradient)\"\n />\n <path\n d=\"M298.5 160L354 211.5L298.5 263L274 236.5L301 211.5L274 186.5L298.5 160Z\"\n fill=\"url(#right-code-gradient)\"\n />\n <path\n d=\"M283 108L232 212L266 253L238 369L302 237L267 198L283 108Z\"\n fill=\"url(#bolt-gradient)\"\n />\n`;\n","import { BRAND_MARK_CONTENT } from \"./brand-mark-content.js\";\n\nconst SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\ndeclare const __SPOTPATCH_INLINE_BRAND_MARK__: boolean;\ndeclare const __SPOTPATCH_BRAND_MARK_CONTENT__: string | undefined;\n\n/**\n * Deliberately empty fail-closed fallback for an invalid Vite injection.\n *\n * The browser bundle must not carry a second logo implementation: normal\n * Vite development injects BRAND_MARK_CONTENT lexically, while standalone\n * Runtime builds inline the canonical asset at compile time. Keeping this\n * branch empty preserves the bundle budget and prevents stale branding if a\n * host violates either build contract.\n */\nconst FALLBACK_BRAND_MARK_CONTENT = \"\";\n\nfunction resolveBrandMarkContent(override?: string): Readonly<{\n readonly content: string;\n readonly viewBox: string;\n}> {\n if (override !== undefined) {\n return { content: override, viewBox: \"0 0 512 512\" };\n }\n\n const injected =\n typeof __SPOTPATCH_BRAND_MARK_CONTENT__ === \"string\"\n ? __SPOTPATCH_BRAND_MARK_CONTENT__\n : undefined;\n if (typeof injected === \"string\") {\n return { content: injected, viewBox: \"0 0 512 512\" };\n }\n\n return __SPOTPATCH_INLINE_BRAND_MARK__\n ? { content: BRAND_MARK_CONTENT, viewBox: \"0 0 512 512\" }\n : { content: FALLBACK_BRAND_MARK_CONTENT, viewBox: \"0 0 1 1\" };\n}\n\nfunction svgElement<K extends keyof SVGElementTagNameMap>(\n document: Document,\n tagName: K,\n attributes: Readonly<Record<string, string>>,\n): SVGElementTagNameMap[K] {\n const element = document.createElementNS(SVG_NAMESPACE, tagName);\n\n for (const [name, value] of Object.entries(attributes)) {\n element.setAttribute(name, value);\n }\n\n return element;\n}\n\nfunction namespaceSvgIds(svg: SVGSVGElement, prefix: string): void {\n const safePrefix = prefix.replace(/[^a-zA-Z0-9_-]/gu, \"-\");\n const ids = new Map<string, string>();\n\n for (const element of svg.querySelectorAll(\"[id]\")) {\n const id = element.id;\n const namespacedId = `${safePrefix}-${id}`;\n ids.set(id, namespacedId);\n element.id = namespacedId;\n }\n\n for (const element of [svg, ...svg.querySelectorAll(\"*\")]) {\n for (const attribute of [...element.attributes]) {\n let value = attribute.value;\n for (const [id, namespacedId] of ids) {\n value = value.replaceAll(`url(#${id})`, `url(#${namespacedId})`);\n if (value === `#${id}`) value = `#${namespacedId}`;\n }\n if (value !== attribute.value) element.setAttribute(attribute.name, value);\n }\n }\n}\n\n/** Vector form of docs/assets/spotpatch-logo-mark.svg; safe to inline in Shadow DOM. */\nexport function createBrandMark(\n document: Document,\n content?: string,\n idPrefix?: string,\n): SVGSVGElement {\n const resolved = resolveBrandMarkContent(content);\n const svg = svgElement(document, \"svg\", {\n xmlns: SVG_NAMESPACE,\n class: \"spotpatch-brand-mark\",\n viewBox: resolved.viewBox,\n \"aria-hidden\": \"true\",\n focusable: \"false\",\n });\n svg.innerHTML = resolved.content;\n if (idPrefix !== undefined) namespaceSvgIds(svg, idPrefix);\n return svg;\n}\n"],"mappings":";AA0GA,IAAM,uBAAuB,uBAAO,IAAI,qBAAqB;AAGtD,SAAS,uCACd,WACM;AACN,EAAC,WAA8B,oBAAoB,IAAI;AACzD;AAEO,SAAS,oCAC6B;AAC3C,SAAQ,WAA8B,oBAAoB;AAC5D;;;AChHO,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACJlC,IAAM,gBAAgB;AAetB,SAAS,wBAAwB,UAG9B;AACD,MAAI,aAAa,QAAW;AAC1B,WAAO,EAAE,SAAS,UAAU,SAAS,cAAc;AAAA,EACrD;AAEA,QAAM,WACJ,OAAO,qCAAqC,WACxC,mCACA;AACN,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO,EAAE,SAAS,UAAU,SAAS,cAAc;AAAA,EACrD;AAEA,SAAO,OACH,EAAE,SAAS,oBAAoB,SAAS,cAAc,IACtD,EAAE,SAAS,6BAA6B,SAAS,UAAU;AACjE;AAEA,SAAS,WACP,UACA,SACA,YACyB;AACzB,QAAM,UAAU,SAAS,gBAAgB,eAAe,OAAO;AAE/D,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACtD,YAAQ,aAAa,MAAM,KAAK;AAAA,EAClC;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,KAAoB,QAAsB;AACjE,QAAM,aAAa,OAAO,QAAQ,oBAAoB,GAAG;AACzD,QAAM,MAAM,oBAAI,IAAoB;AAEpC,aAAW,WAAW,IAAI,iBAAiB,MAAM,GAAG;AAClD,UAAM,KAAK,QAAQ;AACnB,UAAM,eAAe,GAAG,UAAU,IAAI,EAAE;AACxC,QAAI,IAAI,IAAI,YAAY;AACxB,YAAQ,KAAK;AAAA,EACf;AAEA,aAAW,WAAW,CAAC,KAAK,GAAG,IAAI,iBAAiB,GAAG,CAAC,GAAG;AACzD,eAAW,aAAa,CAAC,GAAG,QAAQ,UAAU,GAAG;AAC/C,UAAI,QAAQ,UAAU;AACtB,iBAAW,CAAC,IAAI,YAAY,KAAK,KAAK;AACpC,gBAAQ,MAAM,WAAW,QAAQ,EAAE,KAAK,QAAQ,YAAY,GAAG;AAC/D,YAAI,UAAU,IAAI,EAAE,GAAI,SAAQ,IAAI,YAAY;AAAA,MAClD;AACA,UAAI,UAAU,UAAU,MAAO,SAAQ,aAAa,UAAU,MAAM,KAAK;AAAA,IAC3E;AAAA,EACF;AACF;AAGO,SAAS,gBACd,UACA,SACA,UACe;AACf,QAAM,WAAW,wBAAwB,OAAO;AAChD,QAAM,MAAM,WAAW,UAAU,OAAO;AAAA,IACtC,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,SAAS;AAAA,IAClB,eAAe;AAAA,IACf,WAAW;AAAA,EACb,CAAC;AACD,MAAI,YAAY,SAAS;AACzB,MAAI,aAAa,OAAW,iBAAgB,KAAK,QAAQ;AACzD,SAAO;AACT;","names":[]}