@skippr/live-agent-sdk 0.111.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 +599 -353
- package/dist/skippr-sdk.css +1 -1
- package/dist/skippr-sdk.js +101 -101
- package/dist/types/components/VoiceBarFrame.d.ts +1 -1
- package/dist/types/context/LiveAgentContext.d.ts +3 -1
- 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/hooks/useVoiceBarDrag.d.ts +1 -1
- package/dist/types/lib/apiError.d.ts +7 -0
- package/dist/types/lib/errorCopy.d.ts +13 -0
- package/dist/types/lib/voiceBar.d.ts +6 -1
- 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));
|
|
@@ -4890,20 +5101,24 @@ function readSavedBarPos() {
|
|
|
4890
5101
|
return clampBarPos({
|
|
4891
5102
|
x: xRatio * window.innerWidth,
|
|
4892
5103
|
y: yRatio * window.innerHeight
|
|
4893
|
-
});
|
|
5104
|
+
}, VOICE_BAR_WIDTH_PX);
|
|
4894
5105
|
} catch {}
|
|
4895
5106
|
return null;
|
|
4896
5107
|
}
|
|
5108
|
+
function barPosRatio(pos) {
|
|
5109
|
+
return { xRatio: pos.x / window.innerWidth, yRatio: pos.y / window.innerHeight };
|
|
5110
|
+
}
|
|
4897
5111
|
function persistBarPos(pos) {
|
|
4898
5112
|
try {
|
|
4899
|
-
|
|
4900
|
-
localStorage.setItem(
|
|
5113
|
+
const { xRatio, yRatio } = barPosRatio(pos);
|
|
5114
|
+
localStorage.setItem(BAR_X_RATIO_KEY, String(xRatio));
|
|
5115
|
+
localStorage.setItem(BAR_Y_RATIO_KEY, String(yRatio));
|
|
4901
5116
|
} catch {}
|
|
4902
5117
|
}
|
|
4903
|
-
function clampBarPos(pos) {
|
|
5118
|
+
function clampBarPos(pos, widthPx) {
|
|
4904
5119
|
const m = VOICE_BAR_EDGE_MARGIN_PX;
|
|
4905
5120
|
return {
|
|
4906
|
-
x: Math.round(Math.min(Math.max(pos.x, m), window.innerWidth -
|
|
5121
|
+
x: Math.round(Math.min(Math.max(pos.x, m), window.innerWidth - widthPx - m)),
|
|
4907
5122
|
y: Math.round(Math.min(Math.max(pos.y, m), window.innerHeight - VOICE_BAR_HEIGHT_PX - m))
|
|
4908
5123
|
};
|
|
4909
5124
|
}
|
|
@@ -4917,7 +5132,7 @@ function defaultBarPos() {
|
|
|
4917
5132
|
return clampBarPos({
|
|
4918
5133
|
x: window.innerWidth / 2 - VOICE_BAR_WIDTH_PX / 2,
|
|
4919
5134
|
y: window.innerHeight - VOICE_BAR_EDGE_MARGIN_PX - VOICE_BAR_HEIGHT_PX
|
|
4920
|
-
});
|
|
5135
|
+
}, VOICE_BAR_WIDTH_PX);
|
|
4921
5136
|
}
|
|
4922
5137
|
function barPosStyle(pos) {
|
|
4923
5138
|
return {
|
|
@@ -4930,10 +5145,8 @@ function edgeExtent(edge) {
|
|
|
4930
5145
|
return isHorizontalEdge(edge) ? window.innerWidth : window.innerHeight;
|
|
4931
5146
|
}
|
|
4932
5147
|
function clampOffset(edge, offsetPx) {
|
|
4933
|
-
const
|
|
4934
|
-
|
|
4935
|
-
const max = edgeExtent(edge) - VOICE_BAR_EDGE_MARGIN_PX - halfSize;
|
|
4936
|
-
return Math.round(Math.min(Math.max(offsetPx, min), max));
|
|
5148
|
+
const half = LAUNCHER_DOCK_THICKNESS_PX / 2;
|
|
5149
|
+
return Math.round(Math.min(Math.max(offsetPx, half), edgeExtent(edge) - half));
|
|
4937
5150
|
}
|
|
4938
5151
|
function defaultOffset(edge) {
|
|
4939
5152
|
return clampOffset(edge, edgeExtent(edge) / 2);
|
|
@@ -4964,7 +5177,7 @@ function dockStyleFlush(dock) {
|
|
|
4964
5177
|
}
|
|
4965
5178
|
|
|
4966
5179
|
// src/components/AgentCursor.tsx
|
|
4967
|
-
import { useContext as useContext8, useEffect as
|
|
5180
|
+
import { useContext as useContext8, useEffect as useEffect22, useLayoutEffect, useRef as useRef16, useState as useState20 } from "react";
|
|
4968
5181
|
|
|
4969
5182
|
// src/capture/elementRef.ts
|
|
4970
5183
|
function safeGetIframeDocument(iframe) {
|
|
@@ -5178,12 +5391,12 @@ function AgentCursor({
|
|
|
5178
5391
|
animated = false
|
|
5179
5392
|
}) {
|
|
5180
5393
|
const ctx = useContext8(LiveAgentContext);
|
|
5181
|
-
const [cursor, setCursor] =
|
|
5182
|
-
const [glideMs, setGlideMs] =
|
|
5183
|
-
const [phase, setPhase] =
|
|
5184
|
-
const [ringBox, setRingBox] =
|
|
5185
|
-
const [clickPulse, setClickPulse] =
|
|
5186
|
-
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);
|
|
5187
5400
|
const labelRef = useRef16(null);
|
|
5188
5401
|
const cursorElRef = useRef16(null);
|
|
5189
5402
|
const pathRef = useRef16(null);
|
|
@@ -5307,7 +5520,7 @@ function AgentCursor({
|
|
|
5307
5520
|
});
|
|
5308
5521
|
return cancelAnimation;
|
|
5309
5522
|
}, [target, animated]);
|
|
5310
|
-
|
|
5523
|
+
useEffect22(() => {
|
|
5311
5524
|
if (!target || target.kind === "gesture" || phase === "idle")
|
|
5312
5525
|
return;
|
|
5313
5526
|
const track = () => {
|
|
@@ -5347,7 +5560,7 @@ function AgentCursor({
|
|
|
5347
5560
|
setMeasuredLabelWidth(renderedLabelWidth);
|
|
5348
5561
|
}
|
|
5349
5562
|
}, [phase, measuredLabelWidth, target?.label]);
|
|
5350
|
-
|
|
5563
|
+
useEffect22(() => {
|
|
5351
5564
|
return () => {
|
|
5352
5565
|
traceRef.current?.cancel();
|
|
5353
5566
|
for (const t of timersRef.current)
|
|
@@ -5447,7 +5660,7 @@ function AgentCursor({
|
|
|
5447
5660
|
// src/components/AutoStartMedia.tsx
|
|
5448
5661
|
import { useConnectionState, useLocalParticipant as useLocalParticipant4 } from "@livekit/components-react/hooks";
|
|
5449
5662
|
import { ConnectionState, Track as Track2 } from "livekit-client";
|
|
5450
|
-
import { useEffect as
|
|
5663
|
+
import { useEffect as useEffect23, useRef as useRef17 } from "react";
|
|
5451
5664
|
function AutoStartMedia({
|
|
5452
5665
|
pendingScreenStream,
|
|
5453
5666
|
pushOrTapMicMode = false,
|
|
@@ -5456,7 +5669,7 @@ function AutoStartMedia({
|
|
|
5456
5669
|
const { localParticipant } = useLocalParticipant4();
|
|
5457
5670
|
const connectionState = useConnectionState();
|
|
5458
5671
|
const didStartRef = useRef17(false);
|
|
5459
|
-
|
|
5672
|
+
useEffect23(() => {
|
|
5460
5673
|
if (didStartRef.current)
|
|
5461
5674
|
return;
|
|
5462
5675
|
if (connectionState !== ConnectionState.Connected)
|
|
@@ -5483,7 +5696,7 @@ function AutoStartMedia({
|
|
|
5483
5696
|
// src/components/DomCapture.tsx
|
|
5484
5697
|
import { useConnectionState as useConnectionState2, useLocalParticipant as useLocalParticipant5 } from "@livekit/components-react/hooks";
|
|
5485
5698
|
import { ConnectionState as ConnectionState2, ScreenSharePresets as ScreenSharePresets2, Track as Track3 } from "livekit-client";
|
|
5486
|
-
import { useContext as useContext9, useEffect as
|
|
5699
|
+
import { useContext as useContext9, useEffect as useEffect24, useMemo as useMemo5, useRef as useRef18 } from "react";
|
|
5487
5700
|
|
|
5488
5701
|
// src/capture/a11yUtils.ts
|
|
5489
5702
|
var ROLE_BY_TAG = {
|
|
@@ -6716,7 +6929,7 @@ function DomCapture({ pushOrTapMicMode = false, startMuted = false }) {
|
|
|
6716
6929
|
const pausedRef = useRef18(false);
|
|
6717
6930
|
const freezeCaptureRef = useRef18(null);
|
|
6718
6931
|
const resumeCaptureRef = useRef18(null);
|
|
6719
|
-
|
|
6932
|
+
useEffect24(() => {
|
|
6720
6933
|
if (didStartRef.current)
|
|
6721
6934
|
return;
|
|
6722
6935
|
if (connectionState !== ConnectionState2.Connected)
|
|
@@ -6953,7 +7166,7 @@ function DomCapture({ pushOrTapMicMode = false, startMuted = false }) {
|
|
|
6953
7166
|
track.stop();
|
|
6954
7167
|
};
|
|
6955
7168
|
}, [connectionState, localParticipant, pushOrTapMicMode, startMuted, clearPausedCaptureRef]);
|
|
6956
|
-
|
|
7169
|
+
useEffect24(() => {
|
|
6957
7170
|
if (isHeld) {
|
|
6958
7171
|
freezeCaptureRef.current?.();
|
|
6959
7172
|
} else {
|
|
@@ -6965,7 +7178,7 @@ function DomCapture({ pushOrTapMicMode = false, startMuted = false }) {
|
|
|
6965
7178
|
|
|
6966
7179
|
// src/components/HighlightOverlay.tsx
|
|
6967
7180
|
import { useDataChannel } from "@livekit/components-react/hooks";
|
|
6968
|
-
import { useCallback as useCallback18, useEffect as
|
|
7181
|
+
import { useCallback as useCallback18, useEffect as useEffect25, useRef as useRef19 } from "react";
|
|
6969
7182
|
var HIGHLIGHT_AUTO_CLEAR_MS = 25000;
|
|
6970
7183
|
var textDecoder = new TextDecoder;
|
|
6971
7184
|
function parseHighlightMessage(payload) {
|
|
@@ -7023,8 +7236,8 @@ function HighlightOverlay() {
|
|
|
7023
7236
|
autoClearRef.current = setTimeout(clear, HIGHLIGHT_AUTO_CLEAR_MS);
|
|
7024
7237
|
}, [clear]);
|
|
7025
7238
|
useDataChannel(HIGHLIGHT_TOPIC, onHighlightMessage);
|
|
7026
|
-
|
|
7027
|
-
|
|
7239
|
+
useEffect25(() => onHighlightCleared(clear), [clear]);
|
|
7240
|
+
useEffect25(() => {
|
|
7028
7241
|
const onClick = (event) => {
|
|
7029
7242
|
const target = targetRef.current;
|
|
7030
7243
|
const node = event.target;
|
|
@@ -7034,15 +7247,15 @@ function HighlightOverlay() {
|
|
|
7034
7247
|
document.addEventListener("click", onClick, { capture: true });
|
|
7035
7248
|
return () => document.removeEventListener("click", onClick, { capture: true });
|
|
7036
7249
|
}, [clear]);
|
|
7037
|
-
|
|
7250
|
+
useEffect25(() => clear, [clear]);
|
|
7038
7251
|
return null;
|
|
7039
7252
|
}
|
|
7040
7253
|
|
|
7041
7254
|
// src/components/MinimizedBubble.tsx
|
|
7042
|
-
import { useContext as useContext10, useEffect as
|
|
7255
|
+
import { useContext as useContext10, useEffect as useEffect27, useRef as useRef21, useState as useState21 } from "react";
|
|
7043
7256
|
|
|
7044
7257
|
// src/hooks/useLauncherDrag.ts
|
|
7045
|
-
import { useEffect as
|
|
7258
|
+
import { useEffect as useEffect26, useRef as useRef20 } from "react";
|
|
7046
7259
|
import { flushSync } from "react-dom";
|
|
7047
7260
|
var DRAG_THRESHOLD_PX = 5;
|
|
7048
7261
|
function useLauncherDrag(containerRef, onDrop, followRefs, reportDragging, enabled = true) {
|
|
@@ -7053,7 +7266,7 @@ function useLauncherDrag(containerRef, onDrop, followRefs, reportDragging, enabl
|
|
|
7053
7266
|
followTargetsRef.current = followRefs;
|
|
7054
7267
|
const reportDraggingRef = useRef20(reportDragging);
|
|
7055
7268
|
reportDraggingRef.current = reportDragging;
|
|
7056
|
-
|
|
7269
|
+
useEffect26(() => {
|
|
7057
7270
|
if (!enabled)
|
|
7058
7271
|
return;
|
|
7059
7272
|
const el = containerRef.current;
|
|
@@ -7408,7 +7621,7 @@ function WelcomeBubble({
|
|
|
7408
7621
|
onDismiss,
|
|
7409
7622
|
onClick
|
|
7410
7623
|
}) {
|
|
7411
|
-
|
|
7624
|
+
useEffect27(() => {
|
|
7412
7625
|
const timer = setTimeout(onDismiss, 5000);
|
|
7413
7626
|
return () => clearTimeout(timer);
|
|
7414
7627
|
}, [onDismiss]);
|
|
@@ -7453,14 +7666,14 @@ function MinimizedBubble({
|
|
|
7453
7666
|
commitLauncherDrop,
|
|
7454
7667
|
appearance
|
|
7455
7668
|
} = ctx;
|
|
7456
|
-
const [goalsAutoHidden, setGoalsAutoHidden] =
|
|
7457
|
-
const [isLauncherHovered, setIsLauncherHovered] =
|
|
7458
|
-
const [visitHref, setVisitHref] =
|
|
7669
|
+
const [goalsAutoHidden, setGoalsAutoHidden] = useState21(false);
|
|
7670
|
+
const [isLauncherHovered, setIsLauncherHovered] = useState21(false);
|
|
7671
|
+
const [visitHref, setVisitHref] = useState21(() => window.location.href);
|
|
7459
7672
|
const revealedHrefRef = useRef21(null);
|
|
7460
7673
|
const hoverContainerRef = useRef21(null);
|
|
7461
7674
|
const closeTimerRef = useRef21(null);
|
|
7462
|
-
|
|
7463
|
-
|
|
7675
|
+
useEffect27(() => subscribeToLocationChange(() => setVisitHref(window.location.href)), []);
|
|
7676
|
+
useEffect27(() => {
|
|
7464
7677
|
const el = hoverContainerRef.current;
|
|
7465
7678
|
if (!el)
|
|
7466
7679
|
return;
|
|
@@ -7499,7 +7712,7 @@ function MinimizedBubble({
|
|
|
7499
7712
|
const onboardingModule = pillCandidates.find((module) => module.type === "onboarding");
|
|
7500
7713
|
const modulePills = onboardingModule ? [onboardingModule] : pillCandidates.slice(0, MAX_MODULE_PILLS).reverse();
|
|
7501
7714
|
const goalsEligible = adoptionGoals.length > 0 && !onboardingModule && hasResolvedModules;
|
|
7502
|
-
|
|
7715
|
+
useEffect27(() => {
|
|
7503
7716
|
if (!goalsEligible)
|
|
7504
7717
|
return;
|
|
7505
7718
|
if (revealedHrefRef.current === visitHref) {
|
|
@@ -7513,8 +7726,8 @@ function MinimizedBubble({
|
|
|
7513
7726
|
}, [goalsEligible, visitHref]);
|
|
7514
7727
|
const matchedGoals = goalsEligible ? adoptionGoals.slice(0, MAX_GOAL_BUBBLES) : [];
|
|
7515
7728
|
const goalsHidden = goalsAutoHidden && !isLauncherHovered;
|
|
7516
|
-
const [goalsUnmounted, setGoalsUnmounted] =
|
|
7517
|
-
|
|
7729
|
+
const [goalsUnmounted, setGoalsUnmounted] = useState21(false);
|
|
7730
|
+
useEffect27(() => {
|
|
7518
7731
|
if (!goalsHidden) {
|
|
7519
7732
|
setGoalsUnmounted(false);
|
|
7520
7733
|
return;
|
|
@@ -7599,7 +7812,7 @@ function MinimizedBubble({
|
|
|
7599
7812
|
|
|
7600
7813
|
// src/components/PageActionHandler.tsx
|
|
7601
7814
|
import { useDataChannel as useDataChannel2 } from "@livekit/components-react/hooks";
|
|
7602
|
-
import { useCallback as useCallback19, useEffect as
|
|
7815
|
+
import { useCallback as useCallback19, useEffect as useEffect28, useRef as useRef22 } from "react";
|
|
7603
7816
|
var STEP_MAX_WAIT_MS = 5000;
|
|
7604
7817
|
var POST_ACTION_SETTLE_SNAPSHOT_MS = 300;
|
|
7605
7818
|
var TRAILING_ACTION_FLUSH_AFTER_STOP_MS = 1000;
|
|
@@ -7937,7 +8150,7 @@ function PageActionHandler() {
|
|
|
7937
8150
|
queueRef.current.push(action);
|
|
7938
8151
|
drain();
|
|
7939
8152
|
}, [drain]);
|
|
7940
|
-
|
|
8153
|
+
useEffect28(() => {
|
|
7941
8154
|
mountedRef.current = true;
|
|
7942
8155
|
drainingRef.current = false;
|
|
7943
8156
|
return () => {
|
|
@@ -7949,7 +8162,7 @@ function PageActionHandler() {
|
|
|
7949
8162
|
setActionsBusy(false);
|
|
7950
8163
|
};
|
|
7951
8164
|
}, []);
|
|
7952
|
-
|
|
8165
|
+
useEffect28(() => {
|
|
7953
8166
|
return onActionsStopped(() => {
|
|
7954
8167
|
actionsStoppedRef.current = true;
|
|
7955
8168
|
ignoreActionsArrivingBeforeRef.current = Date.now() + TRAILING_ACTION_FLUSH_AFTER_STOP_MS;
|
|
@@ -7967,17 +8180,17 @@ function PageActionHandler() {
|
|
|
7967
8180
|
}
|
|
7968
8181
|
|
|
7969
8182
|
// src/components/SessionControlBar.tsx
|
|
7970
|
-
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";
|
|
7971
8184
|
|
|
7972
8185
|
// src/hooks/useActionControl.ts
|
|
7973
8186
|
import { useLocalParticipant as useLocalParticipant6 } from "@livekit/components-react/hooks";
|
|
7974
|
-
import { useCallback as useCallback20, useEffect as
|
|
8187
|
+
import { useCallback as useCallback20, useEffect as useEffect29, useState as useState22 } from "react";
|
|
7975
8188
|
var textEncoder5 = new TextEncoder;
|
|
7976
8189
|
function useActionControl() {
|
|
7977
8190
|
const { localParticipant } = useLocalParticipant6();
|
|
7978
8191
|
const plan = usePlanUpdates();
|
|
7979
|
-
const [busy, setBusy] =
|
|
7980
|
-
|
|
8192
|
+
const [busy, setBusy] = useState22(isActionsBusy);
|
|
8193
|
+
useEffect29(() => subscribeActionsBusy(setBusy), []);
|
|
7981
8194
|
const actionsActive = busy || plan?.state === "executing";
|
|
7982
8195
|
const requestStop = useCallback20(async () => {
|
|
7983
8196
|
stopActions();
|
|
@@ -7994,13 +8207,13 @@ function useActionControl() {
|
|
|
7994
8207
|
}
|
|
7995
8208
|
|
|
7996
8209
|
// src/hooks/useAudioLevelBars.ts
|
|
7997
|
-
import { useEffect as
|
|
8210
|
+
import { useEffect as useEffect30, useRef as useRef23, useState as useState23 } from "react";
|
|
7998
8211
|
var TALKING_LEVEL_THRESHOLD = 0.2;
|
|
7999
8212
|
var TALKING_HOLD_MS = 400;
|
|
8000
8213
|
function useAudioLevelBars(mediaStreamTrack, { barCount, idleHeightPx, maxGrowthPx, noiseGate }) {
|
|
8001
8214
|
const barRefs = useRef23([]);
|
|
8002
|
-
const [isTalking, setIsTalking] =
|
|
8003
|
-
|
|
8215
|
+
const [isTalking, setIsTalking] = useState23(false);
|
|
8216
|
+
useEffect30(() => {
|
|
8004
8217
|
if (!mediaStreamTrack) {
|
|
8005
8218
|
for (const bar of barRefs.current) {
|
|
8006
8219
|
if (bar)
|
|
@@ -8051,7 +8264,7 @@ function useAudioLevelBars(mediaStreamTrack, { barCount, idleHeightPx, maxGrowth
|
|
|
8051
8264
|
}
|
|
8052
8265
|
|
|
8053
8266
|
// src/hooks/useIdleAutoPause.ts
|
|
8054
|
-
import { useCallback as useCallback21, useEffect as
|
|
8267
|
+
import { useCallback as useCallback21, useEffect as useEffect31, useRef as useRef24 } from "react";
|
|
8055
8268
|
function useIdleAutoPause({
|
|
8056
8269
|
enabled,
|
|
8057
8270
|
active,
|
|
@@ -8075,7 +8288,7 @@ function useIdleAutoPause({
|
|
|
8075
8288
|
if (enabled && !isHeld)
|
|
8076
8289
|
armTimer();
|
|
8077
8290
|
}, [enabled, isHeld, armTimer]);
|
|
8078
|
-
|
|
8291
|
+
useEffect31(() => {
|
|
8079
8292
|
if (!enabled || isHeld || active) {
|
|
8080
8293
|
clearTimer();
|
|
8081
8294
|
return;
|
|
@@ -8443,7 +8656,7 @@ function SessionControlBar() {
|
|
|
8443
8656
|
togglePause();
|
|
8444
8657
|
}
|
|
8445
8658
|
});
|
|
8446
|
-
const [pushToTalkHintSeen, setPushToTalkHintSeen] =
|
|
8659
|
+
const [pushToTalkHintSeen, setPushToTalkHintSeen] = useState24(false);
|
|
8447
8660
|
const startPushToTalk = useCallback22(() => {
|
|
8448
8661
|
start();
|
|
8449
8662
|
reportActivity();
|
|
@@ -8461,7 +8674,7 @@ function SessionControlBar() {
|
|
|
8461
8674
|
onCommit: commitPushToTalk,
|
|
8462
8675
|
onKeyUsed: dismissPushToTalkHint
|
|
8463
8676
|
});
|
|
8464
|
-
|
|
8677
|
+
useEffect32(() => {
|
|
8465
8678
|
if (isHeld)
|
|
8466
8679
|
minimizePanel();
|
|
8467
8680
|
}, [isHeld, minimizePanel]);
|
|
@@ -8714,7 +8927,7 @@ function SessionControlBar() {
|
|
|
8714
8927
|
}
|
|
8715
8928
|
|
|
8716
8929
|
// src/components/ShadowHost.tsx
|
|
8717
|
-
import { useLayoutEffect as useLayoutEffect2, useRef as useRef26, useState as
|
|
8930
|
+
import { useLayoutEffect as useLayoutEffect2, useRef as useRef26, useState as useState25 } from "react";
|
|
8718
8931
|
import { createPortal } from "react-dom";
|
|
8719
8932
|
import { jsx as jsx27, Fragment as Fragment3 } from "react/jsx-runtime";
|
|
8720
8933
|
var PROPERTIES_STYLE_ID = "skippr-tw-properties";
|
|
@@ -8736,9 +8949,9 @@ function ShadowHost({
|
|
|
8736
8949
|
className
|
|
8737
8950
|
}) {
|
|
8738
8951
|
const hostRef = useRef26(null);
|
|
8739
|
-
const [shadowRoot, setShadowRoot] =
|
|
8952
|
+
const [shadowRoot, setShadowRoot] = useState25(null);
|
|
8740
8953
|
const css = `/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
|
|
8741
|
-
@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-\\[120px\\]{width:120px}.skippr\\:w-\\[148px\\]{width:148px}.skippr\\:w-\\[150px\\]{width:150px}.skippr\\:w-\\[156px\\]{width:156px}.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}}`;
|
|
8742
8955
|
const hostStyle = accentColor && isHexColor(accentColor) ? {
|
|
8743
8956
|
"--skippr-brand": accentColor,
|
|
8744
8957
|
"--skippr-brand-foreground": brandForeground(accentColor),
|
|
@@ -8770,7 +8983,7 @@ function ShadowHost({
|
|
|
8770
8983
|
}
|
|
8771
8984
|
|
|
8772
8985
|
// src/components/Sidebar.tsx
|
|
8773
|
-
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";
|
|
8774
8987
|
|
|
8775
8988
|
// src/hooks/useCombinedMessages.ts
|
|
8776
8989
|
import { useContext as useContext12, useMemo as useMemo8 } from "react";
|
|
@@ -8903,7 +9116,7 @@ function useLinkCard() {
|
|
|
8903
9116
|
}
|
|
8904
9117
|
|
|
8905
9118
|
// src/hooks/usePhaseUpdates.ts
|
|
8906
|
-
import { useCallback as useCallback24, useContext as useContext13, useEffect as
|
|
9119
|
+
import { useCallback as useCallback24, useContext as useContext13, useEffect as useEffect33 } from "react";
|
|
8907
9120
|
function parsePhases(json) {
|
|
8908
9121
|
try {
|
|
8909
9122
|
const data = JSON.parse(json);
|
|
@@ -8917,7 +9130,7 @@ function usePhaseUpdates() {
|
|
|
8917
9130
|
const parse = useCallback24(parsePhases, []);
|
|
8918
9131
|
const livePhases = useAgentState("phases", parse, []);
|
|
8919
9132
|
const ctx = useContext13(LiveAgentContext);
|
|
8920
|
-
|
|
9133
|
+
useEffect33(() => {
|
|
8921
9134
|
if (livePhases.length > 0)
|
|
8922
9135
|
ctx?.setPhasesSnapshot(livePhases);
|
|
8923
9136
|
}, [livePhases, ctx?.setPhasesSnapshot]);
|
|
@@ -8926,7 +9139,7 @@ function usePhaseUpdates() {
|
|
|
8926
9139
|
}
|
|
8927
9140
|
|
|
8928
9141
|
// src/hooks/useSessionRemaining.ts
|
|
8929
|
-
import { useEffect as
|
|
9142
|
+
import { useEffect as useEffect34, useRef as useRef28, useState as useState26 } from "react";
|
|
8930
9143
|
|
|
8931
9144
|
// src/lib/format.ts
|
|
8932
9145
|
function formatTime(seconds) {
|
|
@@ -8943,8 +9156,8 @@ function parseNumber(s) {
|
|
|
8943
9156
|
function useSessionRemaining() {
|
|
8944
9157
|
const maxCallDuration = useAgentState("maxCallDuration", parseNumber, null);
|
|
8945
9158
|
const endTimeRef = useRef28(null);
|
|
8946
|
-
const [remaining, setRemaining] =
|
|
8947
|
-
|
|
9159
|
+
const [remaining, setRemaining] = useState26(null);
|
|
9160
|
+
useEffect34(() => {
|
|
8948
9161
|
if (maxCallDuration === null || endTimeRef.current !== null)
|
|
8949
9162
|
return;
|
|
8950
9163
|
const endTime = Date.now() + maxCallDuration * 1000;
|
|
@@ -9215,26 +9428,26 @@ function LogoMark({ className, decorative }) {
|
|
|
9215
9428
|
}
|
|
9216
9429
|
|
|
9217
9430
|
// src/components/MessageList.tsx
|
|
9218
|
-
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";
|
|
9219
9432
|
|
|
9220
9433
|
// src/components/ChatInput.tsx
|
|
9221
|
-
import { useContext as useContext16, useEffect as
|
|
9434
|
+
import { useContext as useContext16, useEffect as useEffect35, useRef as useRef30, useState as useState27 } from "react";
|
|
9222
9435
|
import { jsx as jsx31, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
9223
9436
|
var MAX_INPUT_HEIGHT = 60;
|
|
9224
9437
|
function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
|
|
9225
9438
|
const ctx = useContext16(LiveAgentContext);
|
|
9226
9439
|
const reportChatActivity = ctx?.reportChatActivity;
|
|
9227
9440
|
const isPanelOpen = ctx?.isPanelOpen;
|
|
9228
|
-
const [localDraft, setLocalDraft] =
|
|
9441
|
+
const [localDraft, setLocalDraft] = useState27("");
|
|
9229
9442
|
const inputText = ctx?.chatDraft ?? localDraft;
|
|
9230
9443
|
const setInputText = ctx?.setChatDraft ?? setLocalDraft;
|
|
9231
9444
|
const textareaRef = useRef30(null);
|
|
9232
9445
|
const canSend = inputText.trim().length > 0 && !isSendingChat;
|
|
9233
|
-
|
|
9446
|
+
useEffect35(() => {
|
|
9234
9447
|
if (autoFocus && isPanelOpen !== false)
|
|
9235
9448
|
textareaRef.current?.focus();
|
|
9236
9449
|
}, [autoFocus, isPanelOpen]);
|
|
9237
|
-
|
|
9450
|
+
useEffect35(() => {
|
|
9238
9451
|
const el = textareaRef.current;
|
|
9239
9452
|
if (!el)
|
|
9240
9453
|
return;
|
|
@@ -9325,7 +9538,7 @@ function ChatMessage({ message }) {
|
|
|
9325
9538
|
}
|
|
9326
9539
|
|
|
9327
9540
|
// src/components/LinkCard.tsx
|
|
9328
|
-
import { useCallback as useCallback26, useEffect as
|
|
9541
|
+
import { useCallback as useCallback26, useEffect as useEffect36, useRef as useRef31, useState as useState28 } from "react";
|
|
9329
9542
|
|
|
9330
9543
|
// src/lib/clipboard.ts
|
|
9331
9544
|
async function copyToClipboard(text) {
|
|
@@ -9342,15 +9555,15 @@ import { jsx as jsx33, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
|
9342
9555
|
var COPIED_RESET_MS = 2000;
|
|
9343
9556
|
var DISMISS_AFTER_COPY_MS = 3000;
|
|
9344
9557
|
function LinkCard({ card, onDismiss }) {
|
|
9345
|
-
const [copied, setCopied] =
|
|
9558
|
+
const [copied, setCopied] = useState28(false);
|
|
9346
9559
|
const dismissTimerRef = useRef31(null);
|
|
9347
|
-
|
|
9560
|
+
useEffect36(() => {
|
|
9348
9561
|
if (!copied)
|
|
9349
9562
|
return;
|
|
9350
9563
|
const timer = setTimeout(() => setCopied(false), COPIED_RESET_MS);
|
|
9351
9564
|
return () => clearTimeout(timer);
|
|
9352
9565
|
}, [copied]);
|
|
9353
|
-
|
|
9566
|
+
useEffect36(() => {
|
|
9354
9567
|
return () => {
|
|
9355
9568
|
if (dismissTimerRef.current)
|
|
9356
9569
|
clearTimeout(dismissTimerRef.current);
|
|
@@ -9425,7 +9638,7 @@ function LinkCard({ card, onDismiss }) {
|
|
|
9425
9638
|
}
|
|
9426
9639
|
|
|
9427
9640
|
// src/components/PlanCard.tsx
|
|
9428
|
-
import { useEffect as
|
|
9641
|
+
import { useEffect as useEffect37, useState as useState29 } from "react";
|
|
9429
9642
|
import { jsx as jsx34, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
9430
9643
|
var APPROVE_MESSAGE = "Yes, go ahead.";
|
|
9431
9644
|
var CANCEL_MESSAGE = "No, cancel that.";
|
|
@@ -9453,8 +9666,8 @@ function StepIcon({ status }) {
|
|
|
9453
9666
|
}
|
|
9454
9667
|
function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
9455
9668
|
const awaitingApproval = plan.state === "proposed";
|
|
9456
|
-
const [isApproving, setIsApproving] =
|
|
9457
|
-
const [lastPlanId, setLastPlanId] =
|
|
9669
|
+
const [isApproving, setIsApproving] = useState29(false);
|
|
9670
|
+
const [lastPlanId, setLastPlanId] = useState29(plan.planId);
|
|
9458
9671
|
if (plan.planId !== lastPlanId) {
|
|
9459
9672
|
setLastPlanId(plan.planId);
|
|
9460
9673
|
setIsApproving(false);
|
|
@@ -9466,13 +9679,13 @@ function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
|
9466
9679
|
setIsApproving(false);
|
|
9467
9680
|
});
|
|
9468
9681
|
};
|
|
9469
|
-
|
|
9682
|
+
useEffect37(() => {
|
|
9470
9683
|
if (!isApproving)
|
|
9471
9684
|
return;
|
|
9472
9685
|
const timer = setTimeout(() => setIsApproving(false), APPROVING_RESET_MS);
|
|
9473
9686
|
return () => clearTimeout(timer);
|
|
9474
9687
|
}, [isApproving]);
|
|
9475
|
-
|
|
9688
|
+
useEffect37(() => {
|
|
9476
9689
|
if (plan.state !== "completed")
|
|
9477
9690
|
return;
|
|
9478
9691
|
const timer = setTimeout(onDismiss, COMPLETED_CARD_VISIBLE_MS);
|
|
@@ -9573,14 +9786,14 @@ function MessageList({
|
|
|
9573
9786
|
const containerRef = useRef32(null);
|
|
9574
9787
|
const isPinnedToBottom = useRef32(true);
|
|
9575
9788
|
const lastSeenMessageId = useRef32(undefined);
|
|
9576
|
-
const [showJumpToLatest, setShowJumpToLatest] =
|
|
9789
|
+
const [showJumpToLatest, setShowJumpToLatest] = useState30(false);
|
|
9577
9790
|
const lastMessage = messages.length > 0 ? messages[messages.length - 1] : undefined;
|
|
9578
|
-
const [dismissedPlanId, setDismissedPlanId] =
|
|
9791
|
+
const [dismissedPlanId, setDismissedPlanId] = useState30(null);
|
|
9579
9792
|
const dismissPlan = useCallback27(() => {
|
|
9580
9793
|
if (plan)
|
|
9581
9794
|
setDismissedPlanId(plan.planId);
|
|
9582
9795
|
}, [plan]);
|
|
9583
|
-
const [dismissedLinkCardId, setDismissedLinkCardId] =
|
|
9796
|
+
const [dismissedLinkCardId, setDismissedLinkCardId] = useState30(null);
|
|
9584
9797
|
const dismissLinkCard = useCallback27(() => {
|
|
9585
9798
|
if (linkCard)
|
|
9586
9799
|
setDismissedLinkCardId(linkCard.cardId);
|
|
@@ -9841,7 +10054,7 @@ function Sidebar({
|
|
|
9841
10054
|
if (!voiceBarRef?.current || !setBarPos)
|
|
9842
10055
|
return;
|
|
9843
10056
|
const rect = voiceBarRef.current.getBoundingClientRect();
|
|
9844
|
-
setBarPos(
|
|
10057
|
+
setBarPos({ x: rect.left, y: rect.top }, rect.width);
|
|
9845
10058
|
}, [setBarPos, voiceBarRef]);
|
|
9846
10059
|
const followsPanel = isFloating && isPanelOpen;
|
|
9847
10060
|
const dragFollowers = followsPanel && panelRef && controlBarRef && voiceBarRef ? [panelRef, controlBarRef, voiceBarRef] : null;
|
|
@@ -9852,7 +10065,7 @@ function Sidebar({
|
|
|
9852
10065
|
...anchor2.style,
|
|
9853
10066
|
height: panelExpanded ? anchor2.availableHeight : `min(${PANEL_MAX_HEIGHT_PX}px, ${anchor2.availableHeight})`
|
|
9854
10067
|
} : undefined;
|
|
9855
|
-
|
|
10068
|
+
useEffect38(() => {
|
|
9856
10069
|
if (!isSidebar)
|
|
9857
10070
|
return;
|
|
9858
10071
|
const prop = position === "right" ? "marginRight" : "marginLeft";
|
|
@@ -9878,7 +10091,9 @@ function Sidebar({
|
|
|
9878
10091
|
draggable: followsPanel,
|
|
9879
10092
|
headerRef
|
|
9880
10093
|
}),
|
|
9881
|
-
authFailed ? /* @__PURE__ */ jsx39(AuthError, {
|
|
10094
|
+
authFailed ? /* @__PURE__ */ jsx39(AuthError, {
|
|
10095
|
+
locale: internalCtx?.locale
|
|
10096
|
+
}) : isAuthenticated && hasResolvedModules ? /* @__PURE__ */ jsx39(AuthenticatedContent, {
|
|
9882
10097
|
isConnected,
|
|
9883
10098
|
isPaused,
|
|
9884
10099
|
isPausing,
|
|
@@ -9989,7 +10204,8 @@ function AuthenticatedContent({
|
|
|
9989
10204
|
]
|
|
9990
10205
|
});
|
|
9991
10206
|
}
|
|
9992
|
-
function AuthError() {
|
|
10207
|
+
function AuthError({ locale }) {
|
|
10208
|
+
const copy = resolveAuthFailedCopy(locale);
|
|
9993
10209
|
return /* @__PURE__ */ jsxs31("div", {
|
|
9994
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",
|
|
9995
10211
|
children: [
|
|
@@ -9998,11 +10214,11 @@ function AuthError() {
|
|
|
9998
10214
|
}),
|
|
9999
10215
|
/* @__PURE__ */ jsx39("p", {
|
|
10000
10216
|
className: "skippr:text-sm skippr:font-medium skippr:text-foreground",
|
|
10001
|
-
children:
|
|
10217
|
+
children: copy.title
|
|
10002
10218
|
}),
|
|
10003
10219
|
/* @__PURE__ */ jsx39("p", {
|
|
10004
10220
|
className: "skippr:mt-1 skippr:text-xs skippr:text-muted-foreground",
|
|
10005
|
-
children:
|
|
10221
|
+
children: copy.hint
|
|
10006
10222
|
})
|
|
10007
10223
|
]
|
|
10008
10224
|
});
|
|
@@ -10195,7 +10411,7 @@ import {
|
|
|
10195
10411
|
} from "react";
|
|
10196
10412
|
|
|
10197
10413
|
// src/hooks/useSplash.ts
|
|
10198
|
-
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";
|
|
10199
10415
|
|
|
10200
10416
|
// src/lib/splashPresentation.ts
|
|
10201
10417
|
function resolveSplashSections(sections, iconUrls) {
|
|
@@ -10274,7 +10490,7 @@ function useSplash(surface, onDismiss) {
|
|
|
10274
10490
|
const splash = appearance?.splash ?? null;
|
|
10275
10491
|
const { micEnabled, screenEnabled, enableMic, enableScreen, releaseScreen } = splashMedia;
|
|
10276
10492
|
const toggleStartMuted = useCallback29(() => setStartMuted(!startMuted), [setStartMuted, startMuted]);
|
|
10277
|
-
const [optOutChecked, setOptOutChecked] =
|
|
10493
|
+
const [optOutChecked, setOptOutChecked] = useState31(false);
|
|
10278
10494
|
const toggleOptOut = useCallback29(() => setOptOutChecked((checked) => !checked), []);
|
|
10279
10495
|
const commitOptOut = useCallback29(() => {
|
|
10280
10496
|
if (optOutChecked)
|
|
@@ -11231,14 +11447,14 @@ function useBarNotifications() {
|
|
|
11231
11447
|
|
|
11232
11448
|
// src/components/VoiceBarFrame.tsx
|
|
11233
11449
|
import { useIsSpeaking, useLocalParticipant as useLocalParticipant12 } from "@livekit/components-react/hooks";
|
|
11234
|
-
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";
|
|
11235
11451
|
|
|
11236
11452
|
// src/hooks/useKeyboardStop.ts
|
|
11237
|
-
import { useEffect as
|
|
11453
|
+
import { useEffect as useEffect39, useRef as useRef36 } from "react";
|
|
11238
11454
|
function useKeyboardStop({ enabled, onStop }) {
|
|
11239
11455
|
const handler = useRef36(onStop);
|
|
11240
11456
|
handler.current = onStop;
|
|
11241
|
-
|
|
11457
|
+
useEffect39(() => {
|
|
11242
11458
|
if (!enabled)
|
|
11243
11459
|
return;
|
|
11244
11460
|
const onKeyDown = (event) => {
|
|
@@ -11255,18 +11471,18 @@ function useKeyboardStop({ enabled, onStop }) {
|
|
|
11255
11471
|
}
|
|
11256
11472
|
|
|
11257
11473
|
// src/hooks/useSessionTimer.ts
|
|
11258
|
-
import { useEffect as
|
|
11474
|
+
import { useEffect as useEffect41, useState as useState33 } from "react";
|
|
11259
11475
|
|
|
11260
11476
|
// src/hooks/useElapsedSeconds.ts
|
|
11261
|
-
import { useEffect as
|
|
11477
|
+
import { useEffect as useEffect40, useRef as useRef37, useState as useState32 } from "react";
|
|
11262
11478
|
function useElapsedSeconds(isRunning, resetSignal) {
|
|
11263
|
-
const [elapsed, setElapsed] =
|
|
11479
|
+
const [elapsed, setElapsed] = useState32(0);
|
|
11264
11480
|
const accumulatedSecondsRef = useRef37(0);
|
|
11265
|
-
|
|
11481
|
+
useEffect40(() => {
|
|
11266
11482
|
accumulatedSecondsRef.current = 0;
|
|
11267
11483
|
setElapsed(0);
|
|
11268
11484
|
}, [resetSignal]);
|
|
11269
|
-
|
|
11485
|
+
useEffect40(() => {
|
|
11270
11486
|
if (!isRunning)
|
|
11271
11487
|
return;
|
|
11272
11488
|
const resumedAt = Date.now();
|
|
@@ -11291,8 +11507,8 @@ function useSessionTimer(isRunning, resetSignal) {
|
|
|
11291
11507
|
const active = isRunning && remaining !== null;
|
|
11292
11508
|
const warning = active && remaining !== null && remaining <= SESSION_TIMER_WARNING_S;
|
|
11293
11509
|
const revealCycle = !active ? null : warning ? "warning" : "normal";
|
|
11294
|
-
const [revealed, setRevealed] =
|
|
11295
|
-
|
|
11510
|
+
const [revealed, setRevealed] = useState33(false);
|
|
11511
|
+
useEffect41(() => {
|
|
11296
11512
|
if (!revealCycle) {
|
|
11297
11513
|
setRevealed(false);
|
|
11298
11514
|
return;
|
|
@@ -11320,7 +11536,7 @@ function useSessionTimer(isRunning, resetSignal) {
|
|
|
11320
11536
|
}
|
|
11321
11537
|
|
|
11322
11538
|
// src/hooks/useVoiceBarDrag.ts
|
|
11323
|
-
import { useEffect as
|
|
11539
|
+
import { useEffect as useEffect42, useRef as useRef38 } from "react";
|
|
11324
11540
|
import { flushSync as flushSync2 } from "react-dom";
|
|
11325
11541
|
var DRAG_THRESHOLD_PX2 = 5;
|
|
11326
11542
|
function useVoiceBarDrag(containerRef, onDrop, followRefs, reportDragging) {
|
|
@@ -11331,7 +11547,7 @@ function useVoiceBarDrag(containerRef, onDrop, followRefs, reportDragging) {
|
|
|
11331
11547
|
followTargetsRef.current = followRefs;
|
|
11332
11548
|
const reportDraggingRef = useRef38(reportDragging);
|
|
11333
11549
|
reportDraggingRef.current = reportDragging;
|
|
11334
|
-
|
|
11550
|
+
useEffect42(() => {
|
|
11335
11551
|
const el = containerRef.current;
|
|
11336
11552
|
if (!el)
|
|
11337
11553
|
return;
|
|
@@ -11406,7 +11622,7 @@ function useVoiceBarDrag(containerRef, onDrop, followRefs, reportDragging) {
|
|
|
11406
11622
|
clearDragOffset();
|
|
11407
11623
|
for (const follower of followers)
|
|
11408
11624
|
follower.style.transform = "";
|
|
11409
|
-
flushSync2(() => onDropRef.current(
|
|
11625
|
+
flushSync2(() => onDropRef.current({ x: rect.left, y: rect.top }));
|
|
11410
11626
|
}
|
|
11411
11627
|
endDrag();
|
|
11412
11628
|
};
|
|
@@ -11481,7 +11697,7 @@ function useVoiceBarDrag(containerRef, onDrop, followRefs, reportDragging) {
|
|
|
11481
11697
|
}
|
|
11482
11698
|
|
|
11483
11699
|
// src/components/VoiceBarChatLine.tsx
|
|
11484
|
-
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";
|
|
11485
11701
|
import { jsx as jsx48, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
11486
11702
|
var IDLE_HIDE_MS = 6000;
|
|
11487
11703
|
function VoiceBarChatLine({
|
|
@@ -11493,7 +11709,7 @@ function VoiceBarChatLine({
|
|
|
11493
11709
|
const { sendChatMessage, isSendingChat } = useChatMessages();
|
|
11494
11710
|
const ctx = useContext25(LiveAgentContext);
|
|
11495
11711
|
const reportChatActivity = ctx?.reportChatActivity;
|
|
11496
|
-
const [localDraft, setLocalDraft] =
|
|
11712
|
+
const [localDraft, setLocalDraft] = useState34("");
|
|
11497
11713
|
const text = ctx?.chatDraft ?? localDraft;
|
|
11498
11714
|
const setText = ctx?.setChatDraft ?? setLocalDraft;
|
|
11499
11715
|
const inputRef = useRef39(null);
|
|
@@ -11505,7 +11721,7 @@ function VoiceBarChatLine({
|
|
|
11505
11721
|
clearTimeout(idleTimerRef.current);
|
|
11506
11722
|
idleTimerRef.current = setTimeout(() => onCloseRef.current(), IDLE_HIDE_MS);
|
|
11507
11723
|
}, []);
|
|
11508
|
-
|
|
11724
|
+
useEffect43(() => {
|
|
11509
11725
|
inputRef.current?.focus();
|
|
11510
11726
|
armIdle();
|
|
11511
11727
|
return () => {
|
|
@@ -11574,20 +11790,20 @@ function VoiceBarChatLine({
|
|
|
11574
11790
|
}
|
|
11575
11791
|
|
|
11576
11792
|
// src/components/VoiceBarLinkCard.tsx
|
|
11577
|
-
import { useCallback as useCallback33, useEffect as
|
|
11793
|
+
import { useCallback as useCallback33, useEffect as useEffect44, useRef as useRef40, useState as useState35 } from "react";
|
|
11578
11794
|
import { jsx as jsx49, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
11579
11795
|
var COPIED_RESET_MS2 = 2000;
|
|
11580
11796
|
var DISMISS_AFTER_COPY_MS2 = 3000;
|
|
11581
11797
|
function VoiceBarLinkCard({ card, onDismiss }) {
|
|
11582
|
-
const [copied, setCopied] =
|
|
11798
|
+
const [copied, setCopied] = useState35(false);
|
|
11583
11799
|
const dismissTimerRef = useRef40(null);
|
|
11584
|
-
|
|
11800
|
+
useEffect44(() => {
|
|
11585
11801
|
if (!copied)
|
|
11586
11802
|
return;
|
|
11587
11803
|
const timer = setTimeout(() => setCopied(false), COPIED_RESET_MS2);
|
|
11588
11804
|
return () => clearTimeout(timer);
|
|
11589
11805
|
}, [copied]);
|
|
11590
|
-
|
|
11806
|
+
useEffect44(() => {
|
|
11591
11807
|
return () => {
|
|
11592
11808
|
if (dismissTimerRef.current)
|
|
11593
11809
|
clearTimeout(dismissTimerRef.current);
|
|
@@ -11661,13 +11877,13 @@ function VoiceBarLinkCard({ card, onDismiss }) {
|
|
|
11661
11877
|
}
|
|
11662
11878
|
|
|
11663
11879
|
// src/components/VoiceBarNotification.tsx
|
|
11664
|
-
import { useEffect as
|
|
11880
|
+
import { useEffect as useEffect45, useRef as useRef41, useState as useState36 } from "react";
|
|
11665
11881
|
import { jsx as jsx50, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
11666
11882
|
function VoiceBarNotification({ notifications, pos, onDismiss }) {
|
|
11667
|
-
const [index2, setIndex] =
|
|
11668
|
-
const [paused, setPaused] =
|
|
11883
|
+
const [index2, setIndex] = useState36(0);
|
|
11884
|
+
const [paused, setPaused] = useState36(false);
|
|
11669
11885
|
const cardRef = useRef41(null);
|
|
11670
|
-
|
|
11886
|
+
useEffect45(() => {
|
|
11671
11887
|
const el = cardRef.current;
|
|
11672
11888
|
if (!el)
|
|
11673
11889
|
return;
|
|
@@ -11680,7 +11896,7 @@ function VoiceBarNotification({ notifications, pos, onDismiss }) {
|
|
|
11680
11896
|
el.removeEventListener("mouseleave", leave);
|
|
11681
11897
|
};
|
|
11682
11898
|
}, []);
|
|
11683
|
-
|
|
11899
|
+
useEffect45(() => {
|
|
11684
11900
|
if (paused)
|
|
11685
11901
|
return;
|
|
11686
11902
|
const rotate = setInterval(() => setIndex((current) => (current + 1) % notifications.length), TIP_ROTATE_MS);
|
|
@@ -11752,7 +11968,7 @@ function VoiceBarNotification({ notifications, pos, onDismiss }) {
|
|
|
11752
11968
|
}
|
|
11753
11969
|
|
|
11754
11970
|
// src/components/VoiceBarPlanCard.tsx
|
|
11755
|
-
import { useEffect as
|
|
11971
|
+
import { useEffect as useEffect46, useState as useState37 } from "react";
|
|
11756
11972
|
import { jsx as jsx51, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
11757
11973
|
var APPROVING_RESET_MS2 = 8000;
|
|
11758
11974
|
function StepIndicator({ step }) {
|
|
@@ -11787,8 +12003,8 @@ function VoiceBarPlanCard({
|
|
|
11787
12003
|
embedded = false
|
|
11788
12004
|
}) {
|
|
11789
12005
|
const awaitingApproval = plan.state === "proposed";
|
|
11790
|
-
const [isApproving, setIsApproving] =
|
|
11791
|
-
const [lastPlanId, setLastPlanId] =
|
|
12006
|
+
const [isApproving, setIsApproving] = useState37(false);
|
|
12007
|
+
const [lastPlanId, setLastPlanId] = useState37(plan.planId);
|
|
11792
12008
|
if (plan.planId !== lastPlanId) {
|
|
11793
12009
|
setLastPlanId(plan.planId);
|
|
11794
12010
|
setIsApproving(false);
|
|
@@ -11803,13 +12019,13 @@ function VoiceBarPlanCard({
|
|
|
11803
12019
|
const cancel = () => {
|
|
11804
12020
|
sendChatMessage(CANCEL_MESSAGE).catch((e) => console.warn("[Skippr] plan reply failed", e));
|
|
11805
12021
|
};
|
|
11806
|
-
|
|
12022
|
+
useEffect46(() => {
|
|
11807
12023
|
if (!isApproving)
|
|
11808
12024
|
return;
|
|
11809
12025
|
const timer = setTimeout(() => setIsApproving(false), APPROVING_RESET_MS2);
|
|
11810
12026
|
return () => clearTimeout(timer);
|
|
11811
12027
|
}, [isApproving]);
|
|
11812
|
-
|
|
12028
|
+
useEffect46(() => {
|
|
11813
12029
|
if (plan.state !== "completed")
|
|
11814
12030
|
return;
|
|
11815
12031
|
const timer = setTimeout(onDismiss, COMPLETED_CARD_VISIBLE_MS);
|
|
@@ -12022,8 +12238,8 @@ function ShortcutHint({
|
|
|
12022
12238
|
children
|
|
12023
12239
|
}) {
|
|
12024
12240
|
const ref = useRef42(null);
|
|
12025
|
-
const [visible, setVisible] =
|
|
12026
|
-
|
|
12241
|
+
const [visible, setVisible] = useState38(false);
|
|
12242
|
+
useEffect47(() => {
|
|
12027
12243
|
if (!enabled)
|
|
12028
12244
|
return;
|
|
12029
12245
|
const el = ref.current;
|
|
@@ -12138,15 +12354,22 @@ function VoiceBarFrame({
|
|
|
12138
12354
|
textMode,
|
|
12139
12355
|
captureMode,
|
|
12140
12356
|
chatActivityAt,
|
|
12141
|
-
setAutoStartAfterLogin
|
|
12357
|
+
setAutoStartAfterLogin,
|
|
12358
|
+
error,
|
|
12359
|
+
errorSeq,
|
|
12360
|
+
authFailed,
|
|
12361
|
+
modulesError,
|
|
12362
|
+
locale
|
|
12142
12363
|
} = ctx;
|
|
12143
12364
|
const needsLogin = !usesHostAuth && !isAuthenticated;
|
|
12144
|
-
const
|
|
12145
|
-
|
|
12365
|
+
const transientError = useTransientError(error, errorSeq);
|
|
12366
|
+
const authFailedCopy = authFailed ? resolveAuthFailedCopy(locale) : null;
|
|
12367
|
+
const [loginOpen, setLoginOpen] = useState38(false);
|
|
12368
|
+
useEffect47(() => {
|
|
12146
12369
|
if (!needsLogin)
|
|
12147
12370
|
setLoginOpen(false);
|
|
12148
12371
|
}, [needsLogin]);
|
|
12149
|
-
const [bannerOpen, setBannerOpen] =
|
|
12372
|
+
const [bannerOpen, setBannerOpen] = useState38(false);
|
|
12150
12373
|
const hasNotifications = notifications.length > 0;
|
|
12151
12374
|
const notifAccent = notifications[0]?.accentColor;
|
|
12152
12375
|
const closeBanner = useCallback34(() => setBannerOpen(false), []);
|
|
@@ -12156,7 +12379,9 @@ function VoiceBarFrame({
|
|
|
12156
12379
|
voiceBarRef.current = node;
|
|
12157
12380
|
}, [voiceBarRef]);
|
|
12158
12381
|
const dragFollowers = isPanelOpen ? [panelRef] : null;
|
|
12159
|
-
const
|
|
12382
|
+
const barWidthRef = useRef42(VOICE_BAR_WIDTH_PX);
|
|
12383
|
+
const dropAtBarWidth = useCallback34((next) => onDrop(next, barWidthRef.current), [onDrop]);
|
|
12384
|
+
const { wasDraggedRef } = useVoiceBarDrag(containerRef, dropAtBarWidth, dragFollowers, setDragging);
|
|
12160
12385
|
const { isMuted, toggleMute } = useMediaControls();
|
|
12161
12386
|
const { localParticipant } = useLocalParticipant12();
|
|
12162
12387
|
const isUserSpeaking = useIsSpeaking(localParticipant);
|
|
@@ -12167,9 +12392,9 @@ function VoiceBarFrame({
|
|
|
12167
12392
|
const plan = usePlanUpdates();
|
|
12168
12393
|
const linkCard = useLinkCard();
|
|
12169
12394
|
const { sendChatMessage } = useChatMessages();
|
|
12170
|
-
const [dismissedFloatingPlanId, setDismissedFloatingPlanId] =
|
|
12171
|
-
const [dismissedBlockPlanId, setDismissedBlockPlanId] =
|
|
12172
|
-
const [dismissedLinkCardId, setDismissedLinkCardId] =
|
|
12395
|
+
const [dismissedFloatingPlanId, setDismissedFloatingPlanId] = useState38(null);
|
|
12396
|
+
const [dismissedBlockPlanId, setDismissedBlockPlanId] = useState38(null);
|
|
12397
|
+
const [dismissedLinkCardId, setDismissedLinkCardId] = useState38(null);
|
|
12173
12398
|
const micMode = agentControls?.micMode;
|
|
12174
12399
|
const pushOrTap = isRequestResponseMicMode(micMode);
|
|
12175
12400
|
const isPushToTalk = micMode === MIC_MODE.PushToTalk;
|
|
@@ -12178,9 +12403,9 @@ function VoiceBarFrame({
|
|
|
12178
12403
|
const showActionControl = isConnected && captureMode === CAPTURE_MODE.Auto && actionsActive;
|
|
12179
12404
|
const chatSurface = agentControls?.chat ?? DEFAULT_CHAT_SURFACE;
|
|
12180
12405
|
const isRoomChat = chatSurface === CHAT_SURFACE.Room;
|
|
12181
|
-
const [chatLineOpen, setChatLineOpen] =
|
|
12182
|
-
const [chatLineMounted, setChatLineMounted] =
|
|
12183
|
-
const [chatLineClosing, setChatLineClosing] =
|
|
12406
|
+
const [chatLineOpen, setChatLineOpen] = useState38(false);
|
|
12407
|
+
const [chatLineMounted, setChatLineMounted] = useState38(false);
|
|
12408
|
+
const [chatLineClosing, setChatLineClosing] = useState38(false);
|
|
12184
12409
|
const chatOpen = isRoomChat ? isPanelOpen : chatLineOpen;
|
|
12185
12410
|
const lineBlockOpen = !isRoomChat && chatLineMounted;
|
|
12186
12411
|
const toggleChat = () => {
|
|
@@ -12190,7 +12415,7 @@ function VoiceBarFrame({
|
|
|
12190
12415
|
setChatLineOpen((open) => !open);
|
|
12191
12416
|
}
|
|
12192
12417
|
};
|
|
12193
|
-
|
|
12418
|
+
useEffect47(() => {
|
|
12194
12419
|
if (chatLineOpen) {
|
|
12195
12420
|
setChatLineMounted(true);
|
|
12196
12421
|
setChatLineClosing(false);
|
|
@@ -12217,7 +12442,13 @@ function VoiceBarFrame({
|
|
|
12217
12442
|
const canStart = isAuthenticated && (!!defaultAgentId || !!pendingStart);
|
|
12218
12443
|
const showClose = canFold || sessionLive;
|
|
12219
12444
|
const showLivePill = !isLoading && isConnected && !textMode && !pushOrTap;
|
|
12220
|
-
const
|
|
12445
|
+
const barWidthPx = !showLivePill ? VOICE_BAR_WIDTH_PX : isHeld ? 120 : 156;
|
|
12446
|
+
barWidthRef.current = barWidthPx;
|
|
12447
|
+
useEffect47(() => {
|
|
12448
|
+
const inBounds = clampBarPos(pos, barWidthPx);
|
|
12449
|
+
if (inBounds.x !== pos.x)
|
|
12450
|
+
onDrop(inBounds, barWidthPx);
|
|
12451
|
+
}, [pos, barWidthPx, onDrop]);
|
|
12221
12452
|
const logoUrl = appearance?.logoUrl ?? null;
|
|
12222
12453
|
const ifNotDragged = (action) => () => {
|
|
12223
12454
|
if (wasDraggedRef.current)
|
|
@@ -12239,17 +12470,17 @@ function VoiceBarFrame({
|
|
|
12239
12470
|
const requestLabel = agentStateLabel ?? (isCapturingSpeech ? "listening…" : idleRequestLabel);
|
|
12240
12471
|
const livePillBg = agentActive && !isHeld ? "var(--skippr-brand-active)" : "var(--skippr-brand, #2bc0ae)";
|
|
12241
12472
|
const glow = isConnected && !isHeld && agentActive;
|
|
12242
|
-
const [autoOffClosing, setAutoOffClosing] =
|
|
12473
|
+
const [autoOffClosing, setAutoOffClosing] = useState38(false);
|
|
12243
12474
|
const { reportActivity } = useIdleAutoOff({
|
|
12244
12475
|
enabled: isConnected && !autoOffClosing,
|
|
12245
12476
|
active: agentActive || isCapturingSpeech || isUserSpeaking,
|
|
12246
12477
|
onExpire: () => setAutoOffClosing(true)
|
|
12247
12478
|
});
|
|
12248
|
-
|
|
12479
|
+
useEffect47(() => {
|
|
12249
12480
|
if (chatActivityAt)
|
|
12250
12481
|
reportActivity();
|
|
12251
12482
|
}, [chatActivityAt, reportActivity]);
|
|
12252
|
-
|
|
12483
|
+
useEffect47(() => {
|
|
12253
12484
|
if (!autoOffClosing)
|
|
12254
12485
|
return;
|
|
12255
12486
|
if (!isConnected) {
|
|
@@ -12265,12 +12496,12 @@ function VoiceBarFrame({
|
|
|
12265
12496
|
const floatingPlanActive = planEnabled && !isRoomChat && !lineBlockOpen && activePlan.planId !== dismissedFloatingPlanId;
|
|
12266
12497
|
const planInLineBlock = planEnabled && lineBlockOpen && activePlan.planId !== dismissedBlockPlanId;
|
|
12267
12498
|
const planCardActive = floatingPlanActive || planInLineBlock;
|
|
12268
|
-
|
|
12499
|
+
useEffect47(() => {
|
|
12269
12500
|
if (lineBlockOpen)
|
|
12270
12501
|
setDismissedBlockPlanId(null);
|
|
12271
12502
|
}, [lineBlockOpen]);
|
|
12272
|
-
const [autoOpenedPlanId, setAutoOpenedPlanId] =
|
|
12273
|
-
|
|
12503
|
+
const [autoOpenedPlanId, setAutoOpenedPlanId] = useState38(null);
|
|
12504
|
+
useEffect47(() => {
|
|
12274
12505
|
if (!isRoomChat || !planEnabled || !activePlan)
|
|
12275
12506
|
return;
|
|
12276
12507
|
if (activePlan.planId === autoOpenedPlanId)
|
|
@@ -12282,7 +12513,8 @@ function VoiceBarFrame({
|
|
|
12282
12513
|
const visibleLinkCard = linkCard && linkCard.cardId !== dismissedLinkCardId ? linkCard : null;
|
|
12283
12514
|
const linkCardActive = !!visibleLinkCard && isConnected && !planCardActive && !(isRoomChat && chatOpen) && !isCapturingSpeech && !isHeld && !autoOffClosing;
|
|
12284
12515
|
const bannerActive = hasNotifications && bannerOpen;
|
|
12285
|
-
const
|
|
12516
|
+
const midSessionError = sessionLive && !isRoomChat && !!transientError && !planCardActive && !linkCardActive;
|
|
12517
|
+
const slotClaimed = chatOpen || bannerActive || lineBlockOpen || midSessionError;
|
|
12286
12518
|
const autoBase = showLivePill && !autoOffClosing;
|
|
12287
12519
|
const showLiveStrip = !slotClaimed && autoBase && !isHeld && !planCardActive && (state === "thinking" || showActionControl);
|
|
12288
12520
|
const showTimerStrip = !slotClaimed && !autoOffClosing && !isCapturingSpeech && !planCardActive && !showLiveStrip && !isHeld && !!sessionTimer;
|
|
@@ -12312,8 +12544,8 @@ function VoiceBarFrame({
|
|
|
12312
12544
|
const pillEvaporate = autoOffClosing ? "skippr:[animation:skippr-evaporate_3.2s_ease-in_forwards] skippr:motion-reduce:animate-none" : "";
|
|
12313
12545
|
return /* @__PURE__ */ jsxs41("div", {
|
|
12314
12546
|
ref: setContainerRefs,
|
|
12315
|
-
style: barPosStyle(pos),
|
|
12316
|
-
className:
|
|
12547
|
+
style: { ...barPosStyle(pos), width: barWidthPx },
|
|
12548
|
+
className: "skippr:fixed skippr:z-[9999] skippr:flex skippr:touch-none skippr:cursor-grab skippr:items-center",
|
|
12317
12549
|
children: [
|
|
12318
12550
|
glow && /* @__PURE__ */ jsx52("span", {
|
|
12319
12551
|
"aria-hidden": true,
|
|
@@ -12423,13 +12655,30 @@ function VoiceBarFrame({
|
|
|
12423
12655
|
}
|
|
12424
12656
|
})
|
|
12425
12657
|
}),
|
|
12426
|
-
!sessionLive && !needsLogin && !bannerActive && /* @__PURE__ */ jsx52("div", {
|
|
12658
|
+
(!sessionLive || midSessionError) && !needsLogin && !bannerActive && /* @__PURE__ */ jsx52("div", {
|
|
12427
12659
|
style: planCardStyle,
|
|
12428
12660
|
className: "skippr:z-[6]",
|
|
12429
12661
|
"data-skippr-no-drag": "",
|
|
12430
12662
|
children: /* @__PURE__ */ jsx52("div", {
|
|
12431
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)]",
|
|
12432
|
-
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, {
|
|
12433
12682
|
template: CONSENT_NOTICE_SESSION_START
|
|
12434
12683
|
})
|
|
12435
12684
|
})
|
|
@@ -12634,10 +12883,10 @@ function VoiceBarFrame({
|
|
|
12634
12883
|
}
|
|
12635
12884
|
|
|
12636
12885
|
// src/components/VoiceBarLauncher.tsx
|
|
12637
|
-
import { useCallback as useCallback35, useEffect as
|
|
12886
|
+
import { useCallback as useCallback35, useEffect as useEffect49, useRef as useRef44, useState as useState40 } from "react";
|
|
12638
12887
|
|
|
12639
12888
|
// src/components/LauncherNotification.tsx
|
|
12640
|
-
import { useEffect as
|
|
12889
|
+
import { useEffect as useEffect48, useRef as useRef43, useState as useState39 } from "react";
|
|
12641
12890
|
import { jsx as jsx53, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
12642
12891
|
function LauncherNotification({
|
|
12643
12892
|
notifications,
|
|
@@ -12645,10 +12894,10 @@ function LauncherNotification({
|
|
|
12645
12894
|
mode,
|
|
12646
12895
|
onDismiss
|
|
12647
12896
|
}) {
|
|
12648
|
-
const [index2, setIndex] =
|
|
12649
|
-
const [paused, setPaused] =
|
|
12897
|
+
const [index2, setIndex] = useState39(0);
|
|
12898
|
+
const [paused, setPaused] = useState39(false);
|
|
12650
12899
|
const cardRef = useRef43(null);
|
|
12651
|
-
|
|
12900
|
+
useEffect48(() => {
|
|
12652
12901
|
const el = cardRef.current;
|
|
12653
12902
|
if (!el)
|
|
12654
12903
|
return;
|
|
@@ -12661,7 +12910,7 @@ function LauncherNotification({
|
|
|
12661
12910
|
el.removeEventListener("mouseleave", leave);
|
|
12662
12911
|
};
|
|
12663
12912
|
}, []);
|
|
12664
|
-
|
|
12913
|
+
useEffect48(() => {
|
|
12665
12914
|
if (paused)
|
|
12666
12915
|
return;
|
|
12667
12916
|
const rotate = setInterval(() => setIndex((current) => (current + 1) % notifications.length), TIP_ROTATE_MS);
|
|
@@ -12886,16 +13135,16 @@ function VoiceBarLauncher({
|
|
|
12886
13135
|
}, [onDrop]);
|
|
12887
13136
|
const { wasDraggedRef } = useVoiceBarDrag(containerRef, onDropPos, null, setDragging);
|
|
12888
13137
|
const horizontal = isHorizontalEdge(dock.edge);
|
|
12889
|
-
const [cardOpen, setCardOpen] =
|
|
12890
|
-
const [loginOpen, setLoginOpen] =
|
|
12891
|
-
const [hovered, setHovered] =
|
|
12892
|
-
|
|
13138
|
+
const [cardOpen, setCardOpen] = useState40(false);
|
|
13139
|
+
const [loginOpen, setLoginOpen] = useState40(false);
|
|
13140
|
+
const [hovered, setHovered] = useState40(false);
|
|
13141
|
+
useEffect49(() => {
|
|
12893
13142
|
if (!needsLogin)
|
|
12894
13143
|
setLoginOpen(false);
|
|
12895
13144
|
}, [needsLogin]);
|
|
12896
13145
|
const hasNotif = notifications.length > 0;
|
|
12897
13146
|
const dotColor = notifications.find((item) => item.kind === NOTIFICATION_KIND.Module)?.accentColor ?? notifications[0]?.accentColor ?? NOTIF_ACCENT_COLOR;
|
|
12898
|
-
|
|
13147
|
+
useEffect49(() => {
|
|
12899
13148
|
const el = containerRef.current;
|
|
12900
13149
|
if (!el)
|
|
12901
13150
|
return;
|
|
@@ -13181,7 +13430,7 @@ function PlanPanelOpener() {
|
|
|
13181
13430
|
const plan = usePlanUpdates();
|
|
13182
13431
|
const { expandPanel } = useLiveAgent();
|
|
13183
13432
|
const surfacedPlanIdRef = useRef45(null);
|
|
13184
|
-
|
|
13433
|
+
useEffect50(() => {
|
|
13185
13434
|
if (plan?.state !== "proposed" || surfacedPlanIdRef.current === plan.planId)
|
|
13186
13435
|
return;
|
|
13187
13436
|
surfacedPlanIdRef.current = plan.planId;
|
|
@@ -13219,12 +13468,13 @@ function LiveAgent(props) {
|
|
|
13219
13468
|
console.warn('[Skippr] agentControls requires captureMode: "auto"');
|
|
13220
13469
|
}
|
|
13221
13470
|
}
|
|
13222
|
-
const
|
|
13471
|
+
const locale = useDetectedLocale(hostLocale);
|
|
13472
|
+
const auth = useAuth({ appKey, locale });
|
|
13223
13473
|
const usesHostAuth = !!getUserToken || !!userToken || !!authTokenProp;
|
|
13224
13474
|
const effectiveAuthToken = usesHostAuth ? authTokenProp : auth.authToken ?? undefined;
|
|
13225
|
-
const [activeModule, setActiveModule] =
|
|
13226
|
-
const [sessionAgentMode, setSessionAgentMode] =
|
|
13227
|
-
const [isExchanging, setIsExchanging] =
|
|
13475
|
+
const [activeModule, setActiveModule] = useState41(null);
|
|
13476
|
+
const [sessionAgentMode, setSessionAgentMode] = useState41(null);
|
|
13477
|
+
const [isExchanging, setIsExchanging] = useState41(false);
|
|
13228
13478
|
const minimizeOnSessionStart = useCallback36(() => {
|
|
13229
13479
|
if (minimizable) {
|
|
13230
13480
|
setIsMinimized(true);
|
|
@@ -13254,6 +13504,7 @@ function LiveAgent(props) {
|
|
|
13254
13504
|
isDisconnecting,
|
|
13255
13505
|
isPausing,
|
|
13256
13506
|
error,
|
|
13507
|
+
errorSeq,
|
|
13257
13508
|
errorCode,
|
|
13258
13509
|
startSession: startSessionRaw,
|
|
13259
13510
|
pauseSession,
|
|
@@ -13268,6 +13519,7 @@ function LiveAgent(props) {
|
|
|
13268
13519
|
authFailed
|
|
13269
13520
|
} = useSession({
|
|
13270
13521
|
captureMode,
|
|
13522
|
+
locale,
|
|
13271
13523
|
authToken: effectiveAuthToken,
|
|
13272
13524
|
appKey,
|
|
13273
13525
|
getUserToken,
|
|
@@ -13292,29 +13544,28 @@ function LiveAgent(props) {
|
|
|
13292
13544
|
return;
|
|
13293
13545
|
disconnect();
|
|
13294
13546
|
}, [disconnect]);
|
|
13295
|
-
const [isPanelOpen, setIsPanelOpen] =
|
|
13296
|
-
const [panelEntry, setPanelEntry] =
|
|
13297
|
-
const [isMinimized, setIsMinimized] =
|
|
13298
|
-
const [pendingStart, setPendingStart] =
|
|
13299
|
-
const [sidebarTab, setSidebarTab] =
|
|
13300
|
-
const [phasesSnapshot, setPhasesSnapshot] =
|
|
13301
|
-
const [startMuted, setStartMuted] =
|
|
13302
|
-
const [textMode, setTextMode] =
|
|
13303
|
-
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);
|
|
13304
13556
|
const togglePanelExpanded = useCallback36(() => setPanelExpanded((prev) => !prev), []);
|
|
13305
13557
|
const panelRef = useRef45(null);
|
|
13306
13558
|
const controlBarRef = useRef45(null);
|
|
13307
13559
|
const voiceBarRef = useRef45(null);
|
|
13308
|
-
const [isDragging, setIsDragging] =
|
|
13560
|
+
const [isDragging, setIsDragging] = useState41(false);
|
|
13309
13561
|
const setTextModeState = useCallback36((enabled) => {
|
|
13310
13562
|
setTextMode(enabled);
|
|
13311
13563
|
}, []);
|
|
13312
13564
|
const showControlBar = isConnected || isStarting || isPausing;
|
|
13313
|
-
|
|
13565
|
+
useEffect50(() => {
|
|
13314
13566
|
if (!isConnected)
|
|
13315
13567
|
setTextModeState(false);
|
|
13316
13568
|
}, [isConnected, setTextModeState]);
|
|
13317
|
-
const locale = useDetectedLocale(hostLocale);
|
|
13318
13569
|
const {
|
|
13319
13570
|
modules: availableModules,
|
|
13320
13571
|
defaultSelection,
|
|
@@ -13348,7 +13599,13 @@ function LiveAgent(props) {
|
|
|
13348
13599
|
const buddyActive = isBuddyActive(appearance) && variant !== "sidebar" && !hostAgentId;
|
|
13349
13600
|
const buddyShape = appearance?.buddy?.shape ?? DEFAULT_BUDDY_SHAPE;
|
|
13350
13601
|
const effectiveHostAgentId = buddyActive ? undefined : hostAgentId;
|
|
13351
|
-
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]);
|
|
13352
13609
|
const defaultAgentId = buddyActive ? defaultSelection.agentId : hostAgentId ?? defaultSelection.agentId;
|
|
13353
13610
|
const defaultModule = availableModules.find((m) => m.id === defaultAgentId) ?? null;
|
|
13354
13611
|
const operatingModule = buddyActive ? defaultModule : activeModule ?? (effectiveHostAgentId ? availableModules[0] ?? null : null);
|
|
@@ -13422,10 +13679,10 @@ function LiveAgent(props) {
|
|
|
13422
13679
|
setPendingStart(pending);
|
|
13423
13680
|
setIsMinimized(false);
|
|
13424
13681
|
}, []);
|
|
13425
|
-
const [welcomeDismissed, setWelcomeDismissed] =
|
|
13682
|
+
const [welcomeDismissed, setWelcomeDismissed] = useState41(false);
|
|
13426
13683
|
const dismissWelcome = useCallback36(() => setWelcomeDismissed(true), []);
|
|
13427
|
-
const [savedPosition] =
|
|
13428
|
-
const [currentPosition, setCurrentPosition] =
|
|
13684
|
+
const [savedPosition] = useState41(readSavedPosition);
|
|
13685
|
+
const [currentPosition, setCurrentPosition] = useState41(savedPosition ?? "right");
|
|
13429
13686
|
const positionLockedRef = useRef45(savedPosition !== null);
|
|
13430
13687
|
const setPositionWithPersist = useCallback36((pos) => {
|
|
13431
13688
|
positionLockedRef.current = true;
|
|
@@ -13435,18 +13692,18 @@ function LiveAgent(props) {
|
|
|
13435
13692
|
} catch {}
|
|
13436
13693
|
}, []);
|
|
13437
13694
|
const serverPosition = appearance?.position ?? null;
|
|
13438
|
-
|
|
13695
|
+
useEffect50(() => {
|
|
13439
13696
|
if (!serverPosition || positionLockedRef.current)
|
|
13440
13697
|
return;
|
|
13441
13698
|
setCurrentPosition(serverPosition);
|
|
13442
13699
|
}, [serverPosition]);
|
|
13443
|
-
const [savedLauncherBottom] =
|
|
13700
|
+
const [savedLauncherBottom] = useState41(readSavedLauncherBottom);
|
|
13444
13701
|
const hasDraggedRef = useRef45(savedLauncherBottom !== null);
|
|
13445
13702
|
const verticalAlignRef = useRef45(hostVerticalAlign ?? "bottom");
|
|
13446
|
-
const [launcherBottomPx, setLauncherBottomPxState] =
|
|
13447
|
-
const [popsDown, setPopsDown] =
|
|
13703
|
+
const [launcherBottomPx, setLauncherBottomPxState] = useState41(() => savedLauncherBottom !== null ? clampLauncherBottom(savedLauncherBottom) : verticalAlignToBottomPx(verticalAlignRef.current));
|
|
13704
|
+
const [popsDown, setPopsDown] = useState41(() => launcherPopsDown(launcherBottomPx));
|
|
13448
13705
|
const serverVerticalAlign = appearance?.verticalAlign ?? null;
|
|
13449
|
-
|
|
13706
|
+
useEffect50(() => {
|
|
13450
13707
|
if (!serverVerticalAlign || hostVerticalAlign !== undefined || hasDraggedRef.current)
|
|
13451
13708
|
return;
|
|
13452
13709
|
verticalAlignRef.current = serverVerticalAlign;
|
|
@@ -13464,40 +13721,26 @@ function LiveAgent(props) {
|
|
|
13464
13721
|
}, []);
|
|
13465
13722
|
const launcherBottomPxRef = useRef45(launcherBottomPx);
|
|
13466
13723
|
launcherBottomPxRef.current = launcherBottomPx;
|
|
13467
|
-
const [chatActivityAt, setChatActivityAt] =
|
|
13724
|
+
const [chatActivityAt, setChatActivityAt] = useState41(0);
|
|
13468
13725
|
const reportChatActivity = useCallback36(() => {
|
|
13469
13726
|
const now = Date.now();
|
|
13470
13727
|
setChatActivityAt((last) => now - last < CHAT_ACTIVITY_THROTTLE_MS ? last : now);
|
|
13471
13728
|
}, []);
|
|
13472
|
-
const [chatDraft, setChatDraft] =
|
|
13473
|
-
const [autoStartAfterLogin, setAutoStartAfterLogin] =
|
|
13729
|
+
const [chatDraft, setChatDraft] = useState41("");
|
|
13730
|
+
const [autoStartAfterLogin, setAutoStartAfterLogin] = useState41(false);
|
|
13474
13731
|
const commitLauncherDrop = useCallback36(({ side, bottomPx }) => {
|
|
13475
13732
|
setPositionWithPersist(side);
|
|
13476
13733
|
setLauncherBottomPx(bottomPx);
|
|
13477
13734
|
}, [setPositionWithPersist, setLauncherBottomPx]);
|
|
13478
|
-
const [barPos, setBarPosState] =
|
|
13479
|
-
const barPosRatioRef = useRef45(null);
|
|
13480
|
-
|
|
13481
|
-
|
|
13482
|
-
|
|
13483
|
-
|
|
13484
|
-
|
|
13485
|
-
} else if (barPosRatioRef.current === null) {
|
|
13486
|
-
const def = defaultBarPos();
|
|
13487
|
-
barPosRatioRef.current = {
|
|
13488
|
-
xRatio: def.x / window.innerWidth,
|
|
13489
|
-
yRatio: def.y / window.innerHeight
|
|
13490
|
-
};
|
|
13491
|
-
}
|
|
13492
|
-
const setBarPos = useCallback36((next) => {
|
|
13493
|
-
setBarPosState(next);
|
|
13494
|
-
persistBarPos(next);
|
|
13495
|
-
barPosRatioRef.current = {
|
|
13496
|
-
xRatio: next.x / window.innerWidth,
|
|
13497
|
-
yRatio: next.y / window.innerHeight
|
|
13498
|
-
};
|
|
13735
|
+
const [barPos, setBarPosState] = useState41(() => readSavedBarPos());
|
|
13736
|
+
const barPosRatioRef = useRef45(barPos === null ? null : barPosRatio(barPos));
|
|
13737
|
+
const setBarPos = useCallback36((next, widthPx) => {
|
|
13738
|
+
const placed = clampBarPos(next, widthPx);
|
|
13739
|
+
setBarPosState(placed);
|
|
13740
|
+
persistBarPos(placed);
|
|
13741
|
+
barPosRatioRef.current = barPosRatio(placed);
|
|
13499
13742
|
}, []);
|
|
13500
|
-
const [savedLauncherDock, setSavedLauncherDock] =
|
|
13743
|
+
const [savedLauncherDock, setSavedLauncherDock] = useState41(() => readSavedDock("launcher"));
|
|
13501
13744
|
const setLauncherDock = useCallback36((next) => {
|
|
13502
13745
|
setSavedLauncherDock(next);
|
|
13503
13746
|
persistDock("launcher", next);
|
|
@@ -13507,7 +13750,7 @@ function LiveAgent(props) {
|
|
|
13507
13750
|
edge: launcherEdge,
|
|
13508
13751
|
offsetPx: defaultOffset(launcherEdge)
|
|
13509
13752
|
};
|
|
13510
|
-
|
|
13753
|
+
useEffect50(() => {
|
|
13511
13754
|
const syncToViewport = () => {
|
|
13512
13755
|
const next = hasDraggedRef.current ? clampLauncherBottom(launcherBottomPxRef.current) : verticalAlignToBottomPx(verticalAlignRef.current);
|
|
13513
13756
|
setLauncherBottomPxState(next);
|
|
@@ -13517,15 +13760,14 @@ function LiveAgent(props) {
|
|
|
13517
13760
|
window.addEventListener("resize", syncToViewport);
|
|
13518
13761
|
return () => window.removeEventListener("resize", syncToViewport);
|
|
13519
13762
|
}, []);
|
|
13520
|
-
|
|
13763
|
+
useEffect50(() => {
|
|
13521
13764
|
const syncBarToViewport = () => {
|
|
13522
13765
|
const ratios = barPosRatioRef.current;
|
|
13523
|
-
|
|
13524
|
-
|
|
13525
|
-
setBarPosState(clampBarPos({
|
|
13766
|
+
const measured = voiceBarRef.current?.getBoundingClientRect().width;
|
|
13767
|
+
setBarPosState(ratios === null ? defaultBarPos() : clampBarPos({
|
|
13526
13768
|
x: ratios.xRatio * window.innerWidth,
|
|
13527
13769
|
y: ratios.yRatio * window.innerHeight
|
|
13528
|
-
}));
|
|
13770
|
+
}, measured || VOICE_BAR_WIDTH_PX));
|
|
13529
13771
|
};
|
|
13530
13772
|
window.addEventListener("resize", syncBarToViewport);
|
|
13531
13773
|
return () => window.removeEventListener("resize", syncBarToViewport);
|
|
@@ -13601,7 +13843,7 @@ function LiveAgent(props) {
|
|
|
13601
13843
|
bearerToken,
|
|
13602
13844
|
selectModule
|
|
13603
13845
|
});
|
|
13604
|
-
|
|
13846
|
+
useEffect50(() => {
|
|
13605
13847
|
if (!autoStartAfterLogin)
|
|
13606
13848
|
return;
|
|
13607
13849
|
if (bearerToken === null || !hasResolvedModules || isSessionLive)
|
|
@@ -13634,7 +13876,7 @@ function LiveAgent(props) {
|
|
|
13634
13876
|
phases: idleHistoryPhases,
|
|
13635
13877
|
isLoading: isLoadingHistory
|
|
13636
13878
|
}), [idleHistoryMessages, idleHistoryPhases, isLoadingHistory]);
|
|
13637
|
-
const [pageSplashDismissed, setPageSplashDismissed] =
|
|
13879
|
+
const [pageSplashDismissed, setPageSplashDismissed] = useState41(false);
|
|
13638
13880
|
const dismissSplash = useCallback36((surface) => {
|
|
13639
13881
|
if (surface !== SPLASH_SURFACE.Panel) {
|
|
13640
13882
|
setPageSplashDismissed(true);
|
|
@@ -13672,7 +13914,7 @@ function LiveAgent(props) {
|
|
|
13672
13914
|
isSplashVisible: splashSurfaces.overlay || splashSurfaces.panel || splashSurfaces.applies && !pageSplashDismissed,
|
|
13673
13915
|
isSessionLive
|
|
13674
13916
|
});
|
|
13675
|
-
|
|
13917
|
+
useEffect50(() => {
|
|
13676
13918
|
const open = () => {
|
|
13677
13919
|
reopenSplash();
|
|
13678
13920
|
if (configuredSplashSurfaces.overlay)
|
|
@@ -13694,6 +13936,7 @@ function LiveAgent(props) {
|
|
|
13694
13936
|
isDisconnecting,
|
|
13695
13937
|
isPausing,
|
|
13696
13938
|
error,
|
|
13939
|
+
errorSeq,
|
|
13697
13940
|
errorCode,
|
|
13698
13941
|
startSession,
|
|
13699
13942
|
pauseSession: pauseSessionAndMinimize,
|
|
@@ -13741,6 +13984,7 @@ function LiveAgent(props) {
|
|
|
13741
13984
|
isAuthenticated,
|
|
13742
13985
|
usesHostAuth,
|
|
13743
13986
|
authFailed,
|
|
13987
|
+
locale,
|
|
13744
13988
|
isValidating: auth.isValidating,
|
|
13745
13989
|
authError: auth.error,
|
|
13746
13990
|
requestOtp: auth.requestOtp,
|
|
@@ -13797,6 +14041,7 @@ function LiveAgent(props) {
|
|
|
13797
14041
|
isDisconnecting,
|
|
13798
14042
|
isPausing,
|
|
13799
14043
|
error,
|
|
14044
|
+
errorSeq,
|
|
13800
14045
|
errorCode,
|
|
13801
14046
|
startSession,
|
|
13802
14047
|
pauseSessionAndMinimize,
|
|
@@ -13838,6 +14083,7 @@ function LiveAgent(props) {
|
|
|
13838
14083
|
isAuthenticated,
|
|
13839
14084
|
usesHostAuth,
|
|
13840
14085
|
authFailed,
|
|
14086
|
+
locale,
|
|
13841
14087
|
auth.isValidating,
|
|
13842
14088
|
auth.error,
|
|
13843
14089
|
auth.requestOtp,
|
|
@@ -13975,7 +14221,7 @@ function LiveAgent(props) {
|
|
|
13975
14221
|
});
|
|
13976
14222
|
}
|
|
13977
14223
|
// src/components/SplashScreen.tsx
|
|
13978
|
-
import { useContext as useContext28, useEffect as
|
|
14224
|
+
import { useContext as useContext28, useEffect as useEffect51, useRef as useRef46 } from "react";
|
|
13979
14225
|
import { jsx as jsx57 } from "react/jsx-runtime";
|
|
13980
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.";
|
|
13981
14227
|
function SplashScreen({ className, onDismiss }) {
|
|
@@ -13986,7 +14232,7 @@ function SplashScreen({ className, onDismiss }) {
|
|
|
13986
14232
|
const disabledWarnedRef = useRef46(false);
|
|
13987
14233
|
const hasResolvedModules = ctx.hasResolvedModules;
|
|
13988
14234
|
const isSplashConfigured = ctx.isSplashConfigured;
|
|
13989
|
-
|
|
14235
|
+
useEffect51(() => {
|
|
13990
14236
|
if (!hasResolvedModules || isSplashConfigured || disabledWarnedRef.current)
|
|
13991
14237
|
return;
|
|
13992
14238
|
disabledWarnedRef.current = true;
|