@skippr/live-agent-sdk 0.115.0 → 0.117.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 +1665 -562
- package/dist/skippr-sdk.css +1 -1
- package/dist/skippr-sdk.js +119 -119
- 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 {
|
|
@@ -7178,7 +8219,7 @@ function DomCapture({ pushOrTapMicMode = false, startMuted = false }) {
|
|
|
7178
8219
|
|
|
7179
8220
|
// src/components/HighlightOverlay.tsx
|
|
7180
8221
|
import { useDataChannel, useLocalParticipant as useLocalParticipant6 } from "@livekit/components-react/hooks";
|
|
7181
|
-
import { useCallback as useCallback18, useEffect as
|
|
8222
|
+
import { useCallback as useCallback18, useEffect as useEffect26, useRef as useRef20 } from "react";
|
|
7182
8223
|
var HIGHLIGHT_AUTO_CLEAR_MS = 30000;
|
|
7183
8224
|
var PAGE_CHECK_MS = 250;
|
|
7184
8225
|
var ACTED_REASON = "acted";
|
|
@@ -7207,11 +8248,12 @@ function parseHighlightMessage(payload) {
|
|
|
7207
8248
|
}
|
|
7208
8249
|
}
|
|
7209
8250
|
function HighlightOverlay() {
|
|
8251
|
+
const copy = useChromeCopy();
|
|
7210
8252
|
const { localParticipant } = useLocalParticipant6();
|
|
7211
|
-
const targetRef =
|
|
7212
|
-
const shownRef =
|
|
7213
|
-
const shownUrlRef =
|
|
7214
|
-
const autoClearRef =
|
|
8253
|
+
const targetRef = useRef20(null);
|
|
8254
|
+
const shownRef = useRef20(null);
|
|
8255
|
+
const shownUrlRef = useRef20(null);
|
|
8256
|
+
const autoClearRef = useRef20(null);
|
|
7215
8257
|
const clear = useCallback18(() => {
|
|
7216
8258
|
if (autoClearRef.current)
|
|
7217
8259
|
clearTimeout(autoClearRef.current);
|
|
@@ -7249,15 +8291,15 @@ function HighlightOverlay() {
|
|
|
7249
8291
|
shownUrlRef.current = window.location.href;
|
|
7250
8292
|
setCursorTarget("guide", {
|
|
7251
8293
|
element,
|
|
7252
|
-
label: parsed.message ||
|
|
8294
|
+
label: parsed.message || copy.highlightDefaultLabel,
|
|
7253
8295
|
mode: "guide"
|
|
7254
8296
|
});
|
|
7255
8297
|
setHighlightActive(true);
|
|
7256
8298
|
autoClearRef.current = setTimeout(() => clearAndReport(EXPIRED_REASON), HIGHLIGHT_AUTO_CLEAR_MS);
|
|
7257
|
-
}, [clear, clearAndReport]);
|
|
8299
|
+
}, [clear, clearAndReport, copy]);
|
|
7258
8300
|
useDataChannel(HIGHLIGHT_TOPIC, onHighlightMessage);
|
|
7259
|
-
|
|
7260
|
-
|
|
8301
|
+
useEffect26(() => onHighlightCleared(clear), [clear]);
|
|
8302
|
+
useEffect26(() => {
|
|
7261
8303
|
const onClick = (event) => {
|
|
7262
8304
|
const target = targetRef.current;
|
|
7263
8305
|
if (!target)
|
|
@@ -7274,7 +8316,7 @@ function HighlightOverlay() {
|
|
|
7274
8316
|
document.addEventListener("click", onClick, { capture: true });
|
|
7275
8317
|
return () => document.removeEventListener("click", onClick, { capture: true });
|
|
7276
8318
|
}, [clearAndReport]);
|
|
7277
|
-
|
|
8319
|
+
useEffect26(() => {
|
|
7278
8320
|
const interval = setInterval(() => {
|
|
7279
8321
|
const shown = shownRef.current;
|
|
7280
8322
|
const target = targetRef.current;
|
|
@@ -7294,32 +8336,32 @@ function HighlightOverlay() {
|
|
|
7294
8336
|
targetRef.current = replacement;
|
|
7295
8337
|
setCursorTarget("guide", {
|
|
7296
8338
|
element: replacement,
|
|
7297
|
-
label: shown.message ||
|
|
8339
|
+
label: shown.message || copy.highlightDefaultLabel,
|
|
7298
8340
|
mode: "guide"
|
|
7299
8341
|
});
|
|
7300
8342
|
}, PAGE_CHECK_MS);
|
|
7301
8343
|
return () => clearInterval(interval);
|
|
7302
|
-
}, [clearAndReport]);
|
|
7303
|
-
|
|
8344
|
+
}, [clearAndReport, copy]);
|
|
8345
|
+
useEffect26(() => clear, [clear]);
|
|
7304
8346
|
return null;
|
|
7305
8347
|
}
|
|
7306
8348
|
|
|
7307
8349
|
// src/components/MinimizedBubble.tsx
|
|
7308
|
-
import { useContext as
|
|
8350
|
+
import { useContext as useContext11, useEffect as useEffect28, useRef as useRef22, useState as useState22 } from "react";
|
|
7309
8351
|
|
|
7310
8352
|
// src/hooks/useLauncherDrag.ts
|
|
7311
|
-
import { useEffect as
|
|
8353
|
+
import { useEffect as useEffect27, useRef as useRef21 } from "react";
|
|
7312
8354
|
import { flushSync } from "react-dom";
|
|
7313
8355
|
var DRAG_THRESHOLD_PX = 5;
|
|
7314
8356
|
function useLauncherDrag(containerRef, onDrop, followRefs, reportDragging, enabled = true) {
|
|
7315
|
-
const wasDraggedRef =
|
|
7316
|
-
const onDropRef =
|
|
8357
|
+
const wasDraggedRef = useRef21(false);
|
|
8358
|
+
const onDropRef = useRef21(onDrop);
|
|
7317
8359
|
onDropRef.current = onDrop;
|
|
7318
|
-
const followTargetsRef =
|
|
8360
|
+
const followTargetsRef = useRef21(followRefs);
|
|
7319
8361
|
followTargetsRef.current = followRefs;
|
|
7320
|
-
const reportDraggingRef =
|
|
8362
|
+
const reportDraggingRef = useRef21(reportDragging);
|
|
7321
8363
|
reportDraggingRef.current = reportDragging;
|
|
7322
|
-
|
|
8364
|
+
useEffect27(() => {
|
|
7323
8365
|
if (!enabled)
|
|
7324
8366
|
return;
|
|
7325
8367
|
const el = containerRef.current;
|
|
@@ -7587,10 +8629,11 @@ var GOAL_EXIT_STAGGER_MS = 250;
|
|
|
7587
8629
|
var MAX_GOAL_BUBBLES = 3;
|
|
7588
8630
|
var MAX_MODULE_PILLS = 3;
|
|
7589
8631
|
function SkipprMark({ onStart, logoUrl }) {
|
|
8632
|
+
const copy = useChromeCopy();
|
|
7590
8633
|
return /* @__PURE__ */ jsx21("button", {
|
|
7591
8634
|
type: "button",
|
|
7592
8635
|
onClick: onStart,
|
|
7593
|
-
"aria-label":
|
|
8636
|
+
"aria-label": copy.askLabel,
|
|
7594
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",
|
|
7595
8638
|
children: logoUrl ? /* @__PURE__ */ jsx21("img", {
|
|
7596
8639
|
src: logoUrl,
|
|
@@ -7613,10 +8656,11 @@ function ChatButton({
|
|
|
7613
8656
|
position,
|
|
7614
8657
|
onClick
|
|
7615
8658
|
}) {
|
|
8659
|
+
const copy = useChromeCopy();
|
|
7616
8660
|
return /* @__PURE__ */ jsx21("button", {
|
|
7617
8661
|
type: "button",
|
|
7618
8662
|
onClick,
|
|
7619
|
-
"aria-label":
|
|
8663
|
+
"aria-label": copy.openChatLabel,
|
|
7620
8664
|
tabIndex: revealed ? 0 : -1,
|
|
7621
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"),
|
|
7622
8666
|
style: {
|
|
@@ -7674,7 +8718,8 @@ function WelcomeBubble({
|
|
|
7674
8718
|
onDismiss,
|
|
7675
8719
|
onClick
|
|
7676
8720
|
}) {
|
|
7677
|
-
|
|
8721
|
+
const copy = useChromeCopy();
|
|
8722
|
+
useEffect28(() => {
|
|
7678
8723
|
const timer = setTimeout(onDismiss, 5000);
|
|
7679
8724
|
return () => clearTimeout(timer);
|
|
7680
8725
|
}, [onDismiss]);
|
|
@@ -7682,7 +8727,7 @@ function WelcomeBubble({
|
|
|
7682
8727
|
type: "button",
|
|
7683
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"),
|
|
7684
8729
|
onClick,
|
|
7685
|
-
"aria-label":
|
|
8730
|
+
"aria-label": copy.dismissLabel,
|
|
7686
8731
|
children: [
|
|
7687
8732
|
message,
|
|
7688
8733
|
/* @__PURE__ */ jsx21("span", {
|
|
@@ -7696,7 +8741,8 @@ function MinimizedBubble({
|
|
|
7696
8741
|
welcomeDismissed,
|
|
7697
8742
|
onDismissWelcome
|
|
7698
8743
|
}) {
|
|
7699
|
-
const
|
|
8744
|
+
const copy = useChromeCopy();
|
|
8745
|
+
const ctx = useContext11(LiveAgentContext);
|
|
7700
8746
|
if (!ctx) {
|
|
7701
8747
|
throw new Error("MinimizedBubble must be used within a <LiveAgent> provider");
|
|
7702
8748
|
}
|
|
@@ -7719,14 +8765,14 @@ function MinimizedBubble({
|
|
|
7719
8765
|
commitLauncherDrop,
|
|
7720
8766
|
appearance
|
|
7721
8767
|
} = ctx;
|
|
7722
|
-
const [goalsAutoHidden, setGoalsAutoHidden] =
|
|
7723
|
-
const [isLauncherHovered, setIsLauncherHovered] =
|
|
7724
|
-
const [visitHref, setVisitHref] =
|
|
7725
|
-
const revealedHrefRef =
|
|
7726
|
-
const hoverContainerRef =
|
|
7727
|
-
const closeTimerRef =
|
|
7728
|
-
|
|
7729
|
-
|
|
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(() => {
|
|
7730
8776
|
const el = hoverContainerRef.current;
|
|
7731
8777
|
if (!el)
|
|
7732
8778
|
return;
|
|
@@ -7765,7 +8811,7 @@ function MinimizedBubble({
|
|
|
7765
8811
|
const onboardingModule = pillCandidates.find((module) => module.type === "onboarding");
|
|
7766
8812
|
const modulePills = onboardingModule ? [onboardingModule] : pillCandidates.slice(0, MAX_MODULE_PILLS).reverse();
|
|
7767
8813
|
const goalsEligible = adoptionGoals.length > 0 && !onboardingModule && hasResolvedModules;
|
|
7768
|
-
|
|
8814
|
+
useEffect28(() => {
|
|
7769
8815
|
if (!goalsEligible)
|
|
7770
8816
|
return;
|
|
7771
8817
|
if (revealedHrefRef.current === visitHref) {
|
|
@@ -7779,8 +8825,8 @@ function MinimizedBubble({
|
|
|
7779
8825
|
}, [goalsEligible, visitHref]);
|
|
7780
8826
|
const matchedGoals = goalsEligible ? adoptionGoals.slice(0, MAX_GOAL_BUBBLES) : [];
|
|
7781
8827
|
const goalsHidden = goalsAutoHidden && !isLauncherHovered;
|
|
7782
|
-
const [goalsUnmounted, setGoalsUnmounted] =
|
|
7783
|
-
|
|
8828
|
+
const [goalsUnmounted, setGoalsUnmounted] = useState22(false);
|
|
8829
|
+
useEffect28(() => {
|
|
7784
8830
|
if (!goalsHidden) {
|
|
7785
8831
|
setGoalsUnmounted(false);
|
|
7786
8832
|
return;
|
|
@@ -7847,7 +8893,7 @@ function MinimizedBubble({
|
|
|
7847
8893
|
className: "skippr:relative",
|
|
7848
8894
|
children: [
|
|
7849
8895
|
isLauncherHovered && /* @__PURE__ */ jsx21(ConsentBubble, {
|
|
7850
|
-
template:
|
|
8896
|
+
template: copy.consentSessionStart,
|
|
7851
8897
|
className: cn("skippr:absolute skippr:bottom-[calc(100%+8px)]", position === "right" ? "skippr:right-0" : "skippr:left-0")
|
|
7852
8898
|
}),
|
|
7853
8899
|
/* @__PURE__ */ jsx21(IdleLauncher, {
|
|
@@ -7865,7 +8911,7 @@ function MinimizedBubble({
|
|
|
7865
8911
|
|
|
7866
8912
|
// src/components/PageActionHandler.tsx
|
|
7867
8913
|
import { useDataChannel as useDataChannel2 } from "@livekit/components-react/hooks";
|
|
7868
|
-
import { useCallback as useCallback19, useEffect as
|
|
8914
|
+
import { useCallback as useCallback19, useEffect as useEffect29, useRef as useRef23 } from "react";
|
|
7869
8915
|
var STEP_MAX_WAIT_MS = 5000;
|
|
7870
8916
|
var POST_ACTION_SETTLE_SNAPSHOT_MS = 300;
|
|
7871
8917
|
var TRAILING_ACTION_FLUSH_AFTER_STOP_MS = 1000;
|
|
@@ -8080,30 +9126,31 @@ function performAction(action, element) {
|
|
|
8080
9126
|
return;
|
|
8081
9127
|
}
|
|
8082
9128
|
}
|
|
8083
|
-
function labelFor(action) {
|
|
9129
|
+
function labelFor(action, copy) {
|
|
8084
9130
|
switch (action.type) {
|
|
8085
9131
|
case "click":
|
|
8086
|
-
return
|
|
9132
|
+
return copy.actionClicking;
|
|
8087
9133
|
case "fill":
|
|
8088
|
-
return
|
|
9134
|
+
return copy.actionTyping;
|
|
8089
9135
|
case "select":
|
|
8090
|
-
return
|
|
9136
|
+
return copy.actionSelecting;
|
|
8091
9137
|
case "scroll":
|
|
8092
9138
|
case "scroll_page":
|
|
8093
9139
|
case "scroll_in":
|
|
8094
|
-
return
|
|
9140
|
+
return copy.actionScrolling;
|
|
8095
9141
|
case "hover":
|
|
8096
|
-
return
|
|
9142
|
+
return copy.actionHovering;
|
|
8097
9143
|
}
|
|
8098
9144
|
}
|
|
8099
9145
|
function PageActionHandler() {
|
|
8100
|
-
const
|
|
8101
|
-
const
|
|
8102
|
-
const
|
|
8103
|
-
const
|
|
8104
|
-
const
|
|
8105
|
-
const
|
|
8106
|
-
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);
|
|
8107
9154
|
const runStep = useCallback19((action) => {
|
|
8108
9155
|
return new Promise((resolve) => {
|
|
8109
9156
|
if (action.type === "scroll_page") {
|
|
@@ -8118,7 +9165,7 @@ function PageActionHandler() {
|
|
|
8118
9165
|
setCursorTarget("act", {
|
|
8119
9166
|
kind: "gesture",
|
|
8120
9167
|
gesture: { direction: gestureFor(action.direction) },
|
|
8121
|
-
label: labelFor(action),
|
|
9168
|
+
label: labelFor(action, copy),
|
|
8122
9169
|
mode: "act",
|
|
8123
9170
|
onAct: () => {
|
|
8124
9171
|
clearTimeout(fallback2);
|
|
@@ -8152,7 +9199,7 @@ function PageActionHandler() {
|
|
|
8152
9199
|
const fallback = setTimeout(finish, STEP_MAX_WAIT_MS);
|
|
8153
9200
|
setCursorTarget("act", {
|
|
8154
9201
|
element,
|
|
8155
|
-
label: labelFor(action),
|
|
9202
|
+
label: labelFor(action, copy),
|
|
8156
9203
|
mode: "act",
|
|
8157
9204
|
onAct: () => {
|
|
8158
9205
|
clearTimeout(fallback);
|
|
@@ -8172,7 +9219,7 @@ function PageActionHandler() {
|
|
|
8172
9219
|
}
|
|
8173
9220
|
});
|
|
8174
9221
|
});
|
|
8175
|
-
}, []);
|
|
9222
|
+
}, [copy]);
|
|
8176
9223
|
const drain = useCallback19(async () => {
|
|
8177
9224
|
if (drainingRef.current)
|
|
8178
9225
|
return;
|
|
@@ -8203,7 +9250,7 @@ function PageActionHandler() {
|
|
|
8203
9250
|
queueRef.current.push(action);
|
|
8204
9251
|
drain();
|
|
8205
9252
|
}, [drain]);
|
|
8206
|
-
|
|
9253
|
+
useEffect29(() => {
|
|
8207
9254
|
mountedRef.current = true;
|
|
8208
9255
|
drainingRef.current = false;
|
|
8209
9256
|
return () => {
|
|
@@ -8215,7 +9262,7 @@ function PageActionHandler() {
|
|
|
8215
9262
|
setActionsBusy(false);
|
|
8216
9263
|
};
|
|
8217
9264
|
}, []);
|
|
8218
|
-
|
|
9265
|
+
useEffect29(() => {
|
|
8219
9266
|
return onActionsStopped(() => {
|
|
8220
9267
|
actionsStoppedRef.current = true;
|
|
8221
9268
|
ignoreActionsArrivingBeforeRef.current = Date.now() + TRAILING_ACTION_FLUSH_AFTER_STOP_MS;
|
|
@@ -8233,17 +9280,17 @@ function PageActionHandler() {
|
|
|
8233
9280
|
}
|
|
8234
9281
|
|
|
8235
9282
|
// src/components/SessionControlBar.tsx
|
|
8236
|
-
import { useCallback as useCallback22, useContext as
|
|
9283
|
+
import { useCallback as useCallback22, useContext as useContext12, useEffect as useEffect33, useState as useState25 } from "react";
|
|
8237
9284
|
|
|
8238
9285
|
// src/hooks/useActionControl.ts
|
|
8239
9286
|
import { useLocalParticipant as useLocalParticipant7 } from "@livekit/components-react/hooks";
|
|
8240
|
-
import { useCallback as useCallback20, useEffect as
|
|
9287
|
+
import { useCallback as useCallback20, useEffect as useEffect30, useState as useState23 } from "react";
|
|
8241
9288
|
var textEncoder6 = new TextEncoder;
|
|
8242
9289
|
function useActionControl() {
|
|
8243
9290
|
const { localParticipant } = useLocalParticipant7();
|
|
8244
9291
|
const plan = usePlanUpdates();
|
|
8245
|
-
const [busy, setBusy] =
|
|
8246
|
-
|
|
9292
|
+
const [busy, setBusy] = useState23(isActionsBusy);
|
|
9293
|
+
useEffect30(() => subscribeActionsBusy(setBusy), []);
|
|
8247
9294
|
const actionsActive = busy || plan?.state === "executing";
|
|
8248
9295
|
const requestStop = useCallback20(async () => {
|
|
8249
9296
|
stopActions();
|
|
@@ -8260,13 +9307,13 @@ function useActionControl() {
|
|
|
8260
9307
|
}
|
|
8261
9308
|
|
|
8262
9309
|
// src/hooks/useAudioLevelBars.ts
|
|
8263
|
-
import { useEffect as
|
|
9310
|
+
import { useEffect as useEffect31, useRef as useRef24, useState as useState24 } from "react";
|
|
8264
9311
|
var TALKING_LEVEL_THRESHOLD = 0.2;
|
|
8265
9312
|
var TALKING_HOLD_MS = 400;
|
|
8266
9313
|
function useAudioLevelBars(mediaStreamTrack, { barCount, idleHeightPx, maxGrowthPx, noiseGate }) {
|
|
8267
|
-
const barRefs =
|
|
8268
|
-
const [isTalking, setIsTalking] =
|
|
8269
|
-
|
|
9314
|
+
const barRefs = useRef24([]);
|
|
9315
|
+
const [isTalking, setIsTalking] = useState24(false);
|
|
9316
|
+
useEffect31(() => {
|
|
8270
9317
|
if (!mediaStreamTrack) {
|
|
8271
9318
|
for (const bar of barRefs.current) {
|
|
8272
9319
|
if (bar)
|
|
@@ -8317,15 +9364,15 @@ function useAudioLevelBars(mediaStreamTrack, { barCount, idleHeightPx, maxGrowth
|
|
|
8317
9364
|
}
|
|
8318
9365
|
|
|
8319
9366
|
// src/hooks/useIdleAutoPause.ts
|
|
8320
|
-
import { useCallback as useCallback21, useEffect as
|
|
9367
|
+
import { useCallback as useCallback21, useEffect as useEffect32, useRef as useRef25 } from "react";
|
|
8321
9368
|
function useIdleAutoPause({
|
|
8322
9369
|
enabled,
|
|
8323
9370
|
active,
|
|
8324
9371
|
isHeld,
|
|
8325
9372
|
pause
|
|
8326
9373
|
}) {
|
|
8327
|
-
const timerRef =
|
|
8328
|
-
const pauseRef =
|
|
9374
|
+
const timerRef = useRef25(null);
|
|
9375
|
+
const pauseRef = useRef25(pause);
|
|
8329
9376
|
pauseRef.current = pause;
|
|
8330
9377
|
const clearTimer = useCallback21(() => {
|
|
8331
9378
|
if (timerRef.current) {
|
|
@@ -8341,7 +9388,7 @@ function useIdleAutoPause({
|
|
|
8341
9388
|
if (enabled && !isHeld)
|
|
8342
9389
|
armTimer();
|
|
8343
9390
|
}, [enabled, isHeld, armTimer]);
|
|
8344
|
-
|
|
9391
|
+
useEffect32(() => {
|
|
8345
9392
|
if (!enabled || isHeld || active) {
|
|
8346
9393
|
clearTimer();
|
|
8347
9394
|
return;
|
|
@@ -8354,13 +9401,13 @@ function useIdleAutoPause({
|
|
|
8354
9401
|
|
|
8355
9402
|
// src/hooks/useLiveUserTranscript.ts
|
|
8356
9403
|
import { useLocalParticipant as useLocalParticipant8 } from "@livekit/components-react/hooks";
|
|
8357
|
-
import { useRef as
|
|
9404
|
+
import { useRef as useRef26 } from "react";
|
|
8358
9405
|
function useLiveUserTranscript(active) {
|
|
8359
9406
|
const transcriptions = useSharedTranscriptions();
|
|
8360
9407
|
const { localParticipant } = useLocalParticipant8();
|
|
8361
9408
|
const localIdentity = localParticipant.identity;
|
|
8362
|
-
const priorStreamIdsRef =
|
|
8363
|
-
const wasActiveRef =
|
|
9409
|
+
const priorStreamIdsRef = useRef26(new Set);
|
|
9410
|
+
const wasActiveRef = useRef26(false);
|
|
8364
9411
|
const userStreams = transcriptions.filter((stream) => stream.participantInfo.identity === localIdentity);
|
|
8365
9412
|
if (active && !wasActiveRef.current) {
|
|
8366
9413
|
priorStreamIdsRef.current = new Set(userStreams.map((s) => s.streamInfo.id));
|
|
@@ -8391,14 +9438,15 @@ function useMicLevel(enabled) {
|
|
|
8391
9438
|
// src/components/PausedCountdown.tsx
|
|
8392
9439
|
import { jsxs as jsxs15 } from "react/jsx-runtime";
|
|
8393
9440
|
function PausedCountdown({ secondsRemaining }) {
|
|
9441
|
+
const copy = useChromeCopy();
|
|
8394
9442
|
const minutes = Math.floor(secondsRemaining / 60);
|
|
8395
9443
|
const seconds = String(secondsRemaining % 60).padStart(2, "0");
|
|
8396
9444
|
return /* @__PURE__ */ jsxs15("span", {
|
|
8397
9445
|
role: "timer",
|
|
8398
|
-
"aria-label":
|
|
9446
|
+
"aria-label": fillPlaceholders(copy.pausedClosingInAria, { seconds: secondsRemaining }),
|
|
8399
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]",
|
|
8400
9448
|
children: [
|
|
8401
|
-
|
|
9449
|
+
copy.pausedClosingIn,
|
|
8402
9450
|
/* @__PURE__ */ jsxs15("span", {
|
|
8403
9451
|
className: "skippr:ml-1 skippr:font-semibold skippr:tabular-nums skippr:text-bubble",
|
|
8404
9452
|
children: [
|
|
@@ -8414,11 +9462,13 @@ function PausedCountdown({ secondsRemaining }) {
|
|
|
8414
9462
|
// src/components/PushToTalkHint.tsx
|
|
8415
9463
|
import { jsx as jsx22, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
8416
9464
|
function PushToTalkHint() {
|
|
9465
|
+
const copy = useChromeCopy();
|
|
9466
|
+
const [beforeKey, afterKey] = splitOnPlaceholder(copy.micShortcutHint, "key");
|
|
8417
9467
|
return /* @__PURE__ */ jsxs16("div", {
|
|
8418
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]"),
|
|
8419
9469
|
children: [
|
|
8420
9470
|
/* @__PURE__ */ jsx22("span", {
|
|
8421
|
-
children:
|
|
9471
|
+
children: beforeKey.trim()
|
|
8422
9472
|
}),
|
|
8423
9473
|
/* @__PURE__ */ jsxs16("kbd", {
|
|
8424
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",
|
|
@@ -8436,7 +9486,7 @@ function PushToTalkHint() {
|
|
|
8436
9486
|
]
|
|
8437
9487
|
}),
|
|
8438
9488
|
/* @__PURE__ */ jsx22("span", {
|
|
8439
|
-
children:
|
|
9489
|
+
children: afterKey.trim()
|
|
8440
9490
|
})
|
|
8441
9491
|
]
|
|
8442
9492
|
});
|
|
@@ -8452,13 +9502,14 @@ function PushToTalkMic({
|
|
|
8452
9502
|
}) {
|
|
8453
9503
|
const { barRefs, isTalking } = useMicLevel(isCapturingSpeech);
|
|
8454
9504
|
const holdPushToTalk = usePointerHold(onStart, onCommit);
|
|
8455
|
-
const
|
|
9505
|
+
const copy = useChromeCopy();
|
|
9506
|
+
const label = isCapturingSpeech ? copy.micReleaseToSend : copy.micHoldToTalk;
|
|
8456
9507
|
const withLabel = isCapturingSpeech || showLabel;
|
|
8457
9508
|
return /* @__PURE__ */ jsxs17("button", {
|
|
8458
9509
|
type: "button",
|
|
8459
9510
|
"data-skippr-no-drag": "",
|
|
8460
9511
|
onPointerDown: holdPushToTalk,
|
|
8461
|
-
"aria-label":
|
|
9512
|
+
"aria-label": copy.micHoldToTalk,
|
|
8462
9513
|
"aria-pressed": isCapturingSpeech,
|
|
8463
9514
|
title: label,
|
|
8464
9515
|
"data-holding": isCapturingSpeech,
|
|
@@ -8520,12 +9571,13 @@ function StopActionsIcon({ className }) {
|
|
|
8520
9571
|
import { jsx as jsx25, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
8521
9572
|
function TapToTalkMic({ isCapturingSpeech, showLabel, onToggle }) {
|
|
8522
9573
|
const { barRefs, isTalking } = useMicLevel(isCapturingSpeech);
|
|
8523
|
-
const
|
|
9574
|
+
const copy = useChromeCopy();
|
|
9575
|
+
const label = isCapturingSpeech ? copy.micTapToSend : copy.micTapToTalk;
|
|
8524
9576
|
const withLabel = isCapturingSpeech || showLabel;
|
|
8525
9577
|
return /* @__PURE__ */ jsxs19("button", {
|
|
8526
9578
|
type: "button",
|
|
8527
9579
|
onClick: onToggle,
|
|
8528
|
-
"aria-label":
|
|
9580
|
+
"aria-label": copy.micTapToTalk,
|
|
8529
9581
|
"aria-pressed": isCapturingSpeech,
|
|
8530
9582
|
title: label,
|
|
8531
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]"),
|
|
@@ -8573,11 +9625,17 @@ var AGENT_BARS = 4;
|
|
|
8573
9625
|
var AGENT_BAR_IDLE_HEIGHT_PX = 4;
|
|
8574
9626
|
var AGENT_BAR_MAX_GROWTH_PX = 12;
|
|
8575
9627
|
var AGENT_NOISE_GATE = 0;
|
|
8576
|
-
var
|
|
8577
|
-
idle: "
|
|
8578
|
-
listening: "
|
|
8579
|
-
thinking: "
|
|
8580
|
-
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"
|
|
8581
9639
|
};
|
|
8582
9640
|
function AgentActivity({
|
|
8583
9641
|
state,
|
|
@@ -8590,11 +9648,15 @@ function AgentActivity({
|
|
|
8590
9648
|
maxGrowthPx: AGENT_BAR_MAX_GROWTH_PX,
|
|
8591
9649
|
noiseGate: AGENT_NOISE_GATE
|
|
8592
9650
|
});
|
|
8593
|
-
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 });
|
|
8594
9656
|
return /* @__PURE__ */ jsxs20("span", {
|
|
8595
9657
|
role: "status",
|
|
8596
9658
|
className: "skippr:flex skippr:items-center skippr:gap-1.5 skippr:text-bubble",
|
|
8597
|
-
"aria-label":
|
|
9659
|
+
"aria-label": ariaLabel,
|
|
8598
9660
|
children: [
|
|
8599
9661
|
/* @__PURE__ */ jsx26("span", {
|
|
8600
9662
|
className: "skippr:flex skippr:size-5 skippr:shrink-0 skippr:items-center skippr:justify-center",
|
|
@@ -8674,7 +9736,7 @@ function SessionControlBar() {
|
|
|
8674
9736
|
variant,
|
|
8675
9737
|
agentControls
|
|
8676
9738
|
} = useLiveAgent();
|
|
8677
|
-
const internalCtx =
|
|
9739
|
+
const internalCtx = useContext12(LiveAgentContext);
|
|
8678
9740
|
if (!internalCtx) {
|
|
8679
9741
|
throw new Error("SessionControlBar must be used within a <LiveAgent> provider");
|
|
8680
9742
|
}
|
|
@@ -8690,6 +9752,7 @@ function SessionControlBar() {
|
|
|
8690
9752
|
const followsPanel = variant === "floating" && isPanelOpen;
|
|
8691
9753
|
const panelFollowers = followsPanel ? [panelRef] : null;
|
|
8692
9754
|
const { wasDraggedRef } = useLauncherDrag(controlBarRef, commitLauncherDrop, panelFollowers, setIsDragging);
|
|
9755
|
+
const copy = useChromeCopy();
|
|
8693
9756
|
const { isMuted, toggleMute, isScreenSharing, toggleScreenShare } = useMediaControls();
|
|
8694
9757
|
const { state, mediaStreamTrack: agentMediaStreamTrack } = useAgentVoiceState();
|
|
8695
9758
|
const { actionsActive, stopActions: stopActions2 } = useActionControl();
|
|
@@ -8709,7 +9772,7 @@ function SessionControlBar() {
|
|
|
8709
9772
|
togglePause();
|
|
8710
9773
|
}
|
|
8711
9774
|
});
|
|
8712
|
-
const [pushToTalkHintSeen, setPushToTalkHintSeen] =
|
|
9775
|
+
const [pushToTalkHintSeen, setPushToTalkHintSeen] = useState25(false);
|
|
8713
9776
|
const startPushToTalk = useCallback22(() => {
|
|
8714
9777
|
start();
|
|
8715
9778
|
reportActivity();
|
|
@@ -8727,7 +9790,7 @@ function SessionControlBar() {
|
|
|
8727
9790
|
onCommit: commitPushToTalk,
|
|
8728
9791
|
onKeyUsed: dismissPushToTalkHint
|
|
8729
9792
|
});
|
|
8730
|
-
|
|
9793
|
+
useEffect33(() => {
|
|
8731
9794
|
if (isHeld)
|
|
8732
9795
|
minimizePanel();
|
|
8733
9796
|
}, [isHeld, minimizePanel]);
|
|
@@ -8766,7 +9829,7 @@ function SessionControlBar() {
|
|
|
8766
9829
|
const panelToggleButton = /* @__PURE__ */ jsx26("button", {
|
|
8767
9830
|
type: "button",
|
|
8768
9831
|
onClick: ifNotDragged(togglePanel),
|
|
8769
|
-
"aria-label": isPanelOpen ?
|
|
9832
|
+
"aria-label": isPanelOpen ? copy.controlBarClosePanel : agendaModule && !textMode ? copy.controlBarOpenAgenda : copy.openChatLabel,
|
|
8770
9833
|
className: cn(SQUARE_BUTTON, "skippr:text-neutral-700", textMode ? "skippr:hover:bg-neutral-100" : "skippr:bg-neutral-100 skippr:hover:bg-neutral-200"),
|
|
8771
9834
|
children: /* @__PURE__ */ jsx26(MessageSquare, {
|
|
8772
9835
|
className: "skippr:size-5"
|
|
@@ -8781,7 +9844,7 @@ function SessionControlBar() {
|
|
|
8781
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"),
|
|
8782
9845
|
children: liveUserTranscript ? liveUserTranscript : /* @__PURE__ */ jsx26("span", {
|
|
8783
9846
|
className: "skippr:text-white/60",
|
|
8784
|
-
children:
|
|
9847
|
+
children: copy.controlBarTranscriptListening
|
|
8785
9848
|
})
|
|
8786
9849
|
}),
|
|
8787
9850
|
/* @__PURE__ */ jsxs20("div", {
|
|
@@ -8806,7 +9869,7 @@ function SessionControlBar() {
|
|
|
8806
9869
|
]
|
|
8807
9870
|
}),
|
|
8808
9871
|
/* @__PURE__ */ jsx26("span", {
|
|
8809
|
-
children:
|
|
9872
|
+
children: copy.controlBarStandingBy
|
|
8810
9873
|
})
|
|
8811
9874
|
]
|
|
8812
9875
|
}),
|
|
@@ -8816,8 +9879,8 @@ function SessionControlBar() {
|
|
|
8816
9879
|
/* @__PURE__ */ jsx26("button", {
|
|
8817
9880
|
type: "button",
|
|
8818
9881
|
onClick: ifNotDragged(togglePause),
|
|
8819
|
-
"aria-label": isHeld ?
|
|
8820
|
-
title: isHeld ?
|
|
9882
|
+
"aria-label": isHeld ? copy.resumeLabel : copy.pauseLabel,
|
|
9883
|
+
title: isHeld ? copy.resumeLabel : copy.pauseLabel,
|
|
8821
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"),
|
|
8822
9885
|
children: isHeld ? /* @__PURE__ */ jsx26(Play, {
|
|
8823
9886
|
className: "skippr:size-5",
|
|
@@ -8878,7 +9941,7 @@ function SessionControlBar() {
|
|
|
8878
9941
|
/* @__PURE__ */ jsxs20("button", {
|
|
8879
9942
|
type: "button",
|
|
8880
9943
|
onClick: ifNotDragged(() => void toggleMute()),
|
|
8881
|
-
"aria-label": isMuted ?
|
|
9944
|
+
"aria-label": isMuted ? copy.unmuteLabel : copy.muteLabel,
|
|
8882
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"),
|
|
8883
9946
|
style: { width: isTalking ? MIC_REGION_WIDTH : MIC_SQUARE_WIDTH },
|
|
8884
9947
|
children: [
|
|
@@ -8907,7 +9970,7 @@ function SessionControlBar() {
|
|
|
8907
9970
|
showScreenShareToggle && /* @__PURE__ */ jsx26("button", {
|
|
8908
9971
|
type: "button",
|
|
8909
9972
|
onClick: ifNotDragged(() => void toggleScreenShare()),
|
|
8910
|
-
"aria-label": isScreenSharing ?
|
|
9973
|
+
"aria-label": isScreenSharing ? copy.stopSharingScreenLabel : copy.shareScreenLabel,
|
|
8911
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"),
|
|
8912
9975
|
children: isScreenSharing ? /* @__PURE__ */ jsx26(MonitorOff, {
|
|
8913
9976
|
className: "skippr:size-5"
|
|
@@ -8919,8 +9982,8 @@ function SessionControlBar() {
|
|
|
8919
9982
|
showActionControl && /* @__PURE__ */ jsx26("button", {
|
|
8920
9983
|
type: "button",
|
|
8921
9984
|
onClick: ifNotDragged(() => void stopActions2()),
|
|
8922
|
-
"aria-label":
|
|
8923
|
-
title:
|
|
9985
|
+
"aria-label": copy.stopActionsLabel,
|
|
9986
|
+
title: copy.stopActionsLabel,
|
|
8924
9987
|
className: cn(SQUARE_BUTTON, "skippr:bg-red-100 skippr:text-red-600 skippr:hover:bg-red-200"),
|
|
8925
9988
|
children: /* @__PURE__ */ jsx26(StopActionsIcon, {
|
|
8926
9989
|
className: "skippr:size-5"
|
|
@@ -8937,7 +10000,7 @@ function SessionControlBar() {
|
|
|
8937
10000
|
type: "button",
|
|
8938
10001
|
onClick: ifNotDragged(() => void pauseSession()),
|
|
8939
10002
|
disabled: isPausing,
|
|
8940
|
-
"aria-label":
|
|
10003
|
+
"aria-label": copy.endSessionLabel,
|
|
8941
10004
|
"aria-busy": isPausing,
|
|
8942
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"),
|
|
8943
10006
|
children: /* @__PURE__ */ jsxs20("span", {
|
|
@@ -8980,7 +10043,7 @@ function SessionControlBar() {
|
|
|
8980
10043
|
}
|
|
8981
10044
|
|
|
8982
10045
|
// src/components/ShadowHost.tsx
|
|
8983
|
-
import { useLayoutEffect as useLayoutEffect2, useRef as
|
|
10046
|
+
import { useLayoutEffect as useLayoutEffect2, useRef as useRef27, useState as useState26 } from "react";
|
|
8984
10047
|
import { createPortal } from "react-dom";
|
|
8985
10048
|
import { jsx as jsx27, Fragment as Fragment3 } from "react/jsx-runtime";
|
|
8986
10049
|
var PROPERTIES_STYLE_ID = "skippr-tw-properties";
|
|
@@ -9001,10 +10064,10 @@ function ShadowHost({
|
|
|
9001
10064
|
accentColor,
|
|
9002
10065
|
className
|
|
9003
10066
|
}) {
|
|
9004
|
-
const hostRef =
|
|
9005
|
-
const [shadowRoot, setShadowRoot] =
|
|
10067
|
+
const hostRef = useRef27(null);
|
|
10068
|
+
const [shadowRoot, setShadowRoot] = useState26(null);
|
|
9006
10069
|
const css = `/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
|
|
9007
|
-
@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\\:wrap-anywhere{overflow-wrap:anywhere}.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}}`;
|
|
9008
10071
|
const hostStyle = accentColor && isHexColor(accentColor) ? {
|
|
9009
10072
|
"--skippr-brand": accentColor,
|
|
9010
10073
|
"--skippr-brand-foreground": brandForeground(accentColor),
|
|
@@ -9036,14 +10099,14 @@ function ShadowHost({
|
|
|
9036
10099
|
}
|
|
9037
10100
|
|
|
9038
10101
|
// src/components/Sidebar.tsx
|
|
9039
|
-
import { useCallback as useCallback28, useContext as
|
|
10102
|
+
import { useCallback as useCallback28, useContext as useContext19, useEffect as useEffect39, useRef as useRef34 } from "react";
|
|
9040
10103
|
|
|
9041
10104
|
// src/hooks/useCombinedMessages.ts
|
|
9042
|
-
import { useContext as
|
|
10105
|
+
import { useContext as useContext13, useMemo as useMemo9 } from "react";
|
|
9043
10106
|
|
|
9044
10107
|
// src/hooks/useChatMessages.ts
|
|
9045
10108
|
import { useChat, useLocalParticipant as useLocalParticipant10 } from "@livekit/components-react/hooks";
|
|
9046
|
-
import { useMemo as
|
|
10109
|
+
import { useMemo as useMemo7 } from "react";
|
|
9047
10110
|
|
|
9048
10111
|
// src/lib/filterSystemMessages.ts
|
|
9049
10112
|
var SYSTEM_MESSAGE_PATTERN = /^\[\w+\]$/;
|
|
@@ -9056,7 +10119,7 @@ function useChatMessages() {
|
|
|
9056
10119
|
const { chatMessages: rawMessages, send, isSending } = useChat();
|
|
9057
10120
|
const { localParticipant } = useLocalParticipant10();
|
|
9058
10121
|
const localIdentity = localParticipant.identity;
|
|
9059
|
-
const chatMessages =
|
|
10122
|
+
const chatMessages = useMemo7(() => {
|
|
9060
10123
|
const sortedMessages = rawMessages.map((msg) => ({
|
|
9061
10124
|
id: msg.id,
|
|
9062
10125
|
role: msg.from?.identity === localIdentity ? "user" : "assistant",
|
|
@@ -9071,19 +10134,19 @@ function useChatMessages() {
|
|
|
9071
10134
|
|
|
9072
10135
|
// src/hooks/useStreamingTranscript.ts
|
|
9073
10136
|
import { useLocalParticipant as useLocalParticipant11 } from "@livekit/components-react/hooks";
|
|
9074
|
-
import { useMemo as
|
|
10137
|
+
import { useMemo as useMemo8, useRef as useRef28 } from "react";
|
|
9075
10138
|
function useStreamingTranscript() {
|
|
9076
10139
|
const transcriptions = useSharedTranscriptions();
|
|
9077
10140
|
const { localParticipant } = useLocalParticipant11();
|
|
9078
10141
|
const { isCapturingSpeech } = useVoiceTurnContext();
|
|
9079
10142
|
const localIdentity = localParticipant.identity;
|
|
9080
|
-
const priorUserStreamIdsRef =
|
|
9081
|
-
const wasCapturingSpeechRef =
|
|
10143
|
+
const priorUserStreamIdsRef = useRef28(new Set);
|
|
10144
|
+
const wasCapturingSpeechRef = useRef28(false);
|
|
9082
10145
|
if (isCapturingSpeech && !wasCapturingSpeechRef.current) {
|
|
9083
10146
|
priorUserStreamIdsRef.current = new Set(transcriptions.filter((stream) => stream.participantInfo.identity === localIdentity).map((stream) => stream.streamInfo.id));
|
|
9084
10147
|
}
|
|
9085
10148
|
wasCapturingSpeechRef.current = isCapturingSpeech;
|
|
9086
|
-
const transcriptMessages =
|
|
10149
|
+
const transcriptMessages = useMemo8(() => filterSystemMessages(transcriptions.filter((stream) => stream.text.trim().length > 0).filter((stream) => {
|
|
9087
10150
|
if (!isCapturingSpeech)
|
|
9088
10151
|
return true;
|
|
9089
10152
|
const isUser = stream.participantInfo.identity === localIdentity;
|
|
@@ -9121,15 +10184,15 @@ function useCombinedMessages() {
|
|
|
9121
10184
|
const { transcriptMessages } = useStreamingTranscript();
|
|
9122
10185
|
const { chatMessages, sendChatMessage, isSendingChat } = useChatMessages();
|
|
9123
10186
|
const { state: agentState } = useAgentVoiceState();
|
|
9124
|
-
const historyMessages =
|
|
9125
|
-
const liveMessages =
|
|
10187
|
+
const historyMessages = useContext13(LiveAgentContext)?.historyMessages ?? [];
|
|
10188
|
+
const liveMessages = useMemo9(() => {
|
|
9126
10189
|
if (chatMessages.length === 0)
|
|
9127
10190
|
return transcriptMessages;
|
|
9128
10191
|
if (transcriptMessages.length === 0)
|
|
9129
10192
|
return chatMessages;
|
|
9130
10193
|
return mergeChatsIntoTranscripts(transcriptMessages, chatMessages);
|
|
9131
10194
|
}, [transcriptMessages, chatMessages]);
|
|
9132
|
-
const allMessages =
|
|
10195
|
+
const allMessages = useMemo9(() => {
|
|
9133
10196
|
if (historyMessages.length === 0)
|
|
9134
10197
|
return liveMessages;
|
|
9135
10198
|
const seenIds = new Set(liveMessages.map((message) => message.id));
|
|
@@ -9169,7 +10232,7 @@ function useLinkCard() {
|
|
|
9169
10232
|
}
|
|
9170
10233
|
|
|
9171
10234
|
// src/hooks/usePhaseUpdates.ts
|
|
9172
|
-
import { useCallback as useCallback24, useContext as
|
|
10235
|
+
import { useCallback as useCallback24, useContext as useContext14, useEffect as useEffect34, useMemo as useMemo10 } from "react";
|
|
9173
10236
|
function parsePhases(json) {
|
|
9174
10237
|
try {
|
|
9175
10238
|
const data = JSON.parse(json);
|
|
@@ -9182,17 +10245,27 @@ function parsePhases(json) {
|
|
|
9182
10245
|
function usePhaseUpdates() {
|
|
9183
10246
|
const parse = useCallback24(parsePhases, []);
|
|
9184
10247
|
const livePhases = useAgentState("phases", parse, []);
|
|
9185
|
-
const ctx =
|
|
9186
|
-
|
|
10248
|
+
const ctx = useContext14(LiveAgentContext);
|
|
10249
|
+
useEffect34(() => {
|
|
9187
10250
|
if (livePhases.length > 0)
|
|
9188
10251
|
ctx?.setPhasesSnapshot(livePhases);
|
|
9189
10252
|
}, [livePhases, ctx?.setPhasesSnapshot]);
|
|
9190
|
-
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]);
|
|
9191
10264
|
return { phases };
|
|
9192
10265
|
}
|
|
9193
10266
|
|
|
9194
10267
|
// src/hooks/useSessionRemaining.ts
|
|
9195
|
-
import { useEffect as
|
|
10268
|
+
import { useEffect as useEffect35, useRef as useRef29, useState as useState27 } from "react";
|
|
9196
10269
|
|
|
9197
10270
|
// src/lib/format.ts
|
|
9198
10271
|
function formatTime(seconds) {
|
|
@@ -9208,9 +10281,9 @@ function parseNumber(s) {
|
|
|
9208
10281
|
// src/hooks/useSessionRemaining.ts
|
|
9209
10282
|
function useSessionRemaining() {
|
|
9210
10283
|
const maxCallDuration = useAgentState("maxCallDuration", parseNumber, null);
|
|
9211
|
-
const endTimeRef =
|
|
9212
|
-
const [remaining, setRemaining] =
|
|
9213
|
-
|
|
10284
|
+
const endTimeRef = useRef29(null);
|
|
10285
|
+
const [remaining, setRemaining] = useState27(null);
|
|
10286
|
+
useEffect35(() => {
|
|
9214
10287
|
if (maxCallDuration === null || endTimeRef.current !== null)
|
|
9215
10288
|
return;
|
|
9216
10289
|
const endTime = Date.now() + maxCallDuration * 1000;
|
|
@@ -9296,20 +10369,20 @@ function panelTransformOrigin(popsDown, isLeftAligned) {
|
|
|
9296
10369
|
}
|
|
9297
10370
|
|
|
9298
10371
|
// src/components/ChatHeader.tsx
|
|
9299
|
-
import { useContext as
|
|
10372
|
+
import { useContext as useContext16 } from "react";
|
|
9300
10373
|
|
|
9301
10374
|
// src/hooks/useTextMode.ts
|
|
9302
10375
|
import { useLocalParticipant as useLocalParticipant12 } from "@livekit/components-react/hooks";
|
|
9303
|
-
import { useCallback as useCallback25, useContext as
|
|
10376
|
+
import { useCallback as useCallback25, useContext as useContext15, useRef as useRef30 } from "react";
|
|
9304
10377
|
var textEncoder7 = new TextEncoder;
|
|
9305
10378
|
function useTextMode() {
|
|
9306
|
-
const ctx =
|
|
10379
|
+
const ctx = useContext15(LiveAgentContext);
|
|
9307
10380
|
if (!ctx) {
|
|
9308
10381
|
throw new Error("useTextMode must be used within a <LiveAgent> provider");
|
|
9309
10382
|
}
|
|
9310
10383
|
const { textMode, setTextModeState, sidebarTab, setSidebarTab } = ctx;
|
|
9311
10384
|
const { localParticipant } = useLocalParticipant12();
|
|
9312
|
-
const confirmedTextModeRef =
|
|
10385
|
+
const confirmedTextModeRef = useRef30(false);
|
|
9313
10386
|
const toggleTextMode = useCallback25(async () => {
|
|
9314
10387
|
const next = !textMode;
|
|
9315
10388
|
setTextModeState(next);
|
|
@@ -9336,7 +10409,7 @@ import { jsx as jsx28, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
|
9336
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";
|
|
9337
10410
|
var TABS_PILL_ACTIVE = "skippr:bg-white skippr:text-[#2D2D3F] skippr:shadow-[0_1px_2px_rgba(45,45,63,0.08)]";
|
|
9338
10411
|
function ChatHeader({ wasDraggedRef, draggable, headerRef }) {
|
|
9339
|
-
const ctx =
|
|
10412
|
+
const ctx = useContext16(LiveAgentContext);
|
|
9340
10413
|
if (!ctx) {
|
|
9341
10414
|
throw new Error("ChatHeader must be used within a <LiveAgent> provider");
|
|
9342
10415
|
}
|
|
@@ -9352,6 +10425,7 @@ function ChatHeader({ wasDraggedRef, draggable, headerRef }) {
|
|
|
9352
10425
|
} = ctx;
|
|
9353
10426
|
const { isHeld } = useSessionHoldContext();
|
|
9354
10427
|
const { textMode, toggleTextMode } = useTextMode();
|
|
10428
|
+
const copy = useChromeCopy();
|
|
9355
10429
|
const defaultModule = displayModules.find((m) => m.id === defaultAgentId) ?? null;
|
|
9356
10430
|
const displayedMode = agentMode ?? defaultModule?.mode ?? null;
|
|
9357
10431
|
const showAgenda = displayedMode !== AGENT_MODE.AlwaysOn;
|
|
@@ -9362,7 +10436,7 @@ function ChatHeader({ wasDraggedRef, draggable, headerRef }) {
|
|
|
9362
10436
|
children: [
|
|
9363
10437
|
showAgenda ? /* @__PURE__ */ jsxs21("div", {
|
|
9364
10438
|
role: "tablist",
|
|
9365
|
-
"aria-label":
|
|
10439
|
+
"aria-label": copy.chatPanelLabel,
|
|
9366
10440
|
"data-skippr-no-drag": "",
|
|
9367
10441
|
className: "skippr:flex skippr:gap-[2px] skippr:rounded-full skippr:bg-[#f4f2ee] skippr:p-[2px]",
|
|
9368
10442
|
children: [
|
|
@@ -9372,7 +10446,7 @@ function ChatHeader({ wasDraggedRef, draggable, headerRef }) {
|
|
|
9372
10446
|
"aria-selected": sidebarTab === "chat",
|
|
9373
10447
|
onClick: () => setSidebarTab("chat"),
|
|
9374
10448
|
className: cn(TABS_PILL_BASE, sidebarTab === "chat" && TABS_PILL_ACTIVE),
|
|
9375
|
-
children:
|
|
10449
|
+
children: copy.chatTabChat
|
|
9376
10450
|
}),
|
|
9377
10451
|
/* @__PURE__ */ jsx28("button", {
|
|
9378
10452
|
type: "button",
|
|
@@ -9380,12 +10454,12 @@ function ChatHeader({ wasDraggedRef, draggable, headerRef }) {
|
|
|
9380
10454
|
"aria-selected": sidebarTab === "agenda",
|
|
9381
10455
|
onClick: () => setSidebarTab("agenda"),
|
|
9382
10456
|
className: cn(TABS_PILL_BASE, sidebarTab === "agenda" && TABS_PILL_ACTIVE),
|
|
9383
|
-
children:
|
|
10457
|
+
children: copy.chatTabAgenda
|
|
9384
10458
|
})
|
|
9385
10459
|
]
|
|
9386
10460
|
}) : /* @__PURE__ */ jsx28("span", {
|
|
9387
10461
|
className: "skippr:text-[12.5px] skippr:font-semibold skippr:tracking-[-0.01em] skippr:text-[#2D2D3F]",
|
|
9388
|
-
children:
|
|
10462
|
+
children: copy.chatPanelTitle
|
|
9389
10463
|
}),
|
|
9390
10464
|
/* @__PURE__ */ jsx28("div", {
|
|
9391
10465
|
className: "skippr:flex-1"
|
|
@@ -9394,8 +10468,8 @@ function ChatHeader({ wasDraggedRef, draggable, headerRef }) {
|
|
|
9394
10468
|
type: "button",
|
|
9395
10469
|
disabled: isHeld,
|
|
9396
10470
|
onClick: () => void toggleTextMode(),
|
|
9397
|
-
title: textMode ?
|
|
9398
|
-
"aria-label": textMode ?
|
|
10471
|
+
title: textMode ? copy.chatSwitchToVoice : copy.chatSwitchToText,
|
|
10472
|
+
"aria-label": textMode ? copy.chatSwitchToVoice : copy.chatSwitchToText,
|
|
9399
10473
|
"data-skippr-no-drag": "",
|
|
9400
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",
|
|
9401
10475
|
children: [
|
|
@@ -9406,7 +10480,7 @@ function ChatHeader({ wasDraggedRef, draggable, headerRef }) {
|
|
|
9406
10480
|
className: "skippr:size-[13px]",
|
|
9407
10481
|
strokeWidth: 2
|
|
9408
10482
|
}),
|
|
9409
|
-
textMode ?
|
|
10483
|
+
textMode ? copy.chatToggleVoice : copy.chatToggleText
|
|
9410
10484
|
]
|
|
9411
10485
|
}),
|
|
9412
10486
|
minimizable && /* @__PURE__ */ jsx28("button", {
|
|
@@ -9415,8 +10489,8 @@ function ChatHeader({ wasDraggedRef, draggable, headerRef }) {
|
|
|
9415
10489
|
if (!wasDraggedRef.current)
|
|
9416
10490
|
minimizePanel();
|
|
9417
10491
|
},
|
|
9418
|
-
"aria-label":
|
|
9419
|
-
title:
|
|
10492
|
+
"aria-label": copy.closeLabel,
|
|
10493
|
+
title: copy.closeLabel,
|
|
9420
10494
|
"data-skippr-no-drag": "",
|
|
9421
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]",
|
|
9422
10496
|
children: /* @__PURE__ */ jsx28(X, {
|
|
@@ -9481,26 +10555,27 @@ function LogoMark({ className, decorative }) {
|
|
|
9481
10555
|
}
|
|
9482
10556
|
|
|
9483
10557
|
// src/components/MessageList.tsx
|
|
9484
|
-
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";
|
|
9485
10559
|
|
|
9486
10560
|
// src/components/ChatInput.tsx
|
|
9487
|
-
import { useContext as
|
|
10561
|
+
import { useContext as useContext17, useEffect as useEffect36, useRef as useRef31, useState as useState28 } from "react";
|
|
9488
10562
|
import { jsx as jsx31, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
9489
10563
|
var MAX_INPUT_HEIGHT = 60;
|
|
9490
10564
|
function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
|
|
9491
|
-
const ctx =
|
|
10565
|
+
const ctx = useContext17(LiveAgentContext);
|
|
10566
|
+
const copy = useChromeCopy();
|
|
9492
10567
|
const reportChatActivity = ctx?.reportChatActivity;
|
|
9493
10568
|
const isPanelOpen = ctx?.isPanelOpen;
|
|
9494
|
-
const [localDraft, setLocalDraft] =
|
|
10569
|
+
const [localDraft, setLocalDraft] = useState28("");
|
|
9495
10570
|
const inputText = ctx?.chatDraft ?? localDraft;
|
|
9496
10571
|
const setInputText = ctx?.setChatDraft ?? setLocalDraft;
|
|
9497
|
-
const textareaRef =
|
|
10572
|
+
const textareaRef = useRef31(null);
|
|
9498
10573
|
const canSend = inputText.trim().length > 0 && !isSendingChat;
|
|
9499
|
-
|
|
10574
|
+
useEffect36(() => {
|
|
9500
10575
|
if (autoFocus && isPanelOpen !== false)
|
|
9501
10576
|
textareaRef.current?.focus();
|
|
9502
10577
|
}, [autoFocus, isPanelOpen]);
|
|
9503
|
-
|
|
10578
|
+
useEffect36(() => {
|
|
9504
10579
|
const el = textareaRef.current;
|
|
9505
10580
|
if (!el)
|
|
9506
10581
|
return;
|
|
@@ -9538,15 +10613,15 @@ function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
|
|
|
9538
10613
|
value: inputText,
|
|
9539
10614
|
onChange: handleChange,
|
|
9540
10615
|
onKeyDown: handleKeyDown,
|
|
9541
|
-
placeholder:
|
|
9542
|
-
"aria-label":
|
|
10616
|
+
placeholder: copy.chatMessagePlaceholder,
|
|
10617
|
+
"aria-label": copy.chatMessageLabel,
|
|
9543
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]",
|
|
9544
10619
|
style: { maxHeight: `${MAX_INPUT_HEIGHT}px` }
|
|
9545
10620
|
}),
|
|
9546
10621
|
/* @__PURE__ */ jsx31("button", {
|
|
9547
10622
|
type: "submit",
|
|
9548
10623
|
disabled: !canSend,
|
|
9549
|
-
"aria-label":
|
|
10624
|
+
"aria-label": copy.chatSendMessageLabel,
|
|
9550
10625
|
style: {
|
|
9551
10626
|
background: canSend ? "var(--skippr-brand, #2bc0ae)" : "#cdd8d5",
|
|
9552
10627
|
color: "var(--skippr-brand-foreground, #2d2b3d)"
|
|
@@ -9578,7 +10653,7 @@ function ChatMessage({ message }) {
|
|
|
9578
10653
|
className: cn("skippr:flex skippr:max-w-[80%] skippr:flex-col", isAgent ? "skippr:items-start" : "skippr:items-end"),
|
|
9579
10654
|
children: [
|
|
9580
10655
|
/* @__PURE__ */ jsx32("div", {
|
|
9581
|
-
className: cn("skippr:rounded-2xl skippr:px-4 skippr:py-2.5 skippr:text-sm skippr:leading-relaxed", isAgent ? "skippr:border skippr:border-border skippr:bg-card skippr:text-foreground" : "skippr:bg-primary skippr:text-primary-foreground"),
|
|
10656
|
+
className: cn("skippr:wrap-anywhere skippr:rounded-2xl skippr:px-4 skippr:py-2.5 skippr:text-sm skippr:leading-relaxed", isAgent ? "skippr:border skippr:border-border skippr:bg-card skippr:text-foreground" : "skippr:bg-primary skippr:text-primary-foreground"),
|
|
9582
10657
|
children: message.content
|
|
9583
10658
|
}),
|
|
9584
10659
|
message.timestamp && /* @__PURE__ */ jsx32("span", {
|
|
@@ -9591,7 +10666,7 @@ function ChatMessage({ message }) {
|
|
|
9591
10666
|
}
|
|
9592
10667
|
|
|
9593
10668
|
// src/components/LinkCard.tsx
|
|
9594
|
-
import { useCallback as useCallback26, useEffect as
|
|
10669
|
+
import { useCallback as useCallback26, useEffect as useEffect37, useRef as useRef32, useState as useState29 } from "react";
|
|
9595
10670
|
|
|
9596
10671
|
// src/lib/clipboard.ts
|
|
9597
10672
|
async function copyToClipboard(text) {
|
|
@@ -9608,15 +10683,16 @@ import { jsx as jsx33, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
|
9608
10683
|
var COPIED_RESET_MS = 2000;
|
|
9609
10684
|
var DISMISS_AFTER_COPY_MS = 3000;
|
|
9610
10685
|
function LinkCard({ card, onDismiss }) {
|
|
9611
|
-
const [copied, setCopied] =
|
|
9612
|
-
const
|
|
9613
|
-
|
|
10686
|
+
const [copied, setCopied] = useState29(false);
|
|
10687
|
+
const copy = useChromeCopy();
|
|
10688
|
+
const dismissTimerRef = useRef32(null);
|
|
10689
|
+
useEffect37(() => {
|
|
9614
10690
|
if (!copied)
|
|
9615
10691
|
return;
|
|
9616
10692
|
const timer = setTimeout(() => setCopied(false), COPIED_RESET_MS);
|
|
9617
10693
|
return () => clearTimeout(timer);
|
|
9618
10694
|
}, [copied]);
|
|
9619
|
-
|
|
10695
|
+
useEffect37(() => {
|
|
9620
10696
|
return () => {
|
|
9621
10697
|
if (dismissTimerRef.current)
|
|
9622
10698
|
clearTimeout(dismissTimerRef.current);
|
|
@@ -9642,7 +10718,7 @@ function LinkCard({ card, onDismiss }) {
|
|
|
9642
10718
|
/* @__PURE__ */ jsx33("button", {
|
|
9643
10719
|
type: "button",
|
|
9644
10720
|
onClick: onDismiss,
|
|
9645
|
-
"aria-label":
|
|
10721
|
+
"aria-label": copy.cardDismissLink,
|
|
9646
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",
|
|
9647
10723
|
children: /* @__PURE__ */ jsx33(X, {
|
|
9648
10724
|
className: "skippr:size-3.5",
|
|
@@ -9667,21 +10743,21 @@ function LinkCard({ card, onDismiss }) {
|
|
|
9667
10743
|
/* @__PURE__ */ jsx33(ExternalLink, {
|
|
9668
10744
|
className: "skippr:size-4"
|
|
9669
10745
|
}),
|
|
9670
|
-
|
|
10746
|
+
copy.cardOpenLink
|
|
9671
10747
|
]
|
|
9672
10748
|
}),
|
|
9673
10749
|
/* @__PURE__ */ jsxs26(Button, {
|
|
9674
10750
|
variant: "outline",
|
|
9675
10751
|
className: "skippr:flex-1 skippr:py-2",
|
|
9676
10752
|
onClick: handleCopy,
|
|
9677
|
-
"aria-label":
|
|
10753
|
+
"aria-label": copy.cardCopyLink,
|
|
9678
10754
|
children: [
|
|
9679
10755
|
copied ? /* @__PURE__ */ jsx33(Check, {
|
|
9680
10756
|
className: "skippr:size-4"
|
|
9681
10757
|
}) : /* @__PURE__ */ jsx33(Copy, {
|
|
9682
10758
|
className: "skippr:size-4"
|
|
9683
10759
|
}),
|
|
9684
|
-
copied ?
|
|
10760
|
+
copied ? copy.cardCopied : copy.cardCopyLink
|
|
9685
10761
|
]
|
|
9686
10762
|
})
|
|
9687
10763
|
]
|
|
@@ -9691,7 +10767,7 @@ function LinkCard({ card, onDismiss }) {
|
|
|
9691
10767
|
}
|
|
9692
10768
|
|
|
9693
10769
|
// src/components/PlanCard.tsx
|
|
9694
|
-
import { useEffect as
|
|
10770
|
+
import { useEffect as useEffect38, useState as useState30 } from "react";
|
|
9695
10771
|
import { jsx as jsx34, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
9696
10772
|
var APPROVE_MESSAGE = "Yes, go ahead.";
|
|
9697
10773
|
var CANCEL_MESSAGE = "No, cancel that.";
|
|
@@ -9718,9 +10794,10 @@ function StepIcon({ status }) {
|
|
|
9718
10794
|
});
|
|
9719
10795
|
}
|
|
9720
10796
|
function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
10797
|
+
const copy = useChromeCopy();
|
|
9721
10798
|
const awaitingApproval = plan.state === "proposed";
|
|
9722
|
-
const [isApproving, setIsApproving] =
|
|
9723
|
-
const [lastPlanId, setLastPlanId] =
|
|
10799
|
+
const [isApproving, setIsApproving] = useState30(false);
|
|
10800
|
+
const [lastPlanId, setLastPlanId] = useState30(plan.planId);
|
|
9724
10801
|
if (plan.planId !== lastPlanId) {
|
|
9725
10802
|
setLastPlanId(plan.planId);
|
|
9726
10803
|
setIsApproving(false);
|
|
@@ -9732,13 +10809,13 @@ function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
|
9732
10809
|
setIsApproving(false);
|
|
9733
10810
|
});
|
|
9734
10811
|
};
|
|
9735
|
-
|
|
10812
|
+
useEffect38(() => {
|
|
9736
10813
|
if (!isApproving)
|
|
9737
10814
|
return;
|
|
9738
10815
|
const timer = setTimeout(() => setIsApproving(false), APPROVING_RESET_MS);
|
|
9739
10816
|
return () => clearTimeout(timer);
|
|
9740
10817
|
}, [isApproving]);
|
|
9741
|
-
|
|
10818
|
+
useEffect38(() => {
|
|
9742
10819
|
if (plan.state !== "completed")
|
|
9743
10820
|
return;
|
|
9744
10821
|
const timer = setTimeout(onDismiss, COMPLETED_CARD_VISIBLE_MS);
|
|
@@ -9748,11 +10825,11 @@ function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
|
9748
10825
|
className: "skippr:rounded-2xl skippr:rounded-tl-md skippr:bg-card skippr:p-3.5 skippr:ring-2 skippr:ring-brand",
|
|
9749
10826
|
children: [
|
|
9750
10827
|
/* @__PURE__ */ jsx34("p", {
|
|
9751
|
-
className: "skippr:mb-3 skippr:text-
|
|
9752
|
-
children:
|
|
10828
|
+
className: "skippr:mb-3 skippr:text-xs skippr:font-semibold skippr:leading-snug skippr:text-foreground",
|
|
10829
|
+
children: copy.planTitle
|
|
9753
10830
|
}),
|
|
9754
10831
|
/* @__PURE__ */ jsx34("div", {
|
|
9755
|
-
className: "skippr:space-y-2",
|
|
10832
|
+
className: "skippr:max-h-[132px] skippr:space-y-2 skippr:overflow-y-auto skippr:overscroll-contain",
|
|
9756
10833
|
children: plan.steps.map((step) => /* @__PURE__ */ jsxs27("div", {
|
|
9757
10834
|
className: "skippr:flex skippr:items-center skippr:gap-2",
|
|
9758
10835
|
children: [
|
|
@@ -9760,7 +10837,7 @@ function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
|
9760
10837
|
status: step.status
|
|
9761
10838
|
}),
|
|
9762
10839
|
/* @__PURE__ */ jsx34("p", {
|
|
9763
|
-
className: cn("skippr:text-
|
|
10840
|
+
className: cn("skippr:wrap-anywhere skippr:text-xs skippr:leading-snug", step.status === "done" && "skippr:text-muted-foreground skippr:line-through", step.status === "active" && "skippr:font-medium skippr:text-foreground", step.status === "pending" && "skippr:text-muted-foreground", step.status === "failed" && "skippr:text-destructive"),
|
|
9764
10841
|
children: step.label
|
|
9765
10842
|
})
|
|
9766
10843
|
]
|
|
@@ -9777,7 +10854,7 @@ function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
|
9777
10854
|
isApproving && /* @__PURE__ */ jsx34("span", {
|
|
9778
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"
|
|
9779
10856
|
}),
|
|
9780
|
-
isApproving ?
|
|
10857
|
+
isApproving ? copy.planApproving : copy.planApprove
|
|
9781
10858
|
]
|
|
9782
10859
|
}),
|
|
9783
10860
|
/* @__PURE__ */ jsx34(Button, {
|
|
@@ -9785,7 +10862,7 @@ function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
|
9785
10862
|
className: "skippr:flex-1 skippr:py-2",
|
|
9786
10863
|
disabled: isApproving,
|
|
9787
10864
|
onClick: () => sendChatMessage(CANCEL_MESSAGE),
|
|
9788
|
-
children:
|
|
10865
|
+
children: copy.planCancel
|
|
9789
10866
|
})
|
|
9790
10867
|
]
|
|
9791
10868
|
})
|
|
@@ -9796,13 +10873,14 @@ function PlanCard({ plan, sendChatMessage, onDismiss }) {
|
|
|
9796
10873
|
// src/components/TypingIndicator.tsx
|
|
9797
10874
|
import { jsx as jsx35, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
9798
10875
|
function TypingIndicator() {
|
|
10876
|
+
const copy = useChromeCopy();
|
|
9799
10877
|
return /* @__PURE__ */ jsx35("div", {
|
|
9800
10878
|
className: "skippr:flex skippr:items-start skippr:gap-2 skippr:animate-skippr-tab-fade",
|
|
9801
10879
|
children: /* @__PURE__ */ jsxs28("div", {
|
|
9802
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",
|
|
9803
10881
|
children: [
|
|
9804
10882
|
/* @__PURE__ */ jsx35("span", {
|
|
9805
|
-
children:
|
|
10883
|
+
children: copy.chatAnalyzingScreen
|
|
9806
10884
|
}),
|
|
9807
10885
|
/* @__PURE__ */ jsxs28("span", {
|
|
9808
10886
|
className: "skippr:inline-flex skippr:items-center skippr:gap-[2px]",
|
|
@@ -9836,17 +10914,18 @@ function MessageList({
|
|
|
9836
10914
|
autoFocus = false,
|
|
9837
10915
|
readOnly = false
|
|
9838
10916
|
}) {
|
|
9839
|
-
const
|
|
9840
|
-
const
|
|
9841
|
-
const
|
|
9842
|
-
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);
|
|
9843
10922
|
const lastMessage = messages.length > 0 ? messages[messages.length - 1] : undefined;
|
|
9844
|
-
const [dismissedPlanId, setDismissedPlanId] =
|
|
10923
|
+
const [dismissedPlanId, setDismissedPlanId] = useState31(null);
|
|
9845
10924
|
const dismissPlan = useCallback27(() => {
|
|
9846
10925
|
if (plan)
|
|
9847
10926
|
setDismissedPlanId(plan.planId);
|
|
9848
10927
|
}, [plan]);
|
|
9849
|
-
const [dismissedLinkCardId, setDismissedLinkCardId] =
|
|
10928
|
+
const [dismissedLinkCardId, setDismissedLinkCardId] = useState31(null);
|
|
9850
10929
|
const dismissLinkCard = useCallback27(() => {
|
|
9851
10930
|
if (linkCard)
|
|
9852
10931
|
setDismissedLinkCardId(linkCard.cardId);
|
|
@@ -9883,6 +10962,7 @@ function MessageList({
|
|
|
9883
10962
|
container.scrollTop = container.scrollHeight;
|
|
9884
10963
|
}, [messages.length, lastMessage?.content]);
|
|
9885
10964
|
const showTyping = isStreaming && lastMessage?.role === "assistant" && lastMessage.content === "";
|
|
10965
|
+
const isPlanShowing = !!sendChatMessage && isPlanVisible(plan) && plan.planId !== dismissedPlanId;
|
|
9886
10966
|
return /* @__PURE__ */ jsxs29("div", {
|
|
9887
10967
|
className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col",
|
|
9888
10968
|
children: [
|
|
@@ -9897,9 +10977,9 @@ function MessageList({
|
|
|
9897
10977
|
children: [
|
|
9898
10978
|
messages.length === 0 && !showTyping && (readOnly ? /* @__PURE__ */ jsx36("p", {
|
|
9899
10979
|
className: "skippr:px-2 skippr:py-6 skippr:text-center skippr:text-sm skippr:text-muted-foreground",
|
|
9900
|
-
children:
|
|
10980
|
+
children: copy.chatEmptyConversation
|
|
9901
10981
|
}) : /* @__PURE__ */ jsx36(LoadingDots, {
|
|
9902
|
-
label:
|
|
10982
|
+
label: copy.chatWaitingToBegin
|
|
9903
10983
|
})),
|
|
9904
10984
|
messages.map((message) => /* @__PURE__ */ jsx36(ChatMessage, {
|
|
9905
10985
|
message
|
|
@@ -9910,7 +10990,7 @@ function MessageList({
|
|
|
9910
10990
|
showJumpToLatest && /* @__PURE__ */ jsx36("button", {
|
|
9911
10991
|
type: "button",
|
|
9912
10992
|
onClick: jumpToLatest,
|
|
9913
|
-
"aria-label":
|
|
10993
|
+
"aria-label": copy.chatJumpToLatest,
|
|
9914
10994
|
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",
|
|
9915
10995
|
children: /* @__PURE__ */ jsx36(ChevronDown, {
|
|
9916
10996
|
className: "skippr:size-4"
|
|
@@ -9918,7 +10998,7 @@ function MessageList({
|
|
|
9918
10998
|
})
|
|
9919
10999
|
]
|
|
9920
11000
|
}),
|
|
9921
|
-
|
|
11001
|
+
isPlanShowing && /* @__PURE__ */ jsx36("div", {
|
|
9922
11002
|
"data-skippr-no-drag": "",
|
|
9923
11003
|
className: "skippr:shrink-0 skippr:border-t skippr:border-border skippr:p-3",
|
|
9924
11004
|
children: /* @__PURE__ */ jsx36(PlanCard, {
|
|
@@ -9927,7 +11007,7 @@ function MessageList({
|
|
|
9927
11007
|
onDismiss: dismissPlan
|
|
9928
11008
|
}, plan.planId)
|
|
9929
11009
|
}),
|
|
9930
|
-
linkCard && linkCard.cardId !== dismissedLinkCardId && /* @__PURE__ */ jsx36("div", {
|
|
11010
|
+
!isPlanShowing && linkCard && linkCard.cardId !== dismissedLinkCardId && /* @__PURE__ */ jsx36("div", {
|
|
9931
11011
|
"data-skippr-no-drag": "",
|
|
9932
11012
|
className: "skippr:shrink-0 skippr:border-t skippr:border-border skippr:p-3",
|
|
9933
11013
|
children: /* @__PURE__ */ jsx36(LinkCard, {
|
|
@@ -9945,16 +11025,18 @@ function MessageList({
|
|
|
9945
11025
|
}
|
|
9946
11026
|
|
|
9947
11027
|
// src/components/SessionAgenda.tsx
|
|
9948
|
-
import { useContext as
|
|
11028
|
+
import { useContext as useContext18 } from "react";
|
|
9949
11029
|
import { jsx as jsx37, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
9950
11030
|
function SessionAgenda({ phases, hasStarted }) {
|
|
9951
|
-
const ctx =
|
|
9952
|
-
const
|
|
11031
|
+
const ctx = useContext18(LiveAgentContext);
|
|
11032
|
+
const copy = useChromeCopy();
|
|
11033
|
+
const sessionTitle = ctx?.phaseLabels.agentId && ctx.phaseLabels.agentId === ctx.agentId ? ctx.phaseLabels.agentName : undefined;
|
|
11034
|
+
const title = sessionTitle ?? ctx?.activeModule?.name ?? copy.agendaTitle;
|
|
9953
11035
|
if (phases.length === 0 || !hasStarted) {
|
|
9954
11036
|
return /* @__PURE__ */ jsx37("div", {
|
|
9955
11037
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
|
|
9956
11038
|
children: /* @__PURE__ */ jsx37(LoadingDots, {
|
|
9957
|
-
label:
|
|
11039
|
+
label: copy.agendaLoading
|
|
9958
11040
|
})
|
|
9959
11041
|
});
|
|
9960
11042
|
}
|
|
@@ -9967,26 +11049,21 @@ function SessionAgenda({ phases, hasStarted }) {
|
|
|
9967
11049
|
className: "skippr:flex-1 skippr:overflow-y-auto skippr:p-[14px]",
|
|
9968
11050
|
children: [
|
|
9969
11051
|
/* @__PURE__ */ jsxs30("div", {
|
|
9970
|
-
className: "skippr:mb-2 skippr:flex skippr:items-baseline skippr:justify-between",
|
|
11052
|
+
className: "skippr:mb-2 skippr:flex skippr:items-baseline skippr:justify-between skippr:gap-2",
|
|
9971
11053
|
children: [
|
|
9972
11054
|
/* @__PURE__ */ jsx37("span", {
|
|
9973
|
-
className: "skippr:text-[12.5px] skippr:font-semibold skippr:text-[#2D2D3F]",
|
|
11055
|
+
className: "skippr:min-w-0 skippr:text-[12.5px] skippr:font-semibold skippr:text-[#2D2D3F]",
|
|
9974
11056
|
children: title
|
|
9975
11057
|
}),
|
|
9976
|
-
/* @__PURE__ */
|
|
9977
|
-
className: "skippr:text-[11px] skippr:font-semibold skippr:text-[var(--skippr-brand-deep)]",
|
|
9978
|
-
children:
|
|
9979
|
-
"step ",
|
|
9980
|
-
currentStep,
|
|
9981
|
-
" of ",
|
|
9982
|
-
total
|
|
9983
|
-
]
|
|
11058
|
+
/* @__PURE__ */ jsx37("span", {
|
|
11059
|
+
className: "skippr:shrink-0 skippr:whitespace-nowrap skippr:text-[11px] skippr:font-semibold skippr:text-[var(--skippr-brand-deep)]",
|
|
11060
|
+
children: fillPlaceholders(copy.agendaProgress, { step: currentStep, total })
|
|
9984
11061
|
})
|
|
9985
11062
|
]
|
|
9986
11063
|
}),
|
|
9987
11064
|
/* @__PURE__ */ jsx37("div", {
|
|
9988
11065
|
role: "progressbar",
|
|
9989
|
-
"aria-label":
|
|
11066
|
+
"aria-label": copy.agendaProgressLabel,
|
|
9990
11067
|
"aria-valuenow": Math.round(progressPct),
|
|
9991
11068
|
"aria-valuemin": 0,
|
|
9992
11069
|
"aria-valuemax": 100,
|
|
@@ -10018,12 +11095,12 @@ function SessionAgenda({ phases, hasStarted }) {
|
|
|
10018
11095
|
className: "skippr:size-[19px] skippr:shrink-0 skippr:rounded-full skippr:border-2 skippr:border-[#d8d3ca] skippr:bg-white"
|
|
10019
11096
|
}),
|
|
10020
11097
|
/* @__PURE__ */ jsx37("span", {
|
|
10021
|
-
className: cn("skippr:text-[12.5px]", isActive || isCompleted ? "skippr:font-semibold skippr:text-[#2D2D3F]" : "skippr:font-medium skippr:text-[#a8a49c]"),
|
|
10022
|
-
children: phase.name
|
|
11098
|
+
className: cn("skippr:min-w-0 skippr:text-[12.5px]", isActive || isCompleted ? "skippr:font-semibold skippr:text-[#2D2D3F]" : "skippr:font-medium skippr:text-[#a8a49c]"),
|
|
11099
|
+
children: phase.displayName ?? phase.name
|
|
10023
11100
|
}),
|
|
10024
11101
|
isActive && /* @__PURE__ */ jsx37("span", {
|
|
10025
|
-
className: "skippr:ml-auto skippr:text-[9.5px] skippr:font-bold skippr:uppercase skippr:tracking-[0.05em] skippr:text-[var(--skippr-brand-deep)]",
|
|
10026
|
-
children:
|
|
11102
|
+
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)]",
|
|
11103
|
+
children: copy.agendaNowBadge
|
|
10027
11104
|
})
|
|
10028
11105
|
]
|
|
10029
11106
|
}, phase.name);
|
|
@@ -10036,19 +11113,19 @@ function SessionAgenda({ phases, hasStarted }) {
|
|
|
10036
11113
|
import { jsx as jsx38 } from "react/jsx-runtime";
|
|
10037
11114
|
var SESSION_WARNING_THRESHOLD_SECS = 60;
|
|
10038
11115
|
function SessionWarningBanner({ remaining }) {
|
|
11116
|
+
const copy = useChromeCopy();
|
|
10039
11117
|
if (remaining === null || remaining <= 0 || remaining > SESSION_WARNING_THRESHOLD_SECS)
|
|
10040
11118
|
return null;
|
|
10041
11119
|
return /* @__PURE__ */ jsx38("div", {
|
|
10042
11120
|
"data-testid": "session-warning-banner",
|
|
10043
11121
|
role: "alert",
|
|
10044
11122
|
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",
|
|
10045
|
-
children:
|
|
11123
|
+
children: copy.sessionEndingSoon
|
|
10046
11124
|
});
|
|
10047
11125
|
}
|
|
10048
11126
|
|
|
10049
11127
|
// src/components/Sidebar.tsx
|
|
10050
11128
|
import { jsx as jsx39, jsxs as jsxs31, Fragment as Fragment4 } from "react/jsx-runtime";
|
|
10051
|
-
var ATTRIBUTION_PREFIX = "Powered by";
|
|
10052
11129
|
var ATTRIBUTION_BRAND = "Skippr";
|
|
10053
11130
|
var ATTRIBUTION_URL = "https://www.skippr.ai/";
|
|
10054
11131
|
var FOCUS_RING2 = "skippr:focus-visible:outline-2 skippr:focus-visible:outline-offset-2 skippr:focus-visible:outline-[var(--skippr-brand)]";
|
|
@@ -10078,7 +11155,8 @@ function Sidebar({
|
|
|
10078
11155
|
agentMode,
|
|
10079
11156
|
displayModules
|
|
10080
11157
|
} = useLiveAgent();
|
|
10081
|
-
const
|
|
11158
|
+
const copy = useChromeCopy();
|
|
11159
|
+
const internalCtx = useContext19(LiveAgentContext);
|
|
10082
11160
|
const defaultAgentId = internalCtx?.defaultAgentId ?? null;
|
|
10083
11161
|
const startDefaultSession = internalCtx?.startDefaultSession ?? (() => {});
|
|
10084
11162
|
const talkDisabled = !(internalCtx?.hasResolvedModules ?? false);
|
|
@@ -10111,14 +11189,14 @@ function Sidebar({
|
|
|
10111
11189
|
}, [setBarPos, voiceBarRef]);
|
|
10112
11190
|
const followsPanel = isFloating && isPanelOpen;
|
|
10113
11191
|
const dragFollowers = followsPanel && panelRef && controlBarRef && voiceBarRef ? [panelRef, controlBarRef, voiceBarRef] : null;
|
|
10114
|
-
const headerRef =
|
|
11192
|
+
const headerRef = useRef34(null);
|
|
10115
11193
|
const { wasDraggedRef } = useLauncherDrag(headerRef, onPanelDrop, dragFollowers, setIsDragging, isFloating);
|
|
10116
11194
|
const anchor2 = isFloating ? resolvePanelAnchor(barPos, SIDEBAR_WIDTH) : null;
|
|
10117
11195
|
const floatingStyle = anchor2 ? {
|
|
10118
11196
|
...anchor2.style,
|
|
10119
11197
|
height: panelExpanded ? anchor2.availableHeight : `min(${PANEL_MAX_HEIGHT_PX}px, ${anchor2.availableHeight})`
|
|
10120
11198
|
} : undefined;
|
|
10121
|
-
|
|
11199
|
+
useEffect39(() => {
|
|
10122
11200
|
if (!isSidebar)
|
|
10123
11201
|
return;
|
|
10124
11202
|
const prop = position === "right" ? "marginRight" : "marginLeft";
|
|
@@ -10165,7 +11243,7 @@ function Sidebar({
|
|
|
10165
11243
|
}) : usesHostAuth || isValidating || isAuthenticated ? /* @__PURE__ */ jsx39("div", {
|
|
10166
11244
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
|
|
10167
11245
|
children: /* @__PURE__ */ jsx39(LoadingDots, {
|
|
10168
|
-
label:
|
|
11246
|
+
label: copy.loading
|
|
10169
11247
|
})
|
|
10170
11248
|
}) : /* @__PURE__ */ jsx39("div", {
|
|
10171
11249
|
"data-skippr-no-drag": "",
|
|
@@ -10196,6 +11274,7 @@ function AuthenticatedContent({
|
|
|
10196
11274
|
talkDisabled,
|
|
10197
11275
|
showTalk
|
|
10198
11276
|
}) {
|
|
11277
|
+
const copy = useChromeCopy();
|
|
10199
11278
|
const inSession = isConnected || isStarting || isPaused || isPausing;
|
|
10200
11279
|
const effectiveTab = showAgenda ? activeTab : "chat";
|
|
10201
11280
|
return /* @__PURE__ */ jsxs31(Fragment4, {
|
|
@@ -10206,7 +11285,7 @@ function AuthenticatedContent({
|
|
|
10206
11285
|
children: isDisconnecting ? /* @__PURE__ */ jsx39("div", {
|
|
10207
11286
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
|
|
10208
11287
|
children: /* @__PURE__ */ jsx39(LoadingDots, {
|
|
10209
|
-
label:
|
|
11288
|
+
label: copy.endingSession
|
|
10210
11289
|
})
|
|
10211
11290
|
}) : inSession ? /* @__PURE__ */ jsx39(ConnectedBody, {
|
|
10212
11291
|
activeTab: effectiveTab,
|
|
@@ -10236,7 +11315,7 @@ function AuthenticatedContent({
|
|
|
10236
11315
|
decorative: true,
|
|
10237
11316
|
className: "skippr:size-3"
|
|
10238
11317
|
}),
|
|
10239
|
-
|
|
11318
|
+
copy.attributionPrefix,
|
|
10240
11319
|
" ",
|
|
10241
11320
|
/* @__PURE__ */ jsx39("span", {
|
|
10242
11321
|
className: "skippr:font-medium skippr:text-foreground skippr:underline skippr:underline-offset-2",
|
|
@@ -10250,7 +11329,7 @@ function AuthenticatedContent({
|
|
|
10250
11329
|
"data-skippr-no-drag": "",
|
|
10251
11330
|
className: `skippr:shrink-0 skippr:px-2${hideControls ? " skippr:pb-4 skippr:border-t skippr:border-border skippr:pt-1" : " skippr:pb-1"}`,
|
|
10252
11331
|
children: /* @__PURE__ */ jsx39(ConsentNotice, {
|
|
10253
|
-
template:
|
|
11332
|
+
template: copy.consentContinuing,
|
|
10254
11333
|
className: "skippr:whitespace-nowrap skippr:text-[10px]"
|
|
10255
11334
|
})
|
|
10256
11335
|
})
|
|
@@ -10291,11 +11370,12 @@ function IdleHistory({
|
|
|
10291
11370
|
showTalk,
|
|
10292
11371
|
error
|
|
10293
11372
|
}) {
|
|
11373
|
+
const copy = useChromeCopy();
|
|
10294
11374
|
if (history2.isLoading) {
|
|
10295
11375
|
return /* @__PURE__ */ jsx39("div", {
|
|
10296
11376
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
|
|
10297
11377
|
children: /* @__PURE__ */ jsx39(LoadingDots, {
|
|
10298
|
-
label:
|
|
11378
|
+
label: copy.loadingConversation
|
|
10299
11379
|
})
|
|
10300
11380
|
});
|
|
10301
11381
|
}
|
|
@@ -10376,7 +11456,7 @@ function ConnectedBody({
|
|
|
10376
11456
|
}
|
|
10377
11457
|
|
|
10378
11458
|
// src/components/SidebarTrigger.tsx
|
|
10379
|
-
import { useContext as
|
|
11459
|
+
import { useContext as useContext20 } from "react";
|
|
10380
11460
|
|
|
10381
11461
|
// src/components/Logo.tsx
|
|
10382
11462
|
import { jsx as jsx40, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
@@ -10429,7 +11509,8 @@ function SidebarTrigger() {
|
|
|
10429
11509
|
isStarting,
|
|
10430
11510
|
isPausing
|
|
10431
11511
|
} = useLiveAgent();
|
|
10432
|
-
const
|
|
11512
|
+
const copy = useChromeCopy();
|
|
11513
|
+
const internalCtx = useContext20(LiveAgentContext);
|
|
10433
11514
|
const launcherBottomPx = internalCtx?.launcherBottomPx ?? DEFAULT_LAUNCHER_BOTTOM_PX;
|
|
10434
11515
|
const popsDown = internalCtx?.popsDown ?? false;
|
|
10435
11516
|
const logoUrl = internalCtx?.appearance?.logoUrl ?? null;
|
|
@@ -10439,8 +11520,8 @@ function SidebarTrigger() {
|
|
|
10439
11520
|
return /* @__PURE__ */ jsx41("button", {
|
|
10440
11521
|
type: "button",
|
|
10441
11522
|
onClick: handleClick,
|
|
10442
|
-
title: isPanelOpen ?
|
|
10443
|
-
"aria-label": isPanelOpen ?
|
|
11523
|
+
title: isPanelOpen ? copy.closeChatLabel : copy.openChatLabel,
|
|
11524
|
+
"aria-label": isPanelOpen ? copy.closeChatLabel : copy.openChatLabel,
|
|
10444
11525
|
style: { bottom: triggerBottomPx(launcherBottomPx, popsDown) },
|
|
10445
11526
|
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"),
|
|
10446
11527
|
children: isPanelOpen ? /* @__PURE__ */ jsx41(ChevronDown, {
|
|
@@ -10458,13 +11539,13 @@ function SidebarTrigger() {
|
|
|
10458
11539
|
// src/components/SplashOverlay.tsx
|
|
10459
11540
|
import {
|
|
10460
11541
|
useCallback as useCallback31,
|
|
10461
|
-
useContext as
|
|
11542
|
+
useContext as useContext23,
|
|
10462
11543
|
useLayoutEffect as useLayoutEffect4,
|
|
10463
|
-
useRef as
|
|
11544
|
+
useRef as useRef36
|
|
10464
11545
|
} from "react";
|
|
10465
11546
|
|
|
10466
11547
|
// src/hooks/useSplash.ts
|
|
10467
|
-
import { useCallback as useCallback29, useContext as
|
|
11548
|
+
import { useCallback as useCallback29, useContext as useContext22, useMemo as useMemo11, useState as useState32 } from "react";
|
|
10468
11549
|
|
|
10469
11550
|
// src/lib/splashPresentation.ts
|
|
10470
11551
|
function resolveSplashSections(sections, iconUrls) {
|
|
@@ -10501,9 +11582,9 @@ function resolveSplashPresentation(splash) {
|
|
|
10501
11582
|
}
|
|
10502
11583
|
|
|
10503
11584
|
// src/hooks/useAdoptionTips.ts
|
|
10504
|
-
import { useContext as
|
|
11585
|
+
import { useContext as useContext21 } from "react";
|
|
10505
11586
|
function useAdoptionTips() {
|
|
10506
|
-
const ctx =
|
|
11587
|
+
const ctx = useContext21(LiveAgentContext);
|
|
10507
11588
|
if (!ctx) {
|
|
10508
11589
|
throw new Error("useAdoptionTips must be used within a <LiveAgent> provider");
|
|
10509
11590
|
}
|
|
@@ -10516,7 +11597,7 @@ function useAdoptionTips() {
|
|
|
10516
11597
|
|
|
10517
11598
|
// src/hooks/useSplash.ts
|
|
10518
11599
|
function useSplash(surface, onDismiss) {
|
|
10519
|
-
const ctx =
|
|
11600
|
+
const ctx = useContext22(LiveAgentContext);
|
|
10520
11601
|
if (!ctx) {
|
|
10521
11602
|
throw new Error("useSplash must be used within a <LiveAgent> provider");
|
|
10522
11603
|
}
|
|
@@ -10539,11 +11620,11 @@ function useSplash(surface, onDismiss) {
|
|
|
10539
11620
|
optOutOfSplashOverlay
|
|
10540
11621
|
} = ctx;
|
|
10541
11622
|
const isSurfaceUp = surface === SPLASH_SURFACE.Host ? splashSurfaces.applies && !isSplashDismissed : splashSurfaces[surface];
|
|
10542
|
-
const defaultModule =
|
|
11623
|
+
const defaultModule = useMemo11(() => displayModules.find((module) => module.id === defaultAgentId) ?? null, [displayModules, defaultAgentId]);
|
|
10543
11624
|
const splash = appearance?.splash ?? null;
|
|
10544
11625
|
const { micEnabled, screenEnabled, enableMic, enableScreen, releaseScreen } = splashMedia;
|
|
10545
11626
|
const toggleStartMuted = useCallback29(() => setStartMuted(!startMuted), [setStartMuted, startMuted]);
|
|
10546
|
-
const [optOutChecked, setOptOutChecked] =
|
|
11627
|
+
const [optOutChecked, setOptOutChecked] = useState32(false);
|
|
10547
11628
|
const toggleOptOut = useCallback29(() => setOptOutChecked((checked) => !checked), []);
|
|
10548
11629
|
const commitOptOut = useCallback29(() => {
|
|
10549
11630
|
if (optOutChecked)
|
|
@@ -10564,12 +11645,12 @@ function useSplash(surface, onDismiss) {
|
|
|
10564
11645
|
startAdoptionSession(goal);
|
|
10565
11646
|
}, [commitOptOut, startAdoptionSession]);
|
|
10566
11647
|
const tips = useAdoptionTips();
|
|
10567
|
-
const presentation =
|
|
11648
|
+
const presentation = useMemo11(() => resolveSplashPresentation(splash), [splash]);
|
|
10568
11649
|
const iconUrls = appearance?.splashIconUrls ?? null;
|
|
10569
|
-
const sections =
|
|
11650
|
+
const sections = useMemo11(() => resolveSplashSections(splash?.sections ?? null, iconUrls), [splash?.sections, iconUrls]);
|
|
10570
11651
|
const phases = idleHistory.phases;
|
|
10571
|
-
const lastCompletedPhase =
|
|
10572
|
-
const upcomingPhases =
|
|
11652
|
+
const lastCompletedPhase = useMemo11(() => phases.findLast((phase) => phase.status === "completed") ?? null, [phases]);
|
|
11653
|
+
const upcomingPhases = useMemo11(() => phases.filter((phase) => phase.status !== "completed"), [phases]);
|
|
10573
11654
|
if (!isSurfaceUp || !defaultModule) {
|
|
10574
11655
|
return null;
|
|
10575
11656
|
}
|
|
@@ -10650,7 +11731,7 @@ var CARD_SHELL = "skippr:flex skippr:w-full skippr:flex-col skippr:overflow-hidd
|
|
|
10650
11731
|
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)]";
|
|
10651
11732
|
|
|
10652
11733
|
// src/components/SplashMediaSection.tsx
|
|
10653
|
-
import { useCallback as useCallback30, useRef as
|
|
11734
|
+
import { useCallback as useCallback30, useRef as useRef35 } from "react";
|
|
10654
11735
|
import { jsx as jsx42, jsxs as jsxs33, Fragment as Fragment5 } from "react/jsx-runtime";
|
|
10655
11736
|
var MEDIA_TRAILING_BOX = "skippr:shrink-0 skippr:rounded-full skippr:border skippr:px-[18px] skippr:py-[7px] skippr:text-[14px]";
|
|
10656
11737
|
var MEDIA_PILL = `${MEDIA_TRAILING_BOX} skippr:cursor-pointer skippr:border-[rgba(45,45,63,0.12)] skippr:font-medium skippr:transition-colors`;
|
|
@@ -10754,7 +11835,7 @@ function SplashMediaSection({
|
|
|
10754
11835
|
toggleStartMuted,
|
|
10755
11836
|
enableScreen
|
|
10756
11837
|
}) {
|
|
10757
|
-
const micFocusPending =
|
|
11838
|
+
const micFocusPending = useRef35(false);
|
|
10758
11839
|
const focusMicToggle = useCallback30((toggle) => {
|
|
10759
11840
|
if (!toggle || !micFocusPending.current)
|
|
10760
11841
|
return;
|
|
@@ -11219,7 +12300,7 @@ function SplashPrimary({
|
|
|
11219
12300
|
children: [
|
|
11220
12301
|
/* @__PURE__ */ jsx45("span", {
|
|
11221
12302
|
className: ROW_TITLE,
|
|
11222
|
-
children: lastCompletedPhase.name
|
|
12303
|
+
children: lastCompletedPhase.displayName ?? lastCompletedPhase.name
|
|
11223
12304
|
}),
|
|
11224
12305
|
/* @__PURE__ */ jsx45("span", {
|
|
11225
12306
|
className: ROW_SUBTEXT,
|
|
@@ -11252,7 +12333,7 @@ function SplashPrimary({
|
|
|
11252
12333
|
children: [
|
|
11253
12334
|
/* @__PURE__ */ jsx45("span", {
|
|
11254
12335
|
className: `skippr:truncate ${ROW_TITLE}`,
|
|
11255
|
-
children: phase.name
|
|
12336
|
+
children: phase.displayName ?? phase.name
|
|
11256
12337
|
}),
|
|
11257
12338
|
/* @__PURE__ */ jsx45("span", {
|
|
11258
12339
|
className: ROW_SUBTEXT,
|
|
@@ -11344,7 +12425,7 @@ var CENTER_STYLE = {
|
|
|
11344
12425
|
};
|
|
11345
12426
|
var CARD_STYLE = { width: "100%" };
|
|
11346
12427
|
function SplashOverlay() {
|
|
11347
|
-
const ctx =
|
|
12428
|
+
const ctx = useContext23(LiveAgentContext);
|
|
11348
12429
|
if (!ctx) {
|
|
11349
12430
|
throw new Error("SplashOverlay must be used within a <LiveAgent> provider");
|
|
11350
12431
|
}
|
|
@@ -11357,7 +12438,7 @@ function SplashOverlay() {
|
|
|
11357
12438
|
function SplashOverlayCard({ accentColor }) {
|
|
11358
12439
|
const state = useSplash(SPLASH_SURFACE.Overlay);
|
|
11359
12440
|
const dismiss = state?.dismiss;
|
|
11360
|
-
const dialogRef =
|
|
12441
|
+
const dialogRef = useRef36(null);
|
|
11361
12442
|
const isOpen = state !== null;
|
|
11362
12443
|
useLayoutEffect4(() => {
|
|
11363
12444
|
const dialog = isOpen ? dialogRef.current : null;
|
|
@@ -11414,10 +12495,10 @@ function SplashOverlayCard({ accentColor }) {
|
|
|
11414
12495
|
}
|
|
11415
12496
|
|
|
11416
12497
|
// src/components/SplashPanel.tsx
|
|
11417
|
-
import { useContext as
|
|
12498
|
+
import { useContext as useContext24 } from "react";
|
|
11418
12499
|
import { jsx as jsx47 } from "react/jsx-runtime";
|
|
11419
12500
|
function SplashPanel() {
|
|
11420
|
-
const ctx =
|
|
12501
|
+
const ctx = useContext24(LiveAgentContext);
|
|
11421
12502
|
if (!ctx) {
|
|
11422
12503
|
throw new Error("SplashPanel must be used within a <LiveAgent> provider");
|
|
11423
12504
|
}
|
|
@@ -11451,12 +12532,12 @@ function SplashPanelCard({ dock, isPanelOpen }) {
|
|
|
11451
12532
|
}
|
|
11452
12533
|
|
|
11453
12534
|
// src/components/VoiceBar.tsx
|
|
11454
|
-
import { useContext as
|
|
12535
|
+
import { useContext as useContext28 } from "react";
|
|
11455
12536
|
|
|
11456
12537
|
// src/hooks/useBarNotifications.ts
|
|
11457
|
-
import { useContext as
|
|
12538
|
+
import { useContext as useContext25 } from "react";
|
|
11458
12539
|
function useBarNotifications() {
|
|
11459
|
-
const ctx =
|
|
12540
|
+
const ctx = useContext25(LiveAgentContext);
|
|
11460
12541
|
if (!ctx) {
|
|
11461
12542
|
throw new Error("useBarNotifications must be used within a <LiveAgent> provider");
|
|
11462
12543
|
}
|
|
@@ -11500,14 +12581,14 @@ function useBarNotifications() {
|
|
|
11500
12581
|
|
|
11501
12582
|
// src/components/VoiceBarFrame.tsx
|
|
11502
12583
|
import { useIsSpeaking, useLocalParticipant as useLocalParticipant13 } from "@livekit/components-react/hooks";
|
|
11503
|
-
import { useCallback as useCallback34, useContext as
|
|
12584
|
+
import { useCallback as useCallback34, useContext as useContext27, useEffect as useEffect48, useRef as useRef43, useState as useState39 } from "react";
|
|
11504
12585
|
|
|
11505
12586
|
// src/hooks/useKeyboardStop.ts
|
|
11506
|
-
import { useEffect as
|
|
12587
|
+
import { useEffect as useEffect40, useRef as useRef37 } from "react";
|
|
11507
12588
|
function useKeyboardStop({ enabled, onStop }) {
|
|
11508
|
-
const handler =
|
|
12589
|
+
const handler = useRef37(onStop);
|
|
11509
12590
|
handler.current = onStop;
|
|
11510
|
-
|
|
12591
|
+
useEffect40(() => {
|
|
11511
12592
|
if (!enabled)
|
|
11512
12593
|
return;
|
|
11513
12594
|
const onKeyDown = (event) => {
|
|
@@ -11524,18 +12605,18 @@ function useKeyboardStop({ enabled, onStop }) {
|
|
|
11524
12605
|
}
|
|
11525
12606
|
|
|
11526
12607
|
// src/hooks/useSessionTimer.ts
|
|
11527
|
-
import { useEffect as
|
|
12608
|
+
import { useEffect as useEffect42, useState as useState34 } from "react";
|
|
11528
12609
|
|
|
11529
12610
|
// src/hooks/useElapsedSeconds.ts
|
|
11530
|
-
import { useEffect as
|
|
12611
|
+
import { useEffect as useEffect41, useRef as useRef38, useState as useState33 } from "react";
|
|
11531
12612
|
function useElapsedSeconds(isRunning, resetSignal) {
|
|
11532
|
-
const [elapsed, setElapsed] =
|
|
11533
|
-
const accumulatedSecondsRef =
|
|
11534
|
-
|
|
12613
|
+
const [elapsed, setElapsed] = useState33(0);
|
|
12614
|
+
const accumulatedSecondsRef = useRef38(0);
|
|
12615
|
+
useEffect41(() => {
|
|
11535
12616
|
accumulatedSecondsRef.current = 0;
|
|
11536
12617
|
setElapsed(0);
|
|
11537
12618
|
}, [resetSignal]);
|
|
11538
|
-
|
|
12619
|
+
useEffect41(() => {
|
|
11539
12620
|
if (!isRunning)
|
|
11540
12621
|
return;
|
|
11541
12622
|
const resumedAt = Date.now();
|
|
@@ -11560,8 +12641,8 @@ function useSessionTimer(isRunning, resetSignal) {
|
|
|
11560
12641
|
const active = isRunning && remaining !== null;
|
|
11561
12642
|
const warning = active && remaining !== null && remaining <= SESSION_TIMER_WARNING_S;
|
|
11562
12643
|
const revealCycle = !active ? null : warning ? "warning" : "normal";
|
|
11563
|
-
const [revealed, setRevealed] =
|
|
11564
|
-
|
|
12644
|
+
const [revealed, setRevealed] = useState34(false);
|
|
12645
|
+
useEffect42(() => {
|
|
11565
12646
|
if (!revealCycle) {
|
|
11566
12647
|
setRevealed(false);
|
|
11567
12648
|
return;
|
|
@@ -11589,18 +12670,18 @@ function useSessionTimer(isRunning, resetSignal) {
|
|
|
11589
12670
|
}
|
|
11590
12671
|
|
|
11591
12672
|
// src/hooks/useVoiceBarDrag.ts
|
|
11592
|
-
import { useEffect as
|
|
12673
|
+
import { useEffect as useEffect43, useRef as useRef39 } from "react";
|
|
11593
12674
|
import { flushSync as flushSync2 } from "react-dom";
|
|
11594
12675
|
var DRAG_THRESHOLD_PX2 = 5;
|
|
11595
12676
|
function useVoiceBarDrag(containerRef, onDrop, followRefs, reportDragging) {
|
|
11596
|
-
const wasDraggedRef =
|
|
11597
|
-
const onDropRef =
|
|
12677
|
+
const wasDraggedRef = useRef39(false);
|
|
12678
|
+
const onDropRef = useRef39(onDrop);
|
|
11598
12679
|
onDropRef.current = onDrop;
|
|
11599
|
-
const followTargetsRef =
|
|
12680
|
+
const followTargetsRef = useRef39(followRefs);
|
|
11600
12681
|
followTargetsRef.current = followRefs;
|
|
11601
|
-
const reportDraggingRef =
|
|
12682
|
+
const reportDraggingRef = useRef39(reportDragging);
|
|
11602
12683
|
reportDraggingRef.current = reportDragging;
|
|
11603
|
-
|
|
12684
|
+
useEffect43(() => {
|
|
11604
12685
|
const el = containerRef.current;
|
|
11605
12686
|
if (!el)
|
|
11606
12687
|
return;
|
|
@@ -11750,7 +12831,7 @@ function useVoiceBarDrag(containerRef, onDrop, followRefs, reportDragging) {
|
|
|
11750
12831
|
}
|
|
11751
12832
|
|
|
11752
12833
|
// src/components/VoiceBarChatLine.tsx
|
|
11753
|
-
import { useCallback as useCallback32, useContext as
|
|
12834
|
+
import { useCallback as useCallback32, useContext as useContext26, useEffect as useEffect44, useRef as useRef40, useState as useState35 } from "react";
|
|
11754
12835
|
import { jsx as jsx48, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
11755
12836
|
var IDLE_HIDE_MS = 6000;
|
|
11756
12837
|
function VoiceBarChatLine({
|
|
@@ -11760,21 +12841,22 @@ function VoiceBarChatLine({
|
|
|
11760
12841
|
embedded = false
|
|
11761
12842
|
}) {
|
|
11762
12843
|
const { sendChatMessage, isSendingChat } = useChatMessages();
|
|
11763
|
-
const ctx =
|
|
12844
|
+
const ctx = useContext26(LiveAgentContext);
|
|
12845
|
+
const copy = useChromeCopy();
|
|
11764
12846
|
const reportChatActivity = ctx?.reportChatActivity;
|
|
11765
|
-
const [localDraft, setLocalDraft] =
|
|
12847
|
+
const [localDraft, setLocalDraft] = useState35("");
|
|
11766
12848
|
const text = ctx?.chatDraft ?? localDraft;
|
|
11767
12849
|
const setText = ctx?.setChatDraft ?? setLocalDraft;
|
|
11768
|
-
const inputRef =
|
|
11769
|
-
const idleTimerRef =
|
|
11770
|
-
const onCloseRef =
|
|
12850
|
+
const inputRef = useRef40(null);
|
|
12851
|
+
const idleTimerRef = useRef40(null);
|
|
12852
|
+
const onCloseRef = useRef40(onClose);
|
|
11771
12853
|
onCloseRef.current = onClose;
|
|
11772
12854
|
const armIdle = useCallback32(() => {
|
|
11773
12855
|
if (idleTimerRef.current)
|
|
11774
12856
|
clearTimeout(idleTimerRef.current);
|
|
11775
12857
|
idleTimerRef.current = setTimeout(() => onCloseRef.current(), IDLE_HIDE_MS);
|
|
11776
12858
|
}, []);
|
|
11777
|
-
|
|
12859
|
+
useEffect44(() => {
|
|
11778
12860
|
inputRef.current?.focus();
|
|
11779
12861
|
armIdle();
|
|
11780
12862
|
return () => {
|
|
@@ -11819,8 +12901,8 @@ function VoiceBarChatLine({
|
|
|
11819
12901
|
submit();
|
|
11820
12902
|
}
|
|
11821
12903
|
},
|
|
11822
|
-
placeholder:
|
|
11823
|
-
"aria-label":
|
|
12904
|
+
placeholder: copy.chatMessagePlaceholder,
|
|
12905
|
+
"aria-label": copy.chatMessageLabel,
|
|
11824
12906
|
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]"
|
|
11825
12907
|
}),
|
|
11826
12908
|
/* @__PURE__ */ jsx48("button", {
|
|
@@ -11831,7 +12913,7 @@ function VoiceBarChatLine({
|
|
|
11831
12913
|
background: hasText ? "var(--skippr-brand, #2bc0ae)" : "#cdd8d5",
|
|
11832
12914
|
color: "var(--skippr-brand-foreground, #2d2b3d)"
|
|
11833
12915
|
},
|
|
11834
|
-
"aria-label":
|
|
12916
|
+
"aria-label": copy.chatSendLabel,
|
|
11835
12917
|
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",
|
|
11836
12918
|
children: /* @__PURE__ */ jsx48(Send, {
|
|
11837
12919
|
className: "skippr:size-[15px]",
|
|
@@ -11843,20 +12925,21 @@ function VoiceBarChatLine({
|
|
|
11843
12925
|
}
|
|
11844
12926
|
|
|
11845
12927
|
// src/components/VoiceBarLinkCard.tsx
|
|
11846
|
-
import { useCallback as useCallback33, useEffect as
|
|
12928
|
+
import { useCallback as useCallback33, useEffect as useEffect45, useRef as useRef41, useState as useState36 } from "react";
|
|
11847
12929
|
import { jsx as jsx49, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
11848
12930
|
var COPIED_RESET_MS2 = 2000;
|
|
11849
12931
|
var DISMISS_AFTER_COPY_MS2 = 3000;
|
|
11850
12932
|
function VoiceBarLinkCard({ card, onDismiss }) {
|
|
11851
|
-
const [copied, setCopied] =
|
|
11852
|
-
const
|
|
11853
|
-
|
|
12933
|
+
const [copied, setCopied] = useState36(false);
|
|
12934
|
+
const copy = useChromeCopy();
|
|
12935
|
+
const dismissTimerRef = useRef41(null);
|
|
12936
|
+
useEffect45(() => {
|
|
11854
12937
|
if (!copied)
|
|
11855
12938
|
return;
|
|
11856
12939
|
const timer = setTimeout(() => setCopied(false), COPIED_RESET_MS2);
|
|
11857
12940
|
return () => clearTimeout(timer);
|
|
11858
12941
|
}, [copied]);
|
|
11859
|
-
|
|
12942
|
+
useEffect45(() => {
|
|
11860
12943
|
return () => {
|
|
11861
12944
|
if (dismissTimerRef.current)
|
|
11862
12945
|
clearTimeout(dismissTimerRef.current);
|
|
@@ -11875,7 +12958,7 @@ function VoiceBarLinkCard({ card, onDismiss }) {
|
|
|
11875
12958
|
/* @__PURE__ */ jsx49("button", {
|
|
11876
12959
|
type: "button",
|
|
11877
12960
|
onClick: onDismiss,
|
|
11878
|
-
"aria-label":
|
|
12961
|
+
"aria-label": copy.cardDismissLink,
|
|
11879
12962
|
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]",
|
|
11880
12963
|
children: /* @__PURE__ */ jsx49(X, {
|
|
11881
12964
|
className: "skippr:size-[12px]",
|
|
@@ -11902,13 +12985,13 @@ function VoiceBarLinkCard({ card, onDismiss }) {
|
|
|
11902
12985
|
className: "skippr:size-[11px]",
|
|
11903
12986
|
strokeWidth: 2.5
|
|
11904
12987
|
}),
|
|
11905
|
-
|
|
12988
|
+
copy.voiceBarCardOpen
|
|
11906
12989
|
]
|
|
11907
12990
|
}),
|
|
11908
12991
|
/* @__PURE__ */ jsxs38("button", {
|
|
11909
12992
|
type: "button",
|
|
11910
12993
|
onClick: handleCopy,
|
|
11911
|
-
"aria-label":
|
|
12994
|
+
"aria-label": copy.cardCopyLink,
|
|
11912
12995
|
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]",
|
|
11913
12996
|
children: [
|
|
11914
12997
|
copied ? /* @__PURE__ */ jsx49(Check, {
|
|
@@ -11918,7 +13001,7 @@ function VoiceBarLinkCard({ card, onDismiss }) {
|
|
|
11918
13001
|
className: "skippr:size-[11px]",
|
|
11919
13002
|
strokeWidth: 2.5
|
|
11920
13003
|
}),
|
|
11921
|
-
copied ?
|
|
13004
|
+
copied ? copy.voiceBarCardCopied : copy.voiceBarCardCopy
|
|
11922
13005
|
]
|
|
11923
13006
|
})
|
|
11924
13007
|
]
|
|
@@ -11930,13 +13013,14 @@ function VoiceBarLinkCard({ card, onDismiss }) {
|
|
|
11930
13013
|
}
|
|
11931
13014
|
|
|
11932
13015
|
// src/components/VoiceBarNotification.tsx
|
|
11933
|
-
import { useEffect as
|
|
13016
|
+
import { useEffect as useEffect46, useRef as useRef42, useState as useState37 } from "react";
|
|
11934
13017
|
import { jsx as jsx50, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
11935
13018
|
function VoiceBarNotification({ notifications, pos, onDismiss }) {
|
|
11936
|
-
const
|
|
11937
|
-
const [
|
|
11938
|
-
const
|
|
11939
|
-
|
|
13019
|
+
const copy = useChromeCopy();
|
|
13020
|
+
const [index2, setIndex] = useState37(0);
|
|
13021
|
+
const [paused, setPaused] = useState37(false);
|
|
13022
|
+
const cardRef = useRef42(null);
|
|
13023
|
+
useEffect46(() => {
|
|
11940
13024
|
const el = cardRef.current;
|
|
11941
13025
|
if (!el)
|
|
11942
13026
|
return;
|
|
@@ -11949,7 +13033,7 @@ function VoiceBarNotification({ notifications, pos, onDismiss }) {
|
|
|
11949
13033
|
el.removeEventListener("mouseleave", leave);
|
|
11950
13034
|
};
|
|
11951
13035
|
}, []);
|
|
11952
|
-
|
|
13036
|
+
useEffect46(() => {
|
|
11953
13037
|
if (paused)
|
|
11954
13038
|
return;
|
|
11955
13039
|
const rotate = setInterval(() => setIndex((current) => (current + 1) % notifications.length), TIP_ROTATE_MS);
|
|
@@ -11997,13 +13081,13 @@ function VoiceBarNotification({ notifications, pos, onDismiss }) {
|
|
|
11997
13081
|
onDismiss();
|
|
11998
13082
|
},
|
|
11999
13083
|
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]",
|
|
12000
|
-
children:
|
|
13084
|
+
children: copy.voiceBarTipStart
|
|
12001
13085
|
}),
|
|
12002
13086
|
hasMultiple && /* @__PURE__ */ jsxs39("button", {
|
|
12003
13087
|
type: "button",
|
|
12004
13088
|
onClick: () => setIndex((current) => (current + 1) % notifications.length),
|
|
12005
|
-
"aria-label":
|
|
12006
|
-
title:
|
|
13089
|
+
"aria-label": copy.tipNextLabel,
|
|
13090
|
+
title: copy.tipNextLabel,
|
|
12007
13091
|
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]",
|
|
12008
13092
|
children: [
|
|
12009
13093
|
safeIndex + 1,
|
|
@@ -12021,7 +13105,7 @@ function VoiceBarNotification({ notifications, pos, onDismiss }) {
|
|
|
12021
13105
|
}
|
|
12022
13106
|
|
|
12023
13107
|
// src/components/VoiceBarPlanCard.tsx
|
|
12024
|
-
import { useEffect as
|
|
13108
|
+
import { useEffect as useEffect47, useState as useState38 } from "react";
|
|
12025
13109
|
import { jsx as jsx51, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
12026
13110
|
var APPROVING_RESET_MS2 = 8000;
|
|
12027
13111
|
function StepIndicator({ step }) {
|
|
@@ -12055,9 +13139,10 @@ function VoiceBarPlanCard({
|
|
|
12055
13139
|
onDismiss,
|
|
12056
13140
|
embedded = false
|
|
12057
13141
|
}) {
|
|
13142
|
+
const copy = useChromeCopy();
|
|
12058
13143
|
const awaitingApproval = plan.state === "proposed";
|
|
12059
|
-
const [isApproving, setIsApproving] =
|
|
12060
|
-
const [lastPlanId, setLastPlanId] =
|
|
13144
|
+
const [isApproving, setIsApproving] = useState38(false);
|
|
13145
|
+
const [lastPlanId, setLastPlanId] = useState38(plan.planId);
|
|
12061
13146
|
if (plan.planId !== lastPlanId) {
|
|
12062
13147
|
setLastPlanId(plan.planId);
|
|
12063
13148
|
setIsApproving(false);
|
|
@@ -12072,13 +13157,13 @@ function VoiceBarPlanCard({
|
|
|
12072
13157
|
const cancel = () => {
|
|
12073
13158
|
sendChatMessage(CANCEL_MESSAGE).catch((e) => console.warn("[Skippr] plan reply failed", e));
|
|
12074
13159
|
};
|
|
12075
|
-
|
|
13160
|
+
useEffect47(() => {
|
|
12076
13161
|
if (!isApproving)
|
|
12077
13162
|
return;
|
|
12078
13163
|
const timer = setTimeout(() => setIsApproving(false), APPROVING_RESET_MS2);
|
|
12079
13164
|
return () => clearTimeout(timer);
|
|
12080
13165
|
}, [isApproving]);
|
|
12081
|
-
|
|
13166
|
+
useEffect47(() => {
|
|
12082
13167
|
if (plan.state !== "completed")
|
|
12083
13168
|
return;
|
|
12084
13169
|
const timer = setTimeout(onDismiss, COMPLETED_CARD_VISIBLE_MS);
|
|
@@ -12092,12 +13177,12 @@ function VoiceBarPlanCard({
|
|
|
12092
13177
|
children: [
|
|
12093
13178
|
/* @__PURE__ */ jsx51("span", {
|
|
12094
13179
|
className: "skippr:text-[11px] skippr:font-semibold skippr:tracking-[-0.01em] skippr:text-[#2D2D3F]",
|
|
12095
|
-
children:
|
|
13180
|
+
children: copy.planTitle
|
|
12096
13181
|
}),
|
|
12097
13182
|
/* @__PURE__ */ jsx51("button", {
|
|
12098
13183
|
type: "button",
|
|
12099
13184
|
onClick: onDismiss,
|
|
12100
|
-
"aria-label":
|
|
13185
|
+
"aria-label": copy.cardDismissPlan,
|
|
12101
13186
|
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]",
|
|
12102
13187
|
children: /* @__PURE__ */ jsx51(X, {
|
|
12103
13188
|
className: "skippr:size-[12px]",
|
|
@@ -12111,14 +13196,11 @@ function VoiceBarPlanCard({
|
|
|
12111
13196
|
children: [
|
|
12112
13197
|
/* @__PURE__ */ jsx51("p", {
|
|
12113
13198
|
className: "skippr:text-[11.5px] skippr:font-semibold skippr:tracking-[-0.01em] skippr:text-[#2D2D3F]",
|
|
12114
|
-
children:
|
|
13199
|
+
children: copy.voiceBarPlanIntro
|
|
12115
13200
|
}),
|
|
12116
|
-
awaitingApproval && /* @__PURE__ */
|
|
13201
|
+
awaitingApproval && /* @__PURE__ */ jsx51("p", {
|
|
12117
13202
|
className: "skippr:mt-[1px] skippr:text-[10px] skippr:text-[#8b877f]",
|
|
12118
|
-
children:
|
|
12119
|
-
plan.steps.length,
|
|
12120
|
-
" steps · review and approve to run"
|
|
12121
|
-
]
|
|
13203
|
+
children: fillPlaceholders(copy.voiceBarPlanStepsHint, { count: plan.steps.length })
|
|
12122
13204
|
}),
|
|
12123
13205
|
/* @__PURE__ */ jsx51("div", {
|
|
12124
13206
|
className: "skippr:mt-[8px] skippr:max-h-[132px] skippr:space-y-[6px] skippr:overflow-y-auto skippr:overscroll-contain",
|
|
@@ -12149,7 +13231,7 @@ function VoiceBarPlanCard({
|
|
|
12149
13231
|
isApproving && /* @__PURE__ */ jsx51("span", {
|
|
12150
13232
|
className: "skippr:size-[10px] skippr:shrink-0 skippr:animate-spin skippr:rounded-full skippr:border-2 skippr:border-white/30 skippr:border-t-white"
|
|
12151
13233
|
}),
|
|
12152
|
-
isApproving ?
|
|
13234
|
+
isApproving ? copy.voiceBarPlanApproving : copy.voiceBarPlanApprove
|
|
12153
13235
|
]
|
|
12154
13236
|
}),
|
|
12155
13237
|
/* @__PURE__ */ jsx51("button", {
|
|
@@ -12157,7 +13239,7 @@ function VoiceBarPlanCard({
|
|
|
12157
13239
|
disabled: isApproving,
|
|
12158
13240
|
onClick: cancel,
|
|
12159
13241
|
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",
|
|
12160
|
-
children:
|
|
13242
|
+
children: copy.voiceBarPlanCancel
|
|
12161
13243
|
})
|
|
12162
13244
|
]
|
|
12163
13245
|
}) : /* @__PURE__ */ jsxs40("span", {
|
|
@@ -12168,7 +13250,7 @@ function VoiceBarPlanCard({
|
|
|
12168
13250
|
className: "skippr:size-[11px]",
|
|
12169
13251
|
strokeWidth: 3
|
|
12170
13252
|
}),
|
|
12171
|
-
|
|
13253
|
+
copy.voiceBarPlanApproved
|
|
12172
13254
|
]
|
|
12173
13255
|
})
|
|
12174
13256
|
})
|
|
@@ -12290,9 +13372,10 @@ function ShortcutHint({
|
|
|
12290
13372
|
suppressed,
|
|
12291
13373
|
children
|
|
12292
13374
|
}) {
|
|
12293
|
-
const ref =
|
|
12294
|
-
const [visible, setVisible] =
|
|
12295
|
-
|
|
13375
|
+
const ref = useRef43(null);
|
|
13376
|
+
const [visible, setVisible] = useState39(false);
|
|
13377
|
+
const copy = useChromeCopy();
|
|
13378
|
+
useEffect48(() => {
|
|
12296
13379
|
if (!enabled)
|
|
12297
13380
|
return;
|
|
12298
13381
|
const el = ref.current;
|
|
@@ -12339,7 +13422,7 @@ function ShortcutHint({
|
|
|
12339
13422
|
}),
|
|
12340
13423
|
/* @__PURE__ */ jsx52("span", {
|
|
12341
13424
|
className: "skippr:text-[10.5px] skippr:font-medium skippr:text-[#8b877f]",
|
|
12342
|
-
children:
|
|
13425
|
+
children: copy.voiceBarShortcutTalk
|
|
12343
13426
|
}),
|
|
12344
13427
|
/* @__PURE__ */ jsx52("span", {
|
|
12345
13428
|
className: "skippr:text-[10px] skippr:text-[#cbc7bf]",
|
|
@@ -12362,7 +13445,7 @@ function ShortcutHint({
|
|
|
12362
13445
|
}),
|
|
12363
13446
|
/* @__PURE__ */ jsx52("span", {
|
|
12364
13447
|
className: "skippr:text-[10.5px] skippr:font-medium skippr:text-[#8b877f]",
|
|
12365
|
-
children:
|
|
13448
|
+
children: copy.voiceBarShortcutEnd
|
|
12366
13449
|
}),
|
|
12367
13450
|
/* @__PURE__ */ jsx52("span", {
|
|
12368
13451
|
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"
|
|
@@ -12380,7 +13463,7 @@ function VoiceBarFrame({
|
|
|
12380
13463
|
onDrop,
|
|
12381
13464
|
setDragging
|
|
12382
13465
|
}) {
|
|
12383
|
-
const ctx =
|
|
13466
|
+
const ctx = useContext27(LiveAgentContext);
|
|
12384
13467
|
if (!ctx) {
|
|
12385
13468
|
throw new Error("VoiceBarFrame must be used within a <LiveAgent> provider");
|
|
12386
13469
|
}
|
|
@@ -12399,6 +13482,7 @@ function VoiceBarFrame({
|
|
|
12399
13482
|
minimizePanel,
|
|
12400
13483
|
togglePanel,
|
|
12401
13484
|
openPanel,
|
|
13485
|
+
setSidebarTab,
|
|
12402
13486
|
agentControls,
|
|
12403
13487
|
appearance,
|
|
12404
13488
|
isPanelOpen,
|
|
@@ -12417,24 +13501,25 @@ function VoiceBarFrame({
|
|
|
12417
13501
|
const needsLogin = !usesHostAuth && !isAuthenticated;
|
|
12418
13502
|
const transientError = useTransientError(error, errorSeq);
|
|
12419
13503
|
const authFailedCopy = authFailed ? resolveAuthFailedCopy(locale) : null;
|
|
12420
|
-
const [loginOpen, setLoginOpen] =
|
|
12421
|
-
|
|
13504
|
+
const [loginOpen, setLoginOpen] = useState39(false);
|
|
13505
|
+
useEffect48(() => {
|
|
12422
13506
|
if (!needsLogin)
|
|
12423
13507
|
setLoginOpen(false);
|
|
12424
13508
|
}, [needsLogin]);
|
|
12425
|
-
const [bannerOpen, setBannerOpen] =
|
|
13509
|
+
const [bannerOpen, setBannerOpen] = useState39(false);
|
|
12426
13510
|
const hasNotifications = notifications.length > 0;
|
|
12427
13511
|
const notifAccent = notifications[0]?.accentColor;
|
|
12428
13512
|
const closeBanner = useCallback34(() => setBannerOpen(false), []);
|
|
12429
|
-
const containerRef =
|
|
13513
|
+
const containerRef = useRef43(null);
|
|
12430
13514
|
const setContainerRefs = useCallback34((node) => {
|
|
12431
13515
|
containerRef.current = node;
|
|
12432
13516
|
voiceBarRef.current = node;
|
|
12433
13517
|
}, [voiceBarRef]);
|
|
12434
13518
|
const dragFollowers = isPanelOpen ? [panelRef] : null;
|
|
12435
|
-
const barWidthRef =
|
|
13519
|
+
const barWidthRef = useRef43(VOICE_BAR_WIDTH_PX);
|
|
12436
13520
|
const dropAtBarWidth = useCallback34((next) => onDrop(next, barWidthRef.current), [onDrop]);
|
|
12437
13521
|
const { wasDraggedRef } = useVoiceBarDrag(containerRef, dropAtBarWidth, dragFollowers, setDragging);
|
|
13522
|
+
const copy = useChromeCopy();
|
|
12438
13523
|
const { isMuted, toggleMute } = useMediaControls();
|
|
12439
13524
|
const { localParticipant } = useLocalParticipant13();
|
|
12440
13525
|
const isUserSpeaking = useIsSpeaking(localParticipant);
|
|
@@ -12445,9 +13530,9 @@ function VoiceBarFrame({
|
|
|
12445
13530
|
const plan = usePlanUpdates();
|
|
12446
13531
|
const linkCard = useLinkCard();
|
|
12447
13532
|
const { sendChatMessage } = useChatMessages();
|
|
12448
|
-
const [dismissedFloatingPlanId, setDismissedFloatingPlanId] =
|
|
12449
|
-
const [dismissedBlockPlanId, setDismissedBlockPlanId] =
|
|
12450
|
-
const [dismissedLinkCardId, setDismissedLinkCardId] =
|
|
13533
|
+
const [dismissedFloatingPlanId, setDismissedFloatingPlanId] = useState39(null);
|
|
13534
|
+
const [dismissedBlockPlanId, setDismissedBlockPlanId] = useState39(null);
|
|
13535
|
+
const [dismissedLinkCardId, setDismissedLinkCardId] = useState39(null);
|
|
12451
13536
|
const micMode = agentControls?.micMode;
|
|
12452
13537
|
const pushOrTap = isRequestResponseMicMode(micMode);
|
|
12453
13538
|
const isPushToTalk = micMode === MIC_MODE.PushToTalk;
|
|
@@ -12456,9 +13541,9 @@ function VoiceBarFrame({
|
|
|
12456
13541
|
const showActionControl = isConnected && captureMode === CAPTURE_MODE.Auto && actionsActive;
|
|
12457
13542
|
const chatSurface = agentControls?.chat ?? DEFAULT_CHAT_SURFACE;
|
|
12458
13543
|
const isRoomChat = chatSurface === CHAT_SURFACE.Room;
|
|
12459
|
-
const [chatLineOpen, setChatLineOpen] =
|
|
12460
|
-
const [chatLineMounted, setChatLineMounted] =
|
|
12461
|
-
const [chatLineClosing, setChatLineClosing] =
|
|
13544
|
+
const [chatLineOpen, setChatLineOpen] = useState39(false);
|
|
13545
|
+
const [chatLineMounted, setChatLineMounted] = useState39(false);
|
|
13546
|
+
const [chatLineClosing, setChatLineClosing] = useState39(false);
|
|
12462
13547
|
const chatOpen = isRoomChat ? isPanelOpen : chatLineOpen;
|
|
12463
13548
|
const lineBlockOpen = !isRoomChat && chatLineMounted;
|
|
12464
13549
|
const toggleChat = () => {
|
|
@@ -12468,7 +13553,7 @@ function VoiceBarFrame({
|
|
|
12468
13553
|
setChatLineOpen((open) => !open);
|
|
12469
13554
|
}
|
|
12470
13555
|
};
|
|
12471
|
-
|
|
13556
|
+
useEffect48(() => {
|
|
12472
13557
|
if (chatLineOpen) {
|
|
12473
13558
|
setChatLineMounted(true);
|
|
12474
13559
|
setChatLineClosing(false);
|
|
@@ -12497,7 +13582,7 @@ function VoiceBarFrame({
|
|
|
12497
13582
|
const showLivePill = !isLoading && isConnected && !textMode && !pushOrTap;
|
|
12498
13583
|
const barWidthPx = !showLivePill ? VOICE_BAR_WIDTH_PX : isHeld ? 120 : 156;
|
|
12499
13584
|
barWidthRef.current = barWidthPx;
|
|
12500
|
-
|
|
13585
|
+
useEffect48(() => {
|
|
12501
13586
|
const inBounds = clampBarPos(pos, barWidthPx);
|
|
12502
13587
|
if (inBounds.x !== pos.x)
|
|
12503
13588
|
onDrop(inBounds, barWidthPx);
|
|
@@ -12516,24 +13601,24 @@ function VoiceBarFrame({
|
|
|
12516
13601
|
}
|
|
12517
13602
|
};
|
|
12518
13603
|
useKeyboardStop({ enabled: sessionLive && !isPausing && !isLoading, onStop: closeBar });
|
|
12519
|
-
const hintSeenRef =
|
|
13604
|
+
const hintSeenRef = useRef43(false);
|
|
12520
13605
|
const requestPillBg = isCapturingSpeech ? "var(--skippr-brand-active)" : "var(--skippr-brand, #2bc0ae)";
|
|
12521
|
-
const agentStateLabel = state === "thinking" ?
|
|
12522
|
-
const idleRequestLabel = isPushToTalk ?
|
|
12523
|
-
const requestLabel = agentStateLabel ?? (isCapturingSpeech ?
|
|
13606
|
+
const agentStateLabel = state === "thinking" ? copy.voiceBarThinking : state === "speaking" ? copy.voiceBarTalking : null;
|
|
13607
|
+
const idleRequestLabel = isPushToTalk ? copy.voiceBarPushToTalk : copy.voiceBarTapToTalk;
|
|
13608
|
+
const requestLabel = agentStateLabel ?? (isCapturingSpeech ? copy.voiceBarListening : idleRequestLabel);
|
|
12524
13609
|
const livePillBg = agentActive && !isHeld ? "var(--skippr-brand-active)" : "var(--skippr-brand, #2bc0ae)";
|
|
12525
13610
|
const glow = isConnected && !isHeld && agentActive;
|
|
12526
|
-
const [autoOffClosing, setAutoOffClosing] =
|
|
13611
|
+
const [autoOffClosing, setAutoOffClosing] = useState39(false);
|
|
12527
13612
|
const { reportActivity } = useIdleAutoOff({
|
|
12528
13613
|
enabled: isConnected && !autoOffClosing,
|
|
12529
13614
|
active: agentActive || isCapturingSpeech || isUserSpeaking,
|
|
12530
13615
|
onExpire: () => setAutoOffClosing(true)
|
|
12531
13616
|
});
|
|
12532
|
-
|
|
13617
|
+
useEffect48(() => {
|
|
12533
13618
|
if (chatActivityAt)
|
|
12534
13619
|
reportActivity();
|
|
12535
13620
|
}, [chatActivityAt, reportActivity]);
|
|
12536
|
-
|
|
13621
|
+
useEffect48(() => {
|
|
12537
13622
|
if (!autoOffClosing)
|
|
12538
13623
|
return;
|
|
12539
13624
|
if (!isConnected) {
|
|
@@ -12549,20 +13634,29 @@ function VoiceBarFrame({
|
|
|
12549
13634
|
const floatingPlanActive = planEnabled && !isRoomChat && !lineBlockOpen && activePlan.planId !== dismissedFloatingPlanId;
|
|
12550
13635
|
const planInLineBlock = planEnabled && lineBlockOpen && activePlan.planId !== dismissedBlockPlanId;
|
|
12551
13636
|
const planCardActive = floatingPlanActive || planInLineBlock;
|
|
12552
|
-
|
|
13637
|
+
useEffect48(() => {
|
|
12553
13638
|
if (lineBlockOpen)
|
|
12554
13639
|
setDismissedBlockPlanId(null);
|
|
12555
13640
|
}, [lineBlockOpen]);
|
|
12556
|
-
const [autoOpenedPlanId, setAutoOpenedPlanId] =
|
|
12557
|
-
|
|
13641
|
+
const [autoOpenedPlanId, setAutoOpenedPlanId] = useState39(null);
|
|
13642
|
+
useEffect48(() => {
|
|
12558
13643
|
if (!isRoomChat || !planEnabled || !activePlan)
|
|
12559
13644
|
return;
|
|
12560
13645
|
if (activePlan.planId === autoOpenedPlanId)
|
|
12561
13646
|
return;
|
|
12562
13647
|
setAutoOpenedPlanId(activePlan.planId);
|
|
13648
|
+
setSidebarTab("chat");
|
|
12563
13649
|
if (!isPanelOpen)
|
|
12564
13650
|
openPanel();
|
|
12565
|
-
}, [
|
|
13651
|
+
}, [
|
|
13652
|
+
isRoomChat,
|
|
13653
|
+
planEnabled,
|
|
13654
|
+
activePlan,
|
|
13655
|
+
autoOpenedPlanId,
|
|
13656
|
+
isPanelOpen,
|
|
13657
|
+
openPanel,
|
|
13658
|
+
setSidebarTab
|
|
13659
|
+
]);
|
|
12566
13660
|
const visibleLinkCard = linkCard && linkCard.cardId !== dismissedLinkCardId ? linkCard : null;
|
|
12567
13661
|
const linkCardActive = !!visibleLinkCard && isConnected && !planCardActive && !(isRoomChat && chatOpen) && !isCapturingSpeech && !isHeld && !autoOffClosing;
|
|
12568
13662
|
const bannerActive = hasNotifications && bannerOpen;
|
|
@@ -12573,7 +13667,7 @@ function VoiceBarFrame({
|
|
|
12573
13667
|
const showTimerStrip = !slotClaimed && !autoOffClosing && !isCapturingSpeech && !planCardActive && !showLiveStrip && !isHeld && !!sessionTimer;
|
|
12574
13668
|
const showAutoOffStrip = !slotClaimed && autoOffClosing;
|
|
12575
13669
|
const hintSuppressed = slotClaimed || isCapturingSpeech || planCardActive || showLiveStrip || isHeld || showTimerStrip || showAutoOffStrip;
|
|
12576
|
-
const liveStripLabel = showActionControl ?
|
|
13670
|
+
const liveStripLabel = showActionControl ? copy.voiceBarWorking : copy.voiceBarThinking;
|
|
12577
13671
|
const popsDown = barPopsDown(pos);
|
|
12578
13672
|
const isLeftAligned = barLeftAligned(pos);
|
|
12579
13673
|
const stripStyle = {
|
|
@@ -12672,7 +13766,7 @@ function VoiceBarFrame({
|
|
|
12672
13766
|
}),
|
|
12673
13767
|
/* @__PURE__ */ jsx52("span", {
|
|
12674
13768
|
className: "skippr:whitespace-nowrap skippr:text-[12px] skippr:font-semibold skippr:tracking-[-0.01em] skippr:text-[#5a5650]",
|
|
12675
|
-
children:
|
|
13769
|
+
children: copy.voiceBarNoActivity
|
|
12676
13770
|
})
|
|
12677
13771
|
]
|
|
12678
13772
|
})
|
|
@@ -12732,14 +13826,14 @@ function VoiceBarFrame({
|
|
|
12732
13826
|
className: "skippr:text-[11px] skippr:leading-[1.2] skippr:text-destructive skippr:text-center",
|
|
12733
13827
|
children: modulesError || transientError
|
|
12734
13828
|
}) : /* @__PURE__ */ jsx52(ConsentNotice, {
|
|
12735
|
-
template:
|
|
13829
|
+
template: copy.consentSessionStart
|
|
12736
13830
|
})
|
|
12737
13831
|
})
|
|
12738
13832
|
}),
|
|
12739
13833
|
hasNotifications && !bannerOpen && !chatOpen && !isCapturingSpeech && !planCardActive && /* @__PURE__ */ jsx52("button", {
|
|
12740
13834
|
type: "button",
|
|
12741
13835
|
onClick: ifNotDragged(() => setBannerOpen(true)),
|
|
12742
|
-
"aria-label":
|
|
13836
|
+
"aria-label": copy.showNotificationsLabel,
|
|
12743
13837
|
style: {
|
|
12744
13838
|
background: notifAccent,
|
|
12745
13839
|
"--skippr-pulse-color": notifAccent
|
|
@@ -12758,7 +13852,7 @@ function VoiceBarFrame({
|
|
|
12758
13852
|
type: "button",
|
|
12759
13853
|
onClick: ifNotDragged(closeBar),
|
|
12760
13854
|
disabled: isPausing || isLoading,
|
|
12761
|
-
"aria-label": sessionLive ?
|
|
13855
|
+
"aria-label": sessionLive ? copy.endSessionLabel : copy.closeLabel,
|
|
12762
13856
|
className: cn(EDGE_BUTTON, "skippr:relative skippr:size-[26px]", isLoading && "skippr:cursor-not-allowed skippr:opacity-40 skippr:hover:bg-transparent"),
|
|
12763
13857
|
children: [
|
|
12764
13858
|
isPausing && /* @__PURE__ */ jsx52(BusyRing, {
|
|
@@ -12778,7 +13872,7 @@ function VoiceBarFrame({
|
|
|
12778
13872
|
}),
|
|
12779
13873
|
/* @__PURE__ */ jsx52("span", {
|
|
12780
13874
|
className: "skippr:whitespace-nowrap skippr:text-[12.5px] skippr:font-semibold skippr:text-[#5a5650]",
|
|
12781
|
-
children:
|
|
13875
|
+
children: copy.voiceBarLoading
|
|
12782
13876
|
}),
|
|
12783
13877
|
/* @__PURE__ */ jsxs41("span", {
|
|
12784
13878
|
className: "skippr:flex skippr:items-end skippr:gap-[3px]",
|
|
@@ -12834,7 +13928,7 @@ function VoiceBarFrame({
|
|
|
12834
13928
|
!isHeld && /* @__PURE__ */ jsx52("button", {
|
|
12835
13929
|
type: "button",
|
|
12836
13930
|
onClick: ifNotDragged(() => void toggleMute()),
|
|
12837
|
-
"aria-label": isMuted ?
|
|
13931
|
+
"aria-label": isMuted ? copy.unmuteLabel : copy.muteLabel,
|
|
12838
13932
|
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",
|
|
12839
13933
|
children: /* @__PURE__ */ jsx52(MicLevelGlyph, {
|
|
12840
13934
|
muted: isMuted
|
|
@@ -12843,7 +13937,7 @@ function VoiceBarFrame({
|
|
|
12843
13937
|
/* @__PURE__ */ jsx52("button", {
|
|
12844
13938
|
type: "button",
|
|
12845
13939
|
onClick: ifNotDragged(togglePause),
|
|
12846
|
-
"aria-label": isHeld ?
|
|
13940
|
+
"aria-label": isHeld ? copy.resumeLabel : copy.stopLabel,
|
|
12847
13941
|
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"),
|
|
12848
13942
|
children: isHeld ? /* @__PURE__ */ jsx52(Play, {
|
|
12849
13943
|
className: "skippr:size-[13px]",
|
|
@@ -12864,7 +13958,7 @@ function VoiceBarFrame({
|
|
|
12864
13958
|
className: "skippr:size-[15px] skippr:text-[#8b877f]",
|
|
12865
13959
|
strokeWidth: 2
|
|
12866
13960
|
}),
|
|
12867
|
-
|
|
13961
|
+
copy.voiceBarTextMode
|
|
12868
13962
|
]
|
|
12869
13963
|
}),
|
|
12870
13964
|
!sessionLive && /* @__PURE__ */ jsxs41("button", {
|
|
@@ -12878,7 +13972,7 @@ function VoiceBarFrame({
|
|
|
12878
13972
|
}
|
|
12879
13973
|
}),
|
|
12880
13974
|
disabled: !canStart && !needsLogin,
|
|
12881
|
-
"aria-label":
|
|
13975
|
+
"aria-label": copy.voiceBarTalkToAgent,
|
|
12882
13976
|
style: { color: "var(--skippr-brand-foreground, #2d2b3d)" },
|
|
12883
13977
|
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"),
|
|
12884
13978
|
children: [
|
|
@@ -12892,14 +13986,14 @@ function VoiceBarFrame({
|
|
|
12892
13986
|
className: "skippr:block skippr:size-full skippr:bg-launcher"
|
|
12893
13987
|
})
|
|
12894
13988
|
}),
|
|
12895
|
-
|
|
13989
|
+
copy.voiceBarTalkToAgent
|
|
12896
13990
|
]
|
|
12897
13991
|
}),
|
|
12898
13992
|
(sessionLive || isRoomChat) && /* @__PURE__ */ jsx52("button", {
|
|
12899
13993
|
type: "button",
|
|
12900
13994
|
onClick: ifNotDragged(toggleChat),
|
|
12901
13995
|
disabled: isLoading,
|
|
12902
|
-
"aria-label":
|
|
13996
|
+
"aria-label": copy.openChatLabel,
|
|
12903
13997
|
className: cn(EDGE_BUTTON, "skippr:size-[30px]", isLoading && "skippr:cursor-not-allowed skippr:opacity-40 skippr:hover:bg-transparent"),
|
|
12904
13998
|
children: /* @__PURE__ */ jsx52(MessageSquare, {
|
|
12905
13999
|
className: "skippr:size-[18px]",
|
|
@@ -12936,10 +14030,10 @@ function VoiceBarFrame({
|
|
|
12936
14030
|
}
|
|
12937
14031
|
|
|
12938
14032
|
// src/components/VoiceBarLauncher.tsx
|
|
12939
|
-
import { useCallback as useCallback35, useEffect as
|
|
14033
|
+
import { useCallback as useCallback35, useEffect as useEffect50, useRef as useRef45, useState as useState41 } from "react";
|
|
12940
14034
|
|
|
12941
14035
|
// src/components/LauncherNotification.tsx
|
|
12942
|
-
import { useEffect as
|
|
14036
|
+
import { useEffect as useEffect49, useRef as useRef44, useState as useState40 } from "react";
|
|
12943
14037
|
import { jsx as jsx53, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
12944
14038
|
function LauncherNotification({
|
|
12945
14039
|
notifications,
|
|
@@ -12947,10 +14041,11 @@ function LauncherNotification({
|
|
|
12947
14041
|
mode,
|
|
12948
14042
|
onDismiss
|
|
12949
14043
|
}) {
|
|
12950
|
-
const
|
|
12951
|
-
const [
|
|
12952
|
-
const
|
|
12953
|
-
|
|
14044
|
+
const copy = useChromeCopy();
|
|
14045
|
+
const [index2, setIndex] = useState40(0);
|
|
14046
|
+
const [paused, setPaused] = useState40(false);
|
|
14047
|
+
const cardRef = useRef44(null);
|
|
14048
|
+
useEffect49(() => {
|
|
12954
14049
|
const el = cardRef.current;
|
|
12955
14050
|
if (!el)
|
|
12956
14051
|
return;
|
|
@@ -12963,7 +14058,7 @@ function LauncherNotification({
|
|
|
12963
14058
|
el.removeEventListener("mouseleave", leave);
|
|
12964
14059
|
};
|
|
12965
14060
|
}, []);
|
|
12966
|
-
|
|
14061
|
+
useEffect49(() => {
|
|
12967
14062
|
if (paused)
|
|
12968
14063
|
return;
|
|
12969
14064
|
const rotate = setInterval(() => setIndex((current) => (current + 1) % notifications.length), TIP_ROTATE_MS);
|
|
@@ -13012,8 +14107,8 @@ function LauncherNotification({
|
|
|
13012
14107
|
notification.activate();
|
|
13013
14108
|
onDismiss();
|
|
13014
14109
|
},
|
|
13015
|
-
"aria-label":
|
|
13016
|
-
title:
|
|
14110
|
+
"aria-label": copy.tipStartLabel,
|
|
14111
|
+
title: copy.tipStartLabel,
|
|
13017
14112
|
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]",
|
|
13018
14113
|
children: /* @__PURE__ */ jsx53(Play, {
|
|
13019
14114
|
className: "skippr:size-[8px] skippr:fill-current",
|
|
@@ -13023,8 +14118,8 @@ function LauncherNotification({
|
|
|
13023
14118
|
hasMultiple && /* @__PURE__ */ jsx53("button", {
|
|
13024
14119
|
type: "button",
|
|
13025
14120
|
onClick: () => setIndex((current) => (current + 1) % notifications.length),
|
|
13026
|
-
"aria-label":
|
|
13027
|
-
title:
|
|
14121
|
+
"aria-label": copy.tipNextLabel,
|
|
14122
|
+
title: copy.tipNextLabel,
|
|
13028
14123
|
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]",
|
|
13029
14124
|
children: /* @__PURE__ */ jsx53(ChevronRight, {
|
|
13030
14125
|
className: "skippr:size-[12px]",
|
|
@@ -13123,6 +14218,7 @@ function LauncherChat({
|
|
|
13123
14218
|
onClick
|
|
13124
14219
|
}) {
|
|
13125
14220
|
const vertical = isHorizontalEdge(edge);
|
|
14221
|
+
const copy = useChromeCopy();
|
|
13126
14222
|
return /* @__PURE__ */ jsxs43("div", {
|
|
13127
14223
|
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]),
|
|
13128
14224
|
style: {
|
|
@@ -13134,7 +14230,7 @@ function LauncherChat({
|
|
|
13134
14230
|
/* @__PURE__ */ jsx54("button", {
|
|
13135
14231
|
type: "button",
|
|
13136
14232
|
onClick,
|
|
13137
|
-
"aria-label":
|
|
14233
|
+
"aria-label": copy.openChatLabel,
|
|
13138
14234
|
tabIndex: revealed ? 0 : -1,
|
|
13139
14235
|
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",
|
|
13140
14236
|
children: /* @__PURE__ */ jsx54(MessageSquare, {
|
|
@@ -13177,8 +14273,9 @@ function VoiceBarLauncher({
|
|
|
13177
14273
|
onDrop,
|
|
13178
14274
|
setDragging
|
|
13179
14275
|
}) {
|
|
13180
|
-
const
|
|
13181
|
-
const
|
|
14276
|
+
const copy = useChromeCopy();
|
|
14277
|
+
const containerRef = useRef45(null);
|
|
14278
|
+
const closeTimerRef = useRef45(null);
|
|
13182
14279
|
const onDropPos = useCallback35((pos) => {
|
|
13183
14280
|
const el = containerRef.current;
|
|
13184
14281
|
if (!el)
|
|
@@ -13188,16 +14285,16 @@ function VoiceBarLauncher({
|
|
|
13188
14285
|
}, [onDrop]);
|
|
13189
14286
|
const { wasDraggedRef } = useVoiceBarDrag(containerRef, onDropPos, null, setDragging);
|
|
13190
14287
|
const horizontal = isHorizontalEdge(dock.edge);
|
|
13191
|
-
const [cardOpen, setCardOpen] =
|
|
13192
|
-
const [loginOpen, setLoginOpen] =
|
|
13193
|
-
const [hovered, setHovered] =
|
|
13194
|
-
|
|
14288
|
+
const [cardOpen, setCardOpen] = useState41(false);
|
|
14289
|
+
const [loginOpen, setLoginOpen] = useState41(false);
|
|
14290
|
+
const [hovered, setHovered] = useState41(false);
|
|
14291
|
+
useEffect50(() => {
|
|
13195
14292
|
if (!needsLogin)
|
|
13196
14293
|
setLoginOpen(false);
|
|
13197
14294
|
}, [needsLogin]);
|
|
13198
14295
|
const hasNotif = notifications.length > 0;
|
|
13199
14296
|
const dotColor = notifications.find((item) => item.kind === NOTIFICATION_KIND.Module)?.accentColor ?? notifications[0]?.accentColor ?? NOTIF_ACCENT_COLOR;
|
|
13200
|
-
|
|
14297
|
+
useEffect50(() => {
|
|
13201
14298
|
const el = containerRef.current;
|
|
13202
14299
|
if (!el)
|
|
13203
14300
|
return;
|
|
@@ -13279,7 +14376,7 @@ function VoiceBarLauncher({
|
|
|
13279
14376
|
/* @__PURE__ */ jsx54("button", {
|
|
13280
14377
|
type: "button",
|
|
13281
14378
|
onClick: open,
|
|
13282
|
-
"aria-label":
|
|
14379
|
+
"aria-label": copy.openAgentLabel,
|
|
13283
14380
|
className: STRIP_ICON_BUTTON,
|
|
13284
14381
|
children: /* @__PURE__ */ jsx54(Play, {
|
|
13285
14382
|
className: "skippr:size-[13px] skippr:fill-current",
|
|
@@ -13292,7 +14389,7 @@ function VoiceBarLauncher({
|
|
|
13292
14389
|
/* @__PURE__ */ jsx54("button", {
|
|
13293
14390
|
type: "button",
|
|
13294
14391
|
onClick: openChat,
|
|
13295
|
-
"aria-label":
|
|
14392
|
+
"aria-label": copy.openChatLabel,
|
|
13296
14393
|
className: STRIP_ICON_BUTTON,
|
|
13297
14394
|
children: /* @__PURE__ */ jsx54(MessageSquare, {
|
|
13298
14395
|
className: "skippr:size-[14px]",
|
|
@@ -13303,14 +14400,14 @@ function VoiceBarLauncher({
|
|
|
13303
14400
|
}) : /* @__PURE__ */ jsx54("button", {
|
|
13304
14401
|
type: "button",
|
|
13305
14402
|
onClick: open,
|
|
13306
|
-
"aria-label":
|
|
14403
|
+
"aria-label": copy.openAgentLabel,
|
|
13307
14404
|
className: "skippr:absolute skippr:inset-0 skippr:cursor-grab skippr:bg-transparent skippr:p-0"
|
|
13308
14405
|
})
|
|
13309
14406
|
}),
|
|
13310
14407
|
hasNotif && (expanded ? /* @__PURE__ */ jsx54("button", {
|
|
13311
14408
|
type: "button",
|
|
13312
14409
|
onClick: toggleCard,
|
|
13313
|
-
"aria-label":
|
|
14410
|
+
"aria-label": copy.showNotificationsLabel,
|
|
13314
14411
|
style: {
|
|
13315
14412
|
background: dotColor,
|
|
13316
14413
|
"--skippr-pulse-color": dotColor
|
|
@@ -13319,7 +14416,7 @@ function VoiceBarLauncher({
|
|
|
13319
14416
|
}) : /* @__PURE__ */ jsx54("button", {
|
|
13320
14417
|
type: "button",
|
|
13321
14418
|
onClick: toggleCard,
|
|
13322
|
-
"aria-label":
|
|
14419
|
+
"aria-label": copy.showNotificationsLabel,
|
|
13323
14420
|
style: {
|
|
13324
14421
|
background: dotColor,
|
|
13325
14422
|
"--skippr-pulse-color": dotColor
|
|
@@ -13353,7 +14450,7 @@ function VoiceBarLauncher({
|
|
|
13353
14450
|
/* @__PURE__ */ jsx54("button", {
|
|
13354
14451
|
type: "button",
|
|
13355
14452
|
onClick: open,
|
|
13356
|
-
"aria-label":
|
|
14453
|
+
"aria-label": copy.openAgentLabel,
|
|
13357
14454
|
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",
|
|
13358
14455
|
children: logoUrl ? /* @__PURE__ */ jsx54("img", {
|
|
13359
14456
|
src: logoUrl,
|
|
@@ -13369,7 +14466,7 @@ function VoiceBarLauncher({
|
|
|
13369
14466
|
hasNotif && /* @__PURE__ */ jsx54("button", {
|
|
13370
14467
|
type: "button",
|
|
13371
14468
|
onClick: toggleCard,
|
|
13372
|
-
"aria-label":
|
|
14469
|
+
"aria-label": copy.showNotificationsLabel,
|
|
13373
14470
|
style: {
|
|
13374
14471
|
background: dotColor,
|
|
13375
14472
|
"--skippr-pulse-color": dotColor,
|
|
@@ -13391,7 +14488,7 @@ function VoiceBarLauncher({
|
|
|
13391
14488
|
// src/components/VoiceBar.tsx
|
|
13392
14489
|
import { jsx as jsx55 } from "react/jsx-runtime";
|
|
13393
14490
|
function VoiceBar({ revealed }) {
|
|
13394
|
-
const ctx =
|
|
14491
|
+
const ctx = useContext28(LiveAgentContext);
|
|
13395
14492
|
if (!ctx) {
|
|
13396
14493
|
throw new Error("VoiceBar must be used within a <LiveAgent> provider");
|
|
13397
14494
|
}
|
|
@@ -13481,14 +14578,15 @@ function AgentCursorMount({ animated }) {
|
|
|
13481
14578
|
}
|
|
13482
14579
|
function PlanPanelOpener() {
|
|
13483
14580
|
const plan = usePlanUpdates();
|
|
13484
|
-
const { expandPanel } = useLiveAgent();
|
|
13485
|
-
const surfacedPlanIdRef =
|
|
13486
|
-
|
|
14581
|
+
const { expandPanel, setSidebarTab } = useLiveAgent();
|
|
14582
|
+
const surfacedPlanIdRef = useRef46(null);
|
|
14583
|
+
useEffect51(() => {
|
|
13487
14584
|
if (plan?.state !== "proposed" || surfacedPlanIdRef.current === plan.planId)
|
|
13488
14585
|
return;
|
|
13489
14586
|
surfacedPlanIdRef.current = plan.planId;
|
|
14587
|
+
setSidebarTab("chat");
|
|
13490
14588
|
expandPanel();
|
|
13491
|
-
}, [plan?.planId, plan?.state, expandPanel]);
|
|
14589
|
+
}, [plan?.planId, plan?.state, expandPanel, setSidebarTab]);
|
|
13492
14590
|
return null;
|
|
13493
14591
|
}
|
|
13494
14592
|
function LiveAgent(props) {
|
|
@@ -13525,9 +14623,9 @@ function LiveAgent(props) {
|
|
|
13525
14623
|
const auth = useAuth({ appKey, locale });
|
|
13526
14624
|
const usesHostAuth = !!getUserToken || !!userToken || !!authTokenProp;
|
|
13527
14625
|
const effectiveAuthToken = usesHostAuth ? authTokenProp : auth.authToken ?? undefined;
|
|
13528
|
-
const [activeModule, setActiveModule] =
|
|
13529
|
-
const [sessionAgentMode, setSessionAgentMode] =
|
|
13530
|
-
const [isExchanging, setIsExchanging] =
|
|
14626
|
+
const [activeModule, setActiveModule] = useState42(null);
|
|
14627
|
+
const [sessionAgentMode, setSessionAgentMode] = useState42(null);
|
|
14628
|
+
const [isExchanging, setIsExchanging] = useState42(false);
|
|
13531
14629
|
const minimizeOnSessionStart = useCallback36(() => {
|
|
13532
14630
|
if (minimizable) {
|
|
13533
14631
|
setIsMinimized(true);
|
|
@@ -13539,7 +14637,7 @@ function LiveAgent(props) {
|
|
|
13539
14637
|
setIsMinimized(false);
|
|
13540
14638
|
setIsPanelOpen(true);
|
|
13541
14639
|
}, []);
|
|
13542
|
-
const isExchangeDisconnectingRef =
|
|
14640
|
+
const isExchangeDisconnectingRef = useRef46(false);
|
|
13543
14641
|
const minimizeOnSessionDisconnect = useCallback36(() => {
|
|
13544
14642
|
if (isExchangeDisconnectingRef.current)
|
|
13545
14643
|
return;
|
|
@@ -13564,6 +14662,7 @@ function LiveAgent(props) {
|
|
|
13564
14662
|
disconnect,
|
|
13565
14663
|
isPaused,
|
|
13566
14664
|
pauseTimeoutSeconds,
|
|
14665
|
+
sessionAgenda,
|
|
13567
14666
|
historyMessages,
|
|
13568
14667
|
pendingScreenStream,
|
|
13569
14668
|
armScreenStream,
|
|
@@ -13590,32 +14689,32 @@ function LiveAgent(props) {
|
|
|
13590
14689
|
isDisconnecting,
|
|
13591
14690
|
isExchanging
|
|
13592
14691
|
});
|
|
13593
|
-
const isRoomReleasedRef =
|
|
14692
|
+
const isRoomReleasedRef = useRef46(false);
|
|
13594
14693
|
isRoomReleasedRef.current = !isConnected || isPausing || isDisconnecting;
|
|
13595
14694
|
const handleRoomDisconnected = useCallback36(() => {
|
|
13596
14695
|
if (isExchangeDisconnectingRef.current || isRoomReleasedRef.current)
|
|
13597
14696
|
return;
|
|
13598
14697
|
disconnect();
|
|
13599
14698
|
}, [disconnect]);
|
|
13600
|
-
const [isPanelOpen, setIsPanelOpen] =
|
|
13601
|
-
const [panelEntry, setPanelEntry] =
|
|
13602
|
-
const [isMinimized, setIsMinimized] =
|
|
13603
|
-
const [pendingStart, setPendingStart] =
|
|
13604
|
-
const [sidebarTab, setSidebarTab] =
|
|
13605
|
-
const [phasesSnapshot, setPhasesSnapshot] =
|
|
13606
|
-
const [startMuted, setStartMuted] =
|
|
13607
|
-
const [textMode, setTextMode] =
|
|
13608
|
-
const [panelExpanded, setPanelExpanded] =
|
|
14699
|
+
const [isPanelOpen, setIsPanelOpen] = useState42(defaultOpen);
|
|
14700
|
+
const [panelEntry, setPanelEntry] = useState42(PANEL_ENTRY.Launcher);
|
|
14701
|
+
const [isMinimized, setIsMinimized] = useState42(minimizable && !defaultOpen);
|
|
14702
|
+
const [pendingStart, setPendingStart] = useState42(null);
|
|
14703
|
+
const [sidebarTab, setSidebarTab] = useState42("agenda");
|
|
14704
|
+
const [phasesSnapshot, setPhasesSnapshot] = useState42([]);
|
|
14705
|
+
const [startMuted, setStartMuted] = useState42(false);
|
|
14706
|
+
const [textMode, setTextMode] = useState42(false);
|
|
14707
|
+
const [panelExpanded, setPanelExpanded] = useState42(false);
|
|
13609
14708
|
const togglePanelExpanded = useCallback36(() => setPanelExpanded((prev) => !prev), []);
|
|
13610
|
-
const panelRef =
|
|
13611
|
-
const controlBarRef =
|
|
13612
|
-
const voiceBarRef =
|
|
13613
|
-
const [isDragging, setIsDragging] =
|
|
14709
|
+
const panelRef = useRef46(null);
|
|
14710
|
+
const controlBarRef = useRef46(null);
|
|
14711
|
+
const voiceBarRef = useRef46(null);
|
|
14712
|
+
const [isDragging, setIsDragging] = useState42(false);
|
|
13614
14713
|
const setTextModeState = useCallback36((enabled) => {
|
|
13615
14714
|
setTextMode(enabled);
|
|
13616
14715
|
}, []);
|
|
13617
14716
|
const showControlBar = isConnected || isStarting || isPausing;
|
|
13618
|
-
|
|
14717
|
+
useEffect51(() => {
|
|
13619
14718
|
if (!isConnected)
|
|
13620
14719
|
setTextModeState(false);
|
|
13621
14720
|
}, [isConnected, setTextModeState]);
|
|
@@ -13668,7 +14767,7 @@ function LiveAgent(props) {
|
|
|
13668
14767
|
const agentMode = sessionAgentMode ?? operatingModule?.mode ?? null;
|
|
13669
14768
|
const shouldAnimateCursor = operatingModule?.uiPreferences?.animateCursor ?? animateAgentCursor;
|
|
13670
14769
|
const buddyDefaultMissing = buddyActive && hasResolvedModules && !modulesError && !defaultModule && !isSessionLive;
|
|
13671
|
-
const resumableSession =
|
|
14770
|
+
const resumableSession = useMemo12(() => getResumableSession(operatingModule), [operatingModule]);
|
|
13672
14771
|
const resumeSession = useCallback36(async () => {
|
|
13673
14772
|
if (!resumableSession)
|
|
13674
14773
|
return;
|
|
@@ -13732,11 +14831,11 @@ function LiveAgent(props) {
|
|
|
13732
14831
|
setPendingStart(pending);
|
|
13733
14832
|
setIsMinimized(false);
|
|
13734
14833
|
}, []);
|
|
13735
|
-
const [welcomeDismissed, setWelcomeDismissed] =
|
|
14834
|
+
const [welcomeDismissed, setWelcomeDismissed] = useState42(false);
|
|
13736
14835
|
const dismissWelcome = useCallback36(() => setWelcomeDismissed(true), []);
|
|
13737
|
-
const [savedPosition] =
|
|
13738
|
-
const [currentPosition, setCurrentPosition] =
|
|
13739
|
-
const positionLockedRef =
|
|
14836
|
+
const [savedPosition] = useState42(readSavedPosition);
|
|
14837
|
+
const [currentPosition, setCurrentPosition] = useState42(savedPosition ?? "right");
|
|
14838
|
+
const positionLockedRef = useRef46(savedPosition !== null);
|
|
13740
14839
|
const setPositionWithPersist = useCallback36((pos) => {
|
|
13741
14840
|
positionLockedRef.current = true;
|
|
13742
14841
|
setCurrentPosition(pos);
|
|
@@ -13745,18 +14844,18 @@ function LiveAgent(props) {
|
|
|
13745
14844
|
} catch {}
|
|
13746
14845
|
}, []);
|
|
13747
14846
|
const serverPosition = appearance?.position ?? null;
|
|
13748
|
-
|
|
14847
|
+
useEffect51(() => {
|
|
13749
14848
|
if (!serverPosition || positionLockedRef.current)
|
|
13750
14849
|
return;
|
|
13751
14850
|
setCurrentPosition(serverPosition);
|
|
13752
14851
|
}, [serverPosition]);
|
|
13753
|
-
const [savedLauncherBottom] =
|
|
13754
|
-
const hasDraggedRef =
|
|
13755
|
-
const verticalAlignRef =
|
|
13756
|
-
const [launcherBottomPx, setLauncherBottomPxState] =
|
|
13757
|
-
const [popsDown, setPopsDown] =
|
|
14852
|
+
const [savedLauncherBottom] = useState42(readSavedLauncherBottom);
|
|
14853
|
+
const hasDraggedRef = useRef46(savedLauncherBottom !== null);
|
|
14854
|
+
const verticalAlignRef = useRef46(hostVerticalAlign ?? "bottom");
|
|
14855
|
+
const [launcherBottomPx, setLauncherBottomPxState] = useState42(() => savedLauncherBottom !== null ? clampLauncherBottom(savedLauncherBottom) : verticalAlignToBottomPx(verticalAlignRef.current));
|
|
14856
|
+
const [popsDown, setPopsDown] = useState42(() => launcherPopsDown(launcherBottomPx));
|
|
13758
14857
|
const serverVerticalAlign = appearance?.verticalAlign ?? null;
|
|
13759
|
-
|
|
14858
|
+
useEffect51(() => {
|
|
13760
14859
|
if (!serverVerticalAlign || hostVerticalAlign !== undefined || hasDraggedRef.current)
|
|
13761
14860
|
return;
|
|
13762
14861
|
verticalAlignRef.current = serverVerticalAlign;
|
|
@@ -13772,28 +14871,28 @@ function LiveAgent(props) {
|
|
|
13772
14871
|
localStorage.setItem("skippr_widget_bottom", String(px));
|
|
13773
14872
|
} catch {}
|
|
13774
14873
|
}, []);
|
|
13775
|
-
const launcherBottomPxRef =
|
|
14874
|
+
const launcherBottomPxRef = useRef46(launcherBottomPx);
|
|
13776
14875
|
launcherBottomPxRef.current = launcherBottomPx;
|
|
13777
|
-
const [chatActivityAt, setChatActivityAt] =
|
|
14876
|
+
const [chatActivityAt, setChatActivityAt] = useState42(0);
|
|
13778
14877
|
const reportChatActivity = useCallback36(() => {
|
|
13779
14878
|
const now = Date.now();
|
|
13780
14879
|
setChatActivityAt((last) => now - last < CHAT_ACTIVITY_THROTTLE_MS ? last : now);
|
|
13781
14880
|
}, []);
|
|
13782
|
-
const [chatDraft, setChatDraft] =
|
|
13783
|
-
const [autoStartAfterLogin, setAutoStartAfterLogin] =
|
|
14881
|
+
const [chatDraft, setChatDraft] = useState42("");
|
|
14882
|
+
const [autoStartAfterLogin, setAutoStartAfterLogin] = useState42(false);
|
|
13784
14883
|
const commitLauncherDrop = useCallback36(({ side, bottomPx }) => {
|
|
13785
14884
|
setPositionWithPersist(side);
|
|
13786
14885
|
setLauncherBottomPx(bottomPx);
|
|
13787
14886
|
}, [setPositionWithPersist, setLauncherBottomPx]);
|
|
13788
|
-
const [barPos, setBarPosState] =
|
|
13789
|
-
const barPosRatioRef =
|
|
14887
|
+
const [barPos, setBarPosState] = useState42(() => readSavedBarPos());
|
|
14888
|
+
const barPosRatioRef = useRef46(barPos === null ? null : barPosRatio(barPos));
|
|
13790
14889
|
const setBarPos = useCallback36((next, widthPx) => {
|
|
13791
14890
|
const placed = clampBarPos(next, widthPx);
|
|
13792
14891
|
setBarPosState(placed);
|
|
13793
14892
|
persistBarPos(placed);
|
|
13794
14893
|
barPosRatioRef.current = barPosRatio(placed);
|
|
13795
14894
|
}, []);
|
|
13796
|
-
const [savedLauncherDock, setSavedLauncherDock] =
|
|
14895
|
+
const [savedLauncherDock, setSavedLauncherDock] = useState42(() => readSavedDock("launcher"));
|
|
13797
14896
|
const setLauncherDock = useCallback36((next) => {
|
|
13798
14897
|
setSavedLauncherDock(next);
|
|
13799
14898
|
persistDock("launcher", next);
|
|
@@ -13803,7 +14902,7 @@ function LiveAgent(props) {
|
|
|
13803
14902
|
edge: launcherEdge,
|
|
13804
14903
|
offsetPx: defaultOffset(launcherEdge)
|
|
13805
14904
|
};
|
|
13806
|
-
|
|
14905
|
+
useEffect51(() => {
|
|
13807
14906
|
const syncToViewport = () => {
|
|
13808
14907
|
const next = hasDraggedRef.current ? clampLauncherBottom(launcherBottomPxRef.current) : verticalAlignToBottomPx(verticalAlignRef.current);
|
|
13809
14908
|
setLauncherBottomPxState(next);
|
|
@@ -13813,7 +14912,7 @@ function LiveAgent(props) {
|
|
|
13813
14912
|
window.addEventListener("resize", syncToViewport);
|
|
13814
14913
|
return () => window.removeEventListener("resize", syncToViewport);
|
|
13815
14914
|
}, []);
|
|
13816
|
-
|
|
14915
|
+
useEffect51(() => {
|
|
13817
14916
|
const syncBarToViewport = () => {
|
|
13818
14917
|
const ratios = barPosRatioRef.current;
|
|
13819
14918
|
const measured = voiceBarRef.current?.getBoundingClientRect().width;
|
|
@@ -13896,7 +14995,7 @@ function LiveAgent(props) {
|
|
|
13896
14995
|
bearerToken,
|
|
13897
14996
|
selectModule
|
|
13898
14997
|
});
|
|
13899
|
-
|
|
14998
|
+
useEffect51(() => {
|
|
13900
14999
|
if (!autoStartAfterLogin)
|
|
13901
15000
|
return;
|
|
13902
15001
|
if (bearerToken === null || !hasResolvedModules || isSessionLive)
|
|
@@ -13922,14 +15021,16 @@ function LiveAgent(props) {
|
|
|
13922
15021
|
} = useSessionHistory({
|
|
13923
15022
|
agentId: defaultAgentId ?? undefined,
|
|
13924
15023
|
enabled: idleHistoryEnabled,
|
|
13925
|
-
authedFetch
|
|
15024
|
+
authedFetch,
|
|
15025
|
+
locale
|
|
13926
15026
|
});
|
|
13927
|
-
const idleHistory =
|
|
15027
|
+
const idleHistory = useMemo12(() => ({
|
|
13928
15028
|
messages: idleHistoryMessages,
|
|
13929
15029
|
phases: idleHistoryPhases,
|
|
13930
15030
|
isLoading: isLoadingHistory
|
|
13931
15031
|
}), [idleHistoryMessages, idleHistoryPhases, isLoadingHistory]);
|
|
13932
|
-
const
|
|
15032
|
+
const phaseLabels = usePhaseLabels(sessionAgenda, { agentId: defaultAgentId, phases: idleHistoryPhases }, locale);
|
|
15033
|
+
const [pageSplashDismissed, setPageSplashDismissed] = useState42(false);
|
|
13933
15034
|
const dismissSplash = useCallback36((surface) => {
|
|
13934
15035
|
if (surface !== SPLASH_SURFACE.Panel) {
|
|
13935
15036
|
setPageSplashDismissed(true);
|
|
@@ -13940,7 +15041,7 @@ function LiveAgent(props) {
|
|
|
13940
15041
|
}, [closePanel, minimizePanel]);
|
|
13941
15042
|
const reopenSplash = useCallback36(() => setPageSplashDismissed(false), []);
|
|
13942
15043
|
const { optedOut: splashOverlayOptedOut, optOut: optOutOfSplashOverlay } = useSplashOverlayOptOut(authedFetch, splashOverlayOptedOutForUser);
|
|
13943
|
-
const configuredSplashSurfaces =
|
|
15044
|
+
const configuredSplashSurfaces = useMemo12(() => resolveSplashSurfaces({
|
|
13944
15045
|
splash: appearance?.splash ?? null,
|
|
13945
15046
|
defaultAgentControls: defaultModule?.controls ?? null,
|
|
13946
15047
|
isRoomChat: (agentControls?.chat ?? DEFAULT_CHAT_SURFACE) === CHAT_SURFACE.Room,
|
|
@@ -13957,7 +15058,7 @@ function LiveAgent(props) {
|
|
|
13957
15058
|
isSessionLive,
|
|
13958
15059
|
splashOverlayOptedOut
|
|
13959
15060
|
]);
|
|
13960
|
-
const splashSurfaces =
|
|
15061
|
+
const splashSurfaces = useMemo12(() => visibleSplashSurfaces(configuredSplashSurfaces, {
|
|
13961
15062
|
pageDismissed: pageSplashDismissed,
|
|
13962
15063
|
panelEntry
|
|
13963
15064
|
}), [configuredSplashSurfaces, pageSplashDismissed, panelEntry]);
|
|
@@ -13967,7 +15068,7 @@ function LiveAgent(props) {
|
|
|
13967
15068
|
isSplashVisible: splashSurfaces.overlay || splashSurfaces.panel || splashSurfaces.applies && !pageSplashDismissed,
|
|
13968
15069
|
isSessionLive
|
|
13969
15070
|
});
|
|
13970
|
-
|
|
15071
|
+
useEffect51(() => {
|
|
13971
15072
|
const open = () => {
|
|
13972
15073
|
reopenSplash();
|
|
13973
15074
|
if (configuredSplashSurfaces.overlay)
|
|
@@ -13980,7 +15081,7 @@ function LiveAgent(props) {
|
|
|
13980
15081
|
window.addEventListener(SKIPPR_OPEN_EVENT, open);
|
|
13981
15082
|
return () => window.removeEventListener(SKIPPR_OPEN_EVENT, open);
|
|
13982
15083
|
}, [configuredSplashSurfaces, reopenSplash, expandPanel, revealBar]);
|
|
13983
|
-
const ctx =
|
|
15084
|
+
const ctx = useMemo12(() => ({
|
|
13984
15085
|
connection,
|
|
13985
15086
|
shouldConnect,
|
|
13986
15087
|
isConnected,
|
|
@@ -14002,6 +15103,7 @@ function LiveAgent(props) {
|
|
|
14002
15103
|
idleHistory,
|
|
14003
15104
|
phasesSnapshot,
|
|
14004
15105
|
setPhasesSnapshot,
|
|
15106
|
+
phaseLabels,
|
|
14005
15107
|
isPanelOpen,
|
|
14006
15108
|
openPanel,
|
|
14007
15109
|
closePanel,
|
|
@@ -14106,6 +15208,7 @@ function LiveAgent(props) {
|
|
|
14106
15208
|
historyMessages,
|
|
14107
15209
|
idleHistory,
|
|
14108
15210
|
phasesSnapshot,
|
|
15211
|
+
phaseLabels,
|
|
14109
15212
|
isPanelOpen,
|
|
14110
15213
|
openPanel,
|
|
14111
15214
|
closePanel,
|
|
@@ -14274,18 +15377,18 @@ function LiveAgent(props) {
|
|
|
14274
15377
|
});
|
|
14275
15378
|
}
|
|
14276
15379
|
// src/components/SplashScreen.tsx
|
|
14277
|
-
import { useContext as
|
|
15380
|
+
import { useContext as useContext29, useEffect as useEffect52, useRef as useRef47 } from "react";
|
|
14278
15381
|
import { jsx as jsx57 } from "react/jsx-runtime";
|
|
14279
15382
|
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.";
|
|
14280
15383
|
function SplashScreen({ className, onDismiss }) {
|
|
14281
|
-
const ctx =
|
|
15384
|
+
const ctx = useContext29(LiveAgentContext);
|
|
14282
15385
|
if (!ctx) {
|
|
14283
15386
|
throw new Error("SplashScreen must be used within a <LiveAgent> provider");
|
|
14284
15387
|
}
|
|
14285
|
-
const disabledWarnedRef =
|
|
15388
|
+
const disabledWarnedRef = useRef47(false);
|
|
14286
15389
|
const hasResolvedModules = ctx.hasResolvedModules;
|
|
14287
15390
|
const isSplashConfigured = ctx.isSplashConfigured;
|
|
14288
|
-
|
|
15391
|
+
useEffect52(() => {
|
|
14289
15392
|
if (!hasResolvedModules || isSplashConfigured || disabledWarnedRef.current)
|
|
14290
15393
|
return;
|
|
14291
15394
|
disabledWarnedRef.current = true;
|