@skippr/live-agent-sdk 0.82.0 → 0.84.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.
- package/README.md +2 -2
- package/dist/esm/lib-exports.js +593 -356
- package/dist/skippr-sdk.css +1 -1
- package/dist/skippr-sdk.js +138 -138
- package/dist/types/capture/pausedScreenTrack.d.ts +2 -0
- package/dist/types/components/LiveAgent.d.ts +0 -1
- package/dist/types/components/ShadowHost.d.ts +2 -1
- package/dist/types/context/LiveAgentContext.d.ts +7 -0
- package/dist/types/hooks/useAuth.d.ts +1 -0
- package/dist/types/hooks/useAvailableModules.d.ts +2 -1
- package/dist/types/hooks/useElapsedSeconds.d.ts +1 -1
- package/dist/types/hooks/useIsSessionHeld.d.ts +1 -0
- package/dist/types/hooks/useOnceTrue.d.ts +1 -0
- package/dist/types/hooks/useSessionHold.d.ts +3 -1
- package/dist/types/lib/brandForeground.d.ts +2 -0
- package/dist/types/lib-exports.d.ts +1 -0
- package/package.json +1 -1
package/dist/esm/lib-exports.js
CHANGED
|
@@ -8,7 +8,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
8
8
|
|
|
9
9
|
// src/components/LiveAgent.tsx
|
|
10
10
|
import { LiveKitRoom, RoomAudioRenderer } from "@livekit/components-react";
|
|
11
|
-
import { useCallback as useCallback18, useEffect as
|
|
11
|
+
import { useCallback as useCallback18, useEffect as useEffect30, useMemo as useMemo7, useRef as useRef25, useState as useState22 } from "react";
|
|
12
12
|
|
|
13
13
|
// src/capture/useAgentCursor.ts
|
|
14
14
|
import { useEffect, useState } from "react";
|
|
@@ -118,42 +118,177 @@ function useLiveAgent() {
|
|
|
118
118
|
}
|
|
119
119
|
|
|
120
120
|
// src/hooks/useSessionHold.ts
|
|
121
|
+
import { useLocalParticipant as useLocalParticipant2 } from "@livekit/components-react/hooks";
|
|
122
|
+
import { Track } from "livekit-client";
|
|
123
|
+
import { useCallback as useCallback2, useEffect as useEffect2, useRef, useState as useState2 } from "react";
|
|
124
|
+
|
|
125
|
+
// src/capture/pausedScreenTrack.ts
|
|
126
|
+
var FALLBACK_WIDTH = 1280;
|
|
127
|
+
var FALLBACK_HEIGHT = 720;
|
|
128
|
+
var DIM_OVERLAY = "rgba(15, 15, 20, 0.55)";
|
|
129
|
+
var AMBER = "#F5B300";
|
|
130
|
+
var LABEL = "Paused";
|
|
131
|
+
var PAUSED_FRAME_FPS = 30;
|
|
132
|
+
var LAST_FRAME_READY_TIMEOUT_MS = 500;
|
|
133
|
+
function drawPausedOverlay(canvas, ctx) {
|
|
134
|
+
const { width, height } = canvas;
|
|
135
|
+
ctx.fillStyle = DIM_OVERLAY;
|
|
136
|
+
ctx.fillRect(0, 0, width, height);
|
|
137
|
+
const fontSize = Math.round(height * 0.07);
|
|
138
|
+
ctx.font = `600 ${fontSize}px system-ui, sans-serif`;
|
|
139
|
+
ctx.textAlign = "center";
|
|
140
|
+
ctx.textBaseline = "middle";
|
|
141
|
+
ctx.fillStyle = AMBER;
|
|
142
|
+
ctx.fillText(LABEL, width / 2, height / 2);
|
|
143
|
+
}
|
|
144
|
+
async function drawLiveScreenFrameInto(ctx, sourceTrack, width, height) {
|
|
145
|
+
const video = document.createElement("video");
|
|
146
|
+
video.muted = true;
|
|
147
|
+
video.srcObject = new MediaStream([sourceTrack]);
|
|
148
|
+
try {
|
|
149
|
+
await video.play();
|
|
150
|
+
await waitForDecodedFrame(video);
|
|
151
|
+
ctx.drawImage(video, 0, 0, width, height);
|
|
152
|
+
return true;
|
|
153
|
+
} catch {
|
|
154
|
+
return false;
|
|
155
|
+
} finally {
|
|
156
|
+
video.srcObject = null;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
async function waitForDecodedFrame(video) {
|
|
160
|
+
if (video.readyState >= video.HAVE_CURRENT_DATA)
|
|
161
|
+
return;
|
|
162
|
+
await new Promise((resolve) => {
|
|
163
|
+
const timeout = setTimeout(resolve, LAST_FRAME_READY_TIMEOUT_MS);
|
|
164
|
+
video.addEventListener("loadeddata", () => {
|
|
165
|
+
clearTimeout(timeout);
|
|
166
|
+
resolve();
|
|
167
|
+
}, { once: true });
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
async function createPausedScreenTrack(sourceTrack) {
|
|
171
|
+
const settings = sourceTrack.getSettings();
|
|
172
|
+
const width = settings.width ?? FALLBACK_WIDTH;
|
|
173
|
+
const height = settings.height ?? FALLBACK_HEIGHT;
|
|
174
|
+
const canvas = document.createElement("canvas");
|
|
175
|
+
canvas.width = width;
|
|
176
|
+
canvas.height = height;
|
|
177
|
+
const ctx = canvas.getContext("2d");
|
|
178
|
+
if (!ctx)
|
|
179
|
+
return null;
|
|
180
|
+
const captureStream = canvas.captureStream;
|
|
181
|
+
if (typeof captureStream !== "function")
|
|
182
|
+
return null;
|
|
183
|
+
const capturedLiveFrame = await drawLiveScreenFrameInto(ctx, sourceTrack, width, height);
|
|
184
|
+
if (!capturedLiveFrame) {
|
|
185
|
+
ctx.fillStyle = "#0f0f14";
|
|
186
|
+
ctx.fillRect(0, 0, width, height);
|
|
187
|
+
}
|
|
188
|
+
drawPausedOverlay(canvas, ctx);
|
|
189
|
+
const track = captureStream.call(canvas, PAUSED_FRAME_FPS).getVideoTracks()[0] ?? null;
|
|
190
|
+
if (!track)
|
|
191
|
+
return null;
|
|
192
|
+
track.contentHint = "text";
|
|
193
|
+
return track;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// src/hooks/useMediaControls.ts
|
|
121
197
|
import { useLocalParticipant } from "@livekit/components-react/hooks";
|
|
122
|
-
import {
|
|
198
|
+
import { ScreenSharePresets } from "livekit-client";
|
|
199
|
+
import { useCallback } from "react";
|
|
200
|
+
var SCREEN_SHARE_OPTIONS = {
|
|
201
|
+
video: { displaySurface: "browser" },
|
|
202
|
+
resolution: ScreenSharePresets.h720fps30.resolution,
|
|
203
|
+
contentHint: "detail"
|
|
204
|
+
};
|
|
205
|
+
function useMediaControls() {
|
|
206
|
+
const { localParticipant } = useLocalParticipant();
|
|
207
|
+
const isMuted = !localParticipant.isMicrophoneEnabled;
|
|
208
|
+
const isScreenSharing = localParticipant.isScreenShareEnabled;
|
|
209
|
+
const toggleMute = useCallback(async () => {
|
|
210
|
+
try {
|
|
211
|
+
await localParticipant.setMicrophoneEnabled(isMuted);
|
|
212
|
+
} catch (error) {
|
|
213
|
+
console.error("Failed to toggle microphone:", error);
|
|
214
|
+
}
|
|
215
|
+
}, [localParticipant, isMuted]);
|
|
216
|
+
const toggleScreenShare = useCallback(async () => {
|
|
217
|
+
try {
|
|
218
|
+
await localParticipant.setScreenShareEnabled(!isScreenSharing, SCREEN_SHARE_OPTIONS);
|
|
219
|
+
} catch (error) {
|
|
220
|
+
console.error("Failed to toggle screen share:", error);
|
|
221
|
+
}
|
|
222
|
+
}, [localParticipant, isScreenSharing]);
|
|
223
|
+
return { isMuted, toggleMute, isScreenSharing, toggleScreenShare };
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// src/hooks/useSessionHold.ts
|
|
123
227
|
var textEncoder = new TextEncoder;
|
|
124
228
|
var FALLBACK_PAUSE_TIMEOUT_SECONDS = 120;
|
|
125
229
|
function useSessionHold({
|
|
126
230
|
pauseSession,
|
|
127
|
-
pauseTimeoutSeconds
|
|
231
|
+
pauseTimeoutSeconds,
|
|
232
|
+
captureMode
|
|
128
233
|
}) {
|
|
129
|
-
const { localParticipant } =
|
|
234
|
+
const { localParticipant } = useLocalParticipant2();
|
|
130
235
|
const timeoutSeconds = pauseTimeoutSeconds ?? FALLBACK_PAUSE_TIMEOUT_SECONDS;
|
|
131
236
|
const [isHeld, setIsHeld] = useState2(false);
|
|
132
237
|
const [countdown, setCountdown] = useState2(timeoutSeconds);
|
|
133
|
-
const
|
|
238
|
+
const screenWasSharedBeforeHoldRef = useRef(false);
|
|
239
|
+
const holdTransitionInFlightRef = useRef(false);
|
|
240
|
+
const publish = useCallback2(async (type) => {
|
|
134
241
|
await localParticipant.publishData(textEncoder.encode(JSON.stringify({ type })), {
|
|
135
242
|
reliable: true,
|
|
136
243
|
topic: SESSION_HOLD_TOPIC
|
|
137
244
|
});
|
|
138
245
|
}, [localParticipant]);
|
|
139
|
-
const
|
|
246
|
+
const screenShareTrack = useCallback2(() => {
|
|
247
|
+
return localParticipant.getTrackPublication(Track.Source.ScreenShare)?.videoTrack;
|
|
248
|
+
}, [localParticipant]);
|
|
249
|
+
const pauseScreenShareForHold = useCallback2(async () => {
|
|
250
|
+
if (captureMode !== CAPTURE_MODE.Screenshare)
|
|
251
|
+
return;
|
|
252
|
+
screenWasSharedBeforeHoldRef.current = localParticipant.isScreenShareEnabled;
|
|
253
|
+
const track = screenShareTrack();
|
|
254
|
+
const liveScreenTrack = track?.mediaStreamTrack;
|
|
255
|
+
if (!track || !liveScreenTrack)
|
|
256
|
+
return;
|
|
257
|
+
const pausedFrame = await createPausedScreenTrack(liveScreenTrack);
|
|
258
|
+
if (pausedFrame)
|
|
259
|
+
await track.replaceTrack(pausedFrame);
|
|
260
|
+
liveScreenTrack.stop();
|
|
261
|
+
}, [captureMode, localParticipant, screenShareTrack]);
|
|
262
|
+
const resumeScreenShareOnResume = useCallback2(async () => {
|
|
263
|
+
if (captureMode !== CAPTURE_MODE.Screenshare || !screenWasSharedBeforeHoldRef.current)
|
|
264
|
+
return;
|
|
265
|
+
await localParticipant.setScreenShareEnabled(false);
|
|
266
|
+
await localParticipant.setScreenShareEnabled(true, SCREEN_SHARE_OPTIONS);
|
|
267
|
+
}, [captureMode, localParticipant]);
|
|
268
|
+
const micTrack = useCallback2(() => {
|
|
269
|
+
return localParticipant.getTrackPublication(Track.Source.Microphone)?.audioTrack;
|
|
270
|
+
}, [localParticipant]);
|
|
271
|
+
const hold = useCallback2(async () => {
|
|
140
272
|
try {
|
|
141
273
|
await localParticipant.setMicrophoneEnabled(false);
|
|
274
|
+
micTrack()?.mediaStreamTrack?.stop();
|
|
275
|
+
await pauseScreenShareForHold();
|
|
142
276
|
await publish("pause");
|
|
143
277
|
setIsHeld(true);
|
|
144
278
|
} catch (error) {
|
|
145
279
|
console.error("Failed to hold session:", error);
|
|
146
280
|
}
|
|
147
|
-
}, [localParticipant, publish]);
|
|
148
|
-
const release =
|
|
281
|
+
}, [localParticipant, publish, pauseScreenShareForHold, micTrack]);
|
|
282
|
+
const release = useCallback2(async () => {
|
|
149
283
|
try {
|
|
150
284
|
await localParticipant.setMicrophoneEnabled(true);
|
|
285
|
+
await resumeScreenShareOnResume();
|
|
151
286
|
await publish("resume");
|
|
152
287
|
setIsHeld(false);
|
|
153
288
|
} catch (error) {
|
|
154
289
|
console.error("Failed to release session:", error);
|
|
155
290
|
}
|
|
156
|
-
}, [localParticipant, publish]);
|
|
291
|
+
}, [localParticipant, publish, resumeScreenShareOnResume]);
|
|
157
292
|
useEffect2(() => {
|
|
158
293
|
if (!isHeld) {
|
|
159
294
|
setCountdown(timeoutSeconds);
|
|
@@ -170,12 +305,14 @@ function useSessionHold({
|
|
|
170
305
|
pauseSession();
|
|
171
306
|
}
|
|
172
307
|
}, [isHeld, countdown, pauseSession]);
|
|
173
|
-
const toggle =
|
|
174
|
-
if (
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
308
|
+
const toggle = useCallback2(() => {
|
|
309
|
+
if (holdTransitionInFlightRef.current)
|
|
310
|
+
return;
|
|
311
|
+
holdTransitionInFlightRef.current = true;
|
|
312
|
+
const transition = isHeld ? release : hold;
|
|
313
|
+
transition().finally(() => {
|
|
314
|
+
holdTransitionInFlightRef.current = false;
|
|
315
|
+
});
|
|
179
316
|
}, [isHeld, hold, release]);
|
|
180
317
|
return { isHeld, countdown, toggle };
|
|
181
318
|
}
|
|
@@ -195,7 +332,8 @@ function SessionHoldProvider({ children }) {
|
|
|
195
332
|
}
|
|
196
333
|
const hold = useSessionHold({
|
|
197
334
|
pauseSession,
|
|
198
|
-
pauseTimeoutSeconds: internalCtx.pauseTimeoutSeconds
|
|
335
|
+
pauseTimeoutSeconds: internalCtx.pauseTimeoutSeconds,
|
|
336
|
+
captureMode: internalCtx.captureMode
|
|
199
337
|
});
|
|
200
338
|
return /* @__PURE__ */ jsx(SessionHoldContext.Provider, {
|
|
201
339
|
value: hold,
|
|
@@ -226,20 +364,20 @@ function useSharedTranscriptions() {
|
|
|
226
364
|
import { createContext as createContext4, useContext as useContext4 } from "react";
|
|
227
365
|
|
|
228
366
|
// src/hooks/useVoiceTurn.ts
|
|
229
|
-
import { useLocalParticipant as
|
|
230
|
-
import { useCallback as
|
|
367
|
+
import { useLocalParticipant as useLocalParticipant3 } from "@livekit/components-react/hooks";
|
|
368
|
+
import { useCallback as useCallback3, useRef as useRef2, useState as useState3 } from "react";
|
|
231
369
|
var textEncoder2 = new TextEncoder;
|
|
232
370
|
function useVoiceTurn() {
|
|
233
|
-
const { localParticipant } =
|
|
371
|
+
const { localParticipant } = useLocalParticipant3();
|
|
234
372
|
const [isCapturingSpeech, setIsCapturingSpeech] = useState3(false);
|
|
235
|
-
const capturingRef =
|
|
236
|
-
const publish =
|
|
373
|
+
const capturingRef = useRef2(false);
|
|
374
|
+
const publish = useCallback3(async (type) => {
|
|
237
375
|
await localParticipant.publishData(textEncoder2.encode(JSON.stringify({ type })), {
|
|
238
376
|
reliable: true,
|
|
239
377
|
topic: MIC_MODE_TURN_TOPIC
|
|
240
378
|
});
|
|
241
379
|
}, [localParticipant]);
|
|
242
|
-
const startRecording =
|
|
380
|
+
const startRecording = useCallback3(async () => {
|
|
243
381
|
try {
|
|
244
382
|
await localParticipant.setMicrophoneEnabled(true);
|
|
245
383
|
await publish("start");
|
|
@@ -247,7 +385,7 @@ function useVoiceTurn() {
|
|
|
247
385
|
console.error("Failed to start voice turn:", error);
|
|
248
386
|
}
|
|
249
387
|
}, [localParticipant, publish]);
|
|
250
|
-
const commitRecording =
|
|
388
|
+
const commitRecording = useCallback3(async () => {
|
|
251
389
|
try {
|
|
252
390
|
await localParticipant.setMicrophoneEnabled(false);
|
|
253
391
|
await publish("commit");
|
|
@@ -255,21 +393,21 @@ function useVoiceTurn() {
|
|
|
255
393
|
console.error("Failed to commit voice turn:", error);
|
|
256
394
|
}
|
|
257
395
|
}, [localParticipant, publish]);
|
|
258
|
-
const start =
|
|
396
|
+
const start = useCallback3(() => {
|
|
259
397
|
if (capturingRef.current)
|
|
260
398
|
return;
|
|
261
399
|
capturingRef.current = true;
|
|
262
400
|
setIsCapturingSpeech(true);
|
|
263
401
|
startRecording();
|
|
264
402
|
}, [startRecording]);
|
|
265
|
-
const commit =
|
|
403
|
+
const commit = useCallback3(() => {
|
|
266
404
|
if (!capturingRef.current)
|
|
267
405
|
return;
|
|
268
406
|
capturingRef.current = false;
|
|
269
407
|
setIsCapturingSpeech(false);
|
|
270
408
|
commitRecording();
|
|
271
409
|
}, [commitRecording]);
|
|
272
|
-
const toggle =
|
|
410
|
+
const toggle = useCallback3(() => {
|
|
273
411
|
if (capturingRef.current)
|
|
274
412
|
commit();
|
|
275
413
|
else
|
|
@@ -298,7 +436,7 @@ function useVoiceTurnContext() {
|
|
|
298
436
|
}
|
|
299
437
|
|
|
300
438
|
// src/hooks/useAdoptionGoals.ts
|
|
301
|
-
import { useCallback as
|
|
439
|
+
import { useCallback as useCallback4, useEffect as useEffect3, useMemo, useState as useState4 } from "react";
|
|
302
440
|
|
|
303
441
|
// src/lib/hashMatch.ts
|
|
304
442
|
function globToRegExp(pattern) {
|
|
@@ -368,7 +506,7 @@ function useAdoptionGoals({
|
|
|
368
506
|
}) {
|
|
369
507
|
const [candidates, setCandidates] = useState4([]);
|
|
370
508
|
const [hash, setHash] = useState4(window.location.hash);
|
|
371
|
-
const match =
|
|
509
|
+
const match = useCallback4(async () => {
|
|
372
510
|
try {
|
|
373
511
|
const resp = await authedFetch(`${API_URL}/v1/adoption/goals/match`, {
|
|
374
512
|
method: "POST",
|
|
@@ -418,21 +556,21 @@ function useAdoptionGoals({
|
|
|
418
556
|
return hashSpecific;
|
|
419
557
|
return candidates.filter((goal) => goal.hashPattern === null);
|
|
420
558
|
}, [candidates, hash]);
|
|
421
|
-
const postStatus =
|
|
559
|
+
const postStatus = useCallback4((goalId, status) => {
|
|
422
560
|
authedFetch(`${API_URL}/v1/adoption/goals/${goalId}/status`, {
|
|
423
561
|
method: "POST",
|
|
424
562
|
headers: { "Content-Type": "application/json" },
|
|
425
563
|
body: JSON.stringify({ status })
|
|
426
564
|
}).catch((e) => console.warn("[Skippr] adoption status update failed", e));
|
|
427
565
|
}, [authedFetch]);
|
|
428
|
-
const attendGoal =
|
|
566
|
+
const attendGoal = useCallback4((goalId) => {
|
|
429
567
|
postStatus(goalId, "attended" /* Attended */);
|
|
430
568
|
}, [postStatus]);
|
|
431
569
|
return { goals, attendGoal };
|
|
432
570
|
}
|
|
433
571
|
|
|
434
572
|
// src/hooks/useAuth.ts
|
|
435
|
-
import { useCallback as
|
|
573
|
+
import { useCallback as useCallback5, useEffect as useEffect4, useState as useState5 } from "react";
|
|
436
574
|
var API_URL2 = "https://specialist.skippr.ai/api";
|
|
437
575
|
function storageKey(appKey) {
|
|
438
576
|
return `skippr_auth_${appKey}`;
|
|
@@ -461,15 +599,20 @@ function clearStoredToken(appKey) {
|
|
|
461
599
|
function useAuth({ appKey }) {
|
|
462
600
|
const [authToken, setAuthToken] = useState5(null);
|
|
463
601
|
const [isValidating, setIsValidating] = useState5(false);
|
|
602
|
+
const [hasResolvedStoredToken, setHasResolvedStoredToken] = useState5(false);
|
|
464
603
|
const [isSubmitting, setIsSubmitting] = useState5(false);
|
|
465
604
|
const [error, setError] = useState5("");
|
|
466
605
|
const isAuthenticated = authToken !== null;
|
|
467
606
|
useEffect4(() => {
|
|
468
|
-
if (!appKey)
|
|
607
|
+
if (!appKey) {
|
|
608
|
+
setHasResolvedStoredToken(true);
|
|
469
609
|
return;
|
|
610
|
+
}
|
|
470
611
|
const stored = getStoredToken(appKey);
|
|
471
|
-
if (!stored)
|
|
612
|
+
if (!stored) {
|
|
613
|
+
setHasResolvedStoredToken(true);
|
|
472
614
|
return;
|
|
615
|
+
}
|
|
473
616
|
async function validateStoredToken() {
|
|
474
617
|
setIsValidating(true);
|
|
475
618
|
try {
|
|
@@ -486,6 +629,7 @@ function useAuth({ appKey }) {
|
|
|
486
629
|
clearStoredToken(appKey);
|
|
487
630
|
} finally {
|
|
488
631
|
setIsValidating(false);
|
|
632
|
+
setHasResolvedStoredToken(true);
|
|
489
633
|
}
|
|
490
634
|
}
|
|
491
635
|
validateStoredToken();
|
|
@@ -498,7 +642,7 @@ function useAuth({ appKey }) {
|
|
|
498
642
|
window.addEventListener("skippr:logout", handleLogout);
|
|
499
643
|
return () => window.removeEventListener("skippr:logout", handleLogout);
|
|
500
644
|
}, []);
|
|
501
|
-
const requestOtp =
|
|
645
|
+
const requestOtp = useCallback5(async (email) => {
|
|
502
646
|
if (!appKey)
|
|
503
647
|
return false;
|
|
504
648
|
setIsSubmitting(true);
|
|
@@ -525,7 +669,7 @@ function useAuth({ appKey }) {
|
|
|
525
669
|
setIsSubmitting(false);
|
|
526
670
|
}
|
|
527
671
|
}, [appKey]);
|
|
528
|
-
const verifyOtp =
|
|
672
|
+
const verifyOtp = useCallback5(async (email, code) => {
|
|
529
673
|
if (!appKey)
|
|
530
674
|
return;
|
|
531
675
|
setIsSubmitting(true);
|
|
@@ -554,7 +698,7 @@ function useAuth({ appKey }) {
|
|
|
554
698
|
setIsSubmitting(false);
|
|
555
699
|
}
|
|
556
700
|
}, [appKey]);
|
|
557
|
-
const logout =
|
|
701
|
+
const logout = useCallback5(async () => {
|
|
558
702
|
const token = authToken;
|
|
559
703
|
if (appKey)
|
|
560
704
|
clearStoredToken(appKey);
|
|
@@ -575,6 +719,7 @@ function useAuth({ appKey }) {
|
|
|
575
719
|
return {
|
|
576
720
|
isAuthenticated,
|
|
577
721
|
isValidating,
|
|
722
|
+
hasResolvedStoredToken,
|
|
578
723
|
authToken,
|
|
579
724
|
requestOtp,
|
|
580
725
|
verifyOtp,
|
|
@@ -585,7 +730,7 @@ function useAuth({ appKey }) {
|
|
|
585
730
|
}
|
|
586
731
|
|
|
587
732
|
// src/hooks/useAutoStart.ts
|
|
588
|
-
import { useEffect as useEffect5, useMemo as useMemo2, useRef as
|
|
733
|
+
import { useEffect as useEffect5, useMemo as useMemo2, useRef as useRef3 } from "react";
|
|
589
734
|
|
|
590
735
|
// src/lib/agentMode.ts
|
|
591
736
|
var AGENT_MODE = {
|
|
@@ -665,7 +810,7 @@ function useAutoStart({
|
|
|
665
810
|
bearerToken,
|
|
666
811
|
selectModule
|
|
667
812
|
}) {
|
|
668
|
-
const hasAutoStartedRef =
|
|
813
|
+
const hasAutoStartedRef = useRef3(false);
|
|
669
814
|
const autoStartModule = useMemo2(() => availableModules.find((m) => {
|
|
670
815
|
if (!m.uiPreferences?.autoStart)
|
|
671
816
|
return false;
|
|
@@ -704,7 +849,7 @@ function useAutoStart({
|
|
|
704
849
|
}
|
|
705
850
|
|
|
706
851
|
// src/hooks/useAvailableModules.ts
|
|
707
|
-
import { useCallback as
|
|
852
|
+
import { useCallback as useCallback6, useEffect as useEffect6, useState as useState6 } from "react";
|
|
708
853
|
var EMPTY_DEFAULT = { agentId: null, sessionId: null };
|
|
709
854
|
var API_URL3 = "https://specialist.skippr.ai/api";
|
|
710
855
|
function useAvailableModules({
|
|
@@ -715,10 +860,11 @@ function useAvailableModules({
|
|
|
715
860
|
}) {
|
|
716
861
|
const [modules, setModules] = useState6([]);
|
|
717
862
|
const [defaultSelection, setDefaultSelection] = useState6(EMPTY_DEFAULT);
|
|
863
|
+
const [appearance, setAppearance] = useState6(null);
|
|
718
864
|
const [isLoading, setIsLoading] = useState6(false);
|
|
719
865
|
const [hasResolved, setHasResolved] = useState6(false);
|
|
720
866
|
const [error, setError] = useState6(null);
|
|
721
|
-
const fetchModules =
|
|
867
|
+
const fetchModules = useCallback6(async () => {
|
|
722
868
|
setIsLoading(true);
|
|
723
869
|
setHasResolved(false);
|
|
724
870
|
setError(null);
|
|
@@ -732,6 +878,7 @@ function useAvailableModules({
|
|
|
732
878
|
const data = await resp.json();
|
|
733
879
|
setModules(Array.isArray(data?.modules) ? data.modules : []);
|
|
734
880
|
setDefaultSelection(data?.default ?? EMPTY_DEFAULT);
|
|
881
|
+
setAppearance(data?.appearance ?? null);
|
|
735
882
|
} catch (e) {
|
|
736
883
|
setError(e instanceof Error ? e.message : "Failed to load modules");
|
|
737
884
|
} finally {
|
|
@@ -747,6 +894,7 @@ function useAvailableModules({
|
|
|
747
894
|
return {
|
|
748
895
|
modules,
|
|
749
896
|
defaultSelection,
|
|
897
|
+
appearance,
|
|
750
898
|
isLoading,
|
|
751
899
|
hasResolved,
|
|
752
900
|
error,
|
|
@@ -754,16 +902,27 @@ function useAvailableModules({
|
|
|
754
902
|
};
|
|
755
903
|
}
|
|
756
904
|
|
|
905
|
+
// src/hooks/useOnceTrue.ts
|
|
906
|
+
import { useEffect as useEffect7, useState as useState7 } from "react";
|
|
907
|
+
function useOnceTrue(value) {
|
|
908
|
+
const [latched, setLatched] = useState7(false);
|
|
909
|
+
useEffect7(() => {
|
|
910
|
+
if (value)
|
|
911
|
+
setLatched(true);
|
|
912
|
+
}, [value]);
|
|
913
|
+
return latched;
|
|
914
|
+
}
|
|
915
|
+
|
|
757
916
|
// src/hooks/usePlanUpdates.ts
|
|
758
|
-
import { useCallback as
|
|
917
|
+
import { useCallback as useCallback7 } from "react";
|
|
759
918
|
|
|
760
919
|
// src/hooks/useAgentState.ts
|
|
761
920
|
import { useRemoteParticipants } from "@livekit/components-react/hooks";
|
|
762
|
-
import { useEffect as
|
|
921
|
+
import { useEffect as useEffect8, useState as useState8 } from "react";
|
|
763
922
|
function useAgentState(attributeKey, parse, initial) {
|
|
764
|
-
const [value, setValue] =
|
|
923
|
+
const [value, setValue] = useState8(initial);
|
|
765
924
|
const remoteParticipants = useRemoteParticipants();
|
|
766
|
-
|
|
925
|
+
useEffect8(() => {
|
|
767
926
|
const agentParticipant = remoteParticipants.find((p) => p.attributes?.[attributeKey]);
|
|
768
927
|
if (agentParticipant) {
|
|
769
928
|
const attr = agentParticipant.attributes?.[attributeKey];
|
|
@@ -809,12 +968,12 @@ function parsePlan(json) {
|
|
|
809
968
|
return null;
|
|
810
969
|
}
|
|
811
970
|
function usePlanUpdates() {
|
|
812
|
-
const parse =
|
|
971
|
+
const parse = useCallback7(parsePlan, []);
|
|
813
972
|
return useAgentState(PLAN_ATTR, parse, null);
|
|
814
973
|
}
|
|
815
974
|
|
|
816
975
|
// src/hooks/useSession.ts
|
|
817
|
-
import { useCallback as
|
|
976
|
+
import { useCallback as useCallback8, useEffect as useEffect9, useRef as useRef4, useState as useState9 } from "react";
|
|
818
977
|
var API_URL4 = "https://specialist.skippr.ai/api";
|
|
819
978
|
async function fetchSessionMessages(sessionId, authedFetch) {
|
|
820
979
|
try {
|
|
@@ -866,27 +1025,27 @@ function useSession({
|
|
|
866
1025
|
onStartError,
|
|
867
1026
|
onDisconnect
|
|
868
1027
|
}) {
|
|
869
|
-
const [connection, setConnection] =
|
|
870
|
-
const [shouldConnect, setShouldConnect] =
|
|
871
|
-
const [isStarting, setIsStarting] =
|
|
872
|
-
const [isDisconnecting, setIsDisconnecting] =
|
|
873
|
-
const [error, setError] =
|
|
874
|
-
const [errorCode, setErrorCode] =
|
|
875
|
-
const [sessionId, setSessionId] =
|
|
876
|
-
const [bearerToken, setBearerToken] =
|
|
877
|
-
const [pendingScreenStream, setPendingScreenStream] =
|
|
878
|
-
const [isPaused, setIsPaused] =
|
|
879
|
-
const [isPausing, setIsPausing] =
|
|
880
|
-
const [pauseTimeoutSeconds, setPauseTimeoutSeconds] =
|
|
881
|
-
const [historyMessages, setHistoryMessages] =
|
|
882
|
-
const [authFailed, setAuthFailed] =
|
|
883
|
-
const tokenRef =
|
|
884
|
-
const getUserTokenRef =
|
|
1028
|
+
const [connection, setConnection] = useState9(null);
|
|
1029
|
+
const [shouldConnect, setShouldConnect] = useState9(false);
|
|
1030
|
+
const [isStarting, setIsStarting] = useState9(false);
|
|
1031
|
+
const [isDisconnecting, setIsDisconnecting] = useState9(false);
|
|
1032
|
+
const [error, setError] = useState9("");
|
|
1033
|
+
const [errorCode, setErrorCode] = useState9(null);
|
|
1034
|
+
const [sessionId, setSessionId] = useState9(null);
|
|
1035
|
+
const [bearerToken, setBearerToken] = useState9(authToken ?? null);
|
|
1036
|
+
const [pendingScreenStream, setPendingScreenStream] = useState9(null);
|
|
1037
|
+
const [isPaused, setIsPaused] = useState9(false);
|
|
1038
|
+
const [isPausing, setIsPausing] = useState9(false);
|
|
1039
|
+
const [pauseTimeoutSeconds, setPauseTimeoutSeconds] = useState9(null);
|
|
1040
|
+
const [historyMessages, setHistoryMessages] = useState9([]);
|
|
1041
|
+
const [authFailed, setAuthFailed] = useState9(false);
|
|
1042
|
+
const tokenRef = useRef4(authToken ? { token: authToken, expiresAt: null } : null);
|
|
1043
|
+
const getUserTokenRef = useRef4(getUserToken);
|
|
885
1044
|
getUserTokenRef.current = getUserToken ?? (userToken ? () => Promise.resolve(userToken) : undefined);
|
|
886
|
-
const failedBearerRef =
|
|
887
|
-
const inFlightExchangeRef =
|
|
888
|
-
const canExchange =
|
|
889
|
-
const reExchange =
|
|
1045
|
+
const failedBearerRef = useRef4(null);
|
|
1046
|
+
const inFlightExchangeRef = useRef4(null);
|
|
1047
|
+
const canExchange = useCallback8(() => !!appKey && !!getUserTokenRef.current, [appKey]);
|
|
1048
|
+
const reExchange = useCallback8(async () => {
|
|
890
1049
|
if (inFlightExchangeRef.current)
|
|
891
1050
|
return inFlightExchangeRef.current;
|
|
892
1051
|
const provider = getUserTokenRef.current;
|
|
@@ -906,7 +1065,7 @@ function useSession({
|
|
|
906
1065
|
inFlightExchangeRef.current = null;
|
|
907
1066
|
}
|
|
908
1067
|
}, [appKey]);
|
|
909
|
-
const getValidBearer =
|
|
1068
|
+
const getValidBearer = useCallback8(async () => {
|
|
910
1069
|
const current = tokenRef.current;
|
|
911
1070
|
if (current) {
|
|
912
1071
|
if (current.expiresAt === null)
|
|
@@ -918,7 +1077,7 @@ function useSession({
|
|
|
918
1077
|
return reExchange();
|
|
919
1078
|
return current?.token ?? null;
|
|
920
1079
|
}, [canExchange, reExchange]);
|
|
921
|
-
const authedFetch =
|
|
1080
|
+
const authedFetch = useCallback8(async (input, init = {}) => {
|
|
922
1081
|
const isSecretMode = canExchange();
|
|
923
1082
|
const onTerminalAuthFailure = () => {
|
|
924
1083
|
if (isSecretMode)
|
|
@@ -960,7 +1119,7 @@ function useSession({
|
|
|
960
1119
|
setAuthFailed(false);
|
|
961
1120
|
return resp;
|
|
962
1121
|
}, [canExchange, getValidBearer, reExchange]);
|
|
963
|
-
|
|
1122
|
+
useEffect9(() => {
|
|
964
1123
|
let stale = false;
|
|
965
1124
|
if (authToken) {
|
|
966
1125
|
tokenRef.current = { token: authToken, expiresAt: null };
|
|
@@ -979,10 +1138,10 @@ function useSession({
|
|
|
979
1138
|
stale = true;
|
|
980
1139
|
};
|
|
981
1140
|
}, [authToken, canExchange, reExchange]);
|
|
982
|
-
const isStartingRef =
|
|
983
|
-
const pauseOnUnloadRef =
|
|
1141
|
+
const isStartingRef = useRef4(false);
|
|
1142
|
+
const pauseOnUnloadRef = useRef4(null);
|
|
984
1143
|
pauseOnUnloadRef.current = connection !== null && !isPaused && sessionId && bearerToken ? { sessionId, bearerToken } : null;
|
|
985
|
-
|
|
1144
|
+
useEffect9(() => {
|
|
986
1145
|
const onPageHide = () => {
|
|
987
1146
|
const pending = pauseOnUnloadRef.current;
|
|
988
1147
|
if (!pending)
|
|
@@ -997,7 +1156,7 @@ function useSession({
|
|
|
997
1156
|
window.addEventListener("pagehide", onPageHide);
|
|
998
1157
|
return () => window.removeEventListener("pagehide", onPageHide);
|
|
999
1158
|
}, []);
|
|
1000
|
-
const startSession =
|
|
1159
|
+
const startSession = useCallback8(async ({
|
|
1001
1160
|
agentId,
|
|
1002
1161
|
agentControls,
|
|
1003
1162
|
existingSessionId,
|
|
@@ -1092,7 +1251,7 @@ function useSession({
|
|
|
1092
1251
|
setIsStarting(false);
|
|
1093
1252
|
}
|
|
1094
1253
|
}, [captureMode, bearerToken, authedFetch, onStart, onStartError]);
|
|
1095
|
-
const pauseSession =
|
|
1254
|
+
const pauseSession = useCallback8(async () => {
|
|
1096
1255
|
if (!sessionId || !bearerToken)
|
|
1097
1256
|
return;
|
|
1098
1257
|
setIsPausing(true);
|
|
@@ -1118,7 +1277,7 @@ function useSession({
|
|
|
1118
1277
|
setIsPaused(true);
|
|
1119
1278
|
setIsPausing(false);
|
|
1120
1279
|
}, [sessionId, bearerToken, authedFetch, pendingScreenStream]);
|
|
1121
|
-
const disconnect =
|
|
1280
|
+
const disconnect = useCallback8(async () => {
|
|
1122
1281
|
setIsDisconnecting(true);
|
|
1123
1282
|
try {
|
|
1124
1283
|
if (sessionId && bearerToken) {
|
|
@@ -1163,7 +1322,7 @@ function useSession({
|
|
|
1163
1322
|
}
|
|
1164
1323
|
|
|
1165
1324
|
// src/hooks/useSessionHistory.ts
|
|
1166
|
-
import { useEffect as
|
|
1325
|
+
import { useEffect as useEffect10, useState as useState10 } from "react";
|
|
1167
1326
|
var API_URL5 = "https://specialist.skippr.ai/api";
|
|
1168
1327
|
var EMPTY = { messages: [], phases: [] };
|
|
1169
1328
|
function useSessionHistory({
|
|
@@ -1171,11 +1330,11 @@ function useSessionHistory({
|
|
|
1171
1330
|
enabled,
|
|
1172
1331
|
authedFetch
|
|
1173
1332
|
}) {
|
|
1174
|
-
const [history2, setHistory] =
|
|
1175
|
-
const [loadedAgentId, setLoadedAgentId] =
|
|
1333
|
+
const [history2, setHistory] = useState10(EMPTY);
|
|
1334
|
+
const [loadedAgentId, setLoadedAgentId] = useState10(null);
|
|
1176
1335
|
const activeAgentId = enabled && agentId ? agentId : null;
|
|
1177
1336
|
const isLoading = activeAgentId !== null && activeAgentId !== loadedAgentId;
|
|
1178
|
-
|
|
1337
|
+
useEffect10(() => {
|
|
1179
1338
|
if (!enabled || !agentId) {
|
|
1180
1339
|
setHistory(EMPTY);
|
|
1181
1340
|
setLoadedAgentId(null);
|
|
@@ -1523,7 +1682,7 @@ var __iconNode24 = [
|
|
|
1523
1682
|
];
|
|
1524
1683
|
var X = createLucideIcon("x", __iconNode24);
|
|
1525
1684
|
// src/components/AgentCursor.tsx
|
|
1526
|
-
import { useContext as useContext6, useEffect as
|
|
1685
|
+
import { useContext as useContext6, useEffect as useEffect11, useLayoutEffect, useRef as useRef5, useState as useState11 } from "react";
|
|
1527
1686
|
|
|
1528
1687
|
// src/capture/elementRef.ts
|
|
1529
1688
|
function safeGetIframeDocument(iframe) {
|
|
@@ -1662,7 +1821,7 @@ function traceRing(path, durationMs, onFrame, onDone) {
|
|
|
1662
1821
|
// src/components/AgentCursor.tsx
|
|
1663
1822
|
import { jsx as jsx4, jsxs } from "react/jsx-runtime";
|
|
1664
1823
|
var Z_INDEX = 2147483646;
|
|
1665
|
-
var
|
|
1824
|
+
var BRAND_COLOR = "var(--skippr-brand, #2bc0ae)";
|
|
1666
1825
|
var GLIDE_EASE = "cubic-bezier(0.45, 0, 0.25, 1)";
|
|
1667
1826
|
var GLIDE_MIN_MS = 900;
|
|
1668
1827
|
var GLIDE_MAX_MS = 1500;
|
|
@@ -1706,18 +1865,18 @@ function AgentCursor({
|
|
|
1706
1865
|
animated = false
|
|
1707
1866
|
}) {
|
|
1708
1867
|
const ctx = useContext6(LiveAgentContext);
|
|
1709
|
-
const [cursor, setCursor] =
|
|
1710
|
-
const [glideMs, setGlideMs] =
|
|
1711
|
-
const [phase, setPhase] =
|
|
1712
|
-
const [ringBox, setRingBox] =
|
|
1713
|
-
const [clickPulse, setClickPulse] =
|
|
1714
|
-
const cursorElRef =
|
|
1715
|
-
const pathRef =
|
|
1716
|
-
const prevCursorRef =
|
|
1717
|
-
const traceRef =
|
|
1718
|
-
const timersRef =
|
|
1719
|
-
const trackFrameRef =
|
|
1720
|
-
const glideFrameRef =
|
|
1868
|
+
const [cursor, setCursor] = useState11(null);
|
|
1869
|
+
const [glideMs, setGlideMs] = useState11(0);
|
|
1870
|
+
const [phase, setPhase] = useState11("idle");
|
|
1871
|
+
const [ringBox, setRingBox] = useState11(null);
|
|
1872
|
+
const [clickPulse, setClickPulse] = useState11(0);
|
|
1873
|
+
const cursorElRef = useRef5(null);
|
|
1874
|
+
const pathRef = useRef5(null);
|
|
1875
|
+
const prevCursorRef = useRef5(null);
|
|
1876
|
+
const traceRef = useRef5(null);
|
|
1877
|
+
const timersRef = useRef5(new Set);
|
|
1878
|
+
const trackFrameRef = useRef5(null);
|
|
1879
|
+
const glideFrameRef = useRef5(null);
|
|
1721
1880
|
const clearTimers = () => {
|
|
1722
1881
|
for (const t of timersRef.current)
|
|
1723
1882
|
clearTimeout(t);
|
|
@@ -1833,7 +1992,7 @@ function AgentCursor({
|
|
|
1833
1992
|
});
|
|
1834
1993
|
return cancelAnimation;
|
|
1835
1994
|
}, [target, animated]);
|
|
1836
|
-
|
|
1995
|
+
useEffect11(() => {
|
|
1837
1996
|
if (!target || target.kind === "gesture" || phase === "idle")
|
|
1838
1997
|
return;
|
|
1839
1998
|
const track = () => {
|
|
@@ -1865,7 +2024,7 @@ function AgentCursor({
|
|
|
1865
2024
|
}
|
|
1866
2025
|
};
|
|
1867
2026
|
}, [target, phase]);
|
|
1868
|
-
|
|
2027
|
+
useEffect11(() => {
|
|
1869
2028
|
return () => {
|
|
1870
2029
|
traceRef.current?.cancel();
|
|
1871
2030
|
for (const t of timersRef.current)
|
|
@@ -1889,7 +2048,7 @@ function AgentCursor({
|
|
|
1889
2048
|
ref: pathRef,
|
|
1890
2049
|
d: ringPathD(ringBox),
|
|
1891
2050
|
fill: "none",
|
|
1892
|
-
stroke:
|
|
2051
|
+
stroke: BRAND_COLOR,
|
|
1893
2052
|
strokeWidth: 2,
|
|
1894
2053
|
strokeLinecap: "round",
|
|
1895
2054
|
style: { strokeDasharray: "0 99999" }
|
|
@@ -1900,13 +2059,13 @@ function AgentCursor({
|
|
|
1900
2059
|
className: "skippr:relative",
|
|
1901
2060
|
children: [
|
|
1902
2061
|
/* @__PURE__ */ jsx4("div", {
|
|
1903
|
-
className: "skippr:absolute skippr:inset-0 skippr:rounded-[1rem] skippr:border-2 skippr:border-
|
|
2062
|
+
className: "skippr:absolute skippr:inset-0 skippr:rounded-[1rem] skippr:border-2 skippr:border-brand skippr:animate-skippr-annotation-pulse"
|
|
1904
2063
|
}),
|
|
1905
2064
|
/* @__PURE__ */ jsx4("div", {
|
|
1906
2065
|
role: "status",
|
|
1907
|
-
className: "skippr:absolute skippr:-bottom-9 skippr:left-1/2 skippr:-translate-x-1/2 skippr:flex skippr:items-center skippr:gap-1.5 skippr:rounded-full skippr:bg-
|
|
2066
|
+
className: "skippr:absolute skippr:-bottom-9 skippr:left-1/2 skippr:-translate-x-1/2 skippr:flex skippr:items-center skippr:gap-1.5 skippr:rounded-full skippr:bg-brand skippr:px-2.5 skippr:py-1 skippr:shadow-[0_4px_12px_rgba(0,0,0,0.12)]",
|
|
1908
2067
|
children: /* @__PURE__ */ jsx4("span", {
|
|
1909
|
-
className: "skippr:text-[11px] skippr:font-medium skippr:text-
|
|
2068
|
+
className: "skippr:text-[11px] skippr:font-medium skippr:text-primary-foreground skippr:whitespace-nowrap",
|
|
1910
2069
|
children: target.label
|
|
1911
2070
|
})
|
|
1912
2071
|
})
|
|
@@ -1914,7 +2073,7 @@ function AgentCursor({
|
|
|
1914
2073
|
}),
|
|
1915
2074
|
target.kind === "gesture" && /* @__PURE__ */ jsx4("div", {
|
|
1916
2075
|
role: "status",
|
|
1917
|
-
className: "skippr:fixed skippr:-translate-x-1/2 skippr:flex skippr:items-center skippr:gap-1.5 skippr:rounded-full skippr:bg-
|
|
2076
|
+
className: "skippr:fixed skippr:-translate-x-1/2 skippr:flex skippr:items-center skippr:gap-1.5 skippr:rounded-full skippr:bg-brand skippr:px-2.5 skippr:py-1 skippr:shadow-[0_4px_12px_rgba(0,0,0,0.12)]",
|
|
1918
2077
|
style: {
|
|
1919
2078
|
left: `${cursor.x}px`,
|
|
1920
2079
|
top: `${cursor.y + 18}px`,
|
|
@@ -1923,7 +2082,7 @@ function AgentCursor({
|
|
|
1923
2082
|
transition: `left ${glideMs}ms ${GLIDE_EASE}, top ${glideMs}ms ${GLIDE_EASE}`
|
|
1924
2083
|
},
|
|
1925
2084
|
children: /* @__PURE__ */ jsx4("span", {
|
|
1926
|
-
className: "skippr:text-[11px] skippr:font-medium skippr:text-
|
|
2085
|
+
className: "skippr:text-[11px] skippr:font-medium skippr:text-primary-foreground skippr:whitespace-nowrap",
|
|
1927
2086
|
children: target.label
|
|
1928
2087
|
})
|
|
1929
2088
|
}),
|
|
@@ -1938,12 +2097,12 @@ function AgentCursor({
|
|
|
1938
2097
|
transition: `left ${glideMs}ms ${GLIDE_EASE}, top ${glideMs}ms ${GLIDE_EASE}`
|
|
1939
2098
|
},
|
|
1940
2099
|
children: /* @__PURE__ */ jsx4(MousePointer2, {
|
|
1941
|
-
className: `skippr:h-5 skippr:w-5 skippr:text-
|
|
2100
|
+
className: `skippr:h-5 skippr:w-5 skippr:text-brand skippr:drop-shadow-[0_2px_5px_rgba(0,0,0,0.4)] ${clickPulse > 0 ? "skippr:animate-skippr-press" : "skippr:animate-skippr-cursor-pop"}`,
|
|
1942
2101
|
fill: "currentColor"
|
|
1943
2102
|
}, clickPulse)
|
|
1944
2103
|
}),
|
|
1945
2104
|
clickPulse > 0 && rippleCenter && /* @__PURE__ */ jsx4("span", {
|
|
1946
|
-
className: "skippr:fixed skippr:h-7 skippr:w-7 skippr:rounded-full skippr:bg-
|
|
2105
|
+
className: "skippr:fixed skippr:h-7 skippr:w-7 skippr:rounded-full skippr:bg-brand/50 skippr:animate-skippr-click-ping",
|
|
1947
2106
|
style: {
|
|
1948
2107
|
left: `${rippleCenter.x}px`,
|
|
1949
2108
|
top: `${rippleCenter.y}px`,
|
|
@@ -1956,17 +2115,17 @@ function AgentCursor({
|
|
|
1956
2115
|
}
|
|
1957
2116
|
|
|
1958
2117
|
// src/components/AutoStartMedia.tsx
|
|
1959
|
-
import { useConnectionState, useLocalParticipant as
|
|
1960
|
-
import { ConnectionState, Track } from "livekit-client";
|
|
1961
|
-
import { useEffect as
|
|
2118
|
+
import { useConnectionState, useLocalParticipant as useLocalParticipant4 } from "@livekit/components-react/hooks";
|
|
2119
|
+
import { ConnectionState, Track as Track2 } from "livekit-client";
|
|
2120
|
+
import { useEffect as useEffect12, useRef as useRef6 } from "react";
|
|
1962
2121
|
function AutoStartMedia({
|
|
1963
2122
|
pendingScreenStream,
|
|
1964
2123
|
pushOrTapMicMode = false
|
|
1965
2124
|
}) {
|
|
1966
|
-
const { localParticipant } =
|
|
2125
|
+
const { localParticipant } = useLocalParticipant4();
|
|
1967
2126
|
const connectionState = useConnectionState();
|
|
1968
|
-
const didStartRef =
|
|
1969
|
-
|
|
2127
|
+
const didStartRef = useRef6(false);
|
|
2128
|
+
useEffect12(() => {
|
|
1970
2129
|
if (didStartRef.current)
|
|
1971
2130
|
return;
|
|
1972
2131
|
if (connectionState !== ConnectionState.Connected)
|
|
@@ -1979,7 +2138,7 @@ function AutoStartMedia({
|
|
|
1979
2138
|
const videoTrack = pendingScreenStream.getVideoTracks()[0];
|
|
1980
2139
|
if (videoTrack) {
|
|
1981
2140
|
videoTrack.contentHint = "detail";
|
|
1982
|
-
localParticipant.publishTrack(videoTrack, { source:
|
|
2141
|
+
localParticipant.publishTrack(videoTrack, { source: Track2.Source.ScreenShare }).catch((error) => {
|
|
1983
2142
|
console.error("Failed to publish screen share track:", error);
|
|
1984
2143
|
for (const track of pendingScreenStream.getTracks())
|
|
1985
2144
|
track.stop();
|
|
@@ -1991,9 +2150,9 @@ function AutoStartMedia({
|
|
|
1991
2150
|
}
|
|
1992
2151
|
|
|
1993
2152
|
// src/components/DomCapture.tsx
|
|
1994
|
-
import { useConnectionState as useConnectionState2, useLocalParticipant as
|
|
1995
|
-
import { ConnectionState as ConnectionState2, ScreenSharePresets, Track as
|
|
1996
|
-
import { useEffect as
|
|
2153
|
+
import { useConnectionState as useConnectionState2, useLocalParticipant as useLocalParticipant5 } from "@livekit/components-react/hooks";
|
|
2154
|
+
import { ConnectionState as ConnectionState2, ScreenSharePresets as ScreenSharePresets2, Track as Track3 } from "livekit-client";
|
|
2155
|
+
import { useEffect as useEffect13, useRef as useRef7 } from "react";
|
|
1997
2156
|
|
|
1998
2157
|
// src/capture/a11yUtils.ts
|
|
1999
2158
|
var ROLE_BY_TAG = {
|
|
@@ -2787,7 +2946,7 @@ async function snapToCanvas(element, options = {}) {
|
|
|
2787
2946
|
var SNAPSHOT_INTERVAL_MS = 3000;
|
|
2788
2947
|
var A11Y_PUBLISH_INTERVAL_MS = 2000;
|
|
2789
2948
|
var FIRST_SNAPSHOT_DELAY_MS = 400;
|
|
2790
|
-
var CAPTURE_PRESET =
|
|
2949
|
+
var CAPTURE_PRESET = ScreenSharePresets2.h1080fps30;
|
|
2791
2950
|
var CAPTURE_FPS = CAPTURE_PRESET.encoding.maxFramerate ?? 30;
|
|
2792
2951
|
var CAPTURE_BITRATE = 4000000;
|
|
2793
2952
|
var DOM_SNAPSHOT_GZIP_THRESHOLD_BYTES = 14000;
|
|
@@ -2823,7 +2982,7 @@ function getCanvasCaptureStream(canvas, fps) {
|
|
|
2823
2982
|
}
|
|
2824
2983
|
return captureStreamFn.call(canvas, fps);
|
|
2825
2984
|
}
|
|
2826
|
-
async function paintViewportSnapshot(canvas, ctx) {
|
|
2985
|
+
async function paintViewportSnapshot(canvas, ctx, isStillWanted) {
|
|
2827
2986
|
const dpr = window.devicePixelRatio || 1;
|
|
2828
2987
|
const snapshotCanvas = await snapToCanvas(document.documentElement, {
|
|
2829
2988
|
filter: shouldIncludeInSnapshot,
|
|
@@ -2832,6 +2991,8 @@ async function paintViewportSnapshot(canvas, ctx) {
|
|
|
2832
2991
|
fast: false,
|
|
2833
2992
|
dpr
|
|
2834
2993
|
});
|
|
2994
|
+
if (!isStillWanted())
|
|
2995
|
+
return;
|
|
2835
2996
|
const sourceX = window.scrollX * dpr;
|
|
2836
2997
|
const sourceY = window.scrollY * dpr;
|
|
2837
2998
|
const sourceWidth = window.innerWidth * dpr;
|
|
@@ -2892,10 +3053,14 @@ async function unpublishAndStopTrack(localParticipant, videoTrack) {
|
|
|
2892
3053
|
videoTrack.stop();
|
|
2893
3054
|
}
|
|
2894
3055
|
function DomCapture({ pushOrTapMicMode = false }) {
|
|
2895
|
-
const { localParticipant } =
|
|
3056
|
+
const { localParticipant } = useLocalParticipant5();
|
|
2896
3057
|
const connectionState = useConnectionState2();
|
|
2897
|
-
const
|
|
2898
|
-
|
|
3058
|
+
const { isHeld } = useSessionHoldContext();
|
|
3059
|
+
const didStartRef = useRef7(false);
|
|
3060
|
+
const pausedRef = useRef7(false);
|
|
3061
|
+
const freezeCaptureRef = useRef7(null);
|
|
3062
|
+
const resumeCaptureRef = useRef7(null);
|
|
3063
|
+
useEffect13(() => {
|
|
2899
3064
|
if (didStartRef.current)
|
|
2900
3065
|
return;
|
|
2901
3066
|
if (connectionState !== ConnectionState2.Connected)
|
|
@@ -2916,11 +3081,11 @@ function DomCapture({ pushOrTapMicMode = false }) {
|
|
|
2916
3081
|
let snapshotInFlight = false;
|
|
2917
3082
|
let a11yPublishInFlight = false;
|
|
2918
3083
|
let consecutiveCaptureFailures = 0;
|
|
2919
|
-
if (!pushOrTapMicMode) {
|
|
3084
|
+
if (!pushOrTapMicMode && !localParticipant.isMicrophoneEnabled) {
|
|
2920
3085
|
localParticipant.setMicrophoneEnabled(true).catch((error) => console.error("Failed to enable microphone:", error));
|
|
2921
3086
|
}
|
|
2922
3087
|
localParticipant.publishTrack(videoTrack, {
|
|
2923
|
-
source:
|
|
3088
|
+
source: Track3.Source.ScreenShare,
|
|
2924
3089
|
videoEncoding: {
|
|
2925
3090
|
maxBitrate: CAPTURE_BITRATE,
|
|
2926
3091
|
maxFramerate: CAPTURE_FPS
|
|
@@ -2932,11 +3097,11 @@ function DomCapture({ pushOrTapMicMode = false }) {
|
|
|
2932
3097
|
track.stop();
|
|
2933
3098
|
});
|
|
2934
3099
|
const tickSnapshot = async () => {
|
|
2935
|
-
if (cancelled || snapshotInFlight)
|
|
3100
|
+
if (cancelled || snapshotInFlight || pausedRef.current)
|
|
2936
3101
|
return;
|
|
2937
3102
|
snapshotInFlight = true;
|
|
2938
3103
|
try {
|
|
2939
|
-
await paintViewportSnapshot(canvas, ctx);
|
|
3104
|
+
await paintViewportSnapshot(canvas, ctx, () => !cancelled && !pausedRef.current);
|
|
2940
3105
|
if (cancelled)
|
|
2941
3106
|
return;
|
|
2942
3107
|
consecutiveCaptureFailures = 0;
|
|
@@ -2952,7 +3117,7 @@ function DomCapture({ pushOrTapMicMode = false }) {
|
|
|
2952
3117
|
}
|
|
2953
3118
|
};
|
|
2954
3119
|
const tickA11yPublish = async () => {
|
|
2955
|
-
if (cancelled || a11yPublishInFlight)
|
|
3120
|
+
if (cancelled || a11yPublishInFlight || pausedRef.current)
|
|
2956
3121
|
return;
|
|
2957
3122
|
a11yPublishInFlight = true;
|
|
2958
3123
|
try {
|
|
@@ -2989,9 +3154,20 @@ function DomCapture({ pushOrTapMicMode = false }) {
|
|
|
2989
3154
|
scheduleNextSnapshot(FIRST_SNAPSHOT_DELAY_MS);
|
|
2990
3155
|
tickA11yPublish();
|
|
2991
3156
|
const a11yPublishTimer = setInterval(tickA11yPublish, A11Y_PUBLISH_INTERVAL_MS);
|
|
3157
|
+
freezeCaptureRef.current = () => {
|
|
3158
|
+
pausedRef.current = true;
|
|
3159
|
+
drawPausedOverlay(canvas, ctx);
|
|
3160
|
+
};
|
|
3161
|
+
resumeCaptureRef.current = () => {
|
|
3162
|
+
pausedRef.current = false;
|
|
3163
|
+
tickA11yPublish();
|
|
3164
|
+
tickSnapshot();
|
|
3165
|
+
};
|
|
2992
3166
|
return () => {
|
|
2993
3167
|
cancelled = true;
|
|
2994
3168
|
didStartRef.current = false;
|
|
3169
|
+
freezeCaptureRef.current = null;
|
|
3170
|
+
resumeCaptureRef.current = null;
|
|
2995
3171
|
if (snapshotTimer)
|
|
2996
3172
|
clearTimeout(snapshotTimer);
|
|
2997
3173
|
clearInterval(a11yPublishTimer);
|
|
@@ -3002,12 +3178,19 @@ function DomCapture({ pushOrTapMicMode = false }) {
|
|
|
3002
3178
|
track.stop();
|
|
3003
3179
|
};
|
|
3004
3180
|
}, [connectionState, localParticipant, pushOrTapMicMode]);
|
|
3181
|
+
useEffect13(() => {
|
|
3182
|
+
if (isHeld) {
|
|
3183
|
+
freezeCaptureRef.current?.();
|
|
3184
|
+
} else {
|
|
3185
|
+
resumeCaptureRef.current?.();
|
|
3186
|
+
}
|
|
3187
|
+
}, [isHeld]);
|
|
3005
3188
|
return null;
|
|
3006
3189
|
}
|
|
3007
3190
|
|
|
3008
3191
|
// src/components/HighlightOverlay.tsx
|
|
3009
3192
|
import { useDataChannel } from "@livekit/components-react/hooks";
|
|
3010
|
-
import { useCallback as
|
|
3193
|
+
import { useCallback as useCallback9, useEffect as useEffect14, useRef as useRef8 } from "react";
|
|
3011
3194
|
var HIGHLIGHT_AUTO_CLEAR_MS = 25000;
|
|
3012
3195
|
var textDecoder = new TextDecoder;
|
|
3013
3196
|
function parseHighlightMessage(payload) {
|
|
@@ -3030,16 +3213,16 @@ function parseHighlightMessage(payload) {
|
|
|
3030
3213
|
}
|
|
3031
3214
|
}
|
|
3032
3215
|
function HighlightOverlay() {
|
|
3033
|
-
const targetRef =
|
|
3034
|
-
const autoClearRef =
|
|
3035
|
-
const clear =
|
|
3216
|
+
const targetRef = useRef8(null);
|
|
3217
|
+
const autoClearRef = useRef8(null);
|
|
3218
|
+
const clear = useCallback9(() => {
|
|
3036
3219
|
if (autoClearRef.current)
|
|
3037
3220
|
clearTimeout(autoClearRef.current);
|
|
3038
3221
|
autoClearRef.current = null;
|
|
3039
3222
|
targetRef.current = null;
|
|
3040
3223
|
clearCursorTarget("guide");
|
|
3041
3224
|
}, []);
|
|
3042
|
-
const onHighlightMessage =
|
|
3225
|
+
const onHighlightMessage = useCallback9((msg) => {
|
|
3043
3226
|
const parsed = parseHighlightMessage(msg.payload);
|
|
3044
3227
|
if (!parsed)
|
|
3045
3228
|
return;
|
|
@@ -3063,7 +3246,7 @@ function HighlightOverlay() {
|
|
|
3063
3246
|
autoClearRef.current = setTimeout(clear, HIGHLIGHT_AUTO_CLEAR_MS);
|
|
3064
3247
|
}, [clear]);
|
|
3065
3248
|
useDataChannel(HIGHLIGHT_TOPIC, onHighlightMessage);
|
|
3066
|
-
|
|
3249
|
+
useEffect14(() => {
|
|
3067
3250
|
const onClick = (event) => {
|
|
3068
3251
|
const target = targetRef.current;
|
|
3069
3252
|
const node = event.target;
|
|
@@ -3073,26 +3256,26 @@ function HighlightOverlay() {
|
|
|
3073
3256
|
document.addEventListener("click", onClick, { capture: true });
|
|
3074
3257
|
return () => document.removeEventListener("click", onClick, { capture: true });
|
|
3075
3258
|
}, [clear]);
|
|
3076
|
-
|
|
3259
|
+
useEffect14(() => clear, [clear]);
|
|
3077
3260
|
return null;
|
|
3078
3261
|
}
|
|
3079
3262
|
|
|
3080
3263
|
// src/components/MinimizedBubble.tsx
|
|
3081
|
-
import { useContext as useContext7, useEffect as
|
|
3264
|
+
import { useContext as useContext7, useEffect as useEffect16, useRef as useRef10, useState as useState12 } from "react";
|
|
3082
3265
|
|
|
3083
3266
|
// src/hooks/useLauncherDrag.ts
|
|
3084
|
-
import { useEffect as
|
|
3267
|
+
import { useEffect as useEffect15, useRef as useRef9 } from "react";
|
|
3085
3268
|
import { flushSync } from "react-dom";
|
|
3086
3269
|
var DRAG_THRESHOLD_PX = 5;
|
|
3087
3270
|
function useLauncherDrag(containerRef, onDrop, followRefs, reportDragging) {
|
|
3088
|
-
const wasDraggedRef =
|
|
3089
|
-
const onDropRef =
|
|
3271
|
+
const wasDraggedRef = useRef9(false);
|
|
3272
|
+
const onDropRef = useRef9(onDrop);
|
|
3090
3273
|
onDropRef.current = onDrop;
|
|
3091
|
-
const followTargetsRef =
|
|
3274
|
+
const followTargetsRef = useRef9(followRefs);
|
|
3092
3275
|
followTargetsRef.current = followRefs;
|
|
3093
|
-
const reportDraggingRef =
|
|
3276
|
+
const reportDraggingRef = useRef9(reportDragging);
|
|
3094
3277
|
reportDraggingRef.current = reportDragging;
|
|
3095
|
-
|
|
3278
|
+
useEffect15(() => {
|
|
3096
3279
|
const el = containerRef.current;
|
|
3097
3280
|
if (!el)
|
|
3098
3281
|
return;
|
|
@@ -3343,13 +3526,17 @@ var GOAL_APPEAR_STAGGER_MS = 150;
|
|
|
3343
3526
|
var GOAL_EXIT_STAGGER_MS = 250;
|
|
3344
3527
|
var MAX_GOAL_BUBBLES = 3;
|
|
3345
3528
|
var MAX_MODULE_PILLS = 3;
|
|
3346
|
-
function SkipprMark({ onStart }) {
|
|
3529
|
+
function SkipprMark({ onStart, logoUrl }) {
|
|
3347
3530
|
return /* @__PURE__ */ jsx7("button", {
|
|
3348
3531
|
type: "button",
|
|
3349
3532
|
onClick: onStart,
|
|
3350
3533
|
"aria-label": "Ask Me Anything",
|
|
3351
3534
|
className: "skippr:flex skippr:h-[36px] skippr:w-[36px] skippr:shrink-0 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:bg-transparent skippr:p-0",
|
|
3352
|
-
children: /* @__PURE__ */ jsx7("
|
|
3535
|
+
children: logoUrl ? /* @__PURE__ */ jsx7("img", {
|
|
3536
|
+
src: logoUrl,
|
|
3537
|
+
alt: "",
|
|
3538
|
+
className: "skippr:h-[36px] skippr:w-[36px] skippr:rounded-[11px] skippr:object-cover"
|
|
3539
|
+
}) : /* @__PURE__ */ jsx7("svg", {
|
|
3353
3540
|
viewBox: "0 0 15.4044 18.4853",
|
|
3354
3541
|
className: "skippr:h-[18.5px] skippr:w-[15.4px]",
|
|
3355
3542
|
fill: "none",
|
|
@@ -3400,11 +3587,12 @@ function ChatButton({
|
|
|
3400
3587
|
function IdleLauncher({
|
|
3401
3588
|
position,
|
|
3402
3589
|
isHovered,
|
|
3590
|
+
logoUrl,
|
|
3403
3591
|
onStart,
|
|
3404
3592
|
onChat
|
|
3405
3593
|
}) {
|
|
3406
3594
|
return /* @__PURE__ */ jsxs4("div", {
|
|
3407
|
-
className: cn("skippr:flex skippr:h-[48px] skippr:items-center", "skippr:bg-launcher skippr:p-1.5 skippr:shadow-[-6px_8px_30px_rgba(15,18,26,0.32)]", "skippr:[animation:skippr-orb-in_320ms_cubic-bezier(0.34,1.3,0.64,1)]", "skippr:transition-transform skippr:duration-[400ms] skippr:ease-[cubic-bezier(0.22,1,0.36,1)]", position === "right" ? "skippr:rounded-l-[18px] skippr:origin-right" : "skippr:rounded-r-[18px] skippr:origin-left", position === "right" ? isHovered ? "skippr:translate-x-3" : "skippr:translate-x-7" : isHovered ? "skippr:-translate-x-3" : "skippr:-translate-x-7"),
|
|
3595
|
+
className: cn("skippr:flex skippr:h-[48px] skippr:items-center", "skippr:bg-launcher skippr:p-1.5 skippr:shadow-[-6px_8px_30px_rgba(15,18,26,0.32)]", "skippr:[animation:skippr-orb-in_320ms_cubic-bezier(0.34,1.3,0.64,1)]", "skippr:transition-transform skippr:duration-[400ms] skippr:ease-[cubic-bezier(0.22,1,0.36,1)]", position === "right" ? "skippr:rounded-l-[18px] skippr:origin-right" : "skippr:rounded-r-[18px] skippr:origin-left", position === "right" ? isHovered || logoUrl ? "skippr:translate-x-3" : "skippr:translate-x-7" : isHovered || logoUrl ? "skippr:-translate-x-3" : "skippr:-translate-x-7"),
|
|
3408
3596
|
style: { gap: isHovered ? 8 : 0 },
|
|
3409
3597
|
children: [
|
|
3410
3598
|
/* @__PURE__ */ jsx7(ChatButton, {
|
|
@@ -3413,7 +3601,8 @@ function IdleLauncher({
|
|
|
3413
3601
|
onClick: onChat
|
|
3414
3602
|
}),
|
|
3415
3603
|
/* @__PURE__ */ jsx7(SkipprMark, {
|
|
3416
|
-
onStart
|
|
3604
|
+
onStart,
|
|
3605
|
+
logoUrl
|
|
3417
3606
|
})
|
|
3418
3607
|
]
|
|
3419
3608
|
});
|
|
@@ -3425,7 +3614,7 @@ function WelcomeBubble({
|
|
|
3425
3614
|
onDismiss,
|
|
3426
3615
|
onClick
|
|
3427
3616
|
}) {
|
|
3428
|
-
|
|
3617
|
+
useEffect16(() => {
|
|
3429
3618
|
const timer = setTimeout(onDismiss, 5000);
|
|
3430
3619
|
return () => clearTimeout(timer);
|
|
3431
3620
|
}, [onDismiss]);
|
|
@@ -3467,15 +3656,16 @@ function MinimizedBubble({
|
|
|
3467
3656
|
selectModule,
|
|
3468
3657
|
expandPanel,
|
|
3469
3658
|
setSidebarTab,
|
|
3470
|
-
commitLauncherDrop
|
|
3659
|
+
commitLauncherDrop,
|
|
3660
|
+
appearance
|
|
3471
3661
|
} = ctx;
|
|
3472
|
-
const [goalsAutoHidden, setGoalsAutoHidden] =
|
|
3473
|
-
const [isLauncherHovered, setIsLauncherHovered] =
|
|
3474
|
-
const [visitHref, setVisitHref] =
|
|
3475
|
-
const revealedHrefRef =
|
|
3476
|
-
const hoverContainerRef =
|
|
3477
|
-
|
|
3478
|
-
|
|
3662
|
+
const [goalsAutoHidden, setGoalsAutoHidden] = useState12(false);
|
|
3663
|
+
const [isLauncherHovered, setIsLauncherHovered] = useState12(false);
|
|
3664
|
+
const [visitHref, setVisitHref] = useState12(() => window.location.href);
|
|
3665
|
+
const revealedHrefRef = useRef10(null);
|
|
3666
|
+
const hoverContainerRef = useRef10(null);
|
|
3667
|
+
useEffect16(() => subscribeToLocationChange(() => setVisitHref(window.location.href)), []);
|
|
3668
|
+
useEffect16(() => {
|
|
3479
3669
|
const el = hoverContainerRef.current;
|
|
3480
3670
|
if (!el)
|
|
3481
3671
|
return;
|
|
@@ -3497,7 +3687,7 @@ function MinimizedBubble({
|
|
|
3497
3687
|
const onboardingModule = pillCandidates.find((module) => module.type === "onboarding");
|
|
3498
3688
|
const modulePills = onboardingModule ? [onboardingModule] : pillCandidates.slice(0, MAX_MODULE_PILLS).reverse();
|
|
3499
3689
|
const goalsEligible = adoptionGoals.length > 0 && !onboardingModule && hasResolvedModules;
|
|
3500
|
-
|
|
3690
|
+
useEffect16(() => {
|
|
3501
3691
|
if (!goalsEligible)
|
|
3502
3692
|
return;
|
|
3503
3693
|
if (revealedHrefRef.current === visitHref) {
|
|
@@ -3511,8 +3701,8 @@ function MinimizedBubble({
|
|
|
3511
3701
|
}, [goalsEligible, visitHref]);
|
|
3512
3702
|
const matchedGoals = goalsEligible ? adoptionGoals.slice(0, MAX_GOAL_BUBBLES) : [];
|
|
3513
3703
|
const goalsHidden = goalsAutoHidden && !isLauncherHovered;
|
|
3514
|
-
const [goalsUnmounted, setGoalsUnmounted] =
|
|
3515
|
-
|
|
3704
|
+
const [goalsUnmounted, setGoalsUnmounted] = useState12(false);
|
|
3705
|
+
useEffect16(() => {
|
|
3516
3706
|
if (!goalsHidden) {
|
|
3517
3707
|
setGoalsUnmounted(false);
|
|
3518
3708
|
return;
|
|
@@ -3578,6 +3768,7 @@ function MinimizedBubble({
|
|
|
3578
3768
|
/* @__PURE__ */ jsx7(IdleLauncher, {
|
|
3579
3769
|
position,
|
|
3580
3770
|
isHovered: isLauncherHovered,
|
|
3771
|
+
logoUrl: appearance?.logoUrl ?? null,
|
|
3581
3772
|
onStart: launchDefaultSession,
|
|
3582
3773
|
onChat: openChat
|
|
3583
3774
|
})
|
|
@@ -3587,7 +3778,7 @@ function MinimizedBubble({
|
|
|
3587
3778
|
|
|
3588
3779
|
// src/components/PageActionHandler.tsx
|
|
3589
3780
|
import { useDataChannel as useDataChannel2 } from "@livekit/components-react/hooks";
|
|
3590
|
-
import { useCallback as
|
|
3781
|
+
import { useCallback as useCallback10, useEffect as useEffect17, useRef as useRef11 } from "react";
|
|
3591
3782
|
var STEP_MAX_WAIT_MS = 5000;
|
|
3592
3783
|
var POST_ACTION_SETTLE_SNAPSHOT_MS = 300;
|
|
3593
3784
|
var TRAILING_ACTION_FLUSH_AFTER_STOP_MS = 1000;
|
|
@@ -3805,14 +3996,14 @@ function labelFor(action) {
|
|
|
3805
3996
|
}
|
|
3806
3997
|
}
|
|
3807
3998
|
function PageActionHandler() {
|
|
3808
|
-
const mountedRef =
|
|
3809
|
-
const queueRef =
|
|
3810
|
-
const drainingRef =
|
|
3811
|
-
const settleTimerRef =
|
|
3812
|
-
const endStepRef =
|
|
3813
|
-
const actionsStoppedRef =
|
|
3814
|
-
const ignoreActionsArrivingBeforeRef =
|
|
3815
|
-
const runStep =
|
|
3999
|
+
const mountedRef = useRef11(true);
|
|
4000
|
+
const queueRef = useRef11([]);
|
|
4001
|
+
const drainingRef = useRef11(false);
|
|
4002
|
+
const settleTimerRef = useRef11(null);
|
|
4003
|
+
const endStepRef = useRef11(null);
|
|
4004
|
+
const actionsStoppedRef = useRef11(false);
|
|
4005
|
+
const ignoreActionsArrivingBeforeRef = useRef11(0);
|
|
4006
|
+
const runStep = useCallback10((action) => {
|
|
3816
4007
|
return new Promise((resolve) => {
|
|
3817
4008
|
if (action.type === "scroll_page") {
|
|
3818
4009
|
let scrolled = false;
|
|
@@ -3881,7 +4072,7 @@ function PageActionHandler() {
|
|
|
3881
4072
|
});
|
|
3882
4073
|
});
|
|
3883
4074
|
}, []);
|
|
3884
|
-
const drain =
|
|
4075
|
+
const drain = useCallback10(async () => {
|
|
3885
4076
|
if (drainingRef.current)
|
|
3886
4077
|
return;
|
|
3887
4078
|
drainingRef.current = true;
|
|
@@ -3902,7 +4093,7 @@ function PageActionHandler() {
|
|
|
3902
4093
|
}
|
|
3903
4094
|
}
|
|
3904
4095
|
}, [runStep]);
|
|
3905
|
-
const onMessage =
|
|
4096
|
+
const onMessage = useCallback10((msg) => {
|
|
3906
4097
|
const action = parsePageAction(msg.payload);
|
|
3907
4098
|
if (!action)
|
|
3908
4099
|
return;
|
|
@@ -3911,7 +4102,7 @@ function PageActionHandler() {
|
|
|
3911
4102
|
queueRef.current.push(action);
|
|
3912
4103
|
drain();
|
|
3913
4104
|
}, [drain]);
|
|
3914
|
-
|
|
4105
|
+
useEffect17(() => {
|
|
3915
4106
|
mountedRef.current = true;
|
|
3916
4107
|
drainingRef.current = false;
|
|
3917
4108
|
return () => {
|
|
@@ -3923,7 +4114,7 @@ function PageActionHandler() {
|
|
|
3923
4114
|
setActionsBusy(false);
|
|
3924
4115
|
};
|
|
3925
4116
|
}, []);
|
|
3926
|
-
|
|
4117
|
+
useEffect17(() => {
|
|
3927
4118
|
return onActionsStopped(() => {
|
|
3928
4119
|
actionsStoppedRef.current = true;
|
|
3929
4120
|
ignoreActionsArrivingBeforeRef.current = Date.now() + TRAILING_ACTION_FLUSH_AFTER_STOP_MS;
|
|
@@ -3941,19 +4132,19 @@ function PageActionHandler() {
|
|
|
3941
4132
|
}
|
|
3942
4133
|
|
|
3943
4134
|
// src/components/SessionControlBar.tsx
|
|
3944
|
-
import { useCallback as useCallback13, useContext as useContext8, useEffect as
|
|
4135
|
+
import { useCallback as useCallback13, useContext as useContext8, useEffect as useEffect22, useState as useState15 } from "react";
|
|
3945
4136
|
|
|
3946
4137
|
// src/hooks/useActionControl.ts
|
|
3947
|
-
import { useLocalParticipant as
|
|
3948
|
-
import { useCallback as
|
|
4138
|
+
import { useLocalParticipant as useLocalParticipant6 } from "@livekit/components-react/hooks";
|
|
4139
|
+
import { useCallback as useCallback11, useEffect as useEffect18, useState as useState13 } from "react";
|
|
3949
4140
|
var textEncoder5 = new TextEncoder;
|
|
3950
4141
|
function useActionControl() {
|
|
3951
|
-
const { localParticipant } =
|
|
4142
|
+
const { localParticipant } = useLocalParticipant6();
|
|
3952
4143
|
const plan = usePlanUpdates();
|
|
3953
|
-
const [busy, setBusy] =
|
|
3954
|
-
|
|
4144
|
+
const [busy, setBusy] = useState13(isActionsBusy);
|
|
4145
|
+
useEffect18(() => subscribeActionsBusy(setBusy), []);
|
|
3955
4146
|
const actionsActive = busy || plan?.state === "executing";
|
|
3956
|
-
const requestStop =
|
|
4147
|
+
const requestStop = useCallback11(async () => {
|
|
3957
4148
|
stopActions();
|
|
3958
4149
|
try {
|
|
3959
4150
|
await localParticipant.publishData(textEncoder5.encode(JSON.stringify({ type: "abort" })), {
|
|
@@ -3980,13 +4171,13 @@ function useAgentVoiceState() {
|
|
|
3980
4171
|
}
|
|
3981
4172
|
|
|
3982
4173
|
// src/hooks/useAudioLevelBars.ts
|
|
3983
|
-
import { useEffect as
|
|
4174
|
+
import { useEffect as useEffect19, useRef as useRef12, useState as useState14 } from "react";
|
|
3984
4175
|
var TALKING_LEVEL_THRESHOLD = 0.2;
|
|
3985
4176
|
var TALKING_HOLD_MS = 400;
|
|
3986
4177
|
function useAudioLevelBars(mediaStreamTrack, { barCount, idleHeightPx, maxGrowthPx, noiseGate }) {
|
|
3987
|
-
const barRefs =
|
|
3988
|
-
const [isTalking, setIsTalking] =
|
|
3989
|
-
|
|
4178
|
+
const barRefs = useRef12([]);
|
|
4179
|
+
const [isTalking, setIsTalking] = useState14(false);
|
|
4180
|
+
useEffect19(() => {
|
|
3990
4181
|
if (!mediaStreamTrack) {
|
|
3991
4182
|
for (const bar of barRefs.current) {
|
|
3992
4183
|
if (bar)
|
|
@@ -4037,31 +4228,31 @@ function useAudioLevelBars(mediaStreamTrack, { barCount, idleHeightPx, maxGrowth
|
|
|
4037
4228
|
}
|
|
4038
4229
|
|
|
4039
4230
|
// src/hooks/useIdleAutoPause.ts
|
|
4040
|
-
import { useCallback as
|
|
4231
|
+
import { useCallback as useCallback12, useEffect as useEffect20, useRef as useRef13 } from "react";
|
|
4041
4232
|
function useIdleAutoPause({
|
|
4042
4233
|
enabled,
|
|
4043
4234
|
active,
|
|
4044
4235
|
isHeld,
|
|
4045
4236
|
pause
|
|
4046
4237
|
}) {
|
|
4047
|
-
const timerRef =
|
|
4048
|
-
const pauseRef =
|
|
4238
|
+
const timerRef = useRef13(null);
|
|
4239
|
+
const pauseRef = useRef13(pause);
|
|
4049
4240
|
pauseRef.current = pause;
|
|
4050
|
-
const clearTimer =
|
|
4241
|
+
const clearTimer = useCallback12(() => {
|
|
4051
4242
|
if (timerRef.current) {
|
|
4052
4243
|
clearTimeout(timerRef.current);
|
|
4053
4244
|
timerRef.current = null;
|
|
4054
4245
|
}
|
|
4055
4246
|
}, []);
|
|
4056
|
-
const armTimer =
|
|
4247
|
+
const armTimer = useCallback12(() => {
|
|
4057
4248
|
clearTimer();
|
|
4058
4249
|
timerRef.current = setTimeout(() => pauseRef.current(), IDLE_AUTO_PAUSE_MS);
|
|
4059
4250
|
}, [clearTimer]);
|
|
4060
|
-
const reportActivity =
|
|
4251
|
+
const reportActivity = useCallback12(() => {
|
|
4061
4252
|
if (enabled && !isHeld)
|
|
4062
4253
|
armTimer();
|
|
4063
4254
|
}, [enabled, isHeld, armTimer]);
|
|
4064
|
-
|
|
4255
|
+
useEffect20(() => {
|
|
4065
4256
|
if (!enabled || isHeld || active) {
|
|
4066
4257
|
clearTimer();
|
|
4067
4258
|
return;
|
|
@@ -4073,7 +4264,7 @@ function useIdleAutoPause({
|
|
|
4073
4264
|
}
|
|
4074
4265
|
|
|
4075
4266
|
// src/hooks/useKeyboardPushToTalk.ts
|
|
4076
|
-
import { useEffect as
|
|
4267
|
+
import { useEffect as useEffect21, useRef as useRef14 } from "react";
|
|
4077
4268
|
function isEditableTarget() {
|
|
4078
4269
|
const el = document.activeElement;
|
|
4079
4270
|
if (!el)
|
|
@@ -4087,9 +4278,9 @@ function useKeyboardPushToTalk({
|
|
|
4087
4278
|
onCommit,
|
|
4088
4279
|
onKeyUsed
|
|
4089
4280
|
}) {
|
|
4090
|
-
const handlers =
|
|
4281
|
+
const handlers = useRef14({ onStart, onCommit, onKeyUsed });
|
|
4091
4282
|
handlers.current = { onStart, onCommit, onKeyUsed };
|
|
4092
|
-
|
|
4283
|
+
useEffect21(() => {
|
|
4093
4284
|
if (!enabled)
|
|
4094
4285
|
return;
|
|
4095
4286
|
let keyHeld = false;
|
|
@@ -4137,14 +4328,14 @@ function useKeyboardPushToTalk({
|
|
|
4137
4328
|
}
|
|
4138
4329
|
|
|
4139
4330
|
// src/hooks/useLiveUserTranscript.ts
|
|
4140
|
-
import { useLocalParticipant as
|
|
4141
|
-
import { useRef as
|
|
4331
|
+
import { useLocalParticipant as useLocalParticipant7 } from "@livekit/components-react/hooks";
|
|
4332
|
+
import { useRef as useRef15 } from "react";
|
|
4142
4333
|
function useLiveUserTranscript(active) {
|
|
4143
4334
|
const transcriptions = useSharedTranscriptions();
|
|
4144
|
-
const { localParticipant } =
|
|
4335
|
+
const { localParticipant } = useLocalParticipant7();
|
|
4145
4336
|
const localIdentity = localParticipant.identity;
|
|
4146
|
-
const priorStreamIdsRef =
|
|
4147
|
-
const wasActiveRef =
|
|
4337
|
+
const priorStreamIdsRef = useRef15(new Set);
|
|
4338
|
+
const wasActiveRef = useRef15(false);
|
|
4148
4339
|
const userStreams = transcriptions.filter((stream) => stream.participantInfo.identity === localIdentity);
|
|
4149
4340
|
if (active && !wasActiveRef.current) {
|
|
4150
4341
|
priorStreamIdsRef.current = new Set(userStreams.map((s) => s.streamInfo.id));
|
|
@@ -4155,36 +4346,6 @@ function useLiveUserTranscript(active) {
|
|
|
4155
4346
|
return userStreams.filter((stream) => !priorStreamIdsRef.current.has(stream.streamInfo.id)).map((stream) => stream.text.trim()).filter((text) => text.length > 0).join(" ");
|
|
4156
4347
|
}
|
|
4157
4348
|
|
|
4158
|
-
// src/hooks/useMediaControls.ts
|
|
4159
|
-
import { useLocalParticipant as useLocalParticipant7 } from "@livekit/components-react/hooks";
|
|
4160
|
-
import { ScreenSharePresets as ScreenSharePresets2 } from "livekit-client";
|
|
4161
|
-
import { useCallback as useCallback12 } from "react";
|
|
4162
|
-
var SCREEN_SHARE_OPTIONS = {
|
|
4163
|
-
video: { displaySurface: "browser" },
|
|
4164
|
-
resolution: ScreenSharePresets2.h720fps30.resolution,
|
|
4165
|
-
contentHint: "detail"
|
|
4166
|
-
};
|
|
4167
|
-
function useMediaControls() {
|
|
4168
|
-
const { localParticipant } = useLocalParticipant7();
|
|
4169
|
-
const isMuted = !localParticipant.isMicrophoneEnabled;
|
|
4170
|
-
const isScreenSharing = localParticipant.isScreenShareEnabled;
|
|
4171
|
-
const toggleMute = useCallback12(async () => {
|
|
4172
|
-
try {
|
|
4173
|
-
await localParticipant.setMicrophoneEnabled(isMuted);
|
|
4174
|
-
} catch (error) {
|
|
4175
|
-
console.error("Failed to toggle microphone:", error);
|
|
4176
|
-
}
|
|
4177
|
-
}, [localParticipant, isMuted]);
|
|
4178
|
-
const toggleScreenShare = useCallback12(async () => {
|
|
4179
|
-
try {
|
|
4180
|
-
await localParticipant.setScreenShareEnabled(!isScreenSharing, SCREEN_SHARE_OPTIONS);
|
|
4181
|
-
} catch (error) {
|
|
4182
|
-
console.error("Failed to toggle screen share:", error);
|
|
4183
|
-
}
|
|
4184
|
-
}, [localParticipant, isScreenSharing]);
|
|
4185
|
-
return { isMuted, toggleMute, isScreenSharing, toggleScreenShare };
|
|
4186
|
-
}
|
|
4187
|
-
|
|
4188
4349
|
// src/hooks/useMicLevel.ts
|
|
4189
4350
|
import { useLocalParticipant as useLocalParticipant8 } from "@livekit/components-react/hooks";
|
|
4190
4351
|
var MIC_BARS = 5;
|
|
@@ -4524,7 +4685,7 @@ function SessionControlBar() {
|
|
|
4524
4685
|
togglePause();
|
|
4525
4686
|
}
|
|
4526
4687
|
});
|
|
4527
|
-
const [pushToTalkHintSeen, setPushToTalkHintSeen] =
|
|
4688
|
+
const [pushToTalkHintSeen, setPushToTalkHintSeen] = useState15(false);
|
|
4528
4689
|
const startPushToTalk = useCallback13(() => {
|
|
4529
4690
|
start();
|
|
4530
4691
|
reportActivity();
|
|
@@ -4542,7 +4703,7 @@ function SessionControlBar() {
|
|
|
4542
4703
|
onCommit: commitPushToTalk,
|
|
4543
4704
|
onKeyUsed: dismissPushToTalkHint
|
|
4544
4705
|
});
|
|
4545
|
-
|
|
4706
|
+
useEffect22(() => {
|
|
4546
4707
|
if (isHeld)
|
|
4547
4708
|
minimizePanel();
|
|
4548
4709
|
}, [isHeld, minimizePanel]);
|
|
@@ -4795,8 +4956,29 @@ function SessionControlBar() {
|
|
|
4795
4956
|
}
|
|
4796
4957
|
|
|
4797
4958
|
// src/components/ShadowHost.tsx
|
|
4798
|
-
import { useLayoutEffect as useLayoutEffect2, useRef as
|
|
4959
|
+
import { useLayoutEffect as useLayoutEffect2, useRef as useRef16, useState as useState16 } from "react";
|
|
4799
4960
|
import { createPortal } from "react-dom";
|
|
4961
|
+
|
|
4962
|
+
// src/lib/brandForeground.ts
|
|
4963
|
+
var DARK_FOREGROUND = "#2d2b3d";
|
|
4964
|
+
var LIGHT_FOREGROUND = "#ffffff";
|
|
4965
|
+
var LUMINANCE_THRESHOLD = 0.179;
|
|
4966
|
+
var HEX_COLOR = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;
|
|
4967
|
+
function isHexColor(value) {
|
|
4968
|
+
return HEX_COLOR.test(value);
|
|
4969
|
+
}
|
|
4970
|
+
function linearChannel(hex, offset) {
|
|
4971
|
+
const channel = Number.parseInt(hex.slice(offset, offset + 2), 16) / 255;
|
|
4972
|
+
return channel <= 0.03928 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4;
|
|
4973
|
+
}
|
|
4974
|
+
function brandForeground(accentColor) {
|
|
4975
|
+
const hex = accentColor.replace("#", "");
|
|
4976
|
+
const fullHex = hex.length === 3 ? hex.split("").map((char) => char + char).join("") : hex;
|
|
4977
|
+
const luminance = 0.2126 * linearChannel(fullHex, 0) + 0.7152 * linearChannel(fullHex, 2) + 0.0722 * linearChannel(fullHex, 4);
|
|
4978
|
+
return luminance > LUMINANCE_THRESHOLD ? DARK_FOREGROUND : LIGHT_FOREGROUND;
|
|
4979
|
+
}
|
|
4980
|
+
|
|
4981
|
+
// src/components/ShadowHost.tsx
|
|
4800
4982
|
import { jsx as jsx13, Fragment as Fragment2 } from "react/jsx-runtime";
|
|
4801
4983
|
var PROPERTIES_STYLE_ID = "skippr-tw-properties";
|
|
4802
4984
|
var PROPERTY_RULE = /@property\s+[^{]+\{[^}]*\}/g;
|
|
@@ -4811,11 +4993,18 @@ function hoistTailwindProperties(css) {
|
|
|
4811
4993
|
}
|
|
4812
4994
|
return css.replace(PROPERTY_RULE, "");
|
|
4813
4995
|
}
|
|
4814
|
-
function ShadowHost({
|
|
4815
|
-
|
|
4816
|
-
|
|
4996
|
+
function ShadowHost({
|
|
4997
|
+
children,
|
|
4998
|
+
accentColor
|
|
4999
|
+
}) {
|
|
5000
|
+
const hostRef = useRef16(null);
|
|
5001
|
+
const [shadowRoot, setShadowRoot] = useState16(null);
|
|
4817
5002
|
const css = `/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
|
|
4818
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--skippr-font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--skippr-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--skippr-color-red-50:oklch(97.1% .013 17.38);--skippr-color-red-100:oklch(93.6% .032 17.717);--skippr-color-red-200:oklch(88.5% .062 18.334);--skippr-color-red-300:oklch(80.8% .114 19.571);--skippr-color-red-400:oklch(70.4% .191 22.216);--skippr-color-red-500:oklch(63.7% .237 25.331);--skippr-color-red-600:oklch(57.7% .245 27.325);--skippr-color-red-700:oklch(50.5% .213 27.518);--skippr-color-amber-50:oklch(98.7% .022 95.277);--skippr-color-amber-100:oklch(96.2% .059 95.617);--skippr-color-amber-400:oklch(82.8% .189 84.429);--skippr-color-amber-700:oklch(55.5% .163 48.998);--skippr-color-amber-950:oklch(27.9% .077 45.635);--skippr-color-emerald-400:oklch(76.5% .177 163.223);--skippr-color-neutral-100:oklch(97% 0 0);--skippr-color-neutral-200:oklch(92.2% 0 0);--skippr-color-neutral-500:oklch(55.6% 0 0);--skippr-color-neutral-700:oklch(37.1% 0 0);--skippr-color-black:#000;--skippr-color-white:#fff;--skippr-spacing:.25rem;--skippr-text-xs:.75rem;--skippr-text-xs--line-height:calc(1/.75);--skippr-text-sm:.875rem;--skippr-text-sm--line-height:calc(1.25/.875);--skippr-font-weight-medium:500;--skippr-font-weight-semibold:600;--skippr-leading-tight:1.25;--skippr-leading-snug:1.375;--skippr-leading-relaxed:1.625;--skippr-ease-out:cubic-bezier(0,0,.2,1);--skippr-ease-in-out:cubic-bezier(.4,0,.2,1);--skippr-animate-spin:spin 1s linear infinite;--skippr-animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--skippr-animate-bounce:bounce 1s infinite;--skippr-blur-sm:8px;--skippr-default-transition-duration:.15s;--skippr-default-transition-timing-function:cubic-bezier(.4,0,.2,1);--skippr-default-font-family:var(--skippr-font-sans);--skippr-default-mono-font-family:var(--skippr-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--skippr-default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--skippr-default-font-feature-settings,normal);font-variation-settings:var(--skippr-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--skippr-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--skippr-default-mono-font-feature-settings,normal);font-variation-settings:var(--skippr-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.skippr\\:pointer-events-none{pointer-events:none}.skippr\\:absolute{position:absolute}.skippr\\:fixed{position:fixed}.skippr\\:relative{position:relative}.skippr\\:sticky{position:sticky}.skippr\\:inset-0{inset:calc(var(--skippr-spacing)*0)}.skippr\\:inset-y-0{inset-block:calc(var(--skippr-spacing)*0)}.skippr\\:top-0{top:calc(var(--skippr-spacing)*0)}.skippr\\:top-1\\/2{top:50%}.skippr\\:top-full{top:100%}.skippr\\:-right-8{right:calc(var(--skippr-spacing)*-8)}.skippr\\:right-0{right:calc(var(--skippr-spacing)*0)}.skippr\\:right-3{right:calc(var(--skippr-spacing)*3)}.skippr\\:right-5{right:calc(var(--skippr-spacing)*5)}.skippr\\:right-6{right:calc(var(--skippr-spacing)*6)}.skippr\\:-bottom-1{bottom:calc(var(--skippr-spacing)*-1)}.skippr\\:-bottom-9{bottom:calc(var(--skippr-spacing)*-9)}.skippr\\:bottom-3{bottom:calc(var(--skippr-spacing)*3)}.skippr\\:bottom-20{bottom:calc(var(--skippr-spacing)*20)}.skippr\\:bottom-full{bottom:100%}.skippr\\:-left-8{left:calc(var(--skippr-spacing)*-8)}.skippr\\:left-0{left:calc(var(--skippr-spacing)*0)}.skippr\\:left-1\\/2{left:50%}.skippr\\:left-2{left:calc(var(--skippr-spacing)*2)}.skippr\\:left-3{left:calc(var(--skippr-spacing)*3)}.skippr\\:left-5{left:calc(var(--skippr-spacing)*5)}.skippr\\:left-6{left:calc(var(--skippr-spacing)*6)}.skippr\\:z-10{z-index:10}.skippr\\:z-20{z-index:20}.skippr\\:z-\\[9998\\]{z-index:9998}.skippr\\:z-\\[9999\\]{z-index:9999}.skippr\\:z-\\[10000\\]{z-index:10000}.skippr\\:order-first{order:-9999}.skippr\\:order-last{order:9999}.skippr\\:mx-auto{margin-inline:auto}.skippr\\:-mt-\\[5px\\]{margin-top:-5px}.skippr\\:-mt-\\[27px\\]{margin-top:-27px}.skippr\\:mt-0\\.5{margin-top:calc(var(--skippr-spacing)*.5)}.skippr\\:mt-1{margin-top:calc(var(--skippr-spacing)*1)}.skippr\\:mt-1\\.5{margin-top:calc(var(--skippr-spacing)*1.5)}.skippr\\:mt-2{margin-top:calc(var(--skippr-spacing)*2)}.skippr\\:mt-3{margin-top:calc(var(--skippr-spacing)*3)}.skippr\\:mt-3\\.5{margin-top:calc(var(--skippr-spacing)*3.5)}.skippr\\:mr-7{margin-right:calc(var(--skippr-spacing)*7)}.skippr\\:-mb-\\[5px\\]{margin-bottom:-5px}.skippr\\:mb-1\\.5{margin-bottom:calc(var(--skippr-spacing)*1.5)}.skippr\\:mb-2{margin-bottom:calc(var(--skippr-spacing)*2)}.skippr\\:mb-3{margin-bottom:calc(var(--skippr-spacing)*3)}.skippr\\:mb-4{margin-bottom:calc(var(--skippr-spacing)*4)}.skippr\\:ml-0\\.5{margin-left:calc(var(--skippr-spacing)*.5)}.skippr\\:ml-1{margin-left:calc(var(--skippr-spacing)*1)}.skippr\\:ml-7{margin-left:calc(var(--skippr-spacing)*7)}.skippr\\:flex{display:flex}.skippr\\:hidden{display:none}.skippr\\:inline-flex{display:inline-flex}.skippr\\:size-1{width:calc(var(--skippr-spacing)*1);height:calc(var(--skippr-spacing)*1)}.skippr\\:size-1\\.5{width:calc(var(--skippr-spacing)*1.5);height:calc(var(--skippr-spacing)*1.5)}.skippr\\:size-2{width:calc(var(--skippr-spacing)*2);height:calc(var(--skippr-spacing)*2)}.skippr\\:size-2\\.5{width:calc(var(--skippr-spacing)*2.5);height:calc(var(--skippr-spacing)*2.5)}.skippr\\:size-3{width:calc(var(--skippr-spacing)*3);height:calc(var(--skippr-spacing)*3)}.skippr\\:size-3\\.5{width:calc(var(--skippr-spacing)*3.5);height:calc(var(--skippr-spacing)*3.5)}.skippr\\:size-4{width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}.skippr\\:size-5{width:calc(var(--skippr-spacing)*5);height:calc(var(--skippr-spacing)*5)}.skippr\\:size-6{width:calc(var(--skippr-spacing)*6);height:calc(var(--skippr-spacing)*6)}.skippr\\:size-7{width:calc(var(--skippr-spacing)*7);height:calc(var(--skippr-spacing)*7)}.skippr\\:size-8{width:calc(var(--skippr-spacing)*8);height:calc(var(--skippr-spacing)*8)}.skippr\\:size-9{width:calc(var(--skippr-spacing)*9);height:calc(var(--skippr-spacing)*9)}.skippr\\:size-10{width:calc(var(--skippr-spacing)*10);height:calc(var(--skippr-spacing)*10)}.skippr\\:size-12{width:calc(var(--skippr-spacing)*12);height:calc(var(--skippr-spacing)*12)}.skippr\\:size-\\[5px\\]{width:5px;height:5px}.skippr\\:size-\\[38px\\]{width:38px;height:38px}.skippr\\:size-full{width:100%;height:100%}.skippr\\:h-0{height:calc(var(--skippr-spacing)*0)}.skippr\\:h-0\\.5{height:calc(var(--skippr-spacing)*.5)}.skippr\\:h-1{height:calc(var(--skippr-spacing)*1)}.skippr\\:h-1\\.5{height:calc(var(--skippr-spacing)*1.5)}.skippr\\:h-2{height:calc(var(--skippr-spacing)*2)}.skippr\\:h-3{height:calc(var(--skippr-spacing)*3)}.skippr\\:h-3\\.5{height:calc(var(--skippr-spacing)*3.5)}.skippr\\:h-4{height:calc(var(--skippr-spacing)*4)}.skippr\\:h-5{height:calc(var(--skippr-spacing)*5)}.skippr\\:h-6{height:calc(var(--skippr-spacing)*6)}.skippr\\:h-7{height:calc(var(--skippr-spacing)*7)}.skippr\\:h-8{height:calc(var(--skippr-spacing)*8)}.skippr\\:h-9{height:calc(var(--skippr-spacing)*9)}.skippr\\:h-10{height:calc(var(--skippr-spacing)*10)}.skippr\\:h-\\[18\\.5px\\]{height:18.5px}.skippr\\:h-\\[36px\\]{height:36px}.skippr\\:h-\\[38px\\]{height:38px}.skippr\\:h-\\[48px\\]{height:48px}.skippr\\:h-\\[54px\\]{height:54px}.skippr\\:h-full{height:100%}.skippr\\:min-h-0{min-height:calc(var(--skippr-spacing)*0)}.skippr\\:min-h-11{min-height:calc(var(--skippr-spacing)*11)}.skippr\\:w-0{width:calc(var(--skippr-spacing)*0)}.skippr\\:w-3\\.5{width:calc(var(--skippr-spacing)*3.5)}.skippr\\:w-4{width:calc(var(--skippr-spacing)*4)}.skippr\\:w-5{width:calc(var(--skippr-spacing)*5)}.skippr\\:w-6{width:calc(var(--skippr-spacing)*6)}.skippr\\:w-7{width:calc(var(--skippr-spacing)*7)}.skippr\\:w-8{width:calc(var(--skippr-spacing)*8)}.skippr\\:w-10{width:calc(var(--skippr-spacing)*10)}.skippr\\:w-40{width:calc(var(--skippr-spacing)*40)}.skippr\\:w-\\[2px\\]{width:2px}.skippr\\:w-\\[3px\\]{width:3px}.skippr\\:w-\\[15\\.4px\\]{width:15.4px}.skippr\\:w-\\[36px\\]{width:36px}.skippr\\:w-\\[38px\\]{width:38px}.skippr\\:w-\\[50px\\]{width:50px}.skippr\\:w-fit{width:fit-content}.skippr\\:w-full{width:100%}.skippr\\:max-w-64{max-width:calc(var(--skippr-spacing)*64)}.skippr\\:max-w-72{max-width:calc(var(--skippr-spacing)*72)}.skippr\\:max-w-\\[80\\%\\]{max-width:80%}.skippr\\:max-w-\\[280px\\]{max-width:280px}.skippr\\:min-w-0{min-width:calc(var(--skippr-spacing)*0)}.skippr\\:min-w-11{min-width:calc(var(--skippr-spacing)*11)}.skippr\\:flex-1{flex:1}.skippr\\:shrink-0{flex-shrink:0}.skippr\\:origin-bottom-left{transform-origin:0 100%}.skippr\\:origin-bottom-right{transform-origin:100% 100%}.skippr\\:origin-center{transform-origin:50%}.skippr\\:origin-left{transform-origin:0}.skippr\\:origin-right{transform-origin:100%}.skippr\\:origin-top-left{transform-origin:0 0}.skippr\\:origin-top-right{transform-origin:100% 0}.skippr\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-x-3{--tw-translate-x:calc(var(--skippr-spacing)*-3);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-x-7{--tw-translate-x:calc(var(--skippr-spacing)*-7);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:translate-x-3{--tw-translate-x:calc(var(--skippr-spacing)*3);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:translate-x-7{--tw-translate-x:calc(var(--skippr-spacing)*7);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-\\[0\\.94\\]{scale:.94}.skippr\\:-rotate-90{rotate:-90deg}.skippr\\:rotate-45{rotate:45deg}.skippr\\:rotate-\\[225deg\\]{rotate:225deg}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out\\]{animation:.2s ease-out skippr-agent-in}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out_240ms_both\\]{animation:.2s ease-out .24s both skippr-agent-in}.skippr\\:\\[animation\\:skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:\\[animation\\:skippr-finger-tap_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-finger-tap}.skippr\\:\\[animation\\:skippr-orb-in_320ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)\\]{animation:.32s cubic-bezier(.34,1.3,.64,1) skippr-orb-in}.skippr\\:\\[animation\\:skippr-stage-fade_240ms_ease-out\\]{animation:.24s ease-out skippr-stage-fade}.skippr\\:\\[animation\\:skippr-tip-in_360ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)_backwards\\]{animation:.36s cubic-bezier(.34,1.3,.64,1) backwards skippr-tip-in}.skippr\\:\\[animation\\:skippr-toolset-pop_280ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.28s cubic-bezier(.22,1,.36,1) skippr-toolset-pop}.skippr\\:\\[animation\\:skippr-toolset-pop_440ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.44s cubic-bezier(.22,1,.36,1) skippr-toolset-pop}.skippr\\:animate-\\[skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:animate-\\[skippr-bubble-in_0\\.28s_ease-out\\]{animation:.28s ease-out skippr-bubble-in}.skippr\\:animate-\\[skippr-fade-in_0\\.3s_ease-out\\]{animation:.3s ease-out skippr-fade-in}.skippr\\:animate-\\[skippr-pill-content_0\\.22s_ease-out\\]{animation:.22s ease-out skippr-pill-content}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.3s_infinite\\]{animation:1.1s ease-in-out .3s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.6s_infinite\\]{animation:1.1s ease-in-out .6s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.15s_infinite\\]{animation:1.1s ease-in-out .15s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.45s_infinite\\]{animation:1.1s ease-in-out .45s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-speak}.skippr\\:animate-bounce{animation:var(--skippr-animate-bounce)}.skippr\\:animate-ping{animation:var(--skippr-animate-ping)}.skippr\\:animate-skippr-annotation-pulse{animation:1.8s ease-in-out infinite skippr-annotation-pulse}.skippr\\:animate-skippr-click-ping{animation:.5s ease-out forwards skippr-click-ping}.skippr\\:animate-skippr-cursor-pop{animation:.22s ease-out skippr-cursor-pop}.skippr\\:animate-skippr-press{animation:.5s ease-in-out skippr-press}.skippr\\:animate-skippr-ptt-transmit{animation:1.4s ease-out infinite skippr-ptt-transmit}.skippr\\:animate-skippr-rec-ring{animation:2s ease-out infinite skippr-rec-ring}.skippr\\:animate-skippr-tab-fade{animation:.2s ease-out skippr-tab-fade}.skippr\\:animate-skippr-thinking-dot{animation:1.2s ease-in-out infinite skippr-thinking-dot}.skippr\\:animate-spin{animation:var(--skippr-animate-spin)}.skippr\\:cursor-default{cursor:default}.skippr\\:cursor-grab{cursor:grab}.skippr\\:cursor-not-allowed{cursor:not-allowed}.skippr\\:cursor-pointer{cursor:pointer}.skippr\\:touch-none{touch-action:none}.skippr\\:resize-none{resize:none}.skippr\\:flex-col{flex-direction:column}.skippr\\:flex-col-reverse{flex-direction:column-reverse}.skippr\\:items-center{align-items:center}.skippr\\:items-end{align-items:flex-end}.skippr\\:items-start{align-items:flex-start}.skippr\\:justify-between{justify-content:space-between}.skippr\\:justify-center{justify-content:center}.skippr\\:justify-end{justify-content:flex-end}.skippr\\:justify-start{justify-content:flex-start}.skippr\\:gap-0\\.5{gap:calc(var(--skippr-spacing)*.5)}.skippr\\:gap-1{gap:calc(var(--skippr-spacing)*1)}.skippr\\:gap-1\\.5{gap:calc(var(--skippr-spacing)*1.5)}.skippr\\:gap-2{gap:calc(var(--skippr-spacing)*2)}.skippr\\:gap-2\\.5{gap:calc(var(--skippr-spacing)*2.5)}.skippr\\:gap-3{gap:calc(var(--skippr-spacing)*3)}.skippr\\:gap-\\[2px\\]{gap:2px}.skippr\\:gap-\\[3px\\]{gap:3px}:where(.skippr\\:space-y-0\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}.skippr\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.skippr\\:overflow-hidden{overflow:hidden}.skippr\\:overflow-y-auto{overflow-y:auto}.skippr\\:rounded{border-radius:.25rem}.skippr\\:rounded-2xl{border-radius:1.125rem}.skippr\\:rounded-\\[1rem\\]{border-radius:1rem}.skippr\\:rounded-\\[10px\\]{border-radius:10px}.skippr\\:rounded-\\[11px\\]{border-radius:11px}.skippr\\:rounded-\\[12px\\]{border-radius:12px}.skippr\\:rounded-\\[14px\\]{border-radius:14px}.skippr\\:rounded-\\[16px\\]{border-radius:16px}.skippr\\:rounded-\\[20px\\]{border-radius:20px}.skippr\\:rounded-full{border-radius:3.40282e38px}.skippr\\:rounded-lg{border-radius:.625rem}.skippr\\:rounded-md{border-radius:.5rem}.skippr\\:rounded-sm{border-radius:.375rem}.skippr\\:rounded-xl{border-radius:.875rem}.skippr\\:rounded-l-\\[18px\\]{border-top-left-radius:18px;border-bottom-left-radius:18px}.skippr\\:rounded-tl-md{border-top-left-radius:.5rem}.skippr\\:rounded-r-\\[18px\\]{border-top-right-radius:18px;border-bottom-right-radius:18px}.skippr\\:border{border-style:var(--tw-border-style);border-width:1px}.skippr\\:border-0{border-style:var(--tw-border-style);border-width:0}.skippr\\:border-2{border-style:var(--tw-border-style);border-width:2px}.skippr\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.skippr\\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.skippr\\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.skippr\\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.skippr\\:border-\\[\\#2bc0ae\\]{border-color:#2bc0ae}.skippr\\:border-black\\/25{border-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-black\\/25{border-color:color-mix(in oklab,var(--skippr-color-black)25%,transparent)}}.skippr\\:border-border,.skippr\\:border-input{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-primary\\/20{border-color:oklab(29.9244% .0107414 -.0305411/.2)}.skippr\\:border-r-border{border-right-color:oklch(92.3% .003 48.717)}.skippr\\:border-l-border{border-left-color:oklch(92.3% .003 48.717)}.skippr\\:bg-\\[\\#2bc0ae\\]{background-color:#2bc0ae}.skippr\\:bg-\\[\\#2bc0ae\\]\\/50{background-color:oklab(72.9347% -.121518 -.00545585/.5)}.skippr\\:bg-\\[\\#f4ecd8\\]{background-color:#f4ecd8}.skippr\\:bg-amber-50{background-color:var(--skippr-color-amber-50)}.skippr\\:bg-amber-400{background-color:var(--skippr-color-amber-400)}.skippr\\:bg-background{background-color:oklch(100% 0 0)}.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:color-mix(in oklab,var(--skippr-color-black)7.0%,transparent)}}.skippr\\:bg-bubble{background-color:#2d2b3d}.skippr\\:bg-bubble\\/95{background-color:oklab(29.9244% .0107414 -.0305411/.95)}.skippr\\:bg-card{background-color:oklch(100% 0 0)}.skippr\\:bg-current{background-color:currentColor}.skippr\\:bg-destructive{background-color:#d94f4f}.skippr\\:bg-emerald-400{background-color:var(--skippr-color-emerald-400)}.skippr\\:bg-foreground{background-color:oklch(14.7% .004 49.25)}.skippr\\:bg-launcher{background-color:#2d2d3f}.skippr\\:bg-muted-foreground\\/20{background-color:oklab(55.3% .00687528 .0110332/.2)}.skippr\\:bg-muted-foreground\\/40{background-color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:bg-muted\\/50{background-color:oklab(97% -.000282743 .000959196/.5)}.skippr\\:bg-neutral-100{background-color:var(--skippr-color-neutral-100)}.skippr\\:bg-primary{background-color:#2d2b3d}.skippr\\:bg-primary-foreground\\/20{background-color:oklab(100% 0 5.96046e-8/.2)}.skippr\\:bg-primary\\/10{background-color:oklab(29.9244% .0107414 -.0305411/.1)}.skippr\\:bg-red-50{background-color:var(--skippr-color-red-50)}.skippr\\:bg-red-100{background-color:var(--skippr-color-red-100)}.skippr\\:bg-red-400{background-color:var(--skippr-color-red-400)}.skippr\\:bg-red-500{background-color:var(--skippr-color-red-500)}.skippr\\:bg-secondary{background-color:#ffdfb5}.skippr\\:bg-transparent{background-color:#0000}.skippr\\:bg-white,.skippr\\:bg-white\\/15{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/15{background-color:color-mix(in oklab,var(--skippr-color-white)15%,transparent)}}.skippr\\:bg-white\\/70{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/70{background-color:color-mix(in oklab,var(--skippr-color-white)70%,transparent)}}.skippr\\:fill-brand{fill:#2bc0ae}.skippr\\:fill-primary\\/30{fill:oklab(29.9244% .0107414 -.0305411/.3)}.skippr\\:stroke-black\\/15{stroke:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:stroke-black\\/15{stroke:color-mix(in oklab,var(--skippr-color-black)15%,transparent)}}.skippr\\:stroke-bubble{stroke:#2d2b3d}.skippr\\:p-0{padding:calc(var(--skippr-spacing)*0)}.skippr\\:p-0\\.5{padding:calc(var(--skippr-spacing)*.5)}.skippr\\:p-1\\.5{padding:calc(var(--skippr-spacing)*1.5)}.skippr\\:p-2{padding:calc(var(--skippr-spacing)*2)}.skippr\\:p-3{padding:calc(var(--skippr-spacing)*3)}.skippr\\:p-3\\.5{padding:calc(var(--skippr-spacing)*3.5)}.skippr\\:p-4{padding:calc(var(--skippr-spacing)*4)}.skippr\\:px-1{padding-inline:calc(var(--skippr-spacing)*1)}.skippr\\:px-1\\.5{padding-inline:calc(var(--skippr-spacing)*1.5)}.skippr\\:px-2{padding-inline:calc(var(--skippr-spacing)*2)}.skippr\\:px-2\\.5{padding-inline:calc(var(--skippr-spacing)*2.5)}.skippr\\:px-3{padding-inline:calc(var(--skippr-spacing)*3)}.skippr\\:px-3\\.5{padding-inline:calc(var(--skippr-spacing)*3.5)}.skippr\\:px-4{padding-inline:calc(var(--skippr-spacing)*4)}.skippr\\:px-6{padding-inline:calc(var(--skippr-spacing)*6)}.skippr\\:px-8{padding-inline:calc(var(--skippr-spacing)*8)}.skippr\\:py-0\\.5{padding-block:calc(var(--skippr-spacing)*.5)}.skippr\\:py-1{padding-block:calc(var(--skippr-spacing)*1)}.skippr\\:py-1\\.5{padding-block:calc(var(--skippr-spacing)*1.5)}.skippr\\:py-2{padding-block:calc(var(--skippr-spacing)*2)}.skippr\\:py-2\\.5{padding-block:calc(var(--skippr-spacing)*2.5)}.skippr\\:py-3{padding-block:calc(var(--skippr-spacing)*3)}.skippr\\:py-4{padding-block:calc(var(--skippr-spacing)*4)}.skippr\\:py-6{padding-block:calc(var(--skippr-spacing)*6)}.skippr\\:pt-1\\.5{padding-top:calc(var(--skippr-spacing)*1.5)}.skippr\\:pr-2\\.5{padding-right:calc(var(--skippr-spacing)*2.5)}.skippr\\:pr-3{padding-right:calc(var(--skippr-spacing)*3)}.skippr\\:pb-2{padding-bottom:calc(var(--skippr-spacing)*2)}.skippr\\:pl-1\\.5{padding-left:calc(var(--skippr-spacing)*1.5)}.skippr\\:pl-2\\.5{padding-left:calc(var(--skippr-spacing)*2.5)}.skippr\\:pl-3\\.5{padding-left:calc(var(--skippr-spacing)*3.5)}.skippr\\:text-center{text-align:center}.skippr\\:text-left{text-align:left}.skippr\\:font-mono{font-family:var(--skippr-font-mono)}.skippr\\:text-sm{font-size:var(--skippr-text-sm);line-height:var(--tw-leading,var(--skippr-text-sm--line-height))}.skippr\\:text-xs{font-size:var(--skippr-text-xs);line-height:var(--tw-leading,var(--skippr-text-xs--line-height))}.skippr\\:text-\\[10px\\]{font-size:10px}.skippr\\:text-\\[11px\\]{font-size:11px}.skippr\\:text-\\[13px\\]{font-size:13px}.skippr\\:leading-5{--tw-leading:calc(var(--skippr-spacing)*5);line-height:calc(var(--skippr-spacing)*5)}.skippr\\:leading-none{--tw-leading:1;line-height:1}.skippr\\:leading-relaxed{--tw-leading:var(--skippr-leading-relaxed);line-height:var(--skippr-leading-relaxed)}.skippr\\:leading-snug{--tw-leading:var(--skippr-leading-snug);line-height:var(--skippr-leading-snug)}.skippr\\:leading-tight{--tw-leading:var(--skippr-leading-tight);line-height:var(--skippr-leading-tight)}.skippr\\:font-medium{--tw-font-weight:var(--skippr-font-weight-medium);font-weight:var(--skippr-font-weight-medium)}.skippr\\:font-semibold{--tw-font-weight:var(--skippr-font-weight-semibold);font-weight:var(--skippr-font-weight-semibold)}.skippr\\:whitespace-nowrap{white-space:nowrap}.skippr\\:text-\\[\\#2bc0ae\\]{color:#2bc0ae}.skippr\\:text-amber-700{color:var(--skippr-color-amber-700)}.skippr\\:text-amber-950{color:var(--skippr-color-amber-950)}.skippr\\:text-background{color:oklch(100% 0 0)}.skippr\\:text-black,.skippr\\:text-black\\/40{color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-black\\/40{color:color-mix(in oklab,var(--skippr-color-black)40%,transparent)}}.skippr\\:text-brand{color:#2bc0ae}.skippr\\:text-bubble{color:#2d2b3d}.skippr\\:text-chart-3{color:oklch(66.6% .179 58.318)}.skippr\\:text-destructive{color:#d94f4f}.skippr\\:text-foreground{color:oklch(14.7% .004 49.25)}.skippr\\:text-muted-foreground{color:oklch(55.3% .013 58.071)}.skippr\\:text-muted-foreground\\/30{color:oklab(55.3% .00687528 .0110332/.3)}.skippr\\:text-muted-foreground\\/40{color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:text-muted-foreground\\/60{color:oklab(55.3% .00687528 .0110332/.6)}.skippr\\:text-muted-foreground\\/70{color:oklab(55.3% .00687528 .0110332/.7)}.skippr\\:text-neutral-500{color:var(--skippr-color-neutral-500)}.skippr\\:text-neutral-700{color:var(--skippr-color-neutral-700)}.skippr\\:text-primary{color:#2d2b3d}.skippr\\:text-primary-foreground{color:#fff}.skippr\\:text-primary-foreground\\/70{color:oklab(100% 0 5.96046e-8/.7)}.skippr\\:text-red-400{color:var(--skippr-color-red-400)}.skippr\\:text-red-600{color:var(--skippr-color-red-600)}.skippr\\:text-red-700{color:var(--skippr-color-red-700)}.skippr\\:text-secondary-foreground{color:#613700}.skippr\\:text-white,.skippr\\:text-white\\/60{color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-white\\/60{color:color-mix(in oklab,var(--skippr-color-white)60%,transparent)}}.skippr\\:capitalize{text-transform:capitalize}.skippr\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.skippr\\:line-through{text-decoration-line:line-through}.skippr\\:placeholder-muted-foreground::placeholder{color:oklch(55.3% .013 58.071)}.skippr\\:opacity-0{opacity:0}.skippr\\:opacity-40{opacity:.4}.skippr\\:opacity-75{opacity:.75}.skippr\\:opacity-100{opacity:1}.skippr\\:shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[-6px_8px_30px_rgba\\(15\\,18\\,26\\,0\\.32\\)\\]{--tw-shadow:-6px 8px 30px var(--tw-shadow-color,#0f121a52);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_2px_6px_rgba\\(0\\,0\\,0\\,0\\.28\\)\\]{--tw-shadow:0 2px 6px var(--tw-shadow-color,#00000047);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_12px_rgba\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow:0 4px 12px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_14px_rgba\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_14px_rgba\\(239\\,68\\,68\\,0\\.45\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#ef444473);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_16px_rgba\\(45\\,43\\,61\\,0\\.45\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#2d2b3d73),0 2px 4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(45\\,43\\,61\\,0\\.35\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#2d2b3d59);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_30px_rgba\\(0\\,0\\,0\\,0\\.16\\)\\,0_4px_12px_rgba\\(0\\,0\\,0\\,0\\.08\\)\\]{--tw-shadow:0 8px 30px var(--tw-shadow-color,#00000029),0 4px 12px var(--tw-shadow-color,#00000014);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_32px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 10px 32px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-black\\/5{--tw-ring-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-black\\/5{--tw-ring-color:color-mix(in oklab,var(--skippr-color-black)5%,transparent)}}.skippr\\:ring-brand{--tw-ring-color:#2bc0ae}.skippr\\:ring-foreground\\/10{--tw-ring-color:oklab(14.7% .00261104 .00303026/.1)}.skippr\\:ring-white\\/15{--tw-ring-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-white\\/15{--tw-ring-color:color-mix(in oklab,var(--skippr-color-white)15%,transparent)}}.skippr\\:ring-white\\/30{--tw-ring-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-white\\/30{--tw-ring-color:color-mix(in oklab,var(--skippr-color-white)30%,transparent)}}.skippr\\:ring-offset-background{--tw-ring-offset-color:oklch(100% 0 0)}.skippr\\:drop-shadow-\\[0_2px_5px_rgba\\(0\\,0\\,0\\,0\\.4\\)\\]{--tw-drop-shadow-size:drop-shadow(0 2px 5px var(--tw-drop-shadow-color,#0006));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.skippr\\:backdrop-blur-sm{--tw-backdrop-blur:blur(var(--skippr-blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.skippr\\:transition-\\[height\\]{transition-property:height;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[opacity\\,transform\\,height\\]{transition-property:opacity,transform,height;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\,margin\\]{transition-property:width,margin;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:duration-75{--tw-duration:75ms;transition-duration:75ms}.skippr\\:duration-100{--tw-duration:.1s;transition-duration:.1s}.skippr\\:duration-150{--tw-duration:.15s;transition-duration:.15s}.skippr\\:duration-200{--tw-duration:.2s;transition-duration:.2s}.skippr\\:duration-300{--tw-duration:.3s;transition-duration:.3s}.skippr\\:duration-\\[400ms\\]{--tw-duration:.4s;transition-duration:.4s}.skippr\\:ease-\\[cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{--tw-ease:cubic-bezier(.22,1,.36,1);transition-timing-function:cubic-bezier(.22,1,.36,1)}.skippr\\:ease-\\[cubic-bezier\\(0\\.34\\,1\\.56\\,0\\.64\\,1\\)\\]{--tw-ease:cubic-bezier(.34,1.56,.64,1);transition-timing-function:cubic-bezier(.34,1.56,.64,1)}.skippr\\:ease-in-out{--tw-ease:var(--skippr-ease-in-out);transition-timing-function:var(--skippr-ease-in-out)}.skippr\\:ease-out{--tw-ease:var(--skippr-ease-out);transition-timing-function:var(--skippr-ease-out)}.skippr\\:outline-none{--tw-outline-style:none;outline-style:none}.skippr\\:select-none{-webkit-user-select:none;user-select:none}.skippr\\:\\[animation-delay\\:0ms\\]{animation-delay:0s}.skippr\\:\\[animation-delay\\:150ms\\]{animation-delay:.15s}.skippr\\:\\[animation-delay\\:200ms\\]{animation-delay:.2s}.skippr\\:\\[animation-delay\\:300ms\\]{animation-delay:.3s}.skippr\\:\\[animation-delay\\:400ms\\]{animation-delay:.4s}.skippr\\:\\[overflow-anchor\\:none\\]{overflow-anchor:none}.skippr\\:group-focus-within\\:scale-100:is(:where(.skippr\\:group):focus-within *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-focus-within\\:opacity-100:is(:where(.skippr\\:group):focus-within *){opacity:1}@media (hover:hover){.skippr\\:group-hover\\:scale-100:is(:where(.skippr\\:group):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-hover\\:text-red-300:is(:where(.skippr\\:group):hover *){color:var(--skippr-color-red-300)}.skippr\\:group-hover\\:text-white\\/80:is(:where(.skippr\\:group):hover *){color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:group-hover\\:text-white\\/80:is(:where(.skippr\\:group):hover *){color:color-mix(in oklab,var(--skippr-color-white)80%,transparent)}}.skippr\\:group-hover\\:opacity-100:is(:where(.skippr\\:group):hover *){opacity:1}}.skippr\\:placeholder\\:text-muted-foreground::placeholder{color:oklch(55.3% .013 58.071)}@media (hover:hover){.skippr\\:hover\\:-translate-y-0\\.5:hover{--tw-translate-y:calc(var(--skippr-spacing)*-.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:hover\\:bg-\\[\\#3a384b\\]:hover{background-color:#3a384b}.skippr\\:hover\\:bg-accent:hover{background-color:#e7e5e4}.skippr\\:hover\\:bg-amber-100:hover{background-color:var(--skippr-color-amber-100)}.skippr\\:hover\\:bg-bubble:hover{background-color:#2d2b3d}.skippr\\:hover\\:bg-destructive\\/90:hover{background-color:oklab(61.4357% .15892 .0698893/.9)}.skippr\\:hover\\:bg-muted:hover{background-color:oklch(97% .001 106.424)}.skippr\\:hover\\:bg-neutral-100:hover{background-color:var(--skippr-color-neutral-100)}.skippr\\:hover\\:bg-neutral-200:hover{background-color:var(--skippr-color-neutral-200)}.skippr\\:hover\\:bg-primary\\/90:hover{background-color:oklab(29.9244% .0107414 -.0305411/.9)}.skippr\\:hover\\:bg-red-200:hover{background-color:var(--skippr-color-red-200)}.skippr\\:hover\\:bg-red-600:hover{background-color:var(--skippr-color-red-600)}.skippr\\:hover\\:bg-secondary\\/80:hover{background-color:oklab(91.9963% .0175391 .0626889/.8)}.skippr\\:hover\\:bg-white\\/10:hover{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:hover\\:bg-white\\/10:hover{background-color:color-mix(in oklab,var(--skippr-color-white)10%,transparent)}}.skippr\\:hover\\:text-accent-foreground:hover{color:oklch(21.6% .006 56.043)}.skippr\\:hover\\:text-foreground:hover{color:oklch(14.7% .004 49.25)}.skippr\\:hover\\:text-primary-foreground:hover{color:#fff}.skippr\\:hover\\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}}.skippr\\:focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:focus-visible\\:ring-brand:focus-visible{--tw-ring-color:#2bc0ae}.skippr\\:focus-visible\\:ring-bubble\\/60:focus-visible{--tw-ring-color:oklab(29.9244% .0107414 -.0305411/.6)}.skippr\\:focus-visible\\:ring-ring:focus-visible{--tw-ring-color:oklch(70.9% .01 56.259)}.skippr\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.skippr\\:focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.skippr\\:active\\:translate-y-0:active{--tw-translate-y:calc(var(--skippr-spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.skippr\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.skippr\\:disabled\\:opacity-50:disabled{opacity:.5}.skippr\\:disabled\\:opacity-60:disabled{opacity:.6}@media (prefers-reduced-motion:reduce){.skippr\\:motion-reduce\\:hidden{display:none}.skippr\\:motion-reduce\\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:motion-reduce\\:animate-none{animation:none}}.skippr\\:\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.skippr\\:\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.skippr\\:\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}}@keyframes skippr-tap{0%{transform:scale(1)}45%{transform:scale(.7)}to{transform:scale(1)}}@keyframes skippr-press{0%{transform:scale(1)}55%{transform:scale(1)}85%{transform:scale(.68)}to{transform:scale(1)}}@keyframes skippr-cursor-pop{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}@keyframes skippr-click-ping{0%{opacity:.9;transform:translate(-50%,-50%)scale(.4)}to{opacity:0;transform:translate(-50%,-50%)scale(2.4)}}@keyframes skippr-tab-fade{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-speak{0%,to{opacity:.6;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-thinking-dot{0%,80%,to{opacity:.2;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}@keyframes skippr-pulse-ring{0%,to{box-shadow:0 0 #2d2b3d66}50%{box-shadow:0 0 0 10px #2d2b3d00}}@keyframes skippr-rec-ring{0%{box-shadow:0 0 #2bc0ae8c}70%{box-shadow:0 0 0 11px #2bc0ae00}to{box-shadow:0 0 #2bc0ae00}}@keyframes skippr-ptt-transmit{0%{box-shadow:0 0 #2bc0ae99,0 0 #2bc0ae59}70%{box-shadow:0 0 0 9px #2bc0ae00,0 0 0 16px #2bc0ae00}to{box-shadow:0 0 #2bc0ae00,0 0 #2bc0ae00}}@keyframes skippr-annotation-pulse{0%,to{box-shadow:0 0 #2bc0ae80}50%{box-shadow:0 0 0 6px #2bc0ae00}}@keyframes skippr-speak-ripple{0%{opacity:.6;transform:scale(1)}to{opacity:0;transform:scale(1.8)}}@keyframes skippr-bar{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}@keyframes skippr-breathe{0%,to{opacity:.85;transform:scale(1)}50%{opacity:1;transform:scale(1.08)}}@keyframes skippr-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-wave{0%,to{opacity:.4;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-bubble-in{0%{opacity:0;transform:translateY(12px)scale(.96)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-tip-in{0%{opacity:0;transform:translateY(14px)scale(.96)}60%{opacity:1;transform:translateY(-2px)scale(1.01)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-pill-content{0%{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}@keyframes skippr-banner-look{0%,to{transform:translate(0)}25%{transform:translate(-2px)}75%{transform:translate(2px)}}@keyframes skippr-finger-tap{0%,to{transform:translateY(0)rotate(0)}50%{transform:translateY(2px)rotate(-6deg)}}@keyframes skippr-toolset-pop{0%{opacity:0;transform:scale(.85)}to{opacity:1;transform:scale(1)}}@keyframes skippr-stage-fade{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}@keyframes skippr-agent-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}@keyframes skippr-orb-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}.skippr-no-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.skippr-no-scrollbar::-webkit-scrollbar{display:none}:host{color:var(--color-foreground)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}`;
|
|
5003
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--skippr-font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--skippr-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--skippr-color-red-50:oklch(97.1% .013 17.38);--skippr-color-red-100:oklch(93.6% .032 17.717);--skippr-color-red-200:oklch(88.5% .062 18.334);--skippr-color-red-300:oklch(80.8% .114 19.571);--skippr-color-red-400:oklch(70.4% .191 22.216);--skippr-color-red-500:oklch(63.7% .237 25.331);--skippr-color-red-600:oklch(57.7% .245 27.325);--skippr-color-red-700:oklch(50.5% .213 27.518);--skippr-color-amber-50:oklch(98.7% .022 95.277);--skippr-color-amber-100:oklch(96.2% .059 95.617);--skippr-color-amber-400:oklch(82.8% .189 84.429);--skippr-color-amber-700:oklch(55.5% .163 48.998);--skippr-color-amber-950:oklch(27.9% .077 45.635);--skippr-color-emerald-400:oklch(76.5% .177 163.223);--skippr-color-neutral-100:oklch(97% 0 0);--skippr-color-neutral-200:oklch(92.2% 0 0);--skippr-color-neutral-500:oklch(55.6% 0 0);--skippr-color-neutral-700:oklch(37.1% 0 0);--skippr-color-black:#000;--skippr-color-white:#fff;--skippr-spacing:.25rem;--skippr-text-xs:.75rem;--skippr-text-xs--line-height:calc(1/.75);--skippr-text-sm:.875rem;--skippr-text-sm--line-height:calc(1.25/.875);--skippr-font-weight-medium:500;--skippr-font-weight-semibold:600;--skippr-leading-tight:1.25;--skippr-leading-snug:1.375;--skippr-leading-relaxed:1.625;--skippr-ease-out:cubic-bezier(0,0,.2,1);--skippr-ease-in-out:cubic-bezier(.4,0,.2,1);--skippr-animate-spin:spin 1s linear infinite;--skippr-animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--skippr-animate-bounce:bounce 1s infinite;--skippr-blur-sm:8px;--skippr-default-transition-duration:.15s;--skippr-default-transition-timing-function:cubic-bezier(.4,0,.2,1);--skippr-default-font-family:var(--skippr-font-sans);--skippr-default-mono-font-family:var(--skippr-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--skippr-default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--skippr-default-font-feature-settings,normal);font-variation-settings:var(--skippr-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--skippr-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--skippr-default-mono-font-feature-settings,normal);font-variation-settings:var(--skippr-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.skippr\\:pointer-events-none{pointer-events:none}.skippr\\:absolute{position:absolute}.skippr\\:fixed{position:fixed}.skippr\\:relative{position:relative}.skippr\\:sticky{position:sticky}.skippr\\:inset-0{inset:calc(var(--skippr-spacing)*0)}.skippr\\:inset-y-0{inset-block:calc(var(--skippr-spacing)*0)}.skippr\\:top-0{top:calc(var(--skippr-spacing)*0)}.skippr\\:top-1\\/2{top:50%}.skippr\\:top-full{top:100%}.skippr\\:-right-8{right:calc(var(--skippr-spacing)*-8)}.skippr\\:right-0{right:calc(var(--skippr-spacing)*0)}.skippr\\:right-3{right:calc(var(--skippr-spacing)*3)}.skippr\\:right-5{right:calc(var(--skippr-spacing)*5)}.skippr\\:right-6{right:calc(var(--skippr-spacing)*6)}.skippr\\:-bottom-1{bottom:calc(var(--skippr-spacing)*-1)}.skippr\\:-bottom-9{bottom:calc(var(--skippr-spacing)*-9)}.skippr\\:bottom-3{bottom:calc(var(--skippr-spacing)*3)}.skippr\\:bottom-20{bottom:calc(var(--skippr-spacing)*20)}.skippr\\:bottom-full{bottom:100%}.skippr\\:-left-8{left:calc(var(--skippr-spacing)*-8)}.skippr\\:left-0{left:calc(var(--skippr-spacing)*0)}.skippr\\:left-1\\/2{left:50%}.skippr\\:left-2{left:calc(var(--skippr-spacing)*2)}.skippr\\:left-3{left:calc(var(--skippr-spacing)*3)}.skippr\\:left-5{left:calc(var(--skippr-spacing)*5)}.skippr\\:left-6{left:calc(var(--skippr-spacing)*6)}.skippr\\:z-10{z-index:10}.skippr\\:z-20{z-index:20}.skippr\\:z-\\[9998\\]{z-index:9998}.skippr\\:z-\\[9999\\]{z-index:9999}.skippr\\:z-\\[10000\\]{z-index:10000}.skippr\\:order-first{order:-9999}.skippr\\:order-last{order:9999}.skippr\\:mx-auto{margin-inline:auto}.skippr\\:-mt-\\[5px\\]{margin-top:-5px}.skippr\\:-mt-\\[27px\\]{margin-top:-27px}.skippr\\:mt-0\\.5{margin-top:calc(var(--skippr-spacing)*.5)}.skippr\\:mt-1{margin-top:calc(var(--skippr-spacing)*1)}.skippr\\:mt-1\\.5{margin-top:calc(var(--skippr-spacing)*1.5)}.skippr\\:mt-2{margin-top:calc(var(--skippr-spacing)*2)}.skippr\\:mt-3{margin-top:calc(var(--skippr-spacing)*3)}.skippr\\:mt-3\\.5{margin-top:calc(var(--skippr-spacing)*3.5)}.skippr\\:mr-7{margin-right:calc(var(--skippr-spacing)*7)}.skippr\\:-mb-\\[5px\\]{margin-bottom:-5px}.skippr\\:mb-1\\.5{margin-bottom:calc(var(--skippr-spacing)*1.5)}.skippr\\:mb-2{margin-bottom:calc(var(--skippr-spacing)*2)}.skippr\\:mb-3{margin-bottom:calc(var(--skippr-spacing)*3)}.skippr\\:mb-4{margin-bottom:calc(var(--skippr-spacing)*4)}.skippr\\:ml-0\\.5{margin-left:calc(var(--skippr-spacing)*.5)}.skippr\\:ml-1{margin-left:calc(var(--skippr-spacing)*1)}.skippr\\:ml-7{margin-left:calc(var(--skippr-spacing)*7)}.skippr\\:flex{display:flex}.skippr\\:hidden{display:none}.skippr\\:inline-flex{display:inline-flex}.skippr\\:size-1{width:calc(var(--skippr-spacing)*1);height:calc(var(--skippr-spacing)*1)}.skippr\\:size-1\\.5{width:calc(var(--skippr-spacing)*1.5);height:calc(var(--skippr-spacing)*1.5)}.skippr\\:size-2{width:calc(var(--skippr-spacing)*2);height:calc(var(--skippr-spacing)*2)}.skippr\\:size-2\\.5{width:calc(var(--skippr-spacing)*2.5);height:calc(var(--skippr-spacing)*2.5)}.skippr\\:size-3{width:calc(var(--skippr-spacing)*3);height:calc(var(--skippr-spacing)*3)}.skippr\\:size-3\\.5{width:calc(var(--skippr-spacing)*3.5);height:calc(var(--skippr-spacing)*3.5)}.skippr\\:size-4{width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}.skippr\\:size-5{width:calc(var(--skippr-spacing)*5);height:calc(var(--skippr-spacing)*5)}.skippr\\:size-6{width:calc(var(--skippr-spacing)*6);height:calc(var(--skippr-spacing)*6)}.skippr\\:size-7{width:calc(var(--skippr-spacing)*7);height:calc(var(--skippr-spacing)*7)}.skippr\\:size-8{width:calc(var(--skippr-spacing)*8);height:calc(var(--skippr-spacing)*8)}.skippr\\:size-9{width:calc(var(--skippr-spacing)*9);height:calc(var(--skippr-spacing)*9)}.skippr\\:size-10{width:calc(var(--skippr-spacing)*10);height:calc(var(--skippr-spacing)*10)}.skippr\\:size-12{width:calc(var(--skippr-spacing)*12);height:calc(var(--skippr-spacing)*12)}.skippr\\:size-\\[5px\\]{width:5px;height:5px}.skippr\\:size-\\[38px\\]{width:38px;height:38px}.skippr\\:size-full{width:100%;height:100%}.skippr\\:h-0{height:calc(var(--skippr-spacing)*0)}.skippr\\:h-0\\.5{height:calc(var(--skippr-spacing)*.5)}.skippr\\:h-1{height:calc(var(--skippr-spacing)*1)}.skippr\\:h-1\\.5{height:calc(var(--skippr-spacing)*1.5)}.skippr\\:h-2{height:calc(var(--skippr-spacing)*2)}.skippr\\:h-3{height:calc(var(--skippr-spacing)*3)}.skippr\\:h-3\\.5{height:calc(var(--skippr-spacing)*3.5)}.skippr\\:h-4{height:calc(var(--skippr-spacing)*4)}.skippr\\:h-5{height:calc(var(--skippr-spacing)*5)}.skippr\\:h-6{height:calc(var(--skippr-spacing)*6)}.skippr\\:h-7{height:calc(var(--skippr-spacing)*7)}.skippr\\:h-8{height:calc(var(--skippr-spacing)*8)}.skippr\\:h-9{height:calc(var(--skippr-spacing)*9)}.skippr\\:h-10{height:calc(var(--skippr-spacing)*10)}.skippr\\:h-\\[18\\.5px\\]{height:18.5px}.skippr\\:h-\\[36px\\]{height:36px}.skippr\\:h-\\[38px\\]{height:38px}.skippr\\:h-\\[48px\\]{height:48px}.skippr\\:h-\\[54px\\]{height:54px}.skippr\\:h-full{height:100%}.skippr\\:min-h-0{min-height:calc(var(--skippr-spacing)*0)}.skippr\\:min-h-11{min-height:calc(var(--skippr-spacing)*11)}.skippr\\:w-0{width:calc(var(--skippr-spacing)*0)}.skippr\\:w-3\\.5{width:calc(var(--skippr-spacing)*3.5)}.skippr\\:w-4{width:calc(var(--skippr-spacing)*4)}.skippr\\:w-5{width:calc(var(--skippr-spacing)*5)}.skippr\\:w-6{width:calc(var(--skippr-spacing)*6)}.skippr\\:w-7{width:calc(var(--skippr-spacing)*7)}.skippr\\:w-8{width:calc(var(--skippr-spacing)*8)}.skippr\\:w-10{width:calc(var(--skippr-spacing)*10)}.skippr\\:w-40{width:calc(var(--skippr-spacing)*40)}.skippr\\:w-\\[2px\\]{width:2px}.skippr\\:w-\\[3px\\]{width:3px}.skippr\\:w-\\[15\\.4px\\]{width:15.4px}.skippr\\:w-\\[36px\\]{width:36px}.skippr\\:w-\\[38px\\]{width:38px}.skippr\\:w-\\[50px\\]{width:50px}.skippr\\:w-fit{width:fit-content}.skippr\\:w-full{width:100%}.skippr\\:max-w-64{max-width:calc(var(--skippr-spacing)*64)}.skippr\\:max-w-72{max-width:calc(var(--skippr-spacing)*72)}.skippr\\:max-w-\\[80\\%\\]{max-width:80%}.skippr\\:max-w-\\[280px\\]{max-width:280px}.skippr\\:min-w-0{min-width:calc(var(--skippr-spacing)*0)}.skippr\\:min-w-11{min-width:calc(var(--skippr-spacing)*11)}.skippr\\:flex-1{flex:1}.skippr\\:shrink-0{flex-shrink:0}.skippr\\:origin-bottom-left{transform-origin:0 100%}.skippr\\:origin-bottom-right{transform-origin:100% 100%}.skippr\\:origin-center{transform-origin:50%}.skippr\\:origin-left{transform-origin:0}.skippr\\:origin-right{transform-origin:100%}.skippr\\:origin-top-left{transform-origin:0 0}.skippr\\:origin-top-right{transform-origin:100% 0}.skippr\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-x-3{--tw-translate-x:calc(var(--skippr-spacing)*-3);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-x-7{--tw-translate-x:calc(var(--skippr-spacing)*-7);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:translate-x-3{--tw-translate-x:calc(var(--skippr-spacing)*3);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:translate-x-7{--tw-translate-x:calc(var(--skippr-spacing)*7);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-\\[0\\.94\\]{scale:.94}.skippr\\:-rotate-90{rotate:-90deg}.skippr\\:rotate-45{rotate:45deg}.skippr\\:rotate-\\[225deg\\]{rotate:225deg}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out\\]{animation:.2s ease-out skippr-agent-in}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out_240ms_both\\]{animation:.2s ease-out .24s both skippr-agent-in}.skippr\\:\\[animation\\:skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:\\[animation\\:skippr-finger-tap_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-finger-tap}.skippr\\:\\[animation\\:skippr-orb-in_320ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)\\]{animation:.32s cubic-bezier(.34,1.3,.64,1) skippr-orb-in}.skippr\\:\\[animation\\:skippr-stage-fade_240ms_ease-out\\]{animation:.24s ease-out skippr-stage-fade}.skippr\\:\\[animation\\:skippr-tip-in_360ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)_backwards\\]{animation:.36s cubic-bezier(.34,1.3,.64,1) backwards skippr-tip-in}.skippr\\:\\[animation\\:skippr-toolset-pop_280ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.28s cubic-bezier(.22,1,.36,1) skippr-toolset-pop}.skippr\\:\\[animation\\:skippr-toolset-pop_440ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.44s cubic-bezier(.22,1,.36,1) skippr-toolset-pop}.skippr\\:animate-\\[skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:animate-\\[skippr-bubble-in_0\\.28s_ease-out\\]{animation:.28s ease-out skippr-bubble-in}.skippr\\:animate-\\[skippr-fade-in_0\\.3s_ease-out\\]{animation:.3s ease-out skippr-fade-in}.skippr\\:animate-\\[skippr-pill-content_0\\.22s_ease-out\\]{animation:.22s ease-out skippr-pill-content}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.3s_infinite\\]{animation:1.1s ease-in-out .3s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.6s_infinite\\]{animation:1.1s ease-in-out .6s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.15s_infinite\\]{animation:1.1s ease-in-out .15s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.45s_infinite\\]{animation:1.1s ease-in-out .45s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-speak}.skippr\\:animate-bounce{animation:var(--skippr-animate-bounce)}.skippr\\:animate-ping{animation:var(--skippr-animate-ping)}.skippr\\:animate-skippr-annotation-pulse{animation:1.8s ease-in-out infinite skippr-annotation-pulse}.skippr\\:animate-skippr-click-ping{animation:.5s ease-out forwards skippr-click-ping}.skippr\\:animate-skippr-cursor-pop{animation:.22s ease-out skippr-cursor-pop}.skippr\\:animate-skippr-press{animation:.5s ease-in-out skippr-press}.skippr\\:animate-skippr-ptt-transmit{animation:1.4s ease-out infinite skippr-ptt-transmit}.skippr\\:animate-skippr-rec-ring{animation:2s ease-out infinite skippr-rec-ring}.skippr\\:animate-skippr-tab-fade{animation:.2s ease-out skippr-tab-fade}.skippr\\:animate-skippr-thinking-dot{animation:1.2s ease-in-out infinite skippr-thinking-dot}.skippr\\:animate-spin{animation:var(--skippr-animate-spin)}.skippr\\:cursor-default{cursor:default}.skippr\\:cursor-grab{cursor:grab}.skippr\\:cursor-not-allowed{cursor:not-allowed}.skippr\\:cursor-pointer{cursor:pointer}.skippr\\:touch-none{touch-action:none}.skippr\\:resize-none{resize:none}.skippr\\:flex-col{flex-direction:column}.skippr\\:flex-col-reverse{flex-direction:column-reverse}.skippr\\:items-center{align-items:center}.skippr\\:items-end{align-items:flex-end}.skippr\\:items-start{align-items:flex-start}.skippr\\:justify-between{justify-content:space-between}.skippr\\:justify-center{justify-content:center}.skippr\\:justify-end{justify-content:flex-end}.skippr\\:justify-start{justify-content:flex-start}.skippr\\:gap-0\\.5{gap:calc(var(--skippr-spacing)*.5)}.skippr\\:gap-1{gap:calc(var(--skippr-spacing)*1)}.skippr\\:gap-1\\.5{gap:calc(var(--skippr-spacing)*1.5)}.skippr\\:gap-2{gap:calc(var(--skippr-spacing)*2)}.skippr\\:gap-2\\.5{gap:calc(var(--skippr-spacing)*2.5)}.skippr\\:gap-3{gap:calc(var(--skippr-spacing)*3)}.skippr\\:gap-\\[2px\\]{gap:2px}.skippr\\:gap-\\[3px\\]{gap:3px}:where(.skippr\\:space-y-0\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}.skippr\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.skippr\\:overflow-hidden{overflow:hidden}.skippr\\:overflow-y-auto{overflow-y:auto}.skippr\\:rounded{border-radius:.25rem}.skippr\\:rounded-2xl{border-radius:1.125rem}.skippr\\:rounded-\\[1rem\\]{border-radius:1rem}.skippr\\:rounded-\\[10px\\]{border-radius:10px}.skippr\\:rounded-\\[11px\\]{border-radius:11px}.skippr\\:rounded-\\[12px\\]{border-radius:12px}.skippr\\:rounded-\\[14px\\]{border-radius:14px}.skippr\\:rounded-\\[16px\\]{border-radius:16px}.skippr\\:rounded-\\[20px\\]{border-radius:20px}.skippr\\:rounded-full{border-radius:3.40282e38px}.skippr\\:rounded-lg{border-radius:.625rem}.skippr\\:rounded-md{border-radius:.5rem}.skippr\\:rounded-sm{border-radius:.375rem}.skippr\\:rounded-xl{border-radius:.875rem}.skippr\\:rounded-l-\\[18px\\]{border-top-left-radius:18px;border-bottom-left-radius:18px}.skippr\\:rounded-tl-md{border-top-left-radius:.5rem}.skippr\\:rounded-r-\\[18px\\]{border-top-right-radius:18px;border-bottom-right-radius:18px}.skippr\\:border{border-style:var(--tw-border-style);border-width:1px}.skippr\\:border-0{border-style:var(--tw-border-style);border-width:0}.skippr\\:border-2{border-style:var(--tw-border-style);border-width:2px}.skippr\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.skippr\\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.skippr\\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.skippr\\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.skippr\\:border-black\\/25{border-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-black\\/25{border-color:color-mix(in oklab,var(--skippr-color-black)25%,transparent)}}.skippr\\:border-border{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-brand{border-color:var(--skippr-brand,#2bc0ae)}.skippr\\:border-input{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-primary\\/20{border-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-primary\\/20{border-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)20%,transparent)}}.skippr\\:border-r-border{border-right-color:oklch(92.3% .003 48.717)}.skippr\\:border-l-border{border-left-color:oklch(92.3% .003 48.717)}.skippr\\:bg-\\[\\#f4ecd8\\]{background-color:#f4ecd8}.skippr\\:bg-amber-50{background-color:var(--skippr-color-amber-50)}.skippr\\:bg-amber-400{background-color:var(--skippr-color-amber-400)}.skippr\\:bg-background{background-color:oklch(100% 0 0)}.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:color-mix(in oklab,var(--skippr-color-black)7.0%,transparent)}}.skippr\\:bg-brand,.skippr\\:bg-brand\\/50{background-color:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-brand\\/50{background-color:color-mix(in oklab,var(--skippr-brand,#2bc0ae)50%,transparent)}}.skippr\\:bg-bubble{background-color:#2d2b3d}.skippr\\:bg-bubble\\/95{background-color:oklab(29.9244% .0107414 -.0305411/.95)}.skippr\\:bg-card{background-color:oklch(100% 0 0)}.skippr\\:bg-current{background-color:currentColor}.skippr\\:bg-destructive{background-color:#d94f4f}.skippr\\:bg-emerald-400{background-color:var(--skippr-color-emerald-400)}.skippr\\:bg-foreground{background-color:oklch(14.7% .004 49.25)}.skippr\\:bg-launcher{background-color:#2d2d3f}.skippr\\:bg-muted-foreground\\/20{background-color:oklab(55.3% .00687528 .0110332/.2)}.skippr\\:bg-muted-foreground\\/40{background-color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:bg-muted\\/50{background-color:oklab(97% -.000282743 .000959196/.5)}.skippr\\:bg-neutral-100{background-color:var(--skippr-color-neutral-100)}.skippr\\:bg-primary{background-color:var(--skippr-brand,#2d2b3d)}.skippr\\:bg-primary-foreground\\/15{background-color:var(--skippr-brand-foreground,#fff)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-primary-foreground\\/15{background-color:color-mix(in oklab,var(--skippr-brand-foreground,#fff)15%,transparent)}}.skippr\\:bg-primary-foreground\\/20{background-color:var(--skippr-brand-foreground,#fff)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-primary-foreground\\/20{background-color:color-mix(in oklab,var(--skippr-brand-foreground,#fff)20%,transparent)}}.skippr\\:bg-primary\\/10{background-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-primary\\/10{background-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)10%,transparent)}}.skippr\\:bg-red-50{background-color:var(--skippr-color-red-50)}.skippr\\:bg-red-100{background-color:var(--skippr-color-red-100)}.skippr\\:bg-red-400{background-color:var(--skippr-color-red-400)}.skippr\\:bg-red-500{background-color:var(--skippr-color-red-500)}.skippr\\:bg-secondary{background-color:#ffdfb5}.skippr\\:bg-transparent{background-color:#0000}.skippr\\:bg-white,.skippr\\:bg-white\\/70{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/70{background-color:color-mix(in oklab,var(--skippr-color-white)70%,transparent)}}.skippr\\:fill-brand{fill:var(--skippr-brand,#2bc0ae)}.skippr\\:fill-primary\\/30{fill:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:fill-primary\\/30{fill:color-mix(in oklab,var(--skippr-brand,#2d2b3d)30%,transparent)}}.skippr\\:stroke-black\\/15{stroke:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:stroke-black\\/15{stroke:color-mix(in oklab,var(--skippr-color-black)15%,transparent)}}.skippr\\:stroke-bubble{stroke:#2d2b3d}.skippr\\:object-cover{object-fit:cover}.skippr\\:p-0{padding:calc(var(--skippr-spacing)*0)}.skippr\\:p-0\\.5{padding:calc(var(--skippr-spacing)*.5)}.skippr\\:p-1\\.5{padding:calc(var(--skippr-spacing)*1.5)}.skippr\\:p-2{padding:calc(var(--skippr-spacing)*2)}.skippr\\:p-3{padding:calc(var(--skippr-spacing)*3)}.skippr\\:p-3\\.5{padding:calc(var(--skippr-spacing)*3.5)}.skippr\\:p-4{padding:calc(var(--skippr-spacing)*4)}.skippr\\:px-1{padding-inline:calc(var(--skippr-spacing)*1)}.skippr\\:px-1\\.5{padding-inline:calc(var(--skippr-spacing)*1.5)}.skippr\\:px-2{padding-inline:calc(var(--skippr-spacing)*2)}.skippr\\:px-2\\.5{padding-inline:calc(var(--skippr-spacing)*2.5)}.skippr\\:px-3{padding-inline:calc(var(--skippr-spacing)*3)}.skippr\\:px-3\\.5{padding-inline:calc(var(--skippr-spacing)*3.5)}.skippr\\:px-4{padding-inline:calc(var(--skippr-spacing)*4)}.skippr\\:px-6{padding-inline:calc(var(--skippr-spacing)*6)}.skippr\\:px-8{padding-inline:calc(var(--skippr-spacing)*8)}.skippr\\:py-0\\.5{padding-block:calc(var(--skippr-spacing)*.5)}.skippr\\:py-1{padding-block:calc(var(--skippr-spacing)*1)}.skippr\\:py-1\\.5{padding-block:calc(var(--skippr-spacing)*1.5)}.skippr\\:py-2{padding-block:calc(var(--skippr-spacing)*2)}.skippr\\:py-2\\.5{padding-block:calc(var(--skippr-spacing)*2.5)}.skippr\\:py-3{padding-block:calc(var(--skippr-spacing)*3)}.skippr\\:py-4{padding-block:calc(var(--skippr-spacing)*4)}.skippr\\:py-6{padding-block:calc(var(--skippr-spacing)*6)}.skippr\\:pt-1\\.5{padding-top:calc(var(--skippr-spacing)*1.5)}.skippr\\:pr-2\\.5{padding-right:calc(var(--skippr-spacing)*2.5)}.skippr\\:pr-3{padding-right:calc(var(--skippr-spacing)*3)}.skippr\\:pb-2{padding-bottom:calc(var(--skippr-spacing)*2)}.skippr\\:pl-1\\.5{padding-left:calc(var(--skippr-spacing)*1.5)}.skippr\\:pl-2\\.5{padding-left:calc(var(--skippr-spacing)*2.5)}.skippr\\:pl-3\\.5{padding-left:calc(var(--skippr-spacing)*3.5)}.skippr\\:text-center{text-align:center}.skippr\\:text-left{text-align:left}.skippr\\:font-mono{font-family:var(--skippr-font-mono)}.skippr\\:text-sm{font-size:var(--skippr-text-sm);line-height:var(--tw-leading,var(--skippr-text-sm--line-height))}.skippr\\:text-xs{font-size:var(--skippr-text-xs);line-height:var(--tw-leading,var(--skippr-text-xs--line-height))}.skippr\\:text-\\[10px\\]{font-size:10px}.skippr\\:text-\\[11px\\]{font-size:11px}.skippr\\:text-\\[13px\\]{font-size:13px}.skippr\\:leading-5{--tw-leading:calc(var(--skippr-spacing)*5);line-height:calc(var(--skippr-spacing)*5)}.skippr\\:leading-none{--tw-leading:1;line-height:1}.skippr\\:leading-relaxed{--tw-leading:var(--skippr-leading-relaxed);line-height:var(--skippr-leading-relaxed)}.skippr\\:leading-snug{--tw-leading:var(--skippr-leading-snug);line-height:var(--skippr-leading-snug)}.skippr\\:leading-tight{--tw-leading:var(--skippr-leading-tight);line-height:var(--skippr-leading-tight)}.skippr\\:font-medium{--tw-font-weight:var(--skippr-font-weight-medium);font-weight:var(--skippr-font-weight-medium)}.skippr\\:font-semibold{--tw-font-weight:var(--skippr-font-weight-semibold);font-weight:var(--skippr-font-weight-semibold)}.skippr\\:whitespace-nowrap{white-space:nowrap}.skippr\\:text-amber-700{color:var(--skippr-color-amber-700)}.skippr\\:text-amber-950{color:var(--skippr-color-amber-950)}.skippr\\:text-background{color:oklch(100% 0 0)}.skippr\\:text-black,.skippr\\:text-black\\/40{color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-black\\/40{color:color-mix(in oklab,var(--skippr-color-black)40%,transparent)}}.skippr\\:text-brand{color:var(--skippr-brand,#2bc0ae)}.skippr\\:text-bubble{color:#2d2b3d}.skippr\\:text-chart-3{color:oklch(66.6% .179 58.318)}.skippr\\:text-destructive{color:#d94f4f}.skippr\\:text-foreground{color:oklch(14.7% .004 49.25)}.skippr\\:text-muted-foreground{color:oklch(55.3% .013 58.071)}.skippr\\:text-muted-foreground\\/30{color:oklab(55.3% .00687528 .0110332/.3)}.skippr\\:text-muted-foreground\\/40{color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:text-muted-foreground\\/60{color:oklab(55.3% .00687528 .0110332/.6)}.skippr\\:text-muted-foreground\\/70{color:oklab(55.3% .00687528 .0110332/.7)}.skippr\\:text-neutral-500{color:var(--skippr-color-neutral-500)}.skippr\\:text-neutral-700{color:var(--skippr-color-neutral-700)}.skippr\\:text-primary{color:var(--skippr-brand,#2d2b3d)}.skippr\\:text-primary-foreground,.skippr\\:text-primary-foreground\\/70{color:var(--skippr-brand-foreground,#fff)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-primary-foreground\\/70{color:color-mix(in oklab,var(--skippr-brand-foreground,#fff)70%,transparent)}}.skippr\\:text-red-400{color:var(--skippr-color-red-400)}.skippr\\:text-red-600{color:var(--skippr-color-red-600)}.skippr\\:text-red-700{color:var(--skippr-color-red-700)}.skippr\\:text-secondary-foreground{color:#613700}.skippr\\:text-white,.skippr\\:text-white\\/60{color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-white\\/60{color:color-mix(in oklab,var(--skippr-color-white)60%,transparent)}}.skippr\\:capitalize{text-transform:capitalize}.skippr\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.skippr\\:line-through{text-decoration-line:line-through}.skippr\\:placeholder-muted-foreground::placeholder{color:oklch(55.3% .013 58.071)}.skippr\\:opacity-0{opacity:0}.skippr\\:opacity-40{opacity:.4}.skippr\\:opacity-75{opacity:.75}.skippr\\:opacity-100{opacity:1}.skippr\\:shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[-6px_8px_30px_rgba\\(15\\,18\\,26\\,0\\.32\\)\\]{--tw-shadow:-6px 8px 30px var(--tw-shadow-color,#0f121a52);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_2px_6px_rgba\\(0\\,0\\,0\\,0\\.28\\)\\]{--tw-shadow:0 2px 6px var(--tw-shadow-color,#00000047);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_12px_rgba\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow:0 4px 12px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_14px_rgba\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_14px_rgba\\(239\\,68\\,68\\,0\\.45\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#ef444473);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_16px_rgba\\(45\\,43\\,61\\,0\\.45\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#2d2b3d73),0 2px 4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(45\\,43\\,61\\,0\\.35\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#2d2b3d59);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_30px_rgba\\(0\\,0\\,0\\,0\\.16\\)\\,0_4px_12px_rgba\\(0\\,0\\,0\\,0\\.08\\)\\]{--tw-shadow:0 8px 30px var(--tw-shadow-color,#00000029),0 4px 12px var(--tw-shadow-color,#00000014);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_32px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 10px 32px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-black\\/5{--tw-ring-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-black\\/5{--tw-ring-color:color-mix(in oklab,var(--skippr-color-black)5%,transparent)}}.skippr\\:ring-brand{--tw-ring-color:var(--skippr-brand,#2bc0ae)}.skippr\\:ring-foreground\\/10{--tw-ring-color:oklab(14.7% .00261104 .00303026/.1)}.skippr\\:ring-primary-foreground\\/30{--tw-ring-color:var(--skippr-brand-foreground,#fff)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-primary-foreground\\/30{--tw-ring-color:color-mix(in oklab,var(--skippr-brand-foreground,#fff)30%,transparent)}}.skippr\\:ring-white\\/15{--tw-ring-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-white\\/15{--tw-ring-color:color-mix(in oklab,var(--skippr-color-white)15%,transparent)}}.skippr\\:ring-offset-background{--tw-ring-offset-color:oklch(100% 0 0)}.skippr\\:drop-shadow-\\[0_2px_5px_rgba\\(0\\,0\\,0\\,0\\.4\\)\\]{--tw-drop-shadow-size:drop-shadow(0 2px 5px var(--tw-drop-shadow-color,#0006));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.skippr\\:backdrop-blur-sm{--tw-backdrop-blur:blur(var(--skippr-blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.skippr\\:transition-\\[height\\]{transition-property:height;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[opacity\\,transform\\,height\\]{transition-property:opacity,transform,height;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\,margin\\]{transition-property:width,margin;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:duration-75{--tw-duration:75ms;transition-duration:75ms}.skippr\\:duration-100{--tw-duration:.1s;transition-duration:.1s}.skippr\\:duration-150{--tw-duration:.15s;transition-duration:.15s}.skippr\\:duration-200{--tw-duration:.2s;transition-duration:.2s}.skippr\\:duration-300{--tw-duration:.3s;transition-duration:.3s}.skippr\\:duration-\\[400ms\\]{--tw-duration:.4s;transition-duration:.4s}.skippr\\:ease-\\[cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{--tw-ease:cubic-bezier(.22,1,.36,1);transition-timing-function:cubic-bezier(.22,1,.36,1)}.skippr\\:ease-\\[cubic-bezier\\(0\\.34\\,1\\.56\\,0\\.64\\,1\\)\\]{--tw-ease:cubic-bezier(.34,1.56,.64,1);transition-timing-function:cubic-bezier(.34,1.56,.64,1)}.skippr\\:ease-in-out{--tw-ease:var(--skippr-ease-in-out);transition-timing-function:var(--skippr-ease-in-out)}.skippr\\:ease-out{--tw-ease:var(--skippr-ease-out);transition-timing-function:var(--skippr-ease-out)}.skippr\\:outline-none{--tw-outline-style:none;outline-style:none}.skippr\\:select-none{-webkit-user-select:none;user-select:none}.skippr\\:\\[animation-delay\\:0ms\\]{animation-delay:0s}.skippr\\:\\[animation-delay\\:150ms\\]{animation-delay:.15s}.skippr\\:\\[animation-delay\\:200ms\\]{animation-delay:.2s}.skippr\\:\\[animation-delay\\:300ms\\]{animation-delay:.3s}.skippr\\:\\[animation-delay\\:400ms\\]{animation-delay:.4s}.skippr\\:\\[overflow-anchor\\:none\\]{overflow-anchor:none}.skippr\\:group-focus-within\\:scale-100:is(:where(.skippr\\:group):focus-within *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-focus-within\\:opacity-100:is(:where(.skippr\\:group):focus-within *){opacity:1}@media (hover:hover){.skippr\\:group-hover\\:scale-100:is(:where(.skippr\\:group):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-hover\\:text-red-300:is(:where(.skippr\\:group):hover *){color:var(--skippr-color-red-300)}.skippr\\:group-hover\\:text-white\\/80:is(:where(.skippr\\:group):hover *){color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:group-hover\\:text-white\\/80:is(:where(.skippr\\:group):hover *){color:color-mix(in oklab,var(--skippr-color-white)80%,transparent)}}.skippr\\:group-hover\\:opacity-100:is(:where(.skippr\\:group):hover *){opacity:1}}.skippr\\:placeholder\\:text-muted-foreground::placeholder{color:oklch(55.3% .013 58.071)}@media (hover:hover){.skippr\\:hover\\:-translate-y-0\\.5:hover{--tw-translate-y:calc(var(--skippr-spacing)*-.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:hover\\:bg-\\[\\#3a384b\\]:hover{background-color:#3a384b}.skippr\\:hover\\:bg-accent:hover{background-color:#e7e5e4}.skippr\\:hover\\:bg-amber-100:hover{background-color:var(--skippr-color-amber-100)}.skippr\\:hover\\:bg-bubble:hover{background-color:#2d2b3d}.skippr\\:hover\\:bg-destructive\\/90:hover{background-color:oklab(61.4357% .15892 .0698893/.9)}.skippr\\:hover\\:bg-muted:hover{background-color:oklch(97% .001 106.424)}.skippr\\:hover\\:bg-neutral-100:hover{background-color:var(--skippr-color-neutral-100)}.skippr\\:hover\\:bg-neutral-200:hover{background-color:var(--skippr-color-neutral-200)}.skippr\\:hover\\:bg-primary-foreground\\/10:hover{background-color:var(--skippr-brand-foreground,#fff)}@supports (color:color-mix(in lab, red, red)){.skippr\\:hover\\:bg-primary-foreground\\/10:hover{background-color:color-mix(in oklab,var(--skippr-brand-foreground,#fff)10%,transparent)}}.skippr\\:hover\\:bg-primary\\/90:hover{background-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)90%,transparent)}}.skippr\\:hover\\:bg-red-200:hover{background-color:var(--skippr-color-red-200)}.skippr\\:hover\\:bg-red-600:hover{background-color:var(--skippr-color-red-600)}.skippr\\:hover\\:bg-secondary\\/80:hover{background-color:oklab(91.9963% .0175391 .0626889/.8)}.skippr\\:hover\\:text-accent-foreground:hover{color:oklch(21.6% .006 56.043)}.skippr\\:hover\\:text-foreground:hover{color:oklch(14.7% .004 49.25)}.skippr\\:hover\\:text-primary-foreground:hover{color:var(--skippr-brand-foreground,#fff)}.skippr\\:hover\\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}}.skippr\\:focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:focus-visible\\:ring-bubble\\/60:focus-visible{--tw-ring-color:oklab(29.9244% .0107414 -.0305411/.6)}.skippr\\:focus-visible\\:ring-primary-foreground:focus-visible{--tw-ring-color:var(--skippr-brand-foreground,#fff)}.skippr\\:focus-visible\\:ring-ring:focus-visible{--tw-ring-color:oklch(70.9% .01 56.259)}.skippr\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.skippr\\:focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.skippr\\:active\\:translate-y-0:active{--tw-translate-y:calc(var(--skippr-spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.skippr\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.skippr\\:disabled\\:opacity-50:disabled{opacity:.5}.skippr\\:disabled\\:opacity-60:disabled{opacity:.6}@media (prefers-reduced-motion:reduce){.skippr\\:motion-reduce\\:hidden{display:none}.skippr\\:motion-reduce\\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:motion-reduce\\:animate-none{animation:none}}.skippr\\:\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.skippr\\:\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.skippr\\:\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}}@keyframes skippr-tap{0%{transform:scale(1)}45%{transform:scale(.7)}to{transform:scale(1)}}@keyframes skippr-press{0%{transform:scale(1)}55%{transform:scale(1)}85%{transform:scale(.68)}to{transform:scale(1)}}@keyframes skippr-cursor-pop{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}@keyframes skippr-click-ping{0%{opacity:.9;transform:translate(-50%,-50%)scale(.4)}to{opacity:0;transform:translate(-50%,-50%)scale(2.4)}}@keyframes skippr-tab-fade{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-speak{0%,to{opacity:.6;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-thinking-dot{0%,80%,to{opacity:.2;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}@keyframes skippr-pulse-ring{0%,to{box-shadow:0 0 #2d2b3d66}50%{box-shadow:0 0 0 10px #2d2b3d00}}@keyframes skippr-rec-ring{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)55%,transparent)}70%{box-shadow:0 0 0 11px #0000}to{box-shadow:0 0 #0000}}@keyframes skippr-ptt-transmit{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)60%,transparent),0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)35%,transparent)}70%{box-shadow:0 0 0 9px #0000,0 0 0 16px #0000}to{box-shadow:0 0 #0000,0 0 #0000}}@keyframes skippr-annotation-pulse{0%,to{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)50%,transparent)}50%{box-shadow:0 0 0 6px #0000}}@keyframes skippr-speak-ripple{0%{opacity:.6;transform:scale(1)}to{opacity:0;transform:scale(1.8)}}@keyframes skippr-bar{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}@keyframes skippr-breathe{0%,to{opacity:.85;transform:scale(1)}50%{opacity:1;transform:scale(1.08)}}@keyframes skippr-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-wave{0%,to{opacity:.4;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-bubble-in{0%{opacity:0;transform:translateY(12px)scale(.96)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-tip-in{0%{opacity:0;transform:translateY(14px)scale(.96)}60%{opacity:1;transform:translateY(-2px)scale(1.01)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-pill-content{0%{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}@keyframes skippr-banner-look{0%,to{transform:translate(0)}25%{transform:translate(-2px)}75%{transform:translate(2px)}}@keyframes skippr-finger-tap{0%,to{transform:translateY(0)rotate(0)}50%{transform:translateY(2px)rotate(-6deg)}}@keyframes skippr-toolset-pop{0%{opacity:0;transform:scale(.85)}to{opacity:1;transform:scale(1)}}@keyframes skippr-stage-fade{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}@keyframes skippr-agent-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}@keyframes skippr-orb-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}.skippr-no-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.skippr-no-scrollbar::-webkit-scrollbar{display:none}:host{color:var(--color-foreground)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}`;
|
|
5004
|
+
const hostStyle = accentColor && isHexColor(accentColor) ? {
|
|
5005
|
+
"--skippr-brand": accentColor,
|
|
5006
|
+
"--skippr-brand-foreground": brandForeground(accentColor)
|
|
5007
|
+
} : undefined;
|
|
4819
5008
|
useLayoutEffect2(() => {
|
|
4820
5009
|
const host = hostRef.current;
|
|
4821
5010
|
if (!host || !css)
|
|
@@ -4835,12 +5024,13 @@ function ShadowHost({ children }) {
|
|
|
4835
5024
|
});
|
|
4836
5025
|
return /* @__PURE__ */ jsx13("div", {
|
|
4837
5026
|
ref: hostRef,
|
|
5027
|
+
style: hostStyle,
|
|
4838
5028
|
children: shadowRoot && createPortal(children, shadowRoot)
|
|
4839
5029
|
});
|
|
4840
5030
|
}
|
|
4841
5031
|
|
|
4842
5032
|
// src/components/Sidebar.tsx
|
|
4843
|
-
import { useContext as useContext13, useEffect as
|
|
5033
|
+
import { useContext as useContext13, useEffect as useEffect29 } from "react";
|
|
4844
5034
|
|
|
4845
5035
|
// src/hooks/useCombinedMessages.ts
|
|
4846
5036
|
import { useContext as useContext9, useMemo as useMemo6 } from "react";
|
|
@@ -4875,14 +5065,14 @@ function useChatMessages() {
|
|
|
4875
5065
|
|
|
4876
5066
|
// src/hooks/useStreamingTranscript.ts
|
|
4877
5067
|
import { useLocalParticipant as useLocalParticipant10 } from "@livekit/components-react/hooks";
|
|
4878
|
-
import { useMemo as useMemo5, useRef as
|
|
5068
|
+
import { useMemo as useMemo5, useRef as useRef17 } from "react";
|
|
4879
5069
|
function useStreamingTranscript() {
|
|
4880
5070
|
const transcriptions = useSharedTranscriptions();
|
|
4881
5071
|
const { localParticipant } = useLocalParticipant10();
|
|
4882
5072
|
const { isCapturingSpeech } = useVoiceTurnContext();
|
|
4883
5073
|
const localIdentity = localParticipant.identity;
|
|
4884
|
-
const priorUserStreamIdsRef =
|
|
4885
|
-
const wasCapturingSpeechRef =
|
|
5074
|
+
const priorUserStreamIdsRef = useRef17(new Set);
|
|
5075
|
+
const wasCapturingSpeechRef = useRef17(false);
|
|
4886
5076
|
if (isCapturingSpeech && !wasCapturingSpeechRef.current) {
|
|
4887
5077
|
priorUserStreamIdsRef.current = new Set(transcriptions.filter((stream) => stream.participantInfo.identity === localIdentity).map((stream) => stream.streamInfo.id));
|
|
4888
5078
|
}
|
|
@@ -4943,7 +5133,7 @@ function useCombinedMessages() {
|
|
|
4943
5133
|
}
|
|
4944
5134
|
|
|
4945
5135
|
// src/hooks/usePhaseUpdates.ts
|
|
4946
|
-
import { useCallback as useCallback14, useContext as useContext10, useEffect as
|
|
5136
|
+
import { useCallback as useCallback14, useContext as useContext10, useEffect as useEffect23 } from "react";
|
|
4947
5137
|
function parsePhases(json) {
|
|
4948
5138
|
try {
|
|
4949
5139
|
const data = JSON.parse(json);
|
|
@@ -4957,7 +5147,7 @@ function usePhaseUpdates() {
|
|
|
4957
5147
|
const parse = useCallback14(parsePhases, []);
|
|
4958
5148
|
const livePhases = useAgentState("phases", parse, []);
|
|
4959
5149
|
const ctx = useContext10(LiveAgentContext);
|
|
4960
|
-
|
|
5150
|
+
useEffect23(() => {
|
|
4961
5151
|
if (livePhases.length > 0)
|
|
4962
5152
|
ctx?.setPhasesSnapshot(livePhases);
|
|
4963
5153
|
}, [livePhases, ctx?.setPhasesSnapshot]);
|
|
@@ -4966,7 +5156,7 @@ function usePhaseUpdates() {
|
|
|
4966
5156
|
}
|
|
4967
5157
|
|
|
4968
5158
|
// src/hooks/useSessionRemaining.ts
|
|
4969
|
-
import { useEffect as
|
|
5159
|
+
import { useEffect as useEffect24, useRef as useRef18, useState as useState17 } from "react";
|
|
4970
5160
|
|
|
4971
5161
|
// src/lib/format.ts
|
|
4972
5162
|
function formatTime(seconds) {
|
|
@@ -4982,9 +5172,9 @@ function parseNumber(s) {
|
|
|
4982
5172
|
// src/hooks/useSessionRemaining.ts
|
|
4983
5173
|
function useSessionRemaining() {
|
|
4984
5174
|
const maxCallDuration = useAgentState("maxCallDuration", parseNumber, null);
|
|
4985
|
-
const endTimeRef =
|
|
4986
|
-
const [remaining, setRemaining] =
|
|
4987
|
-
|
|
5175
|
+
const endTimeRef = useRef18(null);
|
|
5176
|
+
const [remaining, setRemaining] = useState17(null);
|
|
5177
|
+
useEffect24(() => {
|
|
4988
5178
|
if (maxCallDuration === null || endTimeRef.current !== null)
|
|
4989
5179
|
return;
|
|
4990
5180
|
const endTime = Date.now() + maxCallDuration * 1000;
|
|
@@ -5001,30 +5191,38 @@ function useSessionRemaining() {
|
|
|
5001
5191
|
}
|
|
5002
5192
|
|
|
5003
5193
|
// src/components/ChatHeader.tsx
|
|
5004
|
-
import { useContext as useContext12, useRef as
|
|
5194
|
+
import { useContext as useContext12, useRef as useRef21 } from "react";
|
|
5005
5195
|
|
|
5006
5196
|
// src/hooks/useElapsedSeconds.ts
|
|
5007
|
-
import { useEffect as
|
|
5008
|
-
function useElapsedSeconds(isRunning) {
|
|
5009
|
-
const [elapsed, setElapsed] =
|
|
5010
|
-
|
|
5011
|
-
|
|
5012
|
-
|
|
5013
|
-
return;
|
|
5014
|
-
}
|
|
5015
|
-
const startedAt = Date.now();
|
|
5197
|
+
import { useEffect as useEffect25, useRef as useRef19, useState as useState18 } from "react";
|
|
5198
|
+
function useElapsedSeconds(isRunning, resetSignal) {
|
|
5199
|
+
const [elapsed, setElapsed] = useState18(0);
|
|
5200
|
+
const accumulatedSecondsRef = useRef19(0);
|
|
5201
|
+
useEffect25(() => {
|
|
5202
|
+
accumulatedSecondsRef.current = 0;
|
|
5016
5203
|
setElapsed(0);
|
|
5017
|
-
|
|
5018
|
-
|
|
5019
|
-
|
|
5020
|
-
|
|
5204
|
+
}, [resetSignal]);
|
|
5205
|
+
useEffect25(() => {
|
|
5206
|
+
if (!isRunning)
|
|
5207
|
+
return;
|
|
5208
|
+
const resumedAt = Date.now();
|
|
5209
|
+
const accumulatedSeconds = accumulatedSecondsRef.current;
|
|
5210
|
+
const totalSeconds = () => accumulatedSeconds + Math.floor((Date.now() - resumedAt) / 1000);
|
|
5211
|
+
const tick = () => setElapsed(totalSeconds());
|
|
5212
|
+
tick();
|
|
5213
|
+
const id = setInterval(tick, 1000);
|
|
5214
|
+
return () => {
|
|
5215
|
+
clearInterval(id);
|
|
5216
|
+
accumulatedSecondsRef.current = totalSeconds();
|
|
5217
|
+
setElapsed(accumulatedSecondsRef.current);
|
|
5218
|
+
};
|
|
5021
5219
|
}, [isRunning]);
|
|
5022
5220
|
return elapsed;
|
|
5023
5221
|
}
|
|
5024
5222
|
|
|
5025
5223
|
// src/hooks/useTextMode.ts
|
|
5026
5224
|
import { useLocalParticipant as useLocalParticipant11 } from "@livekit/components-react/hooks";
|
|
5027
|
-
import { useCallback as useCallback15, useContext as useContext11, useRef as
|
|
5225
|
+
import { useCallback as useCallback15, useContext as useContext11, useRef as useRef20 } from "react";
|
|
5028
5226
|
var textEncoder6 = new TextEncoder;
|
|
5029
5227
|
function useTextMode() {
|
|
5030
5228
|
const ctx = useContext11(LiveAgentContext);
|
|
@@ -5033,7 +5231,7 @@ function useTextMode() {
|
|
|
5033
5231
|
}
|
|
5034
5232
|
const { textMode, setTextModeState, sidebarTab, setSidebarTab } = ctx;
|
|
5035
5233
|
const { localParticipant } = useLocalParticipant11();
|
|
5036
|
-
const confirmedTextModeRef =
|
|
5234
|
+
const confirmedTextModeRef = useRef20(false);
|
|
5037
5235
|
const toggleTextMode = useCallback15(async () => {
|
|
5038
5236
|
const next = !textMode;
|
|
5039
5237
|
setTextModeState(next);
|
|
@@ -5073,8 +5271,9 @@ function ChatHeader() {
|
|
|
5073
5271
|
controlBarRef,
|
|
5074
5272
|
setIsDragging
|
|
5075
5273
|
} = ctx;
|
|
5076
|
-
const
|
|
5077
|
-
const
|
|
5274
|
+
const { isHeld } = useSessionHoldContext();
|
|
5275
|
+
const elapsed = useElapsedSeconds(isConnected && !isHeld, isConnected);
|
|
5276
|
+
const headerRef = useRef21(null);
|
|
5078
5277
|
const followsPanel = variant === "floating" && isPanelOpen;
|
|
5079
5278
|
const dragFollowers = followsPanel ? [panelRef, controlBarRef] : null;
|
|
5080
5279
|
const { wasDraggedRef } = useLauncherDrag(headerRef, commitLauncherDrop, dragFollowers, setIsDragging);
|
|
@@ -5086,7 +5285,7 @@ function ChatHeader() {
|
|
|
5086
5285
|
className: "skippr:flex skippr:items-center skippr:gap-3",
|
|
5087
5286
|
children: [
|
|
5088
5287
|
isConnected && /* @__PURE__ */ jsx14(HeaderModeToggle, {}),
|
|
5089
|
-
isConnected && /* @__PURE__ */ jsxs11("div", {
|
|
5288
|
+
isConnected && !isHeld && /* @__PURE__ */ jsxs11("div", {
|
|
5090
5289
|
className: "skippr:flex skippr:items-center skippr:gap-1.5 skippr:rounded-full skippr:bg-primary-foreground/20 skippr:px-2.5 skippr:py-1",
|
|
5091
5290
|
children: [
|
|
5092
5291
|
/* @__PURE__ */ jsxs11("span", {
|
|
@@ -5120,7 +5319,7 @@ function ChatHeader() {
|
|
|
5120
5319
|
},
|
|
5121
5320
|
"aria-label": "Close",
|
|
5122
5321
|
title: "Close",
|
|
5123
|
-
className: "skippr:flex skippr:h-8 skippr:w-8 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-lg skippr:text-primary-foreground/70 skippr:transition-colors skippr:hover:bg-
|
|
5322
|
+
className: "skippr:flex skippr:h-8 skippr:w-8 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-lg skippr:text-primary-foreground/70 skippr:transition-colors skippr:hover:bg-primary-foreground/10 skippr:hover:text-primary-foreground skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-primary-foreground",
|
|
5124
5323
|
children: /* @__PURE__ */ jsx14(X, {
|
|
5125
5324
|
className: "skippr:h-4 skippr:w-4"
|
|
5126
5325
|
})
|
|
@@ -5134,7 +5333,7 @@ function HeaderModeToggle() {
|
|
|
5134
5333
|
return /* @__PURE__ */ jsxs11("fieldset", {
|
|
5135
5334
|
"aria-label": "Response mode",
|
|
5136
5335
|
disabled: isHeld,
|
|
5137
|
-
className: "skippr:flex skippr:items-center skippr:gap-0.5 skippr:rounded-lg skippr:bg-
|
|
5336
|
+
className: "skippr:flex skippr:items-center skippr:gap-0.5 skippr:rounded-lg skippr:bg-primary-foreground/15 skippr:p-0.5 skippr:text-xs skippr:font-medium skippr:ring-1 skippr:ring-primary-foreground/30 skippr:disabled:opacity-50",
|
|
5138
5337
|
children: [
|
|
5139
5338
|
/* @__PURE__ */ jsx14("button", {
|
|
5140
5339
|
type: "button",
|
|
@@ -5144,7 +5343,7 @@ function HeaderModeToggle() {
|
|
|
5144
5343
|
if (textMode)
|
|
5145
5344
|
toggleTextMode();
|
|
5146
5345
|
},
|
|
5147
|
-
className: cn("skippr:rounded-md skippr:px-2.5 skippr:py-1 skippr:transition-colors skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-
|
|
5346
|
+
className: cn("skippr:rounded-md skippr:px-2.5 skippr:py-1 skippr:transition-colors skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-primary-foreground skippr:disabled:cursor-not-allowed", isHeld ? "skippr:cursor-not-allowed" : "skippr:cursor-pointer", textMode ? "skippr:font-semibold skippr:text-primary-foreground" : "skippr:bg-white skippr:text-foreground skippr:shadow-sm"),
|
|
5148
5347
|
children: "Voice"
|
|
5149
5348
|
}),
|
|
5150
5349
|
/* @__PURE__ */ jsx14("button", {
|
|
@@ -5155,7 +5354,7 @@ function HeaderModeToggle() {
|
|
|
5155
5354
|
if (!textMode)
|
|
5156
5355
|
toggleTextMode();
|
|
5157
5356
|
},
|
|
5158
|
-
className: cn("skippr:rounded-md skippr:px-2.5 skippr:py-1 skippr:transition-colors skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-
|
|
5357
|
+
className: cn("skippr:rounded-md skippr:px-2.5 skippr:py-1 skippr:transition-colors skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-primary-foreground skippr:disabled:cursor-not-allowed", isHeld ? "skippr:cursor-not-allowed" : "skippr:cursor-pointer", textMode ? "skippr:bg-white skippr:text-foreground skippr:shadow-sm" : "skippr:font-semibold skippr:text-primary-foreground"),
|
|
5159
5358
|
children: "Text"
|
|
5160
5359
|
})
|
|
5161
5360
|
]
|
|
@@ -5191,7 +5390,7 @@ function LoadingDots({ label }) {
|
|
|
5191
5390
|
}
|
|
5192
5391
|
|
|
5193
5392
|
// src/components/LoginFlow.tsx
|
|
5194
|
-
import { useCallback as useCallback16, useEffect as
|
|
5393
|
+
import { useCallback as useCallback16, useEffect as useEffect26, useRef as useRef22, useState as useState19 } from "react";
|
|
5195
5394
|
|
|
5196
5395
|
// src/components/ui/button.tsx
|
|
5197
5396
|
import { forwardRef as forwardRef3 } from "react";
|
|
@@ -5227,8 +5426,8 @@ import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
|
5227
5426
|
var OTP_LENGTH = 6;
|
|
5228
5427
|
var DIGIT_KEYS = ["d0", "d1", "d2", "d3", "d4", "d5"];
|
|
5229
5428
|
function LoginFlow({ requestOtp, verifyOtp, error, isSubmitting }) {
|
|
5230
|
-
const [step, setStep] =
|
|
5231
|
-
const [email, setEmail] =
|
|
5429
|
+
const [step, setStep] = useState19("email");
|
|
5430
|
+
const [email, setEmail] = useState19("");
|
|
5232
5431
|
const handleRequestOtp = useCallback16(async (emailValue) => {
|
|
5233
5432
|
const success = await requestOtp(emailValue);
|
|
5234
5433
|
if (success)
|
|
@@ -5317,18 +5516,18 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
|
|
|
5317
5516
|
});
|
|
5318
5517
|
}
|
|
5319
5518
|
function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
5320
|
-
const [digits, setDigits] =
|
|
5321
|
-
const [resendCooldown, setResendCooldown] =
|
|
5322
|
-
const inputRefs =
|
|
5323
|
-
const submittedRef =
|
|
5324
|
-
|
|
5519
|
+
const [digits, setDigits] = useState19(Array(OTP_LENGTH).fill(""));
|
|
5520
|
+
const [resendCooldown, setResendCooldown] = useState19(0);
|
|
5521
|
+
const inputRefs = useRef22([]);
|
|
5522
|
+
const submittedRef = useRef22(false);
|
|
5523
|
+
useEffect26(() => {
|
|
5325
5524
|
inputRefs.current[0]?.focus();
|
|
5326
5525
|
}, []);
|
|
5327
|
-
|
|
5526
|
+
useEffect26(() => {
|
|
5328
5527
|
if (error)
|
|
5329
5528
|
submittedRef.current = false;
|
|
5330
5529
|
}, [error]);
|
|
5331
|
-
|
|
5530
|
+
useEffect26(() => {
|
|
5332
5531
|
if (resendCooldown <= 0)
|
|
5333
5532
|
return;
|
|
5334
5533
|
const timer = setTimeout(() => setResendCooldown((c) => c - 1), 1000);
|
|
@@ -5469,17 +5668,17 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
|
5469
5668
|
}
|
|
5470
5669
|
|
|
5471
5670
|
// src/components/MessageList.tsx
|
|
5472
|
-
import { useCallback as useCallback17, useLayoutEffect as useLayoutEffect3, useRef as
|
|
5671
|
+
import { useCallback as useCallback17, useLayoutEffect as useLayoutEffect3, useRef as useRef24, useState as useState21 } from "react";
|
|
5473
5672
|
|
|
5474
5673
|
// src/components/ChatInput.tsx
|
|
5475
|
-
import { useEffect as
|
|
5674
|
+
import { useEffect as useEffect27, useRef as useRef23, useState as useState20 } from "react";
|
|
5476
5675
|
import { jsx as jsx18, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
5477
5676
|
var MAX_INPUT_HEIGHT = 60;
|
|
5478
5677
|
function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
|
|
5479
|
-
const [inputText, setInputText] =
|
|
5480
|
-
const textareaRef =
|
|
5678
|
+
const [inputText, setInputText] = useState20("");
|
|
5679
|
+
const textareaRef = useRef23(null);
|
|
5481
5680
|
const canSend = inputText.trim().length > 0 && !isSendingChat;
|
|
5482
|
-
|
|
5681
|
+
useEffect27(() => {
|
|
5483
5682
|
if (autoFocus)
|
|
5484
5683
|
textareaRef.current?.focus();
|
|
5485
5684
|
}, [autoFocus]);
|
|
@@ -5570,7 +5769,7 @@ function ChatMessage({ message }) {
|
|
|
5570
5769
|
}
|
|
5571
5770
|
|
|
5572
5771
|
// src/components/PlanCard.tsx
|
|
5573
|
-
import { useEffect as
|
|
5772
|
+
import { useEffect as useEffect28 } from "react";
|
|
5574
5773
|
import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
5575
5774
|
var APPROVE_MESSAGE = "Yes, go ahead.";
|
|
5576
5775
|
var CANCEL_MESSAGE = "No, cancel that.";
|
|
@@ -5597,7 +5796,7 @@ function StepIcon({ status }) {
|
|
|
5597
5796
|
}
|
|
5598
5797
|
function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
5599
5798
|
const awaitingApproval = plan.state === "proposed";
|
|
5600
|
-
|
|
5799
|
+
useEffect28(() => {
|
|
5601
5800
|
if (plan.state !== "completed")
|
|
5602
5801
|
return;
|
|
5603
5802
|
const timer = setTimeout(onDismiss, COMPLETED_CARD_VISIBLE_MS);
|
|
@@ -5690,12 +5889,12 @@ function MessageList({
|
|
|
5690
5889
|
autoFocus = false,
|
|
5691
5890
|
readOnly = false
|
|
5692
5891
|
}) {
|
|
5693
|
-
const containerRef =
|
|
5694
|
-
const isPinnedToBottom =
|
|
5695
|
-
const lastSeenMessageId =
|
|
5696
|
-
const [showJumpToLatest, setShowJumpToLatest] =
|
|
5892
|
+
const containerRef = useRef24(null);
|
|
5893
|
+
const isPinnedToBottom = useRef24(true);
|
|
5894
|
+
const lastSeenMessageId = useRef24(undefined);
|
|
5895
|
+
const [showJumpToLatest, setShowJumpToLatest] = useState21(false);
|
|
5697
5896
|
const lastMessage = messages.length > 0 ? messages[messages.length - 1] : undefined;
|
|
5698
|
-
const [dismissedPlanId, setDismissedPlanId] =
|
|
5897
|
+
const [dismissedPlanId, setDismissedPlanId] = useState21(null);
|
|
5699
5898
|
const dismissPlan = useCallback17(() => {
|
|
5700
5899
|
if (plan)
|
|
5701
5900
|
setDismissedPlanId(plan.planId);
|
|
@@ -5891,6 +6090,7 @@ function Sidebar({
|
|
|
5891
6090
|
const defaultAgentId = internalCtx?.defaultAgentId ?? null;
|
|
5892
6091
|
const startDefaultSession = internalCtx?.startDefaultSession ?? (() => {});
|
|
5893
6092
|
const talkDisabled = !(internalCtx?.hasResolvedModules ?? false);
|
|
6093
|
+
const hasResolvedModules = useOnceTrue(internalCtx?.hasResolvedModules ?? false);
|
|
5894
6094
|
const usesHostAuth = internalCtx?.usesHostAuth ?? false;
|
|
5895
6095
|
const authFailed = internalCtx?.authFailed ?? false;
|
|
5896
6096
|
const idleHistory = internalCtx?.idleHistory ?? {
|
|
@@ -5916,7 +6116,7 @@ function Sidebar({
|
|
|
5916
6116
|
height: panelExpanded ? availableHeight : `min(${PANEL_MAX_HEIGHT_PX}px, ${availableHeight})`
|
|
5917
6117
|
};
|
|
5918
6118
|
}
|
|
5919
|
-
|
|
6119
|
+
useEffect29(() => {
|
|
5920
6120
|
if (!isSidebar)
|
|
5921
6121
|
return;
|
|
5922
6122
|
const prop = position === "right" ? "marginRight" : "marginLeft";
|
|
@@ -5936,7 +6136,7 @@ function Sidebar({
|
|
|
5936
6136
|
style: { width: isPanelOpen ? SIDEBAR_WIDTH : undefined, ...floatingStyle },
|
|
5937
6137
|
children: [
|
|
5938
6138
|
!hideHeader && /* @__PURE__ */ jsx25(ChatHeader, {}),
|
|
5939
|
-
authFailed ? /* @__PURE__ */ jsx25(AuthError, {}) : isAuthenticated ? /* @__PURE__ */ jsx25(AuthenticatedContent, {
|
|
6139
|
+
authFailed ? /* @__PURE__ */ jsx25(AuthError, {}) : isAuthenticated && hasResolvedModules ? /* @__PURE__ */ jsx25(AuthenticatedContent, {
|
|
5940
6140
|
isConnected,
|
|
5941
6141
|
isPaused,
|
|
5942
6142
|
isPausing,
|
|
@@ -5952,7 +6152,7 @@ function Sidebar({
|
|
|
5952
6152
|
onTalk: startDefaultSession,
|
|
5953
6153
|
talkLabel: startSessionLabel,
|
|
5954
6154
|
talkDisabled
|
|
5955
|
-
}) : usesHostAuth || isValidating ? /* @__PURE__ */ jsx25("div", {
|
|
6155
|
+
}) : usesHostAuth || isValidating || isAuthenticated ? /* @__PURE__ */ jsx25("div", {
|
|
5956
6156
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
|
|
5957
6157
|
children: /* @__PURE__ */ jsx25(LoadingDots, {
|
|
5958
6158
|
label: "Loading..."
|
|
@@ -6246,6 +6446,7 @@ function SidebarTrigger() {
|
|
|
6246
6446
|
const internalCtx = useContext14(LiveAgentContext);
|
|
6247
6447
|
const launcherBottomPx = internalCtx?.launcherBottomPx ?? DEFAULT_LAUNCHER_BOTTOM_PX;
|
|
6248
6448
|
const popsDown = internalCtx?.popsDown ?? false;
|
|
6449
|
+
const logoUrl = internalCtx?.appearance?.logoUrl ?? null;
|
|
6249
6450
|
if (isMinimized || isConnected || isStarting || isPausing)
|
|
6250
6451
|
return null;
|
|
6251
6452
|
const handleClick = isPanelOpen && minimizable ? minimizePanel : togglePanel;
|
|
@@ -6258,6 +6459,10 @@ function SidebarTrigger() {
|
|
|
6258
6459
|
className: cn("skippr:fixed skippr:z-[9998]", "skippr:flex skippr:size-12 skippr:items-center skippr:justify-center", "skippr:shadow-[0_4px_16px_rgba(45,43,61,0.45),0_2px_4px_rgba(0,0,0,0.1)] skippr:transition-all", "skippr:cursor-pointer skippr:hover:brightness-110 skippr:hover:-translate-y-0.5 skippr:active:translate-y-0", isPanelOpen ? "skippr:rounded-[14px] skippr:bg-bubble skippr:text-white" : "skippr:rounded-[10px] skippr:overflow-hidden", position === "right" ? "skippr:right-6" : "skippr:left-6"),
|
|
6259
6460
|
children: isPanelOpen ? /* @__PURE__ */ jsx27(ChevronDown, {
|
|
6260
6461
|
className: "skippr:size-5"
|
|
6462
|
+
}) : logoUrl ? /* @__PURE__ */ jsx27("img", {
|
|
6463
|
+
src: logoUrl,
|
|
6464
|
+
alt: "",
|
|
6465
|
+
className: "skippr:size-12 skippr:object-cover"
|
|
6261
6466
|
}) : /* @__PURE__ */ jsx27(Logo, {
|
|
6262
6467
|
className: "skippr:size-12"
|
|
6263
6468
|
})
|
|
@@ -6266,6 +6471,14 @@ function SidebarTrigger() {
|
|
|
6266
6471
|
|
|
6267
6472
|
// src/components/LiveAgent.tsx
|
|
6268
6473
|
import { jsx as jsx28, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
6474
|
+
function readSavedPosition() {
|
|
6475
|
+
try {
|
|
6476
|
+
const saved = localStorage.getItem("skippr_widget_position");
|
|
6477
|
+
return saved === "left" || saved === "right" ? saved : null;
|
|
6478
|
+
} catch {
|
|
6479
|
+
return null;
|
|
6480
|
+
}
|
|
6481
|
+
}
|
|
6269
6482
|
function readSavedLauncherBottom() {
|
|
6270
6483
|
try {
|
|
6271
6484
|
const saved = Number.parseInt(localStorage.getItem("skippr_widget_bottom") ?? "", 10);
|
|
@@ -6283,8 +6496,8 @@ function AgentCursorMount({ animated }) {
|
|
|
6283
6496
|
function PlanPanelOpener() {
|
|
6284
6497
|
const plan = usePlanUpdates();
|
|
6285
6498
|
const { expandPanel } = useLiveAgent();
|
|
6286
|
-
const surfacedPlanIdRef =
|
|
6287
|
-
|
|
6499
|
+
const surfacedPlanIdRef = useRef25(null);
|
|
6500
|
+
useEffect30(() => {
|
|
6288
6501
|
if (plan?.state !== "proposed" || surfacedPlanIdRef.current === plan.planId)
|
|
6289
6502
|
return;
|
|
6290
6503
|
surfacedPlanIdRef.current = plan.planId;
|
|
@@ -6299,8 +6512,7 @@ function LiveAgent(props) {
|
|
|
6299
6512
|
appKey,
|
|
6300
6513
|
getUserToken,
|
|
6301
6514
|
userToken,
|
|
6302
|
-
|
|
6303
|
-
verticalAlign = "bottom",
|
|
6515
|
+
verticalAlign: hostVerticalAlign,
|
|
6304
6516
|
variant = "floating",
|
|
6305
6517
|
minimizable = true,
|
|
6306
6518
|
defaultOpen = false,
|
|
@@ -6324,7 +6536,7 @@ function LiveAgent(props) {
|
|
|
6324
6536
|
const auth = useAuth({ appKey });
|
|
6325
6537
|
const usesHostAuth = !!getUserToken || !!userToken || !!authTokenProp;
|
|
6326
6538
|
const effectiveAuthToken = usesHostAuth ? authTokenProp : auth.authToken ?? undefined;
|
|
6327
|
-
const [activeModule, setActiveModule] =
|
|
6539
|
+
const [activeModule, setActiveModule] = useState22(null);
|
|
6328
6540
|
const minimizeOnSessionStart = useCallback18(() => {
|
|
6329
6541
|
if (minimizable) {
|
|
6330
6542
|
setIsMinimized(true);
|
|
@@ -6370,7 +6582,7 @@ function LiveAgent(props) {
|
|
|
6370
6582
|
onStartError: expandOnSessionStartError,
|
|
6371
6583
|
onDisconnect: minimizeOnSessionDisconnect
|
|
6372
6584
|
});
|
|
6373
|
-
const teardownInFlightRef =
|
|
6585
|
+
const teardownInFlightRef = useRef25(false);
|
|
6374
6586
|
teardownInFlightRef.current = isPaused || isPausing || isDisconnecting;
|
|
6375
6587
|
const handleRoomDisconnected = useCallback18(() => {
|
|
6376
6588
|
if (teardownInFlightRef.current)
|
|
@@ -6378,28 +6590,29 @@ function LiveAgent(props) {
|
|
|
6378
6590
|
disconnect();
|
|
6379
6591
|
}, [disconnect]);
|
|
6380
6592
|
const isSessionLive = connection !== null || isStarting || isPausing || isDisconnecting;
|
|
6381
|
-
const [isPanelOpen, setIsPanelOpen] =
|
|
6382
|
-
const [isMinimized, setIsMinimized] =
|
|
6383
|
-
const [sidebarTab, setSidebarTab] =
|
|
6384
|
-
const [phasesSnapshot, setPhasesSnapshot] =
|
|
6385
|
-
const [textMode, setTextMode] =
|
|
6386
|
-
const [panelExpanded, setPanelExpanded] =
|
|
6593
|
+
const [isPanelOpen, setIsPanelOpen] = useState22(defaultOpen);
|
|
6594
|
+
const [isMinimized, setIsMinimized] = useState22(minimizable && !defaultOpen);
|
|
6595
|
+
const [sidebarTab, setSidebarTab] = useState22("agenda");
|
|
6596
|
+
const [phasesSnapshot, setPhasesSnapshot] = useState22([]);
|
|
6597
|
+
const [textMode, setTextMode] = useState22(false);
|
|
6598
|
+
const [panelExpanded, setPanelExpanded] = useState22(false);
|
|
6387
6599
|
const togglePanelExpanded = useCallback18(() => setPanelExpanded((prev) => !prev), []);
|
|
6388
|
-
const panelRef =
|
|
6389
|
-
const controlBarRef =
|
|
6390
|
-
const [isDragging, setIsDragging] =
|
|
6600
|
+
const panelRef = useRef25(null);
|
|
6601
|
+
const controlBarRef = useRef25(null);
|
|
6602
|
+
const [isDragging, setIsDragging] = useState22(false);
|
|
6391
6603
|
const setTextModeState = useCallback18((enabled) => {
|
|
6392
6604
|
setTextMode(enabled);
|
|
6393
6605
|
}, []);
|
|
6394
6606
|
const isConnected = connection !== null;
|
|
6395
6607
|
const showControlBar = isConnected || isStarting || isPausing;
|
|
6396
|
-
|
|
6608
|
+
useEffect30(() => {
|
|
6397
6609
|
if (!isConnected)
|
|
6398
6610
|
setTextModeState(false);
|
|
6399
6611
|
}, [isConnected, setTextModeState]);
|
|
6400
6612
|
const {
|
|
6401
6613
|
modules: availableModules,
|
|
6402
6614
|
defaultSelection,
|
|
6615
|
+
appearance,
|
|
6403
6616
|
isLoading: isLoadingModules,
|
|
6404
6617
|
hasResolved: hasResolvedModules,
|
|
6405
6618
|
error: modulesError,
|
|
@@ -6410,6 +6623,10 @@ function LiveAgent(props) {
|
|
|
6410
6623
|
authedFetch,
|
|
6411
6624
|
agentId: hostAgentId ?? undefined
|
|
6412
6625
|
});
|
|
6626
|
+
const isAuthenticated = bearerToken !== null || auth.isAuthenticated;
|
|
6627
|
+
const isBootAuthPending = usesHostAuth ? !!appKey && !isAuthenticated && !authFailed : !!appKey && !auth.hasResolvedStoredToken;
|
|
6628
|
+
const isAwaitingModules = isAuthenticated ? !hasResolvedModules : isBootAuthPending;
|
|
6629
|
+
const isLauncherRevealed = useOnceTrue(!isAwaitingModules);
|
|
6413
6630
|
const { goals: adoptionGoals, attendGoal } = useAdoptionGoals({
|
|
6414
6631
|
enabled: !isSessionLive,
|
|
6415
6632
|
bearerToken,
|
|
@@ -6455,27 +6672,38 @@ function LiveAgent(props) {
|
|
|
6455
6672
|
adoptionGoalId: goal.goalId
|
|
6456
6673
|
});
|
|
6457
6674
|
}, [attendGoal, availableModules, startSession]);
|
|
6458
|
-
const [welcomeDismissed, setWelcomeDismissed] =
|
|
6675
|
+
const [welcomeDismissed, setWelcomeDismissed] = useState22(false);
|
|
6459
6676
|
const dismissWelcome = useCallback18(() => setWelcomeDismissed(true), []);
|
|
6460
|
-
const [
|
|
6461
|
-
|
|
6462
|
-
|
|
6463
|
-
if (saved === "left" || saved === "right")
|
|
6464
|
-
return saved;
|
|
6465
|
-
} catch {}
|
|
6466
|
-
return position;
|
|
6467
|
-
});
|
|
6677
|
+
const [savedPosition] = useState22(readSavedPosition);
|
|
6678
|
+
const [currentPosition, setCurrentPosition] = useState22(savedPosition ?? "right");
|
|
6679
|
+
const positionLockedRef = useRef25(savedPosition !== null);
|
|
6468
6680
|
const setPositionWithPersist = useCallback18((pos) => {
|
|
6681
|
+
positionLockedRef.current = true;
|
|
6469
6682
|
setCurrentPosition(pos);
|
|
6470
6683
|
try {
|
|
6471
6684
|
localStorage.setItem("skippr_widget_position", pos);
|
|
6472
6685
|
} catch {}
|
|
6473
6686
|
}, []);
|
|
6474
|
-
const
|
|
6475
|
-
|
|
6476
|
-
|
|
6477
|
-
|
|
6478
|
-
|
|
6687
|
+
const serverPosition = appearance?.position ?? null;
|
|
6688
|
+
useEffect30(() => {
|
|
6689
|
+
if (!serverPosition || positionLockedRef.current)
|
|
6690
|
+
return;
|
|
6691
|
+
setCurrentPosition(serverPosition);
|
|
6692
|
+
}, [serverPosition]);
|
|
6693
|
+
const [savedLauncherBottom] = useState22(readSavedLauncherBottom);
|
|
6694
|
+
const hasDraggedRef = useRef25(savedLauncherBottom !== null);
|
|
6695
|
+
const verticalAlignRef = useRef25(hostVerticalAlign ?? "bottom");
|
|
6696
|
+
const [launcherBottomPx, setLauncherBottomPxState] = useState22(() => savedLauncherBottom !== null ? clampLauncherBottom(savedLauncherBottom) : verticalAlignToBottomPx(verticalAlignRef.current));
|
|
6697
|
+
const [popsDown, setPopsDown] = useState22(() => launcherPopsDown(launcherBottomPx));
|
|
6698
|
+
const serverVerticalAlign = appearance?.verticalAlign ?? null;
|
|
6699
|
+
useEffect30(() => {
|
|
6700
|
+
if (!serverVerticalAlign || hostVerticalAlign !== undefined || hasDraggedRef.current)
|
|
6701
|
+
return;
|
|
6702
|
+
verticalAlignRef.current = serverVerticalAlign;
|
|
6703
|
+
const next = verticalAlignToBottomPx(serverVerticalAlign);
|
|
6704
|
+
setLauncherBottomPxState(next);
|
|
6705
|
+
setPopsDown(launcherPopsDown(next));
|
|
6706
|
+
}, [serverVerticalAlign, hostVerticalAlign]);
|
|
6479
6707
|
const setLauncherBottomPx = useCallback18((px) => {
|
|
6480
6708
|
hasDraggedRef.current = true;
|
|
6481
6709
|
setLauncherBottomPxState(px);
|
|
@@ -6484,13 +6712,13 @@ function LiveAgent(props) {
|
|
|
6484
6712
|
localStorage.setItem("skippr_widget_bottom", String(px));
|
|
6485
6713
|
} catch {}
|
|
6486
6714
|
}, []);
|
|
6487
|
-
const launcherBottomPxRef =
|
|
6715
|
+
const launcherBottomPxRef = useRef25(launcherBottomPx);
|
|
6488
6716
|
launcherBottomPxRef.current = launcherBottomPx;
|
|
6489
6717
|
const commitLauncherDrop = useCallback18(({ side, bottomPx }) => {
|
|
6490
6718
|
setPositionWithPersist(side);
|
|
6491
6719
|
setLauncherBottomPx(bottomPx);
|
|
6492
6720
|
}, [setPositionWithPersist, setLauncherBottomPx]);
|
|
6493
|
-
|
|
6721
|
+
useEffect30(() => {
|
|
6494
6722
|
const syncToViewport = () => {
|
|
6495
6723
|
const next = hasDraggedRef.current ? clampLauncherBottom(launcherBottomPxRef.current) : verticalAlignToBottomPx(verticalAlignRef.current);
|
|
6496
6724
|
setLauncherBottomPxState(next);
|
|
@@ -6517,7 +6745,6 @@ function LiveAgent(props) {
|
|
|
6517
6745
|
await pauseSession();
|
|
6518
6746
|
minimizePanel();
|
|
6519
6747
|
}, [pauseSession, minimizePanel]);
|
|
6520
|
-
const isAuthenticated = bearerToken !== null || auth.isAuthenticated;
|
|
6521
6748
|
const defaultAgentId = hostAgentId ?? defaultSelection.agentId;
|
|
6522
6749
|
const startDefaultSession = useCallback18(() => {
|
|
6523
6750
|
const target = availableModules.find((m) => m.id === defaultAgentId);
|
|
@@ -6614,6 +6841,7 @@ function LiveAgent(props) {
|
|
|
6614
6841
|
refetchModules,
|
|
6615
6842
|
selectModule,
|
|
6616
6843
|
hasResolvedModules,
|
|
6844
|
+
appearance,
|
|
6617
6845
|
adoptionGoals,
|
|
6618
6846
|
startAdoptionSession
|
|
6619
6847
|
}), [
|
|
@@ -6679,6 +6907,7 @@ function LiveAgent(props) {
|
|
|
6679
6907
|
refetchModules,
|
|
6680
6908
|
selectModule,
|
|
6681
6909
|
hasResolvedModules,
|
|
6910
|
+
appearance,
|
|
6682
6911
|
adoptionGoals,
|
|
6683
6912
|
startAdoptionSession
|
|
6684
6913
|
]);
|
|
@@ -6692,47 +6921,50 @@ function LiveAgent(props) {
|
|
|
6692
6921
|
onDisconnected: handleRoomDisconnected,
|
|
6693
6922
|
children: [
|
|
6694
6923
|
connection && !textMode && /* @__PURE__ */ jsx28(RoomAudioRenderer, {}),
|
|
6695
|
-
|
|
6696
|
-
pendingScreenStream,
|
|
6697
|
-
pushOrTapMicMode: isRequestResponseMicMode(agentControls?.micMode)
|
|
6698
|
-
}),
|
|
6699
|
-
connection && captureMode === CAPTURE_MODE.Auto && /* @__PURE__ */ jsx28(DomCapture, {
|
|
6700
|
-
pushOrTapMicMode: isRequestResponseMicMode(agentControls?.micMode)
|
|
6701
|
-
}),
|
|
6702
|
-
/* @__PURE__ */ jsxs22(ShadowHost, {
|
|
6924
|
+
/* @__PURE__ */ jsxs22(SessionHoldProvider, {
|
|
6703
6925
|
children: [
|
|
6704
|
-
connection && captureMode === CAPTURE_MODE.
|
|
6705
|
-
|
|
6706
|
-
|
|
6707
|
-
connection && captureMode === CAPTURE_MODE.Auto && (agentControls?.highlight || agentControls?.actions) && /* @__PURE__ */ jsx28(AgentCursorMount, {
|
|
6708
|
-
animated: shouldAnimateCursor
|
|
6926
|
+
connection && captureMode === CAPTURE_MODE.Screenshare && /* @__PURE__ */ jsx28(AutoStartMedia, {
|
|
6927
|
+
pendingScreenStream,
|
|
6928
|
+
pushOrTapMicMode: isRequestResponseMicMode(agentControls?.micMode)
|
|
6709
6929
|
}),
|
|
6710
|
-
/* @__PURE__ */ jsx28(
|
|
6711
|
-
|
|
6712
|
-
|
|
6713
|
-
|
|
6714
|
-
|
|
6715
|
-
|
|
6716
|
-
|
|
6717
|
-
|
|
6718
|
-
|
|
6719
|
-
|
|
6720
|
-
|
|
6721
|
-
|
|
6722
|
-
|
|
6723
|
-
|
|
6724
|
-
|
|
6725
|
-
|
|
6726
|
-
|
|
6727
|
-
|
|
6728
|
-
|
|
6930
|
+
connection && captureMode === CAPTURE_MODE.Auto && /* @__PURE__ */ jsx28(DomCapture, {
|
|
6931
|
+
pushOrTapMicMode: isRequestResponseMicMode(agentControls?.micMode)
|
|
6932
|
+
}),
|
|
6933
|
+
/* @__PURE__ */ jsxs22(ShadowHost, {
|
|
6934
|
+
accentColor: appearance?.accentColor ?? null,
|
|
6935
|
+
children: [
|
|
6936
|
+
connection && captureMode === CAPTURE_MODE.Auto && agentControls?.highlight && /* @__PURE__ */ jsx28(HighlightOverlay, {}),
|
|
6937
|
+
connection && captureMode === CAPTURE_MODE.Auto && agentControls?.actions && /* @__PURE__ */ jsx28(PageActionHandler, {}),
|
|
6938
|
+
connection && captureMode === CAPTURE_MODE.Auto && agentControls?.actions && /* @__PURE__ */ jsx28(PlanPanelOpener, {}),
|
|
6939
|
+
connection && captureMode === CAPTURE_MODE.Auto && (agentControls?.highlight || agentControls?.actions) && /* @__PURE__ */ jsx28(AgentCursorMount, {
|
|
6940
|
+
animated: shouldAnimateCursor
|
|
6941
|
+
}),
|
|
6942
|
+
/* @__PURE__ */ jsx28(VoiceTurnProvider, {
|
|
6943
|
+
children: /* @__PURE__ */ jsx28(TranscriptionsProvider, {
|
|
6944
|
+
children: /* @__PURE__ */ jsxs22("div", {
|
|
6945
|
+
id: WIDGET_ROOT_ID,
|
|
6946
|
+
children: [
|
|
6947
|
+
isMinimized && !showControlBar && isLauncherRevealed && /* @__PURE__ */ jsx28(MinimizedBubble, {
|
|
6948
|
+
welcomeMessage,
|
|
6949
|
+
welcomeDismissed,
|
|
6950
|
+
onDismissWelcome: dismissWelcome
|
|
6951
|
+
}),
|
|
6952
|
+
showControlBar && !hideControls && /* @__PURE__ */ jsx28(SessionControlBar, {}),
|
|
6953
|
+
/* @__PURE__ */ jsx28(SidebarTrigger, {}),
|
|
6954
|
+
/* @__PURE__ */ jsx28(Sidebar, {
|
|
6955
|
+
hideControls,
|
|
6956
|
+
hideHeader,
|
|
6957
|
+
startSessionLabel
|
|
6958
|
+
})
|
|
6959
|
+
]
|
|
6960
|
+
})
|
|
6729
6961
|
})
|
|
6730
6962
|
})
|
|
6731
|
-
|
|
6732
|
-
})
|
|
6963
|
+
]
|
|
6964
|
+
}),
|
|
6965
|
+
children
|
|
6733
6966
|
]
|
|
6734
|
-
})
|
|
6735
|
-
children
|
|
6967
|
+
})
|
|
6736
6968
|
]
|
|
6737
6969
|
})
|
|
6738
6970
|
});
|
|
@@ -6743,9 +6975,14 @@ function useIsLocalSpeaking() {
|
|
|
6743
6975
|
const { localParticipant } = useLocalParticipant12();
|
|
6744
6976
|
return useIsSpeaking(localParticipant);
|
|
6745
6977
|
}
|
|
6978
|
+
// src/hooks/useIsSessionHeld.ts
|
|
6979
|
+
function useIsSessionHeld() {
|
|
6980
|
+
return useSessionHoldContext().isHeld;
|
|
6981
|
+
}
|
|
6746
6982
|
export {
|
|
6747
6983
|
useMediaControls,
|
|
6748
6984
|
useLiveAgent,
|
|
6985
|
+
useIsSessionHeld,
|
|
6749
6986
|
useIsLocalSpeaking,
|
|
6750
6987
|
useElapsedSeconds,
|
|
6751
6988
|
useAgentVoiceState,
|