@skippr/live-agent-sdk 0.43.0 → 0.45.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 +10 -4
- package/dist/esm/lib-exports.js +1023 -450
- package/dist/skippr-sdk.css +1 -1
- package/dist/skippr-sdk.js +142 -142
- package/dist/types/capture/a11yTree.d.ts +1 -0
- package/dist/types/capture/agentActionSignal.d.ts +4 -0
- package/dist/types/capture/elementRef.d.ts +2 -0
- package/dist/types/components/AdoptionBubble.d.ts +8 -0
- package/dist/types/components/AgentActivityIndicator.d.ts +7 -0
- package/dist/types/components/PageActionHandler.d.ts +1 -0
- package/dist/types/context/LiveAgentContext.d.ts +14 -0
- package/dist/types/hooks/useAdoptionGoals.d.ts +14 -0
- package/dist/types/hooks/useSession.d.ts +2 -1
- package/dist/types/lib/constants.d.ts +1 -0
- package/dist/types/lib/navigation.d.ts +3 -0
- package/package.json +1 -1
package/dist/esm/lib-exports.js
CHANGED
|
@@ -8,15 +8,123 @@ 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
|
|
11
|
+
import { useCallback as useCallback10, useMemo as useMemo5, useRef as useRef13, useState as useState15 } from "react";
|
|
12
12
|
|
|
13
13
|
// src/context/LiveAgentContext.tsx
|
|
14
14
|
import { createContext } from "react";
|
|
15
15
|
var LiveAgentContext = createContext(null);
|
|
16
16
|
|
|
17
|
-
// src/hooks/
|
|
17
|
+
// src/hooks/useAdoptionGoals.ts
|
|
18
18
|
import { useCallback, useEffect, useState } from "react";
|
|
19
|
+
|
|
20
|
+
// src/lib/navigation.ts
|
|
21
|
+
var listeners = new Set;
|
|
22
|
+
var patched = false;
|
|
23
|
+
var lastHref = "";
|
|
24
|
+
function emit() {
|
|
25
|
+
if (window.location.href === lastHref)
|
|
26
|
+
return;
|
|
27
|
+
lastHref = window.location.href;
|
|
28
|
+
for (const listener of listeners)
|
|
29
|
+
listener();
|
|
30
|
+
}
|
|
31
|
+
function ensurePatched() {
|
|
32
|
+
if (patched)
|
|
33
|
+
return;
|
|
34
|
+
patched = true;
|
|
35
|
+
lastHref = window.location.href;
|
|
36
|
+
const originalPushState = history.pushState.bind(history);
|
|
37
|
+
const originalReplaceState = history.replaceState.bind(history);
|
|
38
|
+
history.pushState = (...args) => {
|
|
39
|
+
originalPushState(...args);
|
|
40
|
+
emit();
|
|
41
|
+
};
|
|
42
|
+
history.replaceState = (...args) => {
|
|
43
|
+
originalReplaceState(...args);
|
|
44
|
+
emit();
|
|
45
|
+
};
|
|
46
|
+
window.addEventListener("popstate", emit);
|
|
47
|
+
window.addEventListener("hashchange", emit);
|
|
48
|
+
}
|
|
49
|
+
function subscribeToLocationChange(listener) {
|
|
50
|
+
ensurePatched();
|
|
51
|
+
listeners.add(listener);
|
|
52
|
+
return () => {
|
|
53
|
+
listeners.delete(listener);
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// src/hooks/useAdoptionGoals.ts
|
|
19
58
|
var API_URL = "https://specialist.skippr.ai/api";
|
|
59
|
+
var MATCH_DEBOUNCE_MS = 400;
|
|
60
|
+
function useAdoptionGoals({
|
|
61
|
+
enabled,
|
|
62
|
+
bearerToken,
|
|
63
|
+
authedFetch
|
|
64
|
+
}) {
|
|
65
|
+
const [goals, setGoals] = useState([]);
|
|
66
|
+
const match = useCallback(async () => {
|
|
67
|
+
try {
|
|
68
|
+
const resp = await authedFetch(`${API_URL}/v1/adoption/goals/match`, {
|
|
69
|
+
method: "POST",
|
|
70
|
+
headers: { "Content-Type": "application/json" },
|
|
71
|
+
body: JSON.stringify({ url: window.location.origin + window.location.pathname })
|
|
72
|
+
});
|
|
73
|
+
if (!resp.ok) {
|
|
74
|
+
setGoals([]);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const data = await resp.json();
|
|
78
|
+
setGoals(Array.isArray(data?.goals) ? data.goals : []);
|
|
79
|
+
} catch (e) {
|
|
80
|
+
console.warn("[Skippr] adoption match failed", e);
|
|
81
|
+
setGoals([]);
|
|
82
|
+
}
|
|
83
|
+
}, [authedFetch]);
|
|
84
|
+
useEffect(() => {
|
|
85
|
+
if (!enabled || !bearerToken) {
|
|
86
|
+
setGoals([]);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
match();
|
|
90
|
+
let lastPath = window.location.pathname;
|
|
91
|
+
let timer;
|
|
92
|
+
const unsubscribe = subscribeToLocationChange(() => {
|
|
93
|
+
if (window.location.pathname === lastPath)
|
|
94
|
+
return;
|
|
95
|
+
lastPath = window.location.pathname;
|
|
96
|
+
if (timer)
|
|
97
|
+
clearTimeout(timer);
|
|
98
|
+
timer = setTimeout(() => {
|
|
99
|
+
match();
|
|
100
|
+
}, MATCH_DEBOUNCE_MS);
|
|
101
|
+
});
|
|
102
|
+
return () => {
|
|
103
|
+
if (timer)
|
|
104
|
+
clearTimeout(timer);
|
|
105
|
+
unsubscribe();
|
|
106
|
+
};
|
|
107
|
+
}, [enabled, bearerToken, match]);
|
|
108
|
+
const postStatus = useCallback((goalId, status) => {
|
|
109
|
+
authedFetch(`${API_URL}/v1/adoption/goals/${goalId}/status`, {
|
|
110
|
+
method: "POST",
|
|
111
|
+
headers: { "Content-Type": "application/json" },
|
|
112
|
+
body: JSON.stringify({ status })
|
|
113
|
+
}).catch((e) => console.warn("[Skippr] adoption status update failed", e));
|
|
114
|
+
}, [authedFetch]);
|
|
115
|
+
const dismissGoal = useCallback((goalId) => {
|
|
116
|
+
setGoals((prev) => prev.filter((goal) => goal.goalId !== goalId));
|
|
117
|
+
postStatus(goalId, "dismissed" /* Dismissed */);
|
|
118
|
+
}, [postStatus]);
|
|
119
|
+
const attendGoal = useCallback((goalId) => {
|
|
120
|
+
postStatus(goalId, "attended" /* Attended */);
|
|
121
|
+
}, [postStatus]);
|
|
122
|
+
return { goals, dismissGoal, attendGoal };
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// src/hooks/useAuth.ts
|
|
126
|
+
import { useCallback as useCallback2, useEffect as useEffect2, useState as useState2 } from "react";
|
|
127
|
+
var API_URL2 = "https://specialist.skippr.ai/api";
|
|
20
128
|
function storageKey(appKey) {
|
|
21
129
|
return `skippr_auth_${appKey}`;
|
|
22
130
|
}
|
|
@@ -42,12 +150,12 @@ function clearStoredToken(appKey) {
|
|
|
42
150
|
}
|
|
43
151
|
}
|
|
44
152
|
function useAuth({ appKey }) {
|
|
45
|
-
const [authToken, setAuthToken] =
|
|
46
|
-
const [isValidating, setIsValidating] =
|
|
47
|
-
const [isSubmitting, setIsSubmitting] =
|
|
48
|
-
const [error, setError] =
|
|
153
|
+
const [authToken, setAuthToken] = useState2(null);
|
|
154
|
+
const [isValidating, setIsValidating] = useState2(false);
|
|
155
|
+
const [isSubmitting, setIsSubmitting] = useState2(false);
|
|
156
|
+
const [error, setError] = useState2("");
|
|
49
157
|
const isAuthenticated = authToken !== null;
|
|
50
|
-
|
|
158
|
+
useEffect2(() => {
|
|
51
159
|
if (!appKey)
|
|
52
160
|
return;
|
|
53
161
|
const stored = getStoredToken(appKey);
|
|
@@ -56,7 +164,7 @@ function useAuth({ appKey }) {
|
|
|
56
164
|
async function validateStoredToken() {
|
|
57
165
|
setIsValidating(true);
|
|
58
166
|
try {
|
|
59
|
-
const res = await fetch(`${
|
|
167
|
+
const res = await fetch(`${API_URL2}/v1/auth/validate-token`, {
|
|
60
168
|
credentials: "omit",
|
|
61
169
|
headers: { Authorization: `Bearer ${stored}` }
|
|
62
170
|
});
|
|
@@ -73,7 +181,7 @@ function useAuth({ appKey }) {
|
|
|
73
181
|
}
|
|
74
182
|
validateStoredToken();
|
|
75
183
|
}, [appKey]);
|
|
76
|
-
|
|
184
|
+
useEffect2(() => {
|
|
77
185
|
function handleLogout() {
|
|
78
186
|
setAuthToken(null);
|
|
79
187
|
setError("");
|
|
@@ -81,13 +189,13 @@ function useAuth({ appKey }) {
|
|
|
81
189
|
window.addEventListener("skippr:logout", handleLogout);
|
|
82
190
|
return () => window.removeEventListener("skippr:logout", handleLogout);
|
|
83
191
|
}, []);
|
|
84
|
-
const requestOtp =
|
|
192
|
+
const requestOtp = useCallback2(async (email) => {
|
|
85
193
|
if (!appKey)
|
|
86
194
|
return false;
|
|
87
195
|
setIsSubmitting(true);
|
|
88
196
|
setError("");
|
|
89
197
|
try {
|
|
90
|
-
const resp = await fetch(`${
|
|
198
|
+
const resp = await fetch(`${API_URL2}/v1/auth/request-otp`, {
|
|
91
199
|
method: "POST",
|
|
92
200
|
credentials: "omit",
|
|
93
201
|
headers: {
|
|
@@ -108,13 +216,13 @@ function useAuth({ appKey }) {
|
|
|
108
216
|
setIsSubmitting(false);
|
|
109
217
|
}
|
|
110
218
|
}, [appKey]);
|
|
111
|
-
const verifyOtp =
|
|
219
|
+
const verifyOtp = useCallback2(async (email, code) => {
|
|
112
220
|
if (!appKey)
|
|
113
221
|
return;
|
|
114
222
|
setIsSubmitting(true);
|
|
115
223
|
setError("");
|
|
116
224
|
try {
|
|
117
|
-
const resp = await fetch(`${
|
|
225
|
+
const resp = await fetch(`${API_URL2}/v1/auth/verify-otp`, {
|
|
118
226
|
method: "POST",
|
|
119
227
|
credentials: "omit",
|
|
120
228
|
headers: {
|
|
@@ -137,7 +245,7 @@ function useAuth({ appKey }) {
|
|
|
137
245
|
setIsSubmitting(false);
|
|
138
246
|
}
|
|
139
247
|
}, [appKey]);
|
|
140
|
-
const logout =
|
|
248
|
+
const logout = useCallback2(async () => {
|
|
141
249
|
const token = authToken;
|
|
142
250
|
if (appKey)
|
|
143
251
|
clearStoredToken(appKey);
|
|
@@ -146,7 +254,7 @@ function useAuth({ appKey }) {
|
|
|
146
254
|
if (!token)
|
|
147
255
|
return;
|
|
148
256
|
try {
|
|
149
|
-
await fetch(`${
|
|
257
|
+
await fetch(`${API_URL2}/v1/auth/logout`, {
|
|
150
258
|
method: "POST",
|
|
151
259
|
credentials: "omit",
|
|
152
260
|
headers: { Authorization: `Bearer ${token}` }
|
|
@@ -168,21 +276,21 @@ function useAuth({ appKey }) {
|
|
|
168
276
|
}
|
|
169
277
|
|
|
170
278
|
// src/hooks/useAvailableModules.ts
|
|
171
|
-
import { useCallback as
|
|
172
|
-
var
|
|
279
|
+
import { useCallback as useCallback3, useEffect as useEffect3, useState as useState3 } from "react";
|
|
280
|
+
var API_URL3 = "https://specialist.skippr.ai/api";
|
|
173
281
|
function useAvailableModules({
|
|
174
282
|
enabled,
|
|
175
283
|
bearerToken,
|
|
176
284
|
authedFetch
|
|
177
285
|
}) {
|
|
178
|
-
const [modules, setModules] =
|
|
179
|
-
const [isLoading, setIsLoading] =
|
|
180
|
-
const [error, setError] =
|
|
181
|
-
const fetchModules =
|
|
286
|
+
const [modules, setModules] = useState3([]);
|
|
287
|
+
const [isLoading, setIsLoading] = useState3(false);
|
|
288
|
+
const [error, setError] = useState3(null);
|
|
289
|
+
const fetchModules = useCallback3(async () => {
|
|
182
290
|
setIsLoading(true);
|
|
183
291
|
setError(null);
|
|
184
292
|
try {
|
|
185
|
-
const resp = await authedFetch(`${
|
|
293
|
+
const resp = await authedFetch(`${API_URL3}/v1/modules/available`);
|
|
186
294
|
if (!resp.ok) {
|
|
187
295
|
const body = await resp.json().catch(() => null);
|
|
188
296
|
throw new Error(body?.detail || `Failed to load modules: ${resp.status}`);
|
|
@@ -195,7 +303,7 @@ function useAvailableModules({
|
|
|
195
303
|
setIsLoading(false);
|
|
196
304
|
}
|
|
197
305
|
}, [authedFetch]);
|
|
198
|
-
|
|
306
|
+
useEffect3(() => {
|
|
199
307
|
if (!enabled || !bearerToken)
|
|
200
308
|
return;
|
|
201
309
|
fetchModules();
|
|
@@ -209,11 +317,11 @@ function useAvailableModules({
|
|
|
209
317
|
}
|
|
210
318
|
|
|
211
319
|
// src/hooks/useSession.ts
|
|
212
|
-
import { useCallback as
|
|
213
|
-
var
|
|
320
|
+
import { useCallback as useCallback4, useEffect as useEffect4, useRef, useState as useState4 } from "react";
|
|
321
|
+
var API_URL4 = "https://specialist.skippr.ai/api";
|
|
214
322
|
async function fetchSessionMessages(sessionId, authedFetch) {
|
|
215
323
|
try {
|
|
216
|
-
const resp = await authedFetch(`${
|
|
324
|
+
const resp = await authedFetch(`${API_URL4}/v1/sessions/${sessionId}/messages`);
|
|
217
325
|
if (!resp.ok)
|
|
218
326
|
return [];
|
|
219
327
|
const { messages } = await resp.json();
|
|
@@ -243,7 +351,7 @@ function stopStream(stream) {
|
|
|
243
351
|
track.stop();
|
|
244
352
|
}
|
|
245
353
|
async function exchangeForBearerToken(appKey, userToken) {
|
|
246
|
-
const resp = await fetch(`${
|
|
354
|
+
const resp = await fetch(`${API_URL4}/v1/auth/token-exchange`, {
|
|
247
355
|
method: "POST",
|
|
248
356
|
credentials: "omit",
|
|
249
357
|
headers: {
|
|
@@ -267,26 +375,26 @@ function useSession({
|
|
|
267
375
|
onStartError,
|
|
268
376
|
onDisconnect
|
|
269
377
|
}) {
|
|
270
|
-
const [connection, setConnection] =
|
|
271
|
-
const [shouldConnect, setShouldConnect] =
|
|
272
|
-
const [isStarting, setIsStarting] =
|
|
273
|
-
const [isDisconnecting, setIsDisconnecting] =
|
|
274
|
-
const [error, setError] =
|
|
275
|
-
const [errorCode, setErrorCode] =
|
|
276
|
-
const [sessionId, setSessionId] =
|
|
277
|
-
const [bearerToken, setBearerToken] =
|
|
278
|
-
const [pendingScreenStream, setPendingScreenStream] =
|
|
279
|
-
const [isPaused, setIsPaused] =
|
|
280
|
-
const [isPausing, setIsPausing] =
|
|
281
|
-
const [historyMessages, setHistoryMessages] =
|
|
282
|
-
const [authFailed, setAuthFailed] =
|
|
378
|
+
const [connection, setConnection] = useState4(null);
|
|
379
|
+
const [shouldConnect, setShouldConnect] = useState4(false);
|
|
380
|
+
const [isStarting, setIsStarting] = useState4(false);
|
|
381
|
+
const [isDisconnecting, setIsDisconnecting] = useState4(false);
|
|
382
|
+
const [error, setError] = useState4("");
|
|
383
|
+
const [errorCode, setErrorCode] = useState4(null);
|
|
384
|
+
const [sessionId, setSessionId] = useState4(null);
|
|
385
|
+
const [bearerToken, setBearerToken] = useState4(authToken ?? null);
|
|
386
|
+
const [pendingScreenStream, setPendingScreenStream] = useState4(null);
|
|
387
|
+
const [isPaused, setIsPaused] = useState4(false);
|
|
388
|
+
const [isPausing, setIsPausing] = useState4(false);
|
|
389
|
+
const [historyMessages, setHistoryMessages] = useState4([]);
|
|
390
|
+
const [authFailed, setAuthFailed] = useState4(false);
|
|
283
391
|
const tokenRef = useRef(authToken ? { token: authToken, expiresAt: null } : null);
|
|
284
392
|
const getUserTokenRef = useRef(getUserToken);
|
|
285
393
|
getUserTokenRef.current = getUserToken ?? (userToken ? () => Promise.resolve(userToken) : undefined);
|
|
286
394
|
const failedBearerRef = useRef(null);
|
|
287
395
|
const inFlightExchangeRef = useRef(null);
|
|
288
|
-
const canExchange =
|
|
289
|
-
const reExchange =
|
|
396
|
+
const canExchange = useCallback4(() => !!appKey && !!getUserTokenRef.current, [appKey]);
|
|
397
|
+
const reExchange = useCallback4(async () => {
|
|
290
398
|
if (inFlightExchangeRef.current)
|
|
291
399
|
return inFlightExchangeRef.current;
|
|
292
400
|
const provider = getUserTokenRef.current;
|
|
@@ -306,7 +414,7 @@ function useSession({
|
|
|
306
414
|
inFlightExchangeRef.current = null;
|
|
307
415
|
}
|
|
308
416
|
}, [appKey]);
|
|
309
|
-
const getValidBearer =
|
|
417
|
+
const getValidBearer = useCallback4(async () => {
|
|
310
418
|
const current = tokenRef.current;
|
|
311
419
|
if (current) {
|
|
312
420
|
if (current.expiresAt === null)
|
|
@@ -318,7 +426,7 @@ function useSession({
|
|
|
318
426
|
return reExchange();
|
|
319
427
|
return current?.token ?? null;
|
|
320
428
|
}, [canExchange, reExchange]);
|
|
321
|
-
const authedFetch =
|
|
429
|
+
const authedFetch = useCallback4(async (input, init = {}) => {
|
|
322
430
|
const isSecretMode = canExchange();
|
|
323
431
|
const onTerminalAuthFailure = () => {
|
|
324
432
|
if (isSecretMode)
|
|
@@ -360,7 +468,7 @@ function useSession({
|
|
|
360
468
|
setAuthFailed(false);
|
|
361
469
|
return resp;
|
|
362
470
|
}, [canExchange, getValidBearer, reExchange]);
|
|
363
|
-
|
|
471
|
+
useEffect4(() => {
|
|
364
472
|
let stale = false;
|
|
365
473
|
if (authToken) {
|
|
366
474
|
tokenRef.current = { token: authToken, expiresAt: null };
|
|
@@ -381,12 +489,12 @@ function useSession({
|
|
|
381
489
|
}, [authToken, canExchange, reExchange]);
|
|
382
490
|
const pauseOnUnloadRef = useRef(null);
|
|
383
491
|
pauseOnUnloadRef.current = connection !== null && !isPaused && sessionId && bearerToken ? { sessionId, bearerToken } : null;
|
|
384
|
-
|
|
492
|
+
useEffect4(() => {
|
|
385
493
|
const onPageHide = () => {
|
|
386
494
|
const pending = pauseOnUnloadRef.current;
|
|
387
495
|
if (!pending)
|
|
388
496
|
return;
|
|
389
|
-
fetch(`${
|
|
497
|
+
fetch(`${API_URL4}/v1/sessions/${pending.sessionId}/pause`, {
|
|
390
498
|
method: "POST",
|
|
391
499
|
credentials: "omit",
|
|
392
500
|
keepalive: true,
|
|
@@ -396,7 +504,7 @@ function useSession({
|
|
|
396
504
|
window.addEventListener("pagehide", onPageHide);
|
|
397
505
|
return () => window.removeEventListener("pagehide", onPageHide);
|
|
398
506
|
}, []);
|
|
399
|
-
const startSession =
|
|
507
|
+
const startSession = useCallback4(async ({ agentId, agentControls, existingSessionId, adoptionGoalId }) => {
|
|
400
508
|
if (!bearerToken) {
|
|
401
509
|
setError("No auth token available");
|
|
402
510
|
return;
|
|
@@ -413,11 +521,16 @@ function useSession({
|
|
|
413
521
|
if (captureMode === "screenshare") {
|
|
414
522
|
screenStream = await requestScreenShare();
|
|
415
523
|
}
|
|
416
|
-
const
|
|
524
|
+
const enabledControls = {};
|
|
525
|
+
if (agentControls?.highlight === true)
|
|
526
|
+
enabledControls.highlight = true;
|
|
527
|
+
if (agentControls?.actions === true)
|
|
528
|
+
enabledControls.actions = true;
|
|
529
|
+
const requestAgentControls = Object.keys(enabledControls).length > 0 ? enabledControls : undefined;
|
|
417
530
|
try {
|
|
418
531
|
let resolvedSessionId = existingSessionId;
|
|
419
532
|
if (!resolvedSessionId) {
|
|
420
|
-
const createResp = await authedFetch(`${
|
|
533
|
+
const createResp = await authedFetch(`${API_URL4}/v1/sessions`, {
|
|
421
534
|
method: "POST",
|
|
422
535
|
headers: { "Content-Type": "application/json" },
|
|
423
536
|
body: JSON.stringify({
|
|
@@ -434,10 +547,14 @@ function useSession({
|
|
|
434
547
|
const { session: session2 } = await createResp.json();
|
|
435
548
|
resolvedSessionId = session2.id;
|
|
436
549
|
}
|
|
437
|
-
const startResp = await authedFetch(`${
|
|
550
|
+
const startResp = await authedFetch(`${API_URL4}/v1/sessions/${resolvedSessionId}/start`, {
|
|
438
551
|
method: "POST",
|
|
439
552
|
headers: { "Content-Type": "application/json" },
|
|
440
|
-
body: JSON.stringify({
|
|
553
|
+
body: JSON.stringify({
|
|
554
|
+
captureMode,
|
|
555
|
+
agentControls: requestAgentControls,
|
|
556
|
+
adoptionGoalId
|
|
557
|
+
})
|
|
441
558
|
});
|
|
442
559
|
if (!startResp.ok) {
|
|
443
560
|
const body = await startResp.json().catch(() => null);
|
|
@@ -463,12 +580,12 @@ function useSession({
|
|
|
463
580
|
setIsStarting(false);
|
|
464
581
|
}
|
|
465
582
|
}, [captureMode, bearerToken, authedFetch, onStart, onStartError]);
|
|
466
|
-
const pauseSession =
|
|
583
|
+
const pauseSession = useCallback4(async () => {
|
|
467
584
|
if (!sessionId || !bearerToken)
|
|
468
585
|
return;
|
|
469
586
|
setIsPausing(true);
|
|
470
587
|
try {
|
|
471
|
-
const resp = await authedFetch(`${
|
|
588
|
+
const resp = await authedFetch(`${API_URL4}/v1/sessions/${sessionId}/pause`, {
|
|
472
589
|
method: "POST"
|
|
473
590
|
});
|
|
474
591
|
if (!resp.ok) {
|
|
@@ -489,12 +606,12 @@ function useSession({
|
|
|
489
606
|
setIsPaused(true);
|
|
490
607
|
setIsPausing(false);
|
|
491
608
|
}, [sessionId, bearerToken, authedFetch, pendingScreenStream]);
|
|
492
|
-
const disconnect =
|
|
609
|
+
const disconnect = useCallback4(async () => {
|
|
493
610
|
setIsDisconnecting(true);
|
|
494
611
|
try {
|
|
495
612
|
if (sessionId && bearerToken) {
|
|
496
613
|
try {
|
|
497
|
-
await authedFetch(`${
|
|
614
|
+
await authedFetch(`${API_URL4}/v1/sessions/${sessionId}/pause`, {
|
|
498
615
|
method: "POST"
|
|
499
616
|
});
|
|
500
617
|
} catch {}
|
|
@@ -532,6 +649,13 @@ function useSession({
|
|
|
532
649
|
};
|
|
533
650
|
}
|
|
534
651
|
|
|
652
|
+
// src/lib/agentMode.ts
|
|
653
|
+
var AGENT_MODE = {
|
|
654
|
+
Standard: "standard",
|
|
655
|
+
AlwaysOn: "always_on"
|
|
656
|
+
};
|
|
657
|
+
var AGENT_MODES = Object.values(AGENT_MODE);
|
|
658
|
+
|
|
535
659
|
// src/lib/constants.ts
|
|
536
660
|
var SIDEBAR_WIDTH = 360;
|
|
537
661
|
var WIDGET_ROOT_ID = "skippr-sdk-root";
|
|
@@ -540,15 +664,9 @@ var PRIVATE_ATTR = "data-skippr-private";
|
|
|
540
664
|
var DOM_SNAPSHOT_TOPIC = "skippr.dom-snapshot";
|
|
541
665
|
var DOM_EVENTS_TOPIC = "skippr.dom-events";
|
|
542
666
|
var HIGHLIGHT_TOPIC = "skippr.highlight";
|
|
667
|
+
var PAGE_ACTIONS_TOPIC = "skippr.page-actions";
|
|
543
668
|
var NAME_MAX_CHARS = 80;
|
|
544
669
|
|
|
545
|
-
// src/lib/agentMode.ts
|
|
546
|
-
var AGENT_MODE = {
|
|
547
|
-
Standard: "standard",
|
|
548
|
-
AlwaysOn: "always_on"
|
|
549
|
-
};
|
|
550
|
-
var AGENT_MODES = Object.values(AGENT_MODE);
|
|
551
|
-
|
|
552
670
|
// src/lib/sessionStatus.ts
|
|
553
671
|
var SESSION_STATUS = {
|
|
554
672
|
pending: "pending",
|
|
@@ -597,12 +715,12 @@ function getModuleSessionState(currentSession, mode) {
|
|
|
597
715
|
// src/components/AutoStartMedia.tsx
|
|
598
716
|
import { useConnectionState, useLocalParticipant } from "@livekit/components-react/hooks";
|
|
599
717
|
import { ConnectionState, Track } from "livekit-client";
|
|
600
|
-
import { useEffect as
|
|
718
|
+
import { useEffect as useEffect5, useRef as useRef2 } from "react";
|
|
601
719
|
function AutoStartMedia({ pendingScreenStream }) {
|
|
602
720
|
const { localParticipant } = useLocalParticipant();
|
|
603
721
|
const connectionState = useConnectionState();
|
|
604
722
|
const didStartRef = useRef2(false);
|
|
605
|
-
|
|
723
|
+
useEffect5(() => {
|
|
606
724
|
if (didStartRef.current)
|
|
607
725
|
return;
|
|
608
726
|
if (connectionState !== ConnectionState.Connected)
|
|
@@ -627,7 +745,7 @@ function AutoStartMedia({ pendingScreenStream }) {
|
|
|
627
745
|
// src/components/DomCapture.tsx
|
|
628
746
|
import { useConnectionState as useConnectionState2, useLocalParticipant as useLocalParticipant2 } from "@livekit/components-react/hooks";
|
|
629
747
|
import { ConnectionState as ConnectionState2, ScreenSharePresets, Track as Track2 } from "livekit-client";
|
|
630
|
-
import { useEffect as
|
|
748
|
+
import { useEffect as useEffect6, useRef as useRef3 } from "react";
|
|
631
749
|
|
|
632
750
|
// src/capture/a11yUtils.ts
|
|
633
751
|
var ROLE_BY_TAG = {
|
|
@@ -868,6 +986,25 @@ function shouldMaskValue(input) {
|
|
|
868
986
|
return true;
|
|
869
987
|
return false;
|
|
870
988
|
}
|
|
989
|
+
function isDisabled(element) {
|
|
990
|
+
if ("disabled" in element && element.disabled === true) {
|
|
991
|
+
return true;
|
|
992
|
+
}
|
|
993
|
+
return element.getAttribute("aria-disabled") === "true";
|
|
994
|
+
}
|
|
995
|
+
function isActionBlocked(element) {
|
|
996
|
+
if (isDisabled(element))
|
|
997
|
+
return true;
|
|
998
|
+
if (element.tagName === "IFRAME" && isSensitiveIframe(element))
|
|
999
|
+
return true;
|
|
1000
|
+
const ownerFrame = element.ownerDocument?.defaultView?.frameElement;
|
|
1001
|
+
if (ownerFrame && isSensitiveIframe(ownerFrame))
|
|
1002
|
+
return true;
|
|
1003
|
+
if ((element.tagName === "INPUT" || element.tagName === "TEXTAREA") && shouldMaskValue(element)) {
|
|
1004
|
+
return true;
|
|
1005
|
+
}
|
|
1006
|
+
return false;
|
|
1007
|
+
}
|
|
871
1008
|
function escapeAttributeValue(value) {
|
|
872
1009
|
return value.replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/[\r\n]+/g, " ");
|
|
873
1010
|
}
|
|
@@ -1084,6 +1221,20 @@ function buildAccessibilityTree() {
|
|
|
1084
1221
|
};
|
|
1085
1222
|
}
|
|
1086
1223
|
|
|
1224
|
+
// src/capture/agentActionSignal.ts
|
|
1225
|
+
var isDispatchingAgentAction = false;
|
|
1226
|
+
function runAgentAction(dispatch) {
|
|
1227
|
+
isDispatchingAgentAction = true;
|
|
1228
|
+
try {
|
|
1229
|
+
dispatch();
|
|
1230
|
+
} finally {
|
|
1231
|
+
isDispatchingAgentAction = false;
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
function isAgentActionInProgress() {
|
|
1235
|
+
return isDispatchingAgentAction;
|
|
1236
|
+
}
|
|
1237
|
+
|
|
1087
1238
|
// src/capture/domEvents.ts
|
|
1088
1239
|
var MUTATION_DEBOUNCE_MS = 250;
|
|
1089
1240
|
var textEncoder = new TextEncoder;
|
|
@@ -1128,6 +1279,8 @@ function installDomEventListeners(localParticipant, options = {}) {
|
|
|
1128
1279
|
const onClick = (event) => {
|
|
1129
1280
|
if (isInsideWidget(event.target))
|
|
1130
1281
|
return;
|
|
1282
|
+
if (isAgentActionInProgress())
|
|
1283
|
+
return;
|
|
1131
1284
|
if (!(event.target instanceof Element))
|
|
1132
1285
|
return;
|
|
1133
1286
|
const matchedRef = findNearestRef(event.target);
|
|
@@ -1144,6 +1297,8 @@ function installDomEventListeners(localParticipant, options = {}) {
|
|
|
1144
1297
|
const onSubmit = (event) => {
|
|
1145
1298
|
if (isInsideWidget(event.target))
|
|
1146
1299
|
return;
|
|
1300
|
+
if (isAgentActionInProgress())
|
|
1301
|
+
return;
|
|
1147
1302
|
if (!(event.target instanceof HTMLFormElement))
|
|
1148
1303
|
return;
|
|
1149
1304
|
const submittedForm = event.target;
|
|
@@ -1375,7 +1530,7 @@ function DomCapture() {
|
|
|
1375
1530
|
const { localParticipant } = useLocalParticipant2();
|
|
1376
1531
|
const connectionState = useConnectionState2();
|
|
1377
1532
|
const didStartRef = useRef3(false);
|
|
1378
|
-
|
|
1533
|
+
useEffect6(() => {
|
|
1379
1534
|
if (didStartRef.current)
|
|
1380
1535
|
return;
|
|
1381
1536
|
if (connectionState !== ConnectionState2.Connected)
|
|
@@ -1801,31 +1956,16 @@ var __iconNode26 = [
|
|
|
1801
1956
|
["line", { x1: "22", x2: "16", y1: "11", y2: "11", key: "1shjgl" }]
|
|
1802
1957
|
];
|
|
1803
1958
|
var UserPlus = createLucideIcon("user-plus", __iconNode26);
|
|
1959
|
+
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/x.js
|
|
1960
|
+
var __iconNode27 = [
|
|
1961
|
+
["path", { d: "M18 6 6 18", key: "1bl5f8" }],
|
|
1962
|
+
["path", { d: "m6 6 12 12", key: "d8bk6v" }]
|
|
1963
|
+
];
|
|
1964
|
+
var X = createLucideIcon("x", __iconNode27);
|
|
1804
1965
|
// src/components/HighlightOverlay.tsx
|
|
1805
|
-
import { useCallback as
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
var HIGHLIGHT_PADDING = 6;
|
|
1809
|
-
var textDecoder = new TextDecoder;
|
|
1810
|
-
function parseHighlightMessage(payload) {
|
|
1811
|
-
try {
|
|
1812
|
-
const json = JSON.parse(textDecoder.decode(payload));
|
|
1813
|
-
if (!json || typeof json !== "object")
|
|
1814
|
-
return null;
|
|
1815
|
-
if (json.type === "show" && typeof json.ref === "string") {
|
|
1816
|
-
return {
|
|
1817
|
-
type: "show",
|
|
1818
|
-
ref: json.ref,
|
|
1819
|
-
message: typeof json.message === "string" ? json.message : undefined
|
|
1820
|
-
};
|
|
1821
|
-
}
|
|
1822
|
-
if (json.type === "clear")
|
|
1823
|
-
return { type: "clear" };
|
|
1824
|
-
return null;
|
|
1825
|
-
} catch {
|
|
1826
|
-
return null;
|
|
1827
|
-
}
|
|
1828
|
-
}
|
|
1966
|
+
import { useCallback as useCallback5, useEffect as useEffect7, useRef as useRef4, useState as useState5 } from "react";
|
|
1967
|
+
|
|
1968
|
+
// src/capture/elementRef.ts
|
|
1829
1969
|
function safeGetIframeDocument(iframe) {
|
|
1830
1970
|
try {
|
|
1831
1971
|
return iframe.contentDocument;
|
|
@@ -1894,6 +2034,31 @@ function getRectInTopViewport(el) {
|
|
|
1894
2034
|
}
|
|
1895
2035
|
return rect;
|
|
1896
2036
|
}
|
|
2037
|
+
|
|
2038
|
+
// src/components/HighlightOverlay.tsx
|
|
2039
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2040
|
+
var Z_INDEX = 2147483646;
|
|
2041
|
+
var HIGHLIGHT_PADDING = 6;
|
|
2042
|
+
var textDecoder = new TextDecoder;
|
|
2043
|
+
function parseHighlightMessage(payload) {
|
|
2044
|
+
try {
|
|
2045
|
+
const json = JSON.parse(textDecoder.decode(payload));
|
|
2046
|
+
if (!json || typeof json !== "object")
|
|
2047
|
+
return null;
|
|
2048
|
+
if (json.type === "show" && typeof json.ref === "string") {
|
|
2049
|
+
return {
|
|
2050
|
+
type: "show",
|
|
2051
|
+
ref: json.ref,
|
|
2052
|
+
message: typeof json.message === "string" ? json.message : undefined
|
|
2053
|
+
};
|
|
2054
|
+
}
|
|
2055
|
+
if (json.type === "clear")
|
|
2056
|
+
return { type: "clear" };
|
|
2057
|
+
return null;
|
|
2058
|
+
} catch {
|
|
2059
|
+
return null;
|
|
2060
|
+
}
|
|
2061
|
+
}
|
|
1897
2062
|
function findScrollableAncestor(el) {
|
|
1898
2063
|
const win = el.ownerDocument?.defaultView ?? window;
|
|
1899
2064
|
let node = el.parentElement;
|
|
@@ -1906,14 +2071,14 @@ function findScrollableAncestor(el) {
|
|
|
1906
2071
|
return el.ownerDocument?.documentElement ?? document.documentElement;
|
|
1907
2072
|
}
|
|
1908
2073
|
function HighlightOverlay() {
|
|
1909
|
-
const [overlayState, setOverlayState] =
|
|
2074
|
+
const [overlayState, setOverlayState] = useState5(null);
|
|
1910
2075
|
const targetElementRef = useRef4(null);
|
|
1911
2076
|
const pendingFrameRef = useRef4(null);
|
|
1912
|
-
const clearOverlay =
|
|
2077
|
+
const clearOverlay = useCallback5(() => {
|
|
1913
2078
|
targetElementRef.current = null;
|
|
1914
2079
|
setOverlayState(null);
|
|
1915
2080
|
}, []);
|
|
1916
|
-
const recomputeRect =
|
|
2081
|
+
const recomputeRect = useCallback5(() => {
|
|
1917
2082
|
pendingFrameRef.current = null;
|
|
1918
2083
|
const target = targetElementRef.current;
|
|
1919
2084
|
if (!target)
|
|
@@ -1925,12 +2090,12 @@ function HighlightOverlay() {
|
|
|
1925
2090
|
const rect2 = getRectInTopViewport(target);
|
|
1926
2091
|
setOverlayState((prev) => prev ? { ...prev, rect: rect2 } : prev);
|
|
1927
2092
|
}, [clearOverlay]);
|
|
1928
|
-
const scheduleRecompute =
|
|
2093
|
+
const scheduleRecompute = useCallback5(() => {
|
|
1929
2094
|
if (pendingFrameRef.current !== null)
|
|
1930
2095
|
return;
|
|
1931
2096
|
pendingFrameRef.current = window.requestAnimationFrame(recomputeRect);
|
|
1932
2097
|
}, [recomputeRect]);
|
|
1933
|
-
const onHighlightMessage =
|
|
2098
|
+
const onHighlightMessage = useCallback5((msg) => {
|
|
1934
2099
|
const parsed = parseHighlightMessage(msg.payload);
|
|
1935
2100
|
if (!parsed)
|
|
1936
2101
|
return;
|
|
@@ -1951,7 +2116,7 @@ function HighlightOverlay() {
|
|
|
1951
2116
|
});
|
|
1952
2117
|
}, [clearOverlay]);
|
|
1953
2118
|
useDataChannel(HIGHLIGHT_TOPIC, onHighlightMessage);
|
|
1954
|
-
|
|
2119
|
+
useEffect7(() => {
|
|
1955
2120
|
if (!overlayState)
|
|
1956
2121
|
return;
|
|
1957
2122
|
const target = targetElementRef.current;
|
|
@@ -2033,7 +2198,7 @@ function HighlightOverlay() {
|
|
|
2033
2198
|
}
|
|
2034
2199
|
|
|
2035
2200
|
// src/components/MinimizedBubble.tsx
|
|
2036
|
-
import { useEffect as
|
|
2201
|
+
import { useContext as useContext3, useEffect as useEffect8 } from "react";
|
|
2037
2202
|
|
|
2038
2203
|
// src/hooks/useLiveAgent.ts
|
|
2039
2204
|
import { useContext as useContext2 } from "react";
|
|
@@ -2050,6 +2215,9 @@ function useLiveAgent() {
|
|
|
2050
2215
|
historyMessages,
|
|
2051
2216
|
phasesSnapshot,
|
|
2052
2217
|
setPhasesSnapshot,
|
|
2218
|
+
adoptionGoals,
|
|
2219
|
+
dismissAdoptionGoal,
|
|
2220
|
+
startAdoptionSession,
|
|
2053
2221
|
...publicValue
|
|
2054
2222
|
} = ctx;
|
|
2055
2223
|
return publicValue;
|
|
@@ -2058,7 +2226,7 @@ function useLiveAgent() {
|
|
|
2058
2226
|
// src/hooks/useMediaControls.ts
|
|
2059
2227
|
import { useLocalParticipant as useLocalParticipant3 } from "@livekit/components-react/hooks";
|
|
2060
2228
|
import { ScreenSharePresets as ScreenSharePresets2 } from "livekit-client";
|
|
2061
|
-
import { useCallback as
|
|
2229
|
+
import { useCallback as useCallback6 } from "react";
|
|
2062
2230
|
var SCREEN_SHARE_OPTIONS = {
|
|
2063
2231
|
video: { displaySurface: "browser" },
|
|
2064
2232
|
resolution: ScreenSharePresets2.h720fps30.resolution,
|
|
@@ -2068,14 +2236,14 @@ function useMediaControls() {
|
|
|
2068
2236
|
const { localParticipant } = useLocalParticipant3();
|
|
2069
2237
|
const isMuted = !localParticipant.isMicrophoneEnabled;
|
|
2070
2238
|
const isScreenSharing = localParticipant.isScreenShareEnabled;
|
|
2071
|
-
const toggleMute =
|
|
2239
|
+
const toggleMute = useCallback6(async () => {
|
|
2072
2240
|
try {
|
|
2073
2241
|
await localParticipant.setMicrophoneEnabled(isMuted);
|
|
2074
2242
|
} catch (error) {
|
|
2075
2243
|
console.error("Failed to toggle microphone:", error);
|
|
2076
2244
|
}
|
|
2077
2245
|
}, [localParticipant, isMuted]);
|
|
2078
|
-
const toggleScreenShare =
|
|
2246
|
+
const toggleScreenShare = useCallback6(async () => {
|
|
2079
2247
|
try {
|
|
2080
2248
|
await localParticipant.setScreenShareEnabled(!isScreenSharing, SCREEN_SHARE_OPTIONS);
|
|
2081
2249
|
} catch (error) {
|
|
@@ -2092,6 +2260,31 @@ function cn(...inputs) {
|
|
|
2092
2260
|
return twMerge(clsx(inputs));
|
|
2093
2261
|
}
|
|
2094
2262
|
|
|
2263
|
+
// src/components/AdoptionBubble.tsx
|
|
2264
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
2265
|
+
function AdoptionBubble({ goal, onAttend, onDismiss }) {
|
|
2266
|
+
return /* @__PURE__ */ jsxs2("div", {
|
|
2267
|
+
className: cn("skippr:flex skippr:max-w-72 skippr:items-center skippr:gap-1.5", "skippr:rounded-full skippr:bg-bubble/95 skippr:backdrop-blur-sm", "skippr:py-1.5 skippr:pr-1.5 skippr:pl-3.5", "skippr:text-xs skippr:font-medium skippr:text-white", "skippr:shadow-[0_8px_24px_rgba(45,43,61,0.35)]", "skippr:animate-[skippr-bubble-in_0.28s_ease-out]"),
|
|
2268
|
+
children: [
|
|
2269
|
+
/* @__PURE__ */ jsx2("button", {
|
|
2270
|
+
type: "button",
|
|
2271
|
+
onClick: () => onAttend(goal),
|
|
2272
|
+
className: "skippr:min-w-0 skippr:flex-1 skippr:cursor-pointer skippr:truncate skippr:rounded-full skippr:text-left skippr:transition-opacity skippr:hover:opacity-90 skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-inset skippr:focus-visible:ring-white/70",
|
|
2273
|
+
children: goal.displayMessage
|
|
2274
|
+
}),
|
|
2275
|
+
/* @__PURE__ */ jsx2("button", {
|
|
2276
|
+
type: "button",
|
|
2277
|
+
onClick: () => onDismiss(goal.goalId),
|
|
2278
|
+
"aria-label": "Dismiss suggestion",
|
|
2279
|
+
className: cn("skippr:flex skippr:size-5 skippr:shrink-0 skippr:items-center skippr:justify-center", "skippr:rounded-full skippr:text-white/70 skippr:cursor-pointer", "skippr:transition-colors skippr:hover:bg-white/15 skippr:hover:text-white", "skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-white/70"),
|
|
2280
|
+
children: /* @__PURE__ */ jsx2(X, {
|
|
2281
|
+
className: "skippr:size-3.5"
|
|
2282
|
+
})
|
|
2283
|
+
})
|
|
2284
|
+
]
|
|
2285
|
+
});
|
|
2286
|
+
}
|
|
2287
|
+
|
|
2095
2288
|
// src/hooks/useAgentVoiceState.ts
|
|
2096
2289
|
import { useVoiceAssistant } from "@livekit/components-react/hooks";
|
|
2097
2290
|
function useAgentVoiceState() {
|
|
@@ -2104,7 +2297,7 @@ function useAgentVoiceState() {
|
|
|
2104
2297
|
}
|
|
2105
2298
|
|
|
2106
2299
|
// src/components/LauncherStatusPill.tsx
|
|
2107
|
-
import { jsx as
|
|
2300
|
+
import { jsx as jsx3, jsxs as jsxs3, Fragment } from "react/jsx-runtime";
|
|
2108
2301
|
function pillStatusFromAgent(state, canSeePage) {
|
|
2109
2302
|
if (state === "speaking")
|
|
2110
2303
|
return "talking";
|
|
@@ -2141,58 +2334,58 @@ function LauncherStatusPill() {
|
|
|
2141
2334
|
setSidebarTab("chat");
|
|
2142
2335
|
expandPanel();
|
|
2143
2336
|
};
|
|
2144
|
-
return /* @__PURE__ */
|
|
2337
|
+
return /* @__PURE__ */ jsx3("button", {
|
|
2145
2338
|
type: "button",
|
|
2146
2339
|
onClick: handleClick,
|
|
2147
2340
|
className: cn("skippr:fixed skippr:bottom-20 skippr:z-[9999]", "skippr:flex skippr:items-center skippr:gap-2", "skippr:rounded-full skippr:bg-bubble/95 skippr:backdrop-blur-sm", "skippr:px-3 skippr:py-1.5", "skippr:text-xs skippr:font-medium skippr:text-white", "skippr:shadow-[0_8px_24px_rgba(45,43,61,0.35)]", "skippr:cursor-pointer skippr:transition-colors skippr:hover:bg-bubble", "skippr:animate-[skippr-bubble-in_0.28s_ease-out]", position === "right" ? "skippr:right-6" : "skippr:left-6"),
|
|
2148
2341
|
"aria-label": ariaLabel,
|
|
2149
|
-
children: /* @__PURE__ */
|
|
2342
|
+
children: /* @__PURE__ */ jsxs3("span", {
|
|
2150
2343
|
className: "skippr:flex skippr:items-center skippr:gap-2 skippr:animate-[skippr-pill-content_0.22s_ease-out]",
|
|
2151
2344
|
children: [
|
|
2152
|
-
status === "standing-by" && /* @__PURE__ */
|
|
2345
|
+
status === "standing-by" && /* @__PURE__ */ jsxs3(Fragment, {
|
|
2153
2346
|
children: [
|
|
2154
|
-
/* @__PURE__ */
|
|
2347
|
+
/* @__PURE__ */ jsx3("span", {
|
|
2155
2348
|
children: "Standing by"
|
|
2156
2349
|
}),
|
|
2157
|
-
/* @__PURE__ */
|
|
2350
|
+
/* @__PURE__ */ jsx3(ThinkingDots, {})
|
|
2158
2351
|
]
|
|
2159
2352
|
}),
|
|
2160
|
-
status === "observing" && /* @__PURE__ */
|
|
2353
|
+
status === "observing" && /* @__PURE__ */ jsxs3(Fragment, {
|
|
2161
2354
|
children: [
|
|
2162
|
-
/* @__PURE__ */
|
|
2163
|
-
/* @__PURE__ */
|
|
2355
|
+
/* @__PURE__ */ jsx3(ObservingIcon, {}),
|
|
2356
|
+
/* @__PURE__ */ jsx3("span", {
|
|
2164
2357
|
children: "Skippr is observing"
|
|
2165
2358
|
})
|
|
2166
2359
|
]
|
|
2167
2360
|
}),
|
|
2168
|
-
status === "connected" && /* @__PURE__ */
|
|
2361
|
+
status === "connected" && /* @__PURE__ */ jsxs3(Fragment, {
|
|
2169
2362
|
children: [
|
|
2170
|
-
/* @__PURE__ */
|
|
2171
|
-
/* @__PURE__ */
|
|
2363
|
+
/* @__PURE__ */ jsx3(ConnectedDot, {}),
|
|
2364
|
+
/* @__PURE__ */ jsx3("span", {
|
|
2172
2365
|
children: "Skippr is connected"
|
|
2173
2366
|
})
|
|
2174
2367
|
]
|
|
2175
2368
|
}),
|
|
2176
|
-
status === "talking" && /* @__PURE__ */
|
|
2369
|
+
status === "talking" && /* @__PURE__ */ jsxs3(Fragment, {
|
|
2177
2370
|
children: [
|
|
2178
|
-
/* @__PURE__ */
|
|
2179
|
-
/* @__PURE__ */
|
|
2371
|
+
/* @__PURE__ */ jsx3(SpeakingBars, {}),
|
|
2372
|
+
/* @__PURE__ */ jsx3("span", {
|
|
2180
2373
|
children: "Skippr is talking"
|
|
2181
2374
|
})
|
|
2182
2375
|
]
|
|
2183
2376
|
}),
|
|
2184
|
-
status === "thinking" && /* @__PURE__ */
|
|
2377
|
+
status === "thinking" && /* @__PURE__ */ jsxs3(Fragment, {
|
|
2185
2378
|
children: [
|
|
2186
|
-
/* @__PURE__ */
|
|
2187
|
-
/* @__PURE__ */
|
|
2379
|
+
/* @__PURE__ */ jsx3(ThinkingDots, {}),
|
|
2380
|
+
/* @__PURE__ */ jsx3("span", {
|
|
2188
2381
|
children: "Skippr is thinking"
|
|
2189
2382
|
})
|
|
2190
2383
|
]
|
|
2191
2384
|
}),
|
|
2192
|
-
status === "paused" && /* @__PURE__ */
|
|
2385
|
+
status === "paused" && /* @__PURE__ */ jsxs3(Fragment, {
|
|
2193
2386
|
children: [
|
|
2194
|
-
/* @__PURE__ */
|
|
2195
|
-
/* @__PURE__ */
|
|
2387
|
+
/* @__PURE__ */ jsx3(PausedDot, {}),
|
|
2388
|
+
/* @__PURE__ */ jsx3("span", {
|
|
2196
2389
|
children: "Session paused"
|
|
2197
2390
|
})
|
|
2198
2391
|
]
|
|
@@ -2202,25 +2395,25 @@ function LauncherStatusPill() {
|
|
|
2202
2395
|
});
|
|
2203
2396
|
}
|
|
2204
2397
|
function ConnectedDot() {
|
|
2205
|
-
return /* @__PURE__ */
|
|
2398
|
+
return /* @__PURE__ */ jsxs3("span", {
|
|
2206
2399
|
className: "skippr:relative skippr:flex skippr:size-2",
|
|
2207
2400
|
children: [
|
|
2208
|
-
/* @__PURE__ */
|
|
2401
|
+
/* @__PURE__ */ jsx3("span", {
|
|
2209
2402
|
className: "skippr:absolute skippr:inline-flex skippr:size-full skippr:animate-ping skippr:rounded-full skippr:bg-emerald-400 skippr:opacity-75"
|
|
2210
2403
|
}),
|
|
2211
|
-
/* @__PURE__ */
|
|
2404
|
+
/* @__PURE__ */ jsx3("span", {
|
|
2212
2405
|
className: "skippr:relative skippr:inline-flex skippr:size-2 skippr:rounded-full skippr:bg-emerald-400"
|
|
2213
2406
|
})
|
|
2214
2407
|
]
|
|
2215
2408
|
});
|
|
2216
2409
|
}
|
|
2217
2410
|
function PausedDot() {
|
|
2218
|
-
return /* @__PURE__ */
|
|
2411
|
+
return /* @__PURE__ */ jsx3("span", {
|
|
2219
2412
|
className: "skippr:inline-flex skippr:size-2 skippr:rounded-full skippr:bg-amber-400"
|
|
2220
2413
|
});
|
|
2221
2414
|
}
|
|
2222
2415
|
function ObservingIcon() {
|
|
2223
|
-
return /* @__PURE__ */
|
|
2416
|
+
return /* @__PURE__ */ jsxs3("svg", {
|
|
2224
2417
|
viewBox: "0 0 24 24",
|
|
2225
2418
|
className: "skippr:size-3.5",
|
|
2226
2419
|
fill: "none",
|
|
@@ -2230,10 +2423,10 @@ function ObservingIcon() {
|
|
|
2230
2423
|
strokeLinejoin: "round",
|
|
2231
2424
|
"aria-hidden": "true",
|
|
2232
2425
|
children: [
|
|
2233
|
-
/* @__PURE__ */
|
|
2426
|
+
/* @__PURE__ */ jsx3("path", {
|
|
2234
2427
|
d: "M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z"
|
|
2235
2428
|
}),
|
|
2236
|
-
/* @__PURE__ */
|
|
2429
|
+
/* @__PURE__ */ jsx3("circle", {
|
|
2237
2430
|
cx: "12",
|
|
2238
2431
|
cy: "12",
|
|
2239
2432
|
r: "3",
|
|
@@ -2245,38 +2438,38 @@ function ObservingIcon() {
|
|
|
2245
2438
|
});
|
|
2246
2439
|
}
|
|
2247
2440
|
function SpeakingBars() {
|
|
2248
|
-
return /* @__PURE__ */
|
|
2441
|
+
return /* @__PURE__ */ jsxs3("span", {
|
|
2249
2442
|
className: "skippr:flex skippr:items-center skippr:gap-[2px] skippr:h-3.5",
|
|
2250
2443
|
children: [
|
|
2251
|
-
/* @__PURE__ */
|
|
2444
|
+
/* @__PURE__ */ jsx3("span", {
|
|
2252
2445
|
className: "skippr:w-[2px] skippr:rounded-sm skippr:bg-white skippr:animate-[skippr-speak_1.1s_ease-in-out_infinite] skippr:h-1.5"
|
|
2253
2446
|
}),
|
|
2254
|
-
/* @__PURE__ */
|
|
2447
|
+
/* @__PURE__ */ jsx3("span", {
|
|
2255
2448
|
className: "skippr:w-[2px] skippr:rounded-sm skippr:bg-white skippr:animate-[skippr-speak_1.1s_ease-in-out_0.15s_infinite] skippr:h-3"
|
|
2256
2449
|
}),
|
|
2257
|
-
/* @__PURE__ */
|
|
2450
|
+
/* @__PURE__ */ jsx3("span", {
|
|
2258
2451
|
className: "skippr:w-[2px] skippr:rounded-sm skippr:bg-white skippr:animate-[skippr-speak_1.1s_ease-in-out_0.3s_infinite] skippr:h-2"
|
|
2259
2452
|
}),
|
|
2260
|
-
/* @__PURE__ */
|
|
2453
|
+
/* @__PURE__ */ jsx3("span", {
|
|
2261
2454
|
className: "skippr:w-[2px] skippr:rounded-sm skippr:bg-white skippr:animate-[skippr-speak_1.1s_ease-in-out_0.45s_infinite] skippr:h-3.5"
|
|
2262
2455
|
}),
|
|
2263
|
-
/* @__PURE__ */
|
|
2456
|
+
/* @__PURE__ */ jsx3("span", {
|
|
2264
2457
|
className: "skippr:w-[2px] skippr:rounded-sm skippr:bg-white skippr:animate-[skippr-speak_1.1s_ease-in-out_0.6s_infinite] skippr:h-1"
|
|
2265
2458
|
})
|
|
2266
2459
|
]
|
|
2267
2460
|
});
|
|
2268
2461
|
}
|
|
2269
2462
|
function ThinkingDots() {
|
|
2270
|
-
return /* @__PURE__ */
|
|
2463
|
+
return /* @__PURE__ */ jsxs3("span", {
|
|
2271
2464
|
className: "skippr:flex skippr:items-center skippr:gap-[3px]",
|
|
2272
2465
|
children: [
|
|
2273
|
-
/* @__PURE__ */
|
|
2466
|
+
/* @__PURE__ */ jsx3("span", {
|
|
2274
2467
|
className: "skippr:size-1 skippr:rounded-full skippr:bg-white skippr:animate-bounce skippr:[animation-delay:0ms]"
|
|
2275
2468
|
}),
|
|
2276
|
-
/* @__PURE__ */
|
|
2469
|
+
/* @__PURE__ */ jsx3("span", {
|
|
2277
2470
|
className: "skippr:size-1 skippr:rounded-full skippr:bg-white skippr:animate-bounce skippr:[animation-delay:150ms]"
|
|
2278
2471
|
}),
|
|
2279
|
-
/* @__PURE__ */
|
|
2472
|
+
/* @__PURE__ */ jsx3("span", {
|
|
2280
2473
|
className: "skippr:size-1 skippr:rounded-full skippr:bg-white skippr:animate-bounce skippr:[animation-delay:300ms]"
|
|
2281
2474
|
})
|
|
2282
2475
|
]
|
|
@@ -2284,9 +2477,9 @@ function ThinkingDots() {
|
|
|
2284
2477
|
}
|
|
2285
2478
|
|
|
2286
2479
|
// src/components/Logo.tsx
|
|
2287
|
-
import { jsx as
|
|
2480
|
+
import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
2288
2481
|
function Logo({ className }) {
|
|
2289
|
-
return /* @__PURE__ */
|
|
2482
|
+
return /* @__PURE__ */ jsxs4("svg", {
|
|
2290
2483
|
width: "1em",
|
|
2291
2484
|
height: "1em",
|
|
2292
2485
|
viewBox: "0 0 200 200",
|
|
@@ -2296,20 +2489,20 @@ function Logo({ className }) {
|
|
|
2296
2489
|
"aria-label": "Skippr",
|
|
2297
2490
|
className,
|
|
2298
2491
|
children: [
|
|
2299
|
-
/* @__PURE__ */
|
|
2492
|
+
/* @__PURE__ */ jsx4("rect", {
|
|
2300
2493
|
width: "200",
|
|
2301
2494
|
height: "200",
|
|
2302
2495
|
rx: "40",
|
|
2303
2496
|
fill: "#2D2D3F"
|
|
2304
2497
|
}),
|
|
2305
|
-
/* @__PURE__ */
|
|
2498
|
+
/* @__PURE__ */ jsxs4("g", {
|
|
2306
2499
|
transform: "translate(100 100) scale(0.8) translate(-100 -100)",
|
|
2307
2500
|
children: [
|
|
2308
|
-
/* @__PURE__ */
|
|
2501
|
+
/* @__PURE__ */ jsx4("path", {
|
|
2309
2502
|
d: "M144.497 59C149.193 59 153 62.8071 153 67.5033V116.397C153 118.034 152.536 119.562 151.735 120.859L114.894 92.4811L114.894 92.4804C105.42 85.1648 91.2971 91.7058 91.297 104.015V124.901H54.5033C49.8071 124.901 46 121.094 46 116.397V67.5033C46 62.8071 49.8071 59 54.5033 59H144.497ZM101.272 104.015C101.272 100.172 105.736 98.0111 108.798 100.375L140.637 124.901H101.272V104.015Z",
|
|
2310
2503
|
fill: "white"
|
|
2311
2504
|
}),
|
|
2312
|
-
/* @__PURE__ */
|
|
2505
|
+
/* @__PURE__ */ jsx4("path", {
|
|
2313
2506
|
d: "M108.798 99.8856C105.736 97.5211 101.271 99.6824 101.271 103.525V155.892C101.271 160.27 106.852 162.191 109.594 158.755L122.619 142.437C123.1 141.836 123.712 141.35 124.409 141.016C125.106 140.683 125.871 140.51 126.645 140.51H147.946C152.386 140.51 154.316 134.944 150.81 132.247L108.798 99.8856Z",
|
|
2314
2507
|
fill: "#2BC0AE"
|
|
2315
2508
|
})
|
|
@@ -2320,7 +2513,7 @@ function Logo({ className }) {
|
|
|
2320
2513
|
}
|
|
2321
2514
|
|
|
2322
2515
|
// src/components/MinimizedBubble.tsx
|
|
2323
|
-
import { jsx as
|
|
2516
|
+
import { jsx as jsx5, jsxs as jsxs5, Fragment as Fragment2 } from "react/jsx-runtime";
|
|
2324
2517
|
var CONTROL_BUTTON = "skippr:flex skippr:size-12 skippr:items-center skippr:justify-center skippr:rounded-[14px] skippr:cursor-pointer skippr:transition-all skippr:hover:-translate-y-0.5 skippr:active:translate-y-0";
|
|
2325
2518
|
var CONTROL_SHADOW = "skippr:shadow-[0_4px_16px_rgba(0,0,0,0.15),0_2px_4px_rgba(0,0,0,0.1)]";
|
|
2326
2519
|
function ConnectedLauncher() {
|
|
@@ -2341,61 +2534,61 @@ function ConnectedLauncher() {
|
|
|
2341
2534
|
setSidebarTab("chat");
|
|
2342
2535
|
expandPanel();
|
|
2343
2536
|
};
|
|
2344
|
-
return /* @__PURE__ */
|
|
2537
|
+
return /* @__PURE__ */ jsxs5(Fragment2, {
|
|
2345
2538
|
children: [
|
|
2346
|
-
!showPaused && /* @__PURE__ */
|
|
2539
|
+
!showPaused && /* @__PURE__ */ jsxs5(Fragment2, {
|
|
2347
2540
|
children: [
|
|
2348
|
-
/* @__PURE__ */
|
|
2541
|
+
/* @__PURE__ */ jsx5("button", {
|
|
2349
2542
|
type: "button",
|
|
2350
2543
|
onClick: toggleMute,
|
|
2351
2544
|
"aria-label": isMuted ? "Unmute" : "Mute",
|
|
2352
2545
|
className: cn(CONTROL_BUTTON, CONTROL_SHADOW, isMuted ? "skippr:bg-destructive/10 skippr:text-destructive skippr:hover:bg-destructive/20" : "skippr:bg-white skippr:text-foreground skippr:hover:bg-muted"),
|
|
2353
|
-
children: isMuted ? /* @__PURE__ */
|
|
2546
|
+
children: isMuted ? /* @__PURE__ */ jsx5(MicOff, {
|
|
2354
2547
|
className: "skippr:size-5"
|
|
2355
|
-
}) : /* @__PURE__ */
|
|
2548
|
+
}) : /* @__PURE__ */ jsx5(Mic, {
|
|
2356
2549
|
className: "skippr:size-5"
|
|
2357
2550
|
})
|
|
2358
2551
|
}),
|
|
2359
|
-
showScreenShareToggle && /* @__PURE__ */
|
|
2552
|
+
showScreenShareToggle && /* @__PURE__ */ jsx5("button", {
|
|
2360
2553
|
type: "button",
|
|
2361
2554
|
onClick: toggleScreenShare,
|
|
2362
2555
|
"aria-label": isScreenSharing ? "Stop sharing screen" : "Share screen",
|
|
2363
2556
|
className: cn(CONTROL_BUTTON, CONTROL_SHADOW, isScreenSharing ? "skippr:bg-primary skippr:text-primary-foreground skippr:hover:bg-primary/90" : "skippr:bg-white skippr:text-foreground skippr:hover:bg-muted"),
|
|
2364
|
-
children: isScreenSharing ? /* @__PURE__ */
|
|
2557
|
+
children: isScreenSharing ? /* @__PURE__ */ jsx5(MonitorOff, {
|
|
2365
2558
|
className: "skippr:size-5"
|
|
2366
|
-
}) : /* @__PURE__ */
|
|
2559
|
+
}) : /* @__PURE__ */ jsx5(Monitor, {
|
|
2367
2560
|
className: "skippr:size-5"
|
|
2368
2561
|
})
|
|
2369
2562
|
})
|
|
2370
2563
|
]
|
|
2371
2564
|
}),
|
|
2372
|
-
/* @__PURE__ */
|
|
2565
|
+
/* @__PURE__ */ jsx5("button", {
|
|
2373
2566
|
type: "button",
|
|
2374
2567
|
onClick: () => isPaused ? resumeSession() : pauseSession(),
|
|
2375
2568
|
disabled: isPausing,
|
|
2376
2569
|
"aria-label": showPaused ? "Resume session" : "Pause session",
|
|
2377
2570
|
className: cn(CONTROL_BUTTON, CONTROL_SHADOW, "skippr:bg-white skippr:text-foreground skippr:hover:bg-muted skippr:disabled:opacity-60"),
|
|
2378
|
-
children: showPaused ? /* @__PURE__ */
|
|
2571
|
+
children: showPaused ? /* @__PURE__ */ jsx5(Play, {
|
|
2379
2572
|
className: "skippr:size-5"
|
|
2380
|
-
}) : /* @__PURE__ */
|
|
2573
|
+
}) : /* @__PURE__ */ jsx5(Pause, {
|
|
2381
2574
|
className: "skippr:size-5"
|
|
2382
2575
|
})
|
|
2383
2576
|
}),
|
|
2384
|
-
/* @__PURE__ */
|
|
2577
|
+
/* @__PURE__ */ jsx5("button", {
|
|
2385
2578
|
type: "button",
|
|
2386
2579
|
onClick: () => disconnect(),
|
|
2387
2580
|
"aria-label": "End session",
|
|
2388
2581
|
className: cn(CONTROL_BUTTON, "skippr:bg-destructive skippr:text-destructive-foreground skippr:hover:bg-destructive/90", "skippr:shadow-[0_4px_16px_rgba(217,79,79,0.45),0_2px_4px_rgba(0,0,0,0.1)]"),
|
|
2389
|
-
children: /* @__PURE__ */
|
|
2582
|
+
children: /* @__PURE__ */ jsx5(PhoneOff, {
|
|
2390
2583
|
className: "skippr:size-5"
|
|
2391
2584
|
})
|
|
2392
2585
|
}),
|
|
2393
|
-
!showPaused && /* @__PURE__ */
|
|
2586
|
+
!showPaused && /* @__PURE__ */ jsx5("button", {
|
|
2394
2587
|
type: "button",
|
|
2395
2588
|
onClick: openChat,
|
|
2396
2589
|
"aria-label": "Open chat",
|
|
2397
2590
|
className: cn(CONTROL_BUTTON, "skippr:bg-bubble skippr:text-white skippr:overflow-hidden", "skippr:shadow-[0_4px_16px_rgba(45,43,61,0.45),0_2px_4px_rgba(0,0,0,0.1)]", "skippr:hover:shadow-[0_6px_24px_rgba(45,43,61,0.55),0_4px_8px_rgba(0,0,0,0.1)]"),
|
|
2398
|
-
children: /* @__PURE__ */
|
|
2591
|
+
children: /* @__PURE__ */ jsx5(MessageSquare, {
|
|
2399
2592
|
className: "skippr:size-5"
|
|
2400
2593
|
})
|
|
2401
2594
|
})
|
|
@@ -2404,12 +2597,12 @@ function ConnectedLauncher() {
|
|
|
2404
2597
|
}
|
|
2405
2598
|
function IdleLauncher() {
|
|
2406
2599
|
const { expandPanel } = useLiveAgent();
|
|
2407
|
-
return /* @__PURE__ */
|
|
2600
|
+
return /* @__PURE__ */ jsx5("button", {
|
|
2408
2601
|
type: "button",
|
|
2409
2602
|
onClick: expandPanel,
|
|
2410
2603
|
"aria-label": "Skippr assistant",
|
|
2411
2604
|
className: cn("skippr:flex skippr:size-12 skippr:items-center skippr:justify-center", "skippr:rounded-[10px] skippr:overflow-hidden skippr:cursor-pointer", "skippr:shadow-[0_4px_16px_rgba(45,43,61,0.45),0_2px_4px_rgba(0,0,0,0.1)]", "skippr:transition-all skippr:hover:brightness-110 skippr:hover:-translate-y-0.5 skippr:active:translate-y-0"),
|
|
2412
|
-
children: /* @__PURE__ */
|
|
2605
|
+
children: /* @__PURE__ */ jsx5(Logo, {
|
|
2413
2606
|
className: "skippr:size-12"
|
|
2414
2607
|
})
|
|
2415
2608
|
});
|
|
@@ -2419,18 +2612,18 @@ function WelcomeBubble({
|
|
|
2419
2612
|
position,
|
|
2420
2613
|
onDismiss
|
|
2421
2614
|
}) {
|
|
2422
|
-
|
|
2615
|
+
useEffect8(() => {
|
|
2423
2616
|
const timer = setTimeout(onDismiss, 5000);
|
|
2424
2617
|
return () => clearTimeout(timer);
|
|
2425
2618
|
}, [onDismiss]);
|
|
2426
|
-
return /* @__PURE__ */
|
|
2619
|
+
return /* @__PURE__ */ jsxs5("button", {
|
|
2427
2620
|
type: "button",
|
|
2428
2621
|
className: cn("skippr:absolute skippr:bottom-full skippr:mb-3", "skippr:max-w-64 skippr:rounded-xl skippr:bg-card skippr:shadow-lg", "skippr:border skippr:border-border skippr:px-4 skippr:py-3", "skippr:text-sm skippr:text-foreground skippr:leading-relaxed skippr:text-left", "skippr:animate-[skippr-fade-in_0.3s_ease-out]", "skippr:cursor-pointer", position === "right" ? "skippr:right-0" : "skippr:left-0"),
|
|
2429
2622
|
onClick: onDismiss,
|
|
2430
2623
|
"aria-label": "Dismiss",
|
|
2431
2624
|
children: [
|
|
2432
2625
|
message,
|
|
2433
|
-
/* @__PURE__ */
|
|
2626
|
+
/* @__PURE__ */ jsx5("span", {
|
|
2434
2627
|
className: cn("skippr:absolute skippr:top-full skippr:size-2.5", "skippr:border-l skippr:border-t skippr:border-border skippr:bg-card", "skippr:rotate-[225deg]", position === "right" ? "skippr:right-5" : "skippr:left-5", "skippr:-mt-[5px]")
|
|
2435
2628
|
})
|
|
2436
2629
|
]
|
|
@@ -2441,30 +2634,381 @@ function MinimizedBubble({
|
|
|
2441
2634
|
welcomeDismissed,
|
|
2442
2635
|
onDismissWelcome
|
|
2443
2636
|
}) {
|
|
2444
|
-
const
|
|
2637
|
+
const ctx = useContext3(LiveAgentContext);
|
|
2638
|
+
if (!ctx) {
|
|
2639
|
+
throw new Error("MinimizedBubble must be used within a <LiveAgent> provider");
|
|
2640
|
+
}
|
|
2641
|
+
const {
|
|
2642
|
+
isConnected,
|
|
2643
|
+
isStarting,
|
|
2644
|
+
isPaused,
|
|
2645
|
+
isPausing,
|
|
2646
|
+
position,
|
|
2647
|
+
adoptionGoals,
|
|
2648
|
+
dismissAdoptionGoal,
|
|
2649
|
+
startAdoptionSession
|
|
2650
|
+
} = ctx;
|
|
2445
2651
|
const inSession = isConnected || isPaused || isPausing;
|
|
2446
|
-
return /* @__PURE__ */
|
|
2652
|
+
return /* @__PURE__ */ jsxs5(Fragment2, {
|
|
2447
2653
|
children: [
|
|
2448
|
-
/* @__PURE__ */
|
|
2449
|
-
/* @__PURE__ */
|
|
2654
|
+
/* @__PURE__ */ jsx5(LauncherStatusPill, {}),
|
|
2655
|
+
/* @__PURE__ */ jsxs5("div", {
|
|
2450
2656
|
className: cn("skippr:fixed skippr:bottom-6 skippr:z-[9999]", "skippr:flex skippr:items-center skippr:gap-2", position === "right" ? "skippr:right-6" : "skippr:left-6"),
|
|
2451
2657
|
children: [
|
|
2452
|
-
|
|
2658
|
+
!inSession && !isStarting && adoptionGoals.length > 0 && /* @__PURE__ */ jsx5("div", {
|
|
2659
|
+
className: cn("skippr:absolute skippr:bottom-full skippr:mb-3 skippr:flex skippr:flex-col skippr:gap-2", position === "right" ? "skippr:right-0 skippr:items-end" : "skippr:left-0 skippr:items-start"),
|
|
2660
|
+
children: adoptionGoals.map((goal) => /* @__PURE__ */ jsx5(AdoptionBubble, {
|
|
2661
|
+
goal,
|
|
2662
|
+
onAttend: startAdoptionSession,
|
|
2663
|
+
onDismiss: dismissAdoptionGoal
|
|
2664
|
+
}, goal.goalId))
|
|
2665
|
+
}),
|
|
2666
|
+
welcomeMessage && !isConnected && !isStarting && !welcomeDismissed && adoptionGoals.length === 0 && /* @__PURE__ */ jsx5(WelcomeBubble, {
|
|
2453
2667
|
message: welcomeMessage,
|
|
2454
2668
|
position,
|
|
2455
2669
|
onDismiss: onDismissWelcome
|
|
2456
2670
|
}),
|
|
2457
|
-
inSession ? /* @__PURE__ */
|
|
2671
|
+
inSession ? /* @__PURE__ */ jsx5(ConnectedLauncher, {}) : /* @__PURE__ */ jsx5(IdleLauncher, {})
|
|
2458
2672
|
]
|
|
2459
2673
|
})
|
|
2460
2674
|
]
|
|
2461
2675
|
});
|
|
2462
2676
|
}
|
|
2463
2677
|
|
|
2678
|
+
// src/components/PageActionHandler.tsx
|
|
2679
|
+
import { useDataChannel as useDataChannel2 } from "@livekit/components-react/hooks";
|
|
2680
|
+
import { useCallback as useCallback7, useEffect as useEffect10, useRef as useRef6, useState as useState7 } from "react";
|
|
2681
|
+
|
|
2682
|
+
// src/components/AgentActivityIndicator.tsx
|
|
2683
|
+
import { useEffect as useEffect9, useRef as useRef5, useState as useState6 } from "react";
|
|
2684
|
+
import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
2685
|
+
var Z_INDEX2 = 2147483646;
|
|
2686
|
+
function centerOf(element) {
|
|
2687
|
+
const rect = getRectInTopViewport(element);
|
|
2688
|
+
return { left: rect.left + rect.width / 2, top: rect.top + rect.height / 2 };
|
|
2689
|
+
}
|
|
2690
|
+
function AgentActivityIndicator({ target }) {
|
|
2691
|
+
const [position, setPosition] = useState6(null);
|
|
2692
|
+
const frameRef = useRef5(null);
|
|
2693
|
+
useEffect9(() => {
|
|
2694
|
+
if (!target || !target.element.isConnected) {
|
|
2695
|
+
setPosition(null);
|
|
2696
|
+
return;
|
|
2697
|
+
}
|
|
2698
|
+
const update = () => {
|
|
2699
|
+
frameRef.current = null;
|
|
2700
|
+
if (!target.element.isConnected)
|
|
2701
|
+
return;
|
|
2702
|
+
setPosition(centerOf(target.element));
|
|
2703
|
+
};
|
|
2704
|
+
update();
|
|
2705
|
+
const schedule = () => {
|
|
2706
|
+
if (frameRef.current !== null)
|
|
2707
|
+
return;
|
|
2708
|
+
frameRef.current = window.requestAnimationFrame(update);
|
|
2709
|
+
};
|
|
2710
|
+
window.addEventListener("scroll", schedule, { capture: true, passive: true });
|
|
2711
|
+
window.addEventListener("resize", schedule, { passive: true });
|
|
2712
|
+
return () => {
|
|
2713
|
+
window.removeEventListener("scroll", schedule, { capture: true });
|
|
2714
|
+
window.removeEventListener("resize", schedule);
|
|
2715
|
+
if (frameRef.current !== null) {
|
|
2716
|
+
window.cancelAnimationFrame(frameRef.current);
|
|
2717
|
+
frameRef.current = null;
|
|
2718
|
+
}
|
|
2719
|
+
};
|
|
2720
|
+
}, [target]);
|
|
2721
|
+
if (!target || !position)
|
|
2722
|
+
return null;
|
|
2723
|
+
const containerStyle = {
|
|
2724
|
+
position: "fixed",
|
|
2725
|
+
left: `${position.left}px`,
|
|
2726
|
+
top: `${position.top}px`,
|
|
2727
|
+
pointerEvents: "none",
|
|
2728
|
+
zIndex: Z_INDEX2,
|
|
2729
|
+
transition: "left 0.45s cubic-bezier(0.22, 1, 0.36, 1), top 0.45s cubic-bezier(0.22, 1, 0.36, 1)"
|
|
2730
|
+
};
|
|
2731
|
+
return /* @__PURE__ */ jsx6("div", {
|
|
2732
|
+
"data-skippr-private": "true",
|
|
2733
|
+
style: containerStyle,
|
|
2734
|
+
children: /* @__PURE__ */ jsxs6("div", {
|
|
2735
|
+
className: "skippr:relative",
|
|
2736
|
+
children: [
|
|
2737
|
+
/* @__PURE__ */ jsx6(MousePointer2, {
|
|
2738
|
+
"aria-hidden": "true",
|
|
2739
|
+
className: "skippr:h-5 skippr:w-5 skippr:text-cyan-500 skippr:drop-shadow-[0_1px_3px_rgba(0,0,0,0.35)] skippr:animate-skippr-press",
|
|
2740
|
+
fill: "currentColor"
|
|
2741
|
+
}),
|
|
2742
|
+
/* @__PURE__ */ jsx6("div", {
|
|
2743
|
+
role: "status",
|
|
2744
|
+
className: "skippr:absolute skippr:left-5 skippr:top-4 skippr:flex skippr:items-center skippr:gap-1.5 skippr:rounded-full skippr:bg-cyan-500 skippr:px-2.5 skippr:py-1 skippr:shadow-[0_4px_12px_rgba(0,0,0,0.18)]",
|
|
2745
|
+
children: /* @__PURE__ */ jsx6("span", {
|
|
2746
|
+
className: "skippr:text-[11px] skippr:font-medium skippr:text-white skippr:whitespace-nowrap",
|
|
2747
|
+
children: target.label
|
|
2748
|
+
})
|
|
2749
|
+
})
|
|
2750
|
+
]
|
|
2751
|
+
})
|
|
2752
|
+
});
|
|
2753
|
+
}
|
|
2754
|
+
|
|
2755
|
+
// src/components/PageActionHandler.tsx
|
|
2756
|
+
import { jsx as jsx7 } from "react/jsx-runtime";
|
|
2757
|
+
var INDICATOR_LINGER_MS = 1400;
|
|
2758
|
+
var CURSOR_LEAD_BEFORE_ACTION_MS = 350;
|
|
2759
|
+
var SETTLE_MS = 250;
|
|
2760
|
+
var textDecoder2 = new TextDecoder;
|
|
2761
|
+
function parsePageAction(payload) {
|
|
2762
|
+
try {
|
|
2763
|
+
const json = JSON.parse(textDecoder2.decode(payload));
|
|
2764
|
+
if (!json || typeof json !== "object")
|
|
2765
|
+
return null;
|
|
2766
|
+
switch (json.type) {
|
|
2767
|
+
case "click":
|
|
2768
|
+
return typeof json.ref === "string" ? { type: "click", ref: json.ref } : null;
|
|
2769
|
+
case "fill":
|
|
2770
|
+
return typeof json.ref === "string" && typeof json.value === "string" ? { type: "fill", ref: json.ref, value: json.value } : null;
|
|
2771
|
+
case "select":
|
|
2772
|
+
return typeof json.ref === "string" && typeof json.value === "string" ? { type: "select", ref: json.ref, value: json.value } : null;
|
|
2773
|
+
case "scroll":
|
|
2774
|
+
return typeof json.ref === "string" ? { type: "scroll", ref: json.ref } : null;
|
|
2775
|
+
case "navigate":
|
|
2776
|
+
return typeof json.url === "string" ? { type: "navigate", url: json.url } : null;
|
|
2777
|
+
default:
|
|
2778
|
+
return null;
|
|
2779
|
+
}
|
|
2780
|
+
} catch {
|
|
2781
|
+
return null;
|
|
2782
|
+
}
|
|
2783
|
+
}
|
|
2784
|
+
function isSameOriginHttpUrl(url) {
|
|
2785
|
+
try {
|
|
2786
|
+
const parsed = new URL(url);
|
|
2787
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:")
|
|
2788
|
+
return false;
|
|
2789
|
+
return parsed.origin === window.location.origin;
|
|
2790
|
+
} catch {
|
|
2791
|
+
return false;
|
|
2792
|
+
}
|
|
2793
|
+
}
|
|
2794
|
+
function isVisible2(element) {
|
|
2795
|
+
const rect = element.getBoundingClientRect();
|
|
2796
|
+
if (rect.width === 0 && rect.height === 0)
|
|
2797
|
+
return false;
|
|
2798
|
+
const style = element.ownerDocument.defaultView?.getComputedStyle(element);
|
|
2799
|
+
if (!style)
|
|
2800
|
+
return true;
|
|
2801
|
+
return style.visibility !== "hidden" && style.display !== "none";
|
|
2802
|
+
}
|
|
2803
|
+
function setReactCompatibleValue(element, value) {
|
|
2804
|
+
const prototype = element instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype;
|
|
2805
|
+
const setter = Object.getOwnPropertyDescriptor(prototype, "value")?.set;
|
|
2806
|
+
if (setter) {
|
|
2807
|
+
setter.call(element, value);
|
|
2808
|
+
} else {
|
|
2809
|
+
element.value = value;
|
|
2810
|
+
}
|
|
2811
|
+
element.dispatchEvent(new Event("input", { bubbles: true }));
|
|
2812
|
+
element.dispatchEvent(new Event("change", { bubbles: true }));
|
|
2813
|
+
}
|
|
2814
|
+
function performFill(element, value) {
|
|
2815
|
+
if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {
|
|
2816
|
+
element.focus();
|
|
2817
|
+
setReactCompatibleValue(element, value);
|
|
2818
|
+
}
|
|
2819
|
+
}
|
|
2820
|
+
function performSelect(element, value) {
|
|
2821
|
+
if (element instanceof HTMLSelectElement) {
|
|
2822
|
+
const match = Array.from(element.options).find((option) => option.value === value || option.label === value || option.text === value);
|
|
2823
|
+
if (match) {
|
|
2824
|
+
element.value = match.value;
|
|
2825
|
+
element.dispatchEvent(new Event("change", { bubbles: true }));
|
|
2826
|
+
}
|
|
2827
|
+
return;
|
|
2828
|
+
}
|
|
2829
|
+
if (element instanceof HTMLInputElement && (element.type === "checkbox" || element.type === "radio")) {
|
|
2830
|
+
const shouldCheck = value !== "false" && value !== "";
|
|
2831
|
+
if (element.checked !== shouldCheck)
|
|
2832
|
+
element.click();
|
|
2833
|
+
}
|
|
2834
|
+
}
|
|
2835
|
+
var INTERACTIVE_SELECTOR = 'button, a[href], [role="button"], [role="link"], input, select, [onclick]';
|
|
2836
|
+
function resolveClickTarget(element) {
|
|
2837
|
+
if (element.matches(INTERACTIVE_SELECTOR))
|
|
2838
|
+
return element;
|
|
2839
|
+
const ancestor = element.closest(INTERACTIVE_SELECTOR);
|
|
2840
|
+
if (ancestor)
|
|
2841
|
+
return ancestor;
|
|
2842
|
+
const descendants = element.querySelectorAll(INTERACTIVE_SELECTOR);
|
|
2843
|
+
const onlyDescendant = descendants.length === 1 ? descendants[0] : null;
|
|
2844
|
+
return onlyDescendant ?? element;
|
|
2845
|
+
}
|
|
2846
|
+
function performClick(element) {
|
|
2847
|
+
const rect = element.getBoundingClientRect();
|
|
2848
|
+
const clientX = rect.left + rect.width / 2;
|
|
2849
|
+
const clientY = rect.top + rect.height / 2;
|
|
2850
|
+
const base = { bubbles: true, cancelable: true, composed: true, clientX, clientY, button: 0 };
|
|
2851
|
+
if (typeof element.focus === "function") {
|
|
2852
|
+
try {
|
|
2853
|
+
element.focus({ preventScroll: true });
|
|
2854
|
+
} catch {}
|
|
2855
|
+
}
|
|
2856
|
+
try {
|
|
2857
|
+
element.dispatchEvent(new PointerEvent("pointerdown", { ...base, pointerId: 1, isPrimary: true }));
|
|
2858
|
+
element.dispatchEvent(new MouseEvent("mousedown", base));
|
|
2859
|
+
element.dispatchEvent(new PointerEvent("pointerup", { ...base, pointerId: 1, isPrimary: true }));
|
|
2860
|
+
element.dispatchEvent(new MouseEvent("mouseup", base));
|
|
2861
|
+
} catch {}
|
|
2862
|
+
element.click();
|
|
2863
|
+
}
|
|
2864
|
+
function performAction(action, element) {
|
|
2865
|
+
switch (action.type) {
|
|
2866
|
+
case "click": {
|
|
2867
|
+
const target = resolveClickTarget(element);
|
|
2868
|
+
target.scrollIntoView({ behavior: "smooth", block: "center" });
|
|
2869
|
+
performClick(target);
|
|
2870
|
+
return;
|
|
2871
|
+
}
|
|
2872
|
+
case "fill":
|
|
2873
|
+
element.scrollIntoView({ behavior: "smooth", block: "center" });
|
|
2874
|
+
performFill(element, action.value);
|
|
2875
|
+
return;
|
|
2876
|
+
case "select":
|
|
2877
|
+
element.scrollIntoView({ behavior: "smooth", block: "center" });
|
|
2878
|
+
performSelect(element, action.value);
|
|
2879
|
+
return;
|
|
2880
|
+
case "scroll":
|
|
2881
|
+
element.scrollIntoView({ behavior: "smooth", block: "center" });
|
|
2882
|
+
return;
|
|
2883
|
+
}
|
|
2884
|
+
}
|
|
2885
|
+
function labelFor(action) {
|
|
2886
|
+
switch (action.type) {
|
|
2887
|
+
case "click":
|
|
2888
|
+
return "Clicking…";
|
|
2889
|
+
case "fill":
|
|
2890
|
+
return "Typing…";
|
|
2891
|
+
case "select":
|
|
2892
|
+
return "Selecting…";
|
|
2893
|
+
case "scroll":
|
|
2894
|
+
return "Scrolling…";
|
|
2895
|
+
case "navigate":
|
|
2896
|
+
return "Navigating…";
|
|
2897
|
+
}
|
|
2898
|
+
}
|
|
2899
|
+
function PageActionHandler() {
|
|
2900
|
+
const [activity, setActivity] = useState7(null);
|
|
2901
|
+
const mountedRef = useRef6(true);
|
|
2902
|
+
const queueRef = useRef6([]);
|
|
2903
|
+
const drainingRef = useRef6(false);
|
|
2904
|
+
const timersRef = useRef6(new Set);
|
|
2905
|
+
const wakesRef = useRef6(new Set);
|
|
2906
|
+
const indicatorTimerRef = useRef6(null);
|
|
2907
|
+
const sleep = useCallback7((ms) => {
|
|
2908
|
+
return new Promise((resolve) => {
|
|
2909
|
+
const wake = () => {
|
|
2910
|
+
wakesRef.current.delete(wake);
|
|
2911
|
+
resolve();
|
|
2912
|
+
};
|
|
2913
|
+
wakesRef.current.add(wake);
|
|
2914
|
+
const timer = setTimeout(() => {
|
|
2915
|
+
timersRef.current.delete(timer);
|
|
2916
|
+
wake();
|
|
2917
|
+
}, ms);
|
|
2918
|
+
timersRef.current.add(timer);
|
|
2919
|
+
});
|
|
2920
|
+
}, []);
|
|
2921
|
+
const showActivity = useCallback7((target) => {
|
|
2922
|
+
if (indicatorTimerRef.current) {
|
|
2923
|
+
clearTimeout(indicatorTimerRef.current);
|
|
2924
|
+
indicatorTimerRef.current = null;
|
|
2925
|
+
}
|
|
2926
|
+
setActivity(target);
|
|
2927
|
+
if (target) {
|
|
2928
|
+
const timer = setTimeout(() => {
|
|
2929
|
+
indicatorTimerRef.current = null;
|
|
2930
|
+
if (mountedRef.current)
|
|
2931
|
+
setActivity(null);
|
|
2932
|
+
}, INDICATOR_LINGER_MS);
|
|
2933
|
+
indicatorTimerRef.current = timer;
|
|
2934
|
+
}
|
|
2935
|
+
}, []);
|
|
2936
|
+
const processOne = useCallback7(async (action) => {
|
|
2937
|
+
if (action.type === "navigate") {
|
|
2938
|
+
queueRef.current.length = 0;
|
|
2939
|
+
if (!isSameOriginHttpUrl(action.url))
|
|
2940
|
+
return;
|
|
2941
|
+
showActivity({ element: document.body, label: labelFor(action) });
|
|
2942
|
+
await sleep(CURSOR_LEAD_BEFORE_ACTION_MS);
|
|
2943
|
+
if (!mountedRef.current)
|
|
2944
|
+
return;
|
|
2945
|
+
window.location.assign(action.url);
|
|
2946
|
+
return;
|
|
2947
|
+
}
|
|
2948
|
+
const element = findElementByRef(action.ref);
|
|
2949
|
+
if (!element || !element.isConnected || !isVisible2(element))
|
|
2950
|
+
return;
|
|
2951
|
+
if (isActionBlocked(element))
|
|
2952
|
+
return;
|
|
2953
|
+
if (action.type === "click" && isActionBlocked(resolveClickTarget(element)))
|
|
2954
|
+
return;
|
|
2955
|
+
showActivity({ element, label: labelFor(action) });
|
|
2956
|
+
await sleep(CURSOR_LEAD_BEFORE_ACTION_MS);
|
|
2957
|
+
if (!mountedRef.current || !element.isConnected)
|
|
2958
|
+
return;
|
|
2959
|
+
runAgentAction(() => performAction(action, element));
|
|
2960
|
+
await sleep(SETTLE_MS);
|
|
2961
|
+
}, [showActivity, sleep]);
|
|
2962
|
+
const drain = useCallback7(async () => {
|
|
2963
|
+
if (drainingRef.current)
|
|
2964
|
+
return;
|
|
2965
|
+
drainingRef.current = true;
|
|
2966
|
+
try {
|
|
2967
|
+
while (mountedRef.current && queueRef.current.length > 0) {
|
|
2968
|
+
const action = queueRef.current.shift();
|
|
2969
|
+
if (!action)
|
|
2970
|
+
break;
|
|
2971
|
+
await processOne(action);
|
|
2972
|
+
}
|
|
2973
|
+
} finally {
|
|
2974
|
+
drainingRef.current = false;
|
|
2975
|
+
}
|
|
2976
|
+
}, [processOne]);
|
|
2977
|
+
const onMessage = useCallback7((msg) => {
|
|
2978
|
+
const action = parsePageAction(msg.payload);
|
|
2979
|
+
if (!action)
|
|
2980
|
+
return;
|
|
2981
|
+
queueRef.current.push(action);
|
|
2982
|
+
drain();
|
|
2983
|
+
}, [drain]);
|
|
2984
|
+
useEffect10(() => {
|
|
2985
|
+
mountedRef.current = true;
|
|
2986
|
+
drainingRef.current = false;
|
|
2987
|
+
return () => {
|
|
2988
|
+
mountedRef.current = false;
|
|
2989
|
+
for (const timer of timersRef.current)
|
|
2990
|
+
clearTimeout(timer);
|
|
2991
|
+
timersRef.current.clear();
|
|
2992
|
+
if (indicatorTimerRef.current) {
|
|
2993
|
+
clearTimeout(indicatorTimerRef.current);
|
|
2994
|
+
indicatorTimerRef.current = null;
|
|
2995
|
+
}
|
|
2996
|
+
for (const wake of wakesRef.current)
|
|
2997
|
+
wake();
|
|
2998
|
+
wakesRef.current.clear();
|
|
2999
|
+
queueRef.current.length = 0;
|
|
3000
|
+
};
|
|
3001
|
+
}, []);
|
|
3002
|
+
useDataChannel2(PAGE_ACTIONS_TOPIC, onMessage);
|
|
3003
|
+
return /* @__PURE__ */ jsx7(AgentActivityIndicator, {
|
|
3004
|
+
target: activity
|
|
3005
|
+
});
|
|
3006
|
+
}
|
|
3007
|
+
|
|
2464
3008
|
// src/components/ShadowHost.tsx
|
|
2465
|
-
import { useLayoutEffect, useRef as
|
|
3009
|
+
import { useLayoutEffect, useRef as useRef7, useState as useState8 } from "react";
|
|
2466
3010
|
import { createPortal } from "react-dom";
|
|
2467
|
-
import { jsx as
|
|
3011
|
+
import { jsx as jsx8, Fragment as Fragment3 } from "react/jsx-runtime";
|
|
2468
3012
|
var PROPERTIES_STYLE_ID = "skippr-tw-properties";
|
|
2469
3013
|
var PROPERTY_RULE = /@property\s+[^{]+\{[^}]*\}/g;
|
|
2470
3014
|
function hoistTailwindProperties(css) {
|
|
@@ -2479,10 +3023,10 @@ function hoistTailwindProperties(css) {
|
|
|
2479
3023
|
return css.replace(PROPERTY_RULE, "");
|
|
2480
3024
|
}
|
|
2481
3025
|
function ShadowHost({ children }) {
|
|
2482
|
-
const hostRef =
|
|
2483
|
-
const [shadowRoot, setShadowRoot] =
|
|
3026
|
+
const hostRef = useRef7(null);
|
|
3027
|
+
const [shadowRoot, setShadowRoot] = useState8(null);
|
|
2484
3028
|
const css = `/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
|
|
2485
|
-
@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-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking: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-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;--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}}}@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-400:oklch(70.4% .191 22.216);--skippr-color-red-700:oklch(50.5% .213 27.518);--skippr-color-amber-400:oklch(82.8% .189 84.429);--skippr-color-emerald-400:oklch(76.5% .177 163.223);--skippr-color-cyan-400:oklch(78.9% .154 211.53);--skippr-color-cyan-900:oklch(39.8% .07 227.392);--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-tracking-wide:.025em;--skippr-tracking-wider:.05em;--skippr-leading-tight:1.25;--skippr-leading-snug:1.375;--skippr-leading-relaxed:1.625;--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\\:top-0{top:calc(var(--skippr-spacing)*0)}.skippr\\:top-full{top:100%}.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-2{bottom:calc(var(--skippr-spacing)*-2)}.skippr\\:-bottom-9{bottom:calc(var(--skippr-spacing)*-9)}.skippr\\:bottom-0{bottom:calc(var(--skippr-spacing)*0)}.skippr\\:bottom-6{bottom:calc(var(--skippr-spacing)*6)}.skippr\\:bottom-20{bottom:calc(var(--skippr-spacing)*20)}.skippr\\:bottom-\\[88px\\]{bottom:88px}.skippr\\:bottom-full{bottom:100%}.skippr\\:left-0{left:calc(var(--skippr-spacing)*0)}.skippr\\:left-1\\/2{left:50%}.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-\\[9998\\]{z-index:9998}.skippr\\:z-\\[9999\\]{z-index:9999}.skippr\\:col-span-2{grid-column:span 2/span 2}.skippr\\:mx-auto{margin-inline:auto}.skippr\\:-mt-\\[5px\\]{margin-top:-5px}.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-3{margin-top:calc(var(--skippr-spacing)*3)}.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\\:line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.skippr\\:line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.skippr\\:flex{display:flex}.skippr\\:grid{display:grid}.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\\.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-11{width:calc(var(--skippr-spacing)*11);height:calc(var(--skippr-spacing)*11)}.skippr\\:size-12{width:calc(var(--skippr-spacing)*12);height:calc(var(--skippr-spacing)*12)}.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-6{height:calc(var(--skippr-spacing)*6)}.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-12{height:calc(var(--skippr-spacing)*12)}.skippr\\:h-\\[min\\(460px\\,calc\\(100vh-200px\\)\\)\\]{height:min(460px,100vh - 200px)}.skippr\\:h-full{height:100%}.skippr\\:min-h-0{min-height:calc(var(--skippr-spacing)*0)}.skippr\\:w-0{width:calc(var(--skippr-spacing)*0)}.skippr\\:w-3{width:calc(var(--skippr-spacing)*3)}.skippr\\:w-4{width:calc(var(--skippr-spacing)*4)}.skippr\\:w-9{width:calc(var(--skippr-spacing)*9)}.skippr\\:w-10{width:calc(var(--skippr-spacing)*10)}.skippr\\:w-\\[2px\\]{width:2px}.skippr\\:w-full{width:100%}.skippr\\:max-w-64{max-width:calc(var(--skippr-spacing)*64)}.skippr\\:max-w-\\[80\\%\\]{max-width:80%}.skippr\\:min-w-0{min-width:calc(var(--skippr-spacing)*0)}.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\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);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\\:rotate-\\[225deg\\]{rotate:225deg}.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-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-pointer{cursor:pointer}.skippr\\:resize-none{resize:none}.skippr\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.skippr\\:flex-col{flex-direction:column}.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\\: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-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\\:overflow-hidden{overflow:hidden}.skippr\\:overflow-y-auto{overflow-y:auto}.skippr\\:rounded-2xl{border-radius:1.125rem}.skippr\\:rounded-\\[1rem\\]{border-radius:1rem}.skippr\\:rounded-\\[10px\\]{border-radius:10px}.skippr\\:rounded-\\[14px\\]{border-radius:14px}.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\\: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-border{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-cyan-400{border-color:var(--skippr-color-cyan-400)}.skippr\\:border-destructive\\/20{border-color:oklab(61.4357% .15892 .0698893/.2)}.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-amber-400{background-color:var(--skippr-color-amber-400)}.skippr\\:bg-background{background-color:oklch(100% 0 0)}.skippr\\:bg-bubble{background-color:#2d2b3d}.skippr\\:bg-bubble\\/15{background-color:oklab(29.9244% .0107414 -.0305411/.15)}.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-cyan-400{background-color:var(--skippr-color-cyan-400)}.skippr\\:bg-destructive{background-color:#d94f4f}.skippr\\:bg-destructive\\/10{background-color:oklab(61.4357% .15892 .0698893/.1)}.skippr\\:bg-destructive\\/15{background-color:oklab(61.4357% .15892 .0698893/.15)}.skippr\\:bg-emerald-400{background-color:var(--skippr-color-emerald-400)}.skippr\\:bg-foreground{background-color:oklch(14.7% .004 49.25)}.skippr\\:bg-muted{background-color:oklch(97% .001 106.424)}.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-primary{background-color:#2d2b3d}.skippr\\:bg-primary-foreground\\/15{background-color:oklab(100% 0 5.96046e-8/.15)}.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-400{background-color:var(--skippr-color-red-400)}.skippr\\:bg-secondary{background-color:#ffdfb5}.skippr\\:bg-transparent{background-color:#0000}.skippr\\:bg-white{background-color:var(--skippr-color-white)}.skippr\\:bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.skippr\\:from-background{--tw-gradient-from:oklch(100% 0 0);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.skippr\\:to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.skippr\\:fill-primary\\/30{fill:oklab(29.9244% .0107414 -.0305411/.3)}.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\\:p-6{padding:calc(var(--skippr-spacing)*6)}.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-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\\:pt-3{padding-top:calc(var(--skippr-spacing)*3)}.skippr\\:pb-5{padding-bottom:calc(var(--skippr-spacing)*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-\\[9px\\]{font-size:9px}.skippr\\:text-\\[10px\\]{font-size:10px}.skippr\\:text-\\[11px\\]{font-size:11px}.skippr\\:leading-5{--tw-leading:calc(var(--skippr-spacing)*5);line-height:calc(var(--skippr-spacing)*5)}.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\\:tracking-wide{--tw-tracking:var(--skippr-tracking-wide);letter-spacing:var(--skippr-tracking-wide)}.skippr\\:tracking-wider{--tw-tracking:var(--skippr-tracking-wider);letter-spacing:var(--skippr-tracking-wider)}.skippr\\:whitespace-nowrap{white-space:nowrap}.skippr\\:text-background{color:oklch(100% 0 0)}.skippr\\:text-bubble{color:#2d2b3d}.skippr\\:text-chart-3{color:oklch(66.6% .179 58.318)}.skippr\\:text-cyan-900{color:var(--skippr-color-cyan-900)}.skippr\\:text-destructive{color:#d94f4f}.skippr\\:text-destructive-foreground{color:oklch(100% 0 0)}.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-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-700{color:var(--skippr-color-red-700)}.skippr\\:text-secondary-foreground{color:#613700}.skippr\\:text-white{color:var(--skippr-color-white)}.skippr\\:uppercase{text-transform:uppercase}.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-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-\\[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_16px_rgba\\(0\\,0\\,0\\,0\\.15\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#00000026),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_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_4px_16px_rgba\\(217\\,79\\,79\\,0\\.45\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#d94f4f73),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\\(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-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-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-foreground\\/10{--tw-ring-color:oklab(14.7% .00261104 .00303026/.1)}.skippr\\:ring-offset-background{--tw-ring-offset-color:oklch(100% 0 0)}.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-\\[opacity\\,transform\\]{transition-property:opacity,transform;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-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:duration-150{--tw-duration:.15s;transition-duration:.15s}.skippr\\:duration-300{--tw-duration:.3s;transition-duration:.3s}.skippr\\:ease-in-out{--tw-ease:var(--skippr-ease-in-out);transition-timing-function:var(--skippr-ease-in-out)}.skippr\\:outline-none{--tw-outline-style:none;outline-style: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\\: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\\: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-accent:hover{background-color:#e7e5e4}.skippr\\:hover\\:bg-bubble:hover{background-color:#2d2b3d}.skippr\\:hover\\:bg-destructive\\/20:hover{background-color:oklab(61.4357% .15892 .0698893/.2)}.skippr\\:hover\\:bg-destructive\\/25:hover{background-color:oklab(61.4357% .15892 .0698893/.25)}.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-muted\\/50:hover{background-color:oklab(97% -.000282743 .000959196/.5)}.skippr\\:hover\\:bg-muted\\/80:hover{background-color:oklab(97% -.000282743 .000959196/.8)}.skippr\\:hover\\:bg-primary-foreground\\/10:hover{background-color:oklab(100% 0 5.96046e-8/.1)}.skippr\\:hover\\:bg-primary\\/90:hover{background-color:oklab(29.9244% .0107414 -.0305411/.9)}.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:#fff}.skippr\\:hover\\:shadow-\\[0_6px_24px_rgba\\(45\\,43\\,61\\,0\\.55\\)\\,0_4px_8px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]:hover{--tw-shadow:0 6px 24px var(--tw-shadow-color,#2d2b3d8c),0 4px 8px 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\\: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-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}.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-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-annotation-pulse{0%,to{box-shadow:0 0 #22d3ee73}50%{box-shadow:0 0 0 10px #22d3ee00}}@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-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)}}.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-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{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-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}@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}@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}}`;
|
|
3029
|
+
@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-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking: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-400:oklch(70.4% .191 22.216);--skippr-color-red-700:oklch(50.5% .213 27.518);--skippr-color-amber-400:oklch(82.8% .189 84.429);--skippr-color-emerald-400:oklch(76.5% .177 163.223);--skippr-color-cyan-400:oklch(78.9% .154 211.53);--skippr-color-cyan-500:oklch(71.5% .143 215.221);--skippr-color-cyan-900:oklch(39.8% .07 227.392);--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-tracking-wide:.025em;--skippr-tracking-wider:.05em;--skippr-leading-tight:1.25;--skippr-leading-snug:1.375;--skippr-leading-relaxed:1.625;--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\\:top-0{top:calc(var(--skippr-spacing)*0)}.skippr\\:top-4{top:calc(var(--skippr-spacing)*4)}.skippr\\:top-full{top:100%}.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-2{bottom:calc(var(--skippr-spacing)*-2)}.skippr\\:-bottom-9{bottom:calc(var(--skippr-spacing)*-9)}.skippr\\:bottom-0{bottom:calc(var(--skippr-spacing)*0)}.skippr\\:bottom-6{bottom:calc(var(--skippr-spacing)*6)}.skippr\\:bottom-20{bottom:calc(var(--skippr-spacing)*20)}.skippr\\:bottom-\\[88px\\]{bottom:88px}.skippr\\:bottom-full{bottom:100%}.skippr\\:left-0{left:calc(var(--skippr-spacing)*0)}.skippr\\:left-1\\/2{left:50%}.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-\\[9998\\]{z-index:9998}.skippr\\:z-\\[9999\\]{z-index:9999}.skippr\\:col-span-2{grid-column:span 2/span 2}.skippr\\:mx-auto{margin-inline:auto}.skippr\\:-mt-\\[5px\\]{margin-top:-5px}.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-3{margin-top:calc(var(--skippr-spacing)*3)}.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\\:line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.skippr\\:line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.skippr\\:flex{display:flex}.skippr\\:grid{display:grid}.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\\.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-11{width:calc(var(--skippr-spacing)*11);height:calc(var(--skippr-spacing)*11)}.skippr\\:size-12{width:calc(var(--skippr-spacing)*12);height:calc(var(--skippr-spacing)*12)}.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-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-12{height:calc(var(--skippr-spacing)*12)}.skippr\\:h-\\[min\\(460px\\,calc\\(100vh-200px\\)\\)\\]{height:min(460px,100vh - 200px)}.skippr\\:h-full{height:100%}.skippr\\:min-h-0{min-height:calc(var(--skippr-spacing)*0)}.skippr\\:w-0{width:calc(var(--skippr-spacing)*0)}.skippr\\:w-3{width:calc(var(--skippr-spacing)*3)}.skippr\\:w-4{width:calc(var(--skippr-spacing)*4)}.skippr\\:w-5{width:calc(var(--skippr-spacing)*5)}.skippr\\:w-9{width:calc(var(--skippr-spacing)*9)}.skippr\\:w-10{width:calc(var(--skippr-spacing)*10)}.skippr\\:w-\\[2px\\]{width:2px}.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\\:min-w-0{min-width:calc(var(--skippr-spacing)*0)}.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\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);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\\:rotate-\\[225deg\\]{rotate:225deg}.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-press{animation:.5s ease-in-out skippr-press}.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-pointer{cursor:pointer}.skippr\\:resize-none{resize:none}.skippr\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.skippr\\:flex-col{flex-direction:column}.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\\: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-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-2xl{border-radius:1.125rem}.skippr\\:rounded-\\[1rem\\]{border-radius:1rem}.skippr\\:rounded-\\[10px\\]{border-radius:10px}.skippr\\:rounded-\\[14px\\]{border-radius:14px}.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\\: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-border{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-cyan-400{border-color:var(--skippr-color-cyan-400)}.skippr\\:border-destructive\\/20{border-color:oklab(61.4357% .15892 .0698893/.2)}.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-amber-400{background-color:var(--skippr-color-amber-400)}.skippr\\:bg-background{background-color:oklch(100% 0 0)}.skippr\\:bg-bubble{background-color:#2d2b3d}.skippr\\:bg-bubble\\/15{background-color:oklab(29.9244% .0107414 -.0305411/.15)}.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-cyan-400{background-color:var(--skippr-color-cyan-400)}.skippr\\:bg-cyan-500{background-color:var(--skippr-color-cyan-500)}.skippr\\:bg-destructive{background-color:#d94f4f}.skippr\\:bg-destructive\\/10{background-color:oklab(61.4357% .15892 .0698893/.1)}.skippr\\:bg-destructive\\/15{background-color:oklab(61.4357% .15892 .0698893/.15)}.skippr\\:bg-emerald-400{background-color:var(--skippr-color-emerald-400)}.skippr\\:bg-foreground{background-color:oklch(14.7% .004 49.25)}.skippr\\:bg-muted{background-color:oklch(97% .001 106.424)}.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-primary{background-color:#2d2b3d}.skippr\\:bg-primary-foreground\\/15{background-color:oklab(100% 0 5.96046e-8/.15)}.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-400{background-color:var(--skippr-color-red-400)}.skippr\\:bg-secondary{background-color:#ffdfb5}.skippr\\:bg-transparent{background-color:#0000}.skippr\\:bg-white{background-color:var(--skippr-color-white)}.skippr\\:bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.skippr\\:from-background{--tw-gradient-from:oklch(100% 0 0);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.skippr\\:to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.skippr\\:fill-primary\\/30{fill:oklab(29.9244% .0107414 -.0305411/.3)}.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\\:p-6{padding:calc(var(--skippr-spacing)*6)}.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-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\\:pt-3{padding-top:calc(var(--skippr-spacing)*3)}.skippr\\:pr-1\\.5{padding-right:calc(var(--skippr-spacing)*1.5)}.skippr\\:pb-5{padding-bottom:calc(var(--skippr-spacing)*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-\\[9px\\]{font-size:9px}.skippr\\:text-\\[10px\\]{font-size:10px}.skippr\\:text-\\[11px\\]{font-size:11px}.skippr\\:leading-5{--tw-leading:calc(var(--skippr-spacing)*5);line-height:calc(var(--skippr-spacing)*5)}.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\\:tracking-wide{--tw-tracking:var(--skippr-tracking-wide);letter-spacing:var(--skippr-tracking-wide)}.skippr\\:tracking-wider{--tw-tracking:var(--skippr-tracking-wider);letter-spacing:var(--skippr-tracking-wider)}.skippr\\:whitespace-nowrap{white-space:nowrap}.skippr\\:text-background{color:oklch(100% 0 0)}.skippr\\:text-bubble{color:#2d2b3d}.skippr\\:text-chart-3{color:oklch(66.6% .179 58.318)}.skippr\\:text-cyan-500{color:var(--skippr-color-cyan-500)}.skippr\\:text-cyan-900{color:var(--skippr-color-cyan-900)}.skippr\\:text-destructive{color:#d94f4f}.skippr\\:text-destructive-foreground{color:oklch(100% 0 0)}.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-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-700{color:var(--skippr-color-red-700)}.skippr\\:text-secondary-foreground{color:#613700}.skippr\\:text-white,.skippr\\:text-white\\/70{color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-white\\/70{color:color-mix(in oklab,var(--skippr-color-white)70%,transparent)}}.skippr\\:uppercase{text-transform:uppercase}.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-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-\\[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_12px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 4px 12px 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_4px_16px_rgba\\(0\\,0\\,0\\,0\\.15\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#00000026),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_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_4px_16px_rgba\\(217\\,79\\,79\\,0\\.45\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#d94f4f73),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\\(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-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-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-foreground\\/10{--tw-ring-color:oklab(14.7% .00261104 .00303026/.1)}.skippr\\:ring-offset-background{--tw-ring-offset-color:oklch(100% 0 0)}.skippr\\:drop-shadow-\\[0_1px_3px_rgba\\(0\\,0\\,0\\,0\\.35\\)\\]{--tw-drop-shadow-size:drop-shadow(0 1px 3px var(--tw-drop-shadow-color,#00000059));--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-\\[opacity\\,transform\\]{transition-property:opacity,transform;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-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:duration-150{--tw-duration:.15s;transition-duration:.15s}.skippr\\:duration-300{--tw-duration:.3s;transition-duration:.3s}.skippr\\:ease-in-out{--tw-ease:var(--skippr-ease-in-out);transition-timing-function:var(--skippr-ease-in-out)}.skippr\\:outline-none{--tw-outline-style:none;outline-style: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\\: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\\: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-accent:hover{background-color:#e7e5e4}.skippr\\:hover\\:bg-bubble:hover{background-color:#2d2b3d}.skippr\\:hover\\:bg-destructive\\/20:hover{background-color:oklab(61.4357% .15892 .0698893/.2)}.skippr\\:hover\\:bg-destructive\\/25:hover{background-color:oklab(61.4357% .15892 .0698893/.25)}.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-muted\\/50:hover{background-color:oklab(97% -.000282743 .000959196/.5)}.skippr\\:hover\\:bg-muted\\/80:hover{background-color:oklab(97% -.000282743 .000959196/.8)}.skippr\\:hover\\:bg-primary-foreground\\/10:hover{background-color:oklab(100% 0 5.96046e-8/.1)}.skippr\\:hover\\:bg-primary\\/90:hover{background-color:oklab(29.9244% .0107414 -.0305411/.9)}.skippr\\:hover\\:bg-secondary\\/80:hover{background-color:oklab(91.9963% .0175391 .0626889/.8)}.skippr\\:hover\\:bg-white\\/15:hover{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:hover\\:bg-white\\/15:hover{background-color:color-mix(in oklab,var(--skippr-color-white)15%,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\\:text-white:hover{color:var(--skippr-color-white)}.skippr\\:hover\\:opacity-90:hover{opacity:.9}.skippr\\:hover\\:shadow-\\[0_6px_24px_rgba\\(45\\,43\\,61\\,0\\.55\\)\\,0_4px_8px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]:hover{--tw-shadow:0 6px 24px var(--tw-shadow-color,#2d2b3d8c),0 4px 8px 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\\: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-ring:focus-visible{--tw-ring-color:oklch(70.9% .01 56.259)}.skippr\\:focus-visible\\:ring-white\\/70:focus-visible{--tw-ring-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:focus-visible\\:ring-white\\/70:focus-visible{--tw-ring-color:color-mix(in oklab,var(--skippr-color-white)70%,transparent)}}.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\\:focus-visible\\:ring-inset:focus-visible{--tw-ring-inset:inset}.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}.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-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-annotation-pulse{0%,to{box-shadow:0 0 #22d3ee73}50%{box-shadow:0 0 0 10px #22d3ee00}}@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-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)}}.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-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{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}}`;
|
|
2486
3030
|
useLayoutEffect(() => {
|
|
2487
3031
|
const host = hostRef.current;
|
|
2488
3032
|
if (!host || !css)
|
|
@@ -2497,20 +3041,20 @@ function ShadowHost({ children }) {
|
|
|
2497
3041
|
setShadowRoot(root);
|
|
2498
3042
|
}, [css]);
|
|
2499
3043
|
if (!css)
|
|
2500
|
-
return /* @__PURE__ */
|
|
3044
|
+
return /* @__PURE__ */ jsx8(Fragment3, {
|
|
2501
3045
|
children
|
|
2502
3046
|
});
|
|
2503
|
-
return /* @__PURE__ */
|
|
3047
|
+
return /* @__PURE__ */ jsx8("div", {
|
|
2504
3048
|
ref: hostRef,
|
|
2505
3049
|
children: shadowRoot && createPortal(children, shadowRoot)
|
|
2506
3050
|
});
|
|
2507
3051
|
}
|
|
2508
3052
|
|
|
2509
3053
|
// src/components/Sidebar.tsx
|
|
2510
|
-
import { useContext as
|
|
3054
|
+
import { useContext as useContext6, useEffect as useEffect19 } from "react";
|
|
2511
3055
|
|
|
2512
3056
|
// src/hooks/useCombinedMessages.ts
|
|
2513
|
-
import { useContext as
|
|
3057
|
+
import { useContext as useContext4, useMemo as useMemo4 } from "react";
|
|
2514
3058
|
|
|
2515
3059
|
// src/hooks/useChatMessages.ts
|
|
2516
3060
|
import { useChat, useLocalParticipant as useLocalParticipant4 } from "@livekit/components-react/hooks";
|
|
@@ -2578,7 +3122,7 @@ function useCombinedMessages() {
|
|
|
2578
3122
|
const { transcriptMessages } = useStreamingTranscript();
|
|
2579
3123
|
const { chatMessages, sendChatMessage, isSendingChat } = useChatMessages();
|
|
2580
3124
|
const { state: agentState } = useAgentVoiceState();
|
|
2581
|
-
const historyMessages =
|
|
3125
|
+
const historyMessages = useContext4(LiveAgentContext)?.historyMessages ?? [];
|
|
2582
3126
|
const liveMessages = useMemo4(() => {
|
|
2583
3127
|
if (chatMessages.length === 0)
|
|
2584
3128
|
return transcriptMessages;
|
|
@@ -2596,15 +3140,15 @@ function useCombinedMessages() {
|
|
|
2596
3140
|
}
|
|
2597
3141
|
|
|
2598
3142
|
// src/hooks/usePhaseUpdates.ts
|
|
2599
|
-
import { useCallback as
|
|
3143
|
+
import { useCallback as useCallback8, useContext as useContext5, useEffect as useEffect12 } from "react";
|
|
2600
3144
|
|
|
2601
3145
|
// src/hooks/useAgentState.ts
|
|
2602
3146
|
import { useRemoteParticipants } from "@livekit/components-react/hooks";
|
|
2603
|
-
import { useEffect as
|
|
3147
|
+
import { useEffect as useEffect11, useState as useState9 } from "react";
|
|
2604
3148
|
function useAgentState(attributeKey, parse, initial) {
|
|
2605
|
-
const [value, setValue] =
|
|
3149
|
+
const [value, setValue] = useState9(initial);
|
|
2606
3150
|
const remoteParticipants = useRemoteParticipants();
|
|
2607
|
-
|
|
3151
|
+
useEffect11(() => {
|
|
2608
3152
|
const agentParticipant = remoteParticipants.find((p) => p.attributes?.[attributeKey]);
|
|
2609
3153
|
if (agentParticipant) {
|
|
2610
3154
|
const attr = agentParticipant.attributes?.[attributeKey];
|
|
@@ -2650,10 +3194,10 @@ function parsePhases(json) {
|
|
|
2650
3194
|
return null;
|
|
2651
3195
|
}
|
|
2652
3196
|
function usePhaseUpdates() {
|
|
2653
|
-
const parse =
|
|
3197
|
+
const parse = useCallback8(parsePhases, []);
|
|
2654
3198
|
const livePhases = useAgentState("phases", parse, []);
|
|
2655
|
-
const ctx =
|
|
2656
|
-
|
|
3199
|
+
const ctx = useContext5(LiveAgentContext);
|
|
3200
|
+
useEffect12(() => {
|
|
2657
3201
|
if (livePhases.length > 0)
|
|
2658
3202
|
ctx?.setPhasesSnapshot(livePhases);
|
|
2659
3203
|
}, [livePhases, ctx?.setPhasesSnapshot]);
|
|
@@ -2662,7 +3206,7 @@ function usePhaseUpdates() {
|
|
|
2662
3206
|
}
|
|
2663
3207
|
|
|
2664
3208
|
// src/hooks/useSessionRemaining.ts
|
|
2665
|
-
import { useEffect as
|
|
3209
|
+
import { useEffect as useEffect13, useRef as useRef8, useState as useState10 } from "react";
|
|
2666
3210
|
|
|
2667
3211
|
// src/lib/format.ts
|
|
2668
3212
|
function formatTime(seconds) {
|
|
@@ -2678,9 +3222,9 @@ function parseNumber(s) {
|
|
|
2678
3222
|
// src/hooks/useSessionRemaining.ts
|
|
2679
3223
|
function useSessionRemaining() {
|
|
2680
3224
|
const maxCallDuration = useAgentState("maxCallDuration", parseNumber, null);
|
|
2681
|
-
const endTimeRef =
|
|
2682
|
-
const [remaining, setRemaining] =
|
|
2683
|
-
|
|
3225
|
+
const endTimeRef = useRef8(null);
|
|
3226
|
+
const [remaining, setRemaining] = useState10(null);
|
|
3227
|
+
useEffect13(() => {
|
|
2684
3228
|
if (maxCallDuration === null || endTimeRef.current !== null)
|
|
2685
3229
|
return;
|
|
2686
3230
|
const endTime = Date.now() + maxCallDuration * 1000;
|
|
@@ -2697,10 +3241,10 @@ function useSessionRemaining() {
|
|
|
2697
3241
|
}
|
|
2698
3242
|
|
|
2699
3243
|
// src/hooks/useElapsedSeconds.ts
|
|
2700
|
-
import { useEffect as
|
|
3244
|
+
import { useEffect as useEffect14, useState as useState11 } from "react";
|
|
2701
3245
|
function useElapsedSeconds(isRunning) {
|
|
2702
|
-
const [elapsed, setElapsed] =
|
|
2703
|
-
|
|
3246
|
+
const [elapsed, setElapsed] = useState11(0);
|
|
3247
|
+
useEffect14(() => {
|
|
2704
3248
|
if (!isRunning) {
|
|
2705
3249
|
setElapsed(0);
|
|
2706
3250
|
return;
|
|
@@ -2716,50 +3260,50 @@ function useElapsedSeconds(isRunning) {
|
|
|
2716
3260
|
}
|
|
2717
3261
|
|
|
2718
3262
|
// src/components/ChatHeader.tsx
|
|
2719
|
-
import { jsx as
|
|
3263
|
+
import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
2720
3264
|
function ChatHeader() {
|
|
2721
3265
|
const { isConnected, minimizePanel, minimizable } = useLiveAgent();
|
|
2722
3266
|
const elapsed = useElapsedSeconds(isConnected);
|
|
2723
|
-
return /* @__PURE__ */
|
|
3267
|
+
return /* @__PURE__ */ jsxs7("header", {
|
|
2724
3268
|
className: "skippr:sticky skippr:top-0 skippr:z-10 skippr:flex skippr:shrink-0 skippr:items-center skippr:justify-between skippr:border-b skippr:border-border skippr:bg-primary skippr:px-4 skippr:py-3",
|
|
2725
3269
|
children: [
|
|
2726
|
-
/* @__PURE__ */
|
|
3270
|
+
/* @__PURE__ */ jsx9("p", {
|
|
2727
3271
|
className: "skippr:text-sm skippr:font-semibold skippr:text-primary-foreground",
|
|
2728
3272
|
children: "Skippr"
|
|
2729
3273
|
}),
|
|
2730
|
-
/* @__PURE__ */
|
|
3274
|
+
/* @__PURE__ */ jsxs7("div", {
|
|
2731
3275
|
className: "skippr:flex skippr:items-center skippr:gap-2",
|
|
2732
3276
|
children: [
|
|
2733
|
-
isConnected && /* @__PURE__ */
|
|
3277
|
+
isConnected && /* @__PURE__ */ jsxs7("div", {
|
|
2734
3278
|
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",
|
|
2735
3279
|
children: [
|
|
2736
|
-
/* @__PURE__ */
|
|
3280
|
+
/* @__PURE__ */ jsxs7("span", {
|
|
2737
3281
|
className: "skippr:relative skippr:flex skippr:size-1.5",
|
|
2738
3282
|
children: [
|
|
2739
|
-
/* @__PURE__ */
|
|
3283
|
+
/* @__PURE__ */ jsx9("span", {
|
|
2740
3284
|
className: "skippr:absolute skippr:inline-flex skippr:h-full skippr:w-full skippr:animate-ping skippr:rounded-full skippr:bg-red-400 skippr:opacity-75"
|
|
2741
3285
|
}),
|
|
2742
|
-
/* @__PURE__ */
|
|
3286
|
+
/* @__PURE__ */ jsx9("span", {
|
|
2743
3287
|
className: "skippr:relative skippr:inline-flex skippr:size-1.5 skippr:rounded-full skippr:bg-red-400"
|
|
2744
3288
|
})
|
|
2745
3289
|
]
|
|
2746
3290
|
}),
|
|
2747
|
-
/* @__PURE__ */
|
|
3291
|
+
/* @__PURE__ */ jsx9("span", {
|
|
2748
3292
|
className: "skippr:text-[10px] skippr:font-medium skippr:text-primary-foreground",
|
|
2749
3293
|
children: "REC"
|
|
2750
3294
|
}),
|
|
2751
|
-
/* @__PURE__ */
|
|
3295
|
+
/* @__PURE__ */ jsx9("span", {
|
|
2752
3296
|
className: "skippr:text-[10px] skippr:font-mono skippr:text-primary-foreground",
|
|
2753
3297
|
children: formatTime(elapsed)
|
|
2754
3298
|
})
|
|
2755
3299
|
]
|
|
2756
3300
|
}),
|
|
2757
|
-
minimizable && /* @__PURE__ */
|
|
3301
|
+
minimizable && /* @__PURE__ */ jsx9("button", {
|
|
2758
3302
|
type: "button",
|
|
2759
3303
|
onClick: minimizePanel,
|
|
2760
3304
|
"aria-label": "Minimize",
|
|
2761
3305
|
className: "skippr:flex skippr:size-6 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-md skippr:text-primary-foreground/70 skippr:transition-colors skippr:hover:bg-primary-foreground/10 skippr:hover:text-primary-foreground",
|
|
2762
|
-
children: /* @__PURE__ */
|
|
3306
|
+
children: /* @__PURE__ */ jsx9(Minimize2, {
|
|
2763
3307
|
className: "skippr:size-3.5"
|
|
2764
3308
|
})
|
|
2765
3309
|
})
|
|
@@ -2770,26 +3314,26 @@ function ChatHeader() {
|
|
|
2770
3314
|
}
|
|
2771
3315
|
|
|
2772
3316
|
// src/components/LoadingDots.tsx
|
|
2773
|
-
import { jsx as
|
|
3317
|
+
import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
2774
3318
|
function LoadingDots({ label }) {
|
|
2775
|
-
return /* @__PURE__ */
|
|
3319
|
+
return /* @__PURE__ */ jsxs8("div", {
|
|
2776
3320
|
className: "skippr:flex skippr:items-center skippr:gap-2 skippr:py-4",
|
|
2777
3321
|
children: [
|
|
2778
|
-
/* @__PURE__ */
|
|
3322
|
+
/* @__PURE__ */ jsxs8("div", {
|
|
2779
3323
|
className: "skippr:flex skippr:gap-1",
|
|
2780
3324
|
children: [
|
|
2781
|
-
/* @__PURE__ */
|
|
3325
|
+
/* @__PURE__ */ jsx10("span", {
|
|
2782
3326
|
className: "skippr:size-1.5 skippr:rounded-full skippr:bg-muted-foreground/40 skippr:animate-bounce skippr:[animation-delay:0ms]"
|
|
2783
3327
|
}),
|
|
2784
|
-
/* @__PURE__ */
|
|
3328
|
+
/* @__PURE__ */ jsx10("span", {
|
|
2785
3329
|
className: "skippr:size-1.5 skippr:rounded-full skippr:bg-muted-foreground/40 skippr:animate-bounce skippr:[animation-delay:150ms]"
|
|
2786
3330
|
}),
|
|
2787
|
-
/* @__PURE__ */
|
|
3331
|
+
/* @__PURE__ */ jsx10("span", {
|
|
2788
3332
|
className: "skippr:size-1.5 skippr:rounded-full skippr:bg-muted-foreground/40 skippr:animate-bounce skippr:[animation-delay:300ms]"
|
|
2789
3333
|
})
|
|
2790
3334
|
]
|
|
2791
3335
|
}),
|
|
2792
|
-
/* @__PURE__ */
|
|
3336
|
+
/* @__PURE__ */ jsx10("p", {
|
|
2793
3337
|
className: "skippr:text-xs skippr:text-muted-foreground",
|
|
2794
3338
|
children: label
|
|
2795
3339
|
})
|
|
@@ -2798,11 +3342,11 @@ function LoadingDots({ label }) {
|
|
|
2798
3342
|
}
|
|
2799
3343
|
|
|
2800
3344
|
// src/components/LoginFlow.tsx
|
|
2801
|
-
import { useCallback as
|
|
3345
|
+
import { useCallback as useCallback9, useEffect as useEffect15, useRef as useRef9, useState as useState12 } from "react";
|
|
2802
3346
|
|
|
2803
3347
|
// src/components/ui/button.tsx
|
|
2804
3348
|
import { forwardRef as forwardRef3 } from "react";
|
|
2805
|
-
import { jsx as
|
|
3349
|
+
import { jsx as jsx11 } from "react/jsx-runtime";
|
|
2806
3350
|
var variantClasses = {
|
|
2807
3351
|
default: "skippr:bg-primary skippr:text-primary-foreground skippr:hover:bg-primary/90",
|
|
2808
3352
|
destructive: "skippr:bg-destructive skippr:text-white skippr:hover:bg-destructive/90",
|
|
@@ -2821,7 +3365,7 @@ var sizeClasses = {
|
|
|
2821
3365
|
"icon-lg": "skippr:size-10"
|
|
2822
3366
|
};
|
|
2823
3367
|
var Button = forwardRef3(({ className, variant = "default", size = "default", ...props }, ref) => {
|
|
2824
|
-
return /* @__PURE__ */
|
|
3368
|
+
return /* @__PURE__ */ jsx11("button", {
|
|
2825
3369
|
className: cn("skippr:inline-flex skippr:items-center skippr:justify-center skippr:gap-2 skippr:whitespace-nowrap skippr:rounded-md skippr:text-sm skippr:font-medium skippr:ring-offset-background skippr:transition-all skippr:cursor-pointer skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-ring skippr:focus-visible:ring-offset-2 skippr:disabled:pointer-events-none skippr:disabled:opacity-50 skippr:shrink-0 skippr:[&_svg]:pointer-events-none skippr:[&_svg:not([class*='size-'])]:size-4 skippr:[&_svg]:shrink-0", variantClasses[variant], sizeClasses[size], className),
|
|
2826
3370
|
ref,
|
|
2827
3371
|
...props
|
|
@@ -2830,28 +3374,28 @@ var Button = forwardRef3(({ className, variant = "default", size = "default", ..
|
|
|
2830
3374
|
Button.displayName = "Button";
|
|
2831
3375
|
|
|
2832
3376
|
// src/components/LoginFlow.tsx
|
|
2833
|
-
import { jsx as
|
|
3377
|
+
import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
2834
3378
|
var OTP_LENGTH = 6;
|
|
2835
3379
|
var DIGIT_KEYS = ["d0", "d1", "d2", "d3", "d4", "d5"];
|
|
2836
3380
|
function LoginFlow({ requestOtp, verifyOtp, error, isSubmitting }) {
|
|
2837
|
-
const [step, setStep] =
|
|
2838
|
-
const [email, setEmail] =
|
|
2839
|
-
const handleRequestOtp =
|
|
3381
|
+
const [step, setStep] = useState12("email");
|
|
3382
|
+
const [email, setEmail] = useState12("");
|
|
3383
|
+
const handleRequestOtp = useCallback9(async (emailValue) => {
|
|
2840
3384
|
const success = await requestOtp(emailValue);
|
|
2841
3385
|
if (success)
|
|
2842
3386
|
setStep("otp");
|
|
2843
3387
|
}, [requestOtp]);
|
|
2844
|
-
const handleVerifyOtp =
|
|
3388
|
+
const handleVerifyOtp = useCallback9(async (code) => {
|
|
2845
3389
|
await verifyOtp(email, code);
|
|
2846
3390
|
}, [verifyOtp, email]);
|
|
2847
|
-
const handleBack =
|
|
3391
|
+
const handleBack = useCallback9(() => {
|
|
2848
3392
|
setStep("email");
|
|
2849
3393
|
}, []);
|
|
2850
|
-
const handleResend =
|
|
3394
|
+
const handleResend = useCallback9(async () => {
|
|
2851
3395
|
await requestOtp(email);
|
|
2852
3396
|
}, [requestOtp, email]);
|
|
2853
3397
|
if (step === "otp") {
|
|
2854
|
-
return /* @__PURE__ */
|
|
3398
|
+
return /* @__PURE__ */ jsx12(OtpStep, {
|
|
2855
3399
|
email,
|
|
2856
3400
|
onSubmit: handleVerifyOtp,
|
|
2857
3401
|
onResend: handleResend,
|
|
@@ -2860,7 +3404,7 @@ function LoginFlow({ requestOtp, verifyOtp, error, isSubmitting }) {
|
|
|
2860
3404
|
isSubmitting
|
|
2861
3405
|
});
|
|
2862
3406
|
}
|
|
2863
|
-
return /* @__PURE__ */
|
|
3407
|
+
return /* @__PURE__ */ jsx12(EmailStep, {
|
|
2864
3408
|
email,
|
|
2865
3409
|
onEmailChange: setEmail,
|
|
2866
3410
|
onSubmit: handleRequestOtp,
|
|
@@ -2874,30 +3418,30 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
|
|
|
2874
3418
|
if (email.trim())
|
|
2875
3419
|
onSubmit(email.trim());
|
|
2876
3420
|
}
|
|
2877
|
-
return /* @__PURE__ */
|
|
3421
|
+
return /* @__PURE__ */ jsxs9("div", {
|
|
2878
3422
|
className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:px-4 skippr:py-4",
|
|
2879
3423
|
children: [
|
|
2880
|
-
/* @__PURE__ */
|
|
3424
|
+
/* @__PURE__ */ jsxs9("div", {
|
|
2881
3425
|
className: "skippr:mb-4 skippr:text-center",
|
|
2882
3426
|
children: [
|
|
2883
|
-
/* @__PURE__ */
|
|
3427
|
+
/* @__PURE__ */ jsx12(Mail, {
|
|
2884
3428
|
className: "skippr:mx-auto skippr:mb-2 skippr:size-6 skippr:text-primary"
|
|
2885
3429
|
}),
|
|
2886
|
-
/* @__PURE__ */
|
|
3430
|
+
/* @__PURE__ */ jsx12("p", {
|
|
2887
3431
|
className: "skippr:text-sm skippr:font-medium skippr:text-foreground",
|
|
2888
3432
|
children: "Sign in to continue"
|
|
2889
3433
|
}),
|
|
2890
|
-
/* @__PURE__ */
|
|
3434
|
+
/* @__PURE__ */ jsx12("p", {
|
|
2891
3435
|
className: "skippr:mt-1 skippr:text-xs skippr:text-muted-foreground",
|
|
2892
3436
|
children: "Your email will be used to identify you across sessions"
|
|
2893
3437
|
})
|
|
2894
3438
|
]
|
|
2895
3439
|
}),
|
|
2896
|
-
/* @__PURE__ */
|
|
3440
|
+
/* @__PURE__ */ jsxs9("form", {
|
|
2897
3441
|
onSubmit: handleSubmit,
|
|
2898
3442
|
className: "skippr:flex skippr:flex-col skippr:gap-3",
|
|
2899
3443
|
children: [
|
|
2900
|
-
/* @__PURE__ */
|
|
3444
|
+
/* @__PURE__ */ jsx12("input", {
|
|
2901
3445
|
type: "email",
|
|
2902
3446
|
placeholder: "you@example.com",
|
|
2903
3447
|
value: email,
|
|
@@ -2906,15 +3450,15 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
|
|
|
2906
3450
|
required: true,
|
|
2907
3451
|
className: "skippr:w-full skippr:rounded-md skippr:border skippr:border-border skippr:bg-background skippr:px-3 skippr:py-2 skippr:text-sm skippr:text-foreground skippr:placeholder-muted-foreground skippr:outline-none focus:skippr:ring-2 focus:skippr:ring-primary/30 focus:skippr:border-primary disabled:skippr:opacity-50"
|
|
2908
3452
|
}),
|
|
2909
|
-
/* @__PURE__ */
|
|
3453
|
+
/* @__PURE__ */ jsx12(Button, {
|
|
2910
3454
|
type: "submit",
|
|
2911
3455
|
disabled: isSubmitting || !email.trim(),
|
|
2912
3456
|
className: "skippr:w-full",
|
|
2913
|
-
children: isSubmitting ? /* @__PURE__ */
|
|
3457
|
+
children: isSubmitting ? /* @__PURE__ */ jsx12(LoaderCircle, {
|
|
2914
3458
|
className: "skippr:size-4 skippr:animate-spin"
|
|
2915
3459
|
}) : "Continue"
|
|
2916
3460
|
}),
|
|
2917
|
-
error && /* @__PURE__ */
|
|
3461
|
+
error && /* @__PURE__ */ jsx12("p", {
|
|
2918
3462
|
className: "skippr:text-xs skippr:text-center skippr:text-destructive",
|
|
2919
3463
|
children: error
|
|
2920
3464
|
})
|
|
@@ -2924,30 +3468,30 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
|
|
|
2924
3468
|
});
|
|
2925
3469
|
}
|
|
2926
3470
|
function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
2927
|
-
const [digits, setDigits] =
|
|
2928
|
-
const [resendCooldown, setResendCooldown] =
|
|
2929
|
-
const inputRefs =
|
|
2930
|
-
const submittedRef =
|
|
2931
|
-
|
|
3471
|
+
const [digits, setDigits] = useState12(Array(OTP_LENGTH).fill(""));
|
|
3472
|
+
const [resendCooldown, setResendCooldown] = useState12(0);
|
|
3473
|
+
const inputRefs = useRef9([]);
|
|
3474
|
+
const submittedRef = useRef9(false);
|
|
3475
|
+
useEffect15(() => {
|
|
2932
3476
|
inputRefs.current[0]?.focus();
|
|
2933
3477
|
}, []);
|
|
2934
|
-
|
|
3478
|
+
useEffect15(() => {
|
|
2935
3479
|
if (error)
|
|
2936
3480
|
submittedRef.current = false;
|
|
2937
3481
|
}, [error]);
|
|
2938
|
-
|
|
3482
|
+
useEffect15(() => {
|
|
2939
3483
|
if (resendCooldown <= 0)
|
|
2940
3484
|
return;
|
|
2941
3485
|
const timer = setTimeout(() => setResendCooldown((c) => c - 1), 1000);
|
|
2942
3486
|
return () => clearTimeout(timer);
|
|
2943
3487
|
}, [resendCooldown]);
|
|
2944
|
-
const submitCode =
|
|
3488
|
+
const submitCode = useCallback9((code) => {
|
|
2945
3489
|
if (submittedRef.current || isSubmitting)
|
|
2946
3490
|
return;
|
|
2947
3491
|
submittedRef.current = true;
|
|
2948
3492
|
onSubmit(code);
|
|
2949
3493
|
}, [onSubmit, isSubmitting]);
|
|
2950
|
-
const handleDigitChange =
|
|
3494
|
+
const handleDigitChange = useCallback9((index2, value) => {
|
|
2951
3495
|
const digit = value.replace(/\D/g, "").slice(-1);
|
|
2952
3496
|
const newDigits = [...digits];
|
|
2953
3497
|
newDigits[index2] = digit;
|
|
@@ -2961,12 +3505,12 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
|
2961
3505
|
submitCode(code);
|
|
2962
3506
|
}
|
|
2963
3507
|
}, [digits, submitCode]);
|
|
2964
|
-
const handleKeyDown =
|
|
3508
|
+
const handleKeyDown = useCallback9((index2, e) => {
|
|
2965
3509
|
if (e.key === "Backspace" && !digits[index2] && index2 > 0) {
|
|
2966
3510
|
inputRefs.current[index2 - 1]?.focus();
|
|
2967
3511
|
}
|
|
2968
3512
|
}, [digits]);
|
|
2969
|
-
const handlePaste =
|
|
3513
|
+
const handlePaste = useCallback9((e) => {
|
|
2970
3514
|
e.preventDefault();
|
|
2971
3515
|
const pasted = e.clipboardData.getData("text").replace(/\D/g, "").slice(0, OTP_LENGTH);
|
|
2972
3516
|
if (pasted.length > 0) {
|
|
@@ -2994,22 +3538,22 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
|
2994
3538
|
submittedRef.current = false;
|
|
2995
3539
|
inputRefs.current[0]?.focus();
|
|
2996
3540
|
}
|
|
2997
|
-
return /* @__PURE__ */
|
|
3541
|
+
return /* @__PURE__ */ jsxs9("div", {
|
|
2998
3542
|
className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:px-4 skippr:py-4",
|
|
2999
3543
|
children: [
|
|
3000
|
-
/* @__PURE__ */
|
|
3544
|
+
/* @__PURE__ */ jsxs9("div", {
|
|
3001
3545
|
className: "skippr:mb-4 skippr:text-center",
|
|
3002
3546
|
children: [
|
|
3003
|
-
/* @__PURE__ */
|
|
3547
|
+
/* @__PURE__ */ jsx12("p", {
|
|
3004
3548
|
className: "skippr:text-sm skippr:font-medium skippr:text-foreground",
|
|
3005
3549
|
children: "Enter verification code"
|
|
3006
3550
|
}),
|
|
3007
|
-
/* @__PURE__ */
|
|
3551
|
+
/* @__PURE__ */ jsxs9("p", {
|
|
3008
3552
|
className: "skippr:mt-1 skippr:text-xs skippr:text-muted-foreground",
|
|
3009
3553
|
children: [
|
|
3010
3554
|
"We sent a 6-digit code to",
|
|
3011
3555
|
" ",
|
|
3012
|
-
/* @__PURE__ */
|
|
3556
|
+
/* @__PURE__ */ jsx12("span", {
|
|
3013
3557
|
className: "skippr:font-medium skippr:text-foreground",
|
|
3014
3558
|
children: email
|
|
3015
3559
|
})
|
|
@@ -3017,13 +3561,13 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
|
3017
3561
|
})
|
|
3018
3562
|
]
|
|
3019
3563
|
}),
|
|
3020
|
-
/* @__PURE__ */
|
|
3564
|
+
/* @__PURE__ */ jsxs9("form", {
|
|
3021
3565
|
onSubmit: handleSubmit,
|
|
3022
3566
|
className: "skippr:flex skippr:flex-col skippr:gap-3",
|
|
3023
3567
|
children: [
|
|
3024
|
-
/* @__PURE__ */
|
|
3568
|
+
/* @__PURE__ */ jsx12("div", {
|
|
3025
3569
|
className: "skippr:flex skippr:justify-center skippr:gap-1.5",
|
|
3026
|
-
children: digits.map((digit, index2) => /* @__PURE__ */
|
|
3570
|
+
children: digits.map((digit, index2) => /* @__PURE__ */ jsx12("input", {
|
|
3027
3571
|
ref: (el) => {
|
|
3028
3572
|
inputRefs.current[index2] = el;
|
|
3029
3573
|
},
|
|
@@ -3038,29 +3582,29 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
|
3038
3582
|
className: "skippr:h-10 skippr:w-10 skippr:rounded-md skippr:border skippr:border-border skippr:bg-background skippr:text-center skippr:text-sm skippr:font-semibold skippr:text-foreground skippr:outline-none focus:skippr:ring-2 focus:skippr:ring-primary/30 focus:skippr:border-primary disabled:skippr:opacity-50"
|
|
3039
3583
|
}, DIGIT_KEYS[index2]))
|
|
3040
3584
|
}),
|
|
3041
|
-
error && /* @__PURE__ */
|
|
3585
|
+
error && /* @__PURE__ */ jsx12("p", {
|
|
3042
3586
|
className: "skippr:text-xs skippr:text-center skippr:text-destructive",
|
|
3043
3587
|
children: error
|
|
3044
3588
|
}),
|
|
3045
|
-
/* @__PURE__ */
|
|
3589
|
+
/* @__PURE__ */ jsx12(Button, {
|
|
3046
3590
|
type: "submit",
|
|
3047
3591
|
disabled: isSubmitting || digits.join("").length !== OTP_LENGTH,
|
|
3048
3592
|
className: "skippr:w-full",
|
|
3049
|
-
children: isSubmitting ? /* @__PURE__ */
|
|
3593
|
+
children: isSubmitting ? /* @__PURE__ */ jsx12(LoaderCircle, {
|
|
3050
3594
|
className: "skippr:size-4 skippr:animate-spin"
|
|
3051
3595
|
}) : "Verify"
|
|
3052
3596
|
}),
|
|
3053
|
-
/* @__PURE__ */
|
|
3597
|
+
/* @__PURE__ */ jsxs9("div", {
|
|
3054
3598
|
className: "skippr:flex skippr:items-center skippr:justify-between skippr:text-xs",
|
|
3055
3599
|
children: [
|
|
3056
|
-
/* @__PURE__ */
|
|
3600
|
+
/* @__PURE__ */ jsx12("button", {
|
|
3057
3601
|
type: "button",
|
|
3058
3602
|
onClick: onBack,
|
|
3059
3603
|
disabled: isSubmitting,
|
|
3060
3604
|
className: "skippr:text-muted-foreground hover:skippr:text-foreground skippr:transition-colors disabled:skippr:opacity-50",
|
|
3061
3605
|
children: "Change email"
|
|
3062
3606
|
}),
|
|
3063
|
-
/* @__PURE__ */
|
|
3607
|
+
/* @__PURE__ */ jsx12("button", {
|
|
3064
3608
|
type: "button",
|
|
3065
3609
|
onClick: handleResend,
|
|
3066
3610
|
disabled: isSubmitting || resendCooldown > 0,
|
|
@@ -3076,7 +3620,7 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
|
3076
3620
|
}
|
|
3077
3621
|
|
|
3078
3622
|
// src/components/MeetingControls.tsx
|
|
3079
|
-
import { jsx as
|
|
3623
|
+
import { jsx as jsx13, jsxs as jsxs10, Fragment as Fragment4 } from "react/jsx-runtime";
|
|
3080
3624
|
var CONTROL_BUTTON2 = "skippr:flex skippr:size-11 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:transition-colors skippr:disabled:cursor-not-allowed skippr:disabled:opacity-60";
|
|
3081
3625
|
var MUTED_BUTTON = "skippr:bg-muted skippr:text-foreground skippr:hover:bg-muted/80";
|
|
3082
3626
|
function MeetingControls({
|
|
@@ -3089,68 +3633,68 @@ function MeetingControls({
|
|
|
3089
3633
|
}) {
|
|
3090
3634
|
const { isMuted, toggleMute, isScreenSharing, toggleScreenShare } = useMediaControls();
|
|
3091
3635
|
const showPaused = isPaused || isPausing;
|
|
3092
|
-
return /* @__PURE__ */
|
|
3636
|
+
return /* @__PURE__ */ jsxs10("div", {
|
|
3093
3637
|
className: "skippr:shrink-0 skippr:border-t skippr:border-border skippr:bg-background skippr:px-4 skippr:py-4",
|
|
3094
3638
|
children: [
|
|
3095
|
-
/* @__PURE__ */
|
|
3639
|
+
/* @__PURE__ */ jsxs10("div", {
|
|
3096
3640
|
className: "skippr:flex skippr:items-center skippr:justify-center skippr:gap-3",
|
|
3097
3641
|
children: [
|
|
3098
|
-
!showPaused && /* @__PURE__ */
|
|
3642
|
+
!showPaused && /* @__PURE__ */ jsxs10(Fragment4, {
|
|
3099
3643
|
children: [
|
|
3100
|
-
/* @__PURE__ */
|
|
3644
|
+
/* @__PURE__ */ jsx13("button", {
|
|
3101
3645
|
type: "button",
|
|
3102
3646
|
onClick: toggleMute,
|
|
3103
3647
|
"aria-label": isMuted ? "Unmute" : "Mute",
|
|
3104
3648
|
className: cn(CONTROL_BUTTON2, isMuted ? "skippr:bg-destructive/15 skippr:text-destructive skippr:hover:bg-destructive/25" : MUTED_BUTTON),
|
|
3105
|
-
children: isMuted ? /* @__PURE__ */
|
|
3649
|
+
children: isMuted ? /* @__PURE__ */ jsx13(MicOff, {
|
|
3106
3650
|
className: "skippr:size-5"
|
|
3107
|
-
}) : /* @__PURE__ */
|
|
3651
|
+
}) : /* @__PURE__ */ jsx13(Mic, {
|
|
3108
3652
|
className: "skippr:size-5"
|
|
3109
3653
|
})
|
|
3110
3654
|
}),
|
|
3111
|
-
showScreenShareToggle && /* @__PURE__ */
|
|
3655
|
+
showScreenShareToggle && /* @__PURE__ */ jsx13("button", {
|
|
3112
3656
|
type: "button",
|
|
3113
3657
|
onClick: toggleScreenShare,
|
|
3114
3658
|
"aria-label": isScreenSharing ? "Stop sharing screen" : "Share screen",
|
|
3115
3659
|
className: cn(CONTROL_BUTTON2, isScreenSharing ? "skippr:bg-bubble skippr:text-white skippr:hover:brightness-110" : MUTED_BUTTON),
|
|
3116
|
-
children: isScreenSharing ? /* @__PURE__ */
|
|
3660
|
+
children: isScreenSharing ? /* @__PURE__ */ jsx13(MonitorOff, {
|
|
3117
3661
|
className: "skippr:size-5"
|
|
3118
|
-
}) : /* @__PURE__ */
|
|
3662
|
+
}) : /* @__PURE__ */ jsx13(Monitor, {
|
|
3119
3663
|
className: "skippr:size-5"
|
|
3120
3664
|
})
|
|
3121
3665
|
})
|
|
3122
3666
|
]
|
|
3123
3667
|
}),
|
|
3124
|
-
showPaused ? onResume && /* @__PURE__ */
|
|
3668
|
+
showPaused ? onResume && /* @__PURE__ */ jsx13("button", {
|
|
3125
3669
|
type: "button",
|
|
3126
3670
|
onClick: onResume,
|
|
3127
3671
|
disabled: isPausing,
|
|
3128
3672
|
"aria-label": "Resume session",
|
|
3129
3673
|
className: cn(CONTROL_BUTTON2, MUTED_BUTTON),
|
|
3130
|
-
children: /* @__PURE__ */
|
|
3674
|
+
children: /* @__PURE__ */ jsx13(Play, {
|
|
3131
3675
|
className: "skippr:size-5"
|
|
3132
3676
|
})
|
|
3133
|
-
}) : onPause && /* @__PURE__ */
|
|
3677
|
+
}) : onPause && /* @__PURE__ */ jsx13("button", {
|
|
3134
3678
|
type: "button",
|
|
3135
3679
|
onClick: onPause,
|
|
3136
3680
|
"aria-label": "Pause session",
|
|
3137
3681
|
className: cn(CONTROL_BUTTON2, MUTED_BUTTON),
|
|
3138
|
-
children: /* @__PURE__ */
|
|
3682
|
+
children: /* @__PURE__ */ jsx13(Pause, {
|
|
3139
3683
|
className: "skippr:size-5"
|
|
3140
3684
|
})
|
|
3141
3685
|
}),
|
|
3142
|
-
/* @__PURE__ */
|
|
3686
|
+
/* @__PURE__ */ jsx13("button", {
|
|
3143
3687
|
type: "button",
|
|
3144
3688
|
onClick: onHangUp,
|
|
3145
3689
|
"aria-label": "End session",
|
|
3146
3690
|
className: cn(CONTROL_BUTTON2, "skippr:bg-destructive skippr:text-destructive-foreground skippr:hover:bg-destructive/90"),
|
|
3147
|
-
children: /* @__PURE__ */
|
|
3691
|
+
children: /* @__PURE__ */ jsx13(PhoneOff, {
|
|
3148
3692
|
className: "skippr:size-5"
|
|
3149
3693
|
})
|
|
3150
3694
|
})
|
|
3151
3695
|
]
|
|
3152
3696
|
}),
|
|
3153
|
-
/* @__PURE__ */
|
|
3697
|
+
/* @__PURE__ */ jsx13("p", {
|
|
3154
3698
|
className: "skippr:mt-3 skippr:text-center skippr:text-[10px] skippr:text-muted-foreground",
|
|
3155
3699
|
children: "Powered by Skippr"
|
|
3156
3700
|
})
|
|
@@ -3159,17 +3703,17 @@ function MeetingControls({
|
|
|
3159
3703
|
}
|
|
3160
3704
|
|
|
3161
3705
|
// src/components/MessageList.tsx
|
|
3162
|
-
import { useEffect as
|
|
3706
|
+
import { useEffect as useEffect17, useRef as useRef11 } from "react";
|
|
3163
3707
|
|
|
3164
3708
|
// src/components/ChatInput.tsx
|
|
3165
|
-
import { useEffect as
|
|
3166
|
-
import { jsx as
|
|
3709
|
+
import { useEffect as useEffect16, useRef as useRef10, useState as useState13 } from "react";
|
|
3710
|
+
import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
3167
3711
|
var MAX_INPUT_HEIGHT = 60;
|
|
3168
3712
|
function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
|
|
3169
|
-
const [inputText, setInputText] =
|
|
3170
|
-
const textareaRef =
|
|
3713
|
+
const [inputText, setInputText] = useState13("");
|
|
3714
|
+
const textareaRef = useRef10(null);
|
|
3171
3715
|
const canSend = inputText.trim().length > 0 && !isSendingChat;
|
|
3172
|
-
|
|
3716
|
+
useEffect16(() => {
|
|
3173
3717
|
if (autoFocus)
|
|
3174
3718
|
textareaRef.current?.focus();
|
|
3175
3719
|
}, [autoFocus]);
|
|
@@ -3200,13 +3744,13 @@ function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
|
|
|
3200
3744
|
handleSubmit(e);
|
|
3201
3745
|
}
|
|
3202
3746
|
}
|
|
3203
|
-
return /* @__PURE__ */
|
|
3747
|
+
return /* @__PURE__ */ jsx14("form", {
|
|
3204
3748
|
onSubmit: handleSubmit,
|
|
3205
3749
|
className: "skippr:border-t skippr:border-border skippr:p-3",
|
|
3206
|
-
children: /* @__PURE__ */
|
|
3750
|
+
children: /* @__PURE__ */ jsxs11("div", {
|
|
3207
3751
|
className: "skippr:flex skippr:items-center skippr:gap-2 skippr:rounded-xl skippr:bg-background skippr:ring-1 skippr:ring-foreground/10 skippr:px-3 skippr:py-2",
|
|
3208
3752
|
children: [
|
|
3209
|
-
/* @__PURE__ */
|
|
3753
|
+
/* @__PURE__ */ jsx14("textarea", {
|
|
3210
3754
|
ref: textareaRef,
|
|
3211
3755
|
rows: 1,
|
|
3212
3756
|
value: inputText,
|
|
@@ -3216,12 +3760,12 @@ function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
|
|
|
3216
3760
|
className: "skippr:flex-1 skippr:resize-none skippr:overflow-y-auto skippr:bg-transparent skippr:text-sm skippr:leading-5 skippr:text-foreground skippr:placeholder:text-muted-foreground skippr:outline-none",
|
|
3217
3761
|
style: { maxHeight: `${MAX_INPUT_HEIGHT}px` }
|
|
3218
3762
|
}),
|
|
3219
|
-
/* @__PURE__ */
|
|
3763
|
+
/* @__PURE__ */ jsx14("button", {
|
|
3220
3764
|
type: "submit",
|
|
3221
3765
|
disabled: !canSend,
|
|
3222
3766
|
"aria-label": "Send message",
|
|
3223
3767
|
className: cn("skippr:flex skippr:size-8 skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-lg skippr:transition-colors", canSend ? "skippr:bg-primary skippr:text-primary-foreground skippr:hover:bg-primary/90" : "skippr:bg-muted-foreground/20 skippr:text-muted-foreground/60"),
|
|
3224
|
-
children: /* @__PURE__ */
|
|
3768
|
+
children: /* @__PURE__ */ jsx14(Send, {
|
|
3225
3769
|
className: "skippr:size-3.5"
|
|
3226
3770
|
})
|
|
3227
3771
|
})
|
|
@@ -3231,7 +3775,7 @@ function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
|
|
|
3231
3775
|
}
|
|
3232
3776
|
|
|
3233
3777
|
// src/components/ChatMessage.tsx
|
|
3234
|
-
import { jsx as
|
|
3778
|
+
import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
3235
3779
|
function formatTimestamp(ts) {
|
|
3236
3780
|
return new Date(ts).toLocaleTimeString("en-US", {
|
|
3237
3781
|
hour: "numeric",
|
|
@@ -3241,23 +3785,23 @@ function formatTimestamp(ts) {
|
|
|
3241
3785
|
}
|
|
3242
3786
|
function ChatMessage({ message }) {
|
|
3243
3787
|
const isAgent = message.role === "assistant";
|
|
3244
|
-
return /* @__PURE__ */
|
|
3788
|
+
return /* @__PURE__ */ jsxs12("div", {
|
|
3245
3789
|
className: cn("skippr:flex skippr:gap-2", isAgent ? "skippr:items-start" : "skippr:justify-end"),
|
|
3246
3790
|
children: [
|
|
3247
|
-
isAgent && /* @__PURE__ */
|
|
3791
|
+
isAgent && /* @__PURE__ */ jsx15("div", {
|
|
3248
3792
|
className: "skippr:mt-0.5 skippr:flex skippr:size-7 skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-md skippr:bg-primary",
|
|
3249
|
-
children: /* @__PURE__ */
|
|
3793
|
+
children: /* @__PURE__ */ jsx15(Sparkles, {
|
|
3250
3794
|
className: "skippr:size-3.5 skippr:text-primary-foreground"
|
|
3251
3795
|
})
|
|
3252
3796
|
}),
|
|
3253
|
-
/* @__PURE__ */
|
|
3797
|
+
/* @__PURE__ */ jsxs12("div", {
|
|
3254
3798
|
className: cn("skippr:flex skippr:max-w-[80%] skippr:flex-col", isAgent ? "skippr:items-start" : "skippr:items-end"),
|
|
3255
3799
|
children: [
|
|
3256
|
-
/* @__PURE__ */
|
|
3800
|
+
/* @__PURE__ */ jsx15("div", {
|
|
3257
3801
|
className: cn("skippr:rounded-2xl skippr:px-4 skippr:py-2.5 skippr:text-sm skippr:leading-relaxed", isAgent ? "skippr:border skippr:border-border skippr:bg-card skippr:text-foreground" : "skippr:bg-primary skippr:text-primary-foreground"),
|
|
3258
3802
|
children: message.content
|
|
3259
3803
|
}),
|
|
3260
|
-
message.timestamp && /* @__PURE__ */
|
|
3804
|
+
message.timestamp && /* @__PURE__ */ jsx15("span", {
|
|
3261
3805
|
className: "skippr:mt-1 skippr:px-1 skippr:text-[10px] skippr:text-muted-foreground/60",
|
|
3262
3806
|
children: formatTimestamp(message.timestamp)
|
|
3263
3807
|
})
|
|
@@ -3268,33 +3812,33 @@ function ChatMessage({ message }) {
|
|
|
3268
3812
|
}
|
|
3269
3813
|
|
|
3270
3814
|
// src/components/TypingIndicator.tsx
|
|
3271
|
-
import { jsx as
|
|
3815
|
+
import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
3272
3816
|
function TypingIndicator() {
|
|
3273
|
-
return /* @__PURE__ */
|
|
3817
|
+
return /* @__PURE__ */ jsxs13("div", {
|
|
3274
3818
|
className: "skippr:flex skippr:items-start skippr:gap-2 skippr:animate-skippr-tab-fade",
|
|
3275
3819
|
children: [
|
|
3276
|
-
/* @__PURE__ */
|
|
3820
|
+
/* @__PURE__ */ jsx16("div", {
|
|
3277
3821
|
className: "skippr:mt-0.5 skippr:flex skippr:size-7 skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-md skippr:bg-primary",
|
|
3278
|
-
children: /* @__PURE__ */
|
|
3822
|
+
children: /* @__PURE__ */ jsx16(Sparkles, {
|
|
3279
3823
|
className: "skippr:size-3.5 skippr:text-primary-foreground"
|
|
3280
3824
|
})
|
|
3281
3825
|
}),
|
|
3282
|
-
/* @__PURE__ */
|
|
3826
|
+
/* @__PURE__ */ jsxs13("div", {
|
|
3283
3827
|
className: "skippr:inline-flex skippr:items-center skippr:gap-1 skippr:rounded-2xl skippr:border skippr:border-primary/20 skippr:bg-primary/10 skippr:px-4 skippr:py-2 skippr:text-xs skippr:text-primary",
|
|
3284
3828
|
children: [
|
|
3285
|
-
/* @__PURE__ */
|
|
3829
|
+
/* @__PURE__ */ jsx16("span", {
|
|
3286
3830
|
children: "Agent is analyzing your screen"
|
|
3287
3831
|
}),
|
|
3288
|
-
/* @__PURE__ */
|
|
3832
|
+
/* @__PURE__ */ jsxs13("span", {
|
|
3289
3833
|
className: "skippr:inline-flex skippr:items-center skippr:gap-[2px]",
|
|
3290
3834
|
children: [
|
|
3291
|
-
/* @__PURE__ */
|
|
3835
|
+
/* @__PURE__ */ jsx16("span", {
|
|
3292
3836
|
className: "skippr:size-1 skippr:rounded-full skippr:bg-primary skippr:animate-skippr-thinking-dot skippr:[animation-delay:0ms]"
|
|
3293
3837
|
}),
|
|
3294
|
-
/* @__PURE__ */
|
|
3838
|
+
/* @__PURE__ */ jsx16("span", {
|
|
3295
3839
|
className: "skippr:size-1 skippr:rounded-full skippr:bg-primary skippr:animate-skippr-thinking-dot skippr:[animation-delay:200ms]"
|
|
3296
3840
|
}),
|
|
3297
|
-
/* @__PURE__ */
|
|
3841
|
+
/* @__PURE__ */ jsx16("span", {
|
|
3298
3842
|
className: "skippr:size-1 skippr:rounded-full skippr:bg-primary skippr:animate-skippr-thinking-dot skippr:[animation-delay:400ms]"
|
|
3299
3843
|
})
|
|
3300
3844
|
]
|
|
@@ -3306,7 +3850,7 @@ function TypingIndicator() {
|
|
|
3306
3850
|
}
|
|
3307
3851
|
|
|
3308
3852
|
// src/components/MessageList.tsx
|
|
3309
|
-
import { jsx as
|
|
3853
|
+
import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
3310
3854
|
function MessageList({
|
|
3311
3855
|
messages,
|
|
3312
3856
|
isStreaming,
|
|
@@ -3314,31 +3858,31 @@ function MessageList({
|
|
|
3314
3858
|
isSendingChat,
|
|
3315
3859
|
autoFocus = false
|
|
3316
3860
|
}) {
|
|
3317
|
-
const scrollRef =
|
|
3861
|
+
const scrollRef = useRef11(null);
|
|
3318
3862
|
const lastMessage = messages.length > 0 ? messages[messages.length - 1] : undefined;
|
|
3319
|
-
|
|
3863
|
+
useEffect17(() => {
|
|
3320
3864
|
scrollRef.current?.scrollIntoView({ behavior: "smooth" });
|
|
3321
3865
|
}, [messages.length, lastMessage?.content]);
|
|
3322
3866
|
const showTyping = isStreaming && lastMessage?.role === "assistant" && lastMessage.content === "";
|
|
3323
|
-
return /* @__PURE__ */
|
|
3867
|
+
return /* @__PURE__ */ jsxs14("div", {
|
|
3324
3868
|
className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col",
|
|
3325
3869
|
children: [
|
|
3326
|
-
/* @__PURE__ */
|
|
3870
|
+
/* @__PURE__ */ jsxs14("div", {
|
|
3327
3871
|
className: "skippr:min-h-0 skippr:flex-1 skippr:space-y-4 skippr:overflow-y-auto skippr:p-4",
|
|
3328
3872
|
children: [
|
|
3329
|
-
messages.length === 0 && !showTyping && /* @__PURE__ */
|
|
3873
|
+
messages.length === 0 && !showTyping && /* @__PURE__ */ jsx17(LoadingDots, {
|
|
3330
3874
|
label: "Waiting for conversation to begin..."
|
|
3331
3875
|
}),
|
|
3332
|
-
messages.map((message) => /* @__PURE__ */
|
|
3876
|
+
messages.map((message) => /* @__PURE__ */ jsx17(ChatMessage, {
|
|
3333
3877
|
message
|
|
3334
3878
|
}, message.id)),
|
|
3335
|
-
showTyping && /* @__PURE__ */
|
|
3336
|
-
/* @__PURE__ */
|
|
3879
|
+
showTyping && /* @__PURE__ */ jsx17(TypingIndicator, {}),
|
|
3880
|
+
/* @__PURE__ */ jsx17("div", {
|
|
3337
3881
|
ref: scrollRef
|
|
3338
3882
|
})
|
|
3339
3883
|
]
|
|
3340
3884
|
}),
|
|
3341
|
-
/* @__PURE__ */
|
|
3885
|
+
/* @__PURE__ */ jsx17(ChatInput, {
|
|
3342
3886
|
sendChatMessage,
|
|
3343
3887
|
isSendingChat,
|
|
3344
3888
|
autoFocus
|
|
@@ -3348,8 +3892,8 @@ function MessageList({
|
|
|
3348
3892
|
}
|
|
3349
3893
|
|
|
3350
3894
|
// src/components/ModuleSelector.tsx
|
|
3351
|
-
import { useEffect as
|
|
3352
|
-
import { jsx as
|
|
3895
|
+
import { useEffect as useEffect18, useRef as useRef12, useState as useState14 } from "react";
|
|
3896
|
+
import { jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
3353
3897
|
var AGENT_TYPE_ICONS = {
|
|
3354
3898
|
onboarding: UserPlus,
|
|
3355
3899
|
demo: Rocket,
|
|
@@ -3371,10 +3915,10 @@ function ModuleSelector() {
|
|
|
3371
3915
|
error
|
|
3372
3916
|
} = useLiveAgent();
|
|
3373
3917
|
const isBusy = isStarting || isDisconnecting;
|
|
3374
|
-
const scrollRef =
|
|
3375
|
-
const [showScrollHint, setShowScrollHint] =
|
|
3376
|
-
const [isScrolled, setIsScrolled] =
|
|
3377
|
-
|
|
3918
|
+
const scrollRef = useRef12(null);
|
|
3919
|
+
const [showScrollHint, setShowScrollHint] = useState14(false);
|
|
3920
|
+
const [isScrolled, setIsScrolled] = useState14(false);
|
|
3921
|
+
useEffect18(() => {
|
|
3378
3922
|
const el = scrollRef.current;
|
|
3379
3923
|
if (!el)
|
|
3380
3924
|
return;
|
|
@@ -3396,26 +3940,26 @@ function ModuleSelector() {
|
|
|
3396
3940
|
};
|
|
3397
3941
|
}, []);
|
|
3398
3942
|
if (isLoadingModules && availableModules.length === 0) {
|
|
3399
|
-
return /* @__PURE__ */
|
|
3943
|
+
return /* @__PURE__ */ jsx18("div", {
|
|
3400
3944
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center skippr:p-6",
|
|
3401
|
-
children: /* @__PURE__ */
|
|
3945
|
+
children: /* @__PURE__ */ jsx18(LoadingDots, {
|
|
3402
3946
|
label: "Loading modules..."
|
|
3403
3947
|
})
|
|
3404
3948
|
});
|
|
3405
3949
|
}
|
|
3406
3950
|
if (modulesError) {
|
|
3407
|
-
return /* @__PURE__ */
|
|
3951
|
+
return /* @__PURE__ */ jsxs15("div", {
|
|
3408
3952
|
className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:items-center skippr:justify-center skippr:gap-3 skippr:p-6 skippr:text-center",
|
|
3409
3953
|
children: [
|
|
3410
|
-
/* @__PURE__ */
|
|
3954
|
+
/* @__PURE__ */ jsx18("p", {
|
|
3411
3955
|
className: "skippr:text-sm skippr:text-foreground",
|
|
3412
3956
|
children: "Couldn't load modules."
|
|
3413
3957
|
}),
|
|
3414
|
-
/* @__PURE__ */
|
|
3958
|
+
/* @__PURE__ */ jsx18("p", {
|
|
3415
3959
|
className: "skippr:text-xs skippr:text-muted-foreground",
|
|
3416
3960
|
children: modulesError
|
|
3417
3961
|
}),
|
|
3418
|
-
/* @__PURE__ */
|
|
3962
|
+
/* @__PURE__ */ jsx18("button", {
|
|
3419
3963
|
type: "button",
|
|
3420
3964
|
onClick: () => void refetchModules(),
|
|
3421
3965
|
className: "skippr:cursor-pointer skippr:rounded-lg skippr:bg-foreground skippr:px-3 skippr:py-1.5 skippr:text-xs skippr:font-medium skippr:text-background",
|
|
@@ -3425,34 +3969,34 @@ function ModuleSelector() {
|
|
|
3425
3969
|
});
|
|
3426
3970
|
}
|
|
3427
3971
|
if (availableModules.length === 0) {
|
|
3428
|
-
return /* @__PURE__ */
|
|
3972
|
+
return /* @__PURE__ */ jsx18("div", {
|
|
3429
3973
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center skippr:p-6 skippr:text-center",
|
|
3430
|
-
children: /* @__PURE__ */
|
|
3974
|
+
children: /* @__PURE__ */ jsx18("p", {
|
|
3431
3975
|
className: "skippr:text-sm skippr:text-muted-foreground",
|
|
3432
3976
|
children: "No experts available."
|
|
3433
3977
|
})
|
|
3434
3978
|
});
|
|
3435
3979
|
}
|
|
3436
|
-
return /* @__PURE__ */
|
|
3980
|
+
return /* @__PURE__ */ jsxs15("div", {
|
|
3437
3981
|
className: "skippr:relative skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col",
|
|
3438
3982
|
children: [
|
|
3439
|
-
/* @__PURE__ */
|
|
3983
|
+
/* @__PURE__ */ jsxs15("div", {
|
|
3440
3984
|
ref: scrollRef,
|
|
3441
3985
|
className: "skippr-no-scrollbar skippr:flex-1 skippr:overflow-y-auto",
|
|
3442
3986
|
children: [
|
|
3443
|
-
/* @__PURE__ */
|
|
3987
|
+
/* @__PURE__ */ jsx18("h3", {
|
|
3444
3988
|
className: `skippr:sticky skippr:top-0 skippr:z-10 skippr:bg-background skippr:px-4 skippr:py-3 skippr:text-xs skippr:font-medium skippr:uppercase skippr:tracking-wider skippr:text-muted-foreground skippr:transition-shadow ${isScrolled ? "skippr:border-b skippr:border-border" : ""}`,
|
|
3445
3989
|
children: "Choose an agent"
|
|
3446
3990
|
}),
|
|
3447
|
-
/* @__PURE__ */
|
|
3991
|
+
/* @__PURE__ */ jsxs15("div", {
|
|
3448
3992
|
className: "skippr:px-4 skippr:pt-3 skippr:pb-5",
|
|
3449
3993
|
children: [
|
|
3450
|
-
error && /* @__PURE__ */
|
|
3994
|
+
error && /* @__PURE__ */ jsx18("div", {
|
|
3451
3995
|
role: "alert",
|
|
3452
3996
|
className: "skippr:mb-3 skippr:rounded-lg skippr:border skippr:border-destructive/20 skippr:bg-destructive/10 skippr:px-3 skippr:py-2 skippr:text-xs skippr:text-destructive",
|
|
3453
3997
|
children: error
|
|
3454
3998
|
}),
|
|
3455
|
-
/* @__PURE__ */
|
|
3999
|
+
/* @__PURE__ */ jsx18("div", {
|
|
3456
4000
|
className: "skippr:grid skippr:grid-cols-2 skippr:gap-2.5",
|
|
3457
4001
|
children: availableModules.map((module, index2) => {
|
|
3458
4002
|
const isFeatured = index2 === 0;
|
|
@@ -3464,50 +4008,50 @@ function ModuleSelector() {
|
|
|
3464
4008
|
const layout = isWide ? "skippr:items-center skippr:p-3.5 skippr:pb-5" : "skippr:flex-col skippr:items-start skippr:p-3.5";
|
|
3465
4009
|
const variant = isFeatured ? "skippr:bg-primary skippr:text-primary-foreground skippr:hover:bg-primary/90" : "skippr:bg-background skippr:ring-1 skippr:ring-foreground/10 skippr:hover:bg-muted/50";
|
|
3466
4010
|
const span = isWide ? "skippr:col-span-2" : "";
|
|
3467
|
-
return /* @__PURE__ */
|
|
4011
|
+
return /* @__PURE__ */ jsxs15("button", {
|
|
3468
4012
|
type: "button",
|
|
3469
4013
|
disabled: isBusy || isTerminal,
|
|
3470
4014
|
onClick: () => selectModule(module.id),
|
|
3471
4015
|
className: `${base} ${layout} ${variant} ${span}`,
|
|
3472
4016
|
children: [
|
|
3473
|
-
/* @__PURE__ */
|
|
4017
|
+
/* @__PURE__ */ jsx18("div", {
|
|
3474
4018
|
className: isFeatured ? "skippr:flex skippr:h-9 skippr:w-9 skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-lg skippr:bg-primary-foreground/15" : "skippr:flex skippr:h-9 skippr:w-9 skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-lg skippr:bg-muted",
|
|
3475
|
-
children: /* @__PURE__ */
|
|
4019
|
+
children: /* @__PURE__ */ jsx18(Icon2, {
|
|
3476
4020
|
className: isFeatured ? "skippr:h-4 skippr:w-4" : "skippr:h-4 skippr:w-4 skippr:text-muted-foreground"
|
|
3477
4021
|
})
|
|
3478
4022
|
}),
|
|
3479
|
-
/* @__PURE__ */
|
|
4023
|
+
/* @__PURE__ */ jsxs15("div", {
|
|
3480
4024
|
className: "skippr:min-w-0 skippr:w-full skippr:space-y-0.5",
|
|
3481
4025
|
children: [
|
|
3482
|
-
/* @__PURE__ */
|
|
4026
|
+
/* @__PURE__ */ jsxs15("div", {
|
|
3483
4027
|
className: "skippr:flex skippr:items-center skippr:gap-1.5",
|
|
3484
4028
|
children: [
|
|
3485
|
-
/* @__PURE__ */
|
|
4029
|
+
/* @__PURE__ */ jsx18("p", {
|
|
3486
4030
|
className: "skippr:line-clamp-1 skippr:text-sm skippr:font-semibold",
|
|
3487
4031
|
children: module.name
|
|
3488
4032
|
}),
|
|
3489
|
-
sessionState === "resume" && /* @__PURE__ */
|
|
4033
|
+
sessionState === "resume" && /* @__PURE__ */ jsxs15("span", {
|
|
3490
4034
|
className: `skippr:inline-flex skippr:shrink-0 skippr:items-center skippr:gap-0.5 skippr:rounded-full skippr:px-1.5 skippr:py-0.5 skippr:text-[9px] skippr:font-medium skippr:uppercase skippr:tracking-wide ${isFeatured ? "skippr:bg-primary-foreground/20 skippr:text-primary-foreground" : "skippr:bg-bubble/15 skippr:text-bubble"}`,
|
|
3491
4035
|
children: [
|
|
3492
|
-
/* @__PURE__ */
|
|
4036
|
+
/* @__PURE__ */ jsx18(Play, {
|
|
3493
4037
|
className: "skippr:size-2.5"
|
|
3494
4038
|
}),
|
|
3495
4039
|
"Resume"
|
|
3496
4040
|
]
|
|
3497
4041
|
}),
|
|
3498
|
-
sessionState === "completed" && /* @__PURE__ */
|
|
4042
|
+
sessionState === "completed" && /* @__PURE__ */ jsxs15("span", {
|
|
3499
4043
|
className: "skippr:inline-flex skippr:shrink-0 skippr:items-center skippr:gap-0.5 skippr:rounded-full skippr:bg-muted skippr:px-1.5 skippr:py-0.5 skippr:text-[9px] skippr:font-medium skippr:uppercase skippr:tracking-wide skippr:text-muted-foreground",
|
|
3500
4044
|
children: [
|
|
3501
|
-
/* @__PURE__ */
|
|
4045
|
+
/* @__PURE__ */ jsx18(CircleCheck, {
|
|
3502
4046
|
className: "skippr:size-2.5"
|
|
3503
4047
|
}),
|
|
3504
4048
|
"Completed"
|
|
3505
4049
|
]
|
|
3506
4050
|
}),
|
|
3507
|
-
sessionState === "expired" && /* @__PURE__ */
|
|
4051
|
+
sessionState === "expired" && /* @__PURE__ */ jsxs15("span", {
|
|
3508
4052
|
className: "skippr:inline-flex skippr:shrink-0 skippr:items-center skippr:gap-0.5 skippr:rounded-full skippr:bg-muted skippr:px-1.5 skippr:py-0.5 skippr:text-[9px] skippr:font-medium skippr:uppercase skippr:tracking-wide skippr:text-muted-foreground",
|
|
3509
4053
|
children: [
|
|
3510
|
-
/* @__PURE__ */
|
|
4054
|
+
/* @__PURE__ */ jsx18(Clock, {
|
|
3511
4055
|
className: "skippr:size-2.5"
|
|
3512
4056
|
}),
|
|
3513
4057
|
"Expired"
|
|
@@ -3515,7 +4059,7 @@ function ModuleSelector() {
|
|
|
3515
4059
|
})
|
|
3516
4060
|
]
|
|
3517
4061
|
}),
|
|
3518
|
-
module.description && /* @__PURE__ */
|
|
4062
|
+
module.description && /* @__PURE__ */ jsx18("p", {
|
|
3519
4063
|
className: isFeatured ? "skippr:line-clamp-2 skippr:text-[11px] skippr:leading-snug skippr:text-primary-foreground/70" : "skippr:line-clamp-2 skippr:text-[11px] skippr:leading-snug skippr:text-muted-foreground",
|
|
3520
4064
|
children: module.description
|
|
3521
4065
|
})
|
|
@@ -3529,7 +4073,7 @@ function ModuleSelector() {
|
|
|
3529
4073
|
})
|
|
3530
4074
|
]
|
|
3531
4075
|
}),
|
|
3532
|
-
showScrollHint && /* @__PURE__ */
|
|
4076
|
+
showScrollHint && /* @__PURE__ */ jsx18("div", {
|
|
3533
4077
|
className: "skippr:pointer-events-none skippr:absolute skippr:bottom-0 skippr:left-0 skippr:right-0 skippr:h-12 skippr:bg-gradient-to-t skippr:from-background skippr:to-transparent"
|
|
3534
4078
|
})
|
|
3535
4079
|
]
|
|
@@ -3537,49 +4081,49 @@ function ModuleSelector() {
|
|
|
3537
4081
|
}
|
|
3538
4082
|
|
|
3539
4083
|
// src/components/SessionAgenda.tsx
|
|
3540
|
-
import { jsx as
|
|
4084
|
+
import { jsx as jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
3541
4085
|
function SessionAgenda({ phases, hasStarted }) {
|
|
3542
4086
|
if (phases.length === 0 || !hasStarted) {
|
|
3543
|
-
return /* @__PURE__ */
|
|
4087
|
+
return /* @__PURE__ */ jsx19("div", {
|
|
3544
4088
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
|
|
3545
|
-
children: /* @__PURE__ */
|
|
4089
|
+
children: /* @__PURE__ */ jsx19(LoadingDots, {
|
|
3546
4090
|
label: "Waiting for agenda to load..."
|
|
3547
4091
|
})
|
|
3548
4092
|
});
|
|
3549
4093
|
}
|
|
3550
|
-
return /* @__PURE__ */
|
|
4094
|
+
return /* @__PURE__ */ jsx19("div", {
|
|
3551
4095
|
className: "skippr:flex-1 skippr:overflow-y-auto skippr:px-4 skippr:py-4",
|
|
3552
|
-
children: /* @__PURE__ */
|
|
4096
|
+
children: /* @__PURE__ */ jsx19("div", {
|
|
3553
4097
|
className: "skippr:space-y-1",
|
|
3554
4098
|
children: phases.map((phase) => {
|
|
3555
4099
|
const isActive = phase.status === "active";
|
|
3556
4100
|
const isCompleted = phase.status === "completed";
|
|
3557
|
-
return /* @__PURE__ */
|
|
4101
|
+
return /* @__PURE__ */ jsxs16("div", {
|
|
3558
4102
|
className: cn("skippr:flex skippr:items-start skippr:gap-2.5 skippr:rounded-lg skippr:p-2 skippr:transition-colors", isActive && "skippr:bg-primary/10"),
|
|
3559
4103
|
children: [
|
|
3560
|
-
/* @__PURE__ */
|
|
4104
|
+
/* @__PURE__ */ jsx19("div", {
|
|
3561
4105
|
className: "skippr:mt-0.5",
|
|
3562
|
-
children: isCompleted ? /* @__PURE__ */
|
|
4106
|
+
children: isCompleted ? /* @__PURE__ */ jsx19(CircleCheck, {
|
|
3563
4107
|
className: "skippr:size-4 skippr:text-chart-3"
|
|
3564
|
-
}) : isActive ? /* @__PURE__ */
|
|
4108
|
+
}) : isActive ? /* @__PURE__ */ jsx19(Circle, {
|
|
3565
4109
|
className: "skippr:size-4 skippr:fill-primary/30 skippr:text-primary"
|
|
3566
|
-
}) : /* @__PURE__ */
|
|
4110
|
+
}) : /* @__PURE__ */ jsx19(Circle, {
|
|
3567
4111
|
className: "skippr:size-4 skippr:text-muted-foreground/30"
|
|
3568
4112
|
})
|
|
3569
4113
|
}),
|
|
3570
|
-
/* @__PURE__ */
|
|
4114
|
+
/* @__PURE__ */ jsxs16("div", {
|
|
3571
4115
|
className: "skippr:min-w-0 skippr:flex-1",
|
|
3572
4116
|
children: [
|
|
3573
|
-
/* @__PURE__ */
|
|
4117
|
+
/* @__PURE__ */ jsx19("p", {
|
|
3574
4118
|
className: cn("skippr:text-sm", isCompleted && "skippr:text-muted-foreground skippr:line-through", isActive && "skippr:font-medium skippr:text-foreground", phase.status === "pending" && "skippr:text-muted-foreground"),
|
|
3575
4119
|
children: phase.name
|
|
3576
4120
|
}),
|
|
3577
|
-
phase.highlights.length > 0 && /* @__PURE__ */
|
|
4121
|
+
phase.highlights.length > 0 && /* @__PURE__ */ jsx19("ul", {
|
|
3578
4122
|
className: "skippr:mt-1 skippr:space-y-0.5",
|
|
3579
|
-
children: phase.highlights.map((text) => /* @__PURE__ */
|
|
4123
|
+
children: phase.highlights.map((text) => /* @__PURE__ */ jsxs16("li", {
|
|
3580
4124
|
className: cn("skippr:flex skippr:items-center skippr:gap-1.5 skippr:text-[11px] skippr:leading-tight", isCompleted ? "skippr:text-muted-foreground/40 skippr:line-through" : "skippr:text-muted-foreground/70"),
|
|
3581
4125
|
children: [
|
|
3582
|
-
/* @__PURE__ */
|
|
4126
|
+
/* @__PURE__ */ jsx19("span", {
|
|
3583
4127
|
className: "skippr:size-1 skippr:shrink-0 skippr:rounded-full skippr:bg-current"
|
|
3584
4128
|
}),
|
|
3585
4129
|
text
|
|
@@ -3596,12 +4140,12 @@ function SessionAgenda({ phases, hasStarted }) {
|
|
|
3596
4140
|
}
|
|
3597
4141
|
|
|
3598
4142
|
// src/components/SessionWarningBanner.tsx
|
|
3599
|
-
import { jsx as
|
|
4143
|
+
import { jsx as jsx20 } from "react/jsx-runtime";
|
|
3600
4144
|
var SESSION_WARNING_THRESHOLD_SECS = 60;
|
|
3601
4145
|
function SessionWarningBanner({ remaining }) {
|
|
3602
4146
|
if (remaining === null || remaining <= 0 || remaining > SESSION_WARNING_THRESHOLD_SECS)
|
|
3603
4147
|
return null;
|
|
3604
|
-
return /* @__PURE__ */
|
|
4148
|
+
return /* @__PURE__ */ jsx20("div", {
|
|
3605
4149
|
"data-testid": "session-warning-banner",
|
|
3606
4150
|
className: "skippr:bg-red-50 skippr:px-4 skippr:py-1.5 skippr:text-center skippr:text-xs skippr:font-medium skippr:text-red-700",
|
|
3607
4151
|
children: "Session ending soon"
|
|
@@ -3609,7 +4153,7 @@ function SessionWarningBanner({ remaining }) {
|
|
|
3609
4153
|
}
|
|
3610
4154
|
|
|
3611
4155
|
// src/components/StartSessionPrompt.tsx
|
|
3612
|
-
import { jsx as
|
|
4156
|
+
import { jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
3613
4157
|
var PROMPT_BUTTON = "skippr:cursor-pointer skippr:rounded-xl skippr:bg-primary skippr:px-8 skippr:py-3 skippr:text-sm skippr:font-medium skippr:text-primary-foreground skippr:transition-all skippr:hover:bg-primary/90 skippr:disabled:cursor-not-allowed skippr:disabled:opacity-60";
|
|
3614
4158
|
function StartSessionPrompt({
|
|
3615
4159
|
onStartSession,
|
|
@@ -3621,16 +4165,16 @@ function StartSessionPrompt({
|
|
|
3621
4165
|
canResume = false,
|
|
3622
4166
|
onResume
|
|
3623
4167
|
}) {
|
|
3624
|
-
return /* @__PURE__ */
|
|
4168
|
+
return /* @__PURE__ */ jsxs17("div", {
|
|
3625
4169
|
className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:items-center skippr:justify-center skippr:gap-3 skippr:px-4",
|
|
3626
4170
|
children: [
|
|
3627
|
-
canResume && onResume ? /* @__PURE__ */
|
|
4171
|
+
canResume && onResume ? /* @__PURE__ */ jsx21("button", {
|
|
3628
4172
|
type: "button",
|
|
3629
4173
|
onClick: onResume,
|
|
3630
4174
|
disabled: isStarting,
|
|
3631
4175
|
className: PROMPT_BUTTON,
|
|
3632
4176
|
children: isStarting ? "Resuming..." : "Resume session"
|
|
3633
|
-
}) : /* @__PURE__ */
|
|
4177
|
+
}) : /* @__PURE__ */ jsx21("button", {
|
|
3634
4178
|
type: "button",
|
|
3635
4179
|
onClick: () => {
|
|
3636
4180
|
if (!agentId)
|
|
@@ -3641,7 +4185,7 @@ function StartSessionPrompt({
|
|
|
3641
4185
|
className: PROMPT_BUTTON,
|
|
3642
4186
|
children: isStarting ? "Starting..." : label
|
|
3643
4187
|
}),
|
|
3644
|
-
error && /* @__PURE__ */
|
|
4188
|
+
error && /* @__PURE__ */ jsx21("p", {
|
|
3645
4189
|
className: "skippr:text-xs skippr:text-destructive",
|
|
3646
4190
|
children: error
|
|
3647
4191
|
})
|
|
@@ -3650,7 +4194,7 @@ function StartSessionPrompt({
|
|
|
3650
4194
|
}
|
|
3651
4195
|
|
|
3652
4196
|
// src/components/Sidebar.tsx
|
|
3653
|
-
import { jsx as
|
|
4197
|
+
import { jsx as jsx22, jsxs as jsxs18, Fragment as Fragment5 } from "react/jsx-runtime";
|
|
3654
4198
|
function Sidebar({
|
|
3655
4199
|
hideControls = false,
|
|
3656
4200
|
hideHeader = false,
|
|
@@ -3686,13 +4230,13 @@ function Sidebar({
|
|
|
3686
4230
|
agentMode,
|
|
3687
4231
|
agentControls
|
|
3688
4232
|
} = useLiveAgent();
|
|
3689
|
-
const internalCtx =
|
|
4233
|
+
const internalCtx = useContext6(LiveAgentContext);
|
|
3690
4234
|
const usesHostAuth = internalCtx?.usesHostAuth ?? false;
|
|
3691
4235
|
const authFailed = internalCtx?.authFailed ?? false;
|
|
3692
4236
|
const showAgenda = agentMode !== AGENT_MODE.AlwaysOn;
|
|
3693
4237
|
const isFloating = variant === "floating";
|
|
3694
4238
|
const isSidebar = variant === "sidebar";
|
|
3695
|
-
|
|
4239
|
+
useEffect19(() => {
|
|
3696
4240
|
if (!isSidebar)
|
|
3697
4241
|
return;
|
|
3698
4242
|
const prop = position === "right" ? "marginRight" : "marginLeft";
|
|
@@ -3706,12 +4250,12 @@ function Sidebar({
|
|
|
3706
4250
|
document.body.style.transition = "";
|
|
3707
4251
|
};
|
|
3708
4252
|
}, [isSidebar, isPanelOpen, position]);
|
|
3709
|
-
return /* @__PURE__ */
|
|
4253
|
+
return /* @__PURE__ */ jsxs18("div", {
|
|
3710
4254
|
className: cn("skippr:fixed skippr:z-[9999]", "skippr:bg-card", "skippr:flex skippr:flex-col", "skippr:overflow-hidden", isFloating && "skippr:border skippr:border-border skippr:bottom-[88px] skippr:h-[min(460px,calc(100vh-200px))] skippr:rounded-2xl skippr:shadow-[0_8px_30px_rgba(0,0,0,0.16),0_4px_12px_rgba(0,0,0,0.08)]", isFloating && (position === "right" ? "skippr:right-6" : "skippr:left-6"), isFloating && "skippr:transition-[opacity,transform] skippr:duration-300 skippr:ease-in-out", isFloating && (position === "right" ? "skippr:origin-bottom-right" : "skippr:origin-bottom-left"), isFloating && !isPanelOpen && "skippr:scale-0 skippr:opacity-0 skippr:pointer-events-none", isFloating && isPanelOpen && "skippr:scale-100 skippr:opacity-100", isSidebar && "skippr:top-0 skippr:h-full", isSidebar && "skippr:transition-[width] skippr:duration-300 skippr:ease-in-out", isSidebar && position === "right" && "skippr:right-0 skippr:border-l skippr:border-l-border", isSidebar && position === "left" && "skippr:left-0 skippr:border-r skippr:border-r-border", isSidebar && !isPanelOpen && "skippr:w-0 skippr:border-0"),
|
|
3711
4255
|
style: { width: isPanelOpen ? SIDEBAR_WIDTH : undefined },
|
|
3712
4256
|
children: [
|
|
3713
|
-
!hideHeader && /* @__PURE__ */
|
|
3714
|
-
authFailed ? /* @__PURE__ */
|
|
4257
|
+
!hideHeader && /* @__PURE__ */ jsx22(ChatHeader, {}),
|
|
4258
|
+
authFailed ? /* @__PURE__ */ jsx22(AuthError, {}) : isAuthenticated ? /* @__PURE__ */ jsx22(AuthenticatedContent, {
|
|
3715
4259
|
isConnected,
|
|
3716
4260
|
isPaused,
|
|
3717
4261
|
isPausing,
|
|
@@ -3733,12 +4277,12 @@ function Sidebar({
|
|
|
3733
4277
|
agentId,
|
|
3734
4278
|
agentControls,
|
|
3735
4279
|
showAgenda
|
|
3736
|
-
}) : usesHostAuth || isValidating ? /* @__PURE__ */
|
|
4280
|
+
}) : usesHostAuth || isValidating ? /* @__PURE__ */ jsx22("div", {
|
|
3737
4281
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
|
|
3738
|
-
children: /* @__PURE__ */
|
|
4282
|
+
children: /* @__PURE__ */ jsx22(LoadingDots, {
|
|
3739
4283
|
label: "Loading..."
|
|
3740
4284
|
})
|
|
3741
|
-
}) : /* @__PURE__ */
|
|
4285
|
+
}) : /* @__PURE__ */ jsx22(LoginFlow, {
|
|
3742
4286
|
requestOtp,
|
|
3743
4287
|
verifyOtp,
|
|
3744
4288
|
error: authError,
|
|
@@ -3782,63 +4326,63 @@ function AuthenticatedContent({
|
|
|
3782
4326
|
} else if (isPaused) {
|
|
3783
4327
|
transitionLabel = "Paused";
|
|
3784
4328
|
}
|
|
3785
|
-
return /* @__PURE__ */
|
|
4329
|
+
return /* @__PURE__ */ jsxs18(Fragment5, {
|
|
3786
4330
|
children: [
|
|
3787
|
-
isConnected && /* @__PURE__ */
|
|
3788
|
-
showTabBar && /* @__PURE__ */
|
|
4331
|
+
isConnected && /* @__PURE__ */ jsx22(ConnectedBanner, {}),
|
|
4332
|
+
showTabBar && /* @__PURE__ */ jsxs18("div", {
|
|
3789
4333
|
className: "skippr:flex skippr:items-center skippr:gap-2 skippr:border-b skippr:border-border skippr:px-3 skippr:py-2",
|
|
3790
4334
|
children: [
|
|
3791
|
-
/* @__PURE__ */
|
|
4335
|
+
/* @__PURE__ */ jsxs18("button", {
|
|
3792
4336
|
type: "button",
|
|
3793
4337
|
className: cn("skippr:relative skippr:inline-flex skippr:cursor-pointer skippr:items-center skippr:gap-1.5 skippr:rounded-lg skippr:px-3 skippr:py-2 skippr:text-sm skippr:font-medium skippr:transition-all", activeTab === "chat" ? "skippr:text-foreground" : "skippr:text-muted-foreground skippr:hover:text-foreground"),
|
|
3794
4338
|
onClick: () => onTabChange("chat"),
|
|
3795
4339
|
children: [
|
|
3796
|
-
/* @__PURE__ */
|
|
4340
|
+
/* @__PURE__ */ jsx22(MessageCircle, {
|
|
3797
4341
|
className: "skippr:size-3.5"
|
|
3798
4342
|
}),
|
|
3799
4343
|
"Chat",
|
|
3800
|
-
activeTab === "chat" && /* @__PURE__ */
|
|
4344
|
+
activeTab === "chat" && /* @__PURE__ */ jsx22("span", {
|
|
3801
4345
|
className: "skippr:absolute skippr:-bottom-2 skippr:left-3 skippr:right-3 skippr:h-0.5 skippr:rounded-full skippr:bg-foreground"
|
|
3802
4346
|
})
|
|
3803
4347
|
]
|
|
3804
4348
|
}),
|
|
3805
|
-
showAgenda && /* @__PURE__ */
|
|
4349
|
+
showAgenda && /* @__PURE__ */ jsxs18("button", {
|
|
3806
4350
|
type: "button",
|
|
3807
4351
|
className: cn("skippr:relative skippr:inline-flex skippr:cursor-pointer skippr:items-center skippr:gap-1.5 skippr:rounded-lg skippr:px-3 skippr:py-2 skippr:text-sm skippr:font-medium skippr:transition-all", activeTab === "agenda" ? "skippr:text-foreground" : "skippr:text-muted-foreground skippr:hover:text-foreground"),
|
|
3808
4352
|
onClick: () => onTabChange("agenda"),
|
|
3809
4353
|
children: [
|
|
3810
|
-
/* @__PURE__ */
|
|
4354
|
+
/* @__PURE__ */ jsx22(Calendar, {
|
|
3811
4355
|
className: "skippr:size-3.5"
|
|
3812
4356
|
}),
|
|
3813
4357
|
"Agenda",
|
|
3814
|
-
activeTab === "agenda" && /* @__PURE__ */
|
|
4358
|
+
activeTab === "agenda" && /* @__PURE__ */ jsx22("span", {
|
|
3815
4359
|
className: "skippr:absolute skippr:-bottom-2 skippr:left-3 skippr:right-3 skippr:h-0.5 skippr:rounded-full skippr:bg-foreground"
|
|
3816
4360
|
})
|
|
3817
4361
|
]
|
|
3818
4362
|
})
|
|
3819
4363
|
]
|
|
3820
4364
|
}),
|
|
3821
|
-
/* @__PURE__ */
|
|
4365
|
+
/* @__PURE__ */ jsx22("div", {
|
|
3822
4366
|
className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col",
|
|
3823
|
-
children: isDisconnecting ? /* @__PURE__ */
|
|
4367
|
+
children: isDisconnecting ? /* @__PURE__ */ jsx22("div", {
|
|
3824
4368
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
|
|
3825
|
-
children: /* @__PURE__ */
|
|
4369
|
+
children: /* @__PURE__ */ jsx22(LoadingDots, {
|
|
3826
4370
|
label: "Ending session..."
|
|
3827
4371
|
})
|
|
3828
|
-
}) : showSelectorAsPrompt ? /* @__PURE__ */
|
|
4372
|
+
}) : showSelectorAsPrompt ? /* @__PURE__ */ jsx22(ModuleSelector, {}) : inSession ? /* @__PURE__ */ jsxs18(Fragment5, {
|
|
3829
4373
|
children: [
|
|
3830
|
-
transitionLabel && /* @__PURE__ */
|
|
4374
|
+
transitionLabel && /* @__PURE__ */ jsx22("div", {
|
|
3831
4375
|
className: "skippr:shrink-0 skippr:border-b skippr:border-border skippr:bg-muted/50 skippr:px-3 skippr:py-1.5 skippr:text-center skippr:text-xs skippr:text-muted-foreground",
|
|
3832
4376
|
children: transitionLabel
|
|
3833
4377
|
}),
|
|
3834
|
-
/* @__PURE__ */
|
|
4378
|
+
/* @__PURE__ */ jsx22(ConnectedBody, {
|
|
3835
4379
|
activeTab: effectiveTab,
|
|
3836
4380
|
autoFocusChat
|
|
3837
4381
|
})
|
|
3838
4382
|
]
|
|
3839
|
-
}) : /* @__PURE__ */
|
|
4383
|
+
}) : /* @__PURE__ */ jsx22("div", {
|
|
3840
4384
|
className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col skippr:animate-skippr-tab-fade",
|
|
3841
|
-
children: /* @__PURE__ */
|
|
4385
|
+
children: /* @__PURE__ */ jsx22(StartSessionPrompt, {
|
|
3842
4386
|
onStartSession,
|
|
3843
4387
|
agentId,
|
|
3844
4388
|
agentControls,
|
|
@@ -3850,7 +4394,7 @@ function AuthenticatedContent({
|
|
|
3850
4394
|
})
|
|
3851
4395
|
}, `${activeTab}-empty`)
|
|
3852
4396
|
}),
|
|
3853
|
-
(isConnected || isPaused) && !isDisconnecting && !hideControls && /* @__PURE__ */
|
|
4397
|
+
(isConnected || isPaused) && !isDisconnecting && !hideControls && /* @__PURE__ */ jsx22(MeetingControls, {
|
|
3854
4398
|
onHangUp: onDisconnect,
|
|
3855
4399
|
onPause,
|
|
3856
4400
|
onResume,
|
|
@@ -3862,17 +4406,17 @@ function AuthenticatedContent({
|
|
|
3862
4406
|
});
|
|
3863
4407
|
}
|
|
3864
4408
|
function AuthError() {
|
|
3865
|
-
return /* @__PURE__ */
|
|
4409
|
+
return /* @__PURE__ */ jsxs18("div", {
|
|
3866
4410
|
className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:items-center skippr:justify-center skippr:px-6 skippr:py-4 skippr:text-center",
|
|
3867
4411
|
children: [
|
|
3868
|
-
/* @__PURE__ */
|
|
4412
|
+
/* @__PURE__ */ jsx22(CircleAlert, {
|
|
3869
4413
|
className: "skippr:mb-3 skippr:size-7 skippr:text-destructive"
|
|
3870
4414
|
}),
|
|
3871
|
-
/* @__PURE__ */
|
|
4415
|
+
/* @__PURE__ */ jsx22("p", {
|
|
3872
4416
|
className: "skippr:text-sm skippr:font-medium skippr:text-foreground",
|
|
3873
4417
|
children: "We couldn't verify your session"
|
|
3874
4418
|
}),
|
|
3875
|
-
/* @__PURE__ */
|
|
4419
|
+
/* @__PURE__ */ jsx22("p", {
|
|
3876
4420
|
className: "skippr:mt-1 skippr:text-xs skippr:text-muted-foreground",
|
|
3877
4421
|
children: "Please contact administrator."
|
|
3878
4422
|
})
|
|
@@ -3881,7 +4425,7 @@ function AuthError() {
|
|
|
3881
4425
|
}
|
|
3882
4426
|
function ConnectedBanner() {
|
|
3883
4427
|
const remaining = useSessionRemaining();
|
|
3884
|
-
return /* @__PURE__ */
|
|
4428
|
+
return /* @__PURE__ */ jsx22(SessionWarningBanner, {
|
|
3885
4429
|
remaining
|
|
3886
4430
|
});
|
|
3887
4431
|
}
|
|
@@ -3892,17 +4436,17 @@ function ConnectedBody({
|
|
|
3892
4436
|
const { allMessages, agentState, sendChatMessage, isSendingChat } = useCombinedMessages();
|
|
3893
4437
|
const { phases } = usePhaseUpdates();
|
|
3894
4438
|
if (activeTab === "agenda") {
|
|
3895
|
-
return /* @__PURE__ */
|
|
4439
|
+
return /* @__PURE__ */ jsx22("div", {
|
|
3896
4440
|
className: "skippr:min-h-0 skippr:flex-1 skippr:overflow-y-auto skippr:animate-skippr-tab-fade",
|
|
3897
|
-
children: /* @__PURE__ */
|
|
4441
|
+
children: /* @__PURE__ */ jsx22(SessionAgenda, {
|
|
3898
4442
|
phases,
|
|
3899
4443
|
hasStarted: allMessages.length > 0 || agentState === "speaking"
|
|
3900
4444
|
})
|
|
3901
4445
|
}, "agenda");
|
|
3902
4446
|
}
|
|
3903
|
-
return /* @__PURE__ */
|
|
4447
|
+
return /* @__PURE__ */ jsx22("div", {
|
|
3904
4448
|
className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col skippr:animate-skippr-tab-fade",
|
|
3905
|
-
children: /* @__PURE__ */
|
|
4449
|
+
children: /* @__PURE__ */ jsx22(MessageList, {
|
|
3906
4450
|
messages: allMessages,
|
|
3907
4451
|
isStreaming: agentState === "speaking",
|
|
3908
4452
|
sendChatMessage,
|
|
@@ -3913,28 +4457,28 @@ function ConnectedBody({
|
|
|
3913
4457
|
}
|
|
3914
4458
|
|
|
3915
4459
|
// src/components/SidebarTrigger.tsx
|
|
3916
|
-
import { jsx as
|
|
4460
|
+
import { jsx as jsx23 } from "react/jsx-runtime";
|
|
3917
4461
|
function SidebarTrigger() {
|
|
3918
4462
|
const { isPanelOpen, togglePanel, minimizePanel, minimizable, position, isMinimized } = useLiveAgent();
|
|
3919
4463
|
if (isMinimized)
|
|
3920
4464
|
return null;
|
|
3921
4465
|
const handleClick = isPanelOpen && minimizable ? minimizePanel : togglePanel;
|
|
3922
|
-
return /* @__PURE__ */
|
|
4466
|
+
return /* @__PURE__ */ jsx23("button", {
|
|
3923
4467
|
type: "button",
|
|
3924
4468
|
onClick: handleClick,
|
|
3925
4469
|
title: isPanelOpen ? "Close chat" : "Open chat",
|
|
3926
4470
|
"aria-label": isPanelOpen ? "Close chat" : "Open chat",
|
|
3927
4471
|
className: cn("skippr:fixed skippr:bottom-6 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"),
|
|
3928
|
-
children: isPanelOpen ? /* @__PURE__ */
|
|
4472
|
+
children: isPanelOpen ? /* @__PURE__ */ jsx23(ChevronDown, {
|
|
3929
4473
|
className: "skippr:size-5"
|
|
3930
|
-
}) : /* @__PURE__ */
|
|
4474
|
+
}) : /* @__PURE__ */ jsx23(Logo, {
|
|
3931
4475
|
className: "skippr:size-12"
|
|
3932
4476
|
})
|
|
3933
4477
|
});
|
|
3934
4478
|
}
|
|
3935
4479
|
|
|
3936
4480
|
// src/components/LiveAgent.tsx
|
|
3937
|
-
import { jsx as
|
|
4481
|
+
import { jsx as jsx24, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
3938
4482
|
function LiveAgent(props) {
|
|
3939
4483
|
const {
|
|
3940
4484
|
agentId: hostAgentId,
|
|
@@ -3966,24 +4510,24 @@ function LiveAgent(props) {
|
|
|
3966
4510
|
const usesHostAuth = !!getUserToken || !!userToken || !!authTokenProp;
|
|
3967
4511
|
const effectiveAuthToken = usesHostAuth ? authTokenProp : auth.authToken ?? undefined;
|
|
3968
4512
|
const hasModuleSelector = !hostAgentId;
|
|
3969
|
-
const [activeModule, setActiveModule] =
|
|
4513
|
+
const [activeModule, setActiveModule] = useState15(null);
|
|
3970
4514
|
const agentId = hasModuleSelector ? activeModule?.id ?? null : hostAgentId;
|
|
3971
4515
|
const agentControls = hasModuleSelector ? activeModule?.controls : hostAgentControls;
|
|
3972
|
-
const minimizeOnSessionStart =
|
|
4516
|
+
const minimizeOnSessionStart = useCallback10(() => {
|
|
3973
4517
|
if (minimizable) {
|
|
3974
4518
|
setIsMinimized(true);
|
|
3975
4519
|
setIsPanelOpen(false);
|
|
3976
4520
|
}
|
|
3977
4521
|
}, [minimizable]);
|
|
3978
|
-
const expandOnSessionStartError =
|
|
4522
|
+
const expandOnSessionStartError = useCallback10(() => {
|
|
3979
4523
|
setIsMinimized(false);
|
|
3980
4524
|
setIsPanelOpen(true);
|
|
3981
4525
|
}, []);
|
|
3982
|
-
const minimizeOnSessionDisconnect =
|
|
4526
|
+
const minimizeOnSessionDisconnect = useCallback10(() => {
|
|
3983
4527
|
if (hasModuleSelector) {
|
|
3984
4528
|
setActiveModule(null);
|
|
3985
4529
|
}
|
|
3986
|
-
if (minimizable
|
|
4530
|
+
if (minimizable) {
|
|
3987
4531
|
setIsMinimized(true);
|
|
3988
4532
|
setIsPanelOpen(false);
|
|
3989
4533
|
}
|
|
@@ -4015,24 +4559,35 @@ function LiveAgent(props) {
|
|
|
4015
4559
|
onStartError: expandOnSessionStartError,
|
|
4016
4560
|
onDisconnect: minimizeOnSessionDisconnect
|
|
4017
4561
|
});
|
|
4018
|
-
const teardownInFlightRef =
|
|
4562
|
+
const teardownInFlightRef = useRef13(false);
|
|
4019
4563
|
teardownInFlightRef.current = isPaused || isPausing || isDisconnecting;
|
|
4020
|
-
const handleRoomDisconnected =
|
|
4564
|
+
const handleRoomDisconnected = useCallback10(() => {
|
|
4021
4565
|
if (teardownInFlightRef.current)
|
|
4022
4566
|
return;
|
|
4023
4567
|
disconnect();
|
|
4024
4568
|
}, [disconnect]);
|
|
4025
|
-
const
|
|
4026
|
-
const [
|
|
4027
|
-
const [
|
|
4028
|
-
const [
|
|
4569
|
+
const inSession = connection !== null || isStarting || isPaused || isPausing || isDisconnecting;
|
|
4570
|
+
const [isPanelOpen, setIsPanelOpen] = useState15(defaultOpen);
|
|
4571
|
+
const [isMinimized, setIsMinimized] = useState15(minimizable && !defaultOpen);
|
|
4572
|
+
const [sidebarTab, setSidebarTab] = useState15("agenda");
|
|
4573
|
+
const [phasesSnapshot, setPhasesSnapshot] = useState15([]);
|
|
4029
4574
|
const {
|
|
4030
4575
|
modules: availableModules,
|
|
4031
4576
|
isLoading: isLoadingModules,
|
|
4032
4577
|
error: modulesError,
|
|
4033
4578
|
refetch: refetchModules
|
|
4034
4579
|
} = useAvailableModules({
|
|
4035
|
-
enabled:
|
|
4580
|
+
enabled: !inSession,
|
|
4581
|
+
bearerToken,
|
|
4582
|
+
authedFetch
|
|
4583
|
+
});
|
|
4584
|
+
const hasAlwaysOnModule = availableModules.some((m) => m.mode === AGENT_MODE.AlwaysOn);
|
|
4585
|
+
const {
|
|
4586
|
+
goals: adoptionGoals,
|
|
4587
|
+
dismissGoal: dismissAdoptionGoal,
|
|
4588
|
+
attendGoal
|
|
4589
|
+
} = useAdoptionGoals({
|
|
4590
|
+
enabled: !inSession && hasAlwaysOnModule,
|
|
4036
4591
|
bearerToken,
|
|
4037
4592
|
authedFetch
|
|
4038
4593
|
});
|
|
@@ -4045,7 +4600,7 @@ function LiveAgent(props) {
|
|
|
4045
4600
|
}, [activeModule, hostAgentId, availableModules]);
|
|
4046
4601
|
const agentMode = activeModuleForAgent?.mode ?? null;
|
|
4047
4602
|
const resumableSession = useMemo5(() => getResumableSession(activeModuleForAgent), [activeModuleForAgent]);
|
|
4048
|
-
const resumeSession =
|
|
4603
|
+
const resumeSession = useCallback10(async () => {
|
|
4049
4604
|
if (!resumableSession)
|
|
4050
4605
|
return;
|
|
4051
4606
|
await startSession({
|
|
@@ -4054,7 +4609,7 @@ function LiveAgent(props) {
|
|
|
4054
4609
|
existingSessionId: resumableSession.id
|
|
4055
4610
|
});
|
|
4056
4611
|
}, [resumableSession, startSession, agentControls]);
|
|
4057
|
-
const selectModule =
|
|
4612
|
+
const selectModule = useCallback10((moduleId) => {
|
|
4058
4613
|
const found = availableModules.find((m) => m.id === moduleId);
|
|
4059
4614
|
if (!found)
|
|
4060
4615
|
return;
|
|
@@ -4065,9 +4620,20 @@ function LiveAgent(props) {
|
|
|
4065
4620
|
existingSessionId: getResumableSessionId(found.currentSession, found.mode)
|
|
4066
4621
|
});
|
|
4067
4622
|
}, [availableModules, startSession]);
|
|
4068
|
-
const
|
|
4069
|
-
|
|
4070
|
-
|
|
4623
|
+
const startAdoptionSession = useCallback10((goal) => {
|
|
4624
|
+
attendGoal(goal.goalId);
|
|
4625
|
+
const found = availableModules.find((m) => m.id === goal.agentId);
|
|
4626
|
+
if (found)
|
|
4627
|
+
setActiveModule(found);
|
|
4628
|
+
startSession({
|
|
4629
|
+
agentId: goal.agentId,
|
|
4630
|
+
agentControls: found?.controls,
|
|
4631
|
+
adoptionGoalId: goal.goalId
|
|
4632
|
+
});
|
|
4633
|
+
}, [attendGoal, availableModules, startSession]);
|
|
4634
|
+
const [welcomeDismissed, setWelcomeDismissed] = useState15(false);
|
|
4635
|
+
const dismissWelcome = useCallback10(() => setWelcomeDismissed(true), []);
|
|
4636
|
+
const [currentPosition, setCurrentPosition] = useState15(() => {
|
|
4071
4637
|
try {
|
|
4072
4638
|
const saved = localStorage.getItem("skippr_widget_position");
|
|
4073
4639
|
if (saved === "left" || saved === "right")
|
|
@@ -4075,20 +4641,20 @@ function LiveAgent(props) {
|
|
|
4075
4641
|
} catch {}
|
|
4076
4642
|
return position;
|
|
4077
4643
|
});
|
|
4078
|
-
const setPositionWithPersist =
|
|
4644
|
+
const setPositionWithPersist = useCallback10((pos) => {
|
|
4079
4645
|
setCurrentPosition(pos);
|
|
4080
4646
|
try {
|
|
4081
4647
|
localStorage.setItem("skippr_widget_position", pos);
|
|
4082
4648
|
} catch {}
|
|
4083
4649
|
}, []);
|
|
4084
|
-
const openPanel =
|
|
4085
|
-
const closePanel =
|
|
4086
|
-
const togglePanel =
|
|
4087
|
-
const expandPanel =
|
|
4650
|
+
const openPanel = useCallback10(() => setIsPanelOpen(true), []);
|
|
4651
|
+
const closePanel = useCallback10(() => setIsPanelOpen(false), []);
|
|
4652
|
+
const togglePanel = useCallback10(() => setIsPanelOpen((prev) => !prev), []);
|
|
4653
|
+
const expandPanel = useCallback10(() => {
|
|
4088
4654
|
setIsMinimized(false);
|
|
4089
4655
|
setIsPanelOpen(true);
|
|
4090
4656
|
}, []);
|
|
4091
|
-
const minimizePanel =
|
|
4657
|
+
const minimizePanel = useCallback10(() => {
|
|
4092
4658
|
if (!minimizable)
|
|
4093
4659
|
return;
|
|
4094
4660
|
setIsMinimized(true);
|
|
@@ -4147,7 +4713,10 @@ function LiveAgent(props) {
|
|
|
4147
4713
|
isLoadingModules,
|
|
4148
4714
|
modulesError,
|
|
4149
4715
|
refetchModules,
|
|
4150
|
-
selectModule
|
|
4716
|
+
selectModule,
|
|
4717
|
+
adoptionGoals,
|
|
4718
|
+
dismissAdoptionGoal,
|
|
4719
|
+
startAdoptionSession
|
|
4151
4720
|
}), [
|
|
4152
4721
|
connection,
|
|
4153
4722
|
shouldConnect,
|
|
@@ -4197,35 +4766,39 @@ function LiveAgent(props) {
|
|
|
4197
4766
|
isLoadingModules,
|
|
4198
4767
|
modulesError,
|
|
4199
4768
|
refetchModules,
|
|
4200
|
-
selectModule
|
|
4769
|
+
selectModule,
|
|
4770
|
+
adoptionGoals,
|
|
4771
|
+
dismissAdoptionGoal,
|
|
4772
|
+
startAdoptionSession
|
|
4201
4773
|
]);
|
|
4202
|
-
return /* @__PURE__ */
|
|
4774
|
+
return /* @__PURE__ */ jsx24(LiveAgentContext.Provider, {
|
|
4203
4775
|
value: ctx,
|
|
4204
|
-
children: /* @__PURE__ */
|
|
4776
|
+
children: /* @__PURE__ */ jsxs19(LiveKitRoom, {
|
|
4205
4777
|
serverUrl: connection?.livekitUrl,
|
|
4206
4778
|
token: connection?.token,
|
|
4207
4779
|
connect: shouldConnect,
|
|
4208
4780
|
audio: true,
|
|
4209
4781
|
onDisconnected: handleRoomDisconnected,
|
|
4210
4782
|
children: [
|
|
4211
|
-
connection && /* @__PURE__ */
|
|
4212
|
-
connection && captureMode === "screenshare" && /* @__PURE__ */
|
|
4783
|
+
connection && /* @__PURE__ */ jsx24(RoomAudioRenderer, {}),
|
|
4784
|
+
connection && captureMode === "screenshare" && /* @__PURE__ */ jsx24(AutoStartMedia, {
|
|
4213
4785
|
pendingScreenStream
|
|
4214
4786
|
}),
|
|
4215
|
-
connection && captureMode === "auto" && /* @__PURE__ */
|
|
4216
|
-
/* @__PURE__ */
|
|
4787
|
+
connection && captureMode === "auto" && /* @__PURE__ */ jsx24(DomCapture, {}),
|
|
4788
|
+
/* @__PURE__ */ jsxs19(ShadowHost, {
|
|
4217
4789
|
children: [
|
|
4218
|
-
connection && captureMode === "auto" && agentControls?.highlight && /* @__PURE__ */
|
|
4219
|
-
/* @__PURE__ */
|
|
4790
|
+
connection && captureMode === "auto" && agentControls?.highlight && /* @__PURE__ */ jsx24(HighlightOverlay, {}),
|
|
4791
|
+
connection && captureMode === "auto" && agentControls?.actions && /* @__PURE__ */ jsx24(PageActionHandler, {}),
|
|
4792
|
+
/* @__PURE__ */ jsxs19("div", {
|
|
4220
4793
|
id: WIDGET_ROOT_ID,
|
|
4221
4794
|
children: [
|
|
4222
|
-
isMinimized && /* @__PURE__ */
|
|
4795
|
+
isMinimized && /* @__PURE__ */ jsx24(MinimizedBubble, {
|
|
4223
4796
|
welcomeMessage,
|
|
4224
4797
|
welcomeDismissed,
|
|
4225
4798
|
onDismissWelcome: dismissWelcome
|
|
4226
4799
|
}),
|
|
4227
|
-
/* @__PURE__ */
|
|
4228
|
-
/* @__PURE__ */
|
|
4800
|
+
/* @__PURE__ */ jsx24(SidebarTrigger, {}),
|
|
4801
|
+
/* @__PURE__ */ jsx24(Sidebar, {
|
|
4229
4802
|
hideControls,
|
|
4230
4803
|
hideHeader,
|
|
4231
4804
|
startSessionLabel
|