@skippr/live-agent-sdk 0.110.0 → 0.111.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.
@@ -387,63 +387,6 @@ function isEditableTarget() {
387
387
  return tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT" || el.isContentEditable;
388
388
  }
389
389
 
390
- // src/components/ConsentNotice.tsx
391
- import { jsx, jsxs } from "react/jsx-runtime";
392
- function ConsentNotice({ className, leadIn, determiner = "Skippr's" }) {
393
- return /* @__PURE__ */ jsxs("p", {
394
- className: cn("skippr:text-[11px] skippr:leading-[1.2] skippr:text-muted-foreground skippr:text-center", className),
395
- children: [
396
- leadIn,
397
- ", you agree to ",
398
- determiner,
399
- " ",
400
- /* @__PURE__ */ jsx("a", {
401
- href: "https://www.skippr.ai/terms",
402
- target: "_blank",
403
- rel: "noopener noreferrer",
404
- className: "skippr:underline skippr:underline-offset-[2px] skippr:decoration-muted-foreground/40 skippr:hover:text-foreground skippr:hover:decoration-muted-foreground",
405
- children: "Terms"
406
- }),
407
- " ",
408
- "&",
409
- " ",
410
- /* @__PURE__ */ jsx("a", {
411
- href: "https://www.skippr.ai/privacy",
412
- target: "_blank",
413
- rel: "noopener noreferrer",
414
- className: "skippr:underline skippr:underline-offset-[2px] skippr:decoration-muted-foreground/40 skippr:hover:text-foreground skippr:hover:decoration-muted-foreground",
415
- children: "Privacy"
416
- })
417
- ]
418
- });
419
- }
420
-
421
- // src/components/ConsentBubble.tsx
422
- import { jsx as jsx2 } from "react/jsx-runtime";
423
- function ConsentBubble({
424
- className,
425
- style,
426
- leadIn,
427
- onPointerEnter,
428
- onPointerLeave
429
- }) {
430
- return /* @__PURE__ */ jsx2("div", {
431
- className: cn("skippr:pointer-events-auto skippr:w-[240px] skippr:rounded-2xl skippr:bg-white skippr:px-2.5 skippr:py-1.5 skippr:shadow-[0_6px_16px_rgba(45,45,63,0.14)]", className),
432
- style,
433
- onPointerEnter,
434
- onPointerLeave,
435
- children: /* @__PURE__ */ jsx2(ConsentNotice, {
436
- leadIn
437
- })
438
- });
439
- }
440
-
441
- // src/components/VoiceBarLoginCard.tsx
442
- import { useContext as useContext2 } from "react";
443
-
444
- // src/context/LiveAgentContext.tsx
445
- import { createContext as createContext2 } from "react";
446
-
447
390
  // src/lib/constants.ts
