@skippr/live-agent-sdk 0.87.0 → 0.88.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,7 +8,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
8
8
 
9
9
  // src/components/LiveAgent.tsx
10
10
  import { LiveKitRoom, RoomAudioRenderer } from "@livekit/components-react";
11
- import { useCallback as useCallback18, useEffect as useEffect30, useMemo as useMemo7, useRef as useRef25, useState as useState22 } from "react";
11
+ import { useCallback as useCallback24, useEffect as useEffect41, useMemo as useMemo7, useRef as useRef34, useState as useState30 } from "react";
12
12
 
13
13
  // src/capture/useAgentCursor.ts
14
14
  import { useEffect, useState } from "react";
@@ -52,7 +52,7 @@ function useAgentCursor() {
52
52
  import { createContext } from "react";
53
53
 
54
54
  // src/lib/constants.ts
55
- var SIDEBAR_WIDTH = 280;
55
+ var SIDEBAR_WIDTH = 255;
56
56
  var CAPTURE_MODE = {
57
57
  Screenshare: "screenshare",
58
58
  Auto: "auto"
@@ -61,6 +61,7 @@ var DEFAULT_CAPTURE_MODE = CAPTURE_MODE.Auto;
61
61
  var WIDGET_ROOT_ID = "skippr-sdk-root";
62
62
  var REF_ATTR = "data-skippr-ref";
63
63
  var PRIVATE_ATTR = "data-skippr-private";
64
+ var NO_DRAG_ATTR = "data-skippr-no-drag";
64
65
  var DOM_SNAPSHOT_TOPIC = "skippr.dom-snapshot";
65
66
  var DOM_EVENTS_TOPIC = "skippr.dom-events";
66
67
  var HIGHLIGHT_TOPIC = "skippr.highlight";
@@ -78,8 +79,36 @@ var DEFAULT_MIC_MODE = MIC_MODE.Live;
78
79
  function isRequestResponseMicMode(micMode) {
79
80
  return micMode === MIC_MODE.PushToTalk || micMode === MIC_MODE.TapToTalk;
80
81
  }
82
+ var CHAT_SURFACE = {
83
+ Line: "line",
84
+ Room: "room"
85
+ };
86
+ var DEFAULT_CHAT_SURFACE = CHAT_SURFACE.Line;
87
+ var LAUNCHER_MODE = {
88
+ Avatar: "avatar",
89
+ Strip: "strip",
90
+ None: "none",
91
+ Custom: "custom"
92
+ };
93
+ var DEFAULT_LAUNCHER_MODE = LAUNCHER_MODE.Avatar;
81
94
  var PUSH_TO_TALK_KEY = "Backquote";
95
+ var STOP_AGENT_KEY = "KeyX";
82
96
  var IDLE_AUTO_PAUSE_MS = 3 * 60 * 1000;
97
+ var IDLE_AUTO_OFF_MS = 5 * 60 * 1000;
98
+ var AUTO_OFF_NOTICE_MS = 3500;
99
+ var CHAT_ACTIVITY_THROTTLE_MS = 15000;
100
+ var MAX_ADOPTION_TIPS = 3;
101
+ var TIP_ROTATE_MS = 2000;
102
+ var TIP_HIDE_MS = 6000;
103
+ var SESSION_TIMER_WARNING_S = 120;
104
+ var SESSION_TIMER_HOLD_MS = 6000;
105
+ var SESSION_TIMER_INTERVAL_MS = 3 * 60000;
106
+ var NOTIF_ACCENT_COLOR = "#199a89";
107
+ var MODULE_ACCENT_COLOR = "#e0574f";
108
+ var NOTIFICATION_KIND = {
109
+ Tip: "tip",
110
+ Module: "module"
111
+ };
83
112
  var PLAN_ATTR = "skippr.action-plan";
84
113
  var NAME_MAX_CHARS = 80;
85
114
 
@@ -866,7 +895,6 @@ function useAvailableModules({
866
895
  const [error, setError] = useState6(null);
867
896
  const fetchModules = useCallback6(async () => {
868
897
  setIsLoading(true);
869
- setHasResolved(false);
870
898
  setError(null);
871
899
  try {
872
900
  const query = agentId ? `?agentId=${encodeURIComponent(agentId)}` : "";
@@ -914,6 +942,7 @@ function useOnceTrue(value) {
914
942
  }
915
943
 
916
944
  // src/hooks/usePlanUpdates.ts
945
+ import { useRemoteParticipants as useRemoteParticipants2 } from "@livekit/components-react/hooks";
917
946
  import { useCallback as useCallback7 } from "react";
918
947
 
919
948
  // src/hooks/useAgentState.ts
@@ -967,9 +996,15 @@ function parsePlan(json) {
967
996
  } catch {}
968
997
  return null;
969
998
  }
999
+ function isPlanVisible(plan) {
1000
+ return !!plan && plan.steps.length > 0 && plan.state !== "abandoned" && plan.state !== "aborted";
1001
+ }
970
1002
  function usePlanUpdates() {
971
1003
  const parse = useCallback7(parsePlan, []);
972
- return useAgentState(PLAN_ATTR, parse, null);
1004
+ const plan = useAgentState(PLAN_ATTR, parse, null);
1005
+ const remoteParticipants = useRemoteParticipants2();
1006
+ const planAttrPresent = remoteParticipants.some((p) => p.attributes?.[PLAN_ATTR]);
1007
+ return planAttrPresent ? plan : null;
973
1008
  }
974
1009
 
975
1010
  // src/hooks/useSession.ts
@@ -1374,7 +1409,6 @@ function useSessionHistory({
1374
1409
  var DEFAULT_LAUNCHER_BOTTOM_PX = 48;
1375
1410
  var LAUNCHER_HEIGHT_PX = 50;
1376
1411
  var WIDGET_EDGE_MARGIN_PX = 12;
1377
- var SESSION_BAR_CLEARANCE_PX = 76;
1378
1412
  var TRIGGER_HEIGHT_PX = 48;
1379
1413
  var IDLE_TRIGGER_CLEARANCE_PX = TRIGGER_HEIGHT_PX + 16;
1380
1414
  var TRIGGER_LAUNCHER_OFFSET_PX = 24;
@@ -1400,6 +1434,80 @@ function verticalAlignToBottomPx(align) {
1400
1434
  function launcherPopsDown(bottomPx) {
1401
1435
  return bottomPx + LAUNCHER_HEIGHT_PX / 2 > window.innerHeight / 2;
1402
1436
  }
1437
+
1438
+ // src/lib/voiceBar.ts
1439
+ var VOICE_BAR_EDGE_MARGIN_PX = 16;
1440
+ var VOICE_BAR_HEIGHT_PX = 46;
1441
+ var VOICE_BAR_WIDTH_PX = 255;
1442
+ var edgeKey = (kind) => `skippr_voicebar_${kind}_edge`;
1443
+ var offsetKey = (kind) => `skippr_voicebar_${kind}_offset`;
1444
+ function isHorizontalEdge(edge) {
1445
+ return edge === "top" || edge === "bottom";
1446
+ }
1447
+ function isBarEdge(value) {
1448
+ return value === "left" || value === "right" || value === "top" || value === "bottom";
1449
+ }
1450
+ function readSavedDock(kind) {
1451
+ try {
1452
+ const edge = localStorage.getItem(edgeKey(kind));
1453
+ const offsetPx = Number.parseInt(localStorage.getItem(offsetKey(kind)) ?? "", 10);
1454
+ if (isBarEdge(edge) && Number.isFinite(offsetPx))
1455
+ return { edge, offsetPx };
1456
+ } catch {}
1457
+ return null;
1458
+ }
1459
+ function persistDock(kind, dock) {
1460
+ try {
1461
+ localStorage.setItem(edgeKey(kind), dock.edge);
1462
+ localStorage.setItem(offsetKey(kind), String(dock.offsetPx));
1463
+ } catch {}
1464
+ }
1465
+ function edgeExtent(edge) {
1466
+ return isHorizontalEdge(edge) ? window.innerWidth : window.innerHeight;
1467
+ }
1468
+ function clampOffset(edge, offsetPx) {
1469
+ const halfSize = isHorizontalEdge(edge) ? VOICE_BAR_WIDTH_PX / 2 : VOICE_BAR_HEIGHT_PX / 2;
1470
+ const min = VOICE_BAR_EDGE_MARGIN_PX + halfSize;
1471
+ const max = edgeExtent(edge) - VOICE_BAR_EDGE_MARGIN_PX - halfSize;
1472
+ return Math.round(Math.min(Math.max(offsetPx, min), max));
1473
+ }
1474
+ function defaultOffset(edge) {
1475
+ return clampOffset(edge, edgeExtent(edge) / 2);
1476
+ }
1477
+ function nearestEdge(clientX, clientY) {
1478
+ const distances = {
1479
+ left: clientX,
1480
+ right: window.innerWidth - clientX,
1481
+ top: clientY,
1482
+ bottom: window.innerHeight - clientY
1483
+ };
1484
+ return Object.keys(distances).reduce((closest, edge) => distances[edge] < distances[closest] ? edge : closest);
1485
+ }
1486
+ function dropTargetFromPointer(clientX, clientY) {
1487
+ const edge = nearestEdge(clientX, clientY);
1488
+ const offsetPx = clampOffset(edge, isHorizontalEdge(edge) ? clientX : clientY);
1489
+ return { edge, offsetPx };
1490
+ }
1491
+ var DRAG_TRANSLATE = "translate(var(--skippr-drag-x, 0px), var(--skippr-drag-y, 0px))";
1492
+ function dockStyle(dock) {
1493
+ const m = VOICE_BAR_EDGE_MARGIN_PX;
1494
+ if (dock.edge === "left")
1495
+ return { left: m, top: dock.offsetPx, transform: `translateY(-50%) ${DRAG_TRANSLATE}` };
1496
+ if (dock.edge === "right")
1497
+ return { right: m, top: dock.offsetPx, transform: `translateY(-50%) ${DRAG_TRANSLATE}` };
1498
+ if (dock.edge === "top")
1499
+ return { top: m, left: dock.offsetPx, transform: `translateX(-50%) ${DRAG_TRANSLATE}` };
1500
+ return { bottom: m, left: dock.offsetPx, transform: `translateX(-50%) ${DRAG_TRANSLATE}` };
1501
+ }
1502
+ function dockStyleFlush(dock) {
1503
+ if (dock.edge === "left")
1504
+ return { left: 0, top: dock.offsetPx, transform: `translateY(-50%) ${DRAG_TRANSLATE}` };
1505
+ if (dock.edge === "right")
1506
+ return { right: 0, top: dock.offsetPx, transform: `translateY(-50%) ${DRAG_TRANSLATE}` };
1507
+ if (dock.edge === "top")
1508
+ return { top: 0, left: dock.offsetPx, transform: `translateX(-50%) ${DRAG_TRANSLATE}` };
1509
+ return { bottom: 0, left: dock.offsetPx, transform: `translateX(-50%) ${DRAG_TRANSLATE}` };
1510
+ }
1403
1511
  // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/createLucideIcon.js
1404
1512
  import { forwardRef as forwardRef2, createElement as createElement3 } from "react";
1405
1513
 
@@ -1518,22 +1626,43 @@ var __iconNode5 = [
1518
1626
  ["path", { d: "m12 5 7 7-7 7", key: "xquz4c" }]
1519
1627
  ];
1520
1628
  var ArrowRight = createLucideIcon("arrow-right", __iconNode5);
1521
- // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/calendar.js
1629
+ // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/audio-lines.js
1522
1630
  var __iconNode6 = [
1523
- ["path", { d: "M8 2v4", key: "1cmpym" }],
1524
- ["path", { d: "M16 2v4", key: "4m81vk" }],
1525
- ["rect", { width: "18", height: "18", x: "3", y: "4", rx: "2", key: "1hopcy" }],
1526
- ["path", { d: "M3 10h18", key: "8toen8" }]
1631
+ ["path", { d: "M2 10v3", key: "1fnikh" }],
1632
+ ["path", { d: "M6 6v11", key: "11sgs0" }],
1633
+ ["path", { d: "M10 3v18", key: "yhl04a" }],
1634
+ ["path", { d: "M14 8v7", key: "3a1oy3" }],
1635
+ ["path", { d: "M18 5v13", key: "123xd1" }],
1636
+ ["path", { d: "M22 10v3", key: "154ddg" }]
1527
1637
  ];
1528
- var Calendar = createLucideIcon("calendar", __iconNode6);
1638
+ var AudioLines = createLucideIcon("audio-lines", __iconNode6);
1639
+ // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/check.js
1640
+ var __iconNode7 = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
1641
+ var Check = createLucideIcon("check", __iconNode7);
1529
1642
  // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/chevron-down.js
1530
- var __iconNode7 = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
1531
- var ChevronDown = createLucideIcon("chevron-down", __iconNode7);
1643
+ var __iconNode8 = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
1644
+ var ChevronDown = createLucideIcon("chevron-down", __iconNode8);
1645
+ // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/chevron-right.js
1646
+ var __iconNode9 = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
1647
+ var ChevronRight = createLucideIcon("chevron-right", __iconNode9);
1532
1648
  // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/circle.js
1533
- var __iconNode8 = [["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]];
1534
- var Circle = createLucideIcon("circle", __iconNode8);
1649
+ var __iconNode10 = [["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]];
1650
+ var Circle = createLucideIcon("circle", __iconNode10);
1651
+ // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/keyboard.js
1652
+ var __iconNode11 = [
1653
+ ["path", { d: "M10 8h.01", key: "1r9ogq" }],
1654
+ ["path", { d: "M12 12h.01", key: "1mp3jc" }],
1655
+ ["path", { d: "M14 8h.01", key: "1primd" }],
1656
+ ["path", { d: "M16 12h.01", key: "1l6xoz" }],
1657
+ ["path", { d: "M18 8h.01", key: "emo2bl" }],
1658
+ ["path", { d: "M6 8h.01", key: "x9i8wu" }],
1659
+ ["path", { d: "M7 16h10", key: "wp8him" }],
1660
+ ["path", { d: "M8 12h.01", key: "czm47f" }],
1661
+ ["rect", { width: "20", height: "16", x: "2", y: "4", rx: "2", key: "18n3k1" }]
1662
+ ];
1663
+ var Keyboard = createLucideIcon("keyboard", __iconNode11);
1535
1664
  // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/lightbulb.js
1536
- var __iconNode9 = [
1665
+ var __iconNode12 = [
1537
1666
  [
1538
1667
  "path",
1539
1668
  {
@@ -1544,26 +1673,15 @@ var __iconNode9 = [
1544
1673
  ["path", { d: "M9 18h6", key: "x1upvd" }],
1545
1674
  ["path", { d: "M10 22h4", key: "ceow96" }]
1546
1675
  ];
1547
- var Lightbulb = createLucideIcon("lightbulb", __iconNode9);
1676
+ var Lightbulb = createLucideIcon("lightbulb", __iconNode12);
1548
1677
  // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/mail.js
1549
- var __iconNode10 = [
1678
+ var __iconNode13 = [
1550
1679
  ["path", { d: "m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7", key: "132q7q" }],
1551
1680
  ["rect", { x: "2", y: "4", width: "20", height: "16", rx: "2", key: "izxlao" }]
1552
1681
  ];
1553
- var Mail = createLucideIcon("mail", __iconNode10);
1554
- // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/message-circle.js
1555
- var __iconNode11 = [
1556
- [
1557
- "path",
1558
- {
1559
- d: "M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719",
1560
- key: "1sd12s"
1561
- }
1562
- ]
1563
- ];
1564
- var MessageCircle = createLucideIcon("message-circle", __iconNode11);
1682
+ var Mail = createLucideIcon("mail", __iconNode13);
1565
1683
  // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/message-square.js
1566
- var __iconNode12 = [
1684
+ var __iconNode14 = [
1567
1685
  [
1568
1686
  "path",
1569
1687
  {
@@ -1572,9 +1690,9 @@ var __iconNode12 = [
1572
1690
  }
1573
1691
  ]
1574
1692
  ];
1575
- var MessageSquare = createLucideIcon("message-square", __iconNode12);
1693
+ var MessageSquare = createLucideIcon("message-square", __iconNode14);
1576
1694
  // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/mic-off.js
1577
- var __iconNode13 = [
1695
+ var __iconNode15 = [
1578
1696
  ["path", { d: "M12 19v3", key: "npa21l" }],
1579
1697
  ["path", { d: "M15 9.34V5a3 3 0 0 0-5.68-1.33", key: "1gzdoj" }],
1580
1698
  ["path", { d: "M16.95 16.95A7 7 0 0 1 5 12v-2", key: "cqa7eg" }],
@@ -1582,32 +1700,32 @@ var __iconNode13 = [
1582
1700
  ["path", { d: "m2 2 20 20", key: "1ooewy" }],
1583
1701
  ["path", { d: "M9 9v3a3 3 0 0 0 5.12 2.12", key: "r2i35w" }]
1584
1702
  ];
1585
- var MicOff = createLucideIcon("mic-off", __iconNode13);
1703
+ var MicOff = createLucideIcon("mic-off", __iconNode15);
1586
1704
  // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/mic.js
1587
- var __iconNode14 = [
1705
+ var __iconNode16 = [
1588
1706
  ["path", { d: "M12 19v3", key: "npa21l" }],
1589
1707
  ["path", { d: "M19 10v2a7 7 0 0 1-14 0v-2", key: "1vc78b" }],
1590
1708
  ["rect", { x: "9", y: "2", width: "6", height: "13", rx: "3", key: "s6n7sd" }]
1591
1709
  ];
1592
- var Mic = createLucideIcon("mic", __iconNode14);
1710
+ var Mic = createLucideIcon("mic", __iconNode16);
1593
1711
  // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/monitor-off.js
1594
- var __iconNode15 = [
1712
+ var __iconNode17 = [
1595
1713
  ["path", { d: "M12 17v4", key: "1riwvh" }],
1596
1714
  ["path", { d: "M17 17H4a2 2 0 0 1-2-2V5a2 2 0 0 1 1.184-1.826", key: "cv7jms" }],
1597
1715
  ["path", { d: "m2 2 20 20", key: "1ooewy" }],
1598
1716
  ["path", { d: "M8 21h8", key: "1ev6f3" }],
1599
1717
  ["path", { d: "M8.656 3H20a2 2 0 0 1 2 2v10a2 2 0 0 1-.293 1.042", key: "z8ni2w" }]
1600
1718
  ];
1601
- var MonitorOff = createLucideIcon("monitor-off", __iconNode15);
1719
+ var MonitorOff = createLucideIcon("monitor-off", __iconNode17);
1602
1720
  // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/monitor.js
1603
- var __iconNode16 = [
1721
+ var __iconNode18 = [
1604
1722
  ["rect", { width: "20", height: "14", x: "2", y: "3", rx: "2", key: "48i651" }],
1605
1723
  ["line", { x1: "8", x2: "16", y1: "21", y2: "21", key: "1svkeh" }],
1606
1724
  ["line", { x1: "12", x2: "12", y1: "17", y2: "21", key: "vw1qmm" }]
1607
1725
  ];
1608
- var Monitor = createLucideIcon("monitor", __iconNode16);
1726
+ var Monitor = createLucideIcon("monitor", __iconNode18);
1609
1727
  // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/mouse-pointer-2.js
1610
- var __iconNode17 = [
1728
+ var __iconNode19 = [
1611
1729
  [
1612
1730
  "path",
1613
1731
  {
@@ -1616,9 +1734,9 @@ var __iconNode17 = [
1616
1734
  }
1617
1735
  ]
1618
1736
  ];
1619
- var MousePointer2 = createLucideIcon("mouse-pointer-2", __iconNode17);
1737
+ var MousePointer2 = createLucideIcon("mouse-pointer-2", __iconNode19);
1620
1738
  // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/mouse-pointer-click.js
1621
- var __iconNode18 = [
1739
+ var __iconNode20 = [
1622
1740
  ["path", { d: "M14 4.1 12 6", key: "ita8i4" }],
1623
1741
  ["path", { d: "m5.1 8-2.9-.8", key: "1go3kf" }],
1624
1742
  ["path", { d: "m6 12-1.9 2", key: "mnht97" }],
@@ -1631,15 +1749,15 @@ var __iconNode18 = [
1631
1749
  }
1632
1750
  ]
1633
1751
  ];
1634
- var MousePointerClick = createLucideIcon("mouse-pointer-click", __iconNode18);
1752
+ var MousePointerClick = createLucideIcon("mouse-pointer-click", __iconNode20);
1635
1753
  // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/pause.js
1636
- var __iconNode19 = [
1754
+ var __iconNode21 = [
1637
1755
  ["rect", { x: "14", y: "3", width: "5", height: "18", rx: "1", key: "kaeet6" }],
1638
1756
  ["rect", { x: "5", y: "3", width: "5", height: "18", rx: "1", key: "1wsw3u" }]
1639
1757
  ];
1640
- var Pause = createLucideIcon("pause", __iconNode19);
1758
+ var Pause = createLucideIcon("pause", __iconNode21);
1641
1759
  // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/play.js
1642
- var __iconNode20 = [
1760
+ var __iconNode22 = [
1643
1761
  [
1644
1762
  "path",
1645
1763
  {
@@ -1648,18 +1766,18 @@ var __iconNode20 = [
1648
1766
  }
1649
1767
  ]
1650
1768
  ];
1651
- var Play = createLucideIcon("play", __iconNode20);
1769
+ var Play = createLucideIcon("play", __iconNode22);
1652
1770
  // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/radio.js
1653
- var __iconNode21 = [
1771
+ var __iconNode23 = [
1654
1772
  ["path", { d: "M16.247 7.761a6 6 0 0 1 0 8.478", key: "1fwjs5" }],
1655
1773
  ["path", { d: "M19.075 4.933a10 10 0 0 1 0 14.134", key: "ehdyv1" }],
1656
1774
  ["path", { d: "M4.925 19.067a10 10 0 0 1 0-14.134", key: "1q22gi" }],
1657
1775
  ["path", { d: "M7.753 16.239a6 6 0 0 1 0-8.478", key: "r2q7qm" }],
1658
1776
  ["circle", { cx: "12", cy: "12", r: "2", key: "1c9p78" }]
1659
1777
  ];
1660
- var Radio = createLucideIcon("radio", __iconNode21);
1778
+ var Radio = createLucideIcon("radio", __iconNode23);
1661
1779
  // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/send.js
1662
- var __iconNode22 = [
1780
+ var __iconNode24 = [
1663
1781
  [
1664
1782
  "path",
1665
1783
  {
@@ -1669,18 +1787,18 @@ var __iconNode22 = [
1669
1787
  ],
1670
1788
  ["path", { d: "m21.854 2.147-10.94 10.939", key: "12cjpa" }]
1671
1789
  ];
1672
- var Send = createLucideIcon("send", __iconNode22);
1790
+ var Send = createLucideIcon("send", __iconNode24);
1673
1791
  // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/square.js
1674
- var __iconNode23 = [
1792
+ var __iconNode25 = [
1675
1793
  ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }]
1676
1794
  ];
1677
- var Square = createLucideIcon("square", __iconNode23);
1795
+ var Square = createLucideIcon("square", __iconNode25);
1678
1796
  // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/x.js
1679
- var __iconNode24 = [
1797
+ var __iconNode26 = [
1680
1798
  ["path", { d: "M18 6 6 18", key: "1bl5f8" }],
1681
1799
  ["path", { d: "m6 6 12 12", key: "d8bk6v" }]
1682
1800
  ];
1683
- var X = createLucideIcon("x", __iconNode24);
1801
+ var X = createLucideIcon("x", __iconNode26);
1684
1802
  // src/components/AgentCursor.tsx
1685
1803
  import { useContext as useContext6, useEffect as useEffect11, useLayoutEffect, useRef as useRef5, useState as useState11 } from "react";
1686
1804
 
@@ -3437,6 +3555,8 @@ function useLauncherDrag(containerRef, onDrop, followRefs, reportDragging) {
3437
3555
  const onPointerDown = (event) => {
3438
3556
  if (event.button !== 0)
3439
3557
  return;
3558
+ if (event.target instanceof Element && event.target.closest(`[${NO_DRAG_ATTR}]`))
3559
+ return;
3440
3560
  if (activePointerId !== null) {
3441
3561
  if (dragging)
3442
3562
  return;
@@ -3476,6 +3596,13 @@ import { twMerge } from "tailwind-merge";
3476
3596
  function cn(...inputs) {
3477
3597
  return twMerge(clsx(inputs));
3478
3598
  }
3599
+ function isEditableTarget() {
3600
+ const el = document.activeElement;
3601
+ if (!el)
3602
+ return false;
3603
+ const tag = el.tagName;
3604
+ return tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT" || el.isContentEditable;
3605
+ }
3479
3606
 
3480
3607
  // src/components/AdoptionBubble.tsx
3481
3608
  import { jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
@@ -3574,7 +3701,7 @@ function ModulePill({ module, onSelect }) {
3574
3701
 
3575
3702
  // src/components/MinimizedBubble.tsx
3576
3703
  import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
3577
- var GOALS_AUTO_HIDE_MS = 1e4;
3704
+ var GOALS_AUTO_HIDE_MS = 6000;
3578
3705
  var GOAL_FADE_OUT_MS = 300;
3579
3706
  var GOAL_APPEAR_STAGGER_MS = 150;
3580
3707
  var GOAL_EXIT_STAGGER_MS = 250;
@@ -4186,7 +4313,7 @@ function PageActionHandler() {
4186
4313
  }
4187
4314
 
4188
4315
  // src/components/SessionControlBar.tsx
4189
- import { useCallback as useCallback13, useContext as useContext8, useEffect as useEffect22, useState as useState15 } from "react";
4316
+ import { useCallback as useCallback14, useContext as useContext8, useEffect as useEffect23, useState as useState15 } from "react";
4190
4317
 
4191
4318
  // src/hooks/useActionControl.ts
4192
4319
  import { useLocalParticipant as useLocalParticipant6 } from "@livekit/components-react/hooks";
@@ -4319,18 +4446,13 @@ function useIdleAutoPause({
4319
4446
 
4320
4447
  // src/hooks/useKeyboardPushToTalk.ts
4321
4448
  import { useEffect as useEffect21, useRef as useRef14 } from "react";
4322
- function isEditableTarget() {
4323
- const el = document.activeElement;
4324
- if (!el)
4325
- return false;
4326
- const tag = el.tagName;
4327
- return tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT" || el.isContentEditable;
4328
- }
4329
4449
  function useKeyboardPushToTalk({
4330
4450
  enabled,
4331
4451
  onStart,
4332
4452
  onCommit,
4333
- onKeyUsed
4453
+ onKeyUsed,
4454
+ code = PUSH_TO_TALK_KEY,
4455
+ requireCtrl = false
4334
4456
  }) {
4335
4457
  const handlers = useRef14({ onStart, onCommit, onKeyUsed });
4336
4458
  handlers.current = { onStart, onCommit, onKeyUsed };
@@ -4345,7 +4467,7 @@ function useKeyboardPushToTalk({
4345
4467
  handlers.current.onCommit();
4346
4468
  };
4347
4469
  const onKeyDown = (event) => {
4348
- if (event.code !== PUSH_TO_TALK_KEY || event.repeat)
4470
+ if (event.code !== code || requireCtrl && !event.ctrlKey || event.repeat)
4349
4471
  return;
4350
4472
  if (isEditableTarget())
4351
4473
  return;
@@ -4357,7 +4479,7 @@ function useKeyboardPushToTalk({
4357
4479
  handlers.current.onStart();
4358
4480
  };
4359
4481
  const onKeyUp = (event) => {
4360
- if (event.code !== PUSH_TO_TALK_KEY)
4482
+ if (event.code !== code)
4361
4483
  return;
4362
4484
  event.preventDefault();
4363
4485
  release();
@@ -4378,7 +4500,7 @@ function useKeyboardPushToTalk({
4378
4500
  window.removeEventListener("blur", onWindowBlur);
4379
4501
  document.removeEventListener("visibilitychange", onVisibilityChange);
4380
4502
  };
4381
- }, [enabled]);
4503
+ }, [enabled, code, requireCtrl]);
4382
4504
  }
4383
4505
 
4384
4506
  // src/hooks/useLiveUserTranscript.ts
@@ -4471,6 +4593,50 @@ function PushToTalkHint() {
4471
4593
  });
4472
4594
  }
4473
4595
 
4596
+ // src/hooks/usePointerHold.ts
4597
+ import { useCallback as useCallback13, useEffect as useEffect22, useRef as useRef16 } from "react";
4598
+ function usePointerHold(onStart, onCommit) {
4599
+ const callbacks = useRef16({ onStart, onCommit });
4600
+ callbacks.current = { onStart, onCommit };
4601
+ const activeRef = useRef16(false);
4602
+ const teardownRef = useRef16(null);
4603
+ const end = useCallback13(() => {
4604
+ if (!activeRef.current)
4605
+ return;
4606
+ activeRef.current = false;
4607
+ teardownRef.current?.();
4608
+ teardownRef.current = null;
4609
+ callbacks.current.onCommit();
4610
+ }, []);
4611
+ const start = useCallback13((event) => {
4612
+ if (event.button !== 0 || activeRef.current)
4613
+ return;
4614
+ activeRef.current = true;
4615
+ const heldPointerId = event.pointerId;
4616
+ const onMove = (moveEvent) => {
4617
+ if (moveEvent.pointerId === heldPointerId && moveEvent.buttons === 0)
4618
+ end();
4619
+ };
4620
+ const onRelease = (releaseEvent) => {
4621
+ if (releaseEvent.pointerId === heldPointerId)
4622
+ end();
4623
+ };
4624
+ window.addEventListener("pointermove", onMove);
4625
+ window.addEventListener("pointerup", onRelease);
4626
+ window.addEventListener("pointercancel", onRelease);
4627
+ window.addEventListener("blur", end);
4628
+ teardownRef.current = () => {
4629
+ window.removeEventListener("pointermove", onMove);
4630
+ window.removeEventListener("pointerup", onRelease);
4631
+ window.removeEventListener("pointercancel", onRelease);
4632
+ window.removeEventListener("blur", end);
4633
+ };
4634
+ callbacks.current.onStart();
4635
+ }, [end]);
4636
+ useEffect22(() => end, [end]);
4637
+ return start;
4638
+ }
4639
+
4474
4640
  // src/components/PushToTalkMic.tsx
4475
4641
  import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
4476
4642
  function PushToTalkMic({
@@ -4480,14 +4646,13 @@ function PushToTalkMic({
4480
4646
  onCommit
4481
4647
  }) {
4482
4648
  const { barRefs, isTalking } = useMicLevel(isCapturingSpeech);
4649
+ const holdPushToTalk = usePointerHold(onStart, onCommit);
4483
4650
  const label = isCapturingSpeech ? "Release to send" : "Hold to talk";
4484
4651
  const withLabel = isCapturingSpeech || showLabel;
4485
4652
  return /* @__PURE__ */ jsxs7("button", {
4486
4653
  type: "button",
4487
- onPointerDown: onStart,
4488
- onPointerUp: onCommit,
4489
- onPointerLeave: onCommit,
4490
- onPointerCancel: onCommit,
4654
+ "data-skippr-no-drag": "",
4655
+ onPointerDown: holdPushToTalk,
4491
4656
  "aria-label": "Hold to talk",
4492
4657
  "aria-pressed": isCapturingSpeech,
4493
4658
  title: label,
@@ -4740,15 +4905,15 @@ function SessionControlBar() {
4740
4905
  }
4741
4906
  });
4742
4907
  const [pushToTalkHintSeen, setPushToTalkHintSeen] = useState15(false);
4743
- const startPushToTalk = useCallback13(() => {
4908
+ const startPushToTalk = useCallback14(() => {
4744
4909
  start();
4745
4910
  reportActivity();
4746
4911
  }, [start, reportActivity]);
4747
- const commitPushToTalk = useCallback13(() => {
4912
+ const commitPushToTalk = useCallback14(() => {
4748
4913
  commit();
4749
4914
  reportActivity();
4750
4915
  }, [commit, reportActivity]);
4751
- const dismissPushToTalkHint = useCallback13(() => {
4916
+ const dismissPushToTalkHint = useCallback14(() => {
4752
4917
  setPushToTalkHintSeen(true);
4753
4918
  }, []);
4754
4919
  useKeyboardPushToTalk({
@@ -4757,7 +4922,7 @@ function SessionControlBar() {
4757
4922
  onCommit: commitPushToTalk,
4758
4923
  onKeyUsed: dismissPushToTalkHint
4759
4924
  });
4760
- useEffect22(() => {
4925
+ useEffect23(() => {
4761
4926
  if (isHeld)
4762
4927
  minimizePanel();
4763
4928
  }, [isHeld, minimizePanel]);
@@ -5010,7 +5175,7 @@ function SessionControlBar() {
5010
5175
  }
5011
5176
 
5012
5177
  // src/components/ShadowHost.tsx
5013
- import { useLayoutEffect as useLayoutEffect2, useRef as useRef16, useState as useState16 } from "react";
5178
+ import { useLayoutEffect as useLayoutEffect2, useRef as useRef17, useState as useState16 } from "react";
5014
5179
  import { createPortal } from "react-dom";
5015
5180
 
5016
5181
  // src/lib/brandForeground.ts
@@ -5051,10 +5216,10 @@ function ShadowHost({
5051
5216
  children,
5052
5217
  accentColor
5053
5218
  }) {
5054
- const hostRef = useRef16(null);
5219
+ const hostRef = useRef17(null);
5055
5220
  const [shadowRoot, setShadowRoot] = useState16(null);
5056
5221
  const css = `/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
5057
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--skippr-font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--skippr-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--skippr-color-red-50:oklch(97.1% .013 17.38);--skippr-color-red-100:oklch(93.6% .032 17.717);--skippr-color-red-200:oklch(88.5% .062 18.334);--skippr-color-red-300:oklch(80.8% .114 19.571);--skippr-color-red-400:oklch(70.4% .191 22.216);--skippr-color-red-500:oklch(63.7% .237 25.331);--skippr-color-red-600:oklch(57.7% .245 27.325);--skippr-color-red-700:oklch(50.5% .213 27.518);--skippr-color-amber-50:oklch(98.7% .022 95.277);--skippr-color-amber-100:oklch(96.2% .059 95.617);--skippr-color-amber-400:oklch(82.8% .189 84.429);--skippr-color-amber-700:oklch(55.5% .163 48.998);--skippr-color-amber-950:oklch(27.9% .077 45.635);--skippr-color-emerald-400:oklch(76.5% .177 163.223);--skippr-color-neutral-100:oklch(97% 0 0);--skippr-color-neutral-200:oklch(92.2% 0 0);--skippr-color-neutral-500:oklch(55.6% 0 0);--skippr-color-neutral-700:oklch(37.1% 0 0);--skippr-color-black:#000;--skippr-color-white:#fff;--skippr-spacing:.25rem;--skippr-text-xs:.75rem;--skippr-text-xs--line-height:calc(1/.75);--skippr-text-sm:.875rem;--skippr-text-sm--line-height:calc(1.25/.875);--skippr-font-weight-medium:500;--skippr-font-weight-semibold:600;--skippr-leading-tight:1.25;--skippr-leading-snug:1.375;--skippr-leading-relaxed:1.625;--skippr-ease-out:cubic-bezier(0,0,.2,1);--skippr-ease-in-out:cubic-bezier(.4,0,.2,1);--skippr-animate-spin:spin 1s linear infinite;--skippr-animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--skippr-animate-bounce:bounce 1s infinite;--skippr-blur-sm:8px;--skippr-default-transition-duration:.15s;--skippr-default-transition-timing-function:cubic-bezier(.4,0,.2,1);--skippr-default-font-family:var(--skippr-font-sans);--skippr-default-mono-font-family:var(--skippr-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--skippr-default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--skippr-default-font-feature-settings,normal);font-variation-settings:var(--skippr-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--skippr-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--skippr-default-mono-font-feature-settings,normal);font-variation-settings:var(--skippr-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.skippr\\:pointer-events-none{pointer-events:none}.skippr\\:absolute{position:absolute}.skippr\\:fixed{position:fixed}.skippr\\:relative{position:relative}.skippr\\:sticky{position:sticky}.skippr\\:inset-0{inset:calc(var(--skippr-spacing)*0)}.skippr\\:inset-y-0{inset-block:calc(var(--skippr-spacing)*0)}.skippr\\:top-0{top:calc(var(--skippr-spacing)*0)}.skippr\\:top-1\\/2{top:50%}.skippr\\:top-full{top:100%}.skippr\\:-right-8{right:calc(var(--skippr-spacing)*-8)}.skippr\\:right-0{right:calc(var(--skippr-spacing)*0)}.skippr\\:right-3{right:calc(var(--skippr-spacing)*3)}.skippr\\:right-5{right:calc(var(--skippr-spacing)*5)}.skippr\\:right-6{right:calc(var(--skippr-spacing)*6)}.skippr\\:-bottom-1{bottom:calc(var(--skippr-spacing)*-1)}.skippr\\:bottom-3{bottom:calc(var(--skippr-spacing)*3)}.skippr\\:bottom-20{bottom:calc(var(--skippr-spacing)*20)}.skippr\\:bottom-full{bottom:100%}.skippr\\:-left-8{left:calc(var(--skippr-spacing)*-8)}.skippr\\:left-0{left:calc(var(--skippr-spacing)*0)}.skippr\\:left-1\\/2{left:50%}.skippr\\:left-2{left:calc(var(--skippr-spacing)*2)}.skippr\\:left-3{left:calc(var(--skippr-spacing)*3)}.skippr\\:left-5{left:calc(var(--skippr-spacing)*5)}.skippr\\:left-6{left:calc(var(--skippr-spacing)*6)}.skippr\\:z-10{z-index:10}.skippr\\:z-20{z-index:20}.skippr\\:z-\\[9998\\]{z-index:9998}.skippr\\:z-\\[9999\\]{z-index:9999}.skippr\\:z-\\[10000\\]{z-index:10000}.skippr\\:order-first{order:-9999}.skippr\\:order-last{order:9999}.skippr\\:mx-auto{margin-inline:auto}.skippr\\:-mt-\\[5px\\]{margin-top:-5px}.skippr\\:-mt-\\[27px\\]{margin-top:-27px}.skippr\\:mt-0\\.5{margin-top:calc(var(--skippr-spacing)*.5)}.skippr\\:mt-1{margin-top:calc(var(--skippr-spacing)*1)}.skippr\\:mt-1\\.5{margin-top:calc(var(--skippr-spacing)*1.5)}.skippr\\:mt-2{margin-top:calc(var(--skippr-spacing)*2)}.skippr\\:mt-3{margin-top:calc(var(--skippr-spacing)*3)}.skippr\\:mt-3\\.5{margin-top:calc(var(--skippr-spacing)*3.5)}.skippr\\:mr-7{margin-right:calc(var(--skippr-spacing)*7)}.skippr\\:-mb-\\[5px\\]{margin-bottom:-5px}.skippr\\:mb-1\\.5{margin-bottom:calc(var(--skippr-spacing)*1.5)}.skippr\\:mb-2{margin-bottom:calc(var(--skippr-spacing)*2)}.skippr\\:mb-3{margin-bottom:calc(var(--skippr-spacing)*3)}.skippr\\:mb-4{margin-bottom:calc(var(--skippr-spacing)*4)}.skippr\\:ml-0\\.5{margin-left:calc(var(--skippr-spacing)*.5)}.skippr\\:ml-1{margin-left:calc(var(--skippr-spacing)*1)}.skippr\\:ml-7{margin-left:calc(var(--skippr-spacing)*7)}.skippr\\:flex{display:flex}.skippr\\:hidden{display:none}.skippr\\:inline-flex{display:inline-flex}.skippr\\:size-1{width:calc(var(--skippr-spacing)*1);height:calc(var(--skippr-spacing)*1)}.skippr\\:size-1\\.5{width:calc(var(--skippr-spacing)*1.5);height:calc(var(--skippr-spacing)*1.5)}.skippr\\:size-2{width:calc(var(--skippr-spacing)*2);height:calc(var(--skippr-spacing)*2)}.skippr\\:size-2\\.5{width:calc(var(--skippr-spacing)*2.5);height:calc(var(--skippr-spacing)*2.5)}.skippr\\:size-3{width:calc(var(--skippr-spacing)*3);height:calc(var(--skippr-spacing)*3)}.skippr\\:size-3\\.5{width:calc(var(--skippr-spacing)*3.5);height:calc(var(--skippr-spacing)*3.5)}.skippr\\:size-4{width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}.skippr\\:size-5{width:calc(var(--skippr-spacing)*5);height:calc(var(--skippr-spacing)*5)}.skippr\\:size-6{width:calc(var(--skippr-spacing)*6);height:calc(var(--skippr-spacing)*6)}.skippr\\:size-7{width:calc(var(--skippr-spacing)*7);height:calc(var(--skippr-spacing)*7)}.skippr\\:size-8{width:calc(var(--skippr-spacing)*8);height:calc(var(--skippr-spacing)*8)}.skippr\\:size-9{width:calc(var(--skippr-spacing)*9);height:calc(var(--skippr-spacing)*9)}.skippr\\:size-10{width:calc(var(--skippr-spacing)*10);height:calc(var(--skippr-spacing)*10)}.skippr\\:size-12{width:calc(var(--skippr-spacing)*12);height:calc(var(--skippr-spacing)*12)}.skippr\\:size-\\[5px\\]{width:5px;height:5px}.skippr\\:size-\\[38px\\]{width:38px;height:38px}.skippr\\:size-full{width:100%;height:100%}.skippr\\:h-0{height:calc(var(--skippr-spacing)*0)}.skippr\\:h-0\\.5{height:calc(var(--skippr-spacing)*.5)}.skippr\\:h-1{height:calc(var(--skippr-spacing)*1)}.skippr\\:h-1\\.5{height:calc(var(--skippr-spacing)*1.5)}.skippr\\:h-2{height:calc(var(--skippr-spacing)*2)}.skippr\\:h-3{height:calc(var(--skippr-spacing)*3)}.skippr\\:h-3\\.5{height:calc(var(--skippr-spacing)*3.5)}.skippr\\:h-4{height:calc(var(--skippr-spacing)*4)}.skippr\\:h-5{height:calc(var(--skippr-spacing)*5)}.skippr\\:h-6{height:calc(var(--skippr-spacing)*6)}.skippr\\:h-7{height:calc(var(--skippr-spacing)*7)}.skippr\\:h-8{height:calc(var(--skippr-spacing)*8)}.skippr\\:h-9{height:calc(var(--skippr-spacing)*9)}.skippr\\:h-10{height:calc(var(--skippr-spacing)*10)}.skippr\\:h-\\[18\\.5px\\]{height:18.5px}.skippr\\:h-\\[36px\\]{height:36px}.skippr\\:h-\\[38px\\]{height:38px}.skippr\\:h-\\[48px\\]{height:48px}.skippr\\:h-\\[54px\\]{height:54px}.skippr\\:h-full{height:100%}.skippr\\:min-h-0{min-height:calc(var(--skippr-spacing)*0)}.skippr\\:min-h-11{min-height:calc(var(--skippr-spacing)*11)}.skippr\\:w-0{width:calc(var(--skippr-spacing)*0)}.skippr\\:w-3\\.5{width:calc(var(--skippr-spacing)*3.5)}.skippr\\:w-4{width:calc(var(--skippr-spacing)*4)}.skippr\\:w-5{width:calc(var(--skippr-spacing)*5)}.skippr\\:w-6{width:calc(var(--skippr-spacing)*6)}.skippr\\:w-7{width:calc(var(--skippr-spacing)*7)}.skippr\\:w-8{width:calc(var(--skippr-spacing)*8)}.skippr\\:w-10{width:calc(var(--skippr-spacing)*10)}.skippr\\:w-40{width:calc(var(--skippr-spacing)*40)}.skippr\\:w-\\[2px\\]{width:2px}.skippr\\:w-\\[3px\\]{width:3px}.skippr\\:w-\\[15\\.4px\\]{width:15.4px}.skippr\\:w-\\[36px\\]{width:36px}.skippr\\:w-\\[38px\\]{width:38px}.skippr\\:w-\\[50px\\]{width:50px}.skippr\\:w-fit{width:fit-content}.skippr\\:w-full{width:100%}.skippr\\:max-w-64{max-width:calc(var(--skippr-spacing)*64)}.skippr\\:max-w-72{max-width:calc(var(--skippr-spacing)*72)}.skippr\\:max-w-\\[80\\%\\]{max-width:80%}.skippr\\:max-w-\\[280px\\]{max-width:280px}.skippr\\:min-w-0{min-width:calc(var(--skippr-spacing)*0)}.skippr\\:min-w-11{min-width:calc(var(--skippr-spacing)*11)}.skippr\\:flex-1{flex:1}.skippr\\:shrink-0{flex-shrink:0}.skippr\\:origin-bottom-left{transform-origin:0 100%}.skippr\\:origin-bottom-right{transform-origin:100% 100%}.skippr\\:origin-center{transform-origin:50%}.skippr\\:origin-left{transform-origin:0}.skippr\\:origin-right{transform-origin:100%}.skippr\\:origin-top-left{transform-origin:0 0}.skippr\\:origin-top-right{transform-origin:100% 0}.skippr\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-x-3{--tw-translate-x:calc(var(--skippr-spacing)*-3);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-x-7{--tw-translate-x:calc(var(--skippr-spacing)*-7);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:translate-x-3{--tw-translate-x:calc(var(--skippr-spacing)*3);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:translate-x-7{--tw-translate-x:calc(var(--skippr-spacing)*7);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-\\[0\\.94\\]{scale:.94}.skippr\\:-rotate-90{rotate:-90deg}.skippr\\:rotate-45{rotate:45deg}.skippr\\:rotate-\\[225deg\\]{rotate:225deg}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out\\]{animation:.2s ease-out skippr-agent-in}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out_240ms_both\\]{animation:.2s ease-out .24s both skippr-agent-in}.skippr\\:\\[animation\\:skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:\\[animation\\:skippr-finger-tap_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-finger-tap}.skippr\\:\\[animation\\:skippr-orb-in_320ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)\\]{animation:.32s cubic-bezier(.34,1.3,.64,1) skippr-orb-in}.skippr\\:\\[animation\\:skippr-stage-fade_240ms_ease-out\\]{animation:.24s ease-out skippr-stage-fade}.skippr\\:\\[animation\\:skippr-tip-in_360ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)_backwards\\]{animation:.36s cubic-bezier(.34,1.3,.64,1) backwards skippr-tip-in}.skippr\\:\\[animation\\:skippr-toolset-pop_280ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.28s cubic-bezier(.22,1,.36,1) skippr-toolset-pop}.skippr\\:\\[animation\\:skippr-toolset-pop_440ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.44s cubic-bezier(.22,1,.36,1) skippr-toolset-pop}.skippr\\:animate-\\[skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:animate-\\[skippr-bubble-in_0\\.28s_ease-out\\]{animation:.28s ease-out skippr-bubble-in}.skippr\\:animate-\\[skippr-fade-in_0\\.3s_ease-out\\]{animation:.3s ease-out skippr-fade-in}.skippr\\:animate-\\[skippr-pill-content_0\\.22s_ease-out\\]{animation:.22s ease-out skippr-pill-content}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.3s_infinite\\]{animation:1.1s ease-in-out .3s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.6s_infinite\\]{animation:1.1s ease-in-out .6s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.15s_infinite\\]{animation:1.1s ease-in-out .15s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.45s_infinite\\]{animation:1.1s ease-in-out .45s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-speak}.skippr\\:animate-bounce{animation:var(--skippr-animate-bounce)}.skippr\\:animate-ping{animation:var(--skippr-animate-ping)}.skippr\\:animate-skippr-annotation-pulse{animation:1.8s ease-in-out infinite skippr-annotation-pulse}.skippr\\:animate-skippr-click-ping{animation:.5s ease-out forwards skippr-click-ping}.skippr\\:animate-skippr-cursor-pop{animation:.22s ease-out skippr-cursor-pop}.skippr\\:animate-skippr-press{animation:.5s ease-in-out skippr-press}.skippr\\:animate-skippr-ptt-transmit{animation:1.4s ease-out infinite skippr-ptt-transmit}.skippr\\:animate-skippr-rec-ring{animation:2s ease-out infinite skippr-rec-ring}.skippr\\:animate-skippr-tab-fade{animation:.2s ease-out skippr-tab-fade}.skippr\\:animate-skippr-thinking-dot{animation:1.2s ease-in-out infinite skippr-thinking-dot}.skippr\\:animate-spin{animation:var(--skippr-animate-spin)}.skippr\\:cursor-default{cursor:default}.skippr\\:cursor-grab{cursor:grab}.skippr\\:cursor-not-allowed{cursor:not-allowed}.skippr\\:cursor-pointer{cursor:pointer}.skippr\\:touch-none{touch-action:none}.skippr\\:resize-none{resize:none}.skippr\\:flex-col{flex-direction:column}.skippr\\:flex-col-reverse{flex-direction:column-reverse}.skippr\\:items-center{align-items:center}.skippr\\:items-end{align-items:flex-end}.skippr\\:items-start{align-items:flex-start}.skippr\\:justify-between{justify-content:space-between}.skippr\\:justify-center{justify-content:center}.skippr\\:justify-end{justify-content:flex-end}.skippr\\:justify-start{justify-content:flex-start}.skippr\\:gap-0\\.5{gap:calc(var(--skippr-spacing)*.5)}.skippr\\:gap-1{gap:calc(var(--skippr-spacing)*1)}.skippr\\:gap-1\\.5{gap:calc(var(--skippr-spacing)*1.5)}.skippr\\:gap-2{gap:calc(var(--skippr-spacing)*2)}.skippr\\:gap-2\\.5{gap:calc(var(--skippr-spacing)*2.5)}.skippr\\:gap-3{gap:calc(var(--skippr-spacing)*3)}.skippr\\:gap-\\[2px\\]{gap:2px}.skippr\\:gap-\\[3px\\]{gap:3px}:where(.skippr\\:space-y-0\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}.skippr\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.skippr\\:overflow-hidden{overflow:hidden}.skippr\\:overflow-y-auto{overflow-y:auto}.skippr\\:rounded{border-radius:.25rem}.skippr\\:rounded-2xl{border-radius:1.125rem}.skippr\\:rounded-\\[1rem\\]{border-radius:1rem}.skippr\\:rounded-\\[10px\\]{border-radius:10px}.skippr\\:rounded-\\[11px\\]{border-radius:11px}.skippr\\:rounded-\\[12px\\]{border-radius:12px}.skippr\\:rounded-\\[14px\\]{border-radius:14px}.skippr\\:rounded-\\[16px\\]{border-radius:16px}.skippr\\:rounded-\\[20px\\]{border-radius:20px}.skippr\\:rounded-full{border-radius:3.40282e38px}.skippr\\:rounded-lg{border-radius:.625rem}.skippr\\:rounded-md{border-radius:.5rem}.skippr\\:rounded-sm{border-radius:.375rem}.skippr\\:rounded-xl{border-radius:.875rem}.skippr\\:rounded-l-\\[18px\\]{border-top-left-radius:18px;border-bottom-left-radius:18px}.skippr\\:rounded-tl-md{border-top-left-radius:.5rem}.skippr\\:rounded-r-\\[18px\\]{border-top-right-radius:18px;border-bottom-right-radius:18px}.skippr\\:border{border-style:var(--tw-border-style);border-width:1px}.skippr\\:border-0{border-style:var(--tw-border-style);border-width:0}.skippr\\:border-2{border-style:var(--tw-border-style);border-width:2px}.skippr\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.skippr\\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.skippr\\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.skippr\\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.skippr\\:border-black\\/25{border-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-black\\/25{border-color:color-mix(in oklab,var(--skippr-color-black)25%,transparent)}}.skippr\\:border-border{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-brand{border-color:var(--skippr-brand,#2bc0ae)}.skippr\\:border-input{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-primary\\/20{border-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-primary\\/20{border-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)20%,transparent)}}.skippr\\:border-r-border{border-right-color:oklch(92.3% .003 48.717)}.skippr\\:border-l-border{border-left-color:oklch(92.3% .003 48.717)}.skippr\\:bg-\\[\\#f4ecd8\\]{background-color:#f4ecd8}.skippr\\:bg-amber-50{background-color:var(--skippr-color-amber-50)}.skippr\\:bg-amber-400{background-color:var(--skippr-color-amber-400)}.skippr\\:bg-background{background-color:oklch(100% 0 0)}.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:color-mix(in oklab,var(--skippr-color-black)7.0%,transparent)}}.skippr\\:bg-brand,.skippr\\:bg-brand\\/50{background-color:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-brand\\/50{background-color:color-mix(in oklab,var(--skippr-brand,#2bc0ae)50%,transparent)}}.skippr\\:bg-bubble{background-color:#2d2b3d}.skippr\\:bg-bubble\\/95{background-color:oklab(29.9244% .0107414 -.0305411/.95)}.skippr\\:bg-card{background-color:oklch(100% 0 0)}.skippr\\:bg-current{background-color:currentColor}.skippr\\:bg-destructive{background-color:#d94f4f}.skippr\\:bg-emerald-400{background-color:var(--skippr-color-emerald-400)}.skippr\\:bg-foreground{background-color:oklch(14.7% .004 49.25)}.skippr\\:bg-launcher{background-color:#2d2d3f}.skippr\\:bg-muted-foreground\\/20{background-color:oklab(55.3% .00687528 .0110332/.2)}.skippr\\:bg-muted-foreground\\/40{background-color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:bg-muted\\/50{background-color:oklab(97% -.000282743 .000959196/.5)}.skippr\\:bg-neutral-100{background-color:var(--skippr-color-neutral-100)}.skippr\\:bg-primary{background-color:var(--skippr-brand,#2d2b3d)}.skippr\\:bg-primary-foreground\\/15{background-color:var(--skippr-brand-foreground,#fff)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-primary-foreground\\/15{background-color:color-mix(in oklab,var(--skippr-brand-foreground,#fff)15%,transparent)}}.skippr\\:bg-primary-foreground\\/20{background-color:var(--skippr-brand-foreground,#fff)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-primary-foreground\\/20{background-color:color-mix(in oklab,var(--skippr-brand-foreground,#fff)20%,transparent)}}.skippr\\:bg-primary\\/10{background-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-primary\\/10{background-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)10%,transparent)}}.skippr\\:bg-red-50{background-color:var(--skippr-color-red-50)}.skippr\\:bg-red-100{background-color:var(--skippr-color-red-100)}.skippr\\:bg-red-400{background-color:var(--skippr-color-red-400)}.skippr\\:bg-red-500{background-color:var(--skippr-color-red-500)}.skippr\\:bg-secondary{background-color:#ffdfb5}.skippr\\:bg-transparent{background-color:#0000}.skippr\\:bg-white,.skippr\\:bg-white\\/70{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/70{background-color:color-mix(in oklab,var(--skippr-color-white)70%,transparent)}}.skippr\\:fill-brand{fill:var(--skippr-brand,#2bc0ae)}.skippr\\:fill-primary\\/30{fill:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:fill-primary\\/30{fill:color-mix(in oklab,var(--skippr-brand,#2d2b3d)30%,transparent)}}.skippr\\:stroke-black\\/15{stroke:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:stroke-black\\/15{stroke:color-mix(in oklab,var(--skippr-color-black)15%,transparent)}}.skippr\\:stroke-bubble{stroke:#2d2b3d}.skippr\\:object-cover{object-fit:cover}.skippr\\:p-0{padding:calc(var(--skippr-spacing)*0)}.skippr\\:p-0\\.5{padding:calc(var(--skippr-spacing)*.5)}.skippr\\:p-1\\.5{padding:calc(var(--skippr-spacing)*1.5)}.skippr\\:p-2{padding:calc(var(--skippr-spacing)*2)}.skippr\\:p-3{padding:calc(var(--skippr-spacing)*3)}.skippr\\:p-3\\.5{padding:calc(var(--skippr-spacing)*3.5)}.skippr\\:p-4{padding:calc(var(--skippr-spacing)*4)}.skippr\\:px-1{padding-inline:calc(var(--skippr-spacing)*1)}.skippr\\:px-1\\.5{padding-inline:calc(var(--skippr-spacing)*1.5)}.skippr\\:px-2{padding-inline:calc(var(--skippr-spacing)*2)}.skippr\\:px-2\\.5{padding-inline:calc(var(--skippr-spacing)*2.5)}.skippr\\:px-3{padding-inline:calc(var(--skippr-spacing)*3)}.skippr\\:px-3\\.5{padding-inline:calc(var(--skippr-spacing)*3.5)}.skippr\\:px-4{padding-inline:calc(var(--skippr-spacing)*4)}.skippr\\:px-6{padding-inline:calc(var(--skippr-spacing)*6)}.skippr\\:px-8{padding-inline:calc(var(--skippr-spacing)*8)}.skippr\\:py-0\\.5{padding-block:calc(var(--skippr-spacing)*.5)}.skippr\\:py-1{padding-block:calc(var(--skippr-spacing)*1)}.skippr\\:py-1\\.5{padding-block:calc(var(--skippr-spacing)*1.5)}.skippr\\:py-2{padding-block:calc(var(--skippr-spacing)*2)}.skippr\\:py-2\\.5{padding-block:calc(var(--skippr-spacing)*2.5)}.skippr\\:py-3{padding-block:calc(var(--skippr-spacing)*3)}.skippr\\:py-4{padding-block:calc(var(--skippr-spacing)*4)}.skippr\\:py-6{padding-block:calc(var(--skippr-spacing)*6)}.skippr\\:pt-1\\.5{padding-top:calc(var(--skippr-spacing)*1.5)}.skippr\\:pr-2\\.5{padding-right:calc(var(--skippr-spacing)*2.5)}.skippr\\:pr-3{padding-right:calc(var(--skippr-spacing)*3)}.skippr\\:pb-2{padding-bottom:calc(var(--skippr-spacing)*2)}.skippr\\:pl-1\\.5{padding-left:calc(var(--skippr-spacing)*1.5)}.skippr\\:pl-2\\.5{padding-left:calc(var(--skippr-spacing)*2.5)}.skippr\\:pl-3\\.5{padding-left:calc(var(--skippr-spacing)*3.5)}.skippr\\:text-center{text-align:center}.skippr\\:text-left{text-align:left}.skippr\\:font-mono{font-family:var(--skippr-font-mono)}.skippr\\:text-sm{font-size:var(--skippr-text-sm);line-height:var(--tw-leading,var(--skippr-text-sm--line-height))}.skippr\\:text-xs{font-size:var(--skippr-text-xs);line-height:var(--tw-leading,var(--skippr-text-xs--line-height))}.skippr\\:text-\\[10px\\]{font-size:10px}.skippr\\:text-\\[11px\\]{font-size:11px}.skippr\\:text-\\[13px\\]{font-size:13px}.skippr\\:leading-5{--tw-leading:calc(var(--skippr-spacing)*5);line-height:calc(var(--skippr-spacing)*5)}.skippr\\:leading-none{--tw-leading:1;line-height:1}.skippr\\:leading-relaxed{--tw-leading:var(--skippr-leading-relaxed);line-height:var(--skippr-leading-relaxed)}.skippr\\:leading-snug{--tw-leading:var(--skippr-leading-snug);line-height:var(--skippr-leading-snug)}.skippr\\:leading-tight{--tw-leading:var(--skippr-leading-tight);line-height:var(--skippr-leading-tight)}.skippr\\:font-medium{--tw-font-weight:var(--skippr-font-weight-medium);font-weight:var(--skippr-font-weight-medium)}.skippr\\:font-semibold{--tw-font-weight:var(--skippr-font-weight-semibold);font-weight:var(--skippr-font-weight-semibold)}.skippr\\:whitespace-nowrap{white-space:nowrap}.skippr\\:text-amber-700{color:var(--skippr-color-amber-700)}.skippr\\:text-amber-950{color:var(--skippr-color-amber-950)}.skippr\\:text-background{color:oklch(100% 0 0)}.skippr\\:text-black,.skippr\\:text-black\\/40{color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-black\\/40{color:color-mix(in oklab,var(--skippr-color-black)40%,transparent)}}.skippr\\:text-brand{color:var(--skippr-brand,#2bc0ae)}.skippr\\:text-bubble{color:#2d2b3d}.skippr\\:text-chart-3{color:oklch(66.6% .179 58.318)}.skippr\\:text-destructive{color:#d94f4f}.skippr\\:text-foreground{color:oklch(14.7% .004 49.25)}.skippr\\:text-muted-foreground{color:oklch(55.3% .013 58.071)}.skippr\\:text-muted-foreground\\/30{color:oklab(55.3% .00687528 .0110332/.3)}.skippr\\:text-muted-foreground\\/40{color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:text-muted-foreground\\/60{color:oklab(55.3% .00687528 .0110332/.6)}.skippr\\:text-muted-foreground\\/70{color:oklab(55.3% .00687528 .0110332/.7)}.skippr\\:text-neutral-500{color:var(--skippr-color-neutral-500)}.skippr\\:text-neutral-700{color:var(--skippr-color-neutral-700)}.skippr\\:text-primary{color:var(--skippr-brand,#2d2b3d)}.skippr\\:text-primary-foreground,.skippr\\:text-primary-foreground\\/70{color:var(--skippr-brand-foreground,#fff)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-primary-foreground\\/70{color:color-mix(in oklab,var(--skippr-brand-foreground,#fff)70%,transparent)}}.skippr\\:text-red-400{color:var(--skippr-color-red-400)}.skippr\\:text-red-600{color:var(--skippr-color-red-600)}.skippr\\:text-red-700{color:var(--skippr-color-red-700)}.skippr\\:text-secondary-foreground{color:#613700}.skippr\\:text-white,.skippr\\:text-white\\/60{color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-white\\/60{color:color-mix(in oklab,var(--skippr-color-white)60%,transparent)}}.skippr\\:capitalize{text-transform:capitalize}.skippr\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.skippr\\:line-through{text-decoration-line:line-through}.skippr\\:placeholder-muted-foreground::placeholder{color:oklch(55.3% .013 58.071)}.skippr\\:opacity-0{opacity:0}.skippr\\:opacity-40{opacity:.4}.skippr\\:opacity-75{opacity:.75}.skippr\\:opacity-100{opacity:1}.skippr\\:shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[-6px_8px_30px_rgba\\(15\\,18\\,26\\,0\\.32\\)\\]{--tw-shadow:-6px 8px 30px var(--tw-shadow-color,#0f121a52);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_2px_6px_rgba\\(0\\,0\\,0\\,0\\.28\\)\\]{--tw-shadow:0 2px 6px var(--tw-shadow-color,#00000047);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_12px_rgba\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow:0 4px 12px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_14px_rgba\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_14px_rgba\\(239\\,68\\,68\\,0\\.45\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#ef444473);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_16px_rgba\\(45\\,43\\,61\\,0\\.45\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#2d2b3d73),0 2px 4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(45\\,43\\,61\\,0\\.35\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#2d2b3d59);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_30px_rgba\\(0\\,0\\,0\\,0\\.16\\)\\,0_4px_12px_rgba\\(0\\,0\\,0\\,0\\.08\\)\\]{--tw-shadow:0 8px 30px var(--tw-shadow-color,#00000029),0 4px 12px var(--tw-shadow-color,#00000014);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_32px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 10px 32px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-black\\/5{--tw-ring-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-black\\/5{--tw-ring-color:color-mix(in oklab,var(--skippr-color-black)5%,transparent)}}.skippr\\:ring-brand{--tw-ring-color:var(--skippr-brand,#2bc0ae)}.skippr\\:ring-foreground\\/10{--tw-ring-color:oklab(14.7% .00261104 .00303026/.1)}.skippr\\:ring-primary-foreground\\/30{--tw-ring-color:var(--skippr-brand-foreground,#fff)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-primary-foreground\\/30{--tw-ring-color:color-mix(in oklab,var(--skippr-brand-foreground,#fff)30%,transparent)}}.skippr\\:ring-white\\/15{--tw-ring-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-white\\/15{--tw-ring-color:color-mix(in oklab,var(--skippr-color-white)15%,transparent)}}.skippr\\:ring-offset-background{--tw-ring-offset-color:oklch(100% 0 0)}.skippr\\:drop-shadow-\\[0_2px_5px_rgba\\(0\\,0\\,0\\,0\\.4\\)\\]{--tw-drop-shadow-size:drop-shadow(0 2px 5px var(--tw-drop-shadow-color,#0006));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.skippr\\:backdrop-blur-sm{--tw-backdrop-blur:blur(var(--skippr-blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.skippr\\:transition-\\[height\\]{transition-property:height;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[opacity\\,transform\\,height\\]{transition-property:opacity,transform,height;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\,margin\\]{transition-property:width,margin;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:duration-75{--tw-duration:75ms;transition-duration:75ms}.skippr\\:duration-100{--tw-duration:.1s;transition-duration:.1s}.skippr\\:duration-150{--tw-duration:.15s;transition-duration:.15s}.skippr\\:duration-200{--tw-duration:.2s;transition-duration:.2s}.skippr\\:duration-300{--tw-duration:.3s;transition-duration:.3s}.skippr\\:duration-\\[400ms\\]{--tw-duration:.4s;transition-duration:.4s}.skippr\\:ease-\\[cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{--tw-ease:cubic-bezier(.22,1,.36,1);transition-timing-function:cubic-bezier(.22,1,.36,1)}.skippr\\:ease-\\[cubic-bezier\\(0\\.34\\,1\\.56\\,0\\.64\\,1\\)\\]{--tw-ease:cubic-bezier(.34,1.56,.64,1);transition-timing-function:cubic-bezier(.34,1.56,.64,1)}.skippr\\:ease-in-out{--tw-ease:var(--skippr-ease-in-out);transition-timing-function:var(--skippr-ease-in-out)}.skippr\\:ease-out{--tw-ease:var(--skippr-ease-out);transition-timing-function:var(--skippr-ease-out)}.skippr\\:outline-none{--tw-outline-style:none;outline-style:none}.skippr\\:select-none{-webkit-user-select:none;user-select:none}.skippr\\:\\[animation-delay\\:0ms\\]{animation-delay:0s}.skippr\\:\\[animation-delay\\:150ms\\]{animation-delay:.15s}.skippr\\:\\[animation-delay\\:200ms\\]{animation-delay:.2s}.skippr\\:\\[animation-delay\\:300ms\\]{animation-delay:.3s}.skippr\\:\\[animation-delay\\:400ms\\]{animation-delay:.4s}.skippr\\:\\[overflow-anchor\\:none\\]{overflow-anchor:none}.skippr\\:group-focus-within\\:scale-100:is(:where(.skippr\\:group):focus-within *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-focus-within\\:opacity-100:is(:where(.skippr\\:group):focus-within *){opacity:1}@media (hover:hover){.skippr\\:group-hover\\:scale-100:is(:where(.skippr\\:group):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-hover\\:text-red-300:is(:where(.skippr\\:group):hover *){color:var(--skippr-color-red-300)}.skippr\\:group-hover\\:text-white\\/80:is(:where(.skippr\\:group):hover *){color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:group-hover\\:text-white\\/80:is(:where(.skippr\\:group):hover *){color:color-mix(in oklab,var(--skippr-color-white)80%,transparent)}}.skippr\\:group-hover\\:opacity-100:is(:where(.skippr\\:group):hover *){opacity:1}}.skippr\\:placeholder\\:text-muted-foreground::placeholder{color:oklch(55.3% .013 58.071)}@media (hover:hover){.skippr\\:hover\\:-translate-y-0\\.5:hover{--tw-translate-y:calc(var(--skippr-spacing)*-.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:hover\\:bg-\\[\\#3a384b\\]:hover{background-color:#3a384b}.skippr\\:hover\\:bg-accent:hover{background-color:#e7e5e4}.skippr\\:hover\\:bg-amber-100:hover{background-color:var(--skippr-color-amber-100)}.skippr\\:hover\\:bg-bubble:hover{background-color:#2d2b3d}.skippr\\:hover\\:bg-destructive\\/90:hover{background-color:oklab(61.4357% .15892 .0698893/.9)}.skippr\\:hover\\:bg-muted:hover{background-color:oklch(97% .001 106.424)}.skippr\\:hover\\:bg-neutral-100:hover{background-color:var(--skippr-color-neutral-100)}.skippr\\:hover\\:bg-neutral-200:hover{background-color:var(--skippr-color-neutral-200)}.skippr\\:hover\\:bg-primary-foreground\\/10:hover{background-color:var(--skippr-brand-foreground,#fff)}@supports (color:color-mix(in lab, red, red)){.skippr\\:hover\\:bg-primary-foreground\\/10:hover{background-color:color-mix(in oklab,var(--skippr-brand-foreground,#fff)10%,transparent)}}.skippr\\:hover\\:bg-primary\\/90:hover{background-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)90%,transparent)}}.skippr\\:hover\\:bg-red-200:hover{background-color:var(--skippr-color-red-200)}.skippr\\:hover\\:bg-red-600:hover{background-color:var(--skippr-color-red-600)}.skippr\\:hover\\:bg-secondary\\/80:hover{background-color:oklab(91.9963% .0175391 .0626889/.8)}.skippr\\:hover\\:text-accent-foreground:hover{color:oklch(21.6% .006 56.043)}.skippr\\:hover\\:text-foreground:hover{color:oklch(14.7% .004 49.25)}.skippr\\:hover\\:text-primary-foreground:hover{color:var(--skippr-brand-foreground,#fff)}.skippr\\:hover\\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}}.skippr\\:focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:focus-visible\\:ring-bubble\\/60:focus-visible{--tw-ring-color:oklab(29.9244% .0107414 -.0305411/.6)}.skippr\\:focus-visible\\:ring-primary-foreground:focus-visible{--tw-ring-color:var(--skippr-brand-foreground,#fff)}.skippr\\:focus-visible\\:ring-ring:focus-visible{--tw-ring-color:oklch(70.9% .01 56.259)}.skippr\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.skippr\\:focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.skippr\\:active\\:translate-y-0:active{--tw-translate-y:calc(var(--skippr-spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.skippr\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.skippr\\:disabled\\:opacity-50:disabled{opacity:.5}.skippr\\:disabled\\:opacity-60:disabled{opacity:.6}@media (prefers-reduced-motion:reduce){.skippr\\:motion-reduce\\:hidden{display:none}.skippr\\:motion-reduce\\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:motion-reduce\\:animate-none{animation:none}}.skippr\\:\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.skippr\\:\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.skippr\\:\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}}@keyframes skippr-tap{0%{transform:scale(1)}45%{transform:scale(.7)}to{transform:scale(1)}}@keyframes skippr-press{0%{transform:scale(1)}55%{transform:scale(1)}85%{transform:scale(.68)}to{transform:scale(1)}}@keyframes skippr-cursor-pop{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}@keyframes skippr-click-ping{0%{opacity:.9;transform:translate(-50%,-50%)scale(.4)}to{opacity:0;transform:translate(-50%,-50%)scale(2.4)}}@keyframes skippr-tab-fade{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-speak{0%,to{opacity:.6;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-thinking-dot{0%,80%,to{opacity:.2;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}@keyframes skippr-pulse-ring{0%,to{box-shadow:0 0 #2d2b3d66}50%{box-shadow:0 0 0 10px #2d2b3d00}}@keyframes skippr-rec-ring{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)55%,transparent)}70%{box-shadow:0 0 0 11px #0000}to{box-shadow:0 0 #0000}}@keyframes skippr-ptt-transmit{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)60%,transparent),0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)35%,transparent)}70%{box-shadow:0 0 0 9px #0000,0 0 0 16px #0000}to{box-shadow:0 0 #0000,0 0 #0000}}@keyframes skippr-annotation-pulse{0%,to{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)50%,transparent)}50%{box-shadow:0 0 0 6px #0000}}@keyframes skippr-speak-ripple{0%{opacity:.6;transform:scale(1)}to{opacity:0;transform:scale(1.8)}}@keyframes skippr-bar{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}@keyframes skippr-breathe{0%,to{opacity:.85;transform:scale(1)}50%{opacity:1;transform:scale(1.08)}}@keyframes skippr-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-wave{0%,to{opacity:.4;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-bubble-in{0%{opacity:0;transform:translateY(12px)scale(.96)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-tip-in{0%{opacity:0;transform:translateY(14px)scale(.96)}60%{opacity:1;transform:translateY(-2px)scale(1.01)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-pill-content{0%{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}@keyframes skippr-banner-look{0%,to{transform:translate(0)}25%{transform:translate(-2px)}75%{transform:translate(2px)}}@keyframes skippr-finger-tap{0%,to{transform:translateY(0)rotate(0)}50%{transform:translateY(2px)rotate(-6deg)}}@keyframes skippr-toolset-pop{0%{opacity:0;transform:scale(.85)}to{opacity:1;transform:scale(1)}}@keyframes skippr-stage-fade{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}@keyframes skippr-agent-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}@keyframes skippr-orb-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}.skippr-no-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.skippr-no-scrollbar::-webkit-scrollbar{display:none}:host{color:var(--color-foreground)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}`;
5222
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--skippr-font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--skippr-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--skippr-color-red-50:oklch(97.1% .013 17.38);--skippr-color-red-100:oklch(93.6% .032 17.717);--skippr-color-red-200:oklch(88.5% .062 18.334);--skippr-color-red-300:oklch(80.8% .114 19.571);--skippr-color-red-400:oklch(70.4% .191 22.216);--skippr-color-red-500:oklch(63.7% .237 25.331);--skippr-color-red-600:oklch(57.7% .245 27.325);--skippr-color-red-700:oklch(50.5% .213 27.518);--skippr-color-amber-50:oklch(98.7% .022 95.277);--skippr-color-amber-100:oklch(96.2% .059 95.617);--skippr-color-amber-400:oklch(82.8% .189 84.429);--skippr-color-amber-700:oklch(55.5% .163 48.998);--skippr-color-amber-950:oklch(27.9% .077 45.635);--skippr-color-emerald-400:oklch(76.5% .177 163.223);--skippr-color-neutral-100:oklch(97% 0 0);--skippr-color-neutral-200:oklch(92.2% 0 0);--skippr-color-neutral-500:oklch(55.6% 0 0);--skippr-color-neutral-700:oklch(37.1% 0 0);--skippr-color-black:#000;--skippr-color-white:#fff;--skippr-spacing:.25rem;--skippr-text-xs:.75rem;--skippr-text-xs--line-height:calc(1/.75);--skippr-text-sm:.875rem;--skippr-text-sm--line-height:calc(1.25/.875);--skippr-font-weight-medium:500;--skippr-font-weight-semibold:600;--skippr-font-weight-bold:700;--skippr-leading-snug:1.375;--skippr-leading-relaxed:1.625;--skippr-ease-out:cubic-bezier(0,0,.2,1);--skippr-ease-in-out:cubic-bezier(.4,0,.2,1);--skippr-animate-spin:spin 1s linear infinite;--skippr-animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--skippr-animate-bounce:bounce 1s infinite;--skippr-blur-sm:8px;--skippr-default-transition-duration:.15s;--skippr-default-transition-timing-function:cubic-bezier(.4,0,.2,1);--skippr-default-font-family:var(--skippr-font-sans);--skippr-default-mono-font-family:var(--skippr-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--skippr-default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--skippr-default-font-feature-settings,normal);font-variation-settings:var(--skippr-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--skippr-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--skippr-default-mono-font-feature-settings,normal);font-variation-settings:var(--skippr-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.skippr\\:pointer-events-none{pointer-events:none}.skippr\\:absolute{position:absolute}.skippr\\:fixed{position:fixed}.skippr\\:relative{position:relative}.skippr\\:sticky{position:sticky}.skippr\\:-inset-\\[3px\\]{inset:-3px}.skippr\\:inset-0{inset:calc(var(--skippr-spacing)*0)}.skippr\\:inset-y-0{inset-block:calc(var(--skippr-spacing)*0)}.skippr\\:-top-\\[2px\\]{top:-2px}.skippr\\:-top-\\[3px\\]{top:-3px}.skippr\\:-top-\\[13px\\]{top:-13px}.skippr\\:top-0{top:calc(var(--skippr-spacing)*0)}.skippr\\:top-1\\/2{top:50%}.skippr\\:top-full{top:100%}.skippr\\:-right-8{right:calc(var(--skippr-spacing)*-8)}.skippr\\:-right-\\[2px\\]{right:-2px}.skippr\\:-right-\\[6px\\]{right:-6px}.skippr\\:right-0{right:calc(var(--skippr-spacing)*0)}.skippr\\:right-3{right:calc(var(--skippr-spacing)*3)}.skippr\\:right-5{right:calc(var(--skippr-spacing)*5)}.skippr\\:right-6{right:calc(var(--skippr-spacing)*6)}.skippr\\:right-\\[4px\\]{right:4px}.skippr\\:-bottom-\\[2px\\]{bottom:-2px}.skippr\\:bottom-3{bottom:calc(var(--skippr-spacing)*3)}.skippr\\:bottom-20{bottom:calc(var(--skippr-spacing)*20)}.skippr\\:bottom-\\[calc\\(100\\%\\+11px\\)\\]{bottom:calc(100% + 11px)}.skippr\\:bottom-full{bottom:100%}.skippr\\:-left-8{left:calc(var(--skippr-spacing)*-8)}.skippr\\:-left-\\[2px\\]{left:-2px}.skippr\\:-left-\\[6px\\]{left:-6px}.skippr\\:left-0{left:calc(var(--skippr-spacing)*0)}.skippr\\:left-1\\/2{left:50%}.skippr\\:left-2{left:calc(var(--skippr-spacing)*2)}.skippr\\:left-3{left:calc(var(--skippr-spacing)*3)}.skippr\\:left-5{left:calc(var(--skippr-spacing)*5)}.skippr\\:left-6{left:calc(var(--skippr-spacing)*6)}.skippr\\:z-10{z-index:10}.skippr\\:z-20{z-index:20}.skippr\\:z-\\[1\\]{z-index:1}.skippr\\:z-\\[2\\]{z-index:2}.skippr\\:z-\\[4\\]{z-index:4}.skippr\\:z-\\[5\\]{z-index:5}.skippr\\:z-\\[6\\]{z-index:6}.skippr\\:z-\\[7\\]{z-index:7}.skippr\\:z-\\[8\\]{z-index:8}.skippr\\:z-\\[9998\\]{z-index:9998}.skippr\\:z-\\[9999\\]{z-index:9999}.skippr\\:z-\\[10000\\]{z-index:10000}.skippr\\:order-first{order:-9999}.skippr\\:order-last{order:9999}.skippr\\:mx-auto{margin-inline:auto}.skippr\\:-mt-\\[5px\\]{margin-top:-5px}.skippr\\:-mt-\\[27px\\]{margin-top:-27px}.skippr\\:mt-1{margin-top:calc(var(--skippr-spacing)*1)}.skippr\\:mt-1\\.5{margin-top:calc(var(--skippr-spacing)*1.5)}.skippr\\:mt-2{margin-top:calc(var(--skippr-spacing)*2)}.skippr\\:mt-3{margin-top:calc(var(--skippr-spacing)*3)}.skippr\\:mt-3\\.5{margin-top:calc(var(--skippr-spacing)*3.5)}.skippr\\:mt-\\[1px\\]{margin-top:1px}.skippr\\:mt-\\[8px\\]{margin-top:8px}.skippr\\:mt-\\[9px\\]{margin-top:9px}.skippr\\:mr-7{margin-right:calc(var(--skippr-spacing)*7)}.skippr\\:-mb-\\[5px\\]{margin-bottom:-5px}.skippr\\:mb-1\\.5{margin-bottom:calc(var(--skippr-spacing)*1.5)}.skippr\\:mb-2{margin-bottom:calc(var(--skippr-spacing)*2)}.skippr\\:mb-3{margin-bottom:calc(var(--skippr-spacing)*3)}.skippr\\:mb-4{margin-bottom:calc(var(--skippr-spacing)*4)}.skippr\\:mb-\\[14px\\]{margin-bottom:14px}.skippr\\:-ml-\\[2px\\]{margin-left:-2px}.skippr\\:ml-0\\.5{margin-left:calc(var(--skippr-spacing)*.5)}.skippr\\:ml-1{margin-left:calc(var(--skippr-spacing)*1)}.skippr\\:ml-7{margin-left:calc(var(--skippr-spacing)*7)}.skippr\\:ml-auto{margin-left:auto}.skippr\\:line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.skippr\\:block{display:block}.skippr\\:flex{display:flex}.skippr\\:hidden{display:none}.skippr\\:inline-flex{display:inline-flex}.skippr\\:aspect-square{aspect-ratio:1}.skippr\\:size-1{width:calc(var(--skippr-spacing)*1);height:calc(var(--skippr-spacing)*1)}.skippr\\:size-1\\.5{width:calc(var(--skippr-spacing)*1.5);height:calc(var(--skippr-spacing)*1.5)}.skippr\\:size-2{width:calc(var(--skippr-spacing)*2);height:calc(var(--skippr-spacing)*2)}.skippr\\:size-2\\.5{width:calc(var(--skippr-spacing)*2.5);height:calc(var(--skippr-spacing)*2.5)}.skippr\\:size-3{width:calc(var(--skippr-spacing)*3);height:calc(var(--skippr-spacing)*3)}.skippr\\:size-3\\.5{width:calc(var(--skippr-spacing)*3.5);height:calc(var(--skippr-spacing)*3.5)}.skippr\\:size-4{width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}.skippr\\:size-5{width:calc(var(--skippr-spacing)*5);height:calc(var(--skippr-spacing)*5)}.skippr\\:size-6{width:calc(var(--skippr-spacing)*6);height:calc(var(--skippr-spacing)*6)}.skippr\\:size-7{width:calc(var(--skippr-spacing)*7);height:calc(var(--skippr-spacing)*7)}.skippr\\:size-8{width:calc(var(--skippr-spacing)*8);height:calc(var(--skippr-spacing)*8)}.skippr\\:size-9{width:calc(var(--skippr-spacing)*9);height:calc(var(--skippr-spacing)*9)}.skippr\\:size-10{width:calc(var(--skippr-spacing)*10);height:calc(var(--skippr-spacing)*10)}.skippr\\:size-12{width:calc(var(--skippr-spacing)*12);height:calc(var(--skippr-spacing)*12)}.skippr\\:size-\\[3px\\]{width:3px;height:3px}.skippr\\:size-\\[4px\\]{width:4px;height:4px}.skippr\\:size-\\[5px\\]{width:5px;height:5px}.skippr\\:size-\\[6px\\]{width:6px;height:6px}.skippr\\:size-\\[7px\\]{width:7px;height:7px}.skippr\\:size-\\[8px\\]{width:8px;height:8px}.skippr\\:size-\\[9px\\]{width:9px;height:9px}.skippr\\:size-\\[10px\\]{width:10px;height:10px}.skippr\\:size-\\[11px\\]{width:11px;height:11px}.skippr\\:size-\\[12px\\]{width:12px;height:12px}.skippr\\:size-\\[13px\\]{width:13px;height:13px}.skippr\\:size-\\[14px\\]{width:14px;height:14px}.skippr\\:size-\\[15px\\]{width:15px;height:15px}.skippr\\:size-\\[16px\\]{width:16px;height:16px}.skippr\\:size-\\[17px\\]{width:17px;height:17px}.skippr\\:size-\\[18px\\]{width:18px;height:18px}.skippr\\:size-\\[19px\\]{width:19px;height:19px}.skippr\\:size-\\[20px\\]{width:20px;height:20px}.skippr\\:size-\\[22px\\]{width:22px;height:22px}.skippr\\:size-\\[26px\\]{width:26px;height:26px}.skippr\\:size-\\[28px\\]{width:28px;height:28px}.skippr\\:size-\\[30px\\]{width:30px;height:30px}.skippr\\:size-\\[32px\\]{width:32px;height:32px}.skippr\\:size-\\[34px\\]{width:34px;height:34px}.skippr\\:size-\\[38px\\]{width:38px;height:38px}.skippr\\:size-\\[46px\\]{width:46px;height:46px}.skippr\\:size-full{width:100%;height:100%}.skippr\\:h-0{height:calc(var(--skippr-spacing)*0)}.skippr\\:h-1{height:calc(var(--skippr-spacing)*1)}.skippr\\:h-1\\.5{height:calc(var(--skippr-spacing)*1.5)}.skippr\\:h-2{height:calc(var(--skippr-spacing)*2)}.skippr\\:h-3{height:calc(var(--skippr-spacing)*3)}.skippr\\:h-3\\.5{height:calc(var(--skippr-spacing)*3.5)}.skippr\\:h-5{height:calc(var(--skippr-spacing)*5)}.skippr\\:h-6{height:calc(var(--skippr-spacing)*6)}.skippr\\:h-7{height:calc(var(--skippr-spacing)*7)}.skippr\\:h-8{height:calc(var(--skippr-spacing)*8)}.skippr\\:h-9{height:calc(var(--skippr-spacing)*9)}.skippr\\:h-10{height:calc(var(--skippr-spacing)*10)}.skippr\\:h-\\[5px\\]{height:5px}.skippr\\:h-\\[14px\\]{height:14px}.skippr\\:h-\\[16px\\]{height:16px}.skippr\\:h-\\[18\\.5px\\]{height:18.5px}.skippr\\:h-\\[18px\\]{height:18px}.skippr\\:h-\\[22px\\]{height:22px}.skippr\\:h-\\[24px\\]{height:24px}.skippr\\:h-\\[26px\\]{height:26px}.skippr\\:h-\\[36px\\]{height:36px}.skippr\\:h-\\[38px\\]{height:38px}.skippr\\:h-\\[48px\\]{height:48px}.skippr\\:h-\\[54px\\]{height:54px}.skippr\\:h-full{height:100%}.skippr\\:h-px{height:1px}.skippr\\:max-h-\\[132px\\]{max-height:132px}.skippr\\:min-h-0{min-height:calc(var(--skippr-spacing)*0)}.skippr\\:min-h-11{min-height:calc(var(--skippr-spacing)*11)}.skippr\\:min-h-\\[16px\\]{min-height:16px}.skippr\\:w-0{width:calc(var(--skippr-spacing)*0)}.skippr\\:w-3\\.5{width:calc(var(--skippr-spacing)*3.5)}.skippr\\:w-5{width:calc(var(--skippr-spacing)*5)}.skippr\\:w-6{width:calc(var(--skippr-spacing)*6)}.skippr\\:w-7{width:calc(var(--skippr-spacing)*7)}.skippr\\:w-10{width:calc(var(--skippr-spacing)*10)}.skippr\\:w-40{width:calc(var(--skippr-spacing)*40)}.skippr\\:w-\\[2\\.5px\\]{width:2.5px}.skippr\\:w-\\[2px\\]{width:2px}.skippr\\:w-\\[3px\\]{width:3px}.skippr\\:w-\\[14px\\]{width:14px}.skippr\\:w-\\[15\\.4px\\]{width:15.4px}.skippr\\:w-\\[15px\\]{width:15px}.skippr\\:w-\\[16px\\]{width:16px}.skippr\\:w-\\[22px\\]{width:22px}.skippr\\:w-\\[36px\\]{width:36px}.skippr\\:w-\\[38px\\]{width:38px}.skippr\\:w-\\[50px\\]{width:50px}.skippr\\:w-\\[148px\\]{width:148px}.skippr\\:w-\\[225px\\]{width:225px}.skippr\\:w-\\[255px\\]{width:255px}.skippr\\:w-fit{width:fit-content}.skippr\\:w-full{width:100%}.skippr\\:w-px{width:1px}.skippr\\:max-w-64{max-width:calc(var(--skippr-spacing)*64)}.skippr\\:max-w-72{max-width:calc(var(--skippr-spacing)*72)}.skippr\\:max-w-\\[80\\%\\]{max-width:80%}.skippr\\:max-w-\\[280px\\]{max-width:280px}.skippr\\:min-w-0{min-width:calc(var(--skippr-spacing)*0)}.skippr\\:min-w-11{min-width:calc(var(--skippr-spacing)*11)}.skippr\\:min-w-\\[96px\\]{min-width:96px}.skippr\\:flex-1{flex:1}.skippr\\:shrink-0{flex-shrink:0}.skippr\\:origin-bottom{transform-origin:bottom}.skippr\\:origin-bottom-left{transform-origin:0 100%}.skippr\\:origin-bottom-right{transform-origin:100% 100%}.skippr\\:origin-center{transform-origin:50%}.skippr\\:origin-left{transform-origin:0}.skippr\\:origin-right{transform-origin:100%}.skippr\\:origin-top{transform-origin:top}.skippr\\:origin-top-left{transform-origin:0 0}.skippr\\:origin-top-right{transform-origin:100% 0}.skippr\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-x-3{--tw-translate-x:calc(var(--skippr-spacing)*-3);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-x-7{--tw-translate-x:calc(var(--skippr-spacing)*-7);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:translate-x-3{--tw-translate-x:calc(var(--skippr-spacing)*3);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:translate-x-7{--tw-translate-x:calc(var(--skippr-spacing)*7);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-y-1\\/2{--tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:-translate-y-\\[4px\\]{--tw-translate-y:calc(4px*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-\\[0\\.94\\]{scale:.94}.skippr\\:-rotate-90{rotate:-90deg}.skippr\\:rotate-45{rotate:45deg}.skippr\\:rotate-\\[225deg\\]{rotate:225deg}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out\\]{animation:.2s ease-out skippr-agent-in}.skippr\\:\\[animation\\:skippr-agent-in_200ms_ease-out_240ms_both\\]{animation:.2s ease-out .24s both skippr-agent-in}.skippr\\:\\[animation\\:skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:\\[animation\\:skippr-breathe_1\\.1s_ease-in-out_0\\.18s_infinite\\]{animation:1.1s ease-in-out .18s infinite skippr-breathe}.skippr\\:\\[animation\\:skippr-breathe_1\\.1s_ease-in-out_0\\.36s_infinite\\]{animation:1.1s ease-in-out .36s infinite skippr-breathe}.skippr\\:\\[animation\\:skippr-breathe_1\\.1s_ease-in-out_0s_infinite\\]{animation:1.1s ease-in-out infinite skippr-breathe}.skippr\\:\\[animation\\:skippr-evaporate_3\\.2s_ease-in_forwards\\]{animation:3.2s ease-in forwards skippr-evaporate}.skippr\\:\\[animation\\:skippr-fade-in_0\\.2s_ease\\]{animation:.2s skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-in_0\\.16s_ease\\]{animation:.16s skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-in_0\\.22s_ease\\]{animation:.22s skippr-fade-in}.skippr\\:\\[animation\\:skippr-fade-in_0\\.25s_ease\\]{animation:.25s skippr-fade-in}.skippr\\:\\[animation\\:skippr-finger-tap_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-finger-tap}.skippr\\:\\[animation\\:skippr-mote-rise_1\\.6s_ease-out_infinite\\]{animation:1.6s ease-out infinite skippr-mote-rise}.skippr\\:\\[animation\\:skippr-orb-in_320ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)\\]{animation:.32s cubic-bezier(.34,1.3,.64,1) skippr-orb-in}.skippr\\:\\[animation\\:skippr-pop_0\\.2s_ease\\]{animation:.2s skippr-pop}.skippr\\:\\[animation\\:skippr-stage-fade_240ms_ease-out\\]{animation:.24s ease-out skippr-stage-fade}.skippr\\:\\[animation\\:skippr-tip-in_360ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)\\]{animation:.36s cubic-bezier(.34,1.3,.64,1) skippr-tip-in}.skippr\\:\\[animation\\:skippr-tip-in_360ms_cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)_backwards\\]{animation:.36s cubic-bezier(.34,1.3,.64,1) backwards skippr-tip-in}.skippr\\:\\[animation\\:skippr-toolset-pop_280ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.28s cubic-bezier(.22,1,.36,1) skippr-toolset-pop}.skippr\\:\\[animation\\:skippr-toolset-pop_440ms_cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{animation:.44s cubic-bezier(.22,1,.36,1) skippr-toolset-pop}.skippr\\:animate-\\[skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:animate-\\[skippr-bubble-in_0\\.28s_ease-out\\]{animation:.28s ease-out skippr-bubble-in}.skippr\\:animate-\\[skippr-fade-in_0\\.3s_ease-out\\]{animation:.3s ease-out skippr-fade-in}.skippr\\:animate-\\[skippr-pill-content_0\\.22s_ease-out\\]{animation:.22s ease-out skippr-pill-content}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.3s_infinite\\]{animation:1.1s ease-in-out .3s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.6s_infinite\\]{animation:1.1s ease-in-out .6s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.15s_infinite\\]{animation:1.1s ease-in-out .15s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.45s_infinite\\]{animation:1.1s ease-in-out .45s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-speak}.skippr\\:animate-bounce{animation:var(--skippr-animate-bounce)}.skippr\\:animate-ping{animation:var(--skippr-animate-ping)}.skippr\\:animate-skippr-annotation-pulse{animation:1.8s ease-in-out infinite skippr-annotation-pulse}.skippr\\:animate-skippr-click-ping{animation:.5s ease-out forwards skippr-click-ping}.skippr\\:animate-skippr-cursor-pop{animation:.22s ease-out skippr-cursor-pop}.skippr\\:animate-skippr-flow{animation:3.6s linear infinite skippr-flow}.skippr\\:animate-skippr-press{animation:.5s ease-in-out skippr-press}.skippr\\:animate-skippr-ptt-transmit{animation:1.4s ease-out infinite skippr-ptt-transmit}.skippr\\:animate-skippr-rec-ring{animation:2s ease-out infinite skippr-rec-ring}.skippr\\:animate-skippr-tab-fade{animation:.2s ease-out skippr-tab-fade}.skippr\\:animate-skippr-thinking-dot{animation:1.2s ease-in-out infinite skippr-thinking-dot}.skippr\\:animate-skippr-voice-pulse{animation:1.6s ease-out infinite skippr-voice-pulse}.skippr\\:animate-spin{animation:var(--skippr-animate-spin)}.skippr\\:cursor-default{cursor:default}.skippr\\:cursor-grab{cursor:grab}.skippr\\:cursor-not-allowed{cursor:not-allowed}.skippr\\:cursor-pointer{cursor:pointer}.skippr\\:touch-none{touch-action:none}.skippr\\:resize-none{resize:none}.skippr\\:flex-col{flex-direction:column}.skippr\\:flex-col-reverse{flex-direction:column-reverse}.skippr\\:flex-row{flex-direction:row}.skippr\\:flex-row-reverse{flex-direction:row-reverse}.skippr\\:items-baseline{align-items:baseline}.skippr\\:items-center{align-items:center}.skippr\\:items-end{align-items:flex-end}.skippr\\:items-start{align-items:flex-start}.skippr\\:justify-between{justify-content:space-between}.skippr\\:justify-center{justify-content:center}.skippr\\:justify-end{justify-content:flex-end}.skippr\\:justify-start{justify-content:flex-start}.skippr\\:gap-0\\.5{gap:calc(var(--skippr-spacing)*.5)}.skippr\\:gap-1{gap:calc(var(--skippr-spacing)*1)}.skippr\\:gap-1\\.5{gap:calc(var(--skippr-spacing)*1.5)}.skippr\\:gap-2{gap:calc(var(--skippr-spacing)*2)}.skippr\\:gap-2\\.5{gap:calc(var(--skippr-spacing)*2.5)}.skippr\\:gap-3{gap:calc(var(--skippr-spacing)*3)}.skippr\\:gap-\\[1px\\]{gap:1px}.skippr\\:gap-\\[2px\\]{gap:2px}.skippr\\:gap-\\[3px\\]{gap:3px}.skippr\\:gap-\\[4px\\]{gap:4px}.skippr\\:gap-\\[5px\\]{gap:5px}.skippr\\:gap-\\[6px\\]{gap:6px}.skippr\\:gap-\\[7px\\]{gap:7px}.skippr\\:gap-\\[8px\\]{gap:8px}.skippr\\:gap-\\[9px\\]{gap:9px}:where(.skippr\\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-\\[6px\\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(6px*var(--tw-space-y-reverse));margin-block-end:calc(6px*calc(1 - var(--tw-space-y-reverse)))}.skippr\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.skippr\\:overflow-hidden{overflow:hidden}.skippr\\:overflow-visible{overflow:visible}.skippr\\:overflow-y-auto{overflow-y:auto}.skippr\\:overscroll-contain{overscroll-behavior:contain}.skippr\\:rounded{border-radius:.25rem}.skippr\\:rounded-2xl{border-radius:1.125rem}.skippr\\:rounded-\\[1rem\\]{border-radius:1rem}.skippr\\:rounded-\\[5px\\]{border-radius:5px}.skippr\\:rounded-\\[10px\\]{border-radius:10px}.skippr\\:rounded-\\[11px\\]{border-radius:11px}.skippr\\:rounded-\\[12px\\]{border-radius:12px}.skippr\\:rounded-\\[14px\\]{border-radius:14px}.skippr\\:rounded-\\[16px\\]{border-radius:16px}.skippr\\:rounded-\\[20px\\]{border-radius:20px}.skippr\\:rounded-full{border-radius:3.40282e38px}.skippr\\:rounded-md{border-radius:.5rem}.skippr\\:rounded-sm{border-radius:.375rem}.skippr\\:rounded-xl{border-radius:.875rem}.skippr\\:rounded-t-\\[6px\\]{border-top-left-radius:6px;border-top-right-radius:6px}.skippr\\:rounded-t-\\[18px\\]{border-top-left-radius:18px;border-top-right-radius:18px}.skippr\\:rounded-t-full{border-top-left-radius:3.40282e38px;border-top-right-radius:3.40282e38px}.skippr\\:rounded-l-\\[6px\\]{border-top-left-radius:6px;border-bottom-left-radius:6px}.skippr\\:rounded-l-\\[18px\\]{border-top-left-radius:18px;border-bottom-left-radius:18px}.skippr\\:rounded-l-full{border-top-left-radius:3.40282e38px;border-bottom-left-radius:3.40282e38px}.skippr\\:rounded-tl-\\[6px\\]{border-top-left-radius:6px}.skippr\\:rounded-tl-md{border-top-left-radius:.5rem}.skippr\\:rounded-r-\\[6px\\]{border-top-right-radius:6px;border-bottom-right-radius:6px}.skippr\\:rounded-r-\\[18px\\]{border-top-right-radius:18px;border-bottom-right-radius:18px}.skippr\\:rounded-r-full{border-top-right-radius:3.40282e38px;border-bottom-right-radius:3.40282e38px}.skippr\\:rounded-tr-\\[6px\\]{border-top-right-radius:6px}.skippr\\:rounded-b-\\[6px\\]{border-bottom-right-radius:6px;border-bottom-left-radius:6px}.skippr\\:rounded-b-\\[18px\\]{border-bottom-right-radius:18px;border-bottom-left-radius:18px}.skippr\\:rounded-b-full{border-bottom-right-radius:3.40282e38px;border-bottom-left-radius:3.40282e38px}.skippr\\:rounded-bl-\\[6px\\]{border-bottom-left-radius:6px}.skippr\\:border{border-style:var(--tw-border-style);border-width:1px}.skippr\\:border-0{border-style:var(--tw-border-style);border-width:0}.skippr\\:border-2{border-style:var(--tw-border-style);border-width:2px}.skippr\\:border-\\[2\\.5px\\]{border-style:var(--tw-border-style);border-width:2.5px}.skippr\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.skippr\\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.skippr\\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.skippr\\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.skippr\\:border-none{--tw-border-style:none;border-style:none}.skippr\\:border-\\[\\#d8d3ca\\]{border-color:#d8d3ca}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.1\\)\\]{border-color:#2d2d3f1a}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.06\\)\\]{border-color:#2d2d3f0f}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.07\\)\\]{border-color:#2d2d3f12}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.08\\)\\]{border-color:#2d2d3f14}.skippr\\:border-\\[rgba\\(45\\,45\\,63\\,0\\.12\\)\\]{border-color:#2d2d3f1f}.skippr\\:border-\\[var\\(--skippr-brand-ring\\)\\]{border-color:var(--skippr-brand-ring)}.skippr\\:border-black\\/25{border-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-black\\/25{border-color:color-mix(in oklab,var(--skippr-color-black)25%,transparent)}}.skippr\\:border-border{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-brand{border-color:var(--skippr-brand,#2bc0ae)}.skippr\\:border-input{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-primary\\/20{border-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-primary\\/20{border-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)20%,transparent)}}.skippr\\:border-transparent{border-color:#0000}.skippr\\:border-white,.skippr\\:border-white\\/30{border-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:border-white\\/30{border-color:color-mix(in oklab,var(--skippr-color-white)30%,transparent)}}.skippr\\:border-t-brand{border-top-color:var(--skippr-brand,#2bc0ae)}.skippr\\:border-t-white{border-top-color:var(--skippr-color-white)}.skippr\\:border-r-border{border-right-color:oklch(92.3% .003 48.717)}.skippr\\:border-l-border{border-left-color:oklch(92.3% .003 48.717)}.skippr\\:bg-\\[\\#2D2D3F\\]{background-color:#2d2d3f}.skippr\\:bg-\\[\\#F1EFEA\\]{background-color:#f1efea}.skippr\\:bg-\\[\\#b9b4ab\\]{background-color:#b9b4ab}.skippr\\:bg-\\[\\#dc2626\\]{background-color:#dc2626}.skippr\\:bg-\\[\\#eeeae4\\]{background-color:#eeeae4}.skippr\\:bg-\\[\\#f2f0eb\\]{background-color:#f2f0eb}.skippr\\:bg-\\[\\#f4ecd8\\]{background-color:#f4ecd8}.skippr\\:bg-\\[\\#f4f2ee\\]{background-color:#f4f2ee}.skippr\\:bg-amber-50{background-color:var(--skippr-color-amber-50)}.skippr\\:bg-amber-400{background-color:var(--skippr-color-amber-400)}.skippr\\:bg-background{background-color:oklch(100% 0 0)}.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-black\\/\\[0\\.07\\]{background-color:color-mix(in oklab,var(--skippr-color-black)7.0%,transparent)}}.skippr\\:bg-brand,.skippr\\:bg-brand\\/50{background-color:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-brand\\/50{background-color:color-mix(in oklab,var(--skippr-brand,#2bc0ae)50%,transparent)}}.skippr\\:bg-bubble{background-color:#2d2b3d}.skippr\\:bg-bubble\\/95{background-color:oklab(29.9244% .0107414 -.0305411/.95)}.skippr\\:bg-card{background-color:oklch(100% 0 0)}.skippr\\:bg-current{background-color:currentColor}.skippr\\:bg-destructive{background-color:#d94f4f}.skippr\\:bg-emerald-400{background-color:var(--skippr-color-emerald-400)}.skippr\\:bg-foreground{background-color:oklch(14.7% .004 49.25)}.skippr\\:bg-foreground\\/10{background-color:oklab(14.7% .00261104 .00303026/.1)}.skippr\\:bg-launcher{background-color:#2d2d3f}.skippr\\:bg-muted-foreground\\/40{background-color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:bg-muted\\/50{background-color:oklab(97% -.000282743 .000959196/.5)}.skippr\\:bg-neutral-100{background-color:var(--skippr-color-neutral-100)}.skippr\\:bg-primary,.skippr\\:bg-primary\\/10{background-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-primary\\/10{background-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)10%,transparent)}}.skippr\\:bg-red-50{background-color:var(--skippr-color-red-50)}.skippr\\:bg-red-100{background-color:var(--skippr-color-red-100)}.skippr\\:bg-red-500{background-color:var(--skippr-color-red-500)}.skippr\\:bg-secondary{background-color:#ffdfb5}.skippr\\:bg-transparent{background-color:#0000}.skippr\\:bg-white,.skippr\\:bg-white\\/40{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/40{background-color:color-mix(in oklab,var(--skippr-color-white)40%,transparent)}}.skippr\\:bg-white\\/70{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/70{background-color:color-mix(in oklab,var(--skippr-color-white)70%,transparent)}}.skippr\\:bg-white\\/95{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:bg-white\\/95{background-color:color-mix(in oklab,var(--skippr-color-white)95%,transparent)}}.skippr\\:fill-brand{fill:var(--skippr-brand,#2bc0ae)}.skippr\\:fill-current{fill:currentColor}.skippr\\:fill-primary\\/30{fill:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:fill-primary\\/30{fill:color-mix(in oklab,var(--skippr-brand,#2d2b3d)30%,transparent)}}.skippr\\:fill-white{fill:var(--skippr-color-white)}.skippr\\:stroke-black\\/15{stroke:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:stroke-black\\/15{stroke:color-mix(in oklab,var(--skippr-color-black)15%,transparent)}}.skippr\\:stroke-bubble{stroke:#2d2b3d}.skippr\\:object-cover{object-fit:cover}.skippr\\:p-0{padding:calc(var(--skippr-spacing)*0)}.skippr\\:p-1\\.5{padding:calc(var(--skippr-spacing)*1.5)}.skippr\\:p-2{padding:calc(var(--skippr-spacing)*2)}.skippr\\:p-3{padding:calc(var(--skippr-spacing)*3)}.skippr\\:p-3\\.5{padding:calc(var(--skippr-spacing)*3.5)}.skippr\\:p-4{padding:calc(var(--skippr-spacing)*4)}.skippr\\:p-\\[2px\\]{padding:2px}.skippr\\:p-\\[3px\\]{padding:3px}.skippr\\:p-\\[7px\\]{padding:7px}.skippr\\:p-\\[14px\\]{padding:14px}.skippr\\:px-1{padding-inline:calc(var(--skippr-spacing)*1)}.skippr\\:px-1\\.5{padding-inline:calc(var(--skippr-spacing)*1.5)}.skippr\\:px-2{padding-inline:calc(var(--skippr-spacing)*2)}.skippr\\:px-2\\.5{padding-inline:calc(var(--skippr-spacing)*2.5)}.skippr\\:px-3{padding-inline:calc(var(--skippr-spacing)*3)}.skippr\\:px-3\\.5{padding-inline:calc(var(--skippr-spacing)*3.5)}.skippr\\:px-4{padding-inline:calc(var(--skippr-spacing)*4)}.skippr\\:px-6{padding-inline:calc(var(--skippr-spacing)*6)}.skippr\\:px-8{padding-inline:calc(var(--skippr-spacing)*8)}.skippr\\:px-\\[5px\\]{padding-inline:5px}.skippr\\:px-\\[7px\\]{padding-inline:7px}.skippr\\:px-\\[8px\\]{padding-inline:8px}.skippr\\:px-\\[9px\\]{padding-inline:9px}.skippr\\:px-\\[10px\\]{padding-inline:10px}.skippr\\:px-\\[11px\\]{padding-inline:11px}.skippr\\:px-\\[12px\\]{padding-inline:12px}.skippr\\:py-0\\.5{padding-block:calc(var(--skippr-spacing)*.5)}.skippr\\:py-1{padding-block:calc(var(--skippr-spacing)*1)}.skippr\\:py-1\\.5{padding-block:calc(var(--skippr-spacing)*1.5)}.skippr\\:py-2{padding-block:calc(var(--skippr-spacing)*2)}.skippr\\:py-2\\.5{padding-block:calc(var(--skippr-spacing)*2.5)}.skippr\\:py-3{padding-block:calc(var(--skippr-spacing)*3)}.skippr\\:py-4{padding-block:calc(var(--skippr-spacing)*4)}.skippr\\:py-6{padding-block:calc(var(--skippr-spacing)*6)}.skippr\\:py-\\[1px\\]{padding-block:1px}.skippr\\:py-\\[3px\\]{padding-block:3px}.skippr\\:py-\\[4px\\]{padding-block:4px}.skippr\\:py-\\[5px\\]{padding-block:5px}.skippr\\:py-\\[6px\\]{padding-block:6px}.skippr\\:py-\\[7px\\]{padding-block:7px}.skippr\\:pt-1\\.5{padding-top:calc(var(--skippr-spacing)*1.5)}.skippr\\:pt-\\[8px\\]{padding-top:8px}.skippr\\:pt-\\[9px\\]{padding-top:9px}.skippr\\:pr-2\\.5{padding-right:calc(var(--skippr-spacing)*2.5)}.skippr\\:pr-3{padding-right:calc(var(--skippr-spacing)*3)}.skippr\\:pr-\\[5px\\]{padding-right:5px}.skippr\\:pr-\\[6px\\]{padding-right:6px}.skippr\\:pr-\\[9px\\]{padding-right:9px}.skippr\\:pr-\\[10px\\]{padding-right:10px}.skippr\\:pb-2{padding-bottom:calc(var(--skippr-spacing)*2)}.skippr\\:pb-\\[8px\\]{padding-bottom:8px}.skippr\\:pb-\\[10px\\]{padding-bottom:10px}.skippr\\:pl-1\\.5{padding-left:calc(var(--skippr-spacing)*1.5)}.skippr\\:pl-2\\.5{padding-left:calc(var(--skippr-spacing)*2.5)}.skippr\\:pl-3\\.5{padding-left:calc(var(--skippr-spacing)*3.5)}.skippr\\:pl-\\[9px\\]{padding-left:9px}.skippr\\:pl-\\[13px\\]{padding-left:13px}.skippr\\:text-center{text-align:center}.skippr\\:text-left{text-align:left}.skippr\\:font-mono{font-family:var(--skippr-font-mono)}.skippr\\:text-sm{font-size:var(--skippr-text-sm);line-height:var(--tw-leading,var(--skippr-text-sm--line-height))}.skippr\\:text-xs{font-size:var(--skippr-text-xs);line-height:var(--tw-leading,var(--skippr-text-xs--line-height))}.skippr\\:text-\\[8\\.5px\\]{font-size:8.5px}.skippr\\:text-\\[9\\.5px\\]{font-size:9.5px}.skippr\\:text-\\[9px\\]{font-size:9px}.skippr\\:text-\\[10\\.5px\\]{font-size:10.5px}.skippr\\:text-\\[10px\\]{font-size:10px}.skippr\\:text-\\[11\\.5px\\]{font-size:11.5px}.skippr\\:text-\\[11px\\]{font-size:11px}.skippr\\:text-\\[12\\.5px\\]{font-size:12.5px}.skippr\\:text-\\[12px\\]{font-size:12px}.skippr\\:text-\\[13px\\]{font-size:13px}.skippr\\:leading-5{--tw-leading:calc(var(--skippr-spacing)*5);line-height:calc(var(--skippr-spacing)*5)}.skippr\\:leading-\\[1\\.25\\]{--tw-leading:1.25;line-height:1.25}.skippr\\:leading-none{--tw-leading:1;line-height:1}.skippr\\:leading-relaxed{--tw-leading:var(--skippr-leading-relaxed);line-height:var(--skippr-leading-relaxed)}.skippr\\:leading-snug{--tw-leading:var(--skippr-leading-snug);line-height:var(--skippr-leading-snug)}.skippr\\:font-bold{--tw-font-weight:var(--skippr-font-weight-bold);font-weight:var(--skippr-font-weight-bold)}.skippr\\:font-medium{--tw-font-weight:var(--skippr-font-weight-medium);font-weight:var(--skippr-font-weight-medium)}.skippr\\:font-semibold{--tw-font-weight:var(--skippr-font-weight-semibold);font-weight:var(--skippr-font-weight-semibold)}.skippr\\:tracking-\\[-0\\.01em\\]{--tw-tracking:-.01em;letter-spacing:-.01em}.skippr\\:tracking-\\[0\\.02em\\]{--tw-tracking:.02em;letter-spacing:.02em}.skippr\\:tracking-\\[0\\.05em\\]{--tw-tracking:.05em;letter-spacing:.05em}.skippr\\:whitespace-nowrap{white-space:nowrap}.skippr\\:text-\\[\\#2D2D3F\\]{color:#2d2d3f}.skippr\\:text-\\[\\#5a5650\\]{color:#5a5650}.skippr\\:text-\\[\\#5c5850\\]{color:#5c5850}.skippr\\:text-\\[\\#6b6660\\]{color:#6b6660}.skippr\\:text-\\[\\#8b877f\\]{color:#8b877f}.skippr\\:text-\\[\\#a8a49c\\]{color:#a8a49c}.skippr\\:text-\\[\\#b8b4ac\\]{color:#b8b4ac}.skippr\\:text-\\[\\#b45309\\]{color:#b45309}.skippr\\:text-\\[\\#c9c5bd\\]{color:#c9c5bd}.skippr\\:text-\\[\\#cbc7bf\\]{color:#cbc7bf}.skippr\\:text-\\[\\#dc2626\\]{color:#dc2626}.skippr\\:text-\\[var\\(--skippr-brand-deep\\)\\]{color:var(--skippr-brand-deep)}.skippr\\:text-amber-700{color:var(--skippr-color-amber-700)}.skippr\\:text-amber-950{color:var(--skippr-color-amber-950)}.skippr\\:text-background{color:oklch(100% 0 0)}.skippr\\:text-black,.skippr\\:text-black\\/40{color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-black\\/40{color:color-mix(in oklab,var(--skippr-color-black)40%,transparent)}}.skippr\\:text-brand{color:var(--skippr-brand,#2bc0ae)}.skippr\\:text-bubble{color:#2d2b3d}.skippr\\:text-chart-3{color:oklch(66.6% .179 58.318)}.skippr\\:text-destructive{color:#d94f4f}.skippr\\:text-foreground{color:oklch(14.7% .004 49.25)}.skippr\\:text-muted-foreground{color:oklch(55.3% .013 58.071)}.skippr\\:text-muted-foreground\\/30{color:oklab(55.3% .00687528 .0110332/.3)}.skippr\\:text-muted-foreground\\/60{color:oklab(55.3% .00687528 .0110332/.6)}.skippr\\:text-neutral-500{color:var(--skippr-color-neutral-500)}.skippr\\:text-neutral-700{color:var(--skippr-color-neutral-700)}.skippr\\:text-primary{color:var(--skippr-brand,#2d2b3d)}.skippr\\:text-primary-foreground{color:var(--skippr-brand-foreground,#fff)}.skippr\\:text-red-400{color:var(--skippr-color-red-400)}.skippr\\:text-red-600{color:var(--skippr-color-red-600)}.skippr\\:text-red-700{color:var(--skippr-color-red-700)}.skippr\\:text-secondary-foreground{color:#613700}.skippr\\:text-white,.skippr\\:text-white\\/60{color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-white\\/60{color:color-mix(in oklab,var(--skippr-color-white)60%,transparent)}}.skippr\\:capitalize{text-transform:capitalize}.skippr\\:uppercase{text-transform:uppercase}.skippr\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.skippr\\:line-through{text-decoration-line:line-through}.skippr\\:placeholder-muted-foreground::placeholder{color:oklch(55.3% .013 58.071)}.skippr\\:opacity-0{opacity:0}.skippr\\:opacity-40{opacity:.4}.skippr\\:opacity-75{opacity:.75}.skippr\\:opacity-100{opacity:1}.skippr\\:shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[-3px_0_14px_var\\(--skippr-brand-halo\\)\\]{--tw-shadow:-3px 0 14px var(--tw-shadow-color,var(--skippr-brand-halo));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[-4px_6px_18px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:-4px 6px 18px var(--tw-shadow-color,#2d2d3f29);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[-6px_8px_30px_rgba\\(15\\,18\\,26\\,0\\.32\\)\\]{--tw-shadow:-6px 8px 30px var(--tw-shadow-color,#0f121a52);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_-3px_14px_var\\(--skippr-brand-halo\\)\\]{--tw-shadow:0 -3px 14px var(--tw-shadow-color,var(--skippr-brand-halo));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_-6px_18px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:0 -6px 18px var(--tw-shadow-color,#2d2d3f29);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_0_0_1\\.5px_rgba\\(255\\,255\\,255\\,0\\.85\\)\\]{--tw-shadow:0 0 0 1.5px var(--tw-shadow-color,#ffffffd9);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_0_0_4px_var\\(--skippr-brand-ring\\)\\]{--tw-shadow:0 0 0 4px var(--tw-shadow-color,var(--skippr-brand-ring));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_1px_2px_rgba\\(45\\,45\\,63\\,0\\.08\\)\\]{--tw-shadow:0 1px 2px var(--tw-shadow-color,#2d2d3f14);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_2px_6px_rgba\\(0\\,0\\,0\\,0\\.28\\)\\]{--tw-shadow:0 2px 6px var(--tw-shadow-color,#00000047);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_3px_14px_var\\(--skippr-brand-halo\\)\\]{--tw-shadow:0 3px 14px var(--tw-shadow-color,var(--skippr-brand-halo));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_12px_rgba\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow:0 4px 12px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_12px_rgba\\(45\\,45\\,63\\,0\\.1\\)\\]{--tw-shadow:0 4px 12px var(--tw-shadow-color,#2d2d3f1a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_14px_rgba\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_14px_rgba\\(239\\,68\\,68\\,0\\.45\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#ef444473);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_16px_rgba\\(45\\,43\\,61\\,0\\.45\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#2d2b3d73),0 2px 4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_6px_18px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:0 6px 18px var(--tw-shadow-color,#2d2d3f29);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_22px_rgba\\(45\\,45\\,63\\,0\\.12\\)\\,0_1px_3px_rgba\\(45\\,45\\,63\\,0\\.04\\)\\]{--tw-shadow:0 8px 22px var(--tw-shadow-color,#2d2d3f1f),0 1px 3px var(--tw-shadow-color,#2d2d3f0a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(45\\,43\\,61\\,0\\.35\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#2d2b3d59);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_30px_rgba\\(45\\,45\\,63\\,0\\.14\\)\\,0_2px_6px_rgba\\(45\\,45\\,63\\,0\\.06\\)\\]{--tw-shadow:0 8px 30px var(--tw-shadow-color,#2d2d3f24),0 2px 6px var(--tw-shadow-color,#2d2d3f0f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_26px_rgba\\(45\\,45\\,63\\,0\\.13\\)\\,0_2px_6px_rgba\\(45\\,45\\,63\\,0\\.05\\)\\]{--tw-shadow:0 10px 26px var(--tw-shadow-color,#2d2d3f21),0 2px 6px var(--tw-shadow-color,#2d2d3f0d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_28px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:0 10px 28px var(--tw-shadow-color,#2d2d3f29);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_30px_rgba\\(45\\,45\\,63\\,0\\.14\\)\\,0_0_0_1\\.5px_var\\(--skippr-brand-ring\\)\\]{--tw-shadow:0 10px 30px var(--tw-shadow-color,#2d2d3f24),0 0 0 1.5px var(--tw-shadow-color,var(--skippr-brand-ring));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_10px_32px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 10px 32px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_14px_34px_rgba\\(45\\,45\\,63\\,0\\.15\\)\\,0_2px_6px_rgba\\(45\\,45\\,63\\,0\\.06\\)\\]{--tw-shadow:0 14px 34px var(--tw-shadow-color,#2d2d3f26),0 2px 6px var(--tw-shadow-color,#2d2d3f0f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[3px_0_14px_var\\(--skippr-brand-halo\\)\\]{--tw-shadow:3px 0 14px var(--tw-shadow-color,var(--skippr-brand-halo));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[4px_6px_18px_rgba\\(45\\,45\\,63\\,0\\.16\\)\\]{--tw-shadow:4px 6px 18px var(--tw-shadow-color,#2d2d3f29);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[inset_0_0_0_1\\.5px_var\\(--skippr-brand\\,\\#2bc0ae\\)\\]{--tw-shadow:inset 0 0 0 1.5px var(--tw-shadow-color,var(--skippr-brand,#2bc0ae));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-black\\/5{--tw-ring-color:var(--skippr-color-black)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-black\\/5{--tw-ring-color:color-mix(in oklab,var(--skippr-color-black)5%,transparent)}}.skippr\\:ring-brand{--tw-ring-color:var(--skippr-brand,#2bc0ae)}.skippr\\:ring-white\\/15{--tw-ring-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:ring-white\\/15{--tw-ring-color:color-mix(in oklab,var(--skippr-color-white)15%,transparent)}}.skippr\\:ring-offset-background{--tw-ring-offset-color:oklch(100% 0 0)}.skippr\\:drop-shadow-\\[0_2px_5px_rgba\\(0\\,0\\,0\\,0\\.4\\)\\]{--tw-drop-shadow-size:drop-shadow(0 2px 5px var(--tw-drop-shadow-color,#0006));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.skippr\\:backdrop-blur-sm{--tw-backdrop-blur:blur(var(--skippr-blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.skippr\\:transition-\\[filter\\]{transition-property:filter;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[gap\\]{transition-property:gap;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[height\\]{transition-property:height;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[left\\]{transition-property:left;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[opacity\\,transform\\,height\\]{transition-property:opacity,transform,height;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\,height\\,background-color\\,border-color\\]{transition-property:width,height,background-color,border-color;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\,margin\\]{transition-property:width,margin;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:duration-75{--tw-duration:75ms;transition-duration:75ms}.skippr\\:duration-100{--tw-duration:.1s;transition-duration:.1s}.skippr\\:duration-150{--tw-duration:.15s;transition-duration:.15s}.skippr\\:duration-200{--tw-duration:.2s;transition-duration:.2s}.skippr\\:duration-300{--tw-duration:.3s;transition-duration:.3s}.skippr\\:duration-\\[400ms\\]{--tw-duration:.4s;transition-duration:.4s}.skippr\\:ease-\\[cubic-bezier\\(0\\.22\\,1\\,0\\.36\\,1\\)\\]{--tw-ease:cubic-bezier(.22,1,.36,1);transition-timing-function:cubic-bezier(.22,1,.36,1)}.skippr\\:ease-\\[cubic-bezier\\(0\\.34\\,1\\.3\\,0\\.64\\,1\\)\\]{--tw-ease:cubic-bezier(.34,1.3,.64,1);transition-timing-function:cubic-bezier(.34,1.3,.64,1)}.skippr\\:ease-\\[cubic-bezier\\(0\\.34\\,1\\.56\\,0\\.64\\,1\\)\\]{--tw-ease:cubic-bezier(.34,1.56,.64,1);transition-timing-function:cubic-bezier(.34,1.56,.64,1)}.skippr\\:ease-in-out{--tw-ease:var(--skippr-ease-in-out);transition-timing-function:var(--skippr-ease-in-out)}.skippr\\:ease-out{--tw-ease:var(--skippr-ease-out);transition-timing-function:var(--skippr-ease-out)}.skippr\\:outline-none{--tw-outline-style:none;outline-style:none}.skippr\\:select-none{-webkit-user-select:none;user-select:none}.skippr\\:\\[animation-delay\\:0ms\\]{animation-delay:0s}.skippr\\:\\[animation-delay\\:150ms\\]{animation-delay:.15s}.skippr\\:\\[animation-delay\\:200ms\\]{animation-delay:.2s}.skippr\\:\\[animation-delay\\:300ms\\]{animation-delay:.3s}.skippr\\:\\[animation-delay\\:400ms\\]{animation-delay:.4s}.skippr\\:\\[overflow-anchor\\:none\\]{overflow-anchor:none}.skippr\\:group-focus-within\\:scale-100:is(:where(.skippr\\:group):focus-within *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-focus-within\\:opacity-100:is(:where(.skippr\\:group):focus-within *){opacity:1}@media (hover:hover){.skippr\\:group-hover\\:scale-100:is(:where(.skippr\\:group):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-hover\\:text-red-300:is(:where(.skippr\\:group):hover *){color:var(--skippr-color-red-300)}.skippr\\:group-hover\\:text-white\\/80:is(:where(.skippr\\:group):hover *){color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:group-hover\\:text-white\\/80:is(:where(.skippr\\:group):hover *){color:color-mix(in oklab,var(--skippr-color-white)80%,transparent)}}.skippr\\:group-hover\\:opacity-100:is(:where(.skippr\\:group):hover *){opacity:1}}.skippr\\:placeholder\\:text-\\[\\#b0aca4\\]::placeholder{color:#b0aca4}@media (hover:hover){.skippr\\:hover\\:-translate-y-0\\.5:hover{--tw-translate-y:calc(var(--skippr-spacing)*-.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:hover\\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:hover\\:bg-\\[\\#3a384b\\]:hover{background-color:#3a384b}.skippr\\:hover\\:bg-\\[\\#3d3d52\\]:hover{background-color:#3d3d52}.skippr\\:hover\\:bg-\\[\\#f2f0eb\\]:hover{background-color:#f2f0eb}.skippr\\:hover\\:bg-\\[\\#f4f2ee\\]:hover{background-color:#f4f2ee}.skippr\\:hover\\:bg-\\[\\#f6f4f0\\]:hover{background-color:#f6f4f0}.skippr\\:hover\\:bg-accent:hover{background-color:#e7e5e4}.skippr\\:hover\\:bg-amber-100:hover{background-color:var(--skippr-color-amber-100)}.skippr\\:hover\\:bg-bubble:hover{background-color:#2d2b3d}.skippr\\:hover\\:bg-destructive\\/90:hover{background-color:oklab(61.4357% .15892 .0698893/.9)}.skippr\\:hover\\:bg-foreground\\/8:hover{background-color:oklab(14.7% .00261104 .00303026/.08)}.skippr\\:hover\\:bg-muted:hover{background-color:oklch(97% .001 106.424)}.skippr\\:hover\\:bg-neutral-100:hover{background-color:var(--skippr-color-neutral-100)}.skippr\\:hover\\:bg-neutral-200:hover{background-color:var(--skippr-color-neutral-200)}.skippr\\:hover\\:bg-primary\\/90:hover{background-color:var(--skippr-brand,#2d2b3d)}@supports (color:color-mix(in lab, red, red)){.skippr\\:hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab,var(--skippr-brand,#2d2b3d)90%,transparent)}}.skippr\\:hover\\:bg-red-200:hover{background-color:var(--skippr-color-red-200)}.skippr\\:hover\\:bg-red-600:hover{background-color:var(--skippr-color-red-600)}.skippr\\:hover\\:bg-secondary\\/80:hover{background-color:oklab(91.9963% .0175391 .0626889/.8)}.skippr\\:hover\\:bg-transparent:hover{background-color:#0000}.skippr\\:hover\\:bg-white\\/20:hover{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:hover\\:bg-white\\/20:hover{background-color:color-mix(in oklab,var(--skippr-color-white)20%,transparent)}}.skippr\\:hover\\:text-\\[\\#2D2D3F\\]:hover{color:#2d2d3f}.skippr\\:hover\\:text-\\[\\#5a5650\\]:hover{color:#5a5650}.skippr\\:hover\\:text-\\[\\#b8b4ac\\]:hover{color:#b8b4ac}.skippr\\:hover\\:text-accent-foreground:hover{color:oklch(21.6% .006 56.043)}.skippr\\:hover\\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.skippr\\:hover\\:brightness-\\[1\\.04\\]:hover{--tw-brightness:brightness(1.04);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.skippr\\:hover\\:brightness-\\[1\\.06\\]:hover{--tw-brightness:brightness(1.06);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}}.skippr\\:focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:focus-visible\\:ring-bubble\\/60:focus-visible{--tw-ring-color:oklab(29.9244% .0107414 -.0305411/.6)}.skippr\\:focus-visible\\:ring-ring:focus-visible{--tw-ring-color:oklch(70.9% .01 56.259)}.skippr\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.skippr\\:focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.skippr\\:active\\:translate-y-0:active{--tw-translate-y:calc(var(--skippr-spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:active\\:scale-\\[0\\.98\\]:active{scale:.98}.skippr\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.skippr\\:disabled\\:cursor-default:disabled{cursor:default}.skippr\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.skippr\\:disabled\\:opacity-50:disabled{opacity:.5}.skippr\\:disabled\\:opacity-60:disabled{opacity:.6}.skippr\\:disabled\\:opacity-80:disabled{opacity:.8}@media (hover:hover){.skippr\\:disabled\\:hover\\:bg-\\[\\#2D2D3F\\]:disabled:hover{background-color:#2d2d3f}.skippr\\:disabled\\:hover\\:bg-white:disabled:hover{background-color:var(--skippr-color-white)}}@media (prefers-reduced-motion:reduce){.skippr\\:motion-reduce\\:hidden{display:none}.skippr\\:motion-reduce\\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:motion-reduce\\:animate-none{animation:none}}.skippr\\:\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.skippr\\:\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.skippr\\:\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}}:host{--skippr-brand-active:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-active:color-mix(in srgb,var(--skippr-brand,#2bc0ae)93%,#000)}}:host{--skippr-brand-deep:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-deep:color-mix(in srgb,var(--skippr-brand,#2bc0ae)78%,#000)}}:host{--skippr-brand-ring:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-ring:color-mix(in srgb,var(--skippr-brand,#2bc0ae)22%,transparent)}}:host{--skippr-brand-halo:var(--skippr-brand,#2bc0ae)}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-halo:color-mix(in srgb,var(--skippr-brand,#2bc0ae)40%,transparent)}}:host{--skippr-brand-glow:linear-gradient(90deg,var(--skippr-brand,#2bc0ae),var(--skippr-brand,#2bc0ae),var(--skippr-brand,#2bc0ae),var(--skippr-brand,#2bc0ae),var(--skippr-brand,#2bc0ae))}@supports (color:color-mix(in lab, red, red)){:host{--skippr-brand-glow:linear-gradient(90deg,var(--skippr-brand,#2bc0ae),color-mix(in srgb,var(--skippr-brand,#2bc0ae)55%,#fff),color-mix(in srgb,var(--skippr-brand,#2bc0ae)72%,#fff),var(--skippr-brand,#2bc0ae),color-mix(in srgb,var(--skippr-brand,#2bc0ae)42%,#fff))}}@keyframes skippr-tap{0%{transform:scale(1)}45%{transform:scale(.7)}to{transform:scale(1)}}@keyframes skippr-press{0%{transform:scale(1)}55%{transform:scale(1)}85%{transform:scale(.68)}to{transform:scale(1)}}@keyframes skippr-cursor-pop{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}@keyframes skippr-click-ping{0%{opacity:.9;transform:translate(-50%,-50%)scale(.4)}to{opacity:0;transform:translate(-50%,-50%)scale(2.4)}}@keyframes skippr-tab-fade{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-speak{0%,to{opacity:.6;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-thinking-dot{0%,80%,to{opacity:.2;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}@keyframes skippr-pulse-ring{0%,to{box-shadow:0 0 #2d2b3d66}50%{box-shadow:0 0 0 10px #2d2b3d00}}@keyframes skippr-rec-ring{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)55%,transparent)}70%{box-shadow:0 0 0 11px #0000}to{box-shadow:0 0 #0000}}@keyframes skippr-voice-pulse{0%{box-shadow:0 0 0 0 var(--skippr-pulse-color,#2bc0ae80)}70%{box-shadow:0 0 0 8px #0000}to{box-shadow:0 0 #0000}}@keyframes skippr-ptt-transmit{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)60%,transparent),0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)35%,transparent)}70%{box-shadow:0 0 0 9px #0000,0 0 0 16px #0000}to{box-shadow:0 0 #0000,0 0 #0000}}@keyframes skippr-annotation-pulse{0%,to{box-shadow:0 0 0 0 color-mix(in srgb,var(--skippr-brand,#2bc0ae)50%,transparent)}50%{box-shadow:0 0 0 6px #0000}}@keyframes skippr-speak-ripple{0%{opacity:.6;transform:scale(1)}to{opacity:0;transform:scale(1.8)}}@keyframes skippr-bar{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}@keyframes skippr-breathe{0%,to{opacity:.85;transform:scale(1)}50%{opacity:1;transform:scale(1.08)}}@keyframes skippr-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-evaporate{0%{opacity:1;filter:blur();transform:translateY(0)scale(1)}55%{opacity:.85;filter:blur()}to{opacity:0;filter:blur(2.5px);transform:translateY(-7px)scale(.965)}}@keyframes skippr-mote-rise{0%{opacity:0;transform:translateY(2px)scale(.5)}25%{opacity:.85}to{opacity:0;transform:translateY(-24px)scale(1)}}@keyframes skippr-flow{0%{background-position:0%}50%{background-position:100%}to{background-position:0%}}@keyframes skippr-wave{0%,to{opacity:.4;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-bubble-in{0%{opacity:0;transform:translateY(12px)scale(.96)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-tip-in{0%{opacity:0;transform:translateY(14px)scale(.96)}60%{opacity:1;transform:translateY(-2px)scale(1.01)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-pill-content{0%{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}@keyframes skippr-banner-look{0%,to{transform:translate(0)}25%{transform:translate(-2px)}75%{transform:translate(2px)}}@keyframes skippr-finger-tap{0%,to{transform:translateY(0)rotate(0)}50%{transform:translateY(2px)rotate(-6deg)}}@keyframes skippr-toolset-pop{0%{opacity:0;transform:scale(.85)}to{opacity:1;transform:scale(1)}}@keyframes skippr-stage-fade{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}@keyframes skippr-agent-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}@keyframes skippr-orb-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}@keyframes skippr-pop{0%{opacity:0;transform:translateY(6px)scale(.98)}to{opacity:1;transform:none}}.skippr-no-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.skippr-no-scrollbar::-webkit-scrollbar{display:none}:host{color:var(--color-foreground)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}`;
5058
5223
  const hostStyle = accentColor && isHexColor(accentColor) ? {
5059
5224
  "--skippr-brand": accentColor,
5060
5225
  "--skippr-brand-foreground": brandForeground(accentColor)
@@ -5084,7 +5249,7 @@ function ShadowHost({
5084
5249
  }
5085
5250
 
5086
5251
  // src/components/Sidebar.tsx
5087
- import { useContext as useContext13, useEffect as useEffect29 } from "react";
5252
+ import { useContext as useContext15, useEffect as useEffect29 } from "react";
5088
5253
 
5089
5254
  // src/hooks/useCombinedMessages.ts
5090
5255
  import { useContext as useContext9, useMemo as useMemo6 } from "react";
@@ -5119,14 +5284,14 @@ function useChatMessages() {
5119
5284
 
5120
5285
  // src/hooks/useStreamingTranscript.ts
5121
5286
  import { useLocalParticipant as useLocalParticipant10 } from "@livekit/components-react/hooks";
5122
- import { useMemo as useMemo5, useRef as useRef17 } from "react";
5287
+ import { useMemo as useMemo5, useRef as useRef18 } from "react";
5123
5288
  function useStreamingTranscript() {
5124
5289
  const transcriptions = useSharedTranscriptions();
5125
5290
  const { localParticipant } = useLocalParticipant10();
5126
5291
  const { isCapturingSpeech } = useVoiceTurnContext();
5127
5292
  const localIdentity = localParticipant.identity;
5128
- const priorUserStreamIdsRef = useRef17(new Set);
5129
- const wasCapturingSpeechRef = useRef17(false);
5293
+ const priorUserStreamIdsRef = useRef18(new Set);
5294
+ const wasCapturingSpeechRef = useRef18(false);
5130
5295
  if (isCapturingSpeech && !wasCapturingSpeechRef.current) {
5131
5296
  priorUserStreamIdsRef.current = new Set(transcriptions.filter((stream) => stream.participantInfo.identity === localIdentity).map((stream) => stream.streamInfo.id));
5132
5297
  }
@@ -5187,7 +5352,7 @@ function useCombinedMessages() {
5187
5352
  }
5188
5353
 
5189
5354
  // src/hooks/usePhaseUpdates.ts
5190
- import { useCallback as useCallback14, useContext as useContext10, useEffect as useEffect23 } from "react";
5355
+ import { useCallback as useCallback15, useContext as useContext10, useEffect as useEffect24 } from "react";
5191
5356
  function parsePhases(json) {
5192
5357
  try {
5193
5358
  const data = JSON.parse(json);
@@ -5198,10 +5363,10 @@ function parsePhases(json) {
5198
5363
  return null;
5199
5364
  }
5200
5365
  function usePhaseUpdates() {
5201
- const parse = useCallback14(parsePhases, []);
5366
+ const parse = useCallback15(parsePhases, []);
5202
5367
  const livePhases = useAgentState("phases", parse, []);
5203
5368
  const ctx = useContext10(LiveAgentContext);
5204
- useEffect23(() => {
5369
+ useEffect24(() => {
5205
5370
  if (livePhases.length > 0)
5206
5371
  ctx?.setPhasesSnapshot(livePhases);
5207
5372
  }, [livePhases, ctx?.setPhasesSnapshot]);
@@ -5210,7 +5375,7 @@ function usePhaseUpdates() {
5210
5375
  }
5211
5376
 
5212
5377
  // src/hooks/useSessionRemaining.ts
5213
- import { useEffect as useEffect24, useRef as useRef18, useState as useState17 } from "react";
5378
+ import { useEffect as useEffect25, useRef as useRef19, useState as useState17 } from "react";
5214
5379
 
5215
5380
  // src/lib/format.ts
5216
5381
  function formatTime(seconds) {
@@ -5226,9 +5391,9 @@ function parseNumber(s) {
5226
5391
  // src/hooks/useSessionRemaining.ts
5227
5392
  function useSessionRemaining() {
5228
5393
  const maxCallDuration = useAgentState("maxCallDuration", parseNumber, null);
5229
- const endTimeRef = useRef18(null);
5394
+ const endTimeRef = useRef19(null);
5230
5395
  const [remaining, setRemaining] = useState17(null);
5231
- useEffect24(() => {
5396
+ useEffect25(() => {
5232
5397
  if (maxCallDuration === null || endTimeRef.current !== null)
5233
5398
  return;
5234
5399
  const endTime = Date.now() + maxCallDuration * 1000;
@@ -5247,36 +5412,9 @@ function useSessionRemaining() {
5247
5412
  // src/components/ChatHeader.tsx
5248
5413
  import { useContext as useContext12, useRef as useRef21 } from "react";
5249
5414
 
5250
- // src/hooks/useElapsedSeconds.ts
5251
- import { useEffect as useEffect25, useRef as useRef19, useState as useState18 } from "react";
5252
- function useElapsedSeconds(isRunning, resetSignal) {
5253
- const [elapsed, setElapsed] = useState18(0);
5254
- const accumulatedSecondsRef = useRef19(0);
5255
- useEffect25(() => {
5256
- accumulatedSecondsRef.current = 0;
5257
- setElapsed(0);
5258
- }, [resetSignal]);
5259
- useEffect25(() => {
5260
- if (!isRunning)
5261
- return;
5262
- const resumedAt = Date.now();
5263
- const accumulatedSeconds = accumulatedSecondsRef.current;
5264
- const totalSeconds = () => accumulatedSeconds + Math.floor((Date.now() - resumedAt) / 1000);
5265
- const tick = () => setElapsed(totalSeconds());
5266
- tick();
5267
- const id = setInterval(tick, 1000);
5268
- return () => {
5269
- clearInterval(id);
5270
- accumulatedSecondsRef.current = totalSeconds();
5271
- setElapsed(accumulatedSecondsRef.current);
5272
- };
5273
- }, [isRunning]);
5274
- return elapsed;
5275
- }
5276
-
5277
5415
  // src/hooks/useTextMode.ts
5278
5416
  import { useLocalParticipant as useLocalParticipant11 } from "@livekit/components-react/hooks";
5279
- import { useCallback as useCallback15, useContext as useContext11, useRef as useRef20 } from "react";
5417
+ import { useCallback as useCallback16, useContext as useContext11, useRef as useRef20 } from "react";
5280
5418
  var textEncoder6 = new TextEncoder;
5281
5419
  function useTextMode() {
5282
5420
  const ctx = useContext11(LiveAgentContext);
@@ -5286,7 +5424,7 @@ function useTextMode() {
5286
5424
  const { textMode, setTextModeState, sidebarTab, setSidebarTab } = ctx;
5287
5425
  const { localParticipant } = useLocalParticipant11();
5288
5426
  const confirmedTextModeRef = useRef20(false);
5289
- const toggleTextMode = useCallback15(async () => {
5427
+ const toggleTextMode = useCallback16(async () => {
5290
5428
  const next = !textMode;
5291
5429
  setTextModeState(next);
5292
5430
  if (next && sidebarTab === "agenda") {
@@ -5309,6 +5447,8 @@ function useTextMode() {
5309
5447
 
5310
5448
  // src/components/ChatHeader.tsx
5311
5449
  import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
5450
+ 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";
5451
+ var TABS_PILL_ACTIVE = "skippr:bg-white skippr:text-[#2D2D3F] skippr:shadow-[0_1px_2px_rgba(45,45,63,0.08)]";
5312
5452
  function ChatHeader() {
5313
5453
  const ctx = useContext12(LiveAgentContext);
5314
5454
  if (!ctx) {
@@ -5323,47 +5463,67 @@ function ChatHeader() {
5323
5463
  commitLauncherDrop,
5324
5464
  panelRef,
5325
5465
  controlBarRef,
5326
- setIsDragging
5466
+ setIsDragging,
5467
+ sidebarTab,
5468
+ setSidebarTab,
5469
+ agentMode,
5470
+ displayModules,
5471
+ defaultAgentId
5327
5472
  } = ctx;
5328
5473
  const { isHeld } = useSessionHoldContext();
5329
- const elapsed = useElapsedSeconds(isConnected && !isHeld, isConnected);
5474
+ const { textMode, toggleTextMode } = useTextMode();
5475
+ const defaultModule = displayModules.find((m) => m.id === defaultAgentId) ?? null;
5476
+ const displayedMode = agentMode ?? defaultModule?.mode ?? null;
5477
+ const showAgenda = displayedMode !== AGENT_MODE.AlwaysOn;
5478
+ const showToggle = isConnected && (sidebarTab === "chat" || !showAgenda);
5330
5479
  const headerRef = useRef21(null);
5331
5480
  const followsPanel = variant === "floating" && isPanelOpen;
5332
5481
  const dragFollowers = followsPanel ? [panelRef, controlBarRef] : null;
5333
5482
  const { wasDraggedRef } = useLauncherDrag(headerRef, commitLauncherDrop, dragFollowers, setIsDragging);
5334
5483
  return /* @__PURE__ */ jsxs11("header", {
5335
5484
  ref: headerRef,
5336
- className: cn("skippr:sticky skippr:top-0 skippr:z-10 skippr:flex skippr:shrink-0 skippr:items-center skippr:justify-between skippr:border-b skippr:border-border skippr:bg-primary skippr:px-4 skippr:py-3", followsPanel && "skippr:cursor-grab skippr:touch-none skippr:select-none"),
5485
+ 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.07)] skippr:bg-white skippr:pl-[13px] skippr:pr-[9px] skippr:pt-[9px] skippr:pb-[8px]", followsPanel && "skippr:cursor-grab skippr:touch-none skippr:select-none"),
5337
5486
  children: [
5338
- /* @__PURE__ */ jsxs11("div", {
5339
- className: "skippr:flex skippr:items-center skippr:gap-3",
5487
+ showAgenda ? /* @__PURE__ */ jsxs11("div", {
5488
+ className: "skippr:flex skippr:gap-[2px] skippr:rounded-full skippr:bg-[#f4f2ee] skippr:p-[2px]",
5340
5489
  children: [
5341
- isConnected && /* @__PURE__ */ jsx14(HeaderModeToggle, {}),
5342
- isConnected && !isHeld && /* @__PURE__ */ jsxs11("div", {
5343
- className: "skippr:flex skippr:items-center skippr:gap-1.5 skippr:rounded-full skippr:bg-primary-foreground/20 skippr:px-2.5 skippr:py-1",
5344
- children: [
5345
- /* @__PURE__ */ jsxs11("span", {
5346
- className: "skippr:relative skippr:flex skippr:size-1.5",
5347
- children: [
5348
- /* @__PURE__ */ jsx14("span", {
5349
- className: "skippr:absolute skippr:inline-flex skippr:h-full skippr:w-full skippr:animate-ping skippr:rounded-full skippr:bg-red-400 skippr:opacity-75"
5350
- }),
5351
- /* @__PURE__ */ jsx14("span", {
5352
- className: "skippr:relative skippr:inline-flex skippr:size-1.5 skippr:rounded-full skippr:bg-red-400"
5353
- })
5354
- ]
5355
- }),
5356
- /* @__PURE__ */ jsx14("span", {
5357
- className: "skippr:text-[10px] skippr:font-medium skippr:text-primary-foreground",
5358
- children: "REC"
5359
- }),
5360
- /* @__PURE__ */ jsx14("span", {
5361
- className: "skippr:text-[10px] skippr:font-mono skippr:text-primary-foreground",
5362
- children: formatTime(elapsed)
5363
- })
5364
- ]
5490
+ /* @__PURE__ */ jsx14("button", {
5491
+ type: "button",
5492
+ onClick: () => setSidebarTab("chat"),
5493
+ className: cn(TABS_PILL_BASE, sidebarTab === "chat" && TABS_PILL_ACTIVE),
5494
+ children: "chat"
5495
+ }),
5496
+ /* @__PURE__ */ jsx14("button", {
5497
+ type: "button",
5498
+ onClick: () => setSidebarTab("agenda"),
5499
+ className: cn(TABS_PILL_BASE, sidebarTab === "agenda" && TABS_PILL_ACTIVE),
5500
+ children: "agenda"
5365
5501
  })
5366
5502
  ]
5503
+ }) : /* @__PURE__ */ jsx14("span", {
5504
+ className: "skippr:text-[12.5px] skippr:font-semibold skippr:tracking-[-0.01em] skippr:text-[#2D2D3F]",
5505
+ children: "Chat"
5506
+ }),
5507
+ /* @__PURE__ */ jsx14("div", {
5508
+ className: "skippr:flex-1"
5509
+ }),
5510
+ showToggle && /* @__PURE__ */ jsxs11("button", {
5511
+ type: "button",
5512
+ disabled: isHeld,
5513
+ onClick: () => void toggleTextMode(),
5514
+ title: textMode ? "Switch to voice" : "Switch to text",
5515
+ "aria-label": textMode ? "Switch to voice" : "Switch to text",
5516
+ className: "skippr:flex skippr:h-[26px] skippr:shrink-0 skippr:cursor-pointer skippr:items-center skippr:gap-[5px] skippr:rounded-full skippr:border skippr:border-[rgba(45,45,63,0.12)] skippr:bg-white skippr:pl-[9px] skippr:pr-[10px] skippr:text-[11px] skippr:font-semibold skippr:text-[#5c5850] skippr:transition-colors skippr:hover:bg-[#f6f4f0] skippr:hover:text-[#2D2D3F] skippr:disabled:cursor-not-allowed skippr:disabled:opacity-50",
5517
+ children: [
5518
+ textMode ? /* @__PURE__ */ jsx14(Mic, {
5519
+ className: "skippr:size-[13px]",
5520
+ strokeWidth: 2
5521
+ }) : /* @__PURE__ */ jsx14(Keyboard, {
5522
+ className: "skippr:size-[13px]",
5523
+ strokeWidth: 2
5524
+ }),
5525
+ textMode ? "voice" : "text"
5526
+ ]
5367
5527
  }),
5368
5528
  minimizable && /* @__PURE__ */ jsx14("button", {
5369
5529
  type: "button",
@@ -5373,47 +5533,15 @@ function ChatHeader() {
5373
5533
  },
5374
5534
  "aria-label": "Close",
5375
5535
  title: "Close",
5376
- className: "skippr:flex skippr:h-8 skippr:w-8 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-lg skippr:text-primary-foreground/70 skippr:transition-colors skippr:hover:bg-primary-foreground/10 skippr:hover:text-primary-foreground skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-primary-foreground",
5536
+ className: "skippr:flex skippr:size-[26px] skippr:shrink-0 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-transparent skippr:text-[#a8a49c] skippr:transition-colors skippr:hover:bg-[#f4f2ee] skippr:hover:text-[#2D2D3F]",
5377
5537
  children: /* @__PURE__ */ jsx14(X, {
5378
- className: "skippr:h-4 skippr:w-4"
5538
+ className: "skippr:size-[14px]",
5539
+ strokeWidth: 2
5379
5540
  })
5380
5541
  })
5381
5542
  ]
5382
5543
  });
5383
5544
  }
5384
- function HeaderModeToggle() {
5385
- const { textMode, toggleTextMode } = useTextMode();
5386
- const { isHeld } = useSessionHoldContext();
5387
- return /* @__PURE__ */ jsxs11("fieldset", {
5388
- "aria-label": "Response mode",
5389
- disabled: isHeld,
5390
- className: "skippr:flex skippr:items-center skippr:gap-0.5 skippr:rounded-lg skippr:bg-primary-foreground/15 skippr:p-0.5 skippr:text-xs skippr:font-medium skippr:ring-1 skippr:ring-primary-foreground/30 skippr:disabled:opacity-50",
5391
- children: [
5392
- /* @__PURE__ */ jsx14("button", {
5393
- type: "button",
5394
- "aria-pressed": !textMode,
5395
- disabled: isHeld,
5396
- onClick: () => {
5397
- if (textMode)
5398
- toggleTextMode();
5399
- },
5400
- className: cn("skippr:rounded-md skippr:px-2.5 skippr:py-1 skippr:transition-colors skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-primary-foreground skippr:disabled:cursor-not-allowed", isHeld ? "skippr:cursor-not-allowed" : "skippr:cursor-pointer", textMode ? "skippr:font-semibold skippr:text-primary-foreground" : "skippr:bg-white skippr:text-foreground skippr:shadow-sm"),
5401
- children: "Voice"
5402
- }),
5403
- /* @__PURE__ */ jsx14("button", {
5404
- type: "button",
5405
- "aria-pressed": textMode,
5406
- disabled: isHeld,
5407
- onClick: () => {
5408
- if (!textMode)
5409
- toggleTextMode();
5410
- },
5411
- className: cn("skippr:rounded-md skippr:px-2.5 skippr:py-1 skippr:transition-colors skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-primary-foreground skippr:disabled:cursor-not-allowed", isHeld ? "skippr:cursor-not-allowed" : "skippr:cursor-pointer", textMode ? "skippr:bg-white skippr:text-foreground skippr:shadow-sm" : "skippr:font-semibold skippr:text-primary-foreground"),
5412
- children: "Text"
5413
- })
5414
- ]
5415
- });
5416
- }
5417
5545
 
5418
5546
  // src/components/LoadingDots.tsx
5419
5547
  import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
@@ -5444,7 +5572,7 @@ function LoadingDots({ label }) {
5444
5572
  }
5445
5573
 
5446
5574
  // src/components/LoginFlow.tsx
5447
- import { useCallback as useCallback16, useEffect as useEffect26, useRef as useRef22, useState as useState19 } from "react";
5575
+ import { useCallback as useCallback17, useEffect as useEffect26, useRef as useRef22, useState as useState18 } from "react";
5448
5576
 
5449
5577
  // src/components/ui/button.tsx
5450
5578
  import { forwardRef as forwardRef3 } from "react";
@@ -5480,20 +5608,20 @@ import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
5480
5608
  var OTP_LENGTH = 6;
5481
5609
  var DIGIT_KEYS = ["d0", "d1", "d2", "d3", "d4", "d5"];
5482
5610
  function LoginFlow({ requestOtp, verifyOtp, error, isSubmitting }) {
5483
- const [step, setStep] = useState19("email");
5484
- const [email, setEmail] = useState19("");
5485
- const handleRequestOtp = useCallback16(async (emailValue) => {
5611
+ const [step, setStep] = useState18("email");
5612
+ const [email, setEmail] = useState18("");
5613
+ const handleRequestOtp = useCallback17(async (emailValue) => {
5486
5614
  const success = await requestOtp(emailValue);
5487
5615
  if (success)
5488
5616
  setStep("otp");
5489
5617
  }, [requestOtp]);
5490
- const handleVerifyOtp = useCallback16(async (code) => {
5618
+ const handleVerifyOtp = useCallback17(async (code) => {
5491
5619
  await verifyOtp(email, code);
5492
5620
  }, [verifyOtp, email]);
5493
- const handleBack = useCallback16(() => {
5621
+ const handleBack = useCallback17(() => {
5494
5622
  setStep("email");
5495
5623
  }, []);
5496
- const handleResend = useCallback16(async () => {
5624
+ const handleResend = useCallback17(async () => {
5497
5625
  await requestOtp(email);
5498
5626
  }, [requestOtp, email]);
5499
5627
  if (step === "otp") {
@@ -5570,8 +5698,8 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
5570
5698
  });
5571
5699
  }
5572
5700
  function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
5573
- const [digits, setDigits] = useState19(Array(OTP_LENGTH).fill(""));
5574
- const [resendCooldown, setResendCooldown] = useState19(0);
5701
+ const [digits, setDigits] = useState18(Array(OTP_LENGTH).fill(""));
5702
+ const [resendCooldown, setResendCooldown] = useState18(0);
5575
5703
  const inputRefs = useRef22([]);
5576
5704
  const submittedRef = useRef22(false);
5577
5705
  useEffect26(() => {
@@ -5587,13 +5715,13 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
5587
5715
  const timer = setTimeout(() => setResendCooldown((c) => c - 1), 1000);
5588
5716
  return () => clearTimeout(timer);
5589
5717
  }, [resendCooldown]);
5590
- const submitCode = useCallback16((code) => {
5718
+ const submitCode = useCallback17((code) => {
5591
5719
  if (submittedRef.current || isSubmitting)
5592
5720
  return;
5593
5721
  submittedRef.current = true;
5594
5722
  onSubmit(code);
5595
5723
  }, [onSubmit, isSubmitting]);
5596
- const handleDigitChange = useCallback16((index2, value) => {
5724
+ const handleDigitChange = useCallback17((index2, value) => {
5597
5725
  const digit = value.replace(/\D/g, "").slice(-1);
5598
5726
  const newDigits = [...digits];
5599
5727
  newDigits[index2] = digit;
@@ -5607,12 +5735,12 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
5607
5735
  submitCode(code);
5608
5736
  }
5609
5737
  }, [digits, submitCode]);
5610
- const handleKeyDown = useCallback16((index2, e) => {
5738
+ const handleKeyDown = useCallback17((index2, e) => {
5611
5739
  if (e.key === "Backspace" && !digits[index2] && index2 > 0) {
5612
5740
  inputRefs.current[index2 - 1]?.focus();
5613
5741
  }
5614
5742
  }, [digits]);
5615
- const handlePaste = useCallback16((e) => {
5743
+ const handlePaste = useCallback17((e) => {
5616
5744
  e.preventDefault();
5617
5745
  const pasted = e.clipboardData.getData("text").replace(/\D/g, "").slice(0, OTP_LENGTH);
5618
5746
  if (pasted.length > 0) {
@@ -5722,14 +5850,15 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
5722
5850
  }
5723
5851
 
5724
5852
  // src/components/MessageList.tsx
5725
- import { useCallback as useCallback17, useLayoutEffect as useLayoutEffect3, useRef as useRef24, useState as useState21 } from "react";
5853
+ import { useCallback as useCallback18, useLayoutEffect as useLayoutEffect3, useRef as useRef24, useState as useState20 } from "react";
5726
5854
 
5727
5855
  // src/components/ChatInput.tsx
5728
- import { useEffect as useEffect27, useRef as useRef23, useState as useState20 } from "react";
5856
+ import { useContext as useContext13, useEffect as useEffect27, useRef as useRef23, useState as useState19 } from "react";
5729
5857
  import { jsx as jsx18, jsxs as jsxs14 } from "react/jsx-runtime";
5730
5858
  var MAX_INPUT_HEIGHT = 60;
5731
5859
  function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
5732
- const [inputText, setInputText] = useState20("");
5860
+ const [inputText, setInputText] = useState19("");
5861
+ const reportChatActivity = useContext13(LiveAgentContext)?.reportChatActivity;
5733
5862
  const textareaRef = useRef23(null);
5734
5863
  const canSend = inputText.trim().length > 0 && !isSendingChat;
5735
5864
  useEffect27(() => {
@@ -5746,12 +5875,14 @@ function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
5746
5875
  function handleChange(e) {
5747
5876
  setInputText(e.target.value);
5748
5877
  resizeTextarea();
5878
+ reportChatActivity?.();
5749
5879
  }
5750
5880
  function handleSubmit(e) {
5751
5881
  e.preventDefault();
5752
5882
  const text = inputText.trim();
5753
5883
  if (!text || isSendingChat)
5754
5884
  return;
5885
+ reportChatActivity?.();
5755
5886
  setInputText("");
5756
5887
  resizeTextarea();
5757
5888
  sendChatMessage(text).catch(() => setInputText(text));
@@ -5763,33 +5894,32 @@ function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
5763
5894
  handleSubmit(e);
5764
5895
  }
5765
5896
  }
5766
- return /* @__PURE__ */ jsx18("form", {
5897
+ return /* @__PURE__ */ jsxs14("form", {
5767
5898
  onSubmit: handleSubmit,
5768
- className: "skippr:border-t skippr:border-border skippr:p-3",
5769
- children: /* @__PURE__ */ jsxs14("div", {
5770
- className: "skippr:flex skippr:items-center skippr:gap-2 skippr:rounded-xl skippr:bg-background skippr:ring-1 skippr:ring-foreground/10 skippr:px-3 skippr:py-2",
5771
- children: [
5772
- /* @__PURE__ */ jsx18("textarea", {
5773
- ref: textareaRef,
5774
- rows: 1,
5775
- value: inputText,
5776
- onChange: handleChange,
5777
- onKeyDown: handleKeyDown,
5778
- placeholder: "Type a message...",
5779
- className: "skippr:flex-1 skippr:resize-none skippr:overflow-y-auto skippr:bg-transparent skippr:text-sm skippr:leading-5 skippr:text-foreground skippr:placeholder:text-muted-foreground skippr:outline-none",
5780
- style: { maxHeight: `${MAX_INPUT_HEIGHT}px` }
5781
- }),
5782
- /* @__PURE__ */ jsx18("button", {
5783
- type: "submit",
5784
- disabled: !canSend,
5785
- "aria-label": "Send message",
5786
- className: cn("skippr:flex skippr:size-8 skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-lg skippr:transition-colors", canSend ? "skippr:bg-primary skippr:text-primary-foreground skippr:hover:bg-primary/90" : "skippr:bg-muted-foreground/20 skippr:text-muted-foreground/60"),
5787
- children: /* @__PURE__ */ jsx18(Send, {
5788
- className: "skippr:size-3.5"
5789
- })
5899
+ className: "skippr:flex skippr:items-center skippr:gap-[7px] skippr:border-t skippr:border-[rgba(45,45,63,0.07)] skippr:p-[7px]",
5900
+ children: [
5901
+ /* @__PURE__ */ jsx18("textarea", {
5902
+ ref: textareaRef,
5903
+ rows: 1,
5904
+ value: inputText,
5905
+ onChange: handleChange,
5906
+ onKeyDown: handleKeyDown,
5907
+ placeholder: "type a message…",
5908
+ className: "skippr:min-w-0 skippr:flex-1 skippr:resize-none skippr:overflow-y-auto skippr:border-none skippr:bg-transparent skippr:px-[5px] skippr:py-[7px] skippr:text-[13px] skippr:font-medium skippr:leading-5 skippr:text-[#2D2D3F] skippr:outline-none skippr:placeholder:text-[#b0aca4]",
5909
+ style: { maxHeight: `${MAX_INPUT_HEIGHT}px` }
5910
+ }),
5911
+ /* @__PURE__ */ jsx18("button", {
5912
+ type: "submit",
5913
+ disabled: !canSend,
5914
+ "aria-label": "Send message",
5915
+ style: { background: canSend ? "var(--skippr-brand, #2bc0ae)" : "#cdd8d5" },
5916
+ className: cn("skippr:flex skippr:size-[34px] skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-full skippr:text-white skippr:transition-[filter]", canSend ? "skippr:cursor-pointer skippr:hover:brightness-[1.06]" : "skippr:cursor-not-allowed"),
5917
+ children: /* @__PURE__ */ jsx18(Send, {
5918
+ className: "skippr:size-[16px]",
5919
+ strokeWidth: 2
5790
5920
  })
5791
- ]
5792
- })
5921
+ })
5922
+ ]
5793
5923
  });
5794
5924
  }
5795
5925
 
@@ -5931,9 +6061,6 @@ function TypingIndicator() {
5931
6061
  // src/components/MessageList.tsx
5932
6062
  import { jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
5933
6063
  var BOTTOM_THRESHOLD_PX = 32;
5934
- function isPlanVisible(plan) {
5935
- return !!plan && plan.steps.length > 0 && plan.state !== "abandoned" && plan.state !== "aborted";
5936
- }
5937
6064
  function MessageList({
5938
6065
  messages,
5939
6066
  isStreaming,
@@ -5946,14 +6073,14 @@ function MessageList({
5946
6073
  const containerRef = useRef24(null);
5947
6074
  const isPinnedToBottom = useRef24(true);
5948
6075
  const lastSeenMessageId = useRef24(undefined);
5949
- const [showJumpToLatest, setShowJumpToLatest] = useState21(false);
6076
+ const [showJumpToLatest, setShowJumpToLatest] = useState20(false);
5950
6077
  const lastMessage = messages.length > 0 ? messages[messages.length - 1] : undefined;
5951
- const [dismissedPlanId, setDismissedPlanId] = useState21(null);
5952
- const dismissPlan = useCallback17(() => {
6078
+ const [dismissedPlanId, setDismissedPlanId] = useState20(null);
6079
+ const dismissPlan = useCallback18(() => {
5953
6080
  if (plan)
5954
6081
  setDismissedPlanId(plan.planId);
5955
6082
  }, [plan]);
5956
- const handleScroll = useCallback17(() => {
6083
+ const handleScroll = useCallback18(() => {
5957
6084
  const container = containerRef.current;
5958
6085
  if (!container)
5959
6086
  return;
@@ -5962,7 +6089,7 @@ function MessageList({
5962
6089
  isPinnedToBottom.current = pinned;
5963
6090
  setShowJumpToLatest(!pinned);
5964
6091
  }, []);
5965
- const jumpToLatest = useCallback17(() => {
6092
+ const jumpToLatest = useCallback18(() => {
5966
6093
  const container = containerRef.current;
5967
6094
  if (!container)
5968
6095
  return;
@@ -6037,8 +6164,11 @@ function MessageList({
6037
6164
  }
6038
6165
 
6039
6166
  // src/components/SessionAgenda.tsx
6167
+ import { useContext as useContext14 } from "react";
6040
6168
  import { jsx as jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
6041
6169
  function SessionAgenda({ phases, hasStarted }) {
6170
+ const ctx = useContext14(LiveAgentContext);
6171
+ const title = ctx?.activeModule?.name ?? "Agenda";
6042
6172
  if (phases.length === 0 || !hasStarted) {
6043
6173
  return /* @__PURE__ */ jsx23("div", {
6044
6174
  className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
@@ -6047,51 +6177,71 @@ function SessionAgenda({ phases, hasStarted }) {
6047
6177
  })
6048
6178
  });
6049
6179
  }
6050
- return /* @__PURE__ */ jsx23("div", {
6051
- className: "skippr:flex-1 skippr:overflow-y-auto skippr:px-4 skippr:py-4",
6052
- children: /* @__PURE__ */ jsx23("div", {
6053
- className: "skippr:space-y-1",
6054
- children: phases.map((phase) => {
6180
+ const total = phases.length;
6181
+ const completedCount = phases.filter((p) => p.status === "completed").length;
6182
+ const activeIndex = phases.findIndex((p) => p.status === "active");
6183
+ const currentStep = activeIndex >= 0 ? activeIndex + 1 : Math.min(completedCount + 1, total);
6184
+ const progressPct = Math.round(completedCount / total * 100);
6185
+ return /* @__PURE__ */ jsxs19("div", {
6186
+ className: "skippr:flex-1 skippr:overflow-y-auto skippr:p-[14px]",
6187
+ children: [
6188
+ /* @__PURE__ */ jsxs19("div", {
6189
+ className: "skippr:mb-2 skippr:flex skippr:items-baseline skippr:justify-between",
6190
+ children: [
6191
+ /* @__PURE__ */ jsx23("span", {
6192
+ className: "skippr:text-[12.5px] skippr:font-semibold skippr:text-[#2D2D3F]",
6193
+ children: title
6194
+ }),
6195
+ /* @__PURE__ */ jsxs19("span", {
6196
+ className: "skippr:text-[11px] skippr:font-semibold skippr:text-[var(--skippr-brand-deep)]",
6197
+ children: [
6198
+ "step ",
6199
+ currentStep,
6200
+ " of ",
6201
+ total
6202
+ ]
6203
+ })
6204
+ ]
6205
+ }),
6206
+ /* @__PURE__ */ jsx23("div", {
6207
+ className: "skippr:mb-[14px] skippr:h-[5px] skippr:overflow-hidden skippr:rounded-full skippr:bg-[#eeeae4]",
6208
+ children: /* @__PURE__ */ jsx23("div", {
6209
+ className: "skippr:h-full skippr:rounded-full skippr:bg-brand",
6210
+ style: { width: `${progressPct}%` }
6211
+ })
6212
+ }),
6213
+ phases.map((phase) => {
6055
6214
  const isActive = phase.status === "active";
6056
6215
  const isCompleted = phase.status === "completed";
6057
6216
  return /* @__PURE__ */ jsxs19("div", {
6058
- className: cn("skippr:flex skippr:items-start skippr:gap-2.5 skippr:rounded-lg skippr:p-2 skippr:transition-colors", isActive && "skippr:bg-primary/10"),
6217
+ className: "skippr:flex skippr:items-center skippr:gap-[9px] skippr:py-[5px]",
6059
6218
  children: [
6060
- /* @__PURE__ */ jsx23("div", {
6061
- className: "skippr:mt-0.5",
6062
- children: isCompleted ? /* @__PURE__ */ jsx23(CircleCheck, {
6063
- className: "skippr:size-4 skippr:text-chart-3"
6064
- }) : isActive ? /* @__PURE__ */ jsx23(Circle, {
6065
- className: "skippr:size-4 skippr:fill-primary/30 skippr:text-primary"
6066
- }) : /* @__PURE__ */ jsx23(Circle, {
6067
- className: "skippr:size-4 skippr:text-muted-foreground/30"
6219
+ isCompleted ? /* @__PURE__ */ jsx23("span", {
6220
+ className: "skippr:flex skippr:size-[19px] skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-brand",
6221
+ children: /* @__PURE__ */ jsx23(Check, {
6222
+ className: "skippr:size-[11px] skippr:text-white",
6223
+ strokeWidth: 3
6224
+ })
6225
+ }) : isActive ? /* @__PURE__ */ jsx23("span", {
6226
+ className: "skippr:flex skippr:size-[19px] skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-brand skippr:shadow-[0_0_0_4px_var(--skippr-brand-ring)]",
6227
+ children: /* @__PURE__ */ jsx23("span", {
6228
+ className: "skippr:size-[6px] skippr:rounded-full skippr:bg-white"
6068
6229
  })
6230
+ }) : /* @__PURE__ */ jsx23("span", {
6231
+ className: "skippr:size-[19px] skippr:shrink-0 skippr:rounded-full skippr:border-2 skippr:border-[#d8d3ca] skippr:bg-white"
6069
6232
  }),
6070
- /* @__PURE__ */ jsxs19("div", {
6071
- className: "skippr:min-w-0 skippr:flex-1",
6072
- children: [
6073
- /* @__PURE__ */ jsx23("p", {
6074
- className: cn("skippr:text-sm", isCompleted && "skippr:text-muted-foreground skippr:line-through", isActive && "skippr:font-medium skippr:text-foreground", phase.status === "pending" && "skippr:text-muted-foreground"),
6075
- children: phase.name
6076
- }),
6077
- phase.highlights.length > 0 && /* @__PURE__ */ jsx23("ul", {
6078
- className: "skippr:mt-1 skippr:space-y-0.5",
6079
- children: phase.highlights.map((text) => /* @__PURE__ */ jsxs19("li", {
6080
- className: cn("skippr:flex skippr:items-center skippr:gap-1.5 skippr:text-[11px] skippr:leading-tight", isCompleted ? "skippr:text-muted-foreground/40 skippr:line-through" : "skippr:text-muted-foreground/70"),
6081
- children: [
6082
- /* @__PURE__ */ jsx23("span", {
6083
- className: "skippr:size-1 skippr:shrink-0 skippr:rounded-full skippr:bg-current"
6084
- }),
6085
- text
6086
- ]
6087
- }, text))
6088
- })
6089
- ]
6233
+ /* @__PURE__ */ jsx23("span", {
6234
+ className: cn("skippr:text-[12.5px]", isActive || isCompleted ? "skippr:font-semibold skippr:text-[#2D2D3F]" : "skippr:font-medium skippr:text-[#a8a49c]"),
6235
+ children: phase.name
6236
+ }),
6237
+ isActive && /* @__PURE__ */ jsx23("span", {
6238
+ className: "skippr:ml-auto skippr:text-[9.5px] skippr:font-bold skippr:uppercase skippr:tracking-[0.05em] skippr:text-[var(--skippr-brand-deep)]",
6239
+ children: "now"
6090
6240
  })
6091
6241
  ]
6092
6242
  }, phase.name);
6093
6243
  })
6094
- })
6244
+ ]
6095
6245
  });
6096
6246
  }
6097
6247
 
@@ -6135,12 +6285,11 @@ function Sidebar({
6135
6285
  verifyOtp,
6136
6286
  isAuthSubmitting,
6137
6287
  sidebarTab: activeTab,
6138
- setSidebarTab: setActiveTab,
6139
6288
  autoFocusChat,
6140
6289
  agentMode,
6141
6290
  displayModules
6142
6291
  } = useLiveAgent();
6143
- const internalCtx = useContext13(LiveAgentContext);
6292
+ const internalCtx = useContext15(LiveAgentContext);
6144
6293
  const defaultAgentId = internalCtx?.defaultAgentId ?? null;
6145
6294
  const startDefaultSession = internalCtx?.startDefaultSession ?? (() => {});
6146
6295
  const talkDisabled = !(internalCtx?.hasResolvedModules ?? false);
@@ -6152,23 +6301,39 @@ function Sidebar({
6152
6301
  phases: [],
6153
6302
  isLoading: false
6154
6303
  };
6155
- const launcherBottomPx = internalCtx?.launcherBottomPx ?? DEFAULT_LAUNCHER_BOTTOM_PX;
6156
- const popsDown = internalCtx?.popsDown ?? false;
6304
+ const barDock = internalCtx?.barDock ?? null;
6305
+ const barEdge = barDock?.edge ?? "bottom";
6306
+ const barIsTopBottom = barEdge === "top" || barEdge === "bottom";
6307
+ const barCentreY = barDock && !barIsTopBottom ? barDock.offsetPx : 0;
6308
+ const popsDown = barIsTopBottom ? barEdge === "top" : barCentreY < window.innerHeight / 2;
6157
6309
  const panelExpanded = internalCtx?.panelExpanded ?? false;
6158
6310
  const defaultModule = displayModules.find((m) => m.id === defaultAgentId) ?? null;
6159
6311
  const displayedMode = agentMode ?? defaultModule?.mode ?? null;
6160
6312
  const showAgenda = displayedMode !== AGENT_MODE.AlwaysOn;
6161
6313
  const isFloating = variant === "floating";
6162
6314
  const isSidebar = variant === "sidebar";
6163
- const inSession = isConnected || isStarting || isPausing;
6164
- const floatingBottomPx = inSession ? launcherBottomPx + SESSION_BAR_CLEARANCE_PX : triggerBottomPx(launcherBottomPx, popsDown) + IDLE_TRIGGER_CLEARANCE_PX;
6315
+ const barTopBottomAnchorPx = VOICE_BAR_EDGE_MARGIN_PX + VOICE_BAR_HEIGHT_PX + PANEL_GAP_PX;
6165
6316
  let floatingStyle;
6166
6317
  if (isFloating) {
6167
- const availableHeight = popsDown ? `${launcherBottomPx - PANEL_GAP_PX - PANEL_VIEWPORT_MARGIN_PX}px` : `calc(100vh - ${floatingBottomPx + PANEL_VIEWPORT_MARGIN_PX}px)`;
6168
- floatingStyle = {
6169
- ...popsDown ? { top: `calc(100vh - ${launcherBottomPx - PANEL_GAP_PX}px)` } : { bottom: floatingBottomPx },
6170
- height: panelExpanded ? availableHeight : `min(${PANEL_MAX_HEIGHT_PX}px, ${availableHeight})`
6171
- };
6318
+ if (barIsTopBottom) {
6319
+ const centreExpr = barDock ? `${barDock.offsetPx}px` : "50vw";
6320
+ const availableHeight = `calc(100vh - ${barTopBottomAnchorPx + PANEL_VIEWPORT_MARGIN_PX}px)`;
6321
+ floatingStyle = {
6322
+ ...popsDown ? { top: barTopBottomAnchorPx } : { bottom: barTopBottomAnchorPx },
6323
+ left: `clamp(${PANEL_VIEWPORT_MARGIN_PX}px, calc(${centreExpr} - ${SIDEBAR_WIDTH / 2}px), calc(100vw - ${PANEL_VIEWPORT_MARGIN_PX + SIDEBAR_WIDTH}px))`,
6324
+ height: panelExpanded ? availableHeight : `min(${PANEL_MAX_HEIGHT_PX}px, ${availableHeight})`
6325
+ };
6326
+ } else {
6327
+ const barHalfHeight = VOICE_BAR_HEIGHT_PX / 2;
6328
+ const topAnchorPx = barCentreY + barHalfHeight + PANEL_GAP_PX;
6329
+ const bottomAnchorExpr = `calc(100vh - ${barCentreY - barHalfHeight}px + ${PANEL_GAP_PX}px)`;
6330
+ const availableHeight = popsDown ? `calc(100vh - ${topAnchorPx + PANEL_VIEWPORT_MARGIN_PX}px)` : `${barCentreY - barHalfHeight - PANEL_GAP_PX - PANEL_VIEWPORT_MARGIN_PX}px`;
6331
+ floatingStyle = {
6332
+ ...popsDown ? { top: topAnchorPx } : { bottom: bottomAnchorExpr },
6333
+ ...barEdge === "left" ? { left: VOICE_BAR_EDGE_MARGIN_PX } : { right: VOICE_BAR_EDGE_MARGIN_PX },
6334
+ height: panelExpanded ? availableHeight : `min(${PANEL_MAX_HEIGHT_PX}px, ${availableHeight})`
6335
+ };
6336
+ }
6172
6337
  }
6173
6338
  useEffect29(() => {
6174
6339
  if (!isSidebar)
@@ -6186,7 +6351,7 @@ function Sidebar({
6186
6351
  }, [isSidebar, isPanelOpen, position]);
6187
6352
  return /* @__PURE__ */ jsxs20("div", {
6188
6353
  ref: internalCtx?.panelRef,
6189
- className: cn("skippr:fixed skippr:z-[9999]", "skippr:bg-card", "skippr:flex skippr:flex-col", "skippr:overflow-hidden", isFloating && "skippr:border skippr:border-border skippr:rounded-2xl skippr:shadow-[0_8px_30px_rgba(0,0,0,0.16),0_4px_12px_rgba(0,0,0,0.08)]", isFloating && (position === "right" ? "skippr:right-6" : "skippr:left-6"), isFloating && "skippr:transition-[opacity,transform,height] skippr:duration-300 skippr:ease-in-out", isFloating && (popsDown ? position === "right" ? "skippr:origin-top-right" : "skippr:origin-top-left" : position === "right" ? "skippr:origin-bottom-right" : "skippr:origin-bottom-left"), isFloating && !isPanelOpen && "skippr:scale-0 skippr:opacity-0 skippr:pointer-events-none", isFloating && isPanelOpen && "skippr:scale-100 skippr:opacity-100", 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"),
6354
+ 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", isFloating && (barIsTopBottom ? popsDown ? "skippr:origin-top" : "skippr:origin-bottom" : popsDown ? barEdge === "left" ? "skippr:origin-top-left" : "skippr:origin-top-right" : barEdge === "left" ? "skippr:origin-bottom-left" : "skippr:origin-bottom-right"), isFloating && !isPanelOpen && "skippr:scale-0 skippr:opacity-0 skippr:pointer-events-none", isFloating && isPanelOpen && "skippr:scale-100 skippr:opacity-100", 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"),
6190
6355
  style: { width: isPanelOpen ? SIDEBAR_WIDTH : undefined, ...floatingStyle },
6191
6356
  children: [
6192
6357
  !hideHeader && /* @__PURE__ */ jsx25(ChatHeader, {}),
@@ -6198,14 +6363,14 @@ function Sidebar({
6198
6363
  isStarting,
6199
6364
  error,
6200
6365
  activeTab,
6201
- onTabChange: setActiveTab,
6202
6366
  hideControls,
6203
6367
  autoFocusChat,
6204
6368
  showAgenda,
6205
6369
  idleHistory,
6206
6370
  onTalk: startDefaultSession,
6207
6371
  talkLabel: startSessionLabel,
6208
- talkDisabled
6372
+ talkDisabled,
6373
+ showTalk: !isFloating
6209
6374
  }) : usesHostAuth || isValidating || isAuthenticated ? /* @__PURE__ */ jsx25("div", {
6210
6375
  className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
6211
6376
  children: /* @__PURE__ */ jsx25(LoadingDots, {
@@ -6228,14 +6393,14 @@ function AuthenticatedContent({
6228
6393
  isStarting,
6229
6394
  error,
6230
6395
  activeTab,
6231
- onTabChange,
6232
6396
  hideControls,
6233
6397
  autoFocusChat,
6234
6398
  showAgenda,
6235
6399
  idleHistory,
6236
6400
  onTalk,
6237
6401
  talkLabel,
6238
- talkDisabled
6402
+ talkDisabled,
6403
+ showTalk
6239
6404
  }) {
6240
6405
  const inSession = isConnected || isStarting || isPaused || isPausing;
6241
6406
  const effectiveTab = showAgenda ? activeTab : "chat";
@@ -6246,39 +6411,6 @@ function AuthenticatedContent({
6246
6411
  return /* @__PURE__ */ jsxs20(Fragment4, {
6247
6412
  children: [
6248
6413
  isConnected && /* @__PURE__ */ jsx25(ConnectedBanner, {}),
6249
- showAgenda && /* @__PURE__ */ jsxs20("div", {
6250
- className: "skippr:flex skippr:items-center skippr:gap-2 skippr:border-b skippr:border-border skippr:px-3 skippr:py-1",
6251
- children: [
6252
- /* @__PURE__ */ jsxs20("button", {
6253
- type: "button",
6254
- className: cn("skippr:relative skippr:inline-flex skippr:cursor-pointer skippr:items-center skippr:gap-1.5 skippr:rounded-lg skippr:px-3 skippr:py-1.5 skippr:text-sm skippr:font-medium skippr:transition-all", activeTab === "chat" ? "skippr:text-foreground" : "skippr:text-muted-foreground skippr:hover:text-foreground"),
6255
- onClick: () => onTabChange("chat"),
6256
- children: [
6257
- /* @__PURE__ */ jsx25(MessageCircle, {
6258
- className: "skippr:size-3.5"
6259
- }),
6260
- "Chat",
6261
- activeTab === "chat" && /* @__PURE__ */ jsx25("span", {
6262
- className: "skippr:absolute skippr:-bottom-1 skippr:left-3 skippr:right-3 skippr:h-0.5 skippr:rounded-full skippr:bg-foreground"
6263
- })
6264
- ]
6265
- }),
6266
- /* @__PURE__ */ jsxs20("button", {
6267
- type: "button",
6268
- className: cn("skippr:relative skippr:inline-flex skippr:cursor-pointer skippr:items-center skippr:gap-1.5 skippr:rounded-lg skippr:px-3 skippr:py-1.5 skippr:text-sm skippr:font-medium skippr:transition-all", activeTab === "agenda" ? "skippr:text-foreground" : "skippr:text-muted-foreground skippr:hover:text-foreground"),
6269
- onClick: () => onTabChange("agenda"),
6270
- children: [
6271
- /* @__PURE__ */ jsx25(Calendar, {
6272
- className: "skippr:size-3.5"
6273
- }),
6274
- "Agenda",
6275
- activeTab === "agenda" && /* @__PURE__ */ jsx25("span", {
6276
- className: "skippr:absolute skippr:-bottom-1 skippr:left-3 skippr:right-3 skippr:h-0.5 skippr:rounded-full skippr:bg-foreground"
6277
- })
6278
- ]
6279
- })
6280
- ]
6281
- }),
6282
6414
  /* @__PURE__ */ jsx25("div", {
6283
6415
  className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col",
6284
6416
  children: isDisconnecting ? /* @__PURE__ */ jsx25("div", {
@@ -6303,6 +6435,7 @@ function AuthenticatedContent({
6303
6435
  onTalk,
6304
6436
  talkLabel,
6305
6437
  talkDisabled,
6438
+ showTalk,
6306
6439
  error
6307
6440
  })
6308
6441
  }),
@@ -6364,6 +6497,7 @@ function IdleHistory({
6364
6497
  onTalk,
6365
6498
  talkLabel,
6366
6499
  talkDisabled,
6500
+ showTalk,
6367
6501
  error
6368
6502
  }) {
6369
6503
  if (history2.isLoading) {
@@ -6388,10 +6522,10 @@ function IdleHistory({
6388
6522
  isStreaming: false,
6389
6523
  readOnly: true
6390
6524
  }),
6391
- /* @__PURE__ */ jsxs20("div", {
6525
+ (showTalk || error) && /* @__PURE__ */ jsxs20("div", {
6392
6526
  className: "skippr:shrink-0 skippr:border-t skippr:border-border skippr:p-3",
6393
6527
  children: [
6394
- /* @__PURE__ */ jsxs20("button", {
6528
+ showTalk && /* @__PURE__ */ jsxs20("button", {
6395
6529
  type: "button",
6396
6530
  onClick: onTalk,
6397
6531
  disabled: talkDisabled,
@@ -6404,7 +6538,7 @@ function IdleHistory({
6404
6538
  ]
6405
6539
  }),
6406
6540
  error && /* @__PURE__ */ jsx25("p", {
6407
- className: "skippr:mt-2 skippr:text-center skippr:text-xs skippr:text-destructive",
6541
+ className: cn("skippr:text-center skippr:text-xs skippr:text-destructive", showTalk && "skippr:mt-2"),
6408
6542
  children: error
6409
6543
  })
6410
6544
  ]
@@ -6445,7 +6579,7 @@ function ConnectedBody({
6445
6579
  }
6446
6580
 
6447
6581
  // src/components/SidebarTrigger.tsx
6448
- import { useContext as useContext14 } from "react";
6582
+ import { useContext as useContext16 } from "react";
6449
6583
 
6450
6584
  // src/components/Logo.tsx
6451
6585
  import { jsx as jsx26, jsxs as jsxs21 } from "react/jsx-runtime";
@@ -6497,7 +6631,7 @@ function SidebarTrigger() {
6497
6631
  isStarting,
6498
6632
  isPausing
6499
6633
  } = useLiveAgent();
6500
- const internalCtx = useContext14(LiveAgentContext);
6634
+ const internalCtx = useContext16(LiveAgentContext);
6501
6635
  const launcherBottomPx = internalCtx?.launcherBottomPx ?? DEFAULT_LAUNCHER_BOTTOM_PX;
6502
6636
  const popsDown = internalCtx?.popsDown ?? false;
6503
6637
  const logoUrl = internalCtx?.appearance?.logoUrl ?? null;
@@ -6523,43 +6657,1848 @@ function SidebarTrigger() {
6523
6657
  });
6524
6658
  }
6525
6659
 
6526
- // src/components/LiveAgent.tsx
6527
- import { jsx as jsx28, jsxs as jsxs22 } from "react/jsx-runtime";
6528
- function readSavedPosition() {
6529
- try {
6530
- const saved = localStorage.getItem("skippr_widget_position");
6531
- return saved === "left" || saved === "right" ? saved : null;
6532
- } catch {
6533
- return null;
6660
+ // src/components/VoiceBar.tsx
6661
+ import { useCallback as useCallback23, useContext as useContext21, useState as useState29 } from "react";
6662
+
6663
+ // src/hooks/useBarNotifications.ts
6664
+ import { useContext as useContext18 } from "react";
6665
+
6666
+ // src/hooks/useAdoptionTips.ts
6667
+ import { useContext as useContext17 } from "react";
6668
+ function useAdoptionTips() {
6669
+ const ctx = useContext17(LiveAgentContext);
6670
+ if (!ctx) {
6671
+ throw new Error("useAdoptionTips must be used within a <LiveAgent> provider");
6534
6672
  }
6673
+ const {
6674
+ adoptionGoals,
6675
+ agentMode,
6676
+ hasResolvedModules,
6677
+ isConnected,
6678
+ isStarting,
6679
+ isPausing,
6680
+ isDisconnecting
6681
+ } = ctx;
6682
+ const sessionLive = isConnected || isStarting || isPausing || isDisconnecting;
6683
+ const inStandardSession = sessionLive && agentMode !== AGENT_MODE.AlwaysOn;
6684
+ if (inStandardSession || !hasResolvedModules || adoptionGoals.length === 0)
6685
+ return [];
6686
+ return adoptionGoals.slice(0, MAX_ADOPTION_TIPS);
6535
6687
  }
6536
- function readSavedLauncherBottom() {
6537
- try {
6538
- const saved = Number.parseInt(localStorage.getItem("skippr_widget_bottom") ?? "", 10);
6539
- return Number.isFinite(saved) && saved > 0 ? saved : null;
6540
- } catch {
6541
- return null;
6688
+
6689
+ // src/hooks/useBarNotifications.ts
6690
+ function useBarNotifications() {
6691
+ const ctx = useContext18(LiveAgentContext);
6692
+ if (!ctx) {
6693
+ throw new Error("useBarNotifications must be used within a <LiveAgent> provider");
6542
6694
  }
6543
- }
6544
- function AgentCursorMount({ animated }) {
6545
- return /* @__PURE__ */ jsx28(AgentCursor, {
6546
- target: useAgentCursor(),
6547
- animated
6548
- });
6549
- }
6550
- function PlanPanelOpener() {
6551
- const plan = usePlanUpdates();
6552
- const { expandPanel } = useLiveAgent();
6553
- const surfacedPlanIdRef = useRef25(null);
6554
- useEffect30(() => {
6555
- if (plan?.state !== "proposed" || surfacedPlanIdRef.current === plan.planId)
6556
- return;
6557
- surfacedPlanIdRef.current = plan.planId;
6558
- expandPanel();
6559
- }, [plan?.planId, plan?.state, expandPanel]);
6560
- return null;
6561
- }
6562
- function LiveAgent(props) {
6695
+ const {
6696
+ displayModules,
6697
+ defaultAgentId,
6698
+ activeModule,
6699
+ agentMode,
6700
+ hasResolvedModules,
6701
+ isConnected,
6702
+ selectModule,
6703
+ startAdoptionSession,
6704
+ attendGoal
6705
+ } = ctx;
6706
+ const tips = useAdoptionTips();
6707
+ const { sendChatMessage } = useChatMessages();
6708
+ const inAlwaysOnSession = isConnected && agentMode === AGENT_MODE.AlwaysOn;
6709
+ const tipNotifications = tips.map((goal) => ({
6710
+ id: goal.goalId,
6711
+ kind: NOTIFICATION_KIND.Tip,
6712
+ message: goal.displayMessage,
6713
+ accentColor: NOTIF_ACCENT_COLOR,
6714
+ activate: inAlwaysOnSession ? () => {
6715
+ attendGoal(goal.goalId);
6716
+ sendChatMessage(goal.objective).catch((e) => console.warn("[Skippr] tip prompt send failed", e));
6717
+ } : () => startAdoptionSession(goal)
6718
+ }));
6719
+ const moduleNotifications = !hasResolvedModules ? [] : displayModules.filter((module) => module.id !== defaultAgentId && module.id !== activeModule?.id).filter((module) => {
6720
+ const state = getModuleSessionState(module.currentSession, module.mode);
6721
+ return state !== "completed" && state !== "expired";
6722
+ }).map((module) => ({
6723
+ id: module.id,
6724
+ kind: NOTIFICATION_KIND.Module,
6725
+ message: module.name,
6726
+ accentColor: MODULE_ACCENT_COLOR,
6727
+ activate: () => selectModule(module.id)
6728
+ }));
6729
+ return [...tipNotifications, ...moduleNotifications];
6730
+ }
6731
+
6732
+ // src/components/VoiceBarFrame.tsx
6733
+ import { useIsSpeaking, useLocalParticipant as useLocalParticipant12 } from "@livekit/components-react/hooks";
6734
+ import { useCallback as useCallback21, useContext as useContext20, useEffect as useEffect38, useRef as useRef31, useState as useState26 } from "react";
6735
+
6736
+ // src/hooks/useIdleAutoOff.ts
6737
+ import { useCallback as useCallback19, useEffect as useEffect30, useRef as useRef25 } from "react";
6738
+ function useIdleAutoOff({
6739
+ enabled,
6740
+ active,
6741
+ onExpire
6742
+ }) {
6743
+ const timerRef = useRef25(null);
6744
+ const onExpireRef = useRef25(onExpire);
6745
+ onExpireRef.current = onExpire;
6746
+ const clearTimer = useCallback19(() => {
6747
+ if (timerRef.current) {
6748
+ clearTimeout(timerRef.current);
6749
+ timerRef.current = null;
6750
+ }
6751
+ }, []);
6752
+ const armTimer = useCallback19(() => {
6753
+ clearTimer();
6754
+ timerRef.current = setTimeout(() => onExpireRef.current(), IDLE_AUTO_OFF_MS);
6755
+ }, [clearTimer]);
6756
+ const reportActivity = useCallback19(() => {
6757
+ if (enabled && !active)
6758
+ armTimer();
6759
+ }, [enabled, active, armTimer]);
6760
+ useEffect30(() => {
6761
+ if (!enabled || active) {
6762
+ clearTimer();
6763
+ return;
6764
+ }
6765
+ armTimer();
6766
+ return clearTimer;
6767
+ }, [enabled, active, armTimer, clearTimer]);
6768
+ return { reportActivity };
6769
+ }
6770
+
6771
+ // src/hooks/useKeyboardStop.ts
6772
+ import { useEffect as useEffect31, useRef as useRef26 } from "react";
6773
+ function useKeyboardStop({ enabled, onStop }) {
6774
+ const handler = useRef26(onStop);
6775
+ handler.current = onStop;
6776
+ useEffect31(() => {
6777
+ if (!enabled)
6778
+ return;
6779
+ const onKeyDown = (event) => {
6780
+ if (!event.ctrlKey || event.code !== STOP_AGENT_KEY || event.repeat)
6781
+ return;
6782
+ if (isEditableTarget())
6783
+ return;
6784
+ event.preventDefault();
6785
+ handler.current();
6786
+ };
6787
+ document.addEventListener("keydown", onKeyDown);
6788
+ return () => document.removeEventListener("keydown", onKeyDown);
6789
+ }, [enabled]);
6790
+ }
6791
+
6792
+ // src/hooks/useSessionTimer.ts
6793
+ import { useEffect as useEffect33, useState as useState22 } from "react";
6794
+
6795
+ // src/hooks/useElapsedSeconds.ts
6796
+ import { useEffect as useEffect32, useRef as useRef27, useState as useState21 } from "react";
6797
+ function useElapsedSeconds(isRunning, resetSignal) {
6798
+ const [elapsed, setElapsed] = useState21(0);
6799
+ const accumulatedSecondsRef = useRef27(0);
6800
+ useEffect32(() => {
6801
+ accumulatedSecondsRef.current = 0;
6802
+ setElapsed(0);
6803
+ }, [resetSignal]);
6804
+ useEffect32(() => {
6805
+ if (!isRunning)
6806
+ return;
6807
+ const resumedAt = Date.now();
6808
+ const accumulatedSeconds = accumulatedSecondsRef.current;
6809
+ const totalSeconds = () => accumulatedSeconds + Math.floor((Date.now() - resumedAt) / 1000);
6810
+ const tick = () => setElapsed(totalSeconds());
6811
+ tick();
6812
+ const id = setInterval(tick, 1000);
6813
+ return () => {
6814
+ clearInterval(id);
6815
+ accumulatedSecondsRef.current = totalSeconds();
6816
+ setElapsed(accumulatedSecondsRef.current);
6817
+ };
6818
+ }, [isRunning]);
6819
+ return elapsed;
6820
+ }
6821
+
6822
+ // src/hooks/useSessionTimer.ts
6823
+ function useSessionTimer(isRunning, resetSignal) {
6824
+ const remaining = useSessionRemaining();
6825
+ const elapsed = useElapsedSeconds(isRunning, resetSignal);
6826
+ const active = isRunning && remaining !== null;
6827
+ const warning = active && remaining !== null && remaining <= SESSION_TIMER_WARNING_S;
6828
+ const revealCycle = !active ? null : warning ? "warning" : "normal";
6829
+ const [revealed, setRevealed] = useState22(false);
6830
+ useEffect33(() => {
6831
+ if (!revealCycle) {
6832
+ setRevealed(false);
6833
+ return;
6834
+ }
6835
+ let timer;
6836
+ function show() {
6837
+ setRevealed(true);
6838
+ timer = setTimeout(hide, SESSION_TIMER_HOLD_MS);
6839
+ }
6840
+ function hide() {
6841
+ setRevealed(false);
6842
+ timer = setTimeout(show, SESSION_TIMER_INTERVAL_MS);
6843
+ }
6844
+ show();
6845
+ return () => clearTimeout(timer);
6846
+ }, [revealCycle]);
6847
+ if (!revealed || remaining === null)
6848
+ return null;
6849
+ if (remaining <= SESSION_TIMER_WARNING_S) {
6850
+ return { label: `${Math.max(1, Math.ceil(remaining / 60))} min left`, warning: true };
6851
+ }
6852
+ const totalMin = Math.round((elapsed + remaining) / 60);
6853
+ const elapsedMin = Math.max(1, Math.floor(elapsed / 60));
6854
+ return { label: `${elapsedMin} min / ${totalMin}`, warning: false };
6855
+ }
6856
+
6857
+ // src/hooks/useVoiceBarDrag.ts
6858
+ import { useEffect as useEffect34, useRef as useRef28 } from "react";
6859
+ import { flushSync as flushSync2 } from "react-dom";
6860
+ var DRAG_THRESHOLD_PX2 = 5;
6861
+ function useVoiceBarDrag(containerRef, onDrop, followRefs, reportDragging) {
6862
+ const wasDraggedRef = useRef28(false);
6863
+ const onDropRef = useRef28(onDrop);
6864
+ onDropRef.current = onDrop;
6865
+ const followTargetsRef = useRef28(followRefs);
6866
+ followTargetsRef.current = followRefs;
6867
+ const reportDraggingRef = useRef28(reportDragging);
6868
+ reportDraggingRef.current = reportDragging;
6869
+ useEffect34(() => {
6870
+ const el = containerRef.current;
6871
+ if (!el)
6872
+ return;
6873
+ let startX = 0;
6874
+ let startY = 0;
6875
+ let dragging = false;
6876
+ let activePointerId = null;
6877
+ let followers = [];
6878
+ let restoreTransitionRafId = 0;
6879
+ let transitionFrozen = [];
6880
+ const FREEZE_ATTR = "skipprDragFreezes";
6881
+ const freezeCount = (node) => Number.parseInt(node.dataset[FREEZE_ATTR] ?? "0", 10) || 0;
6882
+ const freeze = (node) => {
6883
+ node.dataset[FREEZE_ATTR] = String(freezeCount(node) + 1);
6884
+ node.style.transition = "none";
6885
+ };
6886
+ const unfreeze = (node) => {
6887
+ const remaining = freezeCount(node) - 1;
6888
+ if (remaining > 0) {
6889
+ node.dataset[FREEZE_ATTR] = String(remaining);
6890
+ return;
6891
+ }
6892
+ delete node.dataset[FREEZE_ATTR];
6893
+ node.style.transition = "";
6894
+ };
6895
+ const cancelPendingTransitionRestore = () => {
6896
+ if (transitionFrozen.length === 0)
6897
+ return;
6898
+ cancelAnimationFrame(restoreTransitionRafId);
6899
+ for (const element of transitionFrozen)
6900
+ unfreeze(element);
6901
+ transitionFrozen = [];
6902
+ };
6903
+ const clearDragOffset = () => {
6904
+ el.style.removeProperty("--skippr-drag-x");
6905
+ el.style.removeProperty("--skippr-drag-y");
6906
+ };
6907
+ const onPointerMove = (event) => {
6908
+ if (event.pointerId !== activePointerId)
6909
+ return;
6910
+ if (event.buttons === 0) {
6911
+ endDrag();
6912
+ return;
6913
+ }
6914
+ const dx = event.clientX - startX;
6915
+ const dy = event.clientY - startY;
6916
+ if (!dragging && Math.hypot(dx, dy) < DRAG_THRESHOLD_PX2)
6917
+ return;
6918
+ if (!dragging) {
6919
+ try {
6920
+ el.setPointerCapture(event.pointerId);
6921
+ } catch {}
6922
+ followers = (followTargetsRef.current ?? []).map((ref) => ref.current).filter((node) => node !== null);
6923
+ cancelPendingTransitionRestore();
6924
+ for (const follower of followers)
6925
+ freeze(follower);
6926
+ reportDraggingRef.current?.(true);
6927
+ }
6928
+ dragging = true;
6929
+ wasDraggedRef.current = true;
6930
+ el.style.setProperty("--skippr-drag-x", `${dx}px`);
6931
+ el.style.setProperty("--skippr-drag-y", `${dy}px`);
6932
+ const followerTransform = `translate(${dx}px, ${dy}px)`;
6933
+ for (const follower of followers)
6934
+ follower.style.transform = followerTransform;
6935
+ };
6936
+ const onPointerUp = (event) => {
6937
+ if (event.pointerId !== activePointerId)
6938
+ return;
6939
+ if (dragging) {
6940
+ const rect = el.getBoundingClientRect();
6941
+ const centerX = rect.left + rect.width / 2;
6942
+ const centerY = rect.top + rect.height / 2;
6943
+ clearDragOffset();
6944
+ for (const follower of followers)
6945
+ follower.style.transform = "";
6946
+ flushSync2(() => onDropRef.current(dropTargetFromPointer(centerX, centerY)));
6947
+ }
6948
+ endDrag();
6949
+ };
6950
+ const onPointerCancel = (event) => {
6951
+ if (event.pointerId !== activePointerId)
6952
+ return;
6953
+ endDrag();
6954
+ };
6955
+ const endDrag = () => {
6956
+ activePointerId = null;
6957
+ if (dragging)
6958
+ reportDraggingRef.current?.(false);
6959
+ window.removeEventListener("pointermove", onPointerMove);
6960
+ window.removeEventListener("pointerup", onPointerUp);
6961
+ window.removeEventListener("pointercancel", onPointerCancel);
6962
+ clearDragOffset();
6963
+ const settled = followers;
6964
+ followers = [];
6965
+ for (const follower of settled)
6966
+ follower.style.transform = "";
6967
+ if (settled.length > 0) {
6968
+ transitionFrozen = settled;
6969
+ restoreTransitionRafId = requestAnimationFrame(() => {
6970
+ for (const follower of settled)
6971
+ unfreeze(follower);
6972
+ transitionFrozen = [];
6973
+ });
6974
+ }
6975
+ setTimeout(() => {
6976
+ wasDraggedRef.current = false;
6977
+ }, 0);
6978
+ };
6979
+ const onPointerDown = (event) => {
6980
+ if (event.button !== 0)
6981
+ return;
6982
+ if (event.target instanceof Element && event.target.closest(`[${NO_DRAG_ATTR}]`))
6983
+ return;
6984
+ if (activePointerId !== null) {
6985
+ if (dragging)
6986
+ return;
6987
+ endDrag();
6988
+ }
6989
+ activePointerId = event.pointerId;
6990
+ startX = event.clientX;
6991
+ startY = event.clientY;
6992
+ dragging = false;
6993
+ wasDraggedRef.current = false;
6994
+ window.addEventListener("pointermove", onPointerMove);
6995
+ window.addEventListener("pointerup", onPointerUp);
6996
+ window.addEventListener("pointercancel", onPointerCancel);
6997
+ };
6998
+ const onDragStart = (event) => event.preventDefault();
6999
+ el.addEventListener("pointerdown", onPointerDown);
7000
+ el.addEventListener("dragstart", onDragStart);
7001
+ return () => {
7002
+ el.removeEventListener("pointerdown", onPointerDown);
7003
+ el.removeEventListener("dragstart", onDragStart);
7004
+ window.removeEventListener("pointermove", onPointerMove);
7005
+ window.removeEventListener("pointerup", onPointerUp);
7006
+ window.removeEventListener("pointercancel", onPointerCancel);
7007
+ if (dragging)
7008
+ reportDraggingRef.current?.(false);
7009
+ clearDragOffset();
7010
+ cancelPendingTransitionRestore();
7011
+ for (const follower of followers) {
7012
+ follower.style.transform = "";
7013
+ unfreeze(follower);
7014
+ }
7015
+ };
7016
+ }, [containerRef]);
7017
+ return { wasDraggedRef };
7018
+ }
7019
+
7020
+ // src/components/VoiceBarChatLine.tsx
7021
+ import { useCallback as useCallback20, useContext as useContext19, useEffect as useEffect35, useRef as useRef29, useState as useState23 } from "react";
7022
+ import { jsx as jsx28, jsxs as jsxs22 } from "react/jsx-runtime";
7023
+ var UNTOUCHED_HIDE_MS = 6000;
7024
+ var TYPED_HIDE_MS = 60000;
7025
+ function VoiceBarChatLine({ dock, canSend, onClose }) {
7026
+ const { sendChatMessage, isSendingChat } = useChatMessages();
7027
+ const reportChatActivity = useContext19(LiveAgentContext)?.reportChatActivity;
7028
+ const [text, setText] = useState23("");
7029
+ const inputRef = useRef29(null);
7030
+ const idleTimerRef = useRef29(null);
7031
+ const hasTypedRef = useRef29(false);
7032
+ const onCloseRef = useRef29(onClose);
7033
+ onCloseRef.current = onClose;
7034
+ const armIdle = useCallback20(() => {
7035
+ if (idleTimerRef.current)
7036
+ clearTimeout(idleTimerRef.current);
7037
+ const hideAfterMs = hasTypedRef.current ? TYPED_HIDE_MS : UNTOUCHED_HIDE_MS;
7038
+ idleTimerRef.current = setTimeout(() => onCloseRef.current(), hideAfterMs);
7039
+ }, []);
7040
+ useEffect35(() => {
7041
+ inputRef.current?.focus();
7042
+ armIdle();
7043
+ return () => {
7044
+ if (idleTimerRef.current)
7045
+ clearTimeout(idleTimerRef.current);
7046
+ };
7047
+ }, [armIdle]);
7048
+ const hasText = text.trim().length > 0;
7049
+ const sendReady = hasText && canSend && !isSendingChat;
7050
+ const submit = () => {
7051
+ if (!sendReady)
7052
+ return;
7053
+ reportChatActivity?.();
7054
+ const message = text.trim();
7055
+ setText("");
7056
+ armIdle();
7057
+ inputRef.current?.focus();
7058
+ sendChatMessage(message).catch((e) => console.warn("[Skippr] chat send failed", e));
7059
+ };
7060
+ const style = {
7061
+ position: "absolute",
7062
+ left: 0,
7063
+ width: 255,
7064
+ ...dock.edge === "top" ? { top: "calc(100% + 12px)" } : { bottom: "calc(100% + 12px)" }
7065
+ };
7066
+ return /* @__PURE__ */ jsxs22("div", {
7067
+ style,
7068
+ onPointerDown: (event) => event.stopPropagation(),
7069
+ className: "skippr:z-[4] skippr:flex skippr:items-center skippr:gap-[7px] skippr:rounded-[12px] skippr:border skippr:border-[rgba(45,45,63,0.08)] skippr:bg-white skippr:py-[4px] skippr:pl-[13px] skippr:pr-[5px] 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]",
7070
+ children: [
7071
+ /* @__PURE__ */ jsx28("input", {
7072
+ ref: inputRef,
7073
+ value: text,
7074
+ onChange: (event) => {
7075
+ setText(event.target.value);
7076
+ hasTypedRef.current = true;
7077
+ armIdle();
7078
+ reportChatActivity?.();
7079
+ },
7080
+ onKeyDown: (event) => {
7081
+ if (event.key === "Enter") {
7082
+ event.preventDefault();
7083
+ submit();
7084
+ }
7085
+ },
7086
+ placeholder: "type a message…",
7087
+ className: "skippr:min-w-0 skippr:flex-1 skippr:border-none skippr:bg-transparent skippr:py-[7px] skippr:text-[13px] skippr:font-medium skippr:text-[#2D2D3F] skippr:outline-none skippr:placeholder:text-[#b0aca4]"
7088
+ }),
7089
+ /* @__PURE__ */ jsx28("button", {
7090
+ type: "button",
7091
+ onClick: submit,
7092
+ disabled: !sendReady,
7093
+ style: { background: hasText ? "var(--skippr-brand, #2bc0ae)" : "#cdd8d5" },
7094
+ "aria-label": "Send",
7095
+ className: "skippr:flex skippr:size-[32px] skippr:shrink-0 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:text-white skippr:transition-[filter] skippr:hover:brightness-[1.06] skippr:disabled:cursor-not-allowed",
7096
+ children: /* @__PURE__ */ jsx28(Send, {
7097
+ className: "skippr:size-[15px]",
7098
+ strokeWidth: 2
7099
+ })
7100
+ })
7101
+ ]
7102
+ });
7103
+ }
7104
+
7105
+ // src/components/VoiceBarNotification.tsx
7106
+ import { useEffect as useEffect36, useRef as useRef30, useState as useState24 } from "react";
7107
+ import { jsx as jsx29, jsxs as jsxs23 } from "react/jsx-runtime";
7108
+ function VoiceBarNotification({
7109
+ notifications,
7110
+ dock,
7111
+ onDismiss
7112
+ }) {
7113
+ const [index2, setIndex] = useState24(0);
7114
+ const [paused, setPaused] = useState24(false);
7115
+ const cardRef = useRef30(null);
7116
+ useEffect36(() => {
7117
+ const el = cardRef.current;
7118
+ if (!el)
7119
+ return;
7120
+ const enter = () => setPaused(true);
7121
+ const leave = () => setPaused(false);
7122
+ el.addEventListener("mouseenter", enter);
7123
+ el.addEventListener("mouseleave", leave);
7124
+ return () => {
7125
+ el.removeEventListener("mouseenter", enter);
7126
+ el.removeEventListener("mouseleave", leave);
7127
+ };
7128
+ }, []);
7129
+ useEffect36(() => {
7130
+ if (paused)
7131
+ return;
7132
+ const rotate = setInterval(() => setIndex((current) => (current + 1) % notifications.length), TIP_ROTATE_MS);
7133
+ const hide = setTimeout(onDismiss, TIP_HIDE_MS);
7134
+ return () => {
7135
+ clearInterval(rotate);
7136
+ clearTimeout(hide);
7137
+ };
7138
+ }, [paused, notifications.length, onDismiss]);
7139
+ if (notifications.length === 0)
7140
+ return null;
7141
+ const safeIndex = Math.min(index2, notifications.length - 1);
7142
+ const notification = notifications[safeIndex];
7143
+ if (!notification)
7144
+ return null;
7145
+ const hasMultiple = notifications.length > 1;
7146
+ const wrapperStyle = isHorizontalEdge(dock.edge) ? {
7147
+ position: "absolute",
7148
+ left: 0,
7149
+ right: 0,
7150
+ display: "flex",
7151
+ justifyContent: "center",
7152
+ zIndex: 6,
7153
+ ...dock.edge === "top" ? { top: "calc(100% + 10px)" } : { bottom: "calc(100% + 10px)" }
7154
+ } : {
7155
+ position: "absolute",
7156
+ top: 0,
7157
+ bottom: 0,
7158
+ display: "flex",
7159
+ alignItems: "center",
7160
+ zIndex: 6,
7161
+ ...dock.edge === "left" ? { left: "calc(100% + 10px)" } : { right: "calc(100% + 10px)" }
7162
+ };
7163
+ return /* @__PURE__ */ jsx29("div", {
7164
+ style: wrapperStyle,
7165
+ "data-skippr-no-drag": "",
7166
+ children: /* @__PURE__ */ jsxs23("div", {
7167
+ ref: cardRef,
7168
+ 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)]",
7169
+ children: [
7170
+ /* @__PURE__ */ jsx29("span", {
7171
+ className: "skippr:flex skippr:min-h-[16px] skippr:min-w-0 skippr:flex-1 skippr:items-center skippr:text-[10px] skippr:font-medium skippr:leading-[1.25] skippr:text-[#5a5650]",
7172
+ children: /* @__PURE__ */ jsx29("span", {
7173
+ className: "skippr:line-clamp-2",
7174
+ children: notification.message
7175
+ })
7176
+ }),
7177
+ /* @__PURE__ */ jsx29("button", {
7178
+ type: "button",
7179
+ onClick: () => {
7180
+ notification.activate();
7181
+ onDismiss();
7182
+ },
7183
+ 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]",
7184
+ children: "start"
7185
+ }),
7186
+ hasMultiple && /* @__PURE__ */ jsxs23("button", {
7187
+ type: "button",
7188
+ onClick: () => setIndex((current) => (current + 1) % notifications.length),
7189
+ "aria-label": "Next",
7190
+ title: "Next",
7191
+ className: "skippr:flex skippr:shrink-0 skippr:cursor-pointer skippr:items-center skippr:gap-[1px] skippr:rounded-full skippr:px-[5px] skippr:py-[1px] skippr:font-mono skippr:text-[8.5px] skippr:font-bold skippr:tracking-[0.02em] skippr:text-[#8b877f] skippr:transition-colors skippr:hover:bg-[#f2f0eb] skippr:hover:text-[#5a5650]",
7192
+ children: [
7193
+ safeIndex + 1,
7194
+ "/",
7195
+ notifications.length,
7196
+ /* @__PURE__ */ jsx29(ChevronRight, {
7197
+ className: "skippr:size-[11px]",
7198
+ strokeWidth: 2.5
7199
+ })
7200
+ ]
7201
+ })
7202
+ ]
7203
+ }, notification.id)
7204
+ });
7205
+ }
7206
+
7207
+ // src/components/VoiceBarPlanCard.tsx
7208
+ import { useEffect as useEffect37, useState as useState25 } from "react";
7209
+ import { jsx as jsx30, jsxs as jsxs24 } from "react/jsx-runtime";
7210
+ var APPROVING_RESET_MS = 8000;
7211
+ function StepIndicator({ step }) {
7212
+ if (step.status === "done") {
7213
+ return /* @__PURE__ */ jsx30("span", {
7214
+ className: "skippr:flex skippr:size-[16px] skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-brand",
7215
+ children: /* @__PURE__ */ jsx30(Check, {
7216
+ className: "skippr:size-[10px] skippr:text-white",
7217
+ strokeWidth: 3
7218
+ })
7219
+ });
7220
+ }
7221
+ if (step.status === "failed") {
7222
+ return /* @__PURE__ */ jsx30("span", {
7223
+ className: "skippr:flex skippr:size-[16px] skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-[#dc2626]",
7224
+ children: /* @__PURE__ */ jsx30(X, {
7225
+ className: "skippr:size-[10px] skippr:text-white",
7226
+ strokeWidth: 3
7227
+ })
7228
+ });
7229
+ }
7230
+ return /* @__PURE__ */ jsx30("span", {
7231
+ className: cn("skippr:flex skippr:size-[16px] skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-[#f2f0eb] skippr:text-[9px] skippr:font-bold skippr:text-[#8b877f]", step.status === "active" && "skippr:bg-white skippr:text-brand skippr:shadow-[inset_0_0_0_1.5px_var(--skippr-brand,#2bc0ae)]"),
7232
+ children: step.index + 1
7233
+ });
7234
+ }
7235
+ function VoiceBarPlanCard({ plan, sendChatMessage, onDismiss }) {
7236
+ const awaitingApproval = plan.state === "proposed";
7237
+ const [isApproving, setIsApproving] = useState25(false);
7238
+ const [lastPlan, setLastPlan] = useState25(plan);
7239
+ if (plan !== lastPlan) {
7240
+ setLastPlan(plan);
7241
+ setIsApproving(false);
7242
+ }
7243
+ const approve = () => {
7244
+ setIsApproving(true);
7245
+ sendChatMessage(APPROVE_MESSAGE).catch((e) => {
7246
+ console.warn("[Skippr] plan reply failed", e);
7247
+ setIsApproving(false);
7248
+ });
7249
+ };
7250
+ const cancel = () => {
7251
+ sendChatMessage(CANCEL_MESSAGE).catch((e) => console.warn("[Skippr] plan reply failed", e));
7252
+ };
7253
+ useEffect37(() => {
7254
+ if (!isApproving)
7255
+ return;
7256
+ const timer = setTimeout(() => setIsApproving(false), APPROVING_RESET_MS);
7257
+ return () => clearTimeout(timer);
7258
+ }, [isApproving]);
7259
+ useEffect37(() => {
7260
+ if (plan.state !== "completed")
7261
+ return;
7262
+ const timer = setTimeout(onDismiss, COMPLETED_CARD_VISIBLE_MS);
7263
+ return () => clearTimeout(timer);
7264
+ }, [plan.state, onDismiss]);
7265
+ return /* @__PURE__ */ jsxs24("div", {
7266
+ className: "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)]",
7267
+ children: [
7268
+ /* @__PURE__ */ jsxs24("div", {
7269
+ 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]",
7270
+ children: [
7271
+ /* @__PURE__ */ jsx30("span", {
7272
+ className: "skippr:text-[11px] skippr:font-semibold skippr:tracking-[-0.01em] skippr:text-[#2D2D3F]",
7273
+ children: "Plan"
7274
+ }),
7275
+ /* @__PURE__ */ jsx30("button", {
7276
+ type: "button",
7277
+ onClick: onDismiss,
7278
+ "aria-label": "Dismiss plan",
7279
+ className: "skippr:flex skippr:size-[20px] skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:text-[#b8b4ac] skippr:transition-colors skippr:hover:bg-[#f2f0eb] skippr:hover:text-[#2D2D3F]",
7280
+ children: /* @__PURE__ */ jsx30(X, {
7281
+ className: "skippr:size-[12px]",
7282
+ strokeWidth: 2.5
7283
+ })
7284
+ })
7285
+ ]
7286
+ }),
7287
+ /* @__PURE__ */ jsxs24("div", {
7288
+ className: "skippr:px-[12px] skippr:pb-[10px] skippr:pt-[8px]",
7289
+ children: [
7290
+ /* @__PURE__ */ jsx30("p", {
7291
+ className: "skippr:text-[11.5px] skippr:font-semibold skippr:tracking-[-0.01em] skippr:text-[#2D2D3F]",
7292
+ children: "Here's my plan"
7293
+ }),
7294
+ awaitingApproval && /* @__PURE__ */ jsxs24("p", {
7295
+ className: "skippr:mt-[1px] skippr:text-[10px] skippr:text-[#8b877f]",
7296
+ children: [
7297
+ plan.steps.length,
7298
+ " steps · review and approve to run"
7299
+ ]
7300
+ }),
7301
+ /* @__PURE__ */ jsx30("div", {
7302
+ className: "skippr:mt-[8px] skippr:max-h-[132px] skippr:space-y-[6px] skippr:overflow-y-auto skippr:overscroll-contain",
7303
+ children: plan.steps.map((step) => /* @__PURE__ */ jsxs24("div", {
7304
+ className: "skippr:flex skippr:items-center skippr:gap-[7px]",
7305
+ children: [
7306
+ /* @__PURE__ */ jsx30(StepIndicator, {
7307
+ step
7308
+ }),
7309
+ /* @__PURE__ */ jsx30("p", {
7310
+ className: cn("skippr:min-w-0 skippr:text-[11px] skippr:leading-snug skippr:text-[#2D2D3F]", step.status === "pending" && "skippr:text-[#8b877f]", step.status === "failed" && "skippr:text-[#dc2626]"),
7311
+ children: step.label
7312
+ })
7313
+ ]
7314
+ }, step.index))
7315
+ }),
7316
+ /* @__PURE__ */ jsx30("div", {
7317
+ className: "skippr:mt-[9px]",
7318
+ children: awaitingApproval ? /* @__PURE__ */ jsxs24("div", {
7319
+ className: "skippr:flex skippr:gap-[8px]",
7320
+ children: [
7321
+ /* @__PURE__ */ jsxs24("button", {
7322
+ type: "button",
7323
+ disabled: isApproving,
7324
+ onClick: approve,
7325
+ className: "skippr:flex skippr:flex-1 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:gap-[6px] skippr:rounded-full skippr:bg-[#2D2D3F] skippr:px-[10px] skippr:py-[6px] skippr:text-[11px] skippr:font-semibold skippr:text-white skippr:transition-colors skippr:hover:bg-[#3d3d52] skippr:disabled:cursor-default skippr:disabled:opacity-80 skippr:disabled:hover:bg-[#2D2D3F]",
7326
+ children: [
7327
+ isApproving && /* @__PURE__ */ jsx30("span", {
7328
+ className: "skippr:size-[10px] skippr:shrink-0 skippr:animate-spin skippr:rounded-full skippr:border-2 skippr:border-white/30 skippr:border-t-white"
7329
+ }),
7330
+ isApproving ? "approving…" : "approve plan"
7331
+ ]
7332
+ }),
7333
+ /* @__PURE__ */ jsx30("button", {
7334
+ type: "button",
7335
+ disabled: isApproving,
7336
+ onClick: cancel,
7337
+ className: "skippr:cursor-pointer skippr:rounded-full skippr:border skippr:border-[rgba(45,45,63,0.12)] skippr:bg-white skippr:px-[10px] skippr:py-[6px] skippr:text-[11px] skippr:font-semibold skippr:text-[#2D2D3F] skippr:transition-colors skippr:hover:bg-[#f2f0eb] skippr:disabled:cursor-default skippr:disabled:opacity-50 skippr:disabled:hover:bg-white",
7338
+ children: "cancel"
7339
+ })
7340
+ ]
7341
+ }) : /* @__PURE__ */ jsxs24("span", {
7342
+ 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 skippr:text-white",
7343
+ children: [
7344
+ /* @__PURE__ */ jsx30(Check, {
7345
+ className: "skippr:size-[11px]",
7346
+ strokeWidth: 3
7347
+ }),
7348
+ "approved"
7349
+ ]
7350
+ })
7351
+ })
7352
+ ]
7353
+ })
7354
+ ]
7355
+ });
7356
+ }
7357
+
7358
+ // src/components/VoiceBarFrame.tsx
7359
+ import { jsx as jsx31, jsxs as jsxs25, Fragment as Fragment5 } from "react/jsx-runtime";
7360
+ var AUTO_OFF_MOTES = [
7361
+ { left: "13%", delay: "0s", size: 4 },
7362
+ { left: "27%", delay: "0.4s", size: 3 },
7363
+ { left: "41%", delay: "0.75s", size: 5 },
7364
+ { left: "54%", delay: "0.2s", size: 3 },
7365
+ { left: "67%", delay: "0.95s", size: 4 },
7366
+ { left: "79%", delay: "0.55s", size: 3 },
7367
+ { left: "90%", delay: "1.2s", size: 4 }
7368
+ ];
7369
+ var EDGE_BUTTON = "skippr:flex skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-transparent skippr:text-[#b8b4ac] skippr:cursor-pointer skippr:transition-colors skippr:hover:bg-[#f2f0eb] skippr:hover:text-[#2D2D3F]";
7370
+ 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";
7371
+ function LoadingAvatar({ logoUrl }) {
7372
+ return /* @__PURE__ */ jsxs25("span", {
7373
+ className: "skippr:relative skippr:size-[22px] skippr:shrink-0",
7374
+ children: [
7375
+ /* @__PURE__ */ jsx31("span", {
7376
+ className: "skippr:absolute skippr:-inset-[3px] skippr:rounded-full skippr:border-2 skippr:border-[var(--skippr-brand-ring)] skippr:border-t-brand skippr:animate-spin"
7377
+ }),
7378
+ /* @__PURE__ */ jsx31("span", {
7379
+ className: "skippr:absolute skippr:inset-0 skippr:overflow-hidden skippr:rounded-full",
7380
+ children: logoUrl ? /* @__PURE__ */ jsx31("img", {
7381
+ src: logoUrl,
7382
+ alt: "",
7383
+ className: "skippr:block skippr:size-full skippr:object-cover"
7384
+ }) : /* @__PURE__ */ jsx31("span", {
7385
+ className: "skippr:block skippr:size-full skippr:bg-launcher"
7386
+ })
7387
+ })
7388
+ ]
7389
+ });
7390
+ }
7391
+ function BusyRing({ tone }) {
7392
+ return /* @__PURE__ */ jsx31("span", {
7393
+ className: cn("skippr:pointer-events-none skippr:absolute skippr:-inset-[3px] skippr:rounded-full skippr:border-2 skippr:animate-spin", tone === "white" ? "skippr:border-white/30 skippr:border-t-white" : "skippr:border-[var(--skippr-brand-ring)] skippr:border-t-brand")
7394
+ });
7395
+ }
7396
+ function AgentDots() {
7397
+ return /* @__PURE__ */ jsxs25("span", {
7398
+ className: "skippr:flex skippr:items-center skippr:gap-[4px]",
7399
+ children: [
7400
+ /* @__PURE__ */ jsx31("span", {
7401
+ className: "skippr:size-[4px] skippr:rounded-full skippr:bg-white skippr:[animation:skippr-breathe_1.1s_ease-in-out_0s_infinite]"
7402
+ }),
7403
+ /* @__PURE__ */ jsx31("span", {
7404
+ className: "skippr:size-[4px] skippr:rounded-full skippr:bg-white skippr:[animation:skippr-breathe_1.1s_ease-in-out_0.18s_infinite]"
7405
+ }),
7406
+ /* @__PURE__ */ jsx31("span", {
7407
+ className: "skippr:size-[4px] skippr:rounded-full skippr:bg-white skippr:[animation:skippr-breathe_1.1s_ease-in-out_0.36s_infinite]"
7408
+ })
7409
+ ]
7410
+ });
7411
+ }
7412
+ function SpeakingBars() {
7413
+ const { barRefs } = useMicLevel(true);
7414
+ return /* @__PURE__ */ jsx31("span", {
7415
+ className: "skippr:flex skippr:h-[22px] skippr:items-center skippr:gap-[3px]",
7416
+ children: Array.from({ length: MIC_BARS }).map((_, index2) => /* @__PURE__ */ jsx31("span", {
7417
+ ref: (el) => {
7418
+ barRefs.current[index2] = el;
7419
+ },
7420
+ className: "skippr:w-[2.5px] skippr:rounded-full skippr:bg-white skippr:transition-[height] skippr:duration-75",
7421
+ style: { height: 5 }
7422
+ }, index2))
7423
+ });
7424
+ }
7425
+ var MIC_HALO_IDLE_PX = 30;
7426
+ var MIC_HALO_GROWTH_PX = 12;
7427
+ var MIC_HALO_NOISE_GATE = 0.15;
7428
+ function MicLevelHalo({ enabled }) {
7429
+ const { microphoneTrack } = useLocalParticipant12();
7430
+ const { barRefs } = useAudioLevelBars(enabled ? microphoneTrack?.track?.mediaStreamTrack : undefined, {
7431
+ barCount: 1,
7432
+ idleHeightPx: MIC_HALO_IDLE_PX,
7433
+ maxGrowthPx: MIC_HALO_GROWTH_PX,
7434
+ noiseGate: MIC_HALO_NOISE_GATE
7435
+ });
7436
+ return /* @__PURE__ */ jsx31("span", {
7437
+ ref: (el) => {
7438
+ barRefs.current[0] = el;
7439
+ },
7440
+ style: { height: MIC_HALO_IDLE_PX },
7441
+ className: "skippr:absolute skippr:left-1/2 skippr:top-1/2 skippr:-translate-x-1/2 skippr:-translate-y-1/2 skippr:aspect-square skippr:rounded-full skippr:bg-white/40 skippr:transition-[height] skippr:duration-75"
7442
+ });
7443
+ }
7444
+ function ShortcutChip({ children }) {
7445
+ return /* @__PURE__ */ jsx31("span", {
7446
+ className: "skippr:rounded-[5px] skippr:border skippr:border-[rgba(45,45,63,0.1)] skippr:bg-[#f2f0eb] skippr:px-[5px] skippr:py-[1px] skippr:font-mono skippr:text-[10px] skippr:font-semibold skippr:text-[#6b6660]",
7447
+ children
7448
+ });
7449
+ }
7450
+ function ShortcutHint({
7451
+ enabled,
7452
+ seenRef,
7453
+ suppressed,
7454
+ children
7455
+ }) {
7456
+ const ref = useRef31(null);
7457
+ const [visible, setVisible] = useState26(false);
7458
+ useEffect38(() => {
7459
+ if (!enabled)
7460
+ return;
7461
+ const el = ref.current;
7462
+ if (!el)
7463
+ return;
7464
+ const enter = () => {
7465
+ if (!seenRef.current)
7466
+ setVisible(true);
7467
+ };
7468
+ const leave = () => {
7469
+ if (seenRef.current)
7470
+ return;
7471
+ seenRef.current = true;
7472
+ setVisible(false);
7473
+ };
7474
+ el.addEventListener("mouseenter", enter);
7475
+ el.addEventListener("mouseleave", leave);
7476
+ return () => {
7477
+ el.removeEventListener("mouseenter", enter);
7478
+ el.removeEventListener("mouseleave", leave);
7479
+ };
7480
+ }, [enabled, seenRef]);
7481
+ return /* @__PURE__ */ jsxs25("div", {
7482
+ ref,
7483
+ className: "skippr:relative skippr:flex skippr:min-w-[96px] skippr:flex-1",
7484
+ children: [
7485
+ enabled && visible && !suppressed && /* @__PURE__ */ jsxs25("div", {
7486
+ 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]",
7487
+ children: [
7488
+ /* @__PURE__ */ jsxs25("span", {
7489
+ className: "skippr:flex skippr:items-center skippr:gap-[3px]",
7490
+ children: [
7491
+ /* @__PURE__ */ jsx31(ShortcutChip, {
7492
+ children: "Ctrl"
7493
+ }),
7494
+ /* @__PURE__ */ jsx31("span", {
7495
+ className: "skippr:text-[9px] skippr:text-[#c9c5bd]",
7496
+ children: "+"
7497
+ }),
7498
+ /* @__PURE__ */ jsx31(ShortcutChip, {
7499
+ children: "Space"
7500
+ })
7501
+ ]
7502
+ }),
7503
+ /* @__PURE__ */ jsx31("span", {
7504
+ className: "skippr:text-[10.5px] skippr:font-medium skippr:text-[#8b877f]",
7505
+ children: "talk"
7506
+ }),
7507
+ /* @__PURE__ */ jsx31("span", {
7508
+ className: "skippr:text-[10px] skippr:text-[#cbc7bf]",
7509
+ children: "·"
7510
+ }),
7511
+ /* @__PURE__ */ jsxs25("span", {
7512
+ className: "skippr:flex skippr:items-center skippr:gap-[3px]",
7513
+ children: [
7514
+ /* @__PURE__ */ jsx31(ShortcutChip, {
7515
+ children: "Ctrl"
7516
+ }),
7517
+ /* @__PURE__ */ jsx31("span", {
7518
+ className: "skippr:text-[9px] skippr:text-[#c9c5bd]",
7519
+ children: "+"
7520
+ }),
7521
+ /* @__PURE__ */ jsx31(ShortcutChip, {
7522
+ children: "X"
7523
+ })
7524
+ ]
7525
+ }),
7526
+ /* @__PURE__ */ jsx31("span", {
7527
+ className: "skippr:text-[10.5px] skippr:font-medium skippr:text-[#8b877f]",
7528
+ children: "stop"
7529
+ }),
7530
+ /* @__PURE__ */ jsx31("span", {
7531
+ className: "skippr:absolute skippr:left-1/2 skippr:top-full skippr:size-[9px] skippr:-translate-x-1/2 skippr:-translate-y-[4px] skippr:rotate-45 skippr:border-b skippr:border-r skippr:border-[rgba(45,45,63,0.08)] skippr:bg-white"
7532
+ })
7533
+ ]
7534
+ }),
7535
+ children
7536
+ ]
7537
+ });
7538
+ }
7539
+ function VoiceBarFrame({
7540
+ dock,
7541
+ canFold,
7542
+ notifications,
7543
+ onDrop,
7544
+ setDragging
7545
+ }) {
7546
+ const ctx = useContext20(LiveAgentContext);
7547
+ if (!ctx) {
7548
+ throw new Error("VoiceBarFrame must be used within a <LiveAgent> provider");
7549
+ }
7550
+ const {
7551
+ isConnected,
7552
+ isStarting,
7553
+ isPausing,
7554
+ isDisconnecting,
7555
+ isAuthenticated,
7556
+ defaultAgentId,
7557
+ startDefaultSession,
7558
+ pauseSession,
7559
+ disconnect,
7560
+ minimizePanel,
7561
+ togglePanel,
7562
+ agentControls,
7563
+ appearance,
7564
+ isPanelOpen,
7565
+ panelRef,
7566
+ textMode,
7567
+ captureMode,
7568
+ chatActivityAt
7569
+ } = ctx;
7570
+ const [bannerOpen, setBannerOpen] = useState26(false);
7571
+ const hasNotifications = notifications.length > 0;
7572
+ const notifAccent = notifications[0]?.accentColor;
7573
+ const closeBanner = useCallback21(() => setBannerOpen(false), []);
7574
+ const containerRef = useRef31(null);
7575
+ const dragFollowers = isPanelOpen ? [panelRef] : null;
7576
+ const { wasDraggedRef } = useVoiceBarDrag(containerRef, onDrop, dragFollowers, setDragging);
7577
+ const { isMuted, toggleMute } = useMediaControls();
7578
+ const { localParticipant } = useLocalParticipant12();
7579
+ const isUserSpeaking = useIsSpeaking(localParticipant);
7580
+ const { state } = useAgentVoiceState();
7581
+ const { isCapturingSpeech, toggle: toggleTapToTalk, start, commit } = useVoiceTurnContext();
7582
+ const holdPushToTalk = usePointerHold(start, commit);
7583
+ const { isHeld, countdown: holdCountdown, toggle: togglePause } = useSessionHoldContext();
7584
+ const plan = usePlanUpdates();
7585
+ const { sendChatMessage } = useChatMessages();
7586
+ const [dismissedPlanId, setDismissedPlanId] = useState26(null);
7587
+ const micMode = agentControls?.micMode;
7588
+ const pushOrTap = isRequestResponseMicMode(micMode);
7589
+ const isPushToTalk = micMode === MIC_MODE.PushToTalk;
7590
+ const agentActive = state === "speaking" || state === "thinking";
7591
+ const { actionsActive } = useActionControl();
7592
+ const showActionControl = isConnected && captureMode === CAPTURE_MODE.Auto && actionsActive;
7593
+ const chatSurface = agentControls?.chat ?? DEFAULT_CHAT_SURFACE;
7594
+ const isRoomChat = chatSurface === CHAT_SURFACE.Room;
7595
+ const [chatLineOpen, setChatLineOpen] = useState26(false);
7596
+ const chatOpen = isRoomChat ? isPanelOpen : chatLineOpen;
7597
+ const toggleChat = () => {
7598
+ if (isRoomChat) {
7599
+ togglePanel();
7600
+ } else {
7601
+ setChatLineOpen((open) => !open);
7602
+ }
7603
+ };
7604
+ useKeyboardPushToTalk({
7605
+ enabled: isConnected && isPushToTalk,
7606
+ onStart: start,
7607
+ onCommit: commit,
7608
+ code: "Space",
7609
+ requireCtrl: true
7610
+ });
7611
+ const sessionLive = isConnected || isStarting || isPausing || isDisconnecting;
7612
+ const canStart = isAuthenticated && !!defaultAgentId;
7613
+ const showClose = canFold || sessionLive;
7614
+ const logoUrl = appearance?.logoUrl ?? null;
7615
+ const ifNotDragged = (action) => () => {
7616
+ if (wasDraggedRef.current)
7617
+ return;
7618
+ action();
7619
+ };
7620
+ const [pauseSource, setPauseSource] = useState26(null);
7621
+ const closeBar = (source) => {
7622
+ if (sessionLive) {
7623
+ setPauseSource(source);
7624
+ pauseSession();
7625
+ } else {
7626
+ minimizePanel();
7627
+ }
7628
+ };
7629
+ useKeyboardStop({ enabled: sessionLive, onStop: () => closeBar("stop") });
7630
+ const hintSeenRef = useRef31(false);
7631
+ const requestPillBg = isCapturingSpeech ? "var(--skippr-brand-active)" : "var(--skippr-brand, #2bc0ae)";
7632
+ const agentStateLabel = state === "thinking" ? "thinking…" : state === "speaking" ? "talking…" : null;
7633
+ const idleRequestLabel = isPushToTalk ? "push to talk" : "tap to talk";
7634
+ const requestLabel = agentStateLabel ?? (isCapturingSpeech ? "listening…" : idleRequestLabel);
7635
+ const livePillBg = agentActive && !isHeld ? "var(--skippr-brand-active)" : "var(--skippr-brand, #2bc0ae)";
7636
+ const glow = isConnected && !isHeld && agentActive;
7637
+ const [autoOffClosing, setAutoOffClosing] = useState26(false);
7638
+ const { reportActivity } = useIdleAutoOff({
7639
+ enabled: isConnected && !autoOffClosing,
7640
+ active: agentActive || isCapturingSpeech || isUserSpeaking,
7641
+ onExpire: () => setAutoOffClosing(true)
7642
+ });
7643
+ useEffect38(() => {
7644
+ if (chatActivityAt)
7645
+ reportActivity();
7646
+ }, [chatActivityAt, reportActivity]);
7647
+ useEffect38(() => {
7648
+ if (!autoOffClosing)
7649
+ return;
7650
+ if (!isConnected) {
7651
+ setAutoOffClosing(false);
7652
+ return;
7653
+ }
7654
+ const timer = setTimeout(() => void disconnect(), AUTO_OFF_NOTICE_MS);
7655
+ return () => clearTimeout(timer);
7656
+ }, [autoOffClosing, isConnected, disconnect]);
7657
+ const sessionTimer = useSessionTimer(isConnected && !isHeld, isConnected);
7658
+ const visiblePlan = isPlanVisible(plan) && plan.planId !== dismissedPlanId ? plan : null;
7659
+ const planCardActive = !!visiblePlan && isConnected && captureMode === CAPTURE_MODE.Auto && !!agentControls?.actions && !(isRoomChat && chatOpen) && !isCapturingSpeech && !isHeld && !autoOffClosing;
7660
+ const planAboveChatLine = planCardActive && !isRoomChat && chatLineOpen;
7661
+ const bannerActive = hasNotifications && bannerOpen;
7662
+ const slotClaimed = chatOpen || bannerActive;
7663
+ const autoBase = !isStarting && isConnected && !textMode && !pushOrTap && !autoOffClosing;
7664
+ const showHeldStrip = !slotClaimed && autoBase && isHeld;
7665
+ const showLiveStrip = !slotClaimed && autoBase && !isHeld && !planCardActive && (state === "thinking" || showActionControl);
7666
+ const showTimerStrip = !slotClaimed && !autoOffClosing && !isCapturingSpeech && !planCardActive && !showLiveStrip && !showHeldStrip && !!sessionTimer;
7667
+ const showAutoOffStrip = !slotClaimed && autoOffClosing;
7668
+ const hintSuppressed = slotClaimed || isCapturingSpeech || planCardActive || showLiveStrip || showHeldStrip || showTimerStrip || showAutoOffStrip;
7669
+ const liveStripLabel = showActionControl ? "working…" : "thinking…";
7670
+ const heldMinutes = Math.floor(holdCountdown / 60);
7671
+ const heldSeconds = String(holdCountdown % 60).padStart(2, "0");
7672
+ const stripStyle = {
7673
+ position: "absolute",
7674
+ left: 0,
7675
+ right: 0,
7676
+ display: "flex",
7677
+ justifyContent: "center",
7678
+ ...dock.edge === "top" ? { top: "calc(100% + 10px)" } : { bottom: "calc(100% + 10px)" }
7679
+ };
7680
+ const planCardOffset = planAboveChatLine ? "calc(100% + 64px)" : "calc(100% + 10px)";
7681
+ const planCardStyle = {
7682
+ ...stripStyle,
7683
+ ...dock.edge === "top" ? { top: planCardOffset } : { bottom: planCardOffset }
7684
+ };
7685
+ const pillEvaporate = autoOffClosing ? "skippr:[animation:skippr-evaporate_3.2s_ease-in_forwards] skippr:motion-reduce:animate-none" : "";
7686
+ return /* @__PURE__ */ jsxs25("div", {
7687
+ ref: containerRef,
7688
+ style: dockStyle(dock),
7689
+ className: "skippr:fixed skippr:z-[9999] skippr:flex skippr:w-[255px] skippr:touch-none skippr:cursor-grab skippr:items-center",
7690
+ children: [
7691
+ glow && /* @__PURE__ */ jsx31("span", {
7692
+ "aria-hidden": true,
7693
+ className: "skippr:pointer-events-none skippr:absolute skippr:-left-[6px] skippr:-right-[6px] skippr:-top-[13px] skippr:h-[24px] skippr:rounded-full skippr:animate-skippr-flow skippr:motion-reduce:animate-none",
7694
+ style: {
7695
+ filter: "blur(13px)",
7696
+ opacity: 0.9,
7697
+ background: "var(--skippr-brand-glow)",
7698
+ backgroundSize: "300% 100%"
7699
+ }
7700
+ }),
7701
+ /* @__PURE__ */ jsx31("span", {
7702
+ className: cn("skippr:pointer-events-none skippr:absolute skippr:inset-0 skippr:rounded-full skippr:border skippr:border-[rgba(45,45,63,0.08)] skippr:bg-white skippr:transition-shadow", glow ? "skippr:shadow-[0_10px_30px_rgba(45,45,63,0.14),0_0_0_1.5px_var(--skippr-brand-ring)]" : "skippr:shadow-[0_8px_30px_rgba(45,45,63,0.14),0_2px_6px_rgba(45,45,63,0.06)]", pillEvaporate)
7703
+ }),
7704
+ autoOffClosing && /* @__PURE__ */ jsx31("span", {
7705
+ "aria-hidden": true,
7706
+ className: "skippr:pointer-events-none skippr:absolute skippr:inset-0 skippr:z-[4] skippr:overflow-visible",
7707
+ children: AUTO_OFF_MOTES.map((mote) => /* @__PURE__ */ jsx31("span", {
7708
+ className: "skippr:absolute skippr:top-1/2 skippr:rounded-full skippr:bg-brand skippr:[animation:skippr-mote-rise_1.6s_ease-out_infinite] skippr:motion-reduce:animate-none",
7709
+ style: {
7710
+ left: mote.left,
7711
+ width: mote.size,
7712
+ height: mote.size,
7713
+ animationDelay: mote.delay
7714
+ }
7715
+ }, mote.left))
7716
+ }),
7717
+ showLiveStrip && /* @__PURE__ */ jsx31("div", {
7718
+ style: stripStyle,
7719
+ className: "skippr:pointer-events-none skippr:z-[5]",
7720
+ children: /* @__PURE__ */ jsxs25("div", {
7721
+ 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]",
7722
+ children: [
7723
+ /* @__PURE__ */ jsx31("span", {
7724
+ style: { background: livePillBg },
7725
+ className: "skippr:size-[7px] skippr:shrink-0 skippr:rounded-full skippr:[animation:skippr-breathe_1.1s_ease-in-out_0s_infinite]"
7726
+ }),
7727
+ /* @__PURE__ */ jsx31("span", {
7728
+ className: "skippr:whitespace-nowrap skippr:text-[12px] skippr:font-semibold skippr:tracking-[-0.01em] skippr:text-[#5a5650]",
7729
+ children: liveStripLabel
7730
+ })
7731
+ ]
7732
+ })
7733
+ }),
7734
+ showHeldStrip && /* @__PURE__ */ jsx31("div", {
7735
+ style: stripStyle,
7736
+ className: "skippr:pointer-events-none skippr:z-[5]",
7737
+ children: /* @__PURE__ */ jsxs25("div", {
7738
+ role: "timer",
7739
+ "aria-label": `Agent closes in ${holdCountdown} seconds`,
7740
+ 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]",
7741
+ children: [
7742
+ /* @__PURE__ */ jsx31("span", {
7743
+ className: "skippr:size-[7px] skippr:shrink-0 skippr:rounded-full skippr:bg-[#b9b4ab]"
7744
+ }),
7745
+ /* @__PURE__ */ jsxs25("span", {
7746
+ className: "skippr:whitespace-nowrap skippr:text-[12px] skippr:font-semibold skippr:tracking-[-0.01em] skippr:text-[#5a5650]",
7747
+ children: [
7748
+ "Agent closes in",
7749
+ /* @__PURE__ */ jsxs25("span", {
7750
+ className: "skippr:ml-1 skippr:tabular-nums",
7751
+ children: [
7752
+ heldMinutes,
7753
+ ":",
7754
+ heldSeconds
7755
+ ]
7756
+ })
7757
+ ]
7758
+ })
7759
+ ]
7760
+ })
7761
+ }),
7762
+ showTimerStrip && sessionTimer && /* @__PURE__ */ jsx31("div", {
7763
+ style: stripStyle,
7764
+ className: "skippr:pointer-events-none skippr:z-[5]",
7765
+ children: /* @__PURE__ */ jsxs25("div", {
7766
+ 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]",
7767
+ children: [
7768
+ /* @__PURE__ */ jsx31("span", {
7769
+ style: { background: sessionTimer.warning ? "#f59e0b" : "#b9b4ab" },
7770
+ className: "skippr:size-[7px] skippr:shrink-0 skippr:rounded-full"
7771
+ }),
7772
+ /* @__PURE__ */ jsx31("span", {
7773
+ className: cn("skippr:whitespace-nowrap skippr:text-[12px] skippr:font-semibold skippr:tracking-[-0.01em]", sessionTimer.warning ? "skippr:text-[#b45309]" : "skippr:text-[#5a5650]"),
7774
+ children: sessionTimer.label
7775
+ })
7776
+ ]
7777
+ })
7778
+ }),
7779
+ showAutoOffStrip && /* @__PURE__ */ jsx31("div", {
7780
+ role: "status",
7781
+ style: stripStyle,
7782
+ className: "skippr:pointer-events-none skippr:z-[6]",
7783
+ children: /* @__PURE__ */ jsxs25("div", {
7784
+ 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]",
7785
+ children: [
7786
+ /* @__PURE__ */ jsx31("span", {
7787
+ className: "skippr:size-[7px] skippr:shrink-0 skippr:rounded-full skippr:bg-[#b9b4ab] skippr:[animation:skippr-breathe_1.1s_ease-in-out_0s_infinite]"
7788
+ }),
7789
+ /* @__PURE__ */ jsx31("span", {
7790
+ className: "skippr:whitespace-nowrap skippr:text-[12px] skippr:font-semibold skippr:tracking-[-0.01em] skippr:text-[#5a5650]",
7791
+ children: "No activity — closing…"
7792
+ })
7793
+ ]
7794
+ })
7795
+ }),
7796
+ planCardActive && visiblePlan && /* @__PURE__ */ jsx31("div", {
7797
+ style: planCardStyle,
7798
+ className: "skippr:z-[6]",
7799
+ "data-skippr-no-drag": "",
7800
+ children: /* @__PURE__ */ jsx31(VoiceBarPlanCard, {
7801
+ plan: visiblePlan,
7802
+ sendChatMessage,
7803
+ onDismiss: () => setDismissedPlanId(visiblePlan.planId)
7804
+ }, visiblePlan.planId)
7805
+ }),
7806
+ hasNotifications && !bannerOpen && !chatOpen && !isCapturingSpeech && !planCardActive && /* @__PURE__ */ jsx31("button", {
7807
+ type: "button",
7808
+ onClick: ifNotDragged(() => setBannerOpen(true)),
7809
+ "aria-label": "Show notifications",
7810
+ style: {
7811
+ background: notifAccent,
7812
+ "--skippr-pulse-color": notifAccent
7813
+ },
7814
+ className: "skippr:absolute skippr:-top-[3px] skippr:right-[4px] skippr:z-[7] skippr:size-[13px] skippr:cursor-pointer skippr:rounded-full skippr:border-[2.5px] skippr:border-white skippr:animate-skippr-voice-pulse skippr:motion-reduce:animate-none"
7815
+ }),
7816
+ bannerActive && !chatOpen && !isCapturingSpeech && !planCardActive && /* @__PURE__ */ jsx31(VoiceBarNotification, {
7817
+ notifications,
7818
+ dock,
7819
+ onDismiss: closeBanner
7820
+ }),
7821
+ /* @__PURE__ */ jsxs25("div", {
7822
+ 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),
7823
+ children: [
7824
+ showClose && /* @__PURE__ */ jsxs25("button", {
7825
+ type: "button",
7826
+ onClick: ifNotDragged(() => closeBar("close")),
7827
+ disabled: isPausing || isStarting,
7828
+ "aria-label": sessionLive ? "End session" : "Close",
7829
+ className: cn(EDGE_BUTTON, "skippr:relative skippr:size-[26px]", isStarting && "skippr:cursor-not-allowed skippr:opacity-40 skippr:hover:bg-transparent skippr:hover:text-[#b8b4ac]"),
7830
+ children: [
7831
+ isPausing && pauseSource === "close" && /* @__PURE__ */ jsx31(BusyRing, {
7832
+ tone: "brand"
7833
+ }),
7834
+ /* @__PURE__ */ jsx31(X, {
7835
+ className: "skippr:size-[14px]",
7836
+ strokeWidth: 2
7837
+ })
7838
+ ]
7839
+ }),
7840
+ isStarting && /* @__PURE__ */ jsxs25("div", {
7841
+ className: cn(PILL, "skippr:bg-[#F1EFEA] skippr:overflow-hidden skippr:[animation:skippr-fade-in_0.25s_ease]"),
7842
+ children: [
7843
+ /* @__PURE__ */ jsx31(LoadingAvatar, {
7844
+ logoUrl
7845
+ }),
7846
+ /* @__PURE__ */ jsx31("span", {
7847
+ className: "skippr:whitespace-nowrap skippr:text-[12.5px] skippr:font-semibold skippr:text-[#5a5650]",
7848
+ children: "Agent is loading"
7849
+ }),
7850
+ /* @__PURE__ */ jsxs25("span", {
7851
+ className: "skippr:flex skippr:items-end skippr:gap-[3px]",
7852
+ children: [
7853
+ /* @__PURE__ */ jsx31("span", {
7854
+ className: "skippr:size-[3px] skippr:rounded-full skippr:bg-brand skippr:[animation:skippr-breathe_1.1s_ease-in-out_0s_infinite]"
7855
+ }),
7856
+ /* @__PURE__ */ jsx31("span", {
7857
+ className: "skippr:size-[3px] skippr:rounded-full skippr:bg-brand skippr:[animation:skippr-breathe_1.1s_ease-in-out_0.18s_infinite]"
7858
+ }),
7859
+ /* @__PURE__ */ jsx31("span", {
7860
+ className: "skippr:size-[3px] skippr:rounded-full skippr:bg-brand skippr:[animation:skippr-breathe_1.1s_ease-in-out_0.36s_infinite]"
7861
+ })
7862
+ ]
7863
+ })
7864
+ ]
7865
+ }),
7866
+ !isStarting && isConnected && !textMode && pushOrTap && /* @__PURE__ */ jsx31(ShortcutHint, {
7867
+ enabled: isPushToTalk,
7868
+ seenRef: hintSeenRef,
7869
+ suppressed: hintSuppressed,
7870
+ children: /* @__PURE__ */ jsxs25("button", {
7871
+ type: "button",
7872
+ "data-skippr-no-drag": "",
7873
+ style: {
7874
+ background: requestPillBg,
7875
+ "--skippr-pulse-color": "var(--skippr-brand-halo)"
7876
+ },
7877
+ onPointerDown: (event) => {
7878
+ if (isPushToTalk)
7879
+ holdPushToTalk(event);
7880
+ },
7881
+ onClick: () => {
7882
+ if (!isPushToTalk)
7883
+ toggleTapToTalk();
7884
+ },
7885
+ "aria-label": requestLabel,
7886
+ className: cn(PILL, "skippr:cursor-pointer skippr:transition-[filter] skippr:hover:brightness-[1.04] skippr:active:scale-[0.98]", isCapturingSpeech && "skippr:animate-skippr-ptt-transmit skippr:motion-reduce:animate-none"),
7887
+ children: [
7888
+ agentActive ? /* @__PURE__ */ jsx31(AgentDots, {}) : isCapturingSpeech ? /* @__PURE__ */ jsx31(SpeakingBars, {}) : /* @__PURE__ */ jsx31(AudioLines, {
7889
+ className: "skippr:size-[17px]",
7890
+ strokeWidth: 2
7891
+ }),
7892
+ requestLabel
7893
+ ]
7894
+ })
7895
+ }),
7896
+ !isStarting && isConnected && !textMode && !pushOrTap && /* @__PURE__ */ jsxs25("div", {
7897
+ style: { background: livePillBg },
7898
+ className: cn(PILL, "skippr:gap-[9px] skippr:px-[8px]"),
7899
+ children: [
7900
+ /* @__PURE__ */ jsx31("button", {
7901
+ type: "button",
7902
+ onClick: ifNotDragged(togglePause),
7903
+ "aria-label": isHeld ? "Resume" : "Pause",
7904
+ className: "skippr:flex skippr:size-[26px] skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-transparent skippr:text-white skippr:cursor-pointer skippr:transition-colors skippr:hover:bg-white/20",
7905
+ children: isHeld ? /* @__PURE__ */ jsx31(Play, {
7906
+ className: "skippr:size-[13px]",
7907
+ fill: "currentColor",
7908
+ strokeWidth: 0
7909
+ }) : /* @__PURE__ */ jsx31(Pause, {
7910
+ className: "skippr:size-[13px]",
7911
+ fill: "currentColor",
7912
+ strokeWidth: 0
7913
+ })
7914
+ }),
7915
+ !isHeld && /* @__PURE__ */ jsxs25(Fragment5, {
7916
+ children: [
7917
+ /* @__PURE__ */ jsxs25("span", {
7918
+ className: "skippr:relative skippr:flex skippr:shrink-0 skippr:items-center skippr:justify-center",
7919
+ children: [
7920
+ /* @__PURE__ */ jsx31(MicLevelHalo, {
7921
+ enabled: !isMuted
7922
+ }),
7923
+ /* @__PURE__ */ jsx31("button", {
7924
+ type: "button",
7925
+ onClick: ifNotDragged(() => void toggleMute()),
7926
+ style: { background: "#fff", color: "var(--skippr-brand-deep)" },
7927
+ "aria-label": isMuted ? "Unmute" : "Mute",
7928
+ className: "skippr:relative skippr:flex skippr:size-[30px] skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-full skippr:cursor-pointer skippr:transition-[filter] skippr:hover:brightness-[1.06]",
7929
+ children: isMuted ? /* @__PURE__ */ jsx31(MicOff, {
7930
+ className: "skippr:size-[15px]",
7931
+ strokeWidth: 2
7932
+ }) : /* @__PURE__ */ jsx31(Mic, {
7933
+ className: "skippr:size-[15px]",
7934
+ strokeWidth: 2
7935
+ })
7936
+ })
7937
+ ]
7938
+ }),
7939
+ /* @__PURE__ */ jsxs25("button", {
7940
+ type: "button",
7941
+ onClick: ifNotDragged(() => closeBar("stop")),
7942
+ disabled: isPausing,
7943
+ "aria-label": "End session",
7944
+ className: "skippr:relative skippr:flex skippr:size-[26px] skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-transparent skippr:text-white skippr:cursor-pointer skippr:transition-colors skippr:hover:bg-white/20 skippr:disabled:cursor-not-allowed",
7945
+ children: [
7946
+ isPausing && pauseSource === "stop" && /* @__PURE__ */ jsx31(BusyRing, {
7947
+ tone: "white"
7948
+ }),
7949
+ /* @__PURE__ */ jsx31(Square, {
7950
+ className: "skippr:size-[11px]",
7951
+ fill: "currentColor",
7952
+ strokeWidth: 0
7953
+ })
7954
+ ]
7955
+ })
7956
+ ]
7957
+ })
7958
+ ]
7959
+ }),
7960
+ !isStarting && isConnected && textMode && /* @__PURE__ */ jsxs25("div", {
7961
+ className: cn(PILL, "skippr:gap-[7px] skippr:bg-[#F1EFEA] skippr:text-[#5a5650] skippr:[animation:skippr-fade-in_0.25s_ease]"),
7962
+ children: [
7963
+ /* @__PURE__ */ jsx31(MessageSquare, {
7964
+ className: "skippr:size-[15px] skippr:text-[#8b877f]",
7965
+ strokeWidth: 2
7966
+ }),
7967
+ "Text mode"
7968
+ ]
7969
+ }),
7970
+ !sessionLive && /* @__PURE__ */ jsxs25("button", {
7971
+ type: "button",
7972
+ onClick: ifNotDragged(() => {
7973
+ if (canStart)
7974
+ startDefaultSession();
7975
+ }),
7976
+ disabled: !canStart,
7977
+ "aria-label": "Talk to Agent",
7978
+ className: cn(PILL, "skippr:cursor-pointer skippr:bg-brand skippr:px-[12px] skippr:transition-[filter] skippr:hover:brightness-[1.04] skippr:active:scale-[0.98] skippr:disabled:cursor-not-allowed skippr:disabled:opacity-60"),
7979
+ children: [
7980
+ /* @__PURE__ */ jsx31("span", {
7981
+ className: "skippr:size-[22px] skippr:shrink-0 skippr:overflow-hidden skippr:rounded-full skippr:shadow-[0_0_0_1.5px_rgba(255,255,255,0.85)]",
7982
+ children: logoUrl ? /* @__PURE__ */ jsx31("img", {
7983
+ src: logoUrl,
7984
+ alt: "",
7985
+ className: "skippr:block skippr:size-full skippr:object-cover"
7986
+ }) : /* @__PURE__ */ jsx31("span", {
7987
+ className: "skippr:block skippr:size-full skippr:bg-launcher"
7988
+ })
7989
+ }),
7990
+ "Talk to Agent"
7991
+ ]
7992
+ }),
7993
+ (sessionLive || isRoomChat) && /* @__PURE__ */ jsx31("button", {
7994
+ type: "button",
7995
+ onClick: ifNotDragged(toggleChat),
7996
+ "aria-label": "Open chat",
7997
+ className: cn(EDGE_BUTTON, "skippr:size-[30px] skippr:text-[#8b877f]"),
7998
+ children: /* @__PURE__ */ jsx31(MessageSquare, {
7999
+ className: "skippr:size-[15px]",
8000
+ strokeWidth: 2
8001
+ })
8002
+ })
8003
+ ]
8004
+ }),
8005
+ !isRoomChat && chatLineOpen && /* @__PURE__ */ jsx31(VoiceBarChatLine, {
8006
+ dock,
8007
+ canSend: isConnected,
8008
+ onClose: () => setChatLineOpen(false)
8009
+ })
8010
+ ]
8011
+ });
8012
+ }
8013
+
8014
+ // src/components/VoiceBarLauncher.tsx
8015
+ import { useCallback as useCallback22, useEffect as useEffect40, useRef as useRef33, useState as useState28 } from "react";
8016
+
8017
+ // src/components/LauncherNotification.tsx
8018
+ import { useEffect as useEffect39, useRef as useRef32, useState as useState27 } from "react";
8019
+ import { jsx as jsx32, jsxs as jsxs26 } from "react/jsx-runtime";
8020
+ function LauncherNotification({
8021
+ notifications,
8022
+ dock,
8023
+ mode,
8024
+ onDismiss
8025
+ }) {
8026
+ const [index2, setIndex] = useState27(0);
8027
+ const [paused, setPaused] = useState27(false);
8028
+ const cardRef = useRef32(null);
8029
+ useEffect39(() => {
8030
+ const el = cardRef.current;
8031
+ if (!el)
8032
+ return;
8033
+ const enter = () => setPaused(true);
8034
+ const leave = () => setPaused(false);
8035
+ el.addEventListener("mouseenter", enter);
8036
+ el.addEventListener("mouseleave", leave);
8037
+ return () => {
8038
+ el.removeEventListener("mouseenter", enter);
8039
+ el.removeEventListener("mouseleave", leave);
8040
+ };
8041
+ }, []);
8042
+ useEffect39(() => {
8043
+ if (paused)
8044
+ return;
8045
+ const rotate = setInterval(() => setIndex((current) => (current + 1) % notifications.length), TIP_ROTATE_MS);
8046
+ const hide = setTimeout(onDismiss, TIP_HIDE_MS);
8047
+ return () => {
8048
+ clearInterval(rotate);
8049
+ clearTimeout(hide);
8050
+ };
8051
+ }, [paused, notifications.length, onDismiss]);
8052
+ if (notifications.length === 0)
8053
+ return null;
8054
+ const safeIndex = Math.min(index2, notifications.length - 1);
8055
+ const notification = notifications[safeIndex];
8056
+ if (!notification)
8057
+ return null;
8058
+ const hasMultiple = notifications.length > 1;
8059
+ const verticalAnchor = mode === LAUNCHER_MODE.Strip ? dock.edge === "bottom" ? { bottom: 10 } : { top: 10 } : dock.edge === "bottom" ? { top: 0 } : { bottom: 0 };
8060
+ const wrapperStyle = isHorizontalEdge(dock.edge) ? {
8061
+ position: "absolute",
8062
+ zIndex: 6,
8063
+ ...verticalAnchor,
8064
+ right: "calc(100% + 8px)"
8065
+ } : {
8066
+ position: "absolute",
8067
+ zIndex: 6,
8068
+ ...dock.edge === "left" ? { left: 0 } : { right: 0 },
8069
+ bottom: "calc(100% + 8px)"
8070
+ };
8071
+ return /* @__PURE__ */ jsx32("div", {
8072
+ style: wrapperStyle,
8073
+ "data-skippr-no-drag": "",
8074
+ children: /* @__PURE__ */ jsxs26("div", {
8075
+ ref: cardRef,
8076
+ 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)]",
8077
+ children: [
8078
+ /* @__PURE__ */ jsx32("span", {
8079
+ className: "skippr:flex skippr:min-h-[16px] skippr:min-w-0 skippr:flex-1 skippr:items-center skippr:text-[9px] skippr:font-medium skippr:leading-[1.25] skippr:text-[#5a5650]",
8080
+ children: /* @__PURE__ */ jsx32("span", {
8081
+ className: "skippr:line-clamp-2",
8082
+ children: notification.message
8083
+ })
8084
+ }),
8085
+ /* @__PURE__ */ jsx32("button", {
8086
+ type: "button",
8087
+ onClick: () => {
8088
+ notification.activate();
8089
+ onDismiss();
8090
+ },
8091
+ "aria-label": "Start",
8092
+ title: "Start",
8093
+ className: "skippr:flex skippr:size-[17px] skippr:shrink-0 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-[#2D2D3F] skippr:text-white skippr:transition-colors skippr:hover:bg-[#3d3d52]",
8094
+ children: /* @__PURE__ */ jsx32(Play, {
8095
+ className: "skippr:size-[8px] skippr:fill-current",
8096
+ strokeWidth: 2
8097
+ })
8098
+ }),
8099
+ hasMultiple && /* @__PURE__ */ jsx32("button", {
8100
+ type: "button",
8101
+ onClick: () => setIndex((current) => (current + 1) % notifications.length),
8102
+ "aria-label": "Next",
8103
+ title: "Next",
8104
+ className: "skippr:-ml-[2px] skippr:flex skippr:size-[16px] skippr:shrink-0 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:text-[#8b877f] skippr:transition-colors skippr:hover:bg-[#f2f0eb] skippr:hover:text-[#5a5650]",
8105
+ children: /* @__PURE__ */ jsx32(ChevronRight, {
8106
+ className: "skippr:size-[12px]",
8107
+ strokeWidth: 2.5
8108
+ })
8109
+ })
8110
+ ]
8111
+ }, notification.id)
8112
+ });
8113
+ }
8114
+
8115
+ // src/components/VoiceBarLauncher.tsx
8116
+ import { jsx as jsx33, jsxs as jsxs27, Fragment as Fragment6 } from "react/jsx-runtime";
8117
+ function SkipprMark2() {
8118
+ return /* @__PURE__ */ jsx33("svg", {
8119
+ viewBox: "0 0 15.4044 18.4853",
8120
+ className: "skippr:h-[18px] skippr:w-[15px]",
8121
+ fill: "none",
8122
+ "aria-hidden": "true",
8123
+ children: /* @__PURE__ */ jsx33("path", {
8124
+ d: "M2.25789 0.295419C1.33925 -0.413932 0 0.234459 0 1.38715V17.0972C0 18.4106 1.67407 18.987 2.49664 17.9562L6.40435 13.061C6.54853 12.8805 6.73209 12.7348 6.94126 12.6347C7.15043 12.5345 7.37978 12.4826 7.6121 12.4828H14.0025C15.3343 12.4828 15.9134 10.8128 14.8614 10.0037L2.25789 0.295419Z",
8125
+ className: "skippr:fill-white"
8126
+ })
8127
+ });
8128
+ }
8129
+ var VIEWPORT_ROUNDING = {
8130
+ right: "skippr:rounded-l-full",
8131
+ left: "skippr:rounded-r-full",
8132
+ top: "skippr:rounded-b-full",
8133
+ bottom: "skippr:rounded-t-full"
8134
+ };
8135
+ var AVATAR_SHADOW = {
8136
+ right: "skippr:shadow-[-4px_6px_18px_rgba(45,45,63,0.16)]",
8137
+ left: "skippr:shadow-[4px_6px_18px_rgba(45,45,63,0.16)]",
8138
+ top: "skippr:shadow-[0_6px_18px_rgba(45,45,63,0.16)]",
8139
+ bottom: "skippr:shadow-[0_-6px_18px_rgba(45,45,63,0.16)]"
8140
+ };
8141
+ var AVATAR_FLEX = {
8142
+ right: "skippr:flex-row-reverse",
8143
+ left: "skippr:flex-row",
8144
+ top: "skippr:flex-col",
8145
+ bottom: "skippr:flex-col-reverse"
8146
+ };
8147
+ var STRIP_ROUNDING = {
8148
+ right: "skippr:rounded-l-[6px]",
8149
+ left: "skippr:rounded-r-[6px]",
8150
+ top: "skippr:rounded-b-[6px]",
8151
+ bottom: "skippr:rounded-t-[6px]"
8152
+ };
8153
+ var STRIP_ROUNDING_EXPANDED = {
8154
+ right: "skippr:rounded-l-[18px]",
8155
+ left: "skippr:rounded-r-[18px]",
8156
+ top: "skippr:rounded-b-[18px]",
8157
+ bottom: "skippr:rounded-t-[18px]"
8158
+ };
8159
+ var STRIP_SHADOW = {
8160
+ right: "skippr:shadow-[-3px_0_14px_var(--skippr-brand-halo)]",
8161
+ left: "skippr:shadow-[3px_0_14px_var(--skippr-brand-halo)]",
8162
+ top: "skippr:shadow-[0_3px_14px_var(--skippr-brand-halo)]",
8163
+ bottom: "skippr:shadow-[0_-3px_14px_var(--skippr-brand-halo)]"
8164
+ };
8165
+ var STRIP_NOTIF_CAP = {
8166
+ right: "skippr:top-0 skippr:left-0 skippr:h-[14px] skippr:w-full",
8167
+ left: "skippr:top-0 skippr:left-0 skippr:h-[14px] skippr:w-full",
8168
+ top: "skippr:top-0 skippr:left-0 skippr:h-full skippr:w-[14px]",
8169
+ bottom: "skippr:top-0 skippr:left-0 skippr:h-full skippr:w-[14px]"
8170
+ };
8171
+ var STRIP_CAP_ROUNDING = {
8172
+ right: "skippr:rounded-tl-[6px]",
8173
+ left: "skippr:rounded-tr-[6px]",
8174
+ top: "skippr:rounded-bl-[6px]",
8175
+ bottom: "skippr:rounded-tl-[6px]"
8176
+ };
8177
+ var STRIP_DOT_POS = {
8178
+ right: "skippr:-top-[2px] skippr:-left-[2px]",
8179
+ left: "skippr:-top-[2px] skippr:-right-[2px]",
8180
+ top: "skippr:-left-[2px] skippr:-bottom-[2px]",
8181
+ bottom: "skippr:-left-[2px] skippr:-top-[2px]"
8182
+ };
8183
+ var AVATAR_DOT_REST_LEFT = {
8184
+ right: "-2px",
8185
+ left: "calc(100% - 11px)",
8186
+ top: "calc(100% - 11px)",
8187
+ bottom: "calc(100% - 11px)"
8188
+ };
8189
+ var AVATAR_DOT_CARD_LEFT = {
8190
+ right: "calc(100% - 13px)",
8191
+ left: "0px",
8192
+ top: "-2px",
8193
+ bottom: "-2px"
8194
+ };
8195
+ var STRIP_ICON_BUTTON = "skippr:flex skippr:size-[28px] skippr:shrink-0 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-transparent skippr:p-0 skippr:text-foreground skippr:transition-colors skippr:hover:bg-foreground/8 skippr:[animation:skippr-fade-in_0.2s_ease]";
8196
+ function LauncherChat({
8197
+ revealed,
8198
+ edge,
8199
+ onClick
8200
+ }) {
8201
+ const vertical = isHorizontalEdge(edge);
8202
+ return /* @__PURE__ */ jsxs27("div", {
8203
+ 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]),
8204
+ style: {
8205
+ width: vertical ? 46 : revealed ? 52 : 0,
8206
+ height: vertical ? revealed ? 52 : 0 : 46,
8207
+ opacity: revealed ? 1 : 0
8208
+ },
8209
+ children: [
8210
+ /* @__PURE__ */ jsx33("button", {
8211
+ type: "button",
8212
+ onClick,
8213
+ "aria-label": "Open chat",
8214
+ tabIndex: revealed ? 0 : -1,
8215
+ className: "skippr:flex skippr:size-[46px] skippr:shrink-0 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-transparent skippr:p-0 skippr:text-foreground skippr:transition-colors skippr:hover:bg-foreground/8",
8216
+ children: /* @__PURE__ */ jsx33(MessageSquare, {
8217
+ className: "skippr:size-[18px] skippr:shrink-0",
8218
+ strokeWidth: 2
8219
+ })
8220
+ }),
8221
+ /* @__PURE__ */ jsx33("span", {
8222
+ className: cn("skippr:shrink-0 skippr:bg-foreground/10", vertical ? "skippr:h-px skippr:w-[22px]" : "skippr:h-[22px] skippr:w-px")
8223
+ })
8224
+ ]
8225
+ });
8226
+ }
8227
+ function VoiceBarLauncher({
8228
+ dock,
8229
+ mode,
8230
+ logoUrl,
8231
+ notifications,
8232
+ onOpen,
8233
+ onChat,
8234
+ onDrop,
8235
+ setDragging
8236
+ }) {
8237
+ const containerRef = useRef33(null);
8238
+ const { wasDraggedRef } = useVoiceBarDrag(containerRef, onDrop, null, setDragging);
8239
+ const horizontal = isHorizontalEdge(dock.edge);
8240
+ const [cardOpen, setCardOpen] = useState28(false);
8241
+ const [hovered, setHovered] = useState28(false);
8242
+ const hasNotif = notifications.length > 0;
8243
+ const dotColor = notifications.find((item) => item.kind === NOTIFICATION_KIND.Module)?.accentColor ?? notifications[0]?.accentColor ?? NOTIF_ACCENT_COLOR;
8244
+ useEffect40(() => {
8245
+ const el = containerRef.current;
8246
+ if (!el)
8247
+ return;
8248
+ const enter = () => setHovered(true);
8249
+ const leave = () => setHovered(false);
8250
+ el.addEventListener("mouseenter", enter);
8251
+ el.addEventListener("mouseleave", leave);
8252
+ return () => {
8253
+ el.removeEventListener("mouseenter", enter);
8254
+ el.removeEventListener("mouseleave", leave);
8255
+ };
8256
+ }, []);
8257
+ const open = () => {
8258
+ if (wasDraggedRef.current)
8259
+ return;
8260
+ onOpen();
8261
+ };
8262
+ const openChat = (event) => {
8263
+ event.stopPropagation();
8264
+ if (wasDraggedRef.current)
8265
+ return;
8266
+ onChat?.();
8267
+ };
8268
+ const toggleCard = (event) => {
8269
+ event.stopPropagation();
8270
+ if (wasDraggedRef.current)
8271
+ return;
8272
+ setCardOpen((open2) => !open2);
8273
+ };
8274
+ const closeCard = useCallback22(() => setCardOpen(false), []);
8275
+ if (mode === "strip") {
8276
+ const expanded = hovered && !!onChat;
8277
+ const length = expanded ? 84 : 40;
8278
+ const thickness = expanded ? 36 : 10;
8279
+ return /* @__PURE__ */ jsxs27("div", {
8280
+ ref: containerRef,
8281
+ style: dockStyleFlush(dock),
8282
+ className: "skippr:fixed skippr:z-[9999] skippr:touch-none skippr:cursor-grab",
8283
+ children: [
8284
+ /* @__PURE__ */ jsx33("div", {
8285
+ style: horizontal ? { width: length, height: thickness } : { width: thickness, height: length },
8286
+ 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]),
8287
+ children: expanded ? /* @__PURE__ */ jsxs27(Fragment6, {
8288
+ children: [
8289
+ /* @__PURE__ */ jsx33("button", {
8290
+ type: "button",
8291
+ onClick: open,
8292
+ "aria-label": "Open Agent",
8293
+ className: STRIP_ICON_BUTTON,
8294
+ children: /* @__PURE__ */ jsx33(Play, {
8295
+ className: "skippr:size-[13px] skippr:fill-current",
8296
+ strokeWidth: 2
8297
+ })
8298
+ }),
8299
+ /* @__PURE__ */ jsx33("span", {
8300
+ className: cn("skippr:shrink-0 skippr:bg-foreground/10", horizontal ? "skippr:h-[16px] skippr:w-px" : "skippr:h-px skippr:w-[16px]")
8301
+ }),
8302
+ /* @__PURE__ */ jsx33("button", {
8303
+ type: "button",
8304
+ onClick: openChat,
8305
+ "aria-label": "Open chat",
8306
+ className: STRIP_ICON_BUTTON,
8307
+ children: /* @__PURE__ */ jsx33(MessageSquare, {
8308
+ className: "skippr:size-[14px]",
8309
+ strokeWidth: 2
8310
+ })
8311
+ })
8312
+ ]
8313
+ }) : /* @__PURE__ */ jsx33("button", {
8314
+ type: "button",
8315
+ onClick: open,
8316
+ "aria-label": "Open Agent",
8317
+ className: "skippr:absolute skippr:inset-0 skippr:cursor-grab skippr:bg-transparent skippr:p-0"
8318
+ })
8319
+ }),
8320
+ hasNotif && (expanded ? /* @__PURE__ */ jsx33("button", {
8321
+ type: "button",
8322
+ onClick: toggleCard,
8323
+ "aria-label": "Show notifications",
8324
+ style: {
8325
+ background: dotColor,
8326
+ "--skippr-pulse-color": dotColor
8327
+ },
8328
+ className: cn("skippr:absolute skippr:z-[2] skippr:size-[13px] skippr:cursor-pointer skippr:rounded-full skippr:border-[2.5px] skippr:border-white skippr:animate-skippr-voice-pulse skippr:motion-reduce:animate-none", STRIP_DOT_POS[dock.edge])
8329
+ }) : /* @__PURE__ */ jsx33("button", {
8330
+ type: "button",
8331
+ onClick: toggleCard,
8332
+ "aria-label": "Show notifications",
8333
+ style: {
8334
+ background: dotColor,
8335
+ "--skippr-pulse-color": dotColor
8336
+ },
8337
+ className: cn("skippr:absolute skippr:z-[1] skippr:cursor-pointer skippr:animate-skippr-voice-pulse skippr:motion-reduce:animate-none", STRIP_NOTIF_CAP[dock.edge], STRIP_CAP_ROUNDING[dock.edge])
8338
+ })),
8339
+ hasNotif && cardOpen && /* @__PURE__ */ jsx33(LauncherNotification, {
8340
+ notifications,
8341
+ dock,
8342
+ mode,
8343
+ onDismiss: closeCard
8344
+ })
8345
+ ]
8346
+ });
8347
+ }
8348
+ return /* @__PURE__ */ jsxs27("div", {
8349
+ ref: containerRef,
8350
+ style: dockStyleFlush(dock),
8351
+ className: "skippr:fixed skippr:z-[9999] skippr:touch-none skippr:cursor-grab",
8352
+ children: [
8353
+ /* @__PURE__ */ jsxs27("div", {
8354
+ style: { gap: onChat && hovered ? 2 : 0 },
8355
+ 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]),
8356
+ children: [
8357
+ onChat && /* @__PURE__ */ jsx33(LauncherChat, {
8358
+ revealed: hovered,
8359
+ edge: dock.edge,
8360
+ onClick: openChat
8361
+ }),
8362
+ /* @__PURE__ */ jsx33("button", {
8363
+ type: "button",
8364
+ onClick: open,
8365
+ "aria-label": "Open Agent",
8366
+ className: "skippr:block skippr:shrink-0 skippr:cursor-grab skippr:rounded-full skippr:bg-transparent skippr:p-0 skippr:transition-transform skippr:duration-200 skippr:hover:scale-105",
8367
+ children: logoUrl ? /* @__PURE__ */ jsx33("img", {
8368
+ src: logoUrl,
8369
+ alt: "",
8370
+ className: "skippr:block skippr:size-[46px] skippr:rounded-full skippr:object-cover"
8371
+ }) : /* @__PURE__ */ jsx33("span", {
8372
+ className: "skippr:flex skippr:size-[46px] skippr:items-center skippr:justify-center skippr:rounded-full skippr:bg-launcher",
8373
+ children: /* @__PURE__ */ jsx33(SkipprMark2, {})
8374
+ })
8375
+ })
8376
+ ]
8377
+ }),
8378
+ hasNotif && /* @__PURE__ */ jsx33("button", {
8379
+ type: "button",
8380
+ onClick: toggleCard,
8381
+ "aria-label": "Show notifications",
8382
+ style: {
8383
+ background: dotColor,
8384
+ "--skippr-pulse-color": dotColor,
8385
+ left: cardOpen ? AVATAR_DOT_CARD_LEFT[dock.edge] : AVATAR_DOT_REST_LEFT[dock.edge]
8386
+ },
8387
+ className: cn("skippr:absolute skippr:z-[2] skippr:size-[13px] skippr:cursor-pointer skippr:rounded-full skippr:border-[2.5px] skippr:border-white skippr:transition-[left] skippr:duration-300 skippr:ease-[cubic-bezier(0.34,1.3,0.64,1)] skippr:animate-skippr-voice-pulse skippr:motion-reduce:animate-none", dock.edge === "top" ? "skippr:-bottom-[2px]" : "skippr:-top-[2px]")
8388
+ }),
8389
+ hasNotif && cardOpen && /* @__PURE__ */ jsx33(LauncherNotification, {
8390
+ notifications,
8391
+ dock,
8392
+ mode,
8393
+ onDismiss: closeCard
8394
+ })
8395
+ ]
8396
+ });
8397
+ }
8398
+
8399
+ // src/components/VoiceBar.tsx
8400
+ import { jsx as jsx34 } from "react/jsx-runtime";
8401
+ function VoiceBar({ revealed }) {
8402
+ const ctx = useContext21(LiveAgentContext);
8403
+ if (!ctx) {
8404
+ throw new Error("VoiceBar must be used within a <LiveAgent> provider");
8405
+ }
8406
+ const {
8407
+ isConnected,
8408
+ isStarting,
8409
+ isPausing,
8410
+ isDisconnecting,
8411
+ isMinimized,
8412
+ isAuthenticated,
8413
+ appearance,
8414
+ defaultAgentId,
8415
+ startDefaultSession,
8416
+ expandPanel,
8417
+ agentControls,
8418
+ setIsDragging,
8419
+ barDock,
8420
+ setBarDock
8421
+ } = ctx;
8422
+ const [launcherDock, setLauncherDock] = useState29(() => readSavedDock("launcher"));
8423
+ const onLauncherDrop = useCallback23((next) => {
8424
+ setLauncherDock(next);
8425
+ persistDock("launcher", next);
8426
+ }, []);
8427
+ const notifications = useBarNotifications();
8428
+ if (!revealed)
8429
+ return null;
8430
+ const launcherMode = appearance?.launcherMode ?? DEFAULT_LAUNCHER_MODE;
8431
+ const sessionLive = isConnected || isStarting || isPausing || isDisconnecting;
8432
+ const canFold = launcherMode !== LAUNCHER_MODE.None;
8433
+ const canStart = isAuthenticated && !!defaultAgentId;
8434
+ const launcherEdge = appearance?.position === "left" ? "left" : "right";
8435
+ const effectiveLauncherDock = launcherDock ?? {
8436
+ edge: launcherEdge,
8437
+ offsetPx: defaultOffset(launcherEdge)
8438
+ };
8439
+ const effectiveBarDock = barDock ?? { edge: "bottom", offsetPx: defaultOffset("bottom") };
8440
+ const roomChatEnabled = (agentControls?.chat ?? DEFAULT_CHAT_SURFACE) === CHAT_SURFACE.Room;
8441
+ if (launcherMode === LAUNCHER_MODE.Custom && !sessionLive && isMinimized) {
8442
+ return null;
8443
+ }
8444
+ if (launcherMode !== LAUNCHER_MODE.None && !sessionLive && isMinimized) {
8445
+ return /* @__PURE__ */ jsx34(VoiceBarLauncher, {
8446
+ dock: effectiveLauncherDock,
8447
+ mode: launcherMode,
8448
+ logoUrl: appearance?.logoUrl ?? null,
8449
+ notifications,
8450
+ onOpen: canStart ? startDefaultSession : expandPanel,
8451
+ onChat: roomChatEnabled ? expandPanel : null,
8452
+ onDrop: onLauncherDrop,
8453
+ setDragging: setIsDragging
8454
+ });
8455
+ }
8456
+ return /* @__PURE__ */ jsx34(VoiceBarFrame, {
8457
+ dock: effectiveBarDock,
8458
+ canFold,
8459
+ notifications,
8460
+ onDrop: setBarDock,
8461
+ setDragging: setIsDragging
8462
+ });
8463
+ }
8464
+
8465
+ // src/components/LiveAgent.tsx
8466
+ import { jsx as jsx35, jsxs as jsxs28, Fragment as Fragment7 } from "react/jsx-runtime";
8467
+ function readSavedPosition() {
8468
+ try {
8469
+ const saved = localStorage.getItem("skippr_widget_position");
8470
+ return saved === "left" || saved === "right" ? saved : null;
8471
+ } catch {
8472
+ return null;
8473
+ }
8474
+ }
8475
+ function readSavedLauncherBottom() {
8476
+ try {
8477
+ const saved = Number.parseInt(localStorage.getItem("skippr_widget_bottom") ?? "", 10);
8478
+ return Number.isFinite(saved) && saved > 0 ? saved : null;
8479
+ } catch {
8480
+ return null;
8481
+ }
8482
+ }
8483
+ function AgentCursorMount({ animated }) {
8484
+ return /* @__PURE__ */ jsx35(AgentCursor, {
8485
+ target: useAgentCursor(),
8486
+ animated
8487
+ });
8488
+ }
8489
+ function PlanPanelOpener() {
8490
+ const plan = usePlanUpdates();
8491
+ const { expandPanel } = useLiveAgent();
8492
+ const surfacedPlanIdRef = useRef34(null);
8493
+ useEffect41(() => {
8494
+ if (plan?.state !== "proposed" || surfacedPlanIdRef.current === plan.planId)
8495
+ return;
8496
+ surfacedPlanIdRef.current = plan.planId;
8497
+ expandPanel();
8498
+ }, [plan?.planId, plan?.state, expandPanel]);
8499
+ return null;
8500
+ }
8501
+ function LiveAgent(props) {
6563
8502
  const {
6564
8503
  agentId: hostAgentId,
6565
8504
  authToken: authTokenProp,
@@ -6590,19 +8529,21 @@ function LiveAgent(props) {
6590
8529
  const auth = useAuth({ appKey });
6591
8530
  const usesHostAuth = !!getUserToken || !!userToken || !!authTokenProp;
6592
8531
  const effectiveAuthToken = usesHostAuth ? authTokenProp : auth.authToken ?? undefined;
6593
- const [activeModule, setActiveModule] = useState22(null);
6594
- const minimizeOnSessionStart = useCallback18(() => {
8532
+ const [activeModule, setActiveModule] = useState30(null);
8533
+ const [sessionAgentMode, setSessionAgentMode] = useState30(null);
8534
+ const minimizeOnSessionStart = useCallback24(() => {
6595
8535
  if (minimizable) {
6596
8536
  setIsMinimized(true);
6597
8537
  setIsPanelOpen(false);
6598
8538
  }
6599
8539
  }, [minimizable]);
6600
- const expandOnSessionStartError = useCallback18(() => {
8540
+ const expandOnSessionStartError = useCallback24(() => {
6601
8541
  setIsMinimized(false);
6602
8542
  setIsPanelOpen(true);
6603
8543
  }, []);
6604
- const minimizeOnSessionDisconnect = useCallback18(() => {
8544
+ const minimizeOnSessionDisconnect = useCallback24(() => {
6605
8545
  setActiveModule(null);
8546
+ setSessionAgentMode(null);
6606
8547
  if (minimizable) {
6607
8548
  setIsMinimized(true);
6608
8549
  setIsPanelOpen(false);
@@ -6636,30 +8577,30 @@ function LiveAgent(props) {
6636
8577
  onStartError: expandOnSessionStartError,
6637
8578
  onDisconnect: minimizeOnSessionDisconnect
6638
8579
  });
6639
- const teardownInFlightRef = useRef25(false);
8580
+ const teardownInFlightRef = useRef34(false);
6640
8581
  teardownInFlightRef.current = isPaused || isPausing || isDisconnecting;
6641
- const handleRoomDisconnected = useCallback18(() => {
8582
+ const handleRoomDisconnected = useCallback24(() => {
6642
8583
  if (teardownInFlightRef.current)
6643
8584
  return;
6644
8585
  disconnect();
6645
8586
  }, [disconnect]);
6646
8587
  const isSessionLive = connection !== null || isStarting || isPausing || isDisconnecting;
6647
- const [isPanelOpen, setIsPanelOpen] = useState22(defaultOpen);
6648
- const [isMinimized, setIsMinimized] = useState22(minimizable && !defaultOpen);
6649
- const [sidebarTab, setSidebarTab] = useState22("agenda");
6650
- const [phasesSnapshot, setPhasesSnapshot] = useState22([]);
6651
- const [textMode, setTextMode] = useState22(false);
6652
- const [panelExpanded, setPanelExpanded] = useState22(false);
6653
- const togglePanelExpanded = useCallback18(() => setPanelExpanded((prev) => !prev), []);
6654
- const panelRef = useRef25(null);
6655
- const controlBarRef = useRef25(null);
6656
- const [isDragging, setIsDragging] = useState22(false);
6657
- const setTextModeState = useCallback18((enabled) => {
8588
+ const [isPanelOpen, setIsPanelOpen] = useState30(defaultOpen);
8589
+ const [isMinimized, setIsMinimized] = useState30(minimizable && !defaultOpen);
8590
+ const [sidebarTab, setSidebarTab] = useState30("agenda");
8591
+ const [phasesSnapshot, setPhasesSnapshot] = useState30([]);
8592
+ const [textMode, setTextMode] = useState30(false);
8593
+ const [panelExpanded, setPanelExpanded] = useState30(false);
8594
+ const togglePanelExpanded = useCallback24(() => setPanelExpanded((prev) => !prev), []);
8595
+ const panelRef = useRef34(null);
8596
+ const controlBarRef = useRef34(null);
8597
+ const [isDragging, setIsDragging] = useState30(false);
8598
+ const setTextModeState = useCallback24((enabled) => {
6658
8599
  setTextMode(enabled);
6659
8600
  }, []);
6660
8601
  const isConnected = connection !== null;
6661
8602
  const showControlBar = isConnected || isStarting || isPausing;
6662
- useEffect30(() => {
8603
+ useEffect41(() => {
6663
8604
  if (!isConnected)
6664
8605
  setTextModeState(false);
6665
8606
  }, [isConnected, setTextModeState]);
@@ -6678,36 +8619,42 @@ function LiveAgent(props) {
6678
8619
  agentId: hostAgentId ?? undefined
6679
8620
  });
6680
8621
  const isAuthenticated = bearerToken !== null || auth.isAuthenticated;
8622
+ const noModulesAvailable = hasResolvedModules && !modulesError && availableModules.length === 0 && !isSessionLive;
6681
8623
  const isBootAuthPending = usesHostAuth ? !!appKey && !isAuthenticated && !authFailed : !!appKey && !auth.hasResolvedStoredToken;
6682
8624
  const isAwaitingModules = isAuthenticated ? !hasResolvedModules : isBootAuthPending;
6683
8625
  const isLauncherRevealed = useOnceTrue(!isAwaitingModules);
6684
8626
  const { goals: adoptionGoals, attendGoal } = useAdoptionGoals({
6685
- enabled: !isSessionLive,
8627
+ enabled: !isSessionLive || activeModule?.mode === AGENT_MODE.AlwaysOn || sessionAgentMode === AGENT_MODE.AlwaysOn,
6686
8628
  bearerToken,
6687
8629
  authedFetch
6688
8630
  });
8631
+ const defaultAgentId = hostAgentId ?? defaultSelection.agentId;
8632
+ const defaultModule = availableModules.find((m) => m.id === defaultAgentId) ?? null;
6689
8633
  const operatingModule = activeModule ?? (hostAgentId ? availableModules[0] ?? null : null);
6690
8634
  const agentId = operatingModule?.id ?? null;
6691
- const agentControls = operatingModule?.controls ?? hostAgentControls;
6692
- const agentMode = operatingModule?.mode ?? null;
8635
+ const agentControls = operatingModule?.controls ?? defaultModule?.controls ?? hostAgentControls;
8636
+ const agentMode = sessionAgentMode ?? operatingModule?.mode ?? null;
6693
8637
  const shouldAnimateCursor = operatingModule?.uiPreferences?.animateCursor ?? animateAgentCursor;
6694
8638
  const resumableSession = useMemo7(() => getResumableSession(operatingModule), [operatingModule]);
6695
- const resumeSession = useCallback18(async () => {
8639
+ const resumeSession = useCallback24(async () => {
6696
8640
  if (!resumableSession)
6697
8641
  return;
6698
- if (operatingModule)
8642
+ if (operatingModule) {
6699
8643
  setActiveModule(operatingModule);
8644
+ setSessionAgentMode(operatingModule.mode);
8645
+ }
6700
8646
  await startSession({
6701
8647
  agentId: resumableSession.agentId,
6702
8648
  agentControls,
6703
8649
  existingSessionId: resumableSession.id
6704
8650
  });
6705
8651
  }, [resumableSession, operatingModule, startSession, agentControls]);
6706
- const selectModule = useCallback18((moduleId, opts) => {
8652
+ const selectModule = useCallback24((moduleId, opts) => {
6707
8653
  const found = availableModules.find((m) => m.id === moduleId);
6708
8654
  if (!found)
6709
8655
  return;
6710
8656
  setActiveModule(found);
8657
+ setSessionAgentMode(found.mode);
6711
8658
  startSession({
6712
8659
  agentId: found.id,
6713
8660
  agentControls: found.controls,
@@ -6715,23 +8662,24 @@ function LiveAgent(props) {
6715
8662
  autoStarted: opts?.autoStarted
6716
8663
  });
6717
8664
  }, [availableModules, startSession]);
6718
- const startAdoptionSession = useCallback18((goal) => {
8665
+ const startAdoptionSession = useCallback24((goal) => {
6719
8666
  attendGoal(goal.goalId);
6720
8667
  const found = availableModules.find((m) => m.id === goal.agentId);
6721
8668
  if (found)
6722
8669
  setActiveModule(found);
8670
+ setSessionAgentMode(AGENT_MODE.AlwaysOn);
6723
8671
  startSession({
6724
8672
  agentId: goal.agentId,
6725
8673
  agentControls: found?.controls,
6726
8674
  adoptionGoalId: goal.goalId
6727
8675
  });
6728
8676
  }, [attendGoal, availableModules, startSession]);
6729
- const [welcomeDismissed, setWelcomeDismissed] = useState22(false);
6730
- const dismissWelcome = useCallback18(() => setWelcomeDismissed(true), []);
6731
- const [savedPosition] = useState22(readSavedPosition);
6732
- const [currentPosition, setCurrentPosition] = useState22(savedPosition ?? "right");
6733
- const positionLockedRef = useRef25(savedPosition !== null);
6734
- const setPositionWithPersist = useCallback18((pos) => {
8677
+ const [welcomeDismissed, setWelcomeDismissed] = useState30(false);
8678
+ const dismissWelcome = useCallback24(() => setWelcomeDismissed(true), []);
8679
+ const [savedPosition] = useState30(readSavedPosition);
8680
+ const [currentPosition, setCurrentPosition] = useState30(savedPosition ?? "right");
8681
+ const positionLockedRef = useRef34(savedPosition !== null);
8682
+ const setPositionWithPersist = useCallback24((pos) => {
6735
8683
  positionLockedRef.current = true;
6736
8684
  setCurrentPosition(pos);
6737
8685
  try {
@@ -6739,18 +8687,18 @@ function LiveAgent(props) {
6739
8687
  } catch {}
6740
8688
  }, []);
6741
8689
  const serverPosition = appearance?.position ?? null;
6742
- useEffect30(() => {
8690
+ useEffect41(() => {
6743
8691
  if (!serverPosition || positionLockedRef.current)
6744
8692
  return;
6745
8693
  setCurrentPosition(serverPosition);
6746
8694
  }, [serverPosition]);
6747
- const [savedLauncherBottom] = useState22(readSavedLauncherBottom);
6748
- const hasDraggedRef = useRef25(savedLauncherBottom !== null);
6749
- const verticalAlignRef = useRef25(hostVerticalAlign ?? "bottom");
6750
- const [launcherBottomPx, setLauncherBottomPxState] = useState22(() => savedLauncherBottom !== null ? clampLauncherBottom(savedLauncherBottom) : verticalAlignToBottomPx(verticalAlignRef.current));
6751
- const [popsDown, setPopsDown] = useState22(() => launcherPopsDown(launcherBottomPx));
8695
+ const [savedLauncherBottom] = useState30(readSavedLauncherBottom);
8696
+ const hasDraggedRef = useRef34(savedLauncherBottom !== null);
8697
+ const verticalAlignRef = useRef34(hostVerticalAlign ?? "bottom");
8698
+ const [launcherBottomPx, setLauncherBottomPxState] = useState30(() => savedLauncherBottom !== null ? clampLauncherBottom(savedLauncherBottom) : verticalAlignToBottomPx(verticalAlignRef.current));
8699
+ const [popsDown, setPopsDown] = useState30(() => launcherPopsDown(launcherBottomPx));
6752
8700
  const serverVerticalAlign = appearance?.verticalAlign ?? null;
6753
- useEffect30(() => {
8701
+ useEffect41(() => {
6754
8702
  if (!serverVerticalAlign || hostVerticalAlign !== undefined || hasDraggedRef.current)
6755
8703
  return;
6756
8704
  verticalAlignRef.current = serverVerticalAlign;
@@ -6758,7 +8706,7 @@ function LiveAgent(props) {
6758
8706
  setLauncherBottomPxState(next);
6759
8707
  setPopsDown(launcherPopsDown(next));
6760
8708
  }, [serverVerticalAlign, hostVerticalAlign]);
6761
- const setLauncherBottomPx = useCallback18((px) => {
8709
+ const setLauncherBottomPx = useCallback24((px) => {
6762
8710
  hasDraggedRef.current = true;
6763
8711
  setLauncherBottomPxState(px);
6764
8712
  setPopsDown(launcherPopsDown(px));
@@ -6766,13 +8714,23 @@ function LiveAgent(props) {
6766
8714
  localStorage.setItem("skippr_widget_bottom", String(px));
6767
8715
  } catch {}
6768
8716
  }, []);
6769
- const launcherBottomPxRef = useRef25(launcherBottomPx);
8717
+ const launcherBottomPxRef = useRef34(launcherBottomPx);
6770
8718
  launcherBottomPxRef.current = launcherBottomPx;
6771
- const commitLauncherDrop = useCallback18(({ side, bottomPx }) => {
8719
+ const [chatActivityAt, setChatActivityAt] = useState30(0);
8720
+ const reportChatActivity = useCallback24(() => {
8721
+ const now = Date.now();
8722
+ setChatActivityAt((last) => now - last < CHAT_ACTIVITY_THROTTLE_MS ? last : now);
8723
+ }, []);
8724
+ const commitLauncherDrop = useCallback24(({ side, bottomPx }) => {
6772
8725
  setPositionWithPersist(side);
6773
8726
  setLauncherBottomPx(bottomPx);
6774
8727
  }, [setPositionWithPersist, setLauncherBottomPx]);
6775
- useEffect30(() => {
8728
+ const [barDock, setBarDockState] = useState30(() => readSavedDock("bar"));
8729
+ const setBarDock = useCallback24((next) => {
8730
+ setBarDockState(next);
8731
+ persistDock("bar", next);
8732
+ }, []);
8733
+ useEffect41(() => {
6776
8734
  const syncToViewport = () => {
6777
8735
  const next = hasDraggedRef.current ? clampLauncherBottom(launcherBottomPxRef.current) : verticalAlignToBottomPx(verticalAlignRef.current);
6778
8736
  setLauncherBottomPxState(next);
@@ -6782,29 +8740,29 @@ function LiveAgent(props) {
6782
8740
  window.addEventListener("resize", syncToViewport);
6783
8741
  return () => window.removeEventListener("resize", syncToViewport);
6784
8742
  }, []);
6785
- const openPanel = useCallback18(() => setIsPanelOpen(true), []);
6786
- const closePanel = useCallback18(() => setIsPanelOpen(false), []);
6787
- const togglePanel = useCallback18(() => setIsPanelOpen((prev) => !prev), []);
6788
- const expandPanel = useCallback18(() => {
8743
+ const openPanel = useCallback24(() => setIsPanelOpen(true), []);
8744
+ const closePanel = useCallback24(() => setIsPanelOpen(false), []);
8745
+ const togglePanel = useCallback24(() => setIsPanelOpen((prev) => !prev), []);
8746
+ const expandPanel = useCallback24(() => {
6789
8747
  setIsMinimized(false);
6790
8748
  setIsPanelOpen(true);
6791
8749
  }, []);
6792
- const minimizePanel = useCallback18(() => {
8750
+ const minimizePanel = useCallback24(() => {
6793
8751
  if (!minimizable)
6794
8752
  return;
6795
8753
  setIsMinimized(true);
6796
8754
  setIsPanelOpen(false);
6797
8755
  }, [minimizable]);
6798
- const pauseSessionAndMinimize = useCallback18(async () => {
8756
+ const pauseSessionAndMinimize = useCallback24(async () => {
6799
8757
  await pauseSession();
6800
8758
  minimizePanel();
6801
8759
  }, [pauseSession, minimizePanel]);
6802
- const defaultAgentId = hostAgentId ?? defaultSelection.agentId;
6803
- const startDefaultSession = useCallback18(() => {
8760
+ const startDefaultSession = useCallback24(() => {
6804
8761
  const target = availableModules.find((m) => m.id === defaultAgentId);
6805
8762
  if (!target)
6806
8763
  return;
6807
8764
  setActiveModule(target);
8765
+ setSessionAgentMode(target.mode);
6808
8766
  startSession({
6809
8767
  agentId: target.id,
6810
8768
  agentControls: target.controls,
@@ -6858,12 +8816,16 @@ function LiveAgent(props) {
6858
8816
  setLauncherBottomPx,
6859
8817
  commitLauncherDrop,
6860
8818
  popsDown,
8819
+ barDock,
8820
+ setBarDock,
6861
8821
  panelExpanded,
6862
8822
  togglePanelExpanded,
6863
8823
  panelRef,
6864
8824
  controlBarRef,
6865
8825
  isDragging,
6866
8826
  setIsDragging,
8827
+ chatActivityAt,
8828
+ reportChatActivity,
6867
8829
  minimizable,
6868
8830
  isMinimized,
6869
8831
  expandPanel,
@@ -6897,7 +8859,8 @@ function LiveAgent(props) {
6897
8859
  hasResolvedModules,
6898
8860
  appearance,
6899
8861
  adoptionGoals,
6900
- startAdoptionSession
8862
+ startAdoptionSession,
8863
+ attendGoal
6901
8864
  }), [
6902
8865
  connection,
6903
8866
  shouldConnect,
@@ -6928,9 +8891,13 @@ function LiveAgent(props) {
6928
8891
  setLauncherBottomPx,
6929
8892
  commitLauncherDrop,
6930
8893
  popsDown,
8894
+ barDock,
8895
+ setBarDock,
6931
8896
  panelExpanded,
6932
8897
  togglePanelExpanded,
6933
8898
  isDragging,
8899
+ chatActivityAt,
8900
+ reportChatActivity,
6934
8901
  minimizable,
6935
8902
  isMinimized,
6936
8903
  expandPanel,
@@ -6963,54 +8930,74 @@ function LiveAgent(props) {
6963
8930
  hasResolvedModules,
6964
8931
  appearance,
6965
8932
  adoptionGoals,
6966
- startAdoptionSession
8933
+ startAdoptionSession,
8934
+ attendGoal
6967
8935
  ]);
6968
- return /* @__PURE__ */ jsx28(LiveAgentContext.Provider, {
8936
+ if (noModulesAvailable) {
8937
+ return /* @__PURE__ */ jsx35(LiveAgentContext.Provider, {
8938
+ value: ctx,
8939
+ children
8940
+ });
8941
+ }
8942
+ return /* @__PURE__ */ jsx35(LiveAgentContext.Provider, {
6969
8943
  value: ctx,
6970
- children: /* @__PURE__ */ jsxs22(LiveKitRoom, {
8944
+ children: /* @__PURE__ */ jsxs28(LiveKitRoom, {
6971
8945
  serverUrl: connection?.livekitUrl,
6972
8946
  token: connection?.token,
6973
8947
  connect: shouldConnect,
6974
8948
  audio: true,
6975
8949
  onDisconnected: handleRoomDisconnected,
6976
8950
  children: [
6977
- connection && !textMode && /* @__PURE__ */ jsx28(RoomAudioRenderer, {}),
6978
- /* @__PURE__ */ jsxs22(SessionHoldProvider, {
8951
+ connection && !textMode && /* @__PURE__ */ jsx35(RoomAudioRenderer, {}),
8952
+ /* @__PURE__ */ jsxs28(SessionHoldProvider, {
6979
8953
  children: [
6980
- connection && captureMode === CAPTURE_MODE.Screenshare && /* @__PURE__ */ jsx28(AutoStartMedia, {
8954
+ connection && captureMode === CAPTURE_MODE.Screenshare && /* @__PURE__ */ jsx35(AutoStartMedia, {
6981
8955
  pendingScreenStream,
6982
8956
  pushOrTapMicMode: isRequestResponseMicMode(agentControls?.micMode)
6983
8957
  }),
6984
- connection && captureMode === CAPTURE_MODE.Auto && /* @__PURE__ */ jsx28(DomCapture, {
8958
+ connection && captureMode === CAPTURE_MODE.Auto && /* @__PURE__ */ jsx35(DomCapture, {
6985
8959
  pushOrTapMicMode: isRequestResponseMicMode(agentControls?.micMode)
6986
8960
  }),
6987
- /* @__PURE__ */ jsxs22(ShadowHost, {
8961
+ /* @__PURE__ */ jsxs28(ShadowHost, {
6988
8962
  accentColor: appearance?.accentColor ?? null,
6989
8963
  children: [
6990
- connection && captureMode === CAPTURE_MODE.Auto && agentControls?.highlight && /* @__PURE__ */ jsx28(HighlightOverlay, {}),
6991
- connection && captureMode === CAPTURE_MODE.Auto && agentControls?.actions && /* @__PURE__ */ jsx28(PageActionHandler, {}),
6992
- connection && captureMode === CAPTURE_MODE.Auto && agentControls?.actions && /* @__PURE__ */ jsx28(PlanPanelOpener, {}),
6993
- connection && captureMode === CAPTURE_MODE.Auto && (agentControls?.highlight || agentControls?.actions) && /* @__PURE__ */ jsx28(AgentCursorMount, {
8964
+ connection && captureMode === CAPTURE_MODE.Auto && agentControls?.highlight && /* @__PURE__ */ jsx35(HighlightOverlay, {}),
8965
+ connection && captureMode === CAPTURE_MODE.Auto && agentControls?.actions && /* @__PURE__ */ jsx35(PageActionHandler, {}),
8966
+ connection && captureMode === CAPTURE_MODE.Auto && agentControls?.actions && /* @__PURE__ */ jsx35(PlanPanelOpener, {}),
8967
+ connection && captureMode === CAPTURE_MODE.Auto && (agentControls?.highlight || agentControls?.actions) && /* @__PURE__ */ jsx35(AgentCursorMount, {
6994
8968
  animated: shouldAnimateCursor
6995
8969
  }),
6996
- /* @__PURE__ */ jsx28(VoiceTurnProvider, {
6997
- children: /* @__PURE__ */ jsx28(TranscriptionsProvider, {
6998
- children: /* @__PURE__ */ jsxs22("div", {
8970
+ /* @__PURE__ */ jsx35(VoiceTurnProvider, {
8971
+ children: /* @__PURE__ */ jsx35(TranscriptionsProvider, {
8972
+ children: /* @__PURE__ */ jsx35("div", {
6999
8973
  id: WIDGET_ROOT_ID,
7000
- children: [
7001
- isMinimized && !showControlBar && isLauncherRevealed && /* @__PURE__ */ jsx28(MinimizedBubble, {
7002
- welcomeMessage,
7003
- welcomeDismissed,
7004
- onDismissWelcome: dismissWelcome
7005
- }),
7006
- showControlBar && !hideControls && /* @__PURE__ */ jsx28(SessionControlBar, {}),
7007
- /* @__PURE__ */ jsx28(SidebarTrigger, {}),
7008
- /* @__PURE__ */ jsx28(Sidebar, {
7009
- hideControls,
7010
- hideHeader,
7011
- startSessionLabel
7012
- })
7013
- ]
8974
+ children: variant === "sidebar" ? /* @__PURE__ */ jsxs28(Fragment7, {
8975
+ children: [
8976
+ isMinimized && !showControlBar && isLauncherRevealed && /* @__PURE__ */ jsx35(MinimizedBubble, {
8977
+ welcomeMessage,
8978
+ welcomeDismissed,
8979
+ onDismissWelcome: dismissWelcome
8980
+ }),
8981
+ showControlBar && !hideControls && /* @__PURE__ */ jsx35(SessionControlBar, {}),
8982
+ /* @__PURE__ */ jsx35(SidebarTrigger, {}),
8983
+ /* @__PURE__ */ jsx35(Sidebar, {
8984
+ hideControls,
8985
+ hideHeader,
8986
+ startSessionLabel
8987
+ })
8988
+ ]
8989
+ }) : /* @__PURE__ */ jsxs28(Fragment7, {
8990
+ children: [
8991
+ /* @__PURE__ */ jsx35(VoiceBar, {
8992
+ revealed: isLauncherRevealed
8993
+ }),
8994
+ (agentControls?.chat ?? DEFAULT_CHAT_SURFACE) === CHAT_SURFACE.Room && /* @__PURE__ */ jsx35(Sidebar, {
8995
+ hideControls,
8996
+ hideHeader,
8997
+ startSessionLabel
8998
+ })
8999
+ ]
9000
+ })
7014
9001
  })
7015
9002
  })
7016
9003
  })
@@ -7020,14 +9007,14 @@ function LiveAgent(props) {
7020
9007
  ]
7021
9008
  })
7022
9009
  ]
7023
- })
9010
+ }, connection?.token)
7024
9011
  });
7025
9012
  }
7026
9013
  // src/hooks/useIsLocalSpeaking.ts
7027
- import { useIsSpeaking, useLocalParticipant as useLocalParticipant12 } from "@livekit/components-react/hooks";
9014
+ import { useIsSpeaking as useIsSpeaking2, useLocalParticipant as useLocalParticipant13 } from "@livekit/components-react/hooks";
7028
9015
  function useIsLocalSpeaking() {
7029
- const { localParticipant } = useLocalParticipant12();
7030
- return useIsSpeaking(localParticipant);
9016
+ const { localParticipant } = useLocalParticipant13();
9017
+ return useIsSpeaking2(localParticipant);
7031
9018
  }
7032
9019
  // src/hooks/useIsSessionHeld.ts
7033
9020
  function useIsSessionHeld() {