@flamingo-stack/openframe-frontend-core 0.0.701 → 0.0.702-snapshot.20261005191338

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.
Files changed (106) hide show
  1. package/dist/{chunk-DJLZXJYB.js → chunk-2NE3DNXY.js} +1 -1
  2. package/dist/{chunk-V5QNDOEL.js → chunk-53AC23ZN.js} +4 -4
  3. package/dist/{chunk-BQ34PIFC.cjs → chunk-5VPIC5MD.cjs} +3 -3
  4. package/dist/{chunk-BRQY2HKD.cjs → chunk-67CXGPTW.cjs} +24 -24
  5. package/dist/{chunk-BZYMGI4L.js → chunk-7632TNE7.js} +1 -1
  6. package/dist/{chunk-QPNR4N7N.cjs → chunk-BMJUKS6S.cjs} +20 -20
  7. package/dist/{chunk-GD4JALTR.js → chunk-BOUPNYUV.js} +2 -2
  8. package/dist/{chunk-BPS7JQCI.cjs → chunk-BSEIEWM5.cjs} +2 -2
  9. package/dist/{chunk-6JG75WVO.js → chunk-DAW6TDZB.js} +4 -4
  10. package/dist/{chunk-B7M6QEEM.js → chunk-ENGBNKUJ.js} +673 -432
  11. package/dist/{chunk-N7HMUQRV.js → chunk-G55W76S6.js} +1 -1
  12. package/dist/{chunk-65YVUYWJ.cjs → chunk-GX3OUTFO.cjs} +32 -32
  13. package/dist/{chunk-S4ADN25W.js → chunk-GZYLZ4MB.js} +2 -2
  14. package/dist/{chunk-A5ZGKBN2.js → chunk-HHFPQNP3.js} +1 -1
  15. package/dist/{chunk-RTGPIHVO.cjs → chunk-HY5YL3U5.cjs} +247 -173
  16. package/dist/{chunk-DG2I57UM.cjs → chunk-HYLIQMZH.cjs} +21 -21
  17. package/dist/{chunk-N7DPIH57.js → chunk-J4K5JOLI.js} +1 -1
  18. package/dist/{chunk-4H5Q6MQG.cjs → chunk-KFDP3DUL.cjs} +44 -44
  19. package/dist/{chunk-QDIX2ZRL.cjs → chunk-MXHJROXJ.cjs} +754 -513
  20. package/dist/{chunk-CUPJCGLB.js → chunk-NCTYD7HL.js} +2 -2
  21. package/dist/{chunk-MFORWVGD.js → chunk-NMGX2ZTU.js} +5 -5
  22. package/dist/{chunk-QZGFJBG5.cjs → chunk-NU724ZVN.cjs} +70 -70
  23. package/dist/{chunk-ZSPHOHOW.cjs → chunk-NYSYSKSH.cjs} +9 -9
  24. package/dist/{chunk-PNWIVND4.js → chunk-PJP5SMOU.js} +3 -3
  25. package/dist/{chunk-6JPQDYYY.js → chunk-QGTDWFT6.js} +419 -345
  26. package/dist/{chunk-GFXZMFDX.cjs → chunk-RLDAYA2A.cjs} +9 -9
  27. package/dist/{chunk-2CSYUMNM.cjs → chunk-RTXTGLGB.cjs} +2 -2
  28. package/dist/{chunk-YBC346FY.cjs → chunk-S6V7A5FS.cjs} +12 -12
  29. package/dist/{chunk-7ZDTAABP.cjs → chunk-SFGXIFYO.cjs} +7 -7
  30. package/dist/{chunk-JPVDJB27.js → chunk-SL2FOFT2.js} +4 -4
  31. package/dist/{chunk-EONNPRAW.js → chunk-UTW4SQDI.js} +2 -2
  32. package/dist/{chunk-NIT257DV.cjs → chunk-YBGEPKC2.cjs} +4 -4
  33. package/dist/components/case-studies/index.cjs +14 -14
  34. package/dist/components/case-studies/index.js +3 -3
  35. package/dist/components/chat/embeddable-chat.d.ts.map +1 -1
  36. package/dist/components/chat/index.cjs +2 -2
  37. package/dist/components/chat/index.js +1 -1
  38. package/dist/components/contact/index.cjs +4 -4
  39. package/dist/components/contact/index.js +3 -3
  40. package/dist/components/docs/index.cjs +7 -7
  41. package/dist/components/docs/index.js +6 -6
  42. package/dist/components/embeds/index.cjs +4 -4
  43. package/dist/components/embeds/index.js +3 -3
  44. package/dist/components/faq/index.cjs +4 -4
  45. package/dist/components/faq/index.js +3 -3
  46. package/dist/components/features/index.cjs +23 -3
  47. package/dist/components/features/index.js +22 -2
  48. package/dist/components/features/remote-session/index.d.ts +9 -1
  49. package/dist/components/features/remote-session/index.d.ts.map +1 -1
  50. package/dist/components/features/remote-session/remote-session-block.d.ts +4 -2
  51. package/dist/components/features/remote-session/remote-session-block.d.ts.map +1 -1
  52. package/dist/components/features/remote-session/remote-session-chat-panel.d.ts +4 -2
  53. package/dist/components/features/remote-session/remote-session-chat-panel.d.ts.map +1 -1
  54. package/dist/components/features/remote-session/remote-session-events.d.ts +24 -0
  55. package/dist/components/features/remote-session/remote-session-events.d.ts.map +1 -0
  56. package/dist/components/features/remote-session/remote-session-keep-modals.d.ts +41 -0
  57. package/dist/components/features/remote-session/remote-session-keep-modals.d.ts.map +1 -0
  58. package/dist/components/features/remote-session/remote-session-parts.d.ts +13 -2
  59. package/dist/components/features/remote-session/remote-session-parts.d.ts.map +1 -1
  60. package/dist/components/features/remote-session/remote-session-status.d.ts +34 -0
  61. package/dist/components/features/remote-session/remote-session-status.d.ts.map +1 -0
  62. package/dist/components/features/remote-session/remote-session-viewers.d.ts +15 -0
  63. package/dist/components/features/remote-session/remote-session-viewers.d.ts.map +1 -0
  64. package/dist/components/features/remote-session/types.d.ts +22 -0
  65. package/dist/components/features/remote-session/types.d.ts.map +1 -1
  66. package/dist/components/help-center-pages/index.cjs +71 -71
  67. package/dist/components/help-center-pages/index.js +14 -14
  68. package/dist/components/index.cjs +61 -41
  69. package/dist/components/index.js +33 -13
  70. package/dist/components/meeting-scheduler/index.cjs +25 -25
  71. package/dist/components/meeting-scheduler/index.js +2 -2
  72. package/dist/components/navigation/app-layout-drawer.d.ts.map +1 -1
  73. package/dist/components/navigation/index.cjs +6 -6
  74. package/dist/components/navigation/index.js +5 -5
  75. package/dist/components/onboarding-guides/index.cjs +6 -6
  76. package/dist/components/onboarding-guides/index.js +5 -5
  77. package/dist/components/tickets/index.cjs +7 -7
  78. package/dist/components/tickets/index.js +6 -6
  79. package/dist/components/ui/drawer.d.ts +7 -3
  80. package/dist/components/ui/drawer.d.ts.map +1 -1
  81. package/dist/components/ui/index.cjs +3 -3
  82. package/dist/components/ui/index.js +2 -2
  83. package/dist/components/ui/panel-resize-handle.d.ts +25 -0
  84. package/dist/components/ui/panel-resize-handle.d.ts.map +1 -0
  85. package/dist/hooks/ui/use-resizable-panel-size.d.ts +46 -0
  86. package/dist/hooks/ui/use-resizable-panel-size.d.ts.map +1 -0
  87. package/dist/index.cjs +27 -7
  88. package/dist/index.js +26 -6
  89. package/dist/tailwind.config.cjs +7 -1
  90. package/dist/tailwind.config.js +7 -1
  91. package/package.json +1 -1
  92. package/src/components/chat/embeddable-chat.tsx +11 -9
  93. package/src/components/features/remote-session/index.ts +28 -0
  94. package/src/components/features/remote-session/remote-session-block.tsx +6 -3
  95. package/src/components/features/remote-session/remote-session-chat-panel.tsx +11 -7
  96. package/src/components/features/remote-session/remote-session-events.tsx +93 -0
  97. package/src/components/features/remote-session/remote-session-keep-modals.tsx +208 -0
  98. package/src/components/features/remote-session/remote-session-parts.tsx +32 -3
  99. package/src/components/features/remote-session/remote-session-status.tsx +102 -0
  100. package/src/components/features/remote-session/remote-session-viewers.tsx +103 -0
  101. package/src/components/features/remote-session/types.ts +26 -0
  102. package/src/components/navigation/app-layout-drawer.tsx +14 -237
  103. package/src/components/ui/drawer.tsx +41 -188
  104. package/src/components/ui/panel-resize-handle.tsx +184 -0
  105. package/src/hooks/ui/use-resizable-panel-size.ts +114 -0
  106. package/tailwind.config.ts +6 -0