448
391
  var BUDDY_SHAPE = {
449
392
  Bolt: "bolt",
@@ -542,6 +485,11 @@ var SPLASH_SURFACE = {
542
485
  Host: "host"
543
486
  };
544
487
  var SKIPPR_OPEN_EVENT = "skippr:open";
488
+ var CONSENT_TERMS_PLACEHOLDER = "{terms}";
489
+ var CONSENT_PRIVACY_PLACEHOLDER = "{privacy}";
490
+ var CONSENT_NOTICE_SESSION_START = `By starting a session, you agree to Skippr's ${CONSENT_TERMS_PLACEHOLDER} & ${CONSENT_PRIVACY_PLACEHOLDER}`;
491
+ var CONSENT_NOTICE_CONTINUING = `By continuing, you agree to the ${CONSENT_TERMS_PLACEHOLDER} & ${CONSENT_PRIVACY_PLACEHOLDER}`;
492
+ var CONSENT_NOTICE_AGENT_SESSION_START = `By starting the AI agent session, you agree to Skippr's ${CONSENT_TERMS_PLACEHOLDER} & ${CONSENT_PRIVACY_PLACEHOLDER}`;
545
493
  var SPLASH_COPY_DEFAULTS = {
546
494
  howItWorksHeading: "How it works",
547
495
  lastAccomplishmentHeading: "Last accomplishment",
@@ -558,7 +506,21 @@ var SPLASH_COPY_DEFAULTS = {
558
506
  tipsHeading: "Tips",
559
507
  tipsCta: "Need help with something else?",
560
508
  tipsEmptyTitle: "Ask about this page",
561
- tipsEmptyDescription: "Get instant answers about anything you see here"
509
+ tipsEmptyDescription: "Get instant answers about anything you see here",
510
+ attributionPrefix: "AI Agent Powered by",
511
+ closeLabel: "Close",
512
+ mediaEnableAction: "Enable",
513
+ mediaEnabledStatus: "Enabled",
514
+ micMutedStatus: "Muted",
515
+ screenRequiredStatus: "Required",
516
+ muteMicAction: "Mute microphone",
517
+ consentNotice: CONSENT_NOTICE_SESSION_START,
518
+ sectionRouteTitle: "Guides you step by step",
519
+ sectionRouteDescription: "Walks you through each step, start to finish",
520
+ sectionMessagesTitle: "Talk or type",
521
+ sectionMessagesDescription: "Ask by voice or in chat",
522
+ sectionPointerTitle: "Ask it to click through for you",
523
+ sectionPointerDescription: "Controls the environment for you"
562
524
  };
563
525
  var SPLASH_SECTION_GLYPH = {
564
526
  Route: "route",
@@ -568,20 +530,20 @@ var SPLASH_SECTION_GLYPH = {
568
530
  var DEFAULT_SPLASH_SECTIONS = [
569
531
  {
570
532
  id: "9f2b1c4a-5d6e-4f70-8a91-b2c3d4e5f601",
571
- title: "Guides you step by step",
572
- description: "Walks you through each step, start to finish",
533
+ title: SPLASH_COPY_DEFAULTS.sectionRouteTitle,
534
+ description: SPLASH_COPY_DEFAULTS.sectionRouteDescription,
573
535
  glyph: SPLASH_SECTION_GLYPH.Route
574
536
  },
575
537
  {
576
538
  id: "9f2b1c4a-5d6e-4f70-8a91-b2c3d4e5f602",
577
- title: "Talk or type",
578
- description: "Ask by voice or in chat",
539
+ title: SPLASH_COPY_DEFAULTS.sectionMessagesTitle,
540
+ description: SPLASH_COPY_DEFAULTS.sectionMessagesDescription,
579
541
  glyph: SPLASH_SECTION_GLYPH.Messages
580
542
  },
581
543
  {
582
544
  id: "9f2b1c4a-5d6e-4f70-8a91-b2c3d4e5f603",
583
- title: "Ask it to click through for you",
584
- description: "Controls the environment for you",
545
+ title: SPLASH_COPY_DEFAULTS.sectionPointerTitle,
546
+ description: SPLASH_COPY_DEFAULTS.sectionPointerDescription,
585
547
  glyph: SPLASH_SECTION_GLYPH.Pointer
586
548
  }
587
549
  ];
@@ -625,7 +587,68 @@ var PLAN_ATTR = "skippr.action-plan";
625
587
  var LINK_CARD_ATTR = "skippr.link-card";
626
588
  var NAME_MAX_CHARS = 80;
627
589
 
590
+ // src/components/ConsentNotice.tsx
591
+ import { jsx } from "react/jsx-runtime";
592
+ var CONSENT_LINK_BY_PLACEHOLDER = {
593
+ [CONSENT_TERMS_PLACEHOLDER]: { href: "https://www.skippr.ai/terms", label: "Terms" },
594
+ [CONSENT_PRIVACY_PLACEHOLDER]: { href: "https://www.skippr.ai/privacy", label: "Privacy" }
595
+ };
596
+ var CONSENT_LINK_CLASS = "skippr:underline skippr:underline-offset-[2px] skippr:decoration-muted-foreground/40 skippr:hover:text-foreground skippr:hover:decoration-muted-foreground";
597
+ function toConsentParts(template) {
598
+ const parts = [];
599
+ let rest = template;
600
+ while (rest.length > 0) {
601
+ const next = Object.keys(CONSENT_LINK_BY_PLACEHOLDER).map((placeholder) => ({ placeholder, at: rest.indexOf(placeholder) })).filter(({ at }) => at !== -1).sort((a, b) => a.at - b.at)[0];
602
+ if (!next) {
603
+ parts.push(rest);
604
+ break;
605
+ }
606
+ if (next.at > 0)
607
+ parts.push(rest.slice(0, next.at));
608
+ parts.push(CONSENT_LINK_BY_PLACEHOLDER[next.placeholder]);
609
+ rest = rest.slice(next.at + next.placeholder.length);
610
+ }
611
+ return parts;
612
+ }
613
+ function ConsentNotice({ className, template }) {
614
+ return /* @__PURE__ */ jsx("p", {
615
+ lang: "en",
616
+ className: cn("skippr:text-[11px] skippr:leading-[1.2] skippr:text-muted-foreground skippr:text-center", className),
617
+ children: toConsentParts(template).map((part) => typeof part === "string" ? part : /* @__PURE__ */ jsx("a", {
618
+ href: part.href,
619
+ target: "_blank",
620
+ rel: "noopener noreferrer",
621
+ className: CONSENT_LINK_CLASS,
622
+ children: part.label
623
+ }, part.href))
624
+ });
625
+ }
626
+
627
+ // src/components/ConsentBubble.tsx
628
+ import { jsx as jsx2 } from "react/jsx-runtime";
629
+ function ConsentBubble({
630
+ className,
631
+ style,
632
+ template,
633
+ onPointerEnter,
634
+ onPointerLeave
635
+ }) {
636
+ return /* @__PURE__ */ jsx2("div", {
637
+ className: cn("skippr:pointer-events-auto skippr:w-[240px] skippr:rounded-2xl skippr:bg-white skippr:px-2.5 skippr:py-1.5 skippr:shadow-[0_6px_16px_rgba(45,45,63,0.14)]", className),
638
+ style,
639
+ onPointerEnter,
640
+ onPointerLeave,
641
+ children: /* @__PURE__ */ jsx2(ConsentNotice, {
642
+ template
643
+ })
644
+ });
645
+ }
646
+
647
+ // src/components/VoiceBarLoginCard.tsx
648
+ import { useContext as useContext2 } from "react";
649
+
628
650
  // src/context/LiveAgentContext.tsx
651
+ import { createContext as createContext2 } from "react";
629
652
  var LiveAgentContext = createContext2(null);
630
653
 
631
654
  // src/components/LoginFlow.tsx
@@ -661,7 +684,7 @@ var Button = forwardRef3(({ className, variant = "default", size = "default", ..
661
684
  Button.displayName = "Button";
662
685
 
663
686
  // src/components/LoginFlow.tsx
664
- import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
687
+ import { jsx as jsx4, jsxs } from "react/jsx-runtime";
665
688
  var OTP_LENGTH = 6;
666
689
  var DIGIT_KEYS = ["d0", "d1", "d2", "d3", "d4", "d5"];
667
690
  function LoginFlow({ requestOtp, verifyOtp, error, isSubmitting }) {
@@ -705,10 +728,10 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
705
728
  if (email.trim())
706
729
  onSubmit(email.trim());
707
730
  }
708
- return /* @__PURE__ */ jsxs2("div", {
731
+ return /* @__PURE__ */ jsxs("div", {
709
732
  className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:px-4 skippr:py-4",
710
733
  children: [
711
- /* @__PURE__ */ jsxs2("div", {
734
+ /* @__PURE__ */ jsxs("div", {
712
735
  className: "skippr:mb-4 skippr:text-center",
713
736
  children: [
714
737
  /* @__PURE__ */ jsx4(Mail, {
@@ -724,7 +747,7 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
724
747
  })
725
748
  ]
726
749
  }),
727
- /* @__PURE__ */ jsxs2("form", {
750
+ /* @__PURE__ */ jsxs("form", {
728
751
  onSubmit: handleSubmit,
729
752
  className: "skippr:flex skippr:flex-col skippr:gap-3",
730
753
  children: [
@@ -751,7 +774,7 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
751
774
  className: "skippr:text-xs skippr:text-center skippr:text-destructive",
752
775
  children: error
753
776
  }),
754
- /* @__PURE__ */ jsxs2("p", {
777
+ /* @__PURE__ */ jsxs("p", {
755
778
  className: "skippr:text-[11px] skippr:leading-relaxed skippr:text-muted-foreground skippr:text-center",
756
779
  children: [
757
780
  "By continuing, you agree to the",
@@ -851,17 +874,17 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
851
874
  submittedRef.current = false;
852
875
  inputRefs.current[0]?.focus();
853
876
  }
854
- return /* @__PURE__ */ jsxs2("div", {
877
+ return /* @__PURE__ */ jsxs("div", {
855
878
  className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:px-4 skippr:py-4",
856
879
  children: [
857
- /* @__PURE__ */ jsxs2("div", {
880
+ /* @__PURE__ */ jsxs("div", {
858
881
  className: "skippr:mb-4 skippr:text-center",
859
882
  children: [
860
883
  /* @__PURE__ */ jsx4("p", {
861
884
  className: "skippr:text-sm skippr:font-medium skippr:text-foreground",
862
885
  children: "Enter verification code"
863
886
  }),
864
- /* @__PURE__ */ jsxs2("p", {
887
+ /* @__PURE__ */ jsxs("p", {
865
888
  className: "skippr:mt-1 skippr:text-xs skippr:text-muted-foreground",
866
889
  children: [
867
890
  "We sent a 6-digit code to",
@@ -874,7 +897,7 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
874
897
  })
875
898
  ]
876
899
  }),
877
- /* @__PURE__ */ jsxs2("form", {
900
+ /* @__PURE__ */ jsxs("form", {
878
901
  onSubmit: handleSubmit,
879
902
  className: "skippr:flex skippr:flex-col skippr:gap-3",
880
903
  children: [
@@ -909,7 +932,7 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
909
932
  className: "skippr:size-4 skippr:animate-spin"
910
933
  }) : "Verify"
911
934
  }),
912
- /* @__PURE__ */ jsxs2("div", {
935
+ /* @__PURE__ */ jsxs("div", {
913
936
  className: "skippr:flex skippr:items-center skippr:justify-between skippr:text-xs",
914
937
  children: [
915
938
  /* @__PURE__ */ jsx4("button", {
@@ -935,17 +958,17 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
935
958
  }
936
959
 
937
960
  // src/components/VoiceBarLoginCard.tsx
938
- import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
961
+ import { jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
939
962
  function VoiceBarLoginCard({ onDismiss }) {
940
963
  const ctx = useContext2(LiveAgentContext);
941
964
  if (!ctx) {
942
965
  throw new Error("VoiceBarLoginCard must be used within a <LiveAgent> provider");
943
966
  }
944
967
  const { requestOtp, verifyOtp, authError, isAuthSubmitting } = ctx;
945
- return /* @__PURE__ */ jsxs3("div", {
968
+ return /* @__PURE__ */ jsxs2("div", {
946
969
  className: "skippr:w-[320px] skippr:rounded-[14px] skippr:border skippr:border-[rgba(45,45,63,0.08)] skippr:bg-white skippr:shadow-[0_10px_28px_rgba(45,45,63,0.16)] skippr:[animation:skippr-tip-in_360ms_cubic-bezier(0.34,1.3,0.64,1)]",
947
970
  children: [
948
- /* @__PURE__ */ jsxs3("div", {
971
+ /* @__PURE__ */ jsxs2("div", {
949
972
  className: "skippr:flex skippr:items-center skippr:justify-between skippr:border-b skippr:border-[rgba(45,45,63,0.06)] skippr:px-[12px] skippr:py-[6px]",
950
973
  children: [
951
974
  /* @__PURE__ */ jsx5("span", {
@@ -1178,7 +1201,7 @@ function useVoiceTurn() {
1178
1201
  }
1179
1202
 
1180
1203
  // src/buddy/BuddyFace.tsx
1181
- import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
1204
+ import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
1182
1205
  function BuddyFace({
1183
1206
  eyeDx,
1184
1207
  eyeDy,
@@ -1187,7 +1210,7 @@ function BuddyFace({
1187
1210
  lidsPath,
1188
1211
  pupilOpacity
1189
1212
  }) {
1190
- return /* @__PURE__ */ jsxs4("svg", {
1213
+ return /* @__PURE__ */ jsxs3("svg", {
1191
1214
  width: "52",
1192
1215
  height: "28",
1193
1216
  viewBox: "0 0 52 28",
@@ -1200,7 +1223,7 @@ function BuddyFace({
1200
1223
  transformOrigin: "center",
1201
1224
  animation: "skippr-blink 4.6s ease-in-out infinite"
1202
1225
  },
1203
- children: /* @__PURE__ */ jsxs4("g", {
1226
+ children: /* @__PURE__ */ jsxs3("g", {
1204
1227
  opacity: pupilOpacity,
1205
1228
  children: [
1206
1229
  /* @__PURE__ */ jsx6("ellipse", {
@@ -1221,7 +1244,7 @@ function BuddyFace({
1221
1244
  stroke: "#2D2D3F",
1222
1245
  strokeWidth: "2"
1223
1246
  }),
1224
- /* @__PURE__ */ jsxs4("g", {
1247
+ /* @__PURE__ */ jsxs3("g", {
1225
1248
  transform: `translate(${eyeDx} ${eyeDy})`,
1226
1249
  children: [
1227
1250
  /* @__PURE__ */ jsx6("circle", {
@@ -1289,7 +1312,7 @@ function PeekBody() {
1289
1312
  }
1290
1313
 
1291
1314
  // src/buddy/shapes/colorful.tsx
1292
- import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
1315
+ import { jsx as jsx8, jsxs as jsxs4 } from "react/jsx-runtime";
1293
1316
  function BloomBody() {
1294
1317
  return /* @__PURE__ */ jsx8("svg", {
1295
1318
  width: BODY_SIZE.width,
@@ -1336,10 +1359,10 @@ function PopBody() {
1336
1359
  viewBox: "0 0 96 92",
1337
1360
  style: { display: "block", overflow: "visible" },
1338
1361
  "aria-hidden": "true",
1339
- children: /* @__PURE__ */ jsxs5("g", {
1362
+ children: /* @__PURE__ */ jsxs4("g", {
1340
1363
  fill: "#7B52D3",
1341
1364
  children: [
1342
- /* @__PURE__ */ jsxs5("g", {
1365
+ /* @__PURE__ */ jsxs4("g", {
1343
1366
  className: "skippr-avatar-bub-tail",
1344
1367
  children: [
1345
1368
  /* @__PURE__ */ jsx8("circle", {
@@ -1368,10 +1391,10 @@ function RoboBody() {
1368
1391
  viewBox: "0 0 96 92",
1369
1392
  style: { display: "block", overflow: "visible" },
1370
1393
  "aria-hidden": "true",
1371
- children: /* @__PURE__ */ jsxs5("g", {
1394
+ children: /* @__PURE__ */ jsxs4("g", {
1372
1395
  fill: "#5FA8E8",
1373
1396
  children: [
1374
- /* @__PURE__ */ jsxs5("g", {
1397
+ /* @__PURE__ */ jsxs4("g", {
1375
1398
  className: "skippr-avatar-antenna",
1376
1399
  children: [
1377
1400
  /* @__PURE__ */ jsx8("rect", {
@@ -1411,9 +1434,9 @@ function RoboBody() {
1411
1434
  }
1412
1435
 
1413
1436
  // src/buddy/shapes/glass.tsx
1414
- import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
1437
+ import { jsx as jsx9, jsxs as jsxs5 } from "react/jsx-runtime";
1415
1438
  function BoulderBody() {
1416
- return /* @__PURE__ */ jsxs6("svg", {
1439
+ return /* @__PURE__ */ jsxs5("svg", {
1417
1440
  width: BODY_SIZE.width,
1418
1441
  height: BODY_SIZE.height,
1419
1442
  viewBox: "0 0 96 92",
@@ -1438,7 +1461,7 @@ function BoulderBody() {
1438
1461
  });
1439
1462
  }
1440
1463
  function KiteBody() {
1441
- return /* @__PURE__ */ jsxs6("svg", {
1464
+ return /* @__PURE__ */ jsxs5("svg", {
1442
1465
  width: BODY_SIZE.width,
1443
1466
  height: BODY_SIZE.height,
1444
1467
  viewBox: "0 0 96 92",
@@ -1464,7 +1487,7 @@ function KiteBody() {
1464
1487
  });
1465
1488
  }
1466
1489
  function LoafBody() {
1467
- return /* @__PURE__ */ jsxs6("svg", {
1490
+ return /* @__PURE__ */ jsxs5("svg", {
1468
1491
  width: BODY_SIZE.width,
1469
1492
  height: BODY_SIZE.height,
1470
1493
  viewBox: "0 0 96 92",
@@ -1489,7 +1512,7 @@ function LoafBody() {
1489
1512
  });
1490
1513
  }
1491
1514
  function FacetBody() {
1492
- return /* @__PURE__ */ jsxs6("svg", {
1515
+ return /* @__PURE__ */ jsxs5("svg", {
1493
1516
  width: BODY_SIZE.width,
1494
1517
  height: BODY_SIZE.height,
1495
1518
  viewBox: "0 0 96 92",
@@ -1513,7 +1536,7 @@ function FacetBody() {
1513
1536
  });
1514
1537
  }
1515
1538
  function BellBody() {
1516
- return /* @__PURE__ */ jsxs6("svg", {
1539
+ return /* @__PURE__ */ jsxs5("svg", {
1517
1540
  width: BODY_SIZE.width,
1518
1541
  height: BODY_SIZE.height,
1519
1542
  viewBox: "0 0 96 92",
@@ -1547,9 +1570,9 @@ function BellBody() {
1547
1570
  }
1548
1571
 
1549
1572
  // src/buddy/shapes/original.tsx
1550
- import { jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
1573
+ import { jsx as jsx10, jsxs as jsxs6 } from "react/jsx-runtime";
1551
1574
  function BoltBody() {
1552
- return /* @__PURE__ */ jsxs7("svg", {
1575
+ return /* @__PURE__ */ jsxs6("svg", {
1553
1576
  width: BODY_SIZE.width,
1554
1577
  height: BODY_SIZE.height,
1555
1578
  viewBox: "0 0 96 92",
@@ -1611,7 +1634,7 @@ function BoltBody() {
1611
1634
  });
1612
1635
  }
1613
1636
  function TermBody() {
1614
- return /* @__PURE__ */ jsxs7("svg", {
1637
+ return /* @__PURE__ */ jsxs6("svg", {
1615
1638
  width: BODY_SIZE.width,
1616
1639
  height: BODY_SIZE.height,
1617
1640
  viewBox: "0 0 96 92",
@@ -1656,7 +1679,7 @@ function TermBody() {
1656
1679
  });
1657
1680
  }
1658
1681
  function HexBody() {
1659
- return /* @__PURE__ */ jsxs7("svg", {
1682
+ return /* @__PURE__ */ jsxs6("svg", {
1660
1683
  width: BODY_SIZE.width,
1661
1684
  height: BODY_SIZE.height,
1662
1685
  viewBox: "0 0 96 92",
@@ -1698,9 +1721,9 @@ function BubBody() {
1698
1721
  }
1699
1722
 
1700
1723
  // src/buddy/shapes/pixel.tsx
1701
- import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
1724
+ import { jsx as jsx11, jsxs as jsxs7 } from "react/jsx-runtime";
1702
1725
  function TotemBody() {
1703
- return /* @__PURE__ */ jsxs8("svg", {
1726
+ return /* @__PURE__ */ jsxs7("svg", {
1704
1727
  width: BODY_SIZE.width,
1705
1728
  height: BODY_SIZE.height,
1706
1729
  viewBox: "0 0 96 92",
@@ -1754,7 +1777,7 @@ function TotemBody() {
1754
1777
  });
1755
1778
  }
1756
1779
  function MelonBody() {
1757
- return /* @__PURE__ */ jsxs8("svg", {
1780
+ return /* @__PURE__ */ jsxs7("svg", {
1758
1781
  width: BODY_SIZE.width,
1759
1782
  height: BODY_SIZE.height,
1760
1783
  viewBox: "0 0 96 92",
@@ -1815,7 +1838,7 @@ function MelonBody() {
1815
1838
  });
1816
1839
  }
1817
1840
  function SunnyBody() {
1818
- return /* @__PURE__ */ jsxs8("svg", {
1841
+ return /* @__PURE__ */ jsxs7("svg", {
1819
1842
  width: BODY_SIZE.width,
1820
1843
  height: BODY_SIZE.height,
1821
1844
  viewBox: "0 0 96 92",
@@ -1862,7 +1885,7 @@ function SunnyBody() {
1862
1885
  });
1863
1886
  }
1864
1887
  function StormBody() {
1865
- return /* @__PURE__ */ jsxs8("svg", {
1888
+ return /* @__PURE__ */ jsxs7("svg", {
1866
1889
  width: BODY_SIZE.width,
1867
1890
  height: BODY_SIZE.height,
1868
1891
  viewBox: "0 0 96 92",
@@ -1909,7 +1932,7 @@ function StormBody() {
1909
1932
  });
1910
1933
  }
1911
1934
  function ReedBody() {
1912
- return /* @__PURE__ */ jsxs8("svg", {
1935
+ return /* @__PURE__ */ jsxs7("svg", {
1913
1936
  width: BODY_SIZE.width,
1914
1937
  height: BODY_SIZE.height,
1915
1938
  viewBox: "0 0 96 92",
@@ -2003,7 +2026,7 @@ var SHAPE_FACE_OFFSET = {
2003
2026
  };
2004
2027
 
2005
2028
  // src/buddy/BuddyFamilyFace.tsx
2006
- import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
2029
+ import { jsx as jsx12, jsxs as jsxs8 } from "react/jsx-runtime";
2007
2030
  var VIEWBOX_UNITS_PER_PX = 512 / BODY_SIZE.width;
2008
2031
  var COLORFUL_FACE = {
2009
2032
  rAlmond: "M240.7 287.4C262.7 265.4 262.7 229.6 240.7 207.6C235.7 202.6 230 198.7 224 196C203.2 186.6 178 190.5 160.9 207.6C138.9 229.6 138.9 265.4 160.9 287.4C179.7 306.2 208.5 308.9 230.2 295.6C233.9 293.4 237.5 290.6 240.7 287.4C240.7 287.4 240.7 287.4 240.7 287.4Z",
@@ -2041,7 +2064,7 @@ function ColorfulFace({
2041
2064
  const eyeGroupProps = animated ? { className: "skippr-avatar-blink" } : { className: "skippr-buddy-blink" };
2042
2065
  const pupilGroupProps = animated ? { className: "skippr-avatar-pupil" } : { transform: pupilShift };
2043
2066
  if (asleep) {
2044
- return /* @__PURE__ */ jsxs9("svg", {
2067
+ return /* @__PURE__ */ jsxs8("svg", {
2045
2068
  width: BODY_SIZE.width,
2046
2069
  height: BODY_SIZE.width,
2047
2070
  viewBox: "0 0 512 512",
@@ -2067,7 +2090,7 @@ function ColorfulFace({
2067
2090
  ]
2068
2091
  });
2069
2092
  }
2070
- return /* @__PURE__ */ jsxs9("svg", {
2093
+ return /* @__PURE__ */ jsxs8("svg", {
2071
2094
  width: BODY_SIZE.width,
2072
2095
  height: BODY_SIZE.width,
2073
2096
  viewBox: "0 0 512 512",
@@ -2087,10 +2110,10 @@ function ColorfulFace({
2087
2110
  d: COLORFUL_FACE.lAlmond
2088
2111
  })
2089
2112
  }),
2090
- /* @__PURE__ */ jsxs9("g", {
2113
+ /* @__PURE__ */ jsxs8("g", {
2091
2114
  className: animated ? "skippr-avatar-eyes" : undefined,
2092
2115
  children: [
2093
- /* @__PURE__ */ jsxs9("g", {
2116
+ /* @__PURE__ */ jsxs8("g", {
2094
2117
  ...eyeGroupProps,
2095
2118
  children: [
2096
2119
  /* @__PURE__ */ jsx12("path", {
@@ -2099,7 +2122,7 @@ function ColorfulFace({
2099
2122
  }),
2100
2123
  /* @__PURE__ */ jsx12("g", {
2101
2124
  clipPath: `url(#${clipId}r)`,
2102
- children: /* @__PURE__ */ jsxs9("g", {
2125
+ children: /* @__PURE__ */ jsxs8("g", {
2103
2126
  ...pupilGroupProps,
2104
2127
  children: [
2105
2128
  /* @__PURE__ */ jsx12("circle", {
@@ -2117,7 +2140,7 @@ function ColorfulFace({
2117
2140
  })
2118
2141
  ]
2119
2142
  }),
2120
- /* @__PURE__ */ jsxs9("g", {
2143
+ /* @__PURE__ */ jsxs8("g", {
2121
2144
  ...eyeGroupProps,
2122
2145
  children: [
2123
2146
  /* @__PURE__ */ jsx12("path", {
@@ -2126,7 +2149,7 @@ function ColorfulFace({
2126
2149
  }),
2127
2150
  /* @__PURE__ */ jsx12("g", {
2128
2151
  clipPath: `url(#${clipId}l)`,
2129
- children: /* @__PURE__ */ jsxs9("g", {
2152
+ children: /* @__PURE__ */ jsxs8("g", {
2130
2153
  ...pupilGroupProps,
2131
2154
  children: [
2132
2155
  /* @__PURE__ */ jsx12("circle", {
@@ -2160,7 +2183,7 @@ function aimPupil(center, rest, eyeDx, eyeDy) {
2160
2183
  }
2161
2184
  function PixelFace({ eyeDx, eyeDy, asleep }) {
2162
2185
  if (asleep) {
2163
- return /* @__PURE__ */ jsxs9("svg", {
2186
+ return /* @__PURE__ */ jsxs8("svg", {
2164
2187
  width: BODY_SIZE.width,
2165
2188
  height: BODY_SIZE.width,
2166
2189
  viewBox: "0 0 512 512",
@@ -2189,7 +2212,7 @@ function PixelFace({ eyeDx, eyeDy, asleep }) {
2189
2212
  const tracking = eyeDx !== 0 || eyeDy !== 0;
2190
2213
  const right = tracking ? aimPupil(PIXEL_FACE.r, PIXEL_FACE.pupilRest.r, eyeDx, eyeDy) : PIXEL_FACE.pupilRest.r;
2191
2214
  const left = tracking ? aimPupil(PIXEL_FACE.l, PIXEL_FACE.pupilRest.l, eyeDx, eyeDy) : PIXEL_FACE.pupilRest.l;
2192
- return /* @__PURE__ */ jsxs9("svg", {
2215
+ return /* @__PURE__ */ jsxs8("svg", {
2193
2216
  width: BODY_SIZE.width,
2194
2217
  height: BODY_SIZE.width,
2195
2218
  viewBox: "0 0 512 512",
@@ -2197,7 +2220,7 @@ function PixelFace({ eyeDx, eyeDy, asleep }) {
2197
2220
  "data-testid": "buddy-face-pixel",
2198
2221
  "aria-hidden": "true",
2199
2222
  children: [
2200
- /* @__PURE__ */ jsxs9("g", {
2223
+ /* @__PURE__ */ jsxs8("g", {
2201
2224
  className: "skippr-buddy-blink",
2202
2225
  children: [
2203
2226
  /* @__PURE__ */ jsx12("circle", {
@@ -2216,7 +2239,7 @@ function PixelFace({ eyeDx, eyeDy, asleep }) {
2216
2239
  })
2217
2240
  ]
2218
2241
  }),
2219
- /* @__PURE__ */ jsxs9("g", {
2242
+ /* @__PURE__ */ jsxs8("g", {
2220
2243
  className: "skippr-buddy-blink",
2221
2244
  children: [
2222
2245
  /* @__PURE__ */ jsx12("circle", {
@@ -2240,7 +2263,7 @@ function PixelFace({ eyeDx, eyeDy, asleep }) {
2240
2263
  }
2241
2264
 
2242
2265
  // src/buddy/BuddyCreature.tsx
2243
- import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
2266
+ import { jsx as jsx13, jsxs as jsxs9 } from "react/jsx-runtime";
2244
2267
  var COLORFUL_SHAPES = new Set([
2245
2268
  BUDDY_SHAPE.Bloom,
2246
2269
  BUDDY_SHAPE.Wobble,
@@ -2302,7 +2325,7 @@ function BuddyCreature({ shape, mode, eyeDx, eyeDy, isTalking }) {
2302
2325
  const offset = SHAPE_FACE_OFFSET[shape];
2303
2326
  const asleep = mode === BUDDY_MODE.Sleep;
2304
2327
  const colorfulAnimated = isColorful && mode !== BUDDY_MODE.Sleep && mode !== BUDDY_MODE.Happy;
2305
- return /* @__PURE__ */ jsxs10("span", {
2328
+ return /* @__PURE__ */ jsxs9("span", {
2306
2329
  "data-testid": `buddy-shape-${shape}`,
2307
2330
  style: {
2308
2331
  position: "relative",
@@ -2343,7 +2366,7 @@ function BuddyCreature({ shape, mode, eyeDx, eyeDy, isTalking }) {
2343
2366
  pupilOpacity: face.pupilOpacity
2344
2367
  })
2345
2368
  }),
2346
- mode === BUDDY_MODE.Sleep && /* @__PURE__ */ jsxs10("span", {
2369
+ mode === BUDDY_MODE.Sleep && /* @__PURE__ */ jsxs9("span", {
2347
2370
  style: {
2348
2371
  position: "absolute",
2349
2372
  bottom: "calc(100% - 10px)",
@@ -2774,7 +2797,7 @@ function useBuddyIdleMode({
2774
2797
  }
2775
2798
 
2776
2799
  // src/buddy/BuddyVoiceBar.tsx
2777
- import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
2800
+ import { jsx as jsx14, jsxs as jsxs10 } from "react/jsx-runtime";
2778
2801
  var WAKE_BUBBLE_MS = 2100;
2779
2802
  var FOCUS_RING = {
2780
2803
  outline: "2px solid var(--skippr-brand, #2bc0ae)",
@@ -2833,7 +2856,7 @@ var PEEK_CLASS = {
2833
2856
  bottom: "skippr-peek-bottom"
2834
2857
  };
2835
2858
  function BuddyLoadingDots() {
2836
- return /* @__PURE__ */ jsxs11("span", {
2859
+ return /* @__PURE__ */ jsxs10("span", {
2837
2860
  className: "skippr:flex skippr:items-center skippr:gap-[3px]",
2838
2861
  "aria-hidden": "true",
2839
2862
  children: [
@@ -3034,7 +3057,7 @@ function BuddyVoiceBar({ revealed }) {
3034
3057
  };
3035
3058
  return /* @__PURE__ */ jsx14("div", {
3036
3059
  style: isConnected ? activeWrapperStyle : { ...edgeWrapperStyle(edgeDrag.pos), touchAction: "none" },
3037
- children: isConnected ? /* @__PURE__ */ jsxs11("div", {
3060
+ children: isConnected ? /* @__PURE__ */ jsxs10("div", {
3038
3061
  ref: (node) => {
3039
3062
  containerRef.current = node;
3040
3063
  },
@@ -3077,13 +3100,13 @@ function BuddyVoiceBar({ revealed }) {
3077
3100
  "aria-label": "Close buddy session",
3078
3101
  title: "Close",
3079
3102
  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]"}`,
3080
- children: /* @__PURE__ */ jsxs11("span", {
3103
+ children: /* @__PURE__ */ jsxs10("span", {
3081
3104
  className: "skippr:relative skippr:flex skippr:size-5 skippr:items-center skippr:justify-center",
3082
3105
  children: [
3083
3106
  /* @__PURE__ */ jsx14(X, {
3084
3107
  className: `skippr:size-3.5 skippr:transition-opacity skippr:duration-200 ${isDisconnecting ? "skippr:opacity-40" : ""}`
3085
3108
  }),
3086
- isDisconnecting && /* @__PURE__ */ jsxs11("svg", {
3109
+ isDisconnecting && /* @__PURE__ */ jsxs10("svg", {
3087
3110
  viewBox: "0 0 24 24",
3088
3111
  fill: "none",
3089
3112
  "aria-hidden": "true",
@@ -3111,7 +3134,7 @@ function BuddyVoiceBar({ revealed }) {
3111
3134
  ]
3112
3135
  })
3113
3136
  }),
3114
- showWakeBubble ? /* @__PURE__ */ jsxs11("div", {
3137
+ showWakeBubble ? /* @__PURE__ */ jsxs10("div", {
3115
3138
  className: "skippr:absolute skippr:-top-8 skippr:left-1/2 skippr:flex skippr:-translate-x-1/2 skippr:items-center skippr:gap-1.5 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)]",
3116
3139
  role: "status",
3117
3140
  children: [
@@ -3134,15 +3157,15 @@ function BuddyVoiceBar({ revealed }) {
3134
3157
  children: "hold me down to talk"
3135
3158
  })
3136
3159
  ]
3137
- }) : /* @__PURE__ */ jsxs11("div", {
3160
+ }) : /* @__PURE__ */ jsxs10("div", {
3138
3161
  ref: setHoverContainer,
3139
3162
  style: { position: "relative", display: "flex" },
3140
3163
  children: [
3141
- /* @__PURE__ */ jsxs11("div", {
3164
+ /* @__PURE__ */ jsxs10("div", {
3142
3165
  className: isStandingBy || isIdleLauncherHovered ? "skippr-peek-out" : PEEK_CLASS[edgeDrag.pos.edge],
3143
3166
  style: { display: "flex", position: "relative" },
3144
3167
  children: [
3145
- /* @__PURE__ */ jsxs11("button", {
3168
+ /* @__PURE__ */ jsxs10("button", {
3146
3169
  ref: (node) => {
3147
3170
  containerRef.current = node;
3148
3171
  },
@@ -3190,7 +3213,7 @@ function BuddyVoiceBar({ revealed }) {
3190
3213
  ]
3191
3214
  }),
3192
3215
  isIdleLauncherHovered && !loginOpen && /* @__PURE__ */ jsx14(ConsentBubble, {
3193
- leadIn: "By starting the AI agent session",
3216
+ template: CONSENT_NOTICE_AGENT_SESSION_START,
3194
3217
  className: "skippr:absolute skippr:bottom-[calc(100%+8px)] skippr:w-[150px]",
3195
3218
  style: edgeDrag.pos.edge === "left" ? { left: 0 } : edgeDrag.pos.edge === "right" ? { right: 0 } : { left: "50%", transform: "translateX(-50%)" }
3196
3219
  })
@@ -4062,7 +4085,8 @@ function useAvailableModules({
4062
4085
  enabled,
4063
4086
  bearerToken,
4064
4087
  authedFetch,
4065
- agentId
4088
+ agentId,
4089
+ locale
4066
4090
  }) {
4067
4091
  const [modules, setModules] = useState12([]);
4068
4092
  const [defaultSelection, setDefaultSelection] = useState12(EMPTY_DEFAULT);
@@ -4078,7 +4102,13 @@ function useAvailableModules({
4078
4102
  setIsLoading(true);
4079
4103
  setError(null);
4080
4104
  try {
4081
- const query = agentId ? `?agentId=${encodeURIComponent(agentId)}` : "";
4105
+ const params = new URLSearchParams;
4106
+ if (agentId)
4107
+ params.set("agentId", agentId);
4108
+ if (locale)
4109
+ params.set("locale", locale);
4110
+ const search = params.toString();
4111
+ const query = search ? `?${search}` : "";
4082
4112
  const resp = await authedFetch(`${API_URL3}/v1/modules/available${query}`, {
4083
4113
  signal: signal ?? null
4084
4114
  });
@@ -4103,7 +4133,7 @@ function useAvailableModules({
4103
4133
  setHasResolved(true);
4104
4134
  }
4105
4135
  }
4106
- }, [authedFetch, agentId]);
4136
+ }, [authedFetch, agentId, locale]);
4107
4137
  useEffect15(() => {
4108
4138
  if (!enabled || !bearerToken)
4109
4139
  return;
@@ -4759,6 +4789,31 @@ function launcherPopsDown(bottomPx) {
4759
4789
  return bottomPx + LAUNCHER_HEIGHT_PX / 2 > window.innerHeight / 2;
4760
4790
  }
4761
4791
 
4792
+ // src/lib/locale.ts
4793
+ import { useSyncExternalStore } from "react";
4794
+ function detectLocale(configLocale) {
4795
+ return firstNonBlank(configLocale) ?? firstNonBlank(document.documentElement.lang) ?? firstNonBlank(navigator.language);
4796
+ }
4797
+ function useDetectedLocale(configLocale) {
4798
+ useSyncExternalStore(subscribeToHtmlLang, readHtmlLang, readServerHtmlLang);
4799
+ return detectLocale(configLocale);
4800
+ }
4801
+ function subscribeToHtmlLang(onChange) {
4802
+ const observer = new MutationObserver(onChange);
4803
+ observer.observe(document.documentElement, { attributes: true, attributeFilter: ["lang"] });
4804
+ return () => observer.disconnect();
4805
+ }
4806
+ function readHtmlLang() {
4807
+ return document.documentElement.lang;
4808
+ }
4809
+ function readServerHtmlLang() {
4810
+ return "";
4811
+ }
4812
+ function firstNonBlank(value) {
4813
+ const trimmed = value?.trim();
4814
+ return trimmed ? trimmed : undefined;
4815
+ }
4816
+
4762
4817
  // src/lib/splashSurfaces.ts
4763
4818
  var NO_SPLASH_SURFACES = {
4764
4819
  applies: false,
@@ -5074,7 +5129,7 @@ function traceRing(path, durationMs, onFrame, onDone) {
5074
5129
  }
5075
5130
 
5076
5131
  // src/components/AgentCursor.tsx
5077
- import { jsx as jsx18, jsxs as jsxs12, Fragment } from "react/jsx-runtime";
5132
+ import { jsx as jsx18, jsxs as jsxs11, Fragment } from "react/jsx-runtime";
5078
5133
  var Z_INDEX = 2147483646;
5079
5134
  var BRAND_COLOR = "var(--skippr-brand, #2bc0ae)";
5080
5135
  var GLIDE_EASE = "cubic-bezier(0.45, 0, 0.25, 1)";
@@ -5305,7 +5360,7 @@ function AgentCursor({
5305
5360
  return null;
5306
5361
  const rippleCenter = ringBox ? centerOf(ringBox) : null;
5307
5362
  const drawing = phase === "travel" || phase === "drawing";
5308
- return /* @__PURE__ */ jsxs12("div", {
5363
+ return /* @__PURE__ */ jsxs11("div", {
5309
5364
  "data-skippr-private": "true",
5310
5365
  "aria-hidden": "true",
5311
5366
  children: [
@@ -5322,7 +5377,7 @@ function AgentCursor({
5322
5377
  style: { strokeDasharray: "0 99999" }
5323
5378
  })
5324
5379
  }),
5325
- phase === "done" && ringBox && /* @__PURE__ */ jsxs12(Fragment, {
5380
+ phase === "done" && ringBox && /* @__PURE__ */ jsxs11(Fragment, {
5326
5381
  children: [
5327
5382
  /* @__PURE__ */ jsx18("div", {
5328
5383
  style: ringBoxStyle(ringBox, Z_INDEX),
@@ -7163,7 +7218,7 @@ function useLauncherDrag(containerRef, onDrop, followRefs, reportDragging, enabl
7163
7218
  }
7164
7219
 
7165
7220
  // src/components/AdoptionBubble.tsx
7166
- import { jsx as jsx19, jsxs as jsxs13 } from "react/jsx-runtime";
7221
+ import { jsx as jsx19, jsxs as jsxs12 } from "react/jsx-runtime";
7167
7222
  function AdoptionBubble({
7168
7223
  goal,
7169
7224
  onAttend,
@@ -7177,7 +7232,7 @@ function AdoptionBubble({
7177
7232
  transitionDelay: hidden ? `${exitDelayMs}ms` : "0ms"
7178
7233
  },
7179
7234
  className: cn("skippr:group skippr:relative", "skippr:transition-opacity skippr:duration-300", "skippr:[animation:skippr-tip-in_360ms_cubic-bezier(0.34,1.3,0.64,1)_backwards]", hidden && "skippr:opacity-0 skippr:pointer-events-none"),
7180
- children: /* @__PURE__ */ jsxs13("button", {
7235
+ children: /* @__PURE__ */ jsxs12("button", {
7181
7236
  type: "button",
7182
7237
  onClick: () => onAttend(goal),
7183
7238
  className: cn("skippr:flex skippr:max-w-72 skippr:items-center skippr:gap-2", "skippr:rounded-[14px] skippr:bg-amber-50 skippr:py-1.5 skippr:pr-3 skippr:pl-1.5", "skippr:text-left skippr:shadow-[0_8px_24px_rgba(0,0,0,0.18)]", "skippr:transition-colors skippr:cursor-pointer skippr:hover:bg-amber-100", "skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-bubble/60"),
@@ -7202,7 +7257,7 @@ function AdoptionBubble({
7202
7257
  }
7203
7258
 
7204
7259
  // src/components/ModulePill.tsx
7205
- import { jsx as jsx20, jsxs as jsxs14 } from "react/jsx-runtime";
7260
+ import { jsx as jsx20, jsxs as jsxs13 } from "react/jsx-runtime";
7206
7261
  var RING_RADIUS = 8;
7207
7262
  var RING_CIRCUMFERENCE = 2 * Math.PI * RING_RADIUS;
7208
7263
  function ModulePill({ module, onSelect }) {
@@ -7210,12 +7265,12 @@ function ModulePill({ module, onSelect }) {
7210
7265
  const totalPhases = module.totalPhases;
7211
7266
  const showProgress = module.mode !== AGENT_MODE.AlwaysOn && totalPhases > 0;
7212
7267
  const progressFraction = showProgress ? Math.min(completedPhases / totalPhases, 1) : 0;
7213
- return /* @__PURE__ */ jsxs14("button", {
7268
+ return /* @__PURE__ */ jsxs13("button", {
7214
7269
  type: "button",
7215
7270
  onClick: () => onSelect(module.id),
7216
7271
  className: cn("skippr:flex skippr:w-40 skippr:items-center skippr:gap-1.5 skippr:whitespace-nowrap", "skippr:rounded-[14px] skippr:bg-white skippr:px-3 skippr:py-1.5", "skippr:text-[13px] skippr:font-medium skippr:text-black", "skippr:shadow-[0_8px_24px_rgba(0,0,0,0.18)]", "skippr:transition-colors skippr:cursor-pointer skippr:hover:bg-neutral-100", "skippr:animate-[skippr-bubble-in_0.28s_ease-out]", "skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-bubble/60"),
7217
7272
  children: [
7218
- showProgress && /* @__PURE__ */ jsxs14("svg", {
7273
+ showProgress && /* @__PURE__ */ jsxs13("svg", {
7219
7274
  viewBox: "0 0 20 20",
7220
7275
  className: "skippr:size-4 skippr:shrink-0 skippr:-rotate-90",
7221
7276
  "aria-hidden": "true",
@@ -7245,7 +7300,7 @@ function ModulePill({ module, onSelect }) {
7245
7300
  className: "skippr:min-w-0 skippr:flex-1 skippr:truncate skippr:text-left",
7246
7301
  children: module.name
7247
7302
  }),
7248
- showProgress && /* @__PURE__ */ jsxs14("span", {
7303
+ showProgress && /* @__PURE__ */ jsxs13("span", {
7249
7304
  className: cn("skippr:ml-0.5 skippr:inline-flex skippr:shrink-0 skippr:items-center skippr:gap-1 skippr:rounded-full", "skippr:bg-black/[0.07] skippr:px-1.5 skippr:py-0.5", "skippr:text-[10px] skippr:font-semibold"),
7250
7305
  children: [
7251
7306
  completedPhases,
@@ -7258,7 +7313,7 @@ function ModulePill({ module, onSelect }) {
7258
7313
  }
7259
7314
 
7260
7315
  // src/components/MinimizedBubble.tsx
7261
- import { jsx as jsx21, jsxs as jsxs15 } from "react/jsx-runtime";
7316
+ import { jsx as jsx21, jsxs as jsxs14 } from "react/jsx-runtime";
7262
7317
  var GOALS_AUTO_HIDE_MS = 6000;
7263
7318
  var GOAL_FADE_OUT_MS = 300;
7264
7319
  var GOAL_APPEAR_STAGGER_MS = 150;
@@ -7330,7 +7385,7 @@ function IdleLauncher({
7330
7385
  onStart,
7331
7386
  onChat
7332
7387
  }) {
7333
- return /* @__PURE__ */ jsxs15("div", {
7388
+ return /* @__PURE__ */ jsxs14("div", {
7334
7389
  className: cn("skippr:flex skippr:h-[48px] skippr:items-center", "skippr:bg-launcher skippr:p-1.5 skippr:shadow-[-6px_8px_30px_rgba(15,18,26,0.32)]", "skippr:[animation:skippr-orb-in_320ms_cubic-bezier(0.34,1.3,0.64,1)]", "skippr:transition-transform skippr:duration-[400ms] skippr:ease-[cubic-bezier(0.22,1,0.36,1)]", position === "right" ? "skippr:rounded-l-[18px] skippr:origin-right" : "skippr:rounded-r-[18px] skippr:origin-left", position === "right" ? isHovered || logoUrl ? "skippr:translate-x-3" : "skippr:translate-x-7" : isHovered || logoUrl ? "skippr:-translate-x-3" : "skippr:-translate-x-7"),
7335
7390
  style: { gap: isHovered ? 8 : 0 },
7336
7391
  children: [
@@ -7357,7 +7412,7 @@ function WelcomeBubble({
7357
7412
  const timer = setTimeout(onDismiss, 5000);
7358
7413
  return () => clearTimeout(timer);
7359
7414
  }, [onDismiss]);
7360
- return /* @__PURE__ */ jsxs15("button", {
7415
+ return /* @__PURE__ */ jsxs14("button", {
7361
7416
  type: "button",
7362
7417
  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"),
7363
7418
  onClick,
@@ -7485,12 +7540,12 @@ function MinimizedBubble({
7485
7540
  expandPanel();
7486
7541
  }
7487
7542
  };
7488
- return /* @__PURE__ */ jsxs15("div", {
7543
+ return /* @__PURE__ */ jsxs14("div", {
7489
7544
  ref: hoverContainerRef,
7490
7545
  style: { bottom: launcherBottomPx },
7491
7546
  className: cn("skippr:fixed skippr:z-[9999] skippr:touch-none", "skippr:flex skippr:items-center skippr:gap-2", position === "right" ? "skippr:right-3" : "skippr:left-3"),
7492
7547
  children: [
7493
- (modulePills.length > 0 || visibleGoals.length > 0) && /* @__PURE__ */ jsxs15("div", {
7548
+ (modulePills.length > 0 || visibleGoals.length > 0) && /* @__PURE__ */ jsxs14("div", {
7494
7549
  className: cn("skippr:absolute skippr:gap-2", popsDown ? "skippr:top-full skippr:mt-3 skippr:flex skippr:flex-col-reverse" : "skippr:bottom-full skippr:mb-3 skippr:flex skippr:flex-col", position === "right" ? "skippr:right-0 skippr:items-end" : "skippr:left-0 skippr:items-start"),
7495
7550
  children: [
7496
7551
  visibleGoals.map((goal, index2) => /* @__PURE__ */ jsx21(AdoptionBubble, {
@@ -7522,11 +7577,11 @@ function MinimizedBubble({
7522
7577
  onDismissWelcome();
7523
7578
  }
7524
7579
  }),
7525
- /* @__PURE__ */ jsxs15("div", {
7580
+ /* @__PURE__ */ jsxs14("div", {
7526
7581
  className: "skippr:relative",
7527
7582
  children: [
7528
7583
  isLauncherHovered && /* @__PURE__ */ jsx21(ConsentBubble, {
7529
- leadIn: "By starting a session",
7584
+ template: CONSENT_NOTICE_SESSION_START,
7530
7585
  className: cn("skippr:absolute skippr:bottom-[calc(100%+8px)]", position === "right" ? "skippr:right-0" : "skippr:left-0")
7531
7586
  }),
7532
7587
  /* @__PURE__ */ jsx21(IdleLauncher, {
@@ -8068,17 +8123,17 @@ function useMicLevel(enabled) {
8068
8123
  }
8069
8124
 
8070
8125
  // src/components/PausedCountdown.tsx
8071
- import { jsxs as jsxs16 } from "react/jsx-runtime";
8126
+ import { jsxs as jsxs15 } from "react/jsx-runtime";
8072
8127
  function PausedCountdown({ secondsRemaining }) {
8073
8128
  const minutes = Math.floor(secondsRemaining / 60);
8074
8129
  const seconds = String(secondsRemaining % 60).padStart(2, "0");
8075
- return /* @__PURE__ */ jsxs16("span", {
8130
+ return /* @__PURE__ */ jsxs15("span", {
8076
8131
  role: "timer",
8077
8132
  "aria-label": `Agent closes in ${secondsRemaining} seconds`,
8078
8133
  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]",
8079
8134
  children: [
8080
8135
  "Agent closes in",
8081
- /* @__PURE__ */ jsxs16("span", {
8136
+ /* @__PURE__ */ jsxs15("span", {
8082
8137
  className: "skippr:ml-1 skippr:font-semibold skippr:tabular-nums skippr:text-bubble",
8083
8138
  children: [
8084
8139
  minutes,
@@ -8091,15 +8146,15 @@ function PausedCountdown({ secondsRemaining }) {
8091
8146
  }
8092
8147
 
8093
8148
  // src/components/PushToTalkHint.tsx
8094
- import { jsx as jsx22, jsxs as jsxs17 } from "react/jsx-runtime";
8149
+ import { jsx as jsx22, jsxs as jsxs16 } from "react/jsx-runtime";
8095
8150
  function PushToTalkHint() {
8096
- return /* @__PURE__ */ jsxs17("div", {
8151
+ return /* @__PURE__ */ jsxs16("div", {
8097
8152
  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]"),
8098
8153
  children: [
8099
8154
  /* @__PURE__ */ jsx22("span", {
8100
8155
  children: "Hold the"
8101
8156
  }),
8102
- /* @__PURE__ */ jsxs17("kbd", {
8157
+ /* @__PURE__ */ jsxs16("kbd", {
8103
8158
  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",
8104
8159
  children: [
8105
8160
  /* @__PURE__ */ jsx22("span", {
@@ -8122,7 +8177,7 @@ function PushToTalkHint() {
8122
8177
  }
8123
8178
 
8124
8179
  // src/components/PushToTalkMic.tsx
8125
- import { jsx as jsx23, jsxs as jsxs18 } from "react/jsx-runtime";
8180
+ import { jsx as jsx23, jsxs as jsxs17 } from "react/jsx-runtime";
8126
8181
  function PushToTalkMic({
8127
8182
  isCapturingSpeech,
8128
8183
  showLabel,
@@ -8133,7 +8188,7 @@ function PushToTalkMic({
8133
8188
  const holdPushToTalk = usePointerHold(onStart, onCommit);
8134
8189
  const label = isCapturingSpeech ? "Release to send" : "Hold to talk";
8135
8190
  const withLabel = isCapturingSpeech || showLabel;
8136
- return /* @__PURE__ */ jsxs18("button", {
8191
+ return /* @__PURE__ */ jsxs17("button", {
8137
8192
  type: "button",
8138
8193
  "data-skippr-no-drag": "",
8139
8194
  onPointerDown: holdPushToTalk,
@@ -8170,9 +8225,9 @@ function PushToTalkMic({
8170
8225
  }
8171
8226
 
8172
8227
  // src/components/StopActionsIcon.tsx
8173
- import { jsx as jsx24, jsxs as jsxs19 } from "react/jsx-runtime";
8228
+ import { jsx as jsx24, jsxs as jsxs18 } from "react/jsx-runtime";
8174
8229
  function StopActionsIcon({ className }) {
8175
- return /* @__PURE__ */ jsxs19("svg", {
8230
+ return /* @__PURE__ */ jsxs18("svg", {
8176
8231
  viewBox: "0 0 24 24",
8177
8232
  fill: "none",
8178
8233
  stroke: "currentColor",
@@ -8196,12 +8251,12 @@ function StopActionsIcon({ className }) {
8196
8251
  }
8197
8252
 
8198
8253
  // src/components/TapToTalkMic.tsx
8199
- import { jsx as jsx25, jsxs as jsxs20 } from "react/jsx-runtime";
8254
+ import { jsx as jsx25, jsxs as jsxs19 } from "react/jsx-runtime";
8200
8255
  function TapToTalkMic({ isCapturingSpeech, showLabel, onToggle }) {
8201
8256
  const { barRefs, isTalking } = useMicLevel(isCapturingSpeech);
8202
8257
  const label = isCapturingSpeech ? "Tap to send" : "Tap to talk";
8203
8258
  const withLabel = isCapturingSpeech || showLabel;
8204
- return /* @__PURE__ */ jsxs20("button", {
8259
+ return /* @__PURE__ */ jsxs19("button", {
8205
8260
  type: "button",
8206
8261
  onClick: onToggle,
8207
8262
  "aria-label": "Tap to talk",
@@ -8237,7 +8292,7 @@ function TapToTalkMic({ isCapturingSpeech, showLabel, onToggle }) {
8237
8292
  }
8238
8293
 
8239
8294
  // src/components/SessionControlBar.tsx
8240
- import { jsx as jsx26, jsxs as jsxs21, Fragment as Fragment2 } from "react/jsx-runtime";
8295
+ import { jsx as jsx26, jsxs as jsxs20, Fragment as Fragment2 } from "react/jsx-runtime";
8241
8296
  var STANDBY_BAR_WIDTH = 168;
8242
8297
  var READY_BAR_WIDTH = 238;
8243
8298
  var PAUSED_BAR_WIDTH = 248;
@@ -8270,7 +8325,7 @@ function AgentActivity({
8270
8325
  noiseGate: AGENT_NOISE_GATE
8271
8326
  });
8272
8327
  const label = isActing ? "Working" : AGENT_STATE_LABELS[state] ?? "";
8273
- return /* @__PURE__ */ jsxs21("span", {
8328
+ return /* @__PURE__ */ jsxs20("span", {
8274
8329
  role: "status",
8275
8330
  className: "skippr:flex skippr:items-center skippr:gap-1.5 skippr:text-bubble",
8276
8331
  "aria-label": isActing ? "Agent is acting" : `Agent is ${state}`,
@@ -8280,7 +8335,7 @@ function AgentActivity({
8280
8335
  children: isActing ? /* @__PURE__ */ jsx26(MousePointerClick, {
8281
8336
  strokeWidth: 2,
8282
8337
  className: "skippr:size-5 skippr:[animation:skippr-finger-tap_1.1s_ease-in-out_infinite]"
8283
- }) : /* @__PURE__ */ jsxs21(Fragment2, {
8338
+ }) : /* @__PURE__ */ jsxs20(Fragment2, {
8284
8339
  children: [
8285
8340
  state === "speaking" && /* @__PURE__ */ jsx26("span", {
8286
8341
  className: "skippr:flex skippr:h-5 skippr:items-center skippr:gap-[2px]",
@@ -8292,7 +8347,7 @@ function AgentActivity({
8292
8347
  style: { height: AGENT_BAR_IDLE_HEIGHT_PX }
8293
8348
  }, index2))
8294
8349
  }),
8295
- state === "thinking" && /* @__PURE__ */ jsxs21("span", {
8350
+ state === "thinking" && /* @__PURE__ */ jsxs20("span", {
8296
8351
  className: "skippr:flex skippr:items-center skippr:gap-[3px]",
8297
8352
  children: [
8298
8353
  /* @__PURE__ */ jsx26("span", {
@@ -8306,7 +8361,7 @@ function AgentActivity({
8306
8361
  })
8307
8362
  ]
8308
8363
  }),
8309
- state === "listening" && /* @__PURE__ */ jsxs21("svg", {
8364
+ state === "listening" && /* @__PURE__ */ jsxs20("svg", {
8310
8365
  viewBox: "0 0 24 24",
8311
8366
  className: "skippr:size-5",
8312
8367
  fill: "none",
@@ -8451,7 +8506,7 @@ function SessionControlBar() {
8451
8506
  className: "skippr:size-5"
8452
8507
  })
8453
8508
  });
8454
- return /* @__PURE__ */ jsxs21("div", {
8509
+ return /* @__PURE__ */ jsxs20("div", {
8455
8510
  ref: controlBarRef,
8456
8511
  style: { bottom: launcherBottomPx },
8457
8512
  className: cn("skippr:fixed skippr:z-[9999] skippr:touch-none skippr:cursor-grab", position === "right" ? "skippr:right-3" : "skippr:left-3"),
@@ -8463,14 +8518,14 @@ function SessionControlBar() {
8463
8518
  children: "Listening…"
8464
8519
  })
8465
8520
  }),
8466
- /* @__PURE__ */ jsxs21("div", {
8521
+ /* @__PURE__ */ jsxs20("div", {
8467
8522
  style: { width: isReady && pushOrTapMicMode ? "auto" : barWidth },
8468
8523
  className: cn("skippr:group skippr:relative skippr:flex skippr:h-[54px] skippr:items-center skippr:justify-center skippr:gap-2", "skippr:rounded-[20px] skippr:bg-white skippr:p-2", "skippr:shadow-[0_10px_32px_rgba(0,0,0,0.18)] skippr:ring-1 skippr:ring-black/5", "skippr:transition-[width,margin] skippr:duration-300 skippr:ease-out", "skippr:[animation:skippr-toolset-pop_440ms_cubic-bezier(0.22,1,0.36,1)]", isReady && (position === "right" ? "skippr:mr-7" : "skippr:ml-7")),
8469
8524
  children: [
8470
- !isReady && /* @__PURE__ */ jsxs21("span", {
8525
+ !isReady && /* @__PURE__ */ jsxs20("span", {
8471
8526
  className: "skippr:flex skippr:h-[38px] skippr:items-center skippr:justify-center skippr:gap-2 skippr:text-[13px] skippr:font-medium skippr:text-bubble skippr:[animation:skippr-stage-fade_240ms_ease-out]",
8472
8527
  children: [
8473
- /* @__PURE__ */ jsxs21("span", {
8528
+ /* @__PURE__ */ jsxs20("span", {
8474
8529
  className: "skippr:flex skippr:items-center skippr:gap-[3px]",
8475
8530
  children: [
8476
8531
  /* @__PURE__ */ jsx26("span", {
@@ -8489,7 +8544,7 @@ function SessionControlBar() {
8489
8544
  })
8490
8545
  ]
8491
8546
  }),
8492
- isReady && /* @__PURE__ */ jsxs21("div", {
8547
+ isReady && /* @__PURE__ */ jsxs20("div", {
8493
8548
  className: cn("skippr:flex skippr:items-center skippr:gap-2 skippr:[animation:skippr-stage-fade_240ms_ease-out]", isHeld && "skippr:w-full skippr:justify-start"),
8494
8549
  children: [
8495
8550
  /* @__PURE__ */ jsx26("button", {
@@ -8506,16 +8561,16 @@ function SessionControlBar() {
8506
8561
  fill: "currentColor"
8507
8562
  })
8508
8563
  }),
8509
- isHeld ? /* @__PURE__ */ jsxs21(Fragment2, {
8564
+ isHeld ? /* @__PURE__ */ jsxs20(Fragment2, {
8510
8565
  children: [
8511
8566
  /* @__PURE__ */ jsx26(PausedCountdown, {
8512
8567
  secondsRemaining: countdown
8513
8568
  }),
8514
8569
  panelToggleButton
8515
8570
  ]
8516
- }) : /* @__PURE__ */ jsxs21(Fragment2, {
8571
+ }) : /* @__PURE__ */ jsxs20(Fragment2, {
8517
8572
  children: [
8518
- !textMode && pushOrTapMicMode && /* @__PURE__ */ jsxs21("div", {
8573
+ !textMode && pushOrTapMicMode && /* @__PURE__ */ jsxs20("div", {
8519
8574
  className: "skippr:flex skippr:h-[38px] skippr:items-center skippr:gap-2",
8520
8575
  children: [
8521
8576
  micMode === MIC_MODE.PushToTalk ? /* @__PURE__ */ jsx26(PushToTalkMic, {
@@ -8541,7 +8596,7 @@ function SessionControlBar() {
8541
8596
  })
8542
8597
  ]
8543
8598
  }),
8544
- !textMode && !pushOrTapMicMode && /* @__PURE__ */ jsxs21("div", {
8599
+ !textMode && !pushOrTapMicMode && /* @__PURE__ */ jsxs20("div", {
8545
8600
  className: "skippr:relative skippr:h-[38px]",
8546
8601
  style: { width: MIC_REGION_WIDTH },
8547
8602
  children: [
@@ -8554,7 +8609,7 @@ function SessionControlBar() {
8554
8609
  mediaStreamTrack: agentMediaStreamTrack
8555
8610
  })
8556
8611
  }),
8557
- /* @__PURE__ */ jsxs21("button", {
8612
+ /* @__PURE__ */ jsxs20("button", {
8558
8613
  type: "button",
8559
8614
  onClick: ifNotDragged(() => void toggleMute()),
8560
8615
  "aria-label": isMuted ? "Unmute" : "Mute",
@@ -8619,14 +8674,14 @@ function SessionControlBar() {
8619
8674
  "aria-label": "End session",
8620
8675
  "aria-busy": isPausing,
8621
8676
  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"),
8622
- children: /* @__PURE__ */ jsxs21("span", {
8677
+ children: /* @__PURE__ */ jsxs20("span", {
8623
8678
  className: "skippr:relative skippr:flex skippr:size-5 skippr:items-center skippr:justify-center",
8624
8679
  children: [
8625
8680
  /* @__PURE__ */ jsx26(X, {
8626
8681
  className: cn("skippr:size-4 skippr:transition-opacity skippr:duration-200", isPausing && "skippr:opacity-40"),
8627
8682
  strokeWidth: 2.5
8628
8683
  }),
8629
- isPausing && /* @__PURE__ */ jsxs21("svg", {
8684
+ isPausing && /* @__PURE__ */ jsxs20("svg", {
8630
8685
  viewBox: "0 0 24 24",
8631
8686
  fill: "none",
8632
8687
  "aria-hidden": "true",
@@ -9011,7 +9066,7 @@ function useTextMode() {
9011
9066
  }
9012
9067
 
9013
9068
  // src/components/ChatHeader.tsx
9014
- import { jsx as jsx28, jsxs as jsxs22 } from "react/jsx-runtime";
9069
+ import { jsx as jsx28, jsxs as jsxs21 } from "react/jsx-runtime";
9015
9070
  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";
9016
9071
  var TABS_PILL_ACTIVE = "skippr:bg-white skippr:text-[#2D2D3F] skippr:shadow-[0_1px_2px_rgba(45,45,63,0.08)]";
9017
9072
  function ChatHeader({ wasDraggedRef, draggable, headerRef }) {
@@ -9035,11 +9090,11 @@ function ChatHeader({ wasDraggedRef, draggable, headerRef }) {
9035
9090
  const displayedMode = agentMode ?? defaultModule?.mode ?? null;
9036
9091
  const showAgenda = displayedMode !== AGENT_MODE.AlwaysOn;
9037
9092
  const showToggle = isConnected && (sidebarTab === "chat" || !showAgenda);
9038
- return /* @__PURE__ */ jsxs22("header", {
9093
+ return /* @__PURE__ */ jsxs21("header", {
9039
9094
  ref: headerRef,
9040
9095
  className: cn("skippr:sticky skippr:top-0 skippr:z-10 skippr:flex skippr:shrink-0 skippr:items-center skippr:gap-[7px] skippr:border-b skippr:border-[rgba(45,45,63,0.08)] skippr:bg-white skippr:pl-[13px] skippr:pr-[9px] skippr:pt-[9px] skippr:pb-[8px]", draggable && "skippr:cursor-grab"),
9041
9096
  children: [
9042
- showAgenda ? /* @__PURE__ */ jsxs22("div", {
9097
+ showAgenda ? /* @__PURE__ */ jsxs21("div", {
9043
9098
  role: "tablist",
9044
9099
  "aria-label": "Panel",
9045
9100
  "data-skippr-no-drag": "",
@@ -9069,7 +9124,7 @@ function ChatHeader({ wasDraggedRef, draggable, headerRef }) {
9069
9124
  /* @__PURE__ */ jsx28("div", {
9070
9125
  className: "skippr:flex-1"
9071
9126
  }),
9072
- showToggle && /* @__PURE__ */ jsxs22("button", {
9127
+ showToggle && /* @__PURE__ */ jsxs21("button", {
9073
9128
  type: "button",
9074
9129
  disabled: isHeld,
9075
9130
  onClick: () => void toggleTextMode(),
@@ -9108,12 +9163,12 @@ function ChatHeader({ wasDraggedRef, draggable, headerRef }) {
9108
9163
  }
9109
9164
 
9110
9165
  // src/components/LoadingDots.tsx
9111
- import { jsx as jsx29, jsxs as jsxs23 } from "react/jsx-runtime";
9166
+ import { jsx as jsx29, jsxs as jsxs22 } from "react/jsx-runtime";
9112
9167
  function LoadingDots({ label }) {
9113
- return /* @__PURE__ */ jsxs23("div", {
9168
+ return /* @__PURE__ */ jsxs22("div", {
9114
9169
  className: "skippr:flex skippr:items-center skippr:gap-2 skippr:py-4",
9115
9170
  children: [
9116
- /* @__PURE__ */ jsxs23("div", {
9171
+ /* @__PURE__ */ jsxs22("div", {
9117
9172
  className: "skippr:flex skippr:gap-1",
9118
9173
  children: [
9119
9174
  /* @__PURE__ */ jsx29("span", {
@@ -9136,9 +9191,9 @@ function LoadingDots({ label }) {
9136
9191
  }
9137
9192
 
9138
9193
  // src/components/LogoMark.tsx
9139
- import { jsx as jsx30, jsxs as jsxs24 } from "react/jsx-runtime";
9194
+ import { jsx as jsx30, jsxs as jsxs23 } from "react/jsx-runtime";
9140
9195
  function LogoMark({ className, decorative }) {
9141
- return /* @__PURE__ */ jsxs24("svg", {
9196
+ return /* @__PURE__ */ jsxs23("svg", {
9142
9197
  viewBox: "21 21 109 109",
9143
9198
  fill: "none",
9144
9199
  xmlns: "http://www.w3.org/2000/svg",
@@ -9164,7 +9219,7 @@ import { useCallback as useCallback27, useLayoutEffect as useLayoutEffect3, useR
9164
9219
 
9165
9220
  // src/components/ChatInput.tsx
9166
9221
  import { useContext as useContext16, useEffect as useEffect34, useRef as useRef30, useState as useState26 } from "react";
9167
- import { jsx as jsx31, jsxs as jsxs25 } from "react/jsx-runtime";
9222
+ import { jsx as jsx31, jsxs as jsxs24 } from "react/jsx-runtime";
9168
9223
  var MAX_INPUT_HEIGHT = 60;
9169
9224
  function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
9170
9225
  const ctx = useContext16(LiveAgentContext);
@@ -9206,7 +9261,7 @@ function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
9206
9261
  handleSubmit(e);
9207
9262
  }
9208
9263
  }
9209
- return /* @__PURE__ */ jsxs25("form", {
9264
+ return /* @__PURE__ */ jsxs24("form", {
9210
9265
  onSubmit: handleSubmit,
9211
9266
  "data-skippr-no-drag": "",
9212
9267
  className: "skippr:flex skippr:items-center skippr:gap-[7px] skippr:border-t skippr:border-[rgba(45,45,63,0.08)] skippr:bg-white skippr:p-[9px]",
@@ -9241,7 +9296,7 @@ function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
9241
9296
  }
9242
9297
 
9243
9298
  // src/components/ChatMessage.tsx
9244
- import { jsx as jsx32, jsxs as jsxs26 } from "react/jsx-runtime";
9299
+ import { jsx as jsx32, jsxs as jsxs25 } from "react/jsx-runtime";
9245
9300
  function formatTimestamp(ts) {
9246
9301
  return new Date(ts).toLocaleTimeString("en-US", {
9247
9302
  hour: "numeric",
@@ -9253,7 +9308,7 @@ function ChatMessage({ message }) {
9253
9308
  const isAgent = message.role === "assistant";
9254
9309
  return /* @__PURE__ */ jsx32("div", {
9255
9310
  className: cn("skippr:flex skippr:gap-2", isAgent ? "skippr:items-start" : "skippr:justify-end"),
9256
- children: /* @__PURE__ */ jsxs26("div", {
9311
+ children: /* @__PURE__ */ jsxs25("div", {
9257
9312
  className: cn("skippr:flex skippr:max-w-[80%] skippr:flex-col", isAgent ? "skippr:items-start" : "skippr:items-end"),
9258
9313
  children: [
9259
9314
  /* @__PURE__ */ jsx32("div", {
@@ -9283,7 +9338,7 @@ async function copyToClipboard(text) {
9283
9338
  }
9284
9339
 
9285
9340
  // src/components/LinkCard.tsx
9286
- import { jsx as jsx33, jsxs as jsxs27 } from "react/jsx-runtime";
9341
+ import { jsx as jsx33, jsxs as jsxs26 } from "react/jsx-runtime";
9287
9342
  var COPIED_RESET_MS = 2000;
9288
9343
  var DISMISS_AFTER_COPY_MS = 3000;
9289
9344
  function LinkCard({ card, onDismiss }) {
@@ -9308,10 +9363,10 @@ function LinkCard({ card, onDismiss }) {
9308
9363
  setCopied(true);
9309
9364
  dismissTimerRef.current = setTimeout(onDismiss, DISMISS_AFTER_COPY_MS);
9310
9365
  }, [card.url, onDismiss]);
9311
- return /* @__PURE__ */ jsxs27("div", {
9366
+ return /* @__PURE__ */ jsxs26("div", {
9312
9367
  className: "skippr:rounded-2xl skippr:rounded-tl-md skippr:bg-card skippr:p-3.5 skippr:ring-2 skippr:ring-brand",
9313
9368
  children: [
9314
- /* @__PURE__ */ jsxs27("div", {
9369
+ /* @__PURE__ */ jsxs26("div", {
9315
9370
  className: "skippr:mb-1 skippr:flex skippr:items-start skippr:justify-between skippr:gap-2",
9316
9371
  children: [
9317
9372
  card.title && /* @__PURE__ */ jsx33("p", {
@@ -9334,10 +9389,10 @@ function LinkCard({ card, onDismiss }) {
9334
9389
  className: "skippr:mb-3 skippr:truncate skippr:text-xs skippr:text-muted-foreground",
9335
9390
  children: card.url
9336
9391
  }),
9337
- /* @__PURE__ */ jsxs27("div", {
9392
+ /* @__PURE__ */ jsxs26("div", {
9338
9393
  className: "skippr:flex skippr:gap-2",
9339
9394
  children: [
9340
- /* @__PURE__ */ jsxs27("a", {
9395
+ /* @__PURE__ */ jsxs26("a", {
9341
9396
  href: card.url,
9342
9397
  target: "_blank",
9343
9398
  rel: "noopener noreferrer",
@@ -9349,7 +9404,7 @@ function LinkCard({ card, onDismiss }) {
9349
9404
  "Open"
9350
9405
  ]
9351
9406
  }),
9352
- /* @__PURE__ */ jsxs27(Button, {
9407
+ /* @__PURE__ */ jsxs26(Button, {
9353
9408
  variant: "outline",
9354
9409
  className: "skippr:flex-1 skippr:py-2",
9355
9410
  onClick: handleCopy,
@@ -9371,7 +9426,7 @@ function LinkCard({ card, onDismiss }) {
9371
9426
 
9372
9427
  // src/components/PlanCard.tsx
9373
9428
  import { useEffect as useEffect36, useState as useState28 } from "react";
9374
- import { jsx as jsx34, jsxs as jsxs28 } from "react/jsx-runtime";
9429
+ import { jsx as jsx34, jsxs as jsxs27 } from "react/jsx-runtime";
9375
9430
  var APPROVE_MESSAGE = "Yes, go ahead.";
9376
9431
  var CANCEL_MESSAGE = "No, cancel that.";
9377
9432
  var COMPLETED_CARD_VISIBLE_MS = 2500;
@@ -9423,7 +9478,7 @@ function PlanCard({ plan, sendChatMessage, onDismiss }) {
9423
9478
  const timer = setTimeout(onDismiss, COMPLETED_CARD_VISIBLE_MS);
9424
9479
  return () => clearTimeout(timer);
9425
9480
  }, [plan.state, onDismiss]);
9426
- return /* @__PURE__ */ jsxs28("div", {
9481
+ return /* @__PURE__ */ jsxs27("div", {
9427
9482
  className: "skippr:rounded-2xl skippr:rounded-tl-md skippr:bg-card skippr:p-3.5 skippr:ring-2 skippr:ring-brand",
9428
9483
  children: [
9429
9484
  /* @__PURE__ */ jsx34("p", {
@@ -9432,7 +9487,7 @@ function PlanCard({ plan, sendChatMessage, onDismiss }) {
9432
9487
  }),
9433
9488
  /* @__PURE__ */ jsx34("div", {
9434
9489
  className: "skippr:space-y-2",
9435
- children: plan.steps.map((step) => /* @__PURE__ */ jsxs28("div", {
9490
+ children: plan.steps.map((step) => /* @__PURE__ */ jsxs27("div", {
9436
9491
  className: "skippr:flex skippr:items-center skippr:gap-2",
9437
9492
  children: [
9438
9493
  /* @__PURE__ */ jsx34(StepIcon, {
@@ -9445,10 +9500,10 @@ function PlanCard({ plan, sendChatMessage, onDismiss }) {
9445
9500
  ]
9446
9501
  }, step.index))
9447
9502
  }),
9448
- awaitingApproval && /* @__PURE__ */ jsxs28("div", {
9503
+ awaitingApproval && /* @__PURE__ */ jsxs27("div", {
9449
9504
  className: "skippr:mt-3.5 skippr:flex skippr:gap-2",
9450
9505
  children: [
9451
- /* @__PURE__ */ jsxs28(Button, {
9506
+ /* @__PURE__ */ jsxs27(Button, {
9452
9507
  className: "skippr:flex-1 skippr:gap-1.5 skippr:py-2",
9453
9508
  disabled: isApproving,
9454
9509
  onClick: approve,
@@ -9473,17 +9528,17 @@ function PlanCard({ plan, sendChatMessage, onDismiss }) {
9473
9528
  }
9474
9529
 
9475
9530
  // src/components/TypingIndicator.tsx
9476
- import { jsx as jsx35, jsxs as jsxs29 } from "react/jsx-runtime";
9531
+ import { jsx as jsx35, jsxs as jsxs28 } from "react/jsx-runtime";
9477
9532
  function TypingIndicator() {
9478
9533
  return /* @__PURE__ */ jsx35("div", {
9479
9534
  className: "skippr:flex skippr:items-start skippr:gap-2 skippr:animate-skippr-tab-fade",
9480
- children: /* @__PURE__ */ jsxs29("div", {
9535
+ children: /* @__PURE__ */ jsxs28("div", {
9481
9536
  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",
9482
9537
  children: [
9483
9538
  /* @__PURE__ */ jsx35("span", {
9484
9539
  children: "Agent is analyzing your screen"
9485
9540
  }),
9486
- /* @__PURE__ */ jsxs29("span", {
9541
+ /* @__PURE__ */ jsxs28("span", {
9487
9542
  className: "skippr:inline-flex skippr:items-center skippr:gap-[2px]",
9488
9543
  children: [
9489
9544
  /* @__PURE__ */ jsx35("span", {
@@ -9503,7 +9558,7 @@ function TypingIndicator() {
9503
9558
  }
9504
9559
 
9505
9560
  // src/components/MessageList.tsx
9506
- import { jsx as jsx36, jsxs as jsxs30 } from "react/jsx-runtime";
9561
+ import { jsx as jsx36, jsxs as jsxs29 } from "react/jsx-runtime";
9507
9562
  var BOTTOM_THRESHOLD_PX = 32;
9508
9563
  function MessageList({
9509
9564
  messages,
@@ -9562,13 +9617,13 @@ function MessageList({
9562
9617
  container.scrollTop = container.scrollHeight;
9563
9618
  }, [messages.length, lastMessage?.content]);
9564
9619
  const showTyping = isStreaming && lastMessage?.role === "assistant" && lastMessage.content === "";
9565
- return /* @__PURE__ */ jsxs30("div", {
9620
+ return /* @__PURE__ */ jsxs29("div", {
9566
9621
  className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col",
9567
9622
  children: [
9568
- /* @__PURE__ */ jsxs30("div", {
9623
+ /* @__PURE__ */ jsxs29("div", {
9569
9624
  className: "skippr:relative skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col",
9570
9625
  children: [
9571
- /* @__PURE__ */ jsxs30("div", {
9626
+ /* @__PURE__ */ jsxs29("div", {
9572
9627
  ref: containerRef,
9573
9628
  onScroll: handleScroll,
9574
9629
  "data-skippr-no-drag": "",
@@ -9625,7 +9680,7 @@ function MessageList({
9625
9680
 
9626
9681
  // src/components/SessionAgenda.tsx
9627
9682
  import { useContext as useContext17 } from "react";
9628
- import { jsx as jsx37, jsxs as jsxs31 } from "react/jsx-runtime";
9683
+ import { jsx as jsx37, jsxs as jsxs30 } from "react/jsx-runtime";
9629
9684
  function SessionAgenda({ phases, hasStarted }) {
9630
9685
  const ctx = useContext17(LiveAgentContext);
9631
9686
  const title = ctx?.activeModule?.name ?? "Agenda";
@@ -9642,17 +9697,17 @@ function SessionAgenda({ phases, hasStarted }) {
9642
9697
  const activeIndex = phases.findIndex((p) => p.status === "active");
9643
9698
  const currentStep = activeIndex >= 0 ? activeIndex + 1 : Math.min(completedCount + 1, total);
9644
9699
  const progressPct = Math.round(completedCount / total * 100);
9645
- return /* @__PURE__ */ jsxs31("div", {
9700
+ return /* @__PURE__ */ jsxs30("div", {
9646
9701
  className: "skippr:flex-1 skippr:overflow-y-auto skippr:p-[14px]",
9647
9702
  children: [
9648
- /* @__PURE__ */ jsxs31("div", {
9703
+ /* @__PURE__ */ jsxs30("div", {
9649
9704
  className: "skippr:mb-2 skippr:flex skippr:items-baseline skippr:justify-between",
9650
9705
  children: [
9651
9706
  /* @__PURE__ */ jsx37("span", {
9652
9707
  className: "skippr:text-[12.5px] skippr:font-semibold skippr:text-[#2D2D3F]",
9653
9708
  children: title
9654
9709
  }),
9655
- /* @__PURE__ */ jsxs31("span", {
9710
+ /* @__PURE__ */ jsxs30("span", {
9656
9711
  className: "skippr:text-[11px] skippr:font-semibold skippr:text-[var(--skippr-brand-deep)]",
9657
9712
  children: [
9658
9713
  "step ",
@@ -9678,7 +9733,7 @@ function SessionAgenda({ phases, hasStarted }) {
9678
9733
  phases.map((phase) => {
9679
9734
  const isActive = phase.status === "active";
9680
9735
  const isCompleted = phase.status === "completed";
9681
- return /* @__PURE__ */ jsxs31("div", {
9736
+ return /* @__PURE__ */ jsxs30("div", {
9682
9737
  className: "skippr:flex skippr:items-center skippr:gap-[9px] skippr:py-[5px]",
9683
9738
  children: [
9684
9739
  isCompleted ? /* @__PURE__ */ jsx37("span", {
@@ -9726,7 +9781,7 @@ function SessionWarningBanner({ remaining }) {
9726
9781
  }
9727
9782
 
9728
9783
  // src/components/Sidebar.tsx
9729
- import { jsx as jsx39, jsxs as jsxs32, Fragment as Fragment4 } from "react/jsx-runtime";
9784
+ import { jsx as jsx39, jsxs as jsxs31, Fragment as Fragment4 } from "react/jsx-runtime";
9730
9785
  var ATTRIBUTION_PREFIX = "Powered by";
9731
9786
  var ATTRIBUTION_BRAND = "Skippr";
9732
9787
  var ATTRIBUTION_URL = "https://www.skippr.ai/";
@@ -9813,7 +9868,7 @@ function Sidebar({
9813
9868
  }, [isSidebar, isPanelOpen, position]);
9814
9869
  if (splashReplacesPanel)
9815
9870
  return null;
9816
- return /* @__PURE__ */ jsxs32("div", {
9871
+ return /* @__PURE__ */ jsxs31("div", {
9817
9872
  ref: internalCtx?.panelRef,
9818
9873
  className: cn("skippr:fixed skippr:z-[9999]", "skippr:bg-card", "skippr:flex skippr:flex-col", "skippr:overflow-hidden", isFloating && "skippr:rounded-[16px] skippr:border skippr:border-[rgba(45,45,63,0.08)] skippr:shadow-[0_14px_34px_rgba(45,45,63,0.15),0_2px_6px_rgba(45,45,63,0.06)]", isFloating && "skippr:transition-[opacity,transform,height] skippr:duration-300 skippr:ease-in-out", anchor2 && panelTransformOrigin(anchor2.popsDown, anchor2.isLeftAligned), isFloating && !isPanelOpen && "skippr:scale-0 skippr:opacity-0 skippr:pointer-events-none", isFloating && isPanelOpen && "skippr:scale-100 skippr:opacity-100", followsPanel && "skippr:select-none", isSidebar && "skippr:top-0 skippr:h-full", isSidebar && "skippr:transition-[width] skippr:duration-300 skippr:ease-in-out", isSidebar && position === "right" && "skippr:right-0 skippr:border-l skippr:border-l-border", isSidebar && position === "left" && "skippr:left-0 skippr:border-r skippr:border-r-border", isSidebar && !isPanelOpen && "skippr:w-0 skippr:border-0"),
9819
9874
  style: { width: isPanelOpen ? SIDEBAR_WIDTH : undefined, ...floatingStyle },
@@ -9875,7 +9930,7 @@ function AuthenticatedContent({
9875
9930
  }) {
9876
9931
  const inSession = isConnected || isStarting || isPaused || isPausing;
9877
9932
  const effectiveTab = showAgenda ? activeTab : "chat";
9878
- return /* @__PURE__ */ jsxs32(Fragment4, {
9933
+ return /* @__PURE__ */ jsxs31(Fragment4, {
9879
9934
  children: [
9880
9935
  isConnected && /* @__PURE__ */ jsx39(ConnectedBanner, {}),
9881
9936
  /* @__PURE__ */ jsx39("div", {
@@ -9903,7 +9958,7 @@ function AuthenticatedContent({
9903
9958
  className: "skippr:shrink-0 skippr:border-t skippr:border-border",
9904
9959
  children: /* @__PURE__ */ jsx39("div", {
9905
9960
  className: "skippr:flex skippr:items-center skippr:justify-center skippr:px-4 skippr:pt-1 skippr:pb-0.5 skippr:text-[10px] skippr:text-muted-foreground",
9906
- children: /* @__PURE__ */ jsxs32("a", {
9961
+ children: /* @__PURE__ */ jsxs31("a", {
9907
9962
  href: ATTRIBUTION_URL,
9908
9963
  target: "_blank",
9909
9964
  rel: "noopener noreferrer",
@@ -9927,8 +9982,7 @@ function AuthenticatedContent({
9927
9982
  "data-skippr-no-drag": "",
9928
9983
  className: `skippr:shrink-0 skippr:px-2${hideControls ? " skippr:pb-4 skippr:border-t skippr:border-border skippr:pt-1" : " skippr:pb-1"}`,
9929
9984
  children: /* @__PURE__ */ jsx39(ConsentNotice, {
9930
- leadIn: "By continuing",
9931
- determiner: "the",
9985
+ template: CONSENT_NOTICE_CONTINUING,
9932
9986
  className: "skippr:whitespace-nowrap skippr:text-[10px]"
9933
9987
  })
9934
9988
  })
@@ -9936,7 +9990,7 @@ function AuthenticatedContent({
9936
9990
  });
9937
9991
  }
9938
9992
  function AuthError() {
9939
- return /* @__PURE__ */ jsxs32("div", {
9993
+ return /* @__PURE__ */ jsxs31("div", {
9940
9994
  className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:items-center skippr:justify-center skippr:px-6 skippr:py-4 skippr:text-center",
9941
9995
  children: [
9942
9996
  /* @__PURE__ */ jsx39(CircleAlert, {
@@ -9976,7 +10030,7 @@ function IdleHistory({
9976
10030
  })
9977
10031
  });
9978
10032
  }
9979
- return /* @__PURE__ */ jsxs32("div", {
10033
+ return /* @__PURE__ */ jsxs31("div", {
9980
10034
  className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col skippr:animate-skippr-tab-fade",
9981
10035
  children: [
9982
10036
  activeTab === "agenda" ? /* @__PURE__ */ jsx39("div", {
@@ -9991,11 +10045,11 @@ function IdleHistory({
9991
10045
  isStreaming: false,
9992
10046
  readOnly: true
9993
10047
  }),
9994
- (showTalk || error) && /* @__PURE__ */ jsxs32("div", {
10048
+ (showTalk || error) && /* @__PURE__ */ jsxs31("div", {
9995
10049
  "data-skippr-no-drag": "",
9996
10050
  className: "skippr:shrink-0 skippr:border-t skippr:border-border skippr:p-3",
9997
10051
  children: [
9998
- showTalk && /* @__PURE__ */ jsxs32("button", {
10052
+ showTalk && /* @__PURE__ */ jsxs31("button", {
9999
10053
  type: "button",
10000
10054
  onClick: onTalk,
10001
10055
  disabled: talkDisabled,
@@ -10056,9 +10110,9 @@ function ConnectedBody({
10056
10110
  import { useContext as useContext19 } from "react";
10057
10111
 
10058
10112
  // src/components/Logo.tsx
10059
- import { jsx as jsx40, jsxs as jsxs33 } from "react/jsx-runtime";
10113
+ import { jsx as jsx40, jsxs as jsxs32 } from "react/jsx-runtime";
10060
10114
  function Logo({ className, decorative }) {
10061
- return /* @__PURE__ */ jsxs33("svg", {
10115
+ return /* @__PURE__ */ jsxs32("svg", {
10062
10116
  width: "1em",
10063
10117
  height: "1em",
10064
10118
  viewBox: "0 0 200 200",
@@ -10075,7 +10129,7 @@ function Logo({ className, decorative }) {
10075
10129
  rx: "40",
10076
10130
  fill: "#2D2D3F"
10077
10131
  }),
10078
- /* @__PURE__ */ jsxs33("g", {
10132
+ /* @__PURE__ */ jsxs32("g", {
10079
10133
  transform: "translate(100 100) scale(0.8) translate(-100 -100)",
10080
10134
  children: [
10081
10135
  /* @__PURE__ */ jsx40("path", {
@@ -10168,6 +10222,7 @@ function resolveSplashPresentation(splash) {
10168
10222
  const width = splash?.width;
10169
10223
  const maxHeight = splash?.maxHeight;
10170
10224
  return {
10225
+ locale: splash?.locale ?? "en",
10171
10226
  copy,
10172
10227
  card: {
10173
10228
  width: width === undefined ? DEFAULT_SPLASH_WIDTH_PX : clampSplashWidth(width),
@@ -10327,12 +10382,7 @@ var CARD_FRAME = "skippr:rounded-[16px] skippr:bg-white skippr:shadow-[0_0_0_1px
10327
10382
 
10328
10383
  // src/components/SplashMediaSection.tsx
10329
10384
  import { useCallback as useCallback30, useRef as useRef34 } from "react";
10330
- import { jsx as jsx42, jsxs as jsxs34, Fragment as Fragment5 } from "react/jsx-runtime";
10331
- var SCREEN_NOTICE = "Required";
10332
- var ENABLE_ACTION = "Enable";
10333
- var MEDIA_ENABLED_STATUS = "Enabled";
10334
- var MIC_MUTED_STATUS = "Muted";
10335
- var MUTE_MIC_ACTION = "Mute microphone";
10385
+ import { jsx as jsx42, jsxs as jsxs33, Fragment as Fragment5 } from "react/jsx-runtime";
10336
10386
  var MEDIA_TRAILING_BOX = "skippr:shrink-0 skippr:rounded-full skippr:border skippr:px-[18px] skippr:py-[7px] skippr:text-[14px]";
10337
10387
  var MEDIA_PILL = `${MEDIA_TRAILING_BOX} skippr:cursor-pointer skippr:border-[rgba(45,45,63,0.12)] skippr:font-medium skippr:transition-colors`;
10338
10388
  var MEDIA_LINK = `${FOCUS_RING3} skippr:shrink-0 skippr:cursor-pointer skippr:rounded-[4px] skippr:text-[14px] skippr:font-medium skippr:text-brand-on-white skippr:underline-offset-2 skippr:hover:underline`;
@@ -10340,14 +10390,14 @@ var MEDIA_STATUS_SHAPE = "skippr:shrink-0 skippr:text-[14px]";
10340
10390
  var MEDIA_STATUS_MUTED = `${MEDIA_STATUS_SHAPE} skippr:text-[#6b6875]`;
10341
10391
  var MEDIA_STATUS_BRAND = `${MEDIA_STATUS_SHAPE} skippr:font-medium skippr:text-brand-on-white`;
10342
10392
  function MediaRow({ icon, label, subtext, trailing }) {
10343
- return /* @__PURE__ */ jsxs34("li", {
10393
+ return /* @__PURE__ */ jsxs33("li", {
10344
10394
  className: "skippr:flex skippr:items-center skippr:gap-3",
10345
10395
  children: [
10346
10396
  /* @__PURE__ */ jsx42("span", {
10347
10397
  className: ICON_TILE,
10348
10398
  children: icon
10349
10399
  }),
10350
- /* @__PURE__ */ jsxs34("span", {
10400
+ /* @__PURE__ */ jsxs33("span", {
10351
10401
  className: `skippr:flex-1 ${ROW_TEXT}`,
10352
10402
  children: [
10353
10403
  /* @__PURE__ */ jsx42("span", {
@@ -10368,12 +10418,12 @@ function MediaRow({ icon, label, subtext, trailing }) {
10368
10418
  ]
10369
10419
  });
10370
10420
  }
10371
- function EnableButton({ onEnable }) {
10421
+ function EnableButton({ label, onEnable }) {
10372
10422
  return /* @__PURE__ */ jsx42("button", {
10373
10423
  type: "button",
10374
10424
  onClick: onEnable,
10375
10425
  className: MEDIA_LINK,
10376
- children: ENABLE_ACTION
10426
+ children: label
10377
10427
  });
10378
10428
  }
10379
10429
  function MediaStatus({ label, className }) {
@@ -10384,6 +10434,7 @@ function MediaStatus({ label, className }) {
10384
10434
  }
10385
10435
  function MicToggle({
10386
10436
  muted,
10437
+ muteLabel,
10387
10438
  onToggle,
10388
10439
  toggleRef
10389
10440
  }) {
@@ -10392,7 +10443,7 @@ function MicToggle({
10392
10443
  type: "button",
10393
10444
  onClick: onToggle,
10394
10445
  "aria-pressed": muted,
10395
- "aria-label": MUTE_MIC_ACTION,
10446
+ "aria-label": muteLabel,
10396
10447
  className: `${MEDIA_PILL} ${FOCUS_RING3} skippr:flex skippr:items-center skippr:justify-center ${muted ? "skippr:bg-[#f2f0eb] skippr:text-[#6b6875]" : "skippr:text-[#2D2D3F] skippr:hover:bg-[#f2f0eb]"}`,
10397
10448
  children: muted ? /* @__PURE__ */ jsx42(MicOff, {
10398
10449
  className: ROW_ICON,
@@ -10405,18 +10456,23 @@ function MicToggle({
10405
10456
  })
10406
10457
  });
10407
10458
  }
10408
- function ScreenTrailing({ enabled, onEnable }) {
10459
+ function ScreenTrailing({
10460
+ copy,
10461
+ enabled,
10462
+ onEnable
10463
+ }) {
10409
10464
  if (enabled === null)
10410
10465
  return /* @__PURE__ */ jsx42(MediaStatus, {
10411
- label: SCREEN_NOTICE,
10466
+ label: copy.screenRequiredStatus,
10412
10467
  className: MEDIA_STATUS_BRAND
10413
10468
  });
10414
10469
  if (enabled)
10415
10470
  return /* @__PURE__ */ jsx42(MediaStatus, {
10416
- label: MEDIA_ENABLED_STATUS,
10471
+ label: copy.mediaEnabledStatus,
10417
10472
  className: MEDIA_STATUS_BRAND
10418
10473
  });
10419
10474
  return /* @__PURE__ */ jsx42(EnableButton, {
10475
+ label: copy.mediaEnableAction,
10420
10476
  onEnable
10421
10477
  });
10422
10478
  }
@@ -10440,14 +10496,14 @@ function SplashMediaSection({
10440
10496
  micFocusPending.current = true;
10441
10497
  enableMic();
10442
10498
  };
10443
- return /* @__PURE__ */ jsxs34("section", {
10499
+ return /* @__PURE__ */ jsxs33("section", {
10444
10500
  className: SECTION_BLOCK,
10445
10501
  children: [
10446
10502
  /* @__PURE__ */ jsx42("h3", {
10447
10503
  className: SECTION_HEADING,
10448
10504
  children: copy.mediaHeading
10449
10505
  }),
10450
- /* @__PURE__ */ jsxs34("ul", {
10506
+ /* @__PURE__ */ jsxs33("ul", {
10451
10507
  className: "skippr:flex skippr:flex-col skippr:gap-[14px]",
10452
10508
  children: [
10453
10509
  /* @__PURE__ */ jsx42(MediaRow, {
@@ -10458,19 +10514,21 @@ function SplashMediaSection({
10458
10514
  }),
10459
10515
  label: copy.micLabel,
10460
10516
  subtext: copy.micSubtext,
10461
- trailing: micEnabled ? /* @__PURE__ */ jsxs34(Fragment5, {
10517
+ trailing: micEnabled ? /* @__PURE__ */ jsxs33(Fragment5, {
10462
10518
  children: [
10463
10519
  /* @__PURE__ */ jsx42(MicToggle, {
10464
10520
  muted: startMuted,
10521
+ muteLabel: copy.muteMicAction,
10465
10522
  onToggle: toggleStartMuted,
10466
10523
  toggleRef: focusMicToggle
10467
10524
  }),
10468
10525
  /* @__PURE__ */ jsx42(MediaStatus, {
10469
- label: startMuted ? MIC_MUTED_STATUS : MEDIA_ENABLED_STATUS,
10526
+ label: startMuted ? copy.micMutedStatus : copy.mediaEnabledStatus,
10470
10527
  className: startMuted ? MEDIA_STATUS_MUTED : MEDIA_STATUS_BRAND
10471
10528
  })
10472
10529
  ]
10473
10530
  }) : /* @__PURE__ */ jsx42(EnableButton, {
10531
+ label: copy.mediaEnableAction,
10474
10532
  onEnable: grantMic
10475
10533
  })
10476
10534
  }),
@@ -10483,6 +10541,7 @@ function SplashMediaSection({
10483
10541
  label: copy.screenLabel,
10484
10542
  subtext: copy.screenSubtext,
10485
10543
  trailing: /* @__PURE__ */ jsx42(ScreenTrailing, {
10544
+ copy,
10486
10545
  enabled: screenEnabled,
10487
10546
  onEnable: enableScreen
10488
10547
  })
@@ -10494,16 +10553,16 @@ function SplashMediaSection({
10494
10553
  }
10495
10554
 
10496
10555
  // src/components/SplashOptOut.tsx
10497
- import { jsx as jsx43, jsxs as jsxs35 } from "react/jsx-runtime";
10556
+ import { jsx as jsx43, jsxs as jsxs34 } from "react/jsx-runtime";
10498
10557
  function SplashOptOut({
10499
10558
  label,
10500
10559
  checked,
10501
10560
  onToggle
10502
10561
  }) {
10503
- return /* @__PURE__ */ jsxs35("label", {
10562
+ return /* @__PURE__ */ jsxs34("label", {
10504
10563
  className: "skippr:mt-2 skippr:flex skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:gap-2 skippr:py-1",
10505
10564
  children: [
10506
- /* @__PURE__ */ jsxs35("span", {
10565
+ /* @__PURE__ */ jsxs34("span", {
10507
10566
  className: "skippr:relative skippr:flex skippr:size-4 skippr:shrink-0 skippr:items-center skippr:justify-center",
10508
10567
  children: [
10509
10568
  /* @__PURE__ */ jsx43("input", {
@@ -10528,19 +10587,16 @@ function SplashOptOut({
10528
10587
  }
10529
10588
 
10530
10589
  // src/components/SplashAlwaysOn.tsx
10531
- import { jsx as jsx44, jsxs as jsxs36 } from "react/jsx-runtime";
10532
- var ATTRIBUTION_PREFIX2 = "AI Agent Powered by";
10590
+ import { jsx as jsx44, jsxs as jsxs35 } from "react/jsx-runtime";
10533
10591
  var ATTRIBUTION_BRAND2 = "Skippr";
10534
10592
  var ATTRIBUTION_URL2 = "https://www.skippr.ai/";
10535
- var CLOSE_LABEL = "Close";
10536
- var CONSENT_LEAD_IN = "By starting a session";
10537
10593
  function TipRow({
10538
10594
  title,
10539
10595
  subtext,
10540
10596
  onStart
10541
10597
  }) {
10542
10598
  return /* @__PURE__ */ jsx44("li", {
10543
- children: /* @__PURE__ */ jsxs36("button", {
10599
+ children: /* @__PURE__ */ jsxs35("button", {
10544
10600
  type: "button",
10545
10601
  onClick: onStart,
10546
10602
  className: `${FOCUS_RING3} skippr:flex skippr:w-full skippr:cursor-pointer skippr:items-start skippr:gap-3 skippr:rounded-[11px] skippr:text-left skippr:transition-colors skippr:hover:bg-[rgba(45,45,63,0.04)]`,
@@ -10553,7 +10609,7 @@ function TipRow({
10553
10609
  "aria-hidden": true
10554
10610
  })
10555
10611
  }),
10556
- /* @__PURE__ */ jsxs36("span", {
10612
+ /* @__PURE__ */ jsxs35("span", {
10557
10613
  className: ROW_TEXT,
10558
10614
  children: [
10559
10615
  /* @__PURE__ */ jsx44("span", {
@@ -10591,18 +10647,19 @@ function SplashAlwaysOn({
10591
10647
  ctaRef
10592
10648
  }) {
10593
10649
  const { copy, card } = presentation;
10594
- return /* @__PURE__ */ jsxs36("section", {
10650
+ return /* @__PURE__ */ jsxs35("section", {
10595
10651
  "aria-label": agentName,
10652
+ lang: presentation.locale,
10596
10653
  style: { maxWidth: card.width, maxHeight: `${card.maxHeight}vh` },
10597
10654
  className: `${CARD_SHELL} ${CARD_FRAME}`,
10598
10655
  children: [
10599
- /* @__PURE__ */ jsxs36("div", {
10656
+ /* @__PURE__ */ jsxs35("div", {
10600
10657
  className: "skippr:flex skippr:shrink-0 skippr:items-start skippr:justify-between skippr:gap-3 skippr:border-b skippr:border-[rgba(45,45,63,0.06)] skippr:bg-[rgba(45,45,63,0.03)] skippr:px-[22px] skippr:pt-5 skippr:pb-4",
10601
10658
  children: [
10602
- /* @__PURE__ */ jsxs36("div", {
10659
+ /* @__PURE__ */ jsxs35("div", {
10603
10660
  className: "skippr:flex skippr:min-w-0 skippr:flex-col skippr:gap-1",
10604
10661
  children: [
10605
- /* @__PURE__ */ jsxs36("span", {
10662
+ /* @__PURE__ */ jsxs35("span", {
10606
10663
  className: "skippr:flex skippr:min-w-0 skippr:items-center skippr:gap-1.5 skippr:text-[#2D2D3F]",
10607
10664
  children: [
10608
10665
  headerIconUrl ? /* @__PURE__ */ jsx44("img", {
@@ -10620,7 +10677,7 @@ function SplashAlwaysOn({
10620
10677
  })
10621
10678
  ]
10622
10679
  }),
10623
- attributionVisible && /* @__PURE__ */ jsxs36("a", {
10680
+ attributionVisible && /* @__PURE__ */ jsxs35("a", {
10624
10681
  href: ATTRIBUTION_URL2,
10625
10682
  target: "_blank",
10626
10683
  rel: "noopener noreferrer",
@@ -10630,7 +10687,7 @@ function SplashAlwaysOn({
10630
10687
  decorative: true,
10631
10688
  className: "skippr:size-[13px]"
10632
10689
  }),
10633
- ATTRIBUTION_PREFIX2,
10690
+ copy.attributionPrefix,
10634
10691
  " ",
10635
10692
  /* @__PURE__ */ jsx44("span", {
10636
10693
  className: "skippr:font-medium skippr:text-[#2D2D3F] skippr:underline skippr:underline-offset-2",
@@ -10643,7 +10700,7 @@ function SplashAlwaysOn({
10643
10700
  /* @__PURE__ */ jsx44("button", {
10644
10701
  type: "button",
10645
10702
  onClick: dismiss,
10646
- "aria-label": CLOSE_LABEL,
10703
+ "aria-label": copy.closeLabel,
10647
10704
  className: `${FOCUS_RING3} skippr:ml-auto skippr:flex skippr:size-6 skippr:shrink-0 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:text-[#6b6875] skippr:transition-colors skippr:hover:bg-[#f2f0eb] skippr:hover:text-[#2D2D3F]`,
10648
10705
  children: /* @__PURE__ */ jsx44(X, {
10649
10706
  className: "skippr:size-4",
@@ -10653,11 +10710,11 @@ function SplashAlwaysOn({
10653
10710
  })
10654
10711
  ]
10655
10712
  }),
10656
- /* @__PURE__ */ jsxs36("div", {
10713
+ /* @__PURE__ */ jsxs35("div", {
10657
10714
  tabIndex: 0,
10658
10715
  className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col skippr:gap-[14px] skippr:overflow-y-auto skippr:px-[22px] skippr:pt-[18px]",
10659
10716
  children: [
10660
- /* @__PURE__ */ jsxs36("section", {
10717
+ /* @__PURE__ */ jsxs35("section", {
10661
10718
  className: SECTION_BLOCK,
10662
10719
  children: [
10663
10720
  /* @__PURE__ */ jsx44("h3", {
@@ -10689,10 +10746,10 @@ function SplashAlwaysOn({
10689
10746
  })
10690
10747
  ]
10691
10748
  }),
10692
- /* @__PURE__ */ jsxs36("div", {
10749
+ /* @__PURE__ */ jsxs35("div", {
10693
10750
  className: "skippr:shrink-0 skippr:px-[22px] skippr:pt-[22px] skippr:pb-[22px]",
10694
10751
  children: [
10695
- /* @__PURE__ */ jsxs36("button", {
10752
+ /* @__PURE__ */ jsxs35("button", {
10696
10753
  ref: ctaRef,
10697
10754
  type: "button",
10698
10755
  onClick: start,
@@ -10712,7 +10769,7 @@ function SplashAlwaysOn({
10712
10769
  onToggle: toggleOptOut
10713
10770
  }),
10714
10771
  /* @__PURE__ */ jsx44(ConsentNotice, {
10715
- leadIn: CONSENT_LEAD_IN,
10772
+ template: copy.consentNotice,
10716
10773
  className: "skippr:mt-3"
10717
10774
  })
10718
10775
  ]
@@ -10722,12 +10779,9 @@ function SplashAlwaysOn({
10722
10779
  }
10723
10780
 
10724
10781
  // src/components/SplashPrimary.tsx
10725
- import { jsx as jsx45, jsxs as jsxs37, Fragment as Fragment6 } from "react/jsx-runtime";
10726
- var ATTRIBUTION_PREFIX3 = "AI Agent Powered by";
10782
+ import { jsx as jsx45, jsxs as jsxs36, Fragment as Fragment6 } from "react/jsx-runtime";
10727
10783
  var ATTRIBUTION_BRAND3 = "Skippr";
10728
10784
  var ATTRIBUTION_URL3 = "https://www.skippr.ai/";
10729
- var CLOSE_LABEL2 = "Close";
10730
- var CONSENT_LEAD_IN2 = "By starting a session";
10731
10785
  var GLYPH_COMPONENT = {
10732
10786
  [SPLASH_SECTION_GLYPH.Route]: Route,
10733
10787
  [SPLASH_SECTION_GLYPH.Messages]: MessagesSquare,
@@ -10735,7 +10789,7 @@ var GLYPH_COMPONENT = {
10735
10789
  };
10736
10790
  function SectionRow({ iconUrl, glyph, title, description }) {
10737
10791
  const Glyph = glyph ? GLYPH_COMPONENT[glyph] : Sparkles;
10738
- return /* @__PURE__ */ jsxs37("li", {
10792
+ return /* @__PURE__ */ jsxs36("li", {
10739
10793
  className: "skippr:flex skippr:items-start skippr:gap-3",
10740
10794
  children: [
10741
10795
  /* @__PURE__ */ jsx45("span", {
@@ -10750,7 +10804,7 @@ function SectionRow({ iconUrl, glyph, title, description }) {
10750
10804
  "aria-hidden": true
10751
10805
  })
10752
10806
  }),
10753
- /* @__PURE__ */ jsxs37("span", {
10807
+ /* @__PURE__ */ jsxs36("span", {
10754
10808
  className: ROW_TEXT,
10755
10809
  children: [
10756
10810
  /* @__PURE__ */ jsx45("span", {
@@ -10790,18 +10844,19 @@ function SplashPrimary({
10790
10844
  ctaRef
10791
10845
  }) {
10792
10846
  const { copy, card } = presentation;
10793
- return /* @__PURE__ */ jsxs37("section", {
10847
+ return /* @__PURE__ */ jsxs36("section", {
10794
10848
  "aria-label": agentName,
10849
+ lang: presentation.locale,
10795
10850
  style: { maxWidth: card.width, maxHeight: `${card.maxHeight}vh` },
10796
10851
  className: `${CARD_SHELL} ${CARD_FRAME}`,
10797
10852
  children: [
10798
- /* @__PURE__ */ jsxs37("div", {
10853
+ /* @__PURE__ */ jsxs36("div", {
10799
10854
  className: "skippr:flex skippr:shrink-0 skippr:items-start skippr:justify-between skippr:gap-3 skippr:border-b skippr:border-[rgba(45,45,63,0.06)] skippr:bg-[rgba(45,45,63,0.03)] skippr:px-[22px] skippr:pt-5 skippr:pb-4",
10800
10855
  children: [
10801
- /* @__PURE__ */ jsxs37("div", {
10856
+ /* @__PURE__ */ jsxs36("div", {
10802
10857
  className: "skippr:flex skippr:min-w-0 skippr:flex-col skippr:gap-1",
10803
10858
  children: [
10804
- /* @__PURE__ */ jsxs37("span", {
10859
+ /* @__PURE__ */ jsxs36("span", {
10805
10860
  className: "skippr:flex skippr:min-w-0 skippr:items-center skippr:gap-1.5 skippr:text-[#2D2D3F]",
10806
10861
  children: [
10807
10862
  headerIconUrl ? /* @__PURE__ */ jsx45("img", {
@@ -10819,7 +10874,7 @@ function SplashPrimary({
10819
10874
  })
10820
10875
  ]
10821
10876
  }),
10822
- attributionVisible && /* @__PURE__ */ jsxs37("a", {
10877
+ attributionVisible && /* @__PURE__ */ jsxs36("a", {
10823
10878
  href: ATTRIBUTION_URL3,
10824
10879
  target: "_blank",
10825
10880
  rel: "noopener noreferrer",
@@ -10829,7 +10884,7 @@ function SplashPrimary({
10829
10884
  decorative: true,
10830
10885
  className: "skippr:size-[13px]"
10831
10886
  }),
10832
- ATTRIBUTION_PREFIX3,
10887
+ copy.attributionPrefix,
10833
10888
  " ",
10834
10889
  /* @__PURE__ */ jsx45("span", {
10835
10890
  className: "skippr:font-medium skippr:text-[#2D2D3F] skippr:underline skippr:underline-offset-2",
@@ -10842,7 +10897,7 @@ function SplashPrimary({
10842
10897
  /* @__PURE__ */ jsx45("button", {
10843
10898
  type: "button",
10844
10899
  onClick: dismiss,
10845
- "aria-label": CLOSE_LABEL2,
10900
+ "aria-label": copy.closeLabel,
10846
10901
  className: `${FOCUS_RING3} skippr:ml-auto skippr:flex skippr:size-6 skippr:shrink-0 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:text-[#6b6875] skippr:transition-colors skippr:hover:bg-[#f2f0eb] skippr:hover:text-[#2D2D3F]`,
10847
10902
  children: /* @__PURE__ */ jsx45(X, {
10848
10903
  className: "skippr:size-4",
@@ -10852,11 +10907,11 @@ function SplashPrimary({
10852
10907
  })
10853
10908
  ]
10854
10909
  }),
10855
- /* @__PURE__ */ jsxs37("div", {
10910
+ /* @__PURE__ */ jsxs36("div", {
10856
10911
  tabIndex: 0,
10857
10912
  className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col skippr:gap-[14px] skippr:overflow-y-auto skippr:px-[22px] skippr:pt-[18px]",
10858
10913
  children: [
10859
- intent === SPLASH_INTENT.Start ? sections.length > 0 && /* @__PURE__ */ jsxs37("section", {
10914
+ intent === SPLASH_INTENT.Start ? sections.length > 0 && /* @__PURE__ */ jsxs36("section", {
10860
10915
  className: SECTION_BLOCK,
10861
10916
  children: [
10862
10917
  /* @__PURE__ */ jsx45("h3", {
@@ -10870,16 +10925,16 @@ function SplashPrimary({
10870
10925
  }, section.id))
10871
10926
  })
10872
10927
  ]
10873
- }) : /* @__PURE__ */ jsxs37(Fragment6, {
10928
+ }) : /* @__PURE__ */ jsxs36(Fragment6, {
10874
10929
  children: [
10875
- lastCompletedPhase && /* @__PURE__ */ jsxs37("section", {
10930
+ lastCompletedPhase && /* @__PURE__ */ jsxs36("section", {
10876
10931
  className: SECTION_BLOCK,
10877
10932
  children: [
10878
10933
  /* @__PURE__ */ jsx45("h3", {
10879
10934
  className: SECTION_HEADING,
10880
10935
  children: copy.lastAccomplishmentHeading
10881
10936
  }),
10882
- /* @__PURE__ */ jsxs37("div", {
10937
+ /* @__PURE__ */ jsxs36("div", {
10883
10938
  className: "skippr:flex skippr:items-start skippr:gap-3",
10884
10939
  children: [
10885
10940
  /* @__PURE__ */ jsx45("span", {
@@ -10890,7 +10945,7 @@ function SplashPrimary({
10890
10945
  "aria-hidden": true
10891
10946
  })
10892
10947
  }),
10893
- /* @__PURE__ */ jsxs37("span", {
10948
+ /* @__PURE__ */ jsxs36("span", {
10894
10949
  className: ROW_TEXT,
10895
10950
  children: [
10896
10951
  /* @__PURE__ */ jsx45("span", {
@@ -10907,7 +10962,7 @@ function SplashPrimary({
10907
10962
  })
10908
10963
  ]
10909
10964
  }),
10910
- upcomingPhases.length > 0 && /* @__PURE__ */ jsxs37("section", {
10965
+ upcomingPhases.length > 0 && /* @__PURE__ */ jsxs36("section", {
10911
10966
  className: SECTION_BLOCK,
10912
10967
  children: [
10913
10968
  /* @__PURE__ */ jsx45("h3", {
@@ -10916,14 +10971,14 @@ function SplashPrimary({
10916
10971
  }),
10917
10972
  /* @__PURE__ */ jsx45("ol", {
10918
10973
  className: "skippr:flex skippr:flex-col skippr:gap-3",
10919
- children: upcomingPhases.map((phase, index2) => /* @__PURE__ */ jsxs37("li", {
10974
+ children: upcomingPhases.map((phase, index2) => /* @__PURE__ */ jsxs36("li", {
10920
10975
  className: "skippr:flex skippr:items-start skippr:gap-3",
10921
10976
  children: [
10922
10977
  /* @__PURE__ */ jsx45("span", {
10923
10978
  className: "skippr:flex skippr:size-[26px] skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-[#f2f0eb] skippr:text-[12px] skippr:font-semibold skippr:text-[#6b6875]",
10924
10979
  children: index2 + 1
10925
10980
  }),
10926
- /* @__PURE__ */ jsxs37("span", {
10981
+ /* @__PURE__ */ jsxs36("span", {
10927
10982
  className: ROW_TEXT,
10928
10983
  children: [
10929
10984
  /* @__PURE__ */ jsx45("span", {
@@ -10954,10 +11009,10 @@ function SplashPrimary({
10954
11009
  })
10955
11010
  ]
10956
11011
  }),
10957
- /* @__PURE__ */ jsxs37("div", {
11012
+ /* @__PURE__ */ jsxs36("div", {
10958
11013
  className: "skippr:shrink-0 skippr:px-[22px] skippr:pt-[22px] skippr:pb-[22px]",
10959
11014
  children: [
10960
- /* @__PURE__ */ jsxs37("button", {
11015
+ /* @__PURE__ */ jsxs36("button", {
10961
11016
  ref: ctaRef,
10962
11017
  type: "button",
10963
11018
  onClick: start,
@@ -10983,7 +11038,7 @@ function SplashPrimary({
10983
11038
  onToggle: toggleOptOut
10984
11039
  }),
10985
11040
  /* @__PURE__ */ jsx45(ConsentNotice, {
10986
- leadIn: CONSENT_LEAD_IN2,
11041
+ template: copy.consentNotice,
10987
11042
  className: "skippr:mt-3"
10988
11043
  })
10989
11044
  ]
@@ -11427,7 +11482,7 @@ function useVoiceBarDrag(containerRef, onDrop, followRefs, reportDragging) {
11427
11482
 
11428
11483
  // src/components/VoiceBarChatLine.tsx
11429
11484
  import { useCallback as useCallback32, useContext as useContext25, useEffect as useEffect42, useRef as useRef39, useState as useState33 } from "react";
11430
- import { jsx as jsx48, jsxs as jsxs38 } from "react/jsx-runtime";
11485
+ import { jsx as jsx48, jsxs as jsxs37 } from "react/jsx-runtime";
11431
11486
  var IDLE_HIDE_MS = 6000;
11432
11487
  function VoiceBarChatLine({
11433
11488
  popsDown,
@@ -11476,7 +11531,7 @@ function VoiceBarChatLine({
11476
11531
  width: 255,
11477
11532
  ...popsDown ? { top: "calc(100% + 12px)" } : { bottom: "calc(100% + 12px)" }
11478
11533
  };
11479
- return /* @__PURE__ */ jsxs38("div", {
11534
+ return /* @__PURE__ */ jsxs37("div", {
11480
11535
  style: embedded ? undefined : style,
11481
11536
  onPointerDown: (event) => event.stopPropagation(),
11482
11537
  className: cn("skippr:flex skippr:items-center skippr:gap-[7px] skippr:py-[4px] skippr:pl-[13px] skippr:pr-[5px]", !embedded && "skippr:z-[4] skippr:rounded-[12px] skippr:border skippr:border-[rgba(45,45,63,0.08)] skippr:bg-white skippr:shadow-[0_10px_26px_rgba(45,45,63,0.13),0_2px_6px_rgba(45,45,63,0.05)] skippr:[animation:skippr-fade-in_0.16s_ease]"),
@@ -11520,7 +11575,7 @@ function VoiceBarChatLine({
11520
11575
 
11521
11576
  // src/components/VoiceBarLinkCard.tsx
11522
11577
  import { useCallback as useCallback33, useEffect as useEffect43, useRef as useRef40, useState as useState34 } from "react";
11523
- import { jsx as jsx49, jsxs as jsxs39 } from "react/jsx-runtime";
11578
+ import { jsx as jsx49, jsxs as jsxs38 } from "react/jsx-runtime";
11524
11579
  var COPIED_RESET_MS2 = 2000;
11525
11580
  var DISMISS_AFTER_COPY_MS2 = 3000;
11526
11581
  function VoiceBarLinkCard({ card, onDismiss }) {
@@ -11545,7 +11600,7 @@ function VoiceBarLinkCard({ card, onDismiss }) {
11545
11600
  setCopied(true);
11546
11601
  dismissTimerRef.current = setTimeout(onDismiss, DISMISS_AFTER_COPY_MS2);
11547
11602
  }, [card.url, onDismiss]);
11548
- return /* @__PURE__ */ jsxs39("div", {
11603
+ return /* @__PURE__ */ jsxs38("div", {
11549
11604
  className: "skippr:relative skippr:w-[225px] skippr:rounded-[14px] skippr:border skippr:border-[rgba(45,45,63,0.08)] skippr:bg-white skippr:shadow-[0_10px_28px_rgba(45,45,63,0.16)] skippr:[animation:skippr-tip-in_360ms_cubic-bezier(0.34,1.3,0.64,1)]",
11550
11605
  children: [
11551
11606
  /* @__PURE__ */ jsx49("button", {
@@ -11558,17 +11613,17 @@ function VoiceBarLinkCard({ card, onDismiss }) {
11558
11613
  strokeWidth: 2.5
11559
11614
  })
11560
11615
  }),
11561
- /* @__PURE__ */ jsxs39("div", {
11616
+ /* @__PURE__ */ jsxs38("div", {
11562
11617
  className: "skippr:px-[12px] skippr:pb-[10px] skippr:pt-[10px]",
11563
11618
  children: [
11564
11619
  /* @__PURE__ */ jsx49("p", {
11565
11620
  className: "skippr:mr-[22px] skippr:truncate skippr:text-[10px] skippr:text-[#8b877f]",
11566
11621
  children: card.url
11567
11622
  }),
11568
- /* @__PURE__ */ jsxs39("div", {
11623
+ /* @__PURE__ */ jsxs38("div", {
11569
11624
  className: "skippr:mt-[9px] skippr:flex skippr:gap-[8px]",
11570
11625
  children: [
11571
- /* @__PURE__ */ jsxs39("a", {
11626
+ /* @__PURE__ */ jsxs38("a", {
11572
11627
  href: card.url,
11573
11628
  target: "_blank",
11574
11629
  rel: "noopener noreferrer",
@@ -11581,7 +11636,7 @@ function VoiceBarLinkCard({ card, onDismiss }) {
11581
11636
  "open"
11582
11637
  ]
11583
11638
  }),
11584
- /* @__PURE__ */ jsxs39("button", {
11639
+ /* @__PURE__ */ jsxs38("button", {
11585
11640
  type: "button",
11586
11641
  onClick: handleCopy,
11587
11642
  "aria-label": "Copy link",
@@ -11607,7 +11662,7 @@ function VoiceBarLinkCard({ card, onDismiss }) {
11607
11662
 
11608
11663
  // src/components/VoiceBarNotification.tsx
11609
11664
  import { useEffect as useEffect44, useRef as useRef41, useState as useState35 } from "react";
11610
- import { jsx as jsx50, jsxs as jsxs40 } from "react/jsx-runtime";
11665
+ import { jsx as jsx50, jsxs as jsxs39 } from "react/jsx-runtime";
11611
11666
  function VoiceBarNotification({ notifications, pos, onDismiss }) {
11612
11667
  const [index2, setIndex] = useState35(0);
11613
11668
  const [paused, setPaused] = useState35(false);
@@ -11655,7 +11710,7 @@ function VoiceBarNotification({ notifications, pos, onDismiss }) {
11655
11710
  return /* @__PURE__ */ jsx50("div", {
11656
11711
  style: wrapperStyle,
11657
11712
  "data-skippr-no-drag": "",
11658
- children: /* @__PURE__ */ jsxs40("div", {
11713
+ children: /* @__PURE__ */ jsxs39("div", {
11659
11714
  ref: cardRef,
11660
11715
  className: "skippr:flex skippr:w-[255px] skippr:items-center skippr:gap-[8px] skippr:rounded-[14px] skippr:border skippr:border-[rgba(45,45,63,0.08)] skippr:bg-white skippr:px-[11px] skippr:py-[3px] skippr:shadow-[0_10px_28px_rgba(45,45,63,0.16)] skippr:[animation:skippr-tip-in_360ms_cubic-bezier(0.34,1.3,0.64,1)]",
11661
11716
  children: [
@@ -11675,7 +11730,7 @@ function VoiceBarNotification({ notifications, pos, onDismiss }) {
11675
11730
  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]",
11676
11731
  children: "start"
11677
11732
  }),
11678
- hasMultiple && /* @__PURE__ */ jsxs40("button", {
11733
+ hasMultiple && /* @__PURE__ */ jsxs39("button", {
11679
11734
  type: "button",
11680
11735
  onClick: () => setIndex((current) => (current + 1) % notifications.length),
11681
11736
  "aria-label": "Next",
@@ -11698,7 +11753,7 @@ function VoiceBarNotification({ notifications, pos, onDismiss }) {
11698
11753
 
11699
11754
  // src/components/VoiceBarPlanCard.tsx
11700
11755
  import { useEffect as useEffect45, useState as useState36 } from "react";
11701
- import { jsx as jsx51, jsxs as jsxs41 } from "react/jsx-runtime";
11756
+ import { jsx as jsx51, jsxs as jsxs40 } from "react/jsx-runtime";
11702
11757
  var APPROVING_RESET_MS2 = 8000;
11703
11758
  function StepIndicator({ step }) {
11704
11759
  if (step.status === "done") {
@@ -11760,10 +11815,10 @@ function VoiceBarPlanCard({
11760
11815
  const timer = setTimeout(onDismiss, COMPLETED_CARD_VISIBLE_MS);
11761
11816
  return () => clearTimeout(timer);
11762
11817
  }, [plan.state, onDismiss]);
11763
- return /* @__PURE__ */ jsxs41("div", {
11818
+ return /* @__PURE__ */ jsxs40("div", {
11764
11819
  className: cn(!embedded && "skippr:w-[255px] skippr:rounded-[14px] skippr:border skippr:border-[rgba(45,45,63,0.08)] skippr:bg-white skippr:shadow-[0_10px_28px_rgba(45,45,63,0.16)] skippr:[animation:skippr-tip-in_360ms_cubic-bezier(0.34,1.3,0.64,1)]"),
11765
11820
  children: [
11766
- /* @__PURE__ */ jsxs41("div", {
11821
+ /* @__PURE__ */ jsxs40("div", {
11767
11822
  className: "skippr:flex skippr:items-center skippr:justify-between skippr:border-b skippr:border-[rgba(45,45,63,0.06)] skippr:px-[12px] skippr:py-[6px]",
11768
11823
  children: [
11769
11824
  /* @__PURE__ */ jsx51("span", {
@@ -11782,14 +11837,14 @@ function VoiceBarPlanCard({
11782
11837
  })
11783
11838
  ]
11784
11839
  }),
11785
- /* @__PURE__ */ jsxs41("div", {
11840
+ /* @__PURE__ */ jsxs40("div", {
11786
11841
  className: "skippr:px-[12px] skippr:pb-[10px] skippr:pt-[8px]",
11787
11842
  children: [
11788
11843
  /* @__PURE__ */ jsx51("p", {
11789
11844
  className: "skippr:text-[11.5px] skippr:font-semibold skippr:tracking-[-0.01em] skippr:text-[#2D2D3F]",
11790
11845
  children: "Here's my plan"
11791
11846
  }),
11792
- awaitingApproval && /* @__PURE__ */ jsxs41("p", {
11847
+ awaitingApproval && /* @__PURE__ */ jsxs40("p", {
11793
11848
  className: "skippr:mt-[1px] skippr:text-[10px] skippr:text-[#8b877f]",
11794
11849
  children: [
11795
11850
  plan.steps.length,
@@ -11798,7 +11853,7 @@ function VoiceBarPlanCard({
11798
11853
  }),
11799
11854
  /* @__PURE__ */ jsx51("div", {
11800
11855
  className: "skippr:mt-[8px] skippr:max-h-[132px] skippr:space-y-[6px] skippr:overflow-y-auto skippr:overscroll-contain",
11801
- children: plan.steps.map((step) => /* @__PURE__ */ jsxs41("div", {
11856
+ children: plan.steps.map((step) => /* @__PURE__ */ jsxs40("div", {
11802
11857
  className: "skippr:flex skippr:items-center skippr:gap-[7px]",
11803
11858
  children: [
11804
11859
  /* @__PURE__ */ jsx51(StepIndicator, {
@@ -11813,10 +11868,10 @@ function VoiceBarPlanCard({
11813
11868
  }),
11814
11869
  /* @__PURE__ */ jsx51("div", {
11815
11870
  className: "skippr:mt-[9px]",
11816
- children: awaitingApproval ? /* @__PURE__ */ jsxs41("div", {
11871
+ children: awaitingApproval ? /* @__PURE__ */ jsxs40("div", {
11817
11872
  className: "skippr:flex skippr:gap-[8px]",
11818
11873
  children: [
11819
- /* @__PURE__ */ jsxs41("button", {
11874
+ /* @__PURE__ */ jsxs40("button", {
11820
11875
  type: "button",
11821
11876
  disabled: isApproving,
11822
11877
  onClick: approve,
@@ -11836,7 +11891,7 @@ function VoiceBarPlanCard({
11836
11891
  children: "cancel"
11837
11892
  })
11838
11893
  ]
11839
- }) : /* @__PURE__ */ jsxs41("span", {
11894
+ }) : /* @__PURE__ */ jsxs40("span", {
11840
11895
  style: { color: "var(--skippr-brand-foreground, #2d2b3d)" },
11841
11896
  className: "skippr:flex skippr:items-center skippr:justify-center skippr:gap-[5px] skippr:rounded-full skippr:bg-brand skippr:px-[10px] skippr:py-[6px] skippr:text-[11px] skippr:font-semibold",
11842
11897
  children: [
@@ -11855,7 +11910,7 @@ function VoiceBarPlanCard({
11855
11910
  }
11856
11911
 
11857
11912
  // src/components/VoiceBarFrame.tsx
11858
- import { jsx as jsx52, jsxs as jsxs42 } from "react/jsx-runtime";
11913
+ import { jsx as jsx52, jsxs as jsxs41 } from "react/jsx-runtime";
11859
11914
  var AUTO_OFF_MOTES = [
11860
11915
  { left: "13%", delay: "0s", size: 4 },
11861
11916
  { left: "27%", delay: "0.4s", size: 3 },
@@ -11868,7 +11923,7 @@ var AUTO_OFF_MOTES = [
11868
11923
  var EDGE_BUTTON = "skippr:flex skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-transparent skippr:text-[#2D2D3F] skippr:cursor-pointer skippr:transition-colors skippr:hover:bg-[#f2f0eb]";
11869
11924
  var PILL = "skippr:relative skippr:flex skippr:h-[36px] skippr:min-w-[96px] skippr:flex-1 skippr:items-center skippr:justify-center skippr:gap-[8px] skippr:rounded-full skippr:text-[13px] skippr:font-semibold skippr:tracking-[-0.01em] skippr:text-white";
11870
11925
  function LoadingAvatar({ logoUrl }) {
11871
- return /* @__PURE__ */ jsxs42("span", {
11926
+ return /* @__PURE__ */ jsxs41("span", {
11872
11927
  className: "skippr:relative skippr:size-[22px] skippr:shrink-0",
11873
11928
  children: [
11874
11929
  /* @__PURE__ */ jsx52("span", {
@@ -11893,7 +11948,7 @@ function BusyRing({ tone }) {
11893
11948
  });
11894
11949
  }
11895
11950
  function AgentDots() {
11896
- return /* @__PURE__ */ jsxs42("span", {
11951
+ return /* @__PURE__ */ jsxs41("span", {
11897
11952
  className: "skippr:flex skippr:items-center skippr:gap-[4px]",
11898
11953
  children: [
11899
11954
  /* @__PURE__ */ jsx52("span", {
@@ -11991,14 +12046,14 @@ function ShortcutHint({
11991
12046
  el.removeEventListener("mouseleave", leave);
11992
12047
  };
11993
12048
  }, [enabled, seenRef]);
11994
- return /* @__PURE__ */ jsxs42("div", {
12049
+ return /* @__PURE__ */ jsxs41("div", {
11995
12050
  ref,
11996
12051
  className: "skippr:relative skippr:flex skippr:min-w-[96px] skippr:flex-1",
11997
12052
  children: [
11998
- enabled && visible && !suppressed && /* @__PURE__ */ jsxs42("div", {
12053
+ enabled && visible && !suppressed && /* @__PURE__ */ jsxs41("div", {
11999
12054
  className: "skippr:pointer-events-none skippr:absolute skippr:bottom-[calc(100%+11px)] skippr:left-1/2 skippr:z-[8] skippr:flex skippr:-translate-x-1/2 skippr:items-center skippr:gap-[7px] skippr:whitespace-nowrap skippr:rounded-[11px] skippr:border skippr:border-[rgba(45,45,63,0.08)] skippr:bg-white skippr:px-[11px] skippr:py-[6px] skippr:shadow-[0_8px_22px_rgba(45,45,63,0.12),0_1px_3px_rgba(45,45,63,0.04)] skippr:[animation:skippr-fade-in_0.22s_ease]",
12000
12055
  children: [
12001
- /* @__PURE__ */ jsxs42("span", {
12056
+ /* @__PURE__ */ jsxs41("span", {
12002
12057
  className: "skippr:flex skippr:items-center skippr:gap-[3px]",
12003
12058
  children: [
12004
12059
  /* @__PURE__ */ jsx52(ShortcutChip, {
@@ -12021,7 +12076,7 @@ function ShortcutHint({
12021
12076
  className: "skippr:text-[10px] skippr:text-[#cbc7bf]",
12022
12077
  children: "·"
12023
12078
  }),
12024
- /* @__PURE__ */ jsxs42("span", {
12079
+ /* @__PURE__ */ jsxs41("span", {
12025
12080
  className: "skippr:flex skippr:items-center skippr:gap-[3px]",
12026
12081
  children: [
12027
12082
  /* @__PURE__ */ jsx52(ShortcutChip, {
@@ -12255,7 +12310,7 @@ function VoiceBarFrame({
12255
12310
  ...popsDown ? { top: "calc(100% + 12px)" } : { bottom: "calc(100% + 12px)" }
12256
12311
  };
12257
12312
  const pillEvaporate = autoOffClosing ? "skippr:[animation:skippr-evaporate_3.2s_ease-in_forwards] skippr:motion-reduce:animate-none" : "";
12258
- return /* @__PURE__ */ jsxs42("div", {
12313
+ return /* @__PURE__ */ jsxs41("div", {
12259
12314
  ref: setContainerRefs,
12260
12315
  style: barPosStyle(pos),
12261
12316
  className: cn("skippr:fixed skippr:z-[9999] skippr:flex skippr:touch-none skippr:cursor-grab skippr:items-center", barWidthClass),
@@ -12289,7 +12344,7 @@ function VoiceBarFrame({
12289
12344
  showLiveStrip && /* @__PURE__ */ jsx52("div", {
12290
12345
  style: stripStyle,
12291
12346
  className: "skippr:pointer-events-none skippr:z-[5]",
12292
- children: /* @__PURE__ */ jsxs42("div", {
12347
+ children: /* @__PURE__ */ jsxs41("div", {
12293
12348
  className: "skippr:flex skippr:items-center skippr:gap-[7px] skippr:rounded-full skippr:border skippr:border-[rgba(45,45,63,0.06)] skippr:bg-white/95 skippr:px-[12px] skippr:py-[5px] skippr:shadow-[0_4px_12px_rgba(45,45,63,0.1)] skippr:[animation:skippr-fade-in_0.25s_ease]",
12294
12349
  children: [
12295
12350
  /* @__PURE__ */ jsx52("span", {
@@ -12306,7 +12361,7 @@ function VoiceBarFrame({
12306
12361
  showTimerStrip && sessionTimer && /* @__PURE__ */ jsx52("div", {
12307
12362
  style: stripStyle,
12308
12363
  className: "skippr:pointer-events-none skippr:z-[5]",
12309
- children: /* @__PURE__ */ jsxs42("div", {
12364
+ children: /* @__PURE__ */ jsxs41("div", {
12310
12365
  className: "skippr:flex skippr:items-center skippr:gap-[7px] skippr:rounded-full skippr:border skippr:border-[rgba(45,45,63,0.06)] skippr:bg-white/95 skippr:px-[12px] skippr:py-[5px] skippr:shadow-[0_4px_12px_rgba(45,45,63,0.1)] skippr:[animation:skippr-fade-in_0.25s_ease]",
12311
12366
  children: [
12312
12367
  /* @__PURE__ */ jsx52("span", {
@@ -12324,7 +12379,7 @@ function VoiceBarFrame({
12324
12379
  role: "status",
12325
12380
  style: stripStyle,
12326
12381
  className: "skippr:pointer-events-none skippr:z-[6]",
12327
- children: /* @__PURE__ */ jsxs42("div", {
12382
+ children: /* @__PURE__ */ jsxs41("div", {
12328
12383
  className: "skippr:flex skippr:items-center skippr:gap-[7px] skippr:rounded-full skippr:border skippr:border-[rgba(45,45,63,0.06)] skippr:bg-white/95 skippr:px-[12px] skippr:py-[5px] skippr:shadow-[0_4px_12px_rgba(45,45,63,0.1)] skippr:[animation:skippr-fade-in_0.25s_ease]",
12329
12384
  children: [
12330
12385
  /* @__PURE__ */ jsx52("span", {
@@ -12375,7 +12430,7 @@ function VoiceBarFrame({
12375
12430
  children: /* @__PURE__ */ jsx52("div", {
12376
12431
  className: "skippr:w-[220px] skippr:rounded-[14px] skippr:border skippr:border-[rgba(45,45,63,0.08)] skippr:bg-white skippr:px-3 skippr:py-2 skippr:shadow-[0_10px_28px_rgba(45,45,63,0.16)] skippr:[animation:skippr-tip-in_360ms_cubic-bezier(0.34,1.3,0.64,1)]",
12377
12432
  children: /* @__PURE__ */ jsx52(ConsentNotice, {
12378
- leadIn: "By starting a session"
12433
+ template: CONSENT_NOTICE_SESSION_START
12379
12434
  })
12380
12435
  })
12381
12436
  }),
@@ -12394,10 +12449,10 @@ function VoiceBarFrame({
12394
12449
  pos,
12395
12450
  onDismiss: closeBanner
12396
12451
  }),
12397
- /* @__PURE__ */ jsxs42("div", {
12452
+ /* @__PURE__ */ jsxs41("div", {
12398
12453
  className: cn("skippr:relative skippr:z-[1] skippr:flex skippr:w-full skippr:items-center skippr:gap-[7px] skippr:px-[7px] skippr:py-[5px]", pillEvaporate),
12399
12454
  children: [
12400
- showClose && /* @__PURE__ */ jsxs42("button", {
12455
+ showClose && /* @__PURE__ */ jsxs41("button", {
12401
12456
  type: "button",
12402
12457
  onClick: ifNotDragged(closeBar),
12403
12458
  disabled: isPausing || isLoading,
@@ -12413,7 +12468,7 @@ function VoiceBarFrame({
12413
12468
  })
12414
12469
  ]
12415
12470
  }),
12416
- isLoading && /* @__PURE__ */ jsxs42("div", {
12471
+ isLoading && /* @__PURE__ */ jsxs41("div", {
12417
12472
  className: cn(PILL, "skippr:bg-[#F1EFEA] skippr:overflow-hidden", !isExchanging && "skippr:[animation:skippr-fade-in_0.25s_ease]"),
12418
12473
  children: [
12419
12474
  /* @__PURE__ */ jsx52(LoadingAvatar, {
@@ -12423,7 +12478,7 @@ function VoiceBarFrame({
12423
12478
  className: "skippr:whitespace-nowrap skippr:text-[12.5px] skippr:font-semibold skippr:text-[#5a5650]",
12424
12479
  children: "Agent is loading"
12425
12480
  }),
12426
- /* @__PURE__ */ jsxs42("span", {
12481
+ /* @__PURE__ */ jsxs41("span", {
12427
12482
  className: "skippr:flex skippr:items-end skippr:gap-[3px]",
12428
12483
  children: [
12429
12484
  /* @__PURE__ */ jsx52("span", {
@@ -12443,7 +12498,7 @@ function VoiceBarFrame({
12443
12498
  enabled: isPushToTalk,
12444
12499
  seenRef: hintSeenRef,
12445
12500
  suppressed: hintSuppressed,
12446
- children: /* @__PURE__ */ jsxs42("button", {
12501
+ children: /* @__PURE__ */ jsxs41("button", {
12447
12502
  type: "button",
12448
12503
  "data-skippr-no-drag": "",
12449
12504
  style: {
@@ -12470,7 +12525,7 @@ function VoiceBarFrame({
12470
12525
  ]
12471
12526
  })
12472
12527
  }),
12473
- showLivePill && /* @__PURE__ */ jsxs42("div", {
12528
+ showLivePill && /* @__PURE__ */ jsxs41("div", {
12474
12529
  style: { background: livePillBg, color: "var(--skippr-brand-foreground, #2d2b3d)" },
12475
12530
  className: cn(PILL, "skippr:min-w-0 skippr:gap-[10px] skippr:px-[5px]"),
12476
12531
  children: [
@@ -12500,7 +12555,7 @@ function VoiceBarFrame({
12500
12555
  })
12501
12556
  ]
12502
12557
  }),
12503
- !isLoading && isConnected && textMode && /* @__PURE__ */ jsxs42("div", {
12558
+ !isLoading && isConnected && textMode && /* @__PURE__ */ jsxs41("div", {
12504
12559
  className: cn(PILL, "skippr:gap-[7px] skippr:bg-[#F1EFEA] skippr:text-[#5a5650] skippr:[animation:skippr-fade-in_0.25s_ease]"),
12505
12560
  children: [
12506
12561
  /* @__PURE__ */ jsx52(MessageSquare, {
@@ -12510,7 +12565,7 @@ function VoiceBarFrame({
12510
12565
  "Text mode"
12511
12566
  ]
12512
12567
  }),
12513
- !sessionLive && /* @__PURE__ */ jsxs42("button", {
12568
+ !sessionLive && /* @__PURE__ */ jsxs41("button", {
12514
12569
  type: "button",
12515
12570
  onClick: ifNotDragged(() => {
12516
12571
  if (canStart) {
@@ -12551,7 +12606,7 @@ function VoiceBarFrame({
12551
12606
  })
12552
12607
  ]
12553
12608
  }),
12554
- lineBlockOpen && /* @__PURE__ */ jsxs42("div", {
12609
+ lineBlockOpen && /* @__PURE__ */ jsxs41("div", {
12555
12610
  style: chatBlockStyle,
12556
12611
  "data-skippr-no-drag": "",
12557
12612
  onPointerDown: (event) => event.stopPropagation(),
@@ -12583,7 +12638,7 @@ import { useCallback as useCallback35, useEffect as useEffect48, useRef as useRe
12583
12638
 
12584
12639
  // src/components/LauncherNotification.tsx
12585
12640
  import { useEffect as useEffect47, useRef as useRef43, useState as useState38 } from "react";
12586
- import { jsx as jsx53, jsxs as jsxs43 } from "react/jsx-runtime";
12641
+ import { jsx as jsx53, jsxs as jsxs42 } from "react/jsx-runtime";
12587
12642
  function LauncherNotification({
12588
12643
  notifications,
12589
12644
  dock,
@@ -12638,7 +12693,7 @@ function LauncherNotification({
12638
12693
  return /* @__PURE__ */ jsx53("div", {
12639
12694
  style: wrapperStyle,
12640
12695
  "data-skippr-no-drag": "",
12641
- children: /* @__PURE__ */ jsxs43("div", {
12696
+ children: /* @__PURE__ */ jsxs42("div", {
12642
12697
  ref: cardRef,
12643
12698
  className: "skippr:flex skippr:w-[148px] skippr:items-center skippr:gap-[4px] skippr:rounded-[14px] skippr:border skippr:border-[rgba(45,45,63,0.08)] skippr:bg-white skippr:pr-[6px] skippr:pl-[9px] skippr:py-[3px] skippr:shadow-[0_10px_28px_rgba(45,45,63,0.16)] skippr:[animation:skippr-tip-in_360ms_cubic-bezier(0.34,1.3,0.64,1)]",
12644
12699
  children: [
@@ -12680,7 +12735,7 @@ function LauncherNotification({
12680
12735
  }
12681
12736
 
12682
12737
  // src/components/VoiceBarLauncher.tsx
12683
- import { jsx as jsx54, jsxs as jsxs44, Fragment as Fragment7 } from "react/jsx-runtime";
12738
+ import { jsx as jsx54, jsxs as jsxs43, Fragment as Fragment7 } from "react/jsx-runtime";
12684
12739
  function SkipprMark2() {
12685
12740
  return /* @__PURE__ */ jsx54("svg", {
12686
12741
  viewBox: "0 0 15.4044 18.4853",
@@ -12766,7 +12821,7 @@ function LauncherChat({
12766
12821
  onClick
12767
12822
  }) {
12768
12823
  const vertical = isHorizontalEdge(edge);
12769
- return /* @__PURE__ */ jsxs44("div", {
12824
+ return /* @__PURE__ */ jsxs43("div", {
12770
12825
  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]),
12771
12826
  style: {
12772
12827
  width: vertical ? 46 : revealed ? 52 : 0,
@@ -12909,7 +12964,7 @@ function VoiceBarLauncher({
12909
12964
  const expanded = hovered && !!onChat;
12910
12965
  const length = expanded ? 84 : 40;
12911
12966
  const thickness = expanded ? 36 : 10;
12912
- return /* @__PURE__ */ jsxs44("div", {
12967
+ return /* @__PURE__ */ jsxs43("div", {
12913
12968
  ref: containerRef,
12914
12969
  style: dockStyleFlush(dock),
12915
12970
  className: "skippr:fixed skippr:z-[9999] skippr:touch-none skippr:cursor-grab",
@@ -12917,7 +12972,7 @@ function VoiceBarLauncher({
12917
12972
  /* @__PURE__ */ jsx54("div", {
12918
12973
  style: horizontal ? { width: length, height: thickness } : { width: thickness, height: length },
12919
12974
  className: cn("skippr:relative skippr:flex skippr:items-center skippr:justify-center skippr:gap-[6px] skippr:border-2 skippr:transition-[width,height,background-color,border-color] skippr:duration-200 skippr:ease-out", !horizontal && "skippr:flex-col", expanded ? "skippr:border-brand skippr:bg-white" : "skippr:border-transparent skippr:bg-brand", expanded ? STRIP_ROUNDING_EXPANDED[dock.edge] : STRIP_ROUNDING[dock.edge], expanded ? AVATAR_SHADOW[dock.edge] : STRIP_SHADOW[dock.edge]),
12920
- children: expanded ? /* @__PURE__ */ jsxs44(Fragment7, {
12975
+ children: expanded ? /* @__PURE__ */ jsxs43(Fragment7, {
12921
12976
  children: [
12922
12977
  /* @__PURE__ */ jsx54("button", {
12923
12978
  type: "button",
@@ -12979,12 +13034,12 @@ function VoiceBarLauncher({
12979
13034
  ]
12980
13035
  });
12981
13036
  }
12982
- return /* @__PURE__ */ jsxs44("div", {
13037
+ return /* @__PURE__ */ jsxs43("div", {
12983
13038
  ref: containerRef,
12984
13039
  style: dockStyleFlush(dock),
12985
13040
  className: "skippr:fixed skippr:z-[9999] skippr:touch-none skippr:cursor-grab",
12986
13041
  children: [
12987
- /* @__PURE__ */ jsxs44("div", {
13042
+ /* @__PURE__ */ jsxs43("div", {
12988
13043
  style: { gap: onChat && hovered ? 2 : 0 },
12989
13044
  className: cn("skippr:flex skippr:items-center skippr:border-2 skippr:border-brand skippr:bg-white skippr:p-[3px] skippr:transition-[gap] skippr:duration-[400ms] skippr:ease-[cubic-bezier(0.22,1,0.36,1)]", "skippr:[animation:skippr-pop_0.2s_ease]", AVATAR_FLEX[dock.edge], VIEWPORT_ROUNDING[dock.edge], AVATAR_SHADOW[dock.edge]),
12990
13045
  children: [
@@ -13099,7 +13154,7 @@ function VoiceBar({ revealed }) {
13099
13154
  }
13100
13155
 
13101
13156
  // src/components/LiveAgent.tsx
13102
- import { jsx as jsx56, jsxs as jsxs45, Fragment as Fragment9 } from "react/jsx-runtime";
13157
+ import { jsx as jsx56, jsxs as jsxs44, Fragment as Fragment9 } from "react/jsx-runtime";
13103
13158
  function readSavedPosition() {
13104
13159
  try {
13105
13160
  const saved = localStorage.getItem("skippr_widget_position");
@@ -13142,6 +13197,7 @@ function LiveAgent(props) {
13142
13197
  getUserToken,
13143
13198
  userToken,
13144
13199
  userContext,
13200
+ locale: hostLocale,
13145
13201
  verticalAlign: hostVerticalAlign,
13146
13202
  variant = "floating",
13147
13203
  minimizable = true,
@@ -13258,6 +13314,7 @@ function LiveAgent(props) {
13258
13314
  if (!isConnected)
13259
13315
  setTextModeState(false);
13260
13316
  }, [isConnected, setTextModeState]);
13317
+ const locale = useDetectedLocale(hostLocale);
13261
13318
  const {
13262
13319
  modules: availableModules,
13263
13320
  defaultSelection,
@@ -13271,7 +13328,8 @@ function LiveAgent(props) {
13271
13328
  enabled: !isSessionLive,
13272
13329
  bearerToken,
13273
13330
  authedFetch,
13274
- agentId: hostAgentId ?? undefined
13331
+ agentId: hostAgentId ?? undefined,
13332
+ locale
13275
13333
  });
13276
13334
  const isAuthenticated = bearerToken !== null || auth.isAuthenticated;
13277
13335
  const noModulesAvailable = hasResolvedModules && !modulesError && availableModules.length === 0 && !isSessionLive;
@@ -13833,17 +13891,17 @@ function LiveAgent(props) {
13833
13891
  }
13834
13892
  return /* @__PURE__ */ jsx56(LiveAgentContext.Provider, {
13835
13893
  value: ctx,
13836
- children: /* @__PURE__ */ jsxs45(LiveKitRoom, {
13894
+ children: /* @__PURE__ */ jsxs44(LiveKitRoom, {
13837
13895
  serverUrl: connection?.livekitUrl,
13838
13896
  token: connection?.token,
13839
13897
  connect: shouldConnect,
13840
13898
  audio: !startMuted,
13841
13899
  onDisconnected: handleRoomDisconnected,
13842
13900
  children: [
13843
- /* @__PURE__ */ jsxs45(Fragment8, {
13901
+ /* @__PURE__ */ jsxs44(Fragment8, {
13844
13902
  children: [
13845
13903
  connection && !textMode && /* @__PURE__ */ jsx56(RoomAudioRenderer, {}),
13846
- /* @__PURE__ */ jsxs45(SessionHoldProvider, {
13904
+ /* @__PURE__ */ jsxs44(SessionHoldProvider, {
13847
13905
  children: [
13848
13906
  connection && captureMode === CAPTURE_MODE.Screenshare && /* @__PURE__ */ jsx56(AutoStartMedia, {
13849
13907
  pendingScreenStream,
@@ -13854,7 +13912,7 @@ function LiveAgent(props) {
13854
13912
  pushOrTapMicMode: isRequestResponseMicMode(agentControls?.micMode),
13855
13913
  startMuted
13856
13914
  }),
13857
- /* @__PURE__ */ jsxs45(ShadowHost, {
13915
+ /* @__PURE__ */ jsxs44(ShadowHost, {
13858
13916
  accentColor: appearance?.accentColor ?? null,
13859
13917
  children: [
13860
13918
  connection && captureMode === CAPTURE_MODE.Auto && agentControls?.highlight && /* @__PURE__ */ jsx56(HighlightOverlay, {}),
@@ -13867,7 +13925,7 @@ function LiveAgent(props) {
13867
13925
  children: /* @__PURE__ */ jsx56(TranscriptionsProvider, {
13868
13926
  children: /* @__PURE__ */ jsx56("div", {
13869
13927
  id: WIDGET_ROOT_ID,
13870
- children: variant === "sidebar" ? /* @__PURE__ */ jsxs45(Fragment9, {
13928
+ children: variant === "sidebar" ? /* @__PURE__ */ jsxs44(Fragment9, {
13871
13929
  children: [
13872
13930
  isMinimized && !showControlBar && isLauncherRevealed && /* @__PURE__ */ jsx56(MinimizedBubble, {
13873
13931
  welcomeMessage,
@@ -13884,12 +13942,12 @@ function LiveAgent(props) {
13884
13942
  ]
13885
13943
  }) : !isLauncherRevealed ? null : buddyActive ? /* @__PURE__ */ jsx56(BuddyVoiceBar, {
13886
13944
  revealed: isLauncherRevealed
13887
- }) : /* @__PURE__ */ jsxs45(Fragment9, {
13945
+ }) : /* @__PURE__ */ jsxs44(Fragment9, {
13888
13946
  children: [
13889
13947
  /* @__PURE__ */ jsx56(VoiceBar, {
13890
13948
  revealed: isLauncherRevealed
13891
13949
  }),
13892
- (agentControls?.chat ?? DEFAULT_CHAT_SURFACE) === CHAT_SURFACE.Room && /* @__PURE__ */ jsxs45(Fragment9, {
13950
+ (agentControls?.chat ?? DEFAULT_CHAT_SURFACE) === CHAT_SURFACE.Room && /* @__PURE__ */ jsxs44(Fragment9, {
13893
13951
  children: [
13894
13952
  /* @__PURE__ */ jsx56(SplashPanel, {}),
13895
13953
  /* @__PURE__ */ jsx56(Sidebar, {