@flamingo-stack/openframe-frontend-core 0.0.701 → 0.0.702

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 (89) hide show
  1. package/dist/{chunk-MFORWVGD.js → chunk-2V4Z44G6.js} +4 -4
  2. package/dist/{chunk-GFXZMFDX.cjs → chunk-3G76LRGL.cjs} +9 -9
  3. package/dist/{chunk-65YVUYWJ.cjs → chunk-3WSFIV5G.cjs} +32 -32
  4. package/dist/{chunk-GD4JALTR.js → chunk-446KS5BG.js} +1 -1
  5. package/dist/{chunk-BRQY2HKD.cjs → chunk-AEQANLBW.cjs} +17 -17
  6. package/dist/{chunk-ZSPHOHOW.cjs → chunk-ASN65P3F.cjs} +2 -2
  7. package/dist/{chunk-YBC346FY.cjs → chunk-B3LZJ6J3.cjs} +12 -12
  8. package/dist/{chunk-JPVDJB27.js → chunk-BO5ZHDA4.js} +3 -3
  9. package/dist/{chunk-2CSYUMNM.cjs → chunk-CXDJUKC6.cjs} +2 -2
  10. package/dist/{chunk-QPNR4N7N.cjs → chunk-CYYTD5ZK.cjs} +16 -16
  11. package/dist/{chunk-B7M6QEEM.js → chunk-CZ34HXDW.js} +661 -275
  12. package/dist/{chunk-4H5Q6MQG.cjs → chunk-E3DH543A.cjs} +35 -35
  13. package/dist/{chunk-BZYMGI4L.js → chunk-ETFFEA3J.js} +1 -1
  14. package/dist/{chunk-QDIX2ZRL.cjs → chunk-FD4DBTFO.cjs} +430 -44
  15. package/dist/{chunk-BPS7JQCI.cjs → chunk-FHM7GD5B.cjs} +2 -2
  16. package/dist/{chunk-QZGFJBG5.cjs → chunk-HIXGAY2L.cjs} +50 -50
  17. package/dist/{chunk-V5QNDOEL.js → chunk-HPJ4XS2L.js} +3 -3
  18. package/dist/{chunk-DJLZXJYB.js → chunk-HYFLTFFB.js} +1 -1
  19. package/dist/{chunk-CUPJCGLB.js → chunk-IZKOQVXO.js} +1 -1
  20. package/dist/{chunk-N7DPIH57.js → chunk-JOY6HVPV.js} +1 -1
  21. package/dist/{chunk-NIT257DV.cjs → chunk-L7KZA7ZD.cjs} +2 -2
  22. package/dist/{chunk-BQ34PIFC.cjs → chunk-LZNJH23A.cjs} +3 -3
  23. package/dist/{chunk-EONNPRAW.js → chunk-MWUBBBWZ.js} +1 -1
  24. package/dist/{chunk-N7HMUQRV.js → chunk-PLK6GHN7.js} +1 -1
  25. package/dist/{chunk-DG2I57UM.cjs → chunk-QFW3RUZS.cjs} +16 -16
  26. package/dist/{chunk-S4ADN25W.js → chunk-RS7HWAYX.js} +1 -1
  27. package/dist/{chunk-PNWIVND4.js → chunk-SAA7B3DA.js} +2 -2
  28. package/dist/{chunk-6JG75WVO.js → chunk-UJJWTJ6S.js} +4 -4
  29. package/dist/{chunk-7ZDTAABP.cjs → chunk-YGRHITPY.cjs} +3 -3
  30. package/dist/{chunk-A5ZGKBN2.js → chunk-Z5HDCZAS.js} +1 -1
  31. package/dist/components/case-studies/index.cjs +11 -11
  32. package/dist/components/case-studies/index.js +2 -2
  33. package/dist/components/contact/index.cjs +3 -3
  34. package/dist/components/contact/index.js +2 -2
  35. package/dist/components/docs/index.cjs +6 -6
  36. package/dist/components/docs/index.js +5 -5
  37. package/dist/components/embeds/index.cjs +3 -3
  38. package/dist/components/embeds/index.js +2 -2
  39. package/dist/components/faq/index.cjs +3 -3
  40. package/dist/components/faq/index.js +2 -2
  41. package/dist/components/features/index.cjs +22 -2
  42. package/dist/components/features/index.js +21 -1
  43. package/dist/components/features/remote-session/index.d.ts +9 -1
  44. package/dist/components/features/remote-session/index.d.ts.map +1 -1
  45. package/dist/components/features/remote-session/remote-session-block.d.ts +4 -2
  46. package/dist/components/features/remote-session/remote-session-block.d.ts.map +1 -1
  47. package/dist/components/features/remote-session/remote-session-chat-panel.d.ts +4 -2
  48. package/dist/components/features/remote-session/remote-session-chat-panel.d.ts.map +1 -1
  49. package/dist/components/features/remote-session/remote-session-events.d.ts +24 -0
  50. package/dist/components/features/remote-session/remote-session-events.d.ts.map +1 -0
  51. package/dist/components/features/remote-session/remote-session-keep-modals.d.ts +41 -0
  52. package/dist/components/features/remote-session/remote-session-keep-modals.d.ts.map +1 -0
  53. package/dist/components/features/remote-session/remote-session-parts.d.ts +13 -2
  54. package/dist/components/features/remote-session/remote-session-parts.d.ts.map +1 -1
  55. package/dist/components/features/remote-session/remote-session-status.d.ts +34 -0
  56. package/dist/components/features/remote-session/remote-session-status.d.ts.map +1 -0
  57. package/dist/components/features/remote-session/remote-session-viewers.d.ts +15 -0
  58. package/dist/components/features/remote-session/remote-session-viewers.d.ts.map +1 -0
  59. package/dist/components/features/remote-session/types.d.ts +22 -0
  60. package/dist/components/features/remote-session/types.d.ts.map +1 -1
  61. package/dist/components/help-center-pages/index.cjs +49 -49
  62. package/dist/components/help-center-pages/index.js +13 -13
  63. package/dist/components/index.cjs +53 -33
  64. package/dist/components/index.js +32 -12
  65. package/dist/components/meeting-scheduler/index.cjs +22 -22
  66. package/dist/components/meeting-scheduler/index.js +1 -1
  67. package/dist/components/navigation/index.cjs +5 -5
  68. package/dist/components/navigation/index.js +4 -4
  69. package/dist/components/onboarding-guides/index.cjs +5 -5
  70. package/dist/components/onboarding-guides/index.js +4 -4
  71. package/dist/components/tickets/index.cjs +6 -6
  72. package/dist/components/tickets/index.js +5 -5
  73. package/dist/components/ui/index.cjs +2 -2
  74. package/dist/components/ui/index.js +1 -1
  75. package/dist/index.cjs +26 -6
  76. package/dist/index.js +25 -5
  77. package/dist/tailwind.config.cjs +7 -1
  78. package/dist/tailwind.config.js +7 -1
  79. package/package.json +1 -1
  80. package/src/components/features/remote-session/index.ts +28 -0
  81. package/src/components/features/remote-session/remote-session-block.tsx +6 -3
  82. package/src/components/features/remote-session/remote-session-chat-panel.tsx +11 -7
  83. package/src/components/features/remote-session/remote-session-events.tsx +93 -0
  84. package/src/components/features/remote-session/remote-session-keep-modals.tsx +208 -0
  85. package/src/components/features/remote-session/remote-session-parts.tsx +32 -3
  86. package/src/components/features/remote-session/remote-session-status.tsx +102 -0
  87. package/src/components/features/remote-session/remote-session-viewers.tsx +103 -0
  88. package/src/components/features/remote-session/types.ts +26 -0
  89. package/tailwind.config.ts +6 -0
