@skippr/live-agent-sdk 0.82.0 → 0.84.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.
@@ -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 useCallback18, useEffect as useEffect29, useMemo as useMemo7, useRef as useRef23, useState as useState21 } from "react";
11
+ import { useCallback as useCallback18, useEffect as useEffect30, useMemo as useMemo7, useRef as useRef25, useState as useState22 } from "react";
12
12
 
13
13
  // src/capture/useAgentCursor.ts
14
14
  import { useEffect, useState } from "react";
@@ -118,42 +118,177 @@ function useLiveAgent() {
118
118
  }
119
119
 
120
120
  // src/hooks/useSessionHold.ts
121
+ import { useLocalParticipant as useLocalParticipant2 } from "@livekit/components-react/hooks";
122
+ import { Track } from "livekit-client";
123
+ import { useCallback as useCallback2, useEffect as useEffect2, useRef, useState as useState2 } from "react";
124
+
125
+ // src/capture/pausedScreenTrack.ts
126
+ var FALLBACK_WIDTH = 1280;
127
+ var FALLBACK_HEIGHT = 720;
128
+ var DIM_OVERLAY = "rgba(15, 15, 20, 0.55)";
129
+ var AMBER = "#F5B300";
130
+ var LABEL = "Paused";
131
+ var PAUSED_FRAME_FPS = 30;
132
+ var LAST_FRAME_READY_TIMEOUT_MS = 500;
133
+ function drawPausedOverlay(canvas, ctx) {
134
+ const { width, height } = canvas;
135
+ ctx.fillStyle = DIM_OVERLAY;
136
+ ctx.fillRect(0, 0, width, height);
137
+ const fontSize = Math.round(height * 0.07);
138
+ ctx.font = `600 ${fontSize}px system-ui, sans-serif`;
139
+ ctx.textAlign = "center";
140
+ ctx.textBaseline = "middle";
141
+ ctx.fillStyle = AMBER;
142
+ ctx.fillText(LABEL, width / 2, height / 2);
143
+ }
144
+ async function drawLiveScreenFrameInto(ctx, sourceTrack, width, height) {
145
+ const video = document.createElement("video");
146
+ video.muted = true;
147
+ video.srcObject = new MediaStream([sourceTrack]);
148
+ try {
149
+ await video.play();
150
+ await waitForDecodedFrame(video);
151
+ ctx.drawImage(video, 0, 0, width, height);
152
+ return true;
153
+ } catch {
154
+ return false;
155
+ } finally {
156
+ video.srcObject = null;
157
+ }
158
+ }
159
+ async function waitForDecodedFrame(video) {
160
+ if (video.readyState >= video.HAVE_CURRENT_DATA)
161
+ return;
162
+ await new Promise((resolve) => {
163
+ const timeout = setTimeout(resolve, LAST_FRAME_READY_TIMEOUT_MS);
164
+ video.addEventListener("loadeddata", () => {
165
+ clearTimeout(timeout);
166
+ resolve();
167
+ }, { once: true });
168
+ });
169
+ }
170
+ async function createPausedScreenTrack(sourceTrack) {
171
+ const settings = sourceTrack.getSettings();
172
+ const width = settings.width ?? FALLBACK_WIDTH;
173
+ const height = settings.height ?? FALLBACK_HEIGHT;
174
+ const canvas = document.createElement("canvas");
175
+ canvas.width = width;
176
+ canvas.height = height;
177
+ const ctx = canvas.getContext("2d");
178
+ if (!ctx)
179
+ return null;
180
+ const captureStream = canvas.captureStream;
181
+ if (typeof captureStream !== "function")
182
+ return null;
183
+ const capturedLiveFrame = await drawLiveScreenFrameInto(ctx, sourceTrack, width, height);
184
+ if (!capturedLiveFrame) {
185
+ ctx.fillStyle = "#0f0f14";
186
+ ctx.fillRect(0, 0, width, height);
187
+ }
188
+ drawPausedOverlay(canvas, ctx);
189
+ const track = captureStream.call(canvas, PAUSED_FRAME_FPS).getVideoTracks()[0] ?? null;
190
+ if (!track)
191
+ return null;
192
+ track.contentHint = "text";
193
+ return track;
194
+ }
195
+
196
+ // src/hooks/useMediaControls.ts
121
197
  import { useLocalParticipant } from "@livekit/components-react/hooks";
122
- import { useCallback, useEffect as useEffect2, useState as useState2 } from "react";
198
+ import { ScreenSharePresets } from "livekit-client";
199
+ import { useCallback } from "react";
200
+ var SCREEN_SHARE_OPTIONS = {
201
+ video: { displaySurface: "browser" },
202
+ resolution: ScreenSharePresets.h720fps30.resolution,
203
+ contentHint: "detail"
204
+ };
205
+ function useMediaControls() {
206
+ const { localParticipant } = useLocalParticipant();
207
+ const isMuted = !localParticipant.isMicrophoneEnabled;
208
+ const isScreenSharing = localParticipant.isScreenShareEnabled;
209
+ const toggleMute = useCallback(async () => {
210
+ try {
211
+ await localParticipant.setMicrophoneEnabled(isMuted);
212
+ } catch (error) {
213
+ console.error("Failed to toggle microphone:", error);
214
+ }
215
+ }, [localParticipant, isMuted]);
216
+ const toggleScreenShare = useCallback(async () => {
217
+ try {
218
+ await localParticipant.setScreenShareEnabled(!isScreenSharing, SCREEN_SHARE_OPTIONS);
219
+ } catch (error) {
220
+ console.error("Failed to toggle screen share:", error);
221
+ }
222
+ }, [localParticipant, isScreenSharing]);
223
+ return { isMuted, toggleMute, isScreenSharing, toggleScreenShare };
224
+ }
225
+
226
+ // src/hooks/useSessionHold.ts
123
227
  var textEncoder = new TextEncoder;
124
228
  var FALLBACK_PAUSE_TIMEOUT_SECONDS = 120;
