@spotpatch/runtime 1.15.4 → 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.
@@ -6,18 +6,18 @@ import {
6
6
  // src/ui/ask-picker.ts
7
7
  var SELECT_PICKER_STYLES = `
8
8
  .spotpatch-select-picker { position: relative; display: grid; gap: 5px; min-width: 0; }
9
- .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; }
9
+ .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: var(--spotpatch-radius-md); padding: 0 12px; overflow: hidden; color: var(--spotpatch-text); background: var(--spotpatch-bg-input); cursor: pointer; font: inherit; outline: none; text-align: left; transition: border-color var(--spotpatch-duration-fast) ease, box-shadow var(--spotpatch-duration-fast) ease; }
10
+ .spotpatch-select-trigger:hover:not(:disabled) { border-color: var(--spotpatch-border-strong); }
10
11
  .spotpatch-select-trigger > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
11
- .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); }
12
+ .spotpatch-select-trigger[data-expandable="true"]::after { width: 7px; height: 7px; flex: 0 0 auto; border-right: 1.5px solid var(--spotpatch-text-muted); border-bottom: 1.5px solid var(--spotpatch-text-muted); content: ""; transform: translateY(-2px) rotate(45deg); transition: transform var(--spotpatch-duration-base) var(--spotpatch-ease-out); }
12
13
  .spotpatch-select-trigger[aria-expanded="true"]::after { transform: translateY(2px) rotate(225deg); }
13
- .spotpatch-select-trigger:focus-visible { border-color: rgb(139 123 255 / 68%); box-shadow: 0 0 0 3px rgb(139 123 255 / 12%); }
14
- .spotpatch-select-trigger:disabled { color: var(--spotpatch-text); background: rgb(255 255 255 / 3%); cursor: default; opacity: 1; }
14
+ .spotpatch-select-trigger:focus-visible { border-color: var(--spotpatch-accent-line); box-shadow: 0 0 0 3px var(--spotpatch-accent-tint); }
15
+ .spotpatch-select-trigger:disabled { color: var(--spotpatch-text); background: var(--spotpatch-hover); cursor: default; opacity: 1; }
15
16
  .spotpatch-select-trigger[data-empty="true"]:disabled { color: var(--spotpatch-text-muted); }
16
- .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; }
17
- .spotpatch-select-menu[hidden] { display: none; }
18
- .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; }
19
- .spotpatch-select-option[data-active="true"], .spotpatch-select-option:hover { color: #fff; background: rgb(139 123 255 / 13%); outline: none; }
20
- .spotpatch-select-option[aria-selected="true"] { color: #f4f1ff; background: rgb(139 123 255 / 20%); }
17
+ .spotpatch-select-menu { position: relative; z-index: 1; display: grid; gap: 2px; max-height: 224px; overflow-y: auto; overscroll-behavior: contain; border: 1px solid var(--spotpatch-border); border-radius: var(--spotpatch-radius-md); padding: 4px; background: var(--spotpatch-bg-raised); box-shadow: var(--spotpatch-shadow-panel); animation: spotpatch-enter var(--spotpatch-duration-base) var(--spotpatch-ease-out) both; }
18
+ .spotpatch-select-option { box-sizing: border-box; min-height: 34px; border: 0; border-radius: var(--spotpatch-radius-xs); padding: 7px 10px; overflow-wrap: anywhere; color: var(--spotpatch-text-secondary); background: transparent; cursor: pointer; font: inherit; text-align: left; }
19
+ .spotpatch-select-option[data-active="true"], .spotpatch-select-option:hover { color: var(--spotpatch-text); background: var(--spotpatch-hover); outline: none; }
20
+ .spotpatch-select-option[aria-selected="true"] { color: var(--spotpatch-text); background: var(--spotpatch-accent-tint); }
21
21
  .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; }
22
22
  `;
23
23
  function createSelectPicker(document, onViewChange) {
@@ -180,4 +180,4 @@ export {
180
180
  SELECT_PICKER_STYLES,
181
181
  createSelectPicker
182
182
  };
183
- //# sourceMappingURL=chunk-ELCIEQGT.js.map
183
+ //# sourceMappingURL=chunk-HVI76KFV.js.map
@@ -0,0 +1 @@
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: var(--spotpatch-radius-md); padding: 0 12px; overflow: hidden; color: var(--spotpatch-text); background: var(--spotpatch-bg-input); cursor: pointer; font: inherit; outline: none; text-align: left; transition: border-color var(--spotpatch-duration-fast) ease, box-shadow var(--spotpatch-duration-fast) ease; }\n .spotpatch-select-trigger:hover:not(:disabled) { border-color: var(--spotpatch-border-strong); }\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 var(--spotpatch-text-muted); border-bottom: 1.5px solid var(--spotpatch-text-muted); content: \"\"; transform: translateY(-2px) rotate(45deg); transition: transform var(--spotpatch-duration-base) var(--spotpatch-ease-out); }\n .spotpatch-select-trigger[aria-expanded=\"true\"]::after { transform: translateY(2px) rotate(225deg); }\n .spotpatch-select-trigger:focus-visible { border-color: var(--spotpatch-accent-line); box-shadow: 0 0 0 3px var(--spotpatch-accent-tint); }\n .spotpatch-select-trigger:disabled { color: var(--spotpatch-text); background: var(--spotpatch-hover); 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: 2px; max-height: 224px; overflow-y: auto; overscroll-behavior: contain; border: 1px solid var(--spotpatch-border); border-radius: var(--spotpatch-radius-md); padding: 4px; background: var(--spotpatch-bg-raised); box-shadow: var(--spotpatch-shadow-panel); animation: spotpatch-enter var(--spotpatch-duration-base) var(--spotpatch-ease-out) both; }\n .spotpatch-select-option { box-sizing: border-box; min-height: 34px; border: 0; border-radius: var(--spotpatch-radius-xs); padding: 7px 10px; 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: var(--spotpatch-text); background: var(--spotpatch-hover); outline: none; }\n .spotpatch-select-option[aria-selected=\"true\"] { color: var(--spotpatch-text); background: var(--spotpatch-accent-tint); }\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":[]}
@@ -0,0 +1,224 @@
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
+ // src/ui/theme.ts
110
+ var THEME_STYLES = `
111
+ :host {
112
+ all: initial;
113
+ color-scheme: dark;
114
+
115
+ --spotpatch-bg: #0c0d12;
116
+ --spotpatch-bg-raised: #14161d;
117
+ --spotpatch-bg-active: #1b1e28;
118
+ --spotpatch-bg-input: #08090d;
119
+ --spotpatch-border-subtle: rgb(255 255 255 / 7%);
120
+ --spotpatch-border: rgb(255 255 255 / 11%);
121
+ --spotpatch-border-strong: rgb(255 255 255 / 20%);
122
+ --spotpatch-hover: rgb(255 255 255 / 5%);
123
+
124
+ --spotpatch-text: #f4f5f7;
125
+ --spotpatch-text-secondary: #a7acb8;
126
+ --spotpatch-text-muted: #737987;
127
+ --spotpatch-text-on-accent: #ffffff;
128
+
129
+ --spotpatch-accent: #7c4dff;
130
+ --spotpatch-accent-strong: #6d35ff;
131
+ --spotpatch-accent-soft: #c4b3ff;
132
+ --spotpatch-accent-cyan: #00d9e9;
133
+ --spotpatch-accent-blue: #168eff;
134
+ --spotpatch-success: #45d483;
135
+ --spotpatch-warning: #f4b860;
136
+ --spotpatch-danger: #ff6b7a;
137
+
138
+ --spotpatch-accent-tint: color-mix(in srgb, var(--spotpatch-accent) 16%, transparent);
139
+ --spotpatch-accent-line: color-mix(in srgb, var(--spotpatch-accent) 48%, transparent);
140
+ --spotpatch-cyan-text: color-mix(in srgb, var(--spotpatch-accent-cyan) 70%, var(--spotpatch-text));
141
+ --spotpatch-cyan-tint: color-mix(in srgb, var(--spotpatch-accent-cyan) 10%, transparent);
142
+ --spotpatch-cyan-line: color-mix(in srgb, var(--spotpatch-accent-cyan) 30%, transparent);
143
+ --spotpatch-success-text: color-mix(in srgb, var(--spotpatch-success) 72%, var(--spotpatch-text));
144
+ --spotpatch-success-tint: color-mix(in srgb, var(--spotpatch-success) 12%, transparent);
145
+ --spotpatch-warning-text: color-mix(in srgb, var(--spotpatch-warning) 78%, var(--spotpatch-text));
146
+ --spotpatch-warning-tint: color-mix(in srgb, var(--spotpatch-warning) 11%, transparent);
147
+ --spotpatch-warning-line: color-mix(in srgb, var(--spotpatch-warning) 30%, transparent);
148
+ --spotpatch-danger-text: color-mix(in srgb, var(--spotpatch-danger) 72%, var(--spotpatch-text));
149
+ --spotpatch-danger-tint: color-mix(in srgb, var(--spotpatch-danger) 11%, transparent);
150
+ --spotpatch-danger-line: color-mix(in srgb, var(--spotpatch-danger) 30%, transparent);
151
+
152
+ --spotpatch-primary-fill: linear-gradient(135deg, var(--spotpatch-accent), var(--spotpatch-accent-strong));
153
+ --spotpatch-brand-line: linear-gradient(90deg, var(--spotpatch-accent), var(--spotpatch-accent-blue), var(--spotpatch-accent-cyan));
154
+ --spotpatch-surface-fill:
155
+ linear-gradient(180deg, rgb(255 255 255 / 3.5%), transparent 30%),
156
+ var(--spotpatch-bg);
157
+ --spotpatch-scrim: rgb(3 3 8 / 72%);
158
+
159
+ --spotpatch-shadow-float: 0 18px 44px rgb(6 8 18 / 30%), 0 2px 8px rgb(6 8 18 / 18%);
160
+ --spotpatch-shadow-panel: 0 28px 70px rgb(6 8 18 / 42%), 0 4px 14px rgb(6 8 18 / 22%);
161
+ --spotpatch-shadow-inset: inset 0 1px 0 rgb(255 255 255 / 7%);
162
+ --spotpatch-shadow-accent: 0 10px 26px -10px color-mix(in srgb, var(--spotpatch-accent-strong) 80%, transparent);
163
+
164
+ --spotpatch-radius-xs: 6px;
165
+ --spotpatch-radius-sm: 8px;
166
+ --spotpatch-radius-md: 10px;
167
+ --spotpatch-radius-card: 12px;
168
+ --spotpatch-radius-panel: 20px;
169
+ --spotpatch-radius-pill: 999px;
170
+
171
+ --spotpatch-ease-out: cubic-bezier(.16, 1, .3, 1);
172
+ --spotpatch-ease-spring: cubic-bezier(.34, 1.36, .64, 1);
173
+ --spotpatch-ease-standard: cubic-bezier(.2, 0, 0, 1);
174
+ --spotpatch-duration-fast: 140ms;
175
+ --spotpatch-duration-base: 220ms;
176
+ --spotpatch-duration-slow: 420ms;
177
+
178
+ --spotpatch-font-sans: Inter, "SF Pro Text", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
179
+ --spotpatch-font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
180
+
181
+ color: var(--spotpatch-text);
182
+ font-family: var(--spotpatch-font-sans);
183
+ font-size: 14px;
184
+ line-height: 1.5;
185
+ -webkit-font-smoothing: antialiased;
186
+ }
187
+ [hidden] { display: none !important; }
188
+ button, textarea, select, input { font: inherit; }
189
+ :focus-visible {
190
+ outline: 2px solid var(--spotpatch-accent-soft);
191
+ outline-offset: 2px;
192
+ }
193
+ * {
194
+ scrollbar-color: var(--spotpatch-border-strong) transparent;
195
+ scrollbar-width: thin;
196
+ }
197
+ @keyframes spotpatch-enter {
198
+ from { opacity: 0; filter: blur(3px); transform: translate3d(0, 6px, 0); }
199
+ }
200
+ @keyframes spotpatch-pop {
201
+ from { opacity: 0; transform: scale(.94); }
202
+ }
203
+ @media (prefers-reduced-motion: reduce) {
204
+ *, *::before, *::after {
205
+ animation-duration: .01ms !important;
206
+ animation-iteration-count: 1 !important;
207
+ transition-duration: .01ms !important;
208
+ }
209
+ }
210
+ `;
211
+ var THEME_MOTION_COLORS = Object.freeze({
212
+ dispatchGlowRest: "0 0 0 0 rgb(124 77 255 / 0%)",
213
+ dispatchGlow: "0 0 0 4px rgb(124 77 255 / 22%)"
214
+ });
215
+
216
+ export {
217
+ BRAND_MARK_CONTENT,
218
+ createBrandMark,
219
+ THEME_STYLES,
220
+ THEME_MOTION_COLORS,
221
+ registerFloatingSurfaceMotionExtension,
222
+ getFloatingSurfaceMotionExtension
223
+ };
224
+ //# sourceMappingURL=chunk-N4TPX3YF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/motion-extension-contract.ts","../src/ui/brand-mark-content.ts","../src/ui/brand-mark.ts","../src/ui/theme.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","/**\n * Design tokens and base rules for every stylesheet in the SpotPatch shadow\n * root. This is the only UI module allowed to contain literal colors; other\n * stylesheets reference the custom properties declared here.\n */\nexport const THEME_STYLES = `\n :host {\n all: initial;\n color-scheme: dark;\n\n --spotpatch-bg: #0c0d12;\n --spotpatch-bg-raised: #14161d;\n --spotpatch-bg-active: #1b1e28;\n --spotpatch-bg-input: #08090d;\n --spotpatch-border-subtle: rgb(255 255 255 / 7%);\n --spotpatch-border: rgb(255 255 255 / 11%);\n --spotpatch-border-strong: rgb(255 255 255 / 20%);\n --spotpatch-hover: rgb(255 255 255 / 5%);\n\n --spotpatch-text: #f4f5f7;\n --spotpatch-text-secondary: #a7acb8;\n --spotpatch-text-muted: #737987;\n --spotpatch-text-on-accent: #ffffff;\n\n --spotpatch-accent: #7c4dff;\n --spotpatch-accent-strong: #6d35ff;\n --spotpatch-accent-soft: #c4b3ff;\n --spotpatch-accent-cyan: #00d9e9;\n --spotpatch-accent-blue: #168eff;\n --spotpatch-success: #45d483;\n --spotpatch-warning: #f4b860;\n --spotpatch-danger: #ff6b7a;\n\n --spotpatch-accent-tint: color-mix(in srgb, var(--spotpatch-accent) 16%, transparent);\n --spotpatch-accent-line: color-mix(in srgb, var(--spotpatch-accent) 48%, transparent);\n --spotpatch-cyan-text: color-mix(in srgb, var(--spotpatch-accent-cyan) 70%, var(--spotpatch-text));\n --spotpatch-cyan-tint: color-mix(in srgb, var(--spotpatch-accent-cyan) 10%, transparent);\n --spotpatch-cyan-line: color-mix(in srgb, var(--spotpatch-accent-cyan) 30%, transparent);\n --spotpatch-success-text: color-mix(in srgb, var(--spotpatch-success) 72%, var(--spotpatch-text));\n --spotpatch-success-tint: color-mix(in srgb, var(--spotpatch-success) 12%, transparent);\n --spotpatch-warning-text: color-mix(in srgb, var(--spotpatch-warning) 78%, var(--spotpatch-text));\n --spotpatch-warning-tint: color-mix(in srgb, var(--spotpatch-warning) 11%, transparent);\n --spotpatch-warning-line: color-mix(in srgb, var(--spotpatch-warning) 30%, transparent);\n --spotpatch-danger-text: color-mix(in srgb, var(--spotpatch-danger) 72%, var(--spotpatch-text));\n --spotpatch-danger-tint: color-mix(in srgb, var(--spotpatch-danger) 11%, transparent);\n --spotpatch-danger-line: color-mix(in srgb, var(--spotpatch-danger) 30%, transparent);\n\n --spotpatch-primary-fill: linear-gradient(135deg, var(--spotpatch-accent), var(--spotpatch-accent-strong));\n --spotpatch-brand-line: linear-gradient(90deg, var(--spotpatch-accent), var(--spotpatch-accent-blue), var(--spotpatch-accent-cyan));\n --spotpatch-surface-fill:\n linear-gradient(180deg, rgb(255 255 255 / 3.5%), transparent 30%),\n var(--spotpatch-bg);\n --spotpatch-scrim: rgb(3 3 8 / 72%);\n\n --spotpatch-shadow-float: 0 18px 44px rgb(6 8 18 / 30%), 0 2px 8px rgb(6 8 18 / 18%);\n --spotpatch-shadow-panel: 0 28px 70px rgb(6 8 18 / 42%), 0 4px 14px rgb(6 8 18 / 22%);\n --spotpatch-shadow-inset: inset 0 1px 0 rgb(255 255 255 / 7%);\n --spotpatch-shadow-accent: 0 10px 26px -10px color-mix(in srgb, var(--spotpatch-accent-strong) 80%, transparent);\n\n --spotpatch-radius-xs: 6px;\n --spotpatch-radius-sm: 8px;\n --spotpatch-radius-md: 10px;\n --spotpatch-radius-card: 12px;\n --spotpatch-radius-panel: 20px;\n --spotpatch-radius-pill: 999px;\n\n --spotpatch-ease-out: cubic-bezier(.16, 1, .3, 1);\n --spotpatch-ease-spring: cubic-bezier(.34, 1.36, .64, 1);\n --spotpatch-ease-standard: cubic-bezier(.2, 0, 0, 1);\n --spotpatch-duration-fast: 140ms;\n --spotpatch-duration-base: 220ms;\n --spotpatch-duration-slow: 420ms;\n\n --spotpatch-font-sans: Inter, \"SF Pro Text\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n --spotpatch-font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n\n color: var(--spotpatch-text);\n font-family: var(--spotpatch-font-sans);\n font-size: 14px;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n }\n [hidden] { display: none !important; }\n button, textarea, select, input { font: inherit; }\n :focus-visible {\n outline: 2px solid var(--spotpatch-accent-soft);\n outline-offset: 2px;\n }\n * {\n scrollbar-color: var(--spotpatch-border-strong) transparent;\n scrollbar-width: thin;\n }\n @keyframes spotpatch-enter {\n from { opacity: 0; filter: blur(3px); transform: translate3d(0, 6px, 0); }\n }\n @keyframes spotpatch-pop {\n from { opacity: 0; transform: scale(.94); }\n }\n @media (prefers-reduced-motion: reduce) {\n *, *::before, *::after {\n animation-duration: .01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: .01ms !important;\n }\n }\n`;\n\n/**\n * Literal colors for values that GSAP interpolates, which cannot resolve CSS\n * custom properties. Keep them in step with the tokens above.\n */\nexport const THEME_MOTION_COLORS = Object.freeze({\n dispatchGlowRest: \"0 0 0 0 rgb(124 77 255 / 0%)\",\n dispatchGlow: \"0 0 0 4px rgb(124 77 255 / 22%)\",\n});\n"],"mappings":"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","names":[]}