@skippr/live-agent-sdk 0.112.0 → 0.113.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 +565 -314
- package/dist/skippr-sdk.css +1 -1
- package/dist/skippr-sdk.js +99 -99
- 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,7 +7178,7 @@ 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;
|
|
6972
7183
|
var textDecoder = new TextDecoder;
|
|
6973
7184
|
function parseHighlightMessage(payload) {
|
|
@@ -7025,8 +7236,8 @@ function HighlightOverlay() {
|
|
|
7025
7236
|
autoClearRef.current = setTimeout(clear, HIGHLIGHT_AUTO_CLEAR_MS);
|
|
7026
7237
|
}, [clear]);
|
|
7027
7238
|
useDataChannel(HIGHLIGHT_TOPIC, onHighlightMessage);
|
|
7028
|
-
|
|
7029
|
-
|
|
7239
|
+
useEffect25(() => onHighlightCleared(clear), [clear]);
|
|
7240
|
+
useEffect25(() => {
|
|
7030
7241
|
const onClick = (event) => {
|
|
7031
7242
|
const target = targetRef.current;
|
|
7032
7243
|
const node = event.target;
|
|
@@ -7036,15 +7247,15 @@ function HighlightOverlay() {
|
|
|
7036
7247
|
document.addEventListener("click", onClick, { capture: true });
|
|
7037
7248
|
return () => document.removeEventListener("click", onClick, { capture: true });
|
|
7038
7249
|
}, [clear]);
|
|
7039
|
-
|
|
7250
|
+
useEffect25(() => clear, [clear]);
|
|
7040
7251
|
return null;
|
|
7041
7252
|
}
|
|
7042
7253
|
|
|
7043
7254
|
// src/components/MinimizedBubble.tsx
|
|
7044
|
-
import { useContext as useContext10, useEffect as
|
|
7255
|
+
import { useContext as useContext10, useEffect as useEffect27, useRef as useRef21, useState as useState21 } from "react";
|
|
7045
7256
|
|
|
7046
7257
|
// src/hooks/useLauncherDrag.ts
|
|
7047
|
-
import { useEffect as
|
|
7258
|
+
import { useEffect as useEffect26, useRef as useRef20 } from "react";
|
|
7048
7259
|
import { flushSync } from "react-dom";
|
|
7049
7260
|
var DRAG_THRESHOLD_PX = 5;
|
|
7050
7261
|
function useLauncherDrag(containerRef, onDrop, followRefs, reportDragging, enabled = true) {
|
|
@@ -7055,7 +7266,7 @@ function useLauncherDrag(containerRef, onDrop, followRefs, reportDragging, enabl
|
|
|
7055
7266
|
followTargetsRef.current = followRefs;
|
|
7056
7267
|
const reportDraggingRef = useRef20(reportDragging);
|
|
7057
7268
|
reportDraggingRef.current = reportDragging;
|
|
7058
|
-
|
|
7269
|
+
useEffect26(() => {
|
|
7059
7270
|
if (!enabled)
|
|
7060
7271
|
return;
|
|
7061
7272
|
const el = containerRef.current;
|
|
@@ -7410,7 +7621,7 @@ function WelcomeBubble({
|
|
|
7410
7621
|
onDismiss,
|
|
7411
7622
|
onClick
|
|
7412
7623
|
}) {
|
|
7413
|
-
|
|
7624
|
+
useEffect27(() => {
|
|
7414
7625
|
const timer = setTimeout(onDismiss, 5000);
|
|
7415
7626
|
return () => clearTimeout(timer);
|
|
7416
7627
|
}, [onDismiss]);
|
|
@@ -7455,14 +7666,14 @@ function MinimizedBubble({
|
|
|
7455
7666
|
commitLauncherDrop,
|
|
7456
7667
|
appearance
|
|
7457
7668
|
} = ctx;
|
|
7458
|
-
const [goalsAutoHidden, setGoalsAutoHidden] =
|
|
7459
|
-
const [isLauncherHovered, setIsLauncherHovered] =
|
|
7460
|
-
const [visitHref, setVisitHref] =
|
|
7669
|
+
const [goalsAutoHidden, setGoalsAutoHidden] = useState21(false);
|
|
7670
|
+
const [isLauncherHovered, setIsLauncherHovered] = useState21(false);
|
|
7671
|
+
const [visitHref, setVisitHref] = useState21(() => window.location.href);
|
|
7461
7672
|
const revealedHrefRef = useRef21(null);
|
|
7462
7673
|
const hoverContainerRef = useRef21(null);
|
|
7463
7674
|
const closeTimerRef = useRef21(null);
|
|
7464
|
-
|
|
7465
|
-
|
|
7675
|
+
useEffect27(() => subscribeToLocationChange(() => setVisitHref(window.location.href)), []);
|
|
7676
|
+
useEffect27(() => {
|
|
7466
7677
|
const el = hoverContainerRef.current;
|
|
7467
7678
|
if (!el)
|
|
7468
7679
|
return;
|
|
@@ -7501,7 +7712,7 @@ function MinimizedBubble({
|
|
|
7501
7712
|
const onboardingModule = pillCandidates.find((module) => module.type === "onboarding");
|
|
7502
7713
|
const modulePills = onboardingModule ? [onboardingModule] : pillCandidates.slice(0, MAX_MODULE_PILLS).reverse();
|
|
7503
7714
|
const goalsEligible = adoptionGoals.length > 0 && !onboardingModule && hasResolvedModules;
|
|
7504
|
-
|
|
7715
|
+
useEffect27(() => {
|
|
7505
7716
|
if (!goalsEligible)
|
|
7506
7717
|
return;
|
|
7507
7718
|
if (revealedHrefRef.current === visitHref) {
|
|
@@ -7515,8 +7726,8 @@ function MinimizedBubble({
|
|
|
7515
7726
|
}, [goalsEligible, visitHref]);
|
|
7516
7727
|
const matchedGoals = goalsEligible ? adoptionGoals.slice(0, MAX_GOAL_BUBBLES) : [];
|
|
7517
7728
|
const goalsHidden = goalsAutoHidden && !isLauncherHovered;
|
|
7518
|
-
const [goalsUnmounted, setGoalsUnmounted] =
|
|
7519
|
-
|
|
7729
|
+
const [goalsUnmounted, setGoalsUnmounted] = useState21(false);
|
|
7730
|
+
useEffect27(() => {
|
|
7520
7731
|
if (!goalsHidden) {
|
|
7521
7732
|
setGoalsUnmounted(false);
|
|
7522
7733
|
return;
|
|
@@ -7601,7 +7812,7 @@ function MinimizedBubble({
|
|
|
7601
7812
|
|
|
7602
7813
|
// src/components/PageActionHandler.tsx
|
|
7603
7814
|
import { useDataChannel as useDataChannel2 } from "@livekit/components-react/hooks";
|
|
7604
|
-
import { useCallback as useCallback19, useEffect as
|
|
7815
|
+
import { useCallback as useCallback19, useEffect as useEffect28, useRef as useRef22 } from "react";
|
|
7605
7816
|
var STEP_MAX_WAIT_MS = 5000;
|
|
7606
7817
|
var POST_ACTION_SETTLE_SNAPSHOT_MS = 300;
|
|
7607
7818
|
var TRAILING_ACTION_FLUSH_AFTER_STOP_MS = 1000;
|
|
@@ -7939,7 +8150,7 @@ function PageActionHandler() {
|
|
|
7939
8150
|
queueRef.current.push(action);
|
|
7940
8151
|
drain();
|
|
7941
8152
|
}, [drain]);
|
|
7942
|
-
|
|
8153
|
+
useEffect28(() => {
|
|
7943
8154
|
mountedRef.current = true;
|
|
7944
8155
|
drainingRef.current = false;
|
|
7945
8156
|
return () => {
|
|
@@ -7951,7 +8162,7 @@ function PageActionHandler() {
|
|
|
7951
8162
|
setActionsBusy(false);
|
|
7952
8163
|
};
|
|
7953
8164
|
}, []);
|
|
7954
|
-
|
|
8165
|
+
useEffect28(() => {
|
|
7955
8166
|
return onActionsStopped(() => {
|
|
7956
8167
|
actionsStoppedRef.current = true;
|
|
7957
8168
|
ignoreActionsArrivingBeforeRef.current = Date.now() + TRAILING_ACTION_FLUSH_AFTER_STOP_MS;
|
|
@@ -7969,17 +8180,17 @@ function PageActionHandler() {
|
|
|
7969
8180
|
}
|
|
7970
8181
|
|
|
7971
8182
|
// src/components/SessionControlBar.tsx
|
|
7972
|
-
import { useCallback as useCallback22, useContext as useContext11, useEffect as
|
|
8183
|
+
import { useCallback as useCallback22, useContext as useContext11, useEffect as useEffect32, useState as useState24 } from "react";
|
|
7973
8184
|
|
|
7974
8185
|
// src/hooks/useActionControl.ts
|
|
7975
8186
|
import { useLocalParticipant as useLocalParticipant6 } from "@livekit/components-react/hooks";
|
|
7976
|
-
import { useCallback as useCallback20, useEffect as
|
|
8187
|
+
import { useCallback as useCallback20, useEffect as useEffect29, useState as useState22 } from "react";
|
|
7977
8188
|
var textEncoder5 = new TextEncoder;
|
|
7978
8189
|
function useActionControl() {
|
|
7979
8190
|
const { localParticipant } = useLocalParticipant6();
|
|
7980
8191
|
const plan = usePlanUpdates();
|
|
7981
|
-
const [busy, setBusy] =
|
|
7982
|
-
|
|
8192
|
+
const [busy, setBusy] = useState22(isActionsBusy);
|
|
8193
|
+
useEffect29(() => subscribeActionsBusy(setBusy), []);
|
|
7983
8194
|
const actionsActive = busy || plan?.state === "executing";
|
|
7984
8195
|
const requestStop = useCallback20(async () => {
|
|
7985
8196
|
stopActions();
|
|
@@ -7996,13 +8207,13 @@ function useActionControl() {
|
|
|
7996
8207
|
}
|
|
7997
8208
|
|
|
7998
8209
|
// src/hooks/useAudioLevelBars.ts
|
|
7999
|
-
import { useEffect as
|
|
8210
|
+
import { useEffect as useEffect30, useRef as useRef23, useState as useState23 } from "react";
|
|
8000
8211
|
var TALKING_LEVEL_THRESHOLD = 0.2;
|
|
8001
8212
|
var TALKING_HOLD_MS = 400;
|
|
8002
8213
|
function useAudioLevelBars(mediaStreamTrack, { barCount, idleHeightPx, maxGrowthPx, noiseGate }) {
|
|
8003
8214
|
const barRefs = useRef23([]);
|
|
8004
|
-
const [isTalking, setIsTalking] =
|
|
8005
|
-
|
|
8215
|
+
const [isTalking, setIsTalking] = useState23(false);
|
|
8216
|
+
useEffect30(() => {
|
|
8006
8217
|
if (!mediaStreamTrack) {
|
|
8007
8218
|
for (const bar of barRefs.current) {
|
|
8008
8219
|
if (bar)
|
|
@@ -8053,7 +8264,7 @@ function useAudioLevelBars(mediaStreamTrack, { barCount, idleHeightPx, maxGrowth
|
|
|
8053
8264
|
}
|
|
8054
8265
|
|
|
8055
8266
|
// src/hooks/useIdleAutoPause.ts
|
|
8056
|
-
import { useCallback as useCallback21, useEffect as
|
|
8267
|
+
import { useCallback as useCallback21, useEffect as useEffect31, useRef as useRef24 } from "react";
|
|
8057
8268
|
function useIdleAutoPause({
|
|
8058
8269
|
enabled,
|
|
8059
8270
|
active,
|
|
@@ -8077,7 +8288,7 @@ function useIdleAutoPause({
|
|
|
8077
8288
|
if (enabled && !isHeld)
|
|
8078
8289
|
armTimer();
|
|
8079
8290
|
}, [enabled, isHeld, armTimer]);
|
|
8080
|
-
|
|
8291
|
+
useEffect31(() => {
|
|
8081
8292
|
if (!enabled || isHeld || active) {
|
|
8082
8293
|
clearTimer();
|
|
8083
8294
|
return;
|
|
@@ -8445,7 +8656,7 @@ function SessionControlBar() {
|
|
|
8445
8656
|
togglePause();
|
|
8446
8657
|
}
|
|
8447
8658
|
});
|
|
8448
|
-
const [pushToTalkHintSeen, setPushToTalkHintSeen] =
|
|
8659
|
+
const [pushToTalkHintSeen, setPushToTalkHintSeen] = useState24(false);
|
|
8449
8660
|
const startPushToTalk = useCallback22(() => {
|
|
8450
8661
|
start();
|
|
8451
8662
|
reportActivity();
|
|
@@ -8463,7 +8674,7 @@ function SessionControlBar() {
|
|
|
8463
8674
|
onCommit: commitPushToTalk,
|
|
8464
8675
|
onKeyUsed: dismissPushToTalkHint
|
|
8465
8676
|
});
|
|
8466
|
-
|
|
8677
|
+
useEffect32(() => {
|
|
8467
8678
|
if (isHeld)
|
|
8468
8679
|
minimizePanel();
|
|
8469
8680
|
}, [isHeld, minimizePanel]);
|
|
@@ -8716,7 +8927,7 @@ function SessionControlBar() {
|
|
|
8716
8927
|
}
|
|
8717
8928
|
|
|
8718
8929
|
// src/components/ShadowHost.tsx
|
|
8719
|
-
import { useLayoutEffect as useLayoutEffect2, useRef as useRef26, useState as
|
|
8930
|
+
import { useLayoutEffect as useLayoutEffect2, useRef as useRef26, useState as useState25 } from "react";
|
|
8720
8931
|
import { createPortal } from "react-dom";
|
|
8721
8932
|
import { jsx as jsx27, Fragment as Fragment3 } from "react/jsx-runtime";
|
|
8722
8933
|
var PROPERTIES_STYLE_ID = "skippr-tw-properties";
|
|
@@ -8738,9 +8949,9 @@ function ShadowHost({
|
|
|
8738
8949
|
className
|
|
8739
8950
|
}) {
|
|
8740
8951
|
const hostRef = useRef26(null);
|
|
8741
|
-
const [shadowRoot, setShadowRoot] =
|
|
8952
|
+
const [shadowRoot, setShadowRoot] = useState25(null);
|
|
8742
8953
|
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}}`;
|
|
8954
|
+
@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
8955
|
const hostStyle = accentColor && isHexColor(accentColor) ? {
|
|
8745
8956
|
"--skippr-brand": accentColor,
|
|
8746
8957
|
"--skippr-brand-foreground": brandForeground(accentColor),
|
|
@@ -8772,7 +8983,7 @@ function ShadowHost({
|
|
|
8772
8983
|
}
|
|
8773
8984
|
|
|
8774
8985
|
// src/components/Sidebar.tsx
|
|
8775
|
-
import { useCallback as useCallback28, useContext as useContext18, useEffect as
|
|
8986
|
+
import { useCallback as useCallback28, useContext as useContext18, useEffect as useEffect38, useRef as useRef33 } from "react";
|
|
8776
8987
|
|
|
8777
8988
|
// src/hooks/useCombinedMessages.ts
|
|
8778
8989
|
import { useContext as useContext12, useMemo as useMemo8 } from "react";
|
|
@@ -8905,7 +9116,7 @@ function useLinkCard() {
|
|
|
8905
9116
|
}
|
|
8906
9117
|
|
|
8907
9118
|
// src/hooks/usePhaseUpdates.ts
|
|
8908
|
-
import { useCallback as useCallback24, useContext as useContext13, useEffect as
|
|
9119
|
+
import { useCallback as useCallback24, useContext as useContext13, useEffect as useEffect33 } from "react";
|
|
8909
9120
|
function parsePhases(json) {
|
|
8910
9121
|
try {
|
|
8911
9122
|
const data = JSON.parse(json);
|
|
@@ -8919,7 +9130,7 @@ function usePhaseUpdates() {
|
|
|
8919
9130
|
const parse = useCallback24(parsePhases, []);
|
|
8920
9131
|
const livePhases = useAgentState("phases", parse, []);
|
|
8921
9132
|
const ctx = useContext13(LiveAgentContext);
|
|
8922
|
-
|
|
9133
|
+
useEffect33(() => {
|
|
8923
9134
|
if (livePhases.length > 0)
|
|
8924
9135
|
ctx?.setPhasesSnapshot(livePhases);
|
|
8925
9136
|
}, [livePhases, ctx?.setPhasesSnapshot]);
|
|
@@ -8928,7 +9139,7 @@ function usePhaseUpdates() {
|
|
|
8928
9139
|
}
|
|
8929
9140
|
|
|
8930
9141
|
// src/hooks/useSessionRemaining.ts
|
|
8931
|
-
import { useEffect as
|
|
9142
|
+
import { useEffect as useEffect34, useRef as useRef28, useState as useState26 } from "react";
|
|
8932
9143
|
|
|
8933
9144
|
// src/lib/format.ts
|
|
8934
9145
|
function formatTime(seconds) {
|
|
@@ -8945,8 +9156,8 @@ function parseNumber(s) {
|
|
|
8945
9156
|
function useSessionRemaining() {
|
|
8946
9157
|
const maxCallDuration = useAgentState("maxCallDuration", parseNumber, null);
|
|
8947
9158
|
const endTimeRef = useRef28(null);
|
|
8948
|
-
const [remaining, setRemaining] =
|
|
8949
|
-
|
|
9159
|
+
const [remaining, setRemaining] = useState26(null);
|
|
9160
|
+
useEffect34(() => {
|
|
8950
9161
|
if (maxCallDuration === null || endTimeRef.current !== null)
|
|
8951
9162
|
return;
|
|
8952
9163
|
const endTime = Date.now() + maxCallDuration * 1000;
|
|
@@ -9217,26 +9428,26 @@ function LogoMark({ className, decorative }) {
|
|
|
9217
9428
|
}
|
|
9218
9429
|
|
|
9219
9430
|
// src/components/MessageList.tsx
|
|
9220
|
-
import { useCallback as useCallback27, useLayoutEffect as useLayoutEffect3, useRef as useRef32, useState as
|
|
9431
|
+
import { useCallback as useCallback27, useLayoutEffect as useLayoutEffect3, useRef as useRef32, useState as useState30 } from "react";
|
|
9221
9432
|
|
|
9222
9433
|
// src/components/ChatInput.tsx
|
|
9223
|
-
import { useContext as useContext16, useEffect as
|
|
9434
|
+
import { useContext as useContext16, useEffect as useEffect35, useRef as useRef30, useState as useState27 } from "react";
|
|
9224
9435
|
import { jsx as jsx31, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
9225
9436
|
var MAX_INPUT_HEIGHT = 60;
|
|
9226
9437
|
function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
|
|
9227
9438
|
const ctx = useContext16(LiveAgentContext);
|
|
9228
9439
|
const reportChatActivity = ctx?.reportChatActivity;
|
|
9229
9440
|
const isPanelOpen = ctx?.isPanelOpen;
|
|
9230
|
-
const [localDraft, setLocalDraft] =
|
|
9441
|
+
const [localDraft, setLocalDraft] = useState27("");
|
|
9231
9442
|
const inputText = ctx?.chatDraft ?? localDraft;
|
|
9232
9443
|
const setInputText = ctx?.setChatDraft ?? setLocalDraft;
|
|
9233
9444
|
const textareaRef = useRef30(null);
|
|
9234
9445
|
const canSend = inputText.trim().length > 0 && !isSendingChat;
|
|
9235
|
-
|
|
9446
|
+
useEffect35(() => {
|
|
9236
9447
|
if (autoFocus && isPanelOpen !== false)
|
|
9237
9448
|
textareaRef.current?.focus();
|
|
9238
9449
|
}, [autoFocus, isPanelOpen]);
|
|
9239
|
-
|
|
9450
|
+
useEffect35(() => {
|
|
9240
9451
|
const el = textareaRef.current;
|
|
9241
9452
|
if (!el)
|
|
9242
9453
|
return;
|
|
@@ -9327,7 +9538,7 @@ function ChatMessage({ message }) {
|
|
|
9327
9538
|
}
|
|
9328
9539
|
|
|
9329
9540
|
// src/components/LinkCard.tsx
|
|
9330
|
-
import { useCallback as useCallback26, useEffect as
|
|
9541
|
+
import { useCallback as useCallback26, useEffect as useEffect36, useRef as useRef31, useState as useState28 } from "react";
|
|
9331
9542
|
|
|
9332
9543
|
// src/lib/clipboard.ts
|
|
9333
9544
|
async function copyToClipboard(text) {
|
|
@@ -9344,15 +9555,15 @@ import { jsx as jsx33, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
|
9344
9555
|
var COPIED_RESET_MS = 2000;
|
|
9345
9556
|
var DISMISS_AFTER_COPY_MS = 3000;
|
|
9346
9557
|
function LinkCard({ card, onDismiss }) {
|
|
9347
|
-
const [copied, setCopied] =
|
|
9558
|
+
const [copied, setCopied] = useState28(false);
|
|
9348
9559
|
const dismissTimerRef = useRef31(null);
|
|
9349
|
-
|
|
9560
|
+
useEffect36(() => {
|
|
9350
9561
|
if (!copied)
|
|
9351
9562
|
return;
|
|
9352
9563
|
const timer = setTimeout(() => setCopied(false), COPIED_RESET_MS);
|
|
9353
9564
|
return () => clearTimeout(timer);
|
|
9354
9565
|
}, [copied]);
|
|
9355
|
-
|
|
9566
|
+
useEffect36(() => {
|
|
9356
9567
|
return () => {
|
|
9357
9568
|
if (dismissTimerRef.current)
|
|
9358
9569
|
clearTimeout(dismissTimerRef.current);
|
|
@@ -9427,7 +9638,7 @@ function LinkCard({ card, onDismiss }) {
|
|
|
9427
9638
|
}
|
|
9428
9639
|
|
|
9429
9640
|
// src/components/PlanCard.tsx
|
|
9430
|
-
import { useEffect as
|
|
9641
|
+
import { useEffect as useEffect37, useState as useState29 } from "react";
|
|
9431
9642
|
import { jsx as jsx34, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
9432
9643
|
var APPROVE_MESSAGE = "Yes, go ahead.";
|
|
9433
9644
|
var CANCEL_MESSAGE = "No, cancel that.";
|
|
@@ -9455,8 +9666,8 @@ function StepIcon({ status }) {
|
|
|
9455
9666
|
}
|
|
9456
9667
|
function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
9457
9668
|
const awaitingApproval = plan.state === "proposed";
|
|
9458
|
-
const [isApproving, setIsApproving] =
|
|
9459
|
-
const [lastPlanId, setLastPlanId] =
|
|
9669
|
+
const [isApproving, setIsApproving] = useState29(false);
|
|
9670
|
+
const [lastPlanId, setLastPlanId] = useState29(plan.planId);
|
|
9460
9671
|
if (plan.planId !== lastPlanId) {
|
|
9461
9672
|
setLastPlanId(plan.planId);
|
|
9462
9673
|
setIsApproving(false);
|
|
@@ -9468,13 +9679,13 @@ function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
|
9468
9679
|
setIsApproving(false);
|
|
9469
9680
|
});
|
|
9470
9681
|
};
|
|
9471
|
-
|
|
9682
|
+
useEffect37(() => {
|
|
9472
9683
|
if (!isApproving)
|
|
9473
9684
|
return;
|
|
9474
9685
|
const timer = setTimeout(() => setIsApproving(false), APPROVING_RESET_MS);
|
|
9475
9686
|
return () => clearTimeout(timer);
|
|
9476
9687
|
}, [isApproving]);
|
|
9477
|
-
|
|
9688
|
+
useEffect37(() => {
|
|
9478
9689
|
if (plan.state !== "completed")
|
|
9479
9690
|
return;
|
|
9480
9691
|
const timer = setTimeout(onDismiss, COMPLETED_CARD_VISIBLE_MS);
|
|
@@ -9575,14 +9786,14 @@ function MessageList({
|
|
|
9575
9786
|
const containerRef = useRef32(null);
|
|
9576
9787
|
const isPinnedToBottom = useRef32(true);
|
|
9577
9788
|
const lastSeenMessageId = useRef32(undefined);
|
|
9578
|
-
const [showJumpToLatest, setShowJumpToLatest] =
|
|
9789
|
+
const [showJumpToLatest, setShowJumpToLatest] = useState30(false);
|
|
9579
9790
|
const lastMessage = messages.length > 0 ? messages[messages.length - 1] : undefined;
|
|
9580
|
-
const [dismissedPlanId, setDismissedPlanId] =
|
|
9791
|
+
const [dismissedPlanId, setDismissedPlanId] = useState30(null);
|
|
9581
9792
|
const dismissPlan = useCallback27(() => {
|
|
9582
9793
|
if (plan)
|
|
9583
9794
|
setDismissedPlanId(plan.planId);
|
|
9584
9795
|
}, [plan]);
|
|
9585
|
-
const [dismissedLinkCardId, setDismissedLinkCardId] =
|
|
9796
|
+
const [dismissedLinkCardId, setDismissedLinkCardId] = useState30(null);
|
|
9586
9797
|
const dismissLinkCard = useCallback27(() => {
|
|
9587
9798
|
if (linkCard)
|
|
9588
9799
|
setDismissedLinkCardId(linkCard.cardId);
|
|
@@ -9854,7 +10065,7 @@ function Sidebar({
|
|
|
9854
10065
|
...anchor2.style,
|
|
9855
10066
|
height: panelExpanded ? anchor2.availableHeight : `min(${PANEL_MAX_HEIGHT_PX}px, ${anchor2.availableHeight})`
|
|
9856
10067
|
} : undefined;
|
|
9857
|
-
|
|
10068
|
+
useEffect38(() => {
|
|
9858
10069
|
if (!isSidebar)
|
|
9859
10070
|
return;
|
|
9860
10071
|
const prop = position === "right" ? "marginRight" : "marginLeft";
|
|
@@ -9880,7 +10091,9 @@ function Sidebar({
|
|
|
9880
10091
|
draggable: followsPanel,
|
|
9881
10092
|
headerRef
|
|
9882
10093
|
}),
|
|
9883
|
-
authFailed ? /* @__PURE__ */ jsx39(AuthError, {
|
|
10094
|
+
authFailed ? /* @__PURE__ */ jsx39(AuthError, {
|
|
10095
|
+
locale: internalCtx?.locale
|
|
10096
|
+
}) : isAuthenticated && hasResolvedModules ? /* @__PURE__ */ jsx39(AuthenticatedContent, {
|
|
9884
10097
|
isConnected,
|
|
9885
10098
|
isPaused,
|
|
9886
10099
|
isPausing,
|
|
@@ -9991,7 +10204,8 @@ function AuthenticatedContent({
|
|
|
9991
10204
|
]
|
|
9992
10205
|
});
|
|
9993
10206
|
}
|
|
9994
|
-
function AuthError() {
|
|
10207
|
+
function AuthError({ locale }) {
|
|
10208
|
+
const copy = resolveAuthFailedCopy(locale);
|
|
9995
10209
|
return /* @__PURE__ */ jsxs31("div", {
|
|
9996
10210
|
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
10211
|
children: [
|
|
@@ -10000,11 +10214,11 @@ function AuthError() {
|
|
|
10000
10214
|
}),
|
|
10001
10215
|
/* @__PURE__ */ jsx39("p", {
|
|
10002
10216
|
className: "skippr:text-sm skippr:font-medium skippr:text-foreground",
|
|
10003
|
-
children:
|
|
10217
|
+
children: copy.title
|
|
10004
10218
|
}),
|
|
10005
10219
|
/* @__PURE__ */ jsx39("p", {
|
|
10006
10220
|
className: "skippr:mt-1 skippr:text-xs skippr:text-muted-foreground",
|
|
10007
|
-
children:
|
|
10221
|
+
children: copy.hint
|
|
10008
10222
|
})
|
|
10009
10223
|
]
|
|
10010
10224
|
});
|
|
@@ -10197,7 +10411,7 @@ import {
|
|
|
10197
10411
|
} from "react";
|
|
10198
10412
|
|
|
10199
10413
|
// src/hooks/useSplash.ts
|
|
10200
|
-
import { useCallback as useCallback29, useContext as useContext21, useMemo as useMemo9, useState as
|
|
10414
|
+
import { useCallback as useCallback29, useContext as useContext21, useMemo as useMemo9, useState as useState31 } from "react";
|
|
10201
10415
|
|
|
10202
10416
|
// src/lib/splashPresentation.ts
|
|
10203
10417
|
function resolveSplashSections(sections, iconUrls) {
|
|
@@ -10276,7 +10490,7 @@ function useSplash(surface, onDismiss) {
|
|
|
10276
10490
|
const splash = appearance?.splash ?? null;
|
|
10277
10491
|
const { micEnabled, screenEnabled, enableMic, enableScreen, releaseScreen } = splashMedia;
|
|
10278
10492
|
const toggleStartMuted = useCallback29(() => setStartMuted(!startMuted), [setStartMuted, startMuted]);
|
|
10279
|
-
const [optOutChecked, setOptOutChecked] =
|
|
10493
|
+
const [optOutChecked, setOptOutChecked] = useState31(false);
|
|
10280
10494
|
const toggleOptOut = useCallback29(() => setOptOutChecked((checked) => !checked), []);
|
|
10281
10495
|
const commitOptOut = useCallback29(() => {
|
|
10282
10496
|
if (optOutChecked)
|
|
@@ -11233,14 +11447,14 @@ function useBarNotifications() {
|
|
|
11233
11447
|
|
|
11234
11448
|
// src/components/VoiceBarFrame.tsx
|
|
11235
11449
|
import { useIsSpeaking, useLocalParticipant as useLocalParticipant12 } from "@livekit/components-react/hooks";
|
|
11236
|
-
import { useCallback as useCallback34, useContext as useContext26, useEffect as
|
|
11450
|
+
import { useCallback as useCallback34, useContext as useContext26, useEffect as useEffect47, useRef as useRef42, useState as useState38 } from "react";
|
|
11237
11451
|
|
|
11238
11452
|
// src/hooks/useKeyboardStop.ts
|
|
11239
|
-
import { useEffect as
|
|
11453
|
+
import { useEffect as useEffect39, useRef as useRef36 } from "react";
|
|
11240
11454
|
function useKeyboardStop({ enabled, onStop }) {
|
|
11241
11455
|
const handler = useRef36(onStop);
|
|
11242
11456
|
handler.current = onStop;
|
|
11243
|
-
|
|
11457
|
+
useEffect39(() => {
|
|
11244
11458
|
if (!enabled)
|
|
11245
11459
|
return;
|
|
11246
11460
|
const onKeyDown = (event) => {
|
|
@@ -11257,18 +11471,18 @@ function useKeyboardStop({ enabled, onStop }) {
|
|
|
11257
11471
|
}
|
|
11258
11472
|
|
|
11259
11473
|
// src/hooks/useSessionTimer.ts
|
|
11260
|
-
import { useEffect as
|
|
11474
|
+
import { useEffect as useEffect41, useState as useState33 } from "react";
|
|
11261
11475
|
|
|
11262
11476
|
// src/hooks/useElapsedSeconds.ts
|
|
11263
|
-
import { useEffect as
|
|
11477
|
+
import { useEffect as useEffect40, useRef as useRef37, useState as useState32 } from "react";
|
|
11264
11478
|
function useElapsedSeconds(isRunning, resetSignal) {
|
|
11265
|
-
const [elapsed, setElapsed] =
|
|
11479
|
+
const [elapsed, setElapsed] = useState32(0);
|
|
11266
11480
|
const accumulatedSecondsRef = useRef37(0);
|
|
11267
|
-
|
|
11481
|
+
useEffect40(() => {
|
|
11268
11482
|
accumulatedSecondsRef.current = 0;
|
|
11269
11483
|
setElapsed(0);
|
|
11270
11484
|
}, [resetSignal]);
|
|
11271
|
-
|
|
11485
|
+
useEffect40(() => {
|
|
11272
11486
|
if (!isRunning)
|
|
11273
11487
|
return;
|
|
11274
11488
|
const resumedAt = Date.now();
|
|
@@ -11293,8 +11507,8 @@ function useSessionTimer(isRunning, resetSignal) {
|
|
|
11293
11507
|
const active = isRunning && remaining !== null;
|
|
11294
11508
|
const warning = active && remaining !== null && remaining <= SESSION_TIMER_WARNING_S;
|
|
11295
11509
|
const revealCycle = !active ? null : warning ? "warning" : "normal";
|
|
11296
|
-
const [revealed, setRevealed] =
|
|
11297
|
-
|
|
11510
|
+
const [revealed, setRevealed] = useState33(false);
|
|
11511
|
+
useEffect41(() => {
|
|
11298
11512
|
if (!revealCycle) {
|
|
11299
11513
|
setRevealed(false);
|
|
11300
11514
|
return;
|
|
@@ -11322,7 +11536,7 @@ function useSessionTimer(isRunning, resetSignal) {
|
|
|
11322
11536
|
}
|
|
11323
11537
|
|
|
11324
11538
|
// src/hooks/useVoiceBarDrag.ts
|
|
11325
|
-
import { useEffect as
|
|
11539
|
+
import { useEffect as useEffect42, useRef as useRef38 } from "react";
|
|
11326
11540
|
import { flushSync as flushSync2 } from "react-dom";
|
|
11327
11541
|
var DRAG_THRESHOLD_PX2 = 5;
|
|
11328
11542
|
function useVoiceBarDrag(containerRef, onDrop, followRefs, reportDragging) {
|
|
@@ -11333,7 +11547,7 @@ function useVoiceBarDrag(containerRef, onDrop, followRefs, reportDragging) {
|
|
|
11333
11547
|
followTargetsRef.current = followRefs;
|
|
11334
11548
|
const reportDraggingRef = useRef38(reportDragging);
|
|
11335
11549
|
reportDraggingRef.current = reportDragging;
|
|
11336
|
-
|
|
11550
|
+
useEffect42(() => {
|
|
11337
11551
|
const el = containerRef.current;
|
|
11338
11552
|
if (!el)
|
|
11339
11553
|
return;
|
|
@@ -11483,7 +11697,7 @@ function useVoiceBarDrag(containerRef, onDrop, followRefs, reportDragging) {
|
|
|
11483
11697
|
}
|
|
11484
11698
|
|
|
11485
11699
|
// src/components/VoiceBarChatLine.tsx
|
|
11486
|
-
import { useCallback as useCallback32, useContext as useContext25, useEffect as
|
|
11700
|
+
import { useCallback as useCallback32, useContext as useContext25, useEffect as useEffect43, useRef as useRef39, useState as useState34 } from "react";
|
|
11487
11701
|
import { jsx as jsx48, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
11488
11702
|
var IDLE_HIDE_MS = 6000;
|
|
11489
11703
|
function VoiceBarChatLine({
|
|
@@ -11495,7 +11709,7 @@ function VoiceBarChatLine({
|
|
|
11495
11709
|
const { sendChatMessage, isSendingChat } = useChatMessages();
|
|
11496
11710
|
const ctx = useContext25(LiveAgentContext);
|
|
11497
11711
|
const reportChatActivity = ctx?.reportChatActivity;
|
|
11498
|
-
const [localDraft, setLocalDraft] =
|
|
11712
|
+
const [localDraft, setLocalDraft] = useState34("");
|
|
11499
11713
|
const text = ctx?.chatDraft ?? localDraft;
|
|
11500
11714
|
const setText = ctx?.setChatDraft ?? setLocalDraft;
|
|
11501
11715
|
const inputRef = useRef39(null);
|
|
@@ -11507,7 +11721,7 @@ function VoiceBarChatLine({
|
|
|
11507
11721
|
clearTimeout(idleTimerRef.current);
|
|
11508
11722
|
idleTimerRef.current = setTimeout(() => onCloseRef.current(), IDLE_HIDE_MS);
|
|
11509
11723
|
}, []);
|
|
11510
|
-
|
|
11724
|
+
useEffect43(() => {
|
|
11511
11725
|
inputRef.current?.focus();
|
|
11512
11726
|
armIdle();
|
|
11513
11727
|
return () => {
|
|
@@ -11576,20 +11790,20 @@ function VoiceBarChatLine({
|
|
|
11576
11790
|
}
|
|
11577
11791
|
|
|
11578
11792
|
// src/components/VoiceBarLinkCard.tsx
|
|
11579
|
-
import { useCallback as useCallback33, useEffect as
|
|
11793
|
+
import { useCallback as useCallback33, useEffect as useEffect44, useRef as useRef40, useState as useState35 } from "react";
|
|
11580
11794
|
import { jsx as jsx49, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
11581
11795
|
var COPIED_RESET_MS2 = 2000;
|
|
11582
11796
|
var DISMISS_AFTER_COPY_MS2 = 3000;
|
|
11583
11797
|
function VoiceBarLinkCard({ card, onDismiss }) {
|
|
11584
|
-
const [copied, setCopied] =
|
|
11798
|
+
const [copied, setCopied] = useState35(false);
|
|
11585
11799
|
const dismissTimerRef = useRef40(null);
|
|
11586
|
-
|
|
11800
|
+
useEffect44(() => {
|
|
11587
11801
|
if (!copied)
|
|
11588
11802
|
return;
|
|
11589
11803
|
const timer = setTimeout(() => setCopied(false), COPIED_RESET_MS2);
|
|
11590
11804
|
return () => clearTimeout(timer);
|
|
11591
11805
|
}, [copied]);
|
|
11592
|
-
|
|
11806
|
+
useEffect44(() => {
|
|
11593
11807
|
return () => {
|
|
11594
11808
|
if (dismissTimerRef.current)
|
|
11595
11809
|
clearTimeout(dismissTimerRef.current);
|
|
@@ -11663,13 +11877,13 @@ function VoiceBarLinkCard({ card, onDismiss }) {
|
|
|
11663
11877
|
}
|
|
11664
11878
|
|
|
11665
11879
|
// src/components/VoiceBarNotification.tsx
|
|
11666
|
-
import { useEffect as
|
|
11880
|
+
import { useEffect as useEffect45, useRef as useRef41, useState as useState36 } from "react";
|
|
11667
11881
|
import { jsx as jsx50, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
11668
11882
|
function VoiceBarNotification({ notifications, pos, onDismiss }) {
|
|
11669
|
-
const [index2, setIndex] =
|
|
11670
|
-
const [paused, setPaused] =
|
|
11883
|
+
const [index2, setIndex] = useState36(0);
|
|
11884
|
+
const [paused, setPaused] = useState36(false);
|
|
11671
11885
|
const cardRef = useRef41(null);
|
|
11672
|
-
|
|
11886
|
+
useEffect45(() => {
|
|
11673
11887
|
const el = cardRef.current;
|
|
11674
11888
|
if (!el)
|
|
11675
11889
|
return;
|
|
@@ -11682,7 +11896,7 @@ function VoiceBarNotification({ notifications, pos, onDismiss }) {
|
|
|
11682
11896
|
el.removeEventListener("mouseleave", leave);
|
|
11683
11897
|
};
|
|
11684
11898
|
}, []);
|
|
11685
|
-
|
|
11899
|
+
useEffect45(() => {
|
|
11686
11900
|
if (paused)
|
|
11687
11901
|
return;
|
|
11688
11902
|
const rotate = setInterval(() => setIndex((current) => (current + 1) % notifications.length), TIP_ROTATE_MS);
|
|
@@ -11754,7 +11968,7 @@ function VoiceBarNotification({ notifications, pos, onDismiss }) {
|
|
|
11754
11968
|
}
|
|
11755
11969
|
|
|
11756
11970
|
// src/components/VoiceBarPlanCard.tsx
|
|
11757
|
-
import { useEffect as
|
|
11971
|
+
import { useEffect as useEffect46, useState as useState37 } from "react";
|
|
11758
11972
|
import { jsx as jsx51, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
11759
11973
|
var APPROVING_RESET_MS2 = 8000;
|
|
11760
11974
|
function StepIndicator({ step }) {
|
|
@@ -11789,8 +12003,8 @@ function VoiceBarPlanCard({
|
|
|
11789
12003
|
embedded = false
|
|
11790
12004
|
}) {
|
|
11791
12005
|
const awaitingApproval = plan.state === "proposed";
|
|
11792
|
-
const [isApproving, setIsApproving] =
|
|
11793
|
-
const [lastPlanId, setLastPlanId] =
|
|
12006
|
+
const [isApproving, setIsApproving] = useState37(false);
|
|
12007
|
+
const [lastPlanId, setLastPlanId] = useState37(plan.planId);
|
|
11794
12008
|
if (plan.planId !== lastPlanId) {
|
|
11795
12009
|
setLastPlanId(plan.planId);
|
|
11796
12010
|
setIsApproving(false);
|
|
@@ -11805,13 +12019,13 @@ function VoiceBarPlanCard({
|
|
|
11805
12019
|
const cancel = () => {
|
|
11806
12020
|
sendChatMessage(CANCEL_MESSAGE).catch((e) => console.warn("[Skippr] plan reply failed", e));
|
|
11807
12021
|
};
|
|
11808
|
-
|
|
12022
|
+
useEffect46(() => {
|
|
11809
12023
|
if (!isApproving)
|
|
11810
12024
|
return;
|
|
11811
12025
|
const timer = setTimeout(() => setIsApproving(false), APPROVING_RESET_MS2);
|
|
11812
12026
|
return () => clearTimeout(timer);
|
|
11813
12027
|
}, [isApproving]);
|
|
11814
|
-
|
|
12028
|
+
useEffect46(() => {
|
|
11815
12029
|
if (plan.state !== "completed")
|
|
11816
12030
|
return;
|
|
11817
12031
|
const timer = setTimeout(onDismiss, COMPLETED_CARD_VISIBLE_MS);
|
|
@@ -12024,8 +12238,8 @@ function ShortcutHint({
|
|
|
12024
12238
|
children
|
|
12025
12239
|
}) {
|
|
12026
12240
|
const ref = useRef42(null);
|
|
12027
|
-
const [visible, setVisible] =
|
|
12028
|
-
|
|
12241
|
+
const [visible, setVisible] = useState38(false);
|
|
12242
|
+
useEffect47(() => {
|
|
12029
12243
|
if (!enabled)
|
|
12030
12244
|
return;
|
|
12031
12245
|
const el = ref.current;
|
|
@@ -12140,15 +12354,22 @@ function VoiceBarFrame({
|
|
|
12140
12354
|
textMode,
|
|
12141
12355
|
captureMode,
|
|
12142
12356
|
chatActivityAt,
|
|
12143
|
-
setAutoStartAfterLogin
|
|
12357
|
+
setAutoStartAfterLogin,
|
|
12358
|
+
error,
|
|
12359
|
+
errorSeq,
|
|
12360
|
+
authFailed,
|
|
12361
|
+
modulesError,
|
|
12362
|
+
locale
|
|
12144
12363
|
} = ctx;
|
|
12145
12364
|
const needsLogin = !usesHostAuth && !isAuthenticated;
|
|
12146
|
-
const
|
|
12147
|
-
|
|
12365
|
+
const transientError = useTransientError(error, errorSeq);
|
|
12366
|
+
const authFailedCopy = authFailed ? resolveAuthFailedCopy(locale) : null;
|
|
12367
|
+
const [loginOpen, setLoginOpen] = useState38(false);
|
|
12368
|
+
useEffect47(() => {
|
|
12148
12369
|
if (!needsLogin)
|
|
12149
12370
|
setLoginOpen(false);
|
|
12150
12371
|
}, [needsLogin]);
|
|
12151
|
-
const [bannerOpen, setBannerOpen] =
|
|
12372
|
+
const [bannerOpen, setBannerOpen] = useState38(false);
|
|
12152
12373
|
const hasNotifications = notifications.length > 0;
|
|
12153
12374
|
const notifAccent = notifications[0]?.accentColor;
|
|
12154
12375
|
const closeBanner = useCallback34(() => setBannerOpen(false), []);
|
|
@@ -12171,9 +12392,9 @@ function VoiceBarFrame({
|
|
|
12171
12392
|
const plan = usePlanUpdates();
|
|
12172
12393
|
const linkCard = useLinkCard();
|
|
12173
12394
|
const { sendChatMessage } = useChatMessages();
|
|
12174
|
-
const [dismissedFloatingPlanId, setDismissedFloatingPlanId] =
|
|
12175
|
-
const [dismissedBlockPlanId, setDismissedBlockPlanId] =
|
|
12176
|
-
const [dismissedLinkCardId, setDismissedLinkCardId] =
|
|
12395
|
+
const [dismissedFloatingPlanId, setDismissedFloatingPlanId] = useState38(null);
|
|
12396
|
+
const [dismissedBlockPlanId, setDismissedBlockPlanId] = useState38(null);
|
|
12397
|
+
const [dismissedLinkCardId, setDismissedLinkCardId] = useState38(null);
|
|
12177
12398
|
const micMode = agentControls?.micMode;
|
|
12178
12399
|
const pushOrTap = isRequestResponseMicMode(micMode);
|
|
12179
12400
|
const isPushToTalk = micMode === MIC_MODE.PushToTalk;
|
|
@@ -12182,9 +12403,9 @@ function VoiceBarFrame({
|
|
|
12182
12403
|
const showActionControl = isConnected && captureMode === CAPTURE_MODE.Auto && actionsActive;
|
|
12183
12404
|
const chatSurface = agentControls?.chat ?? DEFAULT_CHAT_SURFACE;
|
|
12184
12405
|
const isRoomChat = chatSurface === CHAT_SURFACE.Room;
|
|
12185
|
-
const [chatLineOpen, setChatLineOpen] =
|
|
12186
|
-
const [chatLineMounted, setChatLineMounted] =
|
|
12187
|
-
const [chatLineClosing, setChatLineClosing] =
|
|
12406
|
+
const [chatLineOpen, setChatLineOpen] = useState38(false);
|
|
12407
|
+
const [chatLineMounted, setChatLineMounted] = useState38(false);
|
|
12408
|
+
const [chatLineClosing, setChatLineClosing] = useState38(false);
|
|
12188
12409
|
const chatOpen = isRoomChat ? isPanelOpen : chatLineOpen;
|
|
12189
12410
|
const lineBlockOpen = !isRoomChat && chatLineMounted;
|
|
12190
12411
|
const toggleChat = () => {
|
|
@@ -12194,7 +12415,7 @@ function VoiceBarFrame({
|
|
|
12194
12415
|
setChatLineOpen((open) => !open);
|
|
12195
12416
|
}
|
|
12196
12417
|
};
|
|
12197
|
-
|
|
12418
|
+
useEffect47(() => {
|
|
12198
12419
|
if (chatLineOpen) {
|
|
12199
12420
|
setChatLineMounted(true);
|
|
12200
12421
|
setChatLineClosing(false);
|
|
@@ -12223,7 +12444,7 @@ function VoiceBarFrame({
|
|
|
12223
12444
|
const showLivePill = !isLoading && isConnected && !textMode && !pushOrTap;
|
|
12224
12445
|
const barWidthPx = !showLivePill ? VOICE_BAR_WIDTH_PX : isHeld ? 120 : 156;
|
|
12225
12446
|
barWidthRef.current = barWidthPx;
|
|
12226
|
-
|
|
12447
|
+
useEffect47(() => {
|
|
12227
12448
|
const inBounds = clampBarPos(pos, barWidthPx);
|
|
12228
12449
|
if (inBounds.x !== pos.x)
|
|
12229
12450
|
onDrop(inBounds, barWidthPx);
|
|
@@ -12249,17 +12470,17 @@ function VoiceBarFrame({
|
|
|
12249
12470
|
const requestLabel = agentStateLabel ?? (isCapturingSpeech ? "listening…" : idleRequestLabel);
|
|
12250
12471
|
const livePillBg = agentActive && !isHeld ? "var(--skippr-brand-active)" : "var(--skippr-brand, #2bc0ae)";
|
|
12251
12472
|
const glow = isConnected && !isHeld && agentActive;
|
|
12252
|
-
const [autoOffClosing, setAutoOffClosing] =
|
|
12473
|
+
const [autoOffClosing, setAutoOffClosing] = useState38(false);
|
|
12253
12474
|
const { reportActivity } = useIdleAutoOff({
|
|
12254
12475
|
enabled: isConnected && !autoOffClosing,
|
|
12255
12476
|
active: agentActive || isCapturingSpeech || isUserSpeaking,
|
|
12256
12477
|
onExpire: () => setAutoOffClosing(true)
|
|
12257
12478
|
});
|
|
12258
|
-
|
|
12479
|
+
useEffect47(() => {
|
|
12259
12480
|
if (chatActivityAt)
|
|
12260
12481
|
reportActivity();
|
|
12261
12482
|
}, [chatActivityAt, reportActivity]);
|
|
12262
|
-
|
|
12483
|
+
useEffect47(() => {
|
|
12263
12484
|
if (!autoOffClosing)
|
|
12264
12485
|
return;
|
|
12265
12486
|
if (!isConnected) {
|
|
@@ -12275,12 +12496,12 @@ function VoiceBarFrame({
|
|
|
12275
12496
|
const floatingPlanActive = planEnabled && !isRoomChat && !lineBlockOpen && activePlan.planId !== dismissedFloatingPlanId;
|
|
12276
12497
|
const planInLineBlock = planEnabled && lineBlockOpen && activePlan.planId !== dismissedBlockPlanId;
|
|
12277
12498
|
const planCardActive = floatingPlanActive || planInLineBlock;
|
|
12278
|
-
|
|
12499
|
+
useEffect47(() => {
|
|
12279
12500
|
if (lineBlockOpen)
|
|
12280
12501
|
setDismissedBlockPlanId(null);
|
|
12281
12502
|
}, [lineBlockOpen]);
|
|
12282
|
-
const [autoOpenedPlanId, setAutoOpenedPlanId] =
|
|
12283
|
-
|
|
12503
|
+
const [autoOpenedPlanId, setAutoOpenedPlanId] = useState38(null);
|
|
12504
|
+
useEffect47(() => {
|
|
12284
12505
|
if (!isRoomChat || !planEnabled || !activePlan)
|
|
12285
12506
|
return;
|
|
12286
12507
|
if (activePlan.planId === autoOpenedPlanId)
|
|
@@ -12292,7 +12513,8 @@ function VoiceBarFrame({
|
|
|
12292
12513
|
const visibleLinkCard = linkCard && linkCard.cardId !== dismissedLinkCardId ? linkCard : null;
|
|
12293
12514
|
const linkCardActive = !!visibleLinkCard && isConnected && !planCardActive && !(isRoomChat && chatOpen) && !isCapturingSpeech && !isHeld && !autoOffClosing;
|
|
12294
12515
|
const bannerActive = hasNotifications && bannerOpen;
|
|
12295
|
-
const
|
|
12516
|
+
const midSessionError = sessionLive && !isRoomChat && !!transientError && !planCardActive && !linkCardActive;
|
|
12517
|
+
const slotClaimed = chatOpen || bannerActive || lineBlockOpen || midSessionError;
|
|
12296
12518
|
const autoBase = showLivePill && !autoOffClosing;
|
|
12297
12519
|
const showLiveStrip = !slotClaimed && autoBase && !isHeld && !planCardActive && (state === "thinking" || showActionControl);
|
|
12298
12520
|
const showTimerStrip = !slotClaimed && !autoOffClosing && !isCapturingSpeech && !planCardActive && !showLiveStrip && !isHeld && !!sessionTimer;
|
|
@@ -12433,13 +12655,30 @@ function VoiceBarFrame({
|
|
|
12433
12655
|
}
|
|
12434
12656
|
})
|
|
12435
12657
|
}),
|
|
12436
|
-
!sessionLive && !needsLogin && !bannerActive && /* @__PURE__ */ jsx52("div", {
|
|
12658
|
+
(!sessionLive || midSessionError) && !needsLogin && !bannerActive && /* @__PURE__ */ jsx52("div", {
|
|
12437
12659
|
style: planCardStyle,
|
|
12438
12660
|
className: "skippr:z-[6]",
|
|
12439
12661
|
"data-skippr-no-drag": "",
|
|
12440
12662
|
children: /* @__PURE__ */ jsx52("div", {
|
|
12441
12663
|
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__ */
|
|
12664
|
+
children: !isRoomChat && authFailedCopy ? /* @__PURE__ */ jsxs41("div", {
|
|
12665
|
+
role: "alert",
|
|
12666
|
+
className: "skippr:text-center",
|
|
12667
|
+
children: [
|
|
12668
|
+
/* @__PURE__ */ jsx52("p", {
|
|
12669
|
+
className: "skippr:text-[11px] skippr:font-medium skippr:leading-[1.2] skippr:text-destructive",
|
|
12670
|
+
children: authFailedCopy.title
|
|
12671
|
+
}),
|
|
12672
|
+
/* @__PURE__ */ jsx52("p", {
|
|
12673
|
+
className: "skippr:mt-0.5 skippr:text-[10px] skippr:leading-[1.2] skippr:text-muted-foreground",
|
|
12674
|
+
children: authFailedCopy.hint
|
|
12675
|
+
})
|
|
12676
|
+
]
|
|
12677
|
+
}) : !isRoomChat && (modulesError || transientError) ? /* @__PURE__ */ jsx52("p", {
|
|
12678
|
+
role: "alert",
|
|
12679
|
+
className: "skippr:text-[11px] skippr:leading-[1.2] skippr:text-destructive skippr:text-center",
|
|
12680
|
+
children: modulesError || transientError
|
|
12681
|
+
}) : /* @__PURE__ */ jsx52(ConsentNotice, {
|
|
12443
12682
|
template: CONSENT_NOTICE_SESSION_START
|
|
12444
12683
|
})
|
|
12445
12684
|
})
|
|
@@ -12644,10 +12883,10 @@ function VoiceBarFrame({
|
|
|
12644
12883
|
}
|
|
12645
12884
|
|
|
12646
12885
|
// src/components/VoiceBarLauncher.tsx
|
|
12647
|
-
import { useCallback as useCallback35, useEffect as
|
|
12886
|
+
import { useCallback as useCallback35, useEffect as useEffect49, useRef as useRef44, useState as useState40 } from "react";
|
|
12648
12887
|
|
|
12649
12888
|
// src/components/LauncherNotification.tsx
|
|
12650
|
-
import { useEffect as
|
|
12889
|
+
import { useEffect as useEffect48, useRef as useRef43, useState as useState39 } from "react";
|
|
12651
12890
|
import { jsx as jsx53, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
12652
12891
|
function LauncherNotification({
|
|
12653
12892
|
notifications,
|
|
@@ -12655,10 +12894,10 @@ function LauncherNotification({
|
|
|
12655
12894
|
mode,
|
|
12656
12895
|
onDismiss
|
|
12657
12896
|
}) {
|
|
12658
|
-
const [index2, setIndex] =
|
|
12659
|
-
const [paused, setPaused] =
|
|
12897
|
+
const [index2, setIndex] = useState39(0);
|
|
12898
|
+
const [paused, setPaused] = useState39(false);
|
|
12660
12899
|
const cardRef = useRef43(null);
|
|
12661
|
-
|
|
12900
|
+
useEffect48(() => {
|
|
12662
12901
|
const el = cardRef.current;
|
|
12663
12902
|
if (!el)
|
|
12664
12903
|
return;
|
|
@@ -12671,7 +12910,7 @@ function LauncherNotification({
|
|
|
12671
12910
|
el.removeEventListener("mouseleave", leave);
|
|
12672
12911
|
};
|
|
12673
12912
|
}, []);
|
|
12674
|
-
|
|
12913
|
+
useEffect48(() => {
|
|
12675
12914
|
if (paused)
|
|
12676
12915
|
return;
|
|
12677
12916
|
const rotate = setInterval(() => setIndex((current) => (current + 1) % notifications.length), TIP_ROTATE_MS);
|
|
@@ -12896,16 +13135,16 @@ function VoiceBarLauncher({
|
|
|
12896
13135
|
}, [onDrop]);
|
|
12897
13136
|
const { wasDraggedRef } = useVoiceBarDrag(containerRef, onDropPos, null, setDragging);
|
|
12898
13137
|
const horizontal = isHorizontalEdge(dock.edge);
|
|
12899
|
-
const [cardOpen, setCardOpen] =
|
|
12900
|
-
const [loginOpen, setLoginOpen] =
|
|
12901
|
-
const [hovered, setHovered] =
|
|
12902
|
-
|
|
13138
|
+
const [cardOpen, setCardOpen] = useState40(false);
|
|
13139
|
+
const [loginOpen, setLoginOpen] = useState40(false);
|
|
13140
|
+
const [hovered, setHovered] = useState40(false);
|
|
13141
|
+
useEffect49(() => {
|
|
12903
13142
|
if (!needsLogin)
|
|
12904
13143
|
setLoginOpen(false);
|
|
12905
13144
|
}, [needsLogin]);
|
|
12906
13145
|
const hasNotif = notifications.length > 0;
|
|
12907
13146
|
const dotColor = notifications.find((item) => item.kind === NOTIFICATION_KIND.Module)?.accentColor ?? notifications[0]?.accentColor ?? NOTIF_ACCENT_COLOR;
|
|
12908
|
-
|
|
13147
|
+
useEffect49(() => {
|
|
12909
13148
|
const el = containerRef.current;
|
|
12910
13149
|
if (!el)
|
|
12911
13150
|
return;
|
|
@@ -13191,7 +13430,7 @@ function PlanPanelOpener() {
|
|
|
13191
13430
|
const plan = usePlanUpdates();
|
|
13192
13431
|
const { expandPanel } = useLiveAgent();
|
|
13193
13432
|
const surfacedPlanIdRef = useRef45(null);
|
|
13194
|
-
|
|
13433
|
+
useEffect50(() => {
|
|
13195
13434
|
if (plan?.state !== "proposed" || surfacedPlanIdRef.current === plan.planId)
|
|
13196
13435
|
return;
|
|
13197
13436
|
surfacedPlanIdRef.current = plan.planId;
|
|
@@ -13229,12 +13468,13 @@ function LiveAgent(props) {
|
|
|
13229
13468
|
console.warn('[Skippr] agentControls requires captureMode: "auto"');
|
|
13230
13469
|
}
|
|
13231
13470
|
}
|
|
13232
|
-
const
|
|
13471
|
+
const locale = useDetectedLocale(hostLocale);
|
|
13472
|
+
const auth = useAuth({ appKey, locale });
|
|
13233
13473
|
const usesHostAuth = !!getUserToken || !!userToken || !!authTokenProp;
|
|
13234
13474
|
const effectiveAuthToken = usesHostAuth ? authTokenProp : auth.authToken ?? undefined;
|
|
13235
|
-
const [activeModule, setActiveModule] =
|
|
13236
|
-
const [sessionAgentMode, setSessionAgentMode] =
|
|
13237
|
-
const [isExchanging, setIsExchanging] =
|
|
13475
|
+
const [activeModule, setActiveModule] = useState41(null);
|
|
13476
|
+
const [sessionAgentMode, setSessionAgentMode] = useState41(null);
|
|
13477
|
+
const [isExchanging, setIsExchanging] = useState41(false);
|
|
13238
13478
|
const minimizeOnSessionStart = useCallback36(() => {
|
|
13239
13479
|
if (minimizable) {
|
|
13240
13480
|
setIsMinimized(true);
|
|
@@ -13264,6 +13504,7 @@ function LiveAgent(props) {
|
|
|
13264
13504
|
isDisconnecting,
|
|
13265
13505
|
isPausing,
|
|
13266
13506
|
error,
|
|
13507
|
+
errorSeq,
|
|
13267
13508
|
errorCode,
|
|
13268
13509
|
startSession: startSessionRaw,
|
|
13269
13510
|
pauseSession,
|
|
@@ -13278,6 +13519,7 @@ function LiveAgent(props) {
|
|
|
13278
13519
|
authFailed
|
|
13279
13520
|
} = useSession({
|
|
13280
13521
|
captureMode,
|
|
13522
|
+
locale,
|
|
13281
13523
|
authToken: effectiveAuthToken,
|
|
13282
13524
|
appKey,
|
|
13283
13525
|
getUserToken,
|
|
@@ -13302,29 +13544,28 @@ function LiveAgent(props) {
|
|
|
13302
13544
|
return;
|
|
13303
13545
|
disconnect();
|
|
13304
13546
|
}, [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] =
|
|
13547
|
+
const [isPanelOpen, setIsPanelOpen] = useState41(defaultOpen);
|
|
13548
|
+
const [panelEntry, setPanelEntry] = useState41(PANEL_ENTRY.Launcher);
|
|
13549
|
+
const [isMinimized, setIsMinimized] = useState41(minimizable && !defaultOpen);
|
|
13550
|
+
const [pendingStart, setPendingStart] = useState41(null);
|
|
13551
|
+
const [sidebarTab, setSidebarTab] = useState41("agenda");
|
|
13552
|
+
const [phasesSnapshot, setPhasesSnapshot] = useState41([]);
|
|
13553
|
+
const [startMuted, setStartMuted] = useState41(false);
|
|
13554
|
+
const [textMode, setTextMode] = useState41(false);
|
|
13555
|
+
const [panelExpanded, setPanelExpanded] = useState41(false);
|
|
13314
13556
|
const togglePanelExpanded = useCallback36(() => setPanelExpanded((prev) => !prev), []);
|
|
13315
13557
|
const panelRef = useRef45(null);
|
|
13316
13558
|
const controlBarRef = useRef45(null);
|
|
13317
13559
|
const voiceBarRef = useRef45(null);
|
|
13318
|
-
const [isDragging, setIsDragging] =
|
|
13560
|
+
const [isDragging, setIsDragging] = useState41(false);
|
|
13319
13561
|
const setTextModeState = useCallback36((enabled) => {
|
|
13320
13562
|
setTextMode(enabled);
|
|
13321
13563
|
}, []);
|
|
13322
13564
|
const showControlBar = isConnected || isStarting || isPausing;
|
|
13323
|
-
|
|
13565
|
+
useEffect50(() => {
|
|
13324
13566
|
if (!isConnected)
|
|
13325
13567
|
setTextModeState(false);
|
|
13326
13568
|
}, [isConnected, setTextModeState]);
|
|
13327
|
-
const locale = useDetectedLocale(hostLocale);
|
|
13328
13569
|
const {
|
|
13329
13570
|
modules: availableModules,
|
|
13330
13571
|
defaultSelection,
|
|
@@ -13358,7 +13599,13 @@ function LiveAgent(props) {
|
|
|
13358
13599
|
const buddyActive = isBuddyActive(appearance) && variant !== "sidebar" && !hostAgentId;
|
|
13359
13600
|
const buddyShape = appearance?.buddy?.shape ?? DEFAULT_BUDDY_SHAPE;
|
|
13360
13601
|
const effectiveHostAgentId = buddyActive ? undefined : hostAgentId;
|
|
13361
|
-
const startSession = useCallback36((opts) =>
|
|
13602
|
+
const startSession = useCallback36((opts) => {
|
|
13603
|
+
const named = {
|
|
13604
|
+
...opts,
|
|
13605
|
+
agentName: availableModules.find((m) => m.id === opts.agentId)?.name
|
|
13606
|
+
};
|
|
13607
|
+
return startSessionRaw(buddyActive ? { ...named, agentControls: buddyEffectiveControls(named.agentControls) } : named);
|
|
13608
|
+
}, [startSessionRaw, buddyActive, availableModules]);
|
|
13362
13609
|
const defaultAgentId = buddyActive ? defaultSelection.agentId : hostAgentId ?? defaultSelection.agentId;
|
|
13363
13610
|
const defaultModule = availableModules.find((m) => m.id === defaultAgentId) ?? null;
|
|
13364
13611
|
const operatingModule = buddyActive ? defaultModule : activeModule ?? (effectiveHostAgentId ? availableModules[0] ?? null : null);
|
|
@@ -13432,10 +13679,10 @@ function LiveAgent(props) {
|
|
|
13432
13679
|
setPendingStart(pending);
|
|
13433
13680
|
setIsMinimized(false);
|
|
13434
13681
|
}, []);
|
|
13435
|
-
const [welcomeDismissed, setWelcomeDismissed] =
|
|
13682
|
+
const [welcomeDismissed, setWelcomeDismissed] = useState41(false);
|
|
13436
13683
|
const dismissWelcome = useCallback36(() => setWelcomeDismissed(true), []);
|
|
13437
|
-
const [savedPosition] =
|
|
13438
|
-
const [currentPosition, setCurrentPosition] =
|
|
13684
|
+
const [savedPosition] = useState41(readSavedPosition);
|
|
13685
|
+
const [currentPosition, setCurrentPosition] = useState41(savedPosition ?? "right");
|
|
13439
13686
|
const positionLockedRef = useRef45(savedPosition !== null);
|
|
13440
13687
|
const setPositionWithPersist = useCallback36((pos) => {
|
|
13441
13688
|
positionLockedRef.current = true;
|
|
@@ -13445,18 +13692,18 @@ function LiveAgent(props) {
|
|
|
13445
13692
|
} catch {}
|
|
13446
13693
|
}, []);
|
|
13447
13694
|
const serverPosition = appearance?.position ?? null;
|
|
13448
|
-
|
|
13695
|
+
useEffect50(() => {
|
|
13449
13696
|
if (!serverPosition || positionLockedRef.current)
|
|
13450
13697
|
return;
|
|
13451
13698
|
setCurrentPosition(serverPosition);
|
|
13452
13699
|
}, [serverPosition]);
|
|
13453
|
-
const [savedLauncherBottom] =
|
|
13700
|
+
const [savedLauncherBottom] = useState41(readSavedLauncherBottom);
|
|
13454
13701
|
const hasDraggedRef = useRef45(savedLauncherBottom !== null);
|
|
13455
13702
|
const verticalAlignRef = useRef45(hostVerticalAlign ?? "bottom");
|
|
13456
|
-
const [launcherBottomPx, setLauncherBottomPxState] =
|
|
13457
|
-
const [popsDown, setPopsDown] =
|
|
13703
|
+
const [launcherBottomPx, setLauncherBottomPxState] = useState41(() => savedLauncherBottom !== null ? clampLauncherBottom(savedLauncherBottom) : verticalAlignToBottomPx(verticalAlignRef.current));
|
|
13704
|
+
const [popsDown, setPopsDown] = useState41(() => launcherPopsDown(launcherBottomPx));
|
|
13458
13705
|
const serverVerticalAlign = appearance?.verticalAlign ?? null;
|
|
13459
|
-
|
|
13706
|
+
useEffect50(() => {
|
|
13460
13707
|
if (!serverVerticalAlign || hostVerticalAlign !== undefined || hasDraggedRef.current)
|
|
13461
13708
|
return;
|
|
13462
13709
|
verticalAlignRef.current = serverVerticalAlign;
|
|
@@ -13474,18 +13721,18 @@ function LiveAgent(props) {
|
|
|
13474
13721
|
}, []);
|
|
13475
13722
|
const launcherBottomPxRef = useRef45(launcherBottomPx);
|
|
13476
13723
|
launcherBottomPxRef.current = launcherBottomPx;
|
|
13477
|
-
const [chatActivityAt, setChatActivityAt] =
|
|
13724
|
+
const [chatActivityAt, setChatActivityAt] = useState41(0);
|
|
13478
13725
|
const reportChatActivity = useCallback36(() => {
|
|
13479
13726
|
const now = Date.now();
|
|
13480
13727
|
setChatActivityAt((last) => now - last < CHAT_ACTIVITY_THROTTLE_MS ? last : now);
|
|
13481
13728
|
}, []);
|
|
13482
|
-
const [chatDraft, setChatDraft] =
|
|
13483
|
-
const [autoStartAfterLogin, setAutoStartAfterLogin] =
|
|
13729
|
+
const [chatDraft, setChatDraft] = useState41("");
|
|
13730
|
+
const [autoStartAfterLogin, setAutoStartAfterLogin] = useState41(false);
|
|
13484
13731
|
const commitLauncherDrop = useCallback36(({ side, bottomPx }) => {
|
|
13485
13732
|
setPositionWithPersist(side);
|
|
13486
13733
|
setLauncherBottomPx(bottomPx);
|
|
13487
13734
|
}, [setPositionWithPersist, setLauncherBottomPx]);
|
|
13488
|
-
const [barPos, setBarPosState] =
|
|
13735
|
+
const [barPos, setBarPosState] = useState41(() => readSavedBarPos());
|
|
13489
13736
|
const barPosRatioRef = useRef45(barPos === null ? null : barPosRatio(barPos));
|
|
13490
13737
|
const setBarPos = useCallback36((next, widthPx) => {
|
|
13491
13738
|
const placed = clampBarPos(next, widthPx);
|
|
@@ -13493,7 +13740,7 @@ function LiveAgent(props) {
|
|
|
13493
13740
|
persistBarPos(placed);
|
|
13494
13741
|
barPosRatioRef.current = barPosRatio(placed);
|
|
13495
13742
|
}, []);
|
|
13496
|
-
const [savedLauncherDock, setSavedLauncherDock] =
|
|
13743
|
+
const [savedLauncherDock, setSavedLauncherDock] = useState41(() => readSavedDock("launcher"));
|
|
13497
13744
|
const setLauncherDock = useCallback36((next) => {
|
|
13498
13745
|
setSavedLauncherDock(next);
|
|
13499
13746
|
persistDock("launcher", next);
|
|
@@ -13503,7 +13750,7 @@ function LiveAgent(props) {
|
|
|
13503
13750
|
edge: launcherEdge,
|
|
13504
13751
|
offsetPx: defaultOffset(launcherEdge)
|
|
13505
13752
|
};
|
|
13506
|
-
|
|
13753
|
+
useEffect50(() => {
|
|
13507
13754
|
const syncToViewport = () => {
|
|
13508
13755
|
const next = hasDraggedRef.current ? clampLauncherBottom(launcherBottomPxRef.current) : verticalAlignToBottomPx(verticalAlignRef.current);
|
|
13509
13756
|
setLauncherBottomPxState(next);
|
|
@@ -13513,7 +13760,7 @@ function LiveAgent(props) {
|
|
|
13513
13760
|
window.addEventListener("resize", syncToViewport);
|
|
13514
13761
|
return () => window.removeEventListener("resize", syncToViewport);
|
|
13515
13762
|
}, []);
|
|
13516
|
-
|
|
13763
|
+
useEffect50(() => {
|
|
13517
13764
|
const syncBarToViewport = () => {
|
|
13518
13765
|
const ratios = barPosRatioRef.current;
|
|
13519
13766
|
const measured = voiceBarRef.current?.getBoundingClientRect().width;
|
|
@@ -13596,7 +13843,7 @@ function LiveAgent(props) {
|
|
|
13596
13843
|
bearerToken,
|
|
13597
13844
|
selectModule
|
|
13598
13845
|
});
|
|
13599
|
-
|
|
13846
|
+
useEffect50(() => {
|
|
13600
13847
|
if (!autoStartAfterLogin)
|
|
13601
13848
|
return;
|
|
13602
13849
|
if (bearerToken === null || !hasResolvedModules || isSessionLive)
|
|
@@ -13629,7 +13876,7 @@ function LiveAgent(props) {
|
|
|
13629
13876
|
phases: idleHistoryPhases,
|
|
13630
13877
|
isLoading: isLoadingHistory
|
|
13631
13878
|
}), [idleHistoryMessages, idleHistoryPhases, isLoadingHistory]);
|
|
13632
|
-
const [pageSplashDismissed, setPageSplashDismissed] =
|
|
13879
|
+
const [pageSplashDismissed, setPageSplashDismissed] = useState41(false);
|
|
13633
13880
|
const dismissSplash = useCallback36((surface) => {
|
|
13634
13881
|
if (surface !== SPLASH_SURFACE.Panel) {
|
|
13635
13882
|
setPageSplashDismissed(true);
|
|
@@ -13667,7 +13914,7 @@ function LiveAgent(props) {
|
|
|
13667
13914
|
isSplashVisible: splashSurfaces.overlay || splashSurfaces.panel || splashSurfaces.applies && !pageSplashDismissed,
|
|
13668
13915
|
isSessionLive
|
|
13669
13916
|
});
|
|
13670
|
-
|
|
13917
|
+
useEffect50(() => {
|
|
13671
13918
|
const open = () => {
|
|
13672
13919
|
reopenSplash();
|
|
13673
13920
|
if (configuredSplashSurfaces.overlay)
|
|
@@ -13689,6 +13936,7 @@ function LiveAgent(props) {
|
|
|
13689
13936
|
isDisconnecting,
|
|
13690
13937
|
isPausing,
|
|
13691
13938
|
error,
|
|
13939
|
+
errorSeq,
|
|
13692
13940
|
errorCode,
|
|
13693
13941
|
startSession,
|
|
13694
13942
|
pauseSession: pauseSessionAndMinimize,
|
|
@@ -13736,6 +13984,7 @@ function LiveAgent(props) {
|
|
|
13736
13984
|
isAuthenticated,
|
|
13737
13985
|
usesHostAuth,
|
|
13738
13986
|
authFailed,
|
|
13987
|
+
locale,
|
|
13739
13988
|
isValidating: auth.isValidating,
|
|
13740
13989
|
authError: auth.error,
|
|
13741
13990
|
requestOtp: auth.requestOtp,
|
|
@@ -13792,6 +14041,7 @@ function LiveAgent(props) {
|
|
|
13792
14041
|
isDisconnecting,
|
|
13793
14042
|
isPausing,
|
|
13794
14043
|
error,
|
|
14044
|
+
errorSeq,
|
|
13795
14045
|
errorCode,
|
|
13796
14046
|
startSession,
|
|
13797
14047
|
pauseSessionAndMinimize,
|
|
@@ -13833,6 +14083,7 @@ function LiveAgent(props) {
|
|
|
13833
14083
|
isAuthenticated,
|
|
13834
14084
|
usesHostAuth,
|
|
13835
14085
|
authFailed,
|
|
14086
|
+
locale,
|
|
13836
14087
|
auth.isValidating,
|
|
13837
14088
|
auth.error,
|
|
13838
14089
|
auth.requestOtp,
|
|
@@ -13970,7 +14221,7 @@ function LiveAgent(props) {
|
|
|
13970
14221
|
});
|
|
13971
14222
|
}
|
|
13972
14223
|
// src/components/SplashScreen.tsx
|
|
13973
|
-
import { useContext as useContext28, useEffect as
|
|
14224
|
+
import { useContext as useContext28, useEffect as useEffect51, useRef as useRef46 } from "react";
|
|
13974
14225
|
import { jsx as jsx57 } from "react/jsx-runtime";
|
|
13975
14226
|
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
14227
|
function SplashScreen({ className, onDismiss }) {
|
|
@@ -13981,7 +14232,7 @@ function SplashScreen({ className, onDismiss }) {
|
|
|
13981
14232
|
const disabledWarnedRef = useRef46(false);
|
|
13982
14233
|
const hasResolvedModules = ctx.hasResolvedModules;
|
|
13983
14234
|
const isSplashConfigured = ctx.isSplashConfigured;
|
|
13984
|
-
|
|
14235
|
+
useEffect51(() => {
|
|
13985
14236
|
if (!hasResolvedModules || isSplashConfigured || disabledWarnedRef.current)
|
|
13986
14237
|
return;
|
|
13987
14238
|
disabledWarnedRef.current = true;
|