@mihe-dev/js 0.0.0-stage → 0.2.0

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.
Files changed (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +114 -2
  3. package/dist/audio.d.ts +121 -0
  4. package/dist/audio.d.ts.map +1 -0
  5. package/dist/audio.js +377 -0
  6. package/dist/audio.js.map +1 -0
  7. package/dist/card-view.d.ts +79 -0
  8. package/dist/card-view.d.ts.map +1 -0
  9. package/dist/card-view.js +99 -0
  10. package/dist/card-view.js.map +1 -0
  11. package/dist/chart.d.ts +15 -0
  12. package/dist/chart.d.ts.map +1 -0
  13. package/dist/chart.js +58 -0
  14. package/dist/chart.js.map +1 -0
  15. package/dist/client.d.ts +226 -0
  16. package/dist/client.d.ts.map +1 -0
  17. package/dist/client.js +358 -0
  18. package/dist/client.js.map +1 -0
  19. package/dist/commands.d.ts +70 -0
  20. package/dist/commands.d.ts.map +1 -0
  21. package/dist/commands.js +295 -0
  22. package/dist/commands.js.map +1 -0
  23. package/dist/debug.d.ts +17 -0
  24. package/dist/debug.d.ts.map +1 -0
  25. package/dist/debug.js +29 -0
  26. package/dist/debug.js.map +1 -0
  27. package/dist/declarations.d.ts +160 -0
  28. package/dist/declarations.d.ts.map +1 -0
  29. package/dist/declarations.js +171 -0
  30. package/dist/declarations.js.map +1 -0
  31. package/dist/highlight.d.ts +77 -0
  32. package/dist/highlight.d.ts.map +1 -0
  33. package/dist/highlight.js +233 -0
  34. package/dist/highlight.js.map +1 -0
  35. package/dist/index.d.ts +41 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +32 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/mihe.d.ts +364 -0
  40. package/dist/mihe.d.ts.map +1 -0
  41. package/dist/mihe.iife.min.js +217 -0
  42. package/dist/mihe.iife.min.js.map +7 -0
  43. package/dist/mihe.js +758 -0
  44. package/dist/mihe.js.map +1 -0
  45. package/dist/mihe.min.js +217 -0
  46. package/dist/mihe.min.js.map +7 -0
  47. package/dist/store.d.ts +175 -0
  48. package/dist/store.d.ts.map +1 -0
  49. package/dist/store.js +208 -0
  50. package/dist/store.js.map +1 -0
  51. package/dist/voice.d.ts +192 -0
  52. package/dist/voice.d.ts.map +1 -0
  53. package/dist/voice.js +443 -0
  54. package/dist/voice.js.map +1 -0
  55. package/dist/widget/card.d.ts +17 -0
  56. package/dist/widget/card.d.ts.map +1 -0
  57. package/dist/widget/card.js +31 -0
  58. package/dist/widget/card.js.map +1 -0
  59. package/dist/widget/dom.d.ts +24 -0
  60. package/dist/widget/dom.d.ts.map +1 -0
  61. package/dist/widget/dom.js +49 -0
  62. package/dist/widget/dom.js.map +1 -0
  63. package/dist/widget/element.d.ts +88 -0
  64. package/dist/widget/element.d.ts.map +1 -0
  65. package/dist/widget/element.js +285 -0
  66. package/dist/widget/element.js.map +1 -0
  67. package/dist/widget/format.d.ts +24 -0
  68. package/dist/widget/format.d.ts.map +1 -0
  69. package/dist/widget/format.js +64 -0
  70. package/dist/widget/format.js.map +1 -0
  71. package/dist/widget/icons.d.ts +5 -0
  72. package/dist/widget/icons.d.ts.map +1 -0
  73. package/dist/widget/icons.js +19 -0
  74. package/dist/widget/icons.js.map +1 -0
  75. package/dist/widget/launcher.d.ts +13 -0
  76. package/dist/widget/launcher.d.ts.map +1 -0
  77. package/dist/widget/launcher.js +27 -0
  78. package/dist/widget/launcher.js.map +1 -0
  79. package/dist/widget/mark.d.ts +10 -0
  80. package/dist/widget/mark.d.ts.map +1 -0
  81. package/dist/widget/mark.js +20 -0
  82. package/dist/widget/mark.js.map +1 -0
  83. package/dist/widget/orb.d.ts +92 -0
  84. package/dist/widget/orb.d.ts.map +1 -0
  85. package/dist/widget/orb.js +500 -0
  86. package/dist/widget/orb.js.map +1 -0
  87. package/dist/widget/panel.d.ts +40 -0
  88. package/dist/widget/panel.d.ts.map +1 -0
  89. package/dist/widget/panel.js +240 -0
  90. package/dist/widget/panel.js.map +1 -0
  91. package/dist/widget/styles.d.ts +22 -0
  92. package/dist/widget/styles.d.ts.map +1 -0
  93. package/dist/widget/styles.js +192 -0
  94. package/dist/widget/styles.js.map +1 -0
  95. package/package.json +43 -4
@@ -0,0 +1,92 @@
1
+ /**
2
+ * The orb: the widget as a circle, and voice shown in the circle itself
3
+ * (amendment 61). The React SDK's `orb.tsx` in plain DOM; its comments carry
4
+ * the reasoning, and the behaviour is the same:
5
+ *
6
+ * | Mode | Tap | Hold | Drag past 8px |
7
+ * |--------------|--------------------------|--------------------------|--------------------------|
8
+ * | Idle | menu, or chat | nothing | moves it, if draggable |
9
+ * | Menu open | closes it | nothing | nothing |
10
+ * | Hands-free | ends the session | nothing | moves it, if draggable |
11
+ * | Push-to-talk | nothing | records, release sends | discards, then moves it |
12
+ *
13
+ * Two things the orb still shows with the panel closed: the confirmation
14
+ * card, from the proposal payload, and refusals and errors, in a bubble.
15
+ *
16
+ * The orb button is built once and updated, never replaced, because a press
17
+ * in progress holds pointer capture on it.
18
+ */
19
+ import type { VoiceMode, WidgetCorner } from "@mihe-dev/protocol";
20
+ import type { Mihe, MiheState } from "../mihe.js";
21
+ export declare const ORB_SIZE = 56;
22
+ export declare const MARGIN = 20;
23
+ export interface OrbOptions {
24
+ heading: string;
25
+ draggable: boolean;
26
+ corner: WidgetCorner;
27
+ voiceModes: VoiceMode[];
28
+ /** Drawn in the orb in place of the uploaded icon or the mark. Cloned. */
29
+ launcherIcon?: Node;
30
+ /** Distance from the viewport's bottom and side edges, in pixels. */
31
+ offset: {
32
+ bottom: number;
33
+ side: number;
34
+ };
35
+ }
36
+ export declare class Orb {
37
+ private readonly mihe;
38
+ /** Everything the orb draws, as siblings in the shadow root. */
39
+ readonly root: HTMLElement;
40
+ private readonly button;
41
+ private readonly ring;
42
+ private readonly face;
43
+ private readonly stop;
44
+ private readonly menu;
45
+ private readonly cards;
46
+ private readonly bubble;
47
+ private options;
48
+ private state;
49
+ private menuOpen;
50
+ private rest;
51
+ private drag;
52
+ private showHint;
53
+ private press;
54
+ private previousVoiceState;
55
+ private faceKey;
56
+ private drawnProposals;
57
+ private drawnViews;
58
+ private failedIcon;
59
+ private ringFrame;
60
+ private stopLevel;
61
+ private readonly reducedMotion;
62
+ private readonly cleanups;
63
+ constructor(mihe: Mihe);
64
+ update(state: MiheState, options: OrbOptions): void;
65
+ destroy(): void;
66
+ private get voiceLive();
67
+ private get handsFree();
68
+ private get holdToTalk();
69
+ private menuItems;
70
+ private viewport;
71
+ private clampTop;
72
+ /** The side the orb sits on, which is also where the panel opens. */
73
+ side(): "left" | "right";
74
+ private position;
75
+ private render;
76
+ /**
77
+ * The ring follows the voice level without a redraw: a level arrives tens
78
+ * of times a second, and each one only moves one element.
79
+ */
80
+ private syncRing;
81
+ private stopRing;
82
+ private setMenu;
83
+ private choose;
84
+ private onMenuKeyDown;
85
+ private tap;
86
+ private onPointerDown;
87
+ private onPointerMove;
88
+ private finish;
89
+ private onKeyDown;
90
+ private onKeyUp;
91
+ }
92
+ //# sourceMappingURL=orb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orb.d.ts","sourceRoot":"","sources":["../../../../js/src/widget/orb.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElE,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAM/C,eAAO,MAAM,QAAQ,KAAK,CAAC;AAC3B,eAAO,MAAM,MAAM,KAAK,CAAC;AAezB,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,qEAAqE;IACrE,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C;AAkDD,qBAAa,GAAG;IA6BF,OAAO,CAAC,QAAQ,CAAC,IAAI;IA5BjC,gEAAgE;IAChE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IACzC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IAErC,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,IAAI,CAA8C;IAC1D,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,kBAAkB,CAAkB;IAC5C,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAC8E;IAC5G,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;gBAElB,IAAI,EAAE,IAAI;IAiDvC,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI;IAenD,OAAO,IAAI,IAAI;IAQf,OAAO,KAAK,SAAS,GAGpB;IAED,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,KAAK,UAAU,GAErB;IAED,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,QAAQ;IAMhB,qEAAqE;IACrE,IAAI,IAAI,MAAM,GAAG,OAAO;IAMxB,OAAO,CAAC,QAAQ;IAahB,OAAO,CAAC,MAAM;IA+Gd;;;OAGG;IACH,OAAO,CAAC,QAAQ;IAyBhB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,GAAG;IAgBX,OAAO,CAAC,aAAa;IAkCrB,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,MAAM;IA4Bd,OAAO,CAAC,SAAS;IAkBjB,OAAO,CAAC,OAAO;CAMhB"}
@@ -0,0 +1,500 @@
1
+ /**
2
+ * The orb: the widget as a circle, and voice shown in the circle itself
3
+ * (amendment 61). The React SDK's `orb.tsx` in plain DOM; its comments carry
4
+ * the reasoning, and the behaviour is the same:
5
+ *
6
+ * | Mode | Tap | Hold | Drag past 8px |
7
+ * |--------------|--------------------------|--------------------------|--------------------------|
8
+ * | Idle | menu, or chat | nothing | moves it, if draggable |
9
+ * | Menu open | closes it | nothing | nothing |
10
+ * | Hands-free | ends the session | nothing | moves it, if draggable |
11
+ * | Push-to-talk | nothing | records, release sends | discards, then moves it |
12
+ *
13
+ * Two things the orb still shows with the panel closed: the confirmation
14
+ * card, from the proposal payload, and refusals and errors, in a bubble.
15
+ *
16
+ * The orb button is built once and updated, never replaced, because a press
17
+ * in progress holds pointer capture on it.
18
+ */
19
+ import { confirmationCard } from "./card.js";
20
+ import { h, replace, setAttrs } from "./dom.js";
21
+ import { chatIcon, micIcon, waveIcon } from "./icons.js";
22
+ import { launcherFace } from "./launcher.js";
23
+ export const ORB_SIZE = 56;
24
+ export const MARGIN = 20;
25
+ const DRAG_THRESHOLD = 8;
26
+ /** How long a press is held on the device before it counts as speech. */
27
+ const HOLD_WINDOW_MS = 150;
28
+ const POSITION_KEY = "mihe:orb-position";
29
+ const HINT_KEY = "mihe:hold-hint-done";
30
+ function readRest() {
31
+ try {
32
+ const raw = window.localStorage.getItem(POSITION_KEY);
33
+ if (!raw)
34
+ return null;
35
+ const parsed = JSON.parse(raw);
36
+ if ((parsed.side === "left" || parsed.side === "right") && typeof parsed.y === "number")
37
+ return parsed;
38
+ }
39
+ catch {
40
+ // Private windows and blocked storage: fall back to the corner.
41
+ }
42
+ return null;
43
+ }
44
+ function writeRest(rest) {
45
+ try {
46
+ window.localStorage.setItem(POSITION_KEY, JSON.stringify(rest));
47
+ }
48
+ catch {
49
+ // Remembering is a convenience; forgetting is fine.
50
+ }
51
+ }
52
+ function hintDone() {
53
+ try {
54
+ return window.localStorage.getItem(HINT_KEY) === "1";
55
+ }
56
+ catch {
57
+ return false;
58
+ }
59
+ }
60
+ function markHintDone() {
61
+ try {
62
+ window.localStorage.setItem(HINT_KEY, "1");
63
+ }
64
+ catch {
65
+ // Shown again next time, which is harmless.
66
+ }
67
+ }
68
+ export class Orb {
69
+ mihe;
70
+ /** Everything the orb draws, as siblings in the shadow root. */
71
+ root;
72
+ button;
73
+ ring;
74
+ face;
75
+ stop;
76
+ menu;
77
+ cards;
78
+ bubble;
79
+ options;
80
+ state;
81
+ menuOpen = false;
82
+ rest = null;
83
+ drag = null;
84
+ showHint = !hintDone();
85
+ press = null;
86
+ previousVoiceState = "idle";
87
+ faceKey = undefined;
88
+ drawnProposals = undefined;
89
+ drawnViews = undefined;
90
+ failedIcon = null;
91
+ ringFrame = 0;
92
+ stopLevel = null;
93
+ reducedMotion = typeof window !== "undefined" && window.matchMedia?.("(prefers-reduced-motion: reduce)").matches === true;
94
+ cleanups = [];
95
+ constructor(mihe) {
96
+ this.mihe = mihe;
97
+ this.ring = h("span", { class: "ring idle", attrs: { "aria-hidden": "true" } });
98
+ this.face = h("span", { class: "face" });
99
+ this.button = h("button", {
100
+ class: "orb",
101
+ attrs: { type: "button" },
102
+ on: {
103
+ pointerdown: (event) => this.onPointerDown(event),
104
+ pointermove: (event) => this.onPointerMove(event),
105
+ pointerup: () => this.finish(false),
106
+ pointercancel: () => this.finish(true),
107
+ keydown: (event) => this.onKeyDown(event),
108
+ keyup: (event) => this.onKeyUp(event),
109
+ contextmenu: (event) => event.preventDefault(),
110
+ },
111
+ }, this.ring, this.face);
112
+ // Always a visible way out that is not a gesture.
113
+ this.stop = h("button", {
114
+ class: "stop",
115
+ attrs: { type: "button", "aria-label": "End voice" },
116
+ on: { click: () => this.mihe.voice.stop() },
117
+ }, h("span", { class: "stop-square", attrs: { "aria-hidden": "true" } }));
118
+ this.menu = h("div", { class: "popover", attrs: { role: "menu" }, on: { keydown: (event) => this.onMenuKeyDown(event) } });
119
+ this.cards = h("div", { class: "popover cards" });
120
+ this.bubble = h("div", { class: "popover orb-bubble", attrs: { role: "status", "aria-live": "polite" } });
121
+ this.root = h("div", {}, this.menu, this.cards, this.bubble, this.button, this.stop);
122
+ const onResize = () => this.render();
123
+ window.addEventListener("resize", onResize);
124
+ this.cleanups.push(() => window.removeEventListener("resize", onResize));
125
+ const onOutside = (event) => {
126
+ if (!this.menuOpen)
127
+ return;
128
+ const path = event.composedPath();
129
+ if (!path.includes(this.menu) && !path.includes(this.button))
130
+ this.setMenu(false);
131
+ };
132
+ document.addEventListener("pointerdown", onOutside);
133
+ this.cleanups.push(() => document.removeEventListener("pointerdown", onOutside));
134
+ }
135
+ update(state, options) {
136
+ if (this.options?.draggable !== options.draggable) {
137
+ this.rest = options.draggable ? readRest() : null;
138
+ }
139
+ // "Hold to talk" stays until the first recording that reached the model.
140
+ if (this.previousVoiceState === "recording" && state.voice.state === "thinking") {
141
+ markHintDone();
142
+ this.showHint = false;
143
+ }
144
+ this.previousVoiceState = state.voice.state;
145
+ this.state = state;
146
+ this.options = options;
147
+ this.render();
148
+ }
149
+ destroy() {
150
+ this.stopRing();
151
+ if (this.press?.timer)
152
+ clearTimeout(this.press.timer);
153
+ for (const cleanup of this.cleanups)
154
+ cleanup();
155
+ }
156
+ // ---- what the orb is doing --------------------------------------------
157
+ get voiceLive() {
158
+ const state = this.state.voice.state;
159
+ return state !== "idle" && state !== "error";
160
+ }
161
+ get handsFree() {
162
+ return this.voiceLive && this.state.voice.handsFree;
163
+ }
164
+ get holdToTalk() {
165
+ return this.voiceLive && !this.state.voice.handsFree;
166
+ }
167
+ menuItems() {
168
+ const allowed = this.state.voice.available ? this.options.voiceModes : [];
169
+ return [
170
+ { key: "chat", label: "Chat" },
171
+ ...(allowed.includes("hands-free") ? [{ key: "hands-free", label: "Talk" }] : []),
172
+ ...(allowed.includes("hold") ? [{ key: "hold", label: "Hold to talk" }] : []),
173
+ ];
174
+ }
175
+ // ---- position ----------------------------------------------------------
176
+ viewport() {
177
+ return { width: window.innerWidth, height: window.innerHeight };
178
+ }
179
+ clampTop(top) {
180
+ const { height } = this.viewport();
181
+ const lowest = height - this.options.offset.bottom - ORB_SIZE;
182
+ return Math.min(Math.max(MARGIN, top), Math.max(MARGIN, lowest));
183
+ }
184
+ /** The side the orb sits on, which is also where the panel opens. */
185
+ side() {
186
+ const { width } = this.viewport();
187
+ if (this.drag)
188
+ return this.drag.left + ORB_SIZE / 2 < width / 2 ? "left" : "right";
189
+ return this.rest?.side ?? (this.options?.corner === "bottom-left" ? "left" : "right");
190
+ }
191
+ position() {
192
+ const { width, height } = this.viewport();
193
+ const side = this.side();
194
+ const edge = this.options.offset.side;
195
+ const left = this.drag ? this.drag.left : side === "left" ? edge : width - edge - ORB_SIZE;
196
+ const top = this.drag
197
+ ? this.drag.top
198
+ : this.clampTop(this.rest ? this.rest.y * height : height - this.options.offset.bottom - ORB_SIZE);
199
+ return { side, left, top, above: top + ORB_SIZE / 2 > height / 2 };
200
+ }
201
+ // ---- drawing -----------------------------------------------------------
202
+ render() {
203
+ if (!this.state)
204
+ return;
205
+ const { voice, proposals, lastError, connection } = this.state;
206
+ const { heading } = this.options;
207
+ const { side, left, top, above } = this.position();
208
+ const items = this.menuItems();
209
+ const voiceLive = this.voiceLive;
210
+ // The orb.
211
+ const label = this.handsFree
212
+ ? `Stop talking to ${heading}`
213
+ : this.holdToTalk
214
+ ? voice.state === "recording"
215
+ ? "Release to send"
216
+ : "Hold to talk"
217
+ : items.length === 1
218
+ ? `Open ${heading}`
219
+ : `${heading}: choose chat or voice`;
220
+ const menuish = items.length > 1 && !voiceLive;
221
+ setAttrs(this.button, {
222
+ "aria-label": label,
223
+ "aria-haspopup": menuish ? "menu" : undefined,
224
+ "aria-expanded": menuish ? String(this.menuOpen) : undefined,
225
+ "aria-pressed": this.holdToTalk ? String(voice.state === "recording") : undefined,
226
+ "aria-busy": String(voice.state === "connecting"),
227
+ });
228
+ this.button.disabled = connection !== "open" && !voiceLive;
229
+ this.button.style.left = `${left}px`;
230
+ this.button.style.top = `${top}px`;
231
+ this.button.classList.toggle("dragging", this.drag !== null);
232
+ const ringState = !voiceLive
233
+ ? "idle"
234
+ : ["connecting", "thinking", "recording", "speaking"].find((s) => s === voice.state) ?? "listening";
235
+ this.ring.className = `ring ${ringState}`;
236
+ this.syncRing();
237
+ const faceKey = [this.options.launcherIcon, this.state.launcherIconUrl, this.failedIcon];
238
+ if (!sameList(faceKey, this.faceKey)) {
239
+ this.faceKey = faceKey;
240
+ replace(this.face, launcherFace(this.options.launcherIcon, this.state.launcherIconUrl, this.failedIcon, (url) => {
241
+ this.failedIcon = url;
242
+ this.render();
243
+ }));
244
+ }
245
+ this.stop.hidden = !voiceLive;
246
+ this.stop.style.left = `${left + (side === "right" ? -52 : ORB_SIZE + 8)}px`;
247
+ this.stop.style.top = `${top + (ORB_SIZE - 44) / 2}px`;
248
+ // Floating things open beside the orb, towards the page and away from
249
+ // the nearer edge, so nothing is drawn off-screen wherever it was dragged.
250
+ const { height } = this.viewport();
251
+ for (const popover of [this.menu, this.cards, this.bubble]) {
252
+ popover.style.left = side === "left" ? `${this.options.offset.side}px` : "";
253
+ popover.style.right = side === "right" ? `${this.options.offset.side}px` : "";
254
+ popover.style.bottom = above ? `${height - top + 12}px` : "";
255
+ popover.style.top = above ? "" : `${top + ORB_SIZE + 12}px`;
256
+ }
257
+ // The menu.
258
+ this.menu.hidden = !this.menuOpen;
259
+ this.menu.setAttribute("aria-label", heading);
260
+ this.menu.style.flexDirection = above ? "column-reverse" : "column";
261
+ this.menu.style.alignItems = side === "right" ? "flex-end" : "flex-start";
262
+ if (this.menuOpen && this.menu.childElementCount !== items.length) {
263
+ replace(this.menu, ...items.map((item) => h("button", { class: "menu-item", attrs: { type: "button", role: "menuitem" }, on: { click: () => this.choose(item.key) } }, h("span", { class: "menu-icon", attrs: { "aria-hidden": "true" } }, item.key === "chat" ? chatIcon() : item.key === "hold" ? micIcon() : waveIcon()), item.label)));
264
+ }
265
+ // The card, out of the orb. The session waits for this tap, and it is
266
+ // the same card the panel draws, from the same payload.
267
+ this.cards.hidden = this.menuOpen || proposals.length === 0;
268
+ // A card is redrawn when the list changes, and when its view arrives (amendment 99).
269
+ if (proposals !== this.drawnProposals || this.state.cardViews !== this.drawnViews) {
270
+ this.drawnProposals = proposals;
271
+ this.drawnViews = this.state.cardViews;
272
+ replace(this.cards, ...proposals.map((p) => confirmationCard(p, this.mihe.respondToProposal, this.state.cardViews[p.proposalId])));
273
+ }
274
+ const bubble = voice.state === "connecting"
275
+ ? { text: "Setting up the microphone…", tone: "quiet" }
276
+ : lastError && (voiceLive || voice.state === "error")
277
+ ? { text: lastError, tone: "error" }
278
+ : voice.notice
279
+ ? { text: voice.notice, tone: "quiet" }
280
+ : this.holdToTalk && this.showHint && voice.state === "listening"
281
+ ? { text: "Hold to talk", tone: "quiet" }
282
+ : null;
283
+ this.bubble.hidden = this.menuOpen || proposals.length > 0 || bubble === null;
284
+ this.bubble.classList.toggle("error", bubble?.tone === "error");
285
+ if (this.bubble.textContent !== (bubble?.text ?? ""))
286
+ this.bubble.textContent = bubble?.text ?? "";
287
+ }
288
+ /**
289
+ * The ring follows the voice level without a redraw: a level arrives tens
290
+ * of times a second, and each one only moves one element.
291
+ */
292
+ syncRing() {
293
+ const wanted = this.voiceLive && !this.reducedMotion;
294
+ if (wanted === (this.stopLevel !== null))
295
+ return;
296
+ if (!wanted) {
297
+ this.stopRing();
298
+ return;
299
+ }
300
+ let target = 0;
301
+ let current = 0;
302
+ this.stopLevel = this.mihe.voice.onLevel((source, level) => {
303
+ const voice = this.mihe.getState().voice;
304
+ // Only the side whose turn it is moves the ring.
305
+ if (source === "user" && (voice.state === "recording" || voice.handsFree))
306
+ target = level;
307
+ if (source === "assistant")
308
+ target = level;
309
+ });
310
+ const tick = () => {
311
+ // Quick to rise, slow to fall, which reads as breathing, not flicker.
312
+ current += (target - current) * (target > current ? 0.45 : 0.12);
313
+ target *= 0.92;
314
+ this.ring.style.transform = `scale(${1 + current * 0.38})`;
315
+ this.ringFrame = requestAnimationFrame(tick);
316
+ };
317
+ this.ringFrame = requestAnimationFrame(tick);
318
+ }
319
+ stopRing() {
320
+ this.stopLevel?.();
321
+ this.stopLevel = null;
322
+ cancelAnimationFrame(this.ringFrame);
323
+ this.ring.style.transform = "scale(1)";
324
+ }
325
+ // ---- the menu ----------------------------------------------------------
326
+ setMenu(open) {
327
+ this.menuOpen = open;
328
+ if (!open)
329
+ replace(this.menu);
330
+ this.render();
331
+ // Focus moves into the menu so the arrow keys and Esc work at once.
332
+ if (open)
333
+ this.menu.querySelector("button")?.focus();
334
+ }
335
+ choose(key) {
336
+ this.setMenu(false);
337
+ if (key === "chat") {
338
+ this.mihe.open();
339
+ }
340
+ else {
341
+ // Entering a voice mode asks for the microphone now, so the browser's
342
+ // permission prompt does not swallow the first hold.
343
+ this.mihe.voice.start({ handsFree: key === "hands-free", openPanel: false });
344
+ }
345
+ }
346
+ onMenuKeyDown(event) {
347
+ const buttons = Array.from(this.menu.querySelectorAll("button"));
348
+ const active = this.root.getRootNode().activeElement;
349
+ const index = buttons.indexOf(active);
350
+ if (event.key === "Escape") {
351
+ event.preventDefault();
352
+ this.setMenu(false);
353
+ this.button.focus();
354
+ }
355
+ else if (event.key === "ArrowDown" || event.key === "ArrowRight") {
356
+ event.preventDefault();
357
+ buttons[(index + 1) % buttons.length]?.focus();
358
+ }
359
+ else if (event.key === "ArrowUp" || event.key === "ArrowLeft") {
360
+ event.preventDefault();
361
+ buttons[(index - 1 + buttons.length) % buttons.length]?.focus();
362
+ }
363
+ }
364
+ // ---- the orb itself ----------------------------------------------------
365
+ tap() {
366
+ if (this.menuOpen) {
367
+ this.setMenu(false);
368
+ return;
369
+ }
370
+ if (this.handsFree) {
371
+ // Stops rather than pauses: a hands-free session is billed for every
372
+ // second it is open.
373
+ this.mihe.voice.stop();
374
+ return;
375
+ }
376
+ if (this.holdToTalk)
377
+ return; // a tap is too short to be speech
378
+ if (this.menuItems().length === 1)
379
+ this.mihe.open();
380
+ else
381
+ this.setMenu(true);
382
+ }
383
+ onPointerDown(event) {
384
+ if (event.button !== 0)
385
+ return;
386
+ this.button.setPointerCapture?.(event.pointerId);
387
+ const { left, top } = this.position();
388
+ const press = {
389
+ x: event.clientX,
390
+ y: event.clientY,
391
+ offsetX: event.clientX - left,
392
+ offsetY: event.clientY - top,
393
+ dragging: false,
394
+ recording: null,
395
+ timer: null,
396
+ };
397
+ this.press = press;
398
+ const voice = this.mihe.getState().voice;
399
+ if (this.holdToTalk && (voice.state === "listening" || voice.state === "speaking")) {
400
+ if (this.options.draggable) {
401
+ // Held on the device until it is clear this is speech, not a drag.
402
+ voice.press({ hold: true });
403
+ press.recording = "held";
404
+ press.timer = setTimeout(() => {
405
+ if (this.press === press && !press.dragging) {
406
+ this.mihe.voice.confirm();
407
+ press.recording = "live";
408
+ }
409
+ }, HOLD_WINDOW_MS);
410
+ }
411
+ else {
412
+ voice.press();
413
+ press.recording = "live";
414
+ }
415
+ }
416
+ }
417
+ onPointerMove(event) {
418
+ const press = this.press;
419
+ if (!press || !this.options.draggable || this.menuOpen)
420
+ return;
421
+ // Once a recording is live, the finger is holding a microphone, not the orb.
422
+ if (press.recording === "live")
423
+ return;
424
+ const moved = Math.hypot(event.clientX - press.x, event.clientY - press.y);
425
+ if (!press.dragging && moved > DRAG_THRESHOLD) {
426
+ press.dragging = true;
427
+ if (press.recording === "held") {
428
+ if (press.timer)
429
+ clearTimeout(press.timer);
430
+ this.mihe.voice.discard();
431
+ press.recording = null;
432
+ }
433
+ }
434
+ if (press.dragging) {
435
+ const { width, height } = this.viewport();
436
+ this.drag = {
437
+ left: Math.min(Math.max(0, event.clientX - press.offsetX), width - ORB_SIZE),
438
+ top: Math.min(Math.max(0, event.clientY - press.offsetY), height - ORB_SIZE),
439
+ };
440
+ this.render();
441
+ }
442
+ }
443
+ finish(cancelled) {
444
+ const press = this.press;
445
+ this.press = null;
446
+ if (!press)
447
+ return;
448
+ if (press.timer)
449
+ clearTimeout(press.timer);
450
+ if (press.dragging && this.drag) {
451
+ // Snap to the nearer side, and keep the height.
452
+ const { width, height } = this.viewport();
453
+ this.rest = {
454
+ side: this.drag.left + ORB_SIZE / 2 < width / 2 ? "left" : "right",
455
+ y: this.clampTop(this.drag.top) / height,
456
+ };
457
+ writeRest(this.rest);
458
+ this.drag = null;
459
+ this.render();
460
+ return;
461
+ }
462
+ this.drag = null;
463
+ if (press.recording) {
464
+ // Released: a held press that never moved is speech too.
465
+ this.mihe.voice.release();
466
+ return;
467
+ }
468
+ if (!cancelled)
469
+ this.tap();
470
+ }
471
+ onKeyDown(event) {
472
+ if (event.repeat)
473
+ return;
474
+ const voice = this.mihe.getState().voice;
475
+ if (this.holdToTalk && event.key === " ") {
476
+ event.preventDefault();
477
+ if (voice.state === "listening" || voice.state === "speaking")
478
+ voice.press();
479
+ return;
480
+ }
481
+ if (event.key === "Enter" || event.key === " ") {
482
+ event.preventDefault();
483
+ this.tap();
484
+ }
485
+ if (event.key === "Escape" && this.voiceLive) {
486
+ event.preventDefault();
487
+ voice.stop();
488
+ }
489
+ }
490
+ onKeyUp(event) {
491
+ if (this.holdToTalk && event.key === " ") {
492
+ event.preventDefault();
493
+ this.mihe.voice.release();
494
+ }
495
+ }
496
+ }
497
+ function sameList(a, b) {
498
+ return Array.isArray(a) && Array.isArray(b) && a.length === b.length && a.every((v, i) => v === b[i]);
499
+ }
500
+ //# sourceMappingURL=orb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orb.js","sourceRoot":"","sources":["../../../../js/src/widget/orb.ts"],"names":[],"mappings":"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"}