@@ -194,6 +194,7 @@ import {
194
194
  FlaskVialIcon,
195
195
  GoogleLogoIcon,
196
196
  HhsLogoIcon,
197
+ HourglassIcon,
197
198
  ImageOffIcon,
198
199
  ImagePlusIcon,
199
200
  InfoCircleIcon,
@@ -201,6 +202,7 @@ import {
201
202
  IsoLogoIcon,
202
203
  LinkedinIcon,
203
204
  LinuxLogoIcon,
205
+ LockIcon,
204
206
  MessageOffIcon,
205
207
  MessagesIcon,
206
208
  MicrosoftLogoIcon,
@@ -30417,8 +30419,93 @@ function TimeTrackerHeaderButton({ className, disabled }) {
30417
30419
  }
30418
30420
 
30419
30421
  // src/components/features/remote-session/remote-session-parts.tsx
30420
- import { useEffect as useEffect45, useState as useState77 } from "react";
30422
+ import { useEffect as useEffect45, useState as useState78 } from "react";
30423
+
30424
+ // src/components/features/remote-session/remote-session-viewers.tsx
30425
+ import { useState as useState77 } from "react";
30421
30426
  import { jsx as jsx268, jsxs as jsxs211 } from "react/jsx-runtime";
30427
+ function viewerLabel(viewer) {
30428
+ if (viewer.isHost) return `${viewer.name} (host)`;
30429
+ if (viewer.isYou) return `${viewer.name} (you)`;
30430
+ return viewer.name;
30431
+ }
30432
+ function hostFirst(viewers) {
30433
+ return [...viewers.filter((viewer) => viewer.isHost), ...viewers.filter((viewer) => !viewer.isHost)];
30434
+ }
30435
+ function RemoteSessionViewers({ viewers, max = 4, className }) {
30436
+ const [open, setOpen] = useState77(false);
30437
+ if (viewers.length === 0) return null;
30438
+ const ordered = hostFirst(viewers);
30439
+ const faces = ordered.slice(0, max);
30440
+ const overflow2 = ordered.length - faces.length;
30441
+ const Chevron = open ? Chevron02UpIcon : Chevron02DownIcon;
30442
+ return /* @__PURE__ */ jsxs211(DropdownMenu, { open, onOpenChange: setOpen, children: [
30443
+ /* @__PURE__ */ jsxs211(
30444
+ DropdownMenuTrigger,
30445
+ {
30446
+ "aria-label": `In this session: ${ordered.map(viewerLabel).join(", ")}`,
30447
+ className: cn(
30448
+ "flex shrink-0 items-center gap-[var(--spacing-system-xxs)] rounded-md outline-none",
30449
+ "focus-visible:ring-2 focus-visible:ring-ods-focus",
30450
+ className
30451
+ ),
30452
+ children: [
30453
+ /* @__PURE__ */ jsxs211("span", { className: "flex items-center", children: [
30454
+ faces.map((viewer, index) => /* @__PURE__ */ jsx268(
30455
+ SquareAvatar,
30456
+ {
30457
+ variant: "round",
30458
+ sizePx: 32,
30459
+ src: viewer.avatarUrl ?? void 0,
30460
+ alt: viewer.name,
30461
+ fallback: viewer.name,
30462
+ className: cn(
30463
+ "relative bg-ods-bg",
30464
+ viewer.isHost ? "ring-2 ring-ods-accent" : "ring-1 ring-ods-border",
30465
+ index > 0 && "-ml-2"
30466
+ ),
30467
+ style: { zIndex: faces.length - index + 1 }
30468
+ },
30469
+ viewer.id
30470
+ )),
30471
+ 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: [
30472
+ "+",
30473
+ overflow2
30474
+ ] })
30475
+ ] }),
30476
+ /* @__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" }) })
30477
+ ]
30478
+ }
30479
+ ),
30480
+ /* @__PURE__ */ jsx268(DropdownMenuContent, { align: "end", className: "w-[280px] p-0", children: ordered.map((viewer) => /* @__PURE__ */ jsxs211(
30481
+ DropdownMenuItem,
30482
+ {
30483
+ className: cn(
30484
+ "gap-[var(--spacing-system-xsf)] rounded-none border-b border-ods-border bg-ods-bg last:border-b-0",
30485
+ "py-[var(--spacing-system-s)] pl-[var(--spacing-system-mf)] pr-[var(--spacing-system-xs)] text-h4"
30486
+ ),
30487
+ children: [
30488
+ /* @__PURE__ */ jsx268(
30489
+ SquareAvatar,
30490
+ {
30491
+ variant: "round",
30492
+ sizePx: 24,
30493
+ src: viewer.avatarUrl ?? void 0,
30494
+ alt: "",
30495
+ fallback: viewer.name,
30496
+ className: "shrink-0"
30497
+ }
30498
+ ),
30499
+ /* @__PURE__ */ jsx268("span", { className: "min-w-0 flex-1 truncate", children: viewerLabel(viewer) })
30500
+ ]
30501
+ },
30502
+ viewer.id
30503
+ )) })
30504
+ ] });
30505
+ }
30506
+
30507
+ // src/components/features/remote-session/remote-session-parts.tsx
30508
+ import { jsx as jsx269, jsxs as jsxs212 } from "react/jsx-runtime";
30422
30509
  var DESKTOP_SCALE = {
30423
30510
  "--spacing-system-xs": "0.5rem",
30424
30511
  "--spacing-system-s": "0.75rem",
@@ -30439,11 +30526,11 @@ var DESKTOP_SCALE = {
30439
30526
  "--font-line-space-h6-caption": "1.25rem"
30440
30527
  };
30441
30528
  function RemoteSessionScope({ children, className }) {
30442
- return /* @__PURE__ */ jsx268("div", { "data-app-type": "openframe", style: DESKTOP_SCALE, className, children });
30529
+ return /* @__PURE__ */ jsx269("div", { "data-app-type": "openframe", style: DESKTOP_SCALE, className, children });
30443
30530
  }
30444
30531
  function RemoteSessionOrgLogo({ name, logoUrl, sizePx, className }) {
30445
30532
  if (logoUrl) {
30446
- return /* @__PURE__ */ jsx268(
30533
+ return /* @__PURE__ */ jsx269(
30447
30534
  SquareAvatar,
30448
30535
  {
30449
30536
  variant: "square",
@@ -30456,7 +30543,7 @@ function RemoteSessionOrgLogo({ name, logoUrl, sizePx, className }) {
30456
30543
  }
30457
30544
  );
30458
30545
  }
30459
- return /* @__PURE__ */ jsx268(
30546
+ return /* @__PURE__ */ jsx269(
30460
30547
  "div",
30461
30548
  {
30462
30549
  role: "img",
@@ -30466,19 +30553,40 @@ function RemoteSessionOrgLogo({ name, logoUrl, sizePx, className }) {
30466
30553
  "flex shrink-0 items-center justify-center rounded-md border border-ods-border bg-ods-card",
30467
30554
  className
30468
30555
  ),
30469
- children: /* @__PURE__ */ jsx268(OpenFrameLogo, { className: "size-1/2" })
30556
+ children: /* @__PURE__ */ jsx269(OpenFrameLogo, { className: "size-1/2" })
30557
+ }
30558
+ );
30559
+ }
30560
+ function RemoteSessionRecordingTag({ className }) {
30561
+ return /* @__PURE__ */ jsxs212(
30562
+ "div",
30563
+ {
30564
+ className: cn(
30565
+ "flex h-8 items-center gap-[var(--spacing-system-xs)] self-start rounded-md bg-ods-success-secondary p-[var(--spacing-system-xsf)]",
30566
+ className
30567
+ ),
30568
+ children: [
30569
+ /* @__PURE__ */ jsx269(RecordingIcon, { size: 16, color: "currentColor", className: "text-ods-success" }),
30570
+ /* @__PURE__ */ jsx269("span", { className: "text-ods-success text-h5", children: "Session Recording" })
30571
+ ]
30470
30572
  }
30471
30573
  );
30472
30574
  }
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" })
30575
+ function RemoteSessionStatusRow({
30576
+ showRecordingTag,
30577
+ viewers
30578
+ }) {
30579
+ const hasViewers = !!viewers && viewers.length > 0;
30580
+ if (!showRecordingTag && !hasViewers) return null;
30581
+ if (!hasViewers) return /* @__PURE__ */ jsx269(RemoteSessionRecordingTag, {});
30582
+ return /* @__PURE__ */ jsxs212("div", { className: "flex w-full items-center gap-[var(--spacing-system-m)]", children: [
30583
+ showRecordingTag && /* @__PURE__ */ jsx269(RemoteSessionRecordingTag, { className: "flex-1 justify-center self-auto" }),
30584
+ /* @__PURE__ */ jsx269(RemoteSessionViewers, { viewers, className: "ml-auto" })
30477
30585
  ] });
30478
30586
  }
30479
30587
  var REMOTE_SESSION_DRAG_HANDLE_CLASS = "cursor-grab active:cursor-grabbing";
30480
30588
  function RemoteSessionDragger({ dragHandlers }) {
30481
- return /* @__PURE__ */ jsx268(
30589
+ return /* @__PURE__ */ jsx269(
30482
30590
  "span",
30483
30591
  {
30484
30592
  "aria-hidden": true,
@@ -30487,7 +30595,7 @@ function RemoteSessionDragger({ dragHandlers }) {
30487
30595
  dragHandlers && REMOTE_SESSION_DRAG_HANDLE_CLASS
30488
30596
  ),
30489
30597
  ...dragHandlers,
30490
- children: /* @__PURE__ */ jsx268(DraggerIcon, { size: 24, color: "currentColor" })
30598
+ children: /* @__PURE__ */ jsx269(DraggerIcon, { size: 24, color: "currentColor" })
30491
30599
  }
30492
30600
  );
30493
30601
  }
@@ -30499,7 +30607,7 @@ function formatRemoteSessionElapsed(elapsedMs) {
30499
30607
  return hours > 0 ? `${hours}:${String(minutes).padStart(2, "0")}:${seconds}` : `${minutes}:${seconds}`;
30500
30608
  }
30501
30609
  function useRemoteSessionTimer(startedAt) {
30502
- const [nowMs, setNowMs] = useState77(() => Date.now());
30610
+ const [nowMs, setNowMs] = useState78(() => Date.now());
30503
30611
  useEffect45(() => {
30504
30612
  const timer = setInterval(() => setNowMs(Date.now()), 1e3);
30505
30613
  return () => clearInterval(timer);
@@ -30508,7 +30616,7 @@ function useRemoteSessionTimer(startedAt) {
30508
30616
  }
30509
30617
 
30510
30618
  // src/components/features/remote-session/remote-access-request-card.tsx
30511
- import { jsx as jsx269, jsxs as jsxs212 } from "react/jsx-runtime";
30619
+ import { jsx as jsx270, jsxs as jsxs213 } from "react/jsx-runtime";
30512
30620
  function displaySiteUrl(url) {
30513
30621
  return url.replace(/^https?:\/\//, "").replace(/\/$/, "");
30514
30622
  }
@@ -30523,30 +30631,30 @@ function RemoteAccessRequestCard({
30523
30631
  const { organizationName } = party;
30524
30632
  const siteUrl = party.organizationSiteUrl ?? void 0;
30525
30633
  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) })
30634
+ 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: [
30635
+ /* @__PURE__ */ jsx270("h1", { className: "w-full text-ods-text-primary text-h2", children: "Your IT support team is requesting remote access" }),
30636
+ /* @__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: [
30637
+ /* @__PURE__ */ jsx270(RemoteSessionOrgLogo, { name: organizationName, logoUrl: party.organizationLogoUrl, sizePx: 64 }),
30638
+ /* @__PURE__ */ jsxs213("div", { className: "flex min-w-0 flex-1 flex-col", children: [
30639
+ /* @__PURE__ */ jsx270("p", { className: "w-full truncate text-ods-text-primary text-h3", children: organizationName }),
30640
+ siteUrl && /* @__PURE__ */ jsx270("p", { className: "w-full truncate text-ods-text-secondary text-h4", children: displaySiteUrl(siteUrl) })
30533
30641
  ] }),
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" }) })
30642
+ 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
30643
  ] }),
30536
- /* @__PURE__ */ jsxs212("p", { className: "w-full text-ods-text-primary text-h4", children: [
30644
+ /* @__PURE__ */ jsxs213("p", { className: "w-full text-ods-text-primary text-h4", children: [
30537
30645
  "A technician from ",
30538
- /* @__PURE__ */ jsx269("span", { className: "text-ods-accent", children: organizationName }),
30646
+ /* @__PURE__ */ jsx270("span", { className: "text-ods-accent", children: organizationName }),
30539
30647
  " will be able to view your screen and control your mouse and keyboard during this session."
30540
30648
  ] }),
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." })
30649
+ /* @__PURE__ */ jsxs213("div", { className: "flex w-full flex-col gap-[var(--spacing-system-xs)]", children: [
30650
+ 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: [
30651
+ /* @__PURE__ */ jsx270(InfoCircleIcon, { size: 24, color: "currentColor", className: "shrink-0 text-ods-accent" }),
30652
+ /* @__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
30653
  ] }),
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." })
30654
+ 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
30655
  ] }),
30548
- /* @__PURE__ */ jsxs212("div", { className: "flex w-full items-stretch gap-[var(--spacing-system-l)]", children: [
30549
- /* @__PURE__ */ jsx269(
30656
+ /* @__PURE__ */ jsxs213("div", { className: "flex w-full items-stretch gap-[var(--spacing-system-l)]", children: [
30657
+ /* @__PURE__ */ jsx270(
30550
30658
  Button,
30551
30659
  {
30552
30660
  variant: "outline",
@@ -30557,7 +30665,7 @@ function RemoteAccessRequestCard({
30557
30665
  children: "Decline"
30558
30666
  }
30559
30667
  ),
30560
- /* @__PURE__ */ jsx269(
30668
+ /* @__PURE__ */ jsx270(
30561
30669
  Button,
30562
30670
  {
30563
30671
  variant: "accent",
@@ -30574,10 +30682,10 @@ function RemoteAccessRequestCard({
30574
30682
 
30575
30683
  // src/components/features/remote-session/remote-session-block.tsx
30576
30684
  import { forwardRef as forwardRef31 } from "react";
30577
- import { jsx as jsx270, jsxs as jsxs213 } from "react/jsx-runtime";
30685
+ import { jsx as jsx271, jsxs as jsxs214 } from "react/jsx-runtime";
30578
30686
  var RemoteSessionBlockFrame = forwardRef31(
30579
30687
  ({ children, expanded = false, onHide, className }, ref) => {
30580
- return /* @__PURE__ */ jsxs213(
30688
+ return /* @__PURE__ */ jsxs214(
30581
30689
  "div",
30582
30690
  {
30583
30691
  ref,
@@ -30588,16 +30696,16 @@ var RemoteSessionBlockFrame = forwardRef31(
30588
30696
  ),
30589
30697
  children: [
30590
30698
  children,
30591
- /* @__PURE__ */ jsxs213(
30699
+ /* @__PURE__ */ jsxs214(
30592
30700
  "button",
30593
30701
  {
30594
30702
  type: "button",
30595
30703
  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
30704
  onClick: onHide,
30597
30705
  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" })
30706
+ /* @__PURE__ */ jsx271(Chevrons03RightIcon, { size: 24 }),
30707
+ /* @__PURE__ */ jsx271("span", { className: "min-w-0 flex-1 truncate text-left text-ods-text-secondary text-h4", children: "Hide this Block" }),
30708
+ /* @__PURE__ */ jsx271(OpenFrameLogo, { className: "size-6 shrink-0" })
30601
30709
  ]
30602
30710
  }
30603
30711
  )
@@ -30608,12 +30716,12 @@ var RemoteSessionBlockFrame = forwardRef31(
30608
30716
  );
30609
30717
  RemoteSessionBlockFrame.displayName = "RemoteSessionBlockFrame";
30610
30718
  function RemoteSessionEndButton({ onEndSession }) {
30611
- return /* @__PURE__ */ jsx270(
30719
+ return /* @__PURE__ */ jsx271(
30612
30720
  Button,
30613
30721
  {
30614
30722
  variant: "outline",
30615
30723
  fullWidth: true,
30616
- leftIcon: /* @__PURE__ */ jsx270(MonitorOffIcon, { size: 24, color: "currentColor", className: "text-ods-error" }),
30724
+ leftIcon: /* @__PURE__ */ jsx271(MonitorOffIcon, { size: 24, color: "currentColor", className: "text-ods-error" }),
30617
30725
  onClick: onEndSession,
30618
30726
  children: "End Session"
30619
30727
  }
@@ -30623,14 +30731,15 @@ function RemoteSessionSummary({
30623
30731
  party,
30624
30732
  elapsed,
30625
30733
  showRecordingTag = false,
30734
+ viewers,
30626
30735
  onOpenChat,
30627
30736
  onEndSession,
30628
30737
  dragHandlers
30629
30738
  }) {
30630
30739
  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(
30740
+ return /* @__PURE__ */ jsxs214("div", { className: "relative flex flex-col gap-[var(--spacing-system-m)] p-[var(--spacing-system-m)]", children: [
30741
+ /* @__PURE__ */ jsx271(RemoteSessionDragger, { dragHandlers }),
30742
+ /* @__PURE__ */ jsxs214(
30634
30743
  "div",
30635
30744
  {
30636
30745
  className: cn(
@@ -30639,7 +30748,7 @@ function RemoteSessionSummary({
30639
30748
  ),
30640
30749
  ...dragHandlers,
30641
30750
  children: [
30642
- technician ? /* @__PURE__ */ jsx270(
30751
+ technician ? /* @__PURE__ */ jsx271(
30643
30752
  SquareAvatar,
30644
30753
  {
30645
30754
  variant: "round",
@@ -30647,42 +30756,42 @@ function RemoteSessionSummary({
30647
30756
  src: party.technicianAvatarUrl ?? void 0,
30648
30757
  fallback: technician
30649
30758
  }
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: [
30759
+ ) : /* @__PURE__ */ jsx271(RemoteSessionOrgLogo, { name: party.organizationName, logoUrl: party.organizationLogoUrl, sizePx: 48 }),
30760
+ /* @__PURE__ */ jsxs214("div", { className: "flex min-w-0 flex-1 flex-col", children: [
30761
+ /* @__PURE__ */ jsxs214("p", { className: "w-full truncate text-ods-text-primary text-h4", children: [
30653
30762
  technician ? `${technician} connected` : "IT support team is connected",
30654
30763
  " ",
30655
- /* @__PURE__ */ jsxs213("span", { className: "text-ods-text-secondary", children: [
30764
+ /* @__PURE__ */ jsxs214("span", { className: "text-ods-text-secondary", children: [
30656
30765
  "(",
30657
30766
  elapsed,
30658
30767
  ")"
30659
30768
  ] })
30660
30769
  ] }),
30661
- /* @__PURE__ */ jsx270("p", { className: "w-full truncate text-ods-text-secondary text-h4", children: party.organizationName })
30770
+ /* @__PURE__ */ jsx271("p", { className: "w-full truncate text-ods-text-secondary text-h4", children: party.organizationName })
30662
30771
  ] })
30663
30772
  ]
30664
30773
  }
30665
30774
  ),
30666
- showRecordingTag && /* @__PURE__ */ jsx270(RemoteSessionRecordingTag, {}),
30667
- /* @__PURE__ */ jsxs213("div", { className: "flex w-full items-stretch gap-[var(--spacing-system-m)]", children: [
30668
- /* @__PURE__ */ jsx270(
30775
+ /* @__PURE__ */ jsx271(RemoteSessionStatusRow, { showRecordingTag, viewers }),
30776
+ /* @__PURE__ */ jsxs214("div", { className: "flex w-full items-stretch gap-[var(--spacing-system-m)]", children: [
30777
+ /* @__PURE__ */ jsx271(
30669
30778
  Button,
30670
30779
  {
30671
30780
  variant: "outline",
30672
30781
  fullWidth: true,
30673
- leftIcon: /* @__PURE__ */ jsx270(ChatsIcon, { size: 24, color: "currentColor" }),
30782
+ leftIcon: /* @__PURE__ */ jsx271(ChatsIcon, { size: 24, color: "currentColor" }),
30674
30783
  onClick: onOpenChat,
30675
30784
  children: "Open Chat"
30676
30785
  }
30677
30786
  ),
30678
- /* @__PURE__ */ jsx270(RemoteSessionEndButton, { onEndSession })
30787
+ /* @__PURE__ */ jsx271(RemoteSessionEndButton, { onEndSession })
30679
30788
  ] })
30680
30789
  ] });
30681
30790
  }
30682
30791
  var RemoteSessionMinimizedChip = forwardRef31(
30683
30792
  ({ party, onExpand, dragHandlers }, ref) => {
30684
30793
  const technician = party.technicianName;
30685
- return /* @__PURE__ */ jsxs213(
30794
+ return /* @__PURE__ */ jsxs214(
30686
30795
  "button",
30687
30796
  {
30688
30797
  ref,
@@ -30695,7 +30804,7 @@ var RemoteSessionMinimizedChip = forwardRef31(
30695
30804
  onClick: onExpand,
30696
30805
  ...dragHandlers,
30697
30806
  children: [
30698
- technician ? /* @__PURE__ */ jsx270(
30807
+ technician ? /* @__PURE__ */ jsx271(
30699
30808
  SquareAvatar,
30700
30809
  {
30701
30810
  sizePx: 48,
@@ -30703,7 +30812,7 @@ var RemoteSessionMinimizedChip = forwardRef31(
30703
30812
  fallback: technician,
30704
30813
  className: "rounded-none"
30705
30814
  }
30706
- ) : /* @__PURE__ */ jsx270(
30815
+ ) : /* @__PURE__ */ jsx271(
30707
30816
  RemoteSessionOrgLogo,
30708
30817
  {
30709
30818
  name: party.organizationName,
@@ -30712,7 +30821,7 @@ var RemoteSessionMinimizedChip = forwardRef31(
30712
30821
  className: "rounded-none border-0"
30713
30822
  }
30714
30823
  ),
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 }) })
30824
+ /* @__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
30825
  ]
30717
30826
  }
30718
30827
  );
@@ -30722,7 +30831,7 @@ RemoteSessionMinimizedChip.displayName = "RemoteSessionMinimizedChip";
30722
30831
 
30723
30832
  // src/components/features/remote-session/remote-session-chat-panel.tsx
30724
30833
  import { useEffect as useEffect46, useRef as useRef40 } from "react";
30725
- import { jsx as jsx271, jsxs as jsxs214 } from "react/jsx-runtime";
30834
+ import { jsx as jsx272, jsxs as jsxs215 } from "react/jsx-runtime";
30726
30835
  function formatTime2(at) {
30727
30836
  return at.toLocaleTimeString([], { hour: "numeric", minute: "2-digit" });
30728
30837
  }
@@ -30731,6 +30840,7 @@ function RemoteSessionChatPanel({
30731
30840
  elapsed,
30732
30841
  messages,
30733
30842
  showRecordingTag = false,
30843
+ viewers,
30734
30844
  draft,
30735
30845
  onDraftChange,
30736
30846
  onSend,
@@ -30751,10 +30861,10 @@ function RemoteSessionChatPanel({
30751
30861
  onSend(text);
30752
30862
  onDraftChange("");
30753
30863
  };
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(
30864
+ return /* @__PURE__ */ jsxs215("div", { className: "flex min-h-0 flex-1 flex-col", children: [
30865
+ /* @__PURE__ */ jsxs215("div", { className: "relative flex flex-col gap-[var(--spacing-system-m)] p-[var(--spacing-system-m)]", children: [
30866
+ /* @__PURE__ */ jsx272(RemoteSessionDragger, { dragHandlers }),
30867
+ /* @__PURE__ */ jsxs215(
30758
30868
  "div",
30759
30869
  {
30760
30870
  className: cn(
@@ -30763,45 +30873,45 @@ function RemoteSessionChatPanel({
30763
30873
  ),
30764
30874
  ...dragHandlers,
30765
30875
  children: [
30766
- /* @__PURE__ */ jsxs214("p", { className: "w-full truncate text-ods-text-primary text-h4", children: [
30876
+ /* @__PURE__ */ jsxs215("p", { className: "w-full truncate text-ods-text-primary text-h4", children: [
30767
30877
  "Your IT support team is connected ",
30768
- /* @__PURE__ */ jsxs214("span", { className: "text-ods-text-secondary", children: [
30878
+ /* @__PURE__ */ jsxs215("span", { className: "text-ods-text-secondary", children: [
30769
30879
  "(",
30770
30880
  elapsed,
30771
30881
  ")"
30772
30882
  ] })
30773
30883
  ] }),
30774
- /* @__PURE__ */ jsx271("p", { className: "w-full truncate text-ods-text-secondary text-h4", children: "You can end this session at any time" })
30884
+ /* @__PURE__ */ jsx272("p", { className: "w-full truncate text-ods-text-secondary text-h4", children: "You can end this session at any time" })
30775
30885
  ]
30776
30886
  }
30777
30887
  ),
30778
- showRecordingTag && /* @__PURE__ */ jsx271(RemoteSessionRecordingTag, {}),
30779
- /* @__PURE__ */ jsxs214("div", { className: "flex w-full items-stretch gap-[var(--spacing-system-m)]", children: [
30780
- /* @__PURE__ */ jsx271(
30888
+ /* @__PURE__ */ jsx272(RemoteSessionStatusRow, { showRecordingTag, viewers }),
30889
+ /* @__PURE__ */ jsxs215("div", { className: "flex w-full items-stretch gap-[var(--spacing-system-m)]", children: [
30890
+ /* @__PURE__ */ jsx272(
30781
30891
  Button,
30782
30892
  {
30783
30893
  variant: "outline",
30784
30894
  fullWidth: true,
30785
- leftIcon: /* @__PURE__ */ jsx271(MessageOffIcon, { size: 24, color: "currentColor" }),
30895
+ leftIcon: /* @__PURE__ */ jsx272(MessageOffIcon, { size: 24, color: "currentColor" }),
30786
30896
  onClick: onCloseChat,
30787
30897
  children: "Close Chat"
30788
30898
  }
30789
30899
  ),
30790
- /* @__PURE__ */ jsx271(RemoteSessionEndButton, { onEndSession })
30900
+ /* @__PURE__ */ jsx272(RemoteSessionEndButton, { onEndSession })
30791
30901
  ] })
30792
30902
  ] }),
30793
- /* @__PURE__ */ jsx271(
30903
+ /* @__PURE__ */ jsx272(
30794
30904
  "div",
30795
30905
  {
30796
30906
  ref: listRef,
30797
30907
  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)
30908
+ children: /* @__PURE__ */ jsx272("div", { className: "mt-auto flex flex-col gap-[var(--spacing-system-s)]", children: messages.map(
30909
+ (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
30910
  ) })
30801
30911
  }
30802
30912
  ),
30803
- error && /* @__PURE__ */ jsx271("p", { className: "bg-ods-card px-[var(--spacing-system-m)] text-ods-error text-h6", children: error }),
30804
- /* @__PURE__ */ jsxs214(
30913
+ error && /* @__PURE__ */ jsx272("p", { className: "bg-ods-card px-[var(--spacing-system-m)] text-ods-error text-h6", children: error }),
30914
+ /* @__PURE__ */ jsxs215(
30805
30915
  "form",
30806
30916
  {
30807
30917
  className: "flex items-center gap-[var(--spacing-system-xs)] bg-ods-card px-[var(--spacing-system-m)] pb-[var(--spacing-system-m)]",
@@ -30810,7 +30920,7 @@ function RemoteSessionChatPanel({
30810
30920
  handleSend();
30811
30921
  },
30812
30922
  children: [
30813
- /* @__PURE__ */ jsx271(
30923
+ /* @__PURE__ */ jsx272(
30814
30924
  "input",
30815
30925
  {
30816
30926
  value: draft,
@@ -30821,14 +30931,14 @@ function RemoteSessionChatPanel({
30821
30931
  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
30932
  }
30823
30933
  ),
30824
- /* @__PURE__ */ jsx271(
30934
+ /* @__PURE__ */ jsx272(
30825
30935
  "button",
30826
30936
  {
30827
30937
  type: "submit",
30828
30938
  "aria-label": "Send message",
30829
30939
  disabled: !ready,
30830
30940
  className: "flex size-12 shrink-0 items-center justify-center",
30831
- children: /* @__PURE__ */ jsx271(Send03Icon, { size: 24, color: "currentColor", className: "text-ods-text-primary" })
30941
+ children: /* @__PURE__ */ jsx272(Send03Icon, { size: 24, color: "currentColor", className: "text-ods-text-primary" })
30832
30942
  }
30833
30943
  )
30834
30944
  ]
@@ -30842,9 +30952,9 @@ function RemoteSessionChatMessageRow({
30842
30952
  }) {
30843
30953
  const isTechnician = message.author === "technician";
30844
30954
  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(
30955
+ return /* @__PURE__ */ jsxs215("div", { className: "flex w-full flex-col", children: [
30956
+ /* @__PURE__ */ jsxs215("div", { className: "flex w-full items-center gap-[var(--spacing-system-xs)]", children: [
30957
+ isTechnician && /* @__PURE__ */ jsx272(
30848
30958
  SquareAvatar,
30849
30959
  {
30850
30960
  variant: "round",
@@ -30853,7 +30963,7 @@ function RemoteSessionChatMessageRow({
30853
30963
  fallback: technician
30854
30964
  }
30855
30965
  ),
30856
- /* @__PURE__ */ jsx271(
30966
+ /* @__PURE__ */ jsx272(
30857
30967
  "span",
30858
30968
  {
30859
30969
  className: cn(
@@ -30863,14 +30973,14 @@ function RemoteSessionChatMessageRow({
30863
30973
  children: isTechnician ? technician : "User"
30864
30974
  }
30865
30975
  ),
30866
- /* @__PURE__ */ jsx271("span", { className: "shrink-0 text-ods-text-secondary text-h6", children: formatTime2(message.at) })
30976
+ /* @__PURE__ */ jsx272("span", { className: "shrink-0 text-ods-text-secondary text-h6", children: formatTime2(message.at) })
30867
30977
  ] }),
30868
- /* @__PURE__ */ jsx271("p", { className: "w-full break-words text-ods-text-primary text-h6", children: message.text })
30978
+ /* @__PURE__ */ jsx272("p", { className: "w-full break-words text-ods-text-primary text-h6", children: message.text })
30869
30979
  ] });
30870
30980
  }
30871
30981
 
30872
30982
  // src/components/features/remote-session/remote-session-dialog.tsx
30873
- import { jsx as jsx272, jsxs as jsxs215 } from "react/jsx-runtime";
30983
+ import { jsx as jsx273, jsxs as jsxs216 } from "react/jsx-runtime";
30874
30984
  var NOTICE_COPY = {
30875
30985
  "session-ended": { title: "Remote session ended", suffix: "has disconnected from your device." },
30876
30986
  "connection-lost": { title: "Connection lost", suffix: "lost the connection to your device." }
@@ -30883,49 +30993,315 @@ function RemoteSessionDialog({
30883
30993
  onClose
30884
30994
  }) {
30885
30995
  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." })
30996
+ return /* @__PURE__ */ jsxs216(DialogCard, { children: [
30997
+ /* @__PURE__ */ jsxs216("div", { className: "flex w-full flex-col gap-[var(--spacing-system-xs)]", children: [
30998
+ /* @__PURE__ */ jsx273("h1", { className: "w-full text-ods-text-primary text-h2", children: "End remote session?" }),
30999
+ /* @__PURE__ */ jsx273("p", { className: "w-full text-ods-text-primary text-h4", children: "The technician will lose access to your device immediately." })
30890
31000
  ] }),
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" })
31001
+ /* @__PURE__ */ jsxs216("div", { className: "flex w-full items-stretch gap-[var(--spacing-system-l)]", children: [
31002
+ /* @__PURE__ */ jsx273(Button, { variant: "outline", fullWidth: true, disabled: ending, onClick: onClose, children: "Cancel" }),
31003
+ /* @__PURE__ */ jsx273(Button, { variant: "destructive", fullWidth: true, loading: ending, onClick: onEndSession, children: "End Session" })
30894
31004
  ] })
30895
31005
  ] });
30896
31006
  }
30897
31007
  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 }),
31008
+ return /* @__PURE__ */ jsxs216(DialogCard, { children: [
31009
+ /* @__PURE__ */ jsxs216("div", { className: "flex w-full flex-col gap-[var(--spacing-system-xs)]", children: [
31010
+ /* @__PURE__ */ jsx273("h1", { className: "w-full text-ods-text-primary text-h2", children: copy.title }),
31011
+ /* @__PURE__ */ jsxs216("p", { className: "w-full text-ods-text-primary text-h4", children: [
31012
+ /* @__PURE__ */ jsx273("span", { className: "text-ods-accent", children: organizationName }),
30903
31013
  " ",
30904
31014
  copy.suffix
30905
31015
  ] })
30906
31016
  ] }),
30907
- /* @__PURE__ */ jsx272("div", { className: "flex w-full justify-end", children: /* @__PURE__ */ jsx272(Button, { variant: "outline", className: "w-1/2", onClick: onClose, children: "Close" }) })
31017
+ /* @__PURE__ */ jsx273("div", { className: "flex w-full justify-end", children: /* @__PURE__ */ jsx273(Button, { variant: "outline", className: "w-1/2", onClick: onClose, children: "Close" }) })
30908
31018
  ] });
30909
31019
  }
30910
31020
  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 });
31021
+ 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
31022
  }
30913
31023
 
30914
31024
  // src/components/features/remote-session/remote-session-overlay.tsx
30915
- import { jsx as jsx273, jsxs as jsxs216 } from "react/jsx-runtime";
31025
+ import { jsx as jsx274, jsxs as jsxs217 } from "react/jsx-runtime";
30916
31026
  function RemoteSessionBorder({ className }) {
30917
- return /* @__PURE__ */ jsx273("div", { className: cn("pointer-events-none size-full border-4 border-ods-warning", className) });
31027
+ return /* @__PURE__ */ jsx274("div", { className: cn("pointer-events-none size-full border-4 border-ods-warning", className) });
30918
31028
  }
30919
31029
  function RemoteSessionPill({ onEndSession }) {
30920
- return /* @__PURE__ */ jsxs216(
31030
+ return /* @__PURE__ */ jsxs217(
30921
31031
  "button",
30922
31032
  {
30923
31033
  type: "button",
30924
31034
  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
31035
  onClick: onEndSession,
30926
31036
  children: [
30927
- /* @__PURE__ */ jsx273(MonitorOffIcon, { size: 24, color: "currentColor" }),
30928
- /* @__PURE__ */ jsx273("span", { className: "whitespace-nowrap text-h3", children: "End Session" })
31037
+ /* @__PURE__ */ jsx274(MonitorOffIcon, { size: 24, color: "currentColor" }),
31038
+ /* @__PURE__ */ jsx274("span", { className: "whitespace-nowrap text-h3", children: "End Session" })
31039
+ ]
31040
+ }
31041
+ );
31042
+ }
31043
+
31044
+ // src/components/features/remote-session/remote-session-keep-modals.tsx
31045
+ import { useState as useState79 } from "react";
31046
+ import { jsx as jsx275, jsxs as jsxs218 } from "react/jsx-runtime";
31047
+ var REMOTE_SESSION_KEEP_REASON_LABELS = {
31048
+ CLIENT_DISPUTE: "Client dispute",
31049
+ INTERNAL_REVIEW: "Internal review",
31050
+ LEGAL_OR_COMPLIANCE: "Legal or compliance request",
31051
+ OTHER: "Other"
31052
+ };
31053
+ var KEEP_REASONS = Object.keys(REMOTE_SESSION_KEEP_REASON_LABELS);
31054
+ var DESCRIPTION_MAX_LENGTH = 500;
31055
+ function KeepNotice({ icon, title, children }) {
31056
+ 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: [
31057
+ /* @__PURE__ */ jsx275("span", { className: "flex shrink-0 text-ods-text-secondary", children: icon }),
31058
+ /* @__PURE__ */ jsxs218("div", { className: "flex min-w-0 flex-1 flex-col", children: [
31059
+ /* @__PURE__ */ jsx275("p", { className: "text-ods-text-primary text-h3", children: title }),
31060
+ /* @__PURE__ */ jsx275("p", { className: "text-ods-text-secondary text-h4", children })
31061
+ ] })
31062
+ ] });
31063
+ }
31064
+ function KeepRecordingModal({
31065
+ isOpen,
31066
+ onClose,
31067
+ keptUsage,
31068
+ isPending = false,
31069
+ onConfirm
31070
+ }) {
31071
+ const [reason, setReason] = useState79("");
31072
+ const [description, setDescription] = useState79("");
31073
+ const [seededOpen, setSeededOpen] = useState79(isOpen);
31074
+ if (seededOpen !== isOpen) {
31075
+ setSeededOpen(isOpen);
31076
+ if (isOpen) {
31077
+ setReason("");
31078
+ setDescription("");
31079
+ }
31080
+ }
31081
+ const trimmed = description.trim();
31082
+ const canKeep = reason !== "" && (reason !== "OTHER" || trimmed !== "");
31083
+ const handleKeep = () => {
31084
+ if (!canKeep || isPending) return;
31085
+ onConfirm({ reason, description: reason === "OTHER" ? trimmed : null });
31086
+ };
31087
+ return /* @__PURE__ */ jsxs218(Modal, { isOpen, onClose: isPending ? () => {
31088
+ } : onClose, className: "text-left md:max-w-[600px]", children: [
31089
+ /* @__PURE__ */ jsx275(ModalHeader, { children: /* @__PURE__ */ jsx275(ModalTitle, { children: "Keep this recording" }) }),
31090
+ /* @__PURE__ */ jsxs218(
31091
+ KeepNotice,
31092
+ {
31093
+ icon: /* @__PURE__ */ jsx275(InfoCircleIcon, { size: 24, color: "currentColor" }),
31094
+ title: "This recording won't be deleted automatically",
31095
+ children: [
31096
+ "It stays until you stop keeping it. Kept recordings use ",
31097
+ keptUsage,
31098
+ "."
31099
+ ]
31100
+ }
31101
+ ),
31102
+ /* @__PURE__ */ jsxs218("div", { className: "flex w-full flex-col gap-[var(--spacing-system-xs)]", children: [
31103
+ /* @__PURE__ */ jsxs218(
31104
+ Select,
31105
+ {
31106
+ value: reason,
31107
+ onValueChange: (value) => setReason(value),
31108
+ disabled: isPending,
31109
+ children: [
31110
+ /* @__PURE__ */ jsx275(SelectTrigger, { label: "Reason", labelVariant: "large", children: /* @__PURE__ */ jsx275(SelectValue, { placeholder: "Select Reason" }) }),
31111
+ /* @__PURE__ */ jsx275(SelectContent, { children: KEEP_REASONS.map((value) => /* @__PURE__ */ jsx275(SelectItem, { value, children: REMOTE_SESSION_KEEP_REASON_LABELS[value] }, value)) })
31112
+ ]
31113
+ }
31114
+ ),
31115
+ reason === "OTHER" && /* @__PURE__ */ jsx275(
31116
+ Input,
31117
+ {
31118
+ "aria-label": "Reason description",
31119
+ value: description,
31120
+ onChange: (event) => setDescription(event.target.value),
31121
+ placeholder: "Briefly describe what's going on",
31122
+ maxLength: DESCRIPTION_MAX_LENGTH,
31123
+ disabled: isPending
31124
+ }
31125
+ )
31126
+ ] }),
31127
+ /* @__PURE__ */ jsxs218(ModalFooter, { children: [
31128
+ /* @__PURE__ */ jsx275(Button, { type: "button", variant: "outline", onClick: onClose, disabled: isPending, className: "flex-1 md:hidden", children: "Cancel" }),
31129
+ /* @__PURE__ */ jsx275("div", { className: "hidden flex-1 md:block" }),
31130
+ /* @__PURE__ */ jsx275(
31131
+ Button,
31132
+ {
31133
+ type: "button",
31134
+ variant: "accent",
31135
+ onClick: handleKeep,
31136
+ loading: isPending,
31137
+ disabled: !canKeep,
31138
+ className: "flex-1",
31139
+ children: "Keep"
31140
+ }
31141
+ )
31142
+ ] })
31143
+ ] });
31144
+ }
31145
+ function ReleaseKeepingModal({
31146
+ isOpen,
31147
+ onClose,
31148
+ keptBy,
31149
+ keptOn,
31150
+ reason,
31151
+ ticket,
31152
+ expiresOn,
31153
+ dueOn,
31154
+ isPending = false,
31155
+ onConfirm
31156
+ }) {
31157
+ return /* @__PURE__ */ jsxs218(Modal, { isOpen, onClose: isPending ? () => {
31158
+ } : onClose, className: "text-left md:max-w-[600px]", children: [
31159
+ /* @__PURE__ */ jsx275(ModalHeader, { children: /* @__PURE__ */ jsx275(ModalTitle, { children: "Release Keeping" }) }),
31160
+ /* @__PURE__ */ jsxs218("div", { className: "flex w-full flex-col gap-[var(--spacing-system-xsf)] text-ods-text-primary text-h4", children: [
31161
+ /* @__PURE__ */ jsxs218("p", { children: [
31162
+ "Kept by ",
31163
+ keptBy,
31164
+ " on ",
31165
+ keptOn,
31166
+ " for ",
31167
+ reason,
31168
+ "."
31169
+ ] }),
31170
+ ticket && /* @__PURE__ */ jsxs218("p", { children: [
31171
+ "Ticket: ",
31172
+ ticket
31173
+ ] })
31174
+ ] }),
31175
+ /* @__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." }),
31176
+ /* @__PURE__ */ jsxs218(ModalFooter, { children: [
31177
+ /* @__PURE__ */ jsx275(Button, { type: "button", variant: "outline", onClick: onClose, disabled: isPending, className: "flex-1 md:hidden", children: "Cancel" }),
31178
+ /* @__PURE__ */ jsx275("div", { className: "hidden flex-1 md:block" }),
31179
+ /* @__PURE__ */ jsx275(Button, { type: "button", variant: "accent", onClick: onConfirm, loading: isPending, className: "flex-1", children: "Release Keeping" })
31180
+ ] })
31181
+ ] });
31182
+ }
31183
+
31184
+ // src/components/features/remote-session/remote-session-events.tsx
31185
+ import { jsx as jsx276, jsxs as jsxs219 } from "react/jsx-runtime";
31186
+ function formatRemoteSessionOffset(offsetMs) {
31187
+ const total = Math.max(0, Math.floor(offsetMs / 1e3));
31188
+ const hours = Math.floor(total / 3600);
31189
+ const minutes = String(Math.floor(total % 3600 / 60)).padStart(2, "0");
31190
+ const seconds = String(total % 60).padStart(2, "0");
31191
+ return hours > 0 ? `${hours}:${minutes}:${seconds}` : `${minutes}:${seconds}`;
31192
+ }
31193
+ function RemoteSessionEventList({ events, activeEventId, onSelect, className }) {
31194
+ return /* @__PURE__ */ jsxs219("section", { className: cn("flex w-full flex-col gap-[var(--spacing-system-xxs)]", className), children: [
31195
+ /* @__PURE__ */ jsx276("h2", { className: "text-ods-text-secondary text-h5", children: "Session Events" }),
31196
+ /* @__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(
31197
+ "button",
31198
+ {
31199
+ type: "button",
31200
+ "aria-current": event.id === activeEventId || void 0,
31201
+ onClick: () => onSelect?.(event),
31202
+ className: cn(
31203
+ "flex w-full items-start gap-[var(--spacing-system-xxs)] rounded-md p-[var(--spacing-system-xxs)] text-left outline-none transition-colors",
31204
+ "hover:bg-ods-bg-hover focus-visible:ring-2 focus-visible:ring-ods-focus",
31205
+ event.id === activeEventId && "bg-ods-border hover:bg-ods-border"
31206
+ ),
31207
+ children: [
31208
+ /* @__PURE__ */ jsx276("span", { className: "w-[84px] shrink-0 text-ods-text-secondary text-h4", children: formatRemoteSessionOffset(event.offsetMs) }),
31209
+ /* @__PURE__ */ jsxs219("span", { className: "flex min-w-0 flex-1 flex-col", children: [
31210
+ /* @__PURE__ */ jsx276("span", { className: "text-ods-text-primary text-h4", children: event.title }),
31211
+ event.detail && /* @__PURE__ */ jsx276("span", { className: "text-ods-text-secondary text-h6", children: event.detail })
31212
+ ] })
31213
+ ]
31214
+ }
31215
+ ) }, event.id)) })
31216
+ ] });
31217
+ }
31218
+ function RemoteSessionTimelineMarkers({
31219
+ events,
31220
+ durationMs,
31221
+ onSelect,
31222
+ className
31223
+ }) {
31224
+ if (durationMs <= 0) return null;
31225
+ return /* @__PURE__ */ jsx276("div", { className: cn("relative h-4 w-full", className), children: events.map((event) => {
31226
+ const share = Math.min(1, Math.max(0, event.offsetMs / durationMs));
31227
+ const label = `${event.title} at ${formatRemoteSessionOffset(event.offsetMs)}`;
31228
+ return /* @__PURE__ */ jsx276(
31229
+ "button",
31230
+ {
31231
+ type: "button",
31232
+ "aria-label": label,
31233
+ title: label,
31234
+ onClick: () => onSelect?.(event),
31235
+ style: { left: `${share * 100}%` },
31236
+ 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"
31237
+ },
31238
+ event.id
31239
+ );
31240
+ }) });
31241
+ }
31242
+
31243
+ // src/components/features/remote-session/remote-session-status.tsx
31244
+ import { jsx as jsx277, jsxs as jsxs220 } from "react/jsx-runtime";
31245
+ function LiveDot() {
31246
+ return /* @__PURE__ */ jsx277("span", { "aria-hidden": true, className: "size-2 animate-live-pulse rounded-full bg-current motion-reduce:animate-none" });
31247
+ }
31248
+ var STATUS_TAG = {
31249
+ live: { label: "Live", variant: "critical" },
31250
+ processing: { label: "Processing", variant: "warning" },
31251
+ failed: { label: "Failed", variant: "error" }
31252
+ };
31253
+ function RemoteSessionStatusTag({ status, className }) {
31254
+ const { label, variant } = STATUS_TAG[status];
31255
+ return /* @__PURE__ */ jsx277(
31256
+ Tag,
31257
+ {
31258
+ label,
31259
+ variant,
31260
+ icon: status === "live" ? /* @__PURE__ */ jsx277(LiveDot, {}) : void 0,
31261
+ className: cn("pointer-events-none shrink-0", className)
31262
+ }
31263
+ );
31264
+ }
31265
+ function RemoteSessionExpiry(props) {
31266
+ const { className } = props;
31267
+ if (props.state === "none") {
31268
+ return /* @__PURE__ */ jsx277("p", { className: cn("text-ods-text-primary text-h4", className), children: "-" });
31269
+ }
31270
+ if (props.state === "expired") {
31271
+ return /* @__PURE__ */ jsx277("p", { className: cn("text-ods-text-secondary text-h4", className), children: "Expired" });
31272
+ }
31273
+ if (props.state === "kept") {
31274
+ return /* @__PURE__ */ jsxs220("div", { className: cn("flex min-w-0 flex-col", className), children: [
31275
+ /* @__PURE__ */ jsxs220("p", { className: "flex items-center gap-[var(--spacing-system-xxs)] text-ods-text-primary text-h4", children: [
31276
+ /* @__PURE__ */ jsx277(LockIcon, { size: 24, color: "currentColor", className: "shrink-0" }),
31277
+ "Kept"
31278
+ ] }),
31279
+ /* @__PURE__ */ jsxs220("p", { className: "truncate text-ods-text-secondary text-h6", children: [
31280
+ "Kept by ",
31281
+ props.keptBy,
31282
+ " \xB7 ",
31283
+ props.reason
31284
+ ] })
31285
+ ] });
31286
+ }
31287
+ return /* @__PURE__ */ jsxs220("div", { className: cn("flex min-w-0 flex-col", className), children: [
31288
+ /* @__PURE__ */ jsx277("p", { className: "text-ods-text-primary text-h4", children: props.date }),
31289
+ props.remaining && /* @__PURE__ */ jsx277("p", { className: "truncate text-ods-text-secondary text-h6", children: props.remaining })
31290
+ ] });
31291
+ }
31292
+ function RemoteSessionStorageAlert({ scope, capacity, className }) {
31293
+ 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.` : ""}`;
31294
+ return /* @__PURE__ */ jsxs220(
31295
+ "div",
31296
+ {
31297
+ role: "alert",
31298
+ className: cn(
31299
+ "flex w-full items-start gap-[var(--spacing-system-m)] rounded-md bg-ods-warning-secondary p-[var(--spacing-system-s)] text-ods-warning",
31300
+ className
31301
+ ),
31302
+ children: [
31303
+ /* @__PURE__ */ jsx277(AlertTriangleIcon, { size: 24, color: "currentColor", className: "shrink-0" }),
31304
+ /* @__PURE__ */ jsx277("p", { className: "min-w-0 flex-1 text-h3", children: message })
30929
31305
  ]
30930
31306
  }
30931
31307
  );
@@ -30935,7 +31311,7 @@ function RemoteSessionPill({ onEndSession }) {
30935
31311
  import { combine as combine3 } from "@atlaskit/pragmatic-drag-and-drop/combine";
30936
31312
  import { monitorForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
30937
31313
  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";
31314
+ import { Fragment as Fragment50, useCallback as useCallback29, useEffect as useEffect50, useMemo as useMemo25, useRef as useRef45, useState as useState84 } from "react";
30939
31315
  import { createPortal } from "react-dom";
30940
31316
 
30941
31317
  // src/utils/auto-scroll-ancestors.ts
@@ -31048,10 +31424,10 @@ function aimToChange(columns, ticketId, aim) {
31048
31424
  // src/components/features/board/board-column.tsx
31049
31425
  import { attachClosestEdge as attachClosestEdge2 } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
31050
31426
  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";
31427
+ import { memo as memo6, useCallback as useCallback27, useEffect as useEffect48, useRef as useRef43, useState as useState82 } from "react";
31052
31428
 
31053
31429
  // src/components/features/board/board-column-header.tsx
31054
- import { jsx as jsx274, jsxs as jsxs217 } from "react/jsx-runtime";
31430
+ import { jsx as jsx278, jsxs as jsxs221 } from "react/jsx-runtime";
31055
31431
  function BoardColumnHeader({
31056
31432
  column,
31057
31433
  collapsed = false,
@@ -31064,8 +31440,8 @@ function BoardColumnHeader({
31064
31440
  const useStatusVariant = resolveTicketStatus(tagStatus) !== null;
31065
31441
  const actionClass = "h-8 w-8 p-0 md:h-8 md:w-8";
31066
31442
  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(
31443
+ return /* @__PURE__ */ jsxs221("div", { className: "flex h-full flex-col items-center gap-[var(--spacing-system-xsf)]", children: [
31444
+ onToggleCollapse && /* @__PURE__ */ jsx278(
31069
31445
  Button,
31070
31446
  {
31071
31447
  variant: "transparent",
@@ -31073,10 +31449,10 @@ function BoardColumnHeader({
31073
31449
  className: actionClass,
31074
31450
  onClick: onToggleCollapse,
31075
31451
  "aria-label": "Expand column",
31076
- children: /* @__PURE__ */ jsx274(Arrow02RightIcon, { className: "h-6 w-6 text-ods-text-secondary" })
31452
+ children: /* @__PURE__ */ jsx278(Arrow02RightIcon, { className: "h-6 w-6 text-ods-text-secondary" })
31077
31453
  }
31078
31454
  ),
31079
- /* @__PURE__ */ jsx274(
31455
+ /* @__PURE__ */ jsx278(
31080
31456
  TicketStatusTag,
31081
31457
  {
31082
31458
  status: tagStatus,
@@ -31085,17 +31461,17 @@ function BoardColumnHeader({
31085
31461
  className: "h-auto [writing-mode:vertical-rl]"
31086
31462
  }
31087
31463
  ),
31088
- /* @__PURE__ */ jsx274("span", { className: "text-h5", style: { color: column.color }, children: count })
31464
+ /* @__PURE__ */ jsx278("span", { className: "text-h5", style: { color: column.color }, children: count })
31089
31465
  ] });
31090
31466
  }
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 })
31467
+ return /* @__PURE__ */ jsxs221("div", { className: "flex items-center gap-[var(--spacing-system-xsf)]", children: [
31468
+ /* @__PURE__ */ jsxs221("div", { className: "flex min-w-0 flex-1 items-center gap-[var(--spacing-system-xsf)]", children: [
31469
+ /* @__PURE__ */ jsx278(TicketStatusTag, { status: tagStatus, label: column.label, color: useStatusVariant ? void 0 : column.color }),
31470
+ /* @__PURE__ */ jsx278("span", { className: "text-h5", style: useStatusVariant ? void 0 : { color: column.color }, children: count })
31095
31471
  ] }),
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(
31472
+ /* @__PURE__ */ jsxs221("div", { className: "flex shrink-0 items-center gap-[var(--spacing-system-xxs)]", children: [
31473
+ 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" }) }) }),
31474
+ onToggleCollapse && /* @__PURE__ */ jsx278(
31099
31475
  Button,
31100
31476
  {
31101
31477
  variant: "transparent",
@@ -31103,10 +31479,10 @@ function BoardColumnHeader({
31103
31479
  className: actionClass,
31104
31480
  onClick: onToggleCollapse,
31105
31481
  "aria-label": "Collapse column",
31106
- children: /* @__PURE__ */ jsx274(Arrow02LeftIcon, { className: "h-6 w-6 text-ods-text-secondary" })
31482
+ children: /* @__PURE__ */ jsx278(Arrow02LeftIcon, { className: "h-6 w-6 text-ods-text-secondary" })
31107
31483
  }
31108
31484
  ),
31109
- onArchive && /* @__PURE__ */ jsx274(
31485
+ onArchive && /* @__PURE__ */ jsx278(
31110
31486
  Button,
31111
31487
  {
31112
31488
  variant: "transparent",
@@ -31114,10 +31490,10 @@ function BoardColumnHeader({
31114
31490
  className: actionClass,
31115
31491
  onClick: onArchive,
31116
31492
  "aria-label": "Archive resolved tickets",
31117
- children: /* @__PURE__ */ jsx274(BoxArchiveIcon, { className: "h-6 w-6 text-ods-text-secondary" })
31493
+ children: /* @__PURE__ */ jsx278(BoxArchiveIcon, { className: "h-6 w-6 text-ods-text-secondary" })
31118
31494
  }
31119
31495
  ),
31120
- onAddTicket && /* @__PURE__ */ jsx274(
31496
+ onAddTicket && /* @__PURE__ */ jsx278(
31121
31497
  Button,
31122
31498
  {
31123
31499
  variant: "transparent",
@@ -31125,7 +31501,7 @@ function BoardColumnHeader({
31125
31501
  className: actionClass,
31126
31502
  onClick: onAddTicket,
31127
31503
  "aria-label": "Add ticket",
31128
- children: /* @__PURE__ */ jsx274(PlusIcon, { className: "h-6 w-6 text-ods-text-secondary" })
31504
+ children: /* @__PURE__ */ jsx278(PlusIcon, { className: "h-6 w-6 text-ods-text-secondary" })
31129
31505
  }
31130
31506
  )
31131
31507
  ] })
@@ -31224,7 +31600,7 @@ import {
31224
31600
  useEffect as useEffect47,
31225
31601
  useMemo as useMemo24,
31226
31602
  useRef as useRef42,
31227
- useState as useState79
31603
+ useState as useState81
31228
31604
  } from "react";
31229
31605
 
31230
31606
  // src/utils/drag-effect.ts
@@ -31238,14 +31614,14 @@ function holdMoveDragEffect(element) {
31238
31614
  }
31239
31615
 
31240
31616
  // 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";
31617
+ import { useState as useState80 } from "react";
31618
+ import { jsx as jsx279, jsxs as jsxs222 } from "react/jsx-runtime";
31243
31619
  function BoardTicketApproval({ pendingApproval, onApprove, onReject }) {
31244
- const [expanded, setExpanded] = useState78(false);
31620
+ const [expanded, setExpanded] = useState80(false);
31245
31621
  const { innerRef, containerStyle } = useCollapsible({ expanded });
31246
31622
  const isAdmin = pendingApproval.approvalType === "ADMIN";
31247
- return /* @__PURE__ */ jsxs218("div", { className: "pointer-events-auto flex flex-col", children: [
31248
- /* @__PURE__ */ jsxs218(
31623
+ return /* @__PURE__ */ jsxs222("div", { className: "pointer-events-auto flex flex-col", children: [
31624
+ /* @__PURE__ */ jsxs222(
31249
31625
  "button",
31250
31626
  {
31251
31627
  type: "button",
@@ -31253,7 +31629,7 @@ function BoardTicketApproval({ pendingApproval, onApprove, onReject }) {
31253
31629
  "aria-expanded": expanded,
31254
31630
  className: "flex w-full cursor-pointer items-center gap-[var(--spacing-system-xxs)] text-h6",
31255
31631
  children: [
31256
- /* @__PURE__ */ jsxs218(
31632
+ /* @__PURE__ */ jsxs222(
31257
31633
  "span",
31258
31634
  {
31259
31635
  className: cn(
@@ -31261,16 +31637,16 @@ function BoardTicketApproval({ pendingApproval, onApprove, onReject }) {
31261
31637
  isAdmin ? "text-ods-open-yellow" : "text-ods-text-secondary"
31262
31638
  ),
31263
31639
  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" })
31640
+ isAdmin ? /* @__PURE__ */ jsx279(ShieldCheckIcon, { className: "size-4 shrink-0" }) : /* @__PURE__ */ jsx279(DotsLoaderIcon, { size: 16, className: "shrink-0" }),
31641
+ /* @__PURE__ */ jsx279("span", { className: "flex-1 truncate text-left", children: isAdmin ? "Technician approval required" : "Pending client approval" })
31266
31642
  ]
31267
31643
  }
31268
31644
  ),
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" })
31645
+ 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
31646
  ]
31271
31647
  }
31272
31648
  ),
31273
- /* @__PURE__ */ jsx275("div", { style: containerStyle, children: /* @__PURE__ */ jsx275("div", { ref: innerRef, className: "pt-[var(--spacing-system-xs)]", children: /* @__PURE__ */ jsx275(
31649
+ /* @__PURE__ */ jsx279("div", { style: containerStyle, children: /* @__PURE__ */ jsx279("div", { ref: innerRef, className: "pt-[var(--spacing-system-xs)]", children: /* @__PURE__ */ jsx279(
31274
31650
  ApprovalBatchMessage,
31275
31651
  {
31276
31652
  className: "mb-0",
@@ -31323,7 +31699,7 @@ function hasMoveSettled(columns, move) {
31323
31699
  }
31324
31700
 
31325
31701
  // src/components/features/board/ticket-card.tsx
31326
- import { Fragment as Fragment48, jsx as jsx276, jsxs as jsxs219 } from "react/jsx-runtime";
31702
+ import { Fragment as Fragment48, jsx as jsx280, jsxs as jsxs223 } from "react/jsx-runtime";
31327
31703
  var PRIORITY_COLOR_CLASS = {
31328
31704
  low: "text-ods-text-secondary",
31329
31705
  medium: "text-ods-info",
@@ -31355,24 +31731,24 @@ function TicketCardBody({
31355
31731
  const showDeviceRow = !!(ticket.deviceHostnames?.length || ticket.organizationName);
31356
31732
  const deviceText = [ticket.deviceHostnames?.join(", "), ticket.organizationName].filter(Boolean).join(", ");
31357
31733
  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(
31734
+ const rightSection = hasRightSection ? /* @__PURE__ */ jsxs223("div", { className: "pointer-events-auto flex shrink-0 items-center gap-[var(--spacing-system-xsf)]", children: [
31735
+ ticket.priority && /* @__PURE__ */ jsx280(
31360
31736
  Flag02Icon,
31361
31737
  {
31362
31738
  className: cn("size-4", PRIORITY_COLOR_CLASS[ticket.priority]),
31363
31739
  "aria-label": `Priority: ${ticket.priority}`
31364
31740
  }
31365
31741
  ),
31366
- renderAssignSlot ? renderAssignSlot(ticket) : ticket.assignees?.length ? /* @__PURE__ */ jsxs219("div", { className: "flex -space-x-2", children: [
31742
+ renderAssignSlot ? renderAssignSlot(ticket) : ticket.assignees?.length ? /* @__PURE__ */ jsxs223("div", { className: "flex -space-x-2", children: [
31367
31743
  ticket.assignees.slice(0, MAX_VISIBLE_ASSIGNEES).map(
31368
- (a) => a.deleted ? /* @__PURE__ */ jsx276(
31744
+ (a) => a.deleted ? /* @__PURE__ */ jsx280(
31369
31745
  DeletedUserAvatar,
31370
31746
  {
31371
31747
  size: "sm",
31372
31748
  accessibleLabel: `Deleted user: ${a.name ?? a.initials ?? a.id}`
31373
31749
  },
31374
31750
  a.id
31375
- ) : /* @__PURE__ */ jsx276(
31751
+ ) : /* @__PURE__ */ jsx280(
31376
31752
  SquareAvatar,
31377
31753
  {
31378
31754
  src: a.avatarUrl,
@@ -31384,7 +31760,7 @@ function TicketCardBody({
31384
31760
  a.id
31385
31761
  )
31386
31762
  ),
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: [
31763
+ 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
31764
  "+",
31389
31765
  ticket.assignees.length - MAX_VISIBLE_ASSIGNEES
31390
31766
  ] })
@@ -31394,7 +31770,7 @@ function TicketCardBody({
31394
31770
  const tooltipLabel = ticket.createdAt ? formatTicketFullTimestamp(ticket.createdAt) : null;
31395
31771
  const metaLabel = [ticket.ticketNumber || null, timestampLabel].filter(Boolean).join(" \u2022 ");
31396
31772
  const metaClass = "truncate text-ods-text-secondary text-h6";
31397
- const meta = href ? /* @__PURE__ */ jsx276(
31773
+ const meta = href ? /* @__PURE__ */ jsx280(
31398
31774
  next_link_default,
31399
31775
  {
31400
31776
  href,
@@ -31405,28 +31781,28 @@ function TicketCardBody({
31405
31781
  className: cn("pointer-events-auto block", metaClass),
31406
31782
  children: metaLabel
31407
31783
  }
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 })
31784
+ ) : /* @__PURE__ */ jsx280("p", { className: cn(tooltipLabel && "pointer-events-auto", metaClass), children: metaLabel });
31785
+ return /* @__PURE__ */ jsxs223(Fragment48, { children: [
31786
+ /* @__PURE__ */ jsxs223("div", { className: "flex items-start gap-[var(--spacing-system-sf)]", children: [
31787
+ /* @__PURE__ */ jsxs223("div", { className: "flex min-w-0 flex-1 flex-col gap-[var(--spacing-system-zero)]", title: ticket.title, children: [
31788
+ /* @__PURE__ */ jsx280("p", { className: "truncate text-ods-text-primary text-h3", children: ticket.title }),
31789
+ showDeviceRow && /* @__PURE__ */ jsxs223("div", { className: "flex min-w-0 items-center gap-[var(--spacing-system-xxs)] text-ods-text-secondary text-h6", children: [
31790
+ /* @__PURE__ */ jsx280(LaptopIcon, { className: "size-4 shrink-0" }),
31791
+ /* @__PURE__ */ jsx280("span", { className: "truncate", title: deviceText, children: deviceText })
31416
31792
  ] })
31417
31793
  ] }),
31418
31794
  rightSection
31419
31795
  ] }),
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 })
31796
+ ticket.tags?.length ? /* @__PURE__ */ jsx280(TicketTagRow, { tags: ticket.tags }) : null,
31797
+ metaLabel && (tooltipLabel ? /* @__PURE__ */ jsx280(TooltipProvider, { children: /* @__PURE__ */ jsxs223(Tooltip, { children: [
31798
+ /* @__PURE__ */ jsx280(TooltipTrigger, { asChild: true, children: meta }),
31799
+ /* @__PURE__ */ jsx280(TooltipContent, { children: tooltipLabel })
31424
31800
  ] }) }) : 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" })
31801
+ ticket.escalatedByUser && /* @__PURE__ */ jsxs223("div", { className: "flex items-center gap-[var(--spacing-system-xxs)] text-ods-open-yellow text-h6", children: [
31802
+ /* @__PURE__ */ jsx280(UserCheckIcon, { className: "size-4 shrink-0" }),
31803
+ /* @__PURE__ */ jsx280("span", { className: "truncate", children: "Escalated by User" })
31428
31804
  ] }),
31429
- ticket.activity && /* @__PURE__ */ jsxs219(
31805
+ ticket.activity && /* @__PURE__ */ jsxs223(
31430
31806
  "div",
31431
31807
  {
31432
31808
  className: cn(
@@ -31434,32 +31810,32 @@ function TicketCardBody({
31434
31810
  ticket.activity.kind === "stale" ? "text-ods-open-yellow" : "text-ods-text-secondary"
31435
31811
  ),
31436
31812
  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] })
31813
+ ticket.activity.kind === "stale" ? /* @__PURE__ */ jsx280(ClockIcon, { className: "size-4 shrink-0" }) : /* @__PURE__ */ jsx280(DotsLoaderIcon, { className: "size-4 shrink-0" }),
31814
+ /* @__PURE__ */ jsx280("span", { className: "truncate", children: ticket.activity.label ?? ACTIVITY_DEFAULT_LABEL[ticket.activity.kind] })
31439
31815
  ]
31440
31816
  }
31441
31817
  ),
31442
- showNewMessage && /* @__PURE__ */ jsx276(
31818
+ showNewMessage && /* @__PURE__ */ jsx280(
31443
31819
  Tag,
31444
31820
  {
31445
31821
  label: "New Message",
31446
- icon: /* @__PURE__ */ jsx276(MessagesIcon, { size: 16, color: newMessageTextColor }),
31822
+ icon: /* @__PURE__ */ jsx280(MessagesIcon, { size: 16, color: newMessageTextColor }),
31447
31823
  className: "w-fit shrink-0",
31448
31824
  style: { backgroundColor: columnColor, color: newMessageTextColor }
31449
31825
  }
31450
31826
  ),
31451
- ticket.pendingApproval && /* @__PURE__ */ jsx276(BoardTicketApproval, { pendingApproval: ticket.pendingApproval, onApprove, onReject })
31827
+ ticket.pendingApproval && /* @__PURE__ */ jsx280(BoardTicketApproval, { pendingApproval: ticket.pendingApproval, onApprove, onReject })
31452
31828
  ] });
31453
31829
  }
31454
31830
  function TicketCardView({ className, style, ...bodyProps }) {
31455
31831
  const { ticket, columnColor } = bodyProps;
31456
31832
  const showNewMessage = !!ticket.hasNewMessage && !!columnColor;
31457
- return /* @__PURE__ */ jsx276(
31833
+ return /* @__PURE__ */ jsx280(
31458
31834
  "div",
31459
31835
  {
31460
31836
  className: cn(TICKET_CARD_SHELL, className),
31461
31837
  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 }) })
31838
+ children: /* @__PURE__ */ jsx280("div", { className: "relative z-10 flex flex-col gap-[var(--spacing-system-sf)]", children: /* @__PURE__ */ jsx280(TicketCardBody, { ...bodyProps }) })
31463
31839
  }
31464
31840
  );
31465
31841
  }
@@ -31480,7 +31856,7 @@ var TicketCard = memo5(function TicketCardImpl({
31480
31856
  useEffect47(() => {
31481
31857
  ticketRef.current = ticket;
31482
31858
  });
31483
- const [isDragging, setIsDragging] = useState79(false);
31859
+ const [isDragging, setIsDragging] = useState81(false);
31484
31860
  const isLanding = useIsLanding(ticket.id);
31485
31861
  const aim = useDropAim();
31486
31862
  const closestEdge = aim && aim.columnId === columnId && aim.ticketId === ticket.id ? aim.edge : null;
@@ -31574,7 +31950,7 @@ var TicketCard = memo5(function TicketCardImpl({
31574
31950
  [isDragging]
31575
31951
  );
31576
31952
  const body = useMemo24(
31577
- () => /* @__PURE__ */ jsx276(
31953
+ () => /* @__PURE__ */ jsx280(
31578
31954
  TicketCardBody,
31579
31955
  {
31580
31956
  ticket,
@@ -31603,7 +31979,7 @@ var TicketCard = memo5(function TicketCardImpl({
31603
31979
  } else if (isLanding) {
31604
31980
  style.visibility = "hidden";
31605
31981
  }
31606
- const insertionLine = closestEdge ? /* @__PURE__ */ jsx276(
31982
+ const insertionLine = closestEdge ? /* @__PURE__ */ jsx280(
31607
31983
  "span",
31608
31984
  {
31609
31985
  "aria-hidden": true,
@@ -31622,9 +31998,9 @@ var TicketCard = memo5(function TicketCardImpl({
31622
31998
  }
31623
31999
  ) : null;
31624
32000
  if (href) {
31625
- return /* @__PURE__ */ jsxs219("div", { ...outerProps, children: [
32001
+ return /* @__PURE__ */ jsxs223("div", { ...outerProps, children: [
31626
32002
  insertionLine,
31627
- /* @__PURE__ */ jsx276(
32003
+ /* @__PURE__ */ jsx280(
31628
32004
  next_link_default,
31629
32005
  {
31630
32006
  href,
@@ -31637,12 +32013,12 @@ var TicketCard = memo5(function TicketCardImpl({
31637
32013
  className: "absolute inset-0 z-0 rounded-md focus-visible:outline-none"
31638
32014
  }
31639
32015
  ),
31640
- /* @__PURE__ */ jsx276("div", { className: cn("pointer-events-none", innerWrapperClass), children: body })
32016
+ /* @__PURE__ */ jsx280("div", { className: cn("pointer-events-none", innerWrapperClass), children: body })
31641
32017
  ] });
31642
32018
  }
31643
- return /* @__PURE__ */ jsxs219("div", { ...outerProps, children: [
32019
+ return /* @__PURE__ */ jsxs223("div", { ...outerProps, children: [
31644
32020
  insertionLine,
31645
- /* @__PURE__ */ jsx276(
32021
+ /* @__PURE__ */ jsx280(
31646
32022
  "button",
31647
32023
  {
31648
32024
  type: "button",
@@ -31653,23 +32029,23 @@ var TicketCard = memo5(function TicketCardImpl({
31653
32029
  className: "absolute inset-0 z-0 cursor-pointer rounded-md focus-visible:outline-none"
31654
32030
  }
31655
32031
  ),
31656
- /* @__PURE__ */ jsx276("div", { className: cn("pointer-events-none", innerWrapperClass), children: body })
32032
+ /* @__PURE__ */ jsx280("div", { className: cn("pointer-events-none", innerWrapperClass), children: body })
31657
32033
  ] });
31658
32034
  });
31659
32035
  function TicketTagRow({ tags }) {
31660
32036
  const visible = tags.slice(0, MAX_VISIBLE_TAGS);
31661
32037
  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}` })
32038
+ return /* @__PURE__ */ jsxs223("div", { className: "flex h-8 flex-wrap items-start gap-[var(--spacing-system-xxs)] overflow-clip", children: [
32039
+ visible.map((tag) => /* @__PURE__ */ jsx280(Tag, { variant: "outline", label: tag }, tag)),
32040
+ hidden > 0 && /* @__PURE__ */ jsx280(Tag, { variant: "outline", label: `+${hidden}` })
31665
32041
  ] });
31666
32042
  }
31667
32043
 
31668
32044
  // src/components/features/board/ticket-card-skeleton.tsx
31669
32045
  import { forwardRef as forwardRef32 } from "react";
31670
- import { jsx as jsx277, jsxs as jsxs220 } from "react/jsx-runtime";
32046
+ import { jsx as jsx281, jsxs as jsxs224 } from "react/jsx-runtime";
31671
32047
  var TicketCardSkeleton = forwardRef32(
31672
- ({ className, ...props }, ref) => /* @__PURE__ */ jsxs220(
32048
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxs224(
31673
32049
  "div",
31674
32050
  {
31675
32051
  ref,
@@ -31679,22 +32055,22 @@ var TicketCardSkeleton = forwardRef32(
31679
32055
  ),
31680
32056
  ...props,
31681
32057
  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" })
32058
+ /* @__PURE__ */ jsxs224("div", { className: "flex items-start gap-[var(--spacing-system-sf)]", children: [
32059
+ /* @__PURE__ */ jsxs224("div", { className: "flex min-w-0 flex-1 flex-col gap-[var(--spacing-system-xxs)]", children: [
32060
+ /* @__PURE__ */ jsx281("div", { className: "flex items-center text-h3", children: /* @__PURE__ */ jsx281(Skeleton, { className: "h-4 w-3/4" }) }),
32061
+ /* @__PURE__ */ jsxs224("div", { className: "flex items-center gap-[var(--spacing-system-xxs)] text-h6", children: [
32062
+ /* @__PURE__ */ jsx281(Skeleton, { className: "size-4 shrink-0 rounded-sm" }),
32063
+ /* @__PURE__ */ jsx281(Skeleton, { className: "h-3 w-1/2" })
31688
32064
  ] })
31689
32065
  ] }),
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" })
32066
+ /* @__PURE__ */ jsxs224("div", { className: "flex shrink-0 items-center gap-[var(--spacing-system-xsf)]", children: [
32067
+ /* @__PURE__ */ jsx281(Skeleton, { className: "size-4 rounded-sm" }),
32068
+ /* @__PURE__ */ jsx281(Skeleton, { className: "size-8 rounded-full" })
31693
32069
  ] })
31694
32070
  ] }),
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" })
32071
+ /* @__PURE__ */ jsxs224("div", { className: "flex h-8 items-center gap-[var(--spacing-system-xxs)]", children: [
32072
+ /* @__PURE__ */ jsx281(Skeleton, { className: "h-8 w-16 rounded-md" }),
32073
+ /* @__PURE__ */ jsx281(Skeleton, { className: "h-8 w-12 rounded-md" })
31698
32074
  ] })
31699
32075
  ]
31700
32076
  }
@@ -31703,7 +32079,7 @@ var TicketCardSkeleton = forwardRef32(
31703
32079
  TicketCardSkeleton.displayName = "TicketCardSkeleton";
31704
32080
 
31705
32081
  // src/components/features/board/board-column.tsx
31706
- import { Fragment as Fragment49, jsx as jsx278, jsxs as jsxs221 } from "react/jsx-runtime";
32082
+ import { Fragment as Fragment49, jsx as jsx282, jsxs as jsxs225 } from "react/jsx-runtime";
31707
32083
  var BoardColumn = memo6(function BoardColumnImpl({
31708
32084
  column,
31709
32085
  collapsed = false,
@@ -31722,7 +32098,7 @@ var BoardColumn = memo6(function BoardColumnImpl({
31722
32098
  className
31723
32099
  }) {
31724
32100
  const laneRef = useRef43(null);
31725
- const [isOver, setIsOver] = useState80(false);
32101
+ const [isOver, setIsOver] = useState82(false);
31726
32102
  useEffect48(() => {
31727
32103
  const element = laneRef.current;
31728
32104
  if (!element || collapsed || touchMode || column.dropDisabled) return void 0;
@@ -31755,7 +32131,7 @@ var BoardColumn = memo6(function BoardColumnImpl({
31755
32131
  });
31756
32132
  }, [column.id, column.dropDisabled, column.allowedFromColumns, collapsed, touchMode]);
31757
32133
  const handleToggleCollapse = useCallback27(() => onToggleCollapse?.(column.id), [onToggleCollapse, column.id]);
31758
- return /* @__PURE__ */ jsxs221(
32134
+ return /* @__PURE__ */ jsxs225(
31759
32135
  "div",
31760
32136
  {
31761
32137
  ref: laneRef,
@@ -31771,7 +32147,7 @@ var BoardColumn = memo6(function BoardColumnImpl({
31771
32147
  ),
31772
32148
  style: column.system ? void 0 : { backgroundColor: tintOnDark(column.color) },
31773
32149
  children: [
31774
- /* @__PURE__ */ jsx278(
32150
+ /* @__PURE__ */ jsx282(
31775
32151
  BoardColumnHeader,
31776
32152
  {
31777
32153
  column,
@@ -31781,9 +32157,9 @@ var BoardColumn = memo6(function BoardColumnImpl({
31781
32157
  onArchive: !collapsed && column.archivable && onArchive ? () => onArchive(column.id) : void 0
31782
32158
  }
31783
32159
  ),
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(
32160
+ !collapsed && /* @__PURE__ */ jsxs225(Fragment49, { children: [
32161
+ /* @__PURE__ */ jsx282("div", { "aria-hidden": true, className: "-mx-[var(--spacing-system-sf)] h-px shrink-0 bg-ods-border" }),
32162
+ /* @__PURE__ */ jsx282(
31787
32163
  ColumnBody,
31788
32164
  {
31789
32165
  column,
@@ -31846,13 +32222,13 @@ function ColumnBody({
31846
32222
  // wholesale. The browser's own anchoring is unusable here — it silently
31847
32223
  // skips transformed elements, so it works between drags and does nothing
31848
32224
  // during one — and leaving both on double-corrects every insertion.
31849
- /* @__PURE__ */ jsxs221(
32225
+ /* @__PURE__ */ jsxs225(
31850
32226
  "div",
31851
32227
  {
31852
32228
  ref: scrollRef,
31853
32229
  className: "flex min-h-0 flex-1 flex-col gap-[var(--spacing-system-xs)] overflow-y-auto py-[5px] [overflow-anchor:none]",
31854
32230
  children: [
31855
- column.isLoading ? /* @__PURE__ */ jsx278(SkeletonStack, {}) : column.tickets.length === 0 ? /* @__PURE__ */ jsx278(EmptyState2, { columnId: column.id, touchMode }) : column.tickets.map((t) => /* @__PURE__ */ jsx278(
32231
+ column.isLoading ? /* @__PURE__ */ jsx282(SkeletonStack, {}) : column.tickets.length === 0 ? /* @__PURE__ */ jsx282(EmptyState2, { columnId: column.id, touchMode }) : column.tickets.map((t) => /* @__PURE__ */ jsx282(
31856
32232
  TicketCard,
31857
32233
  {
31858
32234
  ticket: t,
@@ -31868,26 +32244,26 @@ function ColumnBody({
31868
32244
  },
31869
32245
  t.id
31870
32246
  )),
31871
- column.isLoadingMore && !column.isLoading && /* @__PURE__ */ jsx278(TicketCardSkeleton, {}),
31872
- column.hasMore && /* @__PURE__ */ jsx278("div", { ref: sentinelRef, "aria-hidden": true, className: "h-1 shrink-0" })
32247
+ column.isLoadingMore && !column.isLoading && /* @__PURE__ */ jsx282(TicketCardSkeleton, {}),
32248
+ column.hasMore && /* @__PURE__ */ jsx282("div", { ref: sentinelRef, "aria-hidden": true, className: "h-1 shrink-0" })
31873
32249
  ]
31874
32250
  }
31875
32251
  )
31876
32252
  );
31877
32253
  }
31878
32254
  function SkeletonStack({ count = 4 }) {
31879
- return /* @__PURE__ */ jsx278(Fragment49, { children: Array.from({ length: count }, (_, i) => /* @__PURE__ */ jsx278(TicketCardSkeleton, {}, `skeleton-${i}`)) });
32255
+ return /* @__PURE__ */ jsx282(Fragment49, { children: Array.from({ length: count }, (_, i) => /* @__PURE__ */ jsx282(TicketCardSkeleton, {}, `skeleton-${i}`)) });
31880
32256
  }
31881
32257
  function EmptyState2({ columnId, touchMode }) {
31882
32258
  const aim = useDropAim();
31883
32259
  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" });
32260
+ return /* @__PURE__ */ jsx282("div", { "aria-hidden": true, ...{ [DROP_LINE_ATTRIBUTE]: "" }, className: "h-0.5 shrink-0 rounded-full bg-ods-accent" });
31885
32261
  }
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" })
32262
+ 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: [
32263
+ /* @__PURE__ */ jsx282(TagIcon, { className: "h-6 w-6 shrink-0" }),
32264
+ /* @__PURE__ */ jsxs225("div", { className: "flex w-full flex-col", children: [
32265
+ /* @__PURE__ */ jsx282("p", { className: "text-h4", children: "No tickets here" }),
32266
+ /* @__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
32267
  ] })
31892
32268
  ] });
31893
32269
  }
@@ -31901,10 +32277,10 @@ function resolveBoardDrop(columns, { source, target }) {
31901
32277
  }
31902
32278
 
31903
32279
  // src/components/features/board/use-board-collapse.ts
31904
- import { useCallback as useCallback28, useEffect as useEffect49, useRef as useRef44, useState as useState81 } from "react";
32280
+ import { useCallback as useCallback28, useEffect as useEffect49, useRef as useRef44, useState as useState83 } from "react";
31905
32281
  function useBoardCollapse(storageKey) {
31906
32282
  const [persisted, setPersisted] = useLocalStorage(storageKey ?? "__board_collapse_unused__", {});
31907
- const [memory, setMemory] = useState81({});
32283
+ const [memory, setMemory] = useState83({});
31908
32284
  const collapsed = storageKey ? persisted : memory;
31909
32285
  const setMap = storageKey ? setPersisted : setMemory;
31910
32286
  const setMapRef = useRef44(setMap);
@@ -31921,7 +32297,7 @@ function useBoardCollapse(storageKey) {
31921
32297
  }
31922
32298
 
31923
32299
  // src/components/features/board/touch-board.tsx
31924
- import { jsx as jsx279 } from "react/jsx-runtime";
32300
+ import { jsx as jsx283 } from "react/jsx-runtime";
31925
32301
  function TouchBoard({
31926
32302
  columns,
31927
32303
  onLoadMore,
@@ -31936,11 +32312,11 @@ function TouchBoard({
31936
32312
  className
31937
32313
  }) {
31938
32314
  const { collapsed, toggle } = useBoardCollapse(collapseStorageKey);
31939
- return /* @__PURE__ */ jsx279("div", { className: cn("flex h-full min-h-0 flex-col", className), children: /* @__PURE__ */ jsx279(
32315
+ return /* @__PURE__ */ jsx283("div", { className: cn("flex h-full min-h-0 flex-col", className), children: /* @__PURE__ */ jsx283(
31940
32316
  "div",
31941
32317
  {
31942
32318
  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(
32319
+ children: columns.map((column) => /* @__PURE__ */ jsx283(
31944
32320
  BoardColumn,
31945
32321
  {
31946
32322
  column,
@@ -31967,7 +32343,7 @@ function TouchBoard({
31967
32343
  }
31968
32344
 
31969
32345
  // src/components/features/board/board.tsx
31970
- import { jsx as jsx280, jsxs as jsxs222 } from "react/jsx-runtime";
32346
+ import { jsx as jsx284, jsxs as jsxs226 } from "react/jsx-runtime";
31971
32347
  var PENDING_MOVE_TIMEOUT_MS = 2e3;
31972
32348
  var DROP_MS = 160;
31973
32349
  var DROP_EASING = "cubic-bezier(0.2, 0, 0, 1)";
@@ -31976,9 +32352,9 @@ var ARROW_KEYS = ["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"];
31976
32352
  function Board(props) {
31977
32353
  const dragAndDropEnabled = useMediaQuery(DRAG_AND_DROP_MEDIA_QUERY);
31978
32354
  if (dragAndDropEnabled === void 0) {
31979
- return /* @__PURE__ */ jsx280("div", { "aria-hidden": true, className: cn("flex h-full min-h-0 flex-col", props.className) });
32355
+ return /* @__PURE__ */ jsx284("div", { "aria-hidden": true, className: cn("flex h-full min-h-0 flex-col", props.className) });
31980
32356
  }
31981
- return dragAndDropEnabled ? /* @__PURE__ */ jsx280(DragBoard, { ...props }) : /* @__PURE__ */ jsx280(TouchBoard, { ...props });
32357
+ return dragAndDropEnabled ? /* @__PURE__ */ jsx284(DragBoard, { ...props }) : /* @__PURE__ */ jsx284(TouchBoard, { ...props });
31982
32358
  }
31983
32359
  function DragBoard({
31984
32360
  columns,
@@ -32019,20 +32395,20 @@ function DragBoard({
32019
32395
  },
32020
32396
  [scrollRef]
32021
32397
  );
32022
- const [aim, setAim] = useState82(null);
32023
- const [lifted, setLifted] = useState82(null);
32024
- const [announcement, setAnnouncement] = useState82("");
32398
+ const [aim, setAim] = useState84(null);
32399
+ const [lifted, setLifted] = useState84(null);
32400
+ const [announcement, setAnnouncement] = useState84("");
32025
32401
  const dragGeometry = useRef45(null);
32026
- const [landingPreview, setLandingPreview] = useState82(null);
32402
+ const [landingPreview, setLandingPreview] = useState84(null);
32027
32403
  const previewRef = useRef45(null);
32028
- const [reportedMove, setPendingMove] = useState82(null);
32404
+ const [reportedMove, setPendingMove] = useState84(null);
32029
32405
  const pendingMove = reportedMove && !hasMoveSettled(columns, reportedMove) ? reportedMove : null;
32030
32406
  const view = useMemo25(() => pendingMove ? applyPendingMove(columns, pendingMove) : columns, [columns, pendingMove]);
32031
32407
  useEffect50(() => {
32032
32408
  columnsRef.current = view;
32033
32409
  onChangeRef.current = onChange;
32034
32410
  });
32035
- const [landing, setLanding] = useState82(null);
32411
+ const [landing, setLanding] = useState84(null);
32036
32412
  const landingTimer = useRef45(null);
32037
32413
  const pointRef = useRef45({ x: 0, y: 0 });
32038
32414
  const laneLabel = useCallback29((columnId) => view.find((c) => c.id === columnId)?.label ?? columnId, [view]);
@@ -32231,7 +32607,7 @@ function DragBoard({
32231
32607
  };
32232
32608
  }, [landing, landingPreview]);
32233
32609
  const preview = landingPreview && createPortal(
32234
- /* @__PURE__ */ jsx280(
32610
+ /* @__PURE__ */ jsx284(
32235
32611
  "div",
32236
32612
  {
32237
32613
  ref: previewRef,
@@ -32244,7 +32620,7 @@ function DragBoard({
32244
32620
  // translate in pointer coordinates and nothing else.
32245
32621
  margin: `${-landingPreview.grabY}px 0 0 ${-landingPreview.grabX}px`
32246
32622
  },
32247
- children: /* @__PURE__ */ jsx280(
32623
+ children: /* @__PURE__ */ jsx284(
32248
32624
  TicketCardView,
32249
32625
  {
32250
32626
  ticket: landingPreview.ticket,
@@ -32257,10 +32633,10 @@ function DragBoard({
32257
32633
  ),
32258
32634
  document.body
32259
32635
  );
32260
- return /* @__PURE__ */ jsx280(LandingCardContext.Provider, { value: landing, children: /* @__PURE__ */ jsx280(DropAimContext.Provider, { value: aim ?? keyboardAim, children: /* @__PURE__ */ jsxs222(BoardLiftContext.Provider, { value: lift, children: [
32636
+ return /* @__PURE__ */ jsx284(LandingCardContext.Provider, { value: landing, children: /* @__PURE__ */ jsx284(DropAimContext.Provider, { value: aim ?? keyboardAim, children: /* @__PURE__ */ jsxs226(BoardLiftContext.Provider, { value: lift, children: [
32261
32637
  preview,
32262
- /* @__PURE__ */ jsxs222("div", { ref: boardRef, className: cn("flex h-full flex-col", className), children: [
32263
- /* @__PURE__ */ jsx280(
32638
+ /* @__PURE__ */ jsxs226("div", { ref: boardRef, className: cn("flex h-full flex-col", className), children: [
32639
+ /* @__PURE__ */ jsx284(
32264
32640
  "div",
32265
32641
  {
32266
32642
  ref: setScroller,
@@ -32272,9 +32648,9 @@ function DragBoard({
32272
32648
  const joinLeft = !!(column.system && prev?.system);
32273
32649
  const joinRight = !!(column.system && next?.system);
32274
32650
  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(
32651
+ return /* @__PURE__ */ jsxs226(Fragment50, { children: [
32652
+ showGap && /* @__PURE__ */ jsx284("div", { "aria-hidden": true, className: "w-[var(--spacing-system-mf)] shrink-0" }),
32653
+ /* @__PURE__ */ jsx284(
32278
32654
  BoardColumn,
32279
32655
  {
32280
32656
  column,
@@ -32296,15 +32672,15 @@ function DragBoard({
32296
32672
  })
32297
32673
  }
32298
32674
  ),
32299
- /* @__PURE__ */ jsx280("p", { "aria-live": "polite", className: "sr-only", children: announcement }),
32300
- thumbRatio > 0 && /* @__PURE__ */ jsx280(
32675
+ /* @__PURE__ */ jsx284("p", { "aria-live": "polite", className: "sr-only", children: announcement }),
32676
+ thumbRatio > 0 && /* @__PURE__ */ jsx284(
32301
32677
  "div",
32302
32678
  {
32303
32679
  ref: trackRef,
32304
32680
  onClick: onTrackClick,
32305
32681
  onWheel: onTrackWheel,
32306
32682
  className: "relative mt-[var(--spacing-system-mf)] h-2 shrink-0 cursor-pointer rounded-full bg-ods-border",
32307
- children: /* @__PURE__ */ jsx280(
32683
+ children: /* @__PURE__ */ jsx284(
32308
32684
  "div",
32309
32685
  {
32310
32686
  ref: thumbRef,
@@ -32423,9 +32799,9 @@ import {
32423
32799
  useId as useId6,
32424
32800
  useMemo as useMemo26,
32425
32801
  useRef as useRef46,
32426
- useState as useState83
32802
+ useState as useState85
32427
32803
  } from "react";
32428
- import { jsx as jsx281, jsxs as jsxs223 } from "react/jsx-runtime";
32804
+ import { jsx as jsx285, jsxs as jsxs227 } from "react/jsx-runtime";
32429
32805
  var SORTABLE_ITEM_ATTRIBUTE = "data-sortable-item";
32430
32806
  var SHIFT_MS = 200;
32431
32807
  var DROP_MS2 = 150;
@@ -32440,7 +32816,7 @@ function SortableList({ onReorder, getItemLabel, disabled = false, className, ch
32440
32816
  const listRef = useRef46(null);
32441
32817
  const dragAndDropEnabled = useDragAndDropEnabled();
32442
32818
  const dragType = useId6();
32443
- const [announcement, setAnnouncement] = useState83("");
32819
+ const [announcement, setAnnouncement] = useState85("");
32444
32820
  const onReorderRef = useRef46(onReorder);
32445
32821
  const getItemLabelRef = useRef46(getItemLabel);
32446
32822
  useEffect51(() => {
@@ -32448,7 +32824,7 @@ function SortableList({ onReorder, getItemLabel, disabled = false, className, ch
32448
32824
  getItemLabelRef.current = getItemLabel;
32449
32825
  });
32450
32826
  const flipFrom = useRef46(null);
32451
- const [flipTick, setFlipTick] = useState83(0);
32827
+ const [flipTick, setFlipTick] = useState85(0);
32452
32828
  const flipTimer = useRef46(null);
32453
32829
  const readItems = useCallback30(
32454
32830
  () => [...listRef.current?.querySelectorAll(`[${SORTABLE_ITEM_ATTRIBUTE}]`) ?? []],
@@ -32564,15 +32940,15 @@ function SortableList({ onReorder, getItemLabel, disabled = false, className, ch
32564
32940
  () => ({ dragType, disabled, dragAndDropEnabled, reorder, readItems }),
32565
32941
  [dragType, disabled, dragAndDropEnabled, reorder, readItems]
32566
32942
  );
32567
- return /* @__PURE__ */ jsx281(SortableListContext.Provider, { value: context, children: /* @__PURE__ */ jsxs223("div", { ref: listRef, className, children: [
32943
+ return /* @__PURE__ */ jsx285(SortableListContext.Provider, { value: context, children: /* @__PURE__ */ jsxs227("div", { ref: listRef, className, children: [
32568
32944
  children,
32569
- /* @__PURE__ */ jsx281("p", { "aria-live": "polite", className: "sr-only", children: announcement })
32945
+ /* @__PURE__ */ jsx285("p", { "aria-live": "polite", className: "sr-only", children: announcement })
32570
32946
  ] }) });
32571
32947
  }
32572
32948
 
32573
32949
  // src/components/features/sortable-list/sortable-move-buttons.tsx
32574
32950
  import { useRef as useRef47 } from "react";
32575
- import { jsx as jsx282, jsxs as jsxs224 } from "react/jsx-runtime";
32951
+ import { jsx as jsx286, jsxs as jsxs228 } from "react/jsx-runtime";
32576
32952
  function SortableMoveButtons({ index, count, label, className }) {
32577
32953
  const { disabled, reorder } = useSortableListContext();
32578
32954
  const upRef = useRef47(null);
@@ -32587,8 +32963,8 @@ function SortableMoveButtons({ index, count, label, className }) {
32587
32963
  });
32588
32964
  };
32589
32965
  const subject = label ?? "item";
32590
- return /* @__PURE__ */ jsxs224("div", { className: cn("inline-flex shrink-0", className), children: [
32591
- /* @__PURE__ */ jsx282(
32966
+ return /* @__PURE__ */ jsxs228("div", { className: cn("inline-flex shrink-0", className), children: [
32967
+ /* @__PURE__ */ jsx286(
32592
32968
  Button,
32593
32969
  {
32594
32970
  ref: upRef,
@@ -32599,10 +32975,10 @@ function SortableMoveButtons({ index, count, label, className }) {
32599
32975
  disabled: disabled || index <= 0,
32600
32976
  onClick: () => move(-1),
32601
32977
  className: "rounded-r-none border-r-0",
32602
- children: /* @__PURE__ */ jsx282(Arrow01UpIcon, {})
32978
+ children: /* @__PURE__ */ jsx286(Arrow01UpIcon, {})
32603
32979
  }
32604
32980
  ),
32605
- /* @__PURE__ */ jsx282(
32981
+ /* @__PURE__ */ jsx286(
32606
32982
  Button,
32607
32983
  {
32608
32984
  ref: downRef,
@@ -32613,7 +32989,7 @@ function SortableMoveButtons({ index, count, label, className }) {
32613
32989
  disabled: disabled || index >= count - 1,
32614
32990
  onClick: () => move(1),
32615
32991
  className: "rounded-l-none",
32616
- children: /* @__PURE__ */ jsx282(Arrow01DownIcon, {})
32992
+ children: /* @__PURE__ */ jsx286(Arrow01DownIcon, {})
32617
32993
  }
32618
32994
  )
32619
32995
  ] });
@@ -32623,13 +32999,13 @@ function SortableMoveButtons({ index, count, label, className }) {
32623
32999
  import { combine as combine5 } from "@atlaskit/pragmatic-drag-and-drop/combine";
32624
33000
  import { draggable as draggable2 } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
32625
33001
  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";
33002
+ import { useCallback as useCallback31, useEffect as useEffect52, useState as useState86 } from "react";
32627
33003
  function useSortableItem() {
32628
33004
  const { dragType, disabled, dragAndDropEnabled, reorder, readItems } = useSortableListContext();
32629
33005
  const inert = disabled || !dragAndDropEnabled;
32630
- const [item, setItem] = useState84(null);
32631
- const [handle, setHandle] = useState84(null);
32632
- const [isDragging, setIsDragging] = useState84(false);
33006
+ const [item, setItem] = useState86(null);
33007
+ const [handle, setHandle] = useState86(null);
33008
+ const [isDragging, setIsDragging] = useState86(false);
32633
33009
  const itemRef = useCallback31((node) => {
32634
33010
  node?.setAttribute(SORTABLE_ITEM_ATTRIBUTE, "");
32635
33011
  setItem(node);
@@ -32669,7 +33045,7 @@ function useSortableItem() {
32669
33045
  }
32670
33046
 
32671
33047
  // src/components/features/ticket-status-config-list/ticket-status-config-list.tsx
32672
- import { jsx as jsx283 } from "react/jsx-runtime";
33048
+ import { jsx as jsx287 } from "react/jsx-runtime";
32673
33049
  function TicketStatusConfigList({
32674
33050
  items,
32675
33051
  onReorder,
@@ -32677,13 +33053,13 @@ function TicketStatusConfigList({
32677
33053
  getItemLabel,
32678
33054
  className
32679
33055
  }) {
32680
- return /* @__PURE__ */ jsx283(
33056
+ return /* @__PURE__ */ jsx287(
32681
33057
  SortableList,
32682
33058
  {
32683
33059
  onReorder,
32684
33060
  getItemLabel,
32685
33061
  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))
33062
+ children: items.map((item, index) => /* @__PURE__ */ jsx287(SortableRow, { index, count: items.length, label: getItemLabel?.(index), children: (args) => renderRow(item, args) }, item.id))
32687
33063
  }
32688
33064
  );
32689
33065
  }
@@ -32694,7 +33070,7 @@ function SortableRow({
32694
33070
  children
32695
33071
  }) {
32696
33072
  const { itemRef, dragHandleProps, isDragging, dragAndDropEnabled } = useSortableItem();
32697
- return /* @__PURE__ */ jsx283(
33073
+ return /* @__PURE__ */ jsx287(
32698
33074
  "div",
32699
33075
  {
32700
33076
  ref: itemRef,
@@ -32702,18 +33078,18 @@ function SortableRow({
32702
33078
  children: children({
32703
33079
  dragHandleProps,
32704
33080
  isDragging,
32705
- moveButtons: dragAndDropEnabled ? null : /* @__PURE__ */ jsx283(SortableMoveButtons, { index, count, label })
33081
+ moveButtons: dragAndDropEnabled ? null : /* @__PURE__ */ jsx287(SortableMoveButtons, { index, count, label })
32706
33082
  })
32707
33083
  }
32708
33084
  );
32709
33085
  }
32710
33086
 
32711
33087
  // src/components/features/conversation-card.tsx
32712
- import { jsx as jsx284, jsxs as jsxs225 } from "react/jsx-runtime";
33088
+ import { jsx as jsx288, jsxs as jsxs229 } from "react/jsx-runtime";
32713
33089
  function Who({ speaker }) {
32714
- return /* @__PURE__ */ jsxs225("div", { className: "flex items-baseline gap-2 text-ods-text-primary text-h4", children: [
33090
+ return /* @__PURE__ */ jsxs229("div", { className: "flex items-baseline gap-2 text-ods-text-primary text-h4", children: [
32715
33091
  speaker.name,
32716
- speaker.meta && /* @__PURE__ */ jsx284("span", { className: "text-ods-text-secondary text-h6", children: speaker.meta })
33092
+ speaker.meta && /* @__PURE__ */ jsx288("span", { className: "text-ods-text-secondary text-h6", children: speaker.meta })
32717
33093
  ] });
32718
33094
  }
32719
33095
  function ConversationCard({
@@ -32727,36 +33103,36 @@ function ConversationCard({
32727
33103
  footerTone = "default",
32728
33104
  className
32729
33105
  }) {
32730
- return /* @__PURE__ */ jsxs225(
33106
+ return /* @__PURE__ */ jsxs229(
32731
33107
  "div",
32732
33108
  {
32733
33109
  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
33110
  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: [
33111
+ /* @__PURE__ */ jsxs229("div", { className: "flex items-start gap-3", children: [
33112
+ /* @__PURE__ */ jsx288("span", { className: "shrink-0", children: requester.avatar }),
33113
+ /* @__PURE__ */ jsxs229("div", { className: "min-w-0 flex-1", children: [
33114
+ /* @__PURE__ */ jsx288(Who, { speaker: requester }),
33115
+ /* @__PURE__ */ jsxs229("p", { className: "m-0 mt-1 line-clamp-2 min-h-[2lh] text-ods-text-primary text-h3", title: request, children: [
32740
33116
  "\u201C",
32741
33117
  request,
32742
33118
  "\u201D"
32743
33119
  ] })
32744
33120
  ] })
32745
33121
  ] }),
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 }),
33122
+ /* @__PURE__ */ jsxs229("div", { className: "flex items-start gap-3 rounded-md border border-ods-border bg-ods-bg p-3.5", children: [
33123
+ /* @__PURE__ */ jsx288("span", { className: "shrink-0", children: responder.avatar }),
33124
+ /* @__PURE__ */ jsxs229("div", { className: "min-w-0 flex-1", children: [
33125
+ /* @__PURE__ */ jsx288(Who, { speaker: responder }),
33126
+ /* @__PURE__ */ jsxs229("div", { className: "mt-1 flex items-start gap-2 text-ods-text-secondary text-h4", children: [
33127
+ /* @__PURE__ */ jsx288(CheckCircleIcon, { size: 16, className: "mt-1 shrink-0 text-ods-success", "aria-hidden": true }),
33128
+ /* @__PURE__ */ jsx288("span", { className: "line-clamp-3 min-h-[3lh] min-w-0 flex-1", title: outcome, children: outcome }),
32753
33129
  outcomeAside
32754
33130
  ] })
32755
33131
  ] })
32756
33132
  ] }),
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(
33133
+ /* @__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: [
33134
+ /* @__PURE__ */ jsx288("span", { children: footerLabel }),
33135
+ /* @__PURE__ */ jsx288(
32760
33136
  "span",
32761
33137
  {
32762
33138
  className: cn(
@@ -33346,6 +33722,7 @@ export {
33346
33722
  UnreadCountBadge,
33347
33723
  HeaderButton,
33348
33724
  TimeTrackerHeaderButton,
33725
+ RemoteSessionViewers,
33349
33726
  RemoteSessionScope,
33350
33727
  RemoteSessionOrgLogo,
33351
33728
  RemoteSessionRecordingTag,
@@ -33362,6 +33739,15 @@ export {
33362
33739
  RemoteSessionDialog,
33363
33740
  RemoteSessionBorder,
33364
33741
  RemoteSessionPill,
33742
+ REMOTE_SESSION_KEEP_REASON_LABELS,
33743
+ KeepRecordingModal,
33744
+ ReleaseKeepingModal,
33745
+ formatRemoteSessionOffset,
33746
+ RemoteSessionEventList,
33747
+ RemoteSessionTimelineMarkers,
33748
+ RemoteSessionStatusTag,
33749
+ RemoteSessionExpiry,
33750
+ RemoteSessionStorageAlert,
33365
33751
  BoardColumnHeader,
33366
33752
  tintOnDark,
33367
33753
  BoardTicketApproval,