@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.
@@ -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 useCallback10, useMemo as useMemo6, useRef as useRef13, useState as useState15 } from "react";
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, dismissGoal, attendGoal };
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/bot.js
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: "M12 8V4H8", key: "hb8ula" }],
1781
- ["rect", { width: "16", height: "12", x: "4", y: "8", rx: "2", key: "enze0r" }],
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 Bot = createLucideIcon("bot", __iconNode5);
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/clock.js
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: "M3 11h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-5Zm0 0a9 9 0 1 1 18 0m0 0v5a2 2 0 0 1-2 2h-1a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h3Z",
1827
- key: "12oyoe"
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: "M21 16v2a4 4 0 0 1-4 4h-5", key: "1x7m43" }]
1829
+ ["path", { d: "M9 18h6", key: "x1upvd" }],
1830
+ ["path", { d: "M10 22h4", key: "ceow96" }]
1831
1831
  ];
1832
- var Headset = createLucideIcon("headset", __iconNode11);
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 __iconNode12 = [
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", __iconNode12);
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 __iconNode13 = [
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", __iconNode13);
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 __iconNode14 = [
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", __iconNode14);
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 __iconNode15 = [
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", __iconNode15);
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 __iconNode16 = [
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", __iconNode16);
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 __iconNode17 = [
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", __iconNode17);
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 __iconNode18 = [
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", __iconNode18);
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 __iconNode19 = [
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", __iconNode19);
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 __iconNode20 = [
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", __iconNode20);
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 __iconNode25 = [
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", __iconNode25);
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 __iconNode27 = [
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", __iconNode27);
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 useContext3, useEffect as useEffect8 } from "react";
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/useMediaControls.ts
2257
- import { useLocalParticipant as useLocalParticipant3 } from "@livekit/components-react/hooks";
2258
- import { ScreenSharePresets as ScreenSharePresets2 } from "livekit-client";
2259
- import { useCallback as useCallback6 } from "react";
2260
- var SCREEN_SHARE_OPTIONS = {
2261
- video: { displaySurface: "browser" },
2262
- resolution: ScreenSharePresets2.h720fps30.resolution,
2263
- contentHint: "detail"
2264
- };
2265
- function useMediaControls() {
2266
- const { localParticipant } = useLocalParticipant3();
2267
- const isMuted = !localParticipant.isMicrophoneEnabled;
2268
- const isScreenSharing = localParticipant.isScreenShareEnabled;
2269
- const toggleMute = useCallback6(async () => {
2270
- try {
2271
- await localParticipant.setMicrophoneEnabled(isMuted);
2272
- } catch (error) {
2273
- console.error("Failed to toggle microphone:", error);
2274
- }
2275
- }, [localParticipant, isMuted]);
2276
- const toggleScreenShare = useCallback6(async () => {
2277
- try {
2278
- await localParticipant.setScreenShareEnabled(!isScreenSharing, SCREEN_SHARE_OPTIONS);
2279
- } catch (error) {
2280
- console.error("Failed to toggle screen share:", error);
2281
- }
2282
- }, [localParticipant, isScreenSharing]);
2283
- return { isMuted, toggleMute, isScreenSharing, toggleScreenShare };
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({ goal, onAttend, onDismiss }) {
2296
- return /* @__PURE__ */ jsxs2("div", {
2297
- className: cn("skippr:flex skippr:max-w-72 skippr:items-center skippr:gap-1.5", "skippr:rounded-full skippr:bg-bubble/95 skippr:backdrop-blur-sm", "skippr:py-1.5 skippr:pr-1.5 skippr:pl-3.5", "skippr:text-xs skippr:font-medium skippr:text-white", "skippr:shadow-[0_8px_24px_rgba(45,43,61,0.35)]", "skippr:animate-[skippr-bubble-in_0.28s_ease-out]"),
2298
- children: [
2299
- /* @__PURE__ */ jsx2("button", {
2300
- type: "button",
2301
- onClick: () => onAttend(goal),
2302
- className: "skippr:min-w-0 skippr:flex-1 skippr:cursor-pointer skippr:truncate skippr:rounded-full skippr:text-left skippr:transition-opacity skippr:hover:opacity-90 skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-inset skippr:focus-visible:ring-white/70",
2303
- children: goal.displayMessage
2304
- }),
2305
- /* @__PURE__ */ jsx2("button", {
2306
- type: "button",
2307
- onClick: () => onDismiss(goal.goalId),
2308
- "aria-label": "Dismiss suggestion",
2309
- className: cn("skippr:flex skippr:size-5 skippr:shrink-0 skippr:items-center skippr:justify-center", "skippr:rounded-full skippr:text-white/70 skippr:cursor-pointer", "skippr:transition-colors skippr:hover:bg-white/15 skippr:hover:text-white", "skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-white/70"),
2310
- children: /* @__PURE__ */ jsx2(X, {
2311
- className: "skippr:size-3.5"
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
- status === "standing-by" && /* @__PURE__ */ jsxs3(Fragment, {
2376
- children: [
2377
- /* @__PURE__ */ jsx3("span", {
2378
- children: "Standing by"
2379
- }),
2380
- /* @__PURE__ */ jsx3(ThinkingDots, {})
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
- status === "thinking" && /* @__PURE__ */ jsxs3(Fragment, {
2408
- children: [
2409
- /* @__PURE__ */ jsx3(ThinkingDots, {}),
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
- status === "paused" && /* @__PURE__ */ jsxs3(Fragment, {
2416
- children: [
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
- }, status)
2305
+ })
2425
2306
  });
2426
2307
  }
2427
- function ConnectedDot() {
2428
- return /* @__PURE__ */ jsxs3("span", {
2429
- className: "skippr:relative skippr:flex skippr:size-2",
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
- className: "skippr:absolute skippr:inline-flex skippr:size-full skippr:animate-ping skippr:rounded-full skippr:bg-emerald-400 skippr:opacity-75"
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:relative skippr:inline-flex skippr:size-2 skippr:rounded-full skippr:bg-emerald-400"
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__ */ jsx3("circle", {
2460
- cx: "12",
2461
- cy: "12",
2462
- r: "3",
2463
- fill: "currentColor",
2464
- stroke: "none",
2465
- className: "skippr:origin-center skippr:animate-[skippr-banner-look_2.4s_ease-in-out_infinite]"
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
- function SpeakingBars() {
2471
- return /* @__PURE__ */ jsxs3("span", {
2472
- className: "skippr:flex skippr:items-center skippr:gap-[2px] skippr:h-3.5",
2473
- children: [
2474
- /* @__PURE__ */ jsx3("span", {
2475
- className: "skippr:w-[2px] skippr:rounded-sm skippr:bg-white skippr:animate-[skippr-speak_1.1s_ease-in-out_infinite] skippr:h-1.5"
2476
- }),
2477
- /* @__PURE__ */ jsx3("span", {
2478
- className: "skippr:w-[2px] skippr:rounded-sm skippr:bg-white skippr:animate-[skippr-speak_1.1s_ease-in-out_0.15s_infinite] skippr:h-3"
2479
- }),
2480
- /* @__PURE__ */ jsx3("span", {
2481
- className: "skippr:w-[2px] skippr:rounded-sm skippr:bg-white skippr:animate-[skippr-speak_1.1s_ease-in-out_0.3s_infinite] skippr:h-2"
2482
- }),
2483
- /* @__PURE__ */ jsx3("span", {
2484
- className: "skippr:w-[2px] skippr:rounded-sm skippr:bg-white skippr:animate-[skippr-speak_1.1s_ease-in-out_0.45s_infinite] skippr:h-3.5"
2485
- }),
2486
- /* @__PURE__ */ jsx3("span", {
2487
- className: "skippr:w-[2px] skippr:rounded-sm skippr:bg-white skippr:animate-[skippr-speak_1.1s_ease-in-out_0.6s_infinite] skippr:h-1"
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 ThinkingDots() {
2493
- return /* @__PURE__ */ jsxs3("span", {
2494
- className: "skippr:flex skippr:items-center skippr:gap-[3px]",
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
- /* @__PURE__ */ jsx3("span", {
2497
- className: "skippr:size-1 skippr:rounded-full skippr:bg-white skippr:animate-bounce skippr:[animation-delay:0ms]"
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 = useContext3(LiveAgentContext);
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
- dismissAdoptionGoal,
2679
- startAdoptionSession
2436
+ startAdoptionSession,
2437
+ hasModuleSelector,
2438
+ isAuthenticated,
2439
+ availableModules,
2440
+ hasResolvedModules,
2441
+ selectModule,
2442
+ expandPanel
2680
2443
  } = ctx;
2681
- const inSession = isConnected || isPaused || isPausing;
2682
- return /* @__PURE__ */ jsxs5(Fragment2, {
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__ */ jsx5(LauncherStatusPill, {}),
2685
- /* @__PURE__ */ jsxs5("div", {
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
- !inSession && !isStarting && adoptionGoals.length > 0 && /* @__PURE__ */ jsx5("div", {
2689
- className: cn("skippr:absolute skippr:bottom-full skippr:mb-3 skippr:flex skippr:flex-col skippr:gap-2", position === "right" ? "skippr:right-0 skippr:items-end" : "skippr:left-0 skippr:items-start"),
2690
- children: adoptionGoals.map((goal) => /* @__PURE__ */ jsx5(AdoptionBubble, {
2691
- goal,
2692
- onAttend: startAdoptionSession,
2693
- onDismiss: dismissAdoptionGoal
2694
- }, goal.goalId))
2695
- }),
2696
- welcomeMessage && !isConnected && !isStarting && !welcomeDismissed && adoptionGoals.length === 0 && /* @__PURE__ */ jsx5(WelcomeBubble, {
2697
- message: welcomeMessage,
2698
- position,
2699
- onDismiss: onDismissWelcome
2700
- }),
2701
- inSession ? /* @__PURE__ */ jsx5(ConnectedLauncher, {}) : /* @__PURE__ */ jsx5(IdleLauncher, {})
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 useCallback7, useEffect as useEffect10, useRef as useRef6, useState as useState7 } from "react";
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 useEffect9, useRef as useRef5, useState as useState6 } from "react";
2714
- import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
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] = useState6(null);
2722
- const frameRef = useRef5(null);
2723
- useEffect9(() => {
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__ */ jsx6("div", {
2613
+ return /* @__PURE__ */ jsx5("div", {
2762
2614
  "data-skippr-private": "true",
2763
2615
  style: containerStyle,
2764
- children: /* @__PURE__ */ jsxs6("div", {
2616
+ children: /* @__PURE__ */ jsxs5("div", {
2765
2617
  className: "skippr:relative",
2766
2618
  children: [
2767
- /* @__PURE__ */ jsx6(MousePointer2, {
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__ */ jsx6("div", {
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__ */ jsx6("span", {
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 jsx7 } from "react/jsx-runtime";
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] = useState7(null);
2931
- const mountedRef = useRef6(true);
2932
- const queueRef = useRef6([]);
2933
- const drainingRef = useRef6(false);
2934
- const timersRef = useRef6(new Set);
2935
- const wakesRef = useRef6(new Set);
2936
- const indicatorTimerRef = useRef6(null);
2937
- const sleep = useCallback7((ms) => {
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 = useCallback7((target) => {
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 = useCallback7(async (action) => {
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 = useCallback7(async () => {
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 = useCallback7((msg) => {
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
- useEffect10(() => {
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__ */ jsx7(AgentActivityIndicator, {
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 useRef7, useState as useState8 } from "react";
3361
+ import { useLayoutEffect, useRef as useRef10, useState as useState11 } from "react";
3040
3362
  import { createPortal } from "react-dom";
3041
- import { jsx as jsx8, Fragment as Fragment3 } from "react/jsx-runtime";
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 = useRef7(null);
3057
- const [shadowRoot, setShadowRoot] = useState8(null);
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(Fragment3, {
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 useContext6, useEffect as useEffect19 } from "react";
3406
+ import { useContext as useContext9, useEffect as useEffect19 } from "react";
3085
3407
 
3086
3408
  // src/hooks/useCombinedMessages.ts
3087
- import { useContext as useContext4, useMemo as useMemo5 } from "react";
3409
+ import { useContext as useContext6, useMemo as useMemo5 } from "react";
3088
3410
 
3089
3411
  // src/hooks/useChatMessages.ts
3090
- import { useChat, useLocalParticipant as useLocalParticipant4 } from "@livekit/components-react/hooks";
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 } = useLocalParticipant4();
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 useLocalParticipant5, useTranscriptions } from "@livekit/components-react/hooks";
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 } = useLocalParticipant5();
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 usePhaseUpdates() {
3227
- const parse = useCallback8(parsePhases, []);
3228
- const livePhases = useAgentState("phases", parse, []);
3229
- const ctx = useContext5(LiveAgentContext);
3230
- useEffect12(() => {
3231
- if (livePhases.length > 0)
3232
- ctx?.setPhasesSnapshot(livePhases);
3233
- }, [livePhases, ctx?.setPhasesSnapshot]);
3234
- const phases = livePhases.length > 0 ? livePhases : ctx?.phasesSnapshot ?? [];
3235
- return { phases };
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 useEffect13, useRef as useRef8, useState as useState10 } from "react";
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 = useRef8(null);
3256
- const [remaining, setRemaining] = useState10(null);
3257
- useEffect13(() => {
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 useEffect14, useState as useState11 } from "react";
3566
+ import { useEffect as useEffect16, useState as useState13 } from "react";
3275
3567
  function useElapsedSeconds(isRunning) {
3276
- const [elapsed, setElapsed] = useState11(0);
3277
- useEffect14(() => {
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, minimizePanel, minimizable } = useLiveAgent();
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
- minimizable && /* @__PURE__ */ jsx9("button", {
3626
+ variant === "floating" && /* @__PURE__ */ jsx9("button", {
3332
3627
  type: "button",
3333
- onClick: minimizePanel,
3334
- "aria-label": "Minimize",
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 useCallback9, useEffect as useEffect15, useRef as useRef9, useState as useState12 } from "react";
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] = useState12("email");
3412
- const [email, setEmail] = useState12("");
3413
- const handleRequestOtp = useCallback9(async (emailValue) => {
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 = useCallback9(async (code) => {
3716
+ const handleVerifyOtp = useCallback10(async (code) => {
3419
3717
  await verifyOtp(email, code);
3420
3718
  }, [verifyOtp, email]);
3421
- const handleBack = useCallback9(() => {
3719
+ const handleBack = useCallback10(() => {
3422
3720
  setStep("email");
3423
3721
  }, []);
3424
- const handleResend = useCallback9(async () => {
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] = useState12(Array(OTP_LENGTH).fill(""));
3502
- const [resendCooldown, setResendCooldown] = useState12(0);
3503
- const inputRefs = useRef9([]);
3504
- const submittedRef = useRef9(false);
3505
- useEffect15(() => {
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
- useEffect15(() => {
3806
+ useEffect17(() => {
3509
3807
  if (error)
3510
3808
  submittedRef.current = false;
3511
3809
  }, [error]);
3512
- useEffect15(() => {
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 = useCallback9((code) => {
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 = useCallback9((index2, value) => {
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 = useCallback9((index2, e) => {
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 = useCallback9((e) => {
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 { useEffect as useEffect17, useRef as useRef11 } from "react";
3951
+ import { useLayoutEffect as useLayoutEffect2, useRef as useRef15 } from "react";
3737
3952
 
3738
3953
  // src/components/ChatInput.tsx
3739
- import { useEffect as useEffect16, useRef as useRef10, useState as useState13 } from "react";
3740
- import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
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] = useState13("");
3744
- const textareaRef = useRef10(null);
3958
+ const [inputText, setInputText] = useState15("");
3959
+ const textareaRef = useRef14(null);
3745
3960
  const canSend = inputText.trim().length > 0 && !isSendingChat;
3746
- useEffect16(() => {
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__ */ jsx14("form", {
3992
+ return /* @__PURE__ */ jsx13("form", {
3778
3993
  onSubmit: handleSubmit,
3779
3994
  className: "skippr:border-t skippr:border-border skippr:p-3",
3780
- children: /* @__PURE__ */ jsxs11("div", {
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__ */ jsx14("textarea", {
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__ */ jsx14("button", {
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__ */ jsx14(Send, {
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 jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
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__ */ jsxs12("div", {
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__ */ jsx15("div", {
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__ */ jsx15(Sparkles, {
4038
+ children: /* @__PURE__ */ jsx14(Sparkles, {
3824
4039
  className: "skippr:size-3.5 skippr:text-primary-foreground"
3825
4040
  })
3826
4041
  }),
3827
- /* @__PURE__ */ jsxs12("div", {
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__ */ jsx15("div", {
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__ */ jsx15("span", {
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 jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
4060
+ import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
3846
4061
  function TypingIndicator() {
3847
- return /* @__PURE__ */ jsxs13("div", {
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__ */ jsx16("div", {
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__ */ jsx16(Sparkles, {
4067
+ children: /* @__PURE__ */ jsx15(Sparkles, {
3853
4068
  className: "skippr:size-3.5 skippr:text-primary-foreground"
3854
4069
  })
3855
4070
  }),
3856
- /* @__PURE__ */ jsxs13("div", {
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__ */ jsx16("span", {
4074
+ /* @__PURE__ */ jsx15("span", {
3860
4075
  children: "Agent is analyzing your screen"
3861
4076
  }),
3862
- /* @__PURE__ */ jsxs13("span", {
4077
+ /* @__PURE__ */ jsxs12("span", {
3863
4078
  className: "skippr:inline-flex skippr:items-center skippr:gap-[2px]",
3864
4079
  children: [
3865
- /* @__PURE__ */ jsx16("span", {
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__ */ jsx16("span", {
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__ */ jsx16("span", {
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 jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
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 scrollRef = useRef11(null);
4107
+ const containerRef = useRef15(null);
4108
+ const isPinnedToBottomRef = useRef15(true);
3892
4109
  const lastMessage = messages.length > 0 ? messages[messages.length - 1] : undefined;
3893
- useEffect17(() => {
3894
- scrollRef.current?.scrollIntoView({ behavior: "smooth" });
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__ */ jsxs14("div", {
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__ */ jsxs14("div", {
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__ */ jsx17(LoadingDots, {
4135
+ messages.length === 0 && !showTyping && /* @__PURE__ */ jsx16(LoadingDots, {
3904
4136
  label: "Waiting for conversation to begin..."
3905
4137
  }),
3906
- messages.map((message) => /* @__PURE__ */ jsx17(ChatMessage, {
4138
+ messages.map((message) => /* @__PURE__ */ jsx16(ChatMessage, {
3907
4139
  message
3908
4140
  }, message.id)),
3909
- showTyping && /* @__PURE__ */ jsx17(TypingIndicator, {}),
3910
- /* @__PURE__ */ jsx17("div", {
3911
- ref: scrollRef
3912
- })
4141
+ showTyping && /* @__PURE__ */ jsx16(TypingIndicator, {})
3913
4142
  ]
3914
4143
  }),
3915
- /* @__PURE__ */ jsx17(ChatInput, {
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 jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
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__ */ jsx19("div", {
4157
+ return /* @__PURE__ */ jsx17("div", {
4118
4158
  className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
4119
- children: /* @__PURE__ */ jsx19(LoadingDots, {
4159
+ children: /* @__PURE__ */ jsx17(LoadingDots, {
4120
4160
  label: "Waiting for agenda to load..."
4121
4161
  })
4122
4162
  });
4123
4163
  }
4124
- return /* @__PURE__ */ jsx19("div", {
4164
+ return /* @__PURE__ */ jsx17("div", {
4125
4165
  className: "skippr:flex-1 skippr:overflow-y-auto skippr:px-4 skippr:py-4",
4126
- children: /* @__PURE__ */ jsx19("div", {
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__ */ jsxs16("div", {
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__ */ jsx19("div", {
4174
+ /* @__PURE__ */ jsx17("div", {
4135
4175
  className: "skippr:mt-0.5",
4136
- children: isCompleted ? /* @__PURE__ */ jsx19(CircleCheck, {
4176
+ children: isCompleted ? /* @__PURE__ */ jsx17(CircleCheck, {
4137
4177
  className: "skippr:size-4 skippr:text-chart-3"
4138
- }) : isActive ? /* @__PURE__ */ jsx19(Circle, {
4178
+ }) : isActive ? /* @__PURE__ */ jsx17(Circle, {
4139
4179
  className: "skippr:size-4 skippr:fill-primary/30 skippr:text-primary"
4140
- }) : /* @__PURE__ */ jsx19(Circle, {
4180
+ }) : /* @__PURE__ */ jsx17(Circle, {
4141
4181
  className: "skippr:size-4 skippr:text-muted-foreground/30"
4142
4182
  })
4143
4183
  }),
4144
- /* @__PURE__ */ jsxs16("div", {
4184
+ /* @__PURE__ */ jsxs14("div", {
4145
4185
  className: "skippr:min-w-0 skippr:flex-1",
4146
4186
  children: [
4147
- /* @__PURE__ */ jsx19("p", {
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__ */ jsx19("ul", {
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__ */ jsxs16("li", {
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__ */ jsx19("span", {
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 jsx20 } from "react/jsx-runtime";
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__ */ jsx20("div", {
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 jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
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__ */ jsxs17("div", {
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__ */ jsx21("button", {
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__ */ jsx21("button", {
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__ */ jsx21("p", {
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 jsx22, jsxs as jsxs18, Fragment as Fragment5 } from "react/jsx-runtime";
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 = useContext6(LiveAgentContext);
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__ */ jsxs18("div", {
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:bottom-[88px] skippr:h-[min(460px,calc(100vh-200px))] 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] skippr:duration-300 skippr:ease-in-out", isFloating && (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"),
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__ */ jsx22(ChatHeader, {}),
4288
- authFailed ? /* @__PURE__ */ jsx22(AuthError, {}) : isAuthenticated ? /* @__PURE__ */ jsx22(AuthenticatedContent, {
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__ */ jsx22("div", {
4358
+ }) : usesHostAuth || isValidating ? /* @__PURE__ */ jsx20("div", {
4311
4359
  className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
4312
- children: /* @__PURE__ */ jsx22(LoadingDots, {
4360
+ children: /* @__PURE__ */ jsx20(LoadingDots, {
4313
4361
  label: "Loading..."
4314
4362
  })
4315
- }) : /* @__PURE__ */ jsx22(LoginFlow, {
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__ */ jsxs18(Fragment5, {
4401
+ return /* @__PURE__ */ jsxs16(Fragment2, {
4360
4402
  children: [
4361
- isConnected && /* @__PURE__ */ jsx22(ConnectedBanner, {}),
4362
- showTabBar && /* @__PURE__ */ jsxs18("div", {
4363
- className: "skippr:flex skippr:items-center skippr:gap-2 skippr:border-b skippr:border-border skippr:px-3 skippr:py-2",
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__ */ jsxs18("button", {
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-2 skippr:text-sm skippr:font-medium skippr:transition-all", activeTab === "chat" ? "skippr:text-foreground" : "skippr:text-muted-foreground skippr:hover:text-foreground"),
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__ */ jsx22(MessageCircle, {
4412
+ /* @__PURE__ */ jsx20(MessageCircle, {
4371
4413
  className: "skippr:size-3.5"
4372
4414
  }),
4373
4415
  "Chat",
4374
- activeTab === "chat" && /* @__PURE__ */ jsx22("span", {
4375
- className: "skippr:absolute skippr:-bottom-2 skippr:left-3 skippr:right-3 skippr:h-0.5 skippr:rounded-full skippr:bg-foreground"
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__ */ jsxs18("button", {
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-2 skippr:text-sm skippr:font-medium skippr:transition-all", activeTab === "agenda" ? "skippr:text-foreground" : "skippr:text-muted-foreground skippr:hover:text-foreground"),
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__ */ jsx22(Calendar, {
4426
+ /* @__PURE__ */ jsx20(Calendar, {
4385
4427
  className: "skippr:size-3.5"
4386
4428
  }),
4387
4429
  "Agenda",
4388
- activeTab === "agenda" && /* @__PURE__ */ jsx22("span", {
4389
- className: "skippr:absolute skippr:-bottom-2 skippr:left-3 skippr:right-3 skippr:h-0.5 skippr:rounded-full skippr:bg-foreground"
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__ */ jsx22("div", {
4437
+ /* @__PURE__ */ jsx20("div", {
4396
4438
  className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col",
4397
- children: isDisconnecting ? /* @__PURE__ */ jsx22("div", {
4439
+ children: isDisconnecting ? /* @__PURE__ */ jsx20("div", {
4398
4440
  className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
4399
- children: /* @__PURE__ */ jsx22(LoadingDots, {
4441
+ children: /* @__PURE__ */ jsx20(LoadingDots, {
4400
4442
  label: "Ending session..."
4401
4443
  })
4402
- }) : showSelectorAsPrompt ? /* @__PURE__ */ jsx22(ModuleSelector, {}) : inSession ? /* @__PURE__ */ jsxs18(Fragment5, {
4444
+ }) : inSession ? /* @__PURE__ */ jsxs16(Fragment2, {
4403
4445
  children: [
4404
- transitionLabel && /* @__PURE__ */ jsx22("div", {
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__ */ jsx22(ConnectedBody, {
4450
+ /* @__PURE__ */ jsx20(ConnectedBody, {
4409
4451
  activeTab: effectiveTab,
4410
4452
  autoFocusChat
4411
4453
  })
4412
4454
  ]
4413
- }) : /* @__PURE__ */ jsx22("div", {
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__ */ jsx22(StartSessionPrompt, {
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
- (isConnected || isPaused) && !isDisconnecting && !hideControls && /* @__PURE__ */ jsx22(MeetingControls, {
4428
- onHangUp: onDisconnect,
4429
- onPause,
4430
- onResume,
4431
- isPaused,
4432
- isPausing,
4433
- showScreenShareToggle
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__ */ jsxs18("div", {
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__ */ jsx22(CircleAlert, {
4513
+ /* @__PURE__ */ jsx20(CircleAlert, {
4443
4514
  className: "skippr:mb-3 skippr:size-7 skippr:text-destructive"
4444
4515
  }),
4445
- /* @__PURE__ */ jsx22("p", {
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__ */ jsx22("p", {
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__ */ jsx22(SessionWarningBanner, {
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__ */ jsx22("div", {
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__ */ jsx22(SessionAgenda, {
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__ */ jsx22("div", {
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__ */ jsx22(MessageList, {
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 { jsx as jsx23 } from "react/jsx-runtime";
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 { isPanelOpen, togglePanel, minimizePanel, minimizable, position, isMinimized } = useLiveAgent();
4493
- if (isMinimized)
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__ */ jsx23("button", {
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
- className: cn("skippr:fixed skippr:bottom-6 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"),
4502
- children: isPanelOpen ? /* @__PURE__ */ jsx23(ChevronDown, {
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__ */ jsx23(Logo, {
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 jsx24, jsxs as jsxs19 } from "react/jsx-runtime";
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] = useState15(null);
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 = useCallback10(() => {
4670
+ const minimizeOnSessionStart = useCallback11(() => {
4547
4671
  if (minimizable) {
4548
4672
  setIsMinimized(true);
4549
4673
  setIsPanelOpen(false);
4550
4674
  }
4551
4675
  }, [minimizable]);
4552
- const expandOnSessionStartError = useCallback10(() => {
4676
+ const expandOnSessionStartError = useCallback11(() => {
4553
4677
  setIsMinimized(false);
4554
4678
  setIsPanelOpen(true);
4555
4679
  }, []);
4556
- const minimizeOnSessionDisconnect = useCallback10(() => {
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 = useRef13(false);
4716
+ const teardownInFlightRef = useRef16(false);
4593
4717
  teardownInFlightRef.current = isPaused || isPausing || isDisconnecting;
4594
- const handleRoomDisconnected = useCallback10(() => {
4718
+ const handleRoomDisconnected = useCallback11(() => {
4595
4719
  if (teardownInFlightRef.current)
4596
4720
  return;
4597
4721
  disconnect();
4598
4722
  }, [disconnect]);
4599
- const inSession = connection !== null || isStarting || isPaused || isPausing || isDisconnecting;
4600
- const [isPanelOpen, setIsPanelOpen] = useState15(defaultOpen);
4601
- const [isMinimized, setIsMinimized] = useState15(minimizable && !defaultOpen);
4602
- const [sidebarTab, setSidebarTab] = useState15("agenda");
4603
- const [phasesSnapshot, setPhasesSnapshot] = useState15([]);
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: !inSession,
4748
+ enabled: !isSessionLive,
4611
4749
  bearerToken,
4612
4750
  authedFetch
4613
4751
  });
4614
- const {
4615
- goals: adoptionGoals,
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 = useCallback10(async () => {
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 = useCallback10((moduleId) => {
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 = useCallback10((goal) => {
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] = useState15(false);
4664
- const dismissWelcome = useCallback10(() => setWelcomeDismissed(true), []);
4665
- const [currentPosition, setCurrentPosition] = useState15(() => {
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 = useCallback10((pos) => {
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 openPanel = useCallback10(() => setIsPanelOpen(true), []);
4680
- const closePanel = useCallback10(() => setIsPanelOpen(false), []);
4681
- const togglePanel = useCallback10(() => setIsPanelOpen((prev) => !prev), []);
4682
- const expandPanel = useCallback10(() => {
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 = useCallback10(() => {
4848
+ const minimizePanel = useCallback11(() => {
4687
4849
  if (!minimizable)
4688
4850
  return;
4689
4851
  setIsMinimized(true);
4690
4852
  setIsPanelOpen(false);
4691
4853
  }, [minimizable]);
4692
- const isConnected = connection !== null;
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
- pauseSession,
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__ */ jsx24(LiveAgentContext.Provider, {
4982
+ return /* @__PURE__ */ jsx23(LiveAgentContext.Provider, {
4804
4983
  value: ctx,
4805
- children: /* @__PURE__ */ jsxs19(LiveKitRoom, {
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__ */ jsx24(RoomAudioRenderer, {}),
4813
- connection && captureMode === "screenshare" && /* @__PURE__ */ jsx24(AutoStartMedia, {
4991
+ connection && !textMode && /* @__PURE__ */ jsx23(RoomAudioRenderer, {}),
4992
+ connection && captureMode === "screenshare" && /* @__PURE__ */ jsx23(AutoStartMedia, {
4814
4993
  pendingScreenStream
4815
4994
  }),
4816
- connection && captureMode === "auto" && /* @__PURE__ */ jsx24(DomCapture, {}),
4817
- /* @__PURE__ */ jsxs19(ShadowHost, {
4995
+ connection && captureMode === "auto" && /* @__PURE__ */ jsx23(DomCapture, {}),
4996
+ /* @__PURE__ */ jsxs18(ShadowHost, {
4818
4997
  children: [
4819
- connection && captureMode === "auto" && agentControls?.highlight && /* @__PURE__ */ jsx24(HighlightOverlay, {}),
4820
- connection && captureMode === "auto" && agentControls?.actions && /* @__PURE__ */ jsx24(PageActionHandler, {}),
4821
- /* @__PURE__ */ jsxs19("div", {
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__ */ jsx24(MinimizedBubble, {
5003
+ isMinimized && !showControlBar && /* @__PURE__ */ jsx23(MinimizedBubble, {
4825
5004
  welcomeMessage,
4826
5005
  welcomeDismissed,
4827
5006
  onDismissWelcome: dismissWelcome
4828
5007
  }),
4829
- /* @__PURE__ */ jsx24(SidebarTrigger, {}),
4830
- /* @__PURE__ */ jsx24(Sidebar, {
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 useLocalParticipant6 } from "@livekit/components-react/hooks";
5025
+ import { useIsSpeaking, useLocalParticipant as useLocalParticipant8 } from "@livekit/components-react/hooks";
4846
5026
  function useIsLocalSpeaking() {
4847
- const { localParticipant } = useLocalParticipant6();
5027
+ const { localParticipant } = useLocalParticipant8();
4848
5028
  return useIsSpeaking(localParticipant);
4849
5029
  }
4850
5030
  export {