@skippr/live-agent-sdk 0.12.0 → 0.14.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.
@@ -22,6 +22,7 @@ function useSession({ agentId, authToken, appKey }) {
22
22
  const [isStarting, setIsStarting] = useState(false);
23
23
  const [error, setError] = useState("");
24
24
  const [sessionId, setSessionId] = useState(null);
25
+ const [sessionToken, setSessionToken] = useState(null);
25
26
  const startSession = useCallback(async () => {
26
27
  setIsStarting(true);
27
28
  setError("");
@@ -36,15 +37,17 @@ function useSession({ agentId, authToken, appKey }) {
36
37
  throw new Error(`Failed to create session: ${createResp.status}`);
37
38
  }
38
39
  const { session } = await createResp.json();
40
+ const sessionHeaders = { "X-Session-Token": session.sessionToken };
39
41
  const startResp = await fetch(`${API_URL}/v1/sessions/${session.id}/start`, {
40
42
  method: "POST",
41
- headers: authHeaders
43
+ headers: sessionHeaders
42
44
  });
43
45
  if (!startResp.ok) {
44
46
  throw new Error(`Failed to start session: ${startResp.status}`);
45
47
  }
46
48
  const { connection: conn } = await startResp.json();
47
49
  setSessionId(session.id);
50
+ setSessionToken(session.sessionToken);
48
51
  setConnection({
49
52
  livekitUrl: conn.livekitUrl,
50
53
  token: conn.token
@@ -57,12 +60,12 @@ function useSession({ agentId, authToken, appKey }) {
57
60
  }
58
61
  }, [agentId, authToken, appKey]);
59
62
  const disconnect = useCallback(async () => {
60
- if (sessionId) {
61
- const authHeaders = resolveAuthHeaders(authToken, appKey);
63
+ if (sessionId && sessionToken) {
64
+ const sessionHeaders = { "X-Session-Token": sessionToken };
62
65
  try {
63
66
  await fetch(`${API_URL}/v1/sessions/${sessionId}/complete`, {
64
67
  method: "POST",
65
- headers: { "Content-Type": "application/json", ...authHeaders },
68
+ headers: { "Content-Type": "application/json", ...sessionHeaders },
66
69
  body: JSON.stringify({})
67
70
  });
68
71
  } catch {}
@@ -71,7 +74,8 @@ function useSession({ agentId, authToken, appKey }) {
71
74
  setShouldConnect(false);
72
75
  setConnection(null);
73
76
  setSessionId(null);
74
- }, [sessionId, authToken, appKey]);
77
+ setSessionToken(null);
78
+ }, [sessionId, sessionToken]);
75
79
  return { connection, shouldConnect, isStarting, error, startSession, disconnect };
76
80
  }
77
81
 
@@ -517,7 +521,7 @@ function ChatHeader({ onClose }) {
517
521
  // src/components/MeetingControls.tsx
518
522
  import { useLocalParticipant as useLocalParticipant3 } from "@livekit/components-react";
519
523
  import { ScreenSharePresets } from "livekit-client";
520
- import { useCallback as useCallback4, useEffect as useEffect2, useState as useState3 } from "react";
524
+ import { useCallback as useCallback4, useEffect as useEffect2, useRef, useState as useState3 } from "react";
521
525
 
522
526
  // src/lib/format.ts
523
527
  function formatTime(seconds) {
@@ -525,18 +529,45 @@ function formatTime(seconds) {
525
529
  const s = (seconds % 60).toString().padStart(2, "0");
526
530
  return `${m}:${s}`;
527
531
  }
532
+ function parseNumber(s) {
533
+ const n = Number(s);
534
+ return n > 0 ? n : null;
535
+ }
536
+
537
+ // src/components/SessionWarningBanner.tsx
538
+ import { jsx as jsx3 } from "react/jsx-runtime";
539
+ var SESSION_WARNING_THRESHOLD_SECS = 60;
540
+ function SessionWarningBanner({ remaining }) {
541
+ if (remaining === null || remaining <= 0 || remaining > SESSION_WARNING_THRESHOLD_SECS)
542
+ return null;
543
+ return /* @__PURE__ */ jsx3("div", {
544
+ "data-testid": "session-warning-banner",
545
+ className: "skippr:bg-red-50 skippr:px-4 skippr:py-1.5 skippr:text-center skippr:text-xs skippr:font-medium skippr:text-red-700",
546
+ children: "Session ending soon"
547
+ });
548
+ }
528
549
 
529
550
  // src/components/MeetingControls.tsx
530
- import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
551
+ import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
531
552
  function MeetingControls({ onHangUp }) {
553
+ const maxCallDuration = useAgentState("maxCallDuration", parseNumber, null);
532
554
  const { localParticipant } = useLocalParticipant3();
533
555
  const isMuted = !localParticipant.isMicrophoneEnabled;
534
556
  const isScreenSharing = localParticipant.isScreenShareEnabled;
535
- const [elapsed, setElapsed] = useState3(0);
557
+ const endTimeRef = useRef(null);
558
+ const [remaining, setRemaining] = useState3(null);
536
559
  useEffect2(() => {
537
- const id = setInterval(() => setElapsed((t) => t + 1), 1000);
560
+ if (maxCallDuration === null || endTimeRef.current !== null)
561
+ return;
562
+ endTimeRef.current = Date.now() + maxCallDuration * 1000;
563
+ const tick = () => {
564
+ const secs = Math.ceil((endTimeRef.current - Date.now()) / 1000);
565
+ setRemaining(Math.max(secs, 0));
566
+ };
567
+ tick();
568
+ const id = setInterval(tick, 1000);
538
569
  return () => clearInterval(id);
539
- }, []);
570
+ }, [maxCallDuration]);
540
571
  const toggleMute = useCallback4(async () => {
541
572
  try {
542
573
  await localParticipant.setMicrophoneEnabled(isMuted);
@@ -559,58 +590,65 @@ function MeetingControls({ onHangUp }) {
559
590
  toggleMute().then(() => toggleScreenShare());
560
591
  }, []);
561
592
  return /* @__PURE__ */ jsxs2("div", {
562
- className: "skippr:flex skippr:items-center skippr:justify-between skippr:border-b skippr:px-4 skippr:py-3",
563
593
  children: [
594
+ /* @__PURE__ */ jsx4(SessionWarningBanner, {
595
+ remaining
596
+ }),
564
597
  /* @__PURE__ */ jsxs2("div", {
565
- className: "skippr:flex skippr:items-center skippr:gap-2",
598
+ className: "skippr:flex skippr:items-center skippr:justify-between skippr:border-b skippr:px-4 skippr:py-3",
566
599
  children: [
567
- /* @__PURE__ */ jsx3(Button, {
568
- size: "icon-sm",
569
- variant: isMuted ? "destructive" : "outline",
570
- onClick: toggleMute,
571
- "aria-label": isMuted ? "Unmute" : "Mute",
572
- children: isMuted ? /* @__PURE__ */ jsx3(MicOff, {
573
- className: "skippr:size-4"
574
- }) : /* @__PURE__ */ jsx3(Mic, {
575
- className: "skippr:size-4"
576
- })
600
+ /* @__PURE__ */ jsxs2("div", {
601
+ className: "skippr:flex skippr:items-center skippr:gap-2",
602
+ children: [
603
+ /* @__PURE__ */ jsx4(Button, {
604
+ size: "icon-sm",
605
+ variant: isMuted ? "destructive" : "outline",
606
+ onClick: toggleMute,
607
+ "aria-label": isMuted ? "Unmute" : "Mute",
608
+ children: isMuted ? /* @__PURE__ */ jsx4(MicOff, {
609
+ className: "skippr:size-4"
610
+ }) : /* @__PURE__ */ jsx4(Mic, {
611
+ className: "skippr:size-4"
612
+ })
613
+ }),
614
+ /* @__PURE__ */ jsx4(Button, {
615
+ size: "icon-sm",
616
+ variant: isScreenSharing ? "default" : "outline",
617
+ onClick: toggleScreenShare,
618
+ "aria-label": isScreenSharing ? "Stop sharing" : "Share screen",
619
+ children: isScreenSharing ? /* @__PURE__ */ jsx4(MonitorOff, {
620
+ className: "skippr:size-4"
621
+ }) : /* @__PURE__ */ jsx4(Monitor, {
622
+ className: "skippr:size-4"
623
+ })
624
+ })
625
+ ]
626
+ }),
627
+ remaining !== null && /* @__PURE__ */ jsx4("span", {
628
+ className: cn("skippr:text-sm skippr:font-medium skippr:tabular-nums", remaining <= SESSION_WARNING_THRESHOLD_SECS ? "skippr:text-red-600 skippr:animate-pulse" : "skippr:text-muted-foreground"),
629
+ children: formatTime(remaining)
577
630
  }),
578
- /* @__PURE__ */ jsx3(Button, {
631
+ /* @__PURE__ */ jsx4(Button, {
579
632
  size: "icon-sm",
580
- variant: isScreenSharing ? "default" : "outline",
581
- onClick: toggleScreenShare,
582
- "aria-label": isScreenSharing ? "Stop sharing" : "Share screen",
583
- children: isScreenSharing ? /* @__PURE__ */ jsx3(MonitorOff, {
584
- className: "skippr:size-4"
585
- }) : /* @__PURE__ */ jsx3(Monitor, {
633
+ variant: "destructive",
634
+ onClick: onHangUp,
635
+ "aria-label": "Hang up",
636
+ children: /* @__PURE__ */ jsx4(PhoneOff, {
586
637
  className: "skippr:size-4"
587
638
  })
588
639
  })
589
640
  ]
590
- }),
591
- /* @__PURE__ */ jsx3("span", {
592
- className: "skippr:text-sm skippr:font-medium skippr:tabular-nums skippr:text-muted-foreground",
593
- children: formatTime(elapsed)
594
- }),
595
- /* @__PURE__ */ jsx3(Button, {
596
- size: "icon-sm",
597
- variant: "destructive",
598
- onClick: onHangUp,
599
- "aria-label": "Hang up",
600
- children: /* @__PURE__ */ jsx3(PhoneOff, {
601
- className: "skippr:size-4"
602
- })
603
641
  })
604
642
  ]
605
643
  });
606
644
  }
607
645
 
608
646
  // src/components/MessageList.tsx
609
- import { useEffect as useEffect3, useRef } from "react";
647
+ import { useEffect as useEffect3, useRef as useRef2 } from "react";
610
648
 
611
649
  // src/components/ChatInput.tsx
612
650
  import { useState as useState4 } from "react";
613
- import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
651
+ import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
614
652
  function ChatInput({ sendChatMessage, isSendingChat }) {
615
653
  const [inputText, setInputText] = useState4("");
616
654
  const canSend = inputText.trim().length > 0 && !isSendingChat;
@@ -626,7 +664,7 @@ function ChatInput({ sendChatMessage, isSendingChat }) {
626
664
  onSubmit: handleSubmit,
627
665
  className: "skippr:flex skippr:items-center skippr:gap-2 skippr:border-t skippr:border-border skippr:px-3 skippr:py-2",
628
666
  children: [
629
- /* @__PURE__ */ jsx4("input", {
667
+ /* @__PURE__ */ jsx5("input", {
630
668
  type: "text",
631
669
  value: inputText,
632
670
  onChange: (e) => setInputText(e.target.value),
@@ -634,12 +672,12 @@ function ChatInput({ sendChatMessage, isSendingChat }) {
634
672
  className: cn("skippr:flex-1 skippr:rounded-lg skippr:border skippr:border-border skippr:bg-background", "skippr:px-3 skippr:py-2 skippr:text-sm skippr:text-foreground", "skippr:placeholder:text-muted-foreground skippr:outline-none", "skippr:focus:ring-1 skippr:focus:ring-ring"),
635
673
  disabled: isSendingChat
636
674
  }),
637
- /* @__PURE__ */ jsx4("button", {
675
+ /* @__PURE__ */ jsx5("button", {
638
676
  type: "submit",
639
677
  disabled: !canSend,
640
678
  "aria-label": "Send message",
641
679
  className: cn("skippr:flex skippr:size-9 skippr:shrink-0 skippr:items-center skippr:justify-center", "skippr:rounded-lg skippr:bg-primary skippr:text-primary-foreground", "skippr:transition-opacity", !canSend && "skippr:opacity-50 skippr:cursor-not-allowed"),
642
- children: /* @__PURE__ */ jsx4(SendHorizontal, {
680
+ children: /* @__PURE__ */ jsx5(SendHorizontal, {
643
681
  className: "skippr:size-4"
644
682
  })
645
683
  })
@@ -648,12 +686,12 @@ function ChatInput({ sendChatMessage, isSendingChat }) {
648
686
  }
649
687
 
650
688
  // src/components/ChatMessage.tsx
651
- import { jsx as jsx5 } from "react/jsx-runtime";
689
+ import { jsx as jsx6 } from "react/jsx-runtime";
652
690
  function ChatMessage({ message }) {
653
691
  const isUser = message.role === "user";
654
- return /* @__PURE__ */ jsx5("div", {
692
+ return /* @__PURE__ */ jsx6("div", {
655
693
  className: cn("skippr:flex skippr:w-full skippr:px-4 skippr:py-1", isUser ? "skippr:justify-end" : "skippr:justify-start"),
656
- children: /* @__PURE__ */ jsx5("div", {
694
+ children: /* @__PURE__ */ jsx6("div", {
657
695
  className: cn("skippr:max-w-[85%] skippr:whitespace-pre-wrap skippr:rounded-2xl skippr:px-4 skippr:py-2.5 skippr:text-sm skippr:leading-relaxed", isUser ? "skippr:rounded-br-sm skippr:bg-primary skippr:text-primary-foreground" : "skippr:rounded-bl-sm skippr:bg-muted skippr:text-foreground"),
658
696
  children: message.content
659
697
  })
@@ -661,20 +699,20 @@ function ChatMessage({ message }) {
661
699
  }
662
700
 
663
701
  // src/components/TypingIndicator.tsx
664
- import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
702
+ import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
665
703
  function TypingIndicator() {
666
- return /* @__PURE__ */ jsx6("div", {
704
+ return /* @__PURE__ */ jsx7("div", {
667
705
  className: "skippr:flex skippr:items-center skippr:gap-1 skippr:px-4 skippr:py-3",
668
706
  children: /* @__PURE__ */ jsxs4("div", {
669
707
  className: "skippr:flex skippr:items-center skippr:gap-1 skippr:rounded-2xl skippr:rounded-bl-sm skippr:bg-muted skippr:px-4 skippr:py-2.5",
670
708
  children: [
671
- /* @__PURE__ */ jsx6("span", {
709
+ /* @__PURE__ */ jsx7("span", {
672
710
  className: "skippr:size-1.5 skippr:animate-bounce skippr:rounded-full skippr:bg-muted-foreground/60 skippr:[animation-delay:0ms]"
673
711
  }),
674
- /* @__PURE__ */ jsx6("span", {
712
+ /* @__PURE__ */ jsx7("span", {
675
713
  className: "skippr:size-1.5 skippr:animate-bounce skippr:rounded-full skippr:bg-muted-foreground/60 skippr:[animation-delay:150ms]"
676
714
  }),
677
- /* @__PURE__ */ jsx6("span", {
715
+ /* @__PURE__ */ jsx7("span", {
678
716
  className: "skippr:size-1.5 skippr:animate-bounce skippr:rounded-full skippr:bg-muted-foreground/60 skippr:[animation-delay:300ms]"
679
717
  })
680
718
  ]
@@ -683,14 +721,14 @@ function TypingIndicator() {
683
721
  }
684
722
 
685
723
  // src/components/MessageList.tsx
686
- import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
724
+ import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
687
725
  function MessageList({
688
726
  messages,
689
727
  isStreaming,
690
728
  sendChatMessage,
691
729
  isSendingChat
692
730
  }) {
693
- const scrollRef = useRef(null);
731
+ const scrollRef = useRef2(null);
694
732
  const lastMessage = messages.length > 0 ? messages[messages.length - 1] : undefined;
695
733
  useEffect3(() => {
696
734
  scrollRef.current?.scrollIntoView({ behavior: "smooth" });
@@ -699,22 +737,22 @@ function MessageList({
699
737
  return /* @__PURE__ */ jsxs5("div", {
700
738
  className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col",
701
739
  children: [
702
- /* @__PURE__ */ jsx7("div", {
740
+ /* @__PURE__ */ jsx8("div", {
703
741
  className: "skippr:min-h-0 skippr:flex-1 skippr:overflow-y-auto",
704
742
  children: /* @__PURE__ */ jsxs5("div", {
705
743
  className: "skippr:flex skippr:flex-col skippr:gap-1 skippr:py-3",
706
744
  children: [
707
- messages.map((message) => /* @__PURE__ */ jsx7(ChatMessage, {
745
+ messages.map((message) => /* @__PURE__ */ jsx8(ChatMessage, {
708
746
  message
709
747
  }, message.id)),
710
- showTyping && /* @__PURE__ */ jsx7(TypingIndicator, {}),
711
- /* @__PURE__ */ jsx7("div", {
748
+ showTyping && /* @__PURE__ */ jsx8(TypingIndicator, {}),
749
+ /* @__PURE__ */ jsx8("div", {
712
750
  ref: scrollRef
713
751
  })
714
752
  ]
715
753
  })
716
754
  }),
717
- /* @__PURE__ */ jsx7(ChatInput, {
755
+ /* @__PURE__ */ jsx8(ChatInput, {
718
756
  sendChatMessage,
719
757
  isSendingChat
720
758
  })
@@ -723,12 +761,12 @@ function MessageList({
723
761
  }
724
762
 
725
763
  // src/components/QuickActions.tsx
726
- import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
764
+ import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
727
765
  function QuickActions({ onStartSession, isStarting, error }) {
728
766
  return /* @__PURE__ */ jsxs6("div", {
729
767
  className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:items-center skippr:gap-6 skippr:overflow-y-auto skippr:px-4 skippr:py-4",
730
768
  children: [
731
- /* @__PURE__ */ jsx8("p", {
769
+ /* @__PURE__ */ jsx9("p", {
732
770
  className: "skippr:mb-1 skippr:text-sm skippr:text-muted-foreground",
733
771
  children: "How can I help you today?"
734
772
  }),
@@ -738,15 +776,15 @@ function QuickActions({ onStartSession, isStarting, error }) {
738
776
  onClick: onStartSession,
739
777
  disabled: isStarting,
740
778
  children: [
741
- isStarting ? /* @__PURE__ */ jsx8(LoaderCircle, {
779
+ isStarting ? /* @__PURE__ */ jsx9(LoaderCircle, {
742
780
  className: "skippr:size-4 skippr:animate-spin skippr:text-primary"
743
- }) : /* @__PURE__ */ jsx8(MessageCircleQuestionMark, {
781
+ }) : /* @__PURE__ */ jsx9(MessageCircleQuestionMark, {
744
782
  className: "skippr:size-4 skippr:text-primary"
745
783
  }),
746
784
  isStarting ? "Starting..." : "Start Session"
747
785
  ]
748
786
  }),
749
- error && /* @__PURE__ */ jsx8("p", {
787
+ error && /* @__PURE__ */ jsx9("p", {
750
788
  className: "skippr:text-xs skippr:text-destructive",
751
789
  children: error
752
790
  })
@@ -755,17 +793,17 @@ function QuickActions({ onStartSession, isStarting, error }) {
755
793
  }
756
794
 
757
795
  // src/components/SessionAgenda.tsx
758
- import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
796
+ import { jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
759
797
  function SessionAgenda({ phases, questions = [] }) {
760
798
  if (phases.length === 0) {
761
799
  return /* @__PURE__ */ jsxs7("div", {
762
800
  className: "skippr:flex skippr:flex-col skippr:gap-3 skippr:p-4",
763
801
  children: [
764
- /* @__PURE__ */ jsx9("h3", {
802
+ /* @__PURE__ */ jsx10("h3", {
765
803
  className: "skippr:text-sm skippr:font-semibold",
766
804
  children: "Agenda"
767
805
  }),
768
- /* @__PURE__ */ jsx9("p", {
806
+ /* @__PURE__ */ jsx10("p", {
769
807
  className: "skippr:text-xs skippr:text-muted-foreground",
770
808
  children: "Waiting for session..."
771
809
  })
@@ -775,11 +813,11 @@ function SessionAgenda({ phases, questions = [] }) {
775
813
  return /* @__PURE__ */ jsxs7("div", {
776
814
  className: "skippr:flex skippr:flex-col skippr:gap-3 skippr:p-4",
777
815
  children: [
778
- /* @__PURE__ */ jsx9("h3", {
816
+ /* @__PURE__ */ jsx10("h3", {
779
817
  className: "skippr:text-sm skippr:font-semibold",
780
818
  children: "Agenda"
781
819
  }),
782
- /* @__PURE__ */ jsx9("ul", {
820
+ /* @__PURE__ */ jsx10("ul", {
783
821
  className: "skippr:flex skippr:flex-col skippr:gap-2",
784
822
  children: phases.map((phase) => {
785
823
  const phaseQuestions = questions.filter((q) => q.phaseName === phase.name);
@@ -791,10 +829,10 @@ function SessionAgenda({ phases, questions = [] }) {
791
829
  /* @__PURE__ */ jsxs7("div", {
792
830
  className: "skippr:flex skippr:items-center skippr:gap-2 skippr:text-sm",
793
831
  children: [
794
- /* @__PURE__ */ jsx9(PhaseIcon, {
832
+ /* @__PURE__ */ jsx10(PhaseIcon, {
795
833
  status: phase.status
796
834
  }),
797
- /* @__PURE__ */ jsx9("span", {
835
+ /* @__PURE__ */ jsx10("span", {
798
836
  className: cn(phase.status === "completed" && "skippr:text-muted-foreground skippr:line-through", phase.status === "active" && "skippr:font-medium skippr:text-primary"),
799
837
  children: phase.name
800
838
  })
@@ -818,26 +856,26 @@ function SessionAgenda({ phases, questions = [] }) {
818
856
  }
819
857
  function PhaseIcon({ status }) {
820
858
  if (status === "completed") {
821
- return /* @__PURE__ */ jsx9("div", {
859
+ return /* @__PURE__ */ jsx10("div", {
822
860
  className: "skippr:flex skippr:size-4 skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-primary",
823
- children: /* @__PURE__ */ jsx9(Check, {
861
+ children: /* @__PURE__ */ jsx10(Check, {
824
862
  className: "skippr:size-2.5 skippr:text-primary-foreground",
825
863
  strokeWidth: 3
826
864
  })
827
865
  });
828
866
  }
829
867
  if (status === "active") {
830
- return /* @__PURE__ */ jsx9(LoaderCircle, {
868
+ return /* @__PURE__ */ jsx10(LoaderCircle, {
831
869
  className: "skippr:size-4 skippr:shrink-0 skippr:text-primary skippr:animate-spin"
832
870
  });
833
871
  }
834
- return /* @__PURE__ */ jsx9(Circle, {
872
+ return /* @__PURE__ */ jsx10(Circle, {
835
873
  className: "skippr:size-4 skippr:shrink-0 skippr:text-muted-foreground"
836
874
  });
837
875
  }
838
876
 
839
877
  // src/components/Sidebar.tsx
840
- import { jsx as jsx10, jsxs as jsxs8, Fragment } from "react/jsx-runtime";
878
+ import { jsx as jsx11, jsxs as jsxs8, Fragment } from "react/jsx-runtime";
841
879
  function Sidebar() {
842
880
  const { isConnected, isStarting, error, startSession, disconnect, isPanelOpen, closePanel } = useLiveAgent();
843
881
  useEffect4(() => {
@@ -850,24 +888,24 @@ function Sidebar() {
850
888
  document.body.style.transition = "";
851
889
  };
852
890
  }, []);
853
- return /* @__PURE__ */ jsx10("div", {
891
+ return /* @__PURE__ */ jsx11("div", {
854
892
  className: cn("skippr:fixed skippr:top-0 skippr:right-0 skippr:h-full skippr:z-[9999]", "skippr:bg-background skippr:border-l skippr:border-border", "skippr:flex skippr:flex-col", "skippr:transition-all skippr:duration-300 skippr:ease-in-out skippr:overflow-hidden", !isPanelOpen && "skippr:w-0 skippr:border-l-0"),
855
893
  style: { width: isPanelOpen ? SIDEBAR_WIDTH : undefined },
856
894
  children: isConnected ? /* @__PURE__ */ jsxs8(Fragment, {
857
895
  children: [
858
- /* @__PURE__ */ jsx10(ChatHeader, {
896
+ /* @__PURE__ */ jsx11(ChatHeader, {
859
897
  onClose: closePanel
860
898
  }),
861
- /* @__PURE__ */ jsx10(ConnectedContent, {
899
+ /* @__PURE__ */ jsx11(ConnectedContent, {
862
900
  onDisconnect: disconnect
863
901
  })
864
902
  ]
865
903
  }) : /* @__PURE__ */ jsxs8(Fragment, {
866
904
  children: [
867
- /* @__PURE__ */ jsx10(ChatHeader, {
905
+ /* @__PURE__ */ jsx11(ChatHeader, {
868
906
  onClose: closePanel
869
907
  }),
870
- /* @__PURE__ */ jsx10(QuickActions, {
908
+ /* @__PURE__ */ jsx11(QuickActions, {
871
909
  onStartSession: startSession,
872
910
  isStarting,
873
911
  error
@@ -883,9 +921,9 @@ function ConnectedContent({ onDisconnect }) {
883
921
  const { phases } = usePhaseUpdates();
884
922
  const { questions } = useQuestionUpdates();
885
923
  if (!isConnected) {
886
- return /* @__PURE__ */ jsx10("div", {
924
+ return /* @__PURE__ */ jsx11("div", {
887
925
  className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
888
- children: /* @__PURE__ */ jsx10("p", {
926
+ children: /* @__PURE__ */ jsx11("p", {
889
927
  className: "skippr:text-sm skippr:text-muted-foreground",
890
928
  children: "Connecting..."
891
929
  })
@@ -894,22 +932,22 @@ function ConnectedContent({ onDisconnect }) {
894
932
  const isAgentSpeaking = agentState === "speaking";
895
933
  return /* @__PURE__ */ jsxs8(Fragment, {
896
934
  children: [
897
- /* @__PURE__ */ jsx10(MeetingControls, {
935
+ /* @__PURE__ */ jsx11(MeetingControls, {
898
936
  onHangUp: onDisconnect
899
937
  }),
900
938
  /* @__PURE__ */ jsxs8("div", {
901
939
  className: "skippr:flex skippr:min-h-0 skippr:flex-1",
902
940
  children: [
903
- /* @__PURE__ */ jsx10("div", {
941
+ /* @__PURE__ */ jsx11("div", {
904
942
  className: "skippr:w-[260px] skippr:shrink-0 skippr:overflow-y-auto skippr:border-r",
905
- children: /* @__PURE__ */ jsx10(SessionAgenda, {
943
+ children: /* @__PURE__ */ jsx11(SessionAgenda, {
906
944
  phases,
907
945
  questions
908
946
  })
909
947
  }),
910
- /* @__PURE__ */ jsx10("div", {
948
+ /* @__PURE__ */ jsx11("div", {
911
949
  className: "skippr:flex skippr:min-w-0 skippr:flex-1 skippr:flex-col",
912
- children: /* @__PURE__ */ jsx10(MessageList, {
950
+ children: /* @__PURE__ */ jsx11(MessageList, {
913
951
  messages: allMessages,
914
952
  isStreaming: isAgentSpeaking,
915
953
  sendChatMessage,
@@ -923,27 +961,27 @@ function ConnectedContent({ onDisconnect }) {
923
961
  }
924
962
 
925
963
  // src/components/SidebarTrigger.tsx
926
- import { jsx as jsx11 } from "react/jsx-runtime";
964
+ import { jsx as jsx12 } from "react/jsx-runtime";
927
965
  var TRIGGER_GAP = 16;
928
966
  var TRIGGER_DEFAULT_RIGHT = 24;
929
967
  function SidebarTrigger() {
930
968
  const { isPanelOpen, togglePanel } = useLiveAgent();
931
- return /* @__PURE__ */ jsx11(Button, {
969
+ return /* @__PURE__ */ jsx12(Button, {
932
970
  size: "icon-lg",
933
971
  onClick: togglePanel,
934
972
  className: "skippr:fixed skippr:bottom-6 skippr:z-[9998] skippr:size-14 skippr:rounded-full skippr:shadow-lg skippr:transition-all skippr:duration-300",
935
973
  style: { right: isPanelOpen ? SIDEBAR_WIDTH + TRIGGER_GAP : TRIGGER_DEFAULT_RIGHT },
936
974
  title: isPanelOpen ? "Close chat" : "Chat with us",
937
- children: isPanelOpen ? /* @__PURE__ */ jsx11(X, {
975
+ children: isPanelOpen ? /* @__PURE__ */ jsx12(X, {
938
976
  className: "skippr:size-6"
939
- }) : /* @__PURE__ */ jsx11(MessageCircle, {
977
+ }) : /* @__PURE__ */ jsx12(MessageCircle, {
940
978
  className: "skippr:size-6"
941
979
  })
942
980
  });
943
981
  }
944
982
 
945
983
  // src/components/LiveAgent.tsx
946
- import { jsx as jsx12, jsxs as jsxs9, Fragment as Fragment2 } from "react/jsx-runtime";
984
+ import { jsx as jsx13, jsxs as jsxs9, Fragment as Fragment2 } from "react/jsx-runtime";
947
985
  function LiveAgent({
948
986
  agentId,
949
987
  authToken,
@@ -988,15 +1026,15 @@ function LiveAgent({
988
1026
  ]);
989
1027
  const widgetContent = /* @__PURE__ */ jsxs9(Fragment2, {
990
1028
  children: [
991
- connection && /* @__PURE__ */ jsx12(RoomAudioRenderer, {}),
992
- /* @__PURE__ */ jsx12(SidebarTrigger, {}),
993
- /* @__PURE__ */ jsx12(Sidebar, {}),
1029
+ connection && /* @__PURE__ */ jsx13(RoomAudioRenderer, {}),
1030
+ /* @__PURE__ */ jsx13(SidebarTrigger, {}),
1031
+ /* @__PURE__ */ jsx13(Sidebar, {}),
994
1032
  children
995
1033
  ]
996
1034
  });
997
- return /* @__PURE__ */ jsx12(LiveAgentContext.Provider, {
1035
+ return /* @__PURE__ */ jsx13(LiveAgentContext.Provider, {
998
1036
  value: ctx,
999
- children: connection ? /* @__PURE__ */ jsx12(LiveKitRoom, {
1037
+ children: connection ? /* @__PURE__ */ jsx13(LiveKitRoom, {
1000
1038
  serverUrl: connection.livekitUrl,
1001
1039
  token: connection.token,
1002
1040
  connect: shouldConnect,
@@ -1,2 +1,2 @@
1
1
  /*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
2
- @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-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-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-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-relaxed:1.625;--skippr-radius-2xl:1rem;--skippr-ease-in-out:cubic-bezier(.4,0,.2,1);--skippr-animate-spin:spin 1s linear infinite;--skippr-animate-bounce:bounce 1s infinite;--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\:fixed{position:fixed}.skippr\:top-0{top:calc(var(--skippr-spacing)*0)}.skippr\:right-0{right:calc(var(--skippr-spacing)*0)}.skippr\:bottom-6{bottom:calc(var(--skippr-spacing)*6)}.skippr\:z-\[9998\]{z-index:9998}.skippr\:z-\[9999\]{z-index:9999}.skippr\:mb-1{margin-bottom:calc(var(--skippr-spacing)*1)}.skippr\:ml-6{margin-left:calc(var(--skippr-spacing)*6)}.skippr\:flex{display:flex}.skippr\:inline-flex{display:inline-flex}.skippr\:size-1\.5{width:calc(var(--skippr-spacing)*1.5);height:calc(var(--skippr-spacing)*1.5)}.skippr\:size-2\.5{width:calc(var(--skippr-spacing)*2.5);height:calc(var(--skippr-spacing)*2.5)}.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-6{width:calc(var(--skippr-spacing)*6);height:calc(var(--skippr-spacing)*6)}.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-14{width:calc(var(--skippr-spacing)*14);height:calc(var(--skippr-spacing)*14)}.skippr\:h-6{height:calc(var(--skippr-spacing)*6)}.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-auto{height:auto}.skippr\:h-full{height:100%}.skippr\:min-h-0{min-height:calc(var(--skippr-spacing)*0)}.skippr\:w-0{width:calc(var(--skippr-spacing)*0)}.skippr\:w-\[260px\]{width:260px}.skippr\:w-full{width:100%}.skippr\:max-w-\[85\%\]{max-width:85%}.skippr\:min-w-0{min-width:calc(var(--skippr-spacing)*0)}.skippr\:flex-1{flex:1}.skippr\:shrink-0{flex-shrink:0}.skippr\:animate-bounce{animation:var(--skippr-animate-bounce)}.skippr\:animate-spin{animation:var(--skippr-animate-spin)}.skippr\:cursor-not-allowed{cursor:not-allowed}.skippr\:flex-col{flex-direction:column}.skippr\:items-center{align-items:center}.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-3{gap:calc(var(--skippr-spacing)*3)}.skippr\:gap-6{gap:calc(var(--skippr-spacing)*6)}.skippr\:overflow-hidden{overflow:hidden}.skippr\:overflow-y-auto{overflow-y:auto}.skippr\:rounded-2xl{border-radius:var(--skippr-radius-2xl)}.skippr\:rounded-full{border-radius:3.40282e38px}.skippr\:rounded-lg{border-radius:var(--radius)}.skippr\:rounded-md{border-radius:calc(var(--radius) - 2px)}.skippr\:rounded-br-sm{border-bottom-right-radius:calc(var(--radius) - 4px)}.skippr\:rounded-bl-sm{border-bottom-left-radius:calc(var(--radius) - 4px)}.skippr\:border{border-style:var(--tw-border-style);border-width:1px}.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-l-0{border-left-style:var(--tw-border-style);border-left-width:0}.skippr\:border-border,.skippr\:border-input{border-color:oklch(88.22% 0 0)}.skippr\:bg-background{background-color:oklch(98.21% 0 0)}.skippr\:bg-destructive{background-color:oklch(62.71% .1936 33.339)}.skippr\:bg-muted{background-color:oklch(95.21% 0 0)}.skippr\:bg-muted-foreground\/60{background-color:oklab(50.32% 0 0/.6)}.skippr\:bg-primary{background-color:oklch(43.41% .0392 41.9938)}.skippr\:bg-primary-foreground\/20{background-color:oklab(100% 0 0/.2)}.skippr\:bg-secondary{background-color:oklch(92% .0651 74.3695)}.skippr\:p-4{padding:calc(var(--skippr-spacing)*4)}.skippr\:px-2{padding-inline:calc(var(--skippr-spacing)*2)}.skippr\:px-3{padding-inline:calc(var(--skippr-spacing)*3)}.skippr\:px-4{padding-inline:calc(var(--skippr-spacing)*4)}.skippr\:px-6{padding-inline:calc(var(--skippr-spacing)*6)}.skippr\:py-1{padding-block:calc(var(--skippr-spacing)*1)}.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\: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\:leading-none{--tw-leading:1;line-height:1}.skippr\:leading-relaxed{--tw-leading:var(--skippr-leading-relaxed);line-height:var(--skippr-leading-relaxed)}.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-normal{white-space:normal}.skippr\:whitespace-nowrap{white-space:nowrap}.skippr\:whitespace-pre-wrap{white-space:pre-wrap}.skippr\:text-destructive{color:oklch(62.71% .1936 33.339)}.skippr\:text-foreground{color:oklch(24.35% 0 0)}.skippr\:text-muted-foreground{color:oklch(50.32% 0 0)}.skippr\:text-primary{color:oklch(43.41% .0392 41.9938)}.skippr\:text-primary-foreground{color:oklch(100% 0 0)}.skippr\:text-secondary-foreground{color:oklch(34.99% .0685 40.8288)}.skippr\:text-white{color:var(--skippr-color-white)}.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\:opacity-50{opacity:.5}.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-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-offset-background{--tw-ring-offset-color:oklch(98.21% 0 0)}.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-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\:duration-300{--tw-duration:.3s;transition-duration:.3s}.skippr\:ease-in-out{--tw-ease:var(--skippr-ease-in-out);transition-timing-function:var(--skippr-ease-in-out)}.skippr\:outline-none{--tw-outline-style:none;outline-style:none}.skippr\:\[animation-delay\:0ms\]{animation-delay:0s}.skippr\:\[animation-delay\:150ms\]{animation-delay:.15s}.skippr\:\[animation-delay\:300ms\]{animation-delay:.3s}.skippr\:placeholder\:text-muted-foreground::placeholder{color:oklch(50.32% 0 0)}@media (hover:hover){.skippr\:hover\:bg-accent:hover{background-color:oklch(93.1% 0 0)}.skippr\:hover\:bg-destructive\/90:hover{background-color:oklab(62.71% .16174 .106401/.9)}.skippr\:hover\:bg-primary-foreground\/20:hover{background-color:oklab(100% 0 0/.2)}.skippr\:hover\:bg-primary\/90:hover{background-color:oklab(43.41% .0291341 .0262268/.9)}.skippr\:hover\:bg-secondary\/80:hover{background-color:oklab(92% .0175401 .0626926/.8)}.skippr\:hover\:text-accent-foreground:hover{color:oklch(24.35% 0 0)}.skippr\:hover\:text-primary-foreground:hover{color:oklch(100% 0 0)}}.skippr\:focus\:ring-1:focus{--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\:focus\:ring-ring:focus{--tw-ring-color:oklch(43.41% .0392 41.9938)}.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-ring:focus-visible{--tw-ring-color:oklch(43.41% .0392 41.9938)}.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\:disabled\:pointer-events-none:disabled{pointer-events:none}.skippr\:disabled\:opacity-50:disabled{opacity:.5}.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)}}@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-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@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}}
2
+ @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-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-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-600:oklch(57.7% .245 27.325);--skippr-color-red-700:oklch(50.5% .213 27.518);--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-relaxed:1.625;--skippr-radius-2xl:1rem;--skippr-ease-in-out:cubic-bezier(.4,0,.2,1);--skippr-animate-spin:spin 1s linear infinite;--skippr-animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--skippr-animate-bounce:bounce 1s infinite;--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\:fixed{position:fixed}.skippr\:top-0{top:calc(var(--skippr-spacing)*0)}.skippr\:right-0{right:calc(var(--skippr-spacing)*0)}.skippr\:bottom-6{bottom:calc(var(--skippr-spacing)*6)}.skippr\:z-\[9998\]{z-index:9998}.skippr\:z-\[9999\]{z-index:9999}.skippr\:mb-1{margin-bottom:calc(var(--skippr-spacing)*1)}.skippr\:ml-6{margin-left:calc(var(--skippr-spacing)*6)}.skippr\:flex{display:flex}.skippr\:inline-flex{display:inline-flex}.skippr\:size-1\.5{width:calc(var(--skippr-spacing)*1.5);height:calc(var(--skippr-spacing)*1.5)}.skippr\:size-2\.5{width:calc(var(--skippr-spacing)*2.5);height:calc(var(--skippr-spacing)*2.5)}.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-6{width:calc(var(--skippr-spacing)*6);height:calc(var(--skippr-spacing)*6)}.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-14{width:calc(var(--skippr-spacing)*14);height:calc(var(--skippr-spacing)*14)}.skippr\:h-6{height:calc(var(--skippr-spacing)*6)}.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-auto{height:auto}.skippr\:h-full{height:100%}.skippr\:min-h-0{min-height:calc(var(--skippr-spacing)*0)}.skippr\:w-0{width:calc(var(--skippr-spacing)*0)}.skippr\:w-\[260px\]{width:260px}.skippr\:w-full{width:100%}.skippr\:max-w-\[85\%\]{max-width:85%}.skippr\:min-w-0{min-width:calc(var(--skippr-spacing)*0)}.skippr\:flex-1{flex:1}.skippr\:shrink-0{flex-shrink:0}.skippr\:animate-bounce{animation:var(--skippr-animate-bounce)}.skippr\:animate-pulse{animation:var(--skippr-animate-pulse)}.skippr\:animate-spin{animation:var(--skippr-animate-spin)}.skippr\:cursor-not-allowed{cursor:not-allowed}.skippr\:flex-col{flex-direction:column}.skippr\:items-center{align-items:center}.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-3{gap:calc(var(--skippr-spacing)*3)}.skippr\:gap-6{gap:calc(var(--skippr-spacing)*6)}.skippr\:overflow-hidden{overflow:hidden}.skippr\:overflow-y-auto{overflow-y:auto}.skippr\:rounded-2xl{border-radius:var(--skippr-radius-2xl)}.skippr\:rounded-full{border-radius:3.40282e38px}.skippr\:rounded-lg{border-radius:var(--radius)}.skippr\:rounded-md{border-radius:calc(var(--radius) - 2px)}.skippr\:rounded-br-sm{border-bottom-right-radius:calc(var(--radius) - 4px)}.skippr\:rounded-bl-sm{border-bottom-left-radius:calc(var(--radius) - 4px)}.skippr\:border{border-style:var(--tw-border-style);border-width:1px}.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-l-0{border-left-style:var(--tw-border-style);border-left-width:0}.skippr\:border-border,.skippr\:border-input{border-color:oklch(88.22% 0 0)}.skippr\:bg-background{background-color:oklch(98.21% 0 0)}.skippr\:bg-destructive{background-color:oklch(62.71% .1936 33.339)}.skippr\:bg-muted{background-color:oklch(95.21% 0 0)}.skippr\:bg-muted-foreground\/60{background-color:oklab(50.32% 0 0/.6)}.skippr\:bg-primary{background-color:oklch(43.41% .0392 41.9938)}.skippr\:bg-primary-foreground\/20{background-color:oklab(100% 0 0/.2)}.skippr\:bg-red-50{background-color:var(--skippr-color-red-50)}.skippr\:bg-secondary{background-color:oklch(92% .0651 74.3695)}.skippr\:p-4{padding:calc(var(--skippr-spacing)*4)}.skippr\:px-2{padding-inline:calc(var(--skippr-spacing)*2)}.skippr\:px-3{padding-inline:calc(var(--skippr-spacing)*3)}.skippr\:px-4{padding-inline:calc(var(--skippr-spacing)*4)}.skippr\:px-6{padding-inline:calc(var(--skippr-spacing)*6)}.skippr\: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\:text-center{text-align:center}.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\:leading-none{--tw-leading:1;line-height:1}.skippr\:leading-relaxed{--tw-leading:var(--skippr-leading-relaxed);line-height:var(--skippr-leading-relaxed)}.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-normal{white-space:normal}.skippr\:whitespace-nowrap{white-space:nowrap}.skippr\:whitespace-pre-wrap{white-space:pre-wrap}.skippr\:text-destructive{color:oklch(62.71% .1936 33.339)}.skippr\:text-foreground{color:oklch(24.35% 0 0)}.skippr\:text-muted-foreground{color:oklch(50.32% 0 0)}.skippr\:text-primary{color:oklch(43.41% .0392 41.9938)}.skippr\:text-primary-foreground{color:oklch(100% 0 0)}.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:oklch(34.99% .0685 40.8288)}.skippr\:text-white{color:var(--skippr-color-white)}.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\:opacity-50{opacity:.5}.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-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-offset-background{--tw-ring-offset-color:oklch(98.21% 0 0)}.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-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\:duration-300{--tw-duration:.3s;transition-duration:.3s}.skippr\:ease-in-out{--tw-ease:var(--skippr-ease-in-out);transition-timing-function:var(--skippr-ease-in-out)}.skippr\:outline-none{--tw-outline-style:none;outline-style:none}.skippr\:\[animation-delay\:0ms\]{animation-delay:0s}.skippr\:\[animation-delay\:150ms\]{animation-delay:.15s}.skippr\:\[animation-delay\:300ms\]{animation-delay:.3s}.skippr\:placeholder\:text-muted-foreground::placeholder{color:oklch(50.32% 0 0)}@media (hover:hover){.skippr\:hover\:bg-accent:hover{background-color:oklch(93.1% 0 0)}.skippr\:hover\:bg-destructive\/90:hover{background-color:oklab(62.71% .16174 .106401/.9)}.skippr\:hover\:bg-primary-foreground\/20:hover{background-color:oklab(100% 0 0/.2)}.skippr\:hover\:bg-primary\/90:hover{background-color:oklab(43.41% .0291341 .0262268/.9)}.skippr\:hover\:bg-secondary\/80:hover{background-color:oklab(92% .0175401 .0626926/.8)}.skippr\:hover\:text-accent-foreground:hover{color:oklch(24.35% 0 0)}.skippr\:hover\:text-primary-foreground:hover{color:oklch(100% 0 0)}}.skippr\:focus\:ring-1:focus{--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\:focus\:ring-ring:focus{--tw-ring-color:oklch(43.41% .0392 41.9938)}.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-ring:focus-visible{--tw-ring-color:oklch(43.41% .0392 41.9938)}.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\:disabled\:pointer-events-none:disabled{pointer-events:none}.skippr\:disabled\:opacity-50:disabled{opacity:.5}.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)}}@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-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@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}}