@skippr/live-agent-sdk 0.46.0 → 0.48.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 +1337 -1157
- package/dist/skippr-sdk.css +1 -1
- package/dist/skippr-sdk.js +156 -156
- package/dist/types/components/AdoptionBubble.d.ts +4 -2
- package/dist/types/components/ModulePill.d.ts +13 -0
- package/dist/types/components/SessionControlBar.d.ts +1 -0
- package/dist/types/context/LiveAgentContext.d.ts +10 -1
- package/dist/types/hooks/useAdoptionGoals.d.ts +0 -1
- package/dist/types/hooks/useAvailableModules.d.ts +1 -0
- package/dist/types/hooks/useLauncherDrag.d.ts +7 -0
- package/dist/types/hooks/useMicLevel.d.ts +6 -0
- package/dist/types/hooks/useTextMode.d.ts +5 -0
- package/dist/types/lib/constants.d.ts +1 -0
- package/dist/types/lib/launcher.d.ts +8 -0
- package/package.json +1 -1
- package/dist/types/components/LauncherStatusPill.d.ts +0 -1
- package/dist/types/components/MeetingControls.d.ts +0 -10
- package/dist/types/components/ModuleSelector.d.ts +0 -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 useCallback11, useEffect as useEffect20, useMemo as useMemo6, useRef as useRef16, useState as useState16 } from "react";
|
|
12
12
|
|
|
13
13
|
// src/context/LiveAgentContext.tsx
|
|
14
14
|
import { createContext } from "react";
|
|
@@ -142,14 +142,10 @@ function useAdoptionGoals({
|
|
|
142
142
|
body: JSON.stringify({ status })
|
|
143
143
|
}).catch((e) => console.warn("[Skippr] adoption status update failed", e));
|
|
144
144
|
}, [authedFetch]);
|
|
145
|
-
const dismissGoal = useCallback((goalId) => {
|
|
146
|
-
setCandidates((prev) => prev.filter((goal) => goal.goalId !== goalId));
|
|
147
|
-
postStatus(goalId, "dismissed" /* Dismissed */);
|
|
148
|
-
}, [postStatus]);
|
|
149
145
|
const attendGoal = useCallback((goalId) => {
|
|
150
146
|
postStatus(goalId, "attended" /* Attended */);
|
|
151
147
|
}, [postStatus]);
|
|
152
|
-
return { goals,
|
|
148
|
+
return { goals, attendGoal };
|
|
153
149
|
}
|
|
154
150
|
|
|
155
151
|
// src/hooks/useAuth.ts
|
|
@@ -315,9 +311,11 @@ function useAvailableModules({
|
|
|
315
311
|
}) {
|
|
316
312
|
const [modules, setModules] = useState3([]);
|
|
317
313
|
const [isLoading, setIsLoading] = useState3(false);
|
|
314
|
+
const [hasResolved, setHasResolved] = useState3(false);
|
|
318
315
|
const [error, setError] = useState3(null);
|
|
319
316
|
const fetchModules = useCallback3(async () => {
|
|
320
317
|
setIsLoading(true);
|
|
318
|
+
setHasResolved(false);
|
|
321
319
|
setError(null);
|
|
322
320
|
try {
|
|
323
321
|
const resp = await authedFetch(`${API_URL3}/v1/modules/available`);
|
|
@@ -331,6 +329,7 @@ function useAvailableModules({
|
|
|
331
329
|
setError(e instanceof Error ? e.message : "Failed to load modules");
|
|
332
330
|
} finally {
|
|
333
331
|
setIsLoading(false);
|
|
332
|
+
setHasResolved(true);
|
|
334
333
|
}
|
|
335
334
|
}, [authedFetch]);
|
|
336
335
|
useEffect3(() => {
|
|
@@ -341,6 +340,7 @@ function useAvailableModules({
|
|
|
341
340
|
return {
|
|
342
341
|
modules,
|
|
343
342
|
isLoading,
|
|
343
|
+
hasResolved,
|
|
344
344
|
error,
|
|
345
345
|
refetch: fetchModules
|
|
346
346
|
};
|
|
@@ -688,8 +688,30 @@ var DOM_SNAPSHOT_TOPIC = "skippr.dom-snapshot";
|
|
|
688
688
|
var DOM_EVENTS_TOPIC = "skippr.dom-events";
|
|
689
689
|
var HIGHLIGHT_TOPIC = "skippr.highlight";
|
|
690
690
|
var PAGE_ACTIONS_TOPIC = "skippr.page-actions";
|
|
691
|
+
var TEXT_MODE_TOPIC = "skippr.text-mode";
|
|
691
692
|
var NAME_MAX_CHARS = 80;
|
|
692
693
|
|
|
694
|
+
// src/lib/launcher.ts
|
|
695
|
+
var DEFAULT_LAUNCHER_BOTTOM_PX = 48;
|
|
696
|
+
var LAUNCHER_HEIGHT_PX = 50;
|
|
697
|
+
var SESSION_BAR_CLEARANCE_PX = 76;
|
|
698
|
+
var TRIGGER_HEIGHT_PX = 48;
|
|
699
|
+
var IDLE_TRIGGER_CLEARANCE_PX = TRIGGER_HEIGHT_PX + 16;
|
|
700
|
+
var TRIGGER_LAUNCHER_OFFSET_PX = 24;
|
|
701
|
+
var VIEWPORT_MARGIN_PX = 12;
|
|
702
|
+
function triggerBottomPx(launcherBottomPx, popsDown) {
|
|
703
|
+
if (popsDown)
|
|
704
|
+
return launcherBottomPx;
|
|
705
|
+
return Math.max(VIEWPORT_MARGIN_PX, launcherBottomPx - TRIGGER_LAUNCHER_OFFSET_PX);
|
|
706
|
+
}
|
|
707
|
+
function clampLauncherBottom(px) {
|
|
708
|
+
const maxBottom = window.innerHeight - LAUNCHER_HEIGHT_PX - VIEWPORT_MARGIN_PX;
|
|
709
|
+
return Math.round(Math.min(Math.max(px, VIEWPORT_MARGIN_PX), maxBottom));
|
|
710
|
+
}
|
|
711
|
+
function launcherPopsDown(bottomPx) {
|
|
712
|
+
return bottomPx + LAUNCHER_HEIGHT_PX / 2 > window.innerHeight / 2;
|
|
713
|
+
}
|
|
714
|
+
|
|
693
715
|
// src/lib/agentMode.ts
|
|
694
716
|
var AGENT_MODE = {
|
|
695
717
|
Standard: "standard",
|
|
@@ -1775,16 +1797,12 @@ var __iconNode4 = [
|
|
|
1775
1797
|
["circle", { cx: "4", cy: "20", r: "2", key: "6kqj1y" }]
|
|
1776
1798
|
];
|
|
1777
1799
|
var Sparkles = createLucideIcon("sparkles", __iconNode4);
|
|
1778
|
-
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/
|
|
1800
|
+
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/arrow-right.js
|
|
1779
1801
|
var __iconNode5 = [
|
|
1780
|
-
["path", { d: "
|
|
1781
|
-
["
|
|
1782
|
-
["path", { d: "M2 14h2", key: "vft8re" }],
|
|
1783
|
-
["path", { d: "M20 14h2", key: "4cs60a" }],
|
|
1784
|
-
["path", { d: "M15 13v2", key: "1xurst" }],
|
|
1785
|
-
["path", { d: "M9 13v2", key: "rq6x2g" }]
|
|
1802
|
+
["path", { d: "M5 12h14", key: "1ays0h" }],
|
|
1803
|
+
["path", { d: "m12 5 7 7-7 7", key: "xquz4c" }]
|
|
1786
1804
|
];
|
|
1787
|
-
var
|
|
1805
|
+
var ArrowRight = createLucideIcon("arrow-right", __iconNode5);
|
|
1788
1806
|
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/calendar.js
|
|
1789
1807
|
var __iconNode6 = [
|
|
1790
1808
|
["path", { d: "M8 2v4", key: "1cmpym" }],
|
|
@@ -1799,45 +1817,35 @@ var ChevronDown = createLucideIcon("chevron-down", __iconNode7);
|
|
|
1799
1817
|
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/circle.js
|
|
1800
1818
|
var __iconNode8 = [["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]];
|
|
1801
1819
|
var Circle = createLucideIcon("circle", __iconNode8);
|
|
1802
|
-
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/
|
|
1820
|
+
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/lightbulb.js
|
|
1803
1821
|
var __iconNode9 = [
|
|
1804
|
-
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
1805
|
-
["path", { d: "M12 6v6l4 2", key: "mmk7yg" }]
|
|
1806
|
-
];
|
|
1807
|
-
var Clock = createLucideIcon("clock", __iconNode9);
|
|
1808
|
-
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/graduation-cap.js
|
|
1809
|
-
var __iconNode10 = [
|
|
1810
|
-
[
|
|
1811
|
-
"path",
|
|
1812
|
-
{
|
|
1813
|
-
d: "M21.42 10.922a1 1 0 0 0-.019-1.838L12.83 5.18a2 2 0 0 0-1.66 0L2.6 9.08a1 1 0 0 0 0 1.832l8.57 3.908a2 2 0 0 0 1.66 0z",
|
|
1814
|
-
key: "j76jl0"
|
|
1815
|
-
}
|
|
1816
|
-
],
|
|
1817
|
-
["path", { d: "M22 10v6", key: "1lu8f3" }],
|
|
1818
|
-
["path", { d: "M6 12.5V16a6 3 0 0 0 12 0v-3.5", key: "1r8lef" }]
|
|
1819
|
-
];
|
|
1820
|
-
var GraduationCap = createLucideIcon("graduation-cap", __iconNode10);
|
|
1821
|
-
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/headset.js
|
|
1822
|
-
var __iconNode11 = [
|
|
1823
1822
|
[
|
|
1824
1823
|
"path",
|
|
1825
1824
|
{
|
|
1826
|
-
d: "
|
|
1827
|
-
key: "
|
|
1825
|
+
d: "M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",
|
|
1826
|
+
key: "1gvzjb"
|
|
1828
1827
|
}
|
|
1829
1828
|
],
|
|
1830
|
-
["path", { d: "
|
|
1829
|
+
["path", { d: "M9 18h6", key: "x1upvd" }],
|
|
1830
|
+
["path", { d: "M10 22h4", key: "ceow96" }]
|
|
1831
1831
|
];
|
|
1832
|
-
var
|
|
1832
|
+
var Lightbulb = createLucideIcon("lightbulb", __iconNode9);
|
|
1833
1833
|
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/mail.js
|
|
1834
|
-
var
|
|
1834
|
+
var __iconNode10 = [
|
|
1835
1835
|
["path", { d: "m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7", key: "132q7q" }],
|
|
1836
1836
|
["rect", { x: "2", y: "4", width: "20", height: "16", rx: "2", key: "izxlao" }]
|
|
1837
1837
|
];
|
|
1838
|
-
var Mail = createLucideIcon("mail",
|
|
1838
|
+
var Mail = createLucideIcon("mail", __iconNode10);
|
|
1839
|
+
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/maximize-2.js
|
|
1840
|
+
var __iconNode11 = [
|
|
1841
|
+
["path", { d: "M15 3h6v6", key: "1q9fwt" }],
|
|
1842
|
+
["path", { d: "m21 3-7 7", key: "1l2asr" }],
|
|
1843
|
+
["path", { d: "m3 21 7-7", key: "tjx5ai" }],
|
|
1844
|
+
["path", { d: "M9 21H3v-6", key: "wtvkvv" }]
|
|
1845
|
+
];
|
|
1846
|
+
var Maximize2 = createLucideIcon("maximize-2", __iconNode11);
|
|
1839
1847
|
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/message-circle.js
|
|
1840
|
-
var
|
|
1848
|
+
var __iconNode12 = [
|
|
1841
1849
|
[
|
|
1842
1850
|
"path",
|
|
1843
1851
|
{
|
|
@@ -1846,9 +1854,9 @@ var __iconNode13 = [
|
|
|
1846
1854
|
}
|
|
1847
1855
|
]
|
|
1848
1856
|
];
|
|
1849
|
-
var MessageCircle = createLucideIcon("message-circle",
|
|
1857
|
+
var MessageCircle = createLucideIcon("message-circle", __iconNode12);
|
|
1850
1858
|
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/message-square.js
|
|
1851
|
-
var
|
|
1859
|
+
var __iconNode13 = [
|
|
1852
1860
|
[
|
|
1853
1861
|
"path",
|
|
1854
1862
|
{
|
|
@@ -1857,9 +1865,9 @@ var __iconNode14 = [
|
|
|
1857
1865
|
}
|
|
1858
1866
|
]
|
|
1859
1867
|
];
|
|
1860
|
-
var MessageSquare = createLucideIcon("message-square",
|
|
1868
|
+
var MessageSquare = createLucideIcon("message-square", __iconNode13);
|
|
1861
1869
|
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/mic-off.js
|
|
1862
|
-
var
|
|
1870
|
+
var __iconNode14 = [
|
|
1863
1871
|
["path", { d: "M12 19v3", key: "npa21l" }],
|
|
1864
1872
|
["path", { d: "M15 9.34V5a3 3 0 0 0-5.68-1.33", key: "1gzdoj" }],
|
|
1865
1873
|
["path", { d: "M16.95 16.95A7 7 0 0 1 5 12v-2", key: "cqa7eg" }],
|
|
@@ -1867,40 +1875,40 @@ var __iconNode15 = [
|
|
|
1867
1875
|
["path", { d: "m2 2 20 20", key: "1ooewy" }],
|
|
1868
1876
|
["path", { d: "M9 9v3a3 3 0 0 0 5.12 2.12", key: "r2i35w" }]
|
|
1869
1877
|
];
|
|
1870
|
-
var MicOff = createLucideIcon("mic-off",
|
|
1878
|
+
var MicOff = createLucideIcon("mic-off", __iconNode14);
|
|
1871
1879
|
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/mic.js
|
|
1872
|
-
var
|
|
1880
|
+
var __iconNode15 = [
|
|
1873
1881
|
["path", { d: "M12 19v3", key: "npa21l" }],
|
|
1874
1882
|
["path", { d: "M19 10v2a7 7 0 0 1-14 0v-2", key: "1vc78b" }],
|
|
1875
1883
|
["rect", { x: "9", y: "2", width: "6", height: "13", rx: "3", key: "s6n7sd" }]
|
|
1876
1884
|
];
|
|
1877
|
-
var Mic = createLucideIcon("mic",
|
|
1885
|
+
var Mic = createLucideIcon("mic", __iconNode15);
|
|
1878
1886
|
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/minimize-2.js
|
|
1879
|
-
var
|
|
1887
|
+
var __iconNode16 = [
|
|
1880
1888
|
["path", { d: "m14 10 7-7", key: "oa77jy" }],
|
|
1881
1889
|
["path", { d: "M20 10h-6V4", key: "mjg0md" }],
|
|
1882
1890
|
["path", { d: "m3 21 7-7", key: "tjx5ai" }],
|
|
1883
1891
|
["path", { d: "M4 14h6v6", key: "rmj7iw" }]
|
|
1884
1892
|
];
|
|
1885
|
-
var Minimize2 = createLucideIcon("minimize-2",
|
|
1893
|
+
var Minimize2 = createLucideIcon("minimize-2", __iconNode16);
|
|
1886
1894
|
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/monitor-off.js
|
|
1887
|
-
var
|
|
1895
|
+
var __iconNode17 = [
|
|
1888
1896
|
["path", { d: "M12 17v4", key: "1riwvh" }],
|
|
1889
1897
|
["path", { d: "M17 17H4a2 2 0 0 1-2-2V5a2 2 0 0 1 1.184-1.826", key: "cv7jms" }],
|
|
1890
1898
|
["path", { d: "m2 2 20 20", key: "1ooewy" }],
|
|
1891
1899
|
["path", { d: "M8 21h8", key: "1ev6f3" }],
|
|
1892
1900
|
["path", { d: "M8.656 3H20a2 2 0 0 1 2 2v10a2 2 0 0 1-.293 1.042", key: "z8ni2w" }]
|
|
1893
1901
|
];
|
|
1894
|
-
var MonitorOff = createLucideIcon("monitor-off",
|
|
1902
|
+
var MonitorOff = createLucideIcon("monitor-off", __iconNode17);
|
|
1895
1903
|
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/monitor.js
|
|
1896
|
-
var
|
|
1904
|
+
var __iconNode18 = [
|
|
1897
1905
|
["rect", { width: "20", height: "14", x: "2", y: "3", rx: "2", key: "48i651" }],
|
|
1898
1906
|
["line", { x1: "8", x2: "16", y1: "21", y2: "21", key: "1svkeh" }],
|
|
1899
1907
|
["line", { x1: "12", x2: "12", y1: "17", y2: "21", key: "vw1qmm" }]
|
|
1900
1908
|
];
|
|
1901
|
-
var Monitor = createLucideIcon("monitor",
|
|
1909
|
+
var Monitor = createLucideIcon("monitor", __iconNode18);
|
|
1902
1910
|
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/mouse-pointer-2.js
|
|
1903
|
-
var
|
|
1911
|
+
var __iconNode19 = [
|
|
1904
1912
|
[
|
|
1905
1913
|
"path",
|
|
1906
1914
|
{
|
|
@@ -1909,65 +1917,9 @@ var __iconNode20 = [
|
|
|
1909
1917
|
}
|
|
1910
1918
|
]
|
|
1911
1919
|
];
|
|
1912
|
-
var MousePointer2 = createLucideIcon("mouse-pointer-2",
|
|
1913
|
-
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/pause.js
|
|
1914
|
-
var __iconNode21 = [
|
|
1915
|
-
["rect", { x: "14", y: "3", width: "5", height: "18", rx: "1", key: "kaeet6" }],
|
|
1916
|
-
["rect", { x: "5", y: "3", width: "5", height: "18", rx: "1", key: "1wsw3u" }]
|
|
1917
|
-
];
|
|
1918
|
-
var Pause = createLucideIcon("pause", __iconNode21);
|
|
1919
|
-
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/phone-off.js
|
|
1920
|
-
var __iconNode22 = [
|
|
1921
|
-
[
|
|
1922
|
-
"path",
|
|
1923
|
-
{
|
|
1924
|
-
d: "M10.1 13.9a14 14 0 0 0 3.732 2.668 1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2 18 18 0 0 1-12.728-5.272",
|
|
1925
|
-
key: "1wngk7"
|
|
1926
|
-
}
|
|
1927
|
-
],
|
|
1928
|
-
["path", { d: "M22 2 2 22", key: "y4kqgn" }],
|
|
1929
|
-
[
|
|
1930
|
-
"path",
|
|
1931
|
-
{
|
|
1932
|
-
d: "M4.76 13.582A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 .244.473",
|
|
1933
|
-
key: "10hv5p"
|
|
1934
|
-
}
|
|
1935
|
-
]
|
|
1936
|
-
];
|
|
1937
|
-
var PhoneOff = createLucideIcon("phone-off", __iconNode22);
|
|
1938
|
-
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/play.js
|
|
1939
|
-
var __iconNode23 = [
|
|
1940
|
-
[
|
|
1941
|
-
"path",
|
|
1942
|
-
{
|
|
1943
|
-
d: "M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",
|
|
1944
|
-
key: "10ikf1"
|
|
1945
|
-
}
|
|
1946
|
-
]
|
|
1947
|
-
];
|
|
1948
|
-
var Play = createLucideIcon("play", __iconNode23);
|
|
1949
|
-
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/rocket.js
|
|
1950
|
-
var __iconNode24 = [
|
|
1951
|
-
["path", { d: "M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5", key: "qeys4" }],
|
|
1952
|
-
[
|
|
1953
|
-
"path",
|
|
1954
|
-
{
|
|
1955
|
-
d: "M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09",
|
|
1956
|
-
key: "u4xsad"
|
|
1957
|
-
}
|
|
1958
|
-
],
|
|
1959
|
-
[
|
|
1960
|
-
"path",
|
|
1961
|
-
{
|
|
1962
|
-
d: "M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2z",
|
|
1963
|
-
key: "676m9"
|
|
1964
|
-
}
|
|
1965
|
-
],
|
|
1966
|
-
["path", { d: "M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05", key: "92ym6u" }]
|
|
1967
|
-
];
|
|
1968
|
-
var Rocket = createLucideIcon("rocket", __iconNode24);
|
|
1920
|
+
var MousePointer2 = createLucideIcon("mouse-pointer-2", __iconNode19);
|
|
1969
1921
|
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/send.js
|
|
1970
|
-
var
|
|
1922
|
+
var __iconNode20 = [
|
|
1971
1923
|
[
|
|
1972
1924
|
"path",
|
|
1973
1925
|
{
|
|
@@ -1977,21 +1929,13 @@ var __iconNode25 = [
|
|
|
1977
1929
|
],
|
|
1978
1930
|
["path", { d: "m21.854 2.147-10.94 10.939", key: "12cjpa" }]
|
|
1979
1931
|
];
|
|
1980
|
-
var Send = createLucideIcon("send",
|
|
1981
|
-
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/user-plus.js
|
|
1982
|
-
var __iconNode26 = [
|
|
1983
|
-
["path", { d: "M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2", key: "1yyitq" }],
|
|
1984
|
-
["circle", { cx: "9", cy: "7", r: "4", key: "nufk8" }],
|
|
1985
|
-
["line", { x1: "19", x2: "19", y1: "8", y2: "14", key: "1bvyxn" }],
|
|
1986
|
-
["line", { x1: "22", x2: "16", y1: "11", y2: "11", key: "1shjgl" }]
|
|
1987
|
-
];
|
|
1988
|
-
var UserPlus = createLucideIcon("user-plus", __iconNode26);
|
|
1932
|
+
var Send = createLucideIcon("send", __iconNode20);
|
|
1989
1933
|
// ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/x.js
|
|
1990
|
-
var
|
|
1934
|
+
var __iconNode21 = [
|
|
1991
1935
|
["path", { d: "M18 6 6 18", key: "1bl5f8" }],
|
|
1992
1936
|
["path", { d: "m6 6 12 12", key: "d8bk6v" }]
|
|
1993
1937
|
];
|
|
1994
|
-
var X = createLucideIcon("x",
|
|
1938
|
+
var X = createLucideIcon("x", __iconNode21);
|
|
1995
1939
|
// src/components/HighlightOverlay.tsx
|
|
1996
1940
|
import { useCallback as useCallback5, useEffect as useEffect7, useRef as useRef4, useState as useState5 } from "react";
|
|
1997
1941
|
|
|
@@ -2228,59 +2172,92 @@ function HighlightOverlay() {
|
|
|
2228
2172
|
}
|
|
2229
2173
|
|
|
2230
2174
|
// src/components/MinimizedBubble.tsx
|
|
2231
|
-
import { useContext as
|
|
2232
|
-
|
|
2233
|
-
// src/hooks/useLiveAgent.ts
|
|
2234
|
-
import { useContext as useContext2 } from "react";
|
|
2235
|
-
function useLiveAgent() {
|
|
2236
|
-
const ctx = useContext2(LiveAgentContext);
|
|
2237
|
-
if (!ctx) {
|
|
2238
|
-
throw new Error("useLiveAgent must be used within a <LiveAgent> provider");
|
|
2239
|
-
}
|
|
2240
|
-
const {
|
|
2241
|
-
usesHostAuth,
|
|
2242
|
-
authFailed,
|
|
2243
|
-
connection,
|
|
2244
|
-
shouldConnect,
|
|
2245
|
-
historyMessages,
|
|
2246
|
-
phasesSnapshot,
|
|
2247
|
-
setPhasesSnapshot,
|
|
2248
|
-
adoptionGoals,
|
|
2249
|
-
dismissAdoptionGoal,
|
|
2250
|
-
startAdoptionSession,
|
|
2251
|
-
...publicValue
|
|
2252
|
-
} = ctx;
|
|
2253
|
-
return publicValue;
|
|
2254
|
-
}
|
|
2175
|
+
import { useContext as useContext2, useEffect as useEffect9, useRef as useRef6, useState as useState6 } from "react";
|
|
2255
2176
|
|
|
2256
|
-
// src/hooks/
|
|
2257
|
-
import {
|
|
2258
|
-
import {
|
|
2259
|
-
|
|
2260
|
-
|
|
2261
|
-
|
|
2262
|
-
|
|
2263
|
-
|
|
2264
|
-
|
|
2265
|
-
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
|
|
2271
|
-
|
|
2272
|
-
|
|
2273
|
-
|
|
2274
|
-
|
|
2275
|
-
|
|
2276
|
-
|
|
2277
|
-
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
|
-
|
|
2281
|
-
|
|
2282
|
-
|
|
2283
|
-
|
|
2177
|
+
// src/hooks/useLauncherDrag.ts
|
|
2178
|
+
import { useEffect as useEffect8, useRef as useRef5 } from "react";
|
|
2179
|
+
import { flushSync } from "react-dom";
|
|
2180
|
+
var DRAG_THRESHOLD_PX = 5;
|
|
2181
|
+
function useLauncherDrag(containerRef, onDrop) {
|
|
2182
|
+
const wasDraggedRef = useRef5(false);
|
|
2183
|
+
const onDropRef = useRef5(onDrop);
|
|
2184
|
+
onDropRef.current = onDrop;
|
|
2185
|
+
useEffect8(() => {
|
|
2186
|
+
const el = containerRef.current;
|
|
2187
|
+
if (!el)
|
|
2188
|
+
return;
|
|
2189
|
+
let startX = 0;
|
|
2190
|
+
let startY = 0;
|
|
2191
|
+
let dragging = false;
|
|
2192
|
+
let activePointerId = null;
|
|
2193
|
+
const onPointerMove = (event) => {
|
|
2194
|
+
if (event.pointerId !== activePointerId)
|
|
2195
|
+
return;
|
|
2196
|
+
const dx = event.clientX - startX;
|
|
2197
|
+
const dy = event.clientY - startY;
|
|
2198
|
+
if (!dragging && Math.hypot(dx, dy) < DRAG_THRESHOLD_PX)
|
|
2199
|
+
return;
|
|
2200
|
+
if (!dragging) {
|
|
2201
|
+
try {
|
|
2202
|
+
el.setPointerCapture(event.pointerId);
|
|
2203
|
+
} catch {}
|
|
2204
|
+
}
|
|
2205
|
+
dragging = true;
|
|
2206
|
+
wasDraggedRef.current = true;
|
|
2207
|
+
el.style.transform = `translate(${dx}px, ${dy}px)`;
|
|
2208
|
+
};
|
|
2209
|
+
const onPointerUp = (event) => {
|
|
2210
|
+
if (event.pointerId !== activePointerId)
|
|
2211
|
+
return;
|
|
2212
|
+
if (dragging) {
|
|
2213
|
+
const side = event.clientX < window.innerWidth / 2 ? "left" : "right";
|
|
2214
|
+
const pointerBottom = window.innerHeight - event.clientY - LAUNCHER_HEIGHT_PX / 2;
|
|
2215
|
+
flushSync(() => onDropRef.current({ side, bottomPx: clampLauncherBottom(pointerBottom) }));
|
|
2216
|
+
}
|
|
2217
|
+
endDrag();
|
|
2218
|
+
};
|
|
2219
|
+
const onPointerCancel = (event) => {
|
|
2220
|
+
if (event.pointerId !== activePointerId)
|
|
2221
|
+
return;
|
|
2222
|
+
endDrag();
|
|
2223
|
+
};
|
|
2224
|
+
const endDrag = () => {
|
|
2225
|
+
activePointerId = null;
|
|
2226
|
+
el.removeEventListener("pointermove", onPointerMove);
|
|
2227
|
+
el.removeEventListener("pointerup", onPointerUp);
|
|
2228
|
+
el.removeEventListener("pointercancel", onPointerCancel);
|
|
2229
|
+
el.style.transform = "";
|
|
2230
|
+
setTimeout(() => {
|
|
2231
|
+
wasDraggedRef.current = false;
|
|
2232
|
+
}, 0);
|
|
2233
|
+
};
|
|
2234
|
+
const onPointerDown = (event) => {
|
|
2235
|
+
if (event.button !== 0)
|
|
2236
|
+
return;
|
|
2237
|
+
if (activePointerId !== null) {
|
|
2238
|
+
if (dragging)
|
|
2239
|
+
return;
|
|
2240
|
+
endDrag();
|
|
2241
|
+
}
|
|
2242
|
+
activePointerId = event.pointerId;
|
|
2243
|
+
startX = event.clientX;
|
|
2244
|
+
startY = event.clientY;
|
|
2245
|
+
dragging = false;
|
|
2246
|
+
wasDraggedRef.current = false;
|
|
2247
|
+
el.addEventListener("pointermove", onPointerMove);
|
|
2248
|
+
el.addEventListener("pointerup", onPointerUp);
|
|
2249
|
+
el.addEventListener("pointercancel", onPointerCancel);
|
|
2250
|
+
};
|
|
2251
|
+
el.addEventListener("pointerdown", onPointerDown);
|
|
2252
|
+
return () => {
|
|
2253
|
+
el.removeEventListener("pointerdown", onPointerDown);
|
|
2254
|
+
el.removeEventListener("pointermove", onPointerMove);
|
|
2255
|
+
el.removeEventListener("pointerup", onPointerUp);
|
|
2256
|
+
el.removeEventListener("pointercancel", onPointerCancel);
|
|
2257
|
+
el.style.transform = "";
|
|
2258
|
+
};
|
|
2259
|
+
}, [containerRef]);
|
|
2260
|
+
return { wasDraggedRef };
|
|
2284
2261
|
}
|
|
2285
2262
|
|
|
2286
2263
|
// src/lib/utils.ts
|
|
@@ -2292,369 +2269,149 @@ function cn(...inputs) {
|
|
|
2292
2269
|
|
|
2293
2270
|
// src/components/AdoptionBubble.tsx
|
|
2294
2271
|
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
2295
|
-
function AdoptionBubble({
|
|
2296
|
-
|
|
2297
|
-
|
|
2298
|
-
|
|
2299
|
-
|
|
2300
|
-
|
|
2301
|
-
|
|
2302
|
-
|
|
2303
|
-
|
|
2304
|
-
}
|
|
2305
|
-
|
|
2306
|
-
|
|
2307
|
-
|
|
2308
|
-
|
|
2309
|
-
|
|
2310
|
-
|
|
2311
|
-
|
|
2312
|
-
})
|
|
2313
|
-
})
|
|
2314
|
-
]
|
|
2315
|
-
});
|
|
2316
|
-
}
|
|
2317
|
-
|
|
2318
|
-
// src/hooks/useAgentVoiceState.ts
|
|
2319
|
-
import { useVoiceAssistant } from "@livekit/components-react/hooks";
|
|
2320
|
-
function useAgentVoiceState() {
|
|
2321
|
-
const { state } = useVoiceAssistant();
|
|
2322
|
-
return {
|
|
2323
|
-
state,
|
|
2324
|
-
isSpeaking: state === "speaking",
|
|
2325
|
-
isListening: state === "listening"
|
|
2326
|
-
};
|
|
2327
|
-
}
|
|
2328
|
-
|
|
2329
|
-
// src/components/LauncherStatusPill.tsx
|
|
2330
|
-
import { jsx as jsx3, jsxs as jsxs3, Fragment } from "react/jsx-runtime";
|
|
2331
|
-
function pillStatusFromAgent(state, canSeePage) {
|
|
2332
|
-
if (state === "speaking")
|
|
2333
|
-
return "talking";
|
|
2334
|
-
if (state === "thinking")
|
|
2335
|
-
return "thinking";
|
|
2336
|
-
return canSeePage ? "observing" : "connected";
|
|
2337
|
-
}
|
|
2338
|
-
function LauncherStatusPill() {
|
|
2339
|
-
const { isConnected, isStarting, isPaused, expandPanel, setSidebarTab, position, captureMode } = useLiveAgent();
|
|
2340
|
-
const { state } = useAgentVoiceState();
|
|
2341
|
-
const { isScreenSharing } = useMediaControls();
|
|
2342
|
-
const isStandingBy = isStarting && !isConnected;
|
|
2343
|
-
if (!isConnected && !isStandingBy && !isPaused)
|
|
2344
|
-
return null;
|
|
2345
|
-
const canSeePage = captureMode === "auto" || isScreenSharing;
|
|
2346
|
-
let status;
|
|
2347
|
-
if (isPaused) {
|
|
2348
|
-
status = "paused";
|
|
2349
|
-
} else if (isStandingBy) {
|
|
2350
|
-
status = "standing-by";
|
|
2351
|
-
} else {
|
|
2352
|
-
status = pillStatusFromAgent(state, canSeePage);
|
|
2353
|
-
}
|
|
2354
|
-
let ariaLabel;
|
|
2355
|
-
if (isStandingBy) {
|
|
2356
|
-
ariaLabel = "Skippr is standing by — click to open";
|
|
2357
|
-
} else if (isPaused) {
|
|
2358
|
-
ariaLabel = "Session paused — click to open";
|
|
2359
|
-
} else {
|
|
2360
|
-
ariaLabel = `Skippr is ${status} — click to open chat`;
|
|
2361
|
-
}
|
|
2362
|
-
const handleClick = () => {
|
|
2363
|
-
if (!isStandingBy)
|
|
2364
|
-
setSidebarTab("chat");
|
|
2365
|
-
expandPanel();
|
|
2366
|
-
};
|
|
2367
|
-
return /* @__PURE__ */ jsx3("button", {
|
|
2368
|
-
type: "button",
|
|
2369
|
-
onClick: handleClick,
|
|
2370
|
-
className: cn("skippr:fixed skippr:bottom-20 skippr:z-[9999]", "skippr:flex skippr:items-center skippr:gap-2", "skippr:rounded-full skippr:bg-bubble/95 skippr:backdrop-blur-sm", "skippr:px-3 skippr:py-1.5", "skippr:text-xs skippr:font-medium skippr:text-white", "skippr:shadow-[0_8px_24px_rgba(45,43,61,0.35)]", "skippr:cursor-pointer skippr:transition-colors skippr:hover:bg-bubble", "skippr:animate-[skippr-bubble-in_0.28s_ease-out]", position === "right" ? "skippr:right-6" : "skippr:left-6"),
|
|
2371
|
-
"aria-label": ariaLabel,
|
|
2372
|
-
children: /* @__PURE__ */ jsxs3("span", {
|
|
2373
|
-
className: "skippr:flex skippr:items-center skippr:gap-2 skippr:animate-[skippr-pill-content_0.22s_ease-out]",
|
|
2272
|
+
function AdoptionBubble({
|
|
2273
|
+
goal,
|
|
2274
|
+
onAttend,
|
|
2275
|
+
appearDelayMs = 0,
|
|
2276
|
+
exitDelayMs = 0,
|
|
2277
|
+
hidden = false
|
|
2278
|
+
}) {
|
|
2279
|
+
return /* @__PURE__ */ jsx2("div", {
|
|
2280
|
+
style: {
|
|
2281
|
+
animationDelay: `${appearDelayMs}ms`,
|
|
2282
|
+
transitionDelay: hidden ? `${exitDelayMs}ms` : "0ms"
|
|
2283
|
+
},
|
|
2284
|
+
className: cn("skippr:group skippr:relative", "skippr:transition-opacity skippr:duration-300", "skippr:[animation:skippr-tip-in_360ms_cubic-bezier(0.34,1.3,0.64,1)_backwards]", hidden && "skippr:opacity-0 skippr:pointer-events-none"),
|
|
2285
|
+
children: /* @__PURE__ */ jsxs2("button", {
|
|
2286
|
+
type: "button",
|
|
2287
|
+
onClick: () => onAttend(goal),
|
|
2288
|
+
className: cn("skippr:flex skippr:max-w-72 skippr:items-center skippr:gap-2", "skippr:rounded-[14px] skippr:bg-amber-50 skippr:py-1.5 skippr:pr-3 skippr:pl-1.5", "skippr:text-left skippr:shadow-[0_8px_24px_rgba(0,0,0,0.18)]", "skippr:transition-colors skippr:cursor-pointer skippr:hover:bg-amber-100", "skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-bubble/60"),
|
|
2374
2289
|
children: [
|
|
2375
|
-
|
|
2376
|
-
|
|
2377
|
-
|
|
2378
|
-
|
|
2379
|
-
|
|
2380
|
-
|
|
2381
|
-
]
|
|
2382
|
-
}),
|
|
2383
|
-
status === "observing" && /* @__PURE__ */ jsxs3(Fragment, {
|
|
2384
|
-
children: [
|
|
2385
|
-
/* @__PURE__ */ jsx3(ObservingIcon, {}),
|
|
2386
|
-
/* @__PURE__ */ jsx3("span", {
|
|
2387
|
-
children: "Skippr is observing"
|
|
2388
|
-
})
|
|
2389
|
-
]
|
|
2390
|
-
}),
|
|
2391
|
-
status === "connected" && /* @__PURE__ */ jsxs3(Fragment, {
|
|
2392
|
-
children: [
|
|
2393
|
-
/* @__PURE__ */ jsx3(ConnectedDot, {}),
|
|
2394
|
-
/* @__PURE__ */ jsx3("span", {
|
|
2395
|
-
children: "Skippr is connected"
|
|
2396
|
-
})
|
|
2397
|
-
]
|
|
2398
|
-
}),
|
|
2399
|
-
status === "talking" && /* @__PURE__ */ jsxs3(Fragment, {
|
|
2400
|
-
children: [
|
|
2401
|
-
/* @__PURE__ */ jsx3(SpeakingBars, {}),
|
|
2402
|
-
/* @__PURE__ */ jsx3("span", {
|
|
2403
|
-
children: "Skippr is talking"
|
|
2404
|
-
})
|
|
2405
|
-
]
|
|
2290
|
+
/* @__PURE__ */ jsx2("span", {
|
|
2291
|
+
className: cn("skippr:flex skippr:h-6 skippr:w-6 skippr:shrink-0 skippr:items-center skippr:justify-center", "skippr:text-amber-700"),
|
|
2292
|
+
children: /* @__PURE__ */ jsx2(Lightbulb, {
|
|
2293
|
+
className: "skippr:h-3.5 skippr:w-3.5",
|
|
2294
|
+
fill: "currentColor"
|
|
2295
|
+
})
|
|
2406
2296
|
}),
|
|
2407
|
-
|
|
2408
|
-
|
|
2409
|
-
|
|
2410
|
-
/* @__PURE__ */ jsx3("span", {
|
|
2411
|
-
children: "Skippr is thinking"
|
|
2412
|
-
})
|
|
2413
|
-
]
|
|
2297
|
+
/* @__PURE__ */ jsx2("span", {
|
|
2298
|
+
className: "skippr:min-w-0 skippr:truncate skippr:text-[13px] skippr:font-semibold skippr:text-amber-950",
|
|
2299
|
+
children: goal.displayMessage
|
|
2414
2300
|
}),
|
|
2415
|
-
|
|
2416
|
-
|
|
2417
|
-
/* @__PURE__ */ jsx3(PausedDot, {}),
|
|
2418
|
-
/* @__PURE__ */ jsx3("span", {
|
|
2419
|
-
children: "Session paused"
|
|
2420
|
-
})
|
|
2421
|
-
]
|
|
2301
|
+
/* @__PURE__ */ jsx2(ArrowRight, {
|
|
2302
|
+
className: "skippr:h-3.5 skippr:w-3.5 skippr:shrink-0 skippr:text-amber-700"
|
|
2422
2303
|
})
|
|
2423
2304
|
]
|
|
2424
|
-
}
|
|
2305
|
+
})
|
|
2425
2306
|
});
|
|
2426
2307
|
}
|
|
2427
|
-
|
|
2428
|
-
|
|
2429
|
-
|
|
2308
|
+
|
|
2309
|
+
// src/components/ModulePill.tsx
|
|
2310
|
+
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
2311
|
+
var RING_RADIUS = 8;
|
|
2312
|
+
var RING_CIRCUMFERENCE = 2 * Math.PI * RING_RADIUS;
|
|
2313
|
+
function ModulePill({ module, onSelect, progress, isLive = false, label }) {
|
|
2314
|
+
const completedPhases = progress?.completed ?? module.currentSession?.currentPhaseIndex ?? 0;
|
|
2315
|
+
const totalPhases = progress?.total ?? module.totalPhases;
|
|
2316
|
+
const showProgress = module.mode !== AGENT_MODE.AlwaysOn && totalPhases > 0;
|
|
2317
|
+
const progressFraction = showProgress ? Math.min(completedPhases / totalPhases, 1) : 0;
|
|
2318
|
+
return /* @__PURE__ */ jsxs3("button", {
|
|
2319
|
+
type: "button",
|
|
2320
|
+
onClick: () => onSelect(module.id),
|
|
2321
|
+
className: cn("skippr:flex skippr:w-40 skippr:items-center skippr:gap-1.5 skippr:whitespace-nowrap", "skippr:rounded-[14px] skippr:bg-white skippr:px-3 skippr:py-1.5", "skippr:text-[13px] skippr:font-medium skippr:text-black", "skippr:shadow-[0_8px_24px_rgba(0,0,0,0.18)]", "skippr:transition-colors skippr:cursor-pointer skippr:hover:bg-neutral-100", "skippr:animate-[skippr-bubble-in_0.28s_ease-out]", "skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-bubble/60"),
|
|
2430
2322
|
children: [
|
|
2431
|
-
/* @__PURE__ */ jsx3("span", {
|
|
2432
|
-
|
|
2323
|
+
isLive && /* @__PURE__ */ jsx3("span", {
|
|
2324
|
+
"aria-hidden": "true",
|
|
2325
|
+
className: "skippr:size-[6px] skippr:shrink-0 skippr:rounded-full skippr:bg-emerald-500 skippr:animate-pulse skippr:motion-reduce:animate-none"
|
|
2326
|
+
}),
|
|
2327
|
+
showProgress && !isLive && /* @__PURE__ */ jsxs3("svg", {
|
|
2328
|
+
viewBox: "0 0 20 20",
|
|
2329
|
+
className: "skippr:size-4 skippr:shrink-0 skippr:-rotate-90",
|
|
2330
|
+
"aria-hidden": "true",
|
|
2331
|
+
children: [
|
|
2332
|
+
/* @__PURE__ */ jsx3("circle", {
|
|
2333
|
+
cx: "10",
|
|
2334
|
+
cy: "10",
|
|
2335
|
+
r: RING_RADIUS,
|
|
2336
|
+
fill: "none",
|
|
2337
|
+
strokeWidth: "2.5",
|
|
2338
|
+
className: "skippr:stroke-black/15"
|
|
2339
|
+
}),
|
|
2340
|
+
/* @__PURE__ */ jsx3("circle", {
|
|
2341
|
+
cx: "10",
|
|
2342
|
+
cy: "10",
|
|
2343
|
+
r: RING_RADIUS,
|
|
2344
|
+
fill: "none",
|
|
2345
|
+
strokeWidth: "2.5",
|
|
2346
|
+
strokeLinecap: "round",
|
|
2347
|
+
strokeDasharray: RING_CIRCUMFERENCE,
|
|
2348
|
+
strokeDashoffset: RING_CIRCUMFERENCE * (1 - progressFraction),
|
|
2349
|
+
className: "skippr:stroke-bubble"
|
|
2350
|
+
})
|
|
2351
|
+
]
|
|
2433
2352
|
}),
|
|
2434
2353
|
/* @__PURE__ */ jsx3("span", {
|
|
2435
|
-
className: "skippr:
|
|
2436
|
-
|
|
2437
|
-
]
|
|
2438
|
-
});
|
|
2439
|
-
}
|
|
2440
|
-
function PausedDot() {
|
|
2441
|
-
return /* @__PURE__ */ jsx3("span", {
|
|
2442
|
-
className: "skippr:inline-flex skippr:size-2 skippr:rounded-full skippr:bg-amber-400"
|
|
2443
|
-
});
|
|
2444
|
-
}
|
|
2445
|
-
function ObservingIcon() {
|
|
2446
|
-
return /* @__PURE__ */ jsxs3("svg", {
|
|
2447
|
-
viewBox: "0 0 24 24",
|
|
2448
|
-
className: "skippr:size-3.5",
|
|
2449
|
-
fill: "none",
|
|
2450
|
-
stroke: "currentColor",
|
|
2451
|
-
strokeWidth: "2",
|
|
2452
|
-
strokeLinecap: "round",
|
|
2453
|
-
strokeLinejoin: "round",
|
|
2454
|
-
"aria-hidden": "true",
|
|
2455
|
-
children: [
|
|
2456
|
-
/* @__PURE__ */ jsx3("path", {
|
|
2457
|
-
d: "M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z"
|
|
2354
|
+
className: "skippr:min-w-0 skippr:flex-1 skippr:truncate skippr:text-left",
|
|
2355
|
+
children: label ?? module.name
|
|
2458
2356
|
}),
|
|
2459
|
-
/* @__PURE__ */
|
|
2460
|
-
|
|
2461
|
-
|
|
2462
|
-
|
|
2463
|
-
|
|
2464
|
-
|
|
2465
|
-
|
|
2357
|
+
showProgress && /* @__PURE__ */ jsxs3("span", {
|
|
2358
|
+
className: cn("skippr:ml-0.5 skippr:inline-flex skippr:shrink-0 skippr:items-center skippr:gap-1 skippr:rounded-full", "skippr:bg-black/[0.07] skippr:px-1.5 skippr:py-0.5", "skippr:text-[10px] skippr:font-semibold"),
|
|
2359
|
+
children: [
|
|
2360
|
+
completedPhases,
|
|
2361
|
+
"/",
|
|
2362
|
+
totalPhases
|
|
2363
|
+
]
|
|
2466
2364
|
})
|
|
2467
2365
|
]
|
|
2468
2366
|
});
|
|
2469
2367
|
}
|
|
2470
|
-
|
|
2471
|
-
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
|
|
2476
|
-
|
|
2477
|
-
|
|
2478
|
-
|
|
2479
|
-
|
|
2480
|
-
|
|
2481
|
-
|
|
2482
|
-
|
|
2483
|
-
|
|
2484
|
-
|
|
2485
|
-
|
|
2486
|
-
|
|
2487
|
-
|
|
2368
|
+
|
|
2369
|
+
// src/components/MinimizedBubble.tsx
|
|
2370
|
+
import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
2371
|
+
var GOALS_AUTO_HIDE_MS = 1e4;
|
|
2372
|
+
var GOAL_FADE_OUT_MS = 300;
|
|
2373
|
+
var GOAL_APPEAR_STAGGER_MS = 150;
|
|
2374
|
+
var GOAL_EXIT_STAGGER_MS = 250;
|
|
2375
|
+
var MAX_GOAL_BUBBLES = 3;
|
|
2376
|
+
var MAX_MODULE_PILLS = 3;
|
|
2377
|
+
function IdleLauncher({ position, onClick }) {
|
|
2378
|
+
return /* @__PURE__ */ jsx4("button", {
|
|
2379
|
+
type: "button",
|
|
2380
|
+
onClick,
|
|
2381
|
+
"aria-label": "Ask Me Anything",
|
|
2382
|
+
className: cn("skippr:group skippr:relative skippr:h-[50px] skippr:w-[50px]", "skippr:rounded-[16px] skippr:bg-launcher skippr:cursor-pointer", "skippr:shadow-[-6px_6px_22px_rgba(0,0,0,0.3)]", "skippr:[animation:skippr-orb-in_320ms_cubic-bezier(0.34,1.3,0.64,1)]", "skippr:transition-transform skippr:duration-200 skippr:ease-out skippr:hover:scale-110", position === "right" ? "skippr:translate-x-7 skippr:origin-right" : "skippr:-translate-x-7 skippr:origin-left"),
|
|
2383
|
+
children: /* @__PURE__ */ jsx4("svg", {
|
|
2384
|
+
viewBox: "0 0 15.4044 18.4853",
|
|
2385
|
+
className: cn("skippr:absolute skippr:top-1/2 skippr:-translate-y-1/2 skippr:h-[18.5px] skippr:w-[15.4px]", position === "right" ? "skippr:right-[24px]" : "skippr:left-[24px]"),
|
|
2386
|
+
fill: "none",
|
|
2387
|
+
"aria-hidden": "true",
|
|
2388
|
+
children: /* @__PURE__ */ jsx4("path", {
|
|
2389
|
+
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",
|
|
2390
|
+
className: "skippr:fill-brand"
|
|
2488
2391
|
})
|
|
2489
|
-
|
|
2392
|
+
})
|
|
2490
2393
|
});
|
|
2491
2394
|
}
|
|
2492
|
-
function
|
|
2493
|
-
|
|
2494
|
-
|
|
2395
|
+
function WelcomeBubble({
|
|
2396
|
+
message,
|
|
2397
|
+
position,
|
|
2398
|
+
popsDown,
|
|
2399
|
+
onDismiss,
|
|
2400
|
+
onClick
|
|
2401
|
+
}) {
|
|
2402
|
+
useEffect9(() => {
|
|
2403
|
+
const timer = setTimeout(onDismiss, 5000);
|
|
2404
|
+
return () => clearTimeout(timer);
|
|
2405
|
+
}, [onDismiss]);
|
|
2406
|
+
return /* @__PURE__ */ jsxs4("button", {
|
|
2407
|
+
type: "button",
|
|
2408
|
+
className: cn("skippr:absolute", popsDown ? "skippr:top-full skippr:mt-3" : "skippr:bottom-full skippr:mb-3", "skippr:max-w-64 skippr:rounded-xl skippr:bg-card skippr:shadow-lg", "skippr:border skippr:border-border skippr:px-4 skippr:py-3", "skippr:text-sm skippr:text-foreground skippr:leading-relaxed skippr:text-left", "skippr:animate-[skippr-fade-in_0.3s_ease-out]", "skippr:cursor-pointer", position === "right" ? "skippr:right-0" : "skippr:left-0"),
|
|
2409
|
+
onClick,
|
|
2410
|
+
"aria-label": "Dismiss",
|
|
2495
2411
|
children: [
|
|
2496
|
-
|
|
2497
|
-
|
|
2498
|
-
|
|
2499
|
-
/* @__PURE__ */ jsx3("span", {
|
|
2500
|
-
className: "skippr:size-1 skippr:rounded-full skippr:bg-white skippr:animate-bounce skippr:[animation-delay:150ms]"
|
|
2501
|
-
}),
|
|
2502
|
-
/* @__PURE__ */ jsx3("span", {
|
|
2503
|
-
className: "skippr:size-1 skippr:rounded-full skippr:bg-white skippr:animate-bounce skippr:[animation-delay:300ms]"
|
|
2504
|
-
})
|
|
2505
|
-
]
|
|
2506
|
-
});
|
|
2507
|
-
}
|
|
2508
|
-
|
|
2509
|
-
// src/components/Logo.tsx
|
|
2510
|
-
import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
2511
|
-
function Logo({ className }) {
|
|
2512
|
-
return /* @__PURE__ */ jsxs4("svg", {
|
|
2513
|
-
width: "1em",
|
|
2514
|
-
height: "1em",
|
|
2515
|
-
viewBox: "0 0 200 200",
|
|
2516
|
-
fill: "none",
|
|
2517
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
2518
|
-
role: "img",
|
|
2519
|
-
"aria-label": "Skippr",
|
|
2520
|
-
className,
|
|
2521
|
-
children: [
|
|
2522
|
-
/* @__PURE__ */ jsx4("rect", {
|
|
2523
|
-
width: "200",
|
|
2524
|
-
height: "200",
|
|
2525
|
-
rx: "40",
|
|
2526
|
-
fill: "#2D2D3F"
|
|
2527
|
-
}),
|
|
2528
|
-
/* @__PURE__ */ jsxs4("g", {
|
|
2529
|
-
transform: "translate(100 100) scale(0.8) translate(-100 -100)",
|
|
2530
|
-
children: [
|
|
2531
|
-
/* @__PURE__ */ jsx4("path", {
|
|
2532
|
-
d: "M144.497 59C149.193 59 153 62.8071 153 67.5033V116.397C153 118.034 152.536 119.562 151.735 120.859L114.894 92.4811L114.894 92.4804C105.42 85.1648 91.2971 91.7058 91.297 104.015V124.901H54.5033C49.8071 124.901 46 121.094 46 116.397V67.5033C46 62.8071 49.8071 59 54.5033 59H144.497ZM101.272 104.015C101.272 100.172 105.736 98.0111 108.798 100.375L140.637 124.901H101.272V104.015Z",
|
|
2533
|
-
fill: "white"
|
|
2534
|
-
}),
|
|
2535
|
-
/* @__PURE__ */ jsx4("path", {
|
|
2536
|
-
d: "M108.798 99.8856C105.736 97.5211 101.271 99.6824 101.271 103.525V155.892C101.271 160.27 106.852 162.191 109.594 158.755L122.619 142.437C123.1 141.836 123.712 141.35 124.409 141.016C125.106 140.683 125.871 140.51 126.645 140.51H147.946C152.386 140.51 154.316 134.944 150.81 132.247L108.798 99.8856Z",
|
|
2537
|
-
fill: "#2BC0AE"
|
|
2538
|
-
})
|
|
2539
|
-
]
|
|
2540
|
-
})
|
|
2541
|
-
]
|
|
2542
|
-
});
|
|
2543
|
-
}
|
|
2544
|
-
|
|
2545
|
-
// src/components/MinimizedBubble.tsx
|
|
2546
|
-
import { jsx as jsx5, jsxs as jsxs5, Fragment as Fragment2 } from "react/jsx-runtime";
|
|
2547
|
-
var CONTROL_BUTTON = "skippr:flex skippr:size-12 skippr:items-center skippr:justify-center skippr:rounded-[14px] skippr:cursor-pointer skippr:transition-all skippr:hover:-translate-y-0.5 skippr:active:translate-y-0";
|
|
2548
|
-
var CONTROL_SHADOW = "skippr:shadow-[0_4px_16px_rgba(0,0,0,0.15),0_2px_4px_rgba(0,0,0,0.1)]";
|
|
2549
|
-
function ConnectedLauncher() {
|
|
2550
|
-
const {
|
|
2551
|
-
expandPanel,
|
|
2552
|
-
disconnect,
|
|
2553
|
-
pauseSession,
|
|
2554
|
-
resumeSession,
|
|
2555
|
-
isPaused,
|
|
2556
|
-
isPausing,
|
|
2557
|
-
captureMode,
|
|
2558
|
-
setSidebarTab
|
|
2559
|
-
} = useLiveAgent();
|
|
2560
|
-
const { isMuted, toggleMute, isScreenSharing, toggleScreenShare } = useMediaControls();
|
|
2561
|
-
const showScreenShareToggle = captureMode === "screenshare";
|
|
2562
|
-
const showPaused = isPaused || isPausing;
|
|
2563
|
-
const openChat = () => {
|
|
2564
|
-
setSidebarTab("chat");
|
|
2565
|
-
expandPanel();
|
|
2566
|
-
};
|
|
2567
|
-
return /* @__PURE__ */ jsxs5(Fragment2, {
|
|
2568
|
-
children: [
|
|
2569
|
-
!showPaused && /* @__PURE__ */ jsxs5(Fragment2, {
|
|
2570
|
-
children: [
|
|
2571
|
-
/* @__PURE__ */ jsx5("button", {
|
|
2572
|
-
type: "button",
|
|
2573
|
-
onClick: toggleMute,
|
|
2574
|
-
"aria-label": isMuted ? "Unmute" : "Mute",
|
|
2575
|
-
className: cn(CONTROL_BUTTON, CONTROL_SHADOW, isMuted ? "skippr:bg-destructive/10 skippr:text-destructive skippr:hover:bg-destructive/20" : "skippr:bg-white skippr:text-foreground skippr:hover:bg-muted"),
|
|
2576
|
-
children: isMuted ? /* @__PURE__ */ jsx5(MicOff, {
|
|
2577
|
-
className: "skippr:size-5"
|
|
2578
|
-
}) : /* @__PURE__ */ jsx5(Mic, {
|
|
2579
|
-
className: "skippr:size-5"
|
|
2580
|
-
})
|
|
2581
|
-
}),
|
|
2582
|
-
showScreenShareToggle && /* @__PURE__ */ jsx5("button", {
|
|
2583
|
-
type: "button",
|
|
2584
|
-
onClick: toggleScreenShare,
|
|
2585
|
-
"aria-label": isScreenSharing ? "Stop sharing screen" : "Share screen",
|
|
2586
|
-
className: cn(CONTROL_BUTTON, CONTROL_SHADOW, isScreenSharing ? "skippr:bg-primary skippr:text-primary-foreground skippr:hover:bg-primary/90" : "skippr:bg-white skippr:text-foreground skippr:hover:bg-muted"),
|
|
2587
|
-
children: isScreenSharing ? /* @__PURE__ */ jsx5(MonitorOff, {
|
|
2588
|
-
className: "skippr:size-5"
|
|
2589
|
-
}) : /* @__PURE__ */ jsx5(Monitor, {
|
|
2590
|
-
className: "skippr:size-5"
|
|
2591
|
-
})
|
|
2592
|
-
})
|
|
2593
|
-
]
|
|
2594
|
-
}),
|
|
2595
|
-
/* @__PURE__ */ jsx5("button", {
|
|
2596
|
-
type: "button",
|
|
2597
|
-
onClick: () => isPaused ? resumeSession() : pauseSession(),
|
|
2598
|
-
disabled: isPausing,
|
|
2599
|
-
"aria-label": showPaused ? "Resume session" : "Pause session",
|
|
2600
|
-
className: cn(CONTROL_BUTTON, CONTROL_SHADOW, "skippr:bg-white skippr:text-foreground skippr:hover:bg-muted skippr:disabled:opacity-60"),
|
|
2601
|
-
children: showPaused ? /* @__PURE__ */ jsx5(Play, {
|
|
2602
|
-
className: "skippr:size-5"
|
|
2603
|
-
}) : /* @__PURE__ */ jsx5(Pause, {
|
|
2604
|
-
className: "skippr:size-5"
|
|
2605
|
-
})
|
|
2606
|
-
}),
|
|
2607
|
-
/* @__PURE__ */ jsx5("button", {
|
|
2608
|
-
type: "button",
|
|
2609
|
-
onClick: () => disconnect(),
|
|
2610
|
-
"aria-label": "End session",
|
|
2611
|
-
className: cn(CONTROL_BUTTON, "skippr:bg-destructive skippr:text-destructive-foreground skippr:hover:bg-destructive/90", "skippr:shadow-[0_4px_16px_rgba(217,79,79,0.45),0_2px_4px_rgba(0,0,0,0.1)]"),
|
|
2612
|
-
children: /* @__PURE__ */ jsx5(PhoneOff, {
|
|
2613
|
-
className: "skippr:size-5"
|
|
2614
|
-
})
|
|
2615
|
-
}),
|
|
2616
|
-
!showPaused && /* @__PURE__ */ jsx5("button", {
|
|
2617
|
-
type: "button",
|
|
2618
|
-
onClick: openChat,
|
|
2619
|
-
"aria-label": "Open chat",
|
|
2620
|
-
className: cn(CONTROL_BUTTON, "skippr:bg-bubble skippr:text-white skippr:overflow-hidden", "skippr:shadow-[0_4px_16px_rgba(45,43,61,0.45),0_2px_4px_rgba(0,0,0,0.1)]", "skippr:hover:shadow-[0_6px_24px_rgba(45,43,61,0.55),0_4px_8px_rgba(0,0,0,0.1)]"),
|
|
2621
|
-
children: /* @__PURE__ */ jsx5(MessageSquare, {
|
|
2622
|
-
className: "skippr:size-5"
|
|
2623
|
-
})
|
|
2624
|
-
})
|
|
2625
|
-
]
|
|
2626
|
-
});
|
|
2627
|
-
}
|
|
2628
|
-
function IdleLauncher() {
|
|
2629
|
-
const { expandPanel } = useLiveAgent();
|
|
2630
|
-
return /* @__PURE__ */ jsx5("button", {
|
|
2631
|
-
type: "button",
|
|
2632
|
-
onClick: expandPanel,
|
|
2633
|
-
"aria-label": "Skippr assistant",
|
|
2634
|
-
className: cn("skippr:flex skippr:size-12 skippr:items-center skippr:justify-center", "skippr:rounded-[10px] skippr:overflow-hidden skippr:cursor-pointer", "skippr:shadow-[0_4px_16px_rgba(45,43,61,0.45),0_2px_4px_rgba(0,0,0,0.1)]", "skippr:transition-all skippr:hover:brightness-110 skippr:hover:-translate-y-0.5 skippr:active:translate-y-0"),
|
|
2635
|
-
children: /* @__PURE__ */ jsx5(Logo, {
|
|
2636
|
-
className: "skippr:size-12"
|
|
2637
|
-
})
|
|
2638
|
-
});
|
|
2639
|
-
}
|
|
2640
|
-
function WelcomeBubble({
|
|
2641
|
-
message,
|
|
2642
|
-
position,
|
|
2643
|
-
onDismiss
|
|
2644
|
-
}) {
|
|
2645
|
-
useEffect8(() => {
|
|
2646
|
-
const timer = setTimeout(onDismiss, 5000);
|
|
2647
|
-
return () => clearTimeout(timer);
|
|
2648
|
-
}, [onDismiss]);
|
|
2649
|
-
return /* @__PURE__ */ jsxs5("button", {
|
|
2650
|
-
type: "button",
|
|
2651
|
-
className: cn("skippr:absolute skippr:bottom-full skippr:mb-3", "skippr:max-w-64 skippr:rounded-xl skippr:bg-card skippr:shadow-lg", "skippr:border skippr:border-border skippr:px-4 skippr:py-3", "skippr:text-sm skippr:text-foreground skippr:leading-relaxed skippr:text-left", "skippr:animate-[skippr-fade-in_0.3s_ease-out]", "skippr:cursor-pointer", position === "right" ? "skippr:right-0" : "skippr:left-0"),
|
|
2652
|
-
onClick: onDismiss,
|
|
2653
|
-
"aria-label": "Dismiss",
|
|
2654
|
-
children: [
|
|
2655
|
-
message,
|
|
2656
|
-
/* @__PURE__ */ jsx5("span", {
|
|
2657
|
-
className: cn("skippr:absolute skippr:top-full skippr:size-2.5", "skippr:border-l skippr:border-t skippr:border-border skippr:bg-card", "skippr:rotate-[225deg]", position === "right" ? "skippr:right-5" : "skippr:left-5", "skippr:-mt-[5px]")
|
|
2412
|
+
message,
|
|
2413
|
+
/* @__PURE__ */ jsx4("span", {
|
|
2414
|
+
className: cn("skippr:absolute skippr:size-2.5", "skippr:border-l skippr:border-t skippr:border-border skippr:bg-card", popsDown ? "skippr:bottom-full skippr:rotate-45 skippr:-mb-[5px]" : "skippr:top-full skippr:rotate-[225deg] skippr:-mt-[5px]", position === "right" ? "skippr:right-5" : "skippr:left-5")
|
|
2658
2415
|
})
|
|
2659
2416
|
]
|
|
2660
2417
|
});
|
|
@@ -2664,42 +2421,137 @@ function MinimizedBubble({
|
|
|
2664
2421
|
welcomeDismissed,
|
|
2665
2422
|
onDismissWelcome
|
|
2666
2423
|
}) {
|
|
2667
|
-
const ctx =
|
|
2424
|
+
const ctx = useContext2(LiveAgentContext);
|
|
2668
2425
|
if (!ctx) {
|
|
2669
2426
|
throw new Error("MinimizedBubble must be used within a <LiveAgent> provider");
|
|
2670
2427
|
}
|
|
2671
2428
|
const {
|
|
2672
|
-
isConnected,
|
|
2673
2429
|
isStarting,
|
|
2674
|
-
isPaused,
|
|
2675
|
-
isPausing,
|
|
2676
2430
|
position,
|
|
2431
|
+
setPosition,
|
|
2432
|
+
launcherBottomPx,
|
|
2433
|
+
setLauncherBottomPx,
|
|
2434
|
+
popsDown,
|
|
2677
2435
|
adoptionGoals,
|
|
2678
|
-
|
|
2679
|
-
|
|
2436
|
+
startAdoptionSession,
|
|
2437
|
+
hasModuleSelector,
|
|
2438
|
+
isAuthenticated,
|
|
2439
|
+
availableModules,
|
|
2440
|
+
hasResolvedModules,
|
|
2441
|
+
selectModule,
|
|
2442
|
+
expandPanel
|
|
2680
2443
|
} = ctx;
|
|
2681
|
-
const
|
|
2682
|
-
|
|
2444
|
+
const [goalsAutoHidden, setGoalsAutoHidden] = useState6(false);
|
|
2445
|
+
const [isLauncherHovered, setIsLauncherHovered] = useState6(false);
|
|
2446
|
+
const [visitHref, setVisitHref] = useState6(() => window.location.href);
|
|
2447
|
+
const revealedHrefRef = useRef6(null);
|
|
2448
|
+
const hoverContainerRef = useRef6(null);
|
|
2449
|
+
useEffect9(() => subscribeToLocationChange(() => setVisitHref(window.location.href)), []);
|
|
2450
|
+
useEffect9(() => {
|
|
2451
|
+
const el = hoverContainerRef.current;
|
|
2452
|
+
if (!el)
|
|
2453
|
+
return;
|
|
2454
|
+
const onEnter = () => setIsLauncherHovered(true);
|
|
2455
|
+
const onLeave = () => setIsLauncherHovered(false);
|
|
2456
|
+
el.addEventListener("mouseenter", onEnter);
|
|
2457
|
+
el.addEventListener("mouseleave", onLeave);
|
|
2458
|
+
return () => {
|
|
2459
|
+
el.removeEventListener("mouseenter", onEnter);
|
|
2460
|
+
el.removeEventListener("mouseleave", onLeave);
|
|
2461
|
+
};
|
|
2462
|
+
}, []);
|
|
2463
|
+
const { wasDraggedRef } = useLauncherDrag(hoverContainerRef, ({ side, bottomPx }) => {
|
|
2464
|
+
setPosition(side);
|
|
2465
|
+
setLauncherBottomPx(bottomPx);
|
|
2466
|
+
});
|
|
2467
|
+
const actionableModules = hasModuleSelector ? availableModules.filter((module) => {
|
|
2468
|
+
const state = getModuleSessionState(module.currentSession, module.mode);
|
|
2469
|
+
return state !== "completed" && state !== "expired";
|
|
2470
|
+
}) : [];
|
|
2471
|
+
const alwaysOnModule = actionableModules.find((module) => module.mode === AGENT_MODE.AlwaysOn);
|
|
2472
|
+
const pillCandidates = actionableModules.filter((module) => module.mode !== AGENT_MODE.AlwaysOn);
|
|
2473
|
+
const onboardingModule = pillCandidates.find((module) => module.type === "onboarding");
|
|
2474
|
+
const modulePills = onboardingModule ? [onboardingModule] : pillCandidates.slice(0, MAX_MODULE_PILLS).reverse();
|
|
2475
|
+
const goalsEligible = adoptionGoals.length > 0 && !onboardingModule && (!hasModuleSelector || hasResolvedModules);
|
|
2476
|
+
useEffect9(() => {
|
|
2477
|
+
if (!goalsEligible)
|
|
2478
|
+
return;
|
|
2479
|
+
if (revealedHrefRef.current === visitHref) {
|
|
2480
|
+
setGoalsAutoHidden(true);
|
|
2481
|
+
return;
|
|
2482
|
+
}
|
|
2483
|
+
revealedHrefRef.current = visitHref;
|
|
2484
|
+
setGoalsAutoHidden(false);
|
|
2485
|
+
const timer = setTimeout(() => setGoalsAutoHidden(true), GOALS_AUTO_HIDE_MS);
|
|
2486
|
+
return () => clearTimeout(timer);
|
|
2487
|
+
}, [goalsEligible, visitHref]);
|
|
2488
|
+
const matchedGoals = goalsEligible ? adoptionGoals.slice(0, MAX_GOAL_BUBBLES) : [];
|
|
2489
|
+
const goalsHidden = goalsAutoHidden && !isLauncherHovered;
|
|
2490
|
+
const [goalsUnmounted, setGoalsUnmounted] = useState6(false);
|
|
2491
|
+
useEffect9(() => {
|
|
2492
|
+
if (!goalsHidden) {
|
|
2493
|
+
setGoalsUnmounted(false);
|
|
2494
|
+
return;
|
|
2495
|
+
}
|
|
2496
|
+
const exitTotalMs = GOAL_FADE_OUT_MS + GOAL_EXIT_STAGGER_MS * (MAX_GOAL_BUBBLES - 1);
|
|
2497
|
+
const timer = setTimeout(() => setGoalsUnmounted(true), exitTotalMs);
|
|
2498
|
+
return () => clearTimeout(timer);
|
|
2499
|
+
}, [goalsHidden]);
|
|
2500
|
+
const visibleGoals = goalsUnmounted ? [] : matchedGoals;
|
|
2501
|
+
const launchDefaultSession = () => {
|
|
2502
|
+
if (wasDraggedRef.current || isStarting)
|
|
2503
|
+
return;
|
|
2504
|
+
if (!hasModuleSelector || !isAuthenticated) {
|
|
2505
|
+
expandPanel();
|
|
2506
|
+
return;
|
|
2507
|
+
}
|
|
2508
|
+
const target = alwaysOnModule ?? onboardingModule ?? pillCandidates[0];
|
|
2509
|
+
if (target) {
|
|
2510
|
+
selectModule(target.id);
|
|
2511
|
+
return;
|
|
2512
|
+
}
|
|
2513
|
+
expandPanel();
|
|
2514
|
+
};
|
|
2515
|
+
return /* @__PURE__ */ jsxs4("div", {
|
|
2516
|
+
ref: hoverContainerRef,
|
|
2517
|
+
style: { bottom: launcherBottomPx, touchAction: "none" },
|
|
2518
|
+
className: cn("skippr:fixed skippr:z-[9999]", "skippr:flex skippr:items-center skippr:gap-2", position === "right" ? "skippr:right-3" : "skippr:left-3"),
|
|
2683
2519
|
children: [
|
|
2684
|
-
/* @__PURE__ */
|
|
2685
|
-
|
|
2686
|
-
className: cn("skippr:fixed skippr:bottom-6 skippr:z-[9999]", "skippr:flex skippr:items-center skippr:gap-2", position === "right" ? "skippr:right-6" : "skippr:left-6"),
|
|
2520
|
+
(modulePills.length > 0 || visibleGoals.length > 0) && /* @__PURE__ */ jsxs4("div", {
|
|
2521
|
+
className: cn("skippr:absolute skippr:gap-2", popsDown ? "skippr:top-full skippr:mt-3 skippr:flex skippr:flex-col-reverse" : "skippr:bottom-full skippr:mb-3 skippr:flex skippr:flex-col", position === "right" ? "skippr:right-0 skippr:items-end" : "skippr:left-0 skippr:items-start"),
|
|
2687
2522
|
children: [
|
|
2688
|
-
|
|
2689
|
-
|
|
2690
|
-
|
|
2691
|
-
|
|
2692
|
-
|
|
2693
|
-
|
|
2694
|
-
|
|
2695
|
-
|
|
2696
|
-
|
|
2697
|
-
|
|
2698
|
-
|
|
2699
|
-
|
|
2700
|
-
|
|
2701
|
-
|
|
2523
|
+
visibleGoals.map((goal, index2) => /* @__PURE__ */ jsx4(AdoptionBubble, {
|
|
2524
|
+
goal,
|
|
2525
|
+
onAttend: (attended) => {
|
|
2526
|
+
if (!wasDraggedRef.current)
|
|
2527
|
+
startAdoptionSession(attended);
|
|
2528
|
+
},
|
|
2529
|
+
appearDelayMs: (visibleGoals.length - 1 - index2) * GOAL_APPEAR_STAGGER_MS,
|
|
2530
|
+
exitDelayMs: (visibleGoals.length - 1 - index2) * GOAL_EXIT_STAGGER_MS,
|
|
2531
|
+
hidden: goalsHidden
|
|
2532
|
+
}, goal.goalId)),
|
|
2533
|
+
modulePills.map((module) => /* @__PURE__ */ jsx4(ModulePill, {
|
|
2534
|
+
module,
|
|
2535
|
+
onSelect: (id) => {
|
|
2536
|
+
if (!wasDraggedRef.current)
|
|
2537
|
+
selectModule(id);
|
|
2538
|
+
}
|
|
2539
|
+
}, module.id))
|
|
2702
2540
|
]
|
|
2541
|
+
}),
|
|
2542
|
+
welcomeMessage && !welcomeDismissed && adoptionGoals.length === 0 && modulePills.length === 0 && /* @__PURE__ */ jsx4(WelcomeBubble, {
|
|
2543
|
+
message: welcomeMessage,
|
|
2544
|
+
position,
|
|
2545
|
+
popsDown,
|
|
2546
|
+
onDismiss: onDismissWelcome,
|
|
2547
|
+
onClick: () => {
|
|
2548
|
+
if (!wasDraggedRef.current)
|
|
2549
|
+
onDismissWelcome();
|
|
2550
|
+
}
|
|
2551
|
+
}),
|
|
2552
|
+
/* @__PURE__ */ jsx4(IdleLauncher, {
|
|
2553
|
+
position,
|
|
2554
|
+
onClick: launchDefaultSession
|
|
2703
2555
|
})
|
|
2704
2556
|
]
|
|
2705
2557
|
});
|
|
@@ -2707,20 +2559,20 @@ function MinimizedBubble({
|
|
|
2707
2559
|
|
|
2708
2560
|
// src/components/PageActionHandler.tsx
|
|
2709
2561
|
import { useDataChannel as useDataChannel2 } from "@livekit/components-react/hooks";
|
|
2710
|
-
import { useCallback as
|
|
2562
|
+
import { useCallback as useCallback6, useEffect as useEffect11, useRef as useRef8, useState as useState8 } from "react";
|
|
2711
2563
|
|
|
2712
2564
|
// src/components/AgentActivityIndicator.tsx
|
|
2713
|
-
import { useEffect as
|
|
2714
|
-
import { jsx as
|
|
2565
|
+
import { useEffect as useEffect10, useRef as useRef7, useState as useState7 } from "react";
|
|
2566
|
+
import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
2715
2567
|
var Z_INDEX2 = 2147483646;
|
|
2716
2568
|
function centerOf(element) {
|
|
2717
2569
|
const rect = getRectInTopViewport(element);
|
|
2718
2570
|
return { left: rect.left + rect.width / 2, top: rect.top + rect.height / 2 };
|
|
2719
2571
|
}
|
|
2720
2572
|
function AgentActivityIndicator({ target }) {
|
|
2721
|
-
const [position, setPosition] =
|
|
2722
|
-
const frameRef =
|
|
2723
|
-
|
|
2573
|
+
const [position, setPosition] = useState7(null);
|
|
2574
|
+
const frameRef = useRef7(null);
|
|
2575
|
+
useEffect10(() => {
|
|
2724
2576
|
if (!target || !target.element.isConnected) {
|
|
2725
2577
|
setPosition(null);
|
|
2726
2578
|
return;
|
|
@@ -2758,21 +2610,21 @@ function AgentActivityIndicator({ target }) {
|
|
|
2758
2610
|
zIndex: Z_INDEX2,
|
|
2759
2611
|
transition: "left 0.45s cubic-bezier(0.22, 1, 0.36, 1), top 0.45s cubic-bezier(0.22, 1, 0.36, 1)"
|
|
2760
2612
|
};
|
|
2761
|
-
return /* @__PURE__ */
|
|
2613
|
+
return /* @__PURE__ */ jsx5("div", {
|
|
2762
2614
|
"data-skippr-private": "true",
|
|
2763
2615
|
style: containerStyle,
|
|
2764
|
-
children: /* @__PURE__ */
|
|
2616
|
+
children: /* @__PURE__ */ jsxs5("div", {
|
|
2765
2617
|
className: "skippr:relative",
|
|
2766
2618
|
children: [
|
|
2767
|
-
/* @__PURE__ */
|
|
2619
|
+
/* @__PURE__ */ jsx5(MousePointer2, {
|
|
2768
2620
|
"aria-hidden": "true",
|
|
2769
2621
|
className: "skippr:h-5 skippr:w-5 skippr:text-cyan-500 skippr:drop-shadow-[0_1px_3px_rgba(0,0,0,0.35)] skippr:animate-skippr-press",
|
|
2770
2622
|
fill: "currentColor"
|
|
2771
2623
|
}),
|
|
2772
|
-
/* @__PURE__ */
|
|
2624
|
+
/* @__PURE__ */ jsx5("div", {
|
|
2773
2625
|
role: "status",
|
|
2774
2626
|
className: "skippr:absolute skippr:left-5 skippr:top-4 skippr:flex skippr:items-center skippr:gap-1.5 skippr:rounded-full skippr:bg-cyan-500 skippr:px-2.5 skippr:py-1 skippr:shadow-[0_4px_12px_rgba(0,0,0,0.18)]",
|
|
2775
|
-
children: /* @__PURE__ */
|
|
2627
|
+
children: /* @__PURE__ */ jsx5("span", {
|
|
2776
2628
|
className: "skippr:text-[11px] skippr:font-medium skippr:text-white skippr:whitespace-nowrap",
|
|
2777
2629
|
children: target.label
|
|
2778
2630
|
})
|
|
@@ -2783,7 +2635,7 @@ function AgentActivityIndicator({ target }) {
|
|
|
2783
2635
|
}
|
|
2784
2636
|
|
|
2785
2637
|
// src/components/PageActionHandler.tsx
|
|
2786
|
-
import { jsx as
|
|
2638
|
+
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
2787
2639
|
var INDICATOR_LINGER_MS = 1400;
|
|
2788
2640
|
var CURSOR_LEAD_BEFORE_ACTION_MS = 350;
|
|
2789
2641
|
var SETTLE_MS = 250;
|
|
@@ -2927,14 +2779,14 @@ function labelFor(action) {
|
|
|
2927
2779
|
}
|
|
2928
2780
|
}
|
|
2929
2781
|
function PageActionHandler() {
|
|
2930
|
-
const [activity, setActivity] =
|
|
2931
|
-
const mountedRef =
|
|
2932
|
-
const queueRef =
|
|
2933
|
-
const drainingRef =
|
|
2934
|
-
const timersRef =
|
|
2935
|
-
const wakesRef =
|
|
2936
|
-
const indicatorTimerRef =
|
|
2937
|
-
const sleep =
|
|
2782
|
+
const [activity, setActivity] = useState8(null);
|
|
2783
|
+
const mountedRef = useRef8(true);
|
|
2784
|
+
const queueRef = useRef8([]);
|
|
2785
|
+
const drainingRef = useRef8(false);
|
|
2786
|
+
const timersRef = useRef8(new Set);
|
|
2787
|
+
const wakesRef = useRef8(new Set);
|
|
2788
|
+
const indicatorTimerRef = useRef8(null);
|
|
2789
|
+
const sleep = useCallback6((ms) => {
|
|
2938
2790
|
return new Promise((resolve) => {
|
|
2939
2791
|
const wake = () => {
|
|
2940
2792
|
wakesRef.current.delete(wake);
|
|
@@ -2948,7 +2800,7 @@ function PageActionHandler() {
|
|
|
2948
2800
|
timersRef.current.add(timer);
|
|
2949
2801
|
});
|
|
2950
2802
|
}, []);
|
|
2951
|
-
const showActivity =
|
|
2803
|
+
const showActivity = useCallback6((target) => {
|
|
2952
2804
|
if (indicatorTimerRef.current) {
|
|
2953
2805
|
clearTimeout(indicatorTimerRef.current);
|
|
2954
2806
|
indicatorTimerRef.current = null;
|
|
@@ -2963,7 +2815,7 @@ function PageActionHandler() {
|
|
|
2963
2815
|
indicatorTimerRef.current = timer;
|
|
2964
2816
|
}
|
|
2965
2817
|
}, []);
|
|
2966
|
-
const processOne =
|
|
2818
|
+
const processOne = useCallback6(async (action) => {
|
|
2967
2819
|
if (action.type === "navigate") {
|
|
2968
2820
|
queueRef.current.length = 0;
|
|
2969
2821
|
if (!isSameOriginHttpUrl(action.url))
|
|
@@ -2989,7 +2841,7 @@ function PageActionHandler() {
|
|
|
2989
2841
|
runAgentAction(() => performAction(action, element));
|
|
2990
2842
|
await sleep(SETTLE_MS);
|
|
2991
2843
|
}, [showActivity, sleep]);
|
|
2992
|
-
const drain =
|
|
2844
|
+
const drain = useCallback6(async () => {
|
|
2993
2845
|
if (drainingRef.current)
|
|
2994
2846
|
return;
|
|
2995
2847
|
drainingRef.current = true;
|
|
@@ -3004,14 +2856,14 @@ function PageActionHandler() {
|
|
|
3004
2856
|
drainingRef.current = false;
|
|
3005
2857
|
}
|
|
3006
2858
|
}, [processOne]);
|
|
3007
|
-
const onMessage =
|
|
2859
|
+
const onMessage = useCallback6((msg) => {
|
|
3008
2860
|
const action = parsePageAction(msg.payload);
|
|
3009
2861
|
if (!action)
|
|
3010
2862
|
return;
|
|
3011
2863
|
queueRef.current.push(action);
|
|
3012
2864
|
drain();
|
|
3013
2865
|
}, [drain]);
|
|
3014
|
-
|
|
2866
|
+
useEffect11(() => {
|
|
3015
2867
|
mountedRef.current = true;
|
|
3016
2868
|
drainingRef.current = false;
|
|
3017
2869
|
return () => {
|
|
@@ -3030,15 +2882,485 @@ function PageActionHandler() {
|
|
|
3030
2882
|
};
|
|
3031
2883
|
}, []);
|
|
3032
2884
|
useDataChannel2(PAGE_ACTIONS_TOPIC, onMessage);
|
|
3033
|
-
return /* @__PURE__ */
|
|
2885
|
+
return /* @__PURE__ */ jsx6(AgentActivityIndicator, {
|
|
3034
2886
|
target: activity
|
|
3035
2887
|
});
|
|
3036
2888
|
}
|
|
3037
2889
|
|
|
2890
|
+
// src/components/SessionControlBar.tsx
|
|
2891
|
+
import { useContext as useContext5 } from "react";
|
|
2892
|
+
|
|
2893
|
+
// src/hooks/useAgentVoiceState.ts
|
|
2894
|
+
import { useVoiceAssistant } from "@livekit/components-react/hooks";
|
|
2895
|
+
function useAgentVoiceState() {
|
|
2896
|
+
const { state } = useVoiceAssistant();
|
|
2897
|
+
return {
|
|
2898
|
+
state,
|
|
2899
|
+
isSpeaking: state === "speaking",
|
|
2900
|
+
isListening: state === "listening"
|
|
2901
|
+
};
|
|
2902
|
+
}
|
|
2903
|
+
|
|
2904
|
+
// src/hooks/useLiveAgent.ts
|
|
2905
|
+
import { useContext as useContext3 } from "react";
|
|
2906
|
+
function useLiveAgent() {
|
|
2907
|
+
const ctx = useContext3(LiveAgentContext);
|
|
2908
|
+
if (!ctx) {
|
|
2909
|
+
throw new Error("useLiveAgent must be used within a <LiveAgent> provider");
|
|
2910
|
+
}
|
|
2911
|
+
const {
|
|
2912
|
+
usesHostAuth,
|
|
2913
|
+
authFailed,
|
|
2914
|
+
connection,
|
|
2915
|
+
shouldConnect,
|
|
2916
|
+
historyMessages,
|
|
2917
|
+
phasesSnapshot,
|
|
2918
|
+
setPhasesSnapshot,
|
|
2919
|
+
hasResolvedModules,
|
|
2920
|
+
adoptionGoals,
|
|
2921
|
+
startAdoptionSession,
|
|
2922
|
+
launcherBottomPx,
|
|
2923
|
+
setLauncherBottomPx,
|
|
2924
|
+
popsDown,
|
|
2925
|
+
panelExpanded,
|
|
2926
|
+
togglePanelExpanded,
|
|
2927
|
+
...publicValue
|
|
2928
|
+
} = ctx;
|
|
2929
|
+
return publicValue;
|
|
2930
|
+
}
|
|
2931
|
+
|
|
2932
|
+
// src/hooks/useMediaControls.ts
|
|
2933
|
+
import { useLocalParticipant as useLocalParticipant3 } from "@livekit/components-react/hooks";
|
|
2934
|
+
import { ScreenSharePresets as ScreenSharePresets2 } from "livekit-client";
|
|
2935
|
+
import { useCallback as useCallback7 } from "react";
|
|
2936
|
+
var SCREEN_SHARE_OPTIONS = {
|
|
2937
|
+
video: { displaySurface: "browser" },
|
|
2938
|
+
resolution: ScreenSharePresets2.h720fps30.resolution,
|
|
2939
|
+
contentHint: "detail"
|
|
2940
|
+
};
|
|
2941
|
+
function useMediaControls() {
|
|
2942
|
+
const { localParticipant } = useLocalParticipant3();
|
|
2943
|
+
const isMuted = !localParticipant.isMicrophoneEnabled;
|
|
2944
|
+
const isScreenSharing = localParticipant.isScreenShareEnabled;
|
|
2945
|
+
const toggleMute = useCallback7(async () => {
|
|
2946
|
+
try {
|
|
2947
|
+
await localParticipant.setMicrophoneEnabled(isMuted);
|
|
2948
|
+
} catch (error) {
|
|
2949
|
+
console.error("Failed to toggle microphone:", error);
|
|
2950
|
+
}
|
|
2951
|
+
}, [localParticipant, isMuted]);
|
|
2952
|
+
const toggleScreenShare = useCallback7(async () => {
|
|
2953
|
+
try {
|
|
2954
|
+
await localParticipant.setScreenShareEnabled(!isScreenSharing, SCREEN_SHARE_OPTIONS);
|
|
2955
|
+
} catch (error) {
|
|
2956
|
+
console.error("Failed to toggle screen share:", error);
|
|
2957
|
+
}
|
|
2958
|
+
}, [localParticipant, isScreenSharing]);
|
|
2959
|
+
return { isMuted, toggleMute, isScreenSharing, toggleScreenShare };
|
|
2960
|
+
}
|
|
2961
|
+
|
|
2962
|
+
// src/hooks/useMicLevel.ts
|
|
2963
|
+
import { useLocalParticipant as useLocalParticipant4 } from "@livekit/components-react/hooks";
|
|
2964
|
+
import { useEffect as useEffect12, useRef as useRef9, useState as useState9 } from "react";
|
|
2965
|
+
var MIC_BARS = 5;
|
|
2966
|
+
var IDLE_BAR_HEIGHT_PX = 5;
|
|
2967
|
+
var MAX_BAR_GROWTH_PX = 17;
|
|
2968
|
+
var BAR_NOISE_GATE = 0.25;
|
|
2969
|
+
var TALKING_LEVEL_THRESHOLD = 0.2;
|
|
2970
|
+
var TALKING_HOLD_MS = 400;
|
|
2971
|
+
function useMicLevel(enabled) {
|
|
2972
|
+
const { microphoneTrack } = useLocalParticipant4();
|
|
2973
|
+
const barRefs = useRef9([]);
|
|
2974
|
+
const [isTalking, setIsTalking] = useState9(false);
|
|
2975
|
+
const mediaStreamTrack = microphoneTrack?.track?.mediaStreamTrack;
|
|
2976
|
+
useEffect12(() => {
|
|
2977
|
+
if (!enabled || !mediaStreamTrack) {
|
|
2978
|
+
for (const bar of barRefs.current) {
|
|
2979
|
+
if (bar)
|
|
2980
|
+
bar.style.height = `${IDLE_BAR_HEIGHT_PX}px`;
|
|
2981
|
+
}
|
|
2982
|
+
setIsTalking(false);
|
|
2983
|
+
return;
|
|
2984
|
+
}
|
|
2985
|
+
const AudioContextCtor = window.AudioContext ?? window.webkitAudioContext;
|
|
2986
|
+
const audioContext = new AudioContextCtor;
|
|
2987
|
+
const analyser = audioContext.createAnalyser();
|
|
2988
|
+
analyser.fftSize = 64;
|
|
2989
|
+
analyser.smoothingTimeConstant = 0.6;
|
|
2990
|
+
audioContext.createMediaStreamSource(new MediaStream([mediaStreamTrack])).connect(analyser);
|
|
2991
|
+
const frequencyData = new Uint8Array(analyser.frequencyBinCount);
|
|
2992
|
+
let rafId = 0;
|
|
2993
|
+
let talkingHoldUntil = 0;
|
|
2994
|
+
const tick = () => {
|
|
2995
|
+
analyser.getByteFrequencyData(frequencyData);
|
|
2996
|
+
let levelSum = 0;
|
|
2997
|
+
for (let i = 0;i < MIC_BARS; i++) {
|
|
2998
|
+
const binIndex = 1 + Math.floor(i / MIC_BARS * (frequencyData.length - 2));
|
|
2999
|
+
const level = (frequencyData[binIndex] ?? 0) / 255;
|
|
3000
|
+
const gatedLevel = Math.max(0, level - BAR_NOISE_GATE) / (1 - BAR_NOISE_GATE);
|
|
3001
|
+
levelSum += gatedLevel;
|
|
3002
|
+
const bar = barRefs.current[i];
|
|
3003
|
+
if (bar) {
|
|
3004
|
+
bar.style.height = `${IDLE_BAR_HEIGHT_PX + Math.min(1, gatedLevel * 1.8) * MAX_BAR_GROWTH_PX}px`;
|
|
3005
|
+
}
|
|
3006
|
+
}
|
|
3007
|
+
const now = performance.now();
|
|
3008
|
+
if (levelSum / MIC_BARS > TALKING_LEVEL_THRESHOLD) {
|
|
3009
|
+
talkingHoldUntil = now + TALKING_HOLD_MS;
|
|
3010
|
+
}
|
|
3011
|
+
const talking = now < talkingHoldUntil;
|
|
3012
|
+
setIsTalking((prev) => prev === talking ? prev : talking);
|
|
3013
|
+
rafId = requestAnimationFrame(tick);
|
|
3014
|
+
};
|
|
3015
|
+
rafId = requestAnimationFrame(tick);
|
|
3016
|
+
return () => {
|
|
3017
|
+
cancelAnimationFrame(rafId);
|
|
3018
|
+
audioContext.close().catch(() => {});
|
|
3019
|
+
setIsTalking(false);
|
|
3020
|
+
};
|
|
3021
|
+
}, [enabled, mediaStreamTrack]);
|
|
3022
|
+
return { barRefs, isTalking };
|
|
3023
|
+
}
|
|
3024
|
+
|
|
3025
|
+
// src/hooks/usePhaseUpdates.ts
|
|
3026
|
+
import { useCallback as useCallback8, useContext as useContext4, useEffect as useEffect14 } from "react";
|
|
3027
|
+
|
|
3028
|
+
// src/hooks/useAgentState.ts
|
|
3029
|
+
import { useRemoteParticipants } from "@livekit/components-react/hooks";
|
|
3030
|
+
import { useEffect as useEffect13, useState as useState10 } from "react";
|
|
3031
|
+
function useAgentState(attributeKey, parse, initial) {
|
|
3032
|
+
const [value, setValue] = useState10(initial);
|
|
3033
|
+
const remoteParticipants = useRemoteParticipants();
|
|
3034
|
+
useEffect13(() => {
|
|
3035
|
+
const agentParticipant = remoteParticipants.find((p) => p.attributes?.[attributeKey]);
|
|
3036
|
+
if (agentParticipant) {
|
|
3037
|
+
const attr = agentParticipant.attributes?.[attributeKey];
|
|
3038
|
+
if (attr) {
|
|
3039
|
+
const parsed = parse(attr);
|
|
3040
|
+
if (parsed)
|
|
3041
|
+
setValue(parsed);
|
|
3042
|
+
}
|
|
3043
|
+
}
|
|
3044
|
+
const handlers = new Map;
|
|
3045
|
+
for (const p of remoteParticipants) {
|
|
3046
|
+
const handler = (changedAttributes) => {
|
|
3047
|
+
if (changedAttributes[attributeKey]) {
|
|
3048
|
+
const parsed = parse(changedAttributes[attributeKey]);
|
|
3049
|
+
if (parsed)
|
|
3050
|
+
setValue(parsed);
|
|
3051
|
+
} else if (p.attributes?.[attributeKey]) {
|
|
3052
|
+
const parsed = parse(p.attributes[attributeKey]);
|
|
3053
|
+
if (parsed)
|
|
3054
|
+
setValue(parsed);
|
|
3055
|
+
}
|
|
3056
|
+
};
|
|
3057
|
+
handlers.set(p, handler);
|
|
3058
|
+
p.on("attributesChanged", handler);
|
|
3059
|
+
}
|
|
3060
|
+
return () => {
|
|
3061
|
+
for (const [p, handler] of handlers) {
|
|
3062
|
+
p.off("attributesChanged", handler);
|
|
3063
|
+
}
|
|
3064
|
+
};
|
|
3065
|
+
}, [remoteParticipants, attributeKey, parse]);
|
|
3066
|
+
return value;
|
|
3067
|
+
}
|
|
3068
|
+
|
|
3069
|
+
// src/hooks/usePhaseUpdates.ts
|
|
3070
|
+
function parsePhases(json) {
|
|
3071
|
+
try {
|
|
3072
|
+
const data = JSON.parse(json);
|
|
3073
|
+
if (data.type === "phase_update" && Array.isArray(data.phases)) {
|
|
3074
|
+
return data.phases;
|
|
3075
|
+
}
|
|
3076
|
+
} catch {}
|
|
3077
|
+
return null;
|
|
3078
|
+
}
|
|
3079
|
+
function usePhaseUpdates() {
|
|
3080
|
+
const parse = useCallback8(parsePhases, []);
|
|
3081
|
+
const livePhases = useAgentState("phases", parse, []);
|
|
3082
|
+
const ctx = useContext4(LiveAgentContext);
|
|
3083
|
+
useEffect14(() => {
|
|
3084
|
+
if (livePhases.length > 0)
|
|
3085
|
+
ctx?.setPhasesSnapshot(livePhases);
|
|
3086
|
+
}, [livePhases, ctx?.setPhasesSnapshot]);
|
|
3087
|
+
const phases = livePhases.length > 0 ? livePhases : ctx?.phasesSnapshot ?? [];
|
|
3088
|
+
return { phases };
|
|
3089
|
+
}
|
|
3090
|
+
|
|
3091
|
+
// src/components/SessionControlBar.tsx
|
|
3092
|
+
import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
3093
|
+
var STANDBY_BAR_WIDTH = 168;
|
|
3094
|
+
var READY_BAR_WIDTH = 176;
|
|
3095
|
+
var TEXT_BAR_WIDTH = 64;
|
|
3096
|
+
var SCREEN_SHARE_EXTRA_WIDTH = 56;
|
|
3097
|
+
var MIC_REGION_WIDTH = 104;
|
|
3098
|
+
var MIC_SQUARE_WIDTH = 48;
|
|
3099
|
+
var SQUARE_BUTTON = "skippr:flex skippr:size-12 skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-2xl skippr:cursor-pointer skippr:transition-colors";
|
|
3100
|
+
function AgentActivity({ state }) {
|
|
3101
|
+
return /* @__PURE__ */ jsxs6("span", {
|
|
3102
|
+
role: "status",
|
|
3103
|
+
className: "skippr:flex skippr:h-5 skippr:w-12 skippr:shrink-0 skippr:items-center skippr:justify-center skippr:text-bubble",
|
|
3104
|
+
"aria-label": `Agent is ${state}`,
|
|
3105
|
+
children: [
|
|
3106
|
+
state === "speaking" && /* @__PURE__ */ jsxs6("span", {
|
|
3107
|
+
className: "skippr:flex skippr:h-5 skippr:items-center skippr:gap-[2px]",
|
|
3108
|
+
children: [
|
|
3109
|
+
/* @__PURE__ */ jsx7("span", {
|
|
3110
|
+
className: "skippr:h-2 skippr:w-[2px] skippr:rounded-full skippr:bg-current skippr:[animation:skippr-speak_1.1s_ease-in-out_infinite]"
|
|
3111
|
+
}),
|
|
3112
|
+
/* @__PURE__ */ jsx7("span", {
|
|
3113
|
+
className: "skippr:h-4 skippr:w-[2px] skippr:rounded-full skippr:bg-current skippr:[animation:skippr-speak_1.1s_ease-in-out_0.15s_infinite]"
|
|
3114
|
+
}),
|
|
3115
|
+
/* @__PURE__ */ jsx7("span", {
|
|
3116
|
+
className: "skippr:h-2.5 skippr:w-[2px] skippr:rounded-full skippr:bg-current skippr:[animation:skippr-speak_1.1s_ease-in-out_0.3s_infinite]"
|
|
3117
|
+
}),
|
|
3118
|
+
/* @__PURE__ */ jsx7("span", {
|
|
3119
|
+
className: "skippr:h-3.5 skippr:w-[2px] skippr:rounded-full skippr:bg-current skippr:[animation:skippr-speak_1.1s_ease-in-out_0.45s_infinite]"
|
|
3120
|
+
})
|
|
3121
|
+
]
|
|
3122
|
+
}),
|
|
3123
|
+
state === "thinking" && /* @__PURE__ */ jsxs6("span", {
|
|
3124
|
+
className: "skippr:flex skippr:items-center skippr:gap-[3px]",
|
|
3125
|
+
children: [
|
|
3126
|
+
/* @__PURE__ */ jsx7("span", {
|
|
3127
|
+
className: "skippr:size-[5px] skippr:rounded-full skippr:bg-current skippr:animate-bounce skippr:[animation-delay:0ms]"
|
|
3128
|
+
}),
|
|
3129
|
+
/* @__PURE__ */ jsx7("span", {
|
|
3130
|
+
className: "skippr:size-[5px] skippr:rounded-full skippr:bg-current skippr:animate-bounce skippr:[animation-delay:150ms]"
|
|
3131
|
+
}),
|
|
3132
|
+
/* @__PURE__ */ jsx7("span", {
|
|
3133
|
+
className: "skippr:size-[5px] skippr:rounded-full skippr:bg-current skippr:animate-bounce skippr:[animation-delay:300ms]"
|
|
3134
|
+
})
|
|
3135
|
+
]
|
|
3136
|
+
}),
|
|
3137
|
+
state === "listening" && /* @__PURE__ */ jsxs6("svg", {
|
|
3138
|
+
viewBox: "0 0 24 24",
|
|
3139
|
+
className: "skippr:size-5",
|
|
3140
|
+
fill: "none",
|
|
3141
|
+
stroke: "currentColor",
|
|
3142
|
+
strokeWidth: "2",
|
|
3143
|
+
strokeLinecap: "round",
|
|
3144
|
+
strokeLinejoin: "round",
|
|
3145
|
+
"aria-hidden": "true",
|
|
3146
|
+
children: [
|
|
3147
|
+
/* @__PURE__ */ jsx7("path", {
|
|
3148
|
+
d: "M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z"
|
|
3149
|
+
}),
|
|
3150
|
+
/* @__PURE__ */ jsx7("circle", {
|
|
3151
|
+
cx: "12",
|
|
3152
|
+
cy: "12",
|
|
3153
|
+
r: "2.5",
|
|
3154
|
+
fill: "currentColor",
|
|
3155
|
+
stroke: "none",
|
|
3156
|
+
className: "skippr:origin-center skippr:[animation:skippr-banner-look_2.4s_ease-in-out_infinite]"
|
|
3157
|
+
})
|
|
3158
|
+
]
|
|
3159
|
+
})
|
|
3160
|
+
]
|
|
3161
|
+
});
|
|
3162
|
+
}
|
|
3163
|
+
function SessionControlBar() {
|
|
3164
|
+
const {
|
|
3165
|
+
expandPanel,
|
|
3166
|
+
minimizePanel,
|
|
3167
|
+
isPanelOpen,
|
|
3168
|
+
pauseSession,
|
|
3169
|
+
isPausing,
|
|
3170
|
+
captureMode,
|
|
3171
|
+
setSidebarTab,
|
|
3172
|
+
activeModule,
|
|
3173
|
+
position
|
|
3174
|
+
} = useLiveAgent();
|
|
3175
|
+
const internalCtx = useContext5(LiveAgentContext);
|
|
3176
|
+
const textMode = internalCtx?.textMode ?? false;
|
|
3177
|
+
const launcherBottomPx = internalCtx?.launcherBottomPx ?? DEFAULT_LAUNCHER_BOTTOM_PX;
|
|
3178
|
+
const popsDown = internalCtx?.popsDown ?? false;
|
|
3179
|
+
const { isMuted, toggleMute, isScreenSharing, toggleScreenShare } = useMediaControls();
|
|
3180
|
+
const { state } = useAgentVoiceState();
|
|
3181
|
+
const { phases } = usePhaseUpdates();
|
|
3182
|
+
const isReady = state === "listening" || state === "thinking" || state === "speaking";
|
|
3183
|
+
const { barRefs, isTalking } = useMicLevel(isReady && !isMuted && !textMode);
|
|
3184
|
+
const showScreenShareToggle = captureMode === "screenshare";
|
|
3185
|
+
const screenShareExtra = showScreenShareToggle ? SCREEN_SHARE_EXTRA_WIDTH : 0;
|
|
3186
|
+
let barWidth = STANDBY_BAR_WIDTH;
|
|
3187
|
+
if (isReady) {
|
|
3188
|
+
barWidth = textMode ? TEXT_BAR_WIDTH + screenShareExtra : READY_BAR_WIDTH + screenShareExtra;
|
|
3189
|
+
}
|
|
3190
|
+
const agendaModule = activeModule && activeModule.mode !== AGENT_MODE.AlwaysOn && activeModule.totalPhases > 0 ? activeModule : null;
|
|
3191
|
+
const agendaProgress = phases.length > 0 ? {
|
|
3192
|
+
completed: phases.filter((phase) => phase.status === "completed").length,
|
|
3193
|
+
total: phases.length
|
|
3194
|
+
} : agendaModule ? {
|
|
3195
|
+
completed: agendaModule.currentSession?.currentPhaseIndex ?? 0,
|
|
3196
|
+
total: agendaModule.totalPhases
|
|
3197
|
+
} : null;
|
|
3198
|
+
const currentPhaseName = phases.find((phase) => phase.status === "active")?.name ?? phases.find((phase) => phase.status === "pending")?.name;
|
|
3199
|
+
const openAgenda = () => {
|
|
3200
|
+
setSidebarTab("agenda");
|
|
3201
|
+
expandPanel();
|
|
3202
|
+
};
|
|
3203
|
+
const togglePanel = () => {
|
|
3204
|
+
if (isPanelOpen) {
|
|
3205
|
+
minimizePanel();
|
|
3206
|
+
return;
|
|
3207
|
+
}
|
|
3208
|
+
setSidebarTab(agendaModule && !textMode ? "agenda" : "chat");
|
|
3209
|
+
expandPanel();
|
|
3210
|
+
};
|
|
3211
|
+
return /* @__PURE__ */ jsxs6("div", {
|
|
3212
|
+
style: { bottom: launcherBottomPx },
|
|
3213
|
+
className: cn("skippr:fixed skippr:z-[9999]", position === "right" ? "skippr:right-3" : "skippr:left-3"),
|
|
3214
|
+
children: [
|
|
3215
|
+
!isPanelOpen && agendaModule && agendaProgress && /* @__PURE__ */ jsx7("div", {
|
|
3216
|
+
className: cn("skippr:absolute", popsDown ? "skippr:top-full skippr:mt-3" : "skippr:bottom-full skippr:mb-3", position === "right" ? "skippr:right-0" : "skippr:left-0"),
|
|
3217
|
+
children: /* @__PURE__ */ jsx7(ModulePill, {
|
|
3218
|
+
module: agendaModule,
|
|
3219
|
+
onSelect: openAgenda,
|
|
3220
|
+
progress: agendaProgress,
|
|
3221
|
+
label: currentPhaseName ?? agendaModule.name,
|
|
3222
|
+
isLive: true
|
|
3223
|
+
})
|
|
3224
|
+
}),
|
|
3225
|
+
/* @__PURE__ */ jsxs6("div", {
|
|
3226
|
+
style: { width: barWidth },
|
|
3227
|
+
className: cn("skippr:group skippr:relative skippr:flex skippr:h-16 skippr:items-center skippr:justify-center skippr:gap-2", "skippr:rounded-[20px] skippr:bg-white skippr:p-2", "skippr:shadow-[0_10px_32px_rgba(0,0,0,0.18)] skippr:ring-1 skippr:ring-black/5", "skippr:transition-[width] skippr:duration-300 skippr:ease-out", "skippr:[animation:skippr-toolset-pop_440ms_cubic-bezier(0.22,1,0.36,1)]"),
|
|
3228
|
+
children: [
|
|
3229
|
+
!isReady && /* @__PURE__ */ jsxs6("span", {
|
|
3230
|
+
className: "skippr:flex skippr:h-12 skippr:items-center skippr:justify-center skippr:gap-2 skippr:text-[13px] skippr:font-medium skippr:text-bubble skippr:[animation:skippr-stage-fade_240ms_ease-out]",
|
|
3231
|
+
children: [
|
|
3232
|
+
/* @__PURE__ */ jsxs6("span", {
|
|
3233
|
+
className: "skippr:flex skippr:items-center skippr:gap-[3px]",
|
|
3234
|
+
children: [
|
|
3235
|
+
/* @__PURE__ */ jsx7("span", {
|
|
3236
|
+
className: "skippr:size-1.5 skippr:rounded-full skippr:bg-bubble skippr:animate-bounce skippr:[animation-delay:0ms]"
|
|
3237
|
+
}),
|
|
3238
|
+
/* @__PURE__ */ jsx7("span", {
|
|
3239
|
+
className: "skippr:size-1.5 skippr:rounded-full skippr:bg-bubble skippr:animate-bounce skippr:[animation-delay:150ms]"
|
|
3240
|
+
}),
|
|
3241
|
+
/* @__PURE__ */ jsx7("span", {
|
|
3242
|
+
className: "skippr:size-1.5 skippr:rounded-full skippr:bg-bubble skippr:animate-bounce skippr:[animation-delay:300ms]"
|
|
3243
|
+
})
|
|
3244
|
+
]
|
|
3245
|
+
}),
|
|
3246
|
+
/* @__PURE__ */ jsx7("span", {
|
|
3247
|
+
children: "Standing by…"
|
|
3248
|
+
})
|
|
3249
|
+
]
|
|
3250
|
+
}),
|
|
3251
|
+
isReady && /* @__PURE__ */ jsxs6("div", {
|
|
3252
|
+
className: "skippr:flex skippr:items-center skippr:gap-2 skippr:[animation:skippr-stage-fade_240ms_ease-out]",
|
|
3253
|
+
children: [
|
|
3254
|
+
!textMode && /* @__PURE__ */ jsxs6("div", {
|
|
3255
|
+
className: "skippr:relative skippr:h-12",
|
|
3256
|
+
style: { width: MIC_REGION_WIDTH },
|
|
3257
|
+
children: [
|
|
3258
|
+
!isTalking && /* @__PURE__ */ jsx7("span", {
|
|
3259
|
+
className: "skippr:absolute skippr:inset-y-0 skippr:right-[-3px] skippr:flex skippr:w-14 skippr:items-center skippr:justify-center skippr:[animation:skippr-agent-in_200ms_ease-out_240ms_both]",
|
|
3260
|
+
children: /* @__PURE__ */ jsx7(AgentActivity, {
|
|
3261
|
+
state
|
|
3262
|
+
})
|
|
3263
|
+
}),
|
|
3264
|
+
/* @__PURE__ */ jsxs6("div", {
|
|
3265
|
+
className: "skippr:absolute skippr:top-0 skippr:left-0 skippr:z-10 skippr:flex skippr:h-12 skippr:items-center skippr:gap-2.5 skippr:overflow-hidden skippr:rounded-2xl skippr:bg-bubble skippr:pl-3.5 skippr:text-white skippr:transition-[width] skippr:duration-300 skippr:ease-out",
|
|
3266
|
+
style: { width: isTalking ? MIC_REGION_WIDTH : MIC_SQUARE_WIDTH },
|
|
3267
|
+
children: [
|
|
3268
|
+
/* @__PURE__ */ jsx7("button", {
|
|
3269
|
+
type: "button",
|
|
3270
|
+
onClick: () => void toggleMute(),
|
|
3271
|
+
"aria-label": isMuted ? "Unmute" : "Mute",
|
|
3272
|
+
className: cn("skippr:flex skippr:shrink-0 skippr:items-center skippr:justify-center skippr:cursor-pointer skippr:transition-colors", isMuted ? "skippr:text-red-400 skippr:hover:text-red-300" : "skippr:text-white skippr:hover:text-white/80"),
|
|
3273
|
+
children: isMuted ? /* @__PURE__ */ jsx7(MicOff, {
|
|
3274
|
+
className: "skippr:size-5"
|
|
3275
|
+
}) : /* @__PURE__ */ jsx7(Mic, {
|
|
3276
|
+
className: "skippr:size-5"
|
|
3277
|
+
})
|
|
3278
|
+
}),
|
|
3279
|
+
/* @__PURE__ */ jsx7("span", {
|
|
3280
|
+
className: cn("skippr:flex skippr:h-6 skippr:flex-1 skippr:items-center skippr:justify-center skippr:gap-[3px] skippr:transition-opacity skippr:duration-200", isTalking ? "skippr:opacity-100" : "skippr:opacity-0"),
|
|
3281
|
+
children: Array.from({ length: MIC_BARS }).map((_, index2) => /* @__PURE__ */ jsx7("span", {
|
|
3282
|
+
ref: (el) => {
|
|
3283
|
+
barRefs.current[index2] = el;
|
|
3284
|
+
},
|
|
3285
|
+
className: "skippr:w-[3px] skippr:rounded-full skippr:bg-white skippr:transition-[height] skippr:duration-75",
|
|
3286
|
+
style: { height: 5 }
|
|
3287
|
+
}, index2))
|
|
3288
|
+
})
|
|
3289
|
+
]
|
|
3290
|
+
})
|
|
3291
|
+
]
|
|
3292
|
+
}),
|
|
3293
|
+
showScreenShareToggle && /* @__PURE__ */ jsx7("button", {
|
|
3294
|
+
type: "button",
|
|
3295
|
+
onClick: () => void toggleScreenShare(),
|
|
3296
|
+
"aria-label": isScreenSharing ? "Stop sharing screen" : "Share screen",
|
|
3297
|
+
className: cn(SQUARE_BUTTON, isScreenSharing ? "skippr:bg-bubble skippr:text-white skippr:hover:bg-[#3a384b]" : "skippr:bg-neutral-100 skippr:text-neutral-700 skippr:hover:bg-neutral-200"),
|
|
3298
|
+
children: isScreenSharing ? /* @__PURE__ */ jsx7(MonitorOff, {
|
|
3299
|
+
className: "skippr:size-5"
|
|
3300
|
+
}) : /* @__PURE__ */ jsx7(Monitor, {
|
|
3301
|
+
className: "skippr:size-5"
|
|
3302
|
+
})
|
|
3303
|
+
}),
|
|
3304
|
+
/* @__PURE__ */ jsx7("button", {
|
|
3305
|
+
type: "button",
|
|
3306
|
+
onClick: togglePanel,
|
|
3307
|
+
"aria-label": isPanelOpen ? "Close panel" : agendaModule && !textMode ? "Open agenda" : "Open chat",
|
|
3308
|
+
className: cn(SQUARE_BUTTON, "skippr:text-neutral-700", textMode ? "skippr:hover:bg-neutral-100" : "skippr:bg-neutral-100 skippr:hover:bg-neutral-200"),
|
|
3309
|
+
children: /* @__PURE__ */ jsx7(MessageSquare, {
|
|
3310
|
+
className: "skippr:size-5"
|
|
3311
|
+
})
|
|
3312
|
+
})
|
|
3313
|
+
]
|
|
3314
|
+
}, textMode ? "ready-text" : "ready"),
|
|
3315
|
+
isReady && /* @__PURE__ */ jsxs6("button", {
|
|
3316
|
+
type: "button",
|
|
3317
|
+
onClick: () => void pauseSession(),
|
|
3318
|
+
disabled: isPausing,
|
|
3319
|
+
"aria-label": "Pause session",
|
|
3320
|
+
"aria-busy": isPausing,
|
|
3321
|
+
className: cn("skippr:absolute skippr:-top-2 skippr:-right-2 skippr:z-20 skippr:flex skippr:size-6 skippr:items-center skippr:justify-center", "skippr:rounded-full skippr:bg-bubble skippr:text-white", "skippr:shadow-[0_4px_14px_rgba(0,0,0,0.3)]", "skippr:transition-opacity skippr:duration-150", isPausing ? "skippr:opacity-100 skippr:cursor-default" : "skippr:opacity-0 skippr:cursor-pointer skippr:hover:bg-[#3a384b] skippr:group-hover:opacity-100 skippr:focus-visible:opacity-100"),
|
|
3322
|
+
children: [
|
|
3323
|
+
/* @__PURE__ */ jsx7(X, {
|
|
3324
|
+
className: cn("skippr:size-3.5 skippr:transition-opacity skippr:duration-200", isPausing && "skippr:opacity-40"),
|
|
3325
|
+
strokeWidth: 2.5
|
|
3326
|
+
}),
|
|
3327
|
+
isPausing && /* @__PURE__ */ jsxs6("svg", {
|
|
3328
|
+
viewBox: "0 0 24 24",
|
|
3329
|
+
fill: "none",
|
|
3330
|
+
"aria-hidden": "true",
|
|
3331
|
+
className: "skippr:absolute skippr:inset-0 skippr:size-full skippr:animate-spin skippr:motion-reduce:hidden",
|
|
3332
|
+
children: [
|
|
3333
|
+
/* @__PURE__ */ jsx7("circle", {
|
|
3334
|
+
cx: "12",
|
|
3335
|
+
cy: "12",
|
|
3336
|
+
r: "10.5",
|
|
3337
|
+
stroke: "white",
|
|
3338
|
+
strokeOpacity: "0.2",
|
|
3339
|
+
strokeWidth: "1.5"
|
|
3340
|
+
}),
|
|
3341
|
+
/* @__PURE__ */ jsx7("circle", {
|
|
3342
|
+
cx: "12",
|
|
3343
|
+
cy: "12",
|
|
3344
|
+
r: "10.5",
|
|
3345
|
+
stroke: "white",
|
|
3346
|
+
strokeWidth: "1.5",
|
|
3347
|
+
strokeLinecap: "round",
|
|
3348
|
+
strokeDasharray: "17 49"
|
|
3349
|
+
})
|
|
3350
|
+
]
|
|
3351
|
+
})
|
|
3352
|
+
]
|
|
3353
|
+
})
|
|
3354
|
+
]
|
|
3355
|
+
})
|
|
3356
|
+
]
|
|
3357
|
+
});
|
|
3358
|
+
}
|
|
3359
|
+
|
|
3038
3360
|
// src/components/ShadowHost.tsx
|
|
3039
|
-
import { useLayoutEffect, useRef as
|
|
3361
|
+
import { useLayoutEffect, useRef as useRef10, useState as useState11 } from "react";
|
|
3040
3362
|
import { createPortal } from "react-dom";
|
|
3041
|
-
import { jsx as jsx8, Fragment
|
|
3363
|
+
import { jsx as jsx8, Fragment } from "react/jsx-runtime";
|
|
3042
3364
|
var PROPERTIES_STYLE_ID = "skippr-tw-properties";
|
|
3043
3365
|
var PROPERTY_RULE = /@property\s+[^{]+\{[^}]*\}/g;
|
|
3044
3366
|
function hoistTailwindProperties(css) {
|
|
@@ -3053,10 +3375,10 @@ function hoistTailwindProperties(css) {
|
|
|
3053
3375
|
return css.replace(PROPERTY_RULE, "");
|
|
3054
3376
|
}
|
|
3055
3377
|
function ShadowHost({ children }) {
|
|
3056
|
-
const hostRef =
|
|
3057
|
-
const [shadowRoot, setShadowRoot] =
|
|
3378
|
+
const hostRef = useRef10(null);
|
|
3379
|
+
const [shadowRoot, setShadowRoot] = useState11(null);
|
|
3058
3380
|
const css = `/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
|
|
3059
|
-
@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-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking: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-400:oklch(70.4% .191 22.216);--skippr-color-red-700:oklch(50.5% .213 27.518);--skippr-color-amber-400:oklch(82.8% .189 84.429);--skippr-color-emerald-400:oklch(76.5% .177 163.223);--skippr-color-cyan-400:oklch(78.9% .154 211.53);--skippr-color-cyan-500:oklch(71.5% .143 215.221);--skippr-color-cyan-900:oklch(39.8% .07 227.392);--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-tracking-wide:.025em;--skippr-tracking-wider:.05em;--skippr-leading-tight:1.25;--skippr-leading-snug:1.375;--skippr-leading-relaxed:1.625;--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\\:top-0{top:calc(var(--skippr-spacing)*0)}.skippr\\:top-4{top:calc(var(--skippr-spacing)*4)}.skippr\\:top-full{top:100%}.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-2{bottom:calc(var(--skippr-spacing)*-2)}.skippr\\:-bottom-9{bottom:calc(var(--skippr-spacing)*-9)}.skippr\\:bottom-0{bottom:calc(var(--skippr-spacing)*0)}.skippr\\:bottom-6{bottom:calc(var(--skippr-spacing)*6)}.skippr\\:bottom-20{bottom:calc(var(--skippr-spacing)*20)}.skippr\\:bottom-\\[88px\\]{bottom:88px}.skippr\\:bottom-full{bottom:100%}.skippr\\:left-0{left:calc(var(--skippr-spacing)*0)}.skippr\\:left-1\\/2{left:50%}.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-\\[9998\\]{z-index:9998}.skippr\\:z-\\[9999\\]{z-index:9999}.skippr\\:col-span-2{grid-column:span 2/span 2}.skippr\\:mx-auto{margin-inline:auto}.skippr\\:-mt-\\[5px\\]{margin-top:-5px}.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-3{margin-top:calc(var(--skippr-spacing)*3)}.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\\:line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.skippr\\:line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.skippr\\:flex{display:flex}.skippr\\:grid{display:grid}.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\\.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-11{width:calc(var(--skippr-spacing)*11);height:calc(var(--skippr-spacing)*11)}.skippr\\:size-12{width:calc(var(--skippr-spacing)*12);height:calc(var(--skippr-spacing)*12)}.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-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-12{height:calc(var(--skippr-spacing)*12)}.skippr\\:h-\\[min\\(460px\\,calc\\(100vh-200px\\)\\)\\]{height:min(460px,100vh - 200px)}.skippr\\:h-full{height:100%}.skippr\\:min-h-0{min-height:calc(var(--skippr-spacing)*0)}.skippr\\:w-0{width:calc(var(--skippr-spacing)*0)}.skippr\\:w-3{width:calc(var(--skippr-spacing)*3)}.skippr\\:w-4{width:calc(var(--skippr-spacing)*4)}.skippr\\:w-5{width:calc(var(--skippr-spacing)*5)}.skippr\\:w-9{width:calc(var(--skippr-spacing)*9)}.skippr\\:w-10{width:calc(var(--skippr-spacing)*10)}.skippr\\:w-\\[2px\\]{width:2px}.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\\:min-w-0{min-width:calc(var(--skippr-spacing)*0)}.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\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-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\\:rotate-\\[225deg\\]{rotate:225deg}.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-press{animation:.5s ease-in-out skippr-press}.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-pointer{cursor:pointer}.skippr\\:resize-none{resize:none}.skippr\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.skippr\\:flex-col{flex-direction:column}.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\\: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-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-2xl{border-radius:1.125rem}.skippr\\:rounded-\\[1rem\\]{border-radius:1rem}.skippr\\:rounded-\\[10px\\]{border-radius:10px}.skippr\\:rounded-\\[14px\\]{border-radius:14px}.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\\: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-border{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-cyan-400{border-color:var(--skippr-color-cyan-400)}.skippr\\:border-destructive\\/20{border-color:oklab(61.4357% .15892 .0698893/.2)}.skippr\\:border-input{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-primary\\/20{border-color:oklab(29.9244% .0107414 -.0305411/.2)}.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-amber-400{background-color:var(--skippr-color-amber-400)}.skippr\\:bg-background{background-color:oklch(100% 0 0)}.skippr\\:bg-bubble{background-color:#2d2b3d}.skippr\\:bg-bubble\\/15{background-color:oklab(29.9244% .0107414 -.0305411/.15)}.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-cyan-400{background-color:var(--skippr-color-cyan-400)}.skippr\\:bg-cyan-500{background-color:var(--skippr-color-cyan-500)}.skippr\\:bg-destructive{background-color:#d94f4f}.skippr\\:bg-destructive\\/10{background-color:oklab(61.4357% .15892 .0698893/.1)}.skippr\\:bg-destructive\\/15{background-color:oklab(61.4357% .15892 .0698893/.15)}.skippr\\:bg-emerald-400{background-color:var(--skippr-color-emerald-400)}.skippr\\:bg-foreground{background-color:oklch(14.7% .004 49.25)}.skippr\\:bg-muted{background-color:oklch(97% .001 106.424)}.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-primary{background-color:#2d2b3d}.skippr\\:bg-primary-foreground\\/15{background-color:oklab(100% 0 5.96046e-8/.15)}.skippr\\:bg-primary-foreground\\/20{background-color:oklab(100% 0 5.96046e-8/.2)}.skippr\\:bg-primary\\/10{background-color:oklab(29.9244% .0107414 -.0305411/.1)}.skippr\\:bg-red-50{background-color:var(--skippr-color-red-50)}.skippr\\:bg-red-400{background-color:var(--skippr-color-red-400)}.skippr\\:bg-secondary{background-color:#ffdfb5}.skippr\\:bg-transparent{background-color:#0000}.skippr\\:bg-white{background-color:var(--skippr-color-white)}.skippr\\:bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.skippr\\:from-background{--tw-gradient-from:oklch(100% 0 0);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.skippr\\:to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.skippr\\:fill-primary\\/30{fill:oklab(29.9244% .0107414 -.0305411/.3)}.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-6{padding:calc(var(--skippr-spacing)*6)}.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-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\\:pt-3{padding-top:calc(var(--skippr-spacing)*3)}.skippr\\:pr-1\\.5{padding-right:calc(var(--skippr-spacing)*1.5)}.skippr\\:pb-5{padding-bottom:calc(var(--skippr-spacing)*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-\\[9px\\]{font-size:9px}.skippr\\:text-\\[10px\\]{font-size:10px}.skippr\\:text-\\[11px\\]{font-size:11px}.skippr\\:leading-5{--tw-leading:calc(var(--skippr-spacing)*5);line-height:calc(var(--skippr-spacing)*5)}.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\\:tracking-wide{--tw-tracking:var(--skippr-tracking-wide);letter-spacing:var(--skippr-tracking-wide)}.skippr\\:tracking-wider{--tw-tracking:var(--skippr-tracking-wider);letter-spacing:var(--skippr-tracking-wider)}.skippr\\:whitespace-nowrap{white-space:nowrap}.skippr\\:text-background{color:oklch(100% 0 0)}.skippr\\:text-bubble{color:#2d2b3d}.skippr\\:text-chart-3{color:oklch(66.6% .179 58.318)}.skippr\\:text-cyan-500{color:var(--skippr-color-cyan-500)}.skippr\\:text-cyan-900{color:var(--skippr-color-cyan-900)}.skippr\\:text-destructive{color:#d94f4f}.skippr\\:text-destructive-foreground{color:oklch(100% 0 0)}.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-primary{color:#2d2b3d}.skippr\\:text-primary-foreground{color:#fff}.skippr\\:text-primary-foreground\\/70{color:oklab(100% 0 5.96046e-8/.7)}.skippr\\:text-red-700{color:var(--skippr-color-red-700)}.skippr\\:text-secondary-foreground{color:#613700}.skippr\\:text-white,.skippr\\:text-white\\/70{color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-white\\/70{color:color-mix(in oklab,var(--skippr-color-white)70%,transparent)}}.skippr\\:uppercase{text-transform:uppercase}.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-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-\\[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\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 4px 12px 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_4px_16px_rgba\\(0\\,0\\,0\\,0\\.15\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#00000026),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_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_4px_16px_rgba\\(217\\,79\\,79\\,0\\.45\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#d94f4f73),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\\(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-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-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-foreground\\/10{--tw-ring-color:oklab(14.7% .00261104 .00303026/.1)}.skippr\\:ring-offset-background{--tw-ring-offset-color:oklch(100% 0 0)}.skippr\\:drop-shadow-\\[0_1px_3px_rgba\\(0\\,0\\,0\\,0\\.35\\)\\]{--tw-drop-shadow-size:drop-shadow(0 1px 3px var(--tw-drop-shadow-color,#00000059));--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-\\[opacity\\,transform\\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\]{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\\:duration-150{--tw-duration:.15s;transition-duration:.15s}.skippr\\:duration-300{--tw-duration:.3s;transition-duration:.3s}.skippr\\:ease-in-out{--tw-ease:var(--skippr-ease-in-out);transition-timing-function:var(--skippr-ease-in-out)}.skippr\\:outline-none{--tw-outline-style:none;outline-style: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\\: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\\: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-accent:hover{background-color:#e7e5e4}.skippr\\:hover\\:bg-bubble:hover{background-color:#2d2b3d}.skippr\\:hover\\:bg-destructive\\/20:hover{background-color:oklab(61.4357% .15892 .0698893/.2)}.skippr\\:hover\\:bg-destructive\\/25:hover{background-color:oklab(61.4357% .15892 .0698893/.25)}.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-muted\\/50:hover{background-color:oklab(97% -.000282743 .000959196/.5)}.skippr\\:hover\\:bg-muted\\/80:hover{background-color:oklab(97% -.000282743 .000959196/.8)}.skippr\\:hover\\:bg-primary-foreground\\/10:hover{background-color:oklab(100% 0 5.96046e-8/.1)}.skippr\\:hover\\:bg-primary\\/90:hover{background-color:oklab(29.9244% .0107414 -.0305411/.9)}.skippr\\:hover\\:bg-secondary\\/80:hover{background-color:oklab(91.9963% .0175391 .0626889/.8)}.skippr\\:hover\\:bg-white\\/15:hover{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:hover\\:bg-white\\/15:hover{background-color:color-mix(in oklab,var(--skippr-color-white)15%,transparent)}}.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:#fff}.skippr\\:hover\\:text-white:hover{color:var(--skippr-color-white)}.skippr\\:hover\\:opacity-90:hover{opacity:.9}.skippr\\:hover\\:shadow-\\[0_6px_24px_rgba\\(45\\,43\\,61\\,0\\.55\\)\\,0_4px_8px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]:hover{--tw-shadow:0 6px 24px var(--tw-shadow-color,#2d2b3d8c),0 4px 8px 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\\: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-ring:focus-visible{--tw-ring-color:oklch(70.9% .01 56.259)}.skippr\\:focus-visible\\:ring-white\\/70:focus-visible{--tw-ring-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:focus-visible\\:ring-white\\/70:focus-visible{--tw-ring-color:color-mix(in oklab,var(--skippr-color-white)70%,transparent)}}.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\\:focus-visible\\:ring-inset:focus-visible{--tw-ring-inset:inset}.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}.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-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-annotation-pulse{0%,to{box-shadow:0 0 #22d3ee73}50%{box-shadow:0 0 0 10px #22d3ee00}}@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-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)}}.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-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{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}}`;
|
|
3381
|
+
@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-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-300:oklch(80.8% .114 19.571);--skippr-color-red-400:oklch(70.4% .191 22.216);--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-emerald-500:oklch(69.6% .17 162.48);--skippr-color-cyan-400:oklch(78.9% .154 211.53);--skippr-color-cyan-500:oklch(71.5% .143 215.221);--skippr-color-cyan-900:oklch(39.8% .07 227.392);--skippr-color-neutral-100:oklch(97% 0 0);--skippr-color-neutral-200:oklch(92.2% 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-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-pulse:pulse 2s cubic-bezier(.4,0,.6,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-2{top:calc(var(--skippr-spacing)*-2)}.skippr\\:top-0{top:calc(var(--skippr-spacing)*0)}.skippr\\:top-1\\/2{top:50%}.skippr\\:top-4{top:calc(var(--skippr-spacing)*4)}.skippr\\:top-full{top:100%}.skippr\\:-right-2{right:calc(var(--skippr-spacing)*-2)}.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-\\[-3px\\]{right:-3px}.skippr\\:right-\\[24px\\]{right:24px}.skippr\\:-bottom-1{bottom:calc(var(--skippr-spacing)*-1)}.skippr\\:-bottom-9{bottom:calc(var(--skippr-spacing)*-9)}.skippr\\:bottom-20{bottom:calc(var(--skippr-spacing)*20)}.skippr\\:bottom-full{bottom:100%}.skippr\\:left-0{left:calc(var(--skippr-spacing)*0)}.skippr\\:left-1\\/2{left:50%}.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\\:left-\\[24px\\]{left:24px}.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\\:mx-auto{margin-inline:auto}.skippr\\:-mt-\\[5px\\]{margin-top:-5px}.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-3{margin-top:calc(var(--skippr-spacing)*3)}.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\\:flex{display:flex}.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\\.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-\\[6px\\]{width:6px;height:6px}.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-2\\.5{height:calc(var(--skippr-spacing)*2.5)}.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-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-12{height:calc(var(--skippr-spacing)*12)}.skippr\\:h-16{height:calc(var(--skippr-spacing)*16)}.skippr\\:h-\\[18\\.5px\\]{height:18.5px}.skippr\\:h-\\[50px\\]{height:50px}.skippr\\:h-full{height:100%}.skippr\\:min-h-0{min-height:calc(var(--skippr-spacing)*0)}.skippr\\:w-0{width:calc(var(--skippr-spacing)*0)}.skippr\\:w-3{width:calc(var(--skippr-spacing)*3)}.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-10{width:calc(var(--skippr-spacing)*10)}.skippr\\:w-12{width:calc(var(--skippr-spacing)*12)}.skippr\\:w-14{width:calc(var(--skippr-spacing)*14)}.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-\\[50px\\]{width:50px}.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\\:min-w-0{min-width:calc(var(--skippr-spacing)*0)}.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-7{--tw-translate-x:calc(var(--skippr-spacing)*-7);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\\: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\\:-rotate-90{rotate:-90deg}.skippr\\:rotate-45{rotate:45deg}.skippr\\:rotate-\\[225deg\\]{rotate:225deg}.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-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-speak_1\\.1s_ease-in-out_0\\.3s_infinite\\]{animation:1.1s ease-in-out .3s infinite skippr-speak}.skippr\\:\\[animation\\:skippr-speak_1\\.1s_ease-in-out_0\\.15s_infinite\\]{animation:1.1s ease-in-out .15s infinite skippr-speak}.skippr\\:\\[animation\\:skippr-speak_1\\.1s_ease-in-out_0\\.45s_infinite\\]{animation:1.1s ease-in-out .45s infinite skippr-speak}.skippr\\:\\[animation\\:skippr-speak_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-speak}.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_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-pulse{animation:var(--skippr-animate-pulse)}.skippr\\:animate-skippr-annotation-pulse{animation:1.8s ease-in-out infinite skippr-annotation-pulse}.skippr\\:animate-skippr-press{animation:.5s ease-in-out skippr-press}.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-pointer{cursor:pointer}.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\\: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-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-2xl{border-radius:1.125rem}.skippr\\:rounded-\\[1rem\\]{border-radius:1rem}.skippr\\:rounded-\\[10px\\]{border-radius:10px}.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\\: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-border{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-cyan-400{border-color:var(--skippr-color-cyan-400)}.skippr\\:border-input{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-primary\\/20{border-color:oklab(29.9244% .0107414 -.0305411/.2)}.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-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-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-cyan-400{background-color:var(--skippr-color-cyan-400)}.skippr\\:bg-cyan-500{background-color:var(--skippr-color-cyan-500)}.skippr\\:bg-destructive{background-color:#d94f4f}.skippr\\:bg-emerald-400{background-color:var(--skippr-color-emerald-400)}.skippr\\:bg-emerald-500{background-color:var(--skippr-color-emerald-500)}.skippr\\:bg-foreground{background-color:oklch(14.7% .004 49.25)}.skippr\\:bg-launcher{background-color:#2d2d3f}.skippr\\:bg-muted{background-color:oklch(97% .001 106.424)}.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:#2d2b3d}.skippr\\:bg-primary-foreground\\/20{background-color:oklab(100% 0 5.96046e-8/.2)}.skippr\\:bg-primary\\/10{background-color:oklab(29.9244% .0107414 -.0305411/.1)}.skippr\\:bg-red-50{background-color:var(--skippr-color-red-50)}.skippr\\:bg-red-400{background-color:var(--skippr-color-red-400)}.skippr\\:bg-secondary{background-color:#ffdfb5}.skippr\\:bg-transparent{background-color:#0000}.skippr\\:bg-white{background-color:var(--skippr-color-white)}.skippr\\:fill-brand{fill:#2bc0ae}.skippr\\:fill-primary\\/30{fill:oklab(29.9244% .0107414 -.0305411/.3)}.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\\:p-2{padding:calc(var(--skippr-spacing)*2)}.skippr\\:p-3{padding:calc(var(--skippr-spacing)*3)}.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-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\\:pt-1\\.5{padding-top:calc(var(--skippr-spacing)*1.5)}.skippr\\:pt-2{padding-top:calc(var(--skippr-spacing)*2)}.skippr\\:pr-3{padding-right:calc(var(--skippr-spacing)*3)}.skippr\\:pb-0{padding-bottom:calc(var(--skippr-spacing)*0)}.skippr\\:pb-2{padding-bottom:calc(var(--skippr-spacing)*2)}.skippr\\:pl-1\\.5{padding-left:calc(var(--skippr-spacing)*1.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-relaxed{--tw-leading:var(--skippr-leading-relaxed);line-height:var(--skippr-leading-relaxed)}.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{color:var(--skippr-color-black)}.skippr\\:text-bubble{color:#2d2b3d}.skippr\\:text-chart-3{color:oklch(66.6% .179 58.318)}.skippr\\:text-cyan-500{color:var(--skippr-color-cyan-500)}.skippr\\:text-cyan-900{color:var(--skippr-color-cyan-900)}.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-700{color:var(--skippr-color-neutral-700)}.skippr\\:text-primary{color:#2d2b3d}.skippr\\:text-primary-foreground{color:#fff}.skippr\\:text-primary-foreground\\/70{color:oklab(100% 0 5.96046e-8/.7)}.skippr\\:text-red-400{color:var(--skippr-color-red-400)}.skippr\\:text-red-700{color:var(--skippr-color-red-700)}.skippr\\:text-secondary-foreground{color:#613700}.skippr\\:text-white{color:var(--skippr-color-white)}.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_6px_22px_rgba\\(0\\,0\\,0\\,0\\.3\\)\\]{--tw-shadow:-6px 6px 22px var(--tw-shadow-color,#0000004d);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\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 4px 12px 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_4px_14px_rgba\\(0\\,0\\,0\\,0\\.3\\)\\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#0000004d);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-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-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-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-foreground\\/10{--tw-ring-color:oklab(14.7% .00261104 .00303026/.1)}.skippr\\:ring-offset-background{--tw-ring-offset-color:oklch(100% 0 0)}.skippr\\:drop-shadow-\\[0_1px_3px_rgba\\(0\\,0\\,0\\,0\\.35\\)\\]{--tw-drop-shadow-size:drop-shadow(0 1px 3px var(--tw-drop-shadow-color,#00000059));--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\\]{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-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\\: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\\:\\[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\\: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\\: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\\:scale-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-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\\/70:hover{background-color:oklab(97% -.000282743 .000959196/.7)}.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:oklab(100% 0 5.96046e-8/.1)}.skippr\\:hover\\:bg-primary\\/90:hover{background-color:oklab(29.9244% .0107414 -.0305411/.9)}.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:#fff}.skippr\\:hover\\:text-red-300:hover{color:var(--skippr-color-red-300)}.skippr\\:hover\\:text-white\\/80:hover{color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:hover\\:text-white\\/80:hover{color:color-mix(in oklab,var(--skippr-color-white)80%,transparent)}}.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\\:opacity-100:focus-visible{opacity:1}.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\\: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\\: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-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-annotation-pulse{0%,to{box-shadow:0 0 #22d3ee73}50%{box-shadow:0 0 0 10px #22d3ee00}}@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-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-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 pulse{50%{opacity:.5}}@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}}`;
|
|
3060
3382
|
useLayoutEffect(() => {
|
|
3061
3383
|
const host = hostRef.current;
|
|
3062
3384
|
if (!host || !css)
|
|
@@ -3071,7 +3393,7 @@ function ShadowHost({ children }) {
|
|
|
3071
3393
|
setShadowRoot(root);
|
|
3072
3394
|
}, [css]);
|
|
3073
3395
|
if (!css)
|
|
3074
|
-
return /* @__PURE__ */ jsx8(
|
|
3396
|
+
return /* @__PURE__ */ jsx8(Fragment, {
|
|
3075
3397
|
children
|
|
3076
3398
|
});
|
|
3077
3399
|
return /* @__PURE__ */ jsx8("div", {
|
|
@@ -3081,13 +3403,13 @@ function ShadowHost({ children }) {
|
|
|
3081
3403
|
}
|
|
3082
3404
|
|
|
3083
3405
|
// src/components/Sidebar.tsx
|
|
3084
|
-
import { useContext as
|
|
3406
|
+
import { useContext as useContext9, useEffect as useEffect19 } from "react";
|
|
3085
3407
|
|
|
3086
3408
|
// src/hooks/useCombinedMessages.ts
|
|
3087
|
-
import { useContext as
|
|
3409
|
+
import { useContext as useContext6, useMemo as useMemo5 } from "react";
|
|
3088
3410
|
|
|
3089
3411
|
// src/hooks/useChatMessages.ts
|
|
3090
|
-
import { useChat, useLocalParticipant as
|
|
3412
|
+
import { useChat, useLocalParticipant as useLocalParticipant5 } from "@livekit/components-react/hooks";
|
|
3091
3413
|
import { useMemo as useMemo3 } from "react";
|
|
3092
3414
|
|
|
3093
3415
|
// src/lib/filterSystemMessages.ts
|
|
@@ -3099,7 +3421,7 @@ function filterSystemMessages(messages) {
|
|
|
3099
3421
|
// src/hooks/useChatMessages.ts
|
|
3100
3422
|
function useChatMessages() {
|
|
3101
3423
|
const { chatMessages: rawMessages, send, isSending } = useChat();
|
|
3102
|
-
const { localParticipant } =
|
|
3424
|
+
const { localParticipant } = useLocalParticipant5();
|
|
3103
3425
|
const localIdentity = localParticipant.identity;
|
|
3104
3426
|
const chatMessages = useMemo3(() => {
|
|
3105
3427
|
const sortedMessages = rawMessages.map((msg) => ({
|
|
@@ -3115,11 +3437,11 @@ function useChatMessages() {
|
|
|
3115
3437
|
}
|
|
3116
3438
|
|
|
3117
3439
|
// src/hooks/useStreamingTranscript.ts
|
|
3118
|
-
import { useLocalParticipant as
|
|
3440
|
+
import { useLocalParticipant as useLocalParticipant6, useTranscriptions } from "@livekit/components-react/hooks";
|
|
3119
3441
|
import { useMemo as useMemo4 } from "react";
|
|
3120
3442
|
function useStreamingTranscript() {
|
|
3121
3443
|
const transcriptions = useTranscriptions();
|
|
3122
|
-
const { localParticipant } =
|
|
3444
|
+
const { localParticipant } = useLocalParticipant6();
|
|
3123
3445
|
const localIdentity = localParticipant.identity;
|
|
3124
3446
|
const transcriptMessages = useMemo4(() => filterSystemMessages(transcriptions.filter((stream) => stream.text.trim().length > 0).map((stream) => ({
|
|
3125
3447
|
id: stream.streamInfo.id,
|
|
@@ -3142,101 +3464,35 @@ function mergeChatsIntoTranscripts(transcripts, chats) {
|
|
|
3142
3464
|
}
|
|
3143
3465
|
merged.push(transcript);
|
|
3144
3466
|
}
|
|
3145
|
-
while (chatIndex < chats.length) {
|
|
3146
|
-
merged.push(chats[chatIndex]);
|
|
3147
|
-
chatIndex++;
|
|
3148
|
-
}
|
|
3149
|
-
return merged;
|
|
3150
|
-
}
|
|
3151
|
-
function useCombinedMessages() {
|
|
3152
|
-
const { transcriptMessages } = useStreamingTranscript();
|
|
3153
|
-
const { chatMessages, sendChatMessage, isSendingChat } = useChatMessages();
|
|
3154
|
-
const { state: agentState } = useAgentVoiceState();
|
|
3155
|
-
const historyMessages = useContext4(LiveAgentContext)?.historyMessages ?? [];
|
|
3156
|
-
const liveMessages = useMemo5(() => {
|
|
3157
|
-
if (chatMessages.length === 0)
|
|
3158
|
-
return transcriptMessages;
|
|
3159
|
-
if (transcriptMessages.length === 0)
|
|
3160
|
-
return chatMessages;
|
|
3161
|
-
return mergeChatsIntoTranscripts(transcriptMessages, chatMessages);
|
|
3162
|
-
}, [transcriptMessages, chatMessages]);
|
|
3163
|
-
const allMessages = useMemo5(() => {
|
|
3164
|
-
if (historyMessages.length === 0)
|
|
3165
|
-
return liveMessages;
|
|
3166
|
-
const seenIds = new Set(liveMessages.map((message) => message.id));
|
|
3167
|
-
return [...historyMessages.filter((message) => !seenIds.has(message.id)), ...liveMessages];
|
|
3168
|
-
}, [historyMessages, liveMessages]);
|
|
3169
|
-
return { allMessages, agentState, sendChatMessage, isSendingChat };
|
|
3170
|
-
}
|
|
3171
|
-
|
|
3172
|
-
// src/hooks/usePhaseUpdates.ts
|
|
3173
|
-
import { useCallback as useCallback8, useContext as useContext5, useEffect as useEffect12 } from "react";
|
|
3174
|
-
|
|
3175
|
-
// src/hooks/useAgentState.ts
|
|
3176
|
-
import { useRemoteParticipants } from "@livekit/components-react/hooks";
|
|
3177
|
-
import { useEffect as useEffect11, useState as useState9 } from "react";
|
|
3178
|
-
function useAgentState(attributeKey, parse, initial) {
|
|
3179
|
-
const [value, setValue] = useState9(initial);
|
|
3180
|
-
const remoteParticipants = useRemoteParticipants();
|
|
3181
|
-
useEffect11(() => {
|
|
3182
|
-
const agentParticipant = remoteParticipants.find((p) => p.attributes?.[attributeKey]);
|
|
3183
|
-
if (agentParticipant) {
|
|
3184
|
-
const attr = agentParticipant.attributes?.[attributeKey];
|
|
3185
|
-
if (attr) {
|
|
3186
|
-
const parsed = parse(attr);
|
|
3187
|
-
if (parsed)
|
|
3188
|
-
setValue(parsed);
|
|
3189
|
-
}
|
|
3190
|
-
}
|
|
3191
|
-
const handlers = new Map;
|
|
3192
|
-
for (const p of remoteParticipants) {
|
|
3193
|
-
const handler = (changedAttributes) => {
|
|
3194
|
-
if (changedAttributes[attributeKey]) {
|
|
3195
|
-
const parsed = parse(changedAttributes[attributeKey]);
|
|
3196
|
-
if (parsed)
|
|
3197
|
-
setValue(parsed);
|
|
3198
|
-
} else if (p.attributes?.[attributeKey]) {
|
|
3199
|
-
const parsed = parse(p.attributes[attributeKey]);
|
|
3200
|
-
if (parsed)
|
|
3201
|
-
setValue(parsed);
|
|
3202
|
-
}
|
|
3203
|
-
};
|
|
3204
|
-
handlers.set(p, handler);
|
|
3205
|
-
p.on("attributesChanged", handler);
|
|
3206
|
-
}
|
|
3207
|
-
return () => {
|
|
3208
|
-
for (const [p, handler] of handlers) {
|
|
3209
|
-
p.off("attributesChanged", handler);
|
|
3210
|
-
}
|
|
3211
|
-
};
|
|
3212
|
-
}, [remoteParticipants, attributeKey, parse]);
|
|
3213
|
-
return value;
|
|
3214
|
-
}
|
|
3215
|
-
|
|
3216
|
-
// src/hooks/usePhaseUpdates.ts
|
|
3217
|
-
function parsePhases(json) {
|
|
3218
|
-
try {
|
|
3219
|
-
const data = JSON.parse(json);
|
|
3220
|
-
if (data.type === "phase_update" && Array.isArray(data.phases)) {
|
|
3221
|
-
return data.phases;
|
|
3222
|
-
}
|
|
3223
|
-
} catch {}
|
|
3224
|
-
return null;
|
|
3467
|
+
while (chatIndex < chats.length) {
|
|
3468
|
+
merged.push(chats[chatIndex]);
|
|
3469
|
+
chatIndex++;
|
|
3470
|
+
}
|
|
3471
|
+
return merged;
|
|
3225
3472
|
}
|
|
3226
|
-
function
|
|
3227
|
-
const
|
|
3228
|
-
const
|
|
3229
|
-
const
|
|
3230
|
-
|
|
3231
|
-
|
|
3232
|
-
|
|
3233
|
-
|
|
3234
|
-
|
|
3235
|
-
|
|
3473
|
+
function useCombinedMessages() {
|
|
3474
|
+
const { transcriptMessages } = useStreamingTranscript();
|
|
3475
|
+
const { chatMessages, sendChatMessage, isSendingChat } = useChatMessages();
|
|
3476
|
+
const { state: agentState } = useAgentVoiceState();
|
|
3477
|
+
const historyMessages = useContext6(LiveAgentContext)?.historyMessages ?? [];
|
|
3478
|
+
const liveMessages = useMemo5(() => {
|
|
3479
|
+
if (chatMessages.length === 0)
|
|
3480
|
+
return transcriptMessages;
|
|
3481
|
+
if (transcriptMessages.length === 0)
|
|
3482
|
+
return chatMessages;
|
|
3483
|
+
return mergeChatsIntoTranscripts(transcriptMessages, chatMessages);
|
|
3484
|
+
}, [transcriptMessages, chatMessages]);
|
|
3485
|
+
const allMessages = useMemo5(() => {
|
|
3486
|
+
if (historyMessages.length === 0)
|
|
3487
|
+
return liveMessages;
|
|
3488
|
+
const seenIds = new Set(liveMessages.map((message) => message.id));
|
|
3489
|
+
return [...historyMessages.filter((message) => !seenIds.has(message.id)), ...liveMessages];
|
|
3490
|
+
}, [historyMessages, liveMessages]);
|
|
3491
|
+
return { allMessages, agentState, sendChatMessage, isSendingChat };
|
|
3236
3492
|
}
|
|
3237
3493
|
|
|
3238
3494
|
// src/hooks/useSessionRemaining.ts
|
|
3239
|
-
import { useEffect as
|
|
3495
|
+
import { useEffect as useEffect15, useRef as useRef11, useState as useState12 } from "react";
|
|
3240
3496
|
|
|
3241
3497
|
// src/lib/format.ts
|
|
3242
3498
|
function formatTime(seconds) {
|
|
@@ -3252,9 +3508,9 @@ function parseNumber(s) {
|
|
|
3252
3508
|
// src/hooks/useSessionRemaining.ts
|
|
3253
3509
|
function useSessionRemaining() {
|
|
3254
3510
|
const maxCallDuration = useAgentState("maxCallDuration", parseNumber, null);
|
|
3255
|
-
const endTimeRef =
|
|
3256
|
-
const [remaining, setRemaining] =
|
|
3257
|
-
|
|
3511
|
+
const endTimeRef = useRef11(null);
|
|
3512
|
+
const [remaining, setRemaining] = useState12(null);
|
|
3513
|
+
useEffect15(() => {
|
|
3258
3514
|
if (maxCallDuration === null || endTimeRef.current !== null)
|
|
3259
3515
|
return;
|
|
3260
3516
|
const endTime = Date.now() + maxCallDuration * 1000;
|
|
@@ -3270,11 +3526,47 @@ function useSessionRemaining() {
|
|
|
3270
3526
|
return remaining;
|
|
3271
3527
|
}
|
|
3272
3528
|
|
|
3529
|
+
// src/hooks/useTextMode.ts
|
|
3530
|
+
import { useLocalParticipant as useLocalParticipant7 } from "@livekit/components-react/hooks";
|
|
3531
|
+
import { useCallback as useCallback9, useContext as useContext7, useRef as useRef12 } from "react";
|
|
3532
|
+
var textEncoder3 = new TextEncoder;
|
|
3533
|
+
function useTextMode() {
|
|
3534
|
+
const ctx = useContext7(LiveAgentContext);
|
|
3535
|
+
if (!ctx) {
|
|
3536
|
+
throw new Error("useTextMode must be used within a <LiveAgent> provider");
|
|
3537
|
+
}
|
|
3538
|
+
const { textMode, setTextModeState, sidebarTab, setSidebarTab } = ctx;
|
|
3539
|
+
const { localParticipant } = useLocalParticipant7();
|
|
3540
|
+
const confirmedTextModeRef = useRef12(false);
|
|
3541
|
+
const toggleTextMode = useCallback9(async () => {
|
|
3542
|
+
const next = !textMode;
|
|
3543
|
+
setTextModeState(next);
|
|
3544
|
+
if (next && sidebarTab === "agenda") {
|
|
3545
|
+
setSidebarTab("chat");
|
|
3546
|
+
}
|
|
3547
|
+
try {
|
|
3548
|
+
await localParticipant.publishData(textEncoder3.encode(JSON.stringify({ textMode: next })), {
|
|
3549
|
+
reliable: true,
|
|
3550
|
+
topic: TEXT_MODE_TOPIC
|
|
3551
|
+
});
|
|
3552
|
+
await localParticipant.setMicrophoneEnabled(!next);
|
|
3553
|
+
confirmedTextModeRef.current = next;
|
|
3554
|
+
} catch (error) {
|
|
3555
|
+
setTextModeState(confirmedTextModeRef.current);
|
|
3556
|
+
console.error("Failed to switch session mode:", error);
|
|
3557
|
+
}
|
|
3558
|
+
}, [textMode, setTextModeState, sidebarTab, setSidebarTab, localParticipant]);
|
|
3559
|
+
return { textMode, toggleTextMode };
|
|
3560
|
+
}
|
|
3561
|
+
|
|
3562
|
+
// src/components/ChatHeader.tsx
|
|
3563
|
+
import { useContext as useContext8 } from "react";
|
|
3564
|
+
|
|
3273
3565
|
// src/hooks/useElapsedSeconds.ts
|
|
3274
|
-
import { useEffect as
|
|
3566
|
+
import { useEffect as useEffect16, useState as useState13 } from "react";
|
|
3275
3567
|
function useElapsedSeconds(isRunning) {
|
|
3276
|
-
const [elapsed, setElapsed] =
|
|
3277
|
-
|
|
3568
|
+
const [elapsed, setElapsed] = useState13(0);
|
|
3569
|
+
useEffect16(() => {
|
|
3278
3570
|
if (!isRunning) {
|
|
3279
3571
|
setElapsed(0);
|
|
3280
3572
|
return;
|
|
@@ -3292,7 +3584,10 @@ function useElapsedSeconds(isRunning) {
|
|
|
3292
3584
|
// src/components/ChatHeader.tsx
|
|
3293
3585
|
import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
3294
3586
|
function ChatHeader() {
|
|
3295
|
-
const { isConnected,
|
|
3587
|
+
const { isConnected, variant } = useLiveAgent();
|
|
3588
|
+
const internalCtx = useContext8(LiveAgentContext);
|
|
3589
|
+
const panelExpanded = internalCtx?.panelExpanded ?? false;
|
|
3590
|
+
const togglePanelExpanded = internalCtx?.togglePanelExpanded ?? (() => {});
|
|
3296
3591
|
const elapsed = useElapsedSeconds(isConnected);
|
|
3297
3592
|
return /* @__PURE__ */ jsxs7("header", {
|
|
3298
3593
|
className: "skippr:sticky skippr:top-0 skippr:z-10 skippr:flex skippr:shrink-0 skippr:items-center skippr:justify-between skippr:border-b skippr:border-border skippr:bg-primary skippr:px-4 skippr:py-3",
|
|
@@ -3328,12 +3623,15 @@ function ChatHeader() {
|
|
|
3328
3623
|
})
|
|
3329
3624
|
]
|
|
3330
3625
|
}),
|
|
3331
|
-
|
|
3626
|
+
variant === "floating" && /* @__PURE__ */ jsx9("button", {
|
|
3332
3627
|
type: "button",
|
|
3333
|
-
onClick:
|
|
3334
|
-
"aria-label": "
|
|
3628
|
+
onClick: togglePanelExpanded,
|
|
3629
|
+
"aria-label": panelExpanded ? "Collapse" : "Expand",
|
|
3630
|
+
title: panelExpanded ? "Collapse" : "Expand",
|
|
3335
3631
|
className: "skippr:flex skippr:size-6 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-md skippr:text-primary-foreground/70 skippr:transition-colors skippr:hover:bg-primary-foreground/10 skippr:hover:text-primary-foreground",
|
|
3336
|
-
children: /* @__PURE__ */ jsx9(Minimize2, {
|
|
3632
|
+
children: panelExpanded ? /* @__PURE__ */ jsx9(Minimize2, {
|
|
3633
|
+
className: "skippr:size-3.5"
|
|
3634
|
+
}) : /* @__PURE__ */ jsx9(Maximize2, {
|
|
3337
3635
|
className: "skippr:size-3.5"
|
|
3338
3636
|
})
|
|
3339
3637
|
})
|
|
@@ -3372,7 +3670,7 @@ function LoadingDots({ label }) {
|
|
|
3372
3670
|
}
|
|
3373
3671
|
|
|
3374
3672
|
// src/components/LoginFlow.tsx
|
|
3375
|
-
import { useCallback as
|
|
3673
|
+
import { useCallback as useCallback10, useEffect as useEffect17, useRef as useRef13, useState as useState14 } from "react";
|
|
3376
3674
|
|
|
3377
3675
|
// src/components/ui/button.tsx
|
|
3378
3676
|
import { forwardRef as forwardRef3 } from "react";
|
|
@@ -3408,20 +3706,20 @@ import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
|
3408
3706
|
var OTP_LENGTH = 6;
|
|
3409
3707
|
var DIGIT_KEYS = ["d0", "d1", "d2", "d3", "d4", "d5"];
|
|
3410
3708
|
function LoginFlow({ requestOtp, verifyOtp, error, isSubmitting }) {
|
|
3411
|
-
const [step, setStep] =
|
|
3412
|
-
const [email, setEmail] =
|
|
3413
|
-
const handleRequestOtp =
|
|
3709
|
+
const [step, setStep] = useState14("email");
|
|
3710
|
+
const [email, setEmail] = useState14("");
|
|
3711
|
+
const handleRequestOtp = useCallback10(async (emailValue) => {
|
|
3414
3712
|
const success = await requestOtp(emailValue);
|
|
3415
3713
|
if (success)
|
|
3416
3714
|
setStep("otp");
|
|
3417
3715
|
}, [requestOtp]);
|
|
3418
|
-
const handleVerifyOtp =
|
|
3716
|
+
const handleVerifyOtp = useCallback10(async (code) => {
|
|
3419
3717
|
await verifyOtp(email, code);
|
|
3420
3718
|
}, [verifyOtp, email]);
|
|
3421
|
-
const handleBack =
|
|
3719
|
+
const handleBack = useCallback10(() => {
|
|
3422
3720
|
setStep("email");
|
|
3423
3721
|
}, []);
|
|
3424
|
-
const handleResend =
|
|
3722
|
+
const handleResend = useCallback10(async () => {
|
|
3425
3723
|
await requestOtp(email);
|
|
3426
3724
|
}, [requestOtp, email]);
|
|
3427
3725
|
if (step === "otp") {
|
|
@@ -3498,30 +3796,30 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
|
|
|
3498
3796
|
});
|
|
3499
3797
|
}
|
|
3500
3798
|
function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
3501
|
-
const [digits, setDigits] =
|
|
3502
|
-
const [resendCooldown, setResendCooldown] =
|
|
3503
|
-
const inputRefs =
|
|
3504
|
-
const submittedRef =
|
|
3505
|
-
|
|
3799
|
+
const [digits, setDigits] = useState14(Array(OTP_LENGTH).fill(""));
|
|
3800
|
+
const [resendCooldown, setResendCooldown] = useState14(0);
|
|
3801
|
+
const inputRefs = useRef13([]);
|
|
3802
|
+
const submittedRef = useRef13(false);
|
|
3803
|
+
useEffect17(() => {
|
|
3506
3804
|
inputRefs.current[0]?.focus();
|
|
3507
3805
|
}, []);
|
|
3508
|
-
|
|
3806
|
+
useEffect17(() => {
|
|
3509
3807
|
if (error)
|
|
3510
3808
|
submittedRef.current = false;
|
|
3511
3809
|
}, [error]);
|
|
3512
|
-
|
|
3810
|
+
useEffect17(() => {
|
|
3513
3811
|
if (resendCooldown <= 0)
|
|
3514
3812
|
return;
|
|
3515
3813
|
const timer = setTimeout(() => setResendCooldown((c) => c - 1), 1000);
|
|
3516
3814
|
return () => clearTimeout(timer);
|
|
3517
3815
|
}, [resendCooldown]);
|
|
3518
|
-
const submitCode =
|
|
3816
|
+
const submitCode = useCallback10((code) => {
|
|
3519
3817
|
if (submittedRef.current || isSubmitting)
|
|
3520
3818
|
return;
|
|
3521
3819
|
submittedRef.current = true;
|
|
3522
3820
|
onSubmit(code);
|
|
3523
3821
|
}, [onSubmit, isSubmitting]);
|
|
3524
|
-
const handleDigitChange =
|
|
3822
|
+
const handleDigitChange = useCallback10((index2, value) => {
|
|
3525
3823
|
const digit = value.replace(/\D/g, "").slice(-1);
|
|
3526
3824
|
const newDigits = [...digits];
|
|
3527
3825
|
newDigits[index2] = digit;
|
|
@@ -3535,12 +3833,12 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
|
3535
3833
|
submitCode(code);
|
|
3536
3834
|
}
|
|
3537
3835
|
}, [digits, submitCode]);
|
|
3538
|
-
const handleKeyDown =
|
|
3836
|
+
const handleKeyDown = useCallback10((index2, e) => {
|
|
3539
3837
|
if (e.key === "Backspace" && !digits[index2] && index2 > 0) {
|
|
3540
3838
|
inputRefs.current[index2 - 1]?.focus();
|
|
3541
3839
|
}
|
|
3542
3840
|
}, [digits]);
|
|
3543
|
-
const handlePaste =
|
|
3841
|
+
const handlePaste = useCallback10((e) => {
|
|
3544
3842
|
e.preventDefault();
|
|
3545
3843
|
const pasted = e.clipboardData.getData("text").replace(/\D/g, "").slice(0, OTP_LENGTH);
|
|
3546
3844
|
if (pasted.length > 0) {
|
|
@@ -3649,101 +3947,18 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
|
|
|
3649
3947
|
});
|
|
3650
3948
|
}
|
|
3651
3949
|
|
|
3652
|
-
// src/components/MeetingControls.tsx
|
|
3653
|
-
import { jsx as jsx13, jsxs as jsxs10, Fragment as Fragment4 } from "react/jsx-runtime";
|
|
3654
|
-
var CONTROL_BUTTON2 = "skippr:flex skippr:size-11 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:transition-colors skippr:disabled:cursor-not-allowed skippr:disabled:opacity-60";
|
|
3655
|
-
var MUTED_BUTTON = "skippr:bg-muted skippr:text-foreground skippr:hover:bg-muted/80";
|
|
3656
|
-
function MeetingControls({
|
|
3657
|
-
onHangUp,
|
|
3658
|
-
onPause,
|
|
3659
|
-
onResume,
|
|
3660
|
-
isPaused = false,
|
|
3661
|
-
isPausing = false,
|
|
3662
|
-
showScreenShareToggle = true
|
|
3663
|
-
}) {
|
|
3664
|
-
const { isMuted, toggleMute, isScreenSharing, toggleScreenShare } = useMediaControls();
|
|
3665
|
-
const showPaused = isPaused || isPausing;
|
|
3666
|
-
return /* @__PURE__ */ jsxs10("div", {
|
|
3667
|
-
className: "skippr:shrink-0 skippr:border-t skippr:border-border skippr:bg-background skippr:px-4 skippr:py-4",
|
|
3668
|
-
children: [
|
|
3669
|
-
/* @__PURE__ */ jsxs10("div", {
|
|
3670
|
-
className: "skippr:flex skippr:items-center skippr:justify-center skippr:gap-3",
|
|
3671
|
-
children: [
|
|
3672
|
-
!showPaused && /* @__PURE__ */ jsxs10(Fragment4, {
|
|
3673
|
-
children: [
|
|
3674
|
-
/* @__PURE__ */ jsx13("button", {
|
|
3675
|
-
type: "button",
|
|
3676
|
-
onClick: toggleMute,
|
|
3677
|
-
"aria-label": isMuted ? "Unmute" : "Mute",
|
|
3678
|
-
className: cn(CONTROL_BUTTON2, isMuted ? "skippr:bg-destructive/15 skippr:text-destructive skippr:hover:bg-destructive/25" : MUTED_BUTTON),
|
|
3679
|
-
children: isMuted ? /* @__PURE__ */ jsx13(MicOff, {
|
|
3680
|
-
className: "skippr:size-5"
|
|
3681
|
-
}) : /* @__PURE__ */ jsx13(Mic, {
|
|
3682
|
-
className: "skippr:size-5"
|
|
3683
|
-
})
|
|
3684
|
-
}),
|
|
3685
|
-
showScreenShareToggle && /* @__PURE__ */ jsx13("button", {
|
|
3686
|
-
type: "button",
|
|
3687
|
-
onClick: toggleScreenShare,
|
|
3688
|
-
"aria-label": isScreenSharing ? "Stop sharing screen" : "Share screen",
|
|
3689
|
-
className: cn(CONTROL_BUTTON2, isScreenSharing ? "skippr:bg-bubble skippr:text-white skippr:hover:brightness-110" : MUTED_BUTTON),
|
|
3690
|
-
children: isScreenSharing ? /* @__PURE__ */ jsx13(MonitorOff, {
|
|
3691
|
-
className: "skippr:size-5"
|
|
3692
|
-
}) : /* @__PURE__ */ jsx13(Monitor, {
|
|
3693
|
-
className: "skippr:size-5"
|
|
3694
|
-
})
|
|
3695
|
-
})
|
|
3696
|
-
]
|
|
3697
|
-
}),
|
|
3698
|
-
showPaused ? onResume && /* @__PURE__ */ jsx13("button", {
|
|
3699
|
-
type: "button",
|
|
3700
|
-
onClick: onResume,
|
|
3701
|
-
disabled: isPausing,
|
|
3702
|
-
"aria-label": "Resume session",
|
|
3703
|
-
className: cn(CONTROL_BUTTON2, MUTED_BUTTON),
|
|
3704
|
-
children: /* @__PURE__ */ jsx13(Play, {
|
|
3705
|
-
className: "skippr:size-5"
|
|
3706
|
-
})
|
|
3707
|
-
}) : onPause && /* @__PURE__ */ jsx13("button", {
|
|
3708
|
-
type: "button",
|
|
3709
|
-
onClick: onPause,
|
|
3710
|
-
"aria-label": "Pause session",
|
|
3711
|
-
className: cn(CONTROL_BUTTON2, MUTED_BUTTON),
|
|
3712
|
-
children: /* @__PURE__ */ jsx13(Pause, {
|
|
3713
|
-
className: "skippr:size-5"
|
|
3714
|
-
})
|
|
3715
|
-
}),
|
|
3716
|
-
/* @__PURE__ */ jsx13("button", {
|
|
3717
|
-
type: "button",
|
|
3718
|
-
onClick: onHangUp,
|
|
3719
|
-
"aria-label": "End session",
|
|
3720
|
-
className: cn(CONTROL_BUTTON2, "skippr:bg-destructive skippr:text-destructive-foreground skippr:hover:bg-destructive/90"),
|
|
3721
|
-
children: /* @__PURE__ */ jsx13(PhoneOff, {
|
|
3722
|
-
className: "skippr:size-5"
|
|
3723
|
-
})
|
|
3724
|
-
})
|
|
3725
|
-
]
|
|
3726
|
-
}),
|
|
3727
|
-
/* @__PURE__ */ jsx13("p", {
|
|
3728
|
-
className: "skippr:mt-3 skippr:text-center skippr:text-[10px] skippr:text-muted-foreground",
|
|
3729
|
-
children: "Powered by Skippr"
|
|
3730
|
-
})
|
|
3731
|
-
]
|
|
3732
|
-
});
|
|
3733
|
-
}
|
|
3734
|
-
|
|
3735
3950
|
// src/components/MessageList.tsx
|
|
3736
|
-
import {
|
|
3951
|
+
import { useLayoutEffect as useLayoutEffect2, useRef as useRef15 } from "react";
|
|
3737
3952
|
|
|
3738
3953
|
// src/components/ChatInput.tsx
|
|
3739
|
-
import { useEffect as
|
|
3740
|
-
import { jsx as
|
|
3954
|
+
import { useEffect as useEffect18, useRef as useRef14, useState as useState15 } from "react";
|
|
3955
|
+
import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
3741
3956
|
var MAX_INPUT_HEIGHT = 60;
|
|
3742
3957
|
function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
|
|
3743
|
-
const [inputText, setInputText] =
|
|
3744
|
-
const textareaRef =
|
|
3958
|
+
const [inputText, setInputText] = useState15("");
|
|
3959
|
+
const textareaRef = useRef14(null);
|
|
3745
3960
|
const canSend = inputText.trim().length > 0 && !isSendingChat;
|
|
3746
|
-
|
|
3961
|
+
useEffect18(() => {
|
|
3747
3962
|
if (autoFocus)
|
|
3748
3963
|
textareaRef.current?.focus();
|
|
3749
3964
|
}, [autoFocus]);
|
|
@@ -3774,13 +3989,13 @@ function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
|
|
|
3774
3989
|
handleSubmit(e);
|
|
3775
3990
|
}
|
|
3776
3991
|
}
|
|
3777
|
-
return /* @__PURE__ */
|
|
3992
|
+
return /* @__PURE__ */ jsx13("form", {
|
|
3778
3993
|
onSubmit: handleSubmit,
|
|
3779
3994
|
className: "skippr:border-t skippr:border-border skippr:p-3",
|
|
3780
|
-
children: /* @__PURE__ */
|
|
3995
|
+
children: /* @__PURE__ */ jsxs10("div", {
|
|
3781
3996
|
className: "skippr:flex skippr:items-center skippr:gap-2 skippr:rounded-xl skippr:bg-background skippr:ring-1 skippr:ring-foreground/10 skippr:px-3 skippr:py-2",
|
|
3782
3997
|
children: [
|
|
3783
|
-
/* @__PURE__ */
|
|
3998
|
+
/* @__PURE__ */ jsx13("textarea", {
|
|
3784
3999
|
ref: textareaRef,
|
|
3785
4000
|
rows: 1,
|
|
3786
4001
|
value: inputText,
|
|
@@ -3790,12 +4005,12 @@ function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
|
|
|
3790
4005
|
className: "skippr:flex-1 skippr:resize-none skippr:overflow-y-auto skippr:bg-transparent skippr:text-sm skippr:leading-5 skippr:text-foreground skippr:placeholder:text-muted-foreground skippr:outline-none",
|
|
3791
4006
|
style: { maxHeight: `${MAX_INPUT_HEIGHT}px` }
|
|
3792
4007
|
}),
|
|
3793
|
-
/* @__PURE__ */
|
|
4008
|
+
/* @__PURE__ */ jsx13("button", {
|
|
3794
4009
|
type: "submit",
|
|
3795
4010
|
disabled: !canSend,
|
|
3796
4011
|
"aria-label": "Send message",
|
|
3797
4012
|
className: cn("skippr:flex skippr:size-8 skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-lg skippr:transition-colors", canSend ? "skippr:bg-primary skippr:text-primary-foreground skippr:hover:bg-primary/90" : "skippr:bg-muted-foreground/20 skippr:text-muted-foreground/60"),
|
|
3798
|
-
children: /* @__PURE__ */
|
|
4013
|
+
children: /* @__PURE__ */ jsx13(Send, {
|
|
3799
4014
|
className: "skippr:size-3.5"
|
|
3800
4015
|
})
|
|
3801
4016
|
})
|
|
@@ -3805,7 +4020,7 @@ function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
|
|
|
3805
4020
|
}
|
|
3806
4021
|
|
|
3807
4022
|
// src/components/ChatMessage.tsx
|
|
3808
|
-
import { jsx as
|
|
4023
|
+
import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
3809
4024
|
function formatTimestamp(ts) {
|
|
3810
4025
|
return new Date(ts).toLocaleTimeString("en-US", {
|
|
3811
4026
|
hour: "numeric",
|
|
@@ -3815,23 +4030,23 @@ function formatTimestamp(ts) {
|
|
|
3815
4030
|
}
|
|
3816
4031
|
function ChatMessage({ message }) {
|
|
3817
4032
|
const isAgent = message.role === "assistant";
|
|
3818
|
-
return /* @__PURE__ */
|
|
4033
|
+
return /* @__PURE__ */ jsxs11("div", {
|
|
3819
4034
|
className: cn("skippr:flex skippr:gap-2", isAgent ? "skippr:items-start" : "skippr:justify-end"),
|
|
3820
4035
|
children: [
|
|
3821
|
-
isAgent && /* @__PURE__ */
|
|
4036
|
+
isAgent && /* @__PURE__ */ jsx14("div", {
|
|
3822
4037
|
className: "skippr:mt-0.5 skippr:flex skippr:size-7 skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-md skippr:bg-primary",
|
|
3823
|
-
children: /* @__PURE__ */
|
|
4038
|
+
children: /* @__PURE__ */ jsx14(Sparkles, {
|
|
3824
4039
|
className: "skippr:size-3.5 skippr:text-primary-foreground"
|
|
3825
4040
|
})
|
|
3826
4041
|
}),
|
|
3827
|
-
/* @__PURE__ */
|
|
4042
|
+
/* @__PURE__ */ jsxs11("div", {
|
|
3828
4043
|
className: cn("skippr:flex skippr:max-w-[80%] skippr:flex-col", isAgent ? "skippr:items-start" : "skippr:items-end"),
|
|
3829
4044
|
children: [
|
|
3830
|
-
/* @__PURE__ */
|
|
4045
|
+
/* @__PURE__ */ jsx14("div", {
|
|
3831
4046
|
className: cn("skippr:rounded-2xl skippr:px-4 skippr:py-2.5 skippr:text-sm skippr:leading-relaxed", isAgent ? "skippr:border skippr:border-border skippr:bg-card skippr:text-foreground" : "skippr:bg-primary skippr:text-primary-foreground"),
|
|
3832
4047
|
children: message.content
|
|
3833
4048
|
}),
|
|
3834
|
-
message.timestamp && /* @__PURE__ */
|
|
4049
|
+
message.timestamp && /* @__PURE__ */ jsx14("span", {
|
|
3835
4050
|
className: "skippr:mt-1 skippr:px-1 skippr:text-[10px] skippr:text-muted-foreground/60",
|
|
3836
4051
|
children: formatTimestamp(message.timestamp)
|
|
3837
4052
|
})
|
|
@@ -3842,33 +4057,33 @@ function ChatMessage({ message }) {
|
|
|
3842
4057
|
}
|
|
3843
4058
|
|
|
3844
4059
|
// src/components/TypingIndicator.tsx
|
|
3845
|
-
import { jsx as
|
|
4060
|
+
import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
3846
4061
|
function TypingIndicator() {
|
|
3847
|
-
return /* @__PURE__ */
|
|
4062
|
+
return /* @__PURE__ */ jsxs12("div", {
|
|
3848
4063
|
className: "skippr:flex skippr:items-start skippr:gap-2 skippr:animate-skippr-tab-fade",
|
|
3849
4064
|
children: [
|
|
3850
|
-
/* @__PURE__ */
|
|
4065
|
+
/* @__PURE__ */ jsx15("div", {
|
|
3851
4066
|
className: "skippr:mt-0.5 skippr:flex skippr:size-7 skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-md skippr:bg-primary",
|
|
3852
|
-
children: /* @__PURE__ */
|
|
4067
|
+
children: /* @__PURE__ */ jsx15(Sparkles, {
|
|
3853
4068
|
className: "skippr:size-3.5 skippr:text-primary-foreground"
|
|
3854
4069
|
})
|
|
3855
4070
|
}),
|
|
3856
|
-
/* @__PURE__ */
|
|
4071
|
+
/* @__PURE__ */ jsxs12("div", {
|
|
3857
4072
|
className: "skippr:inline-flex skippr:items-center skippr:gap-1 skippr:rounded-2xl skippr:border skippr:border-primary/20 skippr:bg-primary/10 skippr:px-4 skippr:py-2 skippr:text-xs skippr:text-primary",
|
|
3858
4073
|
children: [
|
|
3859
|
-
/* @__PURE__ */
|
|
4074
|
+
/* @__PURE__ */ jsx15("span", {
|
|
3860
4075
|
children: "Agent is analyzing your screen"
|
|
3861
4076
|
}),
|
|
3862
|
-
/* @__PURE__ */
|
|
4077
|
+
/* @__PURE__ */ jsxs12("span", {
|
|
3863
4078
|
className: "skippr:inline-flex skippr:items-center skippr:gap-[2px]",
|
|
3864
4079
|
children: [
|
|
3865
|
-
/* @__PURE__ */
|
|
4080
|
+
/* @__PURE__ */ jsx15("span", {
|
|
3866
4081
|
className: "skippr:size-1 skippr:rounded-full skippr:bg-primary skippr:animate-skippr-thinking-dot skippr:[animation-delay:0ms]"
|
|
3867
4082
|
}),
|
|
3868
|
-
/* @__PURE__ */
|
|
4083
|
+
/* @__PURE__ */ jsx15("span", {
|
|
3869
4084
|
className: "skippr:size-1 skippr:rounded-full skippr:bg-primary skippr:animate-skippr-thinking-dot skippr:[animation-delay:200ms]"
|
|
3870
4085
|
}),
|
|
3871
|
-
/* @__PURE__ */
|
|
4086
|
+
/* @__PURE__ */ jsx15("span", {
|
|
3872
4087
|
className: "skippr:size-1 skippr:rounded-full skippr:bg-primary skippr:animate-skippr-thinking-dot skippr:[animation-delay:400ms]"
|
|
3873
4088
|
})
|
|
3874
4089
|
]
|
|
@@ -3880,7 +4095,8 @@ function TypingIndicator() {
|
|
|
3880
4095
|
}
|
|
3881
4096
|
|
|
3882
4097
|
// src/components/MessageList.tsx
|
|
3883
|
-
import { jsx as
|
|
4098
|
+
import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
4099
|
+
var NEAR_BOTTOM_THRESHOLD_PX = 80;
|
|
3884
4100
|
function MessageList({
|
|
3885
4101
|
messages,
|
|
3886
4102
|
isStreaming,
|
|
@@ -3888,31 +4104,44 @@ function MessageList({
|
|
|
3888
4104
|
isSendingChat,
|
|
3889
4105
|
autoFocus = false
|
|
3890
4106
|
}) {
|
|
3891
|
-
const
|
|
4107
|
+
const containerRef = useRef15(null);
|
|
4108
|
+
const isPinnedToBottomRef = useRef15(true);
|
|
3892
4109
|
const lastMessage = messages.length > 0 ? messages[messages.length - 1] : undefined;
|
|
3893
|
-
|
|
3894
|
-
|
|
4110
|
+
const trackPinnedToBottom = () => {
|
|
4111
|
+
const container = containerRef.current;
|
|
4112
|
+
if (!container)
|
|
4113
|
+
return;
|
|
4114
|
+
const distanceFromBottom = container.scrollHeight - container.scrollTop - container.clientHeight;
|
|
4115
|
+
isPinnedToBottomRef.current = distanceFromBottom < NEAR_BOTTOM_THRESHOLD_PX;
|
|
4116
|
+
};
|
|
4117
|
+
useLayoutEffect2(() => {
|
|
4118
|
+
const container = containerRef.current;
|
|
4119
|
+
if (!container)
|
|
4120
|
+
return;
|
|
4121
|
+
const userSentChat = lastMessage?.role === "user" && lastMessage.source === "chat";
|
|
4122
|
+
if (!isPinnedToBottomRef.current && !userSentChat)
|
|
4123
|
+
return;
|
|
4124
|
+
container.scrollTop = container.scrollHeight;
|
|
3895
4125
|
}, [messages.length, lastMessage?.content]);
|
|
3896
4126
|
const showTyping = isStreaming && lastMessage?.role === "assistant" && lastMessage.content === "";
|
|
3897
|
-
return /* @__PURE__ */
|
|
4127
|
+
return /* @__PURE__ */ jsxs13("div", {
|
|
3898
4128
|
className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col",
|
|
3899
4129
|
children: [
|
|
3900
|
-
/* @__PURE__ */
|
|
4130
|
+
/* @__PURE__ */ jsxs13("div", {
|
|
4131
|
+
ref: containerRef,
|
|
4132
|
+
onScroll: trackPinnedToBottom,
|
|
3901
4133
|
className: "skippr:min-h-0 skippr:flex-1 skippr:space-y-4 skippr:overflow-y-auto skippr:p-4",
|
|
3902
4134
|
children: [
|
|
3903
|
-
messages.length === 0 && !showTyping && /* @__PURE__ */
|
|
4135
|
+
messages.length === 0 && !showTyping && /* @__PURE__ */ jsx16(LoadingDots, {
|
|
3904
4136
|
label: "Waiting for conversation to begin..."
|
|
3905
4137
|
}),
|
|
3906
|
-
messages.map((message) => /* @__PURE__ */
|
|
4138
|
+
messages.map((message) => /* @__PURE__ */ jsx16(ChatMessage, {
|
|
3907
4139
|
message
|
|
3908
4140
|
}, message.id)),
|
|
3909
|
-
showTyping && /* @__PURE__ */
|
|
3910
|
-
/* @__PURE__ */ jsx17("div", {
|
|
3911
|
-
ref: scrollRef
|
|
3912
|
-
})
|
|
4141
|
+
showTyping && /* @__PURE__ */ jsx16(TypingIndicator, {})
|
|
3913
4142
|
]
|
|
3914
4143
|
}),
|
|
3915
|
-
/* @__PURE__ */
|
|
4144
|
+
/* @__PURE__ */ jsx16(ChatInput, {
|
|
3916
4145
|
sendChatMessage,
|
|
3917
4146
|
isSendingChat,
|
|
3918
4147
|
autoFocus
|
|
@@ -3921,239 +4150,50 @@ function MessageList({
|
|
|
3921
4150
|
});
|
|
3922
4151
|
}
|
|
3923
4152
|
|
|
3924
|
-
// src/components/ModuleSelector.tsx
|
|
3925
|
-
import { useEffect as useEffect18, useRef as useRef12, useState as useState14 } from "react";
|
|
3926
|
-
import { jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
3927
|
-
var AGENT_TYPE_ICONS = {
|
|
3928
|
-
onboarding: UserPlus,
|
|
3929
|
-
demo: Rocket,
|
|
3930
|
-
training: GraduationCap,
|
|
3931
|
-
support: Headset
|
|
3932
|
-
};
|
|
3933
|
-
function getAgentIcon(type) {
|
|
3934
|
-
return AGENT_TYPE_ICONS[type] ?? Bot;
|
|
3935
|
-
}
|
|
3936
|
-
function ModuleSelector() {
|
|
3937
|
-
const {
|
|
3938
|
-
availableModules,
|
|
3939
|
-
isLoadingModules,
|
|
3940
|
-
modulesError,
|
|
3941
|
-
refetchModules,
|
|
3942
|
-
selectModule,
|
|
3943
|
-
isStarting,
|
|
3944
|
-
isDisconnecting,
|
|
3945
|
-
error
|
|
3946
|
-
} = useLiveAgent();
|
|
3947
|
-
const isBusy = isStarting || isDisconnecting;
|
|
3948
|
-
const scrollRef = useRef12(null);
|
|
3949
|
-
const [showScrollHint, setShowScrollHint] = useState14(false);
|
|
3950
|
-
const [isScrolled, setIsScrolled] = useState14(false);
|
|
3951
|
-
useEffect18(() => {
|
|
3952
|
-
const el = scrollRef.current;
|
|
3953
|
-
if (!el)
|
|
3954
|
-
return;
|
|
3955
|
-
function update() {
|
|
3956
|
-
if (!el)
|
|
3957
|
-
return;
|
|
3958
|
-
const overflows = el.scrollHeight > el.clientHeight + 1;
|
|
3959
|
-
const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 4;
|
|
3960
|
-
setShowScrollHint(overflows && !atBottom);
|
|
3961
|
-
setIsScrolled(el.scrollTop > 0);
|
|
3962
|
-
}
|
|
3963
|
-
update();
|
|
3964
|
-
el.addEventListener("scroll", update, { passive: true });
|
|
3965
|
-
const observer = new ResizeObserver(update);
|
|
3966
|
-
observer.observe(el);
|
|
3967
|
-
return () => {
|
|
3968
|
-
el.removeEventListener("scroll", update);
|
|
3969
|
-
observer.disconnect();
|
|
3970
|
-
};
|
|
3971
|
-
}, []);
|
|
3972
|
-
if (isLoadingModules && availableModules.length === 0) {
|
|
3973
|
-
return /* @__PURE__ */ jsx18("div", {
|
|
3974
|
-
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center skippr:p-6",
|
|
3975
|
-
children: /* @__PURE__ */ jsx18(LoadingDots, {
|
|
3976
|
-
label: "Loading modules..."
|
|
3977
|
-
})
|
|
3978
|
-
});
|
|
3979
|
-
}
|
|
3980
|
-
if (modulesError) {
|
|
3981
|
-
return /* @__PURE__ */ jsxs15("div", {
|
|
3982
|
-
className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:items-center skippr:justify-center skippr:gap-3 skippr:p-6 skippr:text-center",
|
|
3983
|
-
children: [
|
|
3984
|
-
/* @__PURE__ */ jsx18("p", {
|
|
3985
|
-
className: "skippr:text-sm skippr:text-foreground",
|
|
3986
|
-
children: "Couldn't load modules."
|
|
3987
|
-
}),
|
|
3988
|
-
/* @__PURE__ */ jsx18("p", {
|
|
3989
|
-
className: "skippr:text-xs skippr:text-muted-foreground",
|
|
3990
|
-
children: modulesError
|
|
3991
|
-
}),
|
|
3992
|
-
/* @__PURE__ */ jsx18("button", {
|
|
3993
|
-
type: "button",
|
|
3994
|
-
onClick: () => void refetchModules(),
|
|
3995
|
-
className: "skippr:cursor-pointer skippr:rounded-lg skippr:bg-foreground skippr:px-3 skippr:py-1.5 skippr:text-xs skippr:font-medium skippr:text-background",
|
|
3996
|
-
children: "Try again"
|
|
3997
|
-
})
|
|
3998
|
-
]
|
|
3999
|
-
});
|
|
4000
|
-
}
|
|
4001
|
-
if (availableModules.length === 0) {
|
|
4002
|
-
return /* @__PURE__ */ jsx18("div", {
|
|
4003
|
-
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center skippr:p-6 skippr:text-center",
|
|
4004
|
-
children: /* @__PURE__ */ jsx18("p", {
|
|
4005
|
-
className: "skippr:text-sm skippr:text-muted-foreground",
|
|
4006
|
-
children: "No experts available."
|
|
4007
|
-
})
|
|
4008
|
-
});
|
|
4009
|
-
}
|
|
4010
|
-
return /* @__PURE__ */ jsxs15("div", {
|
|
4011
|
-
className: "skippr:relative skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col",
|
|
4012
|
-
children: [
|
|
4013
|
-
/* @__PURE__ */ jsxs15("div", {
|
|
4014
|
-
ref: scrollRef,
|
|
4015
|
-
className: "skippr-no-scrollbar skippr:flex-1 skippr:overflow-y-auto",
|
|
4016
|
-
children: [
|
|
4017
|
-
/* @__PURE__ */ jsx18("h3", {
|
|
4018
|
-
className: `skippr:sticky skippr:top-0 skippr:z-10 skippr:bg-background skippr:px-4 skippr:py-3 skippr:text-xs skippr:font-medium skippr:uppercase skippr:tracking-wider skippr:text-muted-foreground skippr:transition-shadow ${isScrolled ? "skippr:border-b skippr:border-border" : ""}`,
|
|
4019
|
-
children: "Choose an agent"
|
|
4020
|
-
}),
|
|
4021
|
-
/* @__PURE__ */ jsxs15("div", {
|
|
4022
|
-
className: "skippr:px-4 skippr:pt-3 skippr:pb-5",
|
|
4023
|
-
children: [
|
|
4024
|
-
error && /* @__PURE__ */ jsx18("div", {
|
|
4025
|
-
role: "alert",
|
|
4026
|
-
className: "skippr:mb-3 skippr:rounded-lg skippr:border skippr:border-destructive/20 skippr:bg-destructive/10 skippr:px-3 skippr:py-2 skippr:text-xs skippr:text-destructive",
|
|
4027
|
-
children: error
|
|
4028
|
-
}),
|
|
4029
|
-
/* @__PURE__ */ jsx18("div", {
|
|
4030
|
-
className: "skippr:grid skippr:grid-cols-2 skippr:gap-2.5",
|
|
4031
|
-
children: availableModules.map((module, index2) => {
|
|
4032
|
-
const isFeatured = index2 === 0;
|
|
4033
|
-
const isWide = index2 === availableModules.length - 1 && availableModules.length % 2 === 1;
|
|
4034
|
-
const Icon2 = getAgentIcon(module.type);
|
|
4035
|
-
const sessionState = getModuleSessionState(module.currentSession, module.mode);
|
|
4036
|
-
const isTerminal = sessionState === "completed" || sessionState === "expired";
|
|
4037
|
-
const base = "skippr:group skippr:flex skippr:cursor-pointer skippr:gap-3 skippr:rounded-xl skippr:text-left skippr:transition-colors skippr:disabled:cursor-not-allowed skippr:disabled:opacity-50";
|
|
4038
|
-
const layout = isWide ? "skippr:items-center skippr:p-3.5 skippr:pb-5" : "skippr:flex-col skippr:items-start skippr:p-3.5";
|
|
4039
|
-
const variant = isFeatured ? "skippr:bg-primary skippr:text-primary-foreground skippr:hover:bg-primary/90" : "skippr:bg-background skippr:ring-1 skippr:ring-foreground/10 skippr:hover:bg-muted/50";
|
|
4040
|
-
const span = isWide ? "skippr:col-span-2" : "";
|
|
4041
|
-
return /* @__PURE__ */ jsxs15("button", {
|
|
4042
|
-
type: "button",
|
|
4043
|
-
disabled: isBusy || isTerminal,
|
|
4044
|
-
onClick: () => selectModule(module.id),
|
|
4045
|
-
className: `${base} ${layout} ${variant} ${span}`,
|
|
4046
|
-
children: [
|
|
4047
|
-
/* @__PURE__ */ jsx18("div", {
|
|
4048
|
-
className: isFeatured ? "skippr:flex skippr:h-9 skippr:w-9 skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-lg skippr:bg-primary-foreground/15" : "skippr:flex skippr:h-9 skippr:w-9 skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-lg skippr:bg-muted",
|
|
4049
|
-
children: /* @__PURE__ */ jsx18(Icon2, {
|
|
4050
|
-
className: isFeatured ? "skippr:h-4 skippr:w-4" : "skippr:h-4 skippr:w-4 skippr:text-muted-foreground"
|
|
4051
|
-
})
|
|
4052
|
-
}),
|
|
4053
|
-
/* @__PURE__ */ jsxs15("div", {
|
|
4054
|
-
className: "skippr:min-w-0 skippr:w-full skippr:space-y-0.5",
|
|
4055
|
-
children: [
|
|
4056
|
-
/* @__PURE__ */ jsxs15("div", {
|
|
4057
|
-
className: "skippr:flex skippr:items-center skippr:gap-1.5",
|
|
4058
|
-
children: [
|
|
4059
|
-
/* @__PURE__ */ jsx18("p", {
|
|
4060
|
-
className: "skippr:line-clamp-1 skippr:text-sm skippr:font-semibold",
|
|
4061
|
-
children: module.name
|
|
4062
|
-
}),
|
|
4063
|
-
sessionState === "resume" && /* @__PURE__ */ jsxs15("span", {
|
|
4064
|
-
className: `skippr:inline-flex skippr:shrink-0 skippr:items-center skippr:gap-0.5 skippr:rounded-full skippr:px-1.5 skippr:py-0.5 skippr:text-[9px] skippr:font-medium skippr:uppercase skippr:tracking-wide ${isFeatured ? "skippr:bg-primary-foreground/20 skippr:text-primary-foreground" : "skippr:bg-bubble/15 skippr:text-bubble"}`,
|
|
4065
|
-
children: [
|
|
4066
|
-
/* @__PURE__ */ jsx18(Play, {
|
|
4067
|
-
className: "skippr:size-2.5"
|
|
4068
|
-
}),
|
|
4069
|
-
"Resume"
|
|
4070
|
-
]
|
|
4071
|
-
}),
|
|
4072
|
-
sessionState === "completed" && /* @__PURE__ */ jsxs15("span", {
|
|
4073
|
-
className: "skippr:inline-flex skippr:shrink-0 skippr:items-center skippr:gap-0.5 skippr:rounded-full skippr:bg-muted skippr:px-1.5 skippr:py-0.5 skippr:text-[9px] skippr:font-medium skippr:uppercase skippr:tracking-wide skippr:text-muted-foreground",
|
|
4074
|
-
children: [
|
|
4075
|
-
/* @__PURE__ */ jsx18(CircleCheck, {
|
|
4076
|
-
className: "skippr:size-2.5"
|
|
4077
|
-
}),
|
|
4078
|
-
"Completed"
|
|
4079
|
-
]
|
|
4080
|
-
}),
|
|
4081
|
-
sessionState === "expired" && /* @__PURE__ */ jsxs15("span", {
|
|
4082
|
-
className: "skippr:inline-flex skippr:shrink-0 skippr:items-center skippr:gap-0.5 skippr:rounded-full skippr:bg-muted skippr:px-1.5 skippr:py-0.5 skippr:text-[9px] skippr:font-medium skippr:uppercase skippr:tracking-wide skippr:text-muted-foreground",
|
|
4083
|
-
children: [
|
|
4084
|
-
/* @__PURE__ */ jsx18(Clock, {
|
|
4085
|
-
className: "skippr:size-2.5"
|
|
4086
|
-
}),
|
|
4087
|
-
"Expired"
|
|
4088
|
-
]
|
|
4089
|
-
})
|
|
4090
|
-
]
|
|
4091
|
-
}),
|
|
4092
|
-
module.description && /* @__PURE__ */ jsx18("p", {
|
|
4093
|
-
className: isFeatured ? "skippr:line-clamp-2 skippr:text-[11px] skippr:leading-snug skippr:text-primary-foreground/70" : "skippr:line-clamp-2 skippr:text-[11px] skippr:leading-snug skippr:text-muted-foreground",
|
|
4094
|
-
children: module.description
|
|
4095
|
-
})
|
|
4096
|
-
]
|
|
4097
|
-
})
|
|
4098
|
-
]
|
|
4099
|
-
}, module.id);
|
|
4100
|
-
})
|
|
4101
|
-
})
|
|
4102
|
-
]
|
|
4103
|
-
})
|
|
4104
|
-
]
|
|
4105
|
-
}),
|
|
4106
|
-
showScrollHint && /* @__PURE__ */ jsx18("div", {
|
|
4107
|
-
className: "skippr:pointer-events-none skippr:absolute skippr:bottom-0 skippr:left-0 skippr:right-0 skippr:h-12 skippr:bg-gradient-to-t skippr:from-background skippr:to-transparent"
|
|
4108
|
-
})
|
|
4109
|
-
]
|
|
4110
|
-
});
|
|
4111
|
-
}
|
|
4112
|
-
|
|
4113
4153
|
// src/components/SessionAgenda.tsx
|
|
4114
|
-
import { jsx as
|
|
4154
|
+
import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
4115
4155
|
function SessionAgenda({ phases, hasStarted }) {
|
|
4116
4156
|
if (phases.length === 0 || !hasStarted) {
|
|
4117
|
-
return /* @__PURE__ */
|
|
4157
|
+
return /* @__PURE__ */ jsx17("div", {
|
|
4118
4158
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
|
|
4119
|
-
children: /* @__PURE__ */
|
|
4159
|
+
children: /* @__PURE__ */ jsx17(LoadingDots, {
|
|
4120
4160
|
label: "Waiting for agenda to load..."
|
|
4121
4161
|
})
|
|
4122
4162
|
});
|
|
4123
4163
|
}
|
|
4124
|
-
return /* @__PURE__ */
|
|
4164
|
+
return /* @__PURE__ */ jsx17("div", {
|
|
4125
4165
|
className: "skippr:flex-1 skippr:overflow-y-auto skippr:px-4 skippr:py-4",
|
|
4126
|
-
children: /* @__PURE__ */
|
|
4166
|
+
children: /* @__PURE__ */ jsx17("div", {
|
|
4127
4167
|
className: "skippr:space-y-1",
|
|
4128
4168
|
children: phases.map((phase) => {
|
|
4129
4169
|
const isActive = phase.status === "active";
|
|
4130
4170
|
const isCompleted = phase.status === "completed";
|
|
4131
|
-
return /* @__PURE__ */
|
|
4171
|
+
return /* @__PURE__ */ jsxs14("div", {
|
|
4132
4172
|
className: cn("skippr:flex skippr:items-start skippr:gap-2.5 skippr:rounded-lg skippr:p-2 skippr:transition-colors", isActive && "skippr:bg-primary/10"),
|
|
4133
4173
|
children: [
|
|
4134
|
-
/* @__PURE__ */
|
|
4174
|
+
/* @__PURE__ */ jsx17("div", {
|
|
4135
4175
|
className: "skippr:mt-0.5",
|
|
4136
|
-
children: isCompleted ? /* @__PURE__ */
|
|
4176
|
+
children: isCompleted ? /* @__PURE__ */ jsx17(CircleCheck, {
|
|
4137
4177
|
className: "skippr:size-4 skippr:text-chart-3"
|
|
4138
|
-
}) : isActive ? /* @__PURE__ */
|
|
4178
|
+
}) : isActive ? /* @__PURE__ */ jsx17(Circle, {
|
|
4139
4179
|
className: "skippr:size-4 skippr:fill-primary/30 skippr:text-primary"
|
|
4140
|
-
}) : /* @__PURE__ */
|
|
4180
|
+
}) : /* @__PURE__ */ jsx17(Circle, {
|
|
4141
4181
|
className: "skippr:size-4 skippr:text-muted-foreground/30"
|
|
4142
4182
|
})
|
|
4143
4183
|
}),
|
|
4144
|
-
/* @__PURE__ */
|
|
4184
|
+
/* @__PURE__ */ jsxs14("div", {
|
|
4145
4185
|
className: "skippr:min-w-0 skippr:flex-1",
|
|
4146
4186
|
children: [
|
|
4147
|
-
/* @__PURE__ */
|
|
4187
|
+
/* @__PURE__ */ jsx17("p", {
|
|
4148
4188
|
className: cn("skippr:text-sm", isCompleted && "skippr:text-muted-foreground skippr:line-through", isActive && "skippr:font-medium skippr:text-foreground", phase.status === "pending" && "skippr:text-muted-foreground"),
|
|
4149
4189
|
children: phase.name
|
|
4150
4190
|
}),
|
|
4151
|
-
phase.highlights.length > 0 && /* @__PURE__ */
|
|
4191
|
+
phase.highlights.length > 0 && /* @__PURE__ */ jsx17("ul", {
|
|
4152
4192
|
className: "skippr:mt-1 skippr:space-y-0.5",
|
|
4153
|
-
children: phase.highlights.map((text) => /* @__PURE__ */
|
|
4193
|
+
children: phase.highlights.map((text) => /* @__PURE__ */ jsxs14("li", {
|
|
4154
4194
|
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"),
|
|
4155
4195
|
children: [
|
|
4156
|
-
/* @__PURE__ */
|
|
4196
|
+
/* @__PURE__ */ jsx17("span", {
|
|
4157
4197
|
className: "skippr:size-1 skippr:shrink-0 skippr:rounded-full skippr:bg-current"
|
|
4158
4198
|
}),
|
|
4159
4199
|
text
|
|
@@ -4170,12 +4210,12 @@ function SessionAgenda({ phases, hasStarted }) {
|
|
|
4170
4210
|
}
|
|
4171
4211
|
|
|
4172
4212
|
// src/components/SessionWarningBanner.tsx
|
|
4173
|
-
import { jsx as
|
|
4213
|
+
import { jsx as jsx18 } from "react/jsx-runtime";
|
|
4174
4214
|
var SESSION_WARNING_THRESHOLD_SECS = 60;
|
|
4175
4215
|
function SessionWarningBanner({ remaining }) {
|
|
4176
4216
|
if (remaining === null || remaining <= 0 || remaining > SESSION_WARNING_THRESHOLD_SECS)
|
|
4177
4217
|
return null;
|
|
4178
|
-
return /* @__PURE__ */
|
|
4218
|
+
return /* @__PURE__ */ jsx18("div", {
|
|
4179
4219
|
"data-testid": "session-warning-banner",
|
|
4180
4220
|
className: "skippr:bg-red-50 skippr:px-4 skippr:py-1.5 skippr:text-center skippr:text-xs skippr:font-medium skippr:text-red-700",
|
|
4181
4221
|
children: "Session ending soon"
|
|
@@ -4183,7 +4223,7 @@ function SessionWarningBanner({ remaining }) {
|
|
|
4183
4223
|
}
|
|
4184
4224
|
|
|
4185
4225
|
// src/components/StartSessionPrompt.tsx
|
|
4186
|
-
import { jsx as
|
|
4226
|
+
import { jsx as jsx19, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
4187
4227
|
var PROMPT_BUTTON = "skippr:cursor-pointer skippr:rounded-xl skippr:bg-primary skippr:px-8 skippr:py-3 skippr:text-sm skippr:font-medium skippr:text-primary-foreground skippr:transition-all skippr:hover:bg-primary/90 skippr:disabled:cursor-not-allowed skippr:disabled:opacity-60";
|
|
4188
4228
|
function StartSessionPrompt({
|
|
4189
4229
|
onStartSession,
|
|
@@ -4195,16 +4235,16 @@ function StartSessionPrompt({
|
|
|
4195
4235
|
canResume = false,
|
|
4196
4236
|
onResume
|
|
4197
4237
|
}) {
|
|
4198
|
-
return /* @__PURE__ */
|
|
4238
|
+
return /* @__PURE__ */ jsxs15("div", {
|
|
4199
4239
|
className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:items-center skippr:justify-center skippr:gap-3 skippr:px-4",
|
|
4200
4240
|
children: [
|
|
4201
|
-
canResume && onResume ? /* @__PURE__ */
|
|
4241
|
+
canResume && onResume ? /* @__PURE__ */ jsx19("button", {
|
|
4202
4242
|
type: "button",
|
|
4203
4243
|
onClick: onResume,
|
|
4204
4244
|
disabled: isStarting,
|
|
4205
4245
|
className: PROMPT_BUTTON,
|
|
4206
4246
|
children: isStarting ? "Resuming..." : "Resume session"
|
|
4207
|
-
}) : /* @__PURE__ */
|
|
4247
|
+
}) : /* @__PURE__ */ jsx19("button", {
|
|
4208
4248
|
type: "button",
|
|
4209
4249
|
onClick: () => {
|
|
4210
4250
|
if (!agentId)
|
|
@@ -4215,7 +4255,7 @@ function StartSessionPrompt({
|
|
|
4215
4255
|
className: PROMPT_BUTTON,
|
|
4216
4256
|
children: isStarting ? "Starting..." : label
|
|
4217
4257
|
}),
|
|
4218
|
-
error && /* @__PURE__ */
|
|
4258
|
+
error && /* @__PURE__ */ jsx19("p", {
|
|
4219
4259
|
className: "skippr:text-xs skippr:text-destructive",
|
|
4220
4260
|
children: error
|
|
4221
4261
|
})
|
|
@@ -4224,7 +4264,10 @@ function StartSessionPrompt({
|
|
|
4224
4264
|
}
|
|
4225
4265
|
|
|
4226
4266
|
// src/components/Sidebar.tsx
|
|
4227
|
-
import { jsx as
|
|
4267
|
+
import { jsx as jsx20, jsxs as jsxs16, Fragment as Fragment2 } from "react/jsx-runtime";
|
|
4268
|
+
var PANEL_GAP_PX = 12;
|
|
4269
|
+
var PANEL_VIEWPORT_MARGIN_PX = 24;
|
|
4270
|
+
var PANEL_MAX_HEIGHT_PX = 460;
|
|
4228
4271
|
function Sidebar({
|
|
4229
4272
|
hideControls = false,
|
|
4230
4273
|
hideHeader = false,
|
|
@@ -4239,10 +4282,8 @@ function Sidebar({
|
|
|
4239
4282
|
isPaused,
|
|
4240
4283
|
error,
|
|
4241
4284
|
startSession,
|
|
4242
|
-
pauseSession,
|
|
4243
4285
|
resumeSession,
|
|
4244
4286
|
resumableSession,
|
|
4245
|
-
disconnect,
|
|
4246
4287
|
isPanelOpen,
|
|
4247
4288
|
position,
|
|
4248
4289
|
isAuthenticated,
|
|
@@ -4254,18 +4295,29 @@ function Sidebar({
|
|
|
4254
4295
|
sidebarTab: activeTab,
|
|
4255
4296
|
setSidebarTab: setActiveTab,
|
|
4256
4297
|
autoFocusChat,
|
|
4257
|
-
captureMode,
|
|
4258
|
-
hasModuleSelector,
|
|
4259
4298
|
agentId,
|
|
4260
4299
|
agentMode,
|
|
4261
4300
|
agentControls
|
|
4262
4301
|
} = useLiveAgent();
|
|
4263
|
-
const internalCtx =
|
|
4302
|
+
const internalCtx = useContext9(LiveAgentContext);
|
|
4264
4303
|
const usesHostAuth = internalCtx?.usesHostAuth ?? false;
|
|
4265
4304
|
const authFailed = internalCtx?.authFailed ?? false;
|
|
4305
|
+
const launcherBottomPx = internalCtx?.launcherBottomPx ?? DEFAULT_LAUNCHER_BOTTOM_PX;
|
|
4306
|
+
const popsDown = internalCtx?.popsDown ?? false;
|
|
4307
|
+
const panelExpanded = internalCtx?.panelExpanded ?? false;
|
|
4266
4308
|
const showAgenda = agentMode !== AGENT_MODE.AlwaysOn;
|
|
4267
4309
|
const isFloating = variant === "floating";
|
|
4268
4310
|
const isSidebar = variant === "sidebar";
|
|
4311
|
+
const inSession = isConnected || isStarting || isPausing;
|
|
4312
|
+
const floatingBottomPx = inSession ? launcherBottomPx + SESSION_BAR_CLEARANCE_PX : triggerBottomPx(launcherBottomPx, popsDown) + IDLE_TRIGGER_CLEARANCE_PX;
|
|
4313
|
+
let floatingStyle;
|
|
4314
|
+
if (isFloating) {
|
|
4315
|
+
const availableHeight = popsDown ? `${launcherBottomPx - PANEL_GAP_PX - PANEL_VIEWPORT_MARGIN_PX}px` : `calc(100vh - ${floatingBottomPx + PANEL_VIEWPORT_MARGIN_PX}px)`;
|
|
4316
|
+
floatingStyle = {
|
|
4317
|
+
...popsDown ? { top: `calc(100vh - ${launcherBottomPx - PANEL_GAP_PX}px)` } : { bottom: floatingBottomPx },
|
|
4318
|
+
height: panelExpanded ? availableHeight : `min(${PANEL_MAX_HEIGHT_PX}px, ${availableHeight})`
|
|
4319
|
+
};
|
|
4320
|
+
}
|
|
4269
4321
|
useEffect19(() => {
|
|
4270
4322
|
if (!isSidebar)
|
|
4271
4323
|
return;
|
|
@@ -4280,21 +4332,19 @@ function Sidebar({
|
|
|
4280
4332
|
document.body.style.transition = "";
|
|
4281
4333
|
};
|
|
4282
4334
|
}, [isSidebar, isPanelOpen, position]);
|
|
4283
|
-
return /* @__PURE__ */
|
|
4284
|
-
className: cn("skippr:fixed skippr:z-[9999]", "skippr:bg-card", "skippr:flex skippr:flex-col", "skippr:overflow-hidden", isFloating && "skippr:border skippr:border-border skippr:
|
|
4285
|
-
style: { width: isPanelOpen ? SIDEBAR_WIDTH : undefined },
|
|
4335
|
+
return /* @__PURE__ */ jsxs16("div", {
|
|
4336
|
+
className: cn("skippr:fixed skippr:z-[9999]", "skippr:bg-card", "skippr:flex skippr:flex-col", "skippr:overflow-hidden", isFloating && "skippr:border skippr:border-border skippr:rounded-2xl skippr:shadow-[0_8px_30px_rgba(0,0,0,0.16),0_4px_12px_rgba(0,0,0,0.08)]", isFloating && (position === "right" ? "skippr:right-6" : "skippr:left-6"), isFloating && "skippr:transition-[opacity,transform,height] skippr:duration-300 skippr:ease-in-out", isFloating && (popsDown ? position === "right" ? "skippr:origin-top-right" : "skippr:origin-top-left" : position === "right" ? "skippr:origin-bottom-right" : "skippr:origin-bottom-left"), isFloating && !isPanelOpen && "skippr:scale-0 skippr:opacity-0 skippr:pointer-events-none", isFloating && isPanelOpen && "skippr:scale-100 skippr:opacity-100", isSidebar && "skippr:top-0 skippr:h-full", isSidebar && "skippr:transition-[width] skippr:duration-300 skippr:ease-in-out", isSidebar && position === "right" && "skippr:right-0 skippr:border-l skippr:border-l-border", isSidebar && position === "left" && "skippr:left-0 skippr:border-r skippr:border-r-border", isSidebar && !isPanelOpen && "skippr:w-0 skippr:border-0"),
|
|
4337
|
+
style: { width: isPanelOpen ? SIDEBAR_WIDTH : undefined, ...floatingStyle },
|
|
4286
4338
|
children: [
|
|
4287
|
-
!hideHeader && /* @__PURE__ */
|
|
4288
|
-
authFailed ? /* @__PURE__ */
|
|
4339
|
+
!hideHeader && /* @__PURE__ */ jsx20(ChatHeader, {}),
|
|
4340
|
+
authFailed ? /* @__PURE__ */ jsx20(AuthError, {}) : isAuthenticated ? /* @__PURE__ */ jsx20(AuthenticatedContent, {
|
|
4289
4341
|
isConnected,
|
|
4290
4342
|
isPaused,
|
|
4291
4343
|
isPausing,
|
|
4292
4344
|
isDisconnecting,
|
|
4293
4345
|
canResume: resumableSession !== null,
|
|
4294
4346
|
onStartSession: startSession,
|
|
4295
|
-
onPause: pauseSession,
|
|
4296
4347
|
onResume: resumeSession,
|
|
4297
|
-
onDisconnect: disconnect,
|
|
4298
4348
|
isStarting,
|
|
4299
4349
|
error,
|
|
4300
4350
|
activeTab,
|
|
@@ -4302,17 +4352,15 @@ function Sidebar({
|
|
|
4302
4352
|
hideControls,
|
|
4303
4353
|
startSessionLabel,
|
|
4304
4354
|
autoFocusChat,
|
|
4305
|
-
showScreenShareToggle: captureMode === "screenshare",
|
|
4306
|
-
hasModuleSelector,
|
|
4307
4355
|
agentId,
|
|
4308
4356
|
agentControls,
|
|
4309
4357
|
showAgenda
|
|
4310
|
-
}) : usesHostAuth || isValidating ? /* @__PURE__ */
|
|
4358
|
+
}) : usesHostAuth || isValidating ? /* @__PURE__ */ jsx20("div", {
|
|
4311
4359
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
|
|
4312
|
-
children: /* @__PURE__ */
|
|
4360
|
+
children: /* @__PURE__ */ jsx20(LoadingDots, {
|
|
4313
4361
|
label: "Loading..."
|
|
4314
4362
|
})
|
|
4315
|
-
}) : /* @__PURE__ */
|
|
4363
|
+
}) : /* @__PURE__ */ jsx20(LoginFlow, {
|
|
4316
4364
|
requestOtp,
|
|
4317
4365
|
verifyOtp,
|
|
4318
4366
|
error: authError,
|
|
@@ -4328,9 +4376,7 @@ function AuthenticatedContent({
|
|
|
4328
4376
|
isDisconnecting,
|
|
4329
4377
|
canResume,
|
|
4330
4378
|
onStartSession,
|
|
4331
|
-
onPause,
|
|
4332
4379
|
onResume,
|
|
4333
|
-
onDisconnect,
|
|
4334
4380
|
isStarting,
|
|
4335
4381
|
error,
|
|
4336
4382
|
activeTab,
|
|
@@ -4338,15 +4384,11 @@ function AuthenticatedContent({
|
|
|
4338
4384
|
hideControls,
|
|
4339
4385
|
startSessionLabel,
|
|
4340
4386
|
autoFocusChat,
|
|
4341
|
-
showScreenShareToggle,
|
|
4342
|
-
hasModuleSelector,
|
|
4343
4387
|
agentId,
|
|
4344
4388
|
agentControls,
|
|
4345
4389
|
showAgenda
|
|
4346
4390
|
}) {
|
|
4347
4391
|
const inSession = isConnected || isStarting || isPaused || isPausing;
|
|
4348
|
-
const showSelectorAsPrompt = hasModuleSelector && !inSession && !isDisconnecting;
|
|
4349
|
-
const showTabBar = !showSelectorAsPrompt;
|
|
4350
4392
|
const effectiveTab = showAgenda ? activeTab : "chat";
|
|
4351
4393
|
let transitionLabel = null;
|
|
4352
4394
|
if (isPausing) {
|
|
@@ -4356,63 +4398,63 @@ function AuthenticatedContent({
|
|
|
4356
4398
|
} else if (isPaused) {
|
|
4357
4399
|
transitionLabel = "Paused";
|
|
4358
4400
|
}
|
|
4359
|
-
return /* @__PURE__ */
|
|
4401
|
+
return /* @__PURE__ */ jsxs16(Fragment2, {
|
|
4360
4402
|
children: [
|
|
4361
|
-
isConnected && /* @__PURE__ */
|
|
4362
|
-
|
|
4363
|
-
className: "skippr:flex skippr:items-center skippr:gap-2 skippr:border-b skippr:border-border skippr:px-3 skippr:py-
|
|
4403
|
+
isConnected && /* @__PURE__ */ jsx20(ConnectedBanner, {}),
|
|
4404
|
+
/* @__PURE__ */ jsxs16("div", {
|
|
4405
|
+
className: "skippr:flex skippr:items-center skippr:gap-2 skippr:border-b skippr:border-border skippr:px-3 skippr:py-1",
|
|
4364
4406
|
children: [
|
|
4365
|
-
/* @__PURE__ */
|
|
4407
|
+
/* @__PURE__ */ jsxs16("button", {
|
|
4366
4408
|
type: "button",
|
|
4367
|
-
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-
|
|
4409
|
+
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"),
|
|
4368
4410
|
onClick: () => onTabChange("chat"),
|
|
4369
4411
|
children: [
|
|
4370
|
-
/* @__PURE__ */
|
|
4412
|
+
/* @__PURE__ */ jsx20(MessageCircle, {
|
|
4371
4413
|
className: "skippr:size-3.5"
|
|
4372
4414
|
}),
|
|
4373
4415
|
"Chat",
|
|
4374
|
-
activeTab === "chat" && /* @__PURE__ */
|
|
4375
|
-
className: "skippr:absolute skippr:-bottom-
|
|
4416
|
+
activeTab === "chat" && /* @__PURE__ */ jsx20("span", {
|
|
4417
|
+
className: "skippr:absolute skippr:-bottom-1 skippr:left-3 skippr:right-3 skippr:h-0.5 skippr:rounded-full skippr:bg-foreground"
|
|
4376
4418
|
})
|
|
4377
4419
|
]
|
|
4378
4420
|
}),
|
|
4379
|
-
showAgenda && /* @__PURE__ */
|
|
4421
|
+
showAgenda && /* @__PURE__ */ jsxs16("button", {
|
|
4380
4422
|
type: "button",
|
|
4381
|
-
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-
|
|
4423
|
+
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"),
|
|
4382
4424
|
onClick: () => onTabChange("agenda"),
|
|
4383
4425
|
children: [
|
|
4384
|
-
/* @__PURE__ */
|
|
4426
|
+
/* @__PURE__ */ jsx20(Calendar, {
|
|
4385
4427
|
className: "skippr:size-3.5"
|
|
4386
4428
|
}),
|
|
4387
4429
|
"Agenda",
|
|
4388
|
-
activeTab === "agenda" && /* @__PURE__ */
|
|
4389
|
-
className: "skippr:absolute skippr:-bottom-
|
|
4430
|
+
activeTab === "agenda" && /* @__PURE__ */ jsx20("span", {
|
|
4431
|
+
className: "skippr:absolute skippr:-bottom-1 skippr:left-3 skippr:right-3 skippr:h-0.5 skippr:rounded-full skippr:bg-foreground"
|
|
4390
4432
|
})
|
|
4391
4433
|
]
|
|
4392
4434
|
})
|
|
4393
4435
|
]
|
|
4394
4436
|
}),
|
|
4395
|
-
/* @__PURE__ */
|
|
4437
|
+
/* @__PURE__ */ jsx20("div", {
|
|
4396
4438
|
className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col",
|
|
4397
|
-
children: isDisconnecting ? /* @__PURE__ */
|
|
4439
|
+
children: isDisconnecting ? /* @__PURE__ */ jsx20("div", {
|
|
4398
4440
|
className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
|
|
4399
|
-
children: /* @__PURE__ */
|
|
4441
|
+
children: /* @__PURE__ */ jsx20(LoadingDots, {
|
|
4400
4442
|
label: "Ending session..."
|
|
4401
4443
|
})
|
|
4402
|
-
}) :
|
|
4444
|
+
}) : inSession ? /* @__PURE__ */ jsxs16(Fragment2, {
|
|
4403
4445
|
children: [
|
|
4404
|
-
transitionLabel && /* @__PURE__ */
|
|
4446
|
+
transitionLabel && /* @__PURE__ */ jsx20("div", {
|
|
4405
4447
|
className: "skippr:shrink-0 skippr:border-b skippr:border-border skippr:bg-muted/50 skippr:px-3 skippr:py-1.5 skippr:text-center skippr:text-xs skippr:text-muted-foreground",
|
|
4406
4448
|
children: transitionLabel
|
|
4407
4449
|
}),
|
|
4408
|
-
/* @__PURE__ */
|
|
4450
|
+
/* @__PURE__ */ jsx20(ConnectedBody, {
|
|
4409
4451
|
activeTab: effectiveTab,
|
|
4410
4452
|
autoFocusChat
|
|
4411
4453
|
})
|
|
4412
4454
|
]
|
|
4413
|
-
}) : /* @__PURE__ */
|
|
4455
|
+
}) : /* @__PURE__ */ jsx20("div", {
|
|
4414
4456
|
className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col skippr:animate-skippr-tab-fade",
|
|
4415
|
-
children: /* @__PURE__ */
|
|
4457
|
+
children: /* @__PURE__ */ jsx20(StartSessionPrompt, {
|
|
4416
4458
|
onStartSession,
|
|
4417
4459
|
agentId,
|
|
4418
4460
|
agentControls,
|
|
@@ -4424,29 +4466,58 @@ function AuthenticatedContent({
|
|
|
4424
4466
|
})
|
|
4425
4467
|
}, `${activeTab}-empty`)
|
|
4426
4468
|
}),
|
|
4427
|
-
|
|
4428
|
-
|
|
4429
|
-
|
|
4430
|
-
|
|
4431
|
-
|
|
4432
|
-
|
|
4433
|
-
|
|
4469
|
+
!hideControls && /* @__PURE__ */ jsxs16("div", {
|
|
4470
|
+
className: "skippr:shrink-0 skippr:border-t skippr:border-border",
|
|
4471
|
+
children: [
|
|
4472
|
+
isConnected && !isDisconnecting && /* @__PURE__ */ jsx20(ModeToggleRow, {}),
|
|
4473
|
+
/* @__PURE__ */ jsx20("div", {
|
|
4474
|
+
className: "skippr:px-4 skippr:pt-1.5 skippr:pb-2 skippr:text-center skippr:text-[10px] skippr:text-muted-foreground",
|
|
4475
|
+
children: "Powered by Skippr"
|
|
4476
|
+
})
|
|
4477
|
+
]
|
|
4434
4478
|
})
|
|
4435
4479
|
]
|
|
4436
4480
|
});
|
|
4437
4481
|
}
|
|
4482
|
+
function ModeToggleRow() {
|
|
4483
|
+
const { textMode, toggleTextMode } = useTextMode();
|
|
4484
|
+
return /* @__PURE__ */ jsx20("div", {
|
|
4485
|
+
className: "skippr:flex skippr:justify-center skippr:px-3 skippr:pt-2 skippr:pb-0",
|
|
4486
|
+
children: /* @__PURE__ */ jsx20("button", {
|
|
4487
|
+
type: "button",
|
|
4488
|
+
"aria-label": textMode ? "Switch to voice mode" : "Switch to text mode",
|
|
4489
|
+
className: "skippr:flex skippr:cursor-pointer skippr:items-center skippr:gap-2 skippr:rounded-xl skippr:bg-muted skippr:px-4 skippr:py-1.5 skippr:text-sm skippr:font-medium skippr:text-foreground skippr:transition-colors skippr:hover:bg-muted/70",
|
|
4490
|
+
onClick: () => void toggleTextMode(),
|
|
4491
|
+
children: textMode ? /* @__PURE__ */ jsxs16(Fragment2, {
|
|
4492
|
+
children: [
|
|
4493
|
+
/* @__PURE__ */ jsx20(Mic, {
|
|
4494
|
+
className: "skippr:size-4"
|
|
4495
|
+
}),
|
|
4496
|
+
"Voice mode"
|
|
4497
|
+
]
|
|
4498
|
+
}) : /* @__PURE__ */ jsxs16(Fragment2, {
|
|
4499
|
+
children: [
|
|
4500
|
+
/* @__PURE__ */ jsx20(MessageSquare, {
|
|
4501
|
+
className: "skippr:size-4"
|
|
4502
|
+
}),
|
|
4503
|
+
"Text mode"
|
|
4504
|
+
]
|
|
4505
|
+
})
|
|
4506
|
+
})
|
|
4507
|
+
});
|
|
4508
|
+
}
|
|
4438
4509
|
function AuthError() {
|
|
4439
|
-
return /* @__PURE__ */
|
|
4510
|
+
return /* @__PURE__ */ jsxs16("div", {
|
|
4440
4511
|
className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:items-center skippr:justify-center skippr:px-6 skippr:py-4 skippr:text-center",
|
|
4441
4512
|
children: [
|
|
4442
|
-
/* @__PURE__ */
|
|
4513
|
+
/* @__PURE__ */ jsx20(CircleAlert, {
|
|
4443
4514
|
className: "skippr:mb-3 skippr:size-7 skippr:text-destructive"
|
|
4444
4515
|
}),
|
|
4445
|
-
/* @__PURE__ */
|
|
4516
|
+
/* @__PURE__ */ jsx20("p", {
|
|
4446
4517
|
className: "skippr:text-sm skippr:font-medium skippr:text-foreground",
|
|
4447
4518
|
children: "We couldn't verify your session"
|
|
4448
4519
|
}),
|
|
4449
|
-
/* @__PURE__ */
|
|
4520
|
+
/* @__PURE__ */ jsx20("p", {
|
|
4450
4521
|
className: "skippr:mt-1 skippr:text-xs skippr:text-muted-foreground",
|
|
4451
4522
|
children: "Please contact administrator."
|
|
4452
4523
|
})
|
|
@@ -4455,7 +4526,7 @@ function AuthError() {
|
|
|
4455
4526
|
}
|
|
4456
4527
|
function ConnectedBanner() {
|
|
4457
4528
|
const remaining = useSessionRemaining();
|
|
4458
|
-
return /* @__PURE__ */
|
|
4529
|
+
return /* @__PURE__ */ jsx20(SessionWarningBanner, {
|
|
4459
4530
|
remaining
|
|
4460
4531
|
});
|
|
4461
4532
|
}
|
|
@@ -4466,17 +4537,17 @@ function ConnectedBody({
|
|
|
4466
4537
|
const { allMessages, agentState, sendChatMessage, isSendingChat } = useCombinedMessages();
|
|
4467
4538
|
const { phases } = usePhaseUpdates();
|
|
4468
4539
|
if (activeTab === "agenda") {
|
|
4469
|
-
return /* @__PURE__ */
|
|
4540
|
+
return /* @__PURE__ */ jsx20("div", {
|
|
4470
4541
|
className: "skippr:min-h-0 skippr:flex-1 skippr:overflow-y-auto skippr:animate-skippr-tab-fade",
|
|
4471
|
-
children: /* @__PURE__ */
|
|
4542
|
+
children: /* @__PURE__ */ jsx20(SessionAgenda, {
|
|
4472
4543
|
phases,
|
|
4473
4544
|
hasStarted: allMessages.length > 0 || agentState === "speaking"
|
|
4474
4545
|
})
|
|
4475
4546
|
}, "agenda");
|
|
4476
4547
|
}
|
|
4477
|
-
return /* @__PURE__ */
|
|
4548
|
+
return /* @__PURE__ */ jsx20("div", {
|
|
4478
4549
|
className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col skippr:animate-skippr-tab-fade",
|
|
4479
|
-
children: /* @__PURE__ */
|
|
4550
|
+
children: /* @__PURE__ */ jsx20(MessageList, {
|
|
4480
4551
|
messages: allMessages,
|
|
4481
4552
|
isStreaming: agentState === "speaking",
|
|
4482
4553
|
sendChatMessage,
|
|
@@ -4487,28 +4558,81 @@ function ConnectedBody({
|
|
|
4487
4558
|
}
|
|
4488
4559
|
|
|
4489
4560
|
// src/components/SidebarTrigger.tsx
|
|
4490
|
-
import {
|
|
4561
|
+
import { useContext as useContext10 } from "react";
|
|
4562
|
+
|
|
4563
|
+
// src/components/Logo.tsx
|
|
4564
|
+
import { jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
4565
|
+
function Logo({ className }) {
|
|
4566
|
+
return /* @__PURE__ */ jsxs17("svg", {
|
|
4567
|
+
width: "1em",
|
|
4568
|
+
height: "1em",
|
|
4569
|
+
viewBox: "0 0 200 200",
|
|
4570
|
+
fill: "none",
|
|
4571
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
4572
|
+
role: "img",
|
|
4573
|
+
"aria-label": "Skippr",
|
|
4574
|
+
className,
|
|
4575
|
+
children: [
|
|
4576
|
+
/* @__PURE__ */ jsx21("rect", {
|
|
4577
|
+
width: "200",
|
|
4578
|
+
height: "200",
|
|
4579
|
+
rx: "40",
|
|
4580
|
+
fill: "#2D2D3F"
|
|
4581
|
+
}),
|
|
4582
|
+
/* @__PURE__ */ jsxs17("g", {
|
|
4583
|
+
transform: "translate(100 100) scale(0.8) translate(-100 -100)",
|
|
4584
|
+
children: [
|
|
4585
|
+
/* @__PURE__ */ jsx21("path", {
|
|
4586
|
+
d: "M144.497 59C149.193 59 153 62.8071 153 67.5033V116.397C153 118.034 152.536 119.562 151.735 120.859L114.894 92.4811L114.894 92.4804C105.42 85.1648 91.2971 91.7058 91.297 104.015V124.901H54.5033C49.8071 124.901 46 121.094 46 116.397V67.5033C46 62.8071 49.8071 59 54.5033 59H144.497ZM101.272 104.015C101.272 100.172 105.736 98.0111 108.798 100.375L140.637 124.901H101.272V104.015Z",
|
|
4587
|
+
fill: "white"
|
|
4588
|
+
}),
|
|
4589
|
+
/* @__PURE__ */ jsx21("path", {
|
|
4590
|
+
d: "M108.798 99.8856C105.736 97.5211 101.271 99.6824 101.271 103.525V155.892C101.271 160.27 106.852 162.191 109.594 158.755L122.619 142.437C123.1 141.836 123.712 141.35 124.409 141.016C125.106 140.683 125.871 140.51 126.645 140.51H147.946C152.386 140.51 154.316 134.944 150.81 132.247L108.798 99.8856Z",
|
|
4591
|
+
className: "skippr:fill-brand"
|
|
4592
|
+
})
|
|
4593
|
+
]
|
|
4594
|
+
})
|
|
4595
|
+
]
|
|
4596
|
+
});
|
|
4597
|
+
}
|
|
4598
|
+
|
|
4599
|
+
// src/components/SidebarTrigger.tsx
|
|
4600
|
+
import { jsx as jsx22 } from "react/jsx-runtime";
|
|
4491
4601
|
function SidebarTrigger() {
|
|
4492
|
-
const {
|
|
4493
|
-
|
|
4602
|
+
const {
|
|
4603
|
+
isPanelOpen,
|
|
4604
|
+
togglePanel,
|
|
4605
|
+
minimizePanel,
|
|
4606
|
+
minimizable,
|
|
4607
|
+
position,
|
|
4608
|
+
isMinimized,
|
|
4609
|
+
isConnected,
|
|
4610
|
+
isStarting,
|
|
4611
|
+
isPausing
|
|
4612
|
+
} = useLiveAgent();
|
|
4613
|
+
const internalCtx = useContext10(LiveAgentContext);
|
|
4614
|
+
const launcherBottomPx = internalCtx?.launcherBottomPx ?? DEFAULT_LAUNCHER_BOTTOM_PX;
|
|
4615
|
+
const popsDown = internalCtx?.popsDown ?? false;
|
|
4616
|
+
if (isMinimized || isConnected || isStarting || isPausing)
|
|
4494
4617
|
return null;
|
|
4495
4618
|
const handleClick = isPanelOpen && minimizable ? minimizePanel : togglePanel;
|
|
4496
|
-
return /* @__PURE__ */
|
|
4619
|
+
return /* @__PURE__ */ jsx22("button", {
|
|
4497
4620
|
type: "button",
|
|
4498
4621
|
onClick: handleClick,
|
|
4499
4622
|
title: isPanelOpen ? "Close chat" : "Open chat",
|
|
4500
4623
|
"aria-label": isPanelOpen ? "Close chat" : "Open chat",
|
|
4501
|
-
|
|
4502
|
-
|
|
4624
|
+
style: { bottom: triggerBottomPx(launcherBottomPx, popsDown) },
|
|
4625
|
+
className: cn("skippr:fixed skippr:z-[9998]", "skippr:flex skippr:size-12 skippr:items-center skippr:justify-center", "skippr:shadow-[0_4px_16px_rgba(45,43,61,0.45),0_2px_4px_rgba(0,0,0,0.1)] skippr:transition-all", "skippr:cursor-pointer skippr:hover:brightness-110 skippr:hover:-translate-y-0.5 skippr:active:translate-y-0", isPanelOpen ? "skippr:rounded-[14px] skippr:bg-bubble skippr:text-white" : "skippr:rounded-[10px] skippr:overflow-hidden", position === "right" ? "skippr:right-6" : "skippr:left-6"),
|
|
4626
|
+
children: isPanelOpen ? /* @__PURE__ */ jsx22(ChevronDown, {
|
|
4503
4627
|
className: "skippr:size-5"
|
|
4504
|
-
}) : /* @__PURE__ */
|
|
4628
|
+
}) : /* @__PURE__ */ jsx22(Logo, {
|
|
4505
4629
|
className: "skippr:size-12"
|
|
4506
4630
|
})
|
|
4507
4631
|
});
|
|
4508
4632
|
}
|
|
4509
4633
|
|
|
4510
4634
|
// src/components/LiveAgent.tsx
|
|
4511
|
-
import { jsx as
|
|
4635
|
+
import { jsx as jsx23, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
4512
4636
|
function LiveAgent(props) {
|
|
4513
4637
|
const {
|
|
4514
4638
|
agentId: hostAgentId,
|
|
@@ -4540,20 +4664,20 @@ function LiveAgent(props) {
|
|
|
4540
4664
|
const usesHostAuth = !!getUserToken || !!userToken || !!authTokenProp;
|
|
4541
4665
|
const effectiveAuthToken = usesHostAuth ? authTokenProp : auth.authToken ?? undefined;
|
|
4542
4666
|
const hasModuleSelector = !hostAgentId;
|
|
4543
|
-
const [activeModule, setActiveModule] =
|
|
4667
|
+
const [activeModule, setActiveModule] = useState16(null);
|
|
4544
4668
|
const agentId = hasModuleSelector ? activeModule?.id ?? null : hostAgentId;
|
|
4545
4669
|
const agentControls = hasModuleSelector ? activeModule?.controls : hostAgentControls;
|
|
4546
|
-
const minimizeOnSessionStart =
|
|
4670
|
+
const minimizeOnSessionStart = useCallback11(() => {
|
|
4547
4671
|
if (minimizable) {
|
|
4548
4672
|
setIsMinimized(true);
|
|
4549
4673
|
setIsPanelOpen(false);
|
|
4550
4674
|
}
|
|
4551
4675
|
}, [minimizable]);
|
|
4552
|
-
const expandOnSessionStartError =
|
|
4676
|
+
const expandOnSessionStartError = useCallback11(() => {
|
|
4553
4677
|
setIsMinimized(false);
|
|
4554
4678
|
setIsPanelOpen(true);
|
|
4555
4679
|
}, []);
|
|
4556
|
-
const minimizeOnSessionDisconnect =
|
|
4680
|
+
const minimizeOnSessionDisconnect = useCallback11(() => {
|
|
4557
4681
|
if (hasModuleSelector) {
|
|
4558
4682
|
setActiveModule(null);
|
|
4559
4683
|
}
|
|
@@ -4589,34 +4713,44 @@ function LiveAgent(props) {
|
|
|
4589
4713
|
onStartError: expandOnSessionStartError,
|
|
4590
4714
|
onDisconnect: minimizeOnSessionDisconnect
|
|
4591
4715
|
});
|
|
4592
|
-
const teardownInFlightRef =
|
|
4716
|
+
const teardownInFlightRef = useRef16(false);
|
|
4593
4717
|
teardownInFlightRef.current = isPaused || isPausing || isDisconnecting;
|
|
4594
|
-
const handleRoomDisconnected =
|
|
4718
|
+
const handleRoomDisconnected = useCallback11(() => {
|
|
4595
4719
|
if (teardownInFlightRef.current)
|
|
4596
4720
|
return;
|
|
4597
4721
|
disconnect();
|
|
4598
4722
|
}, [disconnect]);
|
|
4599
|
-
const
|
|
4600
|
-
const [isPanelOpen, setIsPanelOpen] =
|
|
4601
|
-
const [isMinimized, setIsMinimized] =
|
|
4602
|
-
const [sidebarTab, setSidebarTab] =
|
|
4603
|
-
const [phasesSnapshot, setPhasesSnapshot] =
|
|
4723
|
+
const isSessionLive = connection !== null || isStarting || isPausing || isDisconnecting;
|
|
4724
|
+
const [isPanelOpen, setIsPanelOpen] = useState16(defaultOpen);
|
|
4725
|
+
const [isMinimized, setIsMinimized] = useState16(minimizable && !defaultOpen);
|
|
4726
|
+
const [sidebarTab, setSidebarTab] = useState16("agenda");
|
|
4727
|
+
const [phasesSnapshot, setPhasesSnapshot] = useState16([]);
|
|
4728
|
+
const [textMode, setTextMode] = useState16(false);
|
|
4729
|
+
const [panelExpanded, setPanelExpanded] = useState16(false);
|
|
4730
|
+
const togglePanelExpanded = useCallback11(() => setPanelExpanded((prev) => !prev), []);
|
|
4731
|
+
const setTextModeState = useCallback11((enabled) => {
|
|
4732
|
+
setTextMode(enabled);
|
|
4733
|
+
setPanelExpanded(enabled);
|
|
4734
|
+
}, []);
|
|
4735
|
+
const isConnected = connection !== null;
|
|
4736
|
+
const showControlBar = isConnected || isStarting || isPausing;
|
|
4737
|
+
useEffect20(() => {
|
|
4738
|
+
if (!isConnected)
|
|
4739
|
+
setTextModeState(false);
|
|
4740
|
+
}, [isConnected, setTextModeState]);
|
|
4604
4741
|
const {
|
|
4605
4742
|
modules: availableModules,
|
|
4606
4743
|
isLoading: isLoadingModules,
|
|
4744
|
+
hasResolved: hasResolvedModules,
|
|
4607
4745
|
error: modulesError,
|
|
4608
4746
|
refetch: refetchModules
|
|
4609
4747
|
} = useAvailableModules({
|
|
4610
|
-
enabled: !
|
|
4748
|
+
enabled: !isSessionLive,
|
|
4611
4749
|
bearerToken,
|
|
4612
4750
|
authedFetch
|
|
4613
4751
|
});
|
|
4614
|
-
const {
|
|
4615
|
-
|
|
4616
|
-
dismissGoal: dismissAdoptionGoal,
|
|
4617
|
-
attendGoal
|
|
4618
|
-
} = useAdoptionGoals({
|
|
4619
|
-
enabled: !inSession,
|
|
4752
|
+
const { goals: adoptionGoals, attendGoal } = useAdoptionGoals({
|
|
4753
|
+
enabled: !isSessionLive,
|
|
4620
4754
|
bearerToken,
|
|
4621
4755
|
authedFetch
|
|
4622
4756
|
});
|
|
@@ -4629,7 +4763,7 @@ function LiveAgent(props) {
|
|
|
4629
4763
|
}, [activeModule, hostAgentId, availableModules]);
|
|
4630
4764
|
const agentMode = activeModuleForAgent?.mode ?? null;
|
|
4631
4765
|
const resumableSession = useMemo6(() => getResumableSession(activeModuleForAgent), [activeModuleForAgent]);
|
|
4632
|
-
const resumeSession =
|
|
4766
|
+
const resumeSession = useCallback11(async () => {
|
|
4633
4767
|
if (!resumableSession)
|
|
4634
4768
|
return;
|
|
4635
4769
|
await startSession({
|
|
@@ -4638,7 +4772,7 @@ function LiveAgent(props) {
|
|
|
4638
4772
|
existingSessionId: resumableSession.id
|
|
4639
4773
|
});
|
|
4640
4774
|
}, [resumableSession, startSession, agentControls]);
|
|
4641
|
-
const selectModule =
|
|
4775
|
+
const selectModule = useCallback11((moduleId) => {
|
|
4642
4776
|
const found = availableModules.find((m) => m.id === moduleId);
|
|
4643
4777
|
if (!found)
|
|
4644
4778
|
return;
|
|
@@ -4649,7 +4783,7 @@ function LiveAgent(props) {
|
|
|
4649
4783
|
existingSessionId: getResumableSessionId(found.currentSession, found.mode)
|
|
4650
4784
|
});
|
|
4651
4785
|
}, [availableModules, startSession]);
|
|
4652
|
-
const startAdoptionSession =
|
|
4786
|
+
const startAdoptionSession = useCallback11((goal) => {
|
|
4653
4787
|
attendGoal(goal.goalId);
|
|
4654
4788
|
const found = availableModules.find((m) => m.id === goal.agentId);
|
|
4655
4789
|
if (found)
|
|
@@ -4660,9 +4794,9 @@ function LiveAgent(props) {
|
|
|
4660
4794
|
adoptionGoalId: goal.goalId
|
|
4661
4795
|
});
|
|
4662
4796
|
}, [attendGoal, availableModules, startSession]);
|
|
4663
|
-
const [welcomeDismissed, setWelcomeDismissed] =
|
|
4664
|
-
const dismissWelcome =
|
|
4665
|
-
const [currentPosition, setCurrentPosition] =
|
|
4797
|
+
const [welcomeDismissed, setWelcomeDismissed] = useState16(false);
|
|
4798
|
+
const dismissWelcome = useCallback11(() => setWelcomeDismissed(true), []);
|
|
4799
|
+
const [currentPosition, setCurrentPosition] = useState16(() => {
|
|
4666
4800
|
try {
|
|
4667
4801
|
const saved = localStorage.getItem("skippr_widget_position");
|
|
4668
4802
|
if (saved === "left" || saved === "right")
|
|
@@ -4670,26 +4804,57 @@ function LiveAgent(props) {
|
|
|
4670
4804
|
} catch {}
|
|
4671
4805
|
return position;
|
|
4672
4806
|
});
|
|
4673
|
-
const setPositionWithPersist =
|
|
4807
|
+
const setPositionWithPersist = useCallback11((pos) => {
|
|
4674
4808
|
setCurrentPosition(pos);
|
|
4675
4809
|
try {
|
|
4676
4810
|
localStorage.setItem("skippr_widget_position", pos);
|
|
4677
4811
|
} catch {}
|
|
4678
4812
|
}, []);
|
|
4679
|
-
const
|
|
4680
|
-
|
|
4681
|
-
|
|
4682
|
-
|
|
4813
|
+
const [launcherBottomPx, setLauncherBottomPxState] = useState16(() => {
|
|
4814
|
+
try {
|
|
4815
|
+
const saved = Number.parseInt(localStorage.getItem("skippr_widget_bottom") ?? "", 10);
|
|
4816
|
+
if (Number.isFinite(saved) && saved > 0)
|
|
4817
|
+
return clampLauncherBottom(saved);
|
|
4818
|
+
} catch {}
|
|
4819
|
+
return DEFAULT_LAUNCHER_BOTTOM_PX;
|
|
4820
|
+
});
|
|
4821
|
+
const [popsDown, setPopsDown] = useState16(() => launcherPopsDown(launcherBottomPx));
|
|
4822
|
+
const setLauncherBottomPx = useCallback11((px) => {
|
|
4823
|
+
setLauncherBottomPxState(px);
|
|
4824
|
+
setPopsDown(launcherPopsDown(px));
|
|
4825
|
+
try {
|
|
4826
|
+
localStorage.setItem("skippr_widget_bottom", String(px));
|
|
4827
|
+
} catch {}
|
|
4828
|
+
}, []);
|
|
4829
|
+
const launcherBottomPxRef = useRef16(launcherBottomPx);
|
|
4830
|
+
launcherBottomPxRef.current = launcherBottomPx;
|
|
4831
|
+
useEffect20(() => {
|
|
4832
|
+
const syncToViewport = () => {
|
|
4833
|
+
const clamped = clampLauncherBottom(launcherBottomPxRef.current);
|
|
4834
|
+
setLauncherBottomPxState(clamped);
|
|
4835
|
+
setPopsDown(launcherPopsDown(clamped));
|
|
4836
|
+
};
|
|
4837
|
+
syncToViewport();
|
|
4838
|
+
window.addEventListener("resize", syncToViewport);
|
|
4839
|
+
return () => window.removeEventListener("resize", syncToViewport);
|
|
4840
|
+
}, []);
|
|
4841
|
+
const openPanel = useCallback11(() => setIsPanelOpen(true), []);
|
|
4842
|
+
const closePanel = useCallback11(() => setIsPanelOpen(false), []);
|
|
4843
|
+
const togglePanel = useCallback11(() => setIsPanelOpen((prev) => !prev), []);
|
|
4844
|
+
const expandPanel = useCallback11(() => {
|
|
4683
4845
|
setIsMinimized(false);
|
|
4684
4846
|
setIsPanelOpen(true);
|
|
4685
4847
|
}, []);
|
|
4686
|
-
const minimizePanel =
|
|
4848
|
+
const minimizePanel = useCallback11(() => {
|
|
4687
4849
|
if (!minimizable)
|
|
4688
4850
|
return;
|
|
4689
4851
|
setIsMinimized(true);
|
|
4690
4852
|
setIsPanelOpen(false);
|
|
4691
4853
|
}, [minimizable]);
|
|
4692
|
-
const
|
|
4854
|
+
const pauseSessionAndMinimize = useCallback11(async () => {
|
|
4855
|
+
await pauseSession();
|
|
4856
|
+
minimizePanel();
|
|
4857
|
+
}, [pauseSession, minimizePanel]);
|
|
4693
4858
|
const isAuthenticated = bearerToken !== null || auth.isAuthenticated;
|
|
4694
4859
|
const ctx = useMemo6(() => ({
|
|
4695
4860
|
connection,
|
|
@@ -4701,7 +4866,7 @@ function LiveAgent(props) {
|
|
|
4701
4866
|
error,
|
|
4702
4867
|
errorCode,
|
|
4703
4868
|
startSession,
|
|
4704
|
-
pauseSession,
|
|
4869
|
+
pauseSession: pauseSessionAndMinimize,
|
|
4705
4870
|
resumeSession,
|
|
4706
4871
|
disconnect,
|
|
4707
4872
|
isPaused,
|
|
@@ -4716,6 +4881,11 @@ function LiveAgent(props) {
|
|
|
4716
4881
|
variant,
|
|
4717
4882
|
position: currentPosition,
|
|
4718
4883
|
setPosition: setPositionWithPersist,
|
|
4884
|
+
launcherBottomPx,
|
|
4885
|
+
setLauncherBottomPx,
|
|
4886
|
+
popsDown,
|
|
4887
|
+
panelExpanded,
|
|
4888
|
+
togglePanelExpanded,
|
|
4719
4889
|
minimizable,
|
|
4720
4890
|
isMinimized,
|
|
4721
4891
|
expandPanel,
|
|
@@ -4731,6 +4901,8 @@ function LiveAgent(props) {
|
|
|
4731
4901
|
isAuthSubmitting: auth.isSubmitting,
|
|
4732
4902
|
sidebarTab,
|
|
4733
4903
|
setSidebarTab,
|
|
4904
|
+
textMode,
|
|
4905
|
+
setTextModeState,
|
|
4734
4906
|
autoFocusChat,
|
|
4735
4907
|
captureMode,
|
|
4736
4908
|
agentId,
|
|
@@ -4743,8 +4915,8 @@ function LiveAgent(props) {
|
|
|
4743
4915
|
modulesError,
|
|
4744
4916
|
refetchModules,
|
|
4745
4917
|
selectModule,
|
|
4918
|
+
hasResolvedModules,
|
|
4746
4919
|
adoptionGoals,
|
|
4747
|
-
dismissAdoptionGoal,
|
|
4748
4920
|
startAdoptionSession
|
|
4749
4921
|
}), [
|
|
4750
4922
|
connection,
|
|
@@ -4756,7 +4928,7 @@ function LiveAgent(props) {
|
|
|
4756
4928
|
error,
|
|
4757
4929
|
errorCode,
|
|
4758
4930
|
startSession,
|
|
4759
|
-
|
|
4931
|
+
pauseSessionAndMinimize,
|
|
4760
4932
|
resumeSession,
|
|
4761
4933
|
disconnect,
|
|
4762
4934
|
isPaused,
|
|
@@ -4770,6 +4942,11 @@ function LiveAgent(props) {
|
|
|
4770
4942
|
variant,
|
|
4771
4943
|
currentPosition,
|
|
4772
4944
|
setPositionWithPersist,
|
|
4945
|
+
launcherBottomPx,
|
|
4946
|
+
setLauncherBottomPx,
|
|
4947
|
+
popsDown,
|
|
4948
|
+
panelExpanded,
|
|
4949
|
+
togglePanelExpanded,
|
|
4773
4950
|
minimizable,
|
|
4774
4951
|
isMinimized,
|
|
4775
4952
|
expandPanel,
|
|
@@ -4784,6 +4961,8 @@ function LiveAgent(props) {
|
|
|
4784
4961
|
auth.logout,
|
|
4785
4962
|
auth.isSubmitting,
|
|
4786
4963
|
sidebarTab,
|
|
4964
|
+
textMode,
|
|
4965
|
+
setTextModeState,
|
|
4787
4966
|
autoFocusChat,
|
|
4788
4967
|
captureMode,
|
|
4789
4968
|
agentId,
|
|
@@ -4796,38 +4975,39 @@ function LiveAgent(props) {
|
|
|
4796
4975
|
modulesError,
|
|
4797
4976
|
refetchModules,
|
|
4798
4977
|
selectModule,
|
|
4978
|
+
hasResolvedModules,
|
|
4799
4979
|
adoptionGoals,
|
|
4800
|
-
dismissAdoptionGoal,
|
|
4801
4980
|
startAdoptionSession
|
|
4802
4981
|
]);
|
|
4803
|
-
return /* @__PURE__ */
|
|
4982
|
+
return /* @__PURE__ */ jsx23(LiveAgentContext.Provider, {
|
|
4804
4983
|
value: ctx,
|
|
4805
|
-
children: /* @__PURE__ */
|
|
4984
|
+
children: /* @__PURE__ */ jsxs18(LiveKitRoom, {
|
|
4806
4985
|
serverUrl: connection?.livekitUrl,
|
|
4807
4986
|
token: connection?.token,
|
|
4808
4987
|
connect: shouldConnect,
|
|
4809
4988
|
audio: true,
|
|
4810
4989
|
onDisconnected: handleRoomDisconnected,
|
|
4811
4990
|
children: [
|
|
4812
|
-
connection && /* @__PURE__ */
|
|
4813
|
-
connection && captureMode === "screenshare" && /* @__PURE__ */
|
|
4991
|
+
connection && !textMode && /* @__PURE__ */ jsx23(RoomAudioRenderer, {}),
|
|
4992
|
+
connection && captureMode === "screenshare" && /* @__PURE__ */ jsx23(AutoStartMedia, {
|
|
4814
4993
|
pendingScreenStream
|
|
4815
4994
|
}),
|
|
4816
|
-
connection && captureMode === "auto" && /* @__PURE__ */
|
|
4817
|
-
/* @__PURE__ */
|
|
4995
|
+
connection && captureMode === "auto" && /* @__PURE__ */ jsx23(DomCapture, {}),
|
|
4996
|
+
/* @__PURE__ */ jsxs18(ShadowHost, {
|
|
4818
4997
|
children: [
|
|
4819
|
-
connection && captureMode === "auto" && agentControls?.highlight && /* @__PURE__ */
|
|
4820
|
-
connection && captureMode === "auto" && agentControls?.actions && /* @__PURE__ */
|
|
4821
|
-
/* @__PURE__ */
|
|
4998
|
+
connection && captureMode === "auto" && agentControls?.highlight && /* @__PURE__ */ jsx23(HighlightOverlay, {}),
|
|
4999
|
+
connection && captureMode === "auto" && agentControls?.actions && /* @__PURE__ */ jsx23(PageActionHandler, {}),
|
|
5000
|
+
/* @__PURE__ */ jsxs18("div", {
|
|
4822
5001
|
id: WIDGET_ROOT_ID,
|
|
4823
5002
|
children: [
|
|
4824
|
-
isMinimized && /* @__PURE__ */
|
|
5003
|
+
isMinimized && !showControlBar && /* @__PURE__ */ jsx23(MinimizedBubble, {
|
|
4825
5004
|
welcomeMessage,
|
|
4826
5005
|
welcomeDismissed,
|
|
4827
5006
|
onDismissWelcome: dismissWelcome
|
|
4828
5007
|
}),
|
|
4829
|
-
/* @__PURE__ */
|
|
4830
|
-
/* @__PURE__ */
|
|
5008
|
+
showControlBar && !hideControls && /* @__PURE__ */ jsx23(SessionControlBar, {}),
|
|
5009
|
+
/* @__PURE__ */ jsx23(SidebarTrigger, {}),
|
|
5010
|
+
/* @__PURE__ */ jsx23(Sidebar, {
|
|
4831
5011
|
hideControls,
|
|
4832
5012
|
hideHeader,
|
|
4833
5013
|
startSessionLabel
|
|
@@ -4842,9 +5022,9 @@ function LiveAgent(props) {
|
|
|
4842
5022
|
});
|
|
4843
5023
|
}
|
|
4844
5024
|
// src/hooks/useIsLocalSpeaking.ts
|
|
4845
|
-
import { useIsSpeaking, useLocalParticipant as
|
|
5025
|
+
import { useIsSpeaking, useLocalParticipant as useLocalParticipant8 } from "@livekit/components-react/hooks";
|
|
4846
5026
|
function useIsLocalSpeaking() {
|
|
4847
|
-
const { localParticipant } =
|
|
5027
|
+
const { localParticipant } = useLocalParticipant8();
|
|
4848
5028
|
return useIsSpeaking(localParticipant);
|
|
4849
5029
|
}
|
|
4850
5030
|
export {
|