125
229
  function useSessionHold({
126
230
  pauseSession,
127
- pauseTimeoutSeconds
231
+ pauseTimeoutSeconds,
232
+ captureMode
128
233
  }) {
129
- const { localParticipant } = useLocalParticipant();
234
+ const { localParticipant } = useLocalParticipant2();
130
235
  const timeoutSeconds = pauseTimeoutSeconds ?? FALLBACK_PAUSE_TIMEOUT_SECONDS;
131
236
  const [isHeld, setIsHeld] = useState2(false);
132
237
  const [countdown, setCountdown] = useState2(timeoutSeconds);
133
- const publish = useCallback(async (type) => {
238
+ const screenWasSharedBeforeHoldRef = useRef(false);
239
+ const holdTransitionInFlightRef = useRef(false);
240
+ const publish = useCallback2(async (type) => {
134
241
  await localParticipant.publishData(textEncoder.encode(JSON.stringify({ type })), {
135
242
  reliable: true,
136
243
  topic: SESSION_HOLD_TOPIC
137
244
  });
138
245
  }, [localParticipant]);
139
- const hold = useCallback(async () => {
246
+ const screenShareTrack = useCallback2(() => {
247
+ return localParticipant.getTrackPublication(Track.Source.ScreenShare)?.videoTrack;
248
+ }, [localParticipant]);
249
+ const pauseScreenShareForHold = useCallback2(async () => {
250
+ if (captureMode !== CAPTURE_MODE.Screenshare)
251
+ return;
252
+ screenWasSharedBeforeHoldRef.current = localParticipant.isScreenShareEnabled;
253
+ const track = screenShareTrack();
254
+ const liveScreenTrack = track?.mediaStreamTrack;
255
+ if (!track || !liveScreenTrack)
256
+ return;
257
+ const pausedFrame = await createPausedScreenTrack(liveScreenTrack);
258
+ if (pausedFrame)
259
+ await track.replaceTrack(pausedFrame);
260
+ liveScreenTrack.stop();
261
+ }, [captureMode, localParticipant, screenShareTrack]);
262
+ const resumeScreenShareOnResume = useCallback2(async () => {
263
+ if (captureMode !== CAPTURE_MODE.Screenshare || !screenWasSharedBeforeHoldRef.current)
264
+ return;
265
+ await localParticipant.setScreenShareEnabled(false);
266
+ await localParticipant.setScreenShareEnabled(true, SCREEN_SHARE_OPTIONS);
267
+ }, [captureMode, localParticipant]);
268
+ const micTrack = useCallback2(() => {
269
+ return localParticipant.getTrackPublication(Track.Source.Microphone)?.audioTrack;
270
+ }, [localParticipant]);
271
+ const hold = useCallback2(async () => {
140
272
  try {
141
273
  await localParticipant.setMicrophoneEnabled(false);
274
+ micTrack()?.mediaStreamTrack?.stop();
275
+ await pauseScreenShareForHold();
142
276
  await publish("pause");
143
277
  setIsHeld(true);
144
278
  } catch (error) {
145
279
  console.error("Failed to hold session:", error);
146
280
  }
147
- }, [localParticipant, publish]);
148
- const release = useCallback(async () => {
281
+ }, [localParticipant, publish, pauseScreenShareForHold, micTrack]);
282
+ const release = useCallback2(async () => {
149
283
  try {
150
284
  await localParticipant.setMicrophoneEnabled(true);
285
+ await resumeScreenShareOnResume();
151
286
  await publish("resume");
152
287
  setIsHeld(false);
153
288
  } catch (error) {
154
289
  console.error("Failed to release session:", error);
155
290
  }
156
- }, [localParticipant, publish]);
291
+ }, [localParticipant, publish, resumeScreenShareOnResume]);
157
292
  useEffect2(() => {
158
293
  if (!isHeld) {
159
294
  setCountdown(timeoutSeconds);
@@ -170,12 +305,14 @@ function useSessionHold({
170
305
  pauseSession();
171
306
  }
172
307
  }, [isHeld, countdown, pauseSession]);
173
- const toggle = useCallback(() => {
174
- if (isHeld) {
175
- release();
176
- } else {
177
- hold();
178
- }
308
+ const toggle = useCallback2(() => {
309
+ if (holdTransitionInFlightRef.current)
310
+ return;
311
+ holdTransitionInFlightRef.current = true;
312
+ const transition = isHeld ? release : hold;
313
+ transition().finally(() => {
314
+ holdTransitionInFlightRef.current = false;
315
+ });
179
316
  }, [isHeld, hold, release]);
180
317
  return { isHeld, countdown, toggle };
181
318
  }
@@ -195,7 +332,8 @@ function SessionHoldProvider({ children }) {
195
332
  }
196
333
  const hold = useSessionHold({
197
334
  pauseSession,
198
- pauseTimeoutSeconds: internalCtx.pauseTimeoutSeconds
335
+ pauseTimeoutSeconds: internalCtx.pauseTimeoutSeconds,
336
+ captureMode: internalCtx.captureMode
199
337
  });
200
338
  return /* @__PURE__ */ jsx(SessionHoldContext.Provider, {
201
339
  value: hold,
@@ -226,20 +364,20 @@ function useSharedTranscriptions() {
226
364
  import { createContext as createContext4, useContext as useContext4 } from "react";
227
365
 
228
366
  // src/hooks/useVoiceTurn.ts
229
- import { useLocalParticipant as useLocalParticipant2 } from "@livekit/components-react/hooks";
230
- import { useCallback as useCallback2, useRef, useState as useState3 } from "react";
367
+ import { useLocalParticipant as useLocalParticipant3 } from "@livekit/components-react/hooks";
368
+ import { useCallback as useCallback3, useRef as useRef2, useState as useState3 } from "react";
231
369
  var textEncoder2 = new TextEncoder;
232
370
  function useVoiceTurn() {
233
- const { localParticipant } = useLocalParticipant2();
371
+ const { localParticipant } = useLocalParticipant3();
234
372
  const [isCapturingSpeech, setIsCapturingSpeech] = useState3(false);
235
- const capturingRef = useRef(false);
236
- const publish = useCallback2(async (type) => {
373
+ const capturingRef = useRef2(false);
374
+ const publish = useCallback3(async (type) => {
237
375
  await localParticipant.publishData(textEncoder2.encode(JSON.stringify({ type })), {
238
376
  reliable: true,
239
377
  topic: MIC_MODE_TURN_TOPIC
240
378
  });
241
379
  }, [localParticipant]);
242
- const startRecording = useCallback2(async () => {
380
+ const startRecording = useCallback3(async () => {
243
381
  try {
244
382
  await localParticipant.setMicrophoneEnabled(true);
245
383
  await publish("start");
@@ -247,7 +385,7 @@ function useVoiceTurn() {
247
385
  console.error("Failed to start voice turn:", error);
248
386
  }
249
387
  }, [localParticipant, publish]);
250
- const commitRecording = useCallback2(async () => {
388
+ const commitRecording = useCallback3(async () => {
251
389
  try {
252
390
  await localParticipant.setMicrophoneEnabled(false);
253
391
  await publish("commit");
@@ -255,21 +393,21 @@ function useVoiceTurn() {
255
393
  console.error("Failed to commit voice turn:", error);
256
394
  }
257
395
  }, [localParticipant, publish]);
258
- const start = useCallback2(() => {
396
+ const start = useCallback3(() => {
259
397
  if (capturingRef.current)
260
398
  return;
261
399
  capturingRef.current = true;
262
400
  setIsCapturingSpeech(true);
263
401
  startRecording();
264
402
  }, [startRecording]);
265
- const commit = useCallback2(() => {
403
+ const commit = useCallback3(() => {
266
404
  if (!capturingRef.current)
267
405
  return;
268
406
  capturingRef.current = false;
269
407
  setIsCapturingSpeech(false);
270
408
  commitRecording();
271
409
  }, [commitRecording]);
272
- const toggle = useCallback2(() => {
410
+ const toggle = useCallback3(() => {
273
411
  if (capturingRef.current)
274
412
  commit();
275
413
  else
@@ -298,7 +436,7 @@ function useVoiceTurnContext() {
298
436
  }
299
437
 
300
438
  // src/hooks/useAdoptionGoals.ts
301
- import { useCallback as useCallback3, useEffect as useEffect3, useMemo, useState as useState4 } from "react";
439
+ import { useCallback as useCallback4, useEffect as useEffect3, useMemo, useState as useState4 } from "react";
302
440
 
303
441
  // src/lib/hashMatch.ts
304
442
  function globToRegExp(pattern) {
@@ -368,7 +506,7 @@ function useAdoptionGoals({
368
506
  }) {
369
507
  const [candidates, setCandidates] = useState4([]);
370
508
  const [hash, setHash] = useState4(window.location.hash);
371
- const match = useCallback3(async () => {
509
+ const match = useCallback4(async () => {
372
510
  try {
373
511
  const resp = await authedFetch(`${API_URL}/v1/adoption/goals/match`, {
374
512
  method: "POST",
@@ -418,21 +556,21 @@ function useAdoptionGoals({
418
556
  return hashSpecific;
419
557
  return candidates.filter((goal) => goal.hashPattern === null);
420
558
  }, [candidates, hash]);
421
- const postStatus = useCallback3((goalId, status) => {
559
+ const postStatus = useCallback4((goalId, status) => {
422
560
  authedFetch(`${API_URL}/v1/adoption/goals/${goalId}/status`, {
423
561
  method: "POST",
424
562
  headers: { "Content-Type": "application/json" },
425
563
  body: JSON.stringify({ status })
426
564
  }).catch((e) => console.warn("[Skippr] adoption status update failed", e));
427
565
  }, [authedFetch]);
428
- const attendGoal = useCallback3((goalId) => {
566
+ const attendGoal = useCallback4((goalId) => {
429
567
  postStatus(goalId, "attended" /* Attended */);
430
568
  }, [postStatus]);
431
569
  return { goals, attendGoal };
432
570
  }
433
571
 
434
572
  // src/hooks/useAuth.ts
435
- import { useCallback as useCallback4, useEffect as useEffect4, useState as useState5 } from "react";
573
+ import { useCallback as useCallback5, useEffect as useEffect4, useState as useState5 } from "react";
436
574
  var API_URL2 = "https://specialist.skippr.ai/api";
437
575
  function storageKey(appKey) {
438
576
  return `skippr_auth_${appKey}`;
@@ -461,15 +599,20 @@ function clearStoredToken(appKey) {
461
599
  function useAuth({ appKey }) {
462
600
  const [authToken, setAuthToken] = useState5(null);
463
601
  const [isValidating, setIsValidating] = useState5(false);
602
+ const [hasResolvedStoredToken, setHasResolvedStoredToken] = useState5(false);
464
603
  const [isSubmitting, setIsSubmitting] = useState5(false);
465
604
  const [error, setError] = useState5("");
466
605
  const isAuthenticated = authToken !== null;
467
606
  useEffect4(() => {
468
- if (!appKey)
607
+ if (!appKey) {
608
+ setHasResolvedStoredToken(true);
469
609
  return;
610
+ }
470
611
  const stored = getStoredToken(appKey);
471
- if (!stored)
612
+ if (!stored) {
613
+ setHasResolvedStoredToken(true);
472
614
  return;
615
+ }
473
616
  async function validateStoredToken() {
474
617
  setIsValidating(true);
475
618
  try {
@@ -486,6 +629,7 @@ function useAuth({ appKey }) {
486
629
  clearStoredToken(appKey);
487
630
  } finally {
488
631
  setIsValidating(false);
632
+ setHasResolvedStoredToken(true);
489
633
  }
490
634
  }
491
635
  validateStoredToken();
@@ -498,7 +642,7 @@ function useAuth({ appKey }) {
498
642
  window.addEventListener("skippr:logout", handleLogout);
499
643
  return () => window.removeEventListener("skippr:logout", handleLogout);
500
644
  }, []);
501
- const requestOtp = useCallback4(async (email) => {
645
+ const requestOtp = useCallback5(async (email) => {
502
646
  if (!appKey)
503
647
  return false;
504
648
  setIsSubmitting(true);
@@ -525,7 +669,7 @@ function useAuth({ appKey }) {
525
669
  setIsSubmitting(false);
526
670
  }
527
671
  }, [appKey]);
528
- const verifyOtp = useCallback4(async (email, code) => {
672
+ const verifyOtp = useCallback5(async (email, code) => {
529
673
  if (!appKey)
530
674
  return;
531
675
  setIsSubmitting(true);
@@ -554,7 +698,7 @@ function useAuth({ appKey }) {
554
698
  setIsSubmitting(false);
555
699
  }
556
700
  }, [appKey]);
557
- const logout = useCallback4(async () => {
701
+ const logout = useCallback5(async () => {
558
702
  const token = authToken;
559
703
  if (appKey)
560
704
  clearStoredToken(appKey);
@@ -575,6 +719,7 @@ function useAuth({ appKey }) {
575
719
  return {
576
720
  isAuthenticated,
577
721
  isValidating,
722
+ hasResolvedStoredToken,
578
723
  authToken,
579
724
  requestOtp,
580
725
  verifyOtp,
@@ -585,7 +730,7 @@ function useAuth({ appKey }) {
585
730
  }
586
731
 
587
732
  // src/hooks/useAutoStart.ts
588
- import { useEffect as useEffect5, useMemo as useMemo2, useRef as useRef2 } from "react";
733
+ import { useEffect as useEffect5, useMemo as useMemo2, useRef as useRef3 } from "react";
589
734
 
590
735
  // src/lib/agentMode.ts
591
736
  var AGENT_MODE = {
@@ -665,7 +810,7 @@ function useAutoStart({
665
810
  bearerToken,
666
811
  selectModule
667
812
  }) {
668
- const hasAutoStartedRef = useRef2(false);
813
+ const hasAutoStartedRef = useRef3(false);
669
814
  const autoStartModule = useMemo2(() => availableModules.find((m) => {
670
815
  if (!m.uiPreferences?.autoStart)
671
816
  return false;
@@ -704,7 +849,7 @@ function useAutoStart({
704
849
  }
705
850
 
706
851
  // src/hooks/useAvailableModules.ts
707
- import { useCallback as useCallback5, useEffect as useEffect6, useState as useState6 } from "react";
852
+ import { useCallback as useCallback6, useEffect as useEffect6, useState as useState6 } from "react";
708
853
  var EMPTY_DEFAULT = { agentId: null, sessionId: null };
709
854
  var API_URL3 = "https://specialist.skippr.ai/api";
710
855
  function useAvailableModules({
@@ -715,10 +860,11 @@ function useAvailableModules({
715
860
  }) {
716
861
  const [modules, setModules] = useState6([]);
717
862
  const [defaultSelection, setDefaultSelection] = useState6(EMPTY_DEFAULT);
863
+ const [appearance, setAppearance] = useState6(null);
718
864
  const [isLoading, setIsLoading] = useState6(false);
719
865
  const [hasResolved, setHasResolved] = useState6(false);
720
866
  const [error, setError] = useState6(null);
721
- const fetchModules = useCallback5(async () => {
867
+ const fetchModules = useCallback6(async () => {
722
868
  setIsLoading(true);
723
869
  setHasResolved(false);
724
870
  setError(null);
@@ -732,6 +878,7 @@ function useAvailableModules({
732
878
  const data = await resp.json();
733
879
  setModules(Array.isArray(data?.modules) ? data.modules : []);
734
880
  setDefaultSelection(data?.default ?? EMPTY_DEFAULT);
881
+ setAppearance(data?.appearance ?? null);
735
882
  } catch (e) {
736
883
  setError(e instanceof Error ? e.message : "Failed to load modules");
737
884
  } finally {
@@ -747,6 +894,7 @@ function useAvailableModules({
747
894
  return {
748
895
  modules,
749
896
  defaultSelection,
897
+ appearance,
750
898
  isLoading,
751
899
  hasResolved,
752
900
  error,
@@ -754,16 +902,27 @@ function useAvailableModules({
754
902
  };
755
903
  }
756
904
 
905
+ // src/hooks/useOnceTrue.ts
906
+ import { useEffect as useEffect7, useState as useState7 } from "react";
907
+ function useOnceTrue(value) {
908
+ const [latched, setLatched] = useState7(false);
909
+ useEffect7(() => {
910
+ if (value)
911
+ setLatched(true);
912
+ }, [value]);
913
+ return latched;
914
+ }
915
+
757
916
  // src/hooks/usePlanUpdates.ts
758
- import { useCallback as useCallback6 } from "react";
917
+ import { useCallback as useCallback7 } from "react";
759
918
 
760
919
  // src/hooks/useAgentState.ts
761
920
  import { useRemoteParticipants } from "@livekit/components-react/hooks";
762
- import { useEffect as useEffect7, useState as useState7 } from "react";
921
+ import { useEffect as useEffect8, useState as useState8 } from "react";
763
922
  function useAgentState(attributeKey, parse, initial) {
764
- const [value, setValue] = useState7(initial);
923
+ const [value, setValue] = useState8(initial);
765
924
  const remoteParticipants = useRemoteParticipants();
766
- useEffect7(() => {
925
+ useEffect8(() => {
767
926
  const agentParticipant = remoteParticipants.find((p) => p.attributes?.[attributeKey]);
768
927
  if (agentParticipant) {
769
928
  const attr = agentParticipant.attributes?.[attributeKey];
@@ -809,12 +968,12 @@ function parsePlan(json) {
809
968
  return null;
810
969
  }
811
970
  function usePlanUpdates() {
812
- const parse = useCallback6(parsePlan, []);
971
+ const parse = useCallback7(parsePlan, []);
813
972
  return useAgentState(PLAN_ATTR, parse, null);
814
973
  }
815
974
 
816
975
  // src/hooks/useSession.ts
817
- import { useCallback as useCallback7, useEffect as useEffect8, useRef as useRef3, useState as useState8 } from "react";
976
+ import { useCallback as useCallback8, useEffect as useEffect9, useRef as useRef4, useState as useState9 } from "react";
818
977
  var API_URL4 = "https://specialist.skippr.ai/api";
819
978
  async function fetchSessionMessages(sessionId, authedFetch) {
820
979
  try {
@@ -866,27 +1025,27 @@ function useSession({
866
1025
  onStartError,
867
1026
  onDisconnect
868
1027
  }) {
869
- const [connection, setConnection] = useState8(null);
870
- const [shouldConnect, setShouldConnect] = useState8(false);
871
- const [isStarting, setIsStarting] = useState8(false);
872
- const [isDisconnecting, setIsDisconnecting] = useState8(false);
873
- const [error, setError] = useState8("");
874
- const [errorCode, setErrorCode] = useState8(null);
875
- const [sessionId, setSessionId] = useState8(null);
876
- const [bearerToken, setBearerToken] = useState8(authToken ?? null);
877
- const [pendingScreenStream, setPendingScreenStream] = useState8(null);
878
- const [isPaused, setIsPaused] = useState8(false);
879
- const [isPausing, setIsPausing] = useState8(false);
880
- const [pauseTimeoutSeconds, setPauseTimeoutSeconds] = useState8(null);
881
- const [historyMessages, setHistoryMessages] = useState8([]);
882
- const [authFailed, setAuthFailed] = useState8(false);
883
- const tokenRef = useRef3(authToken ? { token: authToken, expiresAt: null } : null);
884
- const getUserTokenRef = useRef3(getUserToken);
1028
+ const [connection, setConnection] = useState9(null);
1029
+ const [shouldConnect, setShouldConnect] = useState9(false);
1030
+ const [isStarting, setIsStarting] = useState9(false);
1031
+ const [isDisconnecting, setIsDisconnecting] = useState9(false);
1032
+ const [error, setError] = useState9("");
1033
+ const [errorCode, setErrorCode] = useState9(null);
1034
+ const [sessionId, setSessionId] = useState9(null);
1035
+ const [bearerToken, setBearerToken] = useState9(authToken ?? null);
1036
+ const [pendingScreenStream, setPendingScreenStream] = useState9(null);
1037
+ const [isPaused, setIsPaused] = useState9(false);
1038
+ const [isPausing, setIsPausing] = useState9(false);
1039
+ const [pauseTimeoutSeconds, setPauseTimeoutSeconds] = useState9(null);
1040
+ const [historyMessages, setHistoryMessages] = useState9([]);
1041
+ const [authFailed, setAuthFailed] = useState9(false);
1042
+ const tokenRef = useRef4(authToken ? { token: authToken, expiresAt: null } : null);
1043
+ const getUserTokenRef = useRef4(getUserToken);
885
1044
  getUserTokenRef.current = getUserToken ?? (userToken ? () => Promise.resolve(userToken) : undefined);
886
- const failedBearerRef = useRef3(null);
887
- const inFlightExchangeRef = useRef3(null);
888
- const canExchange = useCallback7(() => !!appKey && !!getUserTokenRef.current, [appKey]);
889
- const reExchange = useCallback7(async () => {
1045
+ const failedBearerRef = useRef4(null);
1046
+ const inFlightExchangeRef = useRef4(null);
1047
+ const canExchange = useCallback8(() => !!appKey && !!getUserTokenRef.current, [appKey]);
1048
+ const reExchange = useCallback8(async () => {
890
1049
  if (inFlightExchangeRef.current)
891
1050
  return inFlightExchangeRef.current;
892
1051
  const provider = getUserTokenRef.current;
@@ -906,7 +1065,7 @@ function useSession({
906
1065
  inFlightExchangeRef.current = null;
907
1066
  }
908
1067
  }, [appKey]);
909
- const getValidBearer = useCallback7(async () => {
1068
+ const getValidBearer = useCallback8(async () => {
910
1069
  const current = tokenRef.current;
911
1070
  if (current) {
912
1071
  if (current.expiresAt === null)
@@ -918,7 +1077,7 @@ function useSession({
918
1077
  return reExchange();
919
1078
  return current?.token ?? null;
920
1079
  }, [canExchange, reExchange]);
921
- const authedFetch = useCallback7(async (input, init = {}) => {
1080
+ const authedFetch = useCallback8(async (input, init = {}) => {
922
1081
  const isSecretMode = canExchange();
923
1082
  const onTerminalAuthFailure = () => {
924
1083
  if (isSecretMode)
@@ -960,7 +1119,7 @@ function useSession({
960
1119
  setAuthFailed(false);
961
1120
  return resp;
962
1121
  }, [canExchange, getValidBearer, reExchange]);
963
- useEffect8(() => {
1122
+ useEffect9(() => {
964
1123
  let stale = false;
965
1124
  if (authToken) {
966
1125
  tokenRef.current = { token: authToken, expiresAt: null };
@@ -979,10 +1138,10 @@ function useSession({
979
1138
  stale = true;
980
1139
  };
981
1140
  }, [authToken, canExchange, reExchange]);
982
- const isStartingRef = useRef3(false);
983
- const pauseOnUnloadRef = useRef3(null);
1141
+ const isStartingRef = useRef4(false);
1142
+ const pauseOnUnloadRef = useRef4(null);
984
1143
  pauseOnUnloadRef.current = connection !== null && !isPaused && sessionId && bearerToken ? { sessionId, bearerToken } : null;
985
- useEffect8(() => {
1144
+ useEffect9(() => {
986
1145
  const onPageHide = () => {
987
1146
  const pending = pauseOnUnloadRef.current;
988
1147
  if (!pending)
@@ -997,7 +1156,7 @@ function useSession({
997
1156
  window.addEventListener("pagehide", onPageHide);
998
1157
  return () => window.removeEventListener("pagehide", onPageHide);
999
1158
  }, []);
1000
- const startSession = useCallback7(async ({
1159
+ const startSession = useCallback8(async ({
1001
1160
  agentId,
1002
1161
  agentControls,
1003
1162
  existingSessionId,
@@ -1092,7 +1251,7 @@ function useSession({
1092
1251
  setIsStarting(false);
1093
1252
  }
1094
1253
  }, [captureMode, bearerToken, authedFetch, onStart, onStartError]);
1095
- const pauseSession = useCallback7(async () => {
1254
+ const pauseSession = useCallback8(async () => {
1096
1255
  if (!sessionId || !bearerToken)
1097
1256
  return;
1098
1257
  setIsPausing(true);
@@ -1118,7 +1277,7 @@ function useSession({
1118
1277
  setIsPaused(true);
1119
1278
  setIsPausing(false);
1120
1279
  }, [sessionId, bearerToken, authedFetch, pendingScreenStream]);
1121
- const disconnect = useCallback7(async () => {
1280
+ const disconnect = useCallback8(async () => {
1122
1281
  setIsDisconnecting(true);
1123
1282
  try {
1124
1283
  if (sessionId && bearerToken) {
@@ -1163,7 +1322,7 @@ function useSession({
1163
1322
  }
1164
1323
 
1165
1324
  // src/hooks/useSessionHistory.ts
1166
- import { useEffect as useEffect9, useState as useState9 } from "react";
1325
+ import { useEffect as useEffect10, useState as useState10 } from "react";
1167
1326
  var API_URL5 = "https://specialist.skippr.ai/api";
1168
1327
  var EMPTY = { messages: [], phases: [] };
1169
1328
  function useSessionHistory({
@@ -1171,11 +1330,11 @@ function useSessionHistory({
1171
1330
  enabled,
1172
1331
  authedFetch
1173
1332
  }) {
1174
- const [history2, setHistory] = useState9(EMPTY);
1175
- const [loadedAgentId, setLoadedAgentId] = useState9(null);
1333
+ const [history2, setHistory] = useState10(EMPTY);
1334
+ const [loadedAgentId, setLoadedAgentId] = useState10(null);
1176
1335
  const activeAgentId = enabled && agentId ? agentId : null;
1177
1336
  const isLoading = activeAgentId !== null && activeAgentId !== loadedAgentId;
1178
- useEffect9(() => {
1337
+ useEffect10(() => {
1179
1338
  if (!enabled || !agentId) {
1180
1339
  setHistory(EMPTY);
1181
1340
  setLoadedAgentId(null);
@@ -1523,7 +1682,7 @@ var __iconNode24 = [
1523
1682
  ];
1524
1683
  var X = createLucideIcon("x", __iconNode24);
1525
1684
  // src/components/AgentCursor.tsx
1526
- import { useContext as useContext6, useEffect as useEffect10, useLayoutEffect, useRef as useRef4, useState as useState10 } from "react";
1685
+ import { useContext as useContext6, useEffect as useEffect11, useLayoutEffect, useRef as useRef5, useState as useState11 } from "react";
1527
1686
 
1528
1687
  // src/capture/elementRef.ts
1529
1688
  function safeGetIframeDocument(iframe) {
@@ -1662,7 +1821,7 @@ function traceRing(path, durationMs, onFrame, onDone) {
1662
1821
  // src/components/AgentCursor.tsx
1663
1822
  import { jsx as jsx4, jsxs } from "react/jsx-runtime";
1664
1823
  var Z_INDEX = 2147483646;
1665
- var BRAND_TEAL = "#2bc0ae";
1824
+ var BRAND_COLOR = "var(--skippr-brand, #2bc0ae)";
1666
1825
  var GLIDE_EASE = "cubic-bezier(0.45, 0, 0.25, 1)";
1667
1826
  var GLIDE_MIN_MS = 900;
1668
1827
  var GLIDE_MAX_MS = 1500;
@@ -1706,18 +1865,18 @@ function AgentCursor({
1706
1865
  animated = false
1707
1866
  }) {
1708
1867
  const ctx = useContext6(LiveAgentContext);
1709
- const [cursor, setCursor] = useState10(null);
1710
- const [glideMs, setGlideMs] = useState10(0);
1711
- const [phase, setPhase] = useState10("idle");
1712
- const [ringBox, setRingBox] = useState10(null);
1713
- const [clickPulse, setClickPulse] = useState10(0);
1714
- const cursorElRef = useRef4(null);
1715
- const pathRef = useRef4(null);
1716
- const prevCursorRef = useRef4(null);
1717
- const traceRef = useRef4(null);
1718
- const timersRef = useRef4(new Set);
1719
- const trackFrameRef = useRef4(null);
1720
- const glideFrameRef = useRef4(null);
1868
+ const [cursor, setCursor] = useState11(null);
1869
+ const [glideMs, setGlideMs] = useState11(0);
1870
+ const [phase, setPhase] = useState11("idle");
1871
+ const [ringBox, setRingBox] = useState11(null);
1872
+ const [clickPulse, setClickPulse] = useState11(0);
1873
+ const cursorElRef = useRef5(null);
1874
+ const pathRef = useRef5(null);
1875
+ const prevCursorRef = useRef5(null);
1876
+ const traceRef = useRef5(null);
1877
+ const timersRef = useRef5(new Set);
1878
+ const trackFrameRef = useRef5(null);
1879
+ const glideFrameRef = useRef5(null);
1721
1880
  const clearTimers = () => {
1722
1881
  for (const t of timersRef.current)
1723
1882
  clearTimeout(t);
@@ -1833,7 +1992,7 @@ function AgentCursor({
1833
1992
  });
1834
1993
  return cancelAnimation;
1835
1994
  }, [target, animated]);
1836
- useEffect10(() => {
1995
+ useEffect11(() => {
1837
1996
  if (!target || target.kind === "gesture" || phase === "idle")
1838
1997
  return;
1839
1998
  const track = () => {
@@ -1865,7 +2024,7 @@ function AgentCursor({
1865
2024
  }
1866
2025
  };
1867
2026
  }, [target, phase]);
1868
- useEffect10(() => {
2027
+ useEffect11(() => {
1869
2028
  return () => {
1870
2029
  traceRef.current?.cancel();
1871
2030
  for (const t of timersRef.current)
@@ -1889,7 +2048,7 @@ function AgentCursor({
1889
2048
  ref: pathRef,
1890
2049
  d: ringPathD(ringBox),
1891
2050
  fill: "none",
1892
- stroke: BRAND_TEAL,
2051
+ stroke: BRAND_COLOR,
1893
2052
  strokeWidth: 2,
1894
2053
  strokeLinecap: "round",
1895
2054
  style: { strokeDasharray: "0 99999" }
@@ -1900,13 +2059,13 @@ function AgentCursor({
1900
2059
  className: "skippr:relative",
1901
2060
  children: [
1902
2061
  /* @__PURE__ */ jsx4("div", {
1903
- className: "skippr:absolute skippr:inset-0 skippr:rounded-[1rem] skippr:border-2 skippr:border-[#2bc0ae] skippr:animate-skippr-annotation-pulse"
2062
+ className: "skippr:absolute skippr:inset-0 skippr:rounded-[1rem] skippr:border-2 skippr:border-brand skippr:animate-skippr-annotation-pulse"
1904
2063
  }),
1905
2064
  /* @__PURE__ */ jsx4("div", {
1906
2065
  role: "status",
1907
- 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)]",
2066
+ 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-brand skippr:px-2.5 skippr:py-1 skippr:shadow-[0_4px_12px_rgba(0,0,0,0.12)]",
1908
2067
  children: /* @__PURE__ */ jsx4("span", {
1909
- className: "skippr:text-[11px] skippr:font-medium skippr:text-white skippr:whitespace-nowrap",
2068
+ className: "skippr:text-[11px] skippr:font-medium skippr:text-primary-foreground skippr:whitespace-nowrap",
1910
2069
  children: target.label
1911
2070
  })
1912
2071
  })
@@ -1914,7 +2073,7 @@ function AgentCursor({
1914
2073
  }),
1915
2074
  target.kind === "gesture" && /* @__PURE__ */ jsx4("div", {
1916
2075
  role: "status",
1917
- 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)]",
2076
+ className: "skippr:fixed skippr:-translate-x-1/2 skippr:flex skippr:items-center skippr:gap-1.5 skippr:rounded-full skippr:bg-brand skippr:px-2.5 skippr:py-1 skippr:shadow-[0_4px_12px_rgba(0,0,0,0.12)]",
1918
2077
  style: {
1919
2078
  left: `${cursor.x}px`,
1920
2079
  top: `${cursor.y + 18}px`,
@@ -1923,7 +2082,7 @@ function AgentCursor({
1923
2082
  transition: `left ${glideMs}ms ${GLIDE_EASE}, top ${glideMs}ms ${GLIDE_EASE}`
1924
2083
  },
1925
2084
  children: /* @__PURE__ */ jsx4("span", {
1926
- className: "skippr:text-[11px] skippr:font-medium skippr:text-white skippr:whitespace-nowrap",
2085
+ className: "skippr:text-[11px] skippr:font-medium skippr:text-primary-foreground skippr:whitespace-nowrap",
1927
2086
  children: target.label
1928
2087
  })
1929
2088
  }),
@@ -1938,12 +2097,12 @@ function AgentCursor({
1938
2097
  transition: `left ${glideMs}ms ${GLIDE_EASE}, top ${glideMs}ms ${GLIDE_EASE}`
1939
2098
  },
1940
2099
  children: /* @__PURE__ */ jsx4(MousePointer2, {
1941
- 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"}`,
2100
+ className: `skippr:h-5 skippr:w-5 skippr:text-brand skippr:drop-shadow-[0_2px_5px_rgba(0,0,0,0.4)] ${clickPulse > 0 ? "skippr:animate-skippr-press" : "skippr:animate-skippr-cursor-pop"}`,
1942
2101
  fill: "currentColor"
1943
2102
  }, clickPulse)
1944
2103
  }),
1945
2104
  clickPulse > 0 && rippleCenter && /* @__PURE__ */ jsx4("span", {
1946
- className: "skippr:fixed skippr:h-7 skippr:w-7 skippr:rounded-full skippr:bg-[#2bc0ae]/50 skippr:animate-skippr-click-ping",
2105
+ className: "skippr:fixed skippr:h-7 skippr:w-7 skippr:rounded-full skippr:bg-brand/50 skippr:animate-skippr-click-ping",
1947
2106
  style: {
1948
2107
  left: `${rippleCenter.x}px`,
1949
2108
  top: `${rippleCenter.y}px`,
@@ -1956,17 +2115,17 @@ function AgentCursor({
1956
2115
  }
1957
2116
 
1958
2117
  // src/components/AutoStartMedia.tsx
1959
- import { useConnectionState, useLocalParticipant as useLocalParticipant3 } from "@livekit/components-react/hooks";
1960
- import { ConnectionState, Track } from "livekit-client";
1961
- import { useEffect as useEffect11, useRef as useRef5 } from "react";
2118
+ import { useConnectionState, useLocalParticipant as useLocalParticipant4 } from "@livekit/components-react/hooks";
2119
+ import { ConnectionState, Track as Track2 } from "livekit-client";
2120
+ import { useEffect as useEffect12, useRef as useRef6 } from "react";
1962
2121
  function AutoStartMedia({
1963
2122
  pendingScreenStream,
1964
2123
  pushOrTapMicMode = false
1965
2124
  }) {
1966
- const { localParticipant } = useLocalParticipant3();
2125
+ const { localParticipant } = useLocalParticipant4();
1967
2126
  const connectionState = useConnectionState();
1968
- const didStartRef = useRef5(false);
1969
- useEffect11(() => {
2127
+ const didStartRef = useRef6(false);
2128
+ useEffect12(() => {
1970
2129
  if (didStartRef.current)
1971
2130
  return;
1972
2131
  if (connectionState !== ConnectionState.Connected)
@@ -1979,7 +2138,7 @@ function AutoStartMedia({
1979
2138
  const videoTrack = pendingScreenStream.getVideoTracks()[0];
1980
2139
  if (videoTrack) {
1981
2140
  videoTrack.contentHint = "detail";
1982
- localParticipant.publishTrack(videoTrack, { source: Track.Source.ScreenShare }).catch((error) => {
2141
+ localParticipant.publishTrack(videoTrack, { source: Track2.Source.ScreenShare }).catch((error) => {
1983
2142
  console.error("Failed to publish screen share track:", error);
1984
2143
  for (const track of pendingScreenStream.getTracks())
1985
2144
  track.stop();
@@ -1991,9 +2150,9 @@ function AutoStartMedia({
1991
2150
  }
1992
2151
 
1993
2152
  // src/components/DomCapture.tsx
1994
- import { useConnectionState as useConnectionState2, useLocalParticipant as useLocalParticipant4 } from "@livekit/components-react/hooks";
1995
- import { ConnectionState as ConnectionState2, ScreenSharePresets, Track as Track2 } from "livekit-client";
1996
- import { useEffect as useEffect12, useRef as useRef6 } from "react";
2153
+ import { useConnectionState as useConnectionState2, useLocalParticipant as useLocalParticipant5 } from "@livekit/components-react/hooks";
2154
+ import { ConnectionState as ConnectionState2, ScreenSharePresets as ScreenSharePresets2, Track as Track3 } from "livekit-client";
2155
+ import { useEffect as useEffect13, useRef as useRef7 } from "react";
1997
2156
 
1998
2157
  // src/capture/a11yUtils.ts
1999
2158
  var ROLE_BY_TAG = {
@@ -2787,7 +2946,7 @@ async function snapToCanvas(element, options = {}) {
2787
2946
  var SNAPSHOT_INTERVAL_MS = 3000;
2788
2947
  var A11Y_PUBLISH_INTERVAL_MS = 2000;
2789
2948
  var FIRST_SNAPSHOT_DELAY_MS = 400;
2790
- var CAPTURE_PRESET = ScreenSharePresets.h1080fps30;
2949
+ var CAPTURE_PRESET = ScreenSharePresets2.h1080fps30;
2791
2950
  var CAPTURE_FPS = CAPTURE_PRESET.encoding.maxFramerate ?? 30;
2792
2951
  var CAPTURE_BITRATE = 4000000;
2793
2952
  var DOM_SNAPSHOT_GZIP_THRESHOLD_BYTES = 14000;
@@ -2823,7 +2982,7 @@ function getCanvasCaptureStream(canvas, fps) {
2823
2982
  }
2824
2983
  return captureStreamFn.call(canvas, fps);
2825
2984
  }
2826
- async function paintViewportSnapshot(canvas, ctx) {
2985
+ async function paintViewportSnapshot(canvas, ctx, isStillWanted) {
2827
2986
  const dpr = window.devicePixelRatio || 1;
2828
2987
  const snapshotCanvas = await snapToCanvas(document.documentElement, {
2829
2988
  filter: shouldIncludeInSnapshot,
@@ -2832,6 +2991,8 @@ async function paintViewportSnapshot(canvas, ctx) {
2832
2991
  fast: false,
2833
2992
  dpr
2834
2993
  });
2994
+ if (!isStillWanted())
2995
+ return;
2835
2996
  const sourceX = window.scrollX * dpr;
2836
2997
  const sourceY = window.scrollY * dpr;
2837
2998
  const sourceWidth = window.innerWidth * dpr;
@@ -2892,10 +3053,14 @@ async function unpublishAndStopTrack(localParticipant, videoTrack) {
2892
3053
  videoTrack.stop();
2893
3054
  }
2894
3055
  function DomCapture({ pushOrTapMicMode = false }) {
2895
- const { localParticipant } = useLocalParticipant4();
3056
+ const { localParticipant } = useLocalParticipant5();
2896
3057
  const connectionState = useConnectionState2();
2897
- const didStartRef = useRef6(false);
2898
- useEffect12(() => {
3058
+ const { isHeld } = useSessionHoldContext();
3059
+ const didStartRef = useRef7(false);
3060
+ const pausedRef = useRef7(false);
3061
+ const freezeCaptureRef = useRef7(null);
3062
+ const resumeCaptureRef = useRef7(null);
3063
+ useEffect13(() => {
2899
3064
  if (didStartRef.current)
2900
3065
  return;
2901
3066
  if (connectionState !== ConnectionState2.Connected)
@@ -2916,11 +3081,11 @@ function DomCapture({ pushOrTapMicMode = false }) {
2916
3081
  let snapshotInFlight = false;
2917
3082
  let a11yPublishInFlight = false;
2918
3083
  let consecutiveCaptureFailures = 0;
2919
- if (!pushOrTapMicMode) {
3084
+ if (!pushOrTapMicMode && !localParticipant.isMicrophoneEnabled) {
2920
3085
  localParticipant.setMicrophoneEnabled(true).catch((error) => console.error("Failed to enable microphone:", error));
2921
3086
  }
2922
3087
  localParticipant.publishTrack(videoTrack, {
2923
- source: Track2.Source.ScreenShare,
3088
+ source: Track3.Source.ScreenShare,
2924
3089
  videoEncoding: {
2925
3090
  maxBitrate: CAPTURE_BITRATE,
2926
3091
  maxFramerate: CAPTURE_FPS
@@ -2932,11 +3097,11 @@ function DomCapture({ pushOrTapMicMode = false }) {
2932
3097
  track.stop();
2933
3098
  });
2934
3099
  const tickSnapshot = async () => {
2935
- if (cancelled || snapshotInFlight)
3100
+ if (cancelled || snapshotInFlight || pausedRef.current)
2936
3101
  return;
2937
3102
  snapshotInFlight = true;
2938
3103
  try {
2939
- await paintViewportSnapshot(canvas, ctx);
3104
+ await paintViewportSnapshot(canvas, ctx, () => !cancelled && !pausedRef.current);
2940
3105
  if (cancelled)
2941
3106
  return;
2942
3107
  consecutiveCaptureFailures = 0;
@@ -2952,7 +3117,7 @@ function DomCapture({ pushOrTapMicMode = false }) {
2952
3117
  }
2953
3118
  };
2954
3119
  const tickA11yPublish = async () => {
2955
- if (cancelled || a11yPublishInFlight)
3120
+ if (cancelled || a11yPublishInFlight || pausedRef.current)
2956
3121
  return;
2957
3122
  a11yPublishInFlight = true;
2958
3123
  try {
@@ -2989,9 +3154,20 @@ function DomCapture({ pushOrTapMicMode = false }) {
2989
3154
  scheduleNextSnapshot(FIRST_SNAPSHOT_DELAY_MS);
2990
3155
  tickA11yPublish();
2991
3156
  const a11yPublishTimer = setInterval(tickA11yPublish, A11Y_PUBLISH_INTERVAL_MS);
3157
+ freezeCaptureRef.current = () => {
3158
+ pausedRef.current = true;
3159
+ drawPausedOverlay(canvas, ctx);
3160
+ };
3161
+ resumeCaptureRef.current = () => {
3162
+ pausedRef.current = false;
3163
+ tickA11yPublish();
3164
+ tickSnapshot();
3165
+ };
2992
3166
  return () => {
2993
3167
  cancelled = true;
2994
3168
  didStartRef.current = false;
3169
+ freezeCaptureRef.current = null;
3170
+ resumeCaptureRef.current = null;
2995
3171
  if (snapshotTimer)
2996
3172
  clearTimeout(snapshotTimer);
2997
3173
  clearInterval(a11yPublishTimer);
@@ -3002,12 +3178,19 @@ function DomCapture({ pushOrTapMicMode = false }) {
3002
3178
  track.stop();
3003
3179
  };
3004
3180
  }, [connectionState, localParticipant, pushOrTapMicMode]);
3181
+ useEffect13(() => {
3182
+ if (isHeld) {
3183
+ freezeCaptureRef.current?.();
3184
+ } else {
3185
+ resumeCaptureRef.current?.();
3186
+ }
3187
+ }, [isHeld]);
3005
3188
  return null;
3006
3189
  }
3007
3190
 
3008
3191
  // src/components/HighlightOverlay.tsx
3009
3192
  import { useDataChannel } from "@livekit/components-react/hooks";
3010
- import { useCallback as useCallback8, useEffect as useEffect13, useRef as useRef7 } from "react";
3193
+ import { useCallback as useCallback9, useEffect as useEffect14, useRef as useRef8 } from "react";
3011
3194
  var HIGHLIGHT_AUTO_CLEAR_MS = 25000;
3012
3195
  var textDecoder = new TextDecoder;
3013
3196
  function parseHighlightMessage(payload) {
@@ -3030,16 +3213,16 @@ function parseHighlightMessage(payload) {
3030
3213
  }
3031
3214
  }
3032
3215
  function HighlightOverlay() {
3033
- const targetRef = useRef7(null);
3034
- const autoClearRef = useRef7(null);
3035
- const clear = useCallback8(() => {
3216
+ const targetRef = useRef8(null);
3217
+ const autoClearRef = useRef8(null);
3218
+ const clear = useCallback9(() => {
3036
3219
  if (autoClearRef.current)
3037
3220
  clearTimeout(autoClearRef.current);
3038
3221
  autoClearRef.current = null;
3039
3222
  targetRef.current = null;
3040
3223
  clearCursorTarget("guide");
3041
3224
  }, []);
3042
- const onHighlightMessage = useCallback8((msg) => {
3225
+ const onHighlightMessage = useCallback9((msg) => {
3043
3226
  const parsed = parseHighlightMessage(msg.payload);
3044
3227
  if (!parsed)
3045
3228
  return;
@@ -3063,7 +3246,7 @@ function HighlightOverlay() {
3063
3246
  autoClearRef.current = setTimeout(clear, HIGHLIGHT_AUTO_CLEAR_MS);
3064
3247
  }, [clear]);
3065
3248
  useDataChannel(HIGHLIGHT_TOPIC, onHighlightMessage);
3066
- useEffect13(() => {
3249
+ useEffect14(() => {
3067
3250
  const onClick = (event) => {
3068
3251
  const target = targetRef.current;
3069
3252
  const node = event.target;
@@ -3073,26 +3256,26 @@ function HighlightOverlay() {
3073
3256
  document.addEventListener("click", onClick, { capture: true });
3074
3257
  return () => document.removeEventListener("click", onClick, { capture: true });
3075
3258
  }, [clear]);
3076
- useEffect13(() => clear, [clear]);
3259
+ useEffect14(() => clear, [clear]);
3077
3260
  return null;
3078
3261
  }
3079
3262
 
3080
3263
  // src/components/MinimizedBubble.tsx
3081
- import { useContext as useContext7, useEffect as useEffect15, useRef as useRef9, useState as useState11 } from "react";
3264
+ import { useContext as useContext7, useEffect as useEffect16, useRef as useRef10, useState as useState12 } from "react";
3082
3265
 
3083
3266
  // src/hooks/useLauncherDrag.ts
3084
- import { useEffect as useEffect14, useRef as useRef8 } from "react";
3267
+ import { useEffect as useEffect15, useRef as useRef9 } from "react";
3085
3268
  import { flushSync } from "react-dom";
3086
3269
  var DRAG_THRESHOLD_PX = 5;
3087
3270
  function useLauncherDrag(containerRef, onDrop, followRefs, reportDragging) {
3088
- const wasDraggedRef = useRef8(false);
3089
- const onDropRef = useRef8(onDrop);
3271
+ const wasDraggedRef = useRef9(false);
3272
+ const onDropRef = useRef9(onDrop);
3090
3273
  onDropRef.current = onDrop;
3091
- const followTargetsRef = useRef8(followRefs);
3274
+ const followTargetsRef = useRef9(followRefs);
3092
3275
  followTargetsRef.current = followRefs;
3093
- const reportDraggingRef = useRef8(reportDragging);
3276
+ const reportDraggingRef = useRef9(reportDragging);
3094
3277
  reportDraggingRef.current = reportDragging;
3095
- useEffect14(() => {
3278
+ useEffect15(() => {
3096
3279
  const el = containerRef.current;
3097
3280
  if (!el)
3098
3281
  return;
@@ -3343,13 +3526,17 @@ var GOAL_APPEAR_STAGGER_MS = 150;
3343
3526
  var GOAL_EXIT_STAGGER_MS = 250;
3344
3527
  var MAX_GOAL_BUBBLES = 3;
3345
3528
  var MAX_MODULE_PILLS = 3;
3346
- function SkipprMark({ onStart }) {
3529
+ function SkipprMark({ onStart, logoUrl }) {
3347
3530
  return /* @__PURE__ */ jsx7("button", {
3348
3531
  type: "button",
3349
3532
  onClick: onStart,
3350
3533
  "aria-label": "Ask Me Anything",
3351
3534
  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",
3352
- children: /* @__PURE__ */ jsx7("svg", {
3535
+ children: logoUrl ? /* @__PURE__ */ jsx7("img", {
3536
+ src: logoUrl,
3537
+ alt: "",
3538
+ className: "skippr:h-[36px] skippr:w-[36px] skippr:rounded-[11px] skippr:object-cover"
3539
+ }) : /* @__PURE__ */ jsx7("svg", {
3353
3540
  viewBox: "0 0 15.4044 18.4853",
3354
3541
  className: "skippr:h-[18.5px] skippr:w-[15.4px]",
3355
3542
  fill: "none",
@@ -3400,11 +3587,12 @@ function ChatButton({
3400
3587
  function IdleLauncher({
3401
3588
  position,
3402
3589
  isHovered,
3590
+ logoUrl,
3403
3591
  onStart,
3404
3592
  onChat
3405
3593
  }) {
3406
3594
  return /* @__PURE__ */ jsxs4("div", {
3407
- 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"),
3595
+ 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 || logoUrl ? "skippr:translate-x-3" : "skippr:translate-x-7" : isHovered || logoUrl ? "skippr:-translate-x-3" : "skippr:-translate-x-7"),
3408
3596
  style: { gap: isHovered ? 8 : 0 },
3409
3597
  children: [
3410
3598
  /* @__PURE__ */ jsx7(ChatButton, {
@@ -3413,7 +3601,8 @@ function IdleLauncher({
3413
3601
  onClick: onChat
3414
3602
  }),
3415
3603
  /* @__PURE__ */ jsx7(SkipprMark, {
3416
- onStart
3604
+ onStart,
3605
+ logoUrl
3417
3606
  })
3418
3607
  ]
3419
3608
  });
@@ -3425,7 +3614,7 @@ function WelcomeBubble({
3425
3614
  onDismiss,
3426
3615
  onClick
3427
3616
  }) {
3428
- useEffect15(() => {
3617
+ useEffect16(() => {
3429
3618
  const timer = setTimeout(onDismiss, 5000);
3430
3619
  return () => clearTimeout(timer);
3431
3620
  }, [onDismiss]);
@@ -3467,15 +3656,16 @@ function MinimizedBubble({
3467
3656
  selectModule,
3468
3657
  expandPanel,
3469
3658
  setSidebarTab,
3470
- commitLauncherDrop
3659
+ commitLauncherDrop,
3660
+ appearance
3471
3661
  } = ctx;
3472
- const [goalsAutoHidden, setGoalsAutoHidden] = useState11(false);
3473
- const [isLauncherHovered, setIsLauncherHovered] = useState11(false);
3474
- const [visitHref, setVisitHref] = useState11(() => window.location.href);
3475
- const revealedHrefRef = useRef9(null);
3476
- const hoverContainerRef = useRef9(null);
3477
- useEffect15(() => subscribeToLocationChange(() => setVisitHref(window.location.href)), []);
3478
- useEffect15(() => {
3662
+ const [goalsAutoHidden, setGoalsAutoHidden] = useState12(false);
3663
+ const [isLauncherHovered, setIsLauncherHovered] = useState12(false);
3664
+ const [visitHref, setVisitHref] = useState12(() => window.location.href);
3665
+ const revealedHrefRef = useRef10(null);
3666
+ const hoverContainerRef = useRef10(null);
3667
+ useEffect16(() => subscribeToLocationChange(() => setVisitHref(window.location.href)), []);
3668
+ useEffect16(() => {
3479
3669
  const el = hoverContainerRef.current;
3480
3670
  if (!el)
3481
3671
  return;
@@ -3497,7 +3687,7 @@ function MinimizedBubble({
3497
3687
  const onboardingModule = pillCandidates.find((module) => module.type === "onboarding");
3498
3688
  const modulePills = onboardingModule ? [onboardingModule] : pillCandidates.slice(0, MAX_MODULE_PILLS).reverse();
3499
3689
  const goalsEligible = adoptionGoals.length > 0 && !onboardingModule && hasResolvedModules;
3500
- useEffect15(() => {
3690
+ useEffect16(() => {
3501
3691
  if (!goalsEligible)
3502
3692
  return;
3503
3693
  if (revealedHrefRef.current === visitHref) {
@@ -3511,8 +3701,8 @@ function MinimizedBubble({
3511
3701
  }, [goalsEligible, visitHref]);
3512
3702
  const matchedGoals = goalsEligible ? adoptionGoals.slice(0, MAX_GOAL_BUBBLES) : [];
3513
3703
  const goalsHidden = goalsAutoHidden && !isLauncherHovered;
3514
- const [goalsUnmounted, setGoalsUnmounted] = useState11(false);
3515
- useEffect15(() => {
3704
+ const [goalsUnmounted, setGoalsUnmounted] = useState12(false);
3705
+ useEffect16(() => {
3516
3706
  if (!goalsHidden) {
3517
3707
  setGoalsUnmounted(false);
3518
3708
  return;
@@ -3578,6 +3768,7 @@ function MinimizedBubble({
3578
3768
  /* @__PURE__ */ jsx7(IdleLauncher, {
3579
3769
  position,
3580
3770
  isHovered: isLauncherHovered,
3771
+ logoUrl: appearance?.logoUrl ?? null,
3581
3772
  onStart: launchDefaultSession,
3582
3773
  onChat: openChat
3583
3774
  })
@@ -3587,7 +3778,7 @@ function MinimizedBubble({
3587
3778
 
3588
3779
  // src/components/PageActionHandler.tsx
3589
3780
  import { useDataChannel as useDataChannel2 } from "@livekit/components-react/hooks";
3590
- import { useCallback as useCallback9, useEffect as useEffect16, useRef as useRef10 } from "react";
3781
+ import { useCallback as useCallback10, useEffect as useEffect17, useRef as useRef11 } from "react";
3591
3782
  var STEP_MAX_WAIT_MS = 5000;
3592
3783
  var POST_ACTION_SETTLE_SNAPSHOT_MS = 300;
3593
3784
  var TRAILING_ACTION_FLUSH_AFTER_STOP_MS = 1000;
@@ -3805,14 +3996,14 @@ function labelFor(action) {
3805
3996
  }
3806
3997
  }
3807
3998
  function PageActionHandler() {
3808
- const mountedRef = useRef10(true);
3809
- const queueRef = useRef10([]);
3810
- const drainingRef = useRef10(false);
3811
- const settleTimerRef = useRef10(null);
3812
- const endStepRef = useRef10(null);
3813
- const actionsStoppedRef = useRef10(false);
3814
- const ignoreActionsArrivingBeforeRef = useRef10(0);
3815
- const runStep = useCallback9((action) => {
3999
+ const mountedRef = useRef11(true);
4000
+ const queueRef = useRef11([]);
4001
+ const drainingRef = useRef11(false);
4002
+ const settleTimerRef = useRef11(null);
4003
+ const endStepRef = useRef11(null);
4004
+ const actionsStoppedRef = useRef11(false);
4005
+ const ignoreActionsArrivingBeforeRef = useRef11(0);
4006
+ const runStep = useCallback10((action) => {
3816
4007
  return new Promise((resolve) => {
3817
4008
  if (action.type === "scroll_page") {
3818
4009
  let scrolled = false;
@@ -3881,7 +4072,7 @@ function PageActionHandler() {
3881
4072
  });
3882
4073
  });
3883
4074
  }, []);
3884
- const drain = useCallback9(async () => {
4075
+ const drain = useCallback10(async () => {
3885
4076
  if (drainingRef.current)
3886
4077
  return;
3887
4078
  drainingRef.current = true;
@@ -3902,7 +4093,7 @@ function PageActionHandler() {
3902
4093
  }
3903
4094
  }
3904
4095
  }, [runStep]);
3905
- const onMessage = useCallback9((msg) => {
4096
+ const onMessage = useCallback10((msg) => {
3906
4097
  const action = parsePageAction(msg.payload);
3907
4098
  if (!action)
3908
4099
  return;
@@ -3911,7 +4102,7 @@ function PageActionHandler() {
3911
4102
  queueRef.current.push(action);
3912
4103
  drain();
3913
4104
  }, [drain]);
3914
- useEffect16(() => {
4105
+ useEffect17(() => {
3915
4106
  mountedRef.current = true;
3916
4107
  drainingRef.current = false;
3917
4108
  return () => {
@@ -3923,7 +4114,7 @@ function PageActionHandler() {
3923
4114
  setActionsBusy(false);
3924
4115
  };
3925
4116
  }, []);
3926
- useEffect16(() => {
4117
+ useEffect17(() => {
3927
4118
  return onActionsStopped(() => {
3928
4119
  actionsStoppedRef.current = true;
3929
4120
  ignoreActionsArrivingBeforeRef.current = Date.now() + TRAILING_ACTION_FLUSH_AFTER_STOP_MS;
@@ -3941,19 +4132,19 @@ function PageActionHandler() {
3941
4132
  }
3942
4133
 
3943
4134
  // src/components/SessionControlBar.tsx
3944
- import { useCallback as useCallback13, useContext as useContext8, useEffect as useEffect21, useState as useState14 } from "react";
4135
+ import { useCallback as useCallback13, useContext as useContext8, useEffect as useEffect22, useState as useState15 } from "react";
3945
4136
 
3946
4137
  // src/hooks/useActionControl.ts
3947
- import { useLocalParticipant as useLocalParticipant5 } from "@livekit/components-react/hooks";
3948
- import { useCallback as useCallback10, useEffect as useEffect17, useState as useState12 } from "react";
4138
+ import { useLocalParticipant as useLocalParticipant6 } from "@livekit/components-react/hooks";
4139
+ import { useCallback as useCallback11, useEffect as useEffect18, useState as useState13 } from "react";
3949
4140
  var textEncoder5 = new TextEncoder;
3950
4141
  function useActionControl() {
3951
- const { localParticipant } = useLocalParticipant5();
4142
+ const { localParticipant } = useLocalParticipant6();
3952
4143
  const plan = usePlanUpdates();
3953
- const [busy, setBusy] = useState12(isActionsBusy);
3954
- useEffect17(() => subscribeActionsBusy(setBusy), []);
4144
+ const [busy, setBusy] = useState13(isActionsBusy);
4145
+ useEffect18(() => subscribeActionsBusy(setBusy), []);
3955
4146
  const actionsActive = busy || plan?.state === "executing";
3956
- const requestStop = useCallback10(async () => {
4147
+ const requestStop = useCallback11(async () => {
3957
4148
  stopActions();
3958
4149
  try {
3959
4150
  await localParticipant.publishData(textEncoder5.encode(JSON.stringify({ type: "abort" })), {
@@ -3980,13 +4171,13 @@ function useAgentVoiceState() {
3980
4171
  }
3981
4172
 
3982
4173
  // src/hooks/useAudioLevelBars.ts
3983
- import { useEffect as useEffect18, useRef as useRef11, useState as useState13 } from "react";
4174
+ import { useEffect as useEffect19, useRef as useRef12, useState as useState14 } from "react";
3984
4175
  var TALKING_LEVEL_THRESHOLD = 0.2;
3985
4176
  var TALKING_HOLD_MS = 400;
3986
4177
  function useAudioLevelBars(mediaStreamTrack, { barCount, idleHeightPx, maxGrowthPx, noiseGate }) {
3987
- const barRefs = useRef11([]);
3988
- const [isTalking, setIsTalking] = useState13(false);
3989
- useEffect18(() => {
4178
+ const barRefs = useRef12([]);
4179
+ const [isTalking, setIsTalking] = useState14(false);
4180
+ useEffect19(() => {
3990
4181
  if (!mediaStreamTrack) {
3991
4182
  for (const bar of barRefs.current) {
3992
4183
  if (bar)
@@ -4037,31 +4228,31 @@ function useAudioLevelBars(mediaStreamTrack, { barCount, idleHeightPx, maxGrowth
4037
4228
  }
4038
4229
 
4039
4230
  // src/hooks/useIdleAutoPause.ts
4040
- import { useCallback as useCallback11, useEffect as useEffect19, useRef as useRef12 } from "react";
4231
+ import { useCallback as useCallback12, useEffect as useEffect20, useRef as useRef13 } from "react";
4041
4232
  function useIdleAutoPause({
4042
4233
  enabled,
4043
4234
  active,
4044
4235
  isHeld,
4045
4236
  pause
4046
4237
  }) {
4047
- const timerRef = useRef12(null);
4048
- const pauseRef = useRef12(pause);
4238
+ const timerRef = useRef13(null);
4239
+ const pauseRef = useRef13(pause);
4049
4240
  pauseRef.current = pause;
4050
- const clearTimer = useCallback11(() => {
4241
+ const clearTimer = useCallback12(() => {
4051
4242
  if (timerRef.current) {
4052
4243
  clearTimeout(timerRef.current);
4053
4244
  timerRef.current = null;
4054
4245
  }
4055
4246
  }, []);
4056
- const armTimer = useCallback11(() => {
4247
+ const armTimer = useCallback12(() => {
4057
4248
  clearTimer();
4058
4249
  timerRef.current = setTimeout(() => pauseRef.current(), IDLE_AUTO_PAUSE_MS);
4059
4250
  }, [clearTimer]);
4060
- const reportActivity = useCallback11(() => {
4251
+ const reportActivity = useCallback12(() => {
4061
4252
  if (enabled && !isHeld)
4062
4253
  armTimer();
4063
4254
  }, [enabled, isHeld, armTimer]);
4064
- useEffect19(() => {
4255
+ useEffect20(() => {
4065
4256
  if (!enabled || isHeld || active) {
4066
4257
  clearTimer();
4067
4258
  return;
@@ -4073,7 +4264,7 @@ function useIdleAutoPause({
4073
4264
  }
4074
4265
 
4075
4266
  // src/hooks/useKeyboardPushToTalk.ts
4076
- import { useEffect as useEffect20, useRef as useRef13 } from "react";
4267
+ import { useEffect as useEffect21, useRef as useRef14 } from "react";
4077
4268
  function isEditableTarget() {
4078
4269
  const el = document.activeElement;
4079
4270
  if (!el)
@@ -4087,9 +4278,9 @@ function useKeyboardPushToTalk({
4087
4278
  onCommit,
4088
4279
  onKeyUsed
4089
4280
  }) {
4090
- const handlers = useRef13({ onStart, onCommit, onKeyUsed });
4281
+ const handlers = useRef14({ onStart, onCommit, onKeyUsed });
4091
4282
  handlers.current = { onStart, onCommit, onKeyUsed };
4092
- useEffect20(() => {
4283
+ useEffect21(() => {
4093
4284
  if (!enabled)
4094
4285
  return;
4095
4286
  let keyHeld = false;
@@ -4137,14 +4328,14 @@ function useKeyboardPushToTalk({
4137
4328
  }
4138
4329
 
4139
4330
  // src/hooks/useLiveUserTranscript.ts
4140
- import { useLocalParticipant as useLocalParticipant6 } from "@livekit/components-react/hooks";
4141
- import { useRef as useRef14 } from "react";
4331
+ import { useLocalParticipant as useLocalParticipant7 } from "@livekit/components-react/hooks";
4332
+ import { useRef as useRef15 } from "react";
4142
4333
  function useLiveUserTranscript(active) {
4143
4334
  const transcriptions = useSharedTranscriptions();
4144
- const { localParticipant } = useLocalParticipant6();
4335
+ const { localParticipant } = useLocalParticipant7();
4145
4336
  const localIdentity = localParticipant.identity;
4146
- const priorStreamIdsRef = useRef14(new Set);
4147
- const wasActiveRef = useRef14(false);
4337
+ const priorStreamIdsRef = useRef15(new Set);
4338
+ const wasActiveRef = useRef15(false);
4148
4339
  const userStreams = transcriptions.filter((stream) => stream.participantInfo.identity === localIdentity);
4149
4340
  if (active && !wasActiveRef.current) {
4150
4341
  priorStreamIdsRef.current = new Set(userStreams.map((s) => s.streamInfo.id));
@@ -4155,36 +4346,6 @@ function useLiveUserTranscript(active) {
4155
4346
  return userStreams.filter((stream) => !priorStreamIdsRef.current.has(stream.streamInfo.id)).map((stream) => stream.text.trim()).filter((text) => text.length > 0).join(" ");
4156
4347
  }
4157
4348
 
4158
- // src/hooks/useMediaControls.ts
4159
- import { useLocalParticipant as useLocalParticipant7 } from "@livekit/components-react/hooks";
4160
- import { ScreenSharePresets as ScreenSharePresets2 } from "livekit-client";
4161
- import { useCallback as useCallback12 } from "react";
4162
- var SCREEN_SHARE_OPTIONS = {
4163
- video: { displaySurface: "browser" },
4164
- resolution: ScreenSharePresets2.h720fps30.resolution,
4165
- contentHint: "detail"
4166
- };
4167
- function useMediaControls() {
4168
- const { localParticipant } = useLocalParticipant7();
4169
- const isMuted = !localParticipant.isMicrophoneEnabled;
4170
- const isScreenSharing = localParticipant.isScreenShareEnabled;
4171
- const toggleMute = useCallback12(async () => {
4172
- try {
4173
- await localParticipant.setMicrophoneEnabled(isMuted);
4174
- } catch (error) {
4175
- console.error("Failed to toggle microphone:", error);
4176
- }
4177
- }, [localParticipant, isMuted]);
4178
- const toggleScreenShare = useCallback12(async () => {
4179
- try {
4180
- await localParticipant.setScreenShareEnabled(!isScreenSharing, SCREEN_SHARE_OPTIONS);
4181
- } catch (error) {
4182
- console.error("Failed to toggle screen share:", error);
4183
- }
4184
- }, [localParticipant, isScreenSharing]);
4185
- return { isMuted, toggleMute, isScreenSharing, toggleScreenShare };
4186
- }
4187
-
4188
4349
  // src/hooks/useMicLevel.ts
4189
4350
  import { useLocalParticipant as useLocalParticipant8 } from "@livekit/components-react/hooks";
4190
4351
  var MIC_BARS = 5;
@@ -4524,7 +4685,7 @@ function SessionControlBar() {
4524
4685
  togglePause();
4525
4686
  }
4526
4687
  });
4527
- const [pushToTalkHintSeen, setPushToTalkHintSeen] = useState14(false);
4688
+ const [pushToTalkHintSeen, setPushToTalkHintSeen] = useState15(false);
4528
4689
  const startPushToTalk = useCallback13(() => {
4529
4690
  start();
4530
4691
  reportActivity();
@@ -4542,7 +4703,7 @@ function SessionControlBar() {
4542
4703
  onCommit: commitPushToTalk,
4543
4704
  onKeyUsed: dismissPushToTalkHint
4544
4705
  });
4545
- useEffect21(() => {
4706
+ useEffect22(() => {
4546
4707
  if (isHeld)
4547
4708
  minimizePanel();
4548
4709
  }, [isHeld, minimizePanel]);
@@ -4795,8 +4956,29 @@ function SessionControlBar() {
4795
4956
  }
4796
4957
 
4797
4958
  // src/components/ShadowHost.tsx
4798
- import { useLayoutEffect as useLayoutEffect2, useRef as useRef15, useState as useState15 } from "react";
4959
+ import { useLayoutEffect as useLayoutEffect2, useRef as useRef16, useState as useState16 } from "react";
4799
4960
  import { createPortal } from "react-dom";
4961
+
4962
+ // src/lib/brandForeground.ts
4963
+ var DARK_FOREGROUND = "#2d2b3d";
4964
+ var LIGHT_FOREGROUND = "#ffffff";
4965
+ var LUMINANCE_THRESHOLD = 0.179;
4966
+ var HEX_COLOR = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;
4967
+ function isHexColor(value) {
4968
+ return HEX_COLOR.test(value);
4969
+ }
4970
+ function linearChannel(hex, offset) {
4971
+ const channel = Number.parseInt(hex.slice(offset, offset + 2), 16) / 255;
4972
+ return channel <= 0.03928 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4;
4973
+ }
4974
+ function brandForeground(accentColor) {
4975
+ const hex = accentColor.replace("#", "");
4976
+ const fullHex = hex.length === 3 ? hex.split("").map((char) => char + char).join("") : hex;
4977
+ const luminance = 0.2126 * linearChannel(fullHex, 0) + 0.7152 * linearChannel(fullHex, 2) + 0.0722 * linearChannel(fullHex, 4);
4978
+ return luminance > LUMINANCE_THRESHOLD ? DARK_FOREGROUND : LIGHT_FOREGROUND;
4979
+ }
4980
+
4981
+ // src/components/ShadowHost.tsx
4800
4982
  import { jsx as jsx13, Fragment as Fragment2 } from "react/jsx-runtime";
4801
4983
  var PROPERTIES_STYLE_ID = "skippr-tw-properties";
4802
4984
  var PROPERTY_RULE = /@property\s+[^{]+\{[^}]*\}/g;
@@ -4811,11 +4993,18 @@ function hoistTailwindProperties(css) {
4811
4993
  }
4812
4994
  return css.replace(PROPERTY_RULE, "");
4813
4995
  }
4814
- function ShadowHost({ children }) {
4815
- const hostRef = useRef15(null);
4816
- const [shadowRoot, setShadowRoot] = useState15(null);
4996
+ function ShadowHost({
4997
+ children,
4998
+ accentColor
4999
+ }) {
5000
+ const hostRef = useRef16(null);
5001
+ const [shadowRoot, setShadowRoot] = useState16(null);
4817
5002
  const css = `/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
4818
- @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-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-2{left:calc(var(--skippr-spacing)*2)}.skippr\\:left-3{left:calc(var(--skippr-spacing)*3)}.skippr\\:left-5{left:calc(var(--skippr-spacing)*5)}.skippr\\:left-6{left:calc(var(--skippr-spacing)*6)}.skippr\\:z-10{z-index:10}.skippr\\:z-20{z-index:20}.skippr\\:z-\\[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-fit{width:fit-content}.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\\:scale-\\[0\\.94\\]{scale:.94}.skippr\\:-rotate-90{rotate:-90deg}.skippr\\:rotate-45{rotate:45deg}.skippr\\:rotate-\\[225deg\\]{rotate:225deg}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out\\]{animation:.2s ease-out skippr-agent-in}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out_240ms_both\\]{animation:.2s ease-out .24s both skippr-agent-in}.skippr\\:\\[animation\\:skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:\\[animation\\:skippr-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-ptt-transmit{animation:1.4s ease-out infinite skippr-ptt-transmit}.skippr\\:animate-skippr-rec-ring{animation:2s ease-out infinite skippr-rec-ring}.skippr\\:animate-skippr-tab-fade{animation:.2s ease-out skippr-tab-fade}.skippr\\:animate-skippr-thinking-dot{animation:1.2s ease-in-out infinite skippr-thinking-dot}.skippr\\:animate-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{border-radius:.25rem}.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-black\\/25{border-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-black\\/25{border-color:color-mix(in oklab,var(--skippr-color-black)25%,transparent)}}.skippr\\:border-border,.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-\\[\\#f4ecd8\\]{background-color:#f4ecd8}.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-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\\:bg-white\\/70{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/70{background-color:color-mix(in oklab,var(--skippr-color-white)70%,transparent)}}.skippr\\: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-none{--tw-leading:1;line-height:1}.skippr\\:leading-relaxed{--tw-leading:var(--skippr-leading-relaxed);line-height:var(--skippr-leading-relaxed)}.skippr\\:leading-snug{--tw-leading:var(--skippr-leading-snug);line-height:var(--skippr-leading-snug)}.skippr\\: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,.skippr\\:text-black\\/40{color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-black\\/40{color:color-mix(in oklab,var(--skippr-color-black)40%,transparent)}}.skippr\\:text-brand{color:#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-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_2px_6px_rgba\\(0\\,0\\,0\\,0\\.28\\)\\]{--tw-shadow:0 2px 6px var(--tw-shadow-color,#00000047);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_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\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_14px_rgba\\(239\\,68\\,68\\,0\\.45\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#ef444473);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_16px_rgba\\(45\\,43\\,61\\,0\\.45\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#2d2b3d73),0 2px 4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_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-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-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\\/15{--tw-ring-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-white\\/15{--tw-ring-color:color-mix(in oklab,var(--skippr-color-white)15%,transparent)}}.skippr\\:ring-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-100{--tw-duration:.1s;transition-duration:.1s}.skippr\\:duration-150{--tw-duration:.15s;transition-duration:.15s}.skippr\\:duration-200{--tw-duration:.2s;transition-duration:.2s}.skippr\\:duration-300{--tw-duration:.3s;transition-duration:.3s}.skippr\\:duration-\\[400ms\\]{--tw-duration:.4s;transition-duration:.4s}.skippr\\:ease-\\[cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{--tw-ease:cubic-bezier(.22,1,.36,1);transition-timing-function:cubic-bezier(.22,1,.36,1)}.skippr\\:ease-\\[cubic-bezier\\(0\\.34\\,1\\.56\\,0\\.64\\,1\\)\\]{--tw-ease:cubic-bezier(.34,1.56,.64,1);transition-timing-function:cubic-bezier(.34,1.56,.64,1)}.skippr\\:ease-in-out{--tw-ease:var(--skippr-ease-in-out);transition-timing-function:var(--skippr-ease-in-out)}.skippr\\:ease-out{--tw-ease:var(--skippr-ease-out);transition-timing-function:var(--skippr-ease-out)}.skippr\\:outline-none{--tw-outline-style:none;outline-style:none}.skippr\\:select-none{-webkit-user-select:none;user-select:none}.skippr\\:\\[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-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\\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:motion-reduce\\:animate-none{animation:none}}.skippr\\:\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.skippr\\:\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.skippr\\:\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}}@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-ptt-transmit{0%{box-shadow:0 0 #2bc0ae99,0 0 #2bc0ae59}70%{box-shadow:0 0 0 9px #2bc0ae00,0 0 0 16px #2bc0ae00}to{box-shadow:0 0 #2bc0ae00,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}}`;
5003
+ @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-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-2{left:calc(var(--skippr-spacing)*2)}.skippr\\:left-3{left:calc(var(--skippr-spacing)*3)}.skippr\\:left-5{left:calc(var(--skippr-spacing)*5)}.skippr\\:left-6{left:calc(var(--skippr-spacing)*6)}.skippr\\:z-10{z-index:10}.skippr\\:z-20{z-index:20}.skippr\\:z-\\[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-fit{width:fit-content}.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\\:scale-\\[0\\.94\\]{scale:.94}.skippr\\:-rotate-90{rotate:-90deg}.skippr\\:rotate-45{rotate:45deg}.skippr\\:rotate-\\[225deg\\]{rotate:225deg}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out\\]{animation:.2s ease-out skippr-agent-in}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out_240ms_both\\]{animation:.2s ease-out .24s both skippr-agent-in}.skippr\\:\\[animation\\:skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:\\[animation\\:skippr-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-ptt-transmit{animation:1.4s ease-out infinite skippr-ptt-transmit}.skippr\\:animate-skippr-rec-ring{animation:2s ease-out infinite skippr-rec-ring}.skippr\\:animate-skippr-tab-fade{animation:.2s ease-out skippr-tab-fade}.skippr\\:animate-skippr-thinking-dot{animation:1.2s ease-in-out infinite skippr-thinking-dot}.skippr\\:animate-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{border-radius:.25rem}.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-black\\/25{border-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-black\\/25{border-color:color-mix(in oklab,var(--skippr-color-black)25%,transparent)}}.skippr\\:border-border{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-brand{border-color:var(--skippr-brand,#2bc0ae)}.skippr\\:border-input{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-primary\\/20{border-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-primary\\/20{border-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)20%,transparent)}}.skippr\\:border-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-\\[\\#f4ecd8\\]{background-color:#f4ecd8}.skippr\\:bg-amber-50{background-color:var(--skippr-color-amber-50)}.skippr\\:bg-amber-400{background-color:var(--skippr-color-amber-400)}.skippr\\:bg-background{background-color:oklch(100% 0 0)}.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:color-mix(in oklab,var(--skippr-color-black)7.0%,transparent)}}.skippr\\:bg-brand,.skippr\\:bg-brand\\/50{background-color:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-brand\\/50{background-color:color-mix(in oklab,var(--skippr-brand,#2bc0ae)50%,transparent)}}.skippr\\:bg-bubble{background-color:#2d2b3d}.skippr\\:bg-bubble\\/95{background-color:oklab(29.9244% .0107414 -.0305411/.95)}.skippr\\:bg-card{background-color:oklch(100% 0 0)}.skippr\\:bg-current{background-color:currentColor}.skippr\\:bg-destructive{background-color:#d94f4f}.skippr\\:bg-emerald-400{background-color:var(--skippr-color-emerald-400)}.skippr\\:bg-foreground{background-color:oklch(14.7% .004 49.25)}.skippr\\:bg-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:var(--skippr-brand,#2d2b3d)}.skippr\\:bg-primary-foreground\\/15{background-color:var(--skippr-brand-foreground,#fff)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-primary-foreground\\/15{background-color:color-mix(in oklab,var(--skippr-brand-foreground,#fff)15%,transparent)}}.skippr\\:bg-primary-foreground\\/20{background-color:var(--skippr-brand-foreground,#fff)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-primary-foreground\\/20{background-color:color-mix(in oklab,var(--skippr-brand-foreground,#fff)20%,transparent)}}.skippr\\:bg-primary\\/10{background-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-primary\\/10{background-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)10%,transparent)}}.skippr\\:bg-red-50{background-color:var(--skippr-color-red-50)}.skippr\\:bg-red-100{background-color:var(--skippr-color-red-100)}.skippr\\:bg-red-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\\/70{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/70{background-color:color-mix(in oklab,var(--skippr-color-white)70%,transparent)}}.skippr\\:fill-brand{fill:var(--skippr-brand,#2bc0ae)}.skippr\\:fill-primary\\/30{fill:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:fill-primary\\/30{fill:color-mix(in oklab,var(--skippr-brand,#2d2b3d)30%,transparent)}}.skippr\\:stroke-black\\/15{stroke:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:stroke-black\\/15{stroke:color-mix(in oklab,var(--skippr-color-black)15%,transparent)}}.skippr\\:stroke-bubble{stroke:#2d2b3d}.skippr\\:object-cover{object-fit:cover}.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-none{--tw-leading:1;line-height:1}.skippr\\:leading-relaxed{--tw-leading:var(--skippr-leading-relaxed);line-height:var(--skippr-leading-relaxed)}.skippr\\:leading-snug{--tw-leading:var(--skippr-leading-snug);line-height:var(--skippr-leading-snug)}.skippr\\: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-amber-700{color:var(--skippr-color-amber-700)}.skippr\\:text-amber-950{color:var(--skippr-color-amber-950)}.skippr\\:text-background{color:oklch(100% 0 0)}.skippr\\:text-black,.skippr\\:text-black\\/40{color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-black\\/40{color:color-mix(in oklab,var(--skippr-color-black)40%,transparent)}}.skippr\\:text-brand{color:var(--skippr-brand,#2bc0ae)}.skippr\\:text-bubble{color:#2d2b3d}.skippr\\:text-chart-3{color:oklch(66.6% .179 58.318)}.skippr\\:text-destructive{color:#d94f4f}.skippr\\:text-foreground{color:oklch(14.7% .004 49.25)}.skippr\\:text-muted-foreground{color:oklch(55.3% .013 58.071)}.skippr\\:text-muted-foreground\\/30{color:oklab(55.3% .00687528 .0110332/.3)}.skippr\\:text-muted-foreground\\/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:var(--skippr-brand,#2d2b3d)}.skippr\\:text-primary-foreground,.skippr\\:text-primary-foreground\\/70{color:var(--skippr-brand-foreground,#fff)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-primary-foreground\\/70{color:color-mix(in oklab,var(--skippr-brand-foreground,#fff)70%,transparent)}}.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_2px_6px_rgba\\(0\\,0\\,0\\,0\\.28\\)\\]{--tw-shadow:0 2px 6px var(--tw-shadow-color,#00000047);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_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\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_14px_rgba\\(239\\,68\\,68\\,0\\.45\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#ef444473);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_16px_rgba\\(45\\,43\\,61\\,0\\.45\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#2d2b3d73),0 2px 4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_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-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-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:var(--skippr-brand,#2bc0ae)}.skippr\\:ring-foreground\\/10{--tw-ring-color:oklab(14.7% .00261104 .00303026/.1)}.skippr\\:ring-primary-foreground\\/30{--tw-ring-color:var(--skippr-brand-foreground,#fff)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-primary-foreground\\/30{--tw-ring-color:color-mix(in oklab,var(--skippr-brand-foreground,#fff)30%,transparent)}}.skippr\\:ring-white\\/15{--tw-ring-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-white\\/15{--tw-ring-color:color-mix(in oklab,var(--skippr-color-white)15%,transparent)}}.skippr\\:ring-offset-background{--tw-ring-offset-color:oklch(100% 0 0)}.skippr\\:drop-shadow-\\[0_2px_5px_rgba\\(0\\,0\\,0\\,0\\.4\\)\\]{--tw-drop-shadow-size:drop-shadow(0 2px 5px var(--tw-drop-shadow-color,#0006));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.skippr\\:backdrop-blur-sm{--tw-backdrop-blur:blur(var(--skippr-blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.skippr\\:transition-\\[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-100{--tw-duration:.1s;transition-duration:.1s}.skippr\\:duration-150{--tw-duration:.15s;transition-duration:.15s}.skippr\\:duration-200{--tw-duration:.2s;transition-duration:.2s}.skippr\\:duration-300{--tw-duration:.3s;transition-duration:.3s}.skippr\\:duration-\\[400ms\\]{--tw-duration:.4s;transition-duration:.4s}.skippr\\:ease-\\[cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{--tw-ease:cubic-bezier(.22,1,.36,1);transition-timing-function:cubic-bezier(.22,1,.36,1)}.skippr\\:ease-\\[cubic-bezier\\(0\\.34\\,1\\.56\\,0\\.64\\,1\\)\\]{--tw-ease:cubic-bezier(.34,1.56,.64,1);transition-timing-function:cubic-bezier(.34,1.56,.64,1)}.skippr\\:ease-in-out{--tw-ease:var(--skippr-ease-in-out);transition-timing-function:var(--skippr-ease-in-out)}.skippr\\:ease-out{--tw-ease:var(--skippr-ease-out);transition-timing-function:var(--skippr-ease-out)}.skippr\\:outline-none{--tw-outline-style:none;outline-style:none}.skippr\\:select-none{-webkit-user-select:none;user-select:none}.skippr\\:\\[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-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-foreground\\/10:hover{background-color:var(--skippr-brand-foreground,#fff)}@supports (color:color-mix(in lab, red, red)){.skippr\\:hover\\:bg-primary-foreground\\/10:hover{background-color:color-mix(in oklab,var(--skippr-brand-foreground,#fff)10%,transparent)}}.skippr\\:hover\\:bg-primary\\/90:hover{background-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)90%,transparent)}}.skippr\\:hover\\:bg-red-200:hover{background-color:var(--skippr-color-red-200)}.skippr\\:hover\\:bg-red-600:hover{background-color:var(--skippr-color-red-600)}.skippr\\:hover\\:bg-secondary\\/80:hover{background-color:oklab(91.9963% .0175391 .0626889/.8)}.skippr\\:hover\\: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:var(--skippr-brand-foreground,#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-bubble\\/60:focus-visible{--tw-ring-color:oklab(29.9244% .0107414 -.0305411/.6)}.skippr\\:focus-visible\\:ring-primary-foreground:focus-visible{--tw-ring-color:var(--skippr-brand-foreground,#fff)}.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\\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:motion-reduce\\:animate-none{animation:none}}.skippr\\:\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.skippr\\:\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.skippr\\:\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}}@keyframes skippr-tap{0%{transform:scale(1)}45%{transform:scale(.7)}to{transform:scale(1)}}@keyframes skippr-press{0%{transform:scale(1)}55%{transform:scale(1)}85%{transform:scale(.68)}to{transform:scale(1)}}@keyframes skippr-cursor-pop{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}@keyframes skippr-click-ping{0%{opacity:.9;transform:translate(-50%,-50%)scale(.4)}to{opacity:0;transform:translate(-50%,-50%)scale(2.4)}}@keyframes skippr-tab-fade{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-speak{0%,to{opacity:.6;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-thinking-dot{0%,80%,to{opacity:.2;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}@keyframes skippr-pulse-ring{0%,to{box-shadow:0 0 #2d2b3d66}50%{box-shadow:0 0 0 10px #2d2b3d00}}@keyframes skippr-rec-ring{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)55%,transparent)}70%{box-shadow:0 0 0 11px #0000}to{box-shadow:0 0 #0000}}@keyframes skippr-ptt-transmit{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)60%,transparent),0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)35%,transparent)}70%{box-shadow:0 0 0 9px #0000,0 0 0 16px #0000}to{box-shadow:0 0 #0000,0 0 #0000}}@keyframes skippr-annotation-pulse{0%,to{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)50%,transparent)}50%{box-shadow:0 0 0 6px #0000}}@keyframes skippr-speak-ripple{0%{opacity:.6;transform:scale(1)}to{opacity:0;transform:scale(1.8)}}@keyframes skippr-bar{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}@keyframes skippr-breathe{0%,to{opacity:.85;transform:scale(1)}50%{opacity:1;transform:scale(1.08)}}@keyframes skippr-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-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}}`;
5004
+ const hostStyle = accentColor && isHexColor(accentColor) ? {
5005
+ "--skippr-brand": accentColor,
5006
+ "--skippr-brand-foreground": brandForeground(accentColor)
5007
+ } : undefined;
4819
5008
  useLayoutEffect2(() => {
4820
5009
  const host = hostRef.current;
4821
5010
  if (!host || !css)
@@ -4835,12 +5024,13 @@ function ShadowHost({ children }) {
4835
5024
  });
4836
5025
  return /* @__PURE__ */ jsx13("div", {
4837
5026
  ref: hostRef,
5027
+ style: hostStyle,
4838
5028
  children: shadowRoot && createPortal(children, shadowRoot)
4839
5029
  });
4840
5030
  }
4841
5031
 
4842
5032
  // src/components/Sidebar.tsx
4843
- import { useContext as useContext13, useEffect as useEffect28 } from "react";
5033
+ import { useContext as useContext13, useEffect as useEffect29 } from "react";
4844
5034
 
4845
5035
  // src/hooks/useCombinedMessages.ts
4846
5036
  import { useContext as useContext9, useMemo as useMemo6 } from "react";
@@ -4875,14 +5065,14 @@ function useChatMessages() {
4875
5065
 
4876
5066
  // src/hooks/useStreamingTranscript.ts
4877
5067
  import { useLocalParticipant as useLocalParticipant10 } from "@livekit/components-react/hooks";
4878
- import { useMemo as useMemo5, useRef as useRef16 } from "react";
5068
+ import { useMemo as useMemo5, useRef as useRef17 } from "react";
4879
5069
  function useStreamingTranscript() {
4880
5070
  const transcriptions = useSharedTranscriptions();
4881
5071
  const { localParticipant } = useLocalParticipant10();
4882
5072
  const { isCapturingSpeech } = useVoiceTurnContext();
4883
5073
  const localIdentity = localParticipant.identity;
4884
- const priorUserStreamIdsRef = useRef16(new Set);
4885
- const wasCapturingSpeechRef = useRef16(false);
5074
+ const priorUserStreamIdsRef = useRef17(new Set);
5075
+ const wasCapturingSpeechRef = useRef17(false);
4886
5076
  if (isCapturingSpeech && !wasCapturingSpeechRef.current) {
4887
5077
  priorUserStreamIdsRef.current = new Set(transcriptions.filter((stream) => stream.participantInfo.identity === localIdentity).map((stream) => stream.streamInfo.id));
4888
5078
  }
@@ -4943,7 +5133,7 @@ function useCombinedMessages() {
4943
5133
  }
4944
5134
 
4945
5135
  // src/hooks/usePhaseUpdates.ts
4946
- import { useCallback as useCallback14, useContext as useContext10, useEffect as useEffect22 } from "react";
5136
+ import { useCallback as useCallback14, useContext as useContext10, useEffect as useEffect23 } from "react";
4947
5137
  function parsePhases(json) {
4948
5138
  try {
4949
5139
  const data = JSON.parse(json);
@@ -4957,7 +5147,7 @@ function usePhaseUpdates() {
4957
5147
  const parse = useCallback14(parsePhases, []);
4958
5148
  const livePhases = useAgentState("phases", parse, []);
4959
5149
  const ctx = useContext10(LiveAgentContext);
4960
- useEffect22(() => {
5150
+ useEffect23(() => {
4961
5151
  if (livePhases.length > 0)
4962
5152
  ctx?.setPhasesSnapshot(livePhases);
4963
5153
  }, [livePhases, ctx?.setPhasesSnapshot]);
@@ -4966,7 +5156,7 @@ function usePhaseUpdates() {
4966
5156
  }
4967
5157
 
4968
5158
  // src/hooks/useSessionRemaining.ts
4969
- import { useEffect as useEffect23, useRef as useRef17, useState as useState16 } from "react";
5159
+ import { useEffect as useEffect24, useRef as useRef18, useState as useState17 } from "react";
4970
5160
 
4971
5161
  // src/lib/format.ts
4972
5162
  function formatTime(seconds) {
@@ -4982,9 +5172,9 @@ function parseNumber(s) {
4982
5172
  // src/hooks/useSessionRemaining.ts
4983
5173
  function useSessionRemaining() {
4984
5174
  const maxCallDuration = useAgentState("maxCallDuration", parseNumber, null);
4985
- const endTimeRef = useRef17(null);
4986
- const [remaining, setRemaining] = useState16(null);
4987
- useEffect23(() => {
5175
+ const endTimeRef = useRef18(null);
5176
+ const [remaining, setRemaining] = useState17(null);
5177
+ useEffect24(() => {
4988
5178
  if (maxCallDuration === null || endTimeRef.current !== null)
4989
5179
  return;
4990
5180
  const endTime = Date.now() + maxCallDuration * 1000;
@@ -5001,30 +5191,38 @@ function useSessionRemaining() {
5001
5191
  }
5002
5192
 
5003
5193
  // src/components/ChatHeader.tsx
5004
- import { useContext as useContext12, useRef as useRef19 } from "react";
5194
+ import { useContext as useContext12, useRef as useRef21 } from "react";
5005
5195
 
5006
5196
  // src/hooks/useElapsedSeconds.ts
5007
- import { useEffect as useEffect24, useState as useState17 } from "react";
5008
- function useElapsedSeconds(isRunning) {
5009
- const [elapsed, setElapsed] = useState17(0);
5010
- useEffect24(() => {
5011
- if (!isRunning) {
5012
- setElapsed(0);
5013
- return;
5014
- }
5015
- const startedAt = Date.now();
5197
+ import { useEffect as useEffect25, useRef as useRef19, useState as useState18 } from "react";
5198
+ function useElapsedSeconds(isRunning, resetSignal) {
5199
+ const [elapsed, setElapsed] = useState18(0);
5200
+ const accumulatedSecondsRef = useRef19(0);
5201
+ useEffect25(() => {
5202
+ accumulatedSecondsRef.current = 0;
5016
5203
  setElapsed(0);
5017
- const id = setInterval(() => {
5018
- setElapsed(Math.floor((Date.now() - startedAt) / 1000));
5019
- }, 1000);
5020
- return () => clearInterval(id);
5204
+ }, [resetSignal]);
5205
+ useEffect25(() => {
5206
+ if (!isRunning)
5207
+ return;
5208
+ const resumedAt = Date.now();
5209
+ const accumulatedSeconds = accumulatedSecondsRef.current;
5210
+ const totalSeconds = () => accumulatedSeconds + Math.floor((Date.now() - resumedAt) / 1000);
5211
+ const tick = () => setElapsed(totalSeconds());
5212
+ tick();
5213
+ const id = setInterval(tick, 1000);
5214
+ return () => {
5215
+ clearInterval(id);
5216
+ accumulatedSecondsRef.current = totalSeconds();
5217
+ setElapsed(accumulatedSecondsRef.current);
5218
+ };
5021
5219
  }, [isRunning]);
5022
5220
  return elapsed;
5023
5221
  }
5024
5222
 
5025
5223
  // src/hooks/useTextMode.ts
5026
5224
  import { useLocalParticipant as useLocalParticipant11 } from "@livekit/components-react/hooks";
5027
- import { useCallback as useCallback15, useContext as useContext11, useRef as useRef18 } from "react";
5225
+ import { useCallback as useCallback15, useContext as useContext11, useRef as useRef20 } from "react";
5028
5226
  var textEncoder6 = new TextEncoder;
5029
5227
  function useTextMode() {
5030
5228
  const ctx = useContext11(LiveAgentContext);
@@ -5033,7 +5231,7 @@ function useTextMode() {
5033
5231
  }
5034
5232
  const { textMode, setTextModeState, sidebarTab, setSidebarTab } = ctx;
5035
5233
  const { localParticipant } = useLocalParticipant11();
5036
- const confirmedTextModeRef = useRef18(false);
5234
+ const confirmedTextModeRef = useRef20(false);
5037
5235
  const toggleTextMode = useCallback15(async () => {
5038
5236
  const next = !textMode;
5039
5237
  setTextModeState(next);
@@ -5073,8 +5271,9 @@ function ChatHeader() {
5073
5271
  controlBarRef,
5074
5272
  setIsDragging
5075
5273
  } = ctx;
5076
- const elapsed = useElapsedSeconds(isConnected);
5077
- const headerRef = useRef19(null);
5274
+ const { isHeld } = useSessionHoldContext();
5275
+ const elapsed = useElapsedSeconds(isConnected && !isHeld, isConnected);
5276
+ const headerRef = useRef21(null);
5078
5277
  const followsPanel = variant === "floating" && isPanelOpen;
5079
5278
  const dragFollowers = followsPanel ? [panelRef, controlBarRef] : null;
5080
5279
  const { wasDraggedRef } = useLauncherDrag(headerRef, commitLauncherDrop, dragFollowers, setIsDragging);
@@ -5086,7 +5285,7 @@ function ChatHeader() {
5086
5285
  className: "skippr:flex skippr:items-center skippr:gap-3",
5087
5286
  children: [
5088
5287
  isConnected && /* @__PURE__ */ jsx14(HeaderModeToggle, {}),
5089
- isConnected && /* @__PURE__ */ jsxs11("div", {
5288
+ isConnected && !isHeld && /* @__PURE__ */ jsxs11("div", {
5090
5289
  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",
5091
5290
  children: [
5092
5291
  /* @__PURE__ */ jsxs11("span", {
@@ -5120,7 +5319,7 @@ function ChatHeader() {
5120
5319
  },
5121
5320
  "aria-label": "Close",
5122
5321
  title: "Close",
5123
- 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",
5322
+ 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-primary-foreground/10 skippr:hover:text-primary-foreground skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-primary-foreground",
5124
5323
  children: /* @__PURE__ */ jsx14(X, {
5125
5324
  className: "skippr:h-4 skippr:w-4"
5126
5325
  })
@@ -5134,7 +5333,7 @@ function HeaderModeToggle() {
5134
5333
  return /* @__PURE__ */ jsxs11("fieldset", {
5135
5334
  "aria-label": "Response mode",
5136
5335
  disabled: isHeld,
5137
- 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",
5336
+ className: "skippr:flex skippr:items-center skippr:gap-0.5 skippr:rounded-lg skippr:bg-primary-foreground/15 skippr:p-0.5 skippr:text-xs skippr:font-medium skippr:ring-1 skippr:ring-primary-foreground/30 skippr:disabled:opacity-50",
5138
5337
  children: [
5139
5338
  /* @__PURE__ */ jsx14("button", {
5140
5339
  type: "button",
@@ -5144,7 +5343,7 @@ function HeaderModeToggle() {
5144
5343
  if (textMode)
5145
5344
  toggleTextMode();
5146
5345
  },
5147
- 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"),
5346
+ 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-primary-foreground 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-foreground skippr:shadow-sm"),
5148
5347
  children: "Voice"
5149
5348
  }),
5150
5349
  /* @__PURE__ */ jsx14("button", {
@@ -5155,7 +5354,7 @@ function HeaderModeToggle() {
5155
5354
  if (!textMode)
5156
5355
  toggleTextMode();
5157
5356
  },
5158
- 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:bg-white skippr:text-primary skippr:shadow-sm" : "skippr:font-semibold skippr:text-primary-foreground"),
5357
+ 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-primary-foreground skippr:disabled:cursor-not-allowed", isHeld ? "skippr:cursor-not-allowed" : "skippr:cursor-pointer", textMode ? "skippr:bg-white skippr:text-foreground skippr:shadow-sm" : "skippr:font-semibold skippr:text-primary-foreground"),
5159
5358
  children: "Text"
5160
5359
  })
5161
5360
  ]
@@ -5191,7 +5390,7 @@ function LoadingDots({ label }) {
5191
5390
  }
5192
5391
 
5193
5392
  // src/components/LoginFlow.tsx
5194
- import { useCallback as useCallback16, useEffect as useEffect25, useRef as useRef20, useState as useState18 } from "react";
5393
+ import { useCallback as useCallback16, useEffect as useEffect26, useRef as useRef22, useState as useState19 } from "react";
5195
5394
 
5196
5395
  // src/components/ui/button.tsx
5197
5396
  import { forwardRef as forwardRef3 } from "react";
@@ -5227,8 +5426,8 @@ import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
5227
5426
  var OTP_LENGTH = 6;
5228
5427
  var DIGIT_KEYS = ["d0", "d1", "d2", "d3", "d4", "d5"];
5229
5428
  function LoginFlow({ requestOtp, verifyOtp, error, isSubmitting }) {
5230
- const [step, setStep] = useState18("email");
5231
- const [email, setEmail] = useState18("");
5429
+ const [step, setStep] = useState19("email");
5430
+ const [email, setEmail] = useState19("");
5232
5431
  const handleRequestOtp = useCallback16(async (emailValue) => {
5233
5432
  const success = await requestOtp(emailValue);
5234
5433
  if (success)
@@ -5317,18 +5516,18 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
5317
5516
  });
5318
5517
  }
5319
5518
  function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
5320
- const [digits, setDigits] = useState18(Array(OTP_LENGTH).fill(""));
5321
- const [resendCooldown, setResendCooldown] = useState18(0);
5322
- const inputRefs = useRef20([]);
5323
- const submittedRef = useRef20(false);
5324
- useEffect25(() => {
5519
+ const [digits, setDigits] = useState19(Array(OTP_LENGTH).fill(""));
5520
+ const [resendCooldown, setResendCooldown] = useState19(0);
5521
+ const inputRefs = useRef22([]);
5522
+ const submittedRef = useRef22(false);
5523
+ useEffect26(() => {
5325
5524
  inputRefs.current[0]?.focus();
5326
5525
  }, []);
5327
- useEffect25(() => {
5526
+ useEffect26(() => {
5328
5527
  if (error)
5329
5528
  submittedRef.current = false;
5330
5529
  }, [error]);
5331
- useEffect25(() => {
5530
+ useEffect26(() => {
5332
5531
  if (resendCooldown <= 0)
5333
5532
  return;
5334
5533
  const timer = setTimeout(() => setResendCooldown((c) => c - 1), 1000);
@@ -5469,17 +5668,17 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
5469
5668
  }
5470
5669
 
5471
5670
  // src/components/MessageList.tsx
5472
- import { useCallback as useCallback17, useLayoutEffect as useLayoutEffect3, useRef as useRef22, useState as useState20 } from "react";
5671
+ import { useCallback as useCallback17, useLayoutEffect as useLayoutEffect3, useRef as useRef24, useState as useState21 } from "react";
5473
5672
 
5474
5673
  // src/components/ChatInput.tsx
5475
- import { useEffect as useEffect26, useRef as useRef21, useState as useState19 } from "react";
5674
+ import { useEffect as useEffect27, useRef as useRef23, useState as useState20 } from "react";
5476
5675
  import { jsx as jsx18, jsxs as jsxs14 } from "react/jsx-runtime";
5477
5676
  var MAX_INPUT_HEIGHT = 60;
5478
5677
  function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
5479
- const [inputText, setInputText] = useState19("");
5480
- const textareaRef = useRef21(null);
5678
+ const [inputText, setInputText] = useState20("");
5679
+ const textareaRef = useRef23(null);
5481
5680
  const canSend = inputText.trim().length > 0 && !isSendingChat;
5482
- useEffect26(() => {
5681
+ useEffect27(() => {
5483
5682
  if (autoFocus)
5484
5683
  textareaRef.current?.focus();
5485
5684
  }, [autoFocus]);
@@ -5570,7 +5769,7 @@ function ChatMessage({ message }) {
5570
5769
  }
5571
5770
 
5572
5771
  // src/components/PlanCard.tsx
5573
- import { useEffect as useEffect27 } from "react";
5772
+ import { useEffect as useEffect28 } from "react";
5574
5773
  import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
5575
5774
  var APPROVE_MESSAGE = "Yes, go ahead.";
5576
5775
  var CANCEL_MESSAGE = "No, cancel that.";
@@ -5597,7 +5796,7 @@ function StepIcon({ status }) {
5597
5796
  }
5598
5797
  function PlanCard({ plan, sendChatMessage, onDismiss }) {
5599
5798
  const awaitingApproval = plan.state === "proposed";
5600
- useEffect27(() => {
5799
+ useEffect28(() => {
5601
5800
  if (plan.state !== "completed")
5602
5801
  return;
5603
5802
  const timer = setTimeout(onDismiss, COMPLETED_CARD_VISIBLE_MS);
@@ -5690,12 +5889,12 @@ function MessageList({
5690
5889
  autoFocus = false,
5691
5890
  readOnly = false
5692
5891
  }) {
5693
- const containerRef = useRef22(null);
5694
- const isPinnedToBottom = useRef22(true);
5695
- const lastSeenMessageId = useRef22(undefined);
5696
- const [showJumpToLatest, setShowJumpToLatest] = useState20(false);
5892
+ const containerRef = useRef24(null);
5893
+ const isPinnedToBottom = useRef24(true);
5894
+ const lastSeenMessageId = useRef24(undefined);
5895
+ const [showJumpToLatest, setShowJumpToLatest] = useState21(false);
5697
5896
  const lastMessage = messages.length > 0 ? messages[messages.length - 1] : undefined;
5698
- const [dismissedPlanId, setDismissedPlanId] = useState20(null);
5897
+ const [dismissedPlanId, setDismissedPlanId] = useState21(null);
5699
5898
  const dismissPlan = useCallback17(() => {
5700
5899
  if (plan)
5701
5900
  setDismissedPlanId(plan.planId);
@@ -5891,6 +6090,7 @@ function Sidebar({
5891
6090
  const defaultAgentId = internalCtx?.defaultAgentId ?? null;
5892
6091
  const startDefaultSession = internalCtx?.startDefaultSession ?? (() => {});
5893
6092
  const talkDisabled = !(internalCtx?.hasResolvedModules ?? false);
6093
+ const hasResolvedModules = useOnceTrue(internalCtx?.hasResolvedModules ?? false);
5894
6094
  const usesHostAuth = internalCtx?.usesHostAuth ?? false;
5895
6095
  const authFailed = internalCtx?.authFailed ?? false;
5896
6096
  const idleHistory = internalCtx?.idleHistory ?? {
@@ -5916,7 +6116,7 @@ function Sidebar({
5916
6116
  height: panelExpanded ? availableHeight : `min(${PANEL_MAX_HEIGHT_PX}px, ${availableHeight})`
5917
6117
  };
5918
6118
  }
5919
- useEffect28(() => {
6119
+ useEffect29(() => {
5920
6120
  if (!isSidebar)
5921
6121
  return;
5922
6122
  const prop = position === "right" ? "marginRight" : "marginLeft";
@@ -5936,7 +6136,7 @@ function Sidebar({
5936
6136
  style: { width: isPanelOpen ? SIDEBAR_WIDTH : undefined, ...floatingStyle },
5937
6137
  children: [
5938
6138
  !hideHeader && /* @__PURE__ */ jsx25(ChatHeader, {}),
5939
- authFailed ? /* @__PURE__ */ jsx25(AuthError, {}) : isAuthenticated ? /* @__PURE__ */ jsx25(AuthenticatedContent, {
6139
+ authFailed ? /* @__PURE__ */ jsx25(AuthError, {}) : isAuthenticated && hasResolvedModules ? /* @__PURE__ */ jsx25(AuthenticatedContent, {
5940
6140
  isConnected,
5941
6141
  isPaused,
5942
6142
  isPausing,
@@ -5952,7 +6152,7 @@ function Sidebar({
5952
6152
  onTalk: startDefaultSession,
5953
6153
  talkLabel: startSessionLabel,
5954
6154
  talkDisabled
5955
- }) : usesHostAuth || isValidating ? /* @__PURE__ */ jsx25("div", {
6155
+ }) : usesHostAuth || isValidating || isAuthenticated ? /* @__PURE__ */ jsx25("div", {
5956
6156
  className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
5957
6157
  children: /* @__PURE__ */ jsx25(LoadingDots, {
5958
6158
  label: "Loading..."
@@ -6246,6 +6446,7 @@ function SidebarTrigger() {
6246
6446
  const internalCtx = useContext14(LiveAgentContext);
6247
6447
  const launcherBottomPx = internalCtx?.launcherBottomPx ?? DEFAULT_LAUNCHER_BOTTOM_PX;
6248
6448
  const popsDown = internalCtx?.popsDown ?? false;
6449
+ const logoUrl = internalCtx?.appearance?.logoUrl ?? null;
6249
6450
  if (isMinimized || isConnected || isStarting || isPausing)
6250
6451
  return null;
6251
6452
  const handleClick = isPanelOpen && minimizable ? minimizePanel : togglePanel;
@@ -6258,6 +6459,10 @@ function SidebarTrigger() {
6258
6459
  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"),
6259
6460
  children: isPanelOpen ? /* @__PURE__ */ jsx27(ChevronDown, {
6260
6461
  className: "skippr:size-5"
6462
+ }) : logoUrl ? /* @__PURE__ */ jsx27("img", {
6463
+ src: logoUrl,
6464
+ alt: "",
6465
+ className: "skippr:size-12 skippr:object-cover"
6261
6466
  }) : /* @__PURE__ */ jsx27(Logo, {
6262
6467
  className: "skippr:size-12"
6263
6468
  })
@@ -6266,6 +6471,14 @@ function SidebarTrigger() {
6266
6471
 
6267
6472
  // src/components/LiveAgent.tsx
6268
6473
  import { jsx as jsx28, jsxs as jsxs22 } from "react/jsx-runtime";
6474
+ function readSavedPosition() {
6475
+ try {
6476
+ const saved = localStorage.getItem("skippr_widget_position");
6477
+ return saved === "left" || saved === "right" ? saved : null;
6478
+ } catch {
6479
+ return null;
6480
+ }
6481
+ }
6269
6482
  function readSavedLauncherBottom() {
6270
6483
  try {
6271
6484
  const saved = Number.parseInt(localStorage.getItem("skippr_widget_bottom") ?? "", 10);
@@ -6283,8 +6496,8 @@ function AgentCursorMount({ animated }) {
6283
6496
  function PlanPanelOpener() {
6284
6497
  const plan = usePlanUpdates();
6285
6498
  const { expandPanel } = useLiveAgent();
6286
- const surfacedPlanIdRef = useRef23(null);
6287
- useEffect29(() => {
6499
+ const surfacedPlanIdRef = useRef25(null);
6500
+ useEffect30(() => {
6288
6501
  if (plan?.state !== "proposed" || surfacedPlanIdRef.current === plan.planId)
6289
6502
  return;
6290
6503
  surfacedPlanIdRef.current = plan.planId;
@@ -6299,8 +6512,7 @@ function LiveAgent(props) {
6299
6512
  appKey,
6300
6513
  getUserToken,
6301
6514
  userToken,
6302
- position = "right",
6303
- verticalAlign = "bottom",
6515
+ verticalAlign: hostVerticalAlign,
6304
6516
  variant = "floating",
6305
6517
  minimizable = true,
6306
6518
  defaultOpen = false,
@@ -6324,7 +6536,7 @@ function LiveAgent(props) {
6324
6536
  const auth = useAuth({ appKey });
6325
6537
  const usesHostAuth = !!getUserToken || !!userToken || !!authTokenProp;
6326
6538
  const effectiveAuthToken = usesHostAuth ? authTokenProp : auth.authToken ?? undefined;
6327
- const [activeModule, setActiveModule] = useState21(null);
6539
+ const [activeModule, setActiveModule] = useState22(null);
6328
6540
  const minimizeOnSessionStart = useCallback18(() => {
6329
6541
  if (minimizable) {
6330
6542
  setIsMinimized(true);
@@ -6370,7 +6582,7 @@ function LiveAgent(props) {
6370
6582
  onStartError: expandOnSessionStartError,
6371
6583
  onDisconnect: minimizeOnSessionDisconnect
6372
6584
  });
6373
- const teardownInFlightRef = useRef23(false);
6585
+ const teardownInFlightRef = useRef25(false);
6374
6586
  teardownInFlightRef.current = isPaused || isPausing || isDisconnecting;
6375
6587
  const handleRoomDisconnected = useCallback18(() => {
6376
6588
  if (teardownInFlightRef.current)
@@ -6378,28 +6590,29 @@ function LiveAgent(props) {
6378
6590
  disconnect();
6379
6591
  }, [disconnect]);
6380
6592
  const isSessionLive = connection !== null || isStarting || isPausing || isDisconnecting;
6381
- const [isPanelOpen, setIsPanelOpen] = useState21(defaultOpen);
6382
- const [isMinimized, setIsMinimized] = useState21(minimizable && !defaultOpen);
6383
- const [sidebarTab, setSidebarTab] = useState21("agenda");
6384
- const [phasesSnapshot, setPhasesSnapshot] = useState21([]);
6385
- const [textMode, setTextMode] = useState21(false);
6386
- const [panelExpanded, setPanelExpanded] = useState21(false);
6593
+ const [isPanelOpen, setIsPanelOpen] = useState22(defaultOpen);
6594
+ const [isMinimized, setIsMinimized] = useState22(minimizable && !defaultOpen);
6595
+ const [sidebarTab, setSidebarTab] = useState22("agenda");
6596
+ const [phasesSnapshot, setPhasesSnapshot] = useState22([]);
6597
+ const [textMode, setTextMode] = useState22(false);
6598
+ const [panelExpanded, setPanelExpanded] = useState22(false);
6387
6599
  const togglePanelExpanded = useCallback18(() => setPanelExpanded((prev) => !prev), []);
6388
- const panelRef = useRef23(null);
6389
- const controlBarRef = useRef23(null);
6390
- const [isDragging, setIsDragging] = useState21(false);
6600
+ const panelRef = useRef25(null);
6601
+ const controlBarRef = useRef25(null);
6602
+ const [isDragging, setIsDragging] = useState22(false);
6391
6603
  const setTextModeState = useCallback18((enabled) => {
6392
6604
  setTextMode(enabled);
6393
6605
  }, []);
6394
6606
  const isConnected = connection !== null;
6395
6607
  const showControlBar = isConnected || isStarting || isPausing;
6396
- useEffect29(() => {
6608
+ useEffect30(() => {
6397
6609
  if (!isConnected)
6398
6610
  setTextModeState(false);
6399
6611
  }, [isConnected, setTextModeState]);
6400
6612
  const {
6401
6613
  modules: availableModules,
6402
6614
  defaultSelection,
6615
+ appearance,
6403
6616
  isLoading: isLoadingModules,
6404
6617
  hasResolved: hasResolvedModules,
6405
6618
  error: modulesError,
@@ -6410,6 +6623,10 @@ function LiveAgent(props) {
6410
6623
  authedFetch,
6411
6624
  agentId: hostAgentId ?? undefined
6412
6625
  });
6626
+ const isAuthenticated = bearerToken !== null || auth.isAuthenticated;
6627
+ const isBootAuthPending = usesHostAuth ? !!appKey && !isAuthenticated && !authFailed : !!appKey && !auth.hasResolvedStoredToken;
6628
+ const isAwaitingModules = isAuthenticated ? !hasResolvedModules : isBootAuthPending;
6629
+ const isLauncherRevealed = useOnceTrue(!isAwaitingModules);
6413
6630
  const { goals: adoptionGoals, attendGoal } = useAdoptionGoals({
6414
6631
  enabled: !isSessionLive,
6415
6632
  bearerToken,
@@ -6455,27 +6672,38 @@ function LiveAgent(props) {
6455
6672
  adoptionGoalId: goal.goalId
6456
6673
  });
6457
6674
  }, [attendGoal, availableModules, startSession]);
6458
- const [welcomeDismissed, setWelcomeDismissed] = useState21(false);
6675
+ const [welcomeDismissed, setWelcomeDismissed] = useState22(false);
6459
6676
  const dismissWelcome = useCallback18(() => setWelcomeDismissed(true), []);
6460
- const [currentPosition, setCurrentPosition] = useState21(() => {
6461
- try {
6462
- const saved = localStorage.getItem("skippr_widget_position");
6463
- if (saved === "left" || saved === "right")
6464
- return saved;
6465
- } catch {}
6466
- return position;
6467
- });
6677
+ const [savedPosition] = useState22(readSavedPosition);
6678
+ const [currentPosition, setCurrentPosition] = useState22(savedPosition ?? "right");
6679
+ const positionLockedRef = useRef25(savedPosition !== null);
6468
6680
  const setPositionWithPersist = useCallback18((pos) => {
6681
+ positionLockedRef.current = true;
6469
6682
  setCurrentPosition(pos);
6470
6683
  try {
6471
6684
  localStorage.setItem("skippr_widget_position", pos);
6472
6685
  } catch {}
6473
6686
  }, []);
6474
- const savedLauncherBottom = readSavedLauncherBottom();
6475
- const hasDraggedRef = useRef23(savedLauncherBottom !== null);
6476
- const verticalAlignRef = useRef23(verticalAlign);
6477
- const [launcherBottomPx, setLauncherBottomPxState] = useState21(() => savedLauncherBottom !== null ? clampLauncherBottom(savedLauncherBottom) : verticalAlignToBottomPx(verticalAlign));
6478
- const [popsDown, setPopsDown] = useState21(() => launcherPopsDown(launcherBottomPx));
6687
+ const serverPosition = appearance?.position ?? null;
6688
+ useEffect30(() => {
6689
+ if (!serverPosition || positionLockedRef.current)
6690
+ return;
6691
+ setCurrentPosition(serverPosition);
6692
+ }, [serverPosition]);
6693
+ const [savedLauncherBottom] = useState22(readSavedLauncherBottom);
6694
+ const hasDraggedRef = useRef25(savedLauncherBottom !== null);
6695
+ const verticalAlignRef = useRef25(hostVerticalAlign ?? "bottom");
6696
+ const [launcherBottomPx, setLauncherBottomPxState] = useState22(() => savedLauncherBottom !== null ? clampLauncherBottom(savedLauncherBottom) : verticalAlignToBottomPx(verticalAlignRef.current));
6697
+ const [popsDown, setPopsDown] = useState22(() => launcherPopsDown(launcherBottomPx));
6698
+ const serverVerticalAlign = appearance?.verticalAlign ?? null;
6699
+ useEffect30(() => {
6700
+ if (!serverVerticalAlign || hostVerticalAlign !== undefined || hasDraggedRef.current)
6701
+ return;
6702
+ verticalAlignRef.current = serverVerticalAlign;
6703
+ const next = verticalAlignToBottomPx(serverVerticalAlign);
6704
+ setLauncherBottomPxState(next);
6705
+ setPopsDown(launcherPopsDown(next));
6706
+ }, [serverVerticalAlign, hostVerticalAlign]);
6479
6707
  const setLauncherBottomPx = useCallback18((px) => {
6480
6708
  hasDraggedRef.current = true;
6481
6709
  setLauncherBottomPxState(px);
@@ -6484,13 +6712,13 @@ function LiveAgent(props) {
6484
6712
  localStorage.setItem("skippr_widget_bottom", String(px));
6485
6713
  } catch {}
6486
6714
  }, []);
6487
- const launcherBottomPxRef = useRef23(launcherBottomPx);
6715
+ const launcherBottomPxRef = useRef25(launcherBottomPx);
6488
6716
  launcherBottomPxRef.current = launcherBottomPx;
6489
6717
  const commitLauncherDrop = useCallback18(({ side, bottomPx }) => {
6490
6718
  setPositionWithPersist(side);
6491
6719
  setLauncherBottomPx(bottomPx);
6492
6720
  }, [setPositionWithPersist, setLauncherBottomPx]);
6493
- useEffect29(() => {
6721
+ useEffect30(() => {
6494
6722
  const syncToViewport = () => {
6495
6723
  const next = hasDraggedRef.current ? clampLauncherBottom(launcherBottomPxRef.current) : verticalAlignToBottomPx(verticalAlignRef.current);
6496
6724
  setLauncherBottomPxState(next);
@@ -6517,7 +6745,6 @@ function LiveAgent(props) {
6517
6745
  await pauseSession();
6518
6746
  minimizePanel();
6519
6747
  }, [pauseSession, minimizePanel]);
6520
- const isAuthenticated = bearerToken !== null || auth.isAuthenticated;
6521
6748
  const defaultAgentId = hostAgentId ?? defaultSelection.agentId;
6522
6749
  const startDefaultSession = useCallback18(() => {
6523
6750
  const target = availableModules.find((m) => m.id === defaultAgentId);
@@ -6614,6 +6841,7 @@ function LiveAgent(props) {
6614
6841
  refetchModules,
6615
6842
  selectModule,
6616
6843
  hasResolvedModules,
6844
+ appearance,
6617
6845
  adoptionGoals,
6618
6846
  startAdoptionSession
6619
6847
  }), [
@@ -6679,6 +6907,7 @@ function LiveAgent(props) {
6679
6907
  refetchModules,
6680
6908
  selectModule,
6681
6909
  hasResolvedModules,
6910
+ appearance,
6682
6911
  adoptionGoals,
6683
6912
  startAdoptionSession
6684
6913
  ]);
@@ -6692,47 +6921,50 @@ function LiveAgent(props) {
6692
6921
  onDisconnected: handleRoomDisconnected,
6693
6922
  children: [
6694
6923
  connection && !textMode && /* @__PURE__ */ jsx28(RoomAudioRenderer, {}),
6695
- connection && captureMode === CAPTURE_MODE.Screenshare && /* @__PURE__ */ jsx28(AutoStartMedia, {
6696
- pendingScreenStream,
6697
- pushOrTapMicMode: isRequestResponseMicMode(agentControls?.micMode)
6698
- }),
6699
- connection && captureMode === CAPTURE_MODE.Auto && /* @__PURE__ */ jsx28(DomCapture, {
6700
- pushOrTapMicMode: isRequestResponseMicMode(agentControls?.micMode)
6701
- }),
6702
- /* @__PURE__ */ jsxs22(ShadowHost, {
6924
+ /* @__PURE__ */ jsxs22(SessionHoldProvider, {
6703
6925
  children: [
6704
- connection && captureMode === CAPTURE_MODE.Auto && agentControls?.highlight && /* @__PURE__ */ jsx28(HighlightOverlay, {}),
6705
- connection && captureMode === CAPTURE_MODE.Auto && agentControls?.actions && /* @__PURE__ */ jsx28(PageActionHandler, {}),
6706
- connection && captureMode === CAPTURE_MODE.Auto && agentControls?.actions && /* @__PURE__ */ jsx28(PlanPanelOpener, {}),
6707
- connection && captureMode === CAPTURE_MODE.Auto && (agentControls?.highlight || agentControls?.actions) && /* @__PURE__ */ jsx28(AgentCursorMount, {
6708
- animated: shouldAnimateCursor
6926
+ connection && captureMode === CAPTURE_MODE.Screenshare && /* @__PURE__ */ jsx28(AutoStartMedia, {
6927
+ pendingScreenStream,
6928
+ pushOrTapMicMode: isRequestResponseMicMode(agentControls?.micMode)
6709
6929
  }),
6710
- /* @__PURE__ */ jsx28(SessionHoldProvider, {
6711
- children: /* @__PURE__ */ jsx28(VoiceTurnProvider, {
6712
- children: /* @__PURE__ */ jsx28(TranscriptionsProvider, {
6713
- children: /* @__PURE__ */ jsxs22("div", {
6714
- id: WIDGET_ROOT_ID,
6715
- children: [
6716
- isMinimized && !showControlBar && /* @__PURE__ */ jsx28(MinimizedBubble, {
6717
- welcomeMessage,
6718
- welcomeDismissed,
6719
- onDismissWelcome: dismissWelcome
6720
- }),
6721
- showControlBar && !hideControls && /* @__PURE__ */ jsx28(SessionControlBar, {}),
6722
- /* @__PURE__ */ jsx28(SidebarTrigger, {}),
6723
- /* @__PURE__ */ jsx28(Sidebar, {
6724
- hideControls,
6725
- hideHeader,
6726
- startSessionLabel
6727
- })
6728
- ]
6930
+ connection && captureMode === CAPTURE_MODE.Auto && /* @__PURE__ */ jsx28(DomCapture, {
6931
+ pushOrTapMicMode: isRequestResponseMicMode(agentControls?.micMode)
6932
+ }),
6933
+ /* @__PURE__ */ jsxs22(ShadowHost, {
6934
+ accentColor: appearance?.accentColor ?? null,
6935
+ children: [
6936
+ connection && captureMode === CAPTURE_MODE.Auto && agentControls?.highlight && /* @__PURE__ */ jsx28(HighlightOverlay, {}),
6937
+ connection && captureMode === CAPTURE_MODE.Auto && agentControls?.actions && /* @__PURE__ */ jsx28(PageActionHandler, {}),
6938
+ connection && captureMode === CAPTURE_MODE.Auto && agentControls?.actions && /* @__PURE__ */ jsx28(PlanPanelOpener, {}),
6939
+ connection && captureMode === CAPTURE_MODE.Auto && (agentControls?.highlight || agentControls?.actions) && /* @__PURE__ */ jsx28(AgentCursorMount, {
6940
+ animated: shouldAnimateCursor
6941
+ }),
6942
+ /* @__PURE__ */ jsx28(VoiceTurnProvider, {
6943
+ children: /* @__PURE__ */ jsx28(TranscriptionsProvider, {
6944
+ children: /* @__PURE__ */ jsxs22("div", {
6945
+ id: WIDGET_ROOT_ID,
6946
+ children: [
6947
+ isMinimized && !showControlBar && isLauncherRevealed && /* @__PURE__ */ jsx28(MinimizedBubble, {
6948
+ welcomeMessage,
6949
+ welcomeDismissed,
6950
+ onDismissWelcome: dismissWelcome
6951
+ }),
6952
+ showControlBar && !hideControls && /* @__PURE__ */ jsx28(SessionControlBar, {}),
6953
+ /* @__PURE__ */ jsx28(SidebarTrigger, {}),
6954
+ /* @__PURE__ */ jsx28(Sidebar, {
6955
+ hideControls,
6956
+ hideHeader,
6957
+ startSessionLabel
6958
+ })
6959
+ ]
6960
+ })
6729
6961
  })
6730
6962
  })
6731
- })
6732
- })
6963
+ ]
6964
+ }),
6965
+ children
6733
6966
  ]
6734
- }),
6735
- children
6967
+ })
6736
6968
  ]
6737
6969
  })
6738
6970
  });
@@ -6743,9 +6975,14 @@ function useIsLocalSpeaking() {
6743
6975
  const { localParticipant } = useLocalParticipant12();
6744
6976
  return useIsSpeaking(localParticipant);
6745
6977
  }
6978
+ // src/hooks/useIsSessionHeld.ts
6979
+ function useIsSessionHeld() {
6980
+ return useSessionHoldContext().isHeld;
6981
+ }
6746
6982
  export {
6747
6983
  useMediaControls,
6748
6984
  useLiveAgent,
6985
+ useIsSessionHeld,
6749
6986
  useIsLocalSpeaking,
6750
6987
  useElapsedSeconds,
6751
6988
  useAgentVoiceState,