@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.
- package/dist/esm/lib-exports.js +2426 -439
- package/dist/skippr-sdk.css +1 -1
- package/dist/skippr-sdk.js +147 -147
- package/dist/types/components/LauncherNotification.d.ts +11 -0
- package/dist/types/components/MessageList.d.ts +1 -1
- package/dist/types/components/PlanCard.d.ts +3 -0
- package/dist/types/components/VoiceBar.d.ts +5 -0
- package/dist/types/components/VoiceBarChatLine.d.ts +8 -0
- package/dist/types/components/VoiceBarFrame.d.ts +11 -0
- package/dist/types/components/VoiceBarLauncher.d.ts +15 -0
- package/dist/types/components/VoiceBarNotification.d.ts +9 -0
- package/dist/types/components/VoiceBarPlanCard.d.ts +8 -0
- package/dist/types/context/LiveAgentContext.d.ts +11 -2
- package/dist/types/hooks/useAdoptionTips.d.ts +2 -0
- package/dist/types/hooks/useBarNotifications.d.ts +9 -0
- package/dist/types/hooks/useIdleAutoOff.d.ts +9 -0
- package/dist/types/hooks/useKeyboardPushToTalk.d.ts +3 -1
- package/dist/types/hooks/useKeyboardStop.d.ts +6 -0
- package/dist/types/hooks/usePlanUpdates.d.ts +1 -0
- package/dist/types/hooks/usePointerHold.d.ts +1 -0
- package/dist/types/hooks/useSessionTimer.d.ts +5 -0
- package/dist/types/hooks/useVoiceBarDrag.d.ts +6 -0
- package/dist/types/lib/constants.d.ts +33 -1
- package/dist/types/lib/utils.d.ts +1 -0
- package/dist/types/lib/voiceBar.d.ts +18 -0
- package/package.json +1 -1
package/dist/esm/lib-exports.js
CHANGED
|
@@ -8,7 +8,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
8
8
|
|
|
9
9
|
// src/components/LiveAgent.tsx
|
|
10
10
|
import { LiveKitRoom, RoomAudioRenderer } from "@livekit/components-react";
|
|
11
|
-
import { useCallback as
|
|
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 =
|
|
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
|
-
|
|
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/
|
|
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: "
|
|
1524
|
-
["path", { d: "
|
|
1525
|
-
["
|
|
1526
|
-
["path", { d: "
|
|
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
|
|
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
|
|
1531
|
-
var ChevronDown = createLucideIcon("chevron-down",
|
|
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
|
|
1534
|
-
var Circle = createLucideIcon("circle",
|
|
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
|
|
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",
|
|
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
|
|
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",
|
|
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
|
|
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",
|
|
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
|
|
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",
|
|
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
|
|
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",
|
|
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
|
|
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",
|
|
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
|
|
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",
|
|
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
|
|
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",
|
|
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
|
|
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",
|
|
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
|
|
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",
|
|
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
|
|
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",
|
|
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
|
|
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",
|
|
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
|
|
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",
|
|
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
|
|
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",
|
|
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
|
|
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",
|
|
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 =
|
|
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
|
|
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 !==
|
|
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 !==
|
|
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
|
-
|
|
4488
|
-
|
|
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 =
|
|
4908
|
+
const startPushToTalk = useCallback14(() => {
|
|
4744
4909
|
start();
|
|
4745
4910
|
reportActivity();
|
|
4746
4911
|
}, [start, reportActivity]);
|
|
4747
|
-
const commitPushToTalk =
|
|
4912
|
+
const commitPushToTalk = useCallback14(() => {
|
|
4748
4913
|
commit();
|
|
4749
4914
|
reportActivity();
|
|
4750
4915
|
}, [commit, reportActivity]);
|
|
4751
|
-
const dismissPushToTalkHint =
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
5129
|
-
const wasCapturingSpeechRef =
|
|
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
|
|
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 =
|
|
5366
|
+
const parse = useCallback15(parsePhases, []);
|
|
5202
5367
|
const livePhases = useAgentState("phases", parse, []);
|
|
5203
5368
|
const ctx = useContext10(LiveAgentContext);
|
|
5204
|
-
|
|
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
|
|
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 =
|
|
5394
|
+
const endTimeRef = useRef19(null);
|
|
5230
5395
|
const [remaining, setRemaining] = useState17(null);
|
|
5231
|
-
|
|
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
|
|
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 =
|
|
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
|
|
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:
|
|
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:
|
|
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
|
-
|
|
5342
|
-
|
|
5343
|
-
|
|
5344
|
-
|
|
5345
|
-
|
|
5346
|
-
|
|
5347
|
-
|
|
5348
|
-
|
|
5349
|
-
|
|
5350
|
-
|
|
5351
|
-
|
|
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:
|
|
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:
|
|
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
|
|
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] =
|
|
5484
|
-
const [email, setEmail] =
|
|
5485
|
-
const handleRequestOtp =
|
|
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 =
|
|
5618
|
+
const handleVerifyOtp = useCallback17(async (code) => {
|
|
5491
5619
|
await verifyOtp(email, code);
|
|
5492
5620
|
}, [verifyOtp, email]);
|
|
5493
|
-
const handleBack =
|
|
5621
|
+
const handleBack = useCallback17(() => {
|
|
5494
5622
|
setStep("email");
|
|
5495
5623
|
}, []);
|
|
5496
|
-
const handleResend =
|
|
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] =
|
|
5574
|
-
const [resendCooldown, setResendCooldown] =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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] =
|
|
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__ */
|
|
5897
|
+
return /* @__PURE__ */ jsxs14("form", {
|
|
5767
5898
|
onSubmit: handleSubmit,
|
|
5768
|
-
className: "skippr:border-t skippr:border-
|
|
5769
|
-
children:
|
|
5770
|
-
|
|
5771
|
-
|
|
5772
|
-
|
|
5773
|
-
|
|
5774
|
-
|
|
5775
|
-
|
|
5776
|
-
|
|
5777
|
-
|
|
5778
|
-
|
|
5779
|
-
|
|
5780
|
-
|
|
5781
|
-
|
|
5782
|
-
|
|
5783
|
-
|
|
5784
|
-
|
|
5785
|
-
|
|
5786
|
-
|
|
5787
|
-
|
|
5788
|
-
|
|
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] =
|
|
6076
|
+
const [showJumpToLatest, setShowJumpToLatest] = useState20(false);
|
|
5950
6077
|
const lastMessage = messages.length > 0 ? messages[messages.length - 1] : undefined;
|
|
5951
|
-
const [dismissedPlanId, setDismissedPlanId] =
|
|
5952
|
-
const dismissPlan =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
6051
|
-
|
|
6052
|
-
|
|
6053
|
-
|
|
6054
|
-
|
|
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:
|
|
6217
|
+
className: "skippr:flex skippr:items-center skippr:gap-[9px] skippr:py-[5px]",
|
|
6059
6218
|
children: [
|
|
6060
|
-
/* @__PURE__ */ jsx23("
|
|
6061
|
-
className: "skippr:
|
|
6062
|
-
children:
|
|
6063
|
-
className: "skippr:size-
|
|
6064
|
-
|
|
6065
|
-
|
|
6066
|
-
|
|
6067
|
-
|
|
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__ */
|
|
6071
|
-
className: "skippr:
|
|
6072
|
-
children:
|
|
6073
|
-
|
|
6074
|
-
|
|
6075
|
-
|
|
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 =
|
|
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
|
|
6156
|
-
const
|
|
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
|
|
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
|
-
|
|
6168
|
-
|
|
6169
|
-
|
|
6170
|
-
|
|
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:
|
|
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:
|
|
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
|
|
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 =
|
|
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/
|
|
6527
|
-
import {
|
|
6528
|
-
|
|
6529
|
-
|
|
6530
|
-
|
|
6531
|
-
|
|
6532
|
-
|
|
6533
|
-
|
|
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
|
-
|
|
6537
|
-
|
|
6538
|
-
|
|
6539
|
-
|
|
6540
|
-
|
|
6541
|
-
|
|
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
|
-
|
|
6545
|
-
|
|
6546
|
-
|
|
6547
|
-
|
|
6548
|
-
|
|
6549
|
-
|
|
6550
|
-
|
|
6551
|
-
|
|
6552
|
-
|
|
6553
|
-
|
|
6554
|
-
|
|
6555
|
-
|
|
6556
|
-
|
|
6557
|
-
|
|
6558
|
-
|
|
6559
|
-
|
|
6560
|
-
|
|
6561
|
-
|
|
6562
|
-
|
|
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] =
|
|
6594
|
-
const
|
|
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 =
|
|
8540
|
+
const expandOnSessionStartError = useCallback24(() => {
|
|
6601
8541
|
setIsMinimized(false);
|
|
6602
8542
|
setIsPanelOpen(true);
|
|
6603
8543
|
}, []);
|
|
6604
|
-
const minimizeOnSessionDisconnect =
|
|
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 =
|
|
8580
|
+
const teardownInFlightRef = useRef34(false);
|
|
6640
8581
|
teardownInFlightRef.current = isPaused || isPausing || isDisconnecting;
|
|
6641
|
-
const handleRoomDisconnected =
|
|
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] =
|
|
6648
|
-
const [isMinimized, setIsMinimized] =
|
|
6649
|
-
const [sidebarTab, setSidebarTab] =
|
|
6650
|
-
const [phasesSnapshot, setPhasesSnapshot] =
|
|
6651
|
-
const [textMode, setTextMode] =
|
|
6652
|
-
const [panelExpanded, setPanelExpanded] =
|
|
6653
|
-
const togglePanelExpanded =
|
|
6654
|
-
const panelRef =
|
|
6655
|
-
const controlBarRef =
|
|
6656
|
-
const [isDragging, setIsDragging] =
|
|
6657
|
-
const setTextModeState =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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] =
|
|
6730
|
-
const dismissWelcome =
|
|
6731
|
-
const [savedPosition] =
|
|
6732
|
-
const [currentPosition, setCurrentPosition] =
|
|
6733
|
-
const positionLockedRef =
|
|
6734
|
-
const setPositionWithPersist =
|
|
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
|
-
|
|
8690
|
+
useEffect41(() => {
|
|
6743
8691
|
if (!serverPosition || positionLockedRef.current)
|
|
6744
8692
|
return;
|
|
6745
8693
|
setCurrentPosition(serverPosition);
|
|
6746
8694
|
}, [serverPosition]);
|
|
6747
|
-
const [savedLauncherBottom] =
|
|
6748
|
-
const hasDraggedRef =
|
|
6749
|
-
const verticalAlignRef =
|
|
6750
|
-
const [launcherBottomPx, setLauncherBottomPxState] =
|
|
6751
|
-
const [popsDown, setPopsDown] =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
8717
|
+
const launcherBottomPxRef = useRef34(launcherBottomPx);
|
|
6770
8718
|
launcherBottomPxRef.current = launcherBottomPx;
|
|
6771
|
-
const
|
|
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
|
-
|
|
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 =
|
|
6786
|
-
const closePanel =
|
|
6787
|
-
const togglePanel =
|
|
6788
|
-
const expandPanel =
|
|
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 =
|
|
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 =
|
|
8756
|
+
const pauseSessionAndMinimize = useCallback24(async () => {
|
|
6799
8757
|
await pauseSession();
|
|
6800
8758
|
minimizePanel();
|
|
6801
8759
|
}, [pauseSession, minimizePanel]);
|
|
6802
|
-
const
|
|
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
|
-
|
|
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__ */
|
|
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__ */
|
|
6978
|
-
/* @__PURE__ */
|
|
8951
|
+
connection && !textMode && /* @__PURE__ */ jsx35(RoomAudioRenderer, {}),
|
|
8952
|
+
/* @__PURE__ */ jsxs28(SessionHoldProvider, {
|
|
6979
8953
|
children: [
|
|
6980
|
-
connection && captureMode === CAPTURE_MODE.Screenshare && /* @__PURE__ */
|
|
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__ */
|
|
8958
|
+
connection && captureMode === CAPTURE_MODE.Auto && /* @__PURE__ */ jsx35(DomCapture, {
|
|
6985
8959
|
pushOrTapMicMode: isRequestResponseMicMode(agentControls?.micMode)
|
|
6986
8960
|
}),
|
|
6987
|
-
/* @__PURE__ */
|
|
8961
|
+
/* @__PURE__ */ jsxs28(ShadowHost, {
|
|
6988
8962
|
accentColor: appearance?.accentColor ?? null,
|
|
6989
8963
|
children: [
|
|
6990
|
-
connection && captureMode === CAPTURE_MODE.Auto && agentControls?.highlight && /* @__PURE__ */
|
|
6991
|
-
connection && captureMode === CAPTURE_MODE.Auto && agentControls?.actions && /* @__PURE__ */
|
|
6992
|
-
connection && captureMode === CAPTURE_MODE.Auto && agentControls?.actions && /* @__PURE__ */
|
|
6993
|
-
connection && captureMode === CAPTURE_MODE.Auto && (agentControls?.highlight || agentControls?.actions) && /* @__PURE__ */
|
|
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__ */
|
|
6997
|
-
children: /* @__PURE__ */
|
|
6998
|
-
children: /* @__PURE__ */
|
|
8970
|
+
/* @__PURE__ */ jsx35(VoiceTurnProvider, {
|
|
8971
|
+
children: /* @__PURE__ */ jsx35(TranscriptionsProvider, {
|
|
8972
|
+
children: /* @__PURE__ */ jsx35("div", {
|
|
6999
8973
|
id: WIDGET_ROOT_ID,
|
|
7000
|
-
children:
|
|
7001
|
-
|
|
7002
|
-
|
|
7003
|
-
|
|
7004
|
-
|
|
7005
|
-
|
|
7006
|
-
|
|
7007
|
-
|
|
7008
|
-
|
|
7009
|
-
|
|
7010
|
-
|
|
7011
|
-
|
|
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
|
|
9014
|
+
import { useIsSpeaking as useIsSpeaking2, useLocalParticipant as useLocalParticipant13 } from "@livekit/components-react/hooks";
|
|
7028
9015
|
function useIsLocalSpeaking() {
|
|
7029
|
-
const { localParticipant } =
|
|
7030
|
-
return
|
|
9016
|
+
const { localParticipant } = useLocalParticipant13();
|
|
9017
|
+
return useIsSpeaking2(localParticipant);
|
|
7031
9018
|
}
|
|
7032
9019
|
// src/hooks/useIsSessionHeld.ts
|
|
7033
9020
|
function useIsSessionHeld() {
|