@@ -60,6 +60,7 @@ import {
60
60
  ModalTwoColumn,
61
61
  NO_BROKEN_LINKS,
62
62
  OVERLAY_BACKDROP_CLASS,
63
+ PanelResizeHandle,
63
64
  ScrollFadeOverlay,
64
65
  ScrollShadow,
65
66
  SimpleMarkdownRenderer,
@@ -94,12 +95,12 @@ import {
94
95
  useCaptions,
95
96
  useCollapsible,
96
97
  useIsHydrated,
98
+ useResizablePanelSize,
97
99
  useScrollFade
98
- } from "./chunk-6JPQDYYY.js";
100
+ } from "./chunk-QGTDWFT6.js";
99
101
  import {
100
102
  NEAR_VIEWPORT_ROOT_MARGIN,
101
103
  ToolIcon,
102
- clamp,
103
104
  createHeadingIdDeduper,
104
105
  scanHeadings,
105
106
  slugifyHeadingBase,
@@ -194,6 +195,7 @@ import {
194
195
  FlaskVialIcon,
195
196
  GoogleLogoIcon,
196
197
  HhsLogoIcon,
198
+ HourglassIcon,
197
199
  ImageOffIcon,
198
200
  ImagePlusIcon,
199
201
  InfoCircleIcon,
@@ -201,6 +203,7 @@ import {
201
203
  IsoLogoIcon,
202
204
  LinkedinIcon,
203
205
  LinuxLogoIcon,
206
+ LockIcon,
204
207
  MessageOffIcon,
205
208
  MessagesIcon,
206
209
  MicrosoftLogoIcon,
@@ -28821,15 +28824,7 @@ var appLayoutDrawerPanelVariants = cva7(
28821
28824
  );
28822
28825
  var HORIZONTAL_SIDES = /* @__PURE__ */ new Set(["left", "right"]);
28823
28826
  var PERSIST_CLOSED_HOLD = "data-[state=closed]:fill-mode-forwards";
28824
- function useContainedResizableSize({
28825
- enabled,
28826
- isHorizontal,
28827
- minSize,
28828
- maxSize,
28829
- defaultSize,
28830
- storageKey,
28831
- container
28832
- }) {
28827
+ function useContainerExtent(enabled, isHorizontal, container) {
28833
28828
  const [available, setAvailable] = useState69(0);
28834
28829
  useEffect39(() => {
28835
28830
  if (!enabled || !container) return void 0;
@@ -28841,147 +28836,7 @@ function useContainedResizableSize({
28841
28836
  ro.observe(container);
28842
28837
  return () => ro.disconnect();
28843
28838
  }, [enabled, container, isHorizontal]);
28844
- const clampToContainer = useCallback24(
28845
- (value) => {
28846
- const effectiveMax = available > 0 ? Math.min(maxSize, available - 40) : maxSize;
28847
- return clamp(value, minSize, Math.max(minSize, effectiveMax));
28848
- },
28849
- [available, minSize, maxSize]
28850
- );
28851
- const readInitial = useCallback24(() => {
28852
- if (!enabled) return defaultSize;
28853
- if (typeof window === "undefined") return defaultSize;
28854
- if (!storageKey) return defaultSize;
28855
- try {
28856
- const raw = window.localStorage.getItem(storageKey);
28857
- if (!raw) return defaultSize;
28858
- const parsed = parseFloat(raw);
28859
- if (!Number.isFinite(parsed)) return defaultSize;
28860
- return parsed;
28861
- } catch {
28862
- return defaultSize;
28863
- }
28864
- }, [enabled, storageKey, defaultSize]);
28865
- const [rawSize, setSizeRaw] = useState69(readInitial);
28866
- const size = enabled ? clampToContainer(rawSize) : rawSize;
28867
- const setSize = useCallback24((next) => setSizeRaw(clampToContainer(next)), [clampToContainer]);
28868
- useEffect39(() => {
28869
- if (!enabled || !storageKey || typeof window === "undefined") return;
28870
- try {
28871
- window.localStorage.setItem(storageKey, String(Math.round(size)));
28872
- } catch {
28873
- }
28874
- }, [enabled, size, storageKey]);
28875
- return { size, setSize, clampSize: clampToContainer };
28876
- }
28877
- function finishDrag(startRef, dragSizeRef, commit) {
28878
- if (!startRef.current) return;
28879
- startRef.current = null;
28880
- if (dragSizeRef.current !== null) commit(dragSizeRef.current);
28881
- dragSizeRef.current = null;
28882
- document.body.style.cursor = "";
28883
- document.body.style.userSelect = "";
28884
- }
28885
- function AppLayoutDrawerResizeHandle({
28886
- side,
28887
- size,
28888
- minSize,
28889
- maxSize,
28890
- onSize,
28891
- clampSize,
28892
- panelRef,
28893
- ariaLabel
28894
- }) {
28895
- const isHorizontal = HORIZONTAL_SIDES.has(side);
28896
- const startRef = useRef37(null);
28897
- const dragSizeRef = useRef37(null);
28898
- const onSizeRef = useRef37(onSize);
28899
- useEffect39(() => {
28900
- onSizeRef.current = onSize;
28901
- }, [onSize]);
28902
- useEffect39(() => () => finishDrag(startRef, dragSizeRef, onSizeRef.current), []);
28903
- const direction = side === "right" || side === "bottom" ? -1 : 1;
28904
- const handlePointerDown = (e) => {
28905
- if (e.button !== 0 && e.pointerType === "mouse") return;
28906
- e.preventDefault();
28907
- startRef.current = { x: e.clientX, y: e.clientY, size };
28908
- e.currentTarget.setPointerCapture(e.pointerId);
28909
- document.body.style.cursor = isHorizontal ? "col-resize" : "row-resize";
28910
- document.body.style.userSelect = "none";
28911
- };
28912
- const handlePointerMove = (e) => {
28913
- const start = startRef.current;
28914
- const panel = panelRef.current;
28915
- if (!start || !panel) return;
28916
- const delta = isHorizontal ? e.clientX - start.x : e.clientY - start.y;
28917
- const next = clampSize(start.size + delta * direction);
28918
- dragSizeRef.current = next;
28919
- panel.style[isHorizontal ? "width" : "height"] = `${next}px`;
28920
- e.currentTarget.setAttribute("aria-valuenow", String(Math.round(next)));
28921
- };
28922
- const endDrag = (e) => {
28923
- if (!startRef.current) return;
28924
- finishDrag(startRef, dragSizeRef, onSize);
28925
- try {
28926
- e.currentTarget.releasePointerCapture(e.pointerId);
28927
- } catch {
28928
- }
28929
- };
28930
- const handleKeyDown = (e) => {
28931
- const step = e.shiftKey ? 40 : 16;
28932
- if (isHorizontal) {
28933
- if (e.key === "ArrowLeft") {
28934
- e.preventDefault();
28935
- onSize(size + step * (side === "right" ? 1 : -1));
28936
- } else if (e.key === "ArrowRight") {
28937
- e.preventDefault();
28938
- onSize(size + step * (side === "right" ? -1 : 1));
28939
- }
28940
- } else {
28941
- if (e.key === "ArrowUp") {
28942
- e.preventDefault();
28943
- onSize(size + step * (side === "bottom" ? 1 : -1));
28944
- } else if (e.key === "ArrowDown") {
28945
- e.preventDefault();
28946
- onSize(size + step * (side === "bottom" ? -1 : 1));
28947
- }
28948
- }
28949
- if (e.key === "Home") {
28950
- e.preventDefault();
28951
- onSize(minSize);
28952
- } else if (e.key === "End") {
28953
- e.preventDefault();
28954
- onSize(maxSize);
28955
- }
28956
- };
28957
- const trackPosition = side === "right" ? "right-full top-4 bottom-4 w-6 items-center justify-end pr-1" : side === "left" ? "left-full top-4 bottom-4 w-6 items-center justify-start pl-1" : side === "bottom" ? "bottom-full left-4 right-4 h-6 justify-center items-end pb-1" : "top-full left-4 right-4 h-6 justify-center items-start pt-1";
28958
- const cursorClass = isHorizontal ? "cursor-col-resize" : "cursor-row-resize";
28959
- const gripClass = isHorizontal ? "h-10 w-1" : "w-10 h-1";
28960
- return /* @__PURE__ */ jsx258(
28961
- "div",
28962
- {
28963
- role: "separator",
28964
- tabIndex: 0,
28965
- "aria-orientation": isHorizontal ? "vertical" : "horizontal",
28966
- "aria-valuenow": Math.round(size),
28967
- "aria-valuemin": minSize,
28968
- "aria-valuemax": maxSize,
28969
- "aria-label": ariaLabel ?? (isHorizontal ? "Resize panel width" : "Resize panel height"),
28970
- onPointerDown: handlePointerDown,
28971
- onPointerMove: handlePointerMove,
28972
- onPointerUp: endDrag,
28973
- onPointerCancel: endDrag,
28974
- onLostPointerCapture: endDrag,
28975
- onKeyDown: handleKeyDown,
28976
- className: cn(
28977
- "group absolute z-20 flex touch-none select-none",
28978
- "outline-none ring-0 focus:outline-none focus:ring-0 focus-visible:outline-none focus-visible:ring-0",
28979
- trackPosition,
28980
- cursorClass
28981
- ),
28982
- children: /* @__PURE__ */ jsx258("div", { "aria-hidden": true, className: cn("rounded-full bg-ods-border", gripClass) })
28983
- }
28984
- );
28839
+ return available;
28985
28840
  }
28986
28841
  var AppLayoutDrawerContent = forwardRef30(
28987
28842
  ({
@@ -29076,14 +28931,15 @@ var AppLayoutDrawerContent = forwardRef30(
29076
28931
  return () => mq.removeEventListener("change", update);
29077
28932
  }, [mobileBreakpoint]);
29078
28933
  const panelRef = useRef37(null);
29079
- const { size, setSize, clampSize } = useContainedResizableSize({
28934
+ const available = useContainerExtent(resizable, isHorizontal, portalContainer);
28935
+ const { size, setSize, clampSize } = useResizablePanelSize({
29080
28936
  enabled: resizable,
29081
- isHorizontal,
29082
28937
  minSize,
29083
28938
  maxSize,
29084
28939
  defaultSize: initialSize,
29085
- storageKey,
29086
- container: portalContainer
28940
+ available,
28941
+ reserve: 40,
28942
+ storageKey
29087
28943
  });
29088
28944
  const applyInlineSize = resizable && !isMobile;
29089
28945
  const sizeStyle = applyInlineSize ? isHorizontal ? { width: size } : { height: size } : {};
@@ -29137,8 +28993,9 @@ var AppLayoutDrawerContent = forwardRef30(
29137
28993
  ...props,
29138
28994
  children: [
29139
28995
  applyInlineSize && (!persist || open) ? /* @__PURE__ */ jsx258(
29140
- AppLayoutDrawerResizeHandle,
28996
+ PanelResizeHandle,
29141
28997
  {
28998
+ variant: "inLayout",
29142
28999
  side: resolvedSide,
29143
29000
  size,
29144
29001
  minSize,
@@ -30417,8 +30274,93 @@ function TimeTrackerHeaderButton({ className, disabled }) {
30417
30274
  }
30418
30275
 
30419
30276
  // src/components/features/remote-session/remote-session-parts.tsx
30420
- import { useEffect as useEffect45, useState as useState77 } from "react";
30277
+ import { useEffect as useEffect45, useState as useState78 } from "react";
30278
+
30279
+ // src/components/features/remote-session/remote-session-viewers.tsx
30280
+ import { useState as useState77 } from "react";
30421
30281
  import { jsx as jsx268, jsxs as jsxs211 } from "react/jsx-runtime";
30282
+ function viewerLabel(viewer) {
30283
+ if (viewer.isHost) return `${viewer.name} (host)`;
30284
+ if (viewer.isYou) return `${viewer.name} (you)`;
30285
+ return viewer.name;
30286
+ }
30287
+ function hostFirst(viewers) {
30288
+ return [...viewers.filter((viewer) => viewer.isHost), ...viewers.filter((viewer) => !viewer.isHost)];
30289
+ }
30290
+ function RemoteSessionViewers({ viewers, max = 4, className }) {
30291
+ const [open, setOpen] = useState77(false);
30292
+ if (viewers.length === 0) return null;
30293
+ const ordered = hostFirst(viewers);
30294
+ const faces = ordered.slice(0, max);
30295
+ const overflow2 = ordered.length - faces.length;
30296
+ const Chevron = open ? Chevron02UpIcon : Chevron02DownIcon;
30297
+ return /* @__PURE__ */ jsxs211(DropdownMenu, { open, onOpenChange: setOpen, children: [
30298
+ /* @__PURE__ */ jsxs211(
30299
+ DropdownMenuTrigger,
30300
+ {
30301
+ "aria-label": `In this session: ${ordered.map(viewerLabel).join(", ")}`,
30302
+ className: cn(
30303
+ "flex shrink-0 items-center gap-[var(--spacing-system-xxs)] rounded-md outline-none",
30304
+ "focus-visible:ring-2 focus-visible:ring-ods-focus",
30305
+ className
30306
+ ),
30307
+ children: [
30308
+ /* @__PURE__ */ jsxs211("span", { className: "flex items-center", children: [
30309
+ faces.map((viewer, index) => /* @__PURE__ */ jsx268(
30310
+ SquareAvatar,
30311
+ {
30312
+ variant: "round",
30313
+ sizePx: 32,
30314
+ src: viewer.avatarUrl ?? void 0,
30315
+ alt: viewer.name,
30316
+ fallback: viewer.name,
30317
+ className: cn(
30318
+ "relative bg-ods-bg",
30319
+ viewer.isHost ? "ring-2 ring-ods-accent" : "ring-1 ring-ods-border",
30320
+ index > 0 && "-ml-2"
30321
+ ),
30322
+ style: { zIndex: faces.length - index + 1 }
30323
+ },
30324
+ viewer.id
30325
+ )),
30326
+ overflow2 > 0 && /* @__PURE__ */ jsxs211("span", { className: "relative -ml-2 flex size-8 shrink-0 items-center justify-center rounded-full bg-ods-bg text-ods-text-secondary ring-1 ring-ods-border text-h6", children: [
30327
+ "+",
30328
+ overflow2
30329
+ ] })
30330
+ ] }),
30331
+ /* @__PURE__ */ jsx268("span", { className: "flex size-8 items-center justify-center rounded-md text-ods-text-primary", children: /* @__PURE__ */ jsx268(Chevron, { size: 16, color: "currentColor" }) })
30332
+ ]
30333
+ }
30334
+ ),
30335
+ /* @__PURE__ */ jsx268(DropdownMenuContent, { align: "end", className: "w-[280px] p-0", children: ordered.map((viewer) => /* @__PURE__ */ jsxs211(
30336
+ DropdownMenuItem,
30337
+ {
30338
+ className: cn(
30339
+ "gap-[var(--spacing-system-xsf)] rounded-none border-b border-ods-border bg-ods-bg last:border-b-0",
30340
+ "py-[var(--spacing-system-s)] pl-[var(--spacing-system-mf)] pr-[var(--spacing-system-xs)] text-h4"
30341
+ ),
30342
+ children: [
30343
+ /* @__PURE__ */ jsx268(
30344
+ SquareAvatar,
30345
+ {
30346
+ variant: "round",
30347
+ sizePx: 24,
30348
+ src: viewer.avatarUrl ?? void 0,
30349
+ alt: "",
30350
+ fallback: viewer.name,
30351
+ className: "shrink-0"
30352
+ }
30353
+ ),
30354
+ /* @__PURE__ */ jsx268("span", { className: "min-w-0 flex-1 truncate", children: viewerLabel(viewer) })
30355
+ ]
30356
+ },
30357
+ viewer.id
30358
+ )) })
30359
+ ] });
30360
+ }
30361
+
30362
+ // src/components/features/remote-session/remote-session-parts.tsx
30363
+ import { jsx as jsx269, jsxs as jsxs212 } from "react/jsx-runtime";
30422
30364
  var DESKTOP_SCALE = {
30423
30365
  "--spacing-system-xs": "0.5rem",
30424
30366
  "--spacing-system-s": "0.75rem",
@@ -30439,11 +30381,11 @@ var DESKTOP_SCALE = {
30439
30381
  "--font-line-space-h6-caption": "1.25rem"
30440
30382
  };
30441
30383
  function RemoteSessionScope({ children, className }) {
30442
- return /* @__PURE__ */ jsx268("div", { "data-app-type": "openframe", style: DESKTOP_SCALE, className, children });
30384
+ return /* @__PURE__ */ jsx269("div", { "data-app-type": "openframe", style: DESKTOP_SCALE, className, children });
30443
30385
  }
30444
30386
  function RemoteSessionOrgLogo({ name, logoUrl, sizePx, className }) {
30445
30387
  if (logoUrl) {
30446
- return /* @__PURE__ */ jsx268(
30388
+ return /* @__PURE__ */ jsx269(
30447
30389
  SquareAvatar,
30448
30390
  {
30449
30391
  variant: "square",
@@ -30456,7 +30398,7 @@ function RemoteSessionOrgLogo({ name, logoUrl, sizePx, className }) {
30456
30398
  }
30457
30399
  );
30458
30400
  }
30459
- return /* @__PURE__ */ jsx268(
30401
+ return /* @__PURE__ */ jsx269(
30460
30402
  "div",
30461
30403
  {
30462
30404
  role: "img",
@@ -30466,19 +30408,40 @@ function RemoteSessionOrgLogo({ name, logoUrl, sizePx, className }) {
30466
30408
  "flex shrink-0 items-center justify-center rounded-md border border-ods-border bg-ods-card",
30467
30409
  className
30468
30410
  ),
30469
- children: /* @__PURE__ */ jsx268(OpenFrameLogo, { className: "size-1/2" })
30411
+ children: /* @__PURE__ */ jsx269(OpenFrameLogo, { className: "size-1/2" })
30412
+ }
30413
+ );
30414
+ }
30415
+ function RemoteSessionRecordingTag({ className }) {
30416
+ return /* @__PURE__ */ jsxs212(
30417
+ "div",
30418
+ {
30419
+ className: cn(
30420
+ "flex h-8 items-center gap-[var(--spacing-system-xs)] self-start rounded-md bg-ods-success-secondary p-[var(--spacing-system-xsf)]",
30421
+ className
30422
+ ),
30423
+ children: [
30424
+ /* @__PURE__ */ jsx269(RecordingIcon, { size: 16, color: "currentColor", className: "text-ods-success" }),
30425
+ /* @__PURE__ */ jsx269("span", { className: "text-ods-success text-h5", children: "Session Recording" })
30426
+ ]
30470
30427
  }
30471
30428
  );
30472
30429
  }
30473
- function RemoteSessionRecordingTag() {
30474
- return /* @__PURE__ */ jsxs211("div", { className: "flex h-8 items-center gap-[var(--spacing-system-xs)] self-start rounded-md bg-ods-success-secondary p-[var(--spacing-system-xsf)]", children: [
30475
- /* @__PURE__ */ jsx268(RecordingIcon, { size: 16, color: "currentColor", className: "text-ods-success" }),
30476
- /* @__PURE__ */ jsx268("span", { className: "text-ods-success text-h5", children: "Session Recording" })
30430
+ function RemoteSessionStatusRow({
30431
+ showRecordingTag,
30432
+ viewers
30433
+ }) {
30434
+ const hasViewers = !!viewers && viewers.length > 0;
30435
+ if (!showRecordingTag && !hasViewers) return null;
30436
+ if (!hasViewers) return /* @__PURE__ */ jsx269(RemoteSessionRecordingTag, {});
30437
+ return /* @__PURE__ */ jsxs212("div", { className: "flex w-full items-center gap-[var(--spacing-system-m)]", children: [
30438
+ showRecordingTag && /* @__PURE__ */ jsx269(RemoteSessionRecordingTag, { className: "flex-1 justify-center self-auto" }),
30439
+ /* @__PURE__ */ jsx269(RemoteSessionViewers, { viewers, className: "ml-auto" })
30477
30440
  ] });
30478
30441
  }
30479
30442
  var REMOTE_SESSION_DRAG_HANDLE_CLASS = "cursor-grab active:cursor-grabbing";
30480
30443
  function RemoteSessionDragger({ dragHandlers }) {
30481
- return /* @__PURE__ */ jsx268(
30444
+ return /* @__PURE__ */ jsx269(
30482
30445
  "span",
30483
30446
  {
30484
30447
  "aria-hidden": true,
@@ -30487,7 +30450,7 @@ function RemoteSessionDragger({ dragHandlers }) {
30487
30450
  dragHandlers && REMOTE_SESSION_DRAG_HANDLE_CLASS
30488
30451
  ),
30489
30452
  ...dragHandlers,
30490
- children: /* @__PURE__ */ jsx268(DraggerIcon, { size: 24, color: "currentColor" })
30453
+ children: /* @__PURE__ */ jsx269(DraggerIcon, { size: 24, color: "currentColor" })
30491
30454
  }
30492
30455
  );
30493
30456
  }
@@ -30499,7 +30462,7 @@ function formatRemoteSessionElapsed(elapsedMs) {
30499
30462
  return hours > 0 ? `${hours}:${String(minutes).padStart(2, "0")}:${seconds}` : `${minutes}:${seconds}`;
30500
30463
  }
30501
30464
  function useRemoteSessionTimer(startedAt) {
30502
- const [nowMs, setNowMs] = useState77(() => Date.now());
30465
+ const [nowMs, setNowMs] = useState78(() => Date.now());
30503
30466
  useEffect45(() => {
30504
30467
  const timer = setInterval(() => setNowMs(Date.now()), 1e3);
30505
30468
  return () => clearInterval(timer);
@@ -30508,7 +30471,7 @@ function useRemoteSessionTimer(startedAt) {
30508
30471
  }
30509
30472
 
30510
30473
  // src/components/features/remote-session/remote-access-request-card.tsx
30511
- import { jsx as jsx269, jsxs as jsxs212 } from "react/jsx-runtime";
30474
+ import { jsx as jsx270, jsxs as jsxs213 } from "react/jsx-runtime";
30512
30475
  function displaySiteUrl(url) {
30513
30476
  return url.replace(/^https?:\/\//, "").replace(/\/$/, "");
30514
30477
  }
@@ -30523,30 +30486,30 @@ function RemoteAccessRequestCard({
30523
30486
  const { organizationName } = party;
30524
30487
  const siteUrl = party.organizationSiteUrl ?? void 0;
30525
30488
  const openableSite = siteUrl?.startsWith("https://") ? siteUrl : void 0;
30526
- return /* @__PURE__ */ jsxs212("div", { className: "flex w-full flex-col gap-[var(--spacing-system-l)] rounded-md border border-ods-border bg-ods-card p-[var(--spacing-system-xl)]", children: [
30527
- /* @__PURE__ */ jsx269("h1", { className: "w-full text-ods-text-primary text-h2", children: "Your IT support team is requesting remote access" }),
30528
- /* @__PURE__ */ jsxs212("div", { className: "flex w-full items-center gap-[var(--spacing-system-m)] rounded-md border border-ods-border bg-ods-bg p-[var(--spacing-system-m)]", children: [
30529
- /* @__PURE__ */ jsx269(RemoteSessionOrgLogo, { name: organizationName, logoUrl: party.organizationLogoUrl, sizePx: 64 }),
30530
- /* @__PURE__ */ jsxs212("div", { className: "flex min-w-0 flex-1 flex-col", children: [
30531
- /* @__PURE__ */ jsx269("p", { className: "w-full truncate text-ods-text-primary text-h3", children: organizationName }),
30532
- siteUrl && /* @__PURE__ */ jsx269("p", { className: "w-full truncate text-ods-text-secondary text-h4", children: displaySiteUrl(siteUrl) })
30489
+ return /* @__PURE__ */ jsxs213("div", { className: "flex w-full flex-col gap-[var(--spacing-system-l)] rounded-md border border-ods-border bg-ods-card p-[var(--spacing-system-xl)]", children: [
30490
+ /* @__PURE__ */ jsx270("h1", { className: "w-full text-ods-text-primary text-h2", children: "Your IT support team is requesting remote access" }),
30491
+ /* @__PURE__ */ jsxs213("div", { className: "flex w-full items-center gap-[var(--spacing-system-m)] rounded-md border border-ods-border bg-ods-bg p-[var(--spacing-system-m)]", children: [
30492
+ /* @__PURE__ */ jsx270(RemoteSessionOrgLogo, { name: organizationName, logoUrl: party.organizationLogoUrl, sizePx: 64 }),
30493
+ /* @__PURE__ */ jsxs213("div", { className: "flex min-w-0 flex-1 flex-col", children: [
30494
+ /* @__PURE__ */ jsx270("p", { className: "w-full truncate text-ods-text-primary text-h3", children: organizationName }),
30495
+ siteUrl && /* @__PURE__ */ jsx270("p", { className: "w-full truncate text-ods-text-secondary text-h4", children: displaySiteUrl(siteUrl) })
30533
30496
  ] }),
30534
- openableSite && onOpenSite && /* @__PURE__ */ jsx269(Button, { variant: "outline", size: "icon", "aria-label": "Open website", onClick: () => onOpenSite(openableSite), children: /* @__PURE__ */ jsx269(ExternalLinkIcon, { size: 24, color: "currentColor" }) })
30497
+ openableSite && onOpenSite && /* @__PURE__ */ jsx270(Button, { variant: "outline", size: "icon", "aria-label": "Open website", onClick: () => onOpenSite(openableSite), children: /* @__PURE__ */ jsx270(ExternalLinkIcon, { size: 24, color: "currentColor" }) })
30535
30498
  ] }),
30536
- /* @__PURE__ */ jsxs212("p", { className: "w-full text-ods-text-primary text-h4", children: [
30499
+ /* @__PURE__ */ jsxs213("p", { className: "w-full text-ods-text-primary text-h4", children: [
30537
30500
  "A technician from ",
30538
- /* @__PURE__ */ jsx269("span", { className: "text-ods-accent", children: organizationName }),
30501
+ /* @__PURE__ */ jsx270("span", { className: "text-ods-accent", children: organizationName }),
30539
30502
  " will be able to view your screen and control your mouse and keyboard during this session."
30540
30503
  ] }),
30541
- /* @__PURE__ */ jsxs212("div", { className: "flex w-full flex-col gap-[var(--spacing-system-xs)]", children: [
30542
- showRecordingNotice && /* @__PURE__ */ jsxs212("div", { className: "flex w-full items-center gap-[var(--spacing-system-xs)] rounded-md border border-ods-border bg-ods-bg p-[var(--spacing-system-s)]", children: [
30543
- /* @__PURE__ */ jsx269(InfoCircleIcon, { size: 24, color: "currentColor", className: "shrink-0 text-ods-accent" }),
30544
- /* @__PURE__ */ jsx269("p", { className: "min-w-0 flex-1 text-ods-text-primary text-h6", children: "This session will be recorded and available upon request." })
30504
+ /* @__PURE__ */ jsxs213("div", { className: "flex w-full flex-col gap-[var(--spacing-system-xs)]", children: [
30505
+ showRecordingNotice && /* @__PURE__ */ jsxs213("div", { className: "flex w-full items-center gap-[var(--spacing-system-xs)] rounded-md border border-ods-border bg-ods-bg p-[var(--spacing-system-s)]", children: [
30506
+ /* @__PURE__ */ jsx270(InfoCircleIcon, { size: 24, color: "currentColor", className: "shrink-0 text-ods-accent" }),
30507
+ /* @__PURE__ */ jsx270("p", { className: "min-w-0 flex-1 text-ods-text-primary text-h6", children: "This session will be recorded and available upon request." })
30545
30508
  ] }),
30546
- error ? /* @__PURE__ */ jsx269("p", { className: "w-full text-ods-text-primary text-h6", children: error }) : /* @__PURE__ */ jsx269("p", { className: "w-full text-ods-text-secondary text-h6", children: "You can end the session at any time." })
30509
+ error ? /* @__PURE__ */ jsx270("p", { className: "w-full text-ods-text-primary text-h6", children: error }) : /* @__PURE__ */ jsx270("p", { className: "w-full text-ods-text-secondary text-h6", children: "You can end the session at any time." })
30547
30510
  ] }),
30548
- /* @__PURE__ */ jsxs212("div", { className: "flex w-full items-stretch gap-[var(--spacing-system-l)]", children: [
30549
- /* @__PURE__ */ jsx269(
30511
+ /* @__PURE__ */ jsxs213("div", { className: "flex w-full items-stretch gap-[var(--spacing-system-l)]", children: [
30512
+ /* @__PURE__ */ jsx270(
30550
30513
  Button,
30551
30514
  {
30552
30515
  variant: "outline",
@@ -30557,7 +30520,7 @@ function RemoteAccessRequestCard({
30557
30520
  children: "Decline"
30558
30521
  }
30559
30522
  ),
30560
- /* @__PURE__ */ jsx269(
30523
+ /* @__PURE__ */ jsx270(
30561
30524
  Button,
30562
30525
  {
30563
30526
  variant: "accent",
@@ -30574,10 +30537,10 @@ function RemoteAccessRequestCard({
30574
30537
 
30575
30538
  // src/components/features/remote-session/remote-session-block.tsx
30576
30539
  import { forwardRef as forwardRef31 } from "react";
30577
- import { jsx as jsx270, jsxs as jsxs213 } from "react/jsx-runtime";
30540
+ import { jsx as jsx271, jsxs as jsxs214 } from "react/jsx-runtime";
30578
30541
  var RemoteSessionBlockFrame = forwardRef31(
30579
30542
  ({ children, expanded = false, onHide, className }, ref) => {
30580
- return /* @__PURE__ */ jsxs213(
30543
+ return /* @__PURE__ */ jsxs214(
30581
30544
  "div",
30582
30545
  {
30583
30546
  ref,
@@ -30588,16 +30551,16 @@ var RemoteSessionBlockFrame = forwardRef31(
30588
30551
  ),
30589
30552
  children: [
30590
30553
  children,
30591
- /* @__PURE__ */ jsxs213(
30554
+ /* @__PURE__ */ jsxs214(
30592
30555
  "button",
30593
30556
  {
30594
30557
  type: "button",
30595
30558
  className: "flex h-12 w-full shrink-0 items-center gap-[var(--spacing-system-xs)] border-t border-ods-border bg-ods-card px-[var(--spacing-system-m)]",
30596
30559
  onClick: onHide,
30597
30560
  children: [
30598
- /* @__PURE__ */ jsx270(Chevrons03RightIcon, { size: 24 }),
30599
- /* @__PURE__ */ jsx270("span", { className: "min-w-0 flex-1 truncate text-left text-ods-text-secondary text-h4", children: "Hide this Block" }),
30600
- /* @__PURE__ */ jsx270(OpenFrameLogo, { className: "size-6 shrink-0" })
30561
+ /* @__PURE__ */ jsx271(Chevrons03RightIcon, { size: 24 }),
30562
+ /* @__PURE__ */ jsx271("span", { className: "min-w-0 flex-1 truncate text-left text-ods-text-secondary text-h4", children: "Hide this Block" }),
30563
+ /* @__PURE__ */ jsx271(OpenFrameLogo, { className: "size-6 shrink-0" })
30601
30564
  ]
30602
30565
  }
30603
30566
  )
@@ -30608,12 +30571,12 @@ var RemoteSessionBlockFrame = forwardRef31(
30608
30571
  );
30609
30572
  RemoteSessionBlockFrame.displayName = "RemoteSessionBlockFrame";
30610
30573
  function RemoteSessionEndButton({ onEndSession }) {
30611
- return /* @__PURE__ */ jsx270(
30574
+ return /* @__PURE__ */ jsx271(
30612
30575
  Button,
30613
30576
  {
30614
30577
  variant: "outline",
30615
30578
  fullWidth: true,
30616
- leftIcon: /* @__PURE__ */ jsx270(MonitorOffIcon, { size: 24, color: "currentColor", className: "text-ods-error" }),
30579
+ leftIcon: /* @__PURE__ */ jsx271(MonitorOffIcon, { size: 24, color: "currentColor", className: "text-ods-error" }),
30617
30580
  onClick: onEndSession,
30618
30581
  children: "End Session"
30619
30582
  }
@@ -30623,14 +30586,15 @@ function RemoteSessionSummary({
30623
30586
  party,
30624
30587
  elapsed,
30625
30588
  showRecordingTag = false,
30589
+ viewers,
30626
30590
  onOpenChat,
30627
30591
  onEndSession,
30628
30592
  dragHandlers
30629
30593
  }) {
30630
30594
  const technician = party.technicianName;
30631
- return /* @__PURE__ */ jsxs213("div", { className: "relative flex flex-col gap-[var(--spacing-system-m)] p-[var(--spacing-system-m)]", children: [
30632
- /* @__PURE__ */ jsx270(RemoteSessionDragger, { dragHandlers }),
30633
- /* @__PURE__ */ jsxs213(
30595
+ return /* @__PURE__ */ jsxs214("div", { className: "relative flex flex-col gap-[var(--spacing-system-m)] p-[var(--spacing-system-m)]", children: [
30596
+ /* @__PURE__ */ jsx271(RemoteSessionDragger, { dragHandlers }),
30597
+ /* @__PURE__ */ jsxs214(
30634
30598
  "div",
30635
30599
  {
30636
30600
  className: cn(
@@ -30639,7 +30603,7 @@ function RemoteSessionSummary({
30639
30603
  ),
30640
30604
  ...dragHandlers,
30641
30605
  children: [
30642
- technician ? /* @__PURE__ */ jsx270(
30606
+ technician ? /* @__PURE__ */ jsx271(
30643
30607
  SquareAvatar,
30644
30608
  {
30645
30609
  variant: "round",
@@ -30647,42 +30611,42 @@ function RemoteSessionSummary({
30647
30611
  src: party.technicianAvatarUrl ?? void 0,
30648
30612
  fallback: technician
30649
30613
  }
30650
- ) : /* @__PURE__ */ jsx270(RemoteSessionOrgLogo, { name: party.organizationName, logoUrl: party.organizationLogoUrl, sizePx: 48 }),
30651
- /* @__PURE__ */ jsxs213("div", { className: "flex min-w-0 flex-1 flex-col", children: [
30652
- /* @__PURE__ */ jsxs213("p", { className: "w-full truncate text-ods-text-primary text-h4", children: [
30614
+ ) : /* @__PURE__ */ jsx271(RemoteSessionOrgLogo, { name: party.organizationName, logoUrl: party.organizationLogoUrl, sizePx: 48 }),
30615
+ /* @__PURE__ */ jsxs214("div", { className: "flex min-w-0 flex-1 flex-col", children: [
30616
+ /* @__PURE__ */ jsxs214("p", { className: "w-full truncate text-ods-text-primary text-h4", children: [
30653
30617
  technician ? `${technician} connected` : "IT support team is connected",
30654
30618
  " ",
30655
- /* @__PURE__ */ jsxs213("span", { className: "text-ods-text-secondary", children: [
30619
+ /* @__PURE__ */ jsxs214("span", { className: "text-ods-text-secondary", children: [
30656
30620
  "(",
30657
30621
  elapsed,
30658
30622
  ")"
30659
30623
  ] })
30660
30624
  ] }),
30661
- /* @__PURE__ */ jsx270("p", { className: "w-full truncate text-ods-text-secondary text-h4", children: party.organizationName })
30625
+ /* @__PURE__ */ jsx271("p", { className: "w-full truncate text-ods-text-secondary text-h4", children: party.organizationName })
30662
30626
  ] })
30663
30627
  ]
30664
30628
  }
30665
30629
  ),
30666
- showRecordingTag && /* @__PURE__ */ jsx270(RemoteSessionRecordingTag, {}),
30667
- /* @__PURE__ */ jsxs213("div", { className: "flex w-full items-stretch gap-[var(--spacing-system-m)]", children: [
30668
- /* @__PURE__ */ jsx270(
30630
+ /* @__PURE__ */ jsx271(RemoteSessionStatusRow, { showRecordingTag, viewers }),
30631
+ /* @__PURE__ */ jsxs214("div", { className: "flex w-full items-stretch gap-[var(--spacing-system-m)]", children: [
30632
+ /* @__PURE__ */ jsx271(
30669
30633
  Button,
30670
30634
  {
30671
30635
  variant: "outline",
30672
30636
  fullWidth: true,
30673
- leftIcon: /* @__PURE__ */ jsx270(ChatsIcon, { size: 24, color: "currentColor" }),
30637
+ leftIcon: /* @__PURE__ */ jsx271(ChatsIcon, { size: 24, color: "currentColor" }),
30674
30638
  onClick: onOpenChat,
30675
30639
  children: "Open Chat"
30676
30640
  }
30677
30641
  ),
30678
- /* @__PURE__ */ jsx270(RemoteSessionEndButton, { onEndSession })
30642
+ /* @__PURE__ */ jsx271(RemoteSessionEndButton, { onEndSession })
30679
30643
  ] })
30680
30644
  ] });
30681
30645
  }
30682
30646
  var RemoteSessionMinimizedChip = forwardRef31(
30683
30647
  ({ party, onExpand, dragHandlers }, ref) => {
30684
30648
  const technician = party.technicianName;
30685
- return /* @__PURE__ */ jsxs213(
30649
+ return /* @__PURE__ */ jsxs214(
30686
30650
  "button",
30687
30651
  {
30688
30652
  ref,
@@ -30695,7 +30659,7 @@ var RemoteSessionMinimizedChip = forwardRef31(
30695
30659
  onClick: onExpand,
30696
30660
  ...dragHandlers,
30697
30661
  children: [
30698
- technician ? /* @__PURE__ */ jsx270(
30662
+ technician ? /* @__PURE__ */ jsx271(
30699
30663
  SquareAvatar,
30700
30664
  {
30701
30665
  sizePx: 48,
@@ -30703,7 +30667,7 @@ var RemoteSessionMinimizedChip = forwardRef31(
30703
30667
  fallback: technician,
30704
30668
  className: "rounded-none"
30705
30669
  }
30706
- ) : /* @__PURE__ */ jsx270(
30670
+ ) : /* @__PURE__ */ jsx271(
30707
30671
  RemoteSessionOrgLogo,
30708
30672
  {
30709
30673
  name: party.organizationName,
@@ -30712,7 +30676,7 @@ var RemoteSessionMinimizedChip = forwardRef31(
30712
30676
  className: "rounded-none border-0"
30713
30677
  }
30714
30678
  ),
30715
- /* @__PURE__ */ jsx270("span", { className: "flex h-9 w-12 items-center justify-center border-t border-ods-border bg-ods-card", children: /* @__PURE__ */ jsx270(Chevrons03LeftIcon, { size: 24 }) })
30679
+ /* @__PURE__ */ jsx271("span", { className: "flex h-9 w-12 items-center justify-center border-t border-ods-border bg-ods-card", children: /* @__PURE__ */ jsx271(Chevrons03LeftIcon, { size: 24 }) })
30716
30680
  ]
30717
30681
  }
30718
30682
  );
@@ -30722,7 +30686,7 @@ RemoteSessionMinimizedChip.displayName = "RemoteSessionMinimizedChip";
30722
30686
 
30723
30687
  // src/components/features/remote-session/remote-session-chat-panel.tsx
30724
30688
  import { useEffect as useEffect46, useRef as useRef40 } from "react";
30725
- import { jsx as jsx271, jsxs as jsxs214 } from "react/jsx-runtime";
30689
+ import { jsx as jsx272, jsxs as jsxs215 } from "react/jsx-runtime";
30726
30690
  function formatTime2(at) {
30727
30691
  return at.toLocaleTimeString([], { hour: "numeric", minute: "2-digit" });
30728
30692
  }
@@ -30731,6 +30695,7 @@ function RemoteSessionChatPanel({
30731
30695
  elapsed,
30732
30696
  messages,
30733
30697
  showRecordingTag = false,
30698
+ viewers,
30734
30699
  draft,
30735
30700
  onDraftChange,
30736
30701
  onSend,
@@ -30751,10 +30716,10 @@ function RemoteSessionChatPanel({
30751
30716
  onSend(text);
30752
30717
  onDraftChange("");
30753
30718
  };
30754
- return /* @__PURE__ */ jsxs214("div", { className: "flex min-h-0 flex-1 flex-col", children: [
30755
- /* @__PURE__ */ jsxs214("div", { className: "relative flex flex-col gap-[var(--spacing-system-m)] p-[var(--spacing-system-m)]", children: [
30756
- /* @__PURE__ */ jsx271(RemoteSessionDragger, { dragHandlers }),
30757
- /* @__PURE__ */ jsxs214(
30719
+ return /* @__PURE__ */ jsxs215("div", { className: "flex min-h-0 flex-1 flex-col", children: [
30720
+ /* @__PURE__ */ jsxs215("div", { className: "relative flex flex-col gap-[var(--spacing-system-m)] p-[var(--spacing-system-m)]", children: [
30721
+ /* @__PURE__ */ jsx272(RemoteSessionDragger, { dragHandlers }),
30722
+ /* @__PURE__ */ jsxs215(
30758
30723
  "div",
30759
30724
  {
30760
30725
  className: cn(
@@ -30763,45 +30728,45 @@ function RemoteSessionChatPanel({
30763
30728
  ),
30764
30729
  ...dragHandlers,
30765
30730
  children: [
30766
- /* @__PURE__ */ jsxs214("p", { className: "w-full truncate text-ods-text-primary text-h4", children: [
30731
+ /* @__PURE__ */ jsxs215("p", { className: "w-full truncate text-ods-text-primary text-h4", children: [
30767
30732
  "Your IT support team is connected ",
30768
- /* @__PURE__ */ jsxs214("span", { className: "text-ods-text-secondary", children: [
30733
+ /* @__PURE__ */ jsxs215("span", { className: "text-ods-text-secondary", children: [
30769
30734
  "(",
30770
30735
  elapsed,
30771
30736
  ")"
30772
30737
  ] })
30773
30738
  ] }),
30774
- /* @__PURE__ */ jsx271("p", { className: "w-full truncate text-ods-text-secondary text-h4", children: "You can end this session at any time" })
30739
+ /* @__PURE__ */ jsx272("p", { className: "w-full truncate text-ods-text-secondary text-h4", children: "You can end this session at any time" })
30775
30740
  ]
30776
30741
  }
30777
30742
  ),
30778
- showRecordingTag && /* @__PURE__ */ jsx271(RemoteSessionRecordingTag, {}),
30779
- /* @__PURE__ */ jsxs214("div", { className: "flex w-full items-stretch gap-[var(--spacing-system-m)]", children: [
30780
- /* @__PURE__ */ jsx271(
30743
+ /* @__PURE__ */ jsx272(RemoteSessionStatusRow, { showRecordingTag, viewers }),
30744
+ /* @__PURE__ */ jsxs215("div", { className: "flex w-full items-stretch gap-[var(--spacing-system-m)]", children: [
30745
+ /* @__PURE__ */ jsx272(
30781
30746
  Button,
30782
30747
  {
30783
30748
  variant: "outline",
30784
30749
  fullWidth: true,
30785
- leftIcon: /* @__PURE__ */ jsx271(MessageOffIcon, { size: 24, color: "currentColor" }),
30750
+ leftIcon: /* @__PURE__ */ jsx272(MessageOffIcon, { size: 24, color: "currentColor" }),
30786
30751
  onClick: onCloseChat,
30787
30752
  children: "Close Chat"
30788
30753
  }
30789
30754
  ),
30790
- /* @__PURE__ */ jsx271(RemoteSessionEndButton, { onEndSession })
30755
+ /* @__PURE__ */ jsx272(RemoteSessionEndButton, { onEndSession })
30791
30756
  ] })
30792
30757
  ] }),
30793
- /* @__PURE__ */ jsx271(
30758
+ /* @__PURE__ */ jsx272(
30794
30759
  "div",
30795
30760
  {
30796
30761
  ref: listRef,
30797
30762
  className: "flex min-h-0 flex-1 flex-col overflow-y-auto bg-ods-card p-[var(--spacing-system-m)]",
30798
- children: /* @__PURE__ */ jsx271("div", { className: "mt-auto flex flex-col gap-[var(--spacing-system-s)]", children: messages.map(
30799
- (message) => message.author === "system" ? /* @__PURE__ */ jsx271("p", { className: "w-full text-center text-ods-text-secondary text-h6", children: message.text }, message.id) : /* @__PURE__ */ jsx271(RemoteSessionChatMessageRow, { message, party }, message.id)
30763
+ children: /* @__PURE__ */ jsx272("div", { className: "mt-auto flex flex-col gap-[var(--spacing-system-s)]", children: messages.map(
30764
+ (message) => message.author === "system" ? /* @__PURE__ */ jsx272("p", { className: "w-full text-center text-ods-text-secondary text-h6", children: message.text }, message.id) : /* @__PURE__ */ jsx272(RemoteSessionChatMessageRow, { message, party }, message.id)
30800
30765
  ) })
30801
30766
  }
30802
30767
  ),
30803
- error && /* @__PURE__ */ jsx271("p", { className: "bg-ods-card px-[var(--spacing-system-m)] text-ods-error text-h6", children: error }),
30804
- /* @__PURE__ */ jsxs214(
30768
+ error && /* @__PURE__ */ jsx272("p", { className: "bg-ods-card px-[var(--spacing-system-m)] text-ods-error text-h6", children: error }),
30769
+ /* @__PURE__ */ jsxs215(
30805
30770
  "form",
30806
30771
  {
30807
30772
  className: "flex items-center gap-[var(--spacing-system-xs)] bg-ods-card px-[var(--spacing-system-m)] pb-[var(--spacing-system-m)]",
@@ -30810,7 +30775,7 @@ function RemoteSessionChatPanel({
30810
30775
  handleSend();
30811
30776
  },
30812
30777
  children: [
30813
- /* @__PURE__ */ jsx271(
30778
+ /* @__PURE__ */ jsx272(
30814
30779
  "input",
30815
30780
  {
30816
30781
  value: draft,
@@ -30821,14 +30786,14 @@ function RemoteSessionChatPanel({
30821
30786
  className: "h-12 min-w-0 flex-1 rounded-md border border-ods-border bg-ods-bg px-[var(--spacing-system-s)] text-ods-text-primary outline-none text-h6 placeholder:text-ods-text-secondary"
30822
30787
  }
30823
30788
  ),
30824
- /* @__PURE__ */ jsx271(
30789
+ /* @__PURE__ */ jsx272(
30825
30790
  "button",
30826
30791
  {
30827
30792
  type: "submit",
30828
30793
  "aria-label": "Send message",
30829
30794
  disabled: !ready,
30830
30795
  className: "flex size-12 shrink-0 items-center justify-center",
30831
- children: /* @__PURE__ */ jsx271(Send03Icon, { size: 24, color: "currentColor", className: "text-ods-text-primary" })
30796
+ children: /* @__PURE__ */ jsx272(Send03Icon, { size: 24, color: "currentColor", className: "text-ods-text-primary" })
30832
30797
  }
30833
30798
  )
30834
30799
  ]
@@ -30842,9 +30807,9 @@ function RemoteSessionChatMessageRow({
30842
30807
  }) {
30843
30808
  const isTechnician = message.author === "technician";
30844
30809
  const technician = message.name ?? party.technicianName ?? "Technician";
30845
- return /* @__PURE__ */ jsxs214("div", { className: "flex w-full flex-col", children: [
30846
- /* @__PURE__ */ jsxs214("div", { className: "flex w-full items-center gap-[var(--spacing-system-xs)]", children: [
30847
- isTechnician && /* @__PURE__ */ jsx271(
30810
+ return /* @__PURE__ */ jsxs215("div", { className: "flex w-full flex-col", children: [
30811
+ /* @__PURE__ */ jsxs215("div", { className: "flex w-full items-center gap-[var(--spacing-system-xs)]", children: [
30812
+ isTechnician && /* @__PURE__ */ jsx272(
30848
30813
  SquareAvatar,
30849
30814
  {
30850
30815
  variant: "round",
@@ -30853,7 +30818,7 @@ function RemoteSessionChatMessageRow({
30853
30818
  fallback: technician
30854
30819
  }
30855
30820
  ),
30856
- /* @__PURE__ */ jsx271(
30821
+ /* @__PURE__ */ jsx272(
30857
30822
  "span",
30858
30823
  {
30859
30824
  className: cn(
@@ -30863,14 +30828,14 @@ function RemoteSessionChatMessageRow({
30863
30828
  children: isTechnician ? technician : "User"
30864
30829
  }
30865
30830
  ),
30866
- /* @__PURE__ */ jsx271("span", { className: "shrink-0 text-ods-text-secondary text-h6", children: formatTime2(message.at) })
30831
+ /* @__PURE__ */ jsx272("span", { className: "shrink-0 text-ods-text-secondary text-h6", children: formatTime2(message.at) })
30867
30832
  ] }),
30868
- /* @__PURE__ */ jsx271("p", { className: "w-full break-words text-ods-text-primary text-h6", children: message.text })
30833
+ /* @__PURE__ */ jsx272("p", { className: "w-full break-words text-ods-text-primary text-h6", children: message.text })
30869
30834
  ] });
30870
30835
  }
30871
30836
 
30872
30837
  // src/components/features/remote-session/remote-session-dialog.tsx
30873
- import { jsx as jsx272, jsxs as jsxs215 } from "react/jsx-runtime";
30838
+ import { jsx as jsx273, jsxs as jsxs216 } from "react/jsx-runtime";
30874
30839
  var NOTICE_COPY = {
30875
30840
  "session-ended": { title: "Remote session ended", suffix: "has disconnected from your device." },
30876
30841
  "connection-lost": { title: "Connection lost", suffix: "lost the connection to your device." }
@@ -30883,49 +30848,315 @@ function RemoteSessionDialog({
30883
30848
  onClose
30884
30849
  }) {
30885
30850
  if (variant === "end-confirm") {
30886
- return /* @__PURE__ */ jsxs215(DialogCard, { children: [
30887
- /* @__PURE__ */ jsxs215("div", { className: "flex w-full flex-col gap-[var(--spacing-system-xs)]", children: [
30888
- /* @__PURE__ */ jsx272("h1", { className: "w-full text-ods-text-primary text-h2", children: "End remote session?" }),
30889
- /* @__PURE__ */ jsx272("p", { className: "w-full text-ods-text-primary text-h4", children: "The technician will lose access to your device immediately." })
30851
+ return /* @__PURE__ */ jsxs216(DialogCard, { children: [
30852
+ /* @__PURE__ */ jsxs216("div", { className: "flex w-full flex-col gap-[var(--spacing-system-xs)]", children: [
30853
+ /* @__PURE__ */ jsx273("h1", { className: "w-full text-ods-text-primary text-h2", children: "End remote session?" }),
30854
+ /* @__PURE__ */ jsx273("p", { className: "w-full text-ods-text-primary text-h4", children: "The technician will lose access to your device immediately." })
30890
30855
  ] }),
30891
- /* @__PURE__ */ jsxs215("div", { className: "flex w-full items-stretch gap-[var(--spacing-system-l)]", children: [
30892
- /* @__PURE__ */ jsx272(Button, { variant: "outline", fullWidth: true, disabled: ending, onClick: onClose, children: "Cancel" }),
30893
- /* @__PURE__ */ jsx272(Button, { variant: "destructive", fullWidth: true, loading: ending, onClick: onEndSession, children: "End Session" })
30856
+ /* @__PURE__ */ jsxs216("div", { className: "flex w-full items-stretch gap-[var(--spacing-system-l)]", children: [
30857
+ /* @__PURE__ */ jsx273(Button, { variant: "outline", fullWidth: true, disabled: ending, onClick: onClose, children: "Cancel" }),
30858
+ /* @__PURE__ */ jsx273(Button, { variant: "destructive", fullWidth: true, loading: ending, onClick: onEndSession, children: "End Session" })
30894
30859
  ] })
30895
30860
  ] });
30896
30861
  }
30897
30862
  const copy = NOTICE_COPY[variant];
30898
- return /* @__PURE__ */ jsxs215(DialogCard, { children: [
30899
- /* @__PURE__ */ jsxs215("div", { className: "flex w-full flex-col gap-[var(--spacing-system-xs)]", children: [
30900
- /* @__PURE__ */ jsx272("h1", { className: "w-full text-ods-text-primary text-h2", children: copy.title }),
30901
- /* @__PURE__ */ jsxs215("p", { className: "w-full text-ods-text-primary text-h4", children: [
30902
- /* @__PURE__ */ jsx272("span", { className: "text-ods-accent", children: organizationName }),
30863
+ return /* @__PURE__ */ jsxs216(DialogCard, { children: [
30864
+ /* @__PURE__ */ jsxs216("div", { className: "flex w-full flex-col gap-[var(--spacing-system-xs)]", children: [
30865
+ /* @__PURE__ */ jsx273("h1", { className: "w-full text-ods-text-primary text-h2", children: copy.title }),
30866
+ /* @__PURE__ */ jsxs216("p", { className: "w-full text-ods-text-primary text-h4", children: [
30867
+ /* @__PURE__ */ jsx273("span", { className: "text-ods-accent", children: organizationName }),
30903
30868
  " ",
30904
30869
  copy.suffix
30905
30870
  ] })
30906
30871
  ] }),
30907
- /* @__PURE__ */ jsx272("div", { className: "flex w-full justify-end", children: /* @__PURE__ */ jsx272(Button, { variant: "outline", className: "w-1/2", onClick: onClose, children: "Close" }) })
30872
+ /* @__PURE__ */ jsx273("div", { className: "flex w-full justify-end", children: /* @__PURE__ */ jsx273(Button, { variant: "outline", className: "w-1/2", onClick: onClose, children: "Close" }) })
30908
30873
  ] });
30909
30874
  }
30910
30875
  function DialogCard({ children }) {
30911
- return /* @__PURE__ */ jsx272("div", { className: "flex w-full flex-col gap-[var(--spacing-system-l)] rounded-md border border-ods-border bg-ods-card p-[var(--spacing-system-xl)]", children });
30876
+ return /* @__PURE__ */ jsx273("div", { className: "flex w-full flex-col gap-[var(--spacing-system-l)] rounded-md border border-ods-border bg-ods-card p-[var(--spacing-system-xl)]", children });
30912
30877
  }
30913
30878
 
30914
30879
  // src/components/features/remote-session/remote-session-overlay.tsx
30915
- import { jsx as jsx273, jsxs as jsxs216 } from "react/jsx-runtime";
30880
+ import { jsx as jsx274, jsxs as jsxs217 } from "react/jsx-runtime";
30916
30881
  function RemoteSessionBorder({ className }) {
30917
- return /* @__PURE__ */ jsx273("div", { className: cn("pointer-events-none size-full border-4 border-ods-warning", className) });
30882
+ return /* @__PURE__ */ jsx274("div", { className: cn("pointer-events-none size-full border-4 border-ods-warning", className) });
30918
30883
  }
30919
30884
  function RemoteSessionPill({ onEndSession }) {
30920
- return /* @__PURE__ */ jsxs216(
30885
+ return /* @__PURE__ */ jsxs217(
30921
30886
  "button",
30922
30887
  {
30923
30888
  type: "button",
30924
30889
  className: "flex items-center gap-[var(--spacing-system-xsf)] rounded-b-md bg-ods-warning px-[var(--spacing-system-m)] py-[var(--spacing-system-xs)] text-ods-text-on-accent",
30925
30890
  onClick: onEndSession,
30926
30891
  children: [
30927
- /* @__PURE__ */ jsx273(MonitorOffIcon, { size: 24, color: "currentColor" }),
30928
- /* @__PURE__ */ jsx273("span", { className: "whitespace-nowrap text-h3", children: "End Session" })
30892
+ /* @__PURE__ */ jsx274(MonitorOffIcon, { size: 24, color: "currentColor" }),
30893
+ /* @__PURE__ */ jsx274("span", { className: "whitespace-nowrap text-h3", children: "End Session" })
30894
+ ]
30895
+ }
30896
+ );
30897
+ }
30898
+
30899
+ // src/components/features/remote-session/remote-session-keep-modals.tsx
30900
+ import { useState as useState79 } from "react";
30901
+ import { jsx as jsx275, jsxs as jsxs218 } from "react/jsx-runtime";
30902
+ var REMOTE_SESSION_KEEP_REASON_LABELS = {
30903
+ CLIENT_DISPUTE: "Client dispute",
30904
+ INTERNAL_REVIEW: "Internal review",
30905
+ LEGAL_OR_COMPLIANCE: "Legal or compliance request",
30906
+ OTHER: "Other"
30907
+ };
30908
+ var KEEP_REASONS = Object.keys(REMOTE_SESSION_KEEP_REASON_LABELS);
30909
+ var DESCRIPTION_MAX_LENGTH = 500;
30910
+ function KeepNotice({ icon, title, children }) {
30911
+ return /* @__PURE__ */ jsxs218("div", { className: "flex w-full items-start gap-[var(--spacing-system-m)] rounded-md border border-ods-border bg-ods-card p-[var(--spacing-system-m)]", children: [
30912
+ /* @__PURE__ */ jsx275("span", { className: "flex shrink-0 text-ods-text-secondary", children: icon }),
30913
+ /* @__PURE__ */ jsxs218("div", { className: "flex min-w-0 flex-1 flex-col", children: [
30914
+ /* @__PURE__ */ jsx275("p", { className: "text-ods-text-primary text-h3", children: title }),
30915
+ /* @__PURE__ */ jsx275("p", { className: "text-ods-text-secondary text-h4", children })
30916
+ ] })
30917
+ ] });
30918
+ }
30919
+ function KeepRecordingModal({
30920
+ isOpen,
30921
+ onClose,
30922
+ keptUsage,
30923
+ isPending = false,
30924
+ onConfirm
30925
+ }) {
30926
+ const [reason, setReason] = useState79("");
30927
+ const [description, setDescription] = useState79("");
30928
+ const [seededOpen, setSeededOpen] = useState79(isOpen);
30929
+ if (seededOpen !== isOpen) {
30930
+ setSeededOpen(isOpen);
30931
+ if (isOpen) {
30932
+ setReason("");
30933
+ setDescription("");
30934
+ }
30935
+ }
30936
+ const trimmed = description.trim();
30937
+ const canKeep = reason !== "" && (reason !== "OTHER" || trimmed !== "");
30938
+ const handleKeep = () => {
30939
+ if (!canKeep || isPending) return;
30940
+ onConfirm({ reason, description: reason === "OTHER" ? trimmed : null });
30941
+ };
30942
+ return /* @__PURE__ */ jsxs218(Modal, { isOpen, onClose: isPending ? () => {
30943
+ } : onClose, className: "text-left md:max-w-[600px]", children: [
30944
+ /* @__PURE__ */ jsx275(ModalHeader, { children: /* @__PURE__ */ jsx275(ModalTitle, { children: "Keep this recording" }) }),
30945
+ /* @__PURE__ */ jsxs218(
30946
+ KeepNotice,
30947
+ {
30948
+ icon: /* @__PURE__ */ jsx275(InfoCircleIcon, { size: 24, color: "currentColor" }),
30949
+ title: "This recording won't be deleted automatically",
30950
+ children: [
30951
+ "It stays until you stop keeping it. Kept recordings use ",
30952
+ keptUsage,
30953
+ "."
30954
+ ]
30955
+ }
30956
+ ),
30957
+ /* @__PURE__ */ jsxs218("div", { className: "flex w-full flex-col gap-[var(--spacing-system-xs)]", children: [
30958
+ /* @__PURE__ */ jsxs218(
30959
+ Select,
30960
+ {
30961
+ value: reason,
30962
+ onValueChange: (value) => setReason(value),
30963
+ disabled: isPending,
30964
+ children: [
30965
+ /* @__PURE__ */ jsx275(SelectTrigger, { label: "Reason", labelVariant: "large", children: /* @__PURE__ */ jsx275(SelectValue, { placeholder: "Select Reason" }) }),
30966
+ /* @__PURE__ */ jsx275(SelectContent, { children: KEEP_REASONS.map((value) => /* @__PURE__ */ jsx275(SelectItem, { value, children: REMOTE_SESSION_KEEP_REASON_LABELS[value] }, value)) })
30967
+ ]
30968
+ }
30969
+ ),
30970
+ reason === "OTHER" && /* @__PURE__ */ jsx275(
30971
+ Input,
30972
+ {
30973
+ "aria-label": "Reason description",
30974
+ value: description,
30975
+ onChange: (event) => setDescription(event.target.value),
30976
+ placeholder: "Briefly describe what's going on",
30977
+ maxLength: DESCRIPTION_MAX_LENGTH,
30978
+ disabled: isPending
30979
+ }
30980
+ )
30981
+ ] }),
30982
+ /* @__PURE__ */ jsxs218(ModalFooter, { children: [
30983
+ /* @__PURE__ */ jsx275(Button, { type: "button", variant: "outline", onClick: onClose, disabled: isPending, className: "flex-1 md:hidden", children: "Cancel" }),
30984
+ /* @__PURE__ */ jsx275("div", { className: "hidden flex-1 md:block" }),
30985
+ /* @__PURE__ */ jsx275(
30986
+ Button,
30987
+ {
30988
+ type: "button",
30989
+ variant: "accent",
30990
+ onClick: handleKeep,
30991
+ loading: isPending,
30992
+ disabled: !canKeep,
30993
+ className: "flex-1",
30994
+ children: "Keep"
30995
+ }
30996
+ )
30997
+ ] })
30998
+ ] });
30999
+ }
31000
+ function ReleaseKeepingModal({
31001
+ isOpen,
31002
+ onClose,
31003
+ keptBy,
31004
+ keptOn,
31005
+ reason,
31006
+ ticket,
31007
+ expiresOn,
31008
+ dueOn,
31009
+ isPending = false,
31010
+ onConfirm
31011
+ }) {
31012
+ return /* @__PURE__ */ jsxs218(Modal, { isOpen, onClose: isPending ? () => {
31013
+ } : onClose, className: "text-left md:max-w-[600px]", children: [
31014
+ /* @__PURE__ */ jsx275(ModalHeader, { children: /* @__PURE__ */ jsx275(ModalTitle, { children: "Release Keeping" }) }),
31015
+ /* @__PURE__ */ jsxs218("div", { className: "flex w-full flex-col gap-[var(--spacing-system-xsf)] text-ods-text-primary text-h4", children: [
31016
+ /* @__PURE__ */ jsxs218("p", { children: [
31017
+ "Kept by ",
31018
+ keptBy,
31019
+ " on ",
31020
+ keptOn,
31021
+ " for ",
31022
+ reason,
31023
+ "."
31024
+ ] }),
31025
+ ticket && /* @__PURE__ */ jsxs218("p", { children: [
31026
+ "Ticket: ",
31027
+ ticket
31028
+ ] })
31029
+ ] }),
31030
+ /* @__PURE__ */ jsx275(KeepNotice, { icon: /* @__PURE__ */ jsx275(HourglassIcon, { size: 24, color: "currentColor" }), title: `It will expire on ${expiresOn}`, children: dueOn ? `It was due to expire on ${dueOn}. Releasing gives it 3 days' grace, and it shows amber until then. Whoever placed the Keep is reminded the day before it goes. Nothing is deleted now.` : "Nothing is deleted now." }),
31031
+ /* @__PURE__ */ jsxs218(ModalFooter, { children: [
31032
+ /* @__PURE__ */ jsx275(Button, { type: "button", variant: "outline", onClick: onClose, disabled: isPending, className: "flex-1 md:hidden", children: "Cancel" }),
31033
+ /* @__PURE__ */ jsx275("div", { className: "hidden flex-1 md:block" }),
31034
+ /* @__PURE__ */ jsx275(Button, { type: "button", variant: "accent", onClick: onConfirm, loading: isPending, className: "flex-1", children: "Release Keeping" })
31035
+ ] })
31036
+ ] });
31037
+ }
31038
+
31039
+ // src/components/features/remote-session/remote-session-events.tsx
31040
+ import { jsx as jsx276, jsxs as jsxs219 } from "react/jsx-runtime";
31041
+ function formatRemoteSessionOffset(offsetMs) {
31042
+ const total = Math.max(0, Math.floor(offsetMs / 1e3));
31043
+ const hours = Math.floor(total / 3600);
31044
+ const minutes = String(Math.floor(total % 3600 / 60)).padStart(2, "0");
31045
+ const seconds = String(total % 60).padStart(2, "0");
31046
+ return hours > 0 ? `${hours}:${minutes}:${seconds}` : `${minutes}:${seconds}`;
31047
+ }
31048
+ function RemoteSessionEventList({ events, activeEventId, onSelect, className }) {
31049
+ return /* @__PURE__ */ jsxs219("section", { className: cn("flex w-full flex-col gap-[var(--spacing-system-xxs)]", className), children: [
31050
+ /* @__PURE__ */ jsx276("h2", { className: "text-ods-text-secondary text-h5", children: "Session Events" }),
31051
+ /* @__PURE__ */ jsx276("ol", { className: "flex w-full flex-col gap-[var(--spacing-system-xxs)] rounded-md border border-ods-border bg-ods-card p-[var(--spacing-system-m)]", children: events.map((event) => /* @__PURE__ */ jsx276("li", { children: /* @__PURE__ */ jsxs219(
31052
+ "button",
31053
+ {
31054
+ type: "button",
31055
+ "aria-current": event.id === activeEventId || void 0,
31056
+ onClick: () => onSelect?.(event),
31057
+ className: cn(
31058
+ "flex w-full items-start gap-[var(--spacing-system-xxs)] rounded-md p-[var(--spacing-system-xxs)] text-left outline-none transition-colors",
31059
+ "hover:bg-ods-bg-hover focus-visible:ring-2 focus-visible:ring-ods-focus",
31060
+ event.id === activeEventId && "bg-ods-border hover:bg-ods-border"
31061
+ ),
31062
+ children: [
31063
+ /* @__PURE__ */ jsx276("span", { className: "w-[84px] shrink-0 text-ods-text-secondary text-h4", children: formatRemoteSessionOffset(event.offsetMs) }),
31064
+ /* @__PURE__ */ jsxs219("span", { className: "flex min-w-0 flex-1 flex-col", children: [
31065
+ /* @__PURE__ */ jsx276("span", { className: "text-ods-text-primary text-h4", children: event.title }),
31066
+ event.detail && /* @__PURE__ */ jsx276("span", { className: "text-ods-text-secondary text-h6", children: event.detail })
31067
+ ] })
31068
+ ]
31069
+ }
31070
+ ) }, event.id)) })
31071
+ ] });
31072
+ }
31073
+ function RemoteSessionTimelineMarkers({
31074
+ events,
31075
+ durationMs,
31076
+ onSelect,
31077
+ className
31078
+ }) {
31079
+ if (durationMs <= 0) return null;
31080
+ return /* @__PURE__ */ jsx276("div", { className: cn("relative h-4 w-full", className), children: events.map((event) => {
31081
+ const share = Math.min(1, Math.max(0, event.offsetMs / durationMs));
31082
+ const label = `${event.title} at ${formatRemoteSessionOffset(event.offsetMs)}`;
31083
+ return /* @__PURE__ */ jsx276(
31084
+ "button",
31085
+ {
31086
+ type: "button",
31087
+ "aria-label": label,
31088
+ title: label,
31089
+ onClick: () => onSelect?.(event),
31090
+ style: { left: `${share * 100}%` },
31091
+ className: "absolute top-0 h-4 w-1 -translate-x-1/2 rounded-md bg-ods-text-secondary outline-none transition-colors hover:bg-ods-text-primary focus-visible:ring-2 focus-visible:ring-ods-focus"
31092
+ },
31093
+ event.id
31094
+ );
31095
+ }) });
31096
+ }
31097
+
31098
+ // src/components/features/remote-session/remote-session-status.tsx
31099
+ import { jsx as jsx277, jsxs as jsxs220 } from "react/jsx-runtime";
31100
+ function LiveDot() {
31101
+ return /* @__PURE__ */ jsx277("span", { "aria-hidden": true, className: "size-2 animate-live-pulse rounded-full bg-current motion-reduce:animate-none" });
31102
+ }
31103
+ var STATUS_TAG = {
31104
+ live: { label: "Live", variant: "critical" },
31105
+ processing: { label: "Processing", variant: "warning" },
31106
+ failed: { label: "Failed", variant: "error" }
31107
+ };
31108
+ function RemoteSessionStatusTag({ status, className }) {
31109
+ const { label, variant } = STATUS_TAG[status];
31110
+ return /* @__PURE__ */ jsx277(
31111
+ Tag,
31112
+ {
31113
+ label,
31114
+ variant,
31115
+ icon: status === "live" ? /* @__PURE__ */ jsx277(LiveDot, {}) : void 0,
31116
+ className: cn("pointer-events-none shrink-0", className)
31117
+ }
31118
+ );
31119
+ }
31120
+ function RemoteSessionExpiry(props) {
31121
+ const { className } = props;
31122
+ if (props.state === "none") {
31123
+ return /* @__PURE__ */ jsx277("p", { className: cn("text-ods-text-primary text-h4", className), children: "-" });
31124
+ }
31125
+ if (props.state === "expired") {
31126
+ return /* @__PURE__ */ jsx277("p", { className: cn("text-ods-text-secondary text-h4", className), children: "Expired" });
31127
+ }
31128
+ if (props.state === "kept") {
31129
+ return /* @__PURE__ */ jsxs220("div", { className: cn("flex min-w-0 flex-col", className), children: [
31130
+ /* @__PURE__ */ jsxs220("p", { className: "flex items-center gap-[var(--spacing-system-xxs)] text-ods-text-primary text-h4", children: [
31131
+ /* @__PURE__ */ jsx277(LockIcon, { size: 24, color: "currentColor", className: "shrink-0" }),
31132
+ "Kept"
31133
+ ] }),
31134
+ /* @__PURE__ */ jsxs220("p", { className: "truncate text-ods-text-secondary text-h6", children: [
31135
+ "Kept by ",
31136
+ props.keptBy,
31137
+ " \xB7 ",
31138
+ props.reason
31139
+ ] })
31140
+ ] });
31141
+ }
31142
+ return /* @__PURE__ */ jsxs220("div", { className: cn("flex min-w-0 flex-col", className), children: [
31143
+ /* @__PURE__ */ jsx277("p", { className: "text-ods-text-primary text-h4", children: props.date }),
31144
+ props.remaining && /* @__PURE__ */ jsx277("p", { className: "truncate text-ods-text-secondary text-h6", children: props.remaining })
31145
+ ] });
31146
+ }
31147
+ function RemoteSessionStorageAlert({ scope, capacity, className }) {
31148
+ const message = scope === "session" ? "This session isn't being recorded. Recording storage is full. New sessions aren't recorded until space is freed." : `Recording storage full. New sessions aren't recorded.${capacity ? ` All ${capacity} of recording storage is used.` : ""}`;
31149
+ return /* @__PURE__ */ jsxs220(
31150
+ "div",
31151
+ {
31152
+ role: "alert",
31153
+ className: cn(
31154
+ "flex w-full items-start gap-[var(--spacing-system-m)] rounded-md bg-ods-warning-secondary p-[var(--spacing-system-s)] text-ods-warning",
31155
+ className
31156
+ ),
31157
+ children: [
31158
+ /* @__PURE__ */ jsx277(AlertTriangleIcon, { size: 24, color: "currentColor", className: "shrink-0" }),
31159
+ /* @__PURE__ */ jsx277("p", { className: "min-w-0 flex-1 text-h3", children: message })
30929
31160
  ]
30930
31161
  }
30931
31162
  );
@@ -30935,7 +31166,7 @@ function RemoteSessionPill({ onEndSession }) {
30935
31166
  import { combine as combine3 } from "@atlaskit/pragmatic-drag-and-drop/combine";
30936
31167
  import { monitorForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
30937
31168
  import { preventUnhandled } from "@atlaskit/pragmatic-drag-and-drop/utils/prevent-unhandled";
30938
- import { Fragment as Fragment50, useCallback as useCallback29, useEffect as useEffect50, useMemo as useMemo25, useRef as useRef45, useState as useState82 } from "react";
31169
+ import { Fragment as Fragment50, useCallback as useCallback29, useEffect as useEffect50, useMemo as useMemo25, useRef as useRef45, useState as useState84 } from "react";
30939
31170
  import { createPortal } from "react-dom";
30940
31171
 
30941
31172
  // src/utils/auto-scroll-ancestors.ts
@@ -31048,10 +31279,10 @@ function aimToChange(columns, ticketId, aim) {
31048
31279
  // src/components/features/board/board-column.tsx
31049
31280
  import { attachClosestEdge as attachClosestEdge2 } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
31050
31281
  import { dropTargetForElements as dropTargetForElements2 } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
31051
- import { memo as memo6, useCallback as useCallback27, useEffect as useEffect48, useRef as useRef43, useState as useState80 } from "react";
31282
+ import { memo as memo6, useCallback as useCallback27, useEffect as useEffect48, useRef as useRef43, useState as useState82 } from "react";
31052
31283
 
31053
31284
  // src/components/features/board/board-column-header.tsx
31054
- import { jsx as jsx274, jsxs as jsxs217 } from "react/jsx-runtime";
31285
+ import { jsx as jsx278, jsxs as jsxs221 } from "react/jsx-runtime";
31055
31286
  function BoardColumnHeader({
31056
31287
  column,
31057
31288
  collapsed = false,
@@ -31064,8 +31295,8 @@ function BoardColumnHeader({
31064
31295
  const useStatusVariant = resolveTicketStatus(tagStatus) !== null;
31065
31296
  const actionClass = "h-8 w-8 p-0 md:h-8 md:w-8";
31066
31297
  if (collapsed) {
31067
- return /* @__PURE__ */ jsxs217("div", { className: "flex h-full flex-col items-center gap-[var(--spacing-system-xsf)]", children: [
31068
- onToggleCollapse && /* @__PURE__ */ jsx274(
31298
+ return /* @__PURE__ */ jsxs221("div", { className: "flex h-full flex-col items-center gap-[var(--spacing-system-xsf)]", children: [
31299
+ onToggleCollapse && /* @__PURE__ */ jsx278(
31069
31300
  Button,
31070
31301
  {
31071
31302
  variant: "transparent",
@@ -31073,10 +31304,10 @@ function BoardColumnHeader({
31073
31304
  className: actionClass,
31074
31305
  onClick: onToggleCollapse,
31075
31306
  "aria-label": "Expand column",
31076
- children: /* @__PURE__ */ jsx274(Arrow02RightIcon, { className: "h-6 w-6 text-ods-text-secondary" })
31307
+ children: /* @__PURE__ */ jsx278(Arrow02RightIcon, { className: "h-6 w-6 text-ods-text-secondary" })
31077
31308
  }
31078
31309
  ),
31079
- /* @__PURE__ */ jsx274(
31310
+ /* @__PURE__ */ jsx278(
31080
31311
  TicketStatusTag,
31081
31312
  {
31082
31313
  status: tagStatus,
@@ -31085,17 +31316,17 @@ function BoardColumnHeader({
31085
31316
  className: "h-auto [writing-mode:vertical-rl]"
31086
31317
  }
31087
31318
  ),
31088
- /* @__PURE__ */ jsx274("span", { className: "text-h5", style: { color: column.color }, children: count })
31319
+ /* @__PURE__ */ jsx278("span", { className: "text-h5", style: { color: column.color }, children: count })
31089
31320
  ] });
31090
31321
  }
31091
- return /* @__PURE__ */ jsxs217("div", { className: "flex items-center gap-[var(--spacing-system-xsf)]", children: [
31092
- /* @__PURE__ */ jsxs217("div", { className: "flex min-w-0 flex-1 items-center gap-[var(--spacing-system-xsf)]", children: [
31093
- /* @__PURE__ */ jsx274(TicketStatusTag, { status: tagStatus, label: column.label, color: useStatusVariant ? void 0 : column.color }),
31094
- /* @__PURE__ */ jsx274("span", { className: "text-h5", style: useStatusVariant ? void 0 : { color: column.color }, children: count })
31322
+ return /* @__PURE__ */ jsxs221("div", { className: "flex items-center gap-[var(--spacing-system-xsf)]", children: [
31323
+ /* @__PURE__ */ jsxs221("div", { className: "flex min-w-0 flex-1 items-center gap-[var(--spacing-system-xsf)]", children: [
31324
+ /* @__PURE__ */ jsx278(TicketStatusTag, { status: tagStatus, label: column.label, color: useStatusVariant ? void 0 : column.color }),
31325
+ /* @__PURE__ */ jsx278("span", { className: "text-h5", style: useStatusVariant ? void 0 : { color: column.color }, children: count })
31095
31326
  ] }),
31096
- /* @__PURE__ */ jsxs217("div", { className: "flex shrink-0 items-center gap-[var(--spacing-system-xxs)]", children: [
31097
- column.tooltip && /* @__PURE__ */ jsx274(TouchFriendlyTooltip, { content: column.tooltip, side: "bottom", children: /* @__PURE__ */ jsx274(Button, { variant: "transparent", size: "icon", className: actionClass, "aria-label": column.tooltip, children: /* @__PURE__ */ jsx274(InfoCircleIcon, { className: "h-6 w-6 text-ods-text-secondary" }) }) }),
31098
- onToggleCollapse && /* @__PURE__ */ jsx274(
31327
+ /* @__PURE__ */ jsxs221("div", { className: "flex shrink-0 items-center gap-[var(--spacing-system-xxs)]", children: [
31328
+ column.tooltip && /* @__PURE__ */ jsx278(TouchFriendlyTooltip, { content: column.tooltip, side: "bottom", children: /* @__PURE__ */ jsx278(Button, { variant: "transparent", size: "icon", className: actionClass, "aria-label": column.tooltip, children: /* @__PURE__ */ jsx278(InfoCircleIcon, { className: "h-6 w-6 text-ods-text-secondary" }) }) }),
31329
+ onToggleCollapse && /* @__PURE__ */ jsx278(
31099
31330
  Button,
31100
31331
  {
31101
31332
  variant: "transparent",
@@ -31103,10 +31334,10 @@ function BoardColumnHeader({
31103
31334
  className: actionClass,
31104
31335
  onClick: onToggleCollapse,
31105
31336
  "aria-label": "Collapse column",
31106
- children: /* @__PURE__ */ jsx274(Arrow02LeftIcon, { className: "h-6 w-6 text-ods-text-secondary" })
31337
+ children: /* @__PURE__ */ jsx278(Arrow02LeftIcon, { className: "h-6 w-6 text-ods-text-secondary" })
31107
31338
  }
31108
31339
  ),
31109
- onArchive && /* @__PURE__ */ jsx274(
31340
+ onArchive && /* @__PURE__ */ jsx278(
31110
31341
  Button,
31111
31342
  {
31112
31343
  variant: "transparent",
@@ -31114,10 +31345,10 @@ function BoardColumnHeader({
31114
31345
  className: actionClass,
31115
31346
  onClick: onArchive,
31116
31347
  "aria-label": "Archive resolved tickets",
31117
- children: /* @__PURE__ */ jsx274(BoxArchiveIcon, { className: "h-6 w-6 text-ods-text-secondary" })
31348
+ children: /* @__PURE__ */ jsx278(BoxArchiveIcon, { className: "h-6 w-6 text-ods-text-secondary" })
31118
31349
  }
31119
31350
  ),
31120
- onAddTicket && /* @__PURE__ */ jsx274(
31351
+ onAddTicket && /* @__PURE__ */ jsx278(
31121
31352
  Button,
31122
31353
  {
31123
31354
  variant: "transparent",
@@ -31125,7 +31356,7 @@ function BoardColumnHeader({
31125
31356
  className: actionClass,
31126
31357
  onClick: onAddTicket,
31127
31358
  "aria-label": "Add ticket",
31128
- children: /* @__PURE__ */ jsx274(PlusIcon, { className: "h-6 w-6 text-ods-text-secondary" })
31359
+ children: /* @__PURE__ */ jsx278(PlusIcon, { className: "h-6 w-6 text-ods-text-secondary" })
31129
31360
  }
31130
31361
  )
31131
31362
  ] })
@@ -31224,7 +31455,7 @@ import {
31224
31455
  useEffect as useEffect47,
31225
31456
  useMemo as useMemo24,
31226
31457
  useRef as useRef42,
31227
- useState as useState79
31458
+ useState as useState81
31228
31459
  } from "react";
31229
31460
 
31230
31461
  // src/utils/drag-effect.ts
@@ -31238,14 +31469,14 @@ function holdMoveDragEffect(element) {
31238
31469
  }
31239
31470
 
31240
31471
  // src/components/features/board/board-ticket-approval.tsx
31241
- import { useState as useState78 } from "react";
31242
- import { jsx as jsx275, jsxs as jsxs218 } from "react/jsx-runtime";
31472
+ import { useState as useState80 } from "react";
31473
+ import { jsx as jsx279, jsxs as jsxs222 } from "react/jsx-runtime";
31243
31474
  function BoardTicketApproval({ pendingApproval, onApprove, onReject }) {
31244
- const [expanded, setExpanded] = useState78(false);
31475
+ const [expanded, setExpanded] = useState80(false);
31245
31476
  const { innerRef, containerStyle } = useCollapsible({ expanded });
31246
31477
  const isAdmin = pendingApproval.approvalType === "ADMIN";
31247
- return /* @__PURE__ */ jsxs218("div", { className: "pointer-events-auto flex flex-col", children: [
31248
- /* @__PURE__ */ jsxs218(
31478
+ return /* @__PURE__ */ jsxs222("div", { className: "pointer-events-auto flex flex-col", children: [
31479
+ /* @__PURE__ */ jsxs222(
31249
31480
  "button",
31250
31481
  {
31251
31482
  type: "button",
@@ -31253,7 +31484,7 @@ function BoardTicketApproval({ pendingApproval, onApprove, onReject }) {
31253
31484
  "aria-expanded": expanded,
31254
31485
  className: "flex w-full cursor-pointer items-center gap-[var(--spacing-system-xxs)] text-h6",
31255
31486
  children: [
31256
- /* @__PURE__ */ jsxs218(
31487
+ /* @__PURE__ */ jsxs222(
31257
31488
  "span",
31258
31489
  {
31259
31490
  className: cn(
@@ -31261,16 +31492,16 @@ function BoardTicketApproval({ pendingApproval, onApprove, onReject }) {
31261
31492
  isAdmin ? "text-ods-open-yellow" : "text-ods-text-secondary"
31262
31493
  ),
31263
31494
  children: [
31264
- isAdmin ? /* @__PURE__ */ jsx275(ShieldCheckIcon, { className: "size-4 shrink-0" }) : /* @__PURE__ */ jsx275(DotsLoaderIcon, { size: 16, className: "shrink-0" }),
31265
- /* @__PURE__ */ jsx275("span", { className: "flex-1 truncate text-left", children: isAdmin ? "Technician approval required" : "Pending client approval" })
31495
+ isAdmin ? /* @__PURE__ */ jsx279(ShieldCheckIcon, { className: "size-4 shrink-0" }) : /* @__PURE__ */ jsx279(DotsLoaderIcon, { size: 16, className: "shrink-0" }),
31496
+ /* @__PURE__ */ jsx279("span", { className: "flex-1 truncate text-left", children: isAdmin ? "Technician approval required" : "Pending client approval" })
31266
31497
  ]
31267
31498
  }
31268
31499
  ),
31269
- expanded ? /* @__PURE__ */ jsx275(Chevron02UpIcon, { className: "size-4 shrink-0 text-ods-text-secondary" }) : /* @__PURE__ */ jsx275(Chevron02DownIcon, { className: "size-4 shrink-0 text-ods-text-secondary" })
31500
+ expanded ? /* @__PURE__ */ jsx279(Chevron02UpIcon, { className: "size-4 shrink-0 text-ods-text-secondary" }) : /* @__PURE__ */ jsx279(Chevron02DownIcon, { className: "size-4 shrink-0 text-ods-text-secondary" })
31270
31501
  ]
31271
31502
  }
31272
31503
  ),
31273
- /* @__PURE__ */ jsx275("div", { style: containerStyle, children: /* @__PURE__ */ jsx275("div", { ref: innerRef, className: "pt-[var(--spacing-system-xs)]", children: /* @__PURE__ */ jsx275(
31504
+ /* @__PURE__ */ jsx279("div", { style: containerStyle, children: /* @__PURE__ */ jsx279("div", { ref: innerRef, className: "pt-[var(--spacing-system-xs)]", children: /* @__PURE__ */ jsx279(
31274
31505
  ApprovalBatchMessage,
31275
31506
  {
31276
31507
  className: "mb-0",
@@ -31323,7 +31554,7 @@ function hasMoveSettled(columns, move) {
31323
31554
  }
31324
31555
 
31325
31556
  // src/components/features/board/ticket-card.tsx
31326
- import { Fragment as Fragment48, jsx as jsx276, jsxs as jsxs219 } from "react/jsx-runtime";
31557
+ import { Fragment as Fragment48, jsx as jsx280, jsxs as jsxs223 } from "react/jsx-runtime";
31327
31558
  var PRIORITY_COLOR_CLASS = {
31328
31559
  low: "text-ods-text-secondary",
31329
31560
  medium: "text-ods-info",
@@ -31355,24 +31586,24 @@ function TicketCardBody({
31355
31586
  const showDeviceRow = !!(ticket.deviceHostnames?.length || ticket.organizationName);
31356
31587
  const deviceText = [ticket.deviceHostnames?.join(", "), ticket.organizationName].filter(Boolean).join(", ");
31357
31588
  const hasRightSection = !!(ticket.priority || ticket.assignees?.length || renderAssignSlot);
31358
- const rightSection = hasRightSection ? /* @__PURE__ */ jsxs219("div", { className: "pointer-events-auto flex shrink-0 items-center gap-[var(--spacing-system-xsf)]", children: [
31359
- ticket.priority && /* @__PURE__ */ jsx276(
31589
+ const rightSection = hasRightSection ? /* @__PURE__ */ jsxs223("div", { className: "pointer-events-auto flex shrink-0 items-center gap-[var(--spacing-system-xsf)]", children: [
31590
+ ticket.priority && /* @__PURE__ */ jsx280(
31360
31591
  Flag02Icon,
31361
31592
  {
31362
31593
  className: cn("size-4", PRIORITY_COLOR_CLASS[ticket.priority]),
31363
31594
  "aria-label": `Priority: ${ticket.priority}`
31364
31595
  }
31365
31596
  ),
31366
- renderAssignSlot ? renderAssignSlot(ticket) : ticket.assignees?.length ? /* @__PURE__ */ jsxs219("div", { className: "flex -space-x-2", children: [
31597
+ renderAssignSlot ? renderAssignSlot(ticket) : ticket.assignees?.length ? /* @__PURE__ */ jsxs223("div", { className: "flex -space-x-2", children: [
31367
31598
  ticket.assignees.slice(0, MAX_VISIBLE_ASSIGNEES).map(
31368
- (a) => a.deleted ? /* @__PURE__ */ jsx276(
31599
+ (a) => a.deleted ? /* @__PURE__ */ jsx280(
31369
31600
  DeletedUserAvatar,
31370
31601
  {
31371
31602
  size: "sm",
31372
31603
  accessibleLabel: `Deleted user: ${a.name ?? a.initials ?? a.id}`
31373
31604
  },
31374
31605
  a.id
31375
- ) : /* @__PURE__ */ jsx276(
31606
+ ) : /* @__PURE__ */ jsx280(
31376
31607
  SquareAvatar,
31377
31608
  {
31378
31609
  src: a.avatarUrl,
@@ -31384,7 +31615,7 @@ function TicketCardBody({
31384
31615
  a.id
31385
31616
  )
31386
31617
  ),
31387
- ticket.assignees.length > MAX_VISIBLE_ASSIGNEES && /* @__PURE__ */ jsxs219("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-full border border-ods-border bg-ods-bg text-ods-text-secondary text-h6", children: [
31618
+ ticket.assignees.length > MAX_VISIBLE_ASSIGNEES && /* @__PURE__ */ jsxs223("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-full border border-ods-border bg-ods-bg text-ods-text-secondary text-h6", children: [
31388
31619
  "+",
31389
31620
  ticket.assignees.length - MAX_VISIBLE_ASSIGNEES
31390
31621
  ] })
@@ -31394,7 +31625,7 @@ function TicketCardBody({
31394
31625
  const tooltipLabel = ticket.createdAt ? formatTicketFullTimestamp(ticket.createdAt) : null;
31395
31626
  const metaLabel = [ticket.ticketNumber || null, timestampLabel].filter(Boolean).join(" \u2022 ");
31396
31627
  const metaClass = "truncate text-ods-text-secondary text-h6";
31397
- const meta = href ? /* @__PURE__ */ jsx276(
31628
+ const meta = href ? /* @__PURE__ */ jsx280(
31398
31629
  next_link_default,
31399
31630
  {
31400
31631
  href,
@@ -31405,28 +31636,28 @@ function TicketCardBody({
31405
31636
  className: cn("pointer-events-auto block", metaClass),
31406
31637
  children: metaLabel
31407
31638
  }
31408
- ) : /* @__PURE__ */ jsx276("p", { className: cn(tooltipLabel && "pointer-events-auto", metaClass), children: metaLabel });
31409
- return /* @__PURE__ */ jsxs219(Fragment48, { children: [
31410
- /* @__PURE__ */ jsxs219("div", { className: "flex items-start gap-[var(--spacing-system-sf)]", children: [
31411
- /* @__PURE__ */ jsxs219("div", { className: "flex min-w-0 flex-1 flex-col gap-[var(--spacing-system-zero)]", title: ticket.title, children: [
31412
- /* @__PURE__ */ jsx276("p", { className: "truncate text-ods-text-primary text-h3", children: ticket.title }),
31413
- showDeviceRow && /* @__PURE__ */ jsxs219("div", { className: "flex min-w-0 items-center gap-[var(--spacing-system-xxs)] text-ods-text-secondary text-h6", children: [
31414
- /* @__PURE__ */ jsx276(LaptopIcon, { className: "size-4 shrink-0" }),
31415
- /* @__PURE__ */ jsx276("span", { className: "truncate", title: deviceText, children: deviceText })
31639
+ ) : /* @__PURE__ */ jsx280("p", { className: cn(tooltipLabel && "pointer-events-auto", metaClass), children: metaLabel });
31640
+ return /* @__PURE__ */ jsxs223(Fragment48, { children: [
31641
+ /* @__PURE__ */ jsxs223("div", { className: "flex items-start gap-[var(--spacing-system-sf)]", children: [
31642
+ /* @__PURE__ */ jsxs223("div", { className: "flex min-w-0 flex-1 flex-col gap-[var(--spacing-system-zero)]", title: ticket.title, children: [
31643
+ /* @__PURE__ */ jsx280("p", { className: "truncate text-ods-text-primary text-h3", children: ticket.title }),
31644
+ showDeviceRow && /* @__PURE__ */ jsxs223("div", { className: "flex min-w-0 items-center gap-[var(--spacing-system-xxs)] text-ods-text-secondary text-h6", children: [
31645
+ /* @__PURE__ */ jsx280(LaptopIcon, { className: "size-4 shrink-0" }),
31646
+ /* @__PURE__ */ jsx280("span", { className: "truncate", title: deviceText, children: deviceText })
31416
31647
  ] })
31417
31648
  ] }),
31418
31649
  rightSection
31419
31650
  ] }),
31420
- ticket.tags?.length ? /* @__PURE__ */ jsx276(TicketTagRow, { tags: ticket.tags }) : null,
31421
- metaLabel && (tooltipLabel ? /* @__PURE__ */ jsx276(TooltipProvider, { children: /* @__PURE__ */ jsxs219(Tooltip, { children: [
31422
- /* @__PURE__ */ jsx276(TooltipTrigger, { asChild: true, children: meta }),
31423
- /* @__PURE__ */ jsx276(TooltipContent, { children: tooltipLabel })
31651
+ ticket.tags?.length ? /* @__PURE__ */ jsx280(TicketTagRow, { tags: ticket.tags }) : null,
31652
+ metaLabel && (tooltipLabel ? /* @__PURE__ */ jsx280(TooltipProvider, { children: /* @__PURE__ */ jsxs223(Tooltip, { children: [
31653
+ /* @__PURE__ */ jsx280(TooltipTrigger, { asChild: true, children: meta }),
31654
+ /* @__PURE__ */ jsx280(TooltipContent, { children: tooltipLabel })
31424
31655
  ] }) }) : meta),
31425
- ticket.escalatedByUser && /* @__PURE__ */ jsxs219("div", { className: "flex items-center gap-[var(--spacing-system-xxs)] text-ods-open-yellow text-h6", children: [
31426
- /* @__PURE__ */ jsx276(UserCheckIcon, { className: "size-4 shrink-0" }),
31427
- /* @__PURE__ */ jsx276("span", { className: "truncate", children: "Escalated by User" })
31656
+ ticket.escalatedByUser && /* @__PURE__ */ jsxs223("div", { className: "flex items-center gap-[var(--spacing-system-xxs)] text-ods-open-yellow text-h6", children: [
31657
+ /* @__PURE__ */ jsx280(UserCheckIcon, { className: "size-4 shrink-0" }),
31658
+ /* @__PURE__ */ jsx280("span", { className: "truncate", children: "Escalated by User" })
31428
31659
  ] }),
31429
- ticket.activity && /* @__PURE__ */ jsxs219(
31660
+ ticket.activity && /* @__PURE__ */ jsxs223(
31430
31661
  "div",
31431
31662
  {
31432
31663
  className: cn(
@@ -31434,32 +31665,32 @@ function TicketCardBody({
31434
31665
  ticket.activity.kind === "stale" ? "text-ods-open-yellow" : "text-ods-text-secondary"
31435
31666
  ),
31436
31667
  children: [
31437
- ticket.activity.kind === "stale" ? /* @__PURE__ */ jsx276(ClockIcon, { className: "size-4 shrink-0" }) : /* @__PURE__ */ jsx276(DotsLoaderIcon, { className: "size-4 shrink-0" }),
31438
- /* @__PURE__ */ jsx276("span", { className: "truncate", children: ticket.activity.label ?? ACTIVITY_DEFAULT_LABEL[ticket.activity.kind] })
31668
+ ticket.activity.kind === "stale" ? /* @__PURE__ */ jsx280(ClockIcon, { className: "size-4 shrink-0" }) : /* @__PURE__ */ jsx280(DotsLoaderIcon, { className: "size-4 shrink-0" }),
31669
+ /* @__PURE__ */ jsx280("span", { className: "truncate", children: ticket.activity.label ?? ACTIVITY_DEFAULT_LABEL[ticket.activity.kind] })
31439
31670
  ]
31440
31671
  }
31441
31672
  ),
31442
- showNewMessage && /* @__PURE__ */ jsx276(
31673
+ showNewMessage && /* @__PURE__ */ jsx280(
31443
31674
  Tag,
31444
31675
  {
31445
31676
  label: "New Message",
31446
- icon: /* @__PURE__ */ jsx276(MessagesIcon, { size: 16, color: newMessageTextColor }),
31677
+ icon: /* @__PURE__ */ jsx280(MessagesIcon, { size: 16, color: newMessageTextColor }),
31447
31678
  className: "w-fit shrink-0",
31448
31679
  style: { backgroundColor: columnColor, color: newMessageTextColor }
31449
31680
  }
31450
31681
  ),
31451
- ticket.pendingApproval && /* @__PURE__ */ jsx276(BoardTicketApproval, { pendingApproval: ticket.pendingApproval, onApprove, onReject })
31682
+ ticket.pendingApproval && /* @__PURE__ */ jsx280(BoardTicketApproval, { pendingApproval: ticket.pendingApproval, onApprove, onReject })
31452
31683
  ] });
31453
31684
  }
31454
31685
  function TicketCardView({ className, style, ...bodyProps }) {
31455
31686
  const { ticket, columnColor } = bodyProps;
31456
31687
  const showNewMessage = !!ticket.hasNewMessage && !!columnColor;
31457
- return /* @__PURE__ */ jsx276(
31688
+ return /* @__PURE__ */ jsx280(
31458
31689
  "div",
31459
31690
  {
31460
31691
  className: cn(TICKET_CARD_SHELL, className),
31461
31692
  style: showNewMessage ? { borderColor: columnColor, ...style } : style,
31462
- children: /* @__PURE__ */ jsx276("div", { className: "relative z-10 flex flex-col gap-[var(--spacing-system-sf)]", children: /* @__PURE__ */ jsx276(TicketCardBody, { ...bodyProps }) })
31693
+ children: /* @__PURE__ */ jsx280("div", { className: "relative z-10 flex flex-col gap-[var(--spacing-system-sf)]", children: /* @__PURE__ */ jsx280(TicketCardBody, { ...bodyProps }) })
31463
31694
  }
31464
31695
  );
31465
31696
  }
@@ -31480,7 +31711,7 @@ var TicketCard = memo5(function TicketCardImpl({
31480
31711
  useEffect47(() => {
31481
31712
  ticketRef.current = ticket;
31482
31713
  });
31483
- const [isDragging, setIsDragging] = useState79(false);
31714
+ const [isDragging, setIsDragging] = useState81(false);
31484
31715
  const isLanding = useIsLanding(ticket.id);
31485
31716
  const aim = useDropAim();
31486
31717
  const closestEdge = aim && aim.columnId === columnId && aim.ticketId === ticket.id ? aim.edge : null;
@@ -31574,7 +31805,7 @@ var TicketCard = memo5(function TicketCardImpl({
31574
31805
  [isDragging]
31575
31806
  );
31576
31807
  const body = useMemo24(
31577
- () => /* @__PURE__ */ jsx276(
31808
+ () => /* @__PURE__ */ jsx280(
31578
31809
  TicketCardBody,
31579
31810
  {
31580
31811
  ticket,
@@ -31603,7 +31834,7 @@ var TicketCard = memo5(function TicketCardImpl({
31603
31834
  } else if (isLanding) {
31604
31835
  style.visibility = "hidden";
31605
31836
  }
31606
- const insertionLine = closestEdge ? /* @__PURE__ */ jsx276(
31837
+ const insertionLine = closestEdge ? /* @__PURE__ */ jsx280(
31607
31838
  "span",
31608
31839
  {
31609
31840
  "aria-hidden": true,
@@ -31622,9 +31853,9 @@ var TicketCard = memo5(function TicketCardImpl({
31622
31853
  }
31623
31854
  ) : null;
31624
31855
  if (href) {
31625
- return /* @__PURE__ */ jsxs219("div", { ...outerProps, children: [
31856
+ return /* @__PURE__ */ jsxs223("div", { ...outerProps, children: [
31626
31857
  insertionLine,
31627
- /* @__PURE__ */ jsx276(
31858
+ /* @__PURE__ */ jsx280(
31628
31859
  next_link_default,
31629
31860
  {
31630
31861
  href,
@@ -31637,12 +31868,12 @@ var TicketCard = memo5(function TicketCardImpl({
31637
31868
  className: "absolute inset-0 z-0 rounded-md focus-visible:outline-none"
31638
31869
  }
31639
31870
  ),
31640
- /* @__PURE__ */ jsx276("div", { className: cn("pointer-events-none", innerWrapperClass), children: body })
31871
+ /* @__PURE__ */ jsx280("div", { className: cn("pointer-events-none", innerWrapperClass), children: body })
31641
31872
  ] });
31642
31873
  }
31643
- return /* @__PURE__ */ jsxs219("div", { ...outerProps, children: [
31874
+ return /* @__PURE__ */ jsxs223("div", { ...outerProps, children: [
31644
31875
  insertionLine,
31645
- /* @__PURE__ */ jsx276(
31876
+ /* @__PURE__ */ jsx280(
31646
31877
  "button",
31647
31878
  {
31648
31879
  type: "button",
@@ -31653,23 +31884,23 @@ var TicketCard = memo5(function TicketCardImpl({
31653
31884
  className: "absolute inset-0 z-0 cursor-pointer rounded-md focus-visible:outline-none"
31654
31885
  }
31655
31886
  ),
31656
- /* @__PURE__ */ jsx276("div", { className: cn("pointer-events-none", innerWrapperClass), children: body })
31887
+ /* @__PURE__ */ jsx280("div", { className: cn("pointer-events-none", innerWrapperClass), children: body })
31657
31888
  ] });
31658
31889
  });
31659
31890
  function TicketTagRow({ tags }) {
31660
31891
  const visible = tags.slice(0, MAX_VISIBLE_TAGS);
31661
31892
  const hidden = tags.length - visible.length;
31662
- return /* @__PURE__ */ jsxs219("div", { className: "flex h-8 flex-wrap items-start gap-[var(--spacing-system-xxs)] overflow-clip", children: [
31663
- visible.map((tag) => /* @__PURE__ */ jsx276(Tag, { variant: "outline", label: tag }, tag)),
31664
- hidden > 0 && /* @__PURE__ */ jsx276(Tag, { variant: "outline", label: `+${hidden}` })
31893
+ return /* @__PURE__ */ jsxs223("div", { className: "flex h-8 flex-wrap items-start gap-[var(--spacing-system-xxs)] overflow-clip", children: [
31894
+ visible.map((tag) => /* @__PURE__ */ jsx280(Tag, { variant: "outline", label: tag }, tag)),
31895
+ hidden > 0 && /* @__PURE__ */ jsx280(Tag, { variant: "outline", label: `+${hidden}` })
31665
31896
  ] });
31666
31897
  }
31667
31898
 
31668
31899
  // src/components/features/board/ticket-card-skeleton.tsx
31669
31900
  import { forwardRef as forwardRef32 } from "react";
31670
- import { jsx as jsx277, jsxs as jsxs220 } from "react/jsx-runtime";
31901
+ import { jsx as jsx281, jsxs as jsxs224 } from "react/jsx-runtime";
31671
31902
  var TicketCardSkeleton = forwardRef32(
31672
- ({ className, ...props }, ref) => /* @__PURE__ */ jsxs220(
31903
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxs224(
31673
31904
  "div",
31674
31905
  {
31675
31906
  ref,
@@ -31679,22 +31910,22 @@ var TicketCardSkeleton = forwardRef32(
31679
31910
  ),
31680
31911
  ...props,
31681
31912
  children: [
31682
- /* @__PURE__ */ jsxs220("div", { className: "flex items-start gap-[var(--spacing-system-sf)]", children: [
31683
- /* @__PURE__ */ jsxs220("div", { className: "flex min-w-0 flex-1 flex-col gap-[var(--spacing-system-xxs)]", children: [
31684
- /* @__PURE__ */ jsx277("div", { className: "flex items-center text-h3", children: /* @__PURE__ */ jsx277(Skeleton, { className: "h-4 w-3/4" }) }),
31685
- /* @__PURE__ */ jsxs220("div", { className: "flex items-center gap-[var(--spacing-system-xxs)] text-h6", children: [
31686
- /* @__PURE__ */ jsx277(Skeleton, { className: "size-4 shrink-0 rounded-sm" }),
31687
- /* @__PURE__ */ jsx277(Skeleton, { className: "h-3 w-1/2" })
31913
+ /* @__PURE__ */ jsxs224("div", { className: "flex items-start gap-[var(--spacing-system-sf)]", children: [
31914
+ /* @__PURE__ */ jsxs224("div", { className: "flex min-w-0 flex-1 flex-col gap-[var(--spacing-system-xxs)]", children: [
31915
+ /* @__PURE__ */ jsx281("div", { className: "flex items-center text-h3", children: /* @__PURE__ */ jsx281(Skeleton, { className: "h-4 w-3/4" }) }),
31916
+ /* @__PURE__ */ jsxs224("div", { className: "flex items-center gap-[var(--spacing-system-xxs)] text-h6", children: [
31917
+ /* @__PURE__ */ jsx281(Skeleton, { className: "size-4 shrink-0 rounded-sm" }),
31918
+ /* @__PURE__ */ jsx281(Skeleton, { className: "h-3 w-1/2" })
31688
31919
  ] })
31689
31920
  ] }),
31690
- /* @__PURE__ */ jsxs220("div", { className: "flex shrink-0 items-center gap-[var(--spacing-system-xsf)]", children: [
31691
- /* @__PURE__ */ jsx277(Skeleton, { className: "size-4 rounded-sm" }),
31692
- /* @__PURE__ */ jsx277(Skeleton, { className: "size-8 rounded-full" })
31921
+ /* @__PURE__ */ jsxs224("div", { className: "flex shrink-0 items-center gap-[var(--spacing-system-xsf)]", children: [
31922
+ /* @__PURE__ */ jsx281(Skeleton, { className: "size-4 rounded-sm" }),
31923
+ /* @__PURE__ */ jsx281(Skeleton, { className: "size-8 rounded-full" })
31693
31924
  ] })
31694
31925
  ] }),
31695
- /* @__PURE__ */ jsxs220("div", { className: "flex h-8 items-center gap-[var(--spacing-system-xxs)]", children: [
31696
- /* @__PURE__ */ jsx277(Skeleton, { className: "h-8 w-16 rounded-md" }),
31697
- /* @__PURE__ */ jsx277(Skeleton, { className: "h-8 w-12 rounded-md" })
31926
+ /* @__PURE__ */ jsxs224("div", { className: "flex h-8 items-center gap-[var(--spacing-system-xxs)]", children: [
31927
+ /* @__PURE__ */ jsx281(Skeleton, { className: "h-8 w-16 rounded-md" }),
31928
+ /* @__PURE__ */ jsx281(Skeleton, { className: "h-8 w-12 rounded-md" })
31698
31929
  ] })
31699
31930
  ]
31700
31931
  }
@@ -31703,7 +31934,7 @@ var TicketCardSkeleton = forwardRef32(
31703
31934
  TicketCardSkeleton.displayName = "TicketCardSkeleton";
31704
31935
 
31705
31936
  // src/components/features/board/board-column.tsx
31706
- import { Fragment as Fragment49, jsx as jsx278, jsxs as jsxs221 } from "react/jsx-runtime";
31937
+ import { Fragment as Fragment49, jsx as jsx282, jsxs as jsxs225 } from "react/jsx-runtime";
31707
31938
  var BoardColumn = memo6(function BoardColumnImpl({
31708
31939
  column,
31709
31940
  collapsed = false,
@@ -31722,7 +31953,7 @@ var BoardColumn = memo6(function BoardColumnImpl({
31722
31953
  className
31723
31954
  }) {
31724
31955
  const laneRef = useRef43(null);
31725
- const [isOver, setIsOver] = useState80(false);
31956
+ const [isOver, setIsOver] = useState82(false);
31726
31957
  useEffect48(() => {
31727
31958
  const element = laneRef.current;
31728
31959
  if (!element || collapsed || touchMode || column.dropDisabled) return void 0;
@@ -31755,7 +31986,7 @@ var BoardColumn = memo6(function BoardColumnImpl({
31755
31986
  });
31756
31987
  }, [column.id, column.dropDisabled, column.allowedFromColumns, collapsed, touchMode]);
31757
31988
  const handleToggleCollapse = useCallback27(() => onToggleCollapse?.(column.id), [onToggleCollapse, column.id]);
31758
- return /* @__PURE__ */ jsxs221(
31989
+ return /* @__PURE__ */ jsxs225(
31759
31990
  "div",
31760
31991
  {
31761
31992
  ref: laneRef,
@@ -31771,7 +32002,7 @@ var BoardColumn = memo6(function BoardColumnImpl({
31771
32002
  ),
31772
32003
  style: column.system ? void 0 : { backgroundColor: tintOnDark(column.color) },
31773
32004
  children: [
31774
- /* @__PURE__ */ jsx278(
32005
+ /* @__PURE__ */ jsx282(
31775
32006
  BoardColumnHeader,
31776
32007
  {
31777
32008
  column,
@@ -31781,9 +32012,9 @@ var BoardColumn = memo6(function BoardColumnImpl({
31781
32012
  onArchive: !collapsed && column.archivable && onArchive ? () => onArchive(column.id) : void 0
31782
32013
  }
31783
32014
  ),
31784
- !collapsed && /* @__PURE__ */ jsxs221(Fragment49, { children: [
31785
- /* @__PURE__ */ jsx278("div", { "aria-hidden": true, className: "-mx-[var(--spacing-system-sf)] h-px shrink-0 bg-ods-border" }),
31786
- /* @__PURE__ */ jsx278(
32015
+ !collapsed && /* @__PURE__ */ jsxs225(Fragment49, { children: [
32016
+ /* @__PURE__ */ jsx282("div", { "aria-hidden": true, className: "-mx-[var(--spacing-system-sf)] h-px shrink-0 bg-ods-border" }),
32017
+ /* @__PURE__ */ jsx282(
31787
32018
  ColumnBody,
31788
32019
  {
31789
32020
  column,
@@ -31846,13 +32077,13 @@ function ColumnBody({
31846
32077
  // wholesale. The browser's own anchoring is unusable here — it silently
31847
32078
  // skips transformed elements, so it works between drags and does nothing
31848
32079
  // during one — and leaving both on double-corrects every insertion.
31849
- /* @__PURE__ */ jsxs221(
32080
+ /* @__PURE__ */ jsxs225(
31850
32081
  "div",
31851
32082
  {
31852
32083
  ref: scrollRef,
31853
32084
  className: "flex min-h-0 flex-1 flex-col gap-[var(--spacing-system-xs)] overflow-y-auto py-[5px] [overflow-anchor:none]",
31854
32085
  children: [
31855
- column.isLoading ? /* @__PURE__ */ jsx278(SkeletonStack, {}) : column.tickets.length === 0 ? /* @__PURE__ */ jsx278(EmptyState2, { columnId: column.id, touchMode }) : column.tickets.map((t) => /* @__PURE__ */ jsx278(
32086
+ column.isLoading ? /* @__PURE__ */ jsx282(SkeletonStack, {}) : column.tickets.length === 0 ? /* @__PURE__ */ jsx282(EmptyState2, { columnId: column.id, touchMode }) : column.tickets.map((t) => /* @__PURE__ */ jsx282(
31856
32087
  TicketCard,
31857
32088
  {
31858
32089
  ticket: t,
@@ -31868,26 +32099,26 @@ function ColumnBody({
31868
32099
  },
31869
32100
  t.id
31870
32101
  )),
31871
- column.isLoadingMore && !column.isLoading && /* @__PURE__ */ jsx278(TicketCardSkeleton, {}),
31872
- column.hasMore && /* @__PURE__ */ jsx278("div", { ref: sentinelRef, "aria-hidden": true, className: "h-1 shrink-0" })
32102
+ column.isLoadingMore && !column.isLoading && /* @__PURE__ */ jsx282(TicketCardSkeleton, {}),
32103
+ column.hasMore && /* @__PURE__ */ jsx282("div", { ref: sentinelRef, "aria-hidden": true, className: "h-1 shrink-0" })
31873
32104
  ]
31874
32105
  }
31875
32106
  )
31876
32107
  );
31877
32108
  }
31878
32109
  function SkeletonStack({ count = 4 }) {
31879
- return /* @__PURE__ */ jsx278(Fragment49, { children: Array.from({ length: count }, (_, i) => /* @__PURE__ */ jsx278(TicketCardSkeleton, {}, `skeleton-${i}`)) });
32110
+ return /* @__PURE__ */ jsx282(Fragment49, { children: Array.from({ length: count }, (_, i) => /* @__PURE__ */ jsx282(TicketCardSkeleton, {}, `skeleton-${i}`)) });
31880
32111
  }
31881
32112
  function EmptyState2({ columnId, touchMode }) {
31882
32113
  const aim = useDropAim();
31883
32114
  if (aim && aim.columnId === columnId) {
31884
- return /* @__PURE__ */ jsx278("div", { "aria-hidden": true, ...{ [DROP_LINE_ATTRIBUTE]: "" }, className: "h-0.5 shrink-0 rounded-full bg-ods-accent" });
32115
+ return /* @__PURE__ */ jsx282("div", { "aria-hidden": true, ...{ [DROP_LINE_ATTRIBUTE]: "" }, className: "h-0.5 shrink-0 rounded-full bg-ods-accent" });
31885
32116
  }
31886
- return /* @__PURE__ */ jsxs221("div", { className: "flex flex-1 flex-col items-center justify-center gap-[var(--spacing-system-lf)] p-[var(--spacing-system-lf)] text-center text-ods-text-secondary", children: [
31887
- /* @__PURE__ */ jsx278(TagIcon, { className: "h-6 w-6 shrink-0" }),
31888
- /* @__PURE__ */ jsxs221("div", { className: "flex w-full flex-col", children: [
31889
- /* @__PURE__ */ jsx278("p", { className: "text-h4", children: "No tickets here" }),
31890
- /* @__PURE__ */ jsx278("p", { className: "text-h6", children: touchMode ? "Change a ticket's status to move it to this column" : "Drag a ticket here or change its status to move it to this column" })
32117
+ return /* @__PURE__ */ jsxs225("div", { className: "flex flex-1 flex-col items-center justify-center gap-[var(--spacing-system-lf)] p-[var(--spacing-system-lf)] text-center text-ods-text-secondary", children: [
32118
+ /* @__PURE__ */ jsx282(TagIcon, { className: "h-6 w-6 shrink-0" }),
32119
+ /* @__PURE__ */ jsxs225("div", { className: "flex w-full flex-col", children: [
32120
+ /* @__PURE__ */ jsx282("p", { className: "text-h4", children: "No tickets here" }),
32121
+ /* @__PURE__ */ jsx282("p", { className: "text-h6", children: touchMode ? "Change a ticket's status to move it to this column" : "Drag a ticket here or change its status to move it to this column" })
31891
32122
  ] })
31892
32123
  ] });
31893
32124
  }
@@ -31901,10 +32132,10 @@ function resolveBoardDrop(columns, { source, target }) {
31901
32132
  }
31902
32133
 
31903
32134
  // src/components/features/board/use-board-collapse.ts
31904
- import { useCallback as useCallback28, useEffect as useEffect49, useRef as useRef44, useState as useState81 } from "react";
32135
+ import { useCallback as useCallback28, useEffect as useEffect49, useRef as useRef44, useState as useState83 } from "react";
31905
32136
  function useBoardCollapse(storageKey) {
31906
32137
  const [persisted, setPersisted] = useLocalStorage(storageKey ?? "__board_collapse_unused__", {});
31907
- const [memory, setMemory] = useState81({});
32138
+ const [memory, setMemory] = useState83({});
31908
32139
  const collapsed = storageKey ? persisted : memory;
31909
32140
  const setMap = storageKey ? setPersisted : setMemory;
31910
32141
  const setMapRef = useRef44(setMap);
@@ -31921,7 +32152,7 @@ function useBoardCollapse(storageKey) {
31921
32152
  }
31922
32153
 
31923
32154
  // src/components/features/board/touch-board.tsx
31924
- import { jsx as jsx279 } from "react/jsx-runtime";
32155
+ import { jsx as jsx283 } from "react/jsx-runtime";
31925
32156
  function TouchBoard({
31926
32157
  columns,
31927
32158
  onLoadMore,
@@ -31936,11 +32167,11 @@ function TouchBoard({
31936
32167
  className
31937
32168
  }) {
31938
32169
  const { collapsed, toggle } = useBoardCollapse(collapseStorageKey);
31939
- return /* @__PURE__ */ jsx279("div", { className: cn("flex h-full min-h-0 flex-col", className), children: /* @__PURE__ */ jsx279(
32170
+ return /* @__PURE__ */ jsx283("div", { className: cn("flex h-full min-h-0 flex-col", className), children: /* @__PURE__ */ jsx283(
31940
32171
  "div",
31941
32172
  {
31942
32173
  className: "flex min-h-0 flex-1 snap-x snap-mandatory gap-[var(--spacing-system-mf)] overflow-x-auto overscroll-x-contain [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",
31943
- children: columns.map((column) => /* @__PURE__ */ jsx279(
32174
+ children: columns.map((column) => /* @__PURE__ */ jsx283(
31944
32175
  BoardColumn,
31945
32176
  {
31946
32177
  column,
@@ -31967,7 +32198,7 @@ function TouchBoard({
31967
32198
  }
31968
32199
 
31969
32200
  // src/components/features/board/board.tsx
31970
- import { jsx as jsx280, jsxs as jsxs222 } from "react/jsx-runtime";
32201
+ import { jsx as jsx284, jsxs as jsxs226 } from "react/jsx-runtime";
31971
32202
  var PENDING_MOVE_TIMEOUT_MS = 2e3;
31972
32203
  var DROP_MS = 160;
31973
32204
  var DROP_EASING = "cubic-bezier(0.2, 0, 0, 1)";
@@ -31976,9 +32207,9 @@ var ARROW_KEYS = ["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"];
31976
32207
  function Board(props) {
31977
32208
  const dragAndDropEnabled = useMediaQuery(DRAG_AND_DROP_MEDIA_QUERY);
31978
32209
  if (dragAndDropEnabled === void 0) {
31979
- return /* @__PURE__ */ jsx280("div", { "aria-hidden": true, className: cn("flex h-full min-h-0 flex-col", props.className) });
32210
+ return /* @__PURE__ */ jsx284("div", { "aria-hidden": true, className: cn("flex h-full min-h-0 flex-col", props.className) });
31980
32211
  }
31981
- return dragAndDropEnabled ? /* @__PURE__ */ jsx280(DragBoard, { ...props }) : /* @__PURE__ */ jsx280(TouchBoard, { ...props });
32212
+ return dragAndDropEnabled ? /* @__PURE__ */ jsx284(DragBoard, { ...props }) : /* @__PURE__ */ jsx284(TouchBoard, { ...props });
31982
32213
  }
31983
32214
  function DragBoard({
31984
32215
  columns,
@@ -32019,20 +32250,20 @@ function DragBoard({
32019
32250
  },
32020
32251
  [scrollRef]
32021
32252
  );
32022
- const [aim, setAim] = useState82(null);
32023
- const [lifted, setLifted] = useState82(null);
32024
- const [announcement, setAnnouncement] = useState82("");
32253
+ const [aim, setAim] = useState84(null);
32254
+ const [lifted, setLifted] = useState84(null);
32255
+ const [announcement, setAnnouncement] = useState84("");
32025
32256
  const dragGeometry = useRef45(null);
32026
- const [landingPreview, setLandingPreview] = useState82(null);
32257
+ const [landingPreview, setLandingPreview] = useState84(null);
32027
32258
  const previewRef = useRef45(null);
32028
- const [reportedMove, setPendingMove] = useState82(null);
32259
+ const [reportedMove, setPendingMove] = useState84(null);
32029
32260
  const pendingMove = reportedMove && !hasMoveSettled(columns, reportedMove) ? reportedMove : null;
32030
32261
  const view = useMemo25(() => pendingMove ? applyPendingMove(columns, pendingMove) : columns, [columns, pendingMove]);
32031
32262
  useEffect50(() => {
32032
32263
  columnsRef.current = view;
32033
32264
  onChangeRef.current = onChange;
32034
32265
  });
32035
- const [landing, setLanding] = useState82(null);
32266
+ const [landing, setLanding] = useState84(null);
32036
32267
  const landingTimer = useRef45(null);
32037
32268
  const pointRef = useRef45({ x: 0, y: 0 });
32038
32269
  const laneLabel = useCallback29((columnId) => view.find((c) => c.id === columnId)?.label ?? columnId, [view]);
@@ -32231,7 +32462,7 @@ function DragBoard({
32231
32462
  };
32232
32463
  }, [landing, landingPreview]);
32233
32464
  const preview = landingPreview && createPortal(
32234
- /* @__PURE__ */ jsx280(
32465
+ /* @__PURE__ */ jsx284(
32235
32466
  "div",
32236
32467
  {
32237
32468
  ref: previewRef,
@@ -32244,7 +32475,7 @@ function DragBoard({
32244
32475
  // translate in pointer coordinates and nothing else.
32245
32476
  margin: `${-landingPreview.grabY}px 0 0 ${-landingPreview.grabX}px`
32246
32477
  },
32247
- children: /* @__PURE__ */ jsx280(
32478
+ children: /* @__PURE__ */ jsx284(
32248
32479
  TicketCardView,
32249
32480
  {
32250
32481
  ticket: landingPreview.ticket,
@@ -32257,10 +32488,10 @@ function DragBoard({
32257
32488
  ),
32258
32489
  document.body
32259
32490
  );
32260
- return /* @__PURE__ */ jsx280(LandingCardContext.Provider, { value: landing, children: /* @__PURE__ */ jsx280(DropAimContext.Provider, { value: aim ?? keyboardAim, children: /* @__PURE__ */ jsxs222(BoardLiftContext.Provider, { value: lift, children: [
32491
+ return /* @__PURE__ */ jsx284(LandingCardContext.Provider, { value: landing, children: /* @__PURE__ */ jsx284(DropAimContext.Provider, { value: aim ?? keyboardAim, children: /* @__PURE__ */ jsxs226(BoardLiftContext.Provider, { value: lift, children: [
32261
32492
  preview,
32262
- /* @__PURE__ */ jsxs222("div", { ref: boardRef, className: cn("flex h-full flex-col", className), children: [
32263
- /* @__PURE__ */ jsx280(
32493
+ /* @__PURE__ */ jsxs226("div", { ref: boardRef, className: cn("flex h-full flex-col", className), children: [
32494
+ /* @__PURE__ */ jsx284(
32264
32495
  "div",
32265
32496
  {
32266
32497
  ref: setScroller,
@@ -32272,9 +32503,9 @@ function DragBoard({
32272
32503
  const joinLeft = !!(column.system && prev?.system);
32273
32504
  const joinRight = !!(column.system && next?.system);
32274
32505
  const showGap = i > 0 && !joinLeft;
32275
- return /* @__PURE__ */ jsxs222(Fragment50, { children: [
32276
- showGap && /* @__PURE__ */ jsx280("div", { "aria-hidden": true, className: "w-[var(--spacing-system-mf)] shrink-0" }),
32277
- /* @__PURE__ */ jsx280(
32506
+ return /* @__PURE__ */ jsxs226(Fragment50, { children: [
32507
+ showGap && /* @__PURE__ */ jsx284("div", { "aria-hidden": true, className: "w-[var(--spacing-system-mf)] shrink-0" }),
32508
+ /* @__PURE__ */ jsx284(
32278
32509
  BoardColumn,
32279
32510
  {
32280
32511
  column,
@@ -32296,15 +32527,15 @@ function DragBoard({
32296
32527
  })
32297
32528
  }
32298
32529
  ),
32299
- /* @__PURE__ */ jsx280("p", { "aria-live": "polite", className: "sr-only", children: announcement }),
32300
- thumbRatio > 0 && /* @__PURE__ */ jsx280(
32530
+ /* @__PURE__ */ jsx284("p", { "aria-live": "polite", className: "sr-only", children: announcement }),
32531
+ thumbRatio > 0 && /* @__PURE__ */ jsx284(
32301
32532
  "div",
32302
32533
  {
32303
32534
  ref: trackRef,
32304
32535
  onClick: onTrackClick,
32305
32536
  onWheel: onTrackWheel,
32306
32537
  className: "relative mt-[var(--spacing-system-mf)] h-2 shrink-0 cursor-pointer rounded-full bg-ods-border",
32307
- children: /* @__PURE__ */ jsx280(
32538
+ children: /* @__PURE__ */ jsx284(
32308
32539
  "div",
32309
32540
  {
32310
32541
  ref: thumbRef,
@@ -32423,9 +32654,9 @@ import {
32423
32654
  useId as useId6,
32424
32655
  useMemo as useMemo26,
32425
32656
  useRef as useRef46,
32426
- useState as useState83
32657
+ useState as useState85
32427
32658
  } from "react";
32428
- import { jsx as jsx281, jsxs as jsxs223 } from "react/jsx-runtime";
32659
+ import { jsx as jsx285, jsxs as jsxs227 } from "react/jsx-runtime";
32429
32660
  var SORTABLE_ITEM_ATTRIBUTE = "data-sortable-item";
32430
32661
  var SHIFT_MS = 200;
32431
32662
  var DROP_MS2 = 150;
@@ -32440,7 +32671,7 @@ function SortableList({ onReorder, getItemLabel, disabled = false, className, ch
32440
32671
  const listRef = useRef46(null);
32441
32672
  const dragAndDropEnabled = useDragAndDropEnabled();
32442
32673
  const dragType = useId6();
32443
- const [announcement, setAnnouncement] = useState83("");
32674
+ const [announcement, setAnnouncement] = useState85("");
32444
32675
  const onReorderRef = useRef46(onReorder);
32445
32676
  const getItemLabelRef = useRef46(getItemLabel);
32446
32677
  useEffect51(() => {
@@ -32448,7 +32679,7 @@ function SortableList({ onReorder, getItemLabel, disabled = false, className, ch
32448
32679
  getItemLabelRef.current = getItemLabel;
32449
32680
  });
32450
32681
  const flipFrom = useRef46(null);
32451
- const [flipTick, setFlipTick] = useState83(0);
32682
+ const [flipTick, setFlipTick] = useState85(0);
32452
32683
  const flipTimer = useRef46(null);
32453
32684
  const readItems = useCallback30(
32454
32685
  () => [...listRef.current?.querySelectorAll(`[${SORTABLE_ITEM_ATTRIBUTE}]`) ?? []],
@@ -32564,15 +32795,15 @@ function SortableList({ onReorder, getItemLabel, disabled = false, className, ch
32564
32795
  () => ({ dragType, disabled, dragAndDropEnabled, reorder, readItems }),
32565
32796
  [dragType, disabled, dragAndDropEnabled, reorder, readItems]
32566
32797
  );
32567
- return /* @__PURE__ */ jsx281(SortableListContext.Provider, { value: context, children: /* @__PURE__ */ jsxs223("div", { ref: listRef, className, children: [
32798
+ return /* @__PURE__ */ jsx285(SortableListContext.Provider, { value: context, children: /* @__PURE__ */ jsxs227("div", { ref: listRef, className, children: [
32568
32799
  children,
32569
- /* @__PURE__ */ jsx281("p", { "aria-live": "polite", className: "sr-only", children: announcement })
32800
+ /* @__PURE__ */ jsx285("p", { "aria-live": "polite", className: "sr-only", children: announcement })
32570
32801
  ] }) });
32571
32802
  }
32572
32803
 
32573
32804
  // src/components/features/sortable-list/sortable-move-buttons.tsx
32574
32805
  import { useRef as useRef47 } from "react";
32575
- import { jsx as jsx282, jsxs as jsxs224 } from "react/jsx-runtime";
32806
+ import { jsx as jsx286, jsxs as jsxs228 } from "react/jsx-runtime";
32576
32807
  function SortableMoveButtons({ index, count, label, className }) {
32577
32808
  const { disabled, reorder } = useSortableListContext();
32578
32809
  const upRef = useRef47(null);
@@ -32587,8 +32818,8 @@ function SortableMoveButtons({ index, count, label, className }) {
32587
32818
  });
32588
32819
  };
32589
32820
  const subject = label ?? "item";
32590
- return /* @__PURE__ */ jsxs224("div", { className: cn("inline-flex shrink-0", className), children: [
32591
- /* @__PURE__ */ jsx282(
32821
+ return /* @__PURE__ */ jsxs228("div", { className: cn("inline-flex shrink-0", className), children: [
32822
+ /* @__PURE__ */ jsx286(
32592
32823
  Button,
32593
32824
  {
32594
32825
  ref: upRef,
@@ -32599,10 +32830,10 @@ function SortableMoveButtons({ index, count, label, className }) {
32599
32830
  disabled: disabled || index <= 0,
32600
32831
  onClick: () => move(-1),
32601
32832
  className: "rounded-r-none border-r-0",
32602
- children: /* @__PURE__ */ jsx282(Arrow01UpIcon, {})
32833
+ children: /* @__PURE__ */ jsx286(Arrow01UpIcon, {})
32603
32834
  }
32604
32835
  ),
32605
- /* @__PURE__ */ jsx282(
32836
+ /* @__PURE__ */ jsx286(
32606
32837
  Button,
32607
32838
  {
32608
32839
  ref: downRef,
@@ -32613,7 +32844,7 @@ function SortableMoveButtons({ index, count, label, className }) {
32613
32844
  disabled: disabled || index >= count - 1,
32614
32845
  onClick: () => move(1),
32615
32846
  className: "rounded-l-none",
32616
- children: /* @__PURE__ */ jsx282(Arrow01DownIcon, {})
32847
+ children: /* @__PURE__ */ jsx286(Arrow01DownIcon, {})
32617
32848
  }
32618
32849
  )
32619
32850
  ] });
@@ -32623,13 +32854,13 @@ function SortableMoveButtons({ index, count, label, className }) {
32623
32854
  import { combine as combine5 } from "@atlaskit/pragmatic-drag-and-drop/combine";
32624
32855
  import { draggable as draggable2 } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
32625
32856
  import { disableNativeDragPreview } from "@atlaskit/pragmatic-drag-and-drop/element/disable-native-drag-preview";
32626
- import { useCallback as useCallback31, useEffect as useEffect52, useState as useState84 } from "react";
32857
+ import { useCallback as useCallback31, useEffect as useEffect52, useState as useState86 } from "react";
32627
32858
  function useSortableItem() {
32628
32859
  const { dragType, disabled, dragAndDropEnabled, reorder, readItems } = useSortableListContext();
32629
32860
  const inert = disabled || !dragAndDropEnabled;
32630
- const [item, setItem] = useState84(null);
32631
- const [handle, setHandle] = useState84(null);
32632
- const [isDragging, setIsDragging] = useState84(false);
32861
+ const [item, setItem] = useState86(null);
32862
+ const [handle, setHandle] = useState86(null);
32863
+ const [isDragging, setIsDragging] = useState86(false);
32633
32864
  const itemRef = useCallback31((node) => {
32634
32865
  node?.setAttribute(SORTABLE_ITEM_ATTRIBUTE, "");
32635
32866
  setItem(node);
@@ -32669,7 +32900,7 @@ function useSortableItem() {
32669
32900
  }
32670
32901
 
32671
32902
  // src/components/features/ticket-status-config-list/ticket-status-config-list.tsx
32672
- import { jsx as jsx283 } from "react/jsx-runtime";
32903
+ import { jsx as jsx287 } from "react/jsx-runtime";
32673
32904
  function TicketStatusConfigList({
32674
32905
  items,
32675
32906
  onReorder,
@@ -32677,13 +32908,13 @@ function TicketStatusConfigList({
32677
32908
  getItemLabel,
32678
32909
  className
32679
32910
  }) {
32680
- return /* @__PURE__ */ jsx283(
32911
+ return /* @__PURE__ */ jsx287(
32681
32912
  SortableList,
32682
32913
  {
32683
32914
  onReorder,
32684
32915
  getItemLabel,
32685
32916
  className: cn("flex w-full flex-col gap-[var(--spacing-system-xs)]", className),
32686
- children: items.map((item, index) => /* @__PURE__ */ jsx283(SortableRow, { index, count: items.length, label: getItemLabel?.(index), children: (args) => renderRow(item, args) }, item.id))
32917
+ children: items.map((item, index) => /* @__PURE__ */ jsx287(SortableRow, { index, count: items.length, label: getItemLabel?.(index), children: (args) => renderRow(item, args) }, item.id))
32687
32918
  }
32688
32919
  );
32689
32920
  }
@@ -32694,7 +32925,7 @@ function SortableRow({
32694
32925
  children
32695
32926
  }) {
32696
32927
  const { itemRef, dragHandleProps, isDragging, dragAndDropEnabled } = useSortableItem();
32697
- return /* @__PURE__ */ jsx283(
32928
+ return /* @__PURE__ */ jsx287(
32698
32929
  "div",
32699
32930
  {
32700
32931
  ref: itemRef,
@@ -32702,18 +32933,18 @@ function SortableRow({
32702
32933
  children: children({
32703
32934
  dragHandleProps,
32704
32935
  isDragging,
32705
- moveButtons: dragAndDropEnabled ? null : /* @__PURE__ */ jsx283(SortableMoveButtons, { index, count, label })
32936
+ moveButtons: dragAndDropEnabled ? null : /* @__PURE__ */ jsx287(SortableMoveButtons, { index, count, label })
32706
32937
  })
32707
32938
  }
32708
32939
  );
32709
32940
  }
32710
32941
 
32711
32942
  // src/components/features/conversation-card.tsx
32712
- import { jsx as jsx284, jsxs as jsxs225 } from "react/jsx-runtime";
32943
+ import { jsx as jsx288, jsxs as jsxs229 } from "react/jsx-runtime";
32713
32944
  function Who({ speaker }) {
32714
- return /* @__PURE__ */ jsxs225("div", { className: "flex items-baseline gap-2 text-ods-text-primary text-h4", children: [
32945
+ return /* @__PURE__ */ jsxs229("div", { className: "flex items-baseline gap-2 text-ods-text-primary text-h4", children: [
32715
32946
  speaker.name,
32716
- speaker.meta && /* @__PURE__ */ jsx284("span", { className: "text-ods-text-secondary text-h6", children: speaker.meta })
32947
+ speaker.meta && /* @__PURE__ */ jsx288("span", { className: "text-ods-text-secondary text-h6", children: speaker.meta })
32717
32948
  ] });
32718
32949
  }
32719
32950
  function ConversationCard({
@@ -32727,36 +32958,36 @@ function ConversationCard({
32727
32958
  footerTone = "default",
32728
32959
  className
32729
32960
  }) {
32730
- return /* @__PURE__ */ jsxs225(
32961
+ return /* @__PURE__ */ jsxs229(
32731
32962
  "div",
32732
32963
  {
32733
32964
  className: cn("flex h-full flex-col gap-4 rounded-xl border border-ods-border bg-ods-card p-5 md:p-7", className),
32734
32965
  children: [
32735
- /* @__PURE__ */ jsxs225("div", { className: "flex items-start gap-3", children: [
32736
- /* @__PURE__ */ jsx284("span", { className: "shrink-0", children: requester.avatar }),
32737
- /* @__PURE__ */ jsxs225("div", { className: "min-w-0 flex-1", children: [
32738
- /* @__PURE__ */ jsx284(Who, { speaker: requester }),
32739
- /* @__PURE__ */ jsxs225("p", { className: "m-0 mt-1 line-clamp-2 min-h-[2lh] text-ods-text-primary text-h3", title: request, children: [
32966
+ /* @__PURE__ */ jsxs229("div", { className: "flex items-start gap-3", children: [
32967
+ /* @__PURE__ */ jsx288("span", { className: "shrink-0", children: requester.avatar }),
32968
+ /* @__PURE__ */ jsxs229("div", { className: "min-w-0 flex-1", children: [
32969
+ /* @__PURE__ */ jsx288(Who, { speaker: requester }),
32970
+ /* @__PURE__ */ jsxs229("p", { className: "m-0 mt-1 line-clamp-2 min-h-[2lh] text-ods-text-primary text-h3", title: request, children: [
32740
32971
  "\u201C",
32741
32972
  request,
32742
32973
  "\u201D"
32743
32974
  ] })
32744
32975
  ] })
32745
32976
  ] }),
32746
- /* @__PURE__ */ jsxs225("div", { className: "flex items-start gap-3 rounded-md border border-ods-border bg-ods-bg p-3.5", children: [
32747
- /* @__PURE__ */ jsx284("span", { className: "shrink-0", children: responder.avatar }),
32748
- /* @__PURE__ */ jsxs225("div", { className: "min-w-0 flex-1", children: [
32749
- /* @__PURE__ */ jsx284(Who, { speaker: responder }),
32750
- /* @__PURE__ */ jsxs225("div", { className: "mt-1 flex items-start gap-2 text-ods-text-secondary text-h4", children: [
32751
- /* @__PURE__ */ jsx284(CheckCircleIcon, { size: 16, className: "mt-1 shrink-0 text-ods-success", "aria-hidden": true }),
32752
- /* @__PURE__ */ jsx284("span", { className: "line-clamp-3 min-h-[3lh] min-w-0 flex-1", title: outcome, children: outcome }),
32977
+ /* @__PURE__ */ jsxs229("div", { className: "flex items-start gap-3 rounded-md border border-ods-border bg-ods-bg p-3.5", children: [
32978
+ /* @__PURE__ */ jsx288("span", { className: "shrink-0", children: responder.avatar }),
32979
+ /* @__PURE__ */ jsxs229("div", { className: "min-w-0 flex-1", children: [
32980
+ /* @__PURE__ */ jsx288(Who, { speaker: responder }),
32981
+ /* @__PURE__ */ jsxs229("div", { className: "mt-1 flex items-start gap-2 text-ods-text-secondary text-h4", children: [
32982
+ /* @__PURE__ */ jsx288(CheckCircleIcon, { size: 16, className: "mt-1 shrink-0 text-ods-success", "aria-hidden": true }),
32983
+ /* @__PURE__ */ jsx288("span", { className: "line-clamp-3 min-h-[3lh] min-w-0 flex-1", title: outcome, children: outcome }),
32753
32984
  outcomeAside
32754
32985
  ] })
32755
32986
  ] })
32756
32987
  ] }),
32757
- /* @__PURE__ */ jsxs225("div", { className: "mt-auto flex items-center justify-between gap-3 border-t border-ods-border pt-3.5 text-ods-text-secondary text-h6", children: [
32758
- /* @__PURE__ */ jsx284("span", { children: footerLabel }),
32759
- /* @__PURE__ */ jsx284(
32988
+ /* @__PURE__ */ jsxs229("div", { className: "mt-auto flex items-center justify-between gap-3 border-t border-ods-border pt-3.5 text-ods-text-secondary text-h6", children: [
32989
+ /* @__PURE__ */ jsx288("span", { children: footerLabel }),
32990
+ /* @__PURE__ */ jsx288(
32760
32991
  "span",
32761
32992
  {
32762
32993
  className: cn(
@@ -33346,6 +33577,7 @@ export {
33346
33577
  UnreadCountBadge,
33347
33578
  HeaderButton,
33348
33579
  TimeTrackerHeaderButton,
33580
+ RemoteSessionViewers,
33349
33581
  RemoteSessionScope,
33350
33582
  RemoteSessionOrgLogo,
33351
33583
  RemoteSessionRecordingTag,
@@ -33362,6 +33594,15 @@ export {
33362
33594
  RemoteSessionDialog,
33363
33595
  RemoteSessionBorder,
33364
33596
  RemoteSessionPill,
33597
+ REMOTE_SESSION_KEEP_REASON_LABELS,
33598
+ KeepRecordingModal,
33599
+ ReleaseKeepingModal,
33600
+ formatRemoteSessionOffset,
33601
+ RemoteSessionEventList,
33602
+ RemoteSessionTimelineMarkers,
33603
+ RemoteSessionStatusTag,
33604
+ RemoteSessionExpiry,
33605
+ RemoteSessionStorageAlert,
33365
33606
  BoardColumnHeader,
33366
33607
  tintOnDark,
33367
33608
  BoardTicketApproval,