@skippr/live-agent-sdk 0.77.0 → 0.78.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 +767 -522
- package/dist/skippr-sdk.css +1 -1
- package/dist/skippr-sdk.js +118 -118
- package/dist/types/components/AutoStartMedia.d.ts +2 -1
- package/dist/types/components/DomCapture.d.ts +5 -1
- package/dist/types/components/HighlightOverlay.d.ts +1 -1
- package/dist/types/components/TapToTalkMic.d.ts +7 -0
- package/dist/types/context/LiveAgentContext.d.ts +1 -0
- package/dist/types/context/TapToTalkContext.d.ts +6 -0
- package/dist/types/context/TranscriptionsContext.d.ts +8 -0
- package/dist/types/hooks/useIdleAutoPause.d.ts +10 -0
- package/dist/types/hooks/useLiveUserTranscript.d.ts +1 -0
- package/dist/types/hooks/useTapToTalk.d.ts +5 -0
- package/dist/types/lib/constants.d.ts +2 -0
- package/package.json +1 -1
package/dist/esm/lib-exports.js
CHANGED
|
@@ -8,7 +8,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
8
8
|
|
|
9
9
|
// src/components/LiveAgent.tsx
|
|
10
10
|
import { LiveKitRoom, RoomAudioRenderer } from "@livekit/components-react";
|
|
11
|
-
import { useCallback as
|
|
11
|
+
import { useCallback as useCallback17, useEffect as useEffect28, useMemo as useMemo7, useRef as useRef21, useState as useState20 } from "react";
|
|
12
12
|
|
|
13
13
|
// src/capture/useAgentCursor.ts
|
|
14
14
|
import { useEffect, useState } from "react";
|
|
@@ -68,6 +68,8 @@ var PAGE_ACTIONS_TOPIC = "skippr.page-actions";
|
|
|
68
68
|
var TEXT_MODE_TOPIC = "skippr.text-mode";
|
|
69
69
|
var ACTION_CONTROL_TOPIC = "skippr.action-control";
|
|
70
70
|
var SESSION_HOLD_TOPIC = "skippr.session-hold";
|
|
71
|
+
var TAP_TO_TALK_TOPIC = "skippr.tap-to-talk";
|
|
72
|
+
var IDLE_AUTO_PAUSE_MS = 3 * 60 * 1000;
|
|
71
73
|
var PLAN_ATTR = "skippr.action-plan";
|
|
72
74
|
var NAME_MAX_CHARS = 80;
|
|
73
75
|
|
|
@@ -194,8 +196,85 @@ function useSessionHoldContext() {
|
|
|
194
196
|
return useContext2(SessionHoldContext);
|
|
195
197
|
}
|
|
196
198
|
|
|
199
|
+
// src/context/TapToTalkContext.tsx
|
|
200
|
+
import { createContext as createContext3, useContext as useContext3 } from "react";
|
|
201
|
+
|
|
202
|
+
// src/hooks/useTapToTalk.ts
|
|
203
|
+
import { useLocalParticipant as useLocalParticipant2 } from "@livekit/components-react/hooks";
|
|
204
|
+
import { useCallback as useCallback2, useState as useState3 } from "react";
|
|
205
|
+
var textEncoder2 = new TextEncoder;
|
|
206
|
+
function useTapToTalk() {
|
|
207
|
+
const { localParticipant } = useLocalParticipant2();
|
|
208
|
+
const [isCapturingSpeech, setIsCapturingSpeech] = useState3(false);
|
|
209
|
+
const publish = useCallback2(async (type) => {
|
|
210
|
+
await localParticipant.publishData(textEncoder2.encode(JSON.stringify({ type })), {
|
|
211
|
+
reliable: true,
|
|
212
|
+
topic: TAP_TO_TALK_TOPIC
|
|
213
|
+
});
|
|
214
|
+
}, [localParticipant]);
|
|
215
|
+
const startRecording = useCallback2(async () => {
|
|
216
|
+
try {
|
|
217
|
+
await localParticipant.setMicrophoneEnabled(true);
|
|
218
|
+
await publish("start");
|
|
219
|
+
setIsCapturingSpeech(true);
|
|
220
|
+
} catch (error) {
|
|
221
|
+
console.error("Failed to start tap-to-talk turn:", error);
|
|
222
|
+
}
|
|
223
|
+
}, [localParticipant, publish]);
|
|
224
|
+
const commitRecording = useCallback2(async () => {
|
|
225
|
+
try {
|
|
226
|
+
await localParticipant.setMicrophoneEnabled(false);
|
|
227
|
+
await publish("commit");
|
|
228
|
+
setIsCapturingSpeech(false);
|
|
229
|
+
} catch (error) {
|
|
230
|
+
console.error("Failed to commit tap-to-talk turn:", error);
|
|
231
|
+
}
|
|
232
|
+
}, [localParticipant, publish]);
|
|
233
|
+
const toggle = useCallback2(() => {
|
|
234
|
+
if (isCapturingSpeech) {
|
|
235
|
+
commitRecording();
|
|
236
|
+
} else {
|
|
237
|
+
startRecording();
|
|
238
|
+
}
|
|
239
|
+
}, [isCapturingSpeech, startRecording, commitRecording]);
|
|
240
|
+
return { isCapturingSpeech, toggle };
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// src/context/TapToTalkContext.tsx
|
|
244
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
245
|
+
var TapToTalkContext = createContext3({
|
|
246
|
+
isCapturingSpeech: false,
|
|
247
|
+
toggle: () => {}
|
|
248
|
+
});
|
|
249
|
+
function TapToTalkProvider({ children }) {
|
|
250
|
+
const tapToTalk = useTapToTalk();
|
|
251
|
+
return /* @__PURE__ */ jsx2(TapToTalkContext.Provider, {
|
|
252
|
+
value: tapToTalk,
|
|
253
|
+
children
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
function useTapToTalkContext() {
|
|
257
|
+
return useContext3(TapToTalkContext);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// src/context/TranscriptionsContext.tsx
|
|
261
|
+
import { useTranscriptions } from "@livekit/components-react/hooks";
|
|
262
|
+
import { createContext as createContext4, useContext as useContext4 } from "react";
|
|
263
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
264
|
+
var TranscriptionsContext = createContext4([]);
|
|
265
|
+
function TranscriptionsProvider({ children }) {
|
|
266
|
+
const transcriptions = useTranscriptions();
|
|
267
|
+
return /* @__PURE__ */ jsx3(TranscriptionsContext.Provider, {
|
|
268
|
+
value: transcriptions,
|
|
269
|
+
children
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
function useSharedTranscriptions() {
|
|
273
|
+
return useContext4(TranscriptionsContext);
|
|
274
|
+
}
|
|
275
|
+
|
|
197
276
|
// src/hooks/useAdoptionGoals.ts
|
|
198
|
-
import { useCallback as
|
|
277
|
+
import { useCallback as useCallback3, useEffect as useEffect3, useMemo, useState as useState4 } from "react";
|
|
199
278
|
|
|
200
279
|
// src/lib/hashMatch.ts
|
|
201
280
|
function globToRegExp(pattern) {
|
|
@@ -263,9 +342,9 @@ function useAdoptionGoals({
|
|
|
263
342
|
bearerToken,
|
|
264
343
|
authedFetch
|
|
265
344
|
}) {
|
|
266
|
-
const [candidates, setCandidates] =
|
|
267
|
-
const [hash, setHash] =
|
|
268
|
-
const match =
|
|
345
|
+
const [candidates, setCandidates] = useState4([]);
|
|
346
|
+
const [hash, setHash] = useState4(window.location.hash);
|
|
347
|
+
const match = useCallback3(async () => {
|
|
269
348
|
try {
|
|
270
349
|
const resp = await authedFetch(`${API_URL}/v1/adoption/goals/match`, {
|
|
271
350
|
method: "POST",
|
|
@@ -315,21 +394,21 @@ function useAdoptionGoals({
|
|
|
315
394
|
return hashSpecific;
|
|
316
395
|
return candidates.filter((goal) => goal.hashPattern === null);
|
|
317
396
|
}, [candidates, hash]);
|
|
318
|
-
const postStatus =
|
|
397
|
+
const postStatus = useCallback3((goalId, status) => {
|
|
319
398
|
authedFetch(`${API_URL}/v1/adoption/goals/${goalId}/status`, {
|
|
320
399
|
method: "POST",
|
|
321
400
|
headers: { "Content-Type": "application/json" },
|
|
322
401
|
body: JSON.stringify({ status })
|
|
323
402
|
}).catch((e) => console.warn("[Skippr] adoption status update failed", e));
|
|
324
403
|
}, [authedFetch]);
|
|
325
|
-
const attendGoal =
|
|
404
|
+
const attendGoal = useCallback3((goalId) => {
|
|
326
405
|
postStatus(goalId, "attended" /* Attended */);
|
|
327
406
|
}, [postStatus]);
|
|
328
407
|
return { goals, attendGoal };
|
|
329
408
|
}
|
|
330
409
|
|
|
331
410
|
// src/hooks/useAuth.ts
|
|
332
|
-
import { useCallback as
|
|
411
|
+
import { useCallback as useCallback4, useEffect as useEffect4, useState as useState5 } from "react";
|
|
333
412
|
var API_URL2 = "https://specialist.skippr.ai/api";
|
|
334
413
|
function storageKey(appKey) {
|
|
335
414
|
return `skippr_auth_${appKey}`;
|
|
@@ -356,10 +435,10 @@ function clearStoredToken(appKey) {
|
|
|
356
435
|
}
|
|
357
436
|
}
|
|
358
437
|
function useAuth({ appKey }) {
|
|
359
|
-
const [authToken, setAuthToken] =
|
|
360
|
-
const [isValidating, setIsValidating] =
|
|
361
|
-
const [isSubmitting, setIsSubmitting] =
|
|
362
|
-
const [error, setError] =
|
|
438
|
+
const [authToken, setAuthToken] = useState5(null);
|
|
439
|
+
const [isValidating, setIsValidating] = useState5(false);
|
|
440
|
+
const [isSubmitting, setIsSubmitting] = useState5(false);
|
|
441
|
+
const [error, setError] = useState5("");
|
|
363
442
|
const isAuthenticated = authToken !== null;
|
|
364
443
|
useEffect4(() => {
|
|
365
444
|
if (!appKey)
|
|
@@ -395,7 +474,7 @@ function useAuth({ appKey }) {
|
|
|
395
474
|
window.addEventListener("skippr:logout", handleLogout);
|
|
396
475
|
return () => window.removeEventListener("skippr:logout", handleLogout);
|
|
397
476
|
}, []);
|
|
398
|
-
const requestOtp =
|
|
477
|
+
const requestOtp = useCallback4(async (email) => {
|
|
399
478
|
if (!appKey)
|
|
400
479
|
return false;
|
|
401
480
|
setIsSubmitting(true);
|
|
@@ -422,7 +501,7 @@ function useAuth({ appKey }) {
|
|
|
422
501
|
setIsSubmitting(false);
|
|
423
502
|
}
|
|
424
503
|
}, [appKey]);
|
|
425
|
-
const verifyOtp =
|
|
504
|
+
const verifyOtp = useCallback4(async (email, code) => {
|
|
426
505
|
if (!appKey)
|
|
427
506
|
return;
|
|
428
507
|
setIsSubmitting(true);
|
|
@@ -451,7 +530,7 @@ function useAuth({ appKey }) {
|
|
|
451
530
|
setIsSubmitting(false);
|
|
452
531
|
}
|
|
453
532
|
}, [appKey]);
|
|
454
|
-
const logout =
|
|
533
|
+
const logout = useCallback4(async () => {
|
|
455
534
|
const token = authToken;
|
|
456
535
|
if (appKey)
|
|
457
536
|
clearStoredToken(appKey);
|
|
@@ -601,7 +680,7 @@ function useAutoStart({
|
|
|
601
680
|
}
|
|
602
681
|
|
|
603
682
|
// src/hooks/useAvailableModules.ts
|
|
604
|
-
import { useCallback as
|
|
683
|
+
import { useCallback as useCallback5, useEffect as useEffect6, useState as useState6 } from "react";
|
|
605
684
|
var EMPTY_DEFAULT = { agentId: null, sessionId: null };
|
|
606
685
|
var API_URL3 = "https://specialist.skippr.ai/api";
|
|
607
686
|
function useAvailableModules({
|
|
@@ -610,12 +689,12 @@ function useAvailableModules({
|
|
|
610
689
|
authedFetch,
|
|
611
690
|
agentId
|
|
612
691
|
}) {
|
|
613
|
-
const [modules, setModules] =
|
|
614
|
-
const [defaultSelection, setDefaultSelection] =
|
|
615
|
-
const [isLoading, setIsLoading] =
|
|
616
|
-
const [hasResolved, setHasResolved] =
|
|
617
|
-
const [error, setError] =
|
|
618
|
-
const fetchModules =
|
|
692
|
+
const [modules, setModules] = useState6([]);
|
|
693
|
+
const [defaultSelection, setDefaultSelection] = useState6(EMPTY_DEFAULT);
|
|
694
|
+
const [isLoading, setIsLoading] = useState6(false);
|
|
695
|
+
const [hasResolved, setHasResolved] = useState6(false);
|
|
696
|
+
const [error, setError] = useState6(null);
|
|
697
|
+
const fetchModules = useCallback5(async () => {
|
|
619
698
|
setIsLoading(true);
|
|
620
699
|
setHasResolved(false);
|
|
621
700
|
setError(null);
|
|
@@ -652,13 +731,13 @@ function useAvailableModules({
|
|
|
652
731
|
}
|
|
653
732
|
|
|
654
733
|
// src/hooks/usePlanUpdates.ts
|
|
655
|
-
import { useCallback as
|
|
734
|
+
import { useCallback as useCallback6 } from "react";
|
|
656
735
|
|
|
657
736
|
// src/hooks/useAgentState.ts
|
|
658
737
|
import { useRemoteParticipants } from "@livekit/components-react/hooks";
|
|
659
|
-
import { useEffect as useEffect7, useState as
|
|
738
|
+
import { useEffect as useEffect7, useState as useState7 } from "react";
|
|
660
739
|
function useAgentState(attributeKey, parse, initial) {
|
|
661
|
-
const [value, setValue] =
|
|
740
|
+
const [value, setValue] = useState7(initial);
|
|
662
741
|
const remoteParticipants = useRemoteParticipants();
|
|
663
742
|
useEffect7(() => {
|
|
664
743
|
const agentParticipant = remoteParticipants.find((p) => p.attributes?.[attributeKey]);
|
|
@@ -706,12 +785,12 @@ function parsePlan(json) {
|
|
|
706
785
|
return null;
|
|
707
786
|
}
|
|
708
787
|
function usePlanUpdates() {
|
|
709
|
-
const parse =
|
|
788
|
+
const parse = useCallback6(parsePlan, []);
|
|
710
789
|
return useAgentState(PLAN_ATTR, parse, null);
|
|
711
790
|
}
|
|
712
791
|
|
|
713
792
|
// src/hooks/useSession.ts
|
|
714
|
-
import { useCallback as
|
|
793
|
+
import { useCallback as useCallback7, useEffect as useEffect8, useRef as useRef2, useState as useState8 } from "react";
|
|
715
794
|
var API_URL4 = "https://specialist.skippr.ai/api";
|
|
716
795
|
async function fetchSessionMessages(sessionId, authedFetch) {
|
|
717
796
|
try {
|
|
@@ -763,27 +842,27 @@ function useSession({
|
|
|
763
842
|
onStartError,
|
|
764
843
|
onDisconnect
|
|
765
844
|
}) {
|
|
766
|
-
const [connection, setConnection] =
|
|
767
|
-
const [shouldConnect, setShouldConnect] =
|
|
768
|
-
const [isStarting, setIsStarting] =
|
|
769
|
-
const [isDisconnecting, setIsDisconnecting] =
|
|
770
|
-
const [error, setError] =
|
|
771
|
-
const [errorCode, setErrorCode] =
|
|
772
|
-
const [sessionId, setSessionId] =
|
|
773
|
-
const [bearerToken, setBearerToken] =
|
|
774
|
-
const [pendingScreenStream, setPendingScreenStream] =
|
|
775
|
-
const [isPaused, setIsPaused] =
|
|
776
|
-
const [isPausing, setIsPausing] =
|
|
777
|
-
const [pauseTimeoutSeconds, setPauseTimeoutSeconds] =
|
|
778
|
-
const [historyMessages, setHistoryMessages] =
|
|
779
|
-
const [authFailed, setAuthFailed] =
|
|
845
|
+
const [connection, setConnection] = useState8(null);
|
|
846
|
+
const [shouldConnect, setShouldConnect] = useState8(false);
|
|
847
|
+
const [isStarting, setIsStarting] = useState8(false);
|
|
848
|
+
const [isDisconnecting, setIsDisconnecting] = useState8(false);
|
|
849
|
+
const [error, setError] = useState8("");
|
|
850
|
+
const [errorCode, setErrorCode] = useState8(null);
|
|
851
|
+
const [sessionId, setSessionId] = useState8(null);
|
|
852
|
+
const [bearerToken, setBearerToken] = useState8(authToken ?? null);
|
|
853
|
+
const [pendingScreenStream, setPendingScreenStream] = useState8(null);
|
|
854
|
+
const [isPaused, setIsPaused] = useState8(false);
|
|
855
|
+
const [isPausing, setIsPausing] = useState8(false);
|
|
856
|
+
const [pauseTimeoutSeconds, setPauseTimeoutSeconds] = useState8(null);
|
|
857
|
+
const [historyMessages, setHistoryMessages] = useState8([]);
|
|
858
|
+
const [authFailed, setAuthFailed] = useState8(false);
|
|
780
859
|
const tokenRef = useRef2(authToken ? { token: authToken, expiresAt: null } : null);
|
|
781
860
|
const getUserTokenRef = useRef2(getUserToken);
|
|
782
861
|
getUserTokenRef.current = getUserToken ?? (userToken ? () => Promise.resolve(userToken) : undefined);
|
|
783
862
|
const failedBearerRef = useRef2(null);
|
|
784
863
|
const inFlightExchangeRef = useRef2(null);
|
|
785
|
-
const canExchange =
|
|
786
|
-
const reExchange =
|
|
864
|
+
const canExchange = useCallback7(() => !!appKey && !!getUserTokenRef.current, [appKey]);
|
|
865
|
+
const reExchange = useCallback7(async () => {
|
|
787
866
|
if (inFlightExchangeRef.current)
|
|
788
867
|
return inFlightExchangeRef.current;
|
|
789
868
|
const provider = getUserTokenRef.current;
|
|
@@ -803,7 +882,7 @@ function useSession({
|
|
|
803
882
|
inFlightExchangeRef.current = null;
|
|
804
883
|
}
|
|
805
884
|
}, [appKey]);
|
|
806
|
-
const getValidBearer =
|
|
885
|
+
const getValidBearer = useCallback7(async () => {
|
|
807
886
|
const current = tokenRef.current;
|
|
808
887
|
if (current) {
|
|
809
888
|
if (current.expiresAt === null)
|
|
@@ -815,7 +894,7 @@ function useSession({
|
|
|
815
894
|
return reExchange();
|
|
816
895
|
return current?.token ?? null;
|
|
817
896
|
}, [canExchange, reExchange]);
|
|
818
|
-
const authedFetch =
|
|
897
|
+
const authedFetch = useCallback7(async (input, init = {}) => {
|
|
819
898
|
const isSecretMode = canExchange();
|
|
820
899
|
const onTerminalAuthFailure = () => {
|
|
821
900
|
if (isSecretMode)
|
|
@@ -894,7 +973,7 @@ function useSession({
|
|
|
894
973
|
window.addEventListener("pagehide", onPageHide);
|
|
895
974
|
return () => window.removeEventListener("pagehide", onPageHide);
|
|
896
975
|
}, []);
|
|
897
|
-
const startSession =
|
|
976
|
+
const startSession = useCallback7(async ({
|
|
898
977
|
agentId,
|
|
899
978
|
agentControls,
|
|
900
979
|
existingSessionId,
|
|
@@ -925,6 +1004,8 @@ function useSession({
|
|
|
925
1004
|
enabledControls.highlight = true;
|
|
926
1005
|
if (agentControls?.actions === true)
|
|
927
1006
|
enabledControls.actions = true;
|
|
1007
|
+
if (agentControls?.tapToTalk === true)
|
|
1008
|
+
enabledControls.tapToTalk = true;
|
|
928
1009
|
const requestAgentControls = Object.keys(enabledControls).length > 0 ? enabledControls : undefined;
|
|
929
1010
|
try {
|
|
930
1011
|
let resolvedSessionId = existingSessionId;
|
|
@@ -986,7 +1067,7 @@ function useSession({
|
|
|
986
1067
|
setIsStarting(false);
|
|
987
1068
|
}
|
|
988
1069
|
}, [captureMode, bearerToken, authedFetch, onStart, onStartError]);
|
|
989
|
-
const pauseSession =
|
|
1070
|
+
const pauseSession = useCallback7(async () => {
|
|
990
1071
|
if (!sessionId || !bearerToken)
|
|
991
1072
|
return;
|
|
992
1073
|
setIsPausing(true);
|
|
@@ -1012,7 +1093,7 @@ function useSession({
|
|
|
1012
1093
|
setIsPaused(true);
|
|
1013
1094
|
setIsPausing(false);
|
|
1014
1095
|
}, [sessionId, bearerToken, authedFetch, pendingScreenStream]);
|
|
1015
|
-
const disconnect =
|
|
1096
|
+
const disconnect = useCallback7(async () => {
|
|
1016
1097
|
setIsDisconnecting(true);
|
|
1017
1098
|
try {
|
|
1018
1099
|
if (sessionId && bearerToken) {
|
|
@@ -1057,7 +1138,7 @@ function useSession({
|
|
|
1057
1138
|
}
|
|
1058
1139
|
|
|
1059
1140
|
// src/hooks/useSessionHistory.ts
|
|
1060
|
-
import { useEffect as useEffect9, useState as
|
|
1141
|
+
import { useEffect as useEffect9, useState as useState9 } from "react";
|
|
1061
1142
|
var API_URL5 = "https://specialist.skippr.ai/api";
|
|
1062
1143
|
var EMPTY = { messages: [], phases: [] };
|
|
1063
1144
|
function useSessionHistory({
|
|
@@ -1065,8 +1146,8 @@ function useSessionHistory({
|
|
|
1065
1146
|
enabled,
|
|
1066
1147
|
authedFetch
|
|
1067
1148
|
}) {
|
|
1068
|
-
const [history2, setHistory] =
|
|
1069
|
-
const [loadedAgentId, setLoadedAgentId] =
|
|
1149
|
+
const [history2, setHistory] = useState9(EMPTY);
|
|
1150
|
+
const [loadedAgentId, setLoadedAgentId] = useState9(null);
|
|
1070
1151
|
const activeAgentId = enabled && agentId ? agentId : null;
|
|
1071
1152
|
const isLoading = activeAgentId !== null && activeAgentId !== loadedAgentId;
|
|
1072
1153
|
useEffect9(() => {
|
|
@@ -1182,9 +1263,9 @@ var hasA11yProp = (props) => {
|
|
|
1182
1263
|
};
|
|
1183
1264
|
|
|
1184
1265
|
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/context.js
|
|
1185
|
-
import { createContext as
|
|
1186
|
-
var LucideContext =
|
|
1187
|
-
var useLucideContext = () =>
|
|
1266
|
+
import { createContext as createContext5, useContext as useContext5, useMemo as useMemo3, createElement } from "react";
|
|
1267
|
+
var LucideContext = createContext5({});
|
|
1268
|
+
var useLucideContext = () => useContext5(LucideContext);
|
|
1188
1269
|
|
|
1189
1270
|
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/Icon.js
|
|
1190
1271
|
var Icon = forwardRef(({ color, size, strokeWidth, absoluteStrokeWidth, className = "", children, iconNode, ...rest }, ref) => {
|
|
@@ -1408,7 +1489,7 @@ var __iconNode23 = [
|
|
|
1408
1489
|
];
|
|
1409
1490
|
var X = createLucideIcon("x", __iconNode23);
|
|
1410
1491
|
// src/components/AgentCursor.tsx
|
|
1411
|
-
import { useContext as
|
|
1492
|
+
import { useContext as useContext6, useEffect as useEffect10, useLayoutEffect, useRef as useRef3, useState as useState10 } from "react";
|
|
1412
1493
|
|
|
1413
1494
|
// src/capture/elementRef.ts
|
|
1414
1495
|
function safeGetIframeDocument(iframe) {
|
|
@@ -1545,7 +1626,7 @@ function traceRing(path, durationMs, onFrame, onDone) {
|
|
|
1545
1626
|
}
|
|
1546
1627
|
|
|
1547
1628
|
// src/components/AgentCursor.tsx
|
|
1548
|
-
import { jsx as
|
|
1629
|
+
import { jsx as jsx4, jsxs } from "react/jsx-runtime";
|
|
1549
1630
|
var Z_INDEX = 2147483646;
|
|
1550
1631
|
var BRAND_TEAL = "#2bc0ae";
|
|
1551
1632
|
var GLIDE_EASE = "cubic-bezier(0.45, 0, 0.25, 1)";
|
|
@@ -1590,12 +1671,12 @@ function AgentCursor({
|
|
|
1590
1671
|
target,
|
|
1591
1672
|
animated = false
|
|
1592
1673
|
}) {
|
|
1593
|
-
const ctx =
|
|
1594
|
-
const [cursor, setCursor] =
|
|
1595
|
-
const [glideMs, setGlideMs] =
|
|
1596
|
-
const [phase, setPhase] =
|
|
1597
|
-
const [ringBox, setRingBox] =
|
|
1598
|
-
const [clickPulse, setClickPulse] =
|
|
1674
|
+
const ctx = useContext6(LiveAgentContext);
|
|
1675
|
+
const [cursor, setCursor] = useState10(null);
|
|
1676
|
+
const [glideMs, setGlideMs] = useState10(0);
|
|
1677
|
+
const [phase, setPhase] = useState10("idle");
|
|
1678
|
+
const [ringBox, setRingBox] = useState10(null);
|
|
1679
|
+
const [clickPulse, setClickPulse] = useState10(0);
|
|
1599
1680
|
const cursorElRef = useRef3(null);
|
|
1600
1681
|
const pathRef = useRef3(null);
|
|
1601
1682
|
const prevCursorRef = useRef3(null);
|
|
@@ -1767,10 +1848,10 @@ function AgentCursor({
|
|
|
1767
1848
|
"data-skippr-private": "true",
|
|
1768
1849
|
"aria-hidden": "true",
|
|
1769
1850
|
children: [
|
|
1770
|
-
drawing && ringBox && /* @__PURE__ */
|
|
1851
|
+
drawing && ringBox && /* @__PURE__ */ jsx4("svg", {
|
|
1771
1852
|
"aria-hidden": "true",
|
|
1772
1853
|
style: { ...ringBoxStyle(ringBox, Z_INDEX), overflow: "visible" },
|
|
1773
|
-
children: /* @__PURE__ */
|
|
1854
|
+
children: /* @__PURE__ */ jsx4("path", {
|
|
1774
1855
|
ref: pathRef,
|
|
1775
1856
|
d: ringPathD(ringBox),
|
|
1776
1857
|
fill: "none",
|
|
@@ -1784,20 +1865,20 @@ function AgentCursor({
|
|
|
1784
1865
|
style: ringBoxStyle(ringBox, Z_INDEX),
|
|
1785
1866
|
className: "skippr:relative",
|
|
1786
1867
|
children: [
|
|
1787
|
-
/* @__PURE__ */
|
|
1868
|
+
/* @__PURE__ */ jsx4("div", {
|
|
1788
1869
|
className: "skippr:absolute skippr:inset-0 skippr:rounded-[1rem] skippr:border-2 skippr:border-[#2bc0ae] skippr:animate-skippr-annotation-pulse"
|
|
1789
1870
|
}),
|
|
1790
|
-
/* @__PURE__ */
|
|
1871
|
+
/* @__PURE__ */ jsx4("div", {
|
|
1791
1872
|
role: "status",
|
|
1792
1873
|
className: "skippr:absolute skippr:-bottom-9 skippr:left-1/2 skippr:-translate-x-1/2 skippr:flex skippr:items-center skippr:gap-1.5 skippr:rounded-full skippr:bg-[#2bc0ae] skippr:px-2.5 skippr:py-1 skippr:shadow-[0_4px_12px_rgba(0,0,0,0.12)]",
|
|
1793
|
-
children: /* @__PURE__ */
|
|
1874
|
+
children: /* @__PURE__ */ jsx4("span", {
|
|
1794
1875
|
className: "skippr:text-[11px] skippr:font-medium skippr:text-white skippr:whitespace-nowrap",
|
|
1795
1876
|
children: target.label
|
|
1796
1877
|
})
|
|
1797
1878
|
})
|
|
1798
1879
|
]
|
|
1799
1880
|
}),
|
|
1800
|
-
target.kind === "gesture" && /* @__PURE__ */
|
|
1881
|
+
target.kind === "gesture" && /* @__PURE__ */ jsx4("div", {
|
|
1801
1882
|
role: "status",
|
|
1802
1883
|
className: "skippr:fixed skippr:-translate-x-1/2 skippr:flex skippr:items-center skippr:gap-1.5 skippr:rounded-full skippr:bg-[#2bc0ae] skippr:px-2.5 skippr:py-1 skippr:shadow-[0_4px_12px_rgba(0,0,0,0.12)]",
|
|
1803
1884
|
style: {
|
|
@@ -1807,12 +1888,12 @@ function AgentCursor({
|
|
|
1807
1888
|
pointerEvents: "none",
|
|
1808
1889
|
transition: `left ${glideMs}ms ${GLIDE_EASE}, top ${glideMs}ms ${GLIDE_EASE}`
|
|
1809
1890
|
},
|
|
1810
|
-
children: /* @__PURE__ */
|
|
1891
|
+
children: /* @__PURE__ */ jsx4("span", {
|
|
1811
1892
|
className: "skippr:text-[11px] skippr:font-medium skippr:text-white skippr:whitespace-nowrap",
|
|
1812
1893
|
children: target.label
|
|
1813
1894
|
})
|
|
1814
1895
|
}),
|
|
1815
|
-
/* @__PURE__ */
|
|
1896
|
+
/* @__PURE__ */ jsx4("div", {
|
|
1816
1897
|
ref: cursorElRef,
|
|
1817
1898
|
style: {
|
|
1818
1899
|
position: "fixed",
|
|
@@ -1822,12 +1903,12 @@ function AgentCursor({
|
|
|
1822
1903
|
zIndex: Z_INDEX,
|
|
1823
1904
|
transition: `left ${glideMs}ms ${GLIDE_EASE}, top ${glideMs}ms ${GLIDE_EASE}`
|
|
1824
1905
|
},
|
|
1825
|
-
children: /* @__PURE__ */
|
|
1906
|
+
children: /* @__PURE__ */ jsx4(MousePointer2, {
|
|
1826
1907
|
className: `skippr:h-5 skippr:w-5 skippr:text-[#2bc0ae] skippr:drop-shadow-[0_2px_5px_rgba(0,0,0,0.4)] ${clickPulse > 0 ? "skippr:animate-skippr-press" : "skippr:animate-skippr-cursor-pop"}`,
|
|
1827
1908
|
fill: "currentColor"
|
|
1828
1909
|
}, clickPulse)
|
|
1829
1910
|
}),
|
|
1830
|
-
clickPulse > 0 && rippleCenter && /* @__PURE__ */
|
|
1911
|
+
clickPulse > 0 && rippleCenter && /* @__PURE__ */ jsx4("span", {
|
|
1831
1912
|
className: "skippr:fixed skippr:h-7 skippr:w-7 skippr:rounded-full skippr:bg-[#2bc0ae]/50 skippr:animate-skippr-click-ping",
|
|
1832
1913
|
style: {
|
|
1833
1914
|
left: `${rippleCenter.x}px`,
|
|
@@ -1841,11 +1922,11 @@ function AgentCursor({
|
|
|
1841
1922
|
}
|
|
1842
1923
|
|
|
1843
1924
|
// src/components/AutoStartMedia.tsx
|
|
1844
|
-
import { useConnectionState, useLocalParticipant as
|
|
1925
|
+
import { useConnectionState, useLocalParticipant as useLocalParticipant3 } from "@livekit/components-react/hooks";
|
|
1845
1926
|
import { ConnectionState, Track } from "livekit-client";
|
|
1846
1927
|
import { useEffect as useEffect11, useRef as useRef4 } from "react";
|
|
1847
|
-
function AutoStartMedia({ pendingScreenStream }) {
|
|
1848
|
-
const { localParticipant } =
|
|
1928
|
+
function AutoStartMedia({ pendingScreenStream, tapToTalk = false }) {
|
|
1929
|
+
const { localParticipant } = useLocalParticipant3();
|
|
1849
1930
|
const connectionState = useConnectionState();
|
|
1850
1931
|
const didStartRef = useRef4(false);
|
|
1851
1932
|
useEffect11(() => {
|
|
@@ -1854,7 +1935,9 @@ function AutoStartMedia({ pendingScreenStream }) {
|
|
|
1854
1935
|
if (connectionState !== ConnectionState.Connected)
|
|
1855
1936
|
return;
|
|
1856
1937
|
didStartRef.current = true;
|
|
1857
|
-
|
|
1938
|
+
if (!tapToTalk) {
|
|
1939
|
+
localParticipant.setMicrophoneEnabled(true).catch((error) => console.error("Failed to enable microphone:", error));
|
|
1940
|
+
}
|
|
1858
1941
|
if (pendingScreenStream) {
|
|
1859
1942
|
const videoTrack = pendingScreenStream.getVideoTracks()[0];
|
|
1860
1943
|
if (videoTrack) {
|
|
@@ -1866,12 +1949,12 @@ function AutoStartMedia({ pendingScreenStream }) {
|
|
|
1866
1949
|
});
|
|
1867
1950
|
}
|
|
1868
1951
|
}
|
|
1869
|
-
}, [connectionState, localParticipant, pendingScreenStream]);
|
|
1952
|
+
}, [connectionState, localParticipant, pendingScreenStream, tapToTalk]);
|
|
1870
1953
|
return null;
|
|
1871
1954
|
}
|
|
1872
1955
|
|
|
1873
1956
|
// src/components/DomCapture.tsx
|
|
1874
|
-
import { useConnectionState as useConnectionState2, useLocalParticipant as
|
|
1957
|
+
import { useConnectionState as useConnectionState2, useLocalParticipant as useLocalParticipant4 } from "@livekit/components-react/hooks";
|
|
1875
1958
|
import { ConnectionState as ConnectionState2, ScreenSharePresets, Track as Track2 } from "livekit-client";
|
|
1876
1959
|
import { useEffect as useEffect12, useRef as useRef5 } from "react";
|
|
1877
1960
|
|
|
@@ -2488,7 +2571,7 @@ function subscribeActionsBusy(cb) {
|
|
|
2488
2571
|
|
|
2489
2572
|
// src/capture/domEvents.ts
|
|
2490
2573
|
var MUTATION_DEBOUNCE_MS = 250;
|
|
2491
|
-
var
|
|
2574
|
+
var textEncoder3 = new TextEncoder;
|
|
2492
2575
|
function isInsideWidget(target) {
|
|
2493
2576
|
if (!(target instanceof Node))
|
|
2494
2577
|
return false;
|
|
@@ -2514,7 +2597,7 @@ function installDomEventListeners(localParticipant, options = {}) {
|
|
|
2514
2597
|
const { onTriggerEvent } = options;
|
|
2515
2598
|
function publishDomEvent(event) {
|
|
2516
2599
|
try {
|
|
2517
|
-
localParticipant.publishData(
|
|
2600
|
+
localParticipant.publishData(textEncoder3.encode(JSON.stringify(event)), {
|
|
2518
2601
|
reliable: true,
|
|
2519
2602
|
topic: DOM_EVENTS_TOPIC
|
|
2520
2603
|
}).catch(() => {
|
|
@@ -2680,7 +2763,7 @@ var CAPTURE_BITRATE = 4000000;
|
|
|
2680
2763
|
var DOM_SNAPSHOT_GZIP_THRESHOLD_BYTES = 14000;
|
|
2681
2764
|
var MAX_CANVAS_DPR = 1.5;
|
|
2682
2765
|
var CONSECUTIVE_FAILURES_BEFORE_REPORT = 3;
|
|
2683
|
-
var
|
|
2766
|
+
var textEncoder4 = new TextEncoder;
|
|
2684
2767
|
function shouldIncludeInSnapshot(element) {
|
|
2685
2768
|
if (!(element instanceof Element))
|
|
2686
2769
|
return true;
|
|
@@ -2755,7 +2838,7 @@ async function buildDomSnapshotFrame() {
|
|
|
2755
2838
|
title: document.title,
|
|
2756
2839
|
capturedAt: new Date().toISOString()
|
|
2757
2840
|
});
|
|
2758
|
-
const snapshotBytes =
|
|
2841
|
+
const snapshotBytes = textEncoder4.encode(snapshotJson);
|
|
2759
2842
|
const { bytes, compressionFlag } = await gzipIfBeneficial(snapshotBytes);
|
|
2760
2843
|
const frame = new Uint8Array(bytes.byteLength + 1);
|
|
2761
2844
|
frame[0] = compressionFlag;
|
|
@@ -2764,7 +2847,7 @@ async function buildDomSnapshotFrame() {
|
|
|
2764
2847
|
}
|
|
2765
2848
|
function reportCaptureError(localParticipant) {
|
|
2766
2849
|
try {
|
|
2767
|
-
localParticipant.publishData(
|
|
2850
|
+
localParticipant.publishData(textEncoder4.encode(JSON.stringify({ type: "capture_error" })), {
|
|
2768
2851
|
reliable: true,
|
|
2769
2852
|
topic: DOM_SNAPSHOT_TOPIC
|
|
2770
2853
|
}).catch(() => {
|
|
@@ -2778,8 +2861,8 @@ async function unpublishAndStopTrack(localParticipant, videoTrack) {
|
|
|
2778
2861
|
} catch {}
|
|
2779
2862
|
videoTrack.stop();
|
|
2780
2863
|
}
|
|
2781
|
-
function DomCapture() {
|
|
2782
|
-
const { localParticipant } =
|
|
2864
|
+
function DomCapture({ tapToTalk = false }) {
|
|
2865
|
+
const { localParticipant } = useLocalParticipant4();
|
|
2783
2866
|
const connectionState = useConnectionState2();
|
|
2784
2867
|
const didStartRef = useRef5(false);
|
|
2785
2868
|
useEffect12(() => {
|
|
@@ -2803,7 +2886,9 @@ function DomCapture() {
|
|
|
2803
2886
|
let snapshotInFlight = false;
|
|
2804
2887
|
let a11yPublishInFlight = false;
|
|
2805
2888
|
let consecutiveCaptureFailures = 0;
|
|
2806
|
-
|
|
2889
|
+
if (!tapToTalk) {
|
|
2890
|
+
localParticipant.setMicrophoneEnabled(true).catch((error) => console.error("Failed to enable microphone:", error));
|
|
2891
|
+
}
|
|
2807
2892
|
localParticipant.publishTrack(videoTrack, {
|
|
2808
2893
|
source: Track2.Source.ScreenShare,
|
|
2809
2894
|
videoEncoding: {
|
|
@@ -2886,14 +2971,14 @@ function DomCapture() {
|
|
|
2886
2971
|
for (const track of canvasStream.getTracks())
|
|
2887
2972
|
track.stop();
|
|
2888
2973
|
};
|
|
2889
|
-
}, [connectionState, localParticipant]);
|
|
2974
|
+
}, [connectionState, localParticipant, tapToTalk]);
|
|
2890
2975
|
return null;
|
|
2891
2976
|
}
|
|
2892
2977
|
|
|
2893
2978
|
// src/components/HighlightOverlay.tsx
|
|
2894
2979
|
import { useDataChannel } from "@livekit/components-react/hooks";
|
|
2895
|
-
import { useCallback as
|
|
2896
|
-
var HIGHLIGHT_AUTO_CLEAR_MS =
|
|
2980
|
+
import { useCallback as useCallback8, useEffect as useEffect13, useRef as useRef6 } from "react";
|
|
2981
|
+
var HIGHLIGHT_AUTO_CLEAR_MS = 25000;
|
|
2897
2982
|
var textDecoder = new TextDecoder;
|
|
2898
2983
|
function parseHighlightMessage(payload) {
|
|
2899
2984
|
try {
|
|
@@ -2917,14 +3002,14 @@ function parseHighlightMessage(payload) {
|
|
|
2917
3002
|
function HighlightOverlay() {
|
|
2918
3003
|
const targetRef = useRef6(null);
|
|
2919
3004
|
const autoClearRef = useRef6(null);
|
|
2920
|
-
const clear =
|
|
3005
|
+
const clear = useCallback8(() => {
|
|
2921
3006
|
if (autoClearRef.current)
|
|
2922
3007
|
clearTimeout(autoClearRef.current);
|
|
2923
3008
|
autoClearRef.current = null;
|
|
2924
3009
|
targetRef.current = null;
|
|
2925
3010
|
clearCursorTarget("guide");
|
|
2926
3011
|
}, []);
|
|
2927
|
-
const onHighlightMessage =
|
|
3012
|
+
const onHighlightMessage = useCallback8((msg) => {
|
|
2928
3013
|
const parsed = parseHighlightMessage(msg.payload);
|
|
2929
3014
|
if (!parsed)
|
|
2930
3015
|
return;
|
|
@@ -2963,7 +3048,7 @@ function HighlightOverlay() {
|
|
|
2963
3048
|
}
|
|
2964
3049
|
|
|
2965
3050
|
// src/components/MinimizedBubble.tsx
|
|
2966
|
-
import { useContext as
|
|
3051
|
+
import { useContext as useContext7, useEffect as useEffect15, useRef as useRef8, useState as useState11 } from "react";
|
|
2967
3052
|
|
|
2968
3053
|
// src/hooks/useLauncherDrag.ts
|
|
2969
3054
|
import { useEffect as useEffect14, useRef as useRef7 } from "react";
|
|
@@ -3126,7 +3211,7 @@ function cn(...inputs) {
|
|
|
3126
3211
|
}
|
|
3127
3212
|
|
|
3128
3213
|
// src/components/AdoptionBubble.tsx
|
|
3129
|
-
import { jsx as
|
|
3214
|
+
import { jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
3130
3215
|
function AdoptionBubble({
|
|
3131
3216
|
goal,
|
|
3132
3217
|
onAttend,
|
|
@@ -3134,7 +3219,7 @@ function AdoptionBubble({
|
|
|
3134
3219
|
exitDelayMs = 0,
|
|
3135
3220
|
hidden = false
|
|
3136
3221
|
}) {
|
|
3137
|
-
return /* @__PURE__ */
|
|
3222
|
+
return /* @__PURE__ */ jsx5("div", {
|
|
3138
3223
|
style: {
|
|
3139
3224
|
animationDelay: `${appearDelayMs}ms`,
|
|
3140
3225
|
transitionDelay: hidden ? `${exitDelayMs}ms` : "0ms"
|
|
@@ -3145,18 +3230,18 @@ function AdoptionBubble({
|
|
|
3145
3230
|
onClick: () => onAttend(goal),
|
|
3146
3231
|
className: cn("skippr:flex skippr:max-w-72 skippr:items-center skippr:gap-2", "skippr:rounded-[14px] skippr:bg-amber-50 skippr:py-1.5 skippr:pr-3 skippr:pl-1.5", "skippr:text-left skippr:shadow-[0_8px_24px_rgba(0,0,0,0.18)]", "skippr:transition-colors skippr:cursor-pointer skippr:hover:bg-amber-100", "skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-bubble/60"),
|
|
3147
3232
|
children: [
|
|
3148
|
-
/* @__PURE__ */
|
|
3233
|
+
/* @__PURE__ */ jsx5("span", {
|
|
3149
3234
|
className: cn("skippr:flex skippr:h-6 skippr:w-6 skippr:shrink-0 skippr:items-center skippr:justify-center", "skippr:text-amber-700"),
|
|
3150
|
-
children: /* @__PURE__ */
|
|
3235
|
+
children: /* @__PURE__ */ jsx5(Lightbulb, {
|
|
3151
3236
|
className: "skippr:h-3.5 skippr:w-3.5",
|
|
3152
3237
|
fill: "currentColor"
|
|
3153
3238
|
})
|
|
3154
3239
|
}),
|
|
3155
|
-
/* @__PURE__ */
|
|
3240
|
+
/* @__PURE__ */ jsx5("span", {
|
|
3156
3241
|
className: "skippr:min-w-0 skippr:truncate skippr:text-[13px] skippr:font-semibold skippr:text-amber-950",
|
|
3157
3242
|
children: goal.displayMessage
|
|
3158
3243
|
}),
|
|
3159
|
-
/* @__PURE__ */
|
|
3244
|
+
/* @__PURE__ */ jsx5(ArrowRight, {
|
|
3160
3245
|
className: "skippr:h-3.5 skippr:w-3.5 skippr:shrink-0 skippr:text-amber-700"
|
|
3161
3246
|
})
|
|
3162
3247
|
]
|
|
@@ -3165,7 +3250,7 @@ function AdoptionBubble({
|
|
|
3165
3250
|
}
|
|
3166
3251
|
|
|
3167
3252
|
// src/components/ModulePill.tsx
|
|
3168
|
-
import { jsx as
|
|
3253
|
+
import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
3169
3254
|
var RING_RADIUS = 8;
|
|
3170
3255
|
var RING_CIRCUMFERENCE = 2 * Math.PI * RING_RADIUS;
|
|
3171
3256
|
function ModulePill({ module, onSelect }) {
|
|
@@ -3183,7 +3268,7 @@ function ModulePill({ module, onSelect }) {
|
|
|
3183
3268
|
className: "skippr:size-4 skippr:shrink-0 skippr:-rotate-90",
|
|
3184
3269
|
"aria-hidden": "true",
|
|
3185
3270
|
children: [
|
|
3186
|
-
/* @__PURE__ */
|
|
3271
|
+
/* @__PURE__ */ jsx6("circle", {
|
|
3187
3272
|
cx: "10",
|
|
3188
3273
|
cy: "10",
|
|
3189
3274
|
r: RING_RADIUS,
|
|
@@ -3191,7 +3276,7 @@ function ModulePill({ module, onSelect }) {
|
|
|
3191
3276
|
strokeWidth: "2.5",
|
|
3192
3277
|
className: "skippr:stroke-black/15"
|
|
3193
3278
|
}),
|
|
3194
|
-
/* @__PURE__ */
|
|
3279
|
+
/* @__PURE__ */ jsx6("circle", {
|
|
3195
3280
|
cx: "10",
|
|
3196
3281
|
cy: "10",
|
|
3197
3282
|
r: RING_RADIUS,
|
|
@@ -3204,7 +3289,7 @@ function ModulePill({ module, onSelect }) {
|
|
|
3204
3289
|
})
|
|
3205
3290
|
]
|
|
3206
3291
|
}),
|
|
3207
|
-
/* @__PURE__ */
|
|
3292
|
+
/* @__PURE__ */ jsx6("span", {
|
|
3208
3293
|
className: "skippr:min-w-0 skippr:flex-1 skippr:truncate skippr:text-left",
|
|
3209
3294
|
children: module.name
|
|
3210
3295
|
}),
|
|
@@ -3221,7 +3306,7 @@ function ModulePill({ module, onSelect }) {
|
|
|
3221
3306
|
}
|
|
3222
3307
|
|
|
3223
3308
|
// src/components/MinimizedBubble.tsx
|
|
3224
|
-
import { jsx as
|
|
3309
|
+
import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
3225
3310
|
var GOALS_AUTO_HIDE_MS = 1e4;
|
|
3226
3311
|
var GOAL_FADE_OUT_MS = 300;
|
|
3227
3312
|
var GOAL_APPEAR_STAGGER_MS = 150;
|
|
@@ -3229,17 +3314,17 @@ var GOAL_EXIT_STAGGER_MS = 250;
|
|
|
3229
3314
|
var MAX_GOAL_BUBBLES = 3;
|
|
3230
3315
|
var MAX_MODULE_PILLS = 3;
|
|
3231
3316
|
function SkipprMark({ onStart }) {
|
|
3232
|
-
return /* @__PURE__ */
|
|
3317
|
+
return /* @__PURE__ */ jsx7("button", {
|
|
3233
3318
|
type: "button",
|
|
3234
3319
|
onClick: onStart,
|
|
3235
3320
|
"aria-label": "Ask Me Anything",
|
|
3236
3321
|
className: "skippr:flex skippr:h-[36px] skippr:w-[36px] skippr:shrink-0 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:bg-transparent skippr:p-0",
|
|
3237
|
-
children: /* @__PURE__ */
|
|
3322
|
+
children: /* @__PURE__ */ jsx7("svg", {
|
|
3238
3323
|
viewBox: "0 0 15.4044 18.4853",
|
|
3239
3324
|
className: "skippr:h-[18.5px] skippr:w-[15.4px]",
|
|
3240
3325
|
fill: "none",
|
|
3241
3326
|
"aria-hidden": "true",
|
|
3242
|
-
children: /* @__PURE__ */
|
|
3327
|
+
children: /* @__PURE__ */ jsx7("path", {
|
|
3243
3328
|
d: "M2.25789 0.295419C1.33925 -0.413932 0 0.234459 0 1.38715V17.0972C0 18.4106 1.67407 18.987 2.49664 17.9562L6.40435 13.061C6.54853 12.8805 6.73209 12.7348 6.94126 12.6347C7.15043 12.5345 7.37978 12.4826 7.6121 12.4828H14.0025C15.3343 12.4828 15.9134 10.8128 14.8614 10.0037L2.25789 0.295419Z",
|
|
3244
3329
|
className: "skippr:fill-brand"
|
|
3245
3330
|
})
|
|
@@ -3251,7 +3336,7 @@ function ChatButton({
|
|
|
3251
3336
|
position,
|
|
3252
3337
|
onClick
|
|
3253
3338
|
}) {
|
|
3254
|
-
return /* @__PURE__ */
|
|
3339
|
+
return /* @__PURE__ */ jsx7("button", {
|
|
3255
3340
|
type: "button",
|
|
3256
3341
|
onClick,
|
|
3257
3342
|
"aria-label": "Open chat",
|
|
@@ -3263,9 +3348,9 @@ function ChatButton({
|
|
|
3263
3348
|
transform: revealed ? "scale(1)" : "scale(0.55)",
|
|
3264
3349
|
cursor: revealed ? "pointer" : "default"
|
|
3265
3350
|
},
|
|
3266
|
-
children: /* @__PURE__ */
|
|
3351
|
+
children: /* @__PURE__ */ jsx7("span", {
|
|
3267
3352
|
className: "skippr:flex skippr:h-[36px] skippr:w-[36px] skippr:items-center skippr:justify-center skippr:rounded-[11px] skippr:bg-white",
|
|
3268
|
-
children: /* @__PURE__ */
|
|
3353
|
+
children: /* @__PURE__ */ jsx7("svg", {
|
|
3269
3354
|
width: "18",
|
|
3270
3355
|
height: "18",
|
|
3271
3356
|
viewBox: "0 0 24 24",
|
|
@@ -3275,7 +3360,7 @@ function ChatButton({
|
|
|
3275
3360
|
strokeLinecap: "round",
|
|
3276
3361
|
strokeLinejoin: "round",
|
|
3277
3362
|
"aria-hidden": "true",
|
|
3278
|
-
children: /* @__PURE__ */
|
|
3363
|
+
children: /* @__PURE__ */ jsx7("path", {
|
|
3279
3364
|
d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"
|
|
3280
3365
|
})
|
|
3281
3366
|
})
|
|
@@ -3292,12 +3377,12 @@ function IdleLauncher({
|
|
|
3292
3377
|
className: cn("skippr:flex skippr:h-[48px] skippr:items-center", "skippr:bg-launcher skippr:p-1.5 skippr:shadow-[-6px_8px_30px_rgba(15,18,26,0.32)]", "skippr:[animation:skippr-orb-in_320ms_cubic-bezier(0.34,1.3,0.64,1)]", "skippr:transition-transform skippr:duration-[400ms] skippr:ease-[cubic-bezier(0.22,1,0.36,1)]", position === "right" ? "skippr:rounded-l-[18px] skippr:origin-right" : "skippr:rounded-r-[18px] skippr:origin-left", position === "right" ? isHovered ? "skippr:translate-x-3" : "skippr:translate-x-7" : isHovered ? "skippr:-translate-x-3" : "skippr:-translate-x-7"),
|
|
3293
3378
|
style: { gap: isHovered ? 8 : 0 },
|
|
3294
3379
|
children: [
|
|
3295
|
-
/* @__PURE__ */
|
|
3380
|
+
/* @__PURE__ */ jsx7(ChatButton, {
|
|
3296
3381
|
revealed: isHovered,
|
|
3297
3382
|
position,
|
|
3298
3383
|
onClick: onChat
|
|
3299
3384
|
}),
|
|
3300
|
-
/* @__PURE__ */
|
|
3385
|
+
/* @__PURE__ */ jsx7(SkipprMark, {
|
|
3301
3386
|
onStart
|
|
3302
3387
|
})
|
|
3303
3388
|
]
|
|
@@ -3321,7 +3406,7 @@ function WelcomeBubble({
|
|
|
3321
3406
|
"aria-label": "Dismiss",
|
|
3322
3407
|
children: [
|
|
3323
3408
|
message,
|
|
3324
|
-
/* @__PURE__ */
|
|
3409
|
+
/* @__PURE__ */ jsx7("span", {
|
|
3325
3410
|
className: cn("skippr:absolute skippr:size-2.5", "skippr:border-l skippr:border-t skippr:border-border skippr:bg-card", popsDown ? "skippr:bottom-full skippr:rotate-45 skippr:-mb-[5px]" : "skippr:top-full skippr:rotate-[225deg] skippr:-mt-[5px]", position === "right" ? "skippr:right-5" : "skippr:left-5")
|
|
3326
3411
|
})
|
|
3327
3412
|
]
|
|
@@ -3332,7 +3417,7 @@ function MinimizedBubble({
|
|
|
3332
3417
|
welcomeDismissed,
|
|
3333
3418
|
onDismissWelcome
|
|
3334
3419
|
}) {
|
|
3335
|
-
const ctx =
|
|
3420
|
+
const ctx = useContext7(LiveAgentContext);
|
|
3336
3421
|
if (!ctx) {
|
|
3337
3422
|
throw new Error("MinimizedBubble must be used within a <LiveAgent> provider");
|
|
3338
3423
|
}
|
|
@@ -3354,9 +3439,9 @@ function MinimizedBubble({
|
|
|
3354
3439
|
setSidebarTab,
|
|
3355
3440
|
commitLauncherDrop
|
|
3356
3441
|
} = ctx;
|
|
3357
|
-
const [goalsAutoHidden, setGoalsAutoHidden] =
|
|
3358
|
-
const [isLauncherHovered, setIsLauncherHovered] =
|
|
3359
|
-
const [visitHref, setVisitHref] =
|
|
3442
|
+
const [goalsAutoHidden, setGoalsAutoHidden] = useState11(false);
|
|
3443
|
+
const [isLauncherHovered, setIsLauncherHovered] = useState11(false);
|
|
3444
|
+
const [visitHref, setVisitHref] = useState11(() => window.location.href);
|
|
3360
3445
|
const revealedHrefRef = useRef8(null);
|
|
3361
3446
|
const hoverContainerRef = useRef8(null);
|
|
3362
3447
|
useEffect15(() => subscribeToLocationChange(() => setVisitHref(window.location.href)), []);
|
|
@@ -3396,7 +3481,7 @@ function MinimizedBubble({
|
|
|
3396
3481
|
}, [goalsEligible, visitHref]);
|
|
3397
3482
|
const matchedGoals = goalsEligible ? adoptionGoals.slice(0, MAX_GOAL_BUBBLES) : [];
|
|
3398
3483
|
const goalsHidden = goalsAutoHidden && !isLauncherHovered;
|
|
3399
|
-
const [goalsUnmounted, setGoalsUnmounted] =
|
|
3484
|
+
const [goalsUnmounted, setGoalsUnmounted] = useState11(false);
|
|
3400
3485
|
useEffect15(() => {
|
|
3401
3486
|
if (!goalsHidden) {
|
|
3402
3487
|
setGoalsUnmounted(false);
|
|
@@ -3431,7 +3516,7 @@ function MinimizedBubble({
|
|
|
3431
3516
|
(modulePills.length > 0 || visibleGoals.length > 0) && /* @__PURE__ */ jsxs4("div", {
|
|
3432
3517
|
className: cn("skippr:absolute skippr:gap-2", popsDown ? "skippr:top-full skippr:mt-3 skippr:flex skippr:flex-col-reverse" : "skippr:bottom-full skippr:mb-3 skippr:flex skippr:flex-col", position === "right" ? "skippr:right-0 skippr:items-end" : "skippr:left-0 skippr:items-start"),
|
|
3433
3518
|
children: [
|
|
3434
|
-
visibleGoals.map((goal, index2) => /* @__PURE__ */
|
|
3519
|
+
visibleGoals.map((goal, index2) => /* @__PURE__ */ jsx7(AdoptionBubble, {
|
|
3435
3520
|
goal,
|
|
3436
3521
|
onAttend: (attended) => {
|
|
3437
3522
|
if (!wasDraggedRef.current)
|
|
@@ -3441,7 +3526,7 @@ function MinimizedBubble({
|
|
|
3441
3526
|
exitDelayMs: (visibleGoals.length - 1 - index2) * GOAL_EXIT_STAGGER_MS,
|
|
3442
3527
|
hidden: goalsHidden
|
|
3443
3528
|
}, goal.goalId)),
|
|
3444
|
-
modulePills.map((module) => /* @__PURE__ */
|
|
3529
|
+
modulePills.map((module) => /* @__PURE__ */ jsx7(ModulePill, {
|
|
3445
3530
|
module,
|
|
3446
3531
|
onSelect: (id) => {
|
|
3447
3532
|
if (!wasDraggedRef.current)
|
|
@@ -3450,7 +3535,7 @@ function MinimizedBubble({
|
|
|
3450
3535
|
}, module.id))
|
|
3451
3536
|
]
|
|
3452
3537
|
}),
|
|
3453
|
-
welcomeMessage && !welcomeDismissed && adoptionGoals.length === 0 && modulePills.length === 0 && /* @__PURE__ */
|
|
3538
|
+
welcomeMessage && !welcomeDismissed && adoptionGoals.length === 0 && modulePills.length === 0 && /* @__PURE__ */ jsx7(WelcomeBubble, {
|
|
3454
3539
|
message: welcomeMessage,
|
|
3455
3540
|
position,
|
|
3456
3541
|
popsDown,
|
|
@@ -3460,7 +3545,7 @@ function MinimizedBubble({
|
|
|
3460
3545
|
onDismissWelcome();
|
|
3461
3546
|
}
|
|
3462
3547
|
}),
|
|
3463
|
-
/* @__PURE__ */
|
|
3548
|
+
/* @__PURE__ */ jsx7(IdleLauncher, {
|
|
3464
3549
|
position,
|
|
3465
3550
|
isHovered: isLauncherHovered,
|
|
3466
3551
|
onStart: launchDefaultSession,
|
|
@@ -3472,7 +3557,7 @@ function MinimizedBubble({
|
|
|
3472
3557
|
|
|
3473
3558
|
// src/components/PageActionHandler.tsx
|
|
3474
3559
|
import { useDataChannel as useDataChannel2 } from "@livekit/components-react/hooks";
|
|
3475
|
-
import { useCallback as
|
|
3560
|
+
import { useCallback as useCallback9, useEffect as useEffect16, useRef as useRef9 } from "react";
|
|
3476
3561
|
var STEP_MAX_WAIT_MS = 5000;
|
|
3477
3562
|
var POST_ACTION_SETTLE_SNAPSHOT_MS = 300;
|
|
3478
3563
|
var textDecoder2 = new TextDecoder;
|
|
@@ -3694,7 +3779,7 @@ function PageActionHandler() {
|
|
|
3694
3779
|
const drainingRef = useRef9(false);
|
|
3695
3780
|
const settleTimerRef = useRef9(null);
|
|
3696
3781
|
const endStepRef = useRef9(null);
|
|
3697
|
-
const runStep =
|
|
3782
|
+
const runStep = useCallback9((action) => {
|
|
3698
3783
|
return new Promise((resolve) => {
|
|
3699
3784
|
if (action.type === "scroll_page") {
|
|
3700
3785
|
let scrolled = false;
|
|
@@ -3763,7 +3848,7 @@ function PageActionHandler() {
|
|
|
3763
3848
|
});
|
|
3764
3849
|
});
|
|
3765
3850
|
}, []);
|
|
3766
|
-
const drain =
|
|
3851
|
+
const drain = useCallback9(async () => {
|
|
3767
3852
|
if (drainingRef.current)
|
|
3768
3853
|
return;
|
|
3769
3854
|
drainingRef.current = true;
|
|
@@ -3794,7 +3879,7 @@ function PageActionHandler() {
|
|
|
3794
3879
|
}
|
|
3795
3880
|
}
|
|
3796
3881
|
}, [runStep]);
|
|
3797
|
-
const onMessage =
|
|
3882
|
+
const onMessage = useCallback9((msg) => {
|
|
3798
3883
|
const action = parsePageAction(msg.payload);
|
|
3799
3884
|
if (!action)
|
|
3800
3885
|
return;
|
|
@@ -3829,25 +3914,25 @@ function PageActionHandler() {
|
|
|
3829
3914
|
}
|
|
3830
3915
|
|
|
3831
3916
|
// src/components/SessionControlBar.tsx
|
|
3832
|
-
import { useContext as
|
|
3917
|
+
import { useContext as useContext8, useEffect as useEffect20 } from "react";
|
|
3833
3918
|
|
|
3834
3919
|
// src/hooks/useActionControl.ts
|
|
3835
|
-
import { useLocalParticipant as
|
|
3836
|
-
import { useCallback as
|
|
3837
|
-
var
|
|
3920
|
+
import { useLocalParticipant as useLocalParticipant5 } from "@livekit/components-react/hooks";
|
|
3921
|
+
import { useCallback as useCallback10, useEffect as useEffect17, useState as useState12 } from "react";
|
|
3922
|
+
var textEncoder5 = new TextEncoder;
|
|
3838
3923
|
function useActionControl() {
|
|
3839
|
-
const { localParticipant } =
|
|
3924
|
+
const { localParticipant } = useLocalParticipant5();
|
|
3840
3925
|
const plan = usePlanUpdates();
|
|
3841
|
-
const [busy, setBusy] =
|
|
3842
|
-
const [actionsPaused2, setPaused] =
|
|
3926
|
+
const [busy, setBusy] = useState12(isActionsBusy);
|
|
3927
|
+
const [actionsPaused2, setPaused] = useState12(false);
|
|
3843
3928
|
useEffect17(() => subscribeActionsBusy(setBusy), []);
|
|
3844
3929
|
const actionsActive = busy || plan?.state === "executing";
|
|
3845
|
-
const togglePaused =
|
|
3930
|
+
const togglePaused = useCallback10(async () => {
|
|
3846
3931
|
const next = !actionsPaused2;
|
|
3847
3932
|
setPaused(next);
|
|
3848
3933
|
setActionsPaused(next);
|
|
3849
3934
|
try {
|
|
3850
|
-
await localParticipant.publishData(
|
|
3935
|
+
await localParticipant.publishData(textEncoder5.encode(JSON.stringify({ type: next ? "pause" : "resume" })), { reliable: true, topic: ACTION_CONTROL_TOPIC });
|
|
3851
3936
|
} catch (error) {
|
|
3852
3937
|
console.error("Failed to send action pause/resume:", error);
|
|
3853
3938
|
}
|
|
@@ -3868,12 +3953,12 @@ function useAgentVoiceState() {
|
|
|
3868
3953
|
}
|
|
3869
3954
|
|
|
3870
3955
|
// src/hooks/useAudioLevelBars.ts
|
|
3871
|
-
import { useEffect as useEffect18, useRef as useRef10, useState as
|
|
3956
|
+
import { useEffect as useEffect18, useRef as useRef10, useState as useState13 } from "react";
|
|
3872
3957
|
var TALKING_LEVEL_THRESHOLD = 0.2;
|
|
3873
3958
|
var TALKING_HOLD_MS = 400;
|
|
3874
3959
|
function useAudioLevelBars(mediaStreamTrack, { barCount, idleHeightPx, maxGrowthPx, noiseGate }) {
|
|
3875
3960
|
const barRefs = useRef10([]);
|
|
3876
|
-
const [isTalking, setIsTalking] =
|
|
3961
|
+
const [isTalking, setIsTalking] = useState13(false);
|
|
3877
3962
|
useEffect18(() => {
|
|
3878
3963
|
if (!mediaStreamTrack) {
|
|
3879
3964
|
for (const bar of barRefs.current) {
|
|
@@ -3924,27 +4009,82 @@ function useAudioLevelBars(mediaStreamTrack, { barCount, idleHeightPx, maxGrowth
|
|
|
3924
4009
|
return { barRefs, isTalking };
|
|
3925
4010
|
}
|
|
3926
4011
|
|
|
4012
|
+
// src/hooks/useIdleAutoPause.ts
|
|
4013
|
+
import { useCallback as useCallback11, useEffect as useEffect19, useRef as useRef11 } from "react";
|
|
4014
|
+
function useIdleAutoPause({
|
|
4015
|
+
enabled,
|
|
4016
|
+
active,
|
|
4017
|
+
isHeld,
|
|
4018
|
+
pause
|
|
4019
|
+
}) {
|
|
4020
|
+
const timerRef = useRef11(null);
|
|
4021
|
+
const pauseRef = useRef11(pause);
|
|
4022
|
+
pauseRef.current = pause;
|
|
4023
|
+
const clearTimer = useCallback11(() => {
|
|
4024
|
+
if (timerRef.current) {
|
|
4025
|
+
clearTimeout(timerRef.current);
|
|
4026
|
+
timerRef.current = null;
|
|
4027
|
+
}
|
|
4028
|
+
}, []);
|
|
4029
|
+
const armTimer = useCallback11(() => {
|
|
4030
|
+
clearTimer();
|
|
4031
|
+
timerRef.current = setTimeout(() => pauseRef.current(), IDLE_AUTO_PAUSE_MS);
|
|
4032
|
+
}, [clearTimer]);
|
|
4033
|
+
const reportActivity = useCallback11(() => {
|
|
4034
|
+
if (enabled && !isHeld)
|
|
4035
|
+
armTimer();
|
|
4036
|
+
}, [enabled, isHeld, armTimer]);
|
|
4037
|
+
useEffect19(() => {
|
|
4038
|
+
if (!enabled || isHeld || active) {
|
|
4039
|
+
clearTimer();
|
|
4040
|
+
return;
|
|
4041
|
+
}
|
|
4042
|
+
armTimer();
|
|
4043
|
+
return clearTimer;
|
|
4044
|
+
}, [enabled, isHeld, active, armTimer, clearTimer]);
|
|
4045
|
+
return { reportActivity };
|
|
4046
|
+
}
|
|
4047
|
+
|
|
4048
|
+
// src/hooks/useLiveUserTranscript.ts
|
|
4049
|
+
import { useLocalParticipant as useLocalParticipant6 } from "@livekit/components-react/hooks";
|
|
4050
|
+
import { useRef as useRef12 } from "react";
|
|
4051
|
+
function useLiveUserTranscript(active) {
|
|
4052
|
+
const transcriptions = useSharedTranscriptions();
|
|
4053
|
+
const { localParticipant } = useLocalParticipant6();
|
|
4054
|
+
const localIdentity = localParticipant.identity;
|
|
4055
|
+
const priorStreamIdsRef = useRef12(new Set);
|
|
4056
|
+
const wasActiveRef = useRef12(false);
|
|
4057
|
+
const userStreams = transcriptions.filter((stream) => stream.participantInfo.identity === localIdentity);
|
|
4058
|
+
if (active && !wasActiveRef.current) {
|
|
4059
|
+
priorStreamIdsRef.current = new Set(userStreams.map((s) => s.streamInfo.id));
|
|
4060
|
+
}
|
|
4061
|
+
wasActiveRef.current = active;
|
|
4062
|
+
if (!active)
|
|
4063
|
+
return "";
|
|
4064
|
+
return userStreams.filter((stream) => !priorStreamIdsRef.current.has(stream.streamInfo.id)).map((stream) => stream.text.trim()).filter((text) => text.length > 0).join(" ");
|
|
4065
|
+
}
|
|
4066
|
+
|
|
3927
4067
|
// src/hooks/useMediaControls.ts
|
|
3928
|
-
import { useLocalParticipant as
|
|
4068
|
+
import { useLocalParticipant as useLocalParticipant7 } from "@livekit/components-react/hooks";
|
|
3929
4069
|
import { ScreenSharePresets as ScreenSharePresets2 } from "livekit-client";
|
|
3930
|
-
import { useCallback as
|
|
4070
|
+
import { useCallback as useCallback12 } from "react";
|
|
3931
4071
|
var SCREEN_SHARE_OPTIONS = {
|
|
3932
4072
|
video: { displaySurface: "browser" },
|
|
3933
4073
|
resolution: ScreenSharePresets2.h720fps30.resolution,
|
|
3934
4074
|
contentHint: "detail"
|
|
3935
4075
|
};
|
|
3936
4076
|
function useMediaControls() {
|
|
3937
|
-
const { localParticipant } =
|
|
4077
|
+
const { localParticipant } = useLocalParticipant7();
|
|
3938
4078
|
const isMuted = !localParticipant.isMicrophoneEnabled;
|
|
3939
4079
|
const isScreenSharing = localParticipant.isScreenShareEnabled;
|
|
3940
|
-
const toggleMute =
|
|
4080
|
+
const toggleMute = useCallback12(async () => {
|
|
3941
4081
|
try {
|
|
3942
4082
|
await localParticipant.setMicrophoneEnabled(isMuted);
|
|
3943
4083
|
} catch (error) {
|
|
3944
4084
|
console.error("Failed to toggle microphone:", error);
|
|
3945
4085
|
}
|
|
3946
4086
|
}, [localParticipant, isMuted]);
|
|
3947
|
-
const toggleScreenShare =
|
|
4087
|
+
const toggleScreenShare = useCallback12(async () => {
|
|
3948
4088
|
try {
|
|
3949
4089
|
await localParticipant.setScreenShareEnabled(!isScreenSharing, SCREEN_SHARE_OPTIONS);
|
|
3950
4090
|
} catch (error) {
|
|
@@ -3955,13 +4095,13 @@ function useMediaControls() {
|
|
|
3955
4095
|
}
|
|
3956
4096
|
|
|
3957
4097
|
// src/hooks/useMicLevel.ts
|
|
3958
|
-
import { useLocalParticipant as
|
|
4098
|
+
import { useLocalParticipant as useLocalParticipant8 } from "@livekit/components-react/hooks";
|
|
3959
4099
|
var MIC_BARS = 5;
|
|
3960
4100
|
var IDLE_BAR_HEIGHT_PX = 5;
|
|
3961
4101
|
var MAX_BAR_GROWTH_PX = 17;
|
|
3962
4102
|
var MIC_NOISE_GATE = 0.15;
|
|
3963
4103
|
function useMicLevel(enabled) {
|
|
3964
|
-
const { microphoneTrack } =
|
|
4104
|
+
const { microphoneTrack } = useLocalParticipant8();
|
|
3965
4105
|
const mediaStreamTrack = microphoneTrack?.track?.mediaStreamTrack;
|
|
3966
4106
|
return useAudioLevelBars(enabled ? mediaStreamTrack : undefined, {
|
|
3967
4107
|
barCount: MIC_BARS,
|
|
@@ -3994,8 +4134,49 @@ function PausedCountdown({ secondsRemaining }) {
|
|
|
3994
4134
|
});
|
|
3995
4135
|
}
|
|
3996
4136
|
|
|
4137
|
+
// src/components/TapToTalkMic.tsx
|
|
4138
|
+
import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
4139
|
+
function TapToTalkMic({ isCapturingSpeech, showLabel, onToggle }) {
|
|
4140
|
+
const { barRefs, isTalking } = useMicLevel(isCapturingSpeech);
|
|
4141
|
+
const label = isCapturingSpeech ? "Tap to send" : "Tap to talk";
|
|
4142
|
+
const withLabel = isCapturingSpeech || showLabel;
|
|
4143
|
+
return /* @__PURE__ */ jsxs6("button", {
|
|
4144
|
+
type: "button",
|
|
4145
|
+
onClick: onToggle,
|
|
4146
|
+
"aria-label": "Tap to talk",
|
|
4147
|
+
"aria-pressed": isCapturingSpeech,
|
|
4148
|
+
title: label,
|
|
4149
|
+
className: cn("skippr:flex skippr:h-[38px] skippr:shrink-0 skippr:items-center skippr:justify-center skippr:gap-2 skippr:rounded-full skippr:bg-bubble skippr:text-white skippr:cursor-pointer", withLabel ? "skippr:px-3.5" : "skippr:w-[38px]", isCapturingSpeech ? "skippr:animate-skippr-rec-ring skippr:motion-reduce:animate-none" : "skippr:hover:bg-[#3a384b]"),
|
|
4150
|
+
children: [
|
|
4151
|
+
/* @__PURE__ */ jsx8("span", {
|
|
4152
|
+
className: "skippr:flex skippr:shrink-0 skippr:items-center skippr:justify-center",
|
|
4153
|
+
children: isCapturingSpeech ? /* @__PURE__ */ jsx8(Square, {
|
|
4154
|
+
className: "skippr:size-4 skippr:text-brand",
|
|
4155
|
+
fill: "currentColor"
|
|
4156
|
+
}) : /* @__PURE__ */ jsx8(Mic, {
|
|
4157
|
+
className: "skippr:size-5"
|
|
4158
|
+
})
|
|
4159
|
+
}),
|
|
4160
|
+
withLabel && /* @__PURE__ */ jsx8("span", {
|
|
4161
|
+
className: "skippr:whitespace-nowrap skippr:text-[13px] skippr:font-medium",
|
|
4162
|
+
children: label
|
|
4163
|
+
}),
|
|
4164
|
+
isCapturingSpeech && isTalking && /* @__PURE__ */ jsx8("span", {
|
|
4165
|
+
className: "skippr:flex skippr:h-6 skippr:shrink-0 skippr:items-center skippr:gap-[3px]",
|
|
4166
|
+
children: Array.from({ length: MIC_BARS }).map((_, index2) => /* @__PURE__ */ jsx8("span", {
|
|
4167
|
+
ref: (el) => {
|
|
4168
|
+
barRefs.current[index2] = el;
|
|
4169
|
+
},
|
|
4170
|
+
className: "skippr:w-[3px] skippr:rounded-full skippr:bg-white skippr:transition-[height] skippr:duration-75",
|
|
4171
|
+
style: { height: 5 }
|
|
4172
|
+
}, index2))
|
|
4173
|
+
})
|
|
4174
|
+
]
|
|
4175
|
+
});
|
|
4176
|
+
}
|
|
4177
|
+
|
|
3997
4178
|
// src/components/SessionControlBar.tsx
|
|
3998
|
-
import { jsx as
|
|
4179
|
+
import { jsx as jsx9, jsxs as jsxs7, Fragment } from "react/jsx-runtime";
|
|
3999
4180
|
var STANDBY_BAR_WIDTH = 168;
|
|
4000
4181
|
var READY_BAR_WIDTH = 238;
|
|
4001
4182
|
var PAUSED_BAR_WIDTH = 248;
|
|
@@ -4028,21 +4209,21 @@ function AgentActivity({
|
|
|
4028
4209
|
noiseGate: AGENT_NOISE_GATE
|
|
4029
4210
|
});
|
|
4030
4211
|
const label = isActing ? "Working" : AGENT_STATE_LABELS[state] ?? "";
|
|
4031
|
-
return /* @__PURE__ */
|
|
4212
|
+
return /* @__PURE__ */ jsxs7("span", {
|
|
4032
4213
|
role: "status",
|
|
4033
4214
|
className: "skippr:flex skippr:items-center skippr:gap-1.5 skippr:text-bubble",
|
|
4034
4215
|
"aria-label": isActing ? "Agent is acting" : `Agent is ${state}`,
|
|
4035
4216
|
children: [
|
|
4036
|
-
/* @__PURE__ */
|
|
4217
|
+
/* @__PURE__ */ jsx9("span", {
|
|
4037
4218
|
className: "skippr:flex skippr:size-5 skippr:shrink-0 skippr:items-center skippr:justify-center",
|
|
4038
|
-
children: isActing ? /* @__PURE__ */
|
|
4219
|
+
children: isActing ? /* @__PURE__ */ jsx9(MousePointerClick, {
|
|
4039
4220
|
strokeWidth: 2,
|
|
4040
4221
|
className: "skippr:size-5 skippr:[animation:skippr-finger-tap_1.1s_ease-in-out_infinite]"
|
|
4041
|
-
}) : /* @__PURE__ */
|
|
4222
|
+
}) : /* @__PURE__ */ jsxs7(Fragment, {
|
|
4042
4223
|
children: [
|
|
4043
|
-
state === "speaking" && /* @__PURE__ */
|
|
4224
|
+
state === "speaking" && /* @__PURE__ */ jsx9("span", {
|
|
4044
4225
|
className: "skippr:flex skippr:h-5 skippr:items-center skippr:gap-[2px]",
|
|
4045
|
-
children: Array.from({ length: AGENT_BARS }).map((_, index2) => /* @__PURE__ */
|
|
4226
|
+
children: Array.from({ length: AGENT_BARS }).map((_, index2) => /* @__PURE__ */ jsx9("span", {
|
|
4046
4227
|
ref: (el) => {
|
|
4047
4228
|
barRefs.current[index2] = el;
|
|
4048
4229
|
},
|
|
@@ -4050,21 +4231,21 @@ function AgentActivity({
|
|
|
4050
4231
|
style: { height: AGENT_BAR_IDLE_HEIGHT_PX }
|
|
4051
4232
|
}, index2))
|
|
4052
4233
|
}),
|
|
4053
|
-
state === "thinking" && /* @__PURE__ */
|
|
4234
|
+
state === "thinking" && /* @__PURE__ */ jsxs7("span", {
|
|
4054
4235
|
className: "skippr:flex skippr:items-center skippr:gap-[3px]",
|
|
4055
4236
|
children: [
|
|
4056
|
-
/* @__PURE__ */
|
|
4237
|
+
/* @__PURE__ */ jsx9("span", {
|
|
4057
4238
|
className: "skippr:size-[5px] skippr:rounded-full skippr:bg-current skippr:animate-bounce skippr:[animation-delay:0ms]"
|
|
4058
4239
|
}),
|
|
4059
|
-
/* @__PURE__ */
|
|
4240
|
+
/* @__PURE__ */ jsx9("span", {
|
|
4060
4241
|
className: "skippr:size-[5px] skippr:rounded-full skippr:bg-current skippr:animate-bounce skippr:[animation-delay:150ms]"
|
|
4061
4242
|
}),
|
|
4062
|
-
/* @__PURE__ */
|
|
4243
|
+
/* @__PURE__ */ jsx9("span", {
|
|
4063
4244
|
className: "skippr:size-[5px] skippr:rounded-full skippr:bg-current skippr:animate-bounce skippr:[animation-delay:300ms]"
|
|
4064
4245
|
})
|
|
4065
4246
|
]
|
|
4066
4247
|
}),
|
|
4067
|
-
state === "listening" && /* @__PURE__ */
|
|
4248
|
+
state === "listening" && /* @__PURE__ */ jsxs7("svg", {
|
|
4068
4249
|
viewBox: "0 0 24 24",
|
|
4069
4250
|
className: "skippr:size-5",
|
|
4070
4251
|
fill: "none",
|
|
@@ -4074,10 +4255,10 @@ function AgentActivity({
|
|
|
4074
4255
|
strokeLinejoin: "round",
|
|
4075
4256
|
"aria-hidden": "true",
|
|
4076
4257
|
children: [
|
|
4077
|
-
/* @__PURE__ */
|
|
4258
|
+
/* @__PURE__ */ jsx9("path", {
|
|
4078
4259
|
d: "M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z"
|
|
4079
4260
|
}),
|
|
4080
|
-
/* @__PURE__ */
|
|
4261
|
+
/* @__PURE__ */ jsx9("circle", {
|
|
4081
4262
|
cx: "12",
|
|
4082
4263
|
cy: "12",
|
|
4083
4264
|
r: "2.5",
|
|
@@ -4090,7 +4271,7 @@ function AgentActivity({
|
|
|
4090
4271
|
]
|
|
4091
4272
|
})
|
|
4092
4273
|
}),
|
|
4093
|
-
/* @__PURE__ */
|
|
4274
|
+
/* @__PURE__ */ jsx9("span", {
|
|
4094
4275
|
className: "skippr:text-[11px] skippr:font-medium skippr:capitalize",
|
|
4095
4276
|
children: label
|
|
4096
4277
|
})
|
|
@@ -4108,9 +4289,10 @@ function SessionControlBar() {
|
|
|
4108
4289
|
setSidebarTab,
|
|
4109
4290
|
activeModule,
|
|
4110
4291
|
position,
|
|
4111
|
-
variant
|
|
4292
|
+
variant,
|
|
4293
|
+
agentControls
|
|
4112
4294
|
} = useLiveAgent();
|
|
4113
|
-
const internalCtx =
|
|
4295
|
+
const internalCtx = useContext8(LiveAgentContext);
|
|
4114
4296
|
if (!internalCtx) {
|
|
4115
4297
|
throw new Error("SessionControlBar must be used within a <LiveAgent> provider");
|
|
4116
4298
|
}
|
|
@@ -4130,7 +4312,20 @@ function SessionControlBar() {
|
|
|
4130
4312
|
const { state, mediaStreamTrack: agentMediaStreamTrack } = useAgentVoiceState();
|
|
4131
4313
|
const { actionsActive, actionsPaused: actionsPaused2, togglePaused } = useActionControl();
|
|
4132
4314
|
const { isHeld, countdown, toggle: togglePause } = useSessionHoldContext();
|
|
4133
|
-
|
|
4315
|
+
const tapToTalk = agentControls?.tapToTalk === true;
|
|
4316
|
+
const agentActive = state === "speaking" || state === "thinking";
|
|
4317
|
+
const { isCapturingSpeech, toggle: toggleTapToTalk } = useTapToTalkContext();
|
|
4318
|
+
const liveUserTranscript = useLiveUserTranscript(isCapturingSpeech);
|
|
4319
|
+
const { reportActivity } = useIdleAutoPause({
|
|
4320
|
+
enabled: tapToTalk,
|
|
4321
|
+
active: agentActive || isCapturingSpeech,
|
|
4322
|
+
isHeld,
|
|
4323
|
+
pause: () => {
|
|
4324
|
+
if (!isHeld)
|
|
4325
|
+
togglePause();
|
|
4326
|
+
}
|
|
4327
|
+
});
|
|
4328
|
+
useEffect20(() => {
|
|
4134
4329
|
if (isHeld)
|
|
4135
4330
|
minimizePanel();
|
|
4136
4331
|
}, [isHeld, minimizePanel]);
|
|
@@ -4138,6 +4333,7 @@ function SessionControlBar() {
|
|
|
4138
4333
|
const { barRefs, isTalking } = useMicLevel(isReady && !isMuted && !textMode && !isHeld);
|
|
4139
4334
|
const showScreenShareToggle = captureMode === CAPTURE_MODE.Screenshare;
|
|
4140
4335
|
const showActionControl = captureMode === CAPTURE_MODE.Auto && actionsActive;
|
|
4336
|
+
const tapToTalkAgentBusy = agentActive || showActionControl && !actionsPaused2;
|
|
4141
4337
|
const screenShareExtra = showScreenShareToggle ? SCREEN_SHARE_EXTRA_WIDTH : 0;
|
|
4142
4338
|
const actionControlExtra = showActionControl ? ACTION_CONTROL_EXTRA_WIDTH : 0;
|
|
4143
4339
|
let barWidth = STANDBY_BAR_WIDTH;
|
|
@@ -4164,103 +4360,131 @@ function SessionControlBar() {
|
|
|
4164
4360
|
return;
|
|
4165
4361
|
action();
|
|
4166
4362
|
};
|
|
4167
|
-
const panelToggleButton = /* @__PURE__ */
|
|
4363
|
+
const panelToggleButton = /* @__PURE__ */ jsx9("button", {
|
|
4168
4364
|
type: "button",
|
|
4169
4365
|
onClick: ifNotDragged(togglePanel),
|
|
4170
4366
|
"aria-label": isPanelOpen ? "Close panel" : agendaModule && !textMode ? "Open agenda" : "Open chat",
|
|
4171
4367
|
className: cn(SQUARE_BUTTON, "skippr:text-neutral-700", textMode ? "skippr:hover:bg-neutral-100" : "skippr:bg-neutral-100 skippr:hover:bg-neutral-200"),
|
|
4172
|
-
children: /* @__PURE__ */
|
|
4368
|
+
children: /* @__PURE__ */ jsx9(MessageSquare, {
|
|
4173
4369
|
className: "skippr:size-5"
|
|
4174
4370
|
})
|
|
4175
4371
|
});
|
|
4176
|
-
return /* @__PURE__ */
|
|
4372
|
+
return /* @__PURE__ */ jsxs7("div", {
|
|
4177
4373
|
ref: controlBarRef,
|
|
4178
4374
|
style: { bottom: launcherBottomPx },
|
|
4179
4375
|
className: cn("skippr:fixed skippr:z-[9999] skippr:touch-none skippr:cursor-grab", position === "right" ? "skippr:right-3" : "skippr:left-3"),
|
|
4180
4376
|
children: [
|
|
4181
|
-
/* @__PURE__ */
|
|
4182
|
-
|
|
4377
|
+
isCapturingSpeech && !isPanelOpen && /* @__PURE__ */ jsx9("div", {
|
|
4378
|
+
className: cn("skippr:absolute skippr:bottom-full skippr:z-[10000] skippr:mb-2 skippr:max-w-[280px] skippr:rounded-[14px] skippr:bg-bubble skippr:px-3.5 skippr:py-2 skippr:text-[13px] skippr:text-white skippr:shadow-[0_10px_32px_rgba(0,0,0,0.18)] skippr:[animation:skippr-agent-in_200ms_ease-out]", position === "right" ? "skippr:right-0" : "skippr:left-0"),
|
|
4379
|
+
children: liveUserTranscript ? liveUserTranscript : /* @__PURE__ */ jsx9("span", {
|
|
4380
|
+
className: "skippr:text-white/60",
|
|
4381
|
+
children: "Listening…"
|
|
4382
|
+
})
|
|
4383
|
+
}),
|
|
4384
|
+
/* @__PURE__ */ jsxs7("div", {
|
|
4385
|
+
style: { width: isReady && tapToTalk ? "auto" : barWidth },
|
|
4183
4386
|
className: cn("skippr:group skippr:relative skippr:flex skippr:h-[54px] skippr:items-center skippr:justify-center skippr:gap-2", "skippr:rounded-[20px] skippr:bg-white skippr:p-2", "skippr:shadow-[0_10px_32px_rgba(0,0,0,0.18)] skippr:ring-1 skippr:ring-black/5", "skippr:transition-[width,margin] skippr:duration-300 skippr:ease-out", "skippr:[animation:skippr-toolset-pop_440ms_cubic-bezier(0.22,1,0.36,1)]", isReady && (position === "right" ? "skippr:mr-7" : "skippr:ml-7")),
|
|
4184
4387
|
children: [
|
|
4185
|
-
!isReady && /* @__PURE__ */
|
|
4388
|
+
!isReady && /* @__PURE__ */ jsxs7("span", {
|
|
4186
4389
|
className: "skippr:flex skippr:h-[38px] skippr:items-center skippr:justify-center skippr:gap-2 skippr:text-[13px] skippr:font-medium skippr:text-bubble skippr:[animation:skippr-stage-fade_240ms_ease-out]",
|
|
4187
4390
|
children: [
|
|
4188
|
-
/* @__PURE__ */
|
|
4391
|
+
/* @__PURE__ */ jsxs7("span", {
|
|
4189
4392
|
className: "skippr:flex skippr:items-center skippr:gap-[3px]",
|
|
4190
4393
|
children: [
|
|
4191
|
-
/* @__PURE__ */
|
|
4394
|
+
/* @__PURE__ */ jsx9("span", {
|
|
4192
4395
|
className: "skippr:size-1.5 skippr:rounded-full skippr:bg-bubble skippr:animate-bounce skippr:[animation-delay:0ms]"
|
|
4193
4396
|
}),
|
|
4194
|
-
/* @__PURE__ */
|
|
4397
|
+
/* @__PURE__ */ jsx9("span", {
|
|
4195
4398
|
className: "skippr:size-1.5 skippr:rounded-full skippr:bg-bubble skippr:animate-bounce skippr:[animation-delay:150ms]"
|
|
4196
4399
|
}),
|
|
4197
|
-
/* @__PURE__ */
|
|
4400
|
+
/* @__PURE__ */ jsx9("span", {
|
|
4198
4401
|
className: "skippr:size-1.5 skippr:rounded-full skippr:bg-bubble skippr:animate-bounce skippr:[animation-delay:300ms]"
|
|
4199
4402
|
})
|
|
4200
4403
|
]
|
|
4201
4404
|
}),
|
|
4202
|
-
/* @__PURE__ */
|
|
4405
|
+
/* @__PURE__ */ jsx9("span", {
|
|
4203
4406
|
children: "Standing by…"
|
|
4204
4407
|
})
|
|
4205
4408
|
]
|
|
4206
4409
|
}),
|
|
4207
|
-
isReady && /* @__PURE__ */
|
|
4410
|
+
isReady && /* @__PURE__ */ jsxs7("div", {
|
|
4208
4411
|
className: cn("skippr:flex skippr:items-center skippr:gap-2 skippr:[animation:skippr-stage-fade_240ms_ease-out]", isHeld && "skippr:w-full skippr:justify-start"),
|
|
4209
4412
|
children: [
|
|
4210
|
-
/* @__PURE__ */
|
|
4413
|
+
/* @__PURE__ */ jsx9("button", {
|
|
4211
4414
|
type: "button",
|
|
4212
4415
|
onClick: ifNotDragged(togglePause),
|
|
4213
4416
|
"aria-label": isHeld ? "Resume" : "Pause",
|
|
4214
4417
|
title: isHeld ? "Resume" : "Pause",
|
|
4215
4418
|
className: cn(SQUARE_BUTTON, isHeld ? "skippr:bg-bubble skippr:text-white skippr:hover:bg-[#3a384b]" : "skippr:bg-neutral-100 skippr:text-neutral-700 skippr:hover:bg-neutral-200"),
|
|
4216
|
-
children: isHeld ? /* @__PURE__ */
|
|
4419
|
+
children: isHeld ? /* @__PURE__ */ jsx9(Play, {
|
|
4217
4420
|
className: "skippr:size-5",
|
|
4218
4421
|
fill: "currentColor"
|
|
4219
|
-
}) : /* @__PURE__ */
|
|
4422
|
+
}) : /* @__PURE__ */ jsx9(Pause, {
|
|
4220
4423
|
className: "skippr:size-5",
|
|
4221
4424
|
fill: "currentColor"
|
|
4222
4425
|
})
|
|
4223
4426
|
}),
|
|
4224
|
-
isHeld ? /* @__PURE__ */
|
|
4427
|
+
isHeld ? /* @__PURE__ */ jsxs7(Fragment, {
|
|
4225
4428
|
children: [
|
|
4226
|
-
/* @__PURE__ */
|
|
4429
|
+
/* @__PURE__ */ jsx9(PausedCountdown, {
|
|
4227
4430
|
secondsRemaining: countdown
|
|
4228
4431
|
}),
|
|
4229
4432
|
panelToggleButton
|
|
4230
4433
|
]
|
|
4231
|
-
}) : /* @__PURE__ */
|
|
4434
|
+
}) : /* @__PURE__ */ jsxs7(Fragment, {
|
|
4232
4435
|
children: [
|
|
4233
|
-
!textMode && /* @__PURE__ */
|
|
4436
|
+
!textMode && tapToTalk && /* @__PURE__ */ jsxs7("div", {
|
|
4437
|
+
className: "skippr:flex skippr:h-[38px] skippr:items-center skippr:gap-2",
|
|
4438
|
+
children: [
|
|
4439
|
+
/* @__PURE__ */ jsx9(TapToTalkMic, {
|
|
4440
|
+
isCapturingSpeech,
|
|
4441
|
+
showLabel: !tapToTalkAgentBusy,
|
|
4442
|
+
onToggle: () => {
|
|
4443
|
+
toggleTapToTalk();
|
|
4444
|
+
reportActivity();
|
|
4445
|
+
}
|
|
4446
|
+
}),
|
|
4447
|
+
tapToTalkAgentBusy && /* @__PURE__ */ jsx9("span", {
|
|
4448
|
+
className: "skippr:flex skippr:items-center skippr:[animation:skippr-agent-in_200ms_ease-out_240ms_both]",
|
|
4449
|
+
children: /* @__PURE__ */ jsx9(AgentActivity, {
|
|
4450
|
+
state,
|
|
4451
|
+
isActing: showActionControl && !actionsPaused2,
|
|
4452
|
+
mediaStreamTrack: agentMediaStreamTrack
|
|
4453
|
+
})
|
|
4454
|
+
})
|
|
4455
|
+
]
|
|
4456
|
+
}),
|
|
4457
|
+
!textMode && !tapToTalk && /* @__PURE__ */ jsxs7("div", {
|
|
4234
4458
|
className: "skippr:relative skippr:h-[38px]",
|
|
4235
4459
|
style: { width: MIC_REGION_WIDTH },
|
|
4236
4460
|
children: [
|
|
4237
|
-
!isTalking && /* @__PURE__ */
|
|
4461
|
+
!isTalking && /* @__PURE__ */ jsx9("span", {
|
|
4238
4462
|
className: "skippr:absolute skippr:inset-y-0 skippr:right-0 skippr:flex skippr:items-center skippr:justify-center skippr:[animation:skippr-agent-in_200ms_ease-out_240ms_both]",
|
|
4239
4463
|
style: { width: AGENT_ACTIVITY_WIDTH },
|
|
4240
|
-
children: /* @__PURE__ */
|
|
4464
|
+
children: /* @__PURE__ */ jsx9(AgentActivity, {
|
|
4241
4465
|
state,
|
|
4242
4466
|
isActing: showActionControl && !actionsPaused2,
|
|
4243
4467
|
mediaStreamTrack: agentMediaStreamTrack
|
|
4244
4468
|
})
|
|
4245
4469
|
}),
|
|
4246
|
-
/* @__PURE__ */
|
|
4470
|
+
/* @__PURE__ */ jsxs7("button", {
|
|
4247
4471
|
type: "button",
|
|
4248
4472
|
onClick: ifNotDragged(() => void toggleMute()),
|
|
4249
4473
|
"aria-label": isMuted ? "Unmute" : "Mute",
|
|
4250
4474
|
className: cn("skippr:group skippr:absolute skippr:top-0 skippr:left-0 skippr:z-10 skippr:flex skippr:h-[38px] skippr:items-center skippr:gap-2.5 skippr:overflow-hidden skippr:rounded-[12px] skippr:bg-bubble skippr:text-white skippr:cursor-pointer skippr:transition-[width] skippr:duration-300 skippr:ease-out", isTalking ? "skippr:justify-start skippr:pl-3.5" : "skippr:justify-center"),
|
|
4251
4475
|
style: { width: isTalking ? MIC_REGION_WIDTH : MIC_SQUARE_WIDTH },
|
|
4252
4476
|
children: [
|
|
4253
|
-
/* @__PURE__ */
|
|
4477
|
+
/* @__PURE__ */ jsx9("span", {
|
|
4254
4478
|
className: cn("skippr:flex skippr:shrink-0 skippr:items-center skippr:justify-center skippr:transition-colors", isMuted ? "skippr:text-red-400 skippr:group-hover:text-red-300" : "skippr:text-white skippr:group-hover:text-white/80"),
|
|
4255
|
-
children: isMuted ? /* @__PURE__ */
|
|
4479
|
+
children: isMuted ? /* @__PURE__ */ jsx9(MicOff, {
|
|
4256
4480
|
className: "skippr:size-5"
|
|
4257
|
-
}) : /* @__PURE__ */
|
|
4481
|
+
}) : /* @__PURE__ */ jsx9(Mic, {
|
|
4258
4482
|
className: "skippr:size-5"
|
|
4259
4483
|
})
|
|
4260
4484
|
}),
|
|
4261
|
-
/* @__PURE__ */
|
|
4485
|
+
/* @__PURE__ */ jsx9("span", {
|
|
4262
4486
|
className: cn("skippr:h-6 skippr:flex-1 skippr:items-center skippr:justify-center skippr:gap-[3px] skippr:transition-opacity skippr:duration-200", isTalking ? "skippr:flex skippr:opacity-100" : "skippr:hidden"),
|
|
4263
|
-
children: Array.from({ length: MIC_BARS }).map((_, index2) => /* @__PURE__ */
|
|
4487
|
+
children: Array.from({ length: MIC_BARS }).map((_, index2) => /* @__PURE__ */ jsx9("span", {
|
|
4264
4488
|
ref: (el) => {
|
|
4265
4489
|
barRefs.current[index2] = el;
|
|
4266
4490
|
},
|
|
@@ -4272,28 +4496,28 @@ function SessionControlBar() {
|
|
|
4272
4496
|
})
|
|
4273
4497
|
]
|
|
4274
4498
|
}),
|
|
4275
|
-
showScreenShareToggle && /* @__PURE__ */
|
|
4499
|
+
showScreenShareToggle && /* @__PURE__ */ jsx9("button", {
|
|
4276
4500
|
type: "button",
|
|
4277
4501
|
onClick: ifNotDragged(() => void toggleScreenShare()),
|
|
4278
4502
|
"aria-label": isScreenSharing ? "Stop sharing screen" : "Share screen",
|
|
4279
4503
|
className: cn(SQUARE_BUTTON, isScreenSharing ? "skippr:bg-bubble skippr:text-white skippr:hover:bg-[#3a384b]" : "skippr:bg-neutral-100 skippr:text-neutral-700 skippr:hover:bg-neutral-200"),
|
|
4280
|
-
children: isScreenSharing ? /* @__PURE__ */
|
|
4504
|
+
children: isScreenSharing ? /* @__PURE__ */ jsx9(MonitorOff, {
|
|
4281
4505
|
className: "skippr:size-5"
|
|
4282
|
-
}) : /* @__PURE__ */
|
|
4506
|
+
}) : /* @__PURE__ */ jsx9(Monitor, {
|
|
4283
4507
|
className: "skippr:size-5"
|
|
4284
4508
|
})
|
|
4285
4509
|
}),
|
|
4286
4510
|
panelToggleButton,
|
|
4287
|
-
showActionControl && /* @__PURE__ */
|
|
4511
|
+
showActionControl && /* @__PURE__ */ jsx9("button", {
|
|
4288
4512
|
type: "button",
|
|
4289
4513
|
onClick: ifNotDragged(() => void togglePaused()),
|
|
4290
4514
|
"aria-label": actionsPaused2 ? "Resume actions" : "Stop actions",
|
|
4291
4515
|
title: actionsPaused2 ? "Resume" : "Stop",
|
|
4292
4516
|
className: cn(SQUARE_BUTTON, actionsPaused2 ? "skippr:bg-green-100 skippr:text-green-700 skippr:hover:bg-green-200" : "skippr:bg-red-100 skippr:text-red-600 skippr:hover:bg-red-200"),
|
|
4293
|
-
children: actionsPaused2 ? /* @__PURE__ */
|
|
4517
|
+
children: actionsPaused2 ? /* @__PURE__ */ jsx9(Play, {
|
|
4294
4518
|
className: "skippr:size-5",
|
|
4295
4519
|
fill: "currentColor"
|
|
4296
|
-
}) : /* @__PURE__ */
|
|
4520
|
+
}) : /* @__PURE__ */ jsx9(Square, {
|
|
4297
4521
|
className: "skippr:size-5",
|
|
4298
4522
|
fill: "currentColor"
|
|
4299
4523
|
})
|
|
@@ -4304,27 +4528,27 @@ function SessionControlBar() {
|
|
|
4304
4528
|
}, textMode ? "ready-text" : "ready")
|
|
4305
4529
|
]
|
|
4306
4530
|
}),
|
|
4307
|
-
isReady && !isDragging && /* @__PURE__ */
|
|
4531
|
+
isReady && !isDragging && /* @__PURE__ */ jsx9("button", {
|
|
4308
4532
|
type: "button",
|
|
4309
4533
|
onClick: ifNotDragged(() => void pauseSession()),
|
|
4310
4534
|
disabled: isPausing,
|
|
4311
4535
|
"aria-label": "End session",
|
|
4312
4536
|
"aria-busy": isPausing,
|
|
4313
4537
|
className: cn("skippr:absolute skippr:top-1/2 skippr:z-20 skippr:flex skippr:h-[54px] skippr:w-[50px] skippr:-mt-[27px] skippr:items-center", position === "right" ? "skippr:-right-8 skippr:justify-start skippr:pl-2.5" : "skippr:-left-8 skippr:justify-end skippr:pr-2.5", "skippr:rounded-[16px] skippr:bg-red-500 skippr:text-white", "skippr:shadow-[0_4px_14px_rgba(239,68,68,0.45)]", "skippr:transition-colors skippr:duration-150", "skippr:[animation:skippr-toolset-pop_280ms_cubic-bezier(0.22,1,0.36,1)]", isPausing ? "skippr:cursor-default" : "skippr:cursor-pointer skippr:hover:bg-red-600"),
|
|
4314
|
-
children: /* @__PURE__ */
|
|
4538
|
+
children: /* @__PURE__ */ jsxs7("span", {
|
|
4315
4539
|
className: "skippr:relative skippr:flex skippr:size-5 skippr:items-center skippr:justify-center",
|
|
4316
4540
|
children: [
|
|
4317
|
-
/* @__PURE__ */
|
|
4541
|
+
/* @__PURE__ */ jsx9(X, {
|
|
4318
4542
|
className: cn("skippr:size-4 skippr:transition-opacity skippr:duration-200", isPausing && "skippr:opacity-40"),
|
|
4319
4543
|
strokeWidth: 2.5
|
|
4320
4544
|
}),
|
|
4321
|
-
isPausing && /* @__PURE__ */
|
|
4545
|
+
isPausing && /* @__PURE__ */ jsxs7("svg", {
|
|
4322
4546
|
viewBox: "0 0 24 24",
|
|
4323
4547
|
fill: "none",
|
|
4324
4548
|
"aria-hidden": "true",
|
|
4325
4549
|
className: "skippr:absolute skippr:inset-0 skippr:size-full skippr:animate-spin skippr:motion-reduce:hidden",
|
|
4326
4550
|
children: [
|
|
4327
|
-
/* @__PURE__ */
|
|
4551
|
+
/* @__PURE__ */ jsx9("circle", {
|
|
4328
4552
|
cx: "12",
|
|
4329
4553
|
cy: "12",
|
|
4330
4554
|
r: "10.5",
|
|
@@ -4332,7 +4556,7 @@ function SessionControlBar() {
|
|
|
4332
4556
|
strokeOpacity: "0.2",
|
|
4333
4557
|
strokeWidth: "1.5"
|
|
4334
4558
|
}),
|
|
4335
|
-
/* @__PURE__ */
|
|
4559
|
+
/* @__PURE__ */ jsx9("circle", {
|
|
4336
4560
|
cx: "12",
|
|
4337
4561
|
cy: "12",
|
|
4338
4562
|
r: "10.5",
|
|
@@ -4351,9 +4575,9 @@ function SessionControlBar() {
|
|
|
4351
4575
|
}
|
|
4352
4576
|
|
|
4353
4577
|
// src/components/ShadowHost.tsx
|
|
4354
|
-
import { useLayoutEffect as useLayoutEffect2, useRef as
|
|
4578
|
+
import { useLayoutEffect as useLayoutEffect2, useRef as useRef13, useState as useState14 } from "react";
|
|
4355
4579
|
import { createPortal } from "react-dom";
|
|
4356
|
-
import { jsx as
|
|
4580
|
+
import { jsx as jsx10, Fragment as Fragment2 } from "react/jsx-runtime";
|
|
4357
4581
|
var PROPERTIES_STYLE_ID = "skippr-tw-properties";
|
|
4358
4582
|
var PROPERTY_RULE = /@property\s+[^{]+\{[^}]*\}/g;
|
|
4359
4583
|
function hoistTailwindProperties(css) {
|
|
@@ -4368,10 +4592,10 @@ function hoistTailwindProperties(css) {
|
|
|
4368
4592
|
return css.replace(PROPERTY_RULE, "");
|
|
4369
4593
|
}
|
|
4370
4594
|
function ShadowHost({ children }) {
|
|
4371
|
-
const hostRef =
|
|
4372
|
-
const [shadowRoot, setShadowRoot] =
|
|
4595
|
+
const hostRef = useRef13(null);
|
|
4596
|
+
const [shadowRoot, setShadowRoot] = useState14(null);
|
|
4373
4597
|
const css = `/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
|
|
4374
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--skippr-font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--skippr-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--skippr-color-red-50:oklch(97.1% .013 17.38);--skippr-color-red-100:oklch(93.6% .032 17.717);--skippr-color-red-200:oklch(88.5% .062 18.334);--skippr-color-red-300:oklch(80.8% .114 19.571);--skippr-color-red-400:oklch(70.4% .191 22.216);--skippr-color-red-500:oklch(63.7% .237 25.331);--skippr-color-red-600:oklch(57.7% .245 27.325);--skippr-color-red-700:oklch(50.5% .213 27.518);--skippr-color-amber-50:oklch(98.7% .022 95.277);--skippr-color-amber-100:oklch(96.2% .059 95.617);--skippr-color-amber-400:oklch(82.8% .189 84.429);--skippr-color-amber-700:oklch(55.5% .163 48.998);--skippr-color-amber-950:oklch(27.9% .077 45.635);--skippr-color-green-100:oklch(96.2% .044 156.743);--skippr-color-green-200:oklch(92.5% .084 155.995);--skippr-color-green-700:oklch(52.7% .154 150.069);--skippr-color-emerald-400:oklch(76.5% .177 163.223);--skippr-color-neutral-100:oklch(97% 0 0);--skippr-color-neutral-200:oklch(92.2% 0 0);--skippr-color-neutral-500:oklch(55.6% 0 0);--skippr-color-neutral-700:oklch(37.1% 0 0);--skippr-color-black:#000;--skippr-color-white:#fff;--skippr-spacing:.25rem;--skippr-text-xs:.75rem;--skippr-text-xs--line-height:calc(1/.75);--skippr-text-sm:.875rem;--skippr-text-sm--line-height:calc(1.25/.875);--skippr-font-weight-medium:500;--skippr-font-weight-semibold:600;--skippr-leading-tight:1.25;--skippr-leading-snug:1.375;--skippr-leading-relaxed:1.625;--skippr-ease-out:cubic-bezier(0,0,.2,1);--skippr-ease-in-out:cubic-bezier(.4,0,.2,1);--skippr-animate-spin:spin 1s linear infinite;--skippr-animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--skippr-animate-bounce:bounce 1s infinite;--skippr-blur-sm:8px;--skippr-default-transition-duration:.15s;--skippr-default-transition-timing-function:cubic-bezier(.4,0,.2,1);--skippr-default-font-family:var(--skippr-font-sans);--skippr-default-mono-font-family:var(--skippr-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--skippr-default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--skippr-default-font-feature-settings,normal);font-variation-settings:var(--skippr-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--skippr-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--skippr-default-mono-font-feature-settings,normal);font-variation-settings:var(--skippr-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.skippr\\:pointer-events-none{pointer-events:none}.skippr\\:absolute{position:absolute}.skippr\\:fixed{position:fixed}.skippr\\:relative{position:relative}.skippr\\:sticky{position:sticky}.skippr\\:inset-0{inset:calc(var(--skippr-spacing)*0)}.skippr\\:inset-y-0{inset-block:calc(var(--skippr-spacing)*0)}.skippr\\:top-0{top:calc(var(--skippr-spacing)*0)}.skippr\\:top-1\\/2{top:50%}.skippr\\:top-full{top:100%}.skippr\\:-right-8{right:calc(var(--skippr-spacing)*-8)}.skippr\\:right-0{right:calc(var(--skippr-spacing)*0)}.skippr\\:right-3{right:calc(var(--skippr-spacing)*3)}.skippr\\:right-5{right:calc(var(--skippr-spacing)*5)}.skippr\\:right-6{right:calc(var(--skippr-spacing)*6)}.skippr\\:-bottom-1{bottom:calc(var(--skippr-spacing)*-1)}.skippr\\:-bottom-9{bottom:calc(var(--skippr-spacing)*-9)}.skippr\\:bottom-3{bottom:calc(var(--skippr-spacing)*3)}.skippr\\:bottom-20{bottom:calc(var(--skippr-spacing)*20)}.skippr\\:bottom-full{bottom:100%}.skippr\\:-left-8{left:calc(var(--skippr-spacing)*-8)}.skippr\\:left-0{left:calc(var(--skippr-spacing)*0)}.skippr\\:left-1\\/2{left:50%}.skippr\\:left-3{left:calc(var(--skippr-spacing)*3)}.skippr\\:left-5{left:calc(var(--skippr-spacing)*5)}.skippr\\:left-6{left:calc(var(--skippr-spacing)*6)}.skippr\\:z-10{z-index:10}.skippr\\:z-20{z-index:20}.skippr\\:z-\\[9998\\]{z-index:9998}.skippr\\:z-\\[9999\\]{z-index:9999}.skippr\\:order-first{order:-9999}.skippr\\:order-last{order:9999}.skippr\\:mx-auto{margin-inline:auto}.skippr\\:-mt-\\[5px\\]{margin-top:-5px}.skippr\\:-mt-\\[27px\\]{margin-top:-27px}.skippr\\:mt-0\\.5{margin-top:calc(var(--skippr-spacing)*.5)}.skippr\\:mt-1{margin-top:calc(var(--skippr-spacing)*1)}.skippr\\:mt-1\\.5{margin-top:calc(var(--skippr-spacing)*1.5)}.skippr\\:mt-2{margin-top:calc(var(--skippr-spacing)*2)}.skippr\\:mt-3{margin-top:calc(var(--skippr-spacing)*3)}.skippr\\:mt-3\\.5{margin-top:calc(var(--skippr-spacing)*3.5)}.skippr\\:mr-7{margin-right:calc(var(--skippr-spacing)*7)}.skippr\\:-mb-\\[5px\\]{margin-bottom:-5px}.skippr\\:mb-1\\.5{margin-bottom:calc(var(--skippr-spacing)*1.5)}.skippr\\:mb-2{margin-bottom:calc(var(--skippr-spacing)*2)}.skippr\\:mb-3{margin-bottom:calc(var(--skippr-spacing)*3)}.skippr\\:mb-4{margin-bottom:calc(var(--skippr-spacing)*4)}.skippr\\:ml-0\\.5{margin-left:calc(var(--skippr-spacing)*.5)}.skippr\\:ml-1{margin-left:calc(var(--skippr-spacing)*1)}.skippr\\:ml-7{margin-left:calc(var(--skippr-spacing)*7)}.skippr\\:flex{display:flex}.skippr\\:hidden{display:none}.skippr\\:inline-flex{display:inline-flex}.skippr\\:size-1{width:calc(var(--skippr-spacing)*1);height:calc(var(--skippr-spacing)*1)}.skippr\\:size-1\\.5{width:calc(var(--skippr-spacing)*1.5);height:calc(var(--skippr-spacing)*1.5)}.skippr\\:size-2{width:calc(var(--skippr-spacing)*2);height:calc(var(--skippr-spacing)*2)}.skippr\\:size-2\\.5{width:calc(var(--skippr-spacing)*2.5);height:calc(var(--skippr-spacing)*2.5)}.skippr\\:size-3{width:calc(var(--skippr-spacing)*3);height:calc(var(--skippr-spacing)*3)}.skippr\\:size-3\\.5{width:calc(var(--skippr-spacing)*3.5);height:calc(var(--skippr-spacing)*3.5)}.skippr\\:size-4{width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}.skippr\\:size-5{width:calc(var(--skippr-spacing)*5);height:calc(var(--skippr-spacing)*5)}.skippr\\:size-6{width:calc(var(--skippr-spacing)*6);height:calc(var(--skippr-spacing)*6)}.skippr\\:size-7{width:calc(var(--skippr-spacing)*7);height:calc(var(--skippr-spacing)*7)}.skippr\\:size-8{width:calc(var(--skippr-spacing)*8);height:calc(var(--skippr-spacing)*8)}.skippr\\:size-9{width:calc(var(--skippr-spacing)*9);height:calc(var(--skippr-spacing)*9)}.skippr\\:size-10{width:calc(var(--skippr-spacing)*10);height:calc(var(--skippr-spacing)*10)}.skippr\\:size-12{width:calc(var(--skippr-spacing)*12);height:calc(var(--skippr-spacing)*12)}.skippr\\:size-\\[5px\\]{width:5px;height:5px}.skippr\\:size-\\[38px\\]{width:38px;height:38px}.skippr\\:size-full{width:100%;height:100%}.skippr\\:h-0{height:calc(var(--skippr-spacing)*0)}.skippr\\:h-0\\.5{height:calc(var(--skippr-spacing)*.5)}.skippr\\:h-1{height:calc(var(--skippr-spacing)*1)}.skippr\\:h-1\\.5{height:calc(var(--skippr-spacing)*1.5)}.skippr\\:h-2{height:calc(var(--skippr-spacing)*2)}.skippr\\:h-3{height:calc(var(--skippr-spacing)*3)}.skippr\\:h-3\\.5{height:calc(var(--skippr-spacing)*3.5)}.skippr\\:h-4{height:calc(var(--skippr-spacing)*4)}.skippr\\:h-5{height:calc(var(--skippr-spacing)*5)}.skippr\\:h-6{height:calc(var(--skippr-spacing)*6)}.skippr\\:h-7{height:calc(var(--skippr-spacing)*7)}.skippr\\:h-8{height:calc(var(--skippr-spacing)*8)}.skippr\\:h-9{height:calc(var(--skippr-spacing)*9)}.skippr\\:h-10{height:calc(var(--skippr-spacing)*10)}.skippr\\:h-\\[18\\.5px\\]{height:18.5px}.skippr\\:h-\\[36px\\]{height:36px}.skippr\\:h-\\[38px\\]{height:38px}.skippr\\:h-\\[48px\\]{height:48px}.skippr\\:h-\\[54px\\]{height:54px}.skippr\\:h-full{height:100%}.skippr\\:min-h-0{min-height:calc(var(--skippr-spacing)*0)}.skippr\\:min-h-11{min-height:calc(var(--skippr-spacing)*11)}.skippr\\:w-0{width:calc(var(--skippr-spacing)*0)}.skippr\\:w-3\\.5{width:calc(var(--skippr-spacing)*3.5)}.skippr\\:w-4{width:calc(var(--skippr-spacing)*4)}.skippr\\:w-5{width:calc(var(--skippr-spacing)*5)}.skippr\\:w-6{width:calc(var(--skippr-spacing)*6)}.skippr\\:w-7{width:calc(var(--skippr-spacing)*7)}.skippr\\:w-8{width:calc(var(--skippr-spacing)*8)}.skippr\\:w-10{width:calc(var(--skippr-spacing)*10)}.skippr\\:w-40{width:calc(var(--skippr-spacing)*40)}.skippr\\:w-\\[2px\\]{width:2px}.skippr\\:w-\\[3px\\]{width:3px}.skippr\\:w-\\[15\\.4px\\]{width:15.4px}.skippr\\:w-\\[36px\\]{width:36px}.skippr\\:w-\\[50px\\]{width:50px}.skippr\\:w-full{width:100%}.skippr\\:max-w-64{max-width:calc(var(--skippr-spacing)*64)}.skippr\\:max-w-72{max-width:calc(var(--skippr-spacing)*72)}.skippr\\:max-w-\\[80\\%\\]{max-width:80%}.skippr\\:min-w-0{min-width:calc(var(--skippr-spacing)*0)}.skippr\\:min-w-11{min-width:calc(var(--skippr-spacing)*11)}.skippr\\:flex-1{flex:1}.skippr\\:shrink-0{flex-shrink:0}.skippr\\:origin-bottom-left{transform-origin:0 100%}.skippr\\:origin-bottom-right{transform-origin:100% 100%}.skippr\\:origin-center{transform-origin:50%}.skippr\\:origin-left{transform-origin:0}.skippr\\:origin-right{transform-origin:100%}.skippr\\:origin-top-left{transform-origin:0 0}.skippr\\:origin-top-right{transform-origin:100% 0}.skippr\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-x-3{--tw-translate-x:calc(var(--skippr-spacing)*-3);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-x-7{--tw-translate-x:calc(var(--skippr-spacing)*-7);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:translate-x-3{--tw-translate-x:calc(var(--skippr-spacing)*3);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:translate-x-7{--tw-translate-x:calc(var(--skippr-spacing)*7);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:-rotate-90{rotate:-90deg}.skippr\\:rotate-45{rotate:45deg}.skippr\\:rotate-\\[225deg\\]{rotate:225deg}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out_240ms_both\\]{animation:.2s ease-out .24s both skippr-agent-in}.skippr\\:\\[animation\\:skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:\\[animation\\:skippr-finger-tap_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-finger-tap}.skippr\\:\\[animation\\:skippr-orb-in_320ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)\\]{animation:.32s cubic-bezier(.34,1.3,.64,1) skippr-orb-in}.skippr\\:\\[animation\\:skippr-stage-fade_240ms_ease-out\\]{animation:.24s ease-out skippr-stage-fade}.skippr\\:\\[animation\\:skippr-tip-in_360ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)_backwards\\]{animation:.36s cubic-bezier(.34,1.3,.64,1) backwards skippr-tip-in}.skippr\\:\\[animation\\:skippr-toolset-pop_280ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.28s cubic-bezier(.22,1,.36,1) skippr-toolset-pop}.skippr\\:\\[animation\\:skippr-toolset-pop_440ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.44s cubic-bezier(.22,1,.36,1) skippr-toolset-pop}.skippr\\:animate-\\[skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:animate-\\[skippr-bubble-in_0\\.28s_ease-out\\]{animation:.28s ease-out skippr-bubble-in}.skippr\\:animate-\\[skippr-fade-in_0\\.3s_ease-out\\]{animation:.3s ease-out skippr-fade-in}.skippr\\:animate-\\[skippr-pill-content_0\\.22s_ease-out\\]{animation:.22s ease-out skippr-pill-content}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.3s_infinite\\]{animation:1.1s ease-in-out .3s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.6s_infinite\\]{animation:1.1s ease-in-out .6s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.15s_infinite\\]{animation:1.1s ease-in-out .15s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.45s_infinite\\]{animation:1.1s ease-in-out .45s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-speak}.skippr\\:animate-bounce{animation:var(--skippr-animate-bounce)}.skippr\\:animate-ping{animation:var(--skippr-animate-ping)}.skippr\\:animate-skippr-annotation-pulse{animation:1.8s ease-in-out infinite skippr-annotation-pulse}.skippr\\:animate-skippr-click-ping{animation:.5s ease-out forwards skippr-click-ping}.skippr\\:animate-skippr-cursor-pop{animation:.22s ease-out skippr-cursor-pop}.skippr\\:animate-skippr-press{animation:.5s ease-in-out skippr-press}.skippr\\:animate-skippr-tab-fade{animation:.2s ease-out skippr-tab-fade}.skippr\\:animate-skippr-thinking-dot{animation:1.2s ease-in-out infinite skippr-thinking-dot}.skippr\\:animate-spin{animation:var(--skippr-animate-spin)}.skippr\\:cursor-default{cursor:default}.skippr\\:cursor-grab{cursor:grab}.skippr\\:cursor-not-allowed{cursor:not-allowed}.skippr\\:cursor-pointer{cursor:pointer}.skippr\\:touch-none{touch-action:none}.skippr\\:resize-none{resize:none}.skippr\\:flex-col{flex-direction:column}.skippr\\:flex-col-reverse{flex-direction:column-reverse}.skippr\\:items-center{align-items:center}.skippr\\:items-end{align-items:flex-end}.skippr\\:items-start{align-items:flex-start}.skippr\\:justify-between{justify-content:space-between}.skippr\\:justify-center{justify-content:center}.skippr\\:justify-end{justify-content:flex-end}.skippr\\:justify-start{justify-content:flex-start}.skippr\\:gap-0\\.5{gap:calc(var(--skippr-spacing)*.5)}.skippr\\:gap-1{gap:calc(var(--skippr-spacing)*1)}.skippr\\:gap-1\\.5{gap:calc(var(--skippr-spacing)*1.5)}.skippr\\:gap-2{gap:calc(var(--skippr-spacing)*2)}.skippr\\:gap-2\\.5{gap:calc(var(--skippr-spacing)*2.5)}.skippr\\:gap-3{gap:calc(var(--skippr-spacing)*3)}.skippr\\:gap-\\[2px\\]{gap:2px}.skippr\\:gap-\\[3px\\]{gap:3px}:where(.skippr\\:space-y-0\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}.skippr\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.skippr\\:overflow-hidden{overflow:hidden}.skippr\\:overflow-y-auto{overflow-y:auto}.skippr\\:rounded-2xl{border-radius:1.125rem}.skippr\\:rounded-\\[1rem\\]{border-radius:1rem}.skippr\\:rounded-\\[10px\\]{border-radius:10px}.skippr\\:rounded-\\[11px\\]{border-radius:11px}.skippr\\:rounded-\\[12px\\]{border-radius:12px}.skippr\\:rounded-\\[14px\\]{border-radius:14px}.skippr\\:rounded-\\[16px\\]{border-radius:16px}.skippr\\:rounded-\\[20px\\]{border-radius:20px}.skippr\\:rounded-full{border-radius:3.40282e38px}.skippr\\:rounded-lg{border-radius:.625rem}.skippr\\:rounded-md{border-radius:.5rem}.skippr\\:rounded-sm{border-radius:.375rem}.skippr\\:rounded-xl{border-radius:.875rem}.skippr\\:rounded-l-\\[18px\\]{border-top-left-radius:18px;border-bottom-left-radius:18px}.skippr\\:rounded-tl-md{border-top-left-radius:.5rem}.skippr\\:rounded-r-\\[18px\\]{border-top-right-radius:18px;border-bottom-right-radius:18px}.skippr\\:border{border-style:var(--tw-border-style);border-width:1px}.skippr\\:border-0{border-style:var(--tw-border-style);border-width:0}.skippr\\:border-2{border-style:var(--tw-border-style);border-width:2px}.skippr\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.skippr\\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.skippr\\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.skippr\\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.skippr\\:border-\\[\\#2bc0ae\\]{border-color:#2bc0ae}.skippr\\:border-border,.skippr\\:border-input{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-primary\\/20{border-color:oklab(29.9244% .0107414 -.0305411/.2)}.skippr\\:border-r-border{border-right-color:oklch(92.3% .003 48.717)}.skippr\\:border-l-border{border-left-color:oklch(92.3% .003 48.717)}.skippr\\:bg-\\[\\#2bc0ae\\]{background-color:#2bc0ae}.skippr\\:bg-\\[\\#2bc0ae\\]\\/50{background-color:oklab(72.9347% -.121518 -.00545585/.5)}.skippr\\:bg-amber-50{background-color:var(--skippr-color-amber-50)}.skippr\\:bg-amber-400{background-color:var(--skippr-color-amber-400)}.skippr\\:bg-background{background-color:oklch(100% 0 0)}.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:color-mix(in oklab,var(--skippr-color-black)7.0%,transparent)}}.skippr\\:bg-bubble{background-color:#2d2b3d}.skippr\\:bg-bubble\\/95{background-color:oklab(29.9244% .0107414 -.0305411/.95)}.skippr\\:bg-card{background-color:oklch(100% 0 0)}.skippr\\:bg-current{background-color:currentColor}.skippr\\:bg-destructive{background-color:#d94f4f}.skippr\\:bg-emerald-400{background-color:var(--skippr-color-emerald-400)}.skippr\\:bg-foreground{background-color:oklch(14.7% .004 49.25)}.skippr\\:bg-green-100{background-color:var(--skippr-color-green-100)}.skippr\\:bg-launcher{background-color:#2d2d3f}.skippr\\:bg-muted-foreground\\/20{background-color:oklab(55.3% .00687528 .0110332/.2)}.skippr\\:bg-muted-foreground\\/40{background-color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:bg-muted\\/50{background-color:oklab(97% -.000282743 .000959196/.5)}.skippr\\:bg-neutral-100{background-color:var(--skippr-color-neutral-100)}.skippr\\:bg-primary{background-color:#2d2b3d}.skippr\\:bg-primary-foreground\\/20{background-color:oklab(100% 0 5.96046e-8/.2)}.skippr\\:bg-primary\\/10{background-color:oklab(29.9244% .0107414 -.0305411/.1)}.skippr\\:bg-red-50{background-color:var(--skippr-color-red-50)}.skippr\\:bg-red-100{background-color:var(--skippr-color-red-100)}.skippr\\:bg-red-400{background-color:var(--skippr-color-red-400)}.skippr\\:bg-red-500{background-color:var(--skippr-color-red-500)}.skippr\\:bg-secondary{background-color:#ffdfb5}.skippr\\:bg-transparent{background-color:#0000}.skippr\\:bg-white,.skippr\\:bg-white\\/15{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/15{background-color:color-mix(in oklab,var(--skippr-color-white)15%,transparent)}}.skippr\\:fill-brand{fill:#2bc0ae}.skippr\\:fill-primary\\/30{fill:oklab(29.9244% .0107414 -.0305411/.3)}.skippr\\:stroke-black\\/15{stroke:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:stroke-black\\/15{stroke:color-mix(in oklab,var(--skippr-color-black)15%,transparent)}}.skippr\\:stroke-bubble{stroke:#2d2b3d}.skippr\\:p-0{padding:calc(var(--skippr-spacing)*0)}.skippr\\:p-0\\.5{padding:calc(var(--skippr-spacing)*.5)}.skippr\\:p-1\\.5{padding:calc(var(--skippr-spacing)*1.5)}.skippr\\:p-2{padding:calc(var(--skippr-spacing)*2)}.skippr\\:p-3{padding:calc(var(--skippr-spacing)*3)}.skippr\\:p-3\\.5{padding:calc(var(--skippr-spacing)*3.5)}.skippr\\:p-4{padding:calc(var(--skippr-spacing)*4)}.skippr\\:px-1{padding-inline:calc(var(--skippr-spacing)*1)}.skippr\\:px-1\\.5{padding-inline:calc(var(--skippr-spacing)*1.5)}.skippr\\:px-2{padding-inline:calc(var(--skippr-spacing)*2)}.skippr\\:px-2\\.5{padding-inline:calc(var(--skippr-spacing)*2.5)}.skippr\\:px-3{padding-inline:calc(var(--skippr-spacing)*3)}.skippr\\:px-4{padding-inline:calc(var(--skippr-spacing)*4)}.skippr\\:px-6{padding-inline:calc(var(--skippr-spacing)*6)}.skippr\\:px-8{padding-inline:calc(var(--skippr-spacing)*8)}.skippr\\:py-0\\.5{padding-block:calc(var(--skippr-spacing)*.5)}.skippr\\:py-1{padding-block:calc(var(--skippr-spacing)*1)}.skippr\\:py-1\\.5{padding-block:calc(var(--skippr-spacing)*1.5)}.skippr\\:py-2{padding-block:calc(var(--skippr-spacing)*2)}.skippr\\:py-2\\.5{padding-block:calc(var(--skippr-spacing)*2.5)}.skippr\\:py-3{padding-block:calc(var(--skippr-spacing)*3)}.skippr\\:py-4{padding-block:calc(var(--skippr-spacing)*4)}.skippr\\:py-6{padding-block:calc(var(--skippr-spacing)*6)}.skippr\\:pt-1\\.5{padding-top:calc(var(--skippr-spacing)*1.5)}.skippr\\:pr-2\\.5{padding-right:calc(var(--skippr-spacing)*2.5)}.skippr\\:pr-3{padding-right:calc(var(--skippr-spacing)*3)}.skippr\\:pb-2{padding-bottom:calc(var(--skippr-spacing)*2)}.skippr\\:pl-1\\.5{padding-left:calc(var(--skippr-spacing)*1.5)}.skippr\\:pl-2\\.5{padding-left:calc(var(--skippr-spacing)*2.5)}.skippr\\:pl-3\\.5{padding-left:calc(var(--skippr-spacing)*3.5)}.skippr\\:text-center{text-align:center}.skippr\\:text-left{text-align:left}.skippr\\:font-mono{font-family:var(--skippr-font-mono)}.skippr\\:text-sm{font-size:var(--skippr-text-sm);line-height:var(--tw-leading,var(--skippr-text-sm--line-height))}.skippr\\:text-xs{font-size:var(--skippr-text-xs);line-height:var(--tw-leading,var(--skippr-text-xs--line-height))}.skippr\\:text-\\[10px\\]{font-size:10px}.skippr\\:text-\\[11px\\]{font-size:11px}.skippr\\:text-\\[13px\\]{font-size:13px}.skippr\\:leading-5{--tw-leading:calc(var(--skippr-spacing)*5);line-height:calc(var(--skippr-spacing)*5)}.skippr\\:leading-relaxed{--tw-leading:var(--skippr-leading-relaxed);line-height:var(--skippr-leading-relaxed)}.skippr\\:leading-snug{--tw-leading:var(--skippr-leading-snug);line-height:var(--skippr-leading-snug)}.skippr\\:leading-tight{--tw-leading:var(--skippr-leading-tight);line-height:var(--skippr-leading-tight)}.skippr\\:font-medium{--tw-font-weight:var(--skippr-font-weight-medium);font-weight:var(--skippr-font-weight-medium)}.skippr\\:font-semibold{--tw-font-weight:var(--skippr-font-weight-semibold);font-weight:var(--skippr-font-weight-semibold)}.skippr\\:whitespace-nowrap{white-space:nowrap}.skippr\\:text-\\[\\#2bc0ae\\]{color:#2bc0ae}.skippr\\:text-amber-700{color:var(--skippr-color-amber-700)}.skippr\\:text-amber-950{color:var(--skippr-color-amber-950)}.skippr\\:text-background{color:oklch(100% 0 0)}.skippr\\:text-black{color:var(--skippr-color-black)}.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-green-700{color:var(--skippr-color-green-700)}.skippr\\:text-muted-foreground{color:oklch(55.3% .013 58.071)}.skippr\\:text-muted-foreground\\/30{color:oklab(55.3% .00687528 .0110332/.3)}.skippr\\:text-muted-foreground\\/40{color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:text-muted-foreground\\/60{color:oklab(55.3% .00687528 .0110332/.6)}.skippr\\:text-muted-foreground\\/70{color:oklab(55.3% .00687528 .0110332/.7)}.skippr\\:text-neutral-500{color:var(--skippr-color-neutral-500)}.skippr\\:text-neutral-700{color:var(--skippr-color-neutral-700)}.skippr\\:text-primary{color:#2d2b3d}.skippr\\:text-primary-foreground{color:#fff}.skippr\\:text-primary-foreground\\/70{color:oklab(100% 0 5.96046e-8/.7)}.skippr\\:text-red-400{color:var(--skippr-color-red-400)}.skippr\\:text-red-600{color:var(--skippr-color-red-600)}.skippr\\:text-red-700{color:var(--skippr-color-red-700)}.skippr\\:text-secondary-foreground{color:#613700}.skippr\\:text-white{color:var(--skippr-color-white)}.skippr\\:capitalize{text-transform:capitalize}.skippr\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.skippr\\:line-through{text-decoration-line:line-through}.skippr\\:placeholder-muted-foreground::placeholder{color:oklch(55.3% .013 58.071)}.skippr\\:opacity-0{opacity:0}.skippr\\:opacity-40{opacity:.4}.skippr\\:opacity-75{opacity:.75}.skippr\\:opacity-100{opacity:1}.skippr\\:shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[-6px_8px_30px_rgba\\(15\\,18\\,26\\,0\\.32\\)\\]{--tw-shadow:-6px 8px 30px var(--tw-shadow-color,#0f121a52);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_12px_rgba\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow:0 4px 12px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_14px_rgba\\(239\\,68\\,68\\,0\\.45\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#ef444473);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_16px_rgba\\(45\\,43\\,61\\,0\\.45\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#2d2b3d73),0 2px 4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(45\\,43\\,61\\,0\\.35\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#2d2b3d59);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_30px_rgba\\(0\\,0\\,0\\,0\\.16\\)\\,0_4px_12px_rgba\\(0\\,0\\,0\\,0\\.08\\)\\]{--tw-shadow:0 8px 30px var(--tw-shadow-color,#00000029),0 4px 12px var(--tw-shadow-color,#00000014);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_32px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 10px 32px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-black\\/5{--tw-ring-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-black\\/5{--tw-ring-color:color-mix(in oklab,var(--skippr-color-black)5%,transparent)}}.skippr\\:ring-brand{--tw-ring-color:#2bc0ae}.skippr\\:ring-foreground\\/10{--tw-ring-color:oklab(14.7% .00261104 .00303026/.1)}.skippr\\:ring-white\\/30{--tw-ring-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-white\\/30{--tw-ring-color:color-mix(in oklab,var(--skippr-color-white)30%,transparent)}}.skippr\\:ring-offset-background{--tw-ring-offset-color:oklch(100% 0 0)}.skippr\\:drop-shadow-\\[0_2px_5px_rgba\\(0\\,0\\,0\\,0\\.4\\)\\]{--tw-drop-shadow-size:drop-shadow(0 2px 5px var(--tw-drop-shadow-color,#0006));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.skippr\\:backdrop-blur-sm{--tw-backdrop-blur:blur(var(--skippr-blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.skippr\\:transition-\\[height\\]{transition-property:height;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[opacity\\,transform\\,height\\]{transition-property:opacity,transform,height;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\,margin\\]{transition-property:width,margin;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:duration-75{--tw-duration:75ms;transition-duration:75ms}.skippr\\:duration-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-in-out{--tw-ease:var(--skippr-ease-in-out);transition-timing-function:var(--skippr-ease-in-out)}.skippr\\:ease-out{--tw-ease:var(--skippr-ease-out);transition-timing-function:var(--skippr-ease-out)}.skippr\\:outline-none{--tw-outline-style:none;outline-style:none}.skippr\\:select-none{-webkit-user-select:none;user-select:none}.skippr\\:\\[animation-delay\\:0ms\\]{animation-delay:0s}.skippr\\:\\[animation-delay\\:150ms\\]{animation-delay:.15s}.skippr\\:\\[animation-delay\\:200ms\\]{animation-delay:.2s}.skippr\\:\\[animation-delay\\:300ms\\]{animation-delay:.3s}.skippr\\:\\[animation-delay\\:400ms\\]{animation-delay:.4s}.skippr\\:\\[overflow-anchor\\:none\\]{overflow-anchor:none}.skippr\\:group-focus-within\\:scale-100:is(:where(.skippr\\:group):focus-within *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-focus-within\\:opacity-100:is(:where(.skippr\\:group):focus-within *){opacity:1}@media (hover:hover){.skippr\\:group-hover\\:scale-100:is(:where(.skippr\\:group):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-hover\\:text-red-300:is(:where(.skippr\\:group):hover *){color:var(--skippr-color-red-300)}.skippr\\:group-hover\\:text-white\\/80:is(:where(.skippr\\:group):hover *){color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:group-hover\\:text-white\\/80:is(:where(.skippr\\:group):hover *){color:color-mix(in oklab,var(--skippr-color-white)80%,transparent)}}.skippr\\:group-hover\\:opacity-100:is(:where(.skippr\\:group):hover *){opacity:1}}.skippr\\:placeholder\\:text-muted-foreground::placeholder{color:oklch(55.3% .013 58.071)}@media (hover:hover){.skippr\\:hover\\:-translate-y-0\\.5:hover{--tw-translate-y:calc(var(--skippr-spacing)*-.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:hover\\:bg-\\[\\#3a384b\\]:hover{background-color:#3a384b}.skippr\\:hover\\:bg-accent:hover{background-color:#e7e5e4}.skippr\\:hover\\:bg-amber-100:hover{background-color:var(--skippr-color-amber-100)}.skippr\\:hover\\:bg-bubble:hover{background-color:#2d2b3d}.skippr\\:hover\\:bg-destructive\\/90:hover{background-color:oklab(61.4357% .15892 .0698893/.9)}.skippr\\:hover\\:bg-green-200:hover{background-color:var(--skippr-color-green-200)}.skippr\\:hover\\:bg-muted:hover{background-color:oklch(97% .001 106.424)}.skippr\\:hover\\:bg-neutral-100:hover{background-color:var(--skippr-color-neutral-100)}.skippr\\:hover\\:bg-neutral-200:hover{background-color:var(--skippr-color-neutral-200)}.skippr\\:hover\\:bg-primary\\/90:hover{background-color:oklab(29.9244% .0107414 -.0305411/.9)}.skippr\\:hover\\:bg-red-200:hover{background-color:var(--skippr-color-red-200)}.skippr\\:hover\\:bg-red-600:hover{background-color:var(--skippr-color-red-600)}.skippr\\:hover\\:bg-secondary\\/80:hover{background-color:oklab(91.9963% .0175391 .0626889/.8)}.skippr\\:hover\\:bg-white\\/10:hover{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:hover\\:bg-white\\/10:hover{background-color:color-mix(in oklab,var(--skippr-color-white)10%,transparent)}}.skippr\\:hover\\:text-accent-foreground:hover{color:oklch(21.6% .006 56.043)}.skippr\\:hover\\:text-foreground:hover{color:oklch(14.7% .004 49.25)}.skippr\\:hover\\:text-primary-foreground:hover{color:#fff}.skippr\\:hover\\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}}.skippr\\:focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:focus-visible\\:ring-brand:focus-visible{--tw-ring-color:#2bc0ae}.skippr\\:focus-visible\\:ring-bubble\\/60:focus-visible{--tw-ring-color:oklab(29.9244% .0107414 -.0305411/.6)}.skippr\\:focus-visible\\:ring-ring:focus-visible{--tw-ring-color:oklch(70.9% .01 56.259)}.skippr\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.skippr\\:focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.skippr\\:active\\:translate-y-0:active{--tw-translate-y:calc(var(--skippr-spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.skippr\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.skippr\\:disabled\\:opacity-50:disabled{opacity:.5}.skippr\\:disabled\\:opacity-60:disabled{opacity:.6}@media (prefers-reduced-motion:reduce){.skippr\\:motion-reduce\\:hidden{display:none}}.skippr\\:\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.skippr\\:\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.skippr\\:\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}}@keyframes skippr-tap{0%{transform:scale(1)}45%{transform:scale(.7)}to{transform:scale(1)}}@keyframes skippr-press{0%{transform:scale(1)}55%{transform:scale(1)}85%{transform:scale(.68)}to{transform:scale(1)}}@keyframes skippr-cursor-pop{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}@keyframes skippr-click-ping{0%{opacity:.9;transform:translate(-50%,-50%)scale(.4)}to{opacity:0;transform:translate(-50%,-50%)scale(2.4)}}@keyframes skippr-tab-fade{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-speak{0%,to{opacity:.6;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-thinking-dot{0%,80%,to{opacity:.2;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}@keyframes skippr-pulse-ring{0%,to{box-shadow:0 0 #2d2b3d66}50%{box-shadow:0 0 0 10px #2d2b3d00}}@keyframes skippr-annotation-pulse{0%,to{box-shadow:0 0 #2bc0ae80}50%{box-shadow:0 0 0 6px #2bc0ae00}}@keyframes skippr-speak-ripple{0%{opacity:.6;transform:scale(1)}to{opacity:0;transform:scale(1.8)}}@keyframes skippr-bar{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}@keyframes skippr-breathe{0%,to{opacity:.85;transform:scale(1)}50%{opacity:1;transform:scale(1.08)}}@keyframes skippr-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-wave{0%,to{opacity:.4;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-bubble-in{0%{opacity:0;transform:translateY(12px)scale(.96)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-tip-in{0%{opacity:0;transform:translateY(14px)scale(.96)}60%{opacity:1;transform:translateY(-2px)scale(1.01)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-pill-content{0%{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}@keyframes skippr-banner-look{0%,to{transform:translate(0)}25%{transform:translate(-2px)}75%{transform:translate(2px)}}@keyframes skippr-finger-tap{0%,to{transform:translateY(0)rotate(0)}50%{transform:translateY(2px)rotate(-6deg)}}@keyframes skippr-toolset-pop{0%{opacity:0;transform:scale(.85)}to{opacity:1;transform:scale(1)}}@keyframes skippr-stage-fade{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}@keyframes skippr-agent-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}@keyframes skippr-orb-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}.skippr-no-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.skippr-no-scrollbar::-webkit-scrollbar{display:none}:host{color:var(--color-foreground)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}`;
|
|
4598
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--skippr-font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--skippr-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--skippr-color-red-50:oklch(97.1% .013 17.38);--skippr-color-red-100:oklch(93.6% .032 17.717);--skippr-color-red-200:oklch(88.5% .062 18.334);--skippr-color-red-300:oklch(80.8% .114 19.571);--skippr-color-red-400:oklch(70.4% .191 22.216);--skippr-color-red-500:oklch(63.7% .237 25.331);--skippr-color-red-600:oklch(57.7% .245 27.325);--skippr-color-red-700:oklch(50.5% .213 27.518);--skippr-color-amber-50:oklch(98.7% .022 95.277);--skippr-color-amber-100:oklch(96.2% .059 95.617);--skippr-color-amber-400:oklch(82.8% .189 84.429);--skippr-color-amber-700:oklch(55.5% .163 48.998);--skippr-color-amber-950:oklch(27.9% .077 45.635);--skippr-color-green-100:oklch(96.2% .044 156.743);--skippr-color-green-200:oklch(92.5% .084 155.995);--skippr-color-green-700:oklch(52.7% .154 150.069);--skippr-color-emerald-400:oklch(76.5% .177 163.223);--skippr-color-neutral-100:oklch(97% 0 0);--skippr-color-neutral-200:oklch(92.2% 0 0);--skippr-color-neutral-500:oklch(55.6% 0 0);--skippr-color-neutral-700:oklch(37.1% 0 0);--skippr-color-black:#000;--skippr-color-white:#fff;--skippr-spacing:.25rem;--skippr-text-xs:.75rem;--skippr-text-xs--line-height:calc(1/.75);--skippr-text-sm:.875rem;--skippr-text-sm--line-height:calc(1.25/.875);--skippr-font-weight-medium:500;--skippr-font-weight-semibold:600;--skippr-leading-tight:1.25;--skippr-leading-snug:1.375;--skippr-leading-relaxed:1.625;--skippr-ease-out:cubic-bezier(0,0,.2,1);--skippr-ease-in-out:cubic-bezier(.4,0,.2,1);--skippr-animate-spin:spin 1s linear infinite;--skippr-animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--skippr-animate-bounce:bounce 1s infinite;--skippr-blur-sm:8px;--skippr-default-transition-duration:.15s;--skippr-default-transition-timing-function:cubic-bezier(.4,0,.2,1);--skippr-default-font-family:var(--skippr-font-sans);--skippr-default-mono-font-family:var(--skippr-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--skippr-default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--skippr-default-font-feature-settings,normal);font-variation-settings:var(--skippr-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--skippr-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--skippr-default-mono-font-feature-settings,normal);font-variation-settings:var(--skippr-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.skippr\\:pointer-events-none{pointer-events:none}.skippr\\:absolute{position:absolute}.skippr\\:fixed{position:fixed}.skippr\\:relative{position:relative}.skippr\\:sticky{position:sticky}.skippr\\:inset-0{inset:calc(var(--skippr-spacing)*0)}.skippr\\:inset-y-0{inset-block:calc(var(--skippr-spacing)*0)}.skippr\\:top-0{top:calc(var(--skippr-spacing)*0)}.skippr\\:top-1\\/2{top:50%}.skippr\\:top-full{top:100%}.skippr\\:-right-8{right:calc(var(--skippr-spacing)*-8)}.skippr\\:right-0{right:calc(var(--skippr-spacing)*0)}.skippr\\:right-3{right:calc(var(--skippr-spacing)*3)}.skippr\\:right-5{right:calc(var(--skippr-spacing)*5)}.skippr\\:right-6{right:calc(var(--skippr-spacing)*6)}.skippr\\:-bottom-1{bottom:calc(var(--skippr-spacing)*-1)}.skippr\\:-bottom-9{bottom:calc(var(--skippr-spacing)*-9)}.skippr\\:bottom-3{bottom:calc(var(--skippr-spacing)*3)}.skippr\\:bottom-20{bottom:calc(var(--skippr-spacing)*20)}.skippr\\:bottom-full{bottom:100%}.skippr\\:-left-8{left:calc(var(--skippr-spacing)*-8)}.skippr\\:left-0{left:calc(var(--skippr-spacing)*0)}.skippr\\:left-1\\/2{left:50%}.skippr\\:left-3{left:calc(var(--skippr-spacing)*3)}.skippr\\:left-5{left:calc(var(--skippr-spacing)*5)}.skippr\\:left-6{left:calc(var(--skippr-spacing)*6)}.skippr\\:z-10{z-index:10}.skippr\\:z-20{z-index:20}.skippr\\:z-\\[9998\\]{z-index:9998}.skippr\\:z-\\[9999\\]{z-index:9999}.skippr\\:z-\\[10000\\]{z-index:10000}.skippr\\:order-first{order:-9999}.skippr\\:order-last{order:9999}.skippr\\:mx-auto{margin-inline:auto}.skippr\\:-mt-\\[5px\\]{margin-top:-5px}.skippr\\:-mt-\\[27px\\]{margin-top:-27px}.skippr\\:mt-0\\.5{margin-top:calc(var(--skippr-spacing)*.5)}.skippr\\:mt-1{margin-top:calc(var(--skippr-spacing)*1)}.skippr\\:mt-1\\.5{margin-top:calc(var(--skippr-spacing)*1.5)}.skippr\\:mt-2{margin-top:calc(var(--skippr-spacing)*2)}.skippr\\:mt-3{margin-top:calc(var(--skippr-spacing)*3)}.skippr\\:mt-3\\.5{margin-top:calc(var(--skippr-spacing)*3.5)}.skippr\\:mr-7{margin-right:calc(var(--skippr-spacing)*7)}.skippr\\:-mb-\\[5px\\]{margin-bottom:-5px}.skippr\\:mb-1\\.5{margin-bottom:calc(var(--skippr-spacing)*1.5)}.skippr\\:mb-2{margin-bottom:calc(var(--skippr-spacing)*2)}.skippr\\:mb-3{margin-bottom:calc(var(--skippr-spacing)*3)}.skippr\\:mb-4{margin-bottom:calc(var(--skippr-spacing)*4)}.skippr\\:ml-0\\.5{margin-left:calc(var(--skippr-spacing)*.5)}.skippr\\:ml-1{margin-left:calc(var(--skippr-spacing)*1)}.skippr\\:ml-7{margin-left:calc(var(--skippr-spacing)*7)}.skippr\\:flex{display:flex}.skippr\\:hidden{display:none}.skippr\\:inline-flex{display:inline-flex}.skippr\\:size-1{width:calc(var(--skippr-spacing)*1);height:calc(var(--skippr-spacing)*1)}.skippr\\:size-1\\.5{width:calc(var(--skippr-spacing)*1.5);height:calc(var(--skippr-spacing)*1.5)}.skippr\\:size-2{width:calc(var(--skippr-spacing)*2);height:calc(var(--skippr-spacing)*2)}.skippr\\:size-2\\.5{width:calc(var(--skippr-spacing)*2.5);height:calc(var(--skippr-spacing)*2.5)}.skippr\\:size-3{width:calc(var(--skippr-spacing)*3);height:calc(var(--skippr-spacing)*3)}.skippr\\:size-3\\.5{width:calc(var(--skippr-spacing)*3.5);height:calc(var(--skippr-spacing)*3.5)}.skippr\\:size-4{width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}.skippr\\:size-5{width:calc(var(--skippr-spacing)*5);height:calc(var(--skippr-spacing)*5)}.skippr\\:size-6{width:calc(var(--skippr-spacing)*6);height:calc(var(--skippr-spacing)*6)}.skippr\\:size-7{width:calc(var(--skippr-spacing)*7);height:calc(var(--skippr-spacing)*7)}.skippr\\:size-8{width:calc(var(--skippr-spacing)*8);height:calc(var(--skippr-spacing)*8)}.skippr\\:size-9{width:calc(var(--skippr-spacing)*9);height:calc(var(--skippr-spacing)*9)}.skippr\\:size-10{width:calc(var(--skippr-spacing)*10);height:calc(var(--skippr-spacing)*10)}.skippr\\:size-12{width:calc(var(--skippr-spacing)*12);height:calc(var(--skippr-spacing)*12)}.skippr\\:size-\\[5px\\]{width:5px;height:5px}.skippr\\:size-\\[38px\\]{width:38px;height:38px}.skippr\\:size-full{width:100%;height:100%}.skippr\\:h-0{height:calc(var(--skippr-spacing)*0)}.skippr\\:h-0\\.5{height:calc(var(--skippr-spacing)*.5)}.skippr\\:h-1{height:calc(var(--skippr-spacing)*1)}.skippr\\:h-1\\.5{height:calc(var(--skippr-spacing)*1.5)}.skippr\\:h-2{height:calc(var(--skippr-spacing)*2)}.skippr\\:h-3{height:calc(var(--skippr-spacing)*3)}.skippr\\:h-3\\.5{height:calc(var(--skippr-spacing)*3.5)}.skippr\\:h-4{height:calc(var(--skippr-spacing)*4)}.skippr\\:h-5{height:calc(var(--skippr-spacing)*5)}.skippr\\:h-6{height:calc(var(--skippr-spacing)*6)}.skippr\\:h-7{height:calc(var(--skippr-spacing)*7)}.skippr\\:h-8{height:calc(var(--skippr-spacing)*8)}.skippr\\:h-9{height:calc(var(--skippr-spacing)*9)}.skippr\\:h-10{height:calc(var(--skippr-spacing)*10)}.skippr\\:h-\\[18\\.5px\\]{height:18.5px}.skippr\\:h-\\[36px\\]{height:36px}.skippr\\:h-\\[38px\\]{height:38px}.skippr\\:h-\\[48px\\]{height:48px}.skippr\\:h-\\[54px\\]{height:54px}.skippr\\:h-full{height:100%}.skippr\\:min-h-0{min-height:calc(var(--skippr-spacing)*0)}.skippr\\:min-h-11{min-height:calc(var(--skippr-spacing)*11)}.skippr\\:w-0{width:calc(var(--skippr-spacing)*0)}.skippr\\:w-3\\.5{width:calc(var(--skippr-spacing)*3.5)}.skippr\\:w-4{width:calc(var(--skippr-spacing)*4)}.skippr\\:w-5{width:calc(var(--skippr-spacing)*5)}.skippr\\:w-6{width:calc(var(--skippr-spacing)*6)}.skippr\\:w-7{width:calc(var(--skippr-spacing)*7)}.skippr\\:w-8{width:calc(var(--skippr-spacing)*8)}.skippr\\:w-10{width:calc(var(--skippr-spacing)*10)}.skippr\\:w-40{width:calc(var(--skippr-spacing)*40)}.skippr\\:w-\\[2px\\]{width:2px}.skippr\\:w-\\[3px\\]{width:3px}.skippr\\:w-\\[15\\.4px\\]{width:15.4px}.skippr\\:w-\\[36px\\]{width:36px}.skippr\\:w-\\[38px\\]{width:38px}.skippr\\:w-\\[50px\\]{width:50px}.skippr\\:w-full{width:100%}.skippr\\:max-w-64{max-width:calc(var(--skippr-spacing)*64)}.skippr\\:max-w-72{max-width:calc(var(--skippr-spacing)*72)}.skippr\\:max-w-\\[80\\%\\]{max-width:80%}.skippr\\:max-w-\\[280px\\]{max-width:280px}.skippr\\:min-w-0{min-width:calc(var(--skippr-spacing)*0)}.skippr\\:min-w-11{min-width:calc(var(--skippr-spacing)*11)}.skippr\\:flex-1{flex:1}.skippr\\:shrink-0{flex-shrink:0}.skippr\\:origin-bottom-left{transform-origin:0 100%}.skippr\\:origin-bottom-right{transform-origin:100% 100%}.skippr\\:origin-center{transform-origin:50%}.skippr\\:origin-left{transform-origin:0}.skippr\\:origin-right{transform-origin:100%}.skippr\\:origin-top-left{transform-origin:0 0}.skippr\\:origin-top-right{transform-origin:100% 0}.skippr\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-x-3{--tw-translate-x:calc(var(--skippr-spacing)*-3);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-x-7{--tw-translate-x:calc(var(--skippr-spacing)*-7);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:translate-x-3{--tw-translate-x:calc(var(--skippr-spacing)*3);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:translate-x-7{--tw-translate-x:calc(var(--skippr-spacing)*7);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:-rotate-90{rotate:-90deg}.skippr\\:rotate-45{rotate:45deg}.skippr\\:rotate-\\[225deg\\]{rotate:225deg}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out\\]{animation:.2s ease-out skippr-agent-in}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out_240ms_both\\]{animation:.2s ease-out .24s both skippr-agent-in}.skippr\\:\\[animation\\:skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:\\[animation\\:skippr-finger-tap_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-finger-tap}.skippr\\:\\[animation\\:skippr-orb-in_320ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)\\]{animation:.32s cubic-bezier(.34,1.3,.64,1) skippr-orb-in}.skippr\\:\\[animation\\:skippr-stage-fade_240ms_ease-out\\]{animation:.24s ease-out skippr-stage-fade}.skippr\\:\\[animation\\:skippr-tip-in_360ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)_backwards\\]{animation:.36s cubic-bezier(.34,1.3,.64,1) backwards skippr-tip-in}.skippr\\:\\[animation\\:skippr-toolset-pop_280ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.28s cubic-bezier(.22,1,.36,1) skippr-toolset-pop}.skippr\\:\\[animation\\:skippr-toolset-pop_440ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.44s cubic-bezier(.22,1,.36,1) skippr-toolset-pop}.skippr\\:animate-\\[skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:animate-\\[skippr-bubble-in_0\\.28s_ease-out\\]{animation:.28s ease-out skippr-bubble-in}.skippr\\:animate-\\[skippr-fade-in_0\\.3s_ease-out\\]{animation:.3s ease-out skippr-fade-in}.skippr\\:animate-\\[skippr-pill-content_0\\.22s_ease-out\\]{animation:.22s ease-out skippr-pill-content}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.3s_infinite\\]{animation:1.1s ease-in-out .3s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.6s_infinite\\]{animation:1.1s ease-in-out .6s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.15s_infinite\\]{animation:1.1s ease-in-out .15s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.45s_infinite\\]{animation:1.1s ease-in-out .45s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-speak}.skippr\\:animate-bounce{animation:var(--skippr-animate-bounce)}.skippr\\:animate-ping{animation:var(--skippr-animate-ping)}.skippr\\:animate-skippr-annotation-pulse{animation:1.8s ease-in-out infinite skippr-annotation-pulse}.skippr\\:animate-skippr-click-ping{animation:.5s ease-out forwards skippr-click-ping}.skippr\\:animate-skippr-cursor-pop{animation:.22s ease-out skippr-cursor-pop}.skippr\\:animate-skippr-press{animation:.5s ease-in-out skippr-press}.skippr\\:animate-skippr-rec-ring{animation:2s ease-out infinite skippr-rec-ring}.skippr\\:animate-skippr-tab-fade{animation:.2s ease-out skippr-tab-fade}.skippr\\:animate-skippr-thinking-dot{animation:1.2s ease-in-out infinite skippr-thinking-dot}.skippr\\:animate-spin{animation:var(--skippr-animate-spin)}.skippr\\:cursor-default{cursor:default}.skippr\\:cursor-grab{cursor:grab}.skippr\\:cursor-not-allowed{cursor:not-allowed}.skippr\\:cursor-pointer{cursor:pointer}.skippr\\:touch-none{touch-action:none}.skippr\\:resize-none{resize:none}.skippr\\:flex-col{flex-direction:column}.skippr\\:flex-col-reverse{flex-direction:column-reverse}.skippr\\:items-center{align-items:center}.skippr\\:items-end{align-items:flex-end}.skippr\\:items-start{align-items:flex-start}.skippr\\:justify-between{justify-content:space-between}.skippr\\:justify-center{justify-content:center}.skippr\\:justify-end{justify-content:flex-end}.skippr\\:justify-start{justify-content:flex-start}.skippr\\:gap-0\\.5{gap:calc(var(--skippr-spacing)*.5)}.skippr\\:gap-1{gap:calc(var(--skippr-spacing)*1)}.skippr\\:gap-1\\.5{gap:calc(var(--skippr-spacing)*1.5)}.skippr\\:gap-2{gap:calc(var(--skippr-spacing)*2)}.skippr\\:gap-2\\.5{gap:calc(var(--skippr-spacing)*2.5)}.skippr\\:gap-3{gap:calc(var(--skippr-spacing)*3)}.skippr\\:gap-\\[2px\\]{gap:2px}.skippr\\:gap-\\[3px\\]{gap:3px}:where(.skippr\\:space-y-0\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}.skippr\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.skippr\\:overflow-hidden{overflow:hidden}.skippr\\:overflow-y-auto{overflow-y:auto}.skippr\\:rounded-2xl{border-radius:1.125rem}.skippr\\:rounded-\\[1rem\\]{border-radius:1rem}.skippr\\:rounded-\\[10px\\]{border-radius:10px}.skippr\\:rounded-\\[11px\\]{border-radius:11px}.skippr\\:rounded-\\[12px\\]{border-radius:12px}.skippr\\:rounded-\\[14px\\]{border-radius:14px}.skippr\\:rounded-\\[16px\\]{border-radius:16px}.skippr\\:rounded-\\[20px\\]{border-radius:20px}.skippr\\:rounded-full{border-radius:3.40282e38px}.skippr\\:rounded-lg{border-radius:.625rem}.skippr\\:rounded-md{border-radius:.5rem}.skippr\\:rounded-sm{border-radius:.375rem}.skippr\\:rounded-xl{border-radius:.875rem}.skippr\\:rounded-l-\\[18px\\]{border-top-left-radius:18px;border-bottom-left-radius:18px}.skippr\\:rounded-tl-md{border-top-left-radius:.5rem}.skippr\\:rounded-r-\\[18px\\]{border-top-right-radius:18px;border-bottom-right-radius:18px}.skippr\\:border{border-style:var(--tw-border-style);border-width:1px}.skippr\\:border-0{border-style:var(--tw-border-style);border-width:0}.skippr\\:border-2{border-style:var(--tw-border-style);border-width:2px}.skippr\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.skippr\\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.skippr\\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.skippr\\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.skippr\\:border-\\[\\#2bc0ae\\]{border-color:#2bc0ae}.skippr\\:border-border,.skippr\\:border-input{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-primary\\/20{border-color:oklab(29.9244% .0107414 -.0305411/.2)}.skippr\\:border-r-border{border-right-color:oklch(92.3% .003 48.717)}.skippr\\:border-l-border{border-left-color:oklch(92.3% .003 48.717)}.skippr\\:bg-\\[\\#2bc0ae\\]{background-color:#2bc0ae}.skippr\\:bg-\\[\\#2bc0ae\\]\\/50{background-color:oklab(72.9347% -.121518 -.00545585/.5)}.skippr\\:bg-amber-50{background-color:var(--skippr-color-amber-50)}.skippr\\:bg-amber-400{background-color:var(--skippr-color-amber-400)}.skippr\\:bg-background{background-color:oklch(100% 0 0)}.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:color-mix(in oklab,var(--skippr-color-black)7.0%,transparent)}}.skippr\\:bg-bubble{background-color:#2d2b3d}.skippr\\:bg-bubble\\/95{background-color:oklab(29.9244% .0107414 -.0305411/.95)}.skippr\\:bg-card{background-color:oklch(100% 0 0)}.skippr\\:bg-current{background-color:currentColor}.skippr\\:bg-destructive{background-color:#d94f4f}.skippr\\:bg-emerald-400{background-color:var(--skippr-color-emerald-400)}.skippr\\:bg-foreground{background-color:oklch(14.7% .004 49.25)}.skippr\\:bg-green-100{background-color:var(--skippr-color-green-100)}.skippr\\:bg-launcher{background-color:#2d2d3f}.skippr\\:bg-muted-foreground\\/20{background-color:oklab(55.3% .00687528 .0110332/.2)}.skippr\\:bg-muted-foreground\\/40{background-color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:bg-muted\\/50{background-color:oklab(97% -.000282743 .000959196/.5)}.skippr\\:bg-neutral-100{background-color:var(--skippr-color-neutral-100)}.skippr\\:bg-primary{background-color:#2d2b3d}.skippr\\:bg-primary-foreground\\/20{background-color:oklab(100% 0 5.96046e-8/.2)}.skippr\\:bg-primary\\/10{background-color:oklab(29.9244% .0107414 -.0305411/.1)}.skippr\\:bg-red-50{background-color:var(--skippr-color-red-50)}.skippr\\:bg-red-100{background-color:var(--skippr-color-red-100)}.skippr\\:bg-red-400{background-color:var(--skippr-color-red-400)}.skippr\\:bg-red-500{background-color:var(--skippr-color-red-500)}.skippr\\:bg-secondary{background-color:#ffdfb5}.skippr\\:bg-transparent{background-color:#0000}.skippr\\:bg-white,.skippr\\:bg-white\\/15{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/15{background-color:color-mix(in oklab,var(--skippr-color-white)15%,transparent)}}.skippr\\:fill-brand{fill:#2bc0ae}.skippr\\:fill-primary\\/30{fill:oklab(29.9244% .0107414 -.0305411/.3)}.skippr\\:stroke-black\\/15{stroke:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:stroke-black\\/15{stroke:color-mix(in oklab,var(--skippr-color-black)15%,transparent)}}.skippr\\:stroke-bubble{stroke:#2d2b3d}.skippr\\:p-0{padding:calc(var(--skippr-spacing)*0)}.skippr\\:p-0\\.5{padding:calc(var(--skippr-spacing)*.5)}.skippr\\:p-1\\.5{padding:calc(var(--skippr-spacing)*1.5)}.skippr\\:p-2{padding:calc(var(--skippr-spacing)*2)}.skippr\\:p-3{padding:calc(var(--skippr-spacing)*3)}.skippr\\:p-3\\.5{padding:calc(var(--skippr-spacing)*3.5)}.skippr\\:p-4{padding:calc(var(--skippr-spacing)*4)}.skippr\\:px-1{padding-inline:calc(var(--skippr-spacing)*1)}.skippr\\:px-1\\.5{padding-inline:calc(var(--skippr-spacing)*1.5)}.skippr\\:px-2{padding-inline:calc(var(--skippr-spacing)*2)}.skippr\\:px-2\\.5{padding-inline:calc(var(--skippr-spacing)*2.5)}.skippr\\:px-3{padding-inline:calc(var(--skippr-spacing)*3)}.skippr\\:px-3\\.5{padding-inline:calc(var(--skippr-spacing)*3.5)}.skippr\\:px-4{padding-inline:calc(var(--skippr-spacing)*4)}.skippr\\:px-6{padding-inline:calc(var(--skippr-spacing)*6)}.skippr\\:px-8{padding-inline:calc(var(--skippr-spacing)*8)}.skippr\\:py-0\\.5{padding-block:calc(var(--skippr-spacing)*.5)}.skippr\\:py-1{padding-block:calc(var(--skippr-spacing)*1)}.skippr\\:py-1\\.5{padding-block:calc(var(--skippr-spacing)*1.5)}.skippr\\:py-2{padding-block:calc(var(--skippr-spacing)*2)}.skippr\\:py-2\\.5{padding-block:calc(var(--skippr-spacing)*2.5)}.skippr\\:py-3{padding-block:calc(var(--skippr-spacing)*3)}.skippr\\:py-4{padding-block:calc(var(--skippr-spacing)*4)}.skippr\\:py-6{padding-block:calc(var(--skippr-spacing)*6)}.skippr\\:pt-1\\.5{padding-top:calc(var(--skippr-spacing)*1.5)}.skippr\\:pr-2\\.5{padding-right:calc(var(--skippr-spacing)*2.5)}.skippr\\:pr-3{padding-right:calc(var(--skippr-spacing)*3)}.skippr\\:pb-2{padding-bottom:calc(var(--skippr-spacing)*2)}.skippr\\:pl-1\\.5{padding-left:calc(var(--skippr-spacing)*1.5)}.skippr\\:pl-2\\.5{padding-left:calc(var(--skippr-spacing)*2.5)}.skippr\\:pl-3\\.5{padding-left:calc(var(--skippr-spacing)*3.5)}.skippr\\:text-center{text-align:center}.skippr\\:text-left{text-align:left}.skippr\\:font-mono{font-family:var(--skippr-font-mono)}.skippr\\:text-sm{font-size:var(--skippr-text-sm);line-height:var(--tw-leading,var(--skippr-text-sm--line-height))}.skippr\\:text-xs{font-size:var(--skippr-text-xs);line-height:var(--tw-leading,var(--skippr-text-xs--line-height))}.skippr\\:text-\\[10px\\]{font-size:10px}.skippr\\:text-\\[11px\\]{font-size:11px}.skippr\\:text-\\[13px\\]{font-size:13px}.skippr\\:leading-5{--tw-leading:calc(var(--skippr-spacing)*5);line-height:calc(var(--skippr-spacing)*5)}.skippr\\:leading-relaxed{--tw-leading:var(--skippr-leading-relaxed);line-height:var(--skippr-leading-relaxed)}.skippr\\:leading-snug{--tw-leading:var(--skippr-leading-snug);line-height:var(--skippr-leading-snug)}.skippr\\:leading-tight{--tw-leading:var(--skippr-leading-tight);line-height:var(--skippr-leading-tight)}.skippr\\:font-medium{--tw-font-weight:var(--skippr-font-weight-medium);font-weight:var(--skippr-font-weight-medium)}.skippr\\:font-semibold{--tw-font-weight:var(--skippr-font-weight-semibold);font-weight:var(--skippr-font-weight-semibold)}.skippr\\:whitespace-nowrap{white-space:nowrap}.skippr\\:text-\\[\\#2bc0ae\\]{color:#2bc0ae}.skippr\\:text-amber-700{color:var(--skippr-color-amber-700)}.skippr\\:text-amber-950{color:var(--skippr-color-amber-950)}.skippr\\:text-background{color:oklch(100% 0 0)}.skippr\\:text-black{color:var(--skippr-color-black)}.skippr\\:text-brand{color:#2bc0ae}.skippr\\:text-bubble{color:#2d2b3d}.skippr\\:text-chart-3{color:oklch(66.6% .179 58.318)}.skippr\\:text-destructive{color:#d94f4f}.skippr\\:text-foreground{color:oklch(14.7% .004 49.25)}.skippr\\:text-green-700{color:var(--skippr-color-green-700)}.skippr\\:text-muted-foreground{color:oklch(55.3% .013 58.071)}.skippr\\:text-muted-foreground\\/30{color:oklab(55.3% .00687528 .0110332/.3)}.skippr\\:text-muted-foreground\\/40{color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:text-muted-foreground\\/60{color:oklab(55.3% .00687528 .0110332/.6)}.skippr\\:text-muted-foreground\\/70{color:oklab(55.3% .00687528 .0110332/.7)}.skippr\\:text-neutral-500{color:var(--skippr-color-neutral-500)}.skippr\\:text-neutral-700{color:var(--skippr-color-neutral-700)}.skippr\\:text-primary{color:#2d2b3d}.skippr\\:text-primary-foreground{color:#fff}.skippr\\:text-primary-foreground\\/70{color:oklab(100% 0 5.96046e-8/.7)}.skippr\\:text-red-400{color:var(--skippr-color-red-400)}.skippr\\:text-red-600{color:var(--skippr-color-red-600)}.skippr\\:text-red-700{color:var(--skippr-color-red-700)}.skippr\\:text-secondary-foreground{color:#613700}.skippr\\:text-white,.skippr\\:text-white\\/60{color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-white\\/60{color:color-mix(in oklab,var(--skippr-color-white)60%,transparent)}}.skippr\\:capitalize{text-transform:capitalize}.skippr\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.skippr\\:line-through{text-decoration-line:line-through}.skippr\\:placeholder-muted-foreground::placeholder{color:oklch(55.3% .013 58.071)}.skippr\\:opacity-0{opacity:0}.skippr\\:opacity-40{opacity:.4}.skippr\\:opacity-75{opacity:.75}.skippr\\:opacity-100{opacity:1}.skippr\\:shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[-6px_8px_30px_rgba\\(15\\,18\\,26\\,0\\.32\\)\\]{--tw-shadow:-6px 8px 30px var(--tw-shadow-color,#0f121a52);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_12px_rgba\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow:0 4px 12px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_14px_rgba\\(239\\,68\\,68\\,0\\.45\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#ef444473);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_16px_rgba\\(45\\,43\\,61\\,0\\.45\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#2d2b3d73),0 2px 4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(45\\,43\\,61\\,0\\.35\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#2d2b3d59);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_30px_rgba\\(0\\,0\\,0\\,0\\.16\\)\\,0_4px_12px_rgba\\(0\\,0\\,0\\,0\\.08\\)\\]{--tw-shadow:0 8px 30px var(--tw-shadow-color,#00000029),0 4px 12px var(--tw-shadow-color,#00000014);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_32px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 10px 32px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-black\\/5{--tw-ring-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-black\\/5{--tw-ring-color:color-mix(in oklab,var(--skippr-color-black)5%,transparent)}}.skippr\\:ring-brand{--tw-ring-color:#2bc0ae}.skippr\\:ring-foreground\\/10{--tw-ring-color:oklab(14.7% .00261104 .00303026/.1)}.skippr\\:ring-white\\/30{--tw-ring-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-white\\/30{--tw-ring-color:color-mix(in oklab,var(--skippr-color-white)30%,transparent)}}.skippr\\:ring-offset-background{--tw-ring-offset-color:oklch(100% 0 0)}.skippr\\:drop-shadow-\\[0_2px_5px_rgba\\(0\\,0\\,0\\,0\\.4\\)\\]{--tw-drop-shadow-size:drop-shadow(0 2px 5px var(--tw-drop-shadow-color,#0006));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.skippr\\:backdrop-blur-sm{--tw-backdrop-blur:blur(var(--skippr-blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.skippr\\:transition-\\[height\\]{transition-property:height;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[opacity\\,transform\\,height\\]{transition-property:opacity,transform,height;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\,margin\\]{transition-property:width,margin;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:duration-75{--tw-duration:75ms;transition-duration:75ms}.skippr\\:duration-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-in-out{--tw-ease:var(--skippr-ease-in-out);transition-timing-function:var(--skippr-ease-in-out)}.skippr\\:ease-out{--tw-ease:var(--skippr-ease-out);transition-timing-function:var(--skippr-ease-out)}.skippr\\:outline-none{--tw-outline-style:none;outline-style:none}.skippr\\:select-none{-webkit-user-select:none;user-select:none}.skippr\\:\\[animation-delay\\:0ms\\]{animation-delay:0s}.skippr\\:\\[animation-delay\\:150ms\\]{animation-delay:.15s}.skippr\\:\\[animation-delay\\:200ms\\]{animation-delay:.2s}.skippr\\:\\[animation-delay\\:300ms\\]{animation-delay:.3s}.skippr\\:\\[animation-delay\\:400ms\\]{animation-delay:.4s}.skippr\\:\\[overflow-anchor\\:none\\]{overflow-anchor:none}.skippr\\:group-focus-within\\:scale-100:is(:where(.skippr\\:group):focus-within *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-focus-within\\:opacity-100:is(:where(.skippr\\:group):focus-within *){opacity:1}@media (hover:hover){.skippr\\:group-hover\\:scale-100:is(:where(.skippr\\:group):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-hover\\:text-red-300:is(:where(.skippr\\:group):hover *){color:var(--skippr-color-red-300)}.skippr\\:group-hover\\:text-white\\/80:is(:where(.skippr\\:group):hover *){color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:group-hover\\:text-white\\/80:is(:where(.skippr\\:group):hover *){color:color-mix(in oklab,var(--skippr-color-white)80%,transparent)}}.skippr\\:group-hover\\:opacity-100:is(:where(.skippr\\:group):hover *){opacity:1}}.skippr\\:placeholder\\:text-muted-foreground::placeholder{color:oklch(55.3% .013 58.071)}@media (hover:hover){.skippr\\:hover\\:-translate-y-0\\.5:hover{--tw-translate-y:calc(var(--skippr-spacing)*-.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:hover\\:bg-\\[\\#3a384b\\]:hover{background-color:#3a384b}.skippr\\:hover\\:bg-accent:hover{background-color:#e7e5e4}.skippr\\:hover\\:bg-amber-100:hover{background-color:var(--skippr-color-amber-100)}.skippr\\:hover\\:bg-bubble:hover{background-color:#2d2b3d}.skippr\\:hover\\:bg-destructive\\/90:hover{background-color:oklab(61.4357% .15892 .0698893/.9)}.skippr\\:hover\\:bg-green-200:hover{background-color:var(--skippr-color-green-200)}.skippr\\:hover\\:bg-muted:hover{background-color:oklch(97% .001 106.424)}.skippr\\:hover\\:bg-neutral-100:hover{background-color:var(--skippr-color-neutral-100)}.skippr\\:hover\\:bg-neutral-200:hover{background-color:var(--skippr-color-neutral-200)}.skippr\\:hover\\:bg-primary\\/90:hover{background-color:oklab(29.9244% .0107414 -.0305411/.9)}.skippr\\:hover\\:bg-red-200:hover{background-color:var(--skippr-color-red-200)}.skippr\\:hover\\:bg-red-600:hover{background-color:var(--skippr-color-red-600)}.skippr\\:hover\\:bg-secondary\\/80:hover{background-color:oklab(91.9963% .0175391 .0626889/.8)}.skippr\\:hover\\:bg-white\\/10:hover{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:hover\\:bg-white\\/10:hover{background-color:color-mix(in oklab,var(--skippr-color-white)10%,transparent)}}.skippr\\:hover\\:text-accent-foreground:hover{color:oklch(21.6% .006 56.043)}.skippr\\:hover\\:text-foreground:hover{color:oklch(14.7% .004 49.25)}.skippr\\:hover\\:text-primary-foreground:hover{color:#fff}.skippr\\:hover\\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}}.skippr\\:focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:focus-visible\\:ring-brand:focus-visible{--tw-ring-color:#2bc0ae}.skippr\\:focus-visible\\:ring-bubble\\/60:focus-visible{--tw-ring-color:oklab(29.9244% .0107414 -.0305411/.6)}.skippr\\:focus-visible\\:ring-ring:focus-visible{--tw-ring-color:oklch(70.9% .01 56.259)}.skippr\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.skippr\\:focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.skippr\\:active\\:translate-y-0:active{--tw-translate-y:calc(var(--skippr-spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.skippr\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.skippr\\:disabled\\:opacity-50:disabled{opacity:.5}.skippr\\:disabled\\:opacity-60:disabled{opacity:.6}@media (prefers-reduced-motion:reduce){.skippr\\:motion-reduce\\:hidden{display:none}.skippr\\:motion-reduce\\:animate-none{animation:none}}.skippr\\:\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.skippr\\:\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.skippr\\:\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}}@keyframes skippr-tap{0%{transform:scale(1)}45%{transform:scale(.7)}to{transform:scale(1)}}@keyframes skippr-press{0%{transform:scale(1)}55%{transform:scale(1)}85%{transform:scale(.68)}to{transform:scale(1)}}@keyframes skippr-cursor-pop{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}@keyframes skippr-click-ping{0%{opacity:.9;transform:translate(-50%,-50%)scale(.4)}to{opacity:0;transform:translate(-50%,-50%)scale(2.4)}}@keyframes skippr-tab-fade{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-speak{0%,to{opacity:.6;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-thinking-dot{0%,80%,to{opacity:.2;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}@keyframes skippr-pulse-ring{0%,to{box-shadow:0 0 #2d2b3d66}50%{box-shadow:0 0 0 10px #2d2b3d00}}@keyframes skippr-rec-ring{0%{box-shadow:0 0 #2bc0ae8c}70%{box-shadow:0 0 0 11px #2bc0ae00}to{box-shadow:0 0 #2bc0ae00}}@keyframes skippr-annotation-pulse{0%,to{box-shadow:0 0 #2bc0ae80}50%{box-shadow:0 0 0 6px #2bc0ae00}}@keyframes skippr-speak-ripple{0%{opacity:.6;transform:scale(1)}to{opacity:0;transform:scale(1.8)}}@keyframes skippr-bar{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}@keyframes skippr-breathe{0%,to{opacity:.85;transform:scale(1)}50%{opacity:1;transform:scale(1.08)}}@keyframes skippr-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-wave{0%,to{opacity:.4;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-bubble-in{0%{opacity:0;transform:translateY(12px)scale(.96)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-tip-in{0%{opacity:0;transform:translateY(14px)scale(.96)}60%{opacity:1;transform:translateY(-2px)scale(1.01)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-pill-content{0%{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}@keyframes skippr-banner-look{0%,to{transform:translate(0)}25%{transform:translate(-2px)}75%{transform:translate(2px)}}@keyframes skippr-finger-tap{0%,to{transform:translateY(0)rotate(0)}50%{transform:translateY(2px)rotate(-6deg)}}@keyframes skippr-toolset-pop{0%{opacity:0;transform:scale(.85)}to{opacity:1;transform:scale(1)}}@keyframes skippr-stage-fade{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}@keyframes skippr-agent-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}@keyframes skippr-orb-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}.skippr-no-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.skippr-no-scrollbar::-webkit-scrollbar{display:none}:host{color:var(--color-foreground)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}`;
|
|
4375
4599
|
useLayoutEffect2(() => {
|
|
4376
4600
|
const host = hostRef.current;
|
|
4377
4601
|
if (!host || !css)
|
|
@@ -4386,23 +4610,23 @@ function ShadowHost({ children }) {
|
|
|
4386
4610
|
setShadowRoot(root);
|
|
4387
4611
|
}, [css]);
|
|
4388
4612
|
if (!css)
|
|
4389
|
-
return /* @__PURE__ */
|
|
4613
|
+
return /* @__PURE__ */ jsx10(Fragment2, {
|
|
4390
4614
|
children
|
|
4391
4615
|
});
|
|
4392
|
-
return /* @__PURE__ */
|
|
4616
|
+
return /* @__PURE__ */ jsx10("div", {
|
|
4393
4617
|
ref: hostRef,
|
|
4394
4618
|
children: shadowRoot && createPortal(children, shadowRoot)
|
|
4395
4619
|
});
|
|
4396
4620
|
}
|
|
4397
4621
|
|
|
4398
4622
|
// src/components/Sidebar.tsx
|
|
4399
|
-
import { useContext as
|
|
4623
|
+
import { useContext as useContext13, useEffect as useEffect27 } from "react";
|
|
4400
4624
|
|
|
4401
4625
|
// src/hooks/useCombinedMessages.ts
|
|
4402
|
-
import { useContext as
|
|
4626
|
+
import { useContext as useContext9, useMemo as useMemo6 } from "react";
|
|
4403
4627
|
|
|
4404
4628
|
// src/hooks/useChatMessages.ts
|
|
4405
|
-
import { useChat, useLocalParticipant as
|
|
4629
|
+
import { useChat, useLocalParticipant as useLocalParticipant9 } from "@livekit/components-react/hooks";
|
|
4406
4630
|
import { useMemo as useMemo4 } from "react";
|
|
4407
4631
|
|
|
4408
4632
|
// src/lib/filterSystemMessages.ts
|
|
@@ -4414,7 +4638,7 @@ function filterSystemMessages(messages) {
|
|
|
4414
4638
|
// src/hooks/useChatMessages.ts
|
|
4415
4639
|
function useChatMessages() {
|
|
4416
4640
|
const { chatMessages: rawMessages, send, isSending } = useChat();
|
|
4417
|
-
const { localParticipant } =
|
|
4641
|
+
const { localParticipant } = useLocalParticipant9();
|
|
4418
4642
|
const localIdentity = localParticipant.identity;
|
|
4419
4643
|
const chatMessages = useMemo4(() => {
|
|
4420
4644
|
const sortedMessages = rawMessages.map((msg) => ({
|
|
@@ -4430,19 +4654,33 @@ function useChatMessages() {
|
|
|
4430
4654
|
}
|
|
4431
4655
|
|
|
4432
4656
|
// src/hooks/useStreamingTranscript.ts
|
|
4433
|
-
import { useLocalParticipant as
|
|
4434
|
-
import { useMemo as useMemo5 } from "react";
|
|
4657
|
+
import { useLocalParticipant as useLocalParticipant10 } from "@livekit/components-react/hooks";
|
|
4658
|
+
import { useMemo as useMemo5, useRef as useRef14 } from "react";
|
|
4435
4659
|
function useStreamingTranscript() {
|
|
4436
|
-
const transcriptions =
|
|
4437
|
-
const { localParticipant } =
|
|
4660
|
+
const transcriptions = useSharedTranscriptions();
|
|
4661
|
+
const { localParticipant } = useLocalParticipant10();
|
|
4662
|
+
const { isCapturingSpeech } = useTapToTalkContext();
|
|
4438
4663
|
const localIdentity = localParticipant.identity;
|
|
4439
|
-
const
|
|
4664
|
+
const priorUserStreamIdsRef = useRef14(new Set);
|
|
4665
|
+
const wasCapturingSpeechRef = useRef14(false);
|
|
4666
|
+
if (isCapturingSpeech && !wasCapturingSpeechRef.current) {
|
|
4667
|
+
priorUserStreamIdsRef.current = new Set(transcriptions.filter((stream) => stream.participantInfo.identity === localIdentity).map((stream) => stream.streamInfo.id));
|
|
4668
|
+
}
|
|
4669
|
+
wasCapturingSpeechRef.current = isCapturingSpeech;
|
|
4670
|
+
const transcriptMessages = useMemo5(() => filterSystemMessages(transcriptions.filter((stream) => stream.text.trim().length > 0).filter((stream) => {
|
|
4671
|
+
if (!isCapturingSpeech)
|
|
4672
|
+
return true;
|
|
4673
|
+
const isUser = stream.participantInfo.identity === localIdentity;
|
|
4674
|
+
if (!isUser)
|
|
4675
|
+
return true;
|
|
4676
|
+
return priorUserStreamIdsRef.current.has(stream.streamInfo.id);
|
|
4677
|
+
}).map((stream) => ({
|
|
4440
4678
|
id: stream.streamInfo.id,
|
|
4441
4679
|
role: stream.participantInfo.identity === localIdentity ? "user" : "assistant",
|
|
4442
4680
|
content: stream.text,
|
|
4443
4681
|
source: "voice-transcript",
|
|
4444
4682
|
timestamp: stream.streamInfo.timestamp
|
|
4445
|
-
}))), [transcriptions, localIdentity]);
|
|
4683
|
+
}))), [transcriptions, localIdentity, isCapturingSpeech]);
|
|
4446
4684
|
return { transcriptMessages };
|
|
4447
4685
|
}
|
|
4448
4686
|
|
|
@@ -4467,7 +4705,7 @@ function useCombinedMessages() {
|
|
|
4467
4705
|
const { transcriptMessages } = useStreamingTranscript();
|
|
4468
4706
|
const { chatMessages, sendChatMessage, isSendingChat } = useChatMessages();
|
|
4469
4707
|
const { state: agentState } = useAgentVoiceState();
|
|
4470
|
-
const historyMessages =
|
|
4708
|
+
const historyMessages = useContext9(LiveAgentContext)?.historyMessages ?? [];
|
|
4471
4709
|
const liveMessages = useMemo6(() => {
|
|
4472
4710
|
if (chatMessages.length === 0)
|
|
4473
4711
|
return transcriptMessages;
|
|
@@ -4485,7 +4723,7 @@ function useCombinedMessages() {
|
|
|
4485
4723
|
}
|
|
4486
4724
|
|
|
4487
4725
|
// src/hooks/usePhaseUpdates.ts
|
|
4488
|
-
import { useCallback as
|
|
4726
|
+
import { useCallback as useCallback13, useContext as useContext10, useEffect as useEffect21 } from "react";
|
|
4489
4727
|
function parsePhases(json) {
|
|
4490
4728
|
try {
|
|
4491
4729
|
const data = JSON.parse(json);
|
|
@@ -4496,10 +4734,10 @@ function parsePhases(json) {
|
|
|
4496
4734
|
return null;
|
|
4497
4735
|
}
|
|
4498
4736
|
function usePhaseUpdates() {
|
|
4499
|
-
const parse =
|
|
4737
|
+
const parse = useCallback13(parsePhases, []);
|
|
4500
4738
|
const livePhases = useAgentState("phases", parse, []);
|
|
4501
|
-
const ctx =
|
|
4502
|
-
|
|
4739
|
+
const ctx = useContext10(LiveAgentContext);
|
|
4740
|
+
useEffect21(() => {
|
|
4503
4741
|
if (livePhases.length > 0)
|
|
4504
4742
|
ctx?.setPhasesSnapshot(livePhases);
|
|
4505
4743
|
}, [livePhases, ctx?.setPhasesSnapshot]);
|
|
@@ -4508,7 +4746,7 @@ function usePhaseUpdates() {
|
|
|
4508
4746
|
}
|
|
4509
4747
|
|
|
4510
4748
|
// src/hooks/useSessionRemaining.ts
|
|
4511
|
-
import { useEffect as
|
|
4749
|
+
import { useEffect as useEffect22, useRef as useRef15, useState as useState15 } from "react";
|
|
4512
4750
|
|
|
4513
4751
|
// src/lib/format.ts
|
|
4514
4752
|
function formatTime(seconds) {
|
|
@@ -4524,9 +4762,9 @@ function parseNumber(s) {
|
|
|
4524
4762
|
// src/hooks/useSessionRemaining.ts
|
|
4525
4763
|
function useSessionRemaining() {
|
|
4526
4764
|
const maxCallDuration = useAgentState("maxCallDuration", parseNumber, null);
|
|
4527
|
-
const endTimeRef =
|
|
4528
|
-
const [remaining, setRemaining] =
|
|
4529
|
-
|
|
4765
|
+
const endTimeRef = useRef15(null);
|
|
4766
|
+
const [remaining, setRemaining] = useState15(null);
|
|
4767
|
+
useEffect22(() => {
|
|
4530
4768
|
if (maxCallDuration === null || endTimeRef.current !== null)
|
|
4531
4769
|
return;
|
|
4532
4770
|
const endTime = Date.now() + maxCallDuration * 1000;
|
|
@@ -4543,13 +4781,13 @@ function useSessionRemaining() {
|
|
|
4543
4781
|
}
|
|
4544
4782
|
|
|
4545
4783
|
// src/components/ChatHeader.tsx
|
|
4546
|
-
import { useContext as
|
|
4784
|
+
import { useContext as useContext12, useRef as useRef17 } from "react";
|
|
4547
4785
|
|
|
4548
4786
|
// src/hooks/useElapsedSeconds.ts
|
|
4549
|
-
import { useEffect as
|
|
4787
|
+
import { useEffect as useEffect23, useState as useState16 } from "react";
|
|
4550
4788
|
function useElapsedSeconds(isRunning) {
|
|
4551
|
-
const [elapsed, setElapsed] =
|
|
4552
|
-
|
|
4789
|
+
const [elapsed, setElapsed] = useState16(0);
|
|
4790
|
+
useEffect23(() => {
|
|
4553
4791
|
if (!isRunning) {
|
|
4554
4792
|
setElapsed(0);
|
|
4555
4793
|
return;
|
|
@@ -4565,25 +4803,25 @@ function useElapsedSeconds(isRunning) {
|
|
|
4565
4803
|
}
|
|
4566
4804
|
|
|
4567
4805
|
// src/hooks/useTextMode.ts
|
|
4568
|
-
import { useLocalParticipant as
|
|
4569
|
-
import { useCallback as
|
|
4570
|
-
var
|
|
4806
|
+
import { useLocalParticipant as useLocalParticipant11 } from "@livekit/components-react/hooks";
|
|
4807
|
+
import { useCallback as useCallback14, useContext as useContext11, useRef as useRef16 } from "react";
|
|
4808
|
+
var textEncoder6 = new TextEncoder;
|
|
4571
4809
|
function useTextMode() {
|
|
4572
|
-
const ctx =
|
|
4810
|
+
const ctx = useContext11(LiveAgentContext);
|
|
4573
4811
|
if (!ctx) {
|
|
4574
4812
|
throw new Error("useTextMode must be used within a <LiveAgent> provider");
|
|
4575
4813
|
}
|
|
4576
4814
|
const { textMode, setTextModeState, sidebarTab, setSidebarTab } = ctx;
|
|
4577
|
-
const { localParticipant } =
|
|
4578
|
-
const confirmedTextModeRef =
|
|
4579
|
-
const toggleTextMode =
|
|
4815
|
+
const { localParticipant } = useLocalParticipant11();
|
|
4816
|
+
const confirmedTextModeRef = useRef16(false);
|
|
4817
|
+
const toggleTextMode = useCallback14(async () => {
|
|
4580
4818
|
const next = !textMode;
|
|
4581
4819
|
setTextModeState(next);
|
|
4582
4820
|
if (next && sidebarTab === "agenda") {
|
|
4583
4821
|
setSidebarTab("chat");
|
|
4584
4822
|
}
|
|
4585
4823
|
try {
|
|
4586
|
-
await localParticipant.publishData(
|
|
4824
|
+
await localParticipant.publishData(textEncoder6.encode(JSON.stringify({ textMode: next })), {
|
|
4587
4825
|
reliable: true,
|
|
4588
4826
|
topic: TEXT_MODE_TOPIC
|
|
4589
4827
|
});
|
|
@@ -4598,9 +4836,9 @@ function useTextMode() {
|
|
|
4598
4836
|
}
|
|
4599
4837
|
|
|
4600
4838
|
// src/components/ChatHeader.tsx
|
|
4601
|
-
import { jsx as
|
|
4839
|
+
import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
4602
4840
|
function ChatHeader() {
|
|
4603
|
-
const ctx =
|
|
4841
|
+
const ctx = useContext12(LiveAgentContext);
|
|
4604
4842
|
if (!ctx) {
|
|
4605
4843
|
throw new Error("ChatHeader must be used within a <LiveAgent> provider");
|
|
4606
4844
|
}
|
|
@@ -4616,37 +4854,37 @@ function ChatHeader() {
|
|
|
4616
4854
|
setIsDragging
|
|
4617
4855
|
} = ctx;
|
|
4618
4856
|
const elapsed = useElapsedSeconds(isConnected);
|
|
4619
|
-
const headerRef =
|
|
4857
|
+
const headerRef = useRef17(null);
|
|
4620
4858
|
const followsPanel = variant === "floating" && isPanelOpen;
|
|
4621
4859
|
const dragFollowers = followsPanel ? [panelRef, controlBarRef] : null;
|
|
4622
4860
|
const { wasDraggedRef } = useLauncherDrag(headerRef, commitLauncherDrop, dragFollowers, setIsDragging);
|
|
4623
|
-
return /* @__PURE__ */
|
|
4861
|
+
return /* @__PURE__ */ jsxs8("header", {
|
|
4624
4862
|
ref: headerRef,
|
|
4625
4863
|
className: cn("skippr:sticky skippr:top-0 skippr:z-10 skippr:flex skippr:shrink-0 skippr:items-center skippr:justify-between skippr:border-b skippr:border-border skippr:bg-primary skippr:px-4 skippr:py-3", followsPanel && "skippr:cursor-grab skippr:touch-none skippr:select-none"),
|
|
4626
4864
|
children: [
|
|
4627
|
-
/* @__PURE__ */
|
|
4865
|
+
/* @__PURE__ */ jsxs8("div", {
|
|
4628
4866
|
className: "skippr:flex skippr:items-center skippr:gap-3",
|
|
4629
4867
|
children: [
|
|
4630
|
-
isConnected && /* @__PURE__ */
|
|
4631
|
-
isConnected && /* @__PURE__ */
|
|
4868
|
+
isConnected && /* @__PURE__ */ jsx11(HeaderModeToggle, {}),
|
|
4869
|
+
isConnected && /* @__PURE__ */ jsxs8("div", {
|
|
4632
4870
|
className: "skippr:flex skippr:items-center skippr:gap-1.5 skippr:rounded-full skippr:bg-primary-foreground/20 skippr:px-2.5 skippr:py-1",
|
|
4633
4871
|
children: [
|
|
4634
|
-
/* @__PURE__ */
|
|
4872
|
+
/* @__PURE__ */ jsxs8("span", {
|
|
4635
4873
|
className: "skippr:relative skippr:flex skippr:size-1.5",
|
|
4636
4874
|
children: [
|
|
4637
|
-
/* @__PURE__ */
|
|
4875
|
+
/* @__PURE__ */ jsx11("span", {
|
|
4638
4876
|
className: "skippr:absolute skippr:inline-flex skippr:h-full skippr:w-full skippr:animate-ping skippr:rounded-full skippr:bg-red-400 skippr:opacity-75"
|
|
4639
4877
|
}),
|
|
4640
|
-
/* @__PURE__ */
|
|
4878
|
+
/* @__PURE__ */ jsx11("span", {
|
|
4641
4879
|
className: "skippr:relative skippr:inline-flex skippr:size-1.5 skippr:rounded-full skippr:bg-red-400"
|
|
4642
4880
|
})
|
|
4643
4881
|
]
|
|
4644
4882
|
}),
|
|
4645
|
-
/* @__PURE__ */
|
|
4883
|
+
/* @__PURE__ */ jsx11("span", {
|
|
4646
4884
|
className: "skippr:text-[10px] skippr:font-medium skippr:text-primary-foreground",
|
|
4647
4885
|
children: "REC"
|
|
4648
4886
|
}),
|
|
4649
|
-
/* @__PURE__ */
|
|
4887
|
+
/* @__PURE__ */ jsx11("span", {
|
|
4650
4888
|
className: "skippr:text-[10px] skippr:font-mono skippr:text-primary-foreground",
|
|
4651
4889
|
children: formatTime(elapsed)
|
|
4652
4890
|
})
|
|
@@ -4654,7 +4892,7 @@ function ChatHeader() {
|
|
|
4654
4892
|
})
|
|
4655
4893
|
]
|
|
4656
4894
|
}),
|
|
4657
|
-
minimizable && /* @__PURE__ */
|
|
4895
|
+
minimizable && /* @__PURE__ */ jsx11("button", {
|
|
4658
4896
|
type: "button",
|
|
4659
4897
|
onClick: () => {
|
|
4660
4898
|
if (!wasDraggedRef.current)
|
|
@@ -4663,7 +4901,7 @@ function ChatHeader() {
|
|
|
4663
4901
|
"aria-label": "Close",
|
|
4664
4902
|
title: "Close",
|
|
4665
4903
|
className: "skippr:flex skippr:h-8 skippr:w-8 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-lg skippr:text-primary-foreground/70 skippr:transition-colors skippr:hover:bg-white/10 skippr:hover:text-primary-foreground skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-brand",
|
|
4666
|
-
children: /* @__PURE__ */
|
|
4904
|
+
children: /* @__PURE__ */ jsx11(X, {
|
|
4667
4905
|
className: "skippr:h-4 skippr:w-4"
|
|
4668
4906
|
})
|
|
4669
4907
|
})
|
|
@@ -4673,12 +4911,12 @@ function ChatHeader() {
|
|
|
4673
4911
|
function HeaderModeToggle() {
|
|
4674
4912
|
const { textMode, toggleTextMode } = useTextMode();
|
|
4675
4913
|
const { isHeld } = useSessionHoldContext();
|
|
4676
|
-
return /* @__PURE__ */
|
|
4914
|
+
return /* @__PURE__ */ jsxs8("fieldset", {
|
|
4677
4915
|
"aria-label": "Response mode",
|
|
4678
4916
|
disabled: isHeld,
|
|
4679
4917
|
className: "skippr:flex skippr:items-center skippr:gap-0.5 skippr:rounded-lg skippr:bg-white/15 skippr:p-0.5 skippr:text-xs skippr:font-medium skippr:ring-1 skippr:ring-white/30 skippr:disabled:opacity-50",
|
|
4680
4918
|
children: [
|
|
4681
|
-
/* @__PURE__ */
|
|
4919
|
+
/* @__PURE__ */ jsx11("button", {
|
|
4682
4920
|
type: "button",
|
|
4683
4921
|
"aria-pressed": !textMode,
|
|
4684
4922
|
disabled: isHeld,
|
|
@@ -4689,7 +4927,7 @@ function HeaderModeToggle() {
|
|
|
4689
4927
|
className: cn("skippr:rounded-md skippr:px-2.5 skippr:py-1 skippr:transition-colors skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-brand skippr:disabled:cursor-not-allowed", isHeld ? "skippr:cursor-not-allowed" : "skippr:cursor-pointer", textMode ? "skippr:font-semibold skippr:text-primary-foreground" : "skippr:bg-white skippr:text-primary skippr:shadow-sm"),
|
|
4690
4928
|
children: "Voice"
|
|
4691
4929
|
}),
|
|
4692
|
-
/* @__PURE__ */
|
|
4930
|
+
/* @__PURE__ */ jsx11("button", {
|
|
4693
4931
|
type: "button",
|
|
4694
4932
|
"aria-pressed": textMode,
|
|
4695
4933
|
disabled: isHeld,
|
|
@@ -4705,26 +4943,26 @@ function HeaderModeToggle() {
|
|
|
4705
4943
|
}
|
|
4706
4944
|
|
|
4707
4945
|
// src/components/LoadingDots.tsx
|
|
4708
|
-
import { jsx as
|
|
4946
|
+
import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
4709
4947
|
function LoadingDots({ label }) {
|
|
4710
|
-
return /* @__PURE__ */
|
|
4948
|
+
return /* @__PURE__ */ jsxs9("div", {
|
|
4711
4949
|
className: "skippr:flex skippr:items-center skippr:gap-2 skippr:py-4",
|
|
4712
4950
|
children: [
|
|
4713
|
-
/* @__PURE__ */
|
|
4951
|
+
/* @__PURE__ */ jsxs9("div", {
|
|
4714
4952
|
className: "skippr:flex skippr:gap-1",
|
|
4715
4953
|
children: [
|
|
4716
|
-
/* @__PURE__ */
|
|
4954
|
+
/* @__PURE__ */ jsx12("span", {
|
|
4717
4955
|
className: "skippr:size-1.5 skippr:rounded-full skippr:bg-muted-foreground/40 skippr:animate-bounce skippr:[animation-delay:0ms]"
|
|
4718
4956
|
}),
|
|
4719
|
-
/* @__PURE__ */
|
|
4957
|
+
/* @__PURE__ */ jsx12("span", {
|
|
4720
4958
|
className: "skippr:size-1.5 skippr:rounded-full skippr:bg-muted-foreground/40 skippr:animate-bounce skippr:[animation-delay:150ms]"
|
|
4721
4959
|
}),
|
|
4722
|
-
/* @__PURE__ */
|
|
4960
|
+
/* @__PURE__ */ jsx12("span", {
|
|
4723
4961
|
className: "skippr:size-1.5 skippr:rounded-full skippr:bg-muted-foreground/40 skippr:animate-bounce skippr:[animation-delay:300ms]"
|
|
4724
4962
|
})
|
|
4725
4963
|
]
|
|
4726
4964
|
}),
|
|
4727
|
-
/* @__PURE__ */
|
|
4965
|
+
/* @__PURE__ */ jsx12("p", {
|
|
4728
4966
|
className: "skippr:text-xs skippr:text-muted-foreground",
|
|
4729
4967
|
children: label
|
|
4730
4968
|
})
|
|
@@ -4733,11 +4971,11 @@ function LoadingDots({ label }) {
|
|
|
4733
4971
|
}
|
|
4734
4972
|
|
|
4735
4973
|
// src/components/LoginFlow.tsx
|
|
4736
|
-
import { useCallback as
|
|
4974
|
+
import { useCallback as useCallback15, useEffect as useEffect24, useRef as useRef18, useState as useState17 } from "react";
|
|
4737
4975
|
|
|
4738
4976
|
// src/components/ui/button.tsx
|
|
4739
4977
|
import { forwardRef as forwardRef3 } from "react";
|
|
4740
|
-
import { jsx as
|
|
4978
|
+
import { jsx as jsx13 } from "react/jsx-runtime";
|
|
4741
4979
|
var variantClasses = {
|
|
4742
4980
|
default: "skippr:bg-primary skippr:text-primary-foreground skippr:hover:bg-primary/90",
|
|
4743
4981
|
destructive: "skippr:bg-destructive skippr:text-white skippr:hover:bg-destructive/90",
|
|
@@ -4756,7 +4994,7 @@ var sizeClasses = {
|
|
|
4756
4994
|
"icon-lg": "skippr:size-10"
|
|
4757
4995
|
};
|
|
4758
4996
|
var Button = forwardRef3(({ className, variant = "default", size = "default", ...props }, ref) => {
|
|
4759
|
-
return /* @__PURE__ */
|
|
4997
|
+
return /* @__PURE__ */ jsx13("button", {
|
|
4760
4998
|
className: cn("skippr:inline-flex skippr:items-center skippr:justify-center skippr:gap-2 skippr:whitespace-nowrap skippr:rounded-md skippr:text-sm skippr:font-medium skippr:ring-offset-background skippr:transition-all skippr:cursor-pointer skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-ring skippr:focus-visible:ring-offset-2 skippr:disabled:pointer-events-none skippr:disabled:opacity-50 skippr:shrink-0 skippr:[&_svg]:pointer-events-none skippr:[&_svg:not([class*='size-'])]:size-4 skippr:[&_svg]:shrink-0", variantClasses[variant], sizeClasses[size], className),
|
|
4761
4999
|
ref,
|
|
4762
5000
|
...props
|
|
@@ -4765,28 +5003,28 @@ var Button = forwardRef3(({ className, variant = "default", size = "default", ..
|
|
|
4765
5003
|
Button.displayName = "Button";
|
|
4766
5004
|
|
|
4767
5005
|
// src/components/LoginFlow.tsx
|
|
4768
|
-
import { jsx as
|
|
5006
|
+
import { jsx as jsx14, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
4769
5007
|
var OTP_LENGTH = 6;
|
|
4770
5008
|
var DIGIT_KEYS = ["d0", "d1", "d2", "d3", "d4", "d5"];
|
|
4771
5009
|
function LoginFlow({ requestOtp, verifyOtp, error, isSubmitting }) {
|
|
4772
|
-
const [step, setStep] =
|
|
4773
|
-
const [email, setEmail] =
|
|
4774
|
-
const handleRequestOtp =
|
|
5010
|
+
const [step, setStep] = useState17("email");
|
|
5011
|
+
const [email, setEmail] = useState17("");
|
|
5012
|
+
const handleRequestOtp = useCallback15(async (emailValue) => {
|
|
4775
5013
|
const success = await requestOtp(emailValue);
|
|
4776
5014
|
if (success)
|
|
4777
5015
|
setStep("otp");
|
|
4778
5016
|
}, [requestOtp]);
|
|
4779
|
-
const handleVerifyOtp =
|
|
5017
|
+
const handleVerifyOtp = useCallback15(async (code) => {
|
|
4780
5018
|
await verifyOtp(email, code);
|
|
4781
5019
|
}, [verifyOtp, email]);
|
|
4782
|
-
const handleBack =
|
|
5020
|
+
const handleBack = useCallback15(() => {
|
|
4783
5021
|
setStep("email");
|
|
4784
5022
|
}, []);
|
|
4785
|
-
const handleResend =
|
|
5023
|
+
const handleResend = useCallback15(async () => {
|
|
4786
5024
|
await requestOtp(email);
|
|
4787
5025
|
}, [requestOtp, email]);
|
|
4788
5026
|
if (step === "otp") {
|
|
4789
|
-
return /* @__PURE__ */
|
|
5027
|
+
return /* @__PURE__ */ jsx14(OtpStep, {
|
|
4790
5028
|
email,
|
|
4791
5029
|
onSubmit: handleVerifyOtp,
|
|
4792
5030
|
onResend: handleResend,
|
|
@@ -4795,7 +5033,7 @@ function LoginFlow({ requestOtp, verifyOtp, error, isSubmitting }) {
|
|
|
4795
5033
|
isSubmitting
|
|
4796
5034
|
});
|
|
4797
5035
|
}
|
|
4798
|
-
return /* @__PURE__ */
|
|
5036
|
+
return /* @__PURE__ */ jsx14(EmailStep, {
|
|
4799
5037
|
email,
|
|
4800
5038
|
onEmailChange: setEmail,
|
|
4801
5039
|
onSubmit: handleRequestOtp,
|
|
@@ -4809,30 +5047,30 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
|
|
|
4809
5047
|
if (email.trim())
|
|
4810
5048
|
onSubmit(email.trim());
|
|
4811
5049
|
}
|
|
4812
|
-
return /* @__PURE__ */
|
|
5050
|
+
return /* @__PURE__ */ jsxs10("div", {
|
|
4813
5051
|
className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:px-4 skippr:py-4",
|
|
4814
5052
|
children: [
|
|
4815
|
-
/* @__PURE__ */
|
|
5053
|
+
/* @__PURE__ */ jsxs10("div", {
|
|
4816
5054
|
className: "skippr:mb-4 skippr:text-center",
|
|
4817
5055
|
children: [
|
|
4818
|
-
/* @__PURE__ */
|
|
5056
|
+
/* @__PURE__ */ jsx14(Mail, {
|
|
4819
5057
|
className: "skippr:mx-auto skippr:mb-2 skippr:size-6 skippr:text-primary"
|
|
4820
5058
|
}),
|
|
4821
|
-
/* @__PURE__ */
|
|
5059
|
+
/* @__PURE__ */ jsx14("p", {
|
|
4822
5060
|
className: "skippr:text-sm skippr:font-medium skippr:text-foreground",
|
|
4823
5061
|
children: "Sign in to continue"
|
|
4824
5062
|
}),
|
|
4825
|
-
/* @__PURE__ */
|
|
5063
|
+
/* @__PURE__ */ jsx14("p", {
|
|
4826
5064
|
className: "skippr:mt-1 skippr:text-xs skippr:text-muted-foreground",
|
|
4827
5065
|
children: "Your email will be used to identify you across sessions"
|
|
4828
5066
|
})
|
|
4829
5067
|
]
|
|
4830
5068
|
}),
|
|
4831
|
-
/* @__PURE__ */
|
|
5069
|
+
/* @__PURE__ */ jsxs10("form", {
|
|
4832
5070
|
onSubmit: handleSubmit,
|
|
4833
5071
|
className: "skippr:flex skippr:flex-col skippr:gap-3",
|
|
4834
5072
|
children: [
|
|
4835
|
-
/* @__PURE__ */
|
|
5073
|
+
/* @__PURE__ */ jsx14("input", {
|
|
4836
5074
|
type: "email",
|
|
4837
5075
|
placeholder: "you@example.com",
|
|
4838
5076
|
value: email,
|
|
@@ -4841,15 +5079,15 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
|
|
|
4841
5079
|
required: true,
|
|
4842
5080
|
className: "skippr:w-full skippr:rounded-md skippr:border skippr:border-border skippr:bg-background skippr:px-3 skippr:py-2 skippr:text-sm skippr:text-foreground skippr:placeholder-muted-foreground skippr:outline-none focus:skippr:ring-2 focus:skippr:ring-primary/30 focus:skippr:border-primary disabled:skippr:opacity-50"
|
|
4843
5081
|
}),
|
|
4844
|
-
/* @__PURE__ */
|
|
5082
|
+
/* @__PURE__ */ jsx14(Button, {
|
|
4845
5083
|
type: "submit",
|
|
4846
5084
|
disabled: isSubmitting || !email.trim(),
|
|
4847
5085
|
className: "skippr:w-full",
|
|
4848
|
-
children: isSubmitting ? /* @__PURE__ */
|
|
5086
|
+
children: isSubmitting ? /* @__PURE__ */ jsx14(LoaderCircle, {
|
|
4849
5087
|
className: "skippr:size-4 skippr:animate-spin"
|
|
4850
5088
|
}) : "Continue"
|
|
4851
5089
|
}),
|
|
4852
|
-
error && /* @__PURE__ */
|
|
5090
|
+
error && /* @__PURE__ */ jsx14("p", {
|
|
4853
5091
|
className: "skippr:text-xs skippr:text-center skippr:text-destructive",
|
|
4854
5092
|
children: error
|
|
4855
5093
|
})
|
|
@@ -4859,30 +5097,30 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
|
|
|
4859
5097
|
});
|
|
4860
5098
|
}
|
|
4861
5099
|
function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
4862
|
-
const [digits, setDigits] =
|
|
4863
|
-
const [resendCooldown, setResendCooldown] =
|
|
4864
|
-
const inputRefs =
|
|
4865
|
-
const submittedRef =
|
|
4866
|
-
|
|
5100
|
+
const [digits, setDigits] = useState17(Array(OTP_LENGTH).fill(""));
|
|
5101
|
+
const [resendCooldown, setResendCooldown] = useState17(0);
|
|
5102
|
+
const inputRefs = useRef18([]);
|
|
5103
|
+
const submittedRef = useRef18(false);
|
|
5104
|
+
useEffect24(() => {
|
|
4867
5105
|
inputRefs.current[0]?.focus();
|
|
4868
5106
|
}, []);
|
|
4869
|
-
|
|
5107
|
+
useEffect24(() => {
|
|
4870
5108
|
if (error)
|
|
4871
5109
|
submittedRef.current = false;
|
|
4872
5110
|
}, [error]);
|
|
4873
|
-
|
|
5111
|
+
useEffect24(() => {
|
|
4874
5112
|
if (resendCooldown <= 0)
|
|
4875
5113
|
return;
|
|
4876
5114
|
const timer = setTimeout(() => setResendCooldown((c) => c - 1), 1000);
|
|
4877
5115
|
return () => clearTimeout(timer);
|
|
4878
5116
|
}, [resendCooldown]);
|
|
4879
|
-
const submitCode =
|
|
5117
|
+
const submitCode = useCallback15((code) => {
|
|
4880
5118
|
if (submittedRef.current || isSubmitting)
|
|
4881
5119
|
return;
|
|
4882
5120
|
submittedRef.current = true;
|
|
4883
5121
|
onSubmit(code);
|
|
4884
5122
|
}, [onSubmit, isSubmitting]);
|
|
4885
|
-
const handleDigitChange =
|
|
5123
|
+
const handleDigitChange = useCallback15((index2, value) => {
|
|
4886
5124
|
const digit = value.replace(/\D/g, "").slice(-1);
|
|
4887
5125
|
const newDigits = [...digits];
|
|
4888
5126
|
newDigits[index2] = digit;
|
|
@@ -4896,12 +5134,12 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
|
4896
5134
|
submitCode(code);
|
|
4897
5135
|
}
|
|
4898
5136
|
}, [digits, submitCode]);
|
|
4899
|
-
const handleKeyDown =
|
|
5137
|
+
const handleKeyDown = useCallback15((index2, e) => {
|
|
4900
5138
|
if (e.key === "Backspace" && !digits[index2] && index2 > 0) {
|
|
4901
5139
|
inputRefs.current[index2 - 1]?.focus();
|
|
4902
5140
|
}
|
|
4903
5141
|
}, [digits]);
|
|
4904
|
-
const handlePaste =
|
|
5142
|
+
const handlePaste = useCallback15((e) => {
|
|
4905
5143
|
e.preventDefault();
|
|
4906
5144
|
const pasted = e.clipboardData.getData("text").replace(/\D/g, "").slice(0, OTP_LENGTH);
|
|
4907
5145
|
if (pasted.length > 0) {
|
|
@@ -4929,22 +5167,22 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
|
4929
5167
|
submittedRef.current = false;
|
|
4930
5168
|
inputRefs.current[0]?.focus();
|
|
4931
5169
|
}
|
|
4932
|
-
return /* @__PURE__ */
|
|
5170
|
+
return /* @__PURE__ */ jsxs10("div", {
|
|
4933
5171
|
className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:px-4 skippr:py-4",
|
|
4934
5172
|
children: [
|
|
4935
|
-
/* @__PURE__ */
|
|
5173
|
+
/* @__PURE__ */ jsxs10("div", {
|
|
4936
5174
|
className: "skippr:mb-4 skippr:text-center",
|
|
4937
5175
|
children: [
|
|
4938
|
-
/* @__PURE__ */
|
|
5176
|
+
/* @__PURE__ */ jsx14("p", {
|
|
4939
5177
|
className: "skippr:text-sm skippr:font-medium skippr:text-foreground",
|
|
4940
5178
|
children: "Enter verification code"
|
|
4941
5179
|
}),
|
|
4942
|
-
/* @__PURE__ */
|
|
5180
|
+
/* @__PURE__ */ jsxs10("p", {
|
|
4943
5181
|
className: "skippr:mt-1 skippr:text-xs skippr:text-muted-foreground",
|
|
4944
5182
|
children: [
|
|
4945
5183
|
"We sent a 6-digit code to",
|
|
4946
5184
|
" ",
|
|
4947
|
-
/* @__PURE__ */
|
|
5185
|
+
/* @__PURE__ */ jsx14("span", {
|
|
4948
5186
|
className: "skippr:font-medium skippr:text-foreground",
|
|
4949
5187
|
children: email
|
|
4950
5188
|
})
|
|
@@ -4952,13 +5190,13 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
|
4952
5190
|
})
|
|
4953
5191
|
]
|
|
4954
5192
|
}),
|
|
4955
|
-
/* @__PURE__ */
|
|
5193
|
+
/* @__PURE__ */ jsxs10("form", {
|
|
4956
5194
|
onSubmit: handleSubmit,
|
|
4957
5195
|
className: "skippr:flex skippr:flex-col skippr:gap-3",
|
|
4958
5196
|
children: [
|
|
4959
|
-
/* @__PURE__ */
|
|
5197
|
+
/* @__PURE__ */ jsx14("div", {
|
|
4960
5198
|
className: "skippr:flex skippr:justify-center skippr:gap-1.5",
|
|
4961
|
-
children: digits.map((digit, index2) => /* @__PURE__ */
|
|
5199
|
+
children: digits.map((digit, index2) => /* @__PURE__ */ jsx14("input", {
|
|
4962
5200
|
ref: (el) => {
|
|
4963
5201
|
inputRefs.current[index2] = el;
|
|
4964
5202
|
},
|
|
@@ -4973,29 +5211,29 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
|
4973
5211
|
className: "skippr:h-10 skippr:w-10 skippr:rounded-md skippr:border skippr:border-border skippr:bg-background skippr:text-center skippr:text-sm skippr:font-semibold skippr:text-foreground skippr:outline-none focus:skippr:ring-2 focus:skippr:ring-primary/30 focus:skippr:border-primary disabled:skippr:opacity-50"
|
|
4974
5212
|
}, DIGIT_KEYS[index2]))
|
|
4975
5213
|
}),
|
|
4976
|
-
error && /* @__PURE__ */
|
|
5214
|
+
error && /* @__PURE__ */ jsx14("p", {
|
|
4977
5215
|
className: "skippr:text-xs skippr:text-center skippr:text-destructive",
|
|
4978
5216
|
children: error
|
|
4979
5217
|
}),
|
|
4980
|
-
/* @__PURE__ */
|
|
5218
|
+
/* @__PURE__ */ jsx14(Button, {
|
|
4981
5219
|
type: "submit",
|
|
4982
5220
|
disabled: isSubmitting || digits.join("").length !== OTP_LENGTH,
|
|
4983
5221
|
className: "skippr:w-full",
|
|
4984
|
-
children: isSubmitting ? /* @__PURE__ */
|
|
5222
|
+
children: isSubmitting ? /* @__PURE__ */ jsx14(LoaderCircle, {
|
|
4985
5223
|
className: "skippr:size-4 skippr:animate-spin"
|
|
4986
5224
|
}) : "Verify"
|
|
4987
5225
|
}),
|
|
4988
|
-
/* @__PURE__ */
|
|
5226
|
+
/* @__PURE__ */ jsxs10("div", {
|
|
4989
5227
|
className: "skippr:flex skippr:items-center skippr:justify-between skippr:text-xs",
|
|
4990
5228
|
children: [
|
|
4991
|
-
/* @__PURE__ */
|
|
5229
|
+
/* @__PURE__ */ jsx14("button", {
|
|
4992
5230
|
type: "button",
|
|
4993
5231
|
onClick: onBack,
|
|
4994
5232
|
disabled: isSubmitting,
|
|
4995
5233
|
className: "skippr:text-muted-foreground hover:skippr:text-foreground skippr:transition-colors disabled:skippr:opacity-50",
|
|
4996
5234
|
children: "Change email"
|
|
4997
5235
|
}),
|
|
4998
|
-
/* @__PURE__ */
|
|
5236
|
+
/* @__PURE__ */ jsx14("button", {
|
|
4999
5237
|
type: "button",
|
|
5000
5238
|
onClick: handleResend,
|
|
5001
5239
|
disabled: isSubmitting || resendCooldown > 0,
|
|
@@ -5011,17 +5249,17 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
|
5011
5249
|
}
|
|
5012
5250
|
|
|
5013
5251
|
// src/components/MessageList.tsx
|
|
5014
|
-
import { useCallback as
|
|
5252
|
+
import { useCallback as useCallback16, useLayoutEffect as useLayoutEffect3, useRef as useRef20, useState as useState19 } from "react";
|
|
5015
5253
|
|
|
5016
5254
|
// src/components/ChatInput.tsx
|
|
5017
|
-
import { useEffect as
|
|
5018
|
-
import { jsx as
|
|
5255
|
+
import { useEffect as useEffect25, useRef as useRef19, useState as useState18 } from "react";
|
|
5256
|
+
import { jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
5019
5257
|
var MAX_INPUT_HEIGHT = 60;
|
|
5020
5258
|
function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
|
|
5021
|
-
const [inputText, setInputText] =
|
|
5022
|
-
const textareaRef =
|
|
5259
|
+
const [inputText, setInputText] = useState18("");
|
|
5260
|
+
const textareaRef = useRef19(null);
|
|
5023
5261
|
const canSend = inputText.trim().length > 0 && !isSendingChat;
|
|
5024
|
-
|
|
5262
|
+
useEffect25(() => {
|
|
5025
5263
|
if (autoFocus)
|
|
5026
5264
|
textareaRef.current?.focus();
|
|
5027
5265
|
}, [autoFocus]);
|
|
@@ -5052,13 +5290,13 @@ function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
|
|
|
5052
5290
|
handleSubmit(e);
|
|
5053
5291
|
}
|
|
5054
5292
|
}
|
|
5055
|
-
return /* @__PURE__ */
|
|
5293
|
+
return /* @__PURE__ */ jsx15("form", {
|
|
5056
5294
|
onSubmit: handleSubmit,
|
|
5057
5295
|
className: "skippr:border-t skippr:border-border skippr:p-3",
|
|
5058
|
-
children: /* @__PURE__ */
|
|
5296
|
+
children: /* @__PURE__ */ jsxs11("div", {
|
|
5059
5297
|
className: "skippr:flex skippr:items-center skippr:gap-2 skippr:rounded-xl skippr:bg-background skippr:ring-1 skippr:ring-foreground/10 skippr:px-3 skippr:py-2",
|
|
5060
5298
|
children: [
|
|
5061
|
-
/* @__PURE__ */
|
|
5299
|
+
/* @__PURE__ */ jsx15("textarea", {
|
|
5062
5300
|
ref: textareaRef,
|
|
5063
5301
|
rows: 1,
|
|
5064
5302
|
value: inputText,
|
|
@@ -5068,12 +5306,12 @@ function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
|
|
|
5068
5306
|
className: "skippr:flex-1 skippr:resize-none skippr:overflow-y-auto skippr:bg-transparent skippr:text-sm skippr:leading-5 skippr:text-foreground skippr:placeholder:text-muted-foreground skippr:outline-none",
|
|
5069
5307
|
style: { maxHeight: `${MAX_INPUT_HEIGHT}px` }
|
|
5070
5308
|
}),
|
|
5071
|
-
/* @__PURE__ */
|
|
5309
|
+
/* @__PURE__ */ jsx15("button", {
|
|
5072
5310
|
type: "submit",
|
|
5073
5311
|
disabled: !canSend,
|
|
5074
5312
|
"aria-label": "Send message",
|
|
5075
5313
|
className: cn("skippr:flex skippr:size-8 skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-lg skippr:transition-colors", canSend ? "skippr:bg-primary skippr:text-primary-foreground skippr:hover:bg-primary/90" : "skippr:bg-muted-foreground/20 skippr:text-muted-foreground/60"),
|
|
5076
|
-
children: /* @__PURE__ */
|
|
5314
|
+
children: /* @__PURE__ */ jsx15(Send, {
|
|
5077
5315
|
className: "skippr:size-3.5"
|
|
5078
5316
|
})
|
|
5079
5317
|
})
|
|
@@ -5083,7 +5321,7 @@ function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
|
|
|
5083
5321
|
}
|
|
5084
5322
|
|
|
5085
5323
|
// src/components/ChatMessage.tsx
|
|
5086
|
-
import { jsx as
|
|
5324
|
+
import { jsx as jsx16, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
5087
5325
|
function formatTimestamp(ts) {
|
|
5088
5326
|
return new Date(ts).toLocaleTimeString("en-US", {
|
|
5089
5327
|
hour: "numeric",
|
|
@@ -5093,16 +5331,16 @@ function formatTimestamp(ts) {
|
|
|
5093
5331
|
}
|
|
5094
5332
|
function ChatMessage({ message }) {
|
|
5095
5333
|
const isAgent = message.role === "assistant";
|
|
5096
|
-
return /* @__PURE__ */
|
|
5334
|
+
return /* @__PURE__ */ jsx16("div", {
|
|
5097
5335
|
className: cn("skippr:flex skippr:gap-2", isAgent ? "skippr:items-start" : "skippr:justify-end"),
|
|
5098
|
-
children: /* @__PURE__ */
|
|
5336
|
+
children: /* @__PURE__ */ jsxs12("div", {
|
|
5099
5337
|
className: cn("skippr:flex skippr:max-w-[80%] skippr:flex-col", isAgent ? "skippr:items-start" : "skippr:items-end"),
|
|
5100
5338
|
children: [
|
|
5101
|
-
/* @__PURE__ */
|
|
5339
|
+
/* @__PURE__ */ jsx16("div", {
|
|
5102
5340
|
className: cn("skippr:rounded-2xl skippr:px-4 skippr:py-2.5 skippr:text-sm skippr:leading-relaxed", isAgent ? "skippr:border skippr:border-border skippr:bg-card skippr:text-foreground" : "skippr:bg-primary skippr:text-primary-foreground"),
|
|
5103
5341
|
children: message.content
|
|
5104
5342
|
}),
|
|
5105
|
-
message.timestamp && /* @__PURE__ */
|
|
5343
|
+
message.timestamp && /* @__PURE__ */ jsx16("span", {
|
|
5106
5344
|
className: "skippr:mt-1 skippr:px-1 skippr:text-[10px] skippr:text-muted-foreground/60",
|
|
5107
5345
|
children: formatTimestamp(message.timestamp)
|
|
5108
5346
|
})
|
|
@@ -5112,70 +5350,70 @@ function ChatMessage({ message }) {
|
|
|
5112
5350
|
}
|
|
5113
5351
|
|
|
5114
5352
|
// src/components/PlanCard.tsx
|
|
5115
|
-
import { useEffect as
|
|
5116
|
-
import { jsx as
|
|
5353
|
+
import { useEffect as useEffect26 } from "react";
|
|
5354
|
+
import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
5117
5355
|
var APPROVE_MESSAGE = "Yes, go ahead.";
|
|
5118
5356
|
var CANCEL_MESSAGE = "No, cancel that.";
|
|
5119
5357
|
var COMPLETED_CARD_VISIBLE_MS = 2500;
|
|
5120
5358
|
function StepIcon({ status }) {
|
|
5121
5359
|
if (status === "done") {
|
|
5122
|
-
return /* @__PURE__ */
|
|
5360
|
+
return /* @__PURE__ */ jsx17(CircleCheck, {
|
|
5123
5361
|
className: "skippr:size-4 skippr:text-chart-3"
|
|
5124
5362
|
});
|
|
5125
5363
|
}
|
|
5126
5364
|
if (status === "failed") {
|
|
5127
|
-
return /* @__PURE__ */
|
|
5365
|
+
return /* @__PURE__ */ jsx17(CircleX, {
|
|
5128
5366
|
className: "skippr:size-4 skippr:text-destructive"
|
|
5129
5367
|
});
|
|
5130
5368
|
}
|
|
5131
5369
|
if (status === "active") {
|
|
5132
|
-
return /* @__PURE__ */
|
|
5370
|
+
return /* @__PURE__ */ jsx17(Circle, {
|
|
5133
5371
|
className: "skippr:size-4 skippr:fill-primary/30 skippr:text-primary"
|
|
5134
5372
|
});
|
|
5135
5373
|
}
|
|
5136
|
-
return /* @__PURE__ */
|
|
5374
|
+
return /* @__PURE__ */ jsx17(Circle, {
|
|
5137
5375
|
className: "skippr:size-4 skippr:text-muted-foreground/30"
|
|
5138
5376
|
});
|
|
5139
5377
|
}
|
|
5140
5378
|
function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
5141
5379
|
const awaitingApproval = plan.state === "proposed";
|
|
5142
|
-
|
|
5380
|
+
useEffect26(() => {
|
|
5143
5381
|
if (plan.state !== "completed")
|
|
5144
5382
|
return;
|
|
5145
5383
|
const timer = setTimeout(onDismiss, COMPLETED_CARD_VISIBLE_MS);
|
|
5146
5384
|
return () => clearTimeout(timer);
|
|
5147
5385
|
}, [plan.state, onDismiss]);
|
|
5148
|
-
return /* @__PURE__ */
|
|
5386
|
+
return /* @__PURE__ */ jsxs13("div", {
|
|
5149
5387
|
className: "skippr:rounded-2xl skippr:rounded-tl-md skippr:bg-card skippr:p-3.5 skippr:ring-2 skippr:ring-brand",
|
|
5150
5388
|
children: [
|
|
5151
|
-
/* @__PURE__ */
|
|
5389
|
+
/* @__PURE__ */ jsx17("p", {
|
|
5152
5390
|
className: "skippr:mb-3 skippr:text-sm skippr:font-semibold skippr:leading-snug skippr:text-foreground",
|
|
5153
5391
|
children: "Plan"
|
|
5154
5392
|
}),
|
|
5155
|
-
/* @__PURE__ */
|
|
5393
|
+
/* @__PURE__ */ jsx17("div", {
|
|
5156
5394
|
className: "skippr:space-y-2",
|
|
5157
|
-
children: plan.steps.map((step) => /* @__PURE__ */
|
|
5395
|
+
children: plan.steps.map((step) => /* @__PURE__ */ jsxs13("div", {
|
|
5158
5396
|
className: "skippr:flex skippr:items-center skippr:gap-2",
|
|
5159
5397
|
children: [
|
|
5160
|
-
/* @__PURE__ */
|
|
5398
|
+
/* @__PURE__ */ jsx17(StepIcon, {
|
|
5161
5399
|
status: step.status
|
|
5162
5400
|
}),
|
|
5163
|
-
/* @__PURE__ */
|
|
5401
|
+
/* @__PURE__ */ jsx17("p", {
|
|
5164
5402
|
className: cn("skippr:text-sm skippr:leading-snug", step.status === "done" && "skippr:text-muted-foreground skippr:line-through", step.status === "active" && "skippr:font-medium skippr:text-foreground", step.status === "pending" && "skippr:text-muted-foreground", step.status === "failed" && "skippr:text-destructive"),
|
|
5165
5403
|
children: step.label
|
|
5166
5404
|
})
|
|
5167
5405
|
]
|
|
5168
5406
|
}, step.index))
|
|
5169
5407
|
}),
|
|
5170
|
-
awaitingApproval && /* @__PURE__ */
|
|
5408
|
+
awaitingApproval && /* @__PURE__ */ jsxs13("div", {
|
|
5171
5409
|
className: "skippr:mt-3.5 skippr:flex skippr:gap-2",
|
|
5172
5410
|
children: [
|
|
5173
|
-
/* @__PURE__ */
|
|
5411
|
+
/* @__PURE__ */ jsx17(Button, {
|
|
5174
5412
|
className: "skippr:flex-1 skippr:py-2",
|
|
5175
5413
|
onClick: () => sendChatMessage(APPROVE_MESSAGE),
|
|
5176
5414
|
children: "Approve"
|
|
5177
5415
|
}),
|
|
5178
|
-
/* @__PURE__ */
|
|
5416
|
+
/* @__PURE__ */ jsx17(Button, {
|
|
5179
5417
|
variant: "outline",
|
|
5180
5418
|
className: "skippr:flex-1 skippr:py-2",
|
|
5181
5419
|
onClick: () => sendChatMessage(CANCEL_MESSAGE),
|
|
@@ -5188,26 +5426,26 @@ function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
|
5188
5426
|
}
|
|
5189
5427
|
|
|
5190
5428
|
// src/components/TypingIndicator.tsx
|
|
5191
|
-
import { jsx as
|
|
5429
|
+
import { jsx as jsx18, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
5192
5430
|
function TypingIndicator() {
|
|
5193
|
-
return /* @__PURE__ */
|
|
5431
|
+
return /* @__PURE__ */ jsx18("div", {
|
|
5194
5432
|
className: "skippr:flex skippr:items-start skippr:gap-2 skippr:animate-skippr-tab-fade",
|
|
5195
|
-
children: /* @__PURE__ */
|
|
5433
|
+
children: /* @__PURE__ */ jsxs14("div", {
|
|
5196
5434
|
className: "skippr:inline-flex skippr:items-center skippr:gap-1 skippr:rounded-2xl skippr:border skippr:border-primary/20 skippr:bg-primary/10 skippr:px-4 skippr:py-2 skippr:text-xs skippr:text-primary",
|
|
5197
5435
|
children: [
|
|
5198
|
-
/* @__PURE__ */
|
|
5436
|
+
/* @__PURE__ */ jsx18("span", {
|
|
5199
5437
|
children: "Agent is analyzing your screen"
|
|
5200
5438
|
}),
|
|
5201
|
-
/* @__PURE__ */
|
|
5439
|
+
/* @__PURE__ */ jsxs14("span", {
|
|
5202
5440
|
className: "skippr:inline-flex skippr:items-center skippr:gap-[2px]",
|
|
5203
5441
|
children: [
|
|
5204
|
-
/* @__PURE__ */
|
|
5442
|
+
/* @__PURE__ */ jsx18("span", {
|
|
5205
5443
|
className: "skippr:size-1 skippr:rounded-full skippr:bg-primary skippr:animate-skippr-thinking-dot skippr:[animation-delay:0ms]"
|
|
5206
5444
|
}),
|
|
5207
|
-
/* @__PURE__ */
|
|
5445
|
+
/* @__PURE__ */ jsx18("span", {
|
|
5208
5446
|
className: "skippr:size-1 skippr:rounded-full skippr:bg-primary skippr:animate-skippr-thinking-dot skippr:[animation-delay:200ms]"
|
|
5209
5447
|
}),
|
|
5210
|
-
/* @__PURE__ */
|
|
5448
|
+
/* @__PURE__ */ jsx18("span", {
|
|
5211
5449
|
className: "skippr:size-1 skippr:rounded-full skippr:bg-primary skippr:animate-skippr-thinking-dot skippr:[animation-delay:400ms]"
|
|
5212
5450
|
})
|
|
5213
5451
|
]
|
|
@@ -5218,7 +5456,7 @@ function TypingIndicator() {
|
|
|
5218
5456
|
}
|
|
5219
5457
|
|
|
5220
5458
|
// src/components/MessageList.tsx
|
|
5221
|
-
import { jsx as
|
|
5459
|
+
import { jsx as jsx19, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
5222
5460
|
var BOTTOM_THRESHOLD_PX = 32;
|
|
5223
5461
|
function isPlanVisible(plan) {
|
|
5224
5462
|
return !!plan && plan.steps.length > 0 && plan.state !== "abandoned";
|
|
@@ -5232,17 +5470,17 @@ function MessageList({
|
|
|
5232
5470
|
autoFocus = false,
|
|
5233
5471
|
readOnly = false
|
|
5234
5472
|
}) {
|
|
5235
|
-
const containerRef =
|
|
5236
|
-
const isPinnedToBottom =
|
|
5237
|
-
const lastSeenMessageId =
|
|
5238
|
-
const [showJumpToLatest, setShowJumpToLatest] =
|
|
5473
|
+
const containerRef = useRef20(null);
|
|
5474
|
+
const isPinnedToBottom = useRef20(true);
|
|
5475
|
+
const lastSeenMessageId = useRef20(undefined);
|
|
5476
|
+
const [showJumpToLatest, setShowJumpToLatest] = useState19(false);
|
|
5239
5477
|
const lastMessage = messages.length > 0 ? messages[messages.length - 1] : undefined;
|
|
5240
|
-
const [dismissedPlanId, setDismissedPlanId] =
|
|
5241
|
-
const dismissPlan =
|
|
5478
|
+
const [dismissedPlanId, setDismissedPlanId] = useState19(null);
|
|
5479
|
+
const dismissPlan = useCallback16(() => {
|
|
5242
5480
|
if (plan)
|
|
5243
5481
|
setDismissedPlanId(plan.planId);
|
|
5244
5482
|
}, [plan]);
|
|
5245
|
-
const handleScroll =
|
|
5483
|
+
const handleScroll = useCallback16(() => {
|
|
5246
5484
|
const container = containerRef.current;
|
|
5247
5485
|
if (!container)
|
|
5248
5486
|
return;
|
|
@@ -5251,7 +5489,7 @@ function MessageList({
|
|
|
5251
5489
|
isPinnedToBottom.current = pinned;
|
|
5252
5490
|
setShowJumpToLatest(!pinned);
|
|
5253
5491
|
}, []);
|
|
5254
|
-
const jumpToLatest =
|
|
5492
|
+
const jumpToLatest = useCallback16(() => {
|
|
5255
5493
|
const container = containerRef.current;
|
|
5256
5494
|
if (!container)
|
|
5257
5495
|
return;
|
|
@@ -5274,49 +5512,49 @@ function MessageList({
|
|
|
5274
5512
|
container.scrollTop = container.scrollHeight;
|
|
5275
5513
|
}, [messages.length, lastMessage?.content]);
|
|
5276
5514
|
const showTyping = isStreaming && lastMessage?.role === "assistant" && lastMessage.content === "";
|
|
5277
|
-
return /* @__PURE__ */
|
|
5515
|
+
return /* @__PURE__ */ jsxs15("div", {
|
|
5278
5516
|
className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col",
|
|
5279
5517
|
children: [
|
|
5280
|
-
/* @__PURE__ */
|
|
5518
|
+
/* @__PURE__ */ jsxs15("div", {
|
|
5281
5519
|
className: "skippr:relative skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col",
|
|
5282
5520
|
children: [
|
|
5283
|
-
/* @__PURE__ */
|
|
5521
|
+
/* @__PURE__ */ jsxs15("div", {
|
|
5284
5522
|
ref: containerRef,
|
|
5285
5523
|
onScroll: handleScroll,
|
|
5286
5524
|
className: "skippr:min-h-0 skippr:flex-1 skippr:space-y-4 skippr:overflow-y-auto skippr:p-4 skippr:[overflow-anchor:none]",
|
|
5287
5525
|
children: [
|
|
5288
|
-
messages.length === 0 && !showTyping && (readOnly ? /* @__PURE__ */
|
|
5526
|
+
messages.length === 0 && !showTyping && (readOnly ? /* @__PURE__ */ jsx19("p", {
|
|
5289
5527
|
className: "skippr:px-2 skippr:py-6 skippr:text-center skippr:text-sm skippr:text-muted-foreground",
|
|
5290
5528
|
children: "No messages in this conversation yet."
|
|
5291
|
-
}) : /* @__PURE__ */
|
|
5529
|
+
}) : /* @__PURE__ */ jsx19(LoadingDots, {
|
|
5292
5530
|
label: "Waiting for conversation to begin..."
|
|
5293
5531
|
})),
|
|
5294
|
-
messages.map((message) => /* @__PURE__ */
|
|
5532
|
+
messages.map((message) => /* @__PURE__ */ jsx19(ChatMessage, {
|
|
5295
5533
|
message
|
|
5296
5534
|
}, message.id)),
|
|
5297
|
-
showTyping && /* @__PURE__ */
|
|
5535
|
+
showTyping && /* @__PURE__ */ jsx19(TypingIndicator, {})
|
|
5298
5536
|
]
|
|
5299
5537
|
}),
|
|
5300
|
-
showJumpToLatest && /* @__PURE__ */
|
|
5538
|
+
showJumpToLatest && /* @__PURE__ */ jsx19("button", {
|
|
5301
5539
|
type: "button",
|
|
5302
5540
|
onClick: jumpToLatest,
|
|
5303
5541
|
"aria-label": "Jump to latest message",
|
|
5304
5542
|
className: "skippr:-translate-x-1/2 skippr:absolute skippr:bottom-3 skippr:left-1/2 skippr:flex skippr:min-h-11 skippr:min-w-11 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:border skippr:border-border skippr:bg-background skippr:p-1.5 skippr:text-foreground skippr:shadow-md skippr:transition-colors skippr:hover:bg-muted",
|
|
5305
|
-
children: /* @__PURE__ */
|
|
5543
|
+
children: /* @__PURE__ */ jsx19(ChevronDown, {
|
|
5306
5544
|
className: "skippr:size-4"
|
|
5307
5545
|
})
|
|
5308
5546
|
})
|
|
5309
5547
|
]
|
|
5310
5548
|
}),
|
|
5311
|
-
sendChatMessage && isPlanVisible(plan) && plan.planId !== dismissedPlanId && /* @__PURE__ */
|
|
5549
|
+
sendChatMessage && isPlanVisible(plan) && plan.planId !== dismissedPlanId && /* @__PURE__ */ jsx19("div", {
|
|
5312
5550
|
className: "skippr:shrink-0 skippr:border-t skippr:border-border skippr:p-3",
|
|
5313
|
-
children: /* @__PURE__ */
|
|
5551
|
+
children: /* @__PURE__ */ jsx19(PlanCard, {
|
|
5314
5552
|
plan,
|
|
5315
5553
|
sendChatMessage,
|
|
5316
5554
|
onDismiss: dismissPlan
|
|
5317
5555
|
}, plan.planId)
|
|
5318
5556
|
}),
|
|
5319
|
-
!readOnly && sendChatMessage && /* @__PURE__ */
|
|
5557
|
+
!readOnly && sendChatMessage && /* @__PURE__ */ jsx19(ChatInput, {
|
|
5320
5558
|
sendChatMessage,
|
|
5321
5559
|
isSendingChat,
|
|
5322
5560
|
autoFocus
|
|
@@ -5326,49 +5564,49 @@ function MessageList({
|
|
|
5326
5564
|
}
|
|
5327
5565
|
|
|
5328
5566
|
// src/components/SessionAgenda.tsx
|
|
5329
|
-
import { jsx as
|
|
5567
|
+
import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
5330
5568
|
function SessionAgenda({ phases, hasStarted }) {
|
|
5331
5569
|
if (phases.length === 0 || !hasStarted) {
|
|
5332
|
-
return /* @__PURE__ */
|
|
5570
|
+
return /* @__PURE__ */ jsx20("div", {
|
|
5333
5571
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
|
|
5334
|
-
children: /* @__PURE__ */
|
|
5572
|
+
children: /* @__PURE__ */ jsx20(LoadingDots, {
|
|
5335
5573
|
label: "Waiting for agenda to load..."
|
|
5336
5574
|
})
|
|
5337
5575
|
});
|
|
5338
5576
|
}
|
|
5339
|
-
return /* @__PURE__ */
|
|
5577
|
+
return /* @__PURE__ */ jsx20("div", {
|
|
5340
5578
|
className: "skippr:flex-1 skippr:overflow-y-auto skippr:px-4 skippr:py-4",
|
|
5341
|
-
children: /* @__PURE__ */
|
|
5579
|
+
children: /* @__PURE__ */ jsx20("div", {
|
|
5342
5580
|
className: "skippr:space-y-1",
|
|
5343
5581
|
children: phases.map((phase) => {
|
|
5344
5582
|
const isActive = phase.status === "active";
|
|
5345
5583
|
const isCompleted = phase.status === "completed";
|
|
5346
|
-
return /* @__PURE__ */
|
|
5584
|
+
return /* @__PURE__ */ jsxs16("div", {
|
|
5347
5585
|
className: cn("skippr:flex skippr:items-start skippr:gap-2.5 skippr:rounded-lg skippr:p-2 skippr:transition-colors", isActive && "skippr:bg-primary/10"),
|
|
5348
5586
|
children: [
|
|
5349
|
-
/* @__PURE__ */
|
|
5587
|
+
/* @__PURE__ */ jsx20("div", {
|
|
5350
5588
|
className: "skippr:mt-0.5",
|
|
5351
|
-
children: isCompleted ? /* @__PURE__ */
|
|
5589
|
+
children: isCompleted ? /* @__PURE__ */ jsx20(CircleCheck, {
|
|
5352
5590
|
className: "skippr:size-4 skippr:text-chart-3"
|
|
5353
|
-
}) : isActive ? /* @__PURE__ */
|
|
5591
|
+
}) : isActive ? /* @__PURE__ */ jsx20(Circle, {
|
|
5354
5592
|
className: "skippr:size-4 skippr:fill-primary/30 skippr:text-primary"
|
|
5355
|
-
}) : /* @__PURE__ */
|
|
5593
|
+
}) : /* @__PURE__ */ jsx20(Circle, {
|
|
5356
5594
|
className: "skippr:size-4 skippr:text-muted-foreground/30"
|
|
5357
5595
|
})
|
|
5358
5596
|
}),
|
|
5359
|
-
/* @__PURE__ */
|
|
5597
|
+
/* @__PURE__ */ jsxs16("div", {
|
|
5360
5598
|
className: "skippr:min-w-0 skippr:flex-1",
|
|
5361
5599
|
children: [
|
|
5362
|
-
/* @__PURE__ */
|
|
5600
|
+
/* @__PURE__ */ jsx20("p", {
|
|
5363
5601
|
className: cn("skippr:text-sm", isCompleted && "skippr:text-muted-foreground skippr:line-through", isActive && "skippr:font-medium skippr:text-foreground", phase.status === "pending" && "skippr:text-muted-foreground"),
|
|
5364
5602
|
children: phase.name
|
|
5365
5603
|
}),
|
|
5366
|
-
phase.highlights.length > 0 && /* @__PURE__ */
|
|
5604
|
+
phase.highlights.length > 0 && /* @__PURE__ */ jsx20("ul", {
|
|
5367
5605
|
className: "skippr:mt-1 skippr:space-y-0.5",
|
|
5368
|
-
children: phase.highlights.map((text) => /* @__PURE__ */
|
|
5606
|
+
children: phase.highlights.map((text) => /* @__PURE__ */ jsxs16("li", {
|
|
5369
5607
|
className: cn("skippr:flex skippr:items-center skippr:gap-1.5 skippr:text-[11px] skippr:leading-tight", isCompleted ? "skippr:text-muted-foreground/40 skippr:line-through" : "skippr:text-muted-foreground/70"),
|
|
5370
5608
|
children: [
|
|
5371
|
-
/* @__PURE__ */
|
|
5609
|
+
/* @__PURE__ */ jsx20("span", {
|
|
5372
5610
|
className: "skippr:size-1 skippr:shrink-0 skippr:rounded-full skippr:bg-current"
|
|
5373
5611
|
}),
|
|
5374
5612
|
text
|
|
@@ -5385,12 +5623,12 @@ function SessionAgenda({ phases, hasStarted }) {
|
|
|
5385
5623
|
}
|
|
5386
5624
|
|
|
5387
5625
|
// src/components/SessionWarningBanner.tsx
|
|
5388
|
-
import { jsx as
|
|
5626
|
+
import { jsx as jsx21 } from "react/jsx-runtime";
|
|
5389
5627
|
var SESSION_WARNING_THRESHOLD_SECS = 60;
|
|
5390
5628
|
function SessionWarningBanner({ remaining }) {
|
|
5391
5629
|
if (remaining === null || remaining <= 0 || remaining > SESSION_WARNING_THRESHOLD_SECS)
|
|
5392
5630
|
return null;
|
|
5393
|
-
return /* @__PURE__ */
|
|
5631
|
+
return /* @__PURE__ */ jsx21("div", {
|
|
5394
5632
|
"data-testid": "session-warning-banner",
|
|
5395
5633
|
className: "skippr:bg-red-50 skippr:px-4 skippr:py-1.5 skippr:text-center skippr:text-xs skippr:font-medium skippr:text-red-700",
|
|
5396
5634
|
children: "Session ending soon"
|
|
@@ -5398,7 +5636,7 @@ function SessionWarningBanner({ remaining }) {
|
|
|
5398
5636
|
}
|
|
5399
5637
|
|
|
5400
5638
|
// src/components/Sidebar.tsx
|
|
5401
|
-
import { jsx as
|
|
5639
|
+
import { jsx as jsx22, jsxs as jsxs17, Fragment as Fragment3 } from "react/jsx-runtime";
|
|
5402
5640
|
var PANEL_GAP_PX = 12;
|
|
5403
5641
|
var PANEL_VIEWPORT_MARGIN_PX = 24;
|
|
5404
5642
|
var PANEL_MAX_HEIGHT_PX = 460;
|
|
@@ -5429,7 +5667,7 @@ function Sidebar({
|
|
|
5429
5667
|
agentMode,
|
|
5430
5668
|
displayModules
|
|
5431
5669
|
} = useLiveAgent();
|
|
5432
|
-
const internalCtx =
|
|
5670
|
+
const internalCtx = useContext13(LiveAgentContext);
|
|
5433
5671
|
const defaultAgentId = internalCtx?.defaultAgentId ?? null;
|
|
5434
5672
|
const startDefaultSession = internalCtx?.startDefaultSession ?? (() => {});
|
|
5435
5673
|
const talkDisabled = !(internalCtx?.hasResolvedModules ?? false);
|
|
@@ -5458,7 +5696,7 @@ function Sidebar({
|
|
|
5458
5696
|
height: panelExpanded ? availableHeight : `min(${PANEL_MAX_HEIGHT_PX}px, ${availableHeight})`
|
|
5459
5697
|
};
|
|
5460
5698
|
}
|
|
5461
|
-
|
|
5699
|
+
useEffect27(() => {
|
|
5462
5700
|
if (!isSidebar)
|
|
5463
5701
|
return;
|
|
5464
5702
|
const prop = position === "right" ? "marginRight" : "marginLeft";
|
|
@@ -5472,13 +5710,13 @@ function Sidebar({
|
|
|
5472
5710
|
document.body.style.transition = "";
|
|
5473
5711
|
};
|
|
5474
5712
|
}, [isSidebar, isPanelOpen, position]);
|
|
5475
|
-
return /* @__PURE__ */
|
|
5713
|
+
return /* @__PURE__ */ jsxs17("div", {
|
|
5476
5714
|
ref: internalCtx?.panelRef,
|
|
5477
5715
|
className: cn("skippr:fixed skippr:z-[9999]", "skippr:bg-card", "skippr:flex skippr:flex-col", "skippr:overflow-hidden", isFloating && "skippr:border skippr:border-border skippr:rounded-2xl skippr:shadow-[0_8px_30px_rgba(0,0,0,0.16),0_4px_12px_rgba(0,0,0,0.08)]", isFloating && (position === "right" ? "skippr:right-6" : "skippr:left-6"), isFloating && "skippr:transition-[opacity,transform,height] skippr:duration-300 skippr:ease-in-out", isFloating && (popsDown ? position === "right" ? "skippr:origin-top-right" : "skippr:origin-top-left" : position === "right" ? "skippr:origin-bottom-right" : "skippr:origin-bottom-left"), isFloating && !isPanelOpen && "skippr:scale-0 skippr:opacity-0 skippr:pointer-events-none", isFloating && isPanelOpen && "skippr:scale-100 skippr:opacity-100", isSidebar && "skippr:top-0 skippr:h-full", isSidebar && "skippr:transition-[width] skippr:duration-300 skippr:ease-in-out", isSidebar && position === "right" && "skippr:right-0 skippr:border-l skippr:border-l-border", isSidebar && position === "left" && "skippr:left-0 skippr:border-r skippr:border-r-border", isSidebar && !isPanelOpen && "skippr:w-0 skippr:border-0"),
|
|
5478
5716
|
style: { width: isPanelOpen ? SIDEBAR_WIDTH : undefined, ...floatingStyle },
|
|
5479
5717
|
children: [
|
|
5480
|
-
!hideHeader && /* @__PURE__ */
|
|
5481
|
-
authFailed ? /* @__PURE__ */
|
|
5718
|
+
!hideHeader && /* @__PURE__ */ jsx22(ChatHeader, {}),
|
|
5719
|
+
authFailed ? /* @__PURE__ */ jsx22(AuthError, {}) : isAuthenticated ? /* @__PURE__ */ jsx22(AuthenticatedContent, {
|
|
5482
5720
|
isConnected,
|
|
5483
5721
|
isPaused,
|
|
5484
5722
|
isPausing,
|
|
@@ -5494,12 +5732,12 @@ function Sidebar({
|
|
|
5494
5732
|
onTalk: startDefaultSession,
|
|
5495
5733
|
talkLabel: startSessionLabel,
|
|
5496
5734
|
talkDisabled
|
|
5497
|
-
}) : usesHostAuth || isValidating ? /* @__PURE__ */
|
|
5735
|
+
}) : usesHostAuth || isValidating ? /* @__PURE__ */ jsx22("div", {
|
|
5498
5736
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
|
|
5499
|
-
children: /* @__PURE__ */
|
|
5737
|
+
children: /* @__PURE__ */ jsx22(LoadingDots, {
|
|
5500
5738
|
label: "Loading..."
|
|
5501
5739
|
})
|
|
5502
|
-
}) : /* @__PURE__ */
|
|
5740
|
+
}) : /* @__PURE__ */ jsx22(LoginFlow, {
|
|
5503
5741
|
requestOtp,
|
|
5504
5742
|
verifyOtp,
|
|
5505
5743
|
error: authError,
|
|
@@ -5531,61 +5769,61 @@ function AuthenticatedContent({
|
|
|
5531
5769
|
if (isStarting && !isConnected) {
|
|
5532
5770
|
transitionLabel = "Reconnecting...";
|
|
5533
5771
|
}
|
|
5534
|
-
return /* @__PURE__ */
|
|
5772
|
+
return /* @__PURE__ */ jsxs17(Fragment3, {
|
|
5535
5773
|
children: [
|
|
5536
|
-
isConnected && /* @__PURE__ */
|
|
5537
|
-
showAgenda && /* @__PURE__ */
|
|
5774
|
+
isConnected && /* @__PURE__ */ jsx22(ConnectedBanner, {}),
|
|
5775
|
+
showAgenda && /* @__PURE__ */ jsxs17("div", {
|
|
5538
5776
|
className: "skippr:flex skippr:items-center skippr:gap-2 skippr:border-b skippr:border-border skippr:px-3 skippr:py-1",
|
|
5539
5777
|
children: [
|
|
5540
|
-
/* @__PURE__ */
|
|
5778
|
+
/* @__PURE__ */ jsxs17("button", {
|
|
5541
5779
|
type: "button",
|
|
5542
5780
|
className: cn("skippr:relative skippr:inline-flex skippr:cursor-pointer skippr:items-center skippr:gap-1.5 skippr:rounded-lg skippr:px-3 skippr:py-1.5 skippr:text-sm skippr:font-medium skippr:transition-all", activeTab === "chat" ? "skippr:text-foreground" : "skippr:text-muted-foreground skippr:hover:text-foreground"),
|
|
5543
5781
|
onClick: () => onTabChange("chat"),
|
|
5544
5782
|
children: [
|
|
5545
|
-
/* @__PURE__ */
|
|
5783
|
+
/* @__PURE__ */ jsx22(MessageCircle, {
|
|
5546
5784
|
className: "skippr:size-3.5"
|
|
5547
5785
|
}),
|
|
5548
5786
|
"Chat",
|
|
5549
|
-
activeTab === "chat" && /* @__PURE__ */
|
|
5787
|
+
activeTab === "chat" && /* @__PURE__ */ jsx22("span", {
|
|
5550
5788
|
className: "skippr:absolute skippr:-bottom-1 skippr:left-3 skippr:right-3 skippr:h-0.5 skippr:rounded-full skippr:bg-foreground"
|
|
5551
5789
|
})
|
|
5552
5790
|
]
|
|
5553
5791
|
}),
|
|
5554
|
-
/* @__PURE__ */
|
|
5792
|
+
/* @__PURE__ */ jsxs17("button", {
|
|
5555
5793
|
type: "button",
|
|
5556
5794
|
className: cn("skippr:relative skippr:inline-flex skippr:cursor-pointer skippr:items-center skippr:gap-1.5 skippr:rounded-lg skippr:px-3 skippr:py-1.5 skippr:text-sm skippr:font-medium skippr:transition-all", activeTab === "agenda" ? "skippr:text-foreground" : "skippr:text-muted-foreground skippr:hover:text-foreground"),
|
|
5557
5795
|
onClick: () => onTabChange("agenda"),
|
|
5558
5796
|
children: [
|
|
5559
|
-
/* @__PURE__ */
|
|
5797
|
+
/* @__PURE__ */ jsx22(Calendar, {
|
|
5560
5798
|
className: "skippr:size-3.5"
|
|
5561
5799
|
}),
|
|
5562
5800
|
"Agenda",
|
|
5563
|
-
activeTab === "agenda" && /* @__PURE__ */
|
|
5801
|
+
activeTab === "agenda" && /* @__PURE__ */ jsx22("span", {
|
|
5564
5802
|
className: "skippr:absolute skippr:-bottom-1 skippr:left-3 skippr:right-3 skippr:h-0.5 skippr:rounded-full skippr:bg-foreground"
|
|
5565
5803
|
})
|
|
5566
5804
|
]
|
|
5567
5805
|
})
|
|
5568
5806
|
]
|
|
5569
5807
|
}),
|
|
5570
|
-
/* @__PURE__ */
|
|
5808
|
+
/* @__PURE__ */ jsx22("div", {
|
|
5571
5809
|
className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col",
|
|
5572
|
-
children: isDisconnecting ? /* @__PURE__ */
|
|
5810
|
+
children: isDisconnecting ? /* @__PURE__ */ jsx22("div", {
|
|
5573
5811
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
|
|
5574
|
-
children: /* @__PURE__ */
|
|
5812
|
+
children: /* @__PURE__ */ jsx22(LoadingDots, {
|
|
5575
5813
|
label: "Ending session..."
|
|
5576
5814
|
})
|
|
5577
|
-
}) : inSession ? /* @__PURE__ */
|
|
5815
|
+
}) : inSession ? /* @__PURE__ */ jsxs17(Fragment3, {
|
|
5578
5816
|
children: [
|
|
5579
|
-
transitionLabel && /* @__PURE__ */
|
|
5817
|
+
transitionLabel && /* @__PURE__ */ jsx22("div", {
|
|
5580
5818
|
className: "skippr:shrink-0 skippr:border-b skippr:border-border skippr:bg-muted/50 skippr:px-3 skippr:py-1.5 skippr:text-center skippr:text-xs skippr:text-muted-foreground",
|
|
5581
5819
|
children: transitionLabel
|
|
5582
5820
|
}),
|
|
5583
|
-
/* @__PURE__ */
|
|
5821
|
+
/* @__PURE__ */ jsx22(ConnectedBody, {
|
|
5584
5822
|
activeTab: effectiveTab,
|
|
5585
5823
|
autoFocusChat
|
|
5586
5824
|
})
|
|
5587
5825
|
]
|
|
5588
|
-
}) : /* @__PURE__ */
|
|
5826
|
+
}) : /* @__PURE__ */ jsx22(IdleHistory, {
|
|
5589
5827
|
activeTab: effectiveTab,
|
|
5590
5828
|
history: idleHistory,
|
|
5591
5829
|
onTalk,
|
|
@@ -5594,22 +5832,22 @@ function AuthenticatedContent({
|
|
|
5594
5832
|
error
|
|
5595
5833
|
})
|
|
5596
5834
|
}),
|
|
5597
|
-
!hideControls && /* @__PURE__ */
|
|
5835
|
+
!hideControls && /* @__PURE__ */ jsx22("div", {
|
|
5598
5836
|
className: "skippr:shrink-0 skippr:border-t skippr:border-border",
|
|
5599
|
-
children: /* @__PURE__ */
|
|
5837
|
+
children: /* @__PURE__ */ jsxs17("div", {
|
|
5600
5838
|
className: "skippr:flex skippr:items-center skippr:justify-center skippr:gap-1 skippr:px-4 skippr:pt-1.5 skippr:pb-2 skippr:text-[10px] skippr:text-muted-foreground",
|
|
5601
5839
|
children: [
|
|
5602
|
-
/* @__PURE__ */
|
|
5840
|
+
/* @__PURE__ */ jsxs17("svg", {
|
|
5603
5841
|
viewBox: "21 21 109 109",
|
|
5604
5842
|
className: "skippr:size-3",
|
|
5605
5843
|
fill: "none",
|
|
5606
5844
|
"aria-hidden": "true",
|
|
5607
5845
|
children: [
|
|
5608
|
-
/* @__PURE__ */
|
|
5846
|
+
/* @__PURE__ */ jsx22("path", {
|
|
5609
5847
|
d: "M119.497 24C124.193 24 128 27.8071 128 32.5033V81.3974C128 83.0339 127.536 84.5616 126.735 85.8587L89.8936 57.4811L89.8943 57.4804C80.4203 50.1648 66.2971 56.7058 66.297 69.0147V89.9007H29.5033C24.8071 89.9007 21 86.0936 21 81.3974V32.5033C21 27.8071 24.8071 24 29.5033 24H119.497ZM76.2715 69.0147C76.2716 65.1724 80.7356 63.0111 83.7978 65.3755L115.637 89.9007H76.2715V69.0147Z",
|
|
5610
5848
|
fill: "currentColor"
|
|
5611
5849
|
}),
|
|
5612
|
-
/* @__PURE__ */
|
|
5850
|
+
/* @__PURE__ */ jsx22("path", {
|
|
5613
5851
|
d: "M83.7979 64.8856C80.7358 62.5211 76.2716 64.6824 76.2716 68.5247V120.892C76.2716 125.27 81.8518 127.191 84.5938 123.755L97.6194 107.437C98.1001 106.836 98.7119 106.35 99.4091 106.016C100.106 105.683 100.871 105.51 101.645 105.51H122.946C127.386 105.51 129.316 99.9436 125.81 97.2466L83.7979 64.8856Z",
|
|
5614
5852
|
className: "skippr:fill-brand"
|
|
5615
5853
|
})
|
|
@@ -5623,17 +5861,17 @@ function AuthenticatedContent({
|
|
|
5623
5861
|
});
|
|
5624
5862
|
}
|
|
5625
5863
|
function AuthError() {
|
|
5626
|
-
return /* @__PURE__ */
|
|
5864
|
+
return /* @__PURE__ */ jsxs17("div", {
|
|
5627
5865
|
className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:items-center skippr:justify-center skippr:px-6 skippr:py-4 skippr:text-center",
|
|
5628
5866
|
children: [
|
|
5629
|
-
/* @__PURE__ */
|
|
5867
|
+
/* @__PURE__ */ jsx22(CircleAlert, {
|
|
5630
5868
|
className: "skippr:mb-3 skippr:size-7 skippr:text-destructive"
|
|
5631
5869
|
}),
|
|
5632
|
-
/* @__PURE__ */
|
|
5870
|
+
/* @__PURE__ */ jsx22("p", {
|
|
5633
5871
|
className: "skippr:text-sm skippr:font-medium skippr:text-foreground",
|
|
5634
5872
|
children: "We couldn't verify your session"
|
|
5635
5873
|
}),
|
|
5636
|
-
/* @__PURE__ */
|
|
5874
|
+
/* @__PURE__ */ jsx22("p", {
|
|
5637
5875
|
className: "skippr:mt-1 skippr:text-xs skippr:text-muted-foreground",
|
|
5638
5876
|
children: "Please contact administrator."
|
|
5639
5877
|
})
|
|
@@ -5642,7 +5880,7 @@ function AuthError() {
|
|
|
5642
5880
|
}
|
|
5643
5881
|
function ConnectedBanner() {
|
|
5644
5882
|
const remaining = useSessionRemaining();
|
|
5645
|
-
return /* @__PURE__ */
|
|
5883
|
+
return /* @__PURE__ */ jsx22(SessionWarningBanner, {
|
|
5646
5884
|
remaining
|
|
5647
5885
|
});
|
|
5648
5886
|
}
|
|
@@ -5655,43 +5893,43 @@ function IdleHistory({
|
|
|
5655
5893
|
error
|
|
5656
5894
|
}) {
|
|
5657
5895
|
if (history2.isLoading) {
|
|
5658
|
-
return /* @__PURE__ */
|
|
5896
|
+
return /* @__PURE__ */ jsx22("div", {
|
|
5659
5897
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
|
|
5660
|
-
children: /* @__PURE__ */
|
|
5898
|
+
children: /* @__PURE__ */ jsx22(LoadingDots, {
|
|
5661
5899
|
label: "Loading conversation..."
|
|
5662
5900
|
})
|
|
5663
5901
|
});
|
|
5664
5902
|
}
|
|
5665
|
-
return /* @__PURE__ */
|
|
5903
|
+
return /* @__PURE__ */ jsxs17("div", {
|
|
5666
5904
|
className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col skippr:animate-skippr-tab-fade",
|
|
5667
5905
|
children: [
|
|
5668
|
-
activeTab === "agenda" ? /* @__PURE__ */
|
|
5906
|
+
activeTab === "agenda" ? /* @__PURE__ */ jsx22("div", {
|
|
5669
5907
|
className: "skippr:min-h-0 skippr:flex-1 skippr:overflow-y-auto",
|
|
5670
|
-
children: /* @__PURE__ */
|
|
5908
|
+
children: /* @__PURE__ */ jsx22(SessionAgenda, {
|
|
5671
5909
|
phases: history2.phases,
|
|
5672
5910
|
hasStarted: history2.phases.length > 0
|
|
5673
5911
|
})
|
|
5674
|
-
}) : /* @__PURE__ */
|
|
5912
|
+
}) : /* @__PURE__ */ jsx22(MessageList, {
|
|
5675
5913
|
messages: history2.messages,
|
|
5676
5914
|
isStreaming: false,
|
|
5677
5915
|
readOnly: true
|
|
5678
5916
|
}),
|
|
5679
|
-
/* @__PURE__ */
|
|
5917
|
+
/* @__PURE__ */ jsxs17("div", {
|
|
5680
5918
|
className: "skippr:shrink-0 skippr:border-t skippr:border-border skippr:p-3",
|
|
5681
5919
|
children: [
|
|
5682
|
-
/* @__PURE__ */
|
|
5920
|
+
/* @__PURE__ */ jsxs17("button", {
|
|
5683
5921
|
type: "button",
|
|
5684
5922
|
onClick: onTalk,
|
|
5685
5923
|
disabled: talkDisabled,
|
|
5686
5924
|
className: "skippr:flex skippr:w-full skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:gap-2 skippr:rounded-xl skippr:bg-primary skippr:px-4 skippr:py-3 skippr:font-semibold skippr:text-[13px] skippr:text-primary-foreground skippr:transition-colors skippr:hover:bg-primary/90 skippr:disabled:cursor-not-allowed skippr:disabled:opacity-50",
|
|
5687
5925
|
children: [
|
|
5688
|
-
/* @__PURE__ */
|
|
5926
|
+
/* @__PURE__ */ jsx22(Mic, {
|
|
5689
5927
|
className: "skippr:size-4"
|
|
5690
5928
|
}),
|
|
5691
5929
|
talkLabel
|
|
5692
5930
|
]
|
|
5693
5931
|
}),
|
|
5694
|
-
error && /* @__PURE__ */
|
|
5932
|
+
error && /* @__PURE__ */ jsx22("p", {
|
|
5695
5933
|
className: "skippr:mt-2 skippr:text-center skippr:text-xs skippr:text-destructive",
|
|
5696
5934
|
children: error
|
|
5697
5935
|
})
|
|
@@ -5710,17 +5948,17 @@ function ConnectedBody({
|
|
|
5710
5948
|
const { agentControls, isPaused } = useLiveAgent();
|
|
5711
5949
|
const { isHeld } = useSessionHoldContext();
|
|
5712
5950
|
if (activeTab === "agenda") {
|
|
5713
|
-
return /* @__PURE__ */
|
|
5951
|
+
return /* @__PURE__ */ jsx22("div", {
|
|
5714
5952
|
className: "skippr:min-h-0 skippr:flex-1 skippr:overflow-y-auto skippr:animate-skippr-tab-fade",
|
|
5715
|
-
children: /* @__PURE__ */
|
|
5953
|
+
children: /* @__PURE__ */ jsx22(SessionAgenda, {
|
|
5716
5954
|
phases,
|
|
5717
5955
|
hasStarted: allMessages.length > 0 || agentState === "speaking"
|
|
5718
5956
|
})
|
|
5719
5957
|
}, "agenda");
|
|
5720
5958
|
}
|
|
5721
|
-
return /* @__PURE__ */
|
|
5959
|
+
return /* @__PURE__ */ jsx22("div", {
|
|
5722
5960
|
className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col skippr:animate-skippr-tab-fade",
|
|
5723
|
-
children: /* @__PURE__ */
|
|
5961
|
+
children: /* @__PURE__ */ jsx22(MessageList, {
|
|
5724
5962
|
messages: allMessages,
|
|
5725
5963
|
isStreaming: agentState === "speaking",
|
|
5726
5964
|
sendChatMessage,
|
|
@@ -5733,12 +5971,12 @@ function ConnectedBody({
|
|
|
5733
5971
|
}
|
|
5734
5972
|
|
|
5735
5973
|
// src/components/SidebarTrigger.tsx
|
|
5736
|
-
import { useContext as
|
|
5974
|
+
import { useContext as useContext14 } from "react";
|
|
5737
5975
|
|
|
5738
5976
|
// src/components/Logo.tsx
|
|
5739
|
-
import { jsx as
|
|
5977
|
+
import { jsx as jsx23, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
5740
5978
|
function Logo({ className }) {
|
|
5741
|
-
return /* @__PURE__ */
|
|
5979
|
+
return /* @__PURE__ */ jsxs18("svg", {
|
|
5742
5980
|
width: "1em",
|
|
5743
5981
|
height: "1em",
|
|
5744
5982
|
viewBox: "0 0 200 200",
|
|
@@ -5748,20 +5986,20 @@ function Logo({ className }) {
|
|
|
5748
5986
|
"aria-label": "Skippr",
|
|
5749
5987
|
className,
|
|
5750
5988
|
children: [
|
|
5751
|
-
/* @__PURE__ */
|
|
5989
|
+
/* @__PURE__ */ jsx23("rect", {
|
|
5752
5990
|
width: "200",
|
|
5753
5991
|
height: "200",
|
|
5754
5992
|
rx: "40",
|
|
5755
5993
|
fill: "#2D2D3F"
|
|
5756
5994
|
}),
|
|
5757
|
-
/* @__PURE__ */
|
|
5995
|
+
/* @__PURE__ */ jsxs18("g", {
|
|
5758
5996
|
transform: "translate(100 100) scale(0.8) translate(-100 -100)",
|
|
5759
5997
|
children: [
|
|
5760
|
-
/* @__PURE__ */
|
|
5998
|
+
/* @__PURE__ */ jsx23("path", {
|
|
5761
5999
|
d: "M144.497 59C149.193 59 153 62.8071 153 67.5033V116.397C153 118.034 152.536 119.562 151.735 120.859L114.894 92.4811L114.894 92.4804C105.42 85.1648 91.2971 91.7058 91.297 104.015V124.901H54.5033C49.8071 124.901 46 121.094 46 116.397V67.5033C46 62.8071 49.8071 59 54.5033 59H144.497ZM101.272 104.015C101.272 100.172 105.736 98.0111 108.798 100.375L140.637 124.901H101.272V104.015Z",
|
|
5762
6000
|
fill: "white"
|
|
5763
6001
|
}),
|
|
5764
|
-
/* @__PURE__ */
|
|
6002
|
+
/* @__PURE__ */ jsx23("path", {
|
|
5765
6003
|
d: "M108.798 99.8856C105.736 97.5211 101.271 99.6824 101.271 103.525V155.892C101.271 160.27 106.852 162.191 109.594 158.755L122.619 142.437C123.1 141.836 123.712 141.35 124.409 141.016C125.106 140.683 125.871 140.51 126.645 140.51H147.946C152.386 140.51 154.316 134.944 150.81 132.247L108.798 99.8856Z",
|
|
5766
6004
|
className: "skippr:fill-brand"
|
|
5767
6005
|
})
|
|
@@ -5772,7 +6010,7 @@ function Logo({ className }) {
|
|
|
5772
6010
|
}
|
|
5773
6011
|
|
|
5774
6012
|
// src/components/SidebarTrigger.tsx
|
|
5775
|
-
import { jsx as
|
|
6013
|
+
import { jsx as jsx24 } from "react/jsx-runtime";
|
|
5776
6014
|
function SidebarTrigger() {
|
|
5777
6015
|
const {
|
|
5778
6016
|
isPanelOpen,
|
|
@@ -5785,29 +6023,29 @@ function SidebarTrigger() {
|
|
|
5785
6023
|
isStarting,
|
|
5786
6024
|
isPausing
|
|
5787
6025
|
} = useLiveAgent();
|
|
5788
|
-
const internalCtx =
|
|
6026
|
+
const internalCtx = useContext14(LiveAgentContext);
|
|
5789
6027
|
const launcherBottomPx = internalCtx?.launcherBottomPx ?? DEFAULT_LAUNCHER_BOTTOM_PX;
|
|
5790
6028
|
const popsDown = internalCtx?.popsDown ?? false;
|
|
5791
6029
|
if (isMinimized || isConnected || isStarting || isPausing)
|
|
5792
6030
|
return null;
|
|
5793
6031
|
const handleClick = isPanelOpen && minimizable ? minimizePanel : togglePanel;
|
|
5794
|
-
return /* @__PURE__ */
|
|
6032
|
+
return /* @__PURE__ */ jsx24("button", {
|
|
5795
6033
|
type: "button",
|
|
5796
6034
|
onClick: handleClick,
|
|
5797
6035
|
title: isPanelOpen ? "Close chat" : "Open chat",
|
|
5798
6036
|
"aria-label": isPanelOpen ? "Close chat" : "Open chat",
|
|
5799
6037
|
style: { bottom: triggerBottomPx(launcherBottomPx, popsDown) },
|
|
5800
6038
|
className: cn("skippr:fixed skippr:z-[9998]", "skippr:flex skippr:size-12 skippr:items-center skippr:justify-center", "skippr:shadow-[0_4px_16px_rgba(45,43,61,0.45),0_2px_4px_rgba(0,0,0,0.1)] skippr:transition-all", "skippr:cursor-pointer skippr:hover:brightness-110 skippr:hover:-translate-y-0.5 skippr:active:translate-y-0", isPanelOpen ? "skippr:rounded-[14px] skippr:bg-bubble skippr:text-white" : "skippr:rounded-[10px] skippr:overflow-hidden", position === "right" ? "skippr:right-6" : "skippr:left-6"),
|
|
5801
|
-
children: isPanelOpen ? /* @__PURE__ */
|
|
6039
|
+
children: isPanelOpen ? /* @__PURE__ */ jsx24(ChevronDown, {
|
|
5802
6040
|
className: "skippr:size-5"
|
|
5803
|
-
}) : /* @__PURE__ */
|
|
6041
|
+
}) : /* @__PURE__ */ jsx24(Logo, {
|
|
5804
6042
|
className: "skippr:size-12"
|
|
5805
6043
|
})
|
|
5806
6044
|
});
|
|
5807
6045
|
}
|
|
5808
6046
|
|
|
5809
6047
|
// src/components/LiveAgent.tsx
|
|
5810
|
-
import { jsx as
|
|
6048
|
+
import { jsx as jsx25, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
5811
6049
|
function readSavedLauncherBottom() {
|
|
5812
6050
|
try {
|
|
5813
6051
|
const saved = Number.parseInt(localStorage.getItem("skippr_widget_bottom") ?? "", 10);
|
|
@@ -5817,7 +6055,7 @@ function readSavedLauncherBottom() {
|
|
|
5817
6055
|
}
|
|
5818
6056
|
}
|
|
5819
6057
|
function AgentCursorMount({ animated }) {
|
|
5820
|
-
return /* @__PURE__ */
|
|
6058
|
+
return /* @__PURE__ */ jsx25(AgentCursor, {
|
|
5821
6059
|
target: useAgentCursor(),
|
|
5822
6060
|
animated
|
|
5823
6061
|
});
|
|
@@ -5825,8 +6063,8 @@ function AgentCursorMount({ animated }) {
|
|
|
5825
6063
|
function PlanPanelOpener() {
|
|
5826
6064
|
const plan = usePlanUpdates();
|
|
5827
6065
|
const { expandPanel } = useLiveAgent();
|
|
5828
|
-
const surfacedPlanIdRef =
|
|
5829
|
-
|
|
6066
|
+
const surfacedPlanIdRef = useRef21(null);
|
|
6067
|
+
useEffect28(() => {
|
|
5830
6068
|
if (plan?.state !== "proposed" || surfacedPlanIdRef.current === plan.planId)
|
|
5831
6069
|
return;
|
|
5832
6070
|
surfacedPlanIdRef.current = plan.planId;
|
|
@@ -5866,18 +6104,18 @@ function LiveAgent(props) {
|
|
|
5866
6104
|
const auth = useAuth({ appKey });
|
|
5867
6105
|
const usesHostAuth = !!getUserToken || !!userToken || !!authTokenProp;
|
|
5868
6106
|
const effectiveAuthToken = usesHostAuth ? authTokenProp : auth.authToken ?? undefined;
|
|
5869
|
-
const [activeModule, setActiveModule] =
|
|
5870
|
-
const minimizeOnSessionStart =
|
|
6107
|
+
const [activeModule, setActiveModule] = useState20(null);
|
|
6108
|
+
const minimizeOnSessionStart = useCallback17(() => {
|
|
5871
6109
|
if (minimizable) {
|
|
5872
6110
|
setIsMinimized(true);
|
|
5873
6111
|
setIsPanelOpen(false);
|
|
5874
6112
|
}
|
|
5875
6113
|
}, [minimizable]);
|
|
5876
|
-
const expandOnSessionStartError =
|
|
6114
|
+
const expandOnSessionStartError = useCallback17(() => {
|
|
5877
6115
|
setIsMinimized(false);
|
|
5878
6116
|
setIsPanelOpen(true);
|
|
5879
6117
|
}, []);
|
|
5880
|
-
const minimizeOnSessionDisconnect =
|
|
6118
|
+
const minimizeOnSessionDisconnect = useCallback17(() => {
|
|
5881
6119
|
setActiveModule(null);
|
|
5882
6120
|
if (minimizable) {
|
|
5883
6121
|
setIsMinimized(true);
|
|
@@ -5912,30 +6150,30 @@ function LiveAgent(props) {
|
|
|
5912
6150
|
onStartError: expandOnSessionStartError,
|
|
5913
6151
|
onDisconnect: minimizeOnSessionDisconnect
|
|
5914
6152
|
});
|
|
5915
|
-
const teardownInFlightRef =
|
|
6153
|
+
const teardownInFlightRef = useRef21(false);
|
|
5916
6154
|
teardownInFlightRef.current = isPaused || isPausing || isDisconnecting;
|
|
5917
|
-
const handleRoomDisconnected =
|
|
6155
|
+
const handleRoomDisconnected = useCallback17(() => {
|
|
5918
6156
|
if (teardownInFlightRef.current)
|
|
5919
6157
|
return;
|
|
5920
6158
|
disconnect();
|
|
5921
6159
|
}, [disconnect]);
|
|
5922
6160
|
const isSessionLive = connection !== null || isStarting || isPausing || isDisconnecting;
|
|
5923
|
-
const [isPanelOpen, setIsPanelOpen] =
|
|
5924
|
-
const [isMinimized, setIsMinimized] =
|
|
5925
|
-
const [sidebarTab, setSidebarTab] =
|
|
5926
|
-
const [phasesSnapshot, setPhasesSnapshot] =
|
|
5927
|
-
const [textMode, setTextMode] =
|
|
5928
|
-
const [panelExpanded, setPanelExpanded] =
|
|
5929
|
-
const togglePanelExpanded =
|
|
5930
|
-
const panelRef =
|
|
5931
|
-
const controlBarRef =
|
|
5932
|
-
const [isDragging, setIsDragging] =
|
|
5933
|
-
const setTextModeState =
|
|
6161
|
+
const [isPanelOpen, setIsPanelOpen] = useState20(defaultOpen);
|
|
6162
|
+
const [isMinimized, setIsMinimized] = useState20(minimizable && !defaultOpen);
|
|
6163
|
+
const [sidebarTab, setSidebarTab] = useState20("agenda");
|
|
6164
|
+
const [phasesSnapshot, setPhasesSnapshot] = useState20([]);
|
|
6165
|
+
const [textMode, setTextMode] = useState20(false);
|
|
6166
|
+
const [panelExpanded, setPanelExpanded] = useState20(false);
|
|
6167
|
+
const togglePanelExpanded = useCallback17(() => setPanelExpanded((prev) => !prev), []);
|
|
6168
|
+
const panelRef = useRef21(null);
|
|
6169
|
+
const controlBarRef = useRef21(null);
|
|
6170
|
+
const [isDragging, setIsDragging] = useState20(false);
|
|
6171
|
+
const setTextModeState = useCallback17((enabled) => {
|
|
5934
6172
|
setTextMode(enabled);
|
|
5935
6173
|
}, []);
|
|
5936
6174
|
const isConnected = connection !== null;
|
|
5937
6175
|
const showControlBar = isConnected || isStarting || isPausing;
|
|
5938
|
-
|
|
6176
|
+
useEffect28(() => {
|
|
5939
6177
|
if (!isConnected)
|
|
5940
6178
|
setTextModeState(false);
|
|
5941
6179
|
}, [isConnected, setTextModeState]);
|
|
@@ -5963,7 +6201,7 @@ function LiveAgent(props) {
|
|
|
5963
6201
|
const agentMode = operatingModule?.mode ?? null;
|
|
5964
6202
|
const shouldAnimateCursor = operatingModule?.uiPreferences?.animateCursor ?? animateAgentCursor;
|
|
5965
6203
|
const resumableSession = useMemo7(() => getResumableSession(operatingModule), [operatingModule]);
|
|
5966
|
-
const resumeSession =
|
|
6204
|
+
const resumeSession = useCallback17(async () => {
|
|
5967
6205
|
if (!resumableSession)
|
|
5968
6206
|
return;
|
|
5969
6207
|
await startSession({
|
|
@@ -5972,7 +6210,7 @@ function LiveAgent(props) {
|
|
|
5972
6210
|
existingSessionId: resumableSession.id
|
|
5973
6211
|
});
|
|
5974
6212
|
}, [resumableSession, startSession, agentControls]);
|
|
5975
|
-
const selectModule =
|
|
6213
|
+
const selectModule = useCallback17((moduleId, opts) => {
|
|
5976
6214
|
const found = availableModules.find((m) => m.id === moduleId);
|
|
5977
6215
|
if (!found)
|
|
5978
6216
|
return;
|
|
@@ -5984,7 +6222,7 @@ function LiveAgent(props) {
|
|
|
5984
6222
|
autoStarted: opts?.autoStarted
|
|
5985
6223
|
});
|
|
5986
6224
|
}, [availableModules, startSession]);
|
|
5987
|
-
const startAdoptionSession =
|
|
6225
|
+
const startAdoptionSession = useCallback17((goal) => {
|
|
5988
6226
|
attendGoal(goal.goalId);
|
|
5989
6227
|
const found = availableModules.find((m) => m.id === goal.agentId);
|
|
5990
6228
|
if (found)
|
|
@@ -5995,9 +6233,9 @@ function LiveAgent(props) {
|
|
|
5995
6233
|
adoptionGoalId: goal.goalId
|
|
5996
6234
|
});
|
|
5997
6235
|
}, [attendGoal, availableModules, startSession]);
|
|
5998
|
-
const [welcomeDismissed, setWelcomeDismissed] =
|
|
5999
|
-
const dismissWelcome =
|
|
6000
|
-
const [currentPosition, setCurrentPosition] =
|
|
6236
|
+
const [welcomeDismissed, setWelcomeDismissed] = useState20(false);
|
|
6237
|
+
const dismissWelcome = useCallback17(() => setWelcomeDismissed(true), []);
|
|
6238
|
+
const [currentPosition, setCurrentPosition] = useState20(() => {
|
|
6001
6239
|
try {
|
|
6002
6240
|
const saved = localStorage.getItem("skippr_widget_position");
|
|
6003
6241
|
if (saved === "left" || saved === "right")
|
|
@@ -6005,18 +6243,18 @@ function LiveAgent(props) {
|
|
|
6005
6243
|
} catch {}
|
|
6006
6244
|
return position;
|
|
6007
6245
|
});
|
|
6008
|
-
const setPositionWithPersist =
|
|
6246
|
+
const setPositionWithPersist = useCallback17((pos) => {
|
|
6009
6247
|
setCurrentPosition(pos);
|
|
6010
6248
|
try {
|
|
6011
6249
|
localStorage.setItem("skippr_widget_position", pos);
|
|
6012
6250
|
} catch {}
|
|
6013
6251
|
}, []);
|
|
6014
6252
|
const savedLauncherBottom = readSavedLauncherBottom();
|
|
6015
|
-
const hasDraggedRef =
|
|
6016
|
-
const verticalAlignRef =
|
|
6017
|
-
const [launcherBottomPx, setLauncherBottomPxState] =
|
|
6018
|
-
const [popsDown, setPopsDown] =
|
|
6019
|
-
const setLauncherBottomPx =
|
|
6253
|
+
const hasDraggedRef = useRef21(savedLauncherBottom !== null);
|
|
6254
|
+
const verticalAlignRef = useRef21(verticalAlign);
|
|
6255
|
+
const [launcherBottomPx, setLauncherBottomPxState] = useState20(() => savedLauncherBottom !== null ? clampLauncherBottom(savedLauncherBottom) : verticalAlignToBottomPx(verticalAlign));
|
|
6256
|
+
const [popsDown, setPopsDown] = useState20(() => launcherPopsDown(launcherBottomPx));
|
|
6257
|
+
const setLauncherBottomPx = useCallback17((px) => {
|
|
6020
6258
|
hasDraggedRef.current = true;
|
|
6021
6259
|
setLauncherBottomPxState(px);
|
|
6022
6260
|
setPopsDown(launcherPopsDown(px));
|
|
@@ -6024,13 +6262,13 @@ function LiveAgent(props) {
|
|
|
6024
6262
|
localStorage.setItem("skippr_widget_bottom", String(px));
|
|
6025
6263
|
} catch {}
|
|
6026
6264
|
}, []);
|
|
6027
|
-
const launcherBottomPxRef =
|
|
6265
|
+
const launcherBottomPxRef = useRef21(launcherBottomPx);
|
|
6028
6266
|
launcherBottomPxRef.current = launcherBottomPx;
|
|
6029
|
-
const commitLauncherDrop =
|
|
6267
|
+
const commitLauncherDrop = useCallback17(({ side, bottomPx }) => {
|
|
6030
6268
|
setPositionWithPersist(side);
|
|
6031
6269
|
setLauncherBottomPx(bottomPx);
|
|
6032
6270
|
}, [setPositionWithPersist, setLauncherBottomPx]);
|
|
6033
|
-
|
|
6271
|
+
useEffect28(() => {
|
|
6034
6272
|
const syncToViewport = () => {
|
|
6035
6273
|
const next = hasDraggedRef.current ? clampLauncherBottom(launcherBottomPxRef.current) : verticalAlignToBottomPx(verticalAlignRef.current);
|
|
6036
6274
|
setLauncherBottomPxState(next);
|
|
@@ -6040,26 +6278,26 @@ function LiveAgent(props) {
|
|
|
6040
6278
|
window.addEventListener("resize", syncToViewport);
|
|
6041
6279
|
return () => window.removeEventListener("resize", syncToViewport);
|
|
6042
6280
|
}, []);
|
|
6043
|
-
const openPanel =
|
|
6044
|
-
const closePanel =
|
|
6045
|
-
const togglePanel =
|
|
6046
|
-
const expandPanel =
|
|
6281
|
+
const openPanel = useCallback17(() => setIsPanelOpen(true), []);
|
|
6282
|
+
const closePanel = useCallback17(() => setIsPanelOpen(false), []);
|
|
6283
|
+
const togglePanel = useCallback17(() => setIsPanelOpen((prev) => !prev), []);
|
|
6284
|
+
const expandPanel = useCallback17(() => {
|
|
6047
6285
|
setIsMinimized(false);
|
|
6048
6286
|
setIsPanelOpen(true);
|
|
6049
6287
|
}, []);
|
|
6050
|
-
const minimizePanel =
|
|
6288
|
+
const minimizePanel = useCallback17(() => {
|
|
6051
6289
|
if (!minimizable)
|
|
6052
6290
|
return;
|
|
6053
6291
|
setIsMinimized(true);
|
|
6054
6292
|
setIsPanelOpen(false);
|
|
6055
6293
|
}, [minimizable]);
|
|
6056
|
-
const pauseSessionAndMinimize =
|
|
6294
|
+
const pauseSessionAndMinimize = useCallback17(async () => {
|
|
6057
6295
|
await pauseSession();
|
|
6058
6296
|
minimizePanel();
|
|
6059
6297
|
}, [pauseSession, minimizePanel]);
|
|
6060
6298
|
const isAuthenticated = bearerToken !== null || auth.isAuthenticated;
|
|
6061
6299
|
const defaultAgentId = hostAgentId ?? defaultSelection.agentId;
|
|
6062
|
-
const startDefaultSession =
|
|
6300
|
+
const startDefaultSession = useCallback17(() => {
|
|
6063
6301
|
const target = availableModules.find((m) => m.id === defaultAgentId);
|
|
6064
6302
|
if (!target)
|
|
6065
6303
|
return;
|
|
@@ -6222,45 +6460,52 @@ function LiveAgent(props) {
|
|
|
6222
6460
|
adoptionGoals,
|
|
6223
6461
|
startAdoptionSession
|
|
6224
6462
|
]);
|
|
6225
|
-
return /* @__PURE__ */
|
|
6463
|
+
return /* @__PURE__ */ jsx25(LiveAgentContext.Provider, {
|
|
6226
6464
|
value: ctx,
|
|
6227
|
-
children: /* @__PURE__ */
|
|
6465
|
+
children: /* @__PURE__ */ jsxs19(LiveKitRoom, {
|
|
6228
6466
|
serverUrl: connection?.livekitUrl,
|
|
6229
6467
|
token: connection?.token,
|
|
6230
6468
|
connect: shouldConnect,
|
|
6231
6469
|
audio: true,
|
|
6232
6470
|
onDisconnected: handleRoomDisconnected,
|
|
6233
6471
|
children: [
|
|
6234
|
-
connection && !textMode && /* @__PURE__ */
|
|
6235
|
-
connection && captureMode === CAPTURE_MODE.Screenshare && /* @__PURE__ */
|
|
6236
|
-
pendingScreenStream
|
|
6472
|
+
connection && !textMode && /* @__PURE__ */ jsx25(RoomAudioRenderer, {}),
|
|
6473
|
+
connection && captureMode === CAPTURE_MODE.Screenshare && /* @__PURE__ */ jsx25(AutoStartMedia, {
|
|
6474
|
+
pendingScreenStream,
|
|
6475
|
+
tapToTalk: agentControls?.tapToTalk === true
|
|
6237
6476
|
}),
|
|
6238
|
-
connection && captureMode === CAPTURE_MODE.Auto && /* @__PURE__ */
|
|
6239
|
-
|
|
6477
|
+
connection && captureMode === CAPTURE_MODE.Auto && /* @__PURE__ */ jsx25(DomCapture, {
|
|
6478
|
+
tapToTalk: agentControls?.tapToTalk === true
|
|
6479
|
+
}),
|
|
6480
|
+
/* @__PURE__ */ jsxs19(ShadowHost, {
|
|
6240
6481
|
children: [
|
|
6241
|
-
connection && captureMode === CAPTURE_MODE.Auto && agentControls?.highlight && /* @__PURE__ */
|
|
6242
|
-
connection && captureMode === CAPTURE_MODE.Auto && agentControls?.actions && /* @__PURE__ */
|
|
6243
|
-
connection && captureMode === CAPTURE_MODE.Auto && agentControls?.actions && /* @__PURE__ */
|
|
6244
|
-
connection && captureMode === CAPTURE_MODE.Auto && (agentControls?.highlight || agentControls?.actions) && /* @__PURE__ */
|
|
6482
|
+
connection && captureMode === CAPTURE_MODE.Auto && agentControls?.highlight && /* @__PURE__ */ jsx25(HighlightOverlay, {}),
|
|
6483
|
+
connection && captureMode === CAPTURE_MODE.Auto && agentControls?.actions && /* @__PURE__ */ jsx25(PageActionHandler, {}),
|
|
6484
|
+
connection && captureMode === CAPTURE_MODE.Auto && agentControls?.actions && /* @__PURE__ */ jsx25(PlanPanelOpener, {}),
|
|
6485
|
+
connection && captureMode === CAPTURE_MODE.Auto && (agentControls?.highlight || agentControls?.actions) && /* @__PURE__ */ jsx25(AgentCursorMount, {
|
|
6245
6486
|
animated: shouldAnimateCursor
|
|
6246
6487
|
}),
|
|
6247
|
-
/* @__PURE__ */
|
|
6248
|
-
children: /* @__PURE__ */
|
|
6249
|
-
|
|
6250
|
-
|
|
6251
|
-
|
|
6252
|
-
|
|
6253
|
-
|
|
6254
|
-
|
|
6255
|
-
|
|
6256
|
-
|
|
6257
|
-
|
|
6258
|
-
|
|
6259
|
-
|
|
6260
|
-
|
|
6261
|
-
|
|
6488
|
+
/* @__PURE__ */ jsx25(SessionHoldProvider, {
|
|
6489
|
+
children: /* @__PURE__ */ jsx25(TapToTalkProvider, {
|
|
6490
|
+
children: /* @__PURE__ */ jsx25(TranscriptionsProvider, {
|
|
6491
|
+
children: /* @__PURE__ */ jsxs19("div", {
|
|
6492
|
+
id: WIDGET_ROOT_ID,
|
|
6493
|
+
children: [
|
|
6494
|
+
isMinimized && !showControlBar && /* @__PURE__ */ jsx25(MinimizedBubble, {
|
|
6495
|
+
welcomeMessage,
|
|
6496
|
+
welcomeDismissed,
|
|
6497
|
+
onDismissWelcome: dismissWelcome
|
|
6498
|
+
}),
|
|
6499
|
+
showControlBar && !hideControls && /* @__PURE__ */ jsx25(SessionControlBar, {}),
|
|
6500
|
+
/* @__PURE__ */ jsx25(SidebarTrigger, {}),
|
|
6501
|
+
/* @__PURE__ */ jsx25(Sidebar, {
|
|
6502
|
+
hideControls,
|
|
6503
|
+
hideHeader,
|
|
6504
|
+
startSessionLabel
|
|
6505
|
+
})
|
|
6506
|
+
]
|
|
6262
6507
|
})
|
|
6263
|
-
|
|
6508
|
+
})
|
|
6264
6509
|
})
|
|
6265
6510
|
})
|
|
6266
6511
|
]
|
|
@@ -6271,9 +6516,9 @@ function LiveAgent(props) {
|
|
|
6271
6516
|
});
|
|
6272
6517
|
}
|
|
6273
6518
|
// src/hooks/useIsLocalSpeaking.ts
|
|
6274
|
-
import { useIsSpeaking, useLocalParticipant as
|
|
6519
|
+
import { useIsSpeaking, useLocalParticipant as useLocalParticipant12 } from "@livekit/components-react/hooks";
|
|
6275
6520
|
function useIsLocalSpeaking() {
|
|
6276
|
-
const { localParticipant } =
|
|
6521
|
+
const { localParticipant } = useLocalParticipant12();
|
|
6277
6522
|
return useIsSpeaking(localParticipant);
|
|
6278
6523
|
}
|
|
6279
6524
|
export {
|