@skippr/live-agent-sdk 0.114.0 → 0.116.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/lib-exports.js +1712 -592
- package/dist/skippr-sdk.css +1 -1
- package/dist/skippr-sdk.js +121 -121
- package/dist/types/components/HighlightOverlay.d.ts +1 -2
- package/dist/types/context/LiveAgentContext.d.ts +2 -0
- package/dist/types/hooks/useChromeCopy.d.ts +2 -0
- package/dist/types/hooks/usePhaseLabels.d.ts +14 -0
- package/dist/types/hooks/usePhaseUpdates.d.ts +6 -0
- package/dist/types/hooks/useSession.d.ts +2 -0
- package/dist/types/hooks/useSessionHistory.d.ts +2 -1
- package/dist/types/lib/chromeCopy.d.ts +137 -0
- package/dist/types/lib/localeCopy.d.ts +5 -0
- package/package.json +1 -1
package/dist/esm/lib-exports.js
CHANGED
|
@@ -8,7 +8,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
8
8
|
|
|
9
9
|
// src/components/LiveAgent.tsx
|
|
10
10
|
import { LiveKitRoom, RoomAudioRenderer } from "@livekit/components-react";
|
|
11
|
-
import { Fragment as Fragment8, useCallback as useCallback36, useEffect as
|
|
11
|
+
import { Fragment as Fragment8, useCallback as useCallback36, useEffect as useEffect51, useMemo as useMemo12, useRef as useRef46, useState as useState42 } from "react";
|
|
12
12
|
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/createLucideIcon.js
|
|
13
13
|
import { forwardRef as forwardRef2, createElement as createElement3 } from "react";
|
|
14
14
|
|
|
@@ -362,7 +362,7 @@ var __iconNode32 = [
|
|
|
362
362
|
];
|
|
363
363
|
var X = createLucideIcon("x", __iconNode32);
|
|
364
364
|
// src/buddy/BuddyVoiceBar.tsx
|
|
365
|
-
import { useCallback as useCallback8, useContext as
|
|
365
|
+
import { useCallback as useCallback8, useContext as useContext4, useEffect as useEffect10, useRef as useRef10, useState as useState8 } from "react";
|
|
366
366
|
|
|
367
367
|
// src/capture/widgetAnchor.ts
|
|
368
368
|
var anchor = null;
|
|
@@ -612,7 +612,6 @@ function toConsentParts(template) {
|
|
|
612
612
|
}
|
|
613
613
|
function ConsentNotice({ className, template }) {
|
|
614
614
|
return /* @__PURE__ */ jsx("p", {
|
|
615
|
-
lang: "en",
|
|
616
615
|
className: cn("skippr:text-[11px] skippr:leading-[1.2] skippr:text-muted-foreground skippr:text-center", className),
|
|
617
616
|
children: toConsentParts(template).map((part) => typeof part === "string" ? part : /* @__PURE__ */ jsx("a", {
|
|
618
617
|
href: part.href,
|
|
@@ -645,12 +644,1008 @@ function ConsentBubble({
|
|
|
645
644
|
}
|
|
646
645
|
|
|
647
646
|
// src/components/VoiceBarLoginCard.tsx
|
|
648
|
-
import { useContext as
|
|
647
|
+
import { useContext as useContext3 } from "react";
|
|
649
648
|
|
|
650
649
|
// src/context/LiveAgentContext.tsx
|
|
651
650
|
import { createContext as createContext2 } from "react";
|
|
652
651
|
var LiveAgentContext = createContext2(null);
|
|
653
652
|
|
|
653
|
+
// src/hooks/useChromeCopy.ts
|
|
654
|
+
import { useContext as useContext2 } from "react";
|
|
655
|
+
|
|
656
|
+
// src/lib/localeCopy.ts
|
|
657
|
+
var TRANSLATED_LOCALES = new Set(["fr", "de", "it", "es", "pt-PT", "pt-BR"]);
|
|
658
|
+
function matchTranslatedLocale(tag) {
|
|
659
|
+
if (!tag)
|
|
660
|
+
return;
|
|
661
|
+
const [language, region] = tag.trim().split("-");
|
|
662
|
+
if (!language)
|
|
663
|
+
return;
|
|
664
|
+
const bare = language.toLowerCase();
|
|
665
|
+
const exact = region ? `${bare}-${region.toUpperCase()}` : bare;
|
|
666
|
+
if (TRANSLATED_LOCALES.has(exact))
|
|
667
|
+
return exact;
|
|
668
|
+
if (TRANSLATED_LOCALES.has(bare))
|
|
669
|
+
return bare;
|
|
670
|
+
return bare === "pt" ? "pt-PT" : undefined;
|
|
671
|
+
}
|
|
672
|
+
function createLocaleCopyResolver(defaults, translations) {
|
|
673
|
+
return (tag) => {
|
|
674
|
+
const locale = matchTranslatedLocale(tag);
|
|
675
|
+
return locale ? translations[locale] : defaults;
|
|
676
|
+
};
|
|
677
|
+
}
|
|
678
|
+
function fillPlaceholders(template, values) {
|
|
679
|
+
return Object.entries(values).reduce((filled, [name, value]) => filled.replaceAll(`{${name}}`, String(value)), template);
|
|
680
|
+
}
|
|
681
|
+
function splitOnPlaceholder(template, name) {
|
|
682
|
+
const [before, after] = template.split(`{${name}}`);
|
|
683
|
+
return [before ?? "", after ?? ""];
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
// src/lib/chromeCopy.ts
|
|
687
|
+
var CHROME_COPY_DEFAULTS = {
|
|
688
|
+
agendaTitle: "Agenda",
|
|
689
|
+
agendaLoading: "Waiting for agenda to load...",
|
|
690
|
+
agendaProgress: "step {step} of {total}",
|
|
691
|
+
agendaProgressLabel: "Agenda progress",
|
|
692
|
+
agendaNowBadge: "now",
|
|
693
|
+
micHoldToTalk: "Hold to talk",
|
|
694
|
+
micReleaseToSend: "Release to send",
|
|
695
|
+
micTapToTalk: "Tap to talk",
|
|
696
|
+
micTapToSend: "Tap to send",
|
|
697
|
+
micShortcutHint: "Hold the {key} tilde / backquote key to talk",
|
|
698
|
+
voiceBarThinking: "thinking…",
|
|
699
|
+
voiceBarTalking: "talking…",
|
|
700
|
+
voiceBarListening: "listening…",
|
|
701
|
+
voiceBarPushToTalk: "push to talk",
|
|
702
|
+
voiceBarTapToTalk: "tap to talk",
|
|
703
|
+
voiceBarWorking: "working…",
|
|
704
|
+
voiceBarNoActivity: "No activity — closing…",
|
|
705
|
+
voiceBarLoading: "Agent is loading",
|
|
706
|
+
voiceBarShortcutTalk: "talk",
|
|
707
|
+
voiceBarShortcutEnd: "end",
|
|
708
|
+
voiceBarTalkToAgent: "Talk to AI Agent",
|
|
709
|
+
openChatLabel: "Open chat",
|
|
710
|
+
closeChatLabel: "Close chat",
|
|
711
|
+
openAgentLabel: "Open Agent",
|
|
712
|
+
showNotificationsLabel: "Show notifications",
|
|
713
|
+
askLabel: "Ask Me Anything",
|
|
714
|
+
wakeLabel: "Wake buddy",
|
|
715
|
+
dismissLabel: "Dismiss",
|
|
716
|
+
loading: "Loading...",
|
|
717
|
+
endingSession: "Ending session...",
|
|
718
|
+
loadingConversation: "Loading conversation...",
|
|
719
|
+
statusStandingBy: "Standing by",
|
|
720
|
+
statusObserving: "Skippr is observing",
|
|
721
|
+
statusConnected: "Skippr is connected",
|
|
722
|
+
statusTalking: "Skippr is talking",
|
|
723
|
+
statusThinking: "Skippr is thinking",
|
|
724
|
+
statusPaused: "Session paused",
|
|
725
|
+
statusAriaStandingBy: "Skippr is standing by — click to open",
|
|
726
|
+
statusAriaPaused: "Session paused — click to open",
|
|
727
|
+
statusAriaClickToOpenChat: "{status} — click to open chat",
|
|
728
|
+
closeLabel: "Close",
|
|
729
|
+
muteLabel: "Mute",
|
|
730
|
+
unmuteLabel: "Unmute",
|
|
731
|
+
resumeLabel: "Resume",
|
|
732
|
+
stopLabel: "Stop",
|
|
733
|
+
pauseLabel: "Pause",
|
|
734
|
+
endSessionLabel: "End session",
|
|
735
|
+
shareScreenLabel: "Share screen",
|
|
736
|
+
stopSharingScreenLabel: "Stop sharing screen",
|
|
737
|
+
stopActionsLabel: "Stop actions",
|
|
738
|
+
chatMessagePlaceholder: "Type a message…",
|
|
739
|
+
chatMessageLabel: "Message",
|
|
740
|
+
chatSendMessageLabel: "Send message",
|
|
741
|
+
chatSendLabel: "Send",
|
|
742
|
+
chatEmptyConversation: "No messages in this conversation yet.",
|
|
743
|
+
chatWaitingToBegin: "Waiting for conversation to begin...",
|
|
744
|
+
chatJumpToLatest: "Jump to latest message",
|
|
745
|
+
chatSwitchToVoice: "Switch to voice",
|
|
746
|
+
chatSwitchToText: "Switch to text",
|
|
747
|
+
chatToggleVoice: "voice",
|
|
748
|
+
chatToggleText: "text",
|
|
749
|
+
chatPanelLabel: "Panel",
|
|
750
|
+
chatAnalyzingScreen: "Agent is analyzing your screen",
|
|
751
|
+
cardDismissLink: "Dismiss link",
|
|
752
|
+
cardCopyLink: "Copy link",
|
|
753
|
+
cardCopied: "Copied",
|
|
754
|
+
cardDismissPlan: "Dismiss plan",
|
|
755
|
+
cardDismissSignIn: "Dismiss sign in",
|
|
756
|
+
controlBarIdle: "Idle",
|
|
757
|
+
controlBarListening: "Listening",
|
|
758
|
+
controlBarThinking: "Thinking",
|
|
759
|
+
controlBarTalking: "Talking",
|
|
760
|
+
controlBarWorking: "Working",
|
|
761
|
+
controlBarStandingBy: "Standing by…",
|
|
762
|
+
controlBarAriaActing: "Agent is acting",
|
|
763
|
+
controlBarAriaIdle: "Agent is idle",
|
|
764
|
+
controlBarAriaListening: "Agent is listening",
|
|
765
|
+
controlBarAriaThinking: "Agent is thinking",
|
|
766
|
+
controlBarAriaTalking: "Agent is speaking",
|
|
767
|
+
controlBarAriaState: "Agent is {state}",
|
|
768
|
+
controlBarOpenAgenda: "Open agenda",
|
|
769
|
+
controlBarClosePanel: "Close panel",
|
|
770
|
+
pausedClosingIn: "Agent closes in",
|
|
771
|
+
pausedClosingInAria: "Agent closes in {seconds} seconds",
|
|
772
|
+
loginTitle: "Sign in to continue",
|
|
773
|
+
loginSubtitle: "Your email will be used to identify you across sessions",
|
|
774
|
+
loginEmailLabel: "Email",
|
|
775
|
+
loginEmailPlaceholder: "you@example.com",
|
|
776
|
+
loginContinue: "Continue",
|
|
777
|
+
loginOtpTitle: "Enter verification code",
|
|
778
|
+
loginOtpSubtitle: "We sent a 6-digit code to {email}",
|
|
779
|
+
loginOtpDigitLabel: "Verification code digit {index}",
|
|
780
|
+
loginVerify: "Verify",
|
|
781
|
+
loginChangeEmail: "Change email",
|
|
782
|
+
loginResendCode: "Resend code",
|
|
783
|
+
loginResendCooldown: "Resend in {seconds}s",
|
|
784
|
+
loginConsent: `By continuing, you agree to the ${CONSENT_TERMS_PLACEHOLDER} and ${CONSENT_PRIVACY_PLACEHOLDER}`,
|
|
785
|
+
actionClicking: "Clicking…",
|
|
786
|
+
actionTyping: "Typing…",
|
|
787
|
+
actionSelecting: "Selecting…",
|
|
788
|
+
actionScrolling: "Scrolling…",
|
|
789
|
+
actionHovering: "Hovering…",
|
|
790
|
+
highlightDefaultLabel: "Click here",
|
|
791
|
+
planTitle: "Plan",
|
|
792
|
+
planApprove: "Approve",
|
|
793
|
+
planApproving: "Approving…",
|
|
794
|
+
planCancel: "Cancel",
|
|
795
|
+
voiceBarPlanIntro: "Here's my plan",
|
|
796
|
+
voiceBarPlanStepsHint: "{count} steps · review and approve to run",
|
|
797
|
+
voiceBarPlanApprove: "approve plan",
|
|
798
|
+
voiceBarPlanApproving: "approving…",
|
|
799
|
+
voiceBarPlanCancel: "cancel",
|
|
800
|
+
voiceBarPlanApproved: "approved",
|
|
801
|
+
cardOpenLink: "Open",
|
|
802
|
+
voiceBarCardOpen: "open",
|
|
803
|
+
voiceBarCardCopy: "copy",
|
|
804
|
+
voiceBarCardCopied: "copied",
|
|
805
|
+
chatTabChat: "chat",
|
|
806
|
+
chatTabAgenda: "agenda",
|
|
807
|
+
chatPanelTitle: "Skippr AI",
|
|
808
|
+
voiceBarSignInTitle: "Sign in",
|
|
809
|
+
voiceBarTextMode: "Text mode",
|
|
810
|
+
sessionEndingSoon: "Session ending soon",
|
|
811
|
+
controlBarTranscriptListening: "Listening…",
|
|
812
|
+
tipStartLabel: "Start",
|
|
813
|
+
tipNextLabel: "Next",
|
|
814
|
+
voiceBarTipStart: "start",
|
|
815
|
+
buddyWakeGreeting: "oh hey!",
|
|
816
|
+
buddyHoldHint: "hold me down to talk",
|
|
817
|
+
buddyAutoOffNotice: "no activity — closing…",
|
|
818
|
+
attributionPrefix: "Powered by",
|
|
819
|
+
consentSessionStart: CONSENT_NOTICE_SESSION_START,
|
|
820
|
+
consentContinuing: CONSENT_NOTICE_CONTINUING,
|
|
821
|
+
consentAgentSessionStart: CONSENT_NOTICE_AGENT_SESSION_START
|
|
822
|
+
};
|
|
823
|
+
var CHROME_COPY_TRANSLATIONS = {
|
|
824
|
+
fr: {
|
|
825
|
+
agendaTitle: "Programme",
|
|
826
|
+
agendaLoading: "En attente du programme...",
|
|
827
|
+
agendaProgress: "étape {step} sur {total}",
|
|
828
|
+
agendaProgressLabel: "Progression du programme",
|
|
829
|
+
agendaNowBadge: "en cours",
|
|
830
|
+
micHoldToTalk: "Maintenir pour parler",
|
|
831
|
+
micReleaseToSend: "Relâcher pour envoyer",
|
|
832
|
+
micTapToTalk: "Appuyer pour parler",
|
|
833
|
+
micTapToSend: "Appuyer pour envoyer",
|
|
834
|
+
micShortcutHint: "Maintenez {key} tilde / accent grave pour parler",
|
|
835
|
+
voiceBarThinking: "réflexion…",
|
|
836
|
+
voiceBarTalking: "parle…",
|
|
837
|
+
voiceBarListening: "écoute…",
|
|
838
|
+
voiceBarPushToTalk: "maintenir pour parler",
|
|
839
|
+
voiceBarTapToTalk: "appuyer pour parler",
|
|
840
|
+
voiceBarWorking: "en cours…",
|
|
841
|
+
voiceBarNoActivity: "Aucune activité — fermeture…",
|
|
842
|
+
voiceBarLoading: "Chargement",
|
|
843
|
+
voiceBarShortcutTalk: "parler",
|
|
844
|
+
voiceBarShortcutEnd: "fin",
|
|
845
|
+
voiceBarTalkToAgent: "Parler à l'IA",
|
|
846
|
+
openChatLabel: "Ouvrir le chat",
|
|
847
|
+
closeChatLabel: "Fermer le chat",
|
|
848
|
+
openAgentLabel: "Ouvrir l'agent",
|
|
849
|
+
showNotificationsLabel: "Afficher les notifications",
|
|
850
|
+
askLabel: "Posez-moi vos questions",
|
|
851
|
+
wakeLabel: "Réveiller Buddy",
|
|
852
|
+
dismissLabel: "Ignorer",
|
|
853
|
+
loading: "Chargement...",
|
|
854
|
+
endingSession: "Fin de la session...",
|
|
855
|
+
loadingConversation: "Chargement de la conversation...",
|
|
856
|
+
statusStandingBy: "En attente",
|
|
857
|
+
statusObserving: "Skippr observe",
|
|
858
|
+
statusConnected: "Skippr est connecté",
|
|
859
|
+
statusTalking: "Skippr parle",
|
|
860
|
+
statusThinking: "Skippr réfléchit",
|
|
861
|
+
statusPaused: "Session en pause",
|
|
862
|
+
statusAriaStandingBy: "Skippr est en attente — cliquez pour ouvrir",
|
|
863
|
+
statusAriaPaused: "Session en pause — cliquez pour ouvrir",
|
|
864
|
+
statusAriaClickToOpenChat: "{status} — cliquez pour ouvrir le chat",
|
|
865
|
+
closeLabel: "Fermer",
|
|
866
|
+
muteLabel: "Couper le micro",
|
|
867
|
+
unmuteLabel: "Activer le micro",
|
|
868
|
+
resumeLabel: "Reprendre",
|
|
869
|
+
stopLabel: "Arrêter",
|
|
870
|
+
pauseLabel: "Pause",
|
|
871
|
+
endSessionLabel: "Terminer la session",
|
|
872
|
+
shareScreenLabel: "Partager l'écran",
|
|
873
|
+
stopSharingScreenLabel: "Arrêter le partage",
|
|
874
|
+
stopActionsLabel: "Arrêter les actions",
|
|
875
|
+
chatMessagePlaceholder: "Écrivez un message…",
|
|
876
|
+
chatMessageLabel: "Message",
|
|
877
|
+
chatSendMessageLabel: "Envoyer le message",
|
|
878
|
+
chatSendLabel: "Envoyer",
|
|
879
|
+
chatEmptyConversation: "Aucun message dans cette conversation.",
|
|
880
|
+
chatWaitingToBegin: "En attente du début de la conversation...",
|
|
881
|
+
chatJumpToLatest: "Aller au dernier message",
|
|
882
|
+
chatSwitchToVoice: "Passer en mode vocal",
|
|
883
|
+
chatSwitchToText: "Passer en mode texte",
|
|
884
|
+
chatToggleVoice: "voix",
|
|
885
|
+
chatToggleText: "texte",
|
|
886
|
+
chatPanelLabel: "Panneau",
|
|
887
|
+
chatAnalyzingScreen: "L'agent analyse votre écran",
|
|
888
|
+
cardDismissLink: "Ignorer le lien",
|
|
889
|
+
cardCopyLink: "Copier le lien",
|
|
890
|
+
cardCopied: "Copié",
|
|
891
|
+
cardDismissPlan: "Ignorer le plan",
|
|
892
|
+
cardDismissSignIn: "Ignorer la connexion",
|
|
893
|
+
controlBarIdle: "Inactif",
|
|
894
|
+
controlBarListening: "Écoute",
|
|
895
|
+
controlBarThinking: "Réflexion",
|
|
896
|
+
controlBarTalking: "Parle",
|
|
897
|
+
controlBarWorking: "En cours",
|
|
898
|
+
controlBarStandingBy: "En attente…",
|
|
899
|
+
controlBarAriaActing: "L'agent agit",
|
|
900
|
+
controlBarAriaIdle: "L'agent est inactif",
|
|
901
|
+
controlBarAriaListening: "L'agent écoute",
|
|
902
|
+
controlBarAriaThinking: "L'agent réfléchit",
|
|
903
|
+
controlBarAriaTalking: "L'agent parle",
|
|
904
|
+
controlBarAriaState: "L'agent est {state}",
|
|
905
|
+
controlBarOpenAgenda: "Ouvrir le programme",
|
|
906
|
+
controlBarClosePanel: "Fermer le panneau",
|
|
907
|
+
pausedClosingIn: "Fermeture dans",
|
|
908
|
+
pausedClosingInAria: "L'agent se ferme dans {seconds} secondes",
|
|
909
|
+
loginTitle: "Connectez-vous pour continuer",
|
|
910
|
+
loginSubtitle: "Votre e-mail servira à vous identifier d'une session à l'autre",
|
|
911
|
+
loginEmailLabel: "E-mail",
|
|
912
|
+
loginEmailPlaceholder: "nom@exemple.com",
|
|
913
|
+
loginContinue: "Continuer",
|
|
914
|
+
loginOtpTitle: "Saisissez le code de vérification",
|
|
915
|
+
loginOtpSubtitle: "Nous avons envoyé un code à 6 chiffres à {email}",
|
|
916
|
+
loginOtpDigitLabel: "Chiffre {index} du code de vérification",
|
|
917
|
+
loginVerify: "Vérifier",
|
|
918
|
+
loginChangeEmail: "Changer d'e-mail",
|
|
919
|
+
loginResendCode: "Renvoyer le code",
|
|
920
|
+
loginResendCooldown: "Renvoyer dans {seconds} s",
|
|
921
|
+
loginConsent: "En continuant, vous acceptez {terms} et {privacy}",
|
|
922
|
+
actionClicking: "Clic…",
|
|
923
|
+
actionTyping: "Saisie…",
|
|
924
|
+
actionSelecting: "Sélection…",
|
|
925
|
+
actionScrolling: "Défilement…",
|
|
926
|
+
actionHovering: "Survol…",
|
|
927
|
+
highlightDefaultLabel: "Cliquez ici",
|
|
928
|
+
planTitle: "Plan",
|
|
929
|
+
planApprove: "Valider",
|
|
930
|
+
planApproving: "En cours…",
|
|
931
|
+
planCancel: "Annuler",
|
|
932
|
+
voiceBarPlanIntro: "Voici mon plan",
|
|
933
|
+
voiceBarPlanStepsHint: "{count} étapes · vérifiez et approuvez",
|
|
934
|
+
voiceBarPlanApprove: "valider",
|
|
935
|
+
voiceBarPlanApproving: "en cours…",
|
|
936
|
+
voiceBarPlanCancel: "annuler",
|
|
937
|
+
voiceBarPlanApproved: "approuvé",
|
|
938
|
+
cardOpenLink: "Ouvrir",
|
|
939
|
+
voiceBarCardOpen: "ouvrir",
|
|
940
|
+
voiceBarCardCopy: "copier",
|
|
941
|
+
voiceBarCardCopied: "copié",
|
|
942
|
+
chatTabChat: "chat",
|
|
943
|
+
chatTabAgenda: "agenda",
|
|
944
|
+
chatPanelTitle: "Skippr IA",
|
|
945
|
+
voiceBarSignInTitle: "Connexion",
|
|
946
|
+
voiceBarTextMode: "Mode texte",
|
|
947
|
+
sessionEndingSoon: "Fin de session proche",
|
|
948
|
+
controlBarTranscriptListening: "Écoute…",
|
|
949
|
+
tipStartLabel: "Démarrer",
|
|
950
|
+
tipNextLabel: "Suivant",
|
|
951
|
+
voiceBarTipStart: "lancer",
|
|
952
|
+
buddyWakeGreeting: "salut !",
|
|
953
|
+
buddyHoldHint: "maintenez pour parler",
|
|
954
|
+
buddyAutoOffNotice: "inactif — fermeture…",
|
|
955
|
+
attributionPrefix: "Propulsé par",
|
|
956
|
+
consentSessionStart: "En démarrant, vous acceptez les {terms} & {privacy} de Skippr",
|
|
957
|
+
consentContinuing: "En continuant, vous acceptez {terms} & {privacy}",
|
|
958
|
+
consentAgentSessionStart: "En démarrant la session IA, vous acceptez les {terms} & {privacy} de Skippr"
|
|
959
|
+
},
|
|
960
|
+
de: {
|
|
961
|
+
agendaTitle: "Agenda",
|
|
962
|
+
agendaLoading: "Agenda wird geladen...",
|
|
963
|
+
agendaProgress: "Schritt {step} von {total}",
|
|
964
|
+
agendaProgressLabel: "Agenda-Fortschritt",
|
|
965
|
+
agendaNowBadge: "jetzt",
|
|
966
|
+
micHoldToTalk: "Halten zum Sprechen",
|
|
967
|
+
micReleaseToSend: "Loslassen zum Senden",
|
|
968
|
+
micTapToTalk: "Tippen zum Sprechen",
|
|
969
|
+
micTapToSend: "Tippen zum Senden",
|
|
970
|
+
micShortcutHint: "Halten Sie {key} Tilde/Backquote zum Sprechen",
|
|
971
|
+
voiceBarThinking: "denkt…",
|
|
972
|
+
voiceBarTalking: "spricht…",
|
|
973
|
+
voiceBarListening: "hört zu…",
|
|
974
|
+
voiceBarPushToTalk: "halten zum sprechen",
|
|
975
|
+
voiceBarTapToTalk: "tippen zum sprechen",
|
|
976
|
+
voiceBarWorking: "arbeitet…",
|
|
977
|
+
voiceBarNoActivity: "Keine Aktivität — schließt…",
|
|
978
|
+
voiceBarLoading: "Agent lädt",
|
|
979
|
+
voiceBarShortcutTalk: "sprechen",
|
|
980
|
+
voiceBarShortcutEnd: "Ende",
|
|
981
|
+
voiceBarTalkToAgent: "Mit KI sprechen",
|
|
982
|
+
openChatLabel: "Chat öffnen",
|
|
983
|
+
closeChatLabel: "Chat schließen",
|
|
984
|
+
openAgentLabel: "Agent öffnen",
|
|
985
|
+
showNotificationsLabel: "Benachrichtigungen anzeigen",
|
|
986
|
+
askLabel: "Fragen Sie mich",
|
|
987
|
+
wakeLabel: "Buddy wecken",
|
|
988
|
+
dismissLabel: "Schließen",
|
|
989
|
+
loading: "Laden...",
|
|
990
|
+
endingSession: "Sitzung wird beendet...",
|
|
991
|
+
loadingConversation: "Unterhaltung wird geladen...",
|
|
992
|
+
statusStandingBy: "Bereit",
|
|
993
|
+
statusObserving: "Skippr beobachtet",
|
|
994
|
+
statusConnected: "Skippr ist verbunden",
|
|
995
|
+
statusTalking: "Skippr spricht",
|
|
996
|
+
statusThinking: "Skippr denkt",
|
|
997
|
+
statusPaused: "Sitzung pausiert",
|
|
998
|
+
statusAriaStandingBy: "Skippr ist bereit — zum Öffnen klicken",
|
|
999
|
+
statusAriaPaused: "Sitzung pausiert — zum Öffnen klicken",
|
|
1000
|
+
statusAriaClickToOpenChat: "{status} — zum Öffnen des Chats klicken",
|
|
1001
|
+
closeLabel: "Schließen",
|
|
1002
|
+
muteLabel: "Stummschalten",
|
|
1003
|
+
unmuteLabel: "Stummschaltung aufheben",
|
|
1004
|
+
resumeLabel: "Fortsetzen",
|
|
1005
|
+
stopLabel: "Stoppen",
|
|
1006
|
+
pauseLabel: "Pause",
|
|
1007
|
+
endSessionLabel: "Sitzung beenden",
|
|
1008
|
+
shareScreenLabel: "Bildschirm teilen",
|
|
1009
|
+
stopSharingScreenLabel: "Teilen beenden",
|
|
1010
|
+
stopActionsLabel: "Aktionen stoppen",
|
|
1011
|
+
chatMessagePlaceholder: "Nachricht schreiben…",
|
|
1012
|
+
chatMessageLabel: "Nachricht",
|
|
1013
|
+
chatSendMessageLabel: "Nachricht senden",
|
|
1014
|
+
chatSendLabel: "Senden",
|
|
1015
|
+
chatEmptyConversation: "Noch keine Nachrichten in dieser Unterhaltung.",
|
|
1016
|
+
chatWaitingToBegin: "Warten auf den Beginn der Unterhaltung...",
|
|
1017
|
+
chatJumpToLatest: "Zur neuesten Nachricht springen",
|
|
1018
|
+
chatSwitchToVoice: "Zu Sprache wechseln",
|
|
1019
|
+
chatSwitchToText: "Zu Text wechseln",
|
|
1020
|
+
chatToggleVoice: "sprache",
|
|
1021
|
+
chatToggleText: "text",
|
|
1022
|
+
chatPanelLabel: "Panel",
|
|
1023
|
+
chatAnalyzingScreen: "Agent analysiert Ihren Bildschirm",
|
|
1024
|
+
cardDismissLink: "Link ausblenden",
|
|
1025
|
+
cardCopyLink: "Link kopieren",
|
|
1026
|
+
cardCopied: "Kopiert",
|
|
1027
|
+
cardDismissPlan: "Plan ausblenden",
|
|
1028
|
+
cardDismissSignIn: "Anmeldung ausblenden",
|
|
1029
|
+
controlBarIdle: "Inaktiv",
|
|
1030
|
+
controlBarListening: "Hört zu",
|
|
1031
|
+
controlBarThinking: "Denkt",
|
|
1032
|
+
controlBarTalking: "Spricht",
|
|
1033
|
+
controlBarWorking: "Arbeitet",
|
|
1034
|
+
controlBarStandingBy: "Bereit…",
|
|
1035
|
+
controlBarAriaActing: "Agent handelt",
|
|
1036
|
+
controlBarAriaIdle: "Agent ist inaktiv",
|
|
1037
|
+
controlBarAriaListening: "Agent hört zu",
|
|
1038
|
+
controlBarAriaThinking: "Agent denkt",
|
|
1039
|
+
controlBarAriaTalking: "Agent spricht",
|
|
1040
|
+
controlBarAriaState: "Agent ist {state}",
|
|
1041
|
+
controlBarOpenAgenda: "Agenda öffnen",
|
|
1042
|
+
controlBarClosePanel: "Panel schließen",
|
|
1043
|
+
pausedClosingIn: "Agent schließt in",
|
|
1044
|
+
pausedClosingInAria: "Agent schließt in {seconds} Sekunden",
|
|
1045
|
+
loginTitle: "Zum Fortfahren anmelden",
|
|
1046
|
+
loginSubtitle: "Ihre E-Mail-Adresse dient zur Identifikation über Sitzungen hinweg",
|
|
1047
|
+
loginEmailLabel: "E-Mail",
|
|
1048
|
+
loginEmailPlaceholder: "name@beispiel.de",
|
|
1049
|
+
loginContinue: "Weiter",
|
|
1050
|
+
loginOtpTitle: "Bestätigungscode eingeben",
|
|
1051
|
+
loginOtpSubtitle: "Wir haben einen 6-stelligen Code an {email} gesendet",
|
|
1052
|
+
loginOtpDigitLabel: "Bestätigungscode Ziffer {index}",
|
|
1053
|
+
loginVerify: "Bestätigen",
|
|
1054
|
+
loginChangeEmail: "E-Mail ändern",
|
|
1055
|
+
loginResendCode: "Erneut senden",
|
|
1056
|
+
loginResendCooldown: "Erneut in {seconds} s",
|
|
1057
|
+
loginConsent: "Wenn Sie fortfahren, akzeptieren Sie {terms} und {privacy}",
|
|
1058
|
+
actionClicking: "Klickt…",
|
|
1059
|
+
actionTyping: "Tippt…",
|
|
1060
|
+
actionSelecting: "Wählt…",
|
|
1061
|
+
actionScrolling: "Scrollt…",
|
|
1062
|
+
actionHovering: "Zeigt…",
|
|
1063
|
+
highlightDefaultLabel: "Hier klicken",
|
|
1064
|
+
planTitle: "Plan",
|
|
1065
|
+
planApprove: "Freigeben",
|
|
1066
|
+
planApproving: "Läuft…",
|
|
1067
|
+
planCancel: "Abbrechen",
|
|
1068
|
+
voiceBarPlanIntro: "Mein Plan",
|
|
1069
|
+
voiceBarPlanStepsHint: "{count} Schritte · prüfen und freigeben",
|
|
1070
|
+
voiceBarPlanApprove: "freigeben",
|
|
1071
|
+
voiceBarPlanApproving: "läuft…",
|
|
1072
|
+
voiceBarPlanCancel: "abbrechen",
|
|
1073
|
+
voiceBarPlanApproved: "genehmigt",
|
|
1074
|
+
cardOpenLink: "Öffnen",
|
|
1075
|
+
voiceBarCardOpen: "öffnen",
|
|
1076
|
+
voiceBarCardCopy: "kopieren",
|
|
1077
|
+
voiceBarCardCopied: "kopiert",
|
|
1078
|
+
chatTabChat: "chat",
|
|
1079
|
+
chatTabAgenda: "agenda",
|
|
1080
|
+
chatPanelTitle: "Skippr KI",
|
|
1081
|
+
voiceBarSignInTitle: "Anmelden",
|
|
1082
|
+
voiceBarTextMode: "Textmodus",
|
|
1083
|
+
sessionEndingSoon: "Sitzung endet bald",
|
|
1084
|
+
controlBarTranscriptListening: "Hört zu…",
|
|
1085
|
+
tipStartLabel: "Starten",
|
|
1086
|
+
tipNextLabel: "Weiter",
|
|
1087
|
+
voiceBarTipStart: "starten",
|
|
1088
|
+
buddyWakeGreeting: "oh hallo!",
|
|
1089
|
+
buddyHoldHint: "zum Sprechen halten",
|
|
1090
|
+
buddyAutoOffNotice: "inaktiv — schließt…",
|
|
1091
|
+
attributionPrefix: "Betrieben von",
|
|
1092
|
+
consentSessionStart: "Mit dem Start akzeptieren Sie Skipprs {terms} & {privacy}",
|
|
1093
|
+
consentContinuing: "Beim Fortfahren akzeptieren Sie {terms} & {privacy}",
|
|
1094
|
+
consentAgentSessionStart: "Mit dem Start der KI-Sitzung akzeptieren Sie Skipprs {terms} & {privacy}"
|
|
1095
|
+
},
|
|
1096
|
+
it: {
|
|
1097
|
+
agendaTitle: "Programma",
|
|
1098
|
+
agendaLoading: "In attesa del programma...",
|
|
1099
|
+
agendaProgress: "passo {step} di {total}",
|
|
1100
|
+
agendaProgressLabel: "Avanzamento del programma",
|
|
1101
|
+
agendaNowBadge: "ora",
|
|
1102
|
+
micHoldToTalk: "Tieni per parlare",
|
|
1103
|
+
micReleaseToSend: "Rilascia per inviare",
|
|
1104
|
+
micTapToTalk: "Tocca per parlare",
|
|
1105
|
+
micTapToSend: "Tocca per inviare",
|
|
1106
|
+
micShortcutHint: "Tieni {key} tilde / backquote per parlare",
|
|
1107
|
+
voiceBarThinking: "pensando…",
|
|
1108
|
+
voiceBarTalking: "parlando…",
|
|
1109
|
+
voiceBarListening: "in ascolto…",
|
|
1110
|
+
voiceBarPushToTalk: "tieni per parlare",
|
|
1111
|
+
voiceBarTapToTalk: "tocca per parlare",
|
|
1112
|
+
voiceBarWorking: "al lavoro…",
|
|
1113
|
+
voiceBarNoActivity: "Nessuna attività — chiusura…",
|
|
1114
|
+
voiceBarLoading: "Caricamento",
|
|
1115
|
+
voiceBarShortcutTalk: "parla",
|
|
1116
|
+
voiceBarShortcutEnd: "fine",
|
|
1117
|
+
voiceBarTalkToAgent: "Parla con l'IA",
|
|
1118
|
+
openChatLabel: "Apri la chat",
|
|
1119
|
+
closeChatLabel: "Chiudi la chat",
|
|
1120
|
+
openAgentLabel: "Apri l'agente",
|
|
1121
|
+
showNotificationsLabel: "Mostra le notifiche",
|
|
1122
|
+
askLabel: "Chiedimi qualsiasi cosa",
|
|
1123
|
+
wakeLabel: "Attiva Buddy",
|
|
1124
|
+
dismissLabel: "Ignora",
|
|
1125
|
+
loading: "Caricamento...",
|
|
1126
|
+
endingSession: "Chiusura della sessione...",
|
|
1127
|
+
loadingConversation: "Caricamento della conversazione...",
|
|
1128
|
+
statusStandingBy: "In attesa",
|
|
1129
|
+
statusObserving: "Skippr osserva",
|
|
1130
|
+
statusConnected: "Skippr è connesso",
|
|
1131
|
+
statusTalking: "Skippr parla",
|
|
1132
|
+
statusThinking: "Skippr pensa",
|
|
1133
|
+
statusPaused: "Sessione in pausa",
|
|
1134
|
+
statusAriaStandingBy: "Skippr è in attesa — clicca per aprire",
|
|
1135
|
+
statusAriaPaused: "Sessione in pausa — clicca per aprire",
|
|
1136
|
+
statusAriaClickToOpenChat: "{status} — clicca per aprire la chat",
|
|
1137
|
+
closeLabel: "Chiudi",
|
|
1138
|
+
muteLabel: "Disattiva il microfono",
|
|
1139
|
+
unmuteLabel: "Attiva il microfono",
|
|
1140
|
+
resumeLabel: "Riprendi",
|
|
1141
|
+
stopLabel: "Ferma",
|
|
1142
|
+
pauseLabel: "Pausa",
|
|
1143
|
+
endSessionLabel: "Termina la sessione",
|
|
1144
|
+
shareScreenLabel: "Condividi lo schermo",
|
|
1145
|
+
stopSharingScreenLabel: "Interrompi la condivisione",
|
|
1146
|
+
stopActionsLabel: "Ferma le azioni",
|
|
1147
|
+
chatMessagePlaceholder: "Scrivi un messaggio…",
|
|
1148
|
+
chatMessageLabel: "Messaggio",
|
|
1149
|
+
chatSendMessageLabel: "Invia il messaggio",
|
|
1150
|
+
chatSendLabel: "Invia",
|
|
1151
|
+
chatEmptyConversation: "Nessun messaggio in questa conversazione.",
|
|
1152
|
+
chatWaitingToBegin: "In attesa dell'inizio della conversazione...",
|
|
1153
|
+
chatJumpToLatest: "Vai al messaggio più recente",
|
|
1154
|
+
chatSwitchToVoice: "Passa alla voce",
|
|
1155
|
+
chatSwitchToText: "Passa al testo",
|
|
1156
|
+
chatToggleVoice: "voce",
|
|
1157
|
+
chatToggleText: "testo",
|
|
1158
|
+
chatPanelLabel: "Pannello",
|
|
1159
|
+
chatAnalyzingScreen: "L'agente analizza il tuo schermo",
|
|
1160
|
+
cardDismissLink: "Ignora il link",
|
|
1161
|
+
cardCopyLink: "Copia link",
|
|
1162
|
+
cardCopied: "Copiato",
|
|
1163
|
+
cardDismissPlan: "Ignora il piano",
|
|
1164
|
+
cardDismissSignIn: "Ignora l'accesso",
|
|
1165
|
+
controlBarIdle: "Inattivo",
|
|
1166
|
+
controlBarListening: "In ascolto",
|
|
1167
|
+
controlBarThinking: "Sta pensando",
|
|
1168
|
+
controlBarTalking: "Sta parlando",
|
|
1169
|
+
controlBarWorking: "Al lavoro",
|
|
1170
|
+
controlBarStandingBy: "In attesa…",
|
|
1171
|
+
controlBarAriaActing: "L'agente sta agendo",
|
|
1172
|
+
controlBarAriaIdle: "L'agente è inattivo",
|
|
1173
|
+
controlBarAriaListening: "L'agente è in ascolto",
|
|
1174
|
+
controlBarAriaThinking: "L'agente sta pensando",
|
|
1175
|
+
controlBarAriaTalking: "L'agente sta parlando",
|
|
1176
|
+
controlBarAriaState: "L'agente è {state}",
|
|
1177
|
+
controlBarOpenAgenda: "Apri il programma",
|
|
1178
|
+
controlBarClosePanel: "Chiudi il pannello",
|
|
1179
|
+
pausedClosingIn: "L'agente si chiude tra",
|
|
1180
|
+
pausedClosingInAria: "L'agente si chiude tra {seconds} secondi",
|
|
1181
|
+
loginTitle: "Accedi per continuare",
|
|
1182
|
+
loginSubtitle: "La tua e-mail servirà a identificarti nelle varie sessioni",
|
|
1183
|
+
loginEmailLabel: "E-mail",
|
|
1184
|
+
loginEmailPlaceholder: "nome@esempio.com",
|
|
1185
|
+
loginContinue: "Continua",
|
|
1186
|
+
loginOtpTitle: "Inserisci il codice di verifica",
|
|
1187
|
+
loginOtpSubtitle: "Abbiamo inviato un codice di 6 cifre a {email}",
|
|
1188
|
+
loginOtpDigitLabel: "Cifra {index} del codice di verifica",
|
|
1189
|
+
loginVerify: "Verifica",
|
|
1190
|
+
loginChangeEmail: "Cambia e-mail",
|
|
1191
|
+
loginResendCode: "Rinvia codice",
|
|
1192
|
+
loginResendCooldown: "Rinvia tra {seconds} s",
|
|
1193
|
+
loginConsent: "Continuando, accetti {terms} e {privacy}",
|
|
1194
|
+
actionClicking: "Clic…",
|
|
1195
|
+
actionTyping: "Digita…",
|
|
1196
|
+
actionSelecting: "Seleziona…",
|
|
1197
|
+
actionScrolling: "Scorre…",
|
|
1198
|
+
actionHovering: "Punta…",
|
|
1199
|
+
highlightDefaultLabel: "Clicca qui",
|
|
1200
|
+
planTitle: "Piano",
|
|
1201
|
+
planApprove: "Approva",
|
|
1202
|
+
planApproving: "Approvo…",
|
|
1203
|
+
planCancel: "Annulla",
|
|
1204
|
+
voiceBarPlanIntro: "Ecco il piano",
|
|
1205
|
+
voiceBarPlanStepsHint: "{count} passaggi · rivedi e approva",
|
|
1206
|
+
voiceBarPlanApprove: "approva",
|
|
1207
|
+
voiceBarPlanApproving: "approvo…",
|
|
1208
|
+
voiceBarPlanCancel: "annulla",
|
|
1209
|
+
voiceBarPlanApproved: "approvato",
|
|
1210
|
+
cardOpenLink: "Apri",
|
|
1211
|
+
voiceBarCardOpen: "apri",
|
|
1212
|
+
voiceBarCardCopy: "copia",
|
|
1213
|
+
voiceBarCardCopied: "copiato",
|
|
1214
|
+
chatTabChat: "chat",
|
|
1215
|
+
chatTabAgenda: "agenda",
|
|
1216
|
+
chatPanelTitle: "Skippr IA",
|
|
1217
|
+
voiceBarSignInTitle: "Accedi",
|
|
1218
|
+
voiceBarTextMode: "Modo testo",
|
|
1219
|
+
sessionEndingSoon: "Sessione quasi finita",
|
|
1220
|
+
controlBarTranscriptListening: "In ascolto…",
|
|
1221
|
+
tipStartLabel: "Avvia",
|
|
1222
|
+
tipNextLabel: "Avanti",
|
|
1223
|
+
voiceBarTipStart: "avvia",
|
|
1224
|
+
buddyWakeGreeting: "oh ciao!",
|
|
1225
|
+
buddyHoldHint: "tieni per parlare",
|
|
1226
|
+
buddyAutoOffNotice: "inattivo — chiudo…",
|
|
1227
|
+
attributionPrefix: "Offerto da",
|
|
1228
|
+
consentSessionStart: "Avviando una sessione, accetti {terms} & {privacy} di Skippr",
|
|
1229
|
+
consentContinuing: "Continuando, accetti {terms} & {privacy}",
|
|
1230
|
+
consentAgentSessionStart: "Avviando la sessione IA, accetti {terms} & {privacy} di Skippr"
|
|
1231
|
+
},
|
|
1232
|
+
es: {
|
|
1233
|
+
agendaTitle: "Agenda",
|
|
1234
|
+
agendaLoading: "Esperando la agenda...",
|
|
1235
|
+
agendaProgress: "paso {step} de {total}",
|
|
1236
|
+
agendaProgressLabel: "Progreso de la agenda",
|
|
1237
|
+
agendaNowBadge: "ahora",
|
|
1238
|
+
micHoldToTalk: "Mantén para hablar",
|
|
1239
|
+
micReleaseToSend: "Suelta para enviar",
|
|
1240
|
+
micTapToTalk: "Toca para hablar",
|
|
1241
|
+
micTapToSend: "Toca para enviar",
|
|
1242
|
+
micShortcutHint: "Mantén {key} tilde / acento grave para hablar",
|
|
1243
|
+
voiceBarThinking: "pensando…",
|
|
1244
|
+
voiceBarTalking: "hablando…",
|
|
1245
|
+
voiceBarListening: "escuchando…",
|
|
1246
|
+
voiceBarPushToTalk: "mantén para hablar",
|
|
1247
|
+
voiceBarTapToTalk: "toca para hablar",
|
|
1248
|
+
voiceBarWorking: "trabajando…",
|
|
1249
|
+
voiceBarNoActivity: "Sin actividad — cerrando…",
|
|
1250
|
+
voiceBarLoading: "Cargando",
|
|
1251
|
+
voiceBarShortcutTalk: "hablar",
|
|
1252
|
+
voiceBarShortcutEnd: "fin",
|
|
1253
|
+
voiceBarTalkToAgent: "Hablar con la IA",
|
|
1254
|
+
openChatLabel: "Abrir el chat",
|
|
1255
|
+
closeChatLabel: "Cerrar el chat",
|
|
1256
|
+
openAgentLabel: "Abrir el agente",
|
|
1257
|
+
showNotificationsLabel: "Mostrar las notificaciones",
|
|
1258
|
+
askLabel: "Pregúntame lo que sea",
|
|
1259
|
+
wakeLabel: "Despertar a Buddy",
|
|
1260
|
+
dismissLabel: "Descartar",
|
|
1261
|
+
loading: "Cargando...",
|
|
1262
|
+
endingSession: "Finalizando la sesión...",
|
|
1263
|
+
loadingConversation: "Cargando la conversación...",
|
|
1264
|
+
statusStandingBy: "En espera",
|
|
1265
|
+
statusObserving: "Skippr observa",
|
|
1266
|
+
statusConnected: "Skippr está conectado",
|
|
1267
|
+
statusTalking: "Skippr habla",
|
|
1268
|
+
statusThinking: "Skippr piensa",
|
|
1269
|
+
statusPaused: "Sesión en pausa",
|
|
1270
|
+
statusAriaStandingBy: "Skippr está en espera — haz clic para abrir",
|
|
1271
|
+
statusAriaPaused: "Sesión en pausa — haz clic para abrir",
|
|
1272
|
+
statusAriaClickToOpenChat: "{status} — haz clic para abrir el chat",
|
|
1273
|
+
closeLabel: "Cerrar",
|
|
1274
|
+
muteLabel: "Silenciar el micrófono",
|
|
1275
|
+
unmuteLabel: "Activar el micrófono",
|
|
1276
|
+
resumeLabel: "Reanudar",
|
|
1277
|
+
stopLabel: "Detener",
|
|
1278
|
+
pauseLabel: "Pausa",
|
|
1279
|
+
endSessionLabel: "Finalizar la sesión",
|
|
1280
|
+
shareScreenLabel: "Compartir la pantalla",
|
|
1281
|
+
stopSharingScreenLabel: "Dejar de compartir",
|
|
1282
|
+
stopActionsLabel: "Detener las acciones",
|
|
1283
|
+
chatMessagePlaceholder: "Escribe un mensaje…",
|
|
1284
|
+
chatMessageLabel: "Mensaje",
|
|
1285
|
+
chatSendMessageLabel: "Enviar el mensaje",
|
|
1286
|
+
chatSendLabel: "Enviar",
|
|
1287
|
+
chatEmptyConversation: "Todavía no hay mensajes en esta conversación.",
|
|
1288
|
+
chatWaitingToBegin: "Esperando el inicio de la conversación...",
|
|
1289
|
+
chatJumpToLatest: "Ir al último mensaje",
|
|
1290
|
+
chatSwitchToVoice: "Cambiar a voz",
|
|
1291
|
+
chatSwitchToText: "Cambiar a texto",
|
|
1292
|
+
chatToggleVoice: "voz",
|
|
1293
|
+
chatToggleText: "texto",
|
|
1294
|
+
chatPanelLabel: "Panel",
|
|
1295
|
+
chatAnalyzingScreen: "El agente analiza tu pantalla",
|
|
1296
|
+
cardDismissLink: "Descartar el enlace",
|
|
1297
|
+
cardCopyLink: "Copiar enlace",
|
|
1298
|
+
cardCopied: "Copiado",
|
|
1299
|
+
cardDismissPlan: "Descartar el plan",
|
|
1300
|
+
cardDismissSignIn: "Descartar el inicio de sesión",
|
|
1301
|
+
controlBarIdle: "Inactivo",
|
|
1302
|
+
controlBarListening: "Escuchando",
|
|
1303
|
+
controlBarThinking: "Pensando",
|
|
1304
|
+
controlBarTalking: "Hablando",
|
|
1305
|
+
controlBarWorking: "Trabajando",
|
|
1306
|
+
controlBarStandingBy: "En espera…",
|
|
1307
|
+
controlBarAriaActing: "El agente está actuando",
|
|
1308
|
+
controlBarAriaIdle: "El agente está inactivo",
|
|
1309
|
+
controlBarAriaListening: "El agente está escuchando",
|
|
1310
|
+
controlBarAriaThinking: "El agente está pensando",
|
|
1311
|
+
controlBarAriaTalking: "El agente está hablando",
|
|
1312
|
+
controlBarAriaState: "El agente está {state}",
|
|
1313
|
+
controlBarOpenAgenda: "Abrir la agenda",
|
|
1314
|
+
controlBarClosePanel: "Cerrar el panel",
|
|
1315
|
+
pausedClosingIn: "El agente se cierra en",
|
|
1316
|
+
pausedClosingInAria: "El agente se cierra en {seconds} segundos",
|
|
1317
|
+
loginTitle: "Inicia sesión para continuar",
|
|
1318
|
+
loginSubtitle: "Tu correo electrónico servirá para identificarte entre sesiones",
|
|
1319
|
+
loginEmailLabel: "Correo electrónico",
|
|
1320
|
+
loginEmailPlaceholder: "nombre@ejemplo.com",
|
|
1321
|
+
loginContinue: "Continuar",
|
|
1322
|
+
loginOtpTitle: "Introduce el código de verificación",
|
|
1323
|
+
loginOtpSubtitle: "Hemos enviado un código de 6 dígitos a {email}",
|
|
1324
|
+
loginOtpDigitLabel: "Dígito {index} del código de verificación",
|
|
1325
|
+
loginVerify: "Verificar",
|
|
1326
|
+
loginChangeEmail: "Cambiar correo",
|
|
1327
|
+
loginResendCode: "Reenviar código",
|
|
1328
|
+
loginResendCooldown: "Reenviar en {seconds} s",
|
|
1329
|
+
loginConsent: "Al continuar, aceptas {terms} y {privacy}",
|
|
1330
|
+
actionClicking: "Clic…",
|
|
1331
|
+
actionTyping: "Escribe…",
|
|
1332
|
+
actionSelecting: "Selecciona…",
|
|
1333
|
+
actionScrolling: "Desplaza…",
|
|
1334
|
+
actionHovering: "Apunta…",
|
|
1335
|
+
highlightDefaultLabel: "Clic aquí",
|
|
1336
|
+
planTitle: "Plan",
|
|
1337
|
+
planApprove: "Aprobar",
|
|
1338
|
+
planApproving: "En curso…",
|
|
1339
|
+
planCancel: "Cancelar",
|
|
1340
|
+
voiceBarPlanIntro: "Este es mi plan",
|
|
1341
|
+
voiceBarPlanStepsHint: "{count} pasos · revisa y aprueba",
|
|
1342
|
+
voiceBarPlanApprove: "aprobar",
|
|
1343
|
+
voiceBarPlanApproving: "en curso…",
|
|
1344
|
+
voiceBarPlanCancel: "cancelar",
|
|
1345
|
+
voiceBarPlanApproved: "aprobado",
|
|
1346
|
+
cardOpenLink: "Abrir",
|
|
1347
|
+
voiceBarCardOpen: "abrir",
|
|
1348
|
+
voiceBarCardCopy: "copiar",
|
|
1349
|
+
voiceBarCardCopied: "copiado",
|
|
1350
|
+
chatTabChat: "chat",
|
|
1351
|
+
chatTabAgenda: "agenda",
|
|
1352
|
+
chatPanelTitle: "Skippr IA",
|
|
1353
|
+
voiceBarSignInTitle: "Acceder",
|
|
1354
|
+
voiceBarTextMode: "Modo texto",
|
|
1355
|
+
sessionEndingSoon: "Sesión por terminar",
|
|
1356
|
+
controlBarTranscriptListening: "Escuchando…",
|
|
1357
|
+
tipStartLabel: "Iniciar",
|
|
1358
|
+
tipNextLabel: "Siguiente",
|
|
1359
|
+
voiceBarTipStart: "iniciar",
|
|
1360
|
+
buddyWakeGreeting: "¡hola!",
|
|
1361
|
+
buddyHoldHint: "mantén para hablar",
|
|
1362
|
+
buddyAutoOffNotice: "inactivo — cerrando…",
|
|
1363
|
+
attributionPrefix: "Con tecnología de",
|
|
1364
|
+
consentSessionStart: "Al iniciar una sesión, aceptas {terms} & {privacy} de Skippr",
|
|
1365
|
+
consentContinuing: "Al continuar, aceptas {terms} & {privacy}",
|
|
1366
|
+
consentAgentSessionStart: "Al iniciar la sesión de IA, aceptas {terms} & {privacy} de Skippr"
|
|
1367
|
+
},
|
|
1368
|
+
"pt-PT": {
|
|
1369
|
+
agendaTitle: "Agenda",
|
|
1370
|
+
agendaLoading: "À espera da agenda...",
|
|
1371
|
+
agendaProgress: "passo {step} de {total}",
|
|
1372
|
+
agendaProgressLabel: "Progresso da agenda",
|
|
1373
|
+
agendaNowBadge: "agora",
|
|
1374
|
+
micHoldToTalk: "Manter para falar",
|
|
1375
|
+
micReleaseToSend: "Largar para enviar",
|
|
1376
|
+
micTapToTalk: "Tocar para falar",
|
|
1377
|
+
micTapToSend: "Tocar para enviar",
|
|
1378
|
+
micShortcutHint: "Mantenha {key} tilde / acento grave para falar",
|
|
1379
|
+
voiceBarThinking: "a pensar…",
|
|
1380
|
+
voiceBarTalking: "a falar…",
|
|
1381
|
+
voiceBarListening: "a ouvir…",
|
|
1382
|
+
voiceBarPushToTalk: "manter para falar",
|
|
1383
|
+
voiceBarTapToTalk: "tocar para falar",
|
|
1384
|
+
voiceBarWorking: "a trabalhar…",
|
|
1385
|
+
voiceBarNoActivity: "Sem atividade — a fechar…",
|
|
1386
|
+
voiceBarLoading: "A carregar",
|
|
1387
|
+
voiceBarShortcutTalk: "falar",
|
|
1388
|
+
voiceBarShortcutEnd: "fim",
|
|
1389
|
+
voiceBarTalkToAgent: "Falar com a IA",
|
|
1390
|
+
openChatLabel: "Abrir o chat",
|
|
1391
|
+
closeChatLabel: "Fechar o chat",
|
|
1392
|
+
openAgentLabel: "Abrir o agente",
|
|
1393
|
+
showNotificationsLabel: "Mostrar as notificações",
|
|
1394
|
+
askLabel: "Pergunte-me o que quiser",
|
|
1395
|
+
wakeLabel: "Acordar o Buddy",
|
|
1396
|
+
dismissLabel: "Ignorar",
|
|
1397
|
+
loading: "A carregar...",
|
|
1398
|
+
endingSession: "A terminar a sessão...",
|
|
1399
|
+
loadingConversation: "A carregar a conversa...",
|
|
1400
|
+
statusStandingBy: "Em espera",
|
|
1401
|
+
statusObserving: "O Skippr observa",
|
|
1402
|
+
statusConnected: "O Skippr está ligado",
|
|
1403
|
+
statusTalking: "O Skippr fala",
|
|
1404
|
+
statusThinking: "O Skippr pensa",
|
|
1405
|
+
statusPaused: "Sessão em pausa",
|
|
1406
|
+
statusAriaStandingBy: "O Skippr está em espera — clique para abrir",
|
|
1407
|
+
statusAriaPaused: "Sessão em pausa — clique para abrir",
|
|
1408
|
+
statusAriaClickToOpenChat: "{status} — clique para abrir o chat",
|
|
1409
|
+
closeLabel: "Fechar",
|
|
1410
|
+
muteLabel: "Desativar o microfone",
|
|
1411
|
+
unmuteLabel: "Ativar o microfone",
|
|
1412
|
+
resumeLabel: "Retomar",
|
|
1413
|
+
stopLabel: "Parar",
|
|
1414
|
+
pauseLabel: "Pausa",
|
|
1415
|
+
endSessionLabel: "Terminar a sessão",
|
|
1416
|
+
shareScreenLabel: "Partilhar o ecrã",
|
|
1417
|
+
stopSharingScreenLabel: "Parar a partilha",
|
|
1418
|
+
stopActionsLabel: "Parar as ações",
|
|
1419
|
+
chatMessagePlaceholder: "Escreva uma mensagem…",
|
|
1420
|
+
chatMessageLabel: "Mensagem",
|
|
1421
|
+
chatSendMessageLabel: "Enviar a mensagem",
|
|
1422
|
+
chatSendLabel: "Enviar",
|
|
1423
|
+
chatEmptyConversation: "Ainda não há mensagens nesta conversa.",
|
|
1424
|
+
chatWaitingToBegin: "À espera do início da conversa...",
|
|
1425
|
+
chatJumpToLatest: "Ir para a mensagem mais recente",
|
|
1426
|
+
chatSwitchToVoice: "Mudar para voz",
|
|
1427
|
+
chatSwitchToText: "Mudar para texto",
|
|
1428
|
+
chatToggleVoice: "voz",
|
|
1429
|
+
chatToggleText: "texto",
|
|
1430
|
+
chatPanelLabel: "Painel",
|
|
1431
|
+
chatAnalyzingScreen: "O agente analisa o seu ecrã",
|
|
1432
|
+
cardDismissLink: "Ignorar a ligação",
|
|
1433
|
+
cardCopyLink: "Copiar ligação",
|
|
1434
|
+
cardCopied: "Copiado",
|
|
1435
|
+
cardDismissPlan: "Ignorar o plano",
|
|
1436
|
+
cardDismissSignIn: "Ignorar a autenticação",
|
|
1437
|
+
controlBarIdle: "Inativo",
|
|
1438
|
+
controlBarListening: "A ouvir",
|
|
1439
|
+
controlBarThinking: "A pensar",
|
|
1440
|
+
controlBarTalking: "A falar",
|
|
1441
|
+
controlBarWorking: "A trabalhar",
|
|
1442
|
+
controlBarStandingBy: "Em espera…",
|
|
1443
|
+
controlBarAriaActing: "O agente está a agir",
|
|
1444
|
+
controlBarAriaIdle: "O agente está inativo",
|
|
1445
|
+
controlBarAriaListening: "O agente está a ouvir",
|
|
1446
|
+
controlBarAriaThinking: "O agente está a pensar",
|
|
1447
|
+
controlBarAriaTalking: "O agente está a falar",
|
|
1448
|
+
controlBarAriaState: "O agente está {state}",
|
|
1449
|
+
controlBarOpenAgenda: "Abrir a agenda",
|
|
1450
|
+
controlBarClosePanel: "Fechar o painel",
|
|
1451
|
+
pausedClosingIn: "O agente fecha em",
|
|
1452
|
+
pausedClosingInAria: "O agente fecha em {seconds} segundos",
|
|
1453
|
+
loginTitle: "Inicie sessão para continuar",
|
|
1454
|
+
loginSubtitle: "O seu e-mail será usado para o identificar entre sessões",
|
|
1455
|
+
loginEmailLabel: "E-mail",
|
|
1456
|
+
loginEmailPlaceholder: "nome@exemplo.com",
|
|
1457
|
+
loginContinue: "Continuar",
|
|
1458
|
+
loginOtpTitle: "Introduza o código de verificação",
|
|
1459
|
+
loginOtpSubtitle: "Enviámos um código de 6 dígitos para {email}",
|
|
1460
|
+
loginOtpDigitLabel: "Dígito {index} do código de verificação",
|
|
1461
|
+
loginVerify: "Verificar",
|
|
1462
|
+
loginChangeEmail: "Alterar e-mail",
|
|
1463
|
+
loginResendCode: "Reenviar código",
|
|
1464
|
+
loginResendCooldown: "Reenviar em {seconds} s",
|
|
1465
|
+
loginConsent: "Ao continuar, aceita {terms} e {privacy}",
|
|
1466
|
+
actionClicking: "Clica…",
|
|
1467
|
+
actionTyping: "Escreve…",
|
|
1468
|
+
actionSelecting: "Seleciona…",
|
|
1469
|
+
actionScrolling: "Desloca…",
|
|
1470
|
+
actionHovering: "Aponta…",
|
|
1471
|
+
highlightDefaultLabel: "Clique aqui",
|
|
1472
|
+
planTitle: "Plano",
|
|
1473
|
+
planApprove: "Aprovar",
|
|
1474
|
+
planApproving: "Em curso…",
|
|
1475
|
+
planCancel: "Cancelar",
|
|
1476
|
+
voiceBarPlanIntro: "Este é o plano",
|
|
1477
|
+
voiceBarPlanStepsHint: "{count} passos · reveja e aprove",
|
|
1478
|
+
voiceBarPlanApprove: "aprovar",
|
|
1479
|
+
voiceBarPlanApproving: "em curso…",
|
|
1480
|
+
voiceBarPlanCancel: "cancelar",
|
|
1481
|
+
voiceBarPlanApproved: "aprovado",
|
|
1482
|
+
cardOpenLink: "Abrir",
|
|
1483
|
+
voiceBarCardOpen: "abrir",
|
|
1484
|
+
voiceBarCardCopy: "copiar",
|
|
1485
|
+
voiceBarCardCopied: "copiado",
|
|
1486
|
+
chatTabChat: "chat",
|
|
1487
|
+
chatTabAgenda: "agenda",
|
|
1488
|
+
chatPanelTitle: "Skippr IA",
|
|
1489
|
+
voiceBarSignInTitle: "Entrar",
|
|
1490
|
+
voiceBarTextMode: "Modo texto",
|
|
1491
|
+
sessionEndingSoon: "Sessão a terminar",
|
|
1492
|
+
controlBarTranscriptListening: "A ouvir…",
|
|
1493
|
+
tipStartLabel: "Iniciar",
|
|
1494
|
+
tipNextLabel: "Seguinte",
|
|
1495
|
+
voiceBarTipStart: "iniciar",
|
|
1496
|
+
buddyWakeGreeting: "oh, olá!",
|
|
1497
|
+
buddyHoldHint: "mantenha para falar",
|
|
1498
|
+
buddyAutoOffNotice: "inativo — a fechar…",
|
|
1499
|
+
attributionPrefix: "Fornecido por",
|
|
1500
|
+
consentSessionStart: "Ao iniciar uma sessão, aceita {terms} & {privacy} da Skippr",
|
|
1501
|
+
consentContinuing: "Ao continuar, aceita {terms} & {privacy}",
|
|
1502
|
+
consentAgentSessionStart: "Ao iniciar a sessão de IA, aceita {terms} & {privacy} da Skippr"
|
|
1503
|
+
},
|
|
1504
|
+
"pt-BR": {
|
|
1505
|
+
agendaTitle: "Agenda",
|
|
1506
|
+
agendaLoading: "Aguardando a agenda...",
|
|
1507
|
+
agendaProgress: "etapa {step} de {total}",
|
|
1508
|
+
agendaProgressLabel: "Progresso da agenda",
|
|
1509
|
+
agendaNowBadge: "agora",
|
|
1510
|
+
micHoldToTalk: "Segure para falar",
|
|
1511
|
+
micReleaseToSend: "Solte para enviar",
|
|
1512
|
+
micTapToTalk: "Toque para falar",
|
|
1513
|
+
micTapToSend: "Toque para enviar",
|
|
1514
|
+
micShortcutHint: "Mantenha {key} til / acento grave para falar",
|
|
1515
|
+
voiceBarThinking: "pensando…",
|
|
1516
|
+
voiceBarTalking: "falando…",
|
|
1517
|
+
voiceBarListening: "ouvindo…",
|
|
1518
|
+
voiceBarPushToTalk: "segure para falar",
|
|
1519
|
+
voiceBarTapToTalk: "toque para falar",
|
|
1520
|
+
voiceBarWorking: "trabalhando…",
|
|
1521
|
+
voiceBarNoActivity: "Sem atividade — encerrando…",
|
|
1522
|
+
voiceBarLoading: "Carregando",
|
|
1523
|
+
voiceBarShortcutTalk: "falar",
|
|
1524
|
+
voiceBarShortcutEnd: "fim",
|
|
1525
|
+
voiceBarTalkToAgent: "Falar com a IA",
|
|
1526
|
+
openChatLabel: "Abrir o chat",
|
|
1527
|
+
closeChatLabel: "Fechar o chat",
|
|
1528
|
+
openAgentLabel: "Abrir o agente",
|
|
1529
|
+
showNotificationsLabel: "Mostrar as notificações",
|
|
1530
|
+
askLabel: "Pergunte-me qualquer coisa",
|
|
1531
|
+
wakeLabel: "Acordar o Buddy",
|
|
1532
|
+
dismissLabel: "Dispensar",
|
|
1533
|
+
loading: "Carregando...",
|
|
1534
|
+
endingSession: "Encerrando a sessão...",
|
|
1535
|
+
loadingConversation: "Carregando a conversa...",
|
|
1536
|
+
statusStandingBy: "Em espera",
|
|
1537
|
+
statusObserving: "O Skippr observa",
|
|
1538
|
+
statusConnected: "O Skippr está conectado",
|
|
1539
|
+
statusTalking: "O Skippr fala",
|
|
1540
|
+
statusThinking: "O Skippr pensa",
|
|
1541
|
+
statusPaused: "Sessão pausada",
|
|
1542
|
+
statusAriaStandingBy: "O Skippr está em espera — clique para abrir",
|
|
1543
|
+
statusAriaPaused: "Sessão pausada — clique para abrir",
|
|
1544
|
+
statusAriaClickToOpenChat: "{status} — clique para abrir o chat",
|
|
1545
|
+
closeLabel: "Fechar",
|
|
1546
|
+
muteLabel: "Desativar o microfone",
|
|
1547
|
+
unmuteLabel: "Ativar o microfone",
|
|
1548
|
+
resumeLabel: "Retomar",
|
|
1549
|
+
stopLabel: "Parar",
|
|
1550
|
+
pauseLabel: "Pausar",
|
|
1551
|
+
endSessionLabel: "Encerrar a sessão",
|
|
1552
|
+
shareScreenLabel: "Compartilhar a tela",
|
|
1553
|
+
stopSharingScreenLabel: "Parar o compartilhamento",
|
|
1554
|
+
stopActionsLabel: "Parar as ações",
|
|
1555
|
+
chatMessagePlaceholder: "Escreva uma mensagem…",
|
|
1556
|
+
chatMessageLabel: "Mensagem",
|
|
1557
|
+
chatSendMessageLabel: "Enviar a mensagem",
|
|
1558
|
+
chatSendLabel: "Enviar",
|
|
1559
|
+
chatEmptyConversation: "Ainda não há mensagens nesta conversa.",
|
|
1560
|
+
chatWaitingToBegin: "Aguardando o início da conversa...",
|
|
1561
|
+
chatJumpToLatest: "Ir para a mensagem mais recente",
|
|
1562
|
+
chatSwitchToVoice: "Mudar para voz",
|
|
1563
|
+
chatSwitchToText: "Mudar para texto",
|
|
1564
|
+
chatToggleVoice: "voz",
|
|
1565
|
+
chatToggleText: "texto",
|
|
1566
|
+
chatPanelLabel: "Painel",
|
|
1567
|
+
chatAnalyzingScreen: "O agente analisa a sua tela",
|
|
1568
|
+
cardDismissLink: "Dispensar o link",
|
|
1569
|
+
cardCopyLink: "Copiar link",
|
|
1570
|
+
cardCopied: "Copiado",
|
|
1571
|
+
cardDismissPlan: "Dispensar o plano",
|
|
1572
|
+
cardDismissSignIn: "Dispensar o login",
|
|
1573
|
+
controlBarIdle: "Inativo",
|
|
1574
|
+
controlBarListening: "Ouvindo",
|
|
1575
|
+
controlBarThinking: "Pensando",
|
|
1576
|
+
controlBarTalking: "Falando",
|
|
1577
|
+
controlBarWorking: "Trabalhando",
|
|
1578
|
+
controlBarStandingBy: "Em espera…",
|
|
1579
|
+
controlBarAriaActing: "O agente está agindo",
|
|
1580
|
+
controlBarAriaIdle: "O agente está inativo",
|
|
1581
|
+
controlBarAriaListening: "O agente está ouvindo",
|
|
1582
|
+
controlBarAriaThinking: "O agente está pensando",
|
|
1583
|
+
controlBarAriaTalking: "O agente está falando",
|
|
1584
|
+
controlBarAriaState: "O agente está {state}",
|
|
1585
|
+
controlBarOpenAgenda: "Abrir a agenda",
|
|
1586
|
+
controlBarClosePanel: "Fechar o painel",
|
|
1587
|
+
pausedClosingIn: "O agente encerra em",
|
|
1588
|
+
pausedClosingInAria: "O agente encerra em {seconds} segundos",
|
|
1589
|
+
loginTitle: "Faça login para continuar",
|
|
1590
|
+
loginSubtitle: "Seu e-mail será usado para identificar você entre sessões",
|
|
1591
|
+
loginEmailLabel: "E-mail",
|
|
1592
|
+
loginEmailPlaceholder: "nome@exemplo.com",
|
|
1593
|
+
loginContinue: "Continuar",
|
|
1594
|
+
loginOtpTitle: "Digite o código de verificação",
|
|
1595
|
+
loginOtpSubtitle: "Enviamos um código de 6 dígitos para {email}",
|
|
1596
|
+
loginOtpDigitLabel: "Dígito {index} do código de verificação",
|
|
1597
|
+
loginVerify: "Verificar",
|
|
1598
|
+
loginChangeEmail: "Alterar e-mail",
|
|
1599
|
+
loginResendCode: "Reenviar código",
|
|
1600
|
+
loginResendCooldown: "Reenviar em {seconds} s",
|
|
1601
|
+
loginConsent: "Ao continuar, você aceita {terms} e {privacy}",
|
|
1602
|
+
actionClicking: "Clica…",
|
|
1603
|
+
actionTyping: "Digita…",
|
|
1604
|
+
actionSelecting: "Seleciona…",
|
|
1605
|
+
actionScrolling: "Rola…",
|
|
1606
|
+
actionHovering: "Aponta…",
|
|
1607
|
+
highlightDefaultLabel: "Clique aqui",
|
|
1608
|
+
planTitle: "Plano",
|
|
1609
|
+
planApprove: "Aprovar",
|
|
1610
|
+
planApproving: "Em curso…",
|
|
1611
|
+
planCancel: "Cancelar",
|
|
1612
|
+
voiceBarPlanIntro: "Este é o plano",
|
|
1613
|
+
voiceBarPlanStepsHint: "{count} etapas · revise e aprove",
|
|
1614
|
+
voiceBarPlanApprove: "aprovar",
|
|
1615
|
+
voiceBarPlanApproving: "em curso…",
|
|
1616
|
+
voiceBarPlanCancel: "cancelar",
|
|
1617
|
+
voiceBarPlanApproved: "aprovado",
|
|
1618
|
+
cardOpenLink: "Abrir",
|
|
1619
|
+
voiceBarCardOpen: "abrir",
|
|
1620
|
+
voiceBarCardCopy: "copiar",
|
|
1621
|
+
voiceBarCardCopied: "copiado",
|
|
1622
|
+
chatTabChat: "chat",
|
|
1623
|
+
chatTabAgenda: "agenda",
|
|
1624
|
+
chatPanelTitle: "Skippr IA",
|
|
1625
|
+
voiceBarSignInTitle: "Entrar",
|
|
1626
|
+
voiceBarTextMode: "Modo texto",
|
|
1627
|
+
sessionEndingSoon: "Sessão terminando",
|
|
1628
|
+
controlBarTranscriptListening: "Ouvindo…",
|
|
1629
|
+
tipStartLabel: "Iniciar",
|
|
1630
|
+
tipNextLabel: "Próximo",
|
|
1631
|
+
voiceBarTipStart: "iniciar",
|
|
1632
|
+
buddyWakeGreeting: "oh, olá!",
|
|
1633
|
+
buddyHoldHint: "segure para falar",
|
|
1634
|
+
buddyAutoOffNotice: "inativo — fechando…",
|
|
1635
|
+
attributionPrefix: "Com tecnologia de",
|
|
1636
|
+
consentSessionStart: "Ao iniciar uma sessão, você aceita {terms} & {privacy} da Skippr",
|
|
1637
|
+
consentContinuing: "Ao continuar, você aceita {terms} & {privacy}",
|
|
1638
|
+
consentAgentSessionStart: "Ao iniciar a sessão de IA, você aceita {terms} & {privacy} da Skippr"
|
|
1639
|
+
}
|
|
1640
|
+
};
|
|
1641
|
+
var resolveChromeCopy = createLocaleCopyResolver(CHROME_COPY_DEFAULTS, CHROME_COPY_TRANSLATIONS);
|
|
1642
|
+
|
|
1643
|
+
// src/hooks/useChromeCopy.ts
|
|
1644
|
+
function useChromeCopy() {
|
|
1645
|
+
const ctx = useContext2(LiveAgentContext);
|
|
1646
|
+
return resolveChromeCopy(ctx?.locale);
|
|
1647
|
+
}
|
|
1648
|
+
|
|
654
1649
|
// src/components/LoginFlow.tsx
|
|
655
1650
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
656
1651
|
|
|
@@ -723,6 +1718,9 @@ function LoginFlow({ requestOtp, verifyOtp, error, isSubmitting }) {
|
|
|
723
1718
|
});
|
|
724
1719
|
}
|
|
725
1720
|
function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
|
|
1721
|
+
const copy = useChromeCopy();
|
|
1722
|
+
const [consentBeforeTerms, consentAfterTerms] = splitOnPlaceholder(copy.loginConsent, "terms");
|
|
1723
|
+
const [consentBetweenLinks, consentAfterPrivacy] = splitOnPlaceholder(consentAfterTerms, "privacy");
|
|
726
1724
|
function handleSubmit(e) {
|
|
727
1725
|
e.preventDefault();
|
|
728
1726
|
if (email.trim())
|
|
@@ -739,11 +1737,11 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
|
|
|
739
1737
|
}),
|
|
740
1738
|
/* @__PURE__ */ jsx4("p", {
|
|
741
1739
|
className: "skippr:text-sm skippr:font-medium skippr:text-foreground",
|
|
742
|
-
children:
|
|
1740
|
+
children: copy.loginTitle
|
|
743
1741
|
}),
|
|
744
1742
|
/* @__PURE__ */ jsx4("p", {
|
|
745
1743
|
className: "skippr:mt-1 skippr:text-xs skippr:text-muted-foreground",
|
|
746
|
-
children:
|
|
1744
|
+
children: copy.loginSubtitle
|
|
747
1745
|
})
|
|
748
1746
|
]
|
|
749
1747
|
}),
|
|
@@ -753,8 +1751,8 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
|
|
|
753
1751
|
children: [
|
|
754
1752
|
/* @__PURE__ */ jsx4("input", {
|
|
755
1753
|
type: "email",
|
|
756
|
-
"aria-label":
|
|
757
|
-
placeholder:
|
|
1754
|
+
"aria-label": copy.loginEmailLabel,
|
|
1755
|
+
placeholder: copy.loginEmailPlaceholder,
|
|
758
1756
|
value: email,
|
|
759
1757
|
onChange: (e) => onEmailChange(e.target.value),
|
|
760
1758
|
disabled: isSubmitting,
|
|
@@ -767,7 +1765,7 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
|
|
|
767
1765
|
className: "skippr:w-full",
|
|
768
1766
|
children: isSubmitting ? /* @__PURE__ */ jsx4(LoaderCircle, {
|
|
769
1767
|
className: "skippr:size-4 skippr:animate-spin"
|
|
770
|
-
}) :
|
|
1768
|
+
}) : copy.loginContinue
|
|
771
1769
|
}),
|
|
772
1770
|
error && /* @__PURE__ */ jsx4("p", {
|
|
773
1771
|
role: "alert",
|
|
@@ -777,8 +1775,7 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
|
|
|
777
1775
|
/* @__PURE__ */ jsxs("p", {
|
|
778
1776
|
className: "skippr:text-[11px] skippr:leading-relaxed skippr:text-muted-foreground skippr:text-center",
|
|
779
1777
|
children: [
|
|
780
|
-
|
|
781
|
-
" ",
|
|
1778
|
+
consentBeforeTerms,
|
|
782
1779
|
/* @__PURE__ */ jsx4("a", {
|
|
783
1780
|
href: "https://www.skippr.ai/terms",
|
|
784
1781
|
target: "_blank",
|
|
@@ -786,16 +1783,15 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
|
|
|
786
1783
|
className: "skippr:underline skippr:underline-offset-2 skippr:hover:text-foreground",
|
|
787
1784
|
children: "Terms of Service"
|
|
788
1785
|
}),
|
|
789
|
-
|
|
790
|
-
"and",
|
|
791
|
-
" ",
|
|
1786
|
+
consentBetweenLinks,
|
|
792
1787
|
/* @__PURE__ */ jsx4("a", {
|
|
793
1788
|
href: "https://www.skippr.ai/privacy",
|
|
794
1789
|
target: "_blank",
|
|
795
1790
|
rel: "noopener noreferrer",
|
|
796
1791
|
className: "skippr:underline skippr:underline-offset-2 skippr:hover:text-foreground",
|
|
797
1792
|
children: "Privacy Policy"
|
|
798
|
-
})
|
|
1793
|
+
}),
|
|
1794
|
+
consentAfterPrivacy
|
|
799
1795
|
]
|
|
800
1796
|
})
|
|
801
1797
|
]
|
|
@@ -804,6 +1800,8 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
|
|
|
804
1800
|
});
|
|
805
1801
|
}
|
|
806
1802
|
function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
1803
|
+
const copy = useChromeCopy();
|
|
1804
|
+
const [otpSubtitleBefore, otpSubtitleAfter] = splitOnPlaceholder(copy.loginOtpSubtitle, "email");
|
|
807
1805
|
const [digits, setDigits] = useState(Array(OTP_LENGTH).fill(""));
|
|
808
1806
|
const [resendCooldown, setResendCooldown] = useState(0);
|
|
809
1807
|
const inputRefs = useRef([]);
|
|
@@ -882,17 +1880,17 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
|
882
1880
|
children: [
|
|
883
1881
|
/* @__PURE__ */ jsx4("p", {
|
|
884
1882
|
className: "skippr:text-sm skippr:font-medium skippr:text-foreground",
|
|
885
|
-
children:
|
|
1883
|
+
children: copy.loginOtpTitle
|
|
886
1884
|
}),
|
|
887
1885
|
/* @__PURE__ */ jsxs("p", {
|
|
888
1886
|
className: "skippr:mt-1 skippr:text-xs skippr:text-muted-foreground",
|
|
889
1887
|
children: [
|
|
890
|
-
|
|
891
|
-
" ",
|
|
1888
|
+
otpSubtitleBefore,
|
|
892
1889
|
/* @__PURE__ */ jsx4("span", {
|
|
893
1890
|
className: "skippr:font-medium skippr:text-foreground",
|
|
894
1891
|
children: email
|
|
895
|
-
})
|
|
1892
|
+
}),
|
|
1893
|
+
otpSubtitleAfter
|
|
896
1894
|
]
|
|
897
1895
|
})
|
|
898
1896
|
]
|
|
@@ -908,7 +1906,7 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
|
908
1906
|
inputRefs.current[index2] = el;
|
|
909
1907
|
},
|
|
910
1908
|
type: "text",
|
|
911
|
-
"aria-label":
|
|
1909
|
+
"aria-label": fillPlaceholders(copy.loginOtpDigitLabel, { index: index2 + 1 }),
|
|
912
1910
|
inputMode: "numeric",
|
|
913
1911
|
maxLength: 1,
|
|
914
1912
|
value: digit,
|
|
@@ -930,7 +1928,7 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
|
930
1928
|
className: "skippr:w-full",
|
|
931
1929
|
children: isSubmitting ? /* @__PURE__ */ jsx4(LoaderCircle, {
|
|
932
1930
|
className: "skippr:size-4 skippr:animate-spin"
|
|
933
|
-
}) :
|
|
1931
|
+
}) : copy.loginVerify
|
|
934
1932
|
}),
|
|
935
1933
|
/* @__PURE__ */ jsxs("div", {
|
|
936
1934
|
className: "skippr:flex skippr:items-center skippr:justify-between skippr:text-xs",
|
|
@@ -940,14 +1938,14 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
|
940
1938
|
onClick: onBack,
|
|
941
1939
|
disabled: isSubmitting,
|
|
942
1940
|
className: "skippr:text-muted-foreground skippr:hover:text-foreground skippr:transition-colors skippr:disabled:opacity-50",
|
|
943
|
-
children:
|
|
1941
|
+
children: copy.loginChangeEmail
|
|
944
1942
|
}),
|
|
945
1943
|
/* @__PURE__ */ jsx4("button", {
|
|
946
1944
|
type: "button",
|
|
947
1945
|
onClick: handleResend,
|
|
948
1946
|
disabled: isSubmitting || resendCooldown > 0,
|
|
949
1947
|
className: "skippr:text-primary skippr:hover:opacity-80 skippr:transition-opacity skippr:disabled:opacity-50",
|
|
950
|
-
children: resendCooldown > 0 ?
|
|
1948
|
+
children: resendCooldown > 0 ? fillPlaceholders(copy.loginResendCooldown, { seconds: resendCooldown }) : copy.loginResendCode
|
|
951
1949
|
})
|
|
952
1950
|
]
|
|
953
1951
|
})
|
|
@@ -960,7 +1958,8 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
|
960
1958
|
// src/components/VoiceBarLoginCard.tsx
|
|
961
1959
|
import { jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
962
1960
|
function VoiceBarLoginCard({ onDismiss }) {
|
|
963
|
-
const
|
|
1961
|
+
const copy = useChromeCopy();
|
|
1962
|
+
const ctx = useContext3(LiveAgentContext);
|
|
964
1963
|
if (!ctx) {
|
|
965
1964
|
throw new Error("VoiceBarLoginCard must be used within a <LiveAgent> provider");
|
|
966
1965
|
}
|
|
@@ -973,12 +1972,12 @@ function VoiceBarLoginCard({ onDismiss }) {
|
|
|
973
1972
|
children: [
|
|
974
1973
|
/* @__PURE__ */ jsx5("span", {
|
|
975
1974
|
className: "skippr:text-[11px] skippr:font-semibold skippr:tracking-[-0.01em] skippr:text-[#2D2D3F]",
|
|
976
|
-
children:
|
|
1975
|
+
children: copy.voiceBarSignInTitle
|
|
977
1976
|
}),
|
|
978
1977
|
/* @__PURE__ */ jsx5("button", {
|
|
979
1978
|
type: "button",
|
|
980
1979
|
onClick: onDismiss,
|
|
981
|
-
"aria-label":
|
|
1980
|
+
"aria-label": copy.cardDismissSignIn,
|
|
982
1981
|
className: "skippr:flex skippr:size-[20px] skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:text-[#b8b4ac] skippr:transition-colors skippr:hover:bg-[#f2f0eb] skippr:hover:text-[#2D2D3F]",
|
|
983
1982
|
children: /* @__PURE__ */ jsx5(X, {
|
|
984
1983
|
className: "skippr:size-[12px]",
|
|
@@ -1333,17 +2332,7 @@ var ERROR_COPY_TRANSLATIONS = {
|
|
|
1333
2332
|
authFailedHint: "Entre em contato com o administrador."
|
|
1334
2333
|
}
|
|
1335
2334
|
};
|
|
1336
|
-
var
|
|
1337
|
-
function copyForLocale(tag) {
|
|
1338
|
-
if (!tag)
|
|
1339
|
-
return ERROR_COPY_DEFAULTS;
|
|
1340
|
-
const [language, region] = tag.trim().split("-");
|
|
1341
|
-
if (!language)
|
|
1342
|
-
return ERROR_COPY_DEFAULTS;
|
|
1343
|
-
const bare = language.toLowerCase();
|
|
1344
|
-
const exact = region ? `${bare}-${region.toUpperCase()}` : bare;
|
|
1345
|
-
return ERROR_COPY_BY_LOCALE.get(exact) ?? ERROR_COPY_BY_LOCALE.get(bare) ?? (bare === "pt" ? ERROR_COPY_BY_LOCALE.get("pt-PT") : undefined) ?? ERROR_COPY_DEFAULTS;
|
|
1346
|
-
}
|
|
2335
|
+
var copyForLocale = createLocaleCopyResolver(ERROR_COPY_DEFAULTS, ERROR_COPY_TRANSLATIONS);
|
|
1347
2336
|
function resolveAuthFailedCopy(locale) {
|
|
1348
2337
|
const copy = copyForLocale(locale);
|
|
1349
2338
|
return { title: copy.authFailedTitle, hint: copy.authFailedHint };
|
|
@@ -2963,13 +3952,13 @@ var FOCUS_RING = {
|
|
|
2963
3952
|
outlineOffset: "3px",
|
|
2964
3953
|
borderRadius: "9999px"
|
|
2965
3954
|
};
|
|
2966
|
-
function stateTip(state, isCapturingSpeech) {
|
|
3955
|
+
function stateTip(state, isCapturingSpeech, copy) {
|
|
2967
3956
|
if (state === "speaking")
|
|
2968
|
-
return
|
|
3957
|
+
return copy.voiceBarTalking;
|
|
2969
3958
|
if (state === "thinking")
|
|
2970
|
-
return
|
|
3959
|
+
return copy.voiceBarThinking;
|
|
2971
3960
|
if (isCapturingSpeech)
|
|
2972
|
-
return
|
|
3961
|
+
return copy.voiceBarListening;
|
|
2973
3962
|
return null;
|
|
2974
3963
|
}
|
|
2975
3964
|
function edgeWrapperStyle(pos) {
|
|
@@ -3039,7 +4028,7 @@ function BuddyLoadingDots() {
|
|
|
3039
4028
|
});
|
|
3040
4029
|
}
|
|
3041
4030
|
function BuddyVoiceBar({ revealed }) {
|
|
3042
|
-
const ctx =
|
|
4031
|
+
const ctx = useContext4(LiveAgentContext);
|
|
3043
4032
|
if (!ctx) {
|
|
3044
4033
|
throw new Error("BuddyVoiceBar must be used within a <LiveAgent> provider");
|
|
3045
4034
|
}
|
|
@@ -3062,6 +4051,7 @@ function BuddyVoiceBar({ revealed }) {
|
|
|
3062
4051
|
locale
|
|
3063
4052
|
} = ctx;
|
|
3064
4053
|
const needsLogin = !usesHostAuth && !isAuthenticated;
|
|
4054
|
+
const copy = useChromeCopy();
|
|
3065
4055
|
const transientError = useTransientError(error, errorSeq);
|
|
3066
4056
|
const authFailedCopy = authFailed ? resolveAuthFailedCopy(locale) : null;
|
|
3067
4057
|
const [loginOpen, setLoginOpen] = useState8(false);
|
|
@@ -3219,7 +4209,7 @@ function BuddyVoiceBar({ revealed }) {
|
|
|
3219
4209
|
return null;
|
|
3220
4210
|
const isStandingBy = isStarting && !isConnected;
|
|
3221
4211
|
const isTalking = isSpeaking || showWakeBubble || isStarting;
|
|
3222
|
-
const tip = stateTip(state, voiceTurn.isCapturingSpeech);
|
|
4212
|
+
const tip = stateTip(state, voiceTurn.isCapturingSpeech, copy);
|
|
3223
4213
|
const activeWrapperStyle = {
|
|
3224
4214
|
position: "fixed",
|
|
3225
4215
|
left: pos.x,
|
|
@@ -3239,7 +4229,7 @@ function BuddyVoiceBar({ revealed }) {
|
|
|
3239
4229
|
/* @__PURE__ */ jsx14("button", {
|
|
3240
4230
|
type: "button",
|
|
3241
4231
|
onPointerDown: holdToTalk,
|
|
3242
|
-
"aria-label":
|
|
4232
|
+
"aria-label": copy.micHoldToTalk,
|
|
3243
4233
|
"aria-pressed": voiceTurn.isCapturingSpeech,
|
|
3244
4234
|
onFocus: (event) => setKeyboardFocus(event.target.matches(":focus-visible")),
|
|
3245
4235
|
onBlur: () => setKeyboardFocus(false),
|
|
@@ -3270,8 +4260,8 @@ function BuddyVoiceBar({ revealed }) {
|
|
|
3270
4260
|
onClick: () => void disconnect(),
|
|
3271
4261
|
disabled: isDisconnecting,
|
|
3272
4262
|
"aria-busy": isDisconnecting,
|
|
3273
|
-
"aria-label":
|
|
3274
|
-
title:
|
|
4263
|
+
"aria-label": copy.closeLabel,
|
|
4264
|
+
title: copy.closeLabel,
|
|
3275
4265
|
className: `skippr:absolute skippr:-right-1 skippr:-top-1 skippr:flex skippr:h-6 skippr:w-6 skippr:items-center skippr:justify-center skippr:rounded-full skippr:text-[#5c5850] ${isDisconnecting ? "skippr:cursor-default" : "skippr:cursor-pointer skippr:bg-white/80 skippr:shadow-[0_2px_6px_rgba(45,45,63,0.14)] skippr:hover:text-[#2D2D3F]"}`,
|
|
3276
4266
|
children: /* @__PURE__ */ jsxs10("span", {
|
|
3277
4267
|
className: "skippr:relative skippr:flex skippr:size-5 skippr:items-center skippr:justify-center",
|
|
@@ -3316,14 +4306,14 @@ function BuddyVoiceBar({ revealed }) {
|
|
|
3316
4306
|
role: "status",
|
|
3317
4307
|
children: [
|
|
3318
4308
|
/* @__PURE__ */ jsx14("span", {
|
|
3319
|
-
children:
|
|
4309
|
+
children: copy.buddyWakeGreeting
|
|
3320
4310
|
}),
|
|
3321
4311
|
isStandingBy && /* @__PURE__ */ jsx14(BuddyLoadingDots, {})
|
|
3322
4312
|
]
|
|
3323
4313
|
}) : autoOffNotice ? /* @__PURE__ */ jsx14("div", {
|
|
3324
4314
|
className: "skippr:absolute skippr:-top-6 skippr:left-1/2 skippr:-translate-x-1/2 skippr:whitespace-nowrap skippr:text-[10.5px] skippr:font-medium skippr:text-[#8b877f]",
|
|
3325
4315
|
role: "status",
|
|
3326
|
-
children:
|
|
4316
|
+
children: copy.buddyAutoOffNotice
|
|
3327
4317
|
}) : tip ? /* @__PURE__ */ jsx14("div", {
|
|
3328
4318
|
className: "skippr:absolute skippr:-top-8 skippr:left-1/2 skippr:-translate-x-1/2 skippr:whitespace-nowrap skippr:rounded-full skippr:bg-white skippr:px-3 skippr:py-1 skippr:text-[11px] skippr:font-medium skippr:text-[#2D2D3F] skippr:shadow-[0_6px_16px_rgba(45,45,63,0.14)]",
|
|
3329
4319
|
role: "status",
|
|
@@ -3331,7 +4321,7 @@ function BuddyVoiceBar({ revealed }) {
|
|
|
3331
4321
|
}) : !holdHintSeen && !isTalking && /* @__PURE__ */ jsx14("div", {
|
|
3332
4322
|
className: "skippr:absolute skippr:-top-8 skippr:left-1/2 skippr:-translate-x-1/2 skippr:whitespace-nowrap skippr:rounded-full skippr:bg-white skippr:px-3 skippr:py-1 skippr:text-[11px] skippr:font-medium skippr:text-[#2D2D3F] skippr:shadow-[0_6px_16px_rgba(45,45,63,0.14)]",
|
|
3333
4323
|
role: "status",
|
|
3334
|
-
children:
|
|
4324
|
+
children: copy.buddyHoldHint
|
|
3335
4325
|
})
|
|
3336
4326
|
]
|
|
3337
4327
|
}) : /* @__PURE__ */ jsxs10("div", {
|
|
@@ -3347,7 +4337,7 @@ function BuddyVoiceBar({ revealed }) {
|
|
|
3347
4337
|
containerRef.current = node;
|
|
3348
4338
|
},
|
|
3349
4339
|
type: "button",
|
|
3350
|
-
"aria-label":
|
|
4340
|
+
"aria-label": copy.wakeLabel,
|
|
3351
4341
|
onPointerMove: () => {
|
|
3352
4342
|
if (mode === BUDDY_MODE.Sleep)
|
|
3353
4343
|
reportHover();
|
|
@@ -3412,7 +4402,7 @@ function BuddyVoiceBar({ revealed }) {
|
|
|
3412
4402
|
children: modulesError || transientError
|
|
3413
4403
|
})
|
|
3414
4404
|
}) : isIdleLauncherHovered && !loginOpen && /* @__PURE__ */ jsx14(ConsentBubble, {
|
|
3415
|
-
template:
|
|
4405
|
+
template: copy.consentAgentSessionStart,
|
|
3416
4406
|
className: "skippr:absolute skippr:bottom-[calc(100%+8px)] skippr:w-[150px]",
|
|
3417
4407
|
style: bubbleAnchorStyle(edgeDrag.pos.edge)
|
|
3418
4408
|
})
|
|
@@ -3469,12 +4459,12 @@ function useAgentCursor() {
|
|
|
3469
4459
|
}
|
|
3470
4460
|
|
|
3471
4461
|
// src/context/SessionHoldContext.tsx
|
|
3472
|
-
import { createContext as createContext3, useContext as
|
|
4462
|
+
import { createContext as createContext3, useContext as useContext6 } from "react";
|
|
3473
4463
|
|
|
3474
4464
|
// src/hooks/useLiveAgent.ts
|
|
3475
|
-
import { useContext as
|
|
4465
|
+
import { useContext as useContext5 } from "react";
|
|
3476
4466
|
function useLiveAgent() {
|
|
3477
|
-
const ctx =
|
|
4467
|
+
const ctx = useContext5(LiveAgentContext);
|
|
3478
4468
|
if (!ctx) {
|
|
3479
4469
|
throw new Error("useLiveAgent must be used within a <LiveAgent> provider");
|
|
3480
4470
|
}
|
|
@@ -3797,7 +4787,7 @@ var SessionHoldContext = createContext3({
|
|
|
3797
4787
|
});
|
|
3798
4788
|
function SessionHoldProvider({ children }) {
|
|
3799
4789
|
const { pauseSession } = useLiveAgent();
|
|
3800
|
-
const internalCtx =
|
|
4790
|
+
const internalCtx = useContext6(LiveAgentContext);
|
|
3801
4791
|
if (!internalCtx) {
|
|
3802
4792
|
throw new Error("SessionHoldProvider must be used within a <LiveAgent> provider");
|
|
3803
4793
|
}
|
|
@@ -3812,12 +4802,12 @@ function SessionHoldProvider({ children }) {
|
|
|
3812
4802
|
});
|
|
3813
4803
|
}
|
|
3814
4804
|
function useSessionHoldContext() {
|
|
3815
|
-
return
|
|
4805
|
+
return useContext6(SessionHoldContext);
|
|
3816
4806
|
}
|
|
3817
4807
|
|
|
3818
4808
|
// src/context/TranscriptionsContext.tsx
|
|
3819
4809
|
import { useTranscriptions } from "@livekit/components-react/hooks";
|
|
3820
|
-
import { createContext as createContext4, useContext as
|
|
4810
|
+
import { createContext as createContext4, useContext as useContext7 } from "react";
|
|
3821
4811
|
import { jsx as jsx16 } from "react/jsx-runtime";
|
|
3822
4812
|
var TranscriptionsContext = createContext4([]);
|
|
3823
4813
|
function TranscriptionsProvider({ children }) {
|
|
@@ -3828,11 +4818,11 @@ function TranscriptionsProvider({ children }) {
|
|
|
3828
4818
|
});
|
|
3829
4819
|
}
|
|
3830
4820
|
function useSharedTranscriptions() {
|
|
3831
|
-
return
|
|
4821
|
+
return useContext7(TranscriptionsContext);
|
|
3832
4822
|
}
|
|
3833
4823
|
|
|
3834
4824
|
// src/context/VoiceTurnContext.tsx
|
|
3835
|
-
import { createContext as createContext5, useContext as
|
|
4825
|
+
import { createContext as createContext5, useContext as useContext8 } from "react";
|
|
3836
4826
|
import { jsx as jsx17 } from "react/jsx-runtime";
|
|
3837
4827
|
var VoiceTurnContext = createContext5({
|
|
3838
4828
|
isCapturingSpeech: false,
|
|
@@ -3848,7 +4838,7 @@ function VoiceTurnProvider({ children }) {
|
|
|
3848
4838
|
});
|
|
3849
4839
|
}
|
|
3850
4840
|
function useVoiceTurnContext() {
|
|
3851
|
-
return
|
|
4841
|
+
return useContext8(VoiceTurnContext);
|
|
3852
4842
|
}
|
|
3853
4843
|
|
|
3854
4844
|
// src/hooks/useAdoptionGoals.ts
|
|
@@ -4365,17 +5355,60 @@ function useOnceTrue(value) {
|
|
|
4365
5355
|
return latched;
|
|
4366
5356
|
}
|
|
4367
5357
|
|
|
5358
|
+
// src/hooks/usePhaseLabels.ts
|
|
5359
|
+
import { useEffect as useEffect18, useMemo as useMemo4, useRef as useRef14, useState as useState15 } from "react";
|
|
5360
|
+
var NO_LABELS = { agentId: null, byPhaseName: {} };
|
|
5361
|
+
function localeIndependentSignature(read) {
|
|
5362
|
+
return JSON.stringify([
|
|
5363
|
+
read.agentId,
|
|
5364
|
+
read.agentName ?? null,
|
|
5365
|
+
read.nameTranslations ?? null,
|
|
5366
|
+
read.phases.map((phase) => [phase.name, phase.translations ?? null])
|
|
5367
|
+
]);
|
|
5368
|
+
}
|
|
5369
|
+
function usableRead(read) {
|
|
5370
|
+
return read && read.phases.length > 0 ? read : null;
|
|
5371
|
+
}
|
|
5372
|
+
function usePhaseLabels(session, { agentId: idleAgentId, phases: idlePhases }, locale) {
|
|
5373
|
+
const [held, setHeld] = useState15(null);
|
|
5374
|
+
const heldSignature = useRef14("");
|
|
5375
|
+
useEffect18(() => {
|
|
5376
|
+
const read = usableRead(session) ?? usableRead({ agentId: idleAgentId, phases: idlePhases });
|
|
5377
|
+
if (!read)
|
|
5378
|
+
return;
|
|
5379
|
+
const signature = localeIndependentSignature(read);
|
|
5380
|
+
if (signature === heldSignature.current)
|
|
5381
|
+
return;
|
|
5382
|
+
heldSignature.current = signature;
|
|
5383
|
+
setHeld(read);
|
|
5384
|
+
}, [session, idleAgentId, idlePhases]);
|
|
5385
|
+
return useMemo4(() => {
|
|
5386
|
+
if (!held)
|
|
5387
|
+
return NO_LABELS;
|
|
5388
|
+
const matched = matchTranslatedLocale(locale);
|
|
5389
|
+
const byPhaseName = {};
|
|
5390
|
+
for (const phase of held.phases) {
|
|
5391
|
+
byPhaseName[phase.name] = (matched && phase.translations?.[matched]?.name) ?? phase.name;
|
|
5392
|
+
}
|
|
5393
|
+
return {
|
|
5394
|
+
agentId: held.agentId,
|
|
5395
|
+
agentName: held.agentName ? (matched && held.nameTranslations?.[matched]) ?? held.agentName : undefined,
|
|
5396
|
+
byPhaseName
|
|
5397
|
+
};
|
|
5398
|
+
}, [held, locale]);
|
|
5399
|
+
}
|
|
5400
|
+
|
|
4368
5401
|
// src/hooks/usePlanUpdates.ts
|
|
4369
5402
|
import { useRemoteParticipants as useRemoteParticipants2 } from "@livekit/components-react/hooks";
|
|
4370
5403
|
import { useCallback as useCallback14 } from "react";
|
|
4371
5404
|
|
|
4372
5405
|
// src/hooks/useAgentState.ts
|
|
4373
5406
|
import { useRemoteParticipants } from "@livekit/components-react/hooks";
|
|
4374
|
-
import { useEffect as
|
|
5407
|
+
import { useEffect as useEffect19, useState as useState16 } from "react";
|
|
4375
5408
|
function useAgentState(attributeKey, parse, initial) {
|
|
4376
|
-
const [value, setValue] =
|
|
5409
|
+
const [value, setValue] = useState16(initial);
|
|
4377
5410
|
const remoteParticipants = useRemoteParticipants();
|
|
4378
|
-
|
|
5411
|
+
useEffect19(() => {
|
|
4379
5412
|
const agentParticipant = remoteParticipants.find((p) => p.attributes?.[attributeKey]);
|
|
4380
5413
|
if (agentParticipant) {
|
|
4381
5414
|
const attr = agentParticipant.attributes?.[attributeKey];
|
|
@@ -4432,7 +5465,7 @@ function usePlanUpdates() {
|
|
|
4432
5465
|
}
|
|
4433
5466
|
|
|
4434
5467
|
// src/hooks/useSession.ts
|
|
4435
|
-
import { useCallback as useCallback15, useEffect as
|
|
5468
|
+
import { useCallback as useCallback15, useEffect as useEffect20, useRef as useRef15, useState as useState17 } from "react";
|
|
4436
5469
|
var API_URL4 = "https://app.skippr.ai/api";
|
|
4437
5470
|
async function fetchSessionMessages(sessionId, authedFetch) {
|
|
4438
5471
|
try {
|
|
@@ -4486,31 +5519,32 @@ function useSession({
|
|
|
4486
5519
|
onStartError,
|
|
4487
5520
|
onDisconnect
|
|
4488
5521
|
}) {
|
|
4489
|
-
const [connection, setConnection] =
|
|
4490
|
-
const [shouldConnect, setShouldConnect] =
|
|
4491
|
-
const [isStarting, setIsStarting] =
|
|
4492
|
-
const [isDisconnecting, setIsDisconnecting] =
|
|
4493
|
-
const [error, setErrorMessage] =
|
|
4494
|
-
const [errorSeq, setErrorSeq] =
|
|
4495
|
-
const [errorCode, setErrorCode] =
|
|
5522
|
+
const [connection, setConnection] = useState17(null);
|
|
5523
|
+
const [shouldConnect, setShouldConnect] = useState17(false);
|
|
5524
|
+
const [isStarting, setIsStarting] = useState17(false);
|
|
5525
|
+
const [isDisconnecting, setIsDisconnecting] = useState17(false);
|
|
5526
|
+
const [error, setErrorMessage] = useState17("");
|
|
5527
|
+
const [errorSeq, setErrorSeq] = useState17(0);
|
|
5528
|
+
const [errorCode, setErrorCode] = useState17(null);
|
|
4496
5529
|
const setError = useCallback15((message) => {
|
|
4497
5530
|
setErrorMessage(message);
|
|
4498
5531
|
if (message)
|
|
4499
5532
|
setErrorSeq((reported) => reported + 1);
|
|
4500
5533
|
}, []);
|
|
4501
|
-
const [sessionId, setSessionId] =
|
|
4502
|
-
const [bearerToken, setBearerToken] =
|
|
4503
|
-
const [pendingScreenStream, setPendingScreenStream] =
|
|
4504
|
-
const [isPaused, setIsPaused] =
|
|
4505
|
-
const [isPausing, setIsPausing] =
|
|
4506
|
-
const [pauseTimeoutSeconds, setPauseTimeoutSeconds] =
|
|
4507
|
-
const [historyMessages, setHistoryMessages] =
|
|
4508
|
-
const [
|
|
4509
|
-
const
|
|
4510
|
-
const
|
|
5534
|
+
const [sessionId, setSessionId] = useState17(null);
|
|
5535
|
+
const [bearerToken, setBearerToken] = useState17(authToken ?? null);
|
|
5536
|
+
const [pendingScreenStream, setPendingScreenStream] = useState17(null);
|
|
5537
|
+
const [isPaused, setIsPaused] = useState17(false);
|
|
5538
|
+
const [isPausing, setIsPausing] = useState17(false);
|
|
5539
|
+
const [pauseTimeoutSeconds, setPauseTimeoutSeconds] = useState17(null);
|
|
5540
|
+
const [historyMessages, setHistoryMessages] = useState17([]);
|
|
5541
|
+
const [sessionAgenda, setSessionAgenda] = useState17(null);
|
|
5542
|
+
const [authFailed, setAuthFailed] = useState17(false);
|
|
5543
|
+
const tokenRef = useRef15(authToken ? { token: authToken, expiresAt: null } : null);
|
|
5544
|
+
const getUserTokenRef = useRef15(getUserToken);
|
|
4511
5545
|
getUserTokenRef.current = getUserToken ?? (userToken ? () => Promise.resolve(userToken) : undefined);
|
|
4512
|
-
const failedBearerRef =
|
|
4513
|
-
const inFlightExchangeRef =
|
|
5546
|
+
const failedBearerRef = useRef15(null);
|
|
5547
|
+
const inFlightExchangeRef = useRef15(null);
|
|
4514
5548
|
const canExchange = useCallback15(() => !!appKey && !!getUserTokenRef.current, [appKey]);
|
|
4515
5549
|
const reExchange = useCallback15(async () => {
|
|
4516
5550
|
if (inFlightExchangeRef.current)
|
|
@@ -4586,7 +5620,7 @@ function useSession({
|
|
|
4586
5620
|
setAuthFailed(false);
|
|
4587
5621
|
return resp;
|
|
4588
5622
|
}, [canExchange, getValidBearer, reExchange]);
|
|
4589
|
-
|
|
5623
|
+
useEffect20(() => {
|
|
4590
5624
|
let stale = false;
|
|
4591
5625
|
if (authToken) {
|
|
4592
5626
|
tokenRef.current = { token: authToken, expiresAt: null };
|
|
@@ -4611,14 +5645,14 @@ function useSession({
|
|
|
4611
5645
|
stale = true;
|
|
4612
5646
|
};
|
|
4613
5647
|
}, [authToken, canExchange, reExchange, locale, setError]);
|
|
4614
|
-
const isStartingRef =
|
|
4615
|
-
const armedScreenStreamRef =
|
|
5648
|
+
const isStartingRef = useRef15(false);
|
|
5649
|
+
const armedScreenStreamRef = useRef15(null);
|
|
4616
5650
|
const armScreenStream = useCallback15((stream) => {
|
|
4617
5651
|
armedScreenStreamRef.current = stream;
|
|
4618
5652
|
}, []);
|
|
4619
|
-
const pauseOnUnloadRef =
|
|
5653
|
+
const pauseOnUnloadRef = useRef15(null);
|
|
4620
5654
|
pauseOnUnloadRef.current = connection !== null && !isPaused && sessionId && bearerToken ? { sessionId, bearerToken } : null;
|
|
4621
|
-
|
|
5655
|
+
useEffect20(() => {
|
|
4622
5656
|
const onPageHide = () => {
|
|
4623
5657
|
const pending = pauseOnUnloadRef.current;
|
|
4624
5658
|
if (!pending)
|
|
@@ -4705,7 +5739,8 @@ function useSession({
|
|
|
4705
5739
|
agentControls: requestAgentControls,
|
|
4706
5740
|
adoptionGoalId,
|
|
4707
5741
|
autoStarted,
|
|
4708
|
-
userContext: requestUserContext
|
|
5742
|
+
userContext: requestUserContext,
|
|
5743
|
+
locale
|
|
4709
5744
|
})
|
|
4710
5745
|
});
|
|
4711
5746
|
if (!startResp.ok) {
|
|
@@ -4714,11 +5749,13 @@ function useSession({
|
|
|
4714
5749
|
const {
|
|
4715
5750
|
session,
|
|
4716
5751
|
connection: conn,
|
|
4717
|
-
pauseTimeoutSeconds: pauseTimeout
|
|
5752
|
+
pauseTimeoutSeconds: pauseTimeout,
|
|
5753
|
+
agenda
|
|
4718
5754
|
} = await startResp.json();
|
|
4719
5755
|
const history2 = existingSessionId ? await fetchSessionMessages(session.id, authedFetch) : [];
|
|
4720
5756
|
setSessionId(session.id);
|
|
4721
5757
|
setHistoryMessages(history2);
|
|
5758
|
+
setSessionAgenda(agenda ?? null);
|
|
4722
5759
|
setConnection({
|
|
4723
5760
|
livekitUrl: conn.livekitUrl,
|
|
4724
5761
|
token: conn.token
|
|
@@ -4783,6 +5820,7 @@ function useSession({
|
|
|
4783
5820
|
setSessionId(null);
|
|
4784
5821
|
setPendingScreenStream(null);
|
|
4785
5822
|
setHistoryMessages([]);
|
|
5823
|
+
setSessionAgenda(null);
|
|
4786
5824
|
setIsPaused(false);
|
|
4787
5825
|
onDisconnect?.();
|
|
4788
5826
|
} finally {
|
|
@@ -4803,6 +5841,7 @@ function useSession({
|
|
|
4803
5841
|
isPaused,
|
|
4804
5842
|
isPausing,
|
|
4805
5843
|
pauseTimeoutSeconds,
|
|
5844
|
+
sessionAgenda,
|
|
4806
5845
|
historyMessages,
|
|
4807
5846
|
pendingScreenStream,
|
|
4808
5847
|
armScreenStream,
|
|
@@ -4813,19 +5852,20 @@ function useSession({
|
|
|
4813
5852
|
}
|
|
4814
5853
|
|
|
4815
5854
|
// src/hooks/useSessionHistory.ts
|
|
4816
|
-
import { useEffect as
|
|
5855
|
+
import { useEffect as useEffect21, useState as useState18 } from "react";
|
|
4817
5856
|
var API_URL5 = "https://app.skippr.ai/api";
|
|
4818
5857
|
var EMPTY = { messages: [], phases: [] };
|
|
4819
5858
|
function useSessionHistory({
|
|
4820
5859
|
agentId,
|
|
4821
5860
|
enabled,
|
|
4822
|
-
authedFetch
|
|
5861
|
+
authedFetch,
|
|
5862
|
+
locale
|
|
4823
5863
|
}) {
|
|
4824
|
-
const [history2, setHistory] =
|
|
4825
|
-
const [loadedAgentId, setLoadedAgentId] =
|
|
5864
|
+
const [history2, setHistory] = useState18(EMPTY);
|
|
5865
|
+
const [loadedAgentId, setLoadedAgentId] = useState18(null);
|
|
4826
5866
|
const activeAgentId = enabled && agentId ? agentId : null;
|
|
4827
5867
|
const isLoading = activeAgentId !== null && activeAgentId !== loadedAgentId;
|
|
4828
|
-
|
|
5868
|
+
useEffect21(() => {
|
|
4829
5869
|
if (!enabled || !agentId) {
|
|
4830
5870
|
setHistory(EMPTY);
|
|
4831
5871
|
setLoadedAgentId(null);
|
|
@@ -4834,7 +5874,8 @@ function useSessionHistory({
|
|
|
4834
5874
|
let stale = false;
|
|
4835
5875
|
(async () => {
|
|
4836
5876
|
try {
|
|
4837
|
-
const
|
|
5877
|
+
const query = locale ? `?locale=${encodeURIComponent(locale)}` : "";
|
|
5878
|
+
const resp = await authedFetch(`${API_URL5}/v1/modules/${agentId}/history${query}`);
|
|
4838
5879
|
if (!resp.ok)
|
|
4839
5880
|
throw new Error(`Failed to load agent history: ${resp.status}`);
|
|
4840
5881
|
const data = await resp.json();
|
|
@@ -4857,22 +5898,22 @@ function useSessionHistory({
|
|
|
4857
5898
|
return () => {
|
|
4858
5899
|
stale = true;
|
|
4859
5900
|
};
|
|
4860
|
-
}, [enabled, agentId, authedFetch]);
|
|
5901
|
+
}, [enabled, agentId, authedFetch, locale]);
|
|
4861
5902
|
return { ...history2, isLoading };
|
|
4862
5903
|
}
|
|
4863
5904
|
|
|
4864
5905
|
// src/hooks/useSplashMedia.ts
|
|
4865
|
-
import { useCallback as useCallback16, useEffect as
|
|
5906
|
+
import { useCallback as useCallback16, useEffect as useEffect22, useMemo as useMemo5, useRef as useRef16, useState as useState19 } from "react";
|
|
4866
5907
|
function useSplashMedia({
|
|
4867
5908
|
armScreenStream,
|
|
4868
5909
|
isSplashVisible,
|
|
4869
5910
|
isSessionLive
|
|
4870
5911
|
}) {
|
|
4871
|
-
const [micEnabled, setMicEnabled] =
|
|
4872
|
-
const [screenEnabled, setScreenEnabled] =
|
|
4873
|
-
const heldScreenStreamRef =
|
|
4874
|
-
const screenRequestInFlightRef =
|
|
4875
|
-
const isStagingRef =
|
|
5912
|
+
const [micEnabled, setMicEnabled] = useState19(false);
|
|
5913
|
+
const [screenEnabled, setScreenEnabled] = useState19(false);
|
|
5914
|
+
const heldScreenStreamRef = useRef16(null);
|
|
5915
|
+
const screenRequestInFlightRef = useRef16(false);
|
|
5916
|
+
const isStagingRef = useRef16(false);
|
|
4876
5917
|
const enableMic = useCallback16(() => {
|
|
4877
5918
|
(async () => {
|
|
4878
5919
|
let stream;
|
|
@@ -4887,7 +5928,7 @@ function useSplashMedia({
|
|
|
4887
5928
|
setMicEnabled(true);
|
|
4888
5929
|
})();
|
|
4889
5930
|
}, []);
|
|
4890
|
-
|
|
5931
|
+
useEffect22(() => {
|
|
4891
5932
|
let cancelled = false;
|
|
4892
5933
|
(async () => {
|
|
4893
5934
|
if (!navigator.permissions?.query)
|
|
@@ -4943,10 +5984,10 @@ function useSplashMedia({
|
|
|
4943
5984
|
})();
|
|
4944
5985
|
}, [armScreenStream, releaseScreen]);
|
|
4945
5986
|
const isStaging = isSplashVisible && !isSessionLive;
|
|
4946
|
-
|
|
5987
|
+
useEffect22(() => {
|
|
4947
5988
|
isStagingRef.current = isStaging;
|
|
4948
5989
|
}, [isStaging]);
|
|
4949
|
-
|
|
5990
|
+
useEffect22(() => {
|
|
4950
5991
|
if (isSessionLive) {
|
|
4951
5992
|
heldScreenStreamRef.current = null;
|
|
4952
5993
|
setScreenEnabled(false);
|
|
@@ -4955,14 +5996,14 @@ function useSplashMedia({
|
|
|
4955
5996
|
if (!isSplashVisible)
|
|
4956
5997
|
releaseScreen();
|
|
4957
5998
|
}, [isSessionLive, isSplashVisible, releaseScreen]);
|
|
4958
|
-
return
|
|
5999
|
+
return useMemo5(() => ({ micEnabled, screenEnabled, enableMic, enableScreen, releaseScreen }), [micEnabled, screenEnabled, enableMic, enableScreen, releaseScreen]);
|
|
4959
6000
|
}
|
|
4960
6001
|
|
|
4961
6002
|
// src/hooks/useSplashOverlayOptOut.ts
|
|
4962
|
-
import { useCallback as useCallback17, useState as
|
|
6003
|
+
import { useCallback as useCallback17, useState as useState20 } from "react";
|
|
4963
6004
|
var API_URL6 = "https://app.skippr.ai/api";
|
|
4964
6005
|
function useSplashOverlayOptOut(authedFetch, recordedForUser) {
|
|
4965
|
-
const [recordedLocally, setRecordedLocally] =
|
|
6006
|
+
const [recordedLocally, setRecordedLocally] = useState20(false);
|
|
4966
6007
|
const optOut = useCallback17(() => {
|
|
4967
6008
|
setRecordedLocally(true);
|
|
4968
6009
|
authedFetch(`${API_URL6}/v1/users/splash-opt-out`, { method: "POST" }).catch((e) => console.warn("[Skippr] splash overlay opt-out failed", e));
|
|
@@ -5177,7 +6218,7 @@ function dockStyleFlush(dock) {
|
|
|
5177
6218
|
}
|
|
5178
6219
|
|
|
5179
6220
|
// src/components/AgentCursor.tsx
|
|
5180
|
-
import { useContext as
|
|
6221
|
+
import { useContext as useContext9, useEffect as useEffect23, useLayoutEffect, useRef as useRef17, useState as useState21 } from "react";
|
|
5181
6222
|
|
|
5182
6223
|
// src/capture/elementRef.ts
|
|
5183
6224
|
function safeGetIframeDocument(iframe) {
|
|
@@ -5390,21 +6431,21 @@ function AgentCursor({
|
|
|
5390
6431
|
target,
|
|
5391
6432
|
animated = false
|
|
5392
6433
|
}) {
|
|
5393
|
-
const ctx =
|
|
5394
|
-
const [cursor, setCursor] =
|
|
5395
|
-
const [glideMs, setGlideMs] =
|
|
5396
|
-
const [phase, setPhase] =
|
|
5397
|
-
const [ringBox, setRingBox] =
|
|
5398
|
-
const [clickPulse, setClickPulse] =
|
|
5399
|
-
const [measuredLabelWidth, setMeasuredLabelWidth] =
|
|
5400
|
-
const labelRef =
|
|
5401
|
-
const cursorElRef =
|
|
5402
|
-
const pathRef =
|
|
5403
|
-
const prevCursorRef =
|
|
5404
|
-
const traceRef =
|
|
5405
|
-
const timersRef =
|
|
5406
|
-
const trackFrameRef =
|
|
5407
|
-
const glideFrameRef =
|
|
6434
|
+
const ctx = useContext9(LiveAgentContext);
|
|
6435
|
+
const [cursor, setCursor] = useState21(null);
|
|
6436
|
+
const [glideMs, setGlideMs] = useState21(0);
|
|
6437
|
+
const [phase, setPhase] = useState21("idle");
|
|
6438
|
+
const [ringBox, setRingBox] = useState21(null);
|
|
6439
|
+
const [clickPulse, setClickPulse] = useState21(0);
|
|
6440
|
+
const [measuredLabelWidth, setMeasuredLabelWidth] = useState21(0);
|
|
6441
|
+
const labelRef = useRef17(null);
|
|
6442
|
+
const cursorElRef = useRef17(null);
|
|
6443
|
+
const pathRef = useRef17(null);
|
|
6444
|
+
const prevCursorRef = useRef17(null);
|
|
6445
|
+
const traceRef = useRef17(null);
|
|
6446
|
+
const timersRef = useRef17(new Set);
|
|
6447
|
+
const trackFrameRef = useRef17(null);
|
|
6448
|
+
const glideFrameRef = useRef17(null);
|
|
5408
6449
|
const clearTimers = () => {
|
|
5409
6450
|
for (const t of timersRef.current)
|
|
5410
6451
|
clearTimeout(t);
|
|
@@ -5520,7 +6561,7 @@ function AgentCursor({
|
|
|
5520
6561
|
});
|
|
5521
6562
|
return cancelAnimation;
|
|
5522
6563
|
}, [target, animated]);
|
|
5523
|
-
|
|
6564
|
+
useEffect23(() => {
|
|
5524
6565
|
if (!target || target.kind === "gesture" || phase === "idle")
|
|
5525
6566
|
return;
|
|
5526
6567
|
const track = () => {
|
|
@@ -5560,7 +6601,7 @@ function AgentCursor({
|
|
|
5560
6601
|
setMeasuredLabelWidth(renderedLabelWidth);
|
|
5561
6602
|
}
|
|
5562
6603
|
}, [phase, measuredLabelWidth, target?.label]);
|
|
5563
|
-
|
|
6604
|
+
useEffect23(() => {
|
|
5564
6605
|
return () => {
|
|
5565
6606
|
traceRef.current?.cancel();
|
|
5566
6607
|
for (const t of timersRef.current)
|
|
@@ -5660,7 +6701,7 @@ function AgentCursor({
|
|
|
5660
6701
|
// src/components/AutoStartMedia.tsx
|
|
5661
6702
|
import { useConnectionState, useLocalParticipant as useLocalParticipant4 } from "@livekit/components-react/hooks";
|
|
5662
6703
|
import { ConnectionState, Track as Track2 } from "livekit-client";
|
|
5663
|
-
import { useEffect as
|
|
6704
|
+
import { useEffect as useEffect24, useRef as useRef18 } from "react";
|
|
5664
6705
|
function AutoStartMedia({
|
|
5665
6706
|
pendingScreenStream,
|
|
5666
6707
|
pushOrTapMicMode = false,
|
|
@@ -5668,8 +6709,8 @@ function AutoStartMedia({
|
|
|
5668
6709
|
}) {
|
|
5669
6710
|
const { localParticipant } = useLocalParticipant4();
|
|
5670
6711
|
const connectionState = useConnectionState();
|
|
5671
|
-
const didStartRef =
|
|
5672
|
-
|
|
6712
|
+
const didStartRef = useRef18(false);
|
|
6713
|
+
useEffect24(() => {
|
|
5673
6714
|
if (didStartRef.current)
|
|
5674
6715
|
return;
|
|
5675
6716
|
if (connectionState !== ConnectionState.Connected)
|
|
@@ -5696,7 +6737,7 @@ function AutoStartMedia({
|
|
|
5696
6737
|
// src/components/DomCapture.tsx
|
|
5697
6738
|
import { useConnectionState as useConnectionState2, useLocalParticipant as useLocalParticipant5 } from "@livekit/components-react/hooks";
|
|
5698
6739
|
import { ConnectionState as ConnectionState2, ScreenSharePresets as ScreenSharePresets2, Track as Track3 } from "livekit-client";
|
|
5699
|
-
import { useContext as
|
|
6740
|
+
import { useContext as useContext10, useEffect as useEffect25, useMemo as useMemo6, useRef as useRef19 } from "react";
|
|
5700
6741
|
|
|
5701
6742
|
// src/capture/a11yUtils.ts
|
|
5702
6743
|
var ROLE_BY_TAG = {
|
|
@@ -6921,15 +7962,15 @@ function DomCapture({ pushOrTapMicMode = false, startMuted = false }) {
|
|
|
6921
7962
|
const { localParticipant } = useLocalParticipant5();
|
|
6922
7963
|
const connectionState = useConnectionState2();
|
|
6923
7964
|
const { isHeld, clearPausedCaptureRef } = useSessionHoldContext();
|
|
6924
|
-
const accentColor =
|
|
6925
|
-
const brand =
|
|
6926
|
-
const brandRef =
|
|
7965
|
+
const accentColor = useContext10(LiveAgentContext)?.appearance?.accentColor ?? null;
|
|
7966
|
+
const brand = useMemo6(() => resolveBrandPalette(accentColor), [accentColor]);
|
|
7967
|
+
const brandRef = useRef19(brand);
|
|
6927
7968
|
brandRef.current = brand;
|
|
6928
|
-
const didStartRef =
|
|
6929
|
-
const pausedRef =
|
|
6930
|
-
const freezeCaptureRef =
|
|
6931
|
-
const resumeCaptureRef =
|
|
6932
|
-
|
|
7969
|
+
const didStartRef = useRef19(false);
|
|
7970
|
+
const pausedRef = useRef19(false);
|
|
7971
|
+
const freezeCaptureRef = useRef19(null);
|
|
7972
|
+
const resumeCaptureRef = useRef19(null);
|
|
7973
|
+
useEffect25(() => {
|
|
6933
7974
|
if (didStartRef.current)
|
|
6934
7975
|
return;
|
|
6935
7976
|
if (connectionState !== ConnectionState2.Connected)
|
|
@@ -7166,7 +8207,7 @@ function DomCapture({ pushOrTapMicMode = false, startMuted = false }) {
|
|
|
7166
8207
|
track.stop();
|
|
7167
8208
|
};
|
|
7168
8209
|
}, [connectionState, localParticipant, pushOrTapMicMode, startMuted, clearPausedCaptureRef]);
|
|
7169
|
-
|
|
8210
|
+
useEffect25(() => {
|
|
7170
8211
|
if (isHeld) {
|
|
7171
8212
|
freezeCaptureRef.current?.();
|
|
7172
8213
|
} else {
|
|
@@ -7177,10 +8218,15 @@ function DomCapture({ pushOrTapMicMode = false, startMuted = false }) {
|
|
|
7177
8218
|
}
|
|
7178
8219
|
|
|
7179
8220
|
// src/components/HighlightOverlay.tsx
|
|
7180
|
-
import { useDataChannel } from "@livekit/components-react/hooks";
|
|
7181
|
-
import { useCallback as useCallback18, useEffect as
|
|
7182
|
-
var HIGHLIGHT_AUTO_CLEAR_MS =
|
|
7183
|
-
var
|
|
8221
|
+
import { useDataChannel, useLocalParticipant as useLocalParticipant6 } from "@livekit/components-react/hooks";
|
|
8222
|
+
import { useCallback as useCallback18, useEffect as useEffect26, useRef as useRef20 } from "react";
|
|
8223
|
+
var HIGHLIGHT_AUTO_CLEAR_MS = 30000;
|
|
8224
|
+
var PAGE_CHECK_MS = 250;
|
|
8225
|
+
var ACTED_REASON = "acted";
|
|
8226
|
+
var NAVIGATED_REASON = "navigated";
|
|
8227
|
+
var EXPIRED_REASON = "expired";
|
|
8228
|
+
var ELEMENT_GONE_REASON = "element-gone";
|
|
8229
|
+
var textEncoder5 = new TextEncoder;
|
|
7184
8230
|
var textDecoder = new TextDecoder;
|
|
7185
8231
|
function parseHighlightMessage(payload) {
|
|
7186
8232
|
try {
|
|
@@ -7202,18 +8248,29 @@ function parseHighlightMessage(payload) {
|
|
|
7202
8248
|
}
|
|
7203
8249
|
}
|
|
7204
8250
|
function HighlightOverlay() {
|
|
7205
|
-
const
|
|
7206
|
-
const
|
|
7207
|
-
const
|
|
8251
|
+
const copy = useChromeCopy();
|
|
8252
|
+
const { localParticipant } = useLocalParticipant6();
|
|
8253
|
+
const targetRef = useRef20(null);
|
|
8254
|
+
const shownRef = useRef20(null);
|
|
8255
|
+
const shownUrlRef = useRef20(null);
|
|
8256
|
+
const autoClearRef = useRef20(null);
|
|
7208
8257
|
const clear = useCallback18(() => {
|
|
7209
8258
|
if (autoClearRef.current)
|
|
7210
8259
|
clearTimeout(autoClearRef.current);
|
|
7211
8260
|
autoClearRef.current = null;
|
|
7212
8261
|
targetRef.current = null;
|
|
7213
8262
|
shownRef.current = null;
|
|
8263
|
+
shownUrlRef.current = null;
|
|
7214
8264
|
clearCursorTarget("guide");
|
|
7215
8265
|
setHighlightActive(false);
|
|
7216
8266
|
}, []);
|
|
8267
|
+
const clearAndReport = useCallback18((reason) => {
|
|
8268
|
+
clear();
|
|
8269
|
+
localParticipant.publishData(textEncoder5.encode(JSON.stringify({ type: "cleared", reason })), {
|
|
8270
|
+
reliable: true,
|
|
8271
|
+
topic: HIGHLIGHT_TOPIC
|
|
8272
|
+
}).catch((error) => console.error("Failed to report highlight clear:", error));
|
|
8273
|
+
}, [clear, localParticipant]);
|
|
7217
8274
|
const onHighlightMessage = useCallback18((msg) => {
|
|
7218
8275
|
const parsed = parseHighlightMessage(msg.payload);
|
|
7219
8276
|
if (!parsed)
|
|
@@ -7224,73 +8281,87 @@ function HighlightOverlay() {
|
|
|
7224
8281
|
}
|
|
7225
8282
|
const element = findElementByRef(parsed.ref);
|
|
7226
8283
|
if (!element) {
|
|
7227
|
-
|
|
8284
|
+
clearAndReport(ELEMENT_GONE_REASON);
|
|
7228
8285
|
return;
|
|
7229
8286
|
}
|
|
7230
8287
|
if (autoClearRef.current)
|
|
7231
8288
|
clearTimeout(autoClearRef.current);
|
|
7232
8289
|
targetRef.current = element;
|
|
7233
8290
|
shownRef.current = parsed;
|
|
8291
|
+
shownUrlRef.current = window.location.href;
|
|
7234
8292
|
setCursorTarget("guide", {
|
|
7235
8293
|
element,
|
|
7236
|
-
label: parsed.message ||
|
|
8294
|
+
label: parsed.message || copy.highlightDefaultLabel,
|
|
7237
8295
|
mode: "guide"
|
|
7238
8296
|
});
|
|
7239
8297
|
setHighlightActive(true);
|
|
7240
|
-
autoClearRef.current = setTimeout(
|
|
7241
|
-
}, [clear]);
|
|
8298
|
+
autoClearRef.current = setTimeout(() => clearAndReport(EXPIRED_REASON), HIGHLIGHT_AUTO_CLEAR_MS);
|
|
8299
|
+
}, [clear, clearAndReport, copy]);
|
|
7242
8300
|
useDataChannel(HIGHLIGHT_TOPIC, onHighlightMessage);
|
|
7243
|
-
|
|
7244
|
-
|
|
7245
|
-
const
|
|
8301
|
+
useEffect26(() => onHighlightCleared(clear), [clear]);
|
|
8302
|
+
useEffect26(() => {
|
|
8303
|
+
const onClick = (event) => {
|
|
8304
|
+
const target = targetRef.current;
|
|
8305
|
+
if (!target)
|
|
8306
|
+
return;
|
|
8307
|
+
const node = event.composedPath()[0];
|
|
8308
|
+
if (!(node instanceof Node))
|
|
8309
|
+
return;
|
|
8310
|
+
if (!target.contains(node))
|
|
8311
|
+
return;
|
|
8312
|
+
if (isAgentActionInProgress())
|
|
8313
|
+
return;
|
|
8314
|
+
clearAndReport(ACTED_REASON);
|
|
8315
|
+
};
|
|
8316
|
+
document.addEventListener("click", onClick, { capture: true });
|
|
8317
|
+
return () => document.removeEventListener("click", onClick, { capture: true });
|
|
8318
|
+
}, [clearAndReport]);
|
|
8319
|
+
useEffect26(() => {
|
|
8320
|
+
const interval = setInterval(() => {
|
|
7246
8321
|
const shown = shownRef.current;
|
|
7247
8322
|
const target = targetRef.current;
|
|
7248
|
-
if (!shown || !target
|
|
8323
|
+
if (!shown || !target)
|
|
8324
|
+
return;
|
|
8325
|
+
if (shownUrlRef.current !== window.location.href) {
|
|
8326
|
+
clearAndReport(NAVIGATED_REASON);
|
|
8327
|
+
return;
|
|
8328
|
+
}
|
|
8329
|
+
if (target.isConnected)
|
|
7249
8330
|
return;
|
|
7250
8331
|
const replacement = findElementByRef(shown.ref);
|
|
7251
8332
|
if (!replacement) {
|
|
7252
|
-
|
|
8333
|
+
clearAndReport(ELEMENT_GONE_REASON);
|
|
7253
8334
|
return;
|
|
7254
8335
|
}
|
|
7255
8336
|
targetRef.current = replacement;
|
|
7256
8337
|
setCursorTarget("guide", {
|
|
7257
8338
|
element: replacement,
|
|
7258
|
-
label: shown.message ||
|
|
8339
|
+
label: shown.message || copy.highlightDefaultLabel,
|
|
7259
8340
|
mode: "guide"
|
|
7260
8341
|
});
|
|
7261
|
-
},
|
|
7262
|
-
return () => clearInterval(
|
|
7263
|
-
}, [
|
|
7264
|
-
|
|
7265
|
-
const onClick = (event) => {
|
|
7266
|
-
const target = targetRef.current;
|
|
7267
|
-
const node = event.target;
|
|
7268
|
-
if (target && node && target.contains(node))
|
|
7269
|
-
clear();
|
|
7270
|
-
};
|
|
7271
|
-
document.addEventListener("click", onClick, { capture: true });
|
|
7272
|
-
return () => document.removeEventListener("click", onClick, { capture: true });
|
|
7273
|
-
}, [clear]);
|
|
7274
|
-
useEffect25(() => clear, [clear]);
|
|
8342
|
+
}, PAGE_CHECK_MS);
|
|
8343
|
+
return () => clearInterval(interval);
|
|
8344
|
+
}, [clearAndReport, copy]);
|
|
8345
|
+
useEffect26(() => clear, [clear]);
|
|
7275
8346
|
return null;
|
|
7276
8347
|
}
|
|
7277
8348
|
|
|
7278
8349
|
// src/components/MinimizedBubble.tsx
|
|
7279
|
-
import { useContext as
|
|
8350
|
+
import { useContext as useContext11, useEffect as useEffect28, useRef as useRef22, useState as useState22 } from "react";
|
|
7280
8351
|
|
|
7281
8352
|
// src/hooks/useLauncherDrag.ts
|
|
7282
|
-
import { useEffect as
|
|
8353
|
+
import { useEffect as useEffect27, useRef as useRef21 } from "react";
|
|
7283
8354
|
import { flushSync } from "react-dom";
|
|
7284
8355
|
var DRAG_THRESHOLD_PX = 5;
|
|
7285
8356
|
function useLauncherDrag(containerRef, onDrop, followRefs, reportDragging, enabled = true) {
|
|
7286
|
-
const wasDraggedRef =
|
|
7287
|
-
const onDropRef =
|
|
8357
|
+
const wasDraggedRef = useRef21(false);
|
|
8358
|
+
const onDropRef = useRef21(onDrop);
|
|
7288
8359
|
onDropRef.current = onDrop;
|
|
7289
|
-
const followTargetsRef =
|
|
8360
|
+
const followTargetsRef = useRef21(followRefs);
|
|
7290
8361
|
followTargetsRef.current = followRefs;
|
|
7291
|
-
const reportDraggingRef =
|
|
8362
|
+
const reportDraggingRef = useRef21(reportDragging);
|
|
7292
8363
|
reportDraggingRef.current = reportDragging;
|
|
7293
|
-
|
|
8364
|
+
useEffect27(() => {
|
|
7294
8365
|
if (!enabled)
|
|
7295
8366
|
return;
|
|
7296
8367
|
const el = containerRef.current;
|
|
@@ -7558,10 +8629,11 @@ var GOAL_EXIT_STAGGER_MS = 250;
|
|
|
7558
8629
|
var MAX_GOAL_BUBBLES = 3;
|
|
7559
8630
|
var MAX_MODULE_PILLS = 3;
|
|
7560
8631
|
function SkipprMark({ onStart, logoUrl }) {
|
|
8632
|
+
const copy = useChromeCopy();
|
|
7561
8633
|
return /* @__PURE__ */ jsx21("button", {
|
|
7562
8634
|
type: "button",
|
|
7563
8635
|
onClick: onStart,
|
|
7564
|
-
"aria-label":
|
|
8636
|
+
"aria-label": copy.askLabel,
|
|
7565
8637
|
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",
|
|
7566
8638
|
children: logoUrl ? /* @__PURE__ */ jsx21("img", {
|
|
7567
8639
|
src: logoUrl,
|
|
@@ -7584,10 +8656,11 @@ function ChatButton({
|
|
|
7584
8656
|
position,
|
|
7585
8657
|
onClick
|
|
7586
8658
|
}) {
|
|
8659
|
+
const copy = useChromeCopy();
|
|
7587
8660
|
return /* @__PURE__ */ jsx21("button", {
|
|
7588
8661
|
type: "button",
|
|
7589
8662
|
onClick,
|
|
7590
|
-
"aria-label":
|
|
8663
|
+
"aria-label": copy.openChatLabel,
|
|
7591
8664
|
tabIndex: revealed ? 0 : -1,
|
|
7592
8665
|
className: cn("skippr:h-[36px] skippr:shrink-0 skippr:overflow-hidden skippr:p-0", "skippr:transition-all skippr:duration-[400ms] skippr:ease-[cubic-bezier(0.22,1,0.36,1)]", position === "right" ? "skippr:order-last" : "skippr:order-first"),
|
|
7593
8666
|
style: {
|
|
@@ -7645,7 +8718,8 @@ function WelcomeBubble({
|
|
|
7645
8718
|
onDismiss,
|
|
7646
8719
|
onClick
|
|
7647
8720
|
}) {
|
|
7648
|
-
|
|
8721
|
+
const copy = useChromeCopy();
|
|
8722
|
+
useEffect28(() => {
|
|
7649
8723
|
const timer = setTimeout(onDismiss, 5000);
|
|
7650
8724
|
return () => clearTimeout(timer);
|
|
7651
8725
|
}, [onDismiss]);
|
|
@@ -7653,7 +8727,7 @@ function WelcomeBubble({
|
|
|
7653
8727
|
type: "button",
|
|
7654
8728
|
className: cn("skippr:absolute", popsDown ? "skippr:top-full skippr:mt-3" : "skippr:bottom-full skippr:mb-3", "skippr:max-w-64 skippr:rounded-xl skippr:bg-card skippr:shadow-lg", "skippr:border skippr:border-border skippr:px-4 skippr:py-3", "skippr:text-sm skippr:text-foreground skippr:leading-relaxed skippr:text-left", "skippr:animate-[skippr-fade-in_0.3s_ease-out]", "skippr:cursor-pointer", position === "right" ? "skippr:right-0" : "skippr:left-0"),
|
|
7655
8729
|
onClick,
|
|
7656
|
-
"aria-label":
|
|
8730
|
+
"aria-label": copy.dismissLabel,
|
|
7657
8731
|
children: [
|
|
7658
8732
|
message,
|
|
7659
8733
|
/* @__PURE__ */ jsx21("span", {
|
|
@@ -7667,7 +8741,8 @@ function MinimizedBubble({
|
|
|
7667
8741
|
welcomeDismissed,
|
|
7668
8742
|
onDismissWelcome
|
|
7669
8743
|
}) {
|
|
7670
|
-
const
|
|
8744
|
+
const copy = useChromeCopy();
|
|
8745
|
+
const ctx = useContext11(LiveAgentContext);
|
|
7671
8746
|
if (!ctx) {
|
|
7672
8747
|
throw new Error("MinimizedBubble must be used within a <LiveAgent> provider");
|
|
7673
8748
|
}
|
|
@@ -7690,14 +8765,14 @@ function MinimizedBubble({
|
|
|
7690
8765
|
commitLauncherDrop,
|
|
7691
8766
|
appearance
|
|
7692
8767
|
} = ctx;
|
|
7693
|
-
const [goalsAutoHidden, setGoalsAutoHidden] =
|
|
7694
|
-
const [isLauncherHovered, setIsLauncherHovered] =
|
|
7695
|
-
const [visitHref, setVisitHref] =
|
|
7696
|
-
const revealedHrefRef =
|
|
7697
|
-
const hoverContainerRef =
|
|
7698
|
-
const closeTimerRef =
|
|
7699
|
-
|
|
7700
|
-
|
|
8768
|
+
const [goalsAutoHidden, setGoalsAutoHidden] = useState22(false);
|
|
8769
|
+
const [isLauncherHovered, setIsLauncherHovered] = useState22(false);
|
|
8770
|
+
const [visitHref, setVisitHref] = useState22(() => window.location.href);
|
|
8771
|
+
const revealedHrefRef = useRef22(null);
|
|
8772
|
+
const hoverContainerRef = useRef22(null);
|
|
8773
|
+
const closeTimerRef = useRef22(null);
|
|
8774
|
+
useEffect28(() => subscribeToLocationChange(() => setVisitHref(window.location.href)), []);
|
|
8775
|
+
useEffect28(() => {
|
|
7701
8776
|
const el = hoverContainerRef.current;
|
|
7702
8777
|
if (!el)
|
|
7703
8778
|
return;
|
|
@@ -7736,7 +8811,7 @@ function MinimizedBubble({
|
|
|
7736
8811
|
const onboardingModule = pillCandidates.find((module) => module.type === "onboarding");
|
|
7737
8812
|
const modulePills = onboardingModule ? [onboardingModule] : pillCandidates.slice(0, MAX_MODULE_PILLS).reverse();
|
|
7738
8813
|
const goalsEligible = adoptionGoals.length > 0 && !onboardingModule && hasResolvedModules;
|
|
7739
|
-
|
|
8814
|
+
useEffect28(() => {
|
|
7740
8815
|
if (!goalsEligible)
|
|
7741
8816
|
return;
|
|
7742
8817
|
if (revealedHrefRef.current === visitHref) {
|
|
@@ -7750,8 +8825,8 @@ function MinimizedBubble({
|
|
|
7750
8825
|
}, [goalsEligible, visitHref]);
|
|
7751
8826
|
const matchedGoals = goalsEligible ? adoptionGoals.slice(0, MAX_GOAL_BUBBLES) : [];
|
|
7752
8827
|
const goalsHidden = goalsAutoHidden && !isLauncherHovered;
|
|
7753
|
-
const [goalsUnmounted, setGoalsUnmounted] =
|
|
7754
|
-
|
|
8828
|
+
const [goalsUnmounted, setGoalsUnmounted] = useState22(false);
|
|
8829
|
+
useEffect28(() => {
|
|
7755
8830
|
if (!goalsHidden) {
|
|
7756
8831
|
setGoalsUnmounted(false);
|
|
7757
8832
|
return;
|
|
@@ -7818,7 +8893,7 @@ function MinimizedBubble({
|
|
|
7818
8893
|
className: "skippr:relative",
|
|
7819
8894
|
children: [
|
|
7820
8895
|
isLauncherHovered && /* @__PURE__ */ jsx21(ConsentBubble, {
|
|
7821
|
-
template:
|
|
8896
|
+
template: copy.consentSessionStart,
|
|
7822
8897
|
className: cn("skippr:absolute skippr:bottom-[calc(100%+8px)]", position === "right" ? "skippr:right-0" : "skippr:left-0")
|
|
7823
8898
|
}),
|
|
7824
8899
|
/* @__PURE__ */ jsx21(IdleLauncher, {
|
|
@@ -7836,7 +8911,7 @@ function MinimizedBubble({
|
|
|
7836
8911
|
|
|
7837
8912
|
// src/components/PageActionHandler.tsx
|
|
7838
8913
|
import { useDataChannel as useDataChannel2 } from "@livekit/components-react/hooks";
|
|
7839
|
-
import { useCallback as useCallback19, useEffect as
|
|
8914
|
+
import { useCallback as useCallback19, useEffect as useEffect29, useRef as useRef23 } from "react";
|
|
7840
8915
|
var STEP_MAX_WAIT_MS = 5000;
|
|
7841
8916
|
var POST_ACTION_SETTLE_SNAPSHOT_MS = 300;
|
|
7842
8917
|
var TRAILING_ACTION_FLUSH_AFTER_STOP_MS = 1000;
|
|
@@ -8051,30 +9126,31 @@ function performAction(action, element) {
|
|
|
8051
9126
|
return;
|
|
8052
9127
|
}
|
|
8053
9128
|
}
|
|
8054
|
-
function labelFor(action) {
|
|
9129
|
+
function labelFor(action, copy) {
|
|
8055
9130
|
switch (action.type) {
|
|
8056
9131
|
case "click":
|
|
8057
|
-
return
|
|
9132
|
+
return copy.actionClicking;
|
|
8058
9133
|
case "fill":
|
|
8059
|
-
return
|
|
9134
|
+
return copy.actionTyping;
|
|
8060
9135
|
case "select":
|
|
8061
|
-
return
|
|
9136
|
+
return copy.actionSelecting;
|
|
8062
9137
|
case "scroll":
|
|
8063
9138
|
case "scroll_page":
|
|
8064
9139
|
case "scroll_in":
|
|
8065
|
-
return
|
|
9140
|
+
return copy.actionScrolling;
|
|
8066
9141
|
case "hover":
|
|
8067
|
-
return
|
|
9142
|
+
return copy.actionHovering;
|
|
8068
9143
|
}
|
|
8069
9144
|
}
|
|
8070
9145
|
function PageActionHandler() {
|
|
8071
|
-
const
|
|
8072
|
-
const
|
|
8073
|
-
const
|
|
8074
|
-
const
|
|
8075
|
-
const
|
|
8076
|
-
const
|
|
8077
|
-
const
|
|
9146
|
+
const copy = useChromeCopy();
|
|
9147
|
+
const mountedRef = useRef23(true);
|
|
9148
|
+
const queueRef = useRef23([]);
|
|
9149
|
+
const drainingRef = useRef23(false);
|
|
9150
|
+
const settleTimerRef = useRef23(null);
|
|
9151
|
+
const endStepRef = useRef23(null);
|
|
9152
|
+
const actionsStoppedRef = useRef23(false);
|
|
9153
|
+
const ignoreActionsArrivingBeforeRef = useRef23(0);
|
|
8078
9154
|
const runStep = useCallback19((action) => {
|
|
8079
9155
|
return new Promise((resolve) => {
|
|
8080
9156
|
if (action.type === "scroll_page") {
|
|
@@ -8089,7 +9165,7 @@ function PageActionHandler() {
|
|
|
8089
9165
|
setCursorTarget("act", {
|
|
8090
9166
|
kind: "gesture",
|
|
8091
9167
|
gesture: { direction: gestureFor(action.direction) },
|
|
8092
|
-
label: labelFor(action),
|
|
9168
|
+
label: labelFor(action, copy),
|
|
8093
9169
|
mode: "act",
|
|
8094
9170
|
onAct: () => {
|
|
8095
9171
|
clearTimeout(fallback2);
|
|
@@ -8123,7 +9199,7 @@ function PageActionHandler() {
|
|
|
8123
9199
|
const fallback = setTimeout(finish, STEP_MAX_WAIT_MS);
|
|
8124
9200
|
setCursorTarget("act", {
|
|
8125
9201
|
element,
|
|
8126
|
-
label: labelFor(action),
|
|
9202
|
+
label: labelFor(action, copy),
|
|
8127
9203
|
mode: "act",
|
|
8128
9204
|
onAct: () => {
|
|
8129
9205
|
clearTimeout(fallback);
|
|
@@ -8143,7 +9219,7 @@ function PageActionHandler() {
|
|
|
8143
9219
|
}
|
|
8144
9220
|
});
|
|
8145
9221
|
});
|
|
8146
|
-
}, []);
|
|
9222
|
+
}, [copy]);
|
|
8147
9223
|
const drain = useCallback19(async () => {
|
|
8148
9224
|
if (drainingRef.current)
|
|
8149
9225
|
return;
|
|
@@ -8174,7 +9250,7 @@ function PageActionHandler() {
|
|
|
8174
9250
|
queueRef.current.push(action);
|
|
8175
9251
|
drain();
|
|
8176
9252
|
}, [drain]);
|
|
8177
|
-
|
|
9253
|
+
useEffect29(() => {
|
|
8178
9254
|
mountedRef.current = true;
|
|
8179
9255
|
drainingRef.current = false;
|
|
8180
9256
|
return () => {
|
|
@@ -8186,7 +9262,7 @@ function PageActionHandler() {
|
|
|
8186
9262
|
setActionsBusy(false);
|
|
8187
9263
|
};
|
|
8188
9264
|
}, []);
|
|
8189
|
-
|
|
9265
|
+
useEffect29(() => {
|
|
8190
9266
|
return onActionsStopped(() => {
|
|
8191
9267
|
actionsStoppedRef.current = true;
|
|
8192
9268
|
ignoreActionsArrivingBeforeRef.current = Date.now() + TRAILING_ACTION_FLUSH_AFTER_STOP_MS;
|
|
@@ -8204,22 +9280,22 @@ function PageActionHandler() {
|
|
|
8204
9280
|
}
|
|
8205
9281
|
|
|
8206
9282
|
// src/components/SessionControlBar.tsx
|
|
8207
|
-
import { useCallback as useCallback22, useContext as
|
|
9283
|
+
import { useCallback as useCallback22, useContext as useContext12, useEffect as useEffect33, useState as useState25 } from "react";
|
|
8208
9284
|
|
|
8209
9285
|
// src/hooks/useActionControl.ts
|
|
8210
|
-
import { useLocalParticipant as
|
|
8211
|
-
import { useCallback as useCallback20, useEffect as
|
|
8212
|
-
var
|
|
9286
|
+
import { useLocalParticipant as useLocalParticipant7 } from "@livekit/components-react/hooks";
|
|
9287
|
+
import { useCallback as useCallback20, useEffect as useEffect30, useState as useState23 } from "react";
|
|
9288
|
+
var textEncoder6 = new TextEncoder;
|
|
8213
9289
|
function useActionControl() {
|
|
8214
|
-
const { localParticipant } =
|
|
9290
|
+
const { localParticipant } = useLocalParticipant7();
|
|
8215
9291
|
const plan = usePlanUpdates();
|
|
8216
|
-
const [busy, setBusy] =
|
|
8217
|
-
|
|
9292
|
+
const [busy, setBusy] = useState23(isActionsBusy);
|
|
9293
|
+
useEffect30(() => subscribeActionsBusy(setBusy), []);
|
|
8218
9294
|
const actionsActive = busy || plan?.state === "executing";
|
|
8219
9295
|
const requestStop = useCallback20(async () => {
|
|
8220
9296
|
stopActions();
|
|
8221
9297
|
try {
|
|
8222
|
-
await localParticipant.publishData(
|
|
9298
|
+
await localParticipant.publishData(textEncoder6.encode(JSON.stringify({ type: "abort" })), {
|
|
8223
9299
|
reliable: true,
|
|
8224
9300
|
topic: ACTION_CONTROL_TOPIC
|
|
8225
9301
|
});
|
|
@@ -8231,13 +9307,13 @@ function useActionControl() {
|
|
|
8231
9307
|
}
|
|
8232
9308
|
|
|
8233
9309
|
// src/hooks/useAudioLevelBars.ts
|
|
8234
|
-
import { useEffect as
|
|
9310
|
+
import { useEffect as useEffect31, useRef as useRef24, useState as useState24 } from "react";
|
|
8235
9311
|
var TALKING_LEVEL_THRESHOLD = 0.2;
|
|
8236
9312
|
var TALKING_HOLD_MS = 400;
|
|
8237
9313
|
function useAudioLevelBars(mediaStreamTrack, { barCount, idleHeightPx, maxGrowthPx, noiseGate }) {
|
|
8238
|
-
const barRefs =
|
|
8239
|
-
const [isTalking, setIsTalking] =
|
|
8240
|
-
|
|
9314
|
+
const barRefs = useRef24([]);
|
|
9315
|
+
const [isTalking, setIsTalking] = useState24(false);
|
|
9316
|
+
useEffect31(() => {
|
|
8241
9317
|
if (!mediaStreamTrack) {
|
|
8242
9318
|
for (const bar of barRefs.current) {
|
|
8243
9319
|
if (bar)
|
|
@@ -8288,15 +9364,15 @@ function useAudioLevelBars(mediaStreamTrack, { barCount, idleHeightPx, maxGrowth
|
|
|
8288
9364
|
}
|
|
8289
9365
|
|
|
8290
9366
|
// src/hooks/useIdleAutoPause.ts
|
|
8291
|
-
import { useCallback as useCallback21, useEffect as
|
|
9367
|
+
import { useCallback as useCallback21, useEffect as useEffect32, useRef as useRef25 } from "react";
|
|
8292
9368
|
function useIdleAutoPause({
|
|
8293
9369
|
enabled,
|
|
8294
9370
|
active,
|
|
8295
9371
|
isHeld,
|
|
8296
9372
|
pause
|
|
8297
9373
|
}) {
|
|
8298
|
-
const timerRef =
|
|
8299
|
-
const pauseRef =
|
|
9374
|
+
const timerRef = useRef25(null);
|
|
9375
|
+
const pauseRef = useRef25(pause);
|
|
8300
9376
|
pauseRef.current = pause;
|
|
8301
9377
|
const clearTimer = useCallback21(() => {
|
|
8302
9378
|
if (timerRef.current) {
|
|
@@ -8312,7 +9388,7 @@ function useIdleAutoPause({
|
|
|
8312
9388
|
if (enabled && !isHeld)
|
|
8313
9389
|
armTimer();
|
|
8314
9390
|
}, [enabled, isHeld, armTimer]);
|
|
8315
|
-
|
|
9391
|
+
useEffect32(() => {
|
|
8316
9392
|
if (!enabled || isHeld || active) {
|
|
8317
9393
|
clearTimer();
|
|
8318
9394
|
return;
|
|
@@ -8324,14 +9400,14 @@ function useIdleAutoPause({
|
|
|
8324
9400
|
}
|
|
8325
9401
|
|
|
8326
9402
|
// src/hooks/useLiveUserTranscript.ts
|
|
8327
|
-
import { useLocalParticipant as
|
|
8328
|
-
import { useRef as
|
|
9403
|
+
import { useLocalParticipant as useLocalParticipant8 } from "@livekit/components-react/hooks";
|
|
9404
|
+
import { useRef as useRef26 } from "react";
|
|
8329
9405
|
function useLiveUserTranscript(active) {
|
|
8330
9406
|
const transcriptions = useSharedTranscriptions();
|
|
8331
|
-
const { localParticipant } =
|
|
9407
|
+
const { localParticipant } = useLocalParticipant8();
|
|
8332
9408
|
const localIdentity = localParticipant.identity;
|
|
8333
|
-
const priorStreamIdsRef =
|
|
8334
|
-
const wasActiveRef =
|
|
9409
|
+
const priorStreamIdsRef = useRef26(new Set);
|
|
9410
|
+
const wasActiveRef = useRef26(false);
|
|
8335
9411
|
const userStreams = transcriptions.filter((stream) => stream.participantInfo.identity === localIdentity);
|
|
8336
9412
|
if (active && !wasActiveRef.current) {
|
|
8337
9413
|
priorStreamIdsRef.current = new Set(userStreams.map((s) => s.streamInfo.id));
|
|
@@ -8343,13 +9419,13 @@ function useLiveUserTranscript(active) {
|
|
|
8343
9419
|
}
|
|
8344
9420
|
|
|
8345
9421
|
// src/hooks/useMicLevel.ts
|
|
8346
|
-
import { useLocalParticipant as
|
|
9422
|
+
import { useLocalParticipant as useLocalParticipant9 } from "@livekit/components-react/hooks";
|
|
8347
9423
|
var MIC_BARS = 5;
|
|
8348
9424
|
var IDLE_BAR_HEIGHT_PX = 5;
|
|
8349
9425
|
var MAX_BAR_GROWTH_PX = 17;
|
|
8350
9426
|
var MIC_NOISE_GATE = 0.15;
|
|
8351
9427
|
function useMicLevel(enabled) {
|
|
8352
|
-
const { microphoneTrack } =
|
|
9428
|
+
const { microphoneTrack } = useLocalParticipant9();
|
|
8353
9429
|
const mediaStreamTrack = microphoneTrack?.track?.mediaStreamTrack;
|
|
8354
9430
|
return useAudioLevelBars(enabled ? mediaStreamTrack : undefined, {
|
|
8355
9431
|
barCount: MIC_BARS,
|
|
@@ -8362,14 +9438,15 @@ function useMicLevel(enabled) {
|
|
|
8362
9438
|
// src/components/PausedCountdown.tsx
|
|
8363
9439
|
import { jsxs as jsxs15 } from "react/jsx-runtime";
|
|
8364
9440
|
function PausedCountdown({ secondsRemaining }) {
|
|
9441
|
+
const copy = useChromeCopy();
|
|
8365
9442
|
const minutes = Math.floor(secondsRemaining / 60);
|
|
8366
9443
|
const seconds = String(secondsRemaining % 60).padStart(2, "0");
|
|
8367
9444
|
return /* @__PURE__ */ jsxs15("span", {
|
|
8368
9445
|
role: "timer",
|
|
8369
|
-
"aria-label":
|
|
9446
|
+
"aria-label": fillPlaceholders(copy.pausedClosingInAria, { seconds: secondsRemaining }),
|
|
8370
9447
|
className: "skippr:flex skippr:h-[38px] skippr:items-center skippr:whitespace-nowrap skippr:px-1 skippr:text-[13px] skippr:font-medium skippr:text-neutral-500 skippr:[animation:skippr-stage-fade_240ms_ease-out]",
|
|
8371
9448
|
children: [
|
|
8372
|
-
|
|
9449
|
+
copy.pausedClosingIn,
|
|
8373
9450
|
/* @__PURE__ */ jsxs15("span", {
|
|
8374
9451
|
className: "skippr:ml-1 skippr:font-semibold skippr:tabular-nums skippr:text-bubble",
|
|
8375
9452
|
children: [
|
|
@@ -8385,11 +9462,13 @@ function PausedCountdown({ secondsRemaining }) {
|
|
|
8385
9462
|
// src/components/PushToTalkHint.tsx
|
|
8386
9463
|
import { jsx as jsx22, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
8387
9464
|
function PushToTalkHint() {
|
|
9465
|
+
const copy = useChromeCopy();
|
|
9466
|
+
const [beforeKey, afterKey] = splitOnPlaceholder(copy.micShortcutHint, "key");
|
|
8388
9467
|
return /* @__PURE__ */ jsxs16("div", {
|
|
8389
9468
|
className: cn("skippr:absolute skippr:top-full skippr:left-2 skippr:mt-2 skippr:flex skippr:w-fit skippr:items-center skippr:gap-1.5 skippr:whitespace-nowrap skippr:rounded-full skippr:bg-[#f4ecd8] skippr:px-2.5 skippr:py-1 skippr:text-[10px] skippr:font-medium skippr:text-black skippr:shadow-[0_4px_14px_rgba(0,0,0,0.12)] skippr:[animation:skippr-agent-in_200ms_ease-out]"),
|
|
8390
9469
|
children: [
|
|
8391
9470
|
/* @__PURE__ */ jsx22("span", {
|
|
8392
|
-
children:
|
|
9471
|
+
children: beforeKey.trim()
|
|
8393
9472
|
}),
|
|
8394
9473
|
/* @__PURE__ */ jsxs16("kbd", {
|
|
8395
9474
|
className: "skippr:flex skippr:items-center skippr:gap-0.5 skippr:rounded skippr:border skippr:border-black/25 skippr:bg-white/70 skippr:px-1.5 skippr:py-0.5 skippr:font-mono skippr:text-[11px] skippr:leading-none skippr:text-black",
|
|
@@ -8407,7 +9486,7 @@ function PushToTalkHint() {
|
|
|
8407
9486
|
]
|
|
8408
9487
|
}),
|
|
8409
9488
|
/* @__PURE__ */ jsx22("span", {
|
|
8410
|
-
children:
|
|
9489
|
+
children: afterKey.trim()
|
|
8411
9490
|
})
|
|
8412
9491
|
]
|
|
8413
9492
|
});
|
|
@@ -8423,13 +9502,14 @@ function PushToTalkMic({
|
|
|
8423
9502
|
}) {
|
|
8424
9503
|
const { barRefs, isTalking } = useMicLevel(isCapturingSpeech);
|
|
8425
9504
|
const holdPushToTalk = usePointerHold(onStart, onCommit);
|
|
8426
|
-
const
|
|
9505
|
+
const copy = useChromeCopy();
|
|
9506
|
+
const label = isCapturingSpeech ? copy.micReleaseToSend : copy.micHoldToTalk;
|
|
8427
9507
|
const withLabel = isCapturingSpeech || showLabel;
|
|
8428
9508
|
return /* @__PURE__ */ jsxs17("button", {
|
|
8429
9509
|
type: "button",
|
|
8430
9510
|
"data-skippr-no-drag": "",
|
|
8431
9511
|
onPointerDown: holdPushToTalk,
|
|
8432
|
-
"aria-label":
|
|
9512
|
+
"aria-label": copy.micHoldToTalk,
|
|
8433
9513
|
"aria-pressed": isCapturingSpeech,
|
|
8434
9514
|
title: label,
|
|
8435
9515
|
"data-holding": isCapturingSpeech,
|
|
@@ -8491,12 +9571,13 @@ function StopActionsIcon({ className }) {
|
|
|
8491
9571
|
import { jsx as jsx25, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
8492
9572
|
function TapToTalkMic({ isCapturingSpeech, showLabel, onToggle }) {
|
|
8493
9573
|
const { barRefs, isTalking } = useMicLevel(isCapturingSpeech);
|
|
8494
|
-
const
|
|
9574
|
+
const copy = useChromeCopy();
|
|
9575
|
+
const label = isCapturingSpeech ? copy.micTapToSend : copy.micTapToTalk;
|
|
8495
9576
|
const withLabel = isCapturingSpeech || showLabel;
|
|
8496
9577
|
return /* @__PURE__ */ jsxs19("button", {
|
|
8497
9578
|
type: "button",
|
|
8498
9579
|
onClick: onToggle,
|
|
8499
|
-
"aria-label":
|
|
9580
|
+
"aria-label": copy.micTapToTalk,
|
|
8500
9581
|
"aria-pressed": isCapturingSpeech,
|
|
8501
9582
|
title: label,
|
|
8502
9583
|
className: cn("skippr:flex skippr:h-[38px] skippr:shrink-0 skippr:items-center skippr:justify-center skippr:gap-2 skippr:rounded-full skippr:bg-bubble skippr:text-white skippr:cursor-pointer", withLabel ? "skippr:px-3.5" : "skippr:w-[38px]", isCapturingSpeech ? "skippr:animate-skippr-rec-ring skippr:motion-reduce:animate-none" : "skippr:hover:bg-[#3a384b]"),
|
|
@@ -8544,11 +9625,17 @@ var AGENT_BARS = 4;
|
|
|
8544
9625
|
var AGENT_BAR_IDLE_HEIGHT_PX = 4;
|
|
8545
9626
|
var AGENT_BAR_MAX_GROWTH_PX = 12;
|
|
8546
9627
|
var AGENT_NOISE_GATE = 0;
|
|
8547
|
-
var
|
|
8548
|
-
idle: "
|
|
8549
|
-
listening: "
|
|
8550
|
-
thinking: "
|
|
8551
|
-
speaking: "
|
|
9628
|
+
var AGENT_STATE_COPY_KEY = {
|
|
9629
|
+
idle: "controlBarIdle",
|
|
9630
|
+
listening: "controlBarListening",
|
|
9631
|
+
thinking: "controlBarThinking",
|
|
9632
|
+
speaking: "controlBarTalking"
|
|
9633
|
+
};
|
|
9634
|
+
var AGENT_STATE_ARIA_COPY_KEY = {
|
|
9635
|
+
idle: "controlBarAriaIdle",
|
|
9636
|
+
listening: "controlBarAriaListening",
|
|
9637
|
+
thinking: "controlBarAriaThinking",
|
|
9638
|
+
speaking: "controlBarAriaTalking"
|
|
8552
9639
|
};
|
|
8553
9640
|
function AgentActivity({
|
|
8554
9641
|
state,
|
|
@@ -8561,11 +9648,15 @@ function AgentActivity({
|
|
|
8561
9648
|
maxGrowthPx: AGENT_BAR_MAX_GROWTH_PX,
|
|
8562
9649
|
noiseGate: AGENT_NOISE_GATE
|
|
8563
9650
|
});
|
|
8564
|
-
const
|
|
9651
|
+
const copy = useChromeCopy();
|
|
9652
|
+
const stateCopyKey = AGENT_STATE_COPY_KEY[state];
|
|
9653
|
+
const stateAriaCopyKey = AGENT_STATE_ARIA_COPY_KEY[state];
|
|
9654
|
+
const label = isActing ? copy.controlBarWorking : stateCopyKey ? copy[stateCopyKey] : "";
|
|
9655
|
+
const ariaLabel = isActing ? copy.controlBarAriaActing : stateAriaCopyKey ? copy[stateAriaCopyKey] : fillPlaceholders(copy.controlBarAriaState, { state });
|
|
8565
9656
|
return /* @__PURE__ */ jsxs20("span", {
|
|
8566
9657
|
role: "status",
|
|
8567
9658
|
className: "skippr:flex skippr:items-center skippr:gap-1.5 skippr:text-bubble",
|
|
8568
|
-
"aria-label":
|
|
9659
|
+
"aria-label": ariaLabel,
|
|
8569
9660
|
children: [
|
|
8570
9661
|
/* @__PURE__ */ jsx26("span", {
|
|
8571
9662
|
className: "skippr:flex skippr:size-5 skippr:shrink-0 skippr:items-center skippr:justify-center",
|
|
@@ -8645,7 +9736,7 @@ function SessionControlBar() {
|
|
|
8645
9736
|
variant,
|
|
8646
9737
|
agentControls
|
|
8647
9738
|
} = useLiveAgent();
|
|
8648
|
-
const internalCtx =
|
|
9739
|
+
const internalCtx = useContext12(LiveAgentContext);
|
|
8649
9740
|
if (!internalCtx) {
|
|
8650
9741
|
throw new Error("SessionControlBar must be used within a <LiveAgent> provider");
|
|
8651
9742
|
}
|
|
@@ -8661,6 +9752,7 @@ function SessionControlBar() {
|
|
|
8661
9752
|
const followsPanel = variant === "floating" && isPanelOpen;
|
|
8662
9753
|
const panelFollowers = followsPanel ? [panelRef] : null;
|
|
8663
9754
|
const { wasDraggedRef } = useLauncherDrag(controlBarRef, commitLauncherDrop, panelFollowers, setIsDragging);
|
|
9755
|
+
const copy = useChromeCopy();
|
|
8664
9756
|
const { isMuted, toggleMute, isScreenSharing, toggleScreenShare } = useMediaControls();
|
|
8665
9757
|
const { state, mediaStreamTrack: agentMediaStreamTrack } = useAgentVoiceState();
|
|
8666
9758
|
const { actionsActive, stopActions: stopActions2 } = useActionControl();
|
|
@@ -8680,7 +9772,7 @@ function SessionControlBar() {
|
|
|
8680
9772
|
togglePause();
|
|
8681
9773
|
}
|
|
8682
9774
|
});
|
|
8683
|
-
const [pushToTalkHintSeen, setPushToTalkHintSeen] =
|
|
9775
|
+
const [pushToTalkHintSeen, setPushToTalkHintSeen] = useState25(false);
|
|
8684
9776
|
const startPushToTalk = useCallback22(() => {
|
|
8685
9777
|
start();
|
|
8686
9778
|
reportActivity();
|
|
@@ -8698,7 +9790,7 @@ function SessionControlBar() {
|
|
|
8698
9790
|
onCommit: commitPushToTalk,
|
|
8699
9791
|
onKeyUsed: dismissPushToTalkHint
|
|
8700
9792
|
});
|
|
8701
|
-
|
|
9793
|
+
useEffect33(() => {
|
|
8702
9794
|
if (isHeld)
|
|
8703
9795
|
minimizePanel();
|
|
8704
9796
|
}, [isHeld, minimizePanel]);
|
|
@@ -8737,7 +9829,7 @@ function SessionControlBar() {
|
|
|
8737
9829
|
const panelToggleButton = /* @__PURE__ */ jsx26("button", {
|
|
8738
9830
|
type: "button",
|
|
8739
9831
|
onClick: ifNotDragged(togglePanel),
|
|
8740
|
-
"aria-label": isPanelOpen ?
|
|
9832
|
+
"aria-label": isPanelOpen ? copy.controlBarClosePanel : agendaModule && !textMode ? copy.controlBarOpenAgenda : copy.openChatLabel,
|
|
8741
9833
|
className: cn(SQUARE_BUTTON, "skippr:text-neutral-700", textMode ? "skippr:hover:bg-neutral-100" : "skippr:bg-neutral-100 skippr:hover:bg-neutral-200"),
|
|
8742
9834
|
children: /* @__PURE__ */ jsx26(MessageSquare, {
|
|
8743
9835
|
className: "skippr:size-5"
|
|
@@ -8752,7 +9844,7 @@ function SessionControlBar() {
|
|
|
8752
9844
|
className: cn("skippr:absolute skippr:bottom-full skippr:z-[10000] skippr:mb-2 skippr:max-w-[280px] skippr:rounded-[14px] skippr:bg-bubble skippr:px-3.5 skippr:py-2 skippr:text-[13px] skippr:text-white skippr:shadow-[0_10px_32px_rgba(0,0,0,0.18)] skippr:[animation:skippr-agent-in_200ms_ease-out]", position === "right" ? "skippr:right-0" : "skippr:left-0"),
|
|
8753
9845
|
children: liveUserTranscript ? liveUserTranscript : /* @__PURE__ */ jsx26("span", {
|
|
8754
9846
|
className: "skippr:text-white/60",
|
|
8755
|
-
children:
|
|
9847
|
+
children: copy.controlBarTranscriptListening
|
|
8756
9848
|
})
|
|
8757
9849
|
}),
|
|
8758
9850
|
/* @__PURE__ */ jsxs20("div", {
|
|
@@ -8777,7 +9869,7 @@ function SessionControlBar() {
|
|
|
8777
9869
|
]
|
|
8778
9870
|
}),
|
|
8779
9871
|
/* @__PURE__ */ jsx26("span", {
|
|
8780
|
-
children:
|
|
9872
|
+
children: copy.controlBarStandingBy
|
|
8781
9873
|
})
|
|
8782
9874
|
]
|
|
8783
9875
|
}),
|
|
@@ -8787,8 +9879,8 @@ function SessionControlBar() {
|
|
|
8787
9879
|
/* @__PURE__ */ jsx26("button", {
|
|
8788
9880
|
type: "button",
|
|
8789
9881
|
onClick: ifNotDragged(togglePause),
|
|
8790
|
-
"aria-label": isHeld ?
|
|
8791
|
-
title: isHeld ?
|
|
9882
|
+
"aria-label": isHeld ? copy.resumeLabel : copy.pauseLabel,
|
|
9883
|
+
title: isHeld ? copy.resumeLabel : copy.pauseLabel,
|
|
8792
9884
|
className: cn(SQUARE_BUTTON, isHeld ? "skippr:bg-bubble skippr:text-white skippr:hover:bg-[#3a384b]" : "skippr:bg-neutral-100 skippr:text-neutral-700 skippr:hover:bg-neutral-200"),
|
|
8793
9885
|
children: isHeld ? /* @__PURE__ */ jsx26(Play, {
|
|
8794
9886
|
className: "skippr:size-5",
|
|
@@ -8849,7 +9941,7 @@ function SessionControlBar() {
|
|
|
8849
9941
|
/* @__PURE__ */ jsxs20("button", {
|
|
8850
9942
|
type: "button",
|
|
8851
9943
|
onClick: ifNotDragged(() => void toggleMute()),
|
|
8852
|
-
"aria-label": isMuted ?
|
|
9944
|
+
"aria-label": isMuted ? copy.unmuteLabel : copy.muteLabel,
|
|
8853
9945
|
className: cn("skippr:group skippr:absolute skippr:top-0 skippr:left-0 skippr:z-10 skippr:flex skippr:h-[38px] skippr:items-center skippr:gap-2.5 skippr:overflow-hidden skippr:rounded-[12px] skippr:bg-bubble skippr:text-white skippr:cursor-pointer skippr:transition-[width] skippr:duration-300 skippr:ease-out", isTalking ? "skippr:justify-start skippr:pl-3.5" : "skippr:justify-center"),
|
|
8854
9946
|
style: { width: isTalking ? MIC_REGION_WIDTH : MIC_SQUARE_WIDTH },
|
|
8855
9947
|
children: [
|
|
@@ -8878,7 +9970,7 @@ function SessionControlBar() {
|
|
|
8878
9970
|
showScreenShareToggle && /* @__PURE__ */ jsx26("button", {
|
|
8879
9971
|
type: "button",
|
|
8880
9972
|
onClick: ifNotDragged(() => void toggleScreenShare()),
|
|
8881
|
-
"aria-label": isScreenSharing ?
|
|
9973
|
+
"aria-label": isScreenSharing ? copy.stopSharingScreenLabel : copy.shareScreenLabel,
|
|
8882
9974
|
className: cn(SQUARE_BUTTON, isScreenSharing ? "skippr:bg-bubble skippr:text-white skippr:hover:bg-[#3a384b]" : "skippr:bg-neutral-100 skippr:text-neutral-700 skippr:hover:bg-neutral-200"),
|
|
8883
9975
|
children: isScreenSharing ? /* @__PURE__ */ jsx26(MonitorOff, {
|
|
8884
9976
|
className: "skippr:size-5"
|
|
@@ -8890,8 +9982,8 @@ function SessionControlBar() {
|
|
|
8890
9982
|
showActionControl && /* @__PURE__ */ jsx26("button", {
|
|
8891
9983
|
type: "button",
|
|
8892
9984
|
onClick: ifNotDragged(() => void stopActions2()),
|
|
8893
|
-
"aria-label":
|
|
8894
|
-
title:
|
|
9985
|
+
"aria-label": copy.stopActionsLabel,
|
|
9986
|
+
title: copy.stopActionsLabel,
|
|
8895
9987
|
className: cn(SQUARE_BUTTON, "skippr:bg-red-100 skippr:text-red-600 skippr:hover:bg-red-200"),
|
|
8896
9988
|
children: /* @__PURE__ */ jsx26(StopActionsIcon, {
|
|
8897
9989
|
className: "skippr:size-5"
|
|
@@ -8908,7 +10000,7 @@ function SessionControlBar() {
|
|
|
8908
10000
|
type: "button",
|
|
8909
10001
|
onClick: ifNotDragged(() => void pauseSession()),
|
|
8910
10002
|
disabled: isPausing,
|
|
8911
|
-
"aria-label":
|
|
10003
|
+
"aria-label": copy.endSessionLabel,
|
|
8912
10004
|
"aria-busy": isPausing,
|
|
8913
10005
|
className: cn("skippr:absolute skippr:top-1/2 skippr:z-20 skippr:flex skippr:h-[54px] skippr:w-[50px] skippr:-mt-[27px] skippr:items-center", position === "right" ? "skippr:-right-8 skippr:justify-start skippr:pl-2.5" : "skippr:-left-8 skippr:justify-end skippr:pr-2.5", "skippr:rounded-[16px] skippr:bg-red-500 skippr:text-white", "skippr:shadow-[0_4px_14px_rgba(239,68,68,0.45)]", "skippr:transition-colors skippr:duration-150", "skippr:[animation:skippr-toolset-pop_280ms_cubic-bezier(0.22,1,0.36,1)]", isPausing ? "skippr:cursor-default" : "skippr:cursor-pointer skippr:hover:bg-red-600"),
|
|
8914
10006
|
children: /* @__PURE__ */ jsxs20("span", {
|
|
@@ -8951,7 +10043,7 @@ function SessionControlBar() {
|
|
|
8951
10043
|
}
|
|
8952
10044
|
|
|
8953
10045
|
// src/components/ShadowHost.tsx
|
|
8954
|
-
import { useLayoutEffect as useLayoutEffect2, useRef as
|
|
10046
|
+
import { useLayoutEffect as useLayoutEffect2, useRef as useRef27, useState as useState26 } from "react";
|
|
8955
10047
|
import { createPortal } from "react-dom";
|
|
8956
10048
|
import { jsx as jsx27, Fragment as Fragment3 } from "react/jsx-runtime";
|
|
8957
10049
|
var PROPERTIES_STYLE_ID = "skippr-tw-properties";
|
|
@@ -8972,10 +10064,10 @@ function ShadowHost({
|
|
|
8972
10064
|
accentColor,
|
|
8973
10065
|
className
|
|
8974
10066
|
}) {
|
|
8975
|
-
const hostRef =
|
|
8976
|
-
const [shadowRoot, setShadowRoot] =
|
|
10067
|
+
const hostRef = useRef27(null);
|
|
10068
|
+
const [shadowRoot, setShadowRoot] = useState26(null);
|
|
8977
10069
|
const css = `/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
|
|
8978
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-outline-style:solid}}}@layer theme{:root,:host{--skippr-font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--skippr-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--skippr-color-red-50:oklch(97.1% .013 17.38);--skippr-color-red-100:oklch(93.6% .032 17.717);--skippr-color-red-200:oklch(88.5% .062 18.334);--skippr-color-red-300:oklch(80.8% .114 19.571);--skippr-color-red-400:oklch(70.4% .191 22.216);--skippr-color-red-500:oklch(63.7% .237 25.331);--skippr-color-red-600:oklch(57.7% .245 27.325);--skippr-color-red-700:oklch(50.5% .213 27.518);--skippr-color-amber-50:oklch(98.7% .022 95.277);--skippr-color-amber-100:oklch(96.2% .059 95.617);--skippr-color-amber-400:oklch(82.8% .189 84.429);--skippr-color-amber-700:oklch(55.5% .163 48.998);--skippr-color-amber-950:oklch(27.9% .077 45.635);--skippr-color-emerald-400:oklch(76.5% .177 163.223);--skippr-color-neutral-100:oklch(97% 0 0);--skippr-color-neutral-200:oklch(92.2% 0 0);--skippr-color-neutral-500:oklch(55.6% 0 0);--skippr-color-neutral-700:oklch(37.1% 0 0);--skippr-color-black:#000;--skippr-color-white:#fff;--skippr-spacing:.25rem;--skippr-text-xs:.75rem;--skippr-text-xs--line-height:calc(1/.75);--skippr-text-sm:.875rem;--skippr-text-sm--line-height:calc(1.25/.875);--skippr-font-weight-medium:500;--skippr-font-weight-semibold:600;--skippr-font-weight-bold:700;--skippr-leading-snug:1.375;--skippr-leading-relaxed:1.625;--skippr-ease-out:cubic-bezier(0,0,.2,1);--skippr-ease-in-out:cubic-bezier(.4,0,.2,1);--skippr-animate-spin:spin 1s linear infinite;--skippr-animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--skippr-animate-bounce:bounce 1s infinite;--skippr-blur-sm:8px;--skippr-default-transition-duration:.15s;--skippr-default-transition-timing-function:cubic-bezier(.4,0,.2,1);--skippr-default-font-family:var(--skippr-font-sans);--skippr-default-mono-font-family:var(--skippr-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--skippr-default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--skippr-default-font-feature-settings,normal);font-variation-settings:var(--skippr-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--skippr-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--skippr-default-mono-font-feature-settings,normal);font-variation-settings:var(--skippr-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.skippr\\:pointer-events-auto{pointer-events:auto}.skippr\\:pointer-events-none{pointer-events:none}.skippr\\:absolute{position:absolute}.skippr\\:fixed{position:fixed}.skippr\\:relative{position:relative}.skippr\\:sticky{position:sticky}.skippr\\:-inset-\\[3px\\]{inset:-3px}.skippr\\:inset-0{inset:calc(var(--skippr-spacing)*0)}.skippr\\:inset-y-0{inset-block:calc(var(--skippr-spacing)*0)}.skippr\\:-top-1{top:calc(var(--skippr-spacing)*-1)}.skippr\\:-top-6{top:calc(var(--skippr-spacing)*-6)}.skippr\\:-top-8{top:calc(var(--skippr-spacing)*-8)}.skippr\\:-top-\\[2px\\]{top:-2px}.skippr\\:-top-\\[3px\\]{top:-3px}.skippr\\:-top-\\[13px\\]{top:-13px}.skippr\\:top-0{top:calc(var(--skippr-spacing)*0)}.skippr\\:top-1\\/2{top:50%}.skippr\\:top-\\[8px\\]{top:8px}.skippr\\:top-full{top:100%}.skippr\\:-right-1{right:calc(var(--skippr-spacing)*-1)}.skippr\\:-right-8{right:calc(var(--skippr-spacing)*-8)}.skippr\\:-right-\\[2px\\]{right:-2px}.skippr\\:-right-\\[6px\\]{right:-6px}.skippr\\:right-0{right:calc(var(--skippr-spacing)*0)}.skippr\\:right-3{right:calc(var(--skippr-spacing)*3)}.skippr\\:right-5{right:calc(var(--skippr-spacing)*5)}.skippr\\:right-6{right:calc(var(--skippr-spacing)*6)}.skippr\\:right-\\[4px\\]{right:4px}.skippr\\:right-\\[8px\\]{right:8px}.skippr\\:-bottom-\\[2px\\]{bottom:-2px}.skippr\\:bottom-3{bottom:calc(var(--skippr-spacing)*3)}.skippr\\:bottom-4{bottom:calc(var(--skippr-spacing)*4)}.skippr\\:bottom-20{bottom:calc(var(--skippr-spacing)*20)}.skippr\\:bottom-\\[calc\\(100\\%\\+8px\\)\\]{bottom:calc(100% + 8px)}.skippr\\:bottom-\\[calc\\(100\\%\\+11px\\)\\]{bottom:calc(100% + 11px)}.skippr\\:bottom-full{bottom:100%}.skippr\\:-left-8{left:calc(var(--skippr-spacing)*-8)}.skippr\\:-left-\\[2px\\]{left:-2px}.skippr\\:-left-\\[6px\\]{left:-6px}.skippr\\:left-0{left:calc(var(--skippr-spacing)*0)}.skippr\\:left-1\\/2{left:50%}.skippr\\:left-2{left:calc(var(--skippr-spacing)*2)}.skippr\\:left-3{left:calc(var(--skippr-spacing)*3)}.skippr\\:left-5{left:calc(var(--skippr-spacing)*5)}.skippr\\:left-6{left:calc(var(--skippr-spacing)*6)}.skippr\\:z-10{z-index:10}.skippr\\:z-20{z-index:20}.skippr\\:z-\\[1\\]{z-index:1}.skippr\\:z-\\[2\\]{z-index:2}.skippr\\:z-\\[4\\]{z-index:4}.skippr\\:z-\\[5\\]{z-index:5}.skippr\\:z-\\[6\\]{z-index:6}.skippr\\:z-\\[7\\]{z-index:7}.skippr\\:z-\\[8\\]{z-index:8}.skippr\\:z-\\[9998\\]{z-index:9998}.skippr\\:z-\\[9999\\]{z-index:9999}.skippr\\:z-\\[10000\\]{z-index:10000}.skippr\\:order-first{order:-9999}.skippr\\:order-last{order:9999}.skippr\\:mx-auto{margin-inline:auto}.skippr\\:-mt-1{margin-top:calc(var(--skippr-spacing)*-1)}.skippr\\:-mt-\\[5px\\]{margin-top:-5px}.skippr\\:-mt-\\[27px\\]{margin-top:-27px}.skippr\\:mt-0\\.5{margin-top:calc(var(--skippr-spacing)*.5)}.skippr\\:mt-1{margin-top:calc(var(--skippr-spacing)*1)}.skippr\\:mt-1\\.5{margin-top:calc(var(--skippr-spacing)*1.5)}.skippr\\:mt-2{margin-top:calc(var(--skippr-spacing)*2)}.skippr\\:mt-3{margin-top:calc(var(--skippr-spacing)*3)}.skippr\\:mt-3\\.5{margin-top:calc(var(--skippr-spacing)*3.5)}.skippr\\:mt-\\[1px\\]{margin-top:1px}.skippr\\:mt-\\[6px\\]{margin-top:6px}.skippr\\:mt-\\[8px\\]{margin-top:8px}.skippr\\:mt-\\[9px\\]{margin-top:9px}.skippr\\:-mr-1{margin-right:calc(var(--skippr-spacing)*-1)}.skippr\\:mr-7{margin-right:calc(var(--skippr-spacing)*7)}.skippr\\:mr-\\[22px\\]{margin-right:22px}.skippr\\:-mb-\\[5px\\]{margin-bottom:-5px}.skippr\\:mb-1{margin-bottom:calc(var(--skippr-spacing)*1)}.skippr\\:mb-1\\.5{margin-bottom:calc(var(--skippr-spacing)*1.5)}.skippr\\:mb-2{margin-bottom:calc(var(--skippr-spacing)*2)}.skippr\\:mb-3{margin-bottom:calc(var(--skippr-spacing)*3)}.skippr\\:mb-4{margin-bottom:calc(var(--skippr-spacing)*4)}.skippr\\:mb-\\[14px\\]{margin-bottom:14px}.skippr\\:-ml-\\[2px\\]{margin-left:-2px}.skippr\\:ml-0\\.5{margin-left:calc(var(--skippr-spacing)*.5)}.skippr\\:ml-1{margin-left:calc(var(--skippr-spacing)*1)}.skippr\\:ml-7{margin-left:calc(var(--skippr-spacing)*7)}.skippr\\:ml-auto{margin-left:auto}.skippr\\:line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.skippr\\:block{display:block}.skippr\\:flex{display:flex}.skippr\\:hidden{display:none}.skippr\\:inline-flex{display:inline-flex}.skippr\\:size-1{width:calc(var(--skippr-spacing)*1);height:calc(var(--skippr-spacing)*1)}.skippr\\:size-1\\.5{width:calc(var(--skippr-spacing)*1.5);height:calc(var(--skippr-spacing)*1.5)}.skippr\\:size-2{width:calc(var(--skippr-spacing)*2);height:calc(var(--skippr-spacing)*2)}.skippr\\:size-2\\.5{width:calc(var(--skippr-spacing)*2.5);height:calc(var(--skippr-spacing)*2.5)}.skippr\\:size-3{width:calc(var(--skippr-spacing)*3);height:calc(var(--skippr-spacing)*3)}.skippr\\:size-3\\.5{width:calc(var(--skippr-spacing)*3.5);height:calc(var(--skippr-spacing)*3.5)}.skippr\\:size-4{width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}.skippr\\:size-5{width:calc(var(--skippr-spacing)*5);height:calc(var(--skippr-spacing)*5)}.skippr\\:size-6{width:calc(var(--skippr-spacing)*6);height:calc(var(--skippr-spacing)*6)}.skippr\\:size-7{width:calc(var(--skippr-spacing)*7);height:calc(var(--skippr-spacing)*7)}.skippr\\:size-8{width:calc(var(--skippr-spacing)*8);height:calc(var(--skippr-spacing)*8)}.skippr\\:size-9{width:calc(var(--skippr-spacing)*9);height:calc(var(--skippr-spacing)*9)}.skippr\\:size-10{width:calc(var(--skippr-spacing)*10);height:calc(var(--skippr-spacing)*10)}.skippr\\:size-12{width:calc(var(--skippr-spacing)*12);height:calc(var(--skippr-spacing)*12)}.skippr\\:size-\\[3px\\]{width:3px;height:3px}.skippr\\:size-\\[4px\\]{width:4px;height:4px}.skippr\\:size-\\[5px\\]{width:5px;height:5px}.skippr\\:size-\\[6px\\]{width:6px;height:6px}.skippr\\:size-\\[7px\\]{width:7px;height:7px}.skippr\\:size-\\[8px\\]{width:8px;height:8px}.skippr\\:size-\\[9px\\]{width:9px;height:9px}.skippr\\:size-\\[10px\\]{width:10px;height:10px}.skippr\\:size-\\[11px\\]{width:11px;height:11px}.skippr\\:size-\\[12px\\]{width:12px;height:12px}.skippr\\:size-\\[13px\\]{width:13px;height:13px}.skippr\\:size-\\[14px\\]{width:14px;height:14px}.skippr\\:size-\\[15px\\]{width:15px;height:15px}.skippr\\:size-\\[16px\\]{width:16px;height:16px}.skippr\\:size-\\[17px\\]{width:17px;height:17px}.skippr\\:size-\\[18px\\]{width:18px;height:18px}.skippr\\:size-\\[19px\\]{width:19px;height:19px}.skippr\\:size-\\[20px\\]{width:20px;height:20px}.skippr\\:size-\\[22px\\]{width:22px;height:22px}.skippr\\:size-\\[26px\\]{width:26px;height:26px}.skippr\\:size-\\[28px\\]{width:28px;height:28px}.skippr\\:size-\\[30px\\]{width:30px;height:30px}.skippr\\:size-\\[32px\\]{width:32px;height:32px}.skippr\\:size-\\[34px\\]{width:34px;height:34px}.skippr\\:size-\\[38px\\]{width:38px;height:38px}.skippr\\:size-\\[46px\\]{width:46px;height:46px}.skippr\\:size-full{width:100%;height:100%}.skippr\\:h-0{height:calc(var(--skippr-spacing)*0)}.skippr\\:h-1{height:calc(var(--skippr-spacing)*1)}.skippr\\:h-1\\.5{height:calc(var(--skippr-spacing)*1.5)}.skippr\\:h-2{height:calc(var(--skippr-spacing)*2)}.skippr\\:h-3{height:calc(var(--skippr-spacing)*3)}.skippr\\:h-3\\.5{height:calc(var(--skippr-spacing)*3.5)}.skippr\\:h-5{height:calc(var(--skippr-spacing)*5)}.skippr\\:h-6{height:calc(var(--skippr-spacing)*6)}.skippr\\:h-7{height:calc(var(--skippr-spacing)*7)}.skippr\\:h-8{height:calc(var(--skippr-spacing)*8)}.skippr\\:h-9{height:calc(var(--skippr-spacing)*9)}.skippr\\:h-10{height:calc(var(--skippr-spacing)*10)}.skippr\\:h-\\[5px\\]{height:5px}.skippr\\:h-\\[11px\\]{height:11px}.skippr\\:h-\\[14px\\]{height:14px}.skippr\\:h-\\[16px\\]{height:16px}.skippr\\:h-\\[18\\.5px\\]{height:18.5px}.skippr\\:h-\\[18px\\]{height:18px}.skippr\\:h-\\[22px\\]{height:22px}.skippr\\:h-\\[24px\\]{height:24px}.skippr\\:h-\\[26px\\]{height:26px}.skippr\\:h-\\[36px\\]{height:36px}.skippr\\:h-\\[38px\\]{height:38px}.skippr\\:h-\\[48px\\]{height:48px}.skippr\\:h-\\[54px\\]{height:54px}.skippr\\:h-full{height:100%}.skippr\\:h-px{height:1px}.skippr\\:max-h-\\[132px\\]{max-height:132px}.skippr\\:min-h-0{min-height:calc(var(--skippr-spacing)*0)}.skippr\\:min-h-11{min-height:calc(var(--skippr-spacing)*11)}.skippr\\:min-h-\\[16px\\]{min-height:16px}.skippr\\:w-0{width:calc(var(--skippr-spacing)*0)}.skippr\\:w-3\\.5{width:calc(var(--skippr-spacing)*3.5)}.skippr\\:w-5{width:calc(var(--skippr-spacing)*5)}.skippr\\:w-6{width:calc(var(--skippr-spacing)*6)}.skippr\\:w-7{width:calc(var(--skippr-spacing)*7)}.skippr\\:w-10{width:calc(var(--skippr-spacing)*10)}.skippr\\:w-40{width:calc(var(--skippr-spacing)*40)}.skippr\\:w-\\[2\\.5px\\]{width:2.5px}.skippr\\:w-\\[2px\\]{width:2px}.skippr\\:w-\\[3px\\]{width:3px}.skippr\\:w-\\[9px\\]{width:9px}.skippr\\:w-\\[14px\\]{width:14px}.skippr\\:w-\\[15\\.4px\\]{width:15.4px}.skippr\\:w-\\[15px\\]{width:15px}.skippr\\:w-\\[16px\\]{width:16px}.skippr\\:w-\\[22px\\]{width:22px}.skippr\\:w-\\[36px\\]{width:36px}.skippr\\:w-\\[38px\\]{width:38px}.skippr\\:w-\\[50px\\]{width:50px}.skippr\\:w-\\[148px\\]{width:148px}.skippr\\:w-\\[150px\\]{width:150px}.skippr\\:w-\\[220px\\]{width:220px}.skippr\\:w-\\[225px\\]{width:225px}.skippr\\:w-\\[240px\\]{width:240px}.skippr\\:w-\\[255px\\]{width:255px}.skippr\\:w-\\[320px\\]{width:320px}.skippr\\:w-fit{width:fit-content}.skippr\\:w-full{width:100%}.skippr\\:w-px{width:1px}.skippr\\:max-w-64{max-width:calc(var(--skippr-spacing)*64)}.skippr\\:max-w-72{max-width:calc(var(--skippr-spacing)*72)}.skippr\\:max-w-\\[80\\%\\]{max-width:80%}.skippr\\:max-w-\\[280px\\]{max-width:280px}.skippr\\:min-w-0{min-width:calc(var(--skippr-spacing)*0)}.skippr\\:min-w-11{min-width:calc(var(--skippr-spacing)*11)}.skippr\\:min-w-\\[96px\\]{min-width:96px}.skippr\\:flex-1{flex:1}.skippr\\:shrink-0{flex-shrink:0}.skippr\\:origin-bottom{transform-origin:bottom}.skippr\\:origin-bottom-left{transform-origin:0 100%}.skippr\\:origin-bottom-right{transform-origin:100% 100%}.skippr\\:origin-center{transform-origin:50%}.skippr\\:origin-left{transform-origin:0}.skippr\\:origin-right{transform-origin:100%}.skippr\\:origin-top{transform-origin:top}.skippr\\:origin-top-left{transform-origin:0 0}.skippr\\:origin-top-right{transform-origin:100% 0}.skippr\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-x-3{--tw-translate-x:calc(var(--skippr-spacing)*-3);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-x-7{--tw-translate-x:calc(var(--skippr-spacing)*-7);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:translate-x-3{--tw-translate-x:calc(var(--skippr-spacing)*3);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:translate-x-7{--tw-translate-x:calc(var(--skippr-spacing)*7);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-y-\\[4px\\]{--tw-translate-y:calc(4px*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-\\[0\\.94\\]{scale:.94}.skippr\\:-rotate-90{rotate:-90deg}.skippr\\:rotate-45{rotate:45deg}.skippr\\:rotate-\\[225deg\\]{rotate:225deg}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out\\]{animation:.2s ease-out skippr-agent-in}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out_240ms_both\\]{animation:.2s ease-out .24s both skippr-agent-in}.skippr\\:\\[animation\\:skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:\\[animation\\:skippr-block-reveal_320ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.32s cubic-bezier(.22,1,.36,1) skippr-block-reveal}.skippr\\:\\[animation\\:skippr-breathe_1\\.1s_ease-in-out_0\\.18s_infinite\\]{animation:1.1s ease-in-out .18s infinite skippr-breathe}.skippr\\:\\[animation\\:skippr-breathe_1\\.1s_ease-in-out_0\\.36s_infinite\\]{animation:1.1s ease-in-out .36s infinite skippr-breathe}.skippr\\:\\[animation\\:skippr-breathe_1\\.1s_ease-in-out_0s_infinite\\]{animation:1.1s ease-in-out infinite skippr-breathe}.skippr\\:\\[animation\\:skippr-evaporate_3\\.2s_ease-in_forwards\\]{animation:3.2s ease-in forwards skippr-evaporate}.skippr\\:\\[animation\\:skippr-fade-in_0\\.2s_ease\\]{animation:.2s skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-in_0\\.16s_ease\\]{animation:.16s skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-in_0\\.22s_ease\\]{animation:.22s skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-in_0\\.24s_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.24s cubic-bezier(.22,1,.36,1) skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-in_0\\.25s_ease\\]{animation:.25s skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-out_0\\.18s_ease-in_forwards\\]{animation:.18s ease-in forwards skippr-fade-out}.skippr\\:\\[animation\\:skippr-finger-tap_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-finger-tap}.skippr\\:\\[animation\\:skippr-mote-rise_1\\.6s_ease-out_infinite\\]{animation:1.6s ease-out infinite skippr-mote-rise}.skippr\\:\\[animation\\:skippr-orb-in_320ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)\\]{animation:.32s cubic-bezier(.34,1.3,.64,1) skippr-orb-in}.skippr\\:\\[animation\\:skippr-pop_0\\.2s_ease\\]{animation:.2s skippr-pop}.skippr\\:\\[animation\\:skippr-stage-fade_240ms_ease-out\\]{animation:.24s ease-out skippr-stage-fade}.skippr\\:\\[animation\\:skippr-tip-in_360ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)\\]{animation:.36s cubic-bezier(.34,1.3,.64,1) skippr-tip-in}.skippr\\:\\[animation\\:skippr-tip-in_360ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)_backwards\\]{animation:.36s cubic-bezier(.34,1.3,.64,1) backwards skippr-tip-in}.skippr\\:\\[animation\\:skippr-toolset-pop_280ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.28s cubic-bezier(.22,1,.36,1) skippr-toolset-pop}.skippr\\:\\[animation\\:skippr-toolset-pop_440ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.44s cubic-bezier(.22,1,.36,1) skippr-toolset-pop}.skippr\\:animate-\\[skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:animate-\\[skippr-bubble-in_0\\.28s_ease-out\\]{animation:.28s ease-out skippr-bubble-in}.skippr\\:animate-\\[skippr-fade-in_0\\.3s_ease-out\\]{animation:.3s ease-out skippr-fade-in}.skippr\\:animate-\\[skippr-pill-content_0\\.22s_ease-out\\]{animation:.22s ease-out skippr-pill-content}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.3s_infinite\\]{animation:1.1s ease-in-out .3s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.6s_infinite\\]{animation:1.1s ease-in-out .6s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.15s_infinite\\]{animation:1.1s ease-in-out .15s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.45s_infinite\\]{animation:1.1s ease-in-out .45s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-speak}.skippr\\:animate-bounce{animation:var(--skippr-animate-bounce)}.skippr\\:animate-ping{animation:var(--skippr-animate-ping)}.skippr\\:animate-skippr-annotation-pulse{animation:1.8s ease-in-out infinite skippr-annotation-pulse}.skippr\\:animate-skippr-click-ping{animation:.5s ease-out forwards skippr-click-ping}.skippr\\:animate-skippr-cursor-pop{animation:.22s ease-out skippr-cursor-pop}.skippr\\:animate-skippr-flow{animation:3.6s linear infinite skippr-flow}.skippr\\:animate-skippr-press{animation:.5s ease-in-out skippr-press}.skippr\\:animate-skippr-ptt-transmit{animation:1.4s ease-out infinite skippr-ptt-transmit}.skippr\\:animate-skippr-rec-ring{animation:2s ease-out infinite skippr-rec-ring}.skippr\\:animate-skippr-tab-fade{animation:.2s ease-out skippr-tab-fade}.skippr\\:animate-skippr-thinking-dot{animation:1.2s ease-in-out infinite skippr-thinking-dot}.skippr\\:animate-skippr-voice-pulse{animation:1.6s ease-out infinite skippr-voice-pulse}.skippr\\:animate-spin{animation:var(--skippr-animate-spin)}.skippr\\:cursor-default{cursor:default}.skippr\\:cursor-grab{cursor:grab}.skippr\\:cursor-not-allowed{cursor:not-allowed}.skippr\\:cursor-pointer{cursor:pointer}.skippr\\:touch-none{touch-action:none}.skippr\\:resize-none{resize:none}.skippr\\:appearance-none{appearance:none}.skippr\\:flex-col{flex-direction:column}.skippr\\:flex-col-reverse{flex-direction:column-reverse}.skippr\\:flex-row{flex-direction:row}.skippr\\:flex-row-reverse{flex-direction:row-reverse}.skippr\\:items-baseline{align-items:baseline}.skippr\\:items-center{align-items:center}.skippr\\:items-end{align-items:flex-end}.skippr\\:items-start{align-items:flex-start}.skippr\\:justify-between{justify-content:space-between}.skippr\\:justify-center{justify-content:center}.skippr\\:justify-end{justify-content:flex-end}.skippr\\:justify-start{justify-content:flex-start}.skippr\\:gap-0\\.5{gap:calc(var(--skippr-spacing)*.5)}.skippr\\:gap-1{gap:calc(var(--skippr-spacing)*1)}.skippr\\:gap-1\\.5{gap:calc(var(--skippr-spacing)*1.5)}.skippr\\:gap-2{gap:calc(var(--skippr-spacing)*2)}.skippr\\:gap-2\\.5{gap:calc(var(--skippr-spacing)*2.5)}.skippr\\:gap-3{gap:calc(var(--skippr-spacing)*3)}.skippr\\:gap-\\[1px\\]{gap:1px}.skippr\\:gap-\\[2px\\]{gap:2px}.skippr\\:gap-\\[3px\\]{gap:3px}.skippr\\:gap-\\[4px\\]{gap:4px}.skippr\\:gap-\\[5px\\]{gap:5px}.skippr\\:gap-\\[6px\\]{gap:6px}.skippr\\:gap-\\[7px\\]{gap:7px}.skippr\\:gap-\\[8px\\]{gap:8px}.skippr\\:gap-\\[9px\\]{gap:9px}.skippr\\:gap-\\[10px\\]{gap:10px}.skippr\\:gap-\\[14px\\]{gap:14px}.skippr\\:gap-px{gap:1px}:where(.skippr\\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-\\[6px\\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(6px*var(--tw-space-y-reverse));margin-block-end:calc(6px*calc(1 - var(--tw-space-y-reverse)))}.skippr\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.skippr\\:overflow-hidden{overflow:hidden}.skippr\\:overflow-visible{overflow:visible}.skippr\\:overflow-y-auto{overflow-y:auto}.skippr\\:overscroll-contain{overscroll-behavior:contain}.skippr\\:rounded{border-radius:.25rem}.skippr\\:rounded-2xl{border-radius:1.125rem}.skippr\\:rounded-\\[1rem\\]{border-radius:1rem}.skippr\\:rounded-\\[4px\\]{border-radius:4px}.skippr\\:rounded-\\[5px\\]{border-radius:5px}.skippr\\:rounded-\\[10px\\]{border-radius:10px}.skippr\\:rounded-\\[11px\\]{border-radius:11px}.skippr\\:rounded-\\[12px\\]{border-radius:12px}.skippr\\:rounded-\\[14px\\]{border-radius:14px}.skippr\\:rounded-\\[16px\\]{border-radius:16px}.skippr\\:rounded-\\[20px\\]{border-radius:20px}.skippr\\:rounded-full{border-radius:3.40282e38px}.skippr\\:rounded-md{border-radius:.5rem}.skippr\\:rounded-sm{border-radius:.375rem}.skippr\\:rounded-xl{border-radius:.875rem}.skippr\\:rounded-t-\\[6px\\]{border-top-left-radius:6px;border-top-right-radius:6px}.skippr\\:rounded-t-\\[18px\\]{border-top-left-radius:18px;border-top-right-radius:18px}.skippr\\:rounded-t-full{border-top-left-radius:3.40282e38px;border-top-right-radius:3.40282e38px}.skippr\\:rounded-l-\\[6px\\]{border-top-left-radius:6px;border-bottom-left-radius:6px}.skippr\\:rounded-l-\\[18px\\]{border-top-left-radius:18px;border-bottom-left-radius:18px}.skippr\\:rounded-l-full{border-top-left-radius:3.40282e38px;border-bottom-left-radius:3.40282e38px}.skippr\\:rounded-tl-\\[6px\\]{border-top-left-radius:6px}.skippr\\:rounded-tl-md{border-top-left-radius:.5rem}.skippr\\:rounded-r-\\[6px\\]{border-top-right-radius:6px;border-bottom-right-radius:6px}.skippr\\:rounded-r-\\[18px\\]{border-top-right-radius:18px;border-bottom-right-radius:18px}.skippr\\:rounded-r-full{border-top-right-radius:3.40282e38px;border-bottom-right-radius:3.40282e38px}.skippr\\:rounded-tr-\\[6px\\]{border-top-right-radius:6px}.skippr\\:rounded-b-\\[6px\\]{border-bottom-right-radius:6px;border-bottom-left-radius:6px}.skippr\\:rounded-b-\\[18px\\]{border-bottom-right-radius:18px;border-bottom-left-radius:18px}.skippr\\:rounded-b-full{border-bottom-right-radius:3.40282e38px;border-bottom-left-radius:3.40282e38px}.skippr\\:rounded-bl-\\[6px\\]{border-bottom-left-radius:6px}.skippr\\:border{border-style:var(--tw-border-style);border-width:1px}.skippr\\:border-0{border-style:var(--tw-border-style);border-width:0}.skippr\\:border-2{border-style:var(--tw-border-style);border-width:2px}.skippr\\:border-\\[2\\.5px\\]{border-style:var(--tw-border-style);border-width:2.5px}.skippr\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.skippr\\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.skippr\\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.skippr\\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.skippr\\:border-none{--tw-border-style:none;border-style:none}.skippr\\:border-\\[\\#d8d3ca\\]{border-color:#d8d3ca}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.1\\)\\]{border-color:#2d2d3f1a}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.06\\)\\]{border-color:#2d2d3f0f}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.08\\)\\]{border-color:#2d2d3f14}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.12\\)\\]{border-color:#2d2d3f1f}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.14\\)\\]{border-color:#2d2d3f24}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.28\\)\\]{border-color:#2d2d3f47}.skippr\\:border-\\[var\\(--skippr-brand-ring\\)\\]{border-color:var(--skippr-brand-ring)}.skippr\\:border-black\\/25{border-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-black\\/25{border-color:color-mix(in oklab,var(--skippr-color-black)25%,transparent)}}.skippr\\:border-border{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-brand{border-color:var(--skippr-brand,#2bc0ae)}.skippr\\:border-input{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-primary,.skippr\\:border-primary\\/20{border-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-primary\\/20{border-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)20%,transparent)}}.skippr\\:border-transparent{border-color:#0000}.skippr\\:border-white,.skippr\\:border-white\\/30{border-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-white\\/30{border-color:color-mix(in oklab,var(--skippr-color-white)30%,transparent)}}.skippr\\:border-t-brand{border-top-color:var(--skippr-brand,#2bc0ae)}.skippr\\:border-t-white{border-top-color:var(--skippr-color-white)}.skippr\\:border-r-border{border-right-color:oklch(92.3% .003 48.717)}.skippr\\:border-l-border{border-left-color:oklch(92.3% .003 48.717)}.skippr\\:bg-\\[\\#2D2D3F\\]{background-color:#2d2d3f}.skippr\\:bg-\\[\\#F1EFEA\\]{background-color:#f1efea}.skippr\\:bg-\\[\\#b9b4ab\\]{background-color:#b9b4ab}.skippr\\:bg-\\[\\#dc2626\\]{background-color:#dc2626}.skippr\\:bg-\\[\\#eeeae4\\]{background-color:#eeeae4}.skippr\\:bg-\\[\\#f2f0eb\\]{background-color:#f2f0eb}.skippr\\:bg-\\[\\#f4ecd8\\]{background-color:#f4ecd8}.skippr\\:bg-\\[\\#f4f2ee\\]{background-color:#f4f2ee}.skippr\\:bg-\\[rgba\\(45\\,45\\,63\\,0\\.03\\)\\]{background-color:#2d2d3f08}.skippr\\:bg-amber-50{background-color:var(--skippr-color-amber-50)}.skippr\\:bg-amber-400{background-color:var(--skippr-color-amber-400)}.skippr\\:bg-background{background-color:oklch(100% 0 0)}.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:color-mix(in oklab,var(--skippr-color-black)7.0%,transparent)}}.skippr\\:bg-brand,.skippr\\:bg-brand\\/50{background-color:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-brand\\/50{background-color:color-mix(in oklab,var(--skippr-brand,#2bc0ae)50%,transparent)}}.skippr\\:bg-bubble{background-color:#2d2b3d}.skippr\\:bg-bubble\\/95{background-color:oklab(29.9244% .0107414 -.0305411/.95)}.skippr\\:bg-card{background-color:oklch(100% 0 0)}.skippr\\:bg-current{background-color:currentColor}.skippr\\:bg-destructive{background-color:#d94f4f}.skippr\\:bg-emerald-400{background-color:var(--skippr-color-emerald-400)}.skippr\\:bg-foreground{background-color:oklch(14.7% .004 49.25)}.skippr\\:bg-foreground\\/10{background-color:oklab(14.7% .00261104 .00303026/.1)}.skippr\\:bg-launcher{background-color:#2d2d3f}.skippr\\:bg-muted-foreground\\/40{background-color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:bg-neutral-100{background-color:var(--skippr-color-neutral-100)}.skippr\\:bg-primary,.skippr\\:bg-primary\\/10{background-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-primary\\/10{background-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)10%,transparent)}}.skippr\\:bg-red-50{background-color:var(--skippr-color-red-50)}.skippr\\:bg-red-100{background-color:var(--skippr-color-red-100)}.skippr\\:bg-red-500{background-color:var(--skippr-color-red-500)}.skippr\\:bg-secondary{background-color:#ffdfb5}.skippr\\:bg-transparent{background-color:#0000}.skippr\\:bg-white,.skippr\\:bg-white\\/70{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/70{background-color:color-mix(in oklab,var(--skippr-color-white)70%,transparent)}}.skippr\\:bg-white\\/80{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/80{background-color:color-mix(in oklab,var(--skippr-color-white)80%,transparent)}}.skippr\\:bg-white\\/95{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/95{background-color:color-mix(in oklab,var(--skippr-color-white)95%,transparent)}}.skippr\\:fill-brand{fill:var(--skippr-brand,#2bc0ae)}.skippr\\:fill-current{fill:currentColor}.skippr\\:fill-primary\\/30{fill:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:fill-primary\\/30{fill:color-mix(in oklab,var(--skippr-brand,#2d2b3d)30%,transparent)}}.skippr\\:fill-white{fill:var(--skippr-color-white)}.skippr\\:stroke-black\\/15{stroke:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:stroke-black\\/15{stroke:color-mix(in oklab,var(--skippr-color-black)15%,transparent)}}.skippr\\:stroke-bubble{stroke:#2d2b3d}.skippr\\:object-contain{object-fit:contain}.skippr\\:object-cover{object-fit:cover}.skippr\\:p-0{padding:calc(var(--skippr-spacing)*0)}.skippr\\:p-1\\.5{padding:calc(var(--skippr-spacing)*1.5)}.skippr\\:p-2{padding:calc(var(--skippr-spacing)*2)}.skippr\\:p-3{padding:calc(var(--skippr-spacing)*3)}.skippr\\:p-3\\.5{padding:calc(var(--skippr-spacing)*3.5)}.skippr\\:p-4{padding:calc(var(--skippr-spacing)*4)}.skippr\\:p-\\[2px\\]{padding:2px}.skippr\\:p-\\[3px\\]{padding:3px}.skippr\\:p-\\[9px\\]{padding:9px}.skippr\\:p-\\[14px\\]{padding:14px}.skippr\\:px-1{padding-inline:calc(var(--skippr-spacing)*1)}.skippr\\:px-1\\.5{padding-inline:calc(var(--skippr-spacing)*1.5)}.skippr\\:px-2{padding-inline:calc(var(--skippr-spacing)*2)}.skippr\\:px-2\\.5{padding-inline:calc(var(--skippr-spacing)*2.5)}.skippr\\:px-3{padding-inline:calc(var(--skippr-spacing)*3)}.skippr\\:px-3\\.5{padding-inline:calc(var(--skippr-spacing)*3.5)}.skippr\\:px-4{padding-inline:calc(var(--skippr-spacing)*4)}.skippr\\:px-5{padding-inline:calc(var(--skippr-spacing)*5)}.skippr\\:px-6{padding-inline:calc(var(--skippr-spacing)*6)}.skippr\\:px-8{padding-inline:calc(var(--skippr-spacing)*8)}.skippr\\:px-\\[5px\\]{padding-inline:5px}.skippr\\:px-\\[7px\\]{padding-inline:7px}.skippr\\:px-\\[9px\\]{padding-inline:9px}.skippr\\:px-\\[10px\\]{padding-inline:10px}.skippr\\:px-\\[11px\\]{padding-inline:11px}.skippr\\:px-\\[12px\\]{padding-inline:12px}.skippr\\:px-\\[18px\\]{padding-inline:18px}.skippr\\:px-\\[22px\\]{padding-inline:22px}.skippr\\:py-0\\.5{padding-block:calc(var(--skippr-spacing)*.5)}.skippr\\:py-1{padding-block:calc(var(--skippr-spacing)*1)}.skippr\\:py-1\\.5{padding-block:calc(var(--skippr-spacing)*1.5)}.skippr\\:py-2{padding-block:calc(var(--skippr-spacing)*2)}.skippr\\:py-2\\.5{padding-block:calc(var(--skippr-spacing)*2.5)}.skippr\\:py-3{padding-block:calc(var(--skippr-spacing)*3)}.skippr\\:py-4{padding-block:calc(var(--skippr-spacing)*4)}.skippr\\:py-6{padding-block:calc(var(--skippr-spacing)*6)}.skippr\\:py-\\[1px\\]{padding-block:1px}.skippr\\:py-\\[3px\\]{padding-block:3px}.skippr\\:py-\\[4px\\]{padding-block:4px}.skippr\\:py-\\[5px\\]{padding-block:5px}.skippr\\:py-\\[6px\\]{padding-block:6px}.skippr\\:py-\\[7px\\]{padding-block:7px}.skippr\\:py-\\[13px\\]{padding-block:13px}.skippr\\:pt-1{padding-top:calc(var(--skippr-spacing)*1)}.skippr\\:pt-5{padding-top:calc(var(--skippr-spacing)*5)}.skippr\\:pt-\\[8px\\]{padding-top:8px}.skippr\\:pt-\\[9px\\]{padding-top:9px}.skippr\\:pt-\\[10px\\]{padding-top:10px}.skippr\\:pt-\\[18px\\]{padding-top:18px}.skippr\\:pt-\\[22px\\]{padding-top:22px}.skippr\\:pr-2\\.5{padding-right:calc(var(--skippr-spacing)*2.5)}.skippr\\:pr-3{padding-right:calc(var(--skippr-spacing)*3)}.skippr\\:pr-\\[5px\\]{padding-right:5px}.skippr\\:pr-\\[6px\\]{padding-right:6px}.skippr\\:pr-\\[9px\\]{padding-right:9px}.skippr\\:pr-\\[10px\\]{padding-right:10px}.skippr\\:pb-0\\.5{padding-bottom:calc(var(--skippr-spacing)*.5)}.skippr\\:pb-1{padding-bottom:calc(var(--skippr-spacing)*1)}.skippr\\:pb-4{padding-bottom:calc(var(--skippr-spacing)*4)}.skippr\\:pb-\\[8px\\]{padding-bottom:8px}.skippr\\:pb-\\[10px\\]{padding-bottom:10px}.skippr\\:pb-\\[22px\\]{padding-bottom:22px}.skippr\\:pl-1\\.5{padding-left:calc(var(--skippr-spacing)*1.5)}.skippr\\:pl-2\\.5{padding-left:calc(var(--skippr-spacing)*2.5)}.skippr\\:pl-3\\.5{padding-left:calc(var(--skippr-spacing)*3.5)}.skippr\\:pl-\\[9px\\]{padding-left:9px}.skippr\\:pl-\\[13px\\]{padding-left:13px}.skippr\\:text-center{text-align:center}.skippr\\:text-left{text-align:left}.skippr\\:font-mono{font-family:var(--skippr-font-mono)}.skippr\\:text-sm{font-size:var(--skippr-text-sm);line-height:var(--tw-leading,var(--skippr-text-sm--line-height))}.skippr\\:text-xs{font-size:var(--skippr-text-xs);line-height:var(--tw-leading,var(--skippr-text-xs--line-height))}.skippr\\:text-\\[8\\.5px\\]{font-size:8.5px}.skippr\\:text-\\[9\\.5px\\]{font-size:9.5px}.skippr\\:text-\\[9px\\]{font-size:9px}.skippr\\:text-\\[10\\.5px\\]{font-size:10.5px}.skippr\\:text-\\[10px\\]{font-size:10px}.skippr\\:text-\\[11\\.5px\\]{font-size:11.5px}.skippr\\:text-\\[11px\\]{font-size:11px}.skippr\\:text-\\[12\\.5px\\]{font-size:12.5px}.skippr\\:text-\\[12px\\]{font-size:12px}.skippr\\:text-\\[13px\\]{font-size:13px}.skippr\\:text-\\[14px\\]{font-size:14px}.skippr\\:text-\\[16px\\]{font-size:16px}.skippr\\:text-\\[18px\\]{font-size:18px}.skippr\\:leading-5{--tw-leading:calc(var(--skippr-spacing)*5);line-height:calc(var(--skippr-spacing)*5)}.skippr\\:leading-\\[1\\.2\\]{--tw-leading:1.2;line-height:1.2}.skippr\\:leading-\\[1\\.25\\]{--tw-leading:1.25;line-height:1.25}.skippr\\:leading-none{--tw-leading:1;line-height:1}.skippr\\:leading-relaxed{--tw-leading:var(--skippr-leading-relaxed);line-height:var(--skippr-leading-relaxed)}.skippr\\:leading-snug{--tw-leading:var(--skippr-leading-snug);line-height:var(--skippr-leading-snug)}.skippr\\:font-bold{--tw-font-weight:var(--skippr-font-weight-bold);font-weight:var(--skippr-font-weight-bold)}.skippr\\:font-medium{--tw-font-weight:var(--skippr-font-weight-medium);font-weight:var(--skippr-font-weight-medium)}.skippr\\:font-semibold{--tw-font-weight:var(--skippr-font-weight-semibold);font-weight:var(--skippr-font-weight-semibold)}.skippr\\:tracking-\\[-0\\.01em\\]{--tw-tracking:-.01em;letter-spacing:-.01em}.skippr\\:tracking-\\[-0\\.0125em\\]{--tw-tracking:-.0125em;letter-spacing:-.0125em}.skippr\\:tracking-\\[0\\.02em\\]{--tw-tracking:.02em;letter-spacing:.02em}.skippr\\:tracking-\\[0\\.05em\\]{--tw-tracking:.05em;letter-spacing:.05em}.skippr\\:whitespace-nowrap{white-space:nowrap}.skippr\\:text-\\[\\#2D2D3F\\]{color:#2d2d3f}.skippr\\:text-\\[\\#5a5650\\]{color:#5a5650}.skippr\\:text-\\[\\#5c5850\\]{color:#5c5850}.skippr\\:text-\\[\\#6b6660\\]{color:#6b6660}.skippr\\:text-\\[\\#6b6875\\]{color:#6b6875}.skippr\\:text-\\[\\#8b877f\\]{color:#8b877f}.skippr\\:text-\\[\\#92400e\\]{color:#92400e}.skippr\\:text-\\[\\#a8a49c\\]{color:#a8a49c}.skippr\\:text-\\[\\#b8b4ac\\]{color:#b8b4ac}.skippr\\:text-\\[\\#c9c5bd\\]{color:#c9c5bd}.skippr\\:text-\\[\\#cbc7bf\\]{color:#cbc7bf}.skippr\\:text-\\[\\#dc2626\\]{color:#dc2626}.skippr\\:text-\\[var\\(--skippr-brand-deep\\)\\]{color:var(--skippr-brand-deep)}.skippr\\:text-amber-700{color:var(--skippr-color-amber-700)}.skippr\\:text-amber-950{color:var(--skippr-color-amber-950)}.skippr\\:text-background{color:oklch(100% 0 0)}.skippr\\:text-black,.skippr\\:text-black\\/40{color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-black\\/40{color:color-mix(in oklab,var(--skippr-color-black)40%,transparent)}}.skippr\\:text-brand{color:var(--skippr-brand,#2bc0ae)}.skippr\\:text-brand-on-white{color:var(--skippr-brand-on-white,#1e8478)}.skippr\\:text-bubble{color:#2d2b3d}.skippr\\:text-chart-3{color:oklch(66.6% .179 58.318)}.skippr\\:text-destructive{color:#d94f4f}.skippr\\:text-foreground{color:oklch(14.7% .004 49.25)}.skippr\\:text-muted-foreground{color:oklch(55.3% .013 58.071)}.skippr\\:text-muted-foreground\\/30{color:oklab(55.3% .00687528 .0110332/.3)}.skippr\\:text-muted-foreground\\/60{color:oklab(55.3% .00687528 .0110332/.6)}.skippr\\:text-neutral-500{color:var(--skippr-color-neutral-500)}.skippr\\:text-neutral-700{color:var(--skippr-color-neutral-700)}.skippr\\:text-primary{color:var(--skippr-brand,#2d2b3d)}.skippr\\:text-primary-foreground{color:var(--skippr-brand-foreground,#fff)}.skippr\\:text-red-400{color:var(--skippr-color-red-400)}.skippr\\:text-red-600{color:var(--skippr-color-red-600)}.skippr\\:text-red-700{color:var(--skippr-color-red-700)}.skippr\\:text-secondary-foreground{color:#613700}.skippr\\:text-white,.skippr\\:text-white\\/60{color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-white\\/60{color:color-mix(in oklab,var(--skippr-color-white)60%,transparent)}}.skippr\\:capitalize{text-transform:capitalize}.skippr\\:uppercase{text-transform:uppercase}.skippr\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.skippr\\:line-through{text-decoration-line:line-through}.skippr\\:underline{text-decoration-line:underline}.skippr\\:decoration-muted-foreground\\/40{text-decoration-color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:underline-offset-2,.skippr\\:underline-offset-\\[2px\\]{text-underline-offset:2px}.skippr\\:placeholder-muted-foreground::placeholder{color:oklch(55.3% .013 58.071)}.skippr\\:opacity-0{opacity:0}.skippr\\:opacity-40{opacity:.4}.skippr\\:opacity-75{opacity:.75}.skippr\\:opacity-85{opacity:.85}.skippr\\:opacity-100{opacity:1}.skippr\\:shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[-3px_0_14px_var\\(--skippr-brand-halo\\)\\]{--tw-shadow:-3px 0 14px var(--tw-shadow-color,var(--skippr-brand-halo));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[-4px_6px_18px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:-4px 6px 18px var(--tw-shadow-color,#2d2d3f29);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[-6px_8px_30px_rgba\\(15\\,18\\,26\\,0\\.32\\)\\]{--tw-shadow:-6px 8px 30px var(--tw-shadow-color,#0f121a52);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_-3px_14px_var\\(--skippr-brand-halo\\)\\]{--tw-shadow:0 -3px 14px var(--tw-shadow-color,var(--skippr-brand-halo));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_-6px_18px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:0 -6px 18px var(--tw-shadow-color,#2d2d3f29);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_0_0_1\\.5px_rgba\\(255\\,255\\,255\\,0\\.85\\)\\]{--tw-shadow:0 0 0 1.5px var(--tw-shadow-color,#ffffffd9);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_0_0_1px_rgba\\(45\\,45\\,63\\,0\\.10\\)\\,0_1px_2px_rgba\\(45\\,45\\,63\\,0\\.04\\)\\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,#2d2d3f1a),0 1px 2px var(--tw-shadow-color,#2d2d3f0a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_0_0_4px_var\\(--skippr-brand-ring\\)\\]{--tw-shadow:0 0 0 4px var(--tw-shadow-color,var(--skippr-brand-ring));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_1px_2px_rgba\\(45\\,45\\,63\\,0\\.05\\)\\]{--tw-shadow:0 1px 2px var(--tw-shadow-color,#2d2d3f0d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_1px_2px_rgba\\(45\\,45\\,63\\,0\\.08\\)\\]{--tw-shadow:0 1px 2px var(--tw-shadow-color,#2d2d3f14);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_2px_6px_rgba\\(0\\,0\\,0\\,0\\.28\\)\\]{--tw-shadow:0 2px 6px var(--tw-shadow-color,#00000047);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_2px_6px_rgba\\(45\\,45\\,63\\,0\\.14\\)\\]{--tw-shadow:0 2px 6px var(--tw-shadow-color,#2d2d3f24);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_3px_14px_var\\(--skippr-brand-halo\\)\\]{--tw-shadow:0 3px 14px var(--tw-shadow-color,var(--skippr-brand-halo));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_12px_rgba\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow:0 4px 12px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_12px_rgba\\(45\\,45\\,63\\,0\\.1\\)\\]{--tw-shadow:0 4px 12px var(--tw-shadow-color,#2d2d3f1a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_14px_rgba\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_14px_rgba\\(239\\,68\\,68\\,0\\.45\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#ef444473);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_16px_rgba\\(45\\,43\\,61\\,0\\.45\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#2d2b3d73),0 2px 4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_6px_16px_rgba\\(45\\,45\\,63\\,0\\.14\\)\\]{--tw-shadow:0 6px 16px var(--tw-shadow-color,#2d2d3f24);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_6px_18px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:0 6px 18px var(--tw-shadow-color,#2d2d3f29);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_22px_rgba\\(45\\,45\\,63\\,0\\.12\\)\\,0_1px_3px_rgba\\(45\\,45\\,63\\,0\\.04\\)\\]{--tw-shadow:0 8px 22px var(--tw-shadow-color,#2d2d3f1f),0 1px 3px var(--tw-shadow-color,#2d2d3f0a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(45\\,43\\,61\\,0\\.35\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#2d2b3d59);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_30px_rgba\\(45\\,45\\,63\\,0\\.14\\)\\,0_2px_6px_rgba\\(45\\,45\\,63\\,0\\.06\\)\\]{--tw-shadow:0 8px 30px var(--tw-shadow-color,#2d2d3f24),0 2px 6px var(--tw-shadow-color,#2d2d3f0f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_26px_rgba\\(45\\,45\\,63\\,0\\.13\\)\\,0_2px_6px_rgba\\(45\\,45\\,63\\,0\\.05\\)\\]{--tw-shadow:0 10px 26px var(--tw-shadow-color,#2d2d3f21),0 2px 6px var(--tw-shadow-color,#2d2d3f0d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_28px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:0 10px 28px var(--tw-shadow-color,#2d2d3f29);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_30px_rgba\\(45\\,45\\,63\\,0\\.14\\)\\,0_0_0_1\\.5px_var\\(--skippr-brand-ring\\)\\]{--tw-shadow:0 10px 30px var(--tw-shadow-color,#2d2d3f24),0 0 0 1.5px var(--tw-shadow-color,var(--skippr-brand-ring));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_32px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 10px 32px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_14px_34px_rgba\\(45\\,45\\,63\\,0\\.15\\)\\,0_2px_6px_rgba\\(45\\,45\\,63\\,0\\.06\\)\\]{--tw-shadow:0 14px 34px var(--tw-shadow-color,#2d2d3f26),0 2px 6px var(--tw-shadow-color,#2d2d3f0f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[3px_0_14px_var\\(--skippr-brand-halo\\)\\]{--tw-shadow:3px 0 14px var(--tw-shadow-color,var(--skippr-brand-halo));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[4px_6px_18px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:4px 6px 18px var(--tw-shadow-color,#2d2d3f29);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[inset_0_0_0_1\\.5px_var\\(--skippr-brand\\,\\#2bc0ae\\)\\]{--tw-shadow:inset 0 0 0 1.5px var(--tw-shadow-color,var(--skippr-brand,#2bc0ae));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-black\\/5{--tw-ring-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-black\\/5{--tw-ring-color:color-mix(in oklab,var(--skippr-color-black)5%,transparent)}}.skippr\\:ring-brand{--tw-ring-color:var(--skippr-brand,#2bc0ae)}.skippr\\:ring-white\\/15{--tw-ring-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-white\\/15{--tw-ring-color:color-mix(in oklab,var(--skippr-color-white)15%,transparent)}}.skippr\\:ring-offset-background{--tw-ring-offset-color:oklch(100% 0 0)}.skippr\\:drop-shadow-\\[0_2px_5px_rgba\\(0\\,0\\,0\\,0\\.4\\)\\]{--tw-drop-shadow-size:drop-shadow(0 2px 5px var(--tw-drop-shadow-color,#0006));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.skippr\\:backdrop-blur-sm{--tw-backdrop-blur:blur(var(--skippr-blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.skippr\\:transition-\\[filter\\]{transition-property:filter;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[gap\\]{transition-property:gap;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[height\\]{transition-property:height;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[left\\]{transition-property:left;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[opacity\\,color\\]{transition-property:opacity,color;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[opacity\\,transform\\,height\\]{transition-property:opacity,transform,height;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[opacity\\,transform\\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\,height\\,background-color\\,border-color\\]{transition-property:width,height,background-color,border-color;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\,margin\\]{transition-property:width,margin;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:duration-75{--tw-duration:75ms;transition-duration:75ms}.skippr\\:duration-100{--tw-duration:.1s;transition-duration:.1s}.skippr\\:duration-150{--tw-duration:.15s;transition-duration:.15s}.skippr\\:duration-200{--tw-duration:.2s;transition-duration:.2s}.skippr\\:duration-300{--tw-duration:.3s;transition-duration:.3s}.skippr\\:duration-\\[400ms\\]{--tw-duration:.4s;transition-duration:.4s}.skippr\\:ease-\\[cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{--tw-ease:cubic-bezier(.22,1,.36,1);transition-timing-function:cubic-bezier(.22,1,.36,1)}.skippr\\:ease-\\[cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)\\]{--tw-ease:cubic-bezier(.34,1.3,.64,1);transition-timing-function:cubic-bezier(.34,1.3,.64,1)}.skippr\\:ease-\\[cubic-bezier\\(0\\.34\\,1\\.56\\,0\\.64\\,1\\)\\]{--tw-ease:cubic-bezier(.34,1.56,.64,1);transition-timing-function:cubic-bezier(.34,1.56,.64,1)}.skippr\\:ease-in-out{--tw-ease:var(--skippr-ease-in-out);transition-timing-function:var(--skippr-ease-in-out)}.skippr\\:ease-out{--tw-ease:var(--skippr-ease-out);transition-timing-function:var(--skippr-ease-out)}.skippr\\:outline-none{--tw-outline-style:none;outline-style:none}.skippr\\:select-none{-webkit-user-select:none;user-select:none}.skippr\\:select-text{-webkit-user-select:text;user-select:text}.skippr\\:\\[animation-delay\\:0ms\\]{animation-delay:0s}.skippr\\:\\[animation-delay\\:150ms\\]{animation-delay:.15s}.skippr\\:\\[animation-delay\\:200ms\\]{animation-delay:.2s}.skippr\\:\\[animation-delay\\:300ms\\]{animation-delay:.3s}.skippr\\:\\[animation-delay\\:400ms\\]{animation-delay:.4s}.skippr\\:\\[overflow-anchor\\:none\\]{overflow-anchor:none}.skippr\\:group-focus-within\\:scale-100:is(:where(.skippr\\:group):focus-within *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-focus-within\\:opacity-100:is(:where(.skippr\\:group):focus-within *){opacity:1}@media (hover:hover){.skippr\\:group-hover\\:scale-100:is(:where(.skippr\\:group):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-hover\\:text-red-300:is(:where(.skippr\\:group):hover *){color:var(--skippr-color-red-300)}.skippr\\:group-hover\\:text-white\\/80:is(:where(.skippr\\:group):hover *){color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:group-hover\\:text-white\\/80:is(:where(.skippr\\:group):hover *){color:color-mix(in oklab,var(--skippr-color-white)80%,transparent)}}.skippr\\:group-hover\\:opacity-100:is(:where(.skippr\\:group):hover *){opacity:1}}.skippr\\:placeholder\\:text-\\[\\#b0aca4\\]::placeholder{color:#b0aca4}.skippr\\:first\\:mt-0:first-child{margin-top:calc(var(--skippr-spacing)*0)}@media (hover:hover){.skippr\\:hover\\:-translate-y-0\\.5:hover{--tw-translate-y:calc(var(--skippr-spacing)*-.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:hover\\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:hover\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.45\\)\\]:hover{border-color:#2d2d3f73}.skippr\\:hover\\:bg-\\[\\#3a384b\\]:hover{background-color:#3a384b}.skippr\\:hover\\:bg-\\[\\#3d3d52\\]:hover{background-color:#3d3d52}.skippr\\:hover\\:bg-\\[\\#f2f0eb\\]:hover{background-color:#f2f0eb}.skippr\\:hover\\:bg-\\[\\#f4f2ee\\]:hover{background-color:#f4f2ee}.skippr\\:hover\\:bg-\\[\\#f6f4f0\\]:hover{background-color:#f6f4f0}.skippr\\:hover\\:bg-\\[rgba\\(45\\,45\\,63\\,0\\.04\\)\\]:hover{background-color:#2d2d3f0a}.skippr\\:hover\\:bg-accent:hover{background-color:#e7e5e4}.skippr\\:hover\\:bg-amber-100:hover{background-color:var(--skippr-color-amber-100)}.skippr\\:hover\\:bg-bubble:hover{background-color:#2d2b3d}.skippr\\:hover\\:bg-destructive\\/90:hover{background-color:oklab(61.4357% .15892 .0698893/.9)}.skippr\\:hover\\:bg-foreground\\/8:hover{background-color:oklab(14.7% .00261104 .00303026/.08)}.skippr\\:hover\\:bg-muted:hover{background-color:oklch(97% .001 106.424)}.skippr\\:hover\\:bg-neutral-100:hover{background-color:var(--skippr-color-neutral-100)}.skippr\\:hover\\:bg-neutral-200:hover{background-color:var(--skippr-color-neutral-200)}.skippr\\:hover\\:bg-primary\\/90:hover{background-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)90%,transparent)}}.skippr\\:hover\\:bg-red-200:hover{background-color:var(--skippr-color-red-200)}.skippr\\:hover\\:bg-red-600:hover{background-color:var(--skippr-color-red-600)}.skippr\\:hover\\:bg-secondary\\/80:hover{background-color:oklab(91.9963% .0175391 .0626889/.8)}.skippr\\:hover\\:bg-transparent:hover{background-color:#0000}.skippr\\:hover\\:text-\\[\\#2D2D3F\\]:hover{color:#2d2d3f}.skippr\\:hover\\:text-\\[\\#5a5650\\]:hover{color:#5a5650}.skippr\\:hover\\:text-accent-foreground:hover{color:oklch(21.6% .006 56.043)}.skippr\\:hover\\:text-destructive:hover{color:#d94f4f}.skippr\\:hover\\:text-foreground:hover{color:oklch(14.7% .004 49.25)}.skippr\\:hover\\:underline:hover{text-decoration-line:underline}.skippr\\:hover\\:decoration-muted-foreground:hover{text-decoration-color:oklch(55.3% .013 58.071)}.skippr\\:hover\\:opacity-80:hover{opacity:.8}.skippr\\:hover\\:opacity-100:hover{opacity:1}.skippr\\:hover\\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.skippr\\:hover\\:brightness-\\[1\\.04\\]:hover{--tw-brightness:brightness(1.04);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.skippr\\:hover\\:brightness-\\[1\\.06\\]:hover{--tw-brightness:brightness(1.06);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}}.skippr\\:focus\\:border-primary:focus{border-color:var(--skippr-brand,#2d2b3d)}.skippr\\:focus\\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:focus\\:ring-primary\\/30:focus{--tw-ring-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:focus\\:ring-primary\\/30:focus{--tw-ring-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)30%,transparent)}}.skippr\\:focus-visible\\:border-\\[var\\(--skippr-brand-ring\\)\\]:focus-visible{border-color:var(--skippr-brand-ring)}.skippr\\:focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:focus-visible\\:ring-\\[var\\(--skippr-brand-ring\\)\\]:focus-visible{--tw-ring-color:var(--skippr-brand-ring)}.skippr\\:focus-visible\\:ring-bubble\\/60:focus-visible{--tw-ring-color:oklab(29.9244% .0107414 -.0305411/.6)}.skippr\\:focus-visible\\:ring-ring:focus-visible{--tw-ring-color:oklch(70.9% .01 56.259)}.skippr\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.skippr\\:focus-visible\\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.skippr\\:focus-visible\\:outline-offset-2:focus-visible{outline-offset:2px}.skippr\\:focus-visible\\:outline-\\[var\\(--skippr-brand\\)\\]:focus-visible{outline-color:var(--skippr-brand)}.skippr\\:focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.skippr\\:active\\:translate-y-0:active{--tw-translate-y:calc(var(--skippr-spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:active\\:scale-\\[0\\.98\\]:active{scale:.98}.skippr\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.skippr\\:disabled\\:cursor-default:disabled{cursor:default}.skippr\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.skippr\\:disabled\\:opacity-50:disabled{opacity:.5}.skippr\\:disabled\\:opacity-60:disabled{opacity:.6}.skippr\\:disabled\\:opacity-80:disabled{opacity:.8}@media (hover:hover){.skippr\\:disabled\\:hover\\:bg-\\[\\#2D2D3F\\]:disabled:hover{background-color:#2d2d3f}.skippr\\:disabled\\:hover\\:bg-white:disabled:hover{background-color:var(--skippr-color-white)}}@media (prefers-reduced-motion:reduce){.skippr\\:motion-reduce\\:hidden{display:none}.skippr\\:motion-reduce\\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:motion-reduce\\:animate-none{animation:none}}.skippr\\:\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.skippr\\:\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.skippr\\:\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}}:host{--skippr-brand-active:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-active:color-mix(in srgb,var(--skippr-brand,#2bc0ae)93%,#000)}}:host{--skippr-brand-deep:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-deep:color-mix(in srgb,var(--skippr-brand,#2bc0ae)78%,#000)}}:host{--skippr-brand-ring:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-ring:color-mix(in srgb,var(--skippr-brand,#2bc0ae)22%,transparent)}}:host{--skippr-brand-halo:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-halo:color-mix(in srgb,var(--skippr-brand,#2bc0ae)40%,transparent)}}:host{--skippr-brand-glow:linear-gradient(90deg,var(--skippr-brand,#2bc0ae),var(--skippr-brand,#2bc0ae),var(--skippr-brand,#2bc0ae),var(--skippr-brand,#2bc0ae),var(--skippr-brand,#2bc0ae))}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-glow:linear-gradient(90deg,var(--skippr-brand,#2bc0ae),color-mix(in srgb,var(--skippr-brand,#2bc0ae)55%,#fff),color-mix(in srgb,var(--skippr-brand,#2bc0ae)72%,#fff),var(--skippr-brand,#2bc0ae),color-mix(in srgb,var(--skippr-brand,#2bc0ae)42%,#fff))}}@keyframes skippr-tap{0%{transform:scale(1)}45%{transform:scale(.7)}to{transform:scale(1)}}@keyframes skippr-press{0%{transform:scale(1)}55%{transform:scale(1)}85%{transform:scale(.68)}to{transform:scale(1)}}@keyframes skippr-cursor-pop{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}@keyframes skippr-click-ping{0%{opacity:.9;transform:translate(-50%,-50%)scale(.4)}to{opacity:0;transform:translate(-50%,-50%)scale(2.4)}}@keyframes skippr-tab-fade{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-speak{0%,to{opacity:.6;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-thinking-dot{0%,80%,to{opacity:.2;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}@keyframes skippr-pulse-ring{0%,to{box-shadow:0 0 #2d2b3d66}50%{box-shadow:0 0 0 10px #2d2b3d00}}@keyframes skippr-rec-ring{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)55%,transparent)}70%{box-shadow:0 0 0 11px #0000}to{box-shadow:0 0 #0000}}@keyframes skippr-voice-pulse{0%{box-shadow:0 0 0 0 var(--skippr-pulse-color,#2bc0ae80)}70%{box-shadow:0 0 0 8px #0000}to{box-shadow:0 0 #0000}}@keyframes skippr-ptt-transmit{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)60%,transparent),0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)35%,transparent)}70%{box-shadow:0 0 0 9px #0000,0 0 0 16px #0000}to{box-shadow:0 0 #0000,0 0 #0000}}@keyframes skippr-annotation-pulse{0%,to{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)50%,transparent)}50%{box-shadow:0 0 0 6px #0000}}@keyframes skippr-speak-ripple{0%{opacity:.6;transform:scale(1)}to{opacity:0;transform:scale(1.8)}}@keyframes skippr-bar{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}@keyframes skippr-breathe{0%,to{opacity:.85;transform:scale(1)}50%{opacity:1;transform:scale(1.08)}}@keyframes skippr-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-evaporate{0%{opacity:1;filter:blur();transform:translateY(0)scale(1)}55%{opacity:.85;filter:blur()}to{opacity:0;filter:blur(2.5px);transform:translateY(-7px)scale(.965)}}@keyframes skippr-mote-rise{0%{opacity:0;transform:translateY(2px)scale(.5)}25%{opacity:.85}to{opacity:0;transform:translateY(-24px)scale(1)}}@keyframes skippr-flow{0%{background-position:0%}50%{background-position:100%}to{background-position:0%}}@keyframes skippr-wave{0%,to{opacity:.4;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-bubble-in{0%{opacity:0;transform:translateY(12px)scale(.96)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-tip-in{0%{opacity:0;transform:translateY(14px)scale(.96)}60%{opacity:1;transform:translateY(-2px)scale(1.01)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-pill-content{0%{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}@keyframes skippr-banner-look{0%,to{transform:translate(0)}25%{transform:translate(-2px)}75%{transform:translate(2px)}}@keyframes skippr-finger-tap{0%,to{transform:translateY(0)rotate(0)}50%{transform:translateY(2px)rotate(-6deg)}}@keyframes skippr-toolset-pop{0%{opacity:0;transform:scale(.85)}to{opacity:1;transform:scale(1)}}@keyframes skippr-stage-fade{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}@keyframes skippr-agent-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}@keyframes skippr-orb-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}@keyframes skippr-pop{0%{opacity:0;transform:translateY(6px)scale(.98)}to{opacity:1;transform:none}}@keyframes skippr-blink{0%,40%{transform:scaleY(1)}41.3%,42%{transform:scaleY(.08)}43.3%,70%{transform:scaleY(1)}71.3%,72%{transform:scaleY(.08)}73.3%,to{transform:scaleY(1)}}.skippr-buddy-blink{transform-box:fill-box;transform-origin:50%;animation:5s linear infinite skippr-blink}@keyframes skippr-avatar-eyes-bob{0%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(0)}18%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(24px)}33.33%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(-30px)}48%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(-7px)}64%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(-30px)}82%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(31px)}96%,to{transform:translateY(0)}}@keyframes skippr-avatar-pupil-glance{0%,21.33%{transform:translate(0)}28%,68%{transform:translate(-30px)}74%,to{transform:translate(0)}}@keyframes skippr-avatar-body-vibe{0%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1)}17.67%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1.08,.95)}33.67%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1)}49.67%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1.08,.95)}65.67%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1)}81.67%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1.08,.95)}96%,to{transform:scale(1)}}@keyframes skippr-avatar-blink{0%,40%{transform:scaleY(1)}41.3%,42%{transform:scaleY(.08)}43.3%,70%{transform:scaleY(1)}71.3%,72%{transform:scaleY(.08)}73.3%,to{transform:scaleY(1)}}@keyframes skippr-avatar-bub-tail-drift{0%,10%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translate(0)}45%,60%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translate(-24px)}95%,to{transform:translate(0)}}@keyframes skippr-avatar-antenna-shake{0%,to{transform:rotate(-4deg)}25%{transform:rotate(4deg)}50%{transform:rotate(-3deg)}75%{transform:rotate(3deg)}}.skippr-avatar-eyes{animation:5s infinite skippr-avatar-eyes-bob}.skippr-avatar-pupil{animation:5s linear infinite skippr-avatar-pupil-glance}.skippr-avatar-body{transform-box:fill-box;transform-origin:50% 100%;animation:5s infinite skippr-avatar-body-vibe}.skippr-avatar-blink{transform-box:fill-box;transform-origin:50%;animation:5s infinite skippr-avatar-blink}.skippr-avatar-body .skippr-avatar-antenna{transform-box:view-box;transform-origin:48px 22px;animation:1.6s ease-in-out infinite skippr-avatar-antenna-shake}.skippr-avatar-body .skippr-avatar-bub-tail{animation:5s infinite skippr-avatar-bub-tail-drift}@keyframes skippr-buddy-bob{0%,to{transform:translateY(0)}50%{transform:translateY(-3px)}}@keyframes skippr-buddy-breathe{0%,to{transform:scale(1)}50%{transform:scale(1.15)}}@keyframes skippr-buddy-pop{0%{transform:scale(1)}50%{transform:scale(1.06)}to{transform:scale(1)}}@keyframes skippr-buddy-sleep{0%,to{transform:translateY(0)scale(1)}50%{transform:translateY(1px)scale(.995)}}@keyframes skippr-buddy-zfloat{0%{opacity:0;transform:translateY(0)}20%{opacity:1}to{opacity:0;transform:translateY(-10px)}}@keyframes skippr-peek-left{0%,20%{transform:translate(-58%)}46%,66%{transform:translate(0)}92%,to{transform:translate(-58%)}}@keyframes skippr-peek-right{0%,20%{transform:translate(58%)}46%,66%{transform:translate(0)}92%,to{transform:translate(58%)}}@keyframes skippr-peek-top{0%,20%{transform:translateY(-58%)}46%,66%{transform:translateY(0)}92%,to{transform:translateY(-58%)}}@keyframes skippr-peek-bottom{0%,20%{transform:translateY(58%)}46%,66%{transform:translateY(0)}92%,to{transform:translateY(58%)}}.skippr-peek-left{animation:3.6s ease-in-out infinite skippr-peek-left}.skippr-peek-right{animation:3.6s ease-in-out infinite skippr-peek-right}.skippr-peek-top{animation:3.6s ease-in-out infinite skippr-peek-top}.skippr-peek-bottom{animation:3.6s ease-in-out infinite skippr-peek-bottom}.skippr-peek-out{animation:none;transform:none}@keyframes skippr-fade-out{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(4px)}}@keyframes skippr-block-reveal{0%{opacity:0;max-height:0;transform:translateY(-4px)}55%{opacity:1}to{opacity:1;max-height:260px;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){.skippr-buddy-blink,[style*=skippr-blink],[style*=skippr-buddy-bob],[style*=skippr-buddy-breathe],[style*=skippr-buddy-pop],[style*=skippr-buddy-sleep],[style*=skippr-buddy-zfloat],.skippr-avatar-eyes,.skippr-avatar-pupil,.skippr-avatar-body,.skippr-avatar-blink,.skippr-avatar-body .skippr-avatar-antenna,.skippr-avatar-body .skippr-avatar-bub-tail,.skippr-peek-left,.skippr-peek-right,.skippr-peek-top,.skippr-peek-bottom{animation-play-state:paused}}.skippr-no-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.skippr-no-scrollbar::-webkit-scrollbar{display:none}:host{color:var(--color-foreground)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}`;
|
|
10070
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-outline-style:solid}}}@layer theme{:root,:host{--skippr-font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--skippr-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--skippr-color-red-50:oklch(97.1% .013 17.38);--skippr-color-red-100:oklch(93.6% .032 17.717);--skippr-color-red-200:oklch(88.5% .062 18.334);--skippr-color-red-300:oklch(80.8% .114 19.571);--skippr-color-red-400:oklch(70.4% .191 22.216);--skippr-color-red-500:oklch(63.7% .237 25.331);--skippr-color-red-600:oklch(57.7% .245 27.325);--skippr-color-red-700:oklch(50.5% .213 27.518);--skippr-color-amber-50:oklch(98.7% .022 95.277);--skippr-color-amber-100:oklch(96.2% .059 95.617);--skippr-color-amber-400:oklch(82.8% .189 84.429);--skippr-color-amber-700:oklch(55.5% .163 48.998);--skippr-color-amber-950:oklch(27.9% .077 45.635);--skippr-color-emerald-400:oklch(76.5% .177 163.223);--skippr-color-neutral-100:oklch(97% 0 0);--skippr-color-neutral-200:oklch(92.2% 0 0);--skippr-color-neutral-500:oklch(55.6% 0 0);--skippr-color-neutral-700:oklch(37.1% 0 0);--skippr-color-black:#000;--skippr-color-white:#fff;--skippr-spacing:.25rem;--skippr-text-xs:.75rem;--skippr-text-xs--line-height:calc(1/.75);--skippr-text-sm:.875rem;--skippr-text-sm--line-height:calc(1.25/.875);--skippr-font-weight-medium:500;--skippr-font-weight-semibold:600;--skippr-font-weight-bold:700;--skippr-leading-snug:1.375;--skippr-leading-relaxed:1.625;--skippr-ease-out:cubic-bezier(0,0,.2,1);--skippr-ease-in-out:cubic-bezier(.4,0,.2,1);--skippr-animate-spin:spin 1s linear infinite;--skippr-animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--skippr-animate-bounce:bounce 1s infinite;--skippr-blur-sm:8px;--skippr-default-transition-duration:.15s;--skippr-default-transition-timing-function:cubic-bezier(.4,0,.2,1);--skippr-default-font-family:var(--skippr-font-sans);--skippr-default-mono-font-family:var(--skippr-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--skippr-default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--skippr-default-font-feature-settings,normal);font-variation-settings:var(--skippr-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--skippr-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--skippr-default-mono-font-feature-settings,normal);font-variation-settings:var(--skippr-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.skippr\\:pointer-events-auto{pointer-events:auto}.skippr\\:pointer-events-none{pointer-events:none}.skippr\\:absolute{position:absolute}.skippr\\:fixed{position:fixed}.skippr\\:relative{position:relative}.skippr\\:sticky{position:sticky}.skippr\\:-inset-\\[3px\\]{inset:-3px}.skippr\\:inset-0{inset:calc(var(--skippr-spacing)*0)}.skippr\\:inset-y-0{inset-block:calc(var(--skippr-spacing)*0)}.skippr\\:-top-1{top:calc(var(--skippr-spacing)*-1)}.skippr\\:-top-6{top:calc(var(--skippr-spacing)*-6)}.skippr\\:-top-8{top:calc(var(--skippr-spacing)*-8)}.skippr\\:-top-\\[2px\\]{top:-2px}.skippr\\:-top-\\[3px\\]{top:-3px}.skippr\\:-top-\\[13px\\]{top:-13px}.skippr\\:top-0{top:calc(var(--skippr-spacing)*0)}.skippr\\:top-1\\/2{top:50%}.skippr\\:top-\\[8px\\]{top:8px}.skippr\\:top-full{top:100%}.skippr\\:-right-1{right:calc(var(--skippr-spacing)*-1)}.skippr\\:-right-8{right:calc(var(--skippr-spacing)*-8)}.skippr\\:-right-\\[2px\\]{right:-2px}.skippr\\:-right-\\[6px\\]{right:-6px}.skippr\\:right-0{right:calc(var(--skippr-spacing)*0)}.skippr\\:right-3{right:calc(var(--skippr-spacing)*3)}.skippr\\:right-5{right:calc(var(--skippr-spacing)*5)}.skippr\\:right-6{right:calc(var(--skippr-spacing)*6)}.skippr\\:right-\\[4px\\]{right:4px}.skippr\\:right-\\[8px\\]{right:8px}.skippr\\:-bottom-\\[2px\\]{bottom:-2px}.skippr\\:bottom-3{bottom:calc(var(--skippr-spacing)*3)}.skippr\\:bottom-4{bottom:calc(var(--skippr-spacing)*4)}.skippr\\:bottom-20{bottom:calc(var(--skippr-spacing)*20)}.skippr\\:bottom-\\[calc\\(100\\%\\+8px\\)\\]{bottom:calc(100% + 8px)}.skippr\\:bottom-\\[calc\\(100\\%\\+11px\\)\\]{bottom:calc(100% + 11px)}.skippr\\:bottom-full{bottom:100%}.skippr\\:-left-8{left:calc(var(--skippr-spacing)*-8)}.skippr\\:-left-\\[2px\\]{left:-2px}.skippr\\:-left-\\[6px\\]{left:-6px}.skippr\\:left-0{left:calc(var(--skippr-spacing)*0)}.skippr\\:left-1\\/2{left:50%}.skippr\\:left-2{left:calc(var(--skippr-spacing)*2)}.skippr\\:left-3{left:calc(var(--skippr-spacing)*3)}.skippr\\:left-5{left:calc(var(--skippr-spacing)*5)}.skippr\\:left-6{left:calc(var(--skippr-spacing)*6)}.skippr\\:z-10{z-index:10}.skippr\\:z-20{z-index:20}.skippr\\:z-\\[1\\]{z-index:1}.skippr\\:z-\\[2\\]{z-index:2}.skippr\\:z-\\[4\\]{z-index:4}.skippr\\:z-\\[5\\]{z-index:5}.skippr\\:z-\\[6\\]{z-index:6}.skippr\\:z-\\[7\\]{z-index:7}.skippr\\:z-\\[8\\]{z-index:8}.skippr\\:z-\\[9998\\]{z-index:9998}.skippr\\:z-\\[9999\\]{z-index:9999}.skippr\\:z-\\[10000\\]{z-index:10000}.skippr\\:order-first{order:-9999}.skippr\\:order-last{order:9999}.skippr\\:mx-auto{margin-inline:auto}.skippr\\:-mt-1{margin-top:calc(var(--skippr-spacing)*-1)}.skippr\\:-mt-\\[5px\\]{margin-top:-5px}.skippr\\:-mt-\\[27px\\]{margin-top:-27px}.skippr\\:mt-0\\.5{margin-top:calc(var(--skippr-spacing)*.5)}.skippr\\:mt-1{margin-top:calc(var(--skippr-spacing)*1)}.skippr\\:mt-1\\.5{margin-top:calc(var(--skippr-spacing)*1.5)}.skippr\\:mt-2{margin-top:calc(var(--skippr-spacing)*2)}.skippr\\:mt-3{margin-top:calc(var(--skippr-spacing)*3)}.skippr\\:mt-3\\.5{margin-top:calc(var(--skippr-spacing)*3.5)}.skippr\\:mt-\\[1px\\]{margin-top:1px}.skippr\\:mt-\\[6px\\]{margin-top:6px}.skippr\\:mt-\\[8px\\]{margin-top:8px}.skippr\\:mt-\\[9px\\]{margin-top:9px}.skippr\\:-mr-1{margin-right:calc(var(--skippr-spacing)*-1)}.skippr\\:mr-7{margin-right:calc(var(--skippr-spacing)*7)}.skippr\\:mr-\\[22px\\]{margin-right:22px}.skippr\\:-mb-\\[5px\\]{margin-bottom:-5px}.skippr\\:mb-1{margin-bottom:calc(var(--skippr-spacing)*1)}.skippr\\:mb-1\\.5{margin-bottom:calc(var(--skippr-spacing)*1.5)}.skippr\\:mb-2{margin-bottom:calc(var(--skippr-spacing)*2)}.skippr\\:mb-3{margin-bottom:calc(var(--skippr-spacing)*3)}.skippr\\:mb-4{margin-bottom:calc(var(--skippr-spacing)*4)}.skippr\\:mb-\\[14px\\]{margin-bottom:14px}.skippr\\:-ml-\\[2px\\]{margin-left:-2px}.skippr\\:ml-0\\.5{margin-left:calc(var(--skippr-spacing)*.5)}.skippr\\:ml-1{margin-left:calc(var(--skippr-spacing)*1)}.skippr\\:ml-7{margin-left:calc(var(--skippr-spacing)*7)}.skippr\\:ml-auto{margin-left:auto}.skippr\\:line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.skippr\\:block{display:block}.skippr\\:flex{display:flex}.skippr\\:hidden{display:none}.skippr\\:inline-flex{display:inline-flex}.skippr\\:size-1{width:calc(var(--skippr-spacing)*1);height:calc(var(--skippr-spacing)*1)}.skippr\\:size-1\\.5{width:calc(var(--skippr-spacing)*1.5);height:calc(var(--skippr-spacing)*1.5)}.skippr\\:size-2{width:calc(var(--skippr-spacing)*2);height:calc(var(--skippr-spacing)*2)}.skippr\\:size-2\\.5{width:calc(var(--skippr-spacing)*2.5);height:calc(var(--skippr-spacing)*2.5)}.skippr\\:size-3{width:calc(var(--skippr-spacing)*3);height:calc(var(--skippr-spacing)*3)}.skippr\\:size-3\\.5{width:calc(var(--skippr-spacing)*3.5);height:calc(var(--skippr-spacing)*3.5)}.skippr\\:size-4{width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}.skippr\\:size-5{width:calc(var(--skippr-spacing)*5);height:calc(var(--skippr-spacing)*5)}.skippr\\:size-6{width:calc(var(--skippr-spacing)*6);height:calc(var(--skippr-spacing)*6)}.skippr\\:size-7{width:calc(var(--skippr-spacing)*7);height:calc(var(--skippr-spacing)*7)}.skippr\\:size-8{width:calc(var(--skippr-spacing)*8);height:calc(var(--skippr-spacing)*8)}.skippr\\:size-9{width:calc(var(--skippr-spacing)*9);height:calc(var(--skippr-spacing)*9)}.skippr\\:size-10{width:calc(var(--skippr-spacing)*10);height:calc(var(--skippr-spacing)*10)}.skippr\\:size-12{width:calc(var(--skippr-spacing)*12);height:calc(var(--skippr-spacing)*12)}.skippr\\:size-\\[3px\\]{width:3px;height:3px}.skippr\\:size-\\[4px\\]{width:4px;height:4px}.skippr\\:size-\\[5px\\]{width:5px;height:5px}.skippr\\:size-\\[6px\\]{width:6px;height:6px}.skippr\\:size-\\[7px\\]{width:7px;height:7px}.skippr\\:size-\\[8px\\]{width:8px;height:8px}.skippr\\:size-\\[9px\\]{width:9px;height:9px}.skippr\\:size-\\[10px\\]{width:10px;height:10px}.skippr\\:size-\\[11px\\]{width:11px;height:11px}.skippr\\:size-\\[12px\\]{width:12px;height:12px}.skippr\\:size-\\[13px\\]{width:13px;height:13px}.skippr\\:size-\\[14px\\]{width:14px;height:14px}.skippr\\:size-\\[15px\\]{width:15px;height:15px}.skippr\\:size-\\[16px\\]{width:16px;height:16px}.skippr\\:size-\\[17px\\]{width:17px;height:17px}.skippr\\:size-\\[18px\\]{width:18px;height:18px}.skippr\\:size-\\[19px\\]{width:19px;height:19px}.skippr\\:size-\\[20px\\]{width:20px;height:20px}.skippr\\:size-\\[22px\\]{width:22px;height:22px}.skippr\\:size-\\[26px\\]{width:26px;height:26px}.skippr\\:size-\\[28px\\]{width:28px;height:28px}.skippr\\:size-\\[30px\\]{width:30px;height:30px}.skippr\\:size-\\[32px\\]{width:32px;height:32px}.skippr\\:size-\\[34px\\]{width:34px;height:34px}.skippr\\:size-\\[38px\\]{width:38px;height:38px}.skippr\\:size-\\[46px\\]{width:46px;height:46px}.skippr\\:size-full{width:100%;height:100%}.skippr\\:h-0{height:calc(var(--skippr-spacing)*0)}.skippr\\:h-1{height:calc(var(--skippr-spacing)*1)}.skippr\\:h-1\\.5{height:calc(var(--skippr-spacing)*1.5)}.skippr\\:h-2{height:calc(var(--skippr-spacing)*2)}.skippr\\:h-3{height:calc(var(--skippr-spacing)*3)}.skippr\\:h-3\\.5{height:calc(var(--skippr-spacing)*3.5)}.skippr\\:h-5{height:calc(var(--skippr-spacing)*5)}.skippr\\:h-6{height:calc(var(--skippr-spacing)*6)}.skippr\\:h-7{height:calc(var(--skippr-spacing)*7)}.skippr\\:h-8{height:calc(var(--skippr-spacing)*8)}.skippr\\:h-9{height:calc(var(--skippr-spacing)*9)}.skippr\\:h-10{height:calc(var(--skippr-spacing)*10)}.skippr\\:h-\\[5px\\]{height:5px}.skippr\\:h-\\[11px\\]{height:11px}.skippr\\:h-\\[14px\\]{height:14px}.skippr\\:h-\\[16px\\]{height:16px}.skippr\\:h-\\[18\\.5px\\]{height:18.5px}.skippr\\:h-\\[18px\\]{height:18px}.skippr\\:h-\\[22px\\]{height:22px}.skippr\\:h-\\[24px\\]{height:24px}.skippr\\:h-\\[26px\\]{height:26px}.skippr\\:h-\\[36px\\]{height:36px}.skippr\\:h-\\[38px\\]{height:38px}.skippr\\:h-\\[48px\\]{height:48px}.skippr\\:h-\\[54px\\]{height:54px}.skippr\\:h-full{height:100%}.skippr\\:h-px{height:1px}.skippr\\:max-h-\\[132px\\]{max-height:132px}.skippr\\:min-h-0{min-height:calc(var(--skippr-spacing)*0)}.skippr\\:min-h-11{min-height:calc(var(--skippr-spacing)*11)}.skippr\\:min-h-\\[16px\\]{min-height:16px}.skippr\\:w-0{width:calc(var(--skippr-spacing)*0)}.skippr\\:w-3\\.5{width:calc(var(--skippr-spacing)*3.5)}.skippr\\:w-5{width:calc(var(--skippr-spacing)*5)}.skippr\\:w-6{width:calc(var(--skippr-spacing)*6)}.skippr\\:w-7{width:calc(var(--skippr-spacing)*7)}.skippr\\:w-10{width:calc(var(--skippr-spacing)*10)}.skippr\\:w-40{width:calc(var(--skippr-spacing)*40)}.skippr\\:w-\\[2\\.5px\\]{width:2.5px}.skippr\\:w-\\[2px\\]{width:2px}.skippr\\:w-\\[3px\\]{width:3px}.skippr\\:w-\\[9px\\]{width:9px}.skippr\\:w-\\[14px\\]{width:14px}.skippr\\:w-\\[15\\.4px\\]{width:15.4px}.skippr\\:w-\\[15px\\]{width:15px}.skippr\\:w-\\[16px\\]{width:16px}.skippr\\:w-\\[22px\\]{width:22px}.skippr\\:w-\\[36px\\]{width:36px}.skippr\\:w-\\[38px\\]{width:38px}.skippr\\:w-\\[50px\\]{width:50px}.skippr\\:w-\\[148px\\]{width:148px}.skippr\\:w-\\[150px\\]{width:150px}.skippr\\:w-\\[220px\\]{width:220px}.skippr\\:w-\\[225px\\]{width:225px}.skippr\\:w-\\[240px\\]{width:240px}.skippr\\:w-\\[255px\\]{width:255px}.skippr\\:w-\\[320px\\]{width:320px}.skippr\\:w-fit{width:fit-content}.skippr\\:w-full{width:100%}.skippr\\:w-px{width:1px}.skippr\\:max-w-64{max-width:calc(var(--skippr-spacing)*64)}.skippr\\:max-w-72{max-width:calc(var(--skippr-spacing)*72)}.skippr\\:max-w-\\[80\\%\\]{max-width:80%}.skippr\\:max-w-\\[280px\\]{max-width:280px}.skippr\\:min-w-0{min-width:calc(var(--skippr-spacing)*0)}.skippr\\:min-w-11{min-width:calc(var(--skippr-spacing)*11)}.skippr\\:min-w-\\[96px\\]{min-width:96px}.skippr\\:flex-1{flex:1}.skippr\\:shrink-0{flex-shrink:0}.skippr\\:origin-bottom{transform-origin:bottom}.skippr\\:origin-bottom-left{transform-origin:0 100%}.skippr\\:origin-bottom-right{transform-origin:100% 100%}.skippr\\:origin-center{transform-origin:50%}.skippr\\:origin-left{transform-origin:0}.skippr\\:origin-right{transform-origin:100%}.skippr\\:origin-top{transform-origin:top}.skippr\\:origin-top-left{transform-origin:0 0}.skippr\\:origin-top-right{transform-origin:100% 0}.skippr\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-x-3{--tw-translate-x:calc(var(--skippr-spacing)*-3);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-x-7{--tw-translate-x:calc(var(--skippr-spacing)*-7);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:translate-x-3{--tw-translate-x:calc(var(--skippr-spacing)*3);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:translate-x-7{--tw-translate-x:calc(var(--skippr-spacing)*7);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-y-\\[4px\\]{--tw-translate-y:calc(4px*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-\\[0\\.94\\]{scale:.94}.skippr\\:-rotate-90{rotate:-90deg}.skippr\\:rotate-45{rotate:45deg}.skippr\\:rotate-\\[225deg\\]{rotate:225deg}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out\\]{animation:.2s ease-out skippr-agent-in}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out_240ms_both\\]{animation:.2s ease-out .24s both skippr-agent-in}.skippr\\:\\[animation\\:skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:\\[animation\\:skippr-block-reveal_320ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.32s cubic-bezier(.22,1,.36,1) skippr-block-reveal}.skippr\\:\\[animation\\:skippr-breathe_1\\.1s_ease-in-out_0\\.18s_infinite\\]{animation:1.1s ease-in-out .18s infinite skippr-breathe}.skippr\\:\\[animation\\:skippr-breathe_1\\.1s_ease-in-out_0\\.36s_infinite\\]{animation:1.1s ease-in-out .36s infinite skippr-breathe}.skippr\\:\\[animation\\:skippr-breathe_1\\.1s_ease-in-out_0s_infinite\\]{animation:1.1s ease-in-out infinite skippr-breathe}.skippr\\:\\[animation\\:skippr-evaporate_3\\.2s_ease-in_forwards\\]{animation:3.2s ease-in forwards skippr-evaporate}.skippr\\:\\[animation\\:skippr-fade-in_0\\.2s_ease\\]{animation:.2s skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-in_0\\.16s_ease\\]{animation:.16s skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-in_0\\.22s_ease\\]{animation:.22s skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-in_0\\.24s_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.24s cubic-bezier(.22,1,.36,1) skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-in_0\\.25s_ease\\]{animation:.25s skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-out_0\\.18s_ease-in_forwards\\]{animation:.18s ease-in forwards skippr-fade-out}.skippr\\:\\[animation\\:skippr-finger-tap_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-finger-tap}.skippr\\:\\[animation\\:skippr-mote-rise_1\\.6s_ease-out_infinite\\]{animation:1.6s ease-out infinite skippr-mote-rise}.skippr\\:\\[animation\\:skippr-orb-in_320ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)\\]{animation:.32s cubic-bezier(.34,1.3,.64,1) skippr-orb-in}.skippr\\:\\[animation\\:skippr-pop_0\\.2s_ease\\]{animation:.2s skippr-pop}.skippr\\:\\[animation\\:skippr-stage-fade_240ms_ease-out\\]{animation:.24s ease-out skippr-stage-fade}.skippr\\:\\[animation\\:skippr-tip-in_360ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)\\]{animation:.36s cubic-bezier(.34,1.3,.64,1) skippr-tip-in}.skippr\\:\\[animation\\:skippr-tip-in_360ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)_backwards\\]{animation:.36s cubic-bezier(.34,1.3,.64,1) backwards skippr-tip-in}.skippr\\:\\[animation\\:skippr-toolset-pop_280ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.28s cubic-bezier(.22,1,.36,1) skippr-toolset-pop}.skippr\\:\\[animation\\:skippr-toolset-pop_440ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.44s cubic-bezier(.22,1,.36,1) skippr-toolset-pop}.skippr\\:animate-\\[skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:animate-\\[skippr-bubble-in_0\\.28s_ease-out\\]{animation:.28s ease-out skippr-bubble-in}.skippr\\:animate-\\[skippr-fade-in_0\\.3s_ease-out\\]{animation:.3s ease-out skippr-fade-in}.skippr\\:animate-\\[skippr-pill-content_0\\.22s_ease-out\\]{animation:.22s ease-out skippr-pill-content}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.3s_infinite\\]{animation:1.1s ease-in-out .3s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.6s_infinite\\]{animation:1.1s ease-in-out .6s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.15s_infinite\\]{animation:1.1s ease-in-out .15s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.45s_infinite\\]{animation:1.1s ease-in-out .45s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-speak}.skippr\\:animate-bounce{animation:var(--skippr-animate-bounce)}.skippr\\:animate-ping{animation:var(--skippr-animate-ping)}.skippr\\:animate-skippr-annotation-pulse{animation:1.8s ease-in-out infinite skippr-annotation-pulse}.skippr\\:animate-skippr-click-ping{animation:.5s ease-out forwards skippr-click-ping}.skippr\\:animate-skippr-cursor-pop{animation:.22s ease-out skippr-cursor-pop}.skippr\\:animate-skippr-flow{animation:3.6s linear infinite skippr-flow}.skippr\\:animate-skippr-press{animation:.5s ease-in-out skippr-press}.skippr\\:animate-skippr-ptt-transmit{animation:1.4s ease-out infinite skippr-ptt-transmit}.skippr\\:animate-skippr-rec-ring{animation:2s ease-out infinite skippr-rec-ring}.skippr\\:animate-skippr-tab-fade{animation:.2s ease-out skippr-tab-fade}.skippr\\:animate-skippr-thinking-dot{animation:1.2s ease-in-out infinite skippr-thinking-dot}.skippr\\:animate-skippr-voice-pulse{animation:1.6s ease-out infinite skippr-voice-pulse}.skippr\\:animate-spin{animation:var(--skippr-animate-spin)}.skippr\\:cursor-default{cursor:default}.skippr\\:cursor-grab{cursor:grab}.skippr\\:cursor-not-allowed{cursor:not-allowed}.skippr\\:cursor-pointer{cursor:pointer}.skippr\\:touch-none{touch-action:none}.skippr\\:resize-none{resize:none}.skippr\\:appearance-none{appearance:none}.skippr\\:flex-col{flex-direction:column}.skippr\\:flex-col-reverse{flex-direction:column-reverse}.skippr\\:flex-row{flex-direction:row}.skippr\\:flex-row-reverse{flex-direction:row-reverse}.skippr\\:items-baseline{align-items:baseline}.skippr\\:items-center{align-items:center}.skippr\\:items-end{align-items:flex-end}.skippr\\:items-start{align-items:flex-start}.skippr\\:justify-between{justify-content:space-between}.skippr\\:justify-center{justify-content:center}.skippr\\:justify-end{justify-content:flex-end}.skippr\\:justify-start{justify-content:flex-start}.skippr\\:gap-0\\.5{gap:calc(var(--skippr-spacing)*.5)}.skippr\\:gap-1{gap:calc(var(--skippr-spacing)*1)}.skippr\\:gap-1\\.5{gap:calc(var(--skippr-spacing)*1.5)}.skippr\\:gap-2{gap:calc(var(--skippr-spacing)*2)}.skippr\\:gap-2\\.5{gap:calc(var(--skippr-spacing)*2.5)}.skippr\\:gap-3{gap:calc(var(--skippr-spacing)*3)}.skippr\\:gap-\\[1px\\]{gap:1px}.skippr\\:gap-\\[2px\\]{gap:2px}.skippr\\:gap-\\[3px\\]{gap:3px}.skippr\\:gap-\\[4px\\]{gap:4px}.skippr\\:gap-\\[5px\\]{gap:5px}.skippr\\:gap-\\[6px\\]{gap:6px}.skippr\\:gap-\\[7px\\]{gap:7px}.skippr\\:gap-\\[8px\\]{gap:8px}.skippr\\:gap-\\[9px\\]{gap:9px}.skippr\\:gap-\\[10px\\]{gap:10px}.skippr\\:gap-\\[14px\\]{gap:14px}.skippr\\:gap-px{gap:1px}:where(.skippr\\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-\\[6px\\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(6px*var(--tw-space-y-reverse));margin-block-end:calc(6px*calc(1 - var(--tw-space-y-reverse)))}.skippr\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.skippr\\:overflow-hidden{overflow:hidden}.skippr\\:overflow-visible{overflow:visible}.skippr\\:overflow-y-auto{overflow-y:auto}.skippr\\:overscroll-contain{overscroll-behavior:contain}.skippr\\:rounded{border-radius:.25rem}.skippr\\:rounded-2xl{border-radius:1.125rem}.skippr\\:rounded-\\[1rem\\]{border-radius:1rem}.skippr\\:rounded-\\[4px\\]{border-radius:4px}.skippr\\:rounded-\\[5px\\]{border-radius:5px}.skippr\\:rounded-\\[10px\\]{border-radius:10px}.skippr\\:rounded-\\[11px\\]{border-radius:11px}.skippr\\:rounded-\\[12px\\]{border-radius:12px}.skippr\\:rounded-\\[14px\\]{border-radius:14px}.skippr\\:rounded-\\[16px\\]{border-radius:16px}.skippr\\:rounded-\\[20px\\]{border-radius:20px}.skippr\\:rounded-full{border-radius:3.40282e38px}.skippr\\:rounded-md{border-radius:.5rem}.skippr\\:rounded-sm{border-radius:.375rem}.skippr\\:rounded-xl{border-radius:.875rem}.skippr\\:rounded-t-\\[6px\\]{border-top-left-radius:6px;border-top-right-radius:6px}.skippr\\:rounded-t-\\[18px\\]{border-top-left-radius:18px;border-top-right-radius:18px}.skippr\\:rounded-t-full{border-top-left-radius:3.40282e38px;border-top-right-radius:3.40282e38px}.skippr\\:rounded-l-\\[6px\\]{border-top-left-radius:6px;border-bottom-left-radius:6px}.skippr\\:rounded-l-\\[18px\\]{border-top-left-radius:18px;border-bottom-left-radius:18px}.skippr\\:rounded-l-full{border-top-left-radius:3.40282e38px;border-bottom-left-radius:3.40282e38px}.skippr\\:rounded-tl-\\[6px\\]{border-top-left-radius:6px}.skippr\\:rounded-tl-md{border-top-left-radius:.5rem}.skippr\\:rounded-r-\\[6px\\]{border-top-right-radius:6px;border-bottom-right-radius:6px}.skippr\\:rounded-r-\\[18px\\]{border-top-right-radius:18px;border-bottom-right-radius:18px}.skippr\\:rounded-r-full{border-top-right-radius:3.40282e38px;border-bottom-right-radius:3.40282e38px}.skippr\\:rounded-tr-\\[6px\\]{border-top-right-radius:6px}.skippr\\:rounded-b-\\[6px\\]{border-bottom-right-radius:6px;border-bottom-left-radius:6px}.skippr\\:rounded-b-\\[18px\\]{border-bottom-right-radius:18px;border-bottom-left-radius:18px}.skippr\\:rounded-b-full{border-bottom-right-radius:3.40282e38px;border-bottom-left-radius:3.40282e38px}.skippr\\:rounded-bl-\\[6px\\]{border-bottom-left-radius:6px}.skippr\\:border{border-style:var(--tw-border-style);border-width:1px}.skippr\\:border-0{border-style:var(--tw-border-style);border-width:0}.skippr\\:border-2{border-style:var(--tw-border-style);border-width:2px}.skippr\\:border-\\[2\\.5px\\]{border-style:var(--tw-border-style);border-width:2.5px}.skippr\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.skippr\\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.skippr\\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.skippr\\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.skippr\\:border-none{--tw-border-style:none;border-style:none}.skippr\\:border-\\[\\#d8d3ca\\]{border-color:#d8d3ca}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.1\\)\\]{border-color:#2d2d3f1a}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.06\\)\\]{border-color:#2d2d3f0f}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.08\\)\\]{border-color:#2d2d3f14}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.12\\)\\]{border-color:#2d2d3f1f}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.14\\)\\]{border-color:#2d2d3f24}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.28\\)\\]{border-color:#2d2d3f47}.skippr\\:border-\\[var\\(--skippr-brand-ring\\)\\]{border-color:var(--skippr-brand-ring)}.skippr\\:border-black\\/25{border-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-black\\/25{border-color:color-mix(in oklab,var(--skippr-color-black)25%,transparent)}}.skippr\\:border-border{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-brand{border-color:var(--skippr-brand,#2bc0ae)}.skippr\\:border-input{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-primary,.skippr\\:border-primary\\/20{border-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-primary\\/20{border-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)20%,transparent)}}.skippr\\:border-transparent{border-color:#0000}.skippr\\:border-white,.skippr\\:border-white\\/30{border-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-white\\/30{border-color:color-mix(in oklab,var(--skippr-color-white)30%,transparent)}}.skippr\\:border-t-brand{border-top-color:var(--skippr-brand,#2bc0ae)}.skippr\\:border-t-white{border-top-color:var(--skippr-color-white)}.skippr\\:border-r-border{border-right-color:oklch(92.3% .003 48.717)}.skippr\\:border-l-border{border-left-color:oklch(92.3% .003 48.717)}.skippr\\:bg-\\[\\#2D2D3F\\]{background-color:#2d2d3f}.skippr\\:bg-\\[\\#F1EFEA\\]{background-color:#f1efea}.skippr\\:bg-\\[\\#b9b4ab\\]{background-color:#b9b4ab}.skippr\\:bg-\\[\\#dc2626\\]{background-color:#dc2626}.skippr\\:bg-\\[\\#eeeae4\\]{background-color:#eeeae4}.skippr\\:bg-\\[\\#f2f0eb\\]{background-color:#f2f0eb}.skippr\\:bg-\\[\\#f4ecd8\\]{background-color:#f4ecd8}.skippr\\:bg-\\[\\#f4f2ee\\]{background-color:#f4f2ee}.skippr\\:bg-\\[rgba\\(45\\,45\\,63\\,0\\.03\\)\\]{background-color:#2d2d3f08}.skippr\\:bg-amber-50{background-color:var(--skippr-color-amber-50)}.skippr\\:bg-amber-400{background-color:var(--skippr-color-amber-400)}.skippr\\:bg-background{background-color:oklch(100% 0 0)}.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:color-mix(in oklab,var(--skippr-color-black)7.0%,transparent)}}.skippr\\:bg-brand,.skippr\\:bg-brand\\/50{background-color:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-brand\\/50{background-color:color-mix(in oklab,var(--skippr-brand,#2bc0ae)50%,transparent)}}.skippr\\:bg-bubble{background-color:#2d2b3d}.skippr\\:bg-bubble\\/95{background-color:oklab(29.9244% .0107414 -.0305411/.95)}.skippr\\:bg-card{background-color:oklch(100% 0 0)}.skippr\\:bg-current{background-color:currentColor}.skippr\\:bg-destructive{background-color:#d94f4f}.skippr\\:bg-emerald-400{background-color:var(--skippr-color-emerald-400)}.skippr\\:bg-foreground{background-color:oklch(14.7% .004 49.25)}.skippr\\:bg-foreground\\/10{background-color:oklab(14.7% .00261104 .00303026/.1)}.skippr\\:bg-launcher{background-color:#2d2d3f}.skippr\\:bg-muted-foreground\\/40{background-color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:bg-neutral-100{background-color:var(--skippr-color-neutral-100)}.skippr\\:bg-primary,.skippr\\:bg-primary\\/10{background-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-primary\\/10{background-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)10%,transparent)}}.skippr\\:bg-red-50{background-color:var(--skippr-color-red-50)}.skippr\\:bg-red-100{background-color:var(--skippr-color-red-100)}.skippr\\:bg-red-500{background-color:var(--skippr-color-red-500)}.skippr\\:bg-secondary{background-color:#ffdfb5}.skippr\\:bg-transparent{background-color:#0000}.skippr\\:bg-white,.skippr\\:bg-white\\/70{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/70{background-color:color-mix(in oklab,var(--skippr-color-white)70%,transparent)}}.skippr\\:bg-white\\/80{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/80{background-color:color-mix(in oklab,var(--skippr-color-white)80%,transparent)}}.skippr\\:bg-white\\/95{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/95{background-color:color-mix(in oklab,var(--skippr-color-white)95%,transparent)}}.skippr\\:fill-brand{fill:var(--skippr-brand,#2bc0ae)}.skippr\\:fill-current{fill:currentColor}.skippr\\:fill-primary\\/30{fill:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:fill-primary\\/30{fill:color-mix(in oklab,var(--skippr-brand,#2d2b3d)30%,transparent)}}.skippr\\:fill-white{fill:var(--skippr-color-white)}.skippr\\:stroke-black\\/15{stroke:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:stroke-black\\/15{stroke:color-mix(in oklab,var(--skippr-color-black)15%,transparent)}}.skippr\\:stroke-bubble{stroke:#2d2b3d}.skippr\\:object-contain{object-fit:contain}.skippr\\:object-cover{object-fit:cover}.skippr\\:p-0{padding:calc(var(--skippr-spacing)*0)}.skippr\\:p-1\\.5{padding:calc(var(--skippr-spacing)*1.5)}.skippr\\:p-2{padding:calc(var(--skippr-spacing)*2)}.skippr\\:p-3{padding:calc(var(--skippr-spacing)*3)}.skippr\\:p-3\\.5{padding:calc(var(--skippr-spacing)*3.5)}.skippr\\:p-4{padding:calc(var(--skippr-spacing)*4)}.skippr\\:p-\\[2px\\]{padding:2px}.skippr\\:p-\\[3px\\]{padding:3px}.skippr\\:p-\\[9px\\]{padding:9px}.skippr\\:p-\\[14px\\]{padding:14px}.skippr\\:px-1{padding-inline:calc(var(--skippr-spacing)*1)}.skippr\\:px-1\\.5{padding-inline:calc(var(--skippr-spacing)*1.5)}.skippr\\:px-2{padding-inline:calc(var(--skippr-spacing)*2)}.skippr\\:px-2\\.5{padding-inline:calc(var(--skippr-spacing)*2.5)}.skippr\\:px-3{padding-inline:calc(var(--skippr-spacing)*3)}.skippr\\:px-3\\.5{padding-inline:calc(var(--skippr-spacing)*3.5)}.skippr\\:px-4{padding-inline:calc(var(--skippr-spacing)*4)}.skippr\\:px-5{padding-inline:calc(var(--skippr-spacing)*5)}.skippr\\:px-6{padding-inline:calc(var(--skippr-spacing)*6)}.skippr\\:px-\\[5px\\]{padding-inline:5px}.skippr\\:px-\\[7px\\]{padding-inline:7px}.skippr\\:px-\\[9px\\]{padding-inline:9px}.skippr\\:px-\\[10px\\]{padding-inline:10px}.skippr\\:px-\\[11px\\]{padding-inline:11px}.skippr\\:px-\\[12px\\]{padding-inline:12px}.skippr\\:px-\\[18px\\]{padding-inline:18px}.skippr\\:px-\\[22px\\]{padding-inline:22px}.skippr\\:py-0\\.5{padding-block:calc(var(--skippr-spacing)*.5)}.skippr\\:py-1{padding-block:calc(var(--skippr-spacing)*1)}.skippr\\:py-1\\.5{padding-block:calc(var(--skippr-spacing)*1.5)}.skippr\\:py-2{padding-block:calc(var(--skippr-spacing)*2)}.skippr\\:py-2\\.5{padding-block:calc(var(--skippr-spacing)*2.5)}.skippr\\:py-3{padding-block:calc(var(--skippr-spacing)*3)}.skippr\\:py-4{padding-block:calc(var(--skippr-spacing)*4)}.skippr\\:py-6{padding-block:calc(var(--skippr-spacing)*6)}.skippr\\:py-\\[1px\\]{padding-block:1px}.skippr\\:py-\\[3px\\]{padding-block:3px}.skippr\\:py-\\[4px\\]{padding-block:4px}.skippr\\:py-\\[5px\\]{padding-block:5px}.skippr\\:py-\\[6px\\]{padding-block:6px}.skippr\\:py-\\[7px\\]{padding-block:7px}.skippr\\:py-\\[13px\\]{padding-block:13px}.skippr\\:pt-1{padding-top:calc(var(--skippr-spacing)*1)}.skippr\\:pt-5{padding-top:calc(var(--skippr-spacing)*5)}.skippr\\:pt-\\[8px\\]{padding-top:8px}.skippr\\:pt-\\[9px\\]{padding-top:9px}.skippr\\:pt-\\[10px\\]{padding-top:10px}.skippr\\:pt-\\[18px\\]{padding-top:18px}.skippr\\:pt-\\[22px\\]{padding-top:22px}.skippr\\:pr-2\\.5{padding-right:calc(var(--skippr-spacing)*2.5)}.skippr\\:pr-3{padding-right:calc(var(--skippr-spacing)*3)}.skippr\\:pr-\\[5px\\]{padding-right:5px}.skippr\\:pr-\\[6px\\]{padding-right:6px}.skippr\\:pr-\\[9px\\]{padding-right:9px}.skippr\\:pr-\\[10px\\]{padding-right:10px}.skippr\\:pb-0\\.5{padding-bottom:calc(var(--skippr-spacing)*.5)}.skippr\\:pb-1{padding-bottom:calc(var(--skippr-spacing)*1)}.skippr\\:pb-4{padding-bottom:calc(var(--skippr-spacing)*4)}.skippr\\:pb-\\[8px\\]{padding-bottom:8px}.skippr\\:pb-\\[10px\\]{padding-bottom:10px}.skippr\\:pb-\\[22px\\]{padding-bottom:22px}.skippr\\:pl-1\\.5{padding-left:calc(var(--skippr-spacing)*1.5)}.skippr\\:pl-2\\.5{padding-left:calc(var(--skippr-spacing)*2.5)}.skippr\\:pl-3\\.5{padding-left:calc(var(--skippr-spacing)*3.5)}.skippr\\:pl-\\[9px\\]{padding-left:9px}.skippr\\:pl-\\[13px\\]{padding-left:13px}.skippr\\:text-center{text-align:center}.skippr\\:text-left{text-align:left}.skippr\\:font-mono{font-family:var(--skippr-font-mono)}.skippr\\:text-sm{font-size:var(--skippr-text-sm);line-height:var(--tw-leading,var(--skippr-text-sm--line-height))}.skippr\\:text-xs{font-size:var(--skippr-text-xs);line-height:var(--tw-leading,var(--skippr-text-xs--line-height))}.skippr\\:text-\\[8\\.5px\\]{font-size:8.5px}.skippr\\:text-\\[9\\.5px\\]{font-size:9.5px}.skippr\\:text-\\[9px\\]{font-size:9px}.skippr\\:text-\\[10\\.5px\\]{font-size:10.5px}.skippr\\:text-\\[10px\\]{font-size:10px}.skippr\\:text-\\[11\\.5px\\]{font-size:11.5px}.skippr\\:text-\\[11px\\]{font-size:11px}.skippr\\:text-\\[12\\.5px\\]{font-size:12.5px}.skippr\\:text-\\[12px\\]{font-size:12px}.skippr\\:text-\\[13px\\]{font-size:13px}.skippr\\:text-\\[14px\\]{font-size:14px}.skippr\\:text-\\[16px\\]{font-size:16px}.skippr\\:text-\\[18px\\]{font-size:18px}.skippr\\:leading-5{--tw-leading:calc(var(--skippr-spacing)*5);line-height:calc(var(--skippr-spacing)*5)}.skippr\\:leading-\\[1\\.2\\]{--tw-leading:1.2;line-height:1.2}.skippr\\:leading-\\[1\\.25\\]{--tw-leading:1.25;line-height:1.25}.skippr\\:leading-none{--tw-leading:1;line-height:1}.skippr\\:leading-relaxed{--tw-leading:var(--skippr-leading-relaxed);line-height:var(--skippr-leading-relaxed)}.skippr\\:leading-snug{--tw-leading:var(--skippr-leading-snug);line-height:var(--skippr-leading-snug)}.skippr\\:font-bold{--tw-font-weight:var(--skippr-font-weight-bold);font-weight:var(--skippr-font-weight-bold)}.skippr\\:font-medium{--tw-font-weight:var(--skippr-font-weight-medium);font-weight:var(--skippr-font-weight-medium)}.skippr\\:font-semibold{--tw-font-weight:var(--skippr-font-weight-semibold);font-weight:var(--skippr-font-weight-semibold)}.skippr\\:tracking-\\[-0\\.01em\\]{--tw-tracking:-.01em;letter-spacing:-.01em}.skippr\\:tracking-\\[-0\\.0125em\\]{--tw-tracking:-.0125em;letter-spacing:-.0125em}.skippr\\:tracking-\\[0\\.02em\\]{--tw-tracking:.02em;letter-spacing:.02em}.skippr\\:tracking-\\[0\\.05em\\]{--tw-tracking:.05em;letter-spacing:.05em}.skippr\\:whitespace-nowrap{white-space:nowrap}.skippr\\:text-\\[\\#2D2D3F\\]{color:#2d2d3f}.skippr\\:text-\\[\\#5a5650\\]{color:#5a5650}.skippr\\:text-\\[\\#5c5850\\]{color:#5c5850}.skippr\\:text-\\[\\#6b6660\\]{color:#6b6660}.skippr\\:text-\\[\\#6b6875\\]{color:#6b6875}.skippr\\:text-\\[\\#8b877f\\]{color:#8b877f}.skippr\\:text-\\[\\#92400e\\]{color:#92400e}.skippr\\:text-\\[\\#a8a49c\\]{color:#a8a49c}.skippr\\:text-\\[\\#b8b4ac\\]{color:#b8b4ac}.skippr\\:text-\\[\\#c9c5bd\\]{color:#c9c5bd}.skippr\\:text-\\[\\#cbc7bf\\]{color:#cbc7bf}.skippr\\:text-\\[\\#dc2626\\]{color:#dc2626}.skippr\\:text-\\[var\\(--skippr-brand-deep\\)\\]{color:var(--skippr-brand-deep)}.skippr\\:text-amber-700{color:var(--skippr-color-amber-700)}.skippr\\:text-amber-950{color:var(--skippr-color-amber-950)}.skippr\\:text-background{color:oklch(100% 0 0)}.skippr\\:text-black,.skippr\\:text-black\\/40{color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-black\\/40{color:color-mix(in oklab,var(--skippr-color-black)40%,transparent)}}.skippr\\:text-brand{color:var(--skippr-brand,#2bc0ae)}.skippr\\:text-brand-on-white{color:var(--skippr-brand-on-white,#1e8478)}.skippr\\:text-bubble{color:#2d2b3d}.skippr\\:text-chart-3{color:oklch(66.6% .179 58.318)}.skippr\\:text-destructive{color:#d94f4f}.skippr\\:text-foreground{color:oklch(14.7% .004 49.25)}.skippr\\:text-muted-foreground{color:oklch(55.3% .013 58.071)}.skippr\\:text-muted-foreground\\/30{color:oklab(55.3% .00687528 .0110332/.3)}.skippr\\:text-muted-foreground\\/60{color:oklab(55.3% .00687528 .0110332/.6)}.skippr\\:text-neutral-500{color:var(--skippr-color-neutral-500)}.skippr\\:text-neutral-700{color:var(--skippr-color-neutral-700)}.skippr\\:text-primary{color:var(--skippr-brand,#2d2b3d)}.skippr\\:text-primary-foreground{color:var(--skippr-brand-foreground,#fff)}.skippr\\:text-red-400{color:var(--skippr-color-red-400)}.skippr\\:text-red-600{color:var(--skippr-color-red-600)}.skippr\\:text-red-700{color:var(--skippr-color-red-700)}.skippr\\:text-secondary-foreground{color:#613700}.skippr\\:text-white,.skippr\\:text-white\\/60{color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-white\\/60{color:color-mix(in oklab,var(--skippr-color-white)60%,transparent)}}.skippr\\:capitalize{text-transform:capitalize}.skippr\\:uppercase{text-transform:uppercase}.skippr\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.skippr\\:line-through{text-decoration-line:line-through}.skippr\\:underline{text-decoration-line:underline}.skippr\\:decoration-muted-foreground\\/40{text-decoration-color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:underline-offset-2,.skippr\\:underline-offset-\\[2px\\]{text-underline-offset:2px}.skippr\\:placeholder-muted-foreground::placeholder{color:oklch(55.3% .013 58.071)}.skippr\\:opacity-0{opacity:0}.skippr\\:opacity-40{opacity:.4}.skippr\\:opacity-75{opacity:.75}.skippr\\:opacity-85{opacity:.85}.skippr\\:opacity-100{opacity:1}.skippr\\:shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[-3px_0_14px_var\\(--skippr-brand-halo\\)\\]{--tw-shadow:-3px 0 14px var(--tw-shadow-color,var(--skippr-brand-halo));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[-4px_6px_18px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:-4px 6px 18px var(--tw-shadow-color,#2d2d3f29);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[-6px_8px_30px_rgba\\(15\\,18\\,26\\,0\\.32\\)\\]{--tw-shadow:-6px 8px 30px var(--tw-shadow-color,#0f121a52);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_-3px_14px_var\\(--skippr-brand-halo\\)\\]{--tw-shadow:0 -3px 14px var(--tw-shadow-color,var(--skippr-brand-halo));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_-6px_18px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:0 -6px 18px var(--tw-shadow-color,#2d2d3f29);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_0_0_1\\.5px_rgba\\(255\\,255\\,255\\,0\\.85\\)\\]{--tw-shadow:0 0 0 1.5px var(--tw-shadow-color,#ffffffd9);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_0_0_1px_rgba\\(45\\,45\\,63\\,0\\.10\\)\\,0_1px_2px_rgba\\(45\\,45\\,63\\,0\\.04\\)\\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,#2d2d3f1a),0 1px 2px var(--tw-shadow-color,#2d2d3f0a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_0_0_4px_var\\(--skippr-brand-ring\\)\\]{--tw-shadow:0 0 0 4px var(--tw-shadow-color,var(--skippr-brand-ring));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_1px_2px_rgba\\(45\\,45\\,63\\,0\\.05\\)\\]{--tw-shadow:0 1px 2px var(--tw-shadow-color,#2d2d3f0d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_1px_2px_rgba\\(45\\,45\\,63\\,0\\.08\\)\\]{--tw-shadow:0 1px 2px var(--tw-shadow-color,#2d2d3f14);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_2px_6px_rgba\\(0\\,0\\,0\\,0\\.28\\)\\]{--tw-shadow:0 2px 6px var(--tw-shadow-color,#00000047);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_2px_6px_rgba\\(45\\,45\\,63\\,0\\.14\\)\\]{--tw-shadow:0 2px 6px var(--tw-shadow-color,#2d2d3f24);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_3px_14px_var\\(--skippr-brand-halo\\)\\]{--tw-shadow:0 3px 14px var(--tw-shadow-color,var(--skippr-brand-halo));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_12px_rgba\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow:0 4px 12px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_12px_rgba\\(45\\,45\\,63\\,0\\.1\\)\\]{--tw-shadow:0 4px 12px var(--tw-shadow-color,#2d2d3f1a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_14px_rgba\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_14px_rgba\\(239\\,68\\,68\\,0\\.45\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#ef444473);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_16px_rgba\\(45\\,43\\,61\\,0\\.45\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#2d2b3d73),0 2px 4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_6px_16px_rgba\\(45\\,45\\,63\\,0\\.14\\)\\]{--tw-shadow:0 6px 16px var(--tw-shadow-color,#2d2d3f24);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_6px_18px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:0 6px 18px var(--tw-shadow-color,#2d2d3f29);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_22px_rgba\\(45\\,45\\,63\\,0\\.12\\)\\,0_1px_3px_rgba\\(45\\,45\\,63\\,0\\.04\\)\\]{--tw-shadow:0 8px 22px var(--tw-shadow-color,#2d2d3f1f),0 1px 3px var(--tw-shadow-color,#2d2d3f0a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(45\\,43\\,61\\,0\\.35\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#2d2b3d59);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_30px_rgba\\(45\\,45\\,63\\,0\\.14\\)\\,0_2px_6px_rgba\\(45\\,45\\,63\\,0\\.06\\)\\]{--tw-shadow:0 8px 30px var(--tw-shadow-color,#2d2d3f24),0 2px 6px var(--tw-shadow-color,#2d2d3f0f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_26px_rgba\\(45\\,45\\,63\\,0\\.13\\)\\,0_2px_6px_rgba\\(45\\,45\\,63\\,0\\.05\\)\\]{--tw-shadow:0 10px 26px var(--tw-shadow-color,#2d2d3f21),0 2px 6px var(--tw-shadow-color,#2d2d3f0d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_28px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:0 10px 28px var(--tw-shadow-color,#2d2d3f29);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_30px_rgba\\(45\\,45\\,63\\,0\\.14\\)\\,0_0_0_1\\.5px_var\\(--skippr-brand-ring\\)\\]{--tw-shadow:0 10px 30px var(--tw-shadow-color,#2d2d3f24),0 0 0 1.5px var(--tw-shadow-color,var(--skippr-brand-ring));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_32px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 10px 32px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_14px_34px_rgba\\(45\\,45\\,63\\,0\\.15\\)\\,0_2px_6px_rgba\\(45\\,45\\,63\\,0\\.06\\)\\]{--tw-shadow:0 14px 34px var(--tw-shadow-color,#2d2d3f26),0 2px 6px var(--tw-shadow-color,#2d2d3f0f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[3px_0_14px_var\\(--skippr-brand-halo\\)\\]{--tw-shadow:3px 0 14px var(--tw-shadow-color,var(--skippr-brand-halo));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[4px_6px_18px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:4px 6px 18px var(--tw-shadow-color,#2d2d3f29);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[inset_0_0_0_1\\.5px_var\\(--skippr-brand\\,\\#2bc0ae\\)\\]{--tw-shadow:inset 0 0 0 1.5px var(--tw-shadow-color,var(--skippr-brand,#2bc0ae));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-black\\/5{--tw-ring-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-black\\/5{--tw-ring-color:color-mix(in oklab,var(--skippr-color-black)5%,transparent)}}.skippr\\:ring-brand{--tw-ring-color:var(--skippr-brand,#2bc0ae)}.skippr\\:ring-white\\/15{--tw-ring-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-white\\/15{--tw-ring-color:color-mix(in oklab,var(--skippr-color-white)15%,transparent)}}.skippr\\:ring-offset-background{--tw-ring-offset-color:oklch(100% 0 0)}.skippr\\:drop-shadow-\\[0_2px_5px_rgba\\(0\\,0\\,0\\,0\\.4\\)\\]{--tw-drop-shadow-size:drop-shadow(0 2px 5px var(--tw-drop-shadow-color,#0006));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.skippr\\:backdrop-blur-sm{--tw-backdrop-blur:blur(var(--skippr-blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.skippr\\:transition-\\[filter\\]{transition-property:filter;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[gap\\]{transition-property:gap;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[height\\]{transition-property:height;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[left\\]{transition-property:left;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[opacity\\,color\\]{transition-property:opacity,color;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[opacity\\,transform\\,height\\]{transition-property:opacity,transform,height;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[opacity\\,transform\\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\,height\\,background-color\\,border-color\\]{transition-property:width,height,background-color,border-color;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\,margin\\]{transition-property:width,margin;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:duration-75{--tw-duration:75ms;transition-duration:75ms}.skippr\\:duration-100{--tw-duration:.1s;transition-duration:.1s}.skippr\\:duration-150{--tw-duration:.15s;transition-duration:.15s}.skippr\\:duration-200{--tw-duration:.2s;transition-duration:.2s}.skippr\\:duration-300{--tw-duration:.3s;transition-duration:.3s}.skippr\\:duration-\\[400ms\\]{--tw-duration:.4s;transition-duration:.4s}.skippr\\:ease-\\[cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{--tw-ease:cubic-bezier(.22,1,.36,1);transition-timing-function:cubic-bezier(.22,1,.36,1)}.skippr\\:ease-\\[cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)\\]{--tw-ease:cubic-bezier(.34,1.3,.64,1);transition-timing-function:cubic-bezier(.34,1.3,.64,1)}.skippr\\:ease-\\[cubic-bezier\\(0\\.34\\,1\\.56\\,0\\.64\\,1\\)\\]{--tw-ease:cubic-bezier(.34,1.56,.64,1);transition-timing-function:cubic-bezier(.34,1.56,.64,1)}.skippr\\:ease-in-out{--tw-ease:var(--skippr-ease-in-out);transition-timing-function:var(--skippr-ease-in-out)}.skippr\\:ease-out{--tw-ease:var(--skippr-ease-out);transition-timing-function:var(--skippr-ease-out)}.skippr\\:outline-none{--tw-outline-style:none;outline-style:none}.skippr\\:select-none{-webkit-user-select:none;user-select:none}.skippr\\:select-text{-webkit-user-select:text;user-select:text}.skippr\\:\\[animation-delay\\:0ms\\]{animation-delay:0s}.skippr\\:\\[animation-delay\\:150ms\\]{animation-delay:.15s}.skippr\\:\\[animation-delay\\:200ms\\]{animation-delay:.2s}.skippr\\:\\[animation-delay\\:300ms\\]{animation-delay:.3s}.skippr\\:\\[animation-delay\\:400ms\\]{animation-delay:.4s}.skippr\\:\\[overflow-anchor\\:none\\]{overflow-anchor:none}.skippr\\:group-focus-within\\:scale-100:is(:where(.skippr\\:group):focus-within *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-focus-within\\:opacity-100:is(:where(.skippr\\:group):focus-within *){opacity:1}@media (hover:hover){.skippr\\:group-hover\\:scale-100:is(:where(.skippr\\:group):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-hover\\:text-red-300:is(:where(.skippr\\:group):hover *){color:var(--skippr-color-red-300)}.skippr\\:group-hover\\:text-white\\/80:is(:where(.skippr\\:group):hover *){color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:group-hover\\:text-white\\/80:is(:where(.skippr\\:group):hover *){color:color-mix(in oklab,var(--skippr-color-white)80%,transparent)}}.skippr\\:group-hover\\:opacity-100:is(:where(.skippr\\:group):hover *){opacity:1}}.skippr\\:placeholder\\:text-\\[\\#b0aca4\\]::placeholder{color:#b0aca4}.skippr\\:first\\:mt-0:first-child{margin-top:calc(var(--skippr-spacing)*0)}@media (hover:hover){.skippr\\:hover\\:-translate-y-0\\.5:hover{--tw-translate-y:calc(var(--skippr-spacing)*-.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:hover\\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:hover\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.45\\)\\]:hover{border-color:#2d2d3f73}.skippr\\:hover\\:bg-\\[\\#3a384b\\]:hover{background-color:#3a384b}.skippr\\:hover\\:bg-\\[\\#3d3d52\\]:hover{background-color:#3d3d52}.skippr\\:hover\\:bg-\\[\\#f2f0eb\\]:hover{background-color:#f2f0eb}.skippr\\:hover\\:bg-\\[\\#f4f2ee\\]:hover{background-color:#f4f2ee}.skippr\\:hover\\:bg-\\[\\#f6f4f0\\]:hover{background-color:#f6f4f0}.skippr\\:hover\\:bg-\\[rgba\\(45\\,45\\,63\\,0\\.04\\)\\]:hover{background-color:#2d2d3f0a}.skippr\\:hover\\:bg-accent:hover{background-color:#e7e5e4}.skippr\\:hover\\:bg-amber-100:hover{background-color:var(--skippr-color-amber-100)}.skippr\\:hover\\:bg-bubble:hover{background-color:#2d2b3d}.skippr\\:hover\\:bg-destructive\\/90:hover{background-color:oklab(61.4357% .15892 .0698893/.9)}.skippr\\:hover\\:bg-foreground\\/8:hover{background-color:oklab(14.7% .00261104 .00303026/.08)}.skippr\\:hover\\:bg-muted:hover{background-color:oklch(97% .001 106.424)}.skippr\\:hover\\:bg-neutral-100:hover{background-color:var(--skippr-color-neutral-100)}.skippr\\:hover\\:bg-neutral-200:hover{background-color:var(--skippr-color-neutral-200)}.skippr\\:hover\\:bg-primary\\/90:hover{background-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)90%,transparent)}}.skippr\\:hover\\:bg-red-200:hover{background-color:var(--skippr-color-red-200)}.skippr\\:hover\\:bg-red-600:hover{background-color:var(--skippr-color-red-600)}.skippr\\:hover\\:bg-secondary\\/80:hover{background-color:oklab(91.9963% .0175391 .0626889/.8)}.skippr\\:hover\\:bg-transparent:hover{background-color:#0000}.skippr\\:hover\\:text-\\[\\#2D2D3F\\]:hover{color:#2d2d3f}.skippr\\:hover\\:text-\\[\\#5a5650\\]:hover{color:#5a5650}.skippr\\:hover\\:text-accent-foreground:hover{color:oklch(21.6% .006 56.043)}.skippr\\:hover\\:text-destructive:hover{color:#d94f4f}.skippr\\:hover\\:text-foreground:hover{color:oklch(14.7% .004 49.25)}.skippr\\:hover\\:underline:hover{text-decoration-line:underline}.skippr\\:hover\\:decoration-muted-foreground:hover{text-decoration-color:oklch(55.3% .013 58.071)}.skippr\\:hover\\:opacity-80:hover{opacity:.8}.skippr\\:hover\\:opacity-100:hover{opacity:1}.skippr\\:hover\\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.skippr\\:hover\\:brightness-\\[1\\.04\\]:hover{--tw-brightness:brightness(1.04);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.skippr\\:hover\\:brightness-\\[1\\.06\\]:hover{--tw-brightness:brightness(1.06);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}}.skippr\\:focus\\:border-primary:focus{border-color:var(--skippr-brand,#2d2b3d)}.skippr\\:focus\\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:focus\\:ring-primary\\/30:focus{--tw-ring-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:focus\\:ring-primary\\/30:focus{--tw-ring-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)30%,transparent)}}.skippr\\:focus-visible\\:border-\\[var\\(--skippr-brand-ring\\)\\]:focus-visible{border-color:var(--skippr-brand-ring)}.skippr\\:focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:focus-visible\\:ring-\\[var\\(--skippr-brand-ring\\)\\]:focus-visible{--tw-ring-color:var(--skippr-brand-ring)}.skippr\\:focus-visible\\:ring-bubble\\/60:focus-visible{--tw-ring-color:oklab(29.9244% .0107414 -.0305411/.6)}.skippr\\:focus-visible\\:ring-ring:focus-visible{--tw-ring-color:oklch(70.9% .01 56.259)}.skippr\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.skippr\\:focus-visible\\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.skippr\\:focus-visible\\:outline-offset-2:focus-visible{outline-offset:2px}.skippr\\:focus-visible\\:outline-\\[var\\(--skippr-brand\\)\\]:focus-visible{outline-color:var(--skippr-brand)}.skippr\\:focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.skippr\\:active\\:translate-y-0:active{--tw-translate-y:calc(var(--skippr-spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:active\\:scale-\\[0\\.98\\]:active{scale:.98}.skippr\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.skippr\\:disabled\\:cursor-default:disabled{cursor:default}.skippr\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.skippr\\:disabled\\:opacity-50:disabled{opacity:.5}.skippr\\:disabled\\:opacity-60:disabled{opacity:.6}.skippr\\:disabled\\:opacity-80:disabled{opacity:.8}@media (hover:hover){.skippr\\:disabled\\:hover\\:bg-\\[\\#2D2D3F\\]:disabled:hover{background-color:#2d2d3f}.skippr\\:disabled\\:hover\\:bg-white:disabled:hover{background-color:var(--skippr-color-white)}}@media (prefers-reduced-motion:reduce){.skippr\\:motion-reduce\\:hidden{display:none}.skippr\\:motion-reduce\\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:motion-reduce\\:animate-none{animation:none}}.skippr\\:\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.skippr\\:\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.skippr\\:\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}}:host{--skippr-brand-active:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-active:color-mix(in srgb,var(--skippr-brand,#2bc0ae)93%,#000)}}:host{--skippr-brand-deep:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-deep:color-mix(in srgb,var(--skippr-brand,#2bc0ae)78%,#000)}}:host{--skippr-brand-ring:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-ring:color-mix(in srgb,var(--skippr-brand,#2bc0ae)22%,transparent)}}:host{--skippr-brand-halo:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-halo:color-mix(in srgb,var(--skippr-brand,#2bc0ae)40%,transparent)}}:host{--skippr-brand-glow:linear-gradient(90deg,var(--skippr-brand,#2bc0ae),var(--skippr-brand,#2bc0ae),var(--skippr-brand,#2bc0ae),var(--skippr-brand,#2bc0ae),var(--skippr-brand,#2bc0ae))}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-glow:linear-gradient(90deg,var(--skippr-brand,#2bc0ae),color-mix(in srgb,var(--skippr-brand,#2bc0ae)55%,#fff),color-mix(in srgb,var(--skippr-brand,#2bc0ae)72%,#fff),var(--skippr-brand,#2bc0ae),color-mix(in srgb,var(--skippr-brand,#2bc0ae)42%,#fff))}}@keyframes skippr-tap{0%{transform:scale(1)}45%{transform:scale(.7)}to{transform:scale(1)}}@keyframes skippr-press{0%{transform:scale(1)}55%{transform:scale(1)}85%{transform:scale(.68)}to{transform:scale(1)}}@keyframes skippr-cursor-pop{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}@keyframes skippr-click-ping{0%{opacity:.9;transform:translate(-50%,-50%)scale(.4)}to{opacity:0;transform:translate(-50%,-50%)scale(2.4)}}@keyframes skippr-tab-fade{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-speak{0%,to{opacity:.6;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-thinking-dot{0%,80%,to{opacity:.2;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}@keyframes skippr-pulse-ring{0%,to{box-shadow:0 0 #2d2b3d66}50%{box-shadow:0 0 0 10px #2d2b3d00}}@keyframes skippr-rec-ring{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)55%,transparent)}70%{box-shadow:0 0 0 11px #0000}to{box-shadow:0 0 #0000}}@keyframes skippr-voice-pulse{0%{box-shadow:0 0 0 0 var(--skippr-pulse-color,#2bc0ae80)}70%{box-shadow:0 0 0 8px #0000}to{box-shadow:0 0 #0000}}@keyframes skippr-ptt-transmit{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)60%,transparent),0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)35%,transparent)}70%{box-shadow:0 0 0 9px #0000,0 0 0 16px #0000}to{box-shadow:0 0 #0000,0 0 #0000}}@keyframes skippr-annotation-pulse{0%,to{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)50%,transparent)}50%{box-shadow:0 0 0 6px #0000}}@keyframes skippr-speak-ripple{0%{opacity:.6;transform:scale(1)}to{opacity:0;transform:scale(1.8)}}@keyframes skippr-bar{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}@keyframes skippr-breathe{0%,to{opacity:.85;transform:scale(1)}50%{opacity:1;transform:scale(1.08)}}@keyframes skippr-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-evaporate{0%{opacity:1;filter:blur();transform:translateY(0)scale(1)}55%{opacity:.85;filter:blur()}to{opacity:0;filter:blur(2.5px);transform:translateY(-7px)scale(.965)}}@keyframes skippr-mote-rise{0%{opacity:0;transform:translateY(2px)scale(.5)}25%{opacity:.85}to{opacity:0;transform:translateY(-24px)scale(1)}}@keyframes skippr-flow{0%{background-position:0%}50%{background-position:100%}to{background-position:0%}}@keyframes skippr-wave{0%,to{opacity:.4;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-bubble-in{0%{opacity:0;transform:translateY(12px)scale(.96)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-tip-in{0%{opacity:0;transform:translateY(14px)scale(.96)}60%{opacity:1;transform:translateY(-2px)scale(1.01)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-pill-content{0%{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}@keyframes skippr-banner-look{0%,to{transform:translate(0)}25%{transform:translate(-2px)}75%{transform:translate(2px)}}@keyframes skippr-finger-tap{0%,to{transform:translateY(0)rotate(0)}50%{transform:translateY(2px)rotate(-6deg)}}@keyframes skippr-toolset-pop{0%{opacity:0;transform:scale(.85)}to{opacity:1;transform:scale(1)}}@keyframes skippr-stage-fade{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}@keyframes skippr-agent-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}@keyframes skippr-orb-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}@keyframes skippr-pop{0%{opacity:0;transform:translateY(6px)scale(.98)}to{opacity:1;transform:none}}@keyframes skippr-blink{0%,40%{transform:scaleY(1)}41.3%,42%{transform:scaleY(.08)}43.3%,70%{transform:scaleY(1)}71.3%,72%{transform:scaleY(.08)}73.3%,to{transform:scaleY(1)}}.skippr-buddy-blink{transform-box:fill-box;transform-origin:50%;animation:5s linear infinite skippr-blink}@keyframes skippr-avatar-eyes-bob{0%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(0)}18%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(24px)}33.33%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(-30px)}48%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(-7px)}64%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(-30px)}82%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translateY(31px)}96%,to{transform:translateY(0)}}@keyframes skippr-avatar-pupil-glance{0%,21.33%{transform:translate(0)}28%,68%{transform:translate(-30px)}74%,to{transform:translate(0)}}@keyframes skippr-avatar-body-vibe{0%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1)}17.67%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1.08,.95)}33.67%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1)}49.67%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1.08,.95)}65.67%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1)}81.67%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:scale(1.08,.95)}96%,to{transform:scale(1)}}@keyframes skippr-avatar-blink{0%,40%{transform:scaleY(1)}41.3%,42%{transform:scaleY(.08)}43.3%,70%{transform:scaleY(1)}71.3%,72%{transform:scaleY(.08)}73.3%,to{transform:scaleY(1)}}@keyframes skippr-avatar-bub-tail-drift{0%,10%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translate(0)}45%,60%{animation-timing-function:cubic-bezier(.65,0,.36,1);transform:translate(-24px)}95%,to{transform:translate(0)}}@keyframes skippr-avatar-antenna-shake{0%,to{transform:rotate(-4deg)}25%{transform:rotate(4deg)}50%{transform:rotate(-3deg)}75%{transform:rotate(3deg)}}.skippr-avatar-eyes{animation:5s infinite skippr-avatar-eyes-bob}.skippr-avatar-pupil{animation:5s linear infinite skippr-avatar-pupil-glance}.skippr-avatar-body{transform-box:fill-box;transform-origin:50% 100%;animation:5s infinite skippr-avatar-body-vibe}.skippr-avatar-blink{transform-box:fill-box;transform-origin:50%;animation:5s infinite skippr-avatar-blink}.skippr-avatar-body .skippr-avatar-antenna{transform-box:view-box;transform-origin:48px 22px;animation:1.6s ease-in-out infinite skippr-avatar-antenna-shake}.skippr-avatar-body .skippr-avatar-bub-tail{animation:5s infinite skippr-avatar-bub-tail-drift}@keyframes skippr-buddy-bob{0%,to{transform:translateY(0)}50%{transform:translateY(-3px)}}@keyframes skippr-buddy-breathe{0%,to{transform:scale(1)}50%{transform:scale(1.15)}}@keyframes skippr-buddy-pop{0%{transform:scale(1)}50%{transform:scale(1.06)}to{transform:scale(1)}}@keyframes skippr-buddy-sleep{0%,to{transform:translateY(0)scale(1)}50%{transform:translateY(1px)scale(.995)}}@keyframes skippr-buddy-zfloat{0%{opacity:0;transform:translateY(0)}20%{opacity:1}to{opacity:0;transform:translateY(-10px)}}@keyframes skippr-peek-left{0%,20%{transform:translate(-58%)}46%,66%{transform:translate(0)}92%,to{transform:translate(-58%)}}@keyframes skippr-peek-right{0%,20%{transform:translate(58%)}46%,66%{transform:translate(0)}92%,to{transform:translate(58%)}}@keyframes skippr-peek-top{0%,20%{transform:translateY(-58%)}46%,66%{transform:translateY(0)}92%,to{transform:translateY(-58%)}}@keyframes skippr-peek-bottom{0%,20%{transform:translateY(58%)}46%,66%{transform:translateY(0)}92%,to{transform:translateY(58%)}}.skippr-peek-left{animation:3.6s ease-in-out infinite skippr-peek-left}.skippr-peek-right{animation:3.6s ease-in-out infinite skippr-peek-right}.skippr-peek-top{animation:3.6s ease-in-out infinite skippr-peek-top}.skippr-peek-bottom{animation:3.6s ease-in-out infinite skippr-peek-bottom}.skippr-peek-out{animation:none;transform:none}@keyframes skippr-fade-out{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(4px)}}@keyframes skippr-block-reveal{0%{opacity:0;max-height:0;transform:translateY(-4px)}55%{opacity:1}to{opacity:1;max-height:260px;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){.skippr-buddy-blink,[style*=skippr-blink],[style*=skippr-buddy-bob],[style*=skippr-buddy-breathe],[style*=skippr-buddy-pop],[style*=skippr-buddy-sleep],[style*=skippr-buddy-zfloat],.skippr-avatar-eyes,.skippr-avatar-pupil,.skippr-avatar-body,.skippr-avatar-blink,.skippr-avatar-body .skippr-avatar-antenna,.skippr-avatar-body .skippr-avatar-bub-tail,.skippr-peek-left,.skippr-peek-right,.skippr-peek-top,.skippr-peek-bottom{animation-play-state:paused}}.skippr-no-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.skippr-no-scrollbar::-webkit-scrollbar{display:none}:host{color:var(--color-foreground)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}`;
|
|
8979
10071
|
const hostStyle = accentColor && isHexColor(accentColor) ? {
|
|
8980
10072
|
"--skippr-brand": accentColor,
|
|
8981
10073
|
"--skippr-brand-foreground": brandForeground(accentColor),
|
|
@@ -9007,14 +10099,14 @@ function ShadowHost({
|
|
|
9007
10099
|
}
|
|
9008
10100
|
|
|
9009
10101
|
// src/components/Sidebar.tsx
|
|
9010
|
-
import { useCallback as useCallback28, useContext as
|
|
10102
|
+
import { useCallback as useCallback28, useContext as useContext19, useEffect as useEffect39, useRef as useRef34 } from "react";
|
|
9011
10103
|
|
|
9012
10104
|
// src/hooks/useCombinedMessages.ts
|
|
9013
|
-
import { useContext as
|
|
10105
|
+
import { useContext as useContext13, useMemo as useMemo9 } from "react";
|
|
9014
10106
|
|
|
9015
10107
|
// src/hooks/useChatMessages.ts
|
|
9016
|
-
import { useChat, useLocalParticipant as
|
|
9017
|
-
import { useMemo as
|
|
10108
|
+
import { useChat, useLocalParticipant as useLocalParticipant10 } from "@livekit/components-react/hooks";
|
|
10109
|
+
import { useMemo as useMemo7 } from "react";
|
|
9018
10110
|
|
|
9019
10111
|
// src/lib/filterSystemMessages.ts
|
|
9020
10112
|
var SYSTEM_MESSAGE_PATTERN = /^\[\w+\]$/;
|
|
@@ -9025,9 +10117,9 @@ function filterSystemMessages(messages) {
|
|
|
9025
10117
|
// src/hooks/useChatMessages.ts
|
|
9026
10118
|
function useChatMessages() {
|
|
9027
10119
|
const { chatMessages: rawMessages, send, isSending } = useChat();
|
|
9028
|
-
const { localParticipant } =
|
|
10120
|
+
const { localParticipant } = useLocalParticipant10();
|
|
9029
10121
|
const localIdentity = localParticipant.identity;
|
|
9030
|
-
const chatMessages =
|
|
10122
|
+
const chatMessages = useMemo7(() => {
|
|
9031
10123
|
const sortedMessages = rawMessages.map((msg) => ({
|
|
9032
10124
|
id: msg.id,
|
|
9033
10125
|
role: msg.from?.identity === localIdentity ? "user" : "assistant",
|
|
@@ -9041,20 +10133,20 @@ function useChatMessages() {
|
|
|
9041
10133
|
}
|
|
9042
10134
|
|
|
9043
10135
|
// src/hooks/useStreamingTranscript.ts
|
|
9044
|
-
import { useLocalParticipant as
|
|
9045
|
-
import { useMemo as
|
|
10136
|
+
import { useLocalParticipant as useLocalParticipant11 } from "@livekit/components-react/hooks";
|
|
10137
|
+
import { useMemo as useMemo8, useRef as useRef28 } from "react";
|
|
9046
10138
|
function useStreamingTranscript() {
|
|
9047
10139
|
const transcriptions = useSharedTranscriptions();
|
|
9048
|
-
const { localParticipant } =
|
|
10140
|
+
const { localParticipant } = useLocalParticipant11();
|
|
9049
10141
|
const { isCapturingSpeech } = useVoiceTurnContext();
|
|
9050
10142
|
const localIdentity = localParticipant.identity;
|
|
9051
|
-
const priorUserStreamIdsRef =
|
|
9052
|
-
const wasCapturingSpeechRef =
|
|
10143
|
+
const priorUserStreamIdsRef = useRef28(new Set);
|
|
10144
|
+
const wasCapturingSpeechRef = useRef28(false);
|
|
9053
10145
|
if (isCapturingSpeech && !wasCapturingSpeechRef.current) {
|
|
9054
10146
|
priorUserStreamIdsRef.current = new Set(transcriptions.filter((stream) => stream.participantInfo.identity === localIdentity).map((stream) => stream.streamInfo.id));
|
|
9055
10147
|
}
|
|
9056
10148
|
wasCapturingSpeechRef.current = isCapturingSpeech;
|
|
9057
|
-
const transcriptMessages =
|
|
10149
|
+
const transcriptMessages = useMemo8(() => filterSystemMessages(transcriptions.filter((stream) => stream.text.trim().length > 0).filter((stream) => {
|
|
9058
10150
|
if (!isCapturingSpeech)
|
|
9059
10151
|
return true;
|
|
9060
10152
|
const isUser = stream.participantInfo.identity === localIdentity;
|
|
@@ -9092,15 +10184,15 @@ function useCombinedMessages() {
|
|
|
9092
10184
|
const { transcriptMessages } = useStreamingTranscript();
|
|
9093
10185
|
const { chatMessages, sendChatMessage, isSendingChat } = useChatMessages();
|
|
9094
10186
|
const { state: agentState } = useAgentVoiceState();
|
|
9095
|
-
const historyMessages =
|
|
9096
|
-
const liveMessages =
|
|
10187
|
+
const historyMessages = useContext13(LiveAgentContext)?.historyMessages ?? [];
|
|
10188
|
+
const liveMessages = useMemo9(() => {
|
|
9097
10189
|
if (chatMessages.length === 0)
|
|
9098
10190
|
return transcriptMessages;
|
|
9099
10191
|
if (transcriptMessages.length === 0)
|
|
9100
10192
|
return chatMessages;
|
|
9101
10193
|
return mergeChatsIntoTranscripts(transcriptMessages, chatMessages);
|
|
9102
10194
|
}, [transcriptMessages, chatMessages]);
|
|
9103
|
-
const allMessages =
|
|
10195
|
+
const allMessages = useMemo9(() => {
|
|
9104
10196
|
if (historyMessages.length === 0)
|
|
9105
10197
|
return liveMessages;
|
|
9106
10198
|
const seenIds = new Set(liveMessages.map((message) => message.id));
|
|
@@ -9140,7 +10232,7 @@ function useLinkCard() {
|
|
|
9140
10232
|
}
|
|
9141
10233
|
|
|
9142
10234
|
// src/hooks/usePhaseUpdates.ts
|
|
9143
|
-
import { useCallback as useCallback24, useContext as
|
|
10235
|
+
import { useCallback as useCallback24, useContext as useContext14, useEffect as useEffect34, useMemo as useMemo10 } from "react";
|
|
9144
10236
|
function parsePhases(json) {
|
|
9145
10237
|
try {
|
|
9146
10238
|
const data = JSON.parse(json);
|
|
@@ -9153,17 +10245,27 @@ function parsePhases(json) {
|
|
|
9153
10245
|
function usePhaseUpdates() {
|
|
9154
10246
|
const parse = useCallback24(parsePhases, []);
|
|
9155
10247
|
const livePhases = useAgentState("phases", parse, []);
|
|
9156
|
-
const ctx =
|
|
9157
|
-
|
|
10248
|
+
const ctx = useContext14(LiveAgentContext);
|
|
10249
|
+
useEffect34(() => {
|
|
9158
10250
|
if (livePhases.length > 0)
|
|
9159
10251
|
ctx?.setPhasesSnapshot(livePhases);
|
|
9160
10252
|
}, [livePhases, ctx?.setPhasesSnapshot]);
|
|
9161
|
-
const
|
|
10253
|
+
const source = livePhases.length > 0 ? livePhases : ctx?.phasesSnapshot ?? [];
|
|
10254
|
+
const labels = ctx?.phaseLabels;
|
|
10255
|
+
const operatingAgentId = ctx?.agentId ?? null;
|
|
10256
|
+
const phases = useMemo10(() => {
|
|
10257
|
+
if (!labels?.agentId || labels.agentId !== operatingAgentId)
|
|
10258
|
+
return source;
|
|
10259
|
+
return source.map((phase) => {
|
|
10260
|
+
const displayName = labels.byPhaseName[phase.name];
|
|
10261
|
+
return displayName ? { ...phase, displayName } : phase;
|
|
10262
|
+
});
|
|
10263
|
+
}, [source, labels, operatingAgentId]);
|
|
9162
10264
|
return { phases };
|
|
9163
10265
|
}
|
|
9164
10266
|
|
|
9165
10267
|
// src/hooks/useSessionRemaining.ts
|
|
9166
|
-
import { useEffect as
|
|
10268
|
+
import { useEffect as useEffect35, useRef as useRef29, useState as useState27 } from "react";
|
|
9167
10269
|
|
|
9168
10270
|
// src/lib/format.ts
|
|
9169
10271
|
function formatTime(seconds) {
|
|
@@ -9179,9 +10281,9 @@ function parseNumber(s) {
|
|
|
9179
10281
|
// src/hooks/useSessionRemaining.ts
|
|
9180
10282
|
function useSessionRemaining() {
|
|
9181
10283
|
const maxCallDuration = useAgentState("maxCallDuration", parseNumber, null);
|
|
9182
|
-
const endTimeRef =
|
|
9183
|
-
const [remaining, setRemaining] =
|
|
9184
|
-
|
|
10284
|
+
const endTimeRef = useRef29(null);
|
|
10285
|
+
const [remaining, setRemaining] = useState27(null);
|
|
10286
|
+
useEffect35(() => {
|
|
9185
10287
|
if (maxCallDuration === null || endTimeRef.current !== null)
|
|
9186
10288
|
return;
|
|
9187
10289
|
const endTime = Date.now() + maxCallDuration * 1000;
|
|
@@ -9267,20 +10369,20 @@ function panelTransformOrigin(popsDown, isLeftAligned) {
|
|
|
9267
10369
|
}
|
|
9268
10370
|
|
|
9269
10371
|
// src/components/ChatHeader.tsx
|
|
9270
|
-
import { useContext as
|
|
10372
|
+
import { useContext as useContext16 } from "react";
|
|
9271
10373
|
|
|
9272
10374
|
// src/hooks/useTextMode.ts
|
|
9273
|
-
import { useLocalParticipant as
|
|
9274
|
-
import { useCallback as useCallback25, useContext as
|
|
9275
|
-
var
|
|
10375
|
+
import { useLocalParticipant as useLocalParticipant12 } from "@livekit/components-react/hooks";
|
|
10376
|
+
import { useCallback as useCallback25, useContext as useContext15, useRef as useRef30 } from "react";
|
|
10377
|
+
var textEncoder7 = new TextEncoder;
|
|
9276
10378
|
function useTextMode() {
|
|
9277
|
-
const ctx =
|
|
10379
|
+
const ctx = useContext15(LiveAgentContext);
|
|
9278
10380
|
if (!ctx) {
|
|
9279
10381
|
throw new Error("useTextMode must be used within a <LiveAgent> provider");
|
|
9280
10382
|
}
|
|
9281
10383
|
const { textMode, setTextModeState, sidebarTab, setSidebarTab } = ctx;
|
|
9282
|
-
const { localParticipant } =
|
|
9283
|
-
const confirmedTextModeRef =
|
|
10384
|
+
const { localParticipant } = useLocalParticipant12();
|
|
10385
|
+
const confirmedTextModeRef = useRef30(false);
|
|
9284
10386
|
const toggleTextMode = useCallback25(async () => {
|
|
9285
10387
|
const next = !textMode;
|
|
9286
10388
|
setTextModeState(next);
|
|
@@ -9288,7 +10390,7 @@ function useTextMode() {
|
|
|
9288
10390
|
setSidebarTab("chat");
|
|
9289
10391
|
}
|
|
9290
10392
|
try {
|
|
9291
|
-
await localParticipant.publishData(
|
|
10393
|
+
await localParticipant.publishData(textEncoder7.encode(JSON.stringify({ textMode: next })), {
|
|
9292
10394
|
reliable: true,
|
|
9293
10395
|
topic: TEXT_MODE_TOPIC
|
|
9294
10396
|
});
|
|
@@ -9307,7 +10409,7 @@ import { jsx as jsx28, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
|
9307
10409
|
var TABS_PILL_BASE = "skippr:cursor-pointer skippr:rounded-full skippr:border-none skippr:bg-transparent skippr:px-[9px] skippr:py-[3px] skippr:text-[11.5px] skippr:font-semibold skippr:text-[#8b877f] skippr:transition-colors";
|
|
9308
10410
|
var TABS_PILL_ACTIVE = "skippr:bg-white skippr:text-[#2D2D3F] skippr:shadow-[0_1px_2px_rgba(45,45,63,0.08)]";
|
|
9309
10411
|
function ChatHeader({ wasDraggedRef, draggable, headerRef }) {
|
|
9310
|
-
const ctx =
|
|
10412
|
+
const ctx = useContext16(LiveAgentContext);
|
|
9311
10413
|
if (!ctx) {
|
|
9312
10414
|
throw new Error("ChatHeader must be used within a <LiveAgent> provider");
|
|
9313
10415
|
}
|
|
@@ -9323,6 +10425,7 @@ function ChatHeader({ wasDraggedRef, draggable, headerRef }) {
|
|
|
9323
10425
|
} = ctx;
|
|
9324
10426
|
const { isHeld } = useSessionHoldContext();
|
|
9325
10427
|
const { textMode, toggleTextMode } = useTextMode();
|
|
10428
|
+
const copy = useChromeCopy();
|
|
9326
10429
|
const defaultModule = displayModules.find((m) => m.id === defaultAgentId) ?? null;
|
|
9327
10430
|
const displayedMode = agentMode ?? defaultModule?.mode ?? null;
|
|
9328
10431
|
const showAgenda = displayedMode !== AGENT_MODE.AlwaysOn;
|
|
@@ -9333,7 +10436,7 @@ function ChatHeader({ wasDraggedRef, draggable, headerRef }) {
|
|
|
9333
10436
|
children: [
|
|
9334
10437
|
showAgenda ? /* @__PURE__ */ jsxs21("div", {
|
|
9335
10438
|
role: "tablist",
|
|
9336
|
-
"aria-label":
|
|
10439
|
+
"aria-label": copy.chatPanelLabel,
|
|
9337
10440
|
"data-skippr-no-drag": "",
|
|
9338
10441
|
className: "skippr:flex skippr:gap-[2px] skippr:rounded-full skippr:bg-[#f4f2ee] skippr:p-[2px]",
|
|
9339
10442
|
children: [
|
|
@@ -9343,7 +10446,7 @@ function ChatHeader({ wasDraggedRef, draggable, headerRef }) {
|
|
|
9343
10446
|
"aria-selected": sidebarTab === "chat",
|
|
9344
10447
|
onClick: () => setSidebarTab("chat"),
|
|
9345
10448
|
className: cn(TABS_PILL_BASE, sidebarTab === "chat" && TABS_PILL_ACTIVE),
|
|
9346
|
-
children:
|
|
10449
|
+
children: copy.chatTabChat
|
|
9347
10450
|
}),
|
|
9348
10451
|
/* @__PURE__ */ jsx28("button", {
|
|
9349
10452
|
type: "button",
|
|
@@ -9351,12 +10454,12 @@ function ChatHeader({ wasDraggedRef, draggable, headerRef }) {
|
|
|
9351
10454
|
"aria-selected": sidebarTab === "agenda",
|
|
9352
10455
|
onClick: () => setSidebarTab("agenda"),
|
|
9353
10456
|
className: cn(TABS_PILL_BASE, sidebarTab === "agenda" && TABS_PILL_ACTIVE),
|
|
9354
|
-
children:
|
|
10457
|
+
children: copy.chatTabAgenda
|
|
9355
10458
|
})
|
|
9356
10459
|
]
|
|
9357
10460
|
}) : /* @__PURE__ */ jsx28("span", {
|
|
9358
10461
|
className: "skippr:text-[12.5px] skippr:font-semibold skippr:tracking-[-0.01em] skippr:text-[#2D2D3F]",
|
|
9359
|
-
children:
|
|
10462
|
+
children: copy.chatPanelTitle
|
|
9360
10463
|
}),
|
|
9361
10464
|
/* @__PURE__ */ jsx28("div", {
|
|
9362
10465
|
className: "skippr:flex-1"
|
|
@@ -9365,8 +10468,8 @@ function ChatHeader({ wasDraggedRef, draggable, headerRef }) {
|
|
|
9365
10468
|
type: "button",
|
|
9366
10469
|
disabled: isHeld,
|
|
9367
10470
|
onClick: () => void toggleTextMode(),
|
|
9368
|
-
title: textMode ?
|
|
9369
|
-
"aria-label": textMode ?
|
|
10471
|
+
title: textMode ? copy.chatSwitchToVoice : copy.chatSwitchToText,
|
|
10472
|
+
"aria-label": textMode ? copy.chatSwitchToVoice : copy.chatSwitchToText,
|
|
9370
10473
|
"data-skippr-no-drag": "",
|
|
9371
10474
|
className: "skippr:flex skippr:h-[26px] skippr:shrink-0 skippr:cursor-pointer skippr:items-center skippr:gap-[5px] skippr:rounded-full skippr:border skippr:border-[rgba(45,45,63,0.12)] skippr:bg-white skippr:pl-[9px] skippr:pr-[10px] skippr:text-[11px] skippr:font-semibold skippr:text-[#5c5850] skippr:transition-colors skippr:hover:bg-[#f6f4f0] skippr:hover:text-[#2D2D3F] skippr:disabled:cursor-not-allowed skippr:disabled:opacity-50",
|
|
9372
10475
|
children: [
|
|
@@ -9377,7 +10480,7 @@ function ChatHeader({ wasDraggedRef, draggable, headerRef }) {
|
|
|
9377
10480
|
className: "skippr:size-[13px]",
|
|
9378
10481
|
strokeWidth: 2
|
|
9379
10482
|
}),
|
|
9380
|
-
textMode ?
|
|
10483
|
+
textMode ? copy.chatToggleVoice : copy.chatToggleText
|
|
9381
10484
|
]
|
|
9382
10485
|
}),
|
|
9383
10486
|
minimizable && /* @__PURE__ */ jsx28("button", {
|
|
@@ -9386,8 +10489,8 @@ function ChatHeader({ wasDraggedRef, draggable, headerRef }) {
|
|
|
9386
10489
|
if (!wasDraggedRef.current)
|
|
9387
10490
|
minimizePanel();
|
|
9388
10491
|
},
|
|
9389
|
-
"aria-label":
|
|
9390
|
-
title:
|
|
10492
|
+
"aria-label": copy.closeLabel,
|
|
10493
|
+
title: copy.closeLabel,
|
|
9391
10494
|
"data-skippr-no-drag": "",
|
|
9392
10495
|
className: "skippr:flex skippr:size-[26px] skippr:shrink-0 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-transparent skippr:text-[#a8a49c] skippr:transition-colors skippr:hover:bg-[#f4f2ee] skippr:hover:text-[#2D2D3F]",
|
|
9393
10496
|
children: /* @__PURE__ */ jsx28(X, {
|
|
@@ -9452,26 +10555,27 @@ function LogoMark({ className, decorative }) {
|
|
|
9452
10555
|
}
|
|
9453
10556
|
|
|
9454
10557
|
// src/components/MessageList.tsx
|
|
9455
|
-
import { useCallback as useCallback27, useLayoutEffect as useLayoutEffect3, useRef as
|
|
10558
|
+
import { useCallback as useCallback27, useLayoutEffect as useLayoutEffect3, useRef as useRef33, useState as useState31 } from "react";
|
|
9456
10559
|
|
|
9457
10560
|
// src/components/ChatInput.tsx
|
|
9458
|
-
import { useContext as
|
|
10561
|
+
import { useContext as useContext17, useEffect as useEffect36, useRef as useRef31, useState as useState28 } from "react";
|
|
9459
10562
|
import { jsx as jsx31, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
9460
10563
|
var MAX_INPUT_HEIGHT = 60;
|
|
9461
10564
|
function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
|
|
9462
|
-
const ctx =
|
|
10565
|
+
const ctx = useContext17(LiveAgentContext);
|
|
10566
|
+
const copy = useChromeCopy();
|
|
9463
10567
|
const reportChatActivity = ctx?.reportChatActivity;
|
|
9464
10568
|
const isPanelOpen = ctx?.isPanelOpen;
|
|
9465
|
-
const [localDraft, setLocalDraft] =
|
|
10569
|
+
const [localDraft, setLocalDraft] = useState28("");
|
|
9466
10570
|
const inputText = ctx?.chatDraft ?? localDraft;
|
|
9467
10571
|
const setInputText = ctx?.setChatDraft ?? setLocalDraft;
|
|
9468
|
-
const textareaRef =
|
|
10572
|
+
const textareaRef = useRef31(null);
|
|
9469
10573
|
const canSend = inputText.trim().length > 0 && !isSendingChat;
|
|
9470
|
-
|
|
10574
|
+
useEffect36(() => {
|
|
9471
10575
|
if (autoFocus && isPanelOpen !== false)
|
|
9472
10576
|
textareaRef.current?.focus();
|
|
9473
10577
|
}, [autoFocus, isPanelOpen]);
|
|
9474
|
-
|
|
10578
|
+
useEffect36(() => {
|
|
9475
10579
|
const el = textareaRef.current;
|
|
9476
10580
|
if (!el)
|
|
9477
10581
|
return;
|
|
@@ -9509,15 +10613,15 @@ function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
|
|
|
9509
10613
|
value: inputText,
|
|
9510
10614
|
onChange: handleChange,
|
|
9511
10615
|
onKeyDown: handleKeyDown,
|
|
9512
|
-
placeholder:
|
|
9513
|
-
"aria-label":
|
|
10616
|
+
placeholder: copy.chatMessagePlaceholder,
|
|
10617
|
+
"aria-label": copy.chatMessageLabel,
|
|
9514
10618
|
className: "skippr:min-w-0 skippr:flex-1 skippr:resize-none skippr:overflow-y-auto skippr:rounded-[10px] skippr:border skippr:border-[rgba(45,45,63,0.14)] skippr:bg-white skippr:px-[10px] skippr:py-[7px] skippr:text-[13px] skippr:font-medium skippr:leading-5 skippr:text-[#2D2D3F] skippr:shadow-[0_1px_2px_rgba(45,45,63,0.05)] skippr:outline-none skippr:focus-visible:border-[var(--skippr-brand-ring)] skippr:focus-visible:ring-2 skippr:focus-visible:ring-[var(--skippr-brand-ring)] skippr:placeholder:text-[#b0aca4]",
|
|
9515
10619
|
style: { maxHeight: `${MAX_INPUT_HEIGHT}px` }
|
|
9516
10620
|
}),
|
|
9517
10621
|
/* @__PURE__ */ jsx31("button", {
|
|
9518
10622
|
type: "submit",
|
|
9519
10623
|
disabled: !canSend,
|
|
9520
|
-
"aria-label":
|
|
10624
|
+
"aria-label": copy.chatSendMessageLabel,
|
|
9521
10625
|
style: {
|
|
9522
10626
|
background: canSend ? "var(--skippr-brand, #2bc0ae)" : "#cdd8d5",
|
|
9523
10627
|
color: "var(--skippr-brand-foreground, #2d2b3d)"
|
|
@@ -9562,7 +10666,7 @@ function ChatMessage({ message }) {
|
|
|
9562
10666
|
}
|
|
9563
10667
|
|
|
9564
10668
|
// src/components/LinkCard.tsx
|
|
9565
|
-
import { useCallback as useCallback26, useEffect as
|
|
10669
|
+
import { useCallback as useCallback26, useEffect as useEffect37, useRef as useRef32, useState as useState29 } from "react";
|
|
9566
10670
|
|
|
9567
10671
|
// src/lib/clipboard.ts
|
|
9568
10672
|
async function copyToClipboard(text) {
|
|
@@ -9579,15 +10683,16 @@ import { jsx as jsx33, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
|
9579
10683
|
var COPIED_RESET_MS = 2000;
|
|
9580
10684
|
var DISMISS_AFTER_COPY_MS = 3000;
|
|
9581
10685
|
function LinkCard({ card, onDismiss }) {
|
|
9582
|
-
const [copied, setCopied] =
|
|
9583
|
-
const
|
|
9584
|
-
|
|
10686
|
+
const [copied, setCopied] = useState29(false);
|
|
10687
|
+
const copy = useChromeCopy();
|
|
10688
|
+
const dismissTimerRef = useRef32(null);
|
|
10689
|
+
useEffect37(() => {
|
|
9585
10690
|
if (!copied)
|
|
9586
10691
|
return;
|
|
9587
10692
|
const timer = setTimeout(() => setCopied(false), COPIED_RESET_MS);
|
|
9588
10693
|
return () => clearTimeout(timer);
|
|
9589
10694
|
}, [copied]);
|
|
9590
|
-
|
|
10695
|
+
useEffect37(() => {
|
|
9591
10696
|
return () => {
|
|
9592
10697
|
if (dismissTimerRef.current)
|
|
9593
10698
|
clearTimeout(dismissTimerRef.current);
|
|
@@ -9613,7 +10718,7 @@ function LinkCard({ card, onDismiss }) {
|
|
|
9613
10718
|
/* @__PURE__ */ jsx33("button", {
|
|
9614
10719
|
type: "button",
|
|
9615
10720
|
onClick: onDismiss,
|
|
9616
|
-
"aria-label":
|
|
10721
|
+
"aria-label": copy.cardDismissLink,
|
|
9617
10722
|
className: "skippr:-mr-1 skippr:-mt-1 skippr:flex skippr:size-6 skippr:shrink-0 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:text-muted-foreground skippr:transition-colors skippr:hover:bg-muted skippr:hover:text-foreground",
|
|
9618
10723
|
children: /* @__PURE__ */ jsx33(X, {
|
|
9619
10724
|
className: "skippr:size-3.5",
|
|
@@ -9638,21 +10743,21 @@ function LinkCard({ card, onDismiss }) {
|
|
|
9638
10743
|
/* @__PURE__ */ jsx33(ExternalLink, {
|
|
9639
10744
|
className: "skippr:size-4"
|
|
9640
10745
|
}),
|
|
9641
|
-
|
|
10746
|
+
copy.cardOpenLink
|
|
9642
10747
|
]
|
|
9643
10748
|
}),
|
|
9644
10749
|
/* @__PURE__ */ jsxs26(Button, {
|
|
9645
10750
|
variant: "outline",
|
|
9646
10751
|
className: "skippr:flex-1 skippr:py-2",
|
|
9647
10752
|
onClick: handleCopy,
|
|
9648
|
-
"aria-label":
|
|
10753
|
+
"aria-label": copy.cardCopyLink,
|
|
9649
10754
|
children: [
|
|
9650
10755
|
copied ? /* @__PURE__ */ jsx33(Check, {
|
|
9651
10756
|
className: "skippr:size-4"
|
|
9652
10757
|
}) : /* @__PURE__ */ jsx33(Copy, {
|
|
9653
10758
|
className: "skippr:size-4"
|
|
9654
10759
|
}),
|
|
9655
|
-
copied ?
|
|
10760
|
+
copied ? copy.cardCopied : copy.cardCopyLink
|
|
9656
10761
|
]
|
|
9657
10762
|
})
|
|
9658
10763
|
]
|
|
@@ -9662,7 +10767,7 @@ function LinkCard({ card, onDismiss }) {
|
|
|
9662
10767
|
}
|
|
9663
10768
|
|
|
9664
10769
|
// src/components/PlanCard.tsx
|
|
9665
|
-
import { useEffect as
|
|
10770
|
+
import { useEffect as useEffect38, useState as useState30 } from "react";
|
|
9666
10771
|
import { jsx as jsx34, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
9667
10772
|
var APPROVE_MESSAGE = "Yes, go ahead.";
|
|
9668
10773
|
var CANCEL_MESSAGE = "No, cancel that.";
|
|
@@ -9689,9 +10794,10 @@ function StepIcon({ status }) {
|
|
|
9689
10794
|
});
|
|
9690
10795
|
}
|
|
9691
10796
|
function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
10797
|
+
const copy = useChromeCopy();
|
|
9692
10798
|
const awaitingApproval = plan.state === "proposed";
|
|
9693
|
-
const [isApproving, setIsApproving] =
|
|
9694
|
-
const [lastPlanId, setLastPlanId] =
|
|
10799
|
+
const [isApproving, setIsApproving] = useState30(false);
|
|
10800
|
+
const [lastPlanId, setLastPlanId] = useState30(plan.planId);
|
|
9695
10801
|
if (plan.planId !== lastPlanId) {
|
|
9696
10802
|
setLastPlanId(plan.planId);
|
|
9697
10803
|
setIsApproving(false);
|
|
@@ -9703,13 +10809,13 @@ function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
|
9703
10809
|
setIsApproving(false);
|
|
9704
10810
|
});
|
|
9705
10811
|
};
|
|
9706
|
-
|
|
10812
|
+
useEffect38(() => {
|
|
9707
10813
|
if (!isApproving)
|
|
9708
10814
|
return;
|
|
9709
10815
|
const timer = setTimeout(() => setIsApproving(false), APPROVING_RESET_MS);
|
|
9710
10816
|
return () => clearTimeout(timer);
|
|
9711
10817
|
}, [isApproving]);
|
|
9712
|
-
|
|
10818
|
+
useEffect38(() => {
|
|
9713
10819
|
if (plan.state !== "completed")
|
|
9714
10820
|
return;
|
|
9715
10821
|
const timer = setTimeout(onDismiss, COMPLETED_CARD_VISIBLE_MS);
|
|
@@ -9720,7 +10826,7 @@ function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
|
9720
10826
|
children: [
|
|
9721
10827
|
/* @__PURE__ */ jsx34("p", {
|
|
9722
10828
|
className: "skippr:mb-3 skippr:text-sm skippr:font-semibold skippr:leading-snug skippr:text-foreground",
|
|
9723
|
-
children:
|
|
10829
|
+
children: copy.planTitle
|
|
9724
10830
|
}),
|
|
9725
10831
|
/* @__PURE__ */ jsx34("div", {
|
|
9726
10832
|
className: "skippr:space-y-2",
|
|
@@ -9748,7 +10854,7 @@ function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
|
9748
10854
|
isApproving && /* @__PURE__ */ jsx34("span", {
|
|
9749
10855
|
className: "skippr:size-3 skippr:shrink-0 skippr:animate-spin skippr:rounded-full skippr:border-2 skippr:border-white/30 skippr:border-t-white"
|
|
9750
10856
|
}),
|
|
9751
|
-
isApproving ?
|
|
10857
|
+
isApproving ? copy.planApproving : copy.planApprove
|
|
9752
10858
|
]
|
|
9753
10859
|
}),
|
|
9754
10860
|
/* @__PURE__ */ jsx34(Button, {
|
|
@@ -9756,7 +10862,7 @@ function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
|
9756
10862
|
className: "skippr:flex-1 skippr:py-2",
|
|
9757
10863
|
disabled: isApproving,
|
|
9758
10864
|
onClick: () => sendChatMessage(CANCEL_MESSAGE),
|
|
9759
|
-
children:
|
|
10865
|
+
children: copy.planCancel
|
|
9760
10866
|
})
|
|
9761
10867
|
]
|
|
9762
10868
|
})
|
|
@@ -9767,13 +10873,14 @@ function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
|
9767
10873
|
// src/components/TypingIndicator.tsx
|
|
9768
10874
|
import { jsx as jsx35, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
9769
10875
|
function TypingIndicator() {
|
|
10876
|
+
const copy = useChromeCopy();
|
|
9770
10877
|
return /* @__PURE__ */ jsx35("div", {
|
|
9771
10878
|
className: "skippr:flex skippr:items-start skippr:gap-2 skippr:animate-skippr-tab-fade",
|
|
9772
10879
|
children: /* @__PURE__ */ jsxs28("div", {
|
|
9773
10880
|
className: "skippr:inline-flex skippr:items-center skippr:gap-1 skippr:rounded-2xl skippr:border skippr:border-primary/20 skippr:bg-primary/10 skippr:px-4 skippr:py-2 skippr:text-xs skippr:text-primary",
|
|
9774
10881
|
children: [
|
|
9775
10882
|
/* @__PURE__ */ jsx35("span", {
|
|
9776
|
-
children:
|
|
10883
|
+
children: copy.chatAnalyzingScreen
|
|
9777
10884
|
}),
|
|
9778
10885
|
/* @__PURE__ */ jsxs28("span", {
|
|
9779
10886
|
className: "skippr:inline-flex skippr:items-center skippr:gap-[2px]",
|
|
@@ -9807,17 +10914,18 @@ function MessageList({
|
|
|
9807
10914
|
autoFocus = false,
|
|
9808
10915
|
readOnly = false
|
|
9809
10916
|
}) {
|
|
9810
|
-
const
|
|
9811
|
-
const
|
|
9812
|
-
const
|
|
9813
|
-
const
|
|
10917
|
+
const copy = useChromeCopy();
|
|
10918
|
+
const containerRef = useRef33(null);
|
|
10919
|
+
const isPinnedToBottom = useRef33(true);
|
|
10920
|
+
const lastSeenMessageId = useRef33(undefined);
|
|
10921
|
+
const [showJumpToLatest, setShowJumpToLatest] = useState31(false);
|
|
9814
10922
|
const lastMessage = messages.length > 0 ? messages[messages.length - 1] : undefined;
|
|
9815
|
-
const [dismissedPlanId, setDismissedPlanId] =
|
|
10923
|
+
const [dismissedPlanId, setDismissedPlanId] = useState31(null);
|
|
9816
10924
|
const dismissPlan = useCallback27(() => {
|
|
9817
10925
|
if (plan)
|
|
9818
10926
|
setDismissedPlanId(plan.planId);
|
|
9819
10927
|
}, [plan]);
|
|
9820
|
-
const [dismissedLinkCardId, setDismissedLinkCardId] =
|
|
10928
|
+
const [dismissedLinkCardId, setDismissedLinkCardId] = useState31(null);
|
|
9821
10929
|
const dismissLinkCard = useCallback27(() => {
|
|
9822
10930
|
if (linkCard)
|
|
9823
10931
|
setDismissedLinkCardId(linkCard.cardId);
|
|
@@ -9868,9 +10976,9 @@ function MessageList({
|
|
|
9868
10976
|
children: [
|
|
9869
10977
|
messages.length === 0 && !showTyping && (readOnly ? /* @__PURE__ */ jsx36("p", {
|
|
9870
10978
|
className: "skippr:px-2 skippr:py-6 skippr:text-center skippr:text-sm skippr:text-muted-foreground",
|
|
9871
|
-
children:
|
|
10979
|
+
children: copy.chatEmptyConversation
|
|
9872
10980
|
}) : /* @__PURE__ */ jsx36(LoadingDots, {
|
|
9873
|
-
label:
|
|
10981
|
+
label: copy.chatWaitingToBegin
|
|
9874
10982
|
})),
|
|
9875
10983
|
messages.map((message) => /* @__PURE__ */ jsx36(ChatMessage, {
|
|
9876
10984
|
message
|
|
@@ -9881,7 +10989,7 @@ function MessageList({
|
|
|
9881
10989
|
showJumpToLatest && /* @__PURE__ */ jsx36("button", {
|
|
9882
10990
|
type: "button",
|
|
9883
10991
|
onClick: jumpToLatest,
|
|
9884
|
-
"aria-label":
|
|
10992
|
+
"aria-label": copy.chatJumpToLatest,
|
|
9885
10993
|
className: "skippr:-translate-x-1/2 skippr:absolute skippr:bottom-3 skippr:left-1/2 skippr:flex skippr:min-h-11 skippr:min-w-11 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:border skippr:border-border skippr:bg-background skippr:p-1.5 skippr:text-foreground skippr:shadow-md skippr:transition-colors skippr:hover:bg-muted",
|
|
9886
10994
|
children: /* @__PURE__ */ jsx36(ChevronDown, {
|
|
9887
10995
|
className: "skippr:size-4"
|
|
@@ -9916,16 +11024,18 @@ function MessageList({
|
|
|
9916
11024
|
}
|
|
9917
11025
|
|
|
9918
11026
|
// src/components/SessionAgenda.tsx
|
|
9919
|
-
import { useContext as
|
|
11027
|
+
import { useContext as useContext18 } from "react";
|
|
9920
11028
|
import { jsx as jsx37, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
9921
11029
|
function SessionAgenda({ phases, hasStarted }) {
|
|
9922
|
-
const ctx =
|
|
9923
|
-
const
|
|
11030
|
+
const ctx = useContext18(LiveAgentContext);
|
|
11031
|
+
const copy = useChromeCopy();
|
|
11032
|
+
const sessionTitle = ctx?.phaseLabels.agentId && ctx.phaseLabels.agentId === ctx.agentId ? ctx.phaseLabels.agentName : undefined;
|
|
11033
|
+
const title = sessionTitle ?? ctx?.activeModule?.name ?? copy.agendaTitle;
|
|
9924
11034
|
if (phases.length === 0 || !hasStarted) {
|
|
9925
11035
|
return /* @__PURE__ */ jsx37("div", {
|
|
9926
11036
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
|
|
9927
11037
|
children: /* @__PURE__ */ jsx37(LoadingDots, {
|
|
9928
|
-
label:
|
|
11038
|
+
label: copy.agendaLoading
|
|
9929
11039
|
})
|
|
9930
11040
|
});
|
|
9931
11041
|
}
|
|
@@ -9938,26 +11048,21 @@ function SessionAgenda({ phases, hasStarted }) {
|
|
|
9938
11048
|
className: "skippr:flex-1 skippr:overflow-y-auto skippr:p-[14px]",
|
|
9939
11049
|
children: [
|
|
9940
11050
|
/* @__PURE__ */ jsxs30("div", {
|
|
9941
|
-
className: "skippr:mb-2 skippr:flex skippr:items-baseline skippr:justify-between",
|
|
11051
|
+
className: "skippr:mb-2 skippr:flex skippr:items-baseline skippr:justify-between skippr:gap-2",
|
|
9942
11052
|
children: [
|
|
9943
11053
|
/* @__PURE__ */ jsx37("span", {
|
|
9944
|
-
className: "skippr:text-[12.5px] skippr:font-semibold skippr:text-[#2D2D3F]",
|
|
11054
|
+
className: "skippr:min-w-0 skippr:text-[12.5px] skippr:font-semibold skippr:text-[#2D2D3F]",
|
|
9945
11055
|
children: title
|
|
9946
11056
|
}),
|
|
9947
|
-
/* @__PURE__ */
|
|
9948
|
-
className: "skippr:text-[11px] skippr:font-semibold skippr:text-[var(--skippr-brand-deep)]",
|
|
9949
|
-
children:
|
|
9950
|
-
"step ",
|
|
9951
|
-
currentStep,
|
|
9952
|
-
" of ",
|
|
9953
|
-
total
|
|
9954
|
-
]
|
|
11057
|
+
/* @__PURE__ */ jsx37("span", {
|
|
11058
|
+
className: "skippr:shrink-0 skippr:whitespace-nowrap skippr:text-[11px] skippr:font-semibold skippr:text-[var(--skippr-brand-deep)]",
|
|
11059
|
+
children: fillPlaceholders(copy.agendaProgress, { step: currentStep, total })
|
|
9955
11060
|
})
|
|
9956
11061
|
]
|
|
9957
11062
|
}),
|
|
9958
11063
|
/* @__PURE__ */ jsx37("div", {
|
|
9959
11064
|
role: "progressbar",
|
|
9960
|
-
"aria-label":
|
|
11065
|
+
"aria-label": copy.agendaProgressLabel,
|
|
9961
11066
|
"aria-valuenow": Math.round(progressPct),
|
|
9962
11067
|
"aria-valuemin": 0,
|
|
9963
11068
|
"aria-valuemax": 100,
|
|
@@ -9989,12 +11094,12 @@ function SessionAgenda({ phases, hasStarted }) {
|
|
|
9989
11094
|
className: "skippr:size-[19px] skippr:shrink-0 skippr:rounded-full skippr:border-2 skippr:border-[#d8d3ca] skippr:bg-white"
|
|
9990
11095
|
}),
|
|
9991
11096
|
/* @__PURE__ */ jsx37("span", {
|
|
9992
|
-
className: cn("skippr:text-[12.5px]", isActive || isCompleted ? "skippr:font-semibold skippr:text-[#2D2D3F]" : "skippr:font-medium skippr:text-[#a8a49c]"),
|
|
9993
|
-
children: phase.name
|
|
11097
|
+
className: cn("skippr:min-w-0 skippr:text-[12.5px]", isActive || isCompleted ? "skippr:font-semibold skippr:text-[#2D2D3F]" : "skippr:font-medium skippr:text-[#a8a49c]"),
|
|
11098
|
+
children: phase.displayName ?? phase.name
|
|
9994
11099
|
}),
|
|
9995
11100
|
isActive && /* @__PURE__ */ jsx37("span", {
|
|
9996
|
-
className: "skippr:ml-auto skippr:text-[9.5px] skippr:font-bold skippr:uppercase skippr:tracking-[0.05em] skippr:text-[var(--skippr-brand-deep)]",
|
|
9997
|
-
children:
|
|
11101
|
+
className: "skippr:ml-auto skippr:shrink-0 skippr:whitespace-nowrap skippr:text-[9.5px] skippr:font-bold skippr:uppercase skippr:tracking-[0.05em] skippr:text-[var(--skippr-brand-deep)]",
|
|
11102
|
+
children: copy.agendaNowBadge
|
|
9998
11103
|
})
|
|
9999
11104
|
]
|
|
10000
11105
|
}, phase.name);
|
|
@@ -10007,19 +11112,19 @@ function SessionAgenda({ phases, hasStarted }) {
|
|
|
10007
11112
|
import { jsx as jsx38 } from "react/jsx-runtime";
|
|
10008
11113
|
var SESSION_WARNING_THRESHOLD_SECS = 60;
|
|
10009
11114
|
function SessionWarningBanner({ remaining }) {
|
|
11115
|
+
const copy = useChromeCopy();
|
|
10010
11116
|
if (remaining === null || remaining <= 0 || remaining > SESSION_WARNING_THRESHOLD_SECS)
|
|
10011
11117
|
return null;
|
|
10012
11118
|
return /* @__PURE__ */ jsx38("div", {
|
|
10013
11119
|
"data-testid": "session-warning-banner",
|
|
10014
11120
|
role: "alert",
|
|
10015
11121
|
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",
|
|
10016
|
-
children:
|
|
11122
|
+
children: copy.sessionEndingSoon
|
|
10017
11123
|
});
|
|
10018
11124
|
}
|
|
10019
11125
|
|
|
10020
11126
|
// src/components/Sidebar.tsx
|
|
10021
11127
|
import { jsx as jsx39, jsxs as jsxs31, Fragment as Fragment4 } from "react/jsx-runtime";
|
|
10022
|
-
var ATTRIBUTION_PREFIX = "Powered by";
|
|
10023
11128
|
var ATTRIBUTION_BRAND = "Skippr";
|
|
10024
11129
|
var ATTRIBUTION_URL = "https://www.skippr.ai/";
|
|
10025
11130
|
var FOCUS_RING2 = "skippr:focus-visible:outline-2 skippr:focus-visible:outline-offset-2 skippr:focus-visible:outline-[var(--skippr-brand)]";
|
|
@@ -10049,7 +11154,8 @@ function Sidebar({
|
|
|
10049
11154
|
agentMode,
|
|
10050
11155
|
displayModules
|
|
10051
11156
|
} = useLiveAgent();
|
|
10052
|
-
const
|
|
11157
|
+
const copy = useChromeCopy();
|
|
11158
|
+
const internalCtx = useContext19(LiveAgentContext);
|
|
10053
11159
|
const defaultAgentId = internalCtx?.defaultAgentId ?? null;
|
|
10054
11160
|
const startDefaultSession = internalCtx?.startDefaultSession ?? (() => {});
|
|
10055
11161
|
const talkDisabled = !(internalCtx?.hasResolvedModules ?? false);
|
|
@@ -10082,14 +11188,14 @@ function Sidebar({
|
|
|
10082
11188
|
}, [setBarPos, voiceBarRef]);
|
|
10083
11189
|
const followsPanel = isFloating && isPanelOpen;
|
|
10084
11190
|
const dragFollowers = followsPanel && panelRef && controlBarRef && voiceBarRef ? [panelRef, controlBarRef, voiceBarRef] : null;
|
|
10085
|
-
const headerRef =
|
|
11191
|
+
const headerRef = useRef34(null);
|
|
10086
11192
|
const { wasDraggedRef } = useLauncherDrag(headerRef, onPanelDrop, dragFollowers, setIsDragging, isFloating);
|
|
10087
11193
|
const anchor2 = isFloating ? resolvePanelAnchor(barPos, SIDEBAR_WIDTH) : null;
|
|
10088
11194
|
const floatingStyle = anchor2 ? {
|
|
10089
11195
|
...anchor2.style,
|
|
10090
11196
|
height: panelExpanded ? anchor2.availableHeight : `min(${PANEL_MAX_HEIGHT_PX}px, ${anchor2.availableHeight})`
|
|
10091
11197
|
} : undefined;
|
|
10092
|
-
|
|
11198
|
+
useEffect39(() => {
|
|
10093
11199
|
if (!isSidebar)
|
|
10094
11200
|
return;
|
|
10095
11201
|
const prop = position === "right" ? "marginRight" : "marginLeft";
|
|
@@ -10136,7 +11242,7 @@ function Sidebar({
|
|
|
10136
11242
|
}) : usesHostAuth || isValidating || isAuthenticated ? /* @__PURE__ */ jsx39("div", {
|
|
10137
11243
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
|
|
10138
11244
|
children: /* @__PURE__ */ jsx39(LoadingDots, {
|
|
10139
|
-
label:
|
|
11245
|
+
label: copy.loading
|
|
10140
11246
|
})
|
|
10141
11247
|
}) : /* @__PURE__ */ jsx39("div", {
|
|
10142
11248
|
"data-skippr-no-drag": "",
|
|
@@ -10167,6 +11273,7 @@ function AuthenticatedContent({
|
|
|
10167
11273
|
talkDisabled,
|
|
10168
11274
|
showTalk
|
|
10169
11275
|
}) {
|
|
11276
|
+
const copy = useChromeCopy();
|
|
10170
11277
|
const inSession = isConnected || isStarting || isPaused || isPausing;
|
|
10171
11278
|
const effectiveTab = showAgenda ? activeTab : "chat";
|
|
10172
11279
|
return /* @__PURE__ */ jsxs31(Fragment4, {
|
|
@@ -10177,7 +11284,7 @@ function AuthenticatedContent({
|
|
|
10177
11284
|
children: isDisconnecting ? /* @__PURE__ */ jsx39("div", {
|
|
10178
11285
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
|
|
10179
11286
|
children: /* @__PURE__ */ jsx39(LoadingDots, {
|
|
10180
|
-
label:
|
|
11287
|
+
label: copy.endingSession
|
|
10181
11288
|
})
|
|
10182
11289
|
}) : inSession ? /* @__PURE__ */ jsx39(ConnectedBody, {
|
|
10183
11290
|
activeTab: effectiveTab,
|
|
@@ -10207,7 +11314,7 @@ function AuthenticatedContent({
|
|
|
10207
11314
|
decorative: true,
|
|
10208
11315
|
className: "skippr:size-3"
|
|
10209
11316
|
}),
|
|
10210
|
-
|
|
11317
|
+
copy.attributionPrefix,
|
|
10211
11318
|
" ",
|
|
10212
11319
|
/* @__PURE__ */ jsx39("span", {
|
|
10213
11320
|
className: "skippr:font-medium skippr:text-foreground skippr:underline skippr:underline-offset-2",
|
|
@@ -10221,7 +11328,7 @@ function AuthenticatedContent({
|
|
|
10221
11328
|
"data-skippr-no-drag": "",
|
|
10222
11329
|
className: `skippr:shrink-0 skippr:px-2${hideControls ? " skippr:pb-4 skippr:border-t skippr:border-border skippr:pt-1" : " skippr:pb-1"}`,
|
|
10223
11330
|
children: /* @__PURE__ */ jsx39(ConsentNotice, {
|
|
10224
|
-
template:
|
|
11331
|
+
template: copy.consentContinuing,
|
|
10225
11332
|
className: "skippr:whitespace-nowrap skippr:text-[10px]"
|
|
10226
11333
|
})
|
|
10227
11334
|
})
|
|
@@ -10262,11 +11369,12 @@ function IdleHistory({
|
|
|
10262
11369
|
showTalk,
|
|
10263
11370
|
error
|
|
10264
11371
|
}) {
|
|
11372
|
+
const copy = useChromeCopy();
|
|
10265
11373
|
if (history2.isLoading) {
|
|
10266
11374
|
return /* @__PURE__ */ jsx39("div", {
|
|
10267
11375
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
|
|
10268
11376
|
children: /* @__PURE__ */ jsx39(LoadingDots, {
|
|
10269
|
-
label:
|
|
11377
|
+
label: copy.loadingConversation
|
|
10270
11378
|
})
|
|
10271
11379
|
});
|
|
10272
11380
|
}
|
|
@@ -10347,7 +11455,7 @@ function ConnectedBody({
|
|
|
10347
11455
|
}
|
|
10348
11456
|
|
|
10349
11457
|
// src/components/SidebarTrigger.tsx
|
|
10350
|
-
import { useContext as
|
|
11458
|
+
import { useContext as useContext20 } from "react";
|
|
10351
11459
|
|
|
10352
11460
|
// src/components/Logo.tsx
|
|
10353
11461
|
import { jsx as jsx40, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
@@ -10400,7 +11508,8 @@ function SidebarTrigger() {
|
|
|
10400
11508
|
isStarting,
|
|
10401
11509
|
isPausing
|
|
10402
11510
|
} = useLiveAgent();
|
|
10403
|
-
const
|
|
11511
|
+
const copy = useChromeCopy();
|
|
11512
|
+
const internalCtx = useContext20(LiveAgentContext);
|
|
10404
11513
|
const launcherBottomPx = internalCtx?.launcherBottomPx ?? DEFAULT_LAUNCHER_BOTTOM_PX;
|
|
10405
11514
|
const popsDown = internalCtx?.popsDown ?? false;
|
|
10406
11515
|
const logoUrl = internalCtx?.appearance?.logoUrl ?? null;
|
|
@@ -10410,8 +11519,8 @@ function SidebarTrigger() {
|
|
|
10410
11519
|
return /* @__PURE__ */ jsx41("button", {
|
|
10411
11520
|
type: "button",
|
|
10412
11521
|
onClick: handleClick,
|
|
10413
|
-
title: isPanelOpen ?
|
|
10414
|
-
"aria-label": isPanelOpen ?
|
|
11522
|
+
title: isPanelOpen ? copy.closeChatLabel : copy.openChatLabel,
|
|
11523
|
+
"aria-label": isPanelOpen ? copy.closeChatLabel : copy.openChatLabel,
|
|
10415
11524
|
style: { bottom: triggerBottomPx(launcherBottomPx, popsDown) },
|
|
10416
11525
|
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"),
|
|
10417
11526
|
children: isPanelOpen ? /* @__PURE__ */ jsx41(ChevronDown, {
|
|
@@ -10429,13 +11538,13 @@ function SidebarTrigger() {
|
|
|
10429
11538
|
// src/components/SplashOverlay.tsx
|
|
10430
11539
|
import {
|
|
10431
11540
|
useCallback as useCallback31,
|
|
10432
|
-
useContext as
|
|
11541
|
+
useContext as useContext23,
|
|
10433
11542
|
useLayoutEffect as useLayoutEffect4,
|
|
10434
|
-
useRef as
|
|
11543
|
+
useRef as useRef36
|
|
10435
11544
|
} from "react";
|
|
10436
11545
|
|
|
10437
11546
|
// src/hooks/useSplash.ts
|
|
10438
|
-
import { useCallback as useCallback29, useContext as
|
|
11547
|
+
import { useCallback as useCallback29, useContext as useContext22, useMemo as useMemo11, useState as useState32 } from "react";
|
|
10439
11548
|
|
|
10440
11549
|
// src/lib/splashPresentation.ts
|
|
10441
11550
|
function resolveSplashSections(sections, iconUrls) {
|
|
@@ -10472,9 +11581,9 @@ function resolveSplashPresentation(splash) {
|
|
|
10472
11581
|
}
|
|
10473
11582
|
|
|
10474
11583
|
// src/hooks/useAdoptionTips.ts
|
|
10475
|
-
import { useContext as
|
|
11584
|
+
import { useContext as useContext21 } from "react";
|
|
10476
11585
|
function useAdoptionTips() {
|
|
10477
|
-
const ctx =
|
|
11586
|
+
const ctx = useContext21(LiveAgentContext);
|
|
10478
11587
|
if (!ctx) {
|
|
10479
11588
|
throw new Error("useAdoptionTips must be used within a <LiveAgent> provider");
|
|
10480
11589
|
}
|
|
@@ -10487,7 +11596,7 @@ function useAdoptionTips() {
|
|
|
10487
11596
|
|
|
10488
11597
|
// src/hooks/useSplash.ts
|
|
10489
11598
|
function useSplash(surface, onDismiss) {
|
|
10490
|
-
const ctx =
|
|
11599
|
+
const ctx = useContext22(LiveAgentContext);
|
|
10491
11600
|
if (!ctx) {
|
|
10492
11601
|
throw new Error("useSplash must be used within a <LiveAgent> provider");
|
|
10493
11602
|
}
|
|
@@ -10510,11 +11619,11 @@ function useSplash(surface, onDismiss) {
|
|
|
10510
11619
|
optOutOfSplashOverlay
|
|
10511
11620
|
} = ctx;
|
|
10512
11621
|
const isSurfaceUp = surface === SPLASH_SURFACE.Host ? splashSurfaces.applies && !isSplashDismissed : splashSurfaces[surface];
|
|
10513
|
-
const defaultModule =
|
|
11622
|
+
const defaultModule = useMemo11(() => displayModules.find((module) => module.id === defaultAgentId) ?? null, [displayModules, defaultAgentId]);
|
|
10514
11623
|
const splash = appearance?.splash ?? null;
|
|
10515
11624
|
const { micEnabled, screenEnabled, enableMic, enableScreen, releaseScreen } = splashMedia;
|
|
10516
11625
|
const toggleStartMuted = useCallback29(() => setStartMuted(!startMuted), [setStartMuted, startMuted]);
|
|
10517
|
-
const [optOutChecked, setOptOutChecked] =
|
|
11626
|
+
const [optOutChecked, setOptOutChecked] = useState32(false);
|
|
10518
11627
|
const toggleOptOut = useCallback29(() => setOptOutChecked((checked) => !checked), []);
|
|
10519
11628
|
const commitOptOut = useCallback29(() => {
|
|
10520
11629
|
if (optOutChecked)
|
|
@@ -10535,12 +11644,12 @@ function useSplash(surface, onDismiss) {
|
|
|
10535
11644
|
startAdoptionSession(goal);
|
|
10536
11645
|
}, [commitOptOut, startAdoptionSession]);
|
|
10537
11646
|
const tips = useAdoptionTips();
|
|
10538
|
-
const presentation =
|
|
11647
|
+
const presentation = useMemo11(() => resolveSplashPresentation(splash), [splash]);
|
|
10539
11648
|
const iconUrls = appearance?.splashIconUrls ?? null;
|
|
10540
|
-
const sections =
|
|
11649
|
+
const sections = useMemo11(() => resolveSplashSections(splash?.sections ?? null, iconUrls), [splash?.sections, iconUrls]);
|
|
10541
11650
|
const phases = idleHistory.phases;
|
|
10542
|
-
const lastCompletedPhase =
|
|
10543
|
-
const upcomingPhases =
|
|
11651
|
+
const lastCompletedPhase = useMemo11(() => phases.findLast((phase) => phase.status === "completed") ?? null, [phases]);
|
|
11652
|
+
const upcomingPhases = useMemo11(() => phases.filter((phase) => phase.status !== "completed"), [phases]);
|
|
10544
11653
|
if (!isSurfaceUp || !defaultModule) {
|
|
10545
11654
|
return null;
|
|
10546
11655
|
}
|
|
@@ -10621,7 +11730,7 @@ var CARD_SHELL = "skippr:flex skippr:w-full skippr:flex-col skippr:overflow-hidd
|
|
|
10621
11730
|
var CARD_FRAME = "skippr:rounded-[16px] skippr:bg-white skippr:shadow-[0_0_0_1px_rgba(45,45,63,0.10),0_1px_2px_rgba(45,45,63,0.04)]";
|
|
10622
11731
|
|
|
10623
11732
|
// src/components/SplashMediaSection.tsx
|
|
10624
|
-
import { useCallback as useCallback30, useRef as
|
|
11733
|
+
import { useCallback as useCallback30, useRef as useRef35 } from "react";
|
|
10625
11734
|
import { jsx as jsx42, jsxs as jsxs33, Fragment as Fragment5 } from "react/jsx-runtime";
|
|
10626
11735
|
var MEDIA_TRAILING_BOX = "skippr:shrink-0 skippr:rounded-full skippr:border skippr:px-[18px] skippr:py-[7px] skippr:text-[14px]";
|
|
10627
11736
|
var MEDIA_PILL = `${MEDIA_TRAILING_BOX} skippr:cursor-pointer skippr:border-[rgba(45,45,63,0.12)] skippr:font-medium skippr:transition-colors`;
|
|
@@ -10725,7 +11834,7 @@ function SplashMediaSection({
|
|
|
10725
11834
|
toggleStartMuted,
|
|
10726
11835
|
enableScreen
|
|
10727
11836
|
}) {
|
|
10728
|
-
const micFocusPending =
|
|
11837
|
+
const micFocusPending = useRef35(false);
|
|
10729
11838
|
const focusMicToggle = useCallback30((toggle) => {
|
|
10730
11839
|
if (!toggle || !micFocusPending.current)
|
|
10731
11840
|
return;
|
|
@@ -11190,7 +12299,7 @@ function SplashPrimary({
|
|
|
11190
12299
|
children: [
|
|
11191
12300
|
/* @__PURE__ */ jsx45("span", {
|
|
11192
12301
|
className: ROW_TITLE,
|
|
11193
|
-
children: lastCompletedPhase.name
|
|
12302
|
+
children: lastCompletedPhase.displayName ?? lastCompletedPhase.name
|
|
11194
12303
|
}),
|
|
11195
12304
|
/* @__PURE__ */ jsx45("span", {
|
|
11196
12305
|
className: ROW_SUBTEXT,
|
|
@@ -11223,7 +12332,7 @@ function SplashPrimary({
|
|
|
11223
12332
|
children: [
|
|
11224
12333
|
/* @__PURE__ */ jsx45("span", {
|
|
11225
12334
|
className: `skippr:truncate ${ROW_TITLE}`,
|
|
11226
|
-
children: phase.name
|
|
12335
|
+
children: phase.displayName ?? phase.name
|
|
11227
12336
|
}),
|
|
11228
12337
|
/* @__PURE__ */ jsx45("span", {
|
|
11229
12338
|
className: ROW_SUBTEXT,
|
|
@@ -11315,7 +12424,7 @@ var CENTER_STYLE = {
|
|
|
11315
12424
|
};
|
|
11316
12425
|
var CARD_STYLE = { width: "100%" };
|
|
11317
12426
|
function SplashOverlay() {
|
|
11318
|
-
const ctx =
|
|
12427
|
+
const ctx = useContext23(LiveAgentContext);
|
|
11319
12428
|
if (!ctx) {
|
|
11320
12429
|
throw new Error("SplashOverlay must be used within a <LiveAgent> provider");
|
|
11321
12430
|
}
|
|
@@ -11328,7 +12437,7 @@ function SplashOverlay() {
|
|
|
11328
12437
|
function SplashOverlayCard({ accentColor }) {
|
|
11329
12438
|
const state = useSplash(SPLASH_SURFACE.Overlay);
|
|
11330
12439
|
const dismiss = state?.dismiss;
|
|
11331
|
-
const dialogRef =
|
|
12440
|
+
const dialogRef = useRef36(null);
|
|
11332
12441
|
const isOpen = state !== null;
|
|
11333
12442
|
useLayoutEffect4(() => {
|
|
11334
12443
|
const dialog = isOpen ? dialogRef.current : null;
|
|
@@ -11385,10 +12494,10 @@ function SplashOverlayCard({ accentColor }) {
|
|
|
11385
12494
|
}
|
|
11386
12495
|
|
|
11387
12496
|
// src/components/SplashPanel.tsx
|
|
11388
|
-
import { useContext as
|
|
12497
|
+
import { useContext as useContext24 } from "react";
|
|
11389
12498
|
import { jsx as jsx47 } from "react/jsx-runtime";
|
|
11390
12499
|
function SplashPanel() {
|
|
11391
|
-
const ctx =
|
|
12500
|
+
const ctx = useContext24(LiveAgentContext);
|
|
11392
12501
|
if (!ctx) {
|
|
11393
12502
|
throw new Error("SplashPanel must be used within a <LiveAgent> provider");
|
|
11394
12503
|
}
|
|
@@ -11422,12 +12531,12 @@ function SplashPanelCard({ dock, isPanelOpen }) {
|
|
|
11422
12531
|
}
|
|
11423
12532
|
|
|
11424
12533
|
// src/components/VoiceBar.tsx
|
|
11425
|
-
import { useContext as
|
|
12534
|
+
import { useContext as useContext28 } from "react";
|
|
11426
12535
|
|
|
11427
12536
|
// src/hooks/useBarNotifications.ts
|
|
11428
|
-
import { useContext as
|
|
12537
|
+
import { useContext as useContext25 } from "react";
|
|
11429
12538
|
function useBarNotifications() {
|
|
11430
|
-
const ctx =
|
|
12539
|
+
const ctx = useContext25(LiveAgentContext);
|
|
11431
12540
|
if (!ctx) {
|
|
11432
12541
|
throw new Error("useBarNotifications must be used within a <LiveAgent> provider");
|
|
11433
12542
|
}
|
|
@@ -11470,15 +12579,15 @@ function useBarNotifications() {
|
|
|
11470
12579
|
}
|
|
11471
12580
|
|
|
11472
12581
|
// src/components/VoiceBarFrame.tsx
|
|
11473
|
-
import { useIsSpeaking, useLocalParticipant as
|
|
11474
|
-
import { useCallback as useCallback34, useContext as
|
|
12582
|
+
import { useIsSpeaking, useLocalParticipant as useLocalParticipant13 } from "@livekit/components-react/hooks";
|
|
12583
|
+
import { useCallback as useCallback34, useContext as useContext27, useEffect as useEffect48, useRef as useRef43, useState as useState39 } from "react";
|
|
11475
12584
|
|
|
11476
12585
|
// src/hooks/useKeyboardStop.ts
|
|
11477
|
-
import { useEffect as
|
|
12586
|
+
import { useEffect as useEffect40, useRef as useRef37 } from "react";
|
|
11478
12587
|
function useKeyboardStop({ enabled, onStop }) {
|
|
11479
|
-
const handler =
|
|
12588
|
+
const handler = useRef37(onStop);
|
|
11480
12589
|
handler.current = onStop;
|
|
11481
|
-
|
|
12590
|
+
useEffect40(() => {
|
|
11482
12591
|
if (!enabled)
|
|
11483
12592
|
return;
|
|
11484
12593
|
const onKeyDown = (event) => {
|
|
@@ -11495,18 +12604,18 @@ function useKeyboardStop({ enabled, onStop }) {
|
|
|
11495
12604
|
}
|
|
11496
12605
|
|
|
11497
12606
|
// src/hooks/useSessionTimer.ts
|
|
11498
|
-
import { useEffect as
|
|
12607
|
+
import { useEffect as useEffect42, useState as useState34 } from "react";
|
|
11499
12608
|
|
|
11500
12609
|
// src/hooks/useElapsedSeconds.ts
|
|
11501
|
-
import { useEffect as
|
|
12610
|
+
import { useEffect as useEffect41, useRef as useRef38, useState as useState33 } from "react";
|
|
11502
12611
|
function useElapsedSeconds(isRunning, resetSignal) {
|
|
11503
|
-
const [elapsed, setElapsed] =
|
|
11504
|
-
const accumulatedSecondsRef =
|
|
11505
|
-
|
|
12612
|
+
const [elapsed, setElapsed] = useState33(0);
|
|
12613
|
+
const accumulatedSecondsRef = useRef38(0);
|
|
12614
|
+
useEffect41(() => {
|
|
11506
12615
|
accumulatedSecondsRef.current = 0;
|
|
11507
12616
|
setElapsed(0);
|
|
11508
12617
|
}, [resetSignal]);
|
|
11509
|
-
|
|
12618
|
+
useEffect41(() => {
|
|
11510
12619
|
if (!isRunning)
|
|
11511
12620
|
return;
|
|
11512
12621
|
const resumedAt = Date.now();
|
|
@@ -11531,8 +12640,8 @@ function useSessionTimer(isRunning, resetSignal) {
|
|
|
11531
12640
|
const active = isRunning && remaining !== null;
|
|
11532
12641
|
const warning = active && remaining !== null && remaining <= SESSION_TIMER_WARNING_S;
|
|
11533
12642
|
const revealCycle = !active ? null : warning ? "warning" : "normal";
|
|
11534
|
-
const [revealed, setRevealed] =
|
|
11535
|
-
|
|
12643
|
+
const [revealed, setRevealed] = useState34(false);
|
|
12644
|
+
useEffect42(() => {
|
|
11536
12645
|
if (!revealCycle) {
|
|
11537
12646
|
setRevealed(false);
|
|
11538
12647
|
return;
|
|
@@ -11560,18 +12669,18 @@ function useSessionTimer(isRunning, resetSignal) {
|
|
|
11560
12669
|
}
|
|
11561
12670
|
|
|
11562
12671
|
// src/hooks/useVoiceBarDrag.ts
|
|
11563
|
-
import { useEffect as
|
|
12672
|
+
import { useEffect as useEffect43, useRef as useRef39 } from "react";
|
|
11564
12673
|
import { flushSync as flushSync2 } from "react-dom";
|
|
11565
12674
|
var DRAG_THRESHOLD_PX2 = 5;
|
|
11566
12675
|
function useVoiceBarDrag(containerRef, onDrop, followRefs, reportDragging) {
|
|
11567
|
-
const wasDraggedRef =
|
|
11568
|
-
const onDropRef =
|
|
12676
|
+
const wasDraggedRef = useRef39(false);
|
|
12677
|
+
const onDropRef = useRef39(onDrop);
|
|
11569
12678
|
onDropRef.current = onDrop;
|
|
11570
|
-
const followTargetsRef =
|
|
12679
|
+
const followTargetsRef = useRef39(followRefs);
|
|
11571
12680
|
followTargetsRef.current = followRefs;
|
|
11572
|
-
const reportDraggingRef =
|
|
12681
|
+
const reportDraggingRef = useRef39(reportDragging);
|
|
11573
12682
|
reportDraggingRef.current = reportDragging;
|
|
11574
|
-
|
|
12683
|
+
useEffect43(() => {
|
|
11575
12684
|
const el = containerRef.current;
|
|
11576
12685
|
if (!el)
|
|
11577
12686
|
return;
|
|
@@ -11721,7 +12830,7 @@ function useVoiceBarDrag(containerRef, onDrop, followRefs, reportDragging) {
|
|
|
11721
12830
|
}
|
|
11722
12831
|
|
|
11723
12832
|
// src/components/VoiceBarChatLine.tsx
|
|
11724
|
-
import { useCallback as useCallback32, useContext as
|
|
12833
|
+
import { useCallback as useCallback32, useContext as useContext26, useEffect as useEffect44, useRef as useRef40, useState as useState35 } from "react";
|
|
11725
12834
|
import { jsx as jsx48, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
11726
12835
|
var IDLE_HIDE_MS = 6000;
|
|
11727
12836
|
function VoiceBarChatLine({
|
|
@@ -11731,21 +12840,22 @@ function VoiceBarChatLine({
|
|
|
11731
12840
|
embedded = false
|
|
11732
12841
|
}) {
|
|
11733
12842
|
const { sendChatMessage, isSendingChat } = useChatMessages();
|
|
11734
|
-
const ctx =
|
|
12843
|
+
const ctx = useContext26(LiveAgentContext);
|
|
12844
|
+
const copy = useChromeCopy();
|
|
11735
12845
|
const reportChatActivity = ctx?.reportChatActivity;
|
|
11736
|
-
const [localDraft, setLocalDraft] =
|
|
12846
|
+
const [localDraft, setLocalDraft] = useState35("");
|
|
11737
12847
|
const text = ctx?.chatDraft ?? localDraft;
|
|
11738
12848
|
const setText = ctx?.setChatDraft ?? setLocalDraft;
|
|
11739
|
-
const inputRef =
|
|
11740
|
-
const idleTimerRef =
|
|
11741
|
-
const onCloseRef =
|
|
12849
|
+
const inputRef = useRef40(null);
|
|
12850
|
+
const idleTimerRef = useRef40(null);
|
|
12851
|
+
const onCloseRef = useRef40(onClose);
|
|
11742
12852
|
onCloseRef.current = onClose;
|
|
11743
12853
|
const armIdle = useCallback32(() => {
|
|
11744
12854
|
if (idleTimerRef.current)
|
|
11745
12855
|
clearTimeout(idleTimerRef.current);
|
|
11746
12856
|
idleTimerRef.current = setTimeout(() => onCloseRef.current(), IDLE_HIDE_MS);
|
|
11747
12857
|
}, []);
|
|
11748
|
-
|
|
12858
|
+
useEffect44(() => {
|
|
11749
12859
|
inputRef.current?.focus();
|
|
11750
12860
|
armIdle();
|
|
11751
12861
|
return () => {
|
|
@@ -11790,8 +12900,8 @@ function VoiceBarChatLine({
|
|
|
11790
12900
|
submit();
|
|
11791
12901
|
}
|
|
11792
12902
|
},
|
|
11793
|
-
placeholder:
|
|
11794
|
-
"aria-label":
|
|
12903
|
+
placeholder: copy.chatMessagePlaceholder,
|
|
12904
|
+
"aria-label": copy.chatMessageLabel,
|
|
11795
12905
|
className: "skippr:min-w-0 skippr:flex-1 skippr:border-none skippr:bg-transparent skippr:py-[7px] skippr:text-[13px] skippr:font-medium skippr:text-[#2D2D3F] skippr:outline-none skippr:placeholder:text-[#b0aca4]"
|
|
11796
12906
|
}),
|
|
11797
12907
|
/* @__PURE__ */ jsx48("button", {
|
|
@@ -11802,7 +12912,7 @@ function VoiceBarChatLine({
|
|
|
11802
12912
|
background: hasText ? "var(--skippr-brand, #2bc0ae)" : "#cdd8d5",
|
|
11803
12913
|
color: "var(--skippr-brand-foreground, #2d2b3d)"
|
|
11804
12914
|
},
|
|
11805
|
-
"aria-label":
|
|
12915
|
+
"aria-label": copy.chatSendLabel,
|
|
11806
12916
|
className: "skippr:flex skippr:size-[32px] skippr:shrink-0 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:transition-[filter] skippr:hover:brightness-[1.06] skippr:focus-visible:outline-2 skippr:focus-visible:outline-offset-2 skippr:focus-visible:outline-[var(--skippr-brand)] skippr:disabled:cursor-not-allowed",
|
|
11807
12917
|
children: /* @__PURE__ */ jsx48(Send, {
|
|
11808
12918
|
className: "skippr:size-[15px]",
|
|
@@ -11814,20 +12924,21 @@ function VoiceBarChatLine({
|
|
|
11814
12924
|
}
|
|
11815
12925
|
|
|
11816
12926
|
// src/components/VoiceBarLinkCard.tsx
|
|
11817
|
-
import { useCallback as useCallback33, useEffect as
|
|
12927
|
+
import { useCallback as useCallback33, useEffect as useEffect45, useRef as useRef41, useState as useState36 } from "react";
|
|
11818
12928
|
import { jsx as jsx49, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
11819
12929
|
var COPIED_RESET_MS2 = 2000;
|
|
11820
12930
|
var DISMISS_AFTER_COPY_MS2 = 3000;
|
|
11821
12931
|
function VoiceBarLinkCard({ card, onDismiss }) {
|
|
11822
|
-
const [copied, setCopied] =
|
|
11823
|
-
const
|
|
11824
|
-
|
|
12932
|
+
const [copied, setCopied] = useState36(false);
|
|
12933
|
+
const copy = useChromeCopy();
|
|
12934
|
+
const dismissTimerRef = useRef41(null);
|
|
12935
|
+
useEffect45(() => {
|
|
11825
12936
|
if (!copied)
|
|
11826
12937
|
return;
|
|
11827
12938
|
const timer = setTimeout(() => setCopied(false), COPIED_RESET_MS2);
|
|
11828
12939
|
return () => clearTimeout(timer);
|
|
11829
12940
|
}, [copied]);
|
|
11830
|
-
|
|
12941
|
+
useEffect45(() => {
|
|
11831
12942
|
return () => {
|
|
11832
12943
|
if (dismissTimerRef.current)
|
|
11833
12944
|
clearTimeout(dismissTimerRef.current);
|
|
@@ -11846,7 +12957,7 @@ function VoiceBarLinkCard({ card, onDismiss }) {
|
|
|
11846
12957
|
/* @__PURE__ */ jsx49("button", {
|
|
11847
12958
|
type: "button",
|
|
11848
12959
|
onClick: onDismiss,
|
|
11849
|
-
"aria-label":
|
|
12960
|
+
"aria-label": copy.cardDismissLink,
|
|
11850
12961
|
className: "skippr:absolute skippr:right-[8px] skippr:top-[8px] skippr:flex skippr:size-[20px] skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:text-[#b8b4ac] skippr:transition-colors skippr:hover:bg-[#f2f0eb] skippr:hover:text-[#2D2D3F]",
|
|
11851
12962
|
children: /* @__PURE__ */ jsx49(X, {
|
|
11852
12963
|
className: "skippr:size-[12px]",
|
|
@@ -11873,13 +12984,13 @@ function VoiceBarLinkCard({ card, onDismiss }) {
|
|
|
11873
12984
|
className: "skippr:size-[11px]",
|
|
11874
12985
|
strokeWidth: 2.5
|
|
11875
12986
|
}),
|
|
11876
|
-
|
|
12987
|
+
copy.voiceBarCardOpen
|
|
11877
12988
|
]
|
|
11878
12989
|
}),
|
|
11879
12990
|
/* @__PURE__ */ jsxs38("button", {
|
|
11880
12991
|
type: "button",
|
|
11881
12992
|
onClick: handleCopy,
|
|
11882
|
-
"aria-label":
|
|
12993
|
+
"aria-label": copy.cardCopyLink,
|
|
11883
12994
|
className: "skippr:flex skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:gap-[6px] skippr:rounded-full skippr:border skippr:border-[rgba(45,45,63,0.12)] skippr:bg-white skippr:px-[10px] skippr:py-[6px] skippr:text-[11px] skippr:font-semibold skippr:text-[#2D2D3F] skippr:transition-colors skippr:hover:bg-[#f2f0eb]",
|
|
11884
12995
|
children: [
|
|
11885
12996
|
copied ? /* @__PURE__ */ jsx49(Check, {
|
|
@@ -11889,7 +13000,7 @@ function VoiceBarLinkCard({ card, onDismiss }) {
|
|
|
11889
13000
|
className: "skippr:size-[11px]",
|
|
11890
13001
|
strokeWidth: 2.5
|
|
11891
13002
|
}),
|
|
11892
|
-
copied ?
|
|
13003
|
+
copied ? copy.voiceBarCardCopied : copy.voiceBarCardCopy
|
|
11893
13004
|
]
|
|
11894
13005
|
})
|
|
11895
13006
|
]
|
|
@@ -11901,13 +13012,14 @@ function VoiceBarLinkCard({ card, onDismiss }) {
|
|
|
11901
13012
|
}
|
|
11902
13013
|
|
|
11903
13014
|
// src/components/VoiceBarNotification.tsx
|
|
11904
|
-
import { useEffect as
|
|
13015
|
+
import { useEffect as useEffect46, useRef as useRef42, useState as useState37 } from "react";
|
|
11905
13016
|
import { jsx as jsx50, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
11906
13017
|
function VoiceBarNotification({ notifications, pos, onDismiss }) {
|
|
11907
|
-
const
|
|
11908
|
-
const [
|
|
11909
|
-
const
|
|
11910
|
-
|
|
13018
|
+
const copy = useChromeCopy();
|
|
13019
|
+
const [index2, setIndex] = useState37(0);
|
|
13020
|
+
const [paused, setPaused] = useState37(false);
|
|
13021
|
+
const cardRef = useRef42(null);
|
|
13022
|
+
useEffect46(() => {
|
|
11911
13023
|
const el = cardRef.current;
|
|
11912
13024
|
if (!el)
|
|
11913
13025
|
return;
|
|
@@ -11920,7 +13032,7 @@ function VoiceBarNotification({ notifications, pos, onDismiss }) {
|
|
|
11920
13032
|
el.removeEventListener("mouseleave", leave);
|
|
11921
13033
|
};
|
|
11922
13034
|
}, []);
|
|
11923
|
-
|
|
13035
|
+
useEffect46(() => {
|
|
11924
13036
|
if (paused)
|
|
11925
13037
|
return;
|
|
11926
13038
|
const rotate = setInterval(() => setIndex((current) => (current + 1) % notifications.length), TIP_ROTATE_MS);
|
|
@@ -11968,13 +13080,13 @@ function VoiceBarNotification({ notifications, pos, onDismiss }) {
|
|
|
11968
13080
|
onDismiss();
|
|
11969
13081
|
},
|
|
11970
13082
|
className: "skippr:shrink-0 skippr:cursor-pointer skippr:rounded-full skippr:bg-[#2D2D3F] skippr:px-[9px] skippr:py-[3px] skippr:text-[9.5px] skippr:font-semibold skippr:text-white skippr:transition-colors skippr:hover:bg-[#3d3d52]",
|
|
11971
|
-
children:
|
|
13083
|
+
children: copy.voiceBarTipStart
|
|
11972
13084
|
}),
|
|
11973
13085
|
hasMultiple && /* @__PURE__ */ jsxs39("button", {
|
|
11974
13086
|
type: "button",
|
|
11975
13087
|
onClick: () => setIndex((current) => (current + 1) % notifications.length),
|
|
11976
|
-
"aria-label":
|
|
11977
|
-
title:
|
|
13088
|
+
"aria-label": copy.tipNextLabel,
|
|
13089
|
+
title: copy.tipNextLabel,
|
|
11978
13090
|
className: "skippr:flex skippr:shrink-0 skippr:cursor-pointer skippr:items-center skippr:gap-[1px] skippr:rounded-full skippr:px-[5px] skippr:py-[1px] skippr:font-mono skippr:text-[8.5px] skippr:font-bold skippr:tracking-[0.02em] skippr:text-[#8b877f] skippr:transition-colors skippr:hover:bg-[#f2f0eb] skippr:hover:text-[#5a5650]",
|
|
11979
13091
|
children: [
|
|
11980
13092
|
safeIndex + 1,
|
|
@@ -11992,7 +13104,7 @@ function VoiceBarNotification({ notifications, pos, onDismiss }) {
|
|
|
11992
13104
|
}
|
|
11993
13105
|
|
|
11994
13106
|
// src/components/VoiceBarPlanCard.tsx
|
|
11995
|
-
import { useEffect as
|
|
13107
|
+
import { useEffect as useEffect47, useState as useState38 } from "react";
|
|
11996
13108
|
import { jsx as jsx51, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
11997
13109
|
var APPROVING_RESET_MS2 = 8000;
|
|
11998
13110
|
function StepIndicator({ step }) {
|
|
@@ -12026,9 +13138,10 @@ function VoiceBarPlanCard({
|
|
|
12026
13138
|
onDismiss,
|
|
12027
13139
|
embedded = false
|
|
12028
13140
|
}) {
|
|
13141
|
+
const copy = useChromeCopy();
|
|
12029
13142
|
const awaitingApproval = plan.state === "proposed";
|
|
12030
|
-
const [isApproving, setIsApproving] =
|
|
12031
|
-
const [lastPlanId, setLastPlanId] =
|
|
13143
|
+
const [isApproving, setIsApproving] = useState38(false);
|
|
13144
|
+
const [lastPlanId, setLastPlanId] = useState38(plan.planId);
|
|
12032
13145
|
if (plan.planId !== lastPlanId) {
|
|
12033
13146
|
setLastPlanId(plan.planId);
|
|
12034
13147
|
setIsApproving(false);
|
|
@@ -12043,13 +13156,13 @@ function VoiceBarPlanCard({
|
|
|
12043
13156
|
const cancel = () => {
|
|
12044
13157
|
sendChatMessage(CANCEL_MESSAGE).catch((e) => console.warn("[Skippr] plan reply failed", e));
|
|
12045
13158
|
};
|
|
12046
|
-
|
|
13159
|
+
useEffect47(() => {
|
|
12047
13160
|
if (!isApproving)
|
|
12048
13161
|
return;
|
|
12049
13162
|
const timer = setTimeout(() => setIsApproving(false), APPROVING_RESET_MS2);
|
|
12050
13163
|
return () => clearTimeout(timer);
|
|
12051
13164
|
}, [isApproving]);
|
|
12052
|
-
|
|
13165
|
+
useEffect47(() => {
|
|
12053
13166
|
if (plan.state !== "completed")
|
|
12054
13167
|
return;
|
|
12055
13168
|
const timer = setTimeout(onDismiss, COMPLETED_CARD_VISIBLE_MS);
|
|
@@ -12063,12 +13176,12 @@ function VoiceBarPlanCard({
|
|
|
12063
13176
|
children: [
|
|
12064
13177
|
/* @__PURE__ */ jsx51("span", {
|
|
12065
13178
|
className: "skippr:text-[11px] skippr:font-semibold skippr:tracking-[-0.01em] skippr:text-[#2D2D3F]",
|
|
12066
|
-
children:
|
|
13179
|
+
children: copy.planTitle
|
|
12067
13180
|
}),
|
|
12068
13181
|
/* @__PURE__ */ jsx51("button", {
|
|
12069
13182
|
type: "button",
|
|
12070
13183
|
onClick: onDismiss,
|
|
12071
|
-
"aria-label":
|
|
13184
|
+
"aria-label": copy.cardDismissPlan,
|
|
12072
13185
|
className: "skippr:flex skippr:size-[20px] skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:text-[#b8b4ac] skippr:transition-colors skippr:hover:bg-[#f2f0eb] skippr:hover:text-[#2D2D3F]",
|
|
12073
13186
|
children: /* @__PURE__ */ jsx51(X, {
|
|
12074
13187
|
className: "skippr:size-[12px]",
|
|
@@ -12082,14 +13195,11 @@ function VoiceBarPlanCard({
|
|
|
12082
13195
|
children: [
|
|
12083
13196
|
/* @__PURE__ */ jsx51("p", {
|
|
12084
13197
|
className: "skippr:text-[11.5px] skippr:font-semibold skippr:tracking-[-0.01em] skippr:text-[#2D2D3F]",
|
|
12085
|
-
children:
|
|
13198
|
+
children: copy.voiceBarPlanIntro
|
|
12086
13199
|
}),
|
|
12087
|
-
awaitingApproval && /* @__PURE__ */
|
|
13200
|
+
awaitingApproval && /* @__PURE__ */ jsx51("p", {
|
|
12088
13201
|
className: "skippr:mt-[1px] skippr:text-[10px] skippr:text-[#8b877f]",
|
|
12089
|
-
children:
|
|
12090
|
-
plan.steps.length,
|
|
12091
|
-
" steps · review and approve to run"
|
|
12092
|
-
]
|
|
13202
|
+
children: fillPlaceholders(copy.voiceBarPlanStepsHint, { count: plan.steps.length })
|
|
12093
13203
|
}),
|
|
12094
13204
|
/* @__PURE__ */ jsx51("div", {
|
|
12095
13205
|
className: "skippr:mt-[8px] skippr:max-h-[132px] skippr:space-y-[6px] skippr:overflow-y-auto skippr:overscroll-contain",
|
|
@@ -12120,7 +13230,7 @@ function VoiceBarPlanCard({
|
|
|
12120
13230
|
isApproving && /* @__PURE__ */ jsx51("span", {
|
|
12121
13231
|
className: "skippr:size-[10px] skippr:shrink-0 skippr:animate-spin skippr:rounded-full skippr:border-2 skippr:border-white/30 skippr:border-t-white"
|
|
12122
13232
|
}),
|
|
12123
|
-
isApproving ?
|
|
13233
|
+
isApproving ? copy.voiceBarPlanApproving : copy.voiceBarPlanApprove
|
|
12124
13234
|
]
|
|
12125
13235
|
}),
|
|
12126
13236
|
/* @__PURE__ */ jsx51("button", {
|
|
@@ -12128,7 +13238,7 @@ function VoiceBarPlanCard({
|
|
|
12128
13238
|
disabled: isApproving,
|
|
12129
13239
|
onClick: cancel,
|
|
12130
13240
|
className: "skippr:cursor-pointer skippr:rounded-full skippr:border skippr:border-[rgba(45,45,63,0.12)] skippr:bg-white skippr:px-[10px] skippr:py-[6px] skippr:text-[11px] skippr:font-semibold skippr:text-[#2D2D3F] skippr:transition-colors skippr:hover:bg-[#f2f0eb] skippr:disabled:cursor-default skippr:disabled:opacity-50 skippr:disabled:hover:bg-white",
|
|
12131
|
-
children:
|
|
13241
|
+
children: copy.voiceBarPlanCancel
|
|
12132
13242
|
})
|
|
12133
13243
|
]
|
|
12134
13244
|
}) : /* @__PURE__ */ jsxs40("span", {
|
|
@@ -12139,7 +13249,7 @@ function VoiceBarPlanCard({
|
|
|
12139
13249
|
className: "skippr:size-[11px]",
|
|
12140
13250
|
strokeWidth: 3
|
|
12141
13251
|
}),
|
|
12142
|
-
|
|
13252
|
+
copy.voiceBarPlanApproved
|
|
12143
13253
|
]
|
|
12144
13254
|
})
|
|
12145
13255
|
})
|
|
@@ -12221,7 +13331,7 @@ var MIC_LEVEL_IDLE_PX = 3;
|
|
|
12221
13331
|
var MIC_LEVEL_GROWTH_PX = 8;
|
|
12222
13332
|
var MIC_LEVEL_NOISE_GATE = 0.15;
|
|
12223
13333
|
function MicLevelGlyph({ muted }) {
|
|
12224
|
-
const { microphoneTrack } =
|
|
13334
|
+
const { microphoneTrack } = useLocalParticipant13();
|
|
12225
13335
|
const { barRefs, isTalking } = useAudioLevelBars(muted ? undefined : microphoneTrack?.track?.mediaStreamTrack, {
|
|
12226
13336
|
barCount: MIC_LEVEL_BARS,
|
|
12227
13337
|
idleHeightPx: MIC_LEVEL_IDLE_PX,
|
|
@@ -12261,9 +13371,10 @@ function ShortcutHint({
|
|
|
12261
13371
|
suppressed,
|
|
12262
13372
|
children
|
|
12263
13373
|
}) {
|
|
12264
|
-
const ref =
|
|
12265
|
-
const [visible, setVisible] =
|
|
12266
|
-
|
|
13374
|
+
const ref = useRef43(null);
|
|
13375
|
+
const [visible, setVisible] = useState39(false);
|
|
13376
|
+
const copy = useChromeCopy();
|
|
13377
|
+
useEffect48(() => {
|
|
12267
13378
|
if (!enabled)
|
|
12268
13379
|
return;
|
|
12269
13380
|
const el = ref.current;
|
|
@@ -12310,7 +13421,7 @@ function ShortcutHint({
|
|
|
12310
13421
|
}),
|
|
12311
13422
|
/* @__PURE__ */ jsx52("span", {
|
|
12312
13423
|
className: "skippr:text-[10.5px] skippr:font-medium skippr:text-[#8b877f]",
|
|
12313
|
-
children:
|
|
13424
|
+
children: copy.voiceBarShortcutTalk
|
|
12314
13425
|
}),
|
|
12315
13426
|
/* @__PURE__ */ jsx52("span", {
|
|
12316
13427
|
className: "skippr:text-[10px] skippr:text-[#cbc7bf]",
|
|
@@ -12333,7 +13444,7 @@ function ShortcutHint({
|
|
|
12333
13444
|
}),
|
|
12334
13445
|
/* @__PURE__ */ jsx52("span", {
|
|
12335
13446
|
className: "skippr:text-[10.5px] skippr:font-medium skippr:text-[#8b877f]",
|
|
12336
|
-
children:
|
|
13447
|
+
children: copy.voiceBarShortcutEnd
|
|
12337
13448
|
}),
|
|
12338
13449
|
/* @__PURE__ */ jsx52("span", {
|
|
12339
13450
|
className: "skippr:absolute skippr:left-1/2 skippr:top-full skippr:size-[9px] skippr:-translate-x-1/2 skippr:-translate-y-[4px] skippr:rotate-45 skippr:border-b skippr:border-r skippr:border-[rgba(45,45,63,0.08)] skippr:bg-white"
|
|
@@ -12351,7 +13462,7 @@ function VoiceBarFrame({
|
|
|
12351
13462
|
onDrop,
|
|
12352
13463
|
setDragging
|
|
12353
13464
|
}) {
|
|
12354
|
-
const ctx =
|
|
13465
|
+
const ctx = useContext27(LiveAgentContext);
|
|
12355
13466
|
if (!ctx) {
|
|
12356
13467
|
throw new Error("VoiceBarFrame must be used within a <LiveAgent> provider");
|
|
12357
13468
|
}
|
|
@@ -12388,26 +13499,27 @@ function VoiceBarFrame({
|
|
|
12388
13499
|
const needsLogin = !usesHostAuth && !isAuthenticated;
|
|
12389
13500
|
const transientError = useTransientError(error, errorSeq);
|
|
12390
13501
|
const authFailedCopy = authFailed ? resolveAuthFailedCopy(locale) : null;
|
|
12391
|
-
const [loginOpen, setLoginOpen] =
|
|
12392
|
-
|
|
13502
|
+
const [loginOpen, setLoginOpen] = useState39(false);
|
|
13503
|
+
useEffect48(() => {
|
|
12393
13504
|
if (!needsLogin)
|
|
12394
13505
|
setLoginOpen(false);
|
|
12395
13506
|
}, [needsLogin]);
|
|
12396
|
-
const [bannerOpen, setBannerOpen] =
|
|
13507
|
+
const [bannerOpen, setBannerOpen] = useState39(false);
|
|
12397
13508
|
const hasNotifications = notifications.length > 0;
|
|
12398
13509
|
const notifAccent = notifications[0]?.accentColor;
|
|
12399
13510
|
const closeBanner = useCallback34(() => setBannerOpen(false), []);
|
|
12400
|
-
const containerRef =
|
|
13511
|
+
const containerRef = useRef43(null);
|
|
12401
13512
|
const setContainerRefs = useCallback34((node) => {
|
|
12402
13513
|
containerRef.current = node;
|
|
12403
13514
|
voiceBarRef.current = node;
|
|
12404
13515
|
}, [voiceBarRef]);
|
|
12405
13516
|
const dragFollowers = isPanelOpen ? [panelRef] : null;
|
|
12406
|
-
const barWidthRef =
|
|
13517
|
+
const barWidthRef = useRef43(VOICE_BAR_WIDTH_PX);
|
|
12407
13518
|
const dropAtBarWidth = useCallback34((next) => onDrop(next, barWidthRef.current), [onDrop]);
|
|
12408
13519
|
const { wasDraggedRef } = useVoiceBarDrag(containerRef, dropAtBarWidth, dragFollowers, setDragging);
|
|
13520
|
+
const copy = useChromeCopy();
|
|
12409
13521
|
const { isMuted, toggleMute } = useMediaControls();
|
|
12410
|
-
const { localParticipant } =
|
|
13522
|
+
const { localParticipant } = useLocalParticipant13();
|
|
12411
13523
|
const isUserSpeaking = useIsSpeaking(localParticipant);
|
|
12412
13524
|
const { state } = useAgentVoiceState();
|
|
12413
13525
|
const { isCapturingSpeech, toggle: toggleTapToTalk, start, commit } = useVoiceTurnContext();
|
|
@@ -12416,9 +13528,9 @@ function VoiceBarFrame({
|
|
|
12416
13528
|
const plan = usePlanUpdates();
|
|
12417
13529
|
const linkCard = useLinkCard();
|
|
12418
13530
|
const { sendChatMessage } = useChatMessages();
|
|
12419
|
-
const [dismissedFloatingPlanId, setDismissedFloatingPlanId] =
|
|
12420
|
-
const [dismissedBlockPlanId, setDismissedBlockPlanId] =
|
|
12421
|
-
const [dismissedLinkCardId, setDismissedLinkCardId] =
|
|
13531
|
+
const [dismissedFloatingPlanId, setDismissedFloatingPlanId] = useState39(null);
|
|
13532
|
+
const [dismissedBlockPlanId, setDismissedBlockPlanId] = useState39(null);
|
|
13533
|
+
const [dismissedLinkCardId, setDismissedLinkCardId] = useState39(null);
|
|
12422
13534
|
const micMode = agentControls?.micMode;
|
|
12423
13535
|
const pushOrTap = isRequestResponseMicMode(micMode);
|
|
12424
13536
|
const isPushToTalk = micMode === MIC_MODE.PushToTalk;
|
|
@@ -12427,9 +13539,9 @@ function VoiceBarFrame({
|
|
|
12427
13539
|
const showActionControl = isConnected && captureMode === CAPTURE_MODE.Auto && actionsActive;
|
|
12428
13540
|
const chatSurface = agentControls?.chat ?? DEFAULT_CHAT_SURFACE;
|
|
12429
13541
|
const isRoomChat = chatSurface === CHAT_SURFACE.Room;
|
|
12430
|
-
const [chatLineOpen, setChatLineOpen] =
|
|
12431
|
-
const [chatLineMounted, setChatLineMounted] =
|
|
12432
|
-
const [chatLineClosing, setChatLineClosing] =
|
|
13542
|
+
const [chatLineOpen, setChatLineOpen] = useState39(false);
|
|
13543
|
+
const [chatLineMounted, setChatLineMounted] = useState39(false);
|
|
13544
|
+
const [chatLineClosing, setChatLineClosing] = useState39(false);
|
|
12433
13545
|
const chatOpen = isRoomChat ? isPanelOpen : chatLineOpen;
|
|
12434
13546
|
const lineBlockOpen = !isRoomChat && chatLineMounted;
|
|
12435
13547
|
const toggleChat = () => {
|
|
@@ -12439,7 +13551,7 @@ function VoiceBarFrame({
|
|
|
12439
13551
|
setChatLineOpen((open) => !open);
|
|
12440
13552
|
}
|
|
12441
13553
|
};
|
|
12442
|
-
|
|
13554
|
+
useEffect48(() => {
|
|
12443
13555
|
if (chatLineOpen) {
|
|
12444
13556
|
setChatLineMounted(true);
|
|
12445
13557
|
setChatLineClosing(false);
|
|
@@ -12468,7 +13580,7 @@ function VoiceBarFrame({
|
|
|
12468
13580
|
const showLivePill = !isLoading && isConnected && !textMode && !pushOrTap;
|
|
12469
13581
|
const barWidthPx = !showLivePill ? VOICE_BAR_WIDTH_PX : isHeld ? 120 : 156;
|
|
12470
13582
|
barWidthRef.current = barWidthPx;
|
|
12471
|
-
|
|
13583
|
+
useEffect48(() => {
|
|
12472
13584
|
const inBounds = clampBarPos(pos, barWidthPx);
|
|
12473
13585
|
if (inBounds.x !== pos.x)
|
|
12474
13586
|
onDrop(inBounds, barWidthPx);
|
|
@@ -12487,24 +13599,24 @@ function VoiceBarFrame({
|
|
|
12487
13599
|
}
|
|
12488
13600
|
};
|
|
12489
13601
|
useKeyboardStop({ enabled: sessionLive && !isPausing && !isLoading, onStop: closeBar });
|
|
12490
|
-
const hintSeenRef =
|
|
13602
|
+
const hintSeenRef = useRef43(false);
|
|
12491
13603
|
const requestPillBg = isCapturingSpeech ? "var(--skippr-brand-active)" : "var(--skippr-brand, #2bc0ae)";
|
|
12492
|
-
const agentStateLabel = state === "thinking" ?
|
|
12493
|
-
const idleRequestLabel = isPushToTalk ?
|
|
12494
|
-
const requestLabel = agentStateLabel ?? (isCapturingSpeech ?
|
|
13604
|
+
const agentStateLabel = state === "thinking" ? copy.voiceBarThinking : state === "speaking" ? copy.voiceBarTalking : null;
|
|
13605
|
+
const idleRequestLabel = isPushToTalk ? copy.voiceBarPushToTalk : copy.voiceBarTapToTalk;
|
|
13606
|
+
const requestLabel = agentStateLabel ?? (isCapturingSpeech ? copy.voiceBarListening : idleRequestLabel);
|
|
12495
13607
|
const livePillBg = agentActive && !isHeld ? "var(--skippr-brand-active)" : "var(--skippr-brand, #2bc0ae)";
|
|
12496
13608
|
const glow = isConnected && !isHeld && agentActive;
|
|
12497
|
-
const [autoOffClosing, setAutoOffClosing] =
|
|
13609
|
+
const [autoOffClosing, setAutoOffClosing] = useState39(false);
|
|
12498
13610
|
const { reportActivity } = useIdleAutoOff({
|
|
12499
13611
|
enabled: isConnected && !autoOffClosing,
|
|
12500
13612
|
active: agentActive || isCapturingSpeech || isUserSpeaking,
|
|
12501
13613
|
onExpire: () => setAutoOffClosing(true)
|
|
12502
13614
|
});
|
|
12503
|
-
|
|
13615
|
+
useEffect48(() => {
|
|
12504
13616
|
if (chatActivityAt)
|
|
12505
13617
|
reportActivity();
|
|
12506
13618
|
}, [chatActivityAt, reportActivity]);
|
|
12507
|
-
|
|
13619
|
+
useEffect48(() => {
|
|
12508
13620
|
if (!autoOffClosing)
|
|
12509
13621
|
return;
|
|
12510
13622
|
if (!isConnected) {
|
|
@@ -12520,12 +13632,12 @@ function VoiceBarFrame({
|
|
|
12520
13632
|
const floatingPlanActive = planEnabled && !isRoomChat && !lineBlockOpen && activePlan.planId !== dismissedFloatingPlanId;
|
|
12521
13633
|
const planInLineBlock = planEnabled && lineBlockOpen && activePlan.planId !== dismissedBlockPlanId;
|
|
12522
13634
|
const planCardActive = floatingPlanActive || planInLineBlock;
|
|
12523
|
-
|
|
13635
|
+
useEffect48(() => {
|
|
12524
13636
|
if (lineBlockOpen)
|
|
12525
13637
|
setDismissedBlockPlanId(null);
|
|
12526
13638
|
}, [lineBlockOpen]);
|
|
12527
|
-
const [autoOpenedPlanId, setAutoOpenedPlanId] =
|
|
12528
|
-
|
|
13639
|
+
const [autoOpenedPlanId, setAutoOpenedPlanId] = useState39(null);
|
|
13640
|
+
useEffect48(() => {
|
|
12529
13641
|
if (!isRoomChat || !planEnabled || !activePlan)
|
|
12530
13642
|
return;
|
|
12531
13643
|
if (activePlan.planId === autoOpenedPlanId)
|
|
@@ -12544,7 +13656,7 @@ function VoiceBarFrame({
|
|
|
12544
13656
|
const showTimerStrip = !slotClaimed && !autoOffClosing && !isCapturingSpeech && !planCardActive && !showLiveStrip && !isHeld && !!sessionTimer;
|
|
12545
13657
|
const showAutoOffStrip = !slotClaimed && autoOffClosing;
|
|
12546
13658
|
const hintSuppressed = slotClaimed || isCapturingSpeech || planCardActive || showLiveStrip || isHeld || showTimerStrip || showAutoOffStrip;
|
|
12547
|
-
const liveStripLabel = showActionControl ?
|
|
13659
|
+
const liveStripLabel = showActionControl ? copy.voiceBarWorking : copy.voiceBarThinking;
|
|
12548
13660
|
const popsDown = barPopsDown(pos);
|
|
12549
13661
|
const isLeftAligned = barLeftAligned(pos);
|
|
12550
13662
|
const stripStyle = {
|
|
@@ -12643,7 +13755,7 @@ function VoiceBarFrame({
|
|
|
12643
13755
|
}),
|
|
12644
13756
|
/* @__PURE__ */ jsx52("span", {
|
|
12645
13757
|
className: "skippr:whitespace-nowrap skippr:text-[12px] skippr:font-semibold skippr:tracking-[-0.01em] skippr:text-[#5a5650]",
|
|
12646
|
-
children:
|
|
13758
|
+
children: copy.voiceBarNoActivity
|
|
12647
13759
|
})
|
|
12648
13760
|
]
|
|
12649
13761
|
})
|
|
@@ -12703,14 +13815,14 @@ function VoiceBarFrame({
|
|
|
12703
13815
|
className: "skippr:text-[11px] skippr:leading-[1.2] skippr:text-destructive skippr:text-center",
|
|
12704
13816
|
children: modulesError || transientError
|
|
12705
13817
|
}) : /* @__PURE__ */ jsx52(ConsentNotice, {
|
|
12706
|
-
template:
|
|
13818
|
+
template: copy.consentSessionStart
|
|
12707
13819
|
})
|
|
12708
13820
|
})
|
|
12709
13821
|
}),
|
|
12710
13822
|
hasNotifications && !bannerOpen && !chatOpen && !isCapturingSpeech && !planCardActive && /* @__PURE__ */ jsx52("button", {
|
|
12711
13823
|
type: "button",
|
|
12712
13824
|
onClick: ifNotDragged(() => setBannerOpen(true)),
|
|
12713
|
-
"aria-label":
|
|
13825
|
+
"aria-label": copy.showNotificationsLabel,
|
|
12714
13826
|
style: {
|
|
12715
13827
|
background: notifAccent,
|
|
12716
13828
|
"--skippr-pulse-color": notifAccent
|
|
@@ -12729,7 +13841,7 @@ function VoiceBarFrame({
|
|
|
12729
13841
|
type: "button",
|
|
12730
13842
|
onClick: ifNotDragged(closeBar),
|
|
12731
13843
|
disabled: isPausing || isLoading,
|
|
12732
|
-
"aria-label": sessionLive ?
|
|
13844
|
+
"aria-label": sessionLive ? copy.endSessionLabel : copy.closeLabel,
|
|
12733
13845
|
className: cn(EDGE_BUTTON, "skippr:relative skippr:size-[26px]", isLoading && "skippr:cursor-not-allowed skippr:opacity-40 skippr:hover:bg-transparent"),
|
|
12734
13846
|
children: [
|
|
12735
13847
|
isPausing && /* @__PURE__ */ jsx52(BusyRing, {
|
|
@@ -12749,7 +13861,7 @@ function VoiceBarFrame({
|
|
|
12749
13861
|
}),
|
|
12750
13862
|
/* @__PURE__ */ jsx52("span", {
|
|
12751
13863
|
className: "skippr:whitespace-nowrap skippr:text-[12.5px] skippr:font-semibold skippr:text-[#5a5650]",
|
|
12752
|
-
children:
|
|
13864
|
+
children: copy.voiceBarLoading
|
|
12753
13865
|
}),
|
|
12754
13866
|
/* @__PURE__ */ jsxs41("span", {
|
|
12755
13867
|
className: "skippr:flex skippr:items-end skippr:gap-[3px]",
|
|
@@ -12805,7 +13917,7 @@ function VoiceBarFrame({
|
|
|
12805
13917
|
!isHeld && /* @__PURE__ */ jsx52("button", {
|
|
12806
13918
|
type: "button",
|
|
12807
13919
|
onClick: ifNotDragged(() => void toggleMute()),
|
|
12808
|
-
"aria-label": isMuted ?
|
|
13920
|
+
"aria-label": isMuted ? copy.unmuteLabel : copy.muteLabel,
|
|
12809
13921
|
className: "skippr:flex skippr:size-[26px] skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-transparent skippr:opacity-85 skippr:cursor-pointer skippr:transition-[opacity,color] skippr:hover:opacity-100 skippr:hover:text-destructive",
|
|
12810
13922
|
children: /* @__PURE__ */ jsx52(MicLevelGlyph, {
|
|
12811
13923
|
muted: isMuted
|
|
@@ -12814,7 +13926,7 @@ function VoiceBarFrame({
|
|
|
12814
13926
|
/* @__PURE__ */ jsx52("button", {
|
|
12815
13927
|
type: "button",
|
|
12816
13928
|
onClick: ifNotDragged(togglePause),
|
|
12817
|
-
"aria-label": isHeld ?
|
|
13929
|
+
"aria-label": isHeld ? copy.resumeLabel : copy.stopLabel,
|
|
12818
13930
|
className: cn("skippr:flex skippr:size-[26px] skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-transparent skippr:cursor-pointer skippr:transition-colors", !isHeld && "skippr:hover:text-destructive"),
|
|
12819
13931
|
children: isHeld ? /* @__PURE__ */ jsx52(Play, {
|
|
12820
13932
|
className: "skippr:size-[13px]",
|
|
@@ -12835,7 +13947,7 @@ function VoiceBarFrame({
|
|
|
12835
13947
|
className: "skippr:size-[15px] skippr:text-[#8b877f]",
|
|
12836
13948
|
strokeWidth: 2
|
|
12837
13949
|
}),
|
|
12838
|
-
|
|
13950
|
+
copy.voiceBarTextMode
|
|
12839
13951
|
]
|
|
12840
13952
|
}),
|
|
12841
13953
|
!sessionLive && /* @__PURE__ */ jsxs41("button", {
|
|
@@ -12849,7 +13961,7 @@ function VoiceBarFrame({
|
|
|
12849
13961
|
}
|
|
12850
13962
|
}),
|
|
12851
13963
|
disabled: !canStart && !needsLogin,
|
|
12852
|
-
"aria-label":
|
|
13964
|
+
"aria-label": copy.voiceBarTalkToAgent,
|
|
12853
13965
|
style: { color: "var(--skippr-brand-foreground, #2d2b3d)" },
|
|
12854
13966
|
className: cn(PILL, "skippr:cursor-pointer skippr:bg-brand skippr:px-[12px] skippr:transition-[filter] skippr:hover:brightness-[1.04] skippr:active:scale-[0.98] skippr:disabled:cursor-not-allowed skippr:disabled:opacity-60"),
|
|
12855
13967
|
children: [
|
|
@@ -12863,14 +13975,14 @@ function VoiceBarFrame({
|
|
|
12863
13975
|
className: "skippr:block skippr:size-full skippr:bg-launcher"
|
|
12864
13976
|
})
|
|
12865
13977
|
}),
|
|
12866
|
-
|
|
13978
|
+
copy.voiceBarTalkToAgent
|
|
12867
13979
|
]
|
|
12868
13980
|
}),
|
|
12869
13981
|
(sessionLive || isRoomChat) && /* @__PURE__ */ jsx52("button", {
|
|
12870
13982
|
type: "button",
|
|
12871
13983
|
onClick: ifNotDragged(toggleChat),
|
|
12872
13984
|
disabled: isLoading,
|
|
12873
|
-
"aria-label":
|
|
13985
|
+
"aria-label": copy.openChatLabel,
|
|
12874
13986
|
className: cn(EDGE_BUTTON, "skippr:size-[30px]", isLoading && "skippr:cursor-not-allowed skippr:opacity-40 skippr:hover:bg-transparent"),
|
|
12875
13987
|
children: /* @__PURE__ */ jsx52(MessageSquare, {
|
|
12876
13988
|
className: "skippr:size-[18px]",
|
|
@@ -12907,10 +14019,10 @@ function VoiceBarFrame({
|
|
|
12907
14019
|
}
|
|
12908
14020
|
|
|
12909
14021
|
// src/components/VoiceBarLauncher.tsx
|
|
12910
|
-
import { useCallback as useCallback35, useEffect as
|
|
14022
|
+
import { useCallback as useCallback35, useEffect as useEffect50, useRef as useRef45, useState as useState41 } from "react";
|
|
12911
14023
|
|
|
12912
14024
|
// src/components/LauncherNotification.tsx
|
|
12913
|
-
import { useEffect as
|
|
14025
|
+
import { useEffect as useEffect49, useRef as useRef44, useState as useState40 } from "react";
|
|
12914
14026
|
import { jsx as jsx53, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
12915
14027
|
function LauncherNotification({
|
|
12916
14028
|
notifications,
|
|
@@ -12918,10 +14030,11 @@ function LauncherNotification({
|
|
|
12918
14030
|
mode,
|
|
12919
14031
|
onDismiss
|
|
12920
14032
|
}) {
|
|
12921
|
-
const
|
|
12922
|
-
const [
|
|
12923
|
-
const
|
|
12924
|
-
|
|
14033
|
+
const copy = useChromeCopy();
|
|
14034
|
+
const [index2, setIndex] = useState40(0);
|
|
14035
|
+
const [paused, setPaused] = useState40(false);
|
|
14036
|
+
const cardRef = useRef44(null);
|
|
14037
|
+
useEffect49(() => {
|
|
12925
14038
|
const el = cardRef.current;
|
|
12926
14039
|
if (!el)
|
|
12927
14040
|
return;
|
|
@@ -12934,7 +14047,7 @@ function LauncherNotification({
|
|
|
12934
14047
|
el.removeEventListener("mouseleave", leave);
|
|
12935
14048
|
};
|
|
12936
14049
|
}, []);
|
|
12937
|
-
|
|
14050
|
+
useEffect49(() => {
|
|
12938
14051
|
if (paused)
|
|
12939
14052
|
return;
|
|
12940
14053
|
const rotate = setInterval(() => setIndex((current) => (current + 1) % notifications.length), TIP_ROTATE_MS);
|
|
@@ -12983,8 +14096,8 @@ function LauncherNotification({
|
|
|
12983
14096
|
notification.activate();
|
|
12984
14097
|
onDismiss();
|
|
12985
14098
|
},
|
|
12986
|
-
"aria-label":
|
|
12987
|
-
title:
|
|
14099
|
+
"aria-label": copy.tipStartLabel,
|
|
14100
|
+
title: copy.tipStartLabel,
|
|
12988
14101
|
className: "skippr:flex skippr:size-[17px] skippr:shrink-0 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-[#2D2D3F] skippr:text-white skippr:transition-colors skippr:hover:bg-[#3d3d52]",
|
|
12989
14102
|
children: /* @__PURE__ */ jsx53(Play, {
|
|
12990
14103
|
className: "skippr:size-[8px] skippr:fill-current",
|
|
@@ -12994,8 +14107,8 @@ function LauncherNotification({
|
|
|
12994
14107
|
hasMultiple && /* @__PURE__ */ jsx53("button", {
|
|
12995
14108
|
type: "button",
|
|
12996
14109
|
onClick: () => setIndex((current) => (current + 1) % notifications.length),
|
|
12997
|
-
"aria-label":
|
|
12998
|
-
title:
|
|
14110
|
+
"aria-label": copy.tipNextLabel,
|
|
14111
|
+
title: copy.tipNextLabel,
|
|
12999
14112
|
className: "skippr:-ml-[2px] skippr:flex skippr:size-[16px] skippr:shrink-0 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:text-[#8b877f] skippr:transition-colors skippr:hover:bg-[#f2f0eb] skippr:hover:text-[#5a5650]",
|
|
13000
14113
|
children: /* @__PURE__ */ jsx53(ChevronRight, {
|
|
13001
14114
|
className: "skippr:size-[12px]",
|
|
@@ -13094,6 +14207,7 @@ function LauncherChat({
|
|
|
13094
14207
|
onClick
|
|
13095
14208
|
}) {
|
|
13096
14209
|
const vertical = isHorizontalEdge(edge);
|
|
14210
|
+
const copy = useChromeCopy();
|
|
13097
14211
|
return /* @__PURE__ */ jsxs43("div", {
|
|
13098
14212
|
className: cn("skippr:flex skippr:shrink-0 skippr:items-center skippr:justify-center skippr:gap-[5px] skippr:overflow-hidden skippr:transition-all skippr:duration-[400ms] skippr:ease-[cubic-bezier(0.22,1,0.36,1)]", AVATAR_FLEX[edge]),
|
|
13099
14213
|
style: {
|
|
@@ -13105,7 +14219,7 @@ function LauncherChat({
|
|
|
13105
14219
|
/* @__PURE__ */ jsx54("button", {
|
|
13106
14220
|
type: "button",
|
|
13107
14221
|
onClick,
|
|
13108
|
-
"aria-label":
|
|
14222
|
+
"aria-label": copy.openChatLabel,
|
|
13109
14223
|
tabIndex: revealed ? 0 : -1,
|
|
13110
14224
|
className: "skippr:flex skippr:size-[46px] skippr:shrink-0 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-transparent skippr:p-0 skippr:text-foreground skippr:transition-colors skippr:hover:bg-foreground/8",
|
|
13111
14225
|
children: /* @__PURE__ */ jsx54(MessageSquare, {
|
|
@@ -13148,8 +14262,9 @@ function VoiceBarLauncher({
|
|
|
13148
14262
|
onDrop,
|
|
13149
14263
|
setDragging
|
|
13150
14264
|
}) {
|
|
13151
|
-
const
|
|
13152
|
-
const
|
|
14265
|
+
const copy = useChromeCopy();
|
|
14266
|
+
const containerRef = useRef45(null);
|
|
14267
|
+
const closeTimerRef = useRef45(null);
|
|
13153
14268
|
const onDropPos = useCallback35((pos) => {
|
|
13154
14269
|
const el = containerRef.current;
|
|
13155
14270
|
if (!el)
|
|
@@ -13159,16 +14274,16 @@ function VoiceBarLauncher({
|
|
|
13159
14274
|
}, [onDrop]);
|
|
13160
14275
|
const { wasDraggedRef } = useVoiceBarDrag(containerRef, onDropPos, null, setDragging);
|
|
13161
14276
|
const horizontal = isHorizontalEdge(dock.edge);
|
|
13162
|
-
const [cardOpen, setCardOpen] =
|
|
13163
|
-
const [loginOpen, setLoginOpen] =
|
|
13164
|
-
const [hovered, setHovered] =
|
|
13165
|
-
|
|
14277
|
+
const [cardOpen, setCardOpen] = useState41(false);
|
|
14278
|
+
const [loginOpen, setLoginOpen] = useState41(false);
|
|
14279
|
+
const [hovered, setHovered] = useState41(false);
|
|
14280
|
+
useEffect50(() => {
|
|
13166
14281
|
if (!needsLogin)
|
|
13167
14282
|
setLoginOpen(false);
|
|
13168
14283
|
}, [needsLogin]);
|
|
13169
14284
|
const hasNotif = notifications.length > 0;
|
|
13170
14285
|
const dotColor = notifications.find((item) => item.kind === NOTIFICATION_KIND.Module)?.accentColor ?? notifications[0]?.accentColor ?? NOTIF_ACCENT_COLOR;
|
|
13171
|
-
|
|
14286
|
+
useEffect50(() => {
|
|
13172
14287
|
const el = containerRef.current;
|
|
13173
14288
|
if (!el)
|
|
13174
14289
|
return;
|
|
@@ -13250,7 +14365,7 @@ function VoiceBarLauncher({
|
|
|
13250
14365
|
/* @__PURE__ */ jsx54("button", {
|
|
13251
14366
|
type: "button",
|
|
13252
14367
|
onClick: open,
|
|
13253
|
-
"aria-label":
|
|
14368
|
+
"aria-label": copy.openAgentLabel,
|
|
13254
14369
|
className: STRIP_ICON_BUTTON,
|
|
13255
14370
|
children: /* @__PURE__ */ jsx54(Play, {
|
|
13256
14371
|
className: "skippr:size-[13px] skippr:fill-current",
|
|
@@ -13263,7 +14378,7 @@ function VoiceBarLauncher({
|
|
|
13263
14378
|
/* @__PURE__ */ jsx54("button", {
|
|
13264
14379
|
type: "button",
|
|
13265
14380
|
onClick: openChat,
|
|
13266
|
-
"aria-label":
|
|
14381
|
+
"aria-label": copy.openChatLabel,
|
|
13267
14382
|
className: STRIP_ICON_BUTTON,
|
|
13268
14383
|
children: /* @__PURE__ */ jsx54(MessageSquare, {
|
|
13269
14384
|
className: "skippr:size-[14px]",
|
|
@@ -13274,14 +14389,14 @@ function VoiceBarLauncher({
|
|
|
13274
14389
|
}) : /* @__PURE__ */ jsx54("button", {
|
|
13275
14390
|
type: "button",
|
|
13276
14391
|
onClick: open,
|
|
13277
|
-
"aria-label":
|
|
14392
|
+
"aria-label": copy.openAgentLabel,
|
|
13278
14393
|
className: "skippr:absolute skippr:inset-0 skippr:cursor-grab skippr:bg-transparent skippr:p-0"
|
|
13279
14394
|
})
|
|
13280
14395
|
}),
|
|
13281
14396
|
hasNotif && (expanded ? /* @__PURE__ */ jsx54("button", {
|
|
13282
14397
|
type: "button",
|
|
13283
14398
|
onClick: toggleCard,
|
|
13284
|
-
"aria-label":
|
|
14399
|
+
"aria-label": copy.showNotificationsLabel,
|
|
13285
14400
|
style: {
|
|
13286
14401
|
background: dotColor,
|
|
13287
14402
|
"--skippr-pulse-color": dotColor
|
|
@@ -13290,7 +14405,7 @@ function VoiceBarLauncher({
|
|
|
13290
14405
|
}) : /* @__PURE__ */ jsx54("button", {
|
|
13291
14406
|
type: "button",
|
|
13292
14407
|
onClick: toggleCard,
|
|
13293
|
-
"aria-label":
|
|
14408
|
+
"aria-label": copy.showNotificationsLabel,
|
|
13294
14409
|
style: {
|
|
13295
14410
|
background: dotColor,
|
|
13296
14411
|
"--skippr-pulse-color": dotColor
|
|
@@ -13324,7 +14439,7 @@ function VoiceBarLauncher({
|
|
|
13324
14439
|
/* @__PURE__ */ jsx54("button", {
|
|
13325
14440
|
type: "button",
|
|
13326
14441
|
onClick: open,
|
|
13327
|
-
"aria-label":
|
|
14442
|
+
"aria-label": copy.openAgentLabel,
|
|
13328
14443
|
className: "skippr:block skippr:shrink-0 skippr:cursor-grab skippr:rounded-full skippr:bg-transparent skippr:p-0 skippr:transition-transform skippr:duration-200 skippr:hover:scale-105",
|
|
13329
14444
|
children: logoUrl ? /* @__PURE__ */ jsx54("img", {
|
|
13330
14445
|
src: logoUrl,
|
|
@@ -13340,7 +14455,7 @@ function VoiceBarLauncher({
|
|
|
13340
14455
|
hasNotif && /* @__PURE__ */ jsx54("button", {
|
|
13341
14456
|
type: "button",
|
|
13342
14457
|
onClick: toggleCard,
|
|
13343
|
-
"aria-label":
|
|
14458
|
+
"aria-label": copy.showNotificationsLabel,
|
|
13344
14459
|
style: {
|
|
13345
14460
|
background: dotColor,
|
|
13346
14461
|
"--skippr-pulse-color": dotColor,
|
|
@@ -13362,7 +14477,7 @@ function VoiceBarLauncher({
|
|
|
13362
14477
|
// src/components/VoiceBar.tsx
|
|
13363
14478
|
import { jsx as jsx55 } from "react/jsx-runtime";
|
|
13364
14479
|
function VoiceBar({ revealed }) {
|
|
13365
|
-
const ctx =
|
|
14480
|
+
const ctx = useContext28(LiveAgentContext);
|
|
13366
14481
|
if (!ctx) {
|
|
13367
14482
|
throw new Error("VoiceBar must be used within a <LiveAgent> provider");
|
|
13368
14483
|
}
|
|
@@ -13453,8 +14568,8 @@ function AgentCursorMount({ animated }) {
|
|
|
13453
14568
|
function PlanPanelOpener() {
|
|
13454
14569
|
const plan = usePlanUpdates();
|
|
13455
14570
|
const { expandPanel } = useLiveAgent();
|
|
13456
|
-
const surfacedPlanIdRef =
|
|
13457
|
-
|
|
14571
|
+
const surfacedPlanIdRef = useRef46(null);
|
|
14572
|
+
useEffect51(() => {
|
|
13458
14573
|
if (plan?.state !== "proposed" || surfacedPlanIdRef.current === plan.planId)
|
|
13459
14574
|
return;
|
|
13460
14575
|
surfacedPlanIdRef.current = plan.planId;
|
|
@@ -13496,9 +14611,9 @@ function LiveAgent(props) {
|
|
|
13496
14611
|
const auth = useAuth({ appKey, locale });
|
|
13497
14612
|
const usesHostAuth = !!getUserToken || !!userToken || !!authTokenProp;
|
|
13498
14613
|
const effectiveAuthToken = usesHostAuth ? authTokenProp : auth.authToken ?? undefined;
|
|
13499
|
-
const [activeModule, setActiveModule] =
|
|
13500
|
-
const [sessionAgentMode, setSessionAgentMode] =
|
|
13501
|
-
const [isExchanging, setIsExchanging] =
|
|
14614
|
+
const [activeModule, setActiveModule] = useState42(null);
|
|
14615
|
+
const [sessionAgentMode, setSessionAgentMode] = useState42(null);
|
|
14616
|
+
const [isExchanging, setIsExchanging] = useState42(false);
|
|
13502
14617
|
const minimizeOnSessionStart = useCallback36(() => {
|
|
13503
14618
|
if (minimizable) {
|
|
13504
14619
|
setIsMinimized(true);
|
|
@@ -13510,7 +14625,7 @@ function LiveAgent(props) {
|
|
|
13510
14625
|
setIsMinimized(false);
|
|
13511
14626
|
setIsPanelOpen(true);
|
|
13512
14627
|
}, []);
|
|
13513
|
-
const isExchangeDisconnectingRef =
|
|
14628
|
+
const isExchangeDisconnectingRef = useRef46(false);
|
|
13514
14629
|
const minimizeOnSessionDisconnect = useCallback36(() => {
|
|
13515
14630
|
if (isExchangeDisconnectingRef.current)
|
|
13516
14631
|
return;
|
|
@@ -13535,6 +14650,7 @@ function LiveAgent(props) {
|
|
|
13535
14650
|
disconnect,
|
|
13536
14651
|
isPaused,
|
|
13537
14652
|
pauseTimeoutSeconds,
|
|
14653
|
+
sessionAgenda,
|
|
13538
14654
|
historyMessages,
|
|
13539
14655
|
pendingScreenStream,
|
|
13540
14656
|
armScreenStream,
|
|
@@ -13561,32 +14677,32 @@ function LiveAgent(props) {
|
|
|
13561
14677
|
isDisconnecting,
|
|
13562
14678
|
isExchanging
|
|
13563
14679
|
});
|
|
13564
|
-
const isRoomReleasedRef =
|
|
14680
|
+
const isRoomReleasedRef = useRef46(false);
|
|
13565
14681
|
isRoomReleasedRef.current = !isConnected || isPausing || isDisconnecting;
|
|
13566
14682
|
const handleRoomDisconnected = useCallback36(() => {
|
|
13567
14683
|
if (isExchangeDisconnectingRef.current || isRoomReleasedRef.current)
|
|
13568
14684
|
return;
|
|
13569
14685
|
disconnect();
|
|
13570
14686
|
}, [disconnect]);
|
|
13571
|
-
const [isPanelOpen, setIsPanelOpen] =
|
|
13572
|
-
const [panelEntry, setPanelEntry] =
|
|
13573
|
-
const [isMinimized, setIsMinimized] =
|
|
13574
|
-
const [pendingStart, setPendingStart] =
|
|
13575
|
-
const [sidebarTab, setSidebarTab] =
|
|
13576
|
-
const [phasesSnapshot, setPhasesSnapshot] =
|
|
13577
|
-
const [startMuted, setStartMuted] =
|
|
13578
|
-
const [textMode, setTextMode] =
|
|
13579
|
-
const [panelExpanded, setPanelExpanded] =
|
|
14687
|
+
const [isPanelOpen, setIsPanelOpen] = useState42(defaultOpen);
|
|
14688
|
+
const [panelEntry, setPanelEntry] = useState42(PANEL_ENTRY.Launcher);
|
|
14689
|
+
const [isMinimized, setIsMinimized] = useState42(minimizable && !defaultOpen);
|
|
14690
|
+
const [pendingStart, setPendingStart] = useState42(null);
|
|
14691
|
+
const [sidebarTab, setSidebarTab] = useState42("agenda");
|
|
14692
|
+
const [phasesSnapshot, setPhasesSnapshot] = useState42([]);
|
|
14693
|
+
const [startMuted, setStartMuted] = useState42(false);
|
|
14694
|
+
const [textMode, setTextMode] = useState42(false);
|
|
14695
|
+
const [panelExpanded, setPanelExpanded] = useState42(false);
|
|
13580
14696
|
const togglePanelExpanded = useCallback36(() => setPanelExpanded((prev) => !prev), []);
|
|
13581
|
-
const panelRef =
|
|
13582
|
-
const controlBarRef =
|
|
13583
|
-
const voiceBarRef =
|
|
13584
|
-
const [isDragging, setIsDragging] =
|
|
14697
|
+
const panelRef = useRef46(null);
|
|
14698
|
+
const controlBarRef = useRef46(null);
|
|
14699
|
+
const voiceBarRef = useRef46(null);
|
|
14700
|
+
const [isDragging, setIsDragging] = useState42(false);
|
|
13585
14701
|
const setTextModeState = useCallback36((enabled) => {
|
|
13586
14702
|
setTextMode(enabled);
|
|
13587
14703
|
}, []);
|
|
13588
14704
|
const showControlBar = isConnected || isStarting || isPausing;
|
|
13589
|
-
|
|
14705
|
+
useEffect51(() => {
|
|
13590
14706
|
if (!isConnected)
|
|
13591
14707
|
setTextModeState(false);
|
|
13592
14708
|
}, [isConnected, setTextModeState]);
|
|
@@ -13639,7 +14755,7 @@ function LiveAgent(props) {
|
|
|
13639
14755
|
const agentMode = sessionAgentMode ?? operatingModule?.mode ?? null;
|
|
13640
14756
|
const shouldAnimateCursor = operatingModule?.uiPreferences?.animateCursor ?? animateAgentCursor;
|
|
13641
14757
|
const buddyDefaultMissing = buddyActive && hasResolvedModules && !modulesError && !defaultModule && !isSessionLive;
|
|
13642
|
-
const resumableSession =
|
|
14758
|
+
const resumableSession = useMemo12(() => getResumableSession(operatingModule), [operatingModule]);
|
|
13643
14759
|
const resumeSession = useCallback36(async () => {
|
|
13644
14760
|
if (!resumableSession)
|
|
13645
14761
|
return;
|
|
@@ -13703,11 +14819,11 @@ function LiveAgent(props) {
|
|
|
13703
14819
|
setPendingStart(pending);
|
|
13704
14820
|
setIsMinimized(false);
|
|
13705
14821
|
}, []);
|
|
13706
|
-
const [welcomeDismissed, setWelcomeDismissed] =
|
|
14822
|
+
const [welcomeDismissed, setWelcomeDismissed] = useState42(false);
|
|
13707
14823
|
const dismissWelcome = useCallback36(() => setWelcomeDismissed(true), []);
|
|
13708
|
-
const [savedPosition] =
|
|
13709
|
-
const [currentPosition, setCurrentPosition] =
|
|
13710
|
-
const positionLockedRef =
|
|
14824
|
+
const [savedPosition] = useState42(readSavedPosition);
|
|
14825
|
+
const [currentPosition, setCurrentPosition] = useState42(savedPosition ?? "right");
|
|
14826
|
+
const positionLockedRef = useRef46(savedPosition !== null);
|
|
13711
14827
|
const setPositionWithPersist = useCallback36((pos) => {
|
|
13712
14828
|
positionLockedRef.current = true;
|
|
13713
14829
|
setCurrentPosition(pos);
|
|
@@ -13716,18 +14832,18 @@ function LiveAgent(props) {
|
|
|
13716
14832
|
} catch {}
|
|
13717
14833
|
}, []);
|
|
13718
14834
|
const serverPosition = appearance?.position ?? null;
|
|
13719
|
-
|
|
14835
|
+
useEffect51(() => {
|
|
13720
14836
|
if (!serverPosition || positionLockedRef.current)
|
|
13721
14837
|
return;
|
|
13722
14838
|
setCurrentPosition(serverPosition);
|
|
13723
14839
|
}, [serverPosition]);
|
|
13724
|
-
const [savedLauncherBottom] =
|
|
13725
|
-
const hasDraggedRef =
|
|
13726
|
-
const verticalAlignRef =
|
|
13727
|
-
const [launcherBottomPx, setLauncherBottomPxState] =
|
|
13728
|
-
const [popsDown, setPopsDown] =
|
|
14840
|
+
const [savedLauncherBottom] = useState42(readSavedLauncherBottom);
|
|
14841
|
+
const hasDraggedRef = useRef46(savedLauncherBottom !== null);
|
|
14842
|
+
const verticalAlignRef = useRef46(hostVerticalAlign ?? "bottom");
|
|
14843
|
+
const [launcherBottomPx, setLauncherBottomPxState] = useState42(() => savedLauncherBottom !== null ? clampLauncherBottom(savedLauncherBottom) : verticalAlignToBottomPx(verticalAlignRef.current));
|
|
14844
|
+
const [popsDown, setPopsDown] = useState42(() => launcherPopsDown(launcherBottomPx));
|
|
13729
14845
|
const serverVerticalAlign = appearance?.verticalAlign ?? null;
|
|
13730
|
-
|
|
14846
|
+
useEffect51(() => {
|
|
13731
14847
|
if (!serverVerticalAlign || hostVerticalAlign !== undefined || hasDraggedRef.current)
|
|
13732
14848
|
return;
|
|
13733
14849
|
verticalAlignRef.current = serverVerticalAlign;
|
|
@@ -13743,28 +14859,28 @@ function LiveAgent(props) {
|
|
|
13743
14859
|
localStorage.setItem("skippr_widget_bottom", String(px));
|
|
13744
14860
|
} catch {}
|
|
13745
14861
|
}, []);
|
|
13746
|
-
const launcherBottomPxRef =
|
|
14862
|
+
const launcherBottomPxRef = useRef46(launcherBottomPx);
|
|
13747
14863
|
launcherBottomPxRef.current = launcherBottomPx;
|
|
13748
|
-
const [chatActivityAt, setChatActivityAt] =
|
|
14864
|
+
const [chatActivityAt, setChatActivityAt] = useState42(0);
|
|
13749
14865
|
const reportChatActivity = useCallback36(() => {
|
|
13750
14866
|
const now = Date.now();
|
|
13751
14867
|
setChatActivityAt((last) => now - last < CHAT_ACTIVITY_THROTTLE_MS ? last : now);
|
|
13752
14868
|
}, []);
|
|
13753
|
-
const [chatDraft, setChatDraft] =
|
|
13754
|
-
const [autoStartAfterLogin, setAutoStartAfterLogin] =
|
|
14869
|
+
const [chatDraft, setChatDraft] = useState42("");
|
|
14870
|
+
const [autoStartAfterLogin, setAutoStartAfterLogin] = useState42(false);
|
|
13755
14871
|
const commitLauncherDrop = useCallback36(({ side, bottomPx }) => {
|
|
13756
14872
|
setPositionWithPersist(side);
|
|
13757
14873
|
setLauncherBottomPx(bottomPx);
|
|
13758
14874
|
}, [setPositionWithPersist, setLauncherBottomPx]);
|
|
13759
|
-
const [barPos, setBarPosState] =
|
|
13760
|
-
const barPosRatioRef =
|
|
14875
|
+
const [barPos, setBarPosState] = useState42(() => readSavedBarPos());
|
|
14876
|
+
const barPosRatioRef = useRef46(barPos === null ? null : barPosRatio(barPos));
|
|
13761
14877
|
const setBarPos = useCallback36((next, widthPx) => {
|
|
13762
14878
|
const placed = clampBarPos(next, widthPx);
|
|
13763
14879
|
setBarPosState(placed);
|
|
13764
14880
|
persistBarPos(placed);
|
|
13765
14881
|
barPosRatioRef.current = barPosRatio(placed);
|
|
13766
14882
|
}, []);
|
|
13767
|
-
const [savedLauncherDock, setSavedLauncherDock] =
|
|
14883
|
+
const [savedLauncherDock, setSavedLauncherDock] = useState42(() => readSavedDock("launcher"));
|
|
13768
14884
|
const setLauncherDock = useCallback36((next) => {
|
|
13769
14885
|
setSavedLauncherDock(next);
|
|
13770
14886
|
persistDock("launcher", next);
|
|
@@ -13774,7 +14890,7 @@ function LiveAgent(props) {
|
|
|
13774
14890
|
edge: launcherEdge,
|
|
13775
14891
|
offsetPx: defaultOffset(launcherEdge)
|
|
13776
14892
|
};
|
|
13777
|
-
|
|
14893
|
+
useEffect51(() => {
|
|
13778
14894
|
const syncToViewport = () => {
|
|
13779
14895
|
const next = hasDraggedRef.current ? clampLauncherBottom(launcherBottomPxRef.current) : verticalAlignToBottomPx(verticalAlignRef.current);
|
|
13780
14896
|
setLauncherBottomPxState(next);
|
|
@@ -13784,7 +14900,7 @@ function LiveAgent(props) {
|
|
|
13784
14900
|
window.addEventListener("resize", syncToViewport);
|
|
13785
14901
|
return () => window.removeEventListener("resize", syncToViewport);
|
|
13786
14902
|
}, []);
|
|
13787
|
-
|
|
14903
|
+
useEffect51(() => {
|
|
13788
14904
|
const syncBarToViewport = () => {
|
|
13789
14905
|
const ratios = barPosRatioRef.current;
|
|
13790
14906
|
const measured = voiceBarRef.current?.getBoundingClientRect().width;
|
|
@@ -13867,7 +14983,7 @@ function LiveAgent(props) {
|
|
|
13867
14983
|
bearerToken,
|
|
13868
14984
|
selectModule
|
|
13869
14985
|
});
|
|
13870
|
-
|
|
14986
|
+
useEffect51(() => {
|
|
13871
14987
|
if (!autoStartAfterLogin)
|
|
13872
14988
|
return;
|
|
13873
14989
|
if (bearerToken === null || !hasResolvedModules || isSessionLive)
|
|
@@ -13893,14 +15009,16 @@ function LiveAgent(props) {
|
|
|
13893
15009
|
} = useSessionHistory({
|
|
13894
15010
|
agentId: defaultAgentId ?? undefined,
|
|
13895
15011
|
enabled: idleHistoryEnabled,
|
|
13896
|
-
authedFetch
|
|
15012
|
+
authedFetch,
|
|
15013
|
+
locale
|
|
13897
15014
|
});
|
|
13898
|
-
const idleHistory =
|
|
15015
|
+
const idleHistory = useMemo12(() => ({
|
|
13899
15016
|
messages: idleHistoryMessages,
|
|
13900
15017
|
phases: idleHistoryPhases,
|
|
13901
15018
|
isLoading: isLoadingHistory
|
|
13902
15019
|
}), [idleHistoryMessages, idleHistoryPhases, isLoadingHistory]);
|
|
13903
|
-
const
|
|
15020
|
+
const phaseLabels = usePhaseLabels(sessionAgenda, { agentId: defaultAgentId, phases: idleHistoryPhases }, locale);
|
|
15021
|
+
const [pageSplashDismissed, setPageSplashDismissed] = useState42(false);
|
|
13904
15022
|
const dismissSplash = useCallback36((surface) => {
|
|
13905
15023
|
if (surface !== SPLASH_SURFACE.Panel) {
|
|
13906
15024
|
setPageSplashDismissed(true);
|
|
@@ -13911,7 +15029,7 @@ function LiveAgent(props) {
|
|
|
13911
15029
|
}, [closePanel, minimizePanel]);
|
|
13912
15030
|
const reopenSplash = useCallback36(() => setPageSplashDismissed(false), []);
|
|
13913
15031
|
const { optedOut: splashOverlayOptedOut, optOut: optOutOfSplashOverlay } = useSplashOverlayOptOut(authedFetch, splashOverlayOptedOutForUser);
|
|
13914
|
-
const configuredSplashSurfaces =
|
|
15032
|
+
const configuredSplashSurfaces = useMemo12(() => resolveSplashSurfaces({
|
|
13915
15033
|
splash: appearance?.splash ?? null,
|
|
13916
15034
|
defaultAgentControls: defaultModule?.controls ?? null,
|
|
13917
15035
|
isRoomChat: (agentControls?.chat ?? DEFAULT_CHAT_SURFACE) === CHAT_SURFACE.Room,
|
|
@@ -13928,7 +15046,7 @@ function LiveAgent(props) {
|
|
|
13928
15046
|
isSessionLive,
|
|
13929
15047
|
splashOverlayOptedOut
|
|
13930
15048
|
]);
|
|
13931
|
-
const splashSurfaces =
|
|
15049
|
+
const splashSurfaces = useMemo12(() => visibleSplashSurfaces(configuredSplashSurfaces, {
|
|
13932
15050
|
pageDismissed: pageSplashDismissed,
|
|
13933
15051
|
panelEntry
|
|
13934
15052
|
}), [configuredSplashSurfaces, pageSplashDismissed, panelEntry]);
|
|
@@ -13938,7 +15056,7 @@ function LiveAgent(props) {
|
|
|
13938
15056
|
isSplashVisible: splashSurfaces.overlay || splashSurfaces.panel || splashSurfaces.applies && !pageSplashDismissed,
|
|
13939
15057
|
isSessionLive
|
|
13940
15058
|
});
|
|
13941
|
-
|
|
15059
|
+
useEffect51(() => {
|
|
13942
15060
|
const open = () => {
|
|
13943
15061
|
reopenSplash();
|
|
13944
15062
|
if (configuredSplashSurfaces.overlay)
|
|
@@ -13951,7 +15069,7 @@ function LiveAgent(props) {
|
|
|
13951
15069
|
window.addEventListener(SKIPPR_OPEN_EVENT, open);
|
|
13952
15070
|
return () => window.removeEventListener(SKIPPR_OPEN_EVENT, open);
|
|
13953
15071
|
}, [configuredSplashSurfaces, reopenSplash, expandPanel, revealBar]);
|
|
13954
|
-
const ctx =
|
|
15072
|
+
const ctx = useMemo12(() => ({
|
|
13955
15073
|
connection,
|
|
13956
15074
|
shouldConnect,
|
|
13957
15075
|
isConnected,
|
|
@@ -13973,6 +15091,7 @@ function LiveAgent(props) {
|
|
|
13973
15091
|
idleHistory,
|
|
13974
15092
|
phasesSnapshot,
|
|
13975
15093
|
setPhasesSnapshot,
|
|
15094
|
+
phaseLabels,
|
|
13976
15095
|
isPanelOpen,
|
|
13977
15096
|
openPanel,
|
|
13978
15097
|
closePanel,
|
|
@@ -14077,6 +15196,7 @@ function LiveAgent(props) {
|
|
|
14077
15196
|
historyMessages,
|
|
14078
15197
|
idleHistory,
|
|
14079
15198
|
phasesSnapshot,
|
|
15199
|
+
phaseLabels,
|
|
14080
15200
|
isPanelOpen,
|
|
14081
15201
|
openPanel,
|
|
14082
15202
|
closePanel,
|
|
@@ -14245,18 +15365,18 @@ function LiveAgent(props) {
|
|
|
14245
15365
|
});
|
|
14246
15366
|
}
|
|
14247
15367
|
// src/components/SplashScreen.tsx
|
|
14248
|
-
import { useContext as
|
|
15368
|
+
import { useContext as useContext29, useEffect as useEffect52, useRef as useRef47 } from "react";
|
|
14249
15369
|
import { jsx as jsx57 } from "react/jsx-runtime";
|
|
14250
15370
|
var SPLASH_DISABLED_WARNING = "[Skippr] <SplashScreen> is mounted but the splash screen is turned off for this workspace, so it will never render. Enable it under Appearance in the Skippr platform.";
|
|
14251
15371
|
function SplashScreen({ className, onDismiss }) {
|
|
14252
|
-
const ctx =
|
|
15372
|
+
const ctx = useContext29(LiveAgentContext);
|
|
14253
15373
|
if (!ctx) {
|
|
14254
15374
|
throw new Error("SplashScreen must be used within a <LiveAgent> provider");
|
|
14255
15375
|
}
|
|
14256
|
-
const disabledWarnedRef =
|
|
15376
|
+
const disabledWarnedRef = useRef47(false);
|
|
14257
15377
|
const hasResolvedModules = ctx.hasResolvedModules;
|
|
14258
15378
|
const isSplashConfigured = ctx.isSplashConfigured;
|
|
14259
|
-
|
|
15379
|
+
useEffect52(() => {
|
|
14260
15380
|
if (!hasResolvedModules || isSplashConfigured || disabledWarnedRef.current)
|
|
14261
15381
|
return;
|
|
14262
15382
|
disabledWarnedRef.current = true;
|
|
@@ -14287,9 +15407,9 @@ function SplashScreenCard({
|
|
|
14287
15407
|
});
|
|
14288
15408
|
}
|
|
14289
15409
|
// src/hooks/useIsLocalSpeaking.ts
|
|
14290
|
-
import { useIsSpeaking as useIsSpeaking2, useLocalParticipant as
|
|
15410
|
+
import { useIsSpeaking as useIsSpeaking2, useLocalParticipant as useLocalParticipant14 } from "@livekit/components-react/hooks";
|
|
14291
15411
|
function useIsLocalSpeaking() {
|
|
14292
|
-
const { localParticipant } =
|
|
15412
|
+
const { localParticipant } = useLocalParticipant14();
|
|
14293
15413
|
return useIsSpeaking2(localParticipant);
|
|
14294
15414
|
}
|
|
14295
15415
|
// src/hooks/useIsSessionHeld.ts
|