@skippr/live-agent-sdk 0.112.0 → 0.114.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/dist/esm/lib-exports.js +589 -314
- package/dist/skippr-sdk.css +1 -1
- package/dist/skippr-sdk.js +108 -108
- package/dist/types/components/HighlightOverlay.d.ts +1 -0
- package/dist/types/context/LiveAgentContext.d.ts +2 -0
- package/dist/types/hooks/useAuth.d.ts +2 -1
- package/dist/types/hooks/useSession.d.ts +5 -2
- package/dist/types/hooks/useTransientError.d.ts +1 -0
- package/dist/types/lib/apiError.d.ts +7 -0
- package/dist/types/lib/errorCopy.d.ts +13 -0
- package/package.json +1 -1
package/dist/esm/lib-exports.js
CHANGED
|
@@ -8,7 +8,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
8
8
|
|
|
9
9
|
// src/components/LiveAgent.tsx
|
|
10
10
|
import { LiveKitRoom, RoomAudioRenderer } from "@livekit/components-react";
|
|
11
|
-
import { Fragment as Fragment8, useCallback as useCallback36, useEffect as
|
|
11
|
+
import { Fragment as Fragment8, useCallback as useCallback36, useEffect as useEffect50, useMemo as useMemo10, useRef as useRef45, useState as useState41 } from "react";
|
|
12
12
|
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/createLucideIcon.js
|
|
13
13
|
import { forwardRef as forwardRef2, createElement as createElement3 } from "react";
|
|
14
14
|
|
|
@@ -362,7 +362,7 @@ var __iconNode32 = [
|
|
|
362
362
|
];
|
|
363
363
|
var X = createLucideIcon("x", __iconNode32);
|
|
364
364
|
// src/buddy/BuddyVoiceBar.tsx
|
|
365
|
-
import { useCallback as useCallback8, useContext as useContext3, useEffect as
|
|
365
|
+
import { useCallback as useCallback8, useContext as useContext3, useEffect as useEffect10, useRef as useRef10, useState as useState8 } from "react";
|
|
366
366
|
|
|
367
367
|
// src/capture/widgetAnchor.ts
|
|
368
368
|
var anchor = null;
|
|
@@ -1147,13 +1147,30 @@ function usePointerHold(onStart, onCommit) {
|
|
|
1147
1147
|
return start;
|
|
1148
1148
|
}
|
|
1149
1149
|
|
|
1150
|
+
// src/hooks/useTransientError.ts
|
|
1151
|
+
import { useEffect as useEffect5, useState as useState2 } from "react";
|
|
1152
|
+
var TRANSIENT_ERROR_VISIBLE_MS = 3000;
|
|
1153
|
+
function useTransientError(error, errorSeq) {
|
|
1154
|
+
const [visibleError, setVisibleError] = useState2("");
|
|
1155
|
+
useEffect5(() => {
|
|
1156
|
+
if (!error) {
|
|
1157
|
+
setVisibleError("");
|
|
1158
|
+
return;
|
|
1159
|
+
}
|
|
1160
|
+
setVisibleError(error);
|
|
1161
|
+
const timer = setTimeout(() => setVisibleError(""), TRANSIENT_ERROR_VISIBLE_MS);
|
|
1162
|
+
return () => clearTimeout(timer);
|
|
1163
|
+
}, [error, errorSeq]);
|
|
1164
|
+
return visibleError;
|
|
1165
|
+
}
|
|
1166
|
+
|
|
1150
1167
|
// src/hooks/useVoiceTurn.ts
|
|
1151
1168
|
import { useLocalParticipant } from "@livekit/components-react/hooks";
|
|
1152
|
-
import { useCallback as useCallback4, useRef as useRef5, useState as
|
|
1169
|
+
import { useCallback as useCallback4, useRef as useRef5, useState as useState3 } from "react";
|
|
1153
1170
|
var textEncoder = new TextEncoder;
|
|
1154
1171
|
function useVoiceTurn() {
|
|
1155
1172
|
const { localParticipant } = useLocalParticipant();
|
|
1156
|
-
const [isCapturingSpeech, setIsCapturingSpeech] =
|
|
1173
|
+
const [isCapturingSpeech, setIsCapturingSpeech] = useState3(false);
|
|
1157
1174
|
const capturingRef = useRef5(false);
|
|
1158
1175
|
const publish = useCallback4(async (type) => {
|
|
1159
1176
|
await localParticipant.publishData(textEncoder.encode(JSON.stringify({ type })), {
|
|
@@ -1200,6 +1217,148 @@ function useVoiceTurn() {
|
|
|
1200
1217
|
return { isCapturingSpeech, toggle, start, commit };
|
|
1201
1218
|
}
|
|
1202
1219
|
|
|
1220
|
+
// src/lib/apiError.ts
|
|
1221
|
+
class ApiError extends Error {
|
|
1222
|
+
status;
|
|
1223
|
+
constructor(status, detail) {
|
|
1224
|
+
super(detail);
|
|
1225
|
+
this.name = "ApiError";
|
|
1226
|
+
this.status = status;
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1229
|
+
async function parseApiError(resp) {
|
|
1230
|
+
const body = await resp.json().catch(() => null);
|
|
1231
|
+
const detail = typeof body?.detail === "string" && body.detail ? body.detail : `Request failed: ${resp.status}`;
|
|
1232
|
+
return new ApiError(resp.status, detail);
|
|
1233
|
+
}
|
|
1234
|
+
function isNetworkError(e) {
|
|
1235
|
+
return e instanceof TypeError;
|
|
1236
|
+
}
|
|
1237
|
+
function isClientError(e) {
|
|
1238
|
+
return e instanceof ApiError && e.status >= 400 && e.status < 500;
|
|
1239
|
+
}
|
|
1240
|
+
|
|
1241
|
+
// src/lib/errorCopy.ts
|
|
1242
|
+
var AGENT_NAME_PLACEHOLDER = "{agent}";
|
|
1243
|
+
var ERROR_COPY_DEFAULTS = {
|
|
1244
|
+
auth: "We couldn't verify your access. Please try again.",
|
|
1245
|
+
sessionStart: "We couldn't start your session. Please try again.",
|
|
1246
|
+
sessionPause: "We couldn't pause your session. Please try again.",
|
|
1247
|
+
otpRequest: "We couldn't send the verification code. Please try again.",
|
|
1248
|
+
otpVerify: "That code is invalid or has expired. Please try again.",
|
|
1249
|
+
modules: "We couldn't load the content. Please try again.",
|
|
1250
|
+
network: "We're having trouble connecting. Please try again.",
|
|
1251
|
+
unavailable: `${AGENT_NAME_PLACEHOLDER} isn't available right now. Please try again later.`,
|
|
1252
|
+
genericAgentName: "The AI agent",
|
|
1253
|
+
authFailedTitle: "We couldn't verify your session",
|
|
1254
|
+
authFailedHint: "Please contact administrator."
|
|
1255
|
+
};
|
|
1256
|
+
var ERROR_COPY_TRANSLATIONS = {
|
|
1257
|
+
fr: {
|
|
1258
|
+
auth: "Impossible de vérifier votre accès. Veuillez réessayer.",
|
|
1259
|
+
sessionStart: "Impossible de démarrer votre session. Veuillez réessayer.",
|
|
1260
|
+
sessionPause: "Impossible de mettre la session en pause. Veuillez réessayer.",
|
|
1261
|
+
otpRequest: "Impossible d'envoyer le code de vérification. Veuillez réessayer.",
|
|
1262
|
+
otpVerify: "Code invalide ou expiré. Veuillez réessayer.",
|
|
1263
|
+
modules: "Impossible de charger le contenu. Veuillez réessayer.",
|
|
1264
|
+
network: "Nous rencontrons un problème de connexion. Veuillez réessayer.",
|
|
1265
|
+
unavailable: `${AGENT_NAME_PLACEHOLDER} n'est pas disponible pour le moment. Veuillez réessayer plus tard.`,
|
|
1266
|
+
genericAgentName: "L'agent IA",
|
|
1267
|
+
authFailedTitle: "Impossible de vérifier votre session",
|
|
1268
|
+
authFailedHint: "Veuillez contacter l'administrateur."
|
|
1269
|
+
},
|
|
1270
|
+
de: {
|
|
1271
|
+
auth: "Ihr Zugriff konnte nicht überprüft werden. Bitte versuchen Sie es erneut.",
|
|
1272
|
+
sessionStart: "Ihre Sitzung konnte nicht gestartet werden. Bitte versuchen Sie es erneut.",
|
|
1273
|
+
sessionPause: "Die Sitzung konnte nicht pausiert werden. Bitte versuchen Sie es erneut.",
|
|
1274
|
+
otpRequest: "Der Bestätigungscode konnte nicht gesendet werden. Bitte versuchen Sie es erneut.",
|
|
1275
|
+
otpVerify: "Der Code ist ungültig oder abgelaufen. Bitte versuchen Sie es erneut.",
|
|
1276
|
+
modules: "Der Inhalt konnte nicht geladen werden. Bitte versuchen Sie es erneut.",
|
|
1277
|
+
network: "Es gibt ein Verbindungsproblem. Bitte versuchen Sie es erneut.",
|
|
1278
|
+
unavailable: `${AGENT_NAME_PLACEHOLDER} ist derzeit nicht verfügbar. Bitte versuchen Sie es später erneut.`,
|
|
1279
|
+
genericAgentName: "Der KI-Agent",
|
|
1280
|
+
authFailedTitle: "Ihre Sitzung konnte nicht überprüft werden",
|
|
1281
|
+
authFailedHint: "Bitte kontaktieren Sie den Administrator."
|
|
1282
|
+
},
|
|
1283
|
+
it: {
|
|
1284
|
+
auth: "Impossibile verificare il tuo accesso. Riprova.",
|
|
1285
|
+
sessionStart: "Impossibile avviare la sessione. Riprova.",
|
|
1286
|
+
sessionPause: "Impossibile mettere in pausa la sessione. Riprova.",
|
|
1287
|
+
otpRequest: "Impossibile inviare il codice di verifica. Riprova.",
|
|
1288
|
+
otpVerify: "Codice non valido o scaduto. Riprova.",
|
|
1289
|
+
modules: "Impossibile caricare il contenuto. Riprova.",
|
|
1290
|
+
network: "Si è verificato un problema di connessione. Riprova.",
|
|
1291
|
+
unavailable: `${AGENT_NAME_PLACEHOLDER} non è disponibile in questo momento. Riprova più tardi.`,
|
|
1292
|
+
genericAgentName: "L'agente IA",
|
|
1293
|
+
authFailedTitle: "Impossibile verificare la tua sessione",
|
|
1294
|
+
authFailedHint: "Contatta l'amministratore."
|
|
1295
|
+
},
|
|
1296
|
+
es: {
|
|
1297
|
+
auth: "No se pudo verificar tu acceso. Inténtalo de nuevo.",
|
|
1298
|
+
sessionStart: "No se pudo iniciar la sesión. Inténtalo de nuevo.",
|
|
1299
|
+
sessionPause: "No se pudo pausar la sesión. Inténtalo de nuevo.",
|
|
1300
|
+
otpRequest: "No se pudo enviar el código de verificación. Inténtalo de nuevo.",
|
|
1301
|
+
otpVerify: "El código no es válido o ha caducado. Inténtalo de nuevo.",
|
|
1302
|
+
modules: "No se pudo cargar el contenido. Inténtalo de nuevo.",
|
|
1303
|
+
network: "Estamos teniendo problemas de conexión. Inténtalo de nuevo.",
|
|
1304
|
+
unavailable: `${AGENT_NAME_PLACEHOLDER} no está disponible en este momento. Inténtalo de nuevo más tarde.`,
|
|
1305
|
+
genericAgentName: "El agente de IA",
|
|
1306
|
+
authFailedTitle: "No se pudo verificar tu sesión",
|
|
1307
|
+
authFailedHint: "Ponte en contacto con el administrador."
|
|
1308
|
+
},
|
|
1309
|
+
"pt-PT": {
|
|
1310
|
+
auth: "Não foi possível verificar o seu acesso. Tente novamente.",
|
|
1311
|
+
sessionStart: "Não foi possível iniciar a sessão. Tente novamente.",
|
|
1312
|
+
sessionPause: "Não foi possível pausar a sessão. Tente novamente.",
|
|
1313
|
+
otpRequest: "Não foi possível enviar o código de verificação. Tente novamente.",
|
|
1314
|
+
otpVerify: "Código inválido ou expirado. Tente novamente.",
|
|
1315
|
+
modules: "Não foi possível carregar o conteúdo. Tente novamente.",
|
|
1316
|
+
network: "Estamos com problemas de ligação. Tente novamente.",
|
|
1317
|
+
unavailable: `${AGENT_NAME_PLACEHOLDER} não está disponível neste momento. Tente novamente mais tarde.`,
|
|
1318
|
+
genericAgentName: "O agente de IA",
|
|
1319
|
+
authFailedTitle: "Não foi possível verificar a sua sessão",
|
|
1320
|
+
authFailedHint: "Contacte o administrador."
|
|
1321
|
+
},
|
|
1322
|
+
"pt-BR": {
|
|
1323
|
+
auth: "Não foi possível verificar seu acesso. Tente novamente.",
|
|
1324
|
+
sessionStart: "Não foi possível iniciar a sessão. Tente novamente.",
|
|
1325
|
+
sessionPause: "Não foi possível pausar a sessão. Tente novamente.",
|
|
1326
|
+
otpRequest: "Não foi possível enviar o código de verificação. Tente novamente.",
|
|
1327
|
+
otpVerify: "Código inválido ou expirado. Tente novamente.",
|
|
1328
|
+
modules: "Não foi possível carregar o conteúdo. Tente novamente.",
|
|
1329
|
+
network: "Estamos com problemas de conexão. Tente novamente.",
|
|
1330
|
+
unavailable: `${AGENT_NAME_PLACEHOLDER} não está disponível neste momento. Tente novamente mais tarde.`,
|
|
1331
|
+
genericAgentName: "O agente de IA",
|
|
1332
|
+
authFailedTitle: "Não foi possível verificar sua sessão",
|
|
1333
|
+
authFailedHint: "Entre em contato com o administrador."
|
|
1334
|
+
}
|
|
1335
|
+
};
|
|
1336
|
+
var ERROR_COPY_BY_LOCALE = new Map(Object.entries(ERROR_COPY_TRANSLATIONS));
|
|
1337
|
+
function copyForLocale(tag) {
|
|
1338
|
+
if (!tag)
|
|
1339
|
+
return ERROR_COPY_DEFAULTS;
|
|
1340
|
+
const [language, region] = tag.trim().split("-");
|
|
1341
|
+
if (!language)
|
|
1342
|
+
return ERROR_COPY_DEFAULTS;
|
|
1343
|
+
const bare = language.toLowerCase();
|
|
1344
|
+
const exact = region ? `${bare}-${region.toUpperCase()}` : bare;
|
|
1345
|
+
return ERROR_COPY_BY_LOCALE.get(exact) ?? ERROR_COPY_BY_LOCALE.get(bare) ?? (bare === "pt" ? ERROR_COPY_BY_LOCALE.get("pt-PT") : undefined) ?? ERROR_COPY_DEFAULTS;
|
|
1346
|
+
}
|
|
1347
|
+
function resolveAuthFailedCopy(locale) {
|
|
1348
|
+
const copy = copyForLocale(locale);
|
|
1349
|
+
return { title: copy.authFailedTitle, hint: copy.authFailedHint };
|
|
1350
|
+
}
|
|
1351
|
+
function resolveErrorMessage(context, locale, error, agentName) {
|
|
1352
|
+
const copy = copyForLocale(locale);
|
|
1353
|
+
if (error !== undefined && isNetworkError(error)) {
|
|
1354
|
+
return copy.network;
|
|
1355
|
+
}
|
|
1356
|
+
if (context === "sessionStart" /* SessionStart */ && isClientError(error)) {
|
|
1357
|
+
return copy.unavailable.replace(AGENT_NAME_PLACEHOLDER, agentName?.trim() || copy.genericAgentName);
|
|
1358
|
+
}
|
|
1359
|
+
return copy[context];
|
|
1360
|
+
}
|
|
1361
|
+
|
|
1203
1362
|
// src/buddy/BuddyFace.tsx
|
|
1204
1363
|
import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
1205
1364
|
function BuddyFace({
|
|
@@ -2527,23 +2686,23 @@ function seedBuddyEdgePosFromAppearance(position, verticalAlign, viewport, sizeP
|
|
|
2527
2686
|
}
|
|
2528
2687
|
|
|
2529
2688
|
// src/buddy/hooks/useBuddyEdgeDrag.ts
|
|
2530
|
-
import { useCallback as useCallback5, useEffect as
|
|
2689
|
+
import { useCallback as useCallback5, useEffect as useEffect6, useRef as useRef6, useState as useState4 } from "react";
|
|
2531
2690
|
function useBuddyEdgeDrag({
|
|
2532
2691
|
appearancePosition,
|
|
2533
2692
|
appearanceVerticalAlign,
|
|
2534
2693
|
sizePx = BUDDY_SIZE_PX
|
|
2535
2694
|
}) {
|
|
2536
|
-
const [pos, setPos] =
|
|
2695
|
+
const [pos, setPos] = useState4(() => {
|
|
2537
2696
|
const saved = readSavedBuddyEdgePos(sizePx);
|
|
2538
2697
|
if (saved)
|
|
2539
2698
|
return saved;
|
|
2540
2699
|
return seedBuddyEdgePosFromAppearance(appearancePosition, appearanceVerticalAlign, { innerWidth: window.innerWidth, innerHeight: window.innerHeight }, sizePx);
|
|
2541
2700
|
});
|
|
2542
|
-
const [isDragging, setIsDragging] =
|
|
2701
|
+
const [isDragging, setIsDragging] = useState4(false);
|
|
2543
2702
|
const posRef = useRef6(pos);
|
|
2544
2703
|
posRef.current = pos;
|
|
2545
2704
|
const dragCleanupRef = useRef6(null);
|
|
2546
|
-
|
|
2705
|
+
useEffect6(() => {
|
|
2547
2706
|
const onResize = () => setPos((current) => ({
|
|
2548
2707
|
edge: current.edge,
|
|
2549
2708
|
top: clampBuddyTop(current.top, sizePx),
|
|
@@ -2552,7 +2711,7 @@ function useBuddyEdgeDrag({
|
|
|
2552
2711
|
window.addEventListener("resize", onResize);
|
|
2553
2712
|
return () => window.removeEventListener("resize", onResize);
|
|
2554
2713
|
}, [sizePx]);
|
|
2555
|
-
|
|
2714
|
+
useEffect6(() => () => dragCleanupRef.current?.(), []);
|
|
2556
2715
|
const startDrag = useCallback5((event) => {
|
|
2557
2716
|
dragCleanupRef.current?.();
|
|
2558
2717
|
if (event.button !== 0)
|
|
@@ -2606,17 +2765,17 @@ function useBuddyEdgeDrag({
|
|
|
2606
2765
|
}
|
|
2607
2766
|
|
|
2608
2767
|
// src/buddy/hooks/useBuddyEyeTracking.ts
|
|
2609
|
-
import { useEffect as
|
|
2768
|
+
import { useEffect as useEffect7, useRef as useRef7, useState as useState5 } from "react";
|
|
2610
2769
|
var EYE_MAX_OFFSET_PX = 3;
|
|
2611
2770
|
var ZERO = { eyeDx: 0, eyeDy: 0 };
|
|
2612
2771
|
function useBuddyEyeTracking({
|
|
2613
2772
|
containerRef,
|
|
2614
2773
|
disabled = false
|
|
2615
2774
|
}) {
|
|
2616
|
-
const [deltas, setDeltas] =
|
|
2775
|
+
const [deltas, setDeltas] = useState5(ZERO);
|
|
2617
2776
|
const pendingRef = useRef7(null);
|
|
2618
2777
|
const rafRef = useRef7(null);
|
|
2619
|
-
|
|
2778
|
+
useEffect7(() => {
|
|
2620
2779
|
if (disabled) {
|
|
2621
2780
|
setDeltas(ZERO);
|
|
2622
2781
|
return;
|
|
@@ -2664,28 +2823,28 @@ function useBuddyEyeTracking({
|
|
|
2664
2823
|
}
|
|
2665
2824
|
|
|
2666
2825
|
// src/buddy/hooks/useBuddyFreeDrag.ts
|
|
2667
|
-
import { useCallback as useCallback6, useEffect as
|
|
2826
|
+
import { useCallback as useCallback6, useEffect as useEffect8, useRef as useRef8, useState as useState6 } from "react";
|
|
2668
2827
|
function useBuddyFreeDrag({
|
|
2669
2828
|
appearancePosition,
|
|
2670
2829
|
appearanceVerticalAlign,
|
|
2671
2830
|
sizePx = BUDDY_SIZE_PX
|
|
2672
2831
|
}) {
|
|
2673
|
-
const [pos, setPos] =
|
|
2832
|
+
const [pos, setPos] = useState6(() => {
|
|
2674
2833
|
const saved = readSavedBuddyPos();
|
|
2675
2834
|
if (saved)
|
|
2676
2835
|
return clampBuddyPos(saved, sizePx);
|
|
2677
2836
|
return seedBuddyPosFromAppearance(appearancePosition, appearanceVerticalAlign, { innerWidth: window.innerWidth, innerHeight: window.innerHeight }, sizePx);
|
|
2678
2837
|
});
|
|
2679
|
-
const [isDragging, setIsDragging] =
|
|
2838
|
+
const [isDragging, setIsDragging] = useState6(false);
|
|
2680
2839
|
const posRef = useRef8(pos);
|
|
2681
2840
|
posRef.current = pos;
|
|
2682
2841
|
const dragCleanupRef = useRef8(null);
|
|
2683
|
-
|
|
2842
|
+
useEffect8(() => {
|
|
2684
2843
|
const onResize = () => setPos((current) => clampBuddyPos(current, sizePx));
|
|
2685
2844
|
window.addEventListener("resize", onResize);
|
|
2686
2845
|
return () => window.removeEventListener("resize", onResize);
|
|
2687
2846
|
}, [sizePx]);
|
|
2688
|
-
|
|
2847
|
+
useEffect8(() => () => dragCleanupRef.current?.(), []);
|
|
2689
2848
|
const startDrag = useCallback6((event) => {
|
|
2690
2849
|
if (event.button !== 0)
|
|
2691
2850
|
return { didDrag: () => false };
|
|
@@ -2733,13 +2892,13 @@ function useBuddyFreeDrag({
|
|
|
2733
2892
|
}
|
|
2734
2893
|
|
|
2735
2894
|
// src/buddy/hooks/useBuddyIdleMode.ts
|
|
2736
|
-
import { useCallback as useCallback7, useEffect as
|
|
2895
|
+
import { useCallback as useCallback7, useEffect as useEffect9, useRef as useRef9, useState as useState7 } from "react";
|
|
2737
2896
|
function useBuddyIdleMode({
|
|
2738
2897
|
isConnected,
|
|
2739
2898
|
isSpeaking,
|
|
2740
2899
|
isListening
|
|
2741
2900
|
}) {
|
|
2742
|
-
const [mode, setMode] =
|
|
2901
|
+
const [mode, setMode] = useState7(BUDDY_MODE.Idle);
|
|
2743
2902
|
const sleepTimerRef = useRef9(null);
|
|
2744
2903
|
const happyTimerRef = useRef9(null);
|
|
2745
2904
|
const clearSleep = useCallback7(() => {
|
|
@@ -2769,7 +2928,7 @@ function useBuddyIdleMode({
|
|
|
2769
2928
|
armSleep();
|
|
2770
2929
|
}, BUDDY_HAPPY_MS);
|
|
2771
2930
|
}, [armSleep, isConnected]);
|
|
2772
|
-
|
|
2931
|
+
useEffect9(() => {
|
|
2773
2932
|
if (isConnected) {
|
|
2774
2933
|
clearSleep();
|
|
2775
2934
|
if (happyTimerRef.current) {
|
|
@@ -2787,7 +2946,7 @@ function useBuddyIdleMode({
|
|
|
2787
2946
|
armSleep();
|
|
2788
2947
|
return clearSleep;
|
|
2789
2948
|
}, [isConnected, isSpeaking, isListening, armSleep, clearSleep]);
|
|
2790
|
-
|
|
2949
|
+
useEffect9(() => () => {
|
|
2791
2950
|
if (sleepTimerRef.current)
|
|
2792
2951
|
clearTimeout(sleepTimerRef.current);
|
|
2793
2952
|
if (happyTimerRef.current)
|
|
@@ -2839,6 +2998,13 @@ function loginCardWrapperStyle(edge) {
|
|
|
2839
2998
|
...edge === "top" ? { top: "calc(100% + 8px)" } : { bottom: "calc(100% + 8px)" }
|
|
2840
2999
|
};
|
|
2841
3000
|
}
|
|
3001
|
+
function bubbleAnchorStyle(edge) {
|
|
3002
|
+
if (edge === "left")
|
|
3003
|
+
return { left: 0 };
|
|
3004
|
+
if (edge === "right")
|
|
3005
|
+
return { right: 0 };
|
|
3006
|
+
return { left: "50%", transform: "translateX(-50%)" };
|
|
3007
|
+
}
|
|
2842
3008
|
function edgeAnchor(pos) {
|
|
2843
3009
|
const half = BUDDY_SIZE_PX / 2;
|
|
2844
3010
|
if (pos.edge === "left")
|
|
@@ -2888,11 +3054,18 @@ function BuddyVoiceBar({ revealed }) {
|
|
|
2888
3054
|
appearance,
|
|
2889
3055
|
startDefaultSession,
|
|
2890
3056
|
disconnect,
|
|
2891
|
-
setAutoStartAfterLogin
|
|
3057
|
+
setAutoStartAfterLogin,
|
|
3058
|
+
error,
|
|
3059
|
+
errorSeq,
|
|
3060
|
+
authFailed,
|
|
3061
|
+
modulesError,
|
|
3062
|
+
locale
|
|
2892
3063
|
} = ctx;
|
|
2893
3064
|
const needsLogin = !usesHostAuth && !isAuthenticated;
|
|
2894
|
-
const
|
|
2895
|
-
|
|
3065
|
+
const transientError = useTransientError(error, errorSeq);
|
|
3066
|
+
const authFailedCopy = authFailed ? resolveAuthFailedCopy(locale) : null;
|
|
3067
|
+
const [loginOpen, setLoginOpen] = useState8(false);
|
|
3068
|
+
useEffect10(() => {
|
|
2896
3069
|
if (!needsLogin)
|
|
2897
3070
|
setLoginOpen(false);
|
|
2898
3071
|
}, [needsLogin]);
|
|
@@ -2917,7 +3090,7 @@ function BuddyVoiceBar({ revealed }) {
|
|
|
2917
3090
|
});
|
|
2918
3091
|
const voiceTurn = useVoiceTurn();
|
|
2919
3092
|
const edgePos = edgeDrag.pos;
|
|
2920
|
-
|
|
3093
|
+
useEffect10(() => {
|
|
2921
3094
|
setWidgetAnchor(isConnected ? { x: pos.x + BUDDY_SIZE_PX / 2, y: pos.y + BUDDY_SIZE_PX / 2 } : edgeAnchor(edgePos));
|
|
2922
3095
|
return () => setWidgetAnchor(null);
|
|
2923
3096
|
}, [isConnected, pos.x, pos.y, edgePos]);
|
|
@@ -2957,17 +3130,17 @@ function BuddyVoiceBar({ revealed }) {
|
|
|
2957
3130
|
}
|
|
2958
3131
|
};
|
|
2959
3132
|
}, [reportHover]);
|
|
2960
|
-
const [isIdleLauncherHovered, setIsIdleLauncherHovered] =
|
|
2961
|
-
const [showWakeBubble, setShowWakeBubble] =
|
|
2962
|
-
const [autoOffNotice, setAutoOffNotice] =
|
|
2963
|
-
const [holdHintSeen, setHoldHintSeen] =
|
|
2964
|
-
const [keyboardFocus, setKeyboardFocus] =
|
|
3133
|
+
const [isIdleLauncherHovered, setIsIdleLauncherHovered] = useState8(false);
|
|
3134
|
+
const [showWakeBubble, setShowWakeBubble] = useState8(false);
|
|
3135
|
+
const [autoOffNotice, setAutoOffNotice] = useState8(false);
|
|
3136
|
+
const [holdHintSeen, setHoldHintSeen] = useState8(false);
|
|
3137
|
+
const [keyboardFocus, setKeyboardFocus] = useState8(false);
|
|
2965
3138
|
useIdleAutoOff({
|
|
2966
3139
|
enabled: isConnected && !autoOffNotice,
|
|
2967
3140
|
active: isSpeaking || isListening || voiceTurn.isCapturingSpeech,
|
|
2968
3141
|
onExpire: () => setAutoOffNotice(true)
|
|
2969
3142
|
});
|
|
2970
|
-
|
|
3143
|
+
useEffect10(() => {
|
|
2971
3144
|
if (!autoOffNotice)
|
|
2972
3145
|
return;
|
|
2973
3146
|
if (!isConnected) {
|
|
@@ -2999,14 +3172,14 @@ function BuddyVoiceBar({ revealed }) {
|
|
|
2999
3172
|
code: "Space",
|
|
3000
3173
|
requireCtrl: true
|
|
3001
3174
|
});
|
|
3002
|
-
|
|
3175
|
+
useEffect10(() => {
|
|
3003
3176
|
if (!showWakeBubble)
|
|
3004
3177
|
return;
|
|
3005
3178
|
const timer = window.setTimeout(() => setShowWakeBubble(false), WAKE_BUBBLE_MS);
|
|
3006
3179
|
return () => window.clearTimeout(timer);
|
|
3007
3180
|
}, [showWakeBubble]);
|
|
3008
3181
|
const wasConnectedRef = useRef10(isConnected);
|
|
3009
|
-
|
|
3182
|
+
useEffect10(() => {
|
|
3010
3183
|
if (isConnected && !wasConnectedRef.current)
|
|
3011
3184
|
setShowWakeBubble(true);
|
|
3012
3185
|
wasConnectedRef.current = isConnected;
|
|
@@ -3134,7 +3307,11 @@ function BuddyVoiceBar({ revealed }) {
|
|
|
3134
3307
|
]
|
|
3135
3308
|
})
|
|
3136
3309
|
}),
|
|
3137
|
-
|
|
3310
|
+
transientError ? /* @__PURE__ */ jsx14("div", {
|
|
3311
|
+
role: "alert",
|
|
3312
|
+
className: "skippr:pointer-events-none skippr:absolute skippr:bottom-[calc(100%+8px)] skippr:left-1/2 skippr:w-[150px] skippr:-translate-x-1/2 skippr:rounded-2xl skippr:bg-white skippr:px-2.5 skippr:py-1.5 skippr:text-center skippr:text-[11px] skippr:leading-[1.2] skippr:text-destructive skippr:shadow-[0_6px_16px_rgba(45,45,63,0.14)]",
|
|
3313
|
+
children: transientError
|
|
3314
|
+
}) : showWakeBubble ? /* @__PURE__ */ jsxs10("div", {
|
|
3138
3315
|
className: "skippr:absolute skippr:-top-8 skippr:left-1/2 skippr:flex skippr:-translate-x-1/2 skippr:items-center skippr:gap-1.5 skippr:whitespace-nowrap skippr:rounded-full skippr:bg-white skippr:px-3 skippr:py-1 skippr:text-[11px] skippr:font-medium skippr:text-[#2D2D3F] skippr:shadow-[0_6px_16px_rgba(45,45,63,0.14)]",
|
|
3139
3316
|
role: "status",
|
|
3140
3317
|
children: [
|
|
@@ -3212,17 +3389,39 @@ function BuddyVoiceBar({ revealed }) {
|
|
|
3212
3389
|
})
|
|
3213
3390
|
]
|
|
3214
3391
|
}),
|
|
3215
|
-
|
|
3392
|
+
!loginOpen && authFailedCopy ? /* @__PURE__ */ jsxs10("div", {
|
|
3393
|
+
role: "alert",
|
|
3394
|
+
className: "skippr:pointer-events-none skippr:absolute skippr:bottom-[calc(100%+8px)] skippr:w-[150px] skippr:rounded-2xl skippr:bg-white skippr:px-2.5 skippr:py-1.5 skippr:text-center skippr:shadow-[0_6px_16px_rgba(45,45,63,0.14)]",
|
|
3395
|
+
style: bubbleAnchorStyle(edgeDrag.pos.edge),
|
|
3396
|
+
children: [
|
|
3397
|
+
/* @__PURE__ */ jsx14("p", {
|
|
3398
|
+
className: "skippr:text-[11px] skippr:font-medium skippr:leading-[1.2] skippr:text-destructive",
|
|
3399
|
+
children: authFailedCopy.title
|
|
3400
|
+
}),
|
|
3401
|
+
/* @__PURE__ */ jsx14("p", {
|
|
3402
|
+
className: "skippr:mt-0.5 skippr:text-[10px] skippr:leading-[1.2] skippr:text-muted-foreground",
|
|
3403
|
+
children: authFailedCopy.hint
|
|
3404
|
+
})
|
|
3405
|
+
]
|
|
3406
|
+
}) : !loginOpen && (modulesError || transientError) ? /* @__PURE__ */ jsx14("div", {
|
|
3407
|
+
className: "skippr:pointer-events-none skippr:absolute skippr:bottom-[calc(100%+8px)] skippr:w-[150px] skippr:rounded-2xl skippr:bg-white skippr:px-2.5 skippr:py-1.5 skippr:shadow-[0_6px_16px_rgba(45,45,63,0.14)]",
|
|
3408
|
+
style: bubbleAnchorStyle(edgeDrag.pos.edge),
|
|
3409
|
+
children: /* @__PURE__ */ jsx14("p", {
|
|
3410
|
+
role: "alert",
|
|
3411
|
+
className: "skippr:text-[11px] skippr:leading-[1.2] skippr:text-destructive skippr:text-center",
|
|
3412
|
+
children: modulesError || transientError
|
|
3413
|
+
})
|
|
3414
|
+
}) : isIdleLauncherHovered && !loginOpen && /* @__PURE__ */ jsx14(ConsentBubble, {
|
|
3216
3415
|
template: CONSENT_NOTICE_AGENT_SESSION_START,
|
|
3217
3416
|
className: "skippr:absolute skippr:bottom-[calc(100%+8px)] skippr:w-[150px]",
|
|
3218
|
-
style: edgeDrag.pos.edge
|
|
3417
|
+
style: bubbleAnchorStyle(edgeDrag.pos.edge)
|
|
3219
3418
|
})
|
|
3220
3419
|
]
|
|
3221
3420
|
})
|
|
3222
3421
|
});
|
|
3223
3422
|
}
|
|
3224
3423
|
// src/capture/useAgentCursor.ts
|
|
3225
|
-
import { useEffect as
|
|
3424
|
+
import { useEffect as useEffect11, useState as useState9 } from "react";
|
|
3226
3425
|
|
|
3227
3426
|
// src/capture/cursorController.ts
|
|
3228
3427
|
var targetListeners = new Set;
|
|
@@ -3264,8 +3463,8 @@ function subscribeCursorTarget(listener) {
|
|
|
3264
3463
|
|
|
3265
3464
|
// src/capture/useAgentCursor.ts
|
|
3266
3465
|
function useAgentCursor() {
|
|
3267
|
-
const [target, setTarget] =
|
|
3268
|
-
|
|
3466
|
+
const [target, setTarget] = useState9(null);
|
|
3467
|
+
useEffect11(() => subscribeCursorTarget(setTarget), []);
|
|
3269
3468
|
return target;
|
|
3270
3469
|
}
|
|
3271
3470
|
|
|
@@ -3311,7 +3510,7 @@ function useLiveAgent() {
|
|
|
3311
3510
|
// src/hooks/useSessionHold.ts
|
|
3312
3511
|
import { useLocalParticipant as useLocalParticipant3 } from "@livekit/components-react/hooks";
|
|
3313
3512
|
import { Track } from "livekit-client";
|
|
3314
|
-
import { useCallback as useCallback10, useEffect as
|
|
3513
|
+
import { useCallback as useCallback10, useEffect as useEffect12, useRef as useRef11, useState as useState10 } from "react";
|
|
3315
3514
|
|
|
3316
3515
|
// src/capture/agentActionSignal.ts
|
|
3317
3516
|
var isDispatchingAgentAction = false;
|
|
@@ -3500,8 +3699,8 @@ function useSessionHold({
|
|
|
3500
3699
|
}) {
|
|
3501
3700
|
const { localParticipant } = useLocalParticipant3();
|
|
3502
3701
|
const timeoutSeconds = pauseTimeoutSeconds ?? FALLBACK_PAUSE_TIMEOUT_SECONDS;
|
|
3503
|
-
const [isHeld, setIsHeld] =
|
|
3504
|
-
const [countdown, setCountdown] =
|
|
3702
|
+
const [isHeld, setIsHeld] = useState10(false);
|
|
3703
|
+
const [countdown, setCountdown] = useState10(timeoutSeconds);
|
|
3505
3704
|
const screenWasSharedBeforeHoldRef = useRef11(false);
|
|
3506
3705
|
const holdTransitionInFlightRef = useRef11(false);
|
|
3507
3706
|
const clearPausedCaptureRef = useRef11(null);
|
|
@@ -3560,7 +3759,7 @@ function useSessionHold({
|
|
|
3560
3759
|
console.error("Failed to release session:", error);
|
|
3561
3760
|
}
|
|
3562
3761
|
}, [localParticipant, publish, resumeScreenShareOnResume]);
|
|
3563
|
-
|
|
3762
|
+
useEffect12(() => {
|
|
3564
3763
|
if (!isHeld) {
|
|
3565
3764
|
setCountdown(timeoutSeconds);
|
|
3566
3765
|
return;
|
|
@@ -3570,7 +3769,7 @@ function useSessionHold({
|
|
|
3570
3769
|
}, 1000);
|
|
3571
3770
|
return () => clearInterval(id);
|
|
3572
3771
|
}, [isHeld, timeoutSeconds]);
|
|
3573
|
-
|
|
3772
|
+
useEffect12(() => {
|
|
3574
3773
|
if (isHeld && countdown === 0) {
|
|
3575
3774
|
setIsHeld(false);
|
|
3576
3775
|
pauseSession();
|
|
@@ -3653,7 +3852,7 @@ function useVoiceTurnContext() {
|
|
|
3653
3852
|
}
|
|
3654
3853
|
|
|
3655
3854
|
// src/hooks/useAdoptionGoals.ts
|
|
3656
|
-
import { useCallback as useCallback11, useEffect as
|
|
3855
|
+
import { useCallback as useCallback11, useEffect as useEffect13, useMemo as useMemo2, useState as useState11 } from "react";
|
|
3657
3856
|
|
|
3658
3857
|
// src/lib/hashMatch.ts
|
|
3659
3858
|
function globToRegExp(pattern) {
|
|
@@ -3721,9 +3920,9 @@ function useAdoptionGoals({
|
|
|
3721
3920
|
bearerToken,
|
|
3722
3921
|
authedFetch
|
|
3723
3922
|
}) {
|
|
3724
|
-
const [candidates, setCandidates] =
|
|
3725
|
-
const [hasResolved, setHasResolved] =
|
|
3726
|
-
const [hash, setHash] =
|
|
3923
|
+
const [candidates, setCandidates] = useState11([]);
|
|
3924
|
+
const [hasResolved, setHasResolved] = useState11(false);
|
|
3925
|
+
const [hash, setHash] = useState11(window.location.hash);
|
|
3727
3926
|
const match = useCallback11(async () => {
|
|
3728
3927
|
try {
|
|
3729
3928
|
const resp = await authedFetch(`${API_URL}/v1/adoption/goals/match`, {
|
|
@@ -3744,7 +3943,7 @@ function useAdoptionGoals({
|
|
|
3744
3943
|
setHasResolved(true);
|
|
3745
3944
|
}
|
|
3746
3945
|
}, [authedFetch]);
|
|
3747
|
-
|
|
3946
|
+
useEffect13(() => {
|
|
3748
3947
|
if (!enabled || !bearerToken) {
|
|
3749
3948
|
setCandidates([]);
|
|
3750
3949
|
setHasResolved(false);
|
|
@@ -3791,7 +3990,7 @@ function useAdoptionGoals({
|
|
|
3791
3990
|
}
|
|
3792
3991
|
|
|
3793
3992
|
// src/hooks/useAuth.ts
|
|
3794
|
-
import { useCallback as useCallback12, useEffect as
|
|
3993
|
+
import { useCallback as useCallback12, useEffect as useEffect14, useState as useState12 } from "react";
|
|
3795
3994
|
var API_URL2 = "https://app.skippr.ai/api";
|
|
3796
3995
|
function storageKey(appKey) {
|
|
3797
3996
|
return `skippr_auth_${appKey}`;
|
|
@@ -3817,14 +4016,14 @@ function clearStoredToken(appKey) {
|
|
|
3817
4016
|
console.error("[Skippr] Failed to clear auth token:", e);
|
|
3818
4017
|
}
|
|
3819
4018
|
}
|
|
3820
|
-
function useAuth({ appKey }) {
|
|
3821
|
-
const [authToken, setAuthToken] =
|
|
3822
|
-
const [isValidating, setIsValidating] =
|
|
3823
|
-
const [hasResolvedStoredToken, setHasResolvedStoredToken] =
|
|
3824
|
-
const [isSubmitting, setIsSubmitting] =
|
|
3825
|
-
const [error, setError] =
|
|
4019
|
+
function useAuth({ appKey, locale }) {
|
|
4020
|
+
const [authToken, setAuthToken] = useState12(null);
|
|
4021
|
+
const [isValidating, setIsValidating] = useState12(false);
|
|
4022
|
+
const [hasResolvedStoredToken, setHasResolvedStoredToken] = useState12(false);
|
|
4023
|
+
const [isSubmitting, setIsSubmitting] = useState12(false);
|
|
4024
|
+
const [error, setError] = useState12("");
|
|
3826
4025
|
const isAuthenticated = authToken !== null;
|
|
3827
|
-
|
|
4026
|
+
useEffect14(() => {
|
|
3828
4027
|
if (!appKey) {
|
|
3829
4028
|
setHasResolvedStoredToken(true);
|
|
3830
4029
|
return;
|
|
@@ -3855,7 +4054,7 @@ function useAuth({ appKey }) {
|
|
|
3855
4054
|
}
|
|
3856
4055
|
validateStoredToken();
|
|
3857
4056
|
}, [appKey]);
|
|
3858
|
-
|
|
4057
|
+
useEffect14(() => {
|
|
3859
4058
|
function handleLogout() {
|
|
3860
4059
|
setAuthToken(null);
|
|
3861
4060
|
setError("");
|
|
@@ -3879,17 +4078,17 @@ function useAuth({ appKey }) {
|
|
|
3879
4078
|
body: JSON.stringify({ email })
|
|
3880
4079
|
});
|
|
3881
4080
|
if (!resp.ok) {
|
|
3882
|
-
|
|
3883
|
-
throw new Error(body.detail || "Failed to send verification code");
|
|
4081
|
+
throw await parseApiError(resp);
|
|
3884
4082
|
}
|
|
3885
4083
|
return true;
|
|
3886
4084
|
} catch (e) {
|
|
3887
|
-
|
|
4085
|
+
console.warn("[Skippr] OTP request failed:", e);
|
|
4086
|
+
setError(resolveErrorMessage("otpRequest" /* OtpRequest */, locale, e));
|
|
3888
4087
|
return false;
|
|
3889
4088
|
} finally {
|
|
3890
4089
|
setIsSubmitting(false);
|
|
3891
4090
|
}
|
|
3892
|
-
}, [appKey]);
|
|
4091
|
+
}, [appKey, locale]);
|
|
3893
4092
|
const verifyOtp = useCallback12(async (email, code, options) => {
|
|
3894
4093
|
if (!appKey)
|
|
3895
4094
|
return;
|
|
@@ -3911,19 +4110,19 @@ function useAuth({ appKey }) {
|
|
|
3911
4110
|
})
|
|
3912
4111
|
});
|
|
3913
4112
|
if (!resp.ok) {
|
|
3914
|
-
|
|
3915
|
-
throw new Error(body.detail || "Invalid or expired verification code");
|
|
4113
|
+
throw await parseApiError(resp);
|
|
3916
4114
|
}
|
|
3917
4115
|
const { token } = await resp.json();
|
|
3918
4116
|
setStoredToken(appKey, token);
|
|
3919
4117
|
setAuthToken(token);
|
|
3920
4118
|
} catch (e) {
|
|
3921
|
-
|
|
4119
|
+
console.warn("[Skippr] OTP verification failed:", e);
|
|
4120
|
+
setError(resolveErrorMessage("otpVerify" /* OtpVerify */, locale, e));
|
|
3922
4121
|
return;
|
|
3923
4122
|
} finally {
|
|
3924
4123
|
setIsSubmitting(false);
|
|
3925
4124
|
}
|
|
3926
|
-
}, [appKey]);
|
|
4125
|
+
}, [appKey, locale]);
|
|
3927
4126
|
const logout = useCallback12(async () => {
|
|
3928
4127
|
const token = authToken;
|
|
3929
4128
|
if (appKey)
|
|
@@ -3956,7 +4155,7 @@ function useAuth({ appKey }) {
|
|
|
3956
4155
|
}
|
|
3957
4156
|
|
|
3958
4157
|
// src/hooks/useAutoStart.ts
|
|
3959
|
-
import { useEffect as
|
|
4158
|
+
import { useEffect as useEffect15, useMemo as useMemo3, useRef as useRef12 } from "react";
|
|
3960
4159
|
|
|
3961
4160
|
// src/lib/agentMode.ts
|
|
3962
4161
|
var AGENT_MODE = {
|
|
@@ -4046,7 +4245,7 @@ function useAutoStart({
|
|
|
4046
4245
|
const state = getModuleSessionState(m.currentSession, m.mode);
|
|
4047
4246
|
return state !== "completed" && state !== "expired";
|
|
4048
4247
|
}) ?? null, [availableModules]);
|
|
4049
|
-
|
|
4248
|
+
useEffect15(() => {
|
|
4050
4249
|
if (!autoStartModule || hasAutoStartedRef.current)
|
|
4051
4250
|
return;
|
|
4052
4251
|
if (suppressed || !bearerToken)
|
|
@@ -4078,7 +4277,7 @@ function useAutoStart({
|
|
|
4078
4277
|
}
|
|
4079
4278
|
|
|
4080
4279
|
// src/hooks/useAvailableModules.ts
|
|
4081
|
-
import { useCallback as useCallback13, useEffect as
|
|
4280
|
+
import { useCallback as useCallback13, useEffect as useEffect16, useRef as useRef13, useState as useState13 } from "react";
|
|
4082
4281
|
var EMPTY_DEFAULT = { agentId: null, sessionId: null };
|
|
4083
4282
|
var API_URL3 = "https://app.skippr.ai/api";
|
|
4084
4283
|
function useAvailableModules({
|
|
@@ -4088,13 +4287,13 @@ function useAvailableModules({
|
|
|
4088
4287
|
agentId,
|
|
4089
4288
|
locale
|
|
4090
4289
|
}) {
|
|
4091
|
-
const [modules, setModules] =
|
|
4092
|
-
const [defaultSelection, setDefaultSelection] =
|
|
4093
|
-
const [appearance, setAppearance] =
|
|
4094
|
-
const [splashOverlayOptedOut, setSplashOverlayOptedOut] =
|
|
4095
|
-
const [isLoading, setIsLoading] =
|
|
4096
|
-
const [hasResolved, setHasResolved] =
|
|
4097
|
-
const [error, setError] =
|
|
4290
|
+
const [modules, setModules] = useState13([]);
|
|
4291
|
+
const [defaultSelection, setDefaultSelection] = useState13(EMPTY_DEFAULT);
|
|
4292
|
+
const [appearance, setAppearance] = useState13(null);
|
|
4293
|
+
const [splashOverlayOptedOut, setSplashOverlayOptedOut] = useState13(false);
|
|
4294
|
+
const [isLoading, setIsLoading] = useState13(false);
|
|
4295
|
+
const [hasResolved, setHasResolved] = useState13(false);
|
|
4296
|
+
const [error, setError] = useState13(null);
|
|
4098
4297
|
const requestGenRef = useRef13(0);
|
|
4099
4298
|
const fetchModules = useCallback13(async (signal) => {
|
|
4100
4299
|
const gen = ++requestGenRef.current;
|
|
@@ -4113,8 +4312,7 @@ function useAvailableModules({
|
|
|
4113
4312
|
signal: signal ?? null
|
|
4114
4313
|
});
|
|
4115
4314
|
if (!resp.ok) {
|
|
4116
|
-
|
|
4117
|
-
throw new Error(body?.detail || `Failed to load modules: ${resp.status}`);
|
|
4315
|
+
throw await parseApiError(resp);
|
|
4118
4316
|
}
|
|
4119
4317
|
const data = await resp.json();
|
|
4120
4318
|
if (isStale())
|
|
@@ -4126,7 +4324,8 @@ function useAvailableModules({
|
|
|
4126
4324
|
} catch (e) {
|
|
4127
4325
|
if (isStale())
|
|
4128
4326
|
return;
|
|
4129
|
-
|
|
4327
|
+
console.warn("[Skippr] Module fetch failed:", e);
|
|
4328
|
+
setError(resolveErrorMessage("modules" /* Modules */, locale, e));
|
|
4130
4329
|
} finally {
|
|
4131
4330
|
if (!isStale()) {
|
|
4132
4331
|
setIsLoading(false);
|
|
@@ -4134,14 +4333,14 @@ function useAvailableModules({
|
|
|
4134
4333
|
}
|
|
4135
4334
|
}
|
|
4136
4335
|
}, [authedFetch, agentId, locale]);
|
|
4137
|
-
|
|
4336
|
+
useEffect16(() => {
|
|
4138
4337
|
if (!enabled || !bearerToken)
|
|
4139
4338
|
return;
|
|
4140
4339
|
const controller = new AbortController;
|
|
4141
4340
|
fetchModules(controller.signal);
|
|
4142
4341
|
return () => controller.abort();
|
|
4143
4342
|
}, [enabled, bearerToken, fetchModules]);
|
|
4144
|
-
|
|
4343
|
+
useEffect16(() => () => void requestGenRef.current++, []);
|
|
4145
4344
|
const refetch = useCallback13(() => fetchModules(), [fetchModules]);
|
|
4146
4345
|
return {
|
|
4147
4346
|
modules,
|
|
@@ -4156,10 +4355,10 @@ function useAvailableModules({
|
|
|
4156
4355
|
}
|
|
4157
4356
|
|
|
4158
4357
|
// src/hooks/useOnceTrue.ts
|
|
4159
|
-
import { useEffect as
|
|
4358
|
+
import { useEffect as useEffect17, useState as useState14 } from "react";
|
|
4160
4359
|
function useOnceTrue(value) {
|
|
4161
|
-
const [latched, setLatched] =
|
|
4162
|
-
|
|
4360
|
+
const [latched, setLatched] = useState14(false);
|
|
4361
|
+
useEffect17(() => {
|
|
4163
4362
|
if (value)
|
|
4164
4363
|
setLatched(true);
|
|
4165
4364
|
}, [value]);
|
|
@@ -4172,11 +4371,11 @@ import { useCallback as useCallback14 } from "react";
|
|
|
4172
4371
|
|
|
4173
4372
|
// src/hooks/useAgentState.ts
|
|
4174
4373
|
import { useRemoteParticipants } from "@livekit/components-react/hooks";
|
|
4175
|
-
import { useEffect as
|
|
4374
|
+
import { useEffect as useEffect18, useState as useState15 } from "react";
|
|
4176
4375
|
function useAgentState(attributeKey, parse, initial) {
|
|
4177
|
-
const [value, setValue] =
|
|
4376
|
+
const [value, setValue] = useState15(initial);
|
|
4178
4377
|
const remoteParticipants = useRemoteParticipants();
|
|
4179
|
-
|
|
4378
|
+
useEffect18(() => {
|
|
4180
4379
|
const agentParticipant = remoteParticipants.find((p) => p.attributes?.[attributeKey]);
|
|
4181
4380
|
if (agentParticipant) {
|
|
4182
4381
|
const attr = agentParticipant.attributes?.[attributeKey];
|
|
@@ -4233,7 +4432,7 @@ function usePlanUpdates() {
|
|
|
4233
4432
|
}
|
|
4234
4433
|
|
|
4235
4434
|
// src/hooks/useSession.ts
|
|
4236
|
-
import { useCallback as useCallback15, useEffect as
|
|
4435
|
+
import { useCallback as useCallback15, useEffect as useEffect19, useRef as useRef14, useState as useState16 } from "react";
|
|
4237
4436
|
var API_URL4 = "https://app.skippr.ai/api";
|
|
4238
4437
|
async function fetchSessionMessages(sessionId, authedFetch) {
|
|
4239
4438
|
try {
|
|
@@ -4270,13 +4469,14 @@ async function exchangeForBearerToken(appKey, userToken) {
|
|
|
4270
4469
|
}
|
|
4271
4470
|
});
|
|
4272
4471
|
if (!resp.ok) {
|
|
4273
|
-
throw
|
|
4472
|
+
throw await parseApiError(resp);
|
|
4274
4473
|
}
|
|
4275
4474
|
const { token, expiresAt } = await resp.json();
|
|
4276
4475
|
return { token, expiresAt: new Date(expiresAt).getTime() };
|
|
4277
4476
|
}
|
|
4278
4477
|
function useSession({
|
|
4279
4478
|
captureMode = DEFAULT_CAPTURE_MODE,
|
|
4479
|
+
locale,
|
|
4280
4480
|
authToken,
|
|
4281
4481
|
appKey,
|
|
4282
4482
|
getUserToken,
|
|
@@ -4286,20 +4486,26 @@ function useSession({
|
|
|
4286
4486
|
onStartError,
|
|
4287
4487
|
onDisconnect
|
|
4288
4488
|
}) {
|
|
4289
|
-
const [connection, setConnection] =
|
|
4290
|
-
const [shouldConnect, setShouldConnect] =
|
|
4291
|
-
const [isStarting, setIsStarting] =
|
|
4292
|
-
const [isDisconnecting, setIsDisconnecting] =
|
|
4293
|
-
const [error,
|
|
4294
|
-
const [
|
|
4295
|
-
const [
|
|
4296
|
-
const
|
|
4297
|
-
|
|
4298
|
-
|
|
4299
|
-
|
|
4300
|
-
|
|
4301
|
-
const [
|
|
4302
|
-
const [
|
|
4489
|
+
const [connection, setConnection] = useState16(null);
|
|
4490
|
+
const [shouldConnect, setShouldConnect] = useState16(false);
|
|
4491
|
+
const [isStarting, setIsStarting] = useState16(false);
|
|
4492
|
+
const [isDisconnecting, setIsDisconnecting] = useState16(false);
|
|
4493
|
+
const [error, setErrorMessage] = useState16("");
|
|
4494
|
+
const [errorSeq, setErrorSeq] = useState16(0);
|
|
4495
|
+
const [errorCode, setErrorCode] = useState16(null);
|
|
4496
|
+
const setError = useCallback15((message) => {
|
|
4497
|
+
setErrorMessage(message);
|
|
4498
|
+
if (message)
|
|
4499
|
+
setErrorSeq((reported) => reported + 1);
|
|
4500
|
+
}, []);
|
|
4501
|
+
const [sessionId, setSessionId] = useState16(null);
|
|
4502
|
+
const [bearerToken, setBearerToken] = useState16(authToken ?? null);
|
|
4503
|
+
const [pendingScreenStream, setPendingScreenStream] = useState16(null);
|
|
4504
|
+
const [isPaused, setIsPaused] = useState16(false);
|
|
4505
|
+
const [isPausing, setIsPausing] = useState16(false);
|
|
4506
|
+
const [pauseTimeoutSeconds, setPauseTimeoutSeconds] = useState16(null);
|
|
4507
|
+
const [historyMessages, setHistoryMessages] = useState16([]);
|
|
4508
|
+
const [authFailed, setAuthFailed] = useState16(false);
|
|
4303
4509
|
const tokenRef = useRef14(authToken ? { token: authToken, expiresAt: null } : null);
|
|
4304
4510
|
const getUserTokenRef = useRef14(getUserToken);
|
|
4305
4511
|
getUserTokenRef.current = getUserToken ?? (userToken ? () => Promise.resolve(userToken) : undefined);
|
|
@@ -4380,7 +4586,7 @@ function useSession({
|
|
|
4380
4586
|
setAuthFailed(false);
|
|
4381
4587
|
return resp;
|
|
4382
4588
|
}, [canExchange, getValidBearer, reExchange]);
|
|
4383
|
-
|
|
4589
|
+
useEffect19(() => {
|
|
4384
4590
|
let stale = false;
|
|
4385
4591
|
if (authToken) {
|
|
4386
4592
|
tokenRef.current = { token: authToken, expiresAt: null };
|
|
@@ -4391,7 +4597,8 @@ function useSession({
|
|
|
4391
4597
|
reExchange().catch((e) => {
|
|
4392
4598
|
if (stale)
|
|
4393
4599
|
return;
|
|
4394
|
-
|
|
4600
|
+
console.warn("[Skippr] Token exchange failed:", e);
|
|
4601
|
+
setError(resolveErrorMessage("auth" /* Auth */, locale, e));
|
|
4395
4602
|
setAuthFailed(true);
|
|
4396
4603
|
});
|
|
4397
4604
|
return () => {
|
|
@@ -4403,7 +4610,7 @@ function useSession({
|
|
|
4403
4610
|
return () => {
|
|
4404
4611
|
stale = true;
|
|
4405
4612
|
};
|
|
4406
|
-
}, [authToken, canExchange, reExchange]);
|
|
4613
|
+
}, [authToken, canExchange, reExchange, locale, setError]);
|
|
4407
4614
|
const isStartingRef = useRef14(false);
|
|
4408
4615
|
const armedScreenStreamRef = useRef14(null);
|
|
4409
4616
|
const armScreenStream = useCallback15((stream) => {
|
|
@@ -4411,7 +4618,7 @@ function useSession({
|
|
|
4411
4618
|
}, []);
|
|
4412
4619
|
const pauseOnUnloadRef = useRef14(null);
|
|
4413
4620
|
pauseOnUnloadRef.current = connection !== null && !isPaused && sessionId && bearerToken ? { sessionId, bearerToken } : null;
|
|
4414
|
-
|
|
4621
|
+
useEffect19(() => {
|
|
4415
4622
|
const onPageHide = () => {
|
|
4416
4623
|
const pending = pauseOnUnloadRef.current;
|
|
4417
4624
|
if (!pending)
|
|
@@ -4428,6 +4635,7 @@ function useSession({
|
|
|
4428
4635
|
}, []);
|
|
4429
4636
|
const startSession = useCallback15(async ({
|
|
4430
4637
|
agentId,
|
|
4638
|
+
agentName,
|
|
4431
4639
|
agentControls,
|
|
4432
4640
|
existingSessionId,
|
|
4433
4641
|
adoptionGoalId,
|
|
@@ -4435,18 +4643,20 @@ function useSession({
|
|
|
4435
4643
|
}) => {
|
|
4436
4644
|
if (isStartingRef.current)
|
|
4437
4645
|
return;
|
|
4646
|
+
setError("");
|
|
4647
|
+
setErrorCode(null);
|
|
4438
4648
|
if (!bearerToken) {
|
|
4439
|
-
|
|
4649
|
+
console.warn("[Skippr] Session start blocked: no auth token available");
|
|
4650
|
+
setError(resolveErrorMessage("sessionStart" /* SessionStart */, locale));
|
|
4440
4651
|
return;
|
|
4441
4652
|
}
|
|
4442
4653
|
if (!agentId && !existingSessionId) {
|
|
4443
|
-
|
|
4654
|
+
console.warn("[Skippr] Session start blocked: no agent selected");
|
|
4655
|
+
setError(resolveErrorMessage("sessionStart" /* SessionStart */, locale));
|
|
4444
4656
|
return;
|
|
4445
4657
|
}
|
|
4446
4658
|
isStartingRef.current = true;
|
|
4447
4659
|
setIsStarting(true);
|
|
4448
|
-
setError("");
|
|
4449
|
-
setErrorCode(null);
|
|
4450
4660
|
onStart?.();
|
|
4451
4661
|
let screenStream = null;
|
|
4452
4662
|
if (captureMode === CAPTURE_MODE.Screenshare) {
|
|
@@ -4482,9 +4692,7 @@ function useSession({
|
|
|
4482
4692
|
})
|
|
4483
4693
|
});
|
|
4484
4694
|
if (!createResp.ok) {
|
|
4485
|
-
|
|
4486
|
-
setErrorCode(createResp.status);
|
|
4487
|
-
throw new Error(body?.detail || `Failed to create session: ${createResp.status}`);
|
|
4695
|
+
throw await parseApiError(createResp);
|
|
4488
4696
|
}
|
|
4489
4697
|
const { session: session2 } = await createResp.json();
|
|
4490
4698
|
resolvedSessionId = session2.id;
|
|
@@ -4501,9 +4709,7 @@ function useSession({
|
|
|
4501
4709
|
})
|
|
4502
4710
|
});
|
|
4503
4711
|
if (!startResp.ok) {
|
|
4504
|
-
|
|
4505
|
-
setErrorCode(startResp.status);
|
|
4506
|
-
throw new Error(body?.detail || `Failed to start session: ${startResp.status}`);
|
|
4712
|
+
throw await parseApiError(startResp);
|
|
4507
4713
|
}
|
|
4508
4714
|
const {
|
|
4509
4715
|
session,
|
|
@@ -4523,27 +4729,31 @@ function useSession({
|
|
|
4523
4729
|
setPauseTimeoutSeconds(typeof pauseTimeout === "number" ? pauseTimeout : null);
|
|
4524
4730
|
} catch (e) {
|
|
4525
4731
|
stopStream(screenStream);
|
|
4526
|
-
|
|
4732
|
+
console.warn("[Skippr] Session start failed:", e);
|
|
4733
|
+
if (e instanceof ApiError)
|
|
4734
|
+
setErrorCode(e.status);
|
|
4735
|
+
setError(resolveErrorMessage("sessionStart" /* SessionStart */, locale, e, agentName));
|
|
4527
4736
|
onStartError?.();
|
|
4528
4737
|
} finally {
|
|
4529
4738
|
isStartingRef.current = false;
|
|
4530
4739
|
setIsStarting(false);
|
|
4531
4740
|
}
|
|
4532
|
-
}, [captureMode, bearerToken, authedFetch, onStart, onStartError, userContext]);
|
|
4741
|
+
}, [captureMode, locale, bearerToken, authedFetch, onStart, onStartError, userContext, setError]);
|
|
4533
4742
|
const pauseSession = useCallback15(async () => {
|
|
4534
4743
|
if (!sessionId || !bearerToken)
|
|
4535
4744
|
return;
|
|
4536
4745
|
setIsPausing(true);
|
|
4746
|
+
setError("");
|
|
4537
4747
|
try {
|
|
4538
4748
|
const resp = await authedFetch(`${API_URL4}/v1/sessions/${sessionId}/pause`, {
|
|
4539
4749
|
method: "POST"
|
|
4540
4750
|
});
|
|
4541
4751
|
if (!resp.ok) {
|
|
4542
|
-
|
|
4543
|
-
throw new Error(body?.detail || `Failed to pause: ${resp.status}`);
|
|
4752
|
+
throw await parseApiError(resp);
|
|
4544
4753
|
}
|
|
4545
4754
|
} catch (e) {
|
|
4546
|
-
|
|
4755
|
+
console.warn("[Skippr] Session pause failed:", e);
|
|
4756
|
+
setError(resolveErrorMessage("sessionPause" /* SessionPause */, locale, e));
|
|
4547
4757
|
setIsPausing(false);
|
|
4548
4758
|
return;
|
|
4549
4759
|
}
|
|
@@ -4555,7 +4765,7 @@ function useSession({
|
|
|
4555
4765
|
setHistoryMessages(history2);
|
|
4556
4766
|
setIsPaused(true);
|
|
4557
4767
|
setIsPausing(false);
|
|
4558
|
-
}, [sessionId, bearerToken, authedFetch, pendingScreenStream]);
|
|
4768
|
+
}, [sessionId, bearerToken, authedFetch, pendingScreenStream, locale, setError]);
|
|
4559
4769
|
const disconnect = useCallback15(async () => {
|
|
4560
4770
|
setIsDisconnecting(true);
|
|
4561
4771
|
try {
|
|
@@ -4578,13 +4788,14 @@ function useSession({
|
|
|
4578
4788
|
} finally {
|
|
4579
4789
|
setIsDisconnecting(false);
|
|
4580
4790
|
}
|
|
4581
|
-
}, [sessionId, bearerToken, authedFetch, pendingScreenStream, onDisconnect]);
|
|
4791
|
+
}, [sessionId, bearerToken, authedFetch, pendingScreenStream, onDisconnect, setError]);
|
|
4582
4792
|
return {
|
|
4583
4793
|
connection,
|
|
4584
4794
|
shouldConnect,
|
|
4585
4795
|
isStarting,
|
|
4586
4796
|
isDisconnecting,
|
|
4587
4797
|
error,
|
|
4798
|
+
errorSeq,
|
|
4588
4799
|
errorCode,
|
|
4589
4800
|
startSession,
|
|
4590
4801
|
pauseSession,
|
|
@@ -4602,7 +4813,7 @@ function useSession({
|
|
|
4602
4813
|
}
|
|
4603
4814
|
|
|
4604
4815
|
// src/hooks/useSessionHistory.ts
|
|
4605
|
-
import { useEffect as
|
|
4816
|
+
import { useEffect as useEffect20, useState as useState17 } from "react";
|
|
4606
4817
|
var API_URL5 = "https://app.skippr.ai/api";
|
|
4607
4818
|
var EMPTY = { messages: [], phases: [] };
|
|
4608
4819
|
function useSessionHistory({
|
|
@@ -4610,11 +4821,11 @@ function useSessionHistory({
|
|
|
4610
4821
|
enabled,
|
|
4611
4822
|
authedFetch
|
|
4612
4823
|
}) {
|
|
4613
|
-
const [history2, setHistory] =
|
|
4614
|
-
const [loadedAgentId, setLoadedAgentId] =
|
|
4824
|
+
const [history2, setHistory] = useState17(EMPTY);
|
|
4825
|
+
const [loadedAgentId, setLoadedAgentId] = useState17(null);
|
|
4615
4826
|
const activeAgentId = enabled && agentId ? agentId : null;
|
|
4616
4827
|
const isLoading = activeAgentId !== null && activeAgentId !== loadedAgentId;
|
|
4617
|
-
|
|
4828
|
+
useEffect20(() => {
|
|
4618
4829
|
if (!enabled || !agentId) {
|
|
4619
4830
|
setHistory(EMPTY);
|
|
4620
4831
|
setLoadedAgentId(null);
|
|
@@ -4651,14 +4862,14 @@ function useSessionHistory({
|
|
|
4651
4862
|
}
|
|
4652
4863
|
|
|
4653
4864
|
// src/hooks/useSplashMedia.ts
|
|
4654
|
-
import { useCallback as useCallback16, useEffect as
|
|
4865
|
+
import { useCallback as useCallback16, useEffect as useEffect21, useMemo as useMemo4, useRef as useRef15, useState as useState18 } from "react";
|
|
4655
4866
|
function useSplashMedia({
|
|
4656
4867
|
armScreenStream,
|
|
4657
4868
|
isSplashVisible,
|
|
4658
4869
|
isSessionLive
|
|
4659
4870
|
}) {
|
|
4660
|
-
const [micEnabled, setMicEnabled] =
|
|
4661
|
-
const [screenEnabled, setScreenEnabled] =
|
|
4871
|
+
const [micEnabled, setMicEnabled] = useState18(false);
|
|
4872
|
+
const [screenEnabled, setScreenEnabled] = useState18(false);
|
|
4662
4873
|
const heldScreenStreamRef = useRef15(null);
|
|
4663
4874
|
const screenRequestInFlightRef = useRef15(false);
|
|
4664
4875
|
const isStagingRef = useRef15(false);
|
|
@@ -4676,7 +4887,7 @@ function useSplashMedia({
|
|
|
4676
4887
|
setMicEnabled(true);
|
|
4677
4888
|
})();
|
|
4678
4889
|
}, []);
|
|
4679
|
-
|
|
4890
|
+
useEffect21(() => {
|
|
4680
4891
|
let cancelled = false;
|
|
4681
4892
|
(async () => {
|
|
4682
4893
|
if (!navigator.permissions?.query)
|
|
@@ -4732,10 +4943,10 @@ function useSplashMedia({
|
|
|
4732
4943
|
})();
|
|
4733
4944
|
}, [armScreenStream, releaseScreen]);
|
|
4734
4945
|
const isStaging = isSplashVisible && !isSessionLive;
|
|
4735
|
-
|
|
4946
|
+
useEffect21(() => {
|
|
4736
4947
|
isStagingRef.current = isStaging;
|
|
4737
4948
|
}, [isStaging]);
|
|
4738
|
-
|
|
4949
|
+
useEffect21(() => {
|
|
4739
4950
|
if (isSessionLive) {
|
|
4740
4951
|
heldScreenStreamRef.current = null;
|
|
4741
4952
|
setScreenEnabled(false);
|
|
@@ -4748,10 +4959,10 @@ function useSplashMedia({
|
|
|
4748
4959
|
}
|
|
4749
4960
|
|
|
4750
4961
|
// src/hooks/useSplashOverlayOptOut.ts
|
|
4751
|
-
import { useCallback as useCallback17, useState as
|
|
4962
|
+
import { useCallback as useCallback17, useState as useState19 } from "react";
|
|
4752
4963
|
var API_URL6 = "https://app.skippr.ai/api";
|
|
4753
4964
|
function useSplashOverlayOptOut(authedFetch, recordedForUser) {
|
|
4754
|
-
const [recordedLocally, setRecordedLocally] =
|
|
4965
|
+
const [recordedLocally, setRecordedLocally] = useState19(false);
|
|
4755
4966
|
const optOut = useCallback17(() => {
|
|
4756
4967
|
setRecordedLocally(true);
|
|
4757
4968
|
authedFetch(`${API_URL6}/v1/users/splash-opt-out`, { method: "POST" }).catch((e) => console.warn("[Skippr] splash overlay opt-out failed", e));
|
|
@@ -4966,7 +5177,7 @@ function dockStyleFlush(dock) {
|
|
|
4966
5177
|
}
|
|
4967
5178
|
|
|
4968
5179
|
// src/components/AgentCursor.tsx
|
|
4969
|
-
import { useContext as useContext8, useEffect as
|
|
5180
|
+
import { useContext as useContext8, useEffect as useEffect22, useLayoutEffect, useRef as useRef16, useState as useState20 } from "react";
|
|
4970
5181
|
|
|
4971
5182
|
// src/capture/elementRef.ts
|
|
4972
5183
|
function safeGetIframeDocument(iframe) {
|
|
@@ -5180,12 +5391,12 @@ function AgentCursor({
|
|
|
5180
5391
|
animated = false
|
|
5181
5392
|
}) {
|
|
5182
5393
|
const ctx = useContext8(LiveAgentContext);
|
|
5183
|
-
const [cursor, setCursor] =
|
|
5184
|
-
const [glideMs, setGlideMs] =
|
|
5185
|
-
const [phase, setPhase] =
|
|
5186
|
-
const [ringBox, setRingBox] =
|
|
5187
|
-
const [clickPulse, setClickPulse] =
|
|
5188
|
-
const [measuredLabelWidth, setMeasuredLabelWidth] =
|
|
5394
|
+
const [cursor, setCursor] = useState20(null);
|
|
5395
|
+
const [glideMs, setGlideMs] = useState20(0);
|
|
5396
|
+
const [phase, setPhase] = useState20("idle");
|
|
5397
|
+
const [ringBox, setRingBox] = useState20(null);
|
|
5398
|
+
const [clickPulse, setClickPulse] = useState20(0);
|
|
5399
|
+
const [measuredLabelWidth, setMeasuredLabelWidth] = useState20(0);
|
|
5189
5400
|
const labelRef = useRef16(null);
|
|
5190
5401
|
const cursorElRef = useRef16(null);
|
|
5191
5402
|
const pathRef = useRef16(null);
|
|
@@ -5309,7 +5520,7 @@ function AgentCursor({
|
|
|
5309
5520
|
});
|
|
5310
5521
|
return cancelAnimation;
|
|
5311
5522
|
}, [target, animated]);
|
|
5312
|
-
|
|
5523
|
+
useEffect22(() => {
|
|
5313
5524
|
if (!target || target.kind === "gesture" || phase === "idle")
|
|
5314
5525
|
return;
|
|
5315
5526
|
const track = () => {
|
|
@@ -5349,7 +5560,7 @@ function AgentCursor({
|
|
|
5349
5560
|
setMeasuredLabelWidth(renderedLabelWidth);
|
|
5350
5561
|
}
|
|
5351
5562
|
}, [phase, measuredLabelWidth, target?.label]);
|
|
5352
|
-
|
|
5563
|
+
useEffect22(() => {
|
|
5353
5564
|
return () => {
|
|
5354
5565
|
traceRef.current?.cancel();
|
|
5355
5566
|
for (const t of timersRef.current)
|
|
@@ -5449,7 +5660,7 @@ function AgentCursor({
|
|
|
5449
5660
|
// src/components/AutoStartMedia.tsx
|
|
5450
5661
|
import { useConnectionState, useLocalParticipant as useLocalParticipant4 } from "@livekit/components-react/hooks";
|
|
5451
5662
|
import { ConnectionState, Track as Track2 } from "livekit-client";
|
|
5452
|
-
import { useEffect as
|
|
5663
|
+
import { useEffect as useEffect23, useRef as useRef17 } from "react";
|
|
5453
5664
|
function AutoStartMedia({
|
|
5454
5665
|
pendingScreenStream,
|
|
5455
5666
|
pushOrTapMicMode = false,
|
|
@@ -5458,7 +5669,7 @@ function AutoStartMedia({
|
|
|
5458
5669
|
const { localParticipant } = useLocalParticipant4();
|
|
5459
5670
|
const connectionState = useConnectionState();
|
|
5460
5671
|
const didStartRef = useRef17(false);
|
|
5461
|
-
|
|
5672
|
+
useEffect23(() => {
|
|
5462
5673
|
if (didStartRef.current)
|
|
5463
5674
|
return;
|
|
5464
5675
|
if (connectionState !== ConnectionState.Connected)
|
|
@@ -5485,7 +5696,7 @@ function AutoStartMedia({
|
|
|
5485
5696
|
// src/components/DomCapture.tsx
|
|
5486
5697
|
import { useConnectionState as useConnectionState2, useLocalParticipant as useLocalParticipant5 } from "@livekit/components-react/hooks";
|
|
5487
5698
|
import { ConnectionState as ConnectionState2, ScreenSharePresets as ScreenSharePresets2, Track as Track3 } from "livekit-client";
|
|
5488
|
-
import { useContext as useContext9, useEffect as
|
|
5699
|
+
import { useContext as useContext9, useEffect as useEffect24, useMemo as useMemo5, useRef as useRef18 } from "react";
|
|
5489
5700
|
|
|
5490
5701
|
// src/capture/a11yUtils.ts
|
|
5491
5702
|
var ROLE_BY_TAG = {
|
|
@@ -6718,7 +6929,7 @@ function DomCapture({ pushOrTapMicMode = false, startMuted = false }) {
|
|
|
6718
6929
|
const pausedRef = useRef18(false);
|
|
6719
6930
|
const freezeCaptureRef = useRef18(null);
|
|
6720
6931
|
const resumeCaptureRef = useRef18(null);
|
|
6721
|
-
|
|
6932
|
+
useEffect24(() => {
|
|
6722
6933
|
if (didStartRef.current)
|
|
6723
6934
|
return;
|
|
6724
6935
|
if (connectionState !== ConnectionState2.Connected)
|
|
@@ -6955,7 +7166,7 @@ function DomCapture({ pushOrTapMicMode = false, startMuted = false }) {
|
|
|
6955
7166
|
track.stop();
|
|
6956
7167
|
};
|
|
6957
7168
|
}, [connectionState, localParticipant, pushOrTapMicMode, startMuted, clearPausedCaptureRef]);
|
|
6958
|
-
|
|
7169
|
+
useEffect24(() => {
|
|
6959
7170
|
if (isHeld) {
|
|
6960
7171
|
freezeCaptureRef.current?.();
|
|
6961
7172
|
} else {
|
|
@@ -6967,8 +7178,9 @@ function DomCapture({ pushOrTapMicMode = false, startMuted = false }) {
|
|
|
6967
7178
|
|
|
6968
7179
|
// src/components/HighlightOverlay.tsx
|
|
6969
7180
|
import { useDataChannel } from "@livekit/components-react/hooks";
|
|
6970
|
-
import { useCallback as useCallback18, useEffect as
|
|
7181
|
+
import { useCallback as useCallback18, useEffect as useEffect25, useRef as useRef19 } from "react";
|
|
6971
7182
|
var HIGHLIGHT_AUTO_CLEAR_MS = 25000;
|
|
7183
|
+
var HIGHLIGHT_RETARGET_INTERVAL_MS = 250;
|
|
6972
7184
|
var textDecoder = new TextDecoder;
|
|
6973
7185
|
function parseHighlightMessage(payload) {
|
|
6974
7186
|
try {
|
|
@@ -6991,12 +7203,14 @@ function parseHighlightMessage(payload) {
|
|
|
6991
7203
|
}
|
|
6992
7204
|
function HighlightOverlay() {
|
|
6993
7205
|
const targetRef = useRef19(null);
|
|
7206
|
+
const shownRef = useRef19(null);
|
|
6994
7207
|
const autoClearRef = useRef19(null);
|
|
6995
7208
|
const clear = useCallback18(() => {
|
|
6996
7209
|
if (autoClearRef.current)
|
|
6997
7210
|
clearTimeout(autoClearRef.current);
|
|
6998
7211
|
autoClearRef.current = null;
|
|
6999
7212
|
targetRef.current = null;
|
|
7213
|
+
shownRef.current = null;
|
|
7000
7214
|
clearCursorTarget("guide");
|
|
7001
7215
|
setHighlightActive(false);
|
|
7002
7216
|
}, []);
|
|
@@ -7016,6 +7230,7 @@ function HighlightOverlay() {
|
|
|
7016
7230
|
if (autoClearRef.current)
|
|
7017
7231
|
clearTimeout(autoClearRef.current);
|
|
7018
7232
|
targetRef.current = element;
|
|
7233
|
+
shownRef.current = parsed;
|
|
7019
7234
|
setCursorTarget("guide", {
|
|
7020
7235
|
element,
|
|
7021
7236
|
label: parsed.message || "Click here",
|
|
@@ -7025,8 +7240,28 @@ function HighlightOverlay() {
|
|
|
7025
7240
|
autoClearRef.current = setTimeout(clear, HIGHLIGHT_AUTO_CLEAR_MS);
|
|
7026
7241
|
}, [clear]);
|
|
7027
7242
|
useDataChannel(HIGHLIGHT_TOPIC, onHighlightMessage);
|
|
7028
|
-
|
|
7029
|
-
|
|
7243
|
+
useEffect25(() => onHighlightCleared(clear), [clear]);
|
|
7244
|
+
useEffect25(() => {
|
|
7245
|
+
const timer = setInterval(() => {
|
|
7246
|
+
const shown = shownRef.current;
|
|
7247
|
+
const target = targetRef.current;
|
|
7248
|
+
if (!shown || !target || target.isConnected)
|
|
7249
|
+
return;
|
|
7250
|
+
const replacement = findElementByRef(shown.ref);
|
|
7251
|
+
if (!replacement) {
|
|
7252
|
+
clear();
|
|
7253
|
+
return;
|
|
7254
|
+
}
|
|
7255
|
+
targetRef.current = replacement;
|
|
7256
|
+
setCursorTarget("guide", {
|
|
7257
|
+
element: replacement,
|
|
7258
|
+
label: shown.message || "Click here",
|
|
7259
|
+
mode: "guide"
|
|
7260
|
+
});
|
|
7261
|
+
}, HIGHLIGHT_RETARGET_INTERVAL_MS);
|
|
7262
|
+
return () => clearInterval(timer);
|
|
7263
|
+
}, [clear]);
|
|
7264
|
+
useEffect25(() => {
|
|
7030
7265
|
const onClick = (event) => {
|
|
7031
7266
|
const target = targetRef.current;
|
|
7032
7267
|
const node = event.target;
|
|
@@ -7036,15 +7271,15 @@ function HighlightOverlay() {
|
|
|
7036
7271
|
document.addEventListener("click", onClick, { capture: true });
|
|
7037
7272
|
return () => document.removeEventListener("click", onClick, { capture: true });
|
|
7038
7273
|
}, [clear]);
|
|
7039
|
-
|
|
7274
|
+
useEffect25(() => clear, [clear]);
|
|
7040
7275
|
return null;
|
|
7041
7276
|
}
|
|
7042
7277
|
|
|
7043
7278
|
// src/components/MinimizedBubble.tsx
|
|
7044
|
-
import { useContext as useContext10, useEffect as
|
|
7279
|
+
import { useContext as useContext10, useEffect as useEffect27, useRef as useRef21, useState as useState21 } from "react";
|
|
7045
7280
|
|
|
7046
7281
|
// src/hooks/useLauncherDrag.ts
|
|
7047
|
-
import { useEffect as
|
|
7282
|
+
import { useEffect as useEffect26, useRef as useRef20 } from "react";
|
|
7048
7283
|
import { flushSync } from "react-dom";
|
|
7049
7284
|
var DRAG_THRESHOLD_PX = 5;
|
|
7050
7285
|
function useLauncherDrag(containerRef, onDrop, followRefs, reportDragging, enabled = true) {
|
|
@@ -7055,7 +7290,7 @@ function useLauncherDrag(containerRef, onDrop, followRefs, reportDragging, enabl
|
|
|
7055
7290
|
followTargetsRef.current = followRefs;
|
|
7056
7291
|
const reportDraggingRef = useRef20(reportDragging);
|
|
7057
7292
|
reportDraggingRef.current = reportDragging;
|
|
7058
|
-
|
|
7293
|
+
useEffect26(() => {
|
|
7059
7294
|
if (!enabled)
|
|
7060
7295
|
return;
|
|
7061
7296
|
const el = containerRef.current;
|
|
@@ -7410,7 +7645,7 @@ function WelcomeBubble({
|
|
|
7410
7645
|
onDismiss,
|
|
7411
7646
|
onClick
|
|
7412
7647
|
}) {
|
|
7413
|
-
|
|
7648
|
+
useEffect27(() => {
|
|
7414
7649
|
const timer = setTimeout(onDismiss, 5000);
|
|
7415
7650
|
return () => clearTimeout(timer);
|
|
7416
7651
|
}, [onDismiss]);
|
|
@@ -7455,14 +7690,14 @@ function MinimizedBubble({
|
|
|
7455
7690
|
commitLauncherDrop,
|
|
7456
7691
|
appearance
|
|
7457
7692
|
} = ctx;
|
|
7458
|
-
const [goalsAutoHidden, setGoalsAutoHidden] =
|
|
7459
|
-
const [isLauncherHovered, setIsLauncherHovered] =
|
|
7460
|
-
const [visitHref, setVisitHref] =
|
|
7693
|
+
const [goalsAutoHidden, setGoalsAutoHidden] = useState21(false);
|
|
7694
|
+
const [isLauncherHovered, setIsLauncherHovered] = useState21(false);
|
|
7695
|
+
const [visitHref, setVisitHref] = useState21(() => window.location.href);
|
|
7461
7696
|
const revealedHrefRef = useRef21(null);
|
|
7462
7697
|
const hoverContainerRef = useRef21(null);
|
|
7463
7698
|
const closeTimerRef = useRef21(null);
|
|
7464
|
-
|
|
7465
|
-
|
|
7699
|
+
useEffect27(() => subscribeToLocationChange(() => setVisitHref(window.location.href)), []);
|
|
7700
|
+
useEffect27(() => {
|
|
7466
7701
|
const el = hoverContainerRef.current;
|
|
7467
7702
|
if (!el)
|
|
7468
7703
|
return;
|
|
@@ -7501,7 +7736,7 @@ function MinimizedBubble({
|
|
|
7501
7736
|
const onboardingModule = pillCandidates.find((module) => module.type === "onboarding");
|
|
7502
7737
|
const modulePills = onboardingModule ? [onboardingModule] : pillCandidates.slice(0, MAX_MODULE_PILLS).reverse();
|
|
7503
7738
|
const goalsEligible = adoptionGoals.length > 0 && !onboardingModule && hasResolvedModules;
|
|
7504
|
-
|
|
7739
|
+
useEffect27(() => {
|
|
7505
7740
|
if (!goalsEligible)
|
|
7506
7741
|
return;
|
|
7507
7742
|
if (revealedHrefRef.current === visitHref) {
|
|
@@ -7515,8 +7750,8 @@ function MinimizedBubble({
|
|
|
7515
7750
|
}, [goalsEligible, visitHref]);
|
|
7516
7751
|
const matchedGoals = goalsEligible ? adoptionGoals.slice(0, MAX_GOAL_BUBBLES) : [];
|
|
7517
7752
|
const goalsHidden = goalsAutoHidden && !isLauncherHovered;
|
|
7518
|
-
const [goalsUnmounted, setGoalsUnmounted] =
|
|
7519
|
-
|
|
7753
|
+
const [goalsUnmounted, setGoalsUnmounted] = useState21(false);
|
|
7754
|
+
useEffect27(() => {
|
|
7520
7755
|
if (!goalsHidden) {
|
|
7521
7756
|
setGoalsUnmounted(false);
|
|
7522
7757
|
return;
|
|
@@ -7601,7 +7836,7 @@ function MinimizedBubble({
|
|
|
7601
7836
|
|
|
7602
7837
|
// src/components/PageActionHandler.tsx
|
|
7603
7838
|
import { useDataChannel as useDataChannel2 } from "@livekit/components-react/hooks";
|
|
7604
|
-
import { useCallback as useCallback19, useEffect as
|
|
7839
|
+
import { useCallback as useCallback19, useEffect as useEffect28, useRef as useRef22 } from "react";
|
|
7605
7840
|
var STEP_MAX_WAIT_MS = 5000;
|
|
7606
7841
|
var POST_ACTION_SETTLE_SNAPSHOT_MS = 300;
|
|
7607
7842
|
var TRAILING_ACTION_FLUSH_AFTER_STOP_MS = 1000;
|
|
@@ -7939,7 +8174,7 @@ function PageActionHandler() {
|
|
|
7939
8174
|
queueRef.current.push(action);
|
|
7940
8175
|
drain();
|
|
7941
8176
|
}, [drain]);
|
|
7942
|
-
|
|
8177
|
+
useEffect28(() => {
|
|
7943
8178
|
mountedRef.current = true;
|
|
7944
8179
|
drainingRef.current = false;
|
|
7945
8180
|
return () => {
|
|
@@ -7951,7 +8186,7 @@ function PageActionHandler() {
|
|
|
7951
8186
|
setActionsBusy(false);
|
|
7952
8187
|
};
|
|
7953
8188
|
}, []);
|
|
7954
|
-
|
|
8189
|
+
useEffect28(() => {
|
|
7955
8190
|
return onActionsStopped(() => {
|
|
7956
8191
|
actionsStoppedRef.current = true;
|
|
7957
8192
|
ignoreActionsArrivingBeforeRef.current = Date.now() + TRAILING_ACTION_FLUSH_AFTER_STOP_MS;
|
|
@@ -7969,17 +8204,17 @@ function PageActionHandler() {
|
|
|
7969
8204
|
}
|
|
7970
8205
|
|
|
7971
8206
|
// src/components/SessionControlBar.tsx
|
|
7972
|
-
import { useCallback as useCallback22, useContext as useContext11, useEffect as
|
|
8207
|
+
import { useCallback as useCallback22, useContext as useContext11, useEffect as useEffect32, useState as useState24 } from "react";
|
|
7973
8208
|
|
|
7974
8209
|
// src/hooks/useActionControl.ts
|
|
7975
8210
|
import { useLocalParticipant as useLocalParticipant6 } from "@livekit/components-react/hooks";
|
|
7976
|
-
import { useCallback as useCallback20, useEffect as
|
|
8211
|
+
import { useCallback as useCallback20, useEffect as useEffect29, useState as useState22 } from "react";
|
|
7977
8212
|
var textEncoder5 = new TextEncoder;
|
|
7978
8213
|
function useActionControl() {
|
|
7979
8214
|
const { localParticipant } = useLocalParticipant6();
|
|
7980
8215
|
const plan = usePlanUpdates();
|
|
7981
|
-
const [busy, setBusy] =
|
|
7982
|
-
|
|
8216
|
+
const [busy, setBusy] = useState22(isActionsBusy);
|
|
8217
|
+
useEffect29(() => subscribeActionsBusy(setBusy), []);
|
|
7983
8218
|
const actionsActive = busy || plan?.state === "executing";
|
|
7984
8219
|
const requestStop = useCallback20(async () => {
|
|
7985
8220
|
stopActions();
|
|
@@ -7996,13 +8231,13 @@ function useActionControl() {
|
|
|
7996
8231
|
}
|
|
7997
8232
|
|
|
7998
8233
|
// src/hooks/useAudioLevelBars.ts
|
|
7999
|
-
import { useEffect as
|
|
8234
|
+
import { useEffect as useEffect30, useRef as useRef23, useState as useState23 } from "react";
|
|
8000
8235
|
var TALKING_LEVEL_THRESHOLD = 0.2;
|
|
8001
8236
|
var TALKING_HOLD_MS = 400;
|
|
8002
8237
|
function useAudioLevelBars(mediaStreamTrack, { barCount, idleHeightPx, maxGrowthPx, noiseGate }) {
|
|
8003
8238
|
const barRefs = useRef23([]);
|
|
8004
|
-
const [isTalking, setIsTalking] =
|
|
8005
|
-
|
|
8239
|
+
const [isTalking, setIsTalking] = useState23(false);
|
|
8240
|
+
useEffect30(() => {
|
|
8006
8241
|
if (!mediaStreamTrack) {
|
|
8007
8242
|
for (const bar of barRefs.current) {
|
|
8008
8243
|
if (bar)
|
|
@@ -8053,7 +8288,7 @@ function useAudioLevelBars(mediaStreamTrack, { barCount, idleHeightPx, maxGrowth
|
|
|
8053
8288
|
}
|
|
8054
8289
|
|
|
8055
8290
|
// src/hooks/useIdleAutoPause.ts
|
|
8056
|
-
import { useCallback as useCallback21, useEffect as
|
|
8291
|
+
import { useCallback as useCallback21, useEffect as useEffect31, useRef as useRef24 } from "react";
|
|
8057
8292
|
function useIdleAutoPause({
|
|
8058
8293
|
enabled,
|
|
8059
8294
|
active,
|
|
@@ -8077,7 +8312,7 @@ function useIdleAutoPause({
|
|
|
8077
8312
|
if (enabled && !isHeld)
|
|
8078
8313
|
armTimer();
|
|
8079
8314
|
}, [enabled, isHeld, armTimer]);
|
|
8080
|
-
|
|
8315
|
+
useEffect31(() => {
|
|
8081
8316
|
if (!enabled || isHeld || active) {
|
|
8082
8317
|
clearTimer();
|
|
8083
8318
|
return;
|
|
@@ -8445,7 +8680,7 @@ function SessionControlBar() {
|
|
|
8445
8680
|
togglePause();
|
|
8446
8681
|
}
|
|
8447
8682
|
});
|
|
8448
|
-
const [pushToTalkHintSeen, setPushToTalkHintSeen] =
|
|
8683
|
+
const [pushToTalkHintSeen, setPushToTalkHintSeen] = useState24(false);
|
|
8449
8684
|
const startPushToTalk = useCallback22(() => {
|
|
8450
8685
|
start();
|
|
8451
8686
|
reportActivity();
|
|
@@ -8463,7 +8698,7 @@ function SessionControlBar() {
|
|
|
8463
8698
|
onCommit: commitPushToTalk,
|
|
8464
8699
|
onKeyUsed: dismissPushToTalkHint
|
|
8465
8700
|
});
|
|
8466
|
-
|
|
8701
|
+
useEffect32(() => {
|
|
8467
8702
|
if (isHeld)
|
|
8468
8703
|
minimizePanel();
|
|
8469
8704
|
}, [isHeld, minimizePanel]);
|
|
@@ -8716,7 +8951,7 @@ function SessionControlBar() {
|
|
|
8716
8951
|
}
|
|
8717
8952
|
|
|
8718
8953
|
// src/components/ShadowHost.tsx
|
|
8719
|
-
import { useLayoutEffect as useLayoutEffect2, useRef as useRef26, useState as
|
|
8954
|
+
import { useLayoutEffect as useLayoutEffect2, useRef as useRef26, useState as useState25 } from "react";
|
|
8720
8955
|
import { createPortal } from "react-dom";
|
|
8721
8956
|
import { jsx as jsx27, Fragment as Fragment3 } from "react/jsx-runtime";
|
|
8722
8957
|
var PROPERTIES_STYLE_ID = "skippr-tw-properties";
|
|
@@ -8738,9 +8973,9 @@ function ShadowHost({
|
|
|
8738
8973
|
className
|
|
8739
8974
|
}) {
|
|
8740
8975
|
const hostRef = useRef26(null);
|
|
8741
|
-
const [shadowRoot, setShadowRoot] =
|
|
8976
|
+
const [shadowRoot, setShadowRoot] = useState25(null);
|
|
8742
8977
|
const css = `/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
|
|
8743
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-outline-style:solid}}}@layer theme{:root,:host{--skippr-font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--skippr-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--skippr-color-red-50:oklch(97.1% .013 17.38);--skippr-color-red-100:oklch(93.6% .032 17.717);--skippr-color-red-200:oklch(88.5% .062 18.334);--skippr-color-red-300:oklch(80.8% .114 19.571);--skippr-color-red-400:oklch(70.4% .191 22.216);--skippr-color-red-500:oklch(63.7% .237 25.331);--skippr-color-red-600:oklch(57.7% .245 27.325);--skippr-color-red-700:oklch(50.5% .213 27.518);--skippr-color-amber-50:oklch(98.7% .022 95.277);--skippr-color-amber-100:oklch(96.2% .059 95.617);--skippr-color-amber-400:oklch(82.8% .189 84.429);--skippr-color-amber-700:oklch(55.5% .163 48.998);--skippr-color-amber-950:oklch(27.9% .077 45.635);--skippr-color-emerald-400:oklch(76.5% .177 163.223);--skippr-color-neutral-100:oklch(97% 0 0);--skippr-color-neutral-200:oklch(92.2% 0 0);--skippr-color-neutral-500:oklch(55.6% 0 0);--skippr-color-neutral-700:oklch(37.1% 0 0);--skippr-color-black:#000;--skippr-color-white:#fff;--skippr-spacing:.25rem;--skippr-text-xs:.75rem;--skippr-text-xs--line-height:calc(1/.75);--skippr-text-sm:.875rem;--skippr-text-sm--line-height:calc(1.25/.875);--skippr-font-weight-medium:500;--skippr-font-weight-semibold:600;--skippr-font-weight-bold:700;--skippr-leading-snug:1.375;--skippr-leading-relaxed:1.625;--skippr-ease-out:cubic-bezier(0,0,.2,1);--skippr-ease-in-out:cubic-bezier(.4,0,.2,1);--skippr-animate-spin:spin 1s linear infinite;--skippr-animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--skippr-animate-bounce:bounce 1s infinite;--skippr-blur-sm:8px;--skippr-default-transition-duration:.15s;--skippr-default-transition-timing-function:cubic-bezier(.4,0,.2,1);--skippr-default-font-family:var(--skippr-font-sans);--skippr-default-mono-font-family:var(--skippr-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--skippr-default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--skippr-default-font-feature-settings,normal);font-variation-settings:var(--skippr-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--skippr-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--skippr-default-mono-font-feature-settings,normal);font-variation-settings:var(--skippr-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.skippr\\:pointer-events-auto{pointer-events:auto}.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-\\[3px\\]{inset:-3px}.skippr\\:inset-0{inset:calc(var(--skippr-spacing)*0)}.skippr\\:inset-y-0{inset-block:calc(var(--skippr-spacing)*0)}.skippr\\:-top-1{top:calc(var(--skippr-spacing)*-1)}.skippr\\:-top-6{top:calc(var(--skippr-spacing)*-6)}.skippr\\:-top-8{top:calc(var(--skippr-spacing)*-8)}.skippr\\:-top-\\[2px\\]{top:-2px}.skippr\\:-top-\\[3px\\]{top:-3px}.skippr\\:-top-\\[13px\\]{top:-13px}.skippr\\:top-0{top:calc(var(--skippr-spacing)*0)}.skippr\\:top-1\\/2{top:50%}.skippr\\:top-\\[8px\\]{top:8px}.skippr\\:top-full{top:100%}.skippr\\:-right-1{right:calc(var(--skippr-spacing)*-1)}.skippr\\:-right-8{right:calc(var(--skippr-spacing)*-8)}.skippr\\:-right-\\[2px\\]{right:-2px}.skippr\\:-right-\\[6px\\]{right:-6px}.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\\:right-\\[4px\\]{right:4px}.skippr\\:right-\\[8px\\]{right:8px}.skippr\\:-bottom-\\[2px\\]{bottom:-2px}.skippr\\:bottom-3{bottom:calc(var(--skippr-spacing)*3)}.skippr\\:bottom-4{bottom:calc(var(--skippr-spacing)*4)}.skippr\\:bottom-20{bottom:calc(var(--skippr-spacing)*20)}.skippr\\:bottom-\\[calc\\(100\\%\\+8px\\)\\]{bottom:calc(100% + 8px)}.skippr\\:bottom-\\[calc\\(100\\%\\+11px\\)\\]{bottom:calc(100% + 11px)}.skippr\\:bottom-full{bottom:100%}.skippr\\:-left-8{left:calc(var(--skippr-spacing)*-8)}.skippr\\:-left-\\[2px\\]{left:-2px}.skippr\\:-left-\\[6px\\]{left:-6px}.skippr\\:left-0{left:calc(var(--skippr-spacing)*0)}.skippr\\:left-1\\/2{left:50%}.skippr\\:left-2{left:calc(var(--skippr-spacing)*2)}.skippr\\:left-3{left:calc(var(--skippr-spacing)*3)}.skippr\\:left-5{left:calc(var(--skippr-spacing)*5)}.skippr\\:left-6{left:calc(var(--skippr-spacing)*6)}.skippr\\:z-10{z-index:10}.skippr\\:z-20{z-index:20}.skippr\\:z-\\[1\\]{z-index:1}.skippr\\:z-\\[2\\]{z-index:2}.skippr\\:z-\\[4\\]{z-index:4}.skippr\\:z-\\[5\\]{z-index:5}.skippr\\:z-\\[6\\]{z-index:6}.skippr\\:z-\\[7\\]{z-index:7}.skippr\\:z-\\[8\\]{z-index:8}.skippr\\:z-\\[9998\\]{z-index:9998}.skippr\\:z-\\[9999\\]{z-index:9999}.skippr\\:z-\\[10000\\]{z-index:10000}.skippr\\:order-first{order:-9999}.skippr\\:order-last{order:9999}.skippr\\:mx-auto{margin-inline:auto}.skippr\\:-mt-1{margin-top:calc(var(--skippr-spacing)*-1)}.skippr\\:-mt-\\[5px\\]{margin-top:-5px}.skippr\\:-mt-\\[27px\\]{margin-top:-27px}.skippr\\:mt-1{margin-top:calc(var(--skippr-spacing)*1)}.skippr\\:mt-1\\.5{margin-top:calc(var(--skippr-spacing)*1.5)}.skippr\\:mt-2{margin-top:calc(var(--skippr-spacing)*2)}.skippr\\:mt-3{margin-top:calc(var(--skippr-spacing)*3)}.skippr\\:mt-3\\.5{margin-top:calc(var(--skippr-spacing)*3.5)}.skippr\\:mt-\\[1px\\]{margin-top:1px}.skippr\\:mt-\\[6px\\]{margin-top:6px}.skippr\\:mt-\\[8px\\]{margin-top:8px}.skippr\\:mt-\\[9px\\]{margin-top:9px}.skippr\\:-mr-1{margin-right:calc(var(--skippr-spacing)*-1)}.skippr\\:mr-7{margin-right:calc(var(--skippr-spacing)*7)}.skippr\\:mr-\\[22px\\]{margin-right:22px}.skippr\\:-mb-\\[5px\\]{margin-bottom:-5px}.skippr\\:mb-1{margin-bottom:calc(var(--skippr-spacing)*1)}.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\\:mb-\\[14px\\]{margin-bottom:14px}.skippr\\:-ml-\\[2px\\]{margin-left:-2px}.skippr\\:ml-0\\.5{margin-left:calc(var(--skippr-spacing)*.5)}.skippr\\:ml-1{margin-left:calc(var(--skippr-spacing)*1)}.skippr\\:ml-7{margin-left:calc(var(--skippr-spacing)*7)}.skippr\\:ml-auto{margin-left:auto}.skippr\\:line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.skippr\\:block{display:block}.skippr\\:flex{display:flex}.skippr\\:hidden{display:none}.skippr\\:inline-flex{display:inline-flex}.skippr\\:size-1{width:calc(var(--skippr-spacing)*1);height:calc(var(--skippr-spacing)*1)}.skippr\\:size-1\\.5{width:calc(var(--skippr-spacing)*1.5);height:calc(var(--skippr-spacing)*1.5)}.skippr\\:size-2{width:calc(var(--skippr-spacing)*2);height:calc(var(--skippr-spacing)*2)}.skippr\\:size-2\\.5{width:calc(var(--skippr-spacing)*2.5);height:calc(var(--skippr-spacing)*2.5)}.skippr\\:size-3{width:calc(var(--skippr-spacing)*3);height:calc(var(--skippr-spacing)*3)}.skippr\\:size-3\\.5{width:calc(var(--skippr-spacing)*3.5);height:calc(var(--skippr-spacing)*3.5)}.skippr\\:size-4{width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}.skippr\\:size-5{width:calc(var(--skippr-spacing)*5);height:calc(var(--skippr-spacing)*5)}.skippr\\:size-6{width:calc(var(--skippr-spacing)*6);height:calc(var(--skippr-spacing)*6)}.skippr\\:size-7{width:calc(var(--skippr-spacing)*7);height:calc(var(--skippr-spacing)*7)}.skippr\\:size-8{width:calc(var(--skippr-spacing)*8);height:calc(var(--skippr-spacing)*8)}.skippr\\:size-9{width:calc(var(--skippr-spacing)*9);height:calc(var(--skippr-spacing)*9)}.skippr\\:size-10{width:calc(var(--skippr-spacing)*10);height:calc(var(--skippr-spacing)*10)}.skippr\\:size-12{width:calc(var(--skippr-spacing)*12);height:calc(var(--skippr-spacing)*12)}.skippr\\:size-\\[3px\\]{width:3px;height:3px}.skippr\\:size-\\[4px\\]{width:4px;height:4px}.skippr\\:size-\\[5px\\]{width:5px;height:5px}.skippr\\:size-\\[6px\\]{width:6px;height:6px}.skippr\\:size-\\[7px\\]{width:7px;height:7px}.skippr\\:size-\\[8px\\]{width:8px;height:8px}.skippr\\:size-\\[9px\\]{width:9px;height:9px}.skippr\\:size-\\[10px\\]{width:10px;height:10px}.skippr\\:size-\\[11px\\]{width:11px;height:11px}.skippr\\:size-\\[12px\\]{width:12px;height:12px}.skippr\\:size-\\[13px\\]{width:13px;height:13px}.skippr\\:size-\\[14px\\]{width:14px;height:14px}.skippr\\:size-\\[15px\\]{width:15px;height:15px}.skippr\\:size-\\[16px\\]{width:16px;height:16px}.skippr\\:size-\\[17px\\]{width:17px;height:17px}.skippr\\:size-\\[18px\\]{width:18px;height:18px}.skippr\\:size-\\[19px\\]{width:19px;height:19px}.skippr\\:size-\\[20px\\]{width:20px;height:20px}.skippr\\:size-\\[22px\\]{width:22px;height:22px}.skippr\\:size-\\[26px\\]{width:26px;height:26px}.skippr\\:size-\\[28px\\]{width:28px;height:28px}.skippr\\:size-\\[30px\\]{width:30px;height:30px}.skippr\\:size-\\[32px\\]{width:32px;height:32px}.skippr\\:size-\\[34px\\]{width:34px;height:34px}.skippr\\:size-\\[38px\\]{width:38px;height:38px}.skippr\\:size-\\[46px\\]{width:46px;height:46px}.skippr\\:size-full{width:100%;height:100%}.skippr\\:h-0{height:calc(var(--skippr-spacing)*0)}.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-5{height:calc(var(--skippr-spacing)*5)}.skippr\\:h-6{height:calc(var(--skippr-spacing)*6)}.skippr\\:h-7{height:calc(var(--skippr-spacing)*7)}.skippr\\:h-8{height:calc(var(--skippr-spacing)*8)}.skippr\\:h-9{height:calc(var(--skippr-spacing)*9)}.skippr\\:h-10{height:calc(var(--skippr-spacing)*10)}.skippr\\:h-\\[5px\\]{height:5px}.skippr\\:h-\\[11px\\]{height:11px}.skippr\\:h-\\[14px\\]{height:14px}.skippr\\:h-\\[16px\\]{height:16px}.skippr\\:h-\\[18\\.5px\\]{height:18.5px}.skippr\\:h-\\[18px\\]{height:18px}.skippr\\:h-\\[22px\\]{height:22px}.skippr\\:h-\\[24px\\]{height:24px}.skippr\\:h-\\[26px\\]{height:26px}.skippr\\:h-\\[36px\\]{height:36px}.skippr\\:h-\\[38px\\]{height:38px}.skippr\\:h-\\[48px\\]{height:48px}.skippr\\:h-\\[54px\\]{height:54px}.skippr\\:h-full{height:100%}.skippr\\:h-px{height:1px}.skippr\\:max-h-\\[132px\\]{max-height:132px}.skippr\\:min-h-0{min-height:calc(var(--skippr-spacing)*0)}.skippr\\:min-h-11{min-height:calc(var(--skippr-spacing)*11)}.skippr\\:min-h-\\[16px\\]{min-height:16px}.skippr\\:w-0{width:calc(var(--skippr-spacing)*0)}.skippr\\:w-3\\.5{width:calc(var(--skippr-spacing)*3.5)}.skippr\\:w-5{width:calc(var(--skippr-spacing)*5)}.skippr\\:w-6{width:calc(var(--skippr-spacing)*6)}.skippr\\:w-7{width:calc(var(--skippr-spacing)*7)}.skippr\\:w-10{width:calc(var(--skippr-spacing)*10)}.skippr\\:w-40{width:calc(var(--skippr-spacing)*40)}.skippr\\:w-\\[2\\.5px\\]{width:2.5px}.skippr\\:w-\\[2px\\]{width:2px}.skippr\\:w-\\[3px\\]{width:3px}.skippr\\:w-\\[9px\\]{width:9px}.skippr\\:w-\\[14px\\]{width:14px}.skippr\\:w-\\[15\\.4px\\]{width:15.4px}.skippr\\:w-\\[15px\\]{width:15px}.skippr\\:w-\\[16px\\]{width:16px}.skippr\\:w-\\[22px\\]{width:22px}.skippr\\:w-\\[36px\\]{width:36px}.skippr\\:w-\\[38px\\]{width:38px}.skippr\\:w-\\[50px\\]{width:50px}.skippr\\:w-\\[148px\\]{width:148px}.skippr\\:w-\\[150px\\]{width:150px}.skippr\\:w-\\[220px\\]{width:220px}.skippr\\:w-\\[225px\\]{width:225px}.skippr\\:w-\\[240px\\]{width:240px}.skippr\\:w-\\[255px\\]{width:255px}.skippr\\:w-\\[320px\\]{width:320px}.skippr\\:w-fit{width:fit-content}.skippr\\:w-full{width:100%}.skippr\\:w-px{width:1px}.skippr\\:max-w-64{max-width:calc(var(--skippr-spacing)*64)}.skippr\\:max-w-72{max-width:calc(var(--skippr-spacing)*72)}.skippr\\:max-w-\\[80\\%\\]{max-width:80%}.skippr\\:max-w-\\[280px\\]{max-width:280px}.skippr\\:min-w-0{min-width:calc(var(--skippr-spacing)*0)}.skippr\\:min-w-11{min-width:calc(var(--skippr-spacing)*11)}.skippr\\:min-w-\\[96px\\]{min-width:96px}.skippr\\:flex-1{flex:1}.skippr\\:shrink-0{flex-shrink:0}.skippr\\:origin-bottom{transform-origin:bottom}.skippr\\:origin-bottom-left{transform-origin:0 100%}.skippr\\:origin-bottom-right{transform-origin:100% 100%}.skippr\\:origin-center{transform-origin:50%}.skippr\\:origin-left{transform-origin:0}.skippr\\:origin-right{transform-origin:100%}.skippr\\:origin-top{transform-origin:top}.skippr\\:origin-top-left{transform-origin:0 0}.skippr\\:origin-top-right{transform-origin:100% 0}.skippr\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-x-3{--tw-translate-x:calc(var(--skippr-spacing)*-3);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-x-7{--tw-translate-x:calc(var(--skippr-spacing)*-7);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:translate-x-3{--tw-translate-x:calc(var(--skippr-spacing)*3);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:translate-x-7{--tw-translate-x:calc(var(--skippr-spacing)*7);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-y-\\[4px\\]{--tw-translate-y:calc(4px*-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\\:scale-\\[0\\.94\\]{scale:.94}.skippr\\:-rotate-90{rotate:-90deg}.skippr\\:rotate-45{rotate:45deg}.skippr\\:rotate-\\[225deg\\]{rotate:225deg}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out\\]{animation:.2s ease-out skippr-agent-in}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out_240ms_both\\]{animation:.2s ease-out .24s both skippr-agent-in}.skippr\\:\\[animation\\:skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:\\[animation\\:skippr-block-reveal_320ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.32s cubic-bezier(.22,1,.36,1) skippr-block-reveal}.skippr\\:\\[animation\\:skippr-breathe_1\\.1s_ease-in-out_0\\.18s_infinite\\]{animation:1.1s ease-in-out .18s infinite skippr-breathe}.skippr\\:\\[animation\\:skippr-breathe_1\\.1s_ease-in-out_0\\.36s_infinite\\]{animation:1.1s ease-in-out .36s infinite skippr-breathe}.skippr\\:\\[animation\\:skippr-breathe_1\\.1s_ease-in-out_0s_infinite\\]{animation:1.1s ease-in-out infinite skippr-breathe}.skippr\\:\\[animation\\:skippr-evaporate_3\\.2s_ease-in_forwards\\]{animation:3.2s ease-in forwards skippr-evaporate}.skippr\\:\\[animation\\:skippr-fade-in_0\\.2s_ease\\]{animation:.2s skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-in_0\\.16s_ease\\]{animation:.16s skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-in_0\\.22s_ease\\]{animation:.22s skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-in_0\\.24s_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.24s cubic-bezier(.22,1,.36,1) skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-in_0\\.25s_ease\\]{animation:.25s skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-out_0\\.18s_ease-in_forwards\\]{animation:.18s ease-in forwards skippr-fade-out}.skippr\\:\\[animation\\:skippr-finger-tap_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-finger-tap}.skippr\\:\\[animation\\:skippr-mote-rise_1\\.6s_ease-out_infinite\\]{animation:1.6s ease-out infinite skippr-mote-rise}.skippr\\:\\[animation\\:skippr-orb-in_320ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)\\]{animation:.32s cubic-bezier(.34,1.3,.64,1) skippr-orb-in}.skippr\\:\\[animation\\:skippr-pop_0\\.2s_ease\\]{animation:.2s skippr-pop}.skippr\\:\\[animation\\:skippr-stage-fade_240ms_ease-out\\]{animation:.24s ease-out skippr-stage-fade}.skippr\\:\\[animation\\:skippr-tip-in_360ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)\\]{animation:.36s cubic-bezier(.34,1.3,.64,1) skippr-tip-in}.skippr\\:\\[animation\\:skippr-tip-in_360ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)_backwards\\]{animation:.36s cubic-bezier(.34,1.3,.64,1) backwards skippr-tip-in}.skippr\\:\\[animation\\:skippr-toolset-pop_280ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.28s cubic-bezier(.22,1,.36,1) skippr-toolset-pop}.skippr\\:\\[animation\\:skippr-toolset-pop_440ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.44s cubic-bezier(.22,1,.36,1) skippr-toolset-pop}.skippr\\:animate-\\[skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:animate-\\[skippr-bubble-in_0\\.28s_ease-out\\]{animation:.28s ease-out skippr-bubble-in}.skippr\\:animate-\\[skippr-fade-in_0\\.3s_ease-out\\]{animation:.3s ease-out skippr-fade-in}.skippr\\:animate-\\[skippr-pill-content_0\\.22s_ease-out\\]{animation:.22s ease-out skippr-pill-content}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.3s_infinite\\]{animation:1.1s ease-in-out .3s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.6s_infinite\\]{animation:1.1s ease-in-out .6s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.15s_infinite\\]{animation:1.1s ease-in-out .15s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.45s_infinite\\]{animation:1.1s ease-in-out .45s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-speak}.skippr\\:animate-bounce{animation:var(--skippr-animate-bounce)}.skippr\\:animate-ping{animation:var(--skippr-animate-ping)}.skippr\\:animate-skippr-annotation-pulse{animation:1.8s ease-in-out infinite skippr-annotation-pulse}.skippr\\:animate-skippr-click-ping{animation:.5s ease-out forwards skippr-click-ping}.skippr\\:animate-skippr-cursor-pop{animation:.22s ease-out skippr-cursor-pop}.skippr\\:animate-skippr-flow{animation:3.6s linear infinite skippr-flow}.skippr\\:animate-skippr-press{animation:.5s ease-in-out skippr-press}.skippr\\:animate-skippr-ptt-transmit{animation:1.4s ease-out infinite skippr-ptt-transmit}.skippr\\:animate-skippr-rec-ring{animation:2s ease-out infinite skippr-rec-ring}.skippr\\:animate-skippr-tab-fade{animation:.2s ease-out skippr-tab-fade}.skippr\\:animate-skippr-thinking-dot{animation:1.2s ease-in-out infinite skippr-thinking-dot}.skippr\\:animate-skippr-voice-pulse{animation:1.6s ease-out infinite skippr-voice-pulse}.skippr\\:animate-spin{animation:var(--skippr-animate-spin)}.skippr\\:cursor-default{cursor:default}.skippr\\:cursor-grab{cursor:grab}.skippr\\:cursor-not-allowed{cursor:not-allowed}.skippr\\:cursor-pointer{cursor:pointer}.skippr\\:touch-none{touch-action:none}.skippr\\:resize-none{resize:none}.skippr\\:appearance-none{appearance:none}.skippr\\:flex-col{flex-direction:column}.skippr\\:flex-col-reverse{flex-direction:column-reverse}.skippr\\:flex-row{flex-direction:row}.skippr\\:flex-row-reverse{flex-direction:row-reverse}.skippr\\:items-baseline{align-items:baseline}.skippr\\:items-center{align-items:center}.skippr\\:items-end{align-items:flex-end}.skippr\\:items-start{align-items:flex-start}.skippr\\:justify-between{justify-content:space-between}.skippr\\:justify-center{justify-content:center}.skippr\\:justify-end{justify-content:flex-end}.skippr\\:justify-start{justify-content:flex-start}.skippr\\:gap-0\\.5{gap:calc(var(--skippr-spacing)*.5)}.skippr\\:gap-1{gap:calc(var(--skippr-spacing)*1)}.skippr\\:gap-1\\.5{gap:calc(var(--skippr-spacing)*1.5)}.skippr\\:gap-2{gap:calc(var(--skippr-spacing)*2)}.skippr\\:gap-2\\.5{gap:calc(var(--skippr-spacing)*2.5)}.skippr\\:gap-3{gap:calc(var(--skippr-spacing)*3)}.skippr\\:gap-\\[1px\\]{gap:1px}.skippr\\:gap-\\[2px\\]{gap:2px}.skippr\\:gap-\\[3px\\]{gap:3px}.skippr\\:gap-\\[4px\\]{gap:4px}.skippr\\:gap-\\[5px\\]{gap:5px}.skippr\\:gap-\\[6px\\]{gap:6px}.skippr\\:gap-\\[7px\\]{gap:7px}.skippr\\:gap-\\[8px\\]{gap:8px}.skippr\\:gap-\\[9px\\]{gap:9px}.skippr\\:gap-\\[10px\\]{gap:10px}.skippr\\:gap-\\[14px\\]{gap:14px}.skippr\\:gap-px{gap:1px}:where(.skippr\\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-\\[6px\\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(6px*var(--tw-space-y-reverse));margin-block-end:calc(6px*calc(1 - var(--tw-space-y-reverse)))}.skippr\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.skippr\\:overflow-hidden{overflow:hidden}.skippr\\:overflow-visible{overflow:visible}.skippr\\:overflow-y-auto{overflow-y:auto}.skippr\\:overscroll-contain{overscroll-behavior:contain}.skippr\\:rounded{border-radius:.25rem}.skippr\\:rounded-2xl{border-radius:1.125rem}.skippr\\:rounded-\\[1rem\\]{border-radius:1rem}.skippr\\:rounded-\\[4px\\]{border-radius:4px}.skippr\\:rounded-\\[5px\\]{border-radius:5px}.skippr\\:rounded-\\[10px\\]{border-radius:10px}.skippr\\:rounded-\\[11px\\]{border-radius:11px}.skippr\\:rounded-\\[12px\\]{border-radius:12px}.skippr\\:rounded-\\[14px\\]{border-radius:14px}.skippr\\:rounded-\\[16px\\]{border-radius:16px}.skippr\\:rounded-\\[20px\\]{border-radius:20px}.skippr\\:rounded-full{border-radius:3.40282e38px}.skippr\\:rounded-md{border-radius:.5rem}.skippr\\:rounded-sm{border-radius:.375rem}.skippr\\:rounded-xl{border-radius:.875rem}.skippr\\:rounded-t-\\[6px\\]{border-top-left-radius:6px;border-top-right-radius:6px}.skippr\\:rounded-t-\\[18px\\]{border-top-left-radius:18px;border-top-right-radius:18px}.skippr\\:rounded-t-full{border-top-left-radius:3.40282e38px;border-top-right-radius:3.40282e38px}.skippr\\:rounded-l-\\[6px\\]{border-top-left-radius:6px;border-bottom-left-radius:6px}.skippr\\:rounded-l-\\[18px\\]{border-top-left-radius:18px;border-bottom-left-radius:18px}.skippr\\:rounded-l-full{border-top-left-radius:3.40282e38px;border-bottom-left-radius:3.40282e38px}.skippr\\:rounded-tl-\\[6px\\]{border-top-left-radius:6px}.skippr\\:rounded-tl-md{border-top-left-radius:.5rem}.skippr\\:rounded-r-\\[6px\\]{border-top-right-radius:6px;border-bottom-right-radius:6px}.skippr\\:rounded-r-\\[18px\\]{border-top-right-radius:18px;border-bottom-right-radius:18px}.skippr\\:rounded-r-full{border-top-right-radius:3.40282e38px;border-bottom-right-radius:3.40282e38px}.skippr\\:rounded-tr-\\[6px\\]{border-top-right-radius:6px}.skippr\\:rounded-b-\\[6px\\]{border-bottom-right-radius:6px;border-bottom-left-radius:6px}.skippr\\:rounded-b-\\[18px\\]{border-bottom-right-radius:18px;border-bottom-left-radius:18px}.skippr\\:rounded-b-full{border-bottom-right-radius:3.40282e38px;border-bottom-left-radius:3.40282e38px}.skippr\\:rounded-bl-\\[6px\\]{border-bottom-left-radius:6px}.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-\\[2\\.5px\\]{border-style:var(--tw-border-style);border-width:2.5px}.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-none{--tw-border-style:none;border-style:none}.skippr\\:border-\\[\\#d8d3ca\\]{border-color:#d8d3ca}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.1\\)\\]{border-color:#2d2d3f1a}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.06\\)\\]{border-color:#2d2d3f0f}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.08\\)\\]{border-color:#2d2d3f14}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.12\\)\\]{border-color:#2d2d3f1f}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.14\\)\\]{border-color:#2d2d3f24}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.28\\)\\]{border-color:#2d2d3f47}.skippr\\:border-\\[var\\(--skippr-brand-ring\\)\\]{border-color:var(--skippr-brand-ring)}.skippr\\:border-black\\/25{border-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-black\\/25{border-color:color-mix(in oklab,var(--skippr-color-black)25%,transparent)}}.skippr\\:border-border{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-brand{border-color:var(--skippr-brand,#2bc0ae)}.skippr\\:border-input{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-primary,.skippr\\:border-primary\\/20{border-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-primary\\/20{border-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)20%,transparent)}}.skippr\\:border-transparent{border-color:#0000}.skippr\\:border-white,.skippr\\:border-white\\/30{border-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-white\\/30{border-color:color-mix(in oklab,var(--skippr-color-white)30%,transparent)}}.skippr\\:border-t-brand{border-top-color:var(--skippr-brand,#2bc0ae)}.skippr\\:border-t-white{border-top-color:var(--skippr-color-white)}.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-\\[\\#2D2D3F\\]{background-color:#2d2d3f}.skippr\\:bg-\\[\\#F1EFEA\\]{background-color:#f1efea}.skippr\\:bg-\\[\\#b9b4ab\\]{background-color:#b9b4ab}.skippr\\:bg-\\[\\#dc2626\\]{background-color:#dc2626}.skippr\\:bg-\\[\\#eeeae4\\]{background-color:#eeeae4}.skippr\\:bg-\\[\\#f2f0eb\\]{background-color:#f2f0eb}.skippr\\:bg-\\[\\#f4ecd8\\]{background-color:#f4ecd8}.skippr\\:bg-\\[\\#f4f2ee\\]{background-color:#f4f2ee}.skippr\\:bg-\\[rgba\\(45\\,45\\,63\\,0\\.03\\)\\]{background-color:#2d2d3f08}.skippr\\:bg-amber-50{background-color:var(--skippr-color-amber-50)}.skippr\\:bg-amber-400{background-color:var(--skippr-color-amber-400)}.skippr\\:bg-background{background-color:oklch(100% 0 0)}.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:color-mix(in oklab,var(--skippr-color-black)7.0%,transparent)}}.skippr\\:bg-brand,.skippr\\:bg-brand\\/50{background-color:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-brand\\/50{background-color:color-mix(in oklab,var(--skippr-brand,#2bc0ae)50%,transparent)}}.skippr\\:bg-bubble{background-color:#2d2b3d}.skippr\\:bg-bubble\\/95{background-color:oklab(29.9244% .0107414 -.0305411/.95)}.skippr\\:bg-card{background-color:oklch(100% 0 0)}.skippr\\:bg-current{background-color:currentColor}.skippr\\:bg-destructive{background-color:#d94f4f}.skippr\\:bg-emerald-400{background-color:var(--skippr-color-emerald-400)}.skippr\\:bg-foreground{background-color:oklch(14.7% .004 49.25)}.skippr\\:bg-foreground\\/10{background-color:oklab(14.7% .00261104 .00303026/.1)}.skippr\\:bg-launcher{background-color:#2d2d3f}.skippr\\:bg-muted-foreground\\/40{background-color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:bg-neutral-100{background-color:var(--skippr-color-neutral-100)}.skippr\\:bg-primary,.skippr\\:bg-primary\\/10{background-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-primary\\/10{background-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)10%,transparent)}}.skippr\\:bg-red-50{background-color:var(--skippr-color-red-50)}.skippr\\:bg-red-100{background-color:var(--skippr-color-red-100)}.skippr\\:bg-red-500{background-color:var(--skippr-color-red-500)}.skippr\\:bg-secondary{background-color:#ffdfb5}.skippr\\:bg-transparent{background-color:#0000}.skippr\\:bg-white,.skippr\\:bg-white\\/70{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/70{background-color:color-mix(in oklab,var(--skippr-color-white)70%,transparent)}}.skippr\\:bg-white\\/80{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/80{background-color:color-mix(in oklab,var(--skippr-color-white)80%,transparent)}}.skippr\\:bg-white\\/95{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/95{background-color:color-mix(in oklab,var(--skippr-color-white)95%,transparent)}}.skippr\\:fill-brand{fill:var(--skippr-brand,#2bc0ae)}.skippr\\:fill-current{fill:currentColor}.skippr\\:fill-primary\\/30{fill:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:fill-primary\\/30{fill:color-mix(in oklab,var(--skippr-brand,#2d2b3d)30%,transparent)}}.skippr\\:fill-white{fill:var(--skippr-color-white)}.skippr\\:stroke-black\\/15{stroke:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:stroke-black\\/15{stroke:color-mix(in oklab,var(--skippr-color-black)15%,transparent)}}.skippr\\:stroke-bubble{stroke:#2d2b3d}.skippr\\:object-contain{object-fit:contain}.skippr\\:object-cover{object-fit:cover}.skippr\\:p-0{padding:calc(var(--skippr-spacing)*0)}.skippr\\:p-1\\.5{padding:calc(var(--skippr-spacing)*1.5)}.skippr\\:p-2{padding:calc(var(--skippr-spacing)*2)}.skippr\\:p-3{padding:calc(var(--skippr-spacing)*3)}.skippr\\:p-3\\.5{padding:calc(var(--skippr-spacing)*3.5)}.skippr\\:p-4{padding:calc(var(--skippr-spacing)*4)}.skippr\\:p-\\[2px\\]{padding:2px}.skippr\\:p-\\[3px\\]{padding:3px}.skippr\\:p-\\[9px\\]{padding:9px}.skippr\\:p-\\[14px\\]{padding:14px}.skippr\\:px-1{padding-inline:calc(var(--skippr-spacing)*1)}.skippr\\:px-1\\.5{padding-inline:calc(var(--skippr-spacing)*1.5)}.skippr\\:px-2{padding-inline:calc(var(--skippr-spacing)*2)}.skippr\\:px-2\\.5{padding-inline:calc(var(--skippr-spacing)*2.5)}.skippr\\:px-3{padding-inline:calc(var(--skippr-spacing)*3)}.skippr\\:px-3\\.5{padding-inline:calc(var(--skippr-spacing)*3.5)}.skippr\\:px-4{padding-inline:calc(var(--skippr-spacing)*4)}.skippr\\:px-5{padding-inline:calc(var(--skippr-spacing)*5)}.skippr\\:px-6{padding-inline:calc(var(--skippr-spacing)*6)}.skippr\\:px-8{padding-inline:calc(var(--skippr-spacing)*8)}.skippr\\:px-\\[5px\\]{padding-inline:5px}.skippr\\:px-\\[7px\\]{padding-inline:7px}.skippr\\:px-\\[9px\\]{padding-inline:9px}.skippr\\:px-\\[10px\\]{padding-inline:10px}.skippr\\:px-\\[11px\\]{padding-inline:11px}.skippr\\:px-\\[12px\\]{padding-inline:12px}.skippr\\:px-\\[18px\\]{padding-inline:18px}.skippr\\:px-\\[22px\\]{padding-inline:22px}.skippr\\:py-0\\.5{padding-block:calc(var(--skippr-spacing)*.5)}.skippr\\:py-1{padding-block:calc(var(--skippr-spacing)*1)}.skippr\\:py-1\\.5{padding-block:calc(var(--skippr-spacing)*1.5)}.skippr\\:py-2{padding-block:calc(var(--skippr-spacing)*2)}.skippr\\:py-2\\.5{padding-block:calc(var(--skippr-spacing)*2.5)}.skippr\\:py-3{padding-block:calc(var(--skippr-spacing)*3)}.skippr\\:py-4{padding-block:calc(var(--skippr-spacing)*4)}.skippr\\:py-6{padding-block:calc(var(--skippr-spacing)*6)}.skippr\\:py-\\[1px\\]{padding-block:1px}.skippr\\:py-\\[3px\\]{padding-block:3px}.skippr\\:py-\\[4px\\]{padding-block:4px}.skippr\\:py-\\[5px\\]{padding-block:5px}.skippr\\:py-\\[6px\\]{padding-block:6px}.skippr\\:py-\\[7px\\]{padding-block:7px}.skippr\\:py-\\[13px\\]{padding-block:13px}.skippr\\:pt-1{padding-top:calc(var(--skippr-spacing)*1)}.skippr\\:pt-5{padding-top:calc(var(--skippr-spacing)*5)}.skippr\\:pt-\\[8px\\]{padding-top:8px}.skippr\\:pt-\\[9px\\]{padding-top:9px}.skippr\\:pt-\\[10px\\]{padding-top:10px}.skippr\\:pt-\\[18px\\]{padding-top:18px}.skippr\\:pt-\\[22px\\]{padding-top:22px}.skippr\\:pr-2\\.5{padding-right:calc(var(--skippr-spacing)*2.5)}.skippr\\:pr-3{padding-right:calc(var(--skippr-spacing)*3)}.skippr\\:pr-\\[5px\\]{padding-right:5px}.skippr\\:pr-\\[6px\\]{padding-right:6px}.skippr\\:pr-\\[9px\\]{padding-right:9px}.skippr\\:pr-\\[10px\\]{padding-right:10px}.skippr\\:pb-0\\.5{padding-bottom:calc(var(--skippr-spacing)*.5)}.skippr\\:pb-1{padding-bottom:calc(var(--skippr-spacing)*1)}.skippr\\:pb-4{padding-bottom:calc(var(--skippr-spacing)*4)}.skippr\\:pb-\\[8px\\]{padding-bottom:8px}.skippr\\:pb-\\[10px\\]{padding-bottom:10px}.skippr\\:pb-\\[22px\\]{padding-bottom:22px}.skippr\\:pl-1\\.5{padding-left:calc(var(--skippr-spacing)*1.5)}.skippr\\:pl-2\\.5{padding-left:calc(var(--skippr-spacing)*2.5)}.skippr\\:pl-3\\.5{padding-left:calc(var(--skippr-spacing)*3.5)}.skippr\\:pl-\\[9px\\]{padding-left:9px}.skippr\\:pl-\\[13px\\]{padding-left:13px}.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-\\[8\\.5px\\]{font-size:8.5px}.skippr\\:text-\\[9\\.5px\\]{font-size:9.5px}.skippr\\:text-\\[9px\\]{font-size:9px}.skippr\\:text-\\[10\\.5px\\]{font-size:10.5px}.skippr\\:text-\\[10px\\]{font-size:10px}.skippr\\:text-\\[11\\.5px\\]{font-size:11.5px}.skippr\\:text-\\[11px\\]{font-size:11px}.skippr\\:text-\\[12\\.5px\\]{font-size:12.5px}.skippr\\:text-\\[12px\\]{font-size:12px}.skippr\\:text-\\[13px\\]{font-size:13px}.skippr\\:text-\\[14px\\]{font-size:14px}.skippr\\:text-\\[16px\\]{font-size:16px}.skippr\\:text-\\[18px\\]{font-size:18px}.skippr\\:leading-5{--tw-leading:calc(var(--skippr-spacing)*5);line-height:calc(var(--skippr-spacing)*5)}.skippr\\:leading-\\[1\\.2\\]{--tw-leading:1.2;line-height:1.2}.skippr\\:leading-\\[1\\.25\\]{--tw-leading:1.25;line-height:1.25}.skippr\\:leading-none{--tw-leading:1;line-height:1}.skippr\\:leading-relaxed{--tw-leading:var(--skippr-leading-relaxed);line-height:var(--skippr-leading-relaxed)}.skippr\\:leading-snug{--tw-leading:var(--skippr-leading-snug);line-height:var(--skippr-leading-snug)}.skippr\\:font-bold{--tw-font-weight:var(--skippr-font-weight-bold);font-weight:var(--skippr-font-weight-bold)}.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-\\[-0\\.01em\\]{--tw-tracking:-.01em;letter-spacing:-.01em}.skippr\\:tracking-\\[-0\\.0125em\\]{--tw-tracking:-.0125em;letter-spacing:-.0125em}.skippr\\:tracking-\\[0\\.02em\\]{--tw-tracking:.02em;letter-spacing:.02em}.skippr\\:tracking-\\[0\\.05em\\]{--tw-tracking:.05em;letter-spacing:.05em}.skippr\\:whitespace-nowrap{white-space:nowrap}.skippr\\:text-\\[\\#2D2D3F\\]{color:#2d2d3f}.skippr\\:text-\\[\\#5a5650\\]{color:#5a5650}.skippr\\:text-\\[\\#5c5850\\]{color:#5c5850}.skippr\\:text-\\[\\#6b6660\\]{color:#6b6660}.skippr\\:text-\\[\\#6b6875\\]{color:#6b6875}.skippr\\:text-\\[\\#8b877f\\]{color:#8b877f}.skippr\\:text-\\[\\#92400e\\]{color:#92400e}.skippr\\:text-\\[\\#a8a49c\\]{color:#a8a49c}.skippr\\:text-\\[\\#b8b4ac\\]{color:#b8b4ac}.skippr\\:text-\\[\\#c9c5bd\\]{color:#c9c5bd}.skippr\\:text-\\[\\#cbc7bf\\]{color:#cbc7bf}.skippr\\:text-\\[\\#dc2626\\]{color:#dc2626}.skippr\\:text-\\[var\\(--skippr-brand-deep\\)\\]{color:var(--skippr-brand-deep)}.skippr\\:text-amber-700{color:var(--skippr-color-amber-700)}.skippr\\:text-amber-950{color:var(--skippr-color-amber-950)}.skippr\\:text-background{color:oklch(100% 0 0)}.skippr\\:text-black,.skippr\\:text-black\\/40{color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-black\\/40{color:color-mix(in oklab,var(--skippr-color-black)40%,transparent)}}.skippr\\:text-brand{color:var(--skippr-brand,#2bc0ae)}.skippr\\:text-brand-on-white{color:var(--skippr-brand-on-white,#1e8478)}.skippr\\:text-bubble{color:#2d2b3d}.skippr\\:text-chart-3{color:oklch(66.6% .179 58.318)}.skippr\\:text-destructive{color:#d94f4f}.skippr\\:text-foreground{color:oklch(14.7% .004 49.25)}.skippr\\:text-muted-foreground{color:oklch(55.3% .013 58.071)}.skippr\\:text-muted-foreground\\/30{color:oklab(55.3% .00687528 .0110332/.3)}.skippr\\:text-muted-foreground\\/60{color:oklab(55.3% .00687528 .0110332/.6)}.skippr\\:text-neutral-500{color:var(--skippr-color-neutral-500)}.skippr\\:text-neutral-700{color:var(--skippr-color-neutral-700)}.skippr\\:text-primary{color:var(--skippr-brand,#2d2b3d)}.skippr\\:text-primary-foreground{color:var(--skippr-brand-foreground,#fff)}.skippr\\:text-red-400{color:var(--skippr-color-red-400)}.skippr\\:text-red-600{color:var(--skippr-color-red-600)}.skippr\\:text-red-700{color:var(--skippr-color-red-700)}.skippr\\:text-secondary-foreground{color:#613700}.skippr\\:text-white,.skippr\\:text-white\\/60{color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-white\\/60{color:color-mix(in oklab,var(--skippr-color-white)60%,transparent)}}.skippr\\:capitalize{text-transform:capitalize}.skippr\\:uppercase{text-transform:uppercase}.skippr\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.skippr\\:line-through{text-decoration-line:line-through}.skippr\\:underline{text-decoration-line:underline}.skippr\\:decoration-muted-foreground\\/40{text-decoration-color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:underline-offset-2,.skippr\\:underline-offset-\\[2px\\]{text-underline-offset:2px}.skippr\\:placeholder-muted-foreground::placeholder{color:oklch(55.3% .013 58.071)}.skippr\\:opacity-0{opacity:0}.skippr\\:opacity-40{opacity:.4}.skippr\\:opacity-75{opacity:.75}.skippr\\:opacity-85{opacity:.85}.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-\\[-3px_0_14px_var\\(--skippr-brand-halo\\)\\]{--tw-shadow:-3px 0 14px var(--tw-shadow-color,var(--skippr-brand-halo));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-\\[-4px_6px_18px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:-4px 6px 18px var(--tw-shadow-color,#2d2d3f29);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[-6px_8px_30px_rgba\\(15\\,18\\,26\\,0\\.32\\)\\]{--tw-shadow:-6px 8px 30px var(--tw-shadow-color,#0f121a52);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_-3px_14px_var\\(--skippr-brand-halo\\)\\]{--tw-shadow:0 -3px 14px var(--tw-shadow-color,var(--skippr-brand-halo));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_-6px_18px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:0 -6px 18px var(--tw-shadow-color,#2d2d3f29);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_0_0_1\\.5px_rgba\\(255\\,255\\,255\\,0\\.85\\)\\]{--tw-shadow:0 0 0 1.5px var(--tw-shadow-color,#ffffffd9);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_0_0_1px_rgba\\(45\\,45\\,63\\,0\\.10\\)\\,0_1px_2px_rgba\\(45\\,45\\,63\\,0\\.04\\)\\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,#2d2d3f1a),0 1px 2px var(--tw-shadow-color,#2d2d3f0a);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_0_0_4px_var\\(--skippr-brand-ring\\)\\]{--tw-shadow:0 0 0 4px var(--tw-shadow-color,var(--skippr-brand-ring));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_1px_2px_rgba\\(45\\,45\\,63\\,0\\.05\\)\\]{--tw-shadow:0 1px 2px var(--tw-shadow-color,#2d2d3f0d);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_1px_2px_rgba\\(45\\,45\\,63\\,0\\.08\\)\\]{--tw-shadow:0 1px 2px var(--tw-shadow-color,#2d2d3f14);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_2px_6px_rgba\\(0\\,0\\,0\\,0\\.28\\)\\]{--tw-shadow:0 2px 6px var(--tw-shadow-color,#00000047);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_2px_6px_rgba\\(45\\,45\\,63\\,0\\.14\\)\\]{--tw-shadow:0 2px 6px var(--tw-shadow-color,#2d2d3f24);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_3px_14px_var\\(--skippr-brand-halo\\)\\]{--tw-shadow:0 3px 14px var(--tw-shadow-color,var(--skippr-brand-halo));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\\(45\\,45\\,63\\,0\\.1\\)\\]{--tw-shadow:0 4px 12px var(--tw-shadow-color,#2d2d3f1a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_14px_rgba\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_14px_rgba\\(239\\,68\\,68\\,0\\.45\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#ef444473);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_16px_rgba\\(45\\,43\\,61\\,0\\.45\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#2d2b3d73),0 2px 4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_6px_16px_rgba\\(45\\,45\\,63\\,0\\.14\\)\\]{--tw-shadow:0 6px 16px var(--tw-shadow-color,#2d2d3f24);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_6px_18px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:0 6px 18px var(--tw-shadow-color,#2d2d3f29);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_22px_rgba\\(45\\,45\\,63\\,0\\.12\\)\\,0_1px_3px_rgba\\(45\\,45\\,63\\,0\\.04\\)\\]{--tw-shadow:0 8px 22px var(--tw-shadow-color,#2d2d3f1f),0 1px 3px var(--tw-shadow-color,#2d2d3f0a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(45\\,43\\,61\\,0\\.35\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#2d2b3d59);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_30px_rgba\\(45\\,45\\,63\\,0\\.14\\)\\,0_2px_6px_rgba\\(45\\,45\\,63\\,0\\.06\\)\\]{--tw-shadow:0 8px 30px var(--tw-shadow-color,#2d2d3f24),0 2px 6px var(--tw-shadow-color,#2d2d3f0f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_26px_rgba\\(45\\,45\\,63\\,0\\.13\\)\\,0_2px_6px_rgba\\(45\\,45\\,63\\,0\\.05\\)\\]{--tw-shadow:0 10px 26px var(--tw-shadow-color,#2d2d3f21),0 2px 6px var(--tw-shadow-color,#2d2d3f0d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_28px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:0 10px 28px var(--tw-shadow-color,#2d2d3f29);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_30px_rgba\\(45\\,45\\,63\\,0\\.14\\)\\,0_0_0_1\\.5px_var\\(--skippr-brand-ring\\)\\]{--tw-shadow:0 10px 30px var(--tw-shadow-color,#2d2d3f24),0 0 0 1.5px var(--tw-shadow-color,var(--skippr-brand-ring));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_32px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 10px 32px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_14px_34px_rgba\\(45\\,45\\,63\\,0\\.15\\)\\,0_2px_6px_rgba\\(45\\,45\\,63\\,0\\.06\\)\\]{--tw-shadow:0 14px 34px var(--tw-shadow-color,#2d2d3f26),0 2px 6px var(--tw-shadow-color,#2d2d3f0f);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-\\[3px_0_14px_var\\(--skippr-brand-halo\\)\\]{--tw-shadow:3px 0 14px var(--tw-shadow-color,var(--skippr-brand-halo));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-\\[4px_6px_18px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:4px 6px 18px var(--tw-shadow-color,#2d2d3f29);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-\\[inset_0_0_0_1\\.5px_var\\(--skippr-brand\\,\\#2bc0ae\\)\\]{--tw-shadow:inset 0 0 0 1.5px var(--tw-shadow-color,var(--skippr-brand,#2bc0ae));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-black\\/5{--tw-ring-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-black\\/5{--tw-ring-color:color-mix(in oklab,var(--skippr-color-black)5%,transparent)}}.skippr\\:ring-brand{--tw-ring-color:var(--skippr-brand,#2bc0ae)}.skippr\\:ring-white\\/15{--tw-ring-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-white\\/15{--tw-ring-color:color-mix(in oklab,var(--skippr-color-white)15%,transparent)}}.skippr\\:ring-offset-background{--tw-ring-offset-color:oklch(100% 0 0)}.skippr\\:drop-shadow-\\[0_2px_5px_rgba\\(0\\,0\\,0\\,0\\.4\\)\\]{--tw-drop-shadow-size:drop-shadow(0 2px 5px var(--tw-drop-shadow-color,#0006));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.skippr\\:backdrop-blur-sm{--tw-backdrop-blur:blur(var(--skippr-blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.skippr\\:transition-\\[filter\\]{transition-property:filter;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[gap\\]{transition-property:gap;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[height\\]{transition-property:height;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[left\\]{transition-property:left;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\\,color\\]{transition-property:opacity,color;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[opacity\\,transform\\,height\\]{transition-property:opacity,transform,height;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[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\\,height\\,background-color\\,border-color\\]{transition-property:width,height,background-color,border-color;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\,margin\\]{transition-property:width,margin;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-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\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:duration-75{--tw-duration:75ms;transition-duration:75ms}.skippr\\:duration-100{--tw-duration:.1s;transition-duration:.1s}.skippr\\:duration-150{--tw-duration:.15s;transition-duration:.15s}.skippr\\:duration-200{--tw-duration:.2s;transition-duration:.2s}.skippr\\:duration-300{--tw-duration:.3s;transition-duration:.3s}.skippr\\:duration-\\[400ms\\]{--tw-duration:.4s;transition-duration:.4s}.skippr\\:ease-\\[cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{--tw-ease:cubic-bezier(.22,1,.36,1);transition-timing-function:cubic-bezier(.22,1,.36,1)}.skippr\\:ease-\\[cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)\\]{--tw-ease:cubic-bezier(.34,1.3,.64,1);transition-timing-function:cubic-bezier(.34,1.3,.64,1)}.skippr\\:ease-\\[cubic-bezier\\(0\\.34\\,1\\.56\\,0\\.64\\,1\\)\\]{--tw-ease:cubic-bezier(.34,1.56,.64,1);transition-timing-function:cubic-bezier(.34,1.56,.64,1)}.skippr\\:ease-in-out{--tw-ease:var(--skippr-ease-in-out);transition-timing-function:var(--skippr-ease-in-out)}.skippr\\:ease-out{--tw-ease:var(--skippr-ease-out);transition-timing-function:var(--skippr-ease-out)}.skippr\\:outline-none{--tw-outline-style:none;outline-style:none}.skippr\\:select-none{-webkit-user-select:none;user-select:none}.skippr\\:select-text{-webkit-user-select:text;user-select:text}.skippr\\:\\[animation-delay\\:0ms\\]{animation-delay:0s}.skippr\\:\\[animation-delay\\:150ms\\]{animation-delay:.15s}.skippr\\:\\[animation-delay\\:200ms\\]{animation-delay:.2s}.skippr\\:\\[animation-delay\\:300ms\\]{animation-delay:.3s}.skippr\\:\\[animation-delay\\:400ms\\]{animation-delay:.4s}.skippr\\:\\[overflow-anchor\\:none\\]{overflow-anchor:none}.skippr\\:group-focus-within\\:scale-100:is(:where(.skippr\\:group):focus-within *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-focus-within\\:opacity-100:is(:where(.skippr\\:group):focus-within *){opacity:1}@media (hover:hover){.skippr\\:group-hover\\:scale-100:is(:where(.skippr\\:group):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-hover\\:text-red-300:is(:where(.skippr\\:group):hover *){color:var(--skippr-color-red-300)}.skippr\\:group-hover\\:text-white\\/80:is(:where(.skippr\\:group):hover *){color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:group-hover\\:text-white\\/80:is(:where(.skippr\\:group):hover *){color:color-mix(in oklab,var(--skippr-color-white)80%,transparent)}}.skippr\\:group-hover\\:opacity-100:is(:where(.skippr\\:group):hover *){opacity:1}}.skippr\\:placeholder\\:text-\\[\\#b0aca4\\]::placeholder{color:#b0aca4}.skippr\\:first\\:mt-0:first-child{margin-top:calc(var(--skippr-spacing)*0)}@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\\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:hover\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.45\\)\\]:hover{border-color:#2d2d3f73}.skippr\\:hover\\:bg-\\[\\#3a384b\\]:hover{background-color:#3a384b}.skippr\\:hover\\:bg-\\[\\#3d3d52\\]:hover{background-color:#3d3d52}.skippr\\:hover\\:bg-\\[\\#f2f0eb\\]:hover{background-color:#f2f0eb}.skippr\\:hover\\:bg-\\[\\#f4f2ee\\]:hover{background-color:#f4f2ee}.skippr\\:hover\\:bg-\\[\\#f6f4f0\\]:hover{background-color:#f6f4f0}.skippr\\:hover\\:bg-\\[rgba\\(45\\,45\\,63\\,0\\.04\\)\\]:hover{background-color:#2d2d3f0a}.skippr\\:hover\\:bg-accent:hover{background-color:#e7e5e4}.skippr\\:hover\\:bg-amber-100:hover{background-color:var(--skippr-color-amber-100)}.skippr\\:hover\\:bg-bubble:hover{background-color:#2d2b3d}.skippr\\:hover\\:bg-destructive\\/90:hover{background-color:oklab(61.4357% .15892 .0698893/.9)}.skippr\\:hover\\:bg-foreground\\/8:hover{background-color:oklab(14.7% .00261104 .00303026/.08)}.skippr\\:hover\\:bg-muted:hover{background-color:oklch(97% .001 106.424)}.skippr\\:hover\\:bg-neutral-100:hover{background-color:var(--skippr-color-neutral-100)}.skippr\\:hover\\:bg-neutral-200:hover{background-color:var(--skippr-color-neutral-200)}.skippr\\:hover\\:bg-primary\\/90:hover{background-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)90%,transparent)}}.skippr\\:hover\\:bg-red-200:hover{background-color:var(--skippr-color-red-200)}.skippr\\:hover\\:bg-red-600:hover{background-color:var(--skippr-color-red-600)}.skippr\\:hover\\:bg-secondary\\/80:hover{background-color:oklab(91.9963% .0175391 .0626889/.8)}.skippr\\:hover\\:bg-transparent:hover{background-color:#0000}.skippr\\:hover\\:text-\\[\\#2D2D3F\\]:hover{color:#2d2d3f}.skippr\\:hover\\:text-\\[\\#5a5650\\]:hover{color:#5a5650}.skippr\\:hover\\:text-accent-foreground:hover{color:oklch(21.6% .006 56.043)}.skippr\\:hover\\:text-destructive:hover{color:#d94f4f}.skippr\\:hover\\:text-foreground:hover{color:oklch(14.7% .004 49.25)}.skippr\\:hover\\:underline:hover{text-decoration-line:underline}.skippr\\:hover\\:decoration-muted-foreground:hover{text-decoration-color:oklch(55.3% .013 58.071)}.skippr\\:hover\\:opacity-80:hover{opacity:.8}.skippr\\:hover\\:opacity-100:hover{opacity:1}.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\\:hover\\:brightness-\\[1\\.04\\]:hover{--tw-brightness:brightness(1.04);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\\:hover\\:brightness-\\[1\\.06\\]:hover{--tw-brightness:brightness(1.06);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\\:border-primary:focus{border-color:var(--skippr-brand,#2d2b3d)}.skippr\\:focus\\:ring-2:focus{--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\\:ring-primary\\/30:focus{--tw-ring-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:focus\\:ring-primary\\/30:focus{--tw-ring-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)30%,transparent)}}.skippr\\:focus-visible\\:border-\\[var\\(--skippr-brand-ring\\)\\]:focus-visible{border-color:var(--skippr-brand-ring)}.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-\\[var\\(--skippr-brand-ring\\)\\]:focus-visible{--tw-ring-color:var(--skippr-brand-ring)}.skippr\\:focus-visible\\:ring-bubble\\/60:focus-visible{--tw-ring-color:oklab(29.9244% .0107414 -.0305411/.6)}.skippr\\:focus-visible\\:ring-ring:focus-visible{--tw-ring-color:oklch(70.9% .01 56.259)}.skippr\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.skippr\\:focus-visible\\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.skippr\\:focus-visible\\:outline-offset-2:focus-visible{outline-offset:2px}.skippr\\:focus-visible\\:outline-\\[var\\(--skippr-brand\\)\\]:focus-visible{outline-color:var(--skippr-brand)}.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\\:active\\:scale-\\[0\\.98\\]:active{scale:.98}.skippr\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.skippr\\:disabled\\:cursor-default:disabled{cursor:default}.skippr\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.skippr\\:disabled\\:opacity-50:disabled{opacity:.5}.skippr\\:disabled\\:opacity-60:disabled{opacity:.6}.skippr\\:disabled\\:opacity-80:disabled{opacity:.8}@media (hover:hover){.skippr\\:disabled\\:hover\\:bg-\\[\\#2D2D3F\\]:disabled:hover{background-color:#2d2d3f}.skippr\\:disabled\\:hover\\:bg-white:disabled:hover{background-color:var(--skippr-color-white)}}@media (prefers-reduced-motion:reduce){.skippr\\:motion-reduce\\:hidden{display:none}.skippr\\:motion-reduce\\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:motion-reduce\\:animate-none{animation:none}}.skippr\\:\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.skippr\\:\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.skippr\\:\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}}:host{--skippr-brand-active:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-active:color-mix(in srgb,var(--skippr-brand,#2bc0ae)93%,#000)}}:host{--skippr-brand-deep:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-deep:color-mix(in srgb,var(--skippr-brand,#2bc0ae)78%,#000)}}:host{--skippr-brand-ring:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-ring:color-mix(in srgb,var(--skippr-brand,#2bc0ae)22%,transparent)}}:host{--skippr-brand-halo:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-halo:color-mix(in srgb,var(--skippr-brand,#2bc0ae)40%,transparent)}}:host{--skippr-brand-glow:linear-gradient(90deg,var(--skippr-brand,#2bc0ae),var(--skippr-brand,#2bc0ae),var(--skippr-brand,#2bc0ae),var(--skippr-brand,#2bc0ae),var(--skippr-brand,#2bc0ae))}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-glow:linear-gradient(90deg,var(--skippr-brand,#2bc0ae),color-mix(in srgb,var(--skippr-brand,#2bc0ae)55%,#fff),color-mix(in srgb,var(--skippr-brand,#2bc0ae)72%,#fff),var(--skippr-brand,#2bc0ae),color-mix(in srgb,var(--skippr-brand,#2bc0ae)42%,#fff))}}@keyframes skippr-tap{0%{transform:scale(1)}45%{transform:scale(.7)}to{transform:scale(1)}}@keyframes skippr-press{0%{transform:scale(1)}55%{transform:scale(1)}85%{transform:scale(.68)}to{transform:scale(1)}}@keyframes skippr-cursor-pop{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}@keyframes skippr-click-ping{0%{opacity:.9;transform:translate(-50%,-50%)scale(.4)}to{opacity:0;transform:translate(-50%,-50%)scale(2.4)}}@keyframes skippr-tab-fade{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-speak{0%,to{opacity:.6;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-thinking-dot{0%,80%,to{opacity:.2;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}@keyframes skippr-pulse-ring{0%,to{box-shadow:0 0 #2d2b3d66}50%{box-shadow:0 0 0 10px #2d2b3d00}}@keyframes skippr-rec-ring{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)55%,transparent)}70%{box-shadow:0 0 0 11px #0000}to{box-shadow:0 0 #0000}}@keyframes skippr-voice-pulse{0%{box-shadow:0 0 0 0 var(--skippr-pulse-color,#2bc0ae80)}70%{box-shadow:0 0 0 8px #0000}to{box-shadow:0 0 #0000}}@keyframes skippr-ptt-transmit{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)60%,transparent),0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)35%,transparent)}70%{box-shadow:0 0 0 9px #0000,0 0 0 16px #0000}to{box-shadow:0 0 #0000,0 0 #0000}}@keyframes skippr-annotation-pulse{0%,to{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)50%,transparent)}50%{box-shadow:0 0 0 6px #0000}}@keyframes skippr-speak-ripple{0%{opacity:.6;transform:scale(1)}to{opacity:0;transform:scale(1.8)}}@keyframes skippr-bar{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}@keyframes skippr-breathe{0%,to{opacity:.85;transform:scale(1)}50%{opacity:1;transform:scale(1.08)}}@keyframes skippr-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-evaporate{0%{opacity:1;filter:blur();transform:translateY(0)scale(1)}55%{opacity:.85;filter:blur()}to{opacity:0;filter:blur(2.5px);transform:translateY(-7px)scale(.965)}}@keyframes skippr-mote-rise{0%{opacity:0;transform:translateY(2px)scale(.5)}25%{opacity:.85}to{opacity:0;transform:translateY(-24px)scale(1)}}@keyframes skippr-flow{0%{background-position:0%}50%{background-position:100%}to{background-position:0%}}@keyframes skippr-wave{0%,to{opacity:.4;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-bubble-in{0%{opacity:0;transform:translateY(12px)scale(.96)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-tip-in{0%{opacity:0;transform:translateY(14px)scale(.96)}60%{opacity:1;transform:translateY(-2px)scale(1.01)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-pill-content{0%{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}@keyframes skippr-banner-look{0%,to{transform:translate(0)}25%{transform:translate(-2px)}75%{transform:translate(2px)}}@keyframes skippr-finger-tap{0%,to{transform:translateY(0)rotate(0)}50%{transform:translateY(2px)rotate(-6deg)}}@keyframes skippr-toolset-pop{0%{opacity:0;transform:scale(.85)}to{opacity:1;transform:scale(1)}}@keyframes skippr-stage-fade{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}@keyframes skippr-agent-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}@keyframes skippr-orb-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}@keyframes skippr-pop{0%{opacity:0;transform:translateY(6px)scale(.98)}to{opacity:1;transform:none}}@keyframes skippr-blink{0%,40%{transform:scaleY(1)}41.3%,42%{transform:scaleY(.08)}43.3%,70%{transform:scaleY(1)}71.3%,72%{transform:scaleY(.08)}73.3%,to{transform:scaleY(1)}}.skippr-buddy-blink{transform-box:fill-box;transform-origin:50%;animation:5s linear infinite skippr-blink}@keyframes skippr-avatar-eyes-bob{0%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(0)}18%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(24px)}33.33%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(-30px)}48%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(-7px)}64%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(-30px)}82%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(31px)}96%,to{transform:translateY(0)}}@keyframes skippr-avatar-pupil-glance{0%,21.33%{transform:translate(0)}28%,68%{transform:translate(-30px)}74%,to{transform:translate(0)}}@keyframes skippr-avatar-body-vibe{0%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1)}17.67%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1.08,.95)}33.67%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1)}49.67%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1.08,.95)}65.67%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1)}81.67%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1.08,.95)}96%,to{transform:scale(1)}}@keyframes skippr-avatar-blink{0%,40%{transform:scaleY(1)}41.3%,42%{transform:scaleY(.08)}43.3%,70%{transform:scaleY(1)}71.3%,72%{transform:scaleY(.08)}73.3%,to{transform:scaleY(1)}}@keyframes skippr-avatar-bub-tail-drift{0%,10%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translate(0)}45%,60%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translate(-24px)}95%,to{transform:translate(0)}}@keyframes skippr-avatar-antenna-shake{0%,to{transform:rotate(-4deg)}25%{transform:rotate(4deg)}50%{transform:rotate(-3deg)}75%{transform:rotate(3deg)}}.skippr-avatar-eyes{animation:5s infinite skippr-avatar-eyes-bob}.skippr-avatar-pupil{animation:5s linear infinite skippr-avatar-pupil-glance}.skippr-avatar-body{transform-box:fill-box;transform-origin:50% 100%;animation:5s infinite skippr-avatar-body-vibe}.skippr-avatar-blink{transform-box:fill-box;transform-origin:50%;animation:5s infinite skippr-avatar-blink}.skippr-avatar-body .skippr-avatar-antenna{transform-box:view-box;transform-origin:48px 22px;animation:1.6s ease-in-out infinite skippr-avatar-antenna-shake}.skippr-avatar-body .skippr-avatar-bub-tail{animation:5s infinite skippr-avatar-bub-tail-drift}@keyframes skippr-buddy-bob{0%,to{transform:translateY(0)}50%{transform:translateY(-3px)}}@keyframes skippr-buddy-breathe{0%,to{transform:scale(1)}50%{transform:scale(1.15)}}@keyframes skippr-buddy-pop{0%{transform:scale(1)}50%{transform:scale(1.06)}to{transform:scale(1)}}@keyframes skippr-buddy-sleep{0%,to{transform:translateY(0)scale(1)}50%{transform:translateY(1px)scale(.995)}}@keyframes skippr-buddy-zfloat{0%{opacity:0;transform:translateY(0)}20%{opacity:1}to{opacity:0;transform:translateY(-10px)}}@keyframes skippr-peek-left{0%,20%{transform:translate(-58%)}46%,66%{transform:translate(0)}92%,to{transform:translate(-58%)}}@keyframes skippr-peek-right{0%,20%{transform:translate(58%)}46%,66%{transform:translate(0)}92%,to{transform:translate(58%)}}@keyframes skippr-peek-top{0%,20%{transform:translateY(-58%)}46%,66%{transform:translateY(0)}92%,to{transform:translateY(-58%)}}@keyframes skippr-peek-bottom{0%,20%{transform:translateY(58%)}46%,66%{transform:translateY(0)}92%,to{transform:translateY(58%)}}.skippr-peek-left{animation:3.6s ease-in-out infinite skippr-peek-left}.skippr-peek-right{animation:3.6s ease-in-out infinite skippr-peek-right}.skippr-peek-top{animation:3.6s ease-in-out infinite skippr-peek-top}.skippr-peek-bottom{animation:3.6s ease-in-out infinite skippr-peek-bottom}.skippr-peek-out{animation:none;transform:none}@keyframes skippr-fade-out{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(4px)}}@keyframes skippr-block-reveal{0%{opacity:0;max-height:0;transform:translateY(-4px)}55%{opacity:1}to{opacity:1;max-height:260px;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){.skippr-buddy-blink,[style*=skippr-blink],[style*=skippr-buddy-bob],[style*=skippr-buddy-breathe],[style*=skippr-buddy-pop],[style*=skippr-buddy-sleep],[style*=skippr-buddy-zfloat],.skippr-avatar-eyes,.skippr-avatar-pupil,.skippr-avatar-body,.skippr-avatar-blink,.skippr-avatar-body .skippr-avatar-antenna,.skippr-avatar-body .skippr-avatar-bub-tail,.skippr-peek-left,.skippr-peek-right,.skippr-peek-top,.skippr-peek-bottom{animation-play-state:paused}}.skippr-no-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.skippr-no-scrollbar::-webkit-scrollbar{display:none}:host{color:var(--color-foreground)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@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}}`;
|
|
8978
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-outline-style:solid}}}@layer theme{:root,:host{--skippr-font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--skippr-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--skippr-color-red-50:oklch(97.1% .013 17.38);--skippr-color-red-100:oklch(93.6% .032 17.717);--skippr-color-red-200:oklch(88.5% .062 18.334);--skippr-color-red-300:oklch(80.8% .114 19.571);--skippr-color-red-400:oklch(70.4% .191 22.216);--skippr-color-red-500:oklch(63.7% .237 25.331);--skippr-color-red-600:oklch(57.7% .245 27.325);--skippr-color-red-700:oklch(50.5% .213 27.518);--skippr-color-amber-50:oklch(98.7% .022 95.277);--skippr-color-amber-100:oklch(96.2% .059 95.617);--skippr-color-amber-400:oklch(82.8% .189 84.429);--skippr-color-amber-700:oklch(55.5% .163 48.998);--skippr-color-amber-950:oklch(27.9% .077 45.635);--skippr-color-emerald-400:oklch(76.5% .177 163.223);--skippr-color-neutral-100:oklch(97% 0 0);--skippr-color-neutral-200:oklch(92.2% 0 0);--skippr-color-neutral-500:oklch(55.6% 0 0);--skippr-color-neutral-700:oklch(37.1% 0 0);--skippr-color-black:#000;--skippr-color-white:#fff;--skippr-spacing:.25rem;--skippr-text-xs:.75rem;--skippr-text-xs--line-height:calc(1/.75);--skippr-text-sm:.875rem;--skippr-text-sm--line-height:calc(1.25/.875);--skippr-font-weight-medium:500;--skippr-font-weight-semibold:600;--skippr-font-weight-bold:700;--skippr-leading-snug:1.375;--skippr-leading-relaxed:1.625;--skippr-ease-out:cubic-bezier(0,0,.2,1);--skippr-ease-in-out:cubic-bezier(.4,0,.2,1);--skippr-animate-spin:spin 1s linear infinite;--skippr-animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--skippr-animate-bounce:bounce 1s infinite;--skippr-blur-sm:8px;--skippr-default-transition-duration:.15s;--skippr-default-transition-timing-function:cubic-bezier(.4,0,.2,1);--skippr-default-font-family:var(--skippr-font-sans);--skippr-default-mono-font-family:var(--skippr-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--skippr-default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--skippr-default-font-feature-settings,normal);font-variation-settings:var(--skippr-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--skippr-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--skippr-default-mono-font-feature-settings,normal);font-variation-settings:var(--skippr-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.skippr\\:pointer-events-auto{pointer-events:auto}.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-\\[3px\\]{inset:-3px}.skippr\\:inset-0{inset:calc(var(--skippr-spacing)*0)}.skippr\\:inset-y-0{inset-block:calc(var(--skippr-spacing)*0)}.skippr\\:-top-1{top:calc(var(--skippr-spacing)*-1)}.skippr\\:-top-6{top:calc(var(--skippr-spacing)*-6)}.skippr\\:-top-8{top:calc(var(--skippr-spacing)*-8)}.skippr\\:-top-\\[2px\\]{top:-2px}.skippr\\:-top-\\[3px\\]{top:-3px}.skippr\\:-top-\\[13px\\]{top:-13px}.skippr\\:top-0{top:calc(var(--skippr-spacing)*0)}.skippr\\:top-1\\/2{top:50%}.skippr\\:top-\\[8px\\]{top:8px}.skippr\\:top-full{top:100%}.skippr\\:-right-1{right:calc(var(--skippr-spacing)*-1)}.skippr\\:-right-8{right:calc(var(--skippr-spacing)*-8)}.skippr\\:-right-\\[2px\\]{right:-2px}.skippr\\:-right-\\[6px\\]{right:-6px}.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\\:right-\\[4px\\]{right:4px}.skippr\\:right-\\[8px\\]{right:8px}.skippr\\:-bottom-\\[2px\\]{bottom:-2px}.skippr\\:bottom-3{bottom:calc(var(--skippr-spacing)*3)}.skippr\\:bottom-4{bottom:calc(var(--skippr-spacing)*4)}.skippr\\:bottom-20{bottom:calc(var(--skippr-spacing)*20)}.skippr\\:bottom-\\[calc\\(100\\%\\+8px\\)\\]{bottom:calc(100% + 8px)}.skippr\\:bottom-\\[calc\\(100\\%\\+11px\\)\\]{bottom:calc(100% + 11px)}.skippr\\:bottom-full{bottom:100%}.skippr\\:-left-8{left:calc(var(--skippr-spacing)*-8)}.skippr\\:-left-\\[2px\\]{left:-2px}.skippr\\:-left-\\[6px\\]{left:-6px}.skippr\\:left-0{left:calc(var(--skippr-spacing)*0)}.skippr\\:left-1\\/2{left:50%}.skippr\\:left-2{left:calc(var(--skippr-spacing)*2)}.skippr\\:left-3{left:calc(var(--skippr-spacing)*3)}.skippr\\:left-5{left:calc(var(--skippr-spacing)*5)}.skippr\\:left-6{left:calc(var(--skippr-spacing)*6)}.skippr\\:z-10{z-index:10}.skippr\\:z-20{z-index:20}.skippr\\:z-\\[1\\]{z-index:1}.skippr\\:z-\\[2\\]{z-index:2}.skippr\\:z-\\[4\\]{z-index:4}.skippr\\:z-\\[5\\]{z-index:5}.skippr\\:z-\\[6\\]{z-index:6}.skippr\\:z-\\[7\\]{z-index:7}.skippr\\:z-\\[8\\]{z-index:8}.skippr\\:z-\\[9998\\]{z-index:9998}.skippr\\:z-\\[9999\\]{z-index:9999}.skippr\\:z-\\[10000\\]{z-index:10000}.skippr\\:order-first{order:-9999}.skippr\\:order-last{order:9999}.skippr\\:mx-auto{margin-inline:auto}.skippr\\:-mt-1{margin-top:calc(var(--skippr-spacing)*-1)}.skippr\\:-mt-\\[5px\\]{margin-top:-5px}.skippr\\:-mt-\\[27px\\]{margin-top:-27px}.skippr\\:mt-0\\.5{margin-top:calc(var(--skippr-spacing)*.5)}.skippr\\:mt-1{margin-top:calc(var(--skippr-spacing)*1)}.skippr\\:mt-1\\.5{margin-top:calc(var(--skippr-spacing)*1.5)}.skippr\\:mt-2{margin-top:calc(var(--skippr-spacing)*2)}.skippr\\:mt-3{margin-top:calc(var(--skippr-spacing)*3)}.skippr\\:mt-3\\.5{margin-top:calc(var(--skippr-spacing)*3.5)}.skippr\\:mt-\\[1px\\]{margin-top:1px}.skippr\\:mt-\\[6px\\]{margin-top:6px}.skippr\\:mt-\\[8px\\]{margin-top:8px}.skippr\\:mt-\\[9px\\]{margin-top:9px}.skippr\\:-mr-1{margin-right:calc(var(--skippr-spacing)*-1)}.skippr\\:mr-7{margin-right:calc(var(--skippr-spacing)*7)}.skippr\\:mr-\\[22px\\]{margin-right:22px}.skippr\\:-mb-\\[5px\\]{margin-bottom:-5px}.skippr\\:mb-1{margin-bottom:calc(var(--skippr-spacing)*1)}.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\\:mb-\\[14px\\]{margin-bottom:14px}.skippr\\:-ml-\\[2px\\]{margin-left:-2px}.skippr\\:ml-0\\.5{margin-left:calc(var(--skippr-spacing)*.5)}.skippr\\:ml-1{margin-left:calc(var(--skippr-spacing)*1)}.skippr\\:ml-7{margin-left:calc(var(--skippr-spacing)*7)}.skippr\\:ml-auto{margin-left:auto}.skippr\\:line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.skippr\\:block{display:block}.skippr\\:flex{display:flex}.skippr\\:hidden{display:none}.skippr\\:inline-flex{display:inline-flex}.skippr\\:size-1{width:calc(var(--skippr-spacing)*1);height:calc(var(--skippr-spacing)*1)}.skippr\\:size-1\\.5{width:calc(var(--skippr-spacing)*1.5);height:calc(var(--skippr-spacing)*1.5)}.skippr\\:size-2{width:calc(var(--skippr-spacing)*2);height:calc(var(--skippr-spacing)*2)}.skippr\\:size-2\\.5{width:calc(var(--skippr-spacing)*2.5);height:calc(var(--skippr-spacing)*2.5)}.skippr\\:size-3{width:calc(var(--skippr-spacing)*3);height:calc(var(--skippr-spacing)*3)}.skippr\\:size-3\\.5{width:calc(var(--skippr-spacing)*3.5);height:calc(var(--skippr-spacing)*3.5)}.skippr\\:size-4{width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}.skippr\\:size-5{width:calc(var(--skippr-spacing)*5);height:calc(var(--skippr-spacing)*5)}.skippr\\:size-6{width:calc(var(--skippr-spacing)*6);height:calc(var(--skippr-spacing)*6)}.skippr\\:size-7{width:calc(var(--skippr-spacing)*7);height:calc(var(--skippr-spacing)*7)}.skippr\\:size-8{width:calc(var(--skippr-spacing)*8);height:calc(var(--skippr-spacing)*8)}.skippr\\:size-9{width:calc(var(--skippr-spacing)*9);height:calc(var(--skippr-spacing)*9)}.skippr\\:size-10{width:calc(var(--skippr-spacing)*10);height:calc(var(--skippr-spacing)*10)}.skippr\\:size-12{width:calc(var(--skippr-spacing)*12);height:calc(var(--skippr-spacing)*12)}.skippr\\:size-\\[3px\\]{width:3px;height:3px}.skippr\\:size-\\[4px\\]{width:4px;height:4px}.skippr\\:size-\\[5px\\]{width:5px;height:5px}.skippr\\:size-\\[6px\\]{width:6px;height:6px}.skippr\\:size-\\[7px\\]{width:7px;height:7px}.skippr\\:size-\\[8px\\]{width:8px;height:8px}.skippr\\:size-\\[9px\\]{width:9px;height:9px}.skippr\\:size-\\[10px\\]{width:10px;height:10px}.skippr\\:size-\\[11px\\]{width:11px;height:11px}.skippr\\:size-\\[12px\\]{width:12px;height:12px}.skippr\\:size-\\[13px\\]{width:13px;height:13px}.skippr\\:size-\\[14px\\]{width:14px;height:14px}.skippr\\:size-\\[15px\\]{width:15px;height:15px}.skippr\\:size-\\[16px\\]{width:16px;height:16px}.skippr\\:size-\\[17px\\]{width:17px;height:17px}.skippr\\:size-\\[18px\\]{width:18px;height:18px}.skippr\\:size-\\[19px\\]{width:19px;height:19px}.skippr\\:size-\\[20px\\]{width:20px;height:20px}.skippr\\:size-\\[22px\\]{width:22px;height:22px}.skippr\\:size-\\[26px\\]{width:26px;height:26px}.skippr\\:size-\\[28px\\]{width:28px;height:28px}.skippr\\:size-\\[30px\\]{width:30px;height:30px}.skippr\\:size-\\[32px\\]{width:32px;height:32px}.skippr\\:size-\\[34px\\]{width:34px;height:34px}.skippr\\:size-\\[38px\\]{width:38px;height:38px}.skippr\\:size-\\[46px\\]{width:46px;height:46px}.skippr\\:size-full{width:100%;height:100%}.skippr\\:h-0{height:calc(var(--skippr-spacing)*0)}.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-5{height:calc(var(--skippr-spacing)*5)}.skippr\\:h-6{height:calc(var(--skippr-spacing)*6)}.skippr\\:h-7{height:calc(var(--skippr-spacing)*7)}.skippr\\:h-8{height:calc(var(--skippr-spacing)*8)}.skippr\\:h-9{height:calc(var(--skippr-spacing)*9)}.skippr\\:h-10{height:calc(var(--skippr-spacing)*10)}.skippr\\:h-\\[5px\\]{height:5px}.skippr\\:h-\\[11px\\]{height:11px}.skippr\\:h-\\[14px\\]{height:14px}.skippr\\:h-\\[16px\\]{height:16px}.skippr\\:h-\\[18\\.5px\\]{height:18.5px}.skippr\\:h-\\[18px\\]{height:18px}.skippr\\:h-\\[22px\\]{height:22px}.skippr\\:h-\\[24px\\]{height:24px}.skippr\\:h-\\[26px\\]{height:26px}.skippr\\:h-\\[36px\\]{height:36px}.skippr\\:h-\\[38px\\]{height:38px}.skippr\\:h-\\[48px\\]{height:48px}.skippr\\:h-\\[54px\\]{height:54px}.skippr\\:h-full{height:100%}.skippr\\:h-px{height:1px}.skippr\\:max-h-\\[132px\\]{max-height:132px}.skippr\\:min-h-0{min-height:calc(var(--skippr-spacing)*0)}.skippr\\:min-h-11{min-height:calc(var(--skippr-spacing)*11)}.skippr\\:min-h-\\[16px\\]{min-height:16px}.skippr\\:w-0{width:calc(var(--skippr-spacing)*0)}.skippr\\:w-3\\.5{width:calc(var(--skippr-spacing)*3.5)}.skippr\\:w-5{width:calc(var(--skippr-spacing)*5)}.skippr\\:w-6{width:calc(var(--skippr-spacing)*6)}.skippr\\:w-7{width:calc(var(--skippr-spacing)*7)}.skippr\\:w-10{width:calc(var(--skippr-spacing)*10)}.skippr\\:w-40{width:calc(var(--skippr-spacing)*40)}.skippr\\:w-\\[2\\.5px\\]{width:2.5px}.skippr\\:w-\\[2px\\]{width:2px}.skippr\\:w-\\[3px\\]{width:3px}.skippr\\:w-\\[9px\\]{width:9px}.skippr\\:w-\\[14px\\]{width:14px}.skippr\\:w-\\[15\\.4px\\]{width:15.4px}.skippr\\:w-\\[15px\\]{width:15px}.skippr\\:w-\\[16px\\]{width:16px}.skippr\\:w-\\[22px\\]{width:22px}.skippr\\:w-\\[36px\\]{width:36px}.skippr\\:w-\\[38px\\]{width:38px}.skippr\\:w-\\[50px\\]{width:50px}.skippr\\:w-\\[148px\\]{width:148px}.skippr\\:w-\\[150px\\]{width:150px}.skippr\\:w-\\[220px\\]{width:220px}.skippr\\:w-\\[225px\\]{width:225px}.skippr\\:w-\\[240px\\]{width:240px}.skippr\\:w-\\[255px\\]{width:255px}.skippr\\:w-\\[320px\\]{width:320px}.skippr\\:w-fit{width:fit-content}.skippr\\:w-full{width:100%}.skippr\\:w-px{width:1px}.skippr\\:max-w-64{max-width:calc(var(--skippr-spacing)*64)}.skippr\\:max-w-72{max-width:calc(var(--skippr-spacing)*72)}.skippr\\:max-w-\\[80\\%\\]{max-width:80%}.skippr\\:max-w-\\[280px\\]{max-width:280px}.skippr\\:min-w-0{min-width:calc(var(--skippr-spacing)*0)}.skippr\\:min-w-11{min-width:calc(var(--skippr-spacing)*11)}.skippr\\:min-w-\\[96px\\]{min-width:96px}.skippr\\:flex-1{flex:1}.skippr\\:shrink-0{flex-shrink:0}.skippr\\:origin-bottom{transform-origin:bottom}.skippr\\:origin-bottom-left{transform-origin:0 100%}.skippr\\:origin-bottom-right{transform-origin:100% 100%}.skippr\\:origin-center{transform-origin:50%}.skippr\\:origin-left{transform-origin:0}.skippr\\:origin-right{transform-origin:100%}.skippr\\:origin-top{transform-origin:top}.skippr\\:origin-top-left{transform-origin:0 0}.skippr\\:origin-top-right{transform-origin:100% 0}.skippr\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-x-3{--tw-translate-x:calc(var(--skippr-spacing)*-3);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-x-7{--tw-translate-x:calc(var(--skippr-spacing)*-7);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:translate-x-3{--tw-translate-x:calc(var(--skippr-spacing)*3);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:translate-x-7{--tw-translate-x:calc(var(--skippr-spacing)*7);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-y-\\[4px\\]{--tw-translate-y:calc(4px*-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\\:scale-\\[0\\.94\\]{scale:.94}.skippr\\:-rotate-90{rotate:-90deg}.skippr\\:rotate-45{rotate:45deg}.skippr\\:rotate-\\[225deg\\]{rotate:225deg}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out\\]{animation:.2s ease-out skippr-agent-in}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out_240ms_both\\]{animation:.2s ease-out .24s both skippr-agent-in}.skippr\\:\\[animation\\:skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:\\[animation\\:skippr-block-reveal_320ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.32s cubic-bezier(.22,1,.36,1) skippr-block-reveal}.skippr\\:\\[animation\\:skippr-breathe_1\\.1s_ease-in-out_0\\.18s_infinite\\]{animation:1.1s ease-in-out .18s infinite skippr-breathe}.skippr\\:\\[animation\\:skippr-breathe_1\\.1s_ease-in-out_0\\.36s_infinite\\]{animation:1.1s ease-in-out .36s infinite skippr-breathe}.skippr\\:\\[animation\\:skippr-breathe_1\\.1s_ease-in-out_0s_infinite\\]{animation:1.1s ease-in-out infinite skippr-breathe}.skippr\\:\\[animation\\:skippr-evaporate_3\\.2s_ease-in_forwards\\]{animation:3.2s ease-in forwards skippr-evaporate}.skippr\\:\\[animation\\:skippr-fade-in_0\\.2s_ease\\]{animation:.2s skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-in_0\\.16s_ease\\]{animation:.16s skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-in_0\\.22s_ease\\]{animation:.22s skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-in_0\\.24s_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.24s cubic-bezier(.22,1,.36,1) skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-in_0\\.25s_ease\\]{animation:.25s skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-out_0\\.18s_ease-in_forwards\\]{animation:.18s ease-in forwards skippr-fade-out}.skippr\\:\\[animation\\:skippr-finger-tap_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-finger-tap}.skippr\\:\\[animation\\:skippr-mote-rise_1\\.6s_ease-out_infinite\\]{animation:1.6s ease-out infinite skippr-mote-rise}.skippr\\:\\[animation\\:skippr-orb-in_320ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)\\]{animation:.32s cubic-bezier(.34,1.3,.64,1) skippr-orb-in}.skippr\\:\\[animation\\:skippr-pop_0\\.2s_ease\\]{animation:.2s skippr-pop}.skippr\\:\\[animation\\:skippr-stage-fade_240ms_ease-out\\]{animation:.24s ease-out skippr-stage-fade}.skippr\\:\\[animation\\:skippr-tip-in_360ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)\\]{animation:.36s cubic-bezier(.34,1.3,.64,1) skippr-tip-in}.skippr\\:\\[animation\\:skippr-tip-in_360ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)_backwards\\]{animation:.36s cubic-bezier(.34,1.3,.64,1) backwards skippr-tip-in}.skippr\\:\\[animation\\:skippr-toolset-pop_280ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.28s cubic-bezier(.22,1,.36,1) skippr-toolset-pop}.skippr\\:\\[animation\\:skippr-toolset-pop_440ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.44s cubic-bezier(.22,1,.36,1) skippr-toolset-pop}.skippr\\:animate-\\[skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:animate-\\[skippr-bubble-in_0\\.28s_ease-out\\]{animation:.28s ease-out skippr-bubble-in}.skippr\\:animate-\\[skippr-fade-in_0\\.3s_ease-out\\]{animation:.3s ease-out skippr-fade-in}.skippr\\:animate-\\[skippr-pill-content_0\\.22s_ease-out\\]{animation:.22s ease-out skippr-pill-content}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.3s_infinite\\]{animation:1.1s ease-in-out .3s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.6s_infinite\\]{animation:1.1s ease-in-out .6s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.15s_infinite\\]{animation:1.1s ease-in-out .15s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.45s_infinite\\]{animation:1.1s ease-in-out .45s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-speak}.skippr\\:animate-bounce{animation:var(--skippr-animate-bounce)}.skippr\\:animate-ping{animation:var(--skippr-animate-ping)}.skippr\\:animate-skippr-annotation-pulse{animation:1.8s ease-in-out infinite skippr-annotation-pulse}.skippr\\:animate-skippr-click-ping{animation:.5s ease-out forwards skippr-click-ping}.skippr\\:animate-skippr-cursor-pop{animation:.22s ease-out skippr-cursor-pop}.skippr\\:animate-skippr-flow{animation:3.6s linear infinite skippr-flow}.skippr\\:animate-skippr-press{animation:.5s ease-in-out skippr-press}.skippr\\:animate-skippr-ptt-transmit{animation:1.4s ease-out infinite skippr-ptt-transmit}.skippr\\:animate-skippr-rec-ring{animation:2s ease-out infinite skippr-rec-ring}.skippr\\:animate-skippr-tab-fade{animation:.2s ease-out skippr-tab-fade}.skippr\\:animate-skippr-thinking-dot{animation:1.2s ease-in-out infinite skippr-thinking-dot}.skippr\\:animate-skippr-voice-pulse{animation:1.6s ease-out infinite skippr-voice-pulse}.skippr\\:animate-spin{animation:var(--skippr-animate-spin)}.skippr\\:cursor-default{cursor:default}.skippr\\:cursor-grab{cursor:grab}.skippr\\:cursor-not-allowed{cursor:not-allowed}.skippr\\:cursor-pointer{cursor:pointer}.skippr\\:touch-none{touch-action:none}.skippr\\:resize-none{resize:none}.skippr\\:appearance-none{appearance:none}.skippr\\:flex-col{flex-direction:column}.skippr\\:flex-col-reverse{flex-direction:column-reverse}.skippr\\:flex-row{flex-direction:row}.skippr\\:flex-row-reverse{flex-direction:row-reverse}.skippr\\:items-baseline{align-items:baseline}.skippr\\:items-center{align-items:center}.skippr\\:items-end{align-items:flex-end}.skippr\\:items-start{align-items:flex-start}.skippr\\:justify-between{justify-content:space-between}.skippr\\:justify-center{justify-content:center}.skippr\\:justify-end{justify-content:flex-end}.skippr\\:justify-start{justify-content:flex-start}.skippr\\:gap-0\\.5{gap:calc(var(--skippr-spacing)*.5)}.skippr\\:gap-1{gap:calc(var(--skippr-spacing)*1)}.skippr\\:gap-1\\.5{gap:calc(var(--skippr-spacing)*1.5)}.skippr\\:gap-2{gap:calc(var(--skippr-spacing)*2)}.skippr\\:gap-2\\.5{gap:calc(var(--skippr-spacing)*2.5)}.skippr\\:gap-3{gap:calc(var(--skippr-spacing)*3)}.skippr\\:gap-\\[1px\\]{gap:1px}.skippr\\:gap-\\[2px\\]{gap:2px}.skippr\\:gap-\\[3px\\]{gap:3px}.skippr\\:gap-\\[4px\\]{gap:4px}.skippr\\:gap-\\[5px\\]{gap:5px}.skippr\\:gap-\\[6px\\]{gap:6px}.skippr\\:gap-\\[7px\\]{gap:7px}.skippr\\:gap-\\[8px\\]{gap:8px}.skippr\\:gap-\\[9px\\]{gap:9px}.skippr\\:gap-\\[10px\\]{gap:10px}.skippr\\:gap-\\[14px\\]{gap:14px}.skippr\\:gap-px{gap:1px}:where(.skippr\\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-\\[6px\\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(6px*var(--tw-space-y-reverse));margin-block-end:calc(6px*calc(1 - var(--tw-space-y-reverse)))}.skippr\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.skippr\\:overflow-hidden{overflow:hidden}.skippr\\:overflow-visible{overflow:visible}.skippr\\:overflow-y-auto{overflow-y:auto}.skippr\\:overscroll-contain{overscroll-behavior:contain}.skippr\\:rounded{border-radius:.25rem}.skippr\\:rounded-2xl{border-radius:1.125rem}.skippr\\:rounded-\\[1rem\\]{border-radius:1rem}.skippr\\:rounded-\\[4px\\]{border-radius:4px}.skippr\\:rounded-\\[5px\\]{border-radius:5px}.skippr\\:rounded-\\[10px\\]{border-radius:10px}.skippr\\:rounded-\\[11px\\]{border-radius:11px}.skippr\\:rounded-\\[12px\\]{border-radius:12px}.skippr\\:rounded-\\[14px\\]{border-radius:14px}.skippr\\:rounded-\\[16px\\]{border-radius:16px}.skippr\\:rounded-\\[20px\\]{border-radius:20px}.skippr\\:rounded-full{border-radius:3.40282e38px}.skippr\\:rounded-md{border-radius:.5rem}.skippr\\:rounded-sm{border-radius:.375rem}.skippr\\:rounded-xl{border-radius:.875rem}.skippr\\:rounded-t-\\[6px\\]{border-top-left-radius:6px;border-top-right-radius:6px}.skippr\\:rounded-t-\\[18px\\]{border-top-left-radius:18px;border-top-right-radius:18px}.skippr\\:rounded-t-full{border-top-left-radius:3.40282e38px;border-top-right-radius:3.40282e38px}.skippr\\:rounded-l-\\[6px\\]{border-top-left-radius:6px;border-bottom-left-radius:6px}.skippr\\:rounded-l-\\[18px\\]{border-top-left-radius:18px;border-bottom-left-radius:18px}.skippr\\:rounded-l-full{border-top-left-radius:3.40282e38px;border-bottom-left-radius:3.40282e38px}.skippr\\:rounded-tl-\\[6px\\]{border-top-left-radius:6px}.skippr\\:rounded-tl-md{border-top-left-radius:.5rem}.skippr\\:rounded-r-\\[6px\\]{border-top-right-radius:6px;border-bottom-right-radius:6px}.skippr\\:rounded-r-\\[18px\\]{border-top-right-radius:18px;border-bottom-right-radius:18px}.skippr\\:rounded-r-full{border-top-right-radius:3.40282e38px;border-bottom-right-radius:3.40282e38px}.skippr\\:rounded-tr-\\[6px\\]{border-top-right-radius:6px}.skippr\\:rounded-b-\\[6px\\]{border-bottom-right-radius:6px;border-bottom-left-radius:6px}.skippr\\:rounded-b-\\[18px\\]{border-bottom-right-radius:18px;border-bottom-left-radius:18px}.skippr\\:rounded-b-full{border-bottom-right-radius:3.40282e38px;border-bottom-left-radius:3.40282e38px}.skippr\\:rounded-bl-\\[6px\\]{border-bottom-left-radius:6px}.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-\\[2\\.5px\\]{border-style:var(--tw-border-style);border-width:2.5px}.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-none{--tw-border-style:none;border-style:none}.skippr\\:border-\\[\\#d8d3ca\\]{border-color:#d8d3ca}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.1\\)\\]{border-color:#2d2d3f1a}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.06\\)\\]{border-color:#2d2d3f0f}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.08\\)\\]{border-color:#2d2d3f14}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.12\\)\\]{border-color:#2d2d3f1f}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.14\\)\\]{border-color:#2d2d3f24}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.28\\)\\]{border-color:#2d2d3f47}.skippr\\:border-\\[var\\(--skippr-brand-ring\\)\\]{border-color:var(--skippr-brand-ring)}.skippr\\:border-black\\/25{border-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-black\\/25{border-color:color-mix(in oklab,var(--skippr-color-black)25%,transparent)}}.skippr\\:border-border{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-brand{border-color:var(--skippr-brand,#2bc0ae)}.skippr\\:border-input{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-primary,.skippr\\:border-primary\\/20{border-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-primary\\/20{border-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)20%,transparent)}}.skippr\\:border-transparent{border-color:#0000}.skippr\\:border-white,.skippr\\:border-white\\/30{border-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-white\\/30{border-color:color-mix(in oklab,var(--skippr-color-white)30%,transparent)}}.skippr\\:border-t-brand{border-top-color:var(--skippr-brand,#2bc0ae)}.skippr\\:border-t-white{border-top-color:var(--skippr-color-white)}.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-\\[\\#2D2D3F\\]{background-color:#2d2d3f}.skippr\\:bg-\\[\\#F1EFEA\\]{background-color:#f1efea}.skippr\\:bg-\\[\\#b9b4ab\\]{background-color:#b9b4ab}.skippr\\:bg-\\[\\#dc2626\\]{background-color:#dc2626}.skippr\\:bg-\\[\\#eeeae4\\]{background-color:#eeeae4}.skippr\\:bg-\\[\\#f2f0eb\\]{background-color:#f2f0eb}.skippr\\:bg-\\[\\#f4ecd8\\]{background-color:#f4ecd8}.skippr\\:bg-\\[\\#f4f2ee\\]{background-color:#f4f2ee}.skippr\\:bg-\\[rgba\\(45\\,45\\,63\\,0\\.03\\)\\]{background-color:#2d2d3f08}.skippr\\:bg-amber-50{background-color:var(--skippr-color-amber-50)}.skippr\\:bg-amber-400{background-color:var(--skippr-color-amber-400)}.skippr\\:bg-background{background-color:oklch(100% 0 0)}.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:color-mix(in oklab,var(--skippr-color-black)7.0%,transparent)}}.skippr\\:bg-brand,.skippr\\:bg-brand\\/50{background-color:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-brand\\/50{background-color:color-mix(in oklab,var(--skippr-brand,#2bc0ae)50%,transparent)}}.skippr\\:bg-bubble{background-color:#2d2b3d}.skippr\\:bg-bubble\\/95{background-color:oklab(29.9244% .0107414 -.0305411/.95)}.skippr\\:bg-card{background-color:oklch(100% 0 0)}.skippr\\:bg-current{background-color:currentColor}.skippr\\:bg-destructive{background-color:#d94f4f}.skippr\\:bg-emerald-400{background-color:var(--skippr-color-emerald-400)}.skippr\\:bg-foreground{background-color:oklch(14.7% .004 49.25)}.skippr\\:bg-foreground\\/10{background-color:oklab(14.7% .00261104 .00303026/.1)}.skippr\\:bg-launcher{background-color:#2d2d3f}.skippr\\:bg-muted-foreground\\/40{background-color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:bg-neutral-100{background-color:var(--skippr-color-neutral-100)}.skippr\\:bg-primary,.skippr\\:bg-primary\\/10{background-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-primary\\/10{background-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)10%,transparent)}}.skippr\\:bg-red-50{background-color:var(--skippr-color-red-50)}.skippr\\:bg-red-100{background-color:var(--skippr-color-red-100)}.skippr\\:bg-red-500{background-color:var(--skippr-color-red-500)}.skippr\\:bg-secondary{background-color:#ffdfb5}.skippr\\:bg-transparent{background-color:#0000}.skippr\\:bg-white,.skippr\\:bg-white\\/70{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/70{background-color:color-mix(in oklab,var(--skippr-color-white)70%,transparent)}}.skippr\\:bg-white\\/80{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/80{background-color:color-mix(in oklab,var(--skippr-color-white)80%,transparent)}}.skippr\\:bg-white\\/95{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/95{background-color:color-mix(in oklab,var(--skippr-color-white)95%,transparent)}}.skippr\\:fill-brand{fill:var(--skippr-brand,#2bc0ae)}.skippr\\:fill-current{fill:currentColor}.skippr\\:fill-primary\\/30{fill:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:fill-primary\\/30{fill:color-mix(in oklab,var(--skippr-brand,#2d2b3d)30%,transparent)}}.skippr\\:fill-white{fill:var(--skippr-color-white)}.skippr\\:stroke-black\\/15{stroke:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:stroke-black\\/15{stroke:color-mix(in oklab,var(--skippr-color-black)15%,transparent)}}.skippr\\:stroke-bubble{stroke:#2d2b3d}.skippr\\:object-contain{object-fit:contain}.skippr\\:object-cover{object-fit:cover}.skippr\\:p-0{padding:calc(var(--skippr-spacing)*0)}.skippr\\:p-1\\.5{padding:calc(var(--skippr-spacing)*1.5)}.skippr\\:p-2{padding:calc(var(--skippr-spacing)*2)}.skippr\\:p-3{padding:calc(var(--skippr-spacing)*3)}.skippr\\:p-3\\.5{padding:calc(var(--skippr-spacing)*3.5)}.skippr\\:p-4{padding:calc(var(--skippr-spacing)*4)}.skippr\\:p-\\[2px\\]{padding:2px}.skippr\\:p-\\[3px\\]{padding:3px}.skippr\\:p-\\[9px\\]{padding:9px}.skippr\\:p-\\[14px\\]{padding:14px}.skippr\\:px-1{padding-inline:calc(var(--skippr-spacing)*1)}.skippr\\:px-1\\.5{padding-inline:calc(var(--skippr-spacing)*1.5)}.skippr\\:px-2{padding-inline:calc(var(--skippr-spacing)*2)}.skippr\\:px-2\\.5{padding-inline:calc(var(--skippr-spacing)*2.5)}.skippr\\:px-3{padding-inline:calc(var(--skippr-spacing)*3)}.skippr\\:px-3\\.5{padding-inline:calc(var(--skippr-spacing)*3.5)}.skippr\\:px-4{padding-inline:calc(var(--skippr-spacing)*4)}.skippr\\:px-5{padding-inline:calc(var(--skippr-spacing)*5)}.skippr\\:px-6{padding-inline:calc(var(--skippr-spacing)*6)}.skippr\\:px-8{padding-inline:calc(var(--skippr-spacing)*8)}.skippr\\:px-\\[5px\\]{padding-inline:5px}.skippr\\:px-\\[7px\\]{padding-inline:7px}.skippr\\:px-\\[9px\\]{padding-inline:9px}.skippr\\:px-\\[10px\\]{padding-inline:10px}.skippr\\:px-\\[11px\\]{padding-inline:11px}.skippr\\:px-\\[12px\\]{padding-inline:12px}.skippr\\:px-\\[18px\\]{padding-inline:18px}.skippr\\:px-\\[22px\\]{padding-inline:22px}.skippr\\:py-0\\.5{padding-block:calc(var(--skippr-spacing)*.5)}.skippr\\:py-1{padding-block:calc(var(--skippr-spacing)*1)}.skippr\\:py-1\\.5{padding-block:calc(var(--skippr-spacing)*1.5)}.skippr\\:py-2{padding-block:calc(var(--skippr-spacing)*2)}.skippr\\:py-2\\.5{padding-block:calc(var(--skippr-spacing)*2.5)}.skippr\\:py-3{padding-block:calc(var(--skippr-spacing)*3)}.skippr\\:py-4{padding-block:calc(var(--skippr-spacing)*4)}.skippr\\:py-6{padding-block:calc(var(--skippr-spacing)*6)}.skippr\\:py-\\[1px\\]{padding-block:1px}.skippr\\:py-\\[3px\\]{padding-block:3px}.skippr\\:py-\\[4px\\]{padding-block:4px}.skippr\\:py-\\[5px\\]{padding-block:5px}.skippr\\:py-\\[6px\\]{padding-block:6px}.skippr\\:py-\\[7px\\]{padding-block:7px}.skippr\\:py-\\[13px\\]{padding-block:13px}.skippr\\:pt-1{padding-top:calc(var(--skippr-spacing)*1)}.skippr\\:pt-5{padding-top:calc(var(--skippr-spacing)*5)}.skippr\\:pt-\\[8px\\]{padding-top:8px}.skippr\\:pt-\\[9px\\]{padding-top:9px}.skippr\\:pt-\\[10px\\]{padding-top:10px}.skippr\\:pt-\\[18px\\]{padding-top:18px}.skippr\\:pt-\\[22px\\]{padding-top:22px}.skippr\\:pr-2\\.5{padding-right:calc(var(--skippr-spacing)*2.5)}.skippr\\:pr-3{padding-right:calc(var(--skippr-spacing)*3)}.skippr\\:pr-\\[5px\\]{padding-right:5px}.skippr\\:pr-\\[6px\\]{padding-right:6px}.skippr\\:pr-\\[9px\\]{padding-right:9px}.skippr\\:pr-\\[10px\\]{padding-right:10px}.skippr\\:pb-0\\.5{padding-bottom:calc(var(--skippr-spacing)*.5)}.skippr\\:pb-1{padding-bottom:calc(var(--skippr-spacing)*1)}.skippr\\:pb-4{padding-bottom:calc(var(--skippr-spacing)*4)}.skippr\\:pb-\\[8px\\]{padding-bottom:8px}.skippr\\:pb-\\[10px\\]{padding-bottom:10px}.skippr\\:pb-\\[22px\\]{padding-bottom:22px}.skippr\\:pl-1\\.5{padding-left:calc(var(--skippr-spacing)*1.5)}.skippr\\:pl-2\\.5{padding-left:calc(var(--skippr-spacing)*2.5)}.skippr\\:pl-3\\.5{padding-left:calc(var(--skippr-spacing)*3.5)}.skippr\\:pl-\\[9px\\]{padding-left:9px}.skippr\\:pl-\\[13px\\]{padding-left:13px}.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-\\[8\\.5px\\]{font-size:8.5px}.skippr\\:text-\\[9\\.5px\\]{font-size:9.5px}.skippr\\:text-\\[9px\\]{font-size:9px}.skippr\\:text-\\[10\\.5px\\]{font-size:10.5px}.skippr\\:text-\\[10px\\]{font-size:10px}.skippr\\:text-\\[11\\.5px\\]{font-size:11.5px}.skippr\\:text-\\[11px\\]{font-size:11px}.skippr\\:text-\\[12\\.5px\\]{font-size:12.5px}.skippr\\:text-\\[12px\\]{font-size:12px}.skippr\\:text-\\[13px\\]{font-size:13px}.skippr\\:text-\\[14px\\]{font-size:14px}.skippr\\:text-\\[16px\\]{font-size:16px}.skippr\\:text-\\[18px\\]{font-size:18px}.skippr\\:leading-5{--tw-leading:calc(var(--skippr-spacing)*5);line-height:calc(var(--skippr-spacing)*5)}.skippr\\:leading-\\[1\\.2\\]{--tw-leading:1.2;line-height:1.2}.skippr\\:leading-\\[1\\.25\\]{--tw-leading:1.25;line-height:1.25}.skippr\\:leading-none{--tw-leading:1;line-height:1}.skippr\\:leading-relaxed{--tw-leading:var(--skippr-leading-relaxed);line-height:var(--skippr-leading-relaxed)}.skippr\\:leading-snug{--tw-leading:var(--skippr-leading-snug);line-height:var(--skippr-leading-snug)}.skippr\\:font-bold{--tw-font-weight:var(--skippr-font-weight-bold);font-weight:var(--skippr-font-weight-bold)}.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-\\[-0\\.01em\\]{--tw-tracking:-.01em;letter-spacing:-.01em}.skippr\\:tracking-\\[-0\\.0125em\\]{--tw-tracking:-.0125em;letter-spacing:-.0125em}.skippr\\:tracking-\\[0\\.02em\\]{--tw-tracking:.02em;letter-spacing:.02em}.skippr\\:tracking-\\[0\\.05em\\]{--tw-tracking:.05em;letter-spacing:.05em}.skippr\\:whitespace-nowrap{white-space:nowrap}.skippr\\:text-\\[\\#2D2D3F\\]{color:#2d2d3f}.skippr\\:text-\\[\\#5a5650\\]{color:#5a5650}.skippr\\:text-\\[\\#5c5850\\]{color:#5c5850}.skippr\\:text-\\[\\#6b6660\\]{color:#6b6660}.skippr\\:text-\\[\\#6b6875\\]{color:#6b6875}.skippr\\:text-\\[\\#8b877f\\]{color:#8b877f}.skippr\\:text-\\[\\#92400e\\]{color:#92400e}.skippr\\:text-\\[\\#a8a49c\\]{color:#a8a49c}.skippr\\:text-\\[\\#b8b4ac\\]{color:#b8b4ac}.skippr\\:text-\\[\\#c9c5bd\\]{color:#c9c5bd}.skippr\\:text-\\[\\#cbc7bf\\]{color:#cbc7bf}.skippr\\:text-\\[\\#dc2626\\]{color:#dc2626}.skippr\\:text-\\[var\\(--skippr-brand-deep\\)\\]{color:var(--skippr-brand-deep)}.skippr\\:text-amber-700{color:var(--skippr-color-amber-700)}.skippr\\:text-amber-950{color:var(--skippr-color-amber-950)}.skippr\\:text-background{color:oklch(100% 0 0)}.skippr\\:text-black,.skippr\\:text-black\\/40{color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-black\\/40{color:color-mix(in oklab,var(--skippr-color-black)40%,transparent)}}.skippr\\:text-brand{color:var(--skippr-brand,#2bc0ae)}.skippr\\:text-brand-on-white{color:var(--skippr-brand-on-white,#1e8478)}.skippr\\:text-bubble{color:#2d2b3d}.skippr\\:text-chart-3{color:oklch(66.6% .179 58.318)}.skippr\\:text-destructive{color:#d94f4f}.skippr\\:text-foreground{color:oklch(14.7% .004 49.25)}.skippr\\:text-muted-foreground{color:oklch(55.3% .013 58.071)}.skippr\\:text-muted-foreground\\/30{color:oklab(55.3% .00687528 .0110332/.3)}.skippr\\:text-muted-foreground\\/60{color:oklab(55.3% .00687528 .0110332/.6)}.skippr\\:text-neutral-500{color:var(--skippr-color-neutral-500)}.skippr\\:text-neutral-700{color:var(--skippr-color-neutral-700)}.skippr\\:text-primary{color:var(--skippr-brand,#2d2b3d)}.skippr\\:text-primary-foreground{color:var(--skippr-brand-foreground,#fff)}.skippr\\:text-red-400{color:var(--skippr-color-red-400)}.skippr\\:text-red-600{color:var(--skippr-color-red-600)}.skippr\\:text-red-700{color:var(--skippr-color-red-700)}.skippr\\:text-secondary-foreground{color:#613700}.skippr\\:text-white,.skippr\\:text-white\\/60{color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-white\\/60{color:color-mix(in oklab,var(--skippr-color-white)60%,transparent)}}.skippr\\:capitalize{text-transform:capitalize}.skippr\\:uppercase{text-transform:uppercase}.skippr\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.skippr\\:line-through{text-decoration-line:line-through}.skippr\\:underline{text-decoration-line:underline}.skippr\\:decoration-muted-foreground\\/40{text-decoration-color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:underline-offset-2,.skippr\\:underline-offset-\\[2px\\]{text-underline-offset:2px}.skippr\\:placeholder-muted-foreground::placeholder{color:oklch(55.3% .013 58.071)}.skippr\\:opacity-0{opacity:0}.skippr\\:opacity-40{opacity:.4}.skippr\\:opacity-75{opacity:.75}.skippr\\:opacity-85{opacity:.85}.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-\\[-3px_0_14px_var\\(--skippr-brand-halo\\)\\]{--tw-shadow:-3px 0 14px var(--tw-shadow-color,var(--skippr-brand-halo));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-\\[-4px_6px_18px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:-4px 6px 18px var(--tw-shadow-color,#2d2d3f29);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[-6px_8px_30px_rgba\\(15\\,18\\,26\\,0\\.32\\)\\]{--tw-shadow:-6px 8px 30px var(--tw-shadow-color,#0f121a52);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_-3px_14px_var\\(--skippr-brand-halo\\)\\]{--tw-shadow:0 -3px 14px var(--tw-shadow-color,var(--skippr-brand-halo));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_-6px_18px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:0 -6px 18px var(--tw-shadow-color,#2d2d3f29);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_0_0_1\\.5px_rgba\\(255\\,255\\,255\\,0\\.85\\)\\]{--tw-shadow:0 0 0 1.5px var(--tw-shadow-color,#ffffffd9);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_0_0_1px_rgba\\(45\\,45\\,63\\,0\\.10\\)\\,0_1px_2px_rgba\\(45\\,45\\,63\\,0\\.04\\)\\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,#2d2d3f1a),0 1px 2px var(--tw-shadow-color,#2d2d3f0a);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_0_0_4px_var\\(--skippr-brand-ring\\)\\]{--tw-shadow:0 0 0 4px var(--tw-shadow-color,var(--skippr-brand-ring));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_1px_2px_rgba\\(45\\,45\\,63\\,0\\.05\\)\\]{--tw-shadow:0 1px 2px var(--tw-shadow-color,#2d2d3f0d);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_1px_2px_rgba\\(45\\,45\\,63\\,0\\.08\\)\\]{--tw-shadow:0 1px 2px var(--tw-shadow-color,#2d2d3f14);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_2px_6px_rgba\\(0\\,0\\,0\\,0\\.28\\)\\]{--tw-shadow:0 2px 6px var(--tw-shadow-color,#00000047);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_2px_6px_rgba\\(45\\,45\\,63\\,0\\.14\\)\\]{--tw-shadow:0 2px 6px var(--tw-shadow-color,#2d2d3f24);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_3px_14px_var\\(--skippr-brand-halo\\)\\]{--tw-shadow:0 3px 14px var(--tw-shadow-color,var(--skippr-brand-halo));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\\(45\\,45\\,63\\,0\\.1\\)\\]{--tw-shadow:0 4px 12px var(--tw-shadow-color,#2d2d3f1a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_14px_rgba\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_14px_rgba\\(239\\,68\\,68\\,0\\.45\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#ef444473);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_16px_rgba\\(45\\,43\\,61\\,0\\.45\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#2d2b3d73),0 2px 4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_6px_16px_rgba\\(45\\,45\\,63\\,0\\.14\\)\\]{--tw-shadow:0 6px 16px var(--tw-shadow-color,#2d2d3f24);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_6px_18px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:0 6px 18px var(--tw-shadow-color,#2d2d3f29);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_22px_rgba\\(45\\,45\\,63\\,0\\.12\\)\\,0_1px_3px_rgba\\(45\\,45\\,63\\,0\\.04\\)\\]{--tw-shadow:0 8px 22px var(--tw-shadow-color,#2d2d3f1f),0 1px 3px var(--tw-shadow-color,#2d2d3f0a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(45\\,43\\,61\\,0\\.35\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#2d2b3d59);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_30px_rgba\\(45\\,45\\,63\\,0\\.14\\)\\,0_2px_6px_rgba\\(45\\,45\\,63\\,0\\.06\\)\\]{--tw-shadow:0 8px 30px var(--tw-shadow-color,#2d2d3f24),0 2px 6px var(--tw-shadow-color,#2d2d3f0f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_26px_rgba\\(45\\,45\\,63\\,0\\.13\\)\\,0_2px_6px_rgba\\(45\\,45\\,63\\,0\\.05\\)\\]{--tw-shadow:0 10px 26px var(--tw-shadow-color,#2d2d3f21),0 2px 6px var(--tw-shadow-color,#2d2d3f0d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_28px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:0 10px 28px var(--tw-shadow-color,#2d2d3f29);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_30px_rgba\\(45\\,45\\,63\\,0\\.14\\)\\,0_0_0_1\\.5px_var\\(--skippr-brand-ring\\)\\]{--tw-shadow:0 10px 30px var(--tw-shadow-color,#2d2d3f24),0 0 0 1.5px var(--tw-shadow-color,var(--skippr-brand-ring));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_32px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 10px 32px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_14px_34px_rgba\\(45\\,45\\,63\\,0\\.15\\)\\,0_2px_6px_rgba\\(45\\,45\\,63\\,0\\.06\\)\\]{--tw-shadow:0 14px 34px var(--tw-shadow-color,#2d2d3f26),0 2px 6px var(--tw-shadow-color,#2d2d3f0f);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-\\[3px_0_14px_var\\(--skippr-brand-halo\\)\\]{--tw-shadow:3px 0 14px var(--tw-shadow-color,var(--skippr-brand-halo));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-\\[4px_6px_18px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:4px 6px 18px var(--tw-shadow-color,#2d2d3f29);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-\\[inset_0_0_0_1\\.5px_var\\(--skippr-brand\\,\\#2bc0ae\\)\\]{--tw-shadow:inset 0 0 0 1.5px var(--tw-shadow-color,var(--skippr-brand,#2bc0ae));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-black\\/5{--tw-ring-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-black\\/5{--tw-ring-color:color-mix(in oklab,var(--skippr-color-black)5%,transparent)}}.skippr\\:ring-brand{--tw-ring-color:var(--skippr-brand,#2bc0ae)}.skippr\\:ring-white\\/15{--tw-ring-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-white\\/15{--tw-ring-color:color-mix(in oklab,var(--skippr-color-white)15%,transparent)}}.skippr\\:ring-offset-background{--tw-ring-offset-color:oklch(100% 0 0)}.skippr\\:drop-shadow-\\[0_2px_5px_rgba\\(0\\,0\\,0\\,0\\.4\\)\\]{--tw-drop-shadow-size:drop-shadow(0 2px 5px var(--tw-drop-shadow-color,#0006));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.skippr\\:backdrop-blur-sm{--tw-backdrop-blur:blur(var(--skippr-blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.skippr\\:transition-\\[filter\\]{transition-property:filter;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[gap\\]{transition-property:gap;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[height\\]{transition-property:height;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[left\\]{transition-property:left;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\\,color\\]{transition-property:opacity,color;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[opacity\\,transform\\,height\\]{transition-property:opacity,transform,height;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[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\\,height\\,background-color\\,border-color\\]{transition-property:width,height,background-color,border-color;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\,margin\\]{transition-property:width,margin;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-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\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:duration-75{--tw-duration:75ms;transition-duration:75ms}.skippr\\:duration-100{--tw-duration:.1s;transition-duration:.1s}.skippr\\:duration-150{--tw-duration:.15s;transition-duration:.15s}.skippr\\:duration-200{--tw-duration:.2s;transition-duration:.2s}.skippr\\:duration-300{--tw-duration:.3s;transition-duration:.3s}.skippr\\:duration-\\[400ms\\]{--tw-duration:.4s;transition-duration:.4s}.skippr\\:ease-\\[cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{--tw-ease:cubic-bezier(.22,1,.36,1);transition-timing-function:cubic-bezier(.22,1,.36,1)}.skippr\\:ease-\\[cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)\\]{--tw-ease:cubic-bezier(.34,1.3,.64,1);transition-timing-function:cubic-bezier(.34,1.3,.64,1)}.skippr\\:ease-\\[cubic-bezier\\(0\\.34\\,1\\.56\\,0\\.64\\,1\\)\\]{--tw-ease:cubic-bezier(.34,1.56,.64,1);transition-timing-function:cubic-bezier(.34,1.56,.64,1)}.skippr\\:ease-in-out{--tw-ease:var(--skippr-ease-in-out);transition-timing-function:var(--skippr-ease-in-out)}.skippr\\:ease-out{--tw-ease:var(--skippr-ease-out);transition-timing-function:var(--skippr-ease-out)}.skippr\\:outline-none{--tw-outline-style:none;outline-style:none}.skippr\\:select-none{-webkit-user-select:none;user-select:none}.skippr\\:select-text{-webkit-user-select:text;user-select:text}.skippr\\:\\[animation-delay\\:0ms\\]{animation-delay:0s}.skippr\\:\\[animation-delay\\:150ms\\]{animation-delay:.15s}.skippr\\:\\[animation-delay\\:200ms\\]{animation-delay:.2s}.skippr\\:\\[animation-delay\\:300ms\\]{animation-delay:.3s}.skippr\\:\\[animation-delay\\:400ms\\]{animation-delay:.4s}.skippr\\:\\[overflow-anchor\\:none\\]{overflow-anchor:none}.skippr\\:group-focus-within\\:scale-100:is(:where(.skippr\\:group):focus-within *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-focus-within\\:opacity-100:is(:where(.skippr\\:group):focus-within *){opacity:1}@media (hover:hover){.skippr\\:group-hover\\:scale-100:is(:where(.skippr\\:group):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-hover\\:text-red-300:is(:where(.skippr\\:group):hover *){color:var(--skippr-color-red-300)}.skippr\\:group-hover\\:text-white\\/80:is(:where(.skippr\\:group):hover *){color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:group-hover\\:text-white\\/80:is(:where(.skippr\\:group):hover *){color:color-mix(in oklab,var(--skippr-color-white)80%,transparent)}}.skippr\\:group-hover\\:opacity-100:is(:where(.skippr\\:group):hover *){opacity:1}}.skippr\\:placeholder\\:text-\\[\\#b0aca4\\]::placeholder{color:#b0aca4}.skippr\\:first\\:mt-0:first-child{margin-top:calc(var(--skippr-spacing)*0)}@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\\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:hover\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.45\\)\\]:hover{border-color:#2d2d3f73}.skippr\\:hover\\:bg-\\[\\#3a384b\\]:hover{background-color:#3a384b}.skippr\\:hover\\:bg-\\[\\#3d3d52\\]:hover{background-color:#3d3d52}.skippr\\:hover\\:bg-\\[\\#f2f0eb\\]:hover{background-color:#f2f0eb}.skippr\\:hover\\:bg-\\[\\#f4f2ee\\]:hover{background-color:#f4f2ee}.skippr\\:hover\\:bg-\\[\\#f6f4f0\\]:hover{background-color:#f6f4f0}.skippr\\:hover\\:bg-\\[rgba\\(45\\,45\\,63\\,0\\.04\\)\\]:hover{background-color:#2d2d3f0a}.skippr\\:hover\\:bg-accent:hover{background-color:#e7e5e4}.skippr\\:hover\\:bg-amber-100:hover{background-color:var(--skippr-color-amber-100)}.skippr\\:hover\\:bg-bubble:hover{background-color:#2d2b3d}.skippr\\:hover\\:bg-destructive\\/90:hover{background-color:oklab(61.4357% .15892 .0698893/.9)}.skippr\\:hover\\:bg-foreground\\/8:hover{background-color:oklab(14.7% .00261104 .00303026/.08)}.skippr\\:hover\\:bg-muted:hover{background-color:oklch(97% .001 106.424)}.skippr\\:hover\\:bg-neutral-100:hover{background-color:var(--skippr-color-neutral-100)}.skippr\\:hover\\:bg-neutral-200:hover{background-color:var(--skippr-color-neutral-200)}.skippr\\:hover\\:bg-primary\\/90:hover{background-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)90%,transparent)}}.skippr\\:hover\\:bg-red-200:hover{background-color:var(--skippr-color-red-200)}.skippr\\:hover\\:bg-red-600:hover{background-color:var(--skippr-color-red-600)}.skippr\\:hover\\:bg-secondary\\/80:hover{background-color:oklab(91.9963% .0175391 .0626889/.8)}.skippr\\:hover\\:bg-transparent:hover{background-color:#0000}.skippr\\:hover\\:text-\\[\\#2D2D3F\\]:hover{color:#2d2d3f}.skippr\\:hover\\:text-\\[\\#5a5650\\]:hover{color:#5a5650}.skippr\\:hover\\:text-accent-foreground:hover{color:oklch(21.6% .006 56.043)}.skippr\\:hover\\:text-destructive:hover{color:#d94f4f}.skippr\\:hover\\:text-foreground:hover{color:oklch(14.7% .004 49.25)}.skippr\\:hover\\:underline:hover{text-decoration-line:underline}.skippr\\:hover\\:decoration-muted-foreground:hover{text-decoration-color:oklch(55.3% .013 58.071)}.skippr\\:hover\\:opacity-80:hover{opacity:.8}.skippr\\:hover\\:opacity-100:hover{opacity:1}.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\\:hover\\:brightness-\\[1\\.04\\]:hover{--tw-brightness:brightness(1.04);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\\:hover\\:brightness-\\[1\\.06\\]:hover{--tw-brightness:brightness(1.06);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\\:border-primary:focus{border-color:var(--skippr-brand,#2d2b3d)}.skippr\\:focus\\:ring-2:focus{--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\\:ring-primary\\/30:focus{--tw-ring-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:focus\\:ring-primary\\/30:focus{--tw-ring-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)30%,transparent)}}.skippr\\:focus-visible\\:border-\\[var\\(--skippr-brand-ring\\)\\]:focus-visible{border-color:var(--skippr-brand-ring)}.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-\\[var\\(--skippr-brand-ring\\)\\]:focus-visible{--tw-ring-color:var(--skippr-brand-ring)}.skippr\\:focus-visible\\:ring-bubble\\/60:focus-visible{--tw-ring-color:oklab(29.9244% .0107414 -.0305411/.6)}.skippr\\:focus-visible\\:ring-ring:focus-visible{--tw-ring-color:oklch(70.9% .01 56.259)}.skippr\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.skippr\\:focus-visible\\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.skippr\\:focus-visible\\:outline-offset-2:focus-visible{outline-offset:2px}.skippr\\:focus-visible\\:outline-\\[var\\(--skippr-brand\\)\\]:focus-visible{outline-color:var(--skippr-brand)}.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\\:active\\:scale-\\[0\\.98\\]:active{scale:.98}.skippr\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.skippr\\:disabled\\:cursor-default:disabled{cursor:default}.skippr\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.skippr\\:disabled\\:opacity-50:disabled{opacity:.5}.skippr\\:disabled\\:opacity-60:disabled{opacity:.6}.skippr\\:disabled\\:opacity-80:disabled{opacity:.8}@media (hover:hover){.skippr\\:disabled\\:hover\\:bg-\\[\\#2D2D3F\\]:disabled:hover{background-color:#2d2d3f}.skippr\\:disabled\\:hover\\:bg-white:disabled:hover{background-color:var(--skippr-color-white)}}@media (prefers-reduced-motion:reduce){.skippr\\:motion-reduce\\:hidden{display:none}.skippr\\:motion-reduce\\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:motion-reduce\\:animate-none{animation:none}}.skippr\\:\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.skippr\\:\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.skippr\\:\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}}:host{--skippr-brand-active:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-active:color-mix(in srgb,var(--skippr-brand,#2bc0ae)93%,#000)}}:host{--skippr-brand-deep:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-deep:color-mix(in srgb,var(--skippr-brand,#2bc0ae)78%,#000)}}:host{--skippr-brand-ring:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-ring:color-mix(in srgb,var(--skippr-brand,#2bc0ae)22%,transparent)}}:host{--skippr-brand-halo:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-halo:color-mix(in srgb,var(--skippr-brand,#2bc0ae)40%,transparent)}}:host{--skippr-brand-glow:linear-gradient(90deg,var(--skippr-brand,#2bc0ae),var(--skippr-brand,#2bc0ae),var(--skippr-brand,#2bc0ae),var(--skippr-brand,#2bc0ae),var(--skippr-brand,#2bc0ae))}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-glow:linear-gradient(90deg,var(--skippr-brand,#2bc0ae),color-mix(in srgb,var(--skippr-brand,#2bc0ae)55%,#fff),color-mix(in srgb,var(--skippr-brand,#2bc0ae)72%,#fff),var(--skippr-brand,#2bc0ae),color-mix(in srgb,var(--skippr-brand,#2bc0ae)42%,#fff))}}@keyframes skippr-tap{0%{transform:scale(1)}45%{transform:scale(.7)}to{transform:scale(1)}}@keyframes skippr-press{0%{transform:scale(1)}55%{transform:scale(1)}85%{transform:scale(.68)}to{transform:scale(1)}}@keyframes skippr-cursor-pop{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}@keyframes skippr-click-ping{0%{opacity:.9;transform:translate(-50%,-50%)scale(.4)}to{opacity:0;transform:translate(-50%,-50%)scale(2.4)}}@keyframes skippr-tab-fade{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-speak{0%,to{opacity:.6;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-thinking-dot{0%,80%,to{opacity:.2;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}@keyframes skippr-pulse-ring{0%,to{box-shadow:0 0 #2d2b3d66}50%{box-shadow:0 0 0 10px #2d2b3d00}}@keyframes skippr-rec-ring{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)55%,transparent)}70%{box-shadow:0 0 0 11px #0000}to{box-shadow:0 0 #0000}}@keyframes skippr-voice-pulse{0%{box-shadow:0 0 0 0 var(--skippr-pulse-color,#2bc0ae80)}70%{box-shadow:0 0 0 8px #0000}to{box-shadow:0 0 #0000}}@keyframes skippr-ptt-transmit{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)60%,transparent),0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)35%,transparent)}70%{box-shadow:0 0 0 9px #0000,0 0 0 16px #0000}to{box-shadow:0 0 #0000,0 0 #0000}}@keyframes skippr-annotation-pulse{0%,to{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)50%,transparent)}50%{box-shadow:0 0 0 6px #0000}}@keyframes skippr-speak-ripple{0%{opacity:.6;transform:scale(1)}to{opacity:0;transform:scale(1.8)}}@keyframes skippr-bar{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}@keyframes skippr-breathe{0%,to{opacity:.85;transform:scale(1)}50%{opacity:1;transform:scale(1.08)}}@keyframes skippr-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-evaporate{0%{opacity:1;filter:blur();transform:translateY(0)scale(1)}55%{opacity:.85;filter:blur()}to{opacity:0;filter:blur(2.5px);transform:translateY(-7px)scale(.965)}}@keyframes skippr-mote-rise{0%{opacity:0;transform:translateY(2px)scale(.5)}25%{opacity:.85}to{opacity:0;transform:translateY(-24px)scale(1)}}@keyframes skippr-flow{0%{background-position:0%}50%{background-position:100%}to{background-position:0%}}@keyframes skippr-wave{0%,to{opacity:.4;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-bubble-in{0%{opacity:0;transform:translateY(12px)scale(.96)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-tip-in{0%{opacity:0;transform:translateY(14px)scale(.96)}60%{opacity:1;transform:translateY(-2px)scale(1.01)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-pill-content{0%{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}@keyframes skippr-banner-look{0%,to{transform:translate(0)}25%{transform:translate(-2px)}75%{transform:translate(2px)}}@keyframes skippr-finger-tap{0%,to{transform:translateY(0)rotate(0)}50%{transform:translateY(2px)rotate(-6deg)}}@keyframes skippr-toolset-pop{0%{opacity:0;transform:scale(.85)}to{opacity:1;transform:scale(1)}}@keyframes skippr-stage-fade{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}@keyframes skippr-agent-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}@keyframes skippr-orb-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}@keyframes skippr-pop{0%{opacity:0;transform:translateY(6px)scale(.98)}to{opacity:1;transform:none}}@keyframes skippr-blink{0%,40%{transform:scaleY(1)}41.3%,42%{transform:scaleY(.08)}43.3%,70%{transform:scaleY(1)}71.3%,72%{transform:scaleY(.08)}73.3%,to{transform:scaleY(1)}}.skippr-buddy-blink{transform-box:fill-box;transform-origin:50%;animation:5s linear infinite skippr-blink}@keyframes skippr-avatar-eyes-bob{0%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(0)}18%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(24px)}33.33%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(-30px)}48%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(-7px)}64%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(-30px)}82%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(31px)}96%,to{transform:translateY(0)}}@keyframes skippr-avatar-pupil-glance{0%,21.33%{transform:translate(0)}28%,68%{transform:translate(-30px)}74%,to{transform:translate(0)}}@keyframes skippr-avatar-body-vibe{0%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1)}17.67%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1.08,.95)}33.67%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1)}49.67%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1.08,.95)}65.67%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1)}81.67%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1.08,.95)}96%,to{transform:scale(1)}}@keyframes skippr-avatar-blink{0%,40%{transform:scaleY(1)}41.3%,42%{transform:scaleY(.08)}43.3%,70%{transform:scaleY(1)}71.3%,72%{transform:scaleY(.08)}73.3%,to{transform:scaleY(1)}}@keyframes skippr-avatar-bub-tail-drift{0%,10%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translate(0)}45%,60%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translate(-24px)}95%,to{transform:translate(0)}}@keyframes skippr-avatar-antenna-shake{0%,to{transform:rotate(-4deg)}25%{transform:rotate(4deg)}50%{transform:rotate(-3deg)}75%{transform:rotate(3deg)}}.skippr-avatar-eyes{animation:5s infinite skippr-avatar-eyes-bob}.skippr-avatar-pupil{animation:5s linear infinite skippr-avatar-pupil-glance}.skippr-avatar-body{transform-box:fill-box;transform-origin:50% 100%;animation:5s infinite skippr-avatar-body-vibe}.skippr-avatar-blink{transform-box:fill-box;transform-origin:50%;animation:5s infinite skippr-avatar-blink}.skippr-avatar-body .skippr-avatar-antenna{transform-box:view-box;transform-origin:48px 22px;animation:1.6s ease-in-out infinite skippr-avatar-antenna-shake}.skippr-avatar-body .skippr-avatar-bub-tail{animation:5s infinite skippr-avatar-bub-tail-drift}@keyframes skippr-buddy-bob{0%,to{transform:translateY(0)}50%{transform:translateY(-3px)}}@keyframes skippr-buddy-breathe{0%,to{transform:scale(1)}50%{transform:scale(1.15)}}@keyframes skippr-buddy-pop{0%{transform:scale(1)}50%{transform:scale(1.06)}to{transform:scale(1)}}@keyframes skippr-buddy-sleep{0%,to{transform:translateY(0)scale(1)}50%{transform:translateY(1px)scale(.995)}}@keyframes skippr-buddy-zfloat{0%{opacity:0;transform:translateY(0)}20%{opacity:1}to{opacity:0;transform:translateY(-10px)}}@keyframes skippr-peek-left{0%,20%{transform:translate(-58%)}46%,66%{transform:translate(0)}92%,to{transform:translate(-58%)}}@keyframes skippr-peek-right{0%,20%{transform:translate(58%)}46%,66%{transform:translate(0)}92%,to{transform:translate(58%)}}@keyframes skippr-peek-top{0%,20%{transform:translateY(-58%)}46%,66%{transform:translateY(0)}92%,to{transform:translateY(-58%)}}@keyframes skippr-peek-bottom{0%,20%{transform:translateY(58%)}46%,66%{transform:translateY(0)}92%,to{transform:translateY(58%)}}.skippr-peek-left{animation:3.6s ease-in-out infinite skippr-peek-left}.skippr-peek-right{animation:3.6s ease-in-out infinite skippr-peek-right}.skippr-peek-top{animation:3.6s ease-in-out infinite skippr-peek-top}.skippr-peek-bottom{animation:3.6s ease-in-out infinite skippr-peek-bottom}.skippr-peek-out{animation:none;transform:none}@keyframes skippr-fade-out{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(4px)}}@keyframes skippr-block-reveal{0%{opacity:0;max-height:0;transform:translateY(-4px)}55%{opacity:1}to{opacity:1;max-height:260px;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){.skippr-buddy-blink,[style*=skippr-blink],[style*=skippr-buddy-bob],[style*=skippr-buddy-breathe],[style*=skippr-buddy-pop],[style*=skippr-buddy-sleep],[style*=skippr-buddy-zfloat],.skippr-avatar-eyes,.skippr-avatar-pupil,.skippr-avatar-body,.skippr-avatar-blink,.skippr-avatar-body .skippr-avatar-antenna,.skippr-avatar-body .skippr-avatar-bub-tail,.skippr-peek-left,.skippr-peek-right,.skippr-peek-top,.skippr-peek-bottom{animation-play-state:paused}}.skippr-no-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.skippr-no-scrollbar::-webkit-scrollbar{display:none}:host{color:var(--color-foreground)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@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}}`;
|
|
8744
8979
|
const hostStyle = accentColor && isHexColor(accentColor) ? {
|
|
8745
8980
|
"--skippr-brand": accentColor,
|
|
8746
8981
|
"--skippr-brand-foreground": brandForeground(accentColor),
|
|
@@ -8772,7 +9007,7 @@ function ShadowHost({
|
|
|
8772
9007
|
}
|
|
8773
9008
|
|
|
8774
9009
|
// src/components/Sidebar.tsx
|
|
8775
|
-
import { useCallback as useCallback28, useContext as useContext18, useEffect as
|
|
9010
|
+
import { useCallback as useCallback28, useContext as useContext18, useEffect as useEffect38, useRef as useRef33 } from "react";
|
|
8776
9011
|
|
|
8777
9012
|
// src/hooks/useCombinedMessages.ts
|
|
8778
9013
|
import { useContext as useContext12, useMemo as useMemo8 } from "react";
|
|
@@ -8905,7 +9140,7 @@ function useLinkCard() {
|
|
|
8905
9140
|
}
|
|
8906
9141
|
|
|
8907
9142
|
// src/hooks/usePhaseUpdates.ts
|
|
8908
|
-
import { useCallback as useCallback24, useContext as useContext13, useEffect as
|
|
9143
|
+
import { useCallback as useCallback24, useContext as useContext13, useEffect as useEffect33 } from "react";
|
|
8909
9144
|
function parsePhases(json) {
|
|
8910
9145
|
try {
|
|
8911
9146
|
const data = JSON.parse(json);
|
|
@@ -8919,7 +9154,7 @@ function usePhaseUpdates() {
|
|
|
8919
9154
|
const parse = useCallback24(parsePhases, []);
|
|
8920
9155
|
const livePhases = useAgentState("phases", parse, []);
|
|
8921
9156
|
const ctx = useContext13(LiveAgentContext);
|
|
8922
|
-
|
|
9157
|
+
useEffect33(() => {
|
|
8923
9158
|
if (livePhases.length > 0)
|
|
8924
9159
|
ctx?.setPhasesSnapshot(livePhases);
|
|
8925
9160
|
}, [livePhases, ctx?.setPhasesSnapshot]);
|
|
@@ -8928,7 +9163,7 @@ function usePhaseUpdates() {
|
|
|
8928
9163
|
}
|
|
8929
9164
|
|
|
8930
9165
|
// src/hooks/useSessionRemaining.ts
|
|
8931
|
-
import { useEffect as
|
|
9166
|
+
import { useEffect as useEffect34, useRef as useRef28, useState as useState26 } from "react";
|
|
8932
9167
|
|
|
8933
9168
|
// src/lib/format.ts
|
|
8934
9169
|
function formatTime(seconds) {
|
|
@@ -8945,8 +9180,8 @@ function parseNumber(s) {
|
|
|
8945
9180
|
function useSessionRemaining() {
|
|
8946
9181
|
const maxCallDuration = useAgentState("maxCallDuration", parseNumber, null);
|
|
8947
9182
|
const endTimeRef = useRef28(null);
|
|
8948
|
-
const [remaining, setRemaining] =
|
|
8949
|
-
|
|
9183
|
+
const [remaining, setRemaining] = useState26(null);
|
|
9184
|
+
useEffect34(() => {
|
|
8950
9185
|
if (maxCallDuration === null || endTimeRef.current !== null)
|
|
8951
9186
|
return;
|
|
8952
9187
|
const endTime = Date.now() + maxCallDuration * 1000;
|
|
@@ -9217,26 +9452,26 @@ function LogoMark({ className, decorative }) {
|
|
|
9217
9452
|
}
|
|
9218
9453
|
|
|
9219
9454
|
// src/components/MessageList.tsx
|
|
9220
|
-
import { useCallback as useCallback27, useLayoutEffect as useLayoutEffect3, useRef as useRef32, useState as
|
|
9455
|
+
import { useCallback as useCallback27, useLayoutEffect as useLayoutEffect3, useRef as useRef32, useState as useState30 } from "react";
|
|
9221
9456
|
|
|
9222
9457
|
// src/components/ChatInput.tsx
|
|
9223
|
-
import { useContext as useContext16, useEffect as
|
|
9458
|
+
import { useContext as useContext16, useEffect as useEffect35, useRef as useRef30, useState as useState27 } from "react";
|
|
9224
9459
|
import { jsx as jsx31, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
9225
9460
|
var MAX_INPUT_HEIGHT = 60;
|
|
9226
9461
|
function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
|
|
9227
9462
|
const ctx = useContext16(LiveAgentContext);
|
|
9228
9463
|
const reportChatActivity = ctx?.reportChatActivity;
|
|
9229
9464
|
const isPanelOpen = ctx?.isPanelOpen;
|
|
9230
|
-
const [localDraft, setLocalDraft] =
|
|
9465
|
+
const [localDraft, setLocalDraft] = useState27("");
|
|
9231
9466
|
const inputText = ctx?.chatDraft ?? localDraft;
|
|
9232
9467
|
const setInputText = ctx?.setChatDraft ?? setLocalDraft;
|
|
9233
9468
|
const textareaRef = useRef30(null);
|
|
9234
9469
|
const canSend = inputText.trim().length > 0 && !isSendingChat;
|
|
9235
|
-
|
|
9470
|
+
useEffect35(() => {
|
|
9236
9471
|
if (autoFocus && isPanelOpen !== false)
|
|
9237
9472
|
textareaRef.current?.focus();
|
|
9238
9473
|
}, [autoFocus, isPanelOpen]);
|
|
9239
|
-
|
|
9474
|
+
useEffect35(() => {
|
|
9240
9475
|
const el = textareaRef.current;
|
|
9241
9476
|
if (!el)
|
|
9242
9477
|
return;
|
|
@@ -9327,7 +9562,7 @@ function ChatMessage({ message }) {
|
|
|
9327
9562
|
}
|
|
9328
9563
|
|
|
9329
9564
|
// src/components/LinkCard.tsx
|
|
9330
|
-
import { useCallback as useCallback26, useEffect as
|
|
9565
|
+
import { useCallback as useCallback26, useEffect as useEffect36, useRef as useRef31, useState as useState28 } from "react";
|
|
9331
9566
|
|
|
9332
9567
|
// src/lib/clipboard.ts
|
|
9333
9568
|
async function copyToClipboard(text) {
|
|
@@ -9344,15 +9579,15 @@ import { jsx as jsx33, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
|
9344
9579
|
var COPIED_RESET_MS = 2000;
|
|
9345
9580
|
var DISMISS_AFTER_COPY_MS = 3000;
|
|
9346
9581
|
function LinkCard({ card, onDismiss }) {
|
|
9347
|
-
const [copied, setCopied] =
|
|
9582
|
+
const [copied, setCopied] = useState28(false);
|
|
9348
9583
|
const dismissTimerRef = useRef31(null);
|
|
9349
|
-
|
|
9584
|
+
useEffect36(() => {
|
|
9350
9585
|
if (!copied)
|
|
9351
9586
|
return;
|
|
9352
9587
|
const timer = setTimeout(() => setCopied(false), COPIED_RESET_MS);
|
|
9353
9588
|
return () => clearTimeout(timer);
|
|
9354
9589
|
}, [copied]);
|
|
9355
|
-
|
|
9590
|
+
useEffect36(() => {
|
|
9356
9591
|
return () => {
|
|
9357
9592
|
if (dismissTimerRef.current)
|
|
9358
9593
|
clearTimeout(dismissTimerRef.current);
|
|
@@ -9427,7 +9662,7 @@ function LinkCard({ card, onDismiss }) {
|
|
|
9427
9662
|
}
|
|
9428
9663
|
|
|
9429
9664
|
// src/components/PlanCard.tsx
|
|
9430
|
-
import { useEffect as
|
|
9665
|
+
import { useEffect as useEffect37, useState as useState29 } from "react";
|
|
9431
9666
|
import { jsx as jsx34, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
9432
9667
|
var APPROVE_MESSAGE = "Yes, go ahead.";
|
|
9433
9668
|
var CANCEL_MESSAGE = "No, cancel that.";
|
|
@@ -9455,8 +9690,8 @@ function StepIcon({ status }) {
|
|
|
9455
9690
|
}
|
|
9456
9691
|
function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
9457
9692
|
const awaitingApproval = plan.state === "proposed";
|
|
9458
|
-
const [isApproving, setIsApproving] =
|
|
9459
|
-
const [lastPlanId, setLastPlanId] =
|
|
9693
|
+
const [isApproving, setIsApproving] = useState29(false);
|
|
9694
|
+
const [lastPlanId, setLastPlanId] = useState29(plan.planId);
|
|
9460
9695
|
if (plan.planId !== lastPlanId) {
|
|
9461
9696
|
setLastPlanId(plan.planId);
|
|
9462
9697
|
setIsApproving(false);
|
|
@@ -9468,13 +9703,13 @@ function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
|
9468
9703
|
setIsApproving(false);
|
|
9469
9704
|
});
|
|
9470
9705
|
};
|
|
9471
|
-
|
|
9706
|
+
useEffect37(() => {
|
|
9472
9707
|
if (!isApproving)
|
|
9473
9708
|
return;
|
|
9474
9709
|
const timer = setTimeout(() => setIsApproving(false), APPROVING_RESET_MS);
|
|
9475
9710
|
return () => clearTimeout(timer);
|
|
9476
9711
|
}, [isApproving]);
|
|
9477
|
-
|
|
9712
|
+
useEffect37(() => {
|
|
9478
9713
|
if (plan.state !== "completed")
|
|
9479
9714
|
return;
|
|
9480
9715
|
const timer = setTimeout(onDismiss, COMPLETED_CARD_VISIBLE_MS);
|
|
@@ -9575,14 +9810,14 @@ function MessageList({
|
|
|
9575
9810
|
const containerRef = useRef32(null);
|
|
9576
9811
|
const isPinnedToBottom = useRef32(true);
|
|
9577
9812
|
const lastSeenMessageId = useRef32(undefined);
|
|
9578
|
-
const [showJumpToLatest, setShowJumpToLatest] =
|
|
9813
|
+
const [showJumpToLatest, setShowJumpToLatest] = useState30(false);
|
|
9579
9814
|
const lastMessage = messages.length > 0 ? messages[messages.length - 1] : undefined;
|
|
9580
|
-
const [dismissedPlanId, setDismissedPlanId] =
|
|
9815
|
+
const [dismissedPlanId, setDismissedPlanId] = useState30(null);
|
|
9581
9816
|
const dismissPlan = useCallback27(() => {
|
|
9582
9817
|
if (plan)
|
|
9583
9818
|
setDismissedPlanId(plan.planId);
|
|
9584
9819
|
}, [plan]);
|
|
9585
|
-
const [dismissedLinkCardId, setDismissedLinkCardId] =
|
|
9820
|
+
const [dismissedLinkCardId, setDismissedLinkCardId] = useState30(null);
|
|
9586
9821
|
const dismissLinkCard = useCallback27(() => {
|
|
9587
9822
|
if (linkCard)
|
|
9588
9823
|
setDismissedLinkCardId(linkCard.cardId);
|
|
@@ -9854,7 +10089,7 @@ function Sidebar({
|
|
|
9854
10089
|
...anchor2.style,
|
|
9855
10090
|
height: panelExpanded ? anchor2.availableHeight : `min(${PANEL_MAX_HEIGHT_PX}px, ${anchor2.availableHeight})`
|
|
9856
10091
|
} : undefined;
|
|
9857
|
-
|
|
10092
|
+
useEffect38(() => {
|
|
9858
10093
|
if (!isSidebar)
|
|
9859
10094
|
return;
|
|
9860
10095
|
const prop = position === "right" ? "marginRight" : "marginLeft";
|
|
@@ -9880,7 +10115,9 @@ function Sidebar({
|
|
|
9880
10115
|
draggable: followsPanel,
|
|
9881
10116
|
headerRef
|
|
9882
10117
|
}),
|
|
9883
|
-
authFailed ? /* @__PURE__ */ jsx39(AuthError, {
|
|
10118
|
+
authFailed ? /* @__PURE__ */ jsx39(AuthError, {
|
|
10119
|
+
locale: internalCtx?.locale
|
|
10120
|
+
}) : isAuthenticated && hasResolvedModules ? /* @__PURE__ */ jsx39(AuthenticatedContent, {
|
|
9884
10121
|
isConnected,
|
|
9885
10122
|
isPaused,
|
|
9886
10123
|
isPausing,
|
|
@@ -9991,7 +10228,8 @@ function AuthenticatedContent({
|
|
|
9991
10228
|
]
|
|
9992
10229
|
});
|
|
9993
10230
|
}
|
|
9994
|
-
function AuthError() {
|
|
10231
|
+
function AuthError({ locale }) {
|
|
10232
|
+
const copy = resolveAuthFailedCopy(locale);
|
|
9995
10233
|
return /* @__PURE__ */ jsxs31("div", {
|
|
9996
10234
|
className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:items-center skippr:justify-center skippr:px-6 skippr:py-4 skippr:text-center",
|
|
9997
10235
|
children: [
|
|
@@ -10000,11 +10238,11 @@ function AuthError() {
|
|
|
10000
10238
|
}),
|
|
10001
10239
|
/* @__PURE__ */ jsx39("p", {
|
|
10002
10240
|
className: "skippr:text-sm skippr:font-medium skippr:text-foreground",
|
|
10003
|
-
children:
|
|
10241
|
+
children: copy.title
|
|
10004
10242
|
}),
|
|
10005
10243
|
/* @__PURE__ */ jsx39("p", {
|
|
10006
10244
|
className: "skippr:mt-1 skippr:text-xs skippr:text-muted-foreground",
|
|
10007
|
-
children:
|
|
10245
|
+
children: copy.hint
|
|
10008
10246
|
})
|
|
10009
10247
|
]
|
|
10010
10248
|
});
|
|
@@ -10197,7 +10435,7 @@ import {
|
|
|
10197
10435
|
} from "react";
|
|
10198
10436
|
|
|
10199
10437
|
// src/hooks/useSplash.ts
|
|
10200
|
-
import { useCallback as useCallback29, useContext as useContext21, useMemo as useMemo9, useState as
|
|
10438
|
+
import { useCallback as useCallback29, useContext as useContext21, useMemo as useMemo9, useState as useState31 } from "react";
|
|
10201
10439
|
|
|
10202
10440
|
// src/lib/splashPresentation.ts
|
|
10203
10441
|
function resolveSplashSections(sections, iconUrls) {
|
|
@@ -10276,7 +10514,7 @@ function useSplash(surface, onDismiss) {
|
|
|
10276
10514
|
const splash = appearance?.splash ?? null;
|
|
10277
10515
|
const { micEnabled, screenEnabled, enableMic, enableScreen, releaseScreen } = splashMedia;
|
|
10278
10516
|
const toggleStartMuted = useCallback29(() => setStartMuted(!startMuted), [setStartMuted, startMuted]);
|
|
10279
|
-
const [optOutChecked, setOptOutChecked] =
|
|
10517
|
+
const [optOutChecked, setOptOutChecked] = useState31(false);
|
|
10280
10518
|
const toggleOptOut = useCallback29(() => setOptOutChecked((checked) => !checked), []);
|
|
10281
10519
|
const commitOptOut = useCallback29(() => {
|
|
10282
10520
|
if (optOutChecked)
|
|
@@ -11233,14 +11471,14 @@ function useBarNotifications() {
|
|
|
11233
11471
|
|
|
11234
11472
|
// src/components/VoiceBarFrame.tsx
|
|
11235
11473
|
import { useIsSpeaking, useLocalParticipant as useLocalParticipant12 } from "@livekit/components-react/hooks";
|
|
11236
|
-
import { useCallback as useCallback34, useContext as useContext26, useEffect as
|
|
11474
|
+
import { useCallback as useCallback34, useContext as useContext26, useEffect as useEffect47, useRef as useRef42, useState as useState38 } from "react";
|
|
11237
11475
|
|
|
11238
11476
|
// src/hooks/useKeyboardStop.ts
|
|
11239
|
-
import { useEffect as
|
|
11477
|
+
import { useEffect as useEffect39, useRef as useRef36 } from "react";
|
|
11240
11478
|
function useKeyboardStop({ enabled, onStop }) {
|
|
11241
11479
|
const handler = useRef36(onStop);
|
|
11242
11480
|
handler.current = onStop;
|
|
11243
|
-
|
|
11481
|
+
useEffect39(() => {
|
|
11244
11482
|
if (!enabled)
|
|
11245
11483
|
return;
|
|
11246
11484
|
const onKeyDown = (event) => {
|
|
@@ -11257,18 +11495,18 @@ function useKeyboardStop({ enabled, onStop }) {
|
|
|
11257
11495
|
}
|
|
11258
11496
|
|
|
11259
11497
|
// src/hooks/useSessionTimer.ts
|
|
11260
|
-
import { useEffect as
|
|
11498
|
+
import { useEffect as useEffect41, useState as useState33 } from "react";
|
|
11261
11499
|
|
|
11262
11500
|
// src/hooks/useElapsedSeconds.ts
|
|
11263
|
-
import { useEffect as
|
|
11501
|
+
import { useEffect as useEffect40, useRef as useRef37, useState as useState32 } from "react";
|
|
11264
11502
|
function useElapsedSeconds(isRunning, resetSignal) {
|
|
11265
|
-
const [elapsed, setElapsed] =
|
|
11503
|
+
const [elapsed, setElapsed] = useState32(0);
|
|
11266
11504
|
const accumulatedSecondsRef = useRef37(0);
|
|
11267
|
-
|
|
11505
|
+
useEffect40(() => {
|
|
11268
11506
|
accumulatedSecondsRef.current = 0;
|
|
11269
11507
|
setElapsed(0);
|
|
11270
11508
|
}, [resetSignal]);
|
|
11271
|
-
|
|
11509
|
+
useEffect40(() => {
|
|
11272
11510
|
if (!isRunning)
|
|
11273
11511
|
return;
|
|
11274
11512
|
const resumedAt = Date.now();
|
|
@@ -11293,8 +11531,8 @@ function useSessionTimer(isRunning, resetSignal) {
|
|
|
11293
11531
|
const active = isRunning && remaining !== null;
|
|
11294
11532
|
const warning = active && remaining !== null && remaining <= SESSION_TIMER_WARNING_S;
|
|
11295
11533
|
const revealCycle = !active ? null : warning ? "warning" : "normal";
|
|
11296
|
-
const [revealed, setRevealed] =
|
|
11297
|
-
|
|
11534
|
+
const [revealed, setRevealed] = useState33(false);
|
|
11535
|
+
useEffect41(() => {
|
|
11298
11536
|
if (!revealCycle) {
|
|
11299
11537
|
setRevealed(false);
|
|
11300
11538
|
return;
|
|
@@ -11322,7 +11560,7 @@ function useSessionTimer(isRunning, resetSignal) {
|
|
|
11322
11560
|
}
|
|
11323
11561
|
|
|
11324
11562
|
// src/hooks/useVoiceBarDrag.ts
|
|
11325
|
-
import { useEffect as
|
|
11563
|
+
import { useEffect as useEffect42, useRef as useRef38 } from "react";
|
|
11326
11564
|
import { flushSync as flushSync2 } from "react-dom";
|
|
11327
11565
|
var DRAG_THRESHOLD_PX2 = 5;
|
|
11328
11566
|
function useVoiceBarDrag(containerRef, onDrop, followRefs, reportDragging) {
|
|
@@ -11333,7 +11571,7 @@ function useVoiceBarDrag(containerRef, onDrop, followRefs, reportDragging) {
|
|
|
11333
11571
|
followTargetsRef.current = followRefs;
|
|
11334
11572
|
const reportDraggingRef = useRef38(reportDragging);
|
|
11335
11573
|
reportDraggingRef.current = reportDragging;
|
|
11336
|
-
|
|
11574
|
+
useEffect42(() => {
|
|
11337
11575
|
const el = containerRef.current;
|
|
11338
11576
|
if (!el)
|
|
11339
11577
|
return;
|
|
@@ -11483,7 +11721,7 @@ function useVoiceBarDrag(containerRef, onDrop, followRefs, reportDragging) {
|
|
|
11483
11721
|
}
|
|
11484
11722
|
|
|
11485
11723
|
// src/components/VoiceBarChatLine.tsx
|
|
11486
|
-
import { useCallback as useCallback32, useContext as useContext25, useEffect as
|
|
11724
|
+
import { useCallback as useCallback32, useContext as useContext25, useEffect as useEffect43, useRef as useRef39, useState as useState34 } from "react";
|
|
11487
11725
|
import { jsx as jsx48, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
11488
11726
|
var IDLE_HIDE_MS = 6000;
|
|
11489
11727
|
function VoiceBarChatLine({
|
|
@@ -11495,7 +11733,7 @@ function VoiceBarChatLine({
|
|
|
11495
11733
|
const { sendChatMessage, isSendingChat } = useChatMessages();
|
|
11496
11734
|
const ctx = useContext25(LiveAgentContext);
|
|
11497
11735
|
const reportChatActivity = ctx?.reportChatActivity;
|
|
11498
|
-
const [localDraft, setLocalDraft] =
|
|
11736
|
+
const [localDraft, setLocalDraft] = useState34("");
|
|
11499
11737
|
const text = ctx?.chatDraft ?? localDraft;
|
|
11500
11738
|
const setText = ctx?.setChatDraft ?? setLocalDraft;
|
|
11501
11739
|
const inputRef = useRef39(null);
|
|
@@ -11507,7 +11745,7 @@ function VoiceBarChatLine({
|
|
|
11507
11745
|
clearTimeout(idleTimerRef.current);
|
|
11508
11746
|
idleTimerRef.current = setTimeout(() => onCloseRef.current(), IDLE_HIDE_MS);
|
|
11509
11747
|
}, []);
|
|
11510
|
-
|
|
11748
|
+
useEffect43(() => {
|
|
11511
11749
|
inputRef.current?.focus();
|
|
11512
11750
|
armIdle();
|
|
11513
11751
|
return () => {
|
|
@@ -11576,20 +11814,20 @@ function VoiceBarChatLine({
|
|
|
11576
11814
|
}
|
|
11577
11815
|
|
|
11578
11816
|
// src/components/VoiceBarLinkCard.tsx
|
|
11579
|
-
import { useCallback as useCallback33, useEffect as
|
|
11817
|
+
import { useCallback as useCallback33, useEffect as useEffect44, useRef as useRef40, useState as useState35 } from "react";
|
|
11580
11818
|
import { jsx as jsx49, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
11581
11819
|
var COPIED_RESET_MS2 = 2000;
|
|
11582
11820
|
var DISMISS_AFTER_COPY_MS2 = 3000;
|
|
11583
11821
|
function VoiceBarLinkCard({ card, onDismiss }) {
|
|
11584
|
-
const [copied, setCopied] =
|
|
11822
|
+
const [copied, setCopied] = useState35(false);
|
|
11585
11823
|
const dismissTimerRef = useRef40(null);
|
|
11586
|
-
|
|
11824
|
+
useEffect44(() => {
|
|
11587
11825
|
if (!copied)
|
|
11588
11826
|
return;
|
|
11589
11827
|
const timer = setTimeout(() => setCopied(false), COPIED_RESET_MS2);
|
|
11590
11828
|
return () => clearTimeout(timer);
|
|
11591
11829
|
}, [copied]);
|
|
11592
|
-
|
|
11830
|
+
useEffect44(() => {
|
|
11593
11831
|
return () => {
|
|
11594
11832
|
if (dismissTimerRef.current)
|
|
11595
11833
|
clearTimeout(dismissTimerRef.current);
|
|
@@ -11663,13 +11901,13 @@ function VoiceBarLinkCard({ card, onDismiss }) {
|
|
|
11663
11901
|
}
|
|
11664
11902
|
|
|
11665
11903
|
// src/components/VoiceBarNotification.tsx
|
|
11666
|
-
import { useEffect as
|
|
11904
|
+
import { useEffect as useEffect45, useRef as useRef41, useState as useState36 } from "react";
|
|
11667
11905
|
import { jsx as jsx50, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
11668
11906
|
function VoiceBarNotification({ notifications, pos, onDismiss }) {
|
|
11669
|
-
const [index2, setIndex] =
|
|
11670
|
-
const [paused, setPaused] =
|
|
11907
|
+
const [index2, setIndex] = useState36(0);
|
|
11908
|
+
const [paused, setPaused] = useState36(false);
|
|
11671
11909
|
const cardRef = useRef41(null);
|
|
11672
|
-
|
|
11910
|
+
useEffect45(() => {
|
|
11673
11911
|
const el = cardRef.current;
|
|
11674
11912
|
if (!el)
|
|
11675
11913
|
return;
|
|
@@ -11682,7 +11920,7 @@ function VoiceBarNotification({ notifications, pos, onDismiss }) {
|
|
|
11682
11920
|
el.removeEventListener("mouseleave", leave);
|
|
11683
11921
|
};
|
|
11684
11922
|
}, []);
|
|
11685
|
-
|
|
11923
|
+
useEffect45(() => {
|
|
11686
11924
|
if (paused)
|
|
11687
11925
|
return;
|
|
11688
11926
|
const rotate = setInterval(() => setIndex((current) => (current + 1) % notifications.length), TIP_ROTATE_MS);
|
|
@@ -11754,7 +11992,7 @@ function VoiceBarNotification({ notifications, pos, onDismiss }) {
|
|
|
11754
11992
|
}
|
|
11755
11993
|
|
|
11756
11994
|
// src/components/VoiceBarPlanCard.tsx
|
|
11757
|
-
import { useEffect as
|
|
11995
|
+
import { useEffect as useEffect46, useState as useState37 } from "react";
|
|
11758
11996
|
import { jsx as jsx51, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
11759
11997
|
var APPROVING_RESET_MS2 = 8000;
|
|
11760
11998
|
function StepIndicator({ step }) {
|
|
@@ -11789,8 +12027,8 @@ function VoiceBarPlanCard({
|
|
|
11789
12027
|
embedded = false
|
|
11790
12028
|
}) {
|
|
11791
12029
|
const awaitingApproval = plan.state === "proposed";
|
|
11792
|
-
const [isApproving, setIsApproving] =
|
|
11793
|
-
const [lastPlanId, setLastPlanId] =
|
|
12030
|
+
const [isApproving, setIsApproving] = useState37(false);
|
|
12031
|
+
const [lastPlanId, setLastPlanId] = useState37(plan.planId);
|
|
11794
12032
|
if (plan.planId !== lastPlanId) {
|
|
11795
12033
|
setLastPlanId(plan.planId);
|
|
11796
12034
|
setIsApproving(false);
|
|
@@ -11805,13 +12043,13 @@ function VoiceBarPlanCard({
|
|
|
11805
12043
|
const cancel = () => {
|
|
11806
12044
|
sendChatMessage(CANCEL_MESSAGE).catch((e) => console.warn("[Skippr] plan reply failed", e));
|
|
11807
12045
|
};
|
|
11808
|
-
|
|
12046
|
+
useEffect46(() => {
|
|
11809
12047
|
if (!isApproving)
|
|
11810
12048
|
return;
|
|
11811
12049
|
const timer = setTimeout(() => setIsApproving(false), APPROVING_RESET_MS2);
|
|
11812
12050
|
return () => clearTimeout(timer);
|
|
11813
12051
|
}, [isApproving]);
|
|
11814
|
-
|
|
12052
|
+
useEffect46(() => {
|
|
11815
12053
|
if (plan.state !== "completed")
|
|
11816
12054
|
return;
|
|
11817
12055
|
const timer = setTimeout(onDismiss, COMPLETED_CARD_VISIBLE_MS);
|
|
@@ -12024,8 +12262,8 @@ function ShortcutHint({
|
|
|
12024
12262
|
children
|
|
12025
12263
|
}) {
|
|
12026
12264
|
const ref = useRef42(null);
|
|
12027
|
-
const [visible, setVisible] =
|
|
12028
|
-
|
|
12265
|
+
const [visible, setVisible] = useState38(false);
|
|
12266
|
+
useEffect47(() => {
|
|
12029
12267
|
if (!enabled)
|
|
12030
12268
|
return;
|
|
12031
12269
|
const el = ref.current;
|
|
@@ -12140,15 +12378,22 @@ function VoiceBarFrame({
|
|
|
12140
12378
|
textMode,
|
|
12141
12379
|
captureMode,
|
|
12142
12380
|
chatActivityAt,
|
|
12143
|
-
setAutoStartAfterLogin
|
|
12381
|
+
setAutoStartAfterLogin,
|
|
12382
|
+
error,
|
|
12383
|
+
errorSeq,
|
|
12384
|
+
authFailed,
|
|
12385
|
+
modulesError,
|
|
12386
|
+
locale
|
|
12144
12387
|
} = ctx;
|
|
12145
12388
|
const needsLogin = !usesHostAuth && !isAuthenticated;
|
|
12146
|
-
const
|
|
12147
|
-
|
|
12389
|
+
const transientError = useTransientError(error, errorSeq);
|
|
12390
|
+
const authFailedCopy = authFailed ? resolveAuthFailedCopy(locale) : null;
|
|
12391
|
+
const [loginOpen, setLoginOpen] = useState38(false);
|
|
12392
|
+
useEffect47(() => {
|
|
12148
12393
|
if (!needsLogin)
|
|
12149
12394
|
setLoginOpen(false);
|
|
12150
12395
|
}, [needsLogin]);
|
|
12151
|
-
const [bannerOpen, setBannerOpen] =
|
|
12396
|
+
const [bannerOpen, setBannerOpen] = useState38(false);
|
|
12152
12397
|
const hasNotifications = notifications.length > 0;
|
|
12153
12398
|
const notifAccent = notifications[0]?.accentColor;
|
|
12154
12399
|
const closeBanner = useCallback34(() => setBannerOpen(false), []);
|
|
@@ -12171,9 +12416,9 @@ function VoiceBarFrame({
|
|
|
12171
12416
|
const plan = usePlanUpdates();
|
|
12172
12417
|
const linkCard = useLinkCard();
|
|
12173
12418
|
const { sendChatMessage } = useChatMessages();
|
|
12174
|
-
const [dismissedFloatingPlanId, setDismissedFloatingPlanId] =
|
|
12175
|
-
const [dismissedBlockPlanId, setDismissedBlockPlanId] =
|
|
12176
|
-
const [dismissedLinkCardId, setDismissedLinkCardId] =
|
|
12419
|
+
const [dismissedFloatingPlanId, setDismissedFloatingPlanId] = useState38(null);
|
|
12420
|
+
const [dismissedBlockPlanId, setDismissedBlockPlanId] = useState38(null);
|
|
12421
|
+
const [dismissedLinkCardId, setDismissedLinkCardId] = useState38(null);
|
|
12177
12422
|
const micMode = agentControls?.micMode;
|
|
12178
12423
|
const pushOrTap = isRequestResponseMicMode(micMode);
|
|
12179
12424
|
const isPushToTalk = micMode === MIC_MODE.PushToTalk;
|
|
@@ -12182,9 +12427,9 @@ function VoiceBarFrame({
|
|
|
12182
12427
|
const showActionControl = isConnected && captureMode === CAPTURE_MODE.Auto && actionsActive;
|
|
12183
12428
|
const chatSurface = agentControls?.chat ?? DEFAULT_CHAT_SURFACE;
|
|
12184
12429
|
const isRoomChat = chatSurface === CHAT_SURFACE.Room;
|
|
12185
|
-
const [chatLineOpen, setChatLineOpen] =
|
|
12186
|
-
const [chatLineMounted, setChatLineMounted] =
|
|
12187
|
-
const [chatLineClosing, setChatLineClosing] =
|
|
12430
|
+
const [chatLineOpen, setChatLineOpen] = useState38(false);
|
|
12431
|
+
const [chatLineMounted, setChatLineMounted] = useState38(false);
|
|
12432
|
+
const [chatLineClosing, setChatLineClosing] = useState38(false);
|
|
12188
12433
|
const chatOpen = isRoomChat ? isPanelOpen : chatLineOpen;
|
|
12189
12434
|
const lineBlockOpen = !isRoomChat && chatLineMounted;
|
|
12190
12435
|
const toggleChat = () => {
|
|
@@ -12194,7 +12439,7 @@ function VoiceBarFrame({
|
|
|
12194
12439
|
setChatLineOpen((open) => !open);
|
|
12195
12440
|
}
|
|
12196
12441
|
};
|
|
12197
|
-
|
|
12442
|
+
useEffect47(() => {
|
|
12198
12443
|
if (chatLineOpen) {
|
|
12199
12444
|
setChatLineMounted(true);
|
|
12200
12445
|
setChatLineClosing(false);
|
|
@@ -12223,7 +12468,7 @@ function VoiceBarFrame({
|
|
|
12223
12468
|
const showLivePill = !isLoading && isConnected && !textMode && !pushOrTap;
|
|
12224
12469
|
const barWidthPx = !showLivePill ? VOICE_BAR_WIDTH_PX : isHeld ? 120 : 156;
|
|
12225
12470
|
barWidthRef.current = barWidthPx;
|
|
12226
|
-
|
|
12471
|
+
useEffect47(() => {
|
|
12227
12472
|
const inBounds = clampBarPos(pos, barWidthPx);
|
|
12228
12473
|
if (inBounds.x !== pos.x)
|
|
12229
12474
|
onDrop(inBounds, barWidthPx);
|
|
@@ -12249,17 +12494,17 @@ function VoiceBarFrame({
|
|
|
12249
12494
|
const requestLabel = agentStateLabel ?? (isCapturingSpeech ? "listening…" : idleRequestLabel);
|
|
12250
12495
|
const livePillBg = agentActive && !isHeld ? "var(--skippr-brand-active)" : "var(--skippr-brand, #2bc0ae)";
|
|
12251
12496
|
const glow = isConnected && !isHeld && agentActive;
|
|
12252
|
-
const [autoOffClosing, setAutoOffClosing] =
|
|
12497
|
+
const [autoOffClosing, setAutoOffClosing] = useState38(false);
|
|
12253
12498
|
const { reportActivity } = useIdleAutoOff({
|
|
12254
12499
|
enabled: isConnected && !autoOffClosing,
|
|
12255
12500
|
active: agentActive || isCapturingSpeech || isUserSpeaking,
|
|
12256
12501
|
onExpire: () => setAutoOffClosing(true)
|
|
12257
12502
|
});
|
|
12258
|
-
|
|
12503
|
+
useEffect47(() => {
|
|
12259
12504
|
if (chatActivityAt)
|
|
12260
12505
|
reportActivity();
|
|
12261
12506
|
}, [chatActivityAt, reportActivity]);
|
|
12262
|
-
|
|
12507
|
+
useEffect47(() => {
|
|
12263
12508
|
if (!autoOffClosing)
|
|
12264
12509
|
return;
|
|
12265
12510
|
if (!isConnected) {
|
|
@@ -12275,12 +12520,12 @@ function VoiceBarFrame({
|
|
|
12275
12520
|
const floatingPlanActive = planEnabled && !isRoomChat && !lineBlockOpen && activePlan.planId !== dismissedFloatingPlanId;
|
|
12276
12521
|
const planInLineBlock = planEnabled && lineBlockOpen && activePlan.planId !== dismissedBlockPlanId;
|
|
12277
12522
|
const planCardActive = floatingPlanActive || planInLineBlock;
|
|
12278
|
-
|
|
12523
|
+
useEffect47(() => {
|
|
12279
12524
|
if (lineBlockOpen)
|
|
12280
12525
|
setDismissedBlockPlanId(null);
|
|
12281
12526
|
}, [lineBlockOpen]);
|
|
12282
|
-
const [autoOpenedPlanId, setAutoOpenedPlanId] =
|
|
12283
|
-
|
|
12527
|
+
const [autoOpenedPlanId, setAutoOpenedPlanId] = useState38(null);
|
|
12528
|
+
useEffect47(() => {
|
|
12284
12529
|
if (!isRoomChat || !planEnabled || !activePlan)
|
|
12285
12530
|
return;
|
|
12286
12531
|
if (activePlan.planId === autoOpenedPlanId)
|
|
@@ -12292,7 +12537,8 @@ function VoiceBarFrame({
|
|
|
12292
12537
|
const visibleLinkCard = linkCard && linkCard.cardId !== dismissedLinkCardId ? linkCard : null;
|
|
12293
12538
|
const linkCardActive = !!visibleLinkCard && isConnected && !planCardActive && !(isRoomChat && chatOpen) && !isCapturingSpeech && !isHeld && !autoOffClosing;
|
|
12294
12539
|
const bannerActive = hasNotifications && bannerOpen;
|
|
12295
|
-
const
|
|
12540
|
+
const midSessionError = sessionLive && !isRoomChat && !!transientError && !planCardActive && !linkCardActive;
|
|
12541
|
+
const slotClaimed = chatOpen || bannerActive || lineBlockOpen || midSessionError;
|
|
12296
12542
|
const autoBase = showLivePill && !autoOffClosing;
|
|
12297
12543
|
const showLiveStrip = !slotClaimed && autoBase && !isHeld && !planCardActive && (state === "thinking" || showActionControl);
|
|
12298
12544
|
const showTimerStrip = !slotClaimed && !autoOffClosing && !isCapturingSpeech && !planCardActive && !showLiveStrip && !isHeld && !!sessionTimer;
|
|
@@ -12433,13 +12679,30 @@ function VoiceBarFrame({
|
|
|
12433
12679
|
}
|
|
12434
12680
|
})
|
|
12435
12681
|
}),
|
|
12436
|
-
!sessionLive && !needsLogin && !bannerActive && /* @__PURE__ */ jsx52("div", {
|
|
12682
|
+
(!sessionLive || midSessionError) && !needsLogin && !bannerActive && /* @__PURE__ */ jsx52("div", {
|
|
12437
12683
|
style: planCardStyle,
|
|
12438
12684
|
className: "skippr:z-[6]",
|
|
12439
12685
|
"data-skippr-no-drag": "",
|
|
12440
12686
|
children: /* @__PURE__ */ jsx52("div", {
|
|
12441
12687
|
className: "skippr:w-[220px] skippr:rounded-[14px] skippr:border skippr:border-[rgba(45,45,63,0.08)] skippr:bg-white skippr:px-3 skippr:py-2 skippr:shadow-[0_10px_28px_rgba(45,45,63,0.16)] skippr:[animation:skippr-tip-in_360ms_cubic-bezier(0.34,1.3,0.64,1)]",
|
|
12442
|
-
children: /* @__PURE__ */
|
|
12688
|
+
children: !isRoomChat && authFailedCopy ? /* @__PURE__ */ jsxs41("div", {
|
|
12689
|
+
role: "alert",
|
|
12690
|
+
className: "skippr:text-center",
|
|
12691
|
+
children: [
|
|
12692
|
+
/* @__PURE__ */ jsx52("p", {
|
|
12693
|
+
className: "skippr:text-[11px] skippr:font-medium skippr:leading-[1.2] skippr:text-destructive",
|
|
12694
|
+
children: authFailedCopy.title
|
|
12695
|
+
}),
|
|
12696
|
+
/* @__PURE__ */ jsx52("p", {
|
|
12697
|
+
className: "skippr:mt-0.5 skippr:text-[10px] skippr:leading-[1.2] skippr:text-muted-foreground",
|
|
12698
|
+
children: authFailedCopy.hint
|
|
12699
|
+
})
|
|
12700
|
+
]
|
|
12701
|
+
}) : !isRoomChat && (modulesError || transientError) ? /* @__PURE__ */ jsx52("p", {
|
|
12702
|
+
role: "alert",
|
|
12703
|
+
className: "skippr:text-[11px] skippr:leading-[1.2] skippr:text-destructive skippr:text-center",
|
|
12704
|
+
children: modulesError || transientError
|
|
12705
|
+
}) : /* @__PURE__ */ jsx52(ConsentNotice, {
|
|
12443
12706
|
template: CONSENT_NOTICE_SESSION_START
|
|
12444
12707
|
})
|
|
12445
12708
|
})
|
|
@@ -12644,10 +12907,10 @@ function VoiceBarFrame({
|
|
|
12644
12907
|
}
|
|
12645
12908
|
|
|
12646
12909
|
// src/components/VoiceBarLauncher.tsx
|
|
12647
|
-
import { useCallback as useCallback35, useEffect as
|
|
12910
|
+
import { useCallback as useCallback35, useEffect as useEffect49, useRef as useRef44, useState as useState40 } from "react";
|
|
12648
12911
|
|
|
12649
12912
|
// src/components/LauncherNotification.tsx
|
|
12650
|
-
import { useEffect as
|
|
12913
|
+
import { useEffect as useEffect48, useRef as useRef43, useState as useState39 } from "react";
|
|
12651
12914
|
import { jsx as jsx53, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
12652
12915
|
function LauncherNotification({
|
|
12653
12916
|
notifications,
|
|
@@ -12655,10 +12918,10 @@ function LauncherNotification({
|
|
|
12655
12918
|
mode,
|
|
12656
12919
|
onDismiss
|
|
12657
12920
|
}) {
|
|
12658
|
-
const [index2, setIndex] =
|
|
12659
|
-
const [paused, setPaused] =
|
|
12921
|
+
const [index2, setIndex] = useState39(0);
|
|
12922
|
+
const [paused, setPaused] = useState39(false);
|
|
12660
12923
|
const cardRef = useRef43(null);
|
|
12661
|
-
|
|
12924
|
+
useEffect48(() => {
|
|
12662
12925
|
const el = cardRef.current;
|
|
12663
12926
|
if (!el)
|
|
12664
12927
|
return;
|
|
@@ -12671,7 +12934,7 @@ function LauncherNotification({
|
|
|
12671
12934
|
el.removeEventListener("mouseleave", leave);
|
|
12672
12935
|
};
|
|
12673
12936
|
}, []);
|
|
12674
|
-
|
|
12937
|
+
useEffect48(() => {
|
|
12675
12938
|
if (paused)
|
|
12676
12939
|
return;
|
|
12677
12940
|
const rotate = setInterval(() => setIndex((current) => (current + 1) % notifications.length), TIP_ROTATE_MS);
|
|
@@ -12896,16 +13159,16 @@ function VoiceBarLauncher({
|
|
|
12896
13159
|
}, [onDrop]);
|
|
12897
13160
|
const { wasDraggedRef } = useVoiceBarDrag(containerRef, onDropPos, null, setDragging);
|
|
12898
13161
|
const horizontal = isHorizontalEdge(dock.edge);
|
|
12899
|
-
const [cardOpen, setCardOpen] =
|
|
12900
|
-
const [loginOpen, setLoginOpen] =
|
|
12901
|
-
const [hovered, setHovered] =
|
|
12902
|
-
|
|
13162
|
+
const [cardOpen, setCardOpen] = useState40(false);
|
|
13163
|
+
const [loginOpen, setLoginOpen] = useState40(false);
|
|
13164
|
+
const [hovered, setHovered] = useState40(false);
|
|
13165
|
+
useEffect49(() => {
|
|
12903
13166
|
if (!needsLogin)
|
|
12904
13167
|
setLoginOpen(false);
|
|
12905
13168
|
}, [needsLogin]);
|
|
12906
13169
|
const hasNotif = notifications.length > 0;
|
|
12907
13170
|
const dotColor = notifications.find((item) => item.kind === NOTIFICATION_KIND.Module)?.accentColor ?? notifications[0]?.accentColor ?? NOTIF_ACCENT_COLOR;
|
|
12908
|
-
|
|
13171
|
+
useEffect49(() => {
|
|
12909
13172
|
const el = containerRef.current;
|
|
12910
13173
|
if (!el)
|
|
12911
13174
|
return;
|
|
@@ -13191,7 +13454,7 @@ function PlanPanelOpener() {
|
|
|
13191
13454
|
const plan = usePlanUpdates();
|
|
13192
13455
|
const { expandPanel } = useLiveAgent();
|
|
13193
13456
|
const surfacedPlanIdRef = useRef45(null);
|
|
13194
|
-
|
|
13457
|
+
useEffect50(() => {
|
|
13195
13458
|
if (plan?.state !== "proposed" || surfacedPlanIdRef.current === plan.planId)
|
|
13196
13459
|
return;
|
|
13197
13460
|
surfacedPlanIdRef.current = plan.planId;
|
|
@@ -13229,12 +13492,13 @@ function LiveAgent(props) {
|
|
|
13229
13492
|
console.warn('[Skippr] agentControls requires captureMode: "auto"');
|
|
13230
13493
|
}
|
|
13231
13494
|
}
|
|
13232
|
-
const
|
|
13495
|
+
const locale = useDetectedLocale(hostLocale);
|
|
13496
|
+
const auth = useAuth({ appKey, locale });
|
|
13233
13497
|
const usesHostAuth = !!getUserToken || !!userToken || !!authTokenProp;
|
|
13234
13498
|
const effectiveAuthToken = usesHostAuth ? authTokenProp : auth.authToken ?? undefined;
|
|
13235
|
-
const [activeModule, setActiveModule] =
|
|
13236
|
-
const [sessionAgentMode, setSessionAgentMode] =
|
|
13237
|
-
const [isExchanging, setIsExchanging] =
|
|
13499
|
+
const [activeModule, setActiveModule] = useState41(null);
|
|
13500
|
+
const [sessionAgentMode, setSessionAgentMode] = useState41(null);
|
|
13501
|
+
const [isExchanging, setIsExchanging] = useState41(false);
|
|
13238
13502
|
const minimizeOnSessionStart = useCallback36(() => {
|
|
13239
13503
|
if (minimizable) {
|
|
13240
13504
|
setIsMinimized(true);
|
|
@@ -13264,6 +13528,7 @@ function LiveAgent(props) {
|
|
|
13264
13528
|
isDisconnecting,
|
|
13265
13529
|
isPausing,
|
|
13266
13530
|
error,
|
|
13531
|
+
errorSeq,
|
|
13267
13532
|
errorCode,
|
|
13268
13533
|
startSession: startSessionRaw,
|
|
13269
13534
|
pauseSession,
|
|
@@ -13278,6 +13543,7 @@ function LiveAgent(props) {
|
|
|
13278
13543
|
authFailed
|
|
13279
13544
|
} = useSession({
|
|
13280
13545
|
captureMode,
|
|
13546
|
+
locale,
|
|
13281
13547
|
authToken: effectiveAuthToken,
|
|
13282
13548
|
appKey,
|
|
13283
13549
|
getUserToken,
|
|
@@ -13302,29 +13568,28 @@ function LiveAgent(props) {
|
|
|
13302
13568
|
return;
|
|
13303
13569
|
disconnect();
|
|
13304
13570
|
}, [disconnect]);
|
|
13305
|
-
const [isPanelOpen, setIsPanelOpen] =
|
|
13306
|
-
const [panelEntry, setPanelEntry] =
|
|
13307
|
-
const [isMinimized, setIsMinimized] =
|
|
13308
|
-
const [pendingStart, setPendingStart] =
|
|
13309
|
-
const [sidebarTab, setSidebarTab] =
|
|
13310
|
-
const [phasesSnapshot, setPhasesSnapshot] =
|
|
13311
|
-
const [startMuted, setStartMuted] =
|
|
13312
|
-
const [textMode, setTextMode] =
|
|
13313
|
-
const [panelExpanded, setPanelExpanded] =
|
|
13571
|
+
const [isPanelOpen, setIsPanelOpen] = useState41(defaultOpen);
|
|
13572
|
+
const [panelEntry, setPanelEntry] = useState41(PANEL_ENTRY.Launcher);
|
|
13573
|
+
const [isMinimized, setIsMinimized] = useState41(minimizable && !defaultOpen);
|
|
13574
|
+
const [pendingStart, setPendingStart] = useState41(null);
|
|
13575
|
+
const [sidebarTab, setSidebarTab] = useState41("agenda");
|
|
13576
|
+
const [phasesSnapshot, setPhasesSnapshot] = useState41([]);
|
|
13577
|
+
const [startMuted, setStartMuted] = useState41(false);
|
|
13578
|
+
const [textMode, setTextMode] = useState41(false);
|
|
13579
|
+
const [panelExpanded, setPanelExpanded] = useState41(false);
|
|
13314
13580
|
const togglePanelExpanded = useCallback36(() => setPanelExpanded((prev) => !prev), []);
|
|
13315
13581
|
const panelRef = useRef45(null);
|
|
13316
13582
|
const controlBarRef = useRef45(null);
|
|
13317
13583
|
const voiceBarRef = useRef45(null);
|
|
13318
|
-
const [isDragging, setIsDragging] =
|
|
13584
|
+
const [isDragging, setIsDragging] = useState41(false);
|
|
13319
13585
|
const setTextModeState = useCallback36((enabled) => {
|
|
13320
13586
|
setTextMode(enabled);
|
|
13321
13587
|
}, []);
|
|
13322
13588
|
const showControlBar = isConnected || isStarting || isPausing;
|
|
13323
|
-
|
|
13589
|
+
useEffect50(() => {
|
|
13324
13590
|
if (!isConnected)
|
|
13325
13591
|
setTextModeState(false);
|
|
13326
13592
|
}, [isConnected, setTextModeState]);
|
|
13327
|
-
const locale = useDetectedLocale(hostLocale);
|
|
13328
13593
|
const {
|
|
13329
13594
|
modules: availableModules,
|
|
13330
13595
|
defaultSelection,
|
|
@@ -13358,7 +13623,13 @@ function LiveAgent(props) {
|
|
|
13358
13623
|
const buddyActive = isBuddyActive(appearance) && variant !== "sidebar" && !hostAgentId;
|
|
13359
13624
|
const buddyShape = appearance?.buddy?.shape ?? DEFAULT_BUDDY_SHAPE;
|
|
13360
13625
|
const effectiveHostAgentId = buddyActive ? undefined : hostAgentId;
|
|
13361
|
-
const startSession = useCallback36((opts) =>
|
|
13626
|
+
const startSession = useCallback36((opts) => {
|
|
13627
|
+
const named = {
|
|
13628
|
+
...opts,
|
|
13629
|
+
agentName: availableModules.find((m) => m.id === opts.agentId)?.name
|
|
13630
|
+
};
|
|
13631
|
+
return startSessionRaw(buddyActive ? { ...named, agentControls: buddyEffectiveControls(named.agentControls) } : named);
|
|
13632
|
+
}, [startSessionRaw, buddyActive, availableModules]);
|
|
13362
13633
|
const defaultAgentId = buddyActive ? defaultSelection.agentId : hostAgentId ?? defaultSelection.agentId;
|
|
13363
13634
|
const defaultModule = availableModules.find((m) => m.id === defaultAgentId) ?? null;
|
|
13364
13635
|
const operatingModule = buddyActive ? defaultModule : activeModule ?? (effectiveHostAgentId ? availableModules[0] ?? null : null);
|
|
@@ -13432,10 +13703,10 @@ function LiveAgent(props) {
|
|
|
13432
13703
|
setPendingStart(pending);
|
|
13433
13704
|
setIsMinimized(false);
|
|
13434
13705
|
}, []);
|
|
13435
|
-
const [welcomeDismissed, setWelcomeDismissed] =
|
|
13706
|
+
const [welcomeDismissed, setWelcomeDismissed] = useState41(false);
|
|
13436
13707
|
const dismissWelcome = useCallback36(() => setWelcomeDismissed(true), []);
|
|
13437
|
-
const [savedPosition] =
|
|
13438
|
-
const [currentPosition, setCurrentPosition] =
|
|
13708
|
+
const [savedPosition] = useState41(readSavedPosition);
|
|
13709
|
+
const [currentPosition, setCurrentPosition] = useState41(savedPosition ?? "right");
|
|
13439
13710
|
const positionLockedRef = useRef45(savedPosition !== null);
|
|
13440
13711
|
const setPositionWithPersist = useCallback36((pos) => {
|
|
13441
13712
|
positionLockedRef.current = true;
|
|
@@ -13445,18 +13716,18 @@ function LiveAgent(props) {
|
|
|
13445
13716
|
} catch {}
|
|
13446
13717
|
}, []);
|
|
13447
13718
|
const serverPosition = appearance?.position ?? null;
|
|
13448
|
-
|
|
13719
|
+
useEffect50(() => {
|
|
13449
13720
|
if (!serverPosition || positionLockedRef.current)
|
|
13450
13721
|
return;
|
|
13451
13722
|
setCurrentPosition(serverPosition);
|
|
13452
13723
|
}, [serverPosition]);
|
|
13453
|
-
const [savedLauncherBottom] =
|
|
13724
|
+
const [savedLauncherBottom] = useState41(readSavedLauncherBottom);
|
|
13454
13725
|
const hasDraggedRef = useRef45(savedLauncherBottom !== null);
|
|
13455
13726
|
const verticalAlignRef = useRef45(hostVerticalAlign ?? "bottom");
|
|
13456
|
-
const [launcherBottomPx, setLauncherBottomPxState] =
|
|
13457
|
-
const [popsDown, setPopsDown] =
|
|
13727
|
+
const [launcherBottomPx, setLauncherBottomPxState] = useState41(() => savedLauncherBottom !== null ? clampLauncherBottom(savedLauncherBottom) : verticalAlignToBottomPx(verticalAlignRef.current));
|
|
13728
|
+
const [popsDown, setPopsDown] = useState41(() => launcherPopsDown(launcherBottomPx));
|
|
13458
13729
|
const serverVerticalAlign = appearance?.verticalAlign ?? null;
|
|
13459
|
-
|
|
13730
|
+
useEffect50(() => {
|
|
13460
13731
|
if (!serverVerticalAlign || hostVerticalAlign !== undefined || hasDraggedRef.current)
|
|
13461
13732
|
return;
|
|
13462
13733
|
verticalAlignRef.current = serverVerticalAlign;
|
|
@@ -13474,18 +13745,18 @@ function LiveAgent(props) {
|
|
|
13474
13745
|
}, []);
|
|
13475
13746
|
const launcherBottomPxRef = useRef45(launcherBottomPx);
|
|
13476
13747
|
launcherBottomPxRef.current = launcherBottomPx;
|
|
13477
|
-
const [chatActivityAt, setChatActivityAt] =
|
|
13748
|
+
const [chatActivityAt, setChatActivityAt] = useState41(0);
|
|
13478
13749
|
const reportChatActivity = useCallback36(() => {
|
|
13479
13750
|
const now = Date.now();
|
|
13480
13751
|
setChatActivityAt((last) => now - last < CHAT_ACTIVITY_THROTTLE_MS ? last : now);
|
|
13481
13752
|
}, []);
|
|
13482
|
-
const [chatDraft, setChatDraft] =
|
|
13483
|
-
const [autoStartAfterLogin, setAutoStartAfterLogin] =
|
|
13753
|
+
const [chatDraft, setChatDraft] = useState41("");
|
|
13754
|
+
const [autoStartAfterLogin, setAutoStartAfterLogin] = useState41(false);
|
|
13484
13755
|
const commitLauncherDrop = useCallback36(({ side, bottomPx }) => {
|
|
13485
13756
|
setPositionWithPersist(side);
|
|
13486
13757
|
setLauncherBottomPx(bottomPx);
|
|
13487
13758
|
}, [setPositionWithPersist, setLauncherBottomPx]);
|
|
13488
|
-
const [barPos, setBarPosState] =
|
|
13759
|
+
const [barPos, setBarPosState] = useState41(() => readSavedBarPos());
|
|
13489
13760
|
const barPosRatioRef = useRef45(barPos === null ? null : barPosRatio(barPos));
|
|
13490
13761
|
const setBarPos = useCallback36((next, widthPx) => {
|
|
13491
13762
|
const placed = clampBarPos(next, widthPx);
|
|
@@ -13493,7 +13764,7 @@ function LiveAgent(props) {
|
|
|
13493
13764
|
persistBarPos(placed);
|
|
13494
13765
|
barPosRatioRef.current = barPosRatio(placed);
|
|
13495
13766
|
}, []);
|
|
13496
|
-
const [savedLauncherDock, setSavedLauncherDock] =
|
|
13767
|
+
const [savedLauncherDock, setSavedLauncherDock] = useState41(() => readSavedDock("launcher"));
|
|
13497
13768
|
const setLauncherDock = useCallback36((next) => {
|
|
13498
13769
|
setSavedLauncherDock(next);
|
|
13499
13770
|
persistDock("launcher", next);
|
|
@@ -13503,7 +13774,7 @@ function LiveAgent(props) {
|
|
|
13503
13774
|
edge: launcherEdge,
|
|
13504
13775
|
offsetPx: defaultOffset(launcherEdge)
|
|
13505
13776
|
};
|
|
13506
|
-
|
|
13777
|
+
useEffect50(() => {
|
|
13507
13778
|
const syncToViewport = () => {
|
|
13508
13779
|
const next = hasDraggedRef.current ? clampLauncherBottom(launcherBottomPxRef.current) : verticalAlignToBottomPx(verticalAlignRef.current);
|
|
13509
13780
|
setLauncherBottomPxState(next);
|
|
@@ -13513,7 +13784,7 @@ function LiveAgent(props) {
|
|
|
13513
13784
|
window.addEventListener("resize", syncToViewport);
|
|
13514
13785
|
return () => window.removeEventListener("resize", syncToViewport);
|
|
13515
13786
|
}, []);
|
|
13516
|
-
|
|
13787
|
+
useEffect50(() => {
|
|
13517
13788
|
const syncBarToViewport = () => {
|
|
13518
13789
|
const ratios = barPosRatioRef.current;
|
|
13519
13790
|
const measured = voiceBarRef.current?.getBoundingClientRect().width;
|
|
@@ -13596,7 +13867,7 @@ function LiveAgent(props) {
|
|
|
13596
13867
|
bearerToken,
|
|
13597
13868
|
selectModule
|
|
13598
13869
|
});
|
|
13599
|
-
|
|
13870
|
+
useEffect50(() => {
|
|
13600
13871
|
if (!autoStartAfterLogin)
|
|
13601
13872
|
return;
|
|
13602
13873
|
if (bearerToken === null || !hasResolvedModules || isSessionLive)
|
|
@@ -13629,7 +13900,7 @@ function LiveAgent(props) {
|
|
|
13629
13900
|
phases: idleHistoryPhases,
|
|
13630
13901
|
isLoading: isLoadingHistory
|
|
13631
13902
|
}), [idleHistoryMessages, idleHistoryPhases, isLoadingHistory]);
|
|
13632
|
-
const [pageSplashDismissed, setPageSplashDismissed] =
|
|
13903
|
+
const [pageSplashDismissed, setPageSplashDismissed] = useState41(false);
|
|
13633
13904
|
const dismissSplash = useCallback36((surface) => {
|
|
13634
13905
|
if (surface !== SPLASH_SURFACE.Panel) {
|
|
13635
13906
|
setPageSplashDismissed(true);
|
|
@@ -13667,7 +13938,7 @@ function LiveAgent(props) {
|
|
|
13667
13938
|
isSplashVisible: splashSurfaces.overlay || splashSurfaces.panel || splashSurfaces.applies && !pageSplashDismissed,
|
|
13668
13939
|
isSessionLive
|
|
13669
13940
|
});
|
|
13670
|
-
|
|
13941
|
+
useEffect50(() => {
|
|
13671
13942
|
const open = () => {
|
|
13672
13943
|
reopenSplash();
|
|
13673
13944
|
if (configuredSplashSurfaces.overlay)
|
|
@@ -13689,6 +13960,7 @@ function LiveAgent(props) {
|
|
|
13689
13960
|
isDisconnecting,
|
|
13690
13961
|
isPausing,
|
|
13691
13962
|
error,
|
|
13963
|
+
errorSeq,
|
|
13692
13964
|
errorCode,
|
|
13693
13965
|
startSession,
|
|
13694
13966
|
pauseSession: pauseSessionAndMinimize,
|
|
@@ -13736,6 +14008,7 @@ function LiveAgent(props) {
|
|
|
13736
14008
|
isAuthenticated,
|
|
13737
14009
|
usesHostAuth,
|
|
13738
14010
|
authFailed,
|
|
14011
|
+
locale,
|
|
13739
14012
|
isValidating: auth.isValidating,
|
|
13740
14013
|
authError: auth.error,
|
|
13741
14014
|
requestOtp: auth.requestOtp,
|
|
@@ -13792,6 +14065,7 @@ function LiveAgent(props) {
|
|
|
13792
14065
|
isDisconnecting,
|
|
13793
14066
|
isPausing,
|
|
13794
14067
|
error,
|
|
14068
|
+
errorSeq,
|
|
13795
14069
|
errorCode,
|
|
13796
14070
|
startSession,
|
|
13797
14071
|
pauseSessionAndMinimize,
|
|
@@ -13833,6 +14107,7 @@ function LiveAgent(props) {
|
|
|
13833
14107
|
isAuthenticated,
|
|
13834
14108
|
usesHostAuth,
|
|
13835
14109
|
authFailed,
|
|
14110
|
+
locale,
|
|
13836
14111
|
auth.isValidating,
|
|
13837
14112
|
auth.error,
|
|
13838
14113
|
auth.requestOtp,
|
|
@@ -13970,7 +14245,7 @@ function LiveAgent(props) {
|
|
|
13970
14245
|
});
|
|
13971
14246
|
}
|
|
13972
14247
|
// src/components/SplashScreen.tsx
|
|
13973
|
-
import { useContext as useContext28, useEffect as
|
|
14248
|
+
import { useContext as useContext28, useEffect as useEffect51, useRef as useRef46 } from "react";
|
|
13974
14249
|
import { jsx as jsx57 } from "react/jsx-runtime";
|
|
13975
14250
|
var SPLASH_DISABLED_WARNING = "[Skippr] <SplashScreen> is mounted but the splash screen is turned off for this workspace, so it will never render. Enable it under Appearance in the Skippr platform.";
|
|
13976
14251
|
function SplashScreen({ className, onDismiss }) {
|
|
@@ -13981,7 +14256,7 @@ function SplashScreen({ className, onDismiss }) {
|
|
|
13981
14256
|
const disabledWarnedRef = useRef46(false);
|
|
13982
14257
|
const hasResolvedModules = ctx.hasResolvedModules;
|
|
13983
14258
|
const isSplashConfigured = ctx.isSplashConfigured;
|
|
13984
|
-
|
|
14259
|
+
useEffect51(() => {
|
|
13985
14260
|
if (!hasResolvedModules || isSplashConfigured || disabledWarnedRef.current)
|
|
13986
14261
|
return;
|
|
13987
14262
|
disabledWarnedRef.current = true